From b742ebaf72c54036461ddbf95e6ecb03186d62b6 Mon Sep 17 00:00:00 2001 From: Sergii Pylypenko Date: Fri, 3 Nov 2017 23:49:24 +0200 Subject: [PATCH] SDL: unfinished support for multiple gamepads --- changeAppSettings.sh | 2 +- project/java/Video.java | 98 +++++++++++-- .../ballfield/AndroidAppSettings.cfg | 2 +- .../application/liero/AndroidAppSettings.cfg | 2 +- .../jni/sdl-1.2/include/SDL_screenkeyboard.h | 13 +- .../src/video/android/SDL_androidinput.c | 134 ++++++++++++------ .../src/video/android/SDL_androidinput.h | 68 ++++----- .../jni/sdl-1.2/src/video/android/keymap.c | 92 ++++++++++++ 8 files changed, 319 insertions(+), 92 deletions(-) diff --git a/changeAppSettings.sh b/changeAppSettings.sh index d7d9526d3..214cec772 100755 --- a/changeAppSettings.sh +++ b/changeAppSettings.sh @@ -705,7 +705,7 @@ done KEY2=0 for KEY in $RedefinedKeysGamepad; do - RedefinedKeycodesGamepad="$RedefinedKeycodesGamepad -DSDL_ANDROID_GAMEPAD_KEYCODE_$KEY2=$KEY" + RedefinedKeycodesGamepad="$RedefinedKeycodesGamepad -DSDL_ANDROID_GAMEPAD_0_KEYCODE_$KEY2=$KEY" KEY2=`expr $KEY2 '+' 1` done diff --git a/project/java/Video.java b/project/java/Video.java index a233bf592..3922e3e5f 100644 --- a/project/java/Video.java +++ b/project/java/Video.java @@ -65,6 +65,7 @@ import android.view.Display; import android.net.Uri; import android.Manifest; import android.content.pm.PackageManager; +import android.hardware.input.InputManager; class Mouse @@ -395,7 +396,8 @@ abstract class DifferentTouchInput event.getAxisValue(MotionEvent.AXIS_X), event.getAxisValue(MotionEvent.AXIS_Y), event.getAxisValue(MotionEvent.AXIS_Z), event.getAxisValue(MotionEvent.AXIS_RZ), event.getAxisValue(MotionEvent.AXIS_LTRIGGER), event.getAxisValue(MotionEvent.AXIS_RTRIGGER), - event.getAxisValue(MotionEvent.AXIS_HAT_X), event.getAxisValue(MotionEvent.AXIS_HAT_Y) ); + event.getAxisValue(MotionEvent.AXIS_HAT_X), event.getAxisValue(MotionEvent.AXIS_HAT_Y), + processGamepadDeviceId(event.getDevice()) ); return; } // Process mousewheel @@ -550,6 +552,78 @@ abstract class DifferentTouchInput } } } + + private static int gamepadIds[] = new int[4]; // Maximum 4 gamepads at the moment + + public static int processGamepadDeviceId(InputDevice device) + { + if( device == null ) + return 0; + int source = device.getSources(); + if( (source & InputDevice.SOURCE_CLASS_JOYSTICK) != InputDevice.SOURCE_CLASS_JOYSTICK && + (source & InputDevice.SOURCE_GAMEPAD) != InputDevice.SOURCE_GAMEPAD ) + { + return 0; + } + int deviceId = device.getId(); + for( int i = 0; i < gamepadIds.length; i++ ) + { + if (gamepadIds[i] == deviceId) + return i + 1; + } + for( int i = 0; i < gamepadIds.length; i++ ) + { + if (gamepadIds[i] == 0) + { + Log.i("SDL", "libSDL: gamepad added: deviceId " + deviceId + " gamepadId " + (i + 1)); + gamepadIds[i] = deviceId; + return i + 1; + } + } + return 0; + } + + public static void registerInputManagerCallbacks(Context context) + { + if( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN ) + { + JellyBeanInputManager.Holder.sInstance.register(context); + } + } + + private static class JellyBeanInputManager + { + private static class Holder + { + private static final JellyBeanInputManager sInstance = new JellyBeanInputManager(); + } + private static class Listener implements InputManager.InputDeviceListener + { + public void onInputDeviceAdded(int deviceId) + { + } + public void onInputDeviceChanged(int deviceId) + { + onInputDeviceRemoved(deviceId); + } + public void onInputDeviceRemoved(int deviceId) + { + for( int i = 0; i < gamepadIds.length; i++ ) + { + if (gamepadIds[i] == deviceId) + { + Log.i("SDL", "libSDL: gamepad removed: deviceId " + deviceId + " gamepadId "+ (i + 1)); + gamepadIds[i] = 0; + } + } + } + } + public void register(Context context) + { + InputManager manager = (InputManager) context.getSystemService(Context.INPUT_SERVICE); + manager.registerInputDeviceListener(new Listener(), null); + } + } } class DemoRenderer extends GLSurfaceView_SDL.Renderer @@ -977,12 +1051,14 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer } class DemoGLSurfaceView extends GLSurfaceView_SDL { + public DemoGLSurfaceView(MainActivity context) { super(context); mParent = context; setEGLConfigChooser(Globals.VideoDepthBpp, Globals.NeedDepthBuffer, Globals.NeedStencilBuffer, Globals.NeedGles2, Globals.NeedGles3); mRenderer = new DemoRenderer(context); setRenderer(mRenderer); + DifferentTouchInput.registerInputManagerCallbacks(context); } @Override @@ -1001,10 +1077,8 @@ class DemoGLSurfaceView extends GLSurfaceView_SDL { return true; } } - //if( context._screenKeyboard != null && context._screenKeyboard.onKeyDown(keyCode, event) ) - // return true; - if( nativeKey( keyCode, 1, event.getUnicodeChar() ) == 0 ) + if( nativeKey( keyCode, 1, event.getUnicodeChar(), DifferentTouchInput.processGamepadDeviceId(event.getDevice()) ) == 0 ) return super.onKeyDown(keyCode, event); return true; @@ -1027,14 +1101,12 @@ class DemoGLSurfaceView extends GLSurfaceView_SDL { return true; } } - //if( _screenKeyboard != null && _screenKeyboard.onKeyUp(keyCode, event) ) - // return true; - if( nativeKey( keyCode, 0, event.getUnicodeChar() ) == 0 ) + if( nativeKey( keyCode, 0, event.getUnicodeChar(), DifferentTouchInput.processGamepadDeviceId(event.getDevice()) ) == 0 ) return super.onKeyUp(keyCode, event); - if( keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU ) - DimSystemStatusBar.get().dim(mParent._videoLayout); + //if( keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU ) + // DimSystemStatusBar.get().dim(mParent._videoLayout); return true; } @@ -1047,8 +1119,8 @@ class DemoGLSurfaceView extends GLSurfaceView_SDL { // International text input for(int i = 0; i < event.getCharacters().length(); i++ ) { - nativeKey( event.getKeyCode(), 1, event.getCharacters().codePointAt(i) ); - nativeKey( event.getKeyCode(), 0, event.getCharacters().codePointAt(i) ); + nativeKey( event.getKeyCode(), 1, event.getCharacters().codePointAt(i), 0 ); + nativeKey( event.getKeyCode(), 0, event.getCharacters().codePointAt(i), 0 ); } } return true; @@ -1140,11 +1212,11 @@ class DemoGLSurfaceView extends GLSurfaceView_SDL { MainActivity mParent; public static native void nativeMotionEvent( int x, int y, int action, int pointerId, int pressure, int radius ); - public static native int nativeKey( int keyCode, int down, int unicode ); + public static native int nativeKey( int keyCode, int down, int unicode, int gamepadId ); public static native void nativeHardwareMouseDetected( int detected ); public static native void nativeMouseButtonsPressed( int buttonId, int pressedState ); public static native void nativeMouseWheel( int scrollX, int scrollY ); - public static native void nativeGamepadAnalogJoystickInput( float stick1x, float stick1y, float stick2x, float stick2y, float ltrigger, float rtrigger, float dpadx, float dpady ); + public static native void nativeGamepadAnalogJoystickInput( float stick1x, float stick1y, float stick2x, float stick2y, float ltrigger, float rtrigger, float dpadx, float dpady, int gamepadId ); public static native void nativeScreenVisibleRect( int x, int y, int w, int h ); public static native void nativeScreenKeyboardShown( int shown ); } diff --git a/project/jni/application/ballfield/AndroidAppSettings.cfg b/project/jni/application/ballfield/AndroidAppSettings.cfg index dcaca5f8c..eebe6766b 100644 --- a/project/jni/application/ballfield/AndroidAppSettings.cfg +++ b/project/jni/application/ballfield/AndroidAppSettings.cfg @@ -225,7 +225,7 @@ RedefinedKeysScreenKbNames="0 1 2 3 4 5 6 7 8 9" TouchscreenKeysTheme=4 # Redefine gamepad keys to SDL keysyms, button order is: -# A B X Y L1 R1 L2 R2 LThumb RThumb +# A B X Y L1 R1 L2 R2 LThumb RThumb Start Select Up Down Left Right RedefinedKeysGamepad="0 1 2 3 4 5 6 7 8 9" # How long to show startup menu button, in msec, 0 to disable startup menu diff --git a/project/jni/application/liero/AndroidAppSettings.cfg b/project/jni/application/liero/AndroidAppSettings.cfg index 130e17184..b8bc0aa2f 100644 --- a/project/jni/application/liero/AndroidAppSettings.cfg +++ b/project/jni/application/liero/AndroidAppSettings.cfg @@ -21,7 +21,7 @@ AppVersionName="1.37.03" AppDataDownloadUrl="!!Game data|data.zip" # Reset SDL config when updating application to the new version (y) / (n) -ResetSdlConfigForThisVersion=n +ResetSdlConfigForThisVersion=y # Delete application data files when upgrading (specify file/dir paths separated by spaces) DeleteFilesOnUpgrade="libsdl-DownloadFinished-0.flag" diff --git a/project/jni/sdl-1.2/include/SDL_screenkeyboard.h b/project/jni/sdl-1.2/include/SDL_screenkeyboard.h index b9df63db7..48e38a238 100644 --- a/project/jni/sdl-1.2/include/SDL_screenkeyboard.h +++ b/project/jni/sdl-1.2/include/SDL_screenkeyboard.h @@ -167,9 +167,20 @@ extern DECLSPEC int SDLCALL SDL_ToggleScreenKeyboard(void *unused); extern DECLSPEC int SDLCALL SDL_IsScreenKeyboardShown(void *unused); +enum +{ + SDL_ANDROID_MAX_GAMEPADS = 4, // Maximum amount of gamepads supported +}; + /* Remap SDL keycodes returned by gamepad buttons. Pass the SDLK_ constants, or 0 to leave old value. - On OUYA: O = A, U = X, Y = Y, A = B */ + On OUYA: O = A, U = X, Y = Y, A = B. + GamepadId is from 0 to 3, up to SDL_ANDROID_MAX_GAMEPADS */ +extern DECLSPEC void SDLCALL SDL_ANDROID_SetIndividualGamepadKeymap(int GamepadId, + int A, int B, int X, int Y, int L1, int R1, int L2, int R2, int LThumb, int RThumb, + int Start, int Select, int Up, int Down, int Left, int Right); + +/* Deprecated API, will change keymap for all gamepads */ extern DECLSPEC void SDLCALL SDL_ANDROID_SetGamepadKeymap(int A, int B, int X, int Y, int L1, int R1, int L2, int R2, int LThumb, int RThumb); /* Set SDL keycode for hardware Android key. Android keycodes are defined here: diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c index 6975fd54e..a33fc56f4 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c @@ -57,6 +57,8 @@ If you compile this code with SDL 1.3 or newer, or use in some other way, the li SDLKey SDL_android_keymap[KEYCODE_LAST+1]; +SDLKey SDL_android_gamepad_keymap[SDL_ANDROID_MAX_GAMEPADS][KEYCODE_LAST+1]; + static inline SDL_scancode TranslateKey(int scancode) { if ( scancode >= KEYCODE_LAST + 1 ) @@ -273,7 +275,7 @@ static void ClearOldTouchPointers( int action, int pointerId ) secondMousePointerId = -1; for( i = 0; i < MAX_MULTITOUCH_POINTERS; i++ ) { - if( touchPointers[i] |= TOUCH_PTR_MOUSE ) + if( touchPointers[i] != TOUCH_PTR_MOUSE ) { if( firstMousePointerId == -1 ) firstMousePointerId = i; @@ -960,7 +962,7 @@ void SDL_ANDROID_WarpMouse(int x, int y) }; JNIEXPORT jint JNICALL -JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeKey) ( JNIEnv* env, jobject thiz, jint key, jint action, jint unicode ) +JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeKey) ( JNIEnv* env, jobject thiz, jint key, jint action, jint unicode, jint gamepadId ) { SDL_scancode keycode; int unshifted = unicode; @@ -971,6 +973,8 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeKey) ( JNIEnv* env, jobject thiz, jint return 1; #endif + //__android_log_print(ANDROID_LOG_INFO, "libSDL", "%s: gamepadId %d", __FUNCTION__, gamepadId); + if( key == rightClickKey && rightClickMethod == RIGHT_CLICK_WITH_KEY ) { SDL_ANDROID_MainThreadPushMouseButton( action ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_RIGHT ); @@ -985,7 +989,7 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeKey) ( JNIEnv* env, jobject thiz, jint keycode = TranslateKey(key); //__android_log_print(ANDROID_LOG_INFO, "libSDL","nativeKey %d action %d translated %d unicode %d", key, action, keycode, unicode); - if( keycode == SDLK_NO_REMAP || (keycode == SDLK_UNKNOWN && unicode == 0) ) + if( (int)keycode == SDLK_NO_REMAP || (keycode == SDLK_UNKNOWN && unicode == 0) ) return 0; if( keycode == SDLK_UNKNOWN || unicode != unshifted ) @@ -1416,8 +1420,10 @@ JAVA_EXPORT_NAME(Settings_nativeSetAccelerometerSettings) ( JNIEnv* env, jobjec JNIEXPORT void JNICALL JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeGamepadAnalogJoystickInput) (JNIEnv* env, jobject thiz, jfloat stick1x, jfloat stick1y, jfloat stick2x, jfloat stick2y, jfloat ltrigger, jfloat rtrigger, - jfloat dpadx, jfloat dpady) + jfloat dpadx, jfloat dpady, jint gamepadId) { + //__android_log_print(ANDROID_LOG_INFO, "libSDL","%s: gamepadId %d", __FUNCTION__, gamepadId); + if( SDL_ANDROID_CurrentJoysticks[JOY_GAMEPAD1] ) { SDL_ANDROID_MainThreadPushJoystickAxis(JOY_GAMEPAD1, 0, NORMALIZE_FLOAT_32767(stick1x)); @@ -1449,43 +1455,43 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeGamepadAnalogJoystickInput) (JNIEnv* en // Translate to up/down/left/right if( dpadx < -0.5f ) { - if( !SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_14))] ) - SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_14)), 0 ); + if( !SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_14))] ) + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_14)), 0 ); } else { - if( SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_14))] ) - SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_14)), 0 ); + if( SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_14))] ) + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_14)), 0 ); } if( dpadx > 0.5f ) { - if( !SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_15))] ) - SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_15)), 0 ); + if( !SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_15))] ) + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_15)), 0 ); } else { - if( SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_15))] ) - SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_15)), 0 ); + if( SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_15))] ) + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_15)), 0 ); } if( dpady < -0.5f ) { - if( !SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_12))] ) - SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_12)), 0 ); + if( !SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_12))] ) + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_12)), 0 ); } else { - if( SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_12))] ) - SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_12)), 0 ); + if( SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_12))] ) + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_12)), 0 ); } if( dpady > 0.5f ) { - if( !SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_13))] ) - SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_13)), 0 ); + if( !SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_13))] ) + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_13)), 0 ); } else { - if( SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_13))] ) - SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_13)), 0 ); + if( SDL_GetKeyboardState(NULL)[SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_13))] ) + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_13)), 0 ); } } @@ -1680,30 +1686,74 @@ JAVA_EXPORT_NAME(Settings_nativeInitKeymap) ( JNIEnv* env, jobject thiz ) SDL_android_init_keymap(SDL_android_keymap); } +void SDL_ANDROID_SetIndividualGamepadKeymap(int GamepadId, + int A, int B, int X, int Y, int L1, int R1, int L2, int R2, int LThumb, int RThumb, + int Start, int Select, int Up, int Down, int Left, int Right) +{ + /* + Arguments are SDL keycodes. Use the SDLK_ constants. + Pass zero to leave a button mapping untouched. + + On OUYA: + O = A + U = X + Y = Y + A = B + C and Z do not exist, they also do not exist on any gamepad I've seen (PS3/XBox/SHIELD) + */ + + if( GamepadId < 0 || GamepadId >= SDL_ANDROID_MAX_GAMEPADS ) + return; + + if (A) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_A] = A; + if (A) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_3] = A; + if (B) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_B] = B; + if (B) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_2] = B; + if (X) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_X] = X; + if (X) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_4] = X; + if (Y) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_Y] = Y; + if (Y) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_1] = Y; + if (L1) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_L1] = L1; + if (L1) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_5] = L1; + if (R1) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_R1] = R1; + if (R1) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_6] = R1; + if (L2) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_L2] = L2; + if (L2) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_7] = L2; + if (R2) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_R2] = R2; + if (R2) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_8] = R2; + if (LThumb) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_THUMBL] = LThumb; + if (LThumb) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_11] = LThumb; + if (RThumb) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_THUMBR] = RThumb; + if (RThumb) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_12] = RThumb; + if (Start) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_START] = Start; + if (Start) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_9] = Start; + if (Select) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_SELECT] = Select; + if (Select) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_10] = Select; + if (Up) SDL_android_gamepad_keymap[GamepadId][KEYCODE_DPAD_UP] = Up; + if (Down) SDL_android_gamepad_keymap[GamepadId][KEYCODE_DPAD_DOWN] = Down; + if (Left) SDL_android_gamepad_keymap[GamepadId][KEYCODE_DPAD_LEFT] = Left; + if (Right) SDL_android_gamepad_keymap[GamepadId][KEYCODE_DPAD_RIGHT] = Right; + + if( GamepadId == 0 ) + { + int i; + for( i = KEYCODE_BUTTON_A; i <= KEYCODE_BUTTON_SELECT; i++ ) + { + SDL_android_keymap[i] = SDL_android_gamepad_keymap[GamepadId][i]; + } + for( i = KEYCODE_BUTTON_1; i <= KEYCODE_BUTTON_12; i++ ) + { + SDL_android_keymap[i] = SDL_android_gamepad_keymap[GamepadId][i]; + } + } +} + void SDL_ANDROID_SetGamepadKeymap(int A, int B, int X, int Y, int L1, int R1, int L2, int R2, int LThumb, int RThumb) { - /* - Arguments are SDL keycodes. Use the SDLK_ constants. - Pass zero to leave a button mapping untouched. - - On OUYA: O = A - U = X - Y = Y - A = B - C and Z do not exist, they also do not exist on any gamepad I've seen (PS3/XBox/SHIELD) - */ - if (A) SDL_android_keymap[KEYCODE_BUTTON_A] = A; - if (B) SDL_android_keymap[KEYCODE_BUTTON_B] = B; - //if (C) SDL_android_keymap[KEYCODE_BUTTON_C] = C; - if (X) SDL_android_keymap[KEYCODE_BUTTON_X] = X; - if (Y) SDL_android_keymap[KEYCODE_BUTTON_Y] = Y; - //if (Z) SDL_android_keymap[KEYCODE_BUTTON_Z] = Z; - if (L1) SDL_android_keymap[KEYCODE_BUTTON_L1] = L1; - if (R1) SDL_android_keymap[KEYCODE_BUTTON_R1] = R1; - if (L2) SDL_android_keymap[KEYCODE_BUTTON_L2] = L2; - if (R2) SDL_android_keymap[KEYCODE_BUTTON_R2] = R2; - if (LThumb) SDL_android_keymap[KEYCODE_BUTTON_THUMBL] = LThumb; - if (RThumb) SDL_android_keymap[KEYCODE_BUTTON_THUMBR] = RThumb; + for( int i = 0; i < SDL_ANDROID_MAX_GAMEPADS; i++ ) + { + SDL_ANDROID_SetIndividualGamepadKeymap(i, A, B, X, Y, L1, R1, L2, R2, LThumb, RThumb, 0, 0, 0, 0, 0, 0); + } } void SDL_ANDROID_SetAndroidKeycode(int Android_Key, int Sdl_Key) diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.h b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.h index 03217fb7e..b69a33425 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.h +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.h @@ -55,6 +55,7 @@ If you compile this code with SDL 1.3 or newer, or use in some other way, the li #include "../SDL_sysvideo.h" #include "SDL_androidvideo.h" +#include "SDL_screenkeyboard.h" #include "javakeycodes.h" /* JNI-C++ wrapper stuff */ @@ -211,53 +212,53 @@ extern int SDL_ANDROID_isTouchscreenKeyboardUsed; #endif // Gamepad keys -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_0 -#define SDL_ANDROID_GAMEPAD_KEYCODE_0 SDL_ANDROID_SCREENKB_KEYCODE_0 +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_0 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_0 SDL_ANDROID_SCREENKB_KEYCODE_0 #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_1 -#define SDL_ANDROID_GAMEPAD_KEYCODE_1 SDL_ANDROID_SCREENKB_KEYCODE_1 +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_1 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_1 SDL_ANDROID_SCREENKB_KEYCODE_1 #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_2 -#define SDL_ANDROID_GAMEPAD_KEYCODE_2 SDL_ANDROID_SCREENKB_KEYCODE_2 +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_2 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_2 SDL_ANDROID_SCREENKB_KEYCODE_2 #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_3 -#define SDL_ANDROID_GAMEPAD_KEYCODE_3 SDL_ANDROID_SCREENKB_KEYCODE_3 +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_3 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_3 SDL_ANDROID_SCREENKB_KEYCODE_3 #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_4 -#define SDL_ANDROID_GAMEPAD_KEYCODE_4 SDL_ANDROID_SCREENKB_KEYCODE_5 +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_4 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_4 SDL_ANDROID_SCREENKB_KEYCODE_5 #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_5 -#define SDL_ANDROID_GAMEPAD_KEYCODE_5 SDL_ANDROID_SCREENKB_KEYCODE_4 +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_5 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_5 SDL_ANDROID_SCREENKB_KEYCODE_4 #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_6 -#define SDL_ANDROID_GAMEPAD_KEYCODE_6 SDL_ANDROID_KEYCODE_0 +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_6 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_6 SDL_ANDROID_KEYCODE_0 #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_7 -#define SDL_ANDROID_GAMEPAD_KEYCODE_7 SDL_ANDROID_KEYCODE_6 +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_7 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_7 SDL_ANDROID_KEYCODE_6 #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_8 -#define SDL_ANDROID_GAMEPAD_KEYCODE_8 SPACE +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_8 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_8 SPACE #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_9 -#define SDL_ANDROID_GAMEPAD_KEYCODE_9 RETURN +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_9 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_9 RETURN #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_10 -#define SDL_ANDROID_GAMEPAD_KEYCODE_10 SDL_ANDROID_KEYCODE_5 +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_10 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_10 SDL_ANDROID_KEYCODE_5 #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_11 -#define SDL_ANDROID_GAMEPAD_KEYCODE_11 SDL_ANDROID_KEYCODE_4 +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_11 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_11 SDL_ANDROID_KEYCODE_4 #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_12 -#define SDL_ANDROID_GAMEPAD_KEYCODE_12 UP +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_12 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_12 UP #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_13 -#define SDL_ANDROID_GAMEPAD_KEYCODE_13 DOWN +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_13 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_13 DOWN #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_14 -#define SDL_ANDROID_GAMEPAD_KEYCODE_14 LEFT +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_14 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_14 LEFT #endif -#ifndef SDL_ANDROID_GAMEPAD_KEYCODE_15 -#define SDL_ANDROID_GAMEPAD_KEYCODE_15 RIGHT +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_15 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_15 RIGHT #endif // Queue events to main thread @@ -275,7 +276,8 @@ extern void SDL_ANDROID_MainThreadPushMouseWheel( int x, int y ); // SDL 1.3 onl extern void SDL_ANDROID_MainThreadPushAppActive(int active); // Internal input queue stuff -extern SDLKey SDL_android_keymap[]; +extern SDLKey SDL_android_keymap[KEYCODE_LAST+1]; +extern SDLKey SDL_android_gamepad_keymap[SDL_ANDROID_MAX_GAMEPADS][KEYCODE_LAST+1]; extern int SDL_android_KeysymFromUnicodeShiftNeeded(int unicode); extern unsigned char SDL_android_keysym_to_scancode[SDLK_LAST]; extern SDL_Joystick *SDL_ANDROID_CurrentJoysticks[]; diff --git a/project/jni/sdl-1.2/src/video/android/keymap.c b/project/jni/sdl-1.2/src/video/android/keymap.c index cd73c4d5c..37ee6f35d 100644 --- a/project/jni/sdl-1.2/src/video/android/keymap.c +++ b/project/jni/sdl-1.2/src/video/android/keymap.c @@ -132,6 +132,8 @@ void SDL_android_init_keymap(SDLKey *SDL_android_keymap) keymap[KEYCODE_PAGE_DOWN] = SDL_KEY(PAGEDOWN); keymap[KEYCODE_PICTSYMBOLS] = SDL_KEY(LSHIFT); keymap[KEYCODE_SWITCH_CHARSET] = SDL_KEY(LSHIFT); + // Configured with SDL_ANDROID_SetIndividualGamepadKeymap() + /* keymap[KEYCODE_BUTTON_A] = SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_0)); keymap[KEYCODE_BUTTON_B] = SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_1)); keymap[KEYCODE_BUTTON_C] = SDL_KEY(C); @@ -146,6 +148,7 @@ void SDL_android_init_keymap(SDLKey *SDL_android_keymap) keymap[KEYCODE_BUTTON_THUMBR] = SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_9)); keymap[KEYCODE_BUTTON_START] = SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_10)); keymap[KEYCODE_BUTTON_SELECT] = SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_11)); + */ keymap[KEYCODE_BUTTON_MODE] = SDL_KEY(SPACE); keymap[KEYCODE_ESCAPE] = SDL_KEY(ESCAPE); keymap[KEYCODE_FORWARD_DEL] = SDL_KEY(DELETE); @@ -225,6 +228,8 @@ void SDL_android_init_keymap(SDLKey *SDL_android_keymap) keymap[KEYCODE_PROG_BLUE] = SDL_KEY(F1); keymap[KEYCODE_APP_SWITCH] = SDL_KEY(F2); // Key layout of my cheap crappy Datex gamepad, USB identifier is "DragonRise Inc." + // Configured with SDL_ANDROID_SetIndividualGamepadKeymap() + /* keymap[KEYCODE_BUTTON_1] = SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_3)); keymap[KEYCODE_BUTTON_2] = SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_1)); keymap[KEYCODE_BUTTON_3] = SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_0)); @@ -237,6 +242,7 @@ void SDL_android_init_keymap(SDLKey *SDL_android_keymap) keymap[KEYCODE_BUTTON_10] = SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_11)); keymap[KEYCODE_BUTTON_11] = SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_8)); keymap[KEYCODE_BUTTON_12] = SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_KEYCODE_9)); + */ keymap[KEYCODE_BUTTON_13] = SDL_KEY(M); keymap[KEYCODE_BUTTON_14] = SDL_KEY(N); keymap[KEYCODE_BUTTON_15] = SDL_KEY(O); @@ -252,6 +258,92 @@ void SDL_android_init_keymap(SDLKey *SDL_android_keymap) keymap[KEYCODE_MOUSE_WHEEL_DOWN] = SDL_KEY(MOUSE_WHEEL_DOWN); keymap[KEYCODE_MOUSE_X1] = SDL_KEY(MOUSE_X1); keymap[KEYCODE_MOUSE_X2] = SDL_KEY(MOUSE_X2); + + for( int gamepadId = 0; gamepadId < SDL_ANDROID_MAX_GAMEPADS; gamepadId++ ) + { + for( int i = 0; i < KEYCODE_LAST+1; i++ ) + { + SDL_android_gamepad_keymap[gamepadId][i] = SDL_android_keymap[i]; + } + } + + SDL_ANDROID_SetIndividualGamepadKeymap( 0, + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_0)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_1)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_2)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_3)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_4)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_5)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_6)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_7)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_8)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_9)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_10)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_11)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_12)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_13)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_14)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_15)) + ); + +/* + SDL_ANDROID_SetIndividualGamepadKeymap( 1, + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_0)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_1)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_2)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_3)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_4)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_5)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_6)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_7)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_8)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_9)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_10)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_11)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_12)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_13)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_14)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_15)) + ); + + SDL_ANDROID_SetIndividualGamepadKeymap( 2, + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_0)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_1)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_2)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_3)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_4)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_5)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_6)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_7)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_8)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_9)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_10)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_11)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_12)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_13)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_14)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_15)) + ); + + SDL_ANDROID_SetIndividualGamepadKeymap( 3, + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_0)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_1)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_2)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_3)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_4)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_5)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_6)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_7)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_8)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_9)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_10)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_11)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_12)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_13)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_14)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_15)) + ); +*/ } unsigned char SDL_android_keysym_to_scancode[SDLK_LAST] = {