Package: grub2 / 2.02~beta3-5+deb9u2

sleep_shift.patch Patch series | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
From 6a2bcd2b02787d585435a5375c91525cfd3ae666 Mon Sep 17 00:00:00 2001
From: Colin Watson <cjwatson@ubuntu.com>
Date: Mon, 13 Jan 2014 12:13:23 +0000
Subject: 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
---
 grub-core/commands/sleep.c | 27 ++++++++++++++++++++++++++-
 grub-core/normal/menu.c    | 19 +++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/grub-core/commands/sleep.c b/grub-core/commands/sleep.c
index e77e7900f..3906b1410 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 (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;
diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c
index 719e2fb1c..9d0ad4c95 100644
--- a/grub-core/normal/menu.c
+++ b/grub-core/normal/menu.c
@@ -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)
 	    {