[mutter] backends/cursor: Make MetaCursorSprite derivable



commit 2a20df0c50abc7b2648f9752ac51ce582606470f
Author: Jonas Ådahl <jadahl gmail com>
Date:   Mon Apr 23 16:57:01 2018 +0200

    backends/cursor: Make MetaCursorSprite derivable
    
    This makes it possible to move out backing store specific code (such as
    Xcursor handling) to separate units, while also making it easier to add
    more types).
    
    https://gitlab.gnome.org/GNOME/mutter/issues/77

 src/backends/meta-cursor.c | 134 ++++++++++++++++++++++++++++++---------------
 src/backends/meta-cursor.h |  13 +++--
 2 files changed, 98 insertions(+), 49 deletions(-)
---
diff --git a/src/backends/meta-cursor.c b/src/backends/meta-cursor.c
index be501a813..ffbbd2f40 100644
--- a/src/backends/meta-cursor.c
+++ b/src/backends/meta-cursor.c
@@ -44,7 +44,7 @@ enum {
 
 static guint signals[LAST_SIGNAL];
 
-struct _MetaCursorSprite
+typedef struct _MetaCursorSpritePrivate
 {
   GObject parent;
 
@@ -59,9 +59,9 @@ struct _MetaCursorSprite
 
   int theme_scale;
   gboolean theme_dirty;
-};
+} MetaCursorSpritePrivate;
 
-G_DEFINE_TYPE (MetaCursorSprite, meta_cursor_sprite, G_TYPE_OBJECT)
+G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorSprite, meta_cursor_sprite, G_TYPE_OBJECT)
 
 static const char *
 translate_meta_cursor (MetaCursor cursor)
@@ -130,6 +130,8 @@ static void
 meta_cursor_sprite_load_from_xcursor_image (MetaCursorSprite *sprite,
                                             XcursorImage     *xc_image)
 {
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
   MetaBackend *backend = meta_get_backend ();
   MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (backend);
   uint width, height, rowstride;
@@ -139,7 +141,7 @@ meta_cursor_sprite_load_from_xcursor_image (MetaCursorSprite *sprite,
   CoglTexture2D *texture;
   CoglError *error = NULL;
 
-  g_assert (sprite->texture == NULL);
+  g_assert (priv->texture == NULL);
 
   width           = xc_image->width;
   height          = xc_image->height;
@@ -178,42 +180,53 @@ meta_cursor_sprite_load_from_xcursor_image (MetaCursorSprite *sprite,
 static XcursorImage *
 meta_cursor_sprite_get_current_frame_image (MetaCursorSprite *sprite)
 {
-  return sprite->xcursor_images->images[sprite->current_frame];
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  return priv->xcursor_images->images[priv->current_frame];
 }
 
 void
 meta_cursor_sprite_tick_frame (MetaCursorSprite *sprite)
 {
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
   XcursorImage *image;
 
   if (!meta_cursor_sprite_is_animated (sprite))
     return;
 
-  sprite->current_frame++;
+  priv->current_frame++;
 
-  if (sprite->current_frame >= sprite->xcursor_images->nimage)
-    sprite->current_frame = 0;
+  if (priv->current_frame >= priv->xcursor_images->nimage)
+    priv->current_frame = 0;
 
   image = meta_cursor_sprite_get_current_frame_image (sprite);
 
-  g_clear_pointer (&sprite->texture, cogl_object_unref);
+  g_clear_pointer (&priv->texture, cogl_object_unref);
   meta_cursor_sprite_load_from_xcursor_image (sprite, image);
 }
 
 guint
 meta_cursor_sprite_get_current_frame_time (MetaCursorSprite *sprite)
 {
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
   if (!meta_cursor_sprite_is_animated (sprite))
     return 0;
 
-  return sprite->xcursor_images->images[sprite->current_frame]->delay;
+  return priv->xcursor_images->images[priv->current_frame]->delay;
 }
 
 gboolean
 meta_cursor_sprite_is_animated (MetaCursorSprite *sprite)
 {
-  return (sprite->xcursor_images &&
-          sprite->xcursor_images->nimage > 1);
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  return (priv->xcursor_images &&
+          priv->xcursor_images->nimage > 1);
 }
 
 MetaCursorSprite *
@@ -225,23 +238,25 @@ meta_cursor_sprite_new (void)
 static void
 meta_cursor_sprite_load_from_theme (MetaCursorSprite *sprite)
 {
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
   XcursorImage *image;
 
-  g_assert (sprite->cursor != META_CURSOR_NONE);
+  g_assert (priv->cursor != META_CURSOR_NONE);
 
-  sprite->theme_dirty = FALSE;
+  priv->theme_dirty = FALSE;
 
   /* We might be reloading with a different scale. If so clear the old data. */
-  if (sprite->xcursor_images)
+  if (priv->xcursor_images)
     {
-      g_clear_pointer (&sprite->texture, cogl_object_unref);
-      XcursorImagesDestroy (sprite->xcursor_images);
+      g_clear_pointer (&priv->texture, cogl_object_unref);
+      XcursorImagesDestroy (priv->xcursor_images);
     }
 
-  sprite->current_frame = 0;
-  sprite->xcursor_images = load_cursor_on_client (sprite->cursor,
-                                                  sprite->theme_scale);
-  if (!sprite->xcursor_images)
+  priv->current_frame = 0;
+  priv->xcursor_images = load_cursor_on_client (priv->cursor,
+                                                priv->theme_scale);
+  if (!priv->xcursor_images)
     meta_fatal ("Could not find cursor. Perhaps set XCURSOR_PATH?");
 
   image = meta_cursor_sprite_get_current_frame_image (sprite);
@@ -252,11 +267,13 @@ MetaCursorSprite *
 meta_cursor_sprite_from_theme (MetaCursor cursor)
 {
   MetaCursorSprite *sprite;
+  MetaCursorSpritePrivate *priv;
 
   sprite = meta_cursor_sprite_new ();
+  priv = meta_cursor_sprite_get_instance_private (sprite);
 
-  sprite->cursor = cursor;
-  sprite->theme_dirty = TRUE;
+  priv->cursor = cursor;
+  priv->theme_dirty = TRUE;
 
   return sprite;
 }
@@ -267,16 +284,19 @@ meta_cursor_sprite_set_texture (MetaCursorSprite *sprite,
                                 int               hot_x,
                                 int               hot_y)
 {
-  if (sprite->texture == COGL_TEXTURE_2D (texture) &&
-      sprite->hot_x == hot_x &&
-      sprite->hot_y == hot_y)
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  if (priv->texture == COGL_TEXTURE_2D (texture) &&
+      priv->hot_x == hot_x &&
+      priv->hot_y == hot_y)
     return;
 
-  g_clear_pointer (&sprite->texture, cogl_object_unref);
+  g_clear_pointer (&priv->texture, cogl_object_unref);
   if (texture)
-    sprite->texture = cogl_object_ref (texture);
-  sprite->hot_x = hot_x;
-  sprite->hot_y = hot_y;
+    priv->texture = cogl_object_ref (texture);
+  priv->hot_x = hot_x;
+  priv->hot_y = hot_y;
 
   g_signal_emit (sprite, signals[TEXTURE_CHANGED], 0);
 }
@@ -285,28 +305,40 @@ void
 meta_cursor_sprite_set_texture_scale (MetaCursorSprite *sprite,
                                       float             scale)
 {
-  sprite->texture_scale = scale;
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  priv->texture_scale = scale;
 }
 
 void
 meta_cursor_sprite_set_theme_scale (MetaCursorSprite *sprite,
                                     int               theme_scale)
 {
-  if (sprite->theme_scale != theme_scale)
-    sprite->theme_dirty = TRUE;
-  sprite->theme_scale = theme_scale;
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  if (priv->theme_scale != theme_scale)
+    priv->theme_dirty = TRUE;
+  priv->theme_scale = theme_scale;
 }
 
 CoglTexture *
 meta_cursor_sprite_get_cogl_texture (MetaCursorSprite *sprite)
 {
-  return COGL_TEXTURE (sprite->texture);
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  return COGL_TEXTURE (priv->texture);
 }
 
 MetaCursor
 meta_cursor_sprite_get_meta_cursor (MetaCursorSprite *sprite)
 {
-  return sprite->cursor;
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  return priv->cursor;
 }
 
 void
@@ -314,14 +346,20 @@ meta_cursor_sprite_get_hotspot (MetaCursorSprite *sprite,
                                 int              *hot_x,
                                 int              *hot_y)
 {
-  *hot_x = sprite->hot_x;
-  *hot_y = sprite->hot_y;
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  *hot_x = priv->hot_x;
+  *hot_y = priv->hot_y;
 }
 
 float
 meta_cursor_sprite_get_texture_scale (MetaCursorSprite *sprite)
 {
-  return sprite->texture_scale;
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  return priv->texture_scale;
 }
 
 void
@@ -335,25 +373,33 @@ meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
 void
 meta_cursor_sprite_realize_texture (MetaCursorSprite *sprite)
 {
-  if (sprite->theme_dirty)
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  if (priv->theme_dirty)
     meta_cursor_sprite_load_from_theme (sprite);
 }
 
 static void
 meta_cursor_sprite_init (MetaCursorSprite *sprite)
 {
-  sprite->texture_scale = 1.0f;
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  priv->texture_scale = 1.0f;
 }
 
 static void
 meta_cursor_sprite_finalize (GObject *object)
 {
   MetaCursorSprite *sprite = META_CURSOR_SPRITE (object);
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
 
-  if (sprite->xcursor_images)
-    XcursorImagesDestroy (sprite->xcursor_images);
+  if (priv->xcursor_images)
+    XcursorImagesDestroy (priv->xcursor_images);
 
-  g_clear_pointer (&sprite->texture, cogl_object_unref);
+  g_clear_pointer (&priv->texture, cogl_object_unref);
 
   G_OBJECT_CLASS (meta_cursor_sprite_parent_class)->finalize (object);
 }
diff --git a/src/backends/meta-cursor.h b/src/backends/meta-cursor.h
index 888713a22..1342a39ab 100644
--- a/src/backends/meta-cursor.h
+++ b/src/backends/meta-cursor.h
@@ -25,13 +25,16 @@
 #include <meta/common.h>
 #include <meta/boxes.h>
 
-typedef struct _MetaCursorSprite MetaCursorSprite;
+struct _MetaCursorSpriteClass
+{
+  GObjectClass parent_class;
+};
 
 #define META_TYPE_CURSOR_SPRITE (meta_cursor_sprite_get_type ())
-G_DECLARE_FINAL_TYPE (MetaCursorSprite,
-                      meta_cursor_sprite,
-                      META, CURSOR_SPRITE,
-                      GObject);
+G_DECLARE_DERIVABLE_TYPE (MetaCursorSprite,
+                          meta_cursor_sprite,
+                          META, CURSOR_SPRITE,
+                          GObject)
 
 MetaCursorSprite * meta_cursor_sprite_new (void);
 


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