aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-18 17:47:56 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-18 17:47:56 +0800
commit29e60dab0d42552e78bcfddcbed3a2d52c45dbd9 (patch)
treefcc4337a543b09bb6db7e9feca3869fcba1c7715 /src/platform/gui
parent04d243699cbde40fe69472f4c4df38c36f7942ef (diff)
downloadcru-29e60dab0d42552e78bcfddcbed3a2d52c45dbd9.tar.gz
cru-29e60dab0d42552e78bcfddcbed3a2d52c45dbd9.tar.bz2
cru-29e60dab0d42552e78bcfddcbed3a2d52c45dbd9.zip
Impl DeleteLater on OsxUiApplication.
Diffstat (limited to 'src/platform/gui')
-rw-r--r--src/platform/gui/osx/UiApplication.mm27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/platform/gui/osx/UiApplication.mm b/src/platform/gui/osx/UiApplication.mm
index 19fcdc87..3da9478c 100644
--- a/src/platform/gui/osx/UiApplication.mm
+++ b/src/platform/gui/osx/UiApplication.mm
@@ -1,9 +1,10 @@
#include "cru/platform/gui/osx/UiApplication.h"
#include "ClipboardPrivate.h"
-#include "cru/base/platform/osx/Base.h"
#include "cru/base/log/Logger.h"
+#include "cru/base/platform/osx/Base.h"
#include "cru/platform/graphics/quartz/Factory.h"
+#include "cru/platform/gui/UiApplication.h"
#include "cru/platform/gui/osx/Clipboard.h"
#include "cru/platform/gui/osx/Cursor.h"
#include "cru/platform/gui/osx/Menu.h"
@@ -36,12 +37,7 @@ class OsxUiApplicationPrivate {
app_delegate_ = [[CruAppDelegate alloc] init:this];
}
- CRU_DELETE_COPY(OsxUiApplicationPrivate)
- CRU_DELETE_MOVE(OsxUiApplicationPrivate)
-
- ~OsxUiApplicationPrivate() = default;
-
- void CallQuitHandlers();
+ void OnQuit();
private:
OsxUiApplication* osx_ui_application_;
@@ -53,6 +49,9 @@ class OsxUiApplicationPrivate {
std::unordered_map<long long, std::function<void()>> next_tick_;
std::unordered_map<long long, NSTimer*> timers_;
+ DeleteLaterPool delete_later_pool_;
+ TimerAutoCanceler delete_later_schedule_canceler_;
+
std::vector<OsxWindow*> windows_;
std::unique_ptr<OsxCursorManager> cursor_manager_;
@@ -62,7 +61,8 @@ class OsxUiApplicationPrivate {
std::unique_ptr<platform::graphics::quartz::QuartzGraphicsFactory> quartz_graphics_factory_;
};
-void OsxUiApplicationPrivate::CallQuitHandlers() {
+void OsxUiApplicationPrivate::OnQuit() {
+ delete_later_pool_.Clean();
for (const auto& handler : quit_handlers_) {
handler();
}
@@ -150,6 +150,12 @@ void OsxUiApplication::CancelTimer(long long id) {
}
}
+void OsxUiApplication::DeleteLater(Object* object) {
+ p_->delete_later_pool_.Add(object);
+ p_->delete_later_schedule_canceler_.Reset(
+ SetImmediate([this] { p_->delete_later_pool_.Clean(); }));
+}
+
std::vector<INativeWindow*> OsxUiApplication::GetAllWindow() {
std::vector<INativeWindow*> result;
std::transform(p_->windows_.cbegin(), p_->windows_.cend(), std::back_inserter(result),
@@ -197,7 +203,8 @@ std::optional<std::string> OsxUiApplication::ShowSaveDialog(SaveDialogOptions op
}
}
-std::optional<std::vector<std::string>> OsxUiApplication::ShowOpenDialog(OpenDialogOptions options) {
+std::optional<std::vector<std::string>> OsxUiApplication::ShowOpenDialog(
+ OpenDialogOptions options) {
NSOpenPanel* panel = [NSOpenPanel openPanel];
[panel setTitle:(NSString*)ToCFString(options.title).ref];
[panel setPrompt:(NSString*)ToCFString(options.prompt).ref];
@@ -248,6 +255,6 @@ void OsxUiApplication::UnregisterWindow(OsxWindow* window) {
return NSApplicationTerminateReply::NSTerminateNow;
}
- (void)applicationWillTerminate:(NSNotification*)notification {
- _p->CallQuitHandlers();
+ _p->OnQuit();
}
@end