aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src/config/monitor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty/src/config/monitor.rs')
-rw-r--r--alacritty/src/config/monitor.rs58
1 files changed, 58 insertions, 0 deletions
diff --git a/alacritty/src/config/monitor.rs b/alacritty/src/config/monitor.rs
new file mode 100644
index 00000000..8dc5379a
--- /dev/null
+++ b/alacritty/src/config/monitor.rs
@@ -0,0 +1,58 @@
+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<P>(path: P, event_proxy: EventProxy) -> Monitor
+ where
+ P: Into<PathBuf>,
+ {
+ 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));
+ },
+ _ => {},
+ }
+ }
+ }),
+ }
+ }
+}