wayland: Make wl_subsurface.set_position properly synchronized

The position set by wl_subsurface.set_position should be applied when
the parent surface invokes wl_surface.commit.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>

https://bugzilla.gnome.org/show_bug.cgi?id=705502
This commit is contained in:
Jonas Ådahl 2014-01-12 23:17:29 +01:00
parent 799c27484d
commit 16de7f66fb
2 changed files with 28 additions and 1 deletions

View File

@ -326,6 +326,9 @@ subsurface_surface_commit (MetaWaylandSurface *surface)
} }
} }
static void
wl_subsurface_parent_surface_committed (gpointer data, gpointer user_data);
static void static void
meta_wayland_surface_commit (struct wl_client *client, meta_wayland_surface_commit (struct wl_client *client,
struct wl_resource *resource) struct wl_resource *resource)
@ -346,6 +349,10 @@ meta_wayland_surface_commit (struct wl_client *client,
else if (surface->subsurface.resource) else if (surface->subsurface.resource)
subsurface_surface_commit (surface); subsurface_surface_commit (surface);
g_list_foreach (surface->subsurfaces,
wl_subsurface_parent_surface_committed,
NULL);
if (surface->pending.buffer) if (surface->pending.buffer)
{ {
wl_list_remove (&surface->pending.buffer_destroy_listener.link); wl_list_remove (&surface->pending.buffer_destroy_listener.link);
@ -993,6 +1000,20 @@ bind_gtk_shell (struct wl_client *client,
gtk_shell_send_capabilities (resource, GTK_SHELL_CAPABILITY_GLOBAL_APP_MENU); gtk_shell_send_capabilities (resource, GTK_SHELL_CAPABILITY_GLOBAL_APP_MENU);
} }
static void
wl_subsurface_parent_surface_committed (gpointer data, gpointer user_data)
{
MetaWaylandSurface *surface = data;
if (surface->sub.pending_pos)
{
clutter_actor_set_position (CLUTTER_ACTOR (surface->surface_actor),
surface->sub.pending_x,
surface->sub.pending_y);
surface->sub.pending_pos = FALSE;
}
}
static void static void
wl_subsurface_destructor (struct wl_resource *resource) wl_subsurface_destructor (struct wl_resource *resource)
{ {
@ -1026,7 +1047,9 @@ wl_subsurface_set_position (struct wl_client *client,
MetaWaylandSurfaceExtension *subsurface = wl_resource_get_user_data (resource); MetaWaylandSurfaceExtension *subsurface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = wl_container_of (subsurface, surface, subsurface); MetaWaylandSurface *surface = wl_container_of (subsurface, surface, subsurface);
clutter_actor_set_position (CLUTTER_ACTOR (surface->surface_actor), x, y); surface->sub.pending_x = x;
surface->sub.pending_y = y;
surface->sub.pending_pos = TRUE;
} }
static gboolean static gboolean

View File

@ -90,6 +90,10 @@ struct _MetaWaylandSurface
struct { struct {
MetaWaylandSurface *parent; MetaWaylandSurface *parent;
struct wl_listener parent_destroy_listener; struct wl_listener parent_destroy_listener;
int32_t pending_x;
int32_t pending_y;
gboolean pending_pos;
} sub; } sub;
/* All the pending state, that wl_surface.commit will apply. */ /* All the pending state, that wl_surface.commit will apply. */