diff --git a/glutin/src/application.rs b/glutin/src/application.rs index f474cbba04..3e9d11f9ff 100644 --- a/glutin/src/application.rs +++ b/glutin/src/application.rs @@ -200,6 +200,7 @@ async fn run_instance( let mut cache = user_interface::Cache::default(); let mut state = application::State::new(&application, context.window()); let mut viewport_version = state.viewport_version(); + let mut should_exit = false; application::run_command( &application, @@ -209,6 +210,7 @@ async fn run_instance( init_command, &mut runtime, &mut clipboard, + &mut should_exit, &mut proxy, &mut debug, context.window(), @@ -271,6 +273,7 @@ async fn run_instance( &mut renderer, &mut runtime, &mut clipboard, + &mut should_exit, &mut proxy, &mut debug, &mut messages, @@ -281,8 +284,6 @@ async fn run_instance( // Update window state.synchronize(&application, context.window()); - let should_exit = application.should_exit(); - user_interface = ManuallyDrop::new(application::build_user_interface( &application, diff --git a/native/src/window/action.rs b/native/src/window/action.rs index 283775ba05..da307e97c6 100644 --- a/native/src/window/action.rs +++ b/native/src/window/action.rs @@ -5,6 +5,8 @@ use std::fmt; /// An operation to be performed on some window. pub enum Action { + /// Closes the current window and exits the application. + Close, /// Moves the window with the left mouse button until the button is /// released. /// @@ -54,6 +56,7 @@ impl Action { T: 'static, { match self { + Self::Close => Action::Close, Self::Drag => Action::Drag, Self::Resize { width, height } => Action::Resize { width, height }, Self::Maximize(bool) => Action::Maximize(bool), @@ -70,6 +73,7 @@ impl Action { impl fmt::Debug for Action { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { + Self::Close => write!(f, "Action::Close"), Self::Drag => write!(f, "Action::Drag"), Self::Resize { width, height } => write!( f, diff --git a/src/application.rs b/src/application.rs index 9d6c47e281..f2b7c95574 100644 --- a/src/application.rs +++ b/src/application.rs @@ -270,8 +270,4 @@ where fn scale_factor(&self) -> f64 { self.0.scale_factor() } - - fn should_exit(&self) -> bool { - self.0.should_exit() - } } diff --git a/winit/src/application.rs b/winit/src/application.rs index d17db2cdc9..0f9b562e67 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -93,13 +93,6 @@ where fn scale_factor(&self) -> f64 { 1.0 } - - /// Returns whether the [`Application`] should be terminated. - /// - /// By default, it returns `false`. - fn should_exit(&self) -> bool { - false - } } /// Runs an [`Application`] with an executor, compositor, and the provided @@ -255,6 +248,7 @@ async fn run_instance( let mut clipboard = Clipboard::connect(&window); let mut cache = user_interface::Cache::default(); let mut surface = compositor.create_surface(&window); + let mut should_exit = false; let mut state = State::new(&application, &window); let mut viewport_version = state.viewport_version(); @@ -275,6 +269,7 @@ async fn run_instance( init_command, &mut runtime, &mut clipboard, + &mut should_exit, &mut proxy, &mut debug, &window, @@ -336,6 +331,7 @@ async fn run_instance( &mut renderer, &mut runtime, &mut clipboard, + &mut should_exit, &mut proxy, &mut debug, &mut messages, @@ -346,8 +342,6 @@ async fn run_instance( // Update window state.synchronize(&application, &window); - let should_exit = application.should_exit(); - user_interface = ManuallyDrop::new(build_user_interface( &application, cache, @@ -555,6 +549,7 @@ pub fn update( renderer: &mut A::Renderer, runtime: &mut Runtime, A::Message>, clipboard: &mut Clipboard, + should_exit: &mut bool, proxy: &mut winit::event_loop::EventLoopProxy, debug: &mut Debug, messages: &mut Vec, @@ -578,6 +573,7 @@ pub fn update( command, runtime, clipboard, + should_exit, proxy, debug, window, @@ -598,6 +594,7 @@ pub fn run_command( command: Command, runtime: &mut Runtime, A::Message>, clipboard: &mut Clipboard, + should_exit: &mut bool, proxy: &mut winit::event_loop::EventLoopProxy, debug: &mut Debug, window: &winit::window::Window, @@ -629,6 +626,9 @@ pub fn run_command( } }, command::Action::Window(action) => match action { + window::Action::Close => { + *should_exit = true; + } window::Action::Drag => { let _res = window.drag_window(); } diff --git a/winit/src/window.rs b/winit/src/window.rs index 1e704c5b3d..f6b43a0f96 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -4,6 +4,11 @@ use iced_native::window; pub use window::{Event, Mode}; +/// Closes the current window and exits the application. +pub fn close() -> Command { + Command::single(command::Action::Window(window::Action::Close)) +} + /// Begins dragging the window while the left mouse button is held. pub fn drag() -> Command { Command::single(command::Action::Window(window::Action::Drag))