From 428547e14fc69bc13a0665aeb68d9438403261b1 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Fri, 3 Nov 2017 03:08:04 +0100 Subject: [PATCH] gdk: Add gdk_cursor_hash() and gdk_cursor_equal() This is so GDK backends can put cursors into hash tables and avoid duplicates. --- gdk/gdkcursor.c | 46 ++++++++++++++++++++++++++++++++++++++++++ gdk/gdkcursorprivate.h | 4 ++++ 2 files changed, 50 insertions(+) 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 diff --git a/gdk/gdkcursorprivate.h b/gdk/gdkcursorprivate.h index 6edf841759..aaac3169fb 100644 --- a/gdk/gdkcursorprivate.h +++ b/gdk/gdkcursorprivate.h @@ -52,6 +52,10 @@ struct _GdkCursorClass GObjectClass parent_class; }; +guint gdk_cursor_hash (gconstpointer pointer); +gboolean gdk_cursor_equal (gconstpointer a, + gconstpointer b); + G_END_DECLS #endif /* __GDK_CURSOR_PRIVATE_H__ */