summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/input
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@digia.com>2014-10-13 13:50:49 +0200
committerLaszlo Agocs <laszlo.agocs@digia.com>2014-10-16 13:08:06 +0200
commitcf046ccec0e9a2f174e6dc47f23cc8c4d5c1a935 (patch)
tree2b463f94769fff21a829e5fc6cf46e0dd1989a1d /src/platformsupport/input
parent5cd6cd198c87bc31cb1189d6c605b4a3bd005257 (diff)
Clean up tslib plugin
The code is now cleaned up, properly divided between platformsupport and the actual plugin (like evdev) and categorized logging is in use. This will allow us to use tslib as a built-in input handler in eglfs in the future. Change-Id: Ic87cdcfe8049bb98530e7f26ffa7a77611a8ede3 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com> Reviewed-by: Andy Nichols <andy.nichols@digia.com>
Diffstat (limited to 'src/platformsupport/input')
-rw-r--r--src/platformsupport/input/input.pri4
-rw-r--r--src/platformsupport/input/tslib/qtslib.cpp132
-rw-r--r--src/platformsupport/input/tslib/qtslib_p.h65
-rw-r--r--src/platformsupport/input/tslib/tslib.pri7
4 files changed, 208 insertions, 0 deletions
diff --git a/src/platformsupport/input/input.pri b/src/platformsupport/input/input.pri
index 1524eb454e..c1fd95703b 100644
--- a/src/platformsupport/input/input.pri
+++ b/src/platformsupport/input/input.pri
@@ -4,3 +4,7 @@ contains(QT_CONFIG, evdev) {
include($$PWD/evdevtouch/evdevtouch.pri)
include($$PWD/evdevtablet/evdevtablet.pri)
}
+
+contains(QT_CONFIG, tslib) {
+ include($$PWD/tslib/tslib.pri)
+}
diff --git a/src/platformsupport/input/tslib/qtslib.cpp b/src/platformsupport/input/tslib/qtslib.cpp
new file mode 100644
index 0000000000..dea2c7cb72
--- /dev/null
+++ b/src/platformsupport/input/tslib/qtslib.cpp
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt 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 Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qtslib_p.h"
+
+#include <QSocketNotifier>
+#include <QStringList>
+#include <QPoint>
+#include <QLoggingCategory>
+
+#include <qpa/qwindowsysteminterface.h>
+
+#include <errno.h>
+#include <tslib.h>
+
+QT_BEGIN_NAMESPACE
+
+Q_LOGGING_CATEGORY(qLcTsLib, "qt.qpa.input")
+
+QTsLibMouseHandler::QTsLibMouseHandler(const QString &key,
+ const QString &specification)
+ : m_notify(0), m_x(0), m_y(0), m_pressed(0), m_rawMode(false)
+{
+ qCDebug(qLcTsLib) << "Initializing tslib plugin" << key << specification;
+ setObjectName(QLatin1String("TSLib Mouse Handler"));
+
+ QByteArray device = qgetenv("TSLIB_TSDEVICE");
+
+ if (specification.startsWith(QStringLiteral("/dev/")))
+ device = specification.toLocal8Bit();
+
+ if (device.isEmpty())
+ device = QByteArrayLiteral("/dev/input/event1");
+
+ m_dev = ts_open(device.constData(), 1);
+ if (!m_dev) {
+ qErrnoWarning(errno, "ts_open() failed");
+ return;
+ }
+
+ if (ts_config(m_dev))
+ qErrnoWarning(errno, "ts_config() failed");
+
+ m_rawMode = !key.compare(QLatin1String("TslibRaw"), Qt::CaseInsensitive);
+
+ int fd = ts_fd(m_dev);
+ if (fd >= 0) {
+ qCDebug(qLcTsLib) << "tslib device is" << device;
+ m_notify = new QSocketNotifier(fd, QSocketNotifier::Read, this);
+ connect(m_notify, SIGNAL(activated(int)), this, SLOT(readMouseData()));
+ } else {
+ qErrnoWarning(errno, "tslib: Cannot open input device %s", device.constData());
+ }
+}
+
+QTsLibMouseHandler::~QTsLibMouseHandler()
+{
+ if (m_dev)
+ ts_close(m_dev);
+}
+
+static bool get_sample(struct tsdev *dev, struct ts_sample *sample, bool rawMode)
+{
+ if (rawMode)
+ return (ts_read_raw(dev, sample, 1) == 1);
+ else
+ return (ts_read(dev, sample, 1) == 1);
+}
+
+void QTsLibMouseHandler::readMouseData()
+{
+ ts_sample sample;
+
+ while (get_sample(m_dev, &sample, m_rawMode)) {
+ bool pressed = sample.pressure;
+ int x = sample.x;
+ int y = sample.y;
+
+ // work around missing coordinates on mouse release
+ if (sample.pressure == 0 && sample.x == 0 && sample.y == 0) {
+ x = m_x;
+ y = m_y;
+ }
+
+ if (!m_rawMode) {
+ //filtering: ignore movements of 2 pixels or less
+ int dx = x - m_x;
+ int dy = y - m_y;
+ if (dx*dx <= 4 && dy*dy <= 4 && pressed == m_pressed)
+ continue;
+ }
+ QPoint pos(x, y);
+
+ QWindowSystemInterface::handleMouseEvent(0, pos, pos, pressed ? Qt::LeftButton : Qt::NoButton);
+
+ m_x = x;
+ m_y = y;
+ m_pressed = pressed;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/platformsupport/input/tslib/qtslib_p.h b/src/platformsupport/input/tslib/qtslib_p.h
new file mode 100644
index 0000000000..da18abea46
--- /dev/null
+++ b/src/platformsupport/input/tslib/qtslib_p.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt 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 Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTSLIB_H
+#define QTSLIB_H
+
+#include <QObject>
+
+struct tsdev;
+
+QT_BEGIN_NAMESPACE
+
+class QSocketNotifier;
+
+class QTsLibMouseHandler : public QObject
+{
+ Q_OBJECT
+public:
+ QTsLibMouseHandler(const QString &key, const QString &specification);
+ ~QTsLibMouseHandler();
+
+private slots:
+ void readMouseData();
+
+private:
+ QSocketNotifier * m_notify;
+ tsdev *m_dev;
+ int m_x, m_y;
+ bool m_pressed;
+ bool m_rawMode;
+};
+
+QT_END_NAMESPACE
+
+#endif // QTSLIB_H
diff --git a/src/platformsupport/input/tslib/tslib.pri b/src/platformsupport/input/tslib/tslib.pri
new file mode 100644
index 0000000000..c9fef1ca8f
--- /dev/null
+++ b/src/platformsupport/input/tslib/tslib.pri
@@ -0,0 +1,7 @@
+HEADERS += \
+ $$PWD/qtslib_p.h
+
+SOURCES += \
+ $$PWD/qtslib.cpp
+
+LIBS += -lts