From b6228a10369148cffd58ec3f0fb8e9fe4050cd69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 28 Aug 2021 15:38:03 +0200 Subject: [PATCH] Add additional autoconf layout for xbox pads on Android. Revert the normal pad layout. --- Common/Input/InputState.cpp | 8 ++--- Common/Input/InputState.h | 8 ++--- Common/UI/Root.cpp | 8 ++--- Core/KeyMap.cpp | 23 +++++++++----- Core/KeyMap.h | 4 ++- Core/KeyMapDefaults.cpp | 61 ++++++++++++++++++++++++++++--------- Core/KeyMapDefaults.h | 8 ++++- Windows/XinputDevice.cpp | 6 ++-- 8 files changed, 87 insertions(+), 39 deletions(-) diff --git a/Common/Input/InputState.cpp b/Common/Input/InputState.cpp index 66922ce77f..35a8f8029a 100644 --- a/Common/Input/InputState.cpp +++ b/Common/Input/InputState.cpp @@ -17,10 +17,10 @@ const char *GetDeviceName(int deviceId) { case DEVICE_ID_PAD_7: return "pad8"; case DEVICE_ID_PAD_8: return "pad9"; case DEVICE_ID_PAD_9: return "pad10"; - case DEVICE_ID_X360_0: return "x360"; - case DEVICE_ID_X360_1: return "x360_2"; - case DEVICE_ID_X360_2: return "x360_3"; - case DEVICE_ID_X360_3: return "x360_4"; + case DEVICE_ID_XINPUT_0: return "x360"; // keeping these strings for backward compat + case DEVICE_ID_XINPUT_1: return "x360_2"; + case DEVICE_ID_XINPUT_2: return "x360_3"; + case DEVICE_ID_XINPUT_3: return "x360_4"; case DEVICE_ID_ACCELEROMETER: return "accelerometer"; case DEVICE_ID_MOUSE: return "mouse"; default: diff --git a/Common/Input/InputState.h b/Common/Input/InputState.h index 3c917af1b0..709684a298 100644 --- a/Common/Input/InputState.h +++ b/Common/Input/InputState.h @@ -28,10 +28,10 @@ enum { DEVICE_ID_PAD_7 = 17, DEVICE_ID_PAD_8 = 18, DEVICE_ID_PAD_9 = 19, - DEVICE_ID_X360_0 = 20, // XInput joypads - DEVICE_ID_X360_1 = 21, - DEVICE_ID_X360_2 = 22, - DEVICE_ID_X360_3 = 23, + DEVICE_ID_XINPUT_0 = 20, // XInput joypads + DEVICE_ID_XINPUT_1 = 21, + DEVICE_ID_XINPUT_2 = 22, + DEVICE_ID_XINPUT_3 = 23, DEVICE_ID_ACCELEROMETER = 30, }; diff --git a/Common/UI/Root.cpp b/Common/UI/Root.cpp index ad4b9c2c4c..0e61243ff6 100644 --- a/Common/UI/Root.cpp +++ b/Common/UI/Root.cpp @@ -341,10 +341,10 @@ bool AxisEvent(const AxisInput &axis, ViewGroup *root) { case DEVICE_ID_PAD_1: case DEVICE_ID_PAD_2: case DEVICE_ID_PAD_3: - case DEVICE_ID_X360_0: - case DEVICE_ID_X360_1: - case DEVICE_ID_X360_2: - case DEVICE_ID_X360_3: + case DEVICE_ID_XINPUT_0: + case DEVICE_ID_XINPUT_1: + case DEVICE_ID_XINPUT_2: + case DEVICE_ID_XINPUT_3: { PrevState &old = state[stateKey]; DirState dir = DirState::NONE; diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index b192fc2bdb..06d5e037d8 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -43,7 +43,7 @@ namespace KeyMap { KeyDef AxisDef(int deviceId, int axisId, int direction); KeyMapping g_controllerMap; -int g_controllerMapGeneration = 0; +int g_controllerMapGeneration = 0; // Just used to check if we need to update the Windows menu or not. std::set g_seenPads; std::set g_seenDeviceIds; @@ -620,12 +620,11 @@ void SetAxisMapping(int btn, int deviceId, int axisId, int direction, bool repla SetKeyMapping(btn, KeyDef(deviceId, key), replace); } -// Note that it's easy to add other defaults if desired. void RestoreDefault() { g_controllerMap.clear(); #if PPSSPP_PLATFORM(WINDOWS) SetDefaultKeyMap(DEFAULT_MAPPING_KEYBOARD, true); - SetDefaultKeyMap(DEFAULT_MAPPING_X360, false); + SetDefaultKeyMap(DEFAULT_MAPPING_XINPUT, false); SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false); #elif PPSSPP_PLATFORM(ANDROID) // Autodetect a few common (and less common) devices @@ -641,7 +640,7 @@ void RestoreDefault() { SetDefaultKeyMap(DEFAULT_MAPPING_MOQI_I7S, false); } else { INFO_LOG(SYSTEM, "Default pad map"); - SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false); + SetDefaultKeyMap(DEFAULT_MAPPING_ANDROID_PAD, false); } #else SetDefaultKeyMap(DEFAULT_MAPPING_KEYBOARD, true); @@ -735,18 +734,26 @@ void AutoConfForPad(const std::string &name) { g_controllerMap.clear(); INFO_LOG(SYSTEM, "Autoconfiguring pad for '%s'", name.c_str()); - if (name == "Xbox 360 Pad") { - SetDefaultKeyMap(DEFAULT_MAPPING_X360, false); + +#if PPSSPP_PLATFORM(ANDROID) + if (name.find("Xbox") != std::string::npos) { + SetDefaultKeyMap(DEFAULT_MAPPING_ANDROID_XBOX, false); + } else { + SetDefaultKeyMap(DEFAULT_MAPPING_ANDROID_PAD, false); + } +#else + // TODO: Should actually check for XInput? + if (name.find("Xbox") != std::string::npos) { + SetDefaultKeyMap(DEFAULT_MAPPING_XINPUT, false); } else { SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false); } +#endif -#ifndef MOBILE_DEVICE // Add a couple of convenient keyboard mappings by default, too. g_controllerMap[VIRTKEY_PAUSE].push_back(KeyDef(DEVICE_ID_KEYBOARD, NKCODE_ESCAPE)); g_controllerMap[VIRTKEY_FASTFORWARD].push_back(KeyDef(DEVICE_ID_KEYBOARD, NKCODE_TAB)); g_controllerMapGeneration++; -#endif } const std::set &GetSeenPads() { diff --git a/Core/KeyMap.h b/Core/KeyMap.h index b57d505eec..16f4b5d37c 100644 --- a/Core/KeyMap.h +++ b/Core/KeyMap.h @@ -21,9 +21,11 @@ #include #include #include + #include "Common/Input/InputState.h" // KeyDef #include "Common/Input/KeyCodes.h" // keyboard keys -#include "../Core/HLE/sceCtrl.h" // psp keys +#include "Core/HLE/sceCtrl.h" // psp keys +#include "Core/KeyMapDefaults.h" #define KEYMAP_ERROR_KEY_ALREADY_USED -1 #define KEYMAP_ERROR_UNKNOWN_KEY 0 diff --git a/Core/KeyMapDefaults.cpp b/Core/KeyMapDefaults.cpp index 7e69932b62..43bcfbadc3 100644 --- a/Core/KeyMapDefaults.cpp +++ b/Core/KeyMapDefaults.cpp @@ -22,7 +22,7 @@ struct DefMappingStruct { int direction; }; -const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { +static const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { {CTRL_SQUARE, NKCODE_A}, {CTRL_TRIANGLE, NKCODE_S}, {CTRL_CIRCLE, NKCODE_X}, @@ -52,7 +52,7 @@ const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, }; -const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { +static const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { {CTRL_SQUARE, NKCODE_Q}, {CTRL_TRIANGLE, NKCODE_S}, {CTRL_CIRCLE, NKCODE_X}, @@ -82,7 +82,7 @@ const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, }; -const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { +static const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { {CTRL_SQUARE, NKCODE_A}, {CTRL_TRIANGLE, NKCODE_S}, {CTRL_CIRCLE, NKCODE_X}, @@ -112,7 +112,7 @@ const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, }; -const DefMappingStruct default360KeyMap[] = { +static const DefMappingStruct defaultXInputKeyMap[] = { {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, -1}, @@ -135,7 +135,7 @@ const DefMappingStruct default360KeyMap[] = { {VIRTKEY_PAUSE, NKCODE_HOME}, }; -const DefMappingStruct defaultShieldKeyMap[] = { +static const DefMappingStruct defaultShieldKeyMap[] = { {CTRL_CROSS, NKCODE_BUTTON_A}, {CTRL_CIRCLE ,NKCODE_BUTTON_B}, {CTRL_SQUARE ,NKCODE_BUTTON_X}, @@ -157,7 +157,7 @@ const DefMappingStruct defaultShieldKeyMap[] = { {VIRTKEY_PAUSE, NKCODE_BACK }, }; -const DefMappingStruct defaultMOQI7SKeyMap[] = { +static const DefMappingStruct defaultMOQI7SKeyMap[] = { {CTRL_CROSS, NKCODE_BUTTON_A}, {CTRL_CIRCLE, NKCODE_BUTTON_B}, {CTRL_SQUARE, NKCODE_BUTTON_X}, @@ -178,8 +178,7 @@ const DefMappingStruct defaultMOQI7SKeyMap[] = { {VIRTKEY_PAUSE, NKCODE_BACK }, }; -const DefMappingStruct defaultPadMap[] = { -#if PPSSPP_PLATFORM(ANDROID) +static const DefMappingStruct defaultAndroidXboxControllerMap[] = { {CTRL_CROSS , NKCODE_BUTTON_A}, {CTRL_CIRCLE , NKCODE_BUTTON_B}, {CTRL_SQUARE , NKCODE_BUTTON_X}, @@ -204,7 +203,36 @@ const DefMappingStruct defaultPadMap[] = { {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, -#else +}; + +static const DefMappingStruct defaultPadMapAndroid[] = { + {CTRL_CROSS , NKCODE_BUTTON_A}, + {CTRL_CIRCLE , NKCODE_BUTTON_B}, + {CTRL_SQUARE , NKCODE_BUTTON_X}, + {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, + // The hat for DPAD is standard for bluetooth pads, which is the most likely pads on Android I think. + {CTRL_LEFT , JOYSTICK_AXIS_HAT_X, -1}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_RIGHT , JOYSTICK_AXIS_HAT_X, +1}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, + {CTRL_UP , JOYSTICK_AXIS_HAT_Y, -1}, + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_DOWN , JOYSTICK_AXIS_HAT_Y, +1}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_START , NKCODE_BUTTON_START}, + {CTRL_SELECT , NKCODE_BUTTON_SELECT}, + {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, + {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_R2}, + {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, + {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, + {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, + {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, + {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, +}; + +static const DefMappingStruct defaultPadMap[] = { {CTRL_CROSS , NKCODE_BUTTON_2}, {CTRL_CIRCLE , NKCODE_BUTTON_3}, {CTRL_SQUARE , NKCODE_BUTTON_4}, @@ -222,10 +250,9 @@ const DefMappingStruct defaultPadMap[] = { {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, -#endif }; -const DefMappingStruct defaultOuyaMap[] = { +static const DefMappingStruct defaultOuyaMap[] = { {CTRL_CROSS , NKCODE_BUTTON_A}, {CTRL_CIRCLE , NKCODE_BUTTON_B}, {CTRL_SQUARE , NKCODE_BUTTON_X}, @@ -246,7 +273,7 @@ const DefMappingStruct defaultOuyaMap[] = { {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, }; -const DefMappingStruct defaultXperiaPlay[] = { +static const DefMappingStruct defaultXperiaPlay[] = { {CTRL_CROSS , NKCODE_BUTTON_CROSS}, {CTRL_CIRCLE , NKCODE_BUTTON_CIRCLE}, {CTRL_SQUARE , NKCODE_BUTTON_X}, @@ -315,8 +342,8 @@ void SetDefaultKeyMap(DefaultMaps dmap, bool replace) { } } break; - case DEFAULT_MAPPING_X360: - SetDefaultKeyMap(DEVICE_ID_X360_0, default360KeyMap, ARRAY_SIZE(default360KeyMap), replace); + case DEFAULT_MAPPING_XINPUT: + SetDefaultKeyMap(DEVICE_ID_XINPUT_0, defaultXInputKeyMap, ARRAY_SIZE(defaultXInputKeyMap), replace); break; case DEFAULT_MAPPING_SHIELD: SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultShieldKeyMap, ARRAY_SIZE(defaultShieldKeyMap), replace); @@ -327,12 +354,18 @@ void SetDefaultKeyMap(DefaultMaps dmap, bool replace) { case DEFAULT_MAPPING_PAD: SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultPadMap, ARRAY_SIZE(defaultPadMap), replace); break; + case DEFAULT_MAPPING_ANDROID_PAD: + SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultPadMapAndroid, ARRAY_SIZE(defaultPadMapAndroid), replace); + break; case DEFAULT_MAPPING_OUYA: SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultOuyaMap, ARRAY_SIZE(defaultOuyaMap), replace); break; case DEFAULT_MAPPING_XPERIA_PLAY: SetDefaultKeyMap(DEVICE_ID_DEFAULT, defaultXperiaPlay, ARRAY_SIZE(defaultXperiaPlay), replace); break; + case DEFAULT_MAPPING_ANDROID_XBOX: + SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultAndroidXboxControllerMap, ARRAY_SIZE(defaultAndroidXboxControllerMap), replace); + break; } UpdateNativeMenuKeys(); diff --git a/Core/KeyMapDefaults.h b/Core/KeyMapDefaults.h index a79cbad857..ba9c31d022 100644 --- a/Core/KeyMapDefaults.h +++ b/Core/KeyMapDefaults.h @@ -1,9 +1,13 @@ #pragma once +namespace KeyMap { + enum DefaultMaps { DEFAULT_MAPPING_KEYBOARD, DEFAULT_MAPPING_PAD, - DEFAULT_MAPPING_X360, + DEFAULT_MAPPING_ANDROID_PAD, + DEFAULT_MAPPING_XINPUT, + DEFAULT_MAPPING_ANDROID_XBOX, // XBox controller or similar on Android DEFAULT_MAPPING_SHIELD, DEFAULT_MAPPING_OUYA, DEFAULT_MAPPING_XPERIA_PLAY, @@ -11,3 +15,5 @@ enum DefaultMaps { }; void SetDefaultKeyMap(DefaultMaps dmap, bool replace); + +} diff --git a/Windows/XinputDevice.cpp b/Windows/XinputDevice.cpp index 097fe23ecb..6d70816748 100644 --- a/Windows/XinputDevice.cpp +++ b/Windows/XinputDevice.cpp @@ -196,7 +196,7 @@ void XinputDevice::UpdatePad(int pad, const XINPUT_STATE &state, XINPUT_VIBRATIO ApplyVibration(pad, vibration); AxisInput axis; - axis.deviceId = DEVICE_ID_X360_0 + pad; + axis.deviceId = DEVICE_ID_XINPUT_0 + pad; auto sendAxis = [&](AndroidJoystickAxis axisId, float value) { axis.axisId = axisId; axis.value = value; @@ -230,14 +230,14 @@ void XinputDevice::ApplyButtons(int pad, const XINPUT_STATE &state) { for (int i = 0; i < xinput_ctrl_map_size; i++) { if (downMask & xinput_ctrl_map[i].from) { KeyInput key; - key.deviceId = DEVICE_ID_X360_0 + pad; + key.deviceId = DEVICE_ID_XINPUT_0 + pad; key.flags = KEY_DOWN; key.keyCode = xinput_ctrl_map[i].to; NativeKey(key); } if (upMask & xinput_ctrl_map[i].from) { KeyInput key; - key.deviceId = DEVICE_ID_X360_0 + pad; + key.deviceId = DEVICE_ID_XINPUT_0 + pad; key.flags = KEY_UP; key.keyCode = xinput_ctrl_map[i].to; NativeKey(key);