]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktreeview.c
Make gtk_combo_box_entry_set_text_column more forgiving
[~andy/gtk] / gtk / gtktreeview.c
index 7e7adf8ab1637cf7b6cecf6b240e170154fc5bfb..665720fe5518f452bb937723decb3816ba75ddbf 100644 (file)
@@ -48,7 +48,7 @@
 
 #define GTK_TREE_VIEW_PRIORITY_VALIDATE (GDK_PRIORITY_REDRAW + 5)
 #define GTK_TREE_VIEW_PRIORITY_SCROLL_SYNC (GTK_TREE_VIEW_PRIORITY_VALIDATE + 2)
-#define GTK_TREE_VIEW_NUM_ROWS_PER_IDLE 500
+#define GTK_TREE_VIEW_TIME_MS_PER_IDLE 30
 #define SCROLL_EDGE_SIZE 15
 #define EXPANDER_EXTRA_PADDING 4
 #define GTK_TREE_VIEW_SEARCH_DIALOG_TIMEOUT 5000
@@ -345,15 +345,6 @@ static void     gtk_tree_view_build_tree                     (GtkTreeView
                                                              GtkTreeIter        *iter,
                                                              gint                depth,
                                                              gboolean            recurse);
-static gboolean gtk_tree_view_discover_dirty_iter            (GtkTreeView        *tree_view,
-                                                             GtkTreeIter        *iter,
-                                                             gint                depth,
-                                                             gint               *height,
-                                                             GtkRBNode          *node);
-static void     gtk_tree_view_discover_dirty                 (GtkTreeView        *tree_view,
-                                                             GtkRBTree          *tree,
-                                                             GtkTreeIter        *iter,
-                                                             gint                depth);
 static void     gtk_tree_view_clamp_node_visible             (GtkTreeView        *tree_view,
                                                              GtkRBTree          *tree,
                                                              GtkRBNode          *node);
@@ -640,7 +631,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
                                     PROP_SEARCH_COLUMN,
                                     g_param_spec_int ("search-column",
                                                       P_("Search Column"),
-                                                      P_("Model column to search through when searching through code"),
+                                                      P_("Model column to search through during interactive search"),
                                                       -1,
                                                       G_MAXINT,
                                                       -1,
@@ -673,7 +664,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
      * Currently, this works only for the selection modes 
      * %GTK_SELECTION_SINGLE and %GTK_SELECTION_BROWSE.
      *
-     * This mode is primarily indended for treeviews in popups, e.g.
+     * This mode is primarily intended for treeviews in popups, e.g.
      * in #GtkComboBox or #GtkEntryCompletion.
      *
      * Since: 2.6
@@ -690,10 +681,10 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
      * GtkTreeView:hover-expand:
      * 
      * Enables of disables the hover expansion mode of @tree_view.
-     * Hover expansion makes rows expand or collaps if the pointer moves 
+     * Hover expansion makes rows expand or collapse if the pointer moves 
      * over them.
      *
-     * This mode is primarily indended for treeviews in popups, e.g.
+     * This mode is primarily intended for treeviews in popups, e.g.
      * in #GtkComboBox or #GtkEntryCompletion.
      *
      * Since: 2.6
@@ -869,6 +860,15 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
                                                                GTK_PARAM_READABLE));
 
   /* Signals */
+  /**
+   * GtkTreeView::set-scroll-adjustments
+   * @horizontal: the horizontal #GtkAdjustment
+   * @vertical: the vertical #GtkAdjustment
+   *
+   * Set the scroll adjustments for the tree view. Usually scrolled containers
+   * like #GtkScrolledWindow will emit this signal to connect two instances
+   * of #GtkScrollbar to the scroll directions of the #GtkTreeView.
+   */
   widget_class->set_scroll_adjustments_signal =
     g_signal_new (I_("set-scroll-adjustments"),
                  G_TYPE_FROM_CLASS (o_class),
@@ -1000,7 +1000,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkTreeViewClass, columns_changed),
                  NULL, NULL,
-                 _gtk_marshal_NONE__NONE,
+                 _gtk_marshal_VOID__VOID,
                  G_TYPE_NONE, 0);
 
   /**
@@ -1015,7 +1015,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkTreeViewClass, cursor_changed),
                  NULL, NULL,
-                 _gtk_marshal_NONE__NONE,
+                 _gtk_marshal_VOID__VOID,
                  G_TYPE_NONE, 0);
 
   tree_view_signals[MOVE_CURSOR] =
@@ -1035,7 +1035,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (GtkTreeViewClass, select_all),
                  NULL, NULL,
-                 _gtk_marshal_BOOLEAN__NONE,
+                 _gtk_marshal_BOOLEAN__VOID,
                  G_TYPE_BOOLEAN, 0);
 
   tree_view_signals[UNSELECT_ALL] =
@@ -1044,7 +1044,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (GtkTreeViewClass, unselect_all),
                  NULL, NULL,
-                 _gtk_marshal_BOOLEAN__NONE,
+                 _gtk_marshal_BOOLEAN__VOID,
                  G_TYPE_BOOLEAN, 0);
 
   tree_view_signals[SELECT_CURSOR_ROW] =
@@ -1063,7 +1063,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (GtkTreeViewClass, toggle_cursor_row),
                  NULL, NULL,
-                 _gtk_marshal_BOOLEAN__NONE,
+                 _gtk_marshal_BOOLEAN__VOID,
                  G_TYPE_BOOLEAN, 0);
 
   tree_view_signals[EXPAND_COLLAPSE_CURSOR_ROW] =
@@ -1084,7 +1084,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (GtkTreeViewClass, select_cursor_parent),
                  NULL, NULL,
-                 _gtk_marshal_BOOLEAN__NONE,
+                 _gtk_marshal_BOOLEAN__VOID,
                  G_TYPE_BOOLEAN, 0);
 
   tree_view_signals[START_INTERACTIVE_SEARCH] =
@@ -1093,7 +1093,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (GtkTreeViewClass, start_interactive_search),
                  NULL, NULL,
-                 _gtk_marshal_BOOLEAN__NONE,
+                 _gtk_marshal_BOOLEAN__VOID,
                  G_TYPE_BOOLEAN, 0);
 
   /* Key bindings */
@@ -1134,180 +1134,180 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
                                  GTK_MOVEMENT_PAGES, 1);
 
 
-  gtk_binding_entry_add_signal (binding_set, GDK_Right, 0, "move_cursor", 2,
+  gtk_binding_entry_add_signal (binding_set, GDK_Right, 0, "move-cursor", 2,
                                G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
                                G_TYPE_INT, 1);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_Left, 0, "move_cursor", 2,
+  gtk_binding_entry_add_signal (binding_set, GDK_Left, 0, "move-cursor", 2,
                                G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
                                G_TYPE_INT, -1);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Right, 0, "move_cursor", 2,
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Right, 0, "move-cursor", 2,
                                G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
                                G_TYPE_INT, 1);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, 0, "move_cursor", 2,
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, 0, "move-cursor", 2,
                                G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
                                G_TYPE_INT, -1);
 
   gtk_binding_entry_add_signal (binding_set, GDK_Right, GDK_CONTROL_MASK,
-                                "move_cursor", 2,
+                                "move-cursor", 2,
                                G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
                                G_TYPE_INT, 1);
 
   gtk_binding_entry_add_signal (binding_set, GDK_Left, GDK_CONTROL_MASK,
-                                "move_cursor", 2,
+                                "move-cursor", 2,
                                G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
                                G_TYPE_INT, -1);
 
   gtk_binding_entry_add_signal (binding_set, GDK_KP_Right, GDK_CONTROL_MASK,
-                                "move_cursor", 2,
+                                "move-cursor", 2,
                                G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
                                G_TYPE_INT, 1);
 
   gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, GDK_CONTROL_MASK,
-                                "move_cursor", 2,
+                                "move-cursor", 2,
                                G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
                                G_TYPE_INT, -1);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_CONTROL_MASK, "toggle_cursor_row", 0);
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, GDK_CONTROL_MASK, "toggle_cursor_row", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_CONTROL_MASK, "toggle-cursor-row", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, GDK_CONTROL_MASK, "toggle-cursor-row", 0);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_a, GDK_CONTROL_MASK, "select_all", 0);
-  gtk_binding_entry_add_signal (binding_set, GDK_slash, GDK_CONTROL_MASK, "select_all", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_a, GDK_CONTROL_MASK, "select-all", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_slash, GDK_CONTROL_MASK, "select-all", 0);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_A, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "unselect_all", 0);
-  gtk_binding_entry_add_signal (binding_set, GDK_backslash, GDK_CONTROL_MASK, "unselect_all", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_A, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "unselect-all", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_backslash, GDK_CONTROL_MASK, "unselect-all", 0);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_SHIFT_MASK, "select_cursor_row", 1,
+  gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_SHIFT_MASK, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, GDK_SHIFT_MASK, "select_cursor_row", 1,
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, GDK_SHIFT_MASK, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_space, 0, "select_cursor_row", 1,
+  gtk_binding_entry_add_signal (binding_set, GDK_space, 0, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, 0, "select_cursor_row", 1,
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, 0, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
-  gtk_binding_entry_add_signal (binding_set, GDK_Return, 0, "select_cursor_row", 1,
+  gtk_binding_entry_add_signal (binding_set, GDK_Return, 0, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
-  gtk_binding_entry_add_signal (binding_set, GDK_ISO_Enter, 0, "select_cursor_row", 1,
+  gtk_binding_entry_add_signal (binding_set, GDK_ISO_Enter, 0, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Enter, 0, "select_cursor_row", 1,
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Enter, 0, "select-cursor-row", 1,
                                G_TYPE_BOOLEAN, TRUE);
 
   /* expand and collapse rows */
-  gtk_binding_entry_add_signal (binding_set, GDK_plus, 0, "expand_collapse_cursor_row", 3,
+  gtk_binding_entry_add_signal (binding_set, GDK_plus, 0, "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, FALSE);
 
   gtk_binding_entry_add_signal (binding_set, GDK_asterisk, 0,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                 G_TYPE_BOOLEAN, TRUE,
                                 G_TYPE_BOOLEAN, TRUE,
                                 G_TYPE_BOOLEAN, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_KP_Multiply, 0,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                 G_TYPE_BOOLEAN, TRUE,
                                 G_TYPE_BOOLEAN, TRUE,
                                 G_TYPE_BOOLEAN, TRUE);
 
   gtk_binding_entry_add_signal (binding_set, GDK_slash, 0,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                 G_TYPE_BOOLEAN, TRUE,
                                 G_TYPE_BOOLEAN, FALSE,
                                 G_TYPE_BOOLEAN, FALSE);
   gtk_binding_entry_add_signal (binding_set, GDK_KP_Divide, 0,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                 G_TYPE_BOOLEAN, TRUE,
                                 G_TYPE_BOOLEAN, FALSE,
                                 G_TYPE_BOOLEAN, FALSE);
 
   /* Not doable on US keyboards */
-  gtk_binding_entry_add_signal (binding_set, GDK_plus, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
+  gtk_binding_entry_add_signal (binding_set, GDK_plus, GDK_SHIFT_MASK, "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE);
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, 0, "expand_collapse_cursor_row", 3,
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, 0, "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, FALSE);
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, GDK_SHIFT_MASK, "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE);
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, GDK_SHIFT_MASK, "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_Right, GDK_SHIFT_MASK,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_KP_Right, GDK_SHIFT_MASK,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_Right,
                                 GDK_CONTROL_MASK | GDK_SHIFT_MASK,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_KP_Right,
                                 GDK_CONTROL_MASK | GDK_SHIFT_MASK,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, TRUE);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_minus, 0, "expand_collapse_cursor_row", 3,
+  gtk_binding_entry_add_signal (binding_set, GDK_minus, 0, "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, FALSE);
-  gtk_binding_entry_add_signal (binding_set, GDK_minus, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
+  gtk_binding_entry_add_signal (binding_set, GDK_minus, GDK_SHIFT_MASK, "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, TRUE);
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Subtract, 0, "expand_collapse_cursor_row", 3,
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Subtract, 0, "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, FALSE);
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Subtract, GDK_SHIFT_MASK, "expand_collapse_cursor_row", 3,
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Subtract, GDK_SHIFT_MASK, "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, TRUE,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_Left, GDK_SHIFT_MASK,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, GDK_SHIFT_MASK,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_Left,
                                 GDK_CONTROL_MASK | GDK_SHIFT_MASK,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_KP_Left,
                                 GDK_CONTROL_MASK | GDK_SHIFT_MASK,
-                                "expand_collapse_cursor_row", 3,
+                                "expand-collapse-cursor-row", 3,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, FALSE,
                                G_TYPE_BOOLEAN, TRUE);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_BackSpace, 0, "select_cursor_parent", 0);
-  gtk_binding_entry_add_signal (binding_set, GDK_BackSpace, GDK_CONTROL_MASK, "select_cursor_parent", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_BackSpace, 0, "select-cursor-parent", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_BackSpace, GDK_CONTROL_MASK, "select-cursor-parent", 0);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_f, GDK_CONTROL_MASK, "start_interactive_search", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_f, GDK_CONTROL_MASK, "start-interactive-search", 0);
 
-  gtk_binding_entry_add_signal (binding_set, GDK_F, GDK_CONTROL_MASK, "start_interactive_search", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_F, GDK_CONTROL_MASK, "start-interactive-search", 0);
 
   g_type_class_add_private (o_class, sizeof (GtkTreeViewPrivate));
 }
@@ -1532,7 +1532,7 @@ gtk_tree_view_get_property (GObject    *object,
 static void
 gtk_tree_view_finalize (GObject *object)
 {
-  (* G_OBJECT_CLASS (gtk_tree_view_parent_class)->finalize) (object);
+  G_OBJECT_CLASS (gtk_tree_view_parent_class)->finalize (object);
 }
 
 \f
@@ -1631,14 +1631,14 @@ gtk_tree_view_destroy (GtkObject *object)
   if (tree_view->priv->column_drop_func_data &&
       tree_view->priv->column_drop_func_data_destroy)
     {
-      (* tree_view->priv->column_drop_func_data_destroy) (tree_view->priv->column_drop_func_data);
+      tree_view->priv->column_drop_func_data_destroy (tree_view->priv->column_drop_func_data);
       tree_view->priv->column_drop_func_data = NULL;
     }
 
   if (tree_view->priv->destroy_count_destroy &&
       tree_view->priv->destroy_count_data)
     {
-      (* tree_view->priv->destroy_count_destroy) (tree_view->priv->destroy_count_data);
+      tree_view->priv->destroy_count_destroy (tree_view->priv->destroy_count_data);
       tree_view->priv->destroy_count_data = NULL;
     }
 
@@ -1663,19 +1663,19 @@ gtk_tree_view_destroy (GtkObject *object)
 
   if (tree_view->priv->search_destroy && tree_view->priv->search_user_data)
     {
-      (* tree_view->priv->search_destroy) (tree_view->priv->search_user_data);
+      tree_view->priv->search_destroy (tree_view->priv->search_user_data);
       tree_view->priv->search_user_data = NULL;
     }
 
   if (tree_view->priv->search_position_destroy && tree_view->priv->search_position_user_data)
     {
-      (* tree_view->priv->search_position_destroy) (tree_view->priv->search_position_user_data);
+      tree_view->priv->search_position_destroy (tree_view->priv->search_position_user_data);
       tree_view->priv->search_position_user_data = NULL;
     }
 
   if (tree_view->priv->row_separator_destroy && tree_view->priv->row_separator_data)
     {
-      (* tree_view->priv->row_separator_destroy) (tree_view->priv->row_separator_data);
+      tree_view->priv->row_separator_destroy (tree_view->priv->row_separator_data);
       tree_view->priv->row_separator_data = NULL;
     }
   
@@ -1795,14 +1795,14 @@ gtk_tree_view_realize (GtkWidget *widget)
   attributes.y = TREE_VIEW_HEADER_HEIGHT (tree_view);
   attributes.width = MAX (tree_view->priv->width, widget->allocation.width);
   attributes.height = widget->allocation.height;
-  attributes.event_mask = GDK_EXPOSURE_MASK |
-    GDK_SCROLL_MASK |
-    GDK_POINTER_MOTION_MASK |
-    GDK_ENTER_NOTIFY_MASK |
-    GDK_LEAVE_NOTIFY_MASK |
-    GDK_BUTTON_PRESS_MASK |
-    GDK_BUTTON_RELEASE_MASK |
-    gtk_widget_get_events (widget);
+  attributes.event_mask = (GDK_EXPOSURE_MASK |
+                           GDK_SCROLL_MASK |
+                           GDK_POINTER_MOTION_MASK |
+                           GDK_ENTER_NOTIFY_MASK |
+                           GDK_LEAVE_NOTIFY_MASK |
+                           GDK_BUTTON_PRESS_MASK |
+                           GDK_BUTTON_RELEASE_MASK |
+                           gtk_widget_get_events (widget));
 
   tree_view->priv->bin_window = gdk_window_new (widget->window,
                                                &attributes, attributes_mask);
@@ -1814,12 +1814,12 @@ gtk_tree_view_realize (GtkWidget *widget)
   attributes.width = MAX (tree_view->priv->width, widget->allocation.width);
   attributes.height = tree_view->priv->header_height;
   attributes.event_mask = (GDK_EXPOSURE_MASK |
-                          GDK_SCROLL_MASK |
-                          GDK_BUTTON_PRESS_MASK |
-                          GDK_BUTTON_RELEASE_MASK |
-                          GDK_KEY_PRESS_MASK |
-                          GDK_KEY_RELEASE_MASK) |
-    gtk_widget_get_events (widget);
+                           GDK_SCROLL_MASK |
+                           GDK_BUTTON_PRESS_MASK |
+                           GDK_BUTTON_RELEASE_MASK |
+                           GDK_KEY_PRESS_MASK |
+                           GDK_KEY_RELEASE_MASK |
+                           gtk_widget_get_events (widget));
 
   tree_view->priv->header_window = gdk_window_new (widget->window,
                                                   &attributes, attributes_mask);
@@ -1938,9 +1938,7 @@ gtk_tree_view_unrealize (GtkWidget *widget)
       priv->grid_line_gc = NULL;
     }
 
-  /* GtkWidget::unrealize destroys children and widget->window */
-  if (GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->unrealize)
-    (* GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->unrealize) (widget);
+  GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->unrealize (widget);
 }
 
 /* GtkWidget::size_request helper */
@@ -2036,9 +2034,8 @@ gtk_tree_view_size_request (GtkWidget      *widget,
   GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
   GList *tmp_list;
 
-  /* we validate GTK_TREE_VIEW_NUM_ROWS_PER_IDLE rows initially just to make
-   * sure we have some size. In practice, with a lot of static lists, this
-   * should get a good width.
+  /* we validate some rows initially just to make sure we have some size. 
+   * In practice, with a lot of static lists, this should get a good width.
    */
   do_validate_rows (tree_view, FALSE);
   gtk_tree_view_size_request_columns (tree_view);
@@ -2463,7 +2460,7 @@ gtk_tree_view_size_allocate (GtkWidget     *widget,
 static void
 grab_focus_and_unset_draw_keyfocus (GtkTreeView *tree_view)
 {
-  if (!GTK_WIDGET_HAS_FOCUS (tree_view))
+  if (GTK_WIDGET_CAN_FOCUS (tree_view) && !GTK_WIDGET_HAS_FOCUS (tree_view))
     gtk_widget_grab_focus (GTK_WIDGET (tree_view));
   GTK_TREE_VIEW_UNSET_FLAG (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS);
 }
@@ -2484,9 +2481,9 @@ row_is_separator (GtkTreeView *tree_view,
       else
        gtk_tree_model_get_iter (tree_view->priv->model, &tmpiter, path);
 
-      is_separator = (* tree_view->priv->row_separator_func) (tree_view->priv->model,
-                                                             &tmpiter,
-                                                             tree_view->priv->row_separator_data);
+      is_separator = tree_view->priv->row_separator_func (tree_view->priv->model,
+                                                          &tmpiter,
+                                                          tree_view->priv->row_separator_data);
     }
 
   return is_separator;
@@ -3613,6 +3610,7 @@ gtk_tree_view_vertical_autoscroll (GtkTreeView *tree_view)
   GdkRectangle visible_rect;
   gint y;
   gint offset;
+  gfloat value;
 
   gdk_window_get_pointer (tree_view->priv->bin_window, NULL, &y, NULL);
   y += tree_view->priv->dy;
@@ -3628,8 +3626,9 @@ gtk_tree_view_vertical_autoscroll (GtkTreeView *tree_view)
        return;
     }
 
-  gtk_adjustment_set_value (tree_view->priv->vadjustment,
-                            MAX (tree_view->priv->vadjustment->value + offset, 0.0));
+  value = CLAMP (tree_view->priv->vadjustment->value + offset, 0.0,
+                tree_view->priv->vadjustment->upper - tree_view->priv->vadjustment->page_size);
+  gtk_adjustment_set_value (tree_view->priv->vadjustment, value);
 }
 
 static gboolean
@@ -3638,6 +3637,7 @@ gtk_tree_view_horizontal_autoscroll (GtkTreeView *tree_view)
   GdkRectangle visible_rect;
   gint x;
   gint offset;
+  gfloat value;
 
   gdk_window_get_pointer (tree_view->priv->bin_window, &x, NULL, NULL);
 
@@ -3653,8 +3653,9 @@ gtk_tree_view_horizontal_autoscroll (GtkTreeView *tree_view)
     }
   offset = offset/3;
 
-  gtk_adjustment_set_value (tree_view->priv->hadjustment,
-                            MAX (tree_view->priv->hadjustment->value + offset, 0.0));
+  value = CLAMP (tree_view->priv->hadjustment->value + offset,
+                0.0, tree_view->priv->hadjustment->upper - tree_view->priv->hadjustment->page_size);
+  gtk_adjustment_set_value (tree_view->priv->hadjustment, value);
 
   return TRUE;
 
@@ -4571,69 +4572,6 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
                               background_area.y + max_height);
            }
 
-         if (gtk_tree_view_is_expander_column (tree_view, column) &&
-             tree_view->priv->tree_lines_enabled)
-           {
-             if ((node->flags & GTK_RBNODE_IS_PARENT) == GTK_RBNODE_IS_PARENT
-                 && depth > 1)
-               {
-                 gdk_draw_line (event->window,
-                                tree_view->priv->tree_line_gc,
-                                background_area.x + tree_view->priv->expander_size * (depth - 1.5),
-                                background_area.y + background_area.height / 2,
-                                background_area.x + tree_view->priv->expander_size * (depth - 1.1),
-                                background_area.y + background_area.height / 2);
-               }
-             else if (depth > 1)
-               {
-                 gdk_draw_line (event->window,
-                                tree_view->priv->tree_line_gc,
-                                background_area.x + tree_view->priv->expander_size * (depth - 1.5),
-                                background_area.y + background_area.height / 2,
-                                background_area.x + tree_view->priv->expander_size * (depth - 0.5),
-                                background_area.y + background_area.height / 2);
-               }
-
-             if (depth > 1)
-               {
-                 gint i;
-                 GtkRBNode *tmp_node;
-                 GtkRBTree *tmp_tree;
-
-                 if (!_gtk_rbtree_next (tree, node))
-                   gdk_draw_line (event->window,
-                                  tree_view->priv->tree_line_gc,
-                                  background_area.x + tree_view->priv->expander_size * (depth - 1.5),
-                                  background_area.y,
-                                  background_area.x + tree_view->priv->expander_size * (depth - 1.5),
-                                  background_area.y + background_area.height / 2);
-                 else
-                   gdk_draw_line (event->window,
-                                  tree_view->priv->tree_line_gc,
-                                  background_area.x + tree_view->priv->expander_size * (depth - 1.5),
-                                  background_area.y,
-                                  background_area.x + tree_view->priv->expander_size * (depth - 1.5),
-                                  background_area.y + background_area.height);
-
-                 tmp_node = tree->parent_node;
-                 tmp_tree = tree->parent_tree;
-
-                 for (i = depth - 2; i > 0; i--)
-                   {
-                     if (_gtk_rbtree_next (tmp_tree, tmp_node))
-                       gdk_draw_line (event->window,
-                                      tree_view->priv->tree_line_gc,
-                                      background_area.x + tree_view->priv->expander_size * (i - 0.5),
-                                      background_area.y,
-                                      background_area.x + tree_view->priv->expander_size * (i - 0.5),
-                                      background_area.y + background_area.height);
-
-                     tmp_node = tmp_tree->parent_node;
-                     tmp_tree = tmp_tree->parent_tree;
-                   }
-               }
-           }
-
          if (gtk_tree_view_is_expander_column (tree_view, column))
            {
              if (!rtl)
@@ -4707,6 +4645,79 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
                                                   &event->area,
                                                   flags);
            }
+
+         if (gtk_tree_view_is_expander_column (tree_view, column) &&
+             tree_view->priv->tree_lines_enabled)
+           {
+             gint x = background_area.x;
+             gint mult = rtl ? -1 : 1;
+             gint y0 = background_area.y;
+             gint y1 = background_area.y + background_area.height/2;
+             gint y2 = background_area.y + background_area.height;
+
+             if (rtl)
+               x += background_area.width - 1;
+
+             if ((node->flags & GTK_RBNODE_IS_PARENT) == GTK_RBNODE_IS_PARENT
+                 && depth > 1)
+               {
+                 gdk_draw_line (event->window,
+                                tree_view->priv->tree_line_gc,
+                                x + tree_view->priv->expander_size * (depth - 1.5) * mult,
+                                y1,
+                                x + tree_view->priv->expander_size * (depth - 1.1) * mult,
+                                y1);
+               }
+             else if (depth > 1)
+               {
+                 gdk_draw_line (event->window,
+                                tree_view->priv->tree_line_gc,
+                                x + tree_view->priv->expander_size * (depth - 1.5) * mult,
+                                y1,
+                                x + tree_view->priv->expander_size * (depth - 0.5) * mult,
+                                y1);
+               }
+
+             if (depth > 1)
+               {
+                 gint i;
+                 GtkRBNode *tmp_node;
+                 GtkRBTree *tmp_tree;
+
+                 if (!_gtk_rbtree_next (tree, node))
+                   gdk_draw_line (event->window,
+                                  tree_view->priv->tree_line_gc,
+                                  x + tree_view->priv->expander_size * (depth - 1.5) * mult,
+                                  y0,
+                                  x + tree_view->priv->expander_size * (depth - 1.5) * mult,
+                                  y1);
+                 else
+                   gdk_draw_line (event->window,
+                                  tree_view->priv->tree_line_gc,
+                                  x + tree_view->priv->expander_size * (depth - 1.5) * mult,
+                                  y0,
+                                  x + tree_view->priv->expander_size * (depth - 1.5) * mult,
+                                  y2);
+
+                 tmp_node = tree->parent_node;
+                 tmp_tree = tree->parent_tree;
+
+                 for (i = depth - 2; i > 0; i--)
+                   {
+                     if (_gtk_rbtree_next (tmp_tree, tmp_node))
+                       gdk_draw_line (event->window,
+                                      tree_view->priv->tree_line_gc,
+                                      x + tree_view->priv->expander_size * (i - 0.5) * mult,
+                                      y0,
+                                      x + tree_view->priv->expander_size * (i - 0.5) * mult,
+                                      y2);
+
+                     tmp_node = tmp_tree->parent_node;
+                     tmp_tree = tmp_tree->parent_tree;
+                   }
+               }
+           }
+
          if (node == cursor && has_special_cell &&
              ((column == tree_view->priv->focus_column &&
                GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS) &&
@@ -4720,6 +4731,7 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
                                                     &event->area,
                                                     flags);
            }
+
          cell_offset += column->width;
        }
 
@@ -5026,7 +5038,7 @@ gtk_tree_view_get_drop_column (GtkTreeView       *tree_view,
            if (!tree_view->priv->column_drop_func)
              return left_column;
 
-           if (!(*tree_view->priv->column_drop_func) (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
+           if (!tree_view->priv->column_drop_func (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
              {
                left_column = cur_column;
                continue;
@@ -5038,7 +5050,7 @@ gtk_tree_view_get_drop_column (GtkTreeView       *tree_view,
        if (!tree_view->priv->column_drop_func)
          return left_column;
 
-       if ((*tree_view->priv->column_drop_func) (tree_view, column, left_column, NULL, tree_view->priv->column_drop_func_data))
+       if (tree_view->priv->column_drop_func (tree_view, column, left_column, NULL, tree_view->priv->column_drop_func_data))
          return left_column;
        else
          return (GtkTreeViewColumn *)0x1;
@@ -5077,7 +5089,7 @@ gtk_tree_view_get_drop_column (GtkTreeView       *tree_view,
            if (!tree_view->priv->column_drop_func)
              return left_column;
 
-           if (!(*tree_view->priv->column_drop_func) (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
+           if (!tree_view->priv->column_drop_func (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
              {
                left_column = cur_column;
                continue;
@@ -5089,7 +5101,7 @@ gtk_tree_view_get_drop_column (GtkTreeView       *tree_view,
        if (!tree_view->priv->column_drop_func)
          return left_column;
 
-       if ((*tree_view->priv->column_drop_func) (tree_view, column, left_column, NULL, tree_view->priv->column_drop_func_data))
+       if (tree_view->priv->column_drop_func (tree_view, column, left_column, NULL, tree_view->priv->column_drop_func_data))
          return left_column;
        else
          return (GtkTreeViewColumn *)0x1;
@@ -5135,7 +5147,7 @@ gtk_tree_view_get_drop_column (GtkTreeView       *tree_view,
            if (!tree_view->priv->column_drop_func)
              return left_column;
 
-           if ((*tree_view->priv->column_drop_func) (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
+           if (tree_view->priv->column_drop_func (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
              return left_column;
 
            cur_column = left_column;
@@ -5145,7 +5157,7 @@ gtk_tree_view_get_drop_column (GtkTreeView       *tree_view,
        if (!tree_view->priv->column_drop_func)
          return NULL;
 
-       if ((*tree_view->priv->column_drop_func) (tree_view, column, NULL, cur_column, tree_view->priv->column_drop_func_data))
+       if (tree_view->priv->column_drop_func (tree_view, column, NULL, cur_column, tree_view->priv->column_drop_func_data))
          return NULL;
        else
          return (GtkTreeViewColumn *)0x1;
@@ -5174,7 +5186,7 @@ gtk_tree_view_get_drop_column (GtkTreeView       *tree_view,
            if (!tree_view->priv->column_drop_func)
              return left_column;
 
-           if ((*tree_view->priv->column_drop_func) (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
+           if (tree_view->priv->column_drop_func (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
              return left_column;
 
            cur_column = left_column;
@@ -5184,7 +5196,7 @@ gtk_tree_view_get_drop_column (GtkTreeView       *tree_view,
        if (!tree_view->priv->column_drop_func)
          return NULL;
 
-       if ((*tree_view->priv->column_drop_func) (tree_view, column, NULL, cur_column, tree_view->priv->column_drop_func_data))
+       if (tree_view->priv->column_drop_func (tree_view, column, NULL, cur_column, tree_view->priv->column_drop_func_data))
          return NULL;
        else
          return (GtkTreeViewColumn *)0x1;
@@ -5357,6 +5369,12 @@ gtk_tree_view_key_press (GtkWidget   *widget,
   if (GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->key_press_event (widget, event))
     return TRUE;
 
+  if (tree_view->priv->search_entry_avoid_unhandled_binding)
+    {
+      tree_view->priv->search_entry_avoid_unhandled_binding = FALSE;
+      return FALSE;
+    }
+
   /* We pass the event to the search_entry.  If its text changes, then we start
    * the typeahead find capabilities. */
   if (GTK_WIDGET_HAS_FOCUS (tree_view)
@@ -5435,7 +5453,7 @@ gtk_tree_view_key_release (GtkWidget   *widget,
   if (tree_view->priv->rubber_band_status)
     return TRUE;
 
-  return (* GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->key_release_event) (widget, event);
+  return GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->key_release_event (widget, event);
 }
 
 /* FIXME Is this function necessary? Can I get an enter_notify event
@@ -5457,6 +5475,12 @@ gtk_tree_view_enter_notify (GtkWidget        *widget,
   if (tree_view->priv->tree == NULL)
     return FALSE;
 
+  if (event->mode == GDK_CROSSING_GRAB ||
+      event->mode == GDK_CROSSING_GTK_GRAB ||
+      event->mode == GDK_CROSSING_GTK_UNGRAB ||
+      event->mode == GDK_CROSSING_STATE_CHANGED)
+    return TRUE;
+
   /* find the node internally */
   new_y = TREE_WINDOW_Y_TO_RBTREE_Y(tree_view, event->y);
   if (new_y < 0)
@@ -5966,16 +5990,24 @@ validate_visible_area (GtkTreeView *tree_view)
   while (area_above > 0)
     {
       _gtk_rbtree_prev_full (tree, node, &tree, &node);
-      if (! gtk_tree_path_prev (above_path) && node != NULL)
-       {
-         gtk_tree_path_free (above_path);
-         above_path = _gtk_tree_view_find_path (tree_view, tree, node);
-       }
-      gtk_tree_model_get_iter (tree_view->priv->model, &iter, above_path);
+
+      /* Always find the new path in the tree.  We cannot just assume
+       * a gtk_tree_path_prev() is enough here, as there might be children
+       * in between this node and the previous sibling node.  If this
+       * appears to be a performance hotspot in profiles, we can look into
+       * intrigate logic for keeping path, node and iter in sync like
+       * we do for forward walks.  (Which will be hard because of the lacking
+       * iter_prev).
+       */
 
       if (node == NULL)
        break;
 
+      gtk_tree_path_free (above_path);
+      above_path = _gtk_tree_view_find_path (tree_view, tree, node);
+
+      gtk_tree_model_get_iter (tree_view->priv->model, &iter, above_path);
+
       if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID) ||
          GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_COLUMN_INVALID))
        {
@@ -6092,6 +6124,7 @@ do_validate_rows (GtkTreeView *tree_view, gboolean queue_resize)
   gint retval = TRUE;
   GtkTreePath *path = NULL;
   GtkTreeIter iter;
+  GTimer *timer;
   gint i = 0;
 
   gint prev_height = -1;
@@ -6110,6 +6143,9 @@ do_validate_rows (GtkTreeView *tree_view, gboolean queue_resize)
       return FALSE;
     }
 
+  timer = g_timer_new ();
+  g_timer_start (timer);
+
   do
     {
       if (! GTK_RBNODE_FLAG_SET (tree_view->priv->tree->root, GTK_RBNODE_DESCENDANTS_INVALID))
@@ -6187,7 +6223,7 @@ do_validate_rows (GtkTreeView *tree_view, gboolean queue_resize)
 
       i++;
     }
-  while (i < GTK_TREE_VIEW_NUM_ROWS_PER_IDLE);
+  while (g_timer_elapsed (timer, NULL) < GTK_TREE_VIEW_TIME_MS_PER_IDLE / 1000.);
 
   if (!tree_view->priv->fixed_height_check)
    {
@@ -6212,10 +6248,11 @@ do_validate_rows (GtkTreeView *tree_view, gboolean queue_resize)
       gtk_adjustment_changed (tree_view->priv->vadjustment);
 
       if (queue_resize)
-        gtk_widget_queue_resize_no_redraw (GTK_WIDGET (tree_view));
+        gtk_widget_queue_resize (GTK_WIDGET (tree_view));
     }
 
   if (path) gtk_tree_path_free (path);
+  g_timer_destroy (timer);
 
   return retval;
 }
@@ -7691,7 +7728,7 @@ gtk_tree_view_header_focus (GtkTreeView      *tree_view,
     case GTK_DIR_DOWN:
       if (focus_child == NULL)
        {
-         if (tree_view->priv->focus_column != NULL)
+         if (tree_view->priv->focus_column != NULL && GTK_WIDGET_CAN_FOCUS (tree_view->priv->focus_column->button))
            focus_child = tree_view->priv->focus_column->button;
          else
            focus_child = GTK_TREE_VIEW_COLUMN (first_column->data)->button;
@@ -7839,7 +7876,7 @@ gtk_tree_view_focus (GtkWidget        *widget,
   GtkContainer *container = GTK_CONTAINER (widget);
   GtkWidget *focus_child;
 
-  if (!GTK_WIDGET_IS_SENSITIVE (container))
+  if (!GTK_WIDGET_IS_SENSITIVE (container) || !GTK_WIDGET_CAN_FOCUS (widget))
     return FALSE;
 
   focus_child = container->focus_child;
@@ -7889,7 +7926,7 @@ gtk_tree_view_focus (GtkWidget        *widget,
 static void
 gtk_tree_view_grab_focus (GtkWidget *widget)
 {
-  (* GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->grab_focus) (widget);
+  GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->grab_focus (widget);
 
   gtk_tree_view_focus_to_cursor (GTK_TREE_VIEW (widget));
 }
@@ -8471,7 +8508,7 @@ gtk_tree_view_row_deleted (GtkTreeModel *model,
       gint child_count = 0;
       if (node->children)
        _gtk_rbtree_traverse (node->children, node->children->root, G_POST_ORDER, count_children_helper, &child_count);
-      (* tree_view->priv->destroy_count_func) (tree_view, path, child_count, tree_view->priv->destroy_count_data);
+      tree_view->priv->destroy_count_func (tree_view, path, child_count, tree_view->priv->destroy_count_data);
     }
 
   if (tree->root->count == 1)
@@ -8731,133 +8768,6 @@ gtk_tree_view_build_tree (GtkTreeView *tree_view,
     gtk_tree_path_free (path);
 }
 
-/* If height is non-NULL, then we set it to be the new height.  if it's all
- * dirty, then height is -1.  We know we'll remeasure dirty rows, anyways.
- */
-static gboolean
-gtk_tree_view_discover_dirty_iter (GtkTreeView *tree_view,
-                                  GtkTreeIter *iter,
-                                  gint         depth,
-                                  gint        *height,
-                                  GtkRBNode   *node)
-{
-  GtkTreeViewColumn *column;
-  GList *list;
-  gboolean retval = FALSE;
-  gint tmpheight;
-  gint horizontal_separator;
-
-  gtk_widget_style_get (GTK_WIDGET (tree_view),
-                       "horizontal-separator", &horizontal_separator,
-                       NULL);
-
-  if (height)
-    *height = -1;
-
-  for (list = tree_view->priv->columns; list; list = list->next)
-    {
-      gint width;
-      column = list->data;
-      if (column->dirty == TRUE)
-       continue;
-      if (height == NULL && column->column_type == GTK_TREE_VIEW_COLUMN_FIXED)
-       continue;
-      if (!column->visible)
-       continue;
-
-      gtk_tree_view_column_cell_set_cell_data (column, tree_view->priv->model, iter,
-                                              GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT),
-                                              node->children?TRUE:FALSE);
-
-      if (height)
-       {
-         gtk_tree_view_column_cell_get_size (column,
-                                             NULL, NULL, NULL,
-                                             &width, &tmpheight);
-         *height = MAX (*height, tmpheight);
-       }
-      else
-       {
-         gtk_tree_view_column_cell_get_size (column,
-                                             NULL, NULL, NULL,
-                                             &width, NULL);
-       }
-
-      if (gtk_tree_view_is_expander_column (tree_view, column))
-       {
-         int tmp = 0;
-
-         tmp = horizontal_separator + width + (depth - 1) * tree_view->priv->level_indentation;
-         if (TREE_VIEW_DRAW_EXPANDERS (tree_view))
-           tmp += depth * tree_view->priv->expander_size;
-
-         if (tmp > column->requested_width)
-           {
-             _gtk_tree_view_column_cell_set_dirty (column, TRUE);
-             retval = TRUE;
-           }
-       }
-      else
-       {
-         if (horizontal_separator + width > column->requested_width)
-           {
-             _gtk_tree_view_column_cell_set_dirty (column, TRUE);
-             retval = TRUE;
-           }
-       }
-    }
-
-  return retval;
-}
-
-static void
-gtk_tree_view_discover_dirty (GtkTreeView *tree_view,
-                             GtkRBTree   *tree,
-                             GtkTreeIter *iter,
-                             gint         depth)
-{
-  GtkRBNode *temp = tree->root;
-  GtkTreeViewColumn *column;
-  GList *list;
-  GtkTreeIter child;
-  gboolean is_all_dirty;
-
-  TREE_VIEW_INTERNAL_ASSERT_VOID (tree != NULL);
-
-  while (temp->left != tree->nil)
-    temp = temp->left;
-
-  do
-    {
-      TREE_VIEW_INTERNAL_ASSERT_VOID (temp != NULL);
-      is_all_dirty = TRUE;
-      for (list = tree_view->priv->columns; list; list = list->next)
-       {
-         column = list->data;
-         if (column->dirty == FALSE)
-           {
-             is_all_dirty = FALSE;
-             break;
-           }
-       }
-
-      if (is_all_dirty)
-       return;
-
-      gtk_tree_view_discover_dirty_iter (tree_view,
-                                        iter,
-                                        depth,
-                                        NULL,
-                                        temp);
-      if (gtk_tree_model_iter_children (tree_view->priv->model, &child, iter) &&
-         temp->children != NULL)
-       gtk_tree_view_discover_dirty (tree_view, temp->children, &child, depth + 1);
-      temp = _gtk_rbtree_next (tree, temp);
-    }
-  while (gtk_tree_model_iter_next (tree_view->priv->model, iter));
-}
-
-
 /* Make sure the node is visible vertically */
 static void
 gtk_tree_view_clamp_node_visible (GtkTreeView *tree_view,
@@ -8948,7 +8858,11 @@ gtk_tree_view_clamp_column_visible (GtkTreeView       *tree_view,
            }
        }
 
-      gtk_adjustment_set_value (tree_view->priv->hadjustment, x);
+      gtk_adjustment_set_value (tree_view->priv->hadjustment,
+                               CLAMP (x,
+                                      tree_view->priv->hadjustment->lower,
+                                      tree_view->priv->hadjustment->upper
+                                      - tree_view->priv->hadjustment->page_size));
     }
   else
     {
@@ -9087,13 +9001,13 @@ gtk_tree_view_add_move_binding (GtkBindingSet  *binding_set,
 {
   
   gtk_binding_entry_add_signal (binding_set, keyval, modmask,
-                                "move_cursor", 2,
+                                "move-cursor", 2,
                                 G_TYPE_ENUM, step,
                                 G_TYPE_INT, count);
 
   if (add_shifted_binding)
     gtk_binding_entry_add_signal (binding_set, keyval, GDK_SHIFT_MASK,
-                                 "move_cursor", 2,
+                                 "move-cursor", 2,
                                  G_TYPE_ENUM, step,
                                  G_TYPE_INT, count);
 
@@ -9101,12 +9015,12 @@ gtk_tree_view_add_move_binding (GtkBindingSet  *binding_set,
    return;
 
   gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
-                                "move_cursor", 2,
+                                "move-cursor", 2,
                                 G_TYPE_ENUM, step,
                                 G_TYPE_INT, count);
 
   gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK,
-                                "move_cursor", 2,
+                                "move-cursor", 2,
                                 G_TYPE_ENUM, step,
                                 G_TYPE_INT, count);
 }
@@ -9210,7 +9124,7 @@ gtk_tree_view_set_column_drag_info (GtkTreeView       *tree_view,
       /* If it's not the column moving and func tells us to skip over the column, we continue. */
       if (left_column != column && cur_column != column &&
          tree_view->priv->column_drop_func &&
-         ! (* tree_view->priv->column_drop_func) (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
+         ! tree_view->priv->column_drop_func (tree_view, column, left_column, cur_column, tree_view->priv->column_drop_func_data))
        {
          left_column = cur_column;
          continue;
@@ -9225,7 +9139,7 @@ gtk_tree_view_set_column_drag_info (GtkTreeView       *tree_view,
   /* Add the last one */
   if (tree_view->priv->column_drop_func == NULL ||
       ((left_column != column) &&
-       (* tree_view->priv->column_drop_func) (tree_view, column, left_column, NULL, tree_view->priv->column_drop_func_data)))
+       tree_view->priv->column_drop_func (tree_view, column, left_column, NULL, tree_view->priv->column_drop_func_data)))
     {
       reorder = g_slice_new0 (GtkTreeViewColumnReorder);
       reorder->left_column = left_column;
@@ -9833,6 +9747,8 @@ gtk_tree_view_move_cursor_page_up_down (GtkTreeView *tree_view,
   if (!gtk_tree_path_compare (old_cursor_path, cursor_path))
     gtk_widget_error_bell (GTK_WIDGET (tree_view));
 
+  gtk_widget_grab_focus (GTK_WIDGET (tree_view));
+
 cleanup:
   gtk_tree_path_free (old_cursor_path);
   gtk_tree_path_free (cursor_path);
@@ -9927,6 +9843,7 @@ gtk_tree_view_move_cursor_left_right (GtkTreeView *tree_view,
                                        cursor_node,
                                        NULL);
       g_signal_emit (tree_view, tree_view_signals[CURSOR_CHANGED], 0);
+      gtk_widget_grab_focus (GTK_WIDGET (tree_view));
     }
   else
     {
@@ -9992,6 +9909,7 @@ gtk_tree_view_move_cursor_start_end (GtkTreeView *tree_view,
   if (gtk_tree_path_compare (old_path, path))
     {
       gtk_tree_view_real_set_cursor (tree_view, path, TRUE, TRUE);
+      gtk_widget_grab_focus (GTK_WIDGET (tree_view));
     }
   else
     {
@@ -10207,27 +10125,21 @@ gtk_tree_view_real_select_cursor_parent (GtkTreeView *tree_view)
   GdkModifierType state;
 
   if (! GTK_WIDGET_HAS_FOCUS (tree_view))
-    return FALSE;
+    goto out;
 
   cursor_path = NULL;
   if (tree_view->priv->cursor)
     cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
 
   if (cursor_path == NULL)
-    return FALSE;
+    goto out;
 
   _gtk_tree_view_find_node (tree_view, cursor_path,
                            &cursor_tree, &cursor_node);
   if (cursor_tree == NULL)
     {
       gtk_tree_path_free (cursor_path);
-      return FALSE;
-    }
-
-  if (gtk_get_current_event_state (&state))
-    {
-      if ((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
-        tree_view->priv->ctrl_pressed = TRUE;
+      goto out;
     }
 
   if (cursor_tree->parent_node)
@@ -10238,19 +10150,30 @@ gtk_tree_view_real_select_cursor_parent (GtkTreeView *tree_view)
 
       gtk_tree_path_up (cursor_path);
 
+      if (gtk_get_current_event_state (&state))
+       {
+         if ((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
+           tree_view->priv->ctrl_pressed = TRUE;
+       }
+
       gtk_tree_view_real_set_cursor (tree_view, cursor_path, TRUE, FALSE);
-    }
+      gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
 
-  gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
+      gtk_widget_grab_focus (GTK_WIDGET (tree_view));
+      gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL);
+      gtk_tree_path_free (cursor_path);
 
-  gtk_widget_grab_focus (GTK_WIDGET (tree_view));
-  gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL);
-  gtk_tree_path_free (cursor_path);
+      tree_view->priv->ctrl_pressed = FALSE;
 
-  tree_view->priv->ctrl_pressed = FALSE;
+      return TRUE;
+    }
 
-  return TRUE;
+ out:
+
+  tree_view->priv->search_entry_avoid_unhandled_binding = TRUE;
+  return FALSE;
 }
+
 static gboolean
 gtk_tree_view_search_entry_flush_timeout (GtkTreeView *tree_view)
 {
@@ -10290,11 +10213,13 @@ static void
 gtk_tree_view_ensure_interactive_directory (GtkTreeView *tree_view)
 {
   GtkWidget *frame, *vbox, *toplevel;
+  GdkScreen *screen;
 
   if (tree_view->priv->search_custom_entry_set)
     return;
 
   toplevel = gtk_widget_get_toplevel (GTK_WIDGET (tree_view));
+  screen = gtk_widget_get_screen (GTK_WIDGET (tree_view));
 
    if (tree_view->priv->search_window != NULL)
      {
@@ -10304,10 +10229,12 @@ gtk_tree_view_ensure_interactive_directory (GtkTreeView *tree_view)
        else if (GTK_WINDOW (tree_view->priv->search_window)->group)
         gtk_window_group_remove_window (GTK_WINDOW (tree_view->priv->search_window)->group,
                                         GTK_WINDOW (tree_view->priv->search_window));
+       gtk_window_set_screen (GTK_WINDOW (tree_view->priv->search_window), screen);
        return;
      }
    
   tree_view->priv->search_window = gtk_window_new (GTK_WINDOW_POPUP);
+  gtk_window_set_screen (GTK_WINDOW (tree_view->priv->search_window), screen);
 
   if (GTK_WINDOW (toplevel)->group)
     gtk_window_group_add_window (GTK_WINDOW (toplevel)->group,
@@ -10604,6 +10531,9 @@ gtk_tree_view_adjustment_changed (GtkAdjustment *adjustment,
           if (!tree_view->priv->in_top_row_to_dy)
             gtk_tree_view_dy_to_top_row (tree_view);
        }
+
+      gdk_window_process_updates (tree_view->priv->header_window, TRUE);
+      gdk_window_process_updates (tree_view->priv->bin_window, TRUE);
     }
 }
 
@@ -10673,9 +10603,7 @@ gtk_tree_view_set_model (GtkTreeView  *tree_view,
                         GtkTreeModel *model)
 {
   g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
-
-  if (model != NULL)
-    g_return_if_fail (GTK_IS_TREE_MODEL (model));
+  g_return_if_fail (model == NULL || GTK_IS_TREE_MODEL (model));
 
   if (model == tree_view->priv->model)
     return;
@@ -11487,8 +11415,7 @@ gtk_tree_view_set_expander_column (GtkTreeView       *tree_view,
                                    GtkTreeViewColumn *column)
 {
   g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
-  if (column != NULL)
-    g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (column));
+  g_return_if_fail (column == NULL || GTK_IS_TREE_VIEW_COLUMN (column));
 
   if (tree_view->priv->expander_column != column)
     {
@@ -11557,7 +11484,7 @@ gtk_tree_view_set_column_drag_function (GtkTreeView               *tree_view,
   g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
 
   if (tree_view->priv->column_drop_func_data_destroy)
-    (* tree_view->priv->column_drop_func_data_destroy) (tree_view->priv->column_drop_func_data);
+    tree_view->priv->column_drop_func_data_destroy (tree_view->priv->column_drop_func_data);
 
   tree_view->priv->column_drop_func = func;
   tree_view->priv->column_drop_func_data = user_data;
@@ -11593,9 +11520,9 @@ gtk_tree_view_scroll_to_point (GtkTreeView *tree_view,
   vadj = tree_view->priv->vadjustment;
 
   if (tree_x != -1)
-    gtk_adjustment_set_value (hadj, tree_x);
+    gtk_adjustment_set_value (hadj, CLAMP (tree_x, hadj->lower, hadj->upper - hadj->page_size));
   if (tree_y != -1)
-    gtk_adjustment_set_value (vadj, tree_y);
+    gtk_adjustment_set_value (vadj, CLAMP (tree_y, vadj->lower, vadj->upper - vadj->page_size));
 }
 
 /**
@@ -12205,7 +12132,7 @@ gtk_tree_view_real_collapse_row (GtkTreeView *tree_view,
       gtk_tree_path_down (child_path);
       if (node->children)
        _gtk_rbtree_traverse (node->children, node->children->root, G_POST_ORDER, count_children_helper, &child_count);
-      (* tree_view->priv->destroy_count_func) (tree_view, child_path, child_count, tree_view->priv->destroy_count_data);
+      tree_view->priv->destroy_count_func (tree_view, child_path, child_count, tree_view->priv->destroy_count_data);
       gtk_tree_path_free (child_path);
     }
 
@@ -12516,14 +12443,24 @@ gtk_tree_view_real_set_cursor (GtkTreeView     *tree_view,
   gtk_tree_row_reference_free (tree_view->priv->cursor);
   tree_view->priv->cursor = NULL;
 
-  /* One cannot set the cursor on a separator. */
-  if (!row_is_separator (tree_view, NULL, path))
+  /* One cannot set the cursor on a separator.   Also, if
+   * _gtk_tree_view_find_node returns TRUE, it ran out of tree
+   * before finding the tree and node belonging to path.  The
+   * path maps to a non-existing path and we will silently bail out.
+   * We unset tree and node to avoid further processing.
+   */
+  if (!row_is_separator (tree_view, NULL, path)
+      && _gtk_tree_view_find_node (tree_view, path, &tree, &node) == FALSE)
     {
       tree_view->priv->cursor =
-       gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view),
-                                         tree_view->priv->model,
-                                         path);
-      _gtk_tree_view_find_node (tree_view, path, &tree, &node);
+          gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view),
+                                            tree_view->priv->model,
+                                            path);
+    }
+  else
+    {
+      tree = NULL;
+      node = NULL;
     }
 
   if (tree != NULL)
@@ -12613,6 +12550,9 @@ gtk_tree_view_get_cursor (GtkTreeView        *tree_view,
  * This function is often followed by @gtk_widget_grab_focus (@tree_view) 
  * in order to give keyboard focus to the widget.  Please note that editing 
  * can only happen when the widget is realized.
+ *
+ * If @path is invalid for @model, the current cursor (if any) will be unset
+ * and the function will return without failing.
  **/
 void
 gtk_tree_view_set_cursor (GtkTreeView       *tree_view,
@@ -12644,6 +12584,9 @@ gtk_tree_view_set_cursor (GtkTreeView       *tree_view,
  * widget.  Please note that editing can only happen when the widget is
  * realized.
  *
+ * If @path is invalid for @model, the current cursor (if any) will be unset
+ * and the function will return without failing.
+ *
  * Since: 2.2
  **/
 void
@@ -12654,10 +12597,12 @@ gtk_tree_view_set_cursor_on_cell (GtkTreeView       *tree_view,
                                  gboolean           start_editing)
 {
   g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
-  g_return_if_fail (tree_view->priv->tree != NULL);
   g_return_if_fail (path != NULL);
-  if (focus_column)
-    g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (focus_column));
+  g_return_if_fail (focus_column == NULL || GTK_IS_TREE_VIEW_COLUMN (focus_column));
+
+  if (!tree_view->priv->model)
+    return;
+
   if (focus_cell)
     {
       g_return_if_fail (focus_column);
@@ -12730,7 +12675,8 @@ gtk_tree_view_get_bin_window (GtkTreeView *tree_view)
  * with the column at that point.  @cell_x and @cell_y return the coordinates
  * relative to the cell background (i.e. the @background_area passed to
  * gtk_cell_renderer_render()).  This function is only meaningful if
- * @tree_view is realized.
+ * @tree_view is realized.  Therefore this function will always return %FALSE
+ * if @tree_view is not realized or does not have a model.
  *
  * For converting widget coordinates (eg. the ones you get from
  * GtkWidget::query-tooltip), please see
@@ -12752,13 +12698,15 @@ gtk_tree_view_get_path_at_pos (GtkTreeView        *tree_view,
   gint y_offset;
 
   g_return_val_if_fail (tree_view != NULL, FALSE);
-  g_return_val_if_fail (tree_view->priv->bin_window != NULL, FALSE);
 
   if (path)
     *path = NULL;
   if (column)
     *column = NULL;
 
+  if (tree_view->priv->bin_window == NULL)
+    return FALSE;
+
   if (tree_view->priv->tree == NULL)
     return FALSE;
 
@@ -13337,7 +13285,7 @@ unset_reorderable (GtkTreeView *tree_view)
  *    widget
  *
  * Turns @tree_view into a drag source for automatic DND. Calling this
- * method sets reorderable to %FALSE.
+ * method sets #GtkTreeView:reorderable to %FALSE.
  **/
 void
 gtk_tree_view_enable_model_drag_source (GtkTreeView              *tree_view,
@@ -13374,7 +13322,7 @@ gtk_tree_view_enable_model_drag_source (GtkTreeView              *tree_view,
  *    widget
  * 
  * Turns @tree_view into a drop destination for automatic DND. Calling
- * this method sets reorderable to %FALSE.
+ * this method sets #GtkTreeView:reorderable to %FALSE.
  **/
 void
 gtk_tree_view_enable_model_drag_dest (GtkTreeView              *tree_view,
@@ -13404,7 +13352,7 @@ gtk_tree_view_enable_model_drag_dest (GtkTreeView              *tree_view,
  *
  * Undoes the effect of
  * gtk_tree_view_enable_model_drag_source(). Calling this method sets
- * reorderable to %FALSE.
+ * #GtkTreeView:reorderable to %FALSE.
  **/
 void
 gtk_tree_view_unset_rows_drag_source (GtkTreeView *tree_view)
@@ -13436,7 +13384,7 @@ gtk_tree_view_unset_rows_drag_source (GtkTreeView *tree_view)
  *
  * Undoes the effect of
  * gtk_tree_view_enable_model_drag_dest(). Calling this method sets
- * reorderable to %FALSE.
+ * #GtkTreeView:reorderable to %FALSE.
  **/
 void
 gtk_tree_view_unset_rows_drag_dest (GtkTreeView *tree_view)
@@ -13581,9 +13529,12 @@ gtk_tree_view_get_drag_dest_row (GtkTreeView              *tree_view,
  * @pos: Return location for the drop position, or %NULL
  * 
  * Determines the destination row for a given position.  @drag_x and
- * @drag_y are expected to be in widget coordinates.
+ * @drag_y are expected to be in widget coordinates.  This function is only
+ * meaningful if @tree_view is realized.  Therefore this function will always
+ * return %FALSE if @tree_view is not realized or does not have a model.
  * 
- * Return value: whether there is a row at the given position.
+ * Return value: whether there is a row at the given position, %TRUE if this
+ * is indeed the case.
  **/
 gboolean
 gtk_tree_view_get_dest_row_at_pos (GtkTreeView             *tree_view,
@@ -13607,12 +13558,13 @@ gtk_tree_view_get_dest_row_at_pos (GtkTreeView             *tree_view,
   g_return_val_if_fail (tree_view != NULL, FALSE);
   g_return_val_if_fail (drag_x >= 0, FALSE);
   g_return_val_if_fail (drag_y >= 0, FALSE);
-  g_return_val_if_fail (tree_view->priv->bin_window != NULL, FALSE);
-
 
   if (path)
     *path = NULL;
 
+  if (tree_view->priv->bin_window == NULL)
+    return FALSE;
+
   if (tree_view->priv->tree == NULL)
     return FALSE;
 
@@ -13849,7 +13801,7 @@ gtk_tree_view_set_destroy_count_func (GtkTreeView             *tree_view,
   g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
 
   if (tree_view->priv->destroy_count_destroy)
-    (* tree_view->priv->destroy_count_destroy) (tree_view->priv->destroy_count_data);
+    tree_view->priv->destroy_count_destroy (tree_view->priv->destroy_count_data);
 
   tree_view->priv->destroy_count_func = func;
   tree_view->priv->destroy_count_data = data;
@@ -13988,7 +13940,7 @@ gtk_tree_view_set_search_equal_func (GtkTreeView                *tree_view,
   g_return_if_fail (search_equal_func != NULL);
 
   if (tree_view->priv->search_destroy)
-    (* tree_view->priv->search_destroy) (tree_view->priv->search_user_data);
+    tree_view->priv->search_destroy (tree_view->priv->search_user_data);
 
   tree_view->priv->search_equal_func = search_equal_func;
   tree_view->priv->search_user_data = search_user_data;
@@ -14001,7 +13953,7 @@ gtk_tree_view_set_search_equal_func (GtkTreeView                *tree_view,
  * gtk_tree_view_get_search_entry:
  * @tree_view: A #GtkTreeView
  *
- * Returns the GtkEntry which is currently in use as interactive search
+ * Returns the #GtkEntry which is currently in use as interactive search
  * entry for @tree_view.  In case the built-in entry is being used, %NULL
  * will be returned.
  *
@@ -14038,8 +13990,7 @@ gtk_tree_view_set_search_entry (GtkTreeView *tree_view,
                                GtkEntry    *entry)
 {
   g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
-  if (entry != NULL)
-    g_return_if_fail (GTK_IS_ENTRY (entry));
+  g_return_if_fail (entry == NULL || GTK_IS_ENTRY (entry));
 
   if (tree_view->priv->search_custom_entry_set)
     {
@@ -14096,7 +14047,7 @@ gtk_tree_view_set_search_entry (GtkTreeView *tree_view,
  * @data: user data to pass to @func, or %NULL
  * @destroy: Destroy notifier for @data, or %NULL
  *
- * Sets the function to use when positioning the seach dialog.
+ * Sets the function to use when positioning the search dialog.
  *
  * Since: 2.10
  **/
@@ -14109,7 +14060,7 @@ gtk_tree_view_set_search_position_func (GtkTreeView                   *tree_view
   g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
 
   if (tree_view->priv->search_position_destroy)
-    (* tree_view->priv->search_position_destroy) (tree_view->priv->search_position_user_data);
+    tree_view->priv->search_position_destroy (tree_view->priv->search_position_user_data);
 
   tree_view->priv->search_position_func = func;
   tree_view->priv->search_position_user_data = user_data;
@@ -14553,8 +14504,8 @@ gtk_tree_view_search_iter (GtkTreeModel     *model,
             {
               gtk_tree_view_scroll_to_cell (tree_view, path, NULL,
                                            TRUE, 0.5, 0.0);
-             gtk_tree_view_real_set_cursor (tree_view, path, FALSE, TRUE);
               gtk_tree_selection_select_iter (selection, iter);
+              gtk_tree_view_real_set_cursor (tree_view, path, FALSE, TRUE);
 
              if (path)
                gtk_tree_path_free (path);
@@ -14640,7 +14591,6 @@ gtk_tree_view_search_init (GtkWidget   *entry,
                           GtkTreeView *tree_view)
 {
   gint ret;
-  gint len;
   gint count = 0;
   const gchar *text;
   GtkTreeIter iter;
@@ -14651,7 +14601,7 @@ gtk_tree_view_search_init (GtkWidget   *entry,
   g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
 
   text = gtk_entry_get_text (GTK_ENTRY (entry));
-  len = strlen (text);
+
   model = gtk_tree_view_get_model (tree_view);
   selection = gtk_tree_view_get_selection (tree_view);
 
@@ -14667,7 +14617,7 @@ gtk_tree_view_search_init (GtkWidget   *entry,
                       tree_view);
     }
 
-  if (len < 1)
+  if (*text == '\0')
     return;
 
   if (!gtk_tree_model_get_iter_first (model, &iter))
@@ -14913,7 +14863,7 @@ gtk_tree_view_get_hover_selection (GtkTreeView *tree_view)
  * @expand: %TRUE to enable hover selection mode
  *
  * Enables of disables the hover expansion mode of @tree_view.
- * Hover expansion makes rows expand or collaps if the pointer 
+ * Hover expansion makes rows expand or collapse if the pointer 
  * moves over them.
  * 
  * Since: 2.6
@@ -15055,11 +15005,15 @@ gtk_tree_view_set_row_separator_func (GtkTreeView                 *tree_view,
   g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
 
   if (tree_view->priv->row_separator_destroy)
-    (* tree_view->priv->row_separator_destroy) (tree_view->priv->row_separator_data);
+    tree_view->priv->row_separator_destroy (tree_view->priv->row_separator_data);
 
   tree_view->priv->row_separator_func = func;
   tree_view->priv->row_separator_data = data;
   tree_view->priv->row_separator_destroy = destroy;
+
+  /* Have the tree recalculate heights */
+  _gtk_rbtree_mark_invalid (tree_view->priv->tree);
+  gtk_widget_queue_resize (GTK_WIDGET (tree_view));
 }
 
   
@@ -15369,6 +15323,7 @@ gtk_tree_view_get_level_indentation (GtkTreeView *tree_view)
  * @path: a #GtkTreePath
  *
  * Sets the tip area of @tooltip to be the area covered by the row at @path.
+ * See also gtk_tree_view_set_tooltip_column() for a simpler alternative.
  * See also gtk_tooltip_set_tip_area().
  *
  * Since: 2.12
@@ -15402,6 +15357,8 @@ gtk_tree_view_set_tooltip_row (GtkTreeView *tree_view,
  * position.  In such cases @path must be set to the current node under the
  * mouse cursor for this function to operate correctly.
  *
+ * See also gtk_tree_view_set_tooltip_column() for a simpler alternative.
+ *
  * Since: 2.12
  */
 void
@@ -15415,12 +15372,8 @@ gtk_tree_view_set_tooltip_cell (GtkTreeView       *tree_view,
 
   g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
   g_return_if_fail (GTK_IS_TOOLTIP (tooltip));
-
-  if (column)
-    g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (column));
-
-  if (cell)
-    g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
+  g_return_if_fail (column == NULL || GTK_IS_TREE_VIEW_COLUMN (column));
+  g_return_if_fail (cell == NULL || GTK_IS_CELL_RENDERER (cell));
 
   /* Determine x values. */
   if (column && cell)