From e1e290808a15ce3ba59607b9f1fadebd964809b5 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 15 Jan 2017 12:12:58 +0100 Subject: [PATCH] Sdk/Canvas: Fix crash at Canvas destruction --- SDK/include/NDK/BaseWidget.hpp | 1 + SDK/include/NDK/Canvas.hpp | 2 +- SDK/include/NDK/Canvas.inl | 6 ++++++ SDK/src/NDK/BaseWidget.cpp | 5 +++++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index aa47446f3..22bfa9dcf 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -89,6 +89,7 @@ namespace Ndk inline BaseWidget(); inline void DestroyChild(BaseWidget* widget); + void DestroyChildren(); inline void NotifyParentResized(const Nz::Vector2f& newSize); inline void UpdateCanvasIndex(std::size_t index); diff --git a/SDK/include/NDK/Canvas.hpp b/SDK/include/NDK/Canvas.hpp index a8da5d04e..db271051f 100644 --- a/SDK/include/NDK/Canvas.hpp +++ b/SDK/include/NDK/Canvas.hpp @@ -23,7 +23,7 @@ namespace Ndk inline Canvas(WorldHandle world, Nz::EventHandler& eventHandler); Canvas(const Canvas&) = delete; Canvas(Canvas&&) = delete; - ~Canvas() = default; + inline ~Canvas(); inline const WorldHandle& GetWorld() const; diff --git a/SDK/include/NDK/Canvas.inl b/SDK/include/NDK/Canvas.inl index d0d05bf12..173474bdf 100644 --- a/SDK/include/NDK/Canvas.inl +++ b/SDK/include/NDK/Canvas.inl @@ -22,6 +22,12 @@ namespace Ndk m_textEnteredSlot.Connect(eventHandler.OnTextEntered, this, &Canvas::OnTextEntered); } + inline Canvas::~Canvas() + { + // Destroy children explicitly because they signal us when getting destroyed, and that can't happend after our own destruction + DestroyChildren(); + } + inline const WorldHandle& Canvas::GetWorld() const { return m_world; diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index 8bcf972d3..a65a8a889 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -165,4 +165,9 @@ namespace Ndk m_children.erase(it); } + + void BaseWidget::DestroyChildren() + { + m_children.clear(); + } }