diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c index c7c3c43cd..b8f35cb85 100644 --- a/src/cairo-xlib-display.c +++ b/src/cairo-xlib-display.c @@ -226,6 +226,7 @@ _cairo_xlib_display_get (Display *dpy) cairo_xlib_display_t *display; cairo_xlib_display_t **prev; XExtCodes *codes; + int major_unused, minor_unused; /* There is an apparent deadlock between this mutex and the * mutex for the display, but it's actually safe. For the @@ -260,6 +261,14 @@ _cairo_xlib_display_get (Display *dpy) if (display == NULL) goto UNLOCK; + /* 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 + * add our hook. For now, that means Render, so we call into its + * QueryVersion function to ensure it gets initialized. + */ + XRenderQueryVersion (dpy, &major_unused, &minor_unused); + codes = XAddExtension (dpy); if (codes == NULL) { free (display);