aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src/display.rs
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2019-11-03 21:59:28 +0100
committerGitHub <noreply@github.com>2019-11-03 21:59:28 +0100
commitb47a88b142a8987f1d0d48db8c0db1e5f3048a76 (patch)
tree0863fb40b8e081ccc40f1437e74c49a68f4e6c59 /alacritty/src/display.rs
parentfa6ceacfa4158c568c55dff85621788ff1df4099 (diff)
downloadr-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.rs55
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.);