Skip to content

Commit dbbd945

Browse files
committed
Merge branch 'master' into 'master'
Consistency Fix for L2/R2 in Controller Menus Feature Closes #8733 See merge request OpenMW/openmw!5290
2 parents 9cc3ead + a4b32fc commit dbbd945

5 files changed

Lines changed: 61 additions & 8 deletions

File tree

apps/openmw/mwinput/controllermanager.cpp

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ namespace MWInput
3333
, mGuiCursorEnabled(true)
3434
, mJoystickLastUsed(false)
3535
, mGamepadMousePressed(false)
36+
, mLeftTriggerGuiPressed(false)
37+
, mRightTriggerGuiPressed(false)
3638
{
3739
if (!controllerBindingsFile.empty())
3840
{
@@ -340,21 +342,37 @@ namespace MWInput
340342

341343
bool ControllerManager::gamepadToGuiControl(const SDL_ControllerAxisEvent& arg)
342344
{
345+
const int triggerPressThreshold = Settings::gui().mControllerTriggerPressThreshold;
346+
const int rawTriggerReleaseThreshold = Settings::gui().mControllerTriggerReleaseThreshold;
347+
const int triggerReleaseThreshold = std::clamp(rawTriggerReleaseThreshold, 0, triggerPressThreshold - 1);
348+
349+
auto handleTriggerPress = [&](Sint16 value, bool& triggerGuiPressed, const auto& onPress) {
350+
if (value >= triggerPressThreshold && !triggerGuiPressed)
351+
{
352+
onPress();
353+
triggerGuiPressed = true;
354+
}
355+
else if (value <= triggerReleaseThreshold)
356+
{
357+
triggerGuiPressed = false;
358+
}
359+
};
360+
343361
MWBase::WindowManager* winMgr = MWBase::Environment::get().getWindowManager();
344362

345363
if (Settings::gui().mControllerMenus)
346364
{
347365
// Left and right triggers toggle through open GUI windows.
348366
if (arg.axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT)
349367
{
350-
if (arg.value == 32767) // Treat like a button.
351-
winMgr->cycleActiveControllerWindow(true);
368+
handleTriggerPress(
369+
arg.value, mRightTriggerGuiPressed, [&] { winMgr->cycleActiveControllerWindow(true); });
352370
return true;
353371
}
354372
else if (arg.axis == SDL_CONTROLLER_AXIS_TRIGGERLEFT)
355373
{
356-
if (arg.value == 32767) // Treat like a button.
357-
winMgr->cycleActiveControllerWindow(false);
374+
handleTriggerPress(
375+
arg.value, mLeftTriggerGuiPressed, [&] { winMgr->cycleActiveControllerWindow(false); });
358376
return true;
359377
}
360378

@@ -402,12 +420,12 @@ namespace MWInput
402420
switch (arg.axis)
403421
{
404422
case SDL_CONTROLLER_AXIS_TRIGGERRIGHT:
405-
if (arg.value == 32767) // Treat like a button.
406-
winMgr->injectKeyPress(MyGUI::KeyCode::Minus, 0, false);
423+
handleTriggerPress(arg.value, mRightTriggerGuiPressed,
424+
[&] { winMgr->injectKeyPress(MyGUI::KeyCode::Minus, 0, false); });
407425
break;
408426
case SDL_CONTROLLER_AXIS_TRIGGERLEFT:
409-
if (arg.value == 32767) // Treat like a button.
410-
winMgr->injectKeyPress(MyGUI::KeyCode::Equals, 0, false);
427+
handleTriggerPress(arg.value, mLeftTriggerGuiPressed,
428+
[&] { winMgr->injectKeyPress(MyGUI::KeyCode::Equals, 0, false); });
411429
break;
412430
case SDL_CONTROLLER_AXIS_LEFTX:
413431
case SDL_CONTROLLER_AXIS_LEFTY:

apps/openmw/mwinput/controllermanager.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ namespace MWInput
6868
bool mGuiCursorEnabled;
6969
bool mJoystickLastUsed;
7070
bool mGamepadMousePressed;
71+
bool mLeftTriggerGuiPressed;
72+
bool mRightTriggerGuiPressed;
7173
};
7274
}
7375
#endif

components/settings/categories/gui.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ namespace Settings
2424
SettingValue<float> mTooltipDelay{ mIndex, "GUI", "tooltip delay", makeMaxSanitizerFloat(0) };
2525
SettingValue<bool> mStretchMenuBackground{ mIndex, "GUI", "stretch menu background" };
2626
SettingValue<bool> mControllerMenus{ mIndex, "GUI", "controller menus" };
27+
SettingValue<int> mControllerTriggerPressThreshold{ mIndex, "GUI", "controller trigger press",
28+
makeClampSanitizerInt(1, 32767) };
29+
SettingValue<int> mControllerTriggerReleaseThreshold{ mIndex, "GUI", "controller trigger release",
30+
makeClampSanitizerInt(0, 32766) };
2731
SettingValue<bool> mControllerTooltips{ mIndex, "GUI", "controller tooltips" };
2832
SettingValue<bool> mSubtitles{ mIndex, "GUI", "subtitles" };
2933
SettingValue<bool> mHitFader{ mIndex, "GUI", "hit fader" };

docs/source/reference/modding/settings/GUI.rst

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,28 @@ GUI Settings
8181
tooltips, similar to Oblivion Remastered. Mouse input remains fully supported.
8282
If false, the controller works as a GUI mouse.
8383

84+
.. omw-setting::
85+
:title: controller trigger press
86+
:type: int
87+
:range: 1, 32767
88+
:default: 30720
89+
90+
Sets how far the triggers (L2/R2) must be pulled before controller menus
91+
recognize them as a button press.
92+
The default value is 15/16ths depressed.
93+
94+
.. omw-setting::
95+
:title: controller trigger release
96+
:type: int
97+
:range: 0, 32766
98+
:default: 26624
99+
100+
Sets how far the triggers (L2/R2) must be released before their latch
101+
is reset and it can be pressed again in controller menus.
102+
This value must be less than controller trigger press.
103+
If it is not, it will be clamped to controller trigger press - 1.
104+
The default value is 13/16ths depressed.
105+
84106
.. omw-setting::
85107
:title: controller tooltips
86108
:type: boolean

files/settings-default.cfg

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,13 @@ stretch menu background = false
204204
# Make menus easier to navigate with a controller.
205205
controller menus = false
206206

207+
# Trigger axis value required to count as pressed for controller menu actions. Value from 1-32767.
208+
controller trigger press = 30720
209+
210+
# Trigger axis value below which the trigger is considered released again. Value from 0-32766.
211+
# This value must be less than the value of trigger press. If not, it will be clamped to trigger press - 1.
212+
controller trigger release = 26624
213+
207214
# When true, you do not need to press R3 to show tooltips.
208215
controller tooltips = false
209216

0 commit comments

Comments
 (0)