Python evdev 库是否有特定于事件的抓取或直通?
Does Python evdev library have an event specific grab or passthrough?
A python evdev 设备有一个 .grab() 函数,可以防止其他进程获取设备上的输入事件。有什么方法可以将此限制为来自设备的特定事件吗?
对于我的示例,如果我 .grab() 一个具有压力感应和倾斜度的笔输入设备,并且侧面有 2 个点击按钮,我如何 'grab' 只有 2 个点击按钮而让其余的输入(笔尖、压力敏感度和倾斜度)是否正常被系统的其余部分捕获?
我的一个笔按钮通常是鼠标右键单击事件。我想让它做些别的事情,但它仍然弹出右键单击菜单,所以我想弄清楚如何停止它。
我尝试在事件发生时进行抓取和取消抓取。喜欢事件 > 抓取 > 做我的事情 > 取消抓取。但这显然为时已晚,OS 仍然弹出菜单。
我试过完全抓取,然后在事件循环中,如果是按下按钮,则执行我的操作,否则通过将事件传回系统来创建 UInput 事件注入。这有点混乱。需要权限。当我终于克服它时,运动被抵消并且 pressure/tilt 不工作......我认为这与 DigiMend 驱动程序有关,它实际上使这些东西工作 and/or xinput 设置我必须通过校准平板电脑。但我对从头开始编写所有 pressure/tilt 功能或类似的东西不感兴趣,所以我需要 DigiMend 东西正常工作。所以我暂时放弃了这个想法。
我唯一的其他想法是弄清楚为什么 OS 默认为它所做的行为,看看我是否可以手动禁用这些操作(即为什么它认为该按钮是鼠标右键单击让它认为那个按钮什么都不是。)
所以我想这是一个 3 级问题。
- 我可以在 select 事件而不是整个设备上实现抓取功能吗?
- 如果 passthrough 的想法更好,有没有一种方法可以实现这一点而无需进行任何权限修改,并且能够传递确切的事件(即没有偏移量,我经历过这样的事情?)
- 如果 evdev 没有这种能力,或者以其他方式更容易做到,比如以某种方式禁用 OS 中笔的默认设置,我愿意接受建议。如果有帮助,我正在使用 Kubuntu 20.04。
如有任何帮助,我们将不胜感激,如果需要更多信息,请告诉我,在此先感谢!
我最终选择了#3 并使用了 xinput。我想我现在会提出这个答案,以防其他人遇到这个问题并想做类似的事情。
解决方法实际上很简单。我只是使用 xinput 来重新映射 2 个按钮。所以evdev根本不用抓取。只需禁用这些按钮,一切都会正常进行,除了那些我用 evdev 收听的按钮。
xinput set-button-map {} 1 0 0 4 5 6 7
我的设备有 7 个按钮,通常映射为 1-7。左键单击、中键单击、右键单击等所有鼠标等效项...
通过使用该字符串并为 {} 传递设备 ID,我只是 运行 首先使用子进程。瞧,不再有右键单击菜单。我可以使用 evdev 将事件映射到我想要的任何内容。
A python evdev 设备有一个 .grab() 函数,可以防止其他进程获取设备上的输入事件。有什么方法可以将此限制为来自设备的特定事件吗?
对于我的示例,如果我 .grab() 一个具有压力感应和倾斜度的笔输入设备,并且侧面有 2 个点击按钮,我如何 'grab' 只有 2 个点击按钮而让其余的输入(笔尖、压力敏感度和倾斜度)是否正常被系统的其余部分捕获?
我的一个笔按钮通常是鼠标右键单击事件。我想让它做些别的事情,但它仍然弹出右键单击菜单,所以我想弄清楚如何停止它。
我尝试在事件发生时进行抓取和取消抓取。喜欢事件 > 抓取 > 做我的事情 > 取消抓取。但这显然为时已晚,OS 仍然弹出菜单。
我试过完全抓取,然后在事件循环中,如果是按下按钮,则执行我的操作,否则通过将事件传回系统来创建 UInput 事件注入。这有点混乱。需要权限。当我终于克服它时,运动被抵消并且 pressure/tilt 不工作......我认为这与 DigiMend 驱动程序有关,它实际上使这些东西工作 and/or xinput 设置我必须通过校准平板电脑。但我对从头开始编写所有 pressure/tilt 功能或类似的东西不感兴趣,所以我需要 DigiMend 东西正常工作。所以我暂时放弃了这个想法。
我唯一的其他想法是弄清楚为什么 OS 默认为它所做的行为,看看我是否可以手动禁用这些操作(即为什么它认为该按钮是鼠标右键单击让它认为那个按钮什么都不是。)
所以我想这是一个 3 级问题。
- 我可以在 select 事件而不是整个设备上实现抓取功能吗?
- 如果 passthrough 的想法更好,有没有一种方法可以实现这一点而无需进行任何权限修改,并且能够传递确切的事件(即没有偏移量,我经历过这样的事情?)
- 如果 evdev 没有这种能力,或者以其他方式更容易做到,比如以某种方式禁用 OS 中笔的默认设置,我愿意接受建议。如果有帮助,我正在使用 Kubuntu 20.04。
如有任何帮助,我们将不胜感激,如果需要更多信息,请告诉我,在此先感谢!
我最终选择了#3 并使用了 xinput。我想我现在会提出这个答案,以防其他人遇到这个问题并想做类似的事情。
解决方法实际上很简单。我只是使用 xinput 来重新映射 2 个按钮。所以evdev根本不用抓取。只需禁用这些按钮,一切都会正常进行,除了那些我用 evdev 收听的按钮。
xinput set-button-map {} 1 0 0 4 5 6 7
我的设备有 7 个按钮,通常映射为 1-7。左键单击、中键单击、右键单击等所有鼠标等效项...
通过使用该字符串并为 {} 传递设备 ID,我只是 运行 首先使用子进程。瞧,不再有右键单击菜单。我可以使用 evdev 将事件映射到我想要的任何内容。