Go through all event devices, not just event[0-32]

There are no guarantees that joypads are in event0-event32
range.  Some devices, such as laptops with detachable keyboards
and wacom can reserve events all the way up to 32.

Some udev rules with e.g. custom controller firmwares may
load the device as /dev/input/eventX, where X is greater than
32.

This patch uses POSIX dirent to enumerate the event devices, so
entries outside 0-32 range are not skipped.

(cherry picked from commit 01c030f9b7)
This commit is contained in:
Jari Ronkainen 2021-01-26 15:06:19 +02:00 committed by Rémi Verschelde
parent c6824ec09d
commit 299769a99a
No known key found for this signature in database
GPG key ID: C3336907360768E1

View file

@ -32,6 +32,7 @@
#include "joypad_linux.h"
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <linux/input.h>
@ -205,13 +206,24 @@ void JoypadLinux::monitor_joypads() {
while (!exit_udev) {
joy_mutex->lock();
for (int i = 0; i < 32; i++) {
DIR *input_directory;
input_directory = opendir("/dev/input");
if (input_directory) {
struct dirent *current;
char fname[64];
sprintf(fname, "/dev/input/event%d", i);
if (attached_devices.find(fname) == -1) {
open_joypad(fname);
while ((current = readdir(input_directory)) != NULL) {
if (strncmp(current->d_name, "event", 5) != 0) {
continue;
}
sprintf(fname, "/dev/input/%.*s", 16, current->d_name);
if (attached_devices.find(fname) == -1) {
open_joypad(fname);
}
}
}
closedir(input_directory);
joy_mutex->unlock();
usleep(1000000); // 1s
}