#include "key.h" // Character table for scan codes for US keyboards static struct { const unsigned char normal, // Character without modifiers shift, // Character with pressed Shift, Capslock, or in Numpad alt; // Character with pressed Alt key } ascii_tab[Key::Scancode::KEYS] = { {0, 0, 0}, // KEY_INVALID {0, 0, 0}, // KEY_ESCAPE {'1', '!', 0}, // KEY_1 {'2', '"', 253}, // KEY_2 {'3', 21, 0}, // KEY_3 {'4', '$', 0}, // KEY_4 {'5', '%', 0}, // KEY_5 {'6', '&', 0}, // KEY_6 {'7', '/', '{'}, // KEY_7 {'8', '(', '['}, // KEY_8 {'9', ')', ']'}, // KEY_9 {'0', '=', '}'}, // KEY_0 {225, '?', '\\'}, // KEY_DASH {39, 96, 0}, // KEY_EQUAL {'\b', 0, 0}, // KEY_BACKSPACE {0, 0, 0}, // KEY_TAB {'q', 'Q', '@'}, // KEY_Q {'w', 'W', 0}, // KEY_W {'e', 'E', 0}, // KEY_E {'r', 'R', 0}, // KEY_R {'t', 'T', 0}, // KEY_T {'z', 'Z', 0}, // KEY_Y {'u', 'U', 0}, // KEY_U {'i', 'I', 0}, // KEY_I {'o', 'O', 0}, // KEY_O {'p', 'P', 0}, // KEY_P {129, 154, 0}, // KEY_OPEN_BRACKET {'+', '*', '~'}, // KEY_CLOSE_BRACKET {'\n', 0, 0}, // KEY_ENTER {0, 0, 0}, // KEY_LEFT_CTRL {'a', 'A', 0}, // KEY_A {'s', 'S', 0}, // KEY_S {'d', 'D', 0}, // KEY_D {'f', 'F', 0}, // KEY_F {'g', 'G', 0}, // KEY_G {'h', 'H', 0}, // KEY_H {'j', 'J', 0}, // KEY_J {'k', 'K', 0}, // KEY_K {'l', 'L', 0}, // KEY_L {148, 153, 0}, // KEY_SEMICOLON {132, 142, 0}, // KEY_APOSTROPH {'^', 248, 0}, // KEY_GRAVE_ACCENT {0, 0, 0}, // KEY_LEFT_SHIFT {'#', 39, 0}, // KEY_BACKSLASH {'y', 'Y', 0}, // KEY_Z {'x', 'X', 0}, // KEY_X {'c', 'C', 0}, // KEY_C {'v', 'V', 0}, // KEY_V {'b', 'B', 0}, // KEY_B {'n', 'N', 0}, // KEY_N {'m', 'M', 230}, // KEY_M {',', ';', 0}, // KEY_COMMA {'.', ':', 0}, // KEY_PERIOD {'-', '_', 0}, // KEY_SLASH {0, 0, 0}, // KEY_RIGHT_SHIFT {'*', '*', 0}, // KEY_KP_STAR {0, 0, 0}, // KEY_LEFT_ALT {' ', ' ', 0}, // KEY_SPACEBAR {0, 0, 0}, // KEY_CAPS_LOCK {0, 0, 0}, // KEY_F1 {0, 0, 0}, // KEY_F2 {0, 0, 0}, // KEY_F3 {0, 0, 0}, // KEY_F4 {0, 0, 0}, // KEY_F5 {0, 0, 0}, // KEY_F6 {0, 0, 0}, // KEY_F7 {0, 0, 0}, // KEY_F8 {0, 0, 0}, // KEY_F9 {0, 0, 0}, // KEY_F10 {0, 0, 0}, // KEY_NUM_LOCK {0, 0, 0}, // KEY_SCROLL_LOCK {0, '7', 0}, // KEY_KP_7 {0, '8', 0}, // KEY_KP_8 {0, '9', 0}, // KEY_KP_9 {'-', '-', 0}, // KEY_KP_DASH {0, '4', 0}, // KEY_KP_4 {0, '5', 0}, // KEY_KP_5 {0, '6', 0}, // KEY_KP_6 {'+', '+', 0}, // KEY_KP_PLUS {0, '1', 0}, // KEY_KP_1 {0, '2', 0}, // KEY_KP_2 {0, '3', 0}, // KEY_KP_3 {0, '0', 0}, // KEY_KP_0 {127, ',', 0}, // KEY_KP_PERIOD {0, 0, 0}, // KEY_SYSREQ {0, 0, 0}, // KEY_EUROPE_2 {'<', '>', '|'}, // KEY_F11 {0, 0, 0}, // KEY_F12 {0, 0, 0}, // KEY_KP_EQUAL }; unsigned char Key::ascii() const { // Select the correct table depending on the modifier bits. // For the sake of simplicity, Shift and NumLock have precedence over Alt. // The Ctrl modifier does not have a distinct table. if (!valid()) { return '\0'; } else if (shift || (caps_lock && ((scancode >= KEY_Q && scancode <= KEY_P) || (scancode >= KEY_A && scancode <= KEY_L) || (scancode >= KEY_Z && scancode <= KEY_M))) || (num_lock && scancode >= KEY_KP_7 && scancode <= KEY_KP_PERIOD)) { return ascii_tab[scancode].shift; } else if (alt()) { return ascii_tab[scancode].alt; } else { return ascii_tab[scancode].normal; } }