Skip to content

Commit

Permalink
Merge pull request #7063 from Pulfer/axis-swap
Browse files Browse the repository at this point in the history
Add a hotkey to swap D-pad and left analog stick keys
  • Loading branch information
hrydgard committed Dec 18, 2014
2 parents 5460f7c + 35d0149 commit cd573cf
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 2 deletions.
36 changes: 34 additions & 2 deletions Common/KeyMap.cpp
Expand Up @@ -44,6 +44,8 @@ struct DefMappingStruct {
KeyMapping g_controllerMap;
std::set<std::string> g_seenPads;

bool g_swapped_keys = false;

static const DefMappingStruct defaultQwertyKeyboardKeyMap[] = {
{CTRL_SQUARE, NKCODE_A},
{CTRL_TRIANGLE, NKCODE_S},
Expand Down Expand Up @@ -650,6 +652,8 @@ const KeyMap_IntStrPair psp_button_names[] = {
{VIRTKEY_AXIS_RIGHT_Y_MIN, "RightAn.Down"},
{VIRTKEY_AXIS_RIGHT_X_MIN, "RightAn.Left"},
{VIRTKEY_AXIS_RIGHT_X_MAX, "RightAn.Right"},

{VIRTKEY_AXIS_SWAP, "AxisSwap"},
};

const int AXIS_BIND_NKCODE_START = 4000;
Expand Down Expand Up @@ -715,12 +719,36 @@ KeyDef AxisDef(int deviceId, int axisId, int direction) {
return KeyDef(deviceId, TranslateKeyCodeFromAxis(axisId, direction));
}

int CheckAxisSwap(int btn) {
if (g_swapped_keys) {
switch (btn) {
case CTRL_UP: btn = VIRTKEY_AXIS_Y_MAX;
break;
case VIRTKEY_AXIS_Y_MAX: btn = CTRL_UP;
break;
case CTRL_DOWN: btn = VIRTKEY_AXIS_Y_MIN;
break;
case VIRTKEY_AXIS_Y_MIN: btn = CTRL_DOWN;
break;
case CTRL_LEFT: btn = VIRTKEY_AXIS_X_MIN;
break;
case VIRTKEY_AXIS_X_MIN: btn = CTRL_LEFT;
break;
case CTRL_RIGHT: btn = VIRTKEY_AXIS_X_MAX;
break;
case VIRTKEY_AXIS_X_MAX: btn = CTRL_RIGHT;
break;
}
}
return btn;
}

static bool FindKeyMapping(int deviceId, int key, std::vector<int> *psp_button) {
// Brute force, let's optimize later
for (auto iter = g_controllerMap.begin(); iter != g_controllerMap.end(); ++iter) {
for (auto iter2 = iter->second.begin(); iter2 != iter->second.end(); ++iter2) {
if (*iter2 == KeyDef(deviceId, key)) {
psp_button->push_back(iter->first);
psp_button->push_back(CheckAxisSwap(iter->first));
}
}
}
Expand All @@ -747,7 +775,7 @@ bool KeyFromPspButton(int btn, std::vector<KeyDef> *keys) {

bool AxisToPspButton(int deviceId, int axisId, int direction, std::vector<int> *pspKeys) {
int key = TranslateKeyCodeFromAxis(axisId, direction);
return KeyToPspButton(deviceId, key, pspKeys);
return KeyToPspButton(deviceId, key, pspKeys);
}

bool AxisFromPspButton(int btn, int *deviceId, int *axisId, int *direction) {
Expand Down Expand Up @@ -919,5 +947,9 @@ const std::set<std::string> &GetSeenPads() {
return g_seenPads;
}

// Swap direction buttons and left analog axis
void SwapAxis() {
g_swapped_keys = !g_swapped_keys;
}

} // KeyMap
2 changes: 2 additions & 0 deletions Common/KeyMap.h
Expand Up @@ -47,6 +47,7 @@ enum {
VIRTKEY_NEXT_SLOT = 0x1000f,
VIRTKEY_TOGGLE_FULLSCREEN = 0x10010,
VIRTKEY_ANALOG_LIGHTLY = 0x10011,
VIRTKEY_AXIS_SWAP = 0x10012,
VIRTKEY_LAST,
VIRTKEY_COUNT = VIRTKEY_LAST - VIRTKEY_FIRST
};
Expand Down Expand Up @@ -156,6 +157,7 @@ namespace KeyMap {

void RestoreDefault();

void SwapAxis();
void UpdateConfirmCancelKeys();

void NotifyPadConnected(const std::string &name);
Expand Down
4 changes: 4 additions & 0 deletions UI/EmuScreen.cpp
Expand Up @@ -288,6 +288,10 @@ void EmuScreen::onVKeyDown(int virtualKeyCode) {
pauseTrigger_ = true;
break;

case VIRTKEY_AXIS_SWAP:
KeyMap::SwapAxis();
break;

case VIRTKEY_AXIS_X_MIN:
case VIRTKEY_AXIS_X_MAX:
setVKeyAnalogX(CTRL_STICK_LEFT, VIRTKEY_AXIS_X_MIN, VIRTKEY_AXIS_X_MAX);
Expand Down

0 comments on commit cd573cf

Please sign in to comment.