diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 77aa2fb3..fd70da77 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -1264,6 +1264,18 @@ void CConfigManager::appendMonitorRule(const SMonitorRule& r) { m_dMonitorRules.emplace_back(r); } +bool CConfigManager::replaceMonitorRule(const SMonitorRule& newrule) { + // Looks for an existing monitor rule (compared by name). + // If the rule exists, it is replaced with the input rule. + for (auto& r : m_dMonitorRules) { + if (r.name == newrule.name) { + r = newrule; + return true; + } + } + return false; +} + void CConfigManager::performMonitorReload() { bool overAgain = false; diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp index 7fc132c6..45b100ee 100644 --- a/src/config/ConfigManager.hpp +++ b/src/config/ConfigManager.hpp @@ -128,6 +128,7 @@ class CConfigManager { void performMonitorReload(); void appendMonitorRule(const SMonitorRule&); + bool replaceMonitorRule(const SMonitorRule&); bool m_bWantsMonitorReload = false; bool m_bForceReload = false; bool m_bNoMonitorReload = false; diff --git a/src/protocols/OutputManagement.cpp b/src/protocols/OutputManagement.cpp index e7779726..68c50193 100644 --- a/src/protocols/OutputManagement.cpp +++ b/src/protocols/OutputManagement.cpp @@ -106,6 +106,9 @@ COutputHead::COutputHead(SP resource_, CMonitor* pMonitor_) : } pMonitor = nullptr; + for (auto& m : PROTO::outputManagement->m_vManagers) { + m->sendDone(); + } }); listeners.monitorModeChange = pMonitor->events.modeChanged.registerListener([this](std::any d) { updateMode(); }); @@ -305,6 +308,8 @@ COutputConfiguration::COutputConfiguration(SP resour LOGM(LOG, "disableHead on {}", PMONITOR->szName); PMONITOR->activeMonitorRule.disabled = true; + if (!g_pConfigManager->replaceMonitorRule(PMONITOR->activeMonitorRule)) + g_pConfigManager->appendMonitorRule(PMONITOR->activeMonitorRule); g_pHyprRenderer->applyMonitorRule(PMONITOR, &PMONITOR->activeMonitorRule, false); }); @@ -356,6 +361,7 @@ bool COutputConfiguration::applyTestConfiguration(bool test) { SMonitorRule newRule = PMONITOR->activeMonitorRule; newRule.name = PMONITOR->szName; + newRule.disabled = false; if (head->committedProperties & COutputConfigurationHead::eCommittedProperties::OUTPUT_HEAD_COMMITTED_MODE) { newRule.resolution = {head->state.mode->getMode()->width, head->state.mode->getMode()->height}; @@ -380,7 +386,8 @@ bool COutputConfiguration::applyTestConfiguration(bool test) { // reset properties for next set. head->committedProperties = 0; - g_pConfigManager->appendMonitorRule(newRule); + if (!g_pConfigManager->replaceMonitorRule(newRule)) + g_pConfigManager->appendMonitorRule(newRule); g_pConfigManager->m_bWantsMonitorReload = true; }