dwm

my fork of dwm
Index Commits Files Refs README LICENSE
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);