[PATCH weston 7/8] tests: Handle removal of seat global in test clients

Pekka Paalanen ppaalanen at gmail.com
Thu Feb 1 10:35:31 UTC 2018


On Fri, 26 Jan 2018 18:48:01 +0200
Alexandros Frantzis <alexandros.frantzis at collabora.com> wrote:

> The current test client code completely ignores removal of globals.
> This commit updates the code to properly handle removal of globals in
> general, and of seat globals in particular. This ensures that the test
> client objects are in sync with the server and any relevant resources
> are released accordingly.
> 
> This update will be used by upcoming tests to check that seat removal
> and re-addition is working properly.
> 
> Signed-off-by: Alexandros Frantzis <alexandros.frantzis at collabora.com>
> ---
>  tests/weston-test-client-helper.c | 71 +++++++++++++++++++++++++++++++++++++--
>  tests/weston-test-client-helper.h |  1 +
>  2 files changed, 70 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/weston-test-client-helper.c b/tests/weston-test-client-helper.c
> index 854978d0..6dc72213 100644
> --- a/tests/weston-test-client-helper.c
> +++ b/tests/weston-test-client-helper.c
> @@ -541,8 +541,23 @@ static const struct weston_test_listener test_listener = {
>  static void
>  input_destroy(struct input *inp)
>  {
> +	if (inp->pointer) {
> +		if (inp->pointer->wl_pointer)
> +			wl_pointer_release(inp->pointer->wl_pointer);
> +		free(inp->pointer);
> +	}
> +	if (inp->keyboard) {
> +		if (inp->keyboard->wl_keyboard)
> +			wl_keyboard_release(inp->keyboard->wl_keyboard);
> +		free(inp->keyboard);
> +	}
> +	if (inp->touch) {
> +		if (inp->touch->wl_touch)
> +			wl_touch_release(inp->touch->wl_touch);
> +		free(inp->touch);
> +	}
>  	wl_list_remove(&inp->link);
> -	wl_seat_destroy(inp->wl_seat);
> +	wl_seat_release(inp->wl_seat);
>  	free(inp);
>  }
>  
> @@ -748,6 +763,7 @@ handle_global(void *data, struct wl_registry *registry,
>  	} else if (strcmp(interface, "wl_seat") == 0) {
>  		input = xzalloc(sizeof *input);
>  		input->client = client;
> +		input->global_name = global->name;
>  		input->wl_seat =
>  			wl_registry_bind(registry, id,
>  					 &wl_seat_interface, version);
> @@ -778,8 +794,59 @@ handle_global(void *data, struct wl_registry *registry,
>  	}
>  }
>  
> +static struct global *
> +client_find_global_with_name(struct client *client, uint32_t name)
> +{
> +	struct global *global;
> +
> +	wl_list_for_each(global, &client->global_list, link) {
> +		if (global->name == name)
> +			return global;
> +	}
> +
> +	return NULL;
> +}
> +
> +static struct input *
> +client_find_input_with_name(struct client *client, uint32_t name)
> +{
> +	struct input *input;
> +
> +	wl_list_for_each(input, &client->inputs, link) {
> +		if (input->global_name == name)
> +			return input;
> +	}
> +
> +	return NULL;
> +}
> +
> +static void
> +handle_global_remove(void *data, struct wl_registry *registry, uint32_t name)
> +{
> +	struct client *client = data;
> +	struct global *global;
> +	struct input *input;
> +
> +	global = client_find_global_with_name(client, name);
> +	assert(global && "Request to remove unknown global");
> +
> +	if (strcmp(global->interface, "wl_seat") == 0) {
> +		input = client_find_input_with_name(client, name);
> +		if (input) {
> +			if (client->input == input)
> +				client->input = NULL;
> +			input_destroy(input);
> +		}
> +	}
> +
> +	wl_list_remove(&global->link);
> +	free(global->interface);
> +	free(global);
> +}
> +
>  static const struct wl_registry_listener registry_listener = {
> -	handle_global
> +	handle_global,
> +	handle_global_remove,
>  };
>  
>  void
> diff --git a/tests/weston-test-client-helper.h b/tests/weston-test-client-helper.h
> index f16356e5..255bbf66 100644
> --- a/tests/weston-test-client-helper.h
> +++ b/tests/weston-test-client-helper.h
> @@ -75,6 +75,7 @@ struct test {
>  
>  struct input {
>  	struct client *client;
> +	uint32_t global_name;
>  	struct wl_seat *wl_seat;
>  	struct pointer *pointer;
>  	struct keyboard *keyboard;

Seems to do the job.

Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

This also does not hinder the testing of removed wl_seats, because a
test can do stuff with them after sending the device_remove(seat) but
before processing any events.


Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20180201/fbcf4db4/attachment.sig>


More information about the wayland-devel mailing list