From 244b1a3fad315d04949f34f1010671af02a142d3 Mon Sep 17 00:00:00 2001 From: Mattias Eriksson Date: Fri, 10 Oct 2025 10:36:10 +0200 Subject: [PATCH 1/2] Only use mouse interaction pointer for links if CTRL is used --- src/terminal_box.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/terminal_box.rs b/src/terminal_box.rs index 89df19f..fa027cb 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -265,17 +265,19 @@ where && y >= 0.0 && y < buffer_size.1.unwrap_or(0.0) { - let col = x / terminal.size().cell_width; - let row = y / terminal.size().cell_height; + if state.modifiers.contains(Modifiers::CTRL) { + let col = x / terminal.size().cell_width; + let row = y / terminal.size().cell_height; - let location = terminal - .viewport_to_point(TermPoint::new(row as usize, TermColumn(col as usize))); - if let Some(_) = terminal - .regex_matches - .iter() - .find(|bounds| bounds.contains(&location)) - { - return mouse::Interaction::Pointer; + let location = terminal + .viewport_to_point(TermPoint::new(row as usize, TermColumn(col as usize))); + if terminal + .regex_matches + .iter() + .any(|bounds| bounds.contains(&location)) + { + return mouse::Interaction::Pointer; + } } return mouse::Interaction::Text; From 71876b5fe22338a405854a4720cbcad5b7636309 Mon Sep 17 00:00:00 2001 From: Mattias Eriksson Date: Fri, 10 Oct 2025 12:56:56 +0200 Subject: [PATCH 2/2] Update regex based on ctrl modifier --- src/terminal_box.rs | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/terminal_box.rs b/src/terminal_box.rs index fa027cb..b2576c5 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -910,6 +910,25 @@ where } Event::Keyboard(KeyEvent::ModifiersChanged(modifiers)) => { state.modifiers = modifiers; + + if modifiers.contains(Modifiers::CTRL) || terminal.active_regex_match.is_some() { + //Might need to update the url regex highlight, + //so we need to calculate the mouse position + let location = if let Some(p) = cursor_position.position() { + let x = (p.x - layout.bounds().x) - self.padding.left; + let y = (p.y - layout.bounds().y) - self.padding.top; + //TODO: better calculation of position + let col = x / terminal.size().cell_width; + let row = y / terminal.size().cell_height; + Some(terminal.viewport_to_point(TermPoint::new( + row as usize, + TermColumn(col as usize), + ))) + } else { + None + }; + update_active_regex_match(&mut terminal, location, &state.modifiers); + } } Event::Keyboard(KeyEvent::KeyPressed { text, @@ -1163,7 +1182,7 @@ where let row = y / terminal.size().cell_height; let location = terminal .viewport_to_point(TermPoint::new(row as usize, TermColumn(col as usize))); - update_active_regex_match(&mut terminal, location); + update_active_regex_match(&mut terminal, Some(location), &state.modifiers); if is_mouse_mode { terminal.report_mouse(event, &state.modifiers, col as u32, row as u32); @@ -1264,7 +1283,7 @@ where row as usize, TermColumn(col as usize), )); - update_active_regex_match(&mut terminal, location); + update_active_regex_match(&mut terminal, Some(location), &state.modifiers); } } } @@ -1277,8 +1296,23 @@ where fn update_active_regex_match( terminal: &mut std::sync::MutexGuard<'_, Terminal>, - location: TermPoint, + location: Option, + modifiers: &Modifiers, ) { + if !modifiers.contains(Modifiers::CTRL) { + if terminal.active_regex_match.is_some() { + terminal.active_regex_match = None; + terminal.needs_update = true; + } + return; + } + let Some(location) = location else { + if terminal.active_regex_match.is_some() { + terminal.active_regex_match = None; + terminal.needs_update = true; + } + return; + }; if let Some(match_) = terminal .regex_matches .iter()