summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/gui/list.c15
-rw-r--r--apps/gui/list.h2
2 files changed, 12 insertions, 5 deletions
diff --git a/apps/gui/list.c b/apps/gui/list.c
index fbcdcb28c9..7fe06f9aad 100644
--- a/apps/gui/list.c
+++ b/apps/gui/list.c
@@ -58,17 +58,18 @@ static void gui_list_select_at_offset(struct gui_synclist * gui_list,
58void list_draw(struct screen *display, struct gui_synclist *list); 58void list_draw(struct screen *display, struct gui_synclist *list);
59 59
60#ifdef HAVE_LCD_BITMAP 60#ifdef HAVE_LCD_BITMAP
61static int list_need_reinit = false; 61static long last_dirty_tick;
62static struct viewport parent[NB_SCREENS]; 62static struct viewport parent[NB_SCREENS];
63 63
64static void list_force_reinit(void *param) 64static void list_force_reinit(void *param)
65{ 65{
66 (void)param; 66 (void)param;
67 list_need_reinit = true; 67 last_dirty_tick = current_tick;
68} 68}
69 69
70void list_init(void) 70void list_init(void)
71{ 71{
72 last_dirty_tick = current_tick;
72 add_event(GUI_EVENT_THEME_CHANGED, false, list_force_reinit); 73 add_event(GUI_EVENT_THEME_CHANGED, false, list_force_reinit);
73} 74}
74 75
@@ -93,7 +94,7 @@ static void list_init_viewports(struct gui_synclist *list)
93#endif 94#endif
94 } 95 }
95 } 96 }
96 list_need_reinit = false; 97 list->dirty_tick = false;
97} 98}
98#else 99#else
99static struct viewport parent[NB_SCREENS] = 100static struct viewport parent[NB_SCREENS] =
@@ -178,6 +179,7 @@ void gui_synclist_init(struct gui_synclist * gui_list,
178 gui_list->title_icon = Icon_NOICON; 179 gui_list->title_icon = Icon_NOICON;
179 180
180 gui_list->scheduled_talk_tick = gui_list->last_talked_tick = 0; 181 gui_list->scheduled_talk_tick = gui_list->last_talked_tick = 0;
182 gui_list->dirty_tick = current_tick;
181 gui_list->show_selection_marker = true; 183 gui_list->show_selection_marker = true;
182 184
183#ifdef HAVE_LCD_COLOR 185#ifdef HAVE_LCD_COLOR
@@ -227,6 +229,11 @@ int gui_list_get_item_offset(struct gui_synclist * gui_list,
227} 229}
228#endif 230#endif
229 231
232static bool is_dirty(struct gui_synclist *list)
233{
234 return TIME_BEFORE(list->dirty_tick, last_dirty_tick);
235}
236
230/* 237/*
231 * Force a full screen update. 238 * Force a full screen update.
232 */ 239 */
@@ -234,7 +241,7 @@ void gui_synclist_draw(struct gui_synclist *gui_list)
234{ 241{
235 int i; 242 int i;
236#ifdef HAVE_LCD_BITMAP 243#ifdef HAVE_LCD_BITMAP
237 if (list_need_reinit) 244 if (is_dirty(gui_list))
238 { 245 {
239 list_init_viewports(gui_list); 246 list_init_viewports(gui_list);
240 gui_synclist_select_item(gui_list, gui_list->selected_item); 247 gui_synclist_select_item(gui_list, gui_list->selected_item);
diff --git a/apps/gui/list.h b/apps/gui/list.h
index d40cfe9966..636d36c318 100644
--- a/apps/gui/list.h
+++ b/apps/gui/list.h
@@ -103,7 +103,7 @@ struct gui_synclist
103#ifdef HAVE_LCD_BITMAP 103#ifdef HAVE_LCD_BITMAP
104 int offset_position[NB_SCREENS]; /* the list's screen scroll placement in pixels */ 104 int offset_position[NB_SCREENS]; /* the list's screen scroll placement in pixels */
105#endif 105#endif
106 long scheduled_talk_tick, last_talked_tick; 106 long scheduled_talk_tick, last_talked_tick, dirty_tick;
107 107
108 list_get_icon *callback_get_item_icon; 108 list_get_icon *callback_get_item_icon;
109 list_get_name *callback_get_item_name; 109 list_get_name *callback_get_item_name;