[gtk+] inspector: Handle object destruction without row references



commit bffeae6203ffe5ea91988d4439571568abc95ab7
Author: Benjamin Otte <otte redhat com>
Date:   Wed Aug 26 16:33:52 2015 +0200

    inspector: Handle object destruction without row references
    
    This way, we can live without row references.
    
    A side effect is that opening the inspector on the gtk-demo list box
    example now only takes 0.5s instead of the previous 3 minutes.

 gtk/inspector/object-tree.c |   53 ++++--------------------------------------
 1 files changed, 5 insertions(+), 48 deletions(-)
---
diff --git a/gtk/inspector/object-tree.c b/gtk/inspector/object-tree.c
index a52d7a2..63e64d5 100644
--- a/gtk/inspector/object-tree.c
+++ b/gtk/inspector/object-tree.c
@@ -73,7 +73,6 @@ struct _GtkInspectorObjectTreePrivate
 {
   GtkTreeView *tree;
   GtkTreeStore *model;
-  GHashTable *iters;
   gulong map_hook;
   gulong unmap_hook;
   GtkTreeViewColumn *object_column;
@@ -608,43 +607,14 @@ on_selection_changed (GtkTreeSelection       *selection,
   g_signal_emit (wt, signals[OBJECT_SELECTED], 0, object);
 }
 
-
-typedef struct
-{
-  GtkInspectorObjectTree *wt;
-  GObject *object;
-  GtkTreeRowReference *row;
-} ObjectData;
-
 static void
 gtk_object_tree_remove_dead_object (gpointer data, GObject *dead_object)
 {
-  ObjectData *od = data;
-
-  if (gtk_tree_row_reference_valid (od->row))
-    {
-      GtkTreePath *path;
-      GtkTreeIter iter;
-      path = gtk_tree_row_reference_get_path (od->row);
-      gtk_tree_model_get_iter (GTK_TREE_MODEL (od->wt->priv->model), &iter, path);
-      gtk_tree_store_remove (od->wt->priv->model, &iter);
-      gtk_tree_path_free (path);
-    }
-  od->object = NULL;
-  g_hash_table_remove (od->wt->priv->iters, dead_object);
-}
-
-static void
-object_data_free (gpointer data)
-{
-  ObjectData *od = data;
-
-  gtk_tree_row_reference_free (od->row);
-
-  if (od->object)
-    g_object_weak_unref (od->object, gtk_object_tree_remove_dead_object, od);
+  GtkInspectorObjectTree *wt = data;
+  GtkTreeIter iter;
 
-  g_free (od);
+  if (gtk_inspector_object_tree_find_object (wt, dead_object, &iter))
+    gtk_tree_store_remove (wt->priv->model, &iter);
 }
 
 static gboolean
@@ -888,10 +858,6 @@ gtk_inspector_object_tree_init (GtkInspectorObjectTree *wt)
   guint signal_id;
 
   wt->priv = gtk_inspector_object_tree_get_instance_private (wt);
-  wt->priv->iters = g_hash_table_new_full (g_direct_hash,
-                                           g_direct_equal,
-                                           NULL,
-                                           (GDestroyNotify) object_data_free);
   gtk_widget_init_template (GTK_WIDGET (wt));
 
   gtk_search_bar_connect_entry (GTK_SEARCH_BAR (wt->priv->search_bar),
@@ -917,8 +883,6 @@ gtk_inspector_object_tree_finalize (GObject *object)
   GtkInspectorObjectTree *wt = GTK_INSPECTOR_OBJECT_TREE (object);
   guint signal_id;
 
-  g_hash_table_unref (wt->priv->iters);
-
   signal_id = g_signal_lookup ("map", GTK_TYPE_WIDGET);
   g_signal_remove_emission_hook (signal_id, wt->priv->map_hook);
   signal_id = g_signal_lookup ("unmap", GTK_TYPE_WIDGET);
@@ -997,7 +961,6 @@ gtk_inspector_object_tree_append_object (GtkInspectorObjectTree *wt,
   GtkTreePath *path;
   const gchar *class_name;
   gchar *classes;
-  ObjectData *od;
   const gchar *label;
   FindAllData data;
 
@@ -1074,15 +1037,10 @@ gtk_inspector_object_tree_append_object (GtkInspectorObjectTree *wt,
 
   g_free (classes);
 
-  od = g_new0 (ObjectData, 1);
-  od->wt = wt;
-  od->object = object;
   path = gtk_tree_model_get_path (GTK_TREE_MODEL (wt->priv->model), &iter);
-  od->row = gtk_tree_row_reference_new (GTK_TREE_MODEL (wt->priv->model), path);
   gtk_tree_path_free (path);
 
-  g_hash_table_insert (wt->priv->iters, object, od);
-  g_object_weak_ref (object, gtk_object_tree_remove_dead_object, od);
+  g_object_weak_ref (object, gtk_object_tree_remove_dead_object, wt);
   
   data.wt = wt;
   data.iter = &iter;
@@ -1141,7 +1099,6 @@ gtk_inspector_object_tree_scan (GtkInspectorObjectTree *wt,
 
   selected = gtk_inspector_object_tree_get_selected (wt);
 
-  g_hash_table_remove_all (wt->priv->iters);
   gtk_tree_store_clear (wt->priv->model);
   gtk_inspector_object_tree_append_object (wt, G_OBJECT (gtk_settings_get_default ()), NULL, NULL);
   if (g_application_get_default ())


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]