mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-23 10:05:59 +01:00
Added windowrulev2
This commit is contained in:
parent
f002bd1603
commit
e71a4d75de
2 changed files with 110 additions and 29 deletions
|
@ -725,17 +725,8 @@ void CConfigManager::handleUnbind(const std::string& command, const std::string&
|
||||||
g_pKeybindManager->removeKeybind(MOD, KEY);
|
g_pKeybindManager->removeKeybind(MOD, KEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CConfigManager::handleWindowRule(const std::string& command, const std::string& value) {
|
bool windowRuleValid(const std::string& RULE) {
|
||||||
const auto RULE = value.substr(0, value.find_first_of(","));
|
return !(RULE != "float"
|
||||||
const auto VALUE = value.substr(value.find_first_of(",") + 1);
|
|
||||||
|
|
||||||
// check rule and value
|
|
||||||
if (RULE == "" || VALUE == "") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// verify we support a rule
|
|
||||||
if (RULE != "float"
|
|
||||||
&& RULE != "tile"
|
&& RULE != "tile"
|
||||||
&& RULE.find("opacity") != 0
|
&& RULE.find("opacity") != 0
|
||||||
&& RULE.find("move") != 0
|
&& RULE.find("move") != 0
|
||||||
|
@ -750,14 +741,77 @@ void CConfigManager::handleWindowRule(const std::string& command, const std::str
|
||||||
&& RULE != "fullscreen"
|
&& RULE != "fullscreen"
|
||||||
&& RULE.find("animation") != 0
|
&& RULE.find("animation") != 0
|
||||||
&& RULE.find("rounding") != 0
|
&& RULE.find("rounding") != 0
|
||||||
&& RULE.find("workspace") != 0) {
|
&& RULE.find("workspace") != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CConfigManager::handleWindowRule(const std::string& command, const std::string& value) {
|
||||||
|
const auto RULE = value.substr(0, value.find_first_of(","));
|
||||||
|
const auto VALUE = value.substr(value.find_first_of(",") + 1);
|
||||||
|
|
||||||
|
// check rule and value
|
||||||
|
if (RULE == "" || VALUE == "") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// verify we support a rule
|
||||||
|
if (!windowRuleValid(RULE)) {
|
||||||
Debug::log(ERR, "Invalid rule found: %s", RULE.c_str());
|
Debug::log(ERR, "Invalid rule found: %s", RULE.c_str());
|
||||||
parseError = "Invalid rule found: " + RULE;
|
parseError = "Invalid rule found: " + RULE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_dWindowRules.push_back({RULE, VALUE});
|
m_dWindowRules.push_back({RULE, VALUE});
|
||||||
|
}
|
||||||
|
|
||||||
|
void CConfigManager::handleWindowRuleV2(const std::string& command, const std::string& value) {
|
||||||
|
const auto RULE = value.substr(0, value.find_first_of(","));
|
||||||
|
const auto VALUE = value.substr(value.find_first_of(",") + 1);
|
||||||
|
|
||||||
|
if (!windowRuleValid(RULE)) {
|
||||||
|
Debug::log(ERR, "Invalid rulev2 found: %s", RULE.c_str());
|
||||||
|
parseError = "Invalid rulev2 found: " + RULE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// now we estract shit from the value
|
||||||
|
SWindowRule rule;
|
||||||
|
rule.v2 = true;
|
||||||
|
rule.szRule = RULE;
|
||||||
|
|
||||||
|
const auto TITLEPOS = VALUE.find("title:");
|
||||||
|
const auto CLASSPOS = VALUE.find("class:");
|
||||||
|
|
||||||
|
if (TITLEPOS == std::string::npos && CLASSPOS == std::string::npos) {
|
||||||
|
Debug::log(ERR, "Invalid rulev2 syntax: %s", VALUE.c_str());
|
||||||
|
parseError = "Invalid rulev2 syntax: " + VALUE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto extract = [&](size_t pos) -> std::string {
|
||||||
|
std::string result;
|
||||||
|
result = VALUE.substr(pos);
|
||||||
|
|
||||||
|
size_t min = 999999;
|
||||||
|
if (TITLEPOS > pos && TITLEPOS < min) min = TITLEPOS;
|
||||||
|
if (CLASSPOS > pos && CLASSPOS < min) min = CLASSPOS;
|
||||||
|
|
||||||
|
result = result.substr(0, min - pos);
|
||||||
|
|
||||||
|
if (result.back() == ',')
|
||||||
|
result.pop_back();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (CLASSPOS != std::string::npos) {
|
||||||
|
rule.szClass = extract(CLASSPOS + 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TITLEPOS != std::string::npos) {
|
||||||
|
rule.szTitle = extract(TITLEPOS + 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_dWindowRules.push_back(rule);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CConfigManager::handleBlurLS(const std::string& command, const std::string& value) {
|
void CConfigManager::handleBlurLS(const std::string& command, const std::string& value) {
|
||||||
|
@ -866,6 +920,7 @@ std::string CConfigManager::parseKeyword(const std::string& COMMAND, const std::
|
||||||
else if (COMMAND == "unbind") handleUnbind(COMMAND, VALUE);
|
else if (COMMAND == "unbind") handleUnbind(COMMAND, VALUE);
|
||||||
else if (COMMAND == "workspace") handleDefaultWorkspace(COMMAND, VALUE);
|
else if (COMMAND == "workspace") handleDefaultWorkspace(COMMAND, VALUE);
|
||||||
else if (COMMAND == "windowrule") handleWindowRule(COMMAND, VALUE);
|
else if (COMMAND == "windowrule") handleWindowRule(COMMAND, VALUE);
|
||||||
|
else if (COMMAND == "windowrulev2") handleWindowRuleV2(COMMAND, VALUE);
|
||||||
else if (COMMAND == "bezier") handleBezier(COMMAND, VALUE);
|
else if (COMMAND == "bezier") handleBezier(COMMAND, VALUE);
|
||||||
else if (COMMAND == "animation") handleAnimation(COMMAND, VALUE);
|
else if (COMMAND == "animation") handleAnimation(COMMAND, VALUE);
|
||||||
else if (COMMAND == "source") handleSource(COMMAND, VALUE);
|
else if (COMMAND == "source") handleSource(COMMAND, VALUE);
|
||||||
|
@ -1279,6 +1334,7 @@ std::vector<SWindowRule> CConfigManager::getMatchingRules(CWindow* pWindow) {
|
||||||
|
|
||||||
for (auto& rule : m_dWindowRules) {
|
for (auto& rule : m_dWindowRules) {
|
||||||
// check if we have a matching rule
|
// check if we have a matching rule
|
||||||
|
if (!rule.v2) {
|
||||||
try {
|
try {
|
||||||
if (rule.szValue.find("title:") == 0) {
|
if (rule.szValue.find("title:") == 0) {
|
||||||
// we have a title rule.
|
// we have a title rule.
|
||||||
|
@ -1296,6 +1352,26 @@ std::vector<SWindowRule> CConfigManager::getMatchingRules(CWindow* pWindow) {
|
||||||
Debug::log(ERR, "Regex error at %s", rule.szValue.c_str());
|
Debug::log(ERR, "Regex error at %s", rule.szValue.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
if (rule.szClass != "") {
|
||||||
|
std::regex RULECHECK(rule.szClass);
|
||||||
|
|
||||||
|
if (!std::regex_search(appidclass, RULECHECK))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rule.szTitle != "") {
|
||||||
|
std::regex RULECHECK(rule.szTitle);
|
||||||
|
|
||||||
|
if (!std::regex_search(title, RULECHECK))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} catch (...) {
|
||||||
|
Debug::log(ERR, "Regex error at %s", rule.szValue.c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// applies. Read the rule and behave accordingly
|
// applies. Read the rule and behave accordingly
|
||||||
Debug::log(LOG, "Window rule %s -> %s matched %x [%s]", rule.szRule.c_str(), rule.szValue.c_str(), pWindow, pWindow->m_szTitle.c_str());
|
Debug::log(LOG, "Window rule %s -> %s matched %x [%s]", rule.szRule.c_str(), rule.szValue.c_str(), pWindow, pWindow->m_szTitle.c_str());
|
||||||
|
|
|
@ -48,6 +48,10 @@ struct SMonitorAdditionalReservedArea {
|
||||||
struct SWindowRule {
|
struct SWindowRule {
|
||||||
std::string szRule;
|
std::string szRule;
|
||||||
std::string szValue;
|
std::string szValue;
|
||||||
|
|
||||||
|
bool v2 = false;
|
||||||
|
std::string szTitle;
|
||||||
|
std::string szClass;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SAnimationPropertyConfig {
|
struct SAnimationPropertyConfig {
|
||||||
|
@ -151,6 +155,7 @@ private:
|
||||||
void handleBind(const std::string&, const std::string&);
|
void handleBind(const std::string&, const std::string&);
|
||||||
void handleUnbind(const std::string&, const std::string&);
|
void handleUnbind(const std::string&, const std::string&);
|
||||||
void handleWindowRule(const std::string&, const std::string&);
|
void handleWindowRule(const std::string&, const std::string&);
|
||||||
|
void handleWindowRuleV2(const std::string&, const std::string&);
|
||||||
void handleDefaultWorkspace(const std::string&, const std::string&);
|
void handleDefaultWorkspace(const std::string&, const std::string&);
|
||||||
void handleBezier(const std::string&, const std::string&);
|
void handleBezier(const std::string&, const std::string&);
|
||||||
void handleAnimation(const std::string&, const std::string&);
|
void handleAnimation(const std::string&, const std::string&);
|
||||||
|
|
Loading…
Reference in a new issue