struct wl_list global_list;
struct wl_list socket_list;
struct wl_list client_list;
+
+ struct wl_signal destroy_signal;
};
struct wl_global {
wl_list_init(&display->client_list);
wl_list_init(&display->registry_resource_list);
+ wl_signal_init(&display->destroy_signal);
+
display->id = 1;
display->serial = 0;
struct wl_socket *s, *next;
struct wl_global *global, *gnext;
+ wl_signal_emit(&display->destroy_signal, display);
+
wl_list_for_each_safe(s, next, &display->socket_list, link) {
wl_event_source_remove(s->source);
unlink(s->addr.sun_path);
return 0;
}
+WL_EXPORT void
+wl_display_add_destroy_listener(struct wl_display *display,
+ struct wl_listener *listener)
+{
+ wl_signal_add(&display->destroy_signal, listener);
+}
+
+WL_EXPORT struct wl_listener *
+wl_display_get_destroy_listener(struct wl_display *display,
+ wl_notify_func_t notify)
+{
+ return wl_signal_get(&display->destroy_signal, notify);
+}
+
WL_EXPORT struct wl_resource *
wl_client_add_object(struct wl_client *client,
const struct wl_interface *interface,
uint32_t wl_display_get_serial(struct wl_display *display);
uint32_t wl_display_next_serial(struct wl_display *display);
+void wl_display_add_destroy_listener(struct wl_display *display,
+ struct wl_listener *listener);
+struct wl_listener *wl_display_get_destroy_listener(struct wl_display *display,
+ wl_notify_func_t notify);
+
struct wl_client *wl_client_create(struct wl_display *display, int fd);
void wl_client_destroy(struct wl_client *client);
void wl_client_flush(struct wl_client *client);
--- /dev/null
+/*
+ * Copyright © 2012 Intel Corporation
+ * Copyright © 2013 Jason Ekstrand
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <assert.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "wayland-server.h"
+#include "wayland-private.h"
+#include "test-runner.h"
+
+struct display_destroy_listener {
+ struct wl_listener listener;
+ int done;
+};
+
+static void
+display_destroy_notify(struct wl_listener *l, void *data)
+{
+ struct display_destroy_listener *listener;
+
+ listener = container_of(l, struct display_destroy_listener, listener);
+ listener->done = 1;
+}
+
+TEST(display_destroy_listener)
+{
+ struct wl_display *display;
+ struct display_destroy_listener a, b;
+
+ display = wl_display_create();
+ assert(display);
+
+ a.listener.notify = &display_destroy_notify;
+ a.done = 0;
+ wl_display_add_destroy_listener(display, &a.listener);
+
+ assert(wl_display_get_destroy_listener(display, display_destroy_notify) ==
+ &a.listener);
+
+ b.listener.notify = display_destroy_notify;
+ b.done = 0;
+ wl_display_add_destroy_listener(display, &b.listener);
+
+ wl_list_remove(&a.listener.link);
+
+ wl_display_destroy(display);
+
+ assert(!a.done);
+ assert(b.done);
+}
+