diff --git a/config.def.h b/config.def.h index 1d34e42..0e04b2c 100644 --- a/config.def.h +++ b/config.def.h @@ -63,6 +63,7 @@ static char *colors[][3] = { /* fg bg border */ [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor }, [SchemeSel] = { selfgcolor, selbgcolor, selbordercolor }, + [SchemeUrg] = { selfgcolor, selbgcolor, selbordercolor }, }; typedef struct { diff --git a/config.h b/config.h index b11d7c9..bc447ac 100644 --- a/config.h +++ b/config.h @@ -65,6 +65,7 @@ static char *colors[][3] = { /* fg bg border */ [SchemeNorm] = { foreground, background, border }, [SchemeSel] = { background, accent, accent }, + [SchemeUrg] = { background, secondary, secondary }, }; typedef struct { diff --git a/dwm.c b/dwm.c index 0cb2cbb..8dcb41e 100644 --- a/dwm.c +++ b/dwm.c @@ -102,7 +102,7 @@ if (XrmGetResource(xrdb, R, NULL, &type, &value) == True) { \ /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ +enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, @@ -1707,7 +1707,7 @@ manage(Window w, XWindowAttributes *wa) wc.border_width = c->bw; XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); + XSetWindowBorder(dpy, w, scheme[c->isurgent ? SchemeUrg : SchemeNorm][ColBorder].pixel); configure(c); /* propagates border_width, if size doesn't change */ updatewindowtype(c); updatesizehints(c); @@ -2588,6 +2588,8 @@ seturgent(Client *c, int urg) XWMHints *wmh; c->isurgent = urg; + if (selmon->sel != c) + XSetWindowBorder(dpy, c->win, scheme[c->isurgent ? SchemeUrg : SchemeNorm][ColBorder].pixel); if (!(wmh = XGetWMHints(dpy, c->win))) return; wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); @@ -2839,7 +2841,7 @@ unfocus(Client *c, int setfocus) if (!c) return; grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); + XSetWindowBorder(dpy, c->win, scheme[c->isurgent ? SchemeUrg : SchemeNorm][ColBorder].pixel); if (setfocus) { XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); XDeleteProperty(dpy, root, netatom[NetActiveWindow]); @@ -3223,8 +3225,10 @@ updatewmhints(Client *c) if (c == selmon->sel && wmh->flags & XUrgencyHint) { wmh->flags &= ~XUrgencyHint; XSetWMHints(dpy, c->win, wmh); - } else + } else { c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; + XSetWindowBorder(dpy, c->win, scheme[c->isurgent ? SchemeUrg : (c->mon->sel == c ? SchemeSel : SchemeNorm)][ColBorder].pixel); + } if (wmh->flags & InputHint) c->neverfocus = !wmh->input; else diff --git a/patch/bar_tags.c b/patch/bar_tags.c index ec570fc..a8223ca 100644 --- a/patch/bar_tags.c +++ b/patch/bar_tags.c @@ -18,11 +18,11 @@ width_tags(Bar *bar, BarWidthArg *a) int draw_tags(Bar *bar, BarDrawArg *a) { - int invert; int w, x = a->x; unsigned int i, occ = 0, urg = 0; Client *c; Monitor *m = bar->mon; + int s; for (c = m->cl->clients; c; c = c->next) { occ |= c->tags == 255 ? 0 : c->tags; @@ -33,10 +33,15 @@ draw_tags(Bar *bar, BarDrawArg *a) for (i = 0; i < LENGTH(tags); i++) { if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) continue; - invert = urg & 1 << i; + if (m->tagset[m->seltags] & 1 << i) + s = SchemeSel; + else if (urg & 1 << i) + s = SchemeUrg; + else + s = SchemeNorm; w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], invert); + drw_setscheme(drw, scheme[s]); + drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], 0); x += w; }