aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2024-03-12 12:15:00 +0100
committerChristian Duerr <contact@christianduerr.com>2024-03-19 02:20:53 +0100
commit02e4825a92cc0c3570e896f61cf60e5272aa20b4 (patch)
tree645d1382659cd6d541849bea08f334f405cff9af
parentd3267eb964766752a37b94fd3cde12bd033ac777 (diff)
downloadalacritty-02e4825a92cc0c3570e896f61cf60e5272aa20b4.tar.gz
alacritty-02e4825a92cc0c3570e896f61cf60e5272aa20b4.zip
Fix hint `Select` action for hyperlink escape
This fixes an issue where the `Select` action for hyperlink escape text would select the entire line, instead of selecting only the hyperlink itself. It also changes the way hyperlinks with the same ID are highlighted, removing the restriction of being on consecutive lines and instead highlighting all visible cells that correspond to the matching hyperlink. Closes #7766.
-rw-r--r--CHANGELOG.md1
-rw-r--r--alacritty/src/cli.rs2
-rw-r--r--alacritty/src/config/ui_config.rs2
-rw-r--r--alacritty/src/display/hint.rs48
-rw-r--r--alacritty/src/display/mod.rs2
-rw-r--r--alacritty/src/logging.rs2
-rw-r--r--alacritty_terminal/src/event_loop.rs1
-rw-r--r--alacritty_terminal/src/grid/storage.rs2
-rw-r--r--alacritty_terminal/src/term/mod.rs2
-rw-r--r--alacritty_terminal/src/tty/unix.rs2
10 files changed, 22 insertions, 42 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2ea4a61d..dd1ce8f3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -30,6 +30,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Mouse cursor not changing on Wayland when cursor theme uses legacy cursor icon names
- Config keys are available under proper names
- Build failure when compiling with x11 feature on NetBSD
+- Hint `Select` action selecting the entire line for URL escapes
### Changed
diff --git a/alacritty/src/cli.rs b/alacritty/src/cli.rs
index fee2680f..d5e24b4a 100644
--- a/alacritty/src/cli.rs
+++ b/alacritty/src/cli.rs
@@ -5,7 +5,7 @@ use std::rc::Rc;
use alacritty_config::SerdeReplace;
use clap::{ArgAction, Args, Parser, Subcommand, ValueHint};
-use log::{self, error, LevelFilter};
+use log::{error, LevelFilter};
use serde::{Deserialize, Serialize};
use toml::Value;
diff --git a/alacritty/src/config/ui_config.rs b/alacritty/src/config/ui_config.rs
index 21059734..a4b6c2c5 100644
--- a/alacritty/src/config/ui_config.rs
+++ b/alacritty/src/config/ui_config.rs
@@ -10,7 +10,7 @@ use alacritty_terminal::term::Config as TermConfig;
use alacritty_terminal::tty::{Options as PtyOptions, Shell};
use log::{error, warn};
use serde::de::{Error as SerdeError, MapAccess, Visitor};
-use serde::{self, Deserialize, Deserializer};
+use serde::{Deserialize, Deserializer};
use unicode_width::UnicodeWidthChar;
use winit::keyboard::{Key, ModifiersState};
diff --git a/alacritty/src/display/hint.rs b/alacritty/src/display/hint.rs
index bd09a881..f118dbe0 100644
--- a/alacritty/src/display/hint.rs
+++ b/alacritty/src/display/hint.rs
@@ -204,7 +204,8 @@ pub struct HintMatch {
impl HintMatch {
#[inline]
pub fn should_highlight(&self, point: Point, pointed_hyperlink: Option<&Hyperlink>) -> bool {
- self.bounds.contains(&point) && self.hyperlink.as_ref() == pointed_hyperlink
+ self.hyperlink.as_ref() == pointed_hyperlink
+ && (self.hyperlink.is_some() || self.bounds.contains(&point))
}
#[inline]
@@ -400,49 +401,30 @@ pub fn highlighted_at<T>(
}
/// Retrieve the hyperlink with its range, if there is one at the specified point.
+///
+/// This will only return contiguous cells, even if another hyperlink with the same ID exists.
fn hyperlink_at<T>(term: &Term<T>, point: Point) -> Option<(Hyperlink, Match)> {
let hyperlink = term.grid()[point].hyperlink()?;
- let viewport_start = Line(-(term.grid().display_offset() as i32));
- let viewport_end = viewport_start + term.bottommost_line();
-
- let mut match_start = Point::new(point.line, Column(0));
- let mut match_end = Point::new(point.line, Column(term.columns() - 1));
let grid = term.grid();
- // Find adjacent lines that have the same `hyperlink`. The end purpose to highlight hyperlinks
- // that span across multiple lines or not directly attached to each other.
-
- // Find the closest to the viewport start adjacent line.
- while match_start.line > viewport_start {
- let next_line = match_start.line - 1i32;
- // Iterate over all the cells in the grid's line and check if any of those cells contains
- // the hyperlink we've found at original `point`.
- let line_contains_hyperlink = grid[next_line]
- .into_iter()
- .any(|cell| cell.hyperlink().map_or(false, |h| h == hyperlink));
-
- // There's no hyperlink on the next line, break.
- if !line_contains_hyperlink {
+ let mut match_end = point;
+ for cell in grid.iter_from(point) {
+ if cell.hyperlink().map_or(false, |link| link == hyperlink) {
+ match_end = cell.point;
+ } else {
break;
}
-
- match_start.line = next_line;
}
- // Ditto for the end.
- while match_end.line < viewport_end {
- let next_line = match_end.line + 1i32;
-
- let line_contains_hyperlink = grid[next_line]
- .into_iter()
- .any(|cell| cell.hyperlink().map_or(false, |h| h == hyperlink));
-
- if !line_contains_hyperlink {
+ let mut match_start = point;
+ let mut iter = grid.iter_from(point);
+ while let Some(cell) = iter.prev() {
+ if cell.hyperlink().map_or(false, |link| link == hyperlink) {
+ match_start = cell.point;
+ } else {
break;
}
-
- match_end.line = next_line;
}
Some((hyperlink, match_start..=match_end))
diff --git a/alacritty/src/display/mod.rs b/alacritty/src/display/mod.rs
index dc37794d..4dafa80f 100644
--- a/alacritty/src/display/mod.rs
+++ b/alacritty/src/display/mod.rs
@@ -20,7 +20,7 @@ use winit::dpi::PhysicalSize;
use winit::keyboard::ModifiersState;
use winit::window::CursorIcon;
-use crossfont::{self, Rasterize, Rasterizer, Size as FontSize};
+use crossfont::{Rasterize, Rasterizer, Size as FontSize};
use unicode_width::UnicodeWidthChar;
use alacritty_terminal::event::{EventListener, OnResize, WindowSize};
diff --git a/alacritty/src/logging.rs b/alacritty/src/logging.rs
index 42f1536e..a3833a5b 100644
--- a/alacritty/src/logging.rs
+++ b/alacritty/src/logging.rs
@@ -12,7 +12,7 @@ use std::sync::{Arc, Mutex, OnceLock};
use std::time::Instant;
use std::{env, process};
-use log::{self, Level, LevelFilter};
+use log::{Level, LevelFilter};
use winit::event_loop::EventLoopProxy;
use crate::cli::Options;
diff --git a/alacritty_terminal/src/event_loop.rs b/alacritty_terminal/src/event_loop.rs
index 929c642d..62dd7440 100644
--- a/alacritty_terminal/src/event_loop.rs
+++ b/alacritty_terminal/src/event_loop.rs
@@ -5,7 +5,6 @@ use std::collections::VecDeque;
use std::fmt::{self, Display, Formatter};
use std::fs::File;
use std::io::{self, ErrorKind, Read, Write};
-use std::marker::Send;
use std::num::NonZeroUsize;
use std::sync::mpsc::{self, Receiver, Sender, TryRecvError};
use std::sync::Arc;
diff --git a/alacritty_terminal/src/grid/storage.rs b/alacritty_terminal/src/grid/storage.rs
index d5709d14..0a2be43b 100644
--- a/alacritty_terminal/src/grid/storage.rs
+++ b/alacritty_terminal/src/grid/storage.rs
@@ -1,4 +1,4 @@
-use std::cmp::{max, PartialEq};
+use std::cmp::max;
use std::mem;
use std::mem::MaybeUninit;
use std::ops::{Index, IndexMut};
diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs
index 2ed6d7c9..f17f7462 100644
--- a/alacritty_terminal/src/term/mod.rs
+++ b/alacritty_terminal/src/term/mod.rs
@@ -2389,10 +2389,8 @@ pub mod test {
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
- use unicode_width::UnicodeWidthChar;
use crate::event::VoidListener;
- use crate::index::Column;
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct TermSize {
diff --git a/alacritty_terminal/src/tty/unix.rs b/alacritty_terminal/src/tty/unix.rs
index 8ce04191..455abbd2 100644
--- a/alacritty_terminal/src/tty/unix.rs
+++ b/alacritty_terminal/src/tty/unix.rs
@@ -11,7 +11,7 @@ use std::process::{Child, Command, Stdio};
use std::sync::Arc;
use std::{env, ptr};
-use libc::{self, c_int, TIOCSCTTY};
+use libc::{c_int, TIOCSCTTY};
use log::error;
use polling::{Event, PollMode, Poller};
use rustix_openpty::openpty;