Allow Application::run to return on native platforms

This commit is contained in:
Andreas Hofstadler 2021-11-07 14:32:18 +01:00 committed by Héctor Ramón Jiménez
parent aeec0375f0
commit 08c771fa70
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
3 changed files with 13 additions and 7 deletions

View file

@ -11,6 +11,7 @@ use iced_winit::futures;
use iced_winit::futures::channel::mpsc; use iced_winit::futures::channel::mpsc;
use iced_winit::{Cache, Clipboard, Debug, Proxy, Settings}; use iced_winit::{Cache, Clipboard, Debug, Proxy, Settings};
use crate::glutin::platform::run_return::EventLoopExtRunReturn;
use glutin::window::Window; use glutin::window::Window;
use std::mem::ManuallyDrop; use std::mem::ManuallyDrop;
@ -33,7 +34,7 @@ where
let mut debug = Debug::new(); let mut debug = Debug::new();
debug.startup_started(); debug.startup_started();
let event_loop = EventLoop::with_user_event(); let mut event_loop = EventLoop::with_user_event();
let mut proxy = event_loop.create_proxy(); let mut proxy = event_loop.create_proxy();
let mut runtime = { let mut runtime = {
@ -115,7 +116,7 @@ where
let mut context = task::Context::from_waker(task::noop_waker_ref()); let mut context = task::Context::from_waker(task::noop_waker_ref());
event_loop.run(move |event, _, control_flow| { event_loop.run_return(move |event, _, control_flow| {
use glutin::event_loop::ControlFlow; use glutin::event_loop::ControlFlow;
if let ControlFlow::Exit = control_flow { if let ControlFlow::Exit = control_flow {
@ -148,6 +149,8 @@ where
}; };
} }
}); });
Ok(())
} }
async fn run_instance<A, E, C>( async fn run_instance<A, E, C>(

View file

@ -188,9 +188,9 @@ pub trait Application: Sized {
/// Runs the [`Application`]. /// Runs the [`Application`].
/// ///
/// On native platforms, this method will take control of the current thread /// On native platforms, this method will take control of the current thread
/// and __will NOT return__ unless there is an [`Error`] during startup. /// until the event loop of the main window exits.
/// ///
/// It should probably be that last thing you call in your `main` function. /// Does never return on the web platform
/// ///
/// [`Error`]: crate::Error /// [`Error`]: crate::Error
fn run(settings: Settings<Self::Flags>) -> crate::Result fn run(settings: Settings<Self::Flags>) -> crate::Result

View file

@ -17,6 +17,7 @@ use iced_graphics::window;
use iced_native::program::Program; use iced_native::program::Program;
use iced_native::{Cache, UserInterface}; use iced_native::{Cache, UserInterface};
use crate::winit::platform::run_return::EventLoopExtRunReturn;
use std::mem::ManuallyDrop; use std::mem::ManuallyDrop;
/// An interactive, native cross-platform application. /// An interactive, native cross-platform application.
@ -119,7 +120,7 @@ where
let mut debug = Debug::new(); let mut debug = Debug::new();
debug.startup_started(); debug.startup_started();
let event_loop = EventLoop::with_user_event(); let mut event_loop = EventLoop::with_user_event();
let mut proxy = event_loop.create_proxy(); let mut proxy = event_loop.create_proxy();
let mut runtime = { let mut runtime = {
@ -178,7 +179,7 @@ where
let mut context = task::Context::from_waker(task::noop_waker_ref()); let mut context = task::Context::from_waker(task::noop_waker_ref());
event_loop.run(move |event, _, control_flow| { event_loop.run_return(move |event, _, control_flow| {
use winit::event_loop::ControlFlow; use winit::event_loop::ControlFlow;
if let ControlFlow::Exit = control_flow { if let ControlFlow::Exit = control_flow {
@ -211,6 +212,8 @@ where
}; };
} }
}); });
Ok(())
} }
async fn run_instance<A, E, C>( async fn run_instance<A, E, C>(
@ -401,7 +404,7 @@ async fn run_instance<A, E, C>(
Err(error) => match error { Err(error) => match error {
// This is an unrecoverable error. // This is an unrecoverable error.
window::SurfaceError::OutOfMemory => { window::SurfaceError::OutOfMemory => {
panic!("{}", error); panic!("{:?}", error);
} }
_ => { _ => {
debug.render_finished(); debug.render_finished();