aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src/config/monitor.rs
blob: d91b2e4bdbe61b91d73f145f56fbb8407d04f2a5 (plain)
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));
                        },
                        _ => {},
                    }
                }
            }),
        }
    }
}