aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-18 17:31:23 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-18 17:31:23 +0800
commit04d243699cbde40fe69472f4c4df38c36f7942ef (patch)
treeaf2a2031ab7f2d9ce03cf677eba066e11f32a0c9 /src/platform/gui
parent358dc1498623d53f1d8bedf5172743deb6c03811 (diff)
downloadcru-04d243699cbde40fe69472f4c4df38c36f7942ef.tar.gz
cru-04d243699cbde40fe69472f4c4df38c36f7942ef.tar.bz2
cru-04d243699cbde40fe69472f4c4df38c36f7942ef.zip
Move delete later to platform::gui.
Diffstat (limited to 'src/platform/gui')
-rw-r--r--src/platform/gui/UiApplication.cpp18
-rw-r--r--src/platform/gui/win/UiApplication.cpp6
2 files changed, 22 insertions, 2 deletions
diff --git a/src/platform/gui/UiApplication.cpp b/src/platform/gui/UiApplication.cpp
index f035224f..56570125 100644
--- a/src/platform/gui/UiApplication.cpp
+++ b/src/platform/gui/UiApplication.cpp
@@ -1,9 +1,23 @@
#include "cru/platform/gui/UiApplication.h"
-
#include "cru/base/Base.h"
+#include <unordered_set>
+
namespace cru::platform::gui {
+void DeleteLaterPool::Add(Object* object) { pool_.push_back(object); }
+
+void DeleteLaterPool::Clean() {
+ std::unordered_set<Object*> deleted;
+ for (auto object : pool_) {
+ if (!deleted.contains(object)) {
+ deleted.insert(object);
+ delete object;
+ }
+ }
+ pool_.clear();
+}
+
namespace {
IUiApplication* instance = nullptr;
}
@@ -12,7 +26,7 @@ IUiApplication* IUiApplication::GetInstance() { return instance; }
IUiApplication::IUiApplication() {
if (instance) {
- throw std::runtime_error("An ui application has already been created.");
+ throw Exception("A ui application has already been created.");
}
instance = this;
diff --git a/src/platform/gui/win/UiApplication.cpp b/src/platform/gui/win/UiApplication.cpp
index eb85ef90..e1c21d59 100644
--- a/src/platform/gui/win/UiApplication.cpp
+++ b/src/platform/gui/win/UiApplication.cpp
@@ -71,6 +71,8 @@ int WinUiApplication::Run() {
break;
}
}
+
+ delete_later_pool_.Clean();
}
for (const auto& handler : quit_handlers_) handler();
@@ -103,6 +105,10 @@ long long WinUiApplication::SetInterval(std::chrono::milliseconds milliseconds,
void WinUiApplication::CancelTimer(long long id) { timers_.Remove(id); }
+void WinUiApplication::DeleteLater(Object* object) {
+ delete_later_pool_.Add(object);
+}
+
std::vector<INativeWindow*> WinUiApplication::GetAllWindow() {
std::vector<INativeWindow*> result;
for (const auto w : windows_) {