tools: add compose tool for Compose debugging
Not very useful so not exposed in xkbcli. Signed-off-by: Ran Benita <ran@unusedvar.com>master
parent
1915632e06
commit
b6aadd57d9
|
@ -437,6 +437,11 @@ if build_tools
|
|||
c_args: ['-DENABLE_PRIVATE_APIS'],
|
||||
include_directories: [include_directories('src', 'include')],
|
||||
install: false)
|
||||
executable('compose',
|
||||
'tools/compose.c',
|
||||
dependencies: tools_dep,
|
||||
include_directories: [include_directories('src', 'include')],
|
||||
install: false)
|
||||
configh_data.set10('HAVE_XKBCLI_COMPILE_KEYMAP', true)
|
||||
executable('xkbcli-how-to-type',
|
||||
'tools/how-to-type.c',
|
||||
|
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
* Copyright © 2021 Ran Benita <ran@unusedvar.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 <getopt.h>
|
||||
#include <locale.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "xkbcommon/xkbcommon.h"
|
||||
#include "xkbcommon/xkbcommon-compose.h"
|
||||
|
||||
static void
|
||||
usage(FILE *fp, char *progname)
|
||||
{
|
||||
fprintf(fp,
|
||||
"Usage: %s [--locale LOCALE | --locale-from-env | --locale-from-setlocale]\n",
|
||||
progname);
|
||||
fprintf(fp,
|
||||
" --locale - specify the locale directly\n"
|
||||
" --locale-from-env - get the locale from the LC_ALL/LC_CTYPE/LANG environment variables (falling back to C)\n"
|
||||
" --locale-from-setlocale - get the locale using setlocale(3)\n"
|
||||
);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int ret = EXIT_FAILURE;
|
||||
struct xkb_context *ctx = NULL;
|
||||
struct xkb_compose_table *compose_table = NULL;
|
||||
const char *locale = NULL;
|
||||
enum options {
|
||||
OPT_LOCALE,
|
||||
OPT_LOCALE_FROM_ENV,
|
||||
OPT_LOCALE_FROM_SETLOCALE,
|
||||
};
|
||||
static struct option opts[] = {
|
||||
{"locale", required_argument, 0, OPT_LOCALE},
|
||||
{"locale-from-env", no_argument, 0, OPT_LOCALE_FROM_ENV},
|
||||
{"locale-from-setlocale", no_argument, 0, OPT_LOCALE_FROM_SETLOCALE},
|
||||
{0, 0, 0, 0},
|
||||
};
|
||||
|
||||
setlocale(LC_ALL, "");
|
||||
|
||||
while (1) {
|
||||
int opt;
|
||||
int option_index = 0;
|
||||
|
||||
opt = getopt_long(argc, argv, "h", opts, &option_index);
|
||||
if (opt == -1)
|
||||
break;
|
||||
|
||||
switch (opt) {
|
||||
case OPT_LOCALE:
|
||||
locale = optarg;
|
||||
break;
|
||||
case OPT_LOCALE_FROM_ENV:
|
||||
locale = getenv("LC_ALL");
|
||||
if (!locale)
|
||||
locale = getenv("LC_CTYPE");
|
||||
if (!locale)
|
||||
locale = getenv("LANG");
|
||||
if (!locale)
|
||||
locale = "C";
|
||||
break;
|
||||
case OPT_LOCALE_FROM_SETLOCALE:
|
||||
locale = setlocale(LC_CTYPE, NULL);
|
||||
break;
|
||||
case 'h':
|
||||
usage(stdout, argv[0]);
|
||||
return EXIT_SUCCESS;
|
||||
case '?':
|
||||
usage(stderr, argv[0]);
|
||||
return EXIT_INVALID_USAGE;
|
||||
}
|
||||
}
|
||||
if (locale == NULL) {
|
||||
usage(stderr, argv[0]);
|
||||
return EXIT_INVALID_USAGE;
|
||||
}
|
||||
|
||||
ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
||||
if (!ctx) {
|
||||
fprintf(stderr, "Couldn't create xkb context\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
compose_table =
|
||||
xkb_compose_table_new_from_locale(ctx, locale,
|
||||
XKB_COMPOSE_COMPILE_NO_FLAGS);
|
||||
if (!compose_table) {
|
||||
fprintf(stderr, "Couldn't create compose from locale\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
printf("Compiled successfully from locale %s\n", locale);
|
||||
|
||||
out:
|
||||
xkb_compose_table_unref(compose_table);
|
||||
xkb_context_unref(ctx);
|
||||
|
||||
return ret;
|
||||
}
|
Loading…
Reference in New Issue