Handout
This commit is contained in:
121
kernel/object/key.cc
Normal file
121
kernel/object/key.cc
Normal file
@@ -0,0 +1,121 @@
|
||||
#include "key.h"
|
||||
|
||||
// Character table for scan codes for US keyboards
|
||||
static const struct {
|
||||
unsigned char normal; // Character without modifiers
|
||||
unsigned char shift; // With pressed Shift, Capslock, or in Numpad
|
||||
unsigned char alt; // With pressed Alt key
|
||||
} ascii_tab[static_cast<size_t>(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 >= Scancode::KEY_Q && scancode <= Scancode::KEY_P) ||
|
||||
(scancode >= Scancode::KEY_A && scancode <= Scancode::KEY_L) ||
|
||||
(scancode >= Scancode::KEY_Z &&
|
||||
scancode <= Scancode::KEY_M))) ||
|
||||
(num_lock && scancode >= Scancode::KEY_KP_7 &&
|
||||
scancode <= Scancode::KEY_KP_PERIOD)) {
|
||||
return ascii_tab[static_cast<size_t>(scancode)].shift;
|
||||
} else if (alt()) {
|
||||
return ascii_tab[static_cast<size_t>(scancode)].alt;
|
||||
} else {
|
||||
return ascii_tab[static_cast<size_t>(scancode)].normal;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user