119 lines
4.0 KiB
Diff
119 lines
4.0 KiB
Diff
|
From 713fa8650f5a20006451ebcccf57a4512e83bae8 Mon Sep 17 00:00:00 2001
|
||
|
From: Arda Atci <arda@phytech.io>
|
||
|
Date: Wed, 18 May 2022 17:23:16 +0300
|
||
|
Subject: [PATCH] preserve clients on old tags when renewing dwm
|
||
|
|
||
|
By default, when dwm is recompiled-restarted all clients will
|
||
|
lose it's current tag and collapse to first tag. This patch preserves
|
||
|
clients on old tags, however note that layout order is not preserved.
|
||
|
|
||
|
---
|
||
|
dwm.c | 38 +++++++++++++++++++++++++++++++++++++-
|
||
|
1 file changed, 37 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/dwm.c b/dwm.c
|
||
|
index a96f33c..a12e0bd 100644
|
||
|
--- a/dwm.c
|
||
|
+++ b/dwm.c
|
||
|
@@ -62,7 +62,7 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
|
||
|
enum { SchemeNorm, SchemeSel }; /* color schemes */
|
||
|
enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
|
||
|
NetWMFullscreen, NetActiveWindow, NetWMWindowType,
|
||
|
- NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
|
||
|
+ NetWMWindowTypeDialog, NetClientList, NetClientInfo, NetLast }; /* EWMH atoms */
|
||
|
enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
|
||
|
enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
|
||
|
ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
|
||
|
@@ -198,6 +198,7 @@ static void scan(void);
|
||
|
static int sendevent(Client *c, Atom proto);
|
||
|
static void sendmon(Client *c, Monitor *m);
|
||
|
static void setclientstate(Client *c, long state);
|
||
|
+static void setclienttagprop(Client *c);
|
||
|
static void setfocus(Client *c);
|
||
|
static void setfullscreen(Client *c, int fullscreen);
|
||
|
static void setlayout(const Arg *arg);
|
||
|
@@ -1060,6 +1061,26 @@ manage(Window w, XWindowAttributes *wa)
|
||
|
updatewindowtype(c);
|
||
|
updatesizehints(c);
|
||
|
updatewmhints(c);
|
||
|
+ {
|
||
|
+ int format;
|
||
|
+ unsigned long *data, n, extra;
|
||
|
+ Monitor *m;
|
||
|
+ Atom atom;
|
||
|
+ if (XGetWindowProperty(dpy, c->win, netatom[NetClientInfo], 0L, 2L, False, XA_CARDINAL,
|
||
|
+ &atom, &format, &n, &extra, (unsigned char **)&data) == Success && n == 2) {
|
||
|
+ c->tags = *data;
|
||
|
+ for (m = mons; m; m = m->next) {
|
||
|
+ if (m->num == *(data+1)) {
|
||
|
+ c->mon = m;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ if (n > 0)
|
||
|
+ XFree(data);
|
||
|
+ }
|
||
|
+ setclienttagprop(c);
|
||
|
+
|
||
|
XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
|
||
|
grabbuttons(c, 0);
|
||
|
if (!c->isfloating)
|
||
|
@@ -1423,6 +1444,7 @@ sendmon(Client *c, Monitor *m)
|
||
|
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
|
||
|
attach(c);
|
||
|
attachstack(c);
|
||
|
+ setclienttagprop(c);
|
||
|
focus(NULL);
|
||
|
arrange(NULL);
|
||
|
}
|
||
|
@@ -1566,6 +1588,7 @@ setup(void)
|
||
|
netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
|
||
|
netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
|
||
|
netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
|
||
|
+ netatom[NetClientInfo] = XInternAtom(dpy, "_NET_CLIENT_INFO", False);
|
||
|
/* init cursors */
|
||
|
cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr);
|
||
|
cursor[CurResize] = drw_cur_create(drw, XC_sizing);
|
||
|
@@ -1589,6 +1612,7 @@ setup(void)
|
||
|
XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
|
||
|
PropModeReplace, (unsigned char *) netatom, NetLast);
|
||
|
XDeleteProperty(dpy, root, netatom[NetClientList]);
|
||
|
+ XDeleteProperty(dpy, root, netatom[NetClientInfo]);
|
||
|
/* select events */
|
||
|
wa.cursor = cursor[CurNormal]->cursor;
|
||
|
wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask
|
||
|
@@ -1656,11 +1680,22 @@ spawn(const Arg *arg)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+void
|
||
|
+setclienttagprop(Client *c)
|
||
|
+{
|
||
|
+ long data[] = { (long) c->tags, (long) c->mon->num };
|
||
|
+ XChangeProperty(dpy, c->win, netatom[NetClientInfo], XA_CARDINAL, 32,
|
||
|
+ PropModeReplace, (unsigned char *) data, 2);
|
||
|
+}
|
||
|
+
|
||
|
void
|
||
|
tag(const Arg *arg)
|
||
|
{
|
||
|
+ Client *c;
|
||
|
if (selmon->sel && arg->ui & TAGMASK) {
|
||
|
+ c = selmon->sel;
|
||
|
selmon->sel->tags = arg->ui & TAGMASK;
|
||
|
+ setclienttagprop(c);
|
||
|
focus(NULL);
|
||
|
arrange(selmon);
|
||
|
}
|
||
|
@@ -1735,6 +1770,7 @@ toggletag(const Arg *arg)
|
||
|
newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
|
||
|
if (newtags) {
|
||
|
selmon->sel->tags = newtags;
|
||
|
+ setclienttagprop(selmon->sel);
|
||
|
focus(NULL);
|
||
|
arrange(selmon);
|
||
|
}
|
||
|
--
|
||
|
2.36.1
|