From 20144165c8a57bfc43b70fd3d299481944d6d6ba Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Tue, 17 Jun 2014 16:26:10 +0200 Subject: Accessibility Linux: Act more like Gtk for key presses Orca is extremely picky when it comes to key presses and modifiers. Sending ctrl as modifier for itself for example seems to break things. Also use the ATSPI modifier constants, weird as they are. Task-number: QTBUG-39361 Change-Id: Id809e0dd2a7d20a533bd783888ccbdf748becacc Reviewed-by: Gabriel de Dietrich --- .../linuxaccessibility/application.cpp | 39 ++++++++++++++-------- .../linuxaccessibility/application_p.h | 1 + 2 files changed, 27 insertions(+), 13 deletions(-) (limited to 'src/platformsupport') diff --git a/src/platformsupport/linuxaccessibility/application.cpp b/src/platformsupport/linuxaccessibility/application.cpp index ae52ab3b57..2b932a816d 100644 --- a/src/platformsupport/linuxaccessibility/application.cpp +++ b/src/platformsupport/linuxaccessibility/application.cpp @@ -47,6 +47,7 @@ #include #include "deviceeventcontroller_adaptor.h" +#include "atspi/atspi-constants.h" //#define KEYBOARD_DEBUG @@ -62,7 +63,7 @@ QT_BEGIN_NAMESPACE */ QSpiApplicationAdaptor::QSpiApplicationAdaptor(const QDBusConnection &connection, QObject *parent) - : QObject(parent), dbusConnection(connection) + : QObject(parent), dbusConnection(connection), inCapsLock(false) { } @@ -107,13 +108,14 @@ bool QSpiApplicationAdaptor::eventFilter(QObject *target, QEvent *event) de.id = keyEvent->nativeVirtualKey(); de.hardwareCode = keyEvent->nativeScanCode(); - de.modifiers = keyEvent->nativeModifiers(); de.timestamp = QDateTime::currentMSecsSinceEpoch(); if (keyEvent->key() == Qt::Key_Tab) de.text = QStringLiteral("Tab"); else if (keyEvent->key() == Qt::Key_Backtab) de.text = QStringLiteral("Backtab"); + else if (keyEvent->key() == Qt::Key_Control) + de.text = QStringLiteral("Control_L"); else if (keyEvent->key() == Qt::Key_Left) de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? QStringLiteral("KP_Left") : QStringLiteral("Left"); else if (keyEvent->key() == Qt::Key_Right) @@ -142,9 +144,13 @@ bool QSpiApplicationAdaptor::eventFilter(QObject *target, QEvent *event) de.text = QStringLiteral("Escape"); else if (keyEvent->key() == Qt::Key_Space) de.text = QStringLiteral("space"); - else if (keyEvent->key() == Qt::Key_CapsLock) + else if (keyEvent->key() == Qt::Key_CapsLock) { de.text = QStringLiteral("Caps_Lock"); - else if (keyEvent->key() == Qt::Key_NumLock) + if (event->type() == QEvent::KeyPress) + inCapsLock = true; + else + inCapsLock = false; + } else if (keyEvent->key() == Qt::Key_NumLock) de.text = QStringLiteral("Num_Lock"); else if (keyEvent->key() == Qt::Key_Insert) de.text = QStringLiteral("Insert"); @@ -155,18 +161,28 @@ bool QSpiApplicationAdaptor::eventFilter(QObject *target, QEvent *event) // Long term the spec will hopefully change to just use keycodes. de.isText = !de.text.isEmpty(); + de.modifiers = 0; + if (!inCapsLock && keyEvent->modifiers() & Qt::ShiftModifier) + de.modifiers |= 1 << ATSPI_MODIFIER_SHIFT; + if (inCapsLock && (keyEvent->key() != Qt::Key_CapsLock)) + de.modifiers |= 1 << ATSPI_MODIFIER_SHIFTLOCK; + if ((keyEvent->modifiers() & Qt::ControlModifier) && (keyEvent->key() != Qt::Key_Control)) + de.modifiers |= 1 << ATSPI_MODIFIER_CONTROL; + if ((keyEvent->modifiers() & Qt::AltModifier) && (keyEvent->key() != Qt::Key_Alt)) + de.modifiers |= 1 << ATSPI_MODIFIER_ALT; + #ifdef KEYBOARD_DEBUG - qDebug() << QStringLiteral("Key event text: ") << event->type() << de.isText << QStringLiteral(" ") << de.text - << QStringLiteral(" hardware code: ") << de.hardwareCode - << QStringLiteral(" native sc: ") << keyEvent->nativeScanCode() - << QStringLiteral(" native mod: ") << keyEvent->nativeModifiers() - << QStringLiteral("native virt: ") << keyEvent->nativeVirtualKey(); + qDebug() << QStringLiteral("Key event text:") << event->type() << de.text + << QStringLiteral("native virtual key:") << de.id + << QStringLiteral("hardware code/scancode:") << de.hardwareCode + << QStringLiteral("modifiers:") << de.modifiers + << QStringLiteral("text:") << de.text; #endif QDBusMessage m = QDBusMessage::createMethodCall(QStringLiteral("org.a11y.atspi.Registry"), QStringLiteral("/org/a11y/atspi/registry/deviceeventcontroller"), QStringLiteral("org.a11y.atspi.DeviceEventController"), QStringLiteral("NotifyListenersSync")); - m.setArguments(QVariantList() <, QKeyEvent*> (QPointer(target), copyKeyEvent(keyEvent))); -#ifdef KEYBOARD_DEBUG - qDebug() << QStringLiteral("Sent key: ") << de.text; -#endif return true; } } diff --git a/src/platformsupport/linuxaccessibility/application_p.h b/src/platformsupport/linuxaccessibility/application_p.h index e8684ab2b5..4cdce4de9e 100644 --- a/src/platformsupport/linuxaccessibility/application_p.h +++ b/src/platformsupport/linuxaccessibility/application_p.h @@ -78,6 +78,7 @@ private: QQueue, QKeyEvent*> > keyEvents; QDBusConnection dbusConnection; + bool inCapsLock; }; QT_END_NAMESPACE -- cgit v1.2.3