I realized earlier that my patch has a compile error in it - I renamed a
file and then diffed without changing an include in the header file.
Anyway, this one should work.
On Tue, Jun 1, 2010 at 9:10 AM, Niki Yoshiuchi <[email protected]> wrote:
> The biggest benefit I've found has simply been that the second client
> remains the same size regardless of how many clients you have open. That
> said, I am generally using dwm on a netbook so I rarely have more than 2 or
> 3 clients open on a single tag.
>
>
> On Tue, Jun 1, 2010 at 7:18 AM, <[email protected]> wrote:
>
>> > I've been using dvtm at work a lot recently so I figured I'd port the
>> > Fibonacci spiral/dwindle layouts to dvtm. This patch is for 0.5.2. I
>> find
>> > it's not as useful as the Fibonacci layouts in dwm but I figure why not
>> > release it anyway.
>> >
>> > -Niki Yoshiuchi
>>
>> Do these layouts provide any benefits? I found them rather useless
>> actually,
>> even in dwm... What do you use them for, and in what way do you use them
>> if
>> you don't mind sharing your experience?
>>
>>
>
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);
+}
+