summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/android/app/src/main/jni/android_config.cpp5
-rw-r--r--src/frontend_common/config.cpp194
-rw-r--r--src/frontend_common/config.h28
-rw-r--r--src/yuzu/configuration/qt_config.cpp69
-rw-r--r--src/yuzu_cmd/sdl_config.cpp26
5 files changed, 188 insertions, 134 deletions
diff --git a/src/android/app/src/main/jni/android_config.cpp b/src/android/app/src/main/jni/android_config.cpp
index 9c3a5a9b2..fb17ab6f6 100644
--- a/src/android/app/src/main/jni/android_config.cpp
+++ b/src/android/app/src/main/jni/android_config.cpp
@@ -114,8 +114,9 @@ void AndroidConfig::SavePathValues() {
114 for (size_t i = 0; i < AndroidSettings::values.game_dirs.size(); ++i) { 114 for (size_t i = 0; i < AndroidSettings::values.game_dirs.size(); ++i) {
115 SetArrayIndex(i); 115 SetArrayIndex(i);
116 const auto& game_dir = AndroidSettings::values.game_dirs[i]; 116 const auto& game_dir = AndroidSettings::values.game_dirs[i];
117 WriteSetting(std::string("path"), game_dir.path); 117 WriteStringSetting(std::string("path"), game_dir.path);
118 WriteSetting(std::string("deep_scan"), game_dir.deep_scan, std::make_optional(false)); 118 WriteBooleanSetting(std::string("deep_scan"), game_dir.deep_scan,
119 std::make_optional(false));
119 } 120 }
120 EndArray(); 121 EndArray();
121 122
diff --git a/src/frontend_common/config.cpp b/src/frontend_common/config.cpp
index d9f99148b..51576b4ee 100644
--- a/src/frontend_common/config.cpp
+++ b/src/frontend_common/config.cpp
@@ -403,59 +403,63 @@ void Config::SavePlayerValues(const std::size_t player_index) {
403 // No custom profile selected 403 // No custom profile selected
404 return; 404 return;
405 } 405 }
406 WriteSetting(std::string(player_prefix).append("profile_name"), player.profile_name, 406 WriteStringSetting(std::string(player_prefix).append("profile_name"), player.profile_name,
407 std::make_optional(std::string(""))); 407 std::make_optional(std::string("")));
408 } 408 }
409 409
410 WriteSetting(std::string(player_prefix).append("type"), static_cast<u8>(player.controller_type), 410 WriteIntegerSetting(
411 std::make_optional(static_cast<u8>(Settings::ControllerType::ProController))); 411 std::string(player_prefix).append("type"), static_cast<u8>(player.controller_type),
412 std::make_optional(static_cast<u8>(Settings::ControllerType::ProController)));
412 413
413 if (!player_prefix.empty() || !Settings::IsConfiguringGlobal()) { 414 if (!player_prefix.empty() || !Settings::IsConfiguringGlobal()) {
414 WriteSetting(std::string(player_prefix).append("connected"), player.connected, 415 WriteBooleanSetting(std::string(player_prefix).append("connected"), player.connected,
415 std::make_optional(player_index == 0)); 416 std::make_optional(player_index == 0));
416 WriteSetting(std::string(player_prefix).append("vibration_enabled"), 417 WriteIntegerSetting(std::string(player_prefix).append("vibration_enabled"),
417 player.vibration_enabled, std::make_optional(true)); 418 player.vibration_enabled, std::make_optional(true));
418 WriteSetting(std::string(player_prefix).append("vibration_strength"), 419 WriteIntegerSetting(std::string(player_prefix).append("vibration_strength"),
419 player.vibration_strength, std::make_optional(100)); 420 player.vibration_strength, std::make_optional(100));
420 WriteSetting(std::string(player_prefix).append("body_color_left"), player.body_color_left, 421 WriteIntegerSetting(std::string(player_prefix).append("body_color_left"),
421 std::make_optional(Settings::JOYCON_BODY_NEON_BLUE)); 422 player.body_color_left,
422 WriteSetting(std::string(player_prefix).append("body_color_right"), player.body_color_right, 423 std::make_optional(Settings::JOYCON_BODY_NEON_BLUE));
423 std::make_optional(Settings::JOYCON_BODY_NEON_RED)); 424 WriteIntegerSetting(std::string(player_prefix).append("body_color_right"),
424 WriteSetting(std::string(player_prefix).append("button_color_left"), 425 player.body_color_right,
425 player.button_color_left, 426 std::make_optional(Settings::JOYCON_BODY_NEON_RED));
426 std::make_optional(Settings::JOYCON_BUTTONS_NEON_BLUE)); 427 WriteIntegerSetting(std::string(player_prefix).append("button_color_left"),
427 WriteSetting(std::string(player_prefix).append("button_color_right"), 428 player.button_color_left,
428 player.button_color_right, 429 std::make_optional(Settings::JOYCON_BUTTONS_NEON_BLUE));
429 std::make_optional(Settings::JOYCON_BUTTONS_NEON_RED)); 430 WriteIntegerSetting(std::string(player_prefix).append("button_color_right"),
431 player.button_color_right,
432 std::make_optional(Settings::JOYCON_BUTTONS_NEON_RED));
430 } 433 }
431} 434}
432 435
433void Config::SaveTouchscreenValues() { 436void Config::SaveTouchscreenValues() {
434 const auto& touchscreen = Settings::values.touchscreen; 437 const auto& touchscreen = Settings::values.touchscreen;
435 438
436 WriteSetting(std::string("touchscreen_enabled"), touchscreen.enabled, std::make_optional(true)); 439 WriteBooleanSetting(std::string("touchscreen_enabled"), touchscreen.enabled,
440 std::make_optional(true));
437 441
438 WriteSetting(std::string("touchscreen_angle"), touchscreen.rotation_angle, 442 WriteIntegerSetting(std::string("touchscreen_angle"), touchscreen.rotation_angle,
439 std::make_optional(static_cast<u32>(0))); 443 std::make_optional(static_cast<u32>(0)));
440 WriteSetting(std::string("touchscreen_diameter_x"), touchscreen.diameter_x, 444 WriteIntegerSetting(std::string("touchscreen_diameter_x"), touchscreen.diameter_x,
441 std::make_optional(static_cast<u32>(15))); 445 std::make_optional(static_cast<u32>(15)));
442 WriteSetting(std::string("touchscreen_diameter_y"), touchscreen.diameter_y, 446 WriteIntegerSetting(std::string("touchscreen_diameter_y"), touchscreen.diameter_y,
443 std::make_optional(static_cast<u32>(15))); 447 std::make_optional(static_cast<u32>(15)));
444} 448}
445 449
446void Config::SaveMotionTouchValues() { 450void Config::SaveMotionTouchValues() {
447 BeginArray(std::string("touch_from_button_maps")); 451 BeginArray(std::string("touch_from_button_maps"));
448 for (std::size_t p = 0; p < Settings::values.touch_from_button_maps.size(); ++p) { 452 for (std::size_t p = 0; p < Settings::values.touch_from_button_maps.size(); ++p) {
449 SetArrayIndex(static_cast<int>(p)); 453 SetArrayIndex(static_cast<int>(p));
450 WriteSetting(std::string("name"), Settings::values.touch_from_button_maps[p].name, 454 WriteStringSetting(std::string("name"), Settings::values.touch_from_button_maps[p].name,
451 std::make_optional(std::string("default"))); 455 std::make_optional(std::string("default")));
452 456
453 BeginArray(std::string("entries")); 457 BeginArray(std::string("entries"));
454 for (std::size_t q = 0; q < Settings::values.touch_from_button_maps[p].buttons.size(); 458 for (std::size_t q = 0; q < Settings::values.touch_from_button_maps[p].buttons.size();
455 ++q) { 459 ++q) {
456 SetArrayIndex(static_cast<int>(q)); 460 SetArrayIndex(static_cast<int>(q));
457 WriteSetting(std::string("bind"), 461 WriteStringSetting(std::string("bind"),
458 Settings::values.touch_from_button_maps[p].buttons[q]); 462 Settings::values.touch_from_button_maps[p].buttons[q]);
459 } 463 }
460 EndArray(); // entries 464 EndArray(); // entries
461 } 465 }
@@ -520,16 +524,16 @@ void Config::SaveCoreValues() {
520void Config::SaveDataStorageValues() { 524void Config::SaveDataStorageValues() {
521 BeginGroup(Settings::TranslateCategory(Settings::Category::DataStorage)); 525 BeginGroup(Settings::TranslateCategory(Settings::Category::DataStorage));
522 526
523 WriteSetting(std::string("nand_directory"), FS::GetYuzuPathString(FS::YuzuPath::NANDDir), 527 WriteStringSetting(std::string("nand_directory"), FS::GetYuzuPathString(FS::YuzuPath::NANDDir),
524 std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::NANDDir))); 528 std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::NANDDir)));
525 WriteSetting(std::string("sdmc_directory"), FS::GetYuzuPathString(FS::YuzuPath::SDMCDir), 529 WriteStringSetting(std::string("sdmc_directory"), FS::GetYuzuPathString(FS::YuzuPath::SDMCDir),
526 std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::SDMCDir))); 530 std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::SDMCDir)));
527 WriteSetting(std::string("load_directory"), FS::GetYuzuPathString(FS::YuzuPath::LoadDir), 531 WriteStringSetting(std::string("load_directory"), FS::GetYuzuPathString(FS::YuzuPath::LoadDir),
528 std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::LoadDir))); 532 std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::LoadDir)));
529 WriteSetting(std::string("dump_directory"), FS::GetYuzuPathString(FS::YuzuPath::DumpDir), 533 WriteStringSetting(std::string("dump_directory"), FS::GetYuzuPathString(FS::YuzuPath::DumpDir),
530 std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::DumpDir))); 534 std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::DumpDir)));
531 WriteSetting(std::string("tas_directory"), FS::GetYuzuPathString(FS::YuzuPath::TASDir), 535 WriteStringSetting(std::string("tas_directory"), FS::GetYuzuPathString(FS::YuzuPath::TASDir),
532 std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::TASDir))); 536 std::make_optional(FS::GetYuzuPathString(FS::YuzuPath::TASDir)));
533 537
534 WriteCategory(Settings::Category::DataStorage); 538 WriteCategory(Settings::Category::DataStorage);
535 539
@@ -540,7 +544,7 @@ void Config::SaveDebuggingValues() {
540 BeginGroup(Settings::TranslateCategory(Settings::Category::Debugging)); 544 BeginGroup(Settings::TranslateCategory(Settings::Category::Debugging));
541 545
542 // Intentionally not using the QT default setting as this is intended to be changed in the ini 546 // Intentionally not using the QT default setting as this is intended to be changed in the ini
543 WriteSetting(std::string("record_frame_times"), Settings::values.record_frame_times); 547 WriteBooleanSetting(std::string("record_frame_times"), Settings::values.record_frame_times);
544 548
545 WriteCategory(Settings::Category::Debugging); 549 WriteCategory(Settings::Category::Debugging);
546 WriteCategory(Settings::Category::DebuggingGraphics); 550 WriteCategory(Settings::Category::DebuggingGraphics);
@@ -564,11 +568,13 @@ void Config::SaveDisabledAddOnValues() {
564 BeginArray(std::string("")); 568 BeginArray(std::string(""));
565 for (const auto& elem : Settings::values.disabled_addons) { 569 for (const auto& elem : Settings::values.disabled_addons) {
566 SetArrayIndex(i); 570 SetArrayIndex(i);
567 WriteSetting(std::string("title_id"), elem.first, std::make_optional(static_cast<u64>(0))); 571 WriteIntegerSetting(std::string("title_id"), elem.first,
572 std::make_optional(static_cast<u64>(0)));
568 BeginArray(std::string("disabled")); 573 BeginArray(std::string("disabled"));
569 for (std::size_t j = 0; j < elem.second.size(); ++j) { 574 for (std::size_t j = 0; j < elem.second.size(); ++j) {
570 SetArrayIndex(static_cast<int>(j)); 575 SetArrayIndex(static_cast<int>(j));
571 WriteSetting(std::string("d"), elem.second[j], std::make_optional(std::string(""))); 576 WriteStringSetting(std::string("d"), elem.second[j],
577 std::make_optional(std::string("")));
572 } 578 }
573 EndArray(); // disabled 579 EndArray(); // disabled
574 ++i; 580 ++i;
@@ -609,8 +615,8 @@ void Config::SaveRendererValues() {
609void Config::SaveScreenshotValues() { 615void Config::SaveScreenshotValues() {
610 BeginGroup(Settings::TranslateCategory(Settings::Category::Screenshots)); 616 BeginGroup(Settings::TranslateCategory(Settings::Category::Screenshots));
611 617
612 WriteSetting(std::string("screenshot_path"), 618 WriteStringSetting(std::string("screenshot_path"),
613 FS::GetYuzuPathString(FS::YuzuPath::ScreenshotsDir)); 619 FS::GetYuzuPathString(FS::YuzuPath::ScreenshotsDir));
614 WriteCategory(Settings::Category::Screenshots); 620 WriteCategory(Settings::Category::Screenshots);
615 621
616 EndGroup(); 622 EndGroup();
@@ -746,46 +752,70 @@ bool Config::Exists(const std::string& section, const std::string& key) const {
746 return !value.empty(); 752 return !value.empty();
747} 753}
748 754
749template <typename Type> 755void Config::WriteBooleanSetting(const std::string& key, const bool& value,
750void Config::WriteSetting(const std::string& key, const Type& value, 756 const std::optional<bool>& default_value,
751 const std::optional<Type>& default_value, 757 const std::optional<bool>& use_global) {
752 const std::optional<bool>& use_global) { 758 std::optional<std::string> string_default = std::nullopt;
753 std::string full_key = GetFullKey(key, false); 759 if (default_value.has_value()) {
760 string_default = std::make_optional(ToString(default_value.value()));
761 }
762 WritePreparedSetting(key, AdjustOutputString(ToString(value)), string_default, use_global);
763}
754 764
755 std::string saved_value; 765template <typename T>
756 std::string string_default; 766std::enable_if_t<std::is_integral_v<T>> Config::WriteIntegerSetting(
757 if constexpr (std::is_same_v<Type, std::string>) { 767 const std::string& key, const T& value, const std::optional<T>& default_value,
758 saved_value.append(AdjustOutputString(value)); 768 const std::optional<bool>& use_global) {
759 if (default_value.has_value()) { 769 std::optional<std::string> string_default = std::nullopt;
760 string_default.append(AdjustOutputString(default_value.value())); 770 if (default_value.has_value()) {
761 } 771 string_default = std::make_optional(ToString(default_value.value()));
762 } else { 772 }
763 saved_value.append(AdjustOutputString(ToString(value))); 773 WritePreparedSetting(key, AdjustOutputString(ToString(value)), string_default, use_global);
764 if (default_value.has_value()) { 774}
765 string_default.append(ToString(default_value.value())); 775
766 } 776void Config::WriteDoubleSetting(const std::string& key, const double& value,
777 const std::optional<double>& default_value,
778 const std::optional<bool>& use_global) {
779 std::optional<std::string> string_default = std::nullopt;
780 if (default_value.has_value()) {
781 string_default = std::make_optional(ToString(default_value.value()));
767 } 782 }
783 WritePreparedSetting(key, AdjustOutputString(ToString(value)), string_default, use_global);
784}
768 785
769 if (default_value.has_value() && use_global.has_value()) { 786void Config::WriteStringSetting(const std::string& key, const std::string& value,
787 const std::optional<std::string>& default_value,
788 const std::optional<bool>& use_global) {
789 std::optional string_default = default_value;
790 if (default_value.has_value()) {
791 string_default.value().append(AdjustOutputString(default_value.value()));
792 }
793 WritePreparedSetting(key, AdjustOutputString(value), string_default, use_global);
794}
795
796void Config::WritePreparedSetting(const std::string& key, const std::string& adjusted_value,
797 const std::optional<std::string>& adjusted_default_value,
798 const std::optional<bool>& use_global) {
799 std::string full_key = GetFullKey(key, false);
800 if (adjusted_default_value.has_value() && use_global.has_value()) {
770 if (!global) { 801 if (!global) {
771 WriteSettingInternal(std::string(full_key).append("\\global"), 802 WriteString(std::string(full_key).append("\\global"), ToString(use_global.value()));
772 ToString(use_global.value()));
773 } 803 }
774 if (global || use_global.value() == false) { 804 if (global || use_global.value() == false) {
775 WriteSettingInternal(std::string(full_key).append("\\default"), 805 WriteString(std::string(full_key).append("\\default"),
776 ToString(string_default == saved_value)); 806 ToString(adjusted_default_value == adjusted_value));
777 WriteSettingInternal(full_key, saved_value); 807 WriteString(full_key, adjusted_value);
778 } 808 }
779 } else if (default_value.has_value() && !use_global.has_value()) { 809 } else if (adjusted_default_value.has_value() && !use_global.has_value()) {
780 WriteSettingInternal(std::string(full_key).append("\\default"), 810 WriteString(std::string(full_key).append("\\default"),
781 ToString(string_default == saved_value)); 811 ToString(adjusted_default_value == adjusted_value));
782 WriteSettingInternal(full_key, saved_value); 812 WriteString(full_key, adjusted_value);
783 } else { 813 } else {
784 WriteSettingInternal(full_key, saved_value); 814 WriteString(full_key, adjusted_value);
785 } 815 }
786} 816}
787 817
788void Config::WriteSettingInternal(const std::string& key, const std::string& value) { 818void Config::WriteString(const std::string& key, const std::string& value) {
789 config->SetValue(GetSection().c_str(), key.c_str(), value.c_str()); 819 config->SetValue(GetSection().c_str(), key.c_str(), value.c_str());
790} 820}
791 821
@@ -861,17 +891,17 @@ void Config::WriteSettingGeneric(const Settings::BasicSetting* const setting) {
861 std::string key = AdjustKey(setting->GetLabel()); 891 std::string key = AdjustKey(setting->GetLabel());
862 if (setting->Switchable()) { 892 if (setting->Switchable()) {
863 if (!global) { 893 if (!global) {
864 WriteSetting(std::string(key).append("\\use_global"), setting->UsingGlobal()); 894 WriteBooleanSetting(std::string(key).append("\\use_global"), setting->UsingGlobal());
865 } 895 }
866 if (global || !setting->UsingGlobal()) { 896 if (global || !setting->UsingGlobal()) {
867 WriteSetting(std::string(key).append("\\default"), 897 WriteBooleanSetting(std::string(key).append("\\default"),
868 setting->ToString() == setting->DefaultToString()); 898 setting->ToString() == setting->DefaultToString());
869 WriteSetting(key, setting->ToString()); 899 WriteStringSetting(key, setting->ToString());
870 } 900 }
871 } else if (global) { 901 } else if (global) {
872 WriteSetting(std::string(key).append("\\default"), 902 WriteBooleanSetting(std::string(key).append("\\default"),
873 setting->ToString() == setting->DefaultToString()); 903 setting->ToString() == setting->DefaultToString());
874 WriteSetting(key, setting->ToString()); 904 WriteStringSetting(key, setting->ToString());
875 } 905 }
876} 906}
877 907
diff --git a/src/frontend_common/config.h b/src/frontend_common/config.h
index b3812af17..e73cf6929 100644
--- a/src/frontend_common/config.h
+++ b/src/frontend_common/config.h
@@ -154,11 +154,20 @@ protected:
154 * @param use_global Specifies if the custom or global config should be in use, for custom 154 * @param use_global Specifies if the custom or global config should be in use, for custom
155 * configs 155 * configs
156 */ 156 */
157 template <typename Type = int> 157 void WriteBooleanSetting(const std::string& key, const bool& value,
158 void WriteSetting(const std::string& key, const Type& value, 158 const std::optional<bool>& default_value = std::nullopt,
159 const std::optional<Type>& default_value = std::nullopt, 159 const std::optional<bool>& use_global = std::nullopt);
160 const std::optional<bool>& use_global = std::nullopt); 160 template <typename T>
161 void WriteSettingInternal(const std::string& key, const std::string& value); 161 std::enable_if_t<std::is_integral_v<T>> WriteIntegerSetting(
162 const std::string& key, const T& value,
163 const std::optional<T>& default_value = std::nullopt,
164 const std::optional<bool>& use_global = std::nullopt);
165 void WriteDoubleSetting(const std::string& key, const double& value,
166 const std::optional<double>& default_value = std::nullopt,
167 const std::optional<bool>& use_global = std::nullopt);
168 void WriteStringSetting(const std::string& key, const std::string& value,
169 const std::optional<std::string>& default_value = std::nullopt,
170 const std::optional<bool>& use_global = std::nullopt);
162 171
163 void ReadCategory(Settings::Category category); 172 void ReadCategory(Settings::Category category);
164 void WriteCategory(Settings::Category category); 173 void WriteCategory(Settings::Category category);
@@ -175,8 +184,10 @@ protected:
175 return value_ ? "true" : "false"; 184 return value_ ? "true" : "false";
176 } else if constexpr (std::is_same_v<T, u64>) { 185 } else if constexpr (std::is_same_v<T, u64>) {
177 return std::to_string(static_cast<u64>(value_)); 186 return std::to_string(static_cast<u64>(value_));
178 } else { 187 } else if constexpr (std::is_same_v<T, s64>) {
179 return std::to_string(static_cast<s64>(value_)); 188 return std::to_string(static_cast<s64>(value_));
189 } else {
190 return std::to_string(value_);
180 } 191 }
181 } 192 }
182 193
@@ -197,6 +208,11 @@ protected:
197 const bool global; 208 const bool global;
198 209
199private: 210private:
211 void WritePreparedSetting(const std::string& key, const std::string& adjusted_value,
212 const std::optional<std::string>& adjusted_default_value,
213 const std::optional<bool>& use_global);
214 void WriteString(const std::string& key, const std::string& value);
215
200 inline static std::array<char, 19> special_characters = {'!', '#', '$', '%', '^', '&', '*', 216 inline static std::array<char, 19> special_characters = {'!', '#', '$', '%', '^', '&', '*',
201 '|', ';', '\'', '\"', ',', '<', '.', 217 '|', ';', '\'', '\"', ',', '<', '.',
202 '>', '?', '`', '~', '='}; 218 '>', '?', '`', '~', '='};
diff --git a/src/yuzu/configuration/qt_config.cpp b/src/yuzu/configuration/qt_config.cpp
index a71000b72..6aca71d7c 100644
--- a/src/yuzu/configuration/qt_config.cpp
+++ b/src/yuzu/configuration/qt_config.cpp
@@ -348,43 +348,45 @@ void QtConfig::SaveQtPlayerValues(const std::size_t player_index) {
348 348
349 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { 349 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
350 const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); 350 const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
351 WriteSetting(std::string(player_prefix).append(Settings::NativeButton::mapping[i]), 351 WriteStringSetting(std::string(player_prefix).append(Settings::NativeButton::mapping[i]),
352 player.buttons[i], std::make_optional(default_param)); 352 player.buttons[i], std::make_optional(default_param));
353 } 353 }
354 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { 354 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
355 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( 355 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
356 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], 356 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
357 default_analogs[i][3], default_stick_mod[i], 0.5f); 357 default_analogs[i][3], default_stick_mod[i], 0.5f);
358 WriteSetting(std::string(player_prefix).append(Settings::NativeAnalog::mapping[i]), 358 WriteStringSetting(std::string(player_prefix).append(Settings::NativeAnalog::mapping[i]),
359 player.analogs[i], std::make_optional(default_param)); 359 player.analogs[i], std::make_optional(default_param));
360 } 360 }
361 for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) { 361 for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) {
362 const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]); 362 const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]);
363 WriteSetting(std::string(player_prefix).append(Settings::NativeMotion::mapping[i]), 363 WriteStringSetting(std::string(player_prefix).append(Settings::NativeMotion::mapping[i]),
364 player.motions[i], std::make_optional(default_param)); 364 player.motions[i], std::make_optional(default_param));
365 } 365 }
366} 366}
367 367
368void QtConfig::SaveDebugControlValues() { 368void QtConfig::SaveDebugControlValues() {
369 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { 369 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
370 const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); 370 const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
371 WriteSetting(std::string("debug_pad_").append(Settings::NativeButton::mapping[i]), 371 WriteStringSetting(std::string("debug_pad_").append(Settings::NativeButton::mapping[i]),
372 Settings::values.debug_pad_buttons[i], std::make_optional(default_param)); 372 Settings::values.debug_pad_buttons[i],
373 std::make_optional(default_param));
373 } 374 }
374 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { 375 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
375 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( 376 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
376 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], 377 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
377 default_analogs[i][3], default_stick_mod[i], 0.5f); 378 default_analogs[i][3], default_stick_mod[i], 0.5f);
378 WriteSetting(std::string("debug_pad_").append(Settings::NativeAnalog::mapping[i]), 379 WriteStringSetting(std::string("debug_pad_").append(Settings::NativeAnalog::mapping[i]),
379 Settings::values.debug_pad_analogs[i], std::make_optional(default_param)); 380 Settings::values.debug_pad_analogs[i],
381 std::make_optional(default_param));
380 } 382 }
381} 383}
382 384
383void QtConfig::SaveHidbusValues() { 385void QtConfig::SaveHidbusValues() {
384 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( 386 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
385 0, 0, default_ringcon_analogs[0], default_ringcon_analogs[1], 0, 0.05f); 387 0, 0, default_ringcon_analogs[0], default_ringcon_analogs[1], 0, 0.05f);
386 WriteSetting(std::string("ring_controller"), Settings::values.ringcon_analogs, 388 WriteStringSetting(std::string("ring_controller"), Settings::values.ringcon_analogs,
387 std::make_optional(default_param)); 389 std::make_optional(default_param));
388} 390}
389 391
390void QtConfig::SaveQtControlValues() { 392void QtConfig::SaveQtControlValues() {
@@ -409,19 +411,20 @@ void QtConfig::SavePathValues() {
409 411
410 WriteCategory(Settings::Category::Paths); 412 WriteCategory(Settings::Category::Paths);
411 413
412 WriteSetting(std::string("romsPath"), UISettings::values.roms_path); 414 WriteStringSetting(std::string("romsPath"), UISettings::values.roms_path);
413 BeginArray(std::string("gamedirs")); 415 BeginArray(std::string("gamedirs"));
414 for (int i = 0; i < UISettings::values.game_dirs.size(); ++i) { 416 for (int i = 0; i < UISettings::values.game_dirs.size(); ++i) {
415 SetArrayIndex(i); 417 SetArrayIndex(i);
416 const auto& game_dir = UISettings::values.game_dirs[i]; 418 const auto& game_dir = UISettings::values.game_dirs[i];
417 WriteSetting(std::string("path"), game_dir.path); 419 WriteStringSetting(std::string("path"), game_dir.path);
418 WriteSetting(std::string("deep_scan"), game_dir.deep_scan, std::make_optional(false)); 420 WriteBooleanSetting(std::string("deep_scan"), game_dir.deep_scan,
419 WriteSetting(std::string("expanded"), game_dir.expanded, std::make_optional(true)); 421 std::make_optional(false));
422 WriteBooleanSetting(std::string("expanded"), game_dir.expanded, std::make_optional(true));
420 } 423 }
421 EndArray(); 424 EndArray();
422 425
423 WriteSetting(std::string("recentFiles"), 426 WriteStringSetting(std::string("recentFiles"),
424 UISettings::values.recent_files.join(QStringLiteral(", ")).toStdString()); 427 UISettings::values.recent_files.join(QStringLiteral(", ")).toStdString());
425 428
426 EndGroup(); 429 EndGroup();
427} 430}
@@ -438,14 +441,14 @@ void QtConfig::SaveShortcutValues() {
438 BeginGroup(group); 441 BeginGroup(group);
439 BeginGroup(name); 442 BeginGroup(name);
440 443
441 WriteSetting(std::string("KeySeq"), shortcut.keyseq, 444 WriteStringSetting(std::string("KeySeq"), shortcut.keyseq,
442 std::make_optional(default_hotkey.keyseq)); 445 std::make_optional(default_hotkey.keyseq));
443 WriteSetting(std::string("Controller_KeySeq"), shortcut.controller_keyseq, 446 WriteStringSetting(std::string("Controller_KeySeq"), shortcut.controller_keyseq,
444 std::make_optional(default_hotkey.controller_keyseq)); 447 std::make_optional(default_hotkey.controller_keyseq));
445 WriteSetting(std::string("Context"), shortcut.context, 448 WriteIntegerSetting(std::string("Context"), shortcut.context,
446 std::make_optional(default_hotkey.context)); 449 std::make_optional(default_hotkey.context));
447 WriteSetting(std::string("Repeat"), shortcut.repeat, 450 WriteBooleanSetting(std::string("Repeat"), shortcut.repeat,
448 std::make_optional(default_hotkey.repeat)); 451 std::make_optional(default_hotkey.repeat));
449 452
450 EndGroup(); // name 453 EndGroup(); // name
451 EndGroup(); // group 454 EndGroup(); // group
@@ -460,9 +463,10 @@ void QtConfig::SaveUIValues() {
460 WriteCategory(Settings::Category::Ui); 463 WriteCategory(Settings::Category::Ui);
461 WriteCategory(Settings::Category::UiGeneral); 464 WriteCategory(Settings::Category::UiGeneral);
462 465
463 WriteSetting(std::string("theme"), UISettings::values.theme, 466 WriteStringSetting(
464 std::make_optional(std::string( 467 std::string("theme"), UISettings::values.theme,
465 UISettings::themes[static_cast<size_t>(UISettings::default_theme)].second))); 468 std::make_optional(std::string(
469 UISettings::themes[static_cast<size_t>(UISettings::default_theme)].second)));
466 470
467 SaveUIGamelistValues(); 471 SaveUIGamelistValues();
468 SaveUILayoutValues(); 472 SaveUILayoutValues();
@@ -482,7 +486,7 @@ void QtConfig::SaveUIGamelistValues() {
482 BeginArray(std::string("favorites")); 486 BeginArray(std::string("favorites"));
483 for (int i = 0; i < UISettings::values.favorited_ids.size(); i++) { 487 for (int i = 0; i < UISettings::values.favorited_ids.size(); i++) {
484 SetArrayIndex(i); 488 SetArrayIndex(i);
485 WriteSetting(std::string("program_id"), UISettings::values.favorited_ids[i]); 489 WriteIntegerSetting(std::string("program_id"), UISettings::values.favorited_ids[i]);
486 } 490 }
487 EndArray(); // favorites 491 EndArray(); // favorites
488 492
@@ -506,14 +510,15 @@ void QtConfig::SaveMultiplayerValues() {
506 BeginArray(std::string("username_ban_list")); 510 BeginArray(std::string("username_ban_list"));
507 for (std::size_t i = 0; i < UISettings::values.multiplayer_ban_list.first.size(); ++i) { 511 for (std::size_t i = 0; i < UISettings::values.multiplayer_ban_list.first.size(); ++i) {
508 SetArrayIndex(static_cast<int>(i)); 512 SetArrayIndex(static_cast<int>(i));
509 WriteSetting(std::string("username"), UISettings::values.multiplayer_ban_list.first[i]); 513 WriteStringSetting(std::string("username"),
514 UISettings::values.multiplayer_ban_list.first[i]);
510 } 515 }
511 EndArray(); // username_ban_list 516 EndArray(); // username_ban_list
512 517
513 BeginArray(std::string("ip_ban_list")); 518 BeginArray(std::string("ip_ban_list"));
514 for (std::size_t i = 0; i < UISettings::values.multiplayer_ban_list.second.size(); ++i) { 519 for (std::size_t i = 0; i < UISettings::values.multiplayer_ban_list.second.size(); ++i) {
515 SetArrayIndex(static_cast<int>(i)); 520 SetArrayIndex(static_cast<int>(i));
516 WriteSetting(std::string("ip"), UISettings::values.multiplayer_ban_list.second[i]); 521 WriteStringSetting(std::string("ip"), UISettings::values.multiplayer_ban_list.second[i]);
517 } 522 }
518 EndArray(); // ip_ban_list 523 EndArray(); // ip_ban_list
519 524
diff --git a/src/yuzu_cmd/sdl_config.cpp b/src/yuzu_cmd/sdl_config.cpp
index 39fd8050c..e81bf5d45 100644
--- a/src/yuzu_cmd/sdl_config.cpp
+++ b/src/yuzu_cmd/sdl_config.cpp
@@ -213,43 +213,45 @@ void SdlConfig::SaveSdlPlayerValues(const std::size_t player_index) {
213 213
214 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { 214 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
215 const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); 215 const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
216 WriteSetting(std::string(player_prefix).append(Settings::NativeButton::mapping[i]), 216 WriteStringSetting(std::string(player_prefix).append(Settings::NativeButton::mapping[i]),
217 player.buttons[i], std::make_optional(default_param)); 217 player.buttons[i], std::make_optional(default_param));
218 } 218 }
219 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { 219 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
220 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( 220 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
221 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], 221 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
222 default_analogs[i][3], default_stick_mod[i], 0.5f); 222 default_analogs[i][3], default_stick_mod[i], 0.5f);
223 WriteSetting(std::string(player_prefix).append(Settings::NativeAnalog::mapping[i]), 223 WriteStringSetting(std::string(player_prefix).append(Settings::NativeAnalog::mapping[i]),
224 player.analogs[i], std::make_optional(default_param)); 224 player.analogs[i], std::make_optional(default_param));
225 } 225 }
226 for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) { 226 for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) {
227 const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]); 227 const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]);
228 WriteSetting(std::string(player_prefix).append(Settings::NativeMotion::mapping[i]), 228 WriteStringSetting(std::string(player_prefix).append(Settings::NativeMotion::mapping[i]),
229 player.motions[i], std::make_optional(default_param)); 229 player.motions[i], std::make_optional(default_param));
230 } 230 }
231} 231}
232 232
233void SdlConfig::SaveDebugControlValues() { 233void SdlConfig::SaveDebugControlValues() {
234 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { 234 for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
235 const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); 235 const std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
236 WriteSetting(std::string("debug_pad_").append(Settings::NativeButton::mapping[i]), 236 WriteStringSetting(std::string("debug_pad_").append(Settings::NativeButton::mapping[i]),
237 Settings::values.debug_pad_buttons[i], std::make_optional(default_param)); 237 Settings::values.debug_pad_buttons[i],
238 std::make_optional(default_param));
238 } 239 }
239 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { 240 for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
240 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( 241 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
241 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], 242 default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
242 default_analogs[i][3], default_stick_mod[i], 0.5f); 243 default_analogs[i][3], default_stick_mod[i], 0.5f);
243 WriteSetting(std::string("debug_pad_").append(Settings::NativeAnalog::mapping[i]), 244 WriteStringSetting(std::string("debug_pad_").append(Settings::NativeAnalog::mapping[i]),
244 Settings::values.debug_pad_analogs[i], std::make_optional(default_param)); 245 Settings::values.debug_pad_analogs[i],
246 std::make_optional(default_param));
245 } 247 }
246} 248}
247 249
248void SdlConfig::SaveHidbusValues() { 250void SdlConfig::SaveHidbusValues() {
249 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys( 251 const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
250 0, 0, default_ringcon_analogs[0], default_ringcon_analogs[1], 0, 0.05f); 252 0, 0, default_ringcon_analogs[0], default_ringcon_analogs[1], 0, 0.05f);
251 WriteSetting(std::string("ring_controller"), Settings::values.ringcon_analogs, 253 WriteStringSetting(std::string("ring_controller"), Settings::values.ringcon_analogs,
252 std::make_optional(default_param)); 254 std::make_optional(default_param));
253} 255}
254 256
255std::vector<Settings::BasicSetting*>& SdlConfig::FindRelevantList(Settings::Category category) { 257std::vector<Settings::BasicSetting*>& SdlConfig::FindRelevantList(Settings::Category category) {