From 8cab56c948ad4d341e4e019b434512df1058de42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 28 Aug 2021 15:12:10 +0200 Subject: [PATCH] Move keymap defaults to a separate file. Not exactly a clean separation though. --- CMakeLists.txt | 2 + Core/ControlMapper.cpp | 3 + Core/Core.vcxproj | 2 + Core/Core.vcxproj.filters | 6 + Core/KeyMap.cpp | 325 +------------------------- Core/KeyMap.h | 11 +- Core/KeyMapDefaults.cpp | 341 ++++++++++++++++++++++++++++ Core/KeyMapDefaults.h | 13 ++ UWP/CoreUWP/CoreUWP.vcxproj | 2 + UWP/CoreUWP/CoreUWP.vcxproj.filters | 2 + android/jni/Android.mk | 1 + libretro/Makefile.common | 1 + 12 files changed, 376 insertions(+), 333 deletions(-) create mode 100644 Core/KeyMapDefaults.cpp create mode 100644 Core/KeyMapDefaults.h diff --git a/CMakeLists.txt b/CMakeLists.txt index bb83a5b1b1..4f9a8ce17b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1604,6 +1604,8 @@ add_library(${CoreLibName} ${CoreLinkType} Core/Instance.h Core/KeyMap.cpp Core/KeyMap.h + Core/KeyMapDefaults.cpp + Core/KeyMapDefaults.h Core/ThreadEventQueue.h Core/WebServer.cpp Core/WebServer.h diff --git a/Core/ControlMapper.cpp b/Core/ControlMapper.cpp index de71298e87..c0ff50c76a 100644 --- a/Core/ControlMapper.cpp +++ b/Core/ControlMapper.cpp @@ -2,6 +2,7 @@ #include "Common/Math/math_util.h" #include "Common/TimeUtil.h" +#include "Common/Log.h" #include "Core/KeyMap.h" #include "Core/ControlMapper.h" @@ -79,6 +80,8 @@ bool ControlMapper::Key(const KeyInput &key, bool *pauseTrigger) { pspKey(pspKeys[i], key.flags); } + INFO_LOG(SYSTEM, "Key: %d DeviceId: %d", key.keyCode, key.deviceId); + if (!pspKeys.size() || key.deviceId == DEVICE_ID_DEFAULT) { if ((key.flags & KEY_DOWN) && key.keyCode == NKCODE_BACK) { *pauseTrigger = true; diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index d8d96a3f31..ee2b8a5f72 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -541,6 +541,7 @@ + @@ -1098,6 +1099,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 486f2a2e10..3d3b1e9853 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1178,6 +1178,9 @@ Core + + Core + @@ -1898,6 +1901,9 @@ Core + + Core + diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index c15f8dc6c7..b192fc2bdb 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -36,267 +36,19 @@ #include "Core/HLE/sceUtility.h" #include "Core/Config.h" #include "Core/KeyMap.h" +#include "Core/KeyMapDefaults.h" namespace KeyMap { KeyDef AxisDef(int deviceId, int axisId, int direction); -struct DefMappingStruct { - int pspKey; - int key; - int direction; -}; - KeyMapping g_controllerMap; int g_controllerMapGeneration = 0; std::set g_seenPads; -static std::set g_seenDeviceIds; +std::set g_seenDeviceIds; bool g_swapped_keys = false; -static const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { - {CTRL_SQUARE, NKCODE_A}, - {CTRL_TRIANGLE, NKCODE_S}, - {CTRL_CIRCLE, NKCODE_X}, - {CTRL_CROSS, NKCODE_Z}, - {CTRL_LTRIGGER, NKCODE_Q}, - {CTRL_RTRIGGER, NKCODE_W}, - - {CTRL_START, NKCODE_SPACE}, -#ifdef _WIN32 - {CTRL_SELECT, NKCODE_V}, -#else - {CTRL_SELECT, NKCODE_ENTER}, -#endif - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, - {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, - {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, - {VIRTKEY_AXIS_X_MIN, NKCODE_J}, - {VIRTKEY_AXIS_X_MAX, NKCODE_L}, - {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, - {VIRTKEY_FASTFORWARD, NKCODE_TAB}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, - {VIRTKEY_PAUSE , NKCODE_ESCAPE}, - {VIRTKEY_REWIND , NKCODE_DEL}, - {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, -}; - -static const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { - {CTRL_SQUARE, NKCODE_Q}, - {CTRL_TRIANGLE, NKCODE_S}, - {CTRL_CIRCLE, NKCODE_X}, - {CTRL_CROSS, NKCODE_W}, - {CTRL_LTRIGGER, NKCODE_A}, - {CTRL_RTRIGGER, NKCODE_Z}, - - {CTRL_START, NKCODE_SPACE}, -#ifdef _WIN32 - {CTRL_SELECT, NKCODE_V}, -#else - {CTRL_SELECT, NKCODE_ENTER}, -#endif - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, - {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, - {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, - {VIRTKEY_AXIS_X_MIN, NKCODE_J}, - {VIRTKEY_AXIS_X_MAX, NKCODE_L}, - {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, - {VIRTKEY_FASTFORWARD, NKCODE_TAB}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, - {VIRTKEY_PAUSE , NKCODE_ESCAPE}, - {VIRTKEY_REWIND , NKCODE_DEL}, - {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, -}; - -static const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { - {CTRL_SQUARE, NKCODE_A}, - {CTRL_TRIANGLE, NKCODE_S}, - {CTRL_CIRCLE, NKCODE_X}, - {CTRL_CROSS, NKCODE_Y}, - {CTRL_LTRIGGER, NKCODE_Q}, - {CTRL_RTRIGGER, NKCODE_W}, - - {CTRL_START, NKCODE_SPACE}, -#ifdef _WIN32 - {CTRL_SELECT, NKCODE_V}, -#else - {CTRL_SELECT, NKCODE_ENTER}, -#endif - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, - {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, - {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, - {VIRTKEY_AXIS_X_MIN, NKCODE_J}, - {VIRTKEY_AXIS_X_MAX, NKCODE_L}, - {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, - {VIRTKEY_FASTFORWARD, NKCODE_TAB}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, - {VIRTKEY_PAUSE , NKCODE_ESCAPE}, - {VIRTKEY_REWIND , NKCODE_DEL}, - {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, -}; - -static const DefMappingStruct default360KeyMap[] = { - {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}, - {CTRL_CROSS , NKCODE_BUTTON_A}, - {CTRL_CIRCLE , NKCODE_BUTTON_B}, - {CTRL_SQUARE , NKCODE_BUTTON_X}, - {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_START , NKCODE_BUTTON_START}, - {CTRL_SELECT , NKCODE_BUTTON_SELECT}, - {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_FASTFORWARD , JOYSTICK_AXIS_RTRIGGER, +1}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_THUMBR}, - {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, - {VIRTKEY_PAUSE, NKCODE_HOME}, -}; - -static const DefMappingStruct defaultShieldKeyMap[] = { - {CTRL_CROSS, NKCODE_BUTTON_A}, - {CTRL_CIRCLE ,NKCODE_BUTTON_B}, - {CTRL_SQUARE ,NKCODE_BUTTON_X}, - {CTRL_TRIANGLE ,NKCODE_BUTTON_Y}, - {CTRL_START, NKCODE_BUTTON_START}, - {CTRL_SELECT, JOYSTICK_AXIS_LTRIGGER, +1}, - {CTRL_LTRIGGER, NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER, NKCODE_BUTTON_R1}, - {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}, - {CTRL_LEFT, JOYSTICK_AXIS_HAT_X, -1}, - {CTRL_RIGHT, JOYSTICK_AXIS_HAT_X, +1}, - {CTRL_UP, JOYSTICK_AXIS_HAT_Y, -1}, - {CTRL_DOWN, JOYSTICK_AXIS_HAT_Y, +1}, - {VIRTKEY_SPEED_TOGGLE, JOYSTICK_AXIS_LTRIGGER, +1 }, - {VIRTKEY_FASTFORWARD, JOYSTICK_AXIS_RTRIGGER, +1 }, - {VIRTKEY_PAUSE, NKCODE_BACK }, -}; - -static const DefMappingStruct defaultMOQI7SKeyMap[] = { - {CTRL_CROSS, NKCODE_BUTTON_A}, - {CTRL_CIRCLE, NKCODE_BUTTON_B}, - {CTRL_SQUARE, NKCODE_BUTTON_X}, - {CTRL_TRIANGLE, NKCODE_BUTTON_Y}, - {CTRL_START, JOYSTICK_AXIS_Z, +1}, - {CTRL_SELECT, JOYSTICK_AXIS_Z, -1}, - {CTRL_LTRIGGER, NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER, NKCODE_BUTTON_R1}, - {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}, - {CTRL_LEFT, JOYSTICK_AXIS_HAT_X, -1}, - {CTRL_RIGHT, JOYSTICK_AXIS_HAT_X, +1}, - {CTRL_UP, JOYSTICK_AXIS_HAT_Y, -1}, - {CTRL_DOWN, JOYSTICK_AXIS_HAT_Y, +1}, - {VIRTKEY_FASTFORWARD, JOYSTICK_AXIS_RZ, +1 }, - {VIRTKEY_PAUSE, NKCODE_BACK }, -}; - -static const DefMappingStruct defaultPadMap[] = { -#if PPSSPP_PLATFORM(ANDROID) - {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_BACK}, - {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}, -#else - {CTRL_CROSS , NKCODE_BUTTON_2}, - {CTRL_CIRCLE , NKCODE_BUTTON_3}, - {CTRL_SQUARE , NKCODE_BUTTON_4}, - {CTRL_TRIANGLE , NKCODE_BUTTON_1}, - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_START , NKCODE_BUTTON_10}, - {CTRL_SELECT , NKCODE_BUTTON_9}, - {CTRL_LTRIGGER , NKCODE_BUTTON_7}, - {CTRL_RTRIGGER , NKCODE_BUTTON_8}, - {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}, - {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, -#endif -}; - -static const DefMappingStruct defaultOuyaMap[] = { - {CTRL_CROSS , NKCODE_BUTTON_A}, - {CTRL_CIRCLE , NKCODE_BUTTON_B}, - {CTRL_SQUARE , NKCODE_BUTTON_X}, - {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_START , NKCODE_BUTTON_R2}, - {CTRL_SELECT , NKCODE_BUTTON_L2}, - {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_THUMBL}, - {VIRTKEY_PAUSE , NKCODE_BUTTON_THUMBR}, - {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 defaultXperiaPlay[] = { - {CTRL_CROSS , NKCODE_BUTTON_CROSS}, - {CTRL_CIRCLE , NKCODE_BUTTON_CIRCLE}, - {CTRL_SQUARE , NKCODE_BUTTON_X}, - {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, - {CTRL_UP , NKCODE_DPAD_UP}, - {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, - {CTRL_DOWN , NKCODE_DPAD_DOWN}, - {CTRL_LEFT , NKCODE_DPAD_LEFT}, - {CTRL_START , NKCODE_BUTTON_START}, - {CTRL_SELECT , NKCODE_BUTTON_SELECT}, - {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {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}, -}; - void KeyCodesFromPspButton(int btn, std::vector *keycodes) { for (auto i = g_controllerMap[btn].begin(), end = g_controllerMap[btn].end(); i != end; ++i) { keycodes->push_back((keycode_t)i->keyCode); @@ -368,79 +120,6 @@ void UpdateNativeMenuKeys() { SetAnalogFlipY(flipYByDeviceId); } -static void SetDefaultKeyMap(int deviceId, const DefMappingStruct *array, size_t count, bool replace) { - for (size_t i = 0; i < count; i++) { - if (array[i].direction == 0) - SetKeyMapping(array[i].pspKey, KeyDef(deviceId, array[i].key), replace); - else - SetAxisMapping(array[i].pspKey, deviceId, array[i].key, array[i].direction, replace); - } - g_seenDeviceIds.insert(deviceId); -} - -void SetDefaultKeyMap(DefaultMaps dmap, bool replace) { - switch (dmap) { - case DEFAULT_MAPPING_KEYBOARD: - { - bool azerty = false; - bool qwertz = false; -#if defined(SDL) - char q, w, y; - q = SDL_GetKeyFromScancode(SDL_SCANCODE_Q); - w = SDL_GetKeyFromScancode(SDL_SCANCODE_W); - y = SDL_GetKeyFromScancode(SDL_SCANCODE_Y); - if (q == 'a' && w == 'z' && y == 'y') - azerty = true; - else if (q == 'q' && w == 'w' && y == 'z') - qwertz = true; -#elif defined(USING_WIN_UI) - HKL localeId = GetKeyboardLayout(0); - // TODO: Is this list complete enough? - switch ((int)(intptr_t)localeId & 0xFFFF) { - case 0x407: - qwertz = true; - break; - case 0x040c: - case 0x080c: - case 0x1009: - azerty = true; - break; - default: - break; - } -#endif - if (azerty) { - SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultAzertyKeyboardKeyMap, ARRAY_SIZE(defaultAzertyKeyboardKeyMap), replace); - } else if (qwertz) { - SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultQwertzKeyboardKeyMap, ARRAY_SIZE(defaultQwertzKeyboardKeyMap), replace); - } else { - SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultQwertyKeyboardKeyMap, ARRAY_SIZE(defaultQwertyKeyboardKeyMap), replace); - } - } - break; - case DEFAULT_MAPPING_X360: - SetDefaultKeyMap(DEVICE_ID_X360_0, default360KeyMap, ARRAY_SIZE(default360KeyMap), replace); - break; - case DEFAULT_MAPPING_SHIELD: - SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultShieldKeyMap, ARRAY_SIZE(defaultShieldKeyMap), replace); - break; - case DEFAULT_MAPPING_MOQI_I7S: - SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultMOQI7SKeyMap, ARRAY_SIZE(defaultMOQI7SKeyMap), replace); - break; - case DEFAULT_MAPPING_PAD: - SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultPadMap, ARRAY_SIZE(defaultPadMap), 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; - } - - UpdateNativeMenuKeys(); -} - static const KeyMap_IntStrPair key_names[] = { {NKCODE_A, "A"}, {NKCODE_B, "B"}, diff --git a/Core/KeyMap.h b/Core/KeyMap.h index 011cf03c54..b57d505eec 100644 --- a/Core/KeyMap.h +++ b/Core/KeyMap.h @@ -65,16 +65,6 @@ enum { VIRTKEY_COUNT = VIRTKEY_LAST - VIRTKEY_FIRST }; -enum DefaultMaps { - DEFAULT_MAPPING_KEYBOARD, - DEFAULT_MAPPING_PAD, - DEFAULT_MAPPING_X360, - DEFAULT_MAPPING_SHIELD, - DEFAULT_MAPPING_OUYA, - DEFAULT_MAPPING_XPERIA_PLAY, - DEFAULT_MAPPING_MOQI_I7S, -}; - const float AXIS_BIND_THRESHOLD = 0.75f; const float AXIS_BIND_THRESHOLD_MOUSE = 0.01f; @@ -106,6 +96,7 @@ class IniFile; namespace KeyMap { extern KeyMapping g_controllerMap; + extern std::set g_seenDeviceIds; extern int g_controllerMapGeneration; // Key & Button names diff --git a/Core/KeyMapDefaults.cpp b/Core/KeyMapDefaults.cpp new file mode 100644 index 0000000000..7e69932b62 --- /dev/null +++ b/Core/KeyMapDefaults.cpp @@ -0,0 +1,341 @@ +#if defined(SDL) +#include +#elif defined(USING_WIN_UI) +#include "CommonWindows.h" +#endif + +#include "ppsspp_config.h" + +#include "Common/CommonFuncs.h" +#include "Common/Input/KeyCodes.h" +#include "Common/Input/InputState.h" +#include "Core/KeyMapDefaults.h" +#include "Core/KeyMap.h" + +#include "Core/HLE/sceCtrl.h" + +namespace KeyMap { + +struct DefMappingStruct { + int pspKey; + int key; + int direction; +}; + +const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { + {CTRL_SQUARE, NKCODE_A}, + {CTRL_TRIANGLE, NKCODE_S}, + {CTRL_CIRCLE, NKCODE_X}, + {CTRL_CROSS, NKCODE_Z}, + {CTRL_LTRIGGER, NKCODE_Q}, + {CTRL_RTRIGGER, NKCODE_W}, + + {CTRL_START, NKCODE_SPACE}, +#ifdef _WIN32 + {CTRL_SELECT, NKCODE_V}, +#else + {CTRL_SELECT, NKCODE_ENTER}, +#endif + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, + {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, + {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, + {VIRTKEY_AXIS_X_MIN, NKCODE_J}, + {VIRTKEY_AXIS_X_MAX, NKCODE_L}, + {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, + {VIRTKEY_FASTFORWARD, NKCODE_TAB}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, + {VIRTKEY_PAUSE , NKCODE_ESCAPE}, + {VIRTKEY_REWIND , NKCODE_DEL}, + {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, +}; + +const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { + {CTRL_SQUARE, NKCODE_Q}, + {CTRL_TRIANGLE, NKCODE_S}, + {CTRL_CIRCLE, NKCODE_X}, + {CTRL_CROSS, NKCODE_W}, + {CTRL_LTRIGGER, NKCODE_A}, + {CTRL_RTRIGGER, NKCODE_Z}, + + {CTRL_START, NKCODE_SPACE}, +#ifdef _WIN32 + {CTRL_SELECT, NKCODE_V}, +#else + {CTRL_SELECT, NKCODE_ENTER}, +#endif + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, + {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, + {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, + {VIRTKEY_AXIS_X_MIN, NKCODE_J}, + {VIRTKEY_AXIS_X_MAX, NKCODE_L}, + {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, + {VIRTKEY_FASTFORWARD, NKCODE_TAB}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, + {VIRTKEY_PAUSE , NKCODE_ESCAPE}, + {VIRTKEY_REWIND , NKCODE_DEL}, + {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, +}; + +const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { + {CTRL_SQUARE, NKCODE_A}, + {CTRL_TRIANGLE, NKCODE_S}, + {CTRL_CIRCLE, NKCODE_X}, + {CTRL_CROSS, NKCODE_Y}, + {CTRL_LTRIGGER, NKCODE_Q}, + {CTRL_RTRIGGER, NKCODE_W}, + + {CTRL_START, NKCODE_SPACE}, +#ifdef _WIN32 + {CTRL_SELECT, NKCODE_V}, +#else + {CTRL_SELECT, NKCODE_ENTER}, +#endif + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_RIGHT, NKCODE_DPAD_RIGHT}, + {VIRTKEY_AXIS_Y_MAX, NKCODE_I}, + {VIRTKEY_AXIS_Y_MIN, NKCODE_K}, + {VIRTKEY_AXIS_X_MIN, NKCODE_J}, + {VIRTKEY_AXIS_X_MAX, NKCODE_L}, + {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, + {VIRTKEY_FASTFORWARD, NKCODE_TAB}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, + {VIRTKEY_PAUSE , NKCODE_ESCAPE}, + {VIRTKEY_REWIND , NKCODE_DEL}, + {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, +}; + +const DefMappingStruct default360KeyMap[] = { + {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}, + {CTRL_CROSS , NKCODE_BUTTON_A}, + {CTRL_CIRCLE , NKCODE_BUTTON_B}, + {CTRL_SQUARE , NKCODE_BUTTON_X}, + {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_START , NKCODE_BUTTON_START}, + {CTRL_SELECT , NKCODE_BUTTON_SELECT}, + {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, + {VIRTKEY_FASTFORWARD , JOYSTICK_AXIS_RTRIGGER, +1}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_THUMBR}, + {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, + {VIRTKEY_PAUSE, NKCODE_HOME}, +}; + +const DefMappingStruct defaultShieldKeyMap[] = { + {CTRL_CROSS, NKCODE_BUTTON_A}, + {CTRL_CIRCLE ,NKCODE_BUTTON_B}, + {CTRL_SQUARE ,NKCODE_BUTTON_X}, + {CTRL_TRIANGLE ,NKCODE_BUTTON_Y}, + {CTRL_START, NKCODE_BUTTON_START}, + {CTRL_SELECT, JOYSTICK_AXIS_LTRIGGER, +1}, + {CTRL_LTRIGGER, NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER, NKCODE_BUTTON_R1}, + {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}, + {CTRL_LEFT, JOYSTICK_AXIS_HAT_X, -1}, + {CTRL_RIGHT, JOYSTICK_AXIS_HAT_X, +1}, + {CTRL_UP, JOYSTICK_AXIS_HAT_Y, -1}, + {CTRL_DOWN, JOYSTICK_AXIS_HAT_Y, +1}, + {VIRTKEY_SPEED_TOGGLE, JOYSTICK_AXIS_LTRIGGER, +1 }, + {VIRTKEY_FASTFORWARD, JOYSTICK_AXIS_RTRIGGER, +1 }, + {VIRTKEY_PAUSE, NKCODE_BACK }, +}; + +const DefMappingStruct defaultMOQI7SKeyMap[] = { + {CTRL_CROSS, NKCODE_BUTTON_A}, + {CTRL_CIRCLE, NKCODE_BUTTON_B}, + {CTRL_SQUARE, NKCODE_BUTTON_X}, + {CTRL_TRIANGLE, NKCODE_BUTTON_Y}, + {CTRL_START, JOYSTICK_AXIS_Z, +1}, + {CTRL_SELECT, JOYSTICK_AXIS_Z, -1}, + {CTRL_LTRIGGER, NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER, NKCODE_BUTTON_R1}, + {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}, + {CTRL_LEFT, JOYSTICK_AXIS_HAT_X, -1}, + {CTRL_RIGHT, JOYSTICK_AXIS_HAT_X, +1}, + {CTRL_UP, JOYSTICK_AXIS_HAT_Y, -1}, + {CTRL_DOWN, JOYSTICK_AXIS_HAT_Y, +1}, + {VIRTKEY_FASTFORWARD, JOYSTICK_AXIS_RZ, +1 }, + {VIRTKEY_PAUSE, NKCODE_BACK }, +}; + +const DefMappingStruct defaultPadMap[] = { +#if PPSSPP_PLATFORM(ANDROID) + {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_BACK}, + {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}, +#else + {CTRL_CROSS , NKCODE_BUTTON_2}, + {CTRL_CIRCLE , NKCODE_BUTTON_3}, + {CTRL_SQUARE , NKCODE_BUTTON_4}, + {CTRL_TRIANGLE , NKCODE_BUTTON_1}, + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_START , NKCODE_BUTTON_10}, + {CTRL_SELECT , NKCODE_BUTTON_9}, + {CTRL_LTRIGGER , NKCODE_BUTTON_7}, + {CTRL_RTRIGGER , NKCODE_BUTTON_8}, + {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}, + {VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1}, +#endif +}; + +const DefMappingStruct defaultOuyaMap[] = { + {CTRL_CROSS , NKCODE_BUTTON_A}, + {CTRL_CIRCLE , NKCODE_BUTTON_B}, + {CTRL_SQUARE , NKCODE_BUTTON_X}, + {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_START , NKCODE_BUTTON_R2}, + {CTRL_SELECT , NKCODE_BUTTON_L2}, + {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, + {VIRTKEY_FASTFORWARD , NKCODE_BUTTON_THUMBL}, + {VIRTKEY_PAUSE , NKCODE_BUTTON_THUMBR}, + {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}, +}; + +const DefMappingStruct defaultXperiaPlay[] = { + {CTRL_CROSS , NKCODE_BUTTON_CROSS}, + {CTRL_CIRCLE , NKCODE_BUTTON_CIRCLE}, + {CTRL_SQUARE , NKCODE_BUTTON_X}, + {CTRL_TRIANGLE , NKCODE_BUTTON_Y}, + {CTRL_UP , NKCODE_DPAD_UP}, + {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, + {CTRL_DOWN , NKCODE_DPAD_DOWN}, + {CTRL_LEFT , NKCODE_DPAD_LEFT}, + {CTRL_START , NKCODE_BUTTON_START}, + {CTRL_SELECT , NKCODE_BUTTON_SELECT}, + {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, + {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 void SetDefaultKeyMap(int deviceId, const DefMappingStruct *array, size_t count, bool replace) { + for (size_t i = 0; i < count; i++) { + if (array[i].direction == 0) + SetKeyMapping(array[i].pspKey, KeyDef(deviceId, array[i].key), replace); + else + SetAxisMapping(array[i].pspKey, deviceId, array[i].key, array[i].direction, replace); + } + g_seenDeviceIds.insert(deviceId); +} + +void SetDefaultKeyMap(DefaultMaps dmap, bool replace) { + switch (dmap) { + case DEFAULT_MAPPING_KEYBOARD: + { + bool azerty = false; + bool qwertz = false; +#if defined(SDL) + char q, w, y; + q = SDL_GetKeyFromScancode(SDL_SCANCODE_Q); + w = SDL_GetKeyFromScancode(SDL_SCANCODE_W); + y = SDL_GetKeyFromScancode(SDL_SCANCODE_Y); + if (q == 'a' && w == 'z' && y == 'y') + azerty = true; + else if (q == 'q' && w == 'w' && y == 'z') + qwertz = true; +#elif defined(USING_WIN_UI) + HKL localeId = GetKeyboardLayout(0); + // TODO: Is this list complete enough? + switch ((int)(intptr_t)localeId & 0xFFFF) { + case 0x407: + qwertz = true; + break; + case 0x040c: + case 0x080c: + case 0x1009: + azerty = true; + break; + default: + break; + } +#endif + if (azerty) { + SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultAzertyKeyboardKeyMap, ARRAY_SIZE(defaultAzertyKeyboardKeyMap), replace); + } else if (qwertz) { + SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultQwertzKeyboardKeyMap, ARRAY_SIZE(defaultQwertzKeyboardKeyMap), replace); + } else { + SetDefaultKeyMap(DEVICE_ID_KEYBOARD, defaultQwertyKeyboardKeyMap, ARRAY_SIZE(defaultQwertyKeyboardKeyMap), replace); + } + } + break; + case DEFAULT_MAPPING_X360: + SetDefaultKeyMap(DEVICE_ID_X360_0, default360KeyMap, ARRAY_SIZE(default360KeyMap), replace); + break; + case DEFAULT_MAPPING_SHIELD: + SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultShieldKeyMap, ARRAY_SIZE(defaultShieldKeyMap), replace); + break; + case DEFAULT_MAPPING_MOQI_I7S: + SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultMOQI7SKeyMap, ARRAY_SIZE(defaultMOQI7SKeyMap), replace); + break; + case DEFAULT_MAPPING_PAD: + SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultPadMap, ARRAY_SIZE(defaultPadMap), 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; + } + + UpdateNativeMenuKeys(); +} + +} // namespace KeyMap diff --git a/Core/KeyMapDefaults.h b/Core/KeyMapDefaults.h new file mode 100644 index 0000000000..a79cbad857 --- /dev/null +++ b/Core/KeyMapDefaults.h @@ -0,0 +1,13 @@ +#pragma once + +enum DefaultMaps { + DEFAULT_MAPPING_KEYBOARD, + DEFAULT_MAPPING_PAD, + DEFAULT_MAPPING_X360, + DEFAULT_MAPPING_SHIELD, + DEFAULT_MAPPING_OUYA, + DEFAULT_MAPPING_XPERIA_PLAY, + DEFAULT_MAPPING_MOQI_I7S, +}; + +void SetDefaultKeyMap(DefaultMaps dmap, bool replace); diff --git a/UWP/CoreUWP/CoreUWP.vcxproj b/UWP/CoreUWP/CoreUWP.vcxproj index dd271d6221..19882bdb05 100644 --- a/UWP/CoreUWP/CoreUWP.vcxproj +++ b/UWP/CoreUWP/CoreUWP.vcxproj @@ -527,6 +527,7 @@ + @@ -757,6 +758,7 @@ + diff --git a/UWP/CoreUWP/CoreUWP.vcxproj.filters b/UWP/CoreUWP/CoreUWP.vcxproj.filters index e59d84f7b3..6a1542dfd1 100644 --- a/UWP/CoreUWP/CoreUWP.vcxproj.filters +++ b/UWP/CoreUWP/CoreUWP.vcxproj.filters @@ -1108,6 +1108,7 @@ + @@ -1747,6 +1748,7 @@ + diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 62df2e1a3f..3e911bb34c 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -387,6 +387,7 @@ EXEC_AND_LIB_FILES := \ $(SRC)/Core/HDRemaster.cpp \ $(SRC)/Core/Instance.cpp \ $(SRC)/Core/KeyMap.cpp \ + $(SRC)/Core/KeyMapDefaults.cpp \ $(SRC)/Core/Host.cpp \ $(SRC)/Core/Loaders.cpp \ $(SRC)/Core/PSPLoaders.cpp \ diff --git a/libretro/Makefile.common b/libretro/Makefile.common index a80ff92847..eb1bd54478 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -433,6 +433,7 @@ SOURCES_CXX += \ $(COREDIR)/Core.cpp \ $(COREDIR)/WaveFile.cpp \ $(COREDIR)/KeyMap.cpp \ + $(COREDIR)/KeyMapDefaults.cpp \ $(COREDIR)/FileLoaders/HTTPFileLoader.cpp \ $(COREDIR)/FileLoaders/CachingFileLoader.cpp \ $(COREDIR)/FileLoaders/DiskCachingFileLoader.cpp \