diff --git a/README.md b/README.md index 4d47e3c..9d063bc 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,8 @@ Browsing patches? There is a [map of patches](https://coggle.it/diagram/X9IiSSM6 ### Changelog: +2023-06-27 - Added the focusfollowmouse patch + 2023-06-25 - Added the toggletopbar patch 2023-01-18 - Added the view history patch @@ -433,6 +435,10 @@ Browsing patches? There is a [map of patches](https://coggle.it/diagram/X9IiSSM6 - allows focusing on clients based on direction (up, down, left, right) instead of client order + - [focusfollowmouse](https://github.com/bakkeby/patches/wiki/focusfollowmouse) + - the window under the mouse cursor will receive focus when changing tags, closing windows or + moving client out of view (as opposed to the most recently focused client) + - [focusmaster](https://dwm.suckless.org/patches/focusmaster/) - a simple patch that just puts focus back to the master client diff --git a/dwm.c b/dwm.c index 03ceb92..269f965 100644 --- a/dwm.c +++ b/dwm.c @@ -1489,8 +1489,8 @@ configurenotify(XEvent *e) createpreview(m); #endif // BAR_TAGPREVIEW_PATCH } - focus(NULL); arrange(NULL); + focus(NULL); } } } @@ -2037,6 +2037,10 @@ expose(XEvent *e) void focus(Client *c) { + #if FOCUSFOLLOWMOUSE_PATCH + if (!c || !ISVISIBLE(c)) + c = getpointerclient(); + #endif // FOCUSFOLLOWMOUSE_PATCH if (!c || !ISVISIBLE(c)) for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); if (selmon->sel && selmon->sel != c) @@ -3347,11 +3351,12 @@ sendmon(Client *c, Monitor *m) if (hadfocus) { focus(c); restack(m); - } else + } else { focus(NULL); + } #else - focus(NULL); arrange(NULL); + focus(NULL); #endif // EXRESIZE_PATCH / SENDMON_KEEPFOCUS_PATCH #if SWITCHTAG_PATCH if (c->switchtag) @@ -4074,6 +4079,7 @@ tag(const Arg *arg) if (selmon->sel->switchtag) selmon->sel->switchtag = 0; #endif // SWITCHTAG_PATCH + arrange(selmon); focus(NULL); #if SWAPFOCUS_PATCH && PERTAG_PATCH selmon->pertag->prevclient[selmon->pertag->curtag] = NULL; @@ -4081,7 +4087,6 @@ tag(const Arg *arg) if (tagmask & 1) selmon->pertag->prevclient[tagindex] = NULL; #endif // SWAPFOCUS_PATCH - arrange(selmon); #if VIEWONTAG_PATCH if ((arg->ui & TAGMASK) != selmon->tagset[selmon->seltags]) view(arg); @@ -4213,13 +4218,13 @@ toggletag(const Arg *arg) newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); if (newtags) { selmon->sel->tags = newtags; + arrange(selmon); focus(NULL); #if SWAPFOCUS_PATCH && PERTAG_PATCH for (tagmask = arg->ui & TAGMASK, tagindex = 1; tagmask!=0; tagmask >>= 1, tagindex++) if (tagmask & 1) selmon->pertag->prevclient[tagindex] = NULL; #endif // SWAPFOCUS_PATCH - arrange(selmon); } #if BAR_EWMHTAGS_PATCH updatecurrentdesktop(); @@ -4306,8 +4311,8 @@ toggleview(const Arg *arg) #endif // PERTAGBAR_PATCH #endif // PERTAG_PATCH #if !TAGSYNC_PATCH - focus(NULL); arrange(selmon); + focus(NULL); #endif // TAGSYNC_PATCH #if !EMPTYVIEW_PATCH } @@ -4318,8 +4323,8 @@ toggleview(const Arg *arg) #if !EMPTYVIEW_PATCH if (newtagset) { #endif // EMPTYVIEW_PATCH - focus(NULL); arrange(NULL); + focus(NULL); #if !EMPTYVIEW_PATCH } #endif // EMPTYVIEW_PATCH @@ -4456,9 +4461,9 @@ unmanage(Client *c, int destroyed) if (s) return; #endif // SWALLOW_PATCH + arrange(m); focus(NULL); updateclientlist(); - arrange(m); #if SWITCHTAG_PATCH if (switchtag && ((switchtag & TAGMASK) != selmon->tagset[selmon->seltags])) view(&((Arg) { .ui = switchtag })); @@ -4953,12 +4958,12 @@ view(const Arg *arg) } selmon = origselmon; #endif // TAGSYNC_PATCH - focus(NULL); #if TAGSYNC_PATCH arrange(NULL); #else arrange(selmon); #endif // TAGSYNC_PATCH + focus(NULL); #if BAR_EWMHTAGS_PATCH updatecurrentdesktop(); #endif // BAR_EWMHTAGS_PATCH diff --git a/patch/combo.c b/patch/combo.c index 58b31f1..0b0bc5a 100644 --- a/patch/combo.c +++ b/patch/combo.c @@ -22,8 +22,8 @@ combotag(const Arg *arg) combo = 1; selmon->sel->tags = arg->ui & TAGMASK; } - focus(NULL); arrange(selmon); + focus(NULL); } } diff --git a/patch/distributetags.c b/patch/distributetags.c index f20f53f..d786774 100644 --- a/patch/distributetags.c +++ b/patch/distributetags.c @@ -22,10 +22,10 @@ distributetags(const Arg *arg) #if TAGSYNC_PATCH } selmon = origselmon; - focus(NULL); arrange(NULL); - #else focus(NULL); + #else arrange(selmon); + focus(NULL); #endif // TAGSYNC_PATCH } diff --git a/patch/focusadjacenttag.c b/patch/focusadjacenttag.c index 67dd768..f0244a2 100644 --- a/patch/focusadjacenttag.c +++ b/patch/focusadjacenttag.c @@ -6,8 +6,8 @@ tagtoleft(const Arg *arg) && __builtin_popcount(selmon->tagset[selmon->seltags] & MASK) == 1 && selmon->tagset[selmon->seltags] > 1) { selmon->sel->tags >>= 1; - focus(NULL); arrange(selmon); + focus(NULL); } } @@ -19,8 +19,8 @@ tagtoright(const Arg *arg) && __builtin_popcount(selmon->tagset[selmon->seltags] & MASK) == 1 && selmon->tagset[selmon->seltags] & (MASK >> 1)) { selmon->sel->tags <<= 1; - focus(NULL); arrange(selmon); + focus(NULL); } } diff --git a/patch/focusfollowmouse.c b/patch/focusfollowmouse.c new file mode 100644 index 0000000..d75a9da --- /dev/null +++ b/patch/focusfollowmouse.c @@ -0,0 +1,9 @@ +Client * +getpointerclient(void) +{ + Window dummy, win; + int di; + unsigned int dui; + XQueryPointer(dpy, root, &dummy, &win, &di, &di, &di, &di, &dui); + return wintoclient(win); +} diff --git a/patch/focusfollowmouse.h b/patch/focusfollowmouse.h new file mode 100644 index 0000000..6b24d5f --- /dev/null +++ b/patch/focusfollowmouse.h @@ -0,0 +1 @@ +static Client *getpointerclient(void); diff --git a/patch/include.c b/patch/include.c index 12de942..440633a 100644 --- a/patch/include.c +++ b/patch/include.c @@ -151,6 +151,9 @@ #if FOCUSDIR_PATCH #include "focusdir.c" #endif +#if FOCUSFOLLOWMOUSE_PATCH +#include "focusfollowmouse.c" +#endif #if FOCUSMASTER_PATCH #include "focusmaster.c" #endif diff --git a/patch/include.h b/patch/include.h index 41031f6..2879103 100644 --- a/patch/include.h +++ b/patch/include.h @@ -154,6 +154,9 @@ #if FOCUSADJACENTTAG_PATCH #include "focusadjacenttag.h" #endif +#if FOCUSFOLLOWMOUSE_PATCH +#include "focusfollowmouse.h" +#endif #if FOCUSMASTER_PATCH #include "focusmaster.h" #endif diff --git a/patch/scratchpad.c b/patch/scratchpad.c index 9e24ff6..013e35f 100644 --- a/patch/scratchpad.c +++ b/patch/scratchpad.c @@ -62,8 +62,8 @@ togglescratch(const Arg *arg) if (found) { if (newtagset) { selmon->tagset[selmon->seltags] = newtagset; - focus(NULL); arrange(selmon); + focus(NULL); } if (ISVISIBLE(found)) { focus(found); diff --git a/patch/scratchpad_alt_1.c b/patch/scratchpad_alt_1.c index 6724d5c..8704582 100644 --- a/patch/scratchpad_alt_1.c +++ b/patch/scratchpad_alt_1.c @@ -6,8 +6,8 @@ scratchpad_hide() if (selmon->sel) { selmon->sel->tags = SCRATCHPAD_MASK; selmon->sel->isfloating = 1; - focus(NULL); arrange(selmon); + focus(NULL); } } @@ -36,8 +36,8 @@ scratchpad_show() if (scratchpad_last_showed->tags != SCRATCHPAD_MASK) { scratchpad_last_showed->tags = SCRATCHPAD_MASK; - focus(NULL); arrange(selmon); + focus(NULL); return; } diff --git a/patch/swallow.c b/patch/swallow.c index 8a63cc0..df8f927 100644 --- a/patch/swallow.c +++ b/patch/swallow.c @@ -91,8 +91,8 @@ unswallow(Client *c) setfloatinghint(c); #endif // BAR_EWMHTAGS_PATCH setclientstate(c, NormalState); - focus(NULL); arrange(c->mon); + focus(NULL); } pid_t diff --git a/patch/tagallmon.c b/patch/tagallmon.c index d6b879a..3dee569 100644 --- a/patch/tagallmon.c +++ b/patch/tagallmon.c @@ -43,7 +43,7 @@ tagallmon(const Arg *arg) } } - focus(NULL); arrange(NULL); + focus(NULL); } diff --git a/patch/tagothermonitor.c b/patch/tagothermonitor.c index d12f6ff..90739dc 100644 --- a/patch/tagothermonitor.c +++ b/patch/tagothermonitor.c @@ -37,8 +37,8 @@ tagothermon(const Arg *arg, int dir) sendmon(sel, newmon); if (arg->ui & TAGMASK) { sel->tags = arg->ui & TAGMASK; - focus(NULL); arrange(newmon); + focus(NULL); } } diff --git a/patch/tagswapmon.c b/patch/tagswapmon.c index 4719b8c..915512e 100644 --- a/patch/tagswapmon.c +++ b/patch/tagswapmon.c @@ -69,7 +69,7 @@ tagswapmon(const Arg *arg) } } - focus(NULL); arrange(NULL); + focus(NULL); } diff --git a/patch/xrdb.c b/patch/xrdb.c index aa32854..aa14969 100644 --- a/patch/xrdb.c +++ b/patch/xrdb.c @@ -132,7 +132,6 @@ xrdb(const Arg *arg) #endif // BAR_ALPHA_PATCH ColCount ); - focus(NULL); arrange(NULL); + focus(NULL); } - diff --git a/patches.def.h b/patches.def.h index b7f9f8a..1875853 100644 --- a/patches.def.h +++ b/patches.def.h @@ -646,6 +646,12 @@ */ #define FOCUSDIR_PATCH 0 +/* When changing tags, closing windows or moving clients out of view then focus will revert to the + * client window that remains under the mouse cursor rather than the most recently focused window. + * https://github.com/bakkeby/patches/wiki/focusfollowmouse + */ +#define FOCUSFOLLOWMOUSE_PATCH 0 + /* A simple patch that just puts focus back to the master client. * https://dwm.suckless.org/patches/focusmaster/ */