dwm-noborderflicker-20211227-8657affa2a61.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-noborderflicker-20211227-8657affa2a61.diff (1358B)
       ---
            1 diff --git dwm.c dwm.c
            2 index a96f33c..34d1321 100644
            3 --- dwm.c
            4 +++ dwm.c
            5 @@ -236,6 +236,7 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee);
            6  static void zoom(const Arg *arg);
            7  
            8  /* variables */
            9 +static Client *lastfocused = NULL;
           10  static const char broken[] = "broken";
           11  static char stext[256];
           12  static int screen;
           13 @@ -799,7 +800,11 @@ focus(Client *c)
           14                  detachstack(c);
           15                  attachstack(c);
           16                  grabbuttons(c, 1);
           17 +                /* set new focused border first to avoid flickering */
           18                  XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
           19 +                /* lastfocused may be us if another window was unmanaged */
           20 +                if (lastfocused && lastfocused != c)
           21 +                        XSetWindowBorder(dpy, lastfocused->win, scheme[SchemeNorm][ColBorder].pixel);
           22                  setfocus(c);
           23          } else {
           24                  XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
           25 @@ -1758,7 +1763,7 @@ unfocus(Client *c, int setfocus)
           26          if (!c)
           27                  return;
           28          grabbuttons(c, 0);
           29 -        XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel);
           30 +        lastfocused = c;
           31          if (setfocus) {
           32                  XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
           33                  XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
           34 @@ -1784,6 +1789,8 @@ unmanage(Client *c, int destroyed)
           35                  XSetErrorHandler(xerror);
           36                  XUngrabServer(dpy);
           37          }
           38 +        if (lastfocused == c)
           39 +                lastfocused = NULL;
           40          free(c);
           41          focus(NULL);
           42          updateclientlist();