mirror of
https://github.com/hyprwm/Hyprland
synced 2025-01-12 10:09:51 +01:00
config: add exec(-onec) with rules and execr(-once) (#8953)
This commit is contained in:
parent
cef09fbfe6
commit
3b85690aa6
2 changed files with 56 additions and 5 deletions
|
@ -130,6 +130,18 @@ static void configHandleGapDestroy(void** data) {
|
||||||
delete reinterpret_cast<CCssGapData*>(*data);
|
delete reinterpret_cast<CCssGapData*>(*data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Hyprlang::CParseResult handleExec(const char* c, const char* v) {
|
||||||
|
const std::string VALUE = v;
|
||||||
|
const std::string COMMAND = c;
|
||||||
|
|
||||||
|
const auto RESULT = g_pConfigManager->handleExec(COMMAND, VALUE);
|
||||||
|
|
||||||
|
Hyprlang::CParseResult result;
|
||||||
|
if (RESULT.has_value())
|
||||||
|
result.setError(RESULT.value().c_str());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static Hyprlang::CParseResult handleRawExec(const char* c, const char* v) {
|
static Hyprlang::CParseResult handleRawExec(const char* c, const char* v) {
|
||||||
const std::string VALUE = v;
|
const std::string VALUE = v;
|
||||||
const std::string COMMAND = c;
|
const std::string COMMAND = c;
|
||||||
|
@ -154,6 +166,18 @@ static Hyprlang::CParseResult handleExecOnce(const char* c, const char* v) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Hyprlang::CParseResult handleExecRawOnce(const char* c, const char* v) {
|
||||||
|
const std::string VALUE = v;
|
||||||
|
const std::string COMMAND = c;
|
||||||
|
|
||||||
|
const auto RESULT = g_pConfigManager->handleExecRawOnce(COMMAND, VALUE);
|
||||||
|
|
||||||
|
Hyprlang::CParseResult result;
|
||||||
|
if (RESULT.has_value())
|
||||||
|
result.setError(RESULT.value().c_str());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static Hyprlang::CParseResult handleExecShutdown(const char* c, const char* v) {
|
static Hyprlang::CParseResult handleExecShutdown(const char* c, const char* v) {
|
||||||
const std::string VALUE = v;
|
const std::string VALUE = v;
|
||||||
const std::string COMMAND = c;
|
const std::string COMMAND = c;
|
||||||
|
@ -666,8 +690,10 @@ CConfigManager::CConfigManager() {
|
||||||
m_pConfig->addSpecialConfigValue("device", "active_area_size", Hyprlang::VEC2{0, 0}); // only for tablets
|
m_pConfig->addSpecialConfigValue("device", "active_area_size", Hyprlang::VEC2{0, 0}); // only for tablets
|
||||||
|
|
||||||
// keywords
|
// keywords
|
||||||
m_pConfig->registerHandler(&::handleRawExec, "exec", {false});
|
m_pConfig->registerHandler(&::handleExec, "exec", {false});
|
||||||
|
m_pConfig->registerHandler(&::handleRawExec, "execr", {false});
|
||||||
m_pConfig->registerHandler(&::handleExecOnce, "exec-once", {false});
|
m_pConfig->registerHandler(&::handleExecOnce, "exec-once", {false});
|
||||||
|
m_pConfig->registerHandler(&::handleExecRawOnce, "execr-once", {false});
|
||||||
m_pConfig->registerHandler(&::handleExecShutdown, "exec-shutdown", {false});
|
m_pConfig->registerHandler(&::handleExecShutdown, "exec-shutdown", {false});
|
||||||
m_pConfig->registerHandler(&::handleMonitor, "monitor", {false});
|
m_pConfig->registerHandler(&::handleMonitor, "monitor", {false});
|
||||||
m_pConfig->registerHandler(&::handleBind, "bind", {true});
|
m_pConfig->registerHandler(&::handleBind, "bind", {true});
|
||||||
|
@ -1441,7 +1467,7 @@ void CConfigManager::dispatchExecOnce() {
|
||||||
isLaunchingExecOnce = true;
|
isLaunchingExecOnce = true;
|
||||||
|
|
||||||
for (auto const& c : firstExecRequests) {
|
for (auto const& c : firstExecRequests) {
|
||||||
handleRawExec("", c);
|
c.withRules ? handleExec("", c.exec) : handleRawExec("", c.exec);
|
||||||
}
|
}
|
||||||
|
|
||||||
firstExecRequests.clear(); // free some kb of memory :P
|
firstExecRequests.clear(); // free some kb of memory :P
|
||||||
|
@ -1744,7 +1770,17 @@ std::string CConfigManager::getDefaultWorkspaceFor(const std::string& name) {
|
||||||
|
|
||||||
std::optional<std::string> CConfigManager::handleRawExec(const std::string& command, const std::string& args) {
|
std::optional<std::string> CConfigManager::handleRawExec(const std::string& command, const std::string& args) {
|
||||||
if (isFirstLaunch) {
|
if (isFirstLaunch) {
|
||||||
firstExecRequests.push_back(args);
|
firstExecRequests.push_back({args, false});
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
g_pKeybindManager->spawnRaw(args);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::string> CConfigManager::handleExec(const std::string& command, const std::string& args) {
|
||||||
|
if (isFirstLaunch) {
|
||||||
|
firstExecRequests.push_back({args, true});
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1754,7 +1790,14 @@ std::optional<std::string> CConfigManager::handleRawExec(const std::string& comm
|
||||||
|
|
||||||
std::optional<std::string> CConfigManager::handleExecOnce(const std::string& command, const std::string& args) {
|
std::optional<std::string> CConfigManager::handleExecOnce(const std::string& command, const std::string& args) {
|
||||||
if (isFirstLaunch)
|
if (isFirstLaunch)
|
||||||
firstExecRequests.push_back(args);
|
firstExecRequests.push_back({args, true});
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::string> CConfigManager::handleExecRawOnce(const std::string& command, const std::string& args) {
|
||||||
|
if (isFirstLaunch)
|
||||||
|
firstExecRequests.push_back({args, false});
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,6 +132,11 @@ struct SConfigOptionDescription {
|
||||||
std::variant<SBoolData, SRangeData, SFloatData, SStringData, SColorData, SChoiceData, SGradientData, SVectorData> data;
|
std::variant<SBoolData, SRangeData, SFloatData, SStringData, SColorData, SChoiceData, SGradientData, SVectorData> data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SFirstExecRequest {
|
||||||
|
std::string exec = "";
|
||||||
|
bool withRules = false;
|
||||||
|
};
|
||||||
|
|
||||||
class CConfigManager {
|
class CConfigManager {
|
||||||
public:
|
public:
|
||||||
CConfigManager();
|
CConfigManager();
|
||||||
|
@ -196,7 +201,9 @@ class CConfigManager {
|
||||||
|
|
||||||
// keywords
|
// keywords
|
||||||
std::optional<std::string> handleRawExec(const std::string&, const std::string&);
|
std::optional<std::string> handleRawExec(const std::string&, const std::string&);
|
||||||
|
std::optional<std::string> handleExec(const std::string&, const std::string&);
|
||||||
std::optional<std::string> handleExecOnce(const std::string&, const std::string&);
|
std::optional<std::string> handleExecOnce(const std::string&, const std::string&);
|
||||||
|
std::optional<std::string> handleExecRawOnce(const std::string&, const std::string&);
|
||||||
std::optional<std::string> handleExecShutdown(const std::string&, const std::string&);
|
std::optional<std::string> handleExecShutdown(const std::string&, const std::string&);
|
||||||
std::optional<std::string> handleMonitor(const std::string&, const std::string&);
|
std::optional<std::string> handleMonitor(const std::string&, const std::string&);
|
||||||
std::optional<std::string> handleBind(const std::string&, const std::string&);
|
std::optional<std::string> handleBind(const std::string&, const std::string&);
|
||||||
|
@ -280,7 +287,8 @@ class CConfigManager {
|
||||||
|
|
||||||
bool firstExecDispatched = false;
|
bool firstExecDispatched = false;
|
||||||
bool m_bManualCrashInitiated = false;
|
bool m_bManualCrashInitiated = false;
|
||||||
std::vector<std::string> firstExecRequests;
|
|
||||||
|
std::vector<SFirstExecRequest> firstExecRequests; // bool is for if with rules
|
||||||
std::vector<std::string> finalExecRequests;
|
std::vector<std::string> finalExecRequests;
|
||||||
|
|
||||||
std::vector<std::pair<std::string, std::string>> m_vFailedPluginConfigValues; // for plugin values of unloaded plugins
|
std::vector<std::pair<std::string, std::string>> m_vFailedPluginConfigValues; // for plugin values of unloaded plugins
|
||||||
|
|
Loading…
Reference in a new issue