notedeck

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

commit ee38bcceef0d0924c91607d4e77e395e9f15244e
parent 40118d7f4e2e5171acd7ee97af8dac56f4d6628e
Author: William Casarin <jb55@jb55.com>
Date:   Mon, 16 Feb 2026 17:15:11 -0800

fix scroll position when switching sessions

Use per-session scroll area ID so each session maintains its own
scroll state. Previously all sessions shared a static id_salt,
causing scroll to stay near the top after switching.

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

Diffstat:
Mcrates/notedeck_dave/src/ui/dave.rs | 8++++++--
Mcrates/notedeck_dave/src/ui/mod.rs | 1+
2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/crates/notedeck_dave/src/ui/dave.rs b/crates/notedeck_dave/src/ui/dave.rs @@ -13,7 +13,7 @@ use crate::{ PermissionResponse, PermissionResponseType, QuestionAnswer, SubagentInfo, SubagentStatus, ToolResult, }, - session::PermissionMessageState, + session::{PermissionMessageState, SessionId}, tools::{PresentNotesCall, ToolCall, ToolCalls, ToolResponse}, }; use egui::{Align, Key, KeyboardShortcut, Layout, Modifiers}; @@ -34,6 +34,8 @@ pub struct DaveUi<'a> { has_pending_permission: bool, focus_requested: &'a mut bool, plan_mode_active: bool, + /// Session ID for per-session scroll state + session_id: SessionId, /// State for tentative permission response (waiting for message) permission_message_state: PermissionMessageState, /// State for AskUserQuestion responses (selected options per question) @@ -132,6 +134,7 @@ pub enum DaveAction { impl<'a> DaveUi<'a> { pub fn new( trial: bool, + session_id: SessionId, chat: &'a [Message], input: &'a mut String, focus_requested: &'a mut bool, @@ -139,6 +142,7 @@ impl<'a> DaveUi<'a> { ) -> Self { DaveUi { trial, + session_id, chat, input, compact: false, @@ -314,7 +318,7 @@ impl<'a> DaveUi<'a> { } let chat_response = egui::ScrollArea::vertical() - .id_salt("dave_chat_scroll") + .id_salt(("dave_chat_scroll", self.session_id)) .stick_to_bottom(true) .auto_shrink([false; 2]) .show(ui, |ui| { diff --git a/crates/notedeck_dave/src/ui/mod.rs b/crates/notedeck_dave/src/ui/mod.rs @@ -53,6 +53,7 @@ fn build_dave_ui<'a>( let mut ui_builder = DaveUi::new( model_config.trial, + session.id, &session.chat, &mut session.input, &mut session.focus_requested,