From 475e87b35173ee1439035a072e7c70e94cb4ad56 Mon Sep 17 00:00:00 2001 From: EvilLary Date: Tue, 25 Nov 2025 02:48:10 +0300 Subject: [PATCH] windowrules: fix persistent_size not applying (#12441) --- hyprtester/src/tests/main/window.cpp | 28 +++++++++++++++++++ .../rule/windowRule/WindowRuleApplicator.cpp | 6 ++-- src/layout/IHyprLayout.cpp | 3 ++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/hyprtester/src/tests/main/window.cpp b/hyprtester/src/tests/main/window.cpp index 982c0ef3b..e7dfd38d0 100644 --- a/hyprtester/src/tests/main/window.cpp +++ b/hyprtester/src/tests/main/window.cpp @@ -397,6 +397,34 @@ static bool test() { OK(getFromSocket("/reload")); Tests::killAllWindows(); + // test persistent_size between floating window launches + OK(getFromSocket("/keyword windowrule match:class persistent_size_kitty, persistent_size true, float true")); + + if (!spawnKitty("persistent_size_kitty")) + return false; + + OK(getFromSocket("/dispatch resizeactive exact 600 400")) + + { + auto str = getFromSocket("/activewindow"); + EXPECT_CONTAINS(str, "size: 600,400"); + EXPECT_CONTAINS(str, "floating: 1"); + } + + Tests::killAllWindows(); + + if (!spawnKitty("persistent_size_kitty")) + return false; + + { + auto str = getFromSocket("/activewindow"); + EXPECT_CONTAINS(str, "size: 600,400"); + EXPECT_CONTAINS(str, "floating: 1"); + } + + OK(getFromSocket("/reload")); + Tests::killAllWindows(); + OK(getFromSocket("/keyword general:border_size 0")); OK(getFromSocket("/keyword windowrule match:float true, border_size 10")); diff --git a/src/desktop/rule/windowRule/WindowRuleApplicator.cpp b/src/desktop/rule/windowRule/WindowRuleApplicator.cpp index 14d7fbf15..202587cf2 100644 --- a/src/desktop/rule/windowRule/WindowRuleApplicator.cpp +++ b/src/desktop/rule/windowRule/WindowRuleApplicator.cpp @@ -130,10 +130,8 @@ CWindowRuleApplicator::SRuleResult CWindowRuleApplicator::applyDynamicRule(const break; } case WINDOW_RULE_EFFECT_PERSISTENT_SIZE: { - try { - m_persistentSize.first.set(std::stoi(effect), Types::PRIORITY_WINDOW_RULE); - m_persistentSize.second |= rule->getPropertiesMask(); - } catch (...) { Debug::log(ERR, "CWindowRuleApplicator::applyDynamicRule: invalid rounding_power {}", effect); } + m_persistentSize.first.set(truthy(effect), Types::PRIORITY_WINDOW_RULE); + m_persistentSize.second |= rule->getPropertiesMask(); break; } case WINDOW_RULE_EFFECT_ANIMATION: { diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index 953e8e02f..18c100b72 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -108,6 +108,9 @@ void IHyprLayout::onWindowCreatedFloating(PHLWINDOW pWindow) { xy = g_pXWaylandManager->xwaylandToWaylandCoords(xy); desiredGeometry.x = xy.x; desiredGeometry.y = xy.y; + } else if (pWindow->m_ruleApplicator->persistentSize().valueOrDefault()) { + desiredGeometry.w = pWindow->m_lastFloatingSize.x; + desiredGeometry.h = pWindow->m_lastFloatingSize.y; } static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling");