diff options
Diffstat (limited to 'src/platformsupport/linuxaccessibility')
5 files changed, 56 insertions, 16 deletions
diff --git a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp index c040dab5e1..d155cecd89 100644 --- a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp +++ b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp @@ -1431,7 +1431,9 @@ bool AtSpiAdaptor::accessibleInterface(QAccessibleInterface *interface, const QS QSpiObjectReference(connection, QDBusObjectPath(QSPI_OBJECT_PATH_ROOT)))); } else if (function == QLatin1String("GetChildren")) { QSpiObjectReferenceArray children; - for (int i = 0; i < interface->childCount(); ++i) { + const int numChildren = interface->childCount(); + children.reserve(numChildren); + for (int i = 0; i < numChildren; ++i) { QString childPath = pathForInterface(interface->child(i)); QSpiObjectReference ref(connection, QDBusObjectPath(childPath)); children << ref; @@ -1507,7 +1509,7 @@ QSpiRelationArray AtSpiAdaptor::relationSet(QAccessibleInterface *interface, con Q_FOREACH (const RelationPair &pair, relationInterfaces) { // FIXME: this loop seems a bit strange... "related" always have one item when we check. //And why is it a list, when it always have one item? And it seems to assume that the QAccessible::Relation enum maps directly to AtSpi - QList<QSpiObjectReference> related; + QSpiObjectReferenceArray related; QDBusObjectPath path = QDBusObjectPath(pathForInterface(pair.first)); related.append(QSpiObjectReference(connection, path)); @@ -1747,7 +1749,9 @@ QSpiActionArray AtSpiAdaptor::getActions(QAccessibleInterface *interface) const { QAccessibleActionInterface *actionInterface = interface->actionInterface(); QSpiActionArray actions; - Q_FOREACH (const QString &actionName, QAccessibleBridgeUtils::effectiveActionNames(interface)) { + const QStringList actionNames = QAccessibleBridgeUtils::effectiveActionNames(interface); + actions.reserve(actionNames.size()); + Q_FOREACH (const QString &actionName, actionNames) { QSpiAction action; QStringList keyBindings; diff --git a/src/platformsupport/linuxaccessibility/cache.cpp b/src/platformsupport/linuxaccessibility/cache.cpp index 2ece905fdf..0ccd2cba6e 100644 --- a/src/platformsupport/linuxaccessibility/cache.cpp +++ b/src/platformsupport/linuxaccessibility/cache.cpp @@ -78,8 +78,7 @@ void QSpiDBusCache::emitRemoveAccessible(const QSpiObjectReference& item) QSpiAccessibleCacheArray QSpiDBusCache::GetItems() { - QList <QSpiAccessibleCacheItem> cacheArray; - return cacheArray; + return QSpiAccessibleCacheArray(); } QT_END_NAMESPACE diff --git a/src/platformsupport/linuxaccessibility/dbusconnection.cpp b/src/platformsupport/linuxaccessibility/dbusconnection.cpp index 45729fa065..637b06549a 100644 --- a/src/platformsupport/linuxaccessibility/dbusconnection.cpp +++ b/src/platformsupport/linuxaccessibility/dbusconnection.cpp @@ -42,6 +42,9 @@ #include <QDBusConnectionInterface> #include "bus_interface.h" +#include <QtGui/qguiapplication.h> +#include <qplatformnativeinterface.h> + QT_BEGIN_NAMESPACE QString A11Y_SERVICE = QStringLiteral("org.a11y.Bus"); @@ -65,6 +68,29 @@ DBusConnection::DBusConnection(QObject *parent) // If it is registered already, setup a11y right away if (c.interface()->isServiceRegistered(A11Y_SERVICE)) serviceRegistered(); + + // In addition try if there is an xatom exposing the bus address, this allows applications run as root to work + QString address = getAddressFromXCB(); + if (!address.isEmpty()) { + m_enabled = true; + connectA11yBus(address); + } +} + +QString DBusConnection::getAddressFromXCB() +{ + QGuiApplication *app = qobject_cast<QGuiApplication *>(QCoreApplication::instance()); + if (!app) + return QString(); + QPlatformNativeInterface *platformNativeInterface = app->platformNativeInterface(); + QByteArray *addressByteArray = reinterpret_cast<QByteArray*>( + platformNativeInterface->nativeResourceForIntegration(QByteArrayLiteral("AtspiBus"))); + if (addressByteArray) { + QString address = QString::fromLatin1(*addressByteArray); + delete addressByteArray; + return address; + } + return QString(); } // We have the a11y registry on the session bus. diff --git a/src/platformsupport/linuxaccessibility/dbusconnection_p.h b/src/platformsupport/linuxaccessibility/dbusconnection_p.h index a0bd6450bf..30707a3f95 100644 --- a/src/platformsupport/linuxaccessibility/dbusconnection_p.h +++ b/src/platformsupport/linuxaccessibility/dbusconnection_p.h @@ -68,6 +68,7 @@ Q_SIGNALS: void enabledChanged(bool enabled); private Q_SLOTS: + QString getAddressFromXCB(); void serviceRegistered(); void serviceUnregistered(); void connectA11yBus(const QString &address); diff --git a/src/platformsupport/linuxaccessibility/struct_marshallers_p.h b/src/platformsupport/linuxaccessibility/struct_marshallers_p.h index 7788ceb7cc..61d79e6daa 100644 --- a/src/platformsupport/linuxaccessibility/struct_marshallers_p.h +++ b/src/platformsupport/linuxaccessibility/struct_marshallers_p.h @@ -46,7 +46,7 @@ // We mean it. // -#include <QtCore/qlist.h> +#include <QtCore/qvector.h> #include <QtCore/qpair.h> #include <QtDBus/QDBusArgument> #include <QtDBus/QDBusConnection> @@ -55,8 +55,8 @@ #ifndef QT_NO_ACCESSIBILITY QT_BEGIN_NAMESPACE -typedef QList <int> QSpiIntList; -typedef QList <uint> QSpiUIntList; +typedef QVector<int> QSpiIntList; +typedef QVector<uint> QSpiUIntList; // FIXME: make this copy on write struct QSpiObjectReference @@ -68,26 +68,29 @@ struct QSpiObjectReference QSpiObjectReference(const QDBusConnection& connection, const QDBusObjectPath& path) : service(connection.baseService()), path(path) {} }; +Q_DECLARE_TYPEINFO(QSpiObjectReference, Q_MOVABLE_TYPE); // QDBusObjectPath is movable, even though it + // cannot be marked that way until Qt 6 QDBusArgument &operator<<(QDBusArgument &argument, const QSpiObjectReference &address); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiObjectReference &address); -typedef QList <QSpiObjectReference> QSpiObjectReferenceArray; +typedef QVector<QSpiObjectReference> QSpiObjectReferenceArray; struct QSpiAccessibleCacheItem { QSpiObjectReference path; QSpiObjectReference application; QSpiObjectReference parent; - QList <QSpiObjectReference> children; + QSpiObjectReferenceArray children; QStringList supportedInterfaces; QString name; uint role; QString description; QSpiUIntList state; }; +Q_DECLARE_TYPEINFO(QSpiAccessibleCacheItem, Q_MOVABLE_TYPE); -typedef QList <QSpiAccessibleCacheItem> QSpiAccessibleCacheArray; +typedef QVector<QSpiAccessibleCacheItem> QSpiAccessibleCacheArray; QDBusArgument &operator<<(QDBusArgument &argument, const QSpiAccessibleCacheItem &item); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiAccessibleCacheItem &item); @@ -98,8 +101,9 @@ struct QSpiAction QString description; QString keyBinding; }; +Q_DECLARE_TYPEINFO(QSpiAction, Q_MOVABLE_TYPE); -typedef QList <QSpiAction> QSpiActionArray; +typedef QVector<QSpiAction> QSpiActionArray; QDBusArgument &operator<<(QDBusArgument &argument, const QSpiAction &action); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiAction &action); @@ -109,14 +113,15 @@ struct QSpiEventListener QString listenerAddress; QString eventName; }; +Q_DECLARE_TYPEINFO(QSpiEventListener, Q_MOVABLE_TYPE); -typedef QList <QSpiEventListener> QSpiEventListenerArray; +typedef QVector<QSpiEventListener> QSpiEventListenerArray; QDBusArgument &operator<<(QDBusArgument &argument, const QSpiEventListener &action); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiEventListener &action); -typedef QPair < unsigned int, QList < QSpiObjectReference > > QSpiRelationArrayEntry; -typedef QList< QSpiRelationArrayEntry > QSpiRelationArray; +typedef QPair<unsigned int, QSpiObjectReferenceArray> QSpiRelationArrayEntry; +typedef QVector<QSpiRelationArrayEntry> QSpiRelationArray; //a(iisv) struct QSpiTextRange { @@ -125,18 +130,22 @@ struct QSpiTextRange { QString contents; QVariant v; }; -typedef QList <QSpiTextRange> QSpiTextRangeList; +Q_DECLARE_TYPEINFO(QSpiTextRange, Q_MOVABLE_TYPE); + +typedef QVector<QSpiTextRange> QSpiTextRangeList; typedef QMap <QString, QString> QSpiAttributeSet; enum QSpiAppUpdateType { QSPI_APP_UPDATE_ADDED = 0, QSPI_APP_UPDATE_REMOVED = 1 }; +Q_DECLARE_TYPEINFO(QSpiAppUpdateType, Q_PRIMITIVE_TYPE); struct QSpiAppUpdate { int type; /* Is an application added or removed */ QString address; /* D-Bus address of application added or removed */ }; +Q_DECLARE_TYPEINFO(QSpiAppUpdate, Q_MOVABLE_TYPE); QDBusArgument &operator<<(QDBusArgument &argument, const QSpiAppUpdate &update); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiAppUpdate &update); @@ -150,6 +159,7 @@ struct QSpiDeviceEvent { QString text; bool isText; }; +Q_DECLARE_TYPEINFO(QSpiDeviceEvent, Q_MOVABLE_TYPE); QDBusArgument &operator<<(QDBusArgument &argument, const QSpiDeviceEvent &event); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiDeviceEvent &event); |