diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a6975a..53506f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Bitmap fonts being a bit smaller than they should be in some cases - Config reload creating alternate screen history instead of updating scrollback - Crash on Wayland compositors supporting `wl_seat` version 7+ +- Message bar not hiding after fixing wrong color value in config ### Removed diff --git a/alacritty_terminal/src/term/color.rs b/alacritty_terminal/src/term/color.rs index f3f42e9..b452245 100644 --- a/alacritty_terminal/src/term/color.rs +++ b/alacritty_terminal/src/term/color.rs @@ -7,7 +7,7 @@ use serde::de::Visitor; use serde::{Deserialize, Deserializer, Serialize}; use crate::ansi; -use crate::config::Colors; +use crate::config::{Colors, LOG_TARGET_CONFIG}; pub const COUNT: usize = 269; @@ -66,10 +66,14 @@ impl<'de> Deserialize<'de> for Rgb { fn visit_str(self, value: &str) -> ::std::result::Result where - E: ::serde::de::Error, + E: serde::de::Error, { - Rgb::from_str(&value[..]) - .map_err(|_| E::custom("failed to parse rgb; expected hex color like #ff00ff")) + Rgb::from_str(&value[..]).map_err(|_| { + E::custom(format!( + "failed to parse rgb color {}; expected hex color like #ff00ff", + value + )) + }) } } @@ -85,7 +89,10 @@ impl<'de> Deserialize<'de> for Rgb { match value.deserialize_str(RgbVisitor) { Ok(rgb) => Ok(rgb), Err(err) => { - error!("Problem with config: {}; using color #000000", err); + error!( + target: LOG_TARGET_CONFIG, + "Problem with config: {}; using color #000000", err + ); Ok(Rgb::default()) }, } @@ -95,39 +102,26 @@ impl<'de> Deserialize<'de> for Rgb { impl FromStr for Rgb { type Err = (); - fn from_str(s: &str) -> ::std::result::Result { - let mut chars = s.chars(); - let mut rgb = Rgb::default(); + fn from_str(s: &str) -> std::result::Result { + let chars = if s.starts_with("0x") && s.len() == 8 { + &s[2..] + } else if s.starts_with('#') && s.len() == 7 { + &s[1..] + } else { + return Err(()); + }; - macro_rules! component { - ($($c:ident),*) => { - $( - match chars.next().and_then(|c| c.to_digit(16)) { - Some(val) => rgb.$c = (val as u8) << 4, - None => return Err(()) - } - - match chars.next().and_then(|c| c.to_digit(16)) { - Some(val) => rgb.$c |= val as u8, - None => return Err(()) - } - )* - } - } - - match chars.next() { - Some('0') => { - if chars.next() != Some('x') { - return Err(()); - } + match u32::from_str_radix(chars, 16) { + Ok(mut color) => { + let b = (color & 0xff) as u8; + color >>= 8; + let g = (color & 0xff) as u8; + color >>= 8; + let r = color as u8; + Ok(Rgb { r, g, b }) }, - Some('#') => (), - _ => return Err(()), + Err(_) => Err(()), } - - component!(r, g, b); - - Ok(rgb) } }