floatingstatus-20250408-cfb8627.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
floatingstatus-20250408-cfb8627.diff (10006B)
---
1 From 74a90e7f249961c6d5d8f430a404d70628d6e3ea Mon Sep 17 00:00:00 2001
2 From: uint23 <abhinav.prsai@gmail.com>
3 Date: Tue, 8 Apr 2025 17:33:20 +0100
4 Subject: [PATCH] floating status bar patch
5
6 ---
7 config.def.h | 6 ++
8 dwm.c | 182 ++++++++++++++++++++++++++++-----------------------
9 2 files changed, 106 insertions(+), 82 deletions(-)
10
11 diff --git a/config.def.h b/config.def.h
12 index 9efa774..4febd22 100644
13 --- a/config.def.h
14 +++ b/config.def.h
15 @@ -2,6 +2,11 @@
16
17 /* appearance */
18 static const unsigned int borderpx = 1; /* border pixel of windows */
19 +static const unsigned int barpadv = 10; /* bar vertical padding (from top)*/
20 +static const unsigned int barpadh = 200; /* bar vertical padding (from top)*/
21 +static const unsigned int barheight = 2; /* bar vertical padding (from top)*/
22 +static const unsigned int barborder = 2; /* bar vertical padding (from top)*/
23 +static const unsigned int floatbar = 1; /* 0 means bar won't float; float or dock the bar */
24 static const unsigned int snap = 32; /* snap pixel */
25 static const int showbar = 1; /* 0 means no bar */
26 static const int topbar = 1; /* 0 means bottom bar */
27 @@ -16,6 +21,7 @@ static const char *colors[][3] = {
28 /* fg bg border */
29 [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
30 [SchemeSel] = { col_gray4, col_cyan, col_cyan },
31 + [SchemeBar] = { NULL, NULL, col_cyan },
32 };
33
34 /* tagging */
35 diff --git a/dwm.c b/dwm.c
36 index 1443802..10fa1e8 100644
37 --- a/dwm.c
38 +++ b/dwm.c
39 @@ -58,7 +58,7 @@
40
41 /* enums */
42 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
43 -enum { SchemeNorm, SchemeSel }; /* color schemes */
44 +enum { SchemeNorm, SchemeSel, SchemeBar }; /* color schemes */
45 enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
46 NetWMFullscreen, NetActiveWindow, NetWMWindowType,
47 NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
48 @@ -338,10 +338,10 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
49 if (*y + *h + 2 * c->bw <= m->wy)
50 *y = m->wy;
51 }
52 - if (*h < bh)
53 - *h = bh;
54 - if (*w < bh)
55 - *w = bh;
56 + if (*h < bh + barheight)
57 + *h = bh + barheight;
58 + if (*w < bh + barheight)
59 + *w = bh + barheight;
60 if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) {
61 if (!c->hintsvalid)
62 updatesizehints(c);
63 @@ -563,13 +563,13 @@ configurenotify(XEvent *e)
64 sw = ev->width;
65 sh = ev->height;
66 if (updategeom() || dirty) {
67 - drw_resize(drw, sw, bh);
68 + drw_resize(drw, sw, bh + barheight);
69 updatebars();
70 for (m = mons; m; m = m->next) {
71 for (c = m->clients; c; c = c->next)
72 if (c->isfullscreen)
73 resizeclient(c, m->mx, m->my, m->mw, m->mh);
74 - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
75 + XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh + barheight);
76 }
77 focus(NULL);
78 arrange(NULL);
79 @@ -697,54 +697,57 @@ dirtomon(int dir)
80 void
81 drawbar(Monitor *m)
82 {
83 - int x, w, tw = 0;
84 - int boxs = drw->fonts->h / 9;
85 - int boxw = drw->fonts->h / 6 + 2;
86 - unsigned int i, occ = 0, urg = 0;
87 - Client *c;
88 -
89 - if (!m->showbar)
90 - return;
91 -
92 - /* draw status first so it can be overdrawn by tags later */
93 - if (m == selmon) { /* status is only drawn on selected monitor */
94 - drw_setscheme(drw, scheme[SchemeNorm]);
95 - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
96 - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
97 - }
98 -
99 - for (c = m->clients; c; c = c->next) {
100 - occ |= c->tags;
101 - if (c->isurgent)
102 - urg |= c->tags;
103 - }
104 - x = 0;
105 - for (i = 0; i < LENGTH(tags); i++) {
106 - w = TEXTW(tags[i]);
107 - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
108 - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
109 - if (occ & 1 << i)
110 - drw_rect(drw, x + boxs, boxs, boxw, boxw,
111 - m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
112 - urg & 1 << i);
113 - x += w;
114 - }
115 - w = TEXTW(m->ltsymbol);
116 - drw_setscheme(drw, scheme[SchemeNorm]);
117 - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
118 -
119 - if ((w = m->ww - tw - x) > bh) {
120 - if (m->sel) {
121 - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
122 - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
123 - if (m->sel->isfloating)
124 - drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
125 - } else {
126 - drw_setscheme(drw, scheme[SchemeNorm]);
127 - drw_rect(drw, x, 0, w, bh, 1, 1);
128 - }
129 - }
130 - drw_map(drw, m->barwin, 0, 0, m->ww, bh);
131 + int x, w, tw = 0;
132 + int boxs = drw->fonts->h / 9;
133 + int boxw = drw->fonts->h / 6 + 2;
134 + unsigned int i, occ = 0, urg = 0;
135 + Client *c;
136 +
137 + // Calculate the actual bar width depending on if it's floating
138 + int barwidth = floatbar ? (m->ww - 2 * barpadh) : m->ww;
139 +
140 + if (!m->showbar)
141 + return;
142 +
143 + /* draw status first so it can be overdrawn by tags later */
144 + if (m == selmon) { /* status is only drawn on selected monitor */
145 + drw_setscheme(drw, scheme[SchemeNorm]);
146 + tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
147 + drw_text(drw, barwidth - tw, 0, tw, bh + barheight, 0, stext, 0);
148 + }
149 +
150 + for (c = m->clients; c; c = c->next) {
151 + occ |= c->tags;
152 + if (c->isurgent)
153 + urg |= c->tags;
154 + }
155 + x = 0;
156 + for (i = 0; i < LENGTH(tags); i++) {
157 + w = TEXTW(tags[i]);
158 + drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
159 + drw_text(drw, x, 0, w, bh + barheight, lrpad / 2, tags[i], urg & 1 << i);
160 + if (occ & 1 << i)
161 + drw_rect(drw, x + boxs, boxs, boxw, boxw,
162 + m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
163 + urg & 1 << i);
164 + x += w;
165 + }
166 + w = TEXTW(m->ltsymbol);
167 + drw_setscheme(drw, scheme[SchemeNorm]);
168 + x = drw_text(drw, x, 0, w, bh + barheight, lrpad / 2, m->ltsymbol, 0);
169 +
170 + if ((w = barwidth - tw - x) > bh + barheight) {
171 + if (m->sel) {
172 + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
173 + drw_text(drw, x, 0, w, bh + barheight, lrpad / 2, m->sel->name, 0);
174 + if (m->sel->isfloating)
175 + drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
176 + } else {
177 + drw_setscheme(drw, scheme[SchemeNorm]);
178 + drw_rect(drw, x, 0, w, bh + barheight, 1, 1);
179 + }
180 + }
181 + drw_map(drw, m->barwin, 0, 0, barwidth, bh + barheight);
182 }
183
184 void
185 @@ -1561,7 +1564,7 @@ setup(void)
186 if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
187 die("no fonts could be loaded.");
188 lrpad = drw->fonts->h;
189 - bh = drw->fonts->h + 2;
190 + bh = drw->fonts->h + 2 + barheight;
191 updategeom();
192 /* init atoms */
193 utf8string = XInternAtom(dpy, "UTF8_STRING", False);
194 @@ -1716,7 +1719,7 @@ togglebar(const Arg *arg)
195 {
196 selmon->showbar = !selmon->showbar;
197 updatebarpos(selmon);
198 - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
199 + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh + barheight);
200 arrange(selmon);
201 }
202
203 @@ -1817,36 +1820,51 @@ unmapnotify(XEvent *e)
204 void
205 updatebars(void)
206 {
207 - Monitor *m;
208 - XSetWindowAttributes wa = {
209 - .override_redirect = True,
210 - .background_pixmap = ParentRelative,
211 - .event_mask = ButtonPressMask|ExposureMask
212 - };
213 - XClassHint ch = {"dwm", "dwm"};
214 - for (m = mons; m; m = m->next) {
215 - if (m->barwin)
216 - continue;
217 - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
218 - CopyFromParent, DefaultVisual(dpy, screen),
219 - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
220 - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
221 - XMapRaised(dpy, m->barwin);
222 - XSetClassHint(dpy, m->barwin, &ch);
223 - }
224 + Monitor *m;
225 + XSetWindowAttributes wa = {
226 + .override_redirect = True,
227 + .background_pixmap = ParentRelative,
228 + .event_mask = ButtonPressMask|ExposureMask
229 + };
230 + XClassHint ch = {"dwm", "dwm"};
231 + for (m = mons; m; m = m->next) {
232 + if (m->barwin)
233 + continue;
234 + if (floatbar) {
235 + m->barwin = XCreateWindow(dpy, root, barpadh, barpadv, m->ww - 2 * barpadh, bh + barheight, 0, DefaultDepth(dpy, screen),
236 + CopyFromParent, DefaultVisual(dpy, screen),
237 + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
238 + XSetWindowBorder(dpy, m->barwin, scheme[SchemeBar][ColBorder].pixel);
239 + XSetWindowBorderWidth(dpy, m->barwin, barborder);
240 + } else {
241 + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh + barheight, 0, DefaultDepth(dpy, screen),
242 + CopyFromParent, DefaultVisual(dpy, screen),
243 + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
244 + }
245 + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
246 + XMapRaised(dpy, m->barwin);
247 + XSetClassHint(dpy, m->barwin, &ch);
248 + }
249 }
250
251 void
252 updatebarpos(Monitor *m)
253 {
254 - m->wy = m->my;
255 - m->wh = m->mh;
256 - if (m->showbar) {
257 - m->wh -= bh;
258 - m->by = m->topbar ? m->wy : m->wy + m->wh;
259 - m->wy = m->topbar ? m->wy + bh : m->wy;
260 - } else
261 - m->by = -bh;
262 + if (floatbar) {
263 + /* IF YOU ARE USING GAPS, PLEASE ADD BARBORDER TO THE END */
264 + m->wy = m->my + (barheight + bh + barpadv * 2 + barborder); /* Start window area below the bar */
265 + m->wh = m->mh - (barheight + bh + barpadv * 2 + barborder); /* Reduce window height to account for bar */
266 + m->by = barpadv; /* Position bar at vertical padding from top */
267 + } else {
268 + m->wy = m->my;
269 + m->wh = m->mh;
270 + if (m->showbar) {
271 + m->wh -= bh + barheight;
272 + m->by = m->topbar ? m->wy : m->wy + m->wh;
273 + m->wy = m->topbar ? m->wy + bh : m->wy;
274 + } else
275 + m->by = -bh + barheight;
276 + }
277 }
278
279 void
280 --
281 2.49.0
282