diff --git a/apps/openmw/mwinput/bindingsmanager.cpp b/apps/openmw/mwinput/bindingsmanager.cpp index 27355ec4a9..3f505896f4 100644 --- a/apps/openmw/mwinput/bindingsmanager.cpp +++ b/apps/openmw/mwinput/bindingsmanager.cpp @@ -77,7 +77,12 @@ namespace MWInput // Disallow binding escape key if (key == SDL_SCANCODE_ESCAPE) { - // Stop binding if esc pressed + // Unbind if esc pressed + if (mDetectingKeyboard) + clearAllKeyBindings(mInputBinder, control); + else + clearAllControllerBindings(mInputBinder, control); + control->setInitialValue(0.0f); mInputBinder->cancelDetectingBindingState(); MWBase::Environment::get().getWindowManager()->notifyInputActionBound(); return; @@ -154,7 +159,14 @@ namespace MWInput return; clearAllControllerBindings(mInputBinder, control); control->setInitialValue(0.0f); - ICS::DetectingBindingListener::joystickButtonBindingDetected(ICS, deviceID, control, button, direction); + if (button == SDL_CONTROLLER_BUTTON_START) + { + // Disallow rebinding SDL_CONTROLLER_BUTTON_START - it is used to open main and without it is not + // even possible to exit the game (or change the binding back). + mInputBinder->cancelDetectingBindingState(); + } + else + ICS::DetectingBindingListener::joystickButtonBindingDetected(ICS, deviceID, control, button, direction); MWBase::Environment::get().getWindowManager()->notifyInputActionBound(); } @@ -178,8 +190,11 @@ namespace MWInput mListener = std::make_unique(mInputBinder.get(), this); mInputBinder->setDetectingBindingListener(mListener.get()); - loadKeyDefaults(); - loadControllerDefaults(); + if (!userFileExists) + { + loadKeyDefaults(); + loadControllerDefaults(); + } for (int i = 0; i < A_Last; ++i) {