summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/gui/bitmap/list.c10
-rw-r--r--apps/gui/list.c11
-rw-r--r--apps/gui/list.h2
-rw-r--r--apps/menus/main_menu.c34
4 files changed, 43 insertions, 14 deletions
diff --git a/apps/gui/bitmap/list.c b/apps/gui/bitmap/list.c
index 4aaecc7..5a8bc69 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 96652ce..ee50ccf 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 e2d7a51..8db9c24 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 985efc2..614f5a6 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