[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.
This commit is contained in:
Gabriel Jacobo 2013-11-19 10:00:05 -03:00
parent 48954ba194
commit fdfea4ad1f
3 changed files with 18 additions and 14 deletions

View File

@ -245,8 +245,8 @@ public class SDLActivity extends Activity {
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 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
@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;
}
}

View File

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

View File

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