From a5c46b0e5ce6acd2594f93bde35a5c486f35a828 Mon Sep 17 00:00:00 2001 From: Andrew Collins <50530928+ProfXwing@users.noreply.github.com> Date: Sat, 8 Apr 2023 11:23:48 -0400 Subject: [PATCH] new window returns desktop context --- packages/desktop/src/desktop_context.rs | 9 +++----- packages/desktop/src/lib.rs | 30 +++++++++++++++---------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 2ed4bbee9..03166d272 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -1,6 +1,5 @@ use std::cell::RefCell; use std::rc::Rc; -use std::rc::Weak; use crate::create_new_window; use crate::eval::EvalResult; @@ -112,8 +111,8 @@ impl DesktopContext { /// You can use this to control other windows from the current window. /// /// Be careful to not create a cycle of windows, or you might leak memory. - pub fn new_window(&self, dom: VirtualDom, cfg: Config) -> Weak { - let window = create_new_window( + pub fn new_window(&self, dom: VirtualDom, cfg: Config) -> DesktopContext { + let (window, desktop_context) = create_new_window( cfg, &self.event_loop, &self.proxy, @@ -133,11 +132,9 @@ impl DesktopContext { .send_event(UserWindowEvent(EventData::Poll, id)) .unwrap(); - let webview = window.webview.clone(); - self.pending_windows.borrow_mut().push(window); - Rc::downgrade(&webview) + desktop_context } /// trigger the drag-window event diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 75c67dd22..0a9a8558c 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -144,8 +144,7 @@ pub fn launch_with_props(root: Component

, props: P, cfg: Config) let shortcut_manager = ShortcutRegistry::new(&event_loop); - // By default, we'll create a new window when the app starts - queue.borrow_mut().push(create_new_window( + let (web_view, _) = create_new_window( cfg, &event_loop, &proxy, @@ -153,7 +152,10 @@ pub fn launch_with_props(root: Component

, props: P, cfg: Config) &queue, &event_handlers, shortcut_manager.clone(), - )); + ); + + // By default, we'll create a new window when the app starts + queue.borrow_mut().push(web_view); event_loop.run(move |window_event, event_loop, control_flow| { *control_flow = ControlFlow::Wait; @@ -280,26 +282,30 @@ fn create_new_window( queue: &WebviewQueue, event_handlers: &WindowEventHandlers, shortcut_manager: ShortcutRegistry, -) -> WebviewHandler { +) -> (WebviewHandler, DesktopContext) { let webview = webview::build(&mut cfg, event_loop, proxy.clone()); - - dom.base_scope().provide_context(DesktopContext::new( + let desktop_context = DesktopContext::new( webview.clone(), proxy.clone(), event_loop.clone(), queue.clone(), event_handlers.clone(), shortcut_manager, - )); + ); + + dom.base_scope().provide_context(desktop_context.clone()); let id = webview.window().id(); // We want to poll the virtualdom and the event loop at the same time, so the waker will be connected to both - WebviewHandler { - webview, - dom, - waker: waker::tao_waker(proxy, id), - } + ( + WebviewHandler { + webview, + dom, + waker: waker::tao_waker(proxy, id), + }, + desktop_context, + ) } struct WebviewHandler {