[mutter] Make MetaCursorSprite a GObject



commit b01f95cfdd1c6c5e3e504e8ebac84693f0954a18
Author: Jonas Ådahl <jadahl gmail com>
Date:   Tue Mar 10 14:35:49 2015 +0800

    Make MetaCursorSprite a GObject
    
    To easier track lifetime and utilize other GObject features, make
    MetaCursorSprite a GObject.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=744932

 src/backends/meta-cursor-private.h |    8 ++-
 src/backends/meta-cursor-tracker.c |   37 +++++-----------
 src/backends/meta-cursor.c         |   81 +++++++++++++++++++++++-------------
 src/backends/meta-cursor.h         |   15 +++++--
 src/core/screen.c                  |    2 +-
 src/wayland/meta-wayland-pointer.c |    2 +-
 6 files changed, 81 insertions(+), 64 deletions(-)
---
diff --git a/src/backends/meta-cursor-private.h b/src/backends/meta-cursor-private.h
index b936c01..3113464 100644
--- a/src/backends/meta-cursor-private.h
+++ b/src/backends/meta-cursor-private.h
@@ -31,7 +31,8 @@
 #include <gbm.h>
 #endif
 
-typedef struct {
+typedef struct
+{
   CoglTexture2D *texture;
   int hot_x, hot_y;
 
@@ -40,8 +41,9 @@ typedef struct {
 #endif
 } MetaCursorImage;
 
-struct _MetaCursorSprite {
-  int ref_count;
+struct _MetaCursorSprite
+{
+  GObject parent;
 
   int current_frame;
   XcursorImages *xcursor_images;
diff --git a/src/backends/meta-cursor-tracker.c b/src/backends/meta-cursor-tracker.c
index 8873410..bd61efc 100644
--- a/src/backends/meta-cursor-tracker.c
+++ b/src/backends/meta-cursor-tracker.c
@@ -85,9 +85,9 @@ sync_cursor (MetaCursorTracker *tracker)
   if (tracker->displayed_cursor == displayed_cursor)
     return;
 
-  g_clear_pointer (&tracker->displayed_cursor, meta_cursor_sprite_unref);
+  g_clear_object (&tracker->displayed_cursor);
   if (displayed_cursor)
-    tracker->displayed_cursor = meta_cursor_sprite_ref (displayed_cursor);
+    tracker->displayed_cursor = g_object_ref (displayed_cursor);
 
   update_displayed_cursor (tracker);
   g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
@@ -108,9 +108,9 @@ meta_cursor_tracker_finalize (GObject *object)
   MetaCursorTracker *self = META_CURSOR_TRACKER (object);
 
   if (self->displayed_cursor)
-    meta_cursor_sprite_unref (self->displayed_cursor);
+    g_object_unref (self->displayed_cursor);
   if (self->root_cursor)
-    meta_cursor_sprite_unref (self->root_cursor);
+    g_object_unref (self->root_cursor);
 
   G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->finalize (object);
 }
@@ -160,9 +160,9 @@ set_window_cursor (MetaCursorTracker *tracker,
                    gboolean           has_cursor,
                    MetaCursorSprite  *cursor_sprite)
 {
-  g_clear_pointer (&tracker->window_cursor, meta_cursor_sprite_unref);
+  g_clear_object (&tracker->window_cursor);
   if (cursor_sprite)
-    tracker->window_cursor = meta_cursor_sprite_ref (cursor_sprite);
+    tracker->window_cursor = g_object_ref (cursor_sprite);
   tracker->has_window_cursor = has_cursor;
   sync_cursor (tracker);
 }
@@ -184,28 +184,12 @@ meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
   if (notify_event->subtype != XFixesDisplayCursorNotify)
     return FALSE;
 
-  g_clear_pointer (&tracker->xfixes_cursor, meta_cursor_sprite_unref);
+  g_clear_object (&tracker->xfixes_cursor);
   g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
 
   return TRUE;
 }
 
-static MetaCursorSprite *
-meta_cursor_sprite_take_texture (CoglTexture2D *texture,
-                                 int            hot_x,
-                                 int            hot_y)
-{
-  MetaCursorSprite *self;
-
-  self = g_slice_new0 (MetaCursorSprite);
-  self->ref_count = 1;
-  self->image.texture = texture;
-  self->image.hot_x = hot_x;
-  self->image.hot_y = hot_y;
-
-  return self;
-}
-
 static void
 ensure_xfixes_cursor (MetaCursorTracker *tracker)
 {
@@ -264,9 +248,10 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker)
   if (sprite != NULL)
     {
       MetaCursorSprite *cursor_sprite =
-        meta_cursor_sprite_take_texture (sprite,
+        meta_cursor_sprite_from_texture (sprite,
                                          cursor_image->xhot,
                                          cursor_image->yhot);
+      cogl_object_unref (sprite);
       tracker->xfixes_cursor = cursor_sprite;
     }
   XFree (cursor_image);
@@ -354,9 +339,9 @@ void
 meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
                                      MetaCursorSprite  *cursor_sprite)
 {
-  g_clear_pointer (&tracker->root_cursor, meta_cursor_sprite_unref);
+  g_clear_object (&tracker->root_cursor);
   if (cursor_sprite)
-    tracker->root_cursor = meta_cursor_sprite_ref (cursor_sprite);
+    tracker->root_cursor = g_object_ref (cursor_sprite);
 
   sync_cursor (tracker);
 }
diff --git a/src/backends/meta-cursor.c b/src/backends/meta-cursor.c
index 65ea9cb..3c9d44d 100644
--- a/src/backends/meta-cursor.c
+++ b/src/backends/meta-cursor.c
@@ -43,14 +43,9 @@
 #include <cogl/cogl-wayland-server.h>
 #endif
 
-MetaCursorSprite *
-meta_cursor_sprite_ref (MetaCursorSprite *self)
-{
-  g_assert (self->ref_count > 0);
-  self->ref_count++;
+GType meta_cursor_sprite_get_type (void) G_GNUC_CONST;
 
-  return self;
-}
+G_DEFINE_TYPE (MetaCursorSprite, meta_cursor_sprite, G_TYPE_OBJECT)
 
 static void
 meta_cursor_image_free (MetaCursorImage *image)
@@ -64,24 +59,6 @@ meta_cursor_image_free (MetaCursorImage *image)
 #endif
 }
 
-static void
-meta_cursor_sprite_free (MetaCursorSprite *self)
-{
-  if (self->xcursor_images)
-    XcursorImagesDestroy (self->xcursor_images);
-  meta_cursor_image_free (&self->image);
-  g_slice_free (MetaCursorSprite, self);
-}
-
-void
-meta_cursor_sprite_unref (MetaCursorSprite *self)
-{
-  self->ref_count--;
-
-  if (self->ref_count == 0)
-    meta_cursor_sprite_free (self);
-}
-
 static const char *
 translate_meta_cursor (MetaCursor cursor)
 {
@@ -323,9 +300,30 @@ load_cursor_image (MetaCursorSprite *self)
 MetaCursorSprite *
 meta_cursor_sprite_from_theme (MetaCursor cursor)
 {
-  MetaCursorSprite *self = g_slice_new0 (MetaCursorSprite);
-  self->ref_count = 1;
+  MetaCursorSprite *self;
+
+  self = g_object_new (META_TYPE_CURSOR_SPRITE, NULL);
+
   self->cursor = cursor;
+
+  return self;
+}
+
+MetaCursorSprite *
+meta_cursor_sprite_from_texture (CoglTexture2D *texture,
+                                 int            hot_x,
+                                 int            hot_y)
+{
+  MetaCursorSprite *self;
+
+  self = g_object_new (META_TYPE_CURSOR_SPRITE, NULL);
+
+  cogl_object_ref (texture);
+
+  self->image.texture = texture;
+  self->image.hot_x = hot_x;
+  self->image.hot_y = hot_y;
+
   return self;
 }
 
@@ -426,8 +424,8 @@ meta_cursor_sprite_from_buffer (struct wl_resource *buffer,
 {
   MetaCursorSprite *self;
 
-  self = g_slice_new0 (MetaCursorSprite);
-  self->ref_count = 1;
+  self = g_object_new (META_TYPE_CURSOR_SPRITE, NULL);
+
   meta_cursor_image_load_from_buffer (&self->image, buffer, hot_x, hot_y);
 
   return self;
@@ -472,3 +470,28 @@ meta_cursor_sprite_get_meta_cursor (MetaCursorSprite *self)
 {
   return self->cursor;
 }
+
+static void
+meta_cursor_sprite_init (MetaCursorSprite *self)
+{
+}
+
+static void
+meta_cursor_sprite_finalize (GObject *object)
+{
+  MetaCursorSprite *self = META_CURSOR_SPRITE (object);
+
+  if (self->xcursor_images)
+    XcursorImagesDestroy (self->xcursor_images);
+  meta_cursor_image_free (&self->image);
+
+  G_OBJECT_CLASS (meta_cursor_sprite_parent_class)->finalize (object);
+}
+
+static void
+meta_cursor_sprite_class_init (MetaCursorSpriteClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = meta_cursor_sprite_finalize;
+}
diff --git a/src/backends/meta-cursor.h b/src/backends/meta-cursor.h
index bd20e8f..2001d1b 100644
--- a/src/backends/meta-cursor.h
+++ b/src/backends/meta-cursor.h
@@ -22,12 +22,15 @@
 #ifndef META_CURSOR_H
 #define META_CURSOR_H
 
+#include <meta/common.h>
+
 typedef struct _MetaCursorSprite MetaCursorSprite;
 
-MetaCursorSprite * meta_cursor_sprite_ref (MetaCursorSprite *self);
-void meta_cursor_sprite_unref (MetaCursorSprite *self);
-
-#include <meta/common.h>
+#define META_TYPE_CURSOR_SPRITE (meta_cursor_sprite_get_type ())
+G_DECLARE_FINAL_TYPE (MetaCursorSprite,
+                      meta_cursor_sprite,
+                      META, CURSOR_SPRITE,
+                      GObject);
 
 MetaCursorSprite * meta_cursor_sprite_from_theme  (MetaCursor          cursor);
 
@@ -40,6 +43,10 @@ MetaCursorSprite * meta_cursor_sprite_from_buffer (struct wl_resource *buffer,
 
 MetaCursor meta_cursor_sprite_get_meta_cursor (MetaCursorSprite *self);
 
+MetaCursorSprite * meta_cursor_sprite_from_texture (CoglTexture2D *texture,
+                                                    int            hot_x,
+                                                    int            hot_y);
+
 Cursor meta_cursor_create_x_cursor (Display    *xdisplay,
                                     MetaCursor  cursor);
 
diff --git a/src/core/screen.c b/src/core/screen.c
index c1ce6f2..c3d9686 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -1266,7 +1266,7 @@ meta_screen_update_cursor (MetaScreen *screen)
 
   cursor_sprite = meta_cursor_sprite_from_theme (cursor);
   meta_cursor_tracker_set_root_cursor (tracker, cursor_sprite);
-  meta_cursor_sprite_unref (cursor_sprite);
+  g_object_unref (cursor_sprite);
 
   /* Set a cursor for X11 applications that don't specify their own */
   xcursor = meta_display_create_x_cursor (display, cursor);
diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
index a2a045d..0f70b23 100644
--- a/src/wayland/meta-wayland-pointer.c
+++ b/src/wayland/meta-wayland-pointer.c
@@ -751,7 +751,7 @@ meta_wayland_pointer_update_cursor_surface (MetaWaylandPointer *pointer)
                                              cursor_sprite);
 
       if (cursor_sprite)
-        meta_cursor_sprite_unref (cursor_sprite);
+        g_object_unref (cursor_sprite);
     }
   else
     {


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