aboutsummaryrefslogtreecommitdiff
path: root/src/server/render_stream.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/render_stream.rs')
-rw-r--r--src/server/render_stream.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/server/render_stream.rs b/src/server/render_stream.rs
index 94a43980..d82eb855 100644
--- a/src/server/render_stream.rs
+++ b/src/server/render_stream.rs
@@ -258,6 +258,34 @@ pub(crate) fn render_virtual_with_cell_size(
(buffer, cursor)
}
+/// Renders one server-owned terminal directly for `terminal attach` clients.
+pub(crate) fn render_terminal_virtual(
+ runtime: &crate::terminal::TerminalRuntime,
+ area: Rect,
+) -> (ratatui::buffer::Buffer, Option<CursorState>) {
+ let backend = CursorTrackingBackend::new(area.width, area.height);
+ let mut terminal = ratatui::Terminal::new(backend).expect("TestBackend::new should never fail");
+
+ terminal
+ .draw(|frame| {
+ runtime.render(frame, area, true);
+ })
+ .expect("render to TestBackend should never fail");
+
+ let buffer = terminal.backend().buffer().clone();
+ let cursor = runtime
+ .cursor_state(area, true)
+ .map(|cursor| CursorState {
+ x: cursor.x,
+ y: cursor.y,
+ visible: cursor.visible && !crate::ui::pane_is_scrolled_back(runtime),
+ shape: cursor.shape,
+ })
+ .or_else(|| terminal.backend().rendered_cursor());
+
+ (buffer, cursor)
+}
+
pub(crate) fn visible_hyperlinks(app_state: &AppState) -> Vec<((u16, u16), String, String)> {
let Some(ws_idx) = app_state.active else {
return Vec::new();