【问题标题】:How does evdev determine whether or not to move the x11 cursor?evdev 如何判断是否移动 x11 光标?
【发布时间】:2019-09-22 13:53:44
【问题描述】:

我开始深入研究 linux 上的 evdev api,目的是玩弄 uinput 仿真。我注意到在操纵杆和触摸板之间,有不同的按钮/键事件代码来区分操纵杆按钮按下和鼠标单击。但是两个设备都有 ABS_X 和 ABS_Y 轴的事件代码。

joystick dump:
#   Event type 3 (EV_ABS)
#     Event code 0 (ABS_X)
#       Value      128
#       Min          0
#       Max        255
#       Fuzz         0
#       Flat        15
#       Resolution   0
#     Event code 1 (ABS_Y)
#       Value      103
#       Min          0
#       Max        255
#       Fuzz         0
#       Flat        15
#       Resolution   0

touchpad dump:
#   Event type 3 (EV_ABS)
#     Event code 0 (ABS_X)
#       Value     3909
#       Min       1270
#       Max       5670
#       Fuzz         0
#       Flat         0
#       Resolution  44
#     Event code 1 (ABS_Y)
#       Value     3835
#       Min       1240
#       Max       4746
#       Fuzz         0
#       Flat         0
#       Resolution  66

那么 x11 是如何知道将“/dev/input/eventX”节点视为操纵杆还是鼠标来移动屏幕光标的呢?是否有一些 ioctl 可以用来设置设备是否由 x11 加载?驱动程序还需要做些什么来表明这一点?

我查看了一些错误报告,发现在旧版本中存在一些情况,即手柄在连接时确实会移动鼠标,但我找不到任何补丁可以表明它们所做的更改以表明与 x11 的区别。

在有人说之前,我知道在实践中使用 libevdev 比直接调用 uinput 更可取,但这仅用于教育目的。即使在那里,我也有同样的问题。

【问题讨论】:

    标签: c linux x11 evdev uinput


    【解决方案1】:

    所以我浏览了 uinput 模块文档和示例代码。我注意到在他们模拟鼠标的示例代码中,他们通过 ioctl 调用为鼠标左键 (BTN_LEFT) 添加了一个事件

    ioctl(fd, UI_SET_EVBIT, EV_KEY);
    ioctl(fd, UI_SET_KEYBIT, BTN_LEFT);
    

    我发现它们包含此事件类型很奇怪,因为它们只是在示例代码中移动(而不是单击)鼠标,并且确实删除这些 ioctl 会导致轴事件不影响 x11 指针。

    现在在他们的示例代码中,他们使用相对轴事件(REL_XREL_Y)来进行鼠标移动,而不是我所指的绝对事件(ABS_XABS_Y)。这是因为他们模拟的是实际的鼠标而不是触摸板。但这确实给了我一个提示,即 x11 会查找要在设备位中列出的某些事件类型以确定它是哪种设备。

    作为对这一理论的进一步证实,我在同一文档的游戏手柄设备的检测部分找到了此注释。 All gamepads that follow the protocol described here map BTN_GAMEPAD. This is an alias for BTN_SOUTH/BTN_A. It can be used to identify a gamepad as such. 虽然这并没有明确说明鼠标或触摸板,但它确实支持输入设备上设置的某些事件位用于确定 x11 如何处理来自这些设备的输入的想法。我确实发现如果您还设置了BTN_LEFT 位和REL_X REL_Y 位,那么创建一个设置BTN_GAMEPAD 位的游戏手柄设备仍然可以用作鼠标,所以看起来x11 正在做的只是看起来设置几个关键位以将某物视为鼠标。

    好的,回到触摸板/操纵杆问题,我还没有弄清楚如何模拟触摸板来准确测试需要为 x11 设置哪些位才能将设备识别为触摸板,尽管我怀疑BTN_TOUCH 事件在其中发挥作用。无论导致 x11 将设备识别为触摸板并移动指针的事件位组合是什么,有理由认为这种组合通常不会在游戏手柄上找到,这就是向 x11 表明游戏手柄不应移动光标的原因,尽管它有ABS_XABS_Y 轴,就像触摸板一样。如果以后有时间,我会尝试弄清楚组合是什么并更新此解决方案。

    【讨论】:

    • 我正在调查同样的事情。你有没有发现是什么决定了光标是否移动?
    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多