From d2ff37dc255fd9c8bb1c30e3f2dd555f0ca58596 Mon Sep 17 00:00:00 2001 From: Jason Tsai Date: Thu, 11 Jul 2024 11:34:26 +0800 Subject: [PATCH] refactor(macos): migrate WryWebViewParent to objc2 --- src/wkwebview/mod.rs | 63 +++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/src/wkwebview/mod.rs b/src/wkwebview/mod.rs index 4247a22f2d..4553df2e42 100644 --- a/src/wkwebview/mod.rs +++ b/src/wkwebview/mod.rs @@ -764,27 +764,7 @@ r#"Object.defineProperty(window, 'ipc', { if is_child { ns_view.addSubview(&webview); } else { - let parent_view_cls = match ClassBuilder::new("WryWebViewParent", NSView::class()) { - Some(mut decl) => { - decl.add_method(objc2::sel!(keyDown:), key_down as extern "C" fn(_, _, _)); - - extern "C" fn key_down(_this: &NSView, _sel: objc2::runtime::Sel, event: &NSEvent) { - unsafe { - let mtm = MainThreadMarker::new().unwrap(); - let app = NSApp(mtm); - if let Some(menu) = app.mainMenu() { - menu.performKeyEquivalent(event); - } - } - } - - decl.register() - } - None => class!(NSView), - }; - - let parent_view: Allocated = objc2::msg_send_id![parent_view_cls, alloc]; - let parent_view = NSView::init(parent_view); + let parent_view = WryWebViewParent::new(mtm); parent_view.setAutoresizingMask( NSAutoresizingMaskOptions::NSViewHeightSizable | NSAutoresizingMaskOptions::NSViewWidthSizable, @@ -1741,3 +1721,44 @@ impl WryWebViewUIDelegate { unsafe { msg_send_id![super(delegate), init] } } } + +struct WryWebViewParentIvars {} + +declare_class!( + struct WryWebViewParent; + + unsafe impl ClassType for WryWebViewParent { + type Super = NSView; + type Mutability = MainThreadOnly; + const NAME: &'static str = "WryWebViewParent"; + } + + impl DeclaredClass for WryWebViewParent { + type Ivars = WryWebViewParentIvars; + } + + unsafe impl WryWebViewParent { + #[method(keyDown:)] + fn key_down( + &self, + event: &NSEvent, + ) { + let mtm = MainThreadMarker::new().unwrap(); + let app = NSApp(mtm); + unsafe { + if let Some(menu) = app.mainMenu() { + menu.performKeyEquivalent(event); + } + } + } + } +); + +impl WryWebViewParent { + fn new(mtm: MainThreadMarker) -> Retained { + let delegate = mtm + .alloc::() + .set_ivars(WryWebViewParentIvars {}); + unsafe { msg_send_id![super(delegate), init] } + } +}