summaryrefslogtreecommitdiff
path: root/src/protocols/core/Subcompositor.cpp
diff options
context:
space:
mode:
authorPppp1116 <pcaiadoguerreiro@gmail.com>2026-04-03 13:24:08 +0100
committerVaxry <43317083+vaxerski@users.noreply.github.com>2026-04-04 08:26:24 -0400
commit4c897c2d476d42c716dee254d151ff23c66ef53b (patch)
tree109be08644c1250ae36549a0c614ba24d0ef63d1 /src/protocols/core/Subcompositor.cpp
parentf25473b21b45ab8ded4a0dbba69eb6b6660d568e (diff)
protocols: prune stale subsurface refs in hot traversals
Diffstat (limited to 'src/protocols/core/Subcompositor.cpp')
-rw-r--r--src/protocols/core/Subcompositor.cpp11
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();