[gtk+: 6/8] wayland: don't handle buffer release centrally



commit 40e91195ad8a20c073789dad192e7aaaf9af6eca
Author: Ray Strode <rstrode redhat com>
Date:   Tue Feb 2 14:36:25 2016 -0500

    wayland: don't handle buffer release centrally
    
    Right now we handle buffer releases coming from the
    compositor in a central place. We add a listener when
    first creating the shared buffers.
    
    This is problematic because a buffer can only have
    one listener on it at once so users of the buffer
    can't get notified when it's released.
    
    This commit moves the buffer listener code from the
    centrally managed display code to the cursor and window
    code.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=761312

 gdk/wayland/gdkcursor-wayland.c  |   18 ++++++++++++++++++
 gdk/wayland/gdkdisplay-wayland.c |   14 --------------
 gdk/wayland/gdkwindow-wayland.c  |   16 ++++++++++++++++
 3 files changed, 34 insertions(+), 14 deletions(-)
---
diff --git a/gdk/wayland/gdkcursor-wayland.c b/gdk/wayland/gdkcursor-wayland.c
index 4f93817..4119633 100644
--- a/gdk/wayland/gdkcursor-wayland.c
+++ b/gdk/wayland/gdkcursor-wayland.c
@@ -401,6 +401,19 @@ _gdk_wayland_display_get_cursor_for_type (GdkDisplay    *display,
                                                               1);
 }
 
+static void
+buffer_release_callback (void             *_data,
+                         struct wl_buffer *wl_buffer)
+{
+  cairo_surface_t *cairo_surface = _data;
+
+  cairo_surface_destroy (cairo_surface);
+}
+
+static const struct wl_buffer_listener buffer_listener = {
+  buffer_release_callback
+};
+
 GdkCursor *
 _gdk_wayland_display_get_cursor_for_surface (GdkDisplay *display,
                                             cairo_surface_t *surface,
@@ -409,6 +422,7 @@ _gdk_wayland_display_get_cursor_for_surface (GdkDisplay *display,
 {
   GdkWaylandCursor *cursor;
   GdkWaylandDisplay *wayland_display = GDK_WAYLAND_DISPLAY (display);
+  struct wl_buffer *buffer;
   cairo_t *cr;
 
   cursor = g_object_new (GDK_TYPE_WAYLAND_CURSOR,
@@ -439,6 +453,10 @@ _gdk_wayland_display_get_cursor_for_surface (GdkDisplay *display,
                                                                            cursor->surface.width,
                                                                            cursor->surface.height,
                                                                            cursor->surface.scale);
+
+  buffer = _gdk_wayland_shm_surface_get_wl_buffer (cursor->surface.cairo_surface);
+  wl_buffer_add_listener (buffer, &buffer_listener, cursor->surface.cairo_surface);
+
   if (surface)
     {
       cr = cairo_create (cursor->surface.cairo_surface);
diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
index 500e211..db02c73 100644
--- a/gdk/wayland/gdkdisplay-wayland.c
+++ b/gdk/wayland/gdkdisplay-wayland.c
@@ -908,19 +908,6 @@ typedef struct _GdkWaylandCairoSurfaceData {
   uint32_t scale;
 } GdkWaylandCairoSurfaceData;
 
-static void
-buffer_release_callback (void             *_data,
-                         struct wl_buffer *wl_buffer)
-{
-  cairo_surface_t *surface = _data;
-
-  cairo_surface_destroy (surface);
-}
-
-static const struct wl_buffer_listener buffer_listener = {
-  buffer_release_callback
-};
-
 static struct wl_shm_pool *
 create_shm_pool (struct wl_shm  *shm,
                  int             size,
@@ -1015,7 +1002,6 @@ _gdk_wayland_display_create_shm_surface (GdkWaylandDisplay *display,
   data->buffer = wl_shm_pool_create_buffer (data->pool, 0,
                                             width*scale, height*scale,
                                             stride, WL_SHM_FORMAT_ARGB8888);
-  wl_buffer_add_listener (data->buffer, &buffer_listener, surface);
 
   cairo_surface_set_user_data (surface, &gdk_wayland_shm_surface_cairo_key,
                                data, gdk_wayland_cairo_surface_destroy);
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index 1c509e5..d0707c1 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -581,6 +581,19 @@ gdk_wayland_window_attach_image (GdkWindow *window)
 }
 
 static void
+buffer_release_callback (void             *_data,
+                         struct wl_buffer *wl_buffer)
+{
+  cairo_surface_t *cairo_surface = _data;
+
+  cairo_surface_destroy (cairo_surface);
+}
+
+static const struct wl_buffer_listener buffer_listener = {
+  buffer_release_callback
+};
+
+static void
 gdk_wayland_window_ensure_cairo_surface (GdkWindow *window)
 {
   GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
@@ -601,11 +614,14 @@ gdk_wayland_window_ensure_cairo_surface (GdkWindow *window)
   else if (!impl->cairo_surface)
     {
       GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (gdk_window_get_display (impl->wrapper));
+      struct wl_buffer *buffer;
 
       impl->cairo_surface = _gdk_wayland_display_create_shm_surface (display_wayland,
                                                                      impl->wrapper->width,
                                                                      impl->wrapper->height,
                                                                      impl->scale);
+      buffer = _gdk_wayland_shm_surface_get_wl_buffer (impl->cairo_surface);
+      wl_buffer_add_listener (buffer, &buffer_listener, impl->cairo_surface);
     }
 }
 


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