mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 19:37:34 +00:00
Kernel: KeyboardDevice, remove char mapping logic
Remove char mapping logic and constant character map.
This commit is contained in:
parent
f4d14c42d0
commit
b4577ffcf3
4 changed files with 31 additions and 246 deletions
|
@ -144,11 +144,17 @@ set(VT_SOURCES
|
||||||
../Libraries/LibVT/Line.cpp
|
../Libraries/LibVT/Line.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
set(KEYBOARD_SOURCES
|
||||||
|
../Libraries/LibKeyboard/CharacterMap.cpp
|
||||||
|
)
|
||||||
|
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
${KERNEL_SOURCES}
|
${KERNEL_SOURCES}
|
||||||
${AK_SOURCES}
|
${AK_SOURCES}
|
||||||
${ELF_SOURCES}
|
${ELF_SOURCES}
|
||||||
${VT_SOURCES}
|
${VT_SOURCES}
|
||||||
|
${KEYBOARD_SOURCES}
|
||||||
)
|
)
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DKERNEL")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DKERNEL")
|
||||||
|
|
|
@ -46,205 +46,6 @@ namespace Kernel {
|
||||||
#define I8042_MOUSE_BUFFER 0x20
|
#define I8042_MOUSE_BUFFER 0x20
|
||||||
#define I8042_KEYBOARD_BUFFER 0x00
|
#define I8042_KEYBOARD_BUFFER 0x00
|
||||||
|
|
||||||
char* map;
|
|
||||||
char* shift_map;
|
|
||||||
char* alt_map;
|
|
||||||
char* altgr_map;
|
|
||||||
|
|
||||||
static const char en_map[0x80] = {
|
|
||||||
0,
|
|
||||||
'\033',
|
|
||||||
'1',
|
|
||||||
'2',
|
|
||||||
'3',
|
|
||||||
'4',
|
|
||||||
'5',
|
|
||||||
'6',
|
|
||||||
'7',
|
|
||||||
'8',
|
|
||||||
'9',
|
|
||||||
'0',
|
|
||||||
'-',
|
|
||||||
'=',
|
|
||||||
0x08,
|
|
||||||
'\t',
|
|
||||||
'q',
|
|
||||||
'w',
|
|
||||||
'e',
|
|
||||||
'r',
|
|
||||||
't',
|
|
||||||
'y',
|
|
||||||
'u',
|
|
||||||
'i',
|
|
||||||
'o',
|
|
||||||
'p',
|
|
||||||
'[',
|
|
||||||
']',
|
|
||||||
'\n',
|
|
||||||
0,
|
|
||||||
'a',
|
|
||||||
's',
|
|
||||||
'd',
|
|
||||||
'f',
|
|
||||||
'g',
|
|
||||||
'h',
|
|
||||||
'j',
|
|
||||||
'k',
|
|
||||||
'l',
|
|
||||||
';',
|
|
||||||
'\'',
|
|
||||||
'`',
|
|
||||||
0,
|
|
||||||
'\\',
|
|
||||||
'z',
|
|
||||||
'x',
|
|
||||||
'c',
|
|
||||||
'v',
|
|
||||||
'b',
|
|
||||||
'n',
|
|
||||||
'm',
|
|
||||||
',',
|
|
||||||
'.',
|
|
||||||
'/',
|
|
||||||
0,
|
|
||||||
'*',
|
|
||||||
0,
|
|
||||||
' ',
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
//60
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
//70
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
'-',
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
'+',
|
|
||||||
0,
|
|
||||||
//80
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
'\\',
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char en_shift_map[0x80] = {
|
|
||||||
0,
|
|
||||||
'\033',
|
|
||||||
'!',
|
|
||||||
'@',
|
|
||||||
'#',
|
|
||||||
'$',
|
|
||||||
'%',
|
|
||||||
'^',
|
|
||||||
'&',
|
|
||||||
'*',
|
|
||||||
'(',
|
|
||||||
')',
|
|
||||||
'_',
|
|
||||||
'+',
|
|
||||||
0x08,
|
|
||||||
'\t',
|
|
||||||
'Q',
|
|
||||||
'W',
|
|
||||||
'E',
|
|
||||||
'R',
|
|
||||||
'T',
|
|
||||||
'Y',
|
|
||||||
'U',
|
|
||||||
'I',
|
|
||||||
'O',
|
|
||||||
'P',
|
|
||||||
'{',
|
|
||||||
'}',
|
|
||||||
'\n',
|
|
||||||
0,
|
|
||||||
'A',
|
|
||||||
'S',
|
|
||||||
'D',
|
|
||||||
'F',
|
|
||||||
'G',
|
|
||||||
'H',
|
|
||||||
'J',
|
|
||||||
'K',
|
|
||||||
'L',
|
|
||||||
':',
|
|
||||||
'"',
|
|
||||||
'~',
|
|
||||||
0,
|
|
||||||
'|',
|
|
||||||
'Z',
|
|
||||||
'X',
|
|
||||||
'C',
|
|
||||||
'V',
|
|
||||||
'B',
|
|
||||||
'N',
|
|
||||||
'M',
|
|
||||||
'<',
|
|
||||||
'>',
|
|
||||||
'?',
|
|
||||||
0,
|
|
||||||
'*',
|
|
||||||
0,
|
|
||||||
' ',
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
//60
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
//70
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
'-',
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
'+',
|
|
||||||
0,
|
|
||||||
//80
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
'|',
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char numpad_map[13] = { '7', '8', '9', 0, '4', '5', '6', 0, '1', '2', '3', '0', ',' };
|
|
||||||
|
|
||||||
static const KeyCode unshifted_key_map[0x80] = {
|
static const KeyCode unshifted_key_map[0x80] = {
|
||||||
Key_Invalid,
|
Key_Invalid,
|
||||||
Key_Escape,
|
Key_Escape,
|
||||||
|
@ -437,28 +238,20 @@ static const KeyCode shifted_key_map[0x100] = {
|
||||||
|
|
||||||
static const KeyCode numpad_key_map[13] = { Key_7, Key_8, Key_9, Key_Invalid, Key_4, Key_5, Key_6, Key_Invalid, Key_1, Key_2, Key_3, Key_0, Key_Comma };
|
static const KeyCode numpad_key_map[13] = { Key_7, Key_8, Key_9, Key_Invalid, Key_4, Key_5, Key_6, Key_Invalid, Key_1, Key_2, Key_3, Key_0, Key_Comma };
|
||||||
|
|
||||||
void KeyboardDevice::key_state_changed(u8 raw, bool pressed)
|
void KeyboardDevice::key_state_changed(u8 scan_code, bool pressed)
|
||||||
{
|
{
|
||||||
KeyCode key = (m_modifiers & Mod_Shift) ? shifted_key_map[raw] : unshifted_key_map[raw];
|
KeyCode key = (m_modifiers & Mod_Shift) ? shifted_key_map[scan_code] : unshifted_key_map[scan_code];
|
||||||
char character = (m_modifiers & Mod_Shift) ? shift_map[raw] : (m_modifiers & Mod_Alt) ? alt_map[raw] : (m_modifiers & Mod_AltGr) ? altgr_map[raw] : map[raw];
|
|
||||||
|
|
||||||
if (key == Key_NumLock && pressed)
|
if (key == Key_NumLock && pressed)
|
||||||
m_num_lock_on = !m_num_lock_on;
|
m_num_lock_on = !m_num_lock_on;
|
||||||
|
|
||||||
if (m_num_lock_on && !m_has_e0_prefix) {
|
if (m_num_lock_on && !m_has_e0_prefix) {
|
||||||
if (raw >= 0x47 && raw <= 0x53) {
|
if (scan_code >= 0x47 && scan_code <= 0x53) {
|
||||||
u8 index = raw - 0x47;
|
u8 index = scan_code - 0x47;
|
||||||
KeyCode newKey = numpad_key_map[index];
|
KeyCode newKey = numpad_key_map[index];
|
||||||
|
|
||||||
if (newKey != Key_Invalid) {
|
if (newKey != Key_Invalid) {
|
||||||
key = newKey;
|
key = newKey;
|
||||||
character = numpad_map[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (m_has_e0_prefix) {
|
|
||||||
if (key == Key_Slash) {
|
|
||||||
character = '/'; // On Turkish-QWERTY Keyboard Key_Slash mapped to '.' char, if e0 prefix is true remap to '/' char
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -466,22 +259,19 @@ void KeyboardDevice::key_state_changed(u8 raw, bool pressed)
|
||||||
if (key == Key_CapsLock && pressed)
|
if (key == Key_CapsLock && pressed)
|
||||||
m_caps_lock_on = !m_caps_lock_on;
|
m_caps_lock_on = !m_caps_lock_on;
|
||||||
|
|
||||||
if (m_caps_lock_on && (m_modifiers == 0 || m_modifiers == Mod_Shift)) {
|
|
||||||
if (character >= 'a' && character <= 'z')
|
|
||||||
character &= ~0x20;
|
|
||||||
else if (character >= 'A' && character <= 'Z')
|
|
||||||
character |= 0x20;
|
|
||||||
}
|
|
||||||
|
|
||||||
Event event;
|
Event event;
|
||||||
event.key = key;
|
event.key = key;
|
||||||
event.scancode = m_has_e0_prefix ? 0xe000 + raw : raw;
|
event.scancode = m_has_e0_prefix ? 0xe000 + scan_code : scan_code;
|
||||||
event.character = static_cast<u8>(character);
|
|
||||||
event.flags = m_modifiers;
|
event.flags = m_modifiers;
|
||||||
|
event.e0_prefix = m_has_e0_prefix;
|
||||||
|
event.caps_lock_on = m_caps_lock_on;
|
||||||
|
event.character = m_character_map.get_char(event);
|
||||||
|
|
||||||
if (pressed)
|
if (pressed)
|
||||||
event.flags |= Is_Press;
|
event.flags |= Is_Press;
|
||||||
if (m_client)
|
if (m_client)
|
||||||
m_client->on_key_pressed(event);
|
m_client->on_key_pressed(event);
|
||||||
|
|
||||||
m_queue.enqueue(event);
|
m_queue.enqueue(event);
|
||||||
|
|
||||||
m_has_e0_prefix = false;
|
m_has_e0_prefix = false;
|
||||||
|
@ -528,12 +318,12 @@ void KeyboardDevice::handle_irq(const RegisterState&)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (m_modifiers & Mod_Alt) {
|
if (m_modifiers & Mod_Alt) {
|
||||||
switch (map[ch]) {
|
switch (ch) {
|
||||||
case '1':
|
case 0x02: // 1
|
||||||
case '2':
|
case 0x03: // 2
|
||||||
case '3':
|
case 0x04: // 3
|
||||||
case '4':
|
case 0x05: // 4
|
||||||
VirtualConsole::switch_to(map[ch] - '0' - 1);
|
VirtualConsole::switch_to(ch - 0x02);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
key_state_changed(ch, pressed);
|
key_state_changed(ch, pressed);
|
||||||
|
@ -560,8 +350,6 @@ KeyboardDevice::KeyboardDevice()
|
||||||
{
|
{
|
||||||
s_the = this;
|
s_the = this;
|
||||||
|
|
||||||
KeyboardDevice::set_maps(en_map, en_shift_map, en_map, en_map);
|
|
||||||
|
|
||||||
// Empty the buffer of any pending data.
|
// Empty the buffer of any pending data.
|
||||||
// I don't care what you've been pressing until now!
|
// I don't care what you've been pressing until now!
|
||||||
while (IO::in8(I8042_STATUS) & I8042_BUFFER_FULL)
|
while (IO::in8(I8042_STATUS) & I8042_BUFFER_FULL)
|
||||||
|
@ -604,24 +392,10 @@ KeyboardClient::~KeyboardClient()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void KeyboardDevice::set_maps(const char* n_map, const char* n_shift_map, const char* n_alt_map, const char* n_altgr_map)
|
void KeyboardDevice::set_maps(Keyboard::CharacterMapData character_map_data)
|
||||||
{
|
{
|
||||||
kfree(map);
|
m_character_map.set_character_map_data(character_map_data);
|
||||||
kfree(shift_map);
|
dbg() << "New Character map passing to client.";
|
||||||
kfree(alt_map);
|
|
||||||
kfree(altgr_map);
|
|
||||||
|
|
||||||
map = (char*)kmalloc(0x80);
|
|
||||||
shift_map = (char*)kmalloc(0x80);
|
|
||||||
alt_map = (char*)kmalloc(0x80);
|
|
||||||
altgr_map = (char*)kmalloc(0x80);
|
|
||||||
|
|
||||||
for (int i = 0; i < 0x80; i++) {
|
|
||||||
map[i] = n_map[i];
|
|
||||||
shift_map[i] = n_shift_map[i];
|
|
||||||
alt_map[i] = n_alt_map[i];
|
|
||||||
altgr_map[i] = n_altgr_map[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <Kernel/Devices/CharacterDevice.h>
|
#include <Kernel/Devices/CharacterDevice.h>
|
||||||
#include <Kernel/Interrupts/IRQHandler.h>
|
#include <Kernel/Interrupts/IRQHandler.h>
|
||||||
#include <Kernel/KeyCode.h>
|
#include <Kernel/KeyCode.h>
|
||||||
|
#include <LibKeyboard/CharacterMap.h>
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
|
@ -49,7 +50,7 @@ public:
|
||||||
KeyboardDevice();
|
KeyboardDevice();
|
||||||
|
|
||||||
void set_client(KeyboardClient* client) { m_client = client; }
|
void set_client(KeyboardClient* client) { m_client = client; }
|
||||||
void set_maps(const char* n_map, const char* n_shift_map, const char* n_alt_map, const char* n_altgr_map);
|
void set_maps(Keyboard::CharacterMapData character_map);
|
||||||
|
|
||||||
// ^CharacterDevice
|
// ^CharacterDevice
|
||||||
virtual ssize_t read(FileDescription&, size_t, u8* buffer, ssize_t) override;
|
virtual ssize_t read(FileDescription&, size_t, u8* buffer, ssize_t) override;
|
||||||
|
@ -81,6 +82,8 @@ private:
|
||||||
bool m_caps_lock_on { false };
|
bool m_caps_lock_on { false };
|
||||||
bool m_num_lock_on { false };
|
bool m_num_lock_on { false };
|
||||||
bool m_has_e0_prefix { false };
|
bool m_has_e0_prefix { false };
|
||||||
|
|
||||||
|
Keyboard::CharacterMap m_character_map = Keyboard::CharacterMap("en");
|
||||||
};
|
};
|
||||||
|
|
||||||
class KeyboardClient {
|
class KeyboardClient {
|
||||||
|
|
|
@ -163,6 +163,8 @@ struct KeyEvent {
|
||||||
u32 scancode { 0 };
|
u32 scancode { 0 };
|
||||||
u8 character { 0 };
|
u8 character { 0 };
|
||||||
u8 flags { 0 };
|
u8 flags { 0 };
|
||||||
|
bool caps_lock_on { false };
|
||||||
|
bool e0_prefix { false };
|
||||||
bool alt() const { return flags & Mod_Alt; }
|
bool alt() const { return flags & Mod_Alt; }
|
||||||
bool ctrl() const { return flags & Mod_Ctrl; }
|
bool ctrl() const { return flags & Mod_Ctrl; }
|
||||||
bool shift() const { return flags & Mod_Shift; }
|
bool shift() const { return flags & Mod_Shift; }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue