aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2022-09-17 13:32:10 +0000
committerChristian Duerr <contact@christianduerr.com>2022-09-17 14:31:31 +0000
commit0b038789153bb53f38406d3d304e646c599b9e7f (patch)
tree3150cce3745de5b3b5644c3742e5ba543ae0f9a9
parentfb8260101d2ccf0ae170448ae3b354ee2b17a967 (diff)
downloadalacritty-0b038789153bb53f38406d3d304e646c599b9e7f.tar.gz
alacritty-0b038789153bb53f38406d3d304e646c599b9e7f.zip
Fix IPC config overriding previous values
Before this patch whenever changing the IPC configuration, all previous configuration options would be discarded. This was the case even when the new option was invalid. This patch ensures that the IPC config is only ever cleared when the `--reset` flag is passed. Invalid IPC config options are logged and discarded. Additionally whenever a new IPC config message is sent, all previous IPC error messages are cleared. Closes #6330.
-rw-r--r--alacritty/src/logging.rs16
-rw-r--r--alacritty/src/window_context.rs36
-rw-r--r--alacritty_terminal/src/config/mod.rs1
3 files changed, 43 insertions, 10 deletions
diff --git a/alacritty/src/logging.rs b/alacritty/src/logging.rs
index f3405e58..113e96ff 100644
--- a/alacritty/src/logging.rs
+++ b/alacritty/src/logging.rs
@@ -15,15 +15,27 @@ use std::{env, process};
use glutin::event_loop::EventLoopProxy;
use log::{self, Level, LevelFilter};
+use alacritty_terminal::config::LOG_TARGET_CONFIG;
+
use crate::cli::Options;
use crate::event::{Event, EventType};
use crate::message_bar::{Message, MessageType};
+/// Logging target for IPC config error messages.
+pub const LOG_TARGET_IPC_CONFIG: &str = "alacritty_log_ipc_config";
+
/// Name for the environment variable containing the log file's path.
const ALACRITTY_LOG_ENV: &str = "ALACRITTY_LOG";
+
/// List of targets which will be logged by Alacritty.
-const ALLOWED_TARGETS: [&str; 4] =
- ["alacritty_terminal", "alacritty_config_derive", "alacritty", "crossfont"];
+const ALLOWED_TARGETS: &[&str] = &[
+ LOG_TARGET_IPC_CONFIG,
+ LOG_TARGET_CONFIG,
+ "alacritty_config_derive",
+ "alacritty_terminal",
+ "alacritty",
+ "crossfont",
+];
pub fn initialize(
options: &Options,
diff --git a/alacritty/src/window_context.rs b/alacritty/src/window_context.rs
index 9a2a8730..45adf8b8 100644
--- a/alacritty/src/window_context.rs
+++ b/alacritty/src/window_context.rs
@@ -38,6 +38,7 @@ use crate::config::UiConfig;
use crate::display::Display;
use crate::event::{ActionContext, Event, EventProxy, EventType, Mouse, SearchState};
use crate::input;
+use crate::logging::LOG_TARGET_IPC_CONFIG;
use crate::message_bar::MessageBuffer;
use crate::scheduler::Scheduler;
@@ -184,10 +185,20 @@ impl WindowContext {
if !self.ipc_config.is_empty() {
let mut config = (*self.config).clone();
- // Apply each option.
- for (key, value) in &self.ipc_config {
- if let Err(err) = config.replace(key, value.clone()) {
- error!("Unable to override option '{}': {}", key, err);
+ // Apply each option, removing broken ones.
+ let mut i = 0;
+ while i < self.ipc_config.len() {
+ let (key, value) = &self.ipc_config[i];
+
+ match config.replace(key, value.clone()) {
+ Err(err) => {
+ error!(
+ target: LOG_TARGET_IPC_CONFIG,
+ "Unable to override option '{}': {}", key, err
+ );
+ self.ipc_config.swap_remove(i);
+ },
+ Ok(_) => i += 1,
}
}
@@ -255,15 +266,21 @@ impl WindowContext {
/// Update the IPC config overrides.
#[cfg(unix)]
pub fn update_ipc_config(&mut self, config: Rc<UiConfig>, ipc_config: IpcConfig) {
- self.ipc_config.clear();
+ // Clear previous IPC errors.
+ self.message_buffer.remove_target(LOG_TARGET_IPC_CONFIG);
- if !ipc_config.reset {
+ if ipc_config.reset {
+ self.ipc_config.clear();
+ } else {
for option in &ipc_config.options {
// Separate config key/value.
let (key, value) = match option.split_once('=') {
Some(split) => split,
None => {
- error!("'{}': IPC config option missing value", option);
+ error!(
+ target: LOG_TARGET_IPC_CONFIG,
+ "'{}': IPC config option missing value", option
+ );
continue;
},
};
@@ -271,7 +288,10 @@ impl WindowContext {
// Try and parse value as yaml.
match serde_yaml::from_str(value) {
Ok(value) => self.ipc_config.push((key.to_owned(), value)),
- Err(err) => error!("'{}': Invalid IPC config value: {:?}", option, err),
+ Err(err) => error!(
+ target: LOG_TARGET_IPC_CONFIG,
+ "'{}': Invalid IPC config value: {:?}", option, err
+ ),
}
}
}
diff --git a/alacritty_terminal/src/config/mod.rs b/alacritty_terminal/src/config/mod.rs
index 53a0eb77..f63f6ebb 100644
--- a/alacritty_terminal/src/config/mod.rs
+++ b/alacritty_terminal/src/config/mod.rs
@@ -12,6 +12,7 @@ use crate::ansi::{CursorShape, CursorStyle};
pub use crate::config::scrolling::{Scrolling, MAX_SCROLLBACK_LINES};
+/// Logging target for config error messages.
pub const LOG_TARGET_CONFIG: &str = "alacritty_config_derive";
const MIN_BLINK_INTERVAL: u64 = 10;