weston-test-client-helper: Use a frame callback to flush surface geometry
authorKristian Høgsberg <krh@bitplanet.net>
Wed, 12 Dec 2012 02:49:13 +0000 (21:49 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Wed, 12 Dec 2012 04:57:44 +0000 (23:57 -0500)
When moving a test surface, use a frame callback to make sure the
surface has been moved and the geometry updated.  The compositor may
delay updating the transform matrices, but once we get the frame
callback we know the surface has been repainted and the geometry
updated.

tests/weston-test-client-helper.c

index 1859356..01405d8 100644 (file)
@@ -63,10 +63,27 @@ move_pointer(struct client *client, int x, int y)
        yield(client);
 }
 
+static void
+move_client_frame_handler(void *data, 
+                         struct wl_callback *callback, uint32_t time)
+{
+       int *done = data;
+
+       *done = 1;
+
+       wl_callback_destroy(callback);
+}
+
+static const struct wl_callback_listener frame_listener = {
+       move_client_frame_handler
+};
+
 void
 move_client(struct client *client, int x, int y)
 {
        struct surface *surface = client->surface;
+       struct wl_callback *callback;
+       int done;
 
        client->surface->x = x;
        client->surface->y = y;
@@ -74,10 +91,15 @@ move_client(struct client *client, int x, int y)
                             surface->x, surface->y);
        wl_surface_damage(surface->wl_surface, 0, 0, surface->width,
                          surface->height);
+
+       callback = wl_surface_frame(surface->wl_surface);
+       done = 0;
+       wl_callback_add_listener(callback, &frame_listener, &done);
+
        wl_surface_commit(surface->wl_surface);
 
-       yield(client);
-       yield(client);
+       while (!done)
+               wl_display_dispatch(client->wl_display);
 }
 
 static void