2019-08-01 01:02:52 +00:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Hans de Goede <hdegoede@redhat.com>
|
|
|
|
Date: Mon, 26 Mar 2018 16:15:53 +0200
|
|
|
|
Subject: [PATCH] Accept ESC, F8 and holding SHIFT as user interrupt keys
|
|
|
|
|
|
|
|
On some devices the ESC key is the hotkey to enter the BIOS/EFI setup
|
|
|
|
screen, making it really hard to time pressing it right. Besides that
|
|
|
|
ESC is also pretty hard to discover for a user who does not know it
|
|
|
|
will unhide the menu.
|
|
|
|
|
|
|
|
This commit makes F8, which used to be the hotkey to show the Windows
|
|
|
|
boot menu during boot for a long long time, also interrupt sleeps /
|
|
|
|
stop the menu countdown.
|
|
|
|
|
|
|
|
This solves the ESC gets into the BIOS setup and also somewhat solves
|
|
|
|
the discoverability issue, but leaves the timing issue unresolved.
|
|
|
|
|
|
|
|
This commit fixes the timing issue by also adding support for keeping
|
|
|
|
SHIFT pressed during boot to stop the menu countdown. This matches
|
|
|
|
what Ubuntu is doing, which should also help with discoverability.
|
|
|
|
|
|
|
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
|
|
|
---
|
|
|
|
grub-core/commands/sleep.c | 2 +-
|
|
|
|
grub-core/kern/term.c | 16 ++++++++++++++++
|
|
|
|
grub-core/normal/menu.c | 2 +-
|
|
|
|
include/grub/term.h | 1 +
|
|
|
|
4 files changed, 19 insertions(+), 2 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/grub-core/commands/sleep.c b/grub-core/commands/sleep.c
|
2022-03-29 18:03:52 +00:00
|
|
|
index e77e7900f..a1370b710 100644
|
2019-08-01 01:02:52 +00:00
|
|
|
--- a/grub-core/commands/sleep.c
|
|
|
|
+++ b/grub-core/commands/sleep.c
|
|
|
|
@@ -55,7 +55,7 @@ grub_interruptible_millisleep (grub_uint32_t ms)
|
|
|
|
start = grub_get_time_ms ();
|
|
|
|
|
|
|
|
while (grub_get_time_ms () - start < ms)
|
|
|
|
- if (grub_getkey_noblock () == GRUB_TERM_ESC)
|
|
|
|
+ if (grub_key_is_interrupt (grub_getkey_noblock ()))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
diff --git a/grub-core/kern/term.c b/grub-core/kern/term.c
|
2022-03-29 18:03:52 +00:00
|
|
|
index 93bd3378d..6cae4c23e 100644
|
2019-08-01 01:02:52 +00:00
|
|
|
--- a/grub-core/kern/term.c
|
|
|
|
+++ b/grub-core/kern/term.c
|
|
|
|
@@ -138,6 +138,22 @@ grub_getkeystatus (void)
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
+int
|
|
|
|
+grub_key_is_interrupt (int key)
|
|
|
|
+{
|
|
|
|
+ /* ESC sometimes is the BIOS setup hotkey and may be hard to discover, also
|
|
|
|
+ check F8, which was the key to get the Windows bootmenu for a long time. */
|
|
|
|
+ if (key == GRUB_TERM_ESC || key == GRUB_TERM_KEY_F8)
|
|
|
|
+ return 1;
|
|
|
|
+
|
|
|
|
+ /* Pressing keys at the right time during boot is hard to time, also allow
|
|
|
|
+ interrupting sleeps / the menu countdown by keeping shift pressed. */
|
|
|
|
+ if (grub_getkeystatus() & (GRUB_TERM_STATUS_LSHIFT|GRUB_TERM_STATUS_RSHIFT))
|
|
|
|
+ return 1;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
void
|
|
|
|
grub_refresh (void)
|
|
|
|
{
|
|
|
|
diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c
|
2022-03-29 18:03:52 +00:00
|
|
|
index 5e2f5283d..6cb2a0714 100644
|
2019-08-01 01:02:52 +00:00
|
|
|
--- a/grub-core/normal/menu.c
|
|
|
|
+++ b/grub-core/normal/menu.c
|
|
|
|
@@ -655,7 +655,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
|
|
|
if (entry >= 0)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
- if (key == GRUB_TERM_ESC)
|
|
|
|
+ if (grub_key_is_interrupt (key))
|
|
|
|
{
|
|
|
|
timeout = -1;
|
|
|
|
break;
|
|
|
|
diff --git a/include/grub/term.h b/include/grub/term.h
|
2022-03-29 18:03:52 +00:00
|
|
|
index c21513338..2b079c29b 100644
|
2019-08-01 01:02:52 +00:00
|
|
|
--- a/include/grub/term.h
|
|
|
|
+++ b/include/grub/term.h
|
|
|
|
@@ -328,6 +328,7 @@ void grub_putcode (grub_uint32_t code, struct grub_term_output *term);
|
|
|
|
int EXPORT_FUNC(grub_getkey) (void);
|
|
|
|
int EXPORT_FUNC(grub_getkey_noblock) (void);
|
|
|
|
int EXPORT_FUNC(grub_getkeystatus) (void);
|
|
|
|
+int EXPORT_FUNC(grub_key_is_interrupt) (int key);
|
|
|
|
void grub_cls (void);
|
|
|
|
void EXPORT_FUNC(grub_refresh) (void);
|
|
|
|
void grub_puts_terminal (const char *str, struct grub_term_output *term);
|