diff -rup dwm-5.9-orig/config.def.h dwm-5.9/config.def.h --- dwm-5.9-orig/config.def.h 2011-07-10 22:24:25.000000000 +0200 +++ dwm-5.9/config.def.h 2011-08-17 17:15:47.000000000 +0200 @@ -17,9 +17,10 @@ static const Bool topbar = Tr static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; static const Rule rules[] = { - /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, True, -1 }, - { "Firefox", NULL, NULL, 1 << 8, False, -1 }, + /* class instance title tags mask isfloating geometry monitor */ + { "Gimp", NULL, NULL, 0, True, NULL, -1 }, + { "Firefox", NULL, NULL, 1 << 8, False, NULL, -1 }, + { "XCalc", NULL, NULL, 0, True, "225x333+200+100", -1 }, }; /* layout(s) */ diff -rup dwm-5.9-orig/dwm.c dwm-5.9/dwm.c --- dwm-5.9-orig/dwm.c 2011-07-10 22:24:25.000000000 +0200 +++ dwm-5.9/dwm.c 2011-08-17 17:19:07.000000000 +0200 @@ -148,6 +148,7 @@ typedef struct { const char *title; unsigned int tags; Bool isfloating; + const char *geometry; int monitor; } Rule; @@ -290,6 +291,8 @@ applyrules(Client *c) { const Rule *r; Monitor *m; XClassHint ch = { 0 }; + int geomask, x, y; + unsigned int w, h; /* rule matching */ c->isfloating = c->tags = 0; @@ -307,6 +310,19 @@ applyrules(Client *c) { for(m = mons; m && m->num != r->monitor; m = m->next); if(m) c->mon = m; + if(r->geometry) { + c->isfloating = True; + /* long version, so that it's possible to add some checks */ + geomask = XParseGeometry(r->geometry, &x, &y, &w, &h); + if(geomask & WidthValue) + c->w = w; + if(geomask & HeightValue) + c->h = h; + if(geomask & XValue) + c->x = x; + if(geomask & YValue) + c->y = y; + } } } if(ch.res_class) @@ -1104,6 +1120,12 @@ manage(Window w, XWindowAttributes *wa) die("fatal: could not malloc() %u bytes\n", sizeof(Client)); c->win = w; updatetitle(c); + /* geometry */ + c->x = c->oldx = wa->x; + c->y = c->oldy = wa->y; + c->w = c->oldw = wa->width; + c->h = c->oldh = wa->height; + c->oldbw = wa->border_width; if(XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { c->mon = t->mon; c->tags = t->tags; @@ -1112,12 +1134,6 @@ manage(Window w, XWindowAttributes *wa) c->mon = selmon; applyrules(c); } - /* geometry */ - c->x = c->oldx = wa->x; - c->y = c->oldy = wa->y; - c->w = c->oldw = wa->width; - c->h = c->oldh = wa->height; - c->oldbw = wa->border_width; if(c->w == c->mon->mw && c->h == c->mon->mh) { c->isfloating = True; c->x = c->mon->mx;