summaryrefslogtreecommitdiffhomepage
path: root/patch/centeredmaster.c
diff options
context:
space:
mode:
authorbakkeby <[email protected]>2020-03-20 15:20:07 +0100
committerbakkeby <[email protected]>2020-03-20 15:20:07 +0100
commit8047fe257bb95490d5a027a9d3f406f16394108c (patch)
tree6904c41307f54373b6c5049903d991ffce77f21e /patch/centeredmaster.c
parent143f94cbc2d9d6e4a8432677f2af30be70031a9b (diff)
downloaddwm-flexipatch-8047fe257bb95490d5a027a9d3f406f16394108c.tar.gz
dwm-flexipatch-8047fe257bb95490d5a027a9d3f406f16394108c.zip
Layouts - re-distributing remaining pixels after even split to address #12
Diffstat (limited to 'patch/centeredmaster.c')
-rw-r--r--patch/centeredmaster.c251
1 files changed, 68 insertions, 183 deletions
diff --git a/patch/centeredmaster.c b/patch/centeredmaster.c
index bac7a5b..384a7eb 100644
--- a/patch/centeredmaster.c
+++ b/patch/centeredmaster.c
@@ -1,4 +1,3 @@
-#if VANITYGAPS_PATCH && CFACTS_PATCH
void
centeredmaster(Monitor *m)
{
@@ -6,94 +5,23 @@ centeredmaster(Monitor *m)
int mx = 0, my = 0, mh = 0, mw = 0;
int lx = 0, ly = 0, lw = 0, lh = 0;
int rx = 0, ry = 0, rw = 0, rh = 0;
- int oh, ov, ih, iv;
float mfacts = 0, lfacts = 0, rfacts = 0;
+ int mtotal = 0, ltotal = 0, rtotal = 0;
+ int mrest = 0, lrest = 0, rrest = 0;
Client *c;
- getgaps(m, &oh, &ov, &ih, &iv, &n);
- if (n == 0)
- return;
-
- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
- if (!m->nmaster || n < m->nmaster)
- mfacts += c->cfact; // total factor of master area
- else if ((n - m->nmaster) % 2)
- lfacts += c->cfact; // total factor of left hand stacke area
- else
- rfacts += c->cfact; // total factor of right hand stack area
- }
-
- /* initialize areas */
- mx = m->wx + ov;
- my = m->wy + oh;
- mh = m->wh - 2*oh - ih * ((!m->nmaster ? n : MIN(n, m->nmaster)) - 1);
- mw = m->ww - 2*ov;
- lh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - 1);
- rh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - ((n - m->nmaster) % 2 ? 0 : 1));
-
- if (m->nmaster && n > m->nmaster) {
- /* go mfact box in the center if more than nmaster clients */
- if (n - m->nmaster > 1) {
- /* ||<-S->|<---M--->|<-S->|| */
- mw = (m->ww - 2*ov - 2*iv) * m->mfact;
- lw = (m->ww - mw - 2*ov - 2*iv) / 2;
- mx += lw + iv;
- } else {
- /* ||<---M--->|<-S->|| */
- mw = (mw - iv) * m->mfact;
- lw = m->ww - mw - iv - 2*ov;
- }
- rw = lw;
- lx = m->wx + ov;
- ly = m->wy + oh;
- rx = mx + mw + iv;
- ry = m->wy + oh;
- }
-
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
- if (!m->nmaster || i < m->nmaster) {
- /* nmaster clients are stacked vertically, in the center of the screen */
- resize(c, mx, my, mw - (2*c->bw), mh * (c->cfact / mfacts) - (2*c->bw), 0);
- my += HEIGHT(c) + ih;
- } else {
- /* stack clients are stacked vertically */
- if ((i - m->nmaster) % 2 ) {
- resize(c, lx, ly, lw - (2*c->bw), lh * (c->cfact / lfacts) - (2*c->bw), 0);
- ly += HEIGHT(c) + ih;
- } else {
- resize(c, rx, ry, rw - (2*c->bw), rh * (c->cfact / rfacts) - (2*c->bw), 0);
- ry += HEIGHT(c) + ih;
- }
- }
- }
-}
-#elif VANITYGAPS_PATCH
-void
-centeredmaster(Monitor *m)
-{
- unsigned int i, n;
- int mx = 0, my = 0, mh = 0, mw = 0;
- int lx = 0, ly = 0, lw = 0, lh = 0;
- int rx = 0, ry = 0, rw = 0, rh = 0;
+ #if VANITYGAPS_PATCH
int oh, ov, ih, iv;
- int mn = 0, ln = 0, rn = 0; // number of clients in master, left and right area
- Client *c;
-
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;
- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
- if (!m->nmaster || n < m->nmaster)
- mn += 1;
- else if ((n - m->nmaster) % 2)
- ln += 1; // total factor of left hand stacke area
- else
- rn += 1; // total factor of right hand stack area
- }
-
/* initialize areas */
+ #if VANITYGAPS_PATCH
mx = m->wx + ov;
my = m->wy + oh;
mh = m->wh - 2*oh - ih * ((!m->nmaster ? n : MIN(n, m->nmaster)) - 1);
@@ -119,48 +47,7 @@ centeredmaster(Monitor *m)
rx = mx + mw + iv;
ry = m->wy + oh;
}
-
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
- if (!m->nmaster || i < m->nmaster) {
- /* nmaster clients are stacked vertically, in the center of the screen */
- resize(c, mx, my, mw - (2*c->bw), mh / mn - (2*c->bw), 0);
- my += HEIGHT(c) + ih;
- } else {
- /* stack clients are stacked vertically */
- if ((i - m->nmaster) % 2 ) {
- resize(c, lx, ly, lw - (2*c->bw), lh / ln - (2*c->bw), 0);
- ly += HEIGHT(c) + ih;
- } else {
- resize(c, rx, ry, rw - (2*c->bw), rh / rn - (2*c->bw), 0);
- ry += HEIGHT(c) + ih;
- }
- }
- }
-}
-#elif CFACTS_PATCH
-void
-centeredmaster(Monitor *m)
-{
- unsigned int i, n;
- int mx = 0, my = 0, mh = 0, mw = 0;
- int lx = 0, ly = 0, lw = 0, lh = 0;
- int rx = 0, ry = 0, rw = 0, rh = 0;
- float mfacts = 0, lfacts = 0, rfacts = 0;
- Client *c;
-
- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
- if (!m->nmaster || n < m->nmaster)
- mfacts += c->cfact; // total factor of master area
- else if ((n - m->nmaster) % 2)
- lfacts += c->cfact; // total factor of left hand stacke area
- else
- rfacts += c->cfact; // total factor of right hand stack area
- }
-
- if (n == 0)
- return;
-
- /* initialize areas */
+ #else
mx = m->wx;
my = m->wy;
mh = m->wh;
@@ -186,89 +73,87 @@ centeredmaster(Monitor *m)
rx = mx + mw;
ry = m->wy;
}
+ #endif // VANITYGAPS_PATCH
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
- if (!m->nmaster || i < m->nmaster) {
- /* nmaster clients are stacked vertically, in the center of the screen */
- resize(c, mx, my, mw - (2*c->bw), mh * (c->cfact / mfacts) - (2*c->bw), 0);
- my += HEIGHT(c);
- } else {
- /* stack clients are stacked vertically */
- if ((i - m->nmaster) % 2 ) {
- resize(c, lx, ly, lw - (2*c->bw), lh * (c->cfact / lfacts) - (2*c->bw), 0);
- ly += HEIGHT(c);
- } else {
- resize(c, rx, ry, rw - (2*c->bw), rh * (c->cfact / rfacts) - (2*c->bw), 0);
- ry += HEIGHT(c);
- }
- }
+ /* calculate facts */
+ #if CFACTS_PATCH
+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
+ if (!m->nmaster || n < m->nmaster)
+ mfacts += c->cfact; // total factor of master area
+ else if ((n - m->nmaster) % 2)
+ lfacts += c->cfact; // total factor of left hand stack area
+ else
+ rfacts += c->cfact; // total factor of right hand stack area
}
-}
-#else
-void
-centeredmaster(Monitor *m)
-{
- unsigned int i, n;
- int mx = 0, my = 0, mh = 0, mw = 0;
- int lx = 0, ly = 0, lw = 0, lh = 0;
- int rx = 0, ry = 0, rw = 0, rh = 0;
- int mn = 0, ln = 0, rn = 0; // number of clients in master, left and right area
- Client *c;
+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
+ if (!m->nmaster || n < m->nmaster)
+ mtotal += mh / mfacts;
+ else if ((n - m->nmaster) % 2)
+ ltotal += lh * (c->cfact / lfacts);
+ else
+ rtotal += rh * (c->cfact / rfacts);
+ #else
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
if (!m->nmaster || n < m->nmaster)
- mn += 1;
+ mfacts += 1;
else if ((n - m->nmaster) % 2)
- ln += 1; // total factor of left hand stacke area
+ lfacts += 1; // total factor of left hand stack area
else
- rn += 1; // total factor of right hand stack area
+ rfacts += 1; // total factor of right hand stack area
}
- if (n == 0)
- return;
+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
+ if (!m->nmaster || n < m->nmaster)
+ mtotal += mh / mfacts;
+ else if ((n - m->nmaster) % 2)
+ ltotal += lh / sfacts;
+ else
+ rtotal += rh / lfacts;
+ #endif // CFACTS_PATCH
- /* initialize areas */
- mx = m->wx;
- my = m->wy;
- mh = m->wh;
- mw = m->ww;
- lh = m->wh;
- rh = m->wh;
-
- if (m->nmaster && n > m->nmaster) {
- /* go mfact box in the center if more than nmaster clients */
- if (n - m->nmaster > 1) {
- /* ||<-S->|<---M--->|<-S->|| */
- mw = m->ww * m->mfact;
- lw = (m->ww - mw) / 2;
- mx += lw;
- } else {
- /* ||<---M--->|<-S->|| */
- mw = mw * m->mfact;
- lw = m->ww - mw;
- }
- rw = lw;
- lx = m->wx;
- ly = m->wy;
- rx = mx + mw;
- ry = m->wy;
- }
+ mrest = mh - mtotal;
+ lrest = lh - ltotal;
+ rrest = rh - rtotal;
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
if (!m->nmaster || i < m->nmaster) {
/* nmaster clients are stacked vertically, in the center of the screen */
- resize(c, mx, my, mw - (2*c->bw), mh / mn - (2*c->bw), 0);
+ #if CFACTS_PATCH
+ resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) * c->cfact + (i < mrest ? 1 : 0) - (2*c->bw), 0);
+ #else
+ resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0);
+ #endif // CFACTS_PATCH
+ #if VANITYGAPS_PATCH
+ my += HEIGHT(c) + ih;
+ #else
my += HEIGHT(c);
+ #endif
} else {
/* stack clients are stacked vertically */
if ((i - m->nmaster) % 2 ) {
- resize(c, lx, ly, lw - (2*c->bw), lh / ln - (2*c->bw), 0);
+ #if CFACTS_PATCH
+ resize(c, lx, ly, lw - (2*c->bw), (lh / lfacts) * c->cfact + ((i - 2*m->nmaster) < 2*lrest ? 1 : 0) - (2*c->bw), 0);
+ #else
+ resize(c, lx, ly, lw - (2*c->bw), (lh / lfacts) + ((i - 2*m->nmaster) < 2*lrest ? 1 : 0) - (2*c->bw), 0);
+ #endif // CFACTS_PATCH
+ #if VANITYGAPS_PATCH
+ ly += HEIGHT(c) + ih;
+ #else
ly += HEIGHT(c);
+ #endif
} else {
- resize(c, rx, ry, rw - (2*c->bw), rh / rn - (2*c->bw), 0);
+ #if CFACTS_PATCH
+ resize(c, rx, ry, rw - (2*c->bw), (rh / rfacts) * c->cfact + ((i - 2*m->nmaster) < 2*rrest ? 1 : 0) - (2*c->bw), 0);
+ #else
+ resize(c, rx, ry, rw - (2*c->bw), (rh / rfacts) + ((i - 2*m->nmaster) < 2*rrest ? 1 : 0) - (2*c->bw), 0);
+ #endif // CFACTS_PATCH
+ #if VANITYGAPS_PATCH
+ ry += HEIGHT(c) + ih;
+ #else
ry += HEIGHT(c);
+ #endif
}
}
}
-}
-#endif \ No newline at end of file
+} \ No newline at end of file