Forget that last post. I've now moved that piece of code into
arrange(), so it will be called before all layout functions.

I've also moved three instances of similar code into savergeom().
This function simply saves the revert geometry of the specified
client.

If you're using a previous patch I HIGHLY recommend updating to
this one. It uses less code and should work with all layouts
without having to do any hacks.


- Abel
diff --git a/client.c b/client.c
index cd16e11..c0d55ca 100644
--- a/client.c
+++ b/client.c
@@ -185,11 +185,12 @@ manage(Window w, XWindowAttributes *wa) {
 
        c = emallocz(sizeof(Client));
        c->tags = emallocz(ntags * sizeof(Bool));
+       c->ftview = True;
        c->win = w;
-       c->x = wa->x;
-       c->y = wa->y;
-       c->w = wa->width;
-       c->h = wa->height;
+       c->x = c->rx = wa->x;
+       c->y = c->ry = wa->y;
+       c->w = c->rw = wa->width;
+       c->h = c->rh = wa->height;
        c->oldborder = wa->border_width;
        if(c->w == sw && c->h == sh) {
                c->x = sx;
@@ -198,13 +199,13 @@ manage(Window w, XWindowAttributes *wa) {
        }
        else {
                if(c->x + c->w + 2 * c->border > wax + waw)
-                       c->x = wax + waw - c->w - 2 * c->border;
+                       c->x = c->rx = wax + waw - c->w - 2 * c->border;
                if(c->y + c->h + 2 * c->border > way + wah)
-                       c->y = way + wah - c->h - 2 * c->border;
+                       c->y = c->ry = way + wah - c->h - 2 * c->border;
                if(c->x < wax)
-                       c->x = wax;
+                       c->x = c->rx = wax;
                if(c->y < way)
-                       c->y = way;
+                       c->y = c->ry = way;
                c->border = BORDERPX;
        }
        wc.border_width = c->border;
diff --git a/dwm.h b/dwm.h
index 1a12322..7d2540d 100644
--- a/dwm.h
+++ b/dwm.h
@@ -56,6 +56,7 @@ struct Client {
        Client *prev;
        Client *snext;
        Window win;
+       Bool ftview; /* first time viewed on new layout */
 };
 
 typedef struct {
diff --git a/screen.c b/screen.c
index 255184a..1905120 100644
--- a/screen.c
+++ b/screen.c
@@ -43,12 +43,26 @@ idxoftag(const char *tag) {
 }
 
 static void
+savergeom(Client *c) {
+       c->rx = c->x;
+       c->ry = c->y;
+       c->rw = c->w;
+       c->rh = c->h;
+}
+
+static void
 floating(void) { /* default floating layout */
        Client *c;
 
        for(c = clients; c; c = c->next)
-               if(isvisible(c))
-                       resize(c, c->x, c->y, c->w, c->h, True);
+               if(isvisible(c)) {
+                       if(c->ftview && !c->isfloating) {
+                               resize(c, c->rx, c->ry, c->rw, c->rh, True);
+                               c->ftview = False;
+                       }
+                       else
+                               resize(c, c->x, c->y, c->w, c->h, True);
+               }
 }
 
 LAYOUTS
@@ -94,8 +108,13 @@ arrange(void) {
        Client *c;
 
        for(c = clients; c; c = c->next)
-               if(isvisible(c))
+               if(isvisible(c)) {
                        unban(c);
+                       if(!isfloating() && !c->isfloating && c->ftview) {
+                               savergeom(c);
+                               c->ftview = False;
+                       }
+               }
                else
                        ban(c);
        layouts[ltidx].arrange();
@@ -239,6 +258,7 @@ restack(void) {
 void
 setlayout(const char *arg) {
        unsigned int i;
+       Client *c;
 
        if(!arg) {
                if(++ltidx == nlayouts)
@@ -252,6 +272,8 @@ setlayout(const char *arg) {
                        return;
                ltidx = i;
        }
+       for(c = clients; c; c = c->next)
+               c->ftview = True;
        if(sel)
                arrange();
        else
@@ -288,7 +310,10 @@ togglefloating(const char *arg) {
                return;
        sel->isfloating = !sel->isfloating;
        if(sel->isfloating)
-               resize(sel, sel->x, sel->y, sel->w, sel->h, True);
+               resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
+       else
+               savergeom(sel);
+
        arrange();
 }
 
@@ -299,10 +324,7 @@ togglemax(const char *arg) {
        if(!sel || (!isfloating() && !sel->isfloating) || sel->isfixed)
                return;
        if((sel->ismax = !sel->ismax)) {
-               sel->rx = sel->x;
-               sel->ry = sel->y;
-               sel->rw = sel->w;
-               sel->rh = sel->h;
+               savergeom(sel);
                resize(sel, wax, way, waw - 2 * sel->border, wah - 2 * 
sel->border, True);
        }
        else
diff --git a/tile.c b/tile.c

Reply via email to