summaryrefslogtreecommitdiff
path: root/src/render/Renderer.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2023-09-04 15:07:56 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2023-09-04 15:07:56 +0200
commit32f75ebb701f424e638a51c56860315fe000dd19 (patch)
tree12fb5ef2ec6efe7cb9295ac6d4d2a932d9b4e984 /src/render/Renderer.cpp
parent35df4693eaacaf95054af93eca687047355fcd26 (diff)
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
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) {