diff options
author | Malfurious <m@lfurio.us> | 2020-06-22 00:33:27 -0400 |
---|---|---|
committer | Malfurious <m@lfurio.us> | 2023-06-03 22:19:51 -0400 |
commit | a93b7c30dd3f3a7b1c191b918ea4eb5002400506 (patch) | |
tree | cb10239bbcc0484383de034821dc22429c58662e | |
parent | 693081eb1e028368cc32d3dd2d1f46af341f121e (diff) | |
download | dwm-a93b7c30dd3f3a7b1c191b918ea4eb5002400506.tar.gz dwm-a93b7c30dd3f3a7b1c191b918ea4eb5002400506.zip |
patch: smartborders
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
Diffstat (limited to '')
-rw-r--r-- | dwm.c | 57 |
1 files changed, 35 insertions, 22 deletions
@@ -147,7 +147,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); @@ -198,8 +198,8 @@ static void pushup(const Arg *arg); static void quit(const Arg *arg); static Monitor *recttomon(int x, int y, int w, int h); static void resetlayout(const Arg *arg); -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); @@ -340,7 +340,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; @@ -353,18 +353,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) @@ -404,7 +404,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 @@ -439,9 +439,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 @@ -1196,7 +1203,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 @@ -1262,7 +1269,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); @@ -1413,14 +1420,14 @@ resetlayout(const Arg *arg) } 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; @@ -1428,7 +1435,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; if ((nexttiled(c->mon->clients) == c) && !(nexttiled(c->next))) resetlayout(NULL); @@ -1479,7 +1486,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); @@ -1764,7 +1771,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) - 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 */ @@ -1843,13 +1850,17 @@ col(Monitor *m) 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 @@ -1857,12 +1868,12 @@ 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); if (my + HEIGHT(c) < m->wh) 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); if (ty + HEIGHT(c) < m->wh) ty += HEIGHT(c); } @@ -1876,7 +1887,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); } |