commit 8955342036e491f04ca194605a0f53064fd1398b
Author: Alexander Courtis <[email protected]>
Date:   Sun Feb 16 12:25:27 2020 +1100

    [dwm][patch][smartborders] added smartborders patch for 6.2

diff --git a/dwm.suckless.org/patches/smartborders/dwm-smartborders-6.2.diff 
b/dwm.suckless.org/patches/smartborders/dwm-smartborders-6.2.diff
new file mode 100644
index 00000000..1ff246f2
--- /dev/null
+++ b/dwm.suckless.org/patches/smartborders/dwm-smartborders-6.2.diff
@@ -0,0 +1,225 @@
+diff --git a/dwm.c b/dwm.c
+index 4465af1..3c94e4b 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -143,7 +143,7 @@ typedef struct {
+ 
+ /* function declarations */
+ static void applyrules(Client *c);
+-static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int 
interact);
++static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int *bw, 
int interact);
+ static void arrange(Monitor *m);
+ static void arrangemon(Monitor *m);
+ static void attach(Client *c);
+@@ -188,8 +188,8 @@ static void pop(Client *);
+ static void propertynotify(XEvent *e);
+ static void quit(const Arg *arg);
+ static Monitor *recttomon(int x, int y, int w, int h);
+-static void resize(Client *c, int x, int y, int w, int h, int interact);
+-static void resizeclient(Client *c, int x, int y, int w, int h);
++static void resize(Client *c, int x, int y, int w, int h, int bw, int 
interact);
++static void resizeclient(Client *c, int x, int y, int w, int h, int bw);
+ static void resizemouse(const Arg *arg);
+ static void restack(Monitor *m);
+ static void run(void);
+@@ -312,7 +312,7 @@ applyrules(Client *c)
+ }
+ 
+ int
+-applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
++applysizehints(Client *c, int *x, int *y, int *w, int *h, int *bw, int 
interact)
+ {
+       int baseismin;
+       Monitor *m = c->mon;
+@@ -325,18 +325,18 @@ applysizehints(Client *c, int *x, int *y, int *w, int 
*h, int interact)
+                       *x = sw - WIDTH(c);
+               if (*y > sh)
+                       *y = sh - HEIGHT(c);
+-              if (*x + *w + 2 * c->bw < 0)
++              if (*x + *w + 2 * *bw < 0)
+                       *x = 0;
+-              if (*y + *h + 2 * c->bw < 0)
++              if (*y + *h + 2 * *bw < 0)
+                       *y = 0;
+       } else {
+               if (*x >= m->wx + m->ww)
+                       *x = m->wx + m->ww - WIDTH(c);
+               if (*y >= m->wy + m->wh)
+                       *y = m->wy + m->wh - HEIGHT(c);
+-              if (*x + *w + 2 * c->bw <= m->wx)
++              if (*x + *w + 2 * *bw <= m->wx)
+                       *x = m->wx;
+-              if (*y + *h + 2 * c->bw <= m->wy)
++              if (*y + *h + 2 * *bw <= m->wy)
+                       *y = m->wy;
+       }
+       if (*h < bh)
+@@ -374,7 +374,7 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, 
int interact)
+               if (c->maxh)
+                       *h = MIN(*h, c->maxh);
+       }
+-      return *x != c->x || *y != c->y || *w != c->w || *h != c->h;
++      return *x != c->x || *y != c->y || *w != c->w || *h != c->h || *bw != 
c->bw;
+ }
+ 
+ void
+@@ -394,9 +394,16 @@ arrange(Monitor *m)
+ void
+ arrangemon(Monitor *m)
+ {
++    Client *c;
++
+       strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
+       if (m->lt[m->sellt]->arrange)
+               m->lt[m->sellt]->arrange(m);
++      else
++              /* <>< case; rather than providing an arrange function and 
upsetting other logic that tests for its presence, simply add borders here */
++              for (c = selmon->clients; c; c = c->next)
++                      if (ISVISIBLE(c) && c->bw == 0)
++                              resize(c, c->x, c->y, c->w - 2*borderpx, c->h - 
2*borderpx, borderpx, 0);
+ }
+ 
+ void
+@@ -566,7 +573,7 @@ configurenotify(XEvent *e)
+                       for (m = mons; m; m = m->next) {
+                               for (c = m->clients; c; c = c->next)
+                                       if (c->isfullscreen)
+-                                              resizeclient(c, m->mx, m->my, 
m->mw, m->mh);
++                                              resizeclient(c, m->mx, m->my, 
m->mw, m->mh, 0);
+                               XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, 
m->ww, bh);
+                       }
+                       focus(NULL);
+@@ -1112,7 +1119,7 @@ monocle(Monitor *m)
+       if (n > 0) /* override layout symbol */
+               snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
+       for (c = nexttiled(m->clients); c; c = nexttiled(c->next))
+-              resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 
0);
++              resize(c, m->wx, m->wy, m->ww, m->wh, 0, 0);
+ }
+ 
+ void
+@@ -1180,7 +1187,7 @@ movemouse(const Arg *arg)
+                       && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
+                               togglefloating(NULL);
+                       if (!selmon->lt[selmon->sellt]->arrange || 
c->isfloating)
+-                              resize(c, nx, ny, c->w, c->h, 1);
++                              resize(c, nx, ny, c->w, c->h, c->bw, 1);
+                       break;
+               }
+       } while (ev.type != ButtonRelease);
+@@ -1266,14 +1273,14 @@ recttomon(int x, int y, int w, int h)
+ }
+ 
+ void
+-resize(Client *c, int x, int y, int w, int h, int interact)
++resize(Client *c, int x, int y, int w, int h, int bw, int interact)
+ {
+-      if (applysizehints(c, &x, &y, &w, &h, interact))
+-              resizeclient(c, x, y, w, h);
++      if (applysizehints(c, &x, &y, &w, &h, &bw, interact))
++              resizeclient(c, x, y, w, h, bw);
+ }
+ 
+ void
+-resizeclient(Client *c, int x, int y, int w, int h)
++resizeclient(Client *c, int x, int y, int w, int h, int bw)
+ {
+       XWindowChanges wc;
+ 
+@@ -1281,7 +1288,7 @@ resizeclient(Client *c, int x, int y, int w, int h)
+       c->oldy = c->y; c->y = wc.y = y;
+       c->oldw = c->w; c->w = wc.width = w;
+       c->oldh = c->h; c->h = wc.height = h;
+-      wc.border_width = c->bw;
++      c->oldbw = c->bw; c->bw = wc.border_width = bw;
+       XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, 
&wc);
+       configure(c);
+       XSync(dpy, False);
+@@ -1330,7 +1337,7 @@ resizemouse(const Arg *arg)
+                                       togglefloating(NULL);
+                       }
+                       if (!selmon->lt[selmon->sellt]->arrange || 
c->isfloating)
+-                              resize(c, c->x, c->y, nw, nh, 1);
++                              resize(c, c->x, c->y, nw, nh, c->bw, 1);
+                       break;
+               }
+       } while (ev.type != ButtonRelease);
+@@ -1477,22 +1484,20 @@ setfullscreen(Client *c, int fullscreen)
+                       PropModeReplace, (unsigned 
char*)&netatom[NetWMFullscreen], 1);
+               c->isfullscreen = 1;
+               c->oldstate = c->isfloating;
+-              c->oldbw = c->bw;
+-              c->bw = 0;
+               c->isfloating = 1;
+-              resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh);
++              resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh, 
0);
+               XRaiseWindow(dpy, c->win);
+       } else if (!fullscreen && c->isfullscreen){
+               XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
+                       PropModeReplace, (unsigned char*)0, 0);
+               c->isfullscreen = 0;
+               c->isfloating = c->oldstate;
+-              c->bw = c->oldbw;
+               c->x = c->oldx;
+               c->y = c->oldy;
+               c->w = c->oldw;
+               c->h = c->oldh;
+-              resizeclient(c, c->x, c->y, c->w, c->h);
++              c->bw = c->oldbw;
++              resizeclient(c, c->x, c->y, c->w, c->h, c->bw);
+               arrange(c->mon);
+       }
+ }
+@@ -1619,7 +1624,7 @@ showhide(Client *c)
+               /* show clients top down */
+               XMoveWindow(dpy, c->win, c->x, c->y);
+               if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && 
!c->isfullscreen)
+-                      resize(c, c->x, c->y, c->w, c->h, 0);
++                      resize(c, c->x, c->y, c->w, c->h, c->bw, 0);
+               showhide(c->snext);
+       } else {
+               /* hide clients bottom up */
+@@ -1673,13 +1678,17 @@ tagmon(const Arg *arg)
+ void
+ tile(Monitor *m)
+ {
+-      unsigned int i, n, h, mw, my, ty;
++      unsigned int i, n, h, mw, my, ty, bw;
+       Client *c;
+ 
+       for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+       if (n == 0)
+               return;
+ 
++      if (n == 1)
++              bw = 0;
++      else
++              bw = borderpx;
+       if (n > m->nmaster)
+               mw = m->nmaster ? m->ww * m->mfact : 0;
+       else
+@@ -1687,11 +1696,11 @@ tile(Monitor *m)
+       for (i = my = ty = 0, c = nexttiled(m->clients); c; c = 
nexttiled(c->next), i++)
+               if (i < m->nmaster) {
+                       h = (m->wh - my) / (MIN(n, m->nmaster) - i);
+-                      resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - 
(2*c->bw), 0);
++                      resize(c, m->wx, m->wy + my, mw - 2*bw, h - 2*bw, bw, 
0);
+                       my += HEIGHT(c);
+               } else {
+                       h = (m->wh - ty) / (n - i);
+-                      resize(c, m->wx + mw, m->wy + ty, m->ww - mw - 
(2*c->bw), h - (2*c->bw), 0);
++                      resize(c, m->wx + mw, m->wy + ty, m->ww - mw - 2*bw, h 
- 2*bw, bw, 0);
+                       ty += HEIGHT(c);
+               }
+ }
+@@ -1715,7 +1724,9 @@ togglefloating(const Arg *arg)
+       selmon->sel->isfloating = !selmon->sel->isfloating || 
selmon->sel->isfixed;
+       if (selmon->sel->isfloating)
+               resize(selmon->sel, selmon->sel->x, selmon->sel->y,
+-                      selmon->sel->w, selmon->sel->h, 0);
++                      selmon->sel->w - 2 * (borderpx - selmon->sel->bw),
++                      selmon->sel->h - 2 * (borderpx - selmon->sel->bw),
++                      borderpx, 0);
+       arrange(selmon);
+ }
+ 
diff --git a/dwm.suckless.org/patches/smartborders/index.md 
b/dwm.suckless.org/patches/smartborders/index.md
new file mode 100644
index 00000000..59ee272e
--- /dev/null
+++ b/dwm.suckless.org/patches/smartborders/index.md
@@ -0,0 +1,20 @@
+smartborders
+============
+
+Description
+-----------
+
+Inspired by the xmonad feature of the same name.
+
+Borders are only drawn when:
+* client window is floating
+* >1 tiled clients are visible
+* floating layout
+
+Download
+--------
+* [dwm-smartborders-6.2.diff](dwm-smartborders-6.2.diff) (20200216)
+
+Author
+------
+* Alexander Courtis


Reply via email to