]> code.delx.au - refind/commitdiff
Added support for automatic booting (skip menu unless key pressed)
authorkupiakos <kupiakos@gmail.com>
Tue, 24 Jun 2014 21:24:36 +0000 (16:24 -0500)
committerkupiakos <kupiakos@gmail.com>
Tue, 24 Jun 2014 21:25:50 +0000 (16:25 -0500)
with a timeout of -1.

docs/refind/configfile.html
refind/menu.c

index 0aaf3f42781f272fc4c1e63655457a3050d9a6c3..4eb876d9d29efddfb83dc91650c8371911017f7b 100644 (file)
@@ -225,7 +225,7 @@ timeout 20
 <tr>
    <td><tt>timeout</tt></td>
    <td>numeric value</td>
-   <td>Sets the timeout period in seconds. If <tt>0</tt>, the timeout is disabled&mdash;rEFInd waits indefinitely for user input.</td>
+   <td>Sets the timeout period in seconds. If <tt>0</tt>, the timeout is disabled&mdash;rEFInd waits indefinitely for user input. If <tt>-1</tt>, rEFInd will normally boot to the default selection. However, if a shortcut key ('W' for Windows) is pressed, that system will boot. If any other key is pressed, the menu will show with no timeout.</td>
 </tr>
 <tr>
    <td><tt>screensaver</tt></td>
index ebe7cae714e3d562c6914940a9c8eb55b5eda4d1..9d5c3160e6883e51738702fe9b08e579d8cc14c5 100644 (file)
@@ -361,6 +361,7 @@ static UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC Sty
     UINTN index;
     INTN ShortcutEntry;
     BOOLEAN HaveTimeout = FALSE;
+    BOOLEAN WaitForRelease = FALSE;
     UINTN TimeoutCountdown = 0;
     INTN PreviousTime = -1, CurrentTime, TimeSinceKeystroke = 0;
     CHAR16 TimeoutMessage[256];
@@ -382,6 +383,25 @@ static UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC Sty
         if (GlobalConfig.ScreensaverTime != -1)
            UpdateScroll(&State, SCROLL_NONE);
     }
+
+    if (Screen->TimeoutSeconds == -1) {
+        Status = refit_call2_wrapper(ST->ConIn->ReadKeyStroke, ST->ConIn, &key);
+        if (Status == EFI_NOT_READY) {
+            MenuExit = MENU_EXIT_TIMEOUT;
+        } else {
+            KeyAsString[0] = key.UnicodeChar;
+            KeyAsString[1] = 0;
+            ShortcutEntry = FindMenuShortcutEntry(Screen, KeyAsString);
+            if (ShortcutEntry >= 0) {
+                State.CurrentSelection = ShortcutEntry;
+                MenuExit = MENU_EXIT_ENTER;
+            } else {
+                WaitForRelease = TRUE;
+                HaveTimeout = FALSE;
+            }
+        }
+    }
+
     if (GlobalConfig.ScreensaverTime != -1)
         State.PaintAll = TRUE;
 
@@ -395,6 +415,19 @@ static UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC Sty
             State.PaintSelection = FALSE;
         }
 
+        if (WaitForRelease) {
+            Status = refit_call2_wrapper(ST->ConIn->ReadKeyStroke, ST->ConIn, &key);
+            if (Status == EFI_SUCCESS) {
+                // reset, because otherwise the buffer gets queued with keystrokes
+                refit_call2_wrapper(ST->ConIn->Reset, ST->ConIn, FALSE);
+                refit_call1_wrapper(BS->Stall, 100000);
+            } else {
+                WaitForRelease = FALSE;
+                refit_call2_wrapper(ST->ConIn->Reset, ST->ConIn, TRUE);
+            }
+            continue;
+        }
+
         if (HaveTimeout) {
             CurrentTime = (TimeoutCountdown + 5) / 10;
             if (CurrentTime != PreviousTime) {
@@ -980,7 +1013,7 @@ static VOID PaintSelection(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State,
 } // static VOID MoveSelection(VOID)
 
 // Display a 48x48 icon at the specified location. Uses the image specified by
-// ExternalFilename if it's available, or BuiltInImage if it's not. The 
+// ExternalFilename if it's available, or BuiltInImage if it's not. The
 // Y position is specified as the center value, and so is adjusted by half
 // the icon's height. The X position is set along the icon's left
 // edge if Alignment == ALIGN_LEFT, and along the right edge if