On Tue, 9 Aug 2016 12:46:54 +0200 Giulio Camuffo <giuliocamu...@gmail.com> wrote:
> 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 Hi Giulio, what is in this patch looks good, but I think there could be more. There is no test that would excercise wl_client_add_resource_created_signal(). wl_client destruction assumes that all resource listeners are removed before freeing wl_client, but the documentation does not say that one MUST listen for wl_client destruction and at that point the latest remove all resource listeners. Or, do the trick with wl_lists: remove the list head, so it is possible to remove the members also afterwards. I didn't check it that's nice with wl_signal, though. This is also possible to fix in a simple follow-up though, so I'll see if I just land this and ask for that. I already deemded patches 1-3 ready to land. Thanks, pq
pgp4jOFzEE3bU.pgp
Description: OpenPGP digital signature
_______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel