-
Notifications
You must be signed in to change notification settings - Fork 106
/
fibonacci.c
94 lines (87 loc) · 1.95 KB
/
fibonacci.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
static void fibonacci(int s)
{
unsigned int nx, ny, nw, nnw, nh, nnh, i, n, mod;
Client *c;
for (n = 0, c = nextvisible(clients); c; c = nextvisible(c->next))
if (!c->minimized)
n++;
/* initial position and dimensions */
nx = wax;
ny = way;
nw = (n == 1) ? waw : screen.mfact * waw;
/* don't waste space dviding by 2 doesn't work for odd numbers
* plus we need space for the border too. therefore set up these
* variables for the next new width/height
*/
nnw = waw - nw - 1;
nnh = nh = wah;
/* set the mod factor, 2 for dwindle, 4 for spiral */
mod = s ? 4 : 2;
for (i = 0, c = nextvisible(clients); c; c = nextvisible(c->next)) {
if (c->minimized)
continue;
/* dwindle: even case, spiral: case 0 */
if (i % mod == 0) {
if (i) {
if (s) {
nh = nnh;
ny -= nh;
} else {
ny += nh;
nh = nnh;
}
/* don't adjust the width for the last client */
if (i < n - 1) {
nw /= 2;
nnw -= nw + 1;
}
mvaddch(ny, nx - 1, ACS_LTEE);
}
} else if (i % mod == 1) { /* dwindle: odd case, spiral: case 1 */
nx += nw;
mvvline(ny, nx, ACS_VLINE, nh);
mvaddch(ny, nx, ACS_TTEE);
++nx;
nw = nnw;
/* don't adjust the height for the last client */
if (i < n - 1) {
nh /= 2;
nnh -= nh;
}
} else if (i % mod == 2 && s) { /* spiral: case 2 */
ny += nh;
nh = nnh;
/* don't adjust the width for the last client */
if (i < n - 1) {
nw /= 2;
nnw -= nw + 1;
nx += nnw;
mvvline(ny, nx, ACS_VLINE, nh);
mvaddch(ny, nx, ACS_TTEE);
++nx;
} else {
mvaddch(ny, nx - 1, ACS_LTEE);
}
} else if (s) { /* spiral: case 3 */
nw = nnw;
nx -= nw + 1; /* border */
/* don't adjust the height for the last client */
if (i < n - 1) {
nh /= 2;
nnh -= nh;
ny += nnh;
}
mvaddch(ny, nx - 1, ACS_LTEE);
}
resize(c, nx, ny, nw, nh);
i++;
}
}
static void spiral(void)
{
fibonacci(1);
}
static void dwindle(void)
{
fibonacci(0);
}