From 2a20df0c50abc7b2648f9752ac51ce582606470f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 23 Apr 2018 16:57:01 +0200 Subject: [PATCH] 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 #include -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);