* include/grub/menu_viewer.h (grub_menu_viewer_init): New prototype.

(grub_menu_viewer_should_return): Likewise.
	* normal/main.c (GRUB_MOD_INIT (normal)): Call grub_menu_viewer_init.
	* normal/menu_text.c (run_menu): Enable menu switching.
	* normal/menu_viewer.c (should_return): New variable.
	(menu_viewer_changed): Likewise.
	(grub_menu_viewer_show_menu): Handle menu viewer changes.
	(grub_menu_viewer_should_return): New function.
	(menuviewer_write_hook): Likewise.
	(grub_menu_viewer_init): Likewise.
This commit is contained in:
Colin D Bennett 2009-11-20 14:51:01 +01:00 committed by Vladimir 'phcoder' Serbinenko
parent ac3b7128d6
commit cbf97a87d9
5 changed files with 58 additions and 5 deletions

View file

@ -26,6 +26,9 @@
/* The list of menu viewers. */
static grub_menu_viewer_t menu_viewer_list;
static int should_return;
static int menu_viewer_changed;
void
grub_menu_viewer_register (grub_menu_viewer_t viewer)
{
@ -55,16 +58,23 @@ static grub_menu_viewer_t get_current_menu_viewer (void)
grub_err_t
grub_menu_viewer_show_menu (grub_menu_t menu, int nested)
{
grub_menu_viewer_t cur = get_current_menu_viewer ();
grub_err_t err1, err2;
if (!cur)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "No menu viewer available.");
while (1)
{
grub_menu_viewer_t cur = get_current_menu_viewer ();
if (!cur)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "No menu viewer available.");
menu_viewer_changed = 0;
should_return = 0;
err1 = cur->show_menu (menu, nested);
grub_print_error ();
if (menu_viewer_changed)
continue;
err2 = grub_auth_check_authentication (NULL);
if (err2)
{
@ -79,3 +89,24 @@ grub_menu_viewer_show_menu (grub_menu_t menu, int nested)
return err1;
}
int
grub_menu_viewer_should_return (void)
{
return should_return;
}
static char *
menuviewer_write_hook (struct grub_env_var *var __attribute__ ((unused)),
const char *val)
{
menu_viewer_changed = 1;
should_return = 1;
return grub_strdup (val);
}
void
grub_menu_viewer_init (void)
{
grub_register_variable_hook ("menuviewer", 0, menuviewer_write_hook);
}