Message ID | 1464174026-28768-1-git-send-email-thuth@redhat.com |
---|---|
State | Accepted |
Headers | show |
On 25/05/16 21:00, Thomas Huth wrote: > When hitting F12 during boot multiple times (to make sure that you get > to the boot menu), it is sometimes impossible to select a menu entry > from the boot list - you always get the output "Invalid choice!" and > are dropped to the SLOF prompt. > > The "boot-start" function already has some code at the beginning to > flush the keyboard input to get rid of multiple F12 keys. But if you > accidentially press F12 again after that code has been executed, > the code that checks the input for the selected boot menu entry > can not handle it and gets confused. > > Fix this issue by flushing the keyboard input queue as late as possible > (i.e. after printing the boot menu items, since that could also take > a short while when the list is long and when using slow VGA text > output), and by ignoring all key sequences that start with an ESC > (like the F12 key ESC sequence) in the main keyboard input loop there. > > Signed-off-by: Thomas Huth <thuth@redhat.com> Thanks, applied. > --- > slof/fs/start-up.fs | 21 +++++++++++++++------ > 1 file changed, 15 insertions(+), 6 deletions(-) > > diff --git a/slof/fs/start-up.fs b/slof/fs/start-up.fs > index fb88f76..dc5d1ed 100644 > --- a/slof/fs/start-up.fs > +++ b/slof/fs/start-up.fs > @@ -91,18 +91,27 @@ TRUE VALUE use-load-watchdog? > ; > > : boot-start > - \ Remove multiple F12 key presses if any > - BEGIN key? WHILE > - key drop > - REPEAT > - > decimal > BEGIN parse-word dup WHILE > my-boot-dev (u.) s" . " $cat type 2dup type ." : " de-alias type cr > my-boot-dev 1 + to my-boot-dev > REPEAT 2drop 0 0 load-list 2! > > - cr BEGIN KEY dup emit > + \ Clear pending keys (to remove multiple F12 key presses for example) > + BEGIN key? WHILE > + key drop > + REPEAT > + > + cr > + BEGIN > + KEY > + dup 1b = IF \ ESC sequence ... could be yet another F12 key press > + BEGIN key? WHILE > + key drop > + REPEAT > + ELSE > + dup emit > + THEN > dup isdigit IF > dup 30 - to digit-val > boot-dev-no a * digit-val + to boot-dev-no >
diff --git a/slof/fs/start-up.fs b/slof/fs/start-up.fs index fb88f76..dc5d1ed 100644 --- a/slof/fs/start-up.fs +++ b/slof/fs/start-up.fs @@ -91,18 +91,27 @@ TRUE VALUE use-load-watchdog? ; : boot-start - \ Remove multiple F12 key presses if any - BEGIN key? WHILE - key drop - REPEAT - decimal BEGIN parse-word dup WHILE my-boot-dev (u.) s" . " $cat type 2dup type ." : " de-alias type cr my-boot-dev 1 + to my-boot-dev REPEAT 2drop 0 0 load-list 2! - cr BEGIN KEY dup emit + \ Clear pending keys (to remove multiple F12 key presses for example) + BEGIN key? WHILE + key drop + REPEAT + + cr + BEGIN + KEY + dup 1b = IF \ ESC sequence ... could be yet another F12 key press + BEGIN key? WHILE + key drop + REPEAT + ELSE + dup emit + THEN dup isdigit IF dup 30 - to digit-val boot-dev-no a * digit-val + to boot-dev-no
When hitting F12 during boot multiple times (to make sure that you get to the boot menu), it is sometimes impossible to select a menu entry from the boot list - you always get the output "Invalid choice!" and are dropped to the SLOF prompt. The "boot-start" function already has some code at the beginning to flush the keyboard input to get rid of multiple F12 keys. But if you accidentially press F12 again after that code has been executed, the code that checks the input for the selected boot menu entry can not handle it and gets confused. Fix this issue by flushing the keyboard input queue as late as possible (i.e. after printing the boot menu items, since that could also take a short while when the list is long and when using slow VGA text output), and by ignoring all key sequences that start with an ESC (like the F12 key ESC sequence) in the main keyboard input loop there. Signed-off-by: Thomas Huth <thuth@redhat.com> --- slof/fs/start-up.fs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)