URI: 
       made the string-based setgeom working - dwm - dynamic window manager
  HTML git clone https://git.parazyd.org/dwm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit dba22848c7d077c1a988a901c9390dc3c8cc9d64
   DIR parent 33b1960220f468ff2888e8ba3517e9a62ed99974
  HTML Author: Anselm R Garbe <garbeam@gmail.com>
       Date:   Sat, 15 Mar 2008 14:17:42 +0000
       
       made the string-based setgeom working
       Diffstat:
         M config.def.h                        |      16 ++++++++++++++--
         M config.mk                           |       2 +-
         M dwm.c                               |     125 +++++++++++++------------------
       
       3 files changed, 68 insertions(+), 75 deletions(-)
       ---
   DIR 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"'" },
   DIR 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
   DIR 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);