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