keymap.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibCore/ArgsParser.h>
  7. #include <LibCore/ConfigFile.h>
  8. #include <LibKeyboard/CharacterMap.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <unistd.h>
  12. int main(int argc, char** argv)
  13. {
  14. if (pledge("stdio setkeymap getkeymap rpath wpath cpath", nullptr) < 0) {
  15. perror("pledge");
  16. return 1;
  17. }
  18. if (unveil("/res/keymaps", "r") < 0) {
  19. perror("unveil");
  20. return 1;
  21. }
  22. if (unveil("/etc/Keyboard.ini", "rwc") < 0) {
  23. perror("unveil /etc/Keyboard.ini");
  24. return 1;
  25. }
  26. const char* path = nullptr;
  27. Core::ArgsParser args_parser;
  28. args_parser.add_positional_argument(path, "The mapping file to be used", "file", Core::ArgsParser::Required::No);
  29. args_parser.parse(argc, argv);
  30. if (path && path[0] == '/') {
  31. if (unveil(path, "r") < 0) {
  32. perror("unveil path");
  33. return 1;
  34. }
  35. }
  36. if (unveil(nullptr, nullptr) < 0) {
  37. perror("unveil");
  38. return 1;
  39. }
  40. if (!path) {
  41. auto keymap = Keyboard::CharacterMap::fetch_system_map();
  42. if (keymap.is_error()) {
  43. warnln("getkeymap: {}", keymap.error());
  44. return 1;
  45. }
  46. outln("{}", keymap.value().character_map_name());
  47. return 0;
  48. }
  49. auto character_map = Keyboard::CharacterMap::load_from_file(path);
  50. if (!character_map.has_value()) {
  51. warnln("Cannot read keymap {}", path);
  52. warnln("Hint: Must be either a keymap name (e.g. 'en-us') or a full path.");
  53. return 1;
  54. }
  55. int rc = character_map.value().set_system_map();
  56. if (rc != 0) {
  57. perror("setkeymap");
  58. return rc;
  59. }
  60. auto mapper_config(Core::ConfigFile::open("/etc/Keyboard.ini"));
  61. mapper_config->write_entry("Mapping", "Keymap", path);
  62. mapper_config->sync();
  63. return rc;
  64. }