diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/headless.rs | 34 | ||||
| -rw-r--r-- | src/server/render_stream.rs | 4 |
2 files changed, 36 insertions, 2 deletions
diff --git a/src/server/headless.rs b/src/server/headless.rs index 337bbec7..7bd7abce 100644 --- a/src/server/headless.rs +++ b/src/server/headless.rs @@ -1962,6 +1962,40 @@ mod tests { ); } + #[tokio::test] + async fn virtual_render_hides_focused_pane_cursor_while_scrolled_back() { + let mut state = AppState::test_new(); + let mut ws = crate::workspace::Workspace::test_new("test"); + let pane_id = ws.tabs[0].root_pane; + let mut bytes = Vec::new(); + for line in 0..80 { + bytes.extend_from_slice(format!("line {line:02}\r\n").as_bytes()); + } + let runtime = crate::pane::PaneRuntime::test_with_scrollback_bytes(20, 5, 4096, &bytes); + ws.tabs[0].runtimes.insert(pane_id, runtime); + + state.workspaces = vec![ws]; + state.active = Some(0); + state.selected = 0; + state.mode = crate::app::Mode::Terminal; + + let area = Rect::new(0, 0, 80, 24); + let _ = crate::server::render_stream::render_virtual(&mut state, area, true); + let runtime = state.workspaces[0] + .runtime(pane_id) + .expect("pane runtime after initial render"); + runtime.scroll_up(6); + assert!(crate::ui::pane_is_scrolled_back(runtime)); + + let (_buffer, cursor) = + crate::server::render_stream::render_virtual(&mut state, area, true); + + assert!( + cursor.as_ref().is_none_or(|cursor| !cursor.visible), + "cursor: {cursor:?}" + ); + } + #[test] fn latest_active_client_drives_shared_size_theme_and_fallback() { let mut server = test_headless_server(); diff --git a/src/server/render_stream.rs b/src/server/render_stream.rs index f1749657..45542a7a 100644 --- a/src/server/render_stream.rs +++ b/src/server/render_stream.rs @@ -257,11 +257,11 @@ fn focused_terminal_cursor(app_state: &AppState) -> Option<CursorState> { .pane_infos .iter() .find(|info| info.is_focused)?; - let rt = ws.runtimes.get(&info.id)?; + let rt = ws.runtime(info.id)?; let cursor = rt.cursor_state(info.inner_rect, true)?; Some(CursorState { x: cursor.x, y: cursor.y, - visible: cursor.visible, + visible: cursor.visible && !crate::ui::pane_is_scrolled_back(rt), }) } |
