summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Rietveld <kris@imendio.com>2008-02-12 16:00:02 +0000
committerKristian Rietveld <kristian@src.gnome.org>2008-02-12 16:00:02 +0000
commit8bb6729e214b4940631deb44761def6b2ea5e8ac (patch)
tree4bd7a8982520d2f1b3936db5ceeb1d7a30afa521
parent011a75e87a959e54504eb7c6df22f59c4b0521bd (diff)
downloadgdk-pixbuf-8bb6729e214b4940631deb44761def6b2ea5e8ac.tar.gz
Merge from trunk:
2008-02-12 Kristian Rietveld <kris@imendio.com> Merge from trunk: * gtk/gtktreeview.c (gtk_tree_view_real_select_cursor_row), (gtk_tree_view_real_toggle_cursor_row): guard against people deleting the row in question in the selection-changed callback. (#514621, Andreas Koehler). svn path=/branches/gtk-2-12/; revision=19531
-rw-r--r--ChangeLog9
-rw-r--r--gtk/gtktreeview.c22
2 files changed, 31 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 69061c28f..33c0d7b15 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-02-12 Kristian Rietveld <kris@imendio.com>
+
+ Merge from trunk:
+
+ * gtk/gtktreeview.c (gtk_tree_view_real_select_cursor_row),
+ (gtk_tree_view_real_toggle_cursor_row): guard against people
+ deleting the row in question in the selection-changed callback.
+ (#514621, Andreas Koehler).
+
2008-02-11 Matthias Clasen <mclasen@redhat.com>
Merged from trunk:
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index cb4e89afb..fce72ed82 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -10075,6 +10075,8 @@ static gboolean
gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
gboolean start_editing)
{
+ GtkRBTree *new_tree = NULL;
+ GtkRBNode *new_node = NULL;
GtkRBTree *cursor_tree = NULL;
GtkRBNode *cursor_node = NULL;
GtkTreePath *cursor_path = NULL;
@@ -10120,6 +10122,15 @@ gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
mode,
FALSE);
+ /* We bail out if the original (tree, node) don't exist anymore after
+ * handling the selection-changed callback. We do return TRUE because
+ * the key press has been handled at this point.
+ */
+ _gtk_tree_view_find_node (tree_view, cursor_path, &new_tree, &new_node);
+
+ if (cursor_tree != new_tree || cursor_node != new_node)
+ return FALSE;
+
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
gtk_widget_grab_focus (GTK_WIDGET (tree_view));
@@ -10137,6 +10148,8 @@ gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
static gboolean
gtk_tree_view_real_toggle_cursor_row (GtkTreeView *tree_view)
{
+ GtkRBTree *new_tree = NULL;
+ GtkRBNode *new_node = NULL;
GtkRBTree *cursor_tree = NULL;
GtkRBNode *cursor_node = NULL;
GtkTreePath *cursor_path = NULL;
@@ -10166,6 +10179,15 @@ gtk_tree_view_real_toggle_cursor_row (GtkTreeView *tree_view)
GTK_TREE_SELECT_MODE_TOGGLE,
FALSE);
+ /* We bail out if the original (tree, node) don't exist anymore after
+ * handling the selection-changed callback. We do return TRUE because
+ * the key press has been handled at this point.
+ */
+ _gtk_tree_view_find_node (tree_view, cursor_path, &new_tree, &new_node);
+
+ if (cursor_tree != new_tree || cursor_node != new_node)
+ return FALSE;
+
gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
gtk_widget_grab_focus (GTK_WIDGET (tree_view));