diff --git a/hyprtester/src/tests/main/window.cpp b/hyprtester/src/tests/main/window.cpp index 87187592..982c0ef3 100644 --- a/hyprtester/src/tests/main/window.cpp +++ b/hyprtester/src/tests/main/window.cpp @@ -131,6 +131,68 @@ static void testSwapWindow() { EXPECT(Tests::windowCount(), 0); } +static void testGroupRules() { + NLog::log("{}Testing group window rules", Colors::YELLOW); + + OK(getFromSocket("/keyword general:border_size 8")); + OK(getFromSocket("/keyword workspace w[tv1], bordersize:0")); + OK(getFromSocket("/keyword workspace f[1], bordersize:0")); + OK(getFromSocket("/keyword windowrule match:workspace w[tv1], border_size 0")); + OK(getFromSocket("/keyword windowrule match:workspace f[1], border_size 0")); + + if (!Tests::spawnKitty("kitty_A")) { + ret = 1; + return; + } + + { + auto str = getFromSocket("/getprop active border_size"); + EXPECT_CONTAINS(str, "0"); + } + + if (!Tests::spawnKitty("kitty_B")) { + ret = 1; + return; + } + + { + auto str = getFromSocket("/getprop active border_size"); + EXPECT_CONTAINS(str, "8"); + } + + OK(getFromSocket("/dispatch focuswindow class:kitty_A")); + OK(getFromSocket("/dispatch togglegroup")); + OK(getFromSocket("/dispatch focuswindow class:kitty_B")); + OK(getFromSocket("/dispatch moveintogroup l")); + + { + auto str = getFromSocket("/getprop active border_size"); + EXPECT_CONTAINS(str, "0"); + } + + OK(getFromSocket("/dispatch changegroupactive f")); + + { + auto str = getFromSocket("/getprop active border_size"); + EXPECT_CONTAINS(str, "0"); + } + + if (!Tests::spawnKitty("kitty_C")) { + ret = 1; + return; + } + + OK(getFromSocket("/dispatch moveoutofgroup r")); + + { + auto str = getFromSocket("/getprop active border_size"); + EXPECT_CONTAINS(str, "8"); + } + + OK(getFromSocket("/reload")); + Tests::killAllWindows(); +} + static bool test() { NLog::log("{}Testing windows", Colors::GREEN); @@ -403,6 +465,11 @@ static bool test() { OK(getFromSocket("/dispatch plugin:test:check_rule")); + OK(getFromSocket("/reload")); + Tests::killAllWindows(); + + testGroupRules(); + NLog::log("{}Reloading config", Colors::YELLOW); OK(getFromSocket("/reload")); diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index b2712886..6a602748 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -901,6 +901,8 @@ void CWindow::setGroupCurrent(PHLWINDOW pWindow) { g_pHyprRenderer->damageWindow(pWindow); + pWindow->m_ruleApplicator->propertiesChanged(Desktop::Rule::RULE_PROP_GROUP | Desktop::Rule::RULE_PROP_ON_WORKSPACE); + m_ruleApplicator->propertiesChanged(Desktop::Rule::RULE_PROP_GROUP | Desktop::Rule::RULE_PROP_ON_WORKSPACE); pWindow->updateWindowDecos(); } @@ -922,6 +924,10 @@ void CWindow::insertWindowToGroup(PHLWINDOW pWindow) { SHEAD->m_groupData.head = false; BEGINAT->m_groupData.pNextWindow = SHEAD; STAIL->m_groupData.pNextWindow = ENDAT; + + pWindow->m_ruleApplicator->propertiesChanged(Desktop::Rule::RULE_PROP_GROUP | Desktop::Rule::RULE_PROP_ON_WORKSPACE); + m_ruleApplicator->propertiesChanged(Desktop::Rule::RULE_PROP_GROUP | Desktop::Rule::RULE_PROP_ON_WORKSPACE); + pWindow->updateWindowDecos(); } PHLWINDOW CWindow::getGroupPrevious() { @@ -954,6 +960,10 @@ void CWindow::switchWithWindowInGroup(PHLWINDOW pWindow) { std::swap(m_groupData.head, pWindow->m_groupData.head); std::swap(m_groupData.locked, pWindow->m_groupData.locked); + + pWindow->m_ruleApplicator->propertiesChanged(Desktop::Rule::RULE_PROP_GROUP | Desktop::Rule::RULE_PROP_ON_WORKSPACE); + m_ruleApplicator->propertiesChanged(Desktop::Rule::RULE_PROP_GROUP | Desktop::Rule::RULE_PROP_ON_WORKSPACE); + pWindow->updateWindowDecos(); } void CWindow::updateGroupOutputs() { diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index 4925a50e..54b45426 100644 --- a/src/layout/DwindleLayout.cpp +++ b/src/layout/DwindleLayout.cpp @@ -480,6 +480,7 @@ void CHyprDwindleLayout::onWindowCreatedTiling(PHLWINDOW pWindow, eDirection dir NEWPARENT->recalcSizePosRecursive(false, horizontalOverride, verticalOverride); recalculateMonitor(pWindow->monitorID()); + pWindow->m_workspace->updateWindows(); } void CHyprDwindleLayout::onWindowRemovedTiling(PHLWINDOW pWindow) { @@ -528,6 +529,7 @@ void CHyprDwindleLayout::onWindowRemovedTiling(PHLWINDOW pWindow) { m_dwindleNodesData.remove(*PPARENT); m_dwindleNodesData.remove(*PNODE); + pWindow->m_workspace->updateWindows(); } void CHyprDwindleLayout::recalculateMonitor(const MONITORID& monid) { diff --git a/src/layout/MasterLayout.cpp b/src/layout/MasterLayout.cpp index 5b2284c5..820e52c6 100644 --- a/src/layout/MasterLayout.cpp +++ b/src/layout/MasterLayout.cpp @@ -230,6 +230,7 @@ void CHyprMasterLayout::onWindowCreatedTiling(PHLWINDOW pWindow, eDirection dire // recalc recalculateMonitor(pWindow->monitorID()); + pWindow->m_workspace->updateWindows(); } void CHyprMasterLayout::onWindowRemovedTiling(PHLWINDOW pWindow) { @@ -280,6 +281,7 @@ void CHyprMasterLayout::onWindowRemovedTiling(PHLWINDOW pWindow) { } } recalculateMonitor(pWindow->monitorID()); + pWindow->m_workspace->updateWindows(); } void CHyprMasterLayout::recalculateMonitor(const MONITORID& monid) { diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index feee0369..1d35185b 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -1769,11 +1769,10 @@ SDispatchResult CKeybindManager::changeGroupActive(std::string args) { return {}; } - if (args != "b" && args != "prev") { + if (args != "b" && args != "prev") PWINDOW->setGroupCurrent(PWINDOW->m_groupData.pNextWindow.lock()); - } else { + else PWINDOW->setGroupCurrent(PWINDOW->getGroupPrevious()); - } return {}; }