23 return x; |
23 return x; |
24 } |
24 } |
25 |
25 |
26 static void |
26 static void |
27 tile(void) { |
27 tile(void) { |
28 double mscale = 0, tscale = 0, sum = 0; |
28 Bool mmaxtile = False, smaxtile = False; /* fallback tiling */ |
|
29 double mscale = 0, sscale = 0, sum = 0; |
29 unsigned int i, n, nx, ny, nw, nh, mw, tw; |
30 unsigned int i, n, nx, ny, nw, nh, mw, tw; |
30 Client *c; |
31 Client *c; |
31 |
32 |
|
33 /* preparation */ |
32 for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) |
34 for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) |
33 n++; |
35 n++; |
34 |
36 nx = wax; |
|
37 ny = way; |
35 mw = (n <= nmaster) ? waw : waw / (1 + hratio); |
38 mw = (n <= nmaster) ? waw : waw / (1 + hratio); |
36 tw = waw - mw; |
39 tw = waw - mw; |
37 |
|
38 if(n > 0) { |
40 if(n > 0) { |
39 if(n < nmaster) { |
41 if(n <= nmaster) { |
40 for(i = 0; i < n; i++) |
42 for(i = 0; i < n; i++) |
41 sum += spow(vratio, i); |
43 sum += spow(vratio, i); |
42 mscale = wah / sum; |
44 mscale = wah / sum; |
|
45 if(vratio >= 1) |
|
46 mmaxtile = bh > (mscale * spow(vratio, 0)); |
|
47 else |
|
48 mmaxtile = bh > (mscale * spow(vratio, n - 1)); |
43 } |
49 } |
44 else { |
50 else { |
45 for(i = 0; i < nmaster; i++) |
51 for(i = 0; i < nmaster; i++) |
46 sum += spow(vratio, i); |
52 sum += spow(vratio, i); |
47 mscale = wah / sum; |
53 mscale = wah / sum; |
48 for(sum = 0, i = 0; i < (n - nmaster); i++) |
54 for(sum = 0, i = 0; i < (n - nmaster); i++) |
49 sum += spow(vratio, i); |
55 sum += spow(vratio, i); |
50 tscale = wah / sum; |
56 sscale = wah / sum; |
51 } |
57 if(vratio >= 1) { |
52 } |
58 mmaxtile = bh > (mscale * spow(vratio, 0)); |
53 nx = wax; |
59 smaxtile = bh > (sscale * spow(vratio, 0)); |
54 ny = way; |
60 } |
|
61 else { |
|
62 mmaxtile = bh > (mscale * spow(vratio, nmaster - 1)); |
|
63 smaxtile = bh > (sscale * spow(vratio, n - nmaster - 1)); |
|
64 } |
|
65 } |
|
66 } |
|
67 /* tiling */ |
55 for(i = 0, c = clients; c; c = c->next) |
68 for(i = 0, c = clients; c; c = c->next) |
56 if(isvisible(c)) { |
69 if(isvisible(c)) { |
57 unban(c); |
70 unban(c); |
58 if(c->isfloating) |
71 if(c->isfloating) |
59 continue; |
72 continue; |
60 c->ismax = False; |
73 c->ismax = False; |
61 if(i < nmaster) { /* master window */ |
74 if(i < nmaster) { /* master window */ |
62 nw = mw - 2 * c->border; |
75 nw = mw - 2 * c->border; |
63 if(i + 1 == n || i + 1 == nmaster) |
76 if(mmaxtile) { |
64 nh = (way + wah) - ny - (2 * c->border); |
77 ny = way; |
|
78 nh = wah - 2 * c->border; |
|
79 } |
|
80 else if(i + 1 == (n < nmaster ? n : nmaster)) |
|
81 nh = (way + wah) - ny - 2 * c->border; |
65 else |
82 else |
66 nh = (mscale * spow(vratio, i)) - (2 * c->border); |
83 nh = (mscale * spow(vratio, i)) - 2 * c->border; |
67 } |
84 } |
68 else { /* tile window */ |
85 else { /* tile window */ |
|
86 nw = tw - 2 * c->border; |
69 if(i == nmaster) { |
87 if(i == nmaster) { |
70 ny = way; |
88 ny = way; |
71 nx = wax + mw; |
89 nx = wax + mw; |
72 } |
90 } |
73 nw = tw - 2 * c->border; |
91 if(smaxtile) { |
74 if(i + 1 == n) |
92 ny = way; |
75 nh = (way + wah) - ny - (2 * c->border); |
93 nh = wah - 2 * c->border; |
|
94 } |
|
95 else if(i + 1 == n) |
|
96 nh = (way + wah) - ny - 2 * c->border; |
76 else |
97 else |
77 nh = (tscale * spow(vratio, i - nmaster)) - (2 * c->border); |
98 nh = (sscale * spow(vratio, i - nmaster)) - 2 * c->border; |
78 } |
|
79 if(nh < bh) { |
|
80 nh = bh; |
|
81 ny = way + wah - nh; |
|
82 } |
99 } |
83 resize(c, nx, ny, nw, nh, False); |
100 resize(c, nx, ny, nw, nh, False); |
84 ny += nh; |
101 ny += nh; |
85 i++; |
102 i++; |
86 } |
103 } |