allow dump_screen() to only dump the viewport (#1794)
* allow dump_screen() to only dump the viewport * add additional implementations * set full default as false
This commit is contained in:
parent
5878e9f6f8
commit
2e70a4c672
10 changed files with 40 additions and 19 deletions
|
|
@ -985,9 +985,12 @@ impl Grid {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn dump_screen(&mut self) -> String {
|
||||
let mut scrollback: String = dump_screen!(self.lines_above);
|
||||
pub fn dump_screen(&mut self, full: bool) -> String {
|
||||
let viewport: String = dump_screen!(self.viewport);
|
||||
if !full {
|
||||
return viewport;
|
||||
}
|
||||
let mut scrollback: String = dump_screen!(self.lines_above);
|
||||
if !scrollback.is_empty() {
|
||||
scrollback.push('\n');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -512,8 +512,8 @@ impl Pane for TerminalPane {
|
|||
self.geom.y -= count;
|
||||
self.reflow_lines();
|
||||
}
|
||||
fn dump_screen(&mut self, _client_id: ClientId) -> String {
|
||||
self.grid.dump_screen()
|
||||
fn dump_screen(&mut self, _client_id: ClientId, full: bool) -> String {
|
||||
self.grid.dump_screen(full)
|
||||
}
|
||||
fn scroll_up(&mut self, count: usize, _client_id: ClientId) {
|
||||
self.grid.move_viewport_up(count);
|
||||
|
|
|
|||
|
|
@ -157,10 +157,10 @@ pub(crate) fn route_action(
|
|||
};
|
||||
session.senders.send_to_screen(screen_instr).unwrap();
|
||||
},
|
||||
Action::DumpScreen(val) => {
|
||||
Action::DumpScreen(val, full) => {
|
||||
session
|
||||
.senders
|
||||
.send_to_screen(ScreenInstruction::DumpScreen(val, client_id))
|
||||
.send_to_screen(ScreenInstruction::DumpScreen(val, client_id, full))
|
||||
.unwrap();
|
||||
},
|
||||
Action::EditScrollback => {
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ pub enum ScreenInstruction {
|
|||
MovePaneRight(ClientId),
|
||||
MovePaneLeft(ClientId),
|
||||
Exit,
|
||||
DumpScreen(String, ClientId),
|
||||
DumpScreen(String, ClientId, bool),
|
||||
EditScrollback(ClientId),
|
||||
ScrollUp(ClientId),
|
||||
ScrollUpAt(Position, ClientId),
|
||||
|
|
@ -1437,12 +1437,15 @@ pub(crate) fn screen_thread_main(
|
|||
screen.render()?;
|
||||
screen.unblock_input()?;
|
||||
},
|
||||
ScreenInstruction::DumpScreen(file, client_id) => {
|
||||
ScreenInstruction::DumpScreen(file, client_id, full) => {
|
||||
active_tab_and_connected_client_id!(
|
||||
screen,
|
||||
client_id,
|
||||
|tab: &mut Tab, client_id: ClientId| tab
|
||||
.dump_active_terminal_screen(Some(file.to_string()), client_id)
|
||||
|tab: &mut Tab, client_id: ClientId| tab.dump_active_terminal_screen(
|
||||
Some(file.to_string()),
|
||||
client_id,
|
||||
full
|
||||
)
|
||||
);
|
||||
screen.render()?;
|
||||
screen.unblock_input()?;
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ pub trait Pane {
|
|||
fn push_right(&mut self, count: usize);
|
||||
fn pull_left(&mut self, count: usize);
|
||||
fn pull_up(&mut self, count: usize);
|
||||
fn dump_screen(&mut self, _client_id: ClientId) -> String {
|
||||
fn dump_screen(&mut self, _client_id: ClientId, _full: bool) -> String {
|
||||
"".to_owned()
|
||||
}
|
||||
fn scroll_up(&mut self, count: usize, client_id: ClientId);
|
||||
|
|
@ -1800,16 +1800,25 @@ impl Tab {
|
|||
}
|
||||
Ok(())
|
||||
}
|
||||
pub fn dump_active_terminal_screen(&mut self, file: Option<String>, client_id: ClientId) {
|
||||
pub fn dump_active_terminal_screen(
|
||||
&mut self,
|
||||
file: Option<String>,
|
||||
client_id: ClientId,
|
||||
full: bool,
|
||||
) {
|
||||
if let Some(active_pane) = self.get_active_pane_or_floating_pane_mut(client_id) {
|
||||
let dump = active_pane.dump_screen(client_id);
|
||||
let dump = active_pane.dump_screen(client_id, full);
|
||||
self.os_api.write_to_file(dump, file);
|
||||
}
|
||||
}
|
||||
pub fn edit_scrollback(&mut self, client_id: ClientId) -> Result<()> {
|
||||
let mut file = temp_dir();
|
||||
file.push(format!("{}.dump", Uuid::new_v4()));
|
||||
self.dump_active_terminal_screen(Some(String::from(file.to_string_lossy())), client_id);
|
||||
self.dump_active_terminal_screen(
|
||||
Some(String::from(file.to_string_lossy())),
|
||||
client_id,
|
||||
true,
|
||||
);
|
||||
let line_number = self
|
||||
.get_active_pane(client_id)
|
||||
.and_then(|a_t| a_t.get_line_number());
|
||||
|
|
|
|||
|
|
@ -507,7 +507,7 @@ fn dump_screen() {
|
|||
tab.handle_pty_bytes(2, Vec::from("scratch".as_bytes()))
|
||||
.unwrap();
|
||||
let file = "/tmp/log.sh";
|
||||
tab.dump_active_terminal_screen(Some(file.to_string()), client_id);
|
||||
tab.dump_active_terminal_screen(Some(file.to_string()), client_id, false);
|
||||
assert_eq!(
|
||||
map.lock().unwrap().get(file).unwrap(),
|
||||
"scratch",
|
||||
|
|
|
|||
|
|
@ -1190,6 +1190,7 @@ pub fn send_cli_dump_screen_action() {
|
|||
);
|
||||
let cli_action = CliAction::DumpScreen {
|
||||
path: PathBuf::from("/tmp/foo"),
|
||||
full: true,
|
||||
};
|
||||
let _ = mock_screen.to_screen.send(ScreenInstruction::PtyBytes(
|
||||
0,
|
||||
|
|
|
|||
|
|
@ -181,7 +181,11 @@ pub enum CliAction {
|
|||
/// [right|left|up|down]
|
||||
MovePane { direction: Direction },
|
||||
/// Dumps the pane scrollback to a file
|
||||
DumpScreen { path: PathBuf },
|
||||
DumpScreen {
|
||||
path: PathBuf,
|
||||
#[clap(short, long, value_parser, default_value("false"), takes_value(false))]
|
||||
full: bool,
|
||||
},
|
||||
/// Open the pane scrollback in your default editor
|
||||
EditScrollback,
|
||||
/// Scroll up in the focused pane
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ pub enum Action {
|
|||
MoveFocusOrTab(Direction),
|
||||
MovePane(Option<Direction>),
|
||||
/// Dumps the screen to a file
|
||||
DumpScreen(String),
|
||||
DumpScreen(String, bool),
|
||||
/// Scroll up in focus pane.
|
||||
EditScrollback,
|
||||
ScrollUp,
|
||||
|
|
@ -237,8 +237,9 @@ impl Action {
|
|||
CliAction::MoveFocus { direction } => Ok(vec![Action::MoveFocus(direction)]),
|
||||
CliAction::MoveFocusOrTab { direction } => Ok(vec![Action::MoveFocusOrTab(direction)]),
|
||||
CliAction::MovePane { direction } => Ok(vec![Action::MovePane(Some(direction))]),
|
||||
CliAction::DumpScreen { path } => Ok(vec![Action::DumpScreen(
|
||||
CliAction::DumpScreen { path, full } => Ok(vec![Action::DumpScreen(
|
||||
path.as_os_str().to_string_lossy().into(),
|
||||
full,
|
||||
)]),
|
||||
CliAction::EditScrollback => Ok(vec![Action::EditScrollback]),
|
||||
CliAction::ScrollUp => Ok(vec![Action::ScrollUp]),
|
||||
|
|
|
|||
|
|
@ -427,7 +427,7 @@ impl Action {
|
|||
Ok(Action::MovePane(Some(direction)))
|
||||
}
|
||||
},
|
||||
"DumpScreen" => Ok(Action::DumpScreen(string)),
|
||||
"DumpScreen" => Ok(Action::DumpScreen(string, false)),
|
||||
"NewPane" => {
|
||||
if string.is_empty() {
|
||||
return Ok(Action::NewPane(None, None));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue