nmaster-ncol.c - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
nmaster-ncol.c (3474B)
---
1 enum {MaxMon = 8};
2 static int nmasters[MaxMon];
3 static int initnm = 0;
4
5 static void
6 initnmaster(void) {
7 int i;
8
9 if(initnm)
10 return;
11 for(i = 0; i < MaxMon; i++)
12 nmasters[i] = nmaster;
13 initnm = 1;
14 }
15
16 static void
17 incnmaster(const Arg *arg) {
18 if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->num >= MaxMon)
19 return;
20 nmasters[selmon->num] += arg->i;
21 if(nmasters[selmon->num] < 0)
22 nmasters[selmon->num] = 0;
23 arrange(NULL);
24 }
25
26 static void
27 setnmaster(const Arg *arg) {
28 if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->num >= MaxMon)
29 return;
30 nmasters[selmon->num] = arg->i > 0 ? arg->i : 0;
31 arrange(NULL);
32 }
33
34 static void
35 ntile(Monitor *m) {
36 int x, y, h, w, mw, nm;
37 unsigned int i, n;
38 Client *c;
39
40 initnmaster();
41 for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
42 c = nexttiled(m->clients);
43 nm = m->num < MaxMon ? nmasters[m->num] : nmaster;
44 if(nm > n)
45 nm = n;
46 /* master */
47 if(nm > 0) {
48 mw = m->mfact * m->ww;
49 h = m->wh / nm;
50 if(h < bh)
51 h = m->wh;
52 y = m->wy;
53 for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
54 resize(c, m->wx, y, (n == nm ? m->ww : mw) - 2 * c->bw,
55 ((i + 1 == nm) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
56 if(h != m->wh)
57 y = c->y + HEIGHT(c);
58 }
59 n -= nm;
60 } else
61 mw = 0;
62 if(n == 0)
63 return;
64 /* tile stack */
65 x = m->wx + mw;
66 y = m->wy;
67 w = m->ww - mw;
68 h = m->wh / n;
69 if(h < bh)
70 h = m->wh;
71 for(i = 0; c; c = nexttiled(c->next), i++) {
72 resize(c, x, y, w - 2 * c->bw,
73 ((i + 1 == n) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
74 if(h != m->wh)
75 y = c->y + HEIGHT(c);
76 }
77 }
78
79 static void
80 ncol(Monitor *m) {
81 int x, y, h, w, mw, nm;
82 unsigned int i, n;
83 Client *c;
84
85 initnmaster();
86 for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
87 c = nexttiled(m->clients);
88 nm = m->num < MaxMon ? nmasters[m->num] : nmaster;
89 if(nm > n)
90 nm = n;
91 /* master */
92 if(nm > 0) {
93 mw = (n == nm) ? m->ww : m->mfact * m->ww;
94 w = mw / nm;
95 x = m->wx;
96 for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
97 resize(c, x, m->wy, w - 2 * c->bw, m->wh - 2 * c->bw, False);
98 x = c->x + WIDTH(c);
99 }
100 n -= nm;
101 } else
102 mw = 0;
103 if(n == 0)
104 return;
105 /* tile stack */
106 x = m->wx + mw;
107 y = m->wy;
108 w = m->ww - mw;
109 h = m->wh / n;
110 if(h < bh)
111 h = m->wh;
112 for(i = 0; c; c = nexttiled(c->next), i++) {
113 resize(c, x, y, w - 2 * c->bw,
114 ((i + 1 == n) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
115 if(h != m->wh)
116 y = c->y + HEIGHT(c);
117 }
118 }
119
120 static void
121 nbstack(Monitor *m) {
122 int x, y, h, w, mh, nm;
123 unsigned int i, n;
124 Client *c;
125
126 initnmaster();
127 for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
128 c = nexttiled(m->clients);
129 nm = m->num < MaxMon ? nmasters[m->num] : nmaster;
130 if(nm > n)
131 nm = n;
132 /* master */
133 if(nm > 0) {
134 mh = m->mfact * m->wh;
135 w = m->ww / nm;
136 if(w < bh)
137 w = m->ww;
138 x = m->wx;
139 for(i = 0; i < nm; i++, c = nexttiled(c->next)) {
140 resize(c, x, m->wy, ((i + 1 == nm) ? m->wx + m->ww - x : w) - 2 * c->bw,
141 (n == nm ? m->wh : mh) - 2 * c->bw, False);
142 if(w != m->ww)
143 x = c->x + WIDTH(c);
144 }
145 n -= nm;
146 } else
147 mh = 0;
148 if(n == 0)
149 return;
150 /* tile stack */
151 x = m->wx;
152 y = m->wy + mh;
153 w = m->ww / n;
154 h = m->wh - mh;
155 if(w < bh)
156 w = m->ww;
157 for(i = 0; c; c = nexttiled(c->next), i++) {
158 resize(c, x, y, ((i + 1 == n) ? m->wx + m->ww - x : w) - 2 * c->bw,
159 h - 2 * c->bw, False);
160 if(w != m->ww)
161 x = c->x + WIDTH(c);
162 }
163 }