diff -upN a/config.def.h b/config.def.h --- a/config.def.h 2008-03-13 17:55:43.000000000 +0100 +++ b/config.def.h 2008-03-27 14:37:35.000000000 +0100 @@ -24,6 +24,7 @@ Rule rules[] = { /* layout(s) */ #define RESIZEHINTS True /* False - respect size hints in tiled resizals */ #define SNAP 32 /* snap pixel */ +#include "fibonacci.c" Layout layouts[] = { /* symbol function isfloating */ @@ -31,6 +32,8 @@ Layout layouts[] = { { "[]|", tileh, False }, { "><>", floating, True }, { "[M]", monocle, True }, + { "(@)", spiral, False }, + { "[\\]", dwindle, False }, }; /* key definitions */ @@ -49,6 +52,8 @@ Key keys[] = { { MODKEY, XK_f, setlayout, "><>" }, { MODKEY, XK_v, setlayout, "[]=" }, { MODKEY, XK_h, setlayout, "[]|" }, + { MODKEY, XK_s, setlayout, "(@)" }, + { MODKEY, XK_d, setlayout, "[\\]"}, { MODKEY|ShiftMask, XK_space, togglefloating, NULL }, { MODKEY|ShiftMask, XK_c, killclient, NULL }, { MODKEY, XK_0, view, NULL }, diff -upN /dev/null b/fibonacci.c --- /dev/null 1970-01-01 01:00:00.000000000 +0100 +++ b/fibonacci.c 2008-03-27 14:39:07.000000000 +0100 @@ -0,0 +1,60 @@ +void +fibonacci(int shape) { + unsigned int i, n, nx, ny, nw, nh; + Client *c; + + nx = wx; + ny = 0; + nw = ww; + nh = wh; + for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) + n++; + for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) { + if((i % 2 && nh / 2 > 2 * c->border) + || (!(i % 2) && nw / 2 > 2 * c->border)) + { + if(i < n - 1) { + if(i % 2) + nh /= 2; + else + nw /= 2; + if((i % 4) == 2 && !shape) + nx += nw; + else if((i % 4) == 3 && !shape) + ny += nh; + } + if((i % 4) == 0) { + if(shape) + ny += nh; + else + ny -= nh; + } + else if((i % 4) == 1) + nx += nw; + else if((i % 4) == 2) + ny += nh; + else if((i % 4) == 3) { + if(shape) + nx += nw; + else + nx -= nw; + } + if(i == 0) + ny = wy; + i++; + } + resize(c, nx, ny, nw - 2 * c->border, nh - 2 * c->border, False); + } + focus(NULL); + restack(); +} + +void +dwindle(void) { + fibonacci(1); +} + +void +spiral(void) { + fibonacci(0); +}