summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-08-18 14:39:15 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-08-18 14:39:15 +0200
commit11f5527d7645619f49b030e30485f24ac637efbd (patch)
tree489f7cfbb134b8736290f30010fe680a31c90423
parent277b848ad8df1e8d038e33707548a45d63a601db (diff)
downloadiced-11f5527d7645619f49b030e30485f24ac637efbd.tar.gz
iced-11f5527d7645619f49b030e30485f24ac637efbd.tar.bz2
iced-11f5527d7645619f49b030e30485f24ac637efbd.zip
Implement `SetMode` and `FetchMode` window actions
-rw-r--r--native/src/command/action.rs4
-rw-r--r--native/src/window.rs2
-rw-r--r--native/src/window/action.rs47
-rw-r--r--native/src/window/mode.rs12
-rw-r--r--winit/src/application.rs14
-rw-r--r--winit/src/conversion.rs33
-rw-r--r--winit/src/window.rs16
7 files changed, 123 insertions, 5 deletions
diff --git a/native/src/command/action.rs b/native/src/command/action.rs
index 3fb02899..a6954f8f 100644
--- a/native/src/command/action.rs
+++ b/native/src/command/action.rs
@@ -20,7 +20,7 @@ pub enum Action<T> {
Clipboard(clipboard::Action<T>),
/// Run a window action.
- Window(window::Action),
+ Window(window::Action<T>),
/// Run a system action.
System(system::Action<T>),
@@ -46,7 +46,7 @@ impl<T> Action<T> {
match self {
Self::Future(future) => Action::Future(Box::pin(future.map(f))),
Self::Clipboard(action) => Action::Clipboard(action.map(f)),
- Self::Window(window) => Action::Window(window),
+ Self::Window(window) => Action::Window(window.map(f)),
Self::System(system) => Action::System(system.map(f)),
Self::Widget(widget) => Action::Widget(widget.map(f)),
}
diff --git a/native/src/window.rs b/native/src/window.rs
index 62487fb9..f910b8f2 100644
--- a/native/src/window.rs
+++ b/native/src/window.rs
@@ -1,6 +1,8 @@
//! Build window-based GUI applications.
mod action;
mod event;
+mod mode;
pub use action::Action;
pub use event::Event;
+pub use mode::Mode;
diff --git a/native/src/window/action.rs b/native/src/window/action.rs
index 01294e83..d891c6ac 100644
--- a/native/src/window/action.rs
+++ b/native/src/window/action.rs
@@ -1,6 +1,10 @@
+use crate::window::Mode;
+
+use iced_futures::MaybeSend;
+use std::fmt;
+
/// An operation to be performed on some window.
-#[derive(Debug)]
-pub enum Action {
+pub enum Action<T> {
/// Resize the window.
Resize {
/// The new logical width of the window
@@ -15,4 +19,43 @@ pub enum Action {
/// The new logical y location of the window
y: i32,
},
+ /// Set the [`Mode`] of the window.
+ SetMode(Mode),
+ /// Fetch the current [`Mode`] of the window.
+ FetchMode(Box<dyn FnOnce(Mode) -> T + 'static>),
+}
+
+impl<T> Action<T> {
+ /// Maps the output of a window [`Action`] using the provided closure.
+ pub fn map<A>(
+ self,
+ f: impl Fn(T) -> A + 'static + MaybeSend + Sync,
+ ) -> Action<A>
+ where
+ T: 'static,
+ {
+ match self {
+ Self::Resize { width, height } => Action::Resize { width, height },
+ 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)))),
+ }
+ }
+}
+
+impl<T> fmt::Debug for Action<T> {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Self::Resize { width, height } => write!(
+ f,
+ "Action::Resize {{ widget: {}, height: {} }}",
+ width, height
+ ),
+ Self::Move { x, y } => {
+ write!(f, "Action::Move {{ x: {}, y: {} }}", x, y)
+ }
+ Self::SetMode(mode) => write!(f, "Action::SetMode({:?})", mode),
+ Self::FetchMode(_) => write!(f, "Action::FetchMode"),
+ }
+ }
}
diff --git a/native/src/window/mode.rs b/native/src/window/mode.rs
new file mode 100644
index 00000000..fdce8e23
--- /dev/null
+++ b/native/src/window/mode.rs
@@ -0,0 +1,12 @@
+/// The mode of a window-based application.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum Mode {
+ /// The application appears in its own window.
+ Windowed,
+
+ /// The application takes the whole screen of its current monitor.
+ Fullscreen,
+
+ /// The application is hidden
+ Hidden,
+}
diff --git a/winit/src/application.rs b/winit/src/application.rs
index 23364209..ecec6043 100644
--- a/winit/src/application.rs
+++ b/winit/src/application.rs
@@ -640,6 +640,20 @@ pub fn run_command<A, E>(
y,
});
}
+ window::Action::SetMode(mode) => {
+ window.set_visible(conversion::visible(mode));
+ window.set_fullscreen(conversion::fullscreen(
+ window.primary_monitor(),
+ mode,
+ ));
+ }
+ window::Action::FetchMode(tag) => {
+ let mode = conversion::mode(window.fullscreen());
+
+ proxy
+ .send_event(tag(mode))
+ .expect("Send message to event loop");
+ }
},
command::Action::System(action) => match action {
system::Action::QueryInformation(_tag) => {
diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs
index 05c9746e..ba5b0002 100644
--- a/winit/src/conversion.rs
+++ b/winit/src/conversion.rs
@@ -182,6 +182,39 @@ pub fn position(
}
}
+/// Converts a [`window::Mode`] to a [`winit`] fullscreen mode.
+///
+/// [`winit`]: https://github.com/rust-windowing/winit
+pub fn fullscreen(
+ monitor: Option<winit::monitor::MonitorHandle>,
+ mode: window::Mode,
+) -> Option<winit::window::Fullscreen> {
+ match mode {
+ window::Mode::Windowed | window::Mode::Hidden => None,
+ window::Mode::Fullscreen => {
+ Some(winit::window::Fullscreen::Borderless(monitor))
+ }
+ }
+}
+
+/// Converts a [`window::Mode`] to a visibility flag.
+pub fn visible(mode: window::Mode) -> bool {
+ match mode {
+ window::Mode::Windowed | window::Mode::Fullscreen => true,
+ window::Mode::Hidden => false,
+ }
+}
+
+/// Converts a [`winit`] fullscreen mode to a [`window::Mode`].
+///
+/// [`winit`]: https://github.com/rust-windowing/winit
+pub fn mode(mode: Option<winit::window::Fullscreen>) -> window::Mode {
+ match mode {
+ None => window::Mode::Windowed,
+ Some(_) => window::Mode::Fullscreen,
+ }
+}
+
/// Converts a `MouseCursor` from [`iced_native`] to a [`winit`] cursor icon.
///
/// [`winit`]: https://github.com/rust-windowing/winit
diff --git a/winit/src/window.rs b/winit/src/window.rs
index f3207e68..265139f7 100644
--- a/winit/src/window.rs
+++ b/winit/src/window.rs
@@ -2,7 +2,7 @@
use crate::command::{self, Command};
use iced_native::window;
-pub use window::Event;
+pub use window::{Event, Mode};
/// Resizes the window to the given logical dimensions.
pub fn resize<Message>(width: u32, height: u32) -> Command<Message> {
@@ -16,3 +16,17 @@ pub fn resize<Message>(width: u32, height: u32) -> Command<Message> {
pub fn move_to<Message>(x: i32, y: i32) -> Command<Message> {
Command::single(command::Action::Window(window::Action::Move { x, y }))
}
+
+/// Sets the [`Mode`] of the window.
+pub fn set_mode<Message>(mode: Mode) -> Command<Message> {
+ Command::single(command::Action::Window(window::Action::SetMode(mode)))
+}
+
+/// Fetches the current [`Mode`] of the window.
+pub fn fetch_mode<Message>(
+ f: impl FnOnce(Mode) -> Message + 'static,
+) -> Command<Message> {
+ Command::single(command::Action::Window(window::Action::FetchMode(
+ Box::new(f),
+ )))
+}