dwm-extrabar-6.2-20210930-a786211.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-extrabar-6.2-20210930-a786211.diff (8817B)
       ---
            1 diff --git a/config.def.h b/config.def.h
            2 --- a/config.def.h
            3 +++ b/config.def.h
            4 @@ -3,8 +3,10 @@
            5  /* appearance */
            6  static const unsigned int borderpx  = 1;        /* border pixel of windows */
            7  static const unsigned int snap      = 32;       /* snap pixel */
            8 -static const int showbar            = 1;        /* 0 means no bar */
            9 -static const int topbar             = 1;        /* 0 means bottom bar */
           10 +static const int showbar            = 1;        /* 0 means no standard bar */
           11 +static const int topbar             = 1;        /* 0 means standard bar at bottom */
           12 +static const int extrabar           = 1;        /* 0 means no extra bar */
           13 +static const char statussep         = ';';      /* separator between statuses */
           14  static const char *fonts[]          = { "monospace:size=10" };
           15  static const char dmenufont[]       = "monospace:size=10";
           16  static const char col_gray1[]       = "#222222";
           17 @@ -65,6 +67,7 @@ static Key keys[] = {
           18          { MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
           19          { MODKEY|ShiftMask,             XK_Return, spawn,          {.v = termcmd } },
           20          { MODKEY,                       XK_b,      togglebar,      {0} },
           21 +        { MODKEY|ShiftMask,             XK_b,      toggleextrabar, {0} },
           22          { MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
           23          { MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
           24          { MODKEY,                       XK_i,      incnmaster,     {.i = +1 } },
           25 @@ -105,6 +108,9 @@ static Button buttons[] = {
           26          { ClkLtSymbol,          0,              Button3,        setlayout,      {.v = &layouts[2]} },
           27          { ClkWinTitle,          0,              Button2,        zoom,           {0} },
           28          { ClkStatusText,        0,              Button2,        spawn,          {.v = termcmd } },
           29 +        { ClkExBarLeftStatus,   0,              Button2,        spawn,          {.v = termcmd } },
           30 +        { ClkExBarMiddle,       0,              Button2,        spawn,          {.v = termcmd } },
           31 +        { ClkExBarRightStatus,  0,              Button2,        spawn,          {.v = termcmd } },
           32          { ClkClientWin,         MODKEY,         Button1,        movemouse,      {0} },
           33          { ClkClientWin,         MODKEY,         Button2,        togglefloating, {0} },
           34          { ClkClientWin,         MODKEY,         Button3,        resizemouse,    {0} },
           35 diff --git a/dwm.c b/dwm.c
           36 --- a/dwm.c
           37 +++ b/dwm.c
           38 @@ -65,6 +65,7 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
           39         NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
           40  enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
           41  enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
           42 +       ClkExBarLeftStatus, ClkExBarMiddle, ClkExBarRightStatus,
           43         ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
           44  
           45  typedef union {
           46 @@ -117,6 +118,7 @@ struct Monitor {
           47          int nmaster;
           48          int num;
           49          int by;               /* bar geometry */
           50 +        int eby;              /* extra bar geometry */
           51          int mx, my, mw, mh;   /* screen size */
           52          int wx, wy, ww, wh;   /* window area  */
           53          unsigned int seltags;
           54 @@ -124,11 +126,13 @@ struct Monitor {
           55          unsigned int tagset[2];
           56          int showbar;
           57          int topbar;
           58 +        int extrabar;
           59          Client *clients;
           60          Client *sel;
           61          Client *stack;
           62          Monitor *next;
           63          Window barwin;
           64 +        Window extrabarwin;
           65          const Layout *lt[2];
           66  };
           67  
           68 @@ -211,6 +215,7 @@ static void tag(const Arg *arg);
           69  static void tagmon(const Arg *arg);
           70  static void tile(Monitor *);
           71  static void togglebar(const Arg *arg);
           72 +static void toggleextrabar(const Arg *arg);
           73  static void togglefloating(const Arg *arg);
           74  static void toggletag(const Arg *arg);
           75  static void toggleview(const Arg *arg);
           76 @@ -238,6 +243,8 @@ static void zoom(const Arg *arg);
           77  /* variables */
           78  static const char broken[] = "broken";
           79  static char stext[256];
           80 +static char estextl[256];
           81 +static char estextr[256];
           82  static int screen;
           83  static int sw, sh;           /* X display screen geometry width, height */
           84  static int bh, blw = 0;      /* bar geometry */
           85 @@ -444,6 +451,13 @@ buttonpress(XEvent *e)
           86                          click = ClkStatusText;
           87                  else
           88                          click = ClkWinTitle;
           89 +        } else if (ev->window == selmon->extrabarwin) {
           90 +                if (ev->x < (int)TEXTW(estextl))
           91 +                        click = ClkExBarLeftStatus;
           92 +                else if (ev->x > selmon->ww - (int)TEXTW(estextr))
           93 +                        click = ClkExBarRightStatus;
           94 +                else
           95 +                        click = ClkExBarMiddle;
           96          } else if ((c = wintoclient(ev->window))) {
           97                  focus(c);
           98                  restack(selmon);
           99 @@ -506,7 +520,9 @@ cleanupmon(Monitor *mon)
          100                  m->next = mon->next;
          101          }
          102          XUnmapWindow(dpy, mon->barwin);
          103 +        XUnmapWindow(dpy, mon->extrabarwin);
          104          XDestroyWindow(dpy, mon->barwin);
          105 +        XDestroyWindow(dpy, mon->extrabarwin);
          106          free(mon);
          107  }
          108  
          109 @@ -569,6 +585,7 @@ configurenotify(XEvent *e)
          110                                          if (c->isfullscreen)
          111                                                  resizeclient(c, m->mx, m->my, m->mw, m->mh);
          112                                  XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
          113 +                                XMoveResizeWindow(dpy, m->extrabarwin, m->wx, m->eby, m->ww, bh);
          114                          }
          115                          focus(NULL);
          116                          arrange(NULL);
          117 @@ -639,6 +656,7 @@ createmon(void)
          118          m->nmaster = nmaster;
          119          m->showbar = showbar;
          120          m->topbar = topbar;
          121 +        m->extrabar = extrabar;
          122          m->lt[0] = &layouts[0];
          123          m->lt[1] = &layouts[1 % LENGTH(layouts)];
          124          strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
          125 @@ -696,7 +714,7 @@ dirtomon(int dir)
          126  void
          127  drawbar(Monitor *m)
          128  {
          129 -        int x, w, tw = 0;
          130 +        int x, w, tw = 0, etwl = 0, etwr = 0;
          131          int boxs = drw->fonts->h / 9;
          132          int boxw = drw->fonts->h / 6 + 2;
          133          unsigned int i, occ = 0, urg = 0;
          134 @@ -741,6 +759,17 @@ drawbar(Monitor *m)
          135                  }
          136          }
          137          drw_map(drw, m->barwin, 0, 0, m->ww, bh);
          138 +
          139 +        if (m == selmon) { /* extra status is only drawn on selected monitor */
          140 +                drw_setscheme(drw, scheme[SchemeNorm]);
          141 +                /* clear default bar draw buffer by drawing a blank rectangle */
          142 +                drw_rect(drw, 0, 0, m->ww, bh, 1, 1);
          143 +                etwr = TEXTW(estextr) - lrpad + 2; /* 2px right padding */
          144 +                drw_text(drw, m->ww - etwr, 0, etwr, bh, 0, estextr, 0);
          145 +                etwl = TEXTW(estextl);
          146 +                drw_text(drw, 0, 0, etwl, bh, 0, estextl, 0);
          147 +                drw_map(drw, m->extrabarwin, 0, 0, m->ww, bh);
          148 +        }
          149  }
          150  
          151  void
          152 @@ -1708,6 +1737,15 @@ togglebar(const Arg *arg)
          153          arrange(selmon);
          154  }
          155  
          156 +void
          157 +toggleextrabar(const Arg *arg)
          158 +{
          159 +        selmon->extrabar = !selmon->extrabar;
          160 +        updatebarpos(selmon);
          161 +        XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx, selmon->eby, selmon->ww, bh);
          162 +        arrange(selmon);
          163 +}
          164 +
          165  void
          166  togglefloating(const Arg *arg)
          167  {
          168 @@ -1812,14 +1850,22 @@ updatebars(void)
          169          };
          170          XClassHint ch = {"dwm", "dwm"};
          171          for (m = mons; m; m = m->next) {
          172 -                if (m->barwin)
          173 -                        continue;
          174 -                m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
          175 -                                CopyFromParent, DefaultVisual(dpy, screen),
          176 -                                CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
          177 -                XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
          178 -                XMapRaised(dpy, m->barwin);
          179 -                XSetClassHint(dpy, m->barwin, &ch);
          180 +                if (!m->barwin) {
          181 +                        m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
          182 +                                        CopyFromParent, DefaultVisual(dpy, screen),
          183 +                                        CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
          184 +                        XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
          185 +                        XMapRaised(dpy, m->barwin);
          186 +                        XSetClassHint(dpy, m->barwin, &ch);
          187 +                }
          188 +                if (!m->extrabarwin) {
          189 +                        m->extrabarwin = XCreateWindow(dpy, root, m->wx, m->eby, m->ww, bh, 0, DefaultDepth(dpy, screen),
          190 +                                        CopyFromParent, DefaultVisual(dpy, screen),
          191 +                                        CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
          192 +                        XDefineCursor(dpy, m->extrabarwin, cursor[CurNormal]->cursor);
          193 +                        XMapRaised(dpy, m->extrabarwin);
          194 +                        XSetClassHint(dpy, m->extrabarwin, &ch);
          195 +                }
          196          }
          197  }
          198  
          199 @@ -1834,6 +1880,12 @@ updatebarpos(Monitor *m)
          200                  m->wy = m->topbar ? m->wy + bh : m->wy;
          201          } else
          202                  m->by = -bh;
          203 +        if (m->extrabar) {
          204 +                m->wh -= bh;
          205 +                m->eby = !m->topbar ? m->wy : m->wy + m->wh;
          206 +                m->wy = !m->topbar ? m->wy + bh : m->wy;
          207 +        } else
          208 +                m->eby = -bh;
          209  }
          210  
          211  void
          212 @@ -1990,8 +2042,26 @@ updatesizehints(Client *c)
          213  void
          214  updatestatus(void)
          215  {
          216 -        if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
          217 +        char text[768];
          218 +        if (!gettextprop(root, XA_WM_NAME, text, sizeof(text))) {
          219                  strcpy(stext, "dwm-"VERSION);
          220 +                estextl[0] = '\0';
          221 +                estextr[0] = '\0';
          222 +        } else {
          223 +                char *l = strchr(text, statussep);
          224 +                if (l) {
          225 +                        *l = '\0'; l++;
          226 +                        strncpy(estextl, l, sizeof(estextl) - 1);
          227 +                } else
          228 +                        estextl[0] = '\0';
          229 +                char *r = strchr(estextl, statussep);
          230 +                if (r) {
          231 +                        *r = '\0'; r++;
          232 +                        strncpy(estextr, r, sizeof(estextr) - 1);
          233 +                } else
          234 +                        estextr[0] = '\0';
          235 +                strncpy(stext, text, sizeof(stext) - 1);
          236 +        }
          237          drawbar(selmon);
          238  }
          239  
          240 @@ -2070,7 +2140,7 @@ wintomon(Window w)
          241          if (w == root && getrootptr(&x, &y))
          242                  return recttomon(x, y, 1, 1);
          243          for (m = mons; m; m = m->next)
          244 -                if (w == m->barwin)
          245 +                if (w == m->barwin || w == m->extrabarwin)
          246                          return m;
          247          if ((c = wintoclient(w)))
          248                  return c->mon;