@@ -1,6 +1,6 @@
use alacritty_terminal::{
ansi::{Color::Named, NamedColor},
- grid::{Dimensions, GridIterator, Indexed, Scroll},
+ grid::{Dimensions, Scroll},
index::{Column as GridCol, Line as GridLine, Point, Side},
selection::SelectionRange,
term::cell::{Cell, Flags},
@@ -25,7 +25,10 @@ use settings::Settings;
use theme::TerminalStyle;
use util::ResultExt;
-use std::{cmp::min, ops::Range};
+use std::{
+ cmp::min,
+ ops::{Deref, Range},
+};
use std::{fmt::Debug, ops::Sub};
use crate::{
@@ -49,6 +52,20 @@ pub struct LayoutState {
display_offset: usize,
}
+struct IndexedCell {
+ point: Point,
+ cell: Cell,
+}
+
+impl Deref for IndexedCell {
+ type Target = Cell;
+
+ #[inline]
+ fn deref(&self) -> &Cell {
+ &self.cell
+ }
+}
+
///Helper struct for converting data between alacritty's cursor points, and displayed cursor points
struct DisplayCursor {
line: i32,
@@ -190,7 +207,7 @@ impl TerminalEl {
}
fn layout_grid(
- grid: GridIterator<Cell>,
+ grid: Vec<IndexedCell>,
text_style: &TextStyle,
terminal_theme: &TerminalStyle,
text_layout_cache: &TextLayoutCache,
@@ -209,7 +226,7 @@ impl TerminalEl {
let mut cur_alac_color = None;
let mut highlighted_range = None;
- let linegroups = grid.group_by(|i| i.point.line);
+ let linegroups = grid.into_iter().group_by(|i| i.point.line);
for (line_index, (_, line)) in linegroups.into_iter().enumerate() {
for (x_index, cell) in line.enumerate() {
//Increase selection range
@@ -236,7 +253,7 @@ impl TerminalEl {
} else {
match cur_alac_color {
Some(cur_color) => {
- if cell.bg == cur_color {
+ if cell.cell.bg == cur_color {
cur_rect = cur_rect.take().map(|rect| rect.extend());
} else {
cur_alac_color = Some(cell.bg);
@@ -326,7 +343,7 @@ impl TerminalEl {
///Convert the Alacritty cell styles to GPUI text styles and background color
fn cell_style(
- indexed: &Indexed<&Cell>,
+ indexed: &IndexedCell,
style: &TerminalStyle,
text_style: &TextStyle,
modal: bool,
@@ -532,60 +549,71 @@ impl Element for TerminalEl {
terminal_theme.colors.background.clone()
};
- let (cursor, cells, rects, highlights, display_offset) = self
+ let (cells, selection, cursor, display_offset, cursor_text) = self
.terminal
.upgrade(cx)
.unwrap()
.update(cx.app, |terminal, mcx| {
terminal.set_size(dimensions);
terminal.render_lock(mcx, |content, cursor_text| {
- let (cells, rects, highlights) = TerminalEl::layout_grid(
- content.display_iter,
- &text_style,
- &terminal_theme,
- cx.text_layout_cache,
- self.modal,
- content.selection,
- );
-
- //Layout cursor
- let cursor = {
- let cursor_point =
- DisplayCursor::from(content.cursor.point, content.display_offset);
- let cursor_text = {
- let str_trxt = cursor_text.to_string();
- cx.text_layout_cache.layout_str(
- &str_trxt,
- text_style.font_size,
- &[(
- str_trxt.len(),
- RunStyle {
- font_id: text_style.font_id,
- color: terminal_theme.colors.background,
- underline: Default::default(),
- },
- )],
- )
- };
-
- TerminalEl::shape_cursor(cursor_point, dimensions, &cursor_text).map(
- move |(cursor_position, block_width)| {
- Cursor::new(
- cursor_position,
- block_width,
- dimensions.line_height,
- terminal_theme.colors.cursor,
- CursorShape::Block,
- Some(cursor_text.clone()),
- )
- },
- )
- };
-
- (cursor, cells, rects, highlights, content.display_offset)
+ let mut cells = vec![];
+ cells.extend(content.display_iter.map(|ic| IndexedCell {
+ point: ic.point.clone(),
+ cell: ic.cell.clone(),
+ }));
+
+ (
+ cells,
+ content.selection.clone(),
+ content.cursor.clone(),
+ content.display_offset.clone(),
+ cursor_text.clone(),
+ )
})
});
+ let (cells, rects, highlights) = TerminalEl::layout_grid(
+ cells,
+ &text_style,
+ &terminal_theme,
+ cx.text_layout_cache,
+ self.modal,
+ selection,
+ );
+
+ //Layout cursor
+ let cursor = {
+ let cursor_point = DisplayCursor::from(cursor.point, display_offset);
+ let cursor_text = {
+ let str_trxt = cursor_text.to_string();
+ cx.text_layout_cache.layout_str(
+ &str_trxt,
+ text_style.font_size,
+ &[(
+ str_trxt.len(),
+ RunStyle {
+ font_id: text_style.font_id,
+ color: terminal_theme.colors.background,
+ underline: Default::default(),
+ },
+ )],
+ )
+ };
+
+ TerminalEl::shape_cursor(cursor_point, dimensions, &cursor_text).map(
+ move |(cursor_position, block_width)| {
+ Cursor::new(
+ cursor_position,
+ block_width,
+ dimensions.line_height,
+ terminal_theme.colors.cursor,
+ CursorShape::Block,
+ Some(cursor_text.clone()),
+ )
+ },
+ )
+ };
+
//Done!
(
constraint.max,