diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index 6b65690337..ff8282e2d5 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -76,6 +76,10 @@ void SingleInputMappingFromPspButton(int btn, std::vector *mapping InputMappingsFromPspButton(btn, &multiMappings, ignoreMouse); mappings->clear(); for (auto &mapping : multiMappings) { + // Ignore combos + if (mapping.mappings.size() > 1) { + continue; + } if (!mapping.empty()) { mappings->push_back(mapping.mappings[0]); } else { @@ -89,6 +93,28 @@ static void InsertIntoVector(std::vector *vec, const InputMapping vec->push_back(mapping); } +// Used to avoid multiple main buttons both being mapped to cancel or confirm. +bool HasMainButtonMapping(const std::vector &mappings) { + for (auto mapping : mappings) { + switch (mapping.keyCode) { + case NKCODE_BUTTON_A: + case NKCODE_BUTTON_B: + case NKCODE_BUTTON_C: + case NKCODE_BUTTON_X: + case NKCODE_BUTTON_Y: + case NKCODE_BUTTON_Z: + case NKCODE_BUTTON_1: + case NKCODE_BUTTON_2: + case NKCODE_BUTTON_3: + case NKCODE_BUTTON_4: + case NKCODE_BUTTON_5: + case NKCODE_BUTTON_6: + return true; + } + } + return false; +} + // TODO: This is such a mess... void UpdateNativeMenuKeys() { std::vector confirmKeys, cancelKeys; @@ -125,7 +151,6 @@ void UpdateNativeMenuKeys() { InputMapping(DEVICE_ID_KEYBOARD, NKCODE_SPACE), InputMapping(DEVICE_ID_KEYBOARD, NKCODE_ENTER), InputMapping(DEVICE_ID_KEYBOARD, NKCODE_NUMPAD_ENTER), - InputMapping(DEVICE_ID_ANY, confirmWithCross ? NKCODE_BUTTON_A : NKCODE_BUTTON_B), InputMapping(DEVICE_ID_PAD_0, NKCODE_DPAD_CENTER), // A number of old obscure Android devices need this. }; @@ -133,17 +158,22 @@ void UpdateNativeMenuKeys() { for (size_t i = 0; i < ARRAY_SIZE(hardcodedConfirmKeys); i++) { InsertIntoVector(&confirmKeys, hardcodedConfirmKeys[i]); } + if (!HasMainButtonMapping(confirmKeys)) { + confirmKeys.push_back(InputMapping(DEVICE_ID_ANY, confirmWithCross ? NKCODE_BUTTON_A : NKCODE_BUTTON_B)); + } const InputMapping hardcodedCancelKeys[] = { InputMapping(DEVICE_ID_KEYBOARD, NKCODE_ESCAPE), InputMapping(DEVICE_ID_ANY, NKCODE_BACK), - InputMapping(DEVICE_ID_ANY, confirmWithCross ? NKCODE_BUTTON_B : NKCODE_BUTTON_A), InputMapping(DEVICE_ID_MOUSE, NKCODE_EXT_MOUSEBUTTON_4), }; for (size_t i = 0; i < ARRAY_SIZE(hardcodedCancelKeys); i++) { InsertIntoVector(&cancelKeys, hardcodedCancelKeys[i]); } + if (!HasMainButtonMapping(cancelKeys)) { + confirmKeys.push_back(InputMapping(DEVICE_ID_ANY, confirmWithCross ? NKCODE_BUTTON_A : NKCODE_BUTTON_B)); + } const InputMapping hardcodedInfoKeys[] = { InputMapping(DEVICE_ID_KEYBOARD, NKCODE_S),