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)) + if (TIME_AFTER(current_tick, last_talk + HZ*60)) { - talk_date(get_time(), true); - } - else - { - 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