SDL: unfinished support for multiple gamepads

This commit is contained in:
Sergii Pylypenko
2017-11-03 23:49:24 +02:00
parent 9c86e109dd
commit b742ebaf72
8 changed files with 319 additions and 92 deletions

View File

@@ -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

View File

@@ -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 );
}

View File

@@ -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

View File

@@ -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"

View File

@@ -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:

View File

@@ -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)

View File

@@ -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[];

View File

@@ -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] = {