Add preserveonrestart path
This commit is contained in:
		
							
								
								
									
										38
									
								
								dwm.c
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								dwm.c
									
									
									
									
									
								
							| @ -77,7 +77,7 @@ enum { SchemeNorm, SchemeSel, SchemeStatus, SchemeTagsSel, SchemeTagsNorm, Schem | ||||
| enum { NetSupported, NetWMName, NetWMState, NetWMCheck, | ||||
|        NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, | ||||
|        NetWMFullscreen, NetActiveWindow, NetWMWindowType, | ||||
|        NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ | ||||
|        NetWMWindowTypeDialog, NetClientList, NetClientInfo, NetLast }; /* EWMH atoms */ | ||||
| enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ | ||||
| enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ | ||||
| enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, | ||||
| @ -225,6 +225,7 @@ static void scan(void); | ||||
| static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4); | ||||
| 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); | ||||
| @ -1188,6 +1189,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) | ||||
| @ -1612,6 +1633,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); | ||||
| } | ||||
| @ -1787,6 +1809,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); | ||||
| 	xatom[Manager] = XInternAtom(dpy, "MANAGER", False); | ||||
| 	xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); | ||||
| 	xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); | ||||
| @ -1815,6 +1838,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 | ||||
| @ -1877,11 +1901,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); | ||||
| 	} | ||||
| @ -2001,6 +2036,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); | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										2584
									
								
								dwm.c.orig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2584
									
								
								dwm.c.orig
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										19
									
								
								dwm.c.rej
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								dwm.c.rej
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| --- dwm.c | ||||
| +++ 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 */ | ||||
| @@ -1588,6 +1610,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); | ||||
							
								
								
									
										118
									
								
								patches/dwm-preserveonrestart-6.3.diff
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								patches/dwm-preserveonrestart-6.3.diff
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
		Reference in New Issue
	
	Block a user