diff --git a/src/overlay_params.cpp b/src/overlay_params.cpp index 4bd7e88d..8ea1dab5 100644 --- a/src/overlay_params.cpp +++ b/src/overlay_params.cpp @@ -571,61 +571,115 @@ const char *overlay_param_names[] = { #undef OVERLAY_PARAM_CUSTOM }; +static void +initialize_preset(struct overlay_params *params) +{ + if (params->options.find("preset") != params->options.end()) { + auto presets = parse_preset(params->options.find("preset")->second.c_str()); + if (!presets.empty()) + params->preset = presets; + } + current_preset = params->preset[0]; +} + +static void +set_parameters_from_options(struct overlay_params *params) +{ + bool read_cfg = false; + if (params->options.find("read_cfg") != params->options.end() && params->options.find("read_cfg")->second != "0") + read_cfg = true; + + if (params->options.find("full") != params->options.end() && params->options.find("full")->second != "0") { +#define OVERLAY_PARAM_BOOL(name) \ + params->enabled[OVERLAY_PARAM_ENABLED_##name] = 1; +#define OVERLAY_PARAM_CUSTOM(name) + OVERLAY_PARAMS + #undef OVERLAY_PARAM_BOOL + #undef OVERLAY_PARAM_CUSTOM + params->enabled[OVERLAY_PARAM_ENABLED_histogram] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_fps_only] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_battery_icon] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_mangoapp_steam] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_hide_fsr_sharpness] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_throttling_status] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_fcat] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_horizontal] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_hud_no_margin] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_log_versioning] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_hud_compact] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_exec_name] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_trilinear] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_bicubic] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_retro] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_debug] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_engine_short_names] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_dynamic_frame_timing] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_temp_fahrenheit] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_duration] = false; + params->enabled[OVERLAY_PARAM_ENABLED_core_bars] = false; + params->enabled[OVERLAY_PARAM_ENABLED_read_cfg] = read_cfg; + params->options.erase("full"); + } + for (auto& it : params->options) { +#define OVERLAY_PARAM_BOOL(name) \ + if (it.first == #name) { \ + params->enabled[OVERLAY_PARAM_ENABLED_##name] = \ + strtol(it.second.c_str(), NULL, 0); \ + continue; \ + } +#define OVERLAY_PARAM_CUSTOM(name) \ + if (it.first == #name) { \ + params->name = parse_##name(it.second.c_str()); \ + continue; \ + } + OVERLAY_PARAMS + #undef OVERLAY_PARAM_BOOL + #undef OVERLAY_PARAM_CUSTOM + if (it.first == "preset") { + continue; // Handled above + } + SPDLOG_ERROR("Unknown option '{}'", it.first.c_str()); + } +} + static void parse_overlay_env(struct overlay_params *params, - const char *env) + const char *env, bool use_existing_preset) { + const char *env_start = env; + uint32_t num; char key[256], value[256]; while ((num = parse_string(env, key, value)) != 0) { trim_char(key); trim_char(value); env += num; - if (!strcmp("full", key)) { - bool read_cfg = params->enabled[OVERLAY_PARAM_ENABLED_read_cfg]; -#define OVERLAY_PARAM_BOOL(name) \ - params->enabled[OVERLAY_PARAM_ENABLED_##name] = 1; -#define OVERLAY_PARAM_CUSTOM(name) - OVERLAY_PARAMS -#undef OVERLAY_PARAM_BOOL -#undef OVERLAY_PARAM_CUSTOM - params->enabled[OVERLAY_PARAM_ENABLED_histogram] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_gpu_load_change] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_cpu_load_change] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_fps_only] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_fps_color_change] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_core_load_change] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_battery_icon] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_mangoapp_steam] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_hide_fsr_sharpness] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_throttling_status] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_read_cfg] = read_cfg; - params->enabled[OVERLAY_PARAM_ENABLED_fcat] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_horizontal] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_horizontal_stretch] = 1; - params->enabled[OVERLAY_PARAM_ENABLED_hud_no_margin] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_log_versioning] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_hud_compact] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_exec_name] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_trilinear] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_bicubic] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_retro] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_debug] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_engine_short_names] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_dynamic_frame_timing] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_temp_fahrenheit] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_core_bars] = false; + if (!strcmp("preset", key)) { + if (!use_existing_preset) { + add_to_options(params, key, value); + initialize_preset(params); + } + presets(current_preset, params); + break; + } + } + + env = env_start; + + while ((num = parse_string(env, key, value)) != 0) { + trim_char(key); + trim_char(value); + env += num; + if (!strcmp("preset", key)) { + continue; // Avoid 'Unknown option' error } #define OVERLAY_PARAM_BOOL(name) \ if (!strcmp(#name, key)) { \ - params->enabled[OVERLAY_PARAM_ENABLED_##name] = \ - strtol(value, NULL, 0); \ add_to_options(params, key, value); \ continue; \ } #define OVERLAY_PARAM_CUSTOM(name) \ if (!strcmp(#name, key)) { \ - params->name = parse_##name(value); \ add_to_options(params, key, value); \ continue; \ } @@ -634,6 +688,7 @@ parse_overlay_env(struct overlay_params *params, #undef OVERLAY_PARAM_CUSTOM SPDLOG_ERROR("Unknown option '{}'", key); } + set_parameters_from_options(params); } static void set_param_defaults(struct overlay_params *params){ @@ -768,23 +823,20 @@ parse_overlay_config(struct overlay_params *params, HUDElements.ordered_functions.clear(); HUDElements.exec_list.clear(); + params->options.clear(); + HUDElements.options.clear(); + // first pass with env var if (env) - parse_overlay_env(params, env); + parse_overlay_env(params, env, use_existing_preset); bool read_cfg = params->enabled[OVERLAY_PARAM_ENABLED_read_cfg]; + bool env_contains_preset = params->options.find("preset") != params->options.end(); if (!env || read_cfg) { - - // this pass is just to get preset option parseConfigFile(*params); - if (!use_existing_preset) { - if (params->options.find("preset") != params->options.end()) { - auto presets = parse_preset(params->options.find("preset")->second.c_str()); - if (!presets.empty()) - params->preset = presets; - } - current_preset = params->preset[0]; + if (!use_existing_preset && !env_contains_preset) { + initialize_preset(params); } // clear options since we don't want config options to appear first @@ -795,56 +847,7 @@ parse_overlay_config(struct overlay_params *params, // potentially override preset options with config options parseConfigFile(*params); - if (params->options.find("full") != params->options.end() && params->options.find("full")->second != "0") { -#define OVERLAY_PARAM_BOOL(name) \ - params->enabled[OVERLAY_PARAM_ENABLED_##name] = 1; -#define OVERLAY_PARAM_CUSTOM(name) - OVERLAY_PARAMS -#undef OVERLAY_PARAM_BOOL -#undef OVERLAY_PARAM_CUSTOM - params->enabled[OVERLAY_PARAM_ENABLED_histogram] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_fps_only] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_battery_icon] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_mangoapp_steam] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_hide_fsr_sharpness] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_throttling_status] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_fcat] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_horizontal] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_hud_no_margin] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_log_versioning] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_hud_compact] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_exec_name] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_trilinear] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_bicubic] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_retro] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_debug] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_engine_short_names] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_dynamic_frame_timing] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_temp_fahrenheit] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_duration] = false; - params->enabled[OVERLAY_PARAM_ENABLED_core_bars] = false; - params->options.erase("full"); - } - for (auto& it : params->options) { -#define OVERLAY_PARAM_BOOL(name) \ - if (it.first == #name) { \ - params->enabled[OVERLAY_PARAM_ENABLED_##name] = \ - strtol(it.second.c_str(), NULL, 0); \ - continue; \ - } -#define OVERLAY_PARAM_CUSTOM(name) \ - if (it.first == #name) { \ - params->name = parse_##name(it.second.c_str()); \ - continue; \ - } - OVERLAY_PARAMS -#undef OVERLAY_PARAM_BOOL -#undef OVERLAY_PARAM_CUSTOM - if (it.first == "preset") { - continue; - } - SPDLOG_ERROR("Unknown option '{}'", it.first.c_str()); - } + set_parameters_from_options(params); } // TODO decide what to do for legacy_layout=0 @@ -852,7 +855,7 @@ parse_overlay_config(struct overlay_params *params, if (params->enabled[OVERLAY_PARAM_ENABLED_legacy_layout] && env && read_cfg) { // If passing legacy_layout=0 to MANGOHUD_CONFIG anyway then clear first pass' results HUDElements.ordered_functions.clear(); - parse_overlay_env(params, env); + parse_overlay_env(params, env, true); } // If fps_only param is enabled disable legacy_layout