From 71a45c6cd25937b82d2701f095ecd86ee6bf6d3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Sun, 7 Jan 2024 15:47:25 +0100 Subject: [PATCH 1/7] mobile: create window on initial resume --- crates/bevy_winit/src/lib.rs | 38 ++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index 4f3a34ab71841..69c4a581a15c5 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -696,6 +696,44 @@ pub fn winit_runner(mut app: App) { runner_state.active = ActiveState::WillSuspend; } Event::Resumed => { + #[cfg(any(target_os = "android", target_os = "ios", target_os = "macos"))] + { + if runner_state.active == ActiveState::NotYetStarted { + let mut create_window_system_state: SystemState<( + Commands, + Query<(Entity, &mut Window)>, + EventWriter, + NonSendMut, + NonSendMut, + ResMut, + ResMut, + )> = SystemState::from_world(&mut app.world); + + let ( + commands, + mut windows, + event_writer, + winit_windows, + adapters, + handlers, + accessibility_requested, + ) = create_window_system_state.get_mut(&mut app.world); + + create_windows( + &event_loop, + commands, + windows.iter_mut(), + event_writer, + winit_windows, + adapters, + handlers, + accessibility_requested, + ); + + create_window_system_state.apply(&mut app.world); + } + } + let (mut event_writers, ..) = event_writer_system_state.get_mut(&mut app.world); match runner_state.active { ActiveState::NotYetStarted => { From b4a872c4ce481311491a81aaf68c75104f7adc3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Mon, 8 Jan 2024 21:53:18 +0100 Subject: [PATCH 2/7] don't update on MouseMotion --- crates/bevy_winit/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index 69c4a581a15c5..2ee35a9a7c496 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -682,7 +682,6 @@ pub fn winit_runner(mut app: App) { event: DeviceEvent::MouseMotion { delta: (x, y) }, .. } => { - runner_state.redraw_requested = true; let (mut event_writers, ..) = event_writer_system_state.get_mut(&mut app.world); event_writers.mouse_motion.send(MouseMotion { delta: Vec2::new(x as f32, y as f32), From 104af2992e7b0d5101372a3be4d269d25ca85e75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Mon, 8 Jan 2024 21:53:32 +0100 Subject: [PATCH 3/7] request update on resume --- crates/bevy_winit/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index 2ee35a9a7c496..5aa03ee87a7bc 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -743,6 +743,7 @@ pub fn winit_runner(mut app: App) { } } runner_state.active = ActiveState::Active; + runner_state.redraw_requested = true; #[cfg(target_os = "android")] { // Get windows that are cached but without raw handles. Those window were already created, but got their From 6ecdde6936678ebb01a95c264c697a6edeb9f16c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Mon, 8 Jan 2024 21:53:38 +0100 Subject: [PATCH 4/7] cleanup --- crates/bevy_winit/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index 5aa03ee87a7bc..97563435d97dd 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -858,8 +858,7 @@ fn run_app_update_if_should( app.update(); // decide when to run the next update - let (config, windows) = focused_windows_state.get(&app.world); - let focused = windows.iter().any(|window| window.focused); + let (config, _) = focused_windows_state.get(&app.world); match config.update_mode(focused) { UpdateMode::Continuous => { runner_state.redraw_requested = true; From ea290044507cf79aef1aebeece3c3aaca84ebea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Mon, 8 Jan 2024 21:54:10 +0100 Subject: [PATCH 5/7] request update during plugin initialization --- crates/bevy_winit/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index 97563435d97dd..3d1ab1c41d29f 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -352,6 +352,7 @@ pub fn winit_runner(mut app: App) { app.finish(); app.cleanup(); } + runner_state.redraw_requested = true; if let Some(app_exit_events) = app.world.get_resource::>() { if app_exit_event_reader.read(app_exit_events).last().is_some() { From a14c92c475a70349ac79f596f155c5dd1a47a3c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Mon, 8 Jan 2024 21:55:06 +0100 Subject: [PATCH 6/7] cleanup --- crates/bevy_winit/src/lib.rs | 43 ++++++------------------------------ 1 file changed, 7 insertions(+), 36 deletions(-) diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index 3d1ab1c41d29f..0c17c97e5f206 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -46,7 +46,7 @@ use bevy_window::{PrimaryWindow, RawHandleWrapper}; pub use winit::platform::android::activity as android_activity; use winit::{ - event::{self, DeviceEvent, Event, StartCause, WindowEvent}, + event::{self, DeviceEvent, Event, WindowEvent}, event_loop::{ControlFlow, EventLoop, EventLoopBuilder, EventLoopWindowTarget}, }; @@ -364,42 +364,13 @@ pub fn winit_runner(mut app: App) { runner_state.redraw_requested = false; match event { - Event::NewEvents(start_cause) => match start_cause { - StartCause::Init => { - #[cfg(any(target_os = "ios", target_os = "macos"))] - { - let ( - commands, - mut windows, - event_writer, - winit_windows, - adapters, - handlers, - accessibility_requested, - ) = create_window_system_state.get_mut(&mut app.world); - - create_windows( - event_loop, - commands, - windows.iter_mut(), - event_writer, - winit_windows, - adapters, - handlers, - accessibility_requested, - ); - - create_window_system_state.apply(&mut app.world); - } + Event::NewEvents(_) => { + if let Some(t) = runner_state.scheduled_update { + let now = Instant::now(); + let remaining = t.checked_duration_since(now).unwrap_or(Duration::ZERO); + runner_state.wait_elapsed = remaining.is_zero(); } - _ => { - if let Some(t) = runner_state.scheduled_update { - let now = Instant::now(); - let remaining = t.checked_duration_since(now).unwrap_or(Duration::ZERO); - runner_state.wait_elapsed = remaining.is_zero(); - } - } - }, + } Event::WindowEvent { event, window_id, .. } => { From 8005aaa4184eb6e5b730878e066040c3806298d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Mon, 8 Jan 2024 21:55:36 +0100 Subject: [PATCH 7/7] request redraw on ABoutToWait instead of after an event --- crates/bevy_winit/src/lib.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index 0c17c97e5f206..920f0103a2835 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -361,9 +361,18 @@ pub fn winit_runner(mut app: App) { } } } - runner_state.redraw_requested = false; match event { + Event::AboutToWait => { + if runner_state.redraw_requested { + let (_, winit_windows, _, _) = + event_writer_system_state.get_mut(&mut app.world); + for window in winit_windows.windows.values() { + window.request_redraw(); + } + } + runner_state.redraw_requested = false; + } Event::NewEvents(_) => { if let Some(t) = runner_state.scheduled_update { let now = Instant::now(); @@ -758,12 +767,6 @@ pub fn winit_runner(mut app: App) { } _ => (), } - if runner_state.redraw_requested { - let (_, winit_windows, _, _) = event_writer_system_state.get_mut(&mut app.world); - for window in winit_windows.windows.values() { - window.request_redraw(); - } - } }; trace!("starting winit event loop");