@@ -35,7 +35,9 @@ use crate::{
3535} ;
3636
3737#[ cfg( feature = "trace" ) ]
38- use crate :: { MessageSent , Trace , TraceToggle , TracedEvent , UniversalTraceToggle } ;
38+ use crate :: {
39+ Debug , DebugRoster , MessageSent , Trace , TraceToggle , TracedEvent , UniversalTraceToggle ,
40+ } ;
3941
4042pub type Seq = u32 ;
4143
@@ -486,9 +488,66 @@ impl ManageInput for World {
486488 & mut self ,
487489 source : Entity ,
488490 ) -> Result < Option < Input < T > > , OperationError > {
489- let mut storage = self . get_mut :: < InputStorage < T > > ( source) . or_broken ( ) ?;
490- let input = storage. reverse_queue . pop ( ) ;
491- Ok ( input)
491+ #[ cfg( not( feature = "trace" ) ) ]
492+ {
493+ let mut storage = self . get_mut :: < InputStorage < T > > ( source) . or_broken ( ) ?;
494+ let input = storage. reverse_queue . pop ( ) ;
495+ return Ok ( input) ;
496+ }
497+
498+ #[ cfg( feature = "trace" ) ]
499+ {
500+ self . get_resource_or_init :: < Debug > ( ) ;
501+ self . resource_scope :: < Debug , _ > ( |world, mut debug| {
502+ if !debug. is_active ( ) {
503+ // Revert to the usual implementation of popping the next
504+ let mut storage = world. get_mut :: < InputStorage < T > > ( source) . or_broken ( ) ?;
505+ let input = storage. reverse_queue . pop ( ) ;
506+ return Ok ( input) ;
507+ } else {
508+ world. get_resource_or_init :: < DebugRoster > ( ) ;
509+ world. resource_scope :: < DebugRoster , _ > ( |world, mut debug_roster| {
510+ let storage = world. get :: < InputStorage < T > > ( source) . or_broken ( ) ?;
511+ let rev_next = storage. reverse_queue . iter ( ) . rev ( ) . position ( |input| {
512+ let session = input. session ;
513+ let seq = input. seq ;
514+
515+ // Evaluate whether we have hit a breakpoint. This will
516+ // pause the current session if we have.
517+ debug. evaluate_break ( session, source, world) ;
518+
519+ let mut is_paused = debug. is_paused ( session, world) ;
520+ if is_paused {
521+ // We need to track this request inside the debug roster
522+ if debug_roster. is_allowed ( RequestId {
523+ session,
524+ source,
525+ seq,
526+ } ) {
527+ // If this input has been given permission to
528+ // to be taken, change is_paused to false so
529+ // it will be passed along.
530+ is_paused = false ;
531+ }
532+ }
533+
534+ !is_paused
535+ } ) ;
536+
537+ debug. notify_session_changes ( world) ;
538+
539+ if let Some ( rev_next) = rev_next {
540+ let mut storage =
541+ world. get_mut :: < InputStorage < T > > ( source) . or_broken ( ) ?;
542+ let next = storage. reverse_queue . len ( ) - rev_next - 1 ;
543+ return Ok ( Some ( storage. reverse_queue . remove ( next) ) ) ;
544+ } else {
545+ return Ok ( None ) ;
546+ }
547+ } )
548+ }
549+ } )
550+ }
492551 }
493552
494553 fn cleanup_inputs < T : ' static + Send + Sync > (
0 commit comments