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

Alexandros Frantzis alexandros.frantzis at collabora.com
Fri Jan 26 16:48:01 UTC 2018


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;
-- 
2.14.1



More information about the wayland-devel mailing list