[FREELDR] Check for any user keypress in menu even when the timeout is zero.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 25 Nov 2018 16:01:54 +0000 (17:01 +0100)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 25 Nov 2018 16:09:19 +0000 (17:09 +0100)
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 menu timeout is cancelled.

This allows e.g. handling F8 press for displaying boot options even when
the timeout is zero.

CORE-14046

boot/freeldr/freeldr/ui/directui.c
boot/freeldr/freeldr/ui/tuimenu.c

index 352f830..a602700 100644 (file)
@@ -556,6 +556,31 @@ UiDisplayMenu(IN PCSTR MenuHeader,
     ULONG CurrentClockSecond;
     ULONG KeyPress;
 
     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)
     {
     /* Check if there's no timeout */
     if (!MenuTimeOut)
     {
index fa950b3..86690af 100644 (file)
@@ -30,8 +30,40 @@ TuiDisplayMenu(PCSTR MenuHeader,
     ULONG CurrentClockSecond;
     ULONG KeyPress;
 
     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
     //
     // Check if there's no timeout
+    //
     if (!MenuTimeOut)
     {
         //
     if (!MenuTimeOut)
     {
         //