mirror of https://github.com/libsdl-org/SDL
Fixed game controller buttons being unresponsive when the on-screen keyboard is up
Also mapped controller A and B buttons to interact with messagebox dialogs
This commit is contained in:
parent
914a65e098
commit
893c87b27b
|
@ -1232,8 +1232,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method is called by SDLControllerManager's API 26 Generic Motion Handler.
|
// This method is called by SDLControllerManager's API 26 Generic Motion Handler.
|
||||||
public static View getContentView()
|
public static View getContentView() {
|
||||||
{
|
|
||||||
return mLayout;
|
return mLayout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1304,6 +1303,77 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||||
return event.isPrintingKey() || event.getKeyCode() == KeyEvent.KEYCODE_SPACE;
|
return event.isPrintingKey() || event.getKeyCode() == KeyEvent.KEYCODE_SPACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean handleKeyEvent(View v, int keyCode, KeyEvent event, InputConnection ic) {
|
||||||
|
int deviceId = event.getDeviceId();
|
||||||
|
int source = event.getSource();
|
||||||
|
|
||||||
|
if (source == InputDevice.SOURCE_UNKNOWN) {
|
||||||
|
InputDevice device = InputDevice.getDevice(deviceId);
|
||||||
|
if (device != null) {
|
||||||
|
source = device.getSources();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||||
|
// Log.v("SDL", "key down: " + keyCode + ", deviceId = " + deviceId + ", source = " + source);
|
||||||
|
// } else if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||||
|
// Log.v("SDL", "key up: " + keyCode + ", deviceId = " + deviceId + ", source = " + source);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// 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(deviceId)) {
|
||||||
|
// Note that we process events with specific key codes here
|
||||||
|
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||||
|
if (SDLControllerManager.onNativePadDown(deviceId, keyCode) == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||||
|
if (SDLControllerManager.onNativePadUp(deviceId, keyCode) == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((source & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD) {
|
||||||
|
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||||
|
if (isTextInputEvent(event)) {
|
||||||
|
if (ic != null) {
|
||||||
|
ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
||||||
|
} else {
|
||||||
|
SDLInputConnection.nativeCommitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onNativeKeyDown(keyCode);
|
||||||
|
return true;
|
||||||
|
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||||
|
onNativeKeyUp(keyCode);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((source & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) {
|
||||||
|
// 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)) {
|
||||||
|
switch (event.getAction()) {
|
||||||
|
case KeyEvent.ACTION_DOWN:
|
||||||
|
case KeyEvent.ACTION_UP:
|
||||||
|
// mark the event as handled or it will be handled by system
|
||||||
|
// handling KEYCODE_BACK by system will call onBackPressed()
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is called by SDL using JNI.
|
* This method is called by SDL using JNI.
|
||||||
*/
|
*/
|
||||||
|
@ -1486,9 +1556,11 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||||
// see SDL_messagebox.h
|
// see SDL_messagebox.h
|
||||||
if ((buttonFlags[i] & 0x00000001) != 0) {
|
if ((buttonFlags[i] & 0x00000001) != 0) {
|
||||||
mapping.put(KeyEvent.KEYCODE_ENTER, button);
|
mapping.put(KeyEvent.KEYCODE_ENTER, button);
|
||||||
|
mapping.put(KeyEvent.KEYCODE_BUTTON_A, button);
|
||||||
}
|
}
|
||||||
if ((buttonFlags[i] & 0x00000002) != 0) {
|
if ((buttonFlags[i] & 0x00000002) != 0) {
|
||||||
mapping.put(KeyEvent.KEYCODE_ESCAPE, button); /* API 11 */
|
mapping.put(KeyEvent.KEYCODE_ESCAPE, button); /* API 11 */
|
||||||
|
mapping.put(KeyEvent.KEYCODE_BUTTON_B, button);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
button.setText(buttonTexts[i]);
|
button.setText(buttonTexts[i]);
|
||||||
|
@ -1841,21 +1913,7 @@ class DummyEdit extends View implements View.OnKeyListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
||||||
/*
|
return SDLActivity.handleKeyEvent(v, keyCode, event, ic);
|
||||||
* This handles the hardware keyboard input
|
|
||||||
*/
|
|
||||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
|
||||||
if (SDLActivity.isTextInputEvent(event)) {
|
|
||||||
ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
SDLActivity.onNativeKeyDown(keyCode);
|
|
||||||
return true;
|
|
||||||
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
|
||||||
SDLActivity.onNativeKeyUp(keyCode);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -189,72 +189,8 @@ public class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
||||||
|
|
||||||
// Key events
|
// Key events
|
||||||
@Override
|
@Override
|
||||||
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
||||||
|
return SDLActivity.handleKeyEvent(v, keyCode, event, null);
|
||||||
int deviceId = event.getDeviceId();
|
|
||||||
int source = event.getSource();
|
|
||||||
|
|
||||||
if (source == InputDevice.SOURCE_UNKNOWN) {
|
|
||||||
InputDevice device = InputDevice.getDevice(deviceId);
|
|
||||||
if (device != null) {
|
|
||||||
source = device.getSources();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
|
||||||
// Log.v("SDL", "key down: " + keyCode + ", deviceId = " + deviceId + ", source = " + source);
|
|
||||||
// } else if (event.getAction() == KeyEvent.ACTION_UP) {
|
|
||||||
// Log.v("SDL", "key up: " + keyCode + ", deviceId = " + deviceId + ", source = " + source);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// 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(deviceId)) {
|
|
||||||
// Note that we process events with specific key codes here
|
|
||||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
|
||||||
if (SDLControllerManager.onNativePadDown(deviceId, keyCode) == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
|
||||||
if (SDLControllerManager.onNativePadUp(deviceId, keyCode) == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((source & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD) {
|
|
||||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
|
||||||
if (SDLActivity.isTextInputEvent(event)) {
|
|
||||||
SDLInputConnection.nativeCommitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
|
||||||
}
|
|
||||||
SDLActivity.onNativeKeyDown(keyCode);
|
|
||||||
return true;
|
|
||||||
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
|
||||||
SDLActivity.onNativeKeyUp(keyCode);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((source & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) {
|
|
||||||
// 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)) {
|
|
||||||
switch (event.getAction()) {
|
|
||||||
case KeyEvent.ACTION_DOWN:
|
|
||||||
case KeyEvent.ACTION_UP:
|
|
||||||
// mark the event as handled or it will be handled by system
|
|
||||||
// handling KEYCODE_BACK by system will call onBackPressed()
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Touch events
|
// Touch events
|
||||||
|
@ -466,4 +402,4 @@ public class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue