summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMirko Vogt <dev@nanl.de>2011-07-18 10:42:32 (GMT)
committerJørgen Lind <jorgen.lind@nokia.com>2011-07-18 10:42:32 (GMT)
commit947aaa79b05adec527c7500e36766c7ff19f118d (patch)
tree72c3a85f88933be33c43f4bb50d509a635b95104 /src
parent80bc39a4560577f1c9d5e6dc0068a7d241c29aec (diff)
downloadQt-947aaa79b05adec527c7500e36766c7ff19f118d.zip
Qt-947aaa79b05adec527c7500e36766c7ff19f118d.tar.gz
Qt-947aaa79b05adec527c7500e36766c7ff19f118d.tar.bz2
Add support for opening LinuxInput devices exclusively ('grabbing').
The LinuxInput stack exposes the ioctl EVIOCGRAB which allows LinuxInput devices being opened exclusively ('grabbed'). This patch adds support for configuring how Qt should treat LinuxInput devices (via the 'grab'-argument). By default devices are not grabbed, so not opened exclusively (matches prior behaviour). This however means all input (keystrokes, etc.) is passed to other applications (shells/ttys included) accessing respective device(s) as well. Merge-request: 2637 Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/gui/embedded/qkbdlinuxinput_qws.cpp4
-rw-r--r--src/gui/embedded/qmouselinuxinput_qws.cpp13
2 files changed, 15 insertions, 2 deletions
diff --git a/src/gui/embedded/qkbdlinuxinput_qws.cpp b/src/gui/embedded/qkbdlinuxinput_qws.cpp
index 376b0d0..b2e7cb3 100644
--- a/src/gui/embedded/qkbdlinuxinput_qws.cpp
+++ b/src/gui/embedded/qkbdlinuxinput_qws.cpp
@@ -103,6 +103,7 @@ QWSLinuxInputKbPrivate::QWSLinuxInputKbPrivate(QWSLinuxInputKeyboardHandler *h,
QString dev = QLatin1String("/dev/input/event1");
int repeat_delay = -1;
int repeat_rate = -1;
+ int grab = 0;
QStringList args = device.split(QLatin1Char(':'));
foreach (const QString &arg, args) {
@@ -110,12 +111,15 @@ QWSLinuxInputKbPrivate::QWSLinuxInputKbPrivate(QWSLinuxInputKeyboardHandler *h,
repeat_delay = arg.mid(13).toInt();
else if (arg.startsWith(QLatin1String("repeat-rate=")))
repeat_rate = arg.mid(12).toInt();
+ else if (arg.startsWith(QLatin1String("grab=")))
+ grab = arg.mid(5).toInt();
else if (arg.startsWith(QLatin1String("/dev/")))
dev = arg;
}
m_fd = QT_OPEN(dev.toLocal8Bit().constData(), O_RDWR, 0);
if (m_fd >= 0) {
+ ::ioctl(m_fd, EVIOCGRAB, grab);
if (repeat_delay > 0 && repeat_rate > 0) {
int kbdrep[2] = { repeat_delay, repeat_rate };
::ioctl(m_fd, EVIOCSREP, kbdrep);
diff --git a/src/gui/embedded/qmouselinuxinput_qws.cpp b/src/gui/embedded/qmouselinuxinput_qws.cpp
index 19a9a99..5b4f664 100644
--- a/src/gui/embedded/qmouselinuxinput_qws.cpp
+++ b/src/gui/embedded/qmouselinuxinput_qws.cpp
@@ -43,6 +43,7 @@
#include <QScreen>
#include <QSocketNotifier>
+#include <QStringList>
#include <qplatformdefs.h>
#include <private/qcore_unix_p.h> // overrides QT_OPEN
@@ -101,11 +102,19 @@ QWSLinuxInputMousePrivate::QWSLinuxInputMousePrivate(QWSLinuxInputMouseHandler *
setObjectName(QLatin1String("LinuxInputSubsystem Mouse Handler"));
QString dev = QLatin1String("/dev/input/event0");
- if (device.startsWith(QLatin1String("/dev/")))
- dev = device;
+ int grab = 0;
+
+ QStringList args = device.split(QLatin1Char(':'));
+ foreach (const QString &arg, args) {
+ if (arg.startsWith(QLatin1String("grab=")))
+ grab = arg.mid(5).toInt();
+ else if (arg.startsWith(QLatin1String("/dev/")))
+ dev = arg;
+ }
m_fd = QT_OPEN(dev.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
if (m_fd >= 0) {
+ ::ioctl(m_fd, EVIOCGRAB, grab);
m_notify = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
connect(m_notify, SIGNAL(activated(int)), this, SLOT(readMouseData()));
} else {