separated layout-specific stuff into separate .h and .c files which are included in config.h resp. config.mk - this allows writing layouts for dwm without any need to patch existing code
This commit is contained in:
		
							parent
							
								
									b5eea45a31
								
							
						
					
					
						commit
						2d81b78b85
					
				
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -3,7 +3,7 @@ | |||||||
| 
 | 
 | ||||||
| include config.mk | include config.mk | ||||||
| 
 | 
 | ||||||
| SRC = client.c draw.c event.c layout.c main.c tag.c util.c | SRC += client.c draw.c event.c layout.c main.c tag.c util.c | ||||||
| OBJ = ${SRC:.c=.o} | OBJ = ${SRC:.c=.o} | ||||||
| 
 | 
 | ||||||
| all: options dwm | all: options dwm | ||||||
|  | |||||||
							
								
								
									
										6
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								client.c
									
									
									
									
									
								
							| @ -230,7 +230,7 @@ manage(Window w, XWindowAttributes *wa) { | |||||||
| 	setclientstate(c, IconicState); | 	setclientstate(c, IconicState); | ||||||
| 	c->isbanned = True; | 	c->isbanned = True; | ||||||
| 	focus(c); | 	focus(c); | ||||||
| 	lt->arrange(NULL); | 	lt->arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -305,7 +305,7 @@ togglefloating(const char *arg) { | |||||||
| 	sel->isfloating = !sel->isfloating; | 	sel->isfloating = !sel->isfloating; | ||||||
| 	if(sel->isfloating) | 	if(sel->isfloating) | ||||||
| 		resize(sel, sel->x, sel->y, sel->w, sel->h, True); | 		resize(sel, sel->x, sel->y, sel->w, sel->h, True); | ||||||
| 	lt->arrange(NULL); | 	lt->arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -337,7 +337,7 @@ unmanage(Client *c) { | |||||||
| 	XSync(dpy, False); | 	XSync(dpy, False); | ||||||
| 	XSetErrorHandler(xerror); | 	XSetErrorHandler(xerror); | ||||||
| 	XUngrabServer(dpy); | 	XUngrabServer(dpy); | ||||||
| 	lt->arrange(NULL); | 	lt->arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
|  | |||||||
| @ -24,7 +24,8 @@ static Rule rule[] = { \ | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* layout(s) */ | /* layout(s) */ | ||||||
| void tile(const char *arg);		/* arranges all windows tiled */ | #include "tile.h" | ||||||
|  | #include "float.h" | ||||||
| #define LAYOUTS \ | #define LAYOUTS \ | ||||||
| static Layout layout[] = { \ | static Layout layout[] = { \ | ||||||
| 	/* symbol		function */ \ | 	/* symbol		function */ \ | ||||||
| @ -46,10 +47,10 @@ static Key key[] = { \ | |||||||
| 		"exec urxvtcd -tr -bg '#111' -fg '#eee' -cr '#eee' +sb -fn '"FONT"'" }, \ | 		"exec urxvtcd -tr -bg '#111' -fg '#eee' -cr '#eee' +sb -fn '"FONT"'" }, \ | ||||||
| 	{ MODKEY,			XK_space,	setlayout,	NULL }, \ | 	{ MODKEY,			XK_space,	setlayout,	NULL }, \ | ||||||
| 	{ MODKEY,			XK_b,		togglebar,	NULL }, \ | 	{ MODKEY,			XK_b,		togglebar,	NULL }, \ | ||||||
| 	{ MODKEY,			XK_h,		tile,		"-0.05" }, \ |  | ||||||
| 	{ MODKEY,			XK_j,		focusclient,	"1" }, \ | 	{ MODKEY,			XK_j,		focusclient,	"1" }, \ | ||||||
| 	{ MODKEY,			XK_k,		focusclient,	"-1" }, \ | 	{ MODKEY,			XK_k,		focusclient,	"-1" }, \ | ||||||
| 	{ MODKEY,			XK_l,		tile,		"0.05" }, \ | 	{ MODKEY,			XK_h,		incmaster,	"-0.05" }, \ | ||||||
|  | 	{ MODKEY,			XK_l,		incmaster,	"0.05" }, \ | ||||||
| 	{ MODKEY,			XK_m,		togglemax,	NULL }, \ | 	{ MODKEY,			XK_m,		togglemax,	NULL }, \ | ||||||
| 	{ MODKEY,			XK_Return,	zoom,		NULL }, \ | 	{ MODKEY,			XK_Return,	zoom,		NULL }, \ | ||||||
| 	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL }, \ | 	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL }, \ | ||||||
|  | |||||||
| @ -25,7 +25,8 @@ static Rule rule[] = { \ | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* layout(s) */ | /* layout(s) */ | ||||||
| void tile(const char *arg);		/* arranges all windows tiled */ | #include "tile.h" | ||||||
|  | #include "float.h" | ||||||
| #define LAYOUTS \ | #define LAYOUTS \ | ||||||
| static Layout layout[] = { \ | static Layout layout[] = { \ | ||||||
| 	/* symbol		function */ \ | 	/* symbol		function */ \ | ||||||
| @ -44,10 +45,10 @@ static Key key[] = { \ | |||||||
| 	{ MODKEY,			XK_p,		spawn, 		"exe=`dmenu_path | dmenu` && exec $exe" }, \ | 	{ MODKEY,			XK_p,		spawn, 		"exe=`dmenu_path | dmenu` && exec $exe" }, \ | ||||||
| 	{ MODKEY,			XK_space,	setlayout,	NULL }, \ | 	{ MODKEY,			XK_space,	setlayout,	NULL }, \ | ||||||
| 	{ MODKEY,			XK_b,		togglebar,	NULL }, \ | 	{ MODKEY,			XK_b,		togglebar,	NULL }, \ | ||||||
| 	{ MODKEY,			XK_h,		tile,		"-0.05" }, \ |  | ||||||
| 	{ MODKEY,			XK_j,		focusclient,	"1" }, \ | 	{ MODKEY,			XK_j,		focusclient,	"1" }, \ | ||||||
| 	{ MODKEY,			XK_k,		focusclient,	"-1" }, \ | 	{ MODKEY,			XK_k,		focusclient,	"-1" }, \ | ||||||
| 	{ MODKEY,			XK_l,		tile,		"0.05" }, \ | 	{ MODKEY,			XK_h,		incmaster,	"-0.05" }, \ | ||||||
|  | 	{ MODKEY,			XK_l,		incmaster,	"0.05" }, \ | ||||||
| 	{ MODKEY,			XK_m,		togglemax,	NULL }, \ | 	{ MODKEY,			XK_m,		togglemax,	NULL }, \ | ||||||
| 	{ MODKEY,			XK_Return,	zoom,		NULL }, \ | 	{ MODKEY,			XK_Return,	zoom,		NULL }, \ | ||||||
| 	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL }, \ | 	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL }, \ | ||||||
|  | |||||||
| @ -3,6 +3,9 @@ VERSION = 4.4 | |||||||
| 
 | 
 | ||||||
| # Customize below to fit your system
 | # Customize below to fit your system
 | ||||||
| 
 | 
 | ||||||
|  | # layouts
 | ||||||
|  | SRC = float.c tile.c | ||||||
|  | 
 | ||||||
| # paths
 | # paths
 | ||||||
| PREFIX = /usr/local | PREFIX = /usr/local | ||||||
| MANPREFIX = ${PREFIX}/share/man | MANPREFIX = ${PREFIX}/share/man | ||||||
|  | |||||||
							
								
								
									
										5
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								dwm.h
									
									
									
									
									
								
							| @ -76,7 +76,7 @@ typedef struct { | |||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| 	const char *symbol; | 	const char *symbol; | ||||||
| 	void (*arrange)(const char *); | 	void (*arrange)(void); | ||||||
| } Layout; | } Layout; | ||||||
| 
 | 
 | ||||||
| extern const char *tags[];			/* all tags */ | extern const char *tags[];			/* all tags */ | ||||||
| @ -120,15 +120,12 @@ unsigned int textw(const char *text);	/* return the width of text in px*/ | |||||||
| void grabkeys(void);			/* grab all keys defined in config.h */ | void grabkeys(void);			/* grab all keys defined in config.h */ | ||||||
| 
 | 
 | ||||||
| /* layout.c */ | /* layout.c */ | ||||||
| void floating(const char *arg);		/* arranges all windows floating */ |  | ||||||
| void focusclient(const char *arg);	/* focuses next(1)/previous(-1) visible client */ | void focusclient(const char *arg);	/* focuses next(1)/previous(-1) visible client */ | ||||||
| void initlayouts(void);			/* initialize layout array */ | void initlayouts(void);			/* initialize layout array */ | ||||||
| Client *nexttiled(Client *c);		/* returns tiled successor of c */ | Client *nexttiled(Client *c);		/* returns tiled successor of c */ | ||||||
| void restack(void);			/* restores z layers of all clients */ | void restack(void);			/* restores z layers of all clients */ | ||||||
| void setlayout(const char *arg);	/* sets layout, NULL means next layout */ | void setlayout(const char *arg);	/* sets layout, NULL means next layout */ | ||||||
| void togglebar(const char *arg);	/* shows/hides the bar */ | void togglebar(const char *arg);	/* shows/hides the bar */ | ||||||
| void togglemax(const char *arg);	/* toggles maximization of floating client */ |  | ||||||
| void zoom(const char *arg);		/* zooms the focused client to master area, arg is ignored */ |  | ||||||
| 
 | 
 | ||||||
| /* main.c */ | /* main.c */ | ||||||
| void updatebarpos(void);		/* updates the bar position */ | void updatebarpos(void);		/* updates the bar position */ | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								event.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								event.c
									
									
									
									
									
								
							| @ -216,7 +216,7 @@ configurenotify(XEvent *e) { | |||||||
| 		dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen)); | 		dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen)); | ||||||
| 		XResizeWindow(dpy, barwin, sw, bh); | 		XResizeWindow(dpy, barwin, sw, bh); | ||||||
| 		updatebarpos(); | 		updatebarpos(); | ||||||
| 		lt->arrange(NULL); | 		lt->arrange(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -317,7 +317,7 @@ propertynotify(XEvent *e) { | |||||||
| 			case XA_WM_TRANSIENT_FOR: | 			case XA_WM_TRANSIENT_FOR: | ||||||
| 				XGetTransientForHint(dpy, c->win, &trans); | 				XGetTransientForHint(dpy, c->win, &trans); | ||||||
| 				if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL))) | 				if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL))) | ||||||
| 					lt->arrange(NULL); | 					lt->arrange(); | ||||||
| 				break; | 				break; | ||||||
| 			case XA_WM_NORMAL_HINTS: | 			case XA_WM_NORMAL_HINTS: | ||||||
| 				updatesizehints(c); | 				updatesizehints(c); | ||||||
|  | |||||||
							
								
								
									
										41
									
								
								float.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								float.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | |||||||
|  | /* See LICENSE file for copyright and license details. */ | ||||||
|  | #include "dwm.h" | ||||||
|  | 
 | ||||||
|  | /* extern */ | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | floating(void) { | ||||||
|  | 	Client *c; | ||||||
|  | 
 | ||||||
|  | 	if(lt->arrange != floating) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	for(c = clients; c; c = c->next) | ||||||
|  | 		if(isvisible(c)) { | ||||||
|  | 			unban(c); | ||||||
|  | 			resize(c, c->x, c->y, c->w, c->h, True); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 			ban(c); | ||||||
|  | 	focus(NULL); | ||||||
|  | 	restack(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | togglemax(const char *arg) { | ||||||
|  | 	XEvent ev; | ||||||
|  | 
 | ||||||
|  | 	if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed) | ||||||
|  | 		return; | ||||||
|  | 	if((sel->ismax = !sel->ismax)) { | ||||||
|  | 		sel->rx = sel->x; | ||||||
|  | 		sel->ry = sel->y; | ||||||
|  | 		sel->rw = sel->w; | ||||||
|  | 		sel->rh = sel->h; | ||||||
|  | 		resize(sel, wax, way, waw - 2 * sel->border, wah - 2 * sel->border, True); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 		resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True); | ||||||
|  | 	drawstatus(); | ||||||
|  | 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | ||||||
|  | } | ||||||
							
								
								
									
										5
									
								
								float.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								float.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | /* See LICENSE file for copyright and license details. */ | ||||||
|  | 
 | ||||||
|  | /* float.c */ | ||||||
|  | void floating(void);			/* arranges all windows floating */ | ||||||
|  | void togglemax(const char *arg);	/* toggles maximization of floating client */ | ||||||
							
								
								
									
										116
									
								
								layout.c
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								layout.c
									
									
									
									
									
								
							| @ -1,6 +1,5 @@ | |||||||
| /* See LICENSE file for copyright and license details. */ | /* See LICENSE file for copyright and license details. */ | ||||||
| #include "dwm.h" | #include "dwm.h" | ||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| 
 | 
 | ||||||
| unsigned int blw = 0; | unsigned int blw = 0; | ||||||
| @ -14,24 +13,6 @@ LAYOUTS | |||||||
| 
 | 
 | ||||||
| /* extern */ | /* extern */ | ||||||
| 
 | 
 | ||||||
| void |  | ||||||
| floating(const char *arg) { |  | ||||||
| 	Client *c; |  | ||||||
| 
 |  | ||||||
| 	if(lt->arrange != floating) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	for(c = clients; c; c = c->next) |  | ||||||
| 		if(isvisible(c)) { |  | ||||||
| 			unban(c); |  | ||||||
| 			resize(c, c->x, c->y, c->w, c->h, True); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 			ban(c); |  | ||||||
| 	focus(NULL); |  | ||||||
| 	restack(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void | void | ||||||
| focusclient(const char *arg) { | focusclient(const char *arg) { | ||||||
| 	Client *c; | 	Client *c; | ||||||
| @ -120,70 +101,11 @@ setlayout(const char *arg) { | |||||||
| 		lt = &layout[i]; | 		lt = &layout[i]; | ||||||
| 	} | 	} | ||||||
| 	if(sel) | 	if(sel) | ||||||
| 		lt->arrange(NULL); | 		lt->arrange(); | ||||||
| 	else | 	else | ||||||
| 		drawstatus(); | 		drawstatus(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void |  | ||||||
| tile(const char *arg) { |  | ||||||
| 	static double master = MASTER; |  | ||||||
| 	double delta; |  | ||||||
| 	unsigned int i, n, nx, ny, nw, nh, mw, th; |  | ||||||
| 	Client *c; |  | ||||||
| 
 |  | ||||||
| 	if(lt->arrange != tile) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	/* arg handling, manipulate master */ |  | ||||||
| 	if(arg && (1 == sscanf(arg, "%lf", &delta))) { |  | ||||||
| 		if(delta + master > 0.1 && delta + master < 0.9) |  | ||||||
| 			master += delta; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) |  | ||||||
| 		n++; |  | ||||||
| 
 |  | ||||||
| 	/* window geoms */ |  | ||||||
| 	mw = (n == 1) ? waw : master * waw; |  | ||||||
| 	th = (n > 1) ? wah / (n - 1) : 0; |  | ||||||
| 	if(n > 1 && th < bh) |  | ||||||
| 		th = wah; |  | ||||||
| 
 |  | ||||||
| 	nx = wax; |  | ||||||
| 	ny = way; |  | ||||||
| 	for(i = 0, c = clients; c; c = c->next) |  | ||||||
| 		if(isvisible(c)) { |  | ||||||
| 			unban(c); |  | ||||||
| 			if(c->isfloating) |  | ||||||
| 				continue; |  | ||||||
| 			c->ismax = False; |  | ||||||
| 			if(i == 0) { /* master */ |  | ||||||
| 				nw = mw - 2 * c->border; |  | ||||||
| 				nh = wah - 2 * c->border; |  | ||||||
| 			} |  | ||||||
| 			else {  /* tile window */ |  | ||||||
| 				if(i == 1) { |  | ||||||
| 					ny = way; |  | ||||||
| 					nx += mw; |  | ||||||
| 				} |  | ||||||
| 				nw = waw - mw - 2 * c->border; |  | ||||||
| 				if(i + 1 == n) /* remainder */ |  | ||||||
| 					nh = (way + wah) - ny - 2 * c->border; |  | ||||||
| 				else |  | ||||||
| 					nh = th - 2 * c->border; |  | ||||||
| 			} |  | ||||||
| 			resize(c, nx, ny, nw, nh, False); |  | ||||||
| 			if(n > 1 && th != wah) |  | ||||||
| 				ny += nh + 2 * c->border; |  | ||||||
| 			i++; |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 			ban(c); |  | ||||||
| 	focus(NULL); |  | ||||||
| 	restack(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void | void | ||||||
| togglebar(const char *arg) { | togglebar(const char *arg) { | ||||||
| 	if(bpos == BarOff) | 	if(bpos == BarOff) | ||||||
| @ -191,39 +113,5 @@ togglebar(const char *arg) { | |||||||
| 	else | 	else | ||||||
| 		bpos = BarOff; | 		bpos = BarOff; | ||||||
| 	updatebarpos(); | 	updatebarpos(); | ||||||
| 	lt->arrange(NULL); | 	lt->arrange(); | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| togglemax(const char *arg) { |  | ||||||
| 	XEvent ev; |  | ||||||
| 
 |  | ||||||
| 	if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed) |  | ||||||
| 		return; |  | ||||||
| 	if((sel->ismax = !sel->ismax)) { |  | ||||||
| 		sel->rx = sel->x; |  | ||||||
| 		sel->ry = sel->y; |  | ||||||
| 		sel->rw = sel->w; |  | ||||||
| 		sel->rh = sel->h; |  | ||||||
| 		resize(sel, wax, way, waw - 2 * sel->border, wah - 2 * sel->border, True); |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 		resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True); |  | ||||||
| 	drawstatus(); |  | ||||||
| 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| zoom(const char *arg) { |  | ||||||
| 	Client *c; |  | ||||||
| 
 |  | ||||||
| 	if(!sel || lt->arrange == floating || sel->isfloating) |  | ||||||
| 		return; |  | ||||||
| 	if((c = sel) == nexttiled(clients)) |  | ||||||
| 		if(!(c = nexttiled(c->next))) |  | ||||||
| 			return; |  | ||||||
| 	detach(c); |  | ||||||
| 	attach(c); |  | ||||||
| 	focus(c); |  | ||||||
| 	lt->arrange(NULL); |  | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								tag.c
									
									
									
									
									
								
							| @ -110,7 +110,7 @@ tag(const char *arg) { | |||||||
| 	i = arg ? atoi(arg) : 0; | 	i = arg ? atoi(arg) : 0; | ||||||
| 	if(i >= 0 && i < ntags) | 	if(i >= 0 && i < ntags) | ||||||
| 		sel->tags[i] = True; | 		sel->tags[i] = True; | ||||||
| 	lt->arrange(NULL); | 	lt->arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -124,7 +124,7 @@ toggletag(const char *arg) { | |||||||
| 	for(j = 0; j < ntags && !sel->tags[j]; j++); | 	for(j = 0; j < ntags && !sel->tags[j]; j++); | ||||||
| 	if(j == ntags) | 	if(j == ntags) | ||||||
| 		sel->tags[i] = True; | 		sel->tags[i] = True; | ||||||
| 	lt->arrange(NULL); | 	lt->arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -136,7 +136,7 @@ toggleview(const char *arg) { | |||||||
| 	for(j = 0; j < ntags && !seltag[j]; j++); | 	for(j = 0; j < ntags && !seltag[j]; j++); | ||||||
| 	if(j == ntags) | 	if(j == ntags) | ||||||
| 		seltag[i] = True; /* cannot toggle last view */ | 		seltag[i] = True; /* cannot toggle last view */ | ||||||
| 	lt->arrange(NULL); | 	lt->arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -148,5 +148,5 @@ view(const char *arg) { | |||||||
| 	i = arg ? atoi(arg) : 0; | 	i = arg ? atoi(arg) : 0; | ||||||
| 	if(i >= 0 && i < ntags) | 	if(i >= 0 && i < ntags) | ||||||
| 		seltag[i] = True; | 		seltag[i] = True; | ||||||
| 	lt->arrange(NULL); | 	lt->arrange(); | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										88
									
								
								tile.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								tile.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,88 @@ | |||||||
|  | /* See LICENSE file for copyright and license details. */ | ||||||
|  | #include "dwm.h" | ||||||
|  | #include <stdio.h> | ||||||
|  | 
 | ||||||
|  | /* static */ | ||||||
|  | 
 | ||||||
|  | static double master = MASTER; | ||||||
|  | 
 | ||||||
|  | /* extern */ | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | incmaster(const char *arg) { | ||||||
|  | 	double delta; | ||||||
|  | 
 | ||||||
|  | 	if(lt->arrange != tile) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	/* arg handling, manipulate master */ | ||||||
|  | 	if(arg && (1 == sscanf(arg, "%lf", &delta))) { | ||||||
|  | 		if(delta + master > 0.1 && delta + master < 0.9) | ||||||
|  | 			master += delta; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	lt->arrange(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | tile(void) { | ||||||
|  | 	unsigned int i, n, nx, ny, nw, nh, mw, th; | ||||||
|  | 	Client *c; | ||||||
|  | 
 | ||||||
|  | 	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) | ||||||
|  | 		n++; | ||||||
|  | 
 | ||||||
|  | 	/* window geoms */ | ||||||
|  | 	mw = (n == 1) ? waw : master * waw; | ||||||
|  | 	th = (n > 1) ? wah / (n - 1) : 0; | ||||||
|  | 	if(n > 1 && th < bh) | ||||||
|  | 		th = wah; | ||||||
|  | 
 | ||||||
|  | 	nx = wax; | ||||||
|  | 	ny = way; | ||||||
|  | 	for(i = 0, c = clients; c; c = c->next) | ||||||
|  | 		if(isvisible(c)) { | ||||||
|  | 			unban(c); | ||||||
|  | 			if(c->isfloating) | ||||||
|  | 				continue; | ||||||
|  | 			c->ismax = False; | ||||||
|  | 			if(i == 0) { /* master */ | ||||||
|  | 				nw = mw - 2 * c->border; | ||||||
|  | 				nh = wah - 2 * c->border; | ||||||
|  | 			} | ||||||
|  | 			else {  /* tile window */ | ||||||
|  | 				if(i == 1) { | ||||||
|  | 					ny = way; | ||||||
|  | 					nx += mw; | ||||||
|  | 				} | ||||||
|  | 				nw = waw - mw - 2 * c->border; | ||||||
|  | 				if(i + 1 == n) /* remainder */ | ||||||
|  | 					nh = (way + wah) - ny - 2 * c->border; | ||||||
|  | 				else | ||||||
|  | 					nh = th - 2 * c->border; | ||||||
|  | 			} | ||||||
|  | 			resize(c, nx, ny, nw, nh, False); | ||||||
|  | 			if(n > 1 && th != wah) | ||||||
|  | 				ny += nh + 2 * c->border; | ||||||
|  | 			i++; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 			ban(c); | ||||||
|  | 	focus(NULL); | ||||||
|  | 	restack(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | zoom(const char *arg) { | ||||||
|  | 	Client *c; | ||||||
|  | 
 | ||||||
|  | 	if(!sel || lt->arrange == floating || sel->isfloating) | ||||||
|  | 		return; | ||||||
|  | 	if((c = sel) == nexttiled(clients)) | ||||||
|  | 		if(!(c = nexttiled(c->next))) | ||||||
|  | 			return; | ||||||
|  | 	detach(c); | ||||||
|  | 	attach(c); | ||||||
|  | 	focus(c); | ||||||
|  | 	lt->arrange(); | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								tile.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								tile.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | /* See LICENSE file for copyright and license details. */ | ||||||
|  | 
 | ||||||
|  | /* tile.c */ | ||||||
|  | void incmaster(const char *arg);	/* arranges all windows tiled */ | ||||||
|  | void tile(void);			/* arranges all windows tiled */ | ||||||
|  | void zoom(const char *arg);		/* zooms the focused client to master area, arg is ignored */ | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user