From 1468001d3b62107988432df745f78f3403fa7a81 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Fri, 7 Oct 2022 12:34:54 +0100 Subject: [PATCH] offset floating windows out of bounds on ws anims --- src/render/Renderer.cpp | 32 +++++++++++++++---- .../decorations/CHyprDropShadowDecoration.cpp | 5 ++- .../decorations/CHyprDropShadowDecoration.hpp | 2 +- .../decorations/CHyprGroupBarDecoration.cpp | 4 +-- .../decorations/CHyprGroupBarDecoration.hpp | 2 +- .../decorations/IHyprWindowDecoration.hpp | 2 +- 6 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 8a1f6f3c..67d8912e 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -249,19 +249,37 @@ void CHyprRenderer::renderWindow(CWindow* pWindow, CMonitor* pMonitor, timespec* g_pHyprOpenGL->m_pCurrentWindow = pWindow; // clip box for animated offsets - if (const auto OFFVEC = PWORKSPACE->m_vRenderOffset.vec(); OFFVEC != Vector2D()) { - g_pHyprOpenGL->m_RenderData.clipBox = {(int)OFFVEC.x, (int)OFFVEC.y, (int)pMonitor->vecTransformedSize.x, (int)pMonitor->vecTransformedSize.y }; - - scaleBox(&g_pHyprOpenGL->m_RenderData.clipBox, pMonitor->scale); - } else { - g_pHyprOpenGL->m_RenderData.clipBox = {0, 0, 0, 0}; + Vector2D offset; + if (PWORKSPACE->m_vRenderOffset.vec().x != 0) { + const auto PWSMON = g_pCompositor->getMonitorFromID(PWORKSPACE->m_iMonitorID); + const auto PROGRESS = PWORKSPACE->m_vRenderOffset.vec().x / PWSMON->vecSize.x; + const auto WINBB = pWindow->getFullWindowBoundingBox(); + + if (WINBB.x < PWSMON->vecPosition.x) { + offset.x = (PWSMON->vecPosition.x - WINBB.x) * PROGRESS; + } else if (WINBB.x > PWSMON->vecPosition.x + PWSMON->vecSize.x) { + offset.x = (WINBB.x - PWSMON->vecPosition.x + PWSMON->vecSize.x) * PROGRESS; + } + } else if (PWORKSPACE->m_vRenderOffset.vec().y) { + const auto PWSMON = g_pCompositor->getMonitorFromID(PWORKSPACE->m_iMonitorID); + const auto PROGRESS = PWORKSPACE->m_vRenderOffset.vec().y / PWSMON->vecSize.y; + const auto WINBB = pWindow->getFullWindowBoundingBox(); + + if (WINBB.y < PWSMON->vecPosition.y) { + offset.y = (PWSMON->vecPosition.y - WINBB.y) * PROGRESS; + } else if (WINBB.y > PWSMON->vecPosition.y + PWSMON->vecSize.y) { + offset.y = (WINBB.y - PWSMON->vecPosition.y + PWSMON->vecSize.y) * PROGRESS; + } } + renderdata.x += offset.x; + renderdata.y += offset.y; + // render window decorations first, if not fullscreen full if (mode == RENDER_PASS_ALL || mode == RENDER_PASS_MAIN) { if (!pWindow->m_bIsFullscreen || PWORKSPACE->m_efFullscreenMode != FULLSCREEN_FULL) for (auto& wd : pWindow->m_dWindowDecorations) - wd->draw(pMonitor, renderdata.alpha * renderdata.fadeAlpha / 255.f); + wd->draw(pMonitor, renderdata.alpha * renderdata.fadeAlpha / 255.f, offset); wlr_surface_for_each_surface(g_pXWaylandManager->getWindowSurface(pWindow), renderSurface, &renderdata); diff --git a/src/render/decorations/CHyprDropShadowDecoration.cpp b/src/render/decorations/CHyprDropShadowDecoration.cpp index 3f56977b..baca1201 100644 --- a/src/render/decorations/CHyprDropShadowDecoration.cpp +++ b/src/render/decorations/CHyprDropShadowDecoration.cpp @@ -48,7 +48,7 @@ void CHyprDropShadowDecoration::updateWindow(CWindow* pWindow) { } } -void CHyprDropShadowDecoration::draw(CMonitor* pMonitor, float a) { +void CHyprDropShadowDecoration::draw(CMonitor* pMonitor, float a, const Vector2D& offset) { if (!g_pCompositor->windowValidMapped(m_pWindow)) return; @@ -79,6 +79,9 @@ void CHyprDropShadowDecoration::draw(CMonitor* pMonitor, float a) { fullBox.x -= pMonitor->vecPosition.x; fullBox.y -= pMonitor->vecPosition.y; + fullBox.x += offset.x; + fullBox.y += offset.y; + if (fullBox.width < 1 || fullBox.height < 1) return; // don't draw invisible shadows diff --git a/src/render/decorations/CHyprDropShadowDecoration.hpp b/src/render/decorations/CHyprDropShadowDecoration.hpp index a90f2b0f..ee8c09a5 100644 --- a/src/render/decorations/CHyprDropShadowDecoration.hpp +++ b/src/render/decorations/CHyprDropShadowDecoration.hpp @@ -9,7 +9,7 @@ public: virtual SWindowDecorationExtents getWindowDecorationExtents(); - virtual void draw(CMonitor*, float a); + virtual void draw(CMonitor*, float a, const Vector2D& offset); virtual eDecorationType getDecorationType(); diff --git a/src/render/decorations/CHyprGroupBarDecoration.cpp b/src/render/decorations/CHyprGroupBarDecoration.cpp index a60fc549..eee96947 100644 --- a/src/render/decorations/CHyprGroupBarDecoration.cpp +++ b/src/render/decorations/CHyprGroupBarDecoration.cpp @@ -63,7 +63,7 @@ void CHyprGroupBarDecoration::damageEntire() { g_pHyprRenderer->damageBox(&dm); } -void CHyprGroupBarDecoration::draw(CMonitor* pMonitor, float a) { +void CHyprGroupBarDecoration::draw(CMonitor* pMonitor, float a, const Vector2D& offset) { // get how many bars we will draw int barsToDraw = m_dwGroupMembers.size(); @@ -80,7 +80,7 @@ void CHyprGroupBarDecoration::draw(CMonitor* pMonitor, float a) { int xoff = 0; for (int i = 0; i < barsToDraw; ++i) { - wlr_box rect = {m_vLastWindowPos.x + xoff - pMonitor->vecPosition.x, m_vLastWindowPos.y - m_seExtents.topLeft.y - pMonitor->vecPosition.y, BARW, 3}; + wlr_box rect = {m_vLastWindowPos.x + xoff - pMonitor->vecPosition.x + offset.x, m_vLastWindowPos.y - m_seExtents.topLeft.y - pMonitor->vecPosition.y + offset.y, BARW, 3}; if (rect.width <= 0 || rect.height <= 0) break; diff --git a/src/render/decorations/CHyprGroupBarDecoration.hpp b/src/render/decorations/CHyprGroupBarDecoration.hpp index 00570347..7addd15e 100644 --- a/src/render/decorations/CHyprGroupBarDecoration.hpp +++ b/src/render/decorations/CHyprGroupBarDecoration.hpp @@ -10,7 +10,7 @@ public: virtual SWindowDecorationExtents getWindowDecorationExtents(); - virtual void draw(CMonitor*, float a); + virtual void draw(CMonitor*, float a, const Vector2D& offset); virtual eDecorationType getDecorationType(); diff --git a/src/render/decorations/IHyprWindowDecoration.hpp b/src/render/decorations/IHyprWindowDecoration.hpp index 6c4a9b50..d4062c1d 100644 --- a/src/render/decorations/IHyprWindowDecoration.hpp +++ b/src/render/decorations/IHyprWindowDecoration.hpp @@ -22,7 +22,7 @@ public: virtual SWindowDecorationExtents getWindowDecorationExtents() = 0; - virtual void draw(CMonitor*, float a) = 0; + virtual void draw(CMonitor*, float a, const Vector2D& offset = Vector2D()) = 0; virtual eDecorationType getDecorationType() = 0;