[mutter] Reduce server grabs during window creation



commit 10c1903c72d02d2c3f83fad09bf9617af535022f
Author: Daniel Drake <drake endlessm com>
Date:   Mon Dec 30 13:01:28 2013 -0600

    Reduce server grabs during window creation
    
    Remove some obvious server grabs from the window creation codepath,
    also ones that are taken at startup.
    
    During startup, there is no need to grab: we install the event handlers
    before querying for the already-existing windows, so there is no danger
    that we will 'lose' some window. We might try to create a window twice
    (if it comes back in the original query and then we get an event for it)
    but the code is already protected against such conditions.
    
    When windows are created later, we also do not need grabs, we just need
    appropriate error checking as the window may be destroyed at any time
    (or it may have already been destroyed).
    
    The stack tracker is unaffected here - as it listens to CreateNotify and
    DestroyNotify events and responds directly, the internal stack
    representation will always be consistent even if the window goes away while
    we are processing MapRequest or similar.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=721345

 src/core/display.c |    4 ----
 src/core/screen.c  |    4 ----
 src/core/window.c  |    9 +++++----
 3 files changed, 5 insertions(+), 12 deletions(-)
---
diff --git a/src/core/display.c b/src/core/display.c
index 9455331..edb122d 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -918,8 +918,6 @@ meta_display_open (void)
 
   enable_compositor (the_display);
    
-  meta_display_grab (the_display);
-  
   /* Now manage all existing windows */
   tmp = the_display->screens;
   while (tmp != NULL)
@@ -971,8 +969,6 @@ meta_display_open (void)
 
   meta_idle_monitor_init_dbus ();
 
-  meta_display_ungrab (the_display);
-
   /* Done opening new display */
   the_display->display_opening = FALSE;
 
diff --git a/src/core/screen.c b/src/core/screen.c
index efd6f41..1143f55 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -887,8 +887,6 @@ meta_screen_manage_all_windows (MetaScreen *screen)
   Window *children;
   int n_children, i;
 
-  meta_display_grab (screen->display);
-
   if (screen->guard_window == None)
     screen->guard_window = create_guard_window (screen->display->xdisplay,
                                                 screen);
@@ -907,8 +905,6 @@ meta_screen_manage_all_windows (MetaScreen *screen)
 
   g_free (children);
   meta_stack_thaw (screen->stack);
-
-  meta_display_ungrab (screen->display);
 }
 
 /**
diff --git a/src/core/window.c b/src/core/window.c
index 05f7dcf..a2f04aa 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -792,11 +792,14 @@ meta_window_new (MetaDisplay   *display,
       return NULL;
     }
 
-  /* Grab server */
-  meta_display_grab (display);
   meta_error_trap_push (display); /* Push a trap over all of window
                                    * creation, to reduce XSync() calls
                                    */
+  /*
+   * This function executes without any server grabs held. This means that
+   * the window could have already gone away, or could go away at any point,
+   * so we must be careful with X error handling.
+   */
 
   if (!XGetWindowAttributes (display->xdisplay, xwindow, &attrs))
     {
@@ -1437,7 +1440,6 @@ meta_window_new (MetaDisplay   *display,
     unminimize_window_and_all_transient_parents (window);
 
   meta_error_trap_pop (display); /* pop the XSync()-reducing trap */
-  meta_display_ungrab (display);
 
   window->constructing = FALSE;
 
@@ -1453,7 +1455,6 @@ meta_window_new (MetaDisplay   *display,
 
 error:
   meta_error_trap_pop (display);
-  meta_display_ungrab (display);
   return NULL;
 }
 


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