aboutsummaryrefslogtreecommitdiff
path: root/src/app
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-08-07 19:07:36 +0300
committerGitHub <noreply@github.com>2026-08-07 19:07:36 +0300
commitb0723b7906998dbe5314aaf05d18c047fd288dd0 (patch)
tree07a40ec092468b551cf46d93074101ea61644f1b /src/app
parent374d3eddc55ac0d8b21df2b6bf7f056634fb86f9 (diff)
fix(input): preserve shift in kitty alternate reports (#2479)
refs #2435
Diffstat (limited to 'src/app')
-rw-r--r--src/app/input/navigate.rs36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/app/input/navigate.rs b/src/app/input/navigate.rs
index 68941e66..1c892028 100644
--- a/src/app/input/navigate.rs
+++ b/src/app/input/navigate.rs
@@ -1901,7 +1901,12 @@ mod tests {
use super::super::{state_with_workspaces, unique_temp_path};
use super::*;
use crate::{
- app::App, config::Config, input::TerminalKey, terminal::TerminalState, workspace::Workspace,
+ app::App,
+ config::Config,
+ input::TerminalKey,
+ raw_input::{parse_raw_input_bytes_sync, RawInputEvent},
+ terminal::TerminalState,
+ workspace::Workspace,
};
fn mark_worktree_space_member(state: &mut AppState, ws_idx: usize, key: &str) {
@@ -2841,6 +2846,35 @@ command = "printf literal > '{}'"
}
#[tokio::test]
+ async fn kitty_shifted_alternate_without_modifier_prefers_reload_over_resize() {
+ 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::Prefix;
+
+ let mut events = parse_raw_input_bytes_sync(b"\x1b[114:82;1u");
+ assert_eq!(events.len(), 1);
+ let RawInputEvent::Key(key) = events.remove(0) else {
+ panic!("expected key event");
+ };
+ assert_eq!(
+ action_for_key(&app.state, key.clone(), BindingDispatch::Prefix),
+ Some(NavigateAction::ReloadConfig)
+ );
+ app.handle_prefix_key(key);
+
+ assert_eq!(app.state.mode, Mode::Terminal);
+ }
+
+ #[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(