diff options
author | Paul Olav Tvete <paul.tvete@nokia.com> | 2010-10-12 15:43:54 (GMT) |
---|---|---|
committer | Paul Olav Tvete <paul.tvete@nokia.com> | 2010-10-12 15:43:54 (GMT) |
commit | 8b2ec1a88db8b2b932e2218080adf6202fd9f559 (patch) | |
tree | 825fa73f2ef683721ef41d90f77adde2dce8692e /src | |
parent | e2ba67cd1d2887cec84058e260dd0f76cbab8771 (diff) | |
download | Qt-8b2ec1a88db8b2b932e2218080adf6202fd9f559.zip Qt-8b2ec1a88db8b2b932e2218080adf6202fd9f559.tar.gz Qt-8b2ec1a88db8b2b932e2218080adf6202fd9f559.tar.bz2 |
Mouse event compression
Compression turned on by default, can be turned off by adding
"nocompress" to the specification.
Also turn off experimental touch event support by default.
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/generic/linuxinput/qlinuxinput.cpp | 41 | ||||
-rw-r--r-- | src/plugins/generic/linuxinput/qlinuxinput.h | 1 |
2 files changed, 31 insertions, 11 deletions
diff --git a/src/plugins/generic/linuxinput/qlinuxinput.cpp b/src/plugins/generic/linuxinput/qlinuxinput.cpp index 2b01973..782194d 100644 --- a/src/plugins/generic/linuxinput/qlinuxinput.cpp +++ b/src/plugins/generic/linuxinput/qlinuxinput.cpp @@ -65,9 +65,9 @@ QT_BEGIN_NAMESPACE -#define QT_QPA_EXPERIMENTAL_MULTITOUCH +//#define QT_QPA_EXPERIMENTAL_TOUCHEVENT -#ifdef QT_QPA_EXPERIMENTAL_MULTITOUCH +#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT class QLinuxInputMouseHandlerData { public: @@ -139,8 +139,15 @@ QLinuxInputMouseHandler::QLinuxInputMouseHandler(const QString &key, setObjectName(QLatin1String("LinuxInputSubsystem Mouse Handler")); QString dev = QLatin1String("/dev/input/event0"); - if (specification.startsWith(QLatin1String("/dev/"))) - dev = specification; + m_compression = true; + + QStringList args = specification.split(QLatin1Char(':')); + foreach (const QString &arg, args) { + if (arg == "nocompress") + m_compression = false; + else if (arg.startsWith(QLatin1String("/dev/"))) + dev = arg; + } m_fd = QT_OPEN(dev.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0); if (m_fd >= 0) { @@ -150,7 +157,7 @@ QLinuxInputMouseHandler::QLinuxInputMouseHandler(const QString &key, qWarning("Cannot open mouse input device '%s': %s", qPrintable(dev), strerror(errno)); return; } -#ifdef QT_QPA_EXPERIMENTAL_MULTITOUCH +#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT d = new QLinuxInputMouseHandlerData; #endif } @@ -160,7 +167,9 @@ QLinuxInputMouseHandler::~QLinuxInputMouseHandler() { if (m_fd >= 0) QT_CLOSE(m_fd); +#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT delete d; +#endif } void QLinuxInputMouseHandler::readMouseData() @@ -168,7 +177,7 @@ void QLinuxInputMouseHandler::readMouseData() struct ::input_event buffer[32]; int n = 0; bool posChanged = false; - + bool pendingMouseEvent = false; forever { n = QT_READ(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n); @@ -204,7 +213,7 @@ void QLinuxInputMouseHandler::readMouseData() //ignore for now... } else if (data->code == ABS_HAT0Y) { //ignore for now... -#ifdef QT_QPA_EXPERIMENTAL_MULTITOUCH +#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT } else if (data->code == ABS_MT_POSITION_X) { d->currentX = data->value; d->seenMT = true; @@ -248,6 +257,7 @@ void QLinuxInputMouseHandler::readMouseData() QWindowSystemInterface::handleMouseEvent(0, QPoint(m_x, m_y), QPoint(m_x, m_y), m_buttons); + pendingMouseEvent = false; } else if (data->type == EV_KEY && data->code >= BTN_LEFT && data->code <= BTN_MIDDLE) { Qt::MouseButton button = Qt::NoButton; switch (data->code) { @@ -262,16 +272,19 @@ void QLinuxInputMouseHandler::readMouseData() QWindowSystemInterface::handleMouseEvent(0, QPoint(m_x, m_y), QPoint(m_x, m_y), m_buttons); + pendingMouseEvent = false; } else if (data->type == EV_SYN && data->code == SYN_REPORT) { if (posChanged) { posChanged = false; QPoint pos(m_x, m_y); - - QWindowSystemInterface::handleMouseEvent(0, pos, pos, m_buttons); + if (m_compression) + pendingMouseEvent = true; + else + QWindowSystemInterface::handleMouseEvent(0, pos, pos, m_buttons); } -#ifdef QT_QPA_EXPERIMENTAL_MULTITOUCH +#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT if (d->state == QEvent::TouchBegin && !d->seenMT) { - //no multi-touch events to send + //no multipoint-touch events to send } else { if (!d->seenMT) d->state = QEvent::TouchEnd; @@ -316,9 +329,15 @@ void QLinuxInputMouseHandler::readMouseData() } else { unknown = true; } +#ifdef QLINUXINPUT_EXTRA_DEBUG if (unknown) { qWarning("unknown mouse event type=%x, code=%x, value=%x", data->type, data->code, data->value); } +#endif + } + if (m_compression && pendingMouseEvent) { + QPoint pos(m_x, m_y); + QWindowSystemInterface::handleMouseEvent(0, pos, pos, m_buttons); } } diff --git a/src/plugins/generic/linuxinput/qlinuxinput.h b/src/plugins/generic/linuxinput/qlinuxinput.h index 535816d..4b7d7de 100644 --- a/src/plugins/generic/linuxinput/qlinuxinput.h +++ b/src/plugins/generic/linuxinput/qlinuxinput.h @@ -69,6 +69,7 @@ private: int m_fd; int m_x, m_y; Qt::MouseButtons m_buttons; + bool m_compression; QLinuxInputMouseHandlerData *d; }; |