From: Sungjae Park <nic...@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 <nic...@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

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to