vcl/unx/gtk4/a11y.cxx |  122 ++++++++++++++++++++++++++++----------------------
 1 file changed, 69 insertions(+), 53 deletions(-)

New commits:
commit 9cb506a37a3228cf820eaeec681e49c08607cf59
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Thu Nov 9 15:24:26 2023 +0100
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Thu Nov 9 20:58:22 2023 +0100

    gtk4 a11y: Extract state handling to helper function
    
    Change-Id: I1f6dba461b328fc41de6d944bd8657daa9b05370
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159215
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/vcl/unx/gtk4/a11y.cxx b/vcl/unx/gtk4/a11y.cxx
index 482c3aef3487..8bd1b97f0aa9 100644
--- a/vcl/unx/gtk4/a11y.cxx
+++ b/vcl/unx/gtk4/a11y.cxx
@@ -240,6 +240,73 @@ static 
css::uno::Reference<css::accessibility::XAccessible> get_uno_accessible(G
     return pWindow->GetAccessible();
 }
 
+/**
+ * Based on the states set in xContext, set the corresponding Gtk 
states/properties
+ * in pGtkAccessible.
+ */
+static void applyStates(GtkAccessible* pGtkAccessible,
+                        
css::uno::Reference<css::accessibility::XAccessibleContext> xContext)
+{
+    assert(pGtkAccessible);
+
+    if (!xContext.is())
+        return;
+
+    // Gtk differentiates between GtkAccessibleState and GtkAccessibleProperty
+    // (both handled here) and GtkAccessiblePlatformState (handled in
+    // 'lo_accessible_get_platform_state')
+    const sal_Int64 nStates = xContext->getAccessibleStateSet();
+    gtk_accessible_update_property(
+        pGtkAccessible, GTK_ACCESSIBLE_PROPERTY_MODAL,
+        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::MODAL),
+        GTK_ACCESSIBLE_PROPERTY_MULTI_LINE,
+        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::MULTI_LINE),
+        GTK_ACCESSIBLE_PROPERTY_MULTI_SELECTABLE,
+        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::MULTI_SELECTABLE),
+        GTK_ACCESSIBLE_PROPERTY_READ_ONLY,
+        bool(!(nStates & 
com::sun::star::accessibility::AccessibleStateType::EDITABLE)), -1);
+    if (nStates & 
com::sun::star::accessibility::AccessibleStateType::HORIZONTAL)
+    {
+        gtk_accessible_update_property(pGtkAccessible, 
GTK_ACCESSIBLE_PROPERTY_ORIENTATION,
+                                       GTK_ORIENTATION_HORIZONTAL, -1);
+    }
+    else if (nStates & 
com::sun::star::accessibility::AccessibleStateType::VERTICAL)
+    {
+        gtk_accessible_update_property(pGtkAccessible, 
GTK_ACCESSIBLE_PROPERTY_ORIENTATION,
+                                       GTK_ORIENTATION_VERTICAL, -1);
+    }
+
+    gtk_accessible_update_state(
+        pGtkAccessible, GTK_ACCESSIBLE_STATE_BUSY,
+        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::BUSY),
+        GTK_ACCESSIBLE_STATE_DISABLED,
+        bool(!(nStates & 
com::sun::star::accessibility::AccessibleStateType::ENABLED)),
+        GTK_ACCESSIBLE_STATE_EXPANDED,
+        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::EXPANDED),
+        GTK_ACCESSIBLE_STATE_SELECTED,
+        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::SELECTED), -1);
+
+    const sal_Int16 nRole = xContext->getAccessibleRole();
+    if (nRole == com::sun::star::accessibility::AccessibleRole::CHECK_BOX)
+    {
+        GtkAccessibleTristate eState = GTK_ACCESSIBLE_TRISTATE_FALSE;
+        if (nStates & 
com::sun::star::accessibility::AccessibleStateType::INDETERMINATE)
+            eState = GTK_ACCESSIBLE_TRISTATE_MIXED;
+        else if (nStates & 
com::sun::star::accessibility::AccessibleStateType::CHECKED)
+            eState = GTK_ACCESSIBLE_TRISTATE_TRUE;
+        gtk_accessible_update_state(pGtkAccessible, 
GTK_ACCESSIBLE_STATE_CHECKED, eState, -1);
+    }
+    else if (nRole == 
com::sun::star::accessibility::AccessibleRole::TOGGLE_BUTTON)
+    {
+        GtkAccessibleTristate eState = GTK_ACCESSIBLE_TRISTATE_FALSE;
+        if (nStates & 
com::sun::star::accessibility::AccessibleStateType::INDETERMINATE)
+            eState = GTK_ACCESSIBLE_TRISTATE_MIXED;
+        else if (nStates & 
com::sun::star::accessibility::AccessibleStateType::PRESSED)
+            eState = GTK_ACCESSIBLE_TRISTATE_TRUE;
+        gtk_accessible_update_state(pGtkAccessible, 
GTK_ACCESSIBLE_STATE_PRESSED, eState, -1);
+    }
+}
+
 #define LO_TYPE_ACCESSIBLE (lo_accessible_get_type())
 #define LO_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), 
LO_TYPE_ACCESSIBLE, LoAccessible))
 // #define LO_IS_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
LO_TYPE_ACCESSIBLE))
@@ -474,60 +541,9 @@ lo_accessible_new(GdkDisplay* pDisplay, GtkAccessible* 
pParent,
         ret->uno_accessible->getAccessibleContext());
     assert(xContext.is() && "No accessible context");
 
-    // handle states
-    // Gtk differentiates between GtkAccessibleState and GtkAccessibleProperty
-    // (both handled here) and GtkAccessiblePlatformState (handled in
-    // 'lo_accessible_get_platform_state')
-    const sal_Int64 nStates = xContext->getAccessibleStateSet();
-    gtk_accessible_update_property(
-        GTK_ACCESSIBLE(ret), GTK_ACCESSIBLE_PROPERTY_MODAL,
-        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::MODAL),
-        GTK_ACCESSIBLE_PROPERTY_MULTI_LINE,
-        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::MULTI_LINE),
-        GTK_ACCESSIBLE_PROPERTY_MULTI_SELECTABLE,
-        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::MULTI_SELECTABLE),
-        GTK_ACCESSIBLE_PROPERTY_READ_ONLY,
-        bool(!(nStates & 
com::sun::star::accessibility::AccessibleStateType::EDITABLE)), -1);
-    if (nStates & 
com::sun::star::accessibility::AccessibleStateType::HORIZONTAL)
-    {
-        gtk_accessible_update_property(GTK_ACCESSIBLE(ret), 
GTK_ACCESSIBLE_PROPERTY_ORIENTATION,
-                                       GTK_ORIENTATION_HORIZONTAL, -1);
-    }
-    else if (nStates & 
com::sun::star::accessibility::AccessibleStateType::VERTICAL)
-    {
-        gtk_accessible_update_property(GTK_ACCESSIBLE(ret), 
GTK_ACCESSIBLE_PROPERTY_ORIENTATION,
-                                       GTK_ORIENTATION_VERTICAL, -1);
-    }
+    GtkAccessible* pGtkAccessible = GTK_ACCESSIBLE(ret);
 
-    gtk_accessible_update_state(
-        GTK_ACCESSIBLE(ret), GTK_ACCESSIBLE_STATE_BUSY,
-        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::BUSY),
-        GTK_ACCESSIBLE_STATE_DISABLED,
-        bool(!(nStates & 
com::sun::star::accessibility::AccessibleStateType::ENABLED)),
-        GTK_ACCESSIBLE_STATE_EXPANDED,
-        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::EXPANDED),
-        GTK_ACCESSIBLE_STATE_SELECTED,
-        bool(nStates & 
com::sun::star::accessibility::AccessibleStateType::SELECTED), -1);
-
-    const sal_Int16 nRole = xContext->getAccessibleRole();
-    if (nRole == com::sun::star::accessibility::AccessibleRole::CHECK_BOX)
-    {
-        GtkAccessibleTristate eState = GTK_ACCESSIBLE_TRISTATE_FALSE;
-        if (nStates & 
com::sun::star::accessibility::AccessibleStateType::INDETERMINATE)
-            eState = GTK_ACCESSIBLE_TRISTATE_MIXED;
-        else if (nStates & 
com::sun::star::accessibility::AccessibleStateType::CHECKED)
-            eState = GTK_ACCESSIBLE_TRISTATE_TRUE;
-        gtk_accessible_update_state(GTK_ACCESSIBLE(ret), 
GTK_ACCESSIBLE_STATE_CHECKED, eState, -1);
-    }
-    else if (nRole == 
com::sun::star::accessibility::AccessibleRole::TOGGLE_BUTTON)
-    {
-        GtkAccessibleTristate eState = GTK_ACCESSIBLE_TRISTATE_FALSE;
-        if (nStates & 
com::sun::star::accessibility::AccessibleStateType::INDETERMINATE)
-            eState = GTK_ACCESSIBLE_TRISTATE_MIXED;
-        else if (nStates & 
com::sun::star::accessibility::AccessibleStateType::PRESSED)
-            eState = GTK_ACCESSIBLE_TRISTATE_TRUE;
-        gtk_accessible_update_state(GTK_ACCESSIBLE(ret), 
GTK_ACCESSIBLE_STATE_PRESSED, eState, -1);
-    }
+    applyStates(pGtkAccessible, xContext);
 
     // set values from XAccessibleValue interface if that's implemented
     css::uno::Reference<css::accessibility::XAccessibleValue> 
xAccessibleValue(xContext,

Reply via email to