[gtk+/gtk-2-24] Take cursor hotspot from pixbuf if available



commit 2a646c1d21e8fce65ee17a3b211ad59222d215b6
Author: Christian Persch <chpe gnome org>
Date:   Fri Oct 15 14:34:44 2010 -0400

    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 files changed, 31 insertions(+), 0 deletions(-)
---
diff --git a/gdk/x11/gdkcursor-x11.c b/gdk/x11/gdkcursor-x11.c
index 5cfbaa5..28f0f10 100644
--- a/gdk/x11/gdkcursor-x11.c
+++ b/gdk/x11/gdkcursor-x11.c
@@ -37,6 +37,7 @@
 #include <X11/extensions/Xfixes.h>
 #endif
 #include <string.h>
+#include <errno.h>
 
 #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 <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. 
  *
@@ -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);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]