Browse Source

new window returns desktop context

Andrew Collins 2 years ago
parent
commit
a5c46b0e5c
2 changed files with 21 additions and 18 deletions
  1. 3 6
      packages/desktop/src/desktop_context.rs
  2. 18 12
      packages/desktop/src/lib.rs

+ 3 - 6
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<WebView> {
-        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

+ 18 - 12
packages/desktop/src/lib.rs

@@ -144,8 +144,7 @@ pub fn launch_with_props<P: 'static>(root: Component<P>, 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<P: 'static>(root: Component<P>, 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 {