commit 25bea1e4ad59ff6ef4984d66621d208824dfcb76
parent 7505368614ea11a69be4fac7e5b61d4fd4e27161
Author: Santtu Lakkala <inz@inz.fi>
Date: Wed, 23 Feb 2022 16:22:59 +0200
256 colors SGR support
Diffstat:
M | dwm.c | | | 69 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- |
1 file changed, 66 insertions(+), 3 deletions(-)
diff --git a/dwm.c b/dwm.c
@@ -295,7 +295,7 @@ static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast];
static int running = 1;
static Cur *cursor[CurLast];
static Clr **scheme;
-static Clr *barclrs;
+static Clr barclrs[256];
static Display *dpy;
static Drw *drw;
static Monitor *mons, *selmon;
@@ -869,6 +869,8 @@ drawbar(Monitor *m)
} else {
drw_setfontset(drw, fset);
}
+ } else if (v == 48 || v == 38) {
+ break;
}
}
@@ -906,8 +908,25 @@ drawbar(Monitor *m)
}
char *ep = stext + rd + 1;
+ int ignore = 0;
+ int bgfg = 0;
while (*ep != 'm') {
unsigned v = strtoul(ep + 1, &ep, 10);
+ if (ignore)
+ continue;
+ if (bgfg) {
+ if (bgfg < 4 && v == 5) {
+ bgfg <<= 1;
+ continue;
+ }
+ if (bgfg == 4)
+ scm[0] = barclrs[fg = v];
+ else if (bgfg == 6)
+ scm[1] = barclrs[bg = v];
+ ignore = 1;
+
+ continue;
+ }
if (v == 0) {
memcpy(scm, scheme[SchemeNorm], sizeof(scm));
fg = 7;
@@ -952,9 +971,13 @@ drawbar(Monitor *m)
} else if (v >= 30 && v <= 37) {
fg = v % 10 | (fg & 8);
scm[0] = barclrs[fg];
+ } else if (v == 38) {
+ bgfg = 2;
} else if (v >= 40 && v <= 47) {
bg = v % 10;
scm[1] = barclrs[bg];
+ } else if (v == 48) {
+ bgfg = 3;
} else if (v == 53) {
fmt |= OVERLINE;
} else if (v == 55) {
@@ -1894,6 +1917,12 @@ setmfact(const Arg *arg)
arrange(selmon);
}
+unsigned char
+sixd_to_8bit(int x)
+{
+ return x == 0 ? 0 : 0x37 + 0x28 * x;
+}
+
void
setup(void)
{
@@ -1901,6 +1930,7 @@ setup(void)
XSetWindowAttributes wa;
Atom utf8string;
struct sigaction sa;
+ char cbuf[8];
/* do not transform children into zombies when they terminate */
sigemptyset(&sa.sa_mask);
@@ -1953,9 +1983,42 @@ setup(void)
for (i = 0; i < LENGTH(colors); i++)
scheme[i] = drw_scm_create(drw, colors[i], 3);
- barclrs = ecalloc(LENGTH(barcolors), sizeof(Clr));
- for (i = 0; i < LENGTH(barcolors); i++)
+ for (i = 0; i < LENGTH(barcolors) && i < 256; i++)
drw_clr_create(drw, &barclrs[i], barcolors[i]);
+ if (i == 0)
+ drw_clr_create(drw, &barclrs[i++], "#000000");
+ for (; i < 7; i++) {
+ snprintf(cbuf, sizeof(cbuf), "#%02x%02x%02x",
+ !!(i & 1) * 0x7f,
+ !!(i & 2) * 0x7f,
+ !!(i & 4) * 0x7f);
+ drw_clr_create(drw, &barclrs[i], cbuf);
+ }
+ if (i == 7)
+ drw_clr_create(drw, &barclrs[i++], "#000000");
+ if (i == 8)
+ drw_clr_create(drw, &barclrs[i++], "#333333");
+ for (; i < 16; i++) {
+ snprintf(cbuf, sizeof(cbuf), "#%02x%02x%02x",
+ !!(i & 1) * 0xff,
+ !!(i & 2) * 0xff,
+ !!(i & 4) * 0xff);
+ drw_clr_create(drw, &barclrs[i], cbuf);
+ }
+ for (; i < 6 * 6 * 6 + 16; i++) {
+ snprintf(cbuf, sizeof(cbuf), "#%02x%02x%02x",
+ sixd_to_8bit(((i - 16) / 36) % 6),
+ sixd_to_8bit(((i - 16) / 6) % 6),
+ sixd_to_8bit(((i - 16)) % 6));
+ drw_clr_create(drw, &barclrs[i], cbuf);
+ }
+ for (; i < 256; i++) {
+ snprintf(cbuf, sizeof(cbuf), "#%02x%02x%02x",
+ 0x08 + (i - 6 * 6 * 6 - 16) * 0x0a,
+ 0x08 + (i - 6 * 6 * 6 - 16) * 0x0a,
+ 0x08 + (i - 6 * 6 * 6 - 16) * 0x0a);
+ drw_clr_create(drw, &barclrs[i], cbuf);
+ }
/* init system tray */
updatesystray();