Skip to content

Commit

Permalink
Fixed bug 4702 - Android back button does not send SDL_KEYDOWN event
Browse files Browse the repository at this point in the history
fallback when event.getSource() is SOURCE_UNKNOWN
  • Loading branch information
1bsyl committed Jul 3, 2019
1 parent 3fc447d commit f994da0
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
Expand Up @@ -1799,27 +1799,36 @@ else if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT || req
// Key events
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {

int deviceId = event.getDeviceId();
int source = event.getSource();

// Dispatch the different events depending on where they come from
// Some SOURCE_JOYSTICK, SOURCE_DPAD or SOURCE_GAMEPAD are also SOURCE_KEYBOARD
// So, we try to process them as JOYSTICK/DPAD/GAMEPAD events first, if that fails we try them as KEYBOARD
//
// Furthermore, it's possible a game controller has SOURCE_KEYBOARD and
// SOURCE_JOYSTICK, while its key events arrive from the keyboard source
// So, retrieve the device itself and check all of its sources
if (SDLControllerManager.isDeviceSDLJoystick(event.getDeviceId())) {
if (SDLControllerManager.isDeviceSDLJoystick(deviceId)) {
// Note that we process events with specific key codes here
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (SDLControllerManager.onNativePadDown(event.getDeviceId(), keyCode) == 0) {
if (SDLControllerManager.onNativePadDown(deviceId, keyCode) == 0) {
return true;
}
} else if (event.getAction() == KeyEvent.ACTION_UP) {
if (SDLControllerManager.onNativePadUp(event.getDeviceId(), keyCode) == 0) {
if (SDLControllerManager.onNativePadUp(deviceId, keyCode) == 0) {
return true;
}
}
}

if ((event.getSource() & InputDevice.SOURCE_KEYBOARD) != 0) {
if (source == InputDevice.SOURCE_UNKNOWN) {
InputDevice device = InputDevice.getDevice(deviceId);
source = device.getSources();
}

if ((source & InputDevice.SOURCE_KEYBOARD) != 0) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
//Log.v("SDL", "key down: " + keyCode);
if (SDLActivity.isTextInputEvent(event)) {
Expand All @@ -1835,7 +1844,7 @@ else if (event.getAction() == KeyEvent.ACTION_UP) {
}
}

if ((event.getSource() & InputDevice.SOURCE_MOUSE) != 0) {
if ((source & InputDevice.SOURCE_MOUSE) != 0) {
// on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses
// they are ignored here because sending them as mouse input to SDL is messy
if ((keyCode == KeyEvent.KEYCODE_BACK) || (keyCode == KeyEvent.KEYCODE_FORWARD)) {
Expand Down

0 comments on commit f994da0

Please sign in to comment.