diff options
author | t895 <clombardo169@gmail.com> | 2023-11-12 02:03:01 -0500 |
---|---|---|
committer | t895 <clombardo169@gmail.com> | 2023-11-21 01:58:13 -0500 |
commit | da14c7b8e47fcd5456d88a033a1fb154a0dcfa39 (patch) | |
tree | 4f9da84775b2b25aaa7eb519bccb1d5e620608a0 /src/yuzu_cmd/config.cpp | |
parent | 8da5bd27e9d4fe5e850700039d79f77e52ba6aea (diff) |
config: Unify config handling under frontend_common
Replaces every way of handling config for each frontend with SimpleIni. frontend_common's Config class is at the center where it saves and loads all of the cross-platform settings and provides a set of pure virtual functions for platform specific settings.
As a result of making config handling platform specific, several parts had to be moved to each platform's own config class or to other parts. Default keys were put in platform specific config classes and translatable strings for Qt were moved to shared_translation. Default hotkeys, default_theme, window geometry, and qt metatypes were moved to uisettings. Additionally, to reduce dependence on Qt, QStrings were converted to std::strings where applicable.
Diffstat (limited to 'src/yuzu_cmd/config.cpp')
-rw-r--r-- | src/yuzu_cmd/config.cpp | 279 |
1 files changed, 0 insertions, 279 deletions
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp deleted file mode 100644 index 0d25ff400..000000000 --- a/src/yuzu_cmd/config.cpp +++ /dev/null @@ -1,279 +0,0 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include <memory> -#include <optional> -#include <sstream> -#include <INIReader.h> -#include <SDL.h> -#include "common/fs/file.h" -#include "common/fs/fs.h" -#include "common/fs/path_util.h" -#include "common/logging/log.h" -#include "common/settings.h" -#include "core/hle/service/acc/profile_manager.h" -#include "input_common/main.h" -#include "yuzu_cmd/config.h" -#include "yuzu_cmd/default_ini.h" - -namespace FS = Common::FS; - -const std::filesystem::path default_config_path = - FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "sdl2-config.ini"; - -Config::Config(std::optional<std::filesystem::path> config_path) - : sdl2_config_loc{config_path.value_or(default_config_path)}, - sdl2_config{std::make_unique<INIReader>(FS::PathToUTF8String(sdl2_config_loc))} { - Reload(); -} - -Config::~Config() = default; - -bool Config::LoadINI(const std::string& default_contents, bool retry) { - const auto config_loc_str = FS::PathToUTF8String(sdl2_config_loc); - if (sdl2_config->ParseError() < 0) { - if (retry) { - LOG_WARNING(Config, "Failed to load {}. Creating file from defaults...", - config_loc_str); - - void(FS::CreateParentDir(sdl2_config_loc)); - void(FS::WriteStringToFile(sdl2_config_loc, FS::FileType::TextFile, default_contents)); - - sdl2_config = std::make_unique<INIReader>(config_loc_str); - - return LoadINI(default_contents, false); - } - LOG_ERROR(Config, "Failed."); - return false; - } - LOG_INFO(Config, "Successfully loaded {}", config_loc_str); - return true; -} - -static const std::array<int, Settings::NativeButton::NumButtons> default_buttons = { - SDL_SCANCODE_A, SDL_SCANCODE_S, SDL_SCANCODE_Z, SDL_SCANCODE_X, SDL_SCANCODE_T, - SDL_SCANCODE_G, SDL_SCANCODE_F, SDL_SCANCODE_H, SDL_SCANCODE_Q, SDL_SCANCODE_W, - SDL_SCANCODE_M, SDL_SCANCODE_N, SDL_SCANCODE_1, SDL_SCANCODE_2, SDL_SCANCODE_B, -}; - -static const std::array<int, Settings::NativeMotion::NumMotions> default_motions = { - SDL_SCANCODE_7, - SDL_SCANCODE_8, -}; - -static const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> default_analogs{{ - { - SDL_SCANCODE_UP, - SDL_SCANCODE_DOWN, - SDL_SCANCODE_LEFT, - SDL_SCANCODE_RIGHT, - SDL_SCANCODE_D, - }, - { - SDL_SCANCODE_I, - SDL_SCANCODE_K, - SDL_SCANCODE_J, - SDL_SCANCODE_L, - SDL_SCANCODE_D, - }, -}}; - -template <> -void Config::ReadSetting(const std::string& group, Settings::Setting<std::string>& setting) { - std::string setting_value = sdl2_config->Get(group, setting.GetLabel(), setting.GetDefault()); - if (setting_value.empty()) { - setting_value = setting.GetDefault(); - } - setting = std::move(setting_value); -} - -template <> -void Config::ReadSetting(const std::string& group, Settings::Setting<bool>& setting) { - setting = sdl2_config->GetBoolean(group, setting.GetLabel(), setting.GetDefault()); -} - -template <typename Type, bool ranged> -void Config::ReadSetting(const std::string& group, Settings::Setting<Type, ranged>& setting) { - setting = static_cast<Type>(sdl2_config->GetInteger(group, setting.GetLabel(), - static_cast<long>(setting.GetDefault()))); -} - -void Config::ReadCategory(Settings::Category category) { - for (const auto setting : Settings::values.linkage.by_category[category]) { - const char* category_name = [&]() { - if (category == Settings::Category::Controls) { - // For compatibility with older configs - return "ControlsGeneral"; - } else { - return Settings::TranslateCategory(category); - } - }(); - std::string setting_value = - sdl2_config->Get(category_name, setting->GetLabel(), setting->DefaultToString()); - setting->LoadString(setting_value); - } -} - -void Config::ReadValues() { - // Controls - ReadCategory(Settings::Category::Controls); - - for (std::size_t p = 0; p < Settings::values.players.GetValue().size(); ++p) { - auto& player = Settings::values.players.GetValue()[p]; - - const auto group = fmt::format("ControlsP{}", p); - for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { - std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); - player.buttons[i] = - sdl2_config->Get(group, Settings::NativeButton::mapping[i], default_param); - if (player.buttons[i].empty()) { - player.buttons[i] = default_param; - } - } - - for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { - std::string default_param = InputCommon::GenerateAnalogParamFromKeys( - default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], - default_analogs[i][3], default_analogs[i][4], 0.5f); - player.analogs[i] = - sdl2_config->Get(group, Settings::NativeAnalog::mapping[i], default_param); - if (player.analogs[i].empty()) { - player.analogs[i] = default_param; - } - } - - for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) { - const std::string default_param = - InputCommon::GenerateKeyboardParam(default_motions[i]); - auto& player_motions = player.motions[i]; - - player_motions = - sdl2_config->Get(group, Settings::NativeMotion::mapping[i], default_param); - if (player_motions.empty()) { - player_motions = default_param; - } - } - - player.connected = sdl2_config->GetBoolean(group, "connected", false); - } - - for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { - std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); - Settings::values.debug_pad_buttons[i] = sdl2_config->Get( - "ControlsGeneral", std::string("debug_pad_") + Settings::NativeButton::mapping[i], - default_param); - if (Settings::values.debug_pad_buttons[i].empty()) - Settings::values.debug_pad_buttons[i] = default_param; - } - - for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { - std::string default_param = InputCommon::GenerateAnalogParamFromKeys( - default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], - default_analogs[i][3], default_analogs[i][4], 0.5f); - Settings::values.debug_pad_analogs[i] = sdl2_config->Get( - "ControlsGeneral", std::string("debug_pad_") + Settings::NativeAnalog::mapping[i], - default_param); - if (Settings::values.debug_pad_analogs[i].empty()) - Settings::values.debug_pad_analogs[i] = default_param; - } - - Settings::values.touchscreen.enabled = - sdl2_config->GetBoolean("ControlsGeneral", "touch_enabled", true); - Settings::values.touchscreen.rotation_angle = - sdl2_config->GetInteger("ControlsGeneral", "touch_angle", 0); - Settings::values.touchscreen.diameter_x = - sdl2_config->GetInteger("ControlsGeneral", "touch_diameter_x", 15); - Settings::values.touchscreen.diameter_y = - sdl2_config->GetInteger("ControlsGeneral", "touch_diameter_y", 15); - - int num_touch_from_button_maps = - sdl2_config->GetInteger("ControlsGeneral", "touch_from_button_map", 0); - if (num_touch_from_button_maps > 0) { - for (int i = 0; i < num_touch_from_button_maps; ++i) { - Settings::TouchFromButtonMap map; - map.name = sdl2_config->Get("ControlsGeneral", - std::string("touch_from_button_maps_") + std::to_string(i) + - std::string("_name"), - "default"); - const int num_touch_maps = sdl2_config->GetInteger( - "ControlsGeneral", - std::string("touch_from_button_maps_") + std::to_string(i) + std::string("_count"), - 0); - map.buttons.reserve(num_touch_maps); - - for (int j = 0; j < num_touch_maps; ++j) { - std::string touch_mapping = - sdl2_config->Get("ControlsGeneral", - std::string("touch_from_button_maps_") + std::to_string(i) + - std::string("_bind_") + std::to_string(j), - ""); - map.buttons.emplace_back(std::move(touch_mapping)); - } - - Settings::values.touch_from_button_maps.emplace_back(std::move(map)); - } - } else { - Settings::values.touch_from_button_maps.emplace_back( - Settings::TouchFromButtonMap{"default", {}}); - num_touch_from_button_maps = 1; - } - Settings::values.touch_from_button_map_index = std::clamp( - Settings::values.touch_from_button_map_index.GetValue(), 0, num_touch_from_button_maps - 1); - - ReadCategory(Settings::Category::Audio); - ReadCategory(Settings::Category::Core); - ReadCategory(Settings::Category::Cpu); - ReadCategory(Settings::Category::CpuDebug); - ReadCategory(Settings::Category::CpuUnsafe); - ReadCategory(Settings::Category::Renderer); - ReadCategory(Settings::Category::RendererAdvanced); - ReadCategory(Settings::Category::RendererDebug); - ReadCategory(Settings::Category::System); - ReadCategory(Settings::Category::SystemAudio); - ReadCategory(Settings::Category::DataStorage); - ReadCategory(Settings::Category::Debugging); - ReadCategory(Settings::Category::DebuggingGraphics); - ReadCategory(Settings::Category::Miscellaneous); - ReadCategory(Settings::Category::Network); - ReadCategory(Settings::Category::WebService); - - // Data Storage - FS::SetYuzuPath(FS::YuzuPath::NANDDir, - sdl2_config->Get("Data Storage", "nand_directory", - FS::GetYuzuPathString(FS::YuzuPath::NANDDir))); - FS::SetYuzuPath(FS::YuzuPath::SDMCDir, - sdl2_config->Get("Data Storage", "sdmc_directory", - FS::GetYuzuPathString(FS::YuzuPath::SDMCDir))); - FS::SetYuzuPath(FS::YuzuPath::LoadDir, - sdl2_config->Get("Data Storage", "load_directory", - FS::GetYuzuPathString(FS::YuzuPath::LoadDir))); - FS::SetYuzuPath(FS::YuzuPath::DumpDir, - sdl2_config->Get("Data Storage", "dump_directory", - FS::GetYuzuPathString(FS::YuzuPath::DumpDir))); - - // Debugging - Settings::values.record_frame_times = - sdl2_config->GetBoolean("Debugging", "record_frame_times", false); - - const auto title_list = sdl2_config->Get("AddOns", "title_ids", ""); - std::stringstream ss(title_list); - std::string line; - while (std::getline(ss, line, '|')) { - const auto title_id = std::strtoul(line.c_str(), nullptr, 16); - const auto disabled_list = sdl2_config->Get("AddOns", "disabled_" + line, ""); - - std::stringstream inner_ss(disabled_list); - std::string inner_line; - std::vector<std::string> out; - while (std::getline(inner_ss, inner_line, '|')) { - out.push_back(inner_line); - } - - Settings::values.disabled_addons.insert_or_assign(title_id, out); - } -} - -void Config::Reload() { - LoadINI(DefaultINI::sdl2_config_file); - ReadValues(); -} |