summaryrefslogtreecommitdiff
path: root/gdk/gdkcursor.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2017-11-03 03:08:04 +0100
committerBenjamin Otte <otte@redhat.com>2017-11-04 00:07:13 +0100
commit428547e14fc69bc13a0665aeb68d9438403261b1 (patch)
treef43e12e33b09c69a10a85b036793c8a16af17e14 /gdk/gdkcursor.c
parent6b2ea46a5fa74cfba779518c64ddc5ac6c5d01be (diff)
downloadgtk+-428547e14fc69bc13a0665aeb68d9438403261b1.tar.gz
gdk: Add gdk_cursor_hash() and gdk_cursor_equal()
This is so GDK backends can put cursors into hash tables and avoid duplicates.
Diffstat (limited to 'gdk/gdkcursor.c')
-rw-r--r--gdk/gdkcursor.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/gdk/gdkcursor.c b/gdk/gdkcursor.c
index decba09868..f199df8f59 100644
--- a/gdk/gdkcursor.c
+++ b/gdk/gdkcursor.c
@@ -235,6 +235,52 @@ gdk_cursor_init (GdkCursor *cursor)
{
}
+guint
+gdk_cursor_hash (gconstpointer pointer)
+{
+ const GdkCursor *cursor = pointer;
+ guint hash;
+
+ if (cursor->fallback)
+ hash = gdk_cursor_hash (cursor->fallback) << 16;
+ else
+ hash = 0;
+
+ if (cursor->name)
+ hash ^= g_str_hash (cursor->name);
+ else if (cursor->texture)
+ hash ^= g_direct_hash (cursor->texture);
+
+ hash ^= (cursor->hotspot_x << 8) | cursor->hotspot_y;
+
+ return hash;
+}
+
+gboolean
+gdk_cursor_equal (gconstpointer a,
+ gconstpointer b)
+{
+ const GdkCursor *ca = a;
+ const GdkCursor *cb = b;
+
+ if ((ca->fallback != NULL) != (cb->fallback != NULL))
+ return FALSE;
+ if (ca->fallback != NULL && !gdk_cursor_equal (ca->fallback, cb->fallback))
+ return FALSE;
+
+ if (g_strcmp0 (ca->name, cb->name) != 0)
+ return FALSE;
+
+ if (ca->texture != cb->texture)
+ return FALSE;
+
+ if (ca->hotspot_x != cb->hotspot_x ||
+ ca->hotspot_y != cb->hotspot_y)
+ return FALSE;
+
+ return TRUE;
+}
+
/**
* gdk_cursor_new_from_name:
* @display: the #GdkDisplay for which the cursor will be created