JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
separated layout-specific stuff into separate .h and .c files which are included...
[dwm.git] / tile.c
1 /* See LICENSE file for copyright and license details. */
2 #include "dwm.h"
3 #include <stdio.h>
4
5 /* static */
6
7 static double master = MASTER;
8
9 /* extern */
10
11 void
12 incmaster(const char *arg) {
13         double delta;
14
15         if(lt->arrange != tile)
16                 return;
17
18         /* arg handling, manipulate master */
19         if(arg && (1 == sscanf(arg, "%lf", &delta))) {
20                 if(delta + master > 0.1 && delta + master < 0.9)
21                         master += delta;
22         }
23
24         lt->arrange();
25 }
26
27 void
28 tile(void) {
29         unsigned int i, n, nx, ny, nw, nh, mw, th;
30         Client *c;
31
32         for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
33                 n++;
34
35         /* window geoms */
36         mw = (n == 1) ? waw : master * waw;
37         th = (n > 1) ? wah / (n - 1) : 0;
38         if(n > 1 && th < bh)
39                 th = wah;
40
41         nx = wax;
42         ny = way;
43         for(i = 0, c = clients; c; c = c->next)
44                 if(isvisible(c)) {
45                         unban(c);
46                         if(c->isfloating)
47                                 continue;
48                         c->ismax = False;
49                         if(i == 0) { /* master */
50                                 nw = mw - 2 * c->border;
51                                 nh = wah - 2 * c->border;
52                         }
53                         else {  /* tile window */
54                                 if(i == 1) {
55                                         ny = way;
56                                         nx += mw;
57                                 }
58                                 nw = waw - mw - 2 * c->border;
59                                 if(i + 1 == n) /* remainder */
60                                         nh = (way + wah) - ny - 2 * c->border;
61                                 else
62                                         nh = th - 2 * c->border;
63                         }
64                         resize(c, nx, ny, nw, nh, False);
65                         if(n > 1 && th != wah)
66                                 ny += nh + 2 * c->border;
67                         i++;
68                 }
69                 else
70                         ban(c);
71         focus(NULL);
72         restack();
73 }
74
75 void
76 zoom(const char *arg) {
77         Client *c;
78
79         if(!sel || lt->arrange == floating || sel->isfloating)
80                 return;
81         if((c = sel) == nexttiled(clients))
82                 if(!(c = nexttiled(c->next)))
83                         return;
84         detach(c);
85         attach(c);
86         focus(c);
87         lt->arrange();
88 }