2018-07-12 14:56:34 +00:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2018-07-10 19:08:14 +00:00
|
|
|
From: Hans de Goede <hdegoede@redhat.com>
|
|
|
|
Date: Wed, 6 Jun 2018 16:16:47 +0200
|
|
|
|
Subject: [PATCH] EFI: console: Implement getkeystatus() support
|
|
|
|
|
|
|
|
Implement getkeystatus() support.
|
|
|
|
|
|
|
|
Note that if a non-modifier key gets pressed and repeated calls to
|
|
|
|
getkeystatus() are made then it will return the modifier status at the
|
|
|
|
time of the non-modifier key, until that key-press gets consumed by a
|
|
|
|
getkey() call.
|
|
|
|
|
|
|
|
This is a side-effect of how the EFI simple-text-input protocol works
|
|
|
|
and cannot be avoided.
|
|
|
|
|
|
|
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
|
|
|
---
|
|
|
|
grub-core/term/efi/console.c | 34 ++++++++++++++++++++++++++++++++++
|
|
|
|
1 file changed, 34 insertions(+)
|
|
|
|
|
|
|
|
diff --git a/grub-core/term/efi/console.c b/grub-core/term/efi/console.c
|
|
|
|
index bc74b04a368..a5abaf8e722 100644
|
|
|
|
--- a/grub-core/term/efi/console.c
|
|
|
|
+++ b/grub-core/term/efi/console.c
|
|
|
|
@@ -220,6 +220,39 @@ grub_console_getkey_ex(struct grub_term_input *term)
|
|
|
|
return key;
|
|
|
|
}
|
|
|
|
|
|
|
|
+static int
|
|
|
|
+grub_console_getkeystatus(struct grub_term_input *term)
|
|
|
|
+{
|
|
|
|
+ grub_efi_key_data_t key_data;
|
|
|
|
+ grub_efi_uint32_t kss;
|
|
|
|
+ int key, mods = 0;
|
|
|
|
+
|
|
|
|
+ if (grub_efi_is_finished)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ if (grub_console_read_key_stroke (term->data, &key_data, &key, 0))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ kss = key_data.key_state.key_shift_state;
|
|
|
|
+ if (kss & GRUB_EFI_SHIFT_STATE_VALID)
|
|
|
|
+ {
|
|
|
|
+ if (kss & GRUB_EFI_LEFT_SHIFT_PRESSED)
|
|
|
|
+ mods |= GRUB_TERM_STATUS_LSHIFT;
|
|
|
|
+ if (kss & GRUB_EFI_RIGHT_SHIFT_PRESSED)
|
|
|
|
+ mods |= GRUB_TERM_STATUS_RSHIFT;
|
|
|
|
+ if (kss & GRUB_EFI_LEFT_ALT_PRESSED)
|
|
|
|
+ mods |= GRUB_TERM_STATUS_LALT;
|
|
|
|
+ if (kss & GRUB_EFI_RIGHT_ALT_PRESSED)
|
|
|
|
+ mods |= GRUB_TERM_STATUS_RALT;
|
|
|
|
+ if (kss & GRUB_EFI_LEFT_CONTROL_PRESSED)
|
|
|
|
+ mods |= GRUB_TERM_STATUS_LCTRL;
|
|
|
|
+ if (kss & GRUB_EFI_RIGHT_CONTROL_PRESSED)
|
|
|
|
+ mods |= GRUB_TERM_STATUS_RCTRL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return mods;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static grub_err_t
|
|
|
|
grub_efi_console_input_init (struct grub_term_input *term)
|
|
|
|
{
|
|
|
|
@@ -400,6 +433,7 @@ static struct grub_term_input grub_console_term_input =
|
|
|
|
{
|
|
|
|
.name = "console",
|
|
|
|
.getkey = grub_console_getkey,
|
|
|
|
+ .getkeystatus = grub_console_getkeystatus,
|
|
|
|
.init = grub_efi_console_input_init,
|
|
|
|
};
|
|
|
|
|