Re: [hackers] [dwm] Center windows if useless gaps exist post applysizehints

From: Hiltjo Posthuma <hiltjo_AT_codemadness.org>
Date: Mon, 24 Apr 2017 08:50:00 +0200

On Mon, Apr 24, 2017 at 01:35:59PM +1000, Daniel Cousens wrote:
> 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 <github_AT_dcousens.com>
> 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
> _AT_@ -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;
> _AT_@ -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++);
> _AT_@ -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
>

Hey,

Sorry if I'm missing the point, but have you tried the config option
"resizehints" in dwm?

(Firefox also has issues with initial window resize, it is a Firefox
bug I think).

-- 
Kind regards,
Hiltjo
Received on Mon Apr 24 2017 - 08:50:00 CEST

This archive was generated by hypermail 2.3.0 : Mon Apr 24 2017 - 09:00:17 CEST