diff options
author | Christian Duerr <contact@christianduerr.com> | 2019-11-03 21:59:28 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-03 21:59:28 +0100 |
commit | b47a88b142a8987f1d0d48db8c0db1e5f3048a76 (patch) | |
tree | 0863fb40b8e081ccc40f1437e74c49a68f4e6c59 /alacritty/src/display.rs | |
parent | fa6ceacfa4158c568c55dff85621788ff1df4099 (diff) | |
download | r-alacritty-b47a88b142a8987f1d0d48db8c0db1e5f3048a76.tar.gz r-alacritty-b47a88b142a8987f1d0d48db8c0db1e5f3048a76.tar.bz2 r-alacritty-b47a88b142a8987f1d0d48db8c0db1e5f3048a76.zip |
Fix URL highlighting
Fixes #2898.
Fixes #2479.
Diffstat (limited to 'alacritty/src/display.rs')
-rw-r--r-- | alacritty/src/display.rs | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/alacritty/src/display.rs b/alacritty/src/display.rs index 07810ecd..53a5f47c 100644 --- a/alacritty/src/display.rs +++ b/alacritty/src/display.rs @@ -19,7 +19,9 @@ use std::fmt; use std::time::Instant; use glutin::dpi::{PhysicalPosition, PhysicalSize}; +use glutin::event::ModifiersState; use glutin::event_loop::EventLoop; +use glutin::window::CursorIcon; use log::{debug, info}; use parking_lot::MutexGuard; @@ -32,11 +34,13 @@ use alacritty_terminal::message_bar::MessageBuffer; use alacritty_terminal::meter::Meter; use alacritty_terminal::renderer::rects::{RenderLines, RenderRect}; use alacritty_terminal::renderer::{self, GlyphCache, QuadRenderer}; +use alacritty_terminal::selection::Selection; use alacritty_terminal::term::color::Rgb; -use alacritty_terminal::term::{RenderableCell, SizeInfo, Term}; +use alacritty_terminal::term::{RenderableCell, SizeInfo, Term, TermMode}; use crate::config::Config; -use crate::event::DisplayUpdate; +use crate::event::{DisplayUpdate, Mouse}; +use crate::url::{Url, Urls}; use crate::window::{self, Window}; #[derive(Debug)] @@ -113,6 +117,10 @@ impl From<glutin::ContextError> for Error { pub struct Display { pub size_info: SizeInfo, pub window: Window, + pub urls: Urls, + + /// Currently highlighted URL. + pub highlighted_url: Option<Url>, renderer: QuadRenderer, glyph_cache: GlyphCache, @@ -223,7 +231,15 @@ impl Display { _ => (), } - Ok(Display { window, renderer, glyph_cache, meter: Meter::new(), size_info }) + Ok(Display { + window, + renderer, + glyph_cache, + meter: Meter::new(), + size_info, + urls: Urls::new(), + highlighted_url: None, + }) } fn new_glyph_cache( @@ -341,6 +357,8 @@ impl Display { terminal: MutexGuard<'_, Term<T>>, message_buffer: &MessageBuffer, config: &Config, + mouse: &Mouse, + mods: ModifiersState, ) { let grid_cells: Vec<RenderableCell> = terminal.renderable_cells(config).collect(); let visual_bell_intensity = terminal.visual_bell.intensity(); @@ -349,6 +367,9 @@ impl Display { let glyph_cache = &mut self.glyph_cache; let size_info = self.size_info; + let selection = !terminal.selection().as_ref().map(Selection::is_empty).unwrap_or(true); + let mouse_mode = terminal.mode().intersects(TermMode::MOUSE_MODE); + // Update IME position #[cfg(not(windows))] self.window.update_ime_position(&terminal, &self.size_info); @@ -361,6 +382,7 @@ impl Display { }); let mut lines = RenderLines::new(); + let mut urls = Urls::new(); // Draw grid { @@ -369,6 +391,9 @@ impl Display { self.renderer.with_api(&config, &size_info, |mut api| { // Iterate over all non-empty cells in the grid for cell in grid_cells { + // Update URL underlines + urls.update(size_info.cols().0, cell); + // Update underline/strikeout lines.update(cell); @@ -378,9 +403,27 @@ impl Display { }); } - let mut rects = lines.into_rects(&metrics, &size_info); + let mut rects = lines.rects(&metrics, &size_info); + + // Update visible URLs + self.urls = urls; + if let Some(url) = self.urls.highlighted(config, mouse, mods, mouse_mode, selection) { + rects.append(&mut url.rects(&metrics, &size_info)); + + self.window.set_mouse_cursor(CursorIcon::Hand); + + self.highlighted_url = Some(url); + } else if self.highlighted_url.is_some() { + self.highlighted_url = None; + + if mouse_mode { + self.window.set_mouse_cursor(CursorIcon::Default); + } else { + self.window.set_mouse_cursor(CursorIcon::Text); + } + } - // Push visual bell after underline/strikeout rects + // Push visual bell after url/underline/strikeout rects if visual_bell_intensity != 0. { let visual_bell_rect = RenderRect::new( 0., @@ -398,7 +441,7 @@ impl Display { // Create a new rectangle for the background let start_line = size_info.lines().0 - text.len(); - let y = size_info.padding_y + size_info.cell_height * start_line as f32; + let y = size_info.cell_height.mul_add(start_line as f32, size_info.padding_y); let message_bar_rect = RenderRect::new(0., y, size_info.width, size_info.height - y, message.color(), 1.); |