some experimental state DO NOT USE THIS, I plan to have a nicer interface to change geometries

This commit is contained in:
Anselm R Garbe 2008-03-14 17:17:08 +00:00
parent e237b2a76f
commit 33b1960220
3 changed files with 99 additions and 197 deletions

View File

@ -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 },
};

View File

@ -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" },

136
dwm.c
View File

@ -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);
}
/**
* 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);
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;
}
void
setdefgeoms(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 };
/* 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;
/* master area */
mx = wx;
my = wy;
mw = ((float)sw) * 0.55;
mh = wh;
/* tile area */
tx = mx + mw;
ty = wy;
tw = ww - mw;
th = wh;
/* 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);