From 8968a0a4a8e80761ae6c8dab9b912530f619479c Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Wed, 3 Jun 2026 02:39:12 +0300 Subject: fix: support legacy shifted letter keybindings refs #312 --- src/app/input/navigate.rs | 82 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) (limited to 'src/app/input') diff --git a/src/app/input/navigate.rs b/src/app/input/navigate.rs index b6edefaf..4bd69f1c 100644 --- a/src/app/input/navigate.rs +++ b/src/app/input/navigate.rs @@ -1569,6 +1569,88 @@ last_pane = "prefix+tab" assert_eq!(app.state.mode, Mode::Terminal); } + #[tokio::test] + async fn navigate_mode_matches_legacy_uppercase_shifted_letter() { + let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); + let mut app = App::new( + &Config::default(), + true, + None, + api_rx, + crate::api::EventHub::default(), + ); + app.state.workspaces = vec![Workspace::test_new("test")]; + app.state.active = Some(0); + app.state.selected = 0; + app.state.mode = Mode::Navigate; + + app.handle_navigate_key(TerminalKey::new(KeyCode::Char('N'), KeyModifiers::empty())); + + assert!(app.state.request_new_workspace); + assert_eq!(app.state.mode, Mode::Terminal); + } + + #[tokio::test] + async fn legacy_uppercase_prefers_shifted_workspace_binding_over_unshifted() { + let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); + let mut app = App::new( + &Config::default(), + true, + None, + api_rx, + crate::api::EventHub::default(), + ); + app.state.workspaces = vec![Workspace::test_new("test")]; + app.state.active = Some(0); + app.state.selected = 0; + app.state.mode = Mode::Navigate; + + app.handle_navigate_key(TerminalKey::new(KeyCode::Char('W'), KeyModifiers::empty())); + + assert_eq!(app.state.mode, Mode::RenameWorkspace); + } + + #[tokio::test] + async fn legacy_uppercase_prefers_shifted_reload_binding_over_unshifted() { + let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); + let mut app = App::new( + &Config::default(), + true, + None, + api_rx, + crate::api::EventHub::default(), + ); + app.state.workspaces = vec![Workspace::test_new("test")]; + app.state.active = Some(0); + app.state.selected = 0; + app.state.mode = Mode::Navigate; + + app.handle_navigate_key(TerminalKey::new(KeyCode::Char('R'), KeyModifiers::empty())); + + assert!(app.state.request_reload_config); + assert_eq!(app.state.mode, Mode::Terminal); + } + + #[tokio::test] + async fn legacy_uppercase_prefers_shifted_pane_binding_over_unshifted() { + let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); + let mut app = App::new( + &Config::default(), + true, + None, + api_rx, + crate::api::EventHub::default(), + ); + app.state.workspaces = vec![Workspace::test_new("test")]; + app.state.active = Some(0); + app.state.selected = 0; + app.state.mode = Mode::Navigate; + + app.handle_navigate_key(TerminalKey::new(KeyCode::Char('P'), KeyModifiers::empty())); + + assert_eq!(app.state.mode, Mode::RenamePane); + } + #[tokio::test] async fn prefix_focus_pane_is_one_shot_and_returns_to_terminal() { let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); -- cgit v1.2.3