2010-03-01 Vladimir Serbinenko <phcoder@gmail.com>

Wait for user entry basing on presence of output rather than on errors.

	* include/grub/normal.h (grub_normal_get_line_counter): New proto.
	(grub_install_newline_hook): Likewise.
	* normal/main.c (GRUB_MOD_INIT): Call grub_install_newline_hook.
	* normal/menu.c (show_menu): Check line_counter to determine presence
	of output.
	* normal/term.c (grub_normal_line_counter): New variable.
	(grub_normal_get_line_counter): New function.
	(grub_install_newline_hook): Likewise.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-03-01 20:58:45 +01:00
parent 5382b1e4a8
commit c6f2fe52f1
5 changed files with 38 additions and 7 deletions

View file

@ -1,3 +1,16 @@
2010-03-01 Vladimir Serbinenko <phcoder@gmail.com>
Wait for user entry basing on presence of output rather than on errors.
* include/grub/normal.h (grub_normal_get_line_counter): New proto.
(grub_install_newline_hook): Likewise.
* normal/main.c (GRUB_MOD_INIT): Call grub_install_newline_hook.
* normal/menu.c (show_menu): Check line_counter to determine presence
of output.
* normal/term.c (grub_normal_line_counter): New variable.
(grub_normal_get_line_counter): New function.
(grub_install_newline_hook): Likewise.
2010-03-01 Vladimir Serbinenko <phcoder@gmail.com>
* commands/cat.c (grub_cmd_cat): Propagate grub_gzfile_open error.

View file

@ -110,4 +110,7 @@ void read_terminal_list (void);
void grub_set_more (int onoff);
int grub_normal_get_line_counter (void);
void grub_install_newline_hook (void);
#endif /* ! GRUB_NORMAL_HEADER */

View file

@ -654,6 +654,7 @@ GRUB_MOD_INIT(normal)
grub_set_history (GRUB_DEFAULT_HISTORY_SIZE);
grub_install_newline_hook ();
grub_register_variable_hook ("pager", 0, grub_env_write_pager);
/* Register a command "normal" for the rescue mode. */

View file

@ -559,14 +559,14 @@ show_menu (grub_menu_t menu, int nested)
}
else
{
int lines_before = grub_normal_get_line_counter ();
grub_errno = GRUB_ERR_NONE;
grub_menu_execute_entry (e);
if (grub_errno != GRUB_ERR_NONE)
{
grub_print_error ();
grub_errno = GRUB_ERR_NONE;
grub_wait_after_message ();
}
grub_print_error ();
grub_errno = GRUB_ERR_NONE;
if (lines_before != grub_normal_get_line_counter ())
grub_wait_after_message ();
}
}

View file

@ -30,6 +30,14 @@ static unsigned grub_more_lines;
/* If the more pager is active. */
static int grub_more;
static int grub_normal_line_counter = 0;
int
grub_normal_get_line_counter (void)
{
return grub_normal_line_counter;
}
static void
process_newline (void)
{
@ -41,6 +49,8 @@ process_newline (void)
height = grub_term_height (cur);
grub_more_lines++;
grub_normal_line_counter++;
if (grub_more && grub_more_lines >= height - 1)
{
char key;
@ -76,6 +86,11 @@ grub_set_more (int onoff)
grub_more--;
grub_more_lines = 0;
}
void
grub_install_newline_hook (void)
{
grub_newline_hook = process_newline;
}
@ -150,7 +165,6 @@ grub_terminal_autoload_free (void)
grub_term_output_autoload = NULL;
}
/* Read the file terminal.lst for auto-loading. */
void
read_terminal_list (void)