[PATCH weston v2 1/6] server: add listener API for new clients
Jonas Ådahl
jadahl at gmail.com
Tue Aug 9 08:15:21 UTC 2016
On Tue, Jul 05, 2016 at 09:51:06AM +0200, Giulio Camuffo wrote:
> From: Sungjae Park <nicesj at nicesj.com>
>
> 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 at nicesj.com>
> Signed-off-by: Giulio Camuffo <giulio.camuffo at kdab.com>
> Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
Looks fine to me, except for one issue inlined. With that fixed this is
Reviewed-by: Jonas Ådahl <jadahl at gmail.com>
> ---
>
> v2: - added a test
> - some more documentation
>
> Makefile.am | 5 ++-
> src/wayland-server-core.h | 4 ++
> src/wayland-server.c | 25 +++++++++++
> tests/compositor-introspection-test.c | 85 +++++++++++++++++++++++++++++++++++
> 4 files changed, 118 insertions(+), 1 deletion(-)
> create mode 100644 tests/compositor-introspection-test.c
>
> diff --git a/Makefile.am b/Makefile.am
> index 49e25a6..e684a87 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -160,7 +160,8 @@ TESTS = \
> signal-test \
> resources-test \
> message-test \
> - headers-test
> + headers-test \
> + compositor-introspection-test
>
> if ENABLE_CPP_TEST
> TESTS += cpp-compile-test
> @@ -217,6 +218,8 @@ resources_test_SOURCES = tests/resources-test.c
> resources_test_LDADD = libtest-runner.la
> message_test_SOURCES = tests/message-test.c
> message_test_LDADD = libtest-runner.la
> +compositor_introspection_test_SOURCES = tests/compositor-introspection-test.c
> +compositor_introspection_test_LDADD = libtest-runner.la
> headers_test_SOURCES = tests/headers-test.c \
> tests/headers-protocol-test.c \
> tests/headers-protocol-core-test.c
> 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)
> diff --git a/tests/compositor-introspection-test.c b/tests/compositor-introspection-test.c
> new file mode 100644
> index 0000000..7cb3e86
> --- /dev/null
> +++ b/tests/compositor-introspection-test.c
> @@ -0,0 +1,85 @@
> +/*
Missing copyright.
Jonas
> + * Permission is hereby granted, free of charge, to any person obtaining
> + * a copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction, including
> + * without limitation the rights to use, copy, modify, merge, publish,
> + * distribute, sublicense, and/or sell copies of the Software, and to
> + * permit persons to whom the Software is furnished to do so, subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> + * next paragraph) shall be included in all copies or substantial
> + * portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
> + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
> + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
> + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> + * SOFTWARE.
> + */
> +
> +#include <stdlib.h>
> +#include <assert.h>
> +#include <errno.h>
> +#include <string.h>
> +#include <stdio.h>
> +#include <sys/un.h>
> +#include <unistd.h>
> +
> +#include "wayland-client.h"
> +#include "wayland-server.h"
> +#include "test-runner.h"
> +
> +/* Ensure the connection doesn't fail due to lack of XDG_RUNTIME_DIR. */
> +static const char *
> +require_xdg_runtime_dir(void)
> +{
> + char *val = getenv("XDG_RUNTIME_DIR");
> + assert(val && "set $XDG_RUNTIME_DIR to run this test");
> +
> + return val;
> +}
> +
> +struct compositor {
> + struct wl_display *display;
> + struct wl_listener listener;
> + struct wl_client *client;
> +};
> +
> +static void
> +client_created(struct wl_listener *listener, void *data)
> +{
> + struct compositor *c = wl_container_of(listener, c, listener);
> + c->client = data;
> +}
> +
> +TEST(new_client_connect)
> +{
> + const char *socket;
> + struct compositor compositor = { 0 };
> + struct {
> + struct wl_display *display;
> + } client;
> +
> + require_xdg_runtime_dir();
> +
> + compositor.display = wl_display_create();
> + socket = wl_display_add_socket_auto(compositor.display);
> +
> + compositor.listener.notify = client_created;
> + wl_display_add_client_created_listener(compositor.display, &compositor.listener);
> +
> + client.display = wl_display_connect(socket);
> +
> + wl_event_loop_dispatch(wl_display_get_event_loop(compositor.display), 100);
> +
> + assert(compositor.client != NULL);
> +
> + wl_display_disconnect(client.display);
> +
> + wl_client_destroy(compositor.client);
> + wl_display_destroy(compositor.display);
> +}
> --
> 2.9.0
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list