summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Olav Tvete <paul.tvete@nokia.com>2010-10-12 15:43:54 (GMT)
committerPaul Olav Tvete <paul.tvete@nokia.com>2010-10-12 15:43:54 (GMT)
commit8b2ec1a88db8b2b932e2218080adf6202fd9f559 (patch)
tree825fa73f2ef683721ef41d90f77adde2dce8692e
parente2ba67cd1d2887cec84058e260dd0f76cbab8771 (diff)
downloadQt-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.
-rw-r--r--src/plugins/generic/linuxinput/qlinuxinput.cpp41
-rw-r--r--src/plugins/generic/linuxinput/qlinuxinput.h1
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;
};