From 58ff04fdf3124fbe739193cb1a8070c85bec166b Mon Sep 17 00:00:00 2001 From: vaxerski Date: Wed, 10 Aug 2022 21:54:09 +0200 Subject: added experimental monitor saving --- src/events/Monitors.cpp | 56 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 19 deletions(-) (limited to 'src/events/Monitors.cpp') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index bb8c2b96..05dd382b 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -53,16 +53,29 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { return; } - if (g_pCompositor->getMonitorFromName(std::string(OUTPUT->name))) { - Debug::log(WARN, "Monitor with name %s already exists, not adding as new!", OUTPUT->name); - return; + if (g_pCompositor->m_bUnsafeState) { + Debug::log(WARN, "Recovering from an unsafe state. May you be lucky."); } // add it to real - const auto PNEWMONITORWRAP = &g_pCompositor->m_vRealMonitors.emplace_back(std::make_shared()); - const auto PNEWMONITOR = PNEWMONITORWRAP->get(); + std::shared_ptr* PNEWMONITORWRAP = nullptr; + + for (auto& rm : g_pCompositor->m_vRealMonitors) { + if (rm->szName == OUTPUT->name) { + PNEWMONITORWRAP = &rm; + Debug::log(LOG, "Recovering a removed monitor."); + break; + } + } + + if (!PNEWMONITORWRAP) { + Debug::log(LOG, "Adding completely new monitor."); + PNEWMONITORWRAP = &g_pCompositor->m_vRealMonitors.emplace_back(std::make_shared()); - PNEWMONITOR->ID = g_pCompositor->getNextAvailableMonitorID(); + (*PNEWMONITORWRAP)->ID = g_pCompositor->getNextAvailableMonitorID(); + } + + const auto PNEWMONITOR = PNEWMONITORWRAP->get(); PNEWMONITOR->output = OUTPUT; PNEWMONITOR->m_pThisWrap = PNEWMONITORWRAP; @@ -73,14 +86,16 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { pMostHzMonitor = PNEWMONITOR; // ready to process cuz we have a monitor - if (PNEWMONITOR->m_bEnabled) + if (PNEWMONITOR->m_bEnabled) { g_pCompositor->m_bReadyToProcess = true; + g_pCompositor->m_bUnsafeState = false; + } } void Events::listener_monitorFrame(void* owner, void* data) { CMonitor* const PMONITOR = (CMonitor*)owner; - if ((g_pCompositor->m_sWLRSession && !g_pCompositor->m_sWLRSession->active) || !g_pCompositor->m_bSessionActive) { + if ((g_pCompositor->m_sWLRSession && !g_pCompositor->m_sWLRSession->active) || !g_pCompositor->m_bSessionActive || g_pCompositor->m_bUnsafeState) { Debug::log(WARN, "Attempted to render frame on inactive session!"); return; // cannot draw on session inactive (different tty) } @@ -294,20 +309,23 @@ void Events::listener_monitorDestroy(void* owner, void* data) { pMonitor->onDisconnect(); - // cleanup - g_pCompositor->m_vRealMonitors.erase(std::remove_if(g_pCompositor->m_vRealMonitors.begin(), g_pCompositor->m_vRealMonitors.end(), [&](std::shared_ptr& el) { return el.get() == pMonitor; })); + // cleanup if not unsafe - if (pMostHzMonitor == pMonitor) { - int mostHz = 0; - CMonitor* pMonitorMostHz = nullptr; + if (!g_pCompositor->m_bUnsafeState) { + g_pCompositor->m_vRealMonitors.erase(std::remove_if(g_pCompositor->m_vRealMonitors.begin(), g_pCompositor->m_vRealMonitors.end(), [&](std::shared_ptr& el) { return el.get() == pMonitor; })); - for (auto& m : g_pCompositor->m_vMonitors) { - if (m->refreshRate > mostHz) { - pMonitorMostHz = m.get(); - mostHz = m->refreshRate; + if (pMostHzMonitor == pMonitor) { + int mostHz = 0; + CMonitor* pMonitorMostHz = nullptr; + + for (auto& m : g_pCompositor->m_vMonitors) { + if (m->refreshRate > mostHz) { + pMonitorMostHz = m.get(); + mostHz = m->refreshRate; + } } - } - pMostHzMonitor = pMonitorMostHz; + pMostHzMonitor = pMonitorMostHz; + } } } -- cgit v1.2.3