mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-18 17:30:10 +00:00
treeview: Replace cursor handling by keeping the node
Previously the code used a GtkTreeRowReference, which was (a) less performant and more importantly (b) hiding errors. The errors being hidden were the referenced row becoming invalid or collapsed, because such rows would not be valid cursor rows and it would be necesary to select a new row and emit a "cursor-changed" signal. So if a crash bisects down to this commit, it is very likely that the cursor has not correctly been updated and the cursor row is invalid.
This commit is contained in:
parent
2a59265df1
commit
e01af5c5c9
@ -317,7 +317,8 @@ struct _GtkTreeViewPrivate
|
||||
gint cursor_offset;
|
||||
|
||||
GtkTreeRowReference *anchor;
|
||||
GtkTreeRowReference *cursor;
|
||||
GtkRBNode *cursor_node;
|
||||
GtkRBTree *cursor_tree;
|
||||
|
||||
GtkTreeViewColumn *focus_column;
|
||||
|
||||
@ -2055,9 +2056,6 @@ gtk_tree_view_destroy (GtkWidget *widget)
|
||||
tree_view->priv->destroy_count_data = NULL;
|
||||
}
|
||||
|
||||
gtk_tree_row_reference_free (tree_view->priv->cursor);
|
||||
tree_view->priv->cursor = NULL;
|
||||
|
||||
gtk_tree_row_reference_free (tree_view->priv->anchor);
|
||||
tree_view->priv->anchor = NULL;
|
||||
|
||||
@ -4678,8 +4676,6 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
|
||||
GtkRBTree *tree;
|
||||
GList *list;
|
||||
GtkRBNode *node;
|
||||
GtkRBNode *cursor = NULL;
|
||||
GtkRBTree *cursor_tree = NULL;
|
||||
GtkRBNode *drag_highlight = NULL;
|
||||
GtkRBTree *drag_highlight_tree = NULL;
|
||||
GtkTreeIter iter;
|
||||
@ -4695,7 +4691,6 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
|
||||
gint expander_cell_width;
|
||||
gint bin_window_width;
|
||||
gint bin_window_height;
|
||||
GtkTreePath *cursor_path;
|
||||
GtkTreePath *drag_dest_path;
|
||||
GList *first_column, *last_column;
|
||||
gint vertical_separator;
|
||||
@ -4766,16 +4761,8 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
|
||||
depth = gtk_tree_path_get_depth (path);
|
||||
gtk_tree_path_free (path);
|
||||
|
||||
cursor_path = NULL;
|
||||
drag_dest_path = NULL;
|
||||
|
||||
if (tree_view->priv->cursor)
|
||||
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
|
||||
if (cursor_path)
|
||||
_gtk_tree_view_find_node (tree_view, cursor_path,
|
||||
&cursor_tree, &cursor);
|
||||
|
||||
if (tree_view->priv->drag_dest_row)
|
||||
drag_dest_path = gtk_tree_row_reference_get_path (tree_view->priv->drag_dest_row);
|
||||
|
||||
@ -4895,7 +4882,7 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
|
||||
else
|
||||
flags &= ~GTK_CELL_RENDERER_SORTED;
|
||||
|
||||
if (cursor == node)
|
||||
if (tree_view->priv->cursor_node == node)
|
||||
flags |= GTK_CELL_RENDERER_FOCUSED;
|
||||
else
|
||||
flags &= ~GTK_CELL_RENDERER_FOCUSED;
|
||||
@ -4984,7 +4971,7 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
|
||||
gtk_style_context_add_region (context, GTK_STYLE_REGION_ROW, row_flags);
|
||||
gtk_style_context_add_region (context, GTK_STYLE_REGION_COLUMN, column_flags);
|
||||
|
||||
if (node == cursor && has_can_focus_cell
|
||||
if (node == tree_view->priv->cursor_node && has_can_focus_cell
|
||||
&& ((column == tree_view->priv->focus_column
|
||||
&& tree_view->priv->draw_keyfocus &&
|
||||
gtk_widget_has_visible_focus (widget))
|
||||
@ -5224,7 +5211,7 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
|
||||
}
|
||||
|
||||
/* draw the big row-spanning focus rectangle, if needed */
|
||||
if (!has_can_focus_cell && node == cursor &&
|
||||
if (!has_can_focus_cell && node == tree_view->priv->cursor_node &&
|
||||
tree_view->priv->draw_keyfocus &&
|
||||
gtk_widget_has_visible_focus (widget))
|
||||
{
|
||||
@ -5317,9 +5304,6 @@ done:
|
||||
if (tree_view->priv->rubber_band_status == RUBBER_BAND_ACTIVE)
|
||||
gtk_tree_view_paint_rubber_band (tree_view, cr);
|
||||
|
||||
if (cursor_path)
|
||||
gtk_tree_path_free (cursor_path);
|
||||
|
||||
if (drag_dest_path)
|
||||
gtk_tree_path_free (drag_dest_path);
|
||||
|
||||
@ -8712,8 +8696,9 @@ gtk_tree_view_row_changed (GtkTreeModel *model,
|
||||
|
||||
g_return_if_fail (path != NULL || iter != NULL);
|
||||
|
||||
if (tree_view->priv->cursor != NULL)
|
||||
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
if (tree_view->priv->cursor_node != NULL)
|
||||
cursor_path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
else
|
||||
cursor_path = NULL;
|
||||
|
||||
@ -10057,8 +10042,9 @@ gtk_tree_view_focus_to_cursor (GtkTreeView *tree_view)
|
||||
return;
|
||||
|
||||
cursor_path = NULL;
|
||||
if (tree_view->priv->cursor)
|
||||
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
if (tree_view->priv->cursor_node)
|
||||
cursor_path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
|
||||
if (cursor_path == NULL)
|
||||
{
|
||||
@ -10085,9 +10071,6 @@ gtk_tree_view_focus_to_cursor (GtkTreeView *tree_view)
|
||||
TRUE, NULL, NULL);
|
||||
}
|
||||
|
||||
gtk_tree_row_reference_free (tree_view->priv->cursor);
|
||||
tree_view->priv->cursor = NULL;
|
||||
|
||||
if (cursor_path)
|
||||
{
|
||||
if (gtk_tree_selection_get_mode (tree_view->priv->selection) == GTK_SELECTION_MULTIPLE)
|
||||
@ -10139,8 +10122,6 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
|
||||
gint count)
|
||||
{
|
||||
gint selection_count;
|
||||
GtkRBTree *cursor_tree = NULL;
|
||||
GtkRBNode *cursor_node = NULL;
|
||||
GtkRBTree *new_cursor_tree = NULL;
|
||||
GtkRBNode *new_cursor_node = NULL;
|
||||
GtkTreePath *cursor_path = NULL;
|
||||
@ -10154,18 +10135,11 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
|
||||
if (! gtk_widget_has_focus (GTK_WIDGET (tree_view)))
|
||||
return;
|
||||
|
||||
cursor_path = NULL;
|
||||
if (!gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
||||
/* FIXME: we lost the cursor; should we get the first? */
|
||||
if (tree_view->priv->cursor_node == NULL)
|
||||
return;
|
||||
|
||||
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
_gtk_tree_view_find_node (tree_view, cursor_path,
|
||||
&cursor_tree, &cursor_node);
|
||||
|
||||
if (cursor_tree == NULL)
|
||||
/* FIXME: we lost the cursor; should we get the first? */
|
||||
return;
|
||||
cursor_path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
|
||||
direction = count < 0 ? GTK_DIR_UP : GTK_DIR_DOWN;
|
||||
|
||||
@ -10179,8 +10153,8 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
|
||||
gtk_tree_view_column_cell_set_cell_data (tree_view->priv->focus_column,
|
||||
tree_view->priv->model,
|
||||
&iter,
|
||||
GTK_RBNODE_FLAG_SET (cursor_node, GTK_RBNODE_IS_PARENT),
|
||||
cursor_node->children?TRUE:FALSE);
|
||||
GTK_RBNODE_FLAG_SET (tree_view->priv->cursor_node, GTK_RBNODE_IS_PARENT),
|
||||
tree_view->priv->cursor_node->children ? TRUE : FALSE);
|
||||
|
||||
/* Save the last cell that had focus, if we hit the end of the view we'll give
|
||||
* focus back to it. */
|
||||
@ -10193,7 +10167,7 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
|
||||
|
||||
selection_count = gtk_tree_selection_count_selected_rows (tree_view->priv->selection);
|
||||
selectable = _gtk_tree_selection_row_is_selectable (tree_view->priv->selection,
|
||||
cursor_node,
|
||||
tree_view->priv->cursor_node,
|
||||
cursor_path);
|
||||
|
||||
if (selection_count == 0
|
||||
@ -10202,16 +10176,16 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
|
||||
&& selectable)
|
||||
{
|
||||
/* Don't move the cursor, but just select the current node */
|
||||
new_cursor_tree = cursor_tree;
|
||||
new_cursor_node = cursor_node;
|
||||
new_cursor_tree = tree_view->priv->cursor_tree;
|
||||
new_cursor_node = tree_view->priv->cursor_node;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (count == -1)
|
||||
_gtk_rbtree_prev_full (cursor_tree, cursor_node,
|
||||
_gtk_rbtree_prev_full (tree_view->priv->cursor_tree, tree_view->priv->cursor_node,
|
||||
&new_cursor_tree, &new_cursor_node);
|
||||
else
|
||||
_gtk_rbtree_next_full (cursor_tree, cursor_node,
|
||||
_gtk_rbtree_next_full (tree_view->priv->cursor_tree, tree_view->priv->cursor_node,
|
||||
&new_cursor_tree, &new_cursor_node);
|
||||
}
|
||||
|
||||
@ -10238,20 +10212,21 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
|
||||
new_cursor_node == NULL)
|
||||
{
|
||||
if (count == -1)
|
||||
_gtk_rbtree_next_full (cursor_tree, cursor_node,
|
||||
_gtk_rbtree_next_full (tree_view->priv->cursor_tree, tree_view->priv->cursor_node,
|
||||
&new_cursor_tree, &new_cursor_node);
|
||||
else
|
||||
_gtk_rbtree_prev_full (cursor_tree, cursor_node,
|
||||
_gtk_rbtree_prev_full (tree_view->priv->cursor_tree, tree_view->priv->cursor_node,
|
||||
&new_cursor_tree, &new_cursor_node);
|
||||
|
||||
if (new_cursor_node == NULL
|
||||
&& !GTK_RBNODE_FLAG_SET (cursor_node, GTK_RBNODE_IS_SELECTED))
|
||||
&& !GTK_RBNODE_FLAG_SET (tree_view->priv->cursor_node, GTK_RBNODE_IS_SELECTED))
|
||||
{
|
||||
new_cursor_node = cursor_node;
|
||||
new_cursor_tree = cursor_tree;
|
||||
new_cursor_node = tree_view->priv->cursor_node;
|
||||
new_cursor_tree = tree_view->priv->cursor_tree;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_cursor_tree = NULL;
|
||||
new_cursor_node = NULL;
|
||||
}
|
||||
}
|
||||
@ -10268,7 +10243,9 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
|
||||
gtk_tree_view_clamp_node_visible (tree_view,
|
||||
tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
|
||||
if (!tree_view->priv->extend_selection_pressed)
|
||||
{
|
||||
@ -10304,12 +10281,12 @@ static void
|
||||
gtk_tree_view_move_cursor_page_up_down (GtkTreeView *tree_view,
|
||||
gint count)
|
||||
{
|
||||
GtkRBTree *cursor_tree = NULL;
|
||||
GtkRBNode *cursor_node = NULL;
|
||||
GtkTreePath *old_cursor_path = NULL;
|
||||
GtkTreePath *cursor_path = NULL;
|
||||
GtkRBTree *start_cursor_tree = NULL;
|
||||
GtkRBNode *start_cursor_node = NULL;
|
||||
GtkRBTree *cursor_tree;
|
||||
GtkRBNode *cursor_node;
|
||||
gint y;
|
||||
gint window_y;
|
||||
gint vertical_separator;
|
||||
@ -10317,25 +10294,15 @@ gtk_tree_view_move_cursor_page_up_down (GtkTreeView *tree_view,
|
||||
if (!gtk_widget_has_focus (GTK_WIDGET (tree_view)))
|
||||
return;
|
||||
|
||||
if (gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
||||
old_cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
else
|
||||
/* This is sorta weird. Focus in should give us a cursor */
|
||||
if (tree_view->priv->cursor_node == NULL)
|
||||
return;
|
||||
|
||||
old_cursor_path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
|
||||
gtk_widget_style_get (GTK_WIDGET (tree_view), "vertical-separator", &vertical_separator, NULL);
|
||||
_gtk_tree_view_find_node (tree_view, old_cursor_path,
|
||||
&cursor_tree, &cursor_node);
|
||||
|
||||
if (cursor_tree == NULL)
|
||||
{
|
||||
/* FIXME: we lost the cursor. Should we try to get one? */
|
||||
gtk_tree_path_free (old_cursor_path);
|
||||
return;
|
||||
}
|
||||
g_return_if_fail (cursor_node != NULL);
|
||||
|
||||
y = _gtk_rbtree_node_find_offset (cursor_tree, cursor_node);
|
||||
y = _gtk_rbtree_node_find_offset (tree_view->priv->cursor_tree, tree_view->priv->cursor_node);
|
||||
window_y = RBTREE_Y_TO_TREE_WINDOW_Y (tree_view, y);
|
||||
y += tree_view->priv->cursor_offset;
|
||||
y += count * (int)gtk_adjustment_get_page_increment (tree_view->priv->vadjustment);
|
||||
@ -10413,8 +10380,6 @@ static void
|
||||
gtk_tree_view_move_cursor_left_right (GtkTreeView *tree_view,
|
||||
gint count)
|
||||
{
|
||||
GtkRBTree *cursor_tree = NULL;
|
||||
GtkRBNode *cursor_node = NULL;
|
||||
GtkTreePath *cursor_path = NULL;
|
||||
GtkTreeViewColumn *column;
|
||||
GtkTreeIter iter;
|
||||
@ -10431,14 +10396,12 @@ gtk_tree_view_move_cursor_left_right (GtkTreeView *tree_view,
|
||||
if (!gtk_widget_has_focus (GTK_WIDGET (tree_view)))
|
||||
return;
|
||||
|
||||
if (gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
||||
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
else
|
||||
if (tree_view->priv->cursor_node == NULL)
|
||||
return;
|
||||
|
||||
_gtk_tree_view_find_node (tree_view, cursor_path, &cursor_tree, &cursor_node);
|
||||
if (cursor_tree == NULL)
|
||||
return;
|
||||
cursor_path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
|
||||
if (gtk_tree_model_get_iter (tree_view->priv->model, &iter, cursor_path) == FALSE)
|
||||
{
|
||||
gtk_tree_path_free (cursor_path);
|
||||
@ -10472,8 +10435,8 @@ gtk_tree_view_move_cursor_left_right (GtkTreeView *tree_view,
|
||||
gtk_tree_view_column_cell_set_cell_data (column,
|
||||
tree_view->priv->model,
|
||||
&iter,
|
||||
GTK_RBNODE_FLAG_SET (cursor_node, GTK_RBNODE_IS_PARENT),
|
||||
cursor_node->children?TRUE:FALSE);
|
||||
GTK_RBNODE_FLAG_SET (tree_view->priv->cursor_node, GTK_RBNODE_IS_PARENT),
|
||||
tree_view->priv->cursor_node->children ? TRUE : FALSE);
|
||||
|
||||
cell_area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (column));
|
||||
if (gtk_cell_area_focus (cell_area, direction))
|
||||
@ -10494,8 +10457,8 @@ gtk_tree_view_move_cursor_left_right (GtkTreeView *tree_view,
|
||||
{
|
||||
if (!gtk_tree_view_has_can_focus_cell (tree_view))
|
||||
_gtk_tree_view_queue_draw_node (tree_view,
|
||||
cursor_tree,
|
||||
cursor_node,
|
||||
tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node,
|
||||
NULL);
|
||||
g_signal_emit (tree_view, tree_view_signals[CURSOR_CHANGED], 0);
|
||||
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
|
||||
@ -10621,12 +10584,12 @@ gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
|
||||
if (!gtk_widget_has_focus (GTK_WIDGET (tree_view)))
|
||||
return FALSE;
|
||||
|
||||
if (tree_view->priv->cursor)
|
||||
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
|
||||
if (cursor_path == NULL)
|
||||
if (tree_view->priv->cursor_node == NULL)
|
||||
return FALSE;
|
||||
|
||||
cursor_path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
|
||||
_gtk_tree_view_find_node (tree_view, cursor_path,
|
||||
&cursor_tree, &cursor_node);
|
||||
|
||||
@ -10693,20 +10656,11 @@ gtk_tree_view_real_toggle_cursor_row (GtkTreeView *tree_view)
|
||||
if (!gtk_widget_has_focus (GTK_WIDGET (tree_view)))
|
||||
return FALSE;
|
||||
|
||||
cursor_path = NULL;
|
||||
if (tree_view->priv->cursor)
|
||||
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
|
||||
if (cursor_path == NULL)
|
||||
if (tree_view->priv->cursor_node == NULL)
|
||||
return FALSE;
|
||||
|
||||
_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;
|
||||
}
|
||||
cursor_path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
|
||||
_gtk_tree_selection_internal_select_node (tree_view->priv->selection,
|
||||
cursor_node,
|
||||
@ -10721,10 +10675,12 @@ gtk_tree_view_real_toggle_cursor_row (GtkTreeView *tree_view)
|
||||
*/
|
||||
_gtk_tree_view_find_node (tree_view, cursor_path, &new_tree, &new_node);
|
||||
|
||||
if (cursor_tree != new_tree || cursor_node != new_node)
|
||||
if (tree_view->priv->cursor_node != new_node)
|
||||
return FALSE;
|
||||
|
||||
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
|
||||
gtk_tree_view_clamp_node_visible (tree_view,
|
||||
tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
|
||||
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
|
||||
gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL);
|
||||
@ -10740,24 +10696,18 @@ gtk_tree_view_real_expand_collapse_cursor_row (GtkTreeView *tree_view,
|
||||
gboolean open_all)
|
||||
{
|
||||
GtkTreePath *cursor_path = NULL;
|
||||
GtkRBTree *tree;
|
||||
GtkRBNode *node;
|
||||
|
||||
if (!gtk_widget_has_focus (GTK_WIDGET (tree_view)))
|
||||
return FALSE;
|
||||
|
||||
cursor_path = NULL;
|
||||
if (tree_view->priv->cursor)
|
||||
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
|
||||
if (cursor_path == NULL)
|
||||
if (tree_view->priv->cursor_node == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (_gtk_tree_view_find_node (tree_view, cursor_path, &tree, &node))
|
||||
return FALSE;
|
||||
cursor_path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
|
||||
/* Don't handle the event if we aren't an expander */
|
||||
if (!((node->flags & GTK_RBNODE_IS_PARENT) == GTK_RBNODE_IS_PARENT))
|
||||
if (!GTK_RBNODE_FLAG_SET (tree_view->priv->cursor_node, GTK_RBNODE_IS_PARENT))
|
||||
return FALSE;
|
||||
|
||||
if (!logical
|
||||
@ -10765,9 +10715,18 @@ gtk_tree_view_real_expand_collapse_cursor_row (GtkTreeView *tree_view,
|
||||
expand = !expand;
|
||||
|
||||
if (expand)
|
||||
gtk_tree_view_real_expand_row (tree_view, cursor_path, tree, node, open_all, TRUE);
|
||||
gtk_tree_view_real_expand_row (tree_view,
|
||||
cursor_path,
|
||||
tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node,
|
||||
open_all,
|
||||
TRUE);
|
||||
else
|
||||
gtk_tree_view_real_collapse_row (tree_view, cursor_path, tree, node, TRUE);
|
||||
gtk_tree_view_real_collapse_row (tree_view,
|
||||
cursor_path,
|
||||
tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node,
|
||||
TRUE);
|
||||
|
||||
gtk_tree_path_free (cursor_path);
|
||||
|
||||
@ -10777,34 +10736,21 @@ gtk_tree_view_real_expand_collapse_cursor_row (GtkTreeView *tree_view,
|
||||
static gboolean
|
||||
gtk_tree_view_real_select_cursor_parent (GtkTreeView *tree_view)
|
||||
{
|
||||
GtkRBTree *cursor_tree = NULL;
|
||||
GtkRBNode *cursor_node = NULL;
|
||||
GtkTreePath *cursor_path = NULL;
|
||||
GdkModifierType state;
|
||||
|
||||
if (!gtk_widget_has_focus (GTK_WIDGET (tree_view)))
|
||||
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)
|
||||
if (tree_view->priv->cursor_node == NULL)
|
||||
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);
|
||||
goto out;
|
||||
}
|
||||
cursor_path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
|
||||
if (cursor_tree->parent_node)
|
||||
if (tree_view->priv->cursor_tree->parent_node)
|
||||
{
|
||||
gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL);
|
||||
cursor_node = cursor_tree->parent_node;
|
||||
cursor_tree = cursor_tree->parent_tree;
|
||||
|
||||
gtk_tree_path_up (cursor_path);
|
||||
|
||||
@ -11369,8 +11315,8 @@ gtk_tree_view_set_model (GtkTreeView *tree_view,
|
||||
|
||||
gtk_tree_row_reference_free (tree_view->priv->drag_dest_row);
|
||||
tree_view->priv->drag_dest_row = NULL;
|
||||
gtk_tree_row_reference_free (tree_view->priv->cursor);
|
||||
tree_view->priv->cursor = NULL;
|
||||
tree_view->priv->cursor_tree = NULL;
|
||||
tree_view->priv->cursor_node = NULL;
|
||||
gtk_tree_row_reference_free (tree_view->priv->anchor);
|
||||
tree_view->priv->anchor = NULL;
|
||||
gtk_tree_row_reference_free (tree_view->priv->top_row);
|
||||
@ -12871,13 +12817,10 @@ gtk_tree_view_real_collapse_row (GtkTreeView *tree_view,
|
||||
gtk_tree_path_free (child_path);
|
||||
}
|
||||
|
||||
if (gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
||||
if (tree_view->priv->cursor_node)
|
||||
{
|
||||
GtkTreePath *cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
|
||||
cursor_changed = gtk_tree_path_is_ancestor (path, cursor_path);
|
||||
|
||||
gtk_tree_path_free (cursor_path);
|
||||
cursor_changed = (node->children == tree_view->priv->cursor_tree)
|
||||
|| _gtk_rbtree_contains (node->children, tree_view->priv->cursor_tree);
|
||||
}
|
||||
|
||||
if (gtk_tree_row_reference_valid (tree_view->priv->anchor))
|
||||
@ -13156,41 +13099,31 @@ gtk_tree_view_real_set_cursor (GtkTreeView *tree_view,
|
||||
gboolean clear_and_select,
|
||||
gboolean clamp_node)
|
||||
{
|
||||
GtkRBTree *tree = NULL;
|
||||
GtkRBNode *node = NULL;
|
||||
|
||||
if (gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
||||
if (tree_view->priv->cursor_node)
|
||||
{
|
||||
GtkTreePath *cursor_path;
|
||||
cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL);
|
||||
gtk_tree_path_free (cursor_path);
|
||||
_gtk_tree_view_queue_draw_node (tree_view,
|
||||
tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node,
|
||||
NULL);
|
||||
}
|
||||
|
||||
gtk_tree_row_reference_free (tree_view->priv->cursor);
|
||||
tree_view->priv->cursor = NULL;
|
||||
|
||||
/* 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)
|
||||
if (row_is_separator (tree_view, NULL, path)
|
||||
|| _gtk_tree_view_find_node (tree_view,
|
||||
path,
|
||||
&tree_view->priv->cursor_tree,
|
||||
&tree_view->priv->cursor_node))
|
||||
{
|
||||
tree_view->priv->cursor =
|
||||
gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view),
|
||||
tree_view->priv->model,
|
||||
path);
|
||||
}
|
||||
else
|
||||
{
|
||||
tree = NULL;
|
||||
node = NULL;
|
||||
tree_view->priv->cursor_tree = NULL;
|
||||
tree_view->priv->cursor_node = NULL;
|
||||
}
|
||||
|
||||
if (tree != NULL)
|
||||
if (tree_view->priv->cursor_node != NULL)
|
||||
{
|
||||
GtkRBTree *new_tree = NULL;
|
||||
GtkRBNode *new_node = NULL;
|
||||
@ -13203,7 +13136,10 @@ gtk_tree_view_real_set_cursor (GtkTreeView *tree_view,
|
||||
mode |= GTK_TREE_SELECT_MODE_EXTEND;
|
||||
|
||||
_gtk_tree_selection_internal_select_node (tree_view->priv->selection,
|
||||
node, tree, path, mode,
|
||||
tree_view->priv->cursor_node,
|
||||
tree_view->priv->cursor_tree,
|
||||
path,
|
||||
mode,
|
||||
FALSE);
|
||||
}
|
||||
|
||||
@ -13213,13 +13149,18 @@ gtk_tree_view_real_set_cursor (GtkTreeView *tree_view,
|
||||
*/
|
||||
_gtk_tree_view_find_node (tree_view, path, &new_tree, &new_node);
|
||||
|
||||
if (tree != new_tree || node != new_node)
|
||||
if (tree_view->priv->cursor_node != new_node)
|
||||
return;
|
||||
|
||||
if (clamp_node)
|
||||
{
|
||||
gtk_tree_view_clamp_node_visible (tree_view, tree, node);
|
||||
_gtk_tree_view_queue_draw_node (tree_view, tree, node, NULL);
|
||||
gtk_tree_view_clamp_node_visible (tree_view,
|
||||
tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
_gtk_tree_view_queue_draw_node (tree_view,
|
||||
tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -13248,8 +13189,9 @@ gtk_tree_view_get_cursor (GtkTreeView *tree_view,
|
||||
|
||||
if (path)
|
||||
{
|
||||
if (gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
||||
*path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
if (tree_view->priv->cursor_node)
|
||||
*path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
else
|
||||
*path = NULL;
|
||||
}
|
||||
@ -15081,8 +15023,6 @@ gtk_tree_view_search_activate (GtkEntry *entry,
|
||||
GtkTreeView *tree_view)
|
||||
{
|
||||
GtkTreePath *path;
|
||||
GtkRBNode *node;
|
||||
GtkRBTree *tree;
|
||||
|
||||
gtk_tree_view_search_dialog_hide (tree_view->priv->search_window,
|
||||
tree_view,
|
||||
@ -15090,13 +15030,12 @@ gtk_tree_view_search_activate (GtkEntry *entry,
|
||||
|
||||
/* If we have a row selected and it's the cursor row, we activate
|
||||
* the row XXX */
|
||||
if (gtk_tree_row_reference_valid (tree_view->priv->cursor))
|
||||
if (tree_view->priv->cursor_node &&
|
||||
GTK_RBNODE_FLAG_SET (tree_view->priv->cursor_node, GTK_RBNODE_IS_SELECTED))
|
||||
{
|
||||
path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
|
||||
path = _gtk_tree_path_new_from_rbtree (tree_view->priv->cursor_tree,
|
||||
tree_view->priv->cursor_node);
|
||||
|
||||
_gtk_tree_view_find_node (tree_view, path, &tree, &node);
|
||||
|
||||
if (node && GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
|
||||
gtk_tree_view_row_activated (tree_view, path, tree_view->priv->focus_column);
|
||||
|
||||
gtk_tree_path_free (path);
|
||||
|
Loading…
Reference in New Issue
Block a user