diff --git a/src/config.cpp b/src/config.cpp index 65eff07e..9e547856 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -12,7 +12,7 @@ #include "hud_elements.h" #include "blacklist.h" -static void parseConfigLine(std::string line, std::unordered_map& options) { +void parseConfigLine(std::string line, std::unordered_map& options) { std::string param, value; if (line.find("#") != std::string::npos) diff --git a/src/config.h b/src/config.h index ca1b5104..c033bbd5 100644 --- a/src/config.h +++ b/src/config.h @@ -7,5 +7,5 @@ void parseConfigFile(overlay_params& p); std::string get_program_name(); - +void parseConfigLine(std::string line, std::unordered_map& options); #endif //MANGOHUD_CONFIG_H diff --git a/src/overlay.cpp b/src/overlay.cpp index 3a813360..d21043d6 100644 --- a/src/overlay.cpp +++ b/src/overlay.cpp @@ -613,7 +613,7 @@ void render_imgui(swapchain_stats& data, struct overlay_params& params, ImVec2& func.first(); HUDElements.place += 1; ImGui::PopStyleVar(); - if(params.enabled[OVERLAY_PARAM_ENABLED_horizontal] && func != HUDElements.ordered_functions.back()) + if(!HUDElements.ordered_functions.empty() && params.enabled[OVERLAY_PARAM_ENABLED_horizontal] && func != HUDElements.ordered_functions.back()) horizontal_separator(params); } ImGui::EndTable(); diff --git a/src/overlay_params.cpp b/src/overlay_params.cpp index e0108481..f64a53e4 100644 --- a/src/overlay_params.cpp +++ b/src/overlay_params.cpp @@ -27,6 +27,7 @@ #include "hud_elements.h" #include "blacklist.h" #include "mesa/util/os_socket.h" +#include "file_utils.h" #ifdef HAVE_X11 #include @@ -421,6 +422,7 @@ parse_gl_size_query(const char *str) #define parse_fcat_screen_edge(s) parse_unsigned(s) #define parse_picmip(s) parse_signed(s) #define parse_af(s) parse_signed(s) +#define parse_preset(s) parse_signed(s) #define parse_cpu_color(s) parse_color(s) #define parse_gpu_color(s) parse_color(s) @@ -652,6 +654,7 @@ parse_overlay_config(struct overlay_params *params, params->fsr_steam_sharpness = -1; params->picmip = 0; params->af = -1; + params->preset = -1; #ifdef HAVE_X11 params->toggle_hud = { XK_Shift_R, XK_F12 }; @@ -691,6 +694,10 @@ parse_overlay_config(struct overlay_params *params, // Get config options parseConfigFile(*params); + + if (params->options.find("preset") != params->options.end() && params->options.find("preset")->second != "0") + presets(stoi(params->options.find("preset")->second), 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; @@ -883,3 +890,110 @@ parse_overlay_config(struct overlay_params *params, g_fsrSharpness = params->fsr_steam_sharpness; #endif } + +bool parse_preset_config(int preset, struct overlay_params *params){ + const std::string data_dir = get_data_dir(); + const std::string config_dir = get_config_dir(); + std::string preset_path = config_dir + "/MangoHud/" + "presets.conf"; + FILE *preset_file = fopen(preset_path.c_str(), "r"); + char line[20]; + char preset_string[20]; + sprintf(preset_string, "[preset %d]\n", preset); + bool found_preset = false; + if (preset_file == NULL) + return false; + + while (fgets(line, sizeof(line), preset_file)){ + if (strcmp(line, preset_string) == 0){ + found_preset = true; + continue; + } + + if (found_preset){ + if(strcmp(line, "preset") == 0 || line[0] == '\n' || line[0] == '\0') + break; + + parseConfigLine(line, params->options); + } + } + + fclose(preset_file); + return found_preset; +} + +void add_to_options(struct overlay_params *params, std::string option, std::string value){ + HUDElements.options.push_back({option, value}); + params->options[option] = value; +} + +void presets(int preset, struct overlay_params *params) { + HUDElements.options.clear(); + params->options.clear(); + + if (parse_preset_config(preset, params)) + return; + + switch(preset) { + case 0: + params->no_display = 1; + break; + + case 1: + params->width = 40; + add_to_options(params, "legacy_layout", "0"); + add_to_options(params, "cpu_stats", "0"); + add_to_options(params, "gpu_stats", "0"); + add_to_options(params, "fps", "1"); + add_to_options(params, "fps_only", "1"); + add_to_options(params, "frametime", "0"); + break; + + case 2: + params->table_columns = 20; + add_to_options(params, "horizontal", "1"); + add_to_options(params, "legacy_layout", "0"); + add_to_options(params, "fps", "1"); + add_to_options(params, "table_columns", "20"); + add_to_options(params, "frame_timing", "1"); + add_to_options(params, "frametime", "0"); + add_to_options(params, "cpu_stats", "1"); + add_to_options(params, "gpu_stats", "1"); + add_to_options(params, "ram", "1"); + add_to_options(params, "vram", "1"); + add_to_options(params, "battery", "1"); + add_to_options(params, "hud_no_margin", "1"); + add_to_options(params, "gpu_power", "1"); + add_to_options(params, "cpu_power", "1"); + add_to_options(params, "battery_watt", "1"); + add_to_options(params, "battery_time", "1"); + break; + + case 3: + add_to_options(params, "cpu_temp", "1"); + add_to_options(params, "gpu_temp", "1"); + add_to_options(params, "ram", "1"); + add_to_options(params, "vram", "1"); + add_to_options(params, "cpu_power", "1"); + add_to_options(params, "gpu_power", "1"); + add_to_options(params, "cpu_mhz", "1"); + add_to_options(params, "gpu_mem_clock", "1"); + add_to_options(params, "gpu_core_clock", "1"); + add_to_options(params, "battery", "1"); + break; + + case 4: + add_to_options(params, "full", "1"); + add_to_options(params, "io_read", "0"); + add_to_options(params, "io_write", "0"); + add_to_options(params, "arch", "0"); + add_to_options(params, "engine_version", "0"); + add_to_options(params, "battery", "1"); + add_to_options(params, "gamemode", "0"); + add_to_options(params, "vkbasalt", "0"); + add_to_options(params, "frame_count", "0"); + add_to_options(params, "show_fps_limit", "0"); + add_to_options(params, "resolution", "0"); + break; + + } +} diff --git a/src/overlay_params.h b/src/overlay_params.h index 065fbe3a..3ac1fdda 100644 --- a/src/overlay_params.h +++ b/src/overlay_params.h @@ -169,6 +169,7 @@ typedef unsigned long KeySym; OVERLAY_PARAM_CUSTOM(fcat_overlay_width) \ OVERLAY_PARAM_CUSTOM(picmip) \ OVERLAY_PARAM_CUSTOM(af) \ + OVERLAY_PARAM_CUSTOM(preset) \ enum overlay_param_position { LAYER_POSITION_TOP_LEFT, @@ -283,6 +284,7 @@ struct overlay_params { unsigned short fcat_overlay_width; int picmip; int af; + int preset; size_t font_params_hash; }; @@ -290,6 +292,9 @@ const extern char *overlay_param_names[]; void parse_overlay_config(struct overlay_params *params, const char *env); +void presets(int preset, struct overlay_params *params); +bool parse_preset_config(int preset, struct overlay_params *params); +void add_to_options(struct overlay_params *params, std::string option, std::string value); #ifdef __cplusplus }