80 lines
3.2 KiB
Rust
80 lines
3.2 KiB
Rust
use crate::panes::PositionAndSize;
|
|
use crate::panes::TerminalPane;
|
|
|
|
pub fn get_output_frame_snapshots(
|
|
output_frames: &[Vec<u8>],
|
|
win_size: &PositionAndSize,
|
|
) -> Vec<String> {
|
|
let mut vte_parser = vte::Parser::new();
|
|
let main_pid = 0;
|
|
let mut terminal_output = TerminalPane::new(main_pid, *win_size);
|
|
|
|
let mut snapshots = vec![];
|
|
for frame in output_frames.iter() {
|
|
for byte in frame.iter() {
|
|
vte_parser.advance(&mut terminal_output, *byte);
|
|
}
|
|
let output_lines = terminal_output.read_buffer_as_lines();
|
|
let cursor_coordinates = terminal_output.cursor_coordinates();
|
|
let mut snapshot = String::new();
|
|
for (line_index, line) in output_lines.iter().enumerate() {
|
|
for (character_index, terminal_character) in line.iter().enumerate() {
|
|
if let Some((cursor_x, cursor_y)) = cursor_coordinates {
|
|
if line_index == cursor_y && character_index == cursor_x {
|
|
snapshot.push('█');
|
|
continue;
|
|
}
|
|
}
|
|
snapshot.push(terminal_character.character);
|
|
}
|
|
if line_index != output_lines.len() - 1 {
|
|
snapshot.push('\n');
|
|
}
|
|
}
|
|
snapshots.push(snapshot);
|
|
}
|
|
snapshots
|
|
}
|
|
|
|
pub fn get_next_to_last_snapshot(mut snapshots: Vec<String>) -> Option<String> {
|
|
if snapshots.len() < 2 {
|
|
None
|
|
} else {
|
|
Some(snapshots.remove(snapshots.len() - 2))
|
|
}
|
|
}
|
|
|
|
pub mod commands {
|
|
pub const COMMAND_TOGGLE: [u8; 1] = [7]; // ctrl-g
|
|
pub const QUIT: [u8; 1] = [17]; // ctrl-q
|
|
pub const ESC: [u8; 1] = [27];
|
|
|
|
pub const PANE_MODE: [u8; 1] = [16]; // ctrl-p
|
|
pub const SPAWN_TERMINAL_IN_PANE_MODE: [u8; 1] = [110]; // n
|
|
pub const MOVE_FOCUS_IN_PANE_MODE: [u8; 1] = [112]; // p
|
|
pub const SPLIT_DOWN_IN_PANE_MODE: [u8; 1] = [100]; // d
|
|
pub const SPLIT_RIGHT_IN_PANE_MODE: [u8; 1] = [114]; // r
|
|
pub const TOGGLE_ACTIVE_TERMINAL_FULLSCREEN_IN_PANE_MODE: [u8; 1] = [102]; // f
|
|
pub const CLOSE_PANE_IN_PANE_MODE: [u8; 1] = [120]; // x
|
|
pub const MOVE_FOCUS_DOWN_IN_PANE_MODE: [u8; 1] = [106]; // j
|
|
pub const MOVE_FOCUS_UP_IN_PANE_MODE: [u8; 1] = [107]; // k
|
|
pub const MOVE_FOCUS_LEFT_IN_PANE_MODE: [u8; 1] = [104]; // h
|
|
pub const MOVE_FOCUS_RIGHT_IN_PANE_MODE: [u8; 1] = [108]; // l
|
|
|
|
pub const SCROLL_MODE: [u8; 1] = [19]; // ctrl-s
|
|
pub const SCROLL_UP_IN_SCROLL_MODE: [u8; 1] = [107]; // k
|
|
pub const SCROLL_DOWN_IN_SCROLL_MODE: [u8; 1] = [106]; // j
|
|
|
|
pub const RESIZE_MODE: [u8; 1] = [18]; // ctrl-r
|
|
pub const RESIZE_DOWN_IN_RESIZE_MODE: [u8; 1] = [106]; // j
|
|
pub const RESIZE_UP_IN_RESIZE_MODE: [u8; 1] = [107]; // k
|
|
pub const RESIZE_LEFT_IN_RESIZE_MODE: [u8; 1] = [104]; // h
|
|
pub const RESIZE_RIGHT_IN_RESIZE_MODE: [u8; 1] = [108]; // l
|
|
|
|
pub const TAB_MODE: [u8; 1] = [20]; // ctrl-t
|
|
pub const NEW_TAB_IN_TAB_MODE: [u8; 1] = [110]; // n
|
|
pub const SWITCH_NEXT_TAB_IN_TAB_MODE: [u8; 1] = [108]; // l
|
|
pub const SWITCH_PREV_TAB_IN_TAB_MODE: [u8; 1] = [104]; // h
|
|
pub const CLOSE_TAB_IN_TAB_MODE: [u8; 1] = [120]; // x
|
|
pub const SLEEP: [u8; 0] = [];
|
|
}
|