diff --git a/drivers/graphics/fbcond/src/text.rs b/drivers/graphics/fbcond/src/text.rs index 8a24bbeb..8c85bf77 100644 --- a/drivers/graphics/fbcond/src/text.rs +++ b/drivers/graphics/fbcond/src/text.rs @@ -5,11 +5,15 @@ use syscall::error::*; use crate::display::Display; +const SCROLLBACK_LINES: usize = 1000; + pub struct TextScreen { pub display: Display, inner: console_draw::TextScreen, ctrl: bool, input: VecDeque, + scrollback: VecDeque>, + scroll_pos: usize, } impl TextScreen { @@ -19,6 +23,8 @@ impl TextScreen { inner: console_draw::TextScreen::new(), ctrl: false, input: VecDeque::new(), + scrollback: VecDeque::with_capacity(SCROLLBACK_LINES), + scroll_pos: 0, } } @@ -126,9 +132,26 @@ impl TextScreen { let damage = self.inner.write(map, buf, &mut self.input); + for line in buf.split(|&b| b == b'\n') { + let mut v = line.to_vec(); + v.push(b'\n'); + self.scrollback.push_back(v); + } + while self.scrollback.len() > SCROLLBACK_LINES { + self.scrollback.pop_front(); + } + self.display.sync_rect(damage); } Ok(buf.len()) } + + pub fn read_scrollback(&self) -> Vec { + let mut result = Vec::new(); + for line in &self.scrollback { + result.extend_from_slice(line); + } + result + } }