aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-server/src
diff options
context:
space:
mode:
authordivens <divens@users.noreply.github.com>2026-04-15 09:54:38 +0200
committerGitHub <noreply@github.com>2026-04-15 09:54:38 +0200
commit0d8ebaa234885ad298962a7b702cbc00bba16521 (patch)
tree8b16abf409cb15c0447939921553781856d48903 /zellij-server/src
parentbump development version (diff)
downloadsl0ppij-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')
-rw-r--r--zellij-server/src/unit/screen_tests.rs68
-rw-r--r--zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_ctrl_c_reaches_pty_writer.snap14
-rw-r--r--zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_ctrl_w_reaches_pty_writer.snap14
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,
+ ),
+]