Add new virtual joysticks to the end of the list This guarantees that the device index that's returned is stable, as long as no joystick hotplug events occur.
diff --git a/src/joystick/virtual/SDL_virtualjoystick.c b/src/joystick/virtual/SDL_virtualjoystick.c
index b557d0c..c54d273 100644
--- a/src/joystick/virtual/SDL_virtualjoystick.c
+++ b/src/joystick/virtual/SDL_virtualjoystick.c
@@ -245,8 +245,16 @@ SDL_JoystickAttachVirtualInner(const SDL_VirtualJoystickDesc *desc)
hwdata->instance_id = SDL_GetNextJoystickInstanceID();
/* Add virtual joystick to SDL-global lists */
- hwdata->next = g_VJoys;
- g_VJoys = hwdata;
+ if (g_VJoys) {
+ joystick_hwdata *last;
+
+ for (last = g_VJoys; last->next; last = last->next) {
+ continue;
+ }
+ last->next = hwdata;
+ } else {
+ g_VJoys = hwdata;
+ }
SDL_PrivateJoystickAdded(hwdata->instance_id);
/* Return the new virtual-device's index */
diff --git a/test/testgamecontroller.c b/test/testgamecontroller.c
index 45560c5..6ccf3b6 100644
--- a/test/testgamecontroller.c
+++ b/test/testgamecontroller.c
@@ -365,7 +365,7 @@ static void CloseVirtualController()
{
int i;
- for (i = 0; i < SDL_NumJoysticks(); ++i) {
+ for (i = SDL_NumJoysticks(); i--; ) {
if (SDL_JoystickIsVirtual(i)) {
SDL_JoystickDetachVirtual(i);
}