SDL: Android: add define GAMEPAD_AS_RPC to handle gamepad under SDLActivity (default) or C Thread

From 71206a309aba02efd598a206aff24414e51af754 Mon Sep 17 00:00:00 2001
From: Sylvain <[EMAIL REDACTED]>
Date: Mon, 2 Feb 2026 19:36:19 +0100
Subject: [PATCH] Android: add define GAMEPAD_AS_RPC to handle gamepad under
 SDLActivity (default) or C Thread

---
 src/core/android/SDL_android.c | 54 +++++++++++++++++++++++++++++-----
 1 file changed, 47 insertions(+), 7 deletions(-)

diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c
index 019e4e89e1fa7..7b3e24b39dc8e 100644
--- a/src/core/android/SDL_android.c
+++ b/src/core/android/SDL_android.c
@@ -491,11 +491,8 @@ typedef enum {
     RPC_cmd_nativeCommitText,
     RPC_cmd_nativeGenerateScancodeForUnichar,
 
-    // SDLAudioManager_tab
-    RPC_cmd_nativeAddAudioDevice,
-    RPC_cmd_nativeRemoveAudioDevice,
-
     // SDLControllerManager_tab
+#ifdef GAMEPAD_AS_RPC
     RPC_cmd_onNativePadDown,
     RPC_cmd_onNativePadUp,
     RPC_cmd_onNativeJoy,
@@ -503,7 +500,12 @@ typedef enum {
     RPC_cmd_nativeAddJoystick,
     RPC_cmd_nativeRemoveJoystick,
     RPC_cmd_nativeAddHaptic,
-    RPC_cmd_nativeRemoveHaptic
+    RPC_cmd_nativeRemoveHaptic,
+#endif
+
+    // SDLAudioManager_tab
+    RPC_cmd_nativeAddAudioDevice,
+    RPC_cmd_nativeRemoveAudioDevice
 
     // RPC TODO HID ? see HIDDeviceManager_tab
 
@@ -554,6 +556,7 @@ static const char *cmd2Str(RPC_cmd_t cmd) {
     CASE(nativeAddAudioDevice);
     CASE(nativeRemoveAudioDevice);
 
+#ifdef GAMEPAD_AS_RPC
     // SDLControllerManager_tab
     CASE(onNativePadDown);
     CASE(onNativePadUp);
@@ -563,6 +566,7 @@ static const char *cmd2Str(RPC_cmd_t cmd) {
     CASE(nativeRemoveJoystick);
     CASE(nativeAddHaptic);
     CASE(nativeRemoveHaptic);
+#endif
 
 #undef CASE
         default:
@@ -1358,12 +1362,16 @@ JNIEXPORT jboolean JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadDown)(
     jint device_id, jint keycode)
 {
 #ifdef SDL_JOYSTICK_ANDROID
-int button = Android_keycode_to_SDL(keycode);
+    int button = Android_keycode_to_SDL(keycode);
     if (button >= 0) {
+#ifdef GAMEPAD_AS_RPC
         RPC_Prepare(onNativePadDown);
         RPC_Add(device_id);
         RPC_Add(keycode);
         RPC_Send;
+#else
+        Android_OnPadDown(device_id, keycode);
+#endif
         return true;
     }
     return false;
@@ -1387,10 +1395,14 @@ JNIEXPORT jboolean JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadUp)(
 #ifdef SDL_JOYSTICK_ANDROID
     int button = Android_keycode_to_SDL(keycode);
     if (button >= 0) {
+#ifdef GAMEPAD_AS_RPC
         RPC_Prepare(onNativePadUp);
         RPC_Add(device_id);
         RPC_Add(keycode);
         RPC_Send;
+#else
+        Android_OnPadUp(device_id, keycode);
+#endif
         return true;
     }
     return false;
@@ -1414,11 +1426,15 @@ JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeJoy)(
     jint device_id, jint axis, jfloat value)
 {
 #ifdef SDL_JOYSTICK_ANDROID
+#ifdef GAMEPAD_AS_RPC
     RPC_Prepare(onNativeJoy);
     RPC_Add(device_id);
     RPC_Add(axis);
     RPC_Add(value);
     RPC_Send;
+#else
+    Android_OnJoy(device_id, axis, value);
+#endif
 #endif
 }
 
@@ -1437,12 +1453,16 @@ JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeHat)(
     jint device_id, jint hat_id, jint x, jint y)
 {
 #ifdef SDL_JOYSTICK_ANDROID
+#ifdef GAMEPAD_AS_RPC
     RPC_Prepare(onNativeHat);
     RPC_Add(device_id);
     RPC_Add(hat_id);
     RPC_Add(x);
     RPC_Add(y);
     RPC_Send;
+#else
+    Android_OnHat(device_id, hat_id, x, y);
+#endif
 #endif
 }
 
@@ -1470,6 +1490,7 @@ JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddJoystick)(
     jint button_mask, jint naxes, jint axis_mask, jint nhats, jboolean can_rumble, jboolean has_rgb_led)
 {
 #ifdef SDL_JOYSTICK_ANDROID
+#ifdef GAMEPAD_AS_RPC
     RPC_Prepare(nativeAddJoystick);
     RPC_Add(device_id);
     RPC_AddString(device_name);
@@ -1483,6 +1504,11 @@ JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddJoystick)(
     RPC_Add(can_rumble);
     RPC_Add(has_rgb_led);
     RPC_Send;
+#else
+    Android_AddJoystick(device_id, device_name, device_desc,
+            vendor_id, product_id, button_mask, naxes,
+            axis_mask, nhats, can_rumble, has_rgb_led);
+#endif
 #endif
 }
 
@@ -1497,9 +1523,13 @@ JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveJoystick)(
     jint device_id)
 {
 #ifdef SDL_JOYSTICK_ANDROID
+#ifdef GAMEPAD_AS_RPC
     RPC_Prepare(nativeRemoveJoystick);
     RPC_Add(device_id);
     RPC_Send;
+#else
+    Android_RemoveJoystick(device_id);
+#endif
 #endif
 }
 
@@ -1515,10 +1545,14 @@ JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddHaptic)(
     JNIEnv *env, jclass jcls, jint device_id, jstring device_name)
 {
 #ifdef SDL_HAPTIC_ANDROID
+#ifdef GAMEPAD_AS_RPC
     RPC_Prepare(nativeAddHaptic);
     RPC_Add(device_name);
     RPC_AddString(device_name);
     RPC_Send;
+#else
+    Android_AddHaptic(device_id, device_name);
+#endif
 #endif
 }
 
@@ -1532,9 +1566,13 @@ JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveHaptic)(
     JNIEnv *env, jclass jcls, jint device_id)
 {
 #ifdef SDL_HAPTIC_ANDROID
+#ifdef GAMEPAD_AS_RPC
     RPC_Prepare(nativeRemoveHaptic);
     RPC_Add(device_id);
     RPC_Send;
+#else
+    Android_RemoveHaptic(device_id);
+#endif
 #endif
 }
 
@@ -3684,6 +3722,7 @@ void Android_PumpRPC(SDL_Window *window)
                 }
                 break;
 
+#ifdef GAMEPAD_AS_RPC
                 // ------------------------------
                 // SDLControllerManager_tab
                 // ------------------------------
@@ -3753,7 +3792,6 @@ void Android_PumpRPC(SDL_Window *window)
 
 #ifdef SDL_HAPTIC_ANDROID
                     Android_AddHaptic(data.device_id, data.device_name);
-
 #endif
                     SDL_free(data.device_name);
 
@@ -3769,6 +3807,8 @@ void Android_PumpRPC(SDL_Window *window)
 
                 }
                 break;
+#endif
+
 
                 // ------------------------------
                 // HIDDeviceManager_tab