On 17.08.11, Bastien Dejean wrote:
> Is there any patch to make dwm handles a ruled based user specified
> initial geometry for floating windows?

I've just hacked together a working patch for dwm 5.9.
It adds a member named "geometry" to the Rule struct, enabling you to 
add a typical X geometry string (WIDTHxHEIGHT+X+Y) to any rule in your 
config.h.
See the rules array in config.def.h after applying the patch to see an 
example.

Please note, that this patch is not well tested and that it is kind of 
anti-dwm. I wrote it because I was bored.

Bert
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;

Reply via email to