diff --git a/ChangeLog b/ChangeLog index db6cc6598f..946bdf7a1d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-11-24 Michael Natterer + + * gtk/gtktreeview.c (gtk_tree_view_move_cursor_up_down): if we + can't go up/down, consult gtk_widget_keynav_failed() and leave the + widget if it returns FALSE (bug #322640). + 2006-11-23 Behdad Esfahbod * gtk/gtkmain.c: Fix minor typo in docs. (#378632, Hannes Mueller) diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index e8190d1669..a9a90f054a 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -9513,6 +9513,7 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view, GtkRBTree *new_cursor_tree = NULL; GtkRBNode *new_cursor_node = NULL; GtkTreePath *cursor_path = NULL; + gboolean grab_focus = TRUE; if (! GTK_WIDGET_HAS_FOCUS (tree_view)) return; @@ -9585,10 +9586,32 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view, else { gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node); - gtk_widget_error_bell (GTK_WIDGET (tree_view)); + + if (!tree_view->priv->shift_pressed) + { + if (! gtk_widget_keynav_failed (GTK_WIDGET (tree_view), + count < 0 ? + GTK_DIR_UP : GTK_DIR_DOWN)) + { + GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (tree_view)); + + if (toplevel) + gtk_widget_child_focus (toplevel, + count < 0 ? + GTK_DIR_TAB_BACKWARD : + GTK_DIR_TAB_FORWARD); + + grab_focus = FALSE; + } + } + else + { + gtk_widget_error_bell (GTK_WIDGET (tree_view)); + } } - gtk_widget_grab_focus (GTK_WIDGET (tree_view)); + if (grab_focus) + gtk_widget_grab_focus (GTK_WIDGET (tree_view)); } static void