dwm-multiple-dynamic-scratchpads.diff - sites - public wiki contents of suckles… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-multiple-dynamic-scratchpads.diff (7097B) | |
--- | |
1 diff --git a/config.def.h b/config.def.h | |
2 index a2ac963..1c82453 100644 | |
3 --- a/config.def.h | |
4 +++ b/config.def.h | |
5 @@ -95,6 +95,13 @@ static Key keys[] = { | |
6 TAGKEYS( XK_8, 7) | |
7 TAGKEYS( XK_9, 8) | |
8 { MODKEY|ShiftMask, XK_q, quit, {0} … | |
9 + { MODKEY, XK_s, scratchpad_show, {.i = 1} }, | |
10 + { MODKEY, XK_y, scratchpad_show, {.i = 2} }, | |
11 + { MODKEY, XK_u, scratchpad_show, {.i = 3} }, | |
12 + { MODKEY|ShiftMask, XK_s, scratchpad_hide, {.… | |
13 + { MODKEY|ShiftMask, XK_y, scratchpad_hide, {.… | |
14 + { MODKEY|ShiftMask, XK_u, scratchpad_hide, {.… | |
15 + { MODKEY|ShiftMask, XK_r, scratchpad_remove, … | |
16 }; | |
17 | |
18 /* button definitions */ | |
19 diff --git a/dwm.c b/dwm.c | |
20 index 5f16260..202038f 100644 | |
21 --- a/dwm.c | |
22 +++ b/dwm.c | |
23 @@ -195,6 +195,11 @@ static void resizemouse(const Arg *arg); | |
24 static void restack(Monitor *m); | |
25 static void run(void); | |
26 static void scan(void); | |
27 +static void scratchpad_hide(); | |
28 +static void scratchpad_remove(); | |
29 +static void scratchpad_show(); | |
30 +static void scratchpad_show_client(Client *c); | |
31 +static void scratchpad_show_first(int scratchNum); | |
32 static int sendevent(Client *c, Atom proto); | |
33 static void sendmon(Client *c, Monitor *m); | |
34 static void setclientstate(Client *c, long state); | |
35 @@ -269,11 +274,19 @@ static Drw *drw; | |
36 static Monitor *mons, *selmon; | |
37 static Window root, wmcheckwin; | |
38 | |
39 +/* scratchpad */ | |
40 +#define SCRATCHPAD_MASK_1 (1u << sizeof tags / sizeof * tags) | |
41 +#define SCRATCHPAD_MASK_2 (1u << (sizeof tags / sizeof * tags + 1)) | |
42 +#define SCRATCHPAD_MASK_3 (1u << (sizeof tags / sizeof * tags + 2)) | |
43 +static int scratchpad_hide_flag = 0; | |
44 +static Client *scratchpad_last_showed_1 = NULL; | |
45 +static Client *scratchpad_last_showed_2 = NULL; | |
46 +static Client *scratchpad_last_showed_3 = NULL; | |
47 /* configuration, allows nested code to access above variables */ | |
48 #include "config.h" | |
49 | |
50 /* compile-time check if all tags fit into an unsigned int bit array. */ | |
51 -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; | |
52 +struct NumTags { char limitexceeded[LENGTH(tags) > 28 ? -1 : 1]; }; | |
53 | |
54 /* function implementations */ | |
55 void | |
56 @@ -309,7 +322,9 @@ applyrules(Client *c) | |
57 XFree(ch.res_class); | |
58 if (ch.res_name) | |
59 XFree(ch.res_name); | |
60 + if(c->tags != SCRATCHPAD_MASK_1 && c->tags != SCRATCHPAD_MASK_2 && … | |
61 c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagse… | |
62 + } | |
63 } | |
64 | |
65 int | |
66 @@ -1412,6 +1427,124 @@ scan(void) | |
67 } | |
68 } | |
69 | |
70 +static void scratchpad_hide(const Arg *arg) { | |
71 + if(scratchpad_hide_flag < 4) { | |
72 + if(arg->i == 1) { | |
73 + if(selmon->sel) { | |
74 + selmon->sel->tags = SCRATCHPAD_MASK_1; | |
75 + selmon->sel->isfloating = 1; | |
76 + focus(NULL); | |
77 + arrange(selmon); | |
78 + scratchpad_hide_flag++; | |
79 + } | |
80 + } | |
81 + else if(arg->i == 2) { | |
82 + if(selmon->sel) { | |
83 + selmon->sel->tags = SCRATCHPAD_MASK_2; | |
84 + selmon->sel->isfloating = 1; | |
85 + focus(NULL); | |
86 + arrange(selmon); | |
87 + scratchpad_hide_flag++; | |
88 + } | |
89 + } | |
90 + else if(arg->i == 3) { | |
91 + if(selmon->sel) { | |
92 + selmon->sel->tags = SCRATCHPAD_MASK_3; | |
93 + selmon->sel->isfloating = 1; | |
94 + focus(NULL); | |
95 + arrange(selmon); | |
96 + scratchpad_hide_flag++; | |
97 + } | |
98 + } | |
99 + } | |
100 +} | |
101 + | |
102 +static void scratchpad_remove() { | |
103 + if(selmon->sel && (scratchpad_last_showed_1 != NULL || scratchpad_l… | |
104 + if(scratchpad_last_showed_1 == selmon->sel) { | |
105 + scratchpad_last_showed_1 = NULL; | |
106 + scratchpad_hide_flag--; | |
107 + } | |
108 + else if(scratchpad_last_showed_2 == selmon->sel) { | |
109 + scratchpad_last_showed_2 = NULL; | |
110 + scratchpad_hide_flag--; | |
111 + } | |
112 + else if(scratchpad_last_showed_3 == selmon->sel) { | |
113 + scratchpad_last_showed_3 = NULL; | |
114 + scratchpad_hide_flag--; | |
115 + } | |
116 + } | |
117 +} | |
118 + | |
119 +static void scratchpad_show(const Arg *arg) { | |
120 + if(arg->i == 1) { | |
121 + if(scratchpad_last_showed_1 == NULL) { | |
122 + scratchpad_show_first(arg->i); | |
123 + } | |
124 + else { | |
125 + if(scratchpad_last_showed_1->tags != SCRATCHPAD_MASK_1) { | |
126 + scratchpad_last_showed_1->tags = SCRATCHPAD_MASK_1; | |
127 + focus(NULL); | |
128 + arrange(selmon); | |
129 + } | |
130 + else { | |
131 + scratchpad_show_first(arg->i); | |
132 + } | |
133 + } | |
134 + } | |
135 + else if(arg->i == 2) { | |
136 + if(scratchpad_last_showed_2 == NULL) { | |
137 + scratchpad_show_first(arg->i); | |
138 + } | |
139 + else { | |
140 + if(scratchpad_last_showed_2->tags != SCRATCHPAD_MASK_2) { | |
141 + scratchpad_last_showed_2->tags = SCRATCHPAD_MASK_2; | |
142 + focus(NULL); | |
143 + arrange(selmon); | |
144 + } | |
145 + else { | |
146 + scratchpad_show_first(arg->i); | |
147 + } | |
148 + } | |
149 + } | |
150 + else if(arg->i == 3) { | |
151 + if(scratchpad_last_showed_3 == NULL) { | |
152 + scratchpad_show_first(arg->i); | |
153 + } | |
154 + else { | |
155 + if(scratchpad_last_showed_3->tags != SCRATCHPAD_MASK_3) { | |
156 + scratchpad_last_showed_3->tags = SCRATCHPAD_MASK_3; | |
157 + focus(NULL); | |
158 + arrange(selmon); | |
159 + } | |
160 + else { | |
161 + scratchpad_show_first(arg->i); | |
162 + } | |
163 + } | |
164 + } | |
165 +} | |
166 + | |
167 +static void scratchpad_show_client(Client *c) { | |
168 + c->tags = selmon->tagset[selmon->seltags]; | |
169 + focus(c); | |
170 + arrange(selmon); | |
171 +} | |
172 + | |
173 +static void scratchpad_show_first(int scratchNum) { | |
174 + for(Client *c = selmon->clients; c !=NULL; c = c->next) { | |
175 + if(c->tags == SCRATCHPAD_MASK_1 && scratchNum == 1) { | |
176 + scratchpad_last_showed_1 = c; | |
177 + scratchpad_show_client(c); | |
178 + } else if(c->tags == SCRATCHPAD_MASK_2 && scratchNum == 2) { | |
179 + scratchpad_last_showed_2 = c; | |
180 + scratchpad_show_client(c); | |
181 + } else if(c->tags == SCRATCHPAD_MASK_3 && scratchNum == 3) { | |
182 + scratchpad_last_showed_3 = c; | |
183 + scratchpad_show_client(c); | |
184 + } | |
185 + } | |
186 +} | |
187 + | |
188 void | |
189 sendmon(Client *c, Monitor *m) | |
190 { | |
191 @@ -1785,6 +1918,16 @@ unmanage(Client *c, int destroyed) | |
192 XSetErrorHandler(xerror); | |
193 XUngrabServer(dpy); | |
194 } | |
195 + if(scratchpad_last_showed_1 == c) { | |
196 + scratchpad_last_showed_1 = NULL; | |
197 + } | |
198 + if(scratchpad_last_showed_2 == c) { | |
199 + scratchpad_last_showed_2 = NULL; | |
200 + } | |
201 + if(scratchpad_last_showed_3 == c) { | |
202 + scratchpad_last_showed_3 = NULL; | |
203 + } | |
204 + | |
205 free(c); | |
206 focus(NULL); | |
207 updateclientlist(); |