From 5d86c93770924c6a7ea09cb1f69c23be3f3822c8 Mon Sep 17 00:00:00 2001 From: Thomas Brand Date: Sat, 4 Jul 2026 04:53:29 +0200 Subject: [PATCH] Mac: puglUnrealize(): release more, especially window delegate Also: call puglUnrealize() from puglFreeViewInternals() to trigger unrealize event. This is analog to the X11 implementation. Remove code in puglFreeViewInternals() as consequence of added call to puglUnrealize(). Leak test example: leaks --atExit -- ./pugl_cursor_demo.app/MacOS/pugl_cursor_demo --- src/mac.m | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/mac.m b/src/mac.m index c2551cfe..3229bbc8 100644 --- a/src/mac.m +++ b/src/mac.m @@ -1445,6 +1445,10 @@ - (void)windowDidExitFullScreen:(NSNotification*)notification PuglStatus puglUnrealize(PuglView* const view) { + if (!view) { + return PUGL_FAILURE; + } + PuglInternals* const impl = view->impl; if (!impl || !impl->wrapperView) { return PUGL_FAILURE; @@ -1457,6 +1461,19 @@ - (void)windowDidExitFullScreen:(NSNotification*)notification } if (impl->wrapperView) { + if (impl->wrapperView->trackingArea != nil) { + [impl->wrapperView removeTrackingArea:impl->wrapperView->trackingArea]; + [impl->wrapperView->trackingArea release]; + } + + if(impl->wrapperView->userTimers != nil) { + [impl->wrapperView->userTimers release]; + } + + if(impl->wrapperView->markedText != nil) { + [impl->wrapperView->markedText release]; + } + [impl->wrapperView removeFromSuperview]; } @@ -1470,6 +1487,10 @@ - (void)windowDidExitFullScreen:(NSNotification*)notification } if (impl->window) { + if(((NSWindow*)impl->window).delegate != nil) + { + [((NSWindow*)impl->window).delegate release]; + } [impl->window release]; impl->window = NULL; } @@ -1518,28 +1539,9 @@ - (void)windowDidExitFullScreen:(NSNotification*)notification puglFreeViewInternals(PuglView* view) { if (view) { - if (view->backend) { - view->backend->destroy(view); - } + puglUnrealize(view); if (view->impl) { - if (view->impl->wrapperView) { - [view->impl->wrapperView removeFromSuperview]; - view->impl->wrapperView->puglview = NULL; - } - - if (view->impl->window) { - [view->impl->window close]; - } - - if (view->impl->wrapperView) { - [view->impl->wrapperView release]; - } - - if (view->impl->window) { - [view->impl->window release]; - } - free(view->impl); } }