From cd05d1771fb60def6aaec49a432f612afb030d1b Mon Sep 17 00:00:00 2001 From: Alex Maese Date: Thu, 6 Jul 2023 23:23:12 -0500 Subject: [PATCH] Add ability to toggle through presets --- src/app/main.cpp | 6 ++--- src/gl/gl_hud.cpp | 2 +- src/keybinds.cpp | 16 ++++++++++++- src/keybinds.h | 2 +- src/notify.cpp | 2 +- src/overlay.cpp | 1 + src/overlay.h | 1 + src/overlay_params.cpp | 53 ++++++++++++++++++++++++++++++++++++------ src/overlay_params.h | 7 +++--- src/vulkan.cpp | 2 +- src/win/d3d_shared.cpp | 4 ++-- 11 files changed, 76 insertions(+), 20 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 5dc064d9..a5cf4017 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -98,12 +98,12 @@ static void ctrl_thread(){ case 0: break; case 1: - parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG")); + parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG"), false); break; case 2: break; case 3: - parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG")); + parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG"), false); break; } { @@ -286,7 +286,7 @@ int main(int, char**) // Setup Platform/Renderer backends int control_client = -1; - parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG")); + parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG"), false); create_fonts(nullptr, params, sw_stats.font1, sw_stats.font_text); HUDElements.convert_colors(params); init_cpu_stats(params); diff --git a/src/gl/gl_hud.cpp b/src/gl/gl_hud.cpp index 6bdada0b..75029d35 100644 --- a/src/gl/gl_hud.cpp +++ b/src/gl/gl_hud.cpp @@ -75,7 +75,7 @@ void imgui_init() if (is_blacklisted()) return; - parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG")); + parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG"), false); _params = ¶ms; //check for blacklist item in the config file diff --git a/src/keybinds.cpp b/src/keybinds.cpp index a7e93ca9..c09f70c9 100644 --- a/src/keybinds.cpp +++ b/src/keybinds.cpp @@ -9,6 +9,7 @@ void check_keybinds(struct overlay_params& params, uint32_t vendorID){ auto now = Clock::now(); /* us */ auto elapsedF2 = now - last_f2_press; auto elapsedFpsLimitToggle = now - toggle_fps_limit_press; + auto elapsedPresetToggle = now - toggle_preset_press; auto elapsedF12 = now - last_f12_press; auto elapsedReloadCfg = now - reload_cfg_press; auto elapsedUpload = now - last_upload_press; @@ -50,6 +51,19 @@ void check_keybinds(struct overlay_params& params, uint32_t vendorID){ } } + if (elapsedPresetToggle >= keyPressDelay && + keys_are_pressed(params.toggle_preset)) { + toggle_preset_press = now; + size_t size = params.preset.size(); + for (size_t i = 0; i < size; i++){ + if(params.preset[i] == current_preset) { + current_preset = params.preset[++i%size]; + parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG"), true); + break; + } + } + } + if (elapsedF12 >= keyPressDelay && keys_are_pressed(params.toggle_hud)) { last_f12_press = now; @@ -58,7 +72,7 @@ void check_keybinds(struct overlay_params& params, uint32_t vendorID){ if (elapsedReloadCfg >= keyPressDelay && keys_are_pressed(params.reload_cfg)) { - parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG")); + parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG"), false); _params = ¶ms; reload_cfg_press = now; } diff --git a/src/keybinds.h b/src/keybinds.h index 45633cf2..e48aafa9 100644 --- a/src/keybinds.h +++ b/src/keybinds.h @@ -11,7 +11,7 @@ typedef unsigned long KeySym; #endif -Clock::time_point last_f2_press, toggle_fps_limit_press , last_f12_press, reload_cfg_press, last_upload_press; +Clock::time_point last_f2_press, toggle_fps_limit_press, toggle_preset_press, last_f12_press, reload_cfg_press, last_upload_press; #if defined(HAVE_X11) static inline bool keys_are_pressed(const std::vector& keys) { diff --git a/src/notify.cpp b/src/notify.cpp index 589d2792..0e07c71e 100644 --- a/src/notify.cpp +++ b/src/notify.cpp @@ -25,7 +25,7 @@ static void fileChanged(notify_thread *nt) { // In the case of IN_DELETE_SELF, some editors may do a save-to-temp-file/delete-original/move-temp-file // so sleep a little to let file to be replaced std::this_thread::sleep_for(std::chrono::milliseconds(100)); - parse_overlay_config(&local_params, getenv("MANGOHUD_CONFIG")); + parse_overlay_config(&local_params, getenv("MANGOHUD_CONFIG"), false); if ((event->mask & IN_DELETE_SELF) || (nt->params->config_file_path != local_params.config_file_path)) { SPDLOG_DEBUG("Watching config file: {}", local_params.config_file_path.c_str()); inotify_rm_watch(nt->fd, nt->wd); diff --git a/src/overlay.cpp b/src/overlay.cpp index 7665bd6d..293ef3ba 100644 --- a/src/overlay.cpp +++ b/src/overlay.cpp @@ -51,6 +51,7 @@ vector frametime_data(200,0.f); int fan_speed; fcatoverlay fcatstatus; std::string drm_dev; +int current_preset; void init_spdlog() { diff --git a/src/overlay.h b/src/overlay.h index 0cfd4bed..909988a7 100644 --- a/src/overlay.h +++ b/src/overlay.h @@ -90,6 +90,7 @@ extern overlay_params *_params; extern double min_frametime, max_frametime; extern bool steam_focused; extern int fan_speed; +extern int current_preset; void init_spdlog(); void overlay_new_frame(const struct overlay_params& params); diff --git a/src/overlay_params.cpp b/src/overlay_params.cpp index d60ea3aa..17128fa5 100644 --- a/src/overlay_params.cpp +++ b/src/overlay_params.cpp @@ -151,6 +151,7 @@ parse_string_to_keysym_vec(const char *str) #define parse_upload_log parse_string_to_keysym_vec #define parse_upload_logs parse_string_to_keysym_vec #define parse_toggle_fps_limit parse_string_to_keysym_vec +#define parse_toggle_preset parse_string_to_keysym_vec #else #define parse_toggle_hud(x) {} @@ -160,8 +161,33 @@ parse_string_to_keysym_vec(const char *str) #define parse_upload_log(x) {} #define parse_upload_logs(x) {} #define parse_toggle_fps_limit(x) {} +#define parse_toggle_preset(x) {} #endif +// NOTE: This is NOT defined as an OVERLAY_PARAM and will be called manually +static std::vector +parse_preset(const char *str) +{ + std::vector presets; + auto preset_strings = str_tokenize(str); + + for (auto& value : preset_strings) { + trim(value); + + uint32_t as_int; + try { + as_int = static_cast(std::stoi(value)); + } catch (const std::invalid_argument&) { + SPDLOG_ERROR("invalid preset value: '{}'", value); + continue; + } + + presets.push_back(as_int); + } + + return presets; +} + static uint32_t parse_fps_sampling_period(const char *str) { @@ -425,7 +451,6 @@ 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) @@ -667,7 +692,6 @@ static void set_param_defaults(struct overlay_params *params){ params->fsr_steam_sharpness = -1; params->picmip = -17; params->af = -1; - params->preset = -1; params->font_size = 24; params->table_columns = 3; params->text_outline_color = 0x000000; @@ -676,14 +700,18 @@ static void set_param_defaults(struct overlay_params *params){ void parse_overlay_config(struct overlay_params *params, - const char *env) + const char *env, bool use_existing_preset) { - *params = {}; + std::vector default_preset = {-1, 0, 1, 2, 3, 4}; + *params = { + .preset = use_existing_preset ? params->preset : default_preset + }; set_param_defaults(params); #ifdef HAVE_X11 params->toggle_hud = { XK_Shift_R, XK_F12 }; params->toggle_hud_position = { XK_Shift_R, XK_F11 }; + params->toggle_preset = { XK_Shift_R, XK_F10 }; params->toggle_fps_limit = { XK_Shift_L, XK_F1 }; params->toggle_logging = { XK_Shift_L, XK_F2 }; params->reload_cfg = { XK_Shift_L, XK_F4 }; @@ -693,16 +721,19 @@ parse_overlay_config(struct overlay_params *params, #ifdef _WIN32 params->toggle_hud = { VK_F12 }; + params->toggle_preset = { VK_F10 }; params->toggle_fps_limit = { VK_F3 }; params->toggle_logging = { VK_F2 }; params->reload_cfg = { VK_F4 }; #undef parse_toggle_hud #undef parse_toggle_fps_limit + #undef parse_toggle_preset #undef parse_toggle_logging #undef parse_reload_cfg #define parse_toggle_hud(x) params->toggle_hud + #define parse_toggle_preset(x) params->toggle_preset #define parse_toggle_fps_limit(x) params->toggle_fps_limit #define parse_toggle_logging(x) params->toggle_logging #define parse_reload_cfg(x) params->reload_cfg @@ -720,8 +751,14 @@ parse_overlay_config(struct overlay_params *params, // Get config options parseConfigFile(*params); - if (params->options.find("preset") != params->options.end()) - presets(stoi(params->options.find("preset")->second), params); + if (!use_existing_preset && 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]; + } + + presets(current_preset, params); if (params->options.find("full") != params->options.end() && params->options.find("full")->second != "0") { #define OVERLAY_PARAM_BOOL(name) \ @@ -767,9 +804,11 @@ parse_overlay_config(struct overlay_params *params, OVERLAY_PARAMS #undef OVERLAY_PARAM_BOOL #undef OVERLAY_PARAM_CUSTOM + if (it.first == "preset") { + continue; + } SPDLOG_ERROR("Unknown option '{}'", it.first.c_str()); } - } // TODO decide what to do for legacy_layout=0 diff --git a/src/overlay_params.h b/src/overlay_params.h index 564af21f..313d0766 100644 --- a/src/overlay_params.h +++ b/src/overlay_params.h @@ -129,6 +129,7 @@ typedef unsigned long KeySym; OVERLAY_PARAM_CUSTOM(gl_dont_flip) \ OVERLAY_PARAM_CUSTOM(toggle_hud) \ OVERLAY_PARAM_CUSTOM(toggle_hud_position) \ + OVERLAY_PARAM_CUSTOM(toggle_preset) \ OVERLAY_PARAM_CUSTOM(toggle_fps_limit) \ OVERLAY_PARAM_CUSTOM(toggle_logging) \ OVERLAY_PARAM_CUSTOM(reload_cfg) \ @@ -179,7 +180,6 @@ typedef unsigned long KeySym; OVERLAY_PARAM_CUSTOM(fcat_overlay_width) \ OVERLAY_PARAM_CUSTOM(picmip) \ OVERLAY_PARAM_CUSTOM(af) \ - OVERLAY_PARAM_CUSTOM(preset) \ OVERLAY_PARAM_CUSTOM(text_outline_color) \ OVERLAY_PARAM_CUSTOM(text_outline_thickness) \ OVERLAY_PARAM_CUSTOM(fps_text) \ @@ -271,6 +271,7 @@ struct overlay_params { float background_alpha, alpha; float cellpadding_y; std::vector toggle_hud; + std::vector toggle_preset; std::vector toggle_fps_limit; std::vector toggle_logging; std::vector reload_cfg; @@ -297,7 +298,7 @@ struct overlay_params { unsigned short fcat_overlay_width; int picmip; int af; - int preset; + std::vector preset; size_t font_params_hash; unsigned text_outline_color; float text_outline_thickness; @@ -306,7 +307,7 @@ struct overlay_params { const extern char *overlay_param_names[]; void parse_overlay_config(struct overlay_params *params, - const char *env); + const char *env, bool ignore_preset); 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); diff --git a/src/vulkan.cpp b/src/vulkan.cpp index c694def5..7ae2c85f 100644 --- a/src/vulkan.cpp +++ b/src/vulkan.cpp @@ -1896,7 +1896,7 @@ static VkResult overlay_CreateInstance( if (is_blacklisted()) return result; - parse_overlay_config(&instance_data->params, getenv("MANGOHUD_CONFIG")); + parse_overlay_config(&instance_data->params, getenv("MANGOHUD_CONFIG"), false); _params = &instance_data->params; //check for blacklist item in the config file diff --git a/src/win/d3d_shared.cpp b/src/win/d3d_shared.cpp index b7d61a48..e37b4838 100644 --- a/src/win/d3d_shared.cpp +++ b/src/win/d3d_shared.cpp @@ -13,7 +13,7 @@ void init_d3d_shared(){ vendorID = get_device_id_dxgi(); if (cfg_inited) return; - parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG")); + parse_overlay_config(¶ms, getenv("MANGOHUD_CONFIG"), false); _params = ¶ms; cfg_inited = true; // init_cpu_stats(params); @@ -22,4 +22,4 @@ void init_d3d_shared(){ void d3d_run(){ check_keybinds(params, vendorID); update_hud_info(sw_stats, params, vendorID); -} \ No newline at end of file +}