This patch allows the user to provide a second set of tags which are
displayed when there is a client in that tag.

---
 config.def.h |  5 ++++-
 dwm.c        | 36 +++++++++++++++++++++---------------
 2 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/config.def.h b/config.def.h
index 1c0b587..53630cf 100644
--- a/config.def.h
+++ b/config.def.h
@@ -19,7 +19,10 @@ static const char *colors[][3]      = {
 };

 /* tagging */
-static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
+static const char *tags[][9] = {
+       [VacantTags] = {"1", "2", "3", "4", "5", "6", "7", "8", "9"},
+       [BusyTags]   = {"A", "B", "C", "D", "E", "F", "G", "H", "I"}
+};

 static const Rule rules[] = {
        /* xprop(1):
diff --git a/dwm.c b/dwm.c
index b0b3466..c7b8ceb 100644
--- a/dwm.c
+++ b/dwm.c
@@ -54,7 +54,7 @@
 #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
 #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
 #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
-#define TAGMASK                 ((1 << LENGTH(tags)) - 1)
+#define TAGMASK                 ((1 << LENGTH(tags[VacantTags])) - 1)
 #define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad)

 /* enums */
@@ -66,6 +66,7 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
 enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms 
*/
 enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
        ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
+enum { VacantTags, BusyTags }; /* Tag Types */

 typedef union {
        int i;
@@ -273,7 +274,7 @@ static Window root, wmcheckwin;
 #include "config.h"

 /* compile-time check if all tags fit into an unsigned int bit array. */
-struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
+struct NumTags { char limitexceeded[LENGTH(tags[VacantTags]) > 31 ? -1 : 1]; };

 /* function implementations */
 void
@@ -417,7 +418,7 @@ attachstack(Client *c)
 void
 buttonpress(XEvent *e)
 {
-       unsigned int i, x, click;
+       unsigned int i, x, click, occ = 0;
        Arg arg = {0};
        Client *c;
        Monitor *m;
@@ -432,10 +433,16 @@ buttonpress(XEvent *e)
        }
        if (ev->window == selmon->barwin) {
                i = x = 0;
-               do
-                       x += TEXTW(tags[i]);
-               while (ev->x >= x && ++i < LENGTH(tags));
-               if (i < LENGTH(tags)) {
+
+               for (c = m->clients; c; c = c->next)
+                       occ |= c->tags == 255 ? 0 : c->tags;
+               do {
+                       if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
+                               x += TEXTW(tags[VacantTags][i]);
+                       else
+                               x += TEXTW(tags[BusyTags][i]);
+               }while (ev->x >= x && ++i < LENGTH(tags[VacantTags]));
+               if (i < LENGTH(tags[VacantTags])) {
                        click = ClkTagBar;
                        arg.ui = 1 << i;
                } else if (ev->x < x + blw)
@@ -710,19 +717,18 @@ drawbar(Monitor *m)
        }

        for (c = m->clients; c; c = c->next) {
-               occ |= c->tags;
+               occ |= c->tags == 255 ? 0 : c->tags;
                if (c->isurgent)
                        urg |= c->tags;
        }
        x = 0;
-       for (i = 0; i < LENGTH(tags); i++) {
-               w = TEXTW(tags[i]);
+       for (i = 0; i < LENGTH(tags[VacantTags]); i++) {
+               w = bh;
                drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? 
SchemeSel : SchemeNorm]);
-               drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
-               if (occ & 1 << i)
-                       drw_rect(drw, x + boxs, boxs, boxw, boxw,
-                               m == selmon && selmon->sel && selmon->sel->tags 
& 1 << i,
-                               urg & 1 << i);
+               if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
+                       drw_text(drw, x, 0, w, bh, lrpad / 2, 
tags[VacantTags][i], urg & 1 << i);
+               else
+                       drw_text(drw, x, 0, w, bh, lrpad / 2, 
tags[BusyTags][i], urg & 1 << i);
                x += w;
        }
        w = blw = TEXTW(m->ltsymbol);
--
2.31.1


Reply via email to