diff --git a/src/gui/accessible/linux/atspiadaptor.cpp b/src/gui/accessible/linux/atspiadaptor.cpp index 93b731746f7..812ac276b28 100644 --- a/src/gui/accessible/linux/atspiadaptor.cpp +++ b/src/gui/accessible/linux/atspiadaptor.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "atspiadaptor_p.h" +#include "qspiaccessiblebridge_p.h" #include #include @@ -1364,9 +1365,9 @@ bool AtSpiAdaptor::accessibleInterface(QAccessibleInterface *interface, const QS } else if (function == QLatin1String("GetName")) { sendReply(connection, message, QVariant::fromValue(QDBusVariant(interface->text(QAccessible::Name)))); } else if (function == QLatin1String("GetRoleName")) { - sendReply(connection, message, qSpiRoleMapping[interface->role()].name()); + sendReply(connection, message, QSpiAccessibleBridge::namesForRole(interface->role()).name()); } else if (function == QLatin1String("GetLocalizedRoleName")) { - sendReply(connection, message, QVariant::fromValue(qSpiRoleMapping[interface->role()].localizedName())); + sendReply(connection, message, QVariant::fromValue(QSpiAccessibleBridge::namesForRole(interface->role()).localizedName())); } else if (function == QLatin1String("GetChildCount")) { sendReply(connection, message, QVariant::fromValue(QDBusVariant(interface->childCount()))); } else if (function == QLatin1String("GetIndexInParent")) { @@ -1450,7 +1451,7 @@ AtspiRole AtSpiAdaptor::getRole(QAccessibleInterface *interface) const { if ((interface->role() == QAccessible::EditableText) && interface->state().passwordEdit) return ATSPI_ROLE_PASSWORD_TEXT; - return qSpiRoleMapping[interface->role()].spiRole(); + return QSpiAccessibleBridge::namesForRole(interface->role()).spiRole(); } QStringList AtSpiAdaptor::accessibleInterfaces(QAccessibleInterface *interface) const diff --git a/src/gui/accessible/linux/qspi_constant_mappings.cpp b/src/gui/accessible/linux/qspi_constant_mappings.cpp index d4fe3ecd699..f428726138d 100644 --- a/src/gui/accessible/linux/qspi_constant_mappings.cpp +++ b/src/gui/accessible/linux/qspi_constant_mappings.cpp @@ -54,8 +54,6 @@ #ifndef QT_NO_ACCESSIBILITY QT_BEGIN_NAMESPACE -QHash qSpiRoleMapping; - quint64 spiStatesFromQState(QAccessible::State state) { quint64 spiState = 0; diff --git a/src/gui/accessible/linux/qspi_constant_mappings_p.h b/src/gui/accessible/linux/qspi_constant_mappings_p.h index 292b5e15971..17e36825f6d 100644 --- a/src/gui/accessible/linux/qspi_constant_mappings_p.h +++ b/src/gui/accessible/linux/qspi_constant_mappings_p.h @@ -123,8 +123,6 @@ private: QString m_localizedName; }; -extern QHash qSpiRoleMapping; - inline void setSpiStateBit(quint64* state, AtspiStateType spiState) { *state |= quint64(1) << spiState; diff --git a/src/gui/accessible/linux/qspiaccessiblebridge.cpp b/src/gui/accessible/linux/qspiaccessiblebridge.cpp index 9ae8767b66a..fb4bf1f27b9 100644 --- a/src/gui/accessible/linux/qspiaccessiblebridge.cpp +++ b/src/gui/accessible/linux/qspiaccessiblebridge.cpp @@ -41,6 +41,8 @@ #include "qspiaccessiblebridge_p.h" #include +#include +#include #include #include "atspiadaptor_p.h" @@ -273,14 +275,29 @@ static RoleMapping map[] = { void QSpiAccessibleBridge::initializeConstantMappings() { for (uint i = 0; i < sizeof(map) / sizeof(RoleMapping); ++i) - qSpiRoleMapping.insert(map[i].role, RoleNames(map[i].spiRole, QLatin1String(map[i].name), tr(map[i].name))); + m_spiRoleMapping.insert(map[i].role, RoleNames(map[i].spiRole, QLatin1String(map[i].name), tr(map[i].name))); // -1 because we have button duplicated, as PushButton and Button. - Q_ASSERT_X(qSpiRoleMapping.size() == + Q_ASSERT_X(m_spiRoleMapping.size() == QAccessible::staticMetaObject.enumerator( QAccessible::staticMetaObject.indexOfEnumerator("Role")).keyCount() - 1, "", "Handle all QAccessible::Role members in qSpiRoleMapping"); } +QSpiAccessibleBridge *QSpiAccessibleBridge::instance() +{ + if (auto integration = QGuiApplicationPrivate::platformIntegration()) { + if (auto accessibility = integration->accessibility()) + return static_cast(accessibility); + } + return nullptr; +} + +RoleNames QSpiAccessibleBridge::namesForRole(QAccessible::Role role) +{ + auto brigde = QSpiAccessibleBridge::instance(); + return brigde ? brigde->spiRoleNames().value(role) : RoleNames(); +} + QT_END_NAMESPACE #endif //QT_NO_ACCESSIBILITY diff --git a/src/gui/accessible/linux/qspiaccessiblebridge_p.h b/src/gui/accessible/linux/qspiaccessiblebridge_p.h index ce1b755826e..ef3eff366d2 100644 --- a/src/gui/accessible/linux/qspiaccessiblebridge_p.h +++ b/src/gui/accessible/linux/qspiaccessiblebridge_p.h @@ -55,6 +55,7 @@ #include #include #include +#include class DeviceEventControllerAdaptor; @@ -65,11 +66,14 @@ QT_BEGIN_NAMESPACE class DBusConnection; class QSpiDBusCache; class AtSpiAdaptor; +struct RoleNames; class Q_GUI_EXPORT QSpiAccessibleBridge: public QObject, public QPlatformAccessibility { Q_OBJECT public: + using SpiRoleMapping = QHash ; + QSpiAccessibleBridge(); virtual ~QSpiAccessibleBridge(); @@ -77,6 +81,11 @@ public: void notifyAccessibilityUpdate(QAccessibleEvent *event) override; QDBusConnection dBusConnection() const; + const SpiRoleMapping &spiRoleNames() const { return m_spiRoleMapping; } + + static QSpiAccessibleBridge *instance(); + static RoleNames namesForRole(QAccessible::Role role); + public Q_SLOTS: void enabledChanged(bool enabled); @@ -88,6 +97,7 @@ private: DeviceEventControllerAdaptor *dec; AtSpiAdaptor *dbusAdaptor; DBusConnection* dbusConnection; + SpiRoleMapping m_spiRoleMapping; }; QT_END_NAMESPACE