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>
This commit is contained in:
Sungjae Park 2016-08-09 12:46:51 +02:00 committed by Pekka Paalanen
parent 5636cb2f05
commit be48da6a42
4 changed files with 120 additions and 1 deletions

View file

@ -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);

View file

@ -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)