diff --git a/CHANGELOG.md b/CHANGELOG.md index c37458dd..29327b98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - The `--help` output was reworked with a new colorful syntax +### 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> { 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, identity_reported: bool, + color: Option, } 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 Term { cursor_cell.bg = bg; cursor_cell.flags = flags; } + + pub fn colors(&self) -> &Colors { + &self.colors + } } impl Dimensions for Term {