summaryrefslogtreecommitdiff
path: root/src/client.c
diff options
context:
space:
mode:
authorOlivier Fourdan <fourdan@xfce.org>2010-12-15 14:56:00 +0100
committerOlivier Fourdan <fourdan@xfce.org>2010-12-15 14:57:19 +0100
commitb71a3b996e4bffeb14eec2799f7214c00af26583 (patch)
tree7eaaab516e29b8fc06c15472ca1c185c46663dbd /src/client.c
parent9f01853ab8406f2ee8e4261094da556c800ea999 (diff)
downloadxfwm4-b71a3b996e4bffeb14eec2799f7214c00af26583.tar.gz
Fix bug #6902
Implements clone monitor detection and other general xrandr improvements.
Diffstat (limited to 'src/client.c')
-rw-r--r--src/client.c41
1 files changed, 24 insertions, 17 deletions
diff --git a/src/client.c b/src/client.c
index f3d135a12..fc6886b6a 100644
--- a/src/client.c
+++ b/src/client.c
@@ -3466,11 +3466,12 @@ clientIncOpacity (Client * c)
/* Xrandr stuff: on screen size change, make sure all clients are still visible */
void
-clientScreenResize(ScreenInfo *screen_info)
+clientScreenResize(ScreenInfo *screen_info, gboolean fully_visible)
{
Client *c = NULL;
GList *list, *list_of_windows;
XWindowChanges wc;
+ unsigned short configure_flags;
list_of_windows = clientGetStackList (screen_info);
@@ -3502,27 +3503,33 @@ clientScreenResize(ScreenInfo *screen_info)
/* Recompute size and position of maximized windows */
if (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ | CLIENT_FLAG_MAXIMIZED_VERT))
{
- /* Too bad, the flags used internally are different from the WIN_STATE_* bits */
- maximization_flags |= FLAG_TEST (c->flags,
- CLIENT_FLAG_MAXIMIZED_HORIZ) ? WIN_STATE_MAXIMIZED_HORIZ : 0;
- maximization_flags |= FLAG_TEST (c->flags,
- CLIENT_FLAG_MAXIMIZED_VERT) ? WIN_STATE_MAXIMIZED_VERT : 0;
+ /* Too bad, the flags used internally are different from the WIN_STATE_* bits */
+ maximization_flags |= FLAG_TEST (c->flags,
+ CLIENT_FLAG_MAXIMIZED_HORIZ) ? WIN_STATE_MAXIMIZED_HORIZ : 0;
+ maximization_flags |= FLAG_TEST (c->flags,
+ CLIENT_FLAG_MAXIMIZED_VERT) ? WIN_STATE_MAXIMIZED_VERT : 0;
- /* Force an update by clearing the internal flags */
- FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ | CLIENT_FLAG_MAXIMIZED_VERT);
- clientToggleMaximized (c, maximization_flags, FALSE);
+ /* Force an update by clearing the internal flags */
+ FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ | CLIENT_FLAG_MAXIMIZED_VERT);
+ clientToggleMaximized (c, maximization_flags, FALSE);
- wc.x = c->x;
- wc.y = c->y;
- wc.width = c->width;
- wc.height = c->height;
- clientConfigure (c, &wc, CWX | CWY | CWWidth | CWHeight, CFG_NOTIFY);
+ wc.x = c->x;
+ wc.y = c->y;
+ wc.width = c->width;
+ wc.height = c->height;
+ clientConfigure (c, &wc, CWX | CWY | CWWidth | CWHeight, CFG_NOTIFY);
}
else
{
- wc.x = c->x;
- wc.y = c->y;
- clientConfigure (c, &wc, CWX | CWY, CFG_CONSTRAINED | CFG_REQUEST);
+ configure_flags = CFG_CONSTRAINED | CFG_REQUEST;
+ if (fully_visible)
+ {
+ configure_flags |= CFG_KEEP_VISIBLE;
+ }
+
+ wc.x = c->x;
+ wc.y = c->y;
+ clientConfigure (c, &wc, CWX | CWY, configure_flags);
}
}