diff --git a/include/SDL3/SDL_gamepad.h b/include/SDL3/SDL_gamepad.h index 6bc1662117..8940533405 100644 --- a/include/SDL3/SDL_gamepad.h +++ b/include/SDL3/SDL_gamepad.h @@ -623,6 +623,18 @@ extern DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *gamepa */ extern DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamepad); +/** + * Get the battery level of a gamepad, if available. + * + * \param gamepad a gamepad identifier previously returned by + * SDL_OpenGamepad() + * \returns the current battery level as SDL_JoystickPowerLevel on success or + * `SDL_JOYSTICK_POWER_UNKNOWN` if it is unknown + * + * \since This function is available since SDL 3.0.0. + */ +extern DECLSPEC SDL_JoystickPowerLevel SDLCALL SDL_GetGamepadPowerLevel(SDL_Gamepad *gamepad); + /** * Check if a gamepad has been opened and is currently connected. * diff --git a/src/dynapi/SDL_dynapi.sym b/src/dynapi/SDL_dynapi.sym index 972de7d209..39fc3270db 100644 --- a/src/dynapi/SDL_dynapi.sym +++ b/src/dynapi/SDL_dynapi.sym @@ -870,6 +870,7 @@ SDL3_0.0.0 { SDL_wcstol; SDL_ClearClipboardData; SDL_GetGamepadInstanceID; + SDL_GetGamepadPowerLevel; # extra symbols go here (don't modify this line) local: *; }; diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h index 3f95ba4cae..5d05c859a1 100644 --- a/src/dynapi/SDL_dynapi_overrides.h +++ b/src/dynapi/SDL_dynapi_overrides.h @@ -896,3 +896,4 @@ /* New API symbols are added at the end */ #define SDL_ClearClipboardData SDL_ClearClipboardData_REAL #define SDL_GetGamepadInstanceID SDL_GetGamepadInstanceID_REAL +#define SDL_GetGamepadPowerLevel SDL_GetGamepadPowerLevel_REAL diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index bbd5bec45a..8eb31fc316 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -941,3 +941,4 @@ SDL_DYNAPI_PROC(long,SDL_wcstol,(const wchar_t *a, wchar_t **b, int c),(a,b,c),r /* New API symbols are added at the end */ SDL_DYNAPI_PROC(int,SDL_ClearClipboardData,(void),(),return) SDL_DYNAPI_PROC(SDL_JoystickID,SDL_GetGamepadInstanceID,(SDL_Gamepad *a),(a),return) +SDL_DYNAPI_PROC(SDL_JoystickPowerLevel,SDL_GetGamepadPowerLevel,(SDL_Gamepad *a),(a),return) diff --git a/src/joystick/SDL_gamepad.c b/src/joystick/SDL_gamepad.c index 92af5c5867..86945ff569 100644 --- a/src/joystick/SDL_gamepad.c +++ b/src/joystick/SDL_gamepad.c @@ -2778,6 +2778,16 @@ const char * SDL_GetGamepadSerial(SDL_Gamepad *gamepad) return SDL_GetJoystickSerial(joystick); } +SDL_JoystickPowerLevel SDL_GetGamepadPowerLevel(SDL_Gamepad *gamepad) +{ + SDL_Joystick *joystick = SDL_GetGamepadJoystick(gamepad); + + if (joystick == NULL) { + return SDL_JOYSTICK_POWER_UNKNOWN; + } + return SDL_GetJoystickPowerLevel(joystick); +} + /* * Return if the gamepad in question is currently attached to the system, * \return 0 if not plugged in, 1 if still present. diff --git a/test/gamepadutils.c b/test/gamepadutils.c index eb0e390cdf..61a4f24fe2 100644 --- a/test/gamepadutils.c +++ b/test/gamepadutils.c @@ -389,7 +389,7 @@ void UpdateGamepadImageFromGamepad(GamepadImage *ctx, SDL_Gamepad *gamepad) } } - ctx->battery_level = SDL_GetJoystickPowerLevel(SDL_GetGamepadJoystick(gamepad)); + ctx->battery_level = SDL_GetGamepadPowerLevel(gamepad); if (SDL_GetNumGamepadTouchpads(gamepad) > 0) { int num_fingers = SDL_GetNumGamepadTouchpadFingers(gamepad, 0);