summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorbakkeby <[email protected]>2020-05-10 14:58:00 +0200
committerbakkeby <[email protected]>2020-05-10 17:09:41 +0200
commitac4c5081c577d4f1604b0de48e7a0c5d4b44d34e (patch)
tree7a4e6548aa66bafa24b40b0181113485557e42c6
parent443795e3c9459b7875232ea9210d97c1ef17bdfd (diff)
downloaddwm-flexipatch-ac4c5081c577d4f1604b0de48e7a0c5d4b44d34e.tar.gz
dwm-flexipatch-ac4c5081c577d4f1604b0de48e7a0c5d4b44d34e.zip
Horizgrid pixel perfect updates
-rw-r--r--patch/horizgrid.c156
1 files changed, 89 insertions, 67 deletions
diff --git a/patch/horizgrid.c b/patch/horizgrid.c
index 586a2b0..9be2931 100644
--- a/patch/horizgrid.c
+++ b/patch/horizgrid.c
@@ -1,82 +1,104 @@
-#if VANITYGAPS_PATCH
void
horizgrid(Monitor *m) {
Client *c;
unsigned int n, i;
- int w = 0, oh, ov, ih, iv;
- int ntop, nbottom = 0;
+ int mx = 0, my = 0, mh = 0, mw = 0;
+ int sx = 0, sy = 0, sh = 0, sw = 0;
+ int ntop, nbottom = 1;
+ float mfacts = 0, sfacts = 0;
+ int mrest, srest, mtotal = 0, stotal = 0;
- /* Count windows */
+ #if VANITYGAPS_PATCH
+ int oh, ov, ih, iv;
getgaps(m, &oh, &ov, &ih, &iv, &n);
-
+ #else
+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ #endif // VANITYGAPS_PATCH
if (n == 0)
return;
- if (n == 1) { /* Just fill the whole screen */
- c = nexttiled(m->clients);
- resize(c, m->wx + ov, m->wy + oh, m->ww - 2*ov - (2*c->bw), m->wh - 2*oh - (2*c->bw), False);
- } else if (n == 2) { /* Split vertically */
- w = (m->ww - 2*ov - iv) / 2;
- c = nexttiled(m->clients);
- resize(c, m->wx + ov, m->wy + oh, w - (2*c->bw), m->wh - 2*oh - (2*c->bw), False);
- c = nexttiled(c->next);
- resize(c, m->wx + ov + w + iv, m->wy + oh, w - (2*c->bw), m->wh - 2*oh - (2*c->bw), False);
- } else {
+ if (n <= 2)
+ ntop = n;
+ else {
ntop = n / 2;
nbottom = n - ntop;
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
- if (i < ntop)
- resize(
- c,
- m->wx + ov + i * ((m->ww - 2*ov - iv*(ntop - 1)) / ntop + iv),
- m->wy + oh,
- (m->ww - 2*ov - iv*(ntop - 1)) / ntop - (2*c->bw),
- (m->wh - 2*oh - ih) / 2 - (2*c->bw),
- False
- );
- else
- resize(
- c,
- m->wx + ov + (i - ntop) * ((m->ww - 2*ov - iv*(nbottom - 1)) / nbottom + iv),
- m->wy + oh + ih + (m->wh - 2*oh - ih) / 2,
- (m->ww - 2*ov - iv*(nbottom - 1)) / nbottom - (2*c->bw),
- (m->wh - 2*oh - ih) / 2 - (2*c->bw),
- False
- );
- }
}
-}
-#else
-void
-horizgrid(Monitor *m) {
- Client *c;
- unsigned int n, i;
- int w = 0;
- int ntop, nbottom = 0;
- /* Count windows */
- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ #if VANITYGAPS_PATCH
+ sx = mx = m->wx + ov;
+ sy = my = m->wy + oh;
+ sh = mh = m->wh - 2*oh;
+ sw = mw = m->ww - 2*ov;
- if (n == 0)
- return;
- else if (n == 1) { /* Just fill the whole screen */
- c = nexttiled(m->clients);
- resize(c, m->wx, m->wy, m->ww - (2*c->bw), m->wh - (2*c->bw), False);
- } else if (n == 2) { /* Split vertically */
- w = m->ww / 2;
- c = nexttiled(m->clients);
- resize(c, m->wx, m->wy, w - (2*c->bw), m->wh - (2*c->bw), False);
- c = nexttiled(c->next);
- resize(c, m->wx + w, m->wy, w - (2*c->bw), m->wh - (2*c->bw), False);
- } else {
- ntop = n / 2;
- nbottom = n - ntop;
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
- if (i < ntop)
- resize(c, m->wx + i * m->ww / ntop, m->wy, m->ww / ntop - (2*c->bw), m->wh / 2 - (2*c->bw), False);
- else
- resize(c, m->wx + (i - ntop) * m->ww / nbottom, m->wy + m->wh / 2, m->ww / nbottom - (2*c->bw), m->wh / 2 - (2*c->bw), False);
- }
+ if (n > ntop) {
+ sh = (mh - ih) / 2;
+ mh = mh - ih - sh;
+ sy = my + mh + ih;
+ mw = m->ww - 2*ov - iv * (ntop - 1);
+ sw = m->ww - 2*ov - iv * (nbottom - 1);
}
-}
-#endif
+ #else
+ sx = mx = m->wx;
+ sy = my = m->wy;
+ sh = mh = m->wh;
+ sw = mw = m->ww;
+
+ if (n > ntop) {
+ sh = mh / 2;
+ mh = mh - sh;
+ sy = my + mh;
+ }
+ #endif // VANITYGAPS_PATCH
+
+ /* calculate facts */
+ #if CFACTS_PATCH
+ for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+ if (i < ntop)
+ mfacts += c->cfact;
+ else
+ sfacts += c->cfact;
+
+ for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+ if (i < ntop)
+ mtotal += mh * (c->cfact / mfacts);
+ else
+ stotal += sw * (c->cfact / sfacts);
+ #else
+ mfacts = ntop;
+ sfacts = nbottom;
+
+ for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+ if (i < ntop)
+ mtotal += mh / mfacts;
+ else
+ stotal += sw / sfacts;
+ #endif // CFACTS_PATCH
+
+ mrest = mh - mtotal;
+ srest = sw - stotal;
+
+ for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+ if (i < ntop) {
+ #if CFACTS_PATCH
+ resize(c, mx, my, mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
+ #else
+ resize(c, mx, my, mw / mfacts + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
+ #endif // CFACTS_PATCH
+ #if VANITYGAPS_PATCH
+ mx += WIDTH(c) + iv;
+ #else
+ mx += WIDTH(c);
+ #endif // VANITYGAPS_PATCH
+ } else {
+ #if CFACTS_PATCH
+ resize(c, sx, sy, sw * (c->cfact / sfacts) + ((i - ntop) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
+ #else
+ resize(c, sx, sy, sw / sfacts + ((i - ntop) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
+ #endif // CFACTS_PATCH
+ #if VANITYGAPS_PATCH
+ sx += WIDTH(c) + iv;
+ #else
+ sx += WIDTH(c);
+ #endif // VANITYGAPS_PATCH
+ }
+} \ No newline at end of file