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
59
60
61
62
63
64
65
66
67
use crate::config::Config;
use crate::display_servers::DisplayServer;
use crate::state::State;
use crate::utils::child_process::Children;
use std::sync::{atomic::AtomicBool, Arc};
#[derive(Debug)]
pub struct Manager<C, SERVER> {
pub state: State,
pub config: C,
pub(crate) children: Children,
pub(crate) reap_requested: Arc<AtomicBool>,
pub(crate) reload_requested: bool,
pub display_server: SERVER,
}
impl<C, SERVER> Manager<C, SERVER>
where
C: Config,
SERVER: DisplayServer,
{
pub fn new(config: C) -> Self {
Self {
display_server: SERVER::new(&config),
state: State::new(&config),
config,
children: Default::default(),
reap_requested: Default::default(),
reload_requested: false,
}
}
}
impl<C, SERVER> Manager<C, SERVER> {
pub fn register_child_hook(&self) {
crate::child_process::register_child_hook(self.reap_requested.clone());
}
pub fn hard_reload(&mut self) {
self.reload_requested = true;
}
}
impl<C: Config, SERVER: DisplayServer> Manager<C, SERVER> {
pub fn reload_config(&mut self) -> bool {
let focused = self.state.focus_manager.window_history.front();
self.display_server
.load_config(&self.config, focused, &self.state.windows);
self.state.load_config(&self.config);
true
}
}
#[cfg(test)]
impl Manager<crate::config::tests::TestConfig, crate::display_servers::MockDisplayServer> {
pub fn new_test(tags: Vec<String>) -> Self {
use crate::config::tests::TestConfig;
Self::new(TestConfig {
tags,
..TestConfig::default()
})
}
}