mirror of
https://github.com/brl/mutter.git
synced 2024-12-23 19:42:05 +00:00
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:
parent
799c27484d
commit
16de7f66fb
@ -326,6 +326,9 @@ subsurface_surface_commit (MetaWaylandSurface *surface)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
wl_subsurface_parent_surface_committed (gpointer data, gpointer user_data);
|
||||
|
||||
static void
|
||||
meta_wayland_surface_commit (struct wl_client *client,
|
||||
struct wl_resource *resource)
|
||||
@ -346,6 +349,10 @@ meta_wayland_surface_commit (struct wl_client *client,
|
||||
else if (surface->subsurface.resource)
|
||||
subsurface_surface_commit (surface);
|
||||
|
||||
g_list_foreach (surface->subsurfaces,
|
||||
wl_subsurface_parent_surface_committed,
|
||||
NULL);
|
||||
|
||||
if (surface->pending.buffer)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
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);
|
||||
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
|
||||
|
@ -90,6 +90,10 @@ struct _MetaWaylandSurface
|
||||
struct {
|
||||
MetaWaylandSurface *parent;
|
||||
struct wl_listener parent_destroy_listener;
|
||||
|
||||
int32_t pending_x;
|
||||
int32_t pending_y;
|
||||
gboolean pending_pos;
|
||||
} sub;
|
||||
|
||||
/* All the pending state, that wl_surface.commit will apply. */
|
||||
|
Loading…
Reference in New Issue
Block a user