From 6eaad850eee7074326c37e93c2e2ecc5fe5b20a7 Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Thu, 10 Feb 2022 12:35:17 +0800 Subject: [PATCH 01/13] feat: add window title api --- packages/desktop/src/desktop_context.rs | 7 +++++++ packages/desktop/src/lib.rs | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 9c0404477..d2c25a3e7 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -57,6 +57,13 @@ impl DesktopContext { pub fn focus(&self) { let _ = self.proxy.send_event(UserWindowEvent::FocusWindow); } + + /// set window title + pub fn title(&self, title: &str) { + let _ = self + .proxy + .send_event(UserWindowEvent::Title(String::from(title))); + } } /// use this function can get the `DesktopContext` context. diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 9181d04dc..6bd95b6ff 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -321,6 +321,12 @@ pub fn launch_with_props( window.set_focus(); } } + UserWindowEvent::Title(content) => { + for webview in desktop.webviews.values() { + let window = webview.window(); + window.set_title(&content); + } + } } } Event::MainEventsCleared => {} @@ -338,6 +344,8 @@ pub enum UserWindowEvent { DragWindow, CloseWindow, FocusWindow, + + Title(String), Minimize(bool), Maximize(bool), } From f28fb7165a0158b8ce93aa768c350f5ea2b6aff6 Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Thu, 10 Feb 2022 13:47:45 +0800 Subject: [PATCH 02/13] feat: add window api --- packages/desktop/src/desktop_context.rs | 14 ++++++++++++-- packages/desktop/src/lib.rs | 21 ++++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index d2c25a3e7..294cfa23c 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -58,11 +58,21 @@ impl DesktopContext { let _ = self.proxy.send_event(UserWindowEvent::FocusWindow); } + /// set resizable state + pub fn resizable(&self, resizable: bool) { + let _ = self.proxy.send_event(UserWindowEvent::Resizable(resizable)); + } + /// set window title - pub fn title(&self, title: &str) { + pub fn set_title(&self, title: &str) { let _ = self .proxy - .send_event(UserWindowEvent::Title(String::from(title))); + .send_event(UserWindowEvent::SetTitle(String::from(title))); + } + + /// hide the menu + pub fn hide_menu(&self) { + let _ = self.proxy.send_event(UserWindowEvent::HideMenu); } } diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 6bd95b6ff..452bbba96 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -321,12 +321,25 @@ pub fn launch_with_props( window.set_focus(); } } - UserWindowEvent::Title(content) => { + + UserWindowEvent::SetTitle(content) => { for webview in desktop.webviews.values() { let window = webview.window(); window.set_title(&content); } } + UserWindowEvent::Resizable(state) => { + for webview in desktop.webviews.values() { + let window = webview.window(); + window.set_resizable(state); + } + } + UserWindowEvent::HideMenu => { + for webview in desktop.webviews.values() { + let window = webview.window(); + window.hide_menu(); + } + } } } Event::MainEventsCleared => {} @@ -344,10 +357,12 @@ pub enum UserWindowEvent { DragWindow, CloseWindow, FocusWindow, - - Title(String), Minimize(bool), Maximize(bool), + Resizable(bool), + + SetTitle(String), + HideMenu, } pub struct DesktopController { From 01435d6aff049364e76e34acba29a08d36c18c00 Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Thu, 10 Feb 2022 16:59:28 +0800 Subject: [PATCH 03/13] feat: add window api --- packages/desktop/src/desktop_context.rs | 6 ++++-- packages/desktop/src/lib.rs | 27 ++++++++++++++++--------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 294cfa23c..0b9c323c1 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -71,8 +71,10 @@ impl DesktopContext { } /// hide the menu - pub fn hide_menu(&self) { - let _ = self.proxy.send_event(UserWindowEvent::HideMenu); + pub fn set_decorations(&self, decoration: bool) { + let _ = self + .proxy + .send_event(UserWindowEvent::SetDecorations(decoration)); } } diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 452bbba96..5d45895a9 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -72,7 +72,7 @@ use tao::{ pub use wry; pub use wry::application as tao; use wry::{ - application::event_loop::EventLoopProxy, + application::{event_loop::EventLoopProxy, window::Fullscreen}, webview::RpcRequest, webview::{WebView, WebViewBuilder}, }; @@ -315,12 +315,24 @@ pub fn launch_with_props( window.set_maximized(state); } } + UserWindowEvent::Fullscreen(fullscreen) => { + for webview in desktop.webviews.values() { + let window = webview.window(); + window.set_fullscreen(*fullscreen.clone()); + } + } UserWindowEvent::FocusWindow => { for webview in desktop.webviews.values() { let window = webview.window(); window.set_focus(); } } + UserWindowEvent::Resizable(state) => { + for webview in desktop.webviews.values() { + let window = webview.window(); + window.set_resizable(state); + } + } UserWindowEvent::SetTitle(content) => { for webview in desktop.webviews.values() { @@ -328,16 +340,10 @@ pub fn launch_with_props( window.set_title(&content); } } - UserWindowEvent::Resizable(state) => { + UserWindowEvent::SetDecorations(state) => { for webview in desktop.webviews.values() { let window = webview.window(); - window.set_resizable(state); - } - } - UserWindowEvent::HideMenu => { - for webview in desktop.webviews.values() { - let window = webview.window(); - window.hide_menu(); + window.set_decorations(state); } } } @@ -360,9 +366,10 @@ pub enum UserWindowEvent { Minimize(bool), Maximize(bool), Resizable(bool), + Fullscreen(Box>), SetTitle(String), - HideMenu, + SetDecorations(bool), } pub struct DesktopController { From 81ea7a14287c79c1658e8b3be4c7ab6ebf12d219 Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Thu, 10 Feb 2022 23:33:02 +0800 Subject: [PATCH 04/13] feat: add window api --- packages/desktop/src/desktop_context.rs | 14 ++++++++++++++ packages/desktop/src/lib.rs | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 0b9c323c1..4d09bb966 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -48,6 +48,10 @@ impl DesktopContext { let _ = self.proxy.send_event(UserWindowEvent::Maximize(maximized)); } + pub fn visible(&self, visible: bool) { + let _ = self.proxy.send_event(UserWindowEvent::Visible(visible)); + } + /// close window pub fn close(&self) { let _ = self.proxy.send_event(UserWindowEvent::CloseWindow); @@ -63,6 +67,16 @@ impl DesktopContext { let _ = self.proxy.send_event(UserWindowEvent::Resizable(resizable)); } + pub fn always_on_top(&self, top: bool) { + let _ = self.proxy.send_event(UserWindowEvent::AlwaysOnTop(top)); + } + + pub fn cursor_visible(&self, visible: bool) { + let _ = self + .proxy + .send_event(UserWindowEvent::CursorVisible(visible)); + } + /// set window title pub fn set_title(&self, title: &str) { let _ = self diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 5d45895a9..a0344c75a 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -299,6 +299,12 @@ pub fn launch_with_props( // close window *control_flow = ControlFlow::Exit; } + UserWindowEvent::Visible(state) => { + for webview in desktop.webviews.values() { + let window = webview.window(); + window.set_visible(state); + } + } UserWindowEvent::Minimize(state) => { // this loop just run once, because dioxus-desktop is unsupport multi-window. for webview in desktop.webviews.values() { @@ -333,6 +339,19 @@ pub fn launch_with_props( window.set_resizable(state); } } + UserWindowEvent::AlwaysOnTop(state) => { + for webview in desktop.webviews.values() { + let window = webview.window(); + window.set_always_on_top(state); + } + } + + UserWindowEvent::CursorVisible(state) => { + for webview in desktop.webviews.values() { + let window = webview.window(); + window.set_cursor_visible(state); + } + } UserWindowEvent::SetTitle(content) => { for webview in desktop.webviews.values() { @@ -363,11 +382,15 @@ pub enum UserWindowEvent { DragWindow, CloseWindow, FocusWindow, + Visible(bool), Minimize(bool), Maximize(bool), Resizable(bool), + AlwaysOnTop(bool), Fullscreen(Box>), + CursorVisible(bool), + SetTitle(String), SetDecorations(bool), } From 332ec30954d7d7edb89a306ebb8d16f1c063692a Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Thu, 10 Feb 2022 23:38:57 +0800 Subject: [PATCH 05/13] fix: change method name --- packages/desktop/src/desktop_context.rs | 26 +++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 4d09bb966..2f2c41d28 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -1,7 +1,7 @@ use std::rc::Rc; use dioxus_core::ScopeState; -use wry::application::event_loop::EventLoopProxy; +use wry::application::{event_loop::EventLoopProxy, window::Fullscreen}; use crate::UserWindowEvent; @@ -34,44 +34,50 @@ impl DesktopContext { /// ```rust /// onmousedown: move |_| { desktop.drag_window(); } /// ``` - pub fn drag(&self) { + pub fn drag_window(&self) { let _ = self.proxy.send_event(UserWindowEvent::DragWindow); } /// set window minimize state - pub fn minimize(&self, minimized: bool) { + pub fn set_minimized(&self, minimized: bool) { let _ = self.proxy.send_event(UserWindowEvent::Minimize(minimized)); } /// set window maximize state - pub fn maximize(&self, maximized: bool) { + pub fn set_maximized(&self, maximized: bool) { let _ = self.proxy.send_event(UserWindowEvent::Maximize(maximized)); } - pub fn visible(&self, visible: bool) { + pub fn set_visible(&self, visible: bool) { let _ = self.proxy.send_event(UserWindowEvent::Visible(visible)); } /// close window - pub fn close(&self) { + pub fn close_window(&self) { let _ = self.proxy.send_event(UserWindowEvent::CloseWindow); } /// set window to focus - pub fn focus(&self) { + pub fn set_focus(&self) { let _ = self.proxy.send_event(UserWindowEvent::FocusWindow); } + pub fn set_fullscreen(&self, fullscreen: Option) { + let _ = self + .proxy + .send_event(UserWindowEvent::Fullscreen(Box::new(fullscreen))); + } + /// set resizable state - pub fn resizable(&self, resizable: bool) { + pub fn set_resizable(&self, resizable: bool) { let _ = self.proxy.send_event(UserWindowEvent::Resizable(resizable)); } - pub fn always_on_top(&self, top: bool) { + pub fn set_always_on_top(&self, top: bool) { let _ = self.proxy.send_event(UserWindowEvent::AlwaysOnTop(top)); } - pub fn cursor_visible(&self, visible: bool) { + pub fn set_cursor_visible(&self, visible: bool) { let _ = self .proxy .send_event(UserWindowEvent::CursorVisible(visible)); From 62f8e71f7f36add69d041d22138dbc0746c64b7a Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Fri, 11 Feb 2022 09:05:32 +0800 Subject: [PATCH 06/13] fix: borderless example --- examples/borderless.rs | 6 +++--- packages/desktop/src/desktop_context.rs | 16 +++++++++++++++- packages/desktop/src/lib.rs | 18 +++++++++++++++++- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/examples/borderless.rs b/examples/borderless.rs index d52e9fb5a..3122c91fa 100644 --- a/examples/borderless.rs +++ b/examples/borderless.rs @@ -13,7 +13,7 @@ fn app(cx: Scope) -> Element { link { href:"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css", rel:"stylesheet" } header { class: "text-gray-400 bg-gray-900 body-font", - onmousedown: move |_| window.drag(), + onmousedown: move |_| window.drag_window(), div { class: "container mx-auto flex flex-wrap p-5 flex-col md:flex-row items-center", a { class: "flex title-font font-medium items-center text-white mb-4 md:mb-0", @@ -23,13 +23,13 @@ fn app(cx: Scope) -> Element { button { class: "inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0", onmousedown: |evt| evt.cancel_bubble(), - onclick: move |_| window.minimize(true), + onclick: move |_| window.set_minimized(true), "Minimize" } button { class: "inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0", onmousedown: |evt| evt.cancel_bubble(), - onclick: move |_| window.close(), + onclick: move |_| window.close_window(), "Close" } } diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 2f2c41d28..c3f193629 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -48,6 +48,7 @@ impl DesktopContext { let _ = self.proxy.send_event(UserWindowEvent::Maximize(maximized)); } + /// set window visible or not pub fn set_visible(&self, visible: bool) { let _ = self.proxy.send_event(UserWindowEvent::Visible(visible)); } @@ -62,6 +63,7 @@ impl DesktopContext { let _ = self.proxy.send_event(UserWindowEvent::FocusWindow); } + /// change window to fullscreen pub fn set_fullscreen(&self, fullscreen: Option) { let _ = self .proxy @@ -73,16 +75,23 @@ impl DesktopContext { let _ = self.proxy.send_event(UserWindowEvent::Resizable(resizable)); } + /// set the window always on top pub fn set_always_on_top(&self, top: bool) { let _ = self.proxy.send_event(UserWindowEvent::AlwaysOnTop(top)); } + // set cursor visible or not pub fn set_cursor_visible(&self, visible: bool) { let _ = self .proxy .send_event(UserWindowEvent::CursorVisible(visible)); } + // set cursor grab + pub fn set_cursor_grab(&self, grab: bool) { + let _ = self.proxy.send_event(UserWindowEvent::CursorGrab(grab)); + } + /// set window title pub fn set_title(&self, title: &str) { let _ = self @@ -90,12 +99,17 @@ impl DesktopContext { .send_event(UserWindowEvent::SetTitle(String::from(title))); } - /// hide the menu + /// change window to borderless pub fn set_decorations(&self, decoration: bool) { let _ = self .proxy .send_event(UserWindowEvent::SetDecorations(decoration)); } + + /// skip/hidden the taskbar icon + pub fn set_skip_taskbar(&self, skip: bool) { + let _ = self.proxy.send_event(UserWindowEvent::SkipTaskBar(skip)); + } } /// use this function can get the `DesktopContext` context. diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index a0344c75a..1835e6876 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -72,7 +72,9 @@ use tao::{ pub use wry; pub use wry::application as tao; use wry::{ - application::{event_loop::EventLoopProxy, window::Fullscreen}, + application::{ + event_loop::EventLoopProxy, platform::windows::WindowExtWindows, window::Fullscreen, + }, webview::RpcRequest, webview::{WebView, WebViewBuilder}, }; @@ -352,6 +354,12 @@ pub fn launch_with_props( window.set_cursor_visible(state); } } + UserWindowEvent::CursorGrab(state) => { + for webview in desktop.webviews.values() { + let window = webview.window(); + let _ = window.set_cursor_grab(state); + } + } UserWindowEvent::SetTitle(content) => { for webview in desktop.webviews.values() { @@ -365,6 +373,12 @@ pub fn launch_with_props( window.set_decorations(state); } } + UserWindowEvent::SkipTaskBar(state) => { + for webview in desktop.webviews.values() { + let window = webview.window(); + window.set_skip_taskbar(state); + } + } } } Event::MainEventsCleared => {} @@ -390,9 +404,11 @@ pub enum UserWindowEvent { Fullscreen(Box>), CursorVisible(bool), + CursorGrab(bool), SetTitle(String), SetDecorations(bool), + SkipTaskBar(bool), } pub struct DesktopController { From c9fa19d009407874e9c581096c58c51ee75f83c7 Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Fri, 11 Feb 2022 09:10:27 +0800 Subject: [PATCH 07/13] fix: ci problem --- packages/desktop/src/desktop_context.rs | 5 ----- packages/desktop/src/lib.rs | 11 +---------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index c3f193629..5ae38adff 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -105,11 +105,6 @@ impl DesktopContext { .proxy .send_event(UserWindowEvent::SetDecorations(decoration)); } - - /// skip/hidden the taskbar icon - pub fn set_skip_taskbar(&self, skip: bool) { - let _ = self.proxy.send_event(UserWindowEvent::SkipTaskBar(skip)); - } } /// use this function can get the `DesktopContext` context. diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 1835e6876..101ab91b7 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -72,9 +72,7 @@ use tao::{ pub use wry; pub use wry::application as tao; use wry::{ - application::{ - event_loop::EventLoopProxy, platform::windows::WindowExtWindows, window::Fullscreen, - }, + application::{event_loop::EventLoopProxy, window::Fullscreen}, webview::RpcRequest, webview::{WebView, WebViewBuilder}, }; @@ -373,12 +371,6 @@ pub fn launch_with_props( window.set_decorations(state); } } - UserWindowEvent::SkipTaskBar(state) => { - for webview in desktop.webviews.values() { - let window = webview.window(); - window.set_skip_taskbar(state); - } - } } } Event::MainEventsCleared => {} @@ -408,7 +400,6 @@ pub enum UserWindowEvent { SetTitle(String), SetDecorations(bool), - SkipTaskBar(bool), } pub struct DesktopController { From 30bb92f09afe1de588d644b5e2060524407f718f Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Fri, 11 Feb 2022 09:46:23 +0800 Subject: [PATCH 08/13] fix: change method name --- packages/desktop/src/desktop_context.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 5ae38adff..d33ff5abe 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -34,7 +34,7 @@ impl DesktopContext { /// ```rust /// onmousedown: move |_| { desktop.drag_window(); } /// ``` - pub fn drag_window(&self) { + pub fn drag(&self) { let _ = self.proxy.send_event(UserWindowEvent::DragWindow); } @@ -54,12 +54,12 @@ impl DesktopContext { } /// close window - pub fn close_window(&self) { + pub fn close(&self) { let _ = self.proxy.send_event(UserWindowEvent::CloseWindow); } /// set window to focus - pub fn set_focus(&self) { + pub fn focus(&self) { let _ = self.proxy.send_event(UserWindowEvent::FocusWindow); } From 557201816b1bd18e92173902d110534f304628c5 Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Fri, 11 Feb 2022 09:51:12 +0800 Subject: [PATCH 09/13] fix: borderless example --- examples/borderless.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/borderless.rs b/examples/borderless.rs index 3122c91fa..1b7e2e0f5 100644 --- a/examples/borderless.rs +++ b/examples/borderless.rs @@ -13,7 +13,7 @@ fn app(cx: Scope) -> Element { link { href:"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css", rel:"stylesheet" } header { class: "text-gray-400 bg-gray-900 body-font", - onmousedown: move |_| window.drag_window(), + onmousedown: move |_| window.drag(), div { class: "container mx-auto flex flex-wrap p-5 flex-col md:flex-row items-center", a { class: "flex title-font font-medium items-center text-white mb-4 md:mb-0", @@ -29,7 +29,7 @@ fn app(cx: Scope) -> Element { button { class: "inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0", onmousedown: |evt| evt.cancel_bubble(), - onclick: move |_| window.close_window(), + onclick: move |_| window.close(), "Close" } } From da0f596cdee27ba3d32aa314b8bc4a3388fd2210 Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Fri, 11 Feb 2022 10:36:29 +0800 Subject: [PATCH 10/13] feat: commit code --- examples/borderless.rs | 2 ++ packages/desktop/src/desktop_context.rs | 6 +++--- packages/desktop/src/lib.rs | 24 +++++++++++++++++++++--- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/examples/borderless.rs b/examples/borderless.rs index 1b7e2e0f5..55f44d592 100644 --- a/examples/borderless.rs +++ b/examples/borderless.rs @@ -9,6 +9,8 @@ fn main() { fn app(cx: Scope) -> Element { let window = dioxus::desktop::use_window(&cx); + // window.set_fullscreen(true); + cx.render(rsx!( link { href:"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css", rel:"stylesheet" } header { diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index d33ff5abe..d180e1235 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -1,7 +1,7 @@ use std::rc::Rc; use dioxus_core::ScopeState; -use wry::application::{event_loop::EventLoopProxy, window::Fullscreen}; +use wry::application::event_loop::EventLoopProxy; use crate::UserWindowEvent; @@ -64,10 +64,10 @@ impl DesktopContext { } /// change window to fullscreen - pub fn set_fullscreen(&self, fullscreen: Option) { + pub fn set_fullscreen(&self, fullscreen: bool) { let _ = self .proxy - .send_event(UserWindowEvent::Fullscreen(Box::new(fullscreen))); + .send_event(UserWindowEvent::Fullscreen(fullscreen)); } /// set resizable state diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 101ab91b7..143225f6a 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -292,6 +292,11 @@ pub fn launch_with_props( let window = webview.window(); // start to drag the window. // if the drag_window have any err. we don't do anything. + + if window.fullscreen().is_some() { + return; + } + let _ = window.drag_window(); } } @@ -321,10 +326,23 @@ pub fn launch_with_props( window.set_maximized(state); } } - UserWindowEvent::Fullscreen(fullscreen) => { + UserWindowEvent::Fullscreen(state) => { for webview in desktop.webviews.values() { let window = webview.window(); - window.set_fullscreen(*fullscreen.clone()); + + let current_monitor = window.current_monitor(); + + if current_monitor.is_none() { + return; + } + + let fullscreen = if state { + Some(Fullscreen::Borderless(current_monitor)) + } else { + None + }; + + window.set_fullscreen(fullscreen); } } UserWindowEvent::FocusWindow => { @@ -393,7 +411,7 @@ pub enum UserWindowEvent { Maximize(bool), Resizable(bool), AlwaysOnTop(bool), - Fullscreen(Box>), + Fullscreen(bool), CursorVisible(bool), CursorGrab(bool), From 69abb898239428435ad770448d4c3e768ceb3328 Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Fri, 11 Feb 2022 10:57:53 +0800 Subject: [PATCH 11/13] feat: commit code --- examples/borderless.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/borderless.rs b/examples/borderless.rs index 55f44d592..f81028dbd 100644 --- a/examples/borderless.rs +++ b/examples/borderless.rs @@ -9,7 +9,9 @@ fn main() { fn app(cx: Scope) -> Element { let window = dioxus::desktop::use_window(&cx); + // if you want to make window fullscreen, you need close the resizable. // window.set_fullscreen(true); + // window.set_resizable(false); cx.render(rsx!( link { href:"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css", rel:"stylesheet" } From 04d3098c9b4e8478f0fafad36b667780de5ac829 Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Fri, 11 Feb 2022 11:21:25 +0800 Subject: [PATCH 12/13] feat: add more `window api` example --- examples/borderless.rs | 42 ----------------- examples/window_event.rs | 97 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 42 deletions(-) delete mode 100644 examples/borderless.rs create mode 100644 examples/window_event.rs diff --git a/examples/borderless.rs b/examples/borderless.rs deleted file mode 100644 index f81028dbd..000000000 --- a/examples/borderless.rs +++ /dev/null @@ -1,42 +0,0 @@ -use dioxus::prelude::*; - -fn main() { - dioxus::desktop::launch_cfg(app, |cfg| { - cfg.with_window(|w| w.with_title("BorderLess Demo").with_decorations(false)) - }); -} - -fn app(cx: Scope) -> Element { - let window = dioxus::desktop::use_window(&cx); - - // if you want to make window fullscreen, you need close the resizable. - // window.set_fullscreen(true); - // window.set_resizable(false); - - cx.render(rsx!( - link { href:"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css", rel:"stylesheet" } - header { - class: "text-gray-400 bg-gray-900 body-font", - onmousedown: move |_| window.drag(), - div { - class: "container mx-auto flex flex-wrap p-5 flex-col md:flex-row items-center", - a { class: "flex title-font font-medium items-center text-white mb-4 md:mb-0", - span { class: "ml-3 text-xl", "Dioxus"} - } - nav { class: "md:ml-auto flex flex-wrap items-center text-base justify-center" } - button { - class: "inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0", - onmousedown: |evt| evt.cancel_bubble(), - onclick: move |_| window.set_minimized(true), - "Minimize" - } - button { - class: "inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0", - onmousedown: |evt| evt.cancel_bubble(), - onclick: move |_| window.close(), - "Close" - } - } - } - )) -} diff --git a/examples/window_event.rs b/examples/window_event.rs new file mode 100644 index 000000000..525f0d841 --- /dev/null +++ b/examples/window_event.rs @@ -0,0 +1,97 @@ +use dioxus::prelude::*; + +fn main() { + dioxus::desktop::launch_cfg(app, |cfg| { + cfg.with_window(|w| w.with_title("BorderLess Demo").with_decorations(false)) + }); +} + +fn app(cx: Scope) -> Element { + let window = dioxus::desktop::use_window(&cx); + + // if you want to make window fullscreen, you need close the resizable. + // window.set_fullscreen(true); + // window.set_resizable(false); + + let (fullscreen, set_fullscreen) = use_state(&cx, || false); + let (always_on_top, set_always_on_top) = use_state(&cx, || false); + let (decorations, set_decorations) = use_state(&cx, || false); + + cx.render(rsx!( + link { href:"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css", rel:"stylesheet" } + header { + class: "text-gray-400 bg-gray-900 body-font", + onmousedown: move |_| window.drag(), + div { + class: "container mx-auto flex flex-wrap p-5 flex-col md:flex-row items-center", + a { class: "flex title-font font-medium items-center text-white mb-4 md:mb-0", + span { class: "ml-3 text-xl", "Dioxus"} + } + nav { class: "md:ml-auto flex flex-wrap items-center text-base justify-center" } + button { + class: "inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0", + onmousedown: |evt| evt.cancel_bubble(), + onclick: move |_| window.set_minimized(true), + "Minimize" + } + button { + class: "inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0", + onmousedown: |evt| evt.cancel_bubble(), + onclick: move |_| { + + window.set_fullscreen(!fullscreen); + window.set_resizable(*fullscreen); + + set_fullscreen(!fullscreen); + }, + "Fullscreen" + } + button { + class: "inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0", + onmousedown: |evt| evt.cancel_bubble(), + onclick: move |_| window.close(), + "Close" + } + } + } + br {} + div { + class: "container mx-auto", + div { + class: "grid grid-cols-5", + div { + button { + class: "inline-flex items-center text-white bg-green-500 border-0 py-1 px-3 hover:bg-green-700 rounded", + onmousedown: |evt| evt.cancel_bubble(), + onclick: move |_| { + window.set_always_on_top(!always_on_top); + set_always_on_top(!always_on_top); + }, + "Always On Top" + } + } + div { + button { + class: "inline-flex items-center text-white bg-blue-500 border-0 py-1 px-3 hover:bg-green-700 rounded", + onmousedown: |evt| evt.cancel_bubble(), + onclick: move |_| { + window.set_decorations(!decorations); + set_decorations(!decorations); + }, + "Set Decorations" + } + } + div { + button { + class: "inline-flex items-center text-white bg-blue-500 border-0 py-1 px-3 hover:bg-green-700 rounded", + onmousedown: |evt| evt.cancel_bubble(), + onclick: move |_| { + window.set_title("Oh Dioxus !!!"); + }, + "Change Title" + } + } + } + } + )) +} From 8801e4be0028ec445919ec9a9f3208bf5c5071ba Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Fri, 11 Feb 2022 11:29:00 +0800 Subject: [PATCH 13/13] feat: change example --- examples/window_event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/window_event.rs b/examples/window_event.rs index 525f0d841..cb578829f 100644 --- a/examples/window_event.rs +++ b/examples/window_event.rs @@ -86,7 +86,7 @@ fn app(cx: Scope) -> Element { class: "inline-flex items-center text-white bg-blue-500 border-0 py-1 px-3 hover:bg-green-700 rounded", onmousedown: |evt| evt.cancel_bubble(), onclick: move |_| { - window.set_title("Oh Dioxus !!!"); + window.set_title("Dioxus Application"); }, "Change Title" }