comparison view.c @ 507:2824b5d0f0f0

prelim of dotile()
author Anselm R. Garbe <arg@10kloc.org>
date Fri, 29 Sep 2006 14:39:03 +0200
parents 2c29d74b11dc
children ede48935f2b3
comparison
equal deleted inserted replaced
506:b467b5a749db 507:2824b5d0f0f0
97 restack(); 97 restack();
98 } 98 }
99 99
100 /* This algorithm is based on a (M)aster area and a (S)tacking area. 100 /* This algorithm is based on a (M)aster area and a (S)tacking area.
101 * It supports following arrangements: 101 * It supports following arrangements:
102 * MMMS MMMM SMMM 102 * SSMMM MMMMM MMMSS
103 * MMMS MMMM SMMM 103 * SSMMM SSSSS MMMSS
104 * MMMS SSSS SMMM
105 */ 104 */
106 void 105 void
107 dotile(Arg *arg) { 106 dotile(Arg *arg) {
108 int h, i, n, w; 107 int i, n, stackw, stackh, tw, th;
109 Client *c; 108 Client *c;
110 109
111 for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) 110 for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
112 n++; 111 n++;
113 112
113 if(stackpos == StackBottom) {
114 stackw = sw;
115 stackh = sh - bh - master;
116 }
117 else {
118 stackw = sw - master;
119 stackh = sh - bh;
120 }
121
114 if(isvertical) { 122 if(isvertical) {
115 if(stackpos == StackBottom) { 123 tw = stackw;
116 w = sw; 124 if(n > 1)
117 if(n > 1) 125 th = stackh / (n - 1);
118 h = (sh - bh) / (n - 1); 126 else
119 else 127 th = stackh;
120 h = sh - bh; 128 }
121 } 129 else {
122 else { 130 th = stackh;
123 w = sw - master; 131 if(n > 1)
124 if(n > 1) 132 tw = stackw / (n - 1);
125 h = (sh - bh) / (n - 1); 133 else
126 else 134 tw = stackw;
127 h = sh - bh;
128 }
129 }
130 else { /* horizontal stack */
131
132 } 135 }
133 136
134 for(i = 0, c = clients; c; c = c->next) { 137 for(i = 0, c = clients; c; c = c->next) {
135 if(isvisible(c)) { 138 if(isvisible(c)) {
136 if(c->isfloat) { 139 if(c->isfloat) {
137 resize(c, True, TopLeft); 140 resize(c, True, TopLeft);
138 continue; 141 continue;
139 } 142 }
140 c->ismax = False; 143 c->ismax = False;
141 if(n == 1) { 144 if(n == 1) { /* only 1 window */
142 c->x = sx; 145 c->x = sx;
143 c->y = sy + bh; 146 c->y = sy + bh;
144 c->w = sw - 2 * BORDERPX; 147 c->w = sw - 2 * BORDERPX;
145 c->h = sh - 2 * BORDERPX - bh; 148 c->h = sh - 2 * BORDERPX - bh;
146 } 149 }
147 else if(i == 0) { 150 else if(i == 0) { /* master window */
151 c->x = sx;
152 if(stackpos == StackLeft)
153 c->x += master;
154 c->y = sy + bh;
155 if(isvertical) {
156 c->w = master - 2 * BORDERPX;
157 c->h = sh - 2 * BORDERPX - bh;
158 }
159 else {
160 c->w = sw;
161 c->h = master - 2 * BORDERPX;
162 }
163 }
164 else if((isvertical && th > bh) || (!isvertical && tw > MINW)) {
165 /* tile window */
166 c->x = sx;
167 if(isvertical)
168 c->y = sy + (i - 1) * th + bh;
169 else
170 c->y = sy + bh;
171 if(stackpos == StackRight)
172 c->x += master;
173 else if(stackpos == StackBottom)
174 c->y += master;
175 c->w = tw - 2 * BORDERPX;
176 c->h = th - 2 * BORDERPX;
177 if(i + 1 == n) { /* fixes for last tile to take up rest space */
178 if(isvertical)
179 c->h = sh - c->y - 2 * BORDERPX;
180 else {
181 if(stackpos == StackLeft)
182 c->w = master - c->x - 2 * BORDERPX;
183 else
184 c->w = sw - c->x - 2 * BORDERPX;
185 }
186 }
187 }
188 else { /* fallback if th < bh resp. tw < MINW */
148 c->x = sx; 189 c->x = sx;
149 c->y = sy + bh; 190 c->y = sy + bh;
150 c->w = master - 2 * BORDERPX; 191 if(stackpos == StackRight)
151 c->h = sh - 2 * BORDERPX - bh; 192 c->x += master;
152 } 193 else if(stackpos == StackBottom)
153 else if(h > bh) { 194 c->y += master;
154 c->x = sx + master; 195 c->w = stackw - 2 * BORDERPX;
155 c->y = sy + (i - 1) * h + bh; 196 c->h = stackh - 2 * BORDERPX;
156 c->w = w - 2 * BORDERPX;
157 if(i + 1 == n)
158 c->h = sh - c->y - 2 * BORDERPX;
159 else
160 c->h = h - 2 * BORDERPX;
161 }
162 else { /* fallback if h < bh */
163 c->x = sx + master;
164 c->y = sy + bh;
165 c->w = w - 2 * BORDERPX;
166 c->h = sh - 2 * BORDERPX - bh;
167 } 197 }
168 resize(c, False, TopLeft); 198 resize(c, False, TopLeft);
169 i++; 199 i++;
170 } 200 }
171 else 201 else
230 n++; 260 n++;
231 if(!sel || sel->isfloat || n < 2 || (arrange == dofloat)) 261 if(!sel || sel->isfloat || n < 2 || (arrange == dofloat))
232 return; 262 return;
233 263
234 if(sel == getnext(clients)) { 264 if(sel == getnext(clients)) {
235 if(master + arg->i > sw - 100 || master + arg->i < 100) 265 if(master + arg->i > sw - MINW || master + arg->i < MINW)
236 return; 266 return;
237 master += arg->i; 267 master += arg->i;
238 } 268 }
239 else { 269 else {
240 if(master - arg->i > sw - 100 || master - arg->i < 100) 270 if(master - arg->i > sw - MINW || master - arg->i < MINW)
241 return; 271 return;
242 master -= arg->i; 272 master -= arg->i;
243 } 273 }
244 arrange(NULL); 274 arrange(NULL);
245 } 275 }