From a2c58b99344953a00e260d53330f7aaaefa5b5b5 Mon Sep 17 00:00:00 2001 From: stefan11111 Date: Sun, 11 Jan 2026 17:52:22 +0200 Subject: [PATCH] kdrive/linux: Try all 32 static evdev device nodes Signed-off-by: stefan11111 --- hw/kdrive/linux/evdev.c | 43 ++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/hw/kdrive/linux/evdev.c b/hw/kdrive/linux/evdev.c index eeb46d753..b265367ad 100644 --- a/hw/kdrive/linux/evdev.c +++ b/hw/kdrive/linux/evdev.c @@ -183,40 +183,31 @@ EvdevPtrRead(int evdevPort, void *closure) } } -const char *kdefaultEvdev[] = { - "/dev/input/event0", - "/dev/input/event1", - "/dev/input/event2", - "/dev/input/event3", -}; - -#define NUM_DEFAULT_EVDEV (sizeof (kdefaultEvdev) / sizeof (kdefaultEvdev[0])) +#define NUM_DEFAULT_EVDEV 32 static Status EvdevPtrInit(KdPointerInfo * pi) { - int i; - int fd; - if (!pi->path) { - for (i = 0; i < NUM_DEFAULT_EVDEV; i++) { - fd = open(kdefaultEvdev[i], 2); + char default_device[] = "/dev/input/eventxx"; + for (int i = 0; i < NUM_DEFAULT_EVDEV; i++) { + sprintf(default_device, "/dev/input/event%d", i); + fd = open(default_device, O_RDWR); if (fd >= 0) { - pi->path = strdup(kdefaultEvdev[i]); + pi->path = strdup(default_device); break; } } } else { - fd = open(pi->path, O_RDWR); + int fd = open(pi->path, O_RDWR); if (fd < 0) { ErrorF("Failed to open evdev device %s\n", pi->path); return BadMatch; } + close(fd); } - close(fd); - if (!pi->name) pi->name = strdup("Evdev mouse"); @@ -372,22 +363,26 @@ EvdevKbdRead(int evdevPort, void *closure) static Status EvdevKbdInit(KdKeyboardInfo * ki) { - int fd; - if (!ki->path) { - ErrorF("Couldn't find evdev device path\n"); - return BadValue; + char default_device[] = "/dev/input/eventxx"; + for (int i = 0; i < NUM_DEFAULT_EVDEV; i++) { + sprintf(default_device, "/dev/input/event%d", i); + fd = open(default_device, O_RDWR); + if (fd >= 0) { + ki->path = strdup(default_device); + break; + } + } } else { - fd = open(ki->path, O_RDWR); + int fd = open(ki->path, O_RDWR); if (fd < 0) { ErrorF("Failed to open evdev device %s\n", ki->path); return BadMatch; } + close(fd); } - close(fd); - if (!ki->name) ki->name = strdup("Evdev keyboard");