commit dba22848c7d077c1a988a901c9390dc3c8cc9d64
parent 33b1960220f468ff2888e8ba3517e9a62ed99974
Author: Anselm R Garbe <garbeam@gmail.com>
Date:   Sat, 15 Mar 2008 14:17:42 +0000

made the string-based setgeom working
Diffstat:
Mconfig.def.h | 16++++++++++++++--
Mconfig.mk | 2+-
Mdwm.c | 125++++++++++++++++++++++++++++++++++---------------------------------------------
3 files changed, 68 insertions(+), 75 deletions(-)

diff --git 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"'" }, diff --git a/config.mk b/config.mk @@ -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 diff --git a/dwm.c b/dwm.c @@ -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);