dwm-sgrstatus256-20220223-6.3.diff (3430B)
1 From 7be41dd26e562072afc11621432aa71d2ea5622a Mon Sep 17 00:00:00 2001 2 From: Santtu Lakkala <inz@inz.fi> 3 Date: Wed, 23 Feb 2022 16:22:59 +0200 4 Subject: [PATCH 2/2] 256 colors SGR support 5 6 --- 7 dwm.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 8 1 file changed, 64 insertions(+), 3 deletions(-) 9 10 diff --git a/dwm.c b/dwm.c 11 index cb9484a..e2dc586 100644 12 --- a/dwm.c 13 +++ b/dwm.c 14 @@ -264,7 +264,7 @@ static Atom wmatom[WMLast], netatom[NetLast]; 15 static int running = 1; 16 static Cur *cursor[CurLast]; 17 static Clr **scheme; 18 -static Clr *barclrs; 19 +static Clr barclrs[256]; 20 static Display *dpy; 21 static Drw *drw; 22 static Monitor *mons, *selmon; 23 @@ -804,8 +804,25 @@ drawbar(Monitor *m) 24 lp = 0; 25 26 char *ep = stext + rd + 1; 27 + int ignore = 0; 28 + int bgfg = 0; 29 while (*ep != 'm') { 30 unsigned v = strtoul(ep + 1, &ep, 10); 31 + if (ignore) 32 + continue; 33 + if (bgfg) { 34 + if (bgfg < 4 && v == 5) { 35 + bgfg <<= 1; 36 + continue; 37 + } 38 + if (bgfg == 4) 39 + scm[0] = barclrs[fg = v]; 40 + else if (bgfg == 6) 41 + scm[1] = barclrs[bg = v]; 42 + ignore = 1; 43 + 44 + continue; 45 + } 46 if (v == 0) { 47 memcpy(scm, scheme[SchemeNorm], sizeof(scm)); 48 fg = 7; 49 @@ -850,9 +867,13 @@ drawbar(Monitor *m) 50 } else if (v >= 30 && v <= 37) { 51 fg = v % 10 | (fg & 8); 52 scm[0] = barclrs[fg]; 53 + } else if (v == 38) { 54 + bgfg = 2; 55 } else if (v >= 40 && v <= 47) { 56 bg = v % 10; 57 scm[1] = barclrs[bg]; 58 + } else if (v == 48) { 59 + bgfg = 3; 60 } else if (v == 53) { 61 fmt |= OVERLINE; 62 } else if (v == 55) { 63 @@ -1701,12 +1722,19 @@ setmfact(const Arg *arg) 64 arrange(selmon); 65 } 66 67 +unsigned char 68 +sixd_to_8bit(int x) 69 +{ 70 + return x == 0 ? 0 : 0x37 + 0x28 * x; 71 +} 72 + 73 void 74 setup(void) 75 { 76 int i; 77 XSetWindowAttributes wa; 78 Atom utf8string; 79 + char cbuf[8]; 80 81 /* clean up any zombies immediately */ 82 sigchld(0); 83 @@ -1746,9 +1774,42 @@ setup(void) 84 for (i = 0; i < LENGTH(colors); i++) 85 scheme[i] = drw_scm_create(drw, colors[i], 3); 86 87 - barclrs = ecalloc(LENGTH(barcolors), sizeof(Clr)); 88 - for (i = 0; i < LENGTH(barcolors); i++) 89 + for (i = 0; i < LENGTH(barcolors) && i < LENGTH(barclrs); i++) 90 drw_clr_create(drw, &barclrs[i], barcolors[i]); 91 + if (i == 0) 92 + drw_clr_create(drw, &barclrs[i++], "#000000"); 93 + for (; i < 7; i++) { 94 + snprintf(cbuf, sizeof(cbuf), "#%02x%02x%02x", 95 + !!(i & 1) * 0x7f, 96 + !!(i & 2) * 0x7f, 97 + !!(i & 4) * 0x7f); 98 + drw_clr_create(drw, &barclrs[i], cbuf); 99 + } 100 + if (i == 7) 101 + drw_clr_create(drw, &barclrs[i++], "#000000"); 102 + if (i == 8) 103 + drw_clr_create(drw, &barclrs[i++], "#333333"); 104 + for (; i < 16; i++) { 105 + snprintf(cbuf, sizeof(cbuf), "#%02x%02x%02x", 106 + !!(i & 1) * 0xff, 107 + !!(i & 2) * 0xff, 108 + !!(i & 4) * 0xff); 109 + drw_clr_create(drw, &barclrs[i], cbuf); 110 + } 111 + for (; i < 6 * 6 * 6 + 16; i++) { 112 + snprintf(cbuf, sizeof(cbuf), "#%02x%02x%02x", 113 + sixd_to_8bit(((i - 16) / 36) % 6), 114 + sixd_to_8bit(((i - 16) / 6) % 6), 115 + sixd_to_8bit(((i - 16)) % 6)); 116 + drw_clr_create(drw, &barclrs[i], cbuf); 117 + } 118 + for (; i < 256; i++) { 119 + snprintf(cbuf, sizeof(cbuf), "#%02x%02x%02x", 120 + 0x08 + (i - 6 * 6 * 6 - 16) * 0x0a, 121 + 0x08 + (i - 6 * 6 * 6 - 16) * 0x0a, 122 + 0x08 + (i - 6 * 6 * 6 - 16) * 0x0a); 123 + drw_clr_create(drw, &barclrs[i], cbuf); 124 + } 125 126 /* init bars */ 127 updatebars(); 128 -- 129 2.32.0 130