Allow Shift to interrupt 'sleep --interruptible'

Upstream would like to consider this at more length. See
http://lists.gnu.org/archive/html/grub-devel/2009-08/msg00718.html, and
the rest of the thread for context.

Forwarded: http://lists.gnu.org/archive/html/grub-devel/2009-08/msg00694.html
Last-Update: 2013-12-04

Patch-Name: sleep_shift.patch
This commit is contained in:
Colin Watson 2014-01-13 12:13:23 +00:00 committed by Colin Watson
parent 12718be409
commit 7773069b95
2 changed files with 45 additions and 1 deletions

View File

@ -46,6 +46,31 @@ do_print (int n)
grub_refresh ();
}
static int
grub_check_keyboard (void)
{
int mods = 0;
grub_term_input_t term;
if (grub_term_poll_usb)
grub_term_poll_usb (0);
FOR_ACTIVE_TERM_INPUTS(term)
{
if (term->getkeystatus)
mods |= term->getkeystatus (term);
}
if (mods >= 0 &&
(mods & (GRUB_TERM_STATUS_LSHIFT | GRUB_TERM_STATUS_RSHIFT)) != 0)
return 1;
if (grub_getkey_noblock () == GRUB_TERM_ESC)
return 1;
return 0;
}
/* Based on grub_millisleep() from kern/generic/millisleep.c. */
static int
grub_interruptible_millisleep (grub_uint32_t ms)
@ -55,7 +80,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_check_keyboard ())
return 1;
return 0;

View File

@ -615,8 +615,27 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
saved_time = grub_get_time_ms ();
while (1)
{
int mods = 0;
grub_term_input_t term;
int key;
if (grub_term_poll_usb)
grub_term_poll_usb (0);
FOR_ACTIVE_TERM_INPUTS(term)
{
if (term->getkeystatus)
mods |= term->getkeystatus (term);
}
if (mods >= 0 &&
(mods & (GRUB_TERM_STATUS_LSHIFT
| GRUB_TERM_STATUS_RSHIFT)) != 0)
{
timeout = -1;
break;
}
key = grub_getkey_noblock ();
if (key != GRUB_TERM_NO_KEY)
{