commit bbba95cd3dac12e9a83a44e60fa546a3de0a3701
Author: Chris Down <[email protected]>
Date: Mon Dec 27 13:45:22 2021 +0000
[dwm][patches][noborderflicker] Add noborderflicker patch
diff --git
a/dwm.suckless.org/patches/noborderflicker/dwm-noborderflicker-20211227-8657affa2a61.diff
b/dwm.suckless.org/patches/noborderflicker/dwm-noborderflicker-20211227-8657affa2a61.diff
new file mode 100644
index 00000000..9f3bb9b1
--- /dev/null
+++
b/dwm.suckless.org/patches/noborderflicker/dwm-noborderflicker-20211227-8657affa2a61.diff
@@ -0,0 +1,41 @@
+diff --git dwm.c dwm.c
+index a96f33c..50ccf00 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,10 @@ 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);
++ if (lastfocused)
++ XSetWindowBorder(dpy, lastfocused->win,
scheme[SchemeNorm][ColBorder].pixel);
+ setfocus(c);
+ } else {
+ XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
+@@ -1758,7 +1762,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 +1788,8 @@ unmanage(Client *c, int destroyed)
+ XSetErrorHandler(xerror);
+ XUngrabServer(dpy);
+ }
++ if (lastfocused == c)
++ lastfocused = NULL;
+ free(c);
+ focus(NULL);
+ updateclientlist();
diff --git a/dwm.suckless.org/patches/noborderflicker/index.md
b/dwm.suckless.org/patches/noborderflicker/index.md
new file mode 100644
index 00000000..b6021383
--- /dev/null
+++ b/dwm.suckless.org/patches/noborderflicker/index.md
@@ -0,0 +1,22 @@
+noborderflicker
+===============
+
+Description
+-----------
+Depending on machine configuration and luck, borders may flicker when changing
+focus to a new client. This happens because there may be a tangible delay
+between unfocus(), which sets the normal border, and focus(), which sets the
+focused border.
+
+This patch avoids that flickering by deferring drawing the normal border around
+the newly unfocused client until the new focused border has already been drawn.
+Even better, in reality, these are now close enough together that it's very
+likely the two updates will be rendered on the same monitor refresh.
+
+Download
+--------
+*
[dwm-noborderflicker-20211227-8657affa2a61.diff](dwm-noborderflicker-20211227-8657affa2a61.diff)
+
+Authors
+-------
+* Chris Down - <[email protected]>