From 63ef6c931901e895442edf5ec113d0ff609a7c24 Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Fri, 27 May 2022 00:30:33 +0300 Subject: Fix Vi cursor not being damaged on scroll There's no need to damage intermediate Vi mode cursor points, since it can't change the terminal content meaning that only the previous and current vi cursor's viewport points matter to damage it properly. --- alacritty/src/display/content.rs | 8 ++++---- alacritty/src/display/mod.rs | 21 +++------------------ alacritty/src/event.rs | 9 ++++----- 3 files changed, 11 insertions(+), 27 deletions(-) (limited to 'alacritty/src') diff --git a/alacritty/src/display/content.rs b/alacritty/src/display/content.rs index bb3c61a8..77571d94 100644 --- a/alacritty/src/display/content.rs +++ b/alacritty/src/display/content.rs @@ -11,12 +11,12 @@ use alacritty_terminal::selection::SelectionRange; use alacritty_terminal::term::cell::{Cell, Flags}; use alacritty_terminal::term::color::{CellRgb, Rgb}; use alacritty_terminal::term::search::{Match, RegexIter, RegexSearch}; -use alacritty_terminal::term::{RenderableContent as TerminalContent, Term, TermMode}; +use alacritty_terminal::term::{self, RenderableContent as TerminalContent, Term, TermMode}; use crate::config::UiConfig; use crate::display::color::{List, DIM_FACTOR}; use crate::display::hint::HintState; -use crate::display::{self, Display, MAX_SEARCH_LINES}; +use crate::display::{Display, MAX_SEARCH_LINES}; use crate::event::SearchState; /// Minimum contrast between a fixed cursor color and the cell's background. @@ -63,7 +63,7 @@ impl<'a> RenderableContent<'a> { // Convert terminal cursor point to viewport position. let cursor_point = terminal_content.cursor.point; let display_offset = terminal_content.display_offset; - let cursor_point = display::point_to_viewport(display_offset, cursor_point).unwrap(); + let cursor_point = term::point_to_viewport(display_offset, cursor_point).unwrap(); let hint = if display.hint_state.active() { display.hint_state.update_matches(term); @@ -250,7 +250,7 @@ impl RenderableCell { // Convert cell point to viewport position. let cell_point = cell.point; - let point = display::point_to_viewport(display_offset, cell_point).unwrap(); + let point = term::point_to_viewport(display_offset, cell_point).unwrap(); let flags = cell.flags; let underline = cell diff --git a/alacritty/src/display/mod.rs b/alacritty/src/display/mod.rs index 10ee65c0..a1788175 100644 --- a/alacritty/src/display/mod.rs +++ b/alacritty/src/display/mod.rs @@ -1,7 +1,6 @@ //! The display subsystem including window management, font rasterization, and //! GPU drawing. -use std::convert::TryFrom; use std::fmt::{self, Formatter}; #[cfg(all(feature = "wayland", not(any(target_os = "macos", windows))))] use std::sync::atomic::Ordering; @@ -31,7 +30,7 @@ use alacritty_terminal::index::{Column, Direction, Line, Point}; use alacritty_terminal::selection::{Selection, SelectionRange}; use alacritty_terminal::term::cell::Flags; use alacritty_terminal::term::color::Rgb; -use alacritty_terminal::term::{Term, TermDamage, TermMode, MIN_COLUMNS, MIN_SCREEN_LINES}; +use alacritty_terminal::term::{self, Term, TermDamage, TermMode, MIN_COLUMNS, MIN_SCREEN_LINES}; use crate::config::font::Font; #[cfg(not(windows))] @@ -747,7 +746,7 @@ impl Display { glyph_cache, grid_cells.into_iter().map(|mut cell| { // Underline hints hovered by mouse or vi mode cursor. - let point = viewport_to_point(display_offset, cell.point); + let point = term::viewport_to_point(display_offset, cell.point); if highlighted_hint.as_ref().map_or(false, |h| h.bounds.contains(&point)) || vi_highlighted_hint.as_ref().map_or(false, |h| h.bounds.contains(&point)) { @@ -1064,7 +1063,7 @@ impl Display { let display_offset = terminal.grid().display_offset(); for hint in self.highlighted_hint.iter().chain(&self.vi_highlighted_hint) { for point in (hint.bounds.start().line.0..=hint.bounds.end().line.0).flat_map(|line| { - point_to_viewport(display_offset, Point::new(Line(line), Column(0))) + term::point_to_viewport(display_offset, Point::new(Line(line), Column(0))) }) { terminal.damage_line(point.line, 0, terminal.columns() - 1); } @@ -1121,20 +1120,6 @@ impl Drop for Display { } } -/// Convert a terminal point to a viewport relative point. -#[inline] -pub fn point_to_viewport(display_offset: usize, point: Point) -> Option> { - let viewport_line = point.line.0 + display_offset as i32; - usize::try_from(viewport_line).ok().map(|line| Point::new(line, point.column)) -} - -/// Convert a viewport relative point to a terminal point. -#[inline] -pub fn viewport_to_point(display_offset: usize, point: Point) -> Point { - let line = Line(point.line as i32) - display_offset; - Point::new(line, point.column) -} - /// Calculate the cell dimensions based on font metrics. /// /// This will return a tuple of the cell width and height. diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs index 873e2a34..d16114af 100644 --- a/alacritty/src/event.rs +++ b/alacritty/src/event.rs @@ -32,7 +32,7 @@ use alacritty_terminal::grid::{Dimensions, Scroll}; use alacritty_terminal::index::{Boundary, Column, Direction, Line, Point, Side}; use alacritty_terminal::selection::{Selection, SelectionType}; use alacritty_terminal::term::search::{Match, RegexSearch}; -use alacritty_terminal::term::{ClipboardType, Term, TermMode}; +use alacritty_terminal::term::{self, ClipboardType, Term, TermMode}; use crate::cli::{Options as CliOptions, WindowOptions}; use crate::clipboard::Clipboard; @@ -43,7 +43,7 @@ use crate::daemon::foreground_process_path; use crate::daemon::spawn_daemon; use crate::display::hint::HintMatch; use crate::display::window::Window; -use crate::display::{self, Display, SizeInfo}; +use crate::display::{Display, SizeInfo}; use crate::input::{self, ActionContext as _, FONT_SIZE_STEP}; use crate::message_bar::{Message, MessageBuffer}; use crate::scheduler::{Scheduler, TimerId, Topic}; @@ -778,8 +778,7 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext for ActionCon if self.search_state.dfas.take().is_some() { self.terminal.mark_fully_damaged(); } else { - // Damage line indicator and Vi cursor. - self.terminal.damage_vi_cursor(); + // Damage line indicator. self.terminal.damage_line(0, 0, self.terminal.columns() - 1); } } else { @@ -1021,7 +1020,7 @@ impl Mouse { let line = self.y.saturating_sub(size.padding_y() as usize) / (size.cell_height() as usize); let line = min(line, size.bottommost_line().0 as usize); - display::viewport_to_point(display_offset, Point::new(line, col)) + term::viewport_to_point(display_offset, Point::new(line, col)) } } -- cgit