diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2018-08-27 12:30:07 +0200 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2018-08-27 11:43:53 +0000 |
commit | 80d420ff430e8e9495fd29d68084cb050600b26f (patch) | |
tree | 9a3f1ca3187c2ed1b8660f741bc800a7149cd663 | |
parent | 407d62943c1c0bbb34df5943b6b2d91c5723b6c4 (diff) | |
download | mutter-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.c | 8 |
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 = |