dwm-cyclewindows-20240624-56f64312.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-cyclewindows-20240624-56f64312.diff (3270B)
---
1 From 56f643120f082c9fd609f25e3ad9db6eb435fb89 Mon Sep 17 00:00:00 2001
2 From: elbachir-one <bachiralfa@gmail.com>
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 = +1 } },
19 { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
20 { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
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(dpy, c->win, &ch)) {
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_clients];
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