diff --git a/dwm.c b/dwm.c index b4f2338..55cc546 100644 --- a/dwm.c +++ b/dwm.c @@ -239,6 +239,7 @@ static void showwin(Client *c); static void showhide(Client *c); static void sighup(int unused); static void sigterm(int unused); +static int solitary(Client *c); static void spawn(const Arg *arg); static void tag(const Arg *arg); static void tagmon(const Arg *arg); @@ -1038,7 +1039,11 @@ focus(Client *c) detachstack(c); attachstack(c); grabbuttons(c, 1); - XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); + /* Avoid flickering when another client appears and the border + * is restored */ + if (!solitary(c)) { + XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); + } setfocus(c); } else { XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); @@ -1688,6 +1693,11 @@ resizeclient(Client *c, int x, int y, int w, int h) c->oldw = c->w; c->w = wc.width = w; c->oldh = c->h; c->h = wc.height = h; wc.border_width = c->bw; + if (solitary(c)) { + c->w = wc.width += c->bw * 2; + c->h = wc.height += c->bw * 2; + wc.border_width = 0; + } XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); configure(c); XSync(dpy, False); @@ -2175,6 +2185,15 @@ sigterm(int unused) quit(&a); } +int +solitary(Client *c) +{ + return ((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) + || &monocle == c->mon->lt[c->mon->sellt]->arrange) + && !c->isfullscreen && !c->isfloating + && NULL != c->mon->lt[c->mon->sellt]->arrange; +} + void spawn(const Arg *arg) { diff --git a/patches/appearance/dwm-noborderselflickerfix-2022042627-d93ff48803f0.diff b/patches/appearance/dwm-noborderselflickerfix-2022042627-d93ff48803f0.diff new file mode 100644 index 0000000..5a82b33 --- /dev/null +++ b/patches/appearance/dwm-noborderselflickerfix-2022042627-d93ff48803f0.diff @@ -0,0 +1,53 @@ +diff --git dwm.c dwm.c +index 0fc328a..4a767bd 100644 +--- dwm.c ++++ dwm.c +@@ -206,6 +206,7 @@ static void setup(void); + static void seturgent(Client *c, int urg); + static void showhide(Client *c); + static void sigchld(int unused); ++static int solitary(Client *c); + static void spawn(const Arg *arg); + static void tag(const Arg *arg); + static void tagmon(const Arg *arg); +@@ -802,7 +803,11 @@ focus(Client *c) + detachstack(c); + attachstack(c); + grabbuttons(c, 1); +- XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); ++ /* Avoid flickering when another client appears and the border ++ * is restored */ ++ if (!solitary(c)) { ++ XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); ++ } + setfocus(c); + } else { + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); +@@ -1288,6 +1293,11 @@ resizeclient(Client *c, int x, int y, int w, int h) + c->oldw = c->w; c->w = wc.width = w; + c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; ++ if (solitary(c)) { ++ c->w = wc.width += c->bw * 2; ++ c->h = wc.height += c->bw * 2; ++ wc.border_width = 0; ++ } + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); +@@ -1642,6 +1652,15 @@ sigchld(int unused) + while (0 < waitpid(-1, NULL, WNOHANG)); + } + ++int ++solitary(Client *c) ++{ ++ return ((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) ++ || &monocle == c->mon->lt[c->mon->sellt]->arrange) ++ && !c->isfullscreen && !c->isfloating ++ && NULL != c->mon->lt[c->mon->sellt]->arrange; ++} ++ + void + spawn(const Arg *arg) + {