aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Kanakarakis <ivan.kanak@gmail.com>2011-12-24 04:47:24 +0200
committerIvan Kanakarakis <ivan.kanak@gmail.com>2011-12-24 04:48:34 +0200
commit813d04de6bca611d70cde17c5c72ef6e9d7dd758 (patch)
treeda121c16fb02bf53f82f1b95df23bd711acb728c
parent705dcc84a10f1607802e578f48fd30c3f572ff51 (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.c90
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);
}