-
Notifications
You must be signed in to change notification settings - Fork 30
/
dwm-focusfollowmouse-6.5.diff
134 lines (121 loc) · 3.16 KB
/
dwm-focusfollowmouse-6.5.diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
From 6bc2798a3b17c8796b8a11a1cce0b9c2702e66f0 Mon Sep 17 00:00:00 2001
From: Bakkeby <[email protected]>
Date: Wed, 26 Jun 2024 22:22:22 +0200
Subject: [PATCH] focusfollowmouse: give precedence to the mouse cursor when
deciding next focus
By default dwm will revert focus back to the visible client that last had focus
when moving windows into and out of view.
This can happen when the user:
- changes tags
- toggles tags into or out of view
- moves the selected window to another monitor
- moves the selected window to another tag
- a window closes
With this patch the expectation is that the window that remains under the mouse
cursor will be the next one to receive focus.
---
dwm.c | 27 ++++++++++++++++++++-------
1 file changed, 20 insertions(+), 7 deletions(-)
diff --git a/dwm.c b/dwm.c
index f1d86b2..39b538c 100644
--- a/dwm.c
+++ b/dwm.c
@@ -170,6 +170,7 @@ static void focusin(XEvent *e);
static void focusmon(const Arg *arg);
static void focusstack(const Arg *arg);
static Atom getatomprop(Client *c, Atom prop);
+static Client *getpointerclient(void);
static int getrootptr(int *x, int *y);
static long getstate(Window w);
static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
@@ -572,8 +573,8 @@ configurenotify(XEvent *e)
resizeclient(c, m->mx, m->my, m->mw, m->mh);
XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
}
- focus(NULL);
arrange(NULL);
+ focus(NULL);
}
}
}
@@ -789,6 +790,8 @@ expose(XEvent *e)
void
focus(Client *c)
{
+ if (!c || !ISVISIBLE(c))
+ c = getpointerclient();
if (!c || !ISVISIBLE(c))
for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext);
if (selmon->sel && selmon->sel != c)
@@ -877,6 +880,16 @@ getatomprop(Client *c, Atom prop)
return atom;
}
+Client *
+getpointerclient(void)
+{
+ Window dummy, win;
+ int di;
+ unsigned int dui;
+ XQueryPointer(dpy, root, &dummy, &win, &di, &di, &di, &di, &dui);
+ return wintoclient(win);
+}
+
int
getrootptr(int *x, int *y)
{
@@ -1429,8 +1442,8 @@ sendmon(Client *c, Monitor *m)
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
attach(c);
attachstack(c);
- focus(NULL);
arrange(NULL);
+ focus(NULL);
}
void
@@ -1671,8 +1684,8 @@ tag(const Arg *arg)
{
if (selmon->sel && arg->ui & TAGMASK) {
selmon->sel->tags = arg->ui & TAGMASK;
- focus(NULL);
arrange(selmon);
+ focus(NULL);
}
}
@@ -1745,8 +1758,8 @@ toggletag(const Arg *arg)
newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
if (newtags) {
selmon->sel->tags = newtags;
- focus(NULL);
arrange(selmon);
+ focus(NULL);
}
}
@@ -1757,8 +1770,8 @@ toggleview(const Arg *arg)
if (newtagset) {
selmon->tagset[selmon->seltags] = newtagset;
- focus(NULL);
arrange(selmon);
+ focus(NULL);
}
}
@@ -1796,9 +1809,9 @@ unmanage(Client *c, int destroyed)
XUngrabServer(dpy);
}
free(c);
- focus(NULL);
updateclientlist();
arrange(m);
+ focus(NULL);
}
void
@@ -2058,8 +2071,8 @@ view(const Arg *arg)
selmon->seltags ^= 1; /* toggle sel tagset */
if (arg->ui & TAGMASK)
selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
- focus(NULL);
arrange(selmon);
+ focus(NULL);
}
Client *
--
2.45.2