Preserve alternate screen snapshots and speed builds
This commit is contained in:
+15
-4
@@ -277,7 +277,7 @@ async fn handle_bootstrap_attach(
|
||||
session.parser.set_size(req.rows, req.cols);
|
||||
}
|
||||
let client_id = crypto::random_16();
|
||||
let snapshot = session.parser.screen().state_formatted();
|
||||
let snapshot = screen_snapshot(session.parser.screen());
|
||||
let screen = session.parser.screen().clone();
|
||||
let output_seq = session.output_seq;
|
||||
session.clients.insert(
|
||||
@@ -385,7 +385,7 @@ async fn handle_ticket_attach(
|
||||
session.parser.set_size(req.rows, req.cols);
|
||||
}
|
||||
let client_id = crypto::random_16();
|
||||
let snapshot = session.parser.screen().state_formatted();
|
||||
let snapshot = screen_snapshot(session.parser.screen());
|
||||
let screen = session.parser.screen().clone();
|
||||
let output_seq = session.output_seq;
|
||||
session.clients.insert(
|
||||
@@ -491,7 +491,7 @@ async fn handle_resume(
|
||||
session.pty.resize(req.cols, req.rows)?;
|
||||
session.parser.set_size(req.rows, req.cols);
|
||||
}
|
||||
let snapshot = session.parser.screen().state_formatted();
|
||||
let snapshot = screen_snapshot(session.parser.screen());
|
||||
client.last_screen = Some(session.parser.screen().clone());
|
||||
(client.send_seq, session.output_seq, snapshot)
|
||||
};
|
||||
@@ -675,7 +675,7 @@ async fn broadcast_output(
|
||||
let current_screen = session.parser.screen().clone();
|
||||
let (bytes, snapshot) = if client.pending.len() >= retransmit_window {
|
||||
client.pending.clear();
|
||||
(current_screen.state_formatted(), true)
|
||||
(screen_snapshot(¤t_screen), true)
|
||||
} else {
|
||||
(output.bytes.clone(), false)
|
||||
};
|
||||
@@ -758,6 +758,17 @@ async fn broadcast_session_exit(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn screen_snapshot(screen: &vt100::Screen) -> Vec<u8> {
|
||||
let mut bytes = Vec::new();
|
||||
if screen.alternate_screen() {
|
||||
bytes.extend_from_slice(b"\x1b[?1049h");
|
||||
} else {
|
||||
bytes.extend_from_slice(b"\x1b[?1049l");
|
||||
}
|
||||
bytes.extend(screen.state_formatted());
|
||||
bytes
|
||||
}
|
||||
|
||||
async fn retransmit_pending(
|
||||
state: &Arc<Mutex<ServerState>>,
|
||||
socket: &Arc<UdpSocket>,
|
||||
|
||||
Reference in New Issue
Block a user