diff options
author | Benjamin Otte <otte@redhat.com> | 2017-11-03 03:08:04 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2017-11-04 00:07:13 +0100 |
commit | 428547e14fc69bc13a0665aeb68d9438403261b1 (patch) | |
tree | f43e12e33b09c69a10a85b036793c8a16af17e14 /gdk/gdkcursor.c | |
parent | 6b2ea46a5fa74cfba779518c64ddc5ac6c5d01be (diff) | |
download | gtk+-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.c | 46 |
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 |