WIP hyperlinks

This commit is contained in:
Mikayla Maki 2022-09-16 19:35:18 -07:00
parent 4dbded3f02
commit ac390745a7
2 changed files with 76 additions and 49 deletions

View file

@ -201,7 +201,7 @@ pub fn mouse_side(pos: Vector2F, cur_size: TerminalSize) -> alacritty_terminal::
}
}
pub fn mouse_point(pos: Vector2F, cur_size: TerminalSize, display_offset: usize) -> Point {
pub fn grid_point(pos: Vector2F, cur_size: TerminalSize, display_offset: usize) -> Point {
let col = pos.x() / cur_size.cell_width;
let col = min(GridCol(col as usize), cur_size.last_column());
let line = pos.y() / cur_size.line_height;
@ -294,7 +294,7 @@ fn sgr_mouse_report(point: Point, button: u8, pressed: bool) -> String {
#[cfg(test)]
mod test {
use crate::mappings::mouse::mouse_point;
use crate::mappings::mouse::grid_point;
#[test]
fn test_mouse_to_selection() {
@ -316,7 +316,7 @@ mod test {
let mouse_pos = gpui::geometry::vector::vec2f(mouse_pos_x, mouse_pos_y);
let origin = gpui::geometry::vector::vec2f(origin_x, origin_y); //Position of terminal window, 1 'cell' in
let mouse_pos = mouse_pos - origin;
let point = mouse_point(mouse_pos, cur_size, 0);
let point = grid_point(mouse_pos, cur_size, 0);
assert_eq!(
point,
alacritty_terminal::index::Point::new(

View file

@ -30,7 +30,7 @@ use futures::{
};
use mappings::mouse::{
alt_scroll, mouse_button_report, mouse_moved_report, mouse_point, mouse_side, scroll_report,
alt_scroll, grid_point, mouse_button_report, mouse_moved_report, mouse_side, scroll_report,
};
use modal::deploy_modal;
@ -616,7 +616,7 @@ impl Terminal {
}
InternalEvent::UpdateSelection(position) => {
if let Some(mut selection) = term.selection.take() {
let point = mouse_point(
let point = grid_point(
*position,
self.last_content.size,
term.grid().display_offset(),
@ -809,18 +809,27 @@ impl Terminal {
}
pub fn mouse_move(&mut self, e: &MouseMovedEvent, origin: Vector2F) {
let position = e.position.sub(origin);
if self.mouse_mode(e.shift) {
let position = e.position.sub(origin);
let point = mouse_point(
position,
self.last_content.size,
self.last_content.display_offset,
);
let side = mouse_side(position, self.last_content.size);
let point = grid_point(
position,
self.last_content.size,
self.last_content.display_offset,
);
let side = mouse_side(position, self.last_content.size);
if self.mouse_changed(point, side) && self.mouse_mode(e.shift) {
if let Some(bytes) = mouse_moved_report(point, e, self.last_content.mode) {
self.pty_tx.notify(bytes);
if self.mouse_changed(point, side) {
if let Some(bytes) = mouse_moved_report(point, e, self.last_content.mode) {
self.pty_tx.notify(bytes);
}
}
} else {
if let Some(link) = cell_for_mouse(e.position, &self.last_content)
.cell
.hyperlink()
{
link.uri()
}
}
}
@ -867,7 +876,7 @@ impl Terminal {
pub fn mouse_down(&mut self, e: &DownRegionEvent, origin: Vector2F) {
let position = e.position.sub(origin);
let point = mouse_point(
let point = grid_point(
position,
self.last_content.size,
self.last_content.display_offset,
@ -890,7 +899,7 @@ impl Terminal {
let position = e.position.sub(origin);
if !self.mouse_mode(e.shift) {
let point = mouse_point(
let point = grid_point(
position,
self.last_content.size,
self.last_content.display_offset,
@ -918,7 +927,7 @@ impl Terminal {
pub fn mouse_up(&mut self, e: &UpRegionEvent, origin: Vector2F) {
let position = e.position.sub(origin);
if self.mouse_mode(e.shift) {
let point = mouse_point(
let point = grid_point(
position,
self.last_content.size,
self.last_content.display_offset,
@ -941,7 +950,7 @@ impl Terminal {
if let Some(scroll_lines) = self.determine_scroll_lines(e, mouse_mode) {
if mouse_mode {
let point = mouse_point(
let point = grid_point(
e.position.sub(origin),
self.last_content.size,
self.last_content.display_offset,
@ -1046,24 +1055,6 @@ fn make_selection(range: &RangeInclusive<Point>) -> Selection {
selection
}
/// Copied from alacritty/src/display/hint.rs HintMatches::visible_regex_matches()
/// Iterate over all visible regex matches.
// fn visible_search_matches<'a, T>(
// term: &'a Term<T>,
// regex: &'a RegexSearch,
// ) -> impl Iterator<Item = Match> + 'a {
// let viewport_start = Line(-(term.grid().display_offset() as i32));
// let viewport_end = viewport_start + term.bottommost_line();
// let mut start = term.line_search_left(Point::new(viewport_start, Column(0)));
// let mut end = term.line_search_right(Point::new(viewport_end, Column(0)));
// start.line = start.line.max(viewport_start - MAX_SEARCH_LINES);
// end.line = end.line.min(viewport_end + MAX_SEARCH_LINES);
// RegexIter::new(start, end, AlacDirection::Right, term, regex)
// .skip_while(move |rm| rm.end().line < viewport_start)
// .take_while(move |rm| rm.start().line <= viewport_end)
// }
fn all_search_matches<'a, T>(
term: &'a Term<T>,
regex: &'a RegexSearch,
@ -1074,20 +1065,56 @@ fn all_search_matches<'a, T>(
}
fn cell_for_mouse<'a>(pos: Vector2F, content: &'a TerminalContent) -> &'a IndexedCell {
fn pos_to_viewport(pos: Vector2F, size: TerminalSize) -> Point {
Point {
line: Line((pos.x() / size.cell_width()) as i32),
column: Column((pos.y() / size.line_height()) as usize),
let point = Point {
line: Line((pos.x() / content.size.cell_width()) as i32),
column: Column((pos.y() / content.size.line_height()) as usize),
};
debug_assert!(point.line.0.is_positive() || point.line.0 == 0);
&content.cells[(point.line.0 as usize * content.size.columns() + point.column.0)]
}
fn open_uri(uri: String) {
// MacOS command is 'open'
pub fn spawn_daemon<I, S>(
program: &str,
args: I,
master_fd: RawFd,
shell_pid: u32,
) -> io::Result<()>
where
I: IntoIterator<Item = S> + Copy,
S: AsRef<OsStr>,
{
let mut command = Command::new(program);
command
.args(args)
.stdin(Stdio::null())
.stdout(Stdio::null())
.stderr(Stdio::null());
if let Ok(cwd) = foreground_process_path(master_fd, shell_pid) {
command.current_dir(cwd);
}
unsafe {
command
.pre_exec(|| {
match libc::fork() {
-1 => return Err(io::Error::last_os_error()),
0 => (),
_ => libc::_exit(0),
}
if libc::setsid() == -1 {
return Err(io::Error::last_os_error());
}
Ok(())
})
.spawn()?
.wait()
.map(|_| ())
}
}
fn cell_for_pos<'a>(point: Point, content: &'a TerminalContent) -> &'a IndexedCell {
dbg!(point.line.0, content.size.columns(), point.column.0);
debug_assert!(point.line.0.is_positive() || point.line.0 == 0);
&content.cells[(point.line.0 as usize * content.size.columns() + point.column.0)]
}
cell_for_pos(pos_to_viewport(pos, content.size), &content)
}
#[cfg(test)]