summaryrefslogtreecommitdiff
path: root/src/helpers/Monitor.cpp
diff options
context:
space:
mode:
authorVisal Vijay <150381094+B2krobbery@users.noreply.github.com>2026-04-14 22:54:44 +0530
committerGitHub <noreply@github.com>2026-04-14 18:24:44 +0100
commit88f3e7e9d519ae704cab78548c6f6bf02a0b0841 (patch)
tree3f0cfbf5bb0003c4224553588ca96b2f5f2bb86a /src/helpers/Monitor.cpp
parente539d21174211dad3fa5f8f5e8496bb7e5c7baf2 (diff)
monitor: ensure swapchain is updated before mode test (#14065)
* monitor: ensure swapchain is updated before mode test * monitor: ensure swapchain update via helper for all mode set paths * monitor: fix formatting * monitor: move swapchain helper to CMonitorState * monitor: move swapchain helper to CMonitorState
Diffstat (limited to 'src/helpers/Monitor.cpp')
-rw-r--r--src/helpers/Monitor.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp
index 6e88357e..bff57c7e 100644
--- a/src/helpers/Monitor.cpp
+++ b/src/helpers/Monitor.cpp
@@ -827,7 +827,7 @@ bool CMonitor::applyMonitorRule(Config::CMonitorRule&& pMonitorRule, bool force)
std::string modeStr = std::format("{:X0}@{:.2f}Hz", mode->pixelSize, mode->refreshRate / 1000.f);
if (mode->modeInfo.has_value() && mode->modeInfo->type == DRM_MODE_TYPE_USERDEF) {
- m_output->state->setCustomMode(mode);
+ m_state.applyCustomModeWithSwapchain(mode);
if (!m_state.test()) {
Log::logger->log(Log::ERR, "Monitor {}: REJECTED custom mode {}!", m_name, modeStr);
@@ -836,7 +836,7 @@ bool CMonitor::applyMonitorRule(Config::CMonitorRule&& pMonitorRule, bool force)
m_customDrmMode = mode->modeInfo.value();
} else {
- m_output->state->setMode(mode);
+ m_state.applyModeWithSwapchain(mode);
if (!m_state.test()) {
Log::logger->log(Log::ERR, "Monitor {}: REJECTED available mode {}!", m_name, modeStr);
@@ -870,7 +870,7 @@ bool CMonitor::applyMonitorRule(Config::CMonitorRule&& pMonitorRule, bool force)
auto mode = makeShared<Aquamarine::SOutputMode>(Aquamarine::SOutputMode{.pixelSize = RULE->m_resolution, .refreshRate = refreshRate});
std::string modeStr = std::format("{:X0}@{:.2f}Hz", mode->pixelSize, mode->refreshRate / 1000.f);
- m_output->state->setCustomMode(mode);
+ m_state.applyCustomModeWithSwapchain(mode);
if (m_state.test()) {
Log::logger->log(Log::DEBUG, "Monitor {}: requested {}, using custom mode {}", m_name, requestedStr, modeStr);
@@ -888,7 +888,7 @@ bool CMonitor::applyMonitorRule(Config::CMonitorRule&& pMonitorRule, bool force)
// try any of the modes if none of the above work
if (!success) {
for (auto const& mode : m_output->modes) {
- m_output->state->setMode(mode);
+ m_state.applyModeWithSwapchain(mode);
if (!m_state.test())
continue;
@@ -2478,6 +2478,15 @@ bool CMonitorState::updateSwapchain() {
options.size = MODE->pixelSize;
return m_owner->m_output->swapchain->reconfigure(options);
}
+void CMonitorState::applyModeWithSwapchain(const SP<Aquamarine::SOutputMode>& mode) {
+ m_owner->m_output->state->setMode(mode);
+ updateSwapchain();
+}
+
+void CMonitorState::applyCustomModeWithSwapchain(const SP<Aquamarine::SOutputMode>& mode) {
+ m_owner->m_output->state->setCustomMode(mode);
+ updateSwapchain();
+}
bool CMonitor::needsACopyFB() {
return !m_mirrors.empty() || Screenshare::mgr()->isOutputBeingSSd(m_self.lock());