summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/yuzu/configuration/config.cpp89
-rw-r--r--src/yuzu/configuration/config.h2
-rw-r--r--src/yuzu/configuration/configure_input_per_game.cpp61
-rw-r--r--src/yuzu/configuration/configure_input_per_game.h17
-rw-r--r--src/yuzu/configuration/configure_per_game.cpp2
-rw-r--r--src/yuzu/main.cpp1
6 files changed, 108 insertions, 64 deletions
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 4067ea607..cc1ba9f70 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -124,6 +124,10 @@ void Config::Initialize(const std::string& config_name) {
}
}
+bool Config::IsCustomConfig() {
+ return type == ConfigType::PerGameConfig;
+}
+
/* {Read,Write}BasicSetting and WriteGlobalSetting templates must be defined here before their
* usages later in this file. This allows explicit definition of some types that don't work
* nicely with the general version.
@@ -186,7 +190,7 @@ void Config::WriteGlobalSetting(const Settings::SwitchableSetting<Type, ranged>&
void Config::ReadPlayerValue(std::size_t player_index) {
const QString player_prefix = [this, player_index] {
- if (type == ConfigType::InputProfile && global) {
+ if (type == ConfigType::InputProfile) {
return QString{};
} else {
return QStringLiteral("player_%1_").arg(player_index);
@@ -194,8 +198,20 @@ void Config::ReadPlayerValue(std::size_t player_index) {
}();
auto& player = Settings::values.players.GetValue()[player_index];
+ if (IsCustomConfig()) {
+ const auto profile_name =
+ qt_config->value(QStringLiteral("%1profile_name").arg(player_prefix), QString{})
+ .toString()
+ .toStdString();
+ if (profile_name.empty()) {
+ // Use the global input config
+ player = Settings::values.players.GetValue(true)[player_index];
+ return;
+ }
+ player.profile_name = profile_name;
+ }
- if (player_prefix.isEmpty()) {
+ if (player_prefix.isEmpty() && Settings::IsConfiguringGlobal()) {
const auto controller = static_cast<Settings::ControllerType>(
qt_config
->value(QStringLiteral("%1type").arg(player_prefix),
@@ -244,14 +260,6 @@ void Config::ReadPlayerValue(std::size_t player_index) {
->value(QStringLiteral("%1button_color_right").arg(player_prefix),
Settings::JOYCON_BUTTONS_NEON_RED)
.toUInt();
-
- // This only applies to per-game configs
- if (!global) {
- player.profile_name =
- qt_config->value(QStringLiteral("%1profile_name").arg(player_prefix), QString{})
- .toString()
- .toStdString();
- }
}
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
@@ -394,12 +402,28 @@ void Config::ReadAudioValues() {
}
void Config::ReadControlValues() {
- Settings::values.players.SetGlobal(global);
qt_config->beginGroup(QStringLiteral("Controls"));
+ Settings::values.players.SetGlobal(!IsCustomConfig());
for (std::size_t p = 0; p < Settings::values.players.GetValue().size(); ++p) {
ReadPlayerValue(p);
}
+ ReadGlobalSetting(Settings::values.use_docked_mode);
+
+ // Disable docked mode if handheld is selected
+ const auto controller_type = Settings::values.players.GetValue()[0].controller_type;
+ if (controller_type == Settings::ControllerType::Handheld) {
+ Settings::values.use_docked_mode.SetGlobal(!IsCustomConfig());
+ Settings::values.use_docked_mode.SetValue(false);
+ }
+
+ ReadGlobalSetting(Settings::values.vibration_enabled);
+ ReadGlobalSetting(Settings::values.enable_accurate_vibrations);
+ ReadGlobalSetting(Settings::values.motion_enabled);
+ if (IsCustomConfig()) {
+ qt_config->endGroup();
+ return;
+ }
ReadDebugValues();
ReadKeyboardValues();
ReadMouseValues();
@@ -421,18 +445,6 @@ void Config::ReadControlValues() {
ReadBasicSetting(Settings::values.tas_loop);
ReadBasicSetting(Settings::values.pause_tas_on_load);
- ReadGlobalSetting(Settings::values.use_docked_mode);
-
- // Disable docked mode if handheld is selected
- const auto controller_type = Settings::values.players.GetValue()[0].controller_type;
- if (controller_type == Settings::ControllerType::Handheld) {
- Settings::values.use_docked_mode.SetValue(false);
- }
-
- ReadGlobalSetting(Settings::values.vibration_enabled);
- ReadGlobalSetting(Settings::values.enable_accurate_vibrations);
- ReadGlobalSetting(Settings::values.motion_enabled);
-
ReadBasicSetting(Settings::values.controller_navigation);
qt_config->endGroup();
@@ -932,7 +944,7 @@ void Config::ReadValues() {
void Config::SavePlayerValue(std::size_t player_index) {
const QString player_prefix = [this, player_index] {
- if (type == ConfigType::InputProfile && global) {
+ if (type == ConfigType::InputProfile) {
return QString{};
} else {
return QStringLiteral("player_%1_").arg(player_index);
@@ -940,12 +952,20 @@ void Config::SavePlayerValue(std::size_t player_index) {
}();
const auto& player = Settings::values.players.GetValue()[player_index];
+ if (IsCustomConfig()) {
+ if (player.profile_name.empty()) {
+ // No custom profile selected
+ return;
+ }
+ WriteSetting(QStringLiteral("%1profile_name").arg(player_prefix),
+ QString::fromStdString(player.profile_name), QString{});
+ }
WriteSetting(QStringLiteral("%1type").arg(player_prefix),
static_cast<u8>(player.controller_type),
static_cast<u8>(Settings::ControllerType::ProController));
- if (!player_prefix.isEmpty()) {
+ if (!player_prefix.isEmpty() || !Settings::IsConfiguringGlobal()) {
WriteSetting(QStringLiteral("%1connected").arg(player_prefix), player.connected,
player_index == 0);
WriteSetting(QStringLiteral("%1vibration_enabled").arg(player_prefix),
@@ -960,12 +980,6 @@ void Config::SavePlayerValue(std::size_t player_index) {
player.button_color_left, Settings::JOYCON_BUTTONS_NEON_BLUE);
WriteSetting(QStringLiteral("%1button_color_right").arg(player_prefix),
player.button_color_right, Settings::JOYCON_BUTTONS_NEON_RED);
-
- // This only applies to per-game configs
- if (!global) {
- WriteSetting(QStringLiteral("%1profile_name").arg(player_prefix),
- QString::fromStdString(player.profile_name), QString{});
- }
}
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
@@ -1100,12 +1114,16 @@ void Config::SaveAudioValues() {
}
void Config::SaveControlValues() {
- Settings::values.players.SetGlobal(global);
qt_config->beginGroup(QStringLiteral("Controls"));
+ Settings::values.players.SetGlobal(!IsCustomConfig());
for (std::size_t p = 0; p < Settings::values.players.GetValue().size(); ++p) {
SavePlayerValue(p);
}
+ if (IsCustomConfig()) {
+ qt_config->endGroup();
+ return;
+ }
SaveDebugValues();
SaveMouseValues();
SaveTouchscreenValues();
@@ -1590,6 +1608,13 @@ void Config::SaveControlPlayerValue(std::size_t player_index) {
qt_config->endGroup();
}
+void Config::ClearControlPlayerValues() {
+ qt_config->beginGroup(QStringLiteral("Controls"));
+ // If key is an empty string, all keys in the current group() are removed.
+ qt_config->remove(QString{});
+ qt_config->endGroup();
+}
+
const std::string& Config::GetConfigFilePath() const {
return qt_config_loc;
}
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index 06fa7d2d0..7d26e9ab6 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -34,6 +34,7 @@ public:
void ReadControlPlayerValue(std::size_t player_index);
void SaveControlPlayerValue(std::size_t player_index);
+ void ClearControlPlayerValues();
const std::string& GetConfigFilePath() const;
@@ -58,6 +59,7 @@ public:
private:
void Initialize(const std::string& config_name);
+ bool IsCustomConfig();
void ReadValues();
void ReadPlayerValue(std::size_t player_index);
diff --git a/src/yuzu/configuration/configure_input_per_game.cpp b/src/yuzu/configuration/configure_input_per_game.cpp
index af5cee542..78e65d468 100644
--- a/src/yuzu/configuration/configure_input_per_game.cpp
+++ b/src/yuzu/configuration/configure_input_per_game.cpp
@@ -6,12 +6,14 @@
#include "core/hid/emulated_controller.h"
#include "core/hid/hid_core.h"
#include "ui_configure_input_per_game.h"
+#include "yuzu/configuration/config.h"
#include "yuzu/configuration/configure_input_per_game.h"
#include "yuzu/configuration/input_profiles.h"
-ConfigureInputPerGame::ConfigureInputPerGame(Core::System& system_, QWidget* parent)
+ConfigureInputPerGame::ConfigureInputPerGame(Core::System& system_, Config* config_,
+ QWidget* parent)
: QWidget(parent), ui(std::make_unique<Ui::ConfigureInputPerGame>()),
- profiles(std::make_unique<InputProfiles>()), system{system_} {
+ profiles(std::make_unique<InputProfiles>()), system{system_}, config{config_} {
ui->setupUi(this);
const std::array labels = {
ui->label_player_1, ui->label_player_2, ui->label_player_3, ui->label_player_4,
@@ -22,6 +24,8 @@ ConfigureInputPerGame::ConfigureInputPerGame(Core::System& system_, QWidget* par
ui->profile_player_5, ui->profile_player_6, ui->profile_player_7, ui->profile_player_8,
};
+ Settings::values.players.SetGlobal(false);
+
const auto& profile_names = profiles->GetInputProfileNames();
const auto populate_profiles = [this, &profile_names](size_t player_index) {
const auto previous_profile =
@@ -29,6 +33,7 @@ ConfigureInputPerGame::ConfigureInputPerGame(Core::System& system_, QWidget* par
auto* const player_combobox = profile_comboboxes[player_index];
player_combobox->addItem(tr("Use global input configuration"));
+
for (size_t index = 0; index < profile_names.size(); ++index) {
const auto& profile_name = profile_names[index];
player_combobox->addItem(QString::fromStdString(profile_name));
@@ -38,7 +43,6 @@ ConfigureInputPerGame::ConfigureInputPerGame(Core::System& system_, QWidget* par
}
}
};
-
for (size_t index = 0; index < profile_comboboxes.size(); ++index) {
labels[index]->setText(tr("Player %1 profile").arg(index + 1));
populate_profiles(index);
@@ -53,8 +57,10 @@ void ConfigureInputPerGame::ApplyConfiguration() {
}
void ConfigureInputPerGame::LoadConfiguration() {
+ static constexpr size_t HANDHELD_INDEX = 8;
+
auto& hid_core = system.HIDCore();
- const auto load_player_profile = [this, &hid_core](size_t player_index) {
+ for (size_t player_index = 0; player_index < profile_comboboxes.size(); ++player_index) {
Settings::values.players.SetGlobal(false);
auto* emulated_controller = hid_core.GetEmulatedControllerByIndex(player_index);
@@ -63,40 +69,47 @@ void ConfigureInputPerGame::LoadConfiguration() {
const auto selection_index = player_combobox->currentIndex();
if (selection_index == 0) {
Settings::values.players.GetValue()[player_index].profile_name = "";
+ if (player_index == 0) {
+ Settings::values.players.GetValue()[HANDHELD_INDEX] = {};
+ }
Settings::values.players.SetGlobal(true);
emulated_controller->ReloadFromSettings();
- return;
+ continue;
}
const auto profile_name = player_combobox->itemText(selection_index).toStdString();
if (profile_name.empty()) {
- return;
+ continue;
}
+ auto& player = Settings::values.players.GetValue()[player_index];
+ player.profile_name = profile_name;
+ // Read from the profile into the custom player settings
profiles->LoadProfile(profile_name, player_index);
- Settings::values.players.GetValue()[player_index].profile_name = profile_name;
+ // Make sure the controller is connected
+ player.connected = true;
+
emulated_controller->ReloadFromSettings();
- };
- for (size_t index = 0; index < profile_comboboxes.size(); ++index) {
- load_player_profile(index);
+ if (player_index > 0) {
+ continue;
+ }
+ // Handle Handheld cases
+ auto& handheld_player = Settings::values.players.GetValue()[HANDHELD_INDEX];
+ auto* handheld_controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
+ if (player.controller_type == Settings::ControllerType::Handheld) {
+ handheld_player = player;
+ } else {
+ handheld_player = {};
+ }
+ handheld_controller->ReloadFromSettings();
}
}
void ConfigureInputPerGame::SaveConfiguration() {
Settings::values.players.SetGlobal(false);
- auto& hid_core = system.HIDCore();
- const auto save_player_profile = [this, &hid_core](size_t player_index) {
- const auto selection_index = profile_comboboxes[player_index]->currentIndex();
- if (selection_index == 0) {
- return;
- }
- auto* emulated_controller = hid_core.GetEmulatedControllerByIndex(player_index);
- profiles->SaveProfile(Settings::values.players.GetValue()[player_index].profile_name,
- player_index);
- emulated_controller->ReloadFromSettings();
- };
-
- for (size_t index = 0; index < profile_comboboxes.size(); ++index) {
- save_player_profile(index);
+ // Clear all controls from the config in case the user reverted back to globals
+ config->ClearControlPlayerValues();
+ for (size_t index = 0; index < Settings::values.players.GetValue().size(); ++index) {
+ config->SaveControlPlayerValue(index);
}
}
diff --git a/src/yuzu/configuration/configure_input_per_game.h b/src/yuzu/configuration/configure_input_per_game.h
index a586ec07c..660faf574 100644
--- a/src/yuzu/configuration/configure_input_per_game.h
+++ b/src/yuzu/configuration/configure_input_per_game.h
@@ -7,21 +7,23 @@
#include <QWidget>
+#include "ui_configure_input_per_game.h"
+#include "yuzu/configuration/input_profiles.h"
+
+class QComboBox;
+
namespace Core {
class System;
-}
-
-namespace Ui {
-class ConfigureInputPerGame;
-}
+} // namespace Core
-class InputProfiles;
+class Config;
class ConfigureInputPerGame : public QWidget {
Q_OBJECT
public:
- explicit ConfigureInputPerGame(Core::System& system_, QWidget* parent = nullptr);
+ explicit ConfigureInputPerGame(Core::System& system_, Config* config_,
+ QWidget* parent = nullptr);
/// Load and Save configurations to settings file.
void ApplyConfiguration();
@@ -39,4 +41,5 @@ private:
std::array<QComboBox*, 8> profile_comboboxes;
Core::System& system;
+ Config* config;
};
diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp
index cf0a6dc0e..93db47cfd 100644
--- a/src/yuzu/configuration/configure_per_game.cpp
+++ b/src/yuzu/configuration/configure_per_game.cpp
@@ -50,7 +50,7 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::st
general_tab = std::make_unique<ConfigureGeneral>(system_, this);
graphics_tab = std::make_unique<ConfigureGraphics>(system_, this);
graphics_advanced_tab = std::make_unique<ConfigureGraphicsAdvanced>(system_, this);
- input_tab = std::make_unique<ConfigureInputPerGame>(system_, this);
+ input_tab = std::make_unique<ConfigureInputPerGame>(system_, game_config.get(), this);
system_tab = std::make_unique<ConfigureSystem>(system_, this);
ui->setupUi(this);
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index e0c353788..21983a799 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -1669,6 +1669,7 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t
? Common::FS::PathToUTF8String(file_path.filename())
: fmt::format("{:016X}", title_id);
Config per_game_config(config_file_name, Config::ConfigType::PerGameConfig);
+ system->HIDCore().ReloadInputDevices();
system->ApplySettings();
}