0

python evdev 设备有一个 .grab() 函数,可以防止其他进程获取设备上的输入事件。有没有办法将其限制为来自设备的特定事件?

对于我的示例,如果我 .grab() 一个具有压力感应和倾斜以及侧面 2 个单击按钮的笔输入设备,我将如何仅“抓取”两个单击按钮,但让其余的输入(提示,压力敏感度和倾斜度)是否被系统的其他部分正常捕获?

我的一个笔按钮通常是右键单击鼠标事件。我想让它做其他事情,但它仍然会弹出右键菜单,所以我试图弄清楚如何阻止它。

当事件发生时,我尝试进行抓取和取消抓取。喜欢事件 > 抢 > 做我的事 > 取消抢。但这显然为时已晚,操作系统仍然会弹出菜单。

我尝试进行完全抓取,然后在事件循环中,如果它是一个按钮按下做我的工作,否则通过将事件传回系统来创建一个 UInput 事件注入。这有点混乱。需要许可。当我终于克服了这个问题时,运动被抵消了,压力/倾斜不起作用......我认为这与实际上使这些东西工作的 DigiMend 驱动程序和/或我必须传递给的 xinput 设置有关校准数位板。但我对从头开始编写所有压力/倾斜功能或类似的东西不感兴趣,所以我需要 DigiMend 的东西才能正常工作。所以我暂时放弃了这个想法。

我唯一的另一个想法是弄清楚为什么操作系统默认为它所做的行为,看看我是否可以手动禁用这些操作(即为什么它认为该按钮是鼠标右键单击并让它认为该按钮什么都不是.)

所以我想这是一个3级的问题。

  1. 我可以在选择事件而不是整个设备上实现抓取功能吗?
  2. 如果直通的想法更好,有没有办法实现这一点而无需进行任何权限修改并能够传递确切的事件(即没有偏移量等我经历过?)
  3. 如果 evdev 没有这种能力,或者以另一种方式更容易做到,比如以某种方式禁用操作系统中笔的默认设置,我愿意接受建议。如果有帮助,我正在使用 Kubuntu 20.04。

任何帮助将不胜感激,如果需要更多信息,请告诉我,在此先感谢!

4

1 回答 1

0

我最终选择了#3 并使用了 xinput。想我会暂时提出这个答案,以防其他人遇到这个并想做类似的事情。

解决方法实际上很简单。我只是使用 xinput 重新映射 2 个按钮。所以evdev根本不用抢。只需禁用这些按钮,一切都会正常进行,除了那些我用 evdev 收听的按钮。

xinput set-button-map {} 1 0 0 4 5 6 7

我的设备有 7 个按钮,通常映射为 1-7。这都是鼠标左键单击,中键单击,右键单击等的等效项...

通过使用该字符串并为 {} 传递设备 ID,我首先使用子进程运行它。瞧,没有更多的右键菜单。我可以使用 evdev 将事件映射到我想要的任何内容。

于 2020-11-30T04:47:00.457 回答