summaryrefslogtreecommitdiff
path: root/src/config/ConfigManager.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2023-12-08 16:02:16 +0000
committerVaxry <vaxry@vaxry.net>2023-12-08 16:02:16 +0000
commit11d1c50420cdeaa5426b837a6479455f47368f29 (patch)
treee97950e5b627a6572f96db8aeb35a6918f57d8cf /src/config/ConfigManager.cpp
parent288f1863f0b6886e0cdf85d16bb2460bb042acf2 (diff)
windowrules: add focus param
Diffstat (limited to 'src/config/ConfigManager.cpp')
-rw-r--r--src/config/ConfigManager.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 41248d08..91fa0eb9 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -1028,9 +1028,10 @@ void CConfigManager::handleWindowRuleV2(const std::string& command, const std::s
const auto FULLSCREENPOS = VALUE.find("fullscreen:");
const auto PINNEDPOS = VALUE.find("pinned:");
const auto WORKSPACEPOS = VALUE.find("workspace:");
+ const auto FOCUSPOS = VALUE.find("focus:");
if (TITLEPOS == std::string::npos && CLASSPOS == std::string::npos && X11POS == std::string::npos && FLOATPOS == std::string::npos && FULLSCREENPOS == std::string::npos &&
- PINNEDPOS == std::string::npos && WORKSPACEPOS == std::string::npos) {
+ PINNEDPOS == std::string::npos && WORKSPACEPOS == std::string::npos && FOCUSPOS == std::string::npos) {
Debug::log(ERR, "Invalid rulev2 syntax: {}", VALUE);
parseError = "Invalid rulev2 syntax: " + VALUE;
return;
@@ -1054,7 +1055,9 @@ void CConfigManager::handleWindowRuleV2(const std::string& command, const std::s
if (PINNEDPOS > pos && PINNEDPOS < min)
min = PINNEDPOS;
if (WORKSPACEPOS > pos && WORKSPACEPOS < min)
- min = PINNEDPOS;
+ min = WORKSPACEPOS;
+ if (FOCUSPOS > pos && FOCUSPOS < min)
+ min = FOCUSPOS;
result = result.substr(0, min - pos);
@@ -1087,6 +1090,9 @@ void CConfigManager::handleWindowRuleV2(const std::string& command, const std::s
if (WORKSPACEPOS != std::string::npos)
rule.szWorkspace = extract(WORKSPACEPOS + 10);
+ if (FOCUSPOS != std::string::npos)
+ rule.bFocus = extract(FOCUSPOS + 6) == "1" ? 1 : 0;
+
if (RULE == "unset") {
std::erase_if(m_dWindowRules, [&](const SWindowRule& other) {
if (!other.v2) {
@@ -1113,6 +1119,9 @@ void CConfigManager::handleWindowRuleV2(const std::string& command, const std::s
if (!rule.szWorkspace.empty() && rule.szWorkspace != other.szWorkspace)
return false;
+ if (rule.bFocus != -1 && rule.bFocus != other.bFocus)
+ return false;
+
return true;
}
});
@@ -1965,6 +1974,11 @@ std::vector<SWindowRule> CConfigManager::getMatchingRules(CWindow* pWindow) {
continue;
}
+ if (rule.bFocus != -1) {
+ if (rule.bFocus != (g_pCompositor->m_pLastWindow == pWindow))
+ continue;
+ }
+
if (!rule.szWorkspace.empty()) {
const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pWindow->m_iWorkspaceID);