summaryrefslogtreecommitdiff
path: root/src/protocols/core/Subcompositor.cpp
diff options
context:
space:
mode:
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();