From d94f2a9ee56abcbe84a95da91eb3a3319cb4d022 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sun, 8 Jan 2023 10:47:58 -0800
Subject: [PATCH] Always allow controller events for virtual joysticks
regardless of focus state
Refrence https://github.com/libsdl-org/SDL/pull/7024
---
src/joystick/SDL_joystick.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c
index 5b1c6a2c05c3..2c30b23abfa1 100644
--- a/src/joystick/SDL_joystick.c
+++ b/src/joystick/SDL_joystick.c
@@ -1314,13 +1314,18 @@ void SDL_QuitJoysticks(void)
SDL_UnlockJoysticks();
}
-static SDL_bool SDL_PrivateJoystickShouldIgnoreEvent()
+static SDL_bool SDL_PrivateJoystickShouldIgnoreEvent(SDL_Joystick *joystick)
{
if (SDL_joystick_allows_background_events) {
return SDL_FALSE;
}
if (SDL_HasWindows() && SDL_GetKeyboardFocus() == NULL) {
+ if (SDL_IsJoystickVIRTUAL(joystick->guid)) {
+ /* Always allow events for virtual controllers, they're not affected by focus */
+ return SDL_FALSE;
+ }
+
/* We have windows but we don't have focus, ignore the event. */
return SDL_TRUE;
}
@@ -1520,7 +1525,7 @@ int SDL_SendJoystickAxis(Uint64 timestamp, SDL_Joystick *joystick, Uint8 axis, S
/* We ignore events if we don't have keyboard focus, except for centering
* events.
*/
- if (SDL_PrivateJoystickShouldIgnoreEvent()) {
+ if (SDL_PrivateJoystickShouldIgnoreEvent(joystick)) {
if (info->sending_initial_value ||
(value > info->zero && value >= info->value) ||
(value < info->zero && value <= info->value)) {
@@ -1564,7 +1569,7 @@ int SDL_SendJoystickHat(Uint64 timestamp, SDL_Joystick *joystick, Uint8 hat, Uin
/* We ignore events if we don't have keyboard focus, except for centering
* events.
*/
- if (SDL_PrivateJoystickShouldIgnoreEvent()) {
+ if (SDL_PrivateJoystickShouldIgnoreEvent(joystick)) {
if (value != SDL_HAT_CENTERED) {
return 0;
}
@@ -1622,7 +1627,7 @@ int SDL_SendJoystickButton(Uint64 timestamp, SDL_Joystick *joystick, Uint8 butto
/* We ignore events if we don't have keyboard focus, except for button
* release. */
- if (SDL_PrivateJoystickShouldIgnoreEvent()) {
+ if (SDL_PrivateJoystickShouldIgnoreEvent(joystick)) {
if (state == SDL_PRESSED) {
return 0;
}
@@ -2922,7 +2927,7 @@ int SDL_SendJoystickTouchpad(Uint64 timestamp, SDL_Joystick *joystick, int touch
}
/* We ignore events if we don't have keyboard focus, except for touch release */
- if (SDL_PrivateJoystickShouldIgnoreEvent()) {
+ if (SDL_PrivateJoystickShouldIgnoreEvent(joystick)) {
if (event_type != SDL_GAMEPADTOUCHPADUP) {
return 0;
}
@@ -2961,7 +2966,7 @@ int SDL_SendJoystickSensor(Uint64 timestamp, SDL_Joystick *joystick, SDL_SensorT
SDL_AssertJoysticksLocked();
/* We ignore events if we don't have keyboard focus */
- if (SDL_PrivateJoystickShouldIgnoreEvent()) {
+ if (SDL_PrivateJoystickShouldIgnoreEvent(joystick)) {
return 0;
}