diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index e73f6284..c12badf9 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -1980,7 +1980,7 @@ bool windowRuleValid(const std::string& RULE) { RULE == "nomaxsize" || RULE == "pin" || RULE == "noanim" || RULE == "dimaround" || RULE == "windowdance" || RULE == "maximize" || RULE == "keepaspectratio" || RULE.starts_with("animation") || RULE.starts_with("rounding") || RULE.starts_with("workspace") || RULE.starts_with("bordercolor") || RULE == "forcergbx" || RULE == "noinitialfocus" || RULE == "stayfocused" || RULE.starts_with("bordersize") || RULE.starts_with("xray") || RULE.starts_with("center") || - RULE.starts_with("group") || RULE == "immediate" || RULE == "nearestneighbor" || RULE.starts_with("suppressevent"); + RULE.starts_with("group") || RULE == "immediate" || RULE == "nearestneighbor" || RULE.starts_with("suppressevent") || RULE.starts_with("plugin:"); } bool layerRuleValid(const std::string& RULE) { diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index 333f43c3..04797f8b 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -748,11 +748,13 @@ void CWindow::updateDynamicRules() { m_sAdditionalConfigData.nearestNeighbor = false; m_eIdleInhibitMode = IDLEINHIBIT_NONE; - const auto WINDOWRULES = g_pConfigManager->getMatchingRules(m_pSelf.lock()); - for (auto& r : WINDOWRULES) { + m_vMatchedRules = g_pConfigManager->getMatchingRules(m_pSelf.lock()); + for (auto& r : m_vMatchedRules) { applyDynamicRule(r); } + EMIT_HOOK_EVENT("windowUpdateRules", m_pSelf.lock()); + g_pLayoutManager->getCurrentLayout()->recalculateMonitor(m_iMonitorID); } diff --git a/src/desktop/Window.hpp b/src/desktop/Window.hpp index dd7d2e1e..d6b962e7 100644 --- a/src/desktop/Window.hpp +++ b/src/desktop/Window.hpp @@ -378,6 +378,9 @@ class CWindow { bool m_bTearingHint = false; + // stores the currently matched window rules + std::vector m_vMatchedRules; + // For the list lookup bool operator==(const CWindow& rhs) { return m_uSurface.xdg == rhs.m_uSurface.xdg && m_uSurface.xwayland == rhs.m_uSurface.xwayland && m_vPosition == rhs.m_vPosition && m_vSize == rhs.m_vSize && diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index b408a8b0..dfc694c0 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -144,8 +144,8 @@ void Events::listener_mapWindow(void* owner, void* data) { } // window rules - const auto WINDOWRULES = g_pConfigManager->getMatchingRules(PWINDOW, false); - bool requestsFullscreen = PWINDOW->m_bWantsInitialFullscreen || + PWINDOW->m_vMatchedRules = g_pConfigManager->getMatchingRules(PWINDOW, false); + bool requestsFullscreen = PWINDOW->m_bWantsInitialFullscreen || (!PWINDOW->m_bIsX11 && PWINDOW->m_uSurface.xdg->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL && PWINDOW->m_uSurface.xdg->toplevel->requested.fullscreen) || (PWINDOW->m_bIsX11 && PWINDOW->m_uSurface.xwayland->fullscreen); bool requestsFakeFullscreen = false; @@ -153,7 +153,7 @@ void Events::listener_mapWindow(void* owner, void* data) { bool overridingNoFullscreen = false; bool overridingNoMaximize = false; - for (auto& r : WINDOWRULES) { + for (auto& r : PWINDOW->m_vMatchedRules) { if (r.szRule.starts_with("monitor")) { try { const auto MONITORSTR = removeBeginEndSpacesTabs(r.szRule.substr(r.szRule.find(' '))); @@ -343,7 +343,7 @@ void Events::listener_mapWindow(void* owner, void* data) { PWINDOW->m_bCreatedOverFullscreen = true; // size and move rules - for (auto& r : WINDOWRULES) { + for (auto& r : PWINDOW->m_vMatchedRules) { if (r.szRule.starts_with("size")) { try { const auto VALUE = r.szRule.substr(r.szRule.find(' ') + 1);