diff options
Diffstat (limited to 'alacritty_terminal/src/input.rs')
-rw-r--r-- | alacritty_terminal/src/input.rs | 64 |
1 files changed, 13 insertions, 51 deletions
diff --git a/alacritty_terminal/src/input.rs b/alacritty_terminal/src/input.rs index 9443a1a9..8eceef16 100644 --- a/alacritty_terminal/src/input.rs +++ b/alacritty_terminal/src/input.rs @@ -18,27 +18,25 @@ //! In order to figure that out, state about which modifier keys are pressed //! needs to be tracked. Additionally, we need a bit of a state machine to //! determine what to do when a non-modifier key is pressed. +use crate::url::Url; use std::borrow::Cow; use std::mem; -use std::ops::RangeInclusive; use std::time::Instant; use glutin::{ ElementState, KeyboardInput, ModifiersState, MouseButton, MouseCursor, MouseScrollDelta, TouchPhase, }; -use unicode_width::UnicodeWidthStr; use crate::ansi::{ClearMode, Handler}; use crate::clipboard::ClipboardType; use crate::config::{self, Key}; use crate::event::{ClickState, Mouse}; use crate::grid::Scroll; -use crate::index::{Column, Line, Linear, Point, Side}; +use crate::index::{Column, Line, Point, Side}; use crate::message_bar::{self, Message}; use crate::term::mode::TermMode; -use crate::term::{Search, SizeInfo, Term}; -use crate::url::Url; +use crate::term::{SizeInfo, Term}; use crate::util::start_daemon; pub const FONT_SIZE_STEP: f32 = 0.5; @@ -392,15 +390,18 @@ enum MousePosition { impl<'a, A: ActionContext + 'a> Processor<'a, A> { fn mouse_position(&mut self, point: Point) -> MousePosition { + let buffer_point = self.ctx.terminal().visible_to_buffer(point); + + // Check message bar before URL to ignore URLs in the message bar if let Some(message) = self.message_at_point(Some(point)) { if self.message_close_at_point(point, message) { MousePosition::MessageBarButton } else { MousePosition::MessageBar } - // Check for url should be after check for message bar, since we're not looking into - // message bar content. - } else if let Some(url) = self.ctx.terminal().url_search(point.into()) { + } else if let Some(url) = + self.ctx.terminal().urls().drain(..).find(|url| url.contains(buffer_point)) + { MousePosition::Url(url) } else { MousePosition::Terminal @@ -443,7 +444,7 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> { && (!self.ctx.terminal().mode().intersects(mouse_mode) || modifiers.shift) && self.mouse_config.url.launcher.is_some() { - let url_bounds = self.url_bounds_at_point(url, point); + let url_bounds = url.linear_bounds(self.ctx.terminal()); self.ctx.terminal_mut().set_url_highlight(url_bounds); self.ctx.terminal_mut().set_mouse_cursor(MouseCursor::Hand); self.ctx.terminal_mut().dirty = true; @@ -485,47 +486,6 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> { } } - fn url_bounds_at_point(&self, url: Url, point: Point) -> RangeInclusive<Linear> { - let Url { origin, text } = url; - let cols = self.ctx.size_info().cols().0; - - // Calculate the URL's start position - let lines_before = (origin + cols - point.col.0 - 1) / cols; - let (start_col, start_line) = if lines_before > point.line.0 { - (0, 0) - } else { - let start_col = (cols + point.col.0 - origin % cols) % cols; - let start_line = point.line.0 - lines_before; - (start_col, start_line) - }; - - let start = Point::new(start_line, Column(start_col)); - - // Calculate the URL's highlight end position - let len = text.width(); - let url_end_col_denormilized = point.col.0 + len - origin; - - // This means that url ends at the last cell of the line - let end_col = if url_end_col_denormilized % cols == 0 { - cols - 1 - } else { - url_end_col_denormilized % cols - 1 - }; - - let end_line = if end_col == cols - 1 { - point.line.0 + (url_end_col_denormilized) / cols - 1 - } else { - point.line.0 + (url_end_col_denormilized) / cols - }; - - let end = Point::new(end_line, Column(end_col)); - - let start = Linear::from_point(Column(cols), start); - let end = Linear::from_point(Column(cols), end); - - RangeInclusive::new(start, end) - } - fn get_mouse_side(&self) -> Side { let size_info = self.ctx.size_info(); let x = self.ctx.mouse().x; @@ -705,7 +665,9 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> { return None; } - let text = self.ctx.terminal().url_search(point.into())?.text; + let point = self.ctx.terminal().visible_to_buffer(point); + let url = self.ctx.terminal().urls().drain(..).find(|url| url.contains(point))?; + let text = self.ctx.terminal().url_to_string(&url); let launcher = self.mouse_config.url.launcher.as_ref()?; let mut args = launcher.args().to_vec(); |