summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2020-07-07 11:43:08 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2020-07-08 15:21:19 +1000
commitfc2d4fa2aba307e5c2a3c86b1879b05c2c738dba (patch)
tree0a0cdd5278b7e98fe8f21404dfc58573e8b71f75 /tools
parent00bb7cd36d31cb3634bbf2d40c4f2216cb0566bf (diff)
downloadxorg-lib-libxkbcommon-fc2d4fa2aba307e5c2a3c86b1879b05c2c738dba.tar.gz
tools: add ability to compile from kccgst to rmlvo-to-keymap
This obsoletes the print-compiled-keymap tool though we now require that the kccgst components are passed via stdin, there is no file loading ability. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'tools')
-rw-r--r--tools/print-compiled-keymap.c128
-rw-r--r--tools/rmlvo-to-keymap.c70
2 files changed, 70 insertions, 128 deletions
diff --git a/tools/print-compiled-keymap.c b/tools/print-compiled-keymap.c
deleted file mode 100644
index 1ba648b..0000000
--- a/tools/print-compiled-keymap.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright © 2012 Ran Benita <ran234@gmail.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#include "config.h"
-
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "xkbcommon/xkbcommon.h"
-
-int
-main(int argc, char *argv[])
-{
- int ret = EXIT_FAILURE;
- int opt;
- struct xkb_context *ctx = NULL;
- struct xkb_keymap *keymap = NULL;
- const char *keymap_path = NULL;
- FILE *file = NULL;
- char *dump;
-
- while ((opt = getopt(argc, argv, "h")) != -1) {
- switch (opt) {
- case 'h':
- case '?':
- fprintf(stderr, "Usage: %s <path to keymap file>\n", argv[0]);
- exit(EXIT_FAILURE);
- }
- }
-
- if (optind >= argc) {
- fprintf(stderr, "Error: missing path to keymap file\n");
- exit(EXIT_FAILURE);
- }
-
- keymap_path = argv[optind];
-
- ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
- if (!ctx) {
- fprintf(stderr, "Couldn't create xkb context\n");
- goto out;
- }
-
- if (strcmp(keymap_path, "-") == 0) {
- FILE *tmp;
-
- tmp = tmpfile();
- if (!tmp) {
- fprintf(stderr, "Failed to create tmpfile\n");
- goto out;
- }
-
- while (true) {
- char buf[4096];
- size_t len;
-
- len = fread(buf, 1, sizeof(buf), stdin);
- if (ferror(stdin)) {
- fprintf(stderr, "Failed to read from stdin\n");
- goto out;
- }
- if (len > 0) {
- size_t wlen = fwrite(buf, 1, len, tmp);
- if (wlen != len) {
- fprintf(stderr, "Failed to write to tmpfile\n");
- goto out;
- }
- }
- if (feof(stdin))
- break;
- }
- fseek(tmp, 0, SEEK_SET);
- file = tmp;
- } else {
- file = fopen(keymap_path, "rb");
- if (!file) {
- fprintf(stderr, "Failed to open path: %s\n", keymap_path);
- goto out;
- }
- }
-
- keymap = xkb_keymap_new_from_file(ctx, file,
- XKB_KEYMAP_FORMAT_TEXT_V1, 0);
- if (!keymap) {
- fprintf(stderr, "Couldn't create xkb keymap\n");
- goto out;
- }
-
- dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
- if (!dump) {
- fprintf(stderr, "Couldn't get the keymap string\n");
- goto out;
- }
-
- fputs(dump, stdout);
-
- ret = EXIT_SUCCESS;
- free(dump);
-out:
- if (file)
- fclose(file);
- xkb_keymap_unref(keymap);
- xkb_context_unref(ctx);
- return ret;
-}
diff --git a/tools/rmlvo-to-keymap.c b/tools/rmlvo-to-keymap.c
index f645e53..4783be7 100644
--- a/tools/rmlvo-to-keymap.c
+++ b/tools/rmlvo-to-keymap.c
@@ -41,6 +41,7 @@ static bool verbose = false;
static enum output_format {
FORMAT_KEYMAP,
FORMAT_KCCGST,
+ FORMAT_KEYMAP_FROM_XKB,
} output_format = FORMAT_KEYMAP;
static darray(const char *) includes;
@@ -56,6 +57,9 @@ usage(char **argv)
" Enable verbose debugging output\n"
" --kccgst\n"
" Print a keymap which only includes the KcCGST component names instead of the full keymap\n"
+ " --from-xkb\n"
+ " Load the XKB file from stdin, ignore RMLVO options. This option\n"
+ " must not be used with --kccgst.\n"
" --include\n"
" Add the given path to the include path list. This option is\n"
" order-dependent, include paths given first are searched first.\n"
@@ -91,6 +95,7 @@ parse_options(int argc, char **argv, struct xkb_rule_names *names)
enum options {
OPT_VERBOSE,
OPT_KCCGST,
+ OPT_FROM_XKB,
OPT_INCLUDE,
OPT_INCLUDE_DEFAULTS,
OPT_RULES,
@@ -103,6 +108,7 @@ parse_options(int argc, char **argv, struct xkb_rule_names *names)
{"help", no_argument, 0, 'h'},
{"verbose", no_argument, 0, OPT_VERBOSE},
{"kccgst", no_argument, 0, OPT_KCCGST},
+ {"from-xkb", no_argument, 0, OPT_FROM_XKB},
{"include", required_argument, 0, OPT_INCLUDE},
{"include-defaults", no_argument, 0, OPT_INCLUDE_DEFAULTS},
{"rules", required_argument, 0, OPT_RULES},
@@ -130,6 +136,9 @@ parse_options(int argc, char **argv, struct xkb_rule_names *names)
case OPT_KCCGST:
output_format = FORMAT_KCCGST;
break;
+ case OPT_FROM_XKB:
+ output_format = FORMAT_KEYMAP_FROM_XKB;
+ break;
case OPT_INCLUDE:
darray_append(includes, optarg);
break;
@@ -199,6 +208,65 @@ print_keymap(struct xkb_context *ctx, const struct xkb_rule_names *rmlvo)
return true;
}
+static bool
+print_keymap_from_file(struct xkb_context *ctx)
+{
+ struct xkb_keymap *keymap = NULL;
+ char *keymap_string = NULL;
+ FILE *file = NULL;
+ bool success = false;
+
+ file = tmpfile();
+ if (!file) {
+ fprintf(stderr, "Failed to create tmpfile\n");
+ goto out;
+ }
+
+ while (true) {
+ char buf[4096];
+ size_t len;
+
+ len = fread(buf, 1, sizeof(buf), stdin);
+ if (ferror(stdin)) {
+ fprintf(stderr, "Failed to read from stdin\n");
+ goto out;
+ }
+ if (len > 0) {
+ size_t wlen = fwrite(buf, 1, len, file);
+ if (wlen != len) {
+ fprintf(stderr, "Failed to write to tmpfile\n");
+ goto out;
+ }
+ }
+ if (feof(stdin))
+ break;
+ }
+ fseek(file, 0, SEEK_SET);
+ keymap = xkb_keymap_new_from_file(ctx, file,
+ XKB_KEYMAP_FORMAT_TEXT_V1, 0);
+ if (!keymap) {
+ fprintf(stderr, "Couldn't create xkb keymap\n");
+ goto out;
+ }
+
+ keymap_string = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
+ if (!keymap_string) {
+ fprintf(stderr, "Couldn't get the keymap string\n");
+ goto out;
+ }
+
+ fputs(keymap_string, stdout);
+ success = true;
+
+out:
+ if (file)
+ fclose(file);
+ xkb_keymap_unref(keymap);
+ free(keymap_string);
+
+ return success;
+}
+
int
main(int argc, char **argv)
{
@@ -244,6 +312,8 @@ main(int argc, char **argv)
rc = print_keymap(ctx, &names) ? EXIT_SUCCESS : EXIT_FAILURE;
} else if (output_format == FORMAT_KCCGST) {
rc = print_kccgst(ctx, &names) ? EXIT_SUCCESS : EXIT_FAILURE;
+ } else if (output_format == FORMAT_KEYMAP_FROM_XKB) {
+ rc = print_keymap_from_file(ctx);
}
xkb_context_unref(ctx);