vncrs 0.1.3

A pure Rust VNC server library for Windows
Documentation
pub fn keysym_to_unicode(keysym: u32) -> Option<char> {
    match keysym {
        k if k >= 0x0100_0000 => char::from_u32(k - 0x0100_0000),

        0x0020..=0x007E => Some(keysym as u8 as char),
        0x00A0..=0x00FF => char::from_u32(keysym),

        0x06A3 => Some('ё'),
        0x06B3 => Some('Ё'),

        0x06C0 => Some('ю'),
        0x06C1 => Some('а'),
        0x06C2 => Some('б'),
        0x06C3 => Some('ц'),
        0x06C4 => Some('д'),
        0x06C5 => Some('е'),
        0x06C6 => Some('ф'),
        0x06C7 => Some('г'),
        0x06C8 => Some('х'),
        0x06C9 => Some('и'),
        0x06CA => Some('й'),
        0x06CB => Some('к'),
        0x06CC => Some('л'),
        0x06CD => Some('м'),
        0x06CE => Some('н'),
        0x06CF => Some('о'),
        0x06D0 => Some('п'),
        0x06D1 => Some('я'),
        0x06D2 => Some('р'),
        0x06D3 => Some('с'),
        0x06D4 => Some('т'),
        0x06D5 => Some('у'),
        0x06D6 => Some('ж'),
        0x06D7 => Some('в'),
        0x06D8 => Some('ь'),
        0x06D9 => Some('ы'),
        0x06DA => Some('з'),
        0x06DB => Some('ш'),
        0x06DC => Some('э'),
        0x06DD => Some('щ'),
        0x06DE => Some('ч'),
        0x06DF => Some('ъ'),

        0x06E0 => Some('Ю'),
        0x06E1 => Some('А'),
        0x06E2 => Some('Б'),
        0x06E3 => Some('Ц'),
        0x06E4 => Some('Д'),
        0x06E5 => Some('Е'),
        0x06E6 => Some('Ф'),
        0x06E7 => Some('Г'),
        0x06E8 => Some('Х'),
        0x06E9 => Some('И'),
        0x06EA => Some('Й'),
        0x06EB => Some('К'),
        0x06EC => Some('Л'),
        0x06ED => Some('М'),
        0x06EE => Some('Н'),
        0x06EF => Some('О'),
        0x06F0 => Some('П'),
        0x06F1 => Some('Я'),
        0x06F2 => Some('Р'),
        0x06F3 => Some('С'),
        0x06F4 => Some('Т'),
        0x06F5 => Some('У'),
        0x06F6 => Some('Ж'),
        0x06F7 => Some('В'),
        0x06F8 => Some('Ь'),
        0x06F9 => Some('Ы'),
        0x06FA => Some('З'),
        0x06FB => Some('Ш'),
        0x06FC => Some('Э'),
        0x06FD => Some('Щ'),
        0x06FE => Some('Ч'),
        0x06FF => Some('Ъ'),

        _ => None,
    }
}

pub fn is_control_key(keysym: u32) -> bool {
    matches!(
        keysym,
        0xFF08..=0xFF1B
        | 0xFF50..=0xFF58
        | 0xFF63
        | 0xFF7F
        | 0xFFBE..=0xFFC9
        | 0xFFE1..=0xFFEE
        | 0xFFFF
        | 0xFF61
        | 0xFF67
    )
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_ascii() {
        assert_eq!(keysym_to_unicode(0x0041), Some('A'));
        assert_eq!(keysym_to_unicode(0x0061), Some('a'));
        assert_eq!(keysym_to_unicode(0x0020), Some(' '));
    }

    #[test]
    fn test_cyrillic() {
        assert_eq!(keysym_to_unicode(0x06C1), Some('а'));
        assert_eq!(keysym_to_unicode(0x06E1), Some('А'));
        assert_eq!(keysym_to_unicode(0x06A3), Some('ё'));
        assert_eq!(keysym_to_unicode(0x06B3), Some('Ё'));
    }

    #[test]
    fn test_unicode_keysym() {
        assert_eq!(keysym_to_unicode(0x01000410), Some('А'));
        assert_eq!(keysym_to_unicode(0x010020AC), Some(''));
    }

    #[test]
    fn test_control_keys() {
        assert!(is_control_key(0xFF08));
        assert!(is_control_key(0xFFE1));
        assert!(!is_control_key(0x0041));
    }
}