[PATCH wayland 1/5] server: add listener API for new clients

Giulio Camuffo giuliocamuffo at gmail.com
Mon Mar 7 17:31:31 UTC 2016


From: Sungjae Park <nicesj at nicesj.com>

Using display object, Emit a signal if a new client is created.

In the server-side, we can get the destroy event of a client,
But there is no way to get the created event of it.
Of course, we can get the client object from the global registry
binding callbacks.
But it can be called several times with same client object.
And even if A client creates display object,
(so there is a connection), The server could not know that.
There could be more use-cases not only for this.

Signed-off-by: Sung-jae Park <nicesj at nicesj.com>
---

This is the v2 of the patch by Sung-jae, i applied the incremental diff
on the first version.
 
 src/wayland-server-core.h |  4 ++++
 src/wayland-server.c      | 22 ++++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h
index e8e1e9c..1bc4d6b 100644
--- a/src/wayland-server-core.h
+++ b/src/wayland-server-core.h
@@ -156,6 +156,10 @@ void
 wl_display_add_destroy_listener(struct wl_display *display,
 				struct wl_listener *listener);
 
+void
+wl_display_add_client_created_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);
diff --git a/src/wayland-server.c b/src/wayland-server.c
index ae9365f..2857b1d 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -96,6 +96,7 @@ struct wl_display {
 	struct wl_list client_list;
 
 	struct wl_signal destroy_signal;
+	struct wl_signal create_client_signal;
 
 	struct wl_array additional_shm_formats;
 };
@@ -448,6 +449,8 @@ wl_client_create(struct wl_display *display, int fd)
 
 	wl_list_insert(display->client_list.prev, &client->link);
 
+	wl_signal_emit(&display->create_client_signal, client);
+
 	return client;
 
 err_map:
@@ -864,6 +867,7 @@ wl_display_create(void)
 	wl_list_init(&display->registry_resource_list);
 
 	wl_signal_init(&display->destroy_signal);
+	wl_signal_init(&display->create_client_signal);
 
 	display->id = 1;
 	display->serial = 0;
@@ -1353,6 +1357,24 @@ wl_display_add_destroy_listener(struct wl_display *display,
 	wl_signal_add(&display->destroy_signal, listener);
 }
 
+/** Registers a listener for the client connection signal.
+ *  When a new client object is created, \a listener will be notified, carring
+ *  a pointer to the new wl_client object.
+ *
+ *  \ref wl_client_create
+ *  \ref wl_display
+ *  \ref wl_listener
+ *
+ * \param display The display object
+ * \param listener Signal handler object
+ */
+WL_EXPORT void
+wl_display_add_client_created_listener(struct wl_display *display,
+					struct wl_listener *listener)
+{
+	wl_signal_add(&display->create_client_signal, listener);
+}
+
 WL_EXPORT struct wl_listener *
 wl_display_get_destroy_listener(struct wl_display *display,
 				wl_notify_func_t notify)
-- 
2.7.2



More information about the wayland-devel mailing list