diff options
| author | bakkeby <[email protected]> | 2019-09-09 21:35:19 +0200 |
|---|---|---|
| committer | bakkeby <[email protected]> | 2019-09-09 21:35:19 +0200 |
| commit | 637cc50ddafc5aedc24ebfc5498cfec38cb22cc0 (patch) | |
| tree | 15360754e45d3260f0afd35fbfb9ef6e580f130a | |
| parent | 973d64f51be939daa50d85151262d8602e09e978 (diff) | |
| download | dwm-flexipatch-637cc50ddafc5aedc24ebfc5498cfec38cb22cc0.tar.gz dwm-flexipatch-637cc50ddafc5aedc24ebfc5498cfec38cb22cc0.zip | |
Adding centered master patches
| -rw-r--r-- | README.md | 8 | ||||
| -rw-r--r-- | config.def.h | 6 | ||||
| -rw-r--r-- | patch/centeredfloatingmaster.c | 205 | ||||
| -rw-r--r-- | patch/centeredfloatingmaster.h | 1 | ||||
| -rw-r--r-- | patch/centeredmaster.c | 274 | ||||
| -rw-r--r-- | patch/centeredmaster.h | 1 | ||||
| -rw-r--r-- | patch/cfacts.c | 6 | ||||
| -rw-r--r-- | patch/cfacts.h | 2 | ||||
| -rw-r--r-- | patch/include.c | 8 | ||||
| -rw-r--r-- | patch/include.h | 8 | ||||
| -rw-r--r-- | patches.h | 10 |
11 files changed, 525 insertions, 4 deletions
@@ -11,7 +11,7 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t ### Changelog: -2019-09-09 - Added deck, fibonacci (dwindle and spiral), gridmode, gapplessgrid, horizgrid and nrowgrid layouts +2019-09-09 - Added deck, fibonacci (dwindle and spiral), gridmode, gapplessgrid, horizgrid, nrowgrid and centeredmaster layouts 2019-09-08 - Added cfacts and vanitygaps patches, added bstack and bstackhoriz layouts @@ -115,6 +115,12 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t - [bstackhoriz](https://dwm.suckless.org/patches/bottomstack/) - bottomstack horizontal layout + - [centeredmaster](https://dwm.suckless.org/patches/centeredmaster/) + - centeredmaster layout + + - [centeredfloatingmaster](https://dwm.suckless.org/patches/centeredmaster/) + - centeredfloatingmaster layout + - [deck](https://dwm.suckless.org/patches/deck/) - deck layout diff --git a/config.def.h b/config.def.h index 426da8c..c5f0757 100644 --- a/config.def.h +++ b/config.def.h @@ -112,6 +112,12 @@ static const Layout layouts[] = { #if BSTACKHORIZ_LAYOUT { "===", bstackhoriz }, #endif + #if CENTEREDMASTER_LAYOUT + { "|M|", centeredmaster }, + #endif + #if CENTEREDFLOATINGMASTER_LAYOUT + { ">M>", centeredfloatingmaster }, + #endif #if DECK_LAYOUT { "[D]", deck }, #endif diff --git a/patch/centeredfloatingmaster.c b/patch/centeredfloatingmaster.c new file mode 100644 index 0000000..d4fcb5d --- /dev/null +++ b/patch/centeredfloatingmaster.c @@ -0,0 +1,205 @@ +#if VANITYGAPS_PATCH && CFACTS_PATCH +void +centeredfloatingmaster(Monitor *m) +{ + unsigned int i, n; + float mivf, mfacts, sfacts; + int mx = 0, my = 0, mh = 0, mw = 0; + int sx = 0, sy = 0, sh = 0, sw = 0; + int oh, ov, ih, iv; + Client *c; + + getgaps(m, &oh, &ov, &ih, &iv, &n); + getfacts(m, &mfacts, &sfacts); + + if (n == 0) + return; + + mivf = 0.8; // master inner vertical gap factor + + sx = mx = m->wx + ov; + sy = my = m->wy + oh; + sh = mh = m->wh - 2*oh; + sw = mw = m->ww - 2*ov - iv*(n - 1); + + if (m->nmaster && n > m->nmaster) { + /* go mfact box in the center if more than nmaster clients */ + if (m->ww > m->wh) { + mw = m->ww * m->mfact - iv*mivf*(MIN(n, m->nmaster) - 1); + mh = m->wh * 0.9; + } else { + mw = m->ww * 0.9 - iv*mivf*(MIN(n, m->nmaster) - 1); + mh = m->wh * m->mfact; + } + mx = m->wx + (m->ww - mw) / 2; + my = m->wy + (m->wh - mh - 2*oh) / 2; + + sx = m->wx + ov; + sy = m->wy + oh; + sh = m->wh - 2*oh; + sw = m->ww - 2*ov - iv*(n - m->nmaster - 1); + } + + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { + if (i < m->nmaster) { + /* nmaster clients are stacked horizontally, in the center of the screen */ + resize(c, mx, my, mw * (c->cfact / mfacts) - (2*c->bw), mh - (2*c->bw), 0); + mx += WIDTH(c) + iv*mivf; + focus(c); + } else { + /* stack clients are stacked horizontally */ + resize(c, sx, sy, sw * (c->cfact / sfacts) - (2*c->bw), sh - (2*c->bw), 0); + sx += WIDTH(c) + iv; + } + } + restack(m); +} +#elif VANITYGAPS_PATCH +void +centeredfloatingmaster(Monitor *m) +{ + unsigned int i, n; + float mivf; + int mx = 0, my = 0, mh = 0, mw = 0; + int sx = 0, sy = 0, sh = 0, sw = 0; + int oh, ov, ih, iv; + Client *c; + + getgaps(m, &oh, &ov, &ih, &iv, &n); + + if (n == 0) + return; + + mivf = 0.8; // master inner vertical gap factor + + sx = mx = m->wx + ov; + sy = my = m->wy + oh; + sh = mh = m->wh - 2*oh; + sw = mw = m->ww - 2*ov - iv*(n - 1); + + if (m->nmaster && n > m->nmaster) { + /* go mfact box in the center if more than nmaster clients */ + if (m->ww > m->wh) { + mw = m->ww * m->mfact - iv*mivf*(MIN(n, m->nmaster) - 1); + mh = m->wh * 0.9; + } else { + mw = m->ww * 0.9 - iv*mivf*(MIN(n, m->nmaster) - 1); + mh = m->wh * m->mfact; + } + mx = m->wx + (m->ww - mw) / 2; + my = m->wy + (m->wh - mh - 2*oh) / 2; + + sx = m->wx + ov; + sy = m->wy + oh; + sh = m->wh - 2*oh; + sw = m->ww - 2*ov - iv*(n - m->nmaster - 1); + } + + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { + if (i < m->nmaster) { + /* nmaster clients are stacked horizontally, in the center of the screen */ + resize(c, mx, my, mw / MIN(n, m->nmaster) - (2*c->bw), mh - (2*c->bw), 0); + mx += WIDTH(c) + iv*mivf; + focus(c); + } else { + /* stack clients are stacked horizontally */ + resize(c, sx, sy, sw / (n - MIN(n, m->nmaster)) - (2*c->bw), sh - (2*c->bw), 0); + sx += WIDTH(c) + iv; + } + } + restack(m); +} +#elif CFACTS_PATCH +void +centeredfloatingmaster(Monitor *m) +{ + unsigned int i, n; + float mfacts, sfacts; + int mx = 0, my = 0, mh = 0, mw = 0; + int sx = 0, sy = 0, sh = 0, sw = 0; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 0) + return; + + getfacts(m, &mfacts, &sfacts); + + sx = mx = m->wx; + sy = my = m->wy; + sh = mh = m->wh; + sw = mw = m->ww; + + if (m->nmaster && n > m->nmaster) { + /* go mfact box in the center if more than nmaster clients */ + if (m->ww > m->wh) { + mw = m->ww * m->mfact; + mh = m->wh * 0.9; + } else { + mw = m->ww * 0.9; + mh = m->wh * m->mfact; + } + mx = m->wx + (m->ww - mw) / 2; + my = m->wy + (m->wh - mh) / 2; + } + + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { + if (i < m->nmaster) { + /* nmaster clients are stacked horizontally, in the center of the screen */ + resize(c, mx, my, mw * (c->cfact / mfacts) - (2*c->bw), mh - (2*c->bw), 0); + mx += WIDTH(c); + focus(c); + } else { + /* stack clients are stacked horizontally */ + resize(c, sx, sy, sw * (c->cfact / sfacts) - (2*c->bw), sh - (2*c->bw), 0); + sx += WIDTH(c); + } + } + restack(m); +} +#else +void +centeredfloatingmaster(Monitor *m) +{ + unsigned int i, n; + int mx = 0, my = 0, mh = 0, mw = 0; + int sx = 0, sy = 0, sh = 0, sw = 0; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 0) + return; + + sx = mx = m->wx; + sy = my = m->wy; + sh = mh = m->wh; + sw = mw = m->ww; + + if (m->nmaster && n > m->nmaster) { + /* go mfact box in the center if more than nmaster clients */ + if (m->ww > m->wh) { + mw = m->ww * m->mfact; + mh = m->wh * 0.9; + } else { + mw = m->ww * 0.9; + mh = m->wh * m->mfact; + } + mx = m->wx + (m->ww - mw) / 2; + my = m->wy + (m->wh - mh) / 2; + } + + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { + if (i < m->nmaster) { + /* nmaster clients are stacked horizontally, in the center of the screen */ + resize(c, mx, my, mw / MIN(n, m->nmaster) - (2*c->bw), mh - (2*c->bw), 0); + mx += WIDTH(c); + focus(c); + } else { + /* stack clients are stacked horizontally */ + resize(c, sx, sy, sw / (n - MIN(n, m->nmaster)) - (2*c->bw), sh - (2*c->bw), 0); + sx += WIDTH(c); + } + } + restack(m); +} +#endif
\ No newline at end of file diff --git a/patch/centeredfloatingmaster.h b/patch/centeredfloatingmaster.h new file mode 100644 index 0000000..e4147b3 --- /dev/null +++ b/patch/centeredfloatingmaster.h @@ -0,0 +1 @@ +static void centeredfloatingmaster(Monitor *m);
\ No newline at end of file diff --git a/patch/centeredmaster.c b/patch/centeredmaster.c new file mode 100644 index 0000000..bac7a5b --- /dev/null +++ b/patch/centeredmaster.c @@ -0,0 +1,274 @@ +#if VANITYGAPS_PATCH && 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; + int oh, ov, ih, iv; + float mfacts = 0, lfacts = 0, rfacts = 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; + 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); + + 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 */ + 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 / 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 */ + 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; + } + + 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); + } + } + } +} +#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) + 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 + } + + if (n == 0) + return; + + /* 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; + } + + 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); + } 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); + } else { + resize(c, rx, ry, rw - (2*c->bw), rh / rn - (2*c->bw), 0); + ry += HEIGHT(c); + } + } + } +} +#endif
\ No newline at end of file diff --git a/patch/centeredmaster.h b/patch/centeredmaster.h new file mode 100644 index 0000000..b047212 --- /dev/null +++ b/patch/centeredmaster.h @@ -0,0 +1 @@ +static void centeredmaster(Monitor *m);
\ No newline at end of file diff --git a/patch/cfacts.c b/patch/cfacts.c index b193c92..b06098a 100644 --- a/patch/cfacts.c +++ b/patch/cfacts.c @@ -1,5 +1,6 @@ void -setcfact(const Arg *arg) { +setcfact(const Arg *arg) +{ float f; Client *c; @@ -19,10 +20,11 @@ setcfact(const Arg *arg) { void getfacts(Monitor *m, float *mf, float *sf) { + unsigned int n; float mfacts = 0, sfacts = 0; Client *c; - for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) { + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) { if (!m->nmaster || n < m->nmaster) mfacts += c->cfact; else diff --git a/patch/cfacts.h b/patch/cfacts.h index 86d6ef8..1005f97 100644 --- a/patch/cfacts.h +++ b/patch/cfacts.h @@ -1,2 +1,2 @@ -static void getfacts(Monitor *m, float *mf, float *sf) +static void getfacts(Monitor *m, float *mf, float *sf); static void setcfact(const Arg *arg);
\ No newline at end of file diff --git a/patch/include.c b/patch/include.c index 2cd434e..156fbac 100644 --- a/patch/include.c +++ b/patch/include.c @@ -62,6 +62,14 @@ #include "bstackhoriz.c" #endif +#if CENTEREDMASTER_LAYOUT +#include "centeredmaster.c" +#endif + +#if CENTEREDFLOATINGMASTER_LAYOUT +#include "centeredfloatingmaster.c" +#endif + #if DECK_LAYOUT #include "deck.c" #endif diff --git a/patch/include.h b/patch/include.h index 280b27a..596f303 100644 --- a/patch/include.h +++ b/patch/include.h @@ -58,6 +58,14 @@ #include "bstackhoriz.h" #endif +#if CENTEREDMASTER_LAYOUT +#include "centeredmaster.h" +#endif + +#if CENTEREDFLOATINGMASTER_LAYOUT +#include "centeredfloatingmaster.h" +#endif + #if DECK_LAYOUT #include "deck.h" #endif @@ -197,6 +197,16 @@ */ #define BSTACKHORIZ_LAYOUT 0 +/* Centered master layout. + * https://dwm.suckless.org/patches/centeredmaster/ + */ +#define CENTEREDMASTER_LAYOUT 0 + +/* Centered floating master layout. + * https://dwm.suckless.org/patches/centeredmaster/ + */ +#define CENTEREDFLOATINGMASTER_LAYOUT 1 + /* Deck layout. * https://dwm.suckless.org/patches/deck/ */ |
