use crate::proto::unsafe_protocol;
use crate::{Char16, Error, Event, Result, Status, StatusExt};
use core::mem::MaybeUninit;
use uefi_raw::protocol::console::{InputKey, SimpleTextInputProtocol};
#[derive(Debug)]
#[repr(transparent)]
#[unsafe_protocol(SimpleTextInputProtocol::GUID)]
pub struct Input(SimpleTextInputProtocol);
impl Input {
pub fn reset(&mut self, extended_verification: bool) -> Result {
unsafe { (self.0.reset)(&mut self.0, extended_verification.into()) }.to_result()
}
pub fn read_key(&mut self) -> Result<Option<Key>> {
let mut key = MaybeUninit::<InputKey>::uninit();
match unsafe { (self.0.read_key_stroke)(&mut self.0, key.as_mut_ptr()) } {
Status::NOT_READY => Ok(None),
other => other.to_result_with_val(|| Some(unsafe { key.assume_init() }.into())),
}
}
pub fn wait_for_key_event(&self) -> Result<Event> {
unsafe { Event::from_ptr(self.0.wait_for_key) }.ok_or(Error::from(Status::UNSUPPORTED))
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum Key {
Printable(Char16),
Special(ScanCode),
}
impl From<InputKey> for Key {
fn from(k: InputKey) -> Self {
if k.scan_code == ScanCode::NULL.0 {
Self::Printable(Char16::try_from(k.unicode_char).unwrap())
} else {
Self::Special(ScanCode(k.scan_code))
}
}
}
newtype_enum! {
pub enum ScanCode: u16 => #[allow(missing_docs)] {
NULL = 0x00,
UP = 0x01,
DOWN = 0x02,
RIGHT = 0x03,
LEFT = 0x04,
HOME = 0x05,
END = 0x06,
INSERT = 0x07,
DELETE = 0x08,
PAGE_UP = 0x09,
PAGE_DOWN = 0x0A,
FUNCTION_1 = 0x0B,
FUNCTION_2 = 0x0C,
FUNCTION_3 = 0x0D,
FUNCTION_4 = 0x0E,
FUNCTION_5 = 0x0F,
FUNCTION_6 = 0x10,
FUNCTION_7 = 0x11,
FUNCTION_8 = 0x12,
FUNCTION_9 = 0x13,
FUNCTION_10 = 0x14,
FUNCTION_11 = 0x15,
FUNCTION_12 = 0x16,
ESCAPE = 0x17,
FUNCTION_13 = 0x68,
FUNCTION_14 = 0x69,
FUNCTION_15 = 0x6A,
FUNCTION_16 = 0x6B,
FUNCTION_17 = 0x6C,
FUNCTION_18 = 0x6D,
FUNCTION_19 = 0x6E,
FUNCTION_20 = 0x6F,
FUNCTION_21 = 0x70,
FUNCTION_22 = 0x71,
FUNCTION_23 = 0x72,
FUNCTION_24 = 0x73,
MUTE = 0x7F,
VOLUME_UP = 0x80,
VOLUME_DOWN = 0x81,
BRIGHTNESS_UP = 0x100,
BRIGHTNESS_DOWN = 0x101,
SUSPEND = 0x102,
HIBERNATE = 0x103,
TOGGLE_DISPLAY = 0x104,
RECOVERY = 0x105,
EJECT = 0x106,
}}