dwm-scratchpad-20200727-bb2e7222baeec7776930354d0e9f210cc2aaad5f.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-scratchpad-20200727-bb2e7222baeec7776930354d0e9f210cc2aaad5f.diff (4213B)
---
1 diff --git a/config.def.h b/config.def.h
2 index 1c0b587..48cf601 100644
3 --- a/config.def.h
4 +++ b/config.def.h
5 @@ -94,6 +94,9 @@ static Key keys[] = {
6 TAGKEYS( XK_8, 7)
7 TAGKEYS( XK_9, 8)
8 { MODKEY|ShiftMask, XK_q, quit, {0} },
9 + { MODKEY, XK_minus, scratchpad_show, {0} },
10 + { MODKEY|ShiftMask, XK_minus, scratchpad_hide, {0} },
11 + { MODKEY, XK_equal,scratchpad_remove,{0} },
12 };
13
14 /* button definitions */
15 diff --git a/dwm.c b/dwm.c
16 index 9fd0286..c647493 100644
17 --- a/dwm.c
18 +++ b/dwm.c
19 @@ -195,6 +195,12 @@ static void resizemouse(const Arg *arg);
20 static void restack(Monitor *m);
21 static void run(void);
22 static void scan(void);
23 +static void scratchpad_hide ();
24 +static _Bool scratchpad_last_showed_is_killed (void);
25 +static void scratchpad_remove ();
26 +static void scratchpad_show ();
27 +static void scratchpad_show_client (Client * c);
28 +static void scratchpad_show_first (void);
29 static int sendevent(Client *c, Atom proto);
30 static void sendmon(Client *c, Monitor *m);
31 static void setclientstate(Client *c, long state);
32 @@ -269,11 +275,15 @@ static Drw *drw;
33 static Monitor *mons, *selmon;
34 static Window root, wmcheckwin;
35
36 +/* scratchpad */
37 +# define SCRATCHPAD_MASK (1u << sizeof tags / sizeof * tags)
38 +static Client * scratchpad_last_showed = NULL;
39 +
40 /* configuration, allows nested code to access above variables */
41 #include "config.h"
42
43 /* compile-time check if all tags fit into an unsigned int bit array. */
44 -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
45 +struct NumTags { char limitexceeded[LENGTH(tags) > 30 ? -1 : 1]; };
46
47 /* function implementations */
48 void
49 @@ -309,7 +319,8 @@ applyrules(Client *c)
50 XFree(ch.res_class);
51 if (ch.res_name)
52 XFree(ch.res_name);
53 - c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags];
54 + if (c->tags != SCRATCHPAD_MASK)
55 + c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags];
56 }
57
58 int
59 @@ -1408,6 +1419,98 @@ scan(void)
60 }
61 }
62
63 +static void scratchpad_hide ()
64 +{
65 + if (selmon -> sel)
66 + {
67 + selmon -> sel -> tags = SCRATCHPAD_MASK;
68 + selmon -> sel -> isfloating = 1;
69 + focus(NULL);
70 + arrange(selmon);
71 + }
72 +}
73 +
74 +static _Bool scratchpad_last_showed_is_killed (void)
75 +{
76 + _Bool killed = 1;
77 + for (Client * c = selmon -> clients; c != NULL; c = c -> next)
78 + {
79 + if (c == scratchpad_last_showed)
80 + {
81 + killed = 0;
82 + break;
83 + }
84 + }
85 + return killed;
86 +}
87 +
88 +static void scratchpad_remove ()
89 +{
90 + if (selmon -> sel && scratchpad_last_showed != NULL && selmon -> sel == scratchpad_last_showed)
91 + scratchpad_last_showed = NULL;
92 +}
93 +
94 +static void scratchpad_show ()
95 +{
96 + if (scratchpad_last_showed == NULL || scratchpad_last_showed_is_killed ())
97 + scratchpad_show_first ();
98 + else
99 + {
100 + if (scratchpad_last_showed -> tags != SCRATCHPAD_MASK)
101 + {
102 + scratchpad_last_showed -> tags = SCRATCHPAD_MASK;
103 + focus(NULL);
104 + arrange(selmon);
105 + }
106 + else
107 + {
108 + _Bool found_current = 0;
109 + _Bool found_next = 0;
110 + for (Client * c = selmon -> clients; c != NULL; c = c -> next)
111 + {
112 + if (found_current == 0)
113 + {
114 + if (c == scratchpad_last_showed)
115 + {
116 + found_current = 1;
117 + continue;
118 + }
119 + }
120 + else
121 + {
122 + if (c -> tags == SCRATCHPAD_MASK)
123 + {
124 + found_next = 1;
125 + scratchpad_show_client (c);
126 + break;
127 + }
128 + }
129 + }
130 + if (found_next == 0) scratchpad_show_first ();
131 + }
132 + }
133 +}
134 +
135 +static void scratchpad_show_client (Client * c)
136 +{
137 + scratchpad_last_showed = c;
138 + c -> tags = selmon->tagset[selmon->seltags];
139 + focus(c);
140 + arrange(selmon);
141 +}
142 +
143 +static void scratchpad_show_first (void)
144 +{
145 + for (Client * c = selmon -> clients; c != NULL; c = c -> next)
146 + {
147 + if (c -> tags == SCRATCHPAD_MASK)
148 + {
149 + scratchpad_show_client (c);
150 + break;
151 + }
152 + }
153 +}
154 +
155 void
156 sendmon(Client *c, Monitor *m)
157 {
158 @@ -1781,6 +1884,8 @@ unmanage(Client *c, int destroyed)
159 XSetErrorHandler(xerror);
160 XUngrabServer(dpy);
161 }
162 + if (scratchpad_last_showed == c)
163 + scratchpad_last_showed = NULL;
164 free(c);
165 focus(NULL);
166 updateclientlist();