use winapi::{shared::minwindef::HKL, um::winuser};
use crate::KeyboardIdentifier;
pub fn list_keyboards() -> Result<Vec<KeyboardIdentifier>, std::io::Error> {
unsafe {
let maybe_keyboard_count = winuser::GetKeyboardLayoutList(0, std::ptr::null_mut());
if maybe_keyboard_count == 0 {
Err(std::io::Error::last_os_error())
} else {
let mut raw_keyboards: Vec<HKL> = vec![0 as HKL; maybe_keyboard_count as usize];
let new_keyboard_count =
winuser::GetKeyboardLayoutList(maybe_keyboard_count, raw_keyboards.as_mut_ptr());
raw_keyboards.resize(new_keyboard_count as usize, std::ptr::null_mut());
Ok(raw_keyboards.iter().map(|x| KeyboardIdentifier(*x as usize)).collect())
}
}
}