[gtk+] cursor: Turn new_from_surface() into new_from_texture()
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] cursor: Turn new_from_surface() into new_from_texture()
- Date: Fri, 3 Nov 2017 23:26:05 +0000 (UTC)
commit 5adf21a17d7674ef4a8b39575d05570d7fe55fbc
Author: Benjamin Otte <otte redhat com>
Date: Fri Nov 3 01:59:15 2017 +0100
cursor: Turn new_from_surface() into new_from_texture()
Also turn all the arguments into read-only properties on the GdkCursor
object.
docs/reference/gdk/gdk4-sections.txt | 3 +
gdk/broadway/gdkcursor-broadway.c | 11 ++-
gdk/broadway/gdkdisplay-broadway.c | 2 +-
gdk/broadway/gdkprivate-broadway.h | 8 +-
gdk/gdkcursor.c | 165 +++++++++++++++++++++++++++++-----
gdk/gdkcursor.h | 16 +++-
gdk/gdkcursorprivate.h | 3 +
gdk/gdkdisplayprivate.h | 8 +-
gdk/wayland/gdkcursor-wayland.c | 46 +++-------
gdk/wayland/gdkdisplay-wayland.c | 2 +-
gdk/wayland/gdkprivate-wayland.h | 8 +-
gdk/x11/gdkcursor-x11.c | 70 ++++-----------
gdk/x11/gdkdisplay-x11.c | 2 +-
gdk/x11/gdkprivate-x11.h | 8 +-
14 files changed, 219 insertions(+), 133 deletions(-)
---
diff --git a/docs/reference/gdk/gdk4-sections.txt b/docs/reference/gdk/gdk4-sections.txt
index ba5f6c0..76a3560 100644
--- a/docs/reference/gdk/gdk4-sections.txt
+++ b/docs/reference/gdk/gdk4-sections.txt
@@ -829,6 +829,9 @@ gdk_cursor_new_from_surface
gdk_cursor_new_from_name
gdk_cursor_get_display
gdk_cursor_get_name
+gdk_cursor_get_hotspot_x
+gdk_cursor_get_hotspot_y
+gdk_cursor_get_texture
<SUBSECTION Standard>
GDK_TYPE_CURSOR_TYPE
diff --git a/gdk/broadway/gdkcursor-broadway.c b/gdk/broadway/gdkcursor-broadway.c
index bf40d29..86911e3 100644
--- a/gdk/broadway/gdkcursor-broadway.c
+++ b/gdk/broadway/gdkcursor-broadway.c
@@ -76,16 +76,19 @@ _gdk_broadway_cursor_update_theme (GdkCursor *cursor)
}
GdkCursor *
-_gdk_broadway_display_get_cursor_for_surface (GdkDisplay *display,
- cairo_surface_t *surface,
- gdouble x,
- gdouble y)
+_gdk_broadway_display_get_cursor_for_texture (GdkDisplay *display,
+ GdkTexture *texture,
+ int x,
+ int y)
{
GdkBroadwayCursor *private;
GdkCursor *cursor;
private = g_object_new (GDK_TYPE_BROADWAY_CURSOR,
"display", display,
+ "texture", texture,
+ "x", x,
+ "y", y,
NULL);
cursor = (GdkCursor *) private;
diff --git a/gdk/broadway/gdkdisplay-broadway.c b/gdk/broadway/gdkdisplay-broadway.c
index 78db641..e02e1e3 100644
--- a/gdk/broadway/gdkdisplay-broadway.c
+++ b/gdk/broadway/gdkdisplay-broadway.c
@@ -359,7 +359,7 @@ gdk_broadway_display_class_init (GdkBroadwayDisplayClass * class)
display_class->supports_shapes = gdk_broadway_display_supports_shapes;
display_class->supports_input_shapes = gdk_broadway_display_supports_input_shapes;
display_class->get_cursor_for_name = _gdk_broadway_display_get_cursor_for_name;
- display_class->get_cursor_for_surface = _gdk_broadway_display_get_cursor_for_surface;
+ display_class->get_cursor_for_texture = _gdk_broadway_display_get_cursor_for_texture;
display_class->get_default_cursor_size = _gdk_broadway_display_get_default_cursor_size;
display_class->get_maximal_cursor_size = _gdk_broadway_display_get_maximal_cursor_size;
display_class->supports_cursor_alpha = _gdk_broadway_display_supports_cursor_alpha;
diff --git a/gdk/broadway/gdkprivate-broadway.h b/gdk/broadway/gdkprivate-broadway.h
index d994ab7..4b1ee65 100644
--- a/gdk/broadway/gdkprivate-broadway.h
+++ b/gdk/broadway/gdkprivate-broadway.h
@@ -101,10 +101,10 @@ GdkDragProtocol _gdk_broadway_window_get_drag_protocol (GdkWindow *window,
GdkWindow **target);
GdkCursor*_gdk_broadway_display_get_cursor_for_name (GdkDisplay *display,
const gchar *name);
-GdkCursor *_gdk_broadway_display_get_cursor_for_surface (GdkDisplay *display,
- cairo_surface_t *surface,
- gdouble x,
- gdouble y);
+GdkCursor *_gdk_broadway_display_get_cursor_for_texture (GdkDisplay *display,
+ GdkTexture *texture,
+ int x,
+ int y);
gboolean _gdk_broadway_display_supports_cursor_alpha (GdkDisplay *display);
gboolean _gdk_broadway_display_supports_cursor_color (GdkDisplay *display);
void _gdk_broadway_display_get_default_cursor_size (GdkDisplay *display,
diff --git a/gdk/gdkcursor.c b/gdk/gdkcursor.c
index 868ee15..e4d27fd 100644
--- a/gdk/gdkcursor.c
+++ b/gdk/gdkcursor.c
@@ -66,7 +66,10 @@
enum {
PROP_0,
PROP_DISPLAY,
- PROP_NAME
+ PROP_HOTSPOT_X,
+ PROP_HOTSPOT_Y,
+ PROP_NAME,
+ PROP_TEXTURE,
};
G_DEFINE_ABSTRACT_TYPE (GdkCursor, gdk_cursor, G_TYPE_OBJECT)
@@ -84,9 +87,18 @@ gdk_cursor_get_property (GObject *object,
case PROP_DISPLAY:
g_value_set_object (value, cursor->display);
break;
+ case PROP_HOTSPOT_X:
+ g_value_set_int (value, cursor->hotspot_x);
+ break;
+ case PROP_HOTSPOT_Y:
+ g_value_set_int (value, cursor->hotspot_y);
+ break;
case PROP_NAME:
g_value_set_string (value, cursor->name);
break;
+ case PROP_TEXTURE:
+ g_value_set_object (value, cursor->texture);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -108,9 +120,18 @@ gdk_cursor_set_property (GObject *object,
/* check that implementations actually provide the display when constructing */
g_assert (cursor->display != NULL);
break;
+ case PROP_HOTSPOT_X:
+ cursor->hotspot_x = g_value_get_int (value);
+ break;
+ case PROP_HOTSPOT_Y:
+ cursor->hotspot_y = g_value_get_int (value);
+ break;
case PROP_NAME:
cursor->name = g_value_dup_string (value);
break;
+ case PROP_TEXTURE:
+ cursor->texture = g_value_dup_object (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -123,6 +144,7 @@ gdk_cursor_finalize (GObject *object)
GdkCursor *cursor = GDK_CURSOR (object);
g_free (cursor->name);
+ g_clear_object (&cursor->texture);
G_OBJECT_CLASS (gdk_cursor_parent_class)->finalize (object);
}
@@ -144,12 +166,33 @@ gdk_cursor_class_init (GdkCursorClass *cursor_class)
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
+ PROP_HOTSPOT_X,
+ g_param_spec_int ("hotspot-x",
+ P_("Hotspot X"),
+ P_("Horizontal offset of the cursor hotspot"),
+ 0, G_MAXINT, 0,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
+ PROP_HOTSPOT_Y,
+ g_param_spec_int ("hotspot-y",
+ P_("Hotspot Y"),
+ P_("Vertical offset of the cursor hotspot"),
+ 0, G_MAXINT, 0,
+ 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));
+ g_object_class_install_property (object_class,
+ PROP_TEXTURE,
+ g_param_spec_object ("texture",
+ P_("Texture"),
+ P_("The texture displayed by this cursor"),
+ GDK_TYPE_TEXTURE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
static void
@@ -255,7 +298,7 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display,
gint x,
gint y)
{
- cairo_surface_t *surface;
+ GdkTexture *texture;
const char *option;
char *end;
gint64 value;
@@ -286,23 +329,23 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display,
y = (gint) value;
}
- surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, 1, NULL);
+ texture = gdk_texture_new_for_pixbuf (pixbuf);
- cursor = GDK_DISPLAY_GET_CLASS (display)->get_cursor_for_surface (display, surface, x, y);
+ cursor = gdk_cursor_new_from_texture (display, texture, x, y);
- cairo_surface_destroy (surface);
+ g_object_unref (texture);
return cursor;
}
/**
- * gdk_cursor_new_from_surface:
+ * gdk_cursor_new_from_texture:
* @display: the #GdkDisplay for which the cursor will be created
- * @surface: the cairo image surface containing the cursor pixel data
- * @x: the horizontal offset of the “hotspot” of the cursor
- * @y: the vertical offset of the “hotspot” of the cursor
+ * @texture: the texture providing the pixel data
+ * @hotspot_x: the horizontal offset of the “hotspot” of the cursor
+ * @hotspot_y: the vertical offset of the “hotspot” of the cursor
*
- * Creates a new cursor from a cairo image surface.
+ * Creates a new cursor from a #GdkTexture.
*
* Not all GDK backends support RGBA cursors. If they are not
* supported, a monochrome approximation will be displayed.
@@ -318,22 +361,22 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display,
*
* Returns: a new #GdkCursor.
*
- * Since: 3.10
+ * Since: 3.94
*/
GdkCursor *
-gdk_cursor_new_from_surface (GdkDisplay *display,
- cairo_surface_t *surface,
- gdouble x,
- gdouble y)
+gdk_cursor_new_from_texture (GdkDisplay *display,
+ GdkTexture *texture,
+ int hotspot_x,
+ int hotspot_y)
{
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
- g_return_val_if_fail (surface != NULL, NULL);
- g_return_val_if_fail (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_IMAGE, NULL);
- g_return_val_if_fail (0 <= x && x < cairo_image_surface_get_width (surface), NULL);
- g_return_val_if_fail (0 <= y && y < cairo_image_surface_get_height (surface), NULL);
+ g_return_val_if_fail (GDK_IS_TEXTURE (texture), NULL);
+ g_return_val_if_fail (0 <= hotspot_x && hotspot_x < gdk_texture_get_width (texture), NULL);
+ g_return_val_if_fail (0 <= hotspot_y && hotspot_y < gdk_texture_get_height (texture), NULL);
- return GDK_DISPLAY_GET_CLASS (display)->get_cursor_for_surface (display,
- surface, x, y);
+ return GDK_DISPLAY_GET_CLASS (display)->get_cursor_for_texture (display,
+ texture,
+ hotspot_x, hotspot_y);
}
/**
@@ -359,7 +402,7 @@ gdk_cursor_get_display (GdkCursor *cursor)
* @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.
+ * will be returned and the GdkCursor::texture property will be set.
*
* Returns: (transfer none): the name of the cursor or %NULL if it is not
* a named cursor
@@ -374,3 +417,81 @@ gdk_cursor_get_name (GdkCursor *cursor)
return cursor->name;
}
+/**
+ * gdk_cursor_get_texture:
+ * @cursor: a #GdkCursor.
+ *
+ * Returns the texture shown by the cursor. If the cursor is a named cursor,
+ * %NULL will be returned and the GdkCursor::name property will be set.
+ *
+ * Returns: (transfer none): the texture of the cursor or %NULL if it is
+ * a named cursor
+ *
+ * Since: 3.94
+ */
+GdkTexture *
+gdk_cursor_get_texture (GdkCursor *cursor)
+{
+ g_return_val_if_fail (GDK_IS_CURSOR (cursor), NULL);
+
+ return cursor->texture;
+}
+
+/**
+ * gdk_cursor_get_texture:
+ * @cursor: a #GdkCursor.
+ *
+ * Returns the texture for the cursor. If the cursor is a named cursor, %NULL
+ * will be returned and the GdkCursor::name property will be set.
+ *
+ * Returns: (transfer none): the texture for cursor or %NULL if it is a
+ * named cursor
+ *
+ * Since: 3.94
+ */
+GdkTexture *
+gdk_cursor_get_texture (GdkCursor *cursor)
+{
+ g_return_val_if_fail (GDK_IS_CURSOR (cursor), NULL);
+
+ return cursor->texture;
+}
+
+/**
+ * gdk_cursor_get_hotspot_x:
+ * @cursor: a #GdkCursor.
+ *
+ * Returns the horizontal offset of the hotspot. The hotspot indicates the
+ * pixel that will be directly above the cursor.
+ *
+ * Returns: the horizontal offset of the hotspot or 0 for named cursors
+ *
+ * Since: 3.94
+ */
+int
+gdk_cursor_get_hotspot_x (GdkCursor *cursor)
+{
+ g_return_val_if_fail (GDK_IS_CURSOR (cursor), 0);
+
+ return cursor->hotspot_x;
+}
+
+/**
+ * gdk_cursor_get_hotspot_y:
+ * @cursor: a #GdkCursor.
+ *
+ * Returns the vertical offset of the hotspot. The hotspot indicates the
+ * pixel that will be directly above the cursor.
+ *
+ * Returns: the vertical offset of the hotspot or 0 for named cursors
+ *
+ * Since: 3.94
+ */
+int
+gdk_cursor_get_hotspot_y (GdkCursor *cursor)
+{
+ g_return_val_if_fail (GDK_IS_CURSOR (cursor), 0);
+
+ return cursor->hotspot_y;
+}
+
diff --git a/gdk/gdkcursor.h b/gdk/gdkcursor.h
index a36e94e..5491f81 100644
--- a/gdk/gdkcursor.h
+++ b/gdk/gdkcursor.h
@@ -50,11 +50,11 @@ GdkCursor* gdk_cursor_new_from_pixbuf (GdkDisplay *display,
GdkPixbuf *pixbuf,
gint x,
gint y);
-GDK_AVAILABLE_IN_3_10
-GdkCursor* gdk_cursor_new_from_surface (GdkDisplay *display,
- cairo_surface_t *surface,
- gdouble x,
- gdouble y);
+GDK_AVAILABLE_IN_3_94
+GdkCursor* gdk_cursor_new_from_texture (GdkDisplay *display,
+ GdkTexture *texture,
+ int hotspot_x,
+ int hotspot_y);
GDK_AVAILABLE_IN_ALL
GdkCursor* gdk_cursor_new_from_name (GdkDisplay *display,
const gchar *name);
@@ -62,6 +62,12 @@ 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_3_94
+GdkTexture *gdk_cursor_get_texture (GdkCursor *cursor);
+GDK_AVAILABLE_IN_3_94
+int gdk_cursor_get_hotspot_x (GdkCursor *cursor);
+GDK_AVAILABLE_IN_3_94
+int gdk_cursor_get_hotspot_y (GdkCursor *cursor);
G_END_DECLS
diff --git a/gdk/gdkcursorprivate.h b/gdk/gdkcursorprivate.h
index 34f58b0..6164aba 100644
--- a/gdk/gdkcursorprivate.h
+++ b/gdk/gdkcursorprivate.h
@@ -41,6 +41,9 @@ struct _GdkCursor
GdkDisplay *display;
char *name;
+ GdkTexture *texture;
+ int hotspot_x;
+ int hotspot_y;
};
struct _GdkCursorClass
diff --git a/gdk/gdkdisplayprivate.h b/gdk/gdkdisplayprivate.h
index 3da44a2..208a7a4 100644
--- a/gdk/gdkdisplayprivate.h
+++ b/gdk/gdkdisplayprivate.h
@@ -147,10 +147,10 @@ struct _GdkDisplayClass
guint *height);
GdkCursor * (*get_cursor_for_name) (GdkDisplay *display,
const gchar *name);
- GdkCursor * (*get_cursor_for_surface) (GdkDisplay *display,
- cairo_surface_t *surface,
- gdouble x,
- gdouble y);
+ GdkCursor * (*get_cursor_for_texture) (GdkDisplay *display,
+ GdkTexture *texture,
+ int x,
+ int y);
GdkAppLaunchContext * (*get_app_launch_context) (GdkDisplay *display);
diff --git a/gdk/wayland/gdkcursor-wayland.c b/gdk/wayland/gdkcursor-wayland.c
index 1cdbdbe..005175c 100644
--- a/gdk/wayland/gdkcursor-wayland.c
+++ b/gdk/wayland/gdkcursor-wayland.c
@@ -52,7 +52,6 @@ struct _GdkWaylandCursor
struct
{
- int hotspot_x, hotspot_y;
int width, height, scale;
cairo_surface_t *cairo_surface;
} surface;
@@ -239,9 +238,9 @@ _gdk_wayland_cursor_get_buffer (GdkCursor *cursor,
else if (gdk_cursor_get_name (cursor) == NULL) /* From surface */
{
*hotspot_x =
- wayland_cursor->surface.hotspot_x / wayland_cursor->surface.scale;
+ gdk_cursor_get_hotspot_x (cursor) / wayland_cursor->surface.scale;
*hotspot_y =
- wayland_cursor->surface.hotspot_y / wayland_cursor->surface.scale;
+ gdk_cursor_get_hotspot_y (cursor) / wayland_cursor->surface.scale;
*w = wayland_cursor->surface.width / wayland_cursor->surface.scale;
*h = wayland_cursor->surface.height / wayland_cursor->surface.scale;
@@ -384,37 +383,25 @@ static const struct wl_buffer_listener buffer_listener = {
};
GdkCursor *
-_gdk_wayland_display_get_cursor_for_surface (GdkDisplay *display,
- cairo_surface_t *surface,
- gdouble x,
- gdouble y)
+_gdk_wayland_display_get_cursor_for_texture (GdkDisplay *display,
+ GdkTexture *texture,
+ int x,
+ int y)
{
GdkWaylandCursor *cursor;
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
struct wl_buffer *buffer;
- cairo_t *cr;
cursor = g_object_new (GDK_TYPE_WAYLAND_CURSOR,
"display", display_wayland,
+ "texture", texture,
+ "x", x,
+ "y", y,
NULL);
- cursor->surface.hotspot_x = x;
- cursor->surface.hotspot_y = y;
cursor->surface.scale = 1;
-
- if (surface)
- {
- double sx, sy;
- cairo_surface_get_device_scale (surface, &sx, &sy);
- cursor->surface.scale = (int)sx;
- cursor->surface.width = cairo_image_surface_get_width (surface);
- cursor->surface.height = cairo_image_surface_get_height (surface);
- }
- else
- {
- cursor->surface.width = 1;
- cursor->surface.height = 1;
- }
+ cursor->surface.width = gdk_texture_get_width (texture);
+ cursor->surface.height = gdk_texture_get_height (texture);
cursor->surface.cairo_surface =
_gdk_wayland_display_create_shm_surface (display_wayland,
@@ -425,13 +412,10 @@ _gdk_wayland_display_get_cursor_for_surface (GdkDisplay *display,
buffer = _gdk_wayland_shm_surface_get_wl_buffer (cursor->surface.cairo_surface);
wl_buffer_add_listener (buffer, &buffer_listener, cursor->surface.cairo_surface);
- if (surface)
- {
- cr = cairo_create (cursor->surface.cairo_surface);
- cairo_set_source_surface (cr, surface, 0, 0);
- cairo_paint (cr);
- cairo_destroy (cr);
- }
+ gdk_texture_download (texture,
+ cairo_image_surface_get_data (cursor->surface.cairo_surface),
+ cairo_image_surface_get_stride (cursor->surface.cairo_surface));
+ cairo_surface_mark_dirty (cursor->surface.cairo_surface);
return GDK_CURSOR (cursor);
}
diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
index 9168268..2d8a763 100644
--- a/gdk/wayland/gdkdisplay-wayland.c
+++ b/gdk/wayland/gdkdisplay-wayland.c
@@ -1037,7 +1037,7 @@ gdk_wayland_display_class_init (GdkWaylandDisplayClass *class)
display_class->get_default_cursor_size = _gdk_wayland_display_get_default_cursor_size;
display_class->get_maximal_cursor_size = _gdk_wayland_display_get_maximal_cursor_size;
display_class->get_cursor_for_name = _gdk_wayland_display_get_cursor_for_name;
- display_class->get_cursor_for_surface = _gdk_wayland_display_get_cursor_for_surface;
+ display_class->get_cursor_for_texture = _gdk_wayland_display_get_cursor_for_texture;
display_class->supports_cursor_alpha = _gdk_wayland_display_supports_cursor_alpha;
display_class->supports_cursor_color = _gdk_wayland_display_supports_cursor_color;
display_class->get_next_serial = gdk_wayland_display_get_next_serial;
diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h
index 667c2ac..d319393 100644
--- a/gdk/wayland/gdkprivate-wayland.h
+++ b/gdk/wayland/gdkprivate-wayland.h
@@ -68,10 +68,10 @@ GdkCursor *_gdk_wayland_display_get_cursor_for_name_with_scale (GdkDisplay *d
guint scale);
GdkCursor *_gdk_wayland_display_get_cursor_for_name (GdkDisplay *display,
const gchar *name);
-GdkCursor *_gdk_wayland_display_get_cursor_for_surface (GdkDisplay *display,
- cairo_surface_t *surface,
- gdouble x,
- gdouble y);
+GdkCursor *_gdk_wayland_display_get_cursor_for_texture (GdkDisplay *display,
+ GdkTexture *texture,
+ int x,
+ int y);
void _gdk_wayland_display_get_default_cursor_size (GdkDisplay *display,
guint *width,
guint *height);
diff --git a/gdk/x11/gdkcursor-x11.c b/gdk/x11/gdkcursor-x11.c
index 573dbc7..ff0ebba 100644
--- a/gdk/x11/gdkcursor-x11.c
+++ b/gdk/x11/gdkcursor-x11.c
@@ -373,68 +373,31 @@ _gdk_x11_cursor_update_theme (GdkCursor *cursor)
#ifdef HAVE_XCURSOR
-static void
-get_surface_size (cairo_surface_t *surface,
- int *width,
- int *height)
-{
- double x_scale, y_scale;
-
- x_scale = y_scale = 1;
-
- cairo_surface_get_device_scale (surface, &x_scale, &y_scale);
-
- /* Assume any set scaling is icon scale */
- *width =
- ceil (cairo_image_surface_get_width (surface) / x_scale);
- *height =
- ceil (cairo_image_surface_get_height (surface) / y_scale);
-}
-
static XcursorImage*
-create_cursor_image (cairo_surface_t *source_surface,
- gint x,
- gint y,
- gint scale)
+create_cursor_image (GdkTexture *texture,
+ gint x,
+ gint y,
+ gint scale)
{
- gint width, height;
XcursorImage *xcimage;
- cairo_surface_t *surface;
- cairo_t *cr;
-
- get_surface_size (source_surface, &width, &height);
-
- width *= scale;
- height *= scale;
-
- xcimage = XcursorImageCreate (width, height);
- xcimage->xhot = x * scale;
- xcimage->yhot = y * scale;
+ xcimage = XcursorImageCreate (gdk_texture_get_width (texture), gdk_texture_get_height (texture));
- surface = cairo_image_surface_create_for_data ((guchar *) xcimage->pixels,
- CAIRO_FORMAT_ARGB32,
- width,
- height,
- width * 4);
+ xcimage->xhot = x;
+ xcimage->yhot = y;
- cairo_surface_set_device_scale (surface, scale, scale);
-
- cr = cairo_create (surface);
- cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
- cairo_set_source_surface (cr, source_surface, 0, 0);
- cairo_paint (cr);
- cairo_destroy (cr);
- cairo_surface_destroy (surface);
+ gdk_texture_download (texture,
+ (guchar *) xcimage->pixels,
+ gdk_texture_get_width (texture) * 4);
return xcimage;
}
GdkCursor *
-_gdk_x11_display_get_cursor_for_surface (GdkDisplay *display,
- cairo_surface_t *surface,
- gdouble x,
- gdouble y)
+_gdk_x11_display_get_cursor_for_texture (GdkDisplay *display,
+ GdkTexture *texture,
+ int x,
+ int y)
{
XcursorImage *xcimage;
Cursor xcursor;
@@ -449,13 +412,16 @@ _gdk_x11_display_get_cursor_for_surface (GdkDisplay *display,
{
target_scale =
gdk_monitor_get_scale_factor (gdk_display_get_primary_monitor (display));
- xcimage = create_cursor_image (surface, x, y, target_scale);
+ xcimage = create_cursor_image (texture, x, y, target_scale);
xcursor = XcursorImageLoadCursor (GDK_DISPLAY_XDISPLAY (display), xcimage);
XcursorImageDestroy (xcimage);
}
private = g_object_new (GDK_TYPE_X11_CURSOR,
"display", display,
+ "texture", texture,
+ "x", x,
+ "y", y,
NULL);
private->xcursor = xcursor;
private->serial = theme_serial;
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index 6a9ba12..1ad526b 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -3191,7 +3191,7 @@ gdk_x11_display_class_init (GdkX11DisplayClass * class)
display_class->supports_input_shapes = gdk_x11_display_supports_input_shapes;
display_class->get_app_launch_context = _gdk_x11_display_get_app_launch_context;
display_class->get_cursor_for_name = _gdk_x11_display_get_cursor_for_name;
- display_class->get_cursor_for_surface = _gdk_x11_display_get_cursor_for_surface;
+ display_class->get_cursor_for_texture = _gdk_x11_display_get_cursor_for_texture;
display_class->get_default_cursor_size = _gdk_x11_display_get_default_cursor_size;
display_class->get_maximal_cursor_size = _gdk_x11_display_get_maximal_cursor_size;
display_class->supports_cursor_alpha = _gdk_x11_display_supports_cursor_alpha;
diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h
index c4f0e59..7a84fce 100644
--- a/gdk/x11/gdkprivate-x11.h
+++ b/gdk/x11/gdkprivate-x11.h
@@ -232,10 +232,10 @@ gchar * _gdk_x11_display_manager_get_atom_name (GdkDisplayManager *manager,
GdkCursor *_gdk_x11_display_get_cursor_for_name (GdkDisplay *display,
const gchar *name);
-GdkCursor *_gdk_x11_display_get_cursor_for_surface (GdkDisplay *display,
- cairo_surface_t *surface,
- gdouble x,
- gdouble y);
+GdkCursor *_gdk_x11_display_get_cursor_for_texture (GdkDisplay *display,
+ GdkTexture *texture,
+ int x,
+ int y);
gboolean _gdk_x11_display_supports_cursor_alpha (GdkDisplay *display);
gboolean _gdk_x11_display_supports_cursor_color (GdkDisplay *display);
void _gdk_x11_display_get_default_cursor_size (GdkDisplay *display,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]