Skip to content

Commit dd4e670

Browse files
BenWiederhakeawesomekling
authored andcommitted
LibKeyboard+keymap: Support querying the keymap via commandline
1 parent a2c21a5 commit dd4e670

File tree

4 files changed

+52
-7
lines changed

4 files changed

+52
-7
lines changed

Kernel/Devices/KeyboardDevice.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ void KeyboardDevice::set_maps(const Keyboard::CharacterMapData& character_map_da
407407
{
408408
m_character_map.set_character_map_data(character_map_data);
409409
m_character_map.set_character_map_name(character_map_name);
410-
dbgln("New Character map '{}' passing to client.", character_map_name);
410+
dbgln("New Character map '{}' passed in by client.", character_map_name);
411411
}
412412

413413
}

Userland/Libraries/LibKeyboard/CharacterMap.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,23 @@
3333

3434
namespace Keyboard {
3535

36-
CharacterMap::CharacterMap(const String& file_name)
36+
CharacterMap::CharacterMap(const String& map_name)
3737
{
3838
#ifdef KERNEL
3939
m_character_map_data = default_character_map;
4040
#else
41-
auto result = CharacterMapFile::load_from_file(file_name);
41+
auto result = CharacterMapFile::load_from_file(map_name);
4242
ASSERT(result.has_value());
4343

4444
m_character_map_data = result.value();
4545
#endif
46-
m_character_map_name = file_name;
46+
m_character_map_name = map_name;
47+
}
48+
49+
CharacterMap::CharacterMap(const String& map_name, const CharacterMapData& map_data)
50+
: m_character_map_data(map_data)
51+
, m_character_map_name(map_name)
52+
{
4753
}
4854

4955
#ifndef KERNEL
@@ -54,6 +60,26 @@ int CharacterMap::set_system_map()
5460
return syscall(SC_setkeymap, &params);
5561
}
5662

63+
Result<CharacterMap, OSError> CharacterMap::fetch_system_map()
64+
{
65+
CharacterMapData map_data;
66+
char keymap_name[50 + 1] = { 0 };
67+
68+
Syscall::SC_getkeymap_params params {
69+
map_data.map, map_data.shift_map,
70+
map_data.alt_map,
71+
map_data.altgr_map,
72+
map_data.shift_altgr_map,
73+
{ keymap_name, sizeof(keymap_name) }
74+
};
75+
int rc = syscall(SC_getkeymap, &params);
76+
if (rc < 0) {
77+
return OSError(-rc);
78+
}
79+
80+
return CharacterMap { keymap_name, map_data };
81+
}
82+
5783
#endif
5884

5985
u32 CharacterMap::get_char(KeyEvent event)

Userland/Libraries/LibKeyboard/CharacterMap.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626

2727
#pragma once
2828

29+
#ifndef KERNEL
30+
# include <AK/OSError.h>
31+
# include <AK/Result.h>
32+
#endif
2933
#include <AK/String.h>
3034
#include <Kernel/API/KeyCode.h>
3135
#include <LibKeyboard/CharacterMapData.h>
@@ -35,10 +39,12 @@ namespace Keyboard {
3539
class CharacterMap {
3640

3741
public:
38-
CharacterMap(const String& file_name);
42+
CharacterMap(const String& map_name);
43+
CharacterMap(const String& map_name, const CharacterMapData& map_data);
3944

4045
#ifndef KERNEL
4146
int set_system_map();
47+
static Result<CharacterMap, OSError> fetch_system_map();
4248
#endif
4349

4450
u32 get_char(KeyEvent);

Userland/Utilities/keymap.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,26 @@ int main(int argc, char** argv)
4949

5050
const char* path = nullptr;
5151
Core::ArgsParser args_parser;
52-
args_parser.add_positional_argument(path, "The mapping file to be used", "file");
52+
args_parser.add_positional_argument(path, "The mapping file to be used", "file", Core::ArgsParser::Required::No);
5353
args_parser.parse(argc, argv);
5454

55+
dbgln("path is at {:p}, and contains {}", path, path);
56+
57+
if (!path) {
58+
auto keymap = Keyboard::CharacterMap::fetch_system_map();
59+
if (keymap.is_error()) {
60+
warnln("getkeymap: {}", keymap.error());
61+
return 1;
62+
}
63+
64+
outln("{}", keymap.value().character_map_name());
65+
return 0;
66+
}
67+
5568
Keyboard::CharacterMap character_map(path);
5669
int rc = character_map.set_system_map();
5770
if (rc != 0)
58-
fprintf(stderr, "%s\n", strerror(-rc));
71+
perror("setkeymap");
5972

6073
return rc;
6174
}

0 commit comments

Comments
 (0)