防止创建某些 /dev/input/event 节点

防止创建某些 /dev/input/event 节点

我在我们的嵌入式 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/event12被创建并使其/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/event12创建,但我没有让 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),如果我退出应用程序,则事件设备再次变为“活动”。

奇迹般有效!

//安德斯

相关内容