diff --git a/src/event_loop/mod.rs b/src/event_loop/mod.rs index 7a494aca..e5581468 100644 --- a/src/event_loop/mod.rs +++ b/src/event_loop/mod.rs @@ -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; +} + + /// 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. diff --git a/src/state.rs b/src/state.rs index dbead0c2..84b91885 100644 --- a/src/state.rs +++ b/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 { + match self { + Self::TimeoutReached(when) => Some(*when), + _ => None, + } + } +} + impl From for Event { fn from(im: InputMethod) -> Self { Self::InputMethod(im)