diff options
author | Josh Rahm <rahm@google.com> | 2021-10-08 23:00:53 -0600 |
---|---|---|
committer | Josh Rahm <rahm@google.com> | 2021-10-08 23:00:53 -0600 |
commit | 52f6fd90867881300aa64034dc2c698c3fda1f34 (patch) | |
tree | 9cbcc697284a46b2e25e4bc1a8c12d882ce04945 /alacritty/src/display/cursor.rs | |
parent | 750d1e196875a7063da5aa38673d0792911e8ad3 (diff) | |
download | r-alacritty-52f6fd90867881300aa64034dc2c698c3fda1f34.tar.gz r-alacritty-52f6fd90867881300aa64034dc2c698c3fda1f34.tar.bz2 r-alacritty-52f6fd90867881300aa64034dc2c698c3fda1f34.zip |
Add configurable crosshairs to Alacritty.
This allows the user to put semitransparent rectangles around the
current cursor line and column, รก la Vim's cursor line/column, but
for the whole terminal.
Diffstat (limited to 'alacritty/src/display/cursor.rs')
-rw-r--r-- | alacritty/src/display/cursor.rs | 68 |
1 files changed, 34 insertions, 34 deletions
diff --git a/alacritty/src/display/cursor.rs b/alacritty/src/display/cursor.rs index f3a782cc..6415f152 100644 --- a/alacritty/src/display/cursor.rs +++ b/alacritty/src/display/cursor.rs @@ -6,15 +6,16 @@ use alacritty_terminal::term::SizeInfo; use crate::display::content::RenderableCursor; use crate::renderer::rects::RenderRect; +use std::vec::Vec; /// Trait for conversion into the iterator. pub trait IntoRects { /// Consume the cursor for an iterator of rects. - fn rects(self, size_info: &SizeInfo, thickness: f32) -> CursorRects; + fn rects(self, size_info: &SizeInfo, thickness: f32) -> Vec<RenderRect>; } impl IntoRects for RenderableCursor { - fn rects(self, size_info: &SizeInfo, thickness: f32) -> CursorRects { + fn rects(self, size_info: &SizeInfo, thickness: f32) -> Vec<RenderRect> { let point = self.point(); let x = point.column.0 as f32 * size_info.cell_width() + size_info.padding_x(); let y = point.line as f32 * size_info.cell_height() + size_info.padding_y(); @@ -28,51 +29,53 @@ impl IntoRects for RenderableCursor { width *= 2.; } - match self.shape() { + let mut crosshairs = if self.cursor_crosshairs().enable { + crosshair(x, y, size_info, self.cursor_crosshairs().color, self.cursor_crosshairs().opacity.as_f32()) + } else { + vec![] + }; + + let mut shape = match self.shape() { CursorShape::Beam => beam(x, y, height, thickness, self.color()), CursorShape::Underline => underline(x, y, width, height, thickness, self.color()), CursorShape::HollowBlock => hollow(x, y, width, height, thickness, self.color()), - _ => CursorRects::default(), - } - } -} + CursorShape::Hidden => vec![], + _ => vec![], + }; -/// Cursor rect iterator. -#[derive(Default)] -pub struct CursorRects { - rects: [Option<RenderRect>; 4], - index: usize, -} - -impl From<RenderRect> for CursorRects { - fn from(rect: RenderRect) -> Self { - Self { rects: [Some(rect), None, None, None], index: 0 } + shape.append(&mut crosshairs); + shape } } -impl Iterator for CursorRects { - type Item = RenderRect; - - fn next(&mut self) -> Option<Self::Item> { - let rect = self.rects.get_mut(self.index)?; - self.index += 1; - rect.take() - } +fn crosshair(x: f32, y: f32, size_info: &SizeInfo, color: Rgb, opacity: f32) -> Vec<RenderRect> { + let width = size_info.cell_width(); + let height = size_info.cell_height(); + let yskip = 0.; + let xskip = 0.; + + vec![ + RenderRect::new(x, 0., width, y + size_info.cell_height(), color, opacity), + RenderRect::new( + x, y + size_info.cell_height() * (yskip + 1.), width, size_info.height(), color, opacity), + RenderRect::new(0., y, x - (size_info.cell_width() * xskip), height, color, opacity), + RenderRect::new(x + size_info.cell_width() * (xskip + 1.), y, size_info.width(), height, color, opacity) + ] } /// Create an iterator yielding a single beam rect. -fn beam(x: f32, y: f32, height: f32, thickness: f32, color: Rgb) -> CursorRects { - RenderRect::new(x, y, thickness, height, color, 1.).into() +fn beam(x: f32, y: f32, height: f32, thickness: f32, color: Rgb) -> Vec<RenderRect> { + vec![RenderRect::new(x, y, thickness, height, color, 1.)] } /// Create an iterator yielding a single underline rect. -fn underline(x: f32, y: f32, width: f32, height: f32, thickness: f32, color: Rgb) -> CursorRects { +fn underline(x: f32, y: f32, width: f32, height: f32, thickness: f32, color: Rgb) -> Vec<RenderRect> { let y = y + height - thickness; - RenderRect::new(x, y, width, thickness, color, 1.).into() + vec![RenderRect::new(x, y, width, thickness, color, 1.)] } /// Create an iterator yielding a rect for each side of the hollow block cursor. -fn hollow(x: f32, y: f32, width: f32, height: f32, thickness: f32, color: Rgb) -> CursorRects { +fn hollow(x: f32, y: f32, width: f32, height: f32, thickness: f32, color: Rgb) -> Vec<RenderRect> { let top_line = RenderRect::new(x, y, width, thickness, color, 1.); let vertical_y = y + thickness; @@ -85,8 +88,5 @@ fn hollow(x: f32, y: f32, width: f32, height: f32, thickness: f32, color: Rgb) - let right_x = x + width - thickness; let right_line = RenderRect::new(right_x, vertical_y, thickness, vertical_height, color, 1.); - CursorRects { - rects: [Some(top_line), Some(bottom_line), Some(left_line), Some(right_line)], - index: 0, - } + vec![top_line, bottom_line, left_line, right_line] } |