diff options
-rw-r--r-- | glutin/src/application.rs | 95 | ||||
-rw-r--r-- | winit/src/application.rs | 79 |
2 files changed, 77 insertions, 97 deletions
diff --git a/glutin/src/application.rs b/glutin/src/application.rs index 0f748ecb..26e7b852 100644 --- a/glutin/src/application.rs +++ b/glutin/src/application.rs @@ -1,5 +1,5 @@ //! Create interactive, native cross-platform applications. -use crate::{mouse, Error, Executor, Runtime, Size}; +use crate::{mouse, Error, Executor, Runtime}; pub use iced_winit::application::{self, Application}; @@ -7,7 +7,7 @@ use iced_graphics::window; use iced_winit::conversion; use iced_winit::futures; use iced_winit::futures::channel::mpsc; -use iced_winit::{Cache, Clipboard, Debug, Proxy, Settings, UserInterface}; +use iced_winit::{Cache, Clipboard, Debug, Proxy, Settings}; use glutin::window::Window; use std::mem::ManuallyDrop; @@ -137,18 +137,18 @@ async fn run_instance<A, E, C>( use glutin::event; use iced_winit::futures::stream::StreamExt; - let mut state = application::State::new(&application, context.window()); - let mut viewport_version = state.viewport_version(); - let clipboard = Clipboard::new(context.window()); - let mut user_interface = ManuallyDrop::new(build_user_interface( - &mut application, - Cache::default(), - &mut renderer, - state.logical_size(), - &mut debug, - )); + let mut state = application::State::new(&application, context.window()); + let mut viewport_version = state.viewport_version(); + let mut user_interface = + ManuallyDrop::new(application::build_user_interface( + &mut application, + Cache::default(), + &mut renderer, + state.logical_size(), + &mut debug, + )); let mut primitive = user_interface.draw(&mut renderer, state.cursor_position()); @@ -178,47 +178,36 @@ async fn run_instance<A, E, C>( events.clear(); debug.event_processing_finished(); - if messages.is_empty() { - debug.draw_started(); - primitive = user_interface - .draw(&mut renderer, state.cursor_position()); - debug.draw_finished(); - } else { + if !messages.is_empty() { let cache = ManuallyDrop::into_inner(user_interface).into_cache(); - for message in messages.drain(..) { - debug.log_message(&message); - - debug.update_started(); - let command = - runtime.enter(|| application.update(message)); - debug.update_finished(); - - runtime.spawn(command); - } - - // Update subscriptions - let subscription = application.subscription(); - runtime.track(subscription); + // Update application + application::update( + &mut application, + &mut runtime, + &mut debug, + messages, + ); // Update window state.synchronize(&application, context.window()); - user_interface = ManuallyDrop::new(build_user_interface( - &mut application, - cache, - &mut renderer, - state.logical_size(), - &mut debug, - )); - - debug.draw_started(); - primitive = user_interface - .draw(&mut renderer, state.cursor_position()); - debug.draw_finished(); + user_interface = + ManuallyDrop::new(application::build_user_interface( + &mut application, + cache, + &mut renderer, + state.logical_size(), + &mut debug, + )); } + debug.draw_started(); + primitive = + user_interface.draw(&mut renderer, state.cursor_position()); + debug.draw_finished(); + context.window().request_redraw(); } event::Event::UserEvent(message) => { @@ -304,21 +293,3 @@ async fn run_instance<A, E, C>( // Manually drop the user interface drop(ManuallyDrop::into_inner(user_interface)); } - -fn build_user_interface<'a, A: Application>( - application: &'a mut A, - cache: Cache, - renderer: &mut A::Renderer, - size: Size, - debug: &mut Debug, -) -> UserInterface<'a, A::Message, A::Renderer> { - debug.view_started(); - let view = application.view(); - debug.view_finished(); - - debug.layout_started(); - let user_interface = UserInterface::build(view, size, cache, renderer); - debug.layout_finished(); - - user_interface -} diff --git a/winit/src/application.rs b/winit/src/application.rs index 3a41a0e4..8e97706f 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -214,19 +214,20 @@ async fn run_instance<A, E, C>( use iced_futures::futures::stream::StreamExt; use winit::event; - let mut state = State::new(&application, &window); - let surface = compositor.create_surface(&window); - let physical_size = state.physical_size(); + let clipboard = Clipboard::new(&window); + let mut state = State::new(&application, &window); let mut viewport_version = state.viewport_version(); - let mut swap_chain = compositor.create_swap_chain( - &surface, - physical_size.width, - physical_size.height, - ); + let mut swap_chain = { + let physical_size = state.physical_size(); - let clipboard = Clipboard::new(&window); + compositor.create_swap_chain( + &surface, + physical_size.width, + physical_size.height, + ) + }; let mut user_interface = ManuallyDrop::new(build_user_interface( &mut application, @@ -264,29 +265,17 @@ async fn run_instance<A, E, C>( events.clear(); debug.event_processing_finished(); - if messages.is_empty() { - debug.draw_started(); - primitive = user_interface - .draw(&mut renderer, state.cursor_position()); - debug.draw_finished(); - } else { + if !messages.is_empty() { let cache = ManuallyDrop::into_inner(user_interface).into_cache(); - for message in messages.drain(..) { - debug.log_message(&message); - - debug.update_started(); - let command = - runtime.enter(|| application.update(message)); - debug.update_finished(); - - runtime.spawn(command); - } - - // Update subscriptions - let subscription = application.subscription(); - runtime.track(subscription); + // Update application + update( + &mut application, + &mut runtime, + &mut debug, + messages, + ); // Update window state.synchronize(&application, &window); @@ -298,13 +287,13 @@ async fn run_instance<A, E, C>( state.logical_size(), &mut debug, )); - - debug.draw_started(); - primitive = user_interface - .draw(&mut renderer, state.cursor_position()); - debug.draw_finished(); } + debug.draw_started(); + primitive = + user_interface.draw(&mut renderer, state.cursor_position()); + debug.draw_finished(); + window.request_redraw(); } event::Event::UserEvent(message) => { @@ -412,7 +401,7 @@ pub fn requests_exit( } } -fn build_user_interface<'a, A: Application>( +pub fn build_user_interface<'a, A: Application>( application: &'a mut A, cache: Cache, renderer: &mut A::Renderer, @@ -429,3 +418,23 @@ fn build_user_interface<'a, A: Application>( user_interface } + +pub fn update<A: Application, E: Executor>( + application: &mut A, + runtime: &mut Runtime<E, Proxy<A::Message>, A::Message>, + debug: &mut Debug, + messages: Vec<A::Message>, +) { + for message in messages { + debug.log_message(&message); + + debug.update_started(); + let command = runtime.enter(|| application.update(message)); + debug.update_finished(); + + runtime.spawn(command); + } + + let subscription = application.subscription(); + runtime.track(subscription); +} |