kdrive/linux: Set device name when using the evdev driver

Signed-off-by: stefan11111 <stefan11111@shitposting.expert>
This commit is contained in:
stefan11111 2026-01-12 01:11:39 +02:00 committed by Enrico Weigelt
parent cc152cf964
commit 69da481f66
3 changed files with 48 additions and 10 deletions

View File

@ -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);

View File

@ -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__ */

View File

@ -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);
}