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
This commit is contained in:
Christian Soffke 2026-05-04 03:07:32 +02:00
parent 02638c1cb8
commit 89d24f3bd4

View file

@ -59,17 +59,17 @@ static bool list_is_dirty(struct gui_synclist *list)
return TIME_BEFORE(list->dirty_tick, last_dirty_tick); 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)id;
(void)param; (void)param;
*(int *)last_dirty_tick = current_tick; last_dirty_tick = current_tick;
} }
void list_init(void) void list_init(void)
{ {
last_dirty_tick = current_tick; 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) 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); 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) 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->title_icon = Icon_NOICON;
gui_list->scheduled_talk_tick = gui_list->last_talked_tick = 0; gui_list->scheduled_talk_tick = gui_list->last_talked_tick = 0;
gui_list->dirty_tick = current_tick;
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
gui_list->title_color = -1; gui_list->title_color = -1;