我开始深入研究 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 更可取,但这仅用于教育目的。即使在那里,我也有同样的问题。