From ef287c46cdceac27614a1b117f80a140ecafc40d Mon Sep 17 00:00:00 2001 From: bakkeby Date: Thu, 20 Aug 2020 15:31:09 +0200 Subject: [PATCH] losefullscreen: minor improvements to keep fullscreen while moving focus to another monitor --- dwm.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/dwm.c b/dwm.c index e64f1f0..827ed2a 100644 --- a/dwm.c +++ b/dwm.c @@ -1647,6 +1647,9 @@ void enternotify(XEvent *e) { Client *c; + #if LOSEFULLSCREEN_PATCH + Client *sel; + #endif // LOSEFULLSCREEN_PATCH Monitor *m; XCrossingEvent *ev = &e->xcrossing; @@ -1655,8 +1658,14 @@ enternotify(XEvent *e) c = wintoclient(ev->window); m = c ? c->mon : wintomon(ev->window); if (m != selmon) { + #if LOSEFULLSCREEN_PATCH + sel = selmon->sel; + selmon = m; + unfocus(sel, 1); + #else unfocus(selmon->sel, 1); selmon = m; + #endif // LOSEFULLSCREEN_PATCH } else if (!c || c == selmon->sel) return; focus(c); @@ -1719,13 +1728,22 @@ void focusmon(const Arg *arg) { Monitor *m; + #if LOSEFULLSCREEN_PATCH + Client *sel; + #endif // LOSEFULLSCREEN_PATCH if (!mons->next) return; if ((m = dirtomon(arg->i)) == selmon) return; + #if LOSEFULLSCREEN_PATCH + sel = selmon->sel; + selmon = m; + unfocus(sel, 0); + #else unfocus(selmon->sel, 0); selmon = m; + #endif // LOSEFULLSCREEN_PATCH focus(NULL); #if WARP_PATCH warp(selmon->sel); @@ -2173,13 +2191,22 @@ motionnotify(XEvent *e) { static Monitor *mon = NULL; Monitor *m; + #if LOSEFULLSCREEN_PATCH + Client *sel; + #endif // LOSEFULLSCREEN_PATCH XMotionEvent *ev = &e->xmotion; if (ev->window != root) return; if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { + #if LOSEFULLSCREEN_PATCH + sel = selmon->sel; + selmon = m; + unfocus(sel, 1); + #else unfocus(selmon->sel, 1); selmon = m; + #endif // LOSEFULLSCREEN_PATCH focus(NULL); } mon = m; @@ -3462,10 +3489,10 @@ unfocus(Client *c, int setfocus) #endif // SWAPFOCUS_PATCH #if LOSEFULLSCREEN_PATCH #if !FAKEFULLSCREEN_PATCH && FAKEFULLSCREEN_CLIENT_PATCH - if (c->isfullscreen && !c->fakefullscreen && ISVISIBLE(c)) + if (c->isfullscreen && !c->fakefullscreen && ISVISIBLE(c) && c->mon == selmon) setfullscreen(c, 0); #else - if (c->isfullscreen && ISVISIBLE(c)) + if (c->isfullscreen && ISVISIBLE(c) && c->mon == selmon) setfullscreen(c, 0); #endif // FAKEFULLSCREEN_CLIENT_PATCH #endif // LOSEFULLSCREEN_PATCH