From f4c4cf2c33e47887878140f4c25f5433cb16ddc9 Mon Sep 17 00:00:00 2001 From: cgasgarth <64235119+cgasgarth@users.noreply.github.com> Date: Sun, 12 Apr 2026 15:12:30 -0500 Subject: [PATCH 1/2] Fix assistant chat auto-scroll timing Defer transcript scrolling until GTK has laid out newly inserted text so long chat runs stay pinned to the latest message. --- darktable/src/views/darkroom.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/darktable/src/views/darkroom.c b/darktable/src/views/darkroom.c index 5bb48b5..7ef18d8 100644 --- a/darktable/src/views/darkroom.c +++ b/darktable/src/views/darkroom.c @@ -142,6 +142,7 @@ static struct dt_agent_chat_session_t *_agent_chat_lookup_session(dt_develop_t * dt_imgid_t image_id); static void _agent_chat_session_set_status(dt_agent_chat_session_t *session, const char *status); +static void _agent_chat_scroll_to_end(dt_develop_t *dev); static void _agent_chat_update_sensitivity(dt_develop_t *dev); static void _agent_chat_set_status(dt_develop_t *dev, const char *status); static void _agent_chat_set_error(dt_develop_t *dev, const char *error); @@ -2008,6 +2009,8 @@ static void _agent_chat_replace_transcript(dt_develop_t *dev, const char *text) GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(dev->agent_chat.conversation_view)); gtk_text_buffer_set_text(buffer, text ? text : "", -1); + + _agent_chat_scroll_to_end(dev); } static void _agent_chat_sync_current_session(dt_develop_t *dev) @@ -2409,15 +2412,36 @@ static void _agent_chat_session_append_message(dt_agent_chat_session_t *session, } } +static gboolean _agent_chat_scroll_to_end_idle(gpointer user_data) +{ + dt_develop_t *dev = user_data; + if(!dev || !GTK_IS_TEXT_VIEW(dev->agent_chat.conversation_view)) + return G_SOURCE_REMOVE; + + GtkTextView *view = GTK_TEXT_VIEW(dev->agent_chat.conversation_view); + GtkTextBuffer *buffer = gtk_text_view_get_buffer(view); + GtkTextIter end; + gtk_text_buffer_get_end_iter(buffer, &end); + gtk_text_view_scroll_to_iter(view, &end, 0.0, FALSE, 0.0, 1.0); + + GtkWidget *scroll = gtk_widget_get_ancestor(dev->agent_chat.conversation_view, + GTK_TYPE_SCROLLED_WINDOW); + if(GTK_IS_SCROLLED_WINDOW(scroll)) + { + GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scroll)); + const gdouble bottom = MAX(0.0, gtk_adjustment_get_upper(adj) - gtk_adjustment_get_page_size(adj)); + gtk_adjustment_set_value(adj, bottom); + } + + return G_SOURCE_REMOVE; +} + static void _agent_chat_scroll_to_end(dt_develop_t *dev) { - GtkWidget *scroll - = gtk_widget_get_ancestor(dev->agent_chat.conversation_view, GTK_TYPE_SCROLLED_WINDOW); - if(!GTK_IS_SCROLLED_WINDOW(scroll)) + if(!dev || !GTK_IS_TEXT_VIEW(dev->agent_chat.conversation_view)) return; - GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scroll)); - gtk_adjustment_set_value(adj, gtk_adjustment_get_upper(adj)); + g_idle_add(_agent_chat_scroll_to_end_idle, dev); } static void _agent_chat_append_message(dt_develop_t *dev, From d7ffc16fa421a90f548e56e9b854321a98764b61 Mon Sep 17 00:00:00 2001 From: cgasgarth <64235119+cgasgarth@users.noreply.github.com> Date: Sun, 12 Apr 2026 15:14:11 -0500 Subject: [PATCH 2/2] Ignore darktable cache directory Keep the local darktable cache out of the worktree so this branch and future PRs stay clean while iterating on the app. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 845cb77..d180a02 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ uv.lock darktable/build/ darktable/build-*/ darktable/.install-*/ +darktable/.cache/ darktable/compile_commands.json darktable/Testing/ .darktable-local/