=== modified file 'gtk/gtktreeprivate.h' --- gtk/gtktreeprivate.h 2010-03-19 08:48:31 +0000 +++ gtk/gtktreeprivate.h 2010-03-19 09:03:35 +0000 @@ -263,6 +263,7 @@ guint fixed_height_mode : 1; guint fixed_height_check : 1; + guint ubuntu_almost_fixed_height_mode : 1; guint reorderable : 1; guint header_has_focus : 1; === modified file 'gtk/gtktreeview.c' --- gtk/gtktreeview.c 2010-03-19 08:48:31 +0000 +++ gtk/gtktreeview.c 2010-03-19 09:00:54 +0000 @@ -137,6 +137,7 @@ PROP_ENABLE_SEARCH, PROP_SEARCH_COLUMN, PROP_FIXED_HEIGHT_MODE, + PROP_UBUNTU_ALMOST_FIXED_HEIGHT_MODE, PROP_HOVER_SELECTION, PROP_HOVER_EXPAND, PROP_SHOW_EXPANDERS, @@ -658,6 +659,15 @@ P_("Speeds up GtkTreeView by assuming that all rows have the same height"), FALSE, GTK_PARAM_READWRITE)); + + /* Private ubuntu extension to fix bugzilla bug #607447 */ + g_object_class_install_property (o_class, + PROP_UBUNTU_ALMOST_FIXED_HEIGHT_MODE, + g_param_spec_boolean ("ubuntu-almost-fixed-height-mode", + "Private Ubuntu extension", + "Private Ubuntu extension", + FALSE, + GTK_PARAM_READWRITE)); /** * GtkTreeView:hover-selection: @@ -1350,6 +1360,7 @@ tree_view->priv->fixed_height = -1; tree_view->priv->fixed_height_mode = FALSE; tree_view->priv->fixed_height_check = 0; + tree_view->priv->ubuntu_almost_fixed_height_mode = FALSE; gtk_tree_view_set_adjustments (tree_view, NULL, NULL); tree_view->priv->selection = _gtk_tree_selection_new_with_tree_view (tree_view); tree_view->priv->enable_search = TRUE; @@ -1432,6 +1443,9 @@ case PROP_FIXED_HEIGHT_MODE: gtk_tree_view_set_fixed_height_mode (tree_view, g_value_get_boolean (value)); break; + case PROP_UBUNTU_ALMOST_FIXED_HEIGHT_MODE: + tree_view->priv->ubuntu_almost_fixed_height_mode = g_value_get_boolean (value); + break; case PROP_HOVER_SELECTION: tree_view->priv->hover_selection = g_value_get_boolean (value); break; @@ -8297,7 +8311,15 @@ if (tree == NULL) goto done; - if (tree_view->priv->fixed_height_mode + if (tree_view->priv->ubuntu_almost_fixed_height_mode + && tree_view->priv->fixed_height >= 0) + { + _gtk_rbtree_node_mark_invalid (tree, node); + validate_visible_area (tree_view); + if (gtk_widget_get_realized (GTK_WIDGET (tree_view))) + gtk_tree_view_node_queue_redraw (tree_view, tree, node); + } + else if (tree_view->priv->fixed_height_mode && tree_view->priv->fixed_height >= 0) { _gtk_rbtree_node_set_height (tree, node, tree_view->priv->fixed_height); @@ -9570,7 +9592,8 @@ if (cursor_path) { - if (tree_view->priv->selection->type == GTK_SELECTION_MULTIPLE) + if (tree_view->priv->selection->type == GTK_SELECTION_MULTIPLE || + tree_view->priv->selection->type == GTK_SELECTION_SINGLE) gtk_tree_view_real_set_cursor (tree_view, cursor_path, FALSE, FALSE); else gtk_tree_view_real_set_cursor (tree_view, cursor_path, TRUE, FALSE);