105 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* See LICENSE file for copyright and license details. */
 | |
| int bx, by, bw, bh, blw, mx, my, mw, mh, tx, ty, tw, th, wx, wy, ww, wh;
 | |
| 
 | |
| void setmfact(const char *arg);
 | |
| void tile(void);
 | |
| void tileresize(Client *c, int x, int y, int w, int h);
 | |
| void updatetilegeom(void);
 | |
| 
 | |
| void
 | |
| setmfact(const char *arg) {
 | |
| 	double d;
 | |
| 
 | |
| 	if(!arg || lt->arrange != tile)
 | |
| 		return;
 | |
| 	else {
 | |
| 		d = strtod(arg, NULL);
 | |
| 		if(arg[0] == '-' || arg[0] == '+')
 | |
| 			d += mfact;
 | |
| 		if(d < 0.1 || d > 0.9)
 | |
| 			return;
 | |
| 		mfact = d;
 | |
| 	}
 | |
| 	updatetilegeom();
 | |
| 	arrange();
 | |
| }
 | |
| 
 | |
| void
 | |
| tile(void) {
 | |
| 	int y, h;
 | |
| 	unsigned int i, n;
 | |
| 	Client *c;
 | |
| 
 | |
| 	for(n = 0, c = nextunfloating(clients); c; c = nextunfloating(c->next), n++);
 | |
| 	if(n == 0)
 | |
| 		return;
 | |
| 
 | |
| 	/* master */
 | |
| 	c = nextunfloating(clients);
 | |
| 
 | |
| 	if(n == 1)
 | |
| 		tileresize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw);
 | |
| 	else
 | |
| 		tileresize(c, mx, my, mw - 2 * c->bw, mh - 2 * c->bw);
 | |
| 
 | |
| 	if(--n == 0)
 | |
| 		return;
 | |
| 
 | |
| 	/* tile stack */
 | |
| 	y = ty;
 | |
| 	h = th / n;
 | |
| 	if(h < bh)
 | |
| 		h = th;
 | |
| 
 | |
| 	for(i = 0, c = nextunfloating(c->next); c; c = nextunfloating(c->next), i++) {
 | |
| 		if(i + 1 == n) /* remainder */
 | |
| 			tileresize(c, tx, y, tw - 2 * c->bw, (ty + th) - y - 2 * c->bw);
 | |
| 		else
 | |
| 			tileresize(c, tx, y, tw - 2 * c->bw, h - 2 * c->bw);
 | |
| 		if(h != th)
 | |
| 			y = c->y + c->h + 2 * c->bw;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void
 | |
| tileresize(Client *c, int x, int y, int w, int h) {
 | |
| 	resize(c, x, y, w, h, resizehints);
 | |
| 	if(resizehints && ((c->h < bh) || (c->h > h) || (c->w < bh) || (c->w > w)))
 | |
| 		/* client doesn't accept size constraints */
 | |
| 		resize(c, x, y, w, h, False);
 | |
| }
 | |
| 
 | |
| void
 | |
| zoom(const char *arg) {
 | |
| 	Client *c = sel;
 | |
| 
 | |
| 	if(c == nextunfloating(clients))
 | |
| 		if(!c || !(c = nextunfloating(c->next)))
 | |
| 			return;
 | |
| 	if(lt->arrange == tile && !sel->isfloating) {
 | |
| 		detach(c);
 | |
| 		attach(c);
 | |
| 		focus(c);
 | |
| 	}
 | |
| 	arrange();
 | |
| }
 | |
| 
 | |
| void
 | |
| updatetilegeom(void) {
 | |
| #ifdef TILEGEOM /* define your own if you are Xinerama user */
 | |
| 	TILEGEOM
 | |
| #else
 | |
| 	/* master area geometry */
 | |
| 	mx = wx;
 | |
| 	my = wy;
 | |
| 	mw = mfact * ww;
 | |
| 	mh = wh;
 | |
| 
 | |
| 	/* tile area geometry */
 | |
| 	tx = mx + mw;
 | |
| 	ty = wy;
 | |
| 	tw = ww - mw;
 | |
| 	th = wh;
 | |
| #endif
 | |
| }
 |