1use std::{os::unix::net::UnixListener, sync::mpsc::Receiver, time::Duration};
2
3use crate::event::{create_stream, read_from_stream, FmEvents};
4
5pub struct EventReader {
7 pub fm_receiver: Receiver<FmEvents>,
8 pub socket_path: String,
9 pub socket_listener: UnixListener,
10}
11
12impl EventReader {
13 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 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}