From: Hermès Bélusca-Maïto Date: Sun, 25 Nov 2018 16:01:54 +0000 (+0100) Subject: [FREELDR] Check for any user keypress in menu even when the timeout is zero. X-Git-Tag: 0.4.12-dev~105 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=f8d3f9de29982a27a125a2338aaf5ea722211a66;ds=sidebyside [FREELDR] Check for any user keypress in menu even when the timeout is zero. 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 --- diff --git a/boot/freeldr/freeldr/ui/directui.c b/boot/freeldr/freeldr/ui/directui.c index 352f8309fc5..a602700988c 100644 --- a/boot/freeldr/freeldr/ui/directui.c +++ b/boot/freeldr/freeldr/ui/directui.c @@ -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) { diff --git a/boot/freeldr/freeldr/ui/tuimenu.c b/boot/freeldr/freeldr/ui/tuimenu.c index fa950b3ccf3..86690af784d 100644 --- a/boot/freeldr/freeldr/ui/tuimenu.c +++ b/boot/freeldr/freeldr/ui/tuimenu.c @@ -30,8 +30,40 @@ TuiDisplayMenu(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) { //