aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorJJ Liebig <jonathan.liebig@gmail.com>2026-09-01 23:46:16 +0400
committerGitHub <noreply@github.com>2026-09-01 21:46:16 +0200
commit99c23cd1ea7468bd3661f6483c7105396503b417 (patch)
treeeb1582557a5a62f4679c706b8f53e29529d1568a /src/server
parent98307c509e9688575d006b47d26d0db561cda0a4 (diff)
fix(windows): preserve native pane key identity (#3503)
Diffstat (limited to 'src/server')
-rw-r--r--src/server/clients.rs15
-rw-r--r--src/server/headless/tests/mod.rs7
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!(