about summary refs log tree commit diff
path: root/client.c
diff options
context:
space:
mode:
authoroga <oga>2008-03-26 15:45:42 +0000
committeroga <oga>2008-03-26 15:45:42 +0000
commit34c0a0635f3323bc31481bba7b830f1e06bf3534 (patch)
tree8d525f57b4f2c6972a06d99bd06d483bfff7d179 /client.c
parente704b57d33e738ffde59921f9c9b6dad8ab6ae7b (diff)
downloadcwm-34c0a0635f3323bc31481bba7b830f1e06bf3534.tar.gz
cwm-34c0a0635f3323bc31481bba7b830f1e06bf3534.tar.xz
cwm-34c0a0635f3323bc31481bba7b830f1e06bf3534.zip
Fix a couple of issues with the maximization code.
If a window is vertically maximized, then resized, before the MAXIMIZED
flag wasn't removed, now it is. so doing a resize then does the right
thing.

Also, separate flags are needed for vertical and normal maximziation,
else when you do vertical-maximize, followed by maximize, the window
returns to it's original size.

ok simon@, okan@
Diffstat (limited to 'client.c')
-rw-r--r--client.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/client.c b/client.c
index a243f0f..b6f7aa7 100644
--- a/client.c
+++ b/client.c
@@ -331,19 +331,19 @@ void
 client_maximize(struct client_ctx *cc)
 {
 	if (cc->flags & CLIENT_MAXIMIZED) {
-		cc->flags &= ~CLIENT_MAXIMIZED;
 		cc->geom = cc->savegeom;
 	} else {
 		XWindowAttributes rootwin_geom;
 		struct screen_ctx *sc = CCTOSC(cc);
 
 		XGetWindowAttributes(X_Dpy, sc->rootwin, &rootwin_geom);
-		cc->savegeom = cc->geom;
+		if (!(cc->flags & CLIENT_VMAXIMIZED))
+			cc->savegeom = cc->geom;
 		cc->geom.x = 0;
 		cc->geom.y = 0;
 		cc->geom.height = rootwin_geom.height;
 		cc->geom.width = rootwin_geom.width;
-		cc->flags |= CLIENT_MAXIMIZED;
+		cc->flags |= CLIENT_DOMAXIMIZE;
 	}
 
 	client_resize(cc);
@@ -352,6 +352,17 @@ client_maximize(struct client_ctx *cc)
 void
 client_resize(struct client_ctx *cc)
 {
+	if (cc->flags & (CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED))
+		cc->flags &= ~(CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED);
+
+	if (cc->flags & CLIENT_DOMAXIMIZE) {
+		cc->flags &= ~CLIENT_DOMAXIMIZE;
+		cc->flags |= CLIENT_MAXIMIZED;
+	} else if (cc->flags & CLIENT_DOVMAXIMIZE) {
+		cc->flags &= ~CLIENT_DOVMAXIMIZE;
+		cc->flags |= CLIENT_VMAXIMIZED;
+	}
+
 	XMoveResizeWindow(X_Dpy, cc->pwin, cc->geom.x - cc->bwidth,
 	    cc->geom.y - cc->bwidth, cc->geom.width + cc->bwidth*2,
 	    cc->geom.height + cc->bwidth*2);
@@ -830,22 +841,22 @@ client_placecalc(struct client_ctx *cc)
 void
 client_vertmaximize(struct client_ctx *cc)
 {
-	if (cc->flags & CLIENT_MAXIMIZED) {
-		cc->flags &= ~CLIENT_MAXIMIZED;
+	if (cc->flags & CLIENT_VMAXIMIZED) {
 		cc->geom = cc->savegeom;
 	} else {
 		struct screen_ctx *sc = CCTOSC(cc);
 		int display_height = DisplayHeight(X_Dpy, sc->which) -
 		    cc->bwidth*2;
         
-		cc->savegeom = cc->geom;
+		if (!(cc->flags & CLIENT_MAXIMIZED)) 
+			cc->savegeom = cc->geom;
 		cc->geom.y = cc->bwidth;
 		if (cc->geom.min_dx == 0)
 			cc->geom.height = display_height; 
 		else
 			cc->geom.height = display_height -
 			    (display_height % cc->geom.min_dx);
-		cc->flags |= CLIENT_MAXIMIZED;
+		cc->flags |= CLIENT_DOVMAXIMIZE;
 	}
 
 	client_resize(cc);