From 5e93708d8626d2955b1b0497fa9e9c056da1002a Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 5 Jul 2021 15:50:06 +0200 Subject: [PATCH] wayland: Mark sprite as invalid after cursor changes This will be used to hint the backend that the cursor surface might need uploading again. Part-of: --- src/wayland/meta-cursor-sprite-wayland.c | 24 +++++++++++++++++++++++- src/wayland/meta-wayland-pointer.c | 5 +++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/wayland/meta-cursor-sprite-wayland.c b/src/wayland/meta-cursor-sprite-wayland.c index c4e532b0f..40a8d10b0 100644 --- a/src/wayland/meta-cursor-sprite-wayland.c +++ b/src/wayland/meta-cursor-sprite-wayland.c @@ -25,6 +25,7 @@ struct _MetaCursorSpriteWayland MetaCursorSprite parent; MetaWaylandSurface *surface; + gboolean invalidated; }; G_DEFINE_TYPE (MetaCursorSpriteWayland, @@ -34,7 +35,17 @@ G_DEFINE_TYPE (MetaCursorSpriteWayland, static gboolean meta_cursor_sprite_wayland_realize_texture (MetaCursorSprite *sprite) { - return TRUE; + MetaCursorSpriteWayland *sprite_wayland; + + sprite_wayland = META_CURSOR_SPRITE_WAYLAND (sprite); + + if (sprite_wayland->invalidated) + { + sprite_wayland->invalidated = FALSE; + return TRUE; + } + + return FALSE; } static gboolean @@ -43,6 +54,15 @@ meta_cursor_sprite_wayland_is_animated (MetaCursorSprite *sprite) return FALSE; } +static void +meta_cursor_sprite_wayland_invalidate (MetaCursorSprite *sprite) +{ + MetaCursorSpriteWayland *sprite_wayland; + + sprite_wayland = META_CURSOR_SPRITE_WAYLAND (sprite); + sprite_wayland->invalidated = TRUE; +} + MetaCursorSpriteWayland * meta_cursor_sprite_wayland_new (MetaWaylandSurface *surface) { @@ -72,5 +92,7 @@ meta_cursor_sprite_wayland_class_init (MetaCursorSpriteWaylandClass *klass) cursor_sprite_class->realize_texture = meta_cursor_sprite_wayland_realize_texture; + cursor_sprite_class->invalidate = + meta_cursor_sprite_wayland_invalidate; cursor_sprite_class->is_animated = meta_cursor_sprite_wayland_is_animated; } diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c index d01919f57..62708f162 100644 --- a/src/wayland/meta-wayland-pointer.c +++ b/src/wayland/meta-wayland-pointer.c @@ -55,6 +55,7 @@ #include "cogl/cogl.h" #include "compositor/meta-surface-actor-wayland.h" #include "meta/meta-cursor-tracker.h" +#include "wayland/meta-cursor-sprite-wayland.h" #include "wayland/meta-wayland-buffer.h" #include "wayland/meta-wayland-cursor-surface.h" #include "wayland/meta-wayland-pointer.h" @@ -1223,12 +1224,16 @@ pointer_set_cursor (struct wl_client *client, meta_backend_get_cursor_renderer_for_device (meta_get_backend (), device); MetaWaylandCursorSurface *cursor_surface; + MetaCursorSprite *cursor_sprite; cursor_surface = META_WAYLAND_CURSOR_SURFACE (surface->role); meta_wayland_cursor_surface_set_renderer (cursor_surface, cursor_renderer); meta_wayland_cursor_surface_set_hotspot (cursor_surface, hot_x, hot_y); + + cursor_sprite = meta_wayland_cursor_surface_get_sprite (cursor_surface); + meta_cursor_sprite_invalidate (cursor_sprite); } meta_wayland_pointer_set_cursor_surface (pointer, surface);