]> Pileus Git - ~andy/gtk/commitdiff
if we can't go up/down, consult gtk_widget_keynav_failed() and leave the
authorMichael Natterer <mitch@imendio.com>
Fri, 24 Nov 2006 13:18:55 +0000 (13:18 +0000)
committerMichael Natterer <mitch@src.gnome.org>
Fri, 24 Nov 2006 13:18:55 +0000 (13:18 +0000)
2006-11-24  Michael Natterer  <mitch@imendio.com>

* 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).

ChangeLog
gtk/gtktreeview.c

index db6cc6598f7ca937fb04b2fe744f4a7cf7dc5975..946bdf7a1d0675dde2cbdfee1263707cc2a42519 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-11-24  Michael Natterer  <mitch@imendio.com>
+
+       * 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  <behdad@gnome.org>
 
        * gtk/gtkmain.c: Fix minor typo in docs. (#378632, Hannes Mueller)
index e8190d1669ab59adac8f67a874f53b1570f37646..a9a90f054a1477ab05e1ae95bc8e9d263b8f18d8 100644 (file)
@@ -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