diff options
| author | Lignum Crucis | 2026-04-09 23:36:03 -0300 |
|---|---|---|
| committer | Lignum Crucis | 2026-04-09 23:36:03 -0300 |
| commit | 88828ed10a096613eae35c099a2d527cc9d87013 (patch) | |
| tree | 58ca940baca8071b3ede8280ecbb90ab0dd7e4e0 | |
| parent | 0d870fbc8861dc422b6cfa04c00e1724c2e2b616 (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.c | 69 | ||||
| -rw-r--r-- | patches/dwm-smartborders-6.2.diff | 225 |
2 files changed, 265 insertions, 29 deletions
@@ -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); + } + |
