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 + ` 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))