1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use crate::app::Task;
use crate::app::{ExternalMsg, InternalMsg, MsgIn};
use crate::input::Key;
use crossterm::event::{self, Event};
use std::sync::mpsc::{Receiver, Sender};
use std::thread;

pub fn keep_reading(tx_msg_in: Sender<Task>, rx_event_reader: Receiver<bool>) {
    thread::spawn(move || {
        let mut is_paused = false;
        loop {
            if let Some(paused) = rx_event_reader.try_recv().ok() {
                is_paused = paused;
            };

            if !is_paused {
                if event::poll(std::time::Duration::from_millis(1)).unwrap() {
                    match event::read() {
                        Ok(Event::Key(key)) => {
                            let key = Key::from_event(key);
                            let msg = MsgIn::Internal(InternalMsg::HandleKey(key));
                            tx_msg_in.send(Task::new(0, msg, Some(key))).unwrap();
                        }

                        Ok(Event::Resize(_, _)) => {
                            let msg = MsgIn::External(ExternalMsg::Refresh);
                            tx_msg_in.send(Task::new(0, msg, None)).unwrap();
                        }
                        Ok(_) => {}
                        Err(e) => {
                            tx_msg_in
                                .send(Task::new(
                                    0,
                                    MsgIn::External(ExternalMsg::LogError(e.to_string())),
                                    None,
                                ))
                                .unwrap();
                        }
                    }
                }
            }
        }
    });
}