From 784a03643de9cacc83121e2e2778e874c0fb2c2e Mon Sep 17 00:00:00 2001 From: Heng-Yi Wu <2316687+henry40408@users.noreply.github.com> Date: Tue, 19 Jul 2022 21:07:18 +0800 Subject: [PATCH 1/4] feat: window.is_minimized() --- .changes/is-minimized.md | 5 +++++ examples/window_debug.rs | 9 +++------ src/platform_impl/android/mod.rs | 4 ++++ src/platform_impl/ios/window.rs | 5 +++++ src/platform_impl/linux/window.rs | 4 ++++ src/platform_impl/macos/mod.rs | 7 +++++++ src/platform_impl/windows/window.rs | 6 ++++++ src/window.rs | 10 ++++++++++ 8 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 .changes/is-minimized.md diff --git a/.changes/is-minimized.md b/.changes/is-minimized.md new file mode 100644 index 000000000..b7cb80a45 --- /dev/null +++ b/.changes/is-minimized.md @@ -0,0 +1,5 @@ +--- +"tao": patch +--- + +Add `Window::is_minimized()`. diff --git a/examples/window_debug.rs b/examples/window_debug.rs index 7c00fc2b2..05771b677 100644 --- a/examples/window_debug.rs +++ b/examples/window_debug.rs @@ -32,7 +32,6 @@ fn main() { eprintln!(" (V) Toggle visibility"); eprintln!(" (X) Toggle maximized"); - let mut minimized = false; let mut visible = true; event_loop.run(move |event, _, control_flow| { @@ -51,9 +50,8 @@ fn main() { .. } => match physical_key { KeyCode::KeyM => { - if minimized { - minimized = !minimized; - window.set_minimized(minimized); + if !window.is_minimized() { + window.set_minimized(true); } } KeyCode::KeyV => { @@ -110,8 +108,7 @@ fn main() { } } "m" => { - minimized = !minimized; - window.set_minimized(minimized); + window.set_minimized(true); } "q" => { *control_flow = ControlFlow::Exit; diff --git a/src/platform_impl/android/mod.rs b/src/platform_impl/android/mod.rs index f010942ce..6a2cb96d1 100644 --- a/src/platform_impl/android/mod.rs +++ b/src/platform_impl/android/mod.rs @@ -608,6 +608,10 @@ impl Window { false } + pub fn is_minimized(&self) -> bool { + false + } + pub fn is_visible(&self) -> bool { log::warn!("`Window::is_visible` is ignored on android"); false diff --git a/src/platform_impl/ios/window.rs b/src/platform_impl/ios/window.rs index bf5e25289..289e0ee00 100644 --- a/src/platform_impl/ios/window.rs +++ b/src/platform_impl/ios/window.rs @@ -215,6 +215,11 @@ impl Inner { false } + pub fn is_minimized(&self) -> bool { + warn!("`Window::is_minimized` is ignored on iOS"); + false + } + pub fn is_visible(&self) -> bool { log::warn!("`Window::is_visible` is ignored on iOS"); false diff --git a/src/platform_impl/linux/window.rs b/src/platform_impl/linux/window.rs index 4b7906483..591bad2b2 100644 --- a/src/platform_impl/linux/window.rs +++ b/src/platform_impl/linux/window.rs @@ -498,6 +498,10 @@ impl Window { self.maximized.load(Ordering::Acquire) } + pub fn is_minimized(&self) -> bool { + self.minimized.load(Ordering::Acquire) + } + pub fn is_resizable(&self) -> bool { self.window.is_resizable() } diff --git a/src/platform_impl/macos/mod.rs b/src/platform_impl/macos/mod.rs index b44d22fdc..180af2901 100644 --- a/src/platform_impl/macos/mod.rs +++ b/src/platform_impl/macos/mod.rs @@ -23,6 +23,7 @@ mod view; mod window; mod window_delegate; +use cocoa::base::{BOOL, YES}; use std::{fmt, ops::Deref, sync::Arc}; #[cfg(feature = "tray")] @@ -98,6 +99,12 @@ impl Window { let () = unsafe { msg_send![*self.delegate, clearIsCheckingZoomedIn] }; f } + + #[inline] + pub fn is_minimized(&self) -> bool { + let is_minimized: BOOL = unsafe { msg_send![*self.ns_window, isMiniaturized] }; + is_minimized == YES + } } impl fmt::Display for OsError { diff --git a/src/platform_impl/windows/window.rs b/src/platform_impl/windows/window.rs index 857df4f57..b67010cd4 100644 --- a/src/platform_impl/windows/window.rs +++ b/src/platform_impl/windows/window.rs @@ -460,6 +460,12 @@ impl Window { window_state.window_flags.contains(WindowFlags::MAXIMIZED) } + #[inline] + pub fn is_minimized(&self) -> bool { + let window_state = self.window_state.lock(); + window_state.window_flags.contains(WindowFlags::MINIMIZED) + } + #[inline] pub fn is_resizable(&self) -> bool { let window_state = self.window_state.lock(); diff --git a/src/window.rs b/src/window.rs index 3f0a4e62f..841be3850 100644 --- a/src/window.rs +++ b/src/window.rs @@ -687,6 +687,16 @@ impl Window { self.window.is_maximized() } + /// Gets the window's current minimized state. + /// + /// ## Platform-specific + /// + /// - **iOS / Android:** Unsupported. + #[inline] + pub fn is_minimized(&self) -> bool { + self.window.is_minimized() + } + /// Gets the window's current vibility state. /// /// ## Platform-specific From 547a7dd00ceeaae8fd8ec81c6cc4b94c3f783582 Mon Sep 17 00:00:00 2001 From: Heng-Yi Wu <2316687+henry40408@users.noreply.github.com> Date: Thu, 4 Aug 2022 22:51:43 +0800 Subject: [PATCH 2/4] Apply suggestions from code review Co-authored-by: Amr Bashir --- examples/window_debug.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/window_debug.rs b/examples/window_debug.rs index 05771b677..1abb5d7e9 100644 --- a/examples/window_debug.rs +++ b/examples/window_debug.rs @@ -50,8 +50,8 @@ fn main() { .. } => match physical_key { KeyCode::KeyM => { - if !window.is_minimized() { - window.set_minimized(true); + if window.is_minimized() { + window.set_minimized(false); } } KeyCode::KeyV => { @@ -108,7 +108,7 @@ fn main() { } } "m" => { - window.set_minimized(true); + window.set_minimized(!window.is_minimized()); } "q" => { *control_flow = ControlFlow::Exit; From e3a0a8d88e6e888a2a99f89a76214a38784ee68c Mon Sep 17 00:00:00 2001 From: Heng-Yi Wu <2316687+henry40408@users.noreply.github.com> Date: Sat, 6 Aug 2022 08:37:49 +0800 Subject: [PATCH 3/4] refactor(macos): move methods to Window - Window::is_maximized - Window::is_minimized --- examples/window_debug.rs | 3 +-- src/platform_impl/macos/mod.rs | 21 ++------------------- src/platform_impl/macos/window.rs | 11 +++++++++++ 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/examples/window_debug.rs b/examples/window_debug.rs index 1abb5d7e9..ef07b63c4 100644 --- a/examples/window_debug.rs +++ b/examples/window_debug.rs @@ -118,8 +118,7 @@ fn main() { window.set_visible(visible); } "x" => { - let is_maximized = window.is_maximized(); - window.set_maximized(!is_maximized); + window.set_maximized(!window.is_maximized()); } _ => (), }, diff --git a/src/platform_impl/macos/mod.rs b/src/platform_impl/macos/mod.rs index 180af2901..d6efd3e53 100644 --- a/src/platform_impl/macos/mod.rs +++ b/src/platform_impl/macos/mod.rs @@ -23,7 +23,6 @@ mod view; mod window; mod window_delegate; -use cocoa::base::{BOOL, YES}; use std::{fmt, ops::Deref, sync::Arc}; #[cfg(feature = "tray")] @@ -60,8 +59,6 @@ pub(crate) const DEVICE_ID: RootDeviceId = RootDeviceId(DeviceId); pub struct Window { window: Arc, - // We keep this around so that it doesn't get dropped until the window does. - delegate: util::IdRef, } #[non_exhaustive] @@ -88,22 +85,8 @@ impl Window { attributes: WindowAttributes, pl_attribs: PlatformSpecificWindowBuilderAttributes, ) -> Result { - let (window, delegate) = UnownedWindow::new(attributes, pl_attribs)?; - Ok(Window { window, delegate }) - } - - #[inline] - pub fn is_maximized(&self) -> bool { - let () = unsafe { msg_send![*self.delegate, markIsCheckingZoomedIn] }; - let f = self.window.is_zoomed(); - let () = unsafe { msg_send![*self.delegate, clearIsCheckingZoomedIn] }; - f - } - - #[inline] - pub fn is_minimized(&self) -> bool { - let is_minimized: BOOL = unsafe { msg_send![*self.ns_window, isMiniaturized] }; - is_minimized == YES + let (window, _delegate) = UnownedWindow::new(attributes, pl_attribs)?; + Ok(Window { window }) } } diff --git a/src/platform_impl/macos/window.rs b/src/platform_impl/macos/window.rs index 90d6e28ec..c4b26e645 100644 --- a/src/platform_impl/macos/window.rs +++ b/src/platform_impl/macos/window.rs @@ -853,6 +853,17 @@ impl UnownedWindow { is_visible == YES } + #[inline] + pub fn is_maximized(&self) -> bool { + self.is_zoomed() + } + + #[inline] + pub fn is_minimized(&self) -> bool { + let is_minimized: BOOL = unsafe { msg_send![*self.ns_window, isMiniaturized] }; + is_minimized == YES + } + #[inline] pub fn is_resizable(&self) -> bool { let is_resizable: BOOL = unsafe { msg_send![*self.ns_window, isResizable] }; From 187ed1f697d74869c45f297b2ded7f531b5fc5fe Mon Sep 17 00:00:00 2001 From: Heng-Yi Wu <2316687+henry40408@users.noreply.github.com> Date: Sat, 6 Aug 2022 19:44:17 +0800 Subject: [PATCH 4/4] refactor: bring delegate back --- src/platform_impl/macos/mod.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/platform_impl/macos/mod.rs b/src/platform_impl/macos/mod.rs index d6efd3e53..840c2820f 100644 --- a/src/platform_impl/macos/mod.rs +++ b/src/platform_impl/macos/mod.rs @@ -59,6 +59,9 @@ pub(crate) const DEVICE_ID: RootDeviceId = RootDeviceId(DeviceId); pub struct Window { window: Arc, + // We keep this around so that it doesn't get dropped until the window does. + #[allow(dead_code)] + delegate: util::IdRef, } #[non_exhaustive] @@ -85,8 +88,8 @@ impl Window { attributes: WindowAttributes, pl_attribs: PlatformSpecificWindowBuilderAttributes, ) -> Result { - let (window, _delegate) = UnownedWindow::new(attributes, pl_attribs)?; - Ok(Window { window }) + let (window, delegate) = UnownedWindow::new(attributes, pl_attribs)?; + Ok(Window { window, delegate }) } }