dwm-onlyquitonempty-20201204-61bb8b2.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-onlyquitonempty-20201204-61bb8b2.diff (2419B)
       ---
            1 From f00572701a18f17650f193a708f419814c87f408 Mon Sep 17 00:00:00 2001
            2 From: thatlittlegit <personal@thatlittlegit.tk>
            3 Date: Fri, 19 Jun 2020 22:04:25 -0400
            4 Subject: [PATCH] Don't quit unless all windows are closed
            5 
            6 This patch is the second version. Changes:
            7 
            8   * add an override via Ctrl-Mod-Shift-Q
            9   * remove a useless malloc(3) call
           10 
           11 The w1, w2, and children variables unfortunately don't seem removable,
           12 since XQueryTree would segfault.
           13 ---
           14  config.def.h |  8 +++++++-
           15  dwm.c        | 17 +++++++++++++++++
           16  2 files changed, 24 insertions(+), 1 deletion(-)
           17 
           18 diff --git a/config.def.h b/config.def.h
           19 index 1c0b587..c7b8e16 100644
           20 --- a/config.def.h
           21 +++ b/config.def.h
           22 @@ -93,7 +93,8 @@ static Key keys[] = {
           23          TAGKEYS(                        XK_7,                      6)
           24          TAGKEYS(                        XK_8,                      7)
           25          TAGKEYS(                        XK_9,                      8)
           26 -        { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
           27 +        { MODKEY|ShiftMask,             XK_q,      try_quit,       {0} },
           28 +        { MODKEY|ShiftMask|ControlMask, XK_q,      quit,           {0} },
           29  };
           30  
           31  /* button definitions */
           32 @@ -113,3 +114,8 @@ static Button buttons[] = {
           33          { ClkTagBar,            MODKEY,         Button3,        toggletag,      {0} },
           34  };
           35  
           36 +/* how many windows should be open when quitting? */
           37 +/* on a stock dwm install, this seems to be two; however, you'll have to
           38 + * change it depending on how many invisible X windows exist */
           39 +/* you can get a list with `xwininfo -tree -root`. */
           40 +static const int EMPTY_WINDOW_COUNT = 2;
           41 diff --git a/dwm.c b/dwm.c
           42 index 664c527..85ee948 100644
           43 --- a/dwm.c
           44 +++ b/dwm.c
           45 @@ -214,6 +214,7 @@ static void togglebar(const Arg *arg);
           46  static void togglefloating(const Arg *arg);
           47  static void toggletag(const Arg *arg);
           48  static void toggleview(const Arg *arg);
           49 +static void try_quit(const Arg *arg);
           50  static void unfocus(Client *c, int setfocus);
           51  static void unmanage(Client *c, int destroyed);
           52  static void unmapnotify(XEvent *e);
           53 @@ -1749,6 +1750,22 @@ toggleview(const Arg *arg)
           54          }
           55  }
           56  
           57 +void
           58 +try_quit(const Arg *arg)
           59 +{
           60 +        unsigned int n;
           61 +        Window w1, w2, *children = NULL;
           62 +        XQueryTree(dpy, root, &w1, &w2, &children, &n);
           63 +
           64 +        if (children != NULL)
           65 +                XFree(children);
           66 +
           67 +        if (n == EMPTY_WINDOW_COUNT)
           68 +                running = 0;
           69 +        else
           70 +                printf("[dwm] try_quit condition failed (n=%d)\n", n);
           71 +}
           72 +
           73  void
           74  unfocus(Client *c, int setfocus)
           75  {
           76 -- 
           77 2.20.1
           78