[mutter] compositor: Delay meta_compositor_add_window until the first show



commit e3a93db712aea3c138b287786e4cd8d3ce0968d8
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Thu Feb 6 15:01:59 2014 -0500

    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 |   26 ++++++++++----------------
 src/core/window.c           |    7 ++-----
 2 files changed, 12 insertions(+), 21 deletions(-)
---
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index e967708..a9cd391 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -137,19 +137,6 @@ meta_compositor_destroy (MetaCompositor *compositor)
 }
 
 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,
                 MetaWindow         *window)
@@ -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);
 
-  DEBUG_TRACE ("meta_compositor_add_window\n");
-  meta_error_trap_push (display);
+  g_return_if_fail (info != NULL);
 
-  add_win (window);
+  /* Window was already added previously, probably coming
+   * back from hiding */
+  if (window->compositor_private != NULL)
+    return;
 
+  meta_error_trap_push (display);
+  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 92d4c39..3583f24 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);
         }
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]