This change allows to add a resource creation listener to a wl_client,
which will be notified when a new resource is created for that client.
The alternative would be to have a per wl_display listener, but i think
that resources are really client specific objects, so it makes sense
to use the wl_client as the context.

Signed-off-by: Giulio Camuffo <giulio.camu...@kdab.com>
Reviewed-by: Jonas Ã…dahl <jad...@gmail.com>
---
 src/wayland-server-core.h |  4 ++++
 src/wayland-server.c      | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h
index 69c09dc..bb0a989 100644
--- a/src/wayland-server-core.h
+++ b/src/wayland-server-core.h
@@ -212,6 +212,10 @@ wl_client_get_object(struct wl_client *client, uint32_t 
id);
 void
 wl_client_post_no_memory(struct wl_client *client);
 
+void
+wl_client_add_resource_created_listener(struct wl_client *client,
+                                        struct wl_listener *listener);
+
 /** \class wl_listener
  *
  * \brief A single listener for Wayland signals
diff --git a/src/wayland-server.c b/src/wayland-server.c
index 2dd9a4a..067d8a5 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -81,6 +81,7 @@ struct wl_client {
        struct wl_signal destroy_signal;
        struct ucred ucred;
        int error;
+       struct wl_signal resource_created_signal;
 };
 
 struct wl_display {
@@ -424,6 +425,7 @@ wl_client_create(struct wl_display *display, int fd)
        if (client == NULL)
                return NULL;
 
+       wl_signal_init(&client->resource_created_signal);
        client->display = display;
        client->source = wl_event_loop_add_fd(display->loop, fd,
                                              WL_EVENT_READABLE,
@@ -1420,6 +1422,18 @@ wl_resource_set_dispatcher(struct wl_resource *resource,
        resource->destroy = destroy;
 }
 
+/** Create a new resource object
+ *
+ * \param client The client owner of the new resource.
+ * \param interface The interface of the new resource.
+ * \param version The version of the new resource.
+ * \param id The id of the new resource. If 0, an available id will be used.
+ *
+ * Listeners added with \a wl_client_add_resource_created_listener will be
+ * notified at the end of this function.
+ *
+ * \memberof wl_resource
+ */
 WL_EXPORT struct wl_resource *
 wl_resource_create(struct wl_client *client,
                   const struct wl_interface *interface,
@@ -1454,6 +1468,7 @@ wl_resource_create(struct wl_client *client,
                return NULL;
        }
 
+       wl_signal_emit(&client->resource_created_signal, resource);
        return resource;
 }
 
@@ -1571,6 +1586,23 @@ wl_client_from_link(struct wl_list *link)
        return container_of(link, struct wl_client, link);
 }
 
+/** Add a listener for the client's resource creation signal
+ *
+ * \param client The client object
+ * \param listener The listener to be added
+ *
+ * When a new resource is created for this client the listener
+ * will be notified, carrying the new resource as the data argument.
+ *
+ * \memberof wl_client
+ */
+WL_EXPORT void
+wl_client_add_resource_created_listener(struct wl_client *client,
+                                       struct wl_listener *listener)
+{
+       wl_signal_add(&client->resource_created_signal, listener);
+}
+
 /** \cond */ /* Deprecated functions below. */
 
 uint32_t
-- 
2.9.2

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

Reply via email to