onlyquitonempty: refactoring patch to only take client windows into

consideration when deciding whether or not to allow dwm to quit

As per the original patch
https://dwm.suckless.org/patches/onlyquitonempty/

it used XQueryTree to get a count of the number of windows open to
determine whether to allow the window manager to exit.

This meant that the empty quit count variable would have to take
into account background windows such as the bar, which has side
effects like plugging in another monitor could mean that you would
not longer be allowed to quit dwm until the monitor is removed.

Likewise a systray and each systray icon would give a +1 to the
number of windows in the system.

This is unintuitive to understand and convoluted to explain, hence
the refactoring here to use the more sane approach of only counting
the number of client windows that the window manager manages.

This is an old idea which was intentionally not added to
dwm-flexipatch due to the aim of staying true to the original patch
(as in if you were to patch that manually you would get the same
experience as you had when trying the patch out in dwm-flexipatch).

This is ref. discussion in #194.
This commit is contained in:
bakkeby
2021-10-31 13:45:18 +01:00
parent ec6a64a64f
commit 67fc80803d
2 changed files with 15 additions and 19 deletions

32
dwm.c
View File

@ -2744,27 +2744,23 @@ quit(const Arg *arg)
#if COOL_AUTOSTART_PATCH
size_t i;
#endif // COOL_AUTOSTART_PATCH
#if ONLYQUITONEMPTY_PATCH
unsigned int n;
Window *junk = malloc(1);
XQueryTree(dpy, root, junk, junk, &junk, &n);
if (n <= quit_empty_window_count)
{
#if RESTARTSIG_PATCH
restart = arg->i;
#endif // RESTARTSIG_PATCH
running = 0;
}
else
printf("[dwm] not exiting (n=%d)\n", n);
free(junk);
#else // !ONLYQUITONEMPTY_PATCH
#if RESTARTSIG_PATCH
restart = arg->i;
#endif // RESTARTSIG_PATCH
#if ONLYQUITONEMPTY_PATCH
Monitor *m;
Client *c;
unsigned int n = 0;
for (m = mons; m; m = m->next)
for (c = m->clients; c; c = c->next, n++);
if (restart || n <= quit_empty_window_count)
running = 0;
else
fprintf(stderr, "[dwm] not exiting (n=%d)\n", n);
#else // !ONLYQUITONEMPTY_PATCH
running = 0;
#endif // ONLYQUITONEMPTY_PATCH