[mutter/wip/carlosg/unthrottled-wayland: 17/27] wayland: Mark sprite as invalid after cursor changes




commit 17257464d0c8175ad7db31f95004807ce4ded334
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon Jul 5 15:50:06 2021 +0200

    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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1915>

 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 c4e532b0f4..40a8d10b06 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 d01919f57c..62708f162f 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);


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