[gtk+] treeview: Send changed signal directly to a11y code



commit ccabccc42fb7510b8aa930b653cc86d3e7b8dada
Author: Benjamin Otte <otte redhat com>
Date:   Wed Dec 14 18:14:47 2011 +0100

    treeview: Send changed signal directly to a11y code
    
    No more signal handler is needed, therefore the code can also get rid of
    tracking the treemodel. And we use a faster approach for iterating the
    changed cellrenderers: We just iterate all columns instead of over all
    cell accessibles, as that number is likely quite a bit smaller.

 gtk/a11y/gtktreeviewaccessible.c |  104 +++++++++----------------------------
 gtk/a11y/gtktreeviewaccessible.h |    5 ++-
 gtk/gtktreeview.c                |    2 +
 3 files changed, 32 insertions(+), 79 deletions(-)
---
diff --git a/gtk/a11y/gtktreeviewaccessible.c b/gtk/a11y/gtktreeviewaccessible.c
index 82c3b4b..dc38b59 100644
--- a/gtk/a11y/gtktreeviewaccessible.c
+++ b/gtk/a11y/gtktreeviewaccessible.c
@@ -71,9 +71,6 @@ static void             cell_info_new                   (GtkTreeViewAccessible
                                                          GtkCellAccessible      *cell);
 static GtkCellAccessible *find_cell                       (GtkTreeViewAccessible           *accessible,
                                                          gint                   index);
-static void             connect_model_signals           (GtkTreeView            *view,
-                                                         GtkTreeViewAccessible           *accessible);
-static void             disconnect_model_signals        (GtkTreeViewAccessible           *accessible);
 static gint             get_column_number               (GtkTreeView            *tree_view,
                                                          GtkTreeViewColumn      *column);
 static gint             get_focus_index                 (GtkTreeView            *tree_view);
@@ -190,12 +187,8 @@ gtk_tree_view_accessible_initialize (AtkObject *obj,
   g_signal_connect (tree_view, "focus-out-event",
                     G_CALLBACK (focus_out), NULL);
 
-  accessible->tree_model = tree_model;
   if (tree_model)
     {
-      g_object_add_weak_pointer (G_OBJECT (accessible->tree_model), (gpointer *)&accessible->tree_model);
-      connect_model_signals (tree_view, accessible);
-
       if (gtk_tree_model_get_flags (tree_model) & GTK_TREE_MODEL_LIST_ONLY)
         obj->role = ATK_ROLE_TABLE;
       else
@@ -208,9 +201,6 @@ gtk_tree_view_accessible_finalize (GObject *object)
 {
   GtkTreeViewAccessible *accessible = GTK_TREE_VIEW_ACCESSIBLE (object);
 
-  if (accessible->tree_model)
-    disconnect_model_signals (accessible);
-
   if (accessible->cell_infos)
     g_hash_table_destroy (accessible->cell_infos);
 
@@ -235,16 +225,10 @@ gtk_tree_view_accessible_notify_gtk (GObject    *obj,
       AtkRole role;
 
       tree_model = gtk_tree_view_get_model (tree_view);
-      if (accessible->tree_model)
-        disconnect_model_signals (accessible);
       g_hash_table_remove_all (accessible->cell_infos);
-      accessible->tree_model = tree_model;
 
       if (tree_model)
         {
-          g_object_add_weak_pointer (G_OBJECT (accessible->tree_model), (gpointer *)&accessible->tree_model);
-          connect_model_signals (tree_view, accessible);
-
           if (gtk_tree_model_get_flags (tree_model) & GTK_TREE_MODEL_LIST_ONLY)
             role = ATK_ROLE_TABLE;
           else
@@ -275,11 +259,6 @@ gtk_tree_view_accessible_destroyed (GtkWidget     *widget,
 
   accessible = GTK_TREE_VIEW_ACCESSIBLE (gtk_accessible);
 
-  if (accessible->tree_model)
-    {
-      disconnect_model_signals (accessible);
-      accessible->tree_model = NULL;
-    }
   if (accessible->focus_cell)
     {
       g_object_unref (accessible->focus_cell);
@@ -1578,41 +1557,6 @@ focus_out (GtkWidget *widget)
   return FALSE;
 }
 
-static void
-model_row_changed (GtkTreeModel *tree_model,
-                   GtkTreePath  *path,
-                   GtkTreeIter  *iter,
-                   gpointer      user_data)
-{
-  GtkTreeView *tree_view = GTK_TREE_VIEW (user_data);
-  GtkTreeViewAccessible *accessible;
-  GtkTreePath *cell_path;
-  GtkTreeViewAccessibleCellInfo *cell_info;
-  GHashTableIter hash_iter;
-
-  accessible = GTK_TREE_VIEW_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (tree_view)));
-
-  /* Loop through our cached cells */
-  /* Must loop through them all */
-  g_hash_table_iter_init (&hash_iter, accessible->cell_infos);
-  while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer *)&cell_info))
-    {
-      cell_path = cell_info_get_path (cell_info);
-
-      if (cell_path != NULL)
-        {
-          if (path && gtk_tree_path_compare (cell_path, path) == 0)
-            {
-              if (GTK_IS_RENDERER_CELL_ACCESSIBLE (cell_info->cell))
-                update_cell_value (GTK_RENDERER_CELL_ACCESSIBLE (cell_info->cell),
-                                   accessible, TRUE);
-            }
-          gtk_tree_path_free (cell_path);
-        }
-    }
-  g_signal_emit_by_name (accessible, "visible-data-changed");
-}
-
 void
 _gtk_tree_view_accessible_reorder (GtkTreeView *treeview)
 {
@@ -1869,28 +1813,6 @@ find_cell (GtkTreeViewAccessible *accessible,
                     get_visible_column (tree_view, index % get_n_columns (tree_view)));
 }
 
-static void
-connect_model_signals (GtkTreeView           *view,
-                       GtkTreeViewAccessible *accessible)
-{
-  GObject *obj;
-
-  obj = G_OBJECT (accessible->tree_model);
-  g_signal_connect_data (obj, "row-changed",
-                         G_CALLBACK (model_row_changed), view, NULL, 0);
-}
-
-static void
-disconnect_model_signals (GtkTreeViewAccessible *accessible)
-{
-  GObject *obj;
-  GtkWidget *widget;
-
-  obj = G_OBJECT (accessible->tree_model);
-  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
-  g_signal_handlers_disconnect_by_func (obj, model_row_changed, widget);
-}
-
 /* Returns the column number of the specified GtkTreeViewColumn
  * The column must be visible.
  */
@@ -2161,6 +2083,32 @@ _gtk_tree_view_accessible_remove (GtkTreeView *treeview,
     }
 }
 
+void
+_gtk_tree_view_accessible_changed (GtkTreeView *treeview,
+                                   GtkRBTree   *tree,
+                                   GtkRBNode   *node)
+{
+  GtkTreeViewAccessible *accessible;
+  guint i;
+
+  accessible = GTK_TREE_VIEW_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (treeview)));
+
+  for (i = 0; i < gtk_tree_view_get_n_columns (treeview); i++)
+    {
+      GtkCellAccessible *cell = peek_cell (accessible,
+                                           tree, node,
+                                           gtk_tree_view_get_column (treeview, i));
+
+      if (!GTK_IS_RENDERER_CELL_ACCESSIBLE (cell))
+        continue;
+
+      update_cell_value (GTK_RENDERER_CELL_ACCESSIBLE (cell),
+                         accessible, TRUE);
+    }
+
+  g_signal_emit_by_name (accessible, "visible-data-changed");
+}
+
 /* NB: id is not checked, only columns < id are.
  * This is important so the function works for notification of removal of a column */
 static guint
diff --git a/gtk/a11y/gtktreeviewaccessible.h b/gtk/a11y/gtktreeviewaccessible.h
index 5a23f83..58c75e8 100644
--- a/gtk/a11y/gtktreeviewaccessible.h
+++ b/gtk/a11y/gtktreeviewaccessible.h
@@ -40,7 +40,6 @@ struct _GtkTreeViewAccessible
   GtkContainerAccessible parent;
 
   GHashTable    *cell_infos;
-  GtkTreeModel  *tree_model;
   AtkObject     *focus_cell;
 };
 
@@ -59,6 +58,10 @@ void            _gtk_tree_view_accessible_add           (GtkTreeView       *tree
 void            _gtk_tree_view_accessible_remove        (GtkTreeView       *treeview,
                                                          GtkRBTree         *tree,
                                                          GtkRBNode         *node);
+void            _gtk_tree_view_accessible_changed       (GtkTreeView       *treeview,
+                                                         GtkRBTree         *tree,
+                                                         GtkRBNode         *node);
+
 
 void            _gtk_tree_view_accessible_add_column    (GtkTreeView       *treeview,
                                                          GtkTreeViewColumn *column,
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 3c45c92..42e616c 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -8742,6 +8742,8 @@ gtk_tree_view_row_changed (GtkTreeModel *model,
   if (tree == NULL)
     goto done;
 
+  _gtk_tree_view_accessible_changed (tree_view, tree, node);
+
   if (tree_view->priv->fixed_height_mode
       && tree_view->priv->fixed_height >= 0)
     {



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