[mutter] wayland/cursor-role: Increase buffer use count on construction



commit c7976e0dbcd266d788309aabe51392b7de094b32
Author: Jonas Ådahl <jadahl gmail com>
Date:   Thu Aug 25 17:38:45 2016 +0800

    wayland/cursor-role: Increase buffer use count on construction
    
    We may be assigned multiple times, if the surface is assigned to be a
    cursor surface multiple times. Each time e.g. wl_pointer.set_cursor is
    called, we'll be assigned.
    
    While the role object exists, we'll handle buffer use count even when
    we are not actively assigned, thus we should only handle the initial
    assignment use count bump when constructing, so that we don't increase
    it when reassigned, where the wl_resource may already have been
    released.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=770402

 src/wayland/meta-wayland-surface-role-cursor.c |   34 ++++++++++++++++-------
 1 files changed, 23 insertions(+), 11 deletions(-)
---
diff --git a/src/wayland/meta-wayland-surface-role-cursor.c b/src/wayland/meta-wayland-surface-role-cursor.c
index ec93f73..ebe9724 100644
--- a/src/wayland/meta-wayland-surface-role-cursor.c
+++ b/src/wayland/meta-wayland-surface-role-cursor.c
@@ -113,19 +113,8 @@ cursor_sprite_prepare_at (MetaCursorSprite             *cursor_sprite,
 static void
 cursor_surface_role_assigned (MetaWaylandSurfaceRole *surface_role)
 {
-  MetaWaylandSurfaceRoleCursor *cursor_role =
-    META_WAYLAND_SURFACE_ROLE_CURSOR (surface_role);
-  MetaWaylandSurfaceRoleCursorPrivate *priv =
-    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
   MetaWaylandSurface *surface =
     meta_wayland_surface_role_get_surface (surface_role);
-  MetaWaylandBuffer *buffer = meta_wayland_surface_get_buffer (surface);
-
-  if (buffer)
-    {
-      g_set_object (&priv->buffer, buffer);
-      meta_wayland_surface_ref_buffer_use_count (surface);
-    }
 
   wl_list_insert_list (&priv->frame_callbacks,
                        &surface->pending_frame_callback_list);
@@ -224,6 +213,28 @@ cursor_surface_role_dispose (GObject *object)
 }
 
 static void
+cursor_surface_role_constructed (GObject *object)
+{
+  MetaWaylandSurfaceRoleCursor *cursor_role =
+    META_WAYLAND_SURFACE_ROLE_CURSOR (object);
+  MetaWaylandSurfaceRoleCursorPrivate *priv =
+    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
+  MetaWaylandSurfaceRole *surface_role =
+    META_WAYLAND_SURFACE_ROLE (cursor_role);
+  MetaWaylandSurface *surface =
+    meta_wayland_surface_role_get_surface (surface_role);
+  MetaWaylandBuffer *buffer;
+
+  buffer = meta_wayland_surface_get_buffer (surface);
+  if (buffer)
+    {
+      g_assert (buffer->resource);
+      g_set_object (&priv->buffer, buffer);
+      meta_wayland_surface_ref_buffer_use_count (surface);
+    }
+}
+
+static void
 meta_wayland_surface_role_cursor_init (MetaWaylandSurfaceRoleCursor *role)
 {
   MetaWaylandSurfaceRoleCursorPrivate *priv =
@@ -250,6 +261,7 @@ meta_wayland_surface_role_cursor_class_init (MetaWaylandSurfaceRoleCursorClass *
   surface_role_class->commit = cursor_surface_role_commit;
   surface_role_class->is_on_output = cursor_surface_role_is_on_output;
 
+  object_class->constructed = cursor_surface_role_constructed;
   object_class->dispose = cursor_surface_role_dispose;
 }
 


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