diff --git a/gtk/a11y/gtktreeviewaccessible.c b/gtk/a11y/gtktreeviewaccessible.c index 82c3b4bbc5..dc38b5991c 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 5a23f8321c..58c75e8227 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 3c45c92bec..42e616c12c 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) {