dwm-preserveonrestart-6.3.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-preserveonrestart-6.3.diff (4090B)
       ---
            1 From 713fa8650f5a20006451ebcccf57a4512e83bae8 Mon Sep 17 00:00:00 2001
            2 From: Arda Atci <arda@phytech.io>
            3 Date: Wed, 18 May 2022 17:23:16 +0300
            4 Subject: [PATCH] preserve clients on old tags when renewing dwm
            5 
            6 By default, when dwm is recompiled-restarted all clients will
            7 lose it's current tag and collapse to first tag. This patch preserves
            8 clients on old tags, however note that layout order is not preserved.
            9 
           10 ---
           11  dwm.c | 38 +++++++++++++++++++++++++++++++++++++-
           12  1 file changed, 37 insertions(+), 1 deletion(-)
           13 
           14 diff --git a/dwm.c b/dwm.c
           15 index a96f33c..a12e0bd 100644
           16 --- a/dwm.c
           17 +++ b/dwm.c
           18 @@ -62,7 +62,7 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
           19  enum { SchemeNorm, SchemeSel }; /* color schemes */
           20  enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
           21         NetWMFullscreen, NetActiveWindow, NetWMWindowType,
           22 -       NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
           23 +       NetWMWindowTypeDialog, NetClientList, NetClientInfo, NetLast }; /* EWMH atoms */
           24  enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
           25  enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
           26         ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
           27 @@ -198,6 +198,7 @@ static void scan(void);
           28  static int sendevent(Client *c, Atom proto);
           29  static void sendmon(Client *c, Monitor *m);
           30  static void setclientstate(Client *c, long state);
           31 +static void setclienttagprop(Client *c);
           32  static void setfocus(Client *c);
           33  static void setfullscreen(Client *c, int fullscreen);
           34  static void setlayout(const Arg *arg);
           35 @@ -1060,6 +1061,26 @@ manage(Window w, XWindowAttributes *wa)
           36          updatewindowtype(c);
           37          updatesizehints(c);
           38          updatewmhints(c);
           39 +        {
           40 +                int format;
           41 +                unsigned long *data, n, extra;
           42 +                Monitor *m;
           43 +                Atom atom;
           44 +                if (XGetWindowProperty(dpy, c->win, netatom[NetClientInfo], 0L, 2L, False, XA_CARDINAL,
           45 +                                &atom, &format, &n, &extra, (unsigned char **)&data) == Success && n == 2) {
           46 +                        c->tags = *data;
           47 +                        for (m = mons; m; m = m->next) {
           48 +                                if (m->num == *(data+1)) {
           49 +                                        c->mon = m;
           50 +                                        break;
           51 +                                }
           52 +                        }
           53 +                }
           54 +                if (n > 0)
           55 +                        XFree(data);
           56 +        }
           57 +        setclienttagprop(c);
           58 +
           59          XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
           60          grabbuttons(c, 0);
           61          if (!c->isfloating)
           62 @@ -1423,6 +1444,7 @@ sendmon(Client *c, Monitor *m)
           63          c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
           64          attach(c);
           65          attachstack(c);
           66 +        setclienttagprop(c);
           67          focus(NULL);
           68          arrange(NULL);
           69  }
           70 @@ -1566,6 +1588,7 @@ setup(void)
           71          netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
           72          netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
           73          netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
           74 +        netatom[NetClientInfo] = XInternAtom(dpy, "_NET_CLIENT_INFO", False);
           75          /* init cursors */
           76          cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr);
           77          cursor[CurResize] = drw_cur_create(drw, XC_sizing);
           78 @@ -1589,6 +1612,7 @@ setup(void)
           79          XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
           80                  PropModeReplace, (unsigned char *) netatom, NetLast);
           81          XDeleteProperty(dpy, root, netatom[NetClientList]);
           82 +        XDeleteProperty(dpy, root, netatom[NetClientInfo]);
           83          /* select events */
           84          wa.cursor = cursor[CurNormal]->cursor;
           85          wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask
           86 @@ -1656,11 +1680,22 @@ spawn(const Arg *arg)
           87          }
           88  }
           89 
           90 +void
           91 +setclienttagprop(Client *c)
           92 +{
           93 +        long data[] = { (long) c->tags, (long) c->mon->num };
           94 +        XChangeProperty(dpy, c->win, netatom[NetClientInfo], XA_CARDINAL, 32,
           95 +                        PropModeReplace, (unsigned char *) data, 2);
           96 +}
           97 +
           98  void
           99  tag(const Arg *arg)
          100  {
          101 +        Client *c;
          102          if (selmon->sel && arg->ui & TAGMASK) {
          103 +                c = selmon->sel;
          104                  selmon->sel->tags = arg->ui & TAGMASK;
          105 +                setclienttagprop(c);
          106                  focus(NULL);
          107                  arrange(selmon);
          108          }
          109 @@ -1735,6 +1770,7 @@ toggletag(const Arg *arg)
          110          newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
          111          if (newtags) {
          112                  selmon->sel->tags = newtags;
          113 +                setclienttagprop(selmon->sel);
          114                  focus(NULL);
          115                  arrange(selmon);
          116          }
          117 --
          118 2.36.1