evdev: correctly handle composite devices

These can be both mouse and keyboard and should be initialized and exposed to the application as both.
This commit is contained in:
Sam Lantinga 2024-10-23 10:52:50 -07:00
parent ba1412cb9f
commit 6eca02a0e7

View file

@ -933,14 +933,18 @@ static bool SDL_EVDEV_device_added(const char *dev_path, int udev_class)
SDL_free(item); SDL_free(item);
return false; return false;
} }
} else if (udev_class & SDL_UDEV_DEVICE_MOUSE) { }
if (udev_class & SDL_UDEV_DEVICE_MOUSE) {
if (!SDL_EVDEV_init_mouse(item, udev_class)) { if (!SDL_EVDEV_init_mouse(item, udev_class)) {
close(item->fd); close(item->fd);
SDL_free(item->path); SDL_free(item->path);
SDL_free(item); SDL_free(item);
return false; return false;
} }
} else if (udev_class & SDL_UDEV_DEVICE_KEYBOARD) { }
if (udev_class & SDL_UDEV_DEVICE_KEYBOARD) {
if (!SDL_EVDEV_init_keyboard(item, udev_class)) { if (!SDL_EVDEV_init_keyboard(item, udev_class)) {
close(item->fd); close(item->fd);
SDL_free(item->path); SDL_free(item->path);
@ -981,11 +985,14 @@ static bool SDL_EVDEV_device_removed(const char *dev_path)
if (item == _this->last) { if (item == _this->last) {
_this->last = prev; _this->last = prev;
} }
if (item->is_touchscreen) { if (item->is_touchscreen) {
SDL_EVDEV_destroy_touchscreen(item); SDL_EVDEV_destroy_touchscreen(item);
} else if (item->udev_class & SDL_UDEV_DEVICE_MOUSE) { }
if (item->udev_class & SDL_UDEV_DEVICE_MOUSE) {
SDL_EVDEV_destroy_mouse(item); SDL_EVDEV_destroy_mouse(item);
} else if (item->udev_class & SDL_UDEV_DEVICE_KEYBOARD) { }
if (item->udev_class & SDL_UDEV_DEVICE_KEYBOARD) {
SDL_EVDEV_destroy_keyboard(item); SDL_EVDEV_destroy_keyboard(item);
} }
close(item->fd); close(item->fd);