diff options
| -rw-r--r-- | config.def.h | 16 | ||||
| -rw-r--r-- | config.mk | 2 | ||||
| -rw-r--r-- | dwm.c | 125 | 
3 files changed, 68 insertions, 75 deletions
| diff --git a/config.def.h b/config.def.h index 0866e2e..f6d90d8 100644 --- a/config.def.h +++ b/config.def.h @@ -9,7 +9,19 @@  #define SELBORDERCOLOR		"#0066ff"  #define SELBGCOLOR		"#0066ff"  #define SELFGCOLOR		"#ffffff" -#define GEOMETRY		"0 0 W B 0 B W H-B 0 B W*0.55 H-B W*0.45 B H-B 0 B W H-B" +#define GEOMETRY		"0 0 W B " \ +				"0 B W H-B " \ +				"0 B W*0.55 H-B " \ +				"W*0.55 B W*0.45 H-B " \ +				"0 B W H-B" + +/* Anselm's dual head geometry in the office */ +#define DUALGEOMETRY		"0 0 1280 B " \ +				"0 B W H-B " \ +				"0 B 1280 800-B " \ +				"1280 0 W-1280 H " \ +				"0 B 1280 800-B" +  /* tagging */  const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; @@ -38,7 +50,7 @@ Layout layouts[] = {  #define MODKEY			Mod1Mask  Key keys[] = {  	/* modifier			key		function	argument */ -	{ MODKEY,			XK_a,		setgeom,	"0 0 W B 0 B W H-B 0 B 1280 800-B 1280 0 W-1280 H 0 B 1280 800-B" }, +	{ MODKEY,			XK_a,		setgeom,	DUALGEOMETRY },  	{ MODKEY,			XK_d,		setgeom,	GEOMETRY },  	{ MODKEY,			XK_p,		spawn,  		"exec dmenu_run -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"' -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'" }, @@ -17,7 +17,7 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11  # flags  CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"  LDFLAGS = -s ${LIBS} -#CFLAGS = -g -std=c99 -pedantic -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" -DWORK +#CFLAGS = -g -std=c99 -pedantic -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"  #LDFLAGS = -g ${LIBS}  # Solaris @@ -107,6 +107,7 @@ typedef struct {  } Rule;  /* function declarations */ +void applygeom(const char *arg);  void applyrules(Client *c);  void arrange(void);  void attach(Client *c); @@ -236,6 +237,55 @@ static Bool tmp[LENGTH(tags)];  /* function implementations */  void +applygeometry(const char *arg) { +	static const char *lastArg = NULL; +	char delim, op, *s, *e, *p; +	double val; +	int i, *map[] = { &bx,  &by,  &bw,  &bh, +	                  &wx,  &wy,  &ww,  &wh, +	                  &mx,  &my,  &mw,  &mh, +	                  &tx,  &ty,  &tw,  &th, +	                  &mox, &moy, &mow, &moh }; + +	if(!arg) +		arg = lastArg; +	else +		lastArg = arg; +	if(!lastArg) +		return; +	strncpy(buf, arg, sizeof buf); +	for(i = 0, e = s = buf; i < LENGTH(map) && e; e++) +		if(*e == ' ' || *e == 0) { +			delim = *e; +			*e = 0; +			op = 0; +			/* check if there is an operator */ +			for(p = s; p < e && *p != '-' && *p != '+' && *p != '*'; p++); +			if(*p) { +				op = *p; +				*p = 0; +			} +			val = getdouble(s); +			if(op && p > s) { /* intermediate operand, e.g. H-B */ +				*(map[i]) = (int)val; +				s = ++p; +				val = getdouble(s); +			} +			switch(op) { +			default:  *(map[i])  = (int)val; break; +			case '-': *(map[i]) -= (int)val; break; +			case '+': *(map[i]) += (int)val; break; +			case '*': *(map[i])  = (int)(((double)*(map[i])) * val); break; +			} +			if(delim == 0) +				e = NULL; +			else +				s = ++e; +			i++; +		} +} + +void  applyrules(Client *c) {  	unsigned int i;  	Bool matched = False; @@ -410,11 +460,8 @@ void  configurenotify(XEvent *e) {  	XConfigureEvent *ev = &e->xconfigure; -	if(ev->window == root && (ev->width != sw || ev->height != sh)) { +	if(ev->window == root && (ev->width != sw || ev->height != sh))  		setgeom(NULL); -		updatebarpos(); -		arrange(); -	}  }  void @@ -1391,31 +1438,11 @@ setclientstate(Client *c, long state) {  			PropModeReplace, (unsigned char *)data, 2);  } -/** - * Idea: - * - * having a geom syntax as follows, which is interpreted as integer. - * - * [-,+][<0..n>|<W,H,B>] - * - * - * B = bar height, W = DisplayWidth(), H = DisplayHeight() - * - * -/+/* /: is relative to current - * - * Then we would come down with <bx>,<by>,<bw>,<bh>,... - * - * "0 0 W B 0 0 W W N E B,W,B, - * - * - */ -  double  getdouble(const char *s) {  	char *endp;  	double result = 0; -	fprintf(stderr, "getdouble '%s'\n", s);  	switch(*s) {  	default:   		result = strtod(s, &endp); @@ -1426,58 +1453,12 @@ getdouble(const char *s) {  	case 'W': result = sw; break;  	case 'H': result = sh; break;  	} -	fprintf(stderr, "getdouble returns '%f'\n", result);  	return result;  }  void  setgeom(const char *arg) { -	static const char *lastArg = NULL; -	char op, *s, *e, *p; -	double val; -	int i, *map[] = { &bx,  &by,  &bw,  &bh, -	                  &wx,  &wy,  &ww,  &wh, -	                  &mx,  &my,  &mw,  &mh, -	                  &tx,  &ty,  &tw,  &th, -	                  &mox, &moy, &mow, &moh }; - -	if(!arg) -		arg = lastArg; -	else -		lastArg = arg; -	if(!lastArg) -		return; -	strncpy(buf, arg, sizeof buf); -	for(i = 0, e = s = buf; e && *e; e++) -		if(*e == ' ') { -			*e = 0; -			fprintf(stderr, "next geom arg='%s'\n", s); -			op = 0; -			/* check if there is an operator */ -			for(p = s; *p && *p != '-' && *p != '+' && *p != '*' && *p != ':'; p++); -			if(*p) { -				op = *p; -				*p = 0; -			} -			val = getdouble(s); -			fprintf(stderr, "val1: %d\n", val); -			if(p > s) { /* intermediate operand, e.g. H-B */ -				*(map[i]) = val; -				s = ++p; -				val = getdouble(s); -				fprintf(stderr, "val2: %d\n", val); -			} -			switch(op) { -			default: *(map[i])   = val; break; -			case '-': *(map[i]) -= val; break; -			case '+': *(map[i]) += val; break; -			case '*': *(map[i]) *= val; break; -			case ':': if(val != 0) *(map[i]) /= val; break; -			} -			fprintf(stderr, "map[i]='%d'\n", val); -			s = ++e; -			i++; -		} +	applygeometry(arg);  	updatebarpos();  	arrange();  } @@ -1521,7 +1502,7 @@ setup(void) {  	sy = 0;  	sw = DisplayWidth(dpy, screen);  	sh = DisplayHeight(dpy, screen); -	setgeom(GEOMETRY); +	applygeometry(GEOMETRY);  	/* init atoms */  	wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); | 
