diff --git a/Kernel/Devices/KeyboardDevice.cpp b/Kernel/Devices/KeyboardDevice.cpp index 3708275f16..d1eeeaa1bd 100644 --- a/Kernel/Devices/KeyboardDevice.cpp +++ b/Kernel/Devices/KeyboardDevice.cpp @@ -407,7 +407,7 @@ void KeyboardDevice::set_maps(const Keyboard::CharacterMapData& character_map_da { m_character_map.set_character_map_data(character_map_data); m_character_map.set_character_map_name(character_map_name); - dbgln("New Character map '{}' passing to client.", character_map_name); + dbgln("New Character map '{}' passed in by client.", character_map_name); } } diff --git a/Userland/Libraries/LibKeyboard/CharacterMap.cpp b/Userland/Libraries/LibKeyboard/CharacterMap.cpp index 9d5b186383..3ea6604df2 100644 --- a/Userland/Libraries/LibKeyboard/CharacterMap.cpp +++ b/Userland/Libraries/LibKeyboard/CharacterMap.cpp @@ -33,17 +33,23 @@ namespace Keyboard { -CharacterMap::CharacterMap(const String& file_name) +CharacterMap::CharacterMap(const String& map_name) { #ifdef KERNEL m_character_map_data = default_character_map; #else - auto result = CharacterMapFile::load_from_file(file_name); + auto result = CharacterMapFile::load_from_file(map_name); ASSERT(result.has_value()); m_character_map_data = result.value(); #endif - m_character_map_name = file_name; + m_character_map_name = map_name; +} + +CharacterMap::CharacterMap(const String& map_name, const CharacterMapData& map_data) + : m_character_map_data(map_data) + , m_character_map_name(map_name) +{ } #ifndef KERNEL @@ -54,6 +60,26 @@ int CharacterMap::set_system_map() return syscall(SC_setkeymap, ¶ms); } +Result CharacterMap::fetch_system_map() +{ + CharacterMapData map_data; + char keymap_name[50 + 1] = { 0 }; + + Syscall::SC_getkeymap_params params { + map_data.map, map_data.shift_map, + map_data.alt_map, + map_data.altgr_map, + map_data.shift_altgr_map, + { keymap_name, sizeof(keymap_name) } + }; + int rc = syscall(SC_getkeymap, ¶ms); + if (rc < 0) { + return OSError(-rc); + } + + return CharacterMap { keymap_name, map_data }; +} + #endif u32 CharacterMap::get_char(KeyEvent event) diff --git a/Userland/Libraries/LibKeyboard/CharacterMap.h b/Userland/Libraries/LibKeyboard/CharacterMap.h index 242eac2a39..848b32a7fa 100644 --- a/Userland/Libraries/LibKeyboard/CharacterMap.h +++ b/Userland/Libraries/LibKeyboard/CharacterMap.h @@ -26,6 +26,10 @@ #pragma once +#ifndef KERNEL +# include +# include +#endif #include #include #include @@ -35,10 +39,12 @@ namespace Keyboard { class CharacterMap { public: - CharacterMap(const String& file_name); + CharacterMap(const String& map_name); + CharacterMap(const String& map_name, const CharacterMapData& map_data); #ifndef KERNEL int set_system_map(); + static Result fetch_system_map(); #endif u32 get_char(KeyEvent); diff --git a/Userland/Utilities/keymap.cpp b/Userland/Utilities/keymap.cpp index c057187015..f32d27f2c3 100644 --- a/Userland/Utilities/keymap.cpp +++ b/Userland/Utilities/keymap.cpp @@ -49,13 +49,26 @@ int main(int argc, char** argv) const char* path = nullptr; Core::ArgsParser args_parser; - args_parser.add_positional_argument(path, "The mapping file to be used", "file"); + args_parser.add_positional_argument(path, "The mapping file to be used", "file", Core::ArgsParser::Required::No); args_parser.parse(argc, argv); + dbgln("path is at {:p}, and contains {}", path, path); + + if (!path) { + auto keymap = Keyboard::CharacterMap::fetch_system_map(); + if (keymap.is_error()) { + warnln("getkeymap: {}", keymap.error()); + return 1; + } + + outln("{}", keymap.value().character_map_name()); + return 0; + } + Keyboard::CharacterMap character_map(path); int rc = character_map.set_system_map(); if (rc != 0) - fprintf(stderr, "%s\n", strerror(-rc)); + perror("setkeymap"); return rc; }