From e05bcf6982cc0b098a4b8276da5a80dd36f98e17 Mon Sep 17 00:00:00 2001 From: Eddy Pedroni Date: Sat, 16 Dec 2023 17:50:57 +0100 Subject: Add correct statuscolors patch --- patches/dwm-statuscolors-20220322-bece862.diff | 83 +++++++++++ patches/dwm-statuscolors-6.1.diff | 194 ------------------------- 2 files changed, 83 insertions(+), 194 deletions(-) create mode 100644 patches/dwm-statuscolors-20220322-bece862.diff delete mode 100644 patches/dwm-statuscolors-6.1.diff diff --git a/patches/dwm-statuscolors-20220322-bece862.diff b/patches/dwm-statuscolors-20220322-bece862.diff new file mode 100644 index 0000000..2425419 --- /dev/null +++ b/patches/dwm-statuscolors-20220322-bece862.diff @@ -0,0 +1,83 @@ +From 301db3986527041d64f4b58026677709a34b153f Mon Sep 17 00:00:00 2001 +From: dan soucy +Date: Tue, 22 Mar 2022 03:15:00 -0400 +Subject: [PATCH] enable colored text in the status bar + +This patch is an update of statuscolors patch to work with 6.3. +It is known to work up to commit bece862. +--- + config.def.h | 13 ++++++++++--- + dwm.c | 18 ++++++++++++++++-- + 2 files changed, 26 insertions(+), 5 deletions(-) + +diff --git a/config.def.h b/config.def.h +index a2ac963..a635f76 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -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 5f16260..3c5e26b 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -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 */ +@@ -701,6 +701,10 @@ 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; + + if (!m->showbar) +@@ -710,7 +714,17 @@ drawbar(Monitor *m) + if (m == selmon) { /* status is only drawn on selected monitor */ + drw_setscheme(drw, scheme[SchemeNorm]); + tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ +- drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); ++ while (1) { ++ if ((unsigned int)*ts > LENGTH(colors)) { ts++; continue ; } ++ ctmp = *ts; ++ *ts = '\0'; ++ drw_text(drw, m->ww - tw + tx, 0, tw - 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.35.1 + diff --git a/patches/dwm-statuscolors-6.1.diff b/patches/dwm-statuscolors-6.1.diff deleted file mode 100644 index 3aead49..0000000 --- a/patches/dwm-statuscolors-6.1.diff +++ /dev/null @@ -1,194 +0,0 @@ -diff -up dwm/drw.c dwm-statuscolors/drw.c ---- dwm/drw.c 2015-11-08 15:39:37.000000000 -0700 -+++ dwm-statuscolors/drw.c 2015-11-28 15:42:28.534399525 -0700 -@@ -206,6 +206,68 @@ drw_setscheme(Drw *drw, ClrScheme *schem - drw->scheme = scheme; - } - -+int -+drw_get_width(Drw *drw, int numcolors, const char *text) -+{ -+ int i; -+ Fnt *curfont = drw->fonts[0]; -+ int w = drw_text(drw, 0, 0, 0, 0, text, 0) + curfont->h; -+ -+ for (i = 0; i < strlen(text); i++) { -+ if (text[i] > 0 && text[i] <= numcolors) { -+ /* we found a color code -+ * drw_text counted it as a normal character and added one character's width -+ * we aren't going to render this character, so we remove one character's width */ -+ w -= curfont->xfont->max_advance_width; -+ -+ if (i == 0 || i + 1 == strlen(text)) { -+ /* we're on the first or the last character of the string -+ * drw_text already added one character's height (divided by 2) as padding to the beginning and end -+ * we don't want to double this padding, so we skip this character */ -+ continue; -+ } -+ -+ if (text[i - 1] > 0 && text[i - 1] <= numcolors) { -+ /* the previous character was also a color code -+ * we already added padding in the previous iteration -+ * we don't want to double this padding, so we skip this character */ -+ continue; -+ } -+ -+ /* we are somewhere in the middle of the string and the color has changed -+ * we want to add one character's height (divided by 2) as padding to the end of the previous colored text -+ * and to the beginning of the new colored text */ -+ w += curfont->h; -+ } -+ } -+ -+ return w; -+} -+ -+void -+drw_colored_text(Drw *drw, ClrScheme *scheme, int numcolors, int x, int y, unsigned int w, unsigned int h, char *text) -+{ -+ if (!drw || !drw->fontcount || !drw->scheme) -+ return; -+ -+ char *buf = text, *ptr = buf, c = 1; -+ int i; -+ -+ while (*ptr) { -+ for (i = 0; *ptr < 0 || *ptr > numcolors; i++, ptr++); -+ if (!*ptr) -+ break; -+ c = *ptr; -+ *ptr = 0; -+ if (i) -+ x = drw_text(drw, x, y, w, h, buf, 0) + drw->fonts[0]->h; -+ *ptr = c; -+ drw_setscheme(drw, &scheme[c-1]); -+ buf = ++ptr; -+ } -+ drw_text(drw, x, y, w, h, buf, 0); -+} -+ - void - drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int empty, int invert) - { -diff -up dwm/drw.h dwm-statuscolors/drw.h ---- dwm/drw.h 2015-11-08 15:39:37.000000000 -0700 -+++ dwm-statuscolors/drw.h 2015-11-28 15:39:44.427726312 -0700 -@@ -67,6 +67,8 @@ void drw_setfont(Drw *, Fnt *); - void drw_setscheme(Drw *, ClrScheme *); - - /* Drawing functions */ -+int drw_get_width(Drw *, int, const char *); -+void drw_colored_text(Drw *, ClrScheme *, int, int, int, unsigned int, unsigned int, char *); - void drw_rect(Drw *, int, int, unsigned int, unsigned int, int, int, int); - int drw_text(Drw *, int, int, unsigned int, unsigned int, const char *, int); - -diff -up dwm/dwm.c dwm-statuscolors/dwm.c ---- dwm/dwm.c 2015-11-08 15:39:37.000000000 -0700 -+++ dwm-statuscolors/dwm.c 2015-11-28 15:45:32.134406853 -0700 -@@ -51,6 +51,7 @@ - * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) - #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) - #define LENGTH(X) (sizeof X / sizeof X[0]) -+#define MAXCOLORS 9 - #define MOUSEMASK (BUTTONMASK|PointerMotionMask) - #define WIDTH(X) ((X)->w + 2 * (X)->bw) - #define HEIGHT(X) ((X)->h + 2 * (X)->bw) -@@ -261,7 +262,7 @@ static void (*handler[LASTEvent]) (XEven - static Atom wmatom[WMLast], netatom[NetLast]; - static int running = 1; - static Cur *cursor[CurLast]; --static ClrScheme scheme[SchemeLast]; -+static ClrScheme scheme[MAXCOLORS]; - static Display *dpy; - static Drw *drw; - static Monitor *mons, *selmon; -@@ -718,35 +719,35 @@ drawbar(Monitor *m) - x = 0; - for (i = 0; i < LENGTH(tags); i++) { - w = TEXTW(tags[i]); -- drw_setscheme(drw, m->tagset[m->seltags] & 1 << i ? &scheme[SchemeSel] : &scheme[SchemeNorm]); -- drw_text(drw, x, 0, w, bh, tags[i], urg & 1 << i); -+ drw_setscheme(drw, &scheme[(m->tagset[m->seltags] & 1 << i) ? 1 : (urg & 1 << i ? 2 : 0)]); -+ drw_text(drw, x, 0, w, bh, tags[i], 0); - drw_rect(drw, x + 1, 1, dx, dx, m == selmon && selmon->sel && selmon->sel->tags & 1 << i, -- occ & 1 << i, urg & 1 << i); -+ occ & 1 << i, 0); - x += w; - } - w = blw = TEXTW(m->ltsymbol); -- drw_setscheme(drw, &scheme[SchemeNorm]); -+ drw_setscheme(drw, &scheme[0]); - drw_text(drw, x, 0, w, bh, m->ltsymbol, 0); - x += w; - xx = x; - if (m == selmon) { /* status is only drawn on selected monitor */ -- w = TEXTW(stext); -+ w = drw_get_width(drw, NUMCOLORS, stext); - x = m->ww - w; - if (x < xx) { - x = xx; - w = m->ww - xx; - } -- drw_text(drw, x, 0, w, bh, stext, 0); -+ drw_colored_text(drw, scheme, NUMCOLORS, x, 0, w, bh, stext); - } else - x = m->ww; - if ((w = x - xx) > bh) { - x = xx; - if (m->sel) { -- drw_setscheme(drw, m == selmon ? &scheme[SchemeSel] : &scheme[SchemeNorm]); -+ drw_setscheme(drw, &scheme[m == selmon ? 1 : 0]); - drw_text(drw, x, 0, w, bh, m->sel->name, 0); - drw_rect(drw, x + 1, 1, dx, dx, m->sel->isfixed, m->sel->isfloating, 0); - } else { -- drw_setscheme(drw, &scheme[SchemeNorm]); -+ drw_setscheme(drw, &scheme[0]); - drw_rect(drw, x, 0, w, bh, 1, 0, 1); - } - } -@@ -807,7 +808,7 @@ focus(Client *c) - detachstack(c); - attachstack(c); - grabbuttons(c, 1); -- XSetWindowBorder(dpy, c->win, scheme[SchemeSel].border->pix); -+ XSetWindowBorder(dpy, c->win, scheme[1].border->pix); - setfocus(c); - } else { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); -@@ -1065,7 +1066,7 @@ manage(Window w, XWindowAttributes *wa) - - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); -- XSetWindowBorder(dpy, w, scheme[SchemeNorm].border->pix); -+ XSetWindowBorder(dpy, w, scheme[0].border->pix); - configure(c); /* propagates border_width, if size doesn't change */ - updatewindowtype(c); - updatesizehints(c); -@@ -1580,12 +1581,12 @@ setup(void) - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ -- scheme[SchemeNorm].border = drw_clr_create(drw, normbordercolor); -- scheme[SchemeNorm].bg = drw_clr_create(drw, normbgcolor); -- scheme[SchemeNorm].fg = drw_clr_create(drw, normfgcolor); -- scheme[SchemeSel].border = drw_clr_create(drw, selbordercolor); -- scheme[SchemeSel].bg = drw_clr_create(drw, selbgcolor); -- scheme[SchemeSel].fg = drw_clr_create(drw, selfgcolor); -+ for(int i = 0; i < NUMCOLORS; i++){ -+ scheme[i].border = drw_clr_create(drw, colors[i][0]); -+ scheme[i].fg = drw_clr_create(drw, colors[i][1]); -+ scheme[i].bg = drw_clr_create(drw, colors[i][2]); -+ } -+ - /* init bars */ - updatebars(); - updatestatus(); -@@ -1745,7 +1746,7 @@ unfocus(Client *c, int setfocus) - if (!c) - return; - grabbuttons(c, 0); -- XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->pix); -+ XSetWindowBorder(dpy, c->win, scheme[0].border->pix); - if (setfocus) { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); -- cgit v1.2.3