From 32f75ebb701f424e638a51c56860315fe000dd19 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 4 Sep 2023 15:07:56 +0200 Subject: [PATCH] renderer: separate workspace window render logic Makes the logic used to render stuff over the windows (special, popups, ime, lockscreen) unified by yeeting the workspace window logic (which is separate cuz fullscreen windows) into their own funcs. Fixes #2053 --- src/render/Renderer.cpp | 205 +++++++++++++++------------------------- src/render/Renderer.hpp | 3 +- 2 files changed, 79 insertions(+), 129 deletions(-) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index ed0feea9..ef7bd8d2 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -136,7 +136,7 @@ bool CHyprRenderer::shouldRenderWindow(CWindow* pWindow) { return false; } -void CHyprRenderer::renderWorkspaceWithFullscreenWindow(CMonitor* pMonitor, CWorkspace* pWorkspace, timespec* time) { +void CHyprRenderer::renderWorkspaceWindowsFullscreen(CMonitor* pMonitor, CWorkspace* pWorkspace, timespec* time) { CWindow* pWorkspaceWindow = nullptr; EMIT_HOOK_EVENT("render", RENDER_PRE_WINDOWS); @@ -201,56 +201,92 @@ void CHyprRenderer::renderWorkspaceWithFullscreenWindow(CMonitor* pMonitor, CWor renderWindow(w.get(), pMonitor, time, true, RENDER_PASS_ALL); } +} - // and then special windows - if (pMonitor->specialWorkspaceID) - for (auto& w : g_pCompositor->m_vWindows) { - if (!g_pCompositor->windowValidMapped(w.get()) && !w->m_bFadingOut) - continue; +void CHyprRenderer::renderWorkspaceWindows(CMonitor* pMonitor, CWorkspace* pWorkspace, timespec* time) { + CWindow* lastWindow = nullptr; - if (w->m_iWorkspaceID != pMonitor->specialWorkspaceID) - continue; + EMIT_HOOK_EVENT("render", RENDER_PRE_WINDOWS); - if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) - continue; + // Non-floating main + for (auto& w : g_pCompositor->m_vWindows) { + if (w->isHidden() && !w->m_bIsMapped && !w->m_bFadingOut) + continue; - // render the bad boy - renderWindow(w.get(), pMonitor, time, true, RENDER_PASS_ALL); + if (w->m_bIsFloating) + continue; // floating are in the second pass + + if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) + continue; // special are in the third pass + + if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) + continue; + + // render active window after all others of this pass + if (w.get() == g_pCompositor->m_pLastWindow) { + lastWindow = w.get(); + continue; } - EMIT_HOOK_EVENT("render", RENDER_POST_WINDOWS); - - // and the overlay layers - for (auto& ls : pMonitor->m_aLayerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) { - if (ls->alpha.fl() != 0.f) - renderLayer(ls.get(), pMonitor, time); + // render the bad boy + renderWindow(w.get(), pMonitor, time, true, RENDER_PASS_MAIN); } - for (auto& ls : pMonitor->m_aLayerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]) { - renderLayer(ls.get(), pMonitor, time); + if (lastWindow) + renderWindow(lastWindow, pMonitor, time, true, RENDER_PASS_MAIN); + + // Non-floating popup + for (auto& w : g_pCompositor->m_vWindows) { + if (w->isHidden() && !w->m_bIsMapped && !w->m_bFadingOut) + continue; + + if (w->m_bIsFloating) + continue; // floating are in the second pass + + if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) + continue; // special are in the third pass + + if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) + continue; + + // render the bad boy + renderWindow(w.get(), pMonitor, time, true, RENDER_PASS_POPUP); } - // Render IME popups - for (auto& imep : g_pInputManager->m_sIMERelay.m_lIMEPopups) { - renderIMEPopup(&imep, pMonitor, time); + // floating on top + for (auto& w : g_pCompositor->m_vWindows) { + if (w->isHidden() && !w->m_bIsMapped && !w->m_bFadingOut) + continue; + + if (!w->m_bIsFloating || w->m_bPinned) + continue; + + if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) + continue; + + if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) + continue; + + // render the bad boy + renderWindow(w.get(), pMonitor, time, true, RENDER_PASS_ALL); } - renderDragIcon(pMonitor, time); + // pinned always above + for (auto& w : g_pCompositor->m_vWindows) { + if (w->isHidden() && !w->m_bIsMapped && !w->m_bFadingOut) + continue; - // if correct monitor draw hyprerror - if (pMonitor == g_pCompositor->m_vMonitors.front().get()) - g_pHyprError->draw(); + if (!w->m_bPinned || !w->m_bIsFloating) + continue; - if (g_pSessionLockManager->isSessionLocked()) { - const auto PSLS = g_pSessionLockManager->getSessionLockSurfaceForMonitor(pMonitor->ID); + if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) + continue; - if (!PSLS) { - // locked with no surface, fill with red - wlr_box boxe = {0, 0, INT16_MAX, INT16_MAX}; - g_pHyprOpenGL->renderRect(&boxe, CColor(1.0, 0.2, 0.2, 1.0)); - } else { - renderSessionLockSurface(PSLS, pMonitor, time); - } + if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) + continue; + + // render the bad boy + renderWindow(w.get(), pMonitor, time, true, RENDER_PASS_ALL); } } @@ -505,99 +541,12 @@ void CHyprRenderer::renderAllClientsForWorkspace(CMonitor* pMonitor, CWorkspace* // pre window pass g_pHyprOpenGL->preWindowPass(); - // if there is a fullscreen window, render it and then do not render anymore. - // fullscreen window will hide other windows and top layers + if (pWorkspace->m_bHasFullscreenWindow) + renderWorkspaceWindowsFullscreen(pMonitor, pWorkspace, time); + else + renderWorkspaceWindows(pMonitor, pWorkspace, time); - if (pWorkspace->m_bHasFullscreenWindow) { - renderWorkspaceWithFullscreenWindow(pMonitor, pWorkspace, time); - g_pHyprOpenGL->m_RenderData.renderModif = {}; - return; - } - - CWindow* lastWindow = nullptr; - - EMIT_HOOK_EVENT("render", RENDER_PRE_WINDOWS); - - // Non-floating main - for (auto& w : g_pCompositor->m_vWindows) { - if (w->isHidden() && !w->m_bIsMapped && !w->m_bFadingOut) - continue; - - if (w->m_bIsFloating) - continue; // floating are in the second pass - - if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) - continue; // special are in the third pass - - if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) - continue; - - // render active window after all others of this pass - if (w.get() == g_pCompositor->m_pLastWindow) { - lastWindow = w.get(); - continue; - } - - // render the bad boy - renderWindow(w.get(), pMonitor, time, true, RENDER_PASS_MAIN); - } - - if (lastWindow) - renderWindow(lastWindow, pMonitor, time, true, RENDER_PASS_MAIN); - - // Non-floating popup - for (auto& w : g_pCompositor->m_vWindows) { - if (w->isHidden() && !w->m_bIsMapped && !w->m_bFadingOut) - continue; - - if (w->m_bIsFloating) - continue; // floating are in the second pass - - if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) - continue; // special are in the third pass - - if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) - continue; - - // render the bad boy - renderWindow(w.get(), pMonitor, time, true, RENDER_PASS_POPUP); - } - - // floating on top - for (auto& w : g_pCompositor->m_vWindows) { - if (w->isHidden() && !w->m_bIsMapped && !w->m_bFadingOut) - continue; - - if (!w->m_bIsFloating || w->m_bPinned) - continue; - - if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) - continue; - - if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) - continue; - - // render the bad boy - renderWindow(w.get(), pMonitor, time, true, RENDER_PASS_ALL); - } - - // pinned always above - for (auto& w : g_pCompositor->m_vWindows) { - if (w->isHidden() && !w->m_bIsMapped && !w->m_bFadingOut) - continue; - - if (!w->m_bPinned || !w->m_bIsFloating) - continue; - - if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)) - continue; - - if (!shouldRenderWindow(w.get(), pMonitor, pWorkspace)) - continue; - - // render the bad boy - renderWindow(w.get(), pMonitor, time, true, RENDER_PASS_ALL); - } + g_pHyprOpenGL->m_RenderData.renderModif = {}; // and then special for (auto& ws : g_pCompositor->m_vWorkspaces) { diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp index badd4a45..f0e19c38 100644 --- a/src/render/Renderer.hpp +++ b/src/render/Renderer.hpp @@ -77,7 +77,8 @@ class CHyprRenderer { private: void arrangeLayerArray(CMonitor*, const std::vector>&, bool, wlr_box*); - void renderWorkspaceWithFullscreenWindow(CMonitor*, CWorkspace*, timespec*); + void renderWorkspaceWindowsFullscreen(CMonitor*, CWorkspace*, timespec*); // renders workspace windows (fullscreen) (tiled, floating, pinned, but no special) + void renderWorkspaceWindows(CMonitor*, CWorkspace*, timespec*); // renders workspace windows (no fullscreen) (tiled, floating, pinned, but no special) void renderWindow(CWindow*, CMonitor*, timespec*, bool, eRenderPassMode, bool ignorePosition = false, bool ignoreAllGeometry = false); void renderLayer(SLayerSurface*, CMonitor*, timespec*); void renderSessionLockSurface(SSessionLockSurface*, CMonitor*, timespec*);