diff --git a/apps/openmw/mwinput/bindingsmanager.cpp b/apps/openmw/mwinput/bindingsmanager.cpp index a6bab19673a..339ebf4276f 100644 --- a/apps/openmw/mwinput/bindingsmanager.cpp +++ b/apps/openmw/mwinput/bindingsmanager.cpp @@ -1,5 +1,7 @@ #include "bindingsmanager.hpp" +#include + #include #include @@ -77,12 +79,7 @@ namespace MWInput // Disallow binding escape key if (key == SDL_SCANCODE_ESCAPE) { - // Unbind if esc pressed - if (mDetectingKeyboard) - clearAllKeyBindings(mInputBinder, control); - else - clearAllControllerBindings(mInputBinder, control); - control->setInitialValue(0.0f); + // Stop binding if esc pressed mInputBinder->cancelDetectingBindingState(); MWBase::Environment::get().getWindowManager()->notifyInputActionBound(); return; @@ -159,14 +156,7 @@ namespace MWInput return; clearAllControllerBindings(mInputBinder, control); control->setInitialValue(0.0f); - 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); + ICS::DetectingBindingListener::joystickButtonBindingDetected(ICS, deviceID, control, button, direction); MWBase::Environment::get().getWindowManager()->notifyInputActionBound(); } @@ -190,11 +180,8 @@ namespace MWInput mListener = std::make_unique(mInputBinder.get(), this); mInputBinder->setDetectingBindingListener(mListener.get()); - if (!userFileExists) - { - loadKeyDefaults(); - loadControllerDefaults(); - } + loadKeyDefaults(); + loadControllerDefaults(); for (int i = 0; i < A_Last; ++i) { @@ -209,13 +196,22 @@ namespace MWInput BindingsManager::~BindingsManager() { + const std::string newFileName = Files::pathToUnicodeString(mUserFile) + ".new"; try { - mInputBinder->save(Files::pathToUnicodeString(mUserFile)); + if (mInputBinder->save(newFileName)) + { + std::filesystem::rename(Files::pathFromUnicodeString(newFileName), mUserFile); + Log(Debug::Info) << "Saved input bindings: " << mUserFile; + } + else + { + Log(Debug::Error) << "Failed to save input bindings to " << newFileName; + } } - catch (std::exception& e) + catch (const std::exception& e) { - Log(Debug::Error) << "Failed to save input bindings: " << e.what(); + Log(Debug::Error) << "Failed to save input bindings to " << newFileName << ": " << e.what(); } } diff --git a/extern/oics/ICSInputControlSystem.cpp b/extern/oics/ICSInputControlSystem.cpp index 7d92d9ee077..e64fef0fc60 100644 --- a/extern/oics/ICSInputControlSystem.cpp +++ b/extern/oics/ICSInputControlSystem.cpp @@ -357,14 +357,9 @@ namespace ICS return file.substr(0, file.find_last_of(".")); } - bool InputControlSystem::save(std::string fileName) + bool InputControlSystem::save(const std::string& fileName) { - if(fileName != "") - { - mFileName = fileName; - } - - TiXmlDocument doc( mFileName.c_str() ); + TiXmlDocument doc(fileName.c_str()); TiXmlDeclaration dec; dec.Parse( "", 0, TIXML_ENCODING_UNKNOWN ); diff --git a/extern/oics/ICSInputControlSystem.h b/extern/oics/ICSInputControlSystem.h index 97ab8d2edfa..f0736409c91 100644 --- a/extern/oics/ICSInputControlSystem.h +++ b/extern/oics/ICSInputControlSystem.h @@ -84,11 +84,11 @@ namespace ICS // in seconds void update(float timeSinceLastFrame); - inline Channel* getChannel(int i){ return mChannels[i]; }; + Channel* getChannel(int i){ return mChannels.at(i); }; float getChannelValue(int i); inline int getChannelCount(){ return (int)mChannels.size(); }; - inline Control* getControl(int i){ return mControls[i]; }; + Control* getControl(int i){ return mControls.at(i); }; float getControlValue(int i); inline int getControlCount(){ return (int)mControls.size(); }; inline void addControl(Control* control){ mControls.push_back(control); }; @@ -144,7 +144,7 @@ namespace ICS void cancelDetectingBindingState(); bool detectingBindingState(); - bool save(std::string fileName = ""); + bool save(const std::string& fileName); void adjustMouseRegion (Uint16 width, Uint16 height);