Skip to content
Permalink
Browse files

[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.
  • Loading branch information
gabomdq committed Nov 19, 2013
1 parent 48954ba commit fdfea4ad1f7201d74b49f53f79e5ed8326a4bec2
@@ -245,8 +245,8 @@ boolean sendCommand(int command, Object data) {
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 @@ public void onDraw(Canvas canvas) {}
@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;
}
}

@@ -148,19 +148,19 @@ void Java_org_libsdl_app_SDLActivity_onNativeResize(
}

// 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 */
@@ -128,7 +128,6 @@ keycode_to_SDL(int keycode)
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 @@ Android_OnPadDown(int padId, int keycode)
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 @@ Android_OnPadUp(int padId, int keycode)
int button = keycode_to_SDL(keycode);
if (button >= 0) {
SDL_PrivateJoystickButton(SYS_Joysticks[padId], button, SDL_RELEASED);
return 0;
}

return 0;
return -1;
}

int

0 comments on commit fdfea4a

Please sign in to comment.