1
/****************************************************************************
3
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4
** Contact: http://www.qt-project.org/legal
6
** This file is part of the QtGui module of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL$
9
** Commercial License Usage
10
** Licensees holding valid commercial Qt licenses may use this file in
11
** accordance with the commercial license agreement provided with the
12
** Software or, alternatively, in accordance with the terms contained in
13
** a written agreement between you and Digia. For licensing terms and
14
** conditions see http://qt.digia.com/licensing. For further information
15
** use the contact form at http://qt.digia.com/contact-us.
17
** GNU Lesser General Public License Usage
18
** Alternatively, this file may be used under the terms of the GNU Lesser
19
** General Public License version 2.1 as published by the Free Software
20
** Foundation and appearing in the file LICENSE.LGPL included in the
21
** packaging of this file. Please review the following information to
22
** ensure the GNU Lesser General Public License version 2.1 requirements
23
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25
** In addition, as a special exception, Digia gives you certain additional
26
** rights. These rights are described in the Digia Qt LGPL Exception
27
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29
** GNU General Public License Usage
30
** Alternatively, this file may be used under the terms of the GNU
31
** General Public License version 3.0 as published by the Free Software
32
** Foundation and appearing in the file LICENSE.GPL included in the
33
** packaging of this file. Please review the following information to
34
** ensure the GNU General Public License version 3.0 requirements will be
35
** met: http://www.gnu.org/copyleft/gpl.html.
40
****************************************************************************/
46
#include <QSocketNotifier>
47
#include <QStringList>
49
#include <qpa/qwindowsysteminterface.h>
60
QTsLibMouseHandler::QTsLibMouseHandler(const QString &key,
61
const QString &specification)
62
: m_notify(0), m_x(0), m_y(0), m_pressed(0), m_rawMode(false)
64
qDebug() << "QTsLibMouseHandler" << key << specification;
65
setObjectName(QLatin1String("TSLib Mouse Handler"));
67
QByteArray device = "/dev/input/event1";
68
if (specification.startsWith("/dev/"))
69
device = specification.toLocal8Bit();
71
m_dev = ts_open(device.constData(), 1);
73
qErrnoWarning(errno, "ts_open() failed");
77
if (ts_config(m_dev)) {
78
perror("Error configuring\n");
81
m_rawMode = !key.compare(QLatin1String("TslibRaw"), Qt::CaseInsensitive);
83
int fd = ts_fd(m_dev);
85
m_notify = new QSocketNotifier(fd, QSocketNotifier::Read, this);
86
connect(m_notify, SIGNAL(activated(int)), this, SLOT(readMouseData()));
88
qWarning("Cannot open mouse input device '%s': %s", device.constData(), strerror(errno));
94
QTsLibMouseHandler::~QTsLibMouseHandler()
101
static bool get_sample(struct tsdev *dev, struct ts_sample *sample, bool rawMode)
104
return (ts_read_raw(dev, sample, 1) == 1);
106
int ret = ts_read(dev, sample, 1);
112
void QTsLibMouseHandler::readMouseData()
115
while (get_sample(m_dev, &sample, m_rawMode)) {
117
bool pressed = sample.pressure;
123
//filtering: ignore movements of 2 pixels or less
126
if (dx*dx <= 4 && dy*dy <= 4 && pressed == m_pressed)
129
// work around missing coordinates on mouse release in raw mode
130
if (sample.pressure == 0 && sample.x == 0 && sample.y == 0) {
137
//printf("handleMouseEvent %d %d %d %ld\n", m_x, m_y, pressed, sample.tv.tv_usec);
139
QWindowSystemInterface::handleMouseEvent(0, pos, pos, pressed ? Qt::LeftButton : Qt::NoButton);