new window returns desktop context

This commit is contained in:
Andrew Collins 2023-04-08 11:23:48 -04:00
parent 61d100e1f8
commit a5c46b0e5c
2 changed files with 21 additions and 18 deletions

View file

@ -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

View file

@ -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 {