[Android] Try to improve handling of DPAD|GAMEPAD + KEYBOARD devices
authorGabriel Jacobo <gabomdq@gmail.com>
Tue, 19 Nov 2013 10:00:05 -0300
changeset 8013 109299fe73ad
parent 8012 6516c66db5c9
child 8014 0a4b6dec7de5
[Android] Try to improve handling of DPAD|GAMEPAD + KEYBOARD devices It seems some devices report themselves as DPAD or GAMEPAD and KEYBOARD as well, and we need to route different keycodes to different parts of SDL.
android-project/src/org/libsdl/app/SDLActivity.java
src/core/android/SDL_android.c
src/joystick/android/SDL_sysjoystick.c
--- a/android-project/src/org/libsdl/app/SDLActivity.java	Mon Nov 18 20:22:36 2013 -0800
+++ b/android-project/src/org/libsdl/app/SDLActivity.java	Tue Nov 19 10:00:05 2013 -0300
@@ -245,8 +245,8 @@
     public static native void nativePause();
     public static native void nativeResume();
     public static native void onNativeResize(int x, int y, int format);
-    public static native void onNativePadDown(int padId, int keycode);
-    public static native void onNativePadUp(int padId, int keycode);
+    public static native int onNativePadDown(int padId, int keycode);
+    public static native int onNativePadUp(int padId, int keycode);
     public static native void onNativeJoy(int joyId, int axis,
                                           float value);
     public static native void onNativeKeyDown(int keycode);
@@ -600,19 +600,22 @@
     @Override
     public boolean onKey(View  v, int keyCode, KeyEvent event) {
         // Dispatch the different events depending on where they come from
-        // Some SOURCE_DPAD or SOURCE_GAMEPAD events appear to also be marked as SOURCE_KEYBOARD
-        // So, to avoid problems, we process DPAD or GAMEPAD events first.
+        // Some SOURCE_DPAD or SOURCE_GAMEPAD are also SOURCE_KEYBOARD
+        // So, we try to process them as DPAD or GAMEPAD events first, if that fails we try them as KEYBOARD
         
         if ( (event.getSource() & 0x00000401) != 0 || /* API 12: SOURCE_GAMEPAD */
                    (event.getSource() & InputDevice.SOURCE_DPAD) != 0 ) {
             int id = SDLActivity.getJoyId( event.getDeviceId() );
             if (id != -1) {
                 if (event.getAction() == KeyEvent.ACTION_DOWN) {
-                    SDLActivity.onNativePadDown(id, keyCode);
+                    if (SDLActivity.onNativePadDown(id, keyCode) == 0) {
+                        return true;
+                    }
                 } else if (event.getAction() == KeyEvent.ACTION_UP) {
-                    SDLActivity.onNativePadUp(id, keyCode);
+                    if (SDLActivity.onNativePadUp(id, keyCode) == 0) {
+                        return true;
+                    }
                 }
-                return true;
             }
         }
         
--- a/src/core/android/SDL_android.c	Mon Nov 18 20:22:36 2013 -0800
+++ b/src/core/android/SDL_android.c	Tue Nov 19 10:00:05 2013 -0300
@@ -148,19 +148,19 @@
 }
 
 // Paddown
-void Java_org_libsdl_app_SDLActivity_onNativePadDown(
+int Java_org_libsdl_app_SDLActivity_onNativePadDown(
                                     JNIEnv* env, jclass jcls,
                                     jint padId, jint keycode)
 {
-    Android_OnPadDown(padId, keycode);
+    return Android_OnPadDown(padId, keycode);
 }
 
 // Padup
-void Java_org_libsdl_app_SDLActivity_onNativePadUp(
+int Java_org_libsdl_app_SDLActivity_onNativePadUp(
                                    JNIEnv* env, jclass jcls,
                                    jint padId, jint keycode)
 {
-    Android_OnPadUp(padId, keycode);
+    return Android_OnPadUp(padId, keycode);
 }
 
 /* Joy */
--- a/src/joystick/android/SDL_sysjoystick.c	Mon Nov 18 20:22:36 2013 -0800
+++ b/src/joystick/android/SDL_sysjoystick.c	Tue Nov 19 10:00:05 2013 -0300
@@ -128,7 +128,6 @@
             break;
             
         default:
-            SDL_Log("The button you just pressed is not recognized by SDL. To help get this fixed, please report this to the SDL mailing list <sdl@libsdl.org> Android KeyCode %d", keycode);
             return -1;
             break;
     }
@@ -313,9 +312,10 @@
     int button = keycode_to_SDL(keycode);
     if (button >= 0) {
         SDL_PrivateJoystickButton(SYS_Joysticks[padId], button , SDL_PRESSED);
+        return 0;
     }
     
-    return 0;
+    return -1;
 }
 
 int
@@ -324,9 +324,10 @@
     int button = keycode_to_SDL(keycode);
     if (button >= 0) {
         SDL_PrivateJoystickButton(SYS_Joysticks[padId], button, SDL_RELEASED);
+        return 0;
     }
     
-    return 0;
+    return -1;
 }
 
 int