86 lines
3.1 KiB
Diff
86 lines
3.1 KiB
Diff
|
From 50f565dc32a0ac511d12053a1bb1cb22ebf43e44 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||
|
Date: Thu, 25 Aug 2016 17:38:45 +0800
|
||
|
Subject: [PATCH] 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 file 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 2dbbc55..d63aed4 100644
|
||
|
--- a/src/wayland/meta-wayland-surface-role-cursor.c
|
||
|
+++ b/src/wayland/meta-wayland-surface-role-cursor.c
|
||
|
@@ -110,19 +110,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);
|
||
|
- }
|
||
|
|
||
|
meta_wayland_surface_queue_pending_frame_callbacks (surface);
|
||
|
}
|
||
|
@@ -213,6 +202,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 =
|
||
|
@@ -238,6 +249,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;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.9.3
|
||
|
|