Normally, GRUB allows using a combination of the Return/Enter (`\n' and `\r'), Ctrl-F, and the right arrow key to select a menu item. However, on some keyboards (especially those half-height arrow keys found on laptop computers), it is very easy to accidentally select a menu item when the user meant to press the up/down arrow key.
Implement an GRUB_RIGHT_TO_SELECT option (boolean) to enable/disable right arrow key for selecting menu items. --- Changes in v2: * Fix comment style. * Fix if condition styling for TERM_KEY_RIGHT detection (Avnish: I kept the indentation style, as it's consistent with the styling in the TERM_KEY_ESC case below, in how those indentations were written for that if-and-break branch). Co-developed-by: Mag Mell <sakii...@aosc.io> Signed-off-by: Mingcong Bai <jeff...@aosc.io> --- docs/grub.texi | 4 ++++ grub-core/normal/menu.c | 23 ++++++++++++++++++++--- util/grub-mkconfig.in | 3 ++- util/grub.d/00_header.in | 6 ++++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/docs/grub.texi b/docs/grub.texi index a225f9a88..09d251659 100644 --- a/docs/grub.texi +++ b/docs/grub.texi @@ -1596,6 +1596,10 @@ This option may be set to a list of GRUB module names separated by spaces. Each module will be loaded as early as possible, at the start of @file{grub.cfg}. +@item GRUB_RIGHT_TO_SELECT +This option may be set to specify whether the right arrow key may be used +to make a selection. This option defaults to @samp{true}. + @end table The following options are still accepted for compatibility with existing diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c index 6a90e091f..d54e5a53b 100644 --- a/grub-core/normal/menu.c +++ b/grub-core/normal/menu.c @@ -32,6 +32,7 @@ #include <grub/script_sh.h> #include <grub/gfxterm.h> #include <grub/dl.h> +#include <grub/env.h> /* Time to delay after displaying an error message about a default/fallback entry failing to boot. */ @@ -579,11 +580,18 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot, int *notify_boot) int default_entry, current_entry; int timeout; enum timeout_style timeout_style; + bool right_to_select; *notify_boot = 1; default_entry = get_entry_number (menu, "default"); + /* + * Read if the right arrow key is enabled for selection. Default to `true' + * if unset. + */ + right_to_select = grub_env_get_bool ("right_to_select", true); + /* If DEFAULT_ENTRY is not within the menu entries, fall back to the first entry. */ if (default_entry < 0 || default_entry >= menu->size) @@ -762,9 +770,18 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot, int *notify_boot) case '\r': case GRUB_TERM_KEY_RIGHT: case GRUB_TERM_CTRL | 'f': - menu_fini (); - *auto_boot = 0; - return current_entry; + /* + * Right arrow key to select only when boolean value + * `right_to_select' is set to `true' or not specified + * (defaults to `true'). + */ + if ((c != GRUB_TERM_KEY_RIGHT) || right_to_select) + { + menu_fini (); + *auto_boot = 0; + return current_entry; + } + break; case GRUB_TERM_ESC: if (nested) diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in index 32c480dae..d0e0efbb1 100644 --- a/util/grub-mkconfig.in +++ b/util/grub-mkconfig.in @@ -255,7 +255,8 @@ export GRUB_DEFAULT \ GRUB_ENABLE_CRYPTODISK \ GRUB_BADRAM \ GRUB_OS_PROBER_SKIP_LIST \ - GRUB_DISABLE_SUBMENU + GRUB_DISABLE_SUBMENU \ + GRUB_RIGHT_TO_SELECT if test "x${grub_cfg}" != "x"; then rm -f "${grub_cfg}.new" diff --git a/util/grub.d/00_header.in b/util/grub.d/00_header.in index 6a316a5ba..54b2f9aa7 100644 --- a/util/grub.d/00_header.in +++ b/util/grub.d/00_header.in @@ -37,6 +37,7 @@ if [ "x${GRUB_DEFAULT}" = "x" ] ; then GRUB_DEFAULT=0 ; fi if [ "x${GRUB_DEFAULT}" = "xsaved" ] ; then GRUB_DEFAULT='${saved_entry}' ; fi if [ "x${GRUB_TIMEOUT}" = "x" ] ; then GRUB_TIMEOUT=5 ; fi if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=auto ; fi +if [ "x${GRUB_RIGHT_TO_SELECT}" = "x" ] ; then GRUB_RIGHT_TO_SELECT=true ; fi if [ "x${GRUB_DEFAULT_BUTTON}" = "x" ] ; then GRUB_DEFAULT_BUTTON="$GRUB_DEFAULT" ; fi if [ "x${GRUB_DEFAULT_BUTTON}" = "xsaved" ] ; then GRUB_DEFAULT_BUTTON='${saved_entry}' ; fi @@ -354,3 +355,8 @@ fi if [ "x${GRUB_BADRAM}" != "x" ] ; then echo "badram ${GRUB_BADRAM}" fi + +# Whether to allow selecting with the right arrow key. +cat << EOF +set right_to_select=${GRUB_RIGHT_TO_SELECT} +EOF -- 2.47.0 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel