diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-03-28 04:29:37 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-03-28 04:29:37 +0300 |
| commit | f18f26d1c0fd8101baee946f71bdd77b9743df41 (patch) | |
| tree | 0fd096fe8c6acd069209ec8ff340a0d0f0921966 /src/app/state.rs | |
| parent | 6a4315c4ee563b515c2b775df8d78d242d680ced (diff) | |
fix prefix key defaults and binding parsing
Diffstat (limited to 'src/app/state.rs')
| -rw-r--r-- | src/app/state.rs | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/src/app/state.rs b/src/app/state.rs index 92d729e8..7a577bb8 100644 --- a/src/app/state.rs +++ b/src/app/state.rs @@ -75,7 +75,7 @@ pub struct AppState { impl AppState { pub fn is_prefix(&self, key: &crossterm::event::KeyEvent) -> bool { - key.code == self.prefix_code && key.modifiers.contains(self.prefix_mods) + key_matches(key, self.prefix_code, self.prefix_mods) } pub fn estimate_pane_size(&self) -> (u16, u16) { @@ -87,6 +87,25 @@ impl AppState { } } +pub fn key_matches( + key: &crossterm::event::KeyEvent, + expected_code: KeyCode, + expected_mods: KeyModifiers, +) -> bool { + if key.modifiers != expected_mods { + return false; + } + + match (key.code, expected_code) { + (KeyCode::Char(actual), KeyCode::Char(expected)) + if actual.is_ascii_alphabetic() && expected.is_ascii_alphabetic() => + { + actual.eq_ignore_ascii_case(&expected) + } + (actual, expected) => actual == expected, + } +} + // --------------------------------------------------------------------------- // Test helpers // --------------------------------------------------------------------------- @@ -113,9 +132,9 @@ impl AppState { context_menu: None, update_available: None, update_dismissed: false, - prefix_code: KeyCode::Char('s'), + prefix_code: KeyCode::Char('b'), prefix_mods: KeyModifiers::CONTROL, - prefix_label: "ctrl+s".into(), + prefix_label: "ctrl+b".into(), sidebar_width: 26, sidebar_collapsed: false, confirm_close: true, @@ -133,3 +152,36 @@ impl AppState { } } } + +#[cfg(test)] +mod tests { + use super::*; + use crossterm::event::KeyEvent; + + #[test] + fn key_matches_requires_exact_modifiers() { + assert!(key_matches( + &KeyEvent::new(KeyCode::Char('b'), KeyModifiers::CONTROL), + KeyCode::Char('b'), + KeyModifiers::CONTROL, + )); + + assert!(!key_matches( + &KeyEvent::new( + KeyCode::Char('b'), + KeyModifiers::CONTROL | KeyModifiers::SHIFT, + ), + KeyCode::Char('b'), + KeyModifiers::CONTROL, + )); + } + + #[test] + fn key_matches_letters_case_insensitively() { + assert!(key_matches( + &KeyEvent::new(KeyCode::Char('B'), KeyModifiers::SHIFT), + KeyCode::Char('b'), + KeyModifiers::SHIFT, + )); + } +} |
