#pragma once #define CONFIG_MANAGER_H #include #include "../debug/Log.hpp" #include #include "../defines.hpp" #include #include #include #include #include "../Window.hpp" #include "defaultConfig.hpp" #define STRVAL_EMPTY "[[EMPTY]]" struct SConfigValue { int64_t intValue = -1; float floatValue = -1; std::string strValue = ""; }; struct SMonitorRule { std::string name = ""; Vector2D resolution = Vector2D(1280,720); Vector2D offset = Vector2D(0,0); float scale = 1; float refreshRate = 60; int defaultWorkspaceID = -1; bool disabled = false; }; struct SMonitorAdditionalReservedArea { int top = 0; int bottom = 0; int left = 0; int right = 0; }; struct SWindowRule { std::string szRule; std::string szValue; }; class CConfigManager { public: CConfigManager(); void tick(); void init(); int getInt(std::string); float getFloat(std::string); std::string getString(std::string); void setFloat(std::string, float); void setInt(std::string, int); void setString(std::string, std::string); SConfigValue* getConfigValuePtr(std::string); SMonitorRule getMonitorRuleFor(std::string); std::vector getMatchingRules(CWindow*); std::unordered_map m_mAdditionalReservedAreas; // no-op when done. void dispatchExecOnce(); void performMonitorReload(); bool m_bWantsMonitorReload = false; bool m_bForceReload = false; std::string parseKeyword(const std::string&, const std::string&, bool dynamic = false); private: std::unordered_map configValues; time_t lastModifyTime = 0; // for reloading the config if changed std::string currentCategory = ""; // For storing the category of the current item std::string parseError = ""; // For storing a parse error to display later bool isFirstLaunch = true; // For exec-once std::deque m_dMonitorRules; std::deque m_dWindowRules; bool firstExecDispatched = false; std::deque firstExecRequests; // internal methods void setDefaultVars(); void loadConfigLoadVars(); SConfigValue getConfigValueSafe(std::string); void parseLine(std::string&); void configSetValueSafe(const std::string&, const std::string&); void handleRawExec(const std::string&, const std::string&); void handleMonitor(const std::string&, const std::string&); void handleBind(const std::string&, const std::string&); void handleUnbind(const std::string&, const std::string&); void handleWindowRule(const std::string&, const std::string&); void handleDefaultWorkspace(const std::string&, const std::string&); void handleBezier(const std::string&, const std::string&); }; inline std::unique_ptr g_pConfigManager;