[gtk+/gdk-backend-wayland] wayland: Keep a reference to the surface we last attached



commit 22b9132ae53affc02fd25ad2814fa891aec92255
Author: Kristian Høgsberg <krh bitplanet net>
Date:   Thu Feb 10 22:04:26 2011 -0500

    wayland: Keep a reference to the surface we last attached

 gdk/wayland/gdkdisplay-wayland.c |    5 ----
 gdk/wayland/gdkwindow-wayland.c  |   46 ++++++++++++++------------------------
 2 files changed, 17 insertions(+), 34 deletions(-)
---
diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
index 0e68b7e..3d0dc09 100644
--- a/gdk/wayland/gdkdisplay-wayland.c
+++ b/gdk/wayland/gdkdisplay-wayland.c
@@ -128,9 +128,6 @@ shell_handle_configure(void *data, struct wl_shell *shell,
 
   window = wl_surface_get_user_data(surface);
 
-  printf("got configure: window %p, %dx%d, edges %d\n",
-	 window, width, height, edges);
-
   display = gdk_window_get_display (window);
 
   event = gdk_event_new (GDK_CONFIGURE);
@@ -249,8 +246,6 @@ gdk_display_init_egl(GdkDisplay *display)
     }
   }
 
-  fprintf(stderr, "egl initialized\n");
-
   return TRUE;
 }
 
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index 9f567c1..ca14684 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -157,8 +157,6 @@ _gdk_wayland_window_update_size (GdkWindow *window)
   GdkRectangle area;
   cairo_region_t *region;
 
-  fprintf(stderr, "update size, window %p\n", impl->wrapper);
-
   if (impl->cairo_surface)
     {
       cairo_surface_destroy (impl->cairo_surface);
@@ -300,27 +298,13 @@ typedef struct _GdkWaylandCairoSurfaceData {
   GdkDisplayWayland *display;
 } GdkWaylandCairoSurfaceData;
 
-struct wl_buffer *
-_gdk_wayland_surface_get_buffer (GdkDisplayWayland *display,
-				 cairo_surface_t *surface)
-{
-  GdkWaylandCairoSurfaceData *data;
-
-  data = cairo_surface_get_user_data (surface, &gdk_wayland_cairo_key);
-
-  if (!data->buffer)
-    data->buffer =
-      wl_egl_pixmap_create_buffer(display->native_display, data->pixmap);
-
-  return data->buffer;
-}
-
 static void
 gdk_wayland_window_attach_image (GdkWindow *window)
 {
-  GdkDisplayWayland *display_wayland =
+  GdkDisplayWayland *display =
     GDK_DISPLAY_WAYLAND (gdk_window_get_display (window));
   GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+  GdkWaylandCairoSurfaceData *data;
   struct wl_buffer *buffer;
 
   if (GDK_WINDOW_DESTROYED (window))
@@ -329,12 +313,18 @@ gdk_wayland_window_attach_image (GdkWindow *window)
   if (impl->server_surface == impl->cairo_surface)
     return;
 
+  cairo_surface_reference (impl->cairo_surface);
+  if (impl->server_surface)
+    cairo_surface_destroy (impl->server_surface);
   impl->server_surface = impl->cairo_surface;
-  buffer = _gdk_wayland_surface_get_buffer (display_wayland,
-					    impl->cairo_surface);
-  wl_surface_attach (impl->surface, buffer, 0, 0);
 
-  fprintf(stderr, "attach %p %dx%d\n", window, window->width, window->height);
+  data = cairo_surface_get_user_data (impl->cairo_surface,
+				      &gdk_wayland_cairo_key);
+  if (!data->buffer)
+    data->buffer =
+      wl_egl_pixmap_create_buffer(display->native_display, data->pixmap);
+
+  wl_surface_attach (impl->surface, data->buffer, 0, 0);
 }
 
 static void
@@ -350,6 +340,8 @@ gdk_window_impl_wayland_finalize (GObject *object)
 
   if (impl->cursor)
     gdk_cursor_unref (impl->cursor);
+  if (impl->server_surface)
+    cairo_surface_destroy (impl->server_surface);
 
   g_hash_table_destroy (impl->device_cursor);
 
@@ -392,8 +384,6 @@ gdk_wayland_create_cairo_surface (GdkDisplayWayland *display,
   glBindTexture(GL_TEXTURE_2D, data->texture);
   display->image_target_texture_2d(GL_TEXTURE_2D, data->image);
 
-  printf("allocate image %dx%d (image %p)\n", width, height, data->image);
-
   surface = cairo_gl_surface_create_for_texture(display->cairo_device,
 						CAIRO_CONTENT_COLOR_ALPHA,
 						data->texture, width, height);
@@ -463,8 +453,6 @@ gdk_wayland_window_show (GdkWindow *window, gboolean already_mapped)
   _gdk_make_event (window, GDK_MAP, NULL, FALSE);
   event = _gdk_make_event (window, GDK_VISIBILITY_NOTIFY, NULL, FALSE);
   event->visibility.state = GDK_VISIBILITY_UNOBSCURED;
-
-  fprintf(stderr, "window show, faked map event\n");
 }
 
 static void
@@ -1192,8 +1180,6 @@ gdk_wayland_window_configure_finished (GdkWindow *window)
 
   if (!GDK_IS_WINDOW_IMPL_WAYLAND (window->impl))
     return;
-
-  fprintf(stderr, "configure %p finished\n", window);
 }
 
 static void
@@ -1230,7 +1216,9 @@ gdk_wayland_window_process_updates_recurse (GdkWindow *window,
   cairo_rectangle_int_t rect;
   int i, n;
 
-  gdk_wayland_window_attach_image (window);
+  if (impl->cairo_surface)
+    gdk_wayland_window_attach_image (window);
+
   if (!impl->mapped)
     {
       wl_surface_map_toplevel (impl->surface);



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