grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 07/10] kern/term: Accept ESC, F4 and holding SHIFT as user interr


From: Javier Martinez Canillas
Subject: [PATCH 07/10] kern/term: Accept ESC, F4 and holding SHIFT as user interrupt keys
Date: Fri, 13 Mar 2020 20:15:02 +0100

From: Hans de Goede <address@hidden>

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 F4, 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 <address@hidden>
Signed-off-by: Javier Martinez Canillas <address@hidden>

---

 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
index e77e7900fac..a1370b710c9 100644
--- 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
index 93bd3378d18..8b6ef0f3e26 100644
--- 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 F4, which was the key to get the Windows bootmenu for a long time. 
*/
+  if (key == GRUB_TERM_ESC || key == GRUB_TERM_KEY_F4)
+    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
index da66ad89180..8397886fa05 100644
--- a/grub-core/normal/menu.c
+++ b/grub-core/normal/menu.c
@@ -623,7 +623,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
index 9da03dc751e..3387cb0527c 100644
--- a/include/grub/term.h
+++ b/include/grub/term.h
@@ -330,6 +330,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);
-- 
2.24.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]