summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLignum Crucis2026-04-09 23:36:03 -0300
committerLignum Crucis2026-04-09 23:36:03 -0300
commit88828ed10a096613eae35c099a2d527cc9d87013 (patch)
tree58ca940baca8071b3ede8280ecbb90ab0dd7e4e0
parent0d870fbc8861dc422b6cfa04c00e1724c2e2b616 (diff)
patch: dwm-smartborders
had a pretty bad merge conflict, be aware if you want to use this patch and gaps
-rw-r--r--dwm.c69
-rw-r--r--patches/dwm-smartborders-6.2.diff225
2 files changed, 265 insertions, 29 deletions
diff --git a/dwm.c b/dwm.c
index 1c2de8e..26694d4 100644
--- a/dwm.c
+++ b/dwm.c
@@ -148,7 +148,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);
@@ -194,8 +194,8 @@ static void pop(Client *c);
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);
@@ -342,7 +342,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;
@@ -355,18 +355,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)
@@ -406,7 +406,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
@@ -426,9 +426,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
@@ -599,7 +606,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);
@@ -1193,7 +1200,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
@@ -1261,7 +1268,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);
@@ -1348,14 +1355,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;
@@ -1363,7 +1370,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);
@@ -1412,7 +1419,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);
@@ -1503,7 +1510,7 @@ sendmon(Client *c, Monitor *m)
attachstack(c);
setclienttagprop(c);
if (c->isfullscreen)
- resizeclient(c, m->mx, m->my, m->mw, m->mh);
+ resizeclient(c, m->mx, m->my, m->mw, m->mh, 0);
focus(NULL);
arrange(NULL);
}
@@ -1560,22 +1567,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);
}
}
@@ -1818,7 +1823,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 */
@@ -1895,13 +1900,17 @@ tagmon(const Arg *arg)
void
tile(Monitor *m)
{
- unsigned int i, n, h, r, oe = enablegaps, ie = enablegaps, mw, my, ty;
+ unsigned int i, n, h, r, oe = enablegaps, ie = enablegaps, 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 (smartgaps == n) {
oe = 0; // outer gaps disabled
}
@@ -1914,13 +1923,13 @@ tile(Monitor *m)
if (i < m->nmaster) {
r = MIN(n, m->nmaster) - i;
h = (m->wh - my - m->gappoh*oe - m->gappih*ie * (r - 1)) / r;
- resize(c, m->wx + m->gappov*oe, m->wy + my, mw - (2*c->bw) - m->gappiv*ie, h - (2*c->bw), 0);
+ resize(c, m->wx + m->gappov*oe, m->wy + my, mw - 2*bw - m->gappiv*ie, h - 2*bw, bw, 0);
if (my + HEIGHT(c) + m->gappih*ie < m->wh)
my += HEIGHT(c) + m->gappih*ie;
} else {
r = n - i;
h = (m->wh - ty - m->gappoh*oe - m->gappih*ie * (r - 1)) / r;
- resize(c, m->wx + mw + m->gappov*oe, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappov*oe, h - (2*c->bw), 0);
+ resize(c, m->wx + mw + m->gappov*oe, m->wy + ty, m->ww - mw - 2*bw - 2*m->gappov*oe, h - 2*bw, bw, 0);
if (ty + HEIGHT(c) + m->gappih*ie < m->wh)
ty += HEIGHT(c) + m->gappih*ie;
}
@@ -1945,7 +1954,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/patches/dwm-smartborders-6.2.diff b/patches/dwm-smartborders-6.2.diff
new file mode 100644
index 0000000..1ff246f
--- /dev/null
+++ b/patches/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);
+ }
+