fix: let local agent clicks cancel remote handoffs (#4236)

refs #3903
This commit is contained in:
Can Celik
2026-09-16 15:29:45 +03:00
committed by GitHub
parent d1a53b2c0e
commit 68ae6adea0
2 changed files with 36 additions and 15 deletions
+5 -15
View File
@@ -92,21 +92,11 @@ impl ClientShellState {
else {
return false;
};
if !self.endpoint_is_online(&endpoint_id) {
let label = self.endpoint_label(&endpoint_id).to_owned();
self.receive_endpoint_unavailable(format!("{label} is reconnecting"));
outcome.repaint = true;
} else if endpoint_id == self.active_endpoint_id {
self.push_endpoint_method(
crate::api::schema::Method::PaneFocus(crate::api::schema::PaneTarget { pane_id }),
outcome,
);
} else {
outcome.actions.push(ClientShellAction::ActivateEndpoint {
endpoint_id,
target: Some(ClientEndpointFocusTarget::Pane(pane_id)),
});
}
self.focus_or_activate(
endpoint_id,
ClientEndpointFocusTarget::Pane(pane_id),
outcome,
);
true
}
+31
View File
@@ -149,6 +149,37 @@ fn switching_machines_preserves_aggregate_agent_scroll_and_visible_rows() {
}
}
#[test]
fn local_agent_click_can_cancel_a_pending_remote_switch() {
for reconnecting in [false, true] {
let (mut state, remote) = state_with_scrollable_agents();
assert!(state.activate_endpoint(remote, &mut ClientShellInput::default()));
if reconnecting {
state.mark_endpoint_disconnected(&ClientEndpointId::Local);
}
state.compose(100, 28).unwrap();
let (rect, _, pane_id) = state
.hits
.endpoint_agents
.iter()
.find(|(_, endpoint, _)| endpoint.is_local())
.unwrap()
.clone();
let outcome = state.handle_raw_events(vec![RawInputEvent::Mouse(MouseEvent {
kind: MouseEventKind::Down(MouseButton::Left),
column: rect.x + 2,
row: rect.y,
modifiers: KeyModifiers::NONE,
})]);
assert!(
matches!(outcome.actions.as_slice(), [ClientShellAction::ActivateEndpoint {
endpoint_id: ClientEndpointId::Local,
target: Some(ClientEndpointFocusTarget::Pane(target)),
}] if target == &pane_id)
);
}
}
#[test]
fn aggregate_agent_scroll_still_clamps_when_rows_shrink_on_activation() {
let (mut state, remote) = state_with_scrollable_agents();