summaryrefslogtreecommitdiff
path: root/patches/dwm-noborderflicker-20211227-8657affa2a61.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/dwm-noborderflicker-20211227-8657affa2a61.diff')
-rw-r--r--patches/dwm-noborderflicker-20211227-8657affa2a61.diff42
1 files changed, 42 insertions, 0 deletions
diff --git a/patches/dwm-noborderflicker-20211227-8657affa2a61.diff b/patches/dwm-noborderflicker-20211227-8657affa2a61.diff
new file mode 100644
index 0000000..df2aeb3
--- /dev/null
+++ b/patches/dwm-noborderflicker-20211227-8657affa2a61.diff
@@ -0,0 +1,42 @@
+diff --git dwm.c dwm.c
+index a96f33c..34d1321 100644
+--- dwm.c
++++ dwm.c
+@@ -236,6 +236,7 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee);
+ static void zoom(const Arg *arg);
+
+ /* variables */
++static Client *lastfocused = NULL;
+ static const char broken[] = "broken";
+ static char stext[256];
+ static int screen;
+@@ -799,7 +800,11 @@ focus(Client *c)
+ detachstack(c);
+ attachstack(c);
+ grabbuttons(c, 1);
++ /* set new focused border first to avoid flickering */
+ XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
++ /* lastfocused may be us if another window was unmanaged */
++ if (lastfocused && lastfocused != c)
++ XSetWindowBorder(dpy, lastfocused->win, scheme[SchemeNorm][ColBorder].pixel);
+ setfocus(c);
+ } else {
+ XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
+@@ -1758,7 +1763,7 @@ unfocus(Client *c, int setfocus)
+ if (!c)
+ return;
+ grabbuttons(c, 0);
+- XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel);
++ lastfocused = c;
+ if (setfocus) {
+ XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
+ XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
+@@ -1784,6 +1789,8 @@ unmanage(Client *c, int destroyed)
+ XSetErrorHandler(xerror);
+ XUngrabServer(dpy);
+ }
++ if (lastfocused == c)
++ lastfocused = NULL;
+ free(c);
+ focus(NULL);
+ updateclientlist();