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
This commit is contained in:
parent
f692c527e7
commit
c7976e0dbc
@ -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);
|
||||
@ -223,6 +212,28 @@ cursor_surface_role_dispose (GObject *object)
|
||||
G_OBJECT_CLASS (meta_wayland_surface_role_cursor_parent_class)->dispose (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)
|
||||
{
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user