inspector: Be more careful with dead objects

gtk_inspector_object_tree_find_object accesses the type information
of the object, so we can't safely use it on an already decaying
object when we get a weak notify. Instead just walk the tree and
compare pointers, that is safe.

https://bugzilla.gnome.org/show_bug.cgi?id=756852
This commit is contained in:
Matthias Clasen
2015-10-25 13:11:17 -04:00
parent 4305aa1def
commit f55e3f7eda

View File

@ -607,14 +607,32 @@ on_selection_changed (GtkTreeSelection *selection,
g_signal_emit (wt, signals[OBJECT_SELECTED], 0, object); g_signal_emit (wt, signals[OBJECT_SELECTED], 0, object);
} }
static gboolean
remove_cb (GtkTreeModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
gpointer data)
{
GObject *dead_object = data;
GObject *lookup;
gtk_tree_model_get (model, iter, OBJECT, &lookup, -1);
if (lookup == dead_object)
{
gtk_tree_store_remove (GTK_TREE_STORE (model), iter);
return TRUE;
}
return FALSE;
}
static void static void
gtk_object_tree_remove_dead_object (gpointer data, GObject *dead_object) gtk_object_tree_remove_dead_object (gpointer data, GObject *dead_object)
{ {
GtkInspectorObjectTree *wt = data; GtkInspectorObjectTree *wt = data;
GtkTreeIter iter;
if (gtk_inspector_object_tree_find_object (wt, dead_object, &iter)) gtk_tree_model_foreach (GTK_TREE_MODEL (wt->priv->model), remove_cb, dead_object);
gtk_tree_store_remove (wt->priv->model, &iter);
} }
static gboolean static gboolean