[FREELDR] Check for any user keypress in menu even when the timeout is zero.
[reactos.git] / boot / freeldr / freeldr / ui / directui.c
index 8a04285..a602700 100644 (file)
@@ -226,13 +226,13 @@ VOID
 UiDrawProgressBar(IN ULONG Left,
                   IN ULONG Top,
                   IN ULONG Right,
-                  IN ULONG Bottom, 
+                  IN ULONG Bottom,
                   IN ULONG Position,
                   IN ULONG Range,
                   IN PCHAR ProgressText)
 {
     ULONG i, ProgressBarWidth;
-    
+
     /* Calculate the width of the bar proper */
     ProgressBarWidth = (Right - Left) - 3;
 
@@ -556,6 +556,31 @@ UiDisplayMenu(IN PCSTR MenuHeader,
     ULONG CurrentClockSecond;
     ULONG KeyPress;
 
+    /*
+     * Before taking any default action if there is no timeout,
+     * check whether the supplied key filter callback function
+     * may handle a specific user keypress. If it does, the
+     * timeout is cancelled.
+     */
+    if (!MenuTimeOut && KeyPressFilter && MachConsKbHit())
+    {
+        /* Get the key */
+        KeyPress = MachConsGetCh();
+
+        /* Is it extended? Then get the extended key */
+        if (!KeyPress) KeyPress = MachConsGetCh();
+
+        /*
+         * Call the supplied key filter callback function to see
+         * if it is going to handle this keypress.
+         */
+        if (KeyPressFilter(KeyPress))
+        {
+            /* It processed the key character, cancel the timeout */
+            MenuTimeOut = -1;
+        }
+    }
+
     /* Check if there's no timeout */
     if (!MenuTimeOut)
     {