bool QSpiApplicationAdaptor::eventFilter(QObject *target, QEvent *event) { if (!event->spontaneous()) return false; switch (event->type()) { case QEvent::WindowActivate: emit windowActivated(target, true); break; case QEvent::WindowDeactivate: emit windowActivated(target, false); break; case QEvent::KeyPress: case QEvent::KeyRelease: { QKeyEvent *keyEvent = static_cast <QKeyEvent *>(event); QSpiDeviceEvent de; if (event->type() == QEvent::KeyPress) de.type = QSPI_KEY_EVENT_PRESS; else de.type = QSPI_KEY_EVENT_RELEASE; 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_Left) de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? QStringLiteral("KP_Left") : QStringLiteral("Left"); else if (keyEvent->key() == Qt::Key_Right) de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? QStringLiteral("KP_Right") : QStringLiteral("Right"); else if (keyEvent->key() == Qt::Key_Up) de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? QStringLiteral("KP_Up") : QStringLiteral("Up"); else if (keyEvent->key() == Qt::Key_Down) de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? QStringLiteral("KP_Down") : QStringLiteral("Down"); else if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) de.text = QStringLiteral("Return"); else if (keyEvent->key() == Qt::Key_Backspace) de.text = QStringLiteral("BackSpace"); else if (keyEvent->key() == Qt::Key_Delete) de.text = QStringLiteral("Delete"); else if (keyEvent->key() == Qt::Key_PageUp) de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? QStringLiteral("KP_Page_Up") : QStringLiteral("Page_Up"); else if (keyEvent->key() == Qt::Key_PageDown) de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? QStringLiteral("KP_Page_Up") : QStringLiteral("Page_Down"); else if (keyEvent->key() == Qt::Key_Home) de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? QStringLiteral("KP_Home") : QStringLiteral("Home"); else if (keyEvent->key() == Qt::Key_End) de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? QStringLiteral("KP_End") : QStringLiteral("End"); else if (keyEvent->key() == Qt::Key_Clear && (keyEvent->modifiers() & Qt::KeypadModifier)) de.text = QStringLiteral("KP_Begin"); // Key pad 5 else if (keyEvent->key() == Qt::Key_Escape) de.text = QStringLiteral("Escape"); else if (keyEvent->key() == Qt::Key_Space) de.text = QStringLiteral("space"); else if (keyEvent->key() == Qt::Key_CapsLock) de.text = QStringLiteral("Caps_Lock"); else if (keyEvent->key() == Qt::Key_NumLock) de.text = QStringLiteral("Num_Lock"); else if (keyEvent->key() == Qt::Key_Insert) de.text = QStringLiteral("Insert"); else de.text = keyEvent->text(); // This is a bit dubious, Gnome uses some gtk function here. // Long term the spec will hopefully change to just use keycodes. de.isText = !de.text.isEmpty(); #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(); #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() <<QVariant::fromValue(de)); // FIXME: this is critical, the timeout should probably be pretty low to allow normal processing int timeout = 100; bool sent = dbusConnection.callWithCallback(m, this, SLOT(notifyKeyboardListenerCallback(QDBusMessage)), SLOT(notifyKeyboardListenerError(QDBusError, QDBusMessage)), timeout); if (sent) { //queue the event and send it after callback keyEvents.enqueue(QPair<QObject*, QKeyEvent*> (target, copyKeyEvent(keyEvent))); #ifdef KEYBOARD_DEBUG qDebug() << QStringLiteral("Sent key: ") << de.text; #endif return true; } } default: break; } return false; }
bool QSpiApplicationAdaptor::eventFilter(QObject *target, QEvent *event) { if (!event->spontaneous()) return false; switch (event->type()) { case QEvent::WindowActivate: { emit windowActivated(target, true); break; case QEvent::WindowDeactivate: emit windowActivated(target, false); break; } case QEvent::KeyPress: case QEvent::KeyRelease: { QKeyEvent *keyEvent = static_cast <QKeyEvent *>(event); QSpiDeviceEvent de; if (event->type() == QEvent::KeyPress) de.type = QSPI_KEY_EVENT_PRESS; else de.type = QSPI_KEY_EVENT_RELEASE; de.id = keyEvent->nativeVirtualKey(); de.hardwareCode = keyEvent->nativeScanCode(); de.modifiers = keyEvent->nativeModifiers(); de.timestamp = QDateTime::currentMSecsSinceEpoch(); // FIXME: how to generate key strings? // FIXME: localize? if (keyEvent->key() == Qt::Key_Tab) { de.text = "Tab"; } else if (keyEvent->key() == Qt::Key_Backtab) { de.text = "Backtab"; } else if (keyEvent->key() == Qt::Key_Left) { de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? "KP_Left" : "Left"; } else if (keyEvent->key() == Qt::Key_Right) { de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? "KP_Right" : "Right"; } else if (keyEvent->key() == Qt::Key_Up) { de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? "KP_Up" : "Up"; } else if (keyEvent->key() == Qt::Key_Down) { de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? "KP_Down" : "Down"; } else if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) { de.text = "Return"; } else if (keyEvent->key() == Qt::Key_Backspace) { de.text = "BackSpace"; } else if (keyEvent->key() == Qt::Key_Delete) { de.text = "Delete"; } else if (keyEvent->key() == Qt::Key_PageUp) { de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? "KP_Page_Up" : "Page_Up"; } else if (keyEvent->key() == Qt::Key_PageDown) { de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? "KP_Page_Up" : "Page_Down"; } else if (keyEvent->key() == Qt::Key_Home) { de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? "KP_Home" : "Home"; } else if (keyEvent->key() == Qt::Key_End) { de.text = (keyEvent->modifiers() & Qt::KeypadModifier) ? "KP_End" : "End"; } else if (keyEvent->key() == Qt::Key_Clear && (keyEvent->modifiers() & Qt::KeypadModifier)) { de.text = "KP_Begin"; // Key pad 5 } else if (keyEvent->key() == Qt::Key_Escape) { de.text = "Escape"; } else if (keyEvent->key() == Qt::Key_Space) { de.text = "space"; } else if (keyEvent->key() == Qt::Key_CapsLock) { de.text = "Caps_Lock"; } else if (keyEvent->key() == Qt::Key_NumLock) { de.text = "Num_Lock"; } else if (keyEvent->key() == Qt::Key_Insert) { de.text = "Insert"; } else { de.text = keyEvent->text(); } // "F1", "F2", "F3", "F4", "F5", "F6", // "F7", "F8", "F9", "F10", "F11", "F12" // FIXME de.isText = !de.text.isEmpty(); #ifdef KEYBOARD_DEBUG qDebug() << "Key event text: " << event->type() << de.isText << " " << de.text << " hardware code: " << de.hardwareCode << " native sc: " << keyEvent->nativeScanCode() << " native mod: " << keyEvent->nativeModifiers() << "native virt: " << keyEvent->nativeVirtualKey(); #endif QDBusMessage m = QDBusMessage::createMethodCall("org.a11y.atspi.Registry", "/org/a11y/atspi/registry/deviceeventcontroller", "org.a11y.atspi.DeviceEventController", "NotifyListenersSync"); m.setArguments(QVariantList() <<QVariant::fromValue(de)); // FIXME: this is critical, the timeout should probably be pretty low to allow normal processing int timeout = 300; bool sent = dbusConnection.callWithCallback(m, this, SLOT(notifyKeyboardListenerCallback(QDBusMessage)), SLOT(notifyKeyboardListenerError(QDBusError, QDBusMessage)), timeout); if (sent) { //queue the event and send it after callback keyEvents.enqueue(QPair<QObject*, QKeyEvent*> (target, copyKeyEvent(keyEvent))); return true; } } default: break; } return false; }