summaryrefslogtreecommitdiff
path: root/gtk/gtklistbox.c
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2015-02-10 20:02:08 +0100
committerAlexander Larsson <alexl@redhat.com>2015-02-12 09:58:29 +0100
commit9141eeb60e29082d58036f9dd4bafdb052afcd69 (patch)
treea9be30b41a79626466cf8026b530f87a7ce7b06c /gtk/gtklistbox.c
parentb876e036b2586fa4b0537d51313feb9d38e5a6de (diff)
downloadgtk+-9141eeb60e29082d58036f9dd4bafdb052afcd69.tar.gz
GtkListBoxRow: Update the listbox's cursor row when focusing
https://bugzilla.gnome.org/show_bug.cgi?id=708320
Diffstat (limited to 'gtk/gtklistbox.c')
-rw-r--r--gtk/gtklistbox.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index bff52adc87..a800f84d25 100644
--- a/gtk/gtklistbox.c
+++ b/gtk/gtklistbox.c
@@ -168,7 +168,8 @@ static void gtk_list_box_add_move_binding (GtkBindin
GtkMovementStep step,
gint count);
static void gtk_list_box_update_cursor (GtkListBox *box,
- GtkListBoxRow *row);
+ GtkListBoxRow *row,
+ gboolean grab_focus);
static void gtk_list_box_select_and_activate (GtkListBox *box,
GtkListBoxRow *row);
static void gtk_list_box_update_prelight (GtkListBox *box,
@@ -1380,11 +1381,13 @@ ensure_row_visible (GtkListBox *box,
static void
gtk_list_box_update_cursor (GtkListBox *box,
- GtkListBoxRow *row)
+ GtkListBoxRow *row,
+ gboolean grab_focus)
{
BOX_PRIV (box)->cursor_row = row;
- ensure_row_visible (box, row);
- gtk_widget_grab_focus (GTK_WIDGET (row));
+ ensure_row_visible (box, row);
+ if (grab_focus)
+ gtk_widget_grab_focus (GTK_WIDGET (row));
gtk_widget_queue_draw (GTK_WIDGET (row));
_gtk_list_box_accessible_update_cursor (box, row);
}
@@ -1549,7 +1552,7 @@ gtk_list_box_update_selection (GtkListBox *box,
{
GtkListBoxPrivate *priv = BOX_PRIV (box);
- gtk_list_box_update_cursor (box, row);
+ gtk_list_box_update_cursor (box, row, TRUE);
if (priv->selection_mode == GTK_SELECTION_NONE)
return;
@@ -1624,7 +1627,7 @@ gtk_list_box_select_and_activate (GtkListBox *box,
if (row != NULL)
{
gtk_list_box_select_row_internal (box, row);
- gtk_list_box_update_cursor (box, row);
+ gtk_list_box_update_cursor (box, row, TRUE);
gtk_list_box_activate (box, row);
}
}
@@ -2850,7 +2853,7 @@ gtk_list_box_move_cursor (GtkListBox *box,
get_current_selection_modifiers (GTK_WIDGET (box), &modify, &extend);
- gtk_list_box_update_cursor (box, row);
+ gtk_list_box_update_cursor (box, row, TRUE);
if (!modify)
gtk_list_box_update_selection (box, row, FALSE, extend);
}
@@ -2900,7 +2903,7 @@ gtk_list_box_row_set_focus (GtkListBoxRow *row)
get_current_selection_modifiers (GTK_WIDGET (row), &modify, &extend);
if (modify)
- gtk_list_box_update_cursor (box, row);
+ gtk_list_box_update_cursor (box, row, TRUE);
else
gtk_list_box_update_selection (box, row, FALSE, FALSE);
}
@@ -3459,6 +3462,18 @@ gtk_list_box_row_finalize (GObject *obj)
}
static void
+gtk_list_box_row_grab_focus (GtkWidget *widget)
+{
+ GtkListBoxRow *row = GTK_LIST_BOX_ROW (widget);
+ GtkListBox *box = gtk_list_box_row_get_box (row);
+
+ if (BOX_PRIV (box)->cursor_row != row)
+ gtk_list_box_update_cursor (box, row, FALSE);
+
+ GTK_WIDGET_CLASS (gtk_list_box_row_parent_class)->grab_focus (widget);
+}
+
+static void
gtk_list_box_row_class_init (GtkListBoxRowClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -3479,6 +3494,7 @@ gtk_list_box_row_class_init (GtkListBoxRowClass *klass)
widget_class->get_preferred_width_for_height = gtk_list_box_row_get_preferred_width_for_height;
widget_class->size_allocate = gtk_list_box_row_size_allocate;
widget_class->focus = gtk_list_box_row_focus;
+ widget_class->grab_focus = gtk_list_box_row_grab_focus;
klass->activate = gtk_list_box_row_activate;