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:
Henrik Rydgard committed 2013-07-06 20:45:44 +02:00
1 parent ab6133e419
commit cc58e34cf8
30 files changed
+671 -1193

No files matched your search

+221 -122
View File
@@ -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;