From 4efe4483fbc7602e8358fda936074216a8e5544b Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Thu, 6 Feb 2014 15:01:59 -0500 Subject: [PATCH] compositor: Delay meta_compositor_add_window until the first show In order for the compositor to properly determine whether a client is an X11 client or not, we need to wait until XWayland calls set_window_id to mark the surface as an XWayland client. To prevent the compositor from getting tripped up over this, make sure that the window has been fully initialized by the time we call meta_compositor_add_window. https://bugzilla.gnome.org/show_bug.cgi?id=720631 --- src/compositor/compositor.c | 28 +++++++++++----------------- src/core/window.c | 7 ++----- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 0fb8df9e3..6ed2df400 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -140,19 +140,6 @@ meta_compositor_destroy (MetaCompositor *compositor) clutter_threads_remove_repaint_func (compositor->repaint_func_id); } -static void -add_win (MetaWindow *window) -{ - MetaScreen *screen = meta_window_get_screen (window); - MetaCompScreen *info = meta_screen_get_compositor_data (screen); - - g_return_if_fail (info != NULL); - - meta_window_actor_new (window); - - sync_actor_stacking (info); -} - static void process_damage (MetaCompositor *compositor, XDamageNotifyEvent *event, @@ -835,13 +822,20 @@ meta_compositor_add_window (MetaCompositor *compositor, { MetaScreen *screen = meta_window_get_screen (window); MetaDisplay *display = meta_screen_get_display (screen); + MetaCompScreen *info = meta_screen_get_compositor_data (screen); + + g_return_if_fail (info != NULL); + + /* Window was already added previously, probably coming + * back from hiding */ + if (window->compositor_private != NULL) + return; - DEBUG_TRACE ("meta_compositor_add_window\n"); meta_error_trap_push (display); - - add_win (window); - + meta_window_actor_new (window); meta_error_trap_pop (display); + + sync_actor_stacking (info); } void diff --git a/src/core/window.c b/src/core/window.c index e08704d92..8c0f66e03 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -1204,9 +1204,6 @@ _meta_window_shared_new (MetaDisplay *display, set_net_wm_state (window); } - if (screen->display->compositor) - meta_compositor_add_window (screen->display->compositor, window); - /* Sync stack changes */ meta_stack_thaw (window->screen->stack); @@ -2757,8 +2754,8 @@ meta_window_show (MetaWindow *window) break; } - meta_compositor_show_window (window->display->compositor, - window, effect); + meta_compositor_add_window (window->display->compositor, window); + meta_compositor_show_window (window->display->compositor, window, effect); } }