From 69da481f661c48509d9b6e07f0a11a72af0b0368 Mon Sep 17 00:00:00 2001 From: stefan11111 Date: Mon, 12 Jan 2026 01:11:39 +0200 Subject: [PATCH] kdrive/linux: Set device name when using the evdev driver Signed-off-by: stefan11111 --- hw/kdrive/linux/evdev/evdev.c | 4 +- hw/kdrive/linux/evdev/evdev.h | 4 +- hw/kdrive/linux/evdev/evdev_autodetect.c | 50 +++++++++++++++++++++--- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/hw/kdrive/linux/evdev/evdev.c b/hw/kdrive/linux/evdev/evdev.c index 0d3cbf479..ae1c9640a 100644 --- a/hw/kdrive/linux/evdev/evdev.c +++ b/hw/kdrive/linux/evdev/evdev.c @@ -188,7 +188,7 @@ static Status EvdevPtrInit(KdPointerInfo * pi) { if (!pi->path) { - pi->path = EvdevDefaultPtr(); + pi->path = EvdevDefaultPtr(&pi->name); } else { int fd = open(pi->path, O_RDWR); @@ -355,7 +355,7 @@ static Status EvdevKbdInit(KdKeyboardInfo * ki) { if (!ki->path) { - ki->path = EvdevDefaultKbd(); + ki->path = EvdevDefaultKbd(&ki->name); } else { int fd = open(ki->path, O_RDWR); diff --git a/hw/kdrive/linux/evdev/evdev.h b/hw/kdrive/linux/evdev/evdev.h index bdfbfd364..4745aea40 100644 --- a/hw/kdrive/linux/evdev/evdev.h +++ b/hw/kdrive/linux/evdev/evdev.h @@ -6,7 +6,7 @@ #ifndef __EVDEH_H__ #define __EVDEH_H__ -char* EvdevDefaultPtr(void); -char* EvdevDefaultKbd(void); +char* EvdevDefaultPtr(char **name); +char* EvdevDefaultKbd(char **name); #endif /* __EVDEH_H__ */ diff --git a/hw/kdrive/linux/evdev/evdev_autodetect.c b/hw/kdrive/linux/evdev/evdev_autodetect.c index 42b1ad072..9ac1ca889 100644 --- a/hw/kdrive/linux/evdev/evdev_autodetect.c +++ b/hw/kdrive/linux/evdev/evdev_autodetect.c @@ -20,6 +20,7 @@ #define PROC_DEVICES "/proc/bus/input/devices" #define PHYS_MAX 64 /* Busid + device id */ +#define EVDEV_NAME_MAX 256 #define MOUSE_EV (1 << 2) #define KBD_EV 0x120013 @@ -69,11 +70,12 @@ typedef struct { * but not across logical devices. */ EvdevOptionalInfo info; /* I: */ - /* char *Name; */ /* N: Name = */ char Phys[PHYS_MAX]; /* P: Phys = */ /* char *Sysfs; */ /* S: Sysfs= */ uint64_t Uniq; /* U: Uniq= */ + char Name[EVDEV_NAME_MAX]; /* N: Name = */ + int EventNo; /* H: Handlers=... eventxx ... */ /* If checking for these 2 ever causes problems, remove them */ @@ -117,6 +119,30 @@ ReadOptInfo(EvdevOptionalInfo *dst, const char* data) } } +static inline void +ReadName(char *dst, const char* data) +{ + char *p = dst; + + data = strstr(data, "Name="); + if (!data) { + return; + } + + data = strchr(data, '"'); + if (!data) { + return; + } + data++; + + while (*data && *data != '"' && p - dst < EVDEV_NAME_MAX - 1) { + *p = *data; + p++; + data++; + } + *p = '\0'; +} + static inline void ReadPhys(char *dst, const char* data) { @@ -215,6 +241,9 @@ ReadEvdev(EventDevice *dst, FILE *f) case 'I': /* Optional info I: */ ReadOptInfo(&dst->info, data); break; + case 'N': /* N: Name="..." */ + ReadName(dst->Name, data); + break; case 'P': /* P: Phys= */ ReadPhys(dst->Phys, data); break; @@ -270,7 +299,7 @@ EvdevDifferentDevices(EventDevice *a, EventDevice *b) } static char* -EvdevDefaultDevice(int type) +EvdevDefaultDevice(char **name, int type) { char *ret = NULL; FILE *f = NULL; @@ -333,6 +362,15 @@ EvdevDefaultDevice(int type) if (asprintf(&ret, EVDEV_FMT, desired->EventNo) < 0) { return FallbackEvdevCheck(); } + if (name && read_dev.Name[0] != '\0') { + char *old_name = *name; + *name = strdup(read_dev.Name); + if (*name) { + free(old_name); + } else { + *name = old_name; + } + } return ret; } } @@ -343,13 +381,13 @@ EvdevDefaultDevice(int type) } char* -EvdevDefaultKbd(void) +EvdevDefaultKbd(char **name) { - return EvdevDefaultDevice(EVDEV_KEYBOARD); + return EvdevDefaultDevice(name, EVDEV_KEYBOARD); } char* -EvdevDefaultPtr(void) +EvdevDefaultPtr(char **name) { - return EvdevDefaultDevice(EVDEV_MOUSE); + return EvdevDefaultDevice(name, EVDEV_MOUSE); }