[gtk/a11y/atspi] listbox: Update accessible state for rows



commit 3cc9ac406def4b7b38bb9700a818e10c135099bc
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Oct 13 12:07:19 2020 -0400

    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;


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