diff options
author | oga <oga> | 2008-03-26 15:45:42 +0000 |
---|---|---|
committer | oga <oga> | 2008-03-26 15:45:42 +0000 |
commit | 34c0a0635f3323bc31481bba7b830f1e06bf3534 (patch) | |
tree | 8d525f57b4f2c6972a06d99bd06d483bfff7d179 | |
parent | e704b57d33e738ffde59921f9c9b6dad8ab6ae7b (diff) | |
download | cwm-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@
-rw-r--r-- | calmwm.h | 20 | ||||
-rw-r--r-- | client.c | 25 |
2 files changed, 29 insertions, 16 deletions
diff --git a/calmwm.h b/calmwm.h index 5317f17..a784798 100644 --- a/calmwm.h +++ b/calmwm.h @@ -95,18 +95,20 @@ struct screen_ctx { TAILQ_HEAD(screen_ctx_q, screen_ctx); -#define CLIENT_PROTO_DELETE 0x01 -#define CLIENT_PROTO_TAKEFOCUS 0x02 +#define CLIENT_PROTO_DELETE 0x01 +#define CLIENT_PROTO_TAKEFOCUS 0x02 -#define CLIENT_MAXNAMEQLEN 5 +#define CLIENT_MAXNAMEQLEN 5 -#define CLIENT_HIDDEN 0x01 -#define CLIENT_IGNORE 0x02 -#define CLIENT_INQUEUE 0x04 /* tmp used by search code */ -#define CLIENT_MAXIMIZED 0x08 +#define CLIENT_HIDDEN 0x01 +#define CLIENT_IGNORE 0x02 +#define CLIENT_DOMAXIMIZE 0x04 +#define CLIENT_MAXIMIZED 0x08 +#define CLIENT_DOVMAXIMIZE 0x10 +#define CLIENT_VMAXIMIZED 0x20 -#define CLIENT_HIGHLIGHT_BLUE 1 -#define CLIENT_HIGHLIGHT_RED 2 +#define CLIENT_HIGHLIGHT_BLUE 1 +#define CLIENT_HIGHLIGHT_RED 2 struct winname { 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); |