Introduction
Introduction Statistics Contact Development Disclaimer Help
dwm-alttabclass-6.4.diff - sites - public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log
Files
Refs
---
dwm-alttabclass-6.4.diff (9326B)
---
1 diff -up a/config.def.h b/config.def.h
2 --- a/config.def.h 2023-08-17 17:35:28.333393605 +0400
3 +++ b/config.def.h 2023-08-17 17:24:46.724435876 +0400
4 @@ -3,6 +3,7 @@
5 /* alt-tab configuration */
6 static const unsigned int tabModKey = 0x40; /* i…
7 static const unsigned int tabCycleKey = 0x17; /*…
8 +static const unsigned int tabCycleKey2 = 0x31; /…
9 static const unsigned int tabPosY = 1; /…
10 static const unsigned int tabPosX = 1; /…
11 static const unsigned int maxWTab = 600; …
12 @@ -93,7 +94,8 @@ static const Key keys[] = {
13 { MODKEY, XK_period, focusmon, {.i …
14 { MODKEY|ShiftMask, XK_comma, tagmon, {.i …
15 { MODKEY|ShiftMask, XK_period, tagmon, {.i …
16 - { Mod1Mask, XK_Tab, altTabStart,…
17 + { Mod1Mask, XK_Tab, altTabStart,…
18 + { Mod1Mask, XK_grave, altTabStart,…
19 TAGKEYS( XK_1, 0)
20 TAGKEYS( XK_2, 1)
21 TAGKEYS( XK_3, 2)
22 diff -up a/dwm.c b/dwm.c
23 --- a/dwm.c 2023-08-17 17:24:19.753640383 +0400
24 +++ b/dwm.c 2023-08-18 09:41:00.834187121 +0400
25 @@ -87,6 +87,7 @@ typedef struct Monitor Monitor;
26 typedef struct Client Client;
27 struct Client {
28 char name[256];
29 + char class[256];
30 float mina, maxa;
31 int x, y, w, h;
32 int oldx, oldy, oldw, oldh;
33 @@ -121,7 +122,9 @@ struct Monitor {
34 int mx, my, mw, mh; /* screen size */
35 int wx, wy, ww, wh; /* window area */
36 int altTabN; /* move that many clients forward…
37 + int altTabNc; /* move that many clients forwar…
38 int nTabs; /* number of active clients…
39 + int ncTabs; /* number of active client…
40 int isAlt; /* 1,0 */
41 int maxWTab;
42 int maxHTab;
43 @@ -134,6 +137,7 @@ struct Monitor {
44 Client *sel;
45 Client *stack;
46 Client ** altsnext; /* array of all clients in the tag */
47 + Client ** altsnextclass; /* array of all clients under s…
48 Monitor *next;
49 Window barwin;
50 Window tabwin;
51 @@ -245,6 +249,7 @@ static void zoom(const Arg *arg);
52 void drawTab(int nwins, int first, Monitor *m);
53 void altTabStart(const Arg *arg);
54 static void altTabEnd();
55 +static void getclassname(Client *c);
56
57 /* variables */
58 static const char broken[] = "broken";
59 @@ -657,6 +662,7 @@ createmon(void)
60 m->lt[0] = &layouts[0];
61 m->lt[1] = &layouts[1 % LENGTH(layouts)];
62 m->nTabs = 0;
63 + m->ncTabs = 0;
64 strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
65 return m;
66 }
67 @@ -1059,6 +1065,7 @@ manage(Window w, XWindowAttributes *wa)
68 c->oldbw = wa->border_width;
69
70 updatetitle(c);
71 + getclassname(c);
72 if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(tr…
73 c->mon = t->mon;
74 c->tags = t->tags;
75 @@ -1683,7 +1690,7 @@ altTab()
76 selmon->altTabN = 0; /* reset altTabN */
77
78 focus(selmon->altsnext[selmon->altTabN]);
79 - restack(selmon);
80 + /* restack(selmon); */
81 }
82
83 /* redraw tab */
84 @@ -1692,8 +1699,64 @@ altTab()
85 }
86
87 void
88 +altTabClass()
89 +{
90 + /* move to next window */
91 + if (selmon->sel != NULL) {
92 + selmon->altTabNc++;
93 + if (selmon->altTabNc >= selmon->ncTabs)
94 + selmon->altTabNc = 0; /* reset altTabNc */
95 +
96 + focus(selmon->altsnextclass[selmon->altTabNc]);
97 + }
98 +
99 + /* redraw tab */
100 + XRaiseWindow(dpy, selmon->tabwin);
101 + drawTab(selmon->ncTabs, 0, selmon);
102 +}
103 +
104 +void
105 +altTabShift()
106 +{
107 + /* move to prev window */
108 + if (selmon->sel != NULL) {
109 + selmon->altTabN--;
110 + if (selmon->altTabN < 0)
111 + selmon->altTabN = selmon->nTabs - 1; /* reset a…
112 +
113 + if (selmon->altsnext[selmon->altTabN]) {
114 + focus(selmon->altsnext[selmon->altTabN]);
115 + }
116 + }
117 +
118 + /* redraw tab */
119 + XRaiseWindow(dpy, selmon->tabwin);
120 + drawTab(selmon->nTabs, 0, selmon);
121 +}
122 +
123 +void
124 +altTabShiftClass()
125 +{
126 + /* move to prev window */
127 + if (selmon->sel != NULL) {
128 + selmon->altTabNc--;
129 + if (selmon->altTabNc < 0)
130 + selmon->altTabNc = selmon->ncTabs - 1; /* reset…
131 +
132 + if (selmon->altsnextclass[selmon->altTabNc]) {
133 + focus(selmon->altsnextclass[selmon->altTabNc]);
134 + }
135 + }
136 +
137 + /* redraw tab */
138 + XRaiseWindow(dpy, selmon->tabwin);
139 + drawTab(selmon->ncTabs, 0, selmon);
140 +}
141 +
142 +void
143 altTabEnd()
144 {
145 + Client *buff = NULL;
146 if (selmon->isAlt == 0)
147 return;
148
149 @@ -1703,8 +1766,15 @@ altTabEnd()
150 * so they remain in right order for the next time that alt-tab …
151 */
152 if (selmon->nTabs > 1) {
153 - if (selmon->altTabN != 0) { /* if user picked original …
154 - Client *buff = selmon->altsnext[selmon->altTabN…
155 + if (selmon->altTabN != 0)
156 + buff = selmon->altsnext[selmon->altTabN];
157 + else if (selmon->altTabNc != 0) {
158 + buff = selmon->altsnextclass[selmon->altTabNc];
159 + for (; selmon->altTabN < selmon->nTabs; selmon-…
160 + if (selmon->altsnext[selmon->altTabN] =…
161 + break;
162 + }
163 + if (buff) { /* if user picked original client do nothin…
164 if (selmon->altTabN > 1)
165 for (int i = selmon->altTabN;i > 0;i--)
166 selmon->altsnext[i] = selmon->a…
167 @@ -1720,6 +1790,7 @@ altTabEnd()
168 }
169
170 free(selmon->altsnext); /* free list of clients */
171 + free(selmon->altsnextclass); /* free list of clients */
172 }
173
174 /* turn off/destroy the window */
175 @@ -1779,16 +1850,17 @@ drawTab(int nwins, int first, Monitor *m
176
177 }
178
179 - h = selmon->maxHTab / m->nTabs;
180 + h = selmon->maxHTab / nwins;
181
182 int y = 0;
183 - int n = 0;
184 - for (int i = 0;i < m->nTabs;i++) { /* draw all clients into tab…
185 - c = m->altsnext[i];
186 + for (int i = 0; i < nwins; i++) { /* draw all clients into tabw…
187 + if (nwins == m->nTabs)
188 + c = m->altsnext[i];
189 + else
190 + c = m->altsnextclass[i];
191 if(!ISVISIBLE(c)) continue;
192 /* if (HIDDEN(c)) continue; uncomment if you're using a…
193
194 - n++;
195 drw_setscheme(drw, scheme[(c == m->sel) ? SchemeSel : S…
196 drw_text(drw, 0, y, selmon->maxWTab, h, 0, c->name, 0);
197 y += h;
198 @@ -1801,7 +1873,6 @@ drawTab(int nwins, int first, Monitor *m
199 void
200 altTabStart(const Arg *arg)
201 {
202 - selmon->altsnext = NULL;
203 if (selmon->tabwin)
204 altTabEnd();
205
206 @@ -1810,30 +1881,47 @@ altTabStart(const Arg *arg)
207 } else {
208 selmon->isAlt = 1;
209 selmon->altTabN = 0;
210 + selmon->altTabNc = 0;
211
212 Client *c;
213 Monitor *m = selmon;
214
215 + char tempclass[256] = {'\0'};
216 + if (selmon->sel)
217 + strncpy(tempclass, selmon->sel->class, 256);
218 +
219 m->nTabs = 0;
220 + m->ncTabs = 0;
221 for(c = m->clients; c; c = c->next) { /* count clients …
222 if(!ISVISIBLE(c)) continue;
223 /* if (HIDDEN(c)) continue; uncomment if you're…
224
225 ++m->nTabs;
226 +
227 + if (!strcmp(c->class, tempclass))
228 + ++m->ncTabs;
229 }
230
231 if (m->nTabs > 0) {
232 m->altsnext = (Client **) malloc(m->nTabs * siz…
233 + m->altsnextclass = (Client **) malloc(m->ncTabs…
234
235 int listIndex = 0;
236 + int listIndexc = 0;
237 for(c = m->stack; c; c = c->snext) { /* add cli…
238 if(!ISVISIBLE(c)) continue;
239 /* if (HIDDEN(c)) continue; uncomment i…
240
241 m->altsnext[listIndex++] = c;
242 +
243 + if (!strcmp(c->class, tempclass))
244 + m->altsnextclass[listIndexc++] …
245 }
246
247 - drawTab(m->nTabs, 1, m);
248 + if (arg->i)
249 + drawTab(m->nTabs, 1, m);
250 + else
251 + drawTab(m->ncTabs, 1, m);
252
253 struct timespec ts = { .tv_sec = 0, .tv_nsec = …
254
255 @@ -1848,7 +1936,10 @@ altTabStart(const Arg *arg)
256 }
257
258 XEvent event;
259 - altTab();
260 + if (arg->i)
261 + altTab();
262 + else
263 + altTabClass();
264 if (grabbed == 0) {
265 altTabEnd();
266 } else {
267 @@ -1858,8 +1949,19 @@ altTabStart(const Arg *arg)
268 if (event.type == KeyRe…
269 break;
270 } else if (event.type =…
271 - if (event.xkey.…
272 - altTab(…
273 + if (event.xkey.…
274 + if (arg…
275 + …
276 + …
277 + …
278 + …
279 + } else {
280 + …
281 + …
282 + …
283 + …
284 + }
285 +
286 }
287 }
288 }
289 @@ -2231,6 +2333,15 @@ updatetitle(Client *c)
290 strcpy(c->name, broken);
291 }
292
293 +void
294 +getclassname(Client *c)
295 +{
296 + gettextprop(c->win, XA_WM_CLASS, c->class, sizeof c->class);
297 +
298 + if (c->class[0] == '\0') /* hack to mark broken clients */
299 + strcpy(c->name, broken);
300 +}
301 +
302 void
303 updatewindowtype(Client *c)
304 {
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.