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
45
46
47
48
49
50
51
52
53
54
55
56
57
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));
},
_ => {},
}
}
}),
}
}
}
|