[gtk+] wayland: Ensure we destroy the shell surface when destroying the surface



commit 91a11ee27735aadfcebb485c4e2240f3c3ab763b
Author: Rob Bradford <rob linux intel com>
Date:   Wed Jul 11 19:22:27 2012 +0100

    wayland: Ensure we destroy the shell surface when destroying the surface
    
    Otherwise we can try and use an invalid object that the compositor has already
    deleted.

 gdk/wayland/gdkwindow-wayland.c |   33 ++++++++++++++++++++++-----------
 1 files changed, 22 insertions(+), 11 deletions(-)
---
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index f1b7975..450df4a 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -764,7 +764,11 @@ gdk_wayland_window_hide (GdkWindow *window)
 
   if (impl->surface)
     {
-      wl_surface_destroy(impl->surface);
+      if (impl->shell_surface)
+        wl_shell_surface_destroy(impl->shell_surface);
+      if (impl->surface)
+        wl_surface_destroy(impl->surface);
+      impl->shell_surface = NULL;
       impl->surface = NULL;
       cairo_surface_destroy(impl->server_surface);
       impl->server_surface = NULL;
@@ -788,13 +792,17 @@ gdk_window_wayland_withdraw (GdkWindow *window)
 
       impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
       if (impl->surface)
-	{
-	  wl_surface_destroy(impl->surface);
-	  impl->surface = NULL;
-	  cairo_surface_destroy(impl->server_surface);
-	  impl->server_surface = NULL;
-	  impl->mapped = FALSE;
-	}
+        {
+          if (impl->shell_surface)
+            wl_shell_surface_destroy(impl->shell_surface);
+          if (impl->surface)
+            wl_surface_destroy(impl->surface);
+          impl->shell_surface = NULL;
+          impl->surface = NULL;
+          cairo_surface_destroy(impl->server_surface);
+          impl->server_surface = NULL;
+          impl->mapped = FALSE;
+        }
     }
 }
 
@@ -1034,9 +1042,12 @@ gdk_wayland_window_destroy (GdkWindow *window,
 
   if (!recursing && !foreign_destroy)
     {
-      if (GDK_WINDOW_IMPL_WAYLAND (window->impl)->surface)
-	wl_surface_destroy(GDK_WINDOW_IMPL_WAYLAND (window->impl)->surface);
-	wl_shell_surface_destroy(GDK_WINDOW_IMPL_WAYLAND (window->impl)->shell_surface);
+      if (impl->shell_surface)
+        wl_shell_surface_destroy(impl->shell_surface);
+      if (impl->surface)
+        wl_surface_destroy(impl->surface);
+      impl->shell_surface = NULL;
+      impl->surface = NULL;
     }
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]