dwm

my fork of dwm
Index Commits Files Refs README LICENSE
commit 33b1960220f468ff2888e8ba3517e9a62ed99974
parent e237b2a76fb3dac1f43b91e5c7b6adb9ef04c9ed
Author: Anselm R Garbe <garbeam@gmail.com>
Date:   Fri, 14 Mar 2008 17:17:08 +0000

some experimental state DO NOT USE THIS, I plan to have a nicer interface to change geometries
Diffstat:
Dconfig.anselm.h | 154-------------------------------------------------------------------------------
Mconfig.def.h | 6+++---
Mdwm.c | 134++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
3 files changed, 98 insertions(+), 196 deletions(-)
diff --git a/config.anselm.h b/config.anselm.h
@@ -1,154 +0,0 @@
-/* See LICENSE file for copyright and license details. */
-
-/* appearance */
-#define BORDERPX        1
-#define FONT            "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*"
-#define NORMBORDERCOLOR        "#cccccc"
-#define NORMBGCOLOR        "#cccccc"
-#define NORMFGCOLOR        "#000000"
-#define SELBORDERCOLOR        "#0066ff"
-#define SELBGCOLOR        "#0066ff"
-#define SELFGCOLOR        "#ffffff"
-
-/* tagging */
-const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
-
-Rule rules[] = {
-    /* class    instance    title        tags ref    isfloating */
-    { NULL,        NULL,        "Firefox",    tags[8],    False },
-    { NULL,        NULL,        "Gimp",        NULL,        True },
-    { NULL,        NULL,        "MPlayer",    NULL,        True },
-    { NULL,        NULL,        "Acroread",    NULL,        True },
-};
-
-/* geometry function */
-void (*setgeoms)(void) = setdefgeoms;
-
-void
-setanselmgeoms(void) {
-
-    /* screen dimensions */
-    sx = 0;
-    sy = 0;
-    sw = DisplayWidth(dpy, screen);
-    sh = DisplayHeight(dpy, screen);
-
-    /* bar position */
-    bx = sx;
-    by = sy;
-    bw = 1280;
-    bh = dc.font.height + 2;
-
-    /* window area */
-    wx = sx;
-    wy = sy + bh;
-    ww = sw;
-    wh = sh - bh;
-
-    /* master area */
-    mx = wx;
-    my = wy;
-    mw = 1280;
-    mh = 800 - bh;
-
-    /* tile area */
-    tx = 1280;
-    ty = 0;
-    tw = sw - 1280;
-    th = sh;
-
-    /* monocle area */
-    mox = mx;
-    moy = my;
-    mow = mw;
-    moh = mh;
-}
-
-void
-anselmgeoms(const char *arg) {
-    setgeoms = setanselmgeoms;
-    setgeoms();
-    updatebarpos();
-    setlayout("[]|");
-}
-
-void
-defgeoms(const char *arg) {
-    setgeoms = setdefgeoms;
-    setgeoms();
-    updatebarpos();
-    setlayout("[]=");
-}
-
-/* layout(s) */
-#define RESIZEHINTS        True    /* False - respect size hints in tiled resizals */
-#define SNAP            32    /* snap pixel */
-
-Layout layouts[] = {
-    /* symbol        function    isfloating */
-    { "[]|",        tileh,        False }, /* first entry is default */
-    { "[]=",        tilev,        False },
-    { "><>",        floating,    True },
-    { "[M]",        monocle,    True },
-};
-
-/* key definitions */
-#define MODKEY            Mod1Mask
-Key keys[] = {
-    /* modifier            key        function    argument */
-    { MODKEY,            XK_p,        spawn,
-        "exec dmenu_run -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"' -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"' -x 0 -y 0 -w 1280" },
-    { MODKEY|ShiftMask,        XK_Return,    spawn, "exec uxterm" },
-    { MODKEY,            XK_a,        anselmgeoms,    NULL },
-    { MODKEY,            XK_d,        defgeoms,    NULL },
-    { MODKEY,            XK_j,        focusnext,    NULL },
-    { MODKEY,            XK_k,        focusprev,    NULL },
-    { MODKEY,            XK_r,        reapply,    NULL },
-    { MODKEY,            XK_Return,    zoom,        NULL },
-    { MODKEY,            XK_Tab,        viewprevtag,    NULL },
-    { MODKEY,            XK_m,        setlayout,    "[M]" },
-    { MODKEY,            XK_f,        setlayout,    "><>" },
-    { MODKEY,            XK_v,        setlayout,    "[]=" },
-    { MODKEY,            XK_h,        setlayout,    "[]|" },
-    { MODKEY|ShiftMask,        XK_space,    togglefloating,    NULL },
-    { MODKEY|ShiftMask,        XK_c,        killclient,    NULL },
-    { MODKEY,            XK_0,        view,        NULL },
-    { MODKEY,            XK_1,        view,        tags[0] },
-    { MODKEY,            XK_2,        view,        tags[1] },
-    { MODKEY,            XK_3,        view,        tags[2] },
-    { MODKEY,            XK_4,        view,        tags[3] },
-    { MODKEY,            XK_5,        view,        tags[4] },
-    { MODKEY,            XK_6,        view,        tags[5] },
-    { MODKEY,            XK_7,        view,        tags[6] },
-    { MODKEY,            XK_8,        view,        tags[7] },
-    { MODKEY,            XK_9,        view,        tags[8] },
-    { MODKEY|ControlMask,        XK_1,        toggleview,    tags[0] },
-    { MODKEY|ControlMask,        XK_2,        toggleview,    tags[1] },
-    { MODKEY|ControlMask,        XK_3,        toggleview,    tags[2] },
-    { MODKEY|ControlMask,        XK_4,        toggleview,    tags[3] },
-    { MODKEY|ControlMask,        XK_5,        toggleview,    tags[4] },
-    { MODKEY|ControlMask,        XK_6,        toggleview,    tags[5] },
-    { MODKEY|ControlMask,        XK_7,        toggleview,    tags[6] },
-    { MODKEY|ControlMask,        XK_8,        toggleview,    tags[7] },
-    { MODKEY|ControlMask,        XK_9,        toggleview,    tags[8] },
-    { MODKEY|ShiftMask,        XK_0,        tag,        NULL },
-    { MODKEY|ShiftMask,        XK_1,        tag,        tags[0] },
-    { MODKEY|ShiftMask,        XK_2,        tag,        tags[1] },
-    { MODKEY|ShiftMask,        XK_3,        tag,        tags[2] },
-    { MODKEY|ShiftMask,        XK_4,        tag,        tags[3] },
-    { MODKEY|ShiftMask,        XK_5,        tag,        tags[4] },
-    { MODKEY|ShiftMask,        XK_6,        tag,        tags[5] },
-    { MODKEY|ShiftMask,        XK_7,        tag,        tags[6] },
-    { MODKEY|ShiftMask,        XK_8,        tag,        tags[7] },
-    { MODKEY|ShiftMask,        XK_9,        tag,        tags[8] },
-    { MODKEY|ControlMask|ShiftMask,    XK_1,        toggletag,    tags[0] },
-    { MODKEY|ControlMask|ShiftMask,    XK_2,        toggletag,    tags[1] },
-    { MODKEY|ControlMask|ShiftMask,    XK_3,        toggletag,    tags[2] },
-    { MODKEY|ControlMask|ShiftMask,    XK_4,        toggletag,    tags[3] },
-    { MODKEY|ControlMask|ShiftMask,    XK_5,        toggletag,    tags[4] },
-    { MODKEY|ControlMask|ShiftMask,    XK_6,        toggletag,    tags[5] },
-    { MODKEY|ControlMask|ShiftMask,    XK_7,        toggletag,    tags[6] },
-    { MODKEY|ControlMask|ShiftMask,    XK_8,        toggletag,    tags[7] },
-    { MODKEY|ControlMask|ShiftMask,    XK_9,        toggletag,    tags[8] },
-    { MODKEY|ShiftMask,        XK_q,        quit,        NULL },
-};
diff --git a/config.def.h b/config.def.h
@@ -9,6 +9,7 @@
 #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"
 
 /* tagging */
 const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
@@ -21,9 +22,6 @@ Rule rules[] = {
     { NULL,        NULL,        "Acroread",    NULL,        True },
 };
 
-/* geometry function */
-void (*setgeoms)(void) = setdefgeoms;
-
 /* layout(s) */
 #define RESIZEHINTS        True    /* False - respect size hints in tiled resizals */
 #define SNAP            32    /* snap pixel */
@@ -40,6 +38,8 @@ 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_d,        setgeom,    GEOMETRY },
     { MODKEY,            XK_p,        spawn,
         "exec dmenu_run -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"' -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'" },
     { MODKEY|ShiftMask,        XK_Return,    spawn, "exec uxterm" },
diff --git a/dwm.c b/dwm.c
@@ -136,6 +136,7 @@ void focusnext(const char *arg);
 void focusprev(const char *arg);
 Client *getclient(Window w);
 unsigned long getcolor(const char *colstr);
+double getdouble(const char *s);
 long getstate(Window w);
 Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
 void grabbuttons(Client *c, Bool focused);
@@ -163,7 +164,7 @@ void restack(void);
 void run(void);
 void scan(void);
 void setclientstate(Client *c, long state);
-void setdefgeoms(void);
+void setgeom(const char *arg);
 void setlayout(const char *arg);
 void setup(void);
 void spawn(const char *arg);
@@ -410,7 +411,7 @@ configurenotify(XEvent *e) {
     XConfigureEvent *ev = &e->xconfigure;
 
     if(ev->window == root && (ev->width != sw || ev->height != sh)) {
-        setgeoms();
+        setgeom(NULL);
         updatebarpos();
         arrange();
     }
@@ -1390,44 +1391,95 @@ setclientstate(Client *c, long state) {
             PropModeReplace, (unsigned char *)data, 2);
 }
 
-void
-setdefgeoms(void) {
-
-    /* screen dimensions */
-    sx = 0;
-    sy = 0;
-    sw = DisplayWidth(dpy, screen);
-    sh = DisplayHeight(dpy, screen);
-
-    /* bar position */
-    bx = sx;
-    by = sy;
-    bw = sw;
-    bh = dc.font.height + 2;
-
-    /* window area */
-    wx = sx;
-    wy = sy + bh;
-    ww = sw;
-    wh = sh - bh;
+/**
+ * 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,
+ *
+ *
+ */
 
-    /* master area */
-    mx = wx;
-    my = wy;
-    mw = ((float)sw) * 0.55;
-    mh = wh;
+double
+getdouble(const char *s) {
+    char *endp;
+    double result = 0;
+
+    fprintf(stderr, "getdouble '%s'\n", s);
+    switch(*s) {
+    default: 
+        result = strtod(s, &endp);
+        if(s == endp || *endp != 0)
+            result = strtol(s, &endp, 0);
+        break;
+    case 'B': result = dc.font.height + 2; break;
+    case 'W': result = sw; break;
+    case 'H': result = sh; break;
+    }
+    fprintf(stderr, "getdouble returns '%f'\n", result);
+    return result;
+}
 
-    /* tile area */
-    tx = mx + mw;
-    ty = wy;
-    tw = ww - mw;
-    th = wh;
+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 };
 
-    /* monocle area */
-    mox = wx;
-    moy = wy;
-    mow = ww;
-    moh = wh;
+    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();
+    arrange();
 }
 
 void
@@ -1464,8 +1516,12 @@ setup(void) {
     root = RootWindow(dpy, screen);
     initfont(FONT);
 
-    /* apply default geometries */
-    setgeoms();
+    /* apply default dimensions */
+    sx = 0;
+    sy = 0;
+    sw = DisplayWidth(dpy, screen);
+    sh = DisplayHeight(dpy, screen);
+    setgeom(GEOMETRY);
 
     /* init atoms */
     wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);