@@ -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 :
0 commit comments