use std::sync::mpsc; use std::thread; use std::time::Duration; use crossterm::event::{self, Event, KeyEvent}; pub enum AppEvent { Key(KeyEvent), Tick, Resize(#[allow(dead_code)] u16, #[allow(dead_code)] u16), } pub struct EventHandler { rx: mpsc::Receiver, _tx: mpsc::Sender, } impl EventHandler { pub fn new(tick_rate: Duration) -> Self { let (tx, rx) = mpsc::channel(); let _tx = tx.clone(); thread::spawn(move || { loop { if event::poll(tick_rate).unwrap_or(false) { match event::read() { Ok(Event::Key(key)) => { if tx.send(AppEvent::Key(key)).is_err() { return; } } Ok(Event::Resize(w, h)) => { if tx.send(AppEvent::Resize(w, h)).is_err() { return; } } _ => {} } } else if tx.send(AppEvent::Tick).is_err() { return; } } }); Self { rx, _tx } } pub fn next(&self) -> anyhow::Result { Ok(self.rx.recv()?) } }