Add experimental support for Xbox 360 controller dpad events on devices without proper mappings

This commit is contained in:
Cameron Gutman 2014-10-14 22:55:22 -07:00
parent 8530451c8b
commit 57c3d8af8b

View File

@ -102,6 +102,7 @@ public class ControllerHandler {
mapping.leftTriggerAxis = MotionEvent.AXIS_Z; mapping.leftTriggerAxis = MotionEvent.AXIS_Z;
mapping.rightTriggerAxis = MotionEvent.AXIS_RZ; mapping.rightTriggerAxis = MotionEvent.AXIS_RZ;
mapping.triggersIdleNegative = true; mapping.triggersIdleNegative = true;
mapping.isXboxController = true;
} }
else { else {
// DS4 controller uses RX and RY for triggers // DS4 controller uses RX and RY for triggers
@ -227,9 +228,9 @@ public class ControllerHandler {
leftStickX, leftStickY, rightStickX, rightStickY); leftStickX, leftStickY, rightStickX, rightStickY);
} }
private static int handleRemapping(ControllerMapping mapping, int keyCode) { private static int handleRemapping(ControllerMapping mapping, KeyEvent event) {
if (mapping.isDualShock4) { if (mapping.isDualShock4) {
switch (keyCode) { switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_BUTTON_Y: case KeyEvent.KEYCODE_BUTTON_Y:
return KeyEvent.KEYCODE_BUTTON_L1; return KeyEvent.KEYCODE_BUTTON_L1;
@ -268,7 +269,7 @@ public class ControllerHandler {
} }
if (mapping.hatXAxis != -1 && mapping.hatYAxis != -1) { if (mapping.hatXAxis != -1 && mapping.hatYAxis != -1) {
switch (keyCode) { switch (event.getKeyCode()) {
// These are duplicate dpad events for hat input // These are duplicate dpad events for hat input
case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_RIGHT: case KeyEvent.KEYCODE_DPAD_RIGHT:
@ -278,8 +279,26 @@ public class ControllerHandler {
return 0; return 0;
} }
} }
else if (mapping.hatXAxis == -1 &&
mapping.hatYAxis == -1 &&
mapping.isXboxController &&
event.getKeyCode() == KeyEvent.KEYCODE_UNKNOWN) {
// If there's not a proper Xbox controller mapping, we'll translate the raw d-pad
// scan codes into proper key codes
switch (event.getScanCode())
{
case 704:
return KeyEvent.KEYCODE_DPAD_LEFT;
case 705:
return KeyEvent.KEYCODE_DPAD_RIGHT;
case 706:
return KeyEvent.KEYCODE_DPAD_UP;
case 707:
return KeyEvent.KEYCODE_DPAD_DOWN;
}
}
return keyCode; return event.getKeyCode();
} }
private Vector2d handleDeadZone(float x, float y, float deadzoneRadius) { private Vector2d handleDeadZone(float x, float y, float deadzoneRadius) {
@ -385,7 +404,7 @@ public class ControllerHandler {
return false; return false;
} }
keyCode = handleRemapping(mapping, keyCode); keyCode = handleRemapping(mapping, event);
if (keyCode == 0) { if (keyCode == 0) {
return true; return true;
} }
@ -508,7 +527,7 @@ public class ControllerHandler {
return false; return false;
} }
keyCode = handleRemapping(mapping, keyCode); keyCode = handleRemapping(mapping, event);
if (keyCode == 0) { if (keyCode == 0) {
return true; return true;
} }
@ -618,5 +637,6 @@ public class ControllerHandler {
public float hatYDeadzone; public float hatYDeadzone;
public boolean isDualShock4; public boolean isDualShock4;
public boolean isXboxController;
} }
} }