diff --git a/grub-core/gfxmenu/gfxmenu.c b/grub-core/gfxmenu/gfxmenu.c index e6d4176b1..c90e6e016 100644 --- a/grub-core/gfxmenu/gfxmenu.c +++ b/grub-core/gfxmenu/gfxmenu.c @@ -123,6 +123,7 @@ grub_gfxmenu_try (int entry, grub_menu_t menu, int nested) instance->fini = grub_gfxmenu_viewer_fini; instance->print_timeout = grub_gfxmenu_print_timeout; instance->clear_timeout = grub_gfxmenu_clear_timeout; + instance->print_time = grub_gfxmenu_print_time; grub_menu_register_viewer (instance); diff --git a/grub-core/gfxmenu/view.c b/grub-core/gfxmenu/view.c index 2509e8932..43eb9850e 100644 --- a/grub-core/gfxmenu/view.c +++ b/grub-core/gfxmenu/view.c @@ -264,9 +264,12 @@ update_menu_visit (grub_gui_component_t component, struct grub_gfxmenu_time_notify * grub_gfxmenu_time_notification; -static void redraw_time(struct grub_gfxmenu_view *view) +static void redraw_time(grub_gfxmenu_view_t view) { struct grub_gfxmenu_time_notify* cur = grub_gfxmenu_time_notification; + if(!cur) + return; + cur->set_state(cur->self, 1, 0, 0, 0); grub_gui_label_t self = (grub_gui_label_t)cur->self; struct grub_datetime datetime; @@ -276,13 +279,23 @@ static void redraw_time(struct grub_gfxmenu_view *view) datetime.year, datetime.month, datetime.day, datetime.hour, datetime.minute, datetime.second, grub_get_weekday_name(&datetime)); + grub_video_rect_t before_bounds; + cur->self->ops->get_bounds (cur->self, &before_bounds); + grub_gfxmenu_view_redraw(view, &before_bounds); + + grub_free(self->text); + self->text = (char*)" "; + grub_gfxmenu_view_redraw(view, &before_bounds); + self->text = valtmp; - grub_video_rect_t bounds; - cur->self->ops->get_bounds (cur->self, &bounds); - grub_video_set_area_status (GRUB_VIDEO_AREA_ENABLED); - grub_gfxmenu_view_redraw (view, &bounds); + + grub_gfxmenu_view_redraw(view, &before_bounds); } + +void grub_gfxmenu_print_time(grub_gfxmenu_view_t view) { + redraw_time(view); +} /* Update any boot menu components with the current menu model and theme path. */ static void @@ -392,7 +405,6 @@ grub_gfxmenu_view_draw (grub_gfxmenu_view_t view) grub_video_set_area_status (GRUB_VIDEO_AREA_DISABLED); grub_gfxmenu_view_redraw (view, &view->screen); } - redraw_time(view); } static void diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c index b946c834d..415c727e5 100644 --- a/grub-core/normal/menu.c +++ b/grub-core/normal/menu.c @@ -384,6 +384,14 @@ menu_print_timeout (int timeout) cur->print_timeout (timeout, cur->data); } +static void +menu_print_time(void) { + struct grub_menu_viewer *cur; + for (cur = viewers; cur; cur = cur->next) + if(cur->print_time) + cur->print_time (cur->data); +} + static void menu_fini (void) { @@ -668,7 +676,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot, int *notify_boot) /* Initialize the time. */ saved_time = grub_get_time_ms (); - + menu_print_time(); timeout = grub_menu_get_timeout (); if (timeout > 0) @@ -676,9 +684,14 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot, int *notify_boot) else clear_timeout (); + grub_uint64_t time_saved_time = saved_time; while (1) { + int c; + if(has_second_elapsed (&time_saved_time)) { + menu_print_time(); + } timeout = grub_menu_get_timeout (); if (grub_normal_exit_level) diff --git a/grub-core/normal/menu_text.c b/grub-core/normal/menu_text.c index 9c383e64a..69e6c65ed 100644 --- a/grub-core/normal/menu_text.c +++ b/grub-core/normal/menu_text.c @@ -582,6 +582,7 @@ grub_menu_try_text (struct grub_term_output *term, instance->print_timeout = menu_text_print_timeout; instance->clear_timeout = menu_text_clear_timeout; instance->fini = menu_text_fini; + instance->print_time = NULL; data->menu = menu; diff --git a/include/grub/gfxmenu_view.h b/include/grub/gfxmenu_view.h index c9e12db82..471fe39c4 100644 --- a/include/grub/gfxmenu_view.h +++ b/include/grub/gfxmenu_view.h @@ -57,6 +57,10 @@ grub_gfxmenu_view_redraw (grub_gfxmenu_view_t view, void grub_gfxmenu_clear_timeout (void *data); +void +grub_gfxmenu_print_time(grub_gfxmenu_view_t view); + + void grub_gfxmenu_print_timeout (int timeout, void *data); void diff --git a/include/grub/menu_viewer.h b/include/grub/menu_viewer.h index 604c07ad1..a82e5c96f 100644 --- a/include/grub/menu_viewer.h +++ b/include/grub/menu_viewer.h @@ -24,6 +24,7 @@ #include #include #include +#include #include struct grub_menu_viewer @@ -33,6 +34,7 @@ struct grub_menu_viewer void (*set_chosen_entry) (int entry, void *data); void (*print_timeout) (int timeout, void *data); void (*clear_timeout) (void *data); + void (*print_time) (grub_gfxmenu_view_t view); void (*fini) (void *fini); };