view.c
changeset 507 2824b5d0f0f0
parent 505 2c29d74b11dc
child 508 ede48935f2b3
equal deleted inserted replaced
506:b467b5a749db 507:2824b5d0f0f0
    97 	restack();
    97 	restack();
    98 }
    98 }
    99 
    99 
   100 /* This algorithm is based on a (M)aster area and a (S)tacking area.
   100 /* This algorithm is based on a (M)aster area and a (S)tacking area.
   101  * It supports following arrangements:
   101  * It supports following arrangements:
   102  * 	MMMS		MMMM		SMMM
   102  * 	SSMMM	MMMMM	MMMSS
   103  * 	MMMS		MMMM		SMMM
   103  * 	SSMMM	SSSSS	MMMSS
   104  * 	MMMS		SSSS		SMMM
       
   105  */
   104  */
   106 void
   105 void
   107 dotile(Arg *arg) {
   106 dotile(Arg *arg) {
   108 	int h, i, n, w;
   107 	int i, n, stackw, stackh, tw, th;
   109 	Client *c;
   108 	Client *c;
   110 
   109 
   111 	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
   110 	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
   112 		n++;
   111 		n++;
   113 
   112 
       
   113 	if(stackpos == StackBottom) {
       
   114 		stackw = sw;
       
   115 		stackh = sh - bh - master;
       
   116 	}
       
   117 	else {
       
   118 		stackw = sw - master;
       
   119 		stackh = sh - bh;
       
   120 	}
       
   121 
   114 	if(isvertical) {
   122 	if(isvertical) {
   115 		if(stackpos == StackBottom) {
   123 		tw = stackw;
   116 			w = sw;
   124 		if(n > 1)
   117 			if(n > 1)
   125 			th = stackh / (n - 1);
   118 				h = (sh - bh) / (n - 1);
   126 		else
   119 			else
   127 			th = stackh;
   120 				h = sh - bh;
   128 	}
   121 		}
   129 	else {
   122 		else {
   130 		th = stackh;
   123 			w = sw - master;
   131 		if(n > 1)
   124 			if(n > 1)
   132 			tw = stackw / (n - 1);
   125 				h = (sh - bh) / (n - 1);
   133 		else
   126 			else
   134 			tw = stackw;
   127 				h = sh - bh;
       
   128 		}
       
   129 	}
       
   130 	else { /* horizontal stack */
       
   131 
       
   132 	}
   135 	}
   133 
   136 
   134 	for(i = 0, c = clients; c; c = c->next) {
   137 	for(i = 0, c = clients; c; c = c->next) {
   135 		if(isvisible(c)) {
   138 		if(isvisible(c)) {
   136 			if(c->isfloat) {
   139 			if(c->isfloat) {
   137 				resize(c, True, TopLeft);
   140 				resize(c, True, TopLeft);
   138 				continue;
   141 				continue;
   139 			}
   142 			}
   140 			c->ismax = False;
   143 			c->ismax = False;
   141 			if(n == 1) {
   144 			if(n == 1) { /* only 1 window */
   142 				c->x = sx;
   145 				c->x = sx;
   143 				c->y = sy + bh;
   146 				c->y = sy + bh;
   144 				c->w = sw - 2 * BORDERPX;
   147 				c->w = sw - 2 * BORDERPX;
   145 				c->h = sh - 2 * BORDERPX - bh;
   148 				c->h = sh - 2 * BORDERPX - bh;
   146 			}
   149 			}
   147 			else if(i == 0) {
   150 			else if(i == 0) { /* master window */
       
   151 				c->x = sx;
       
   152 				if(stackpos == StackLeft)
       
   153 					c->x += master;
       
   154 				c->y = sy + bh;
       
   155 				if(isvertical) {
       
   156 					c->w = master - 2 * BORDERPX;
       
   157 					c->h = sh - 2 * BORDERPX - bh;
       
   158 				}
       
   159 				else {
       
   160 					c->w = sw;
       
   161 					c->h = master - 2 * BORDERPX;
       
   162 				}
       
   163 			}
       
   164 			else if((isvertical && th > bh) || (!isvertical && tw > MINW)) {
       
   165 				/* tile window */
       
   166 				c->x = sx;
       
   167 				if(isvertical)
       
   168 					c->y = sy + (i - 1) * th + bh;
       
   169 				else
       
   170 					c->y = sy + bh;
       
   171 				if(stackpos == StackRight)
       
   172 					c->x += master;
       
   173 				else if(stackpos == StackBottom)
       
   174 					c->y += master;
       
   175 				c->w = tw - 2 * BORDERPX;
       
   176 				c->h = th - 2 * BORDERPX;
       
   177 				if(i + 1 == n) { /* fixes for last tile to take up rest space */
       
   178 					if(isvertical)
       
   179 						c->h = sh - c->y - 2 * BORDERPX;
       
   180 					else {
       
   181 						if(stackpos == StackLeft)
       
   182 							c->w = master - c->x - 2 * BORDERPX;
       
   183 						else
       
   184 							c->w = sw - c->x - 2 * BORDERPX;
       
   185 					}
       
   186 				}
       
   187 			}
       
   188 			else { /* fallback if th < bh resp. tw < MINW */
   148 				c->x = sx;
   189 				c->x = sx;
   149 				c->y = sy + bh;
   190 				c->y = sy + bh;
   150 				c->w = master - 2 * BORDERPX;
   191 				if(stackpos == StackRight)
   151 				c->h = sh - 2 * BORDERPX - bh;
   192 					c->x += master;
   152 			}
   193 				else if(stackpos == StackBottom)
   153 			else if(h > bh) {
   194 					c->y += master;
   154 				c->x = sx + master;
   195 				c->w = stackw - 2 * BORDERPX;
   155 				c->y = sy + (i - 1) * h + bh;
   196 				c->h = stackh - 2 * BORDERPX;
   156 				c->w = w - 2 * BORDERPX;
       
   157 				if(i + 1 == n)
       
   158 					c->h = sh - c->y - 2 * BORDERPX;
       
   159 				else
       
   160 					c->h = h - 2 * BORDERPX;
       
   161 			}
       
   162 			else { /* fallback if h < bh */
       
   163 				c->x = sx + master;
       
   164 				c->y = sy + bh;
       
   165 				c->w = w - 2 * BORDERPX;
       
   166 				c->h = sh - 2 * BORDERPX - bh;
       
   167 			}
   197 			}
   168 			resize(c, False, TopLeft);
   198 			resize(c, False, TopLeft);
   169 			i++;
   199 			i++;
   170 		}
   200 		}
   171 		else
   201 		else
   230 			n++;
   260 			n++;
   231 	if(!sel || sel->isfloat || n < 2 || (arrange == dofloat))
   261 	if(!sel || sel->isfloat || n < 2 || (arrange == dofloat))
   232 		return;
   262 		return;
   233 
   263 
   234 	if(sel == getnext(clients)) {
   264 	if(sel == getnext(clients)) {
   235 		if(master + arg->i > sw - 100 || master + arg->i < 100)
   265 		if(master + arg->i > sw - MINW || master + arg->i < MINW)
   236 			return;
   266 			return;
   237 		master += arg->i;
   267 		master += arg->i;
   238 	}
   268 	}
   239 	else {
   269 	else {
   240 		if(master - arg->i > sw - 100 || master - arg->i < 100)
   270 		if(master - arg->i > sw - MINW || master - arg->i < MINW)
   241 			return;
   271 			return;
   242 		master -= arg->i;
   272 		master -= arg->i;
   243 	}
   273 	}
   244 	arrange(NULL);
   274 	arrange(NULL);
   245 }
   275 }