From 2a646c1d21e8fce65ee17a3b211ad59222d215b6 Mon Sep 17 00:00:00 2001 From: Christian Persch Date: Fri, 15 Oct 2010 14:34:44 -0400 Subject: [PATCH] Take cursor hotspot from pixbuf if available Allow -1 for the hotspot coordinates in gdk_cursor_new_from_pixbuf, if the pixbuf contains the x_hot/y_hot options with appropriate values. Bug #632140. --- gdk/x11/gdkcursor-x11.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/gdk/x11/gdkcursor-x11.c b/gdk/x11/gdkcursor-x11.c index 5cfbaa52b0..28f0f1037d 100644 --- a/gdk/x11/gdkcursor-x11.c +++ b/gdk/x11/gdkcursor-x11.c @@ -37,6 +37,7 @@ #include #endif #include +#include #include "gdkprivate-x11.h" #include "gdkcursor.h" @@ -761,6 +762,11 @@ create_cursor_image (GdkPixbuf *pixbuf, * gdk_display_get_maximal_cursor_size() give information about * cursor sizes. * + * If @x or @y are -1, the pixbuf must have + * options named "x_hot" and "y_hot", resp., containing + * integer values between %0 and the width resp. height of + * the pixbuf. (Since: 3.0) + * * On the X backend, support for RGBA cursors requires a * sufficently new version of the X Render extension. * @@ -778,9 +784,34 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display, Cursor xcursor; GdkCursorPrivate *private; GdkCursor *cursor; + const char *option; + char *end; + gint64 value; g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL); + + if (x == -1 && (option = gdk_pixbuf_get_option (pixbuf, "x_hot"))) + { + errno = 0; + end = NULL; + value = g_ascii_strtoll (option, &end, 10); + if (errno == 0 && + end != option && + value >= 0 && value < G_MAXINT) + x = (gint) value; + } + if (y == -1 && (option = gdk_pixbuf_get_option (pixbuf, "y_hot"))) + { + errno = 0; + end = NULL; + value = g_ascii_strtoll (option, &end, 10); + if (errno == 0 && + end != option && + value >= 0 && value < G_MAXINT) + y = (gint) value; + } + g_return_val_if_fail (0 <= x && x < gdk_pixbuf_get_width (pixbuf), NULL); g_return_val_if_fail (0 <= y && y < gdk_pixbuf_get_height (pixbuf), NULL);