diff options
author | Kirill Chibisov <contact@kchibisov.com> | 2023-12-30 19:50:35 +0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-30 19:50:35 +0400 |
commit | c78c5f6cc057117c344331601e81c6f5778e4a4a (patch) | |
tree | 5c4281358b26be68f73ca6ae1ef07456d096f537 | |
parent | 107c8720c3439703cfb8058e7581396af17a8529 (diff) | |
download | alacritty-c78c5f6cc057117c344331601e81c6f5778e4a4a.tar.gz alacritty-c78c5f6cc057117c344331601e81c6f5778e4a4a.zip |
Send associated text for shifted numbers with kitty
Also fix the wrong ordering of base and shifted keys.
Fixes #7492.
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | alacritty/src/input/keyboard.rs | 18 |
2 files changed, 15 insertions, 5 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b3e840b..5c0f5ef3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - `Alt` bindings requiring composed key rather than pre-composed one on macOS - `Alt + Control` bindings not working on Windows - `chars = "\u000A"` action in bindings inserting `\n` +- Alternate keys not sent for `Shift + <number>` when using kitty protocol +- Alternative keys being swapped in kitty protocol implementation ## 0.13.0 diff --git a/alacritty/src/input/keyboard.rs b/alacritty/src/input/keyboard.rs index 8e559be1..0968c0de 100644 --- a/alacritty/src/input/keyboard.rs +++ b/alacritty/src/input/keyboard.rs @@ -350,17 +350,25 @@ impl SequenceBuilder { let character = character.chars().next().unwrap(); let base_character = character.to_lowercase().next().unwrap(); - let codepoint = u32::from(character); - let base_codepoint = u32::from(base_character); + let alternate_key_code = u32::from(character); + let mut unicode_key_code = u32::from(base_character); + + // Try to get the base for keys which change based on modifier, like `1` for `!`. + match key.key_without_modifiers().as_ref() { + Key::Character(unmodded) if alternate_key_code == unicode_key_code => { + unicode_key_code = u32::from(unmodded.chars().next().unwrap_or(base_character)); + }, + _ => (), + } // NOTE: Base layouts are ignored, since winit doesn't expose this information // yet. let payload = if self.mode.contains(TermMode::REPORT_ALTERNATE_KEYS) - && codepoint != base_codepoint + && alternate_key_code != unicode_key_code { - format!("{codepoint}:{base_codepoint}") + format!("{unicode_key_code}:{alternate_key_code}") } else { - codepoint.to_string() + alternate_key_code.to_string() }; Some(SequenceBase::new(payload.into(), SequenceTerminator::Kitty)) |