diff -Naur dwm-2.7/config.default.h dwm-2.7-new/config.default.h --- dwm-2.7/config.default.h 2006-12-14 08:50:46.000000000 +0100 +++ dwm-2.7-new/config.default.h 2006-12-14 15:09:43.000000000 +0100 @@ -7,7 +7,9 @@ #define DEFMODE dotile /* dofloat */ #define FLOATSYMBOL "><>" -#define TILESYMBOL "[]=" +#define VSTACKSYMBOL "[]=" +#define BSTACKSYMBOL "===" +#define STACKPOS StackRight /* StackLeft */ #define FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*" #define NORMBGCOLOR "#333366" @@ -28,6 +30,7 @@ { MODKEY, XK_Tab, focusnext, { 0 } }, \ { MODKEY|ShiftMask, XK_Tab, focusprev, { 0 } }, \ { MODKEY, XK_Return, zoom, { 0 } }, \ + { MODKEY, XK_b, togglestackpos, { 0 } }, \ { MODKEY, XK_g, resizemaster, { .i = 15 } }, \ { MODKEY, XK_s, resizemaster, { .i = -15 } }, \ { MODKEY|ShiftMask, XK_0, tag, { .i = -1 } }, \ diff -Naur dwm-2.7/draw.c dwm-2.7-new/draw.c --- dwm-2.7/draw.c 2006-12-14 08:50:46.000000000 +0100 +++ dwm-2.7-new/draw.c 2006-12-14 15:09:43.000000000 +0100 @@ -120,7 +120,8 @@ dc.x += dc.w; } dc.w = bmw; - drawtext(arrange == dofloat ? FLOATSYMBOL : TILESYMBOL, dc.status, False, False); + drawtext(arrange == dofloat ? FLOATSYMBOL : stackpos == StackBottom ? + BSTACKSYMBOL : VSTACKSYMBOL, dc.status, False, False); x = dc.x + dc.w; dc.w = textw(stext); dc.x = bw - dc.w; diff -Naur dwm-2.7/dwm.h dwm-2.7-new/dwm.h --- dwm-2.7/dwm.h 2006-12-14 08:50:46.000000000 +0100 +++ dwm-2.7-new/dwm.h 2006-12-14 15:09:43.000000000 +0100 @@ -46,6 +46,10 @@ enum { ColFG, ColBG, ColLast }; /* color */ typedef enum { + StackLeft, StackBottom, StackRight +} StackPos; /* stack position */ + +typedef enum { TopLeft, TopRight, BotLeft, BotRight } Corner; /* window corners */ @@ -105,6 +109,7 @@ extern Cursor cursor[CurLast]; extern DC dc; /* global draw context */ extern Display *dpy; +extern StackPos stackpos; extern Window root, barwin; /* client.c */ @@ -162,6 +167,7 @@ extern Bool isvisible(Client *c); /* returns True if client is visible */ extern void resizemaster(Arg *arg); /* resizes the master percent with arg's index value */ extern void restack(void); /* restores z layers of all clients */ +extern void togglestackpos(Arg *arg); /* toggles stack position */ extern void togglefloat(Arg *arg); /* toggles focusesd client between floating/non-floating state */ extern void togglemode(Arg *arg); /* toggles global arrange function (dotile/dofloat) */ extern void toggleview(Arg *arg); /* toggles the tag with arg's index (in)visible */ diff -Naur dwm-2.7/event.c dwm-2.7-new/event.c --- dwm-2.7/event.c 2006-12-14 08:50:46.000000000 +0100 +++ dwm-2.7-new/event.c 2006-12-14 15:09:43.000000000 +0100 @@ -133,6 +133,8 @@ } if((ev->x < x + bmw) && (ev->button == Button1)) togglemode(NULL); + else if((ev->x < x + bmw) && (ev->button == Button3)) + togglestackpos(NULL); } else if((c = getclient(ev->window))) { focus(c); diff -Naur dwm-2.7/main.c dwm-2.7-new/main.c --- dwm-2.7/main.c 2006-12-14 08:50:46.000000000 +0100 +++ dwm-2.7-new/main.c 2006-12-14 15:09:43.000000000 +0100 @@ -128,7 +128,8 @@ dc.status[ColFG] = getcolor(STATUSFGCOLOR); setfont(FONT); /* geometry */ - bmw = textw(TILESYMBOL) > textw(FLOATSYMBOL) ? textw(TILESYMBOL) : textw(FLOATSYMBOL); + bmw = textw(VSTACKSYMBOL) > textw(BSTACKSYMBOL) ? textw(VSTACKSYMBOL) : textw(BSTACKSYMBOL); + bmw = bmw > textw(FLOATSYMBOL) ? bmw : textw(FLOATSYMBOL); sx = sy = 0; sw = DisplayWidth(dpy, screen); sh = DisplayHeight(dpy, screen); @@ -206,6 +207,9 @@ void quit(Arg *arg) { + Arg a; + a.i = -1; + view(&a); readin = running = False; } diff -Naur dwm-2.7/view.c dwm-2.7-new/view.c --- dwm-2.7/view.c 2006-12-14 08:50:46.000000000 +0100 +++ dwm-2.7-new/view.c 2006-12-14 15:09:43.000000000 +0100 @@ -37,6 +37,7 @@ /* extern */ void (*arrange)(void) = DEFMODE; +StackPos stackpos = STACKPOS; void detach(Client *c) { @@ -69,7 +70,7 @@ void dotile(void) { - unsigned int i, n, mpx, stackw, th; + unsigned int i, n, mpx, mpy, stackw, stackh, th, tw; Client *c; for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) @@ -77,6 +78,9 @@ mpx = (waw * master) / 1000; stackw = waw - mpx; + mpy = (wah * master) / 1000; + stackh = wah - mpy; + for(i = 0, c = clients; c; c = c->next) if(isvisible(c)) { if(c->isfloat) { @@ -91,19 +95,38 @@ c->h = wah - 2 * BORDERPX; } else if(i == 0) { /* master window */ - c->w = mpx - 2 * BORDERPX; - c->h = wah - 2 * BORDERPX; - th = wah / (n - 1); + if (stackpos == StackRight){ + c->w = mpx - 2 * BORDERPX; + c->h = wah - 2 * BORDERPX; + th = wah / (n - 1); + } + else { + c->w = waw - 2 * BORDERPX; + c->h = mpy - 2 * BORDERPX; + tw = waw / (n - 1); + } } else { /* tile window */ - c->x += mpx; - c->w = stackw - 2 * BORDERPX; - if(th > bh) { - c->y += (i - 1) * th; - c->h = th - 2 * BORDERPX; + if (stackpos == StackRight){ + c->x += mpx; + c->w = stackw - 2 * BORDERPX; + if(th > bh) { + c->y += (i - 1) * th; + c->h = th - 2 * BORDERPX; + } + else /* fallback if th < bh */ + c->h = wah - 2 * BORDERPX; + } + else{ + c->y += mpy; + c->h = stackh - 2 * BORDERPX; + if(tw > bh) { + c->x += (i - 1) * tw; + c->w = tw - 2 * BORDERPX; + } + else /* fallback if th < bh */ + c->w = waw - 2 * BORDERPX; } - else /* fallback if th < bh */ - c->h = wah - 2 * BORDERPX; } resize(c, False, TopLeft); i++; @@ -229,6 +252,14 @@ } void +togglestackpos(Arg *arg) { + if(arrange == dofloat) + return; + stackpos = stackpos == StackBottom ? STACKPOS : StackBottom; + arrange(); +} + +void view(Arg *arg) { unsigned int i;