summaryrefslogtreecommitdiff
path: root/src/protocols/OutputManagement.cpp
diff options
context:
space:
mode:
authornikromen <70757578+nikromen@users.noreply.github.com>2025-11-09 00:45:53 +0100
committerGitHub <noreply@github.com>2025-11-08 23:45:53 +0000
commit06b37c390715e05f852076a8d1160e27c5cd291c (patch)
treeb6bdf21fbf5c2e59720122fe8e077c42d70fcd2f /src/protocols/OutputManagement.cpp
parent522edc87126a48f3ce4891747b6a92a22385b1e7 (diff)
protocols/outputMgmt: fix wlr-randr by defering success event until monitor reloads (#12236)
wlr-randr disconnects immediately after receiving success event, but before applying the monitor configuration. This causes the state to be lost when performMonitorReload() is called. By postponing the success event until the call of the hook monitorLayoutChanged we ensure the configuration to remain valid during the reload process.
Diffstat (limited to 'src/protocols/OutputManagement.cpp')
-rw-r--r--src/protocols/OutputManagement.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/protocols/OutputManagement.cpp b/src/protocols/OutputManagement.cpp
index 6cb2f474..6ae7c820 100644
--- a/src/protocols/OutputManagement.cpp
+++ b/src/protocols/OutputManagement.cpp
@@ -28,6 +28,8 @@ COutputManager::COutputManager(SP<CZwlrOutputManagerV1> resource_) : m_resource(
PROTO::outputManagement->m_configurations.pop_back();
return;
}
+
+ RESOURCE->m_self = RESOURCE;
});
// send all heads at start
@@ -335,7 +337,7 @@ COutputConfiguration::COutputConfiguration(SP<CZwlrOutputConfigurationV1> resour
const auto SUCCESS = applyTestConfiguration(false);
if (SUCCESS)
- m_resource->sendSucceeded();
+ PROTO::outputManagement->m_pendingConfigurationSuccessEvents.emplace_back(m_self);
else
m_resource->sendFailed();
@@ -576,7 +578,10 @@ bool COutputConfigurationHead::good() {
}
COutputManagementProtocol::COutputManagementProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) {
- static auto P = g_pHookSystem->hookDynamic("monitorLayoutChanged", [this](void* self, SCallbackInfo& info, std::any param) { this->updateAllOutputs(); });
+ static auto P = g_pHookSystem->hookDynamic("monitorLayoutChanged", [this](void* self, SCallbackInfo& info, std::any param) {
+ updateAllOutputs();
+ sendPendingSuccessEvents();
+ });
}
void COutputManagementProtocol::bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id) {
@@ -647,3 +652,19 @@ SP<SWlrManagerSavedOutputState> COutputManagementProtocol::getOutputStateFor(PHL
return nullptr;
}
+
+void COutputManagementProtocol::sendPendingSuccessEvents() {
+ if (m_pendingConfigurationSuccessEvents.empty())
+ return;
+
+ LOGM(LOG, "Sending {} pending configuration success events", m_pendingConfigurationSuccessEvents.size());
+
+ for (auto const& config : m_pendingConfigurationSuccessEvents) {
+ if (!config)
+ continue;
+
+ config->m_resource->sendSucceeded();
+ }
+
+ m_pendingConfigurationSuccessEvents.clear();
+}