diff options
author | Christian Persch <chpe@gnome.org> | 2010-10-15 14:34:44 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2010-10-15 14:38:21 -0400 |
commit | b5621b3c895630a5e4a0dc9c642cecae6354b451 (patch) | |
tree | 87059654704eb5352d4bf967787ba2672cec9c3c /gdk | |
parent | cbc358ead8b75522655ddbda3be36d98c8fbebff (diff) | |
download | gtk+-b5621b3c895630a5e4a0dc9c642cecae6354b451.tar.gz |
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.
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/x11/gdkcursor-x11.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/gdk/x11/gdkcursor-x11.c b/gdk/x11/gdkcursor-x11.c index 6808c0e0e9..6fddde869c 100644 --- a/gdk/x11/gdkcursor-x11.c +++ b/gdk/x11/gdkcursor-x11.c @@ -44,6 +44,7 @@ #include <X11/extensions/Xfixes.h> #endif #include <string.h> +#include <errno.h> static guint theme_serial = 0; @@ -641,6 +642,11 @@ create_cursor_image (GdkPixbuf *pixbuf, * gdk_display_get_maximal_cursor_size() give information about * cursor sizes. * + * If @x or @y are <literal>-1</literal>, 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. * @@ -658,9 +664,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); |