diff options
Diffstat (limited to 'src/plugins/generic/evdevmouse')
-rw-r--r-- | src/plugins/generic/evdevmouse/evdevmouse.pro | 6 | ||||
-rw-r--r-- | src/plugins/generic/evdevmouse/main.cpp | 4 | ||||
-rw-r--r-- | src/plugins/generic/evdevmouse/qevdevmousehandler.cpp (renamed from src/plugins/generic/evdevmouse/qevdevmouse.cpp) | 81 | ||||
-rw-r--r-- | src/plugins/generic/evdevmouse/qevdevmousehandler.h (renamed from src/plugins/generic/evdevmouse/qevdevmouse.h) | 19 | ||||
-rw-r--r-- | src/plugins/generic/evdevmouse/qevdevmousemanager.cpp | 138 | ||||
-rw-r--r-- | src/plugins/generic/evdevmouse/qevdevmousemanager.h | 78 |
6 files changed, 283 insertions, 43 deletions
diff --git a/src/plugins/generic/evdevmouse/evdevmouse.pro b/src/plugins/generic/evdevmouse/evdevmouse.pro index 781d901f28..f322a5bd1a 100644 --- a/src/plugins/generic/evdevmouse/evdevmouse.pro +++ b/src/plugins/generic/evdevmouse/evdevmouse.pro @@ -5,12 +5,14 @@ DESTDIR = $$QT.gui.plugins/generic target.path = $$[QT_INSTALL_PLUGINS]/generic INSTALLS += target -HEADERS = qevdevmouse.h +HEADERS = qevdevmousehandler.h \ + qevdevmousemanager.h QT += core-private platformsupport-private SOURCES = main.cpp \ - qevdevmouse.cpp + qevdevmousehandler.cpp \ + qevdevmousemanager.cpp OTHER_FILES += \ evdevmouse.json diff --git a/src/plugins/generic/evdevmouse/main.cpp b/src/plugins/generic/evdevmouse/main.cpp index 47a4ddf56b..b49c183d7b 100644 --- a/src/plugins/generic/evdevmouse/main.cpp +++ b/src/plugins/generic/evdevmouse/main.cpp @@ -40,7 +40,7 @@ ****************************************************************************/ #include <qgenericplugin_qpa.h> -#include "qevdevmouse.h" +#include "qevdevmousemanager.h" QT_BEGIN_NAMESPACE @@ -71,7 +71,7 @@ QObject* QEvdevMousePlugin::create(const QString &key, const QString &specification) { if (!key.compare(QLatin1String("EvdevMouse"), Qt::CaseInsensitive)) - return new QEvdevMouseHandler(key, specification); + return new QEvdevMouseManager(key, specification); return 0; } diff --git a/src/plugins/generic/evdevmouse/qevdevmouse.cpp b/src/plugins/generic/evdevmouse/qevdevmousehandler.cpp index be779c68a5..1821c2b06b 100644 --- a/src/plugins/generic/evdevmouse/qevdevmouse.cpp +++ b/src/plugins/generic/evdevmouse/qevdevmousehandler.cpp @@ -39,7 +39,7 @@ ** ****************************************************************************/ -#include "qevdevmouse.h" +#include "qevdevmousehandler.h" #include <QSocketNotifier> #include <QStringList> @@ -48,7 +48,7 @@ #include <qplatformdefs.h> #include <private/qcore_unix_p.h> // overrides QT_OPEN -#include <QtPlatformSupport/private/qudevhelper_p.h> +#include <QtPlatformSupport/private/qudevicehelper_p.h> #include <errno.h> @@ -57,61 +57,82 @@ #include <qdebug.h> +//#define QT_QPA_MOUSE_HANDLER_DEBUG + QT_BEGIN_NAMESPACE -QEvdevMouseHandler::QEvdevMouseHandler(const QString &key, - const QString &specification) - : m_notify(0), m_x(0), m_y(0), m_prevx(0), m_prevy(0), - m_xoffset(0), m_yoffset(0), m_buttons(0) +QEvdevMouseHandler *QEvdevMouseHandler::createLinuxInputMouseHandler(const QString &key, const QString &specification) { - Q_UNUSED(key); - setObjectName(QLatin1String("Evdev Mouse Handler")); - - QString dev; - q_udev_devicePath(UDev_Mouse | UDev_Touchpad, &dev); - if (dev.isEmpty()) - dev = QLatin1String("/dev/input/event0"); - - m_compression = true; - m_smooth = false; +#ifdef QT_QPA_MOUSE_HANDLER_DEBUG + qWarning() << "Try to create mouse handler with" << key << specification; +#else + Q_UNUSED(key) +#endif + + QString device = "/dev/input/event0"; + bool compression = true; + bool smooth = false; int jitterLimit = 0; + int xoffset = 0; + int yoffset = 0; QStringList args = specification.split(QLatin1Char(':')); foreach (const QString &arg, args) { if (arg == "nocompress") - m_compression = false; + compression = false; else if (arg.startsWith("dejitter=")) jitterLimit = arg.mid(9).toInt(); else if (arg.startsWith("xoffset=")) - m_xoffset = arg.mid(8).toInt(); + xoffset = arg.mid(8).toInt(); else if (arg.startsWith("yoffset=")) - m_yoffset = arg.mid(8).toInt(); + yoffset = arg.mid(8).toInt(); else if (arg.startsWith(QLatin1String("/dev/"))) - dev = arg; + device = arg; } - m_jitterLimitSquared = jitterLimit*jitterLimit; - qDebug("evdevmouse: Using device %s", qPrintable(dev)); - m_fd = QT_OPEN(dev.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0); - if (m_fd >= 0) { - m_notify = new QSocketNotifier(m_fd, QSocketNotifier::Read, this); - connect(m_notify, SIGNAL(activated(int)), this, SLOT(readMouseData())); +#ifdef QT_QPA_MOUSE_HANDLER_DEBUG + qDebug("evdevmouse: Using device %s", qPrintable(device)); +#endif + + int fd; + fd = qt_safe_open(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0); + if (fd >= 0) { + return new QEvdevMouseHandler(fd, compression, smooth, jitterLimit, xoffset, yoffset); } else { - qWarning("Cannot open mouse input device '%s': %s", qPrintable(dev), strerror(errno)); - return; + qWarning("Cannot open mouse input device '%s': %s", qPrintable(device), strerror(errno)); + return 0; } } +QEvdevMouseHandler::QEvdevMouseHandler(int deviceDescriptor, bool compression, bool smooth, int jitterLimit, int xoffset, int yoffset) + : m_notify(0), m_x(0), m_y(0), m_prevx(0), m_prevy(0), + m_fd(deviceDescriptor), m_compression(compression), m_smooth(smooth), + m_xoffset(xoffset), m_yoffset(yoffset), m_buttons(0) +{ + setObjectName(QLatin1String("Evdev Mouse Handler")); + + m_jitterLimitSquared = jitterLimit * jitterLimit; + + // socket notifier for events on the mouse device + QSocketNotifier *notifier; + notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this); + connect(notifier, SIGNAL(activated(int)), this, SLOT(readMouseData())); +} + QEvdevMouseHandler::~QEvdevMouseHandler() { if (m_fd >= 0) - QT_CLOSE(m_fd); + qt_safe_close(m_fd); } void QEvdevMouseHandler::sendMouseEvent() { QPoint pos(m_x + m_xoffset, m_y + m_yoffset); - //qDebug("mouse event %d %d %d", pos.x(), pos.y(), int(m_buttons)); + +#ifdef QT_QPA_MOUSE_HANDLER_DEBUG + qDebug("mouse event %d %d %d", pos.x(), pos.y(), int(m_buttons)); +#endif + QWindowSystemInterface::handleMouseEvent(0, pos, pos, m_buttons); m_prevx = m_x; m_prevy = m_y; diff --git a/src/plugins/generic/evdevmouse/qevdevmouse.h b/src/plugins/generic/evdevmouse/qevdevmousehandler.h index 9542d133f2..7a74eaa701 100644 --- a/src/plugins/generic/evdevmouse/qevdevmouse.h +++ b/src/plugins/generic/evdevmouse/qevdevmousehandler.h @@ -39,8 +39,8 @@ ** ****************************************************************************/ -#ifndef QEVDEVMOUSE_H -#define QEVDEVMOUSE_H +#ifndef QEVDEVMOUSEHANDLER_H +#define QEVDEVMOUSEHANDLER_H #include <QObject> #include <QString> @@ -55,25 +55,26 @@ class QEvdevMouseHandler : public QObject { Q_OBJECT public: - QEvdevMouseHandler(const QString &key, const QString &specification); + static QEvdevMouseHandler *createLinuxInputMouseHandler(const QString &key, const QString &specification); ~QEvdevMouseHandler(); private slots: void readMouseData(); private: + QEvdevMouseHandler(int deviceDescriptor, bool compression, bool smooth, int jitterLimit, int xoffset, int yoffset); + void sendMouseEvent(); - void pathFromUdev(QString *path); QSocketNotifier *m_notify; - int m_fd; int m_x, m_y; int m_prevx, m_prevy; - int m_xoffset, m_yoffset; - int m_smoothx, m_smoothy; - Qt::MouseButtons m_buttons; + int m_fd; bool m_compression; bool m_smooth; + int m_xoffset, m_yoffset; + Qt::MouseButtons m_buttons; + int m_smoothx, m_smoothy; int m_jitterLimitSquared; }; @@ -81,4 +82,4 @@ QT_END_NAMESPACE QT_END_HEADER -#endif // QEVDEVMOUSE_H +#endif // QEVDEVMOUSEHANDLER_H diff --git a/src/plugins/generic/evdevmouse/qevdevmousemanager.cpp b/src/plugins/generic/evdevmouse/qevdevmousemanager.cpp new file mode 100644 index 0000000000..f8e77abe55 --- /dev/null +++ b/src/plugins/generic/evdevmouse/qevdevmousemanager.cpp @@ -0,0 +1,138 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qevdevmousemanager.h" + +#include <QStringList> +#include <QCoreApplication> + +//#define QT_QPA_MOUSEMANAGER_DEBUG + +#ifdef QT_QPA_MOUSEMANAGER_DEBUG +#include <QDebug> +#endif + +QT_BEGIN_NAMESPACE + +QEvdevMouseManager::QEvdevMouseManager(const QString &key, const QString &specification) +{ + Q_UNUSED(key); + + bool useUDev = true; + QStringList args = specification.split(QLatin1Char(':')); + QStringList devices; + + foreach (const QString &arg, args) { + if (arg.startsWith("udev") && arg.contains("no")) { + useUDev = false; + } else if (arg.startsWith("/dev/")) { + // if device is specified try to use it + devices.append(arg); + args.removeAll(arg); + } + } + + // build new specification without /dev/ elements + m_spec = args.join(":"); + + // add all mice for devices specified in the argument list + foreach (const QString &device, devices) + addMouse(device); + + if (useUDev) { +#ifdef QT_QPA_MOUSEMANAGER_DEBUG + qWarning() << "Use UDev for device discovery"; +#endif + + m_udeviceHelper = QUDeviceHelper::createUDeviceHelper(QUDeviceHelper::UDev_Mouse | QUDeviceHelper::UDev_Touchpad, this); + if (m_udeviceHelper) { + // scan and add already connected keyboards + QStringList devices = m_udeviceHelper->scanConnectedDevices(); + foreach (QString device, devices) { + addMouse(device); + } + + connect(m_udeviceHelper, SIGNAL(deviceDetected(QString,QUDeviceTypes)), this, SLOT(addMouse(QString))); + connect(m_udeviceHelper, SIGNAL(deviceRemoved(QString,QUDeviceTypes)), this, SLOT(removeMouse(QString))); + } + } +} + +QEvdevMouseManager::~QEvdevMouseManager() +{ + qDeleteAll(m_mice); + m_mice.clear(); +} + +void QEvdevMouseManager::addMouse(const QString &deviceNode) +{ +#ifdef QT_QPA_MOUSEMANAGER_DEBUG + qWarning() << "Adding mouse at" << deviceNode; +#endif + + QString specification = m_spec; + + if (!deviceNode.isEmpty()) { + specification.append(":"); + specification.append(deviceNode); + } + + QEvdevMouseHandler *handler; + handler = QEvdevMouseHandler::createLinuxInputMouseHandler("EvdevMouse", specification); + if (handler) + m_mice.insert(deviceNode, handler); + else + qWarning("Failed to open mouse"); +} + +void QEvdevMouseManager::removeMouse(const QString &deviceNode) +{ + if (m_mice.contains(deviceNode)) { +#ifdef QT_QPA_MOUSEMANAGER_DEBUG + qWarning() << "Removing mouse at" << deviceNode; +#endif + QEvdevMouseHandler *handler = m_mice.value(deviceNode); + m_mice.remove(deviceNode); + delete handler; + } +} + +QT_END_NAMESPACE diff --git a/src/plugins/generic/evdevmouse/qevdevmousemanager.h b/src/plugins/generic/evdevmouse/qevdevmousemanager.h new file mode 100644 index 0000000000..a42257b6a2 --- /dev/null +++ b/src/plugins/generic/evdevmouse/qevdevmousemanager.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QEVDEVMOUSEMANAGER_H +#define QEVDEVMOUSEMANAGER_H + +#include "qevdevmousehandler.h" + +#include <QtPlatformSupport/private/qudevicehelper_p.h> + +#include <QObject> +#include <QHash> +#include <QSocketNotifier> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class QEvdevMouseManager : public QObject +{ + Q_OBJECT +public: + explicit QEvdevMouseManager(const QString &key, const QString &specification); + ~QEvdevMouseManager(); + +private slots: + void addMouse(const QString &deviceNode = QString()); + void removeMouse(const QString &deviceNode); + +private: + QString m_spec; + QHash<QString,QEvdevMouseHandler*> m_mice; + QUDeviceHelper *m_udeviceHelper; +}; + +QT_END_HEADER + +QT_END_NAMESPACE + +#endif // QEVDEVMOUSEMANAGER_H |