VMManager: Support per-game controller settings

Global bindings will be ignored in such a case.
This commit is contained in:
Connor McLaughlin 2022-08-07 18:45:13 +10:00 committed by refractionpcsx2
parent 2e303da384
commit be3f120548
1 changed files with 29 additions and 17 deletions

View File

@ -439,8 +439,13 @@ bool VMManager::UpdateGameSettingsLayer()
} }
std::string input_profile_name; std::string input_profile_name;
bool use_game_settings_for_controller = false;
if (new_interface) if (new_interface)
new_interface->GetStringValue("EmuCore", "InputProfileName", &input_profile_name); {
new_interface->GetBoolValue("Pad", "UseGameSettingsForController", &use_game_settings_for_controller);
if (!use_game_settings_for_controller)
new_interface->GetStringValue("EmuCore", "InputProfileName", &input_profile_name);
}
if (!s_game_settings_interface && !new_interface && s_input_profile_name == input_profile_name) if (!s_game_settings_interface && !new_interface && s_input_profile_name == input_profile_name)
return false; return false;
@ -449,32 +454,39 @@ bool VMManager::UpdateGameSettingsLayer()
s_game_settings_interface = std::move(new_interface); s_game_settings_interface = std::move(new_interface);
std::unique_ptr<INISettingsInterface> input_interface; std::unique_ptr<INISettingsInterface> input_interface;
if (!input_profile_name.empty()) if (!use_game_settings_for_controller)
{ {
const std::string filename(GetInputProfilePath(input_profile_name)); if (!input_profile_name.empty())
if (FileSystem::FileExists(filename.c_str()))
{ {
Console.WriteLn("Loading input profile from '%s'...", filename.c_str()); const std::string filename(GetInputProfilePath(input_profile_name));
input_interface = std::make_unique<INISettingsInterface>(std::move(filename)); if (FileSystem::FileExists(filename.c_str()))
if (!input_interface->Load())
{ {
Console.Error("Failed to parse input profile ini '%s'", input_interface->GetFileName().c_str()); Console.WriteLn("Loading input profile from '%s'...", filename.c_str());
input_interface.reset(); input_interface = std::make_unique<INISettingsInterface>(std::move(filename));
if (!input_interface->Load())
{
Console.Error("Failed to parse input profile ini '%s'", input_interface->GetFileName().c_str());
input_interface.reset();
input_profile_name = {};
}
}
else
{
DevCon.WriteLn("No game settings found (tried '%s')", filename.c_str());
input_profile_name = {}; input_profile_name = {};
} }
} }
else
{ Host::Internal::SetInputSettingsLayer(input_interface.get());
DevCon.WriteLn("No game settings found (tried '%s')", filename.c_str()); }
input_profile_name = {}; else
} {
// using game settings for bindings too
Host::Internal::SetInputSettingsLayer(s_game_settings_interface.get());
} }
Host::Internal::SetInputSettingsLayer(input_interface.get());
s_input_settings_interface = std::move(input_interface); s_input_settings_interface = std::move(input_interface);
s_input_profile_name = std::move(input_profile_name); s_input_profile_name = std::move(input_profile_name);
return true; return true;
} }