=== modified file 'grub-core/commands/sleep.c'
--- a/grub-core/commands/sleep.c	2013-07-11 14:02:22 +0000
+++ b/grub-core/commands/sleep.c	2013-10-01 08:18:24 +0000
@@ -24,6 +24,7 @@
 #include <grub/misc.h>
 #include <grub/extcmd.h>
 #include <grub/i18n.h>
+#include <grub/env.h>
 
 GRUB_MOD_LICENSE ("GPLv3+");
 
@@ -46,18 +47,56 @@
   grub_refresh ();
 }
 
+static int
+grub_check_hotkey(int hotkey)
+{
+  switch (hotkey)
+    {
+    case GRUB_TERM_KEY_F1:
+    case GRUB_TERM_KEY_F2:
+    case GRUB_TERM_KEY_F3:
+    case GRUB_TERM_KEY_F4:
+    case GRUB_TERM_KEY_F5:
+    case GRUB_TERM_KEY_F6:
+    case GRUB_TERM_KEY_F7:
+    case GRUB_TERM_KEY_F8:
+    case GRUB_TERM_KEY_F9:
+    case GRUB_TERM_KEY_F10:
+    case GRUB_TERM_KEY_F11:
+    case GRUB_TERM_KEY_F12:
+    case GRUB_TERM_KEY_DC:
+    case GRUB_TERM_BACKSPACE:
+    case GRUB_TERM_TAB:
+      return 1;
+    }
+
+  return 0;
+}
+
 /* Based on grub_millisleep() from kern/generic/millisleep.c.  */
 static int
 grub_interruptible_millisleep (grub_uint32_t ms)
 {
   grub_uint64_t start;
+  int key = 0;
 
   start = grub_get_time_ms ();
 
   while (grub_get_time_ms () - start < ms)
-    if (grub_getkey_noblock () == GRUB_TERM_ESC)
-      return 1;
+    {
+      key = grub_getkey_noblock ();
+      if (key == GRUB_TERM_ESC)
+	return 1;
 
+      if (grub_check_hotkey(key))
+	{
+	  char *hotkey = grub_xasprintf ("%d", key);
+	  grub_env_set ("hotkey", hotkey);
+	  grub_free (hotkey);
+	  return 1;
+	}
+    }
+ 
   return 0;
 }
 

=== modified file 'grub-core/normal/menu.c'
--- a/grub-core/normal/menu.c	2013-06-07 16:36:42 +0000
+++ b/grub-core/normal/menu.c	2013-10-01 03:25:16 +0000
@@ -99,6 +99,34 @@
   return timeout;
 }
 
+/* Get hotkey from environment variables */
+int
+grub_menu_get_hotkey (void)
+{
+  const char *val;
+  int hotkey;
+
+  val = grub_env_get ("hotkey");
+  if (! val)
+    return -1;
+
+  grub_error_push();
+
+  hotkey = (int) grub_strtoul (val, 0, 10);
+
+  /* If the value is invalid, return -1.  */
+  if (grub_errno != GRUB_ERR_NONE)
+    {
+      grub_errno = GRUB_ERR_NONE;
+      hotkey = -1;
+    }
+
+  grub_env_unset ("hotkey");
+  grub_error_pop ();
+
+  return hotkey;
+}
+
 /* Set current timeout in the variable "timeout".  */
 void
 grub_menu_set_timeout (int timeout)
@@ -488,6 +516,21 @@
   return entry;
 }
 
+static int
+get_menuentry_by_hotkey(grub_menu_t menu, int hotkey)
+{
+  grub_menu_entry_t entry;
+  int i;
+  for (i = 0, entry = menu->entry_list; i < menu->size;
+       i++, entry = entry->next)
+    if (entry->hotkey == hotkey)
+      {
+        menu_fini ();
+	return i;
+      }
+  return 0;
+}
+
 #define GRUB_MENU_PAGE_SIZE 10
 
 /* Show the menu and handle menu entry selection.  Returns the menu entry
@@ -502,14 +545,24 @@
   grub_uint64_t saved_time;
   int default_entry, current_entry;
   int timeout;
+  int hotkey = 0;
 
   default_entry = get_entry_number (menu, "default");
+  hotkey = grub_menu_get_hotkey ();
 
   /* If DEFAULT_ENTRY is not within the menu entries, fall back to
      the first entry.  */
   if (default_entry < 0 || default_entry >= menu->size)
     default_entry = 0;
 
+  /* check if hotkey is set */
+  if (hotkey > 0 &&
+      (current_entry = get_menuentry_by_hotkey(menu, hotkey)) > 0)
+    {
+      *auto_boot = 1;
+      return current_entry;
+    }
+
   /* If timeout is 0, drawing is pointless (and ugly).  */
   if (grub_menu_get_timeout () == 0)
     {
@@ -652,19 +705,15 @@
 	      goto refresh;
 
 	    default:
-	      {
-		grub_menu_entry_t entry;
-		int i;
-		for (i = 0, entry = menu->entry_list; i < menu->size;
-		     i++, entry = entry->next)
-		  if (entry->hotkey == c)
-		    {
-		      menu_fini ();
-		      *auto_boot = 0;
-		      return i;
-		    }
-	      }
-	      break;
+              {
+                int entry = get_menuentry_by_hotkey(menu, c);
+                if (entry > 0)
+                  {
+                    *auto_boot = 0;
+                    return entry;
+                  }
+              }
+ 	      break;
 	    }
 	}
     }

=== modified file 'include/grub/menu.h'
--- a/include/grub/menu.h	2012-03-04 13:55:13 +0000
+++ b/include/grub/menu.h	2013-10-01 03:24:02 +0000
@@ -96,6 +96,7 @@
 
 grub_menu_entry_t grub_menu_get_entry (grub_menu_t menu, int no);
 int grub_menu_get_timeout (void);
+int grub_menu_get_hotkey (void);
 void grub_menu_set_timeout (int timeout);
 void grub_menu_entry_run (grub_menu_entry_t entry);
 int grub_menu_get_default_entry_index (grub_menu_t menu);

