Skip to content

Commit

Permalink
Merge branch 'input_bindings' into 'master'
Browse files Browse the repository at this point in the history
Fix input bindings handling (#8115)

Closes #8115

See merge request OpenMW/openmw!4332
  • Loading branch information
psi29a committed Sep 5, 2024
2 parents 4c28731 + 58b72e3 commit 46cbee2
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 32 deletions.
40 changes: 18 additions & 22 deletions apps/openmw/mwinput/bindingsmanager.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#include "bindingsmanager.hpp"

#include <filesystem>

#include <MyGUI_EditBox.h>

#include <extern/oics/ICSChannelListener.h>
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}

Expand All @@ -190,11 +180,8 @@ namespace MWInput
mListener = std::make_unique<BindingsListener>(mInputBinder.get(), this);
mInputBinder->setDetectingBindingListener(mListener.get());

if (!userFileExists)
{
loadKeyDefaults();
loadControllerDefaults();
}
loadKeyDefaults();
loadControllerDefaults();

for (int i = 0; i < A_Last; ++i)
{
Expand All @@ -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();
}
}

Expand Down
9 changes: 2 additions & 7 deletions extern/oics/ICSInputControlSystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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( "<?xml version='1.0' encoding='utf-8'?>", 0, TIXML_ENCODING_UNKNOWN );
Expand Down
6 changes: 3 additions & 3 deletions extern/oics/ICSInputControlSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -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); };
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit 46cbee2

Please sign in to comment.