1 Star 0 Fork 49

庞庆 / grub2

forked from src-anolis-os / grub2 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0186-Accept-ESC-F8-and-holding-SHIFT-as-user-interrupt-ke.patch 3.33 KB
一键复制 编辑 原始数据 按行查看 历史
geliwei 提交于 2022-04-13 15:15 . update to grub2-2.02-120.el8.src.rpm
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
index e77e7900f..a1370b710 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 93bd3378d..6cae4c23e 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 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
index 5e2f5283d..6cb2a0714 100644
--- 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
index c21513338..2b079c29b 100644
--- 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);
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/pang-qing/grub2.git
git@gitee.com:pang-qing/grub2.git
pang-qing
grub2
grub2
a8

搜索帮助

344bd9b3 5694891 D2dac590 5694891