From 081d2deacdc5c4e48ec88054d0224341c887aa7b Mon Sep 17 00:00:00 2001 From: oga Date: Mon, 24 Aug 2009 23:54:41 +0000 Subject: [PATCH] Add a keybinding to allow horizontal maximisation of a window (CMS-enter). based on a diff by Thomas Pfaff; thanks! ok okan@ --- app/cwm/calmwm.h | 7 ++++++- app/cwm/client.c | 43 +++++++++++++++++++++++++++++++++++++++---- app/cwm/conf.c | 4 +++- app/cwm/cwm.1 | 6 ++++-- app/cwm/cwmrc.5 | 6 ++++-- app/cwm/kbfunc.c | 8 +++++++- 6 files changed, 63 insertions(+), 11 deletions(-) diff --git a/app/cwm/calmwm.h b/app/cwm/calmwm.h index b90862229..ac32b5631 100644 --- a/app/cwm/calmwm.h +++ b/app/cwm/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.96 2009/08/24 23:49:04 okan Exp $ + * $Id: calmwm.h,v 1.97 2009/08/24 23:54:41 oga Exp $ */ #ifndef _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/app/cwm/client.c b/app/cwm/client.c index d2e3ead20..b343164eb 100644 --- a/app/cwm/client.c +++ b/app/cwm/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.60 2009/08/24 23:49:04 okan Exp $ + * $Id: client.c,v 1.61 2009/08/24 23:54:41 oga Exp $ */ #include "headers.h" @@ -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; @@ -285,10 +285,42 @@ calc: client_resize(cc); } +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/app/cwm/conf.c b/app/cwm/conf.c index 91df027e9..aa6cc1401 100644 --- a/app/cwm/conf.c +++ b/app/cwm/conf.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: conf.c,v 1.66 2009/06/26 12:21:58 okan Exp $ + * $Id: conf.c,v 1.67 2009/08/24 23:54:41 oga Exp $ */ #include "headers.h" @@ -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/app/cwm/cwm.1 b/app/cwm/cwm.1 index f7b7a9c3c..842d5e1b0 100644 --- a/app/cwm/cwm.1 +++ b/app/cwm/cwm.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: cwm.1,v 1.42 2009/06/19 10:43:49 sobrado Exp $ +.\" $OpenBSD: cwm.1,v 1.43 2009/08/24 23:54:41 oga Exp $ .\" .\" Copyright (c) 2004,2005 Marius Aamodt Eriksen .\" @@ -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 19 2009 $ +.Dd $Mdocdate: August 24 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/app/cwm/cwmrc.5 b/app/cwm/cwmrc.5 index 25cf080fb..e1f0740cd 100644 --- a/app/cwm/cwmrc.5 +++ b/app/cwm/cwmrc.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: cwmrc.5,v 1.27 2009/08/08 17:27:51 okan Exp $ +.\" $OpenBSD: cwmrc.5,v 1.28 2009/08/24 23:54:41 oga Exp $ .\" .\" Copyright (c) 2004,2005 Marius Aamodt Eriksen .\" @@ -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: August 8 2009 $ +.Dd $Mdocdate: August 24 2009 $ .Dt CWMRC 5 .Os .Sh NAME @@ -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/app/cwm/kbfunc.c b/app/cwm/kbfunc.c index 505828e4a..a276406e7 100644 --- a/app/cwm/kbfunc.c +++ b/app/cwm/kbfunc.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: kbfunc.c,v 1.40 2009/06/20 00:55:42 okan Exp $ + * $Id: kbfunc.c,v 1.41 2009/08/24 23:54:41 oga Exp $ */ #include @@ -481,6 +481,12 @@ kbfunc_client_vmaximize(struct client_ctx *cc, union arg *arg) client_vertmaximize(cc); } +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) {