如何将XInput2设备(例如XIQueryDevice
报告的设备)转换为适当的sysfs
节点?该设备是一个通用的HID设备,由evdev
输入驱动程序处理。
我知道我可以得到设备的name
。我可能可以查看Xorg.0.log
,并尝试找到添加该设备时的适当日志消息,希望它能提到与之相关的/dev/input/event*
设备节点。或者,我可以查看sysfs
中的所有输入事件,查找一个具有该名称的事件,并希望该名称是唯一的,并且与通过XInput报告的名称相同。但我希望有一个比这两种更清洁的解决方案。
您可以使用xinput
命令获取设备Id。由此可以使用xinput list-props <device id>
获取设备节点路径。属性261是设备节点。
一旦有了设备节点,就可以使用udevadm info -p $(udevadm info -q path -n <device node path>)
获取sysfs节点路径。
懒惰的oneliner是
udevadm info -q path -n $(xinput list-props `xinput | grep "search term" | awk -F "id=" '{print $2}' | awk '{print $1}'` | grep "261" | awk -F '"' '{print $2}')
`
要以编程方式执行此操作,您需要使用XIDeviceInfo
(例如XIDeviceInfo->deviceid
)中的设备ID调用XIGetProperty
,示例调用语法如下。
要从设备路径获取sysfs路径,可以使用带有stat的udev_device_new_from_devnum
(如这里所示),从设备路径生成udev_device
,然后使用该udev_device
作为参数调用udev_device_get_syspath
。
输入设备可以具有其他属性;XIListProperties
将列举它们。至少在我的系统中,其中一个属性是"设备节点",它指向设备的/dev/input/eventX
设备。
不过,基本上,XIQueryDevice
查找设备,然后XIGetProperty
查找每个设备上的"设备名称"属性。(你需要一些原子内部的东西。)
xinput
实用程序(此处代码)可以显示以下信息:xinput list-props $devid
,并且应该作为一个完整的操作示例