gdk: Add gdk_cursor_hash() and gdk_cursor_equal()
authorBenjamin Otte <otte@redhat.com>
Fri, 3 Nov 2017 02:08:04 +0000 (03:08 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 3 Nov 2017 23:07:13 +0000 (00:07 +0100)
This is so GDK backends can put cursors into hash tables and avoid
duplicates.

gdk/gdkcursor.c
gdk/gdkcursorprivate.h

index decba098685437e8672f34a7dc8efc6627047e09..f199df8f5981ac5cd0bc93a3160017bc85f55f6f 100644 (file)
@@ -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
index 6edf841759e72180e615aff2956395d258248582..aaac3169fb96668476cc55cb13d25af7b1ed5360 100644 (file)
@@ -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__ */