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:
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user