[hackers] [dwm][PATCH] statuscolors, fix status text width computation

From: Christian Tenllado <ctenllado_AT_gmail.com>
Date: Wed, 15 Apr 2020 18:22:21 +0200

This is an updated version of the statuscolors patch that fixes the
computation of the text width. The previous version of the patch
inculded all the byte codes that are used to select the color schemes
when computing the width, obaining a width that is larger than the real
width. This patch fixes that by adding up the widths of the individual
chunks, separated by the codes that select the color schemes.
---
 config.def.h | 13 ++++++++++---
 dwm.c        | 40 +++++++++++++++++++++++++++++++++++++---
 2 files changed, 47 insertions(+), 6 deletions(-)
diff --git a/config.def.h b/config.def.h
index 1c0b587..df92695 100644
--- a/config.def.h
+++ b/config.def.h
_AT_@ -12,10 +12,17 @@ static const char col_gray2[]       = "#444444";
 static const char col_gray3[]       = "#bbbbbb";
 static const char col_gray4[]       = "#eeeeee";
 static const char col_cyan[]        = "#005577";
+static const char col_black[]       = "#000000";
+static const char col_red[]         = "#ff0000";
+static const char col_yellow[]      = "#ffff00";
+static const char col_white[]       = "#ffffff";
+
 static const char *colors[][3]      = {
-	/*               fg         bg         border   */
-	[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
-	[SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
+	/*					fg         bg          border   */
+	[SchemeNorm] =	 { col_gray3, col_gray1,  col_gray2 },
+	[SchemeSel]  =	 { col_gray4, col_cyan,   col_cyan },
+	[SchemeWarn] =	 { col_black, col_yellow, col_red },
+	[SchemeUrgent]=	 { col_white, col_red,    col_red },
 };
 
 /* tagging */
diff --git a/dwm.c b/dwm.c
index 4465af1..0856993 100644
--- a/dwm.c
+++ b/dwm.c
_AT_@ -59,7 +59,7 @@
 
 /* enums */
 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
-enum { SchemeNorm, SchemeSel }; /* color schemes */
+enum { SchemeNorm, SchemeSel, SchemeWarn, SchemeUrgent }; /* color schemes */
 enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
        NetWMFullscreen, NetActiveWindow, NetWMWindowType,
        NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
_AT_@ -692,6 +692,26 @@ dirtomon(int dir)
 	return m;
 }
 
+int
+textw_wosc(char *s)
+{
+	char *ts = s;
+	char *tp = s;
+	int sw = 0;
+	char ctmp;
+	while (1) {
+		if ((unsigned int)*ts > LENGTH(colors)) { ts++; continue ; }
+		ctmp = *ts;
+		*ts = '\0';
+		sw += drw_fontset_getwidth(drw, tp);
+		*ts = ctmp;
+		if (ctmp == '\0') { break; }
+		tp = ++ts;
+	}
+
+	return sw;
+}
+
 void
 drawbar(Monitor *m)
 {
_AT_@ -699,13 +719,27 @@ drawbar(Monitor *m)
 	int boxs = drw->fonts->h / 9;
 	int boxw = drw->fonts->h / 6 + 2;
 	unsigned int i, occ = 0, urg = 0;
+	char *ts = stext;
+	char *tp = stext;
+	int tx = 0;
+	char ctmp;
 	Client *c;
 
 	/* draw status first so it can be overdrawn by tags later */
 	if (m == selmon) { /* status is only drawn on selected monitor */
 		drw_setscheme(drw, scheme[SchemeNorm]);
-		sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
-		drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0);
+		sw = textw_wosc(stext) + 2;
+		while (1) {
+			if ((unsigned int)*ts > LENGTH(colors)) { ts++; continue ; }
+			ctmp = *ts;
+			*ts = '\0';
+			drw_text(drw, m->ww - sw + tx, 0, sw - tx, bh, 0, tp, 0);
+			tx += TEXTW(tp) -lrpad;
+			if (ctmp == '\0') { break; }
+			drw_setscheme(drw, scheme[(unsigned int)(ctmp-1)]);
+			*ts = ctmp;
+			tp = ++ts;
+		}
 	}
 
 	for (c = m->clients; c; c = c->next) {
-- 
2.20.1
Received on Wed Apr 15 2020 - 18:22:21 CEST

This archive was generated by hypermail 2.3.0 : Thu Apr 16 2020 - 00:24:37 CEST