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>master
parent
00bb7cd36d
commit
fc2d4fa2ab
|
@ -521,7 +521,6 @@ tools_dep = declare_dependency(
|
||||||
|
|
||||||
if cc.has_header_symbol('getopt.h', 'getopt_long', prefix: '#define _GNU_SOURCE')
|
if cc.has_header_symbol('getopt.h', 'getopt_long', prefix: '#define _GNU_SOURCE')
|
||||||
executable('xkbcommon-rmlvo-to-keymap', 'tools/rmlvo-to-keymap.c', dependencies: tools_dep)
|
executable('xkbcommon-rmlvo-to-keymap', 'tools/rmlvo-to-keymap.c', dependencies: tools_dep)
|
||||||
executable('xkbcommon-print-compiled-keymap', 'tools/print-compiled-keymap.c', dependencies: tools_dep)
|
|
||||||
executable('xkbcommon-how-to-type', 'tools/how-to-type.c', dependencies: tools_dep)
|
executable('xkbcommon-how-to-type', 'tools/how-to-type.c', dependencies: tools_dep)
|
||||||
endif
|
endif
|
||||||
if cc.has_header('linux/input.h')
|
if cc.has_header('linux/input.h')
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -41,6 +41,7 @@ static bool verbose = false;
|
||||||
static enum output_format {
|
static enum output_format {
|
||||||
FORMAT_KEYMAP,
|
FORMAT_KEYMAP,
|
||||||
FORMAT_KCCGST,
|
FORMAT_KCCGST,
|
||||||
|
FORMAT_KEYMAP_FROM_XKB,
|
||||||
} output_format = FORMAT_KEYMAP;
|
} output_format = FORMAT_KEYMAP;
|
||||||
static darray(const char *) includes;
|
static darray(const char *) includes;
|
||||||
|
|
||||||
|
@ -56,6 +57,9 @@ usage(char **argv)
|
||||||
" Enable verbose debugging output\n"
|
" Enable verbose debugging output\n"
|
||||||
" --kccgst\n"
|
" --kccgst\n"
|
||||||
" Print a keymap which only includes the KcCGST component names instead of the full keymap\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"
|
" --include\n"
|
||||||
" Add the given path to the include path list. This option is\n"
|
" Add the given path to the include path list. This option is\n"
|
||||||
" order-dependent, include paths given first are searched first.\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 {
|
enum options {
|
||||||
OPT_VERBOSE,
|
OPT_VERBOSE,
|
||||||
OPT_KCCGST,
|
OPT_KCCGST,
|
||||||
|
OPT_FROM_XKB,
|
||||||
OPT_INCLUDE,
|
OPT_INCLUDE,
|
||||||
OPT_INCLUDE_DEFAULTS,
|
OPT_INCLUDE_DEFAULTS,
|
||||||
OPT_RULES,
|
OPT_RULES,
|
||||||
|
@ -103,6 +108,7 @@ parse_options(int argc, char **argv, struct xkb_rule_names *names)
|
||||||
{"help", no_argument, 0, 'h'},
|
{"help", no_argument, 0, 'h'},
|
||||||
{"verbose", no_argument, 0, OPT_VERBOSE},
|
{"verbose", no_argument, 0, OPT_VERBOSE},
|
||||||
{"kccgst", no_argument, 0, OPT_KCCGST},
|
{"kccgst", no_argument, 0, OPT_KCCGST},
|
||||||
|
{"from-xkb", no_argument, 0, OPT_FROM_XKB},
|
||||||
{"include", required_argument, 0, OPT_INCLUDE},
|
{"include", required_argument, 0, OPT_INCLUDE},
|
||||||
{"include-defaults", no_argument, 0, OPT_INCLUDE_DEFAULTS},
|
{"include-defaults", no_argument, 0, OPT_INCLUDE_DEFAULTS},
|
||||||
{"rules", required_argument, 0, OPT_RULES},
|
{"rules", required_argument, 0, OPT_RULES},
|
||||||
|
@ -130,6 +136,9 @@ parse_options(int argc, char **argv, struct xkb_rule_names *names)
|
||||||
case OPT_KCCGST:
|
case OPT_KCCGST:
|
||||||
output_format = FORMAT_KCCGST;
|
output_format = FORMAT_KCCGST;
|
||||||
break;
|
break;
|
||||||
|
case OPT_FROM_XKB:
|
||||||
|
output_format = FORMAT_KEYMAP_FROM_XKB;
|
||||||
|
break;
|
||||||
case OPT_INCLUDE:
|
case OPT_INCLUDE:
|
||||||
darray_append(includes, optarg);
|
darray_append(includes, optarg);
|
||||||
break;
|
break;
|
||||||
|
@ -199,6 +208,65 @@ print_keymap(struct xkb_context *ctx, const struct xkb_rule_names *rmlvo)
|
||||||
return true;
|
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
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
@ -244,6 +312,8 @@ main(int argc, char **argv)
|
||||||
rc = print_keymap(ctx, &names) ? EXIT_SUCCESS : EXIT_FAILURE;
|
rc = print_keymap(ctx, &names) ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
} else if (output_format == FORMAT_KCCGST) {
|
} else if (output_format == FORMAT_KCCGST) {
|
||||||
rc = print_kccgst(ctx, &names) ? EXIT_SUCCESS : EXIT_FAILURE;
|
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);
|
xkb_context_unref(ctx);
|
||||||
|
|
Loading…
Reference in New Issue