summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2018-08-27 12:30:07 +0200
committerJonas Ådahl <jadahl@gmail.com>2018-08-27 11:43:53 +0000
commit80d420ff430e8e9495fd29d68084cb050600b26f (patch)
tree9a3f1ca3187c2ed1b8660f741bc800a7149cd663
parent407d62943c1c0bbb34df5943b6b2d91c5723b6c4 (diff)
downloadmutter-80d420ff430e8e9495fd29d68084cb050600b26f.tar.gz
wayland/xdg-shell: Cache frame callbacks if toplevel is unmanaged
A toplevel window can be unmanaged without the client knowing it (e.g. a modal dialog being unmapped together with its parent. When this has happened, take frame callbacks queued on a commit and cache them on the generic surface queue. If the toplevel is to be remapped, either because the surface was reassigned the toplevel role, or if it was reset and remapped, the cached frame callbacks will be queued on the surface actor and dispatched accordingly. https://gitlab.gnome.org/GNOME/mutter/issues/240
-rw-r--r--src/wayland/meta-wayland-xdg-shell.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c
index dc4216d4a..6bcaa59b0 100644
--- a/src/wayland/meta-wayland-xdg-shell.c
+++ b/src/wayland/meta-wayland-xdg-shell.c
@@ -624,6 +624,13 @@ meta_wayland_xdg_toplevel_commit (MetaWaylandSurfaceRole *surface_role,
MetaRectangle old_geometry;
gboolean geometry_changed;
+ window = surface->window;
+ if (!window)
+ {
+ meta_wayland_surface_cache_pending_frame_callbacks (surface, pending);
+ return;
+ }
+
if (!surface->buffer_ref.buffer && xdg_surface_priv->first_buffer_attached)
{
MetaWaylandActorSurface *actor_surface =
@@ -635,7 +642,6 @@ meta_wayland_xdg_toplevel_commit (MetaWaylandSurfaceRole *surface_role,
return;
}
- window = surface->window;
old_geometry = xdg_surface_priv->geometry;
surface_role_class =