fm/event/
event_poller.rs

1use std::{os::unix::net::UnixListener, sync::mpsc::Receiver, time::Duration};
2
3use crate::event::{create_stream, read_from_stream, FmEvents};
4
5/// Simple struct to read the events.
6pub struct EventReader {
7    pub fm_receiver: Receiver<FmEvents>,
8    pub socket_path: String,
9    pub socket_listener: UnixListener,
10}
11
12impl EventReader {
13    /// Creates a new instance with an Arc to a terminal.
14    pub fn new(fm_receiver: Receiver<FmEvents>) -> Self {
15        let (socket_path, socket_listener) = create_stream().expect("Error creating stream");
16        socket_listener
17            .set_nonblocking(true)
18            .expect("Couldn't set socket to non blocking");
19        Self {
20            fm_receiver,
21            socket_path,
22            socket_listener,
23        }
24    }
25
26    const POLL_WAIT_MS: Duration = Duration::from_millis(20);
27
28    /// Returns the events as they're received. Loops until an event is received.
29    /// We should spend most of the application life here, polling for next event :)
30    ///
31    /// It's an interface for internal and extenal events (through terminal)
32    /// casting them into an [`crate::event::FmEvents`].
33    pub fn poll_event(&self) -> FmEvents {
34        loop {
35            if let Ok((mut stream, path)) = self.socket_listener.accept() {
36                crate::log_info!("Accepted socket connection from {path:?}");
37                if let Some(msg) = read_from_stream(&mut stream) {
38                    return FmEvents::Ipc(msg);
39                }
40            }
41            if let Ok(event) = self.fm_receiver.try_recv() {
42                return event;
43            }
44            let Ok(true) = crossterm::event::poll(Self::POLL_WAIT_MS) else {
45                continue;
46            };
47            let Ok(term_event) = crossterm::event::read() else {
48                continue;
49            };
50            return FmEvents::Term(term_event);
51        }
52    }
53}