a11y atspi: Send AT-SPI signals with correct signature

The AT-SPI2 XML spec for all signals/events [1] that Qt emits
specifies the DBus arguments signature as "siiva{sv}".

Qt however was incorrectly sending arguments with an "siiv(so)"
signature instead, by sending the QSpiObjectReference as last
argument.

Fix this by sending the events with the proper signature, using an
empty QMap<QString, QVariant> for the properties (that translates
to an "a{sv}" type for DBus).

[1] 33b45aea12/xml/Event.xml

Fixes: QTBUG-130843
Pick-to: 6.8
Change-Id: If023763626be3d17b091466b17829d62d29fdede
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Michael Weghorn 2024-11-04 12:44:20 +01:00
parent bde08d7343
commit fdf87fdce1
2 changed files with 3 additions and 4 deletions

View File

@ -890,11 +890,10 @@ void AtSpiAdaptor::windowActivated(QObject* window, bool active)
sendDBusSignal(path, ATSPI_DBUS_INTERFACE_EVENT_OBJECT ""_L1, "StateChanged"_L1, stateArgs);
}
QVariantList AtSpiAdaptor::packDBusSignalArguments(const QString &type, int data1, int data2, const QVariant &variantData) const
QVariantList AtSpiAdaptor::packDBusSignalArguments(const QString &type, int data1, int data2, const QVariant &variantData)
{
QVariantList arguments;
arguments << type << data1 << data2 << variantData
<< QVariant::fromValue(QSpiObjectReference(m_dbus->connection(), QDBusObjectPath(QSPI_OBJECT_PATH_ROOT)));
arguments << type << data1 << data2 << variantData << QMap<QString, QVariant>();
return arguments;
}

View File

@ -56,7 +56,7 @@ private:
void setBitFlag(const QString &flag);
// sending messages
QVariantList packDBusSignalArguments(const QString &type, int data1, int data2, const QVariant &variantData) const;
static QVariantList packDBusSignalArguments(const QString &type, int data1, int data2, const QVariant &variantData);
bool sendDBusSignal(const QString &path, const QString &interface, const QString &name, const QVariantList &arguments) const;
QVariant variantForPath(const QString &path) const;