From d2eb4fee76f8e8158f34c38647ced42fbe25ef0d Mon Sep 17 00:00:00 2001 From: Tuur Vanhoutte <4633209+zjeffer@users.noreply.github.com> Date: Tue, 18 Jul 2023 12:12:05 +0200 Subject: [PATCH] Avoid connected monitor reusing unavailable ID (#2731) --- src/Compositor.cpp | 8 ++++---- src/Compositor.hpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 0929b7c1..520b4342 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1707,17 +1707,17 @@ void CCompositor::updateWindowAnimatedDecorationValues(CWindow* pWindow) { } int CCompositor::getNextAvailableMonitorID(std::string const& name) { - // reuse ID if it's already in the map - if (m_mMonitorIDMap.contains(name)) + // reuse ID if it's already in the map, and the monitor with that ID is not being used by another monitor + if (m_mMonitorIDMap.contains(name) && !std::any_of(m_vRealMonitors.begin(), m_vRealMonitors.end(), [&](auto m) { return m->ID == m_mMonitorIDMap[name]; })) return m_mMonitorIDMap[name]; // otherwise, find minimum available ID that is not in the map - std::unordered_set usedIDs; + std::unordered_set usedIDs; for (auto const& monitor : m_vRealMonitors) { usedIDs.insert(monitor->ID); } - int nextID = 0; + uint64_t nextID = 0; while (usedIDs.count(nextID) > 0) { nextID++; } diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 3f7cfac8..cfd1e3d4 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -102,7 +102,7 @@ class CCompositor { std::vector m_vWindowsFadingOut; std::vector m_vSurfacesFadingOut; - std::unordered_map m_mMonitorIDMap; + std::unordered_map m_mMonitorIDMap; void initServer(); void startCompositor();