summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-10-11 16:52:07 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-10-11 16:56:15 +0100
commit26c8accd41163d86711ba900bec7d9cd6591d8a3 (patch)
treedba120c4bcad8f7dbf09d6cf0c94fd21878db004
parentfbf528f46deaebc7d8cf38fc61be9e016f207575 (diff)
downloadcairo-26c8accd41163d86711ba900bec7d9cd6591d8a3.tar.gz
xlib: Reorder CloseDisplay hooks
As we may utilize X extensions as we shutdown and release resources during CloseDisplay, we need to run our own callback first. If we run last, than we reinstantiate the extensions which often have the unfortunate habit of then persisting with stale data across the next Display connection, causing invalid requests to be generated and raise XErrors. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/cairo-xlib-display.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c
index f23a6550d..67c067355 100644
--- a/src/cairo-xlib-display.c
+++ b/src/cairo-xlib-display.c
@@ -213,6 +213,13 @@ _cairo_xlib_device_create (Display *dpy)
goto UNLOCK;
}
+ _cairo_device_init (&display->base, &_cairo_xlib_device_backend);
+
+ display->display = dpy;
+ cairo_list_init (&display->screens);
+ cairo_list_init (&display->fonts);
+ display->closed = FALSE;
+
/* Xlib calls out to the extension close_display hooks in LIFO
* order. So we have to ensure that all extensions that we depend
* on in our close_display hook are properly initialized before we
@@ -240,23 +247,6 @@ _cairo_xlib_device_create (Display *dpy)
_cairo_xlib_display_select_compositor (display);
- codes = XAddExtension (dpy);
- if (unlikely (codes == NULL)) {
- device = _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY);
- free (display);
- goto UNLOCK;
- }
-
- _cairo_device_init (&display->base, &_cairo_xlib_device_backend);
-
- XESetCloseDisplay (dpy, codes->extension, _cairo_xlib_close_display);
-
- cairo_device_reference (&display->base); /* add one for the CloseDisplay */
- display->display = dpy;
- cairo_list_init (&display->screens);
- cairo_list_init (&display->fonts);
- display->closed = FALSE;
-
display->white = NULL;
memset (display->alpha, 0, sizeof (display->alpha));
memset (display->solid, 0, sizeof (display->solid));
@@ -352,6 +342,16 @@ _cairo_xlib_device_create (Display *dpy)
display->buggy_pad_reflect = TRUE;
}
+ codes = XAddExtension (dpy);
+ if (unlikely (codes == NULL)) {
+ device = _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY);
+ free (display);
+ goto UNLOCK;
+ }
+
+ XESetCloseDisplay (dpy, codes->extension, _cairo_xlib_close_display);
+ cairo_device_reference (&display->base); /* add one for the CloseDisplay */
+
display->next = _cairo_xlib_display_list;
_cairo_xlib_display_list = display;