Mercurial > hg > index.fcgi > dwm > dwm-3.6.1-10pba
comparison layout.c @ 5:e060ab82b136
gapless grid
author | paulo@thepaulopc |
---|---|
date | Wed, 27 Jan 2010 23:28:29 -0800 |
parents | faa4cb9d7bd6 |
children |
comparison
equal
deleted
inserted
replaced
2:49d41869cdb0 | 3:a2dde5f412d7 |
---|---|
220 restack(); | 220 restack(); |
221 } | 221 } |
222 | 222 |
223 static void | 223 static void |
224 grid(void) { | 224 grid(void) { |
225 unsigned int i, n, nx, ny, nw, nh, aw, ah, tw, th, cols, rows; | 225 unsigned int n, cols, rows, cn, rn, i, cx, cy, cw, ch; |
226 Client *c; | 226 Client *c; |
227 | 227 |
228 for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) | 228 for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) |
229 n++; | 229 n++; |
230 if(n == 0) | |
231 return; | |
230 | 232 |
231 for(rows = 0; rows <= n/2; rows++) | 233 /* grid dimensions */ |
232 if(rows*rows >= n) | 234 for(cols = 0; cols <= n/2; cols++) |
235 if(cols*cols >= n) | |
233 break; | 236 break; |
234 cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows; | 237 if(n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */ |
238 cols = 2; | |
239 rows = n/cols; | |
235 | 240 |
236 th = wah / (rows ? rows : 1); | 241 /* window geometries */ |
237 tw = waw / (cols ? cols : 1); | 242 cw = cols ? waw / cols : waw; |
238 nw = tw - 2 * BORDERPX; | 243 cn = 0; /* current column number */ |
239 nh = th - 2 * BORDERPX; | 244 rn = 0; /* current row number */ |
240 | 245 for(i = 0, c = clients; c; c = c->next) |
241 for(i = 0, c = clients; c; c = c->next) | 246 if(isvisible(c)) { |
242 if(isvisible(c)) { | 247 if(i/rows + 1 > cols - n%cols) |
243 if(c->isbanned) | 248 rows = n/cols + 1; |
244 XMoveWindow(dpy, c->win, c->x, c->y); | 249 ch = rows ? wah / rows : wah; |
245 c->isbanned = False; | 250 cx = cn*cw; |
246 if(c->isversatile) | 251 cy = (TOPBAR ? dc.h : 0) + rn*ch; |
247 continue; | 252 resize(c, cx, cy, cw - 2 * BORDERPX, ch - 2 * BORDERPX, False); |
248 c->ismax = False; | 253 rn++; |
249 nx = (i / rows) * tw; | 254 if(rn >= rows) { |
250 ny = (i % rows) * th + (TOPBAR ? dc.h : 0); | 255 rn = 0; |
251 /* adjust height and width of last row's and last column's windows */ | 256 cn++; |
252 ah = ((i + 1) % rows == 0) ? wah - th * rows : 0; | 257 } |
253 aw = (i >= rows * (cols - 1)) ? waw - tw * cols : 0; | |
254 resize(c, nx, ny, nw + aw, nh + ah, False); | |
255 i++; | 258 i++; |
256 } | 259 } |
257 else { | 260 else { |
258 c->isbanned = True; | 261 c->isbanned = True; |
259 XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); | 262 XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); |
260 } | 263 } |
261 | 264 |
262 if(!sel || !isvisible(sel)) { | 265 if(!sel || !isvisible(sel)) { |
263 for(c = stack; c && !isvisible(c); c = c->snext); | 266 for(c = stack; c && !isvisible(c); c = c->snext); |
264 focus(c); | 267 focus(c); |
265 } | 268 } |
266 restack(); | 269 restack(); |