From f8d3f9de29982a27a125a2338aaf5ea722211a66 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 25 Nov 2018 17:01:54 +0100 Subject: [PATCH 1/1] [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 --- boot/freeldr/freeldr/ui/directui.c | 25 +++++++++++++++++++++++ boot/freeldr/freeldr/ui/tuimenu.c | 32 ++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) 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) { // -- 2.17.1