dwm-multiple-dynamic-scratchpads.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) 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, {.i = 1} },
13 + { MODKEY|ShiftMask, XK_y, scratchpad_hide, {.i = 2} },
14 + { MODKEY|ShiftMask, XK_u, scratchpad_hide, {.i = 3} },
15 + { MODKEY|ShiftMask, XK_r, scratchpad_remove, {0} },
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 && c->tags != SCRATCHPAD_MASK_3) {
61 c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags];
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_last_showed_2 != NULL ||scratchpad_last_showed_3 != NULL) && (selmon->sel == scratchpad_last_showed_1 || selmon->sel == scratchpad_last_showed_2 || selmon->sel == scratchpad_last_showed_3)) {
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();