diff --git a/crates/gpui/src/platform/keystroke.rs b/crates/gpui/src/platform/keystroke.rs index 34fda3a859ca9665a81fa67a4a1c8bf52bae022e..44d861b9a5d19f88543e9f1d9aefa58a901727f9 100644 --- a/crates/gpui/src/platform/keystroke.rs +++ b/crates/gpui/src/platform/keystroke.rs @@ -5,16 +5,6 @@ use std::{ fmt::{Display, Write}, }; -/// TODO: -pub struct KeybindKeystroke { - /// TODO: - pub inner: Keystroke, - /// TODO: - pub modifiers: Modifiers, - /// TODO: - pub key: String, -} - /// A keystroke and associated metadata generated by the platform #[derive(Clone, Debug, Eq, PartialEq, Default, Deserialize, Hash)] pub struct Keystroke { @@ -31,6 +21,16 @@ pub struct Keystroke { pub key_char: Option, } +/// TODO: +pub struct KeybindKeystroke { + /// TODO: + pub inner: Keystroke, + /// TODO: + pub modifiers: Modifiers, + /// TODO: + pub key: String, +} + /// Error type for `Keystroke::parse`. This is used instead of `anyhow::Error` so that Zed can use /// markdown to display it. #[derive(Debug)] @@ -273,6 +273,112 @@ impl Keystroke { } } +impl KeybindKeystroke { + /// TODO: + pub fn parse(source: &str) -> std::result::Result { + let keystroke = Keystroke::parse(source)?; + let Keystroke { + mut modifiers, key, .. + } = keystroke.clone(); + let (key, modifiers) = temp_keyboard_mapper(key, modifiers); + Ok(KeybindKeystroke { + inner: keystroke, + modifiers, + key, + }) + } +} + +fn temp_keyboard_mapper(key: String, mut modifiers: Modifiers) -> (String, Modifiers) { + match key.as_str() { + "~" => { + modifiers.shift = true; + ("`".to_string(), modifiers) + } + "!" => { + modifiers.shift = true; + ("1".to_string(), modifiers) + } + "@" => { + modifiers.shift = true; + ("2".to_string(), modifiers) + } + "#" => { + modifiers.shift = true; + ("3".to_string(), modifiers) + } + "$" => { + modifiers.shift = true; + ("4".to_string(), modifiers) + } + "%" => { + modifiers.shift = true; + ("5".to_string(), modifiers) + } + "^" => { + modifiers.shift = true; + ("6".to_string(), modifiers) + } + "&" => { + modifiers.shift = true; + ("7".to_string(), modifiers) + } + "*" => { + modifiers.shift = true; + ("8".to_string(), modifiers) + } + "(" => { + modifiers.shift = true; + ("9".to_string(), modifiers) + } + ")" => { + modifiers.shift = true; + ("0".to_string(), modifiers) + } + "_" => { + modifiers.shift = true; + ("-".to_string(), modifiers) + } + "+" => { + modifiers.shift = true; + ("=".to_string(), modifiers) + } + "{" => { + modifiers.shift = true; + ("[".to_string(), modifiers) + } + "}" => { + modifiers.shift = true; + ("]".to_string(), modifiers) + } + "|" => { + modifiers.shift = true; + ("\\".to_string(), modifiers) + } + ":" => { + modifiers.shift = true; + (";".to_string(), modifiers) + } + "\"" => { + modifiers.shift = true; + ("'".to_string(), modifiers) + } + "<" => { + modifiers.shift = true; + (",".to_string(), modifiers) + } + ">" => { + modifiers.shift = true; + (">".to_string(), modifiers) + } + "?" => { + modifiers.shift = true; + ("/".to_string(), modifiers) + } + _ => (key, modifiers), + } +} + fn is_printable_key(key: &str) -> bool { !matches!( key,