[PATCH] Added a destroy signal to the wl_display object.

Jason Ekstrand jason at jlekstrand.net
Fri Jan 11 12:29:32 PST 2013


Added a destroy signal to the wl_display object.

---
 src/wayland-server.c | 20 +++++++++++++
 src/wayland-server.h |  5 ++++
 tests/Makefile.am    |  2 ++
 tests/display-test.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 106 insertions(+)
 create mode 100644 tests/display-test.c

diff --git a/src/wayland-server.c b/src/wayland-server.c
index f7f4c14..58bfa2c 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -90,6 +90,8 @@ struct wl_display {
 	struct wl_list global_list;
 	struct wl_list socket_list;
 	struct wl_list client_list;
+
+    struct wl_signal destroy_signal;
 };
 
 struct wl_global {
@@ -1096,6 +1098,8 @@ wl_display_create(void)
 	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;
 
@@ -1115,6 +1119,8 @@ wl_display_destroy(struct wl_display *display)
 	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);
@@ -1381,6 +1387,20 @@ wl_display_add_socket(struct wl_display *display, const char *name)
 	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,
diff --git a/src/wayland-server.h b/src/wayland-server.h
index 3357105..9497fe0 100644
--- a/src/wayland-server.h
+++ b/src/wayland-server.h
@@ -106,6 +106,11 @@ void wl_display_remove_global(struct wl_display *display,
 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);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index cf821c0..54157bc 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,6 +1,7 @@
 TESTS =						\
 	array-test				\
 	client-test				\
+	display-test				\
 	connection-test				\
 	event-loop-test				\
 	fixed-test				\
@@ -22,6 +23,7 @@ test_runner_src = test-runner.c test-runner.h test-helpers.c
 
 array_test_SOURCES = array-test.c $(test_runner_src)
 client_test_SOURCES = client-test.c $(test_runner_src)
+display_test_SOURCES = display-test.c $(test_runner_src)
 connection_test_SOURCES = connection-test.c $(test_runner_src)
 event_loop_test_SOURCES = event-loop-test.c $(test_runner_src)
 fixed_test_SOURCES = fixed-test.c $(test_runner_src)
diff --git a/tests/display-test.c b/tests/display-test.c
new file mode 100644
index 0000000..e1692b7
--- /dev/null
+++ b/tests/display-test.c
@@ -0,0 +1,79 @@
+/*
+ * 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);
+}
+
-- 
1.8.0.1



More information about the wayland-devel mailing list