From 58ff04fdf3124fbe739193cb1a8070c85bec166b Mon Sep 17 00:00:00 2001 From: vaxerski Date: Wed, 10 Aug 2022 21:54:09 +0200 Subject: [PATCH] added experimental monitor saving --- src/Compositor.hpp | 2 ++ src/events/Monitors.cpp | 56 +++++++++++++++++++++++++++-------------- src/helpers/Monitor.cpp | 24 ++++++++++-------- 3 files changed, 53 insertions(+), 29 deletions(-) diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 73394d89..f7a131ae 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -97,6 +97,7 @@ public: bool m_bReadyToProcess = false; bool m_bSessionActive = true; bool m_bDPMSStateON = true; + bool m_bUnsafeState = false; // unsafe state is when there is no monitors. // ------------------------------------------------- // @@ -158,6 +159,7 @@ public: SLayerSurface* getLayerSurfaceFromWlr(wlr_layer_surface_v1*); SLayerSurface* getLayerSurfaceFromSurface(wlr_surface*); void closeWindow(CWindow*); + std::string explicitConfigPath; 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; - PNEWMONITOR->ID = g_pCompositor->getNextAvailableMonitorID(); + 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()); + + (*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; + } } } diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 51ff65bb..bd547a3b 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -160,6 +160,9 @@ void CMonitor::onConnect(bool noRule) { wlr_xcursor_manager_load(g_pCompositor->m_sWLRXCursorMgr, scale); + g_pHyprRenderer->arrangeLayersForMonitor(ID); + g_pLayoutManager->getCurrentLayout()->recalculateMonitor(ID); + g_pEventManager->postEvent(SHyprIPCEvent{"monitoradded", szName}); } @@ -177,16 +180,21 @@ void CMonitor::onDisconnect() { } } - if (!BACKUPMON) { - Debug::log(CRIT, "No monitors! Unplugged last! Exiting."); - g_pCompositor->cleanup(); - return; - } - m_bEnabled = false; hyprListener_monitorFrame.removeCallback(); + if (!BACKUPMON) { + Debug::log(WARN, "Unplugged last monitor, entering an unsafe state. Good luck my friend."); + + hyprListener_monitorMode.removeCallback(); + hyprListener_monitorDestroy.removeCallback(); + + g_pCompositor->m_bUnsafeState = true; + + return; + } + const auto BACKUPWORKSPACE = BACKUPMON->activeWorkspace > 0 ? std::to_string(BACKUPMON->activeWorkspace) : "name:" + g_pCompositor->getWorkspaceByID(BACKUPMON->activeWorkspace)->m_szName; // snap cursor @@ -215,10 +223,6 @@ void CMonitor::onDisconnect() { wlr_output_commit(output); - for (auto& lsl : m_aLayerSurfaceLists) { - lsl.clear(); - } - g_pCompositor->m_vWorkspaces.erase(std::remove_if(g_pCompositor->m_vWorkspaces.begin(), g_pCompositor->m_vWorkspaces.end(), [&](std::unique_ptr& el) { return el->m_iMonitorID == ID; })); Debug::log(LOG, "Removed monitor %s!", szName.c_str());