From b8c96102eb4226c7614a656d6fb4277a6cc30008 Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Tue, 12 May 2026 01:10:03 +0300 Subject: [PATCH] fix: hide mobile switcher cursor --- src/server/headless.rs | 35 +++++++++++++++++++++++++++++++++++ src/server/render_stream.rs | 8 +++----- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/server/headless.rs b/src/server/headless.rs index 7bd7abce..10df803d 100644 --- a/src/server/headless.rs +++ b/src/server/headless.rs @@ -1962,6 +1962,41 @@ mod tests { ); } + #[tokio::test] + async fn virtual_render_hides_focused_pane_cursor_while_mobile_switcher_open() { + let mut state = AppState::test_new(); + let mut ws = crate::workspace::Workspace::test_new("test"); + let pane_id = ws.tabs[0].root_pane; + ws.tabs[0].runtimes.insert( + pane_id, + crate::pane::PaneRuntime::test_with_screen_bytes(20, 5, b"left"), + ); + + state.workspaces = vec![ws]; + state.active = Some(0); + state.selected = 0; + state.mode = crate::app::Mode::Navigate; + + let area = Rect::new(0, 0, 44, 24); + let (_buffer, cursor) = + crate::server::render_stream::render_virtual(&mut state, area, true); + let pane = state + .view + .pane_infos + .iter() + .find(|info| info.id == pane_id) + .expect("focused pane info"); + + assert_eq!( + cursor, + Some(CursorState { + x: pane.inner_rect.x + 4, + y: pane.inner_rect.y, + visible: false, + }) + ); + } + #[tokio::test] async fn virtual_render_hides_focused_pane_cursor_while_scrolled_back() { let mut state = AppState::test_new(); diff --git a/src/server/render_stream.rs b/src/server/render_stream.rs index 45542a7a..856a362f 100644 --- a/src/server/render_stream.rs +++ b/src/server/render_stream.rs @@ -246,10 +246,6 @@ pub(crate) fn visible_hyperlinks(app_state: &AppState) -> Vec<((u16, u16), Strin } fn focused_terminal_cursor(app_state: &AppState) -> Option { - if app_state.mode != Mode::Terminal { - return None; - } - let ws_idx = app_state.active?; let ws = app_state.workspaces.get(ws_idx)?; let info = app_state @@ -262,6 +258,8 @@ fn focused_terminal_cursor(app_state: &AppState) -> Option { Some(CursorState { x: cursor.x, y: cursor.y, - visible: cursor.visible && !crate::ui::pane_is_scrolled_back(rt), + visible: app_state.mode == Mode::Terminal + && cursor.visible + && !crate::ui::pane_is_scrolled_back(rt), }) }