diff --git a/Makefile b/Makefile index ffa69b4..2f3e33f 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ clean: dist: clean mkdir -p dwm-${VERSION} cp -R LICENSE Makefile README config.def.h config.mk\ - dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION} + dwm.1 drw.h util.h ${SRC} tcl.c dwm.png transient.c dwm-${VERSION} tar -cf dwm-${VERSION}.tar dwm-${VERSION} gzip dwm-${VERSION}.tar rm -rf dwm-${VERSION} diff --git a/config.def.h b/config.def.h index e088319..a855fb6 100644 --- a/config.def.h +++ b/config.def.h @@ -1,4 +1,5 @@ /* See LICENSE file for copyright and license details. */ +#include "tcl.c" /* appearance */ static const unsigned int borderpx = 1; /* border pixel of windows */ @@ -42,8 +43,9 @@ static const int refreshrate = 120; /* refresh rate (per second) for client mov static const Layout layouts[] = { /* symbol arrange function */ { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ + { "|||", tcl }, /* triple column layout */ { "[M]", monocle }, + { "><>", NULL }, /* no layout function means floating behavior */ }; /* key definitions */ @@ -77,8 +79,9 @@ static const Key keys[] = { { MODKEY, XK_Tab, view, {0} }, { MODKEY|ShiftMask, XK_c, killclient, {0} }, { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_y, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[3]} }, { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_minus, setgaps, {.i = -5 } }, diff --git a/tcl.c b/tcl.c new file mode 100644 index 0000000..ccbda8d --- /dev/null +++ b/tcl.c @@ -0,0 +1,81 @@ +void +tcl(Monitor *m) +{ + int x, y, h, mw, sw, bdw, gap; + unsigned int i, n, rc, lc; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; + c = nexttiled(c->next), n++); + + if (n == 0) + return; + + gap = m->gappx; + c = nexttiled(m->clients); + + mw = m->mfact * m->ww; + sw = (m->ww - mw) / 2; + bdw = (2 * c->bw); + int rsw = m->ww - mw - sw; /* right stack absorbs remainder pixel */ + + /* master window */ + { + int mww = (n == 1 ? m->ww - 2 * gap : n == 2 ? mw - gap : mw - 2 * gap) - bdw; + int mwh = m->wh - bdw - 2 * gap; + resize(c, + (n < 3 ? m->wx : m->wx + sw) + gap, + m->wy + gap, + MAX(1, mww), MAX(1, mwh), + False); + } + + if (--n == 0) + return; + + c = nexttiled(c->next); + + /* 2 total windows: master + one stack window (right side) */ + if (n == 1) { + int sw2 = m->ww - mw - (2 * c->bw) - 2 * gap; + int sh2 = m->wh - (2 * c->bw) - 2 * gap; + resize(c, + m->wx + mw + gap, + m->wy + gap, + MAX(1, sw2), MAX(1, sh2), + False); + return; + } + + /* 3+ total windows: left stack | master | right stack */ + rc = n / 2; + lc = (n + 1) / 2; + + /* right stack */ + x = m->wx + mw + sw; + y = m->wy + gap; + for (i = 0; c && i < rc; c = nexttiled(c->next), i++) + { + int denom = rc - i; + if (denom <= 0) denom = 1; + h = (m->wh - (y - m->wy)) / denom - gap; + int rw = rsw - (2 * c->bw) - gap; + int rh = h - (2 * c->bw); + resize(c, x, y, MAX(1, rw), MAX(1, rh), False); + y += HEIGHT(c) + gap; + } + + /* left stack */ + x = m->wx + gap; + y = m->wy + gap; + for (i = 0; c; c = nexttiled(c->next), i++) + { + int denom = lc - i; + if (denom <= 0) denom = 1; + h = (m->wh - (y - m->wy)) / denom - gap; + int lw = sw - (2 * c->bw) - gap; + int lh = h - (2 * c->bw); + resize(c, x, y, MAX(1, lw), MAX(1, lh), False); + y += HEIGHT(c) + gap; + } +}