dwm-status2d-extrabar-6.2.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-status2d-extrabar-6.2.diff (9655B)
       ---
            1 From e741941428f60f2d8c8d1125c965dec4cfc2d1ba Mon Sep 17 00:00:00 2001
            2 From: klassiker <suckless@lupia.eu>
            3 Date: Tue, 14 Jul 2020 15:23:06 +0200
            4 Subject: [PATCH] status2d patched with the extrabar patch for dwm 6.2
            5 
            6 ---
            7  config.def.h |   2 +-
            8  dwm.c        | 188 +++++++++++++++++++++++++++++++++++++++++++++------
            9  2 files changed, 169 insertions(+), 21 deletions(-)
           10 
           11 diff --git a/config.def.h b/config.def.h
           12 index 1c0b587..8ce3e96 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..f3c97c4 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 @@ -163,6 +165,7 @@ static void detachstack(Client *c);
           49  static Monitor *dirtomon(int dir);
           50  static void drawbar(Monitor *m);
           51  static void drawbars(void);
           52 +static int drawstatusbar(Monitor *m, int bh, int extra, char* text);
           53  static void enternotify(XEvent *e);
           54  static void expose(XEvent *e);
           55  static void focus(Client *c);
           56 @@ -236,7 +239,8 @@ static void zoom(const Arg *arg);
           57  
           58  /* variables */
           59  static const char broken[] = "broken";
           60 -static char stext[256];
           61 +static char stext[1024];
           62 +static char estext[1024];
           63  static int screen;
           64  static int sw, sh;           /* X display screen geometry width, height */
           65  static int bh, blw = 0;      /* bar geometry */
           66 @@ -484,7 +488,7 @@ cleanup(void)
           67                  cleanupmon(mons);
           68          for (i = 0; i < CurLast; i++)
           69                  drw_cur_free(drw, cursor[i]);
           70 -        for (i = 0; i < LENGTH(colors); i++)
           71 +        for (i = 0; i < LENGTH(colors) + 1; i++)
           72                  free(scheme[i]);
           73          XDestroyWindow(dpy, wmcheckwin);
           74          drw_free(drw);
           75 @@ -505,7 +509,9 @@ cleanupmon(Monitor *mon)
           76                  m->next = mon->next;
           77          }
           78          XUnmapWindow(dpy, mon->barwin);
           79 +        XUnmapWindow(dpy, mon->extrabarwin);
           80          XDestroyWindow(dpy, mon->barwin);
           81 +        XDestroyWindow(dpy, mon->extrabarwin);
           82          free(mon);
           83  }
           84  
           85 @@ -568,6 +574,7 @@ configurenotify(XEvent *e)
           86                                          if (c->isfullscreen)
           87                                                  resizeclient(c, m->mx, m->my, m->mw, m->mh);
           88                                  XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
           89 +                                XMoveResizeWindow(dpy, m->extrabarwin, m->wx, m->eby, m->ww, bh);
           90                          }
           91                          focus(NULL);
           92                          arrange(NULL);
           93 @@ -692,6 +699,119 @@ dirtomon(int dir)
           94          return m;
           95  }
           96  
           97 +int
           98 +drawstatusbar(Monitor *m, int bh, int extra, char* stext) {
           99 +        int ret, i, w, x, len;
          100 +        short isCode = 0;
          101 +        char *text;
          102 +        char *p;
          103 +
          104 +        len = strlen(stext) + 1 ;
          105 +        if (!(text = (char*) malloc(sizeof(char)*len)))
          106 +                die("malloc");
          107 +        p = text;
          108 +        memcpy(text, stext, len);
          109 +
          110 +        /* compute width of the status text */
          111 +        w = 0;
          112 +        i = -1;
          113 +        while (text[++i]) {
          114 +                if (text[i] == '^') {
          115 +                        if (!isCode) {
          116 +                                isCode = 1;
          117 +                                text[i] = '\0';
          118 +                                w += TEXTW(text) - lrpad;
          119 +                                text[i] = '^';
          120 +                                if (text[++i] == 'f')
          121 +                                        w += atoi(text + ++i);
          122 +                        } else {
          123 +                                isCode = 0;
          124 +                                text = text + i + 1;
          125 +                                i = -1;
          126 +                        }
          127 +                }
          128 +        }
          129 +        if (!isCode)
          130 +                w += TEXTW(text) - lrpad;
          131 +        else
          132 +                isCode = 0;
          133 +        text = p;
          134 +
          135 +        if (extra) {
          136 +                w = m->ww;
          137 +                ret = x = 1;
          138 +        } else {
          139 +                w += 2; /* 1px padding on both sides */
          140 +                ret = x = m->ww - w;
          141 +        }
          142 +
          143 +        drw_setscheme(drw, scheme[LENGTH(colors)]);
          144 +        drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
          145 +        drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
          146 +        drw_rect(drw, x, 0, w, bh, 1, 1);
          147 +        x++;
          148 +
          149 +        /* process status text */
          150 +        i = -1;
          151 +        while (text[++i]) {
          152 +                if (text[i] == '^' && !isCode) {
          153 +                        isCode = 1;
          154 +
          155 +                        text[i] = '\0';
          156 +                        w = TEXTW(text) - lrpad;
          157 +                        drw_text(drw, x, 0, w, bh, 0, text, 0);
          158 +
          159 +                        x += w;
          160 +
          161 +                        /* process code */
          162 +                        while (text[++i] != '^') {
          163 +                                if (text[i] == 'c') {
          164 +                                        char buf[8];
          165 +                                        memcpy(buf, (char*)text+i+1, 7);
          166 +                                        buf[7] = '\0';
          167 +                                        drw_clr_create(drw, &drw->scheme[ColFg], buf);
          168 +                                        i += 7;
          169 +                                } else if (text[i] == 'b') {
          170 +                                        char buf[8];
          171 +                                        memcpy(buf, (char*)text+i+1, 7);
          172 +                                        buf[7] = '\0';
          173 +                                        drw_clr_create(drw, &drw->scheme[ColBg], buf);
          174 +                                        i += 7;
          175 +                                } else if (text[i] == 'd') {
          176 +                                        drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
          177 +                                        drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
          178 +                                } else if (text[i] == 'r') {
          179 +                                        int rx = atoi(text + ++i);
          180 +                                        while (text[++i] != ',');
          181 +                                        int ry = atoi(text + ++i);
          182 +                                        while (text[++i] != ',');
          183 +                                        int rw = atoi(text + ++i);
          184 +                                        while (text[++i] != ',');
          185 +                                        int rh = atoi(text + ++i);
          186 +
          187 +                                        drw_rect(drw, rx + x, ry, rw, rh, 1, 0);
          188 +                                } else if (text[i] == 'f') {
          189 +                                        x += atoi(text + ++i);
          190 +                                }
          191 +                        }
          192 +
          193 +                        text = text + i + 1;
          194 +                        i=-1;
          195 +                        isCode = 0;
          196 +                }
          197 +        }
          198 +
          199 +        if (!isCode) {
          200 +                w = TEXTW(text) - lrpad;
          201 +                drw_text(drw, x, 0, w, bh, 0, text, 0);
          202 +        }
          203 +
          204 +        drw_setscheme(drw, scheme[SchemeNorm]);
          205 +        free(p);
          206 +
          207 +        return ret;
          208 +}
          209 +
          210  void
          211  drawbar(Monitor *m)
          212  {
          213 @@ -703,9 +823,7 @@ drawbar(Monitor *m)
          214  
          215          /* draw status first so it can be overdrawn by tags later */
          216          if (m == selmon) { /* status is only drawn on selected monitor */
          217 -                drw_setscheme(drw, scheme[SchemeNorm]);
          218 -                sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
          219 -                drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0);
          220 +                sw = m->ww - drawstatusbar(m, bh, 0, stext);
          221          }
          222  
          223          for (c = m->clients; c; c = c->next) {
          224 @@ -740,6 +858,11 @@ drawbar(Monitor *m)
          225                  }
          226          }
          227          drw_map(drw, m->barwin, 0, 0, m->ww, bh);
          228 +
          229 +        if (m == selmon) { /* extra status is only drawn on selected monitor */
          230 +                sw = drawstatusbar(m, bh, 1, estext);
          231 +                drw_map(drw, m->extrabarwin, 0, 0, m->ww, bh);
          232 +        }
          233  }
          234  
          235  void
          236 @@ -1567,7 +1690,8 @@ setup(void)
          237          cursor[CurResize] = drw_cur_create(drw, XC_sizing);
          238          cursor[CurMove] = drw_cur_create(drw, XC_fleur);
          239          /* init appearance */
          240 -        scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
          241 +        scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *));
          242 +        scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3);
          243          for (i = 0; i < LENGTH(colors); i++)
          244                  scheme[i] = drw_scm_create(drw, colors[i], 3);
          245          /* init bars */
          246 @@ -1702,6 +1826,7 @@ togglebar(const Arg *arg)
          247          selmon->showbar = !selmon->showbar;
          248          updatebarpos(selmon);
          249          XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
          250 +        XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx, selmon->eby, selmon->ww, bh);
          251          arrange(selmon);
          252  }
          253  
          254 @@ -1809,14 +1934,22 @@ updatebars(void)
          255          };
          256          XClassHint ch = {"dwm", "dwm"};
          257          for (m = mons; m; m = m->next) {
          258 -                if (m->barwin)
          259 -                        continue;
          260 -                m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
          261 -                                CopyFromParent, DefaultVisual(dpy, screen),
          262 -                                CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
          263 -                XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
          264 -                XMapRaised(dpy, m->barwin);
          265 -                XSetClassHint(dpy, m->barwin, &ch);
          266 +                if (!m->barwin) {
          267 +                        m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
          268 +                                        CopyFromParent, DefaultVisual(dpy, screen),
          269 +                                        CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
          270 +                        XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
          271 +                        XMapRaised(dpy, m->barwin);
          272 +                        XSetClassHint(dpy, m->barwin, &ch);
          273 +                }
          274 +                if (!m->extrabarwin) {
          275 +                        m->extrabarwin = XCreateWindow(dpy, root, m->wx, m->eby, m->ww, bh, 0, DefaultDepth(dpy, screen),
          276 +                                        CopyFromParent, DefaultVisual(dpy, screen),
          277 +                                        CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
          278 +                        XDefineCursor(dpy, m->extrabarwin, cursor[CurNormal]->cursor);
          279 +                        XMapRaised(dpy, m->extrabarwin);
          280 +                        XSetClassHint(dpy, m->extrabarwin, &ch);
          281 +                }
          282          }
          283  }
          284  
          285 @@ -1825,12 +1958,15 @@ updatebarpos(Monitor *m)
          286  {
          287          m->wy = m->my;
          288          m->wh = m->mh;
          289 +        m->wh -= bh * m->showbar * 2;
          290 +        m->wy = m->showbar ? m->wy + bh : m->wy;
          291          if (m->showbar) {
          292 -                m->wh -= bh;
          293 -                m->by = m->topbar ? m->wy : m->wy + m->wh;
          294 -                m->wy = m->topbar ? m->wy + bh : m->wy;
          295 -        } else
          296 +                m->by = m->topbar ? m->wy - bh : m->wy + m->wh;
          297 +                m->eby = m->topbar ? m->wy + m->wh : m->wy - bh;
          298 +        } else {
          299                  m->by = -bh;
          300 +                m->eby = -bh;
          301 +        }
          302  }
          303  
          304  void
          305 @@ -1987,8 +2123,20 @@ updatesizehints(Client *c)
          306  void
          307  updatestatus(void)
          308  {
          309 -        if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
          310 +        char text[2048];
          311 +        if (!gettextprop(root, XA_WM_NAME, text, sizeof(text))) {
          312                  strcpy(stext, "dwm-"VERSION);
          313 +                estext[0] = '\0';
          314 +        } else {
          315 +                char *e = strchr(text, statussep);
          316 +                if (e) {
          317 +                        *e = '\0'; e++;
          318 +                        strncpy(estext, e, sizeof(estext) - 1);
          319 +                } else {
          320 +                        estext[0] = '\0';
          321 +                }
          322 +                strncpy(stext, text, sizeof(stext) - 1);
          323 +        }
          324          drawbar(selmon);
          325  }
          326  
          327 @@ -2067,7 +2215,7 @@ wintomon(Window w)
          328          if (w == root && getrootptr(&x, &y))
          329                  return recttomon(x, y, 1, 1);
          330          for (m = mons; m; m = m->next)
          331 -                if (w == m->barwin)
          332 +                if (w == m->barwin || w == m->extrabarwin)
          333                          return m;
          334          if ((c = wintoclient(w)))
          335                  return c->mon;
          336 -- 
          337 2.27.0
          338