This commit is contained in:
Niklas Gollenstede
2025-10-31 22:37:36 +01:00
commit 174fe17e89
197 changed files with 79558 additions and 0 deletions

121
kernel/object/key.cc Normal file
View 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;
}
}