diff options
author | Johannes Zellner <johannes.zellner@nokia.com> | 2012-05-17 15:16:55 -0700 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-21 16:02:06 +0200 |
commit | 39c5bad574ab9db7f4127d433d54dcc33f57465b (patch) | |
tree | f6cdb4b5e277ffeda260ab2f593bcacb23c41479 /src/plugins/generic/evdevmouse/qevdevmousemanager.cpp | |
parent | 33fb856a6da3a1897cc7ac6ea8e482006b7196b1 (diff) |
input: Synchronize multiple mice handled through evdevmouse plugin
EvdevMouseManager now receives relative pointer coordinates from each
connected mouse and is then responsible for clamping and forwarding them
to the QWindowSystemInterface. This avoids jumping cursors when multiple
pointer devices are connected. This does not change behavior together
with devices handled through the evdevtouch plugin.
Change-Id: I7feb358f68c3b3ebd138116224b4747c88c6761f
Reviewed-by: Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com>
Diffstat (limited to 'src/plugins/generic/evdevmouse/qevdevmousemanager.cpp')
-rw-r--r-- | src/plugins/generic/evdevmouse/qevdevmousemanager.cpp | 43 |
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) |