[gtk+] GtkListBox: Optimize _get_row_at_y a bit



commit 47afccb41bc5258b15b3b14148ffcc50fb3a0933
Author: Timm Bäder <mail baedert org>
Date:   Wed Jan 6 10:58:08 2016 +0100

    GtkListBox: Optimize _get_row_at_y a bit
    
    Use g_sequence_lookup for a binary search over the rows.

 gtk/gtklistbox.c |   41 ++++++++++++++++++++++++-----------------
 1 files changed, 24 insertions(+), 17 deletions(-)
---
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index 85c8585..3b2c1ac 100644
--- a/gtk/gtklistbox.c
+++ b/gtk/gtklistbox.c
@@ -714,6 +714,23 @@ gtk_list_box_get_row_at_index (GtkListBox *box,
   return NULL;
 }
 
+static int
+row_y_cmp_func (gconstpointer a,
+                gconstpointer b,
+                gpointer      user_data)
+{
+  int y = GPOINTER_TO_INT (b);
+  GtkListBoxRowPrivate *row_priv = ROW_PRIV (a);
+
+
+  if (y < row_priv->y)
+    return 1;
+  else if (y >= row_priv->y + row_priv->height)
+    return -1;
+
+  return 0;
+}
+
 /**
  * gtk_list_box_get_row_at_y:
  * @box: a #GtkListBox
@@ -730,29 +747,19 @@ GtkListBoxRow *
 gtk_list_box_get_row_at_y (GtkListBox *box,
                            gint        y)
 {
-  GtkListBoxRow *row, *found_row;
-  GtkListBoxRowPrivate *row_priv;
   GSequenceIter *iter;
 
   g_return_val_if_fail (GTK_IS_LIST_BOX (box), NULL);
 
-  /* TODO: This should use g_sequence_search */
+  iter = g_sequence_lookup (BOX_PRIV (box)->children,
+                            GINT_TO_POINTER (y),
+                            row_y_cmp_func,
+                            NULL);
 
-  found_row = NULL;
-  for (iter = g_sequence_get_begin_iter (BOX_PRIV (box)->children);
-       !g_sequence_iter_is_end (iter);
-       iter = g_sequence_iter_next (iter))
-    {
-      row = (GtkListBoxRow*) g_sequence_get (iter);
-      row_priv = ROW_PRIV (row);
-      if (y >= row_priv->y && y < (row_priv->y + row_priv->height))
-        {
-          found_row = row;
-          break;
-        }
-    }
+  if (iter)
+    return GTK_LIST_BOX_ROW (g_sequence_get (iter));
 
-  return found_row;
+  return NULL;
 }
 
 /**


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]