You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
4.1 KiB
C++
119 lines
4.1 KiB
C++
#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;
|
|
}
|
|
}
|