@@ -13,7 +13,10 @@ pub use winit_windows::*;
1313use bevy_app:: { App , AppExit , CoreStage , Events , ManualEventReader , Plugin } ;
1414use bevy_ecs:: { system:: IntoExclusiveSystem , world:: World } ;
1515use bevy_math:: { ivec2, DVec2 , Vec2 } ;
16- use bevy_utils:: tracing:: { error, trace, warn} ;
16+ use bevy_utils:: {
17+ tracing:: { error, trace, warn} ,
18+ Duration , Instant ,
19+ } ;
1720use bevy_window:: {
1821 AppLifecycle , CreateWindow , CursorEntered , CursorLeft , CursorMoved , FileDragAndDrop , OpenFile ,
1922 ReceivedCharacter , WindowBackendScaleFactorChanged , WindowCloseRequested , WindowCreated ,
@@ -234,10 +237,14 @@ pub fn winit_runner_any_thread(app: App) {
234237#[ cfg( target_os = "ios" ) ]
235238pub struct Idiom ( pub winit:: platform:: ios:: Idiom ) ;
236239
240+ #[ derive( Clone , Copy , PartialEq , Default ) ]
241+ pub struct AppUpdateInterval ( pub Duration ) ;
242+
237243pub fn winit_runner_with ( mut app : App , mut event_loop : EventLoop < ( ) > ) {
238244 let mut create_window_event_reader = ManualEventReader :: < CreateWindow > :: default ( ) ;
239245 let mut app_exit_event_reader = ManualEventReader :: < AppExit > :: default ( ) ;
240- let mut active = true ;
246+ let mut app_update = false ;
247+ let mut update_interval = AppUpdateInterval :: default ( ) ;
241248 app. world
242249 . insert_non_send_resource ( event_loop. create_proxy ( ) ) ;
243250 #[ cfg( target_os = "ios" ) ]
@@ -254,12 +261,6 @@ pub fn winit_runner_with(mut app: App, mut event_loop: EventLoop<()>) {
254261 let event_handler = move |event : Event < ( ) > ,
255262 event_loop : & EventLoopWindowTarget < ( ) > ,
256263 control_flow : & mut ControlFlow | {
257- * control_flow = if active {
258- ControlFlow :: Poll
259- } else {
260- ControlFlow :: Wait
261- } ;
262-
263264 if let Some ( app_exit_events) = app. world . get_resource_mut :: < Events < AppExit > > ( ) {
264265 if app_exit_event_reader
265266 . iter ( & app_exit_events)
@@ -269,8 +270,35 @@ pub fn winit_runner_with(mut app: App, mut event_loop: EventLoop<()>) {
269270 * control_flow = ControlFlow :: Exit ;
270271 }
271272 }
272-
273273 match event {
274+ event:: Event :: NewEvents ( cause) => {
275+ let new_update_interval = app
276+ . world
277+ . get_resource :: < AppUpdateInterval > ( )
278+ . copied ( )
279+ . unwrap_or_default ( ) ;
280+
281+ if new_update_interval. 0 . is_zero ( ) {
282+ app_update = true ;
283+ * control_flow = ControlFlow :: Poll ;
284+ } else if let Some ( start) = match cause {
285+ event:: StartCause :: Init => Some ( Instant :: now ( ) + new_update_interval. 0 ) ,
286+ event:: StartCause :: ResumeTimeReached {
287+ requested_resume, ..
288+ } => Some ( requested_resume + new_update_interval. 0 ) ,
289+ _ => {
290+ if new_update_interval != update_interval {
291+ Some ( Instant :: now ( ) + new_update_interval. 0 )
292+ } else {
293+ None
294+ }
295+ }
296+ } {
297+ app_update = true ;
298+ * control_flow = ControlFlow :: WaitUntil ( start + new_update_interval. 0 ) ;
299+ }
300+ update_interval = new_update_interval;
301+ }
274302 event:: Event :: WindowEvent {
275303 event,
276304 window_id : winit_window_id,
@@ -455,7 +483,6 @@ pub fn winit_runner_with(mut app: App, mut event_loop: EventLoop<()>) {
455483 ) ;
456484 }
457485 WindowEvent :: Focused ( focused) => {
458- active = focused;
459486 window. update_focused_status_from_backend ( focused) ;
460487 let mut focused_events =
461488 world. get_resource_mut :: < Events < WindowFocused > > ( ) . unwrap ( ) ;
@@ -513,31 +540,27 @@ pub fn winit_runner_with(mut app: App, mut event_loop: EventLoop<()>) {
513540 . get_resource_mut :: < Events < AppLifecycle > > ( )
514541 . unwrap ( ) ;
515542 events. send ( AppLifecycle :: Suspended ) ;
516- active = false ;
517543 }
518544 event:: Event :: Resumed => {
519545 let mut events = app
520546 . world
521547 . get_resource_mut :: < Events < AppLifecycle > > ( )
522548 . unwrap ( ) ;
523549 events. send ( AppLifecycle :: Resumed ) ;
524- active = true ;
525550 }
526551 event:: Event :: Background => {
527552 let mut events = app
528553 . world
529554 . get_resource_mut :: < Events < AppLifecycle > > ( )
530555 . unwrap ( ) ;
531556 events. send ( AppLifecycle :: Background ) ;
532- active = false ;
533557 }
534558 event:: Event :: Foreground => {
535559 let mut events = app
536560 . world
537561 . get_resource_mut :: < Events < AppLifecycle > > ( )
538562 . unwrap ( ) ;
539563 events. send ( AppLifecycle :: Foreground ) ;
540- active = true ;
541564 }
542565 event:: Event :: OpenFile ( path_buf) => {
543566 let mut events = app. world . get_resource_mut :: < Events < OpenFile > > ( ) . unwrap ( ) ;
@@ -549,7 +572,10 @@ pub fn winit_runner_with(mut app: App, mut event_loop: EventLoop<()>) {
549572 event_loop,
550573 & mut create_window_event_reader,
551574 ) ;
552- app. update ( ) ;
575+ if app_update {
576+ app. update ( ) ;
577+ app_update = false ;
578+ }
553579 }
554580 _ => ( ) ,
555581 }
0 commit comments