summary refs log tree commit diff
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
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@
-rw-r--r--calmwm.h5
-rw-r--r--client.c41
-rw-r--r--conf.c2
-rw-r--r--cwm.14
-rw-r--r--cwmrc.52
-rw-r--r--kbfunc.c6
6 files changed, 56 insertions, 4 deletions
diff --git a/calmwm.h b/calmwm.h
index aa46793..bfc5ed6 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -96,6 +96,8 @@ TAILQ_HEAD(screen_ctx_q, screen_ctx);
 #define CLIENT_MAXIMIZED	0x08
 #define CLIENT_DOVMAXIMIZE	0x10
 #define CLIENT_VMAXIMIZED	0x20
+#define CLIENT_DOHMAXIMIZE	0x40
+#define CLIENT_HMAXIMIZED	0x80
 
 #define CLIENT_HIGHLIGHT_GROUP		1
 #define CLIENT_HIGHLIGHT_UNGROUP	2
@@ -347,6 +349,7 @@ void			 client_ptrsave(struct client_ctx *);
 void			 client_draw_border(struct client_ctx *);
 void			 client_maximize(struct client_ctx *);
 void			 client_vertmaximize(struct client_ctx *);
+void			 client_horizmaximize(struct client_ctx *);
 void			 client_map(struct client_ctx *);
 void			 client_mtf(struct client_ctx *);
 struct client_ctx	*client_cycle(int);
@@ -436,6 +439,8 @@ void			 kbfunc_client_maximize(struct client_ctx *,
 			     union arg *);
 void			 kbfunc_client_vmaximize(struct client_ctx *,
 			     union arg *);
+void			 kbfunc_client_hmaximize(struct client_ctx *,
+			     union arg *);
 void			 kbfunc_reload(struct client_ctx *, union arg *);
 void			 kbfunc_quit_wm(struct client_ctx *, union arg *);
 void			 kbfunc_moveresize(struct client_ctx *, union arg *);
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,
diff --git a/conf.c b/conf.c
index f07f382..25f32be 100644
--- a/conf.c
+++ b/conf.c
@@ -135,6 +135,7 @@ conf_init(struct conf *c)
 	conf_bindname(c, "CM-g", "grouptoggle");
 	conf_bindname(c, "CM-f", "maximize");
 	conf_bindname(c, "CM-equal", "vmaximize");
+	conf_bindname(c, "CMS-equal", "hmaximize");
 	conf_bindname(c, "CMS-r", "reload");
 	conf_bindname(c, "CMS-q", "quit");
 
@@ -338,6 +339,7 @@ static struct {
 	{ "grouptoggle", kbfunc_client_grouptoggle, KBFLAG_NEEDCLIENT, {0}},
 	{ "maximize", kbfunc_client_maximize, KBFLAG_NEEDCLIENT, {0} },
 	{ "vmaximize", kbfunc_client_vmaximize, KBFLAG_NEEDCLIENT, {0} },
+	{ "hmaximize", kbfunc_client_hmaximize, KBFLAG_NEEDCLIENT, {0} },
 	{ "reload", kbfunc_reload, 0, {0} },
 	{ "quit", kbfunc_quit_wm, 0, {0} },
 	{ "exec", kbfunc_exec, 0, {.i = CWM_EXEC_PROGRAM} },
diff --git a/cwm.1 b/cwm.1
index 06a0019..8a27bd5 100644
--- a/cwm.1
+++ b/cwm.1
@@ -14,7 +14,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: June 18 2009 $
+.Dd $Mdocdate: June 19 2009 $
 .Dt CWM 1
 .Os
 .Sh NAME
@@ -92,6 +92,8 @@ Reverse cycle through active groups.
 Toggle full-screen size of current window.
 .It Ic CM-=
 Toggle vertical maximization of current window.
+.It Ic CMS-=
+Toggle horizontal maximization of current window.
 .It Ic M-?
 Spawn
 .Dq exec program
diff --git a/cwmrc.5 b/cwmrc.5
index f71b817..66537cb 100644
--- a/cwmrc.5
+++ b/cwmrc.5
@@ -292,6 +292,8 @@ Label current window.
 Maximize current window full-screen.
 .It vmaximize
 Maximize current window vertically.
+.It hmaximize
+Maximize current window horizontally.
 .It moveup
 Move window
 .Ar moveamount
diff --git a/kbfunc.c b/kbfunc.c
index 125e1f5..59a37f2 100644
--- a/kbfunc.c
+++ b/kbfunc.c
@@ -482,6 +482,12 @@ kbfunc_client_vmaximize(struct client_ctx *cc, union arg *arg)
 }
 
 void
+kbfunc_client_hmaximize(struct client_ctx *cc, union arg *arg)
+{
+	client_horizmaximize(cc);
+}
+
+void
 kbfunc_quit_wm(struct client_ctx *cc, union arg *arg)
 {
 	_xev_quit = 1;