mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-16 07:50:28 +02:00
Remove legacy key mapping and associate devices with keys (DInput has been left behind for now, will be fixed up soon). Saving is broken, will be fixed soon.
This commit is contained in:
1 parent
ab6133e419
commit
cc58e34cf8
30 files changed
+671
-1193
No files matched your search
+221
-122
@@ -19,39 +19,110 @@
|
||||
#include "../Core/Config.h"
|
||||
#include "KeyMap.h"
|
||||
|
||||
using namespace KeyMap;
|
||||
|
||||
// Platform specific
|
||||
// default
|
||||
std::map<int,int> *platform_keymap = NULL;
|
||||
namespace KeyMap {
|
||||
|
||||
// TODO: Make use const_map.h from native
|
||||
struct DefaultKeyMap {
|
||||
static std::map<int,int> init()
|
||||
static KeyMapping defaultKeyboardMap()
|
||||
{
|
||||
std::map<int,int> m;
|
||||
m[KEYCODE_A] = CTRL_SQUARE;
|
||||
m[KEYCODE_S] = CTRL_TRIANGLE;
|
||||
m[KEYCODE_X] = CTRL_CIRCLE;
|
||||
m[KEYCODE_Z] = CTRL_CROSS;
|
||||
m[KEYCODE_Q] = CTRL_LTRIGGER;
|
||||
m[KEYCODE_W] = CTRL_RTRIGGER;
|
||||
m[KEYCODE_SPACE] = CTRL_START;
|
||||
KeyMapping m;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_A)] = CTRL_SQUARE;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_S)] = CTRL_TRIANGLE;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_X)] = CTRL_CIRCLE;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_Z)] = CTRL_CROSS;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_Q)] = CTRL_LTRIGGER;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_W)] = CTRL_RTRIGGER;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_SPACE)] = CTRL_START;
|
||||
#ifdef _WIN32
|
||||
m[KEYCODE_V] = CTRL_SELECT;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_V)] = CTRL_SELECT;
|
||||
#else
|
||||
m[KEYCODE_ENTER] = CTRL_SELECT;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_ENTER)] = CTRL_SELECT;
|
||||
#endif
|
||||
m[KEYCODE_DPAD_UP] = CTRL_UP;
|
||||
m[KEYCODE_DPAD_DOWN] = CTRL_DOWN;
|
||||
m[KEYCODE_DPAD_LEFT] = CTRL_LEFT;
|
||||
m[KEYCODE_DPAD_RIGHT] = CTRL_RIGHT;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_DPAD_UP)] = CTRL_UP;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_DPAD_DOWN)] = CTRL_DOWN;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_DPAD_LEFT)] = CTRL_LEFT;
|
||||
m[KeyDef(DEVICE_ID_KEYBOARD, KEYCODE_DPAD_RIGHT)] = CTRL_RIGHT;
|
||||
return m;
|
||||
}
|
||||
static std::map<int,int> KeyMap;
|
||||
|
||||
static KeyMapping default360Map()
|
||||
{
|
||||
KeyMapping m;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BUTTON_A)] = CTRL_CROSS;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BUTTON_B)] = CTRL_CIRCLE;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BUTTON_X)] = CTRL_SQUARE;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BUTTON_Y)] = CTRL_TRIANGLE;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_DPAD_UP)] = CTRL_UP;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_DPAD_RIGHT)] = CTRL_RIGHT;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_DPAD_DOWN)] = CTRL_DOWN;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_DPAD_LEFT)] = CTRL_LEFT;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BUTTON_START)] = CTRL_START;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BACK)] = CTRL_SELECT;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BUTTON_L1)] = CTRL_LTRIGGER;
|
||||
m[KeyDef(DEVICE_ID_X360_0, KEYCODE_BUTTON_R1)] = CTRL_RTRIGGER;
|
||||
return m;
|
||||
}
|
||||
|
||||
static KeyMapping defaultPadMap()
|
||||
{
|
||||
KeyMapping m;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_BUTTON_A)] = CTRL_CROSS;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_BUTTON_B)] = CTRL_CIRCLE;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_BUTTON_X)] = CTRL_SQUARE;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_BUTTON_Y)] = CTRL_TRIANGLE;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_DPAD_UP)] = CTRL_UP;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_DPAD_RIGHT)] = CTRL_RIGHT;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_DPAD_DOWN)] = CTRL_DOWN;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_DPAD_LEFT)] = CTRL_LEFT;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_BUTTON_START)] = CTRL_START;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_BACK)] = CTRL_SELECT;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_BUTTON_L1)] = CTRL_LTRIGGER;
|
||||
m[KeyDef(DEVICE_ID_PAD_0, KEYCODE_BUTTON_R1)] = CTRL_RTRIGGER;
|
||||
return m;
|
||||
}
|
||||
|
||||
static std::vector<ControllerMap> init()
|
||||
{
|
||||
std::vector<ControllerMap> m;
|
||||
|
||||
#if defined(USING_GLES2)
|
||||
// Mobile! Only a pad map required, some can use a keyboard map though.
|
||||
ControllerMap pad;
|
||||
pad.keys = defaultPadMap();
|
||||
pad.name = "Pad";
|
||||
m.push_back(pad);
|
||||
|
||||
ControllerMap kbd;
|
||||
kbd.keys = defaultKeyboardMap();
|
||||
kbd.name = "Keyboard";
|
||||
m.push_back(kbd);
|
||||
#else
|
||||
ControllerMap kbd;
|
||||
kbd.keys = defaultKeyboardMap();
|
||||
kbd.name = "Keyboard";
|
||||
m.push_back(kbd);
|
||||
|
||||
#ifdef _WIN32
|
||||
ControllerMap x360;
|
||||
x360.keys = default360Map();
|
||||
x360.name = "360";
|
||||
m.push_back(x360);
|
||||
#endif
|
||||
// Keyboard and pad maps.
|
||||
ControllerMap pad;
|
||||
pad.keys = defaultPadMap();
|
||||
pad.name = "Pad";
|
||||
pad.active = false;
|
||||
m.push_back(pad);
|
||||
#endif
|
||||
return m;
|
||||
}
|
||||
|
||||
static std::vector<ControllerMap> KeyMap;
|
||||
};
|
||||
|
||||
std::map<int,int> DefaultKeyMap::KeyMap = DefaultKeyMap::init();
|
||||
std::vector<ControllerMap> DefaultKeyMap::KeyMap = DefaultKeyMap::init();
|
||||
|
||||
|
||||
// Key & Button names
|
||||
struct KeyMap_IntStrPair {
|
||||
@@ -86,6 +157,7 @@ const KeyMap_IntStrPair key_names[] = {
|
||||
{KEYCODE_Y, "Y"},
|
||||
{KEYCODE_Z, "Z"},
|
||||
|
||||
{KEYCODE_0, "0"},
|
||||
{KEYCODE_1, "1"},
|
||||
{KEYCODE_2, "2"},
|
||||
{KEYCODE_3, "3"},
|
||||
@@ -95,39 +167,96 @@ const KeyMap_IntStrPair key_names[] = {
|
||||
{KEYCODE_7, "7"},
|
||||
{KEYCODE_8, "8"},
|
||||
{KEYCODE_9, "9"},
|
||||
{KEYCODE_0, "0"},
|
||||
|
||||
{KEYCODE_F1, "F1"},
|
||||
{KEYCODE_F2, "F2"},
|
||||
{KEYCODE_F3, "F3"},
|
||||
{KEYCODE_F4, "F4"},
|
||||
{KEYCODE_F5, "F5"},
|
||||
{KEYCODE_F6, "F6"},
|
||||
{KEYCODE_F7, "F7"},
|
||||
{KEYCODE_F8, "F8"},
|
||||
{KEYCODE_F9, "F9"},
|
||||
{KEYCODE_F10, "F10"},
|
||||
{KEYCODE_F11, "F11"},
|
||||
{KEYCODE_F12, "F12"},
|
||||
|
||||
{KEYCODE_COMMA, ","},
|
||||
{KEYCODE_PERIOD, "."},
|
||||
|
||||
{KEYCODE_BACK, "Back"},
|
||||
{KEYCODE_TAB, "Tab"},
|
||||
{KEYCODE_ENTER, "Enter"},
|
||||
{KEYCODE_SHIFT_LEFT, "Shift"},
|
||||
{KEYCODE_SHIFT_RIGHT, "Shift"},
|
||||
{KEYCODE_CTRL_LEFT, "Ctrl"},
|
||||
{KEYCODE_CTRL_RIGHT, "Ctrl"},
|
||||
{KEYCODE_ALT_LEFT, "Alt"},
|
||||
{KEYCODE_ALT_RIGHT, "Alt"},
|
||||
{KEYCODE_SHIFT_LEFT, "LShift"},
|
||||
{KEYCODE_SHIFT_RIGHT, "RShift"},
|
||||
{KEYCODE_CTRL_LEFT, "LCtrl"},
|
||||
{KEYCODE_CTRL_RIGHT, "RCtrl"},
|
||||
{KEYCODE_ALT_LEFT, "LAlt"},
|
||||
{KEYCODE_ALT_RIGHT, "RAlt"},
|
||||
{KEYCODE_SPACE, "Space"},
|
||||
{KEYCODE_WINDOW, "Windows"},
|
||||
{KEYCODE_DEL, "Del"},
|
||||
{KEYCODE_MOVE_HOME, "Home"},
|
||||
{KEYCODE_MOVE_END, "End"},
|
||||
|
||||
{KEYCODE_VOLUME_UP, "Vol Up"},
|
||||
{KEYCODE_VOLUME_DOWN, "Vol Down"},
|
||||
{KEYCODE_VOLUME_UP, "Vol +"},
|
||||
{KEYCODE_VOLUME_DOWN, "Vol -"},
|
||||
{KEYCODE_HOME, "Home"},
|
||||
{KEYCODE_CALL, "Start Call"},
|
||||
{KEYCODE_CALL, "Call"},
|
||||
{KEYCODE_ENDCALL, "End Call"},
|
||||
|
||||
{KEYCODE_DPAD_LEFT, "Left"},
|
||||
{KEYCODE_DPAD_UP, "Up"},
|
||||
{KEYCODE_DPAD_RIGHT, "Right"},
|
||||
{KEYCODE_DPAD_DOWN, "Down"},
|
||||
|
||||
{KEYCODE_BUTTON_L1, "L1"},
|
||||
{KEYCODE_BUTTON_L2, "L2"},
|
||||
{KEYCODE_BUTTON_R1, "R1"},
|
||||
{KEYCODE_BUTTON_R2, "R2"},
|
||||
|
||||
{KEYCODE_BUTTON_A, "[A]"},
|
||||
{KEYCODE_BUTTON_B, "[B]"},
|
||||
{KEYCODE_BUTTON_C, "[C]"},
|
||||
{KEYCODE_BUTTON_X, "[X]"},
|
||||
{KEYCODE_BUTTON_Y, "[Y]"},
|
||||
{KEYCODE_BUTTON_Z, "[Z]"},
|
||||
{KEYCODE_BUTTON_1, "b1"},
|
||||
{KEYCODE_BUTTON_2, "b2"},
|
||||
{KEYCODE_BUTTON_3, "b3"},
|
||||
{KEYCODE_BUTTON_4, "b4"},
|
||||
{KEYCODE_BUTTON_5, "b5"},
|
||||
{KEYCODE_BUTTON_6, "b6"},
|
||||
{KEYCODE_BUTTON_7, "b7"},
|
||||
{KEYCODE_BUTTON_8, "b8"},
|
||||
{KEYCODE_BUTTON_9, "b9"},
|
||||
{KEYCODE_BUTTON_10, "b10"},
|
||||
{KEYCODE_BUTTON_11, "b11"},
|
||||
{KEYCODE_BUTTON_12, "b12"},
|
||||
{KEYCODE_BUTTON_13, "b13"},
|
||||
{KEYCODE_BUTTON_14, "b14"},
|
||||
{KEYCODE_BUTTON_15, "b15"},
|
||||
{KEYCODE_BUTTON_16, "b16"},
|
||||
{KEYCODE_BUTTON_START, "Start"},
|
||||
{KEYCODE_BUTTON_SELECT, "Select"},
|
||||
{KEYCODE_BUTTON_CIRCLE, "Circle"},
|
||||
{KEYCODE_BUTTON_CIRCLE_PS3, "Circle3"},
|
||||
{KEYCODE_BUTTON_CROSS, "Cross"},
|
||||
{KEYCODE_BUTTON_CROSS_PS3, "Cross3"},
|
||||
{KEYCODE_BUTTON_TRIANGLE, "Triangle"},
|
||||
{KEYCODE_BUTTON_SQUARE, "Square"},
|
||||
{KEYCODE_BUTTON_THUMBL, "ThumbL"},
|
||||
{KEYCODE_BUTTON_THUMBR, "ThumbR"},
|
||||
{KEYCODE_BUTTON_MODE, "Mode"},
|
||||
};
|
||||
|
||||
static int key_names_count = sizeof(key_names) / sizeof(key_names[0]);
|
||||
static std::string unknown_key_name = "Unknown";
|
||||
const KeyMap_IntStrPair psp_button_names[] = {
|
||||
{CTRL_CIRCLE, "○"},
|
||||
{CTRL_CROSS, "⨯"},
|
||||
{CTRL_SQUARE, "□"},
|
||||
{CTRL_TRIANGLE, "△"},
|
||||
{CTRL_CIRCLE, "O"},
|
||||
{CTRL_CROSS, "X"},
|
||||
{CTRL_SQUARE, "[ ]"},
|
||||
{CTRL_TRIANGLE, "/\\"},
|
||||
{CTRL_LTRIGGER, "L"},
|
||||
{CTRL_RTRIGGER, "R"},
|
||||
{CTRL_START, "Start"},
|
||||
@@ -139,7 +268,6 @@ const KeyMap_IntStrPair psp_button_names[] = {
|
||||
};
|
||||
static int psp_button_names_count = sizeof(psp_button_names) / sizeof(psp_button_names[0]);
|
||||
|
||||
|
||||
static std::string FindName(int key, const KeyMap_IntStrPair list[], int size)
|
||||
{
|
||||
for (int i = 0; i < size; i++)
|
||||
@@ -149,125 +277,96 @@ static std::string FindName(int key, const KeyMap_IntStrPair list[], int size)
|
||||
return unknown_key_name;
|
||||
}
|
||||
|
||||
std::string KeyMap::GetKeyName(int key)
|
||||
std::string GetKeyName(int keyCode)
|
||||
{
|
||||
return FindName(key, key_names, key_names_count);
|
||||
return FindName(keyCode, key_names, key_names_count);
|
||||
}
|
||||
|
||||
std::string KeyMap::GetPspButtonName(int btn)
|
||||
std::string GetPspButtonName(int btn)
|
||||
{
|
||||
return FindName(btn, psp_button_names, psp_button_names_count);
|
||||
}
|
||||
|
||||
static bool FindKeyMapping(int key, int *map_id, int *psp_button)
|
||||
static bool FindKeyMapping(int deviceId, int key, int *psp_button)
|
||||
{
|
||||
std::map<int,int>::iterator it;
|
||||
if (*map_id <= 0) {
|
||||
// check user configuration
|
||||
std::map<int,int> user_map = g_Config.iMappingMap;
|
||||
it = user_map.find(key);
|
||||
if (it != user_map.end()) {
|
||||
*map_id = 0;
|
||||
*psp_button = it->second;
|
||||
for (size_t i = 0; i < controllerMaps.size(); i++) {
|
||||
if (!controllerMaps[i].active)
|
||||
continue;
|
||||
|
||||
auto iter = controllerMaps[i].keys.find(KeyDef(deviceId, key));
|
||||
if (iter != controllerMaps[i].keys.end()) {
|
||||
*psp_button = iter->second;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (*map_id <= 1 && platform_keymap != NULL) {
|
||||
// check optional platform specific keymap
|
||||
std::map<int,int> port_map = *platform_keymap;
|
||||
it = port_map.find(key);
|
||||
if (it != port_map.end()) {
|
||||
*map_id = 1;
|
||||
*psp_button = it->second;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (*map_id <= 2) {
|
||||
// check default keymap
|
||||
const std::map<int,int> default_map = DefaultKeyMap::KeyMap;
|
||||
const std::map<int,int>::const_iterator const_it = default_map.find(key);
|
||||
if (const_it != default_map.end()) {
|
||||
*map_id = 2;
|
||||
*psp_button = const_it->second;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
*map_id = -1;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int KeyMap::KeyToPspButton(int key)
|
||||
int KeyToPspButton(int deviceId, int key)
|
||||
{
|
||||
int search_start_layer = 0;
|
||||
int psp_button;
|
||||
|
||||
if (FindKeyMapping(key, &search_start_layer, &psp_button))
|
||||
if (FindKeyMapping(deviceId, key, &psp_button))
|
||||
return psp_button;
|
||||
|
||||
return KEYMAP_ERROR_UNKNOWN_KEY;
|
||||
}
|
||||
|
||||
bool KeyMap::IsMappedKey(int key)
|
||||
bool KeyFromPspButton(int controllerMap, int btn, int *deviceId, int *keyCode)
|
||||
{
|
||||
return KeyMap::KeyToPspButton(key) != KEYMAP_ERROR_UNKNOWN_KEY;
|
||||
int search_start_layer = 0;
|
||||
|
||||
for (auto iter = controllerMaps[controllerMap].keys.begin(); iter != controllerMaps[controllerMap].keys.end(); ++iter) {
|
||||
if (iter->second == btn) {
|
||||
*deviceId = iter->first.deviceId;
|
||||
*keyCode = iter->first.keyCode;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool KeyMap::IsUserDefined(int key)
|
||||
{
|
||||
int layer = 0;
|
||||
int ignored;
|
||||
FindKeyMapping(key, &layer, &ignored);
|
||||
return layer == 0; // key found in user settings
|
||||
std::string NameKeyFromPspButton(int controllerMap, int btn) {
|
||||
int deviceId;
|
||||
int keyCode;
|
||||
if (KeyFromPspButton(controllerMap, btn, &deviceId, &keyCode)) {
|
||||
return GetKeyName(keyCode);
|
||||
}
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
|
||||
std::string KeyMap::NamePspButtonFromKey(int key)
|
||||
{
|
||||
return KeyMap::GetPspButtonName(KeyMap::KeyToPspButton(key));
|
||||
std::string NameDeviceFromPspButton(int controllerMap, int btn) {
|
||||
int deviceId;
|
||||
int keyCode;
|
||||
if (KeyFromPspButton(controllerMap, btn, &deviceId, &keyCode)) {
|
||||
return GetDeviceName(deviceId);
|
||||
}
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
std::string KeyMap::NameKeyFromPspButton(int btn)
|
||||
bool IsMappedKey(int deviceId, int key)
|
||||
{
|
||||
// We drive our iteration
|
||||
// with the list of key names.
|
||||
for (int i = 0; i < key_names_count; i++) {
|
||||
const struct KeyMap_IntStrPair key_name = key_names[i];
|
||||
if (btn == KeyMap::KeyToPspButton(key_name.key))
|
||||
return key_name.name;
|
||||
return KeyToPspButton(deviceId, key) != KEYMAP_ERROR_UNKNOWN_KEY;
|
||||
}
|
||||
|
||||
std::string NamePspButtonFromKey(int deviceId, int key)
|
||||
{
|
||||
return GetPspButtonName(KeyToPspButton(deviceId, key));
|
||||
}
|
||||
|
||||
int SetKeyMapping(int map, int deviceId, int key, int btn)
|
||||
{
|
||||
if (IsMappedKey(deviceId, key)) {
|
||||
// TODO: Remove the existing mapping instead, less annoying.
|
||||
return KEYMAP_ERROR_KEY_ALREADY_USED;
|
||||
} else {
|
||||
controllerMaps[map].keys[KeyDef(deviceId, key)] = btn;
|
||||
}
|
||||
|
||||
// all psp buttons are mapped from some key
|
||||
// but it appears we do not have a name
|
||||
// for this key.
|
||||
return unknown_key_name;
|
||||
}
|
||||
|
||||
int KeyMap::SetKeyMapping(int key, int btn)
|
||||
{
|
||||
if (KeyMap::IsMappedKey(key))
|
||||
return KEYMAP_ERROR_KEY_ALREADY_USED;
|
||||
|
||||
g_Config.iMappingMap[key] = btn;
|
||||
return btn;
|
||||
}
|
||||
|
||||
int KeyMap::RegisterPlatformDefaultKeyMap(std::map<int,int> *overriding_map)
|
||||
{
|
||||
if (overriding_map == NULL)
|
||||
return 1;
|
||||
platform_keymap = overriding_map;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void KeyMap::DeregisterPlatformDefaultKeyMap()
|
||||
{
|
||||
platform_keymap = NULL;
|
||||
return;
|
||||
}
|
||||
} // KeyMap
|
||||
|
||||
std::vector<ControllerMap> controllerMaps = KeyMap::DefaultKeyMap::KeyMap;
|
||||
Reference in new issue
Block a user