我在我们的嵌入式 Linux 产品(基于 Ångström)上遇到了这个奇怪的多点触控问题。简而言之,我们的 Qt 应用程序在某些情况下意外多点触摸时无法检测到 TouchEnd 事件,从而“锁定”应用程序。我们不需要多点触控支持,因此我已经尝试通过编辑xorg.conf
和添加来禁用多点触控:
Section "InputClass"
Identifier "NoTouch1"
MatchIsTouchscreen "on"
MatchProduct "scf0700_ts1"
Option "Ignore" "on"
EndSection
Section "InputClass"
Identifier "NoTouch2"
MatchIsTouchscreen "on"
MatchProduct "scf0700_ts2"
Option "Ignore" "on"
EndSection
我可以验证 X(xinput 列表)不再“看到”多个触摸设备:
xinput list
Virtual core pointer id=2 [master pointer (3)]
↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
↳ scf0700_ts0 id=8 [slave pointer (2)]
Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ twl4030_pwrbutton id=6 [slave keyboard (3)]
↳ TWL4030 Keypad id=7 [slave keyboard (3)]
然而,Qt 似乎忽略了这一点(它使用 evdev 代替?)。
因此,对此的丑陋解决方案(在我看来)是简单地阻止/dev/input/event1
和2
被创建并使其/dev/input/event0
成为唯一的输入设备(1 和 2 是另外两个“触摸点”)。
我尝试编辑 udev 规则,但无法阻止创建“不需要的”事件设备。/libs/udev/rules.d/99-xf86-input-tslib.rules编辑前:
SUBSYSTEM=="input", KERNEL=="event[0-9]*", ATTRS{modalias}=="input:*-e0*,3,*a0,1,*18,*", SYMLINK+="input/touchscreen%n", ENV{x11_driver}="tslib"
并在尝试禁用事件设备之一后:
SUBSYSTEM=="input", KERNEL=="event1", ATTRS{name}=="scf0700_ts1", OPTIONS=="ignore_device"
这是正确的方法吗?我可以使用规则做我想做的事情,还是需要使用触摸屏驱动程序做一些事情?
我找到了一个类似的帖子在 SE 上,解决方案是用于EVIOCGRAB
获取设备的独占使用权。也许这是另一种解决方案?抓住设备并丢弃所有传入的事件?
答案1
好的,所以我设法找到了解决这个问题的一个非常简单的方法。理想的解决方案(在我看来)是阻止/dev/input/event1
和2
创建,但我没有让 udev 规则按照我想要的方式工作。
我最终EVIOCGRAB
在我的 Qt 应用程序中使用。我在顶部有一个“全局”事件过滤器,可以检测用户是否触摸了设备,并在几分钟不活动后使显示屏变暗。通过将其添加到构造函数中:
QString dev1 = QLatin1String("/dev/input/event1");
QString dev2 = QLatin1String("/dev/input/event2");
int fd1 = QT_OPEN(dev1.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
if(fd1 >= 0)
{
::ioctl(fd1, EVIOCGRAB, 1);
qDebug() << "Grabbed " << dev1;
}
int fd2 = QT_OPEN(dev2.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
if(fd2 >= 0)
{
::ioctl(fd2, EVIOCGRAB, 1);
qDebug() << "Grabbed " << dev2;
}
没有做任何其他事情,我就得到了我需要的结果。来自event1
和的输入event2
不再显示在我的应用程序中(并且无法通过 访问evtest
),如果我退出应用程序,则事件设备再次变为“活动”。
奇迹般有效!
//安德斯