diff --git a/src/desktop/view/Popup.cpp b/src/desktop/view/Popup.cpp index f6d681370..817a9fde3 100644 --- a/src/desktop/view/Popup.cpp +++ b/src/desktop/view/Popup.cpp @@ -352,6 +352,10 @@ SP CPopup::getT1Owner() const { return m_layerOwner->wlSurface(); } +PHLLS CPopup::layerOwner() const { + return m_layerOwner.lock(); +} + Vector2D CPopup::coordsRelativeToParent() const { Vector2D offset; diff --git a/src/desktop/view/Popup.hpp b/src/desktop/view/Popup.hpp index 9280056c7..d0d66cc5e 100644 --- a/src/desktop/view/Popup.hpp +++ b/src/desktop/view/Popup.hpp @@ -32,6 +32,7 @@ namespace Desktop::View { virtual std::optional surfaceLogicalBox() const; SP getT1Owner() const; + PHLLS layerOwner() const; Vector2D coordsRelativeToParent() const; Vector2D coordsGlobal() const; PHLMONITOR getMonitor() const; diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 1b735a46a..a9643df0d 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -916,7 +916,6 @@ void IHyprRenderer::renderLayer(PHLLS pLayer, PHLMONITOR pMonitor, const Time::s renderdata.blockBlurOptimization = pLayer->m_layer == ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM || pLayer->m_layer == ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND; renderdata.clipBox = CBox{0, 0, pMonitor->m_size.x, pMonitor->m_size.y}.scale(pMonitor->m_scale); - if (renderdata.blur && pLayer->m_ruleApplicator->ignoreAlpha().hasValue()) { renderdata.discardMode |= DISCARD_ALPHA; renderdata.discardOpacity = pLayer->m_ruleApplicator->ignoreAlpha().valueOrDefault(); @@ -944,7 +943,13 @@ void IHyprRenderer::renderLayer(PHLLS pLayer, PHLMONITOR pMonitor, const Time::s renderdata.dontRound = true; renderdata.popup = true; renderdata.blur = pLayer->m_ruleApplicator->blurPopups().valueOrDefault(); - renderdata.surfaceCounter = 0; + renderdata.discardMode &= ~DISCARD_ALPHA; + renderdata.discardOpacity = 0.F; + if (renderdata.blur && pLayer->m_ruleApplicator->ignoreAlpha().hasValue()) { + renderdata.discardMode |= DISCARD_ALPHA; + renderdata.discardOpacity = pLayer->m_ruleApplicator->ignoreAlpha().valueOrDefault(); + } + renderdata.surfaceCounter = 0; if (popups) { pLayer->m_popupHead->breadthfirst( [this, &renderdata](WP popup, void* data) { @@ -3157,8 +3162,12 @@ void IHyprRenderer::renderSnapshot(WP popup) { data.blur = SHOULD_BLUR; data.blurA = sqrt(popup->m_alpha->value()); // sqrt makes the blur fadeout more realistic. data.blockBlurOptimization = SHOULD_BLUR; // force no xray on this (popups never have xray) - if (SHOULD_BLUR) - data.ignoreAlpha = std::max(*PBLURIGNOREA, 0.01F); /* ignore the alpha 0 regions */ + if (SHOULD_BLUR) { + if (const auto PLAYER = popup->layerOwner(); PLAYER && PLAYER->m_ruleApplicator->ignoreAlpha().hasValue()) + data.ignoreAlpha = std::max(PLAYER->m_ruleApplicator->ignoreAlpha().valueOrDefault(), 0.01F); + else + data.ignoreAlpha = std::max(*PBLURIGNOREA, 0.01F); /* ignore the alpha 0 regions */ + } m_renderPass.add(makeUnique(std::move(data))); }