event loop: Decouple event timeout from event type
This commit is contained in:
		@ -44,11 +44,15 @@ pub mod driver;
 | 
			
		||||
// and the loop parametrized over them.
 | 
			
		||||
use crate::main::Commands;
 | 
			
		||||
use crate::state;
 | 
			
		||||
use crate::state::Event;
 | 
			
		||||
use std::cmp;
 | 
			
		||||
use std::time::{ Duration, Instant };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
pub trait Event: Clone {
 | 
			
		||||
    fn get_timeout_reached(&self) -> Option<Instant>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// This keeps the state of the tracker loop between iterations
 | 
			
		||||
#[derive(Clone)]
 | 
			
		||||
struct State {
 | 
			
		||||
@ -75,7 +79,7 @@ impl State {
 | 
			
		||||
/// It returns the new state, and the message to send onwards.
 | 
			
		||||
fn handle_event(
 | 
			
		||||
    mut loop_state: State,
 | 
			
		||||
    event: Event,
 | 
			
		||||
    event: state::Event,
 | 
			
		||||
    now: Instant,
 | 
			
		||||
) -> (State, Commands) {
 | 
			
		||||
    // Calculate changes to send to the consumer,
 | 
			
		||||
@ -93,8 +97,8 @@ fn handle_event(
 | 
			
		||||
        .get_commands_to_reach(&new_outcome);
 | 
			
		||||
    
 | 
			
		||||
    // Timeout events are special: they affect the scheduled timeout.
 | 
			
		||||
    loop_state.scheduled_wakeup = match event {
 | 
			
		||||
        Event::TimeoutReached(when) => {
 | 
			
		||||
    loop_state.scheduled_wakeup = match event.get_timeout_reached() {
 | 
			
		||||
        Some(when) => {
 | 
			
		||||
            if when > now {
 | 
			
		||||
                // Special handling for scheduled events coming in early.
 | 
			
		||||
                // Wait at least 10 ms to avoid Zeno's paradox.
 | 
			
		||||
@ -112,7 +116,7 @@ fn handle_event(
 | 
			
		||||
                None
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        _ => loop_state.scheduled_wakeup.clone(),
 | 
			
		||||
        None => loop_state.scheduled_wakeup.clone(),
 | 
			
		||||
    };
 | 
			
		||||
    
 | 
			
		||||
    // Reschedule timeout if the new state calls for it.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								src/state.rs
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/state.rs
									
									
									
									
									
								
							@ -7,6 +7,7 @@
 | 
			
		||||
 | 
			
		||||
use crate::animation;
 | 
			
		||||
use crate::debug;
 | 
			
		||||
use crate::event_loop;
 | 
			
		||||
use crate::imservice::{ ContentHint, ContentPurpose };
 | 
			
		||||
use crate::layout::ArrangementKind;
 | 
			
		||||
use crate::main;
 | 
			
		||||
@ -80,6 +81,15 @@ pub enum Event {
 | 
			
		||||
    TimeoutReached(Instant),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl event_loop::Event for Event {
 | 
			
		||||
    fn get_timeout_reached(&self) -> Option<Instant> {
 | 
			
		||||
        match self {
 | 
			
		||||
            Self::TimeoutReached(when) => Some(*when),
 | 
			
		||||
            _ => None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<InputMethod> for Event {
 | 
			
		||||
    fn from(im: InputMethod) -> Self {
 | 
			
		||||
        Self::InputMethod(im)
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user