Introduction
Introduction Statistics Contact Development Disclaimer Help
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();
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.