1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
extern crate sdl2;

pub type Scancode = sdl2::keyboard::Scancode;

const MAX_SCANCODE: usize = Scancode::Num as usize;
static mut KEY_STATE: Vec<bool> = vec![];

fn check_key(code: Scancode) -> bool {
    unsafe { KEY_STATE[code as usize] }
}

pub fn init() {
    let ptr = unsafe { sdl2::sys::SDL_GetKeyboardState(std::ptr::null_mut()) } as *mut bool;
    unsafe { KEY_STATE = Vec::from_raw_parts(ptr, MAX_SCANCODE, MAX_SCANCODE) };
}

pub fn from_name(keyname: &str) -> Option<Scancode> {
    sdl2::keyboard::Scancode::from_name(keyname)
}

pub fn get_name(code: Scancode) -> &'static str { code.name() }
pub fn is_down(code: Scancode) -> bool { check_key(code) }
pub fn is_up(code: Scancode) -> bool { !check_key(code) }