Adding centered master patches

This commit is contained in:
bakkeby 2019-09-09 21:35:19 +02:00
parent 973d64f51b
commit 637cc50dda
11 changed files with 525 additions and 4 deletions

View File

@ -11,7 +11,7 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t
### Changelog: ### 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 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/) - [bstackhoriz](https://dwm.suckless.org/patches/bottomstack/)
- bottomstack horizontal layout - 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](https://dwm.suckless.org/patches/deck/)
- deck layout - deck layout

View File

@ -112,6 +112,12 @@ static const Layout layouts[] = {
#if BSTACKHORIZ_LAYOUT #if BSTACKHORIZ_LAYOUT
{ "===", bstackhoriz }, { "===", bstackhoriz },
#endif #endif
#if CENTEREDMASTER_LAYOUT
{ "|M|", centeredmaster },
#endif
#if CENTEREDFLOATINGMASTER_LAYOUT
{ ">M>", centeredfloatingmaster },
#endif
#if DECK_LAYOUT #if DECK_LAYOUT
{ "[D]", deck }, { "[D]", deck },
#endif #endif

View File

@ -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

View File

@ -0,0 +1 @@
static void centeredfloatingmaster(Monitor *m);

274
patch/centeredmaster.c Normal file
View File

@ -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

1
patch/centeredmaster.h Normal file
View File

@ -0,0 +1 @@
static void centeredmaster(Monitor *m);

View File

@ -1,5 +1,6 @@
void void
setcfact(const Arg *arg) { setcfact(const Arg *arg)
{
float f; float f;
Client *c; Client *c;
@ -19,10 +20,11 @@ setcfact(const Arg *arg) {
void void
getfacts(Monitor *m, float *mf, float *sf) getfacts(Monitor *m, float *mf, float *sf)
{ {
unsigned int n;
float mfacts = 0, sfacts = 0; float mfacts = 0, sfacts = 0;
Client *c; 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) if (!m->nmaster || n < m->nmaster)
mfacts += c->cfact; mfacts += c->cfact;
else else

View File

@ -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); static void setcfact(const Arg *arg);

View File

@ -62,6 +62,14 @@
#include "bstackhoriz.c" #include "bstackhoriz.c"
#endif #endif
#if CENTEREDMASTER_LAYOUT
#include "centeredmaster.c"
#endif
#if CENTEREDFLOATINGMASTER_LAYOUT
#include "centeredfloatingmaster.c"
#endif
#if DECK_LAYOUT #if DECK_LAYOUT
#include "deck.c" #include "deck.c"
#endif #endif

View File

@ -58,6 +58,14 @@
#include "bstackhoriz.h" #include "bstackhoriz.h"
#endif #endif
#if CENTEREDMASTER_LAYOUT
#include "centeredmaster.h"
#endif
#if CENTEREDFLOATINGMASTER_LAYOUT
#include "centeredfloatingmaster.h"
#endif
#if DECK_LAYOUT #if DECK_LAYOUT
#include "deck.h" #include "deck.h"
#endif #endif

View File

@ -197,6 +197,16 @@
*/ */
#define BSTACKHORIZ_LAYOUT 0 #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. /* Deck layout.
* https://dwm.suckless.org/patches/deck/ * https://dwm.suckless.org/patches/deck/
*/ */