summaryrefslogtreecommitdiffstats
path: root/winit
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2021-03-30 21:44:19 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2021-03-30 21:44:19 +0200
commit67db13ff7c727254182a8c4474bd962b205e2e99 (patch)
treef7dfba22c64ed4190521b2fde79c5dc5eecc4bed /winit
parent00de9d0c9ba20b313ffb459ed291ea2b85e53d32 (diff)
downloadiced-67db13ff7c727254182a8c4474bd962b205e2e99.tar.gz
iced-67db13ff7c727254182a8c4474bd962b205e2e99.tar.bz2
iced-67db13ff7c727254182a8c4474bd962b205e2e99.zip
Add support for graceful exits in `Application`
- `Settings` now contains an `exit_on_close_request` field - `Application` has a new `should_exit` method
Diffstat (limited to 'winit')
-rw-r--r--winit/src/application.rs23
-rw-r--r--winit/src/settings.rs4
2 files changed, 24 insertions, 3 deletions
diff --git a/winit/src/application.rs b/winit/src/application.rs
index ef6c8463..106d5218 100644
--- a/winit/src/application.rs
+++ b/winit/src/application.rs
@@ -91,6 +91,13 @@ pub trait Application: Program<Clipboard = Clipboard> {
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
@@ -149,10 +156,11 @@ where
application,
compositor,
renderer,
- window,
runtime,
debug,
receiver,
+ window,
+ settings.exit_on_close_request,
));
let mut context = task::Context::from_waker(task::noop_waker_ref());
@@ -196,10 +204,11 @@ async fn run_instance<A, E, C>(
mut application: A,
mut compositor: C,
mut renderer: A::Renderer,
- window: winit::window::Window,
mut runtime: Runtime<E, Proxy<A::Message>, A::Message>,
mut debug: Debug,
mut receiver: mpsc::UnboundedReceiver<winit::event::Event<'_, A::Message>>,
+ window: winit::window::Window,
+ exit_on_close_request: bool,
) where
A: Application + 'static,
E: Executor + 'static,
@@ -279,6 +288,8 @@ async fn run_instance<A, E, C>(
// Update window
state.synchronize(&application, &window);
+ let should_exit = application.should_exit();
+
user_interface = ManuallyDrop::new(build_user_interface(
&mut application,
cache,
@@ -286,6 +297,10 @@ async fn run_instance<A, E, C>(
state.logical_size(),
&mut debug,
));
+
+ if should_exit {
+ break;
+ }
}
debug.draw_started();
@@ -358,7 +373,9 @@ async fn run_instance<A, E, C>(
event: window_event,
..
} => {
- if requests_exit(&window_event, state.modifiers()) {
+ if requests_exit(&window_event, state.modifiers())
+ && exit_on_close_request
+ {
break;
}
diff --git a/winit/src/settings.rs b/winit/src/settings.rs
index 2e8715cd..9ce5cfc5 100644
--- a/winit/src/settings.rs
+++ b/winit/src/settings.rs
@@ -23,6 +23,10 @@ pub struct Settings<Flags> {
///
/// [`Application`]: crate::Application
pub flags: Flags,
+
+ /// Whether the [`Application`] should exit when the user requests the
+ /// window to close (e.g. the user presses the close button).
+ pub exit_on_close_request: bool,
}
/// The window settings of an application.