diff options
author | DaftMouse <daftmouse@protonmail.com> | 2022-01-15 00:35:05 -0300 |
---|---|---|
committer | Kirill Chibisov <contact@kchibisov.com> | 2022-02-10 03:17:21 +0300 |
commit | 54f74caf857703247b8f2c5a2aaddf169ea2cb6d (patch) | |
tree | 912fb8007718f4e984e2f82d4c8df80c72825d82 | |
parent | 8a26dee0a9167777709935789b95758e36885617 (diff) | |
download | alacritty-54f74caf857703247b8f2c5a2aaddf169ea2cb6d.tar.gz alacritty-54f74caf857703247b8f2c5a2aaddf169ea2cb6d.zip |
Add ´?´ support to OSC 4
-rw-r--r-- | CHANGELOG.md | 7 | ||||
-rw-r--r-- | alacritty/src/event.rs | 5 | ||||
-rw-r--r-- | alacritty_terminal/src/ansi.rs | 49 | ||||
-rw-r--r-- | alacritty_terminal/src/term/mod.rs | 4 |
4 files changed, 54 insertions, 11 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index a1120b7e..091044f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ The sections should follow the order `Packaging`, `Added`, `Changed`, `Fixed` an The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.11.0-dev + +### Fixed + +- OSC 4 not handling `?` +- `?` in OSC strings reporting default colors instead of modified ones + ## 0.10.0 ### Packaging diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs index a29a101a..aea6010d 100644 --- a/alacritty/src/event.rs +++ b/alacritty/src/event.rs @@ -1076,8 +1076,9 @@ impl input::Processor<EventProxy, ActionContext<'_, Notifier, EventProxy>> { self.ctx.write_to_pty(text.into_bytes()); }, TerminalEvent::ColorRequest(index, format) => { - let text = format(self.ctx.display.colors[index]); - self.ctx.write_to_pty(text.into_bytes()); + let color = self.ctx.terminal().colors()[index] + .unwrap_or(self.ctx.display.colors[index]); + self.ctx.write_to_pty(format(color).into_bytes()); }, TerminalEvent::PtyWrite(text) => self.ctx.write_to_pty(text.into_bytes()), TerminalEvent::MouseCursorDirty => self.reset_mouse_cursor(), diff --git a/alacritty_terminal/src/ansi.rs b/alacritty_terminal/src/ansi.rs index 25ea8af3..869d051b 100644 --- a/alacritty_terminal/src/ansi.rs +++ b/alacritty_terminal/src/ansi.rs @@ -972,17 +972,28 @@ where // Set color index. b"4" => { - if params.len() > 1 && params.len() % 2 != 0 { - for chunk in params[1..].chunks(2) { - let index = parse_number(chunk[0]); - let color = xparse_color(chunk[1]); - if let (Some(i), Some(c)) = (index, color) { - self.handler.set_color(i as usize, c); - return; - } + if params.len() <= 1 || params.len() % 2 == 0 { + unhandled(params); + return; + } + + for chunk in params[1..].chunks(2) { + let index = match parse_number(chunk[0]) { + Some(index) => index, + None => { + unhandled(params); + continue; + }, + }; + + if let Some(c) = xparse_color(chunk[1]) { + self.handler.set_color(index as usize, c); + } else if chunk[1] == b"?" { + self.handler.dynamic_color_sequence(index, index as usize, terminator); + } else { + unhandled(params); } } - unhandled(params); }, // Get/set Foreground, Background, Cursor colors. @@ -1494,6 +1505,7 @@ mod tests { charset: StandardCharset, attr: Option<Attr>, identity_reported: bool, + color: Option<Rgb>, } impl Handler for MockHandler { @@ -1517,6 +1529,10 @@ mod tests { fn reset_state(&mut self) { *self = Self::default(); } + + fn set_color(&mut self, _: usize, c: Rgb) { + self.color = Some(c); + } } impl Default for MockHandler { @@ -1526,6 +1542,7 @@ mod tests { charset: StandardCharset::Ascii, attr: None, identity_reported: false, + color: None, } } } @@ -1724,4 +1741,18 @@ mod tests { fn parse_number_too_large() { assert_eq!(parse_number(b"321"), None); } + + #[test] + fn parse_osc4_set_color() { + let bytes: &[u8] = b"\x1b]4;0;#fff\x1b\\"; + + let mut parser = Processor::new(); + let mut handler = MockHandler::default(); + + for byte in bytes { + parser.advance(&mut handler, *byte); + } + + assert_eq!(handler.color, Some(Rgb { r: 0xf0, g: 0xf0, b: 0xf0 })); + } } diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs index ce939401..2f0989ef 100644 --- a/alacritty_terminal/src/term/mod.rs +++ b/alacritty_terminal/src/term/mod.rs @@ -818,6 +818,10 @@ impl<T> Term<T> { cursor_cell.bg = bg; cursor_cell.flags = flags; } + + pub fn colors(&self) -> &Colors { + &self.colors + } } impl<T> Dimensions for Term<T> { |