diff options
Diffstat (limited to 'src/platformsupport/linuxaccessibility')
14 files changed, 116 insertions, 53 deletions
diff --git a/src/platformsupport/linuxaccessibility/application.cpp b/src/platformsupport/linuxaccessibility/application.cpp index c2049e536a..22059de864 100644 --- a/src/platformsupport/linuxaccessibility/application.cpp +++ b/src/platformsupport/linuxaccessibility/application.cpp @@ -52,6 +52,8 @@ QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + /*! \class QSpiApplicationAdaptor \internal @@ -217,4 +219,6 @@ void QSpiApplicationAdaptor::notifyKeyboardListenerError(const QDBusError& error } } +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE diff --git a/src/platformsupport/linuxaccessibility/application_p.h b/src/platformsupport/linuxaccessibility/application_p.h index 14b8a71b42..4a60bbfe84 100644 --- a/src/platformsupport/linuxaccessibility/application_p.h +++ b/src/platformsupport/linuxaccessibility/application_p.h @@ -49,6 +49,8 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + /* * Used for the root object. * @@ -80,6 +82,8 @@ private: QDBusConnection dbusConnection; }; +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp index 6926f546a2..534cf4b73a 100644 --- a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp +++ b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp @@ -65,6 +65,8 @@ QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + static bool isDebugging = false; #define qAtspiDebug if (!::isDebugging); else qDebug @@ -99,6 +101,7 @@ AtSpiAdaptor::AtSpiAdaptor(DBusConnection *connection, QObject *parent) , sendObject_row_inserted(0) , sendObject_row_reordered(0) , sendObject_selection_changed(0) + , sendObject_state_changed(0) , sendObject_text_attributes_changed(0) , sendObject_text_bounds_changed(0) , sendObject_text_caret_moved(0) @@ -903,6 +906,14 @@ QAIPointer AtSpiAdaptor::interfaceFromPath(const QString& dbusPath) const return QAIPointer(); } +void AtSpiAdaptor::notifyStateChange(const QAIPointer &interface, const QString &state, int value) +{ + QString path = pathForInterface(interface); + QVariantList stateArgs = packDBusSignalArguments(state, value, 0, variantForPath(path)); + sendDBusSignal(path, QLatin1String(ATSPI_DBUS_INTERFACE_EVENT_OBJECT), + QLatin1String("StateChanged"), stateArgs); +} + /*! This function gets called when Qt notifies about accessibility updates. @@ -919,19 +930,13 @@ void AtSpiAdaptor::notify(QAccessibleEvent *event) break; case QAccessible::ObjectShow: { if (sendObject || sendObject_state_changed) { - QString path = pathForInterface(QAIPointer(event->accessibleInterface())); - QVariantList stateArgs = packDBusSignalArguments(QLatin1String("showing"), 1, 0, variantForPath(path)); - sendDBusSignal(path, QLatin1String(ATSPI_DBUS_INTERFACE_EVENT_OBJECT), - QLatin1String("StateChanged"), stateArgs); + notifyStateChange(QAIPointer(event->accessibleInterface()), QLatin1String("showing"), 1); } break; } case QAccessible::ObjectHide: { if (sendObject || sendObject_state_changed) { - QString path = pathForInterface(QAIPointer(event->accessibleInterface())); - QVariantList stateArgs = packDBusSignalArguments(QLatin1String("showing"), 0, 0, variantForPath(path)); - sendDBusSignal(path, QLatin1String(ATSPI_DBUS_INTERFACE_EVENT_OBJECT), - QLatin1String("StateChanged"), stateArgs); + notifyStateChange(QAIPointer(event->accessibleInterface()), QLatin1String("showing"), 0); } break; } @@ -968,7 +973,10 @@ void AtSpiAdaptor::notify(QAccessibleEvent *event) case QAccessible::TextUpdated: { if (sendObject || sendObject_text_changed) { QAIPointer iface = QAIPointer(event->accessibleInterface()); - Q_ASSERT(iface->textInterface()); + if (!iface || !iface->textInterface()) { + qAtspiDebug() << "Received text event for invalid interface."; + return; + } QString path = pathForInterface(iface); int changePosition = 0; @@ -1023,8 +1031,8 @@ void AtSpiAdaptor::notify(QAccessibleEvent *event) case QAccessible::TextCaretMoved: { if (sendObject || sendObject_text_caret_moved) { QAIPointer iface = QAIPointer(event->accessibleInterface()); - if (!iface->textInterface()) { - qWarning() << "Sending TextCaretMoved from object that does not implement text interface: " << iface << iface->object(); + if (!iface || !iface->textInterface()) { + qWarning() << "Sending TextCaretMoved from object that does not implement text interface: " << iface; return; } @@ -1049,9 +1057,13 @@ void AtSpiAdaptor::notify(QAccessibleEvent *event) break; } case QAccessible::ValueChanged: { - if (sendObject || sendObject_value_changed) { + if (sendObject || sendObject_value_changed || sendObject_property_change_accessible_value) { QAIPointer iface = QAIPointer(event->accessibleInterface()); - Q_ASSERT(iface->valueInterface()); + if (!iface || !iface->valueInterface()) { + qWarning() << "ValueChanged event from invalid accessible: " << iface; + return; + } + QString path = pathForInterface(iface); QVariantList args = packDBusSignalArguments(QLatin1String("accessible-value"), 0, 0, variantForPath(path)); sendDBusSignal(path, QLatin1String(ATSPI_DBUS_INTERFACE_EVENT_OBJECT), @@ -1061,6 +1073,10 @@ void AtSpiAdaptor::notify(QAccessibleEvent *event) } case QAccessible::Selection: { QAIPointer iface = QAIPointer(event->accessibleInterface()); + if (!iface) { + qWarning() << "Selection event from invalid accessible."; + return; + } QString path = pathForInterface(iface); int selected = iface->state().selected ? 1 : 0; QVariantList stateArgs = packDBusSignalArguments(QLatin1String("selected"), selected, 0, variantForPath(path)); @@ -1074,14 +1090,15 @@ void AtSpiAdaptor::notify(QAccessibleEvent *event) QAccessible::State stateChange = static_cast<QAccessibleStateChangeEvent*>(event)->changedStates(); if (stateChange.checked) { QAIPointer iface = QAIPointer(event->accessibleInterface()); + if (!iface) { + qWarning() << "StateChanged event from invalid accessible."; + return; + } int checked = iface->state().checked; - QString path = pathForInterface(iface); - QVariantList args = packDBusSignalArguments(QLatin1String("checked"), checked, 0, variantForPath(path)); - sendDBusSignal(path, QLatin1String(ATSPI_DBUS_INTERFACE_EVENT_OBJECT), - QLatin1String("StateChanged"), args); + notifyStateChange(iface, QLatin1String("checked"), checked); } else if (stateChange.active) { QAIPointer iface = QAIPointer(event->accessibleInterface()); - if (!(iface->role() == QAccessible::Window && (sendWindow || sendWindow_activate))) + if (!iface || !(iface->role() == QAccessible::Window && (sendWindow || sendWindow_activate))) return; QString windowTitle = iface->text(QAccessible::Name); QDBusVariant data; @@ -1092,9 +1109,15 @@ void AtSpiAdaptor::notify(QAccessibleEvent *event) QString path = pathForInterface(iface); sendDBusSignal(path, QLatin1String(ATSPI_DBUS_INTERFACE_EVENT_WINDOW), status, args); - QVariantList stateArgs = packDBusSignalArguments(QLatin1String("active"), iface->state().active ? 1 : 0, 0, variantForPath(path)); - sendDBusSignal(path, QLatin1String(ATSPI_DBUS_INTERFACE_EVENT_OBJECT), - QLatin1String("StateChanged"), stateArgs); + int isActive = iface->state().active; + notifyStateChange(iface, QLatin1String("active"), isActive); + } else if (stateChange.disabled) { + QAIPointer iface = QAIPointer(event->accessibleInterface()); + QAccessible::State state = iface->state(); + bool enabled = !state.disabled; + + notifyStateChange(iface, QLatin1String("enabled"), enabled); + notifyStateChange(iface, QLatin1String("sensitive"), enabled); } } break; @@ -2093,44 +2116,35 @@ bool AtSpiAdaptor::editableTextInterface(const QAIPointer &interface, const QStr // Value interface bool AtSpiAdaptor::valueInterface(const QAIPointer &interface, const QString &function, const QDBusMessage &message, const QDBusConnection &connection) { - if (0) { - } else if (function == QLatin1String("SetCurrentValue")) { + if (function == QLatin1String("SetCurrentValue")) { QDBusVariant v = message.arguments().at(2).value<QDBusVariant>(); double value = v.variant().toDouble(); //Temporary fix //See https://bugzilla.gnome.org/show_bug.cgi?id=652596 interface->valueInterface()->setCurrentValue(value); connection.send(message.createReply()); // FIXME is the reply needed? - } else if (function == QLatin1String("GetCurrentValue")) { - bool success; - double val = interface->valueInterface()->currentValue().toDouble(&success); - if (!success) { - qAtspiDebug ("AtSpiAdaptor::valueInterface: Could not convert current value to double."); - } - connection.send(message.createReply( - QVariant::fromValue(QDBusVariant(QVariant::fromValue(val))))); - } else if (function == QLatin1String("GetMaximumValue")) { - bool success; - double val = interface->valueInterface()->maximumValue().toDouble(&success); - if (!success) { - qAtspiDebug ("AtSpiAdaptor::valueInterface: Could not convert current value to double."); + } else { + QVariant value; + if (function == QLatin1String("GetCurrentValue")) + value = interface->valueInterface()->currentValue(); + else if (function == QLatin1String("GetMaximumValue")) + value = interface->valueInterface()->maximumValue(); + else if (function == QLatin1String("GetMinimumIncrement")) + value = interface->valueInterface()->minimumStepSize(); + else if (function == QLatin1String("GetMinimumValue")) + value = interface->valueInterface()->minimumValue(); + else { + qAtspiDebug() << "WARNING: AtSpiAdaptor::valueInterface does not implement " << function << message.path(); + return false; } - connection.send(message.createReply( - QVariant::fromValue(QDBusVariant(QVariant::fromValue(val))))); - } else if (function == QLatin1String("GetMinimumIncrement")) { - connection.send(message.createReply( - QVariant::fromValue(QDBusVariant(QVariant::fromValue(0.0))))); - } else if (function == QLatin1String("GetMinimumValue")) { - bool success; - double val = interface->valueInterface()->minimumValue().toDouble(&success); - if (!success) { - qAtspiDebug ("AtSpiAdaptor::valueInterface: Could not convert current value to double."); + if (!value.canConvert(QVariant::Double)) { + qAtspiDebug() << "AtSpiAdaptor::valueInterface: Could not convert to double: " << function; } + + // explicitly convert to dbus-variant containing one double since atspi expects that + // everything else might fail to convert back on the other end connection.send(message.createReply( - QVariant::fromValue(QDBusVariant(QVariant::fromValue(val))))); - } else { - qAtspiDebug() << "WARNING: AtSpiAdaptor::valueInterface does not implement " << function << message.path(); - return false; + QVariant::fromValue(QDBusVariant(QVariant::fromValue(value.toDouble()))))); } return true; } @@ -2345,4 +2359,6 @@ bool AtSpiAdaptor::tableInterface(const QAIPointer &interface, const QString &fu return true; } +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE diff --git a/src/platformsupport/linuxaccessibility/atspiadaptor_p.h b/src/platformsupport/linuxaccessibility/atspiadaptor_p.h index 4a8ff23bef..e6f95195fe 100644 --- a/src/platformsupport/linuxaccessibility/atspiadaptor_p.h +++ b/src/platformsupport/linuxaccessibility/atspiadaptor_p.h @@ -56,6 +56,8 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + class QAccessibleInterface; class QSpiAccessibleInterface; class QSpiApplicationAdaptor; @@ -111,6 +113,8 @@ private: QString pathForInterface(const QAIPointer &interface, bool inDestructor = false) const; QString pathForObject(QObject *object) const; + void notifyStateChange(const QAIPointer& interface, const QString& state, int value); + // accessible helper functions AtspiRole getRole(const QAIPointer &interface) const; QSpiRelationArray relationSet(const QAIPointer &interface, const QDBusConnection &connection) const; @@ -214,6 +218,8 @@ private: uint sendWindow_unshade : 1; }; +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/platformsupport/linuxaccessibility/bridge.cpp b/src/platformsupport/linuxaccessibility/bridge.cpp index f22dc4e191..bf2486fc57 100644 --- a/src/platformsupport/linuxaccessibility/bridge.cpp +++ b/src/platformsupport/linuxaccessibility/bridge.cpp @@ -56,6 +56,8 @@ QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + /*! \class QSpiAccessibleBridge \internal @@ -182,4 +184,6 @@ void QSpiAccessibleBridge::initializeConstantMappings() qSpiRoleMapping.insert(map[i].role, RoleNames(map[i].spiRole, QLatin1String(map[i].name), tr(map[i].name))); } +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE diff --git a/src/platformsupport/linuxaccessibility/bridge_p.h b/src/platformsupport/linuxaccessibility/bridge_p.h index f7c243cfbb..3865e06489 100644 --- a/src/platformsupport/linuxaccessibility/bridge_p.h +++ b/src/platformsupport/linuxaccessibility/bridge_p.h @@ -51,6 +51,8 @@ class DeviceEventControllerAdaptor; QT_BEGIN_HEADER QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + class DBusConnection; class QSpiDBusCache; class AtSpiAdaptor; @@ -79,6 +81,8 @@ private: bool initialized; }; +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/platformsupport/linuxaccessibility/cache.cpp b/src/platformsupport/linuxaccessibility/cache.cpp index 81a54a1ce5..9201fc1d8b 100644 --- a/src/platformsupport/linuxaccessibility/cache.cpp +++ b/src/platformsupport/linuxaccessibility/cache.cpp @@ -49,6 +49,8 @@ QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + /*! \class QSpiDBusCache \internal @@ -89,4 +91,6 @@ QSpiAccessibleCacheArray QSpiDBusCache::GetItems() return cacheArray; } +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE diff --git a/src/platformsupport/linuxaccessibility/cache_p.h b/src/platformsupport/linuxaccessibility/cache_p.h index 898f06f0d6..4b606eadb1 100644 --- a/src/platformsupport/linuxaccessibility/cache_p.h +++ b/src/platformsupport/linuxaccessibility/cache_p.h @@ -49,6 +49,8 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + class QSpiDBusCache : public QObject { Q_OBJECT @@ -66,6 +68,8 @@ public Q_SLOTS: QSpiAccessibleCacheArray GetItems(); }; +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/platformsupport/linuxaccessibility/constant_mappings.cpp b/src/platformsupport/linuxaccessibility/constant_mappings.cpp index a15355f9d3..5138b9a163 100644 --- a/src/platformsupport/linuxaccessibility/constant_mappings.cpp +++ b/src/platformsupport/linuxaccessibility/constant_mappings.cpp @@ -55,6 +55,8 @@ QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + QHash <QAccessible::Role, RoleNames> qSpiRoleMapping; quint64 spiStatesFromQState(QAccessible::State state) @@ -69,8 +71,6 @@ quint64 spiStatesFromQState(QAccessible::State state) if (state.disabled) { unsetSpiStateBit(&spiState, ATSPI_STATE_ENABLED); - unsetSpiStateBit(&spiState, ATSPI_STATE_SHOWING); - unsetSpiStateBit(&spiState, ATSPI_STATE_VISIBLE); unsetSpiStateBit(&spiState, ATSPI_STATE_SENSITIVE); } @@ -156,4 +156,6 @@ AtspiRelationType qAccessibleRelationToAtSpiRelation(QAccessible::Relation relat return ATSPI_RELATION_NULL; } +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE diff --git a/src/platformsupport/linuxaccessibility/constant_mappings_p.h b/src/platformsupport/linuxaccessibility/constant_mappings_p.h index 837a68516d..870a3a4b2a 100644 --- a/src/platformsupport/linuxaccessibility/constant_mappings_p.h +++ b/src/platformsupport/linuxaccessibility/constant_mappings_p.h @@ -53,6 +53,7 @@ #include <QtGui/QAccessible> #include <atspi/atspi-constants.h> +#ifndef QT_NO_ACCESSIBILITY // interface names from at-spi2-core/atspi/atspi-misc-private.h #define ATSPI_DBUS_NAME_REGISTRY "org.a11y.atspi.Registry" @@ -135,4 +136,6 @@ AtspiRelationType qAccessibleRelationToAtSpiRelation(QAccessible::Relation relat QT_END_NAMESPACE QT_END_HEADER +#endif // QT_NO_ACCESSIBILITY + #endif /* Q_SPI_CONSTANT_MAPPINGS_H */ diff --git a/src/platformsupport/linuxaccessibility/dbusconnection.cpp b/src/platformsupport/linuxaccessibility/dbusconnection.cpp index a99e8f0a5e..a38570a465 100644 --- a/src/platformsupport/linuxaccessibility/dbusconnection.cpp +++ b/src/platformsupport/linuxaccessibility/dbusconnection.cpp @@ -48,6 +48,8 @@ QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + /*! \class DBusConnection \internal @@ -104,4 +106,6 @@ QDBusConnection DBusConnection::connection() const return dbusConnection; } +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE diff --git a/src/platformsupport/linuxaccessibility/dbusconnection_p.h b/src/platformsupport/linuxaccessibility/dbusconnection_p.h index 674cf28c34..da090da9cf 100644 --- a/src/platformsupport/linuxaccessibility/dbusconnection_p.h +++ b/src/platformsupport/linuxaccessibility/dbusconnection_p.h @@ -49,6 +49,8 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + class DBusConnection { public: @@ -62,6 +64,8 @@ private: QDBusConnection dbusConnection; }; +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/platformsupport/linuxaccessibility/linuxaccessibility.pri b/src/platformsupport/linuxaccessibility/linuxaccessibility.pri index 85a02da004..09d437678f 100644 --- a/src/platformsupport/linuxaccessibility/linuxaccessibility.pri +++ b/src/platformsupport/linuxaccessibility/linuxaccessibility.pri @@ -1,4 +1,4 @@ -contains(QT_CONFIG, dbus):contains(QT_CONFIG, xcb):contains(QT_CONFIG, accessibility) { +qtHaveModule(dbus):contains(QT_CONFIG, xcb):contains(QT_CONFIG, accessibility) { QT += dbus include(../../3rdparty/atspi2/atspi2.pri) diff --git a/src/platformsupport/linuxaccessibility/struct_marshallers.cpp b/src/platformsupport/linuxaccessibility/struct_marshallers.cpp index 713e26f25a..027993c4bd 100644 --- a/src/platformsupport/linuxaccessibility/struct_marshallers.cpp +++ b/src/platformsupport/linuxaccessibility/struct_marshallers.cpp @@ -50,6 +50,8 @@ QT_BEGIN_NAMESPACE +#ifndef QT_NO_ACCESSIBILITY + QSpiObjectReference::QSpiObjectReference() : path(QDBusObjectPath(ATSPI_DBUS_PATH_NULL)) {} @@ -234,4 +236,6 @@ void qSpiInitializeStructTypes() qDBusRegisterMetaType<QSpiRelationArray>(); } +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE |