efi/console: Implement getkeystatus() support
Implement getkeystatus() support in the EFI console driver. This is needed because the logic to determine if a key was pressed to make the menu countdown stop will be changed by a later patch to also take into account the SHIFT key being held down. For this reason the EFI console driver has to support getkeystatus() to allow detecting that event. 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> Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
8bab36af60
commit
ea138d11be
1 changed files with 34 additions and 0 deletions
|
@ -260,6 +260,39 @@ grub_console_getkey_ex (struct grub_term_input *term)
|
||||||
return key;
|
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
|
static grub_err_t
|
||||||
grub_efi_console_input_init (struct grub_term_input *term)
|
grub_efi_console_input_init (struct grub_term_input *term)
|
||||||
{
|
{
|
||||||
|
@ -372,6 +405,7 @@ static struct grub_term_input grub_console_term_input =
|
||||||
{
|
{
|
||||||
.name = "console",
|
.name = "console",
|
||||||
.getkey = grub_console_getkey,
|
.getkey = grub_console_getkey,
|
||||||
|
.getkeystatus = grub_console_getkeystatus,
|
||||||
.init = grub_efi_console_input_init,
|
.init = grub_efi_console_input_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue