diff --git a/Core/Config.cpp b/Core/Config.cpp index 305098f47cdd..b6802edc50fb 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1000,6 +1000,8 @@ static ConfigSetting controlSettings[] = { #endif ConfigSetting("DisableDpadDiagonals", &g_Config.bDisableDpadDiagonals, false, true, true), + ConfigSetting("TouchAnalogBehaviour", &g_Config.iTouchAnalogBehaviour, 0, true, true), + ConfigSetting("GamepadOnlyFocused", &g_Config.bGamepadOnlyFocused, false, true, true), ConfigSetting("TouchButtonStyle", &g_Config.iTouchButtonStyle, 1, true, true), ConfigSetting("TouchButtonOpacity", &g_Config.iTouchButtonOpacity, 65, true, true), diff --git a/Core/Config.h b/Core/Config.h index 7bbbf27984ae..2d51b1ee305f 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -40,6 +40,12 @@ enum ChatPositions { CENTER_RIGHT = 7, }; +enum TouchAnalogBehaviour { + IGNORE_ALL = 0, + IGNORE_DPAD = 1, + PRESS_ALL = 2, +}; + namespace http { class Download; class Downloader; @@ -334,6 +340,10 @@ struct Config { // Disable diagonals bool bDisableDpadDiagonals; bool bGamepadOnlyFocused; + + // Drag analog behaviour + int iTouchAnalogBehaviour; + // Control Style int iTouchButtonStyle; int iTouchButtonOpacity; diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 99fb151b9f9e..afa903845e2b 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -754,6 +754,11 @@ void GameSettingsScreen::CreateViews() { CheckBox *disableDiags = controlsSettings->Add(new CheckBox(&g_Config.bDisableDpadDiagonals, co->T("Disable D-Pad diagonals (4-way touch)"))); disableDiags->SetEnabledPtr(&g_Config.bShowTouchControls); + + static const char *analogBehaviors[] = {"Don't press other button", "Don't press DPAD only", "Press all button" }; + PopupMultiChoice *analogBehaviour = controlsSettings->Add(new PopupMultiChoice(&g_Config.iTouchAnalogBehaviour, co->T("Touch Analog Drag Behaviour"), analogBehaviors, 0, ARRAY_SIZE(analogBehaviors), co->GetName(), screenManager())); + analogBehaviour->SetEnabledPtr(&g_Config.bShowTouchControls); + PopupSliderChoice *opacity = controlsSettings->Add(new PopupSliderChoice(&g_Config.iTouchButtonOpacity, 0, 100, co->T("Button Opacity"), screenManager(), "%")); opacity->SetEnabledPtr(&g_Config.bShowTouchControls); opacity->SetFormat("%i%%"); diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index 4089dc939064..59287916923c 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -103,7 +103,7 @@ void MultiTouchButton::Touch(const TouchInput &input) { usedPointerMask |= 1 << input.id; } if (input.flags & TOUCH_MOVE) { - if (bounds_.Contains(input.x, input.y) && !(analogPointerMask & (1 << input.id))) + if (bounds_.Contains(input.x, input.y) && (!(analogPointerMask & (1 << input.id)) || g_Config.iTouchAnalogBehaviour != IGNORE_ALL)) pointerDownMask_ |= 1 << input.id; else pointerDownMask_ &= ~(1 << input.id); @@ -242,7 +242,7 @@ void PSPDpad::Touch(const TouchInput &input) { } } if (input.flags & TOUCH_MOVE) { - if (dragPointerId_ == -1 && bounds_.Contains(input.x, input.y) && !(analogPointerMask & (1 << input.id))) { + if (dragPointerId_ == -1 && bounds_.Contains(input.x, input.y) && (!(analogPointerMask & (1 << input.id)) || g_Config.iTouchAnalogBehaviour == PRESS_ALL)) { dragPointerId_ = input.id; } if (input.id == dragPointerId_) {