diff --git a/docs/changelog.md b/docs/changelog.md index 878fae6df..c5ccb2337 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -39,6 +39,7 @@ As features stabilize some brief notes about them will accumulate here. * Wayland: transparent gap under tab bar when window is transparent, split and using per-pane color schemes [#1620](https://github.com/wez/wezterm/issues/1620) * Tab bar could show a gap to the right when resizing * Padding could show window background rather than pane background around split panes at certain window sizes [#2210](https://github.com/wez/wezterm/issues/2210) +* Loading dynamic escape sequence scripts from the [iTerm2-Color-Scheme dynamic-colors directory](https://github.com/mbadolato/iTerm2-Color-Schemes/tree/master/dynamic-colors) would only apply the first 7 colors #### Updated * Bundled harfbuzz to 4.4.1 diff --git a/termwiz/src/escape/parser/mod.rs b/termwiz/src/escape/parser/mod.rs index 69e6a0c28..ef0c70155 100644 --- a/termwiz/src/escape/parser/mod.rs +++ b/termwiz/src/escape/parser/mod.rs @@ -845,4 +845,201 @@ mod test { let mut p = Parser::new(); p.parse_as_vec(b"\x9d1337\xff;File\x1b"); } + + /// vtparse's MAX_OSC was set too low to fully parse this escape sequence. + /// This test verifies that the correct number of actions comes back. + #[test] + fn dynamic_colors() { + let mut p = Parser::new(); + let actions = p.parse_as_vec(b"\x1b]4;0;#000000;1;#aa3731;2;#448c27;3;#cb9000;4;#325cc0;5;#7a3e9d;6;#0083b2;7;#f7f7f7;8;#777777;9;#f05050;10;#60cb00;11;#ffbc5d;12;#007acc;13;#e64ce6;14;#00aacb;15;#f7f7f7\x07"); + k9::snapshot!( + actions, + " +[ + OperatingSystemCommand( + ChangeColorNumber( + [ + ChangeColorPair { + palette_index: 0, + color: Color( + SrgbaTuple( + 0.0, + 0.0, + 0.0, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 1, + color: Color( + SrgbaTuple( + 0.6666667, + 0.21568628, + 0.19215687, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 2, + color: Color( + SrgbaTuple( + 0.26666668, + 0.54901963, + 0.15294118, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 3, + color: Color( + SrgbaTuple( + 0.79607844, + 0.5647059, + 0.0, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 4, + color: Color( + SrgbaTuple( + 0.19607843, + 0.36078432, + 0.7529412, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 5, + color: Color( + SrgbaTuple( + 0.47843137, + 0.24313726, + 0.6156863, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 6, + color: Color( + SrgbaTuple( + 0.0, + 0.5137255, + 0.69803923, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 7, + color: Color( + SrgbaTuple( + 0.96862745, + 0.96862745, + 0.96862745, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 8, + color: Color( + SrgbaTuple( + 0.46666667, + 0.46666667, + 0.46666667, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 9, + color: Color( + SrgbaTuple( + 0.9411765, + 0.3137255, + 0.3137255, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 10, + color: Color( + SrgbaTuple( + 0.3764706, + 0.79607844, + 0.0, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 11, + color: Color( + SrgbaTuple( + 1.0, + 0.7372549, + 0.3647059, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 12, + color: Color( + SrgbaTuple( + 0.0, + 0.47843137, + 0.8, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 13, + color: Color( + SrgbaTuple( + 0.9019608, + 0.29803923, + 0.9019608, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 14, + color: Color( + SrgbaTuple( + 0.0, + 0.6666667, + 0.79607844, + 1.0, + ), + ), + }, + ChangeColorPair { + palette_index: 15, + color: Color( + SrgbaTuple( + 0.96862745, + 0.96862745, + 0.96862745, + 1.0, + ), + ), + }, + ], + ), + ), +] +" + ); + } } diff --git a/vtparse/src/lib.rs b/vtparse/src/lib.rs index 0cf74b025..99ff92af6 100644 --- a/vtparse/src/lib.rs +++ b/vtparse/src/lib.rs @@ -294,7 +294,7 @@ impl VTActor for CollectingVTActor { } const MAX_INTERMEDIATES: usize = 2; -const MAX_OSC: usize = 16; +const MAX_OSC: usize = 64; const MAX_PARAMS: usize = 32; struct OscState { @@ -779,28 +779,20 @@ mod test { #[test] fn test_osc_too_many_params() { - assert_eq!( - parse_as_vec(b"\x1b]0;1;2;3;4;5;6;7;8;9;a;b;c;d;e;f;g\x07"), - vec![VTAction::OscDispatch(vec![ - b"0".to_vec(), - b"1".to_vec(), - b"2".to_vec(), - b"3".to_vec(), - b"4".to_vec(), - b"5".to_vec(), - b"6".to_vec(), - b"7".to_vec(), - b"8".to_vec(), - b"9".to_vec(), - b"a".to_vec(), - b"b".to_vec(), - b"c".to_vec(), - b"d".to_vec(), - b"e".to_vec(), - b"f".to_vec(), - // g is discarded - ])] - ); + let fields = (0..MAX_OSC + 2) + .into_iter() + .map(|i| i.to_string()) + .collect::>(); + let input = format!("\x1b]{}\x07", fields.join(";")); + let actions = parse_as_vec(input.as_bytes()); + assert_eq!(actions.len(), 1); + match &actions[0] { + VTAction::OscDispatch(parsed_fields) => { + let fields: Vec<_> = fields.into_iter().map(|s| s.as_bytes().to_vec()).collect(); + assert_eq!(parsed_fields.as_slice(), &fields[0..MAX_OSC]); + } + other => panic!("Expected OscDispatch but got {:?}", other), + } } #[test]