diff options
author | Timm Bäder <mail@baedert.org> | 2015-02-10 20:02:08 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2015-02-12 09:58:29 +0100 |
commit | 9141eeb60e29082d58036f9dd4bafdb052afcd69 (patch) | |
tree | a9be30b41a79626466cf8026b530f87a7ce7b06c /gtk/gtklistbox.c | |
parent | b876e036b2586fa4b0537d51313feb9d38e5a6de (diff) | |
download | gtk+-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.c | 32 |
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; |