From 311d048f6f265f8a2d5dcd4050c0da32bfa05f68 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Sat, 5 Jul 2008 12:31:04 +0000 Subject: fix FS#9144 hopefully for good... only update the screen if the time line is selected, or if talking menus are disabled, only update if the time line is actually on the screen. Also only update every 5s so scrolling lines still scroll. (turns out scroll_all was broken! fixed now) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17944 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/bitmap/list.c | 10 ++++++++-- apps/gui/list.c | 11 +++++++++++ apps/gui/list.h | 2 ++ apps/menus/main_menu.c | 34 ++++++++++++++++++++++------------ 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/apps/gui/bitmap/list.c b/apps/gui/bitmap/list.c index 4aaecc7eab..5a8bc69450 100644 --- a/apps/gui/bitmap/list.c +++ b/apps/gui/bitmap/list.c @@ -250,8 +250,14 @@ void list_draw(struct screen *display, struct viewport *parent, } } else - display->puts_style_offset(0, i-start, entry_name, - list_text[display->screen_type].drawmode, item_offset); + { + if (list->scroll_all) + display->puts_scroll_style_offset(0, i-start, entry_name, + list_text[display->screen_type].drawmode, item_offset); + else + display->puts_style_offset(0, i-start, entry_name, + list_text[display->screen_type].drawmode, item_offset); + } /* do the icon */ if (list->callback_get_item_icon && global_settings.show_icons) { diff --git a/apps/gui/list.c b/apps/gui/list.c index 96652ce0a9..ee50ccf63e 100644 --- a/apps/gui/list.c +++ b/apps/gui/list.c @@ -786,6 +786,17 @@ bool list_do_action(int context, int timeout, return gui_synclist_do_button(lists, action, wrap); } +bool gui_synclist_item_is_onscreen(struct gui_synclist *lists, + enum screen_type screen, int item) +{ + struct viewport vp = *lists->parent[screen]; +#ifdef HAVE_LCD_BITMAP + if (list_display_title(lists, lists->parent[screen])) + vp.height -= list_title_height(lists, lists->parent[screen]); +#endif + return item <= (lists->start_item[screen] + viewport_get_nb_lines(&vp)); +} + /* Simple use list implementation */ static int simplelist_line_count = 0; static char simplelist_text[SIMPLELIST_MAX_LINES][SIMPLELIST_MAX_LINELENGTH]; diff --git a/apps/gui/list.h b/apps/gui/list.h index e2d7a518e4..8db9c24d48 100644 --- a/apps/gui/list.h +++ b/apps/gui/list.h @@ -171,6 +171,8 @@ extern void gui_synclist_set_title(struct gui_synclist * lists, char * title, int icon); extern void gui_synclist_hide_selection_marker(struct gui_synclist *lists, bool hide); +extern bool gui_synclist_item_is_onscreen(struct gui_synclist *lists, + enum screen_type screen, int item); /* * Do the action implied by the given button, * returns true if the action was handled. diff --git a/apps/menus/main_menu.c b/apps/menus/main_menu.c index 985efc2580..614f5a6c34 100644 --- a/apps/menus/main_menu.c +++ b/apps/menus/main_menu.c @@ -291,6 +291,7 @@ static int info_speak_item(int selected_item, void * data) #if CONFIG_RTC struct tm *tm; + static int last_talk = 0; #endif switch (selected_item) @@ -313,14 +314,18 @@ static int info_speak_item(int selected_item, void * data) } break; case INFO_DATE: - tm = get_time(); - if (valid_time(tm)) - { - talk_date(get_time(), true); - } - else + if (TIME_AFTER(current_tick, last_talk + HZ*60)) { - talk_id(LANG_UNKNOWN, true); + tm = get_time(); + if (valid_time(tm)) + { + talk_date(get_time(), true); + } + else + { + talk_id(LANG_UNKNOWN, true); + } + last_talk = current_tick; } break; #endif @@ -417,13 +422,18 @@ static int info_action_callback(int action, struct gui_synclist *lists) return ACTION_REDRAW; } #if CONFIG_RTC - else if (action == ACTION_NONE && lists->selected_item == INFO_TIME) + else if (action == ACTION_NONE) { - static int last_redraw = 0; - if (TIME_AFTER(current_tick, last_redraw + HZ/2)) + if ((global_settings.talk_menu && lists->selected_item == INFO_TIME) || + (!global_settings.talk_menu && + gui_synclist_item_is_onscreen(lists, 0, INFO_TIME))) { - last_redraw = current_tick; - return ACTION_REDRAW; + static int last_redraw = 0; + if (TIME_AFTER(current_tick, last_redraw + HZ*5)) + { + last_redraw = current_tick; + return ACTION_REDRAW; + } } } #endif -- cgit v1.2.3