From 3cc9ac406def4b7b38bb9700a818e10c135099bc Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 13 Oct 2020 12:07:19 -0400 Subject: [PATCH] listbox: Update accessible state for rows Set the SELECTED state to reflect whether the row is selected, unselected, or unselectable. This is enough to make selection changes appear in Accerciser. While we are at it, also set the multi-selectable property for the listbox itself. --- gtk/gtklistbox.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c index c0028d83fd..ac1a28426e 100644 --- a/gtk/gtklistbox.c +++ b/gtk/gtklistbox.c @@ -19,6 +19,7 @@ #include "gtklistbox.h" +#include "gtkaccessible.h" #include "gtkactionhelperprivate.h" #include "gtkadjustmentprivate.h" #include "gtkbinlayout.h" @@ -1119,6 +1120,10 @@ gtk_list_box_set_selection_mode (GtkListBox *box, gtk_list_box_update_row_styles (box); + gtk_accessible_update_property (GTK_ACCESSIBLE (box), + GTK_ACCESSIBLE_PROPERTY_MULTI_SELECTABLE, mode == GTK_SELECTION_MULTIPLE, + -1); + g_object_notify_by_pspec (G_OBJECT (box), properties[PROP_SELECTION_MODE]); if (dirty) @@ -1558,6 +1563,10 @@ gtk_list_box_row_set_selected (GtkListBoxRow *row, gtk_widget_unset_state_flags (GTK_WIDGET (row), GTK_STATE_FLAG_SELECTED); + gtk_accessible_update_state (GTK_ACCESSIBLE (row), + GTK_ACCESSIBLE_STATE_SELECTED, selected, + -1); + return TRUE; } @@ -3019,6 +3028,19 @@ gtk_list_box_row_hide (GtkWidget *widget) gtk_list_box_row_visibility_changed (box, row); } +static void +gtk_list_box_row_root (GtkWidget *widget) +{ + GtkListBoxRow *row = GTK_LIST_BOX_ROW (widget); + + GTK_WIDGET_CLASS (gtk_list_box_row_parent_class)->root (widget); + + if (ROW_PRIV (row)->selectable) + gtk_accessible_update_state (GTK_ACCESSIBLE (row), + GTK_ACCESSIBLE_STATE_SELECTED, ROW_PRIV (row)->selected, + -1); +} + /** * gtk_list_box_row_changed: * @row: a #GtkListBoxRow @@ -3228,10 +3250,19 @@ gtk_list_box_row_set_selectable (GtkListBoxRow *row, { if (!selectable) gtk_list_box_row_set_selected (row, FALSE); - + ROW_PRIV (row)->selectable = selectable; + if (selectable) + gtk_accessible_update_state (GTK_ACCESSIBLE (row), + GTK_ACCESSIBLE_STATE_SELECTED, FALSE, + -1); + else + gtk_accessible_reset_state (GTK_ACCESSIBLE (row), + GTK_ACCESSIBLE_STATE_SELECTED); + gtk_list_box_update_row_style (gtk_list_box_row_get_box (row), row); + g_object_notify_by_pspec (G_OBJECT (row), row_properties[ROW_PROP_SELECTABLE]); } } @@ -3413,6 +3444,7 @@ gtk_list_box_row_class_init (GtkListBoxRowClass *klass) object_class->finalize = gtk_list_box_row_finalize; object_class->dispose = gtk_list_box_row_dispose; + widget_class->root = gtk_list_box_row_root; widget_class->show = gtk_list_box_row_show; widget_class->hide = gtk_list_box_row_hide; widget_class->focus = gtk_list_box_row_focus;