made the string-based setgeom working
This commit is contained in:
		
							
								
								
									
										16
									
								
								config.def.h
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								config.def.h
									
									
									
									
									
								
							@@ -9,7 +9,19 @@
 | 
				
			|||||||
#define SELBORDERCOLOR		"#0066ff"
 | 
					#define SELBORDERCOLOR		"#0066ff"
 | 
				
			||||||
#define SELBGCOLOR		"#0066ff"
 | 
					#define SELBGCOLOR		"#0066ff"
 | 
				
			||||||
#define SELFGCOLOR		"#ffffff"
 | 
					#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 */
 | 
					/* 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" };
 | 
				
			||||||
@@ -38,7 +50,7 @@ Layout layouts[] = {
 | 
				
			|||||||
#define MODKEY			Mod1Mask
 | 
					#define MODKEY			Mod1Mask
 | 
				
			||||||
Key keys[] = {
 | 
					Key keys[] = {
 | 
				
			||||||
	/* modifier			key		function	argument */
 | 
						/* 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_d,		setgeom,	GEOMETRY },
 | 
				
			||||||
	{ MODKEY,			XK_p,		spawn,
 | 
						{ MODKEY,			XK_p,		spawn,
 | 
				
			||||||
		"exec dmenu_run -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"' -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'" },
 | 
							"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
 | 
					# flags
 | 
				
			||||||
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
 | 
					CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
 | 
				
			||||||
LDFLAGS = -s ${LIBS}
 | 
					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}
 | 
					#LDFLAGS = -g ${LIBS}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Solaris
 | 
					# Solaris
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										125
									
								
								dwm.c
									
									
									
									
									
								
							
							
						
						
									
										125
									
								
								dwm.c
									
									
									
									
									
								
							@@ -107,6 +107,7 @@ typedef struct {
 | 
				
			|||||||
} Rule;
 | 
					} Rule;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* function declarations */
 | 
					/* function declarations */
 | 
				
			||||||
 | 
					void applygeom(const char *arg);
 | 
				
			||||||
void applyrules(Client *c);
 | 
					void applyrules(Client *c);
 | 
				
			||||||
void arrange(void);
 | 
					void arrange(void);
 | 
				
			||||||
void attach(Client *c);
 | 
					void attach(Client *c);
 | 
				
			||||||
@@ -235,6 +236,55 @@ static Bool tmp[LENGTH(tags)];
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* function implementations */
 | 
					/* 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
 | 
					void
 | 
				
			||||||
applyrules(Client *c) {
 | 
					applyrules(Client *c) {
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
@@ -410,11 +460,8 @@ void
 | 
				
			|||||||
configurenotify(XEvent *e) {
 | 
					configurenotify(XEvent *e) {
 | 
				
			||||||
	XConfigureEvent *ev = &e->xconfigure;
 | 
						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);
 | 
							setgeom(NULL);
 | 
				
			||||||
		updatebarpos();
 | 
					 | 
				
			||||||
		arrange();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
@@ -1391,31 +1438,11 @@ setclientstate(Client *c, long state) {
 | 
				
			|||||||
			PropModeReplace, (unsigned char *)data, 2);
 | 
								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
 | 
					double
 | 
				
			||||||
getdouble(const char *s) {
 | 
					getdouble(const char *s) {
 | 
				
			||||||
	char *endp;
 | 
						char *endp;
 | 
				
			||||||
	double result = 0;
 | 
						double result = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fprintf(stderr, "getdouble '%s'\n", s);
 | 
					 | 
				
			||||||
	switch(*s) {
 | 
						switch(*s) {
 | 
				
			||||||
	default: 
 | 
						default: 
 | 
				
			||||||
		result = strtod(s, &endp);
 | 
							result = strtod(s, &endp);
 | 
				
			||||||
@@ -1426,58 +1453,12 @@ getdouble(const char *s) {
 | 
				
			|||||||
	case 'W': result = sw; break;
 | 
						case 'W': result = sw; break;
 | 
				
			||||||
	case 'H': result = sh; break;
 | 
						case 'H': result = sh; break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fprintf(stderr, "getdouble returns '%f'\n", result);
 | 
					 | 
				
			||||||
	return result;
 | 
						return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
setgeom(const char *arg) {
 | 
					setgeom(const char *arg) {
 | 
				
			||||||
	static const char *lastArg = NULL;
 | 
						applygeometry(arg);
 | 
				
			||||||
	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++;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	updatebarpos();
 | 
						updatebarpos();
 | 
				
			||||||
	arrange();
 | 
						arrange();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1521,7 +1502,7 @@ setup(void) {
 | 
				
			|||||||
	sy = 0;
 | 
						sy = 0;
 | 
				
			||||||
	sw = DisplayWidth(dpy, screen);
 | 
						sw = DisplayWidth(dpy, screen);
 | 
				
			||||||
	sh = DisplayHeight(dpy, screen);
 | 
						sh = DisplayHeight(dpy, screen);
 | 
				
			||||||
	setgeom(GEOMETRY);
 | 
						applygeometry(GEOMETRY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* init atoms */
 | 
						/* init atoms */
 | 
				
			||||||
	wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
 | 
						wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user