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:
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;
+ }
+ }
}
}