From f79007035ccc8d52f5f491d35d3d4132aa29898d Mon Sep 17 00:00:00 2001 From: rbong Date: Sun, 2 Jun 2019 09:16:38 -0400 Subject: [PATCH] Add foreground/background request escape codes --- CHANGELOG.md | 1 + alacritty_terminal/src/ansi.rs | 23 +++++++++++++++++++++-- alacritty_terminal/src/term/mod.rs | 8 ++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c98b0c7..e4e0382 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Config group `debug` with the options `debug.log_level`, `debug.print_events` and `debug.ref_test` - Select until next matching bracket when double-clicking a bracket +- Added foreground/background escape code request sequences ### Changed diff --git a/alacritty_terminal/src/ansi.rs b/alacritty_terminal/src/ansi.rs index c0ebb79..bff59de 100644 --- a/alacritty_terminal/src/ansi.rs +++ b/alacritty_terminal/src/ansi.rs @@ -332,6 +332,9 @@ pub trait Handler { /// Set an indexed color value fn set_color(&mut self, _: usize, _: Rgb) {} + /// Write a foreground/background color escape sequence with the current color + fn dynamic_color_sequence(&mut self, _: &mut W, _: u8, _: usize) {} + /// Reset an indexed color to original value fn reset_color(&mut self, _: usize) {} @@ -741,6 +744,8 @@ where // TODO replace OSC parsing with parser combinators #[inline] fn osc_dispatch(&mut self, params: &[&[u8]]) { + let writer = &mut self.writer; + fn unhandled(params: &[&[u8]]) { let mut buf = String::new(); for items in params { @@ -788,23 +793,37 @@ where unhandled(params); }, - // Set foreground color + // Get/set foreground color b"10" => { if params.len() >= 2 { if let Some(color) = parse_rgb_color(params[1]) { self.handler.set_color(NamedColor::Foreground as usize, color); return; + } else if params[1] == b"?" { + self.handler.dynamic_color_sequence( + writer, + 10, + NamedColor::Foreground as usize, + ); + return; } } unhandled(params); }, - // Set background color + // Get/set background color b"11" => { if params.len() >= 2 { if let Some(color) = parse_rgb_color(params[1]) { self.handler.set_color(NamedColor::Background as usize, color); return; + } else if params[1] == b"?" { + self.handler.dynamic_color_sequence( + writer, + 11, + NamedColor::Background as usize, + ); + return; } } unhandled(params); diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs index c01c159..38f7f08 100644 --- a/alacritty_terminal/src/term/mod.rs +++ b/alacritty_terminal/src/term/mod.rs @@ -1870,6 +1870,14 @@ impl ansi::Handler for Term { self.color_modified[index] = true; } + /// Write a foreground/background color escape sequence with the current color + #[inline] + fn dynamic_color_sequence(&mut self, writer: &mut W, code: u8, index: usize) { + trace!("Writing escape sequence for dynamic color code {}: color[{}]", code, index); + let color = self.colors[index]; + let _ = write!(writer, "\x1b]{};rgb:{:x}/{:x}/{:x}\x07", code, color.r, color.g, color.b); + } + /// Reset the indexed color to original value #[inline] fn reset_color(&mut self, index: usize) {