summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Chibisov <contact@kchibisov.com>2023-12-30 19:50:35 +0400
committerChristian Duerr <contact@christianduerr.com>2024-01-06 08:59:54 +0100
commite297c6bf0c09092d8f917e66d505e33537e6c7a3 (patch)
tree16e60af9d20fe36db7aa08e9749635a85a8afb09
parent53927d686a8107dd28a6d086b92a608f196e7ce3 (diff)
downloadalacritty-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.md2
-rw-r--r--alacritty/src/input/keyboard.rs18
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))