65
67
static cairo_xlib_display_t *_cairo_xlib_display_list;
70
_cairo_xlib_remove_close_display_hook_internal (cairo_xlib_display_t *display,
71
cairo_xlib_hook_t *hook);
68
74
_cairo_xlib_call_close_display_hooks (cairo_xlib_display_t *display)
70
76
cairo_xlib_screen_info_t *screen;
71
cairo_xlib_hook_t *hooks, *list;
77
cairo_xlib_hook_t *hook;
73
79
/* call all registered shutdown routines */
74
80
CAIRO_MUTEX_LOCK (display->mutex);
76
82
for (screen = display->screens; screen != NULL; screen = screen->next)
77
83
_cairo_xlib_screen_info_close_display (screen);
79
hooks = display->close_display_hooks;
80
while (hooks != NULL) {
81
display->close_display_hooks = NULL;
86
hook = display->close_display_hooks;
90
_cairo_xlib_remove_close_display_hook_internal (display, hook);
82
92
CAIRO_MUTEX_UNLOCK (display->mutex);
86
cairo_xlib_hook_t *hook = list;
89
hook->func (display->display, hook->data);
90
} while (list != NULL);
93
hook->func (display, hook);
92
94
CAIRO_MUTEX_LOCK (display->mutex);
94
cairo_xlib_hook_t *hook = hooks;
97
_cairo_freelist_free (&display->hook_freelist, hook);
98
} while (hooks != NULL);
100
hooks = display->close_display_hooks;
102
96
display->closed = TRUE;
277
270
XESetCloseDisplay (dpy, codes->extension, _cairo_xlib_close_display);
279
272
_cairo_freelist_init (&display->wq_freelist, sizeof (cairo_xlib_job_t));
280
_cairo_freelist_init (&display->hook_freelist, sizeof (cairo_xlib_hook_t));
282
274
CAIRO_REFERENCE_COUNT_INIT (&display->ref_count, 2); /* add one for the CloseDisplay */
283
275
CAIRO_MUTEX_INIT (display->mutex);
329
_cairo_xlib_add_close_display_hook (Display *dpy, void (*func) (Display *, void *), void *data, const void *key)
331
cairo_xlib_display_t *display;
332
cairo_xlib_hook_t *hook;
333
cairo_bool_t ret = FALSE;
335
display = _cairo_xlib_display_get (dpy);
339
CAIRO_MUTEX_LOCK (display->mutex);
340
if (display->closed == FALSE) {
341
hook = _cairo_freelist_alloc (&display->hook_freelist);
347
hook->next = display->close_display_hooks;
348
display->close_display_hooks = hook;
352
CAIRO_MUTEX_UNLOCK (display->mutex);
354
_cairo_xlib_display_destroy (display);
360
_cairo_xlib_remove_close_display_hooks (Display *dpy, const void *key)
362
cairo_xlib_display_t *display;
363
cairo_xlib_hook_t *hook, *next, **prev;
365
display = _cairo_xlib_display_get (dpy);
369
CAIRO_MUTEX_LOCK (display->mutex);
370
prev = &display->close_display_hooks;
371
for (hook = display->close_display_hooks; hook != NULL; hook = next) {
373
if (hook->key == key) {
375
_cairo_freelist_free (&display->hook_freelist, hook);
380
CAIRO_MUTEX_UNLOCK (display->mutex);
382
_cairo_xlib_display_destroy (display);
321
_cairo_xlib_add_close_display_hook (cairo_xlib_display_t *display,
322
cairo_xlib_hook_t *hook)
324
CAIRO_MUTEX_LOCK (display->mutex);
326
hook->next = display->close_display_hooks;
327
if (hook->next != NULL)
328
hook->next->prev = hook;
329
display->close_display_hooks = hook;
330
CAIRO_MUTEX_UNLOCK (display->mutex);
333
/* display->mutex must be held */
335
_cairo_xlib_remove_close_display_hook_internal (cairo_xlib_display_t *display,
336
cairo_xlib_hook_t *hook)
338
if (display->close_display_hooks == hook)
339
display->close_display_hooks = hook->next;
340
else if (hook->prev != NULL)
341
hook->prev->next = hook->next;
343
if (hook->next != NULL)
344
hook->next->prev = hook->prev;
351
_cairo_xlib_remove_close_display_hook (cairo_xlib_display_t *display,
352
cairo_xlib_hook_t *hook)
354
CAIRO_MUTEX_LOCK (display->mutex);
355
_cairo_xlib_remove_close_display_hook_internal (display, hook);
356
CAIRO_MUTEX_UNLOCK (display->mutex);