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, | enum { NetSupported, NetWMName, NetWMState, NetWMCheck, | ||||||
|        NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, |        NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, | ||||||
|        NetWMFullscreen, NetActiveWindow, NetWMWindowType, |        NetWMFullscreen, NetActiveWindow, NetWMWindowType, | ||||||
|        NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ |        NetWMWindowTypeDialog, NetClientList, NetClientInfo, NetLast }; /* EWMH atoms */ | ||||||
| enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ | enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ | ||||||
| enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ | enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ | ||||||
| enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, | 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 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 sendmon(Client *c, Monitor *m); | ||||||
| static void setclientstate(Client *c, long state); | static void setclientstate(Client *c, long state); | ||||||
|  | static void setclienttagprop(Client *c); | ||||||
| static void setfocus(Client *c); | static void setfocus(Client *c); | ||||||
| static void setfullscreen(Client *c, int fullscreen); | static void setfullscreen(Client *c, int fullscreen); | ||||||
| static void setlayout(const Arg *arg); | static void setlayout(const Arg *arg); | ||||||
| @ -1188,6 +1189,26 @@ manage(Window w, XWindowAttributes *wa) | |||||||
| 	updatewindowtype(c); | 	updatewindowtype(c); | ||||||
| 	updatesizehints(c); | 	updatesizehints(c); | ||||||
| 	updatewmhints(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); | 	XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); | ||||||
| 	grabbuttons(c, 0); | 	grabbuttons(c, 0); | ||||||
| 	if (!c->isfloating) | 	if (!c->isfloating) | ||||||
| @ -1612,6 +1633,7 @@ sendmon(Client *c, Monitor *m) | |||||||
| 	c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ | 	c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ | ||||||
| 	attach(c); | 	attach(c); | ||||||
| 	attachstack(c); | 	attachstack(c); | ||||||
|  | 	setclienttagprop(c); | ||||||
| 	focus(NULL); | 	focus(NULL); | ||||||
| 	arrange(NULL); | 	arrange(NULL); | ||||||
| } | } | ||||||
| @ -1787,6 +1809,7 @@ setup(void) | |||||||
| 	netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); | 	netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); | ||||||
| 	netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); | 	netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); | ||||||
| 	netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); | 	netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); | ||||||
|  | 	netatom[NetClientInfo] = XInternAtom(dpy, "_NET_CLIENT_INFO", False); | ||||||
| 	xatom[Manager] = XInternAtom(dpy, "MANAGER", False); | 	xatom[Manager] = XInternAtom(dpy, "MANAGER", False); | ||||||
| 	xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); | 	xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); | ||||||
| 	xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); | 	xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); | ||||||
| @ -1815,6 +1838,7 @@ setup(void) | |||||||
| 	XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, | 	XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, | ||||||
| 		PropModeReplace, (unsigned char *) netatom, NetLast); | 		PropModeReplace, (unsigned char *) netatom, NetLast); | ||||||
| 	XDeleteProperty(dpy, root, netatom[NetClientList]); | 	XDeleteProperty(dpy, root, netatom[NetClientList]); | ||||||
|  | 	XDeleteProperty(dpy, root, netatom[NetClientInfo]); | ||||||
| 	/* select events */ | 	/* select events */ | ||||||
| 	wa.cursor = cursor[CurNormal]->cursor; | 	wa.cursor = cursor[CurNormal]->cursor; | ||||||
| 	wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask | 	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 | void | ||||||
| tag(const Arg *arg) | tag(const Arg *arg) | ||||||
| { | { | ||||||
|  | 	Client *c; | ||||||
| 	if (selmon->sel && arg->ui & TAGMASK) { | 	if (selmon->sel && arg->ui & TAGMASK) { | ||||||
|  | 		c = selmon->sel; | ||||||
| 		selmon->sel->tags = arg->ui & TAGMASK; | 		selmon->sel->tags = arg->ui & TAGMASK; | ||||||
|  | 		setclienttagprop(c); | ||||||
| 		focus(NULL); | 		focus(NULL); | ||||||
| 		arrange(selmon); | 		arrange(selmon); | ||||||
| 	} | 	} | ||||||
| @ -2001,6 +2036,7 @@ toggletag(const Arg *arg) | |||||||
| 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); | 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); | ||||||
| 	if (newtags) { | 	if (newtags) { | ||||||
| 		selmon->sel->tags = newtags; | 		selmon->sel->tags = newtags; | ||||||
|  | 		setclienttagprop(selmon->sel); | ||||||
| 		focus(NULL); | 		focus(NULL); | ||||||
| 		arrange(selmon); | 		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