mirror of
https://github.com/leahneukirchen/cwm.git
synced 2023-08-10 21:13:12 +03:00
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@.
This commit is contained in:
parent
b852a73a60
commit
44d8b1d3ac
10
calmwm.h
10
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;
|
||||
|
64
client.c
64
client.c
@ -281,19 +281,26 @@ 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;
|
||||
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;
|
||||
/*
|
||||
* 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
|
||||
/* * 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,
|
||||
@ -312,8 +319,8 @@ calc:
|
||||
cc->geom.width = xmax - (sc->gap.left + sc->gap.right);
|
||||
cc->bwidth = 0;
|
||||
cc->flags |= CLIENT_MAXIMIZED;
|
||||
}
|
||||
|
||||
resize:
|
||||
client_resize(cc);
|
||||
}
|
||||
|
||||
@ -330,10 +337,21 @@ 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;
|
||||
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,
|
||||
@ -349,8 +367,8 @@ calc:
|
||||
cc->geom.height = ymax - (cc->bwidth * 2) - (sc->gap.top +
|
||||
sc->gap.bottom);
|
||||
cc->flags |= CLIENT_VMAXIMIZED;
|
||||
}
|
||||
|
||||
resize:
|
||||
client_resize(cc);
|
||||
}
|
||||
|
||||
@ -367,10 +385,20 @@ 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;
|
||||
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,
|
||||
@ -386,8 +414,8 @@ calc:
|
||||
cc->geom.width = xmax - (cc->bwidth * 2) - (sc->gap.left +
|
||||
sc->gap.right);
|
||||
cc->flags |= CLIENT_HMAXIMIZED;
|
||||
}
|
||||
|
||||
resize:
|
||||
client_resize(cc);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user