dcavalca / rpms / grub2

Forked from rpms/grub2 2 years ago
Clone

Blame SOURCES/0186-Accept-ESC-F8-and-holding-SHIFT-as-user-interrupt-ke.patch

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