notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit f76da4773e072bb7e14cb6f6a077512352d7753c
parent 87b639c5c21df3afe43825498cb7702c8d01e700
Author: William Casarin <jb55@jb55.com>
Date:   Fri, 27 Feb 2026 14:16:05 -0800

dave: skip input auto-focus on mobile, dismiss Done on focus queue nav

Don't request_focus() on the text input when is_compiled_as_mobile to
avoid the virtual keyboard popping up on every session switch.

Also auto-dismiss Done items from the focus queue when navigating
via next/prev (Ctrl+N/P or the mobile NEXT badge), matching the
session list behavior.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Diffstat:
Mcrates/notedeck_dave/src/ui/dave.rs | 7+++++--
Mcrates/notedeck_dave/src/update.rs | 21+++++++++++++++++++++
2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/crates/notedeck_dave/src/ui/dave.rs b/crates/notedeck_dave/src/ui/dave.rs @@ -1323,9 +1323,12 @@ impl<'a> DaveUi<'a> { notedeck_ui::context_menu::PasteBehavior::Append, ); - // Request focus if flagged (e.g., after spawning a new agent or entering tentative state) + // Request focus if flagged (e.g., after spawning a new agent or entering tentative state). + // Skip on mobile to avoid popping up the virtual keyboard on every session switch. if *self.focus_requested { - r.request_focus(); + if !notedeck::ui::is_compiled_as_mobile() { + r.request_focus(); + } *self.focus_requested = false; } diff --git a/crates/notedeck_dave/src/update.rs b/crates/notedeck_dave/src/update.rs @@ -518,6 +518,7 @@ pub fn cycle_prev_agent( // ============================================================================= /// Navigate to the next item in the focus queue. +/// Done items are automatically dismissed after switching to them. pub fn focus_queue_next( session_manager: &mut SessionManager, focus_queue: &mut FocusQueue, @@ -526,10 +527,12 @@ pub fn focus_queue_next( ) { if let Some(session_id) = focus_queue.next() { switch_and_focus_session(session_manager, scene, show_scene, session_id); + dismiss_done(session_manager, focus_queue, session_id); } } /// Navigate to the previous item in the focus queue. +/// Done items are automatically dismissed after switching to them. pub fn focus_queue_prev( session_manager: &mut SessionManager, focus_queue: &mut FocusQueue, @@ -538,6 +541,24 @@ pub fn focus_queue_prev( ) { if let Some(session_id) = focus_queue.prev() { switch_and_focus_session(session_manager, scene, show_scene, session_id); + dismiss_done(session_manager, focus_queue, session_id); + } +} + +/// Dismiss a Done session from the focus queue and clear its indicator. +fn dismiss_done( + session_manager: &mut SessionManager, + focus_queue: &mut FocusQueue, + session_id: SessionId, +) { + if focus_queue.get_session_priority(session_id) == Some(FocusPriority::Done) { + focus_queue.dequeue_done(session_id); + if let Some(session) = session_manager.get_mut(session_id) { + if session.indicator == Some(FocusPriority::Done) { + session.indicator = None; + session.state_dirty = true; + } + } } }