]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* include/grub/menu_viewer.h (grub_menu_viewer_init): New prototype.
authorColin D Bennett <colin@gibibit.com>
Fri, 20 Nov 2009 13:51:01 +0000 (14:51 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 20 Nov 2009 13:51:01 +0000 (14:51 +0100)
(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.

ChangeLog.menu
include/grub/menu_viewer.h
normal/main.c
normal/menu_text.c
normal/menu_viewer.c

index cb048bc9fd9c6ad38dea4d4e2ff0d9c5d5109c66..32c0a85d5f616dae4c43fb3a0ffb213772c9742d 100644 (file)
@@ -6,4 +6,14 @@
        New prototype.
        * normal/menu.c (grub_menu_get_default_entry_index): New function.
        * normal/menu_text.c (run_menu): Use grub_menu_get_default_entry_index.
+       * 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.
 
index 725c975488f79142f365eb958d3453eb56aa8e4d..211f6e3e922c0441f31eee93c429fbe65b10a020 100644 (file)
@@ -36,8 +36,13 @@ struct grub_menu_viewer
 };
 typedef struct grub_menu_viewer *grub_menu_viewer_t;
 
+void grub_menu_viewer_init (void);
+
 void grub_menu_viewer_register (grub_menu_viewer_t viewer);
 
 grub_err_t grub_menu_viewer_show_menu (grub_menu_t menu, int nested);
 
+/* Return nonzero iff the menu viewer should clean up and return ASAP.  */
+int grub_menu_viewer_should_return (void);
+
 #endif /* GRUB_MENU_VIEWER_HEADER */
index 748eef80534114ed1249a47be90c55e1d6c54742..736c20e4777991ad5696283c8fba9458e8b24dd0 100644 (file)
@@ -584,6 +584,8 @@ GRUB_MOD_INIT(normal)
   /* Preserve hooks after context changes.  */
   grub_env_export ("color_normal");
   grub_env_export ("color_highlight");
+
+  grub_menu_viewer_init ();
 }
 
 GRUB_MOD_FINI(normal)
index d02230a8f3751d1476e01bb5b85688cea1965f44..68c7afeee9343377d8d892d28f5b5a1beaa3f11f 100644 (file)
@@ -300,7 +300,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
   if (timeout > 0)
     print_timeout (timeout, offset, 0);
 
-  while (1)
+  while (! grub_menu_viewer_should_return ())
     {
       int c;
       timeout = grub_menu_get_timeout ();
@@ -473,6 +473,10 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
                }
              goto refresh;
 
+           case 't':
+             grub_env_set ("menuviewer", "gfxmenu");
+             goto refresh;
+
            default:
              break;
            }
@@ -481,7 +485,8 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
        }
     }
 
-  /* Never reach here.  */
+  /* Exit menu without activating an item.  This occurs if the user presses
+   * 't', switching to the graphical menu viewer.  */
   return -1;
 }
 
index 1bd271a212e574decffdac1bd9e9b737bcae900b..7a547a764b8fd7a95f9dea9837277e35b381577e 100644 (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);
+}
+