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