From 12efeda8e19a13fb97e131aace14063e63331ab9 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 25 Jul 2021 18:49:11 -0500 Subject: [PATCH] Ignore accelerometers and improve debugging of player numbers --- src/input/evdev.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/input/evdev.c b/src/input/evdev.c index 8046164..9f8c444 100644 --- a/src/input/evdev.c +++ b/src/input/evdev.c @@ -142,13 +142,13 @@ static bool evdev_init_parms(struct input_device *dev, struct input_abs_parms *p static void evdev_remove(int devindex) { numDevices--; + printf("Input device removed: %s (player %d)\n", libevdev_get_name(devices[devindex].dev), devices[devindex].controllerId); + if (devices[devindex].controllerId >= 0) assignedControllerIds &= ~(1 << devices[devindex].controllerId); if (devindex != numDevices && numDevices > 0) memcpy(&devices[devindex], &devices[numDevices], sizeof(struct input_device)); - - fprintf(stderr, "Removed input device\n"); } static short evdev_convert_value(struct input_event *ev, struct input_device *dev, struct input_abs_parms *parms, bool reverse) { @@ -226,6 +226,7 @@ static bool evdev_handle_event(struct input_event *ev, struct input_device *dev) if ((assignedControllerIds & (1 << i)) == 0) { assignedControllerIds |= (1 << i); dev->controllerId = i; + printf("Assigned %s as player %d\n", libevdev_get_name(dev->dev), i+1); break; } } @@ -496,7 +497,7 @@ static bool evdev_handle_event(struct input_event *ev, struct input_device *dev) } if (gamepadModified && (dev->buttonFlags & QUIT_BUTTONS) == QUIT_BUTTONS) { - LiSendMultiControllerEvent(dev->controllerId, 1, 0, 0, 0, 0, 0, 0, 0); + LiSendMultiControllerEvent(dev->controllerId, assignedControllerIds, 0, 0, 0, 0, 0, 0, 0); return false; } @@ -628,7 +629,15 @@ void evdev_create(const char* device, struct mapping* mappings, bool verbose, in bool is_mouse = libevdev_has_event_type(evdev, EV_REL) || libevdev_has_event_code(evdev, EV_KEY, BTN_LEFT); bool is_touchscreen = libevdev_has_event_code(evdev, EV_KEY, BTN_TOUCH); - // The gamepad classification logic comes from SDL + // This classification logic comes from SDL + bool is_accelerometer = + ((libevdev_has_event_code(evdev, EV_ABS, ABS_X) && + libevdev_has_event_code(evdev, EV_ABS, ABS_Y) && + libevdev_has_event_code(evdev, EV_ABS, ABS_Z)) || + (libevdev_has_event_code(evdev, EV_ABS, ABS_RX) && + libevdev_has_event_code(evdev, EV_ABS, ABS_RY) && + libevdev_has_event_code(evdev, EV_ABS, ABS_RZ))) && + !libevdev_has_event_type(evdev, EV_KEY); bool is_gamepad = libevdev_has_event_code(evdev, EV_ABS, ABS_X) && libevdev_has_event_code(evdev, EV_ABS, ABS_Y) && @@ -652,6 +661,12 @@ void evdev_create(const char* device, struct mapping* mappings, bool verbose, in if (is_gamepad) evdev_gamepads++; + if (is_accelerometer) { + libevdev_free(evdev); + close(fd); + return; + } + int dev = numDevices; numDevices++;