diff --git a/README.md b/README.md index 0540da9..d5eeb0b 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/patches.h b/patches.h index 858ef7c..d272144 100644 --- a/patches.h +++ b/patches.h @@ -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/ */