summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUjinT34 <41110182+UjinT34@users.noreply.github.com>2026-02-04 15:42:43 +0300
committerGitHub <noreply@github.com>2026-02-04 12:42:43 +0000
commit02ff413002eddd7419ba70eb0f9f92acd2d97ddc (patch)
tree921959d061b04257f19fd7c4de8fb5bfde46478c
parent1bc857b12c434b7255119de009a50237856a90b2 (diff)
monitor: fix DS deactivation (#13188)
-rw-r--r--src/helpers/Monitor.hpp1
-rw-r--r--src/render/Renderer.cpp4
2 files changed, 4 insertions, 1 deletions
diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp
index 17ce15d4..d1f9a556 100644
--- a/src/helpers/Monitor.hpp
+++ b/src/helpers/Monitor.hpp
@@ -177,6 +177,7 @@ class CMonitor {
// for direct scanout
PHLWINDOWREF m_lastScanout;
+ bool m_directScanoutIsActive = false; // for cleanup logic. m_lastScanout.expired() can become true before the DS cleanup if client crashes/exits while DS is active.
bool m_scanoutNeedsCursorUpdate = false;
// for special fade/blur
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index c4375be4..1b95ce8a 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -1315,10 +1315,12 @@ void CHyprRenderer::renderMonitor(PHLMONITOR pMonitor, bool commit) {
bool shouldTear = pMonitor->updateTearing();
if (pMonitor->attemptDirectScanout()) {
+ pMonitor->m_directScanoutIsActive = true;
return;
- } else if (!pMonitor->m_lastScanout.expired()) {
+ } else if (!pMonitor->m_lastScanout.expired() || pMonitor->m_directScanoutIsActive) {
Log::logger->log(Log::DEBUG, "Left a direct scanout.");
pMonitor->m_lastScanout.reset();
+ pMonitor->m_directScanoutIsActive = false;
// reset DRM format, but only if needed since it might modeset
if (pMonitor->m_output->state->state().drmFormat != pMonitor->m_prevDrmFormat)