aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroga2008-03-26 15:45:42 +0000
committeroga2008-03-26 15:45:42 +0000
commitd630c8ec0f3976845ef9a3527bb78032d34d3b4c (patch)
tree0b007d5bf43776e41935410f0c26232a91661514
parent702d7766ecaf4a72e54bea5a5b6c65adb6f5cfd5 (diff)
downloadcwm-d630c8ec0f3976845ef9a3527bb78032d34d3b4c.tar.gz
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.h22
-rw-r--r--client.c27
2 files changed, 31 insertions, 18 deletions
diff --git a/calmwm.h b/calmwm.h
index 024cabe..32b4b93 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $Id: calmwm.h,v 1.25 2008/03/23 15:09:21 simon Exp $
+ * $Id: calmwm.h,v 1.26 2008/03/26 15:45:42 oga Exp $
*/
#ifndef _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 f4073ab..d599684 100644
--- a/client.c
+++ b/client.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $Id: client.c,v 1.13 2008/03/22 15:09:45 oga Exp $
+ * $Id: client.c,v 1.14 2008/03/26 15:45:42 oga Exp $
*/
#include "headers.h"
@@ -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);