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

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是否加载设备?司机还需要做些什么来表明这一点?
我四处查看了一些bug报告,发现在旧版本中有一些情况下,joypad在连接时确实会移动鼠标,但我找不到任何补丁可以指示它们更改了什么以指示与x11的区别。
在有人说之前,我知道在实践中使用libevdev优先于直接调用uinput,但这只是为了教育目的。即使在那里,我也有同样的问题。

最佳答案

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

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

我发现奇怪的是,它们包含了这个事件类型,因为它们只在示例代码中移动(而不是点击)鼠标,并且确实移除了这些IOCTLS,导致轴事件不影响X11指针。
现在,在他们的示例代码中,它们使用相对轴事件(REL_XREL_Y)用于鼠标移动,而不是我所指的绝对事件(ABS_XABS_Y)。这是因为他们模拟的是一个真正的鼠标,而不是一个触摸板。但这确实给了我一个提示,x11会在设备位中查找要列出的某些事件类型,以确定它是什么类型的设备。
为了进一步证实这一理论,我在同一文档中的gamepad设备检测部分找到了这个注释。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_GAMEPAD位和BTN_LEFTREL_X位,那么创建一个设置REL_Y位的游戏板设备仍然可以像鼠标一样工作,因此看起来x11所做的只是寻找一些设置为将某些内容视为鼠标的关键位。
好的,回到触摸板/操纵杆的问题,我还没有弄清楚如何模拟触摸板来测试X11需要设置哪些位才能将设备识别为触摸板,尽管我怀疑BTN_TOUCH事件在其中起了作用。无论事件位的组合如何导致x11将设备识别为触摸板并移动指针,都有理由认为这种组合通常在游戏板上找不到,这也就是向x11表明,尽管游戏板具有与触摸板一样的ABS_XABS_Y轴,但它不应移动光标的原因。如果我有时间的话,我会试着找出具体的组合是什么,并更新这个解决方案。

关于c - evdev如何确定是否移动x11光标?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55979611/

10-13 07:20