summaryrefslogtreecommitdiff
path: root/src/render/Renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/Renderer.cpp')
-rw-r--r--src/render/Renderer.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index d944a3ec..bb72398b 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -685,11 +685,15 @@ void CHyprRenderer::renderAllClientsForWorkspace(CMonitor* pMonitor, CWorkspace*
// pre window pass
g_pHyprOpenGL->preWindowPass();
+ setOccludedForMainWorkspace(g_pHyprOpenGL->m_RenderData.damage, pWorkspace);
+
if (pWorkspace->m_bHasFullscreenWindow)
renderWorkspaceWindowsFullscreen(pMonitor, pWorkspace, time);
else
renderWorkspaceWindows(pMonitor, pWorkspace, time);
+ g_pHyprOpenGL->m_RenderData.damage = preOccludedDamage;
+
g_pHyprOpenGL->m_RenderData.renderModif = {};
// and then special
@@ -2196,6 +2200,35 @@ void CHyprRenderer::initiateManualCrash() {
g_pConfigManager->setInt("debug:damage_tracking", 0);
}
+void CHyprRenderer::setOccludedForMainWorkspace(CRegion& region, CWorkspace* pWorkspace) {
+ CRegion rg;
+
+ const auto PMONITOR = g_pCompositor->getMonitorFromID(pWorkspace->m_iMonitorID);
+
+ if (!PMONITOR->specialWorkspaceID)
+ return;
+
+ for (auto& w : g_pCompositor->m_vWindows) {
+ if (!w->m_bIsMapped || w->isHidden() || w->m_iWorkspaceID != PMONITOR->specialWorkspaceID)
+ continue;
+
+ if (!w->opaque())
+ continue;
+
+ const auto ROUNDING = w->rounding() * PMONITOR->scale;
+ const Vector2D POS = w->m_vRealPosition.vec() + Vector2D{ROUNDING, ROUNDING} - PMONITOR->vecPosition + (w->m_bPinned ? Vector2D{} : pWorkspace->m_vRenderOffset.vec());
+ const Vector2D SIZE = w->m_vRealSize.vec() - Vector2D{ROUNDING * 2, ROUNDING * 2};
+
+ CBox box = {POS.x, POS.y, SIZE.x, SIZE.y};
+
+ box.scale(PMONITOR->scale);
+
+ rg.add(box);
+ }
+
+ region.subtract(rg);
+}
+
void CHyprRenderer::setOccludedForBackLayers(CRegion& region, CWorkspace* pWorkspace) {
CRegion rg;