summaryrefslogtreecommitdiff
path: root/gtk/gtklistbox.c
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2016-01-06 10:58:08 +0100
committerTimm Bäder <mail@baedert.org>2016-01-06 16:02:59 +0100
commit47afccb41bc5258b15b3b14148ffcc50fb3a0933 (patch)
tree3972a5d06cea4cf5900ff1fa2def567b5b81ab19 /gtk/gtklistbox.c
parenta9d5fa4cfe7f377d14273e038ee6eae980f5e9e7 (diff)
downloadgtk+-47afccb41bc5258b15b3b14148ffcc50fb3a0933.tar.gz
GtkListBox: Optimize _get_row_at_y a bit
Use g_sequence_lookup for a binary search over the rows.
Diffstat (limited to 'gtk/gtklistbox.c')
-rw-r--r--gtk/gtklistbox.c41
1 files changed, 24 insertions, 17 deletions
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index 85c8585dbf..3b2c1ac2b6 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;
}
/**