From edb0614a5912c968a80c4d94932504673154bebe Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sat, 17 Aug 2013 11:18:45 +0200 Subject: [PATCH] Fix analog axis names. Make L2/R2 on x360 controllers analog. Also slightly nicer behaviour - don't create empty mapping, instead ask for mappings immediately. --- Common/KeyMap.cpp | 43 +++++++++++++++++++++++++------------ Common/KeyMap.h | 11 +++++----- UI/ControlMappingScreen.cpp | 13 ++++++----- Windows/ControlMapping.h | 3 --- Windows/XinputDevice.cpp | 23 ++++++++++++++------ 5 files changed, 58 insertions(+), 35 deletions(-) diff --git a/Common/KeyMap.cpp b/Common/KeyMap.cpp index 4c245eaed4..c082b1c173 100644 --- a/Common/KeyMap.cpp +++ b/Common/KeyMap.cpp @@ -77,9 +77,10 @@ static const DefMappingStruct default360KeyMap[] = { {CTRL_SELECT , NKCODE_BUTTON_SELECT}, {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_UNTHROTTLE , NKCODE_BUTTON_R2}, + {VIRTKEY_UNTHROTTLE , JOYSTICK_AXIS_RTRIGGER, +1}, {VIRTKEY_PAUSE , NKCODE_BUTTON_THUMBR}, {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, + {VIRTKEY_PAUSE, NKCODE_HOME}, }; static const DefMappingStruct defaultShieldKeyMap[] = { @@ -391,33 +392,33 @@ const KeyMap_IntStrPair axis_names[] = { static std::string unknown_key_name = "??"; const KeyMap_IntStrPair psp_button_names[] = { - {CTRL_CIRCLE, "Circle"}, - {CTRL_CROSS, "Cross"}, - {CTRL_SQUARE, "Square"}, - {CTRL_TRIANGLE, "Triangle"}, - {CTRL_LTRIGGER, "L"}, - {CTRL_RTRIGGER, "R"}, - {CTRL_START, "Start"}, - {CTRL_SELECT, "Select"}, {CTRL_UP, "Up"}, {CTRL_DOWN, "Down"}, {CTRL_LEFT, "Left"}, {CTRL_RIGHT, "Right"}, + {CTRL_CIRCLE, "Circle"}, + {CTRL_CROSS, "Cross"}, + {CTRL_SQUARE, "Square"}, + {CTRL_TRIANGLE, "Triangle"}, + {CTRL_START, "Start"}, + {CTRL_SELECT, "Select"}, + {CTRL_LTRIGGER, "L"}, + {CTRL_RTRIGGER, "R"}, {VIRTKEY_AXIS_X_MIN, "An.Left"}, {VIRTKEY_AXIS_X_MAX, "An.Right"}, {VIRTKEY_AXIS_Y_MIN, "An.Down"}, {VIRTKEY_AXIS_Y_MAX, "An.Up"}, - {VIRTKEY_AXIS_RIGHT_X_MIN, "RightAn.Left"}, - {VIRTKEY_AXIS_RIGHT_X_MAX, "RightAn.Right"}, - {VIRTKEY_AXIS_RIGHT_Y_MIN, "RightAn.Down"}, - {VIRTKEY_AXIS_RIGHT_Y_MAX, "RightAn.Up"}, - {VIRTKEY_RAPID_FIRE, "RapidFire"}, {VIRTKEY_UNTHROTTLE, "Unthrottle"}, {VIRTKEY_SPEED_TOGGLE, "SpeedToggle"}, {VIRTKEY_PAUSE, "Pause"}, + + {VIRTKEY_AXIS_RIGHT_X_MIN, "RightAn.Left"}, + {VIRTKEY_AXIS_RIGHT_X_MAX, "RightAn.Right"}, + {VIRTKEY_AXIS_RIGHT_Y_MIN, "RightAn.Down"}, + {VIRTKEY_AXIS_RIGHT_Y_MAX, "RightAn.Up"}, }; const int AXIS_BIND_NKCODE_START = 4000; @@ -434,6 +435,20 @@ std::string GetKeyName(int keyCode) { return FindName(keyCode, key_names, ARRAY_SIZE(key_names)); } +std::string GetKeyOrAxisName(int keyCode) { + if (keyCode >= AXIS_BIND_NKCODE_START) { + int direction; + int axis = TranslateKeyCodeToAxis(keyCode, direction); + std::string temp = GetAxisName(axis); + if (direction == 1) + temp += "+"; + else if (direction == -1) + temp += "-"; + return temp; + } + return FindName(keyCode, key_names, ARRAY_SIZE(key_names)); +} + std::string GetAxisName(int axisId) { return FindName(axisId, axis_names, ARRAY_SIZE(axis_names)); } diff --git a/Common/KeyMap.h b/Common/KeyMap.h index dbbeb5c5c9..40a7cbc3cf 100644 --- a/Common/KeyMap.h +++ b/Common/KeyMap.h @@ -113,6 +113,8 @@ namespace KeyMap { // Use if you need to display the textual name std::string GetKeyName(int keyCode); + std::string GetKeyOrAxisName(int keyCode); + std::string GetAxisName(int axisId); std::string GetPspButtonName(int btn); std::vector GetMappableKeys(); @@ -124,12 +126,10 @@ namespace KeyMap { // Returns KEYMAP_ERROR_UNKNOWN_KEY // for any unmapped key int KeyToPspButton(int deviceId, int key); - - int TranslateKeyCodeFromAxis(int axisId, int direction); - bool KeyFromPspButton(int btn, std::vector *keys); - std::string NameKeyFromPspButton(int btn); - std::string NameDeviceFromPspButton(int btn); + + int TranslateKeyCodeToAxis(int keyCode, int &direction); + int TranslateKeyCodeFromAxis(int axisId, int direction); // Configure the key mapping. // Any configuration will be saved to the Core config. @@ -139,7 +139,6 @@ namespace KeyMap { // Direction is negative or positive. void SetAxisMapping(int btn, int deviceId, int axisId, int direction, bool replace); - std::string GetAxisName(int axisId); int AxisToPspButton(int deviceId, int axisId, int direction); bool AxisFromPspButton(int btn, int *deviceId, int *axisId, int *direction); std::string NamePspButtonFromAxis(int deviceId, int axisId, int direction); diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 96b1f0d226..fd853e51f7 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -92,7 +92,7 @@ void ControlMapper::Refresh() { for (size_t i = 0; i < mappings.size(); i++) { std::string deviceName = GetDeviceName(mappings[i].deviceId); - std::string keyName = KeyMap::GetKeyName(mappings[i].keyCode); + std::string keyName = KeyMap::GetKeyOrAxisName(mappings[i].keyCode); int image = -1; LinearLayout *row = rightColumn->Add(new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); @@ -117,6 +117,9 @@ void ControlMapper::Refresh() { void ControlMapper::MappedCallback(KeyDef kdf) { switch (action_) { + case ADD: + KeyMap::SetKeyMapping(pspKey_, kdf, false); + break; case REPLACEALL: KeyMap::SetKeyMapping(pspKey_, kdf, true); break; @@ -141,14 +144,14 @@ UI::EventReturn ControlMapper::OnReplaceAll(UI::EventParams ¶ms) { } UI::EventReturn ControlMapper::OnAdd(UI::EventParams ¶ms) { - KeyMap::g_controllerMap[pspKey_].push_back(KeyDef(0, 0)); - refresh_ = true; + action_ = ADD; + scrm_->push(new KeyMappingNewKeyDialog(pspKey_, true, std::bind(&ControlMapper::MappedCallback, this, placeholder::_1))); return UI::EVENT_DONE; } UI::EventReturn ControlMapper::OnDelete(UI::EventParams ¶ms) { - actionIndex_ = atoi(params.v->Tag().c_str()); - KeyMap::g_controllerMap[pspKey_].erase(KeyMap::g_controllerMap[pspKey_].begin() + actionIndex_); + int index = atoi(params.v->Tag().c_str()); + KeyMap::g_controllerMap[pspKey_].erase(KeyMap::g_controllerMap[pspKey_].begin() + index); refresh_ = true; return UI::EVENT_DONE; } diff --git a/Windows/ControlMapping.h b/Windows/ControlMapping.h index ce495c5899..933a254a07 100644 --- a/Windows/ControlMapping.h +++ b/Windows/ControlMapping.h @@ -19,6 +19,3 @@ #include "InputDevice.h" -#define XBOX_CODE_LEFTTRIGGER 0x00010000 -#define XBOX_CODE_RIGHTTRIGGER 0x00020000 - diff --git a/Windows/XinputDevice.cpp b/Windows/XinputDevice.cpp index 5ab1781eff..a92790a34a 100644 --- a/Windows/XinputDevice.cpp +++ b/Windows/XinputDevice.cpp @@ -74,8 +74,6 @@ static void UnloadXInputDLL() { // Permanent map. Actual mapping happens elsewhere. static const struct {int from, to;} xinput_ctrl_map[] = { - {XBOX_CODE_LEFTTRIGGER, NKCODE_BUTTON_L2}, - {XBOX_CODE_RIGHTTRIGGER, NKCODE_BUTTON_R2}, {XINPUT_GAMEPAD_A, NKCODE_BUTTON_A}, {XINPUT_GAMEPAD_B, NKCODE_BUTTON_B}, {XINPUT_GAMEPAD_X, NKCODE_BUTTON_X}, @@ -165,6 +163,22 @@ int XinputDevice::UpdateState(InputState &input_state) { NativeAxis(axis); } + if (prevState.Gamepad.bLeftTrigger != state.Gamepad.bLeftTrigger) { + AxisInput axis; + axis.deviceId = DEVICE_ID_X360_0; + axis.axisId = JOYSTICK_AXIS_LTRIGGER; + axis.value = (float)state.Gamepad.bLeftTrigger / 255.0f; + NativeAxis(axis); + } + + if (prevState.Gamepad.bRightTrigger != state.Gamepad.bRightTrigger) { + AxisInput axis; + axis.deviceId = DEVICE_ID_X360_0; + axis.axisId = JOYSTICK_AXIS_RTRIGGER; + axis.value = (float)state.Gamepad.bRightTrigger / 255.0f; + NativeAxis(axis); + } + this->prevState = state; this->check_delay = 0; @@ -212,11 +226,6 @@ static Stick NormalizedDeadzoneFilter(short x, short y) { void XinputDevice::ApplyButtons(XINPUT_STATE &state, InputState &input_state) { u32 buttons = state.Gamepad.wButtons; - if (state.Gamepad.bLeftTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD) - buttons |= XBOX_CODE_LEFTTRIGGER; - if (state.Gamepad.bRightTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD) - buttons |= XBOX_CODE_RIGHTTRIGGER; - u32 downMask = buttons & (~prevButtons); u32 upMask = (~buttons) & prevButtons; prevButtons = buttons;