Stable device identifier for evdev

This commit is contained in:
Gabriel Corona 2015-08-02 01:29:06 +02:00
parent a3eb16c6e1
commit 2722f3f337
1 changed files with 22 additions and 1 deletions

View File

@ -15,8 +15,28 @@ namespace ciface
namespace evdev 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) 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; int num_controllers = 0;
// We use Udev to find any devices. In the future this will allow for hotplugging. // 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. // 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. // 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()) if (input->IsInteresting())
{ {