diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/config.rs | 49 | ||||
-rw-r--r-- | src/term/color.rs | 36 | ||||
-rw-r--r-- | src/term/mod.rs | 2 |
3 files changed, 78 insertions, 9 deletions
diff --git a/src/config.rs b/src/config.rs index bd06641a..42d65c91 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1100,16 +1100,42 @@ pub struct Colors { pub bright: AnsiColors, #[serde(default, deserialize_with = "failure_default")] pub dim: Option<AnsiColors>, + #[serde(default, deserialize_with = "failure_default_vec")] + pub indexed_colors: Vec<IndexedColor>, } -fn deserialize_cursor_colors<'a, D>(deserializer: D) -> ::std::result::Result<CursorColors, D::Error> +#[derive(Debug, Deserialize)] +pub struct IndexedColor { + #[serde(deserialize_with = "deserialize_color_index")] + pub index: u8, + #[serde(deserialize_with = "rgb_from_hex")] + pub color: Rgb, +} + +fn deserialize_color_index<'a, D>(deserializer: D) -> ::std::result::Result<u8, D::Error> where D: de::Deserializer<'a> { - match CursorOrPrimaryColors::deserialize(deserializer) { - Ok(either) => Ok(either.into_cursor_colors()), + match u8::deserialize(deserializer) { + Ok(index) => { + if index < 16 { + eprintln!( + "problem with config: indexed_color's index is '{}', \ + but a value bigger than 15 was expected; \ + Ignoring setting", + index + ); + + // Return value out of range to ignore this color + Ok(0) + } else { + Ok(index) + } + }, Err(err) => { - eprintln!("problem with config: {}; Using default value", err); - Ok(CursorColors::default()) + eprintln!("problem with config: {}; Ignoring setting", err); + + // Return value out of range to ignore this color + Ok(0) }, } } @@ -1169,6 +1195,18 @@ impl Default for CursorColors { } } +fn deserialize_cursor_colors<'a, D>(deserializer: D) -> ::std::result::Result<CursorColors, D::Error> + where D: de::Deserializer<'a> +{ + match CursorOrPrimaryColors::deserialize(deserializer) { + Ok(either) => Ok(either.into_cursor_colors()), + Err(err) => { + eprintln!("problem with config: {}; Using default value", err); + Ok(CursorColors::default()) + }, + } +} + #[derive(Debug, Deserialize)] pub struct PrimaryColors { #[serde(deserialize_with = "rgb_from_hex")] @@ -1234,6 +1272,7 @@ impl Default for Colors { white: Rgb {r: 0xff, g: 0xff, b: 0xff}, }, dim: None, + indexed_colors: Vec::new(), } } } diff --git a/src/term/color.rs b/src/term/color.rs index 6acd092a..276a6897 100644 --- a/src/term/color.rs +++ b/src/term/color.rs @@ -23,8 +23,8 @@ impl<'a> From<&'a Colors> for List { let mut list: List = unsafe { ::std::mem::uninitialized() }; list.fill_named(colors); - list.fill_cube(); - list.fill_gray_ramp(); + list.fill_cube(colors); + list.fill_gray_ramp(colors); list } @@ -95,12 +95,26 @@ impl List { } } - fn fill_cube(&mut self) { + pub fn fill_cube(&mut self, colors: &Colors) { let mut index: usize = 16; // Build colors for r in 0..6 { for g in 0..6 { for b in 0..6 { + // Index of the color is number of named colors + rgb + let color_index = 16 + r + g + b; + + // Override colors 16..232 with the config (if present) + if let Some(indexed_color) = colors + .indexed_colors + .iter() + .find(|ic| ic.index == color_index) + { + self[index] = indexed_color.color; + index += 1; + continue; + } + self[index] = Rgb { r: if r == 0 { 0 } else { r * 40 + 55 }, b: if b == 0 { 0 } else { b * 40 + 55 }, g: if g == 0 { 0 } else { g * 40 + 55 }, @@ -113,10 +127,24 @@ impl List { debug_assert!(index == 232); } - fn fill_gray_ramp(&mut self) { + pub fn fill_gray_ramp(&mut self, colors: &Colors) { let mut index: usize = 232; for i in 0..24 { + // Index of the color is number of named colors + number of cube colors + i + let color_index = 16 + 216 + i; + + // Override colors 232..256 with the config (if present) + if let Some(indexed_color) = colors + .indexed_colors + .iter() + .find(|ic| ic.index == color_index) + { + self[index] = indexed_color.color; + index += 1; + continue; + } + let value = i * 10 + 8; self[index] = Rgb { r: value, diff --git a/src/term/mod.rs b/src/term/mod.rs index c2759802..f6f53dbe 100644 --- a/src/term/mod.rs +++ b/src/term/mod.rs @@ -900,6 +900,8 @@ impl Term { pub fn update_config(&mut self, config: &Config) { self.semantic_escape_chars = config.selection().semantic_escape_chars.clone(); self.original_colors.fill_named(config.colors()); + self.original_colors.fill_cube(config.colors()); + self.original_colors.fill_gray_ramp(config.colors()); for i in 0..color::COUNT { if !self.color_modified[i] { self.colors[i] = self.original_colors[i]; |