review pass 4

This commit is contained in:
Will Temple
2026-05-16 15:23:43 -04:00
parent 056f356065
commit d9ac6bfeb8

View File

@@ -201,12 +201,13 @@ impl Drop for ObjcStrong {
} }
struct NativeWindow { struct NativeWindow {
window: ObjcStrong, // Renderer/surface must drop before the AppKit objects whose raw handles it
#[allow(dead_code)] // was created from.
view: *mut AnyObject,
delegate: Option<ObjcStrong>,
_metal_layer: Retained<CAMetalLayer>,
renderer: Option<WgpuSceneRenderer>, renderer: Option<WgpuSceneRenderer>,
_metal_layer: Retained<CAMetalLayer>,
view: ObjcStrong,
delegate: Option<ObjcStrong>,
window: ObjcStrong,
} }
impl NativeWindow { impl NativeWindow {
@@ -219,7 +220,7 @@ impl NativeWindow {
} }
fn view_object(&self) -> *mut AnyObject { fn view_object(&self) -> *mut AnyObject {
self.view self.view.as_ptr()
} }
fn set_title(&self, title: &str) { fn set_title(&self, title: &str) {
@@ -256,12 +257,12 @@ impl NativeWindow {
} }
fn in_live_resize(&self) -> bool { fn in_live_resize(&self) -> bool {
unsafe { objc2::msg_send![self.view, inLiveResize] } unsafe { objc2::msg_send![self.view_object(), inLiveResize] }
} }
fn display_if_needed(&self) { fn display_if_needed(&self) {
unsafe { unsafe {
let _: () = objc2::msg_send![self.view, displayIfNeeded]; let _: () = objc2::msg_send![self.view_object(), displayIfNeeded];
let _: () = objc2::msg_send![self.window_object(), displayIfNeeded]; let _: () = objc2::msg_send![self.window_object(), displayIfNeeded];
} }
} }
@@ -1172,10 +1173,10 @@ fn drain_platform_commands(state: &Rc<RefCell<MacosState>>) -> bool {
unsafe { unsafe {
let _: () = objc2::msg_send![app, stop: std::ptr::null_mut::<AnyObject>()]; let _: () = objc2::msg_send![app, stop: std::ptr::null_mut::<AnyObject>()];
} }
set_command_wake_hook(None);
if let Ok(mut slot) = run_loop_wake_handle().lock() { if let Ok(mut slot) = run_loop_wake_handle().lock() {
*slot = None; *slot = None;
} }
set_command_wake_hook(None);
break; break;
} }
} }
@@ -1588,7 +1589,7 @@ fn create_native_window(window: &MacosWindow, app: *mut AnyObject) -> Option<Nat
let view_class = content_view_class(); let view_class = content_view_class();
let view_obj: *mut AnyObject = unsafe { objc2::msg_send![view_class, alloc] }; let view_obj: *mut AnyObject = unsafe { objc2::msg_send![view_class, alloc] };
let view_obj: *mut AnyObject = unsafe { objc2::msg_send![view_obj, initWithFrame: rect] }; let view_obj: *mut AnyObject = unsafe { objc2::msg_send![view_obj, initWithFrame: rect] };
let mut view_owner = unsafe { ObjcStrong::from_owned(view_obj) }?; let view_owner = unsafe { ObjcStrong::from_owned(view_obj) }?;
let view_obj = view_owner.as_ptr(); let view_obj = view_owner.as_ptr();
let delegate_class = window_delegate_class(); let delegate_class = window_delegate_class();
let delegate_obj: *mut AnyObject = unsafe { objc2::msg_send![delegate_class, new] }; let delegate_obj: *mut AnyObject = unsafe { objc2::msg_send![delegate_class, new] };
@@ -1609,10 +1610,6 @@ fn create_native_window(window: &MacosWindow, app: *mut AnyObject) -> Option<Nat
objc2::msg_send![window_obj, makeKeyAndOrderFront: std::ptr::null_mut::<AnyObject>()]; objc2::msg_send![window_obj, makeKeyAndOrderFront: std::ptr::null_mut::<AnyObject>()];
let _: () = objc2::msg_send![app, activateIgnoringOtherApps: true]; let _: () = objc2::msg_send![app, activateIgnoringOtherApps: true];
} }
// NSWindow retains its content view. Drop our construction-time ownership so
// the window is the single owner from here.
view_owner.release_now();
let metal_layer = configure_metal_surface_layer(view_obj)?; let metal_layer = configure_metal_surface_layer(view_obj)?;
let scale_factor: f64 = unsafe { objc2::msg_send![window_obj, backingScaleFactor] }; let scale_factor: f64 = unsafe { objc2::msg_send![window_obj, backingScaleFactor] };
@@ -1630,11 +1627,11 @@ fn create_native_window(window: &MacosWindow, app: *mut AnyObject) -> Option<Nat
} }
Some(NativeWindow { Some(NativeWindow {
window: window_owner,
view: view_obj,
delegate: Some(delegate_owner),
_metal_layer: metal_layer,
renderer, renderer,
_metal_layer: metal_layer,
view: view_owner,
delegate: Some(delegate_owner),
window: window_owner,
}) })
} }