summaryrefslogtreecommitdiff
path: root/src/events/Monitors.cpp
diff options
context:
space:
mode:
authorvaxerski <vaxry@vaxry.net>2022-08-10 21:54:09 +0200
committervaxerski <vaxry@vaxry.net>2022-08-10 21:54:09 +0200
commit58ff04fdf3124fbe739193cb1a8070c85bec166b (patch)
tree5b5a2171025f93749a15be248e0f4652fbfc3fc8 /src/events/Monitors.cpp
parent9b39a0c2e0fb3ad4500c132dc975580f90eb1c08 (diff)
added experimental monitor saving
Diffstat (limited to 'src/events/Monitors.cpp')
-rw-r--r--src/events/Monitors.cpp56
1 files changed, 37 insertions, 19 deletions
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<CMonitor>());
- const auto PNEWMONITOR = PNEWMONITORWRAP->get();
+ 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;
+ }
+ }
+
+ if (!PNEWMONITORWRAP) {
+ Debug::log(LOG, "Adding completely new monitor.");
+ PNEWMONITORWRAP = &g_pCompositor->m_vRealMonitors.emplace_back(std::make_shared<CMonitor>());
- 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<CMonitor>& 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<CMonitor>& 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;
+ }
}
}