From 33d80b5a0b8b5b2837c99be2a152bdeb73ca60c8 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 12 Nov 2020 02:00:08 +0100 Subject: Return `event::Status` in `UserInterface::update` --- winit/src/application.rs | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) (limited to 'winit/src/application.rs') diff --git a/winit/src/application.rs b/winit/src/application.rs index c1d86471..5f51a0cb 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -241,30 +241,23 @@ async fn run_instance( user_interface.draw(&mut renderer, state.cursor_position()); let mut mouse_interaction = mouse::Interaction::default(); - let mut events = Vec::new(); - let mut external_messages = Vec::new(); + let mut messages = Vec::new(); + let mut is_clean = true; debug.startup_finished(); while let Some(event) = receiver.next().await { match event { + event::Event::NewEvents(_) => { + debug.event_processing_started(); + } event::Event::MainEventsCleared => { - if events.is_empty() && external_messages.is_empty() { + debug.event_processing_finished(); + + if is_clean && messages.is_empty() { continue; } - debug.event_processing_started(); - let mut messages = user_interface.update( - &events, - state.cursor_position(), - clipboard.as_ref().map(|c| c as _), - &mut renderer, - ); - - messages.extend(external_messages.drain(..)); - events.clear(); - debug.event_processing_finished(); - if !messages.is_empty() { let cache = ManuallyDrop::into_inner(user_interface).into_cache(); @@ -274,7 +267,7 @@ async fn run_instance( &mut application, &mut runtime, &mut debug, - messages, + &mut messages, ); // Update window @@ -295,9 +288,10 @@ async fn run_instance( debug.draw_finished(); window.request_redraw(); + is_clean = true; } event::Event::UserEvent(message) => { - external_messages.push(message); + messages.push(message); } event::Event::RedrawRequested(_) => { debug.render_started(); @@ -365,8 +359,17 @@ async fn run_instance( state.scale_factor(), state.modifiers(), ) { - events.push(event.clone()); + let _ = user_interface.update( + event.clone(), + state.cursor_position(), + clipboard.as_ref().map(|c| c as _), + &mut renderer, + &mut messages, + ); + runtime.broadcast(event); + + is_clean = false; } } _ => {} @@ -437,9 +440,9 @@ pub fn update( application: &mut A, runtime: &mut Runtime, A::Message>, debug: &mut Debug, - messages: Vec, + messages: &mut Vec, ) { - for message in messages { + for message in messages.drain(..) { debug.log_message(&message); debug.update_started(); -- cgit From 69c50c851193348ed3aab746678741f3cdda9fb3 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 12 Nov 2020 02:22:22 +0100 Subject: Introduce `event::Status` to `Subscription` --- winit/src/application.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'winit/src/application.rs') diff --git a/winit/src/application.rs b/winit/src/application.rs index 5f51a0cb..5c48fb32 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -359,7 +359,7 @@ async fn run_instance( state.scale_factor(), state.modifiers(), ) { - let _ = user_interface.update( + let event_status = user_interface.update( event.clone(), state.cursor_position(), clipboard.as_ref().map(|c| c as _), @@ -367,7 +367,7 @@ async fn run_instance( &mut messages, ); - runtime.broadcast(event); + runtime.broadcast((event, event_status)); is_clean = false; } -- cgit From bf2d2561b8dde3e160438428b59c03c38a5f752a Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 12 Nov 2020 02:51:26 +0100 Subject: Batch event processing in `UserInterface::update` --- winit/src/application.rs | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'winit/src/application.rs') diff --git a/winit/src/application.rs b/winit/src/application.rs index 5c48fb32..ded60366 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -241,21 +241,32 @@ async fn run_instance( user_interface.draw(&mut renderer, state.cursor_position()); let mut mouse_interaction = mouse::Interaction::default(); + let mut events = Vec::new(); let mut messages = Vec::new(); - let mut is_clean = true; debug.startup_finished(); while let Some(event) = receiver.next().await { match event { - event::Event::NewEvents(_) => { - debug.event_processing_started(); - } event::Event::MainEventsCleared => { + if events.is_empty() && messages.is_empty() { + continue; + } + + debug.event_processing_started(); + + let statuses = user_interface.update( + &events, + state.cursor_position(), + clipboard.as_ref().map(|c| c as _), + &mut renderer, + &mut messages, + ); + debug.event_processing_finished(); - if is_clean && messages.is_empty() { - continue; + for event in events.drain(..).zip(statuses.into_iter()) { + runtime.broadcast(event); } if !messages.is_empty() { @@ -288,7 +299,6 @@ async fn run_instance( debug.draw_finished(); window.request_redraw(); - is_clean = true; } event::Event::UserEvent(message) => { messages.push(message); @@ -359,17 +369,7 @@ async fn run_instance( state.scale_factor(), state.modifiers(), ) { - let event_status = user_interface.update( - event.clone(), - state.cursor_position(), - clipboard.as_ref().map(|c| c as _), - &mut renderer, - &mut messages, - ); - - runtime.broadcast((event, event_status)); - - is_clean = false; + events.push(event); } } _ => {} -- cgit