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