dwm-sgrstatus-20220223-6.3.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-sgrstatus-20220223-6.3.diff (6857B)
---
1 From dc83e43aad7b8070911e8210b58cc36bdc4214d5 Mon Sep 17 00:00:00 2001
2 From: Santtu Lakkala <inz@inz.fi>
3 Date: Wed, 23 Feb 2022 11:55:19 +0200
4 Subject: [PATCH 1/2] Allow CSI SGR in status bar
5
6 ---
7 config.def.h | 19 ++++++
8 dwm.c | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++-
9 2 files changed, 198 insertions(+), 3 deletions(-)
10
11 diff --git a/config.def.h b/config.def.h
12 index a2ac963..3dc34bd 100644
13 --- a/config.def.h
14 +++ b/config.def.h
15 @@ -18,6 +18,25 @@ static const char *colors[][3] = {
16 [SchemeSel] = { col_gray4, col_cyan, col_cyan },
17 };
18
19 +static const char *barcolors[] = {
20 + "#000000",
21 + "#7f0000",
22 + "#007f00",
23 + "#7f7f00",
24 + "#00007f",
25 + "#7f007f",
26 + "#007f7f",
27 + "#cccccc",
28 + "#333333",
29 + "#ff0000",
30 + "#00ff00",
31 + "#ffff00",
32 + "#0000ff",
33 + "#ff00ff",
34 + "#00ffff",
35 + "#ffffff",
36 +};
37 +
38 /* tagging */
39 static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
40
41 diff --git a/dwm.c b/dwm.c
42 index a96f33c..cb9484a 100644
43 --- a/dwm.c
44 +++ b/dwm.c
45 @@ -237,7 +237,7 @@ static void zoom(const Arg *arg);
46
47 /* variables */
48 static const char broken[] = "broken";
49 -static char stext[256];
50 +static char stext[512];
51 static int screen;
52 static int sw, sh; /* X display screen geometry width, height */
53 static int bh, blw = 0; /* bar geometry */
54 @@ -264,6 +264,7 @@ static Atom wmatom[WMLast], netatom[NetLast];
55 static int running = 1;
56 static Cur *cursor[CurLast];
57 static Clr **scheme;
58 +static Clr *barclrs;
59 static Display *dpy;
60 static Drw *drw;
61 static Monitor *mons, *selmon;
62 @@ -693,6 +694,25 @@ dirtomon(int dir)
63 return m;
64 }
65
66 +void
67 +resetfntlist(Fnt *orighead, Fnt *curhead)
68 +{
69 + if (orighead != curhead) {
70 + Fnt *f;
71 + for (f = orighead; f->next; f = f->next);
72 + f->next = curhead;
73 + for (f = f->next; f->next != orighead; f = f->next);
74 + f->next = NULL;
75 + }
76 +}
77 +
78 +enum SgrFlags {
79 + REVERSE = 1 << 0,
80 + UNDERLINE = 1 << 1,
81 + STRIKETHROUGH = 1 << 2,
82 + OVERLINE = 1 << 3
83 +};
84 +
85 void
86 drawbar(Monitor *m)
87 {
88 @@ -707,9 +727,160 @@ drawbar(Monitor *m)
89
90 /* draw status first so it can be overdrawn by tags later */
91 if (m == selmon) { /* status is only drawn on selected monitor */
92 + char buffer[sizeof(stext)];
93 + Clr scm[3];
94 + int wr, rd;
95 + int pw;
96 + int fg = 7;
97 + int bg = 0;
98 + int fmt = 0;
99 + int lp = lrpad / 2 - 2;
100 + Fnt *fset = drw->fonts;
101 +
102 + memcpy(scm, scheme[SchemeNorm], sizeof(scm));
103 +
104 + drw_setscheme(drw, scm);
105 +
106 + for (tw = 0, wr = 0, rd = 0; stext[rd]; rd++) {
107 + if (stext[rd] == '' && stext[rd + 1] == '[') {
108 + size_t alen = strspn(stext + rd + 2,
109 + "0123456789;");
110 + if (stext[rd + alen + 2] == 'm') {
111 + buffer[wr] = '\0';
112 + tw += TEXTW(buffer) - lrpad;
113 + wr = 0;
114 +
115 + char *ep = stext + rd + 1;
116 + while (*ep != 'm') {
117 + unsigned v = strtoul(ep + 1, &ep, 10);
118 + if (v == 0 || (v >= 10 && v <= 19)) {
119 + int fi = v % 10;
120 + Fnt *f;
121 + Fnt *p;
122 + resetfntlist(fset, drw->fonts);
123 + for (p = NULL, f = fset; f && fi--; p = f, f = f->next);
124 + if (f) {
125 + if (p) {
126 + p->next = NULL;
127 + for (p = f; p->next; p = p->next);
128 + p->next = fset;
129 + }
130 + drw_setfontset(drw, f);
131 + } else {
132 + drw_setfontset(drw, fset);
133 + }
134 + }
135 + }
136 +
137 + rd += alen + 2;
138 + continue;
139 + }
140 + }
141 + buffer[wr++] = stext[rd];
142 + }
143 + buffer[wr] = '\0';
144 +
145 + tw += TEXTW(buffer) - lrpad / 2 + 2;
146 + x = m->ww - tw;
147 +
148 + resetfntlist(fset, drw->fonts);
149 + drw_setfontset(drw, fset);
150 +
151 + for (wr = 0, rd = 0; stext[rd]; rd++) {
152 + if (stext[rd] == '' && stext[rd + 1] == '[') {
153 + size_t alen = strspn(stext + rd + 2,
154 + "0123456789;");
155 + if (stext[rd + alen + 2] == 'm') {
156 + buffer[wr] = '\0';
157 + pw = TEXTW(buffer) - lrpad;
158 + drw_text(drw, x, 0, pw + lp, bh, lp, buffer, fmt & REVERSE);
159 + if (fmt & UNDERLINE)
160 + drw_rect(drw, x, (bh + drw->fonts->h) / 2, pw, 1, 1, fmt & REVERSE);
161 + if (fmt & STRIKETHROUGH)
162 + drw_rect(drw, x, bh / 2, pw, 1, 1, fmt & REVERSE);
163 + if (fmt & OVERLINE)
164 + drw_rect(drw, x, (bh - drw->fonts->h) / 2, pw, 1, 1, fmt & REVERSE);
165 + x += pw + lp;
166 + lp = 0;
167 +
168 + char *ep = stext + rd + 1;
169 + while (*ep != 'm') {
170 + unsigned v = strtoul(ep + 1, &ep, 10);
171 + if (v == 0) {
172 + memcpy(scm, scheme[SchemeNorm], sizeof(scm));
173 + fg = 7;
174 + bg = 0;
175 + fmt = 0;
176 + resetfntlist(fset, drw->fonts);
177 + drw_setfontset(drw, fset);
178 + } else if (v == 1) {
179 + fg |= 8;
180 + scm[0] = barclrs[fg];
181 + } else if (v == 4) {
182 + fmt |= UNDERLINE;
183 + } else if (v == 7) {
184 + fmt |= REVERSE;
185 + } else if (v == 9) {
186 + fmt |= STRIKETHROUGH;
187 + } else if (v >= 10 && v <= 19) {
188 + int fi = v % 10;
189 + Fnt *f;
190 + Fnt *p;
191 + resetfntlist(fset, drw->fonts);
192 + for (p = NULL, f = fset; f && fi--; p = f, f = f->next);
193 + if (f) {
194 + if (p) {
195 + p->next = NULL;
196 + for (p = f; p->next; p = p->next);
197 + p->next = fset;
198 + }
199 + drw_setfontset(drw, f);
200 + } else {
201 + drw_setfontset(drw, fset);
202 + }
203 + } else if (v == 22) {
204 + fg &= ~8;
205 + scm[0] = barclrs[fg];
206 + } else if (v == 24) {
207 + fmt &= ~UNDERLINE;
208 + } else if (v == 27) {
209 + fmt &= ~REVERSE;
210 + } else if (v == 29) {
211 + fmt &= ~STRIKETHROUGH;
212 + } else if (v >= 30 && v <= 37) {
213 + fg = v % 10 | (fg & 8);
214 + scm[0] = barclrs[fg];
215 + } else if (v >= 40 && v <= 47) {
216 + bg = v % 10;
217 + scm[1] = barclrs[bg];
218 + } else if (v == 53) {
219 + fmt |= OVERLINE;
220 + } else if (v == 55) {
221 + fmt &= ~OVERLINE;
222 + }
223 + }
224 +
225 + rd += alen + 2;
226 + wr = 0;
227 +
228 + drw_setscheme(drw, scm);
229 + continue;
230 + }
231 + }
232 + buffer[wr++] = stext[rd];
233 + }
234 +
235 + buffer[wr] = '\0';
236 + pw = TEXTW(buffer) - lrpad;
237 + drw_text(drw, x, 0, pw + lp, bh, lp, buffer, fmt & REVERSE);
238 + if (fmt & UNDERLINE)
239 + drw_rect(drw, x, (bh + drw->fonts->h) / 2, pw, 1, 1, fmt & REVERSE);
240 + if (fmt & STRIKETHROUGH)
241 + drw_rect(drw, x, bh / 2, pw, 1, 1, fmt & REVERSE);
242 + if (fmt & OVERLINE)
243 + drw_rect(drw, x, (bh - drw->fonts->h) / 2, pw, 1, 1, fmt & REVERSE);
244 +
245 drw_setscheme(drw, scheme[SchemeNorm]);
246 - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
247 - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
248 }
249
250 for (c = m->clients; c; c = c->next) {
251 @@ -1574,6 +1745,11 @@ setup(void)
252 scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
253 for (i = 0; i < LENGTH(colors); i++)
254 scheme[i] = drw_scm_create(drw, colors[i], 3);
255 +
256 + barclrs = ecalloc(LENGTH(barcolors), sizeof(Clr));
257 + for (i = 0; i < LENGTH(barcolors); i++)
258 + drw_clr_create(drw, &barclrs[i], barcolors[i]);
259 +
260 /* init bars */
261 updatebars();
262 updatestatus();
263 --
264 2.32.0
265