mirror of
https://github.com/brl/mutter.git
synced 2024-12-25 04:22: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
|
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
|
||||||
|
@ -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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user