#pragma once #include #include #include #include #include "../../desktop/DesktopTypes.hpp" #include "../../desktop/rule/Rule.hpp" #include "../../helpers/memory/Memory.hpp" #include "../../managers/KeybindManager.hpp" #include "../ConfigManager.hpp" #include #define HANDLE void* namespace Config::Supplementary { struct SConfigOptionDescription; }; namespace Config::Legacy { class CConfigManager; struct SPluginKeyword { HANDLE handle = nullptr; std::string name = ""; Hyprlang::PCONFIGHANDLERFUNC fn = nullptr; }; struct SPluginVariable { HANDLE handle = nullptr; std::string name = ""; }; class CConfigManager : public Config::IConfigManager { public: CConfigManager(); virtual eConfigManagerType type() override; virtual void init() override; virtual void reload() override; virtual std::string verify() override; virtual int getDeviceInt(const std::string&, const std::string&, const std::string& fallback = "") override; virtual float getDeviceFloat(const std::string&, const std::string&, const std::string& fallback = "") override; virtual Vector2D getDeviceVec(const std::string&, const std::string&, const std::string& fallback = "") override; virtual std::string getDeviceString(const std::string&, const std::string&, const std::string& fallback = "") override; virtual bool deviceConfigExplicitlySet(const std::string&, const std::string&) override; virtual bool deviceConfigExists(const std::string&) override; virtual SConfigOptionReply getConfigValue(const std::string&) override; virtual std::string getMainConfigPath() override; virtual std::string getErrors() override; virtual std::string getConfigString() override; virtual std::string currentConfigPath() override; virtual const std::vector& getConfigPaths() override; virtual std::expected generateDefaultConfig(const std::filesystem::path&, bool safeMode) override; virtual void handlePluginLoads() override; virtual bool configVerifPassed() override; virtual std::expected registerPluginValue(void* handle, SP value) override; virtual void onPluginUnload(void* handle) override; void addPluginConfigVar(HANDLE handle, const std::string& name, const Hyprlang::CConfigValue& value); void addPluginKeyword(HANDLE handle, const std::string& name, Hyprlang::PCONFIGHANDLERFUNC fun, Hyprlang::SHandlerOptions opts = {}); void removePluginConfig(HANDLE handle); std::string parseKeyword(const std::string&, const std::string&); Hyprlang::CConfigValue* getHyprlangConfigValuePtr(const std::string& name, const std::string& specialCat = ""); // keywords std::optional handleRawExec(const std::string&, const std::string&); std::optional handleExec(const std::string&, const std::string&); std::optional handleExecOnce(const std::string&, const std::string&); std::optional handleExecRawOnce(const std::string&, const std::string&); std::optional handleExecShutdown(const std::string&, const std::string&); std::optional handleMonitor(const std::string&, const std::string&); std::optional handleBind(const std::string&, const std::string&); std::optional handleUnbind(const std::string&, const std::string&); std::optional handleWorkspaceRules(const std::string&, const std::string&); std::optional handleBezier(const std::string&, const std::string&); std::optional handleAnimation(const std::string&, const std::string&); std::optional handleSource(const std::string&, const std::string&); std::optional handleSubmap(const std::string&, const std::string&); std::optional handleBindWS(const std::string&, const std::string&); std::optional handleEnv(const std::string&, const std::string&); std::optional handlePlugin(const std::string&, const std::string&); std::optional handlePermission(const std::string&, const std::string&); std::optional handleGesture(const std::string&, const std::string&); std::optional handleWindowrule(const std::string&, const std::string&); std::optional handleLayerrule(const std::string&, const std::string&); std::optional handleMonitorv2(const std::string& output); Hyprlang::CParseResult handleMonitorv2(); std::optional addRuleFromConfigKey(const std::string& name); std::optional addLayerRuleFromConfigKey(const std::string& name); Hyprlang::CParseResult reloadRules(); std::string m_configCurrentPath; bool m_isLaunchingExecOnce = false; // For exec-once to skip initial ws tracking bool m_lastConfigVerificationWasSuccessful = true; private: // internal methods std::optional resetHLConfig(); std::optional verifyConfigExists(); void reloadRuleConfigs(); void postConfigReload(const Hyprlang::CParseResult& result); void registerConfigVar(const char* name, const Hyprlang::INT& val); void registerConfigVar(const char* name, const Hyprlang::FLOAT& val); void registerConfigVar(const char* name, const Hyprlang::VEC2& val); void registerConfigVar(const char* name, const Hyprlang::STRING& val); void registerConfigVar(const char* name, Hyprlang::CUSTOMTYPE&& val); Hyprlang::CConfigValue* getConfigValueSafeDevice(const std::string& dev, const std::string& val, const std::string& fallback); UP m_config; std::vector m_configPaths; std::string m_mainConfigPath; SSubmap m_currentSubmap; std::vector m_declaredPlugins; std::vector m_pluginKeywords; std::vector m_pluginVariables; std::vector> m_keywordRules; bool m_isFirstLaunch = true; // For exec-once bool m_firstExecDispatched = false; bool m_manualCrashInitiated = false; std::vector> m_failedPluginConfigValues; // for plugin values of unloaded plugins std::string m_configErrors = ""; uint32_t m_configValueNumber = 0; friend struct Config::Supplementary::SConfigOptionDescription; friend class CMonitorRuleParser; }; WP mgr(); }