Skip to content

Commit

Permalink
Accessibility Linux: add action interfaces for value
Browse files Browse the repository at this point in the history
Change-Id: I454493fc6e9e93f44d15986ca843c3244f97cbe6
Reviewed-by: Jan Arve Sæther <[email protected]>
  • Loading branch information
gladhorn committed Aug 19, 2014
1 parent ae5f2a6 commit cf621f1
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 23 deletions.
57 changes: 35 additions & 22 deletions src/platformsupport/linuxaccessibility/atspiadaptor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@

#include "socket_interface.h"
#include "constant_mappings_p.h"
#include "../accessibility/qaccessiblebridgeutils_p.h"

#include "application_p.h"
/*!
Expand Down Expand Up @@ -1485,7 +1486,7 @@ QStringList AtSpiAdaptor::accessibleInterfaces(QAccessibleInterface *interface)
if (interface->role() == QAccessible::Application)
ifaces << QLatin1String(ATSPI_DBUS_INTERFACE_APPLICATION);

if (interface->actionInterface())
if (interface->actionInterface() || interface->valueInterface())
ifaces << QLatin1String(ATSPI_DBUS_INTERFACE_ACTION);

if (interface->textInterface())
Expand Down Expand Up @@ -1695,36 +1696,44 @@ QRect AtSpiAdaptor::getExtents(QAccessibleInterface *interface, uint coordType)
// Action interface
bool AtSpiAdaptor::actionInterface(QAccessibleInterface *interface, const QString &function, const QDBusMessage &message, const QDBusConnection &connection)
{
QAccessibleActionInterface *actionIface = interface->actionInterface();
if (!actionIface)
return false;

if (function == QLatin1String("GetNActions")) {
sendReply(connection, message, QVariant::fromValue(QDBusVariant(QVariant::fromValue(actionIface->actionNames().count()))));
int count = QAccessibleBridgeUtils::effectiveActionNames(interface).count();
sendReply(connection, message, QVariant::fromValue(QDBusVariant(QVariant::fromValue(count))));
} else if (function == QLatin1String("DoAction")) {
int index = message.arguments().at(0).toInt();
if (index < 0 || index >= actionIface->actionNames().count())
const QStringList actionNames = QAccessibleBridgeUtils::effectiveActionNames(interface);
if (index < 0 || index >= actionNames.count())
return false;
interface->actionInterface()->doAction(actionIface->actionNames().at(index));
sendReply(connection, message, true);
const QString actionName = actionNames.at(index);
bool success = QAccessibleBridgeUtils::performEffectiveAction(interface, actionName);
sendReply(connection, message, success);
} else if (function == QLatin1String("GetActions")) {
sendReply(connection, message, QVariant::fromValue(getActions(actionIface)));
sendReply(connection, message, QVariant::fromValue(getActions(interface)));
} else if (function == QLatin1String("GetName")) {
int index = message.arguments().at(0).toInt();
if (index < 0 || index >= actionIface->actionNames().count())
const QStringList actionNames = QAccessibleBridgeUtils::effectiveActionNames(interface);
if (index < 0 || index >= actionNames.count())
return false;
sendReply(connection, message, actionIface->actionNames().at(index));
sendReply(connection, message, actionNames.at(index));
} else if (function == QLatin1String("GetDescription")) {
int index = message.arguments().at(0).toInt();
if (index < 0 || index >= actionIface->actionNames().count())
const QStringList actionNames = QAccessibleBridgeUtils::effectiveActionNames(interface);
if (index < 0 || index >= actionNames.count())
return false;
sendReply(connection, message, actionIface->localizedActionDescription(actionIface->actionNames().at(index)));
QString description;
if (QAccessibleActionInterface *actionIface = interface->actionInterface())
description = actionIface->localizedActionDescription(actionNames.at(index));
else
description = qAccessibleLocalizedActionDescription(actionNames.at(index));
sendReply(connection, message, description);
} else if (function == QLatin1String("GetKeyBinding")) {
int index = message.arguments().at(0).toInt();
if (index < 0 || index >= actionIface->actionNames().count())
const QStringList actionNames = QAccessibleBridgeUtils::effectiveActionNames(interface);
if (index < 0 || index >= actionNames.count())
return false;
QStringList keyBindings;
keyBindings = actionIface->keyBindingsForAction(actionIface->actionNames().value(index));
if (QAccessibleActionInterface *actionIface = interface->actionInterface())
keyBindings = actionIface->keyBindingsForAction(actionNames.at(index));
if (keyBindings.isEmpty()) {
QString acc = interface->text(QAccessible::Accelerator);
if (!acc.isEmpty())
Expand All @@ -1741,20 +1750,24 @@ bool AtSpiAdaptor::actionInterface(QAccessibleInterface *interface, const QStrin
return true;
}

QSpiActionArray AtSpiAdaptor::getActions(QAccessibleActionInterface *actionInterface) const
QSpiActionArray AtSpiAdaptor::getActions(QAccessibleInterface *interface) const
{
QAccessibleActionInterface *actionInterface = interface->actionInterface();
QSpiActionArray actions;
Q_FOREACH (const QString &actionName, actionInterface->actionNames()) {
Q_FOREACH (const QString &actionName, QAccessibleBridgeUtils::effectiveActionNames(interface)) {
QSpiAction action;
QStringList keyBindings;

action.name = actionName;
action.description = actionInterface->localizedActionDescription(actionName);

keyBindings = actionInterface->keyBindingsForAction(actionName);
if (actionInterface) {
action.description = actionInterface->localizedActionDescription(actionName);
keyBindings = actionInterface->keyBindingsForAction(actionName);
} else {
action.description = qAccessibleLocalizedActionDescription(actionName);
}

if (keyBindings.length() > 0)
action.keyBinding = keyBindings[0];
action.keyBinding = keyBindings[0];
else
action.keyBinding = QString();

Expand Down
2 changes: 1 addition & 1 deletion src/platformsupport/linuxaccessibility/atspiadaptor_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ public Q_SLOTS:
static QRect translateRectToWindowCoordinates(QAccessibleInterface *interface, const QRect &rect);

// action helper functions
QSpiActionArray getActions(QAccessibleActionInterface* interface) const;
QSpiActionArray getActions(QAccessibleInterface *interface) const;

// text helper functions
QVariantList getAttributes(QAccessibleInterface *, int offset, bool includeDefaults) const;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ contains(QT_CONFIG, accessibility-atspi-bridge) {

QT_FOR_PRIVATE += dbus
include(../../3rdparty/atspi2/atspi2.pri)
include(../accessibility/accessibility.pri)

INCLUDEPATH += $$PWD

Expand Down

0 comments on commit cf621f1

Please sign in to comment.