aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorakbash <akbash@herdr.dev>2026-08-11 22:55:49 +0300
committerGitHub <noreply@github.com>2026-08-11 22:55:49 +0300
commit3607453087fdc870b7c6aff5cf64b202f630c513 (patch)
tree50c3cae497b21874188081b43a66e013d0376a18 /src/server
parent06ca0baa12f4203c5bbad9ecadf53f9a475a52b2 (diff)
fix(render): compact large terminal redraws (#2675)
refs #2670 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Diffstat (limited to 'src/server')
-rw-r--r--src/server/headless.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/server/headless.rs b/src/server/headless.rs
index ff6f367d..7393a7c5 100644
--- a/src/server/headless.rs
+++ b/src/server/headless.rs
@@ -9156,6 +9156,80 @@ next_tab = ""
}
#[test]
+ fn render_and_stream_sends_large_terminal_frame_for_terminal_ansi_client() {
+ let mut server = test_headless_server();
+ server.app.state.workspaces = vec![crate::workspace::Workspace::test_new("test")];
+ server.app.state.ensure_test_terminals();
+ server.app.state.active = Some(0);
+ server.app.state.selected = 0;
+ server.app.state.mode = crate::app::Mode::Terminal;
+ let (client_tx, _client_control_rx, client_rx) = test_client_writer();
+
+ server.clients.insert(
+ 1,
+ ClientConnection::new(
+ (278, 85),
+ crate::kitty_graphics::HostCellSize::default(),
+ crate::terminal_theme::TerminalTheme::default(),
+ None,
+ 1,
+ RenderEncoding::TerminalAnsi,
+ Some(client_tx),
+ ),
+ );
+ server.foreground_client_id = Some(1);
+ server.sync_foreground_client_state();
+
+ server.render_and_stream();
+ match read_server_message(
+ client_rx
+ .recv_timeout(Duration::from_millis(100))
+ .expect("initial terminal frame"),
+ ) {
+ ServerMessage::Terminal(frame) => {
+ assert_eq!(frame.seq, 1);
+ assert_eq!((frame.width, frame.height), (278, 85));
+ assert!(frame.full);
+ }
+ other => panic!("expected terminal frame, got {other:?}"),
+ }
+
+ assert!(server.handle_server_event(ServerEvent::ClientResize {
+ client_id: 1,
+ cols: 710,
+ rows: 202,
+ cell_width_px: 0,
+ cell_height_px: 0,
+ }));
+ server.render_and_stream();
+
+ match read_server_message(
+ client_rx
+ .recv_timeout(Duration::from_millis(100))
+ .expect("large terminal frame"),
+ ) {
+ ServerMessage::Terminal(frame) => {
+ assert_eq!(frame.seq, 2);
+ assert_eq!((frame.width, frame.height), (710, 202));
+ assert!(frame.full);
+ assert!(!frame.bytes.is_empty());
+ }
+ other => panic!("expected terminal frame, got {other:?}"),
+ }
+
+ server.app.state.mode = crate::app::Mode::Navigate;
+ server.render_and_stream();
+ match read_server_message(
+ client_rx
+ .recv_timeout(Duration::from_millis(100))
+ .expect("follow-up terminal frame"),
+ ) {
+ ServerMessage::Terminal(frame) => assert_eq!(frame.seq, 3),
+ other => panic!("expected terminal frame, got {other:?}"),
+ }
+ }
+
+ #[test]
fn terminal_ansi_input_does_not_reset_blit_baseline() {
let mut server = test_headless_server();
let (client_tx, _client_control_rx, client_rx) = test_client_writer();