diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index 26a14416d1..3abfd91e16 100644 --- a/Kernel/API/Syscall.h +++ b/Kernel/API/Syscall.h @@ -156,6 +156,7 @@ namespace Kernel { S(get_process_name) \ S(fchdir) \ S(getrandom) \ + S(getkeymap) \ S(setkeymap) \ S(clock_gettime) \ S(clock_settime) \ @@ -330,6 +331,15 @@ struct SC_setkeymap_params { StringArgument map_name; }; +struct SC_getkeymap_params { + u32* map; + u32* shift_map; + u32* alt_map; + u32* altgr_map; + u32* shift_altgr_map; + MutableBufferArgument map_name; +}; + struct SC_create_thread_params { unsigned int m_detach_state = 0; // JOINABLE or DETACHED int m_schedule_priority = 30; // THREAD_PRIORITY_NORMAL diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index ce4a8d65ea..40152469cf 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -132,6 +132,7 @@ set(KERNEL_SOURCES Syscalls/getuid.cpp Syscalls/hostname.cpp Syscalls/ioctl.cpp + Syscalls/keymap.cpp Syscalls/kill.cpp Syscalls/link.cpp Syscalls/lseek.cpp @@ -157,7 +158,6 @@ set(KERNEL_SOURCES Syscalls/sched.cpp Syscalls/select.cpp Syscalls/sendfd.cpp - Syscalls/setkeymap.cpp Syscalls/setpgid.cpp Syscalls/setuid.cpp Syscalls/shutdown.cpp diff --git a/Kernel/Devices/KeyboardDevice.h b/Kernel/Devices/KeyboardDevice.h index 3bd98c9619..d358f70bf3 100644 --- a/Kernel/Devices/KeyboardDevice.h +++ b/Kernel/Devices/KeyboardDevice.h @@ -56,6 +56,7 @@ public: void set_client(KeyboardClient* client) { m_client = client; } void set_maps(const Keyboard::CharacterMapData& character_map, const String& character_map_name); + const Keyboard::CharacterMapData& character_maps() const { return m_character_map.character_map_data(); } const String keymap_name() { return m_character_map.character_map_name(); } diff --git a/Kernel/Process.h b/Kernel/Process.h index 373abe8090..039d873311 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -344,6 +344,7 @@ public: int sys$reboot(); int sys$realpath(Userspace); ssize_t sys$getrandom(Userspace, size_t, unsigned int); + int sys$getkeymap(Userspace); int sys$setkeymap(Userspace); int sys$module_load(Userspace path, size_t path_length); int sys$module_unload(Userspace name, size_t name_length); diff --git a/Kernel/Syscalls/setkeymap.cpp b/Kernel/Syscalls/keymap.cpp similarity index 69% rename from Kernel/Syscalls/setkeymap.cpp rename to Kernel/Syscalls/keymap.cpp index d761e3351b..2cbab8bf46 100644 --- a/Kernel/Syscalls/setkeymap.cpp +++ b/Kernel/Syscalls/keymap.cpp @@ -29,6 +29,8 @@ namespace Kernel { +constexpr size_t map_name_max_size = 50; + int Process::sys$setkeymap(Userspace user_params) { REQUIRE_PROMISE(setkeymap); @@ -57,7 +59,6 @@ int Process::sys$setkeymap(Userspace user_p if (map_name.is_error()) { return map_name.error(); } - constexpr size_t map_name_max_size = 50; if (map_name.value().length() > map_name_max_size) { return -ENAMETOOLONG; } @@ -66,4 +67,34 @@ int Process::sys$setkeymap(Userspace user_p return 0; } +int Process::sys$getkeymap(Userspace user_params) +{ + REQUIRE_PROMISE(stdio); + + Syscall::SC_getkeymap_params params; + if (!copy_from_user(¶ms, user_params)) + return -EFAULT; + + String keymap_name = KeyboardDevice::the().keymap_name(); + const Keyboard::CharacterMapData& character_maps = KeyboardDevice::the().character_maps(); + + if (!copy_to_user(params.map, character_maps.map, CHAR_MAP_SIZE * sizeof(u32))) + return -EFAULT; + if (!copy_to_user(params.shift_map, character_maps.shift_map, CHAR_MAP_SIZE * sizeof(u32))) + return -EFAULT; + if (!copy_to_user(params.alt_map, character_maps.alt_map, CHAR_MAP_SIZE * sizeof(u32))) + return -EFAULT; + if (!copy_to_user(params.altgr_map, character_maps.altgr_map, CHAR_MAP_SIZE * sizeof(u32))) + return -EFAULT; + if (!copy_to_user(params.shift_altgr_map, character_maps.shift_altgr_map, CHAR_MAP_SIZE * sizeof(u32))) + return -EFAULT; + + if (params.map_name.size < keymap_name.length()) + return -ENAMETOOLONG; + if (!copy_to_user(params.map_name.data, keymap_name.characters(), keymap_name.length())) + return -EFAULT; + + return 0; +} + } diff --git a/Userland/Libraries/LibKeyboard/CharacterMap.h b/Userland/Libraries/LibKeyboard/CharacterMap.h index 413f7b4ded..242eac2a39 100644 --- a/Userland/Libraries/LibKeyboard/CharacterMap.h +++ b/Userland/Libraries/LibKeyboard/CharacterMap.h @@ -45,6 +45,7 @@ public: void set_character_map_data(CharacterMapData character_map_data); void set_character_map_name(const String& character_map_name); + const CharacterMapData& character_map_data() const { return m_character_map_data; }; const String character_map_name(); private: