src/event/input.rs (1362B)
1 use crossbeam_channel::Sender;
2 use crossterm::event::{self, Event as CtEvent, KeyEventKind};
3 use std::time::Duration;
4
5 use super::Event;
6
7 pub fn spawn_input_thread(tx: Sender<Event>) -> std::thread::JoinHandle<()> {
8 std::thread::spawn(move || {
9 loop {
10 if event::poll(Duration::from_millis(100)).unwrap_or(false) {
11 match event::read() {
12 Ok(CtEvent::Key(key)) => {
13 if key.kind == KeyEventKind::Press
14 && tx.send(Event::Key(key)).is_err()
15 {
16 break;
17 }
18 }
19 Ok(CtEvent::Mouse(mouse)) => {
20 if tx.send(Event::Mouse(mouse)).is_err() {
21 break;
22 }
23 }
24 Ok(CtEvent::Resize(_, _))
25 if tx.send(Event::Resize).is_err() => {
26 break;
27 }
28 _ => {}
29 }
30 }
31 }
32 })
33 }
34
35 pub fn spawn_tick_thread(tx: Sender<Event>, interval: Duration) -> std::thread::JoinHandle<()> {
36 std::thread::spawn(move || loop {
37 std::thread::sleep(interval);
38 if tx.send(Event::Tick).is_err() {
39 break;
40 }
41 })
42 }