wayland: Drop cairo surfaces when withdrawing
authorOlivier Fourdan <ofourdan@redhat.com>
Tue, 30 Jan 2018 12:57:35 +0000 (13:57 +0100)
committerOlivier Fourdan <ofourdan@redhat.com>
Tue, 20 Mar 2018 17:49:56 +0000 (18:49 +0100)
If a surface is unmapped by the client while gdk is processing updates,
(for example Firefox un-mapping its window on Expose events), the
windowing backend resources might be lost (for example with Wayland)
which can cause a crash in end_paint().

Make sure we drop the cairo surfaces as well when hiding the surface,
that will avoid the crash in gdk_surface_impl_wayland_end_paint() when
trying to attach the staging cairo surface to a released wl_surface,
these will be recreated when needed when the surface becomes visible
again and there is no need to keep such buffers around for a surface
which is not visible anyway.

https://bugzilla.gnome.org/show_bug.cgi?id=793062

gdk/wayland/gdksurface-wayland.c

index d91be60e89622d945dc371626da66f679767fce6..dcd9990f63fc7b0c08fb02f9993a4ea6e1f6cd6f 100644 (file)
@@ -2530,6 +2530,7 @@ gdk_wayland_surface_hide_surface (GdkSurface *surface)
   unset_transient_for_exported (surface);
 
   _gdk_wayland_surface_clear_saved_size (surface);
+  drop_cairo_surfaces (surface);
   impl->pending_commit = FALSE;
   impl->mapped = FALSE;
 }
@@ -2813,7 +2814,6 @@ gdk_wayland_surface_destroy (GdkSurface *surface,
   g_return_if_fail (!foreign_destroy);
 
   gdk_wayland_surface_hide_surface (surface);
-  drop_cairo_surfaces (surface);
 
   if (surface->parent == NULL)
     {