mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-26 13:41:07 +00:00
gdk: Add gdk_cursor_get_name()
Also add the GdkCursor::name property.
This commit is contained in:
parent
a1759a0a52
commit
8ba9ae6012
@ -813,6 +813,7 @@ gdk_cursor_new_from_pixbuf
|
||||
gdk_cursor_new_from_surface
|
||||
gdk_cursor_new_from_name
|
||||
gdk_cursor_get_display
|
||||
gdk_cursor_get_name
|
||||
gdk_cursor_get_image
|
||||
gdk_cursor_get_surface
|
||||
|
||||
|
@ -126,6 +126,7 @@ _gdk_broadway_display_get_cursor_for_name (GdkDisplay *display,
|
||||
|
||||
private = g_object_new (GDK_TYPE_BROADWAY_CURSOR,
|
||||
"display", display,
|
||||
"name", name,
|
||||
NULL);
|
||||
|
||||
return GDK_CURSOR (private);
|
||||
|
@ -65,7 +65,8 @@
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_DISPLAY
|
||||
PROP_DISPLAY,
|
||||
PROP_NAME
|
||||
};
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (GdkCursor, gdk_cursor, G_TYPE_OBJECT)
|
||||
@ -83,6 +84,9 @@ gdk_cursor_get_property (GObject *object,
|
||||
case PROP_DISPLAY:
|
||||
g_value_set_object (value, cursor->display);
|
||||
break;
|
||||
case PROP_NAME:
|
||||
g_value_set_string (value, cursor->name);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@ -104,12 +108,25 @@ gdk_cursor_set_property (GObject *object,
|
||||
/* check that implementations actually provide the display when constructing */
|
||||
g_assert (cursor->display != NULL);
|
||||
break;
|
||||
case PROP_NAME:
|
||||
cursor->name = g_value_dup_string (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_cursor_finalize (GObject *object)
|
||||
{
|
||||
GdkCursor *cursor = GDK_CURSOR (object);
|
||||
|
||||
g_free (cursor->name);
|
||||
|
||||
G_OBJECT_CLASS (gdk_cursor_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_cursor_class_init (GdkCursorClass *cursor_class)
|
||||
{
|
||||
@ -117,6 +134,7 @@ gdk_cursor_class_init (GdkCursorClass *cursor_class)
|
||||
|
||||
object_class->get_property = gdk_cursor_get_property;
|
||||
object_class->set_property = gdk_cursor_set_property;
|
||||
object_class->finalize = gdk_cursor_finalize;
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_DISPLAY,
|
||||
@ -125,6 +143,13 @@ gdk_cursor_class_init (GdkCursorClass *cursor_class)
|
||||
P_("Display of this cursor"),
|
||||
GDK_TYPE_DISPLAY,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_NAME,
|
||||
g_param_spec_string ("name",
|
||||
P_("Name"),
|
||||
P_("Name of this cursor"),
|
||||
NULL,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -189,6 +214,7 @@ gdk_cursor_new_from_name (GdkDisplay *display,
|
||||
const gchar *name)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
||||
g_return_val_if_fail (name != NULL, NULL);
|
||||
|
||||
return GDK_DISPLAY_GET_CLASS (display)->get_cursor_for_name (display, name);
|
||||
}
|
||||
@ -309,6 +335,7 @@ gdk_cursor_new_from_surface (GdkDisplay *display,
|
||||
return GDK_DISPLAY_GET_CLASS (display)->get_cursor_for_surface (display,
|
||||
surface, x, y);
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_cursor_get_display:
|
||||
* @cursor: a #GdkCursor.
|
||||
@ -319,7 +346,6 @@ gdk_cursor_new_from_surface (GdkDisplay *display,
|
||||
*
|
||||
* Since: 2.2
|
||||
*/
|
||||
|
||||
GdkDisplay *
|
||||
gdk_cursor_get_display (GdkCursor *cursor)
|
||||
{
|
||||
@ -328,6 +354,26 @@ gdk_cursor_get_display (GdkCursor *cursor)
|
||||
return cursor->display;
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_cursor_get_name:
|
||||
* @cursor: a #GdkCursor.
|
||||
*
|
||||
* Returns the name of the cursor. If the cursor is not a named cursor, %NULL
|
||||
* will be returned and the surface property will be set.
|
||||
*
|
||||
* Returns: (transfer none): the name of the cursor or %NULL if it is not
|
||||
* a named cursor
|
||||
*
|
||||
* Since: 3.94
|
||||
*/
|
||||
const char *
|
||||
gdk_cursor_get_name (GdkCursor *cursor)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_CURSOR (cursor), NULL);
|
||||
|
||||
return cursor->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_cursor_get_image:
|
||||
* @cursor: a #GdkCursor
|
||||
|
@ -60,6 +60,8 @@ GdkCursor* gdk_cursor_new_from_name (GdkDisplay *display,
|
||||
const gchar *name);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkDisplay* gdk_cursor_get_display (GdkCursor *cursor);
|
||||
GDK_AVAILABLE_IN_3_94
|
||||
const char *gdk_cursor_get_name (GdkCursor *cursor);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkPixbuf* gdk_cursor_get_image (GdkCursor *cursor);
|
||||
GDK_AVAILABLE_IN_3_10
|
||||
|
@ -40,6 +40,7 @@ struct _GdkCursor
|
||||
GObject parent_instance;
|
||||
|
||||
GdkDisplay *display;
|
||||
char *name;
|
||||
};
|
||||
|
||||
struct _GdkCursorClass
|
||||
|
@ -49,7 +49,6 @@ typedef struct _GdkWaylandCursorClass GdkWaylandCursorClass;
|
||||
struct _GdkWaylandCursor
|
||||
{
|
||||
GdkCursor cursor;
|
||||
gchar *name;
|
||||
|
||||
struct
|
||||
{
|
||||
@ -144,22 +143,25 @@ _gdk_wayland_cursor_update (GdkWaylandDisplay *display_wayland,
|
||||
{
|
||||
struct wl_cursor *c;
|
||||
struct wl_cursor_theme *theme;
|
||||
const char *name;
|
||||
|
||||
name = gdk_cursor_get_name (GDK_CURSOR (cursor));
|
||||
|
||||
/* Do nothing if this is not a wl_cursor cursor. */
|
||||
if (cursor->name == NULL)
|
||||
if (name == NULL)
|
||||
return FALSE;
|
||||
|
||||
theme = _gdk_wayland_display_get_scaled_cursor_theme (display_wayland,
|
||||
cursor->scale);
|
||||
c = wl_cursor_theme_get_cursor (theme, cursor->name);
|
||||
c = wl_cursor_theme_get_cursor (theme, name);
|
||||
if (!c)
|
||||
{
|
||||
const char *fallback;
|
||||
|
||||
fallback = name_fallback (cursor->name);
|
||||
fallback = name_fallback (name);
|
||||
if (fallback)
|
||||
{
|
||||
c = wl_cursor_theme_get_cursor (theme, name_fallback (cursor->name));
|
||||
c = wl_cursor_theme_get_cursor (theme, fallback);
|
||||
if (!c)
|
||||
c = wl_cursor_theme_get_cursor (theme, "left_ptr");
|
||||
}
|
||||
@ -167,7 +169,7 @@ _gdk_wayland_cursor_update (GdkWaylandDisplay *display_wayland,
|
||||
|
||||
if (!c)
|
||||
{
|
||||
g_message ("Unable to load %s from the cursor theme", cursor->name);
|
||||
g_message ("Unable to load %s from the cursor theme", name);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -194,7 +196,6 @@ gdk_wayland_cursor_finalize (GObject *object)
|
||||
{
|
||||
GdkWaylandCursor *cursor = GDK_WAYLAND_CURSOR (object);
|
||||
|
||||
g_free (cursor->name);
|
||||
if (cursor->surface.cairo_surface)
|
||||
cairo_surface_destroy (cursor->surface.cairo_surface);
|
||||
|
||||
@ -243,7 +244,7 @@ _gdk_wayland_cursor_get_buffer (GdkCursor *cursor,
|
||||
|
||||
return wl_cursor_image_get_buffer (image);
|
||||
}
|
||||
else if (wayland_cursor->name == NULL) /* From surface */
|
||||
else if (gdk_cursor_get_name (cursor) == NULL) /* From surface */
|
||||
{
|
||||
*hotspot_x =
|
||||
wayland_cursor->surface.hotspot_x / wayland_cursor->surface.scale;
|
||||
@ -309,7 +310,7 @@ _gdk_wayland_cursor_set_scale (GdkCursor *cursor,
|
||||
wayland_cursor->scale = scale;
|
||||
|
||||
/* Blank cursor case */
|
||||
if (g_strcmp0 (wayland_cursor->name, "none") == 0)
|
||||
if (g_strcmp0 (gdk_cursor_get_name (cursor), "none") == 0)
|
||||
return;
|
||||
|
||||
_gdk_wayland_cursor_update (display_wayland, wayland_cursor);
|
||||
@ -347,18 +348,17 @@ _gdk_wayland_display_get_cursor_for_name_with_scale (GdkDisplay *display,
|
||||
|
||||
private = g_object_new (GDK_TYPE_WAYLAND_CURSOR,
|
||||
"display", display,
|
||||
"name", name,
|
||||
NULL);
|
||||
|
||||
/* Blank cursor case */
|
||||
if (!name || g_str_equal (name, "none") || g_str_equal (name, "blank_cursor"))
|
||||
if (g_str_equal (name, "none") || g_str_equal (name, "blank_cursor"))
|
||||
{
|
||||
private->name = g_strdup ("none");
|
||||
private->scale = scale;
|
||||
|
||||
return GDK_CURSOR (private);
|
||||
}
|
||||
|
||||
private->name = g_strdup (name);
|
||||
private->scale = scale;
|
||||
|
||||
if (!_gdk_wayland_cursor_update (display_wayland, private))
|
||||
@ -369,7 +369,7 @@ _gdk_wayland_display_get_cursor_for_name_with_scale (GdkDisplay *display,
|
||||
|
||||
/* Insert into cache. */
|
||||
g_hash_table_insert (display_wayland->cursor_cache,
|
||||
private->name,
|
||||
(gpointer) gdk_cursor_get_name (GDK_CURSOR (private)),
|
||||
g_object_ref (private));
|
||||
return GDK_CURSOR (private);
|
||||
}
|
||||
@ -408,7 +408,6 @@ _gdk_wayland_display_get_cursor_for_surface (GdkDisplay *display,
|
||||
cursor = g_object_new (GDK_TYPE_WAYLAND_CURSOR,
|
||||
"display", display_wayland,
|
||||
NULL);
|
||||
cursor->name = NULL;
|
||||
cursor->surface.hotspot_x = x;
|
||||
cursor->surface.hotspot_y = y;
|
||||
|
||||
|
@ -50,7 +50,6 @@ struct _GdkX11Cursor
|
||||
GdkCursor cursor;
|
||||
|
||||
Cursor xcursor;
|
||||
gchar *name;
|
||||
guint serial;
|
||||
};
|
||||
|
||||
@ -103,7 +102,7 @@ cache_compare_func (gconstpointer listelem,
|
||||
/* Elements marked as pixmap must be named cursors
|
||||
* (since we don't store normal pixmap cursors
|
||||
*/
|
||||
return strcmp (key->name, cursor->name);
|
||||
return strcmp (key->name, gdk_cursor_get_name (GDK_CURSOR (cursor)));
|
||||
}
|
||||
|
||||
/* Returns the cursor if there is a match, NULL if not
|
||||
@ -175,8 +174,6 @@ gdk_x11_cursor_finalize (GObject *object)
|
||||
if (private->xcursor && !gdk_display_is_closed (display))
|
||||
XFreeCursor (GDK_DISPLAY_XDISPLAY (display), private->xcursor);
|
||||
|
||||
g_free (private->name);
|
||||
|
||||
G_OBJECT_CLASS (gdk_x11_cursor_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
@ -269,24 +266,23 @@ gdk_x11_cursor_get_surface (GdkCursor *cursor,
|
||||
{
|
||||
GdkDisplay *display;
|
||||
Display *xdisplay;
|
||||
GdkX11Cursor *private;
|
||||
XcursorImages *images;
|
||||
XcursorImage *image;
|
||||
gint size;
|
||||
cairo_surface_t *surface;
|
||||
gint scale;
|
||||
gchar *theme;
|
||||
const char *name;
|
||||
|
||||
private = GDK_X11_CURSOR (cursor);
|
||||
|
||||
display = gdk_cursor_get_display (cursor);
|
||||
xdisplay = GDK_DISPLAY_XDISPLAY (display);
|
||||
|
||||
size = XcursorGetDefaultSize (xdisplay);
|
||||
theme = XcursorGetTheme (xdisplay);
|
||||
|
||||
if (private->name)
|
||||
images = XcursorLibraryLoadImages (private->name, theme, size);
|
||||
name = gdk_cursor_get_name (cursor);
|
||||
if (name)
|
||||
images = XcursorLibraryLoadImages (name, theme, size);
|
||||
else
|
||||
images = NULL;
|
||||
|
||||
@ -343,8 +339,11 @@ _gdk_x11_cursor_update_theme (GdkCursor *cursor)
|
||||
|
||||
if (private->xcursor != None)
|
||||
{
|
||||
if (private->name)
|
||||
new_cursor = XcursorLibraryLoadCursor (xdisplay, private->name);
|
||||
const char *name;
|
||||
|
||||
name = gdk_cursor_get_name (cursor);
|
||||
if (name)
|
||||
new_cursor = XcursorLibraryLoadCursor (xdisplay, name);
|
||||
|
||||
if (new_cursor != None)
|
||||
{
|
||||
@ -532,7 +531,6 @@ _gdk_x11_display_get_cursor_for_surface (GdkDisplay *display,
|
||||
"display", display,
|
||||
NULL);
|
||||
private->xcursor = xcursor;
|
||||
private->name = NULL;
|
||||
private->serial = theme_serial;
|
||||
|
||||
return GDK_CURSOR (private);
|
||||
@ -644,9 +642,9 @@ _gdk_x11_display_get_cursor_for_name (GdkDisplay *display,
|
||||
|
||||
private = g_object_new (GDK_TYPE_X11_CURSOR,
|
||||
"display", display,
|
||||
"name", name,
|
||||
NULL);
|
||||
private->xcursor = xcursor;
|
||||
private->name = g_strdup (name);
|
||||
private->serial = theme_serial;
|
||||
|
||||
add_to_cache (private);
|
||||
@ -709,7 +707,6 @@ gdk_cursor_new_from_pixmap (GdkDisplay *display,
|
||||
"display", display,
|
||||
NULL);
|
||||
private->xcursor = xcursor;
|
||||
private->name = NULL;
|
||||
private->serial = theme_serial;
|
||||
|
||||
return GDK_CURSOR (private);
|
||||
|
Loading…
Reference in New Issue
Block a user