commit 253795024119d8c5cf4dcee9305b036d80cd5c7b
parent 80cf33e95d40d867c24b52038c5e1e81f7438012
Author: wh1tepearl <wh1tepearl@gmail.com>
Date: Sun, 29 Mar 2026 16:59:35 +0100
fix for external_bars module
Diffstat:
3 files changed, 59 insertions(+), 25 deletions(-)
diff --git a/modules/externalbars/externalbars.c b/modules/externalbars/externalbars.c
@@ -1,6 +1,7 @@
static ExternalBarStrut *ebarstruts = NULL;
static Atom eb_atom_strut = None;
static Atom eb_atom_strut_partial = None;
+static int eb_scanning = 0;
void
externalbars_init_atoms(void)
@@ -23,6 +24,7 @@ externalbars_read(Window w, ExternalBarStrut *out)
memset(out, 0, sizeof *out);
out->win = w;
+ /* Prefer _NET_WM_STRUT_PARTIAL (12 longs) */
if (XGetWindowProperty(dpy, w, eb_atom_strut_partial, 0L, 12L, False,
XA_CARDINAL, &real, &fmt, &n, &extra, &p) == Success && p) {
if (n >= 4) {
@@ -50,6 +52,7 @@ externalbars_read(Window w, ExternalBarStrut *out)
p = NULL;
}
+ /* Fallback: plain _NET_WM_STRUT (4 longs) */
if (XGetWindowProperty(dpy, w, eb_atom_strut, 0L, 4L, False,
XA_CARDINAL, &real, &fmt, &n, &extra, &p) == Success && p) {
if (n >= 4) {
@@ -79,6 +82,19 @@ externalbars_hasstrut(Window w)
}
void
+externalbars_begin_scan(void)
+{
+ eb_scanning = 1;
+}
+
+void
+externalbars_end_scan(void)
+{
+ eb_scanning = 0;
+ externalbars_reapply_all();
+}
+
+void
externalbars_register(Window w)
{
ExternalBarStrut tmp, *sw;
@@ -91,7 +107,8 @@ externalbars_register(Window w)
ExternalBarStrut *nxt = sw->next;
*sw = tmp;
sw->next = nxt;
- externalbars_reapply_all();
+ if (!eb_scanning)
+ externalbars_reapply_all();
return;
}
}
@@ -100,7 +117,8 @@ externalbars_register(Window w)
*sw = tmp;
sw->next = ebarstruts;
ebarstruts = sw;
- externalbars_reapply_all();
+ if (!eb_scanning)
+ externalbars_reapply_all();
}
void
@@ -112,7 +130,8 @@ externalbars_unregister(Window w)
if (sw->win == w) {
*prev = sw->next;
free(sw);
- externalbars_reapply_all();
+ if (!eb_scanning)
+ externalbars_reapply_all();
return;
}
prev = &sw->next;
diff --git a/modules/externalbars/externalbars.h b/modules/externalbars/externalbars.h
@@ -9,6 +9,8 @@ struct ExternalBarStrut {
ExternalBarStrut *next;
};
+static void externalbars_begin_scan(void);
+static void externalbars_end_scan(void);
static int externalbars_hasstrut(Window w);
static void externalbars_register(Window w);
static void externalbars_unregister(Window w);
diff --git a/vxwm.c b/vxwm.c
@@ -1797,28 +1797,41 @@ run(void)
void
scan(void)
{
- unsigned int i, num;
- Window d1, d2, *wins = NULL;
- XWindowAttributes wa;
-
- if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
- for (i = 0; i < num; i++) {
- if (!XGetWindowAttributes(dpy, wins[i], &wa)
- || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
- continue;
- if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)
- manage(wins[i], &wa);
- }
- for (i = 0; i < num; i++) { /* now the transients */
- if (!XGetWindowAttributes(dpy, wins[i], &wa))
- continue;
- if (XGetTransientForHint(dpy, wins[i], &d1)
- && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState))
- manage(wins[i], &wa);
- }
- if (wins)
- XFree(wins);
- }
+ unsigned int i, num;
+ Window d1, d2, *wins = NULL;
+ XWindowAttributes wa;
+
+#if EXTERNAL_BARS
+ externalbars_begin_scan();
+#endif
+ if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
+ for (i = 0; i < num; i++) {
+ if (!XGetWindowAttributes(dpy, wins[i], &wa)
+ || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
+ continue;
+ if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) {
+#if EXTERNAL_BARS
+ if (externalbars_hasstrut(wins[i])) {
+ externalbars_register(wins[i]);
+ continue;
+ }
+#endif
+ manage(wins[i], &wa);
+ }
+ }
+ for (i = 0; i < num; i++) { /* now the transients */
+ if (!XGetWindowAttributes(dpy, wins[i], &wa))
+ continue;
+ if (XGetTransientForHint(dpy, wins[i], &d1)
+ && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState))
+ manage(wins[i], &wa);
+ }
+ if (wins)
+ XFree(wins);
+ }
+#if EXTERNAL_BARS
+ externalbars_end_scan();
+#endif
}
void