diff options
| author | akbash <akbash@herdr.dev> | 2026-08-11 22:55:49 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-08-11 22:55:49 +0300 |
| commit | 3607453087fdc870b7c6aff5cf64b202f630c513 (patch) | |
| tree | 50c3cae497b21874188081b43a66e013d0376a18 /src/server | |
| parent | 06ca0baa12f4203c5bbad9ecadf53f9a475a52b2 (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.rs | 74 |
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(); |
