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:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ | ||||
|  | ||||
| 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} | ||||
|  | ||||
| all: options dwm | ||||
|   | ||||
							
								
								
									
										6
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								client.c
									
									
									
									
									
								
							| @@ -230,7 +230,7 @@ manage(Window w, XWindowAttributes *wa) { | ||||
| 	setclientstate(c, IconicState); | ||||
| 	c->isbanned = True; | ||||
| 	focus(c); | ||||
| 	lt->arrange(NULL); | ||||
| 	lt->arrange(); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -305,7 +305,7 @@ togglefloating(const char *arg) { | ||||
| 	sel->isfloating = !sel->isfloating; | ||||
| 	if(sel->isfloating) | ||||
| 		resize(sel, sel->x, sel->y, sel->w, sel->h, True); | ||||
| 	lt->arrange(NULL); | ||||
| 	lt->arrange(); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -337,7 +337,7 @@ unmanage(Client *c) { | ||||
| 	XSync(dpy, False); | ||||
| 	XSetErrorHandler(xerror); | ||||
| 	XUngrabServer(dpy); | ||||
| 	lt->arrange(NULL); | ||||
| 	lt->arrange(); | ||||
| } | ||||
|  | ||||
| void | ||||
|   | ||||
| @@ -24,7 +24,8 @@ static Rule rule[] = { \ | ||||
| }; | ||||
|  | ||||
| /* layout(s) */ | ||||
| void tile(const char *arg);		/* arranges all windows tiled */ | ||||
| #include "tile.h" | ||||
| #include "float.h" | ||||
| #define LAYOUTS \ | ||||
| static Layout layout[] = { \ | ||||
| 	/* symbol		function */ \ | ||||
| @@ -46,10 +47,10 @@ static Key key[] = { \ | ||||
| 		"exec urxvtcd -tr -bg '#111' -fg '#eee' -cr '#eee' +sb -fn '"FONT"'" }, \ | ||||
| 	{ MODKEY,			XK_space,	setlayout,	NULL }, \ | ||||
| 	{ MODKEY,			XK_b,		togglebar,	NULL }, \ | ||||
| 	{ MODKEY,			XK_h,		tile,		"-0.05" }, \ | ||||
| 	{ MODKEY,			XK_j,		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_Return,	zoom,		NULL }, \ | ||||
| 	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL }, \ | ||||
|   | ||||
| @@ -25,7 +25,8 @@ static Rule rule[] = { \ | ||||
| }; | ||||
|  | ||||
| /* layout(s) */ | ||||
| void tile(const char *arg);		/* arranges all windows tiled */ | ||||
| #include "tile.h" | ||||
| #include "float.h" | ||||
| #define LAYOUTS \ | ||||
| static Layout layout[] = { \ | ||||
| 	/* symbol		function */ \ | ||||
| @@ -44,10 +45,10 @@ static Key key[] = { \ | ||||
| 	{ MODKEY,			XK_p,		spawn, 		"exe=`dmenu_path | dmenu` && exec $exe" }, \ | ||||
| 	{ MODKEY,			XK_space,	setlayout,	NULL }, \ | ||||
| 	{ MODKEY,			XK_b,		togglebar,	NULL }, \ | ||||
| 	{ MODKEY,			XK_h,		tile,		"-0.05" }, \ | ||||
| 	{ MODKEY,			XK_j,		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_Return,	zoom,		NULL }, \ | ||||
| 	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL }, \ | ||||
|   | ||||
| @@ -3,6 +3,9 @@ VERSION = 4.4 | ||||
|  | ||||
| # Customize below to fit your system | ||||
|  | ||||
| # layouts | ||||
| SRC = float.c tile.c | ||||
|  | ||||
| # paths | ||||
| PREFIX = /usr/local | ||||
| MANPREFIX = ${PREFIX}/share/man | ||||
|   | ||||
							
								
								
									
										5
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								dwm.h
									
									
									
									
									
								
							| @@ -76,7 +76,7 @@ typedef struct { | ||||
|  | ||||
| typedef struct { | ||||
| 	const char *symbol; | ||||
| 	void (*arrange)(const char *); | ||||
| 	void (*arrange)(void); | ||||
| } Layout; | ||||
|  | ||||
| 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 */ | ||||
|  | ||||
| /* layout.c */ | ||||
| void floating(const char *arg);		/* arranges all windows floating */ | ||||
| void focusclient(const char *arg);	/* focuses next(1)/previous(-1) visible client */ | ||||
| void initlayouts(void);			/* initialize layout array */ | ||||
| Client *nexttiled(Client *c);		/* returns tiled successor of c */ | ||||
| void restack(void);			/* restores z layers of all clients */ | ||||
| void setlayout(const char *arg);	/* sets layout, NULL means next layout */ | ||||
| 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 */ | ||||
| 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)); | ||||
| 		XResizeWindow(dpy, barwin, sw, bh); | ||||
| 		updatebarpos(); | ||||
| 		lt->arrange(NULL); | ||||
| 		lt->arrange(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -317,7 +317,7 @@ propertynotify(XEvent *e) { | ||||
| 			case XA_WM_TRANSIENT_FOR: | ||||
| 				XGetTransientForHint(dpy, c->win, &trans); | ||||
| 				if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL))) | ||||
| 					lt->arrange(NULL); | ||||
| 					lt->arrange(); | ||||
| 				break; | ||||
| 			case XA_WM_NORMAL_HINTS: | ||||
| 				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. */ | ||||
| #include "dwm.h" | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| unsigned int blw = 0; | ||||
| @@ -14,24 +13,6 @@ LAYOUTS | ||||
|  | ||||
| /* 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 | ||||
| focusclient(const char *arg) { | ||||
| 	Client *c; | ||||
| @@ -120,70 +101,11 @@ setlayout(const char *arg) { | ||||
| 		lt = &layout[i]; | ||||
| 	} | ||||
| 	if(sel) | ||||
| 		lt->arrange(NULL); | ||||
| 		lt->arrange(); | ||||
| 	else | ||||
| 		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 | ||||
| togglebar(const char *arg) { | ||||
| 	if(bpos == BarOff) | ||||
| @@ -191,39 +113,5 @@ togglebar(const char *arg) { | ||||
| 	else | ||||
| 		bpos = BarOff; | ||||
| 	updatebarpos(); | ||||
| 	lt->arrange(NULL); | ||||
| } | ||||
|  | ||||
| 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); | ||||
| 	lt->arrange(); | ||||
| } | ||||
|   | ||||
							
								
								
									
										8
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								tag.c
									
									
									
									
									
								
							| @@ -110,7 +110,7 @@ tag(const char *arg) { | ||||
| 	i = arg ? atoi(arg) : 0; | ||||
| 	if(i >= 0 && i < ntags) | ||||
| 		sel->tags[i] = True; | ||||
| 	lt->arrange(NULL); | ||||
| 	lt->arrange(); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -124,7 +124,7 @@ toggletag(const char *arg) { | ||||
| 	for(j = 0; j < ntags && !sel->tags[j]; j++); | ||||
| 	if(j == ntags) | ||||
| 		sel->tags[i] = True; | ||||
| 	lt->arrange(NULL); | ||||
| 	lt->arrange(); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -136,7 +136,7 @@ toggleview(const char *arg) { | ||||
| 	for(j = 0; j < ntags && !seltag[j]; j++); | ||||
| 	if(j == ntags) | ||||
| 		seltag[i] = True; /* cannot toggle last view */ | ||||
| 	lt->arrange(NULL); | ||||
| 	lt->arrange(); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -148,5 +148,5 @@ view(const char *arg) { | ||||
| 	i = arg ? atoi(arg) : 0; | ||||
| 	if(i >= 0 && i < ntags) | ||||
| 		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 */ | ||||
		Reference in New Issue
	
	Block a user