aboutsummaryrefslogtreecommitdiff
path: root/src/app/state.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-03-28 04:29:37 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-03-28 04:29:37 +0300
commitf18f26d1c0fd8101baee946f71bdd77b9743df41 (patch)
tree0fd096fe8c6acd069209ec8ff340a0d0f0921966 /src/app/state.rs
parent6a4315c4ee563b515c2b775df8d78d242d680ced (diff)
fix prefix key defaults and binding parsing
Diffstat (limited to 'src/app/state.rs')
-rw-r--r--src/app/state.rs58
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,
+ ));
+ }
+}