summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSungjae Park <nicesj@nicesj.com>2016-08-09 12:46:51 +0200
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>2016-08-11 14:35:28 +0300
commitbe48da6a42b399252959ef782132fdfdf62c6905 (patch)
tree7c02f2c789371458658a57a9cfb0ade699d9b583 /src
parent5636cb2f056d813b464c451754908e17de838e3a (diff)
server: add listener API for new clients
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. Giulio: a test is added for the new functionality Signed-off-by: Sung-jae Park <nicesj@nicesj.com> Signed-off-by: Giulio Camuffo <giulio.camuffo@kdab.com> Reviewed-by: Jonas Ã…dahl <jadahl@gmail.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Diffstat (limited to 'src')
-rw-r--r--src/wayland-server-core.h4
-rw-r--r--src/wayland-server.c25
2 files changed, 29 insertions, 0 deletions
diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h
index ad1292f..43e76fb 100644
--- a/src/wayland-server-core.h
+++ b/src/wayland-server-core.h
@@ -151,6 +151,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 19aa2e8..b44ec9c 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;
};
@@ -406,6 +407,9 @@ bind_display(struct wl_client *client, struct wl_display *display);
* wl_display_connect_to_fd() on the client side or used with the
* WAYLAND_SOCKET environment variable on the client side.
*
+ * Listeners added with wl_display_add_client_created_listener() will
+ * be notified by this function after the client is fully constructed.
+ *
* On failure this function sets errno accordingly and returns NULL.
*
* \memberof wl_display
@@ -448,6 +452,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 +870,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 +1360,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, carrying
+ * 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)