dwm-cyclewindows-20240624-56f64312.diff - sites - public wiki contents of suckl… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-cyclewindows-20240624-56f64312.diff (3270B) | |
--- | |
1 From 56f643120f082c9fd609f25e3ad9db6eb435fb89 Mon Sep 17 00:00:00 2001 | |
2 From: elbachir-one <[email protected]> | |
3 Date: Mon, 24 Jun 2024 22:15:50 +0100 | |
4 Subject: [PATCH] Inspired by a Reddit post from u/PawarShubham3007 | |
5 shubham-cpp on github, this patch aiming to make dwm focus on windows | |
6 of the same program. | |
7 | |
8 --- | |
9 config.def.h | 4 +++- | |
10 dwm.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ | |
11 2 files changed, 58 insertions(+), 1 deletion(-) | |
12 | |
13 diff --git a/config.def.h b/config.def.h | |
14 index 9efa774..fd0dda6 100644 | |
15 --- a/config.def.h | |
16 +++ b/config.def.h | |
17 @@ -85,6 +85,8 @@ static const Key keys[] = { | |
18 { MODKEY, XK_period, focusmon, {.i … | |
19 { MODKEY|ShiftMask, XK_comma, tagmon, {.i … | |
20 { MODKEY|ShiftMask, XK_period, tagmon, {.i … | |
21 + { MODKEY, XK_n, focussame, {.i = +1 … | |
22 + { MODKEY|ShiftMask, XK_n, focussame, {.i = -1 … | |
23 TAGKEYS( XK_1, 0) | |
24 TAGKEYS( XK_2, 1) | |
25 TAGKEYS( XK_3, 2) | |
26 diff --git a/dwm.c b/dwm.c | |
27 index 67c6b2b..c657315 100644 | |
28 --- a/dwm.c | |
29 +++ b/dwm.c | |
30 @@ -233,6 +233,8 @@ static int xerror(Display *dpy, XErrorEvent *ee); | |
31 static int xerrordummy(Display *dpy, XErrorEvent *ee); | |
32 static int xerrorstart(Display *dpy, XErrorEvent *ee); | |
33 static void zoom(const Arg *arg); | |
34 +static void focussame(const Arg *arg); | |
35 +static Window lastfocusedwin = None; | |
36 | |
37 /* variables */ | |
38 static const char broken[] = "broken"; | |
39 @@ -786,6 +788,59 @@ expose(XEvent *e) | |
40 drawbar(m); | |
41 } | |
42 | |
43 +void | |
44 +focussame(const Arg *arg) { | |
45 + Client *c; | |
46 + XClassHint ch = { NULL, NULL }; | |
47 + char *class_name = NULL; | |
48 + int direction = arg->i; | |
49 + | |
50 + if (!selmon->sel) | |
51 + return; | |
52 + | |
53 + if (!XGetClassHint(dpy, selmon->sel->win, &ch)) | |
54 + return; | |
55 + class_name = ch.res_class; | |
56 + | |
57 + Client *clients[32]; | |
58 + int num_clients = 0; | |
59 + for (c = selmon->clients; c && num_clients < 32; c = c->next) { | |
60 + if (c->tags & selmon->tagset[selmon->seltags] && XGetClassHint(… | |
61 + if (strcmp(class_name, ch.res_class) == 0) | |
62 + clients[num_clients++] = c; | |
63 + XFree(ch.res_class); | |
64 + XFree(ch.res_name); | |
65 + } | |
66 + } | |
67 + | |
68 + Client *target_client = NULL; | |
69 + if (direction == +1) { | |
70 + for (int i = 0; i < num_clients; ++i) { | |
71 + if (clients[i]->win == lastfocusedwin) { | |
72 + target_client = clients[(i + 1) % num_clients]; | |
73 + break; | |
74 + } | |
75 + } | |
76 + if (!target_client) | |
77 + target_client = clients[0]; | |
78 + } else if (direction == -1) { | |
79 + for (int i = 0; i < num_clients; ++i) { | |
80 + if (clients[i]->win == lastfocusedwin) { | |
81 + target_client = clients[(i - 1 + num_clients) % num_cli… | |
82 + break; | |
83 + } | |
84 + } | |
85 + if (!target_client) | |
86 + target_client = clients[num_clients - 1]; | |
87 + } | |
88 + | |
89 + if (target_client) { | |
90 + focus(target_client); | |
91 + restack(selmon); | |
92 + lastfocusedwin = target_client->win; | |
93 + } | |
94 +} | |
95 + | |
96 void | |
97 focus(Client *c) | |
98 { | |
99 -- | |
100 2.45.2 | |
101 |