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.cpp205
1 files changed, 77 insertions, 128 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
- EMIT_HOOK_EVENT("render", RENDER_POST_WINDOWS);
+ if (g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID))
+ continue; // special are in the third pass
- // 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);
+ 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);
}
- 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) {
- 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;
+ if (pWorkspace->m_bHasFullscreenWindow)
+ renderWorkspaceWindowsFullscreen(pMonitor, pWorkspace, time);
+ else
+ renderWorkspaceWindows(pMonitor, pWorkspace, time);
- // 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) {