mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 20:27:35 +00:00
LibKeyboard+keymap: Support querying the keymap via commandline
This commit is contained in:
parent
a2c21a55e1
commit
dd4e670f72
4 changed files with 52 additions and 7 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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, ¶ms);
|
return syscall(SC_setkeymap, ¶ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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, ¶ms);
|
||||||
|
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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue