mirror of
https://github.com/brl/mutter.git
synced 2024-11-30 20:01:00 -05:00
wayland/xdg-shell: Queue frame callbacks on new actor after resetting
When a xdg-toplevel is reset, the window and actor are recreated, and
all state is cleared. When this happened, we earlied out from the
xdg-toplevel commit handler, which would mean that if the client had
queued frame callbacks when resetting, they'd be left in the pending
commit state, later hitting an assert as they were not handled.
Fix this by queuing the frame callbacks no the new actor, so that they
are emitted whenever the actor is eventually painted.
https://gitlab.gnome.org/GNOME/mutter/issues/240
(cherry picked from commit d791710197
)
This commit is contained in:
parent
3712f8c99d
commit
b9f5f93956
@ -47,10 +47,14 @@ meta_wayland_actor_surface_assigned (MetaWaylandSurfaceRole *surface_role)
|
|||||||
wl_list_init (&surface->pending_frame_callback_list);
|
wl_list_init (&surface->pending_frame_callback_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
queue_surface_actor_frame_callbacks (MetaWaylandSurface *surface,
|
meta_wayland_actor_surface_queue_frame_callbacks (MetaWaylandActorSurface *actor_surface,
|
||||||
MetaWaylandPendingState *pending)
|
MetaWaylandPendingState *pending)
|
||||||
{
|
{
|
||||||
|
MetaWaylandSurfaceRole *surface_role =
|
||||||
|
META_WAYLAND_SURFACE_ROLE (actor_surface);
|
||||||
|
MetaWaylandSurface *surface =
|
||||||
|
meta_wayland_surface_role_get_surface (surface_role);
|
||||||
MetaSurfaceActorWayland *surface_actor =
|
MetaSurfaceActorWayland *surface_actor =
|
||||||
META_SURFACE_ACTOR_WAYLAND (surface->surface_actor);
|
META_SURFACE_ACTOR_WAYLAND (surface->surface_actor);
|
||||||
|
|
||||||
@ -167,7 +171,7 @@ meta_wayland_actor_surface_commit (MetaWaylandSurfaceRole *surface_role,
|
|||||||
meta_wayland_surface_role_get_surface (surface_role);
|
meta_wayland_surface_role_get_surface (surface_role);
|
||||||
MetaWaylandSurface *toplevel_surface;
|
MetaWaylandSurface *toplevel_surface;
|
||||||
|
|
||||||
queue_surface_actor_frame_callbacks (surface, pending);
|
meta_wayland_actor_surface_queue_frame_callbacks (actor_surface, pending);
|
||||||
|
|
||||||
toplevel_surface = meta_wayland_surface_get_toplevel (surface);
|
toplevel_surface = meta_wayland_surface_get_toplevel (surface);
|
||||||
if (!toplevel_surface || !toplevel_surface->window)
|
if (!toplevel_surface || !toplevel_surface->window)
|
||||||
|
@ -40,4 +40,7 @@ void meta_wayland_actor_surface_sync_actor_state (MetaWaylandActorSurface *actor
|
|||||||
|
|
||||||
double meta_wayland_actor_surface_calculate_scale (MetaWaylandActorSurface *actor_surface);
|
double meta_wayland_actor_surface_calculate_scale (MetaWaylandActorSurface *actor_surface);
|
||||||
|
|
||||||
|
void meta_wayland_actor_surface_queue_frame_callbacks (MetaWaylandActorSurface *actor_surface,
|
||||||
|
MetaWaylandPendingState *pending);
|
||||||
|
|
||||||
#endif /* META_WAYLAND_ACTOR_SURFACE_H */
|
#endif /* META_WAYLAND_ACTOR_SURFACE_H */
|
||||||
|
@ -626,7 +626,12 @@ meta_wayland_xdg_toplevel_commit (MetaWaylandSurfaceRole *surface_role,
|
|||||||
|
|
||||||
if (!surface->buffer_ref.buffer && xdg_surface_priv->first_buffer_attached)
|
if (!surface->buffer_ref.buffer && xdg_surface_priv->first_buffer_attached)
|
||||||
{
|
{
|
||||||
|
MetaWaylandActorSurface *actor_surface =
|
||||||
|
META_WAYLAND_ACTOR_SURFACE (xdg_toplevel);
|
||||||
|
|
||||||
meta_wayland_xdg_surface_reset (xdg_surface);
|
meta_wayland_xdg_surface_reset (xdg_surface);
|
||||||
|
meta_wayland_actor_surface_queue_frame_callbacks (actor_surface,
|
||||||
|
pending);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user