vcl/unx/gtk4/a11y.cxx | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-)
New commits: commit 285c309ad7d92f6b92b5bdf1dd8f490fbdf59d56 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Mon Nov 6 17:48:08 2023 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Tue Nov 7 07:59:55 2023 +0100 gtk4 a11y: Map states to corresponding GtkAccessibleState Set those states that Gtk handles as `GtkAccessibleState`, see documentation at [1]. For the LO a11y states, the Gtk 4 a11y API differentiates between three different enums/ways of handling those: * `AccessibleProperty`, for which handling was added in the previous commit, Change-Id Ic033e66dd89021defca449bbe2251102bbd61015, "gtk4 a11y: Map states to corresponding gtk a11y properties" * `GtkAccessibleState`, for which this commit implements the handling * `GtkAccessiblePlatformState`, for which handling was implemented in `lo_accessible_get_platform_state` in commit 341ff232aec77c2b46325389da933315613b6f2d Author: Caolán McNamara <caol...@redhat.com> Date: Mon Mar 20 20:37:15 2023 +0000 gtk4: get a11y to say hello world already. [1] https://docs.gtk.org/gtk4/enum.AccessibleState.html Change-Id: If22725dc2ccab5f73518e4171209a80a9c4df6d3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159006 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 fc148d41c199..b60e3d0676de 100644 --- a/vcl/unx/gtk4/a11y.cxx +++ b/vcl/unx/gtk4/a11y.cxx @@ -474,7 +474,10 @@ lo_accessible_new(GdkDisplay* pDisplay, GtkAccessible* pParent, ret->uno_accessible->getAccessibleContext()); assert(xContext.is() && "No accessible context"); - // set state properties + // 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, @@ -496,6 +499,36 @@ lo_accessible_new(GdkDisplay* pDisplay, GtkAccessible* pParent, GTK_ORIENTATION_VERTICAL, -1); } + 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); + } + // set values from XAccessibleValue interface if that's implemented css::uno::Reference<css::accessibility::XAccessibleValue> xAccessibleValue(xContext, css::uno::UNO_QUERY);