From c96492b95660640eb2dd66a77c96ad32d5d5b0ae Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Thu, 16 Jan 2020 05:54:22 +0100
Subject: Expose `window::Mode` in `iced`

Although the Fullscreen API in the Web platform has some limitations, it
is still useful to be able to support fullscreen on the native side.
---
 native/src/window.rs      |  2 --
 native/src/window/mode.rs |  9 ---------
 src/application.rs        | 23 ++++++++++++++++++++++-
 src/lib.rs                |  1 +
 src/settings.rs           | 28 +++-------------------------
 src/window.rs             |  6 ++++++
 src/window/mode.rs        |  9 +++++++++
 src/window/settings.rs    | 22 ++++++++++++++++++++++
 winit/src/application.rs  |  6 +++---
 winit/src/conversion.rs   | 24 +++++++++++++-----------
 winit/src/lib.rs          |  2 ++
 winit/src/mode.rs         |  9 +++++++++
 12 files changed, 90 insertions(+), 51 deletions(-)
 delete mode 100644 native/src/window/mode.rs
 create mode 100644 src/window.rs
 create mode 100644 src/window/mode.rs
 create mode 100644 src/window/settings.rs
 create mode 100644 winit/src/mode.rs

diff --git a/native/src/window.rs b/native/src/window.rs
index 7e30c782..db9226dc 100644
--- a/native/src/window.rs
+++ b/native/src/window.rs
@@ -1,8 +1,6 @@
 //! Build window-based GUI applications.
 mod event;
-mod mode;
 mod renderer;
 
 pub use event::Event;
-pub use mode::Mode;
 pub use renderer::{Renderer, Target};
diff --git a/native/src/window/mode.rs b/native/src/window/mode.rs
deleted file mode 100644
index 37464711..00000000
--- a/native/src/window/mode.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-/// 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,
-}
diff --git a/src/application.rs b/src/application.rs
index 5ea64ba8..b940cc17 100644
--- a/src/application.rs
+++ b/src/application.rs
@@ -1,4 +1,4 @@
-use crate::{Command, Element, Settings, Subscription};
+use crate::{window, Command, Element, Settings, Subscription};
 
 /// An interactive cross-platform application.
 ///
@@ -138,6 +138,20 @@ pub trait Application: Sized {
     /// [`Application`]: trait.Application.html
     fn view(&mut self) -> Element<'_, Self::Message>;
 
+    /// Returns the current [`Application`] mode.
+    ///
+    /// The runtime will automatically transition your application if a new mode
+    /// is returned.
+    ///
+    /// Currently, the mode only has an effect in native platforms.
+    ///
+    /// By default, an application will run in windowed mode.
+    ///
+    /// [`Application`]: trait.Application.html
+    fn mode(&self) -> window::Mode {
+        window::Mode::Windowed
+    }
+
     /// Runs the [`Application`].
     ///
     /// This method will take control of the current thread and __will NOT
@@ -183,6 +197,13 @@ where
         self.0.title()
     }
 
+    fn mode(&self) -> iced_winit::Mode {
+        match self.0.mode() {
+            window::Mode::Windowed => iced_winit::Mode::Windowed,
+            window::Mode::Fullscreen => iced_winit::Mode::Fullscreen,
+        }
+    }
+
     fn update(&mut self, message: Self::Message) -> Command<Self::Message> {
         self.0.update(message)
     }
diff --git a/src/lib.rs b/src/lib.rs
index 1ef11378..759dea2f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -189,6 +189,7 @@ mod platform;
 mod sandbox;
 
 pub mod settings;
+pub mod window;
 
 pub use application::Application;
 pub use platform::*;
diff --git a/src/settings.rs b/src/settings.rs
index e20edc97..77c7e0b9 100644
--- a/src/settings.rs
+++ b/src/settings.rs
@@ -1,14 +1,15 @@
 //! Configure your application.
+use crate::window;
 
 /// The settings of an application.
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
 pub struct Settings {
-    /// The [`Window`] settings.
+    /// The window settings.
     ///
     /// They will be ignored on the Web.
     ///
     /// [`Window`]: struct.Window.html
-    pub window: Window,
+    pub window: window::Settings,
 
     /// The bytes of the font that will be used by default.
     ///
@@ -17,29 +18,6 @@ pub struct Settings {
     pub default_font: Option<&'static [u8]>,
 }
 
-/// The window settings of an application.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub struct Window {
-    /// The size of the window.
-    pub size: (u32, u32),
-
-    /// Whether the window should be resizable or not.
-    pub resizable: bool,
-
-    /// Whether the window should have a border, a title bar, etc. or not.
-    pub decorations: bool,
-}
-
-impl Default for Window {
-    fn default() -> Window {
-        Window {
-            size: (1024, 768),
-            resizable: true,
-            decorations: true,
-        }
-    }
-}
-
 #[cfg(not(target_arch = "wasm32"))]
 impl From<Settings> for iced_winit::Settings {
     fn from(settings: Settings) -> iced_winit::Settings {
diff --git a/src/window.rs b/src/window.rs
new file mode 100644
index 00000000..54ea2a02
--- /dev/null
+++ b/src/window.rs
@@ -0,0 +1,6 @@
+//! Configure the window of your application in native platforms.
+mod mode;
+mod settings;
+
+pub use mode::Mode;
+pub use settings::Settings;
diff --git a/src/window/mode.rs b/src/window/mode.rs
new file mode 100644
index 00000000..37464711
--- /dev/null
+++ b/src/window/mode.rs
@@ -0,0 +1,9 @@
+/// 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,
+}
diff --git a/src/window/settings.rs b/src/window/settings.rs
new file mode 100644
index 00000000..a31d2af2
--- /dev/null
+++ b/src/window/settings.rs
@@ -0,0 +1,22 @@
+/// The window settings of an application.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub struct Settings {
+    /// The size of the window.
+    pub size: (u32, u32),
+
+    /// Whether the window should be resizable or not.
+    pub resizable: bool,
+
+    /// Whether the window should have a border, a title bar, etc. or not.
+    pub decorations: bool,
+}
+
+impl Default for Settings {
+    fn default() -> Settings {
+        Settings {
+            size: (1024, 768),
+            resizable: true,
+            decorations: true,
+        }
+    }
+}
diff --git a/winit/src/application.rs b/winit/src/application.rs
index 3de0476f..9e8eaebb 100644
--- a/winit/src/application.rs
+++ b/winit/src/application.rs
@@ -2,7 +2,7 @@ use crate::{
     conversion,
     input::{keyboard, mouse},
     subscription, window, Cache, Clipboard, Command, Debug, Element, Event,
-    MouseCursor, Settings, Size, Subscription, UserInterface,
+    Mode, MouseCursor, Settings, Size, Subscription, UserInterface,
 };
 
 /// An interactive, native cross-platform application.
@@ -80,8 +80,8 @@ pub trait Application: Sized {
     /// By default, an application will run in windowed mode.
     ///
     /// [`Application`]: trait.Application.html
-    fn mode(&self) -> window::Mode {
-        window::Mode::Windowed
+    fn mode(&self) -> Mode {
+        Mode::Windowed
     }
 
     /// Runs the [`Application`].
diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs
index 16ed7547..725b2d86 100644
--- a/winit/src/conversion.rs
+++ b/winit/src/conversion.rs
@@ -7,23 +7,25 @@ use crate::{
         keyboard::{KeyCode, ModifiersState},
         mouse, ButtonState,
     },
-    window, MouseCursor,
+    Mode, MouseCursor,
 };
 
-/// Convert a `Mode` from [`iced_native`] to a [`winit`] fullscreen mode.
+/// Converts a [`Mode`] to a [`winit`] fullscreen mode.
+///
+/// [`Mode`]:
 pub fn fullscreen(
     monitor: winit::monitor::MonitorHandle,
-    mode: window::Mode,
+    mode: Mode,
 ) -> Option<winit::window::Fullscreen> {
     match mode {
-        window::Mode::Windowed => None,
-        window::Mode::Fullscreen => {
+        Mode::Windowed => None,
+        Mode::Fullscreen => {
             Some(winit::window::Fullscreen::Borderless(monitor))
         }
     }
 }
 
-/// Convert a `MouseCursor` from [`iced_native`] to a [`winit`] cursor icon.
+/// Converts a `MouseCursor` from [`iced_native`] to a [`winit`] cursor icon.
 ///
 /// [`winit`]: https://github.com/rust-windowing/winit
 /// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
@@ -39,7 +41,7 @@ pub fn mouse_cursor(mouse_cursor: MouseCursor) -> winit::window::CursorIcon {
     }
 }
 
-/// Convert a `MouseButton` from [`winit`] to an [`iced_native`] mouse button.
+/// Converts a `MouseButton` from [`winit`] to an [`iced_native`] mouse button.
 ///
 /// [`winit`]: https://github.com/rust-windowing/winit
 /// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
@@ -52,7 +54,7 @@ pub fn mouse_button(mouse_button: winit::event::MouseButton) -> mouse::Button {
     }
 }
 
-/// Convert an `ElementState` from [`winit`] to an [`iced_native`] button state.
+/// Converts an `ElementState` from [`winit`] to an [`iced_native`] button state.
 ///
 /// [`winit`]: https://github.com/rust-windowing/winit
 /// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
@@ -63,8 +65,8 @@ pub fn button_state(element_state: winit::event::ElementState) -> ButtonState {
     }
 }
 
-/// Convert some `ModifiersState` from [`winit`] to an [`iced_native`] modifiers
-/// state.
+/// Converts some `ModifiersState` from [`winit`] to an [`iced_native`]
+/// modifiers state.
 ///
 /// [`winit`]: https://github.com/rust-windowing/winit
 /// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
@@ -79,7 +81,7 @@ pub fn modifiers_state(
     }
 }
 
-/// Convert a `VirtualKeyCode` from [`winit`] to an [`iced_native`] key code.
+/// Converts a `VirtualKeyCode` from [`winit`] to an [`iced_native`] key code.
 ///
 /// [`winit`]: https://github.com/rust-windowing/winit
 /// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
diff --git a/winit/src/lib.rs b/winit/src/lib.rs
index ffc662fb..9000f977 100644
--- a/winit/src/lib.rs
+++ b/winit/src/lib.rs
@@ -30,6 +30,7 @@ pub mod settings;
 
 mod application;
 mod clipboard;
+mod mode;
 mod subscription;
 
 // We disable debug capabilities on release builds unless the `debug` feature
@@ -42,6 +43,7 @@ mod debug;
 mod debug;
 
 pub use application::Application;
+pub use mode::Mode;
 pub use settings::Settings;
 
 use clipboard::Clipboard;
diff --git a/winit/src/mode.rs b/winit/src/mode.rs
new file mode 100644
index 00000000..37464711
--- /dev/null
+++ b/winit/src/mode.rs
@@ -0,0 +1,9 @@
+/// 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,
+}
-- 
cgit