From 204c46c7f9469a9d58ccc882afbd057f8675ef11 Mon Sep 17 00:00:00 2001 From: Kevin Zheng Date: Sun, 9 Jun 2019 13:02:15 -0500 Subject: [PATCH] Fix dynamic multi-color escape codes --- CHANGELOG.md | 1 + alacritty_terminal/src/ansi.rs | 63 +++++++++++++--------------------- 2 files changed, 24 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef9b493..25437a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -392,6 +392,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Pressing enter on the numpad should now insert a newline - The mouse bindings now support keyboard modifiers (shift/ctrl/alt/super) - Add support for the bright foreground color +- Support for setting foreground, background colors in one escape sequence ### Changed diff --git a/alacritty_terminal/src/ansi.rs b/alacritty_terminal/src/ansi.rs index bff59de..27c07a5 100644 --- a/alacritty_terminal/src/ansi.rs +++ b/alacritty_terminal/src/ansi.rs @@ -537,10 +537,10 @@ pub enum NamedColor { Foreground = 256, /// The background color Background, - /// Color for the text under the cursor - CursorText, /// Color for the cursor itself Cursor, + /// Color for the text under the cursor + CursorText, /// Dim black DimBlack, /// Dim red @@ -793,47 +793,30 @@ where unhandled(params); }, - // Get/set foreground color - b"10" => { + // Get/set Foreground, Background, Cursor colors + b"10" | b"11" | b"12" => { 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); - }, + if let Some(mut dynamic_code) = parse_number(params[0]) { + for param in ¶ms[1..] { + // 10 is the first dynamic color, also the foreground + let offset = dynamic_code as usize - 10; + let index = NamedColor::Foreground as usize + offset; - // 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); - }, + // End of setting dynamic colors + if index > NamedColor::Cursor as usize { + unhandled(params); + break; + } - // Set text cursor color - b"12" => { - if params.len() >= 2 { - if let Some(color) = parse_rgb_color(params[1]) { - self.handler.set_color(NamedColor::Cursor as usize, color); + if let Some(color) = parse_rgb_color(param) { + self.handler.set_color(index, color); + } else if param == b"?" { + self.handler.dynamic_color_sequence(writer, dynamic_code, index); + } else { + unhandled(params); + } + dynamic_code += 1; + } return; } }