From 642b736aa15e56430b75c8cd4e5f7f6f27dc67c0 Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Mon, 12 Aug 2013 17:02:01 +0200 Subject: [PATCH] Allow Shift to interrupt 'sleep --interruptible'. --- debian/changelog | 1 + debian/patches/series | 1 + debian/patches/sleep_shift.patch | 53 ++++++++++++++++++++++++++++++++ grub-core/commands/sleep.c | 27 +++++++++++++++- 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 debian/patches/sleep_shift.patch diff --git a/debian/changelog b/debian/changelog index ea70920ae..7d14815a9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -10,6 +10,7 @@ grub2 (2.00-16) UNRELEASED; urgency=low Sitter). - Make any EFI system boot into the shim (if installed) even if SecureBoot is disabled (Stéphane Graber). + - Allow Shift to interrupt 'sleep --interruptible'. -- Colin Watson Sun, 11 Aug 2013 12:12:54 +0100 diff --git a/debian/patches/series b/debian/patches/series index 5fe66e66e..616799344 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -49,3 +49,4 @@ acpihalt_improvements.patch script_check_no_commands.patch texinfo_ordering.patch mkconfig_emacs_autosave.patch +sleep_shift.patch diff --git a/debian/patches/sleep_shift.patch b/debian/patches/sleep_shift.patch new file mode 100644 index 000000000..686def09e --- /dev/null +++ b/debian/patches/sleep_shift.patch @@ -0,0 +1,53 @@ +Description: 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. +Author: Colin Watson +Forwarded: http://lists.gnu.org/archive/html/grub-devel/2009-08/msg00694.html +Last-Update: 2012-09-06 + +Index: b/grub-core/commands/sleep.c +=================================================================== +--- a/grub-core/commands/sleep.c ++++ b/grub-core/commands/sleep.c +@@ -46,6 +46,31 @@ + 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 (); ++ ++ 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 @@ + 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; diff --git a/grub-core/commands/sleep.c b/grub-core/commands/sleep.c index 98e6280a5..0294bf946 100644 --- a/grub-core/commands/sleep.c +++ b/grub-core/commands/sleep.c @@ -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 (); + + 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;