diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c index cdae8c926..895258d31 100644 --- a/src/cairo-xlib-display.c +++ b/src/cairo-xlib-display.c @@ -326,7 +326,7 @@ UNLOCK: } cairo_bool_t -_cairo_xlib_add_close_display_hook (Display *dpy, void (*func) (Display *, void *), void *data, const void *key) +_cairo_xlib_add_close_display_hook (Display *dpy, void (*func) (Display *, void *), void *data) { cairo_xlib_display_t *display; cairo_xlib_hook_t *hook; @@ -342,7 +342,6 @@ _cairo_xlib_add_close_display_hook (Display *dpy, void (*func) (Display *, void if (hook != NULL) { hook->func = func; hook->data = data; - hook->key = key; hook->next = display->close_display_hooks; display->close_display_hooks = hook; @@ -357,7 +356,7 @@ _cairo_xlib_add_close_display_hook (Display *dpy, void (*func) (Display *, void } void -_cairo_xlib_remove_close_display_hooks (Display *dpy, const void *key) +_cairo_xlib_remove_close_display_hooks (Display *dpy, const void *data) { cairo_xlib_display_t *display; cairo_xlib_hook_t *hook, *next, **prev; @@ -370,13 +369,13 @@ _cairo_xlib_remove_close_display_hooks (Display *dpy, const void *key) prev = &display->close_display_hooks; for (hook = display->close_display_hooks; hook != NULL; hook = next) { next = hook->next; - if (hook->key == key) { + if (hook->data == data) { *prev = hook->next; _cairo_freelist_free (&display->hook_freelist, hook); - } else - prev = &hook->next; + break; + } + prev = &hook->next; } - *prev = NULL; CAIRO_MUTEX_UNLOCK (display->mutex); _cairo_xlib_display_destroy (display); diff --git a/src/cairo-xlib-private.h b/src/cairo-xlib-private.h index b8ca027ee..61ce88963 100644 --- a/src/cairo-xlib-private.h +++ b/src/cairo-xlib-private.h @@ -51,7 +51,6 @@ struct _cairo_xlib_hook { cairo_xlib_hook_t *next; void (*func) (Display *display, void *data); void *data; - const void *key; }; struct _cairo_xlib_display { @@ -113,9 +112,9 @@ cairo_private void _cairo_xlib_display_destroy (cairo_xlib_display_t *info); cairo_private cairo_bool_t -_cairo_xlib_add_close_display_hook (Display *display, void (*func) (Display *, void *), void *data, const void *key); +_cairo_xlib_add_close_display_hook (Display *display, void (*func) (Display *, void *), void *data); cairo_private void -_cairo_xlib_remove_close_display_hooks (Display *display, const void *key); +_cairo_xlib_remove_close_display_hooks (Display *display, const void *data); cairo_private cairo_status_t _cairo_xlib_display_queue_work (cairo_xlib_display_t *display, diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c index 2fb46c2a6..4877e7e2a 100644 --- a/src/cairo-xlib-surface.c +++ b/src/cairo-xlib-surface.c @@ -2436,7 +2436,8 @@ _cairo_xlib_surface_create_internal (Display *dpy, } if (! _cairo_xlib_add_close_display_hook (dpy, - _cairo_xlib_surface_detach_display, surface, surface)) { + _cairo_xlib_surface_detach_display, surface)) + { free (surface); _cairo_xlib_screen_info_destroy (screen_info); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); @@ -3011,7 +3012,7 @@ _cairo_xlib_surface_font_init (Display *dpy, if (! _cairo_xlib_add_close_display_hook (dpy, _cairo_xlib_surface_remove_scaled_font, - scaled_font, scaled_font)) + scaled_font)) { free (font_private); return _cairo_error (CAIRO_STATUS_NO_MEMORY);