Re: [PATCH weston v2 1/6] server: add listener API for new clients

2016-08-09 Thread Jonas Ådahl
On Tue, Jul 05, 2016 at 09:51:06AM +0200, Giulio Camuffo wrote:
> From: Sungjae Park 
> 
> 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 
> Signed-off-by: Giulio Camuffo 
> Reviewed-by: Pekka Paalanen 

Looks fine to me, except for one issue inlined. With that fixed this is

Reviewed-by: Jonas Ådahl 

> ---
> 
> 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, >link);
>  
> + wl_signal_emit(>create_client_signal, client);
> +
>   return client;
>  
>  err_map:
> @@ -864,6 +870,7 @@ wl_display_create(void)
>   wl_list_init(>registry_resource_list);
>  
>   wl_signal_init(>destroy_signal);
> + wl_signal_init(>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(>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,
> +   

[PATCH weston v2 1/6] server: add listener API for new clients

2016-07-05 Thread Giulio Camuffo
From: Sungjae Park 

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 
Signed-off-by: Giulio Camuffo 
Reviewed-by: Pekka Paalanen 
---

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, >link);
 
+   wl_signal_emit(>create_client_signal, client);
+
return client;
 
 err_map:
@@ -864,6 +870,7 @@ wl_display_create(void)
wl_list_init(>registry_resource_list);
 
wl_signal_init(>destroy_signal);
+   wl_signal_init(>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(>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(>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 000..7cb3e86
---