summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-21 19:18:33 +0100
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-21 19:18:33 +0100
commit295a0c4a6904b639ae406df2f106eb35d71899ae (patch)
tree55ba41ed80f20b798e3f7719323dfb673787a44b /src/render
parent1b50377a5aaa8d5e2585d72dc5393ac6ad6fe248 (diff)
Added fullscreen
Diffstat (limited to 'src/render')
-rw-r--r--src/render/Renderer.cpp64
-rw-r--r--src/render/Renderer.hpp3
2 files changed, 39 insertions, 28 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index 0424931a..6239c3c5 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -55,6 +55,35 @@ bool shouldRenderWindow(CWindow* pWindow, SMonitor* pMonitor) {
return false;
}
+void CHyprRenderer::renderWorkspaceWithFullscreenWindow(SMonitor* pMonitor, SWorkspace* pWorkspace, timespec* time) {
+ for (auto& w : g_pCompositor->m_lWindows) {
+ if (w.m_iWorkspaceID != pWorkspace->ID || !w.m_bIsFullscreen)
+ continue;
+
+ // found it!
+ renderWindow(&w, pMonitor, time, false);
+ }
+}
+
+void CHyprRenderer::renderWindow(CWindow* pWindow, SMonitor* pMonitor, timespec* time, bool decorate) {
+ // border
+ if (decorate)
+ drawBorderForWindow(pWindow, pMonitor);
+
+ SRenderData renderdata = {pMonitor->output, time, pWindow->m_vRealPosition.x, pWindow->m_vRealPosition.y};
+
+ wlr_surface_for_each_surface(g_pXWaylandManager->getWindowSurface(pWindow), renderSurface, &renderdata);
+
+ if (pWindow->m_bIsX11) {
+ if (pWindow->m_uSurface.xwayland->surface) {
+ wlr_surface_for_each_surface(pWindow->m_uSurface.xwayland->surface, renderSurface, &renderdata);
+ }
+ }
+ else {
+ wlr_xdg_surface_for_each_popup_surface(pWindow->m_uSurface.xdg, renderSurface, &renderdata);
+ }
+}
+
void CHyprRenderer::renderAllClientsForMonitor(const int& ID, timespec* time) {
const auto PMONITOR = g_pCompositor->getMonitorFromID(ID);
@@ -71,30 +100,16 @@ void CHyprRenderer::renderAllClientsForMonitor(const int& ID, timespec* time) {
wlr_surface_for_each_surface(ls->layerSurface->surface, renderSurface, &renderdata);
}
- for (auto& w : g_pCompositor->m_lWindows) {
-
- if (w.m_bIsX11)
- continue;
-
- if (!shouldRenderWindow(&w, PMONITOR))
- continue;
-
- // render the bad boy
-
- // border
- drawBorderForWindow(&w, PMONITOR);
-
- SRenderData renderdata = {PMONITOR->output, time, w.m_vRealPosition.x, w.m_vRealPosition.y};
+ // 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);
- wlr_surface_for_each_surface(g_pXWaylandManager->getWindowSurface(&w), renderSurface, &renderdata);
- wlr_xdg_surface_for_each_popup_surface(w.m_uSurface.xdg, renderSurface, &renderdata);
+ if (PWORKSPACE->hasFullscreenWindow) {
+ renderWorkspaceWithFullscreenWindow(PMONITOR, PWORKSPACE, time);
+ return;
}
for (auto& w : g_pCompositor->m_lWindows) {
-
- if (!w.m_bIsX11)
- continue;
-
if (!g_pCompositor->windowValidMapped(&w))
continue;
@@ -102,14 +117,7 @@ void CHyprRenderer::renderAllClientsForMonitor(const int& ID, timespec* time) {
continue;
// render the bad boy
-
- // border
- drawBorderForWindow(&w, PMONITOR);
-
- SRenderData renderdata = {PMONITOR->output, time, w.m_vRealPosition.x, w.m_vRealPosition.y};
-
- if (w.m_uSurface.xwayland->surface)
- wlr_surface_for_each_surface(g_pXWaylandManager->getWindowSurface(&w), renderSurface, &renderdata);
+ renderWindow(&w, PMONITOR, time, true);
}
// Render surfaces above windows for monitor
diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp
index a2781693..2d7d8eb9 100644
--- a/src/render/Renderer.hpp
+++ b/src/render/Renderer.hpp
@@ -3,6 +3,7 @@
#include "../defines.hpp"
#include <list>
#include "../helpers/Monitor.hpp"
+#include "../helpers/Workspace.hpp"
#include "../Window.hpp"
class CHyprRenderer {
@@ -16,6 +17,8 @@ public:
private:
void arrangeLayerArray(SMonitor*, const std::list<SLayerSurface*>&, bool, wlr_box*);
void drawBorderForWindow(CWindow*, SMonitor*);
+ void renderWorkspaceWithFullscreenWindow(SMonitor*, SWorkspace*, timespec*);
+ void renderWindow(CWindow*, SMonitor*, timespec*, bool);
};
inline std::unique_ptr<CHyprRenderer> g_pHyprRenderer;