aboutsummaryrefslogtreecommitdiff
path: root/src/server/headless.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-11 18:25:44 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-11 18:25:44 +0300
commite12c7a2cef6c50f736658c20d0c5a33da033ae4b (patch)
tree71407c1fba6f6956ecd650e0deaf0726589692ed /src/server/headless.rs
parent733b109e20e82dffe8320efc2bed70c4e560da3b (diff)
fix: hide pane cursor while scrolled back
Diffstat (limited to 'src/server/headless.rs')
-rw-r--r--src/server/headless.rs34
1 files changed, 34 insertions, 0 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();