aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.anselm.h154
-rw-r--r--config.def.h6
-rw-r--r--dwm.c134
3 files changed, 98 insertions, 196 deletions
diff --git a/config.anselm.h b/config.anselm.h
deleted file mode 100644
index 09cccd1..0000000
--- a/config.anselm.h
+++ /dev/null
@@ -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
index 4254c43..0866e2e 100644
--- 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
index 3f896dc..5d93d34 100644
--- 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);