summaryrefslogtreecommitdiff
path: root/src/protocols/ColorManagement.cpp
diff options
context:
space:
mode:
authorUjinT34 <41110182+UjinT34@users.noreply.github.com>2025-07-15 20:33:14 +0300
committerGitHub <noreply@github.com>2025-07-15 19:33:14 +0200
commite15014e031589e1df2dc29a5ce94325676796ac4 (patch)
tree5d56992b9e6c458dd1830c4b9ea235c0391fedd8 /src/protocols/ColorManagement.cpp
parentbc764f7065c8e46b4e62cbb511b419034712c509 (diff)
protocols/cm: Fix preferred image description (#11026)
Diffstat (limited to 'src/protocols/ColorManagement.cpp')
-rw-r--r--src/protocols/ColorManagement.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/protocols/ColorManagement.cpp b/src/protocols/ColorManagement.cpp
index 502fbe45..aa01a365 100644
--- a/src/protocols/ColorManagement.cpp
+++ b/src/protocols/ColorManagement.cpp
@@ -410,14 +410,27 @@ CColorManagementFeedbackSurface::CColorManagementFeedbackSurface(SP<CWpColorMana
m_currentPreferred = RESOURCE;
m_currentPreferred->m_settings = m_surface->getPreferredImageDescription();
- if (!PROTO::colorManagement->m_debug && m_currentPreferred->m_settings.icc.fd) {
+ m_currentPreferredId = m_currentPreferred->m_settings.updateId();
+
+ if (!PROTO::colorManagement->m_debug && m_currentPreferred->m_settings.icc.fd >= 0) {
LOGM(ERR, "FIXME: parse icc profile");
r->error(WP_COLOR_MANAGER_V1_ERROR_UNSUPPORTED_FEATURE, "ICC profiles are not supported");
return;
}
- RESOURCE->resource()->sendReady(m_currentPreferred->m_settings.updateId());
+ RESOURCE->resource()->sendReady(m_currentPreferredId);
});
+
+ m_listeners.enter = m_surface->m_events.enter.listen([this](const auto& monitor) { onPreferredChanged(); });
+ m_listeners.leave = m_surface->m_events.leave.listen([this](const auto& monitor) { onPreferredChanged(); });
+}
+
+void CColorManagementFeedbackSurface::onPreferredChanged() {
+ if (m_surface->m_enteredOutputs.size() == 1) {
+ const auto newId = m_surface->getPreferredImageDescription().updateId();
+ if (m_currentPreferredId != newId)
+ m_resource->sendPreferredChanged(newId);
+ }
}
bool CColorManagementFeedbackSurface::good() {
@@ -796,6 +809,9 @@ void CColorManagementProtocol::onMonitorImageDescriptionChanged(WP<CMonitor> mon
if (output->m_monitor == monitor)
output->m_resource->sendImageDescriptionChanged();
}
+ // recheck feedbacks
+ for (auto const& feedback : m_feedbackSurfaces)
+ feedback->onPreferredChanged();
}
void CColorManagementProtocol::destroyResource(CColorManager* resource) {