Turns out I had some time for this tonight. ;-) Here's the diffs against the latest git.
diff -Naur dvtm/config.h dvtm-lstack/config.h --- dvtm/config.h 2008-02-25 06:30:07.000000000 +0000 +++ dvtm-lstack/config.h 2008-02-25 06:37:02.000000000 +0000 @@ -43,6 +43,7 @@ #include "tile.c" #include "grid.c" #include "bstack.c" +#include "lstack.c" #include "fullscreen.c" Layout layouts[] = { @@ -50,6 +51,7 @@ { "+++", grid }, { "TTT", bstack }, { "[ ]", fullscreen }, + { "=[]", lstack }, }; #define MOD CTRL('g') @@ -63,6 +65,7 @@ { MOD, 'i', { focusprevnm, { NULL } } }, { MOD, 'k', { focusprev, { NULL } } }, { MOD, 't', { setlayout, { "[]=" } } }, + { MOD, 'T', { setlayout, { "=[]" } } }, { MOD, 'g', { setlayout, { "+++" } } }, { MOD, 'b', { setlayout, { "TTT" } } }, { MOD, 'm', { setlayout, { "[ ]" } } }, diff -Naur dvtm/dvtm.c dvtm-lstack/dvtm.c --- dvtm/dvtm.c 2008-02-25 06:30:07.000000000 +0000 +++ dvtm-lstack/dvtm.c 2008-02-25 06:22:55.000000000 +0000 @@ -403,7 +403,7 @@ setmwfact(const char *args[]) { double delta; - if(!isarrange(tile) && !isarrange(bstack)) + if(!isarrange(tile) && !isarrange(bstack) && !isarrange(lstack)) return; /* arg handling, manipulate mwfact */ if(args[0] == NULL) diff -Naur dvtm/lstack.c dvtm-lstack/lstack.c --- dvtm/lstack.c 1970-01-01 00:00:00.000000000 +0000 +++ dvtm-lstack/lstack.c 2008-02-25 06:22:55.000000000 +0000 @@ -0,0 +1,54 @@ +void +lstack(void) { + unsigned int i, m, n, nx, ny, nw, nh, nm, mw, th; + Client *c; + + /* number of minimized windows */ + for(n = 0, m = 0, c = clients; c; c = c->next, n++) + if(c->minimized) + m++; + /* number of nonminimized windows */ + nm = n - m; + /* window geoms */ + mw = (n == 1 || n - 1 == m) ? waw : waw * (1 - mwfact); + /* check if there are at least 2 non minimized clients */ + if(n - 1 > m) + th = (wah - m) / (nm - 1); + + nx = wax; + ny = way; + for(i = 0, c = clients; c; c = c->next, i++) { + if(i == 0) { /* master */ + nw = mw; + nh = (n - 1 > m) ? wah : wah - m; + nx += waw - mw - 1; + mvvline(ny, nx, ACS_VLINE, wah); + mvaddch(ny, nx, ACS_TTEE); + nx++; + } else { /* tile window */ + if(!c->minimized){ + if(i == 1) { + nx = wax; + ny = way; + nw = waw - mw - 1; + } + /* remainder */ + if(m == 0 && i + 1 == n) /* no minimized clients */ + nh = (way + wah) - ny; + else if(i == nm - 1) /* last not minimized client */ + nh = (way + wah - (n - i - 1)) - ny; + else + nh = th; + } else { + nh = 1; + ny = way + wah - (n - i); + } + if(i > 1 && nm > 1) + mvaddch(ny, wax + nw, ACS_RTEE); + } + resize(c,nx,ny,nw,nh); + if(n > 1 && th != wah) + ny += nh; + } +} +