aboutsummaryrefslogtreecommitdiff
path: root/src/app/input
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-03 02:39:12 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-03 02:39:39 +0300
commit8968a0a4a8e80761ae6c8dab9b912530f619479c (patch)
tree5b4b8ebe1b41d51d3da70715425002d3449db036 /src/app/input
parent719dff6d3cefbe586403d5a8454b119df4ec3ccd (diff)
fix: support legacy shifted letter keybindings
refs #312
Diffstat (limited to 'src/app/input')
-rw-r--r--src/app/input/navigate.rs82
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(