在Linux上使用C读取游戏手柄输入的现代方法

时间:2019-02-03 23:56:06

标签: c linux gamepad evdev

我对阅读游戏手柄输入感兴趣,特别是在Linux计算机上使用C读取带有有线xbox 360控制器布局的游戏手柄。我知道可以通过多种方式完成此操作,但是我想知道实现此目的的现代方法是什么。 据我了解,evdev是“未来”,而Joystick 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对连接和卸下的游戏手柄进行相同的检查。如果这不可能,那么哪一种是最具前瞻性的方法? 谢谢。

1 个答案:

答案 0 :(得分:0)

根据kernel docs

  

鼓励新客户端切换到通用事件(evdev)接口。

所需的控制器的特定映射可以在linux input kernel community docs

中找到

因此,请使用struct input_event