Skip to content

Commit

Permalink
internal: Replace monitor rule when disabling head. (#6136)
Browse files Browse the repository at this point in the history
Closes #5978
  • Loading branch information
levnikmyskin authored May 23, 2024
1 parent 255272e commit eea0a6a
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 1 deletion.
12 changes: 12 additions & 0 deletions src/config/ConfigManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/config/ConfigManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
9 changes: 8 additions & 1 deletion src/protocols/OutputManagement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ COutputHead::COutputHead(SP<CZwlrOutputHeadV1> 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(); });
Expand Down Expand Up @@ -305,6 +308,8 @@ COutputConfiguration::COutputConfiguration(SP<CZwlrOutputConfigurationV1> 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);
});

Expand Down Expand Up @@ -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};
Expand All @@ -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;
}

Expand Down

0 comments on commit eea0a6a

Please sign in to comment.