我开始研究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更可取,但这只是出于教育目的。甚至在那里,我也有同样的问题。
答案 0 :(得分:1)
因此,我仔细阅读了uinput模块的文档和示例代码。我注意到在他们的模拟鼠标的示例代码中,他们通过ioctl调用为鼠标左键(BTN_LEFT
)添加了一个事件
ioctl(fd, UI_SET_EVBIT, EV_KEY);
ioctl(fd, UI_SET_KEYBIT, BTN_LEFT);
我发现它们包含此事件类型是很奇怪的,因为它们只是在示例代码中移动(而不是单击)鼠标,并且确保足够移除这些ioctl会导致轴事件不影响x11指针。
现在,在示例代码中,他们将相对轴事件(REL_X
,REL_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_TOUCH
和ABS_X
轴,就像触摸板一样。如果有时间,我将尝试找出确切的组合并更新此解决方案。