Skip to content

Commit

Permalink
Add ´?´ support to OSC 4
Browse files Browse the repository at this point in the history
  • Loading branch information
DaftMouse authored Jan 15, 2022
1 parent e38f51c commit 60ef17e
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 11 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions alacritty/src/event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
49 changes: 40 additions & 9 deletions alacritty_terminal/src/ansi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -1494,6 +1505,7 @@ mod tests {
charset: StandardCharset,
attr: Option<Attr>,
identity_reported: bool,
color: Option<Rgb>,
}

impl Handler for MockHandler {
Expand All @@ -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 {
Expand All @@ -1526,6 +1542,7 @@ mod tests {
charset: StandardCharset::Ascii,
attr: None,
identity_reported: false,
color: None,
}
}
}
Expand Down Expand Up @@ -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 }));
}
}
4 changes: 4 additions & 0 deletions alacritty_terminal/src/term/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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> {
Expand Down

0 comments on commit 60ef17e

Please sign in to comment.