aboutsummaryrefslogtreecommitdiffstats
path: root/patches/dwm-statuscolors-6.1.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/dwm-statuscolors-6.1.diff')
-rw-r--r--patches/dwm-statuscolors-6.1.diff194
1 files changed, 194 insertions, 0 deletions
diff --git a/patches/dwm-statuscolors-6.1.diff b/patches/dwm-statuscolors-6.1.diff
new file mode 100644
index 0000000..3aead49
--- /dev/null
+++ b/patches/dwm-statuscolors-6.1.diff
@@ -0,0 +1,194 @@
+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]);