evdev如何确定是否移动x11光标?

时间:2019-05-04 05:04:58

标签: c linux x11 evdev uinput

我开始研究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的区别。< / p>

在有人说之前,我知道实际上使用libevdev比直接调用uinput更可取,但这只是出于教育目的。甚至在那里,我也有同样的问题。

1 个答案:

答案 0 :(得分: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_X,{{1 }})。这是因为他们是在模拟实际的鼠标而不是触摸板。但这确实给了我一个提示,即x11寻找某些事件类型在设备位中列出,以确定它是哪种设备。

作为对该理论的进一步证实,我在同一文档的游戏手柄设备的检测部分中找到了此注释。 ABS_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.位和BTN_GAMEPAD BTN_LEFT位,那么创建设置REL_X位的游戏手柄设备仍然会像鼠标一样工作,因此看起来就像x11所做的一样,只是在寻找一些要设置的关键位,以将某些事物视为鼠标。

好了,回到触控板/游戏杆的问题,我还没有弄清楚如何模拟触摸板来准确测试x11需要设置哪些位以将设备识别为触摸板,尽管我怀疑REL_Y事件在其中起作用。不管导致x11将设备识别为触摸板并移动指针的事件位的任何组合,都有理由说明通常不会在游戏板上找到该组合,并且这就是向x11表示操纵板无论是否移动光标的原因。它具有BTN_TOUCHABS_X轴,就像触摸板一样。如果有时间,我将尝试找出确切的组合并更新此解决方案。