dwm-extrabar-6.2-20210209.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-20210209.diff (5639B)
       ---
            1 commit e8111727686dc5d8194ff95af70c3e4abcc2da54
            2 Author: Finn Rayment <finn@rayment.fr>
            3 Date:   Tue Feb 9 16:33:51 2021 +0100
            4 
            5     [PATCH] Updated extra bar support
            6 
            7 diff --git a/config.def.h b/config.def.h
            8 index 1c0b587..91593ee 100644
            9 --- a/config.def.h
           10 +++ b/config.def.h
           11 @@ -5,6 +5,8 @@ static const unsigned int borderpx  = 1;        /* border pixel of windows */
           12  static const unsigned int snap      = 32;       /* snap pixel */
           13  static const int showbar            = 1;        /* 0 means no bar */
           14  static const int topbar             = 1;        /* 0 means bottom bar */
           15 +static const int extrabarright      = 0;        /* 1 means extra bar text on right */
           16 +static const char statussep         = ';';      /* separator between status bars */
           17  static const char *fonts[]          = { "monospace:size=10" };
           18  static const char dmenufont[]       = "monospace:size=10";
           19  static const char col_gray1[]       = "#222222";
           20 diff --git a/dwm.c b/dwm.c
           21 index 4465af1..3db6761 100644
           22 --- a/dwm.c
           23 +++ b/dwm.c
           24 @@ -117,6 +117,7 @@ struct Monitor {
           25          int nmaster;
           26          int num;
           27          int by;               /* bar geometry */
           28 +        int eby;              /* extra bar geometry */
           29          int mx, my, mw, mh;   /* screen size */
           30          int wx, wy, ww, wh;   /* window area  */
           31          unsigned int seltags;
           32 @@ -129,6 +130,7 @@ struct Monitor {
           33          Client *stack;
           34          Monitor *next;
           35          Window barwin;
           36 +        Window extrabarwin;
           37          const Layout *lt[2];
           38  };
           39  
           40 @@ -237,6 +239,7 @@ static void zoom(const Arg *arg);
           41  /* variables */
           42  static const char broken[] = "broken";
           43  static char stext[256];
           44 +static char estext[256];
           45  static int screen;
           46  static int sw, sh;           /* X display screen geometry width, height */
           47  static int bh, blw = 0;      /* bar geometry */
           48 @@ -505,7 +508,9 @@ cleanupmon(Monitor *mon)
           49                  m->next = mon->next;
           50          }
           51          XUnmapWindow(dpy, mon->barwin);
           52 +        XUnmapWindow(dpy, mon->extrabarwin);
           53          XDestroyWindow(dpy, mon->barwin);
           54 +        XDestroyWindow(dpy, mon->extrabarwin);
           55          free(mon);
           56  }
           57  
           58 @@ -568,6 +573,7 @@ configurenotify(XEvent *e)
           59                                          if (c->isfullscreen)
           60                                                  resizeclient(c, m->mx, m->my, m->mw, m->mh);
           61                                  XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
           62 +                                XMoveResizeWindow(dpy, m->extrabarwin, m->wx, m->eby, m->ww, bh);
           63                          }
           64                          focus(NULL);
           65                          arrange(NULL);
           66 @@ -740,6 +746,19 @@ drawbar(Monitor *m)
           67                  }
           68          }
           69          drw_map(drw, m->barwin, 0, 0, m->ww, bh);
           70 +
           71 +        if (m == selmon) { /* extra status is only drawn on selected monitor */
           72 +                drw_setscheme(drw, scheme[SchemeNorm]);
           73 +                /* clear default bar draw buffer by drawing a blank rectangle */
           74 +                drw_rect(drw, 0, 0, m->ww, bh, 1, 1);
           75 +                if (extrabarright) {
           76 +                        sw = TEXTW(estext) - lrpad + 2; /* 2px right padding */
           77 +                        drw_text(drw, m->ww - sw, 0, sw, bh, 0, estext, 0);
           78 +                } else {
           79 +                        drw_text(drw, 0, 0, mons->ww, bh, 0, estext, 0);
           80 +                }
           81 +                drw_map(drw, m->extrabarwin, 0, 0, m->ww, bh);
           82 +        }
           83  }
           84  
           85  void
           86 @@ -1702,6 +1721,7 @@ togglebar(const Arg *arg)
           87          selmon->showbar = !selmon->showbar;
           88          updatebarpos(selmon);
           89          XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
           90 +        XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx, selmon->eby, selmon->ww, bh);
           91          arrange(selmon);
           92  }
           93  
           94 @@ -1809,14 +1829,22 @@ updatebars(void)
           95          };
           96          XClassHint ch = {"dwm", "dwm"};
           97          for (m = mons; m; m = m->next) {
           98 -                if (m->barwin)
           99 -                        continue;
          100 -                m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
          101 -                                CopyFromParent, DefaultVisual(dpy, screen),
          102 -                                CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
          103 -                XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
          104 -                XMapRaised(dpy, m->barwin);
          105 -                XSetClassHint(dpy, m->barwin, &ch);
          106 +                if (!m->barwin) {
          107 +                        m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
          108 +                                        CopyFromParent, DefaultVisual(dpy, screen),
          109 +                                        CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
          110 +                        XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
          111 +                        XMapRaised(dpy, m->barwin);
          112 +                        XSetClassHint(dpy, m->barwin, &ch);
          113 +                }
          114 +                if (!m->extrabarwin) {
          115 +                        m->extrabarwin = XCreateWindow(dpy, root, m->wx, m->eby, m->ww, bh, 0, DefaultDepth(dpy, screen),
          116 +                                        CopyFromParent, DefaultVisual(dpy, screen),
          117 +                                        CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
          118 +                        XDefineCursor(dpy, m->extrabarwin, cursor[CurNormal]->cursor);
          119 +                        XMapRaised(dpy, m->extrabarwin);
          120 +                        XSetClassHint(dpy, m->extrabarwin, &ch);
          121 +                }
          122          }
          123  }
          124  
          125 @@ -1825,12 +1853,15 @@ updatebarpos(Monitor *m)
          126  {
          127          m->wy = m->my;
          128          m->wh = m->mh;
          129 +        m->wh -= bh * m->showbar * 2;
          130 +        m->wy = m->showbar ? m->wy + bh : m->wy;
          131          if (m->showbar) {
          132 -                m->wh -= bh;
          133 -                m->by = m->topbar ? m->wy : m->wy + m->wh;
          134 -                m->wy = m->topbar ? m->wy + bh : m->wy;
          135 -        } else
          136 +                m->by = m->topbar ? m->wy - bh : m->wy + m->wh;
          137 +                m->eby = m->topbar ? m->wy + m->wh : m->wy - bh;
          138 +        } else {
          139                  m->by = -bh;
          140 +                m->eby = -bh;
          141 +        }
          142  }
          143  
          144  void
          145 @@ -1987,8 +2018,20 @@ updatesizehints(Client *c)
          146  void
          147  updatestatus(void)
          148  {
          149 -        if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
          150 +        char text[512];
          151 +        if (!gettextprop(root, XA_WM_NAME, text, sizeof(text))) {
          152                  strcpy(stext, "dwm-"VERSION);
          153 +                estext[0] = '\0';
          154 +        } else {
          155 +                char *e = strchr(text, statussep);
          156 +                if (e) {
          157 +                        *e = '\0'; e++;
          158 +                        strncpy(estext, e, sizeof(estext) - 1);
          159 +                } else {
          160 +                        estext[0] = '\0';
          161 +                }
          162 +                strncpy(stext, text, sizeof(stext) - 1);
          163 +        }
          164          drawbar(selmon);
          165  }
          166  
          167 @@ -2067,7 +2110,7 @@ wintomon(Window w)
          168          if (w == root && getrootptr(&x, &y))
          169                  return recttomon(x, y, 1, 1);
          170          for (m = mons; m; m = m->next)
          171 -                if (w == m->barwin)
          172 +                if (w == m->barwin || w == m->extrabarwin)
          173                          return m;
          174          if ((c = wintoclient(w)))
          175                  return c->mon;