summaryrefslogtreecommitdiffstats
path: root/src/plugins/generic/evdevmouse/qevdevmousemanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/generic/evdevmouse/qevdevmousemanager.cpp')
-rw-r--r--src/plugins/generic/evdevmouse/qevdevmousemanager.cpp43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/plugins/generic/evdevmouse/qevdevmousemanager.cpp b/src/plugins/generic/evdevmouse/qevdevmousemanager.cpp
index 506a2022d3..07d7d0fe06 100644
--- a/src/plugins/generic/evdevmouse/qevdevmousemanager.cpp
+++ b/src/plugins/generic/evdevmouse/qevdevmousemanager.cpp
@@ -42,9 +42,11 @@
#include "qevdevmousemanager.h"
#include <QStringList>
-#include <QCoreApplication>
+#include <QGuiApplication>
+#include <QScreen>
+#include <QWindowSystemInterface>
-//#define QT_QPA_MOUSEMANAGER_DEBUG
+#define QT_QPA_MOUSEMANAGER_DEBUG
#ifdef QT_QPA_MOUSEMANAGER_DEBUG
#include <QDebug>
@@ -53,6 +55,7 @@
QT_BEGIN_NAMESPACE
QEvdevMouseManager::QEvdevMouseManager(const QString &key, const QString &specification)
+ : m_x(0), m_y(0), m_xoffset(0), m_yoffset(0)
{
Q_UNUSED(key);
@@ -70,6 +73,10 @@ QEvdevMouseManager::QEvdevMouseManager(const QString &key, const QString &specif
devices.append(arg);
args.removeAll(arg);
useUDev = false;
+ } else if (arg.startsWith("xoffset=")) {
+ m_xoffset = arg.mid(8).toInt();
+ } else if (arg.startsWith("yoffset=")) {
+ m_yoffset = arg.mid(8).toInt();
}
}
@@ -109,6 +116,32 @@ QEvdevMouseManager::~QEvdevMouseManager()
m_mice.clear();
}
+void QEvdevMouseManager::handleMouseEvent(int x, int y, Qt::MouseButtons buttons)
+{
+ // update current absolute coordinates
+ m_x += x;
+ m_y += y;
+
+ // clamp to screen geometry
+ QRect g = QGuiApplication::primaryScreen()->virtualGeometry();
+ if (m_x + m_xoffset < g.left())
+ m_x = g.left() - m_xoffset;
+ else if (m_x + m_xoffset > g.right())
+ m_x = g.right() - m_xoffset;
+
+ if (m_y + m_yoffset < g.top())
+ m_y = g.top() - m_yoffset;
+ else if (m_y + m_yoffset > g.bottom())
+ m_y = g.bottom() - m_yoffset;
+
+ QPoint pos(m_x + m_xoffset, m_y + m_yoffset);
+ QWindowSystemInterface::handleMouseEvent(0, pos, pos, buttons);
+
+#ifdef QT_QPA_MOUSEMANAGER_DEBUG
+ qDebug("mouse event %d %d %d", pos.x(), pos.y(), int(buttons));
+#endif
+}
+
void QEvdevMouseManager::addMouse(const QString &deviceNode)
{
#ifdef QT_QPA_MOUSEMANAGER_DEBUG
@@ -124,10 +157,12 @@ void QEvdevMouseManager::addMouse(const QString &deviceNode)
QEvdevMouseHandler *handler;
handler = QEvdevMouseHandler::createLinuxInputMouseHandler("EvdevMouse", specification);
- if (handler)
+ if (handler) {
+ connect(handler, SIGNAL(handleMouseEvent(int, int, Qt::MouseButtons)), this, SLOT(handleMouseEvent(int, int, Qt::MouseButtons)));
m_mice.insert(deviceNode, handler);
- else
+ } else {
qWarning("Failed to open mouse");
+ }
}
void QEvdevMouseManager::removeMouse(const QString &deviceNode)