unix上的重复设备输入事件(/ dev / input / event)

时间:2013-10-03 05:54:14

标签: python linux events driver device

我正在使用linux / ubuntu,我想用我的触控板玩一下。我正在尝试使用python-evdev从/ dev / input / events中读取事件,现在只需打印它们:

import evdev
dev = evdev.InputDevice('/dev/input/event6')

import time
while True:
  try:
    for event in dev.read():
      print event
  except:
    print " ~ "
    time.sleep(.5)

如果我在虚拟控制台中使用root权限运行该脚本(在X外部,按ctrl + alt + F1),脚本会在触摸触摸板时打印事件。然而,如果X在屏幕上并且我在gnome-terminal控制台中运行它,则不打印任何内容;我不知怎的猜测这是正常的,输入被X截获。但我仍想得到它们。有没有办法复制来自/ dev / input / event6的内容,以便X和我的脚本都可以读取所有事件?

3 个答案:

答案 0 :(得分:1)

抱歉,这里的答案有点晚了。

直到版本1.8,xorg synaptics驱动程序使用EVIOCGRAB ioctl来阻止将事件传递给其他客户端。现在默认情况下已禁用,您仍然可以使用GrabEventDevice选项在您的计算机上为旧版本禁用它(请参阅man synaptics)。

简而言之,您的脚本没有任何问题,这是问题的突触驱动程序。你会发现你的脚本可以在其他设备上运行得很好(尽管xorg wacom驱动程序直到最近才抓住设备)。

synaptics中的上游提交: http://cgit.freedesktop.org/xorg/driver/xf86-input-synaptics/commit/?id=f1948e08ee9894864254a18098e4f4fceb6e322f

答案 1 :(得分:-1)

所以,你的想法是,X从你的触摸板获取数据,以便你的python代码被阻止接收触摸板信号,对吗?或者,我可以重复你的话:至少对于某些特定类型的设备,当另一个设备从该设备读取时,应用程序无法获取/ dev / input / event *?

理论上,由于linux将所有设备都设为文件,因此您以只读方式访问文件,而X也是只读文件。

我刚做了另一个实验:我的archlinux上有一个红外接收器,我用两个ssh控制台连接到系统。我使用两种方式来访问IR,即两个应用程序来读取/ dev / input / event0的文件(event0是我的拱门上的SF):

1,一段python代码,带有evdev;

2,shell命令为:sudo cat / dev / input / event0 | hexdump都

你可以在第二个看起来像你的X一样工作。如果你正确推理,当我从红外遥控器发送信号时,他们都不应该同时从IR(event0)接收数据,对吧?但是,我确实在两个ssh游戏机上有约会对象(我希望我可以发布图片,但我是新人,声名太低)。

所以,我认为不应该是原因。我想这可能是因为你的触摸板本身。您知道,某些设备只能在单个应用程序上运行。例如,键盘只能输入活动应用程序上的字符,并且某些输入方法只使其自身比其他应用程序更活跃,并在处理后重定向。另外,如果您的系统上运行了VM,并且只使用了一个鼠标,那么如果您在主机桌面上移动指针会发生什么? VM中的指针会移动吗?反之亦然?

所以我需要有关触控板的更多信息。如果您的TP仅适用于单个活动应用程序,我担心您需要像钩子一样在X之前获取触摸板信号,并将其重定向到X和您的python代码,这可能超出了evdev。

答案 2 :(得分:-1)

你可以创建一个基于evdev的内核输入处理程序,这样设备输入就可以分发到普通的/ dev / input / eventN了,比方说,/ dev / input / copied_eventN

X将从/ dev / input / eventN读取,但您仍然可以从/ dev / input / copied_eventN读取

实际上你可以通过copy-pasting drivers / input / evdev.c中的代码轻松创建内核模块。