diff options
author | 2022-12-10 01:53:00 +1300 | |
---|---|---|
committer | 2023-01-02 20:13:42 +0100 | |
commit | d95b9bf244b5c1f7c8c3e84c1c05a5f81c9162e4 (patch) | |
tree | 3d0234ad5bebdf8a748e998484c2e3191e9e1216 | |
parent | 54105a24e11edb48670afa8246ad891af147aab5 (diff) | |
download | iced-d95b9bf244b5c1f7c8c3e84c1c05a5f81c9162e4.tar.gz iced-d95b9bf244b5c1f7c8c3e84c1c05a5f81c9162e4.tar.bz2 iced-d95b9bf244b5c1f7c8c3e84c1c05a5f81c9162e4.zip |
Add `RequestUserAttention` to `window::Action`
-rw-r--r-- | native/src/window.rs | 2 | ||||
-rw-r--r-- | native/src/window/action.rs | 30 | ||||
-rw-r--r-- | native/src/window/user_attention.rs | 21 | ||||
-rw-r--r-- | winit/src/application.rs | 22 |
4 files changed, 64 insertions, 11 deletions
diff --git a/native/src/window.rs b/native/src/window.rs index f910b8f2..1b97e655 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -2,7 +2,9 @@ mod action; mod event; mod mode; +mod user_attention; pub use action::Action; pub use event::Event; pub use mode::Mode; +pub use user_attention::UserAttention; diff --git a/native/src/window/action.rs b/native/src/window/action.rs index da307e97..f0fe845d 100644 --- a/native/src/window/action.rs +++ b/native/src/window/action.rs @@ -1,4 +1,4 @@ -use crate::window::Mode; +use crate::window::{Mode, UserAttention}; use iced_futures::MaybeSend; use std::fmt; @@ -35,6 +35,8 @@ pub enum Action<T> { }, /// Set the [`Mode`] of the window. SetMode(Mode), + /// Fetch the current [`Mode`] of the window. + FetchMode(Box<dyn FnOnce(Mode) -> T + 'static>), /// Sets the window to maximized or back ToggleMaximize, /// Toggles whether window has decorations @@ -42,8 +44,20 @@ pub enum Action<T> { /// - **X11:** Not implemented. /// - **Web:** Unsupported. ToggleDecorations, - /// Fetch the current [`Mode`] of the window. - FetchMode(Box<dyn FnOnce(Mode) -> T + 'static>), + /// Requests user attention to the window, this has no effect if the application + /// is already focused. How requesting for user attention manifests is platform dependent, + /// see [`UserAttentionType`] for details. + /// + /// Providing `None` will unset the request for user attention. Unsetting the request for + /// user attention might not be done automatically by the WM when the window receives input. + /// + /// ## Platform-specific + /// + /// - **iOS / Android / Web:** Unsupported. + /// - **macOS:** `None` has no effect. + /// - **X11:** Requests for user attention must be manually cleared. + /// - **Wayland:** Requires `xdg_activation_v1` protocol, `None` has no effect. + RequestUserAttention(Option<UserAttention>), } impl<T> Action<T> { @@ -63,9 +77,12 @@ impl<T> Action<T> { Self::Minimize(bool) => Action::Minimize(bool), Self::Move { x, y } => Action::Move { x, y }, Self::SetMode(mode) => Action::SetMode(mode), + Self::FetchMode(o) => Action::FetchMode(Box::new(move |s| f(o(s)))), Self::ToggleMaximize => Action::ToggleMaximize, Self::ToggleDecorations => Action::ToggleDecorations, - Self::FetchMode(o) => Action::FetchMode(Box::new(move |s| f(o(s)))), + Self::RequestUserAttention(attention_type) => { + Action::RequestUserAttention(attention_type) + } } } } @@ -86,9 +103,12 @@ impl<T> fmt::Debug for Action<T> { write!(f, "Action::Move {{ x: {}, y: {} }}", x, y) } Self::SetMode(mode) => write!(f, "Action::SetMode({:?})", mode), + Self::FetchMode(_) => write!(f, "Action::FetchMode"), Self::ToggleMaximize => write!(f, "Action::ToggleMaximize"), Self::ToggleDecorations => write!(f, "Action::ToggleDecorations"), - Self::FetchMode(_) => write!(f, "Action::FetchMode"), + Self::RequestUserAttention(_) => { + write!(f, "Action::RequestUserAttention") + } } } } diff --git a/native/src/window/user_attention.rs b/native/src/window/user_attention.rs new file mode 100644 index 00000000..b03dfeef --- /dev/null +++ b/native/src/window/user_attention.rs @@ -0,0 +1,21 @@ +/// The type of user attention to request. +/// +/// ## Platform-specific +/// +/// - **X11:** Sets the WM's `XUrgencyHint`. No distinction between [`Critical`] and [`Informational`]. +/// +/// [`Critical`]: Self::Critical +/// [`Informational`]: Self::Informational +#[derive(Debug, Clone, Copy)] +pub enum UserAttention { + /// ## Platform-specific + /// + /// - **macOS:** Bounces the dock icon until the application is in focus. + /// - **Windows:** Flashes both the window and the taskbar button until the application is in focus. + Critical, + /// ## Platform-specific + /// + /// - **macOS:** Bounces the dock icon once. + /// - **Windows:** Flashes the taskbar button until the application is in focus. + Informational, +} diff --git a/winit/src/application.rs b/winit/src/application.rs index 0f9b562e..f98a443b 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -657,12 +657,6 @@ pub fn run_command<A, E>( mode, )); } - window::Action::ToggleMaximize => { - window.set_maximized(!window.is_maximized()) - } - window::Action::ToggleDecorations => { - window.set_decorations(!window.is_decorated()) - } window::Action::FetchMode(tag) => { let mode = if window.is_visible().unwrap_or(true) { conversion::mode(window.fullscreen()) @@ -674,6 +668,22 @@ pub fn run_command<A, E>( .send_event(tag(mode)) .expect("Send message to event loop"); } + window::Action::ToggleMaximize => { + window.set_maximized(!window.is_maximized()) + } + window::Action::ToggleDecorations => { + window.set_decorations(!window.is_decorated()) + } + window::Action::RequestUserAttention(attention_type) => window + .request_user_attention(match attention_type { + Some(window::UserAttention::Critical) => { + Some(winit::window::UserAttentionType::Critical) + } + Some(window::UserAttention::Informational) => Some( + winit::window::UserAttentionType::Informational, + ), + None => None, + }), }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { |