diff --git a/MonoGame.Framework/Input/.SDL2/ConcreteJoystick.cs b/MonoGame.Framework/Input/.SDL2/ConcreteJoystick.cs index e569fc5edfc..94c699a693f 100644 --- a/MonoGame.Framework/Input/.SDL2/ConcreteJoystick.cs +++ b/MonoGame.Framework/Input/.SDL2/ConcreteJoystick.cs @@ -16,6 +16,9 @@ public sealed class ConcreteJoystick : JoystickStrategy // map Joystick indices (PlayerIndex) -> JoystickDevices private Dictionary _sdlJoysticks = new Dictionary(); + // map Joystick instanceIDs -> gamepad indices (PlayerIndex) + private readonly Dictionary _indicesMap = new Dictionary(); + private int _maxConnectedIndex = -1; public override bool PlatformIsSupported @@ -39,6 +42,7 @@ public ConcreteJoystick() SDL.JOYSTICK.Close(sdlJoystick.Handle); _sdlJoysticks.Clear(); + _indicesMap.Clear(); } public override JoystickCapabilities PlatformGetCapabilities(int index) @@ -160,23 +164,25 @@ internal void AddDevice(int deviceIndex) _sdlJoysticks.Add(index, sdlJoystick); + _indicesMap[instanceID] = index; + if (sdlJoystick.Capabilities.IsGamepad) ((IPlatformGamePad)GamePad.Current).GetStrategy().AddDevice(deviceIndex); } internal void RemoveDevice(int instanceID) { - foreach (KeyValuePair item in _sdlJoysticks) + if (_indicesMap.TryGetValue(instanceID, out int index)) { - if (SDL.JOYSTICK.InstanceID(item.Value.Handle) == instanceID) + if (_sdlJoysticks.TryGetValue(index, out SdlJoystickDevice sdlJoystick)) { - SDL.JOYSTICK.Close(item.Value.Handle); - _sdlJoysticks.Remove(item.Key); + SDL.JOYSTICK.Close(sdlJoystick.Handle); + _sdlJoysticks.Remove(index); - if (_maxConnectedIndex == item.Key) + if (_maxConnectedIndex == index) _maxConnectedIndex = CalculateMaxConnectedIndex(); - break; + _indicesMap.Remove(instanceID); } } }