瀏覽代碼

More cleaning up of the desktop crate

Jonathan Kelley 1 年之前
父節點
當前提交
d47e494786
共有 4 個文件被更改,包括 39 次插入50 次删除
  1. 5 6
      packages/desktop/src/app.rs
  2. 15 1
      packages/desktop/src/desktop_context.rs
  3. 14 40
      packages/desktop/src/edits.rs
  4. 5 3
      packages/desktop/src/menubar.rs

+ 5 - 6
packages/desktop/src/app.rs

@@ -2,7 +2,7 @@ pub use crate::assets::{AssetFuture, AssetHandler, AssetRequest, AssetResponse};
 pub use crate::cfg::{Config, WindowCloseBehaviour};
 pub use crate::desktop_context::DesktopContext;
 pub use crate::desktop_context::{window, DesktopService, WryEventHandler, WryEventHandlerId};
-use crate::edits::{send_edits, EditQueue, WebviewQueue};
+use crate::edits::{EditQueue, WebviewQueue};
 use crate::element::DesktopElement;
 use crate::eval::init_eval;
 use crate::events::{IpcMessage, IpcMethod};
@@ -198,7 +198,7 @@ impl<P: 'static> App<P> {
 
     pub fn handle_initialize_msg(&mut self, id: WindowId) {
         let view = self.webviews.get_mut(&id).unwrap();
-        send_edits(view.dom.rebuild(), &view.desktop_context);
+        view.desktop_context.send_edits(view.dom.rebuild());
         view.desktop_context
             .window
             .set_visible(self.is_visible_before_start);
@@ -271,8 +271,7 @@ impl<P: 'static> App<P> {
         };
 
         view.dom.handle_event(&name, as_any, element, bubbles);
-
-        send_edits(view.dom.render_immediate(), &view.desktop_context);
+        view.desktop_context.send_edits(view.dom.render_immediate());
     }
 
     #[cfg(all(feature = "hot-reload", debug_assertions))]
@@ -319,7 +318,7 @@ impl<P: 'static> App<P> {
                 view.dom.handle_event(event_name, data, id, event_bubbles);
             }
 
-            send_edits(view.dom.render_immediate(), &view.desktop_context);
+            view.desktop_context.send_edits(view.dom.render_immediate());
         }
     }
 
@@ -344,7 +343,7 @@ impl<P: 'static> App<P> {
                 }
             }
 
-            send_edits(view.dom.render_immediate(), &view.desktop_context);
+            view.desktop_context.send_edits(view.dom.render_immediate());
         }
     }
 }

+ 15 - 1
packages/desktop/src/desktop_context.rs

@@ -5,8 +5,8 @@ use crate::Config;
 use crate::{assets::AssetFuture, edits::WebviewQueue};
 use crate::{assets::AssetHandlerRegistry, edits::EditQueue};
 use crate::{events::IpcMessage, webview::WebviewHandler};
-use dioxus_core::ScopeState;
 use dioxus_core::VirtualDom;
+use dioxus_core::{Mutations, ScopeState};
 use dioxus_interpreter_js::binary_protocol::Channel;
 use rustc_hash::FxHashMap;
 use slab::Slab;
@@ -121,6 +121,20 @@ impl DesktopService {
         }
     }
 
+    /// Send a list of mutations to the webview
+    pub(crate) fn send_edits(&self, edits: Mutations) {
+        let mut channel = self.channel.borrow_mut();
+        let mut templates = self.templates.borrow_mut();
+        if let Some(bytes) = crate::edits::apply_edits(
+            edits,
+            &mut channel,
+            &mut templates,
+            &self.max_template_count,
+        ) {
+            self.edit_queue.add_edits(bytes)
+        }
+    }
+
     /// Create a new window using the props and window builder
     ///
     /// Returns the webview handle for the new window.

+ 14 - 40
packages/desktop/src/edits.rs

@@ -1,24 +1,21 @@
-use crate::assets::AssetHandlerRegistry;
 use crate::query::QueryEngine;
 use crate::shortcut::{HotKey, ShortcutId, ShortcutRegistry, ShortcutRegistryError};
 use crate::AssetHandler;
 use crate::Config;
 use crate::{assets::AssetFuture, DesktopContext};
+use crate::{assets::AssetHandlerRegistry, DesktopService};
 use crate::{events::IpcMessage, webview::WebviewHandler};
 use dioxus_core::{BorrowedAttributeValue, Template, TemplateAttribute, TemplateNode, VirtualDom};
 use dioxus_core::{Mutations, ScopeState};
 use dioxus_html::event_bubbles;
 use dioxus_interpreter_js::binary_protocol::Channel;
 use rustc_hash::FxHashMap;
-use slab::Slab;
 use std::{
-    cell::RefCell, fmt::Debug, fmt::Formatter, rc::Rc, rc::Weak, sync::atomic::AtomicU16,
-    sync::Arc, sync::Mutex,
-};
-use tao::{
-    event::Event,
-    event_loop::{EventLoopProxy, EventLoopWindowTarget},
-    window::{Fullscreen as WryFullscreen, Window, WindowId},
+    cell::RefCell,
+    rc::Rc,
+    sync::atomic::AtomicU16,
+    sync::Arc,
+    sync::{atomic::Ordering, Mutex},
 };
 
 use wry::{RequestAsyncResponder, WebView};
@@ -33,17 +30,6 @@ pub(crate) struct EditQueue {
     responder: Arc<Mutex<Option<RequestAsyncResponder>>>,
 }
 
-impl Debug for EditQueue {
-    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
-        f.debug_struct("EditQueue")
-            .field("queue", &self.queue)
-            .field("responder", {
-                &self.responder.lock().unwrap().as_ref().map(|_| ())
-            })
-            .finish()
-    }
-}
-
 impl EditQueue {
     pub fn handle_request(&self, responder: RequestAsyncResponder) {
         let mut queue = self.queue.lock().unwrap();
@@ -64,33 +50,21 @@ impl EditQueue {
     }
 }
 
-/// Send a list of mutations to the webview
-pub fn send_edits(edits: Mutations, desktop_context: &DesktopContext) {
-    let mut channel = desktop_context.channel.borrow_mut();
-    let mut templates = desktop_context.templates.borrow_mut();
-    if let Some(bytes) = apply_edits(
-        edits,
-        &mut channel,
-        &mut templates,
-        &desktop_context.max_template_count,
-    ) {
-        desktop_context.edit_queue.add_edits(bytes)
-    }
-}
-
-pub fn apply_edits(
+pub(crate) fn apply_edits(
     mutations: Mutations,
     channel: &mut Channel,
     templates: &mut FxHashMap<String, u16>,
     max_template_count: &AtomicU16,
 ) -> Option<Vec<u8>> {
-    use dioxus_core::Mutation::*;
     if mutations.templates.is_empty() && mutations.edits.is_empty() {
         return None;
     }
+
     for template in mutations.templates {
         add_template(&template, channel, templates, max_template_count);
     }
+
+    use dioxus_core::Mutation::*;
     for edit in mutations.edits {
         match edit {
             AppendChildren { id, m } => channel.append_children(id.0 as u32, m as u16),
@@ -156,19 +130,19 @@ pub fn add_template(
     templates: &mut FxHashMap<String, u16>,
     max_template_count: &AtomicU16,
 ) {
-    let current_max_template_count = max_template_count.load(std::sync::atomic::Ordering::Relaxed);
+    let current_max_template_count = max_template_count.load(Ordering::Relaxed);
     for root in template.roots.iter() {
         create_template_node(channel, root);
         templates.insert(template.name.to_owned(), current_max_template_count);
     }
     channel.add_templates(current_max_template_count, template.roots.len() as u16);
 
-    max_template_count.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
+    max_template_count.fetch_add(1, Ordering::Relaxed);
 }
 
-pub fn create_template_node(channel: &mut Channel, v: &'static TemplateNode<'static>) {
+pub fn create_template_node(channel: &mut Channel, node: &'static TemplateNode<'static>) {
     use TemplateNode::*;
-    match v {
+    match node {
         Element {
             tag,
             namespace,

+ 5 - 3
packages/desktop/src/menubar.rs

@@ -1,12 +1,14 @@
-use muda::{Menu, MenuItem, PredefinedMenuItem, Submenu};
+use muda::{Menu, PredefinedMenuItem, Submenu};
 use tao::window::Window;
 
+#[allow(unused)]
 pub fn build_menu_bar(menu: Menu, window: &Window) {
     #[cfg(target_os = "windows")]
-    menu.init_for_hwnd(window_hwnd);
+    menu.init_for_hwnd(window);
 
     #[cfg(target_os = "linux")]
-    menu.init_for_gtk_window(&gtk_window, Some(&vertical_gtk_box));
+    menu.init_for_gtk_window(window, None);
+    // menu.init_for_gtk_window(window, Some(&vertical_gtk_box));
 
     #[cfg(target_os = "macos")]
     menu.init_for_nsapp();