diff --git a/config.h b/config.h index 0ef2458..563e8e5 100644 --- a/config.h +++ b/config.h @@ -44,12 +44,15 @@ #include "grid.c" #include "bstack.c" #include "fullscreen.c" +#include "fibonacci.c" Layout layouts[] = { { "[]=", tile }, { "+++", grid }, { "TTT", bstack }, { "[ ]", fullscreen }, + { "[@]", spiral }, + { "[\\]", dwindle }, }; #define MOD CTRL('g') @@ -66,12 +69,14 @@ Key keys[] = { { MOD, 'g', { setlayout, { "+++" } } }, { MOD, 'b', { setlayout, { "TTT" } } }, { MOD, 'm', { setlayout, { "[ ]" } } }, + { MOD, 's', { setlayout, { "[@]" } } }, + { MOD, 'd', { setlayout, { "[\\]" } } }, { MOD, ' ', { setlayout, { NULL } } }, { MOD, 'h', { setmwfact, { "-0.05" } } }, { MOD, 'l', { setmwfact, { "+0.05" } } }, { MOD, '.', { toggleminimize, { NULL } } }, #ifdef CONFIG_STATUSBAR - { MOD, 's', { togglebar, { NULL } } }, + { MOD, 'r', { togglebar, { NULL } } }, #endif #ifdef CONFIG_MOUSE { MOD, 'M', { mouse_toggle, { NULL } } }, diff --git a/fibonacci.c b/fibonacci.c new file mode 100644 index 0000000..a19941f --- /dev/null +++ b/fibonacci.c @@ -0,0 +1,84 @@ +static void +fibonacci(int s) { + unsigned int nx, ny, nw, nh, i, n, m, nm, mod; + Client *c; + + for(n = 0, m = 0, c = clients; c; c = c->next,n++) + if(c->minimized) + m++; + /* number of non minimized windows */ + nm = n - m; + + /* initial position and dimensions */ + nx = wax; + ny = way; + nw = waw; + nh = (wah - m); /* leave space for the minimized clients */ + + /* set the mod factor, 2 for dwindle, 4 for spiral */ + mod = s ? 4 : 2; + + for(i = 0, c = clients; c; c = c->next,i++) { + if(!c->minimized) { + /* dwindle: even case, spiral: case 0*/ + if(i % mod == 0) { + ny += (i == 0 ? 0 : nh) * (s ? -1 : 1); + /* TODO: first client uses the width factor, the rest divide by two */ + /* don't adjust the width for the last non-minimized client */ + if(i < nm - 1) + nw /= 2; + } + /* dwindle: odd case, spiral: case 1*/ + else if(i % mod == 1) { + nx += nw; + mvvline(ny, nx, ACS_VLINE, nh); + mvaddch(ny, nx, ACS_TTEE); + ++nx; + --nw; + /* don't adjust the height for the last non-minimized client */ + if(i < nm - 1) + nh /= 2; + } + /* spiral: case 2*/ + else if(i % mod == 2 && s) { + ny += nh; + /* don't adjust the width for the last non-minimized client */ + if(i < nm - 1) { + nw /= 2; + nx += nw; + mvvline(ny, nx, ACS_VLINE, nh); + mvaddch(ny, nx, ACS_TTEE); + ++nx; + } + } + /* spiral: case 3*/ + else if(s) { + nx -= nw; + --nw; + /* don't adjust the height for the last non-minimized client */ + if(i < nm - 1) { + nh /= 2; + ny += nh; + } + } + } else { + nh = 1; + nw = waw; + nx = wax; + ny = way + wah - (n - i); + } + + resize(c,nx,ny,nw,nh); + } +} + +static void +spiral(void) { + fibonacci(1); +} + +static void +dwindle(void) { + fibonacci(0); +} +