This diff fixes some bugs in cwm that occur when a window changes from
one maximized state (horizontal, vertical or full) to another.

For instance:

1. Focus a non-maximized window.
2. Press CM-= to vertically maximize it.
3. Press CM-f to fully maximize it.
4. Press CM-= to vertically maximize it again. The window is
   horizontally maximized instead.

Another:

1. Focus a non-maximized window.
2. Press CM-= to vertically maximize it.
3. Press CM-f to fully maximize it.
4. Press CM-f to unmaximize it.
5. Press CM-= to vertically maximize it again. The size of the window
   doesn't change.
6. Press CM-= to try again. Now the window is vertically maximized.

With this diff, cwm maximizes windows in a way I think is most useful
and least surprising.

Regards,
Tim

Index: client.c
===================================================================
RCS file: /cvs/xenocara/app/cwm/client.c,v
retrieving revision 1.86
diff -p -u -r1.86 client.c
--- client.c    14 Jul 2011 11:39:53 -0000      1.86
+++ client.c    18 Aug 2011 20:20:45 -0000
@@ -312,6 +312,7 @@ calc:
                cc->geom.width = xmax - (sc->gap.left + sc->gap.right);
                cc->bwidth = 0;
                cc->flags |= CLIENT_MAXIMIZED;
+               cc->flags &= ~(CLIENT_VMAXIMIZED | CLIENT_HMAXIMIZED);
        }
 
        client_resize(cc);
@@ -329,11 +330,16 @@ client_vertmaximize(struct client_ctx *c
        if (cc->flags & CLIENT_VMAXIMIZED) {
                cc->geom.y = cc->savegeom.y;
                cc->geom.height = cc->savegeom.height;
-               cc->bwidth = Conf.bwidth;
                cc->flags &= ~CLIENT_VMAXIMIZED;
        } else {
                if (!(cc->flags & (CLIENT_MAXIMIZED | CLIENT_HMAXIMIZED)))
                        cc->savegeom = cc->geom;
+               else {
+                       cc->geom.x = cc->savegeom.x;
+                       cc->geom.width = cc->savegeom.width;
+                       cc->bwidth = Conf.bwidth;
+                       cc->flags &= ~(CLIENT_MAXIMIZED | CLIENT_HMAXIMIZED);
+               }
                if (HasXinerama) {
                        XineramaScreenInfo *xine;
                        xine = screen_find_xinerama(sc,
@@ -366,11 +372,16 @@ client_horizmaximize(struct client_ctx *
        if (cc->flags & CLIENT_HMAXIMIZED) {
                cc->geom.x = cc->savegeom.x;
                cc->geom.width = cc->savegeom.width;
-               cc->bwidth = Conf.bwidth;
                cc->flags &= ~CLIENT_HMAXIMIZED;
        } else {
                if (!(cc->flags & (CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED)))
                        cc->savegeom = cc->geom;
+               else {
+                       cc->geom.y = cc->savegeom.y;
+                       cc->geom.height = cc->savegeom.height;
+                       cc->bwidth = Conf.bwidth;
+                       cc->flags &= ~(CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED);
+               }
                if (HasXinerama) {
                        XineramaScreenInfo *xine;
                        xine = screen_find_xinerama(sc,

Reply via email to