diff options
author | Elvis Lee <kwangwoong.lee@lge.com> | 2020-09-24 16:54:50 +0900 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2020-10-27 23:37:41 +0100 |
commit | 4b899a29fa5a8acc381673e6b527345f8eaad7b5 (patch) | |
tree | 0cf12c82c677f5cab56e26a2984dd7c4f54f38f6 /src/platformsupport | |
parent | fd8e6a203ecfeebc03772b3bce14c91a6fc0a8e1 (diff) | |
download | qtbase-4b899a29fa5a8acc381673e6b527345f8eaad7b5.tar.gz |
webOS: Support mapping evdev keyboard and touchscreen to specific window
First we refactor QTouchOutputMapping into a QOutputMapping base class and
a QDefaultOutputMapping subclass, because it will be used to map more kinds
of devices, not only touchscreens.
On WebOS, the plan is to have a custom subclass that overrides an
additional windowForDeviceNode() virtual function, so that events from
specific devices can be sent to specific windows. But in the future,
Qt may have a more generic mechanism for mapping devices to screens,
and of course windows are displayed on screens; so this direct
device->window mapping is likely to be temporary.
In the QT_QPA_EGLFS_KMS_CONFIG JSON configuration, symlinked device
nodes are now supported.
Task-number: QTBUG-85268
Change-Id: Id1f0bb59f4a439abaec6bd35016c95de1cbdb26a
Reviewed-by: Elvis Lee <kwangwoong.lee@lge.com>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/platformsupport')
-rw-r--r-- | src/platformsupport/input/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp | 7 | ||||
-rw-r--r-- | src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp | 10 | ||||
-rw-r--r-- | src/platformsupport/input/libinput/qlibinputtouch.cpp | 34 | ||||
-rw-r--r-- | src/platformsupport/input/libinput/qlibinputtouch_p.h | 1 | ||||
-rw-r--r-- | src/platformsupport/input/shared/qoutputmapping.cpp (renamed from src/platformsupport/input/shared/qtouchoutputmapping.cpp) | 48 | ||||
-rw-r--r-- | src/platformsupport/input/shared/qoutputmapping_p.h (renamed from src/platformsupport/input/shared/qtouchoutputmapping_p.h) | 29 | ||||
-rw-r--r-- | src/platformsupport/input/shared/shared.pri | 4 |
8 files changed, 104 insertions, 31 deletions
diff --git a/src/platformsupport/input/CMakeLists.txt b/src/platformsupport/input/CMakeLists.txt index 0d6c3a34ae..12a1b22e9a 100644 --- a/src/platformsupport/input/CMakeLists.txt +++ b/src/platformsupport/input/CMakeLists.txt @@ -91,7 +91,7 @@ qt_internal_extend_target(InputSupport CONDITION QT_FEATURE_evdev OR QT_FEATURE_ SOURCES shared/devicehandlerlist_p.h shared/qevdevutil.cpp shared/qevdevutil_p.h - shared/qtouchoutputmapping.cpp shared/qtouchoutputmapping_p.h + shared/qoutputmapping.cpp shared/qoutputmapping_p.h ) qt_internal_extend_target(InputSupport CONDITION QT_FEATURE_integrityhid diff --git a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp index 788a135f9e..ec9d588aff 100644 --- a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp +++ b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qevdevkeyboardhandler_p.h" +#include "qoutputmapping_p.h" #include <qplatformdefs.h> @@ -240,7 +241,11 @@ void QEvdevKeyboardHandler::processKeyEvent(int nativecode, int unicode, int qtc if (!autoRepeat) QGuiApplicationPrivate::inputDeviceManager()->setKeyboardModifiers(QEvdevKeyboardHandler::toQtModifiers(m_modifiers)); - QWindowSystemInterface::handleExtendedKeyEvent(0, (isPress ? QEvent::KeyPress : QEvent::KeyRelease), + QWindow *window = nullptr; +#ifdef Q_OS_WEBOS + window = QOutputMapping::get()->windowForDeviceNode(m_device); +#endif + QWindowSystemInterface::handleExtendedKeyEvent(window, (isPress ? QEvent::KeyPress : QEvent::KeyRelease), qtcode, modifiers, nativecode + 8, 0, int(modifiers), (unicode != 0xffff ) ? QString(QChar(unicode)) : QString(), autoRepeat); } diff --git a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp index 37b3ec7fec..0497d210e5 100644 --- a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp +++ b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp @@ -39,7 +39,7 @@ ****************************************************************************/ #include "qevdevtouchhandler_p.h" -#include "qtouchoutputmapping_p.h" +#include "qoutputmapping_p.h" #include <QStringList> #include <QHash> #include <QSocketNotifier> @@ -350,9 +350,9 @@ QEvdevTouchScreenHandler::QEvdevTouchScreenHandler(const QString &device, const if (inverty) d->m_rotate *= QTransform::fromTranslate(0.5, 0.5).scale(1.0, -1.0).translate(-0.5, -0.5); - QTouchOutputMapping mapping; - if (mapping.load()) { - d->m_screenName = mapping.screenNameForDeviceNode(d->deviceNode); + QOutputMapping *mapping = QOutputMapping::get(); + d->m_screenName = mapping->screenNameForDeviceNode(d->deviceNode); + if (mapping->load()) { if (!d->m_screenName.isEmpty()) qCDebug(qLcEvdevTouch, "evdevtouch: Mapping device %ls to screen %ls", qUtf16Printable(d->deviceNode), qUtf16Printable(d->m_screenName)); @@ -728,7 +728,7 @@ QRect QEvdevTouchScreenData::screenGeometry() const // suddenly it was all broken. // // For now we only support the display configuration of the KMS/DRM - // backends of eglfs. See QTouchOutputMapping. + // backends of eglfs. See QOutputMapping. // // The good news it that once winRect refers to the correct screen // geometry in the full virtual desktop space, there is nothing else diff --git a/src/platformsupport/input/libinput/qlibinputtouch.cpp b/src/platformsupport/input/libinput/qlibinputtouch.cpp index 32d1df5b89..ed531f5773 100644 --- a/src/platformsupport/input/libinput/qlibinputtouch.cpp +++ b/src/platformsupport/input/libinput/qlibinputtouch.cpp @@ -38,7 +38,7 @@ ****************************************************************************/ #include "qlibinputtouch_p.h" -#include "qtouchoutputmapping_p.h" +#include "qoutputmapping_p.h" #include <libinput.h> #include <QtGui/QGuiApplication> #include <QtGui/QPointingDevice> @@ -68,9 +68,8 @@ QLibInputTouch::DeviceState *QLibInputTouch::deviceState(libinput_event_touch *e return &m_devState[dev]; } -QPointF QLibInputTouch::getPos(libinput_event_touch *e) +QRect QLibInputTouch::screenGeometry(DeviceState *state) { - DeviceState *state = deviceState(e); QScreen *screen = QGuiApplication::primaryScreen(); if (!state->m_screenName.isEmpty()) { if (!m_screen) { @@ -85,7 +84,13 @@ QPointF QLibInputTouch::getPos(libinput_event_touch *e) if (m_screen) screen = m_screen; } - const QRect geom = QHighDpi::toNativePixels(screen->geometry(), screen); + return QHighDpi::toNativePixels(screen->geometry(), screen); +} + +QPointF QLibInputTouch::getPos(libinput_event_touch *e) +{ + DeviceState *state = deviceState(e); + QRect geom = screenGeometry(state); const double x = libinput_event_touch_get_x_transformed(e, geom.width()); const double y = libinput_event_touch_get_y_transformed(e, geom.height()); return geom.topLeft() + QPointF(x, y); @@ -101,19 +106,26 @@ void QLibInputTouch::registerDevice(libinput_device *dev) qCDebug(qLcLibInput, "libinput: registerDevice %s - %s", qPrintable(devNode), qPrintable(devName)); - QTouchOutputMapping mapping; - if (mapping.load()) { - m_devState[dev].m_screenName = mapping.screenNameForDeviceNode(devNode); - if (!m_devState[dev].m_screenName.isEmpty()) - qCDebug(qLcLibInput, "libinput: Mapping device %s to screen %s", - qPrintable(devNode), qPrintable(m_devState[dev].m_screenName)); + QOutputMapping *mapping = QOutputMapping::get(); + QRect geom; + if (mapping->load()) { + m_devState[dev].m_screenName = mapping->screenNameForDeviceNode(devNode); + if (!m_devState[dev].m_screenName.isEmpty()) { + geom = screenGeometry(&m_devState[dev]); + qCDebug(qLcLibInput) << "libinput: Mapping device" << devNode + << "to screen" << m_devState[dev].m_screenName + << "with geometry" << geom; + } } QPointingDevice *&td = m_devState[dev].m_touchDevice; td = new QPointingDevice(devName, udev_device_get_devnum(udev_device), QInputDevice::DeviceType::TouchScreen, QPointingDevice::PointerType::Finger, QPointingDevice::Capability::Position | QPointingDevice::Capability::Area, 16, 0); - QPointingDevicePrivate::get(td)->busId = QString::fromLocal8Bit(udev_device_get_syspath(udev_device)); // TODO is that the best to choose? + auto devPriv = QPointingDevicePrivate::get(td); + devPriv->busId = QString::fromLocal8Bit(udev_device_get_syspath(udev_device)); // TODO is that the best to choose? + if (!geom.isNull()) + devPriv->setAvailableVirtualGeometry(geom); QWindowSystemInterface::registerInputDevice(td); } diff --git a/src/platformsupport/input/libinput/qlibinputtouch_p.h b/src/platformsupport/input/libinput/qlibinputtouch_p.h index 175e96f583..67c20b9af6 100644 --- a/src/platformsupport/input/libinput/qlibinputtouch_p.h +++ b/src/platformsupport/input/libinput/qlibinputtouch_p.h @@ -83,6 +83,7 @@ private: }; DeviceState *deviceState(libinput_event_touch *e); + QRect screenGeometry(DeviceState *state); QPointF getPos(libinput_event_touch *e); QHash<libinput_device *, DeviceState> m_devState; diff --git a/src/platformsupport/input/shared/qtouchoutputmapping.cpp b/src/platformsupport/input/shared/qoutputmapping.cpp index 0a1afd4739..b1c428dee2 100644 --- a/src/platformsupport/input/shared/qtouchoutputmapping.cpp +++ b/src/platformsupport/input/shared/qoutputmapping.cpp @@ -37,8 +37,9 @@ ** ****************************************************************************/ -#include "qtouchoutputmapping_p.h" +#include "qoutputmapping_p.h" #include <QFile> +#include <QFileInfo> #include <QVariantMap> #include <QJsonDocument> #include <QJsonObject> @@ -46,7 +47,44 @@ QT_BEGIN_NAMESPACE -bool QTouchOutputMapping::load() +static QOutputMapping *s_outputMapping = nullptr; + +QOutputMapping *QOutputMapping::get() +{ + if (!s_outputMapping) + s_outputMapping = new QDefaultOutputMapping; + + return s_outputMapping; +} + +bool QOutputMapping::load() +{ + return false; +} + +QString QOutputMapping::screenNameForDeviceNode(const QString &deviceNode) +{ + Q_UNUSED(deviceNode); + return QString(); +} + +#ifdef Q_OS_WEBOS +QWindow *QOutputMapping::windowForDeviceNode(const QString &deviceNode) +{ + Q_UNUSED(deviceNode); + return nullptr; +} + +void QOutputMapping::set(QOutputMapping *mapping) +{ + if (s_outputMapping) + delete s_outputMapping; + + s_outputMapping = mapping; +} +#endif // Q_OS_WEBOS + +bool QDefaultOutputMapping::load() { static QByteArray configFile = qgetenv("QT_QPA_EGLFS_KMS_CONFIG"); if (configFile.isEmpty()) @@ -75,15 +113,15 @@ bool QTouchOutputMapping::load() qWarning("evdevtouch: Output %d specifies touchDevice but not name, this is wrong", i); continue; } - const QString &deviceNode = output.value(QStringLiteral("touchDevice")).toString(); + QFileInfo deviceNode(output.value(QStringLiteral("touchDevice")).toString()); const QString &screenName = output.value(QStringLiteral("name")).toString(); - m_screenTable.insert(deviceNode, screenName); + m_screenTable.insert(deviceNode.canonicalFilePath(), screenName); } return true; } -QString QTouchOutputMapping::screenNameForDeviceNode(const QString &deviceNode) +QString QDefaultOutputMapping::screenNameForDeviceNode(const QString &deviceNode) { return m_screenTable.value(deviceNode); } diff --git a/src/platformsupport/input/shared/qtouchoutputmapping_p.h b/src/platformsupport/input/shared/qoutputmapping_p.h index 94d4dbc3b1..5376672eff 100644 --- a/src/platformsupport/input/shared/qtouchoutputmapping_p.h +++ b/src/platformsupport/input/shared/qoutputmapping_p.h @@ -37,8 +37,8 @@ ** ****************************************************************************/ -#ifndef QTOUCHOUTPUTMAPPING_P_H -#define QTOUCHOUTPUTMAPPING_P_H +#ifndef QOUTPUTMAPPING_P_H +#define QOUTPUTMAPPING_P_H // // W A R N I N G @@ -56,11 +56,28 @@ QT_BEGIN_NAMESPACE -class QTouchOutputMapping +class QWindow; + +class QOutputMapping +{ +public: + virtual ~QOutputMapping() {} + + static QOutputMapping *get(); + virtual bool load(); + virtual QString screenNameForDeviceNode(const QString &deviceNode); + +#ifdef Q_OS_WEBOS + virtual QWindow *windowForDeviceNode(const QString &deviceNode); + static void set(QOutputMapping *mapping); +#endif +}; + +class QDefaultOutputMapping : public QOutputMapping { public: - bool load(); - QString screenNameForDeviceNode(const QString &deviceNode); + bool load() override; + QString screenNameForDeviceNode(const QString &deviceNode) override; private: QHash<QString, QString> m_screenTable; @@ -68,4 +85,4 @@ private: QT_END_NAMESPACE -#endif // QTOUCHOUTPUTMAPPING_P_H +#endif // QOUTPUTMAPPING_P_H diff --git a/src/platformsupport/input/shared/shared.pri b/src/platformsupport/input/shared/shared.pri index c29d11e7d6..73eb38c9da 100644 --- a/src/platformsupport/input/shared/shared.pri +++ b/src/platformsupport/input/shared/shared.pri @@ -1,8 +1,8 @@ HEADERS += \ $$PWD/devicehandlerlist_p.h \ $$PWD/qevdevutil_p.h \ - $$PWD/qtouchoutputmapping_p.h + $$PWD/qoutputmapping_p.h SOURCES += \ $$PWD/qevdevutil.cpp \ - $$PWD/qtouchoutputmapping.cpp + $$PWD/qoutputmapping.cpp |