diff options
| author | divens <divens@users.noreply.github.com> | 2026-04-15 09:54:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-15 09:54:38 +0200 |
| commit | 0d8ebaa234885ad298962a7b702cbc00bba16521 (patch) | |
| tree | 8b16abf409cb15c0447939921553781856d48903 /zellij-server/src | |
| parent | bump development version (diff) | |
| download | sl0ppij-0d8ebaa234885ad298962a7b702cbc00bba16521.tar.gz sl0ppij-0d8ebaa234885ad298962a7b702cbc00bba16521.tar.xz sl0ppij-0d8ebaa234885ad298962a7b702cbc00bba16521.zip | |
fix(windows): skip modifier re-encoding for Char keys in cast_crossterm_key (#5014)
PR #4967 added VT modifier encoding for non-Char keys but the guard
condition also matched Char keys, re-encoding Ctrl+C from [0x03] to
CSI u sequence \x1b[3;5u which shells don't understand. Skip the
encoding block for Char keys since they already handle modifiers.
Diffstat (limited to 'zellij-server/src')
3 files changed, 96 insertions, 0 deletions
diff --git a/zellij-server/src/unit/screen_tests.rs b/zellij-server/src/unit/screen_tests.rs index a93c63bf..44f0d31a 100644 --- a/zellij-server/src/unit/screen_tests.rs +++ b/zellij-server/src/unit/screen_tests.rs @@ -2268,6 +2268,74 @@ pub fn send_cli_send_keys_action_to_screen() { } #[test] +pub fn send_cli_ctrl_c_reaches_pty_writer() { + let size = Size { + cols: 121, + rows: 20, + }; + let client_id = 10; + let mut mock_screen = MockScreen::new(size); + let pty_writer_receiver = mock_screen.pty_writer_receiver.take().unwrap(); + let session_metadata = mock_screen.clone_session_metadata(); + let screen_thread = mock_screen.run(None, vec![]); + let received_pty_instructions = Arc::new(Mutex::new(vec![])); + let pty_writer_thread = log_actions_in_thread!( + received_pty_instructions, + PtyWriteInstruction::Exit, + pty_writer_receiver + ); + let cli_action = CliAction::SendKeys { + keys: vec!["Ctrl c".to_string()], + pane_id: None, + }; + send_cli_action_to_server(&session_metadata, cli_action, client_id); + std::thread::sleep(std::time::Duration::from_millis(100)); + mock_screen.teardown(vec![pty_writer_thread, screen_thread]); + let received_write_instructions: Vec<_> = received_pty_instructions + .lock() + .unwrap() + .clone() + .into_iter() + .filter(|i| matches!(i, PtyWriteInstruction::Write(..))) + .collect(); + assert_snapshot!(format!("{:#?}", received_write_instructions)); +} + +#[test] +pub fn send_cli_ctrl_w_reaches_pty_writer() { + let size = Size { + cols: 121, + rows: 20, + }; + let client_id = 10; + let mut mock_screen = MockScreen::new(size); + let pty_writer_receiver = mock_screen.pty_writer_receiver.take().unwrap(); + let session_metadata = mock_screen.clone_session_metadata(); + let screen_thread = mock_screen.run(None, vec![]); + let received_pty_instructions = Arc::new(Mutex::new(vec![])); + let pty_writer_thread = log_actions_in_thread!( + received_pty_instructions, + PtyWriteInstruction::Exit, + pty_writer_receiver + ); + let cli_action = CliAction::SendKeys { + keys: vec!["Ctrl w".to_string()], + pane_id: None, + }; + send_cli_action_to_server(&session_metadata, cli_action, client_id); + std::thread::sleep(std::time::Duration::from_millis(100)); + mock_screen.teardown(vec![pty_writer_thread, screen_thread]); + let received_write_instructions: Vec<_> = received_pty_instructions + .lock() + .unwrap() + .clone() + .into_iter() + .filter(|i| matches!(i, PtyWriteInstruction::Write(..))) + .collect(); + assert_snapshot!(format!("{:#?}", received_write_instructions)); +} + +#[test] pub fn send_cli_resize_action_to_screen() { let size = Size { cols: 80, rows: 20 }; let client_id = 10; // fake client id should not appear in the screen's state diff --git a/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_ctrl_c_reaches_pty_writer.snap b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_ctrl_c_reaches_pty_writer.snap new file mode 100644 index 00000000..0269fe25 --- /dev/null +++ b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_ctrl_c_reaches_pty_writer.snap @@ -0,0 +1,14 @@ +--- +source: zellij-server/src/./unit/screen_tests.rs +assertion_line: 2301 +expression: "format!(\"{:#?}\", received_write_instructions)" +--- +[ + Write( + [ + 3, + ], + 0, + None, + ), +] diff --git a/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_ctrl_w_reaches_pty_writer.snap b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_ctrl_w_reaches_pty_writer.snap new file mode 100644 index 00000000..1994d125 --- /dev/null +++ b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_ctrl_w_reaches_pty_writer.snap @@ -0,0 +1,14 @@ +--- +source: zellij-server/src/./unit/screen_tests.rs +assertion_line: 2335 +expression: "format!(\"{:#?}\", received_write_instructions)" +--- +[ + Write( + [ + 23, + ], + 0, + None, + ), +] |
