[server-core] Add signal for creation of clients.

nicesj at nicesj.com nicesj at nicesj.com
Thu Feb 4 09:59:18 UTC 2016


    Using display object, if a new client is created, emit a signal.
    
    In the server-side, we can get the destroy event of a client,
    But there is no way to get the client create event.
    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.
    
    Please review this and if possible, merge it to the stream.
    
    Signed-off-by: Sung-jae Park <nicesj at nicesj.com>

diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h
index e8e1e9c..cb72981 100644
--- a/src/wayland-server-core.h
+++ b/src/wayland-server-core.h
@@ -156,6 +156,21 @@ void
 wl_display_add_destroy_listener(struct wl_display *display,
 				struct wl_listener *listener);
 
+/** Add a listener for getting a notification of creation of clients.
+ *  If you add a listener, server will emits a signal if a new client
+ *  is created.
+ *
+ *  \ref wl_client_create
+ *  \ref wl_display
+ *  \ref wl_listener
+ *
+ * \param display The display object
+ * \param listener Signal handler object
+ */
+void
+wl_display_add_create_client_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..0eff8f6 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,13 @@ wl_display_add_destroy_listener(struct wl_display *display,
 	wl_signal_add(&display->destroy_signal, listener);
 }
 
+WL_EXPORT void
+wl_display_add_create_client_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)


More information about the wayland-devel mailing list