diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-10-11 16:52:07 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-10-11 16:56:15 +0100 |
commit | 26c8accd41163d86711ba900bec7d9cd6591d8a3 (patch) | |
tree | dba120c4bcad8f7dbf09d6cf0c94fd21878db004 /src/cairo-xlib-display.c | |
parent | fbf528f46deaebc7d8cf38fc61be9e016f207575 (diff) | |
download | cairo-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.c | 34 |
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; |