From 436635386d77ea7cb51965c9888263d602b2a404 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Thu, 4 Jan 2024 16:28:15 -0800 Subject: [PATCH] Get compiling --- packages/desktop/src/app.rs | 37 +++++++++++++------------ packages/desktop/src/desktop_context.rs | 3 +- packages/desktop/src/protocol.rs | 10 +++---- packages/desktop/src/webview.rs | 16 +++++++---- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/packages/desktop/src/app.rs b/packages/desktop/src/app.rs index f88970f03..15abc0d24 100644 --- a/packages/desktop/src/app.rs +++ b/packages/desktop/src/app.rs @@ -4,26 +4,26 @@ pub use crate::desktop_context::{ use_window, use_wry_event_handler, window, DesktopService, WryEventHandler, WryEventHandlerId, }; use crate::desktop_context::{EventData, UserWindowEvent, WebviewQueue, WindowEventHandlers}; +use crate::element::DesktopElement; +use crate::eval::init_eval; use crate::events::{IpcMessage, KnownIpcMethod}; use crate::file_upload; +pub use crate::protocol::{ + use_asset_handler, AssetFuture, AssetHandler, AssetRequest, AssetResponse, +}; use crate::query::QueryResult; use crate::shortcut::GlobalHotKeyEvent; +use crate::shortcut::ShortcutRegistry; +pub use crate::shortcut::{use_global_shortcut, ShortcutHandle, ShortcutId, ShortcutRegistryError}; use dioxus_core::*; use dioxus_html::{event_bubbles, MountedData}; use dioxus_html::{native_bind::NativeFileEngine, FormData, HtmlEvent}; +use dioxus_interpreter_js::binary_protocol::Channel; +use futures_util::{pin_mut, FutureExt}; use global_hotkey::{ hotkey::{Code, HotKey, Modifiers}, GlobalHotKeyManager, }; -// use dioxus_interpreter_js::binary_protocol::Channel; -use crate::element::DesktopElement; -use crate::eval::init_eval; -pub use crate::protocol::{ - use_asset_handler, AssetFuture, AssetHandler, AssetRequest, AssetResponse, -}; -use crate::shortcut::ShortcutRegistry; -pub use crate::shortcut::{use_global_shortcut, ShortcutHandle, ShortcutId, ShortcutRegistryError}; -use futures_util::{pin_mut, FutureExt}; use rustc_hash::FxHashMap; use std::rc::Rc; use std::sync::atomic::AtomicU16; @@ -61,7 +61,7 @@ pub struct App

{ pub(crate) is_visible_before_start: bool, } -impl

App

{ +impl App

{ pub fn new(cfg: Config, props: P, root: Component

) -> (EventLoop, Self) { let event_loop = EventLoopBuilder::::with_user_event().build(); @@ -279,9 +279,12 @@ impl

App

{ dioxus_hot_reload::HotReloadMsg::UpdateTemplate(template) => { for webview in self.webviews.values_mut() { webview.dom.replace_template(template); + } - // poll_vdom(webview); - todo!() + let ids = self.webviews.keys().copied().collect::>(); + + for id in ids { + self.poll_vdom(id); } } dioxus_hot_reload::HotReloadMsg::Shutdown => { @@ -290,7 +293,7 @@ impl

App

{ } } - pub fn handle_file_dialog_msg(&self, msg: IpcMessage, window: WindowId) { + pub fn handle_file_dialog_msg(&mut self, msg: IpcMessage, window: WindowId) { if let Ok(file_diolog) = serde_json::from_value::(msg.params()) { @@ -385,9 +388,9 @@ pub fn create_new_window( } pub struct WebviewHandler { - dom: VirtualDom, - desktop_context: DesktopContext, - waker: Waker, + pub dom: VirtualDom, + pub desktop_context: DesktopContext, + pub waker: Waker, // Wry assumes the webcontext is alive for the lifetime of the webview. // We need to keep the webcontext alive, otherwise the webview will crash @@ -408,8 +411,6 @@ pub fn send_edits(edits: Mutations, desktop_context: &DesktopContext) { } } -pub struct Channel {} - pub fn apply_edits( mutations: Mutations, channel: &mut Channel, diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 763c00c39..0ed40d707 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -98,6 +98,7 @@ pub struct DesktopService { /// The wry/tao proxy to the current window pub webview: WebView, + /// The tao window itself pub window: Window, /// The proxy to the event loop @@ -176,7 +177,7 @@ impl DesktopService { /// /// 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( + let window = crate::app::create_new_window( cfg, &self.event_loop, &self.proxy, diff --git a/packages/desktop/src/protocol.rs b/packages/desktop/src/protocol.rs index 36400ce95..6e28ca67c 100644 --- a/packages/desktop/src/protocol.rs +++ b/packages/desktop/src/protocol.rs @@ -197,7 +197,7 @@ pub fn use_asset_handler( handler: impl AssetHandler, ) -> &AssetHandlerHandle { cx.use_hook(|| { - let desktop = window(); + let desktop = crate::window(); let handler_id = Rc::new(OnceCell::new()); let handler_id_ref = Rc::clone(&handler_id); let desktop_ref = Rc::clone(&desktop); @@ -220,7 +220,7 @@ pub(super) async fn desktop_handler( asset_handlers: &AssetHandlerRegistry, edit_queue: &EditQueue, headless: bool, - responder: wry::webview::RequestAsyncResponder, + responder: wry::RequestAsyncResponder, ) { let request = AssetRequest::from(request); @@ -259,7 +259,7 @@ pub(super) async fn desktop_handler( .body(Cow::from(body)) { Ok(response) => { - return Ok(response); + return responder.respond(response); } Err(err) => tracing::error!("error building response: {}", err), } @@ -305,9 +305,7 @@ pub(super) async fn desktop_handler( .header("Content-Type", content_type) .body(Cow::from(asset)) { - Ok(response) => { - return response; - } + Ok(response) => return responder.respond(response), Err(err) => tracing::error!("error building response: {}", err), } } diff --git a/packages/desktop/src/webview.rs b/packages/desktop/src/webview.rs index d98e60099..229fc3b9b 100644 --- a/packages/desktop/src/webview.rs +++ b/packages/desktop/src/webview.rs @@ -12,17 +12,21 @@ pub(crate) fn build( event_loop: &EventLoopWindowTarget, proxy: EventLoopProxy, ) -> (WebView, WebContext, AssetHandlerRegistry, EditQueue, Window) { - let builder = cfg.window.clone(); + let mut builder = cfg.window.clone(); + + // TODO: restore the menu bar with muda: https://github.com/tauri-apps/muda/blob/dev/examples/wry.rs + if cfg.enable_default_menu_bar { + // builder = builder.with_menu(build_default_menu_bar()); + } + + let window = builder.build(event_loop).unwrap(); + + let window_id = window.id(); let file_handler = cfg.file_drop_handler.take(); let custom_head = cfg.custom_head.clone(); let index_file = cfg.custom_index.clone(); let root_name = cfg.root_name.clone(); - // TODO: restore the menu bar with muda: https://github.com/tauri-apps/muda/blob/dev/examples/wry.rs - // if cfg.enable_default_menu_bar { - // builder = builder.with_menu(build_default_menu_bar()); - // } - // We assume that if the icon is None in cfg, then the user just didnt set it if cfg.window.window.window_icon.is_none() { window.set_window_icon(Some(