glume 0.2.0

A simple to use all-in-one OpenGL application framework.
Documentation

pub use glutin::event::VirtualKeyCode as VirtualKeyCode;

fn num_pad(vk: VirtualKeyCode, num_lock: bool) -> Option<char> {
    use VirtualKeyCode::*;

    let ch = match vk {
        Numpad0 => '0',
        Numpad1 => '1',
        Numpad2 => '2',
        Numpad3 => '3',
        Numpad4 => '4',
        Numpad5 => '5',
        Numpad6 => '6',
        Numpad7 => '7',
        Numpad8 => '8',
        Numpad9 => '9',
        NumpadAdd => '+',
        NumpadDivide => '/',
        NumpadDecimal => '.',
        NumpadMultiply => '*',
        NumpadSubtract => '-',
        _ => return None,
    };

    if num_lock || !ch.is_numeric() {
        Some(ch)
    } else {
        None
    }
}

pub fn key_as_char(vk: VirtualKeyCode, shift: bool, caps_lock: bool, num_lock: bool) -> Option<char> {
    use VirtualKeyCode::*;

    let ch = match vk {
        Key1 => '1',
        Key2 => '2',
        Key3 => '3',
        Key4 => '4',
        Key5 => '5',
        Key6 => '6',
        Key7 => '7',
        Key8 => '8',
        Key9 => '9',
        Key0 => '0',
        A => 'a',
        B => 'b',
        C => 'c',
        D => 'd',
        E => 'e',
        F => 'f',
        G => 'g',
        H => 'h',
        I => 'i',
        J => 'j',
        K => 'k',
        L => 'l',
        M => 'm',
        N => 'n',
        O => 'o',
        P => 'p',
        Q => 'q',
        R => 'r',
        S => 's',
        T => 't',
        U => 'u',
        V => 'v',
        W => 'w',
        X => 'x',
        Y => 'y',
        Z => 'z',
        Grave => '`',
        Minus => '-',
        Equals => '=',
        Tab => '\t',
        LBracket => '[',
        RBracket => ']',
        Backslash => '\\',
        Semicolon => ';',
        Apostrophe => '\'',
        Return => '\n',
        Comma => ',',
        Period => '.',
        Slash => '/',
        Space => ' ',
        _ => return num_pad(vk, num_lock),
    };

    if ch.is_alphabetic() {
        if shift ^ caps_lock {
            Some(ch.to_ascii_uppercase())
        } else {
            Some(ch)
        }
    } else {
        if shift {
            match ch {
                '1' => Some('!'),
                '2' => Some('@'),
                '3' => Some('#'),
                '4' => Some('$'),
                '5' => Some('%'),
                '6' => Some('^'),
                '7' => Some('&'),
                '8' => Some('*'),
                '9' => Some('('),
                '0' => Some(')'),
                '-' => Some('_'),
                '=' => Some('+'),
                '`' => Some('~'),
                '[' => Some('{'),
                ']' => Some('}'),
                '\\' => Some('|'),
                ';' => Some(':'),
                '\'' => Some('"'),
                ',' => Some('<'),
                '.' => Some('>'),
                '/' => Some('?'),
                _ => None,
            }
        } else {
            Some(ch)
        }
    }
}