diff --git a/Libraries/LibKeyboard/CharacterMap.cpp b/Libraries/LibKeyboard/CharacterMap.cpp index 7d32883405..1374ca1911 100644 --- a/Libraries/LibKeyboard/CharacterMap.cpp +++ b/Libraries/LibKeyboard/CharacterMap.cpp @@ -26,22 +26,65 @@ #include "CharacterMap.h" #include -#include +#ifndef KERNEL +# include +#endif namespace Keyboard { CharacterMap::CharacterMap(const String& file_name) { +#ifdef KERNEL + UNUSED_PARAM(file_name); + m_character_map_data = default_character_map; +#else auto result = CharacterMapFile::load_from_file(file_name); ASSERT(result.has_value()); - m_character_map = result.value(); + m_character_map_data = result.value(); +#endif } int CharacterMap::set_system_map() { - Syscall::SC_setkeymap_params params { m_character_map.map, m_character_map.shift_map, m_character_map.alt_map, m_character_map.altgr_map }; + Syscall::SC_setkeymap_params params { m_character_map_data.map, m_character_map_data.shift_map, m_character_map_data.alt_map, m_character_map_data.altgr_map }; return syscall(SC_setkeymap, ¶ms); } +char CharacterMap::get_char(KeyEvent event) +{ + auto modifiers = event.modifiers(); + auto index = event.scancode & 0xFF; // Index is last byte of scan code. + auto caps_lock_on = event.caps_lock_on; + + char character; + if (modifiers & Mod_Shift) + character = m_character_map_data.shift_map[index]; + else if (modifiers & Mod_Alt) + character = m_character_map_data.alt_map[index]; + else if (modifiers & Mod_AltGr) + character = m_character_map_data.altgr_map[index]; + else + character = m_character_map_data.map[index]; + + if (caps_lock_on && (modifiers == 0 || modifiers == Mod_Shift)) { + if (character >= 'a' && character <= 'z') + character &= ~0x20; + else if (character >= 'A' && character <= 'Z') + character |= 0x20; + } + + if (event.e0_prefix && event.key == Key_Slash) { + // If Key_Slash (scancode = 0x35) mapped to other form "/", we fix num pad key of "/" with this case. + character = '/'; + } + + return character; +} + +void CharacterMap::set_character_map_data(CharacterMapData character_map_data) +{ + m_character_map_data = character_map_data; +} + } diff --git a/Libraries/LibKeyboard/CharacterMap.h b/Libraries/LibKeyboard/CharacterMap.h index e6ab00afda..70d42a3848 100644 --- a/Libraries/LibKeyboard/CharacterMap.h +++ b/Libraries/LibKeyboard/CharacterMap.h @@ -27,6 +27,7 @@ #pragma once #include +#include #include namespace Keyboard { @@ -37,9 +38,11 @@ public: CharacterMap(const String& file_name); int set_system_map(); + char get_char(KeyEvent); + void set_character_map_data(CharacterMapData character_map_data); private: - CharacterMapData m_character_map; + CharacterMapData m_character_map_data; }; } diff --git a/Libraries/LibKeyboard/CharacterMapData.h b/Libraries/LibKeyboard/CharacterMapData.h index deb15aaa19..7846412707 100644 --- a/Libraries/LibKeyboard/CharacterMapData.h +++ b/Libraries/LibKeyboard/CharacterMapData.h @@ -37,4 +37,53 @@ struct CharacterMapData { char altgr_map[CHAR_MAP_SIZE]; }; +// clang-format off +static const CharacterMapData default_character_map = +{ + .map = { + 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 70 80 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', 0, 0, '\\', 0, 0, 0, + + }, + + .shift_map = { + 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 70 80 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', 0, 0, '|', 0, 0, 0, + + }, + + .alt_map = { + 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 70 80 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', 0, 0, '\\', 0, 0, 0, + + }, + + .altgr_map = { + 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 70 80 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', 0, 0, '\\', 0, 0, 0, + }, +}; +// clang-format on + }