From 38c259a76a6c40f5d2983c8e542edd79ea08e4d8 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Mon, 20 Sep 2010 17:46:35 +0200 Subject: [PATCH] Pause the execution (10s max) if any errors are displayed so the user has a chance to see them. * grub-core/kern/err.c (grub_err_printed_errors): New variable. (grub_print_error): Increment grub_err_printed_errors. * grub-core/normal/menu.c (grub_menu_execute_entry): Pause the execution if any errors were displayed. (show_menu): Remove old code for pause. * grub-core/normal/menu_entry.c (run): Likewise. * grub-core/normal/term.c (grub_normal_char_counter): Removed. All users updated. (grub_normal_get_char_counter): Likewise. * include/grub/err.h (grub_err_printed_errors): New external variable. * include/grub/normal.h (grub_normal_get_char_counter): Removed. --- ChangeLog | 17 +++++++++++++++++ grub-core/kern/err.c | 6 +++++- grub-core/normal/menu.c | 21 ++++++++------------- grub-core/normal/menu_entry.c | 13 ++++++------- grub-core/normal/term.c | 10 ---------- include/grub/err.h | 1 + include/grub/normal.h | 1 - 7 files changed, 37 insertions(+), 32 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6d503edf1..3b70597a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2010-09-20 Vladimir Serbinenko + + Pause the execution (10s max) if any errors are displayed so the user + has a chance to see them. + + * grub-core/kern/err.c (grub_err_printed_errors): New variable. + (grub_print_error): Increment grub_err_printed_errors. + * grub-core/normal/menu.c (grub_menu_execute_entry): Pause the + execution if any errors were displayed. + (show_menu): Remove old code for pause. + * grub-core/normal/menu_entry.c (run): Likewise. + * grub-core/normal/term.c (grub_normal_char_counter): Removed. All + users updated. + (grub_normal_get_char_counter): Likewise. + * include/grub/err.h (grub_err_printed_errors): New external variable. + * include/grub/normal.h (grub_normal_get_char_counter): Removed. + 2010-09-20 Vladimir Serbinenko Support multiboot VBE info. diff --git a/grub-core/kern/err.c b/grub-core/kern/err.c index 8272467f5..74f3915aa 100644 --- a/grub-core/kern/err.c +++ b/grub-core/kern/err.c @@ -27,6 +27,7 @@ grub_err_t grub_errno; char grub_errmsg[GRUB_MAX_ERRMSG]; +int grub_err_printed_errors; static struct { @@ -122,7 +123,10 @@ grub_print_error (void) do { if (grub_errno != GRUB_ERR_NONE) - grub_err_printf (_("error: %s.\n"), grub_errmsg); + { + grub_err_printf (_("error: %s.\n"), grub_errmsg); + grub_err_printed_errors++; + } } while (grub_error_pop ()); diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c index 62b0d0a6a..9c0a2182f 100644 --- a/grub-core/normal/menu.c +++ b/grub-core/normal/menu.c @@ -158,6 +158,7 @@ void grub_menu_execute_entry(grub_menu_entry_t entry) { grub_err_t err = GRUB_ERR_NONE; + int errs_before; if (entry->restricted) err = grub_auth_check_authentication (entry->users); @@ -169,9 +170,14 @@ grub_menu_execute_entry(grub_menu_entry_t entry) return; } + errs_before = grub_err_printed_errors; + grub_env_set ("chosen", entry->title); grub_script_execute_sourcecode (entry->sourcecode, entry->argc, entry->args); + if (errs_before != grub_err_printed_errors) + grub_wait_after_message (); + if (grub_errno == GRUB_ERR_NONE && grub_loader_is_loaded ()) /* Implicit execution of boot, only if something is loaded. */ grub_command_execute ("boot", 0, 0); @@ -583,20 +589,9 @@ show_menu (grub_menu_t menu, int nested) grub_cls (); if (auto_boot) - { - grub_menu_execute_with_fallback (menu, e, &execution_callback, 0); - } + grub_menu_execute_with_fallback (menu, e, &execution_callback, 0); else - { - int chars_before = grub_normal_get_char_counter (); - grub_errno = GRUB_ERR_NONE; - grub_menu_execute_entry (e); - grub_print_error (); - grub_errno = GRUB_ERR_NONE; - - if (chars_before != grub_normal_get_char_counter ()) - grub_wait_after_message (); - } + grub_menu_execute_entry (e); } return GRUB_ERR_NONE; diff --git a/grub-core/normal/menu_entry.c b/grub-core/normal/menu_entry.c index 87292d445..82506fa6f 100644 --- a/grub-core/normal/menu_entry.c +++ b/grub-core/normal/menu_entry.c @@ -1161,6 +1161,7 @@ run (struct screen *screen) { int currline = 0; char *nextline; + int errs_before; auto grub_err_t editor_getline (char **line, int cont); grub_err_t editor_getline (char **line, int cont __attribute__ ((unused))) @@ -1194,6 +1195,7 @@ run (struct screen *screen) grub_printf_ (N_("Booting a command list")); grub_printf ("\n\n"); + errs_before = grub_err_printed_errors; /* Execute the script, line for line. */ while (currline < screen->num_lines) @@ -1203,6 +1205,9 @@ run (struct screen *screen) break; } + if (errs_before != grub_err_printed_errors) + grub_wait_after_message (); + if (grub_errno == GRUB_ERR_NONE && grub_loader_is_loaded ()) /* Implicit execution of boot, only if something is loaded. */ grub_command_execute ("boot", 0, 0); @@ -1382,13 +1387,7 @@ grub_menu_entry_run (grub_menu_entry_t entry) case GRUB_TERM_CTRL | 'x': case GRUB_TERM_KEY_F10: - { - int chars_before = grub_normal_get_char_counter (); - run (screen); - - if (chars_before != grub_normal_get_char_counter ()) - grub_wait_after_message (); - } + run (screen); goto refresh; case GRUB_TERM_CTRL | 'r': diff --git a/grub-core/normal/term.c b/grub-core/normal/term.c index 760900e86..fe6240eb0 100644 --- a/grub-core/normal/term.c +++ b/grub-core/normal/term.c @@ -42,17 +42,9 @@ static struct term_state *term_states = NULL; /* If the more pager is active. */ static int grub_more; -static int grub_normal_char_counter = 0; - static void putcode_real (grub_uint32_t code, struct grub_term_output *term); -int -grub_normal_get_char_counter (void) -{ - return grub_normal_char_counter; -} - void grub_normal_reset_more (void) { @@ -409,8 +401,6 @@ putglyph (const struct grub_unicode_glyph *c, struct grub_term_output *term) .estimated_width = 1 }; - grub_normal_char_counter++; - if (c->base == '\t' && term->getxy) { int n; diff --git a/include/grub/err.h b/include/grub/err.h index d35bba474..e532e19e2 100644 --- a/include/grub/err.h +++ b/include/grub/err.h @@ -66,6 +66,7 @@ void EXPORT_FUNC(grub_fatal) (const char *fmt, ...) __attribute__ ((noreturn)); void EXPORT_FUNC(grub_error_push) (void); int EXPORT_FUNC(grub_error_pop) (void); void EXPORT_FUNC(grub_print_error) (void); +extern int EXPORT_VAR(grub_err_printed_errors); int grub_err_printf (const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); diff --git a/include/grub/normal.h b/include/grub/normal.h index 72912e524..a3827f584 100644 --- a/include/grub/normal.h +++ b/include/grub/normal.h @@ -110,7 +110,6 @@ void read_terminal_list (const char *prefix); void grub_set_more (int onoff); -int grub_normal_get_char_counter (void); void grub_normal_reset_more (void); void grub_xputs_normal (const char *str);