summaryrefslogtreecommitdiff
path: root/src/events/Monitors.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/events/Monitors.cpp')
-rw-r--r--src/events/Monitors.cpp39
1 files changed, 19 insertions, 20 deletions
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<CMonitor>* 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<CMonitor>());
- if (!PNEWMONITORWRAP) {
- Debug::log(LOG, "Adding completely new monitor.");
- PNEWMONITORWRAP = &g_pCompositor->m_vRealMonitors.emplace_back(std::make_shared<CMonitor>());
-
- (*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<CMonitor>& el) { return el.get() == pMonitor; });
- }
+ std::erase_if(g_pCompositor->m_vRealMonitors, [&](std::shared_ptr<CMonitor>& el) { return el.get() == pMonitor; });
}
void Events::listener_monitorStateRequest(void* owner, void* data) {