Enable mouse handling on VxWorks
Provide implementation of QEvdevMouseHandler for VxWorks OS. This is a preparatory change before actually using this handler, as Qt is not supporting evdev on VxWorks yet. Task-number: QTBUG-115777 Change-Id: Ie92418c903a54ea1d6683e08762d4cc88c4956ac Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> (cherry picked from commit 2003532cd84141434f698d723458f0672766fc0c) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
d92264a089
commit
a7fc60015d
@ -33,7 +33,7 @@ qt_internal_extend_target(InputSupportPrivate CONDITION QT_FEATURE_evdev
|
|||||||
evdevkeyboard/qevdevkeyboard_defaultmap_p.h
|
evdevkeyboard/qevdevkeyboard_defaultmap_p.h
|
||||||
evdevkeyboard/qevdevkeyboardhandler.cpp evdevkeyboard/qevdevkeyboardhandler_p.h
|
evdevkeyboard/qevdevkeyboardhandler.cpp evdevkeyboard/qevdevkeyboardhandler_p.h
|
||||||
evdevkeyboard/qevdevkeyboardmanager.cpp evdevkeyboard/qevdevkeyboardmanager_p.h
|
evdevkeyboard/qevdevkeyboardmanager.cpp evdevkeyboard/qevdevkeyboardmanager_p.h
|
||||||
evdevmouse/qevdevmousehandler.cpp evdevmouse/qevdevmousehandler_p.h
|
evdevmouse/qevdevmousehandler_p.h
|
||||||
evdevmouse/qevdevmousemanager.cpp evdevmouse/qevdevmousemanager_p.h
|
evdevmouse/qevdevmousemanager.cpp evdevmouse/qevdevmousemanager_p.h
|
||||||
evdevtouch/qevdevtouchhandler.cpp evdevtouch/qevdevtouchhandler_p.h
|
evdevtouch/qevdevtouchhandler.cpp evdevtouch/qevdevtouchhandler_p.h
|
||||||
evdevtouch/qevdevtouchfilter_p.h
|
evdevtouch/qevdevtouchfilter_p.h
|
||||||
@ -63,6 +63,16 @@ qt_internal_extend_target(InputSupportPrivate CONDITION QT_FEATURE_evdev AND QT_
|
|||||||
PkgConfig::Mtdev
|
PkgConfig::Mtdev
|
||||||
)
|
)
|
||||||
|
|
||||||
|
qt_internal_extend_target(InputSupportPrivate CONDITION QT_FEATURE_evdev AND NOT VXWORKS
|
||||||
|
SOURCES
|
||||||
|
evdevmouse/qevdevmousehandler.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
qt_internal_extend_target(InputSupportPrivate CONDITION QT_FEATURE_evdev AND VXWORKS
|
||||||
|
SOURCES
|
||||||
|
evdevmouse/qevdevmousehandler_vxworks.cpp
|
||||||
|
)
|
||||||
|
|
||||||
qt_internal_extend_target(InputSupportPrivate CONDITION QT_FEATURE_tslib
|
qt_internal_extend_target(InputSupportPrivate CONDITION QT_FEATURE_tslib
|
||||||
SOURCES
|
SOURCES
|
||||||
tslib/qtslib.cpp tslib/qtslib_p.h
|
tslib/qtslib.cpp tslib/qtslib_p.h
|
||||||
|
@ -45,7 +45,9 @@ private:
|
|||||||
QEvdevMouseHandler(const QString &device, int fd, bool abs, bool compression, int jitterLimit);
|
QEvdevMouseHandler(const QString &device, int fd, bool abs, bool compression, int jitterLimit);
|
||||||
|
|
||||||
void sendMouseEvent();
|
void sendMouseEvent();
|
||||||
|
#ifndef Q_OS_VXWORKS
|
||||||
bool getHardwareMaximum();
|
bool getHardwareMaximum();
|
||||||
|
#endif
|
||||||
void detectHiResWheelSupport();
|
void detectHiResWheelSupport();
|
||||||
|
|
||||||
QString m_device;
|
QString m_device;
|
||||||
|
@ -0,0 +1,158 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
|
||||||
|
|
||||||
|
#include "qevdevmousehandler_p.h"
|
||||||
|
|
||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QLoggingCategory>
|
||||||
|
#include <QPoint>
|
||||||
|
#include <QScreen>
|
||||||
|
#include <QSocketNotifier>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <private/qcore_unix_p.h> // overrides QT_OPEN
|
||||||
|
#include <qpa/qwindowsysteminterface.h>
|
||||||
|
#include <qplatformdefs.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <evdevLib.h>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
Q_LOGGING_CATEGORY(qLcEvdevMouse, "qt.qpa.input")
|
||||||
|
|
||||||
|
std::unique_ptr<QEvdevMouseHandler> QEvdevMouseHandler::create(const QString &device, const QString &specification)
|
||||||
|
{
|
||||||
|
qCDebug(qLcEvdevMouse) << "create mouse handler for" << device << specification;
|
||||||
|
|
||||||
|
bool compression = false;
|
||||||
|
int jitterLimit = 0;
|
||||||
|
bool abs = false;
|
||||||
|
|
||||||
|
QStringList args = specification.split(QLatin1Char(':'));
|
||||||
|
for (const auto& arg : args) {
|
||||||
|
if (arg == QLatin1String("abs"))
|
||||||
|
abs = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fd = qt_safe_open(device.toLocal8Bit().constData(), O_RDONLY | O_NONBLOCK, 0);
|
||||||
|
if (fd >= 0) {
|
||||||
|
return std::unique_ptr<QEvdevMouseHandler>(new QEvdevMouseHandler(device, fd, abs, compression, jitterLimit));
|
||||||
|
} else {
|
||||||
|
qCWarning(qLcEvdevMouse) << "Cannot open mouse input device" << qPrintable(device) << ":" << strerror(errno);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QEvdevMouseHandler::QEvdevMouseHandler(const QString &device, int fd, bool abs, bool, int jitterLimit)
|
||||||
|
: m_device(device), m_fd(fd), m_notify(0), m_x(0), m_y(0), m_prevx(0), m_prevy(0),
|
||||||
|
m_abs(abs), m_buttons(0), m_button(Qt::NoButton), m_eventType(QEvent::None), m_prevInvalid(true)
|
||||||
|
{
|
||||||
|
Q_UNUSED(jitterLimit)
|
||||||
|
setObjectName(QLatin1String("Evdev Mouse Handler"));
|
||||||
|
|
||||||
|
QSocketNotifier *notifier;
|
||||||
|
notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
|
||||||
|
connect(notifier, &QSocketNotifier::activated,
|
||||||
|
this, &QEvdevMouseHandler::readMouseData);
|
||||||
|
}
|
||||||
|
|
||||||
|
QEvdevMouseHandler::~QEvdevMouseHandler()
|
||||||
|
{
|
||||||
|
if (m_fd >= 0)
|
||||||
|
qt_safe_close(m_fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QEvdevMouseHandler::sendMouseEvent()
|
||||||
|
{
|
||||||
|
int x = m_x - m_prevx;
|
||||||
|
int y = m_y - m_prevy;
|
||||||
|
|
||||||
|
if (m_prevInvalid) {
|
||||||
|
x = 0;
|
||||||
|
y = 0;
|
||||||
|
m_prevInvalid = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit handleMouseEvent(x, y, m_abs, m_buttons, m_button, m_eventType);
|
||||||
|
|
||||||
|
m_prevx = m_x;
|
||||||
|
m_prevy = m_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QEvdevMouseHandler::readMouseData()
|
||||||
|
{
|
||||||
|
bool posChanged = false;
|
||||||
|
bool btnChanged = false;
|
||||||
|
|
||||||
|
Q_FOREVER {
|
||||||
|
EV_DEV_EVENT ev;
|
||||||
|
size_t n = read(m_fd, (char *)(&ev), sizeof(EV_DEV_EVENT));
|
||||||
|
if (n < sizeof(EV_DEV_EVENT)) {
|
||||||
|
sendMouseEvent();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (ev.type) {
|
||||||
|
case EV_DEV_KEY: {
|
||||||
|
Qt::MouseButton buttons = Qt::NoButton;
|
||||||
|
switch (ev.code) {
|
||||||
|
case EV_DEV_PTR_BTN_LEFT:
|
||||||
|
buttons = Qt::LeftButton;
|
||||||
|
break;
|
||||||
|
case EV_DEV_PTR_BTN_RIGHT:
|
||||||
|
buttons = Qt::RightButton;
|
||||||
|
break;
|
||||||
|
case EV_DEV_PTR_BTN_MIDDLE:
|
||||||
|
buttons = Qt::MiddleButton;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ev.value)
|
||||||
|
m_buttons |= buttons;
|
||||||
|
else
|
||||||
|
m_buttons &= ~buttons;
|
||||||
|
m_button = buttons;
|
||||||
|
m_eventType = ev.value != 0 ? QEvent::MouseButtonPress : QEvent::MouseButtonRelease;
|
||||||
|
btnChanged = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EV_DEV_REL:
|
||||||
|
switch (ev.code) {
|
||||||
|
case EV_DEV_PTR_REL_X:
|
||||||
|
m_x += ev.value;
|
||||||
|
m_eventType = QEvent::MouseMove;
|
||||||
|
posChanged = true;
|
||||||
|
break;
|
||||||
|
case EV_DEV_PTR_REL_Y:
|
||||||
|
m_y += ev.value;
|
||||||
|
m_eventType = QEvent::MouseMove;
|
||||||
|
posChanged = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EV_DEV_ABS:
|
||||||
|
switch (ev.code) {
|
||||||
|
case EV_DEV_PTR_ABS_X:
|
||||||
|
m_x = ev.value;
|
||||||
|
m_eventType = QEvent::MouseMove;
|
||||||
|
posChanged = true;
|
||||||
|
break;
|
||||||
|
case EV_DEV_PTR_ABS_Y:
|
||||||
|
m_y = ev.value;
|
||||||
|
m_eventType = QEvent::MouseMove;
|
||||||
|
posChanged = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (btnChanged) {
|
||||||
|
btnChanged = false;
|
||||||
|
posChanged = false;
|
||||||
|
sendMouseEvent();
|
||||||
|
} else if (posChanged) {
|
||||||
|
posChanged = false;
|
||||||
|
sendMouseEvent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QT_END_NAMESPACE
|
Loading…
x
Reference in New Issue
Block a user