dwm-status2d-extrabar-6.2.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-status2d-extrabar-6.2.diff (9655B)
---
1 From e741941428f60f2d8c8d1125c965dec4cfc2d1ba Mon Sep 17 00:00:00 2001
2 From: klassiker <suckless@lupia.eu>
3 Date: Tue, 14 Jul 2020 15:23:06 +0200
4 Subject: [PATCH] status2d patched with the extrabar patch for dwm 6.2
5
6 ---
7 config.def.h | 2 +-
8 dwm.c | 188 +++++++++++++++++++++++++++++++++++++++++++++------
9 2 files changed, 169 insertions(+), 21 deletions(-)
10
11 diff --git a/config.def.h b/config.def.h
12 index 1c0b587..8ce3e96 100644
13 --- a/config.def.h
14 +++ b/config.def.h
15 @@ -5,6 +5,7 @@ static const unsigned int borderpx = 1; /* border pixel of windows */
16 static const unsigned int snap = 32; /* snap pixel */
17 static const int showbar = 1; /* 0 means no bar */
18 static const int topbar = 1; /* 0 means bottom bar */
19 +static const char statussep = ';'; /* separator between status bars */
20 static const char *fonts[] = { "monospace:size=10" };
21 static const char dmenufont[] = "monospace:size=10";
22 static const char col_gray1[] = "#222222";
23 @@ -112,4 +113,3 @@ static Button buttons[] = {
24 { ClkTagBar, MODKEY, Button1, tag, {0} },
25 { ClkTagBar, MODKEY, Button3, toggletag, {0} },
26 };
27 -
28 diff --git a/dwm.c b/dwm.c
29 index 4465af1..f3c97c4 100644
30 --- a/dwm.c
31 +++ b/dwm.c
32 @@ -117,6 +117,7 @@ struct Monitor {
33 int nmaster;
34 int num;
35 int by; /* bar geometry */
36 + int eby; /* extra bar geometry */
37 int mx, my, mw, mh; /* screen size */
38 int wx, wy, ww, wh; /* window area */
39 unsigned int seltags;
40 @@ -129,6 +130,7 @@ struct Monitor {
41 Client *stack;
42 Monitor *next;
43 Window barwin;
44 + Window extrabarwin;
45 const Layout *lt[2];
46 };
47
48 @@ -163,6 +165,7 @@ static void detachstack(Client *c);
49 static Monitor *dirtomon(int dir);
50 static void drawbar(Monitor *m);
51 static void drawbars(void);
52 +static int drawstatusbar(Monitor *m, int bh, int extra, char* text);
53 static void enternotify(XEvent *e);
54 static void expose(XEvent *e);
55 static void focus(Client *c);
56 @@ -236,7 +239,8 @@ static void zoom(const Arg *arg);
57
58 /* variables */
59 static const char broken[] = "broken";
60 -static char stext[256];
61 +static char stext[1024];
62 +static char estext[1024];
63 static int screen;
64 static int sw, sh; /* X display screen geometry width, height */
65 static int bh, blw = 0; /* bar geometry */
66 @@ -484,7 +488,7 @@ cleanup(void)
67 cleanupmon(mons);
68 for (i = 0; i < CurLast; i++)
69 drw_cur_free(drw, cursor[i]);
70 - for (i = 0; i < LENGTH(colors); i++)
71 + for (i = 0; i < LENGTH(colors) + 1; i++)
72 free(scheme[i]);
73 XDestroyWindow(dpy, wmcheckwin);
74 drw_free(drw);
75 @@ -505,7 +509,9 @@ cleanupmon(Monitor *mon)
76 m->next = mon->next;
77 }
78 XUnmapWindow(dpy, mon->barwin);
79 + XUnmapWindow(dpy, mon->extrabarwin);
80 XDestroyWindow(dpy, mon->barwin);
81 + XDestroyWindow(dpy, mon->extrabarwin);
82 free(mon);
83 }
84
85 @@ -568,6 +574,7 @@ configurenotify(XEvent *e)
86 if (c->isfullscreen)
87 resizeclient(c, m->mx, m->my, m->mw, m->mh);
88 XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
89 + XMoveResizeWindow(dpy, m->extrabarwin, m->wx, m->eby, m->ww, bh);
90 }
91 focus(NULL);
92 arrange(NULL);
93 @@ -692,6 +699,119 @@ dirtomon(int dir)
94 return m;
95 }
96
97 +int
98 +drawstatusbar(Monitor *m, int bh, int extra, char* stext) {
99 + int ret, i, w, x, len;
100 + short isCode = 0;
101 + char *text;
102 + char *p;
103 +
104 + len = strlen(stext) + 1 ;
105 + if (!(text = (char*) malloc(sizeof(char)*len)))
106 + die("malloc");
107 + p = text;
108 + memcpy(text, stext, len);
109 +
110 + /* compute width of the status text */
111 + w = 0;
112 + i = -1;
113 + while (text[++i]) {
114 + if (text[i] == '^') {
115 + if (!isCode) {
116 + isCode = 1;
117 + text[i] = '\0';
118 + w += TEXTW(text) - lrpad;
119 + text[i] = '^';
120 + if (text[++i] == 'f')
121 + w += atoi(text + ++i);
122 + } else {
123 + isCode = 0;
124 + text = text + i + 1;
125 + i = -1;
126 + }
127 + }
128 + }
129 + if (!isCode)
130 + w += TEXTW(text) - lrpad;
131 + else
132 + isCode = 0;
133 + text = p;
134 +
135 + if (extra) {
136 + w = m->ww;
137 + ret = x = 1;
138 + } else {
139 + w += 2; /* 1px padding on both sides */
140 + ret = x = m->ww - w;
141 + }
142 +
143 + drw_setscheme(drw, scheme[LENGTH(colors)]);
144 + drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
145 + drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
146 + drw_rect(drw, x, 0, w, bh, 1, 1);
147 + x++;
148 +
149 + /* process status text */
150 + i = -1;
151 + while (text[++i]) {
152 + if (text[i] == '^' && !isCode) {
153 + isCode = 1;
154 +
155 + text[i] = '\0';
156 + w = TEXTW(text) - lrpad;
157 + drw_text(drw, x, 0, w, bh, 0, text, 0);
158 +
159 + x += w;
160 +
161 + /* process code */
162 + while (text[++i] != '^') {
163 + if (text[i] == 'c') {
164 + char buf[8];
165 + memcpy(buf, (char*)text+i+1, 7);
166 + buf[7] = '\0';
167 + drw_clr_create(drw, &drw->scheme[ColFg], buf);
168 + i += 7;
169 + } else if (text[i] == 'b') {
170 + char buf[8];
171 + memcpy(buf, (char*)text+i+1, 7);
172 + buf[7] = '\0';
173 + drw_clr_create(drw, &drw->scheme[ColBg], buf);
174 + i += 7;
175 + } else if (text[i] == 'd') {
176 + drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
177 + drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
178 + } else if (text[i] == 'r') {
179 + int rx = atoi(text + ++i);
180 + while (text[++i] != ',');
181 + int ry = atoi(text + ++i);
182 + while (text[++i] != ',');
183 + int rw = atoi(text + ++i);
184 + while (text[++i] != ',');
185 + int rh = atoi(text + ++i);
186 +
187 + drw_rect(drw, rx + x, ry, rw, rh, 1, 0);
188 + } else if (text[i] == 'f') {
189 + x += atoi(text + ++i);
190 + }
191 + }
192 +
193 + text = text + i + 1;
194 + i=-1;
195 + isCode = 0;
196 + }
197 + }
198 +
199 + if (!isCode) {
200 + w = TEXTW(text) - lrpad;
201 + drw_text(drw, x, 0, w, bh, 0, text, 0);
202 + }
203 +
204 + drw_setscheme(drw, scheme[SchemeNorm]);
205 + free(p);
206 +
207 + return ret;
208 +}
209 +
210 void
211 drawbar(Monitor *m)
212 {
213 @@ -703,9 +823,7 @@ drawbar(Monitor *m)
214
215 /* draw status first so it can be overdrawn by tags later */
216 if (m == selmon) { /* status is only drawn on selected monitor */
217 - drw_setscheme(drw, scheme[SchemeNorm]);
218 - sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
219 - drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0);
220 + sw = m->ww - drawstatusbar(m, bh, 0, stext);
221 }
222
223 for (c = m->clients; c; c = c->next) {
224 @@ -740,6 +858,11 @@ drawbar(Monitor *m)
225 }
226 }
227 drw_map(drw, m->barwin, 0, 0, m->ww, bh);
228 +
229 + if (m == selmon) { /* extra status is only drawn on selected monitor */
230 + sw = drawstatusbar(m, bh, 1, estext);
231 + drw_map(drw, m->extrabarwin, 0, 0, m->ww, bh);
232 + }
233 }
234
235 void
236 @@ -1567,7 +1690,8 @@ setup(void)
237 cursor[CurResize] = drw_cur_create(drw, XC_sizing);
238 cursor[CurMove] = drw_cur_create(drw, XC_fleur);
239 /* init appearance */
240 - scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
241 + scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *));
242 + scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3);
243 for (i = 0; i < LENGTH(colors); i++)
244 scheme[i] = drw_scm_create(drw, colors[i], 3);
245 /* init bars */
246 @@ -1702,6 +1826,7 @@ togglebar(const Arg *arg)
247 selmon->showbar = !selmon->showbar;
248 updatebarpos(selmon);
249 XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
250 + XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx, selmon->eby, selmon->ww, bh);
251 arrange(selmon);
252 }
253
254 @@ -1809,14 +1934,22 @@ updatebars(void)
255 };
256 XClassHint ch = {"dwm", "dwm"};
257 for (m = mons; m; m = m->next) {
258 - if (m->barwin)
259 - continue;
260 - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
261 - CopyFromParent, DefaultVisual(dpy, screen),
262 - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
263 - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
264 - XMapRaised(dpy, m->barwin);
265 - XSetClassHint(dpy, m->barwin, &ch);
266 + if (!m->barwin) {
267 + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
268 + CopyFromParent, DefaultVisual(dpy, screen),
269 + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
270 + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
271 + XMapRaised(dpy, m->barwin);
272 + XSetClassHint(dpy, m->barwin, &ch);
273 + }
274 + if (!m->extrabarwin) {
275 + m->extrabarwin = XCreateWindow(dpy, root, m->wx, m->eby, m->ww, bh, 0, DefaultDepth(dpy, screen),
276 + CopyFromParent, DefaultVisual(dpy, screen),
277 + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
278 + XDefineCursor(dpy, m->extrabarwin, cursor[CurNormal]->cursor);
279 + XMapRaised(dpy, m->extrabarwin);
280 + XSetClassHint(dpy, m->extrabarwin, &ch);
281 + }
282 }
283 }
284
285 @@ -1825,12 +1958,15 @@ updatebarpos(Monitor *m)
286 {
287 m->wy = m->my;
288 m->wh = m->mh;
289 + m->wh -= bh * m->showbar * 2;
290 + m->wy = m->showbar ? m->wy + bh : m->wy;
291 if (m->showbar) {
292 - m->wh -= bh;
293 - m->by = m->topbar ? m->wy : m->wy + m->wh;
294 - m->wy = m->topbar ? m->wy + bh : m->wy;
295 - } else
296 + m->by = m->topbar ? m->wy - bh : m->wy + m->wh;
297 + m->eby = m->topbar ? m->wy + m->wh : m->wy - bh;
298 + } else {
299 m->by = -bh;
300 + m->eby = -bh;
301 + }
302 }
303
304 void
305 @@ -1987,8 +2123,20 @@ updatesizehints(Client *c)
306 void
307 updatestatus(void)
308 {
309 - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
310 + char text[2048];
311 + if (!gettextprop(root, XA_WM_NAME, text, sizeof(text))) {
312 strcpy(stext, "dwm-"VERSION);
313 + estext[0] = '\0';
314 + } else {
315 + char *e = strchr(text, statussep);
316 + if (e) {
317 + *e = '\0'; e++;
318 + strncpy(estext, e, sizeof(estext) - 1);
319 + } else {
320 + estext[0] = '\0';
321 + }
322 + strncpy(stext, text, sizeof(stext) - 1);
323 + }
324 drawbar(selmon);
325 }
326
327 @@ -2067,7 +2215,7 @@ wintomon(Window w)
328 if (w == root && getrootptr(&x, &y))
329 return recttomon(x, y, 1, 1);
330 for (m = mons; m; m = m->next)
331 - if (w == m->barwin)
332 + if (w == m->barwin || w == m->extrabarwin)
333 return m;
334 if ((c = wintoclient(w)))
335 return c->mon;
336 --
337 2.27.0
338