From 44d8b1d3ace79e2c648e859f931f76a027f51ff0 Mon Sep 17 00:00:00 2001 From: oga Date: Sun, 4 Sep 2011 16:59:31 +0000 Subject: [PATCH] Make flavours of maximisation additive. i.e. horiz-max + vertmax = full maximisation. full - horiz = vertmax. etc. Martynas wrote something like this once, so I did okan, this version seems to finally deal with the corner cases. ok okan@. --- calmwm.h | 10 ++-- client.c | 158 ++++++++++++++++++++++++++++++++----------------------- 2 files changed, 99 insertions(+), 69 deletions(-) diff --git a/calmwm.h b/calmwm.h index 7ffd157..0d035d9 100644 --- a/calmwm.h +++ b/calmwm.h @@ -143,10 +143,12 @@ struct client_ctx { int xproto; #define CLIENT_HIDDEN 0x0001 #define CLIENT_IGNORE 0x0002 -#define CLIENT_MAXIMIZED 0x0004 -#define CLIENT_VMAXIMIZED 0x0008 -#define CLIENT_HMAXIMIZED 0x0010 -#define CLIENT_FREEZE 0x0020 +#define CLIENT_VMAXIMIZED 0x0004 +#define CLIENT_HMAXIMIZED 0x0008 +#define CLIENT_FREEZE 0x0010 + +#define CLIENT_MAXFLAGS (CLIENT_VMAXIMIZED | CLIENT_HMAXIMIZED) +#define CLIENT_MAXIMIZED (CLIENT_VMAXIMIZED | CLIENT_HMAXIMIZED) int flags; int state; int active; diff --git a/client.c b/client.c index a3c4ddb..b46dede 100644 --- a/client.c +++ b/client.c @@ -281,39 +281,46 @@ client_maximize(struct client_ctx *cc) if (cc->flags & CLIENT_FREEZE) return; - if (cc->flags & CLIENT_MAXIMIZED) { + if ((cc->flags & CLIENT_MAXFLAGS) == CLIENT_MAXIMIZED) { + cc->flags &= ~CLIENT_MAXIMIZED; cc->geom = cc->savegeom; cc->bwidth = Conf.bwidth; - cc->flags &= ~CLIENT_MAXIMIZED; - } else { - if (!(cc->flags & (CLIENT_VMAXIMIZED | CLIENT_HMAXIMIZED))) - cc->savegeom = cc->geom; - if (HasXinerama) { - XineramaScreenInfo *xine; - /* - * pick screen that the middle of the window is on. - * that's probably more fair than if just the origin of - * a window is poking over a boundary - */ - xine = screen_find_xinerama(sc, - cc->geom.x + cc->geom.width / 2, - cc->geom.y + cc->geom.height / 2); - if (xine == NULL) - goto calc; - x_org = xine->x_org; - y_org = xine->y_org; - xmax = xine->width; - ymax = xine->height; - } -calc: - cc->geom.x = x_org + sc->gap.left; - cc->geom.y = y_org + sc->gap.top; - cc->geom.height = ymax - (sc->gap.top + sc->gap.bottom); - cc->geom.width = xmax - (sc->gap.left + sc->gap.right); - cc->bwidth = 0; - cc->flags |= CLIENT_MAXIMIZED; + goto resize; } + if ((cc->flags & CLIENT_VMAXIMIZED) == 0) { + cc->savegeom.height = cc->geom.height; + cc->savegeom.y = cc->geom.y; + } + + if ((cc->flags & CLIENT_HMAXIMIZED) == 0) { + cc->savegeom.width = cc->geom.width; + cc->savegeom.x = cc->geom.x; + } + + if (HasXinerama) { + XineramaScreenInfo *xine; + /* * that's probably more fair than if just the origin of * a window is poking over a boundary + */ + xine = screen_find_xinerama(sc, + cc->geom.x + cc->geom.width / 2, + cc->geom.y + cc->geom.height / 2); + if (xine == NULL) + goto calc; + x_org = xine->x_org; + y_org = xine->y_org; + xmax = xine->width; + ymax = xine->height; + } +calc: + cc->geom.x = x_org + sc->gap.left; + cc->geom.y = y_org + sc->gap.top; + cc->geom.height = ymax - (sc->gap.top + sc->gap.bottom); + cc->geom.width = xmax - (sc->gap.left + sc->gap.right); + cc->bwidth = 0; + cc->flags |= CLIENT_MAXIMIZED; + +resize: client_resize(cc); } @@ -330,27 +337,38 @@ client_vertmaximize(struct client_ctx *cc) cc->geom.y = cc->savegeom.y; cc->geom.height = cc->savegeom.height; cc->bwidth = Conf.bwidth; + if (cc->flags & CLIENT_HMAXIMIZED) + cc->geom.width -= cc->bwidth * 2; cc->flags &= ~CLIENT_VMAXIMIZED; - } else { - if (!(cc->flags & (CLIENT_MAXIMIZED | CLIENT_HMAXIMIZED))) - cc->savegeom = cc->geom; - if (HasXinerama) { - XineramaScreenInfo *xine; - xine = screen_find_xinerama(sc, - cc->geom.x + cc->geom.width / 2, - cc->geom.y + cc->geom.height / 2); - if (xine == NULL) - goto calc; - y_org = xine->y_org; - ymax = xine->height; - } -calc: - cc->geom.y = y_org + sc->gap.top; - cc->geom.height = ymax - (cc->bwidth * 2) - (sc->gap.top + - sc->gap.bottom); - cc->flags |= CLIENT_VMAXIMIZED; + goto resize; } + cc->savegeom.y = cc->geom.y; + cc->savegeom.height = cc->geom.height; + + /* if this will make us fully maximized then remove boundary */ + if ((cc->flags & CLIENT_MAXFLAGS) == CLIENT_HMAXIMIZED) { + cc->geom.width += Conf.bwidth * 2; + cc->bwidth = 0; + } + + if (HasXinerama) { + XineramaScreenInfo *xine; + xine = screen_find_xinerama(sc, + cc->geom.x + cc->geom.width / 2, + cc->geom.y + cc->geom.height / 2); + if (xine == NULL) + goto calc; + y_org = xine->y_org; + ymax = xine->height; + } +calc: + cc->geom.y = y_org + sc->gap.top; + cc->geom.height = ymax - (cc->bwidth * 2) - (sc->gap.top + + sc->gap.bottom); + cc->flags |= CLIENT_VMAXIMIZED; + +resize: client_resize(cc); } @@ -367,27 +385,37 @@ client_horizmaximize(struct client_ctx *cc) cc->geom.x = cc->savegeom.x; cc->geom.width = cc->savegeom.width; cc->bwidth = Conf.bwidth; + if (cc->flags & CLIENT_VMAXIMIZED) + cc->geom.height -= cc->bwidth * 2; cc->flags &= ~CLIENT_HMAXIMIZED; - } else { - if (!(cc->flags & (CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED))) - cc->savegeom = cc->geom; - if (HasXinerama) { - XineramaScreenInfo *xine; - xine = screen_find_xinerama(sc, - 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 + sc->gap.left; - cc->geom.width = xmax - (cc->bwidth * 2) - (sc->gap.left + - sc->gap.right); - cc->flags |= CLIENT_HMAXIMIZED; + goto resize; + } + + cc->savegeom.x = cc->geom.x; + cc->savegeom.width = cc->geom.width; + + if ((cc->flags & CLIENT_MAXFLAGS) == CLIENT_VMAXIMIZED) { + cc->geom.height += cc->bwidth * 2; + cc->bwidth = 0; } + if (HasXinerama) { + XineramaScreenInfo *xine; + xine = screen_find_xinerama(sc, + 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 + sc->gap.left; + cc->geom.width = xmax - (cc->bwidth * 2) - (sc->gap.left + + sc->gap.right); + cc->flags |= CLIENT_HMAXIMIZED; + +resize: client_resize(cc); }