|
|
|
@ -241,6 +241,24 @@ static const std::array<int, 8> keyboard_mods{
|
|
|
|
|
SDL_SCANCODE_RCTRL, SDL_SCANCODE_RSHIFT, SDL_SCANCODE_RALT, SDL_SCANCODE_RGUI,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
void Config::ReadSetting(const std::string& group, Settings::BasicSetting<float>& setting) {
|
|
|
|
|
setting = sdl2_config->GetReal(group, setting.GetLabel(), setting.GetDefault());
|
|
|
|
|
}
|
|
|
|
|
template <>
|
|
|
|
|
void Config::ReadSetting(const std::string& group, Settings::BasicSetting<std::string>& setting) {
|
|
|
|
|
setting = sdl2_config->Get(group, setting.GetLabel(), setting.GetDefault());
|
|
|
|
|
}
|
|
|
|
|
template <>
|
|
|
|
|
void Config::ReadSetting(const std::string& group, Settings::BasicSetting<bool>& setting) {
|
|
|
|
|
setting = sdl2_config->GetBoolean(group, setting.GetLabel(), setting.GetDefault());
|
|
|
|
|
}
|
|
|
|
|
template <typename Type>
|
|
|
|
|
void Config::ReadSetting(const std::string& group, Settings::BasicSetting<Type>& setting) {
|
|
|
|
|
setting = static_cast<Type>(sdl2_config->GetInteger(group, setting.GetLabel(),
|
|
|
|
|
static_cast<long>(setting.GetDefault())));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Config::ReadValues() {
|
|
|
|
|
// Controls
|
|
|
|
|
for (std::size_t p = 0; p < Settings::values.players.GetValue().size(); ++p) {
|
|
|
|
@ -264,8 +282,7 @@ void Config::ReadValues() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Settings::values.mouse_enabled =
|
|
|
|
|
sdl2_config->GetBoolean("ControlsGeneral", "mouse_enabled", false);
|
|
|
|
|
ReadSetting("ControlsGeneral", Settings::values.mouse_enabled);
|
|
|
|
|
for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) {
|
|
|
|
|
std::string default_param = InputCommon::GenerateKeyboardParam(default_mouse_buttons[i]);
|
|
|
|
|
Settings::values.mouse_buttons[i] = sdl2_config->Get(
|
|
|
|
@ -275,14 +292,11 @@ void Config::ReadValues() {
|
|
|
|
|
Settings::values.mouse_buttons[i] = default_param;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Settings::values.motion_device = sdl2_config->Get(
|
|
|
|
|
"ControlsGeneral", "motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01");
|
|
|
|
|
ReadSetting("ControlsGeneral", Settings::values.motion_device);
|
|
|
|
|
|
|
|
|
|
Settings::values.keyboard_enabled =
|
|
|
|
|
sdl2_config->GetBoolean("ControlsGeneral", "keyboard_enabled", false);
|
|
|
|
|
ReadSetting("ControlsGeneral", Settings::values.keyboard_enabled);
|
|
|
|
|
|
|
|
|
|
Settings::values.debug_pad_enabled =
|
|
|
|
|
sdl2_config->GetBoolean("ControlsGeneral", "debug_pad_enabled", false);
|
|
|
|
|
ReadSetting("ControlsGeneral", Settings::values.debug_pad_enabled);
|
|
|
|
|
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(
|
|
|
|
@ -303,12 +317,9 @@ void Config::ReadValues() {
|
|
|
|
|
Settings::values.debug_pad_analogs[i] = default_param;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Settings::values.vibration_enabled.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("ControlsGeneral", "vibration_enabled", true));
|
|
|
|
|
Settings::values.enable_accurate_vibrations.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("ControlsGeneral", "enable_accurate_vibrations", false));
|
|
|
|
|
Settings::values.motion_enabled.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("ControlsGeneral", "motion_enabled", true));
|
|
|
|
|
ReadSetting("ControlsGeneral", Settings::values.vibration_enabled);
|
|
|
|
|
ReadSetting("ControlsGeneral", Settings::values.enable_accurate_vibrations);
|
|
|
|
|
ReadSetting("ControlsGeneral", Settings::values.motion_enabled);
|
|
|
|
|
Settings::values.touchscreen.enabled =
|
|
|
|
|
sdl2_config->GetBoolean("ControlsGeneral", "touch_enabled", true);
|
|
|
|
|
Settings::values.touchscreen.rotation_angle =
|
|
|
|
@ -349,13 +360,11 @@ void Config::ReadValues() {
|
|
|
|
|
Settings::TouchFromButtonMap{"default", {}});
|
|
|
|
|
num_touch_from_button_maps = 1;
|
|
|
|
|
}
|
|
|
|
|
Settings::values.use_touch_from_button =
|
|
|
|
|
sdl2_config->GetBoolean("ControlsGeneral", "use_touch_from_button", false);
|
|
|
|
|
Settings::values.touch_from_button_map_index =
|
|
|
|
|
std::clamp(Settings::values.touch_from_button_map_index, 0, num_touch_from_button_maps - 1);
|
|
|
|
|
ReadSetting("ControlsGeneral", Settings::values.use_touch_from_button);
|
|
|
|
|
Settings::values.touch_from_button_map_index = std::clamp(
|
|
|
|
|
Settings::values.touch_from_button_map_index.GetValue(), 0, num_touch_from_button_maps - 1);
|
|
|
|
|
|
|
|
|
|
Settings::values.udp_input_servers =
|
|
|
|
|
sdl2_config->Get("Controls", "udp_input_address", InputCommon::CemuhookUDP::DEFAULT_SRV);
|
|
|
|
|
ReadSetting("ControlsGeneral", Settings::values.udp_input_servers);
|
|
|
|
|
|
|
|
|
|
std::transform(keyboard_keys.begin(), keyboard_keys.end(),
|
|
|
|
|
Settings::values.keyboard_keys.begin(), InputCommon::GenerateKeyboardParam);
|
|
|
|
@ -367,8 +376,7 @@ void Config::ReadValues() {
|
|
|
|
|
Settings::values.keyboard_mods.begin(), InputCommon::GenerateKeyboardParam);
|
|
|
|
|
|
|
|
|
|
// Data Storage
|
|
|
|
|
Settings::values.use_virtual_sd =
|
|
|
|
|
sdl2_config->GetBoolean("Data Storage", "use_virtual_sd", true);
|
|
|
|
|
ReadSetting("Data Storage", Settings::values.use_virtual_sd);
|
|
|
|
|
FS::SetYuzuPath(FS::YuzuPath::NANDDir,
|
|
|
|
|
sdl2_config->Get("Data Storage", "nand_directory",
|
|
|
|
|
FS::GetYuzuPathString(FS::YuzuPath::NANDDir)));
|
|
|
|
@ -381,18 +389,16 @@ void Config::ReadValues() {
|
|
|
|
|
FS::SetYuzuPath(FS::YuzuPath::DumpDir,
|
|
|
|
|
sdl2_config->Get("Data Storage", "dump_directory",
|
|
|
|
|
FS::GetYuzuPathString(FS::YuzuPath::DumpDir)));
|
|
|
|
|
Settings::values.gamecard_inserted =
|
|
|
|
|
sdl2_config->GetBoolean("Data Storage", "gamecard_inserted", false);
|
|
|
|
|
Settings::values.gamecard_current_game =
|
|
|
|
|
sdl2_config->GetBoolean("Data Storage", "gamecard_current_game", false);
|
|
|
|
|
Settings::values.gamecard_path = sdl2_config->Get("Data Storage", "gamecard_path", "");
|
|
|
|
|
ReadSetting("Data Storage", Settings::values.gamecard_inserted);
|
|
|
|
|
ReadSetting("Data Storage", Settings::values.gamecard_current_game);
|
|
|
|
|
ReadSetting("Data Storage", Settings::values.gamecard_path);
|
|
|
|
|
|
|
|
|
|
// System
|
|
|
|
|
Settings::values.use_docked_mode.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("System", "use_docked_mode", true));
|
|
|
|
|
ReadSetting("System", Settings::values.use_docked_mode);
|
|
|
|
|
|
|
|
|
|
Settings::values.current_user = std::clamp<int>(
|
|
|
|
|
sdl2_config->GetInteger("System", "current_user", 0), 0, Service::Account::MAX_USERS - 1);
|
|
|
|
|
ReadSetting("System", Settings::values.current_user);
|
|
|
|
|
Settings::values.current_user = std::clamp<int>(Settings::values.current_user.GetValue(), 0,
|
|
|
|
|
Service::Account::MAX_USERS - 1);
|
|
|
|
|
|
|
|
|
|
const auto rng_seed_enabled = sdl2_config->GetBoolean("System", "rng_seed_enabled", false);
|
|
|
|
|
if (rng_seed_enabled) {
|
|
|
|
@ -409,89 +415,60 @@ void Config::ReadValues() {
|
|
|
|
|
Settings::values.custom_rtc = std::nullopt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Settings::values.language_index.SetValue(
|
|
|
|
|
sdl2_config->GetInteger("System", "language_index", 1));
|
|
|
|
|
Settings::values.time_zone_index.SetValue(
|
|
|
|
|
sdl2_config->GetInteger("System", "time_zone_index", 0));
|
|
|
|
|
ReadSetting("System", Settings::values.language_index);
|
|
|
|
|
ReadSetting("System", Settings::values.time_zone_index);
|
|
|
|
|
|
|
|
|
|
// Core
|
|
|
|
|
Settings::values.use_multi_core.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("Core", "use_multi_core", true));
|
|
|
|
|
ReadSetting("Core", Settings::values.use_multi_core);
|
|
|
|
|
|
|
|
|
|
// Renderer
|
|
|
|
|
const int renderer_backend = sdl2_config->GetInteger(
|
|
|
|
|
"Renderer", "backend", static_cast<int>(Settings::RendererBackend::OpenGL));
|
|
|
|
|
Settings::values.renderer_backend.SetValue(
|
|
|
|
|
static_cast<Settings::RendererBackend>(renderer_backend));
|
|
|
|
|
Settings::values.renderer_debug = sdl2_config->GetBoolean("Renderer", "debug", false);
|
|
|
|
|
Settings::values.vulkan_device.SetValue(
|
|
|
|
|
sdl2_config->GetInteger("Renderer", "vulkan_device", 0));
|
|
|
|
|
ReadSetting("Renderer", Settings::values.renderer_backend);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.renderer_debug);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.vulkan_device);
|
|
|
|
|
|
|
|
|
|
Settings::values.aspect_ratio.SetValue(
|
|
|
|
|
static_cast<int>(sdl2_config->GetInteger("Renderer", "aspect_ratio", 0)));
|
|
|
|
|
Settings::values.max_anisotropy.SetValue(
|
|
|
|
|
static_cast<int>(sdl2_config->GetInteger("Renderer", "max_anisotropy", 0)));
|
|
|
|
|
Settings::values.use_frame_limit.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("Renderer", "use_frame_limit", true));
|
|
|
|
|
Settings::values.frame_limit.SetValue(
|
|
|
|
|
static_cast<u16>(sdl2_config->GetInteger("Renderer", "frame_limit", 100)));
|
|
|
|
|
Settings::values.use_disk_shader_cache.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("Renderer", "use_disk_shader_cache", false));
|
|
|
|
|
const int gpu_accuracy_level = sdl2_config->GetInteger("Renderer", "gpu_accuracy", 1);
|
|
|
|
|
Settings::values.gpu_accuracy.SetValue(static_cast<Settings::GPUAccuracy>(gpu_accuracy_level));
|
|
|
|
|
Settings::values.use_asynchronous_gpu_emulation.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("Renderer", "use_asynchronous_gpu_emulation", true));
|
|
|
|
|
Settings::values.use_vsync.SetValue(
|
|
|
|
|
static_cast<u16>(sdl2_config->GetInteger("Renderer", "use_vsync", 1)));
|
|
|
|
|
Settings::values.disable_fps_limit.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("Renderer", "disable_fps_limit", false));
|
|
|
|
|
Settings::values.use_assembly_shaders.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("Renderer", "use_assembly_shaders", true));
|
|
|
|
|
Settings::values.use_asynchronous_shaders.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("Renderer", "use_asynchronous_shaders", false));
|
|
|
|
|
Settings::values.use_nvdec_emulation.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("Renderer", "use_nvdec_emulation", true));
|
|
|
|
|
Settings::values.accelerate_astc.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("Renderer", "accelerate_astc", true));
|
|
|
|
|
Settings::values.use_fast_gpu_time.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("Renderer", "use_fast_gpu_time", true));
|
|
|
|
|
ReadSetting("Renderer", Settings::values.aspect_ratio);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.max_anisotropy);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.use_frame_limit);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.frame_limit);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.use_disk_shader_cache);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.gpu_accuracy);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.use_asynchronous_gpu_emulation);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.use_vsync);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.disable_fps_limit);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.use_assembly_shaders);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.use_asynchronous_shaders);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.use_nvdec_emulation);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.accelerate_astc);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.use_fast_gpu_time);
|
|
|
|
|
|
|
|
|
|
Settings::values.bg_red.SetValue(
|
|
|
|
|
static_cast<float>(sdl2_config->GetReal("Renderer", "bg_red", 0.0)));
|
|
|
|
|
Settings::values.bg_green.SetValue(
|
|
|
|
|
static_cast<float>(sdl2_config->GetReal("Renderer", "bg_green", 0.0)));
|
|
|
|
|
Settings::values.bg_blue.SetValue(
|
|
|
|
|
static_cast<float>(sdl2_config->GetReal("Renderer", "bg_blue", 0.0)));
|
|
|
|
|
ReadSetting("Renderer", Settings::values.bg_red);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.bg_green);
|
|
|
|
|
ReadSetting("Renderer", Settings::values.bg_blue);
|
|
|
|
|
|
|
|
|
|
// Audio
|
|
|
|
|
Settings::values.sink_id = sdl2_config->Get("Audio", "output_engine", "auto");
|
|
|
|
|
Settings::values.enable_audio_stretching.SetValue(
|
|
|
|
|
sdl2_config->GetBoolean("Audio", "enable_audio_stretching", true));
|
|
|
|
|
Settings::values.audio_device_id = sdl2_config->Get("Audio", "output_device", "auto");
|
|
|
|
|
Settings::values.volume.SetValue(
|
|
|
|
|
static_cast<float>(sdl2_config->GetReal("Audio", "volume", 1)));
|
|
|
|
|
ReadSetting("Audio", Settings::values.sink_id);
|
|
|
|
|
ReadSetting("Audio", Settings::values.enable_audio_stretching);
|
|
|
|
|
ReadSetting("Audio", Settings::values.audio_device_id);
|
|
|
|
|
ReadSetting("Audio", Settings::values.volume);
|
|
|
|
|
|
|
|
|
|
// Miscellaneous
|
|
|
|
|
Settings::values.log_filter = sdl2_config->Get("Miscellaneous", "log_filter", "*:Trace");
|
|
|
|
|
Settings::values.use_dev_keys = sdl2_config->GetBoolean("Miscellaneous", "use_dev_keys", false);
|
|
|
|
|
// log_filter has a different default here than from common
|
|
|
|
|
Settings::values.log_filter =
|
|
|
|
|
sdl2_config->Get("Miscellaneous", Settings::values.log_filter.GetLabel(), "*:Trace");
|
|
|
|
|
ReadSetting("Miscellaneous", Settings::values.use_dev_keys);
|
|
|
|
|
|
|
|
|
|
// Debugging
|
|
|
|
|
Settings::values.record_frame_times =
|
|
|
|
|
sdl2_config->GetBoolean("Debugging", "record_frame_times", false);
|
|
|
|
|
Settings::values.program_args = sdl2_config->Get("Debugging", "program_args", "");
|
|
|
|
|
Settings::values.dump_exefs = sdl2_config->GetBoolean("Debugging", "dump_exefs", false);
|
|
|
|
|
Settings::values.dump_nso = sdl2_config->GetBoolean("Debugging", "dump_nso", false);
|
|
|
|
|
Settings::values.enable_fs_access_log =
|
|
|
|
|
sdl2_config->GetBoolean("Debugging", "enable_fs_access_log", false);
|
|
|
|
|
Settings::values.reporting_services =
|
|
|
|
|
sdl2_config->GetBoolean("Debugging", "reporting_services", false);
|
|
|
|
|
Settings::values.quest_flag = sdl2_config->GetBoolean("Debugging", "quest_flag", false);
|
|
|
|
|
Settings::values.use_debug_asserts =
|
|
|
|
|
sdl2_config->GetBoolean("Debugging", "use_debug_asserts", false);
|
|
|
|
|
Settings::values.use_auto_stub = sdl2_config->GetBoolean("Debugging", "use_auto_stub", false);
|
|
|
|
|
|
|
|
|
|
Settings::values.disable_macro_jit =
|
|
|
|
|
sdl2_config->GetBoolean("Debugging", "disable_macro_jit", false);
|
|
|
|
|
ReadSetting("Debugging", Settings::values.program_args);
|
|
|
|
|
ReadSetting("Debugging", Settings::values.dump_exefs);
|
|
|
|
|
ReadSetting("Debugging", Settings::values.dump_nso);
|
|
|
|
|
ReadSetting("Debugging", Settings::values.enable_fs_access_log);
|
|
|
|
|
ReadSetting("Debugging", Settings::values.reporting_services);
|
|
|
|
|
ReadSetting("Debugging", Settings::values.quest_flag);
|
|
|
|
|
ReadSetting("Debugging", Settings::values.use_debug_asserts);
|
|
|
|
|
ReadSetting("Debugging", Settings::values.use_auto_stub);
|
|
|
|
|
ReadSetting("Debugging", Settings::values.disable_macro_jit);
|
|
|
|
|
|
|
|
|
|
const auto title_list = sdl2_config->Get("AddOns", "title_ids", "");
|
|
|
|
|
std::stringstream ss(title_list);
|
|
|
|
@ -511,17 +488,14 @@ void Config::ReadValues() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Web Service
|
|
|
|
|
Settings::values.enable_telemetry =
|
|
|
|
|
sdl2_config->GetBoolean("WebService", "enable_telemetry", true);
|
|
|
|
|
Settings::values.web_api_url =
|
|
|
|
|
sdl2_config->Get("WebService", "web_api_url", "https://api.yuzu-emu.org");
|
|
|
|
|
Settings::values.yuzu_username = sdl2_config->Get("WebService", "yuzu_username", "");
|
|
|
|
|
Settings::values.yuzu_token = sdl2_config->Get("WebService", "yuzu_token", "");
|
|
|
|
|
ReadSetting("WebService", Settings::values.enable_telemetry);
|
|
|
|
|
ReadSetting("WebService", Settings::values.web_api_url);
|
|
|
|
|
ReadSetting("WebService", Settings::values.yuzu_username);
|
|
|
|
|
ReadSetting("WebService", Settings::values.yuzu_token);
|
|
|
|
|
|
|
|
|
|
// Services
|
|
|
|
|
Settings::values.bcat_backend = sdl2_config->Get("Services", "bcat_backend", "none");
|
|
|
|
|
Settings::values.bcat_boxcat_local =
|
|
|
|
|
sdl2_config->GetBoolean("Services", "bcat_boxcat_local", false);
|
|
|
|
|
ReadSetting("Services", Settings::values.bcat_backend);
|
|
|
|
|
ReadSetting("Services", Settings::values.bcat_boxcat_local);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Config::Reload() {
|
|
|
|
|