list: fix GUI_EVENT_THEME_CHANGED timing issue

rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]> Mon, 4 May 2026 08:01:55 -0400
Newsgroups gmane.comp.systems.archos.rockbox.cvs
Message-ID <[email protected]>
commit 89d24f3bd44994bcbcab8dbb1965a3e832e7f781
Author: Christian Soffke <[email protected]>
Date:   Mon May 4 03:07:32 2026 +0200

    list: fix GUI_EVENT_THEME_CHANGED timing issue
    
    Initialize a list's dirty_tick to last_dirty_tick instead of to the
    current tick.
    
    Issue probably only affects the sim:
    
    To force a list to reinitialize using the GUI_EVENT_THEME_CHANGED
    event, last_dirty_tick is set to the current tick.
    
    list_is_dirty() checks whether the list viewport needs to be
    re-initialized by comparing the list's dirty tick to last_dirty_tick,
    and seeing if time has passed.
    
    In some scenarios though, the list's vp may be initialized, become
    immediately dirty, and list_is_dirty is called, all in the same tick.
    
    Change-Id: Ia379117a07bbaf545e0a16d35e74888955893441

diff --git a/apps/gui/list.c b/apps/gui/list.c
index 9bbe09f325..f5f02f2cb8 100644
--- a/apps/gui/list.c
+++ b/apps/gui/list.c
@@ -59,17 +59,17 @@ static bool list_is_dirty(struct gui_synclist *list)
     return TIME_BEFORE(list->dirty_tick, last_dirty_tick);
 }
 
-static void list_force_reinit(unsigned short id, void *param, void *last_dirty_tick)
+static void list_force_reinit(unsigned short id, void *param)
 {
     (void)id;
     (void)param;
-    *(int *)last_dirty_tick = current_tick;
+    last_dirty_tick = current_tick;
 }
 
 void list_init(void)
 {
     last_dirty_tick = current_tick;
-    add_event_ex(GUI_EVENT_THEME_CHANGED, false, list_force_reinit, &last_dirty_tick);
+    add_event(GUI_EVENT_THEME_CHANGED, list_force_reinit);
 }
 
 static void list_init_viewports(struct gui_synclist *list)
@@ -83,7 +83,7 @@ static void list_init_viewports(struct gui_synclist *list)
             gui_synclist_set_viewport_defaults(list->parent[i], i);
         }
     }
-    list->dirty_tick = current_tick;
+    list->dirty_tick = last_dirty_tick;
 }
 
 static int list_nb_lines(struct gui_synclist *list, enum screen_type screen)
@@ -187,7 +187,6 @@ void gui_synclist_init(struct gui_synclist * gui_list,
     gui_list->title_icon = Icon_NOICON;
 
     gui_list->scheduled_talk_tick = gui_list->last_talked_tick = 0;
-    gui_list->dirty_tick = current_tick;
 
 #ifdef HAVE_LCD_COLOR
     gui_list->title_color = -1;
-- 
rockbox-cvs mailing list
[email protected]
https://lists.haxx.se/mailman/listinfo/rockbox-cvs