diff options
Diffstat (limited to 'patches')
| -rw-r--r-- | patches/dwm-preserveonrestart-6.3.diff | 118 | 
1 files changed, 118 insertions, 0 deletions
| diff --git a/patches/dwm-preserveonrestart-6.3.diff b/patches/dwm-preserveonrestart-6.3.diff new file mode 100644 index 0000000..079cf05 --- /dev/null +++ b/patches/dwm-preserveonrestart-6.3.diff @@ -0,0 +1,118 @@ +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 | 
