diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 98f51204..f3d048a9 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -943,6 +943,8 @@ void CCompositor::focusWindow(CWindow* pWindow, wlr_surface* pSurface) { // we need to make the PLASTWINDOW not equal to m_pLastWindow so that RENDERDATA is correct for an unfocused window if (windowValidMapped(PLASTWINDOW)) { + PLASTWINDOW->updateDynamicRules(); + updateWindowAnimatedDecorationValues(PLASTWINDOW); if (!pWindow->m_bIsX11 || pWindow->m_iX11Type == 1) @@ -960,6 +962,8 @@ void CCompositor::focusWindow(CWindow* pWindow, wlr_surface* pSurface) { g_pXWaylandManager->activateWindow(pWindow, true); // sets the m_pLastWindow + pWindow->updateDynamicRules(); + updateWindowAnimatedDecorationValues(pWindow); if (pWindow->m_bIsUrgent) diff --git a/src/Window.hpp b/src/Window.hpp index f9873ead..810400d7 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -155,6 +155,7 @@ struct SWindowRule { int bFloating = -1; int bFullscreen = -1; int bPinned = -1; + int bFocus = -1; std::string szWorkspace = ""; // empty means any }; 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 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);