diff options
| author | Ivan Kanakarakis <ivan.kanak@gmail.com> | 2011-12-24 04:47:24 +0200 |
|---|---|---|
| committer | Ivan Kanakarakis <ivan.kanak@gmail.com> | 2011-12-24 04:48:34 +0200 |
| commit | 813d04de6bca611d70cde17c5c72ef6e9d7dd758 (patch) | |
| tree | da121c16fb02bf53f82f1b95df23bd711acb728c | |
| parent | 705dcc84a10f1607802e578f48fd30c3f572ff51 (diff) | |
work on tile() function
replace switch/case with if/else checks
having no stack windows is same as fullscreen mode
fix init of variables
fix winsize/winsz calculation
| -rw-r--r-- | monsterwm.c | 90 |
1 files changed, 38 insertions, 52 deletions
diff --git a/monsterwm.c b/monsterwm.c index bb9bb18..2b5a877 100644 --- a/monsterwm.c +++ b/monsterwm.c @@ -575,62 +575,48 @@ void switch_mode(const Arg *arg) { void tile(void) { if(!head) return; /* nothing to arange */ - int cx = 0, cy, cw = 0, ch = 0, n = 0; /* client x y coordinates, width and height, number of windows on the screen */ - int panel_height = (showpanel) ? PANEL_HEIGHT : 0; - cy = (TOP_PANEL) ? panel_height : 0; - - if(!head->next) { /* if only one window make it fullscreen */ - XMoveResizeWindow(dis, head->win, cx, cy, ww + 2*BORDER_WIDTH, wh + 2*BORDER_WIDTH); - return; - } - client *c; + int panel_height = (showpanel) ? PANEL_HEIGHT : 0; + int n = 0, winsz = mode == BSTACK ? ww : wh, cx = 0, cy = (TOP_PANEL) ? panel_height : 0, cw = 0, ch = 0; for(n=0, c=head->next; c; c=c->next, ++n); /* count windows on stack */ - if (n == 1) growth = 0; /* if only one window discard growth else justify */ - int winsize = ((mode == BSTACK ? ww : wh) - growth)/n; - growth += ((mode == BSTACK ? ww : wh) - growth)%n; + if(n > 1){ + winsz = (winsz - growth)/n; + growth += (winsz - growth)%n; /* adjust to match screen height/width */ + } else growth = 0; /* if only one (or no) window on stack discard growth */ - switch(mode) { - case TILE: - XMoveResizeWindow(dis, head->win, cx, cy, master_size - BORDER_WIDTH, wh - BORDER_WIDTH); - XMoveResizeWindow(dis, head->next->win, (cx = master_size + BORDER_WIDTH), cy, - (cw = ww - master_size - 2*BORDER_WIDTH), (ch = winsize - BORDER_WIDTH) + growth); - for(cy+=winsize+growth, c=head->next->next; c; c=c->next, cy+=winsize) - XMoveResizeWindow(dis, c->win, cx, cy, cw, ch); - break; - case MONOCLE: - for(c=head; c; c=c->next) - XMoveResizeWindow(dis, c->win, cx, cy, ww + 2*BORDER_WIDTH, wh + 2*BORDER_WIDTH); - break; - case BSTACK: - XMoveResizeWindow(dis, head->win, cx, cy, ww - BORDER_WIDTH, master_size - BORDER_WIDTH); - XMoveResizeWindow(dis, head->next->win, cx, (cy += master_size + BORDER_WIDTH), - (cw = winsize - BORDER_WIDTH) + growth, (ch = wh - master_size - 2*BORDER_WIDTH)); - for(cx+=winsize+growth, c=head->next->next; c; c=c->next, cx+=winsize) - XMoveResizeWindow(dis, c->win, cx, cy, cw, ch); - break; - case GRID: - ++n; /* include head on window count */ - int cols, rows, cn=0, rn=0, i=0; /* columns, rows, and current column and row number */ - for(cols=0; cols <= n/2; cols++) if(cols*cols >= n) break; - if(n == 5) cols = 2; - rows = n/cols; - cw = cols ? ww/cols : ww; - for(i=0, c=head; c; c=c->next, i++) { - if(i/rows + 1 > cols - n%cols) - rows = n/cols + 1; - ch = wh/rows; - cx = 0 + cn*cw; - cy = (TOP_PANEL ? panel_height : 0) + rn*ch; - XMoveResizeWindow(dis, c->win, cx, cy, cw - 2*BORDER_WIDTH, ch - 2*BORDER_WIDTH); - rn++; - if(rn >= rows) { - rn = 0; - cn++; - } + if(!head->next || mode == MONOCLE) { + for(c=head; c; c=c->next) XMoveResizeWindow(dis, c->win, cx, cy, ww + 2*BORDER_WIDTH, wh + 2*BORDER_WIDTH); + } else if(mode == TILE) { + XMoveResizeWindow(dis, head->win, cx, cy, master_size - BORDER_WIDTH, wh - BORDER_WIDTH); + XMoveResizeWindow(dis, head->next->win, (cx = master_size + BORDER_WIDTH), cy, + (cw = ww - master_size - 2*BORDER_WIDTH), (ch = winsz - BORDER_WIDTH) + growth); + for(cy+=winsz+growth, c=head->next->next; c; c=c->next, cy+=winsz) XMoveResizeWindow(dis, c->win, cx, cy, cw, ch); + } else if(mode == BSTACK) { + XMoveResizeWindow(dis, head->win, cx, cy, ww - BORDER_WIDTH, master_size - BORDER_WIDTH); + XMoveResizeWindow(dis, head->next->win, cx, (cy += master_size + BORDER_WIDTH), + (cw = winsz - BORDER_WIDTH) + growth, (ch = wh - master_size - 2*BORDER_WIDTH)); + for(cx+=winsz+growth, c=head->next->next; c; c=c->next, cx+=winsz) XMoveResizeWindow(dis, c->win, cx, cy, cw, ch); + } else if(mode == GRID) { + ++n; /* include head on window count */ + int cols, rows, cn=0, rn=0, i=0; /* columns, rows, and current column and row number */ + for(cols=0; cols <= n/2; cols++) if(cols*cols >= n) break; /* emulate square root */ + if(n == 5) cols = 2; + rows = n/cols; + cw = cols ? ww/cols : ww; + for(i=0, c=head; c; c=c->next, i++) { + if(i/rows + 1 > cols - n%cols) + rows = n/cols + 1; + ch = wh/rows; + cx = 0 + cn*cw; + cy = (TOP_PANEL ? panel_height : 0) + rn*ch; + XMoveResizeWindow(dis, c->win, cx, cy, cw - 2*BORDER_WIDTH, ch - 2*BORDER_WIDTH); + rn++; + if(rn >= rows) { + rn = 0; + cn++; } - break; - } + } + } else fprintf(stderr, "--> error: no such layout mode: %d\n", mode); free(c); } |
