1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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();
|