From d33ae5bb6f0bc41581d08eeab229cbecbc08f281 Mon Sep 17 00:00:00 2001 From: Torlando <281092095+torlando-agent[bot]@users.noreply.github.com> Date: Fri, 4 Sep 2026 13:40:45 +0000 Subject: [PATCH] fix(settings): recreate entry scroll-reset timer after one-shot delete MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The one-shot LVGL timer's callback deleted the timer but left _entry_scroll_reset_timer dangling. On the 2nd+ screen entry show() took the 'else' path and called lv_timer_reset() on freed memory, so the view was never reset to the top — it stayed wherever the group re-focus had auto-scrolled it (the bottom). Null the pointer before lv_timer_del so each entry recreates a fresh timer. --- lib/tdeck_ui/UI/LXMF/SettingsScreen.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/tdeck_ui/UI/LXMF/SettingsScreen.cpp b/lib/tdeck_ui/UI/LXMF/SettingsScreen.cpp index 02d3a72e..ea4f616b 100644 --- a/lib/tdeck_ui/UI/LXMF/SettingsScreen.cpp +++ b/lib/tdeck_ui/UI/LXMF/SettingsScreen.cpp @@ -1410,6 +1410,10 @@ void SettingsScreen::set_status_callback(StatusScreenCallback callback) { } void SettingsScreen::entry_scroll_reset_cb(lv_timer_t* timer) { + // One-shot: null the owning pointer BEFORE deleting so the next show() + // recreates the timer. (Skipping the null-out leaves a dangling pointer + // and lv_timer_reset() on freed memory — no reset on the 2nd+ entry.) + _entry_scroll_reset_timer = nullptr; lv_timer_del(timer); SettingsScreen* screen = g_settings_entry_reset; g_settings_entry_reset = nullptr;