diff options
Diffstat (limited to 'screen.c')
-rw-r--r-- | screen.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/screen.c b/screen.c new file mode 100644 index 00000000..f2891cf6 --- /dev/null +++ b/screen.c @@ -0,0 +1,100 @@ +/* + * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> + * See LICENSE file for license details. + */ + +#include "dwm.h" + +void (*arrange)(Arg *) = tiling; + +void +view(Arg *arg) +{ + Client *c; + + tsel = arg->i; + arrange(NULL); + + for(c = clients; c; c = next(c->next)) + draw_client(c); + draw_bar(); +} + +void +floating(Arg *arg) +{ + Client *c; + + arrange = floating; + for(c = clients; c; c = c->next) { + if(c->tags[tsel]) + resize(c, True); + else + ban_client(c); + } + if(sel && !sel->tags[tsel]) { + if((sel = next(clients))) { + craise(sel); + focus(sel); + } + } + draw_bar(); +} + +void +tiling(Arg *arg) +{ + Client *c; + int n, i, w, h; + + w = sw - mw; + arrange = tiling; + for(n = 0, c = clients; c; c = c->next) + if(c->tags[tsel] && !c->floating) + n++; + + if(n > 1) + h = (sh - bh) / (n - 1); + else + h = sh - bh; + + for(i = 0, c = clients; c; c = c->next) { + if(c->tags[tsel]) { + if(c->floating) { + craise(c); + resize(c, True); + continue; + } + if(n == 1) { + c->x = sx; + c->y = sy + bh; + c->w = sw - 2 * c->border; + c->h = sh - 2 * c->border - bh; + } + else if(i == 0) { + c->x = sx; + c->y = sy + bh; + c->w = mw - 2 * c->border; + c->h = sh - 2 * c->border - bh; + } + else { + c->x = sx + mw; + c->y = sy + (i - 1) * h + bh; + c->w = w - 2 * c->border; + c->h = h - 2 * c->border; + } + resize(c, False); + i++; + } + else + ban_client(c); + } + if(!sel || (sel && !sel->tags[tsel])) { + if((sel = next(clients))) { + craise(sel); + focus(sel); + } + } + draw_bar(); +} + |