tests: Support setting the test client input dynamically
The current test client code waits for all wl_seat globals to arrive before checking them and deciding which one is the test seat global to use for the input object. Test code that needs to add/remove test seats would have to call the client_set_input() function for any seat changes to take effect. Although we could allow this by making client_set_input() public, we would be exposing unecessary implementation details. This commit applies any seat changes immediately upon arrival of the seat name, freeing test code from needing to call extra functions like client_set_input(). To achieve this the call to input_data_devices() is moved from client_set_input() to the seat name event handler. This commit also moves the check that all seats have names to an explicit test. To support this test, inputs corresponding to non-test seats are not destroyed (unless their seat global is removed), as was previously the case. Signed-off-by: Alexandros Frantzis <alexandros.frantzis@collabora.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
committed by
Pekka Paalanen
parent
c1937971fb
commit
468bd0b9c8
@@ -310,3 +310,13 @@ TEST(get_device_after_destroy_multiple)
|
|||||||
get_device_after_destroy();
|
get_device_after_destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(seats_have_names)
|
||||||
|
{
|
||||||
|
struct client *cl = create_client_and_test_surface(100, 100, 100, 100);
|
||||||
|
struct input *input;
|
||||||
|
|
||||||
|
wl_list_for_each(input, &cl->inputs, link) {
|
||||||
|
assert(input->seat_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -635,6 +635,15 @@ seat_handle_name(void *data, struct wl_seat *seat, const char *name)
|
|||||||
input->seat_name = strdup(name);
|
input->seat_name = strdup(name);
|
||||||
assert(input->seat_name && "No memory");
|
assert(input->seat_name && "No memory");
|
||||||
|
|
||||||
|
/* We only update the devices and set client input for the test seat */
|
||||||
|
if (strcmp(name, "test-seat") == 0) {
|
||||||
|
assert(!input->client->input &&
|
||||||
|
"Multiple test seats detected!");
|
||||||
|
|
||||||
|
input_update_devices(input);
|
||||||
|
input->client->input = input;
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(stderr, "test-client: got seat %p name: \'%s\'\n",
|
fprintf(stderr, "test-client: got seat %p name: \'%s\'\n",
|
||||||
input, name);
|
input, name);
|
||||||
}
|
}
|
||||||
@@ -726,6 +735,7 @@ handle_global(void *data, struct wl_registry *registry,
|
|||||||
&wl_compositor_interface, version);
|
&wl_compositor_interface, version);
|
||||||
} else if (strcmp(interface, "wl_seat") == 0) {
|
} else if (strcmp(interface, "wl_seat") == 0) {
|
||||||
input = xzalloc(sizeof *input);
|
input = xzalloc(sizeof *input);
|
||||||
|
input->client = client;
|
||||||
input->global_name = global->name;
|
input->global_name = global->name;
|
||||||
input->wl_seat =
|
input->wl_seat =
|
||||||
wl_registry_bind(registry, id,
|
wl_registry_bind(registry, id,
|
||||||
@@ -882,26 +892,6 @@ log_handler(const char *fmt, va_list args)
|
|||||||
vfprintf(stderr, fmt, args);
|
vfprintf(stderr, fmt, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* find the test-seat and set it in client.
|
|
||||||
* Destroy other inputs */
|
|
||||||
static void
|
|
||||||
client_set_input(struct client *cl)
|
|
||||||
{
|
|
||||||
struct input *inp, *inptmp;
|
|
||||||
wl_list_for_each_safe(inp, inptmp, &cl->inputs, link) {
|
|
||||||
assert(inp->seat_name && "BUG: input with no name");
|
|
||||||
if (strcmp(inp->seat_name, "test-seat") == 0) {
|
|
||||||
cl->input = inp;
|
|
||||||
input_update_devices(inp);
|
|
||||||
} else {
|
|
||||||
input_destroy(inp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we keep only one input */
|
|
||||||
assert(wl_list_length(&cl->inputs) == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct client *
|
struct client *
|
||||||
create_client(void)
|
create_client(void)
|
||||||
{
|
{
|
||||||
@@ -927,9 +917,6 @@ create_client(void)
|
|||||||
* events */
|
* events */
|
||||||
client_roundtrip(client);
|
client_roundtrip(client);
|
||||||
|
|
||||||
/* find the right input for us */
|
|
||||||
client_set_input(client);
|
|
||||||
|
|
||||||
/* must have WL_SHM_FORMAT_ARGB32 */
|
/* must have WL_SHM_FORMAT_ARGB32 */
|
||||||
assert(client->has_argb);
|
assert(client->has_argb);
|
||||||
|
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ struct test {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct input {
|
struct input {
|
||||||
|
struct client *client;
|
||||||
uint32_t global_name;
|
uint32_t global_name;
|
||||||
struct wl_seat *wl_seat;
|
struct wl_seat *wl_seat;
|
||||||
struct pointer *pointer;
|
struct pointer *pointer;
|
||||||
|
|||||||
Reference in New Issue
Block a user