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*);