From 5ce0aacaa406869ef83fb9e0ae5c7702ab8b3c44 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 18 Jul 2024 17:04:57 -0700 Subject: [PATCH] SDL_GetGamepads() follows the SDL_GetStringRule --- include/SDL3/SDL_gamepad.h | 11 ++++++----- src/dynapi/SDL_dynapi_procs.h | 2 +- src/joystick/SDL_gamepad.c | 6 +++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/include/SDL3/SDL_gamepad.h b/include/SDL3/SDL_gamepad.h index f0868df05d..f7aa3e8aed 100644 --- a/include/SDL3/SDL_gamepad.h +++ b/include/SDL3/SDL_gamepad.h @@ -468,17 +468,18 @@ extern SDL_DECLSPEC SDL_bool SDLCALL SDL_HasGamepad(void); /** * Get a list of currently connected gamepads. * - * \param count a pointer filled in with the number of gamepads returned. - * \returns a 0 terminated array of joystick instance IDs which should be - * freed with SDL_free(), or NULL on failure; call SDL_GetError() for - * more details. + * The returned array follows the SDL_GetStringRule, and will be automatically freed later. + * + * \param count a pointer filled in with the number of gamepads returned, may be NULL. + * \returns a 0 terminated array of joystick instance IDs or NULL on failure; call SDL_GetError() for + * more information. * * \since This function is available since SDL 3.0.0. * * \sa SDL_HasGamepad * \sa SDL_OpenGamepad */ -extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetGamepads(int *count); +extern SDL_DECLSPEC const SDL_JoystickID * SDLCALL SDL_GetGamepads(int *count); /** * Check if the given joystick is supported by the gamepad interface. diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 8ae9622515..d1d90589dc 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -317,7 +317,7 @@ SDL_DYNAPI_PROC(SDL_GamepadType,SDL_GetGamepadTypeForID,(SDL_JoystickID a),(a),r SDL_DYNAPI_PROC(SDL_GamepadType,SDL_GetGamepadTypeFromString,(const char *a),(a),return) SDL_DYNAPI_PROC(Uint16,SDL_GetGamepadVendor,(SDL_Gamepad *a),(a),return) SDL_DYNAPI_PROC(Uint16,SDL_GetGamepadVendorForID,(SDL_JoystickID a),(a),return) -SDL_DYNAPI_PROC(SDL_JoystickID*,SDL_GetGamepads,(int *a),(a),return) +SDL_DYNAPI_PROC(const SDL_JoystickID*,SDL_GetGamepads,(int *a),(a),return) SDL_DYNAPI_PROC(SDL_MouseButtonFlags,SDL_GetGlobalMouseState,(float *a, float *b),(a,b),return) SDL_DYNAPI_PROC(SDL_PropertiesID,SDL_GetGlobalProperties,(void),(),return) SDL_DYNAPI_PROC(SDL_Window*,SDL_GetGrabbedWindow,(void),(),return) diff --git a/src/joystick/SDL_gamepad.c b/src/joystick/SDL_gamepad.c index d0d3ca9138..eadc1404c3 100644 --- a/src/joystick/SDL_gamepad.c +++ b/src/joystick/SDL_gamepad.c @@ -2396,11 +2396,11 @@ SDL_bool SDL_HasGamepad(void) return SDL_FALSE; } -SDL_JoystickID *SDL_GetGamepads(int *count) +const SDL_JoystickID *SDL_GetGamepads(int *count) { int num_joysticks = 0; int num_gamepads = 0; - SDL_JoystickID *joysticks = SDL_GetJoysticks(&num_joysticks); + SDL_JoystickID *joysticks = SDL_ClaimEventMemory(SDL_GetJoysticks(&num_joysticks)); if (joysticks) { int i; for (i = num_joysticks - 1; i >= 0; --i) { @@ -2414,7 +2414,7 @@ SDL_JoystickID *SDL_GetGamepads(int *count) if (count) { *count = num_gamepads; } - return joysticks; + return SDL_FreeLater(joysticks); } const char *SDL_GetGamepadNameForID(SDL_JoystickID instance_id)