diff --git a/winit/src/lib.rs b/winit/src/lib.rs index 802b446b..b239260b 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -554,7 +554,7 @@ async fn run_instance
( log::info!("System theme: {system_theme:?}"); - loop { + 'next_event: loop { // Empty the queue if possible let event = if let Ok(event) = event_receiver.try_next() { event @@ -770,7 +770,8 @@ async fn run_instance
( event: event::WindowEvent::RedrawRequested, .. } => { - let Some(compositor) = &mut compositor else { + let Some(mut current_compositor) = compositor.as_mut() + else { continue; }; @@ -803,7 +804,7 @@ async fn run_instance
( ); layout_span.finish(); - compositor.configure_surface( + current_compositor.configure_surface( &mut window.surface, physical_size.width, physical_size.height, @@ -860,7 +861,11 @@ async fn run_instance
( }) .collect(); - update(&mut program, &mut runtime, &mut messages); + let actions = update( + &mut program, + &mut runtime, + &mut messages, + ); user_interfaces = ManuallyDrop::new(build_user_interfaces( @@ -869,6 +874,30 @@ async fn run_instance
( caches, )); + for action in actions { + run_action( + action, + &program, + &mut runtime, + &mut compositor, + &mut events, + &mut messages, + &mut clipboard, + &mut control_sender, + &mut user_interfaces, + &mut window_manager, + &mut ui_caches, + &mut is_window_opening, + &mut system_theme, + ); + } + + let Some(next_compositor) = compositor.as_mut() + else { + continue 'next_event; + }; + + current_compositor = next_compositor; window = window_manager.get_mut(id).unwrap(); interface = user_interfaces.get_mut(&id).unwrap(); }; @@ -904,7 +933,7 @@ async fn run_instance
( window.draw_preedit(); let present_span = debug::present(id); - match compositor.present( + match current_compositor.present( &mut window.renderer, &mut window.surface, window.state.viewport(), @@ -1119,7 +1148,11 @@ async fn run_instance
( .map(|(id, ui)| (id, ui.into_cache())) .collect(); - update(&mut program, &mut runtime, &mut messages); + let actions = update( + &mut program, + &mut runtime, + &mut messages, + ); user_interfaces = ManuallyDrop::new(build_user_interfaces( @@ -1127,6 +1160,24 @@ async fn run_instance
(
&mut window_manager,
cached_interfaces,
));
+
+ for action in actions {
+ run_action(
+ action,
+ &program,
+ &mut runtime,
+ &mut compositor,
+ &mut events,
+ &mut messages,
+ &mut clipboard,
+ &mut control_sender,
+ &mut user_interfaces,
+ &mut window_manager,
+ &mut ui_caches,
+ &mut is_window_opening,
+ &mut system_theme,
+ );
+ }
}
if let Some(redraw_at) = window_manager.redraw_at() {
@@ -1176,14 +1227,36 @@ fn update ,
runtime: &mut Runtime