terminal/embedded: use Screen::resize instead of CellBuffer::resize

CellBuffer::resize does not update generation info and should only be
used from within Screen::resize

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
pull/384/head
Manos Pitsidianakis 2 weeks ago
parent 684fae3ed8
commit 5d915baa81
No known key found for this signature in database
GPG Key ID: 7729C7707F7E09D0

@ -256,6 +256,21 @@ impl EmbeddedGrid {
}
}
/*
pub fn to_string_debug(&self) -> String {
let mut out = String::with_capacity(4096);
out.push_str(&format!("screen_buffer: {:?}\n", self.screen_buffer));
let grid = self.buffer();
for y in 0..self.terminal_size().1 {
for x in 0..self.terminal_size().0 {
out.push(grid[(x, y)].ch());
}
out.push('\n');
}
out
}
*/
#[inline]
pub fn set_dirty(&mut self, value: bool) {
self.dirty = value;
@ -313,7 +328,6 @@ impl EmbeddedGrid {
}
pub fn process_byte(&mut self, stdin: &mut std::fs::File, byte: u8) {
let area = self.area();
let Self {
ref mut cursor,
ref mut scroll_region,
@ -337,12 +351,12 @@ impl EmbeddedGrid {
initialized: _,
ref mut dirty,
} = self;
let mut grid = normal_screen.grid_mut();
let mut screen = normal_screen;
let is_alternate = match *screen_buffer {
ScreenBuffer::Normal => false,
_ => {
grid = alternate_screen.grid_mut();
screen = alternate_screen;
true
}
};
@ -353,7 +367,10 @@ impl EmbeddedGrid {
if !is_alternate {
cursor.0 = 0;
if cursor.1 >= terminal_size.1 {
if !grid.resize(std::cmp::max(1, grid.cols()), grid.rows() + 2, None) {
if !screen.resize(
std::cmp::max(1, screen.grid().cols()),
screen.grid().rows() + 2,
) {
return;
}
scroll_region.bottom += 1;
@ -401,6 +418,11 @@ impl EmbeddedGrid {
(cursor_x!(), cursor_y!())
};
}
macro_rules! area {
() => {{
screen.area()
}};
}
let mut state = &mut self.state;
match (byte, &mut state) {
@ -421,7 +443,9 @@ impl EmbeddedGrid {
// ESCD Linefeed
//log::trace!("{}", EscCode::from((&(*state), byte)));
if cursor.1 == scroll_region.bottom {
grid.scroll_up(scroll_region, scroll_region.top, 1);
screen
.grid_mut()
.scroll_up(scroll_region, scroll_region.top, 1);
*dirty = true;
} else {
cursor.1 += 1;
@ -435,7 +459,7 @@ impl EmbeddedGrid {
//log::trace!("erasing from {:?} to {:?}", cursor, terminal_size);
for y in cursor.1..terminal_size.1 {
for x in cursor.0..terminal_size.0 {
grid[(x, y)] = Cell::default();
screen.grid_mut()[(x, y)] = Cell::default();
}
}
*dirty = true;
@ -445,7 +469,7 @@ impl EmbeddedGrid {
// ESCK Erase from the cursor to the end of the line
//log::trace!("sending {}", EscCode::from((&(*state), byte)));
for x in cursor.0..terminal_size.0 {
grid[(x, cursor.1)] = Cell::default();
screen.grid_mut()[(x, cursor.1)] = Cell::default();
}
*dirty = true;
*state = State::Normal;
@ -486,7 +510,7 @@ impl EmbeddedGrid {
if cursor.1 + 1 < terminal_size.1 || !is_alternate {
if cursor.1 == scroll_region.bottom && is_alternate {
grid.scroll_up(scroll_region, cursor.1, 1);
screen.grid_mut().scroll_up(scroll_region, cursor.1, 1);
*dirty = true;
} else {
increase_cursor_y!();
@ -568,12 +592,14 @@ impl EmbeddedGrid {
}
}
};
//log::trace!("c = {:?}\tcursor={:?}", c, cursor);
*codepoints = CodepointBuf::None;
if *auto_wrap_mode && *wrap_next {
*wrap_next = false;
if cursor.1 == scroll_region.bottom {
grid.scroll_up(scroll_region, scroll_region.top, 1);
screen
.grid_mut()
.scroll_up(scroll_region, scroll_region.top, 1);
} else {
cursor.1 += 1;
}
@ -583,14 +609,15 @@ impl EmbeddedGrid {
//if c == '↪' {
//log::trace!("↪ cursor is {:?}", cursor_val!());
//}
grid[cursor_val!()].set_ch(c);
grid[cursor_val!()].set_fg(*fg_color);
grid[cursor_val!()].set_bg(*bg_color);
grid[cursor_val!()].set_attrs(*attrs);
screen.grid_mut()[cursor_val!()]
.set_ch(c)
.set_fg(*fg_color)
.set_bg(*bg_color)
.set_attrs(*attrs);
match wcwidth(u32::from(c)) {
Some(0) | None => {
/* Skip drawing zero width characters */
grid[cursor_val!()].set_empty(true);
screen.grid_mut()[cursor_val!()].set_empty(true);
}
Some(1) => {}
Some(n) => {
@ -598,10 +625,11 @@ impl EmbeddedGrid {
* drawn over. Set it as empty to skip drawing it. */
for _ in 1..n {
increase_cursor_x!();
grid[cursor_val!()].set_empty(true);
grid[cursor_val!()].set_fg(*fg_color);
grid[cursor_val!()].set_bg(*bg_color);
grid[cursor_val!()].set_attrs(*attrs);
screen.grid_mut()[cursor_val!()]
.set_empty(true)
.set_fg(*fg_color)
.set_bg(*bg_color)
.set_attrs(*attrs);
}
}
}
@ -620,9 +648,10 @@ impl EmbeddedGrid {
*fg_color = Color::Default;
*bg_color = Color::Default;
*attrs = Attr::DEFAULT;
grid[cursor_val!()].set_fg(Color::Default);
grid[cursor_val!()].set_bg(Color::Default);
grid[cursor_val!()].set_attrs(Attr::DEFAULT);
screen.grid_mut()[cursor_val!()]
.set_fg(Color::Default)
.set_bg(Color::Default)
.set_attrs(Attr::DEFAULT);
*dirty = true;
*state = State::Normal;
}
@ -651,12 +680,13 @@ impl EmbeddedGrid {
}
b"25" => {
*show_cursor = true;
*prev_fg_color = Some(grid[cursor_val!()].fg());
*prev_bg_color = Some(grid[cursor_val!()].bg());
*prev_attrs = Some(grid[cursor_val!()].attrs());
grid[cursor_val!()].set_fg(Color::Black);
grid[cursor_val!()].set_bg(Color::White);
grid[cursor_val!()].set_attrs(Attr::DEFAULT);
*prev_fg_color = Some(screen.grid_mut()[cursor_val!()].fg());
*prev_bg_color = Some(screen.grid_mut()[cursor_val!()].bg());
*prev_attrs = Some(screen.grid_mut()[cursor_val!()].attrs());
screen.grid_mut()[cursor_val!()]
.set_fg(Color::Black)
.set_bg(Color::White)
.set_attrs(Attr::DEFAULT);
*dirty = true;
}
b"1047" | b"1049" => {
@ -684,19 +714,19 @@ impl EmbeddedGrid {
b"25" => {
*show_cursor = false;
if let Some(fg_color) = prev_fg_color.take() {
grid[cursor_val!()].set_fg(fg_color);
screen.grid_mut()[cursor_val!()].set_fg(fg_color);
} else {
grid[cursor_val!()].set_fg(*fg_color);
screen.grid_mut()[cursor_val!()].set_fg(*fg_color);
}
if let Some(bg_color) = prev_bg_color.take() {
grid[cursor_val!()].set_bg(bg_color);
screen.grid_mut()[cursor_val!()].set_bg(bg_color);
} else {
grid[cursor_val!()].set_bg(*bg_color);
screen.grid_mut()[cursor_val!()].set_bg(*bg_color);
}
if let Some(attrs) = prev_attrs.take() {
grid[cursor_val!()].set_attrs(attrs);
screen.grid_mut()[cursor_val!()].set_attrs(attrs);
} else {
grid[cursor_val!()].set_attrs(*attrs);
screen.grid_mut()[cursor_val!()].set_attrs(*attrs);
}
*dirty = true;
}
@ -723,7 +753,8 @@ impl EmbeddedGrid {
/* Erase in Display (ED), VT100. */
/* Erase Below (default). */
grid.clear_area(
let area = area!();
screen.grid_mut().clear_area(
area.skip_rows(std::cmp::min(
cursor.1 + 1 + scroll_region.top,
terminal_size.1.saturating_sub(1),
@ -739,7 +770,7 @@ impl EmbeddedGrid {
/* Erase to right (Default) */
//log::trace!("{}", EscCode::from((&(*state), byte)));
for x in cursor.0..terminal_size.0 {
grid[(x, cursor.1)] = Cell::default();
screen.grid_mut()[(x, cursor.1)] = Cell::default();
}
*dirty = true;
*state = State::Normal;
@ -754,7 +785,7 @@ impl EmbeddedGrid {
1
};
grid.scroll_down(scroll_region, cursor.1, n);
screen.grid_mut().scroll_down(scroll_region, cursor.1, n);
//log::trace!("{}", EscCode::from((&(*state), byte)));
*dirty = true;
@ -770,7 +801,7 @@ impl EmbeddedGrid {
1
};
grid.scroll_up(scroll_region, cursor.1, n);
screen.grid_mut().scroll_up(scroll_region, cursor.1, n);
//log::trace!("{}", EscCode::from((&(*state), byte)));
*dirty = true;
@ -793,7 +824,7 @@ impl EmbeddedGrid {
/* Erase to right (Default) */
//log::trace!("{}", EscCode::from((&(*state), byte)));
for x in cursor.0..terminal_size.0 {
grid[(x, cursor.1)] = Cell::default();
screen.grid_mut()[(x, cursor.1)] = Cell::default();
}
*dirty = true;
*state = State::Normal;
@ -802,7 +833,7 @@ impl EmbeddedGrid {
/* Erase in Line (ED), VT100. */
/* Erase to left (Default) */
for x in 0..=cursor.0 {
grid[(x, cursor.1)] = Cell::default();
screen.grid_mut()[(x, cursor.1)] = Cell::default();
}
//log::trace!("{}", EscCode::from((&(*state), byte)));
*dirty = true;
@ -813,12 +844,13 @@ impl EmbeddedGrid {
/* Erase all */
for y in 0..terminal_size.1 {
for x in 0..terminal_size.0 {
grid[(x, y)] = Cell::default();
screen.grid_mut()[(x, y)] = Cell::default();
}
}
//log::trace!("{}", EscCode::from((&(*state), byte)));
grid.clear_area(
let area = area!();
screen.grid_mut().clear_area(
area.take_cols(terminal_size.0).take_rows(terminal_size.1),
Default::default(),
);
@ -829,7 +861,8 @@ impl EmbeddedGrid {
/* Erase in Display (ED), VT100. */
/* Erase Below (default). */
grid.clear_area(
let area = area!();
screen.grid_mut().clear_area(
area.skip_rows(std::cmp::min(
cursor.1 + 1 + scroll_region.top,
terminal_size.1.saturating_sub(1),
@ -844,7 +877,8 @@ impl EmbeddedGrid {
/* Erase in Display (ED), VT100. */
/* Erase Above */
grid.clear_area(
let area = area!();
screen.grid_mut().clear_area(
area.take_rows(cursor.1.saturating_sub(1) + scroll_region.top),
Default::default(),
);
@ -856,7 +890,8 @@ impl EmbeddedGrid {
/* Erase in Display (ED), VT100. */
/* Erase All */
grid.clear_area(area, Default::default());
let area = area!();
screen.grid_mut().clear_area(area, Default::default());
//log::trace!("{}", EscCode::from((&(*state), byte)));
*dirty = true;
*state = State::Normal;
@ -877,7 +912,7 @@ impl EmbeddedGrid {
break;
}
}
grid[(cur_x, cur_y)] = Cell::default();
screen.grid_mut()[(cur_x, cur_y)] = Cell::default();
cur_x += 1;
ctr += 1;
}
@ -948,11 +983,11 @@ impl EmbeddedGrid {
/* scroll down */
for y in scroll_region.top..scroll_region.bottom {
for x in 0..terminal_size.1 {
grid[(x, y)] = grid[(x, y + 1)];
screen.grid_mut()[(x, y)] = screen.grid()[(x, y + 1)];
}
}
for x in 0..terminal_size.1 {
grid[(x, scroll_region.bottom)] = Cell::default();
screen.grid_mut()[(x, scroll_region.bottom)] = Cell::default();
}
} else if offset + cursor.1 < terminal_size.1 {
cursor.1 += offset;
@ -1059,10 +1094,11 @@ impl EmbeddedGrid {
};
for i in 0..(terminal_size.0 - cursor.0 - offset) {
grid[(cursor.0 + i, cursor.1)] = grid[(cursor.0 + i + offset, cursor.1)];
screen.grid_mut()[(cursor.0 + i, cursor.1)] =
screen.grid()[(cursor.0 + i + offset, cursor.1)];
}
for x in (terminal_size.0 - offset)..terminal_size.0 {
grid[(x, cursor.1)].set_ch(' ');
screen.grid_mut()[(x, cursor.1)].set_ch(' ');
}
//log::trace!(
// "Delete {} Character(s) with cursor at {:?} ",
@ -1202,9 +1238,10 @@ impl EmbeddedGrid {
);
}
}
grid[cursor_val!()].set_fg(*fg_color);
grid[cursor_val!()].set_bg(*bg_color);
grid[cursor_val!()].set_attrs(*attrs);
screen.grid_mut()[cursor_val!()]
.set_fg(*fg_color)
.set_bg(*bg_color)
.set_attrs(*attrs);
*dirty = true;
*state = State::Normal;
}
@ -1314,9 +1351,10 @@ impl EmbeddedGrid {
}
}
}
grid[cursor_val!()].set_fg(*fg_color);
grid[cursor_val!()].set_bg(*bg_color);
grid[cursor_val!()].set_attrs(*attrs);
screen.grid_mut()[cursor_val!()]
.set_fg(*fg_color)
.set_bg(*bg_color)
.set_attrs(*attrs);
*dirty = true;
*state = State::Normal;
}
@ -1419,7 +1457,7 @@ impl EmbeddedGrid {
} else {
Color::Default
};
grid[cursor_val!()].set_fg(*fg_color);
screen.grid_mut()[cursor_val!()].set_fg(*fg_color);
*dirty = true;
*state = State::Normal;
}
@ -1435,7 +1473,7 @@ impl EmbeddedGrid {
} else {
Color::Default
};
grid[cursor_val!()].set_bg(*bg_color);
screen.grid_mut()[cursor_val!()].set_bg(*bg_color);
*dirty = true;
*state = State::Normal;
}
@ -1504,7 +1542,7 @@ impl EmbeddedGrid {
(Ok(r), Ok(g), Ok(b)) => Color::Rgb(r, g, b),
_ => Color::Default,
};
grid[cursor_val!()].set_fg(*fg_color);
screen.grid_mut()[cursor_val!()].set_fg(*fg_color);
*dirty = true;
*state = State::Normal;
}
@ -1528,7 +1566,7 @@ impl EmbeddedGrid {
(Ok(r), Ok(g), Ok(b)) => Color::Rgb(r, g, b),
_ => Color::Default,
};
grid[cursor_val!()].set_bg(*bg_color);
screen.grid_mut()[cursor_val!()].set_bg(*bg_color);
*dirty = true;
*state = State::Normal;
}
@ -1551,7 +1589,7 @@ impl EmbeddedGrid {
(Ok(r), Ok(g), Ok(b)) => Color::Rgb(r, g, b),
_ => Color::Default,
};
grid[cursor_val!()].set_fg(*fg_color);
screen.grid_mut()[cursor_val!()].set_fg(*fg_color);
*dirty = true;
*state = State::Normal;
}
@ -1574,7 +1612,7 @@ impl EmbeddedGrid {
(Ok(r), Ok(g), Ok(b)) => Color::Rgb(r, g, b),
_ => Color::Default,
};
grid[cursor_val!()].set_bg(*bg_color);
screen.grid_mut()[cursor_val!()].set_bg(*bg_color);
*dirty = true;
*state = State::Normal;
}

Loading…
Cancel
Save