diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2023-04-12 13:05:57 +0100 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2023-04-12 13:05:57 +0100 |
| commit | 293df75b97b6914b07978cead73db4618f1133d1 (patch) | |
| tree | b7adbdded292815d7ba7ac0b869bc1d79a7d46e8 /src/render/Renderer.cpp | |
| parent | f00e11d45775388d4d47519ed5d8f9051823cfd5 (diff) | |
renderer: workspace rendering improvements
Diffstat (limited to 'src/render/Renderer.cpp')
| -rw-r--r-- | src/render/Renderer.cpp | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 79d74fd0..cae2e04f 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -59,28 +59,29 @@ void renderSurface(struct wlr_surface* surface, int x, int y, void* data) { g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight = Vector2D(-1, -1); } -bool CHyprRenderer::shouldRenderWindow(CWindow* pWindow, CMonitor* pMonitor) { +bool CHyprRenderer::shouldRenderWindow(CWindow* pWindow, CMonitor* pMonitor, CWorkspace* pWorkspace) { wlr_box geometry = pWindow->getFullWindowBoundingBox(); if (!wlr_output_layout_intersects(g_pCompositor->m_sWLROutputLayout, pMonitor->output, &geometry)) return false; + if (pWindow->m_iWorkspaceID == -1) + return false; + if (pWindow->m_bPinned) return true; // now check if it has the same workspace - const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pWindow->m_iWorkspaceID); - - if (PWORKSPACE && PWORKSPACE->m_iMonitorID == pMonitor->ID) { - if (PWORKSPACE->m_vRenderOffset.isBeingAnimated() || PWORKSPACE->m_fAlpha.isBeingAnimated() || PWORKSPACE->m_bForceRendering) { + if (pWorkspace && pWorkspace->m_iMonitorID == pMonitor->ID) { + if (pWorkspace->m_vRenderOffset.isBeingAnimated() || pWorkspace->m_fAlpha.isBeingAnimated() || pWorkspace->m_bForceRendering) { return true; } else { - if (!(!PWORKSPACE->m_bHasFullscreenWindow || pWindow->m_bIsFullscreen || (pWindow->m_bIsFloating && pWindow->m_bCreatedOverFullscreen))) + if (!(!pWorkspace->m_bHasFullscreenWindow || pWindow->m_bIsFullscreen || (pWindow->m_bIsFloating && pWindow->m_bCreatedOverFullscreen))) return false; } } - if (pWindow->m_iWorkspaceID == pMonitor->activeWorkspace) + if (pWindow->m_iWorkspaceID == pWorkspace->m_iID) return true; // if not, check if it maybe is active on a different monitor. @@ -100,6 +101,9 @@ bool CHyprRenderer::shouldRenderWindow(CWindow* pWindow) { const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pWindow->m_iWorkspaceID); + if (pWindow->m_iWorkspaceID == -1) + return false; + if (pWindow->m_bPinned || PWORKSPACE->m_bForceRendering) return true; @@ -190,7 +194,7 @@ void CHyprRenderer::renderWorkspaceWithFullscreenWindow(CMonitor* pMonitor, CWor if (w->m_iWorkspaceID != pMonitor->specialWorkspaceID) continue; - if (!shouldRenderWindow(w.get(), pMonitor)) + if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) continue; // render the bad boy @@ -411,7 +415,7 @@ void CHyprRenderer::renderSessionLockSurface(SSessionLockSurface* pSurface, CMon wlr_surface_for_each_surface(pSurface->pWlrLockSurface->surface, renderSurface, &renderdata); } -void CHyprRenderer::renderAllClientsForMonitor(CMonitor* pMonitor, timespec* time, const Vector2D& translate, const float& scale) { +void CHyprRenderer::renderAllClientsForWorkspace(CMonitor* pMonitor, CWorkspace* pWorkspace, timespec* time, const Vector2D& translate, const float& scale) { static auto* const PDIMSPECIAL = &g_pConfigManager->getConfigValuePtr("decoration:dim_special")->floatValue; const SRenderModifData RENDERMODIFDATA = {translate, scale}; @@ -444,10 +448,9 @@ void CHyprRenderer::renderAllClientsForMonitor(CMonitor* pMonitor, timespec* tim // if there is a fullscreen window, render it and then do not render anymore. // fullscreen window will hide other windows and top layers - const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pMonitor->activeWorkspace); - if (PWORKSPACE->m_bHasFullscreenWindow) { - renderWorkspaceWithFullscreenWindow(pMonitor, PWORKSPACE, time); + if (pWorkspace->m_bHasFullscreenWindow) { + renderWorkspaceWithFullscreenWindow(pMonitor, pWorkspace, time); g_pHyprOpenGL->m_RenderData.renderModif = {}; return; } @@ -465,7 +468,7 @@ void CHyprRenderer::renderAllClientsForMonitor(CMonitor* pMonitor, timespec* tim if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) continue; // special are in the third pass - if (!shouldRenderWindow(w.get(), pMonitor)) + if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) continue; // render active window after all others of this pass @@ -492,7 +495,7 @@ void CHyprRenderer::renderAllClientsForMonitor(CMonitor* pMonitor, timespec* tim if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) continue; // special are in the third pass - if (!shouldRenderWindow(w.get(), pMonitor)) + if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) continue; // render the bad boy @@ -510,7 +513,7 @@ void CHyprRenderer::renderAllClientsForMonitor(CMonitor* pMonitor, timespec* tim if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) continue; - if (!shouldRenderWindow(w.get(), pMonitor)) + if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) continue; // render the bad boy @@ -528,7 +531,7 @@ void CHyprRenderer::renderAllClientsForMonitor(CMonitor* pMonitor, timespec* tim if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) continue; - if (!shouldRenderWindow(w.get(), pMonitor)) + if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) continue; // render the bad boy @@ -544,7 +547,7 @@ void CHyprRenderer::renderAllClientsForMonitor(CMonitor* pMonitor, timespec* tim if (!g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) continue; - if (!shouldRenderWindow(w.get(), pMonitor)) + if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) continue; if (!renderedSpecialBG) { @@ -1006,7 +1009,7 @@ void CHyprRenderer::renderWorkspace(CMonitor* pMonitor, CWorkspace* pWorkspace, translate = Vector2D{}; } - renderAllClientsForMonitor(pMonitor, now, translate, scale); + renderAllClientsForWorkspace(pMonitor, pWorkspace, now, translate, scale); } void CHyprRenderer::setWindowScanoutMode(CWindow* pWindow) { |
