From d9292800a27ca7de5cb8b258651e535a7880e9e6 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Fri, 1 Sep 2023 22:03:56 +0200 Subject: internal: Unsafe state reworks (#3114) --- src/events/Monitors.cpp | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) (limited to 'src/events/Monitors.cpp') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 5e87c4fb..4258b4ec 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -57,27 +57,15 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { return; } - if (g_pCompositor->m_bUnsafeState) { + if (g_pCompositor->m_bUnsafeState) Debug::log(WARN, "Recovering from an unsafe state. May you be lucky."); - } // add it to real 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; - } - } + PNEWMONITORWRAP = &g_pCompositor->m_vRealMonitors.emplace_back(std::make_shared()); - if (!PNEWMONITORWRAP) { - Debug::log(LOG, "Adding completely new monitor."); - PNEWMONITORWRAP = &g_pCompositor->m_vRealMonitors.emplace_back(std::make_shared()); - - (*PNEWMONITORWRAP)->ID = g_pCompositor->getNextAvailableMonitorID(OUTPUT->name); - } + (*PNEWMONITORWRAP)->ID = g_pCompositor->getNextAvailableMonitorID(OUTPUT->name); const auto PNEWMONITOR = PNEWMONITORWRAP->get(); @@ -91,6 +79,20 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { // ready to process cuz we have a monitor if (PNEWMONITOR->m_bEnabled) { + + if (g_pCompositor->m_bUnsafeState) { + // recover workspaces + for (auto& ws : g_pCompositor->m_vWorkspaces) { + g_pCompositor->moveWorkspaceToMonitor(ws.get(), PNEWMONITOR); + } + + g_pHyprRenderer->m_pMostHzMonitor = PNEWMONITOR; + + const auto POS = PNEWMONITOR->vecPosition + PNEWMONITOR->vecSize / 2.f; + if (g_pCompositor->m_sSeat.mouse) + wlr_cursor_warp(g_pCompositor->m_sWLRCursor, g_pCompositor->m_sSeat.mouse->mouse, POS.x, POS.y); + } + g_pCompositor->m_bReadyToProcess = true; g_pCompositor->m_bUnsafeState = false; } @@ -184,12 +186,9 @@ void Events::listener_monitorDestroy(void* owner, void* data) { pMonitor->output = nullptr; pMonitor->m_bRenderingInitPassed = false; - // cleanup if not unsafe - if (!g_pCompositor->m_bUnsafeState) { - Debug::log(LOG, "Removing monitor %s from realMonitors", pMonitor->szName.c_str()); + Debug::log(LOG, "Removing monitor %s from realMonitors", pMonitor->szName.c_str()); - std::erase_if(g_pCompositor->m_vRealMonitors, [&](std::shared_ptr& el) { return el.get() == pMonitor; }); - } + std::erase_if(g_pCompositor->m_vRealMonitors, [&](std::shared_ptr& el) { return el.get() == pMonitor; }); } void Events::listener_monitorStateRequest(void* owner, void* data) { -- cgit v1.2.3