summary refs log tree commit diff
path: root/client.c
diff options
context:
space:
mode:
authoroga <oga>2009-08-24 23:54:41 +0000
committeroga <oga>2009-08-24 23:54:41 +0000
commite2b1cb98c1bc82d407e8a1004c3a5135ffa1d86c (patch)
treee4610b27667192e8b8bf7cf366bc0c433e788e04 /client.c
parent028a1778db0caa04ca4f82be32998a7f65c802a5 (diff)
downloadcwm-e2b1cb98c1bc82d407e8a1004c3a5135ffa1d86c.tar.gz
cwm-e2b1cb98c1bc82d407e8a1004c3a5135ffa1d86c.tar.xz
cwm-e2b1cb98c1bc82d407e8a1004c3a5135ffa1d86c.zip
Add a keybinding to allow horizontal maximisation of a window (CMS-enter).
based on a diff by Thomas Pfaff; thanks!

ok okan@
Diffstat (limited to 'client.c')
-rw-r--r--client.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/client.c b/client.c
index 31a0d7a..2a021a4 100644
--- a/client.c
+++ b/client.c
@@ -224,7 +224,7 @@ client_maximize(struct client_ctx *cc)
 	if (cc->flags & CLIENT_MAXIMIZED) {
 		cc->geom = cc->savegeom;
 	} else {
-		if (!(cc->flags & CLIENT_VMAXIMIZED))
+		if (!(cc->flags & (CLIENT_VMAXIMIZED | CLIENT_HMAXIMIZED)))
 			cc->savegeom = cc->geom;
 		if (HasXinerama) {
 			XineramaScreenInfo *xine;
@@ -263,7 +263,7 @@ client_vertmaximize(struct client_ctx *cc)
 	if (cc->flags & CLIENT_VMAXIMIZED) {
 		cc->geom = cc->savegeom;
 	} else {
-		if (!(cc->flags & CLIENT_MAXIMIZED))
+		if (!(cc->flags & (CLIENT_MAXIMIZED | CLIENT_HMAXIMIZED)))
 			cc->savegeom = cc->geom;
 		if (HasXinerama) {
 			XineramaScreenInfo *xine;
@@ -286,9 +286,41 @@ calc:
 }
 
 void
+client_horizmaximize(struct client_ctx *cc)
+{
+	struct screen_ctx	*sc = CCTOSC(cc);
+	int			 x_org = 0, xmax = sc->xmax;
+
+	if (cc->flags & CLIENT_HMAXIMIZED) {
+		cc->geom = cc->savegeom;
+	} else {
+		if (!(cc->flags & (CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED)))
+			cc->savegeom = cc->geom;
+		if (HasXinerama) {
+			XineramaScreenInfo *xine;
+			xine = screen_find_xinerama(CCTOSC(cc),
+			    cc->geom.x + cc->geom.width / 2,
+			    cc->geom.y + cc->geom.height / 2);
+			if (xine == NULL)
+				goto calc;
+			x_org = xine->x_org;
+			xmax = xine->width;
+		}
+calc:
+		cc->geom.x = x_org + Conf.gap_left;
+		cc->geom.width = xmax - (cc->bwidth * 2) - (Conf.gap_left +
+		    Conf.gap_right);
+		cc->flags |= CLIENT_DOHMAXIMIZE;
+	}
+
+	client_resize(cc);
+}
+
+void
 client_resize(struct client_ctx *cc)
 {
-	cc->flags &= ~(CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED);
+	cc->flags &= ~(CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED |
+	    CLIENT_HMAXIMIZED);
 
 	if (cc->flags & CLIENT_DOMAXIMIZE) {
 		cc->flags &= ~CLIENT_DOMAXIMIZE;
@@ -296,6 +328,9 @@ client_resize(struct client_ctx *cc)
 	} else if (cc->flags & CLIENT_DOVMAXIMIZE) {
 		cc->flags &= ~CLIENT_DOVMAXIMIZE;
 		cc->flags |= CLIENT_VMAXIMIZED;
+	} else if (cc->flags & CLIENT_DOHMAXIMIZE) {
+		cc->flags &= ~CLIENT_DOHMAXIMIZE;
+		cc->flags |= CLIENT_HMAXIMIZED;
 	}
 
 	XMoveResizeWindow(X_Dpy, cc->win, cc->geom.x,