diff --git a/src/platform/macos/context.rs b/src/platform/macos/context.rs index 4266a242..2f8158d7 100644 --- a/src/platform/macos/context.rs +++ b/src/platform/macos/context.rs @@ -5,7 +5,7 @@ use crate::platform::{PlatformHandle, WindowSharedState}; use crate::wrappers::appkit::{View, ViewRef}; use crate::*; use dispatch2::MainThreadBound; -use objc2::rc::Weak; +use objc2::rc::{autoreleasepool, Weak}; use objc2::runtime::NSObjectProtocol; use objc2::{MainThreadMarker, Message}; use raw_window_handle::DisplayHandle; @@ -30,7 +30,10 @@ impl WindowContext { pub fn request_close(&self) { let Some(view) = self.view.load() else { return }; let Some(view) = view.inner_ref() else { return }; - BaseviewView::close(view, false); + + autoreleasepool(|_| { + BaseviewView::close(view, false); + }); } pub fn has_focus(&self) -> bool { @@ -52,9 +55,12 @@ impl WindowContext { pub fn focus(&self) -> Result<()> { let Some(view) = self.view.load() else { return Ok(()) }; - if let Some(window) = view.window() { - window.makeFirstResponder(Some(&view)); - } + + autoreleasepool(|_| { + if let Some(window) = view.window() { + window.makeFirstResponder(Some(&view)); + } + }); Ok(()) } @@ -69,7 +75,9 @@ impl WindowContext { let size = self.state.sizing_strategy.adjust_size(size, self.size()).logical; - BaseviewView::resize(view, size, true, false); + autoreleasepool(|_| { + BaseviewView::resize(view, size, true, false); + }); Ok(()) } @@ -78,7 +86,9 @@ impl WindowContext { let Some(view) = self.view.load() else { return Ok(()) }; let Some(view) = view.inner_ref() else { return Ok(()) }; - view.inner.cursor_manager.set_cursor(cursor); + autoreleasepool(|_| { + view.inner.cursor_manager.set_cursor(cursor); + }); Ok(()) } @@ -93,7 +103,9 @@ impl WindowContext { #[cfg(feature = "opengl")] pub fn gl_context(&self) -> Option { - Some(crate::gl::GlContext::new(self.view.load()?.inner()?.gl_context.get()?.clone())) + autoreleasepool(|_| { + Some(crate::gl::GlContext::new(self.view.load()?.inner()?.gl_context.get()?.clone())) + }) } pub fn window_handle(&self) -> Option> { diff --git a/src/platform/macos/gl.rs b/src/platform/macos/gl.rs index dc8a70ad..0b00ee58 100644 --- a/src/platform/macos/gl.rs +++ b/src/platform/macos/gl.rs @@ -3,7 +3,7 @@ use crate::gl::{GlConfig, Profile}; use crate::platform::*; use crate::warn; -use objc2::rc::Retained; +use objc2::rc::{autoreleasepool, Retained}; use objc2::AllocAnyThread; use objc2::{MainThreadMarker, MainThreadOnly}; use objc2_app_kit::{ @@ -137,12 +137,16 @@ impl GlContext { } pub unsafe fn make_current(&self) -> Result<()> { - self.context.makeCurrentContext(); + autoreleasepool(|_| { + self.context.makeCurrentContext(); + }); Ok(()) } pub unsafe fn make_not_current(&self) -> Result<()> { - NSOpenGLContext::clearCurrentContext(); + autoreleasepool(|_| { + NSOpenGLContext::clearCurrentContext(); + }); Ok(()) } @@ -166,18 +170,22 @@ impl GlContext { return core::ptr::null(); }; - self.gl_bundle.function_pointer_for_name(Some(&symbol_name)) + autoreleasepool(|_| self.gl_bundle.function_pointer_for_name(Some(&symbol_name))) } pub fn swap_buffers(&self) -> Result<()> { - self.context.flushBuffer(); - self.view.setNeedsDisplay(true); + autoreleasepool(|_| { + self.context.flushBuffer(); + self.view.setNeedsDisplay(true); + }); Ok(()) } /// On macOS the `NSOpenGLView` needs to be resized separtely from our main view. pub(crate) fn resize(&self, size: NSSize) { - self.view.setFrameSize(size); - self.view.setNeedsDisplay(true); + autoreleasepool(|_| { + self.view.setFrameSize(size); + self.view.setNeedsDisplay(true); + }); } } diff --git a/src/platform/macos/window.rs b/src/platform/macos/window.rs index dcb09bf8..a6c555a9 100644 --- a/src/platform/macos/window.rs +++ b/src/platform/macos/window.rs @@ -50,7 +50,7 @@ impl WindowHandle { }) } - pub fn create_window_parented( + fn create_window_parented( init: WindowInitializer, parent_view: Retained, mtm: MainThreadMarker, ) -> Result { let parenting = @@ -85,14 +85,16 @@ impl WindowHandle { let Some(view) = self.view.load() else { return Ok(()) }; let Some(view) = view.inner_ref() else { return Ok(()) }; - BaseviewView::show(view); + autoreleasepool(|_| { + BaseviewView::show(view); - let app = NSApplication::sharedApplication(self.mtm); - app.setActivationPolicy(NSApplicationActivationPolicy::Regular); + let app = NSApplication::sharedApplication(self.mtm); + app.setActivationPolicy(NSApplicationActivationPolicy::Regular); - view.lifetime_tied_to_app.set(Some(Weak::from_retained(&app))); - app.run(); - view.lifetime_tied_to_app.set(None); + view.lifetime_tied_to_app.set(Some(Weak::from_retained(&app))); + app.run(); + view.lifetime_tied_to_app.set(None); + }); Ok(()) } @@ -126,7 +128,9 @@ impl WindowHandle { let Some(view) = self.view.load() else { return Ok(()) }; let Some(view) = view.inner_ref() else { return Ok(()) }; - BaseviewView::resize(view, size.to_logical(self.state.scale_factor.get()), false, false); + autoreleasepool(|_| { + BaseviewView::resize(view, size.to_logical(self.state.scale_factor.get()), false, false) + }); Ok(()) } @@ -140,7 +144,9 @@ impl WindowHandle { let Some(view) = self.view.load() else { return Ok(()) }; let Some(view) = view.inner_ref() else { return Ok(()) }; - BaseviewView::set_parent(view, new_parent.view.into_inner(view.mtm)); + autoreleasepool(|_| { + BaseviewView::set_parent(view, new_parent.view.into_inner(view.mtm)); + }); Ok(()) } @@ -149,7 +155,9 @@ impl WindowHandle { let Some(view) = self.view.load() else { return Ok(()) }; let Some(view) = view.inner_ref() else { return Ok(()) }; - BaseviewView::show(view); + autoreleasepool(|_| { + BaseviewView::show(view); + }); Ok(()) } @@ -157,7 +165,9 @@ impl WindowHandle { let Some(view) = self.view.load() else { return Ok(()) }; let Some(view) = view.inner_ref() else { return Ok(()) }; - BaseviewView::hide(view); + autoreleasepool(|_| { + BaseviewView::hide(view); + }); Ok(()) }