From 3aa5d5740a2e3a330d1659745fa7a9501c5e1b8e Mon Sep 17 00:00:00 2001
From: meyraud705 <[EMAIL REDACTED]>
Date: Mon, 29 May 2023 12:39:01 +0200
Subject: [PATCH] Fix joystick events index/instance ID
Only "ADDED" events use joystick index.
Translate event as late as possible so we don't need to update
"ADDED" event already in the queue when a device is removed.
---
src/sdl2_compat.c | 29 ++++++++---------------------
1 file changed, 8 insertions(+), 21 deletions(-)
diff --git a/src/sdl2_compat.c b/src/sdl2_compat.c
index a61bd5c..e2b0b93 100644
--- a/src/sdl2_compat.c
+++ b/src/sdl2_compat.c
@@ -1323,6 +1323,8 @@ SysWmType3to2(const SDL_SYSWM_TYPE typ3)
any app could get an unknown event type anyhow, as SDL development progressed or a library registered
a user event, etc, so we don't bother filtering new SDL3 types out. */
+static int GetIndexFromJoystickInstance(SDL_JoystickID jid);
+
static SDL2_Event *
Event3to2(const SDL_Event *event3, SDL2_Event *event2)
{
@@ -1367,6 +1369,11 @@ Event3to2(const SDL_Event *event3, SDL2_Event *event2)
case SDL_EVENT_SENSOR_UPDATE:
event2->sensor.timestamp_us = SDL_NS_TO_US(event3->sensor.sensor_timestamp);
break;
+ /* Change SDL3 InstanceID to index */
+ case SDL_EVENT_JOYSTICK_ADDED:
+ case SDL_EVENT_GAMEPAD_ADDED:
+ event2->jaxis.which = GetIndexFromJoystickInstance(event3->jaxis.which);
+ break;
default:
break;
}
@@ -1428,7 +1435,6 @@ SDL_PushEvent(SDL2_Event *event2)
}
static int Display_IDToIndex(SDL_DisplayID displayID);
-static int GetIndexFromJoystickInstance(SDL_JoystickID jid);
static int SDLCALL
EventFilter3to2(void *userdata, SDL_Event *event3)
@@ -1454,30 +1460,11 @@ EventFilter3to2(void *userdata, SDL_Event *event3)
/* push new events when we need to convert something, like toplevel SDL3 events generating the SDL2 SDL_WINDOWEVENT. */
switch (event3->type) {
- case SDL_EVENT_JOYSTICK_AXIS_MOTION:
- case SDL_EVENT_JOYSTICK_HAT_MOTION:
- case SDL_EVENT_JOYSTICK_BUTTON_DOWN:
- case SDL_EVENT_JOYSTICK_BUTTON_UP:
case SDL_EVENT_JOYSTICK_ADDED:
- case SDL_EVENT_JOYSTICK_BATTERY_UPDATED:
- case SDL_EVENT_GAMEPAD_AXIS_MOTION:
- case SDL_EVENT_GAMEPAD_BUTTON_DOWN:
- case SDL_EVENT_GAMEPAD_BUTTON_UP:
case SDL_EVENT_GAMEPAD_ADDED:
- case SDL_EVENT_GAMEPAD_REMAPPED:
- case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN:
- case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION:
- case SDL_EVENT_GAMEPAD_TOUCHPAD_UP:
- case SDL_EVENT_GAMEPAD_SENSOR_UPDATE:
- /* Change SDL3 InstanceID to index */
- SDL_NumJoysticks(); /* Refresh */
- event3->jaxis.which = GetIndexFromJoystickInstance(event3->jaxis.which);
- break;
-
case SDL_EVENT_GAMEPAD_REMOVED:
case SDL_EVENT_JOYSTICK_REMOVED:
- event3->jaxis.which = GetIndexFromJoystickInstance(event3->jaxis.which);
- SDL_NumJoysticks(); /* Refresh after */
+ SDL_NumJoysticks(); /* Refresh */
break;
/* display events moved to the top level in SDL3. */