1
Fork 0
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:
Hüseyin ASLITÜRK 2020-06-10 11:22:31 +03:00 committed by Andreas Kling
parent f4d14c42d0
commit b4577ffcf3
4 changed files with 31 additions and 246 deletions

View file

@ -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")

View file

@ -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];
}
} }
} }

View file

@ -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 {

View file

@ -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; }