dwm-sgrstatus-20220223-6.3.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-sgrstatus-20220223-6.3.diff (6857B) | |
--- | |
1 From dc83e43aad7b8070911e8210b58cc36bdc4214d5 Mon Sep 17 00:00:00 2001 | |
2 From: Santtu Lakkala <[email protected]> | |
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", "… | |
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… | |
118 + if (v == 0 || (v >= 10 … | |
119 + int fi = v % 10; | |
120 + Fnt *f; | |
121 + Fnt *p; | |
122 + resetfntlist(fs… | |
123 + for (p = NULL, … | |
124 + if (f) { | |
125 + if (p) { | |
126 + … | |
127 + … | |
128 + … | |
129 + } | |
130 + drw_set… | |
131 + } else { | |
132 + drw_set… | |
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… | |
159 + if (fmt & UNDERLINE) | |
160 + drw_rect(drw, x, (bh + … | |
161 + if (fmt & STRIKETHROUGH) | |
162 + drw_rect(drw, x, bh / 2… | |
163 + if (fmt & OVERLINE) | |
164 + drw_rect(drw, x, (bh - … | |
165 + x += pw + lp; | |
166 + lp = 0; | |
167 + | |
168 + char *ep = stext + rd + 1; | |
169 + while (*ep != 'm') { | |
170 + unsigned v = strtoul(ep… | |
171 + if (v == 0) { | |
172 + memcpy(scm, sch… | |
173 + fg = 7; | |
174 + bg = 0; | |
175 + fmt = 0; | |
176 + resetfntlist(fs… | |
177 + drw_setfontset(… | |
178 + } else if (v == 1) { | |
179 + fg |= 8; | |
180 + scm[0] = barclr… | |
181 + } else if (v == 4) { | |
182 + fmt |= UNDERLIN… | |
183 + } else if (v == 7) { | |
184 + fmt |= REVERSE; | |
185 + } else if (v == 9) { | |
186 + fmt |= STRIKETH… | |
187 + } else if (v >= 10 && v… | |
188 + int fi = v % 10; | |
189 + Fnt *f; | |
190 + Fnt *p; | |
191 + resetfntlist(fs… | |
192 + for (p = NULL, … | |
193 + if (f) { | |
194 + if (p) { | |
195 + … | |
196 + … | |
197 + … | |
198 + } | |
199 + drw_set… | |
200 + } else { | |
201 + drw_set… | |
202 + } | |
203 + } else if (v == 22) { | |
204 + fg &= ~8; | |
205 + scm[0] = barclr… | |
206 + } else if (v == 24) { | |
207 + fmt &= ~UNDERLI… | |
208 + } else if (v == 27) { | |
209 + fmt &= ~REVERSE; | |
210 + } else if (v == 29) { | |
211 + fmt &= ~STRIKET… | |
212 + } else if (v >= 30 && v… | |
213 + fg = v % 10 | (… | |
214 + scm[0] = barclr… | |
215 + } else if (v >= 40 && v… | |
216 + bg = v % 10; | |
217 + scm[1] = barclr… | |
218 + } else if (v == 53) { | |
219 + fmt |= OVERLINE; | |
220 + } else if (v == 55) { | |
221 + fmt &= ~OVERLIN… | |
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 & REVE… | |
238 + if (fmt & UNDERLINE) | |
239 + drw_rect(drw, x, (bh + drw->fonts->h) / 2, pw, … | |
240 + if (fmt & STRIKETHROUGH) | |
241 + drw_rect(drw, x, bh / 2, pw, 1, 1, fmt & REVERS… | |
242 + if (fmt & OVERLINE) | |
243 + drw_rect(drw, x, (bh - drw->fonts->h) / 2, pw, … | |
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 |