diff options
author | Paul Olav Tvete <paul.tvete@nokia.com> | 2010-10-13 09:09:58 (GMT) |
---|---|---|
committer | Paul Olav Tvete <paul.tvete@nokia.com> | 2010-10-13 09:09:58 (GMT) |
commit | 0cb3705195b54f199280ab0b8554c793f67425e2 (patch) | |
tree | 034ce6492a056982f87d299c6fca2a123cfd2f8f | |
parent | 8b2ec1a88db8b2b932e2218080adf6202fd9f559 (diff) | |
download | Qt-0cb3705195b54f199280ab0b8554c793f67425e2.zip Qt-0cb3705195b54f199280ab0b8554c793f67425e2.tar.gz Qt-0cb3705195b54f199280ab0b8554c793f67425e2.tar.bz2 |
Jitter removal
-rw-r--r-- | src/plugins/generic/linuxinput/qlinuxinput.cpp | 40 | ||||
-rw-r--r-- | src/plugins/generic/linuxinput/qlinuxinput.h | 5 |
2 files changed, 32 insertions, 13 deletions
diff --git a/src/plugins/generic/linuxinput/qlinuxinput.cpp b/src/plugins/generic/linuxinput/qlinuxinput.cpp index 782194d..07f7a43 100644 --- a/src/plugins/generic/linuxinput/qlinuxinput.cpp +++ b/src/plugins/generic/linuxinput/qlinuxinput.cpp @@ -131,7 +131,7 @@ private: QLinuxInputMouseHandler::QLinuxInputMouseHandler(const QString &key, const QString &specification) - : m_notify(0), m_x(0), m_y(0), m_buttons(0), d(0) + : m_notify(0), m_x(0), m_y(0), m_prevx(0), m_prevy(0), m_buttons(0), d(0) { qDebug() << "QLinuxInputMouseHandler" << key << specification; @@ -140,15 +140,20 @@ QLinuxInputMouseHandler::QLinuxInputMouseHandler(const QString &key, QString dev = QLatin1String("/dev/input/event0"); m_compression = true; + m_smooth = false; + int jitterLimit = 0; QStringList args = specification.split(QLatin1Char(':')); foreach (const QString &arg, args) { if (arg == "nocompress") m_compression = false; + else if (arg.startsWith("dejitter=")) + jitterLimit = arg.mid(9).toInt(); else if (arg.startsWith(QLatin1String("/dev/"))) dev = arg; } - + m_jitterLimitSquared = jitterLimit*jitterLimit; + 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); @@ -172,12 +177,21 @@ QLinuxInputMouseHandler::~QLinuxInputMouseHandler() #endif } +void QLinuxInputMouseHandler::sendMouseEvent(int x, int y, Qt::MouseButtons buttons) +{ + QPoint pos(x, y); + QWindowSystemInterface::handleMouseEvent(0, pos, pos, m_buttons); + m_prevx = x; + m_prevy = y; +} + void QLinuxInputMouseHandler::readMouseData() { struct ::input_event buffer[32]; int n = 0; bool posChanged = false; bool pendingMouseEvent = false; + int eventCompressCount = 0; forever { n = QT_READ(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n); @@ -255,8 +269,7 @@ void QLinuxInputMouseHandler::readMouseData() } else if (data->type == EV_KEY && data->code == BTN_TOUCH) { m_buttons = data->value ? Qt::LeftButton : Qt::NoButton; - QWindowSystemInterface::handleMouseEvent(0, QPoint(m_x, m_y), - QPoint(m_x, m_y), m_buttons); + sendMouseEvent(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; @@ -269,18 +282,17 @@ void QLinuxInputMouseHandler::readMouseData() m_buttons |= button; else m_buttons &= ~button; - - QWindowSystemInterface::handleMouseEvent(0, QPoint(m_x, m_y), - QPoint(m_x, m_y), m_buttons); + sendMouseEvent(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); - if (m_compression) + if (m_compression) { pendingMouseEvent = true; - else - QWindowSystemInterface::handleMouseEvent(0, pos, pos, m_buttons); + eventCompressCount++; + } else { + sendMouseEvent(m_x, m_y, m_buttons); + } } #ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT if (d->state == QEvent::TouchBegin && !d->seenMT) { @@ -336,8 +348,9 @@ void QLinuxInputMouseHandler::readMouseData() #endif } if (m_compression && pendingMouseEvent) { - QPoint pos(m_x, m_y); - QWindowSystemInterface::handleMouseEvent(0, pos, pos, m_buttons); + int distanceSquared = (m_x - m_prevx)*(m_x - m_prevx) + (m_y - m_prevy)*(m_y - m_prevy); + if (distanceSquared > m_jitterLimitSquared) + sendMouseEvent(m_x, m_y, m_buttons); } } @@ -531,3 +544,4 @@ void QLinuxInputKeyboardHandler::readKeycode() QT_END_NAMESPACE + diff --git a/src/plugins/generic/linuxinput/qlinuxinput.h b/src/plugins/generic/linuxinput/qlinuxinput.h index 4b7d7de..37123f1 100644 --- a/src/plugins/generic/linuxinput/qlinuxinput.h +++ b/src/plugins/generic/linuxinput/qlinuxinput.h @@ -65,11 +65,16 @@ private slots: void readMouseData(); private: + void sendMouseEvent(int x, int y, Qt::MouseButtons buttons); QSocketNotifier * m_notify; int m_fd; int m_x, m_y; + int m_prevx, m_prevy; + int m_smoothx, m_smoothy; Qt::MouseButtons m_buttons; bool m_compression; + bool m_smooth; + int m_jitterLimitSquared; QLinuxInputMouseHandlerData *d; }; |