diff options
author | Kirill Chibisov <contact@kchibisov.com> | 2023-12-30 19:50:35 +0400 |
---|---|---|
committer | Christian Duerr <contact@christianduerr.com> | 2024-01-06 08:59:54 +0100 |
commit | e297c6bf0c09092d8f917e66d505e33537e6c7a3 (patch) | |
tree | 16e60af9d20fe36db7aa08e9749635a85a8afb09 | |
parent | 53927d686a8107dd28a6d086b92a608f196e7ce3 (diff) | |
download | alacritty-e297c6bf0c09092d8f917e66d505e33537e6c7a3.tar.gz alacritty-e297c6bf0c09092d8f917e66d505e33537e6c7a3.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 25d32e57..fb0c9775 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)) |