commit 1170112da3776fdb06425f62d57b63144c33dc51
authorSam Lantinga <slouken@libsdl.org>
Fri, 26 Aug 2016 11:16:44 -0700
changeset 10280 3134026517cb
parent 10279 d1c27f616999
child 10281 cb13d22b7f09
commit 1170112da3776fdb06425f62d57b63144c33dc51
Author: James Zipperer <james.zipperer@synapse.com>
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
src/joystick/linux/SDL_sysjoystick.c
--- a/src/joystick/SDL_gamecontroller.c	Thu Aug 25 22:31:44 2016 +0200
+++ b/src/joystick/SDL_gamecontroller.c	Fri Aug 26 11:16:44 2016 -0700
@@ -222,7 +222,19 @@
             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);
--- a/src/joystick/linux/SDL_sysjoystick.c	Thu Aug 25 22:31:44 2016 +0200
+++ b/src/joystick/linux/SDL_sysjoystick.c	Fri Aug 26 11:16:44 2016 -0700
@@ -295,6 +295,18 @@
             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) ) {