在 Linux 上使用 C 读取游戏手柄输入的现代方式
Modern way to read gamepad input with C on Linux
我对阅读游戏手柄输入很感兴趣,特别是具有有线 xbox 360 控制器布局的游戏手柄,在 linux 机器上带有 C。我知道这可以通过多种方式完成,但是我想知道实现此目的的现代方法是什么。
据我了解,evdev
是 'future' 而操纵杆 API 是遗留的。使用 libudev
我能够找到连接的游戏手柄并检测它们何时连接和断开连接:
// skipping setup code ....
char const* val = udev_device_get_property_value(dev, "ID_INPUT_JOYSTICK");
if (val != NULL && strcmp(val, "1") == 0) {
char const* devfs_path = udev_device_get_devnode(udev_device);
}
// .....
struct udev_device* device = udev_monitor_recieve_device(udev_monitor);
char const* action = udev_device_get_action(device);
if (strcmp(action, "add") == 0) {
// .....
}
if (strcmp(action, "remove") == 0) {
// .....
}
我的问题的症结在于阅读按钮按下和轴移动的最佳方式。
目前,我不确定是使用 struct js_event
还是 struct input_event
。事实上,我希望能够通过 libudev
对连接和移除的游戏手柄进行相同的检查来做到这一点。如果这不可能,哪种方法最具前瞻性?
谢谢。
根据 kernel docs
Newer clients are encouraged to switch to the generic event (evdev) interface.
可在 linux input kernel community docs
中找到所需控制器的特定映射
因此,使用struct input_event
我对阅读游戏手柄输入很感兴趣,特别是具有有线 xbox 360 控制器布局的游戏手柄,在 linux 机器上带有 C。我知道这可以通过多种方式完成,但是我想知道实现此目的的现代方法是什么。
据我了解,evdev
是 'future' 而操纵杆 API 是遗留的。使用 libudev
我能够找到连接的游戏手柄并检测它们何时连接和断开连接:
// skipping setup code ....
char const* val = udev_device_get_property_value(dev, "ID_INPUT_JOYSTICK");
if (val != NULL && strcmp(val, "1") == 0) {
char const* devfs_path = udev_device_get_devnode(udev_device);
}
// .....
struct udev_device* device = udev_monitor_recieve_device(udev_monitor);
char const* action = udev_device_get_action(device);
if (strcmp(action, "add") == 0) {
// .....
}
if (strcmp(action, "remove") == 0) {
// .....
}
我的问题的症结在于阅读按钮按下和轴移动的最佳方式。
目前,我不确定是使用 struct js_event
还是 struct input_event
。事实上,我希望能够通过 libudev
对连接和移除的游戏手柄进行相同的检查来做到这一点。如果这不可能,哪种方法最具前瞻性?
谢谢。
根据 kernel docs
Newer clients are encouraged to switch to the generic event (evdev) interface.
可在 linux input kernel community docs
中找到所需控制器的特定映射因此,使用struct input_event