From c69bce6774ffd8122d98b07801bbefa22243b4ff Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 26 Aug 2016 11:16:44 -0700 Subject: [PATCH] commit 1170112da3776fdb06425f62d57b63144c33dc51 Author: James Zipperer Date: Sun Aug 21 01:19:19 2016 -0700 bugfix for controller / joystick add / remove being in the event queue at the same time --- src/joystick/SDL_gamecontroller.c | 12 ++++++++++++ src/joystick/linux/SDL_sysjoystick.c | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/joystick/SDL_gamecontroller.c b/src/joystick/SDL_gamecontroller.c index 93e6fbfb24a1f..4834bba3ab304 100644 --- a/src/joystick/SDL_gamecontroller.c +++ b/src/joystick/SDL_gamecontroller.c @@ -222,7 +222,19 @@ int SDL_GameControllerEventWatcher(void *userdata, SDL_Event * event) SDL_GameController *controllerlist = SDL_gamecontrollers; while (controllerlist) { if (controllerlist->joystick->instance_id == event->jdevice.which) { + SDL_Event peeped; SDL_Event deviceevent; + + /* If there is an existing add event in the queue, it + * needs to be modified to have the right value for which, + * because the number of controllers in the system is now + * one less. + */ + if ( SDL_PeepEvents(&peeped, 1, SDL_GETEVENT, SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEADDED) > 0) { + peeped.jdevice.which--; + SDL_PushEvent(&peeped); + } + deviceevent.type = SDL_CONTROLLERDEVICEREMOVED; deviceevent.cdevice.which = event->jdevice.which; SDL_PushEvent(&deviceevent); diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c index 8c73859ea82de..421a3bf58c18c 100644 --- a/src/joystick/linux/SDL_sysjoystick.c +++ b/src/joystick/linux/SDL_sysjoystick.c @@ -295,6 +295,18 @@ MaybeRemoveDevice(const char *path) event.type = SDL_JOYDEVICEREMOVED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { + SDL_Event peeped; + + /* If there is an existing add event in the queue, it + * needs to be modified to have the right value for which, + * because the number of controllers in the system is now + * one less. + */ + if ( SDL_PeepEvents(&peeped, 1, SDL_GETEVENT, SDL_JOYDEVICEADDED, SDL_JOYDEVICEADDED) > 0) { + peeped.jdevice.which--; + SDL_PushEvent(&peeped); + } + event.jdevice.which = item->device_instance; if ( (SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event) ) {