summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Night_Hunter <samuelhuntnz@gmail.com>2022-12-10 01:53:00 +1300
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-01-02 20:13:42 +0100
commitd95b9bf244b5c1f7c8c3e84c1c05a5f81c9162e4 (patch)
tree3d0234ad5bebdf8a748e998484c2e3191e9e1216
parent54105a24e11edb48670afa8246ad891af147aab5 (diff)
downloadiced-d95b9bf244b5c1f7c8c3e84c1c05a5f81c9162e4.tar.gz
iced-d95b9bf244b5c1f7c8c3e84c1c05a5f81c9162e4.tar.bz2
iced-d95b9bf244b5c1f7c8c3e84c1c05a5f81c9162e4.zip
Add `RequestUserAttention` to `window::Action`
-rw-r--r--native/src/window.rs2
-rw-r--r--native/src/window/action.rs30
-rw-r--r--native/src/window/user_attention.rs21
-rw-r--r--winit/src/application.rs22
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) => {