diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-03 02:39:12 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-03 02:39:39 +0300 |
| commit | 8968a0a4a8e80761ae6c8dab9b912530f619479c (patch) | |
| tree | 5b4b8ebe1b41d51d3da70715425002d3449db036 /src/app/input | |
| parent | 719dff6d3cefbe586403d5a8454b119df4ec3ccd (diff) | |
fix: support legacy shifted letter keybindings
refs #312
Diffstat (limited to 'src/app/input')
| -rw-r--r-- | src/app/input/navigate.rs | 82 |
1 files changed, 82 insertions, 0 deletions
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 @@ -1570,6 +1570,88 @@ last_pane = "prefix+tab" } #[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(); let mut app = App::new( |
