Skip to content

Commit

Permalink
[Android] Try to improve handling of DPAD|GAMEPAD + KEYBOARD devices
Browse files Browse the repository at this point in the history
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 fdfea4a
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 14 deletions.
17 changes: 10 additions & 7 deletions android-project/src/org/libsdl/app/SDLActivity.java
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
}

Expand Down
8 changes: 4 additions & 4 deletions src/core/android/SDL_android.c
Expand Up @@ -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 */
Expand Down
7 changes: 4 additions & 3 deletions src/joystick/android/SDL_sysjoystick.c
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit fdfea4a

Please sign in to comment.