diff --git a/hyprexpo/scrollOverview.cpp b/hyprexpo/scrollOverview.cpp index 754915b..a25403b 100644 --- a/hyprexpo/scrollOverview.cpp +++ b/hyprexpo/scrollOverview.cpp @@ -243,21 +243,40 @@ void CScrollOverview::redrawWorkspace(PHLWORKSPACE workspace, bool forcelowres) auto img = image->windowImages.emplace_back(makeShared()); img->pWindow = w; img->fb.alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, pMonitor->m_output->state->state().drmFormat); + if (!w->m_isX11 && w->m_wlSurface) { + img->windowCommit = makeUnique(w->m_wlSurface->resource()->m_events.commit.listen([wk = WP{img}] { + if (!wk || !wk->pWindow) + return; - CRegion fakeDamage{0, 0, INT16_MAX, INT16_MAX}; - g_pHyprRenderer->beginRender(pMonitor.lock(), fakeDamage, RENDER_MODE_FULL_FAKE, nullptr, &img->fb); + if (wk->pWindow->m_wlSurface->resource()->m_current.accumulateBufferDamage().empty()) + return; - g_pHyprOpenGL->clear(CHyprColor{0, 0, 0, 0}); + reinterpretPointerCast(g_pOverview)->redrawWindowImage(wk.lock()); + g_pOverview->damage(); + })); + } - g_pHyprRenderer->renderWindow(w, pMonitor.lock(), Time::steadyNow(), true, RENDER_PASS_ALL, true, true); - - g_pHyprOpenGL->m_renderData.blockScreenShader = true; - g_pHyprRenderer->endRender(); + redrawWindowImage(img); } blockOverviewRendering = false; } +void CScrollOverview::redrawWindowImage(SP img) { + if (!img->pWindow) + return; + + CRegion fakeDamage{0, 0, INT16_MAX, INT16_MAX}; + g_pHyprRenderer->beginRender(pMonitor.lock(), fakeDamage, RENDER_MODE_FULL_FAKE, nullptr, &img->fb); + + g_pHyprOpenGL->clear(CHyprColor{0, 0, 0, 0}); + + g_pHyprRenderer->renderWindow(img->pWindow.lock(), pMonitor.lock(), Time::steadyNow(), true, RENDER_PASS_ALL, true, true); + + g_pHyprOpenGL->m_renderData.blockScreenShader = true; + g_pHyprRenderer->endRender(); +} + void CScrollOverview::redrawAll(bool forcelowres) { for (const auto& img : images) { diff --git a/hyprexpo/scrollOverview.hpp b/hyprexpo/scrollOverview.hpp index cdf6cf3..1c889c9 100644 --- a/hyprexpo/scrollOverview.hpp +++ b/hyprexpo/scrollOverview.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include "IOverview.hpp" @@ -46,11 +47,14 @@ class CScrollOverview : public IOverview { size_t viewportCurrentWorkspace = 0; struct SWindowImage { - PHLWINDOWREF pWindow; - CFramebuffer fb; - bool highlight = false; + PHLWINDOWREF pWindow; + CFramebuffer fb; + bool highlight = false; + UP windowCommit; }; + void redrawWindowImage(SP); + struct SWorkspaceImage { PHLWORKSPACE pWorkspace; CBox box;