- else
- ban(c);
- }
- if(!sel || !isvisible(sel)) {
- for(c = stack; c && !isvisible(c); c = c->snext);
- focus(c);
- }
- restack();
-}
-
-/* This algorithm is based on a (M)aster area and a (S)tacking area.
- * It supports following arrangements:
- * SSMMM MMMMM MMMSS
- * SSMMM SSSSS MMMSS
- */
-void
-dotile(Arg *arg) {
- int i, n, stackw, stackh, tw, th;
- Client *c;
-
- for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
- n++;
-
- if(stackpos == StackBottom) {
- stackw = sw;
- stackh = sh - bh - master;
- }
- else {
- stackw = sw - master;
- stackh = sh - bh;
- }
-
- tw = stackw;
- if(n > 1)
- th = stackh / (n - 1);
- else
- th = stackh;
-
- for(i = 0, c = clients; c; c = c->next) {
- if(isvisible(c)) {
- if(c->isfloat) {
- resize(c, True, TopLeft);
- continue;
- }
- c->ismax = False;
- c->x = sx;
- c->y = sy + bh;
- if(n == 1) { /* only 1 window */
- c->w = sw - 2 * BORDERPX;
- c->h = sh - 2 * BORDERPX - bh;
- }
- else if(i == 0) { /* master window */
- if(stackpos == StackLeft)
- c->x += stackw;
- switch(stackpos) {
- case StackLeft:
- case StackRight:
- c->w = master - 2 * BORDERPX;
- c->h = sh - bh - 2 * BORDERPX;
- break;
- case StackBottom:
- c->w = sw - 2 * BORDERPX;
- c->h = master - 2 * BORDERPX;
- break;
- }
- }
- else { /* tile window */
- if(stackpos == StackRight)
- c->x += master;
- if(th > bh) {
- switch(stackpos) {
- case StackLeft:
- case StackRight:
- c->y = sy + (i - 1) * th + bh;
- if(i + 1 == n)
- c->h = sh - c->y - 2 * BORDERPX;
- break;
- case StackBottom:
- c->y = sy + master + (i - 1) * th + bh;
- if(i + 1 == n)
- c->h = sh - c->y - 2 * BORDERPX;
- break;
- }
- c->w = tw - 2 * BORDERPX;
- c->h = th - 2 * BORDERPX;
- }
- else { /* fallback if th < bh */
- if(stackpos == StackBottom)
- c->y += master;
- c->w = stackw - 2 * BORDERPX;
- c->h = stackh - 2 * BORDERPX;
- }
- }
- resize(c, False, TopLeft);
- i++;