+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++;
+ }
+}
+