aboutsummaryrefslogtreecommitdiff
path: root/alacritty_terminal/src/grid
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty_terminal/src/grid')
-rw-r--r--alacritty_terminal/src/grid/mod.rs40
-rw-r--r--alacritty_terminal/src/grid/tests.rs15
2 files changed, 43 insertions, 12 deletions
diff --git a/alacritty_terminal/src/grid/mod.rs b/alacritty_terminal/src/grid/mod.rs
index 1925a6f4..e2cda175 100644
--- a/alacritty_terminal/src/grid/mod.rs
+++ b/alacritty_terminal/src/grid/mod.rs
@@ -120,7 +120,7 @@ pub enum Scroll {
}
#[derive(Copy, Clone)]
-pub enum ViewportPosition {
+enum ViewportPosition {
Visible(Line),
Above,
Below,
@@ -141,11 +141,25 @@ impl<T: GridCell + Copy + Clone> Grid<T> {
}
}
- pub fn visible_to_buffer(&self, point: Point) -> Point<usize> {
- Point { line: self.visible_line_to_buffer(point.line), col: point.col }
+ pub fn buffer_to_visible(&self, point: impl Into<Point<usize>>) -> Point<usize> {
+ let mut point = point.into();
+
+ match self.buffer_line_to_visible(point.line) {
+ ViewportPosition::Visible(line) => point.line = line.0,
+ ViewportPosition::Above => {
+ point.col = Column(0);
+ point.line = 0;
+ },
+ ViewportPosition::Below => {
+ point.col = self.num_cols();
+ point.line = self.num_lines().0 - 1;
+ },
+ }
+
+ point
}
- pub fn buffer_line_to_visible(&self, line: usize) -> ViewportPosition {
+ fn buffer_line_to_visible(&self, line: usize) -> ViewportPosition {
let offset = line.saturating_sub(self.display_offset);
if line < self.display_offset {
ViewportPosition::Below
@@ -156,7 +170,11 @@ impl<T: GridCell + Copy + Clone> Grid<T> {
}
}
- pub fn visible_line_to_buffer(&self, line: Line) -> usize {
+ pub fn visible_to_buffer(&self, point: Point) -> Point<usize> {
+ Point { line: self.visible_line_to_buffer(point.line), col: point.col }
+ }
+
+ fn visible_line_to_buffer(&self, line: Line) -> usize {
self.line_to_offset(line) + self.display_offset
}
@@ -596,7 +614,17 @@ pub struct GridIterator<'a, T> {
grid: &'a Grid<T>,
/// Current position of the iterator within the grid.
- pub cur: Point<usize>,
+ cur: Point<usize>,
+}
+
+impl<'a, T> GridIterator<'a, T> {
+ pub fn point(&self) -> Point<usize> {
+ self.cur
+ }
+
+ pub fn cell(&self) -> &'a T {
+ &self.grid[self.cur.line][self.cur.col]
+ }
}
impl<'a, T> Iterator for GridIterator<'a, T> {
diff --git a/alacritty_terminal/src/grid/tests.rs b/alacritty_terminal/src/grid/tests.rs
index a352e747..d28e7833 100644
--- a/alacritty_terminal/src/grid/tests.rs
+++ b/alacritty_terminal/src/grid/tests.rs
@@ -109,8 +109,8 @@ fn test_iter() {
assert_eq!(None, iter.prev());
assert_eq!(Some(&1), iter.next());
- assert_eq!(Column(1), iter.cur.col);
- assert_eq!(4, iter.cur.line);
+ assert_eq!(Column(1), iter.point().col);
+ assert_eq!(4, iter.point().line);
assert_eq!(Some(&2), iter.next());
assert_eq!(Some(&3), iter.next());
@@ -118,12 +118,15 @@ fn test_iter() {
// test linewrapping
assert_eq!(Some(&5), iter.next());
- assert_eq!(Column(0), iter.cur.col);
- assert_eq!(3, iter.cur.line);
+ assert_eq!(Column(0), iter.point().col);
+ assert_eq!(3, iter.point().line);
assert_eq!(Some(&4), iter.prev());
- assert_eq!(Column(4), iter.cur.col);
- assert_eq!(4, iter.cur.line);
+ assert_eq!(Column(4), iter.point().col);
+ assert_eq!(4, iter.point().line);
+
+ // Make sure iter.cell() returns the current iterator position
+ assert_eq!(&4, iter.cell());
// test that iter ends at end of grid
let mut final_iter = grid.iter_from(Point { line: 0, col: Column(4) });