summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Drake <drake@endlessm.com>2013-12-30 13:01:28 -0600
committerDaniel Drake <drake@endlessm.com>2014-01-06 16:16:31 -0600
commitfb4e9d2232e588446de02c9f7df1a09a30453ecf (patch)
tree6d8172ad39abb2723c6bcc554048877d7165683a
parente072295395458bfcea8d29916fe50997b8e4ef5e (diff)
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
-rw-r--r--src/core/display.c4
-rw-r--r--src/core/screen.c4
-rw-r--r--src/core/window.c9
3 files changed, 5 insertions, 12 deletions
diff --git a/src/core/display.c b/src/core/display.c
index b37bd73c..f0301c46 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -925,8 +925,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)
@@ -978,8 +976,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 0bfe2d9d..6ba2e68c 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -884,8 +884,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);
@@ -904,8 +902,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 4efd0033..d6c3f253 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))
{
@@ -1434,7 +1437,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;
@@ -1450,7 +1452,6 @@ meta_window_new (MetaDisplay *display,
error:
meta_error_trap_pop (display);
- meta_display_ungrab (display);
return NULL;
}