Переглянути джерело

LibKeyboard+keymap: Support querying the keymap via commandline

Ben Wiederhake 4 роки тому
батько
коміт
dd4e670f72

+ 1 - 1
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_data(character_map_data);
     m_character_map.set_character_map_name(character_map_name);
     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);
 }
 }
 
 
 }
 }

+ 29 - 3
Userland/Libraries/LibKeyboard/CharacterMap.cpp

@@ -33,17 +33,23 @@
 
 
 namespace Keyboard {
 namespace Keyboard {
 
 
-CharacterMap::CharacterMap(const String& file_name)
+CharacterMap::CharacterMap(const String& map_name)
 {
 {
 #ifdef KERNEL
 #ifdef KERNEL
     m_character_map_data = default_character_map;
     m_character_map_data = default_character_map;
 #else
 #else
-    auto result = CharacterMapFile::load_from_file(file_name);
+    auto result = CharacterMapFile::load_from_file(map_name);
     ASSERT(result.has_value());
     ASSERT(result.has_value());
 
 
     m_character_map_data = result.value();
     m_character_map_data = result.value();
 #endif
 #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
 #ifndef KERNEL
@@ -54,6 +60,26 @@ int CharacterMap::set_system_map()
     return syscall(SC_setkeymap, &params);
     return syscall(SC_setkeymap, &params);
 }
 }
 
 
+Result<CharacterMap, OSError> 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, &params);
+    if (rc < 0) {
+        return OSError(-rc);
+    }
+
+    return CharacterMap { keymap_name, map_data };
+}
+
 #endif
 #endif
 
 
 u32 CharacterMap::get_char(KeyEvent event)
 u32 CharacterMap::get_char(KeyEvent event)

+ 7 - 1
Userland/Libraries/LibKeyboard/CharacterMap.h

@@ -26,6 +26,10 @@
 
 
 #pragma once
 #pragma once
 
 
+#ifndef KERNEL
+#    include <AK/OSError.h>
+#    include <AK/Result.h>
+#endif
 #include <AK/String.h>
 #include <AK/String.h>
 #include <Kernel/API/KeyCode.h>
 #include <Kernel/API/KeyCode.h>
 #include <LibKeyboard/CharacterMapData.h>
 #include <LibKeyboard/CharacterMapData.h>
@@ -35,10 +39,12 @@ namespace Keyboard {
 class CharacterMap {
 class CharacterMap {
 
 
 public:
 public:
-    CharacterMap(const String& file_name);
+    CharacterMap(const String& map_name);
+    CharacterMap(const String& map_name, const CharacterMapData& map_data);
 
 
 #ifndef KERNEL
 #ifndef KERNEL
     int set_system_map();
     int set_system_map();
+    static Result<CharacterMap, OSError> fetch_system_map();
 #endif
 #endif
 
 
     u32 get_char(KeyEvent);
     u32 get_char(KeyEvent);

+ 15 - 2
Userland/Utilities/keymap.cpp

@@ -49,13 +49,26 @@ int main(int argc, char** argv)
 
 
     const char* path = nullptr;
     const char* path = nullptr;
     Core::ArgsParser args_parser;
     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);
     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);
     Keyboard::CharacterMap character_map(path);
     int rc = character_map.set_system_map();
     int rc = character_map.set_system_map();
     if (rc != 0)
     if (rc != 0)
-        fprintf(stderr, "%s\n", strerror(-rc));
+        perror("setkeymap");
 
 
     return rc;
     return rc;
 }
 }