It has often annoyed me that my `st` windows would have "gaps" beneath them and to the right as a result of the size hints not being respected (due to column widths being enforced nicely in `st`)... however, the annoyance doesn't come from the fact that it happens, just the lack of symmetry.
This patch enforces that symmetry by performing a dummy resize loop first, then using the aggregate remainder, it then adds half of that remainder as an initial offset, leaving symmetric gaps on each axis, not just the positive axis'. This patch has issues though, for whatever reason Chromium doesn't like this approach whatsoever, and often refuses to resize at all... Feedback appreciated; and thoughts if this is a better behaviour?
From a88d0927d8c64044ea417eea4376c475ec7ecf1c Mon Sep 17 00:00:00 2001 From: Daniel Cousens <[email protected]> Date: Mon, 24 Apr 2017 13:01:46 +1000 Subject: [PATCH] center windows if useless gaps occur --- dwm.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/dwm.c b/dwm.c index b452ed7..9baf58b 100644 --- a/dwm.c +++ b/dwm.c @@ -1266,6 +1266,22 @@ resize(Client *c, int x, int y, int w, int h, int interact) } void +dummyresizeclient(Client *c, int x, int y, int w, int h) +{ + c->x = x; + c->y = y; + c->w = w; + c->h = h; +} + +void +dummyresize(Client *c, int x, int y, int w, int h, int interact) +{ + if (applysizehints(c, &x, &y, &w, &h, interact)) + dummyresizeclient(c, x, y, w, h); +} + +void resizeclient(Client *c, int x, int y, int w, int h) { XWindowChanges wc; @@ -1667,6 +1683,7 @@ void tile(Monitor *m) { unsigned int i, n, h, mw, my, ty; + unsigned int dx = 0; Client *c; for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); @@ -1677,14 +1694,30 @@ tile(Monitor *m) mw = m->nmaster ? m->ww * m->mfact : 0; else mw = m->ww; + + /* dummy tile, for size hints only */ 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); + dummyresize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->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); + dummyresize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); + ty += HEIGHT(c); + } + + my = (m->wh - my) / 2; + ty = (m->wh - ty) / 2; + + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + if (i < m->nmaster) { + dx = ((mw - (2*c->bw)) - WIDTH(c)) / 2; + resize(c, m->wx + dx, m->wy + my, WIDTH(c), HEIGHT(c), 0); + my += HEIGHT(c); + } else { + dx = ((m->ww - mw - (2*c->bw)) - WIDTH(c)) / 2; + resize(c, m->wx + mw + dx, m->wy + ty, WIDTH(c), HEIGHT(c), 0); ty += HEIGHT(c); } } -- 2.12.2
