diff options
| author | Pppp1116 <pcaiadoguerreiro@gmail.com> | 2026-04-03 13:24:08 +0100 |
|---|---|---|
| committer | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2026-04-04 08:26:24 -0400 |
| commit | 4c897c2d476d42c716dee254d151ff23c66ef53b (patch) | |
| tree | 109be08644c1250ae36549a0c614ba24d0ef63d1 /src/protocols/core/Subcompositor.cpp | |
| parent | f25473b21b45ab8ded4a0dbba69eb6b6660d568e (diff) | |
protocols: prune stale subsurface refs in hot traversals
Diffstat (limited to 'src/protocols/core/Subcompositor.cpp')
| -rw-r--r-- | src/protocols/core/Subcompositor.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/protocols/core/Subcompositor.cpp b/src/protocols/core/Subcompositor.cpp index 14dc4666..d8a3e860 100644 --- a/src/protocols/core/Subcompositor.cpp +++ b/src/protocols/core/Subcompositor.cpp @@ -91,12 +91,15 @@ CWLSubsurfaceResource::CWLSubsurfaceResource(SP<CWlSubsurface> resource_, SP<CWL } CWLSubsurfaceResource::~CWLSubsurfaceResource() { + unlinkFromParent(); m_events.destroy.emit(); if (m_surface) m_surface->resetRole(); } void CWLSubsurfaceResource::destroy() { + unlinkFromParent(); + if (m_surface && m_surface->m_mapped) { m_surface->m_events.unmap.emit(); m_surface->unmap(); @@ -105,6 +108,14 @@ void CWLSubsurfaceResource::destroy() { PROTO::subcompositor->destroyResource(this); } +void CWLSubsurfaceResource::unlinkFromParent() { + const auto PARENT = m_parent.lock(); + if (!PARENT) + return; + + std::erase_if(PARENT->m_subsurfaces, [this](const auto& subsurface) { return !subsurface || subsurface.get() == this; }); +} + Vector2D CWLSubsurfaceResource::posRelativeToParent() { Vector2D pos = m_position; SP<CWLSurfaceResource> surf = m_parent.lock(); |
