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 \