#pragma once #include #include #include #include #include "external/rapidjson/document.h" namespace cfg { enum WindowDecorationMode { Default = 0, Borderless = 1, ResizableFrame = 2 }; extern std::optional SCREEN_RESIZE_CFG_PATH_OVERRIDE; class ScreenResize { private: std::filesystem::path config_path; // bool config_dirty = false; bool load_bool_value(rapidjson::Document& doc, std::string path, bool& value); bool load_int_value(rapidjson::Document& doc, std::string path, int& value); bool load_uint32_value(rapidjson::Document& doc, std::string path, uint32_t& value); bool load_float_value(rapidjson::Document& doc, std::string path, float& value); public: ScreenResize(); ~ScreenResize(); // full screen (directx) image settings int offset_x = 0; int offset_y = 0; float scale_x = 1.0; float scale_y = 1.0; bool enable_screen_resize = false; bool enable_linear_filter = true; bool keep_aspect_ratio = true; bool centered = true; // windowed mode sizing // Windows terminology: // window = rectangle including the frame // client = just the content area without frames. bool window_always_on_top = false; bool client_keep_aspect_ratio = true; bool enable_window_resize = false; int window_decoration = 0; // enum type WindowDecorationMode uint32_t client_width = 0; uint32_t client_height = 0; int32_t window_offset_x = 0; int32_t window_offset_y = 0; // these are not saved by config, but used by window management uint32_t init_client_width = 0; uint32_t init_client_height = 0; float init_client_aspect_ratio = 1.f; uint32_t init_window_style = 0; uint32_t window_deco_width = 0; uint32_t window_deco_height = 0; void config_load(); void config_save(); }; // globals extern std::unique_ptr SCREENRESIZE; }