From d72f1cc644b30b1517d5a1725fb9014cffde5642 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Fri, 5 Aug 2022 19:23:53 +0200 Subject: [PATCH] fix various shadow damage issues --- src/layout/IHyprLayout.cpp | 6 ++---- src/managers/AnimationManager.cpp | 4 ++-- src/render/decorations/CHyprDropShadowDecoration.cpp | 12 ++++++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index bbe30e5b..c07ca6d9 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -178,8 +178,6 @@ void IHyprLayout::onMouseMove(const Vector2D& mousePos) { if (g_pInputManager->dragButton == BTN_LEFT) { DRAGGINGWINDOW->m_vRealPosition.setValueAndWarp(m_vBeginDragPositionXY + DELTA); - DRAGGINGWINDOW->updateWindowDecos(); - g_pXWaylandManager->setWindowSize(DRAGGINGWINDOW, DRAGGINGWINDOW->m_vRealSize.goalv()); } else { if (DRAGGINGWINDOW->m_bIsFloating) { @@ -189,8 +187,6 @@ void IHyprLayout::onMouseMove(const Vector2D& mousePos) { DRAGGINGWINDOW->m_vRealSize.setValueAndWarp(m_vBeginDragSizeXY + DELTA); DRAGGINGWINDOW->m_vRealSize.setValueAndWarp(Vector2D(std::clamp(DRAGGINGWINDOW->m_vRealSize.vec().x, (double)20, (double)MAXSIZE.x), std::clamp(DRAGGINGWINDOW->m_vRealSize.vec().y, (double)20, (double)MAXSIZE.y))); - DRAGGINGWINDOW->updateWindowDecos(); - g_pXWaylandManager->setWindowSize(DRAGGINGWINDOW, DRAGGINGWINDOW->m_vRealSize.goalv()); } else { resizeActiveWindow(TICKDELTA, DRAGGINGWINDOW); @@ -208,6 +204,8 @@ void IHyprLayout::onMouseMove(const Vector2D& mousePos) { DRAGGINGWINDOW->m_iWorkspaceID = PMONITOR->activeWorkspace; } + DRAGGINGWINDOW->updateWindowDecos(); + g_pHyprRenderer->damageWindow(DRAGGINGWINDOW); } diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp index 85258003..54c4ab30 100644 --- a/src/managers/AnimationManager.cpp +++ b/src/managers/AnimationManager.cpp @@ -147,8 +147,8 @@ void CAnimationManager::tick() { g_pHyprRenderer->damageBox(&WLRBOXPREV); if (PWINDOW) { - g_pHyprRenderer->damageWindow(PWINDOW); PWINDOW->updateWindowDecos(); + g_pHyprRenderer->damageWindow(PWINDOW); } else if (PWORKSPACE) { for (auto& w : g_pCompositor->m_vWindows) { if (!w->m_bIsMapped || w->m_bHidden) @@ -197,7 +197,7 @@ void CAnimationManager::tick() { if (PDECO) { const auto EXTENTS = PDECO->getWindowDecorationExtents(); - wlr_box dmg = {PWINDOW->m_vRealPosition.vec().x + EXTENTS.topLeft.x, PWINDOW->m_vRealPosition.vec().y + EXTENTS.topLeft.y, + wlr_box dmg = {PWINDOW->m_vRealPosition.vec().x - EXTENTS.topLeft.x, PWINDOW->m_vRealPosition.vec().y - EXTENTS.topLeft.y, PWINDOW->m_vRealSize.vec().x + EXTENTS.topLeft.x + EXTENTS.bottomRight.x, PWINDOW->m_vRealSize.vec().y + EXTENTS.topLeft.y + EXTENTS.bottomRight.y}; if (!*PSHADOWIGNOREWINDOW) { diff --git a/src/render/decorations/CHyprDropShadowDecoration.cpp b/src/render/decorations/CHyprDropShadowDecoration.cpp index 0a937059..33ed3be4 100644 --- a/src/render/decorations/CHyprDropShadowDecoration.cpp +++ b/src/render/decorations/CHyprDropShadowDecoration.cpp @@ -92,12 +92,14 @@ void CHyprDropShadowDecoration::draw(CMonitor* pMonitor, float a) { if (fullBox.width < 1 || fullBox.height < 1) return; // don't draw invisible shadows + g_pHyprOpenGL->scissor((wlr_box *)nullptr); + if (*PSHADOWIGNOREWINDOW) { + glEnable(GL_STENCIL_TEST); + glClearStencil(0); glClear(GL_STENCIL_BUFFER_BIT); - glEnable(GL_STENCIL_TEST); - glStencilFunc(GL_ALWAYS, 1, -1); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); @@ -106,8 +108,10 @@ void CHyprDropShadowDecoration::draw(CMonitor* pMonitor, float a) { scaleBox(&windowBox, pMonitor->scale); if (windowBox.width < 1 || windowBox.height < 1) { - glDisable(GL_STENCIL_TEST); - return; // prevent assert failed + glClearStencil(0); + glClear(GL_STENCIL_BUFFER_BIT); + glDisable(GL_STENCIL_TEST); + return; // prevent assert failed } g_pHyprOpenGL->renderRect(&windowBox, CColor(0,0,0,0), *PROUNDING);