aboutsummaryrefslogtreecommitdiff
path: root/src/input
diff options
context:
space:
mode:
authorakbash <akbash@herdr.dev>2026-07-07 15:54:03 +0300
committerGitHub <noreply@github.com>2026-07-07 15:54:03 +0300
commit39ba6b7a0242768b7d3684e8163d13a0609fcaa3 (patch)
treed7fa5e94977850462d465d25a7bbabdd7b7d6d98 /src/input
parentb425260f9d86bb7e0bbea1d1e557ee75ba22443e (diff)
fix: preserve alt-shift letters (#1102)
refs #1088 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Diffstat (limited to 'src/input')
-rw-r--r--src/input/parse.rs19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/input/parse.rs b/src/input/parse.rs
index bf377e88..77c630ba 100644
--- a/src/input/parse.rs
+++ b/src/input/parse.rs
@@ -73,7 +73,11 @@ fn parse_legacy_key_sequence(data: &str) -> Option<TerminalKey> {
let rest = data.strip_prefix('\x1b')?;
if rest.chars().count() == 1 {
let ch = rest.chars().next()?;
- Some(TerminalKey::new(KeyCode::Char(ch), KeyModifiers::ALT))
+ let mut modifiers = KeyModifiers::ALT;
+ if ch.is_ascii_uppercase() {
+ modifiers |= KeyModifiers::SHIFT;
+ }
+ Some(TerminalKey::new(KeyCode::Char(ch), modifiers))
} else {
None
}
@@ -518,6 +522,19 @@ mod tests {
}
#[test]
+ fn parse_legacy_alt_shift_letter_preserves_shift() {
+ let key = parse_terminal_key_sequence("\x1bA").expect("alt-shift letter should parse");
+ assert_terminal_key_eq(
+ key,
+ KeyCode::Char('A'),
+ KeyModifiers::ALT | KeyModifiers::SHIFT,
+ crossterm::event::KeyEventKind::Press,
+ None,
+ );
+ assert_eq!(encode_terminal_key(key, KeyboardProtocol::Legacy), b"\x1bA");
+ }
+
+ #[test]
fn unknown_legacy_ss3_sequence_remains_unsupported() {
assert!(parse_terminal_key_sequence("\x1bOz").is_none());
}