【问题标题】:Duplicate device input events on unix (/dev/input/event)unix 上的重复设备输入事件 (/dev/input/event)
【发布时间】:2013-10-03 05:54:14
【问题描述】:

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

【问题讨论】:

    标签: python linux events driver device


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      所以,你的想法是,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。

      【讨论】:

        【解决方案3】:

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

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

        实际上你可以很容易地通过将代码复制粘贴到drivers/input/evdev.c中来创建一个内核模块

        【讨论】:

          猜你喜欢
          • 2021-10-13
          • 1970-01-01
          • 1970-01-01
          • 2011-06-30
          • 1970-01-01
          • 2014-09-20
          • 2013-07-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多