dwm-preserveonrestart-6.3.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-preserveonrestart-6.3.diff (4090B) | |
--- | |
1 From 713fa8650f5a20006451ebcccf57a4512e83bae8 Mon Sep 17 00:00:00 2001 | |
2 From: Arda Atci <[email protected]> | |
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 }; /* cu… | |
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 }; … | |
24 enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* defaul… | |
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[NetClientIn… | |
45 + &atom, &format, &n, &extra, (unsigned c… | |
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|PropertyCh… | |
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 monit… | |
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_TYP… | |
72 netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WIND… | |
73 netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", F… | |
74 + netatom[NetClientInfo] = XInternAtom(dpy, "_NET_CLIENT_INFO", F… | |
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_CARDINA… | |
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 |