diff options
| author | JJ Liebig <jonathan.liebig@gmail.com> | 2026-09-01 23:46:16 +0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-01 21:46:16 +0200 |
| commit | 99c23cd1ea7468bd3661f6483c7105396503b417 (patch) | |
| tree | eb1582557a5a62f4679c706b8f53e29529d1568a /src/server | |
| parent | 98307c509e9688575d006b47d26d0db561cda0a4 (diff) | |
fix(windows): preserve native pane key identity (#3503)
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/clients.rs | 15 | ||||
| -rw-r--r-- | src/server/headless/tests/mod.rs | 7 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/server/clients.rs b/src/server/clients.rs index d380e2c3..3860f826 100644 --- a/src/server/clients.rs +++ b/src/server/clients.rs @@ -188,6 +188,7 @@ impl ClientConnection { shifted_codepoint, tracks_release: true, physical_key_id, + windows_record, .. } => { self.shell_held_inputs.insert( @@ -203,6 +204,7 @@ impl ClientConnection { generated_text: None, tracks_release: true, physical_key_id: *physical_key_id, + windows_record: *windows_record, }, }, ); @@ -458,6 +460,7 @@ mod tests { generated_text: Some("x".into()), tracks_release: false, physical_key_id: None, + windows_record: None, }], ); @@ -467,6 +470,14 @@ mod tests { #[test] fn physical_keys_with_the_same_semantic_code_keep_distinct_release_leases() { let mut client = shell_client(); + let windows_record = crate::input::WindowsKeyRecord { + key_down: true, + repeat_count: 1, + virtual_key_code: 0x6c, + virtual_scan_code: 0x1c, + unicode: 13, + control_key_state: 0, + }; let key = |kind, physical_key_id| ClientPaneInputEvent::Key { code: crate::protocol::ClientKeyCode::Enter, modifiers: 0, @@ -476,6 +487,7 @@ mod tests { generated_text: None, tracks_release: true, physical_key_id: Some(physical_key_id), + windows_record: (physical_key_id == 108).then_some(windows_record), }; client.track_shell_input( ClientShellInputTarget::Pane("w1:p1".into()), @@ -494,8 +506,9 @@ mod tests { code: crate::protocol::ClientKeyCode::Enter, kind: ClientKeyKind::Release, physical_key_id: Some(108), + windows_record: Some(record), .. - } + } if *record == windows_record )); } } diff --git a/src/server/headless/tests/mod.rs b/src/server/headless/tests/mod.rs index 102f2fc6..f5c33f6a 100644 --- a/src/server/headless/tests/mod.rs +++ b/src/server/headless/tests/mod.rs @@ -1262,6 +1262,7 @@ async fn client_shell_input_targets_runtime_without_server_shell_classification( generated_text: None, tracks_release: true, physical_key_id: None, + windows_record: None, }, crate::protocol::ClientPaneInputEvent::Key { code: crate::protocol::ClientKeyCode::Char('c'), @@ -1272,6 +1273,7 @@ async fn client_shell_input_targets_runtime_without_server_shell_classification( generated_text: None, tracks_release: true, physical_key_id: None, + windows_record: None, }, crate::protocol::ClientPaneInputEvent::Key { code: crate::protocol::ClientKeyCode::Char('x'), @@ -1282,6 +1284,7 @@ async fn client_shell_input_targets_runtime_without_server_shell_classification( generated_text: None, tracks_release: true, physical_key_id: None, + windows_record: None, }, crate::protocol::ClientPaneInputEvent::Mouse { kind: crate::protocol::ClientMouseKind::Down( @@ -1386,6 +1389,7 @@ async fn client_shell_hidden_pane_rejects_presses_but_accepts_releases() { generated_text: None, tracks_release: true, physical_key_id: Some(0x2d), + windows_record: None, }; assert!( @@ -1592,6 +1596,7 @@ async fn client_shell_release_under_popup_renders_when_it_resets_scrollback() { generated_text: None, tracks_release: true, physical_key_id: Some(0x2d), + windows_record: None, }], }); @@ -3000,6 +3005,7 @@ fn client_page_key( generated_text: None, tracks_release: true, physical_key_id: None, + windows_record: None, } } @@ -3558,6 +3564,7 @@ async fn client_shell_release_cleanup_does_not_promote_and_survives_disconnect() generated_text: (kind == crate::protocol::ClientKeyKind::Press).then(|| "x".to_owned()), tracks_release: true, physical_key_id: Some(0x2d), + windows_record: None, }; assert!( |
