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.
This commit is contained in:

committed by
Matthias Clasen

parent
6a2524324f
commit
2a646c1d21
@ -37,6 +37,7 @@
|
|||||||
#include <X11/extensions/Xfixes.h>
|
#include <X11/extensions/Xfixes.h>
|
||||||
#endif
|
#endif
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include "gdkprivate-x11.h"
|
#include "gdkprivate-x11.h"
|
||||||
#include "gdkcursor.h"
|
#include "gdkcursor.h"
|
||||||
@ -761,6 +762,11 @@ create_cursor_image (GdkPixbuf *pixbuf,
|
|||||||
* gdk_display_get_maximal_cursor_size() give information about
|
* gdk_display_get_maximal_cursor_size() give information about
|
||||||
* cursor sizes.
|
* 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
|
* On the X backend, support for RGBA cursors requires a
|
||||||
* sufficently new version of the X Render extension.
|
* sufficently new version of the X Render extension.
|
||||||
*
|
*
|
||||||
@ -778,9 +784,34 @@ gdk_cursor_new_from_pixbuf (GdkDisplay *display,
|
|||||||
Cursor xcursor;
|
Cursor xcursor;
|
||||||
GdkCursorPrivate *private;
|
GdkCursorPrivate *private;
|
||||||
GdkCursor *cursor;
|
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_DISPLAY (display), NULL);
|
||||||
g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), 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 <= x && x < gdk_pixbuf_get_width (pixbuf), NULL);
|
||||||
g_return_val_if_fail (0 <= y && y < gdk_pixbuf_get_height (pixbuf), NULL);
|
g_return_val_if_fail (0 <= y && y < gdk_pixbuf_get_height (pixbuf), NULL);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user