SDL: let through a SetLED command every 5sec to deall with situations where the controller loses power when a computer is suspended

CR: SamL
main
Sam Lantinga 2021-04-12 11:25:42 -07:00
parent c59d4dcd38
commit 2a20cc0f1d
2 changed files with 14 additions and 5 deletions

View File

@ -416,6 +416,7 @@ SDL_JoystickOpen(int device_index)
joystick->instance_id = instance_id;
joystick->attached = SDL_TRUE;
joystick->epowerlevel = SDL_JOYSTICK_POWER_UNKNOWN;
joystick->led_expiration = SDL_GetTicks();
if (driver->Open(joystick, device_index) < 0) {
SDL_free(joystick);
@ -954,6 +955,7 @@ int
SDL_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue)
{
int result;
SDL_bool isfreshvalue;
if (!SDL_PrivateJoystickValid(joystick)) {
return -1;
@ -961,13 +963,17 @@ SDL_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue)
SDL_LockJoysticks();
if (red == joystick->led_red &&
green == joystick->led_green &&
blue == joystick->led_blue) {
isfreshvalue = red != joystick->led_red ||
green != joystick->led_green ||
blue != joystick->led_blue;
if ( isfreshvalue || SDL_TICKS_PASSED( SDL_GetTicks(), joystick->led_expiration ) ) {
result = joystick->driver->SetLED(joystick, red, green, blue);
joystick->led_expiration = SDL_GetTicks() + SDL_LED_MIN_REPEAT_MS;
}
else {
/* Avoid spamming the driver */
result = 0;
} else {
result = joystick->driver->SetLED(joystick, red, green, blue);
}
/* Save the LED value regardless of success, so we don't spam the driver */

View File

@ -99,6 +99,7 @@ struct _SDL_Joystick
Uint8 led_red;
Uint8 led_green;
Uint8 led_blue;
Uint32 led_expiration;
SDL_bool attached;
SDL_bool is_game_controller;
@ -189,6 +190,8 @@ typedef struct _SDL_JoystickDriver
/* Windows and Mac OSX has a limit of MAX_DWORD / 1000, Linux kernel has a limit of 0xFFFF */
#define SDL_MAX_RUMBLE_DURATION_MS 0xFFFF
#define SDL_LED_MIN_REPEAT_MS 5000
/* The available joystick drivers */
extern SDL_JoystickDriver SDL_ANDROID_JoystickDriver;
extern SDL_JoystickDriver SDL_BSD_JoystickDriver;