Add a keybinding to allow horizontal maximisation of a window (CMS-enter).

based on a diff by Thomas Pfaff; thanks!

ok okan@
This commit is contained in:
oga 2009-08-24 23:54:41 +00:00
parent 028a1778db
commit e2b1cb98c1
6 changed files with 56 additions and 4 deletions

View File

@ -96,6 +96,8 @@ TAILQ_HEAD(screen_ctx_q, screen_ctx);
#define CLIENT_MAXIMIZED 0x08 #define CLIENT_MAXIMIZED 0x08
#define CLIENT_DOVMAXIMIZE 0x10 #define CLIENT_DOVMAXIMIZE 0x10
#define CLIENT_VMAXIMIZED 0x20 #define CLIENT_VMAXIMIZED 0x20
#define CLIENT_DOHMAXIMIZE 0x40
#define CLIENT_HMAXIMIZED 0x80
#define CLIENT_HIGHLIGHT_GROUP 1 #define CLIENT_HIGHLIGHT_GROUP 1
#define CLIENT_HIGHLIGHT_UNGROUP 2 #define CLIENT_HIGHLIGHT_UNGROUP 2
@ -347,6 +349,7 @@ void client_ptrsave(struct client_ctx *);
void client_draw_border(struct client_ctx *); void client_draw_border(struct client_ctx *);
void client_maximize(struct client_ctx *); void client_maximize(struct client_ctx *);
void client_vertmaximize(struct client_ctx *); void client_vertmaximize(struct client_ctx *);
void client_horizmaximize(struct client_ctx *);
void client_map(struct client_ctx *); void client_map(struct client_ctx *);
void client_mtf(struct client_ctx *); void client_mtf(struct client_ctx *);
struct client_ctx *client_cycle(int); struct client_ctx *client_cycle(int);
@ -436,6 +439,8 @@ void kbfunc_client_maximize(struct client_ctx *,
union arg *); union arg *);
void kbfunc_client_vmaximize(struct client_ctx *, void kbfunc_client_vmaximize(struct client_ctx *,
union arg *); union arg *);
void kbfunc_client_hmaximize(struct client_ctx *,
union arg *);
void kbfunc_reload(struct client_ctx *, union arg *); void kbfunc_reload(struct client_ctx *, union arg *);
void kbfunc_quit_wm(struct client_ctx *, union arg *); void kbfunc_quit_wm(struct client_ctx *, union arg *);
void kbfunc_moveresize(struct client_ctx *, union arg *); void kbfunc_moveresize(struct client_ctx *, union arg *);

View File

@ -224,7 +224,7 @@ client_maximize(struct client_ctx *cc)
if (cc->flags & CLIENT_MAXIMIZED) { if (cc->flags & CLIENT_MAXIMIZED) {
cc->geom = cc->savegeom; cc->geom = cc->savegeom;
} else { } else {
if (!(cc->flags & CLIENT_VMAXIMIZED)) if (!(cc->flags & (CLIENT_VMAXIMIZED | CLIENT_HMAXIMIZED)))
cc->savegeom = cc->geom; cc->savegeom = cc->geom;
if (HasXinerama) { if (HasXinerama) {
XineramaScreenInfo *xine; XineramaScreenInfo *xine;
@ -263,7 +263,7 @@ client_vertmaximize(struct client_ctx *cc)
if (cc->flags & CLIENT_VMAXIMIZED) { if (cc->flags & CLIENT_VMAXIMIZED) {
cc->geom = cc->savegeom; cc->geom = cc->savegeom;
} else { } else {
if (!(cc->flags & CLIENT_MAXIMIZED)) if (!(cc->flags & (CLIENT_MAXIMIZED | CLIENT_HMAXIMIZED)))
cc->savegeom = cc->geom; cc->savegeom = cc->geom;
if (HasXinerama) { if (HasXinerama) {
XineramaScreenInfo *xine; XineramaScreenInfo *xine;
@ -285,10 +285,42 @@ calc:
client_resize(cc); 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 void
client_resize(struct client_ctx *cc) 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) { if (cc->flags & CLIENT_DOMAXIMIZE) {
cc->flags &= ~CLIENT_DOMAXIMIZE; cc->flags &= ~CLIENT_DOMAXIMIZE;
@ -296,6 +328,9 @@ client_resize(struct client_ctx *cc)
} else if (cc->flags & CLIENT_DOVMAXIMIZE) { } else if (cc->flags & CLIENT_DOVMAXIMIZE) {
cc->flags &= ~CLIENT_DOVMAXIMIZE; cc->flags &= ~CLIENT_DOVMAXIMIZE;
cc->flags |= CLIENT_VMAXIMIZED; 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, XMoveResizeWindow(X_Dpy, cc->win, cc->geom.x,

2
conf.c
View File

@ -135,6 +135,7 @@ conf_init(struct conf *c)
conf_bindname(c, "CM-g", "grouptoggle"); conf_bindname(c, "CM-g", "grouptoggle");
conf_bindname(c, "CM-f", "maximize"); conf_bindname(c, "CM-f", "maximize");
conf_bindname(c, "CM-equal", "vmaximize"); conf_bindname(c, "CM-equal", "vmaximize");
conf_bindname(c, "CMS-equal", "hmaximize");
conf_bindname(c, "CMS-r", "reload"); conf_bindname(c, "CMS-r", "reload");
conf_bindname(c, "CMS-q", "quit"); conf_bindname(c, "CMS-q", "quit");
@ -338,6 +339,7 @@ static struct {
{ "grouptoggle", kbfunc_client_grouptoggle, KBFLAG_NEEDCLIENT, {0}}, { "grouptoggle", kbfunc_client_grouptoggle, KBFLAG_NEEDCLIENT, {0}},
{ "maximize", kbfunc_client_maximize, KBFLAG_NEEDCLIENT, {0} }, { "maximize", kbfunc_client_maximize, KBFLAG_NEEDCLIENT, {0} },
{ "vmaximize", kbfunc_client_vmaximize, KBFLAG_NEEDCLIENT, {0} }, { "vmaximize", kbfunc_client_vmaximize, KBFLAG_NEEDCLIENT, {0} },
{ "hmaximize", kbfunc_client_hmaximize, KBFLAG_NEEDCLIENT, {0} },
{ "reload", kbfunc_reload, 0, {0} }, { "reload", kbfunc_reload, 0, {0} },
{ "quit", kbfunc_quit_wm, 0, {0} }, { "quit", kbfunc_quit_wm, 0, {0} },
{ "exec", kbfunc_exec, 0, {.i = CWM_EXEC_PROGRAM} }, { "exec", kbfunc_exec, 0, {.i = CWM_EXEC_PROGRAM} },

4
cwm.1
View File

@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: June 18 2009 $ .Dd $Mdocdate: June 19 2009 $
.Dt CWM 1 .Dt CWM 1
.Os .Os
.Sh NAME .Sh NAME
@ -92,6 +92,8 @@ Reverse cycle through active groups.
Toggle full-screen size of current window. Toggle full-screen size of current window.
.It Ic CM-= .It Ic CM-=
Toggle vertical maximization of current window. Toggle vertical maximization of current window.
.It Ic CMS-=
Toggle horizontal maximization of current window.
.It Ic M-? .It Ic M-?
Spawn Spawn
.Dq exec program .Dq exec program

View File

@ -292,6 +292,8 @@ Label current window.
Maximize current window full-screen. Maximize current window full-screen.
.It vmaximize .It vmaximize
Maximize current window vertically. Maximize current window vertically.
.It hmaximize
Maximize current window horizontally.
.It moveup .It moveup
Move window Move window
.Ar moveamount .Ar moveamount

View File

@ -481,6 +481,12 @@ kbfunc_client_vmaximize(struct client_ctx *cc, union arg *arg)
client_vertmaximize(cc); client_vertmaximize(cc);
} }
void
kbfunc_client_hmaximize(struct client_ctx *cc, union arg *arg)
{
client_horizmaximize(cc);
}
void void
kbfunc_quit_wm(struct client_ctx *cc, union arg *arg) kbfunc_quit_wm(struct client_ctx *cc, union arg *arg)
{ {