This is a tiny patch to add client centering support, which I am using
to hack up scratchpad functionality elsewhere.

Obviously this is only really useful if c->isfloating is also True.

I hacked this patch into my current configuration, so it is not tested
verbatim, but it should work when applied to vanilla dwm.
diff --git a/config.def.h b/config.def.h
index 875885b..2e3a9fb 100644
--- a/config.def.h
+++ b/config.def.h
@@ -21,9 +21,9 @@ static const Rule rules[] = {
         *      WM_CLASS(STRING) = instance, class
         *      WM_NAME(STRING) = title
         */
-       /* 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     iscentered     
isfloating   monitor */
+       { "Gimp",     NULL,       NULL,       0,            False,         
True,        -1 },
+       { "Firefox",  NULL,       NULL,       1 << 8,       False,         
False,       -1 },
 };
 
 /* layout(s) */
diff --git a/dwm.c b/dwm.c
index 1bbb4b3..a8a3356 100644
--- a/dwm.c
+++ b/dwm.c
@@ -91,7 +91,7 @@ struct Client {
        int basew, baseh, incw, inch, maxw, maxh, minw, minh;
        int bw, oldbw;
        unsigned int tags;
-       Bool isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
+       Bool isfixed, iscentered, isfloating, isurgent, neverfocus, oldstate, 
isfullscreen;
        Client *next;
        Client *snext;
        Monitor *mon;
@@ -136,6 +136,7 @@ typedef struct {
        const char *instance;
        const char *title;
        unsigned int tags;
+       Bool iscentered;
        Bool isfloating;
        int monitor;
 } Rule;
@@ -294,6 +295,7 @@ applyrules(Client *c) {
                && (!r->class || strstr(class, r->class))
                && (!r->instance || strstr(instance, r->instance)))
                {
+                       c->iscentered = r->iscentered;
                        c->isfloating = r->isfloating;
                        c->tags |= r->tags;
                        for(m = mons; m && m->num != r->monitor; m = m->next);
@@ -1038,6 +1040,11 @@ manage(Window w, XWindowAttributes *wa) {
                   && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : 
c->mon->my);
        c->bw = borderpx;
 
+       if(c->iscentered) {
+               c->x = (c->mon->mw - WIDTH(c)) / 2;
+               c->y = (c->mon->mh - HEIGHT(c)) / 2;
+       }
+
        wc.border_width = c->bw;
        XConfigureWindow(dpy, w, CWBorderWidth, &wc);
        XSetWindowBorder(dpy, w, scheme[SchemeNorm].border->rgb);

Attachment: pgp0kw4p37buX.pgp
Description: PGP signature

Reply via email to