diff --git a/src/tests/meta-wayland-test-driver.c b/src/tests/meta-wayland-test-driver.c index d93cc19e4..079ea1c8d 100644 --- a/src/tests/meta-wayland-test-driver.c +++ b/src/tests/meta-wayland-test-driver.c @@ -162,6 +162,41 @@ sync_effects_completed (struct wl_client *client, clutter_stage_schedule_update (CLUTTER_STAGE (stage)); } +static void +on_window_shown (MetaWindow *window, + struct wl_resource *callback) +{ + g_signal_handlers_disconnect_by_data (window, callback); + wl_callback_send_done (callback, 0); +} + +static void +sync_window_shown (struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *surface_resource) +{ + MetaWaylandSurface *surface = wl_resource_get_user_data (surface_resource); + MetaWindow *window = meta_wayland_surface_get_window (surface); + struct wl_resource *callback; + + g_assert_nonnull (surface); + g_assert_nonnull (window); + + callback = wl_resource_create (client, &wl_callback_interface, 1, id); + + if (meta_window_is_hidden (window)) + { + g_signal_connect (meta_wayland_surface_get_window (surface), + "shown", G_CALLBACK (on_window_shown), + callback); + } + else + { + wl_callback_send_done (callback, 0); + } +} + static void sync_point (struct wl_client *client, struct wl_resource *resource, @@ -217,6 +252,7 @@ verify_view (struct wl_client *client, static const struct test_driver_interface meta_test_driver_interface = { sync_actor_destroy, sync_effects_completed, + sync_window_shown, sync_point, verify_view, }; diff --git a/src/tests/protocol/test-driver.xml b/src/tests/protocol/test-driver.xml index 4f471c2be..eefbc3ea1 100644 --- a/src/tests/protocol/test-driver.xml +++ b/src/tests/protocol/test-driver.xml @@ -11,6 +11,11 @@ + + + + + diff --git a/src/tests/wayland-test-clients/wayland-test-client-utils.c b/src/tests/wayland-test-clients/wayland-test-client-utils.c index e560a03b0..af47a420e 100644 --- a/src/tests/wayland-test-clients/wayland-test-client-utils.c +++ b/src/tests/wayland-test-clients/wayland-test-client-utils.c @@ -43,6 +43,7 @@ enum static guint signals[N_SIGNALS]; static struct wl_callback *effects_complete_callback; +static struct wl_callback *window_shown_callback; static struct wl_callback *view_verification_callback; struct _WaylandBufferClass @@ -624,6 +625,33 @@ wait_for_effects_completed (WaylandDisplay *display, } } +static void +window_shown (void *data, + struct wl_callback *callback, + uint32_t serial) +{ + wl_callback_destroy (callback); + window_shown_callback = NULL; +} + +static const struct wl_callback_listener window_shown_listener = { + window_shown, +}; + +void +wait_for_window_shown (WaylandDisplay *display, + struct wl_surface *surface) +{ + window_shown_callback = + test_driver_sync_window_shown (display->test_driver, surface); + wl_callback_add_listener (window_shown_callback, + &window_shown_listener, + NULL); + + while (window_shown_callback) + wayland_display_dispatch (display); +} + static void view_verified (void *data, struct wl_callback *callback, diff --git a/src/tests/wayland-test-clients/wayland-test-client-utils.h b/src/tests/wayland-test-clients/wayland-test-client-utils.h index f22982b75..87eb6894b 100644 --- a/src/tests/wayland-test-clients/wayland-test-client-utils.h +++ b/src/tests/wayland-test-clients/wayland-test-client-utils.h @@ -111,6 +111,9 @@ const char * lookup_property_value (WaylandDisplay *display, void wait_for_effects_completed (WaylandDisplay *display, struct wl_surface *surface); +void wait_for_window_shown (WaylandDisplay *display, + struct wl_surface *surface); + void wait_for_view_verified (WaylandDisplay *display, int sequence);