summaryrefslogtreecommitdiff
path: root/src/cairo-xlib-display.c
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 /src/cairo-xlib-display.c
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>
Diffstat (limited to 'src/cairo-xlib-display.c')
-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;