aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src/event.rs
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2024-07-21 10:49:47 +0200
committerGitHub <noreply@github.com>2024-07-21 11:49:47 +0300
commit6bd1674bd80e73df0d41e4342ad4e34bb7d04f84 (patch)
treef7f176d2dd1c4a09973e7c1f026761a15fa50813 /alacritty/src/event.rs
parentc3075f189c2d8148c70a82f176565ea8e420b49f (diff)
downloadr-alacritty-6bd1674bd80e73df0d41e4342ad4e34bb7d04f84.tar.gz
r-alacritty-6bd1674bd80e73df0d41e4342ad4e34bb7d04f84.tar.bz2
r-alacritty-6bd1674bd80e73df0d41e4342ad4e34bb7d04f84.zip
Restart config monitor on import change
This patch checks the hash of the import paths on every config change and restarts the config monitor whenever the current monitor's hash diverges from the updated config's list of imports. Closes #7981.
Diffstat (limited to 'alacritty/src/event.rs')
-rw-r--r--alacritty/src/event.rs29
1 files changed, 27 insertions, 2 deletions
diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs
index 8da758df..72009d88 100644
--- a/alacritty/src/event.rs
+++ b/alacritty/src/event.rs
@@ -1,5 +1,6 @@
//! Process window events.
+use crate::ConfigMonitor;
use std::borrow::Cow;
use std::cmp::min;
use std::collections::{HashMap, HashSet, VecDeque};
@@ -70,6 +71,8 @@ const TOUCH_ZOOM_FACTOR: f32 = 0.01;
/// Stores some state from received events and dispatches actions when they are
/// triggered.
pub struct Processor {
+ pub config_monitor: Option<ConfigMonitor>,
+
clipboard: Clipboard,
scheduler: Scheduler,
initial_window_options: Option<WindowOptions>,
@@ -101,6 +104,16 @@ impl Processor {
// which is done in `loop_exiting`.
let clipboard = unsafe { Clipboard::new(event_loop.display_handle().unwrap().as_raw()) };
+ // Create a config monitor.
+ //
+ // The monitor watches the config file for changes and reloads it. Pending
+ // config changes are processed in the main loop.
+ let mut config_monitor = None;
+ if config.live_config_reload {
+ config_monitor =
+ ConfigMonitor::new(config.config_paths.clone(), event_loop.create_proxy());
+ }
+
Processor {
initial_window_options,
initial_window_error: None,
@@ -113,6 +126,7 @@ impl Processor {
windows: Default::default(),
#[cfg(unix)]
global_ipc_options: Default::default(),
+ config_monitor,
}
}
@@ -160,8 +174,8 @@ impl Processor {
/// Run the event loop.
///
/// The result is exit code generate from the loop.
- pub fn run(mut self, event_loop: EventLoop<Event>) -> Result<(), Box<dyn Error>> {
- let result = event_loop.run_app(&mut self);
+ pub fn run(&mut self, event_loop: EventLoop<Event>) -> Result<(), Box<dyn Error>> {
+ let result = event_loop.run_app(self);
if let Some(initial_window_error) = self.initial_window_error.take() {
Err(initial_window_error)
} else {
@@ -297,6 +311,17 @@ impl ApplicationHandler<Event> for Processor {
if let Ok(config) = config::reload(path, &mut self.cli_options) {
self.config = Rc::new(config);
+ // Restart config monitor if imports changed.
+ if let Some(monitor) = self.config_monitor.take() {
+ let paths = &self.config.config_paths;
+ self.config_monitor = if monitor.needs_restart(paths) {
+ monitor.shutdown();
+ ConfigMonitor::new(paths.clone(), self.proxy.clone())
+ } else {
+ Some(monitor)
+ };
+ }
+
for window_context in self.windows.values_mut() {
window_context.update_config(self.config.clone());
}