From fed5c2ab2831ce6f8215f16830b228c0a9e23d7c Mon Sep 17 00:00:00 2001 From: Nicolas Adenis-Lamarre Date: Sat, 25 May 2024 23:21:12 +0200 Subject: [PATCH] udev mouse detection based on linux flags (ID_INPUT_MOUSE/ID_INPUT_TOUCHPAD) Signed-off-by: Nicolas Adenis-Lamarre --- Makefile | 10 ++++----- linux_evdev.c | 62 +++++++++++++++++++++++++-------------------------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index 0e8ca27..02ba0f0 100644 --- a/Makefile +++ b/Makefile @@ -78,19 +78,19 @@ example/manymousepong.o : example/manymousepong.c $(CC) $(CFLAGS) -o $@ $< `sdl-config --cflags` detect_mice: $(BASEOBJS) example/detect_mice.o - $(LD) -o $@ $+ $(LDFLAGS) + $(LD) -o $@ $+ $(LDFLAGS) -ludev test_manymouse_stdio: $(BASEOBJS) example/test_manymouse_stdio.o - $(LD) -o $@ $+ $(LDFLAGS) + $(LD) -o $@ $+ $(LDFLAGS) -ludev test_manymouse_sdl: $(BASEOBJS) example/test_manymouse_sdl.o - $(LD) -o $@ $+ `sdl-config --libs` $(LDFLAGS) + $(LD) -o $@ $+ `sdl-config --libs` $(LDFLAGS) -ludev mmpong: $(BASEOBJS) example/mmpong.o - $(LD) -o $@ $+ `sdl-config --libs` $(LDFLAGS) + $(LD) -o $@ $+ `sdl-config --libs` $(LDFLAGS) -ludev manymousepong: $(BASEOBJS) example/manymousepong.o - $(LD) -o $@ $+ `sdl-config --libs` $(LDFLAGS) + $(LD) -o $@ $+ `sdl-config --libs` $(LDFLAGS) -ludev # Java support ... diff --git a/linux_evdev.c b/linux_evdev.c index 0db138c..79d6f64 100644 --- a/linux_evdev.c +++ b/linux_evdev.c @@ -22,6 +22,7 @@ #include #include /* evdev interface... */ +#include #define test_bit(array, bit) (array[bit/8] & (1<<(bit%8))) @@ -216,23 +217,9 @@ static int init_mouse(const char *fname, int fd) /* Return a file descriptor if this is really a mouse, -1 otherwise. */ -static int open_if_mouse(const char *fname) +static int open_mouse(const char *fname) { - struct stat statbuf; int fd; - int devmajor, devminor; - - if (stat(fname, &statbuf) == -1) - return 0; - - if (S_ISCHR(statbuf.st_mode) == 0) - return 0; /* not a character device... */ - - /* evdev node ids are major 13, minor 64-96. Is this safe to check? */ - devmajor = (statbuf.st_rdev & 0xFF00) >> 8; - devminor = (statbuf.st_rdev & 0x00FF); - if ( (devmajor != 13) || (devminor < 64) || (devminor > 96) ) - return 0; /* not an evdev. */ if ((fd = open(fname, O_RDONLY | O_NONBLOCK)) == -1) return 0; @@ -242,31 +229,44 @@ static int open_if_mouse(const char *fname) close(fd); return 0; -} /* open_if_mouse */ +} /* open_mouse */ static int linux_evdev_init(void) { - DIR *dirp; - struct dirent *dent; int i; + struct udev *udev; + struct udev_enumerate *enumerate; + struct udev_list_entry *devs = NULL; + struct udev_list_entry *item = NULL; for (i = 0; i < MAX_MICE; i++) mice[i].fd = -1; - dirp = opendir("/dev/input"); - if (!dirp) - return -1; - - while ((dent = readdir(dirp)) != NULL) - { - char fname[128]; - snprintf(fname, sizeof (fname), "/dev/input/%s", dent->d_name); - if (open_if_mouse(fname)) - available_mice++; - } /* while */ - - closedir(dirp); + udev = udev_new(); + enumerate = udev_enumerate_new(udev); + + if (enumerate != NULL) { + udev_enumerate_add_match_property(enumerate, "ID_INPUT_MOUSE", "1"); + udev_enumerate_add_match_property(enumerate, "ID_INPUT_TOUCHPAD", "1"); + udev_enumerate_add_match_subsystem(enumerate, "input"); + udev_enumerate_scan_devices(enumerate); + devs = udev_enumerate_get_list_entry(enumerate); + + for (item = devs; item; item = udev_list_entry_get_next(item)) { + const char *name = udev_list_entry_get_name(item); + struct udev_device *dev = udev_device_new_from_syspath(udev, name); + const char *devnode = udev_device_get_devnode(dev); + + if (devnode) { + if (open_mouse(devnode)) + available_mice++; + } + udev_device_unref(dev); + } + udev_enumerate_unref(enumerate); + } + udev_unref(udev); return available_mice; } /* linux_evdev_init */