From e3a93db712aea3c138b287786e4cd8d3ce0968d8 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 e96770838..a9cd39180 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -136,19 +136,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, @@ -737,13 +724,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 92d4c39fd..3583f2426 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -1438,9 +1438,6 @@ meta_window_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); @@ -3054,8 +3051,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); } }