diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 3a48879c0..577e33c54 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -4,25 +4,48 @@ use crate::UserWindowEvent; type ProxyType = EventLoopProxy; +/// Desktop-Window handle api context +/// +/// you can use this context control some window event +/// +/// you can use `cx.consume_context::` to get this context +/// +/// ```rust +/// let desktop = cx.consume_context::().unwrap(); +/// ``` #[derive(Clone)] pub struct DesktopContext { proxy: ProxyType, } impl DesktopContext { + pub fn new(proxy: ProxyType) -> Self { Self { proxy } } + /// trigger the drag-window event + /// + /// Moves the window with the left mouse button until the button is released. + /// + /// you need use it in `onmousedown` event: + /// ```rust + /// onmousedown: move |_| { desktop.drag_window(); } + /// ``` pub fn drag_window(&self) { let _ = self.proxy.send_event(UserWindowEvent::DragWindow); } - pub fn minimized(&self, minimized: bool) { - let _ = self.proxy.send_event(UserWindowEvent::Minimized(minimized)); + pub fn minimize(&self, minimized: bool) { + let _ = self.proxy.send_event(UserWindowEvent::Minimize(minimized)); } - pub fn maximized(&self, maximized: bool) { - let _ = self.proxy.send_event(UserWindowEvent::Maximized(maximized)); + pub fn maximize(&self, maximized: bool) { + let _ = self.proxy.send_event(UserWindowEvent::Maximize(maximized)); } + + pub fn close(&self) { + let _ = self.proxy.send_event(UserWindowEvent::CloseWindow); + } + } \ No newline at end of file diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index b27ef7742..45314df34 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -288,20 +288,28 @@ pub fn launch_with_props( // this loop just run once, because dioxus-desktop is unsupport multi-window. for webview in desktop.webviews.values() { let window = webview.window(); - window.drag_window().unwrap(); + // start to drag the window. + // if the drag_window have any err. we don't do anything. + let _ = window.drag_window(); } } - UserWindowEvent::Minimized(state) => { + UserWindowEvent::CloseWindow => { + // close window + *control_flow = ControlFlow::Exit; + } + UserWindowEvent::Minimize(state) => { // this loop just run once, because dioxus-desktop is unsupport multi-window. for webview in desktop.webviews.values() { let window = webview.window(); + // change window minimized state. window.set_minimized(state); } } - UserWindowEvent::Maximized(state) => { + UserWindowEvent::Maximize(state) => { // this loop just run once, because dioxus-desktop is unsupport multi-window. for webview in desktop.webviews.values() { let window = webview.window(); + // change window maximized state. window.set_maximized(state); } } @@ -320,8 +328,9 @@ pub fn launch_with_props( pub enum UserWindowEvent { Update, DragWindow, - Minimized(bool), - Maximized(bool), + CloseWindow, + Minimize(bool), + Maximize(bool), } pub struct DesktopController {