made the string-based setgeom working
parent
33b1960220
commit
dba22848c7
16
config.def.h
16
config.def.h
|
@ -9,7 +9,19 @@
|
||||||
#define SELBORDERCOLOR "#0066ff"
|
#define SELBORDERCOLOR "#0066ff"
|
||||||
#define SELBGCOLOR "#0066ff"
|
#define SELBGCOLOR "#0066ff"
|
||||||
#define SELFGCOLOR "#ffffff"
|
#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 */
|
/* tagging */
|
||||||
const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||||
|
@ -38,7 +50,7 @@ Layout layouts[] = {
|
||||||
#define MODKEY Mod1Mask
|
#define MODKEY Mod1Mask
|
||||||
Key keys[] = {
|
Key keys[] = {
|
||||||
/* modifier key function argument */
|
/* 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_d, setgeom, GEOMETRY },
|
||||||
{ MODKEY, XK_p, spawn,
|
{ MODKEY, XK_p, spawn,
|
||||||
"exec dmenu_run -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"' -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'" },
|
"exec dmenu_run -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"' -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'" },
|
||||||
|
|
|
@ -17,7 +17,7 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
|
||||||
# flags
|
# flags
|
||||||
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
|
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
|
||||||
LDFLAGS = -s ${LIBS}
|
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}
|
#LDFLAGS = -g ${LIBS}
|
||||||
|
|
||||||
# Solaris
|
# Solaris
|
||||||
|
|
125
dwm.c
125
dwm.c
|
@ -107,6 +107,7 @@ typedef struct {
|
||||||
} Rule;
|
} Rule;
|
||||||
|
|
||||||
/* function declarations */
|
/* function declarations */
|
||||||
|
void applygeom(const char *arg);
|
||||||
void applyrules(Client *c);
|
void applyrules(Client *c);
|
||||||
void arrange(void);
|
void arrange(void);
|
||||||
void attach(Client *c);
|
void attach(Client *c);
|
||||||
|
@ -235,6 +236,55 @@ static Bool tmp[LENGTH(tags)];
|
||||||
|
|
||||||
/* function implementations */
|
/* 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
|
void
|
||||||
applyrules(Client *c) {
|
applyrules(Client *c) {
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -410,11 +460,8 @@ void
|
||||||
configurenotify(XEvent *e) {
|
configurenotify(XEvent *e) {
|
||||||
XConfigureEvent *ev = &e->xconfigure;
|
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);
|
setgeom(NULL);
|
||||||
updatebarpos();
|
|
||||||
arrange();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1391,31 +1438,11 @@ setclientstate(Client *c, long state) {
|
||||||
PropModeReplace, (unsigned char *)data, 2);
|
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
|
double
|
||||||
getdouble(const char *s) {
|
getdouble(const char *s) {
|
||||||
char *endp;
|
char *endp;
|
||||||
double result = 0;
|
double result = 0;
|
||||||
|
|
||||||
fprintf(stderr, "getdouble '%s'\n", s);
|
|
||||||
switch(*s) {
|
switch(*s) {
|
||||||
default:
|
default:
|
||||||
result = strtod(s, &endp);
|
result = strtod(s, &endp);
|
||||||
|
@ -1426,58 +1453,12 @@ getdouble(const char *s) {
|
||||||
case 'W': result = sw; break;
|
case 'W': result = sw; break;
|
||||||
case 'H': result = sh; break;
|
case 'H': result = sh; break;
|
||||||
}
|
}
|
||||||
fprintf(stderr, "getdouble returns '%f'\n", result);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
setgeom(const char *arg) {
|
setgeom(const char *arg) {
|
||||||
static const char *lastArg = NULL;
|
applygeometry(arg);
|
||||||
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++;
|
|
||||||
}
|
|
||||||
updatebarpos();
|
updatebarpos();
|
||||||
arrange();
|
arrange();
|
||||||
}
|
}
|
||||||
|
@ -1521,7 +1502,7 @@ setup(void) {
|
||||||
sy = 0;
|
sy = 0;
|
||||||
sw = DisplayWidth(dpy, screen);
|
sw = DisplayWidth(dpy, screen);
|
||||||
sh = DisplayHeight(dpy, screen);
|
sh = DisplayHeight(dpy, screen);
|
||||||
setgeom(GEOMETRY);
|
applygeometry(GEOMETRY);
|
||||||
|
|
||||||
/* init atoms */
|
/* init atoms */
|
||||||
wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
|
wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
|
||||||
|
|
Loading…
Reference in New Issue