diff options
| author | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2025-07-20 19:42:40 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-20 19:42:40 +0200 |
| commit | 462729d8655a3a37ba19fe254d8ecb6677963563 (patch) | |
| tree | 319506e6ec363a4da035107597fb571b7498a49b /src/protocols/core/Compositor.cpp | |
| parent | bf1602d9f902410500dcfa8f5a38f716574c1f39 (diff) | |
protocols/subcompositor: fix subsurface sorting (#11136)
Diffstat (limited to 'src/protocols/core/Compositor.cpp')
| -rw-r--r-- | src/protocols/core/Compositor.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/protocols/core/Compositor.cpp b/src/protocols/core/Compositor.cpp index 5efe020c..10b554f6 100644 --- a/src/protocols/core/Compositor.cpp +++ b/src/protocols/core/Compositor.cpp @@ -555,6 +555,30 @@ SImageDescription CWLSurfaceResource::getPreferredImageDescription() { return monitor ? monitor->m_imageDescription : g_pCompositor->getPreferredImageDescription(); } +void CWLSurfaceResource::sortSubsurfaces() { + std::ranges::sort(m_subsurfaces, [](const auto& a, const auto& b) { return a->m_zIndex < b->m_zIndex; }); + + // find the first non-negative index. We will preserve negativity: e.g. -2, -1, 1, 2 + int firstNonNegative = -1; + for (size_t i = 0; i < m_subsurfaces.size(); ++i) { + if (m_subsurfaces.at(i)->m_zIndex >= 0) { + firstNonNegative = i; + break; + } + } + + if (firstNonNegative == -1) + firstNonNegative = m_subsurfaces.size(); + + for (size_t i = firstNonNegative; i < m_subsurfaces.size(); ++i) { + m_subsurfaces.at(i)->m_zIndex = i - firstNonNegative; + } + + for (int i = 0; i < firstNonNegative; ++i) { + m_subsurfaces.at(i)->m_zIndex = -firstNonNegative + i; + } +} + void CWLSurfaceResource::updateCursorShm(CRegion damage) { if (damage.empty()) return; |
