diff options
| author | Gabriel Corona <gabriel.corona@enst-bretagne.fr> | 2015-08-02 01:29:06 +0200 |
|---|---|---|
| committer | Gabriel Corona <gabriel.corona@enst-bretagne.fr> | 2015-08-02 01:51:06 +0200 |
| commit | 2722f3f337f2a0b6b7d01f4c45a362d75f779664 (patch) | |
| tree | 14198ce57cb8996bca180c5a69a0276af7feb991 /Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp | |
| parent | a3eb16c6e1e3926683e0e9746dae05ade92d9122 (diff) | |
Stable device identifier for evdev
Diffstat (limited to 'Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp')
| -rw-r--r-- | Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp b/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp index 25fa21a74b..e7a0ae2525 100644 --- a/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp +++ b/Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp @@ -15,8 +15,28 @@ namespace ciface namespace evdev { +static std::string GetName(const std::string& devnode) +{ + int fd = open(devnode.c_str(), O_RDWR|O_NONBLOCK); + libevdev* dev = nullptr; + int ret = libevdev_new_from_fd(fd, &dev); + if (ret != 0) + { + close(fd); + return std::string(); + } + std::string res = libevdev_get_name(dev); + libevdev_free(dev); + close(fd); + return std::move(res); +} + void Init(std::vector<Core::Device*> &controllerDevices) { + // this is used to number the joysticks + // multiple joysticks with the same name shall get unique ids starting at 0 + std::map<std::string, int> name_counts; + int num_controllers = 0; // We use Udev to find any devices. In the future this will allow for hotplugging. @@ -46,7 +66,8 @@ void Init(std::vector<Core::Device*> &controllerDevices) { // Unfortunately udev gives us no way to filter out the non event device interfaces. // So we open it and see if it works with evdev ioctls or not. - evdevDevice* input = new evdevDevice(devnode, num_controllers); + std::string name = GetName(devnode); + evdevDevice* input = new evdevDevice(devnode, name_counts[name]++); if (input->IsInteresting()) { |
