use std::path::PathBuf; use std::sync::mpsc; use std::time::Duration; use notify::{watcher, DebouncedEvent, RecursiveMode, Watcher}; use alacritty_terminal::event::{Event, EventListener}; use alacritty_terminal::util; use crate::event::EventProxy; pub struct Monitor { _thread: ::std::thread::JoinHandle<()>, } impl Monitor { pub fn new

(path: P, event_proxy: EventProxy) -> Monitor where P: Into, { let path = path.into(); Monitor { _thread: util::thread::spawn_named("config watcher", move || { let (tx, rx) = mpsc::channel(); // The Duration argument is a debouncing period. let mut watcher = watcher(tx, Duration::from_millis(10)).expect("Unable to spawn file watcher"); let config_path = ::std::fs::canonicalize(path).expect("canonicalize config path"); // Get directory of config let mut parent = config_path.clone(); parent.pop(); // Watch directory watcher .watch(&parent, RecursiveMode::NonRecursive) .expect("watch alacritty.yml dir"); loop { match rx.recv().expect("watcher event") { DebouncedEvent::Rename(..) => continue, DebouncedEvent::Write(path) | DebouncedEvent::Create(path) | DebouncedEvent::Chmod(path) => { if path != config_path { continue; } event_proxy.send_event(Event::ConfigReload(path)); }, _ => {}, } } }), } } }