diff options
author | Thomas Martitz <kugel@rockbox.org> | 2011-10-07 17:22:49 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2011-10-07 17:22:49 +0000 |
commit | 0acdc87df4e97a1274a10d97fcbacf5696065cee (patch) | |
tree | 8bb0cc2d87d6104abf9d7a00129813a12005c2ba | |
parent | 40529dd0699ef28200380b89e1e758d69fe5fe94 (diff) | |
download | rockbox-0acdc87df4e97a1274a10d97fcbacf5696065cee.tar.gz rockbox-0acdc87df4e97a1274a10d97fcbacf5696065cee.zip |
lists: Detect dirtyness (need to reinit) for each list, instead of once globally.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30721 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/gui/list.c | 15 | ||||
-rw-r--r-- | apps/gui/list.h | 2 |
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, | |||
58 | void list_draw(struct screen *display, struct gui_synclist *list); | 58 | void list_draw(struct screen *display, struct gui_synclist *list); |
59 | 59 | ||
60 | #ifdef HAVE_LCD_BITMAP | 60 | #ifdef HAVE_LCD_BITMAP |
61 | static int list_need_reinit = false; | 61 | static long last_dirty_tick; |
62 | static struct viewport parent[NB_SCREENS]; | 62 | static struct viewport parent[NB_SCREENS]; |
63 | 63 | ||
64 | static void list_force_reinit(void *param) | 64 | static 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 | ||
70 | void list_init(void) | 70 | void 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 |
99 | static struct viewport parent[NB_SCREENS] = | 100 | static 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 | ||
232 | static 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; |