diff -up a/config.def.h b/config.def.h --- a/config.def.h 2019-06-06 21:23:27.006661784 +0200 +++ b/config.def.h 2019-06-06 21:31:38.133319129 +0200 @@ -41,6 +41,8 @@ static const Layout layouts[] = { { "[]=", tile }, /* first entry is default */ { "><>", NULL }, /* no layout function means floating behavior */ { "[M]", monocle }, + { "TTT", bstack }, + { "===", bstackhoriz }, }; /* key definitions */ @@ -79,6 +81,8 @@ static Key keys[] = { { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, + { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, Only in a: config.def.h.orig Only in b: config.def.h.orig.orig Only in b: dwm-bottomstack-20160719-56a31dc.diff diff -up a/dwm.c b/dwm.c --- a/dwm.c 2019-06-06 21:23:27.023328450 +0200 +++ b/dwm.c 2019-06-06 21:31:38.133319129 +0200 @@ -235,6 +235,8 @@ static int xerror(Display *dpy, XErrorEv static int xerrordummy(Display *dpy, XErrorEvent *ee); static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); +static void bstack(Monitor *m); +static void bstackhoriz(Monitor *m); /* variables */ static const char broken[] = "broken"; @@ -2175,3 +2177,87 @@ main(int argc, char *argv[]) XCloseDisplay(dpy); return EXIT_SUCCESS; } + +void +bstack(Monitor *m) +{ + unsigned int i, n, w, mh, mx, tx; + float mfacts = 0, sfacts = 0; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) { + if (n < m->nmaster) + mfacts += c->cfact; + else + sfacts += c->cfact; + } + if (n == 0) + return; + if(n == 1){ + c = nexttiled(m->clients); + resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); + return; + } + + if (n > m->nmaster) + mh = m->nmaster ? m->wh * m->mfact : 0; + else + mh = m->wh; + for (i = 0, mx = tx = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + if (i < m->nmaster) { + w = (m->ww - mx) * (c->cfact / mfacts); + resize(c, m->wx + mx, m->wy, w - (2*c->bw), mh - 2*c->bw, 0); + if(mx + WIDTH(c) < m->mw) + mx += WIDTH(c); + mfacts -= c->cfact; + } else { + w = (m->ww - tx) * (c->cfact / sfacts); + resize(c, m->wx + tx, m->wy + mh, w - (2*c->bw), m->wh - mh - 2*(c->bw), 0); + if(tx + WIDTH(c) < m->mw) + tx += WIDTH(c); + sfacts -= c->cfact; + } +} + +void +bstackhoriz(Monitor *m) +{ + unsigned int i, n, h, mw, mh, my, ty; + float mfacts = 0, sfacts = 0; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) { + if (n < m->nmaster) + mfacts += c->cfact; + else + sfacts += c->cfact; + } + if (n == 0) + return; + if(n == 1){ + c = nexttiled(m->clients); + resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); + return; + } + + if (n > m->nmaster) + mh = m->nmaster ? m->wh * m->mfact : 0; + else + mh = m->wh; + mw = m->ww; + + for (i = ty = 0, my = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + if (i < m->nmaster) { + h = (mh - my) * (c->cfact / mfacts); + resize(c, m->wx, m->wy + my, mw - 2*c->bw, h - 2*c->bw, 0); + if(my + HEIGHT(c) < m->mh) + my += HEIGHT(c); + mfacts -= c->cfact; + } else { + h = (m->wh - mh - ty) * (c->cfact / sfacts); + resize(c, m->wx, m->wy + mh + ty, mw - 2*c->bw, h - (2*c->bw), 0); + if(ty + HEIGHT(c) < m->mh) + ty += HEIGHT(c); + sfacts -= c->cfact; + } +}