nativeshell 0.1.0

NativeShell Rust package
Documentation
use super::all_bindings::*;

#[derive(serde::Serialize, serde::Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
struct KeyEvent {
    key_code: u32,
    scan_code: u32,
    characters_ignoring_modifiers_ex: Option<String>,
    characters_ignoring_modifiers_except_shift_ex: Option<String>,
    #[serde(flatten)]
    other: serde_json::Map<String, serde_json::Value>,
}

pub fn process_key_event(data: Vec<u8>) -> Vec<u8> {
    let mut event: KeyEvent = serde_json::from_slice(&data).unwrap();

    let key_state = &mut [0u8; 256];
    let buf = &mut [0u16, 10];
    let buf_shift = &mut [0u16, 10];

    unsafe {
        let res_1 = ToUnicode(
            event.key_code,
            event.scan_code,
            key_state.as_ptr(),
            PWSTR(buf.as_mut_ptr()),
            buf.len() as i32,
            0,
        );

        key_state[VK_SHIFT as usize] = 128;
        let res_2 = ToUnicode(
            event.key_code,
            event.scan_code,
            key_state.as_ptr(),
            PWSTR(buf_shift.as_mut_ptr()),
            buf_shift.len() as i32,
            0,
        );

        if res_1 == 1 {
            event.characters_ignoring_modifiers_ex = Some(String::from_utf16_lossy(&buf[0..1]));
        }
        if res_2 == 1 {
            event.characters_ignoring_modifiers_except_shift_ex =
                Some(String::from_utf16_lossy(&buf_shift[0..1]));
        }
    }

    serde_json::to_vec(&event).unwrap()
}