summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte.benjamin@googlemail.com>2023-04-26 22:06:40 +0000
committerBenjamin Otte <otte.benjamin@googlemail.com>2023-05-04 21:45:06 -0400
commit541de3451cdaef589ab724ccf612d868455f2b31 (patch)
tree7c6d8df53e65d8ec24006e82fed3de127aa4265e
parentb41af7b9835b7697ccdb0e5f30103c27a9a635f7 (diff)
downloadgtk+-541de3451cdaef589ab724ccf612d868455f2b31.tar.gz
Merge branch 'wip/otte/treelistmodel-madness' into 'main'
treelistmodel: Be safer during collapsing See merge request GNOME/gtk!5875 (cherry picked from commit 29e71868298448eb7fa570ed0a75935c235262de) 8766a6fa treelistmodel: Be safer during collapsing 3c76f3fb treelistmodel: Delay notifies from TreeListRow
-rw-r--r--gtk/gtktreelistmodel.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/gtk/gtktreelistmodel.c b/gtk/gtktreelistmodel.c
index 1e55323c0a..a4f0fa1d4b 100644
--- a/gtk/gtktreelistmodel.c
+++ b/gtk/gtktreelistmodel.c
@@ -101,8 +101,15 @@ static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
static GtkTreeListModel *
tree_node_get_tree_list_model (TreeNode *node)
{
- for (; !node->is_root; node = node->parent)
- { }
+ if (node->is_root)
+ return node->list;
+
+ for (node = node->parent; !node->is_root; node = node->parent)
+ {
+ /* This can happen during collapsing of a parent node */
+ if (node->children == NULL)
+ return NULL;
+ }
return node->list;
}
@@ -316,6 +323,9 @@ gtk_tree_list_model_items_changed_cb (GListModel *model,
guint i, tree_position, tree_removed, tree_added, n_local;
self = tree_node_get_tree_list_model (node);
+ if (self == NULL)
+ return;
+
n_local = g_list_model_get_n_items (model) - added + removed;
if (position < n_local)
@@ -405,10 +415,16 @@ gtk_tree_list_model_clear_node (gpointer data)
TreeNode *node = data;
if (node->row)
- gtk_tree_list_row_destroy (node->row);
+ {
+ g_object_freeze_notify (G_OBJECT (node->row));
+ gtk_tree_list_row_destroy (node->row);
+ }
gtk_tree_list_model_clear_node_children (node);
+ if (node->row)
+ g_object_thaw_notify (G_OBJECT (node->row));
+
g_clear_object (&node->item);
}
@@ -945,16 +961,12 @@ G_DEFINE_TYPE (GtkTreeListRow, gtk_tree_list_row, G_TYPE_OBJECT)
static void
gtk_tree_list_row_destroy (GtkTreeListRow *self)
{
- g_object_freeze_notify (G_OBJECT (self));
-
self->node = NULL;
/* FIXME: We could check some properties to avoid excess notifies */
g_object_notify_by_pspec (G_OBJECT (self), row_properties[ROW_PROP_DEPTH]);
g_object_notify_by_pspec (G_OBJECT (self), row_properties[ROW_PROP_EXPANDABLE]);
g_object_notify_by_pspec (G_OBJECT (self), row_properties[ROW_PROP_EXPANDED]);
-
- g_object_thaw_notify (G_OBJECT (self));
}
static void
@@ -1180,6 +1192,8 @@ gtk_tree_list_row_set_expanded (GtkTreeListRow *self,
return;
list = tree_node_get_tree_list_model (self->node);
+ if (list == NULL)
+ return;
if (expanded)
{
@@ -1255,6 +1269,9 @@ gtk_tree_list_row_is_expandable (GtkTreeListRow *self)
return TRUE;
list = tree_node_get_tree_list_model (self->node);
+ if (list == NULL)
+ return FALSE;
+
model = tree_node_create_model (list, self->node);
if (model)
{