[hackers] [dwm][PATCH] Support for different tags when there is a client inside

From: Yigit Colakoglu <yigit_AT_yigitcolakoglu.com>
Date: Tue, 13 Apr 2021 13:10:20 +0300

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
_AT_@ -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
_AT_@ -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 */
_AT_@ -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;
_AT_@ -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
_AT_@ -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;
_AT_@ -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)
_AT_@ -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
Received on Tue Apr 13 2021 - 12:10:20 CEST

This archive was generated by hypermail 2.3.0 : Tue Apr 13 2021 - 13:00:42 CEST