我正在使用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和我的脚本都可以读取所有事件?
答案 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中的代码轻松创建内核模块。