mirror of https://github.com/encounter/SDL.git
[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:
parent
48954ba194
commit
fdfea4ad1f
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue