aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src/display/cursor.rs
diff options
context:
space:
mode:
authorJosh Rahm <rahm@google.com>2021-10-08 23:00:53 -0600
committerJosh Rahm <rahm@google.com>2021-10-08 23:00:53 -0600
commit52f6fd90867881300aa64034dc2c698c3fda1f34 (patch)
tree9cbcc697284a46b2e25e4bc1a8c12d882ce04945 /alacritty/src/display/cursor.rs
parent750d1e196875a7063da5aa38673d0792911e8ad3 (diff)
downloadr-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.rs68
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]
}