[PATCH weston v3 4/6] Add a resource creation signal

Pekka Paalanen ppaalanen at gmail.com
Thu Aug 11 12:34:01 UTC 2016


On Tue,  9 Aug 2016 12:46:54 +0200
Giulio Camuffo <giuliocamuffo at 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.camuffo at kdab.com>
> Reviewed-by: Jonas Ã…dahl <jadahl at 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 811 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20160811/23a03884/attachment.sig>


More information about the wayland-devel mailing list