mirror of
https://github.com/brl/mutter.git
synced 2025-03-28 22:23:47 +00:00
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
This commit is contained in:
parent
4b667d1e09
commit
b01f95cfdd
@ -31,7 +31,8 @@
|
|||||||
#include <gbm.h>
|
#include <gbm.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
CoglTexture2D *texture;
|
CoglTexture2D *texture;
|
||||||
int hot_x, hot_y;
|
int hot_x, hot_y;
|
||||||
|
|
||||||
@ -40,8 +41,9 @@ typedef struct {
|
|||||||
#endif
|
#endif
|
||||||
} MetaCursorImage;
|
} MetaCursorImage;
|
||||||
|
|
||||||
struct _MetaCursorSprite {
|
struct _MetaCursorSprite
|
||||||
int ref_count;
|
{
|
||||||
|
GObject parent;
|
||||||
|
|
||||||
int current_frame;
|
int current_frame;
|
||||||
XcursorImages *xcursor_images;
|
XcursorImages *xcursor_images;
|
||||||
|
@ -85,9 +85,9 @@ sync_cursor (MetaCursorTracker *tracker)
|
|||||||
if (tracker->displayed_cursor == displayed_cursor)
|
if (tracker->displayed_cursor == displayed_cursor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_clear_pointer (&tracker->displayed_cursor, meta_cursor_sprite_unref);
|
g_clear_object (&tracker->displayed_cursor);
|
||||||
if (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);
|
update_displayed_cursor (tracker);
|
||||||
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
||||||
@ -108,9 +108,9 @@ meta_cursor_tracker_finalize (GObject *object)
|
|||||||
MetaCursorTracker *self = META_CURSOR_TRACKER (object);
|
MetaCursorTracker *self = META_CURSOR_TRACKER (object);
|
||||||
|
|
||||||
if (self->displayed_cursor)
|
if (self->displayed_cursor)
|
||||||
meta_cursor_sprite_unref (self->displayed_cursor);
|
g_object_unref (self->displayed_cursor);
|
||||||
if (self->root_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);
|
G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@ -160,9 +160,9 @@ set_window_cursor (MetaCursorTracker *tracker,
|
|||||||
gboolean has_cursor,
|
gboolean has_cursor,
|
||||||
MetaCursorSprite *cursor_sprite)
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
g_clear_pointer (&tracker->window_cursor, meta_cursor_sprite_unref);
|
g_clear_object (&tracker->window_cursor);
|
||||||
if (cursor_sprite)
|
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;
|
tracker->has_window_cursor = has_cursor;
|
||||||
sync_cursor (tracker);
|
sync_cursor (tracker);
|
||||||
}
|
}
|
||||||
@ -184,28 +184,12 @@ meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
|
|||||||
if (notify_event->subtype != XFixesDisplayCursorNotify)
|
if (notify_event->subtype != XFixesDisplayCursorNotify)
|
||||||
return FALSE;
|
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);
|
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
||||||
|
|
||||||
return TRUE;
|
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
|
static void
|
||||||
ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
||||||
{
|
{
|
||||||
@ -264,9 +248,10 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
|||||||
if (sprite != NULL)
|
if (sprite != NULL)
|
||||||
{
|
{
|
||||||
MetaCursorSprite *cursor_sprite =
|
MetaCursorSprite *cursor_sprite =
|
||||||
meta_cursor_sprite_take_texture (sprite,
|
meta_cursor_sprite_from_texture (sprite,
|
||||||
cursor_image->xhot,
|
cursor_image->xhot,
|
||||||
cursor_image->yhot);
|
cursor_image->yhot);
|
||||||
|
cogl_object_unref (sprite);
|
||||||
tracker->xfixes_cursor = cursor_sprite;
|
tracker->xfixes_cursor = cursor_sprite;
|
||||||
}
|
}
|
||||||
XFree (cursor_image);
|
XFree (cursor_image);
|
||||||
@ -354,9 +339,9 @@ void
|
|||||||
meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
|
meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
|
||||||
MetaCursorSprite *cursor_sprite)
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
g_clear_pointer (&tracker->root_cursor, meta_cursor_sprite_unref);
|
g_clear_object (&tracker->root_cursor);
|
||||||
if (cursor_sprite)
|
if (cursor_sprite)
|
||||||
tracker->root_cursor = meta_cursor_sprite_ref (cursor_sprite);
|
tracker->root_cursor = g_object_ref (cursor_sprite);
|
||||||
|
|
||||||
sync_cursor (tracker);
|
sync_cursor (tracker);
|
||||||
}
|
}
|
||||||
|
@ -43,14 +43,9 @@
|
|||||||
#include <cogl/cogl-wayland-server.h>
|
#include <cogl/cogl-wayland-server.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MetaCursorSprite *
|
GType meta_cursor_sprite_get_type (void) G_GNUC_CONST;
|
||||||
meta_cursor_sprite_ref (MetaCursorSprite *self)
|
|
||||||
{
|
|
||||||
g_assert (self->ref_count > 0);
|
|
||||||
self->ref_count++;
|
|
||||||
|
|
||||||
return self;
|
G_DEFINE_TYPE (MetaCursorSprite, meta_cursor_sprite, G_TYPE_OBJECT)
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_cursor_image_free (MetaCursorImage *image)
|
meta_cursor_image_free (MetaCursorImage *image)
|
||||||
@ -64,24 +59,6 @@ meta_cursor_image_free (MetaCursorImage *image)
|
|||||||
#endif
|
#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 *
|
static const char *
|
||||||
translate_meta_cursor (MetaCursor cursor)
|
translate_meta_cursor (MetaCursor cursor)
|
||||||
{
|
{
|
||||||
@ -323,9 +300,30 @@ load_cursor_image (MetaCursorSprite *self)
|
|||||||
MetaCursorSprite *
|
MetaCursorSprite *
|
||||||
meta_cursor_sprite_from_theme (MetaCursor cursor)
|
meta_cursor_sprite_from_theme (MetaCursor cursor)
|
||||||
{
|
{
|
||||||
MetaCursorSprite *self = g_slice_new0 (MetaCursorSprite);
|
MetaCursorSprite *self;
|
||||||
self->ref_count = 1;
|
|
||||||
|
self = g_object_new (META_TYPE_CURSOR_SPRITE, NULL);
|
||||||
|
|
||||||
self->cursor = cursor;
|
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;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,8 +424,8 @@ meta_cursor_sprite_from_buffer (struct wl_resource *buffer,
|
|||||||
{
|
{
|
||||||
MetaCursorSprite *self;
|
MetaCursorSprite *self;
|
||||||
|
|
||||||
self = g_slice_new0 (MetaCursorSprite);
|
self = g_object_new (META_TYPE_CURSOR_SPRITE, NULL);
|
||||||
self->ref_count = 1;
|
|
||||||
meta_cursor_image_load_from_buffer (&self->image, buffer, hot_x, hot_y);
|
meta_cursor_image_load_from_buffer (&self->image, buffer, hot_x, hot_y);
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
@ -472,3 +470,28 @@ meta_cursor_sprite_get_meta_cursor (MetaCursorSprite *self)
|
|||||||
{
|
{
|
||||||
return self->cursor;
|
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;
|
||||||
|
}
|
||||||
|
@ -22,12 +22,15 @@
|
|||||||
#ifndef META_CURSOR_H
|
#ifndef META_CURSOR_H
|
||||||
#define META_CURSOR_H
|
#define META_CURSOR_H
|
||||||
|
|
||||||
|
#include <meta/common.h>
|
||||||
|
|
||||||
typedef struct _MetaCursorSprite MetaCursorSprite;
|
typedef struct _MetaCursorSprite MetaCursorSprite;
|
||||||
|
|
||||||
MetaCursorSprite * meta_cursor_sprite_ref (MetaCursorSprite *self);
|
#define META_TYPE_CURSOR_SPRITE (meta_cursor_sprite_get_type ())
|
||||||
void meta_cursor_sprite_unref (MetaCursorSprite *self);
|
G_DECLARE_FINAL_TYPE (MetaCursorSprite,
|
||||||
|
meta_cursor_sprite,
|
||||||
#include <meta/common.h>
|
META, CURSOR_SPRITE,
|
||||||
|
GObject);
|
||||||
|
|
||||||
MetaCursorSprite * meta_cursor_sprite_from_theme (MetaCursor cursor);
|
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);
|
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,
|
Cursor meta_cursor_create_x_cursor (Display *xdisplay,
|
||||||
MetaCursor cursor);
|
MetaCursor cursor);
|
||||||
|
|
||||||
|
@ -1266,7 +1266,7 @@ meta_screen_update_cursor (MetaScreen *screen)
|
|||||||
|
|
||||||
cursor_sprite = meta_cursor_sprite_from_theme (cursor);
|
cursor_sprite = meta_cursor_sprite_from_theme (cursor);
|
||||||
meta_cursor_tracker_set_root_cursor (tracker, cursor_sprite);
|
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 */
|
/* Set a cursor for X11 applications that don't specify their own */
|
||||||
xcursor = meta_display_create_x_cursor (display, cursor);
|
xcursor = meta_display_create_x_cursor (display, cursor);
|
||||||
|
@ -751,7 +751,7 @@ meta_wayland_pointer_update_cursor_surface (MetaWaylandPointer *pointer)
|
|||||||
cursor_sprite);
|
cursor_sprite);
|
||||||
|
|
||||||
if (cursor_sprite)
|
if (cursor_sprite)
|
||||||
meta_cursor_sprite_unref (cursor_sprite);
|
g_object_unref (cursor_sprite);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user