diff options
author | Robert Griebl <robert.griebl@pelagicore.com> | 2017-11-30 13:48:59 +0100 |
---|---|---|
committer | Robert Griebl <robert.griebl@pelagicore.com> | 2017-11-30 13:39:48 +0000 |
commit | e36344f70e62df8149e073e6273a774fc1936469 (patch) | |
tree | e9e33b07e9d8e48cbf777c80a6c517a8d2dcfa95 | |
parent | c913efa114ac9173f2668cab6800849a5e98e65c (diff) | |
download | neptune-ui-e36344f70e62df8149e073e6273a774fc1936469.tar.gz |
Use the touch emulation functionality in the application-manager
The touch emulation code was moved to the application-manager with
commit 9a67912, so we can remove the code from Neptune now.
Change-Id: Ic2a9692989e2c663c0894b9282a2fe5ff34bcd8c
Reviewed-by: Dominik Holland <dominik.holland@pelagicore.com>
-rw-r--r-- | am-config.yaml | 2 | ||||
-rw-r--r-- | src/MouseTouchAdaptor.cpp | 282 | ||||
-rw-r--r-- | src/MouseTouchAdaptor.h | 73 | ||||
-rw-r--r-- | src/main.cpp | 10 | ||||
-rw-r--r-- | src/src.pro | 8 |
5 files changed, 2 insertions, 373 deletions
diff --git a/am-config.yaml b/am-config.yaml index 01a2edc..dbc08c4 100644 --- a/am-config.yaml +++ b/am-config.yaml @@ -24,6 +24,8 @@ ui: mainQml: "${CONFIG_PWD}/Main.qml" importPaths: [ "${CONFIG_PWD}/imports/shared", "${CONFIG_PWD}/imports/system", "${CONFIG_PWD}/sysui" ] windowIcon: "${CONFIG_PWD}/imports/assets/icons/active/apps@96.png" + # convert mouse events to touch events if possible (currently only supported on X11) + enableTouchEmulation: yes systemProperties: public: diff --git a/src/MouseTouchAdaptor.cpp b/src/MouseTouchAdaptor.cpp deleted file mode 100644 index 6cdb741..0000000 --- a/src/MouseTouchAdaptor.cpp +++ /dev/null @@ -1,282 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 Pelagicore AG -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Neptune IVI UI. -** -** $QT_BEGIN_LICENSE:GPL-QTAS$ -** Commercial License Usage -** Licensees holding valid commercial Qt Automotive Suite licenses may use -** this file in accordance with the commercial license agreement provided -** with the Software or, alternatively, in accordance with the terms -** contained in a written agreement between you and The Qt Company. For -** licensing terms and conditions see https://www.qt.io/terms-conditions. -** For further information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -** SPDX-License-Identifier: GPL-3.0 -** -****************************************************************************/ - -#include "MouseTouchAdaptor.h" - -#include <QGuiApplication> -#include <QMouseEvent> -#include <QTest> - -#include <qpa/qplatformnativeinterface.h> -#include <qpa/qwindowsysteminterface.h> - -#include <X11/extensions/XInput2.h> -#include <X11/extensions/XI2proto.h> - -// this event type was added in libxcb 1.10, -// but we support also older version -#ifndef XCB_GE_GENERIC -#define XCB_GE_GENERIC 35 -#endif - -Q_LOGGING_CATEGORY(mouseTouchAdaptor, "mousetouchadaptor") - -using QTest::QTouchEventSequence; - -namespace { - -Qt::MouseButton xcbButtonToQtMouseButton(xcb_button_t detail) -{ - switch (detail) { - case 1: return Qt::LeftButton; - case 2: return Qt::MidButton; - case 3: return Qt::RightButton; - // don't care about the rest - default: return Qt::NoButton; - } -} - -void xi2PrepareXIGenericDeviceEvent(xcb_ge_event_t *event) -{ - // xcb event structs contain stuff that wasn't on the wire, the full_sequence field - // adds an extra 4 bytes and generic events cookie data is on the wire right after the standard 32 bytes. - // Move this data back to have the same layout in memory as it was on the wire - // and allow casting, overwriting the full_sequence field. - memmove((char*) event + 32, (char*) event + 36, event->length * 4); -} - -qreal fixed1616ToReal(FP1616 val) -{ - return qreal(val) / 0x10000; -} - -} // anonymous namespace - -MouseTouchAdaptor *MouseTouchAdaptor::m_instance = nullptr; - -MouseTouchAdaptor *MouseTouchAdaptor::instance() -{ - if (!m_instance) { - new MouseTouchAdaptor; - } - return m_instance; -} - -MouseTouchAdaptor::MouseTouchAdaptor() -{ - Q_ASSERT(!m_instance); - m_instance = this; - - qGuiApp->installNativeEventFilter(this); - - // Create a fake touch device to deliver our synthesized events - m_touchDevice = new QTouchDevice; - m_touchDevice->setType(QTouchDevice::TouchScreen); - QWindowSystemInterface::registerTouchDevice(m_touchDevice); - - queryForXInput2(); -} - -MouseTouchAdaptor::~MouseTouchAdaptor() -{ - Q_ASSERT(m_instance); - m_instance = nullptr; -} - -void MouseTouchAdaptor::queryForXInput2() -{ - QPlatformNativeInterface *nativeInterface = qGuiApp->platformNativeInterface(); - Display *xDisplay = static_cast<Display*>(nativeInterface->nativeResourceForIntegration("Display")); - - int xiOpCode, xiEventBase, xiErrorBase; - if (xDisplay && XQueryExtension(xDisplay, "XInputExtension", &xiOpCode, &xiEventBase, &xiErrorBase)) { - // 2.0 is enough for our needs - int xiMajor = 2; - int xi2Minor = 0; - m_haveXInput2 = XIQueryVersion(xDisplay, &xiMajor, &xi2Minor) != BadRequest; - } -} - -bool MouseTouchAdaptor::nativeEventFilter(const QByteArray &eventType, void *message, long * /*result*/) -{ - if (eventType != "xcb_generic_event_t") { - qCDebug(mouseTouchAdaptor) << "Non XCB native event received. Ignoring."; - return false; - } - - xcb_generic_event_t *xcbEvent = static_cast<xcb_generic_event_t *>(message); - - switch (xcbEvent->response_type & ~0x80) { - case XCB_BUTTON_PRESS: { - auto xcbPress = reinterpret_cast<xcb_button_press_event_t *>(xcbEvent); - return handleButtonPress(static_cast<WId>(xcbPress->event), xcbPress->detail, 0, - xcbPress->event_x, xcbPress->event_y); - } - case XCB_BUTTON_RELEASE: { - auto xcbRelease = reinterpret_cast<xcb_button_release_event_t *>(xcbEvent); - return handleButtonRelease(static_cast<WId>(xcbRelease->event), xcbRelease->detail, 0, - xcbRelease->event_x, xcbRelease->event_y); - } - case XCB_MOTION_NOTIFY: { - auto xcbMotion = reinterpret_cast<xcb_motion_notify_event_t *>(xcbEvent); - return handleMotionNotify(static_cast<WId>(xcbMotion->event), 0, - xcbMotion->event_x, xcbMotion->event_y); - } - case XCB_GE_GENERIC: - if (m_haveXInput2) { - return handleXI2Event(reinterpret_cast<xcb_ge_event_t *>(xcbEvent)); - } else { - return false; - } - default: - return false; - }; -} - -bool MouseTouchAdaptor::handleButtonPress(WId windowId, uint32_t detail, uint32_t /*modifiers*/, int x, int y) -{ - Qt::MouseButton button = xcbButtonToQtMouseButton(detail); - - // Filter out the other mouse buttons - if (button != Qt::LeftButton) - return true; - - QWindow *targetWindow = findQWindowWithXWindowID(windowId); - - QPoint windowPos(x / targetWindow->devicePixelRatio(), y / targetWindow->devicePixelRatio()); - - QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice, false /* autoCommit */); - touchEvent.press(0 /* touchId */, windowPos); - touchEvent.commit(false /* processEvents */); - - m_leftButtonIsPressed = true; - return true; -} - -bool MouseTouchAdaptor::handleButtonRelease(WId windowId, uint32_t detail, uint32_t, int x, int y) -{ - Qt::MouseButton button = xcbButtonToQtMouseButton(detail); - - // Don't eat the event if it wasn't a left mouse press - if (button != Qt::LeftButton) - return false; - - QWindow *targetWindow = findQWindowWithXWindowID(windowId); - - QPoint windowPos(x / targetWindow->devicePixelRatio(), y / targetWindow->devicePixelRatio()); - - QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice, false /* autoCommit */); - touchEvent.release(0 /* touchId */, windowPos); - touchEvent.commit(false /* processEvents */); - - m_leftButtonIsPressed = false; - return true; -} - -bool MouseTouchAdaptor::handleMotionNotify(WId windowId, uint32_t /*modifiers*/, int x, int y) -{ - if (!m_leftButtonIsPressed) - return true; - - QWindow *targetWindow = findQWindowWithXWindowID(windowId); - - QPoint windowPos(x / targetWindow->devicePixelRatio(), y / targetWindow->devicePixelRatio()); - - QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice, false /* autoCommit */); - touchEvent.move(0 /* touchId */, windowPos); - touchEvent.commit(false /* processEvents */); - - return true; -} - -QWindow *MouseTouchAdaptor::findQWindowWithXWindowID(WId windowId) -{ - QWindowList windowList = QGuiApplication::topLevelWindows(); - QWindow *foundWindow = nullptr; - - int i = 0; - while (!foundWindow && i < windowList.count()) { - QWindow *window = windowList[i]; - if (window->winId() == windowId) - foundWindow = window; - else - ++i; - } - - Q_ASSERT(foundWindow); - return foundWindow; -} - -bool MouseTouchAdaptor::handleXI2Event(xcb_ge_event_t *event) -{ - xi2PrepareXIGenericDeviceEvent(event); - xXIGenericDeviceEvent *xiEvent = reinterpret_cast<xXIGenericDeviceEvent *>(event); - xXIDeviceEvent *xiDeviceEvent = 0; - - switch (xiEvent->evtype) { - case XI_ButtonPress: - case XI_ButtonRelease: - case XI_Motion: - xiDeviceEvent = reinterpret_cast<xXIDeviceEvent *>(event); - break; - default: - break; - } - - if (!xiDeviceEvent) - return false; - - switch (xiDeviceEvent->evtype) { - case XI_ButtonPress: - return handleButtonPress( - static_cast<WId>(xiDeviceEvent->event), - xiDeviceEvent->detail, - xiDeviceEvent->mods.base_mods, - fixed1616ToReal(xiDeviceEvent->event_x), - fixed1616ToReal(xiDeviceEvent->event_y)); - case XI_ButtonRelease: - return handleButtonRelease( - static_cast<WId>(xiDeviceEvent->event), - xiDeviceEvent->detail, - xiDeviceEvent->mods.base_mods, - fixed1616ToReal(xiDeviceEvent->event_x), - fixed1616ToReal(xiDeviceEvent->event_y)); - case XI_Motion: - return handleMotionNotify( - static_cast<WId>(xiDeviceEvent->event), - xiDeviceEvent->mods.base_mods, - fixed1616ToReal(xiDeviceEvent->event_x), - fixed1616ToReal(xiDeviceEvent->event_y)); - return true; - default: - return false; - } -} diff --git a/src/MouseTouchAdaptor.h b/src/MouseTouchAdaptor.h deleted file mode 100644 index aae8a9f..0000000 --- a/src/MouseTouchAdaptor.h +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 Pelagicore AG -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Neptune IVI UI. -** -** $QT_BEGIN_LICENSE:GPL-QTAS$ -** Commercial License Usage -** Licensees holding valid commercial Qt Automotive Suite licenses may use -** this file in accordance with the commercial license agreement provided -** with the Software or, alternatively, in accordance with the terms -** contained in a written agreement between you and The Qt Company. For -** licensing terms and conditions see https://www.qt.io/terms-conditions. -** For further information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -** SPDX-License-Identifier: GPL-3.0 -** -****************************************************************************/ - -#ifndef MOUSETOUCHADAPTOR_H -#define MOUSETOUCHADAPTOR_H - -#include <QAbstractNativeEventFilter> -#include <QLoggingCategory> -#include <QObject> -#include <QTouchDevice> -#include <QWindow> - -#include <xcb/xcb.h> - -Q_DECLARE_LOGGING_CATEGORY(mouseTouchAdaptor) - -/* - Converts native mouse events into touch events - - Useful for emulating touch interaction using a mouse device since touch input - follows a completely different code path from mouse events in Qt. - */ -class MouseTouchAdaptor : public QObject, public QAbstractNativeEventFilter { -public: - static MouseTouchAdaptor *instance(); - virtual ~MouseTouchAdaptor(); - - bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override; -private: - MouseTouchAdaptor(); - void queryForXInput2(); - bool handleButtonPress(WId windowId, uint32_t detail, uint32_t modifiers, int x, int y); - bool handleButtonRelease(WId windowId, uint32_t detail, uint32_t, int x, int y); - bool handleMotionNotify(WId windowId, uint32_t modifiers, int x, int y); - QWindow *findQWindowWithXWindowID(WId windowId); - bool handleXI2Event(xcb_ge_event_t *event); - - static MouseTouchAdaptor *m_instance; - - QTouchDevice *m_touchDevice; - bool m_haveXInput2{false}; - bool m_leftButtonIsPressed{false}; -}; - -#endif // MOUSETOUCHADAPTOR_H diff --git a/src/main.cpp b/src/main.cpp index 1cbafeb..be6f20e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,10 +37,6 @@ #include <QtAppManInstaller/sudo.h> #include <QGuiApplication> -#ifdef NEPTUNE_ENABLE_TOUCH_EMULATION -# include "MouseTouchAdaptor.h" -#endif - QT_USE_NAMESPACE_AM @@ -76,12 +72,6 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) Main a(argc, argv); -#ifdef NEPTUNE_ENABLE_TOUCH_EMULATION - QScopedPointer<MouseTouchAdaptor> mouseTouchAdaptor; - if (QTouchDevice::devices().isEmpty()) - mouseTouchAdaptor.reset(MouseTouchAdaptor::instance()); -#endif - DefaultConfiguration cfg(QStringList(qSL("am-config.yaml")), QString()); cfg.parse(); a.setup(&cfg); diff --git a/src/src.pro b/src/src.pro index 3a3e75a..0918560 100644 --- a/src/src.pro +++ b/src/src.pro @@ -12,14 +12,6 @@ DEFINES *= NEPTUNE_VERSION=\\\"$$VERSION\\\" SOURCES = main.cpp -unix:!macos:system($$pkgConfigExecutable() --libs x11 xi xcb) { - PKGCONFIG *= xcb x11 xi - QT += gui-private - SOURCES += MouseTouchAdaptor.cpp - HEADERS += MouseTouchAdaptor.h - DEFINES += NEPTUNE_ENABLE_TOUCH_EMULATION -} - DESTDIR = $$OUT_PWD/../ win32: wrapper.files = neptune-ui_wrapper.bat |