#pragma once #include #include #include #include #include "../../../helpers/signal/Signal.hpp" #include "../../../helpers/memory/Memory.hpp" #include "../../../desktop/DesktopTypes.hpp" #include "../../../desktop/rule/windowRule/WindowRule.hpp" namespace Config::Supplementary { struct SExecRequest { std::string exec = ""; bool withRules = false; // if this rule is passed, don't put any match: on it, executor will do it // for you // also dont set withRules SP rule; }; class CExecutor { public: CExecutor(); ~CExecutor() = default; void addExecOnce(SExecRequest&& cmd); void addExecShutdown(SExecRequest&& cmd); std::optional spawn(const std::string& args); std::optional spawn(const SExecRequest& args); std::optional spawnRaw(const std::string& args); std::optional spawnRawProc(const std::string&, PHLWORKSPACE pInitialWorkspace = nullptr, const std::string& execRuleToken = ""); std::optional spawnWithRules(std::string, PHLWORKSPACE pInitialWorkspace = nullptr); private: std::vector m_execOnce, m_execShutdown; void applyRuleToProc(SP rule, int64_t pid, const std::string& token); struct { CHyprSignalListener init; CHyprSignalListener shutdown; } m_listeners; bool m_firstExecDispatched = false; }; UP& executor(); };