-
Notifications
You must be signed in to change notification settings - Fork 22
Open
Description
Lines 94 to 165 in 2997bee
pub fn key_to_base_note(mut key: KeyEvent, sequence: i8) -> Option<String> { | |
let mut offset: i8 = 0; | |
let keys = ['z', 's', 'x', 'c', 'f', 'v', 'g', 'b', 'n', | |
'j', 'm', 'k', '1', ',', 'q', 'l', '2', '.', | |
'w', '/', 'e', '\'', '4', 'r', '5', 't', 'y', | |
'7', 'u', '8', 'i', '9', 'o', 'p', '[', ']', 'a']; | |
let base_sounds = ["a", "as", "b", "c", "cs", "d", "ds", "e", "f", | |
"fs", "g", "gs", "gs", "a", "a", "as", "as", "b", | |
"b", "c", "c", "cs", "cs", "d", "ds", "e", "f", | |
"fs", "g", "gs", "a", "as", "b", "c", "d", "e", "gs"]; | |
let factors = [-1, -1, -1, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 2, 2, 2, -1]; | |
let special = ['!', '@', '$', '%', '&', '*', '(', '"', '<', | |
'>', '?', '{', '}']; | |
let special_matches = ['1', '2', '4', '5', '7', '8', '9', '\'', ',', | |
'.', '/', '[', ']']; | |
// Handle terminal control characters | |
if key == KeyEvent::Enter { | |
// Ctrl+m sends Enter in terminal | |
key = KeyEvent::Ctrl('m'); | |
} else if key == KeyEvent::Tab { | |
// Ctrl+i sends Tab in terminal | |
key = KeyEvent::Ctrl('i'); | |
} | |
// Translate Ctrl+<character> to <character> | |
if let KeyEvent::Ctrl(c) = key { | |
key = KeyEvent::Char(c); | |
offset -= 1; | |
} | |
// Increment `offset` if key was shift prefixed (Shift+<character>) | |
let note: Option<String> = if let KeyEvent::Char(mut c) = key { | |
if c.is_uppercase() { | |
c = c.to_ascii_lowercase(); | |
offset += 1; | |
} else if special.contains(&c) { | |
let j = special.iter() | |
.position(|&key| key == c) | |
.unwrap(); | |
c = special_matches[j]; | |
offset += 1; | |
} | |
if let Some(i) = keys.iter().position(|&key| key == c) { | |
let factor = factors[i]; | |
let base_note = format!("{}{}", | |
base_sounds[i].to_string(), | |
offset + factor + sequence | |
); | |
Some(base_note) | |
} else { | |
None | |
} | |
} else { | |
None | |
}; | |
note | |
} |
- toml - much more human-friendly config format, I mean not such easy to break like yaml
- OnceLock for once init of key bind map; may not need to be thread-safe?
- FxHashMap for keymapping
related issue: #23
Metadata
Metadata
Assignees
Labels
No labels