diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2015-03-10 14:35:49 +0800 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2015-08-28 09:52:30 +0800 |
commit | b01f95cfdd1c6c5e3e504e8ebac84693f0954a18 (patch) | |
tree | 2228120cd344c0f0895ad47a5c73159dc2b55a6e | |
parent | 4b667d1e09dd1b75e0e2945ad2a4ee659b7ee3e8 (diff) | |
download | mutter-b01f95cfdd1c6c5e3e504e8ebac84693f0954a18.tar.gz |
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
-rw-r--r-- | src/backends/meta-cursor-private.h | 8 | ||||
-rw-r--r-- | src/backends/meta-cursor-tracker.c | 37 | ||||
-rw-r--r-- | src/backends/meta-cursor.c | 81 | ||||
-rw-r--r-- | src/backends/meta-cursor.h | 15 | ||||
-rw-r--r-- | src/core/screen.c | 2 | ||||
-rw-r--r-- | 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 b936c0181..311346425 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 887341096..bd61efc5a 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 65ea9cbf9..3c9d44df4 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 bd20e8fa0..2001d1b87 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 c1ce6f269..c3d968619 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 a2a045d6b..0f70b23ce 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 { |