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

Reply via email to