diff options
| author | Vaxry <vaxry@vaxry.net> | 2023-11-13 16:42:45 +0000 |
|---|---|---|
| committer | Vaxry <vaxry@vaxry.net> | 2023-11-13 16:42:58 +0000 |
| commit | 5edb4e4a304bbef1de30a36f7b921ea328d7efc6 (patch) | |
| tree | b8cf89817bfde5739dc51e8f9e6d88cb7554c3a6 | |
| parent | 4d6fa6ed0c6f10671c2bee337dc026f68cc12989 (diff) | |
decorations: recalc layout and positioner on add/remove
| -rw-r--r-- | src/Window.cpp | 4 | ||||
| -rw-r--r-- | src/render/decorations/DecorationPositioner.cpp | 10 | ||||
| -rw-r--r-- | src/render/decorations/DecorationPositioner.hpp | 1 |
3 files changed, 15 insertions, 0 deletions
diff --git a/src/Window.cpp b/src/Window.cpp index c1b79c2d..770350a4 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -202,12 +202,16 @@ void CWindow::updateWindowDecos() { void CWindow::addWindowDeco(std::unique_ptr<IHyprWindowDecoration> deco) { m_dWindowDecorations.emplace_back(std::move(deco)); + g_pDecorationPositioner->forceRecalcFor(this); updateWindowDecos(); + g_pLayoutManager->getCurrentLayout()->recalculateWindow(this); } void CWindow::removeWindowDeco(IHyprWindowDecoration* deco) { m_vDecosToRemove.push_back(deco); + g_pDecorationPositioner->forceRecalcFor(this); updateWindowDecos(); + g_pLayoutManager->getCurrentLayout()->recalculateWindow(this); } pid_t CWindow::getPID() { diff --git a/src/render/decorations/DecorationPositioner.cpp b/src/render/decorations/DecorationPositioner.cpp index 937eaa9a..b41b92a9 100644 --- a/src/render/decorations/DecorationPositioner.cpp +++ b/src/render/decorations/DecorationPositioner.cpp @@ -95,6 +95,16 @@ void CDecorationPositioner::sanitizeDatas() { }); } +void CDecorationPositioner::forceRecalcFor(CWindow* pWindow) { + const auto WIT = std::find_if(m_mWindowDatas.begin(), m_mWindowDatas.end(), [&](const auto& other) { return other.first == pWindow; }); + if (WIT == m_mWindowDatas.end()) + return; + + const auto WINDOWDATA = &WIT->second; + + WINDOWDATA->needsRecalc = true; +} + void CDecorationPositioner::onWindowUpdate(CWindow* pWindow) { if (!g_pCompositor->windowExists(pWindow) || !pWindow->m_bIsMapped) return; diff --git a/src/render/decorations/DecorationPositioner.hpp b/src/render/decorations/DecorationPositioner.hpp index ae4a814a..740b4efe 100644 --- a/src/render/decorations/DecorationPositioner.hpp +++ b/src/render/decorations/DecorationPositioner.hpp @@ -71,6 +71,7 @@ class CDecorationPositioner { CBox getBoxWithIncludedDecos(CWindow* pWindow); void repositionDeco(IHyprWindowDecoration* deco); CBox getWindowDecorationBox(IHyprWindowDecoration* deco); + void forceRecalcFor(CWindow* pWindow); private: struct SWindowPositioningData { |
