From 2ebedb822d0d5dce6c6a2a47b007b2703a021d8c Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Mon, 15 Jun 2009 18:25:07 -0400 Subject: [PATCH] Avoid moving and resizing override-redirect windows Override-redirect windows should not be moved or resized by the window manager. - Mark override-redirect windows as already placed to avoid placing them when first shown. - Don't move-resize newly created override-redirect MetaWindow - Don't queue a resize on override-redirect windows when reading their WM_TRANSIENT_FOR hint. - Add g_return_if_fail (!window->override_redirect) to catch unexpected code paths that might result in override-redirect windows being moved or resized. http://bugzilla.gnome.org/show_bug.cgi?id=582639 --- src/core/window-props.c | 2 +- src/core/window.c | 44 +++++++++++++++++++++++++++++------------ 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/core/window-props.c b/src/core/window-props.c index b1370edb1..6b5a6c488 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -1446,7 +1446,7 @@ reload_transient_for (MetaWindow *window, window->xtransient_for != window->xgroup_leader) meta_window_group_leader_changed (window); - if (!window->constructing) + if (!window->constructing && !window->override_redirect) meta_window_queue (window, META_QUEUE_MOVE_RESIZE); } diff --git a/src/core/window.c b/src/core/window.c index 1c81d8ecf..4fab34aa8 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -678,8 +678,9 @@ meta_window_new_with_attrs (MetaDisplay *display, window->hidden = 0; /* if already mapped, no need to worry about focus-on-first-time-showing */ window->showing_for_first_time = !window->mapped; - /* if already mapped we don't want to do the placement thing */ - window->placed = (window->mapped && !window->hidden); + /* if already mapped we don't want to do the placement thing; + * override-redirect windows are placed by the app */ + window->placed = ((window->mapped && !window->hidden) || window->override_redirect); if (window->placed) meta_topic (META_DEBUG_PLACEMENT, "Not placing window 0x%lx since it's already mapped\n", @@ -963,13 +964,14 @@ meta_window_new_with_attrs (MetaDisplay *display, */ flags = META_IS_CONFIGURE_REQUEST | META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION; - meta_window_move_resize_internal (window, - flags, - window->size_hints.win_gravity, - window->size_hints.x, - window->size_hints.y, - window->size_hints.width, - window->size_hints.height); + if (!window->override_redirect) + meta_window_move_resize_internal (window, + flags, + window->size_hints.win_gravity, + window->size_hints.x, + window->size_hints.y, + window->size_hints.width, + window->size_hints.height); /* Now try applying saved stuff from the session */ { @@ -1958,6 +1960,9 @@ meta_window_queue (MetaWindow *window, guint queuebits) { guint queuenum; + /* Easier to debug by checking here rather than in the idle */ + g_return_if_fail (!((queuebits & META_QUEUE_MOVE_RESIZE) != 0 && window->override_redirect)); + for (queuenum=0; queuenumoverride_redirect); + is_configure_request = (flags & META_IS_CONFIGURE_REQUEST) != 0; do_gravity_adjust = (flags & META_DO_GRAVITY_ADJUST) != 0; is_user_action = (flags & META_IS_USER_ACTION) != 0; @@ -4009,6 +4016,8 @@ meta_window_resize (MetaWindow *window, int x, y; MetaMoveResizeFlags flags; + g_return_if_fail (!window->override_redirect); + meta_window_get_position (window, &x, &y); flags = (user_op ? META_IS_USER_ACTION : 0) | META_IS_RESIZE_ACTION; @@ -4024,8 +4033,12 @@ meta_window_move (MetaWindow *window, int root_x_nw, int root_y_nw) { - MetaMoveResizeFlags flags = - (user_op ? META_IS_USER_ACTION : 0) | META_IS_MOVE_ACTION; + MetaMoveResizeFlags flags; + + g_return_if_fail (!window->override_redirect); + + flags = (user_op ? META_IS_USER_ACTION : 0) | META_IS_MOVE_ACTION; + meta_window_move_resize_internal (window, flags, NorthWestGravity, @@ -4042,8 +4055,11 @@ meta_window_move_resize (MetaWindow *window, int w, int h) { - MetaMoveResizeFlags flags = - (user_op ? META_IS_USER_ACTION : 0) | + MetaMoveResizeFlags flags; + + g_return_if_fail (!window->override_redirect); + + flags = (user_op ? META_IS_USER_ACTION : 0) | META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION; meta_window_move_resize_internal (window, flags, @@ -7157,6 +7173,8 @@ meta_window_shove_titlebar_onscreen (MetaWindow *window) int horiz_amount, vert_amount; int newx, newy; + g_return_if_fail (!window->override_redirect); + /* If there's no titlebar, don't bother */ if (!window->frame) return;