1

我正在使用 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 和我的脚本都可以读取所有事件?

4

3 回答 3

1

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

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

简而言之,您的脚本没有问题,这里的问题是突触驱动程序。您会发现您的脚本可以在其他设备上正常工作(尽管 xorg wacom 驱动程序直到最近才抓取该设备)。

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

于 2014-08-28T00:00:12.107 回答
-1

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

从理论上讲,由于 linux 将所有设备都作为一个文件,因此您正在以只读方式访问文件,而 X 也是以只读方式访问该文件。

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

1、一段python代码,用evdev;

2、shell命令为:sudo cat /dev/input/event0 | 十六进制转储

您可以将第二个视为您的 X。如果您的推理正确,当我从 IR 遥控器发送信号时,它们不应该同时从 IR (event0) 接收数据,对吧?但是,我真的在两个 ssh 控制台上得到了约会(我希望我可以发布图像,但我是新人,声誉太低,不能这样做)。

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

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

于 2013-11-19T17:19:08.390 回答
-1

您可以创建一个基于 evdev 的内核输入处理程序,以便将设备输入分配到正常的 /dev/input/eventN 和 /dev/input/copied_eventN

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

实际上,您可以通过将代码复制粘贴到驱动程序/输入/evdev.c 中来非常轻松地创建内核模块

于 2014-05-30T18:40:10.313 回答