terminal: Highlight links on ctrl/cmd-hover in mouse mode

When the running app had mouse reporting on, moving the pointer over a
link with ctrl/cmd held never underlined it, while pressing the modifier
with the pointer already on the link did. `mouse_move` only scheduled
the hyperlink lookup outside of mouse mode, but the modifier change and
grid refresh paths don't check it, and ctrl/cmd-click already opens
links in mouse mode through `open_links_in_mouse_mode`.

Also look up the hovered link in mouse mode when that setting is on,
after the motion has been reported to the app.

Closes #64102
This commit is contained in:
dualfroz committed 2026-10-03 01:58:16 +02:00
1 parent 8acb6f4d72
commit e3da47c875
1 file changed
+71
+71
View File
@@ -2596,6 +2596,12 @@ impl Terminal {
}
}
}
// Ctrl/cmd-click opens links in mouse mode when this is enabled, so
// hovering with the modifier held has to highlight them as well.
if TerminalSettings::get_global(cx).open_links_in_mouse_mode {
self.schedule_find_hyperlink(e.modifiers, e.position, cx);
}
} else {
self.schedule_find_hyperlink(e.modifiers, e.position, cx);
}
@@ -5507,6 +5513,71 @@ mod tests {
});
}
#[gpui::test]
async fn test_ctrl_hover_finds_hyperlink_in_mouse_mode(cx: &mut TestAppContext) {
let terminal = init_terminal_test(cx, b"Visit https://zed.dev/ for more\r\n");
terminal.update(cx, |terminal, cx| {
terminal.last_content.mode = Modes::MOUSE_REPORT_CLICK | Modes::MOUSE_MOTION;
terminal.mouse_move(
&MouseMoveEvent {
position: point(px(80.0), px(10.0)),
pressed_button: None,
modifiers: Modifiers::secondary_key(),
},
MouseInputMode::ReportToTerminal,
cx,
);
assert!(
any_event_matches!(terminal, InternalEvent::FindHyperlink(_, false)),
"ctrl+hover must look up the hyperlink under the pointer in mouse mode"
);
let pty_writes = terminal.take_pty_write_log();
assert_eq!(
pty_writes.len(),
1,
"the motion must still be reported to the app, got {pty_writes:?}"
);
});
}
#[gpui::test]
async fn test_ctrl_hover_in_mouse_mode_ignored_when_setting_disabled(
cx: &mut TestAppContext,
) {
let terminal = init_terminal_test(cx, b"Visit https://zed.dev/ for more\r\n");
cx.update_global(|store: &mut settings::SettingsStore, cx| {
store.update_user_settings(cx, |settings| {
settings
.terminal
.get_or_insert_default()
.open_links_in_mouse_mode = Some(false);
});
});
terminal.update(cx, |terminal, cx| {
terminal.last_content.mode = Modes::MOUSE_REPORT_CLICK | Modes::MOUSE_MOTION;
terminal.mouse_move(
&MouseMoveEvent {
position: point(px(80.0), px(10.0)),
pressed_button: None,
modifiers: Modifiers::secondary_key(),
},
MouseInputMode::ReportToTerminal,
cx,
);
assert!(
!any_event_matches!(terminal, InternalEvent::FindHyperlink(_, _)),
"with the setting disabled, ctrl+hover must not look up links in mouse mode"
);
});
}
#[gpui::test]
async fn test_hyperlink_ctrl_click_drag_outside_bounds(cx: &mut TestAppContext) {
let terminal = init_terminal_test(