diff options
| author | Anselm R. Garbe <garbeam@gmail.com> | 2007-08-11 12:11:50 +0200 | 
|---|---|---|
| committer | Anselm R. Garbe <garbeam@gmail.com> | 2007-08-11 12:11:50 +0200 | 
| commit | 2d81b78b853565a3e34a8a9190e2362a6fdde739 (patch) | |
| tree | d58d24853f77685588e42f73a01d782980a3b95e | |
| parent | b5eea45a316a897632578a74c909aa336557b1d6 (diff) | |
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
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | client.c | 6 | ||||
| -rw-r--r-- | config.arg.h | 7 | ||||
| -rw-r--r-- | config.default.h | 7 | ||||
| -rw-r--r-- | config.mk | 3 | ||||
| -rw-r--r-- | dwm.h | 5 | ||||
| -rw-r--r-- | event.c | 4 | ||||
| -rw-r--r-- | float.c | 41 | ||||
| -rw-r--r-- | float.h | 5 | ||||
| -rw-r--r-- | layout.c | 116 | ||||
| -rw-r--r-- | tag.c | 8 | ||||
| -rw-r--r-- | tile.c | 88 | ||||
| -rw-r--r-- | tile.h | 6 | 
13 files changed, 164 insertions, 134 deletions
| @@ -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 @@ -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 diff --git a/config.arg.h b/config.arg.h index 4d441f8..6fd4218 100644 --- a/config.arg.h +++ b/config.arg.h @@ -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 }, \ diff --git a/config.default.h b/config.default.h index ec32e9d..1f0fe8c 100644 --- a/config.default.h +++ b/config.default.h @@ -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 @@ -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 */ @@ -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); @@ -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)); +} @@ -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 */ @@ -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; @@ -15,24 +14,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,110 +101,17 @@ 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)  		bpos = (BARPOS == BarOff) ? BarTop : BARPOS;  	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();  } @@ -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();  } @@ -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(); +} @@ -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 */ | 
