moved all tile()-related stuff into tile.c which is included from config.def.h, the default dwm is now nearly independent from the arrange() algorithm in use
This commit is contained in:
		
							parent
							
								
									42c4b31003
								
							
						
					
					
						commit
						4246affc15
					
				
							
								
								
									
										14
									
								
								config.def.h
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								config.def.h
									
									
									
									
									
								
							| @ -9,6 +9,7 @@ | |||||||
| #define SELBORDERCOLOR  "#0066ff" | #define SELBORDERCOLOR  "#0066ff" | ||||||
| #define SELBGCOLOR      "#0066ff" | #define SELBGCOLOR      "#0066ff" | ||||||
| #define SELFGCOLOR      "#ffffff" | #define SELFGCOLOR      "#ffffff" | ||||||
|  | #define SNAP            32    /* snap pixel */ | ||||||
| 
 | 
 | ||||||
| /* tagging */ | /* tagging */ | ||||||
| const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; | const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; | ||||||
| @ -19,15 +20,14 @@ Rule rules[] = { | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* layout(s) */ | /* layout(s) */ | ||||||
| #define MFACT       0.55  /* master factor [0.1 .. 0.9] */ |  | ||||||
| #define RESIZEHINTS True  /* False - respect size hints in tiled resizals */ | #define RESIZEHINTS True  /* False - respect size hints in tiled resizals */ | ||||||
| #define SNAP        32    /* snap pixel */ | #define MFACT       0.55  /* master factor [0.1 .. 0.9] */ | ||||||
| 
 | #include "tile.c" | ||||||
| Layout layouts[] = { | Layout layouts[] = { | ||||||
| 	/* symbol     function */ | 	/* symbol     arrange  geom */ | ||||||
| 	{ "[]=",      tile    }, /* first entry is default */ | 	{ "[]=",      tile,    tilegeom }, /* first entry is default */ | ||||||
| 	{ "><>",      NULL    }, /* no layout function means floating behavior */ | 	{ "><>",      NULL,             }, /* no layout function means floating behavior */ | ||||||
| 	{ "<M>",      monocle }, /* TODO: remove this */ | 	{ "<M>",      monocle, NULL     }, /* TODO: remove this */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* key definitions */ | /* key definitions */ | ||||||
|  | |||||||
							
								
								
									
										110
									
								
								dwm.c
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								dwm.c
									
									
									
									
									
								
							| @ -97,6 +97,7 @@ typedef struct { | |||||||
| typedef struct { | typedef struct { | ||||||
| 	const char *symbol; | 	const char *symbol; | ||||||
| 	void (*arrange)(void); | 	void (*arrange)(void); | ||||||
|  | 	void (*updategeom)(void); | ||||||
| } Layout; | } Layout; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| @ -152,7 +153,7 @@ void mappingnotify(XEvent *e); | |||||||
| void maprequest(XEvent *e); | void maprequest(XEvent *e); | ||||||
| void monocle(void); | void monocle(void); | ||||||
| void movemouse(Client *c); | void movemouse(Client *c); | ||||||
| Client *nexttiled(Client *c); | Client *nextunfloating(Client *c); | ||||||
| void propertynotify(XEvent *e); | void propertynotify(XEvent *e); | ||||||
| void quit(const char *arg); | void quit(const char *arg); | ||||||
| void resize(Client *c, int x, int y, int w, int h, Bool sizehints); | void resize(Client *c, int x, int y, int w, int h, Bool sizehints); | ||||||
| @ -161,14 +162,11 @@ void restack(void); | |||||||
| void run(void); | void run(void); | ||||||
| void scan(void); | void scan(void); | ||||||
| void setclientstate(Client *c, long state); | void setclientstate(Client *c, long state); | ||||||
| void setmfact(const char *arg); |  | ||||||
| void setup(void); | void setup(void); | ||||||
| void spawn(const char *arg); | void spawn(const char *arg); | ||||||
| void tag(const char *arg); | void tag(const char *arg); | ||||||
| unsigned int textnw(const char *text, unsigned int len); | unsigned int textnw(const char *text, unsigned int len); | ||||||
| unsigned int textw(const char *text); | unsigned int textw(const char *text); | ||||||
| void tileresize(Client *c, int x, int y, int w, int h); |  | ||||||
| void tile(void); |  | ||||||
| void togglefloating(const char *arg); | void togglefloating(const char *arg); | ||||||
| void togglelayout(const char *arg); | void togglelayout(const char *arg); | ||||||
| void toggletag(const char *arg); | void toggletag(const char *arg); | ||||||
| @ -192,9 +190,8 @@ void zoom(const char *arg); | |||||||
| char stext[256]; | char stext[256]; | ||||||
| int screen, sx, sy, sw, sh; | int screen, sx, sy, sw, sh; | ||||||
| int (*xerrorxlib)(Display *, XErrorEvent *); | int (*xerrorxlib)(Display *, XErrorEvent *); | ||||||
| int bx, by, bw, bh, blw, mx, my, mw, mh, tx, ty, tw, th, wx, wy, ww, wh; | int bx, by, bw, bh, blw, wx, wy, ww, wh; | ||||||
| int seltags = 0; | int seltags = 0; | ||||||
| double mfact; |  | ||||||
| unsigned int numlockmask = 0; | unsigned int numlockmask = 0; | ||||||
| void (*handler[LASTEvent]) (XEvent *) = { | void (*handler[LASTEvent]) (XEvent *) = { | ||||||
| 	[ButtonPress] = buttonpress, | 	[ButtonPress] = buttonpress, | ||||||
| @ -1072,7 +1069,7 @@ movemouse(Client *c) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Client * | Client * | ||||||
| nexttiled(Client *c) { | nextunfloating(Client *c) { | ||||||
| 	for(; c && (c->isfloating || !isvisible(c, NULL)); c = c->next); | 	for(; c && (c->isfloating || !isvisible(c, NULL)); c = c->next); | ||||||
| 	return c; | 	return c; | ||||||
| } | } | ||||||
| @ -1337,27 +1334,6 @@ setclientstate(Client *c, long state) { | |||||||
| 			PropModeReplace, (unsigned char *)data, 2); | 			PropModeReplace, (unsigned char *)data, 2); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* TODO: move this into tile.c */ |  | ||||||
| void |  | ||||||
| setmfact(const char *arg) { |  | ||||||
| 	double d; |  | ||||||
| 
 |  | ||||||
| 	if(!lt->arrange) /* TODO: check this against the actual tile() function */ |  | ||||||
| 		return; |  | ||||||
| 	if(!arg) |  | ||||||
| 		mfact = MFACT; |  | ||||||
| 	else { |  | ||||||
| 		d = strtod(arg, NULL); |  | ||||||
| 		if(arg[0] == '-' || arg[0] == '+') |  | ||||||
| 			d += mfact; |  | ||||||
| 		if(d < 0.1 || d > 0.9) |  | ||||||
| 			return; |  | ||||||
| 		mfact = d; |  | ||||||
| 	} |  | ||||||
| 	updategeom(); |  | ||||||
| 	arrange(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void | void | ||||||
| setup(void) { | setup(void) { | ||||||
| 	unsigned int i, w; | 	unsigned int i, w; | ||||||
| @ -1372,7 +1348,6 @@ setup(void) { | |||||||
| 	sw = DisplayWidth(dpy, screen); | 	sw = DisplayWidth(dpy, screen); | ||||||
| 	sh = DisplayHeight(dpy, screen); | 	sh = DisplayHeight(dpy, screen); | ||||||
| 	bh = dc.font.height + 2; | 	bh = dc.font.height + 2; | ||||||
| 	mfact = MFACT; |  | ||||||
| 	updategeom(); | 	updategeom(); | ||||||
| 
 | 
 | ||||||
| 	/* init atoms */ | 	/* init atoms */ | ||||||
| @ -1493,51 +1468,6 @@ textw(const char *text) { | |||||||
| 	return textnw(text, strlen(text)) + dc.font.height; | 	return textnw(text, strlen(text)) + dc.font.height; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 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 |  | ||||||
| tile(void) { |  | ||||||
| 	int y, h; |  | ||||||
| 	unsigned int i, n; |  | ||||||
| 	Client *c; |  | ||||||
| 
 |  | ||||||
| 	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next), n++); |  | ||||||
| 	if(n == 0) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	/* master */ |  | ||||||
| 	c = nexttiled(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 = nexttiled(c->next); c; c = nexttiled(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 | void | ||||||
| togglefloating(const char *arg) { | togglefloating(const char *arg) { | ||||||
| 	if(!sel) | 	if(!sel) | ||||||
| @ -1646,6 +1576,7 @@ updatebar(void) { | |||||||
| 
 | 
 | ||||||
| void | void | ||||||
| updategeom(void) { | updategeom(void) { | ||||||
|  | 	unsigned int i; | ||||||
| 
 | 
 | ||||||
| 	/* bar geometry */ | 	/* bar geometry */ | ||||||
| 	bx = 0; | 	bx = 0; | ||||||
| @ -1658,17 +1589,10 @@ updategeom(void) { | |||||||
| 	ww = sw; | 	ww = sw; | ||||||
| 	wh = sh - bh; | 	wh = sh - bh; | ||||||
| 
 | 
 | ||||||
| 	/* master area geometry */ | 	/* update layout geometries */ | ||||||
| 	mx = wx; | 	for(i = 0; i < LENGTH(layouts); i++) | ||||||
| 	my = wy; | 		if(layouts[i].updategeom) | ||||||
| 	mw = mfact * ww; | 			layouts[i].updategeom(); | ||||||
| 	mh = wh; |  | ||||||
| 
 |  | ||||||
| 	/* tile area geometry */ |  | ||||||
| 	tx = mx + mw; |  | ||||||
| 	ty = wy; |  | ||||||
| 	tw = ww - mw; |  | ||||||
| 	th = wh; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -1789,22 +1713,6 @@ xerrorstart(Display *dpy, XErrorEvent *ee) { | |||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* TODO: move this into tile.c */ |  | ||||||
| void |  | ||||||
| zoom(const char *arg) { |  | ||||||
| 	Client *c = sel; |  | ||||||
| 
 |  | ||||||
| 	if(c == nexttiled(clients)) |  | ||||||
| 		if(!c || !(c = nexttiled(c->next))) |  | ||||||
| 			return; |  | ||||||
| 	if(lt->arrange && !sel->isfloating) { /* TODO: check this against tile() */ |  | ||||||
| 		detach(c); |  | ||||||
| 		attach(c); |  | ||||||
| 		focus(c); |  | ||||||
| 	} |  | ||||||
| 	arrange(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int | int | ||||||
| main(int argc, char *argv[]) { | main(int argc, char *argv[]) { | ||||||
| 	if(argc == 2 && !strcmp("-v", argv[1])) | 	if(argc == 2 && !strcmp("-v", argv[1])) | ||||||
|  | |||||||
							
								
								
									
										103
									
								
								tile.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								tile.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | |||||||
|  | /* See LICENSE file for copyright and license details. */ | ||||||
|  | double mfact = MFACT; | ||||||
|  | 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 tilegeom(void); | ||||||
|  | void tileresize(Client *c, int x, int y, int w, int h); | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | setmfact(const char *arg) { | ||||||
|  | 	double d; | ||||||
|  | 
 | ||||||
|  | 	if(lt->arrange != tile) | ||||||
|  | 		return; | ||||||
|  | 	if(!arg) | ||||||
|  | 		mfact = MFACT; | ||||||
|  | 	else { | ||||||
|  | 		d = strtod(arg, NULL); | ||||||
|  | 		if(arg[0] == '-' || arg[0] == '+') | ||||||
|  | 			d += mfact; | ||||||
|  | 		if(d < 0.1 || d > 0.9) | ||||||
|  | 			return; | ||||||
|  | 		mfact = d; | ||||||
|  | 	} | ||||||
|  | 	updategeom(); | ||||||
|  | 	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 | ||||||
|  | tilegeom(void) { | ||||||
|  | 	/* 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; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 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(); | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Anselm R Garbe
						Anselm R Garbe