feat: Add scroll (#643)

* Add scroll

* Update running_command.rs

* Add hints, Up and Down to terminal
This commit is contained in:
JEEVITHA KANNAN K S 2024-10-01 02:16:05 +05:30 committed by GitHub
parent df4f44461e
commit 66b92c84b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -37,6 +37,7 @@ pub struct RunningCommand {
writer: Box<dyn Write + Send>, writer: Box<dyn Write + Send>,
/// Only set after the process has ended /// Only set after the process has ended
status: Option<ExitStatus>, status: Option<ExitStatus>,
scroll_offset: usize,
} }
impl FloatContent for RunningCommand { impl FloatContent for RunningCommand {
@ -102,6 +103,12 @@ impl FloatContent for RunningCommand {
KeyCode::Enter if self.is_finished() => { KeyCode::Enter if self.is_finished() => {
return true; return true;
} }
KeyCode::PageUp => {
self.scroll_offset = self.scroll_offset.saturating_add(10);
}
KeyCode::PageDown => {
self.scroll_offset = self.scroll_offset.saturating_sub(10);
}
// Pass other key events to the terminal // Pass other key events to the terminal
_ => self.handle_passthrough_key_event(key), _ => self.handle_passthrough_key_event(key),
} }
@ -121,12 +128,20 @@ impl FloatContent for RunningCommand {
if self.is_finished() { if self.is_finished() {
( (
"Finished command", "Finished command",
Box::new([Shortcut::new("Close window", ["Enter", "q"])]), Box::new([
Shortcut::new("Close window", ["Enter", "q"]),
Shortcut::new("Scroll up", ["Page up"]),
Shortcut::new("Scroll down", ["Page down"]),
]),
) )
} else { } else {
( (
"Running command", "Running command",
Box::new([Shortcut::new("Kill the command", ["CTRL-c"])]), Box::new([
Shortcut::new("Kill the command", ["CTRL-c"]),
Shortcut::new("Scroll up", ["Page up"]),
Shortcut::new("Scroll down", ["Page down"]),
]),
) )
} }
} }
@ -220,6 +235,7 @@ impl RunningCommand {
pty_master: pair.master, pty_master: pair.master,
writer, writer,
status: None, status: None,
scroll_offset: 0,
} }
} }
@ -237,10 +253,12 @@ impl RunningCommand {
// Process the buffer with a parser with the current screen size // Process the buffer with a parser with the current screen size
// We don't actually need to create a new parser every time, but it is so much easier this // We don't actually need to create a new parser every time, but it is so much easier this
// way, and doesn't cost that much // way, and doesn't cost that much
let mut parser = vt100::Parser::new(size.height, size.width, 0); let mut parser = vt100::Parser::new(size.height, size.width, 200);
let mutex = self.buffer.lock(); let mutex = self.buffer.lock();
let buffer = mutex.as_ref().unwrap(); let buffer = mutex.as_ref().unwrap();
parser.process(buffer); parser.process(buffer);
// Adjust the screen content based on the scroll offset
parser.set_scrollback(self.scroll_offset);
parser.screen().clone() parser.screen().clone()
} }
@ -297,8 +315,6 @@ impl RunningCommand {
KeyCode::Tab => vec![9], KeyCode::Tab => vec![9],
KeyCode::Home => vec![27, 91, 72], KeyCode::Home => vec![27, 91, 72],
KeyCode::End => vec![27, 91, 70], KeyCode::End => vec![27, 91, 70],
KeyCode::PageUp => vec![27, 91, 53, 126],
KeyCode::PageDown => vec![27, 91, 54, 126],
KeyCode::BackTab => vec![27, 91, 90], KeyCode::BackTab => vec![27, 91, 90],
KeyCode::Delete => vec![27, 91, 51, 126], KeyCode::Delete => vec![27, 91, 51, 126],
KeyCode::Insert => vec![27, 91, 50, 126], KeyCode::Insert => vec![27, 91, 50, 126],