myvxwm

[fork] my vxwm config (optimised for my T480)
git clone https://git.lukeonline.net/repos/myvxwm
Log | Files | Refs | README | LICENSE

commit 253795024119d8c5cf4dcee9305b036d80cd5c7b
parent 80cf33e95d40d867c24b52038c5e1e81f7438012
Author: wh1tepearl <wh1tepearl@gmail.com>
Date:   Sun, 29 Mar 2026 16:59:35 +0100

fix for external_bars module

Diffstat:
Mmodules/externalbars/externalbars.c | 25++++++++++++++++++++++---
Mmodules/externalbars/externalbars.h | 2++
Mvxwm.c | 57+++++++++++++++++++++++++++++++++++----------------------
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