Merge branch 'master' into 'master'

Consistency Fix for L2/R2 in Controller Menus Feature

Closes #8733

See merge request OpenMW/openmw!5290
This commit is contained in:
Alexei Kotov
2026-05-06 04:29:11 +03:00
5 changed files with 61 additions and 8 deletions
+26 -8
View File
@@ -33,6 +33,8 @@ namespace MWInput
, mGuiCursorEnabled(true)
, mJoystickLastUsed(false)
, mGamepadMousePressed(false)
, mLeftTriggerGuiPressed(false)
, mRightTriggerGuiPressed(false)
{
if (!controllerBindingsFile.empty())
{
@@ -340,6 +342,22 @@ namespace MWInput
bool ControllerManager::gamepadToGuiControl(const SDL_ControllerAxisEvent& arg)
{
const int triggerPressThreshold = Settings::gui().mControllerTriggerPressThreshold;
const int rawTriggerReleaseThreshold = Settings::gui().mControllerTriggerReleaseThreshold;
const int triggerReleaseThreshold = std::clamp(rawTriggerReleaseThreshold, 0, triggerPressThreshold - 1);
auto handleTriggerPress = [&](Sint16 value, bool& triggerGuiPressed, const auto& onPress) {
if (value >= triggerPressThreshold && !triggerGuiPressed)
{
onPress();
triggerGuiPressed = true;
}
else if (value <= triggerReleaseThreshold)
{
triggerGuiPressed = false;
}
};
MWBase::WindowManager* winMgr = MWBase::Environment::get().getWindowManager();
if (Settings::gui().mControllerMenus)
@@ -347,14 +365,14 @@ namespace MWInput
// Left and right triggers toggle through open GUI windows.
if (arg.axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT)
{
if (arg.value == 32767) // Treat like a button.
winMgr->cycleActiveControllerWindow(true);
handleTriggerPress(
arg.value, mRightTriggerGuiPressed, [&] { winMgr->cycleActiveControllerWindow(true); });
return true;
}
else if (arg.axis == SDL_CONTROLLER_AXIS_TRIGGERLEFT)
{
if (arg.value == 32767) // Treat like a button.
winMgr->cycleActiveControllerWindow(false);
handleTriggerPress(
arg.value, mLeftTriggerGuiPressed, [&] { winMgr->cycleActiveControllerWindow(false); });
return true;
}
@@ -402,12 +420,12 @@ namespace MWInput
switch (arg.axis)
{
case SDL_CONTROLLER_AXIS_TRIGGERRIGHT:
if (arg.value == 32767) // Treat like a button.
winMgr->injectKeyPress(MyGUI::KeyCode::Minus, 0, false);
handleTriggerPress(arg.value, mRightTriggerGuiPressed,
[&] { winMgr->injectKeyPress(MyGUI::KeyCode::Minus, 0, false); });
break;
case SDL_CONTROLLER_AXIS_TRIGGERLEFT:
if (arg.value == 32767) // Treat like a button.
winMgr->injectKeyPress(MyGUI::KeyCode::Equals, 0, false);
handleTriggerPress(arg.value, mLeftTriggerGuiPressed,
[&] { winMgr->injectKeyPress(MyGUI::KeyCode::Equals, 0, false); });
break;
case SDL_CONTROLLER_AXIS_LEFTX:
case SDL_CONTROLLER_AXIS_LEFTY:
@@ -68,6 +68,8 @@ namespace MWInput
bool mGuiCursorEnabled;
bool mJoystickLastUsed;
bool mGamepadMousePressed;
bool mLeftTriggerGuiPressed;
bool mRightTriggerGuiPressed;
};
}
#endif
+4
View File
@@ -24,6 +24,10 @@ namespace Settings
SettingValue<float> mTooltipDelay{ mIndex, "GUI", "tooltip delay", makeMaxSanitizerFloat(0) };
SettingValue<bool> mStretchMenuBackground{ mIndex, "GUI", "stretch menu background" };
SettingValue<bool> mControllerMenus{ mIndex, "GUI", "controller menus" };
SettingValue<int> mControllerTriggerPressThreshold{ mIndex, "GUI", "controller trigger press",
makeClampSanitizerInt(1, 32767) };
SettingValue<int> mControllerTriggerReleaseThreshold{ mIndex, "GUI", "controller trigger release",
makeClampSanitizerInt(0, 32766) };
SettingValue<bool> mControllerTooltips{ mIndex, "GUI", "controller tooltips" };
SettingValue<bool> mSubtitles{ mIndex, "GUI", "subtitles" };
SettingValue<bool> mHitFader{ mIndex, "GUI", "hit fader" };
@@ -81,6 +81,28 @@ GUI Settings
tooltips, similar to Oblivion Remastered. Mouse input remains fully supported.
If false, the controller works as a GUI mouse.
.. omw-setting::
:title: controller trigger press
:type: int
:range: 1, 32767
:default: 30720
Sets how far the triggers (L2/R2) must be pulled before controller menus
recognize them as a button press.
The default value is 15/16ths depressed.
.. omw-setting::
:title: controller trigger release
:type: int
:range: 0, 32766
:default: 26624
Sets how far the triggers (L2/R2) must be released before their latch
is reset and it can be pressed again in controller menus.
This value must be less than controller trigger press.
If it is not, it will be clamped to controller trigger press - 1.
The default value is 13/16ths depressed.
.. omw-setting::
:title: controller tooltips
:type: boolean
+7
View File
@@ -204,6 +204,13 @@ stretch menu background = false
# Make menus easier to navigate with a controller.
controller menus = false
# Trigger axis value required to count as pressed for controller menu actions. Value from 1-32767.
controller trigger press = 30720
# Trigger axis value below which the trigger is considered released again. Value from 0-32766.
# This value must be less than the value of trigger press. If not, it will be clamped to trigger press - 1.
controller trigger release = 26624
# When true, you do not need to press R3 to show tooltips.
controller tooltips = false