diff options
author | Olivier Fourdan <fourdan@xfce.org> | 2010-12-15 14:56:00 +0100 |
---|---|---|
committer | Olivier Fourdan <fourdan@xfce.org> | 2010-12-15 14:57:19 +0100 |
commit | b71a3b996e4bffeb14eec2799f7214c00af26583 (patch) | |
tree | 7eaaab516e29b8fc06c15472ca1c185c46663dbd /src/client.c | |
parent | 9f01853ab8406f2ee8e4261094da556c800ea999 (diff) | |
download | xfwm4-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.c | 41 |
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); } } |