From a36f08b4c630d73b18a9ede0cf7bce70c628d400 Mon Sep 17 00:00:00 2001 From: Yuichiro Hanada Date: Thu, 21 Apr 2022 21:57:38 +0900 Subject: Uprev libxkbcommon to 1.4.0. 1. Do 'meson config -Denable-x11=false -Denable-wayland=false -Denable-docs=false' to generate config.h 2. Remove #defines in config.h for non-existing funcs 3. atom.c is modified to suppress Wreturn-type. Bug: 228955027 Test: m Change-Id: I278a58f24712b21522e6a14a2a6a3979406b40e9 (cherry picked from commit 5f097b82a17ab8d7955aa9b3c35dcb11348dc4ed) --- Android.bp | 23 +- METADATA | 11 +- NEWS | 126 + README.md | 1 + bench/.gitignore | 4 - bench/atom.c | 93 + bench/compose.c | 2 +- bench/rules.c | 3 +- bench/rulescomp.c | 2 +- config.h | 1 - config/config.h | 2 +- config/libxkbcommon.so.0.0.0.p/parser.c | 588 ++- config/libxkbcommon.so.0.0.0.p/parser.h | 8 +- doc/.gitignore | 2 - doc/keymap-format-text-v1.md | 116 +- doc/user-configuration.md | 4 +- fuzz/.gitignore | 1 - include/xkbcommon/xkbcommon-compat.h | 98 + include/xkbcommon/xkbcommon-compose.h | 500 ++ include/xkbcommon/xkbcommon-keysyms.h | 3248 +++++++++++++ include/xkbcommon/xkbcommon-names.h | 45 + include/xkbcommon/xkbcommon-x11.h | 244 + include/xkbcommon/xkbcommon.h | 1954 ++++++++ include/xkbcommon/xkbregistry.h | 782 ++++ meson.build | 156 +- meson_options.txt | 8 +- scripts/makeheader | 11 + scripts/makekeys | 40 +- scripts/map-to-def | 30 + scripts/meson-junit-report.py | 92 - scripts/perfect_hash.py | 674 +++ scripts/update-keysyms | 4 +- src/atom.c | 133 +- src/compose/parser.c | 171 +- src/compose/state.c | 31 +- src/compose/table.c | 18 +- src/compose/table.h | 77 +- src/keysym-utf.c | 6 +- src/keysym.c | 210 +- src/ks_tables.h | 7741 +++++++++++++++++-------------- src/registry.c | 46 +- src/utils.h | 1 + src/x11/keymap.c | 196 +- src/x11/util.c | 224 +- src/x11/x11-priv.h | 60 +- src/xkbcomp/.gitignore | 2 - src/xkbcomp/action.c | 9 +- src/xkbcomp/ast-build.c | 11 +- src/xkbcomp/ast.h | 1 - src/xkbcomp/compat.c | 2 +- test/.gitignore | 24 - test/compose.c | 54 +- test/data/locale/compose.dir | 944 ++++ test/data/locale/en_US.UTF-8/Compose | 5973 ++++++++++++++++++++++++ test/data/locale/locale.alias | 2482 ++++++++++ test/data/locale/locale.dir | 948 ++++ test/data/symbols/compose | 89 + test/data/sync.sh | 11 + test/keysym.c | 21 +- test/registry.c | 201 +- test/test-keysym.py | 71 + test/tool-option-parsing.py | 36 +- test/xkeyboard-config-test.py.in | 278 +- tools/compose.c | 126 + tools/how-to-type.c | 41 +- tools/interactive-evdev.c | 45 +- tools/interactive-wayland.c | 35 +- tools/interactive-x11.c | 2 +- tools/registry-list.c | 68 +- tools/xkbcli-how-to-type.1 | 5 +- tools/xkbcli-interactive-evdev.1 | 2 +- tools/xkbcli-list.1 | 8 +- tools/xkbcli.1 | 6 +- tools/xkbcli.c | 2 +- xkbcommon/xkbcommon-compat.h | 98 - xkbcommon/xkbcommon-compose.h | 500 -- xkbcommon/xkbcommon-keysyms.h | 3009 ------------ xkbcommon/xkbcommon-names.h | 45 - xkbcommon/xkbcommon-x11.h | 244 - xkbcommon/xkbcommon.h | 1951 -------- xkbcommon/xkbregistry.h | 782 ---- 81 files changed, 24572 insertions(+), 11341 deletions(-) delete mode 100644 bench/.gitignore create mode 100644 bench/atom.c delete mode 120000 config.h delete mode 100644 doc/.gitignore delete mode 100644 fuzz/.gitignore create mode 100644 include/xkbcommon/xkbcommon-compat.h create mode 100644 include/xkbcommon/xkbcommon-compose.h create mode 100644 include/xkbcommon/xkbcommon-keysyms.h create mode 100644 include/xkbcommon/xkbcommon-names.h create mode 100644 include/xkbcommon/xkbcommon-x11.h create mode 100644 include/xkbcommon/xkbcommon.h create mode 100644 include/xkbcommon/xkbregistry.h create mode 100755 scripts/map-to-def delete mode 100644 scripts/meson-junit-report.py create mode 100644 scripts/perfect_hash.py delete mode 100644 src/xkbcomp/.gitignore delete mode 100644 test/.gitignore create mode 100644 test/data/locale/compose.dir create mode 100644 test/data/locale/en_US.UTF-8/Compose create mode 100644 test/data/locale/locale.alias create mode 100644 test/data/locale/locale.dir create mode 100644 test/data/symbols/compose create mode 100755 test/test-keysym.py create mode 100644 tools/compose.c delete mode 100644 xkbcommon/xkbcommon-compat.h delete mode 100644 xkbcommon/xkbcommon-compose.h delete mode 100644 xkbcommon/xkbcommon-keysyms.h delete mode 100644 xkbcommon/xkbcommon-names.h delete mode 100644 xkbcommon/xkbcommon-x11.h delete mode 100644 xkbcommon/xkbcommon.h delete mode 100644 xkbcommon/xkbregistry.h diff --git a/Android.bp b/Android.bp index c766cd5..9803e87 100644 --- a/Android.bp +++ b/Android.bp @@ -34,6 +34,7 @@ license { name: "external_libxkbcommon_license", visibility: [":__subpackages__"], license_kinds: [ + "SPDX-license-identifier-BSD-3-Clause", "SPDX-license-identifier-GPL", "SPDX-license-identifier-GPL-2.0", "SPDX-license-identifier-GPL-3.0", @@ -71,26 +72,38 @@ cc_library_static { "src/atom.c", "src/context.c", "src/context-priv.c", - "src/keysym.c", - "src/keysym-utf.c", "src/keymap.c", "src/keymap-priv.c", + "src/keysym.c", + "src/keysym-utf.c", + "src/registry.c", "src/state.c", "src/text.c", "src/utf8.c", + "src/util-list.c", "src/utils.c", ], cflags: [ - "-std=c99", + "-std=c11", + "-fno-strict-aliasing", + "-fsanitize-undefined-trap-on-error", "-Wall", "-Werror", + "-Wno-format", "-Wno-unused-parameter", "-Wno-missing-field-initializers", // Needed because libxkbcommon uses GNU extension asprintf(). "-D_GNU_SOURCE", ], - local_include_dirs: ["src", "config/libxkbcommon.so.0.0.0.p"], - export_include_dirs: ["."], + static_libs: [ + "libxml2" + ], + local_include_dirs: [ + "src", + "config", + "config/libxkbcommon.so.0.0.0.p" + ], + export_include_dirs: ["include"], vendor_available: true, host_supported: true, name: "libxkbcommon", diff --git a/METADATA b/METADATA index 83f420b..a57c127 100644 --- a/METADATA +++ b/METADATA @@ -7,14 +7,15 @@ third_party { } url { type: ARCHIVE - value: "https://github.com/xkbcommon/libxkbcommon/archive/xkbcommon-1.0.3.tar.gz" + value: "https://xkbcommon.org/download/libxkbcommon-1.4.0.tar.xz" } - version: "xkbcommon-1.0.3" + version: "xkbcommon-1.4.0" license_note: "would be NOTICE save for test/evdev-scancodes.h" license_type: RESTRICTED last_upgrade_date { - year: 2020 - month: 11 - day: 24 + year: 2022 + month: 4 + day: 22 } + local_modifications: "atom_intern() in atom.c is modified to suppress Wreturn-type warning." } diff --git a/NEWS b/NEWS index 968f183..3b35bb6 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,129 @@ +libxkbcommon 1.4.0 - 2022-02-04 +================== + +- Add `enable-tools` option to Meson build (on by default) to allow disabling + the `xkbcli` tools. + + Contributed by Alex Xu (Hello71). + +- In `xkbcli list`, fix "YAML Norway problem" in output. + + Contributed by Peter Hutterer. + +- In libxkbregistry, variants now inherit iso639, iso3166 and brief from parent + layout if omitted. + + Contributed by M Hickford. + +- In libxkbregistry, don't call `xmlCleanupParser()` - it's not supposed to + be called by libraries. + + Contributed by Peter Hutterer. + +- In libxkbregistry, skip over invalid ISO-639 or ISO-3166 entries. + + Contributed by Peter Hutterer. + +libxkbcommon 1.3.1 - 2021-09-10 +================== + +- In `xkbcli interactive-x11`, use the Esc keysym instead of the Esc keycode + for quitting. + + Contributed by Simon Ser. + +- In `xkbcli how-to-type`, add `--keysym` argugment for how to type a keysym + instead of a Unicode codepoint. + +- Fix a crash in `xkb_x11_keymap_new_from_device` error handling given some + invalid keymaps. Regressed in 1.2.0. + + Reported by Zack Weinberg. Tested by Uli Schlachter. + +libxkbcommon 1.3.0 - 2021-05-01 +================== + +- Change `xkbcli list` to output YAML, instead of the previous ad-hoc format. + + This allows to more easily process the information in a programmetic way, for + example + + xkbcli list | yq -r ".layouts[].layout" + + Contributed by Peter Hutterer. + +- Optimize a certain part of keymap compilation (atom interning). + +- Fix segmentation fault in case-insensitive `xkb_keysym_from_name` for certain + values like the empty string. + + Contributed by Isaac Freund. + +- Support building libxkbcommon as a meson subproject. + + Contributed by Adrian Perez de Castro. + +- Add `ftruncate` fallback for `posix_fallocate` in `xkbcli interactive-wayland` + for FreeBSD. + + Contributed by Evgeniy Khramtsov. + +- Properly export library symbols in MSVC. + + Contributed by Adrian Perez de Castro. + +libxkbcommon 1.2.1 - 2021-04-07 +================== + +- Fix `xkb_x11_keymap_new_from_device()` failing when the keymap contains key + types with missing level names, like the one used by the `numpad:mac` option + in xkeyboard-config. Regressed in 1.2.0. + +libxkbcommon 1.2.0 - 2021-04-03 +================== + +- `xkb_x11_keymap_new_from_device()` is much faster. It now performs only 2 + roundtrips to the X server, instead of dozens (in first-time calls). + + Contributed by Uli Schlachter. + +- Case-sensitive `xkb_keysym_from_name()` is much faster. + +- Keysym names of the form `0x12AB` and `U12AB` are parsed more strictly. + Previously the hexadecimal part was parsed with `strtoul()`, now only up + to 8 hexadecimal digits (0-9A-Fa-f) are allowed. + +- Compose files now have a size limit (65535 internal nodes). Further sequences + are discared and a warning is issued. + +- Compose table loading (`xkb_compose_table_new_from_locale()` and similar) is + much faster. + +- Use `poll()` instead of `epoll()` for `xlbcli interactive-evdev`, making it + portable to FreeBSD which provides evdev but not epoll. On FreeBSD, remember + to install the `evdev-proto` package to get the evdev headers. + +- The build now requires a C11 compiler (uses anonymous structs/unions). + +libxkbcommon 1.1.0 - 2021-02-27 +================== + +- Publish the `xkb-format-text-v1.md` file in the HTML documentation. This file + existed for a long time but only in the Git repository. + Link: https://xkbcommon.org/doc/current/md_doc_keymap_format_text_v1.html + +- Add partial documentation for xkb_symbols to xkb-format-text-v1.md. + + Contributed by Simon Zeni. + +- Update keysym definitions to latest xorgproto. In particular, this adds many + special keysyms corresponding to Linux evdev keycodes. + + Contributed by Peter Hutterer <@who-t.net>. + +- New API: + Too many XKB_KEY_* definitions to list here. + libxkbcommon 1.0.3 - 2020-11-23 ================== diff --git a/README.md b/README.md index 74d1d27..4425578 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ libxkbcommon is built with [Meson](http://mesonbuild.com/): meson setup build ninja -C build + ninja -C build test # Run the tests. To build for use with Wayland, you can disable X11 support while still using the X11 keyboard configuration resource files thusly: diff --git a/bench/.gitignore b/bench/.gitignore deleted file mode 100644 index cd32dfc..0000000 --- a/bench/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -key-proc -rules -rulescomp -compose diff --git a/bench/atom.c b/bench/atom.c new file mode 100644 index 0000000..7d78f64 --- /dev/null +++ b/bench/atom.c @@ -0,0 +1,93 @@ +/* + * Copyright © 2021 Ran Benita + * + * 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 +#include +#include +#include +#include + +#include "atom.h" +#include "bench.h" +#include "darray.h" + +#define BENCHMARK_ITERATIONS 100 + +int +main(void) +{ + FILE *file; + char wordbuf[1024]; + darray(char *) words; + char **worditer; + struct atom_table *table; + xkb_atom_t atom; + const char *text; + struct bench bench; + char *elapsed; + + darray_init(words); + file = fopen("/usr/share/dict/words", "rb"); + if (file == NULL) { + perror("/usr/share/dict/words"); + return -1; + } + while (fgets(wordbuf, sizeof(wordbuf), file)) { + size_t len = strlen(wordbuf); + if (len > 0 && wordbuf[len - 1] == '\n') + wordbuf[len - 1] = '\0'; + darray_append(words, strdup(wordbuf)); + } + fclose(file); + + bench_start(&bench); + for (int i = 0; i < BENCHMARK_ITERATIONS; i++) { + table = atom_table_new(); + assert(table); + + darray_foreach(worditer, words) { + atom = atom_intern(table, *worditer, strlen(*worditer) - 1, true); + assert(atom != XKB_ATOM_NONE); + + text = atom_text(table, atom); + assert(text != NULL); + } + + atom_table_free(table); + } + bench_stop(&bench); + + elapsed = bench_elapsed_str(&bench); + fprintf(stderr, "%d iterations in %ss\n", + BENCHMARK_ITERATIONS, elapsed); + free(elapsed); + + darray_foreach(worditer, words) { + free(*worditer); + } + darray_free(words); + + return 0; +} diff --git a/bench/compose.c b/bench/compose.c index 7ff0798..4198e32 100644 --- a/bench/compose.c +++ b/bench/compose.c @@ -45,7 +45,7 @@ main(void) ctx = test_get_context(CONTEXT_NO_FLAG); assert(ctx); - path = test_get_path("compose/en_US.UTF-8/Compose"); + path = test_get_path("locale/en_US.UTF-8/Compose"); file = fopen(path, "rb"); if (file == NULL) { perror(path); diff --git a/bench/rules.c b/bench/rules.c index 3206583..1306dc4 100644 --- a/bench/rules.c +++ b/bench/rules.c @@ -40,7 +40,6 @@ main(int argc, char *argv[]) struct xkb_rule_names rmlvo = { "evdev", "pc105", "us,il", ",", "ctrl:nocaps,grp:menu_toggle", }; - struct xkb_component_names kccgst; struct bench bench; char *elapsed; @@ -52,6 +51,8 @@ main(int argc, char *argv[]) bench_start(&bench); for (i = 0; i < BENCHMARK_ITERATIONS; i++) { + struct xkb_component_names kccgst; + assert(xkb_components_from_rules(ctx, &rmlvo, &kccgst)); free(kccgst.keycodes); free(kccgst.types); diff --git a/bench/rulescomp.c b/bench/rulescomp.c index 3972a7b..0da4d3c 100644 --- a/bench/rulescomp.c +++ b/bench/rulescomp.c @@ -28,7 +28,7 @@ #include "../test/test.h" #include "bench.h" -#define BENCHMARK_ITERATIONS 2500 +#define BENCHMARK_ITERATIONS 1000 int main(int argc, char *argv[]) diff --git a/config.h b/config.h deleted file mode 120000 index 2d4dea9..0000000 --- a/config.h +++ /dev/null @@ -1 +0,0 @@ -config/config.h \ No newline at end of file diff --git a/config/config.h b/config/config.h index 76ab62a..1ac39f3 100644 --- a/config/config.h +++ b/config/config.h @@ -45,7 +45,7 @@ #define LIBXKBCOMMON_TOOL_PATH "/usr/local/libexec/xkbcommon" -#define LIBXKBCOMMON_VERSION "1.0.3" +#define LIBXKBCOMMON_VERSION "1.4.0" #define WIN32_LEAN_AND_MEAN 1 diff --git a/config/libxkbcommon.so.0.0.0.p/parser.c b/config/libxkbcommon.so.0.0.0.p/parser.c index 921673f..bbb4c1e 100644 --- a/config/libxkbcommon.so.0.0.0.p/parser.c +++ b/config/libxkbcommon.so.0.0.0.p/parser.c @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.7.2. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -45,11 +45,11 @@ define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ -/* Identify Bison output. */ -#define YYBISON 1 +/* Identify Bison output, and Bison version. */ +#define YYBISON 30802 -/* Bison version. */ -#define YYBISON_VERSION "3.7.2" +/* Bison version string. */ +#define YYBISON_VERSION "3.8.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -334,6 +334,18 @@ typedef int_least16_t yytype_int16; typedef short yytype_int16; #endif +/* Work around bug in HP-UX 11.23, which defines these macros + incorrectly for preprocessor constants. This workaround can likely + be removed in 2023, as HPE has promised support for HP-UX 11.23 + (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of + . */ +#ifdef __hpux +# undef UINT_LEAST8_MAX +# undef UINT_LEAST16_MAX +# define UINT_LEAST8_MAX 255 +# define UINT_LEAST16_MAX 65535 +#endif + #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ typedef __UINT_LEAST8_TYPE__ yytype_uint8; #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ @@ -431,17 +443,23 @@ typedef int yy_state_fast_t; /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) +# define YY_USE(E) ((void) (E)) #else -# define YYUSE(E) /* empty */ +# define YY_USE(E) /* empty */ #endif -#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ /* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ +#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ +# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") +# else +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# endif # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else @@ -655,7 +673,7 @@ static const yytype_int8 yytranslate[] = }; #if YYDEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { 0, 254, 254, 256, 258, 262, 268, 269, 270, 273, @@ -727,21 +745,6 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ -static const yytype_int16 yytoknum[] = -{ - 0, 256, 257, 255, 1, 2, 3, 4, 5, 6, - 7, 8, 10, 11, 12, 13, 14, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 60, 61, 62, 63, 64, 70, 71, 72, - 73, 74, 75, 76, 77 -}; -#endif - #define YYPACT_NINF (-182) #define yypact_value_is_default(Yyn) \ @@ -752,8 +755,8 @@ static const yytype_int16 yytoknum[] = #define yytable_value_is_error(Yyn) \ 0 - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ static const yytype_int16 yypact[] = { 176, -182, -182, -182, -182, -182, -182, -182, -182, -182, @@ -792,9 +795,9 @@ static const yytype_int16 yypact[] = -182, -182, -182, -182 }; - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ +/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ static const yytype_uint8 yydefact[] = { 18, 4, 21, 22, 23, 24, 25, 26, 27, 28, @@ -833,7 +836,7 @@ static const yytype_uint8 yydefact[] = 97, 95, 90, 92 }; - /* YYPGOTO[NTERM-NUM]. */ +/* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -182, -182, -182, -182, -182, 181, -182, 402, -182, 389, @@ -846,10 +849,10 @@ static const yytype_int16 yypgoto[] = 420, -182 }; - /* YYDEFGOTO[NTERM-NUM]. */ +/* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 10, 11, 25, 34, 12, 26, 36, 14, 15, + 0, 10, 11, 25, 34, 12, 26, 36, 14, 15, 37, 46, 167, 73, 74, 75, 92, 93, 76, 100, 168, 77, 78, 173, 174, 175, 79, 80, 195, 82, 83, 84, 196, 197, 293, 294, 319, 320, 198, 312, @@ -859,9 +862,9 @@ static const yytype_int16 yydefgoto[] = 29, 30 }; - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ +/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { 90, 101, 180, 241, 94, 184, 16, 69, 242, 102, @@ -1018,8 +1021,8 @@ static const yytype_int16 yycheck[] = -1, -1, 55, -1, -1, 58 }; - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ +/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of + state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 0, 57, 58, 59, 60, 61, 62, 63, 64, @@ -1058,7 +1061,7 @@ static const yytype_uint8 yystos[] = 105, 42, 49, 102 }; - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ static const yytype_uint8 yyr1[] = { 0, 65, 66, 66, 66, 67, 68, 68, 68, 69, @@ -1082,7 +1085,7 @@ static const yytype_uint8 yyr1[] = 133, 134, 135, 135, 136 }; - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ static const yytype_int8 yyr2[] = { 0, 2, 1, 1, 1, 7, 1, 1, 1, 2, @@ -1115,6 +1118,7 @@ enum { YYENOMEM = -2 }; #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab +#define YYNOMEM goto yyexhaustedlab #define YYRECOVERING() (!!yyerrstatus) @@ -1155,10 +1159,7 @@ do { \ YYFPRINTF Args; \ } while (0) -/* This macro is provided for backward compatibility. */ -# ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif + # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ @@ -1182,16 +1183,12 @@ yy_symbol_value_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, struct parser_param *param) { FILE *yyoutput = yyo; - YYUSE (yyoutput); - YYUSE (param); + YY_USE (yyoutput); + YY_USE (param); if (!yyvaluep) return; -# ifdef YYPRINT - if (yykind < YYNTOKENS) - YYPRINT (yyo, yytoknum[yykind], *yyvaluep); -# endif YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yykind); + YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } @@ -1305,8 +1302,8 @@ static void yydestruct (const char *yymsg, yysymbol_kind_t yykind, YYSTYPE *yyvaluep, struct parser_param *param) { - YYUSE (yyvaluep); - YYUSE (param); + YY_USE (yyvaluep); + YY_USE (param); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); @@ -1317,247 +1314,247 @@ yydestruct (const char *yymsg, case YYSYMBOL_STRING: /* STRING */ #line 238 "../src/xkbcomp/parser.y" { free(((*yyvaluep).str)); } -#line 1321 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1318 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_IDENT: /* IDENT */ #line 238 "../src/xkbcomp/parser.y" { free(((*yyvaluep).str)); } -#line 1327 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1324 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_XkbFile: /* XkbFile */ #line 236 "../src/xkbcomp/parser.y" { if (!param->rtrn) FreeXkbFile(((*yyvaluep).file)); } -#line 1333 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1330 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_XkbCompositeMap: /* XkbCompositeMap */ #line 236 "../src/xkbcomp/parser.y" { if (!param->rtrn) FreeXkbFile(((*yyvaluep).file)); } -#line 1339 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1336 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_XkbMapConfigList: /* XkbMapConfigList */ #line 237 "../src/xkbcomp/parser.y" { FreeXkbFile(((*yyvaluep).fileList).head); } -#line 1345 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1342 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_XkbMapConfig: /* XkbMapConfig */ #line 236 "../src/xkbcomp/parser.y" { if (!param->rtrn) FreeXkbFile(((*yyvaluep).file)); } -#line 1351 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1348 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_DeclList: /* DeclList */ #line 232 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).anyList).head); } -#line 1357 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1354 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_Decl: /* Decl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).any)); } -#line 1363 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1360 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_VarDecl: /* VarDecl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).var)); } -#line 1369 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1366 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_KeyNameDecl: /* KeyNameDecl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).keyCode)); } -#line 1375 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1372 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_KeyAliasDecl: /* KeyAliasDecl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).keyAlias)); } -#line 1381 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1378 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_VModDecl: /* VModDecl */ #line 232 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).vmodList).head); } -#line 1387 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1384 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_VModDefList: /* VModDefList */ #line 232 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).vmodList).head); } -#line 1393 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1390 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_VModDef: /* VModDef */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).vmod)); } -#line 1399 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1396 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_InterpretDecl: /* InterpretDecl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).interp)); } -#line 1405 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1402 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_InterpretMatch: /* InterpretMatch */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).interp)); } -#line 1411 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1408 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_VarDeclList: /* VarDeclList */ #line 232 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).varList).head); } -#line 1417 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1414 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_KeyTypeDecl: /* KeyTypeDecl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).keyType)); } -#line 1423 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1420 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_SymbolsDecl: /* SymbolsDecl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).syms)); } -#line 1429 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1426 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_SymbolsBody: /* SymbolsBody */ #line 232 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).varList).head); } -#line 1435 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1432 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_SymbolsVarDecl: /* SymbolsVarDecl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).var)); } -#line 1441 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1438 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_ArrayInit: /* ArrayInit */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1447 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1444 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_GroupCompatDecl: /* GroupCompatDecl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).groupCompat)); } -#line 1453 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1450 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_ModMapDecl: /* ModMapDecl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).modMask)); } -#line 1459 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1456 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_LedMapDecl: /* LedMapDecl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).ledMap)); } -#line 1465 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1462 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_LedNameDecl: /* LedNameDecl */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).ledName)); } -#line 1471 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1468 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_CoordList: /* CoordList */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1477 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1474 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_Coord: /* Coord */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1483 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1480 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_OptExprList: /* OptExprList */ #line 232 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).exprList).head); } -#line 1489 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1486 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_ExprList: /* ExprList */ #line 232 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).exprList).head); } -#line 1495 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1492 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_Expr: /* Expr */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1501 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1498 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_Term: /* Term */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1507 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1504 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_ActionList: /* ActionList */ #line 232 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).exprList).head); } -#line 1513 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1510 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_Action: /* Action */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1519 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1516 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_Lhs: /* Lhs */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1525 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1522 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_Terminal: /* Terminal */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1531 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1528 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_OptKeySymList: /* OptKeySymList */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1537 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1534 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_KeySymList: /* KeySymList */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1543 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1540 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_KeySyms: /* KeySyms */ #line 229 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1549 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1546 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_OptMapName: /* OptMapName */ #line 238 "../src/xkbcomp/parser.y" { free(((*yyvaluep).str)); } -#line 1555 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1552 "libxkbcommon.so.0.0.0.p/parser.c" break; case YYSYMBOL_MapName: /* MapName */ #line 238 "../src/xkbcomp/parser.y" { free(((*yyvaluep).str)); } -#line 1561 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1558 "libxkbcommon.so.0.0.0.p/parser.c" break; default: @@ -1631,6 +1628,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYDPRINTF ((stderr, "Starting parse\n")); yychar = YYEMPTY; /* Cause a token to be read. */ + goto yysetstate; @@ -1656,7 +1654,7 @@ yysetstate: if (yyss + yystacksize - 1 <= yyssp) #if !defined yyoverflow && !defined YYSTACK_RELOCATE - goto yyexhaustedlab; + YYNOMEM; #else { /* Get the current used size of the three stacks, in elements. */ @@ -1684,7 +1682,7 @@ yysetstate: # else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + YYNOMEM; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; @@ -1695,7 +1693,7 @@ yysetstate: YY_CAST (union yyalloc *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); if (! yyptr) - goto yyexhaustedlab; + YYNOMEM; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE @@ -1717,6 +1715,7 @@ yysetstate: } #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ + if (yystate == YYFINAL) YYACCEPT; @@ -1831,55 +1830,55 @@ yyreduce: case 2: /* XkbFile: XkbCompositeMap */ #line 255 "../src/xkbcomp/parser.y" { (yyval.file) = param->rtrn = (yyvsp[0].file); param->more_maps = !!param->rtrn; } -#line 1835 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1834 "libxkbcommon.so.0.0.0.p/parser.c" break; case 3: /* XkbFile: XkbMapConfig */ #line 257 "../src/xkbcomp/parser.y" { (yyval.file) = param->rtrn = (yyvsp[0].file); param->more_maps = !!param->rtrn; YYACCEPT; } -#line 1841 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1840 "libxkbcommon.so.0.0.0.p/parser.c" break; case 4: /* XkbFile: END_OF_FILE */ #line 259 "../src/xkbcomp/parser.y" { (yyval.file) = param->rtrn = NULL; param->more_maps = false; } -#line 1847 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1846 "libxkbcommon.so.0.0.0.p/parser.c" break; case 5: /* XkbCompositeMap: OptFlags XkbCompositeType OptMapName OBRACE XkbMapConfigList CBRACE SEMI */ #line 265 "../src/xkbcomp/parser.y" { (yyval.file) = XkbFileCreate((yyvsp[-5].file_type), (yyvsp[-4].str), (ParseCommon *) (yyvsp[-2].fileList).head, (yyvsp[-6].mapFlags)); } -#line 1853 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1852 "libxkbcommon.so.0.0.0.p/parser.c" break; case 6: /* XkbCompositeType: XKB_KEYMAP */ #line 268 "../src/xkbcomp/parser.y" { (yyval.file_type) = FILE_TYPE_KEYMAP; } -#line 1859 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1858 "libxkbcommon.so.0.0.0.p/parser.c" break; case 7: /* XkbCompositeType: XKB_SEMANTICS */ #line 269 "../src/xkbcomp/parser.y" { (yyval.file_type) = FILE_TYPE_KEYMAP; } -#line 1865 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1864 "libxkbcommon.so.0.0.0.p/parser.c" break; case 8: /* XkbCompositeType: XKB_LAYOUT */ #line 270 "../src/xkbcomp/parser.y" { (yyval.file_type) = FILE_TYPE_KEYMAP; } -#line 1871 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1870 "libxkbcommon.so.0.0.0.p/parser.c" break; case 9: /* XkbMapConfigList: XkbMapConfigList XkbMapConfig */ #line 274 "../src/xkbcomp/parser.y" { (yyval.fileList).head = (yyvsp[-1].fileList).head; (yyval.fileList).last->common.next = &(yyvsp[0].file)->common; (yyval.fileList).last = (yyvsp[0].file); } -#line 1877 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1876 "libxkbcommon.so.0.0.0.p/parser.c" break; case 10: /* XkbMapConfigList: XkbMapConfig */ #line 276 "../src/xkbcomp/parser.y" { (yyval.fileList).head = (yyval.fileList).last = (yyvsp[0].file); } -#line 1883 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1882 "libxkbcommon.so.0.0.0.p/parser.c" break; case 11: /* XkbMapConfig: OptFlags FileType OptMapName OBRACE DeclList CBRACE SEMI */ @@ -1887,109 +1886,109 @@ yyreduce: { (yyval.file) = XkbFileCreate((yyvsp[-5].file_type), (yyvsp[-4].str), (yyvsp[-2].anyList).head, (yyvsp[-6].mapFlags)); } -#line 1891 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1890 "libxkbcommon.so.0.0.0.p/parser.c" break; case 12: /* FileType: XKB_KEYCODES */ #line 287 "../src/xkbcomp/parser.y" { (yyval.file_type) = FILE_TYPE_KEYCODES; } -#line 1897 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1896 "libxkbcommon.so.0.0.0.p/parser.c" break; case 13: /* FileType: XKB_TYPES */ #line 288 "../src/xkbcomp/parser.y" { (yyval.file_type) = FILE_TYPE_TYPES; } -#line 1903 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1902 "libxkbcommon.so.0.0.0.p/parser.c" break; case 14: /* FileType: XKB_COMPATMAP */ #line 289 "../src/xkbcomp/parser.y" { (yyval.file_type) = FILE_TYPE_COMPAT; } -#line 1909 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1908 "libxkbcommon.so.0.0.0.p/parser.c" break; case 15: /* FileType: XKB_SYMBOLS */ #line 290 "../src/xkbcomp/parser.y" { (yyval.file_type) = FILE_TYPE_SYMBOLS; } -#line 1915 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1914 "libxkbcommon.so.0.0.0.p/parser.c" break; case 16: /* FileType: XKB_GEOMETRY */ #line 291 "../src/xkbcomp/parser.y" { (yyval.file_type) = FILE_TYPE_GEOMETRY; } -#line 1921 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1920 "libxkbcommon.so.0.0.0.p/parser.c" break; case 17: /* OptFlags: Flags */ #line 294 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = (yyvsp[0].mapFlags); } -#line 1927 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1926 "libxkbcommon.so.0.0.0.p/parser.c" break; case 18: /* OptFlags: %empty */ #line 295 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = 0; } -#line 1933 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1932 "libxkbcommon.so.0.0.0.p/parser.c" break; case 19: /* Flags: Flags Flag */ #line 298 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = ((yyvsp[-1].mapFlags) | (yyvsp[0].mapFlags)); } -#line 1939 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1938 "libxkbcommon.so.0.0.0.p/parser.c" break; case 20: /* Flags: Flag */ #line 299 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = (yyvsp[0].mapFlags); } -#line 1945 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1944 "libxkbcommon.so.0.0.0.p/parser.c" break; case 21: /* Flag: PARTIAL */ #line 302 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = MAP_IS_PARTIAL; } -#line 1951 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1950 "libxkbcommon.so.0.0.0.p/parser.c" break; case 22: /* Flag: DEFAULT */ #line 303 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = MAP_IS_DEFAULT; } -#line 1957 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1956 "libxkbcommon.so.0.0.0.p/parser.c" break; case 23: /* Flag: HIDDEN */ #line 304 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = MAP_IS_HIDDEN; } -#line 1963 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1962 "libxkbcommon.so.0.0.0.p/parser.c" break; case 24: /* Flag: ALPHANUMERIC_KEYS */ #line 305 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = MAP_HAS_ALPHANUMERIC; } -#line 1969 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1968 "libxkbcommon.so.0.0.0.p/parser.c" break; case 25: /* Flag: MODIFIER_KEYS */ #line 306 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = MAP_HAS_MODIFIER; } -#line 1975 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1974 "libxkbcommon.so.0.0.0.p/parser.c" break; case 26: /* Flag: KEYPAD_KEYS */ #line 307 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = MAP_HAS_KEYPAD; } -#line 1981 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1980 "libxkbcommon.so.0.0.0.p/parser.c" break; case 27: /* Flag: FUNCTION_KEYS */ #line 308 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = MAP_HAS_FN; } -#line 1987 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1986 "libxkbcommon.so.0.0.0.p/parser.c" break; case 28: /* Flag: ALTERNATE_GROUP */ #line 309 "../src/xkbcomp/parser.y" { (yyval.mapFlags) = MAP_IS_ALTGR; } -#line 1993 "libxkbcommon.so.0.0.0.p/parser.c" +#line 1992 "libxkbcommon.so.0.0.0.p/parser.c" break; case 29: /* DeclList: DeclList Decl */ @@ -2003,7 +2002,7 @@ yyreduce: } } } -#line 2007 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2006 "libxkbcommon.so.0.0.0.p/parser.c" break; case 30: /* DeclList: DeclList OptMergeMode VModDecl */ @@ -2017,13 +2016,13 @@ yyreduce: (yyval.anyList).head = &(yyvsp[0].vmodList).head->common; (yyval.anyList).last = &(yyvsp[0].vmodList).last->common; } } -#line 2021 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2020 "libxkbcommon.so.0.0.0.p/parser.c" break; case 31: /* DeclList: %empty */ #line 337 "../src/xkbcomp/parser.y" { (yyval.anyList).head = (yyval.anyList).last = NULL; } -#line 2027 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2026 "libxkbcommon.so.0.0.0.p/parser.c" break; case 32: /* Decl: OptMergeMode VarDecl */ @@ -2032,7 +2031,7 @@ yyreduce: (yyvsp[0].var)->merge = (yyvsp[-1].merge); (yyval.any) = (ParseCommon *) (yyvsp[0].var); } -#line 2036 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2035 "libxkbcommon.so.0.0.0.p/parser.c" break; case 33: /* Decl: OptMergeMode InterpretDecl */ @@ -2041,7 +2040,7 @@ yyreduce: (yyvsp[0].interp)->merge = (yyvsp[-1].merge); (yyval.any) = (ParseCommon *) (yyvsp[0].interp); } -#line 2045 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2044 "libxkbcommon.so.0.0.0.p/parser.c" break; case 34: /* Decl: OptMergeMode KeyNameDecl */ @@ -2050,7 +2049,7 @@ yyreduce: (yyvsp[0].keyCode)->merge = (yyvsp[-1].merge); (yyval.any) = (ParseCommon *) (yyvsp[0].keyCode); } -#line 2054 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2053 "libxkbcommon.so.0.0.0.p/parser.c" break; case 35: /* Decl: OptMergeMode KeyAliasDecl */ @@ -2059,7 +2058,7 @@ yyreduce: (yyvsp[0].keyAlias)->merge = (yyvsp[-1].merge); (yyval.any) = (ParseCommon *) (yyvsp[0].keyAlias); } -#line 2063 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2062 "libxkbcommon.so.0.0.0.p/parser.c" break; case 36: /* Decl: OptMergeMode KeyTypeDecl */ @@ -2068,7 +2067,7 @@ yyreduce: (yyvsp[0].keyType)->merge = (yyvsp[-1].merge); (yyval.any) = (ParseCommon *) (yyvsp[0].keyType); } -#line 2072 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2071 "libxkbcommon.so.0.0.0.p/parser.c" break; case 37: /* Decl: OptMergeMode SymbolsDecl */ @@ -2077,7 +2076,7 @@ yyreduce: (yyvsp[0].syms)->merge = (yyvsp[-1].merge); (yyval.any) = (ParseCommon *) (yyvsp[0].syms); } -#line 2081 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2080 "libxkbcommon.so.0.0.0.p/parser.c" break; case 38: /* Decl: OptMergeMode ModMapDecl */ @@ -2086,7 +2085,7 @@ yyreduce: (yyvsp[0].modMask)->merge = (yyvsp[-1].merge); (yyval.any) = (ParseCommon *) (yyvsp[0].modMask); } -#line 2090 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2089 "libxkbcommon.so.0.0.0.p/parser.c" break; case 39: /* Decl: OptMergeMode GroupCompatDecl */ @@ -2095,7 +2094,7 @@ yyreduce: (yyvsp[0].groupCompat)->merge = (yyvsp[-1].merge); (yyval.any) = (ParseCommon *) (yyvsp[0].groupCompat); } -#line 2099 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2098 "libxkbcommon.so.0.0.0.p/parser.c" break; case 40: /* Decl: OptMergeMode LedMapDecl */ @@ -2104,7 +2103,7 @@ yyreduce: (yyvsp[0].ledMap)->merge = (yyvsp[-1].merge); (yyval.any) = (ParseCommon *) (yyvsp[0].ledMap); } -#line 2108 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2107 "libxkbcommon.so.0.0.0.p/parser.c" break; case 41: /* Decl: OptMergeMode LedNameDecl */ @@ -2113,25 +2112,25 @@ yyreduce: (yyvsp[0].ledName)->merge = (yyvsp[-1].merge); (yyval.any) = (ParseCommon *) (yyvsp[0].ledName); } -#line 2117 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2116 "libxkbcommon.so.0.0.0.p/parser.c" break; case 42: /* Decl: OptMergeMode ShapeDecl */ #line 391 "../src/xkbcomp/parser.y" { (yyval.any) = NULL; } -#line 2123 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2122 "libxkbcommon.so.0.0.0.p/parser.c" break; case 43: /* Decl: OptMergeMode SectionDecl */ #line 392 "../src/xkbcomp/parser.y" { (yyval.any) = NULL; } -#line 2129 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2128 "libxkbcommon.so.0.0.0.p/parser.c" break; case 44: /* Decl: OptMergeMode DoodadDecl */ #line 393 "../src/xkbcomp/parser.y" { (yyval.any) = NULL; } -#line 2135 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2134 "libxkbcommon.so.0.0.0.p/parser.c" break; case 45: /* Decl: MergeMode STRING */ @@ -2140,523 +2139,523 @@ yyreduce: (yyval.any) = (ParseCommon *) IncludeCreate(param->ctx, (yyvsp[0].str), (yyvsp[-1].merge)); free((yyvsp[0].str)); } -#line 2144 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2143 "libxkbcommon.so.0.0.0.p/parser.c" break; case 46: /* VarDecl: Lhs EQUALS Expr SEMI */ #line 402 "../src/xkbcomp/parser.y" { (yyval.var) = VarCreate((yyvsp[-3].expr), (yyvsp[-1].expr)); } -#line 2150 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2149 "libxkbcommon.so.0.0.0.p/parser.c" break; case 47: /* VarDecl: Ident SEMI */ #line 404 "../src/xkbcomp/parser.y" { (yyval.var) = BoolVarCreate((yyvsp[-1].atom), true); } -#line 2156 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2155 "libxkbcommon.so.0.0.0.p/parser.c" break; case 48: /* VarDecl: EXCLAM Ident SEMI */ #line 406 "../src/xkbcomp/parser.y" { (yyval.var) = BoolVarCreate((yyvsp[-1].atom), false); } -#line 2162 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2161 "libxkbcommon.so.0.0.0.p/parser.c" break; case 49: /* KeyNameDecl: KEYNAME EQUALS KeyCode SEMI */ #line 410 "../src/xkbcomp/parser.y" { (yyval.keyCode) = KeycodeCreate((yyvsp[-3].atom), (yyvsp[-1].num)); } -#line 2168 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2167 "libxkbcommon.so.0.0.0.p/parser.c" break; case 50: /* KeyAliasDecl: ALIAS KEYNAME EQUALS KEYNAME SEMI */ #line 414 "../src/xkbcomp/parser.y" { (yyval.keyAlias) = KeyAliasCreate((yyvsp[-3].atom), (yyvsp[-1].atom)); } -#line 2174 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2173 "libxkbcommon.so.0.0.0.p/parser.c" break; case 51: /* VModDecl: VIRTUAL_MODS VModDefList SEMI */ #line 418 "../src/xkbcomp/parser.y" { (yyval.vmodList) = (yyvsp[-1].vmodList); } -#line 2180 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2179 "libxkbcommon.so.0.0.0.p/parser.c" break; case 52: /* VModDefList: VModDefList COMMA VModDef */ #line 422 "../src/xkbcomp/parser.y" { (yyval.vmodList).head = (yyvsp[-2].vmodList).head; (yyval.vmodList).last->common.next = &(yyvsp[0].vmod)->common; (yyval.vmodList).last = (yyvsp[0].vmod); } -#line 2186 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2185 "libxkbcommon.so.0.0.0.p/parser.c" break; case 53: /* VModDefList: VModDef */ #line 424 "../src/xkbcomp/parser.y" { (yyval.vmodList).head = (yyval.vmodList).last = (yyvsp[0].vmod); } -#line 2192 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2191 "libxkbcommon.so.0.0.0.p/parser.c" break; case 54: /* VModDef: Ident */ #line 428 "../src/xkbcomp/parser.y" { (yyval.vmod) = VModCreate((yyvsp[0].atom), NULL); } -#line 2198 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2197 "libxkbcommon.so.0.0.0.p/parser.c" break; case 55: /* VModDef: Ident EQUALS Expr */ #line 430 "../src/xkbcomp/parser.y" { (yyval.vmod) = VModCreate((yyvsp[-2].atom), (yyvsp[0].expr)); } -#line 2204 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2203 "libxkbcommon.so.0.0.0.p/parser.c" break; case 56: /* InterpretDecl: INTERPRET InterpretMatch OBRACE VarDeclList CBRACE SEMI */ #line 436 "../src/xkbcomp/parser.y" { (yyvsp[-4].interp)->def = (yyvsp[-2].varList).head; (yyval.interp) = (yyvsp[-4].interp); } -#line 2210 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2209 "libxkbcommon.so.0.0.0.p/parser.c" break; case 57: /* InterpretMatch: KeySym PLUS Expr */ #line 440 "../src/xkbcomp/parser.y" { (yyval.interp) = InterpCreate((yyvsp[-2].keysym), (yyvsp[0].expr)); } -#line 2216 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2215 "libxkbcommon.so.0.0.0.p/parser.c" break; case 58: /* InterpretMatch: KeySym */ #line 442 "../src/xkbcomp/parser.y" { (yyval.interp) = InterpCreate((yyvsp[0].keysym), NULL); } -#line 2222 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2221 "libxkbcommon.so.0.0.0.p/parser.c" break; case 59: /* VarDeclList: VarDeclList VarDecl */ #line 446 "../src/xkbcomp/parser.y" { (yyval.varList).head = (yyvsp[-1].varList).head; (yyval.varList).last->common.next = &(yyvsp[0].var)->common; (yyval.varList).last = (yyvsp[0].var); } -#line 2228 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2227 "libxkbcommon.so.0.0.0.p/parser.c" break; case 60: /* VarDeclList: VarDecl */ #line 448 "../src/xkbcomp/parser.y" { (yyval.varList).head = (yyval.varList).last = (yyvsp[0].var); } -#line 2234 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2233 "libxkbcommon.so.0.0.0.p/parser.c" break; case 61: /* KeyTypeDecl: TYPE String OBRACE VarDeclList CBRACE SEMI */ #line 454 "../src/xkbcomp/parser.y" { (yyval.keyType) = KeyTypeCreate((yyvsp[-4].atom), (yyvsp[-2].varList).head); } -#line 2240 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2239 "libxkbcommon.so.0.0.0.p/parser.c" break; case 62: /* SymbolsDecl: KEY KEYNAME OBRACE SymbolsBody CBRACE SEMI */ #line 460 "../src/xkbcomp/parser.y" { (yyval.syms) = SymbolsCreate((yyvsp[-4].atom), (yyvsp[-2].varList).head); } -#line 2246 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2245 "libxkbcommon.so.0.0.0.p/parser.c" break; case 63: /* SymbolsBody: SymbolsBody COMMA SymbolsVarDecl */ #line 464 "../src/xkbcomp/parser.y" { (yyval.varList).head = (yyvsp[-2].varList).head; (yyval.varList).last->common.next = &(yyvsp[0].var)->common; (yyval.varList).last = (yyvsp[0].var); } -#line 2252 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2251 "libxkbcommon.so.0.0.0.p/parser.c" break; case 64: /* SymbolsBody: SymbolsVarDecl */ #line 466 "../src/xkbcomp/parser.y" { (yyval.varList).head = (yyval.varList).last = (yyvsp[0].var); } -#line 2258 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2257 "libxkbcommon.so.0.0.0.p/parser.c" break; case 65: /* SymbolsBody: %empty */ #line 467 "../src/xkbcomp/parser.y" { (yyval.varList).head = (yyval.varList).last = NULL; } -#line 2264 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2263 "libxkbcommon.so.0.0.0.p/parser.c" break; case 66: /* SymbolsVarDecl: Lhs EQUALS Expr */ #line 470 "../src/xkbcomp/parser.y" { (yyval.var) = VarCreate((yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2270 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2269 "libxkbcommon.so.0.0.0.p/parser.c" break; case 67: /* SymbolsVarDecl: Lhs EQUALS ArrayInit */ #line 471 "../src/xkbcomp/parser.y" { (yyval.var) = VarCreate((yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2276 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2275 "libxkbcommon.so.0.0.0.p/parser.c" break; case 68: /* SymbolsVarDecl: Ident */ #line 472 "../src/xkbcomp/parser.y" { (yyval.var) = BoolVarCreate((yyvsp[0].atom), true); } -#line 2282 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2281 "libxkbcommon.so.0.0.0.p/parser.c" break; case 69: /* SymbolsVarDecl: EXCLAM Ident */ #line 473 "../src/xkbcomp/parser.y" { (yyval.var) = BoolVarCreate((yyvsp[0].atom), false); } -#line 2288 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2287 "libxkbcommon.so.0.0.0.p/parser.c" break; case 70: /* SymbolsVarDecl: ArrayInit */ #line 474 "../src/xkbcomp/parser.y" { (yyval.var) = VarCreate(NULL, (yyvsp[0].expr)); } -#line 2294 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2293 "libxkbcommon.so.0.0.0.p/parser.c" break; case 71: /* ArrayInit: OBRACKET OptKeySymList CBRACKET */ #line 478 "../src/xkbcomp/parser.y" { (yyval.expr) = (yyvsp[-1].expr); } -#line 2300 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2299 "libxkbcommon.so.0.0.0.p/parser.c" break; case 72: /* ArrayInit: OBRACKET ActionList CBRACKET */ #line 480 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateActionList((yyvsp[-1].exprList).head); } -#line 2306 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2305 "libxkbcommon.so.0.0.0.p/parser.c" break; case 73: /* GroupCompatDecl: GROUP Integer EQUALS Expr SEMI */ #line 484 "../src/xkbcomp/parser.y" { (yyval.groupCompat) = GroupCompatCreate((yyvsp[-3].num), (yyvsp[-1].expr)); } -#line 2312 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2311 "libxkbcommon.so.0.0.0.p/parser.c" break; case 74: /* ModMapDecl: MODIFIER_MAP Ident OBRACE ExprList CBRACE SEMI */ #line 488 "../src/xkbcomp/parser.y" { (yyval.modMask) = ModMapCreate((yyvsp[-4].atom), (yyvsp[-2].exprList).head); } -#line 2318 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2317 "libxkbcommon.so.0.0.0.p/parser.c" break; case 75: /* LedMapDecl: INDICATOR String OBRACE VarDeclList CBRACE SEMI */ #line 492 "../src/xkbcomp/parser.y" { (yyval.ledMap) = LedMapCreate((yyvsp[-4].atom), (yyvsp[-2].varList).head); } -#line 2324 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2323 "libxkbcommon.so.0.0.0.p/parser.c" break; case 76: /* LedNameDecl: INDICATOR Integer EQUALS Expr SEMI */ #line 496 "../src/xkbcomp/parser.y" { (yyval.ledName) = LedNameCreate((yyvsp[-3].num), (yyvsp[-1].expr), false); } -#line 2330 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2329 "libxkbcommon.so.0.0.0.p/parser.c" break; case 77: /* LedNameDecl: VIRTUAL INDICATOR Integer EQUALS Expr SEMI */ #line 498 "../src/xkbcomp/parser.y" { (yyval.ledName) = LedNameCreate((yyvsp[-3].num), (yyvsp[-1].expr), true); } -#line 2336 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2335 "libxkbcommon.so.0.0.0.p/parser.c" break; case 78: /* ShapeDecl: SHAPE String OBRACE OutlineList CBRACE SEMI */ #line 502 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2342 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2341 "libxkbcommon.so.0.0.0.p/parser.c" break; case 79: /* ShapeDecl: SHAPE String OBRACE CoordList CBRACE SEMI */ #line 504 "../src/xkbcomp/parser.y" { (void) (yyvsp[-2].expr); (yyval.geom) = NULL; } -#line 2348 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2347 "libxkbcommon.so.0.0.0.p/parser.c" break; case 80: /* SectionDecl: SECTION String OBRACE SectionBody CBRACE SEMI */ #line 508 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2354 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2353 "libxkbcommon.so.0.0.0.p/parser.c" break; case 81: /* SectionBody: SectionBody SectionBodyItem */ #line 511 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL;} -#line 2360 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2359 "libxkbcommon.so.0.0.0.p/parser.c" break; case 82: /* SectionBody: SectionBodyItem */ #line 512 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2366 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2365 "libxkbcommon.so.0.0.0.p/parser.c" break; case 83: /* SectionBodyItem: ROW OBRACE RowBody CBRACE SEMI */ #line 516 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2372 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2371 "libxkbcommon.so.0.0.0.p/parser.c" break; case 84: /* SectionBodyItem: VarDecl */ #line 518 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) (yyvsp[0].var)); (yyval.geom) = NULL; } -#line 2378 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2377 "libxkbcommon.so.0.0.0.p/parser.c" break; case 85: /* SectionBodyItem: DoodadDecl */ #line 520 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2384 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2383 "libxkbcommon.so.0.0.0.p/parser.c" break; case 86: /* SectionBodyItem: LedMapDecl */ #line 522 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) (yyvsp[0].ledMap)); (yyval.geom) = NULL; } -#line 2390 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2389 "libxkbcommon.so.0.0.0.p/parser.c" break; case 87: /* SectionBodyItem: OverlayDecl */ #line 524 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2396 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2395 "libxkbcommon.so.0.0.0.p/parser.c" break; case 88: /* RowBody: RowBody RowBodyItem */ #line 527 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL;} -#line 2402 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2401 "libxkbcommon.so.0.0.0.p/parser.c" break; case 89: /* RowBody: RowBodyItem */ #line 528 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2408 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2407 "libxkbcommon.so.0.0.0.p/parser.c" break; case 90: /* RowBodyItem: KEYS OBRACE Keys CBRACE SEMI */ #line 531 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2414 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2413 "libxkbcommon.so.0.0.0.p/parser.c" break; case 91: /* RowBodyItem: VarDecl */ #line 533 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) (yyvsp[0].var)); (yyval.geom) = NULL; } -#line 2420 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2419 "libxkbcommon.so.0.0.0.p/parser.c" break; case 92: /* Keys: Keys COMMA Key */ #line 536 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2426 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2425 "libxkbcommon.so.0.0.0.p/parser.c" break; case 93: /* Keys: Key */ #line 537 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2432 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2431 "libxkbcommon.so.0.0.0.p/parser.c" break; case 94: /* Key: KEYNAME */ #line 541 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2438 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2437 "libxkbcommon.so.0.0.0.p/parser.c" break; case 95: /* Key: OBRACE ExprList CBRACE */ #line 543 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) (yyvsp[-1].exprList).head); (yyval.geom) = NULL; } -#line 2444 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2443 "libxkbcommon.so.0.0.0.p/parser.c" break; case 96: /* OverlayDecl: OVERLAY String OBRACE OverlayKeyList CBRACE SEMI */ #line 547 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2450 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2449 "libxkbcommon.so.0.0.0.p/parser.c" break; case 97: /* OverlayKeyList: OverlayKeyList COMMA OverlayKey */ #line 550 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2456 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2455 "libxkbcommon.so.0.0.0.p/parser.c" break; case 98: /* OverlayKeyList: OverlayKey */ #line 551 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2462 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2461 "libxkbcommon.so.0.0.0.p/parser.c" break; case 99: /* OverlayKey: KEYNAME EQUALS KEYNAME */ #line 554 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2468 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2467 "libxkbcommon.so.0.0.0.p/parser.c" break; case 100: /* OutlineList: OutlineList COMMA OutlineInList */ #line 558 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL;} -#line 2474 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2473 "libxkbcommon.so.0.0.0.p/parser.c" break; case 101: /* OutlineList: OutlineInList */ #line 560 "../src/xkbcomp/parser.y" { (yyval.geom) = NULL; } -#line 2480 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2479 "libxkbcommon.so.0.0.0.p/parser.c" break; case 102: /* OutlineInList: OBRACE CoordList CBRACE */ #line 564 "../src/xkbcomp/parser.y" { (void) (yyvsp[-1].expr); (yyval.geom) = NULL; } -#line 2486 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2485 "libxkbcommon.so.0.0.0.p/parser.c" break; case 103: /* OutlineInList: Ident EQUALS OBRACE CoordList CBRACE */ #line 566 "../src/xkbcomp/parser.y" { (void) (yyvsp[-1].expr); (yyval.geom) = NULL; } -#line 2492 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2491 "libxkbcommon.so.0.0.0.p/parser.c" break; case 104: /* OutlineInList: Ident EQUALS Expr */ #line 568 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) (yyvsp[0].expr)); (yyval.geom) = NULL; } -#line 2498 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2497 "libxkbcommon.so.0.0.0.p/parser.c" break; case 105: /* CoordList: CoordList COMMA Coord */ #line 572 "../src/xkbcomp/parser.y" { (void) (yyvsp[-2].expr); (void) (yyvsp[0].expr); (yyval.expr) = NULL; } -#line 2504 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2503 "libxkbcommon.so.0.0.0.p/parser.c" break; case 106: /* CoordList: Coord */ #line 574 "../src/xkbcomp/parser.y" { (void) (yyvsp[0].expr); (yyval.expr) = NULL; } -#line 2510 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2509 "libxkbcommon.so.0.0.0.p/parser.c" break; case 107: /* Coord: OBRACKET SignedNumber COMMA SignedNumber CBRACKET */ #line 578 "../src/xkbcomp/parser.y" { (yyval.expr) = NULL; } -#line 2516 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2515 "libxkbcommon.so.0.0.0.p/parser.c" break; case 108: /* DoodadDecl: DoodadType String OBRACE VarDeclList CBRACE SEMI */ #line 582 "../src/xkbcomp/parser.y" { FreeStmt((ParseCommon *) (yyvsp[-2].varList).head); (yyval.geom) = NULL; } -#line 2522 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2521 "libxkbcommon.so.0.0.0.p/parser.c" break; case 109: /* DoodadType: TEXT */ #line 585 "../src/xkbcomp/parser.y" { (yyval.num) = 0; } -#line 2528 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2527 "libxkbcommon.so.0.0.0.p/parser.c" break; case 110: /* DoodadType: OUTLINE */ #line 586 "../src/xkbcomp/parser.y" { (yyval.num) = 0; } -#line 2534 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2533 "libxkbcommon.so.0.0.0.p/parser.c" break; case 111: /* DoodadType: SOLID */ #line 587 "../src/xkbcomp/parser.y" { (yyval.num) = 0; } -#line 2540 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2539 "libxkbcommon.so.0.0.0.p/parser.c" break; case 112: /* DoodadType: LOGO */ #line 588 "../src/xkbcomp/parser.y" { (yyval.num) = 0; } -#line 2546 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2545 "libxkbcommon.so.0.0.0.p/parser.c" break; case 113: /* FieldSpec: Ident */ #line 591 "../src/xkbcomp/parser.y" { (yyval.atom) = (yyvsp[0].atom); } -#line 2552 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2551 "libxkbcommon.so.0.0.0.p/parser.c" break; case 114: /* FieldSpec: Element */ #line 592 "../src/xkbcomp/parser.y" { (yyval.atom) = (yyvsp[0].atom); } -#line 2558 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2557 "libxkbcommon.so.0.0.0.p/parser.c" break; case 115: /* Element: ACTION_TOK */ #line 596 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "action"); } -#line 2564 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2563 "libxkbcommon.so.0.0.0.p/parser.c" break; case 116: /* Element: INTERPRET */ #line 598 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "interpret"); } -#line 2570 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2569 "libxkbcommon.so.0.0.0.p/parser.c" break; case 117: /* Element: TYPE */ #line 600 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "type"); } -#line 2576 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2575 "libxkbcommon.so.0.0.0.p/parser.c" break; case 118: /* Element: KEY */ #line 602 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "key"); } -#line 2582 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2581 "libxkbcommon.so.0.0.0.p/parser.c" break; case 119: /* Element: GROUP */ #line 604 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "group"); } -#line 2588 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2587 "libxkbcommon.so.0.0.0.p/parser.c" break; case 120: /* Element: MODIFIER_MAP */ #line 606 "../src/xkbcomp/parser.y" {(yyval.atom) = xkb_atom_intern_literal(param->ctx, "modifier_map");} -#line 2594 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2593 "libxkbcommon.so.0.0.0.p/parser.c" break; case 121: /* Element: INDICATOR */ #line 608 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "indicator"); } -#line 2600 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2599 "libxkbcommon.so.0.0.0.p/parser.c" break; case 122: /* Element: SHAPE */ #line 610 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "shape"); } -#line 2606 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2605 "libxkbcommon.so.0.0.0.p/parser.c" break; case 123: /* Element: ROW */ #line 612 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "row"); } -#line 2612 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2611 "libxkbcommon.so.0.0.0.p/parser.c" break; case 124: /* Element: SECTION */ #line 614 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "section"); } -#line 2618 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2617 "libxkbcommon.so.0.0.0.p/parser.c" break; case 125: /* Element: TEXT */ #line 616 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "text"); } -#line 2624 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2623 "libxkbcommon.so.0.0.0.p/parser.c" break; case 126: /* OptMergeMode: MergeMode */ #line 619 "../src/xkbcomp/parser.y" { (yyval.merge) = (yyvsp[0].merge); } -#line 2630 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2629 "libxkbcommon.so.0.0.0.p/parser.c" break; case 127: /* OptMergeMode: %empty */ #line 620 "../src/xkbcomp/parser.y" { (yyval.merge) = MERGE_DEFAULT; } -#line 2636 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2635 "libxkbcommon.so.0.0.0.p/parser.c" break; case 128: /* MergeMode: INCLUDE */ #line 623 "../src/xkbcomp/parser.y" { (yyval.merge) = MERGE_DEFAULT; } -#line 2642 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2641 "libxkbcommon.so.0.0.0.p/parser.c" break; case 129: /* MergeMode: AUGMENT */ #line 624 "../src/xkbcomp/parser.y" { (yyval.merge) = MERGE_AUGMENT; } -#line 2648 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2647 "libxkbcommon.so.0.0.0.p/parser.c" break; case 130: /* MergeMode: OVERRIDE */ #line 625 "../src/xkbcomp/parser.y" { (yyval.merge) = MERGE_OVERRIDE; } -#line 2654 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2653 "libxkbcommon.so.0.0.0.p/parser.c" break; case 131: /* MergeMode: REPLACE */ #line 626 "../src/xkbcomp/parser.y" { (yyval.merge) = MERGE_REPLACE; } -#line 2660 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2659 "libxkbcommon.so.0.0.0.p/parser.c" break; case 132: /* MergeMode: ALTERNATE */ @@ -2668,223 +2667,223 @@ yyreduce: */ (yyval.merge) = MERGE_DEFAULT; } -#line 2672 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2671 "libxkbcommon.so.0.0.0.p/parser.c" break; case 133: /* OptExprList: ExprList */ #line 637 "../src/xkbcomp/parser.y" { (yyval.exprList) = (yyvsp[0].exprList); } -#line 2678 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2677 "libxkbcommon.so.0.0.0.p/parser.c" break; case 134: /* OptExprList: %empty */ #line 638 "../src/xkbcomp/parser.y" { (yyval.exprList).head = (yyval.exprList).last = NULL; } -#line 2684 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2683 "libxkbcommon.so.0.0.0.p/parser.c" break; case 135: /* ExprList: ExprList COMMA Expr */ #line 642 "../src/xkbcomp/parser.y" { (yyval.exprList).head = (yyvsp[-2].exprList).head; (yyval.exprList).last->common.next = &(yyvsp[0].expr)->common; (yyval.exprList).last = (yyvsp[0].expr); } -#line 2690 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2689 "libxkbcommon.so.0.0.0.p/parser.c" break; case 136: /* ExprList: Expr */ #line 644 "../src/xkbcomp/parser.y" { (yyval.exprList).head = (yyval.exprList).last = (yyvsp[0].expr); } -#line 2696 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2695 "libxkbcommon.so.0.0.0.p/parser.c" break; case 137: /* Expr: Expr DIVIDE Expr */ #line 648 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateBinary(EXPR_DIVIDE, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2702 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2701 "libxkbcommon.so.0.0.0.p/parser.c" break; case 138: /* Expr: Expr PLUS Expr */ #line 650 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateBinary(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2708 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2707 "libxkbcommon.so.0.0.0.p/parser.c" break; case 139: /* Expr: Expr MINUS Expr */ #line 652 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateBinary(EXPR_SUBTRACT, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2714 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2713 "libxkbcommon.so.0.0.0.p/parser.c" break; case 140: /* Expr: Expr TIMES Expr */ #line 654 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateBinary(EXPR_MULTIPLY, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2720 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2719 "libxkbcommon.so.0.0.0.p/parser.c" break; case 141: /* Expr: Lhs EQUALS Expr */ #line 656 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateBinary(EXPR_ASSIGN, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2726 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2725 "libxkbcommon.so.0.0.0.p/parser.c" break; case 142: /* Expr: Term */ #line 658 "../src/xkbcomp/parser.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2732 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2731 "libxkbcommon.so.0.0.0.p/parser.c" break; case 143: /* Term: MINUS Term */ #line 662 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateUnary(EXPR_NEGATE, (yyvsp[0].expr)->expr.value_type, (yyvsp[0].expr)); } -#line 2738 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2737 "libxkbcommon.so.0.0.0.p/parser.c" break; case 144: /* Term: PLUS Term */ #line 664 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateUnary(EXPR_UNARY_PLUS, (yyvsp[0].expr)->expr.value_type, (yyvsp[0].expr)); } -#line 2744 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2743 "libxkbcommon.so.0.0.0.p/parser.c" break; case 145: /* Term: EXCLAM Term */ #line 666 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateUnary(EXPR_NOT, EXPR_TYPE_BOOLEAN, (yyvsp[0].expr)); } -#line 2750 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2749 "libxkbcommon.so.0.0.0.p/parser.c" break; case 146: /* Term: INVERT Term */ #line 668 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateUnary(EXPR_INVERT, (yyvsp[0].expr)->expr.value_type, (yyvsp[0].expr)); } -#line 2756 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2755 "libxkbcommon.so.0.0.0.p/parser.c" break; case 147: /* Term: Lhs */ #line 670 "../src/xkbcomp/parser.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2762 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2761 "libxkbcommon.so.0.0.0.p/parser.c" break; case 148: /* Term: FieldSpec OPAREN OptExprList CPAREN */ #line 672 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateAction((yyvsp[-3].atom), (yyvsp[-1].exprList).head); } -#line 2768 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2767 "libxkbcommon.so.0.0.0.p/parser.c" break; case 149: /* Term: Terminal */ #line 674 "../src/xkbcomp/parser.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2774 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2773 "libxkbcommon.so.0.0.0.p/parser.c" break; case 150: /* Term: OPAREN Expr CPAREN */ #line 676 "../src/xkbcomp/parser.y" { (yyval.expr) = (yyvsp[-1].expr); } -#line 2780 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2779 "libxkbcommon.so.0.0.0.p/parser.c" break; case 151: /* ActionList: ActionList COMMA Action */ #line 680 "../src/xkbcomp/parser.y" { (yyval.exprList).head = (yyvsp[-2].exprList).head; (yyval.exprList).last->common.next = &(yyvsp[0].expr)->common; (yyval.exprList).last = (yyvsp[0].expr); } -#line 2786 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2785 "libxkbcommon.so.0.0.0.p/parser.c" break; case 152: /* ActionList: Action */ #line 682 "../src/xkbcomp/parser.y" { (yyval.exprList).head = (yyval.exprList).last = (yyvsp[0].expr); } -#line 2792 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2791 "libxkbcommon.so.0.0.0.p/parser.c" break; case 153: /* Action: FieldSpec OPAREN OptExprList CPAREN */ #line 686 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateAction((yyvsp[-3].atom), (yyvsp[-1].exprList).head); } -#line 2798 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2797 "libxkbcommon.so.0.0.0.p/parser.c" break; case 154: /* Lhs: FieldSpec */ #line 690 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateIdent((yyvsp[0].atom)); } -#line 2804 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2803 "libxkbcommon.so.0.0.0.p/parser.c" break; case 155: /* Lhs: FieldSpec DOT FieldSpec */ #line 692 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateFieldRef((yyvsp[-2].atom), (yyvsp[0].atom)); } -#line 2810 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2809 "libxkbcommon.so.0.0.0.p/parser.c" break; case 156: /* Lhs: FieldSpec OBRACKET Expr CBRACKET */ #line 694 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateArrayRef(XKB_ATOM_NONE, (yyvsp[-3].atom), (yyvsp[-1].expr)); } -#line 2816 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2815 "libxkbcommon.so.0.0.0.p/parser.c" break; case 157: /* Lhs: FieldSpec DOT FieldSpec OBRACKET Expr CBRACKET */ #line 696 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateArrayRef((yyvsp[-5].atom), (yyvsp[-3].atom), (yyvsp[-1].expr)); } -#line 2822 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2821 "libxkbcommon.so.0.0.0.p/parser.c" break; case 158: /* Terminal: String */ #line 700 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateString((yyvsp[0].atom)); } -#line 2828 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2827 "libxkbcommon.so.0.0.0.p/parser.c" break; case 159: /* Terminal: Integer */ #line 702 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateInteger((yyvsp[0].num)); } -#line 2834 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2833 "libxkbcommon.so.0.0.0.p/parser.c" break; case 160: /* Terminal: Float */ #line 704 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateFloat(/* Discard $1 */); } -#line 2840 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2839 "libxkbcommon.so.0.0.0.p/parser.c" break; case 161: /* Terminal: KEYNAME */ #line 706 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateKeyName((yyvsp[0].atom)); } -#line 2846 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2845 "libxkbcommon.so.0.0.0.p/parser.c" break; case 162: /* OptKeySymList: KeySymList */ #line 709 "../src/xkbcomp/parser.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2852 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2851 "libxkbcommon.so.0.0.0.p/parser.c" break; case 163: /* OptKeySymList: %empty */ #line 710 "../src/xkbcomp/parser.y" { (yyval.expr) = NULL; } -#line 2858 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2857 "libxkbcommon.so.0.0.0.p/parser.c" break; case 164: /* KeySymList: KeySymList COMMA KeySym */ #line 714 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprAppendKeysymList((yyvsp[-2].expr), (yyvsp[0].keysym)); } -#line 2864 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2863 "libxkbcommon.so.0.0.0.p/parser.c" break; case 165: /* KeySymList: KeySymList COMMA KeySyms */ #line 716 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprAppendMultiKeysymList((yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2870 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2869 "libxkbcommon.so.0.0.0.p/parser.c" break; case 166: /* KeySymList: KeySym */ #line 718 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateKeysymList((yyvsp[0].keysym)); } -#line 2876 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2875 "libxkbcommon.so.0.0.0.p/parser.c" break; case 167: /* KeySymList: KeySyms */ #line 720 "../src/xkbcomp/parser.y" { (yyval.expr) = ExprCreateMultiKeysymList((yyvsp[0].expr)); } -#line 2882 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2881 "libxkbcommon.so.0.0.0.p/parser.c" break; case 168: /* KeySyms: OBRACE KeySymList CBRACE */ #line 724 "../src/xkbcomp/parser.y" { (yyval.expr) = (yyvsp[-1].expr); } -#line 2888 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2887 "libxkbcommon.so.0.0.0.p/parser.c" break; case 169: /* KeySym: IDENT */ @@ -2896,13 +2895,13 @@ yyreduce: } free((yyvsp[0].str)); } -#line 2900 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2899 "libxkbcommon.so.0.0.0.p/parser.c" break; case 170: /* KeySym: SECTION */ #line 735 "../src/xkbcomp/parser.y" { (yyval.keysym) = XKB_KEY_section; } -#line 2906 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2905 "libxkbcommon.so.0.0.0.p/parser.c" break; case 171: /* KeySym: Integer */ @@ -2924,89 +2923,89 @@ yyreduce: } } } -#line 2928 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2927 "libxkbcommon.so.0.0.0.p/parser.c" break; case 172: /* SignedNumber: MINUS Number */ #line 756 "../src/xkbcomp/parser.y" { (yyval.num) = -(yyvsp[0].num); } -#line 2934 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2933 "libxkbcommon.so.0.0.0.p/parser.c" break; case 173: /* SignedNumber: Number */ #line 757 "../src/xkbcomp/parser.y" { (yyval.num) = (yyvsp[0].num); } -#line 2940 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2939 "libxkbcommon.so.0.0.0.p/parser.c" break; case 174: /* Number: FLOAT */ #line 760 "../src/xkbcomp/parser.y" { (yyval.num) = (yyvsp[0].num); } -#line 2946 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2945 "libxkbcommon.so.0.0.0.p/parser.c" break; case 175: /* Number: INTEGER */ #line 761 "../src/xkbcomp/parser.y" { (yyval.num) = (yyvsp[0].num); } -#line 2952 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2951 "libxkbcommon.so.0.0.0.p/parser.c" break; case 176: /* Float: FLOAT */ #line 764 "../src/xkbcomp/parser.y" { (yyval.num) = 0; } -#line 2958 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2957 "libxkbcommon.so.0.0.0.p/parser.c" break; case 177: /* Integer: INTEGER */ #line 767 "../src/xkbcomp/parser.y" { (yyval.num) = (yyvsp[0].num); } -#line 2964 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2963 "libxkbcommon.so.0.0.0.p/parser.c" break; case 178: /* KeyCode: INTEGER */ #line 770 "../src/xkbcomp/parser.y" { (yyval.num) = (yyvsp[0].num); } -#line 2970 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2969 "libxkbcommon.so.0.0.0.p/parser.c" break; case 179: /* Ident: IDENT */ #line 773 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern(param->ctx, (yyvsp[0].str), strlen((yyvsp[0].str))); free((yyvsp[0].str)); } -#line 2976 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2975 "libxkbcommon.so.0.0.0.p/parser.c" break; case 180: /* Ident: DEFAULT */ #line 774 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "default"); } -#line 2982 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2981 "libxkbcommon.so.0.0.0.p/parser.c" break; case 181: /* String: STRING */ #line 777 "../src/xkbcomp/parser.y" { (yyval.atom) = xkb_atom_intern(param->ctx, (yyvsp[0].str), strlen((yyvsp[0].str))); free((yyvsp[0].str)); } -#line 2988 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2987 "libxkbcommon.so.0.0.0.p/parser.c" break; case 182: /* OptMapName: MapName */ #line 780 "../src/xkbcomp/parser.y" { (yyval.str) = (yyvsp[0].str); } -#line 2994 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2993 "libxkbcommon.so.0.0.0.p/parser.c" break; case 183: /* OptMapName: %empty */ #line 781 "../src/xkbcomp/parser.y" { (yyval.str) = NULL; } -#line 3000 "libxkbcommon.so.0.0.0.p/parser.c" +#line 2999 "libxkbcommon.so.0.0.0.p/parser.c" break; case 184: /* MapName: STRING */ #line 784 "../src/xkbcomp/parser.y" { (yyval.str) = (yyvsp[0].str); } -#line 3006 "libxkbcommon.so.0.0.0.p/parser.c" +#line 3005 "libxkbcommon.so.0.0.0.p/parser.c" break; -#line 3010 "libxkbcommon.so.0.0.0.p/parser.c" +#line 3009 "libxkbcommon.so.0.0.0.p/parser.c" default: break; } @@ -3088,6 +3087,7 @@ yyerrorlab: label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; + ++yynerrs; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ @@ -3148,7 +3148,7 @@ yyerrlab1: `-------------------------------------*/ yyacceptlab: yyresult = 0; - goto yyreturn; + goto yyreturnlab; /*-----------------------------------. @@ -3156,24 +3156,22 @@ yyacceptlab: `-----------------------------------*/ yyabortlab: yyresult = 1; - goto yyreturn; + goto yyreturnlab; -#if !defined yyoverflow -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ +/*-----------------------------------------------------------. +| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | +`-----------------------------------------------------------*/ yyexhaustedlab: yyerror (param, YY_("memory exhausted")); yyresult = 2; - goto yyreturn; -#endif + goto yyreturnlab; -/*-------------------------------------------------------. -| yyreturn -- parsing is finished, clean up and return. | -`-------------------------------------------------------*/ -yyreturn: +/*----------------------------------------------------------. +| yyreturnlab -- parsing is finished, clean up and return. | +`----------------------------------------------------------*/ +yyreturnlab: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at diff --git a/config/libxkbcommon.so.0.0.0.p/parser.h b/config/libxkbcommon.so.0.0.0.p/parser.h index 3d9dcaf..dfa0954 100644 --- a/config/libxkbcommon.so.0.0.0.p/parser.h +++ b/config/libxkbcommon.so.0.0.0.p/parser.h @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.7.2. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -164,6 +164,8 @@ typedef union YYSTYPE YYSTYPE; + int _xkbcommon_parse (struct parser_param *param); + #endif /* !YY__XKBCOMMON_LIBXKBCOMMON_SO_0_0_0_P_PARSER_H_INCLUDED */ diff --git a/doc/.gitignore b/doc/.gitignore deleted file mode 100644 index 63b767d..0000000 --- a/doc/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -Doxyfile -html/ diff --git a/doc/keymap-format-text-v1.md b/doc/keymap-format-text-v1.md index eda6ebb..8726947 100644 --- a/doc/keymap-format-text-v1.md +++ b/doc/keymap-format-text-v1.md @@ -3,6 +3,12 @@ This document describes the `XKB_KEYMAP_FORMAT_TEXT_V1` keymap format, as implemented by libxkbcommon. +NOTE: This document is ever incomplete. Some additional resources are: + +- [Ivan Pascal's XKB documentation](https://web.archive.org/web/20190724015820/http://pascal.tsu.ru/en/xkb/) +- [An Unreliable Guide to XKB Configuration](https://www.charvolant.org/doug/xkb/html/index.html) +- [ArchWiki XKB page](https://wiki.archlinux.org/index.php/X_keyboard_extension) + A keymap consists of a single top-level `xkb_keymap` block, underwhich are nested the following sections. @@ -26,7 +32,7 @@ assign them the names `TLDE` and `AE01` respectively. The format `` is always used to refer to a key by name. [The naming convention `` just denotes the position of the key -in the main alphanumric section of a standard QWERTY keyboard, with +in the main alphanumeric section of a standard QWERTY keyboard, with the two letters specifying the row and the two digits specifying the column, from the bottom left.] @@ -69,7 +75,7 @@ section and by the user. ## The `xkb_types` section -This section is the second to be processesed, after `xkb_keycodes`. +This section is the second to be processed, after `xkb_keycodes`. However, it is completely independent and could have been the first to be processed (it does not refer to specific keys as specified in the `xkb_keycodes` section). @@ -299,7 +305,7 @@ statements: If the given modifiers are in the required state (see below), the LED is lit. -#### `whichModState` statment +#### `whichModState` statement whichModState = Latched+Locked; @@ -351,11 +357,109 @@ satisfied the LED is lit. ## The `xkb_symbols` section -This section is the fourth to be processed, after `xkb_keycodes`, -`xkb_types` and `xkb_compat`. +NOTE: The documentation of this section is incomplete. -TODO +This section is the fourth to be processed, after `xkb_keycodes`, `xkb_types` +and `xkb_compat`. + +Statements of the form: + + xkb_symbols "basic" { + ... + } + +Declare a symbols map named `basic`. Statements inside the curly braces only +affect the symbols map. + +A map can have various flags applied to it above the statement, separated by +whitespace: + + partial alphanumeric_keys + xkb_symbols "basic" { + ... + } + +The possible flags are: + + * `partial` - Indicates that the map doesn't cover a complete keyboard. + * `default` - Marks the symbol map as the default map in the file when no + explicit map is specified. If no map is marked as a default, the first map + in the file is the default. + * `hidden` - Variant that can only be used internally + * `alphanumeric_keys` - Indicates that the map contains alphanumeric keys + * `modifier_keys` - Indicates that the map contains modifier keys + * `keypad_keys` - Indicates that the map contains keypad keys + * `function_keys` - Indicates that the map contains function keys + * `alternate_group` - Indicates that the map contains keys for an alternate + group + +If no `*_keys` flags are supplied, then the map is assumed to cover a complete +keyboard. + +At present, except for `default`, none of the flags affect key processing in +libxkbcommon, and only serve as metadata. + +### Name statements + +Statements of the form: + + name[Group1] = "US/ASCII"; + groupName[1] = "US/ASCII"; + +Gives the name "US/ASCII" to the first group of symbols. Other groups can be +named using a different group index (ex: `Group2`), and with a different name. +A group must be named. + +`group` and `groupName` mean the same thing, and the `Group` in `Group1` is +optional. + +### Include statements + +Statements of the form: + + include "nokia_vndr/rx-51(nordic_base) + +Will include data from another `xkb_symbols` section, possibly located in +another file. Here it would include the `xkb_symbols` section called +`nordic_base`, from the file `rx-51` located in the `nokia_vndr` folder, itself +located in an XKB include path. + +### Key statement + +Statements of the form: + + key { [ q, Q ] }; + +Describes the mapping of a keycode `` to a given group of symbols. The +possible keycodes are the keycodes defined in the `xkb_keycodes` section. + +Symbols are named using the symbolic names from the +`xkbcommon/xkbcommon-keysyms.h` file. A group of symbols is enclosed in brackets +and separated by commas. Each element of the symbol arrays corresponds to a +different modifier level. In this example, the symbol (keysym) `XKB_KEY_q` for +level 1 and `XKB_KEY_Q` for level 2. + +#### Groups + +Each group represents a list of symbols mapped to a keycode: + + name[Group1]= "US/ASCII"; + name[Group2]= "Russian"; + ... + key { [ q, Q ], + [ Cyrillic_shorti, Cyrillic_SHORTI ] }; + +A long-form syntax can also be used: + + key { + symbols[Group1]= [ q, Q ], + symbols[Group2]= [ Cyrillic_shorti, Cyrillic_SHORTI ] + }; + +Groups can also be omitted, but the brackets must be present. The following +statement only defines the Group3 of a mapping: + key { [], [], [ q, Q ] }; ## Virtual modifier statements diff --git a/doc/user-configuration.md b/doc/user-configuration.md index 2146599..40f7f77 100644 --- a/doc/user-configuration.md +++ b/doc/user-configuration.md @@ -197,8 +197,10 @@ $ cat $XDG_CONFIG_HOME/xkb/rules/evdev.xml orange or Orange (Banana) - + + + diff --git a/fuzz/.gitignore b/fuzz/.gitignore deleted file mode 100644 index 413910a..0000000 --- a/fuzz/.gitignore +++ /dev/null @@ -1 +0,0 @@ -findings/ diff --git a/include/xkbcommon/xkbcommon-compat.h b/include/xkbcommon/xkbcommon-compat.h new file mode 100644 index 0000000..299732f --- /dev/null +++ b/include/xkbcommon/xkbcommon-compat.h @@ -0,0 +1,98 @@ +/* + * Copyright © 2012 Daniel Stone + * + * 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. + * + * Author: Daniel Stone + */ + +#ifndef _XKBCOMMON_COMPAT_H +#define _XKBCOMMON_COMPAT_H + +/** + * Renamed keymap API. + */ +#define xkb_group_index_t xkb_layout_index_t +#define xkb_group_mask_t xkb_layout_mask_t +#define xkb_map_compile_flags xkb_keymap_compile_flags +#define XKB_GROUP_INVALID XKB_LAYOUT_INVALID + +#define XKB_STATE_DEPRESSED \ + (XKB_STATE_MODS_DEPRESSED | XKB_STATE_LAYOUT_DEPRESSED) +#define XKB_STATE_LATCHED \ + (XKB_STATE_MODS_LATCHED | XKB_STATE_LAYOUT_LATCHED) +#define XKB_STATE_LOCKED \ + (XKB_STATE_MODS_LOCKED | XKB_STATE_LAYOUT_LOCKED) +#define XKB_STATE_EFFECTIVE \ + (XKB_STATE_DEPRESSED | XKB_STATE_LATCHED | XKB_STATE_LOCKED | \ + XKB_STATE_MODS_EFFECTIVE | XKB_STATE_LAYOUT_EFFECTIVE) + +#define xkb_map_new_from_names(context, names, flags) \ + xkb_keymap_new_from_names(context, names, flags) +#define xkb_map_new_from_file(context, file, format, flags) \ + xkb_keymap_new_from_file(context, file, format, flags) +#define xkb_map_new_from_string(context, string, format, flags) \ + xkb_keymap_new_from_string(context, string, format, flags) +#define xkb_map_get_as_string(keymap) \ + xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1) +#define xkb_map_ref(keymap) xkb_keymap_ref(keymap) +#define xkb_map_unref(keymap) xkb_keymap_unref(keymap) + +#define xkb_map_num_mods(keymap) xkb_keymap_num_mods(keymap) +#define xkb_map_mod_get_name(keymap, idx) xkb_keymap_mod_get_name(keymap, idx) +#define xkb_map_mod_get_index(keymap, str) xkb_keymap_mod_get_index(keymap, str) +#define xkb_key_mod_index_is_consumed(state, key, mod) \ + xkb_state_mod_index_is_consumed(state, key, mod) +#define xkb_key_mod_mask_remove_consumed(state, key, modmask) \ + xkb_state_mod_mask_remove_consumed(state, key, modmask) + +#define xkb_map_num_groups(keymap) xkb_keymap_num_layouts(keymap) +#define xkb_key_num_groups(keymap, key) \ + xkb_keymap_num_layouts_for_key(keymap, key) +#define xkb_map_group_get_name(keymap, idx) \ + xkb_keymap_layout_get_name(keymap, idx) +#define xkb_map_group_get_index(keymap, str) \ + xkb_keymap_layout_get_index(keymap, str) + +#define xkb_map_num_leds(keymap) xkb_keymap_num_leds(keymap) +#define xkb_map_led_get_name(keymap, idx) xkb_keymap_led_get_name(keymap, idx) +#define xkb_map_led_get_index(keymap, str) \ + xkb_keymap_led_get_index(keymap, str) + +#define xkb_key_repeats(keymap, key) xkb_keymap_key_repeats(keymap, key) + +#define xkb_key_get_syms(state, key, syms_out) \ + xkb_state_key_get_syms(state, key, syms_out) + +#define xkb_state_group_name_is_active(state, name, type) \ + xkb_state_layout_name_is_active(state, name, type) +#define xkb_state_group_index_is_active(state, idx, type) \ + xkb_state_layout_index_is_active(state, idx, type) + +#define xkb_state_serialize_group(state, component) \ + xkb_state_serialize_layout(state, component) + +#define xkb_state_get_map(state) xkb_state_get_keymap(state) + +/* Not needed anymore, since there's NO_FLAGS. */ +#define XKB_MAP_COMPILE_PLACEHOLDER XKB_KEYMAP_COMPILE_NO_FLAGS +#define XKB_MAP_COMPILE_NO_FLAGS XKB_KEYMAP_COMPILE_NO_FLAGS + +#endif diff --git a/include/xkbcommon/xkbcommon-compose.h b/include/xkbcommon/xkbcommon-compose.h new file mode 100644 index 0000000..8b41b98 --- /dev/null +++ b/include/xkbcommon/xkbcommon-compose.h @@ -0,0 +1,500 @@ +/* + * Copyright © 2013 Ran Benita + * + * 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. + */ + +#ifndef _XKBCOMMON_COMPOSE_H +#define _XKBCOMMON_COMPOSE_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file + * libxkbcommon Compose API - support for Compose and dead-keys. + */ + +/** + * @defgroup compose Compose and dead-keys support + * Support for Compose and dead-keys. + * @since 0.5.0 + * + * @{ + */ + +/** + * @page compose-overview Overview + * @parblock + * + * Compose and dead-keys are a common feature of many keyboard input + * systems. They extend the range of the keysysm that can be produced + * directly from a keyboard by using a sequence of key strokes, instead + * of just one. + * + * Here are some example sequences, in the libX11 Compose file format: + * + * : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + * : "@" at # COMMERCIAL AT + * + * When the user presses a key which produces the `` keysym, + * nothing initially happens (thus the key is dubbed a "dead-key"). But + * when the user enters ``, "á" is "composed", in place of "a". If + * instead the user had entered a keysym which does not follow + * `` in any compose sequence, the sequence is said to be + * "cancelled". + * + * Compose files define many such sequences. For a description of the + * common file format for Compose files, see the Compose(5) man page. + * + * A successfuly-composed sequence has two results: a keysym and a UTF-8 + * string. At least one of the two is defined for each sequence. If only + * a keysym is given, the keysym's string representation is used for the + * result string (using xkb_keysym_to_utf8()). + * + * This library provides low-level support for Compose file parsing and + * processing. Higher-level APIs (such as libX11's `Xutf8LookupString`(3)) + * may be built upon it, or it can be used directly. + * + * @endparblock + */ + +/** + * @page compose-conflicting Conflicting Sequences + * @parblock + * + * To avoid ambiguity, a sequence is not allowed to be a prefix of another. + * In such a case, the conflict is resolved thus: + * + * 1. A longer sequence overrides a shorter one. + * 2. An equal sequence overrides an existing one. + * 3. A shorter sequence does not override a longer one. + * + * Sequences of length 1 are allowed. + * + * @endparblock + */ + +/** + * @page compose-cancellation Cancellation Behavior + * @parblock + * + * What should happen when a sequence is cancelled? For example, consider + * there are only the above sequences, and the input keysyms are + * ` `. There are a few approaches: + * + * 1. Swallow the cancelling keysym; that is, no keysym is produced. + * This is the approach taken by libX11. + * 2. Let the cancelling keysym through; that is, `` is produced. + * 3. Replay the entire sequence; that is, ` ` is produced. + * This is the approach taken by Microsoft Windows (approximately; + * instead of ``, the underlying key is used. This is + * difficult to simulate with XKB keymaps). + * + * You can program whichever approach best fits users' expectations. + * + * @endparblock + */ + +/** + * @struct xkb_compose_table + * Opaque Compose table object. + * + * The compose table holds the definitions of the Compose sequences, as + * gathered from Compose files. It is immutable. + */ +struct xkb_compose_table; + +/** + * @struct xkb_compose_state + * Opaque Compose state object. + * + * The compose state maintains state for compose sequence matching, such + * as which possible sequences are being matched, and the position within + * these sequences. It acts as a simple state machine wherein keysyms are + * the input, and composed keysyms and strings are the output. + * + * The compose state is usually associated with a keyboard device. + */ +struct xkb_compose_state; + +/** Flags affecting Compose file compilation. */ +enum xkb_compose_compile_flags { + /** Do not apply any flags. */ + XKB_COMPOSE_COMPILE_NO_FLAGS = 0 +}; + +/** The recognized Compose file formats. */ +enum xkb_compose_format { + /** The classic libX11 Compose text format, described in Compose(5). */ + XKB_COMPOSE_FORMAT_TEXT_V1 = 1 +}; + +/** + * @page compose-locale Compose Locale + * @parblock + * + * Compose files are locale dependent: + * - Compose files are written for a locale, and the locale is used when + * searching for the appropriate file to use. + * - Compose files may reference the locale internally, with directives + * such as \%L. + * + * As such, functions like xkb_compose_table_new_from_locale() require + * a `locale` parameter. This will usually be the current locale (see + * locale(7) for more details). You may also want to allow the user to + * explicitly configure it, so he can use the Compose file of a given + * locale, but not use that locale for other things. + * + * You may query the current locale as follows: + * @code + * const char *locale; + * locale = setlocale(LC_CTYPE, NULL); + * @endcode + * + * This will only give useful results if the program had previously set + * the current locale using setlocale(3), with `LC_CTYPE` or `LC_ALL` + * and a non-NULL argument. + * + * If you prefer not to use the locale system of the C runtime library, + * you may nevertheless obtain the user's locale directly using + * environment variables, as described in locale(7). For example, + * @code + * const char *locale; + * locale = getenv("LC_ALL"); + * if (!locale || !*locale) + * locale = getenv("LC_CTYPE"); + * if (!locale || !*locale) + * locale = getenv("LANG"); + * if (!locale || !*locale) + * locale = "C"; + * @endcode + * + * Note that some locales supported by the C standard library may not + * have a Compose file assigned. + * + * @endparblock + */ + +/** + * Create a compose table for a given locale. + * + * The locale is used for searching the file-system for an appropriate + * Compose file. The search order is described in Compose(5). It is + * affected by the following environment variables: + * + * 1. `XCOMPOSEFILE` - see Compose(5). + * 2. `XDG_CONFIG_HOME` - before `$HOME/.XCompose` is checked, + * `$XDG_CONFIG_HOME/XCompose` is checked (with a fall back to + * `$HOME/.config/XCompose` if `XDG_CONFIG_HOME` is not defined). + * This is a libxkbcommon extension to the search procedure in + * Compose(5) (since libxkbcommon 1.0.0). Note that other + * implementations, such as libX11, might not find a Compose file in + * this path. + * 3. `HOME` - see Compose(5). + * 4. `XLOCALEDIR` - if set, used as the base directory for the system's + * X locale files, e.g. `/usr/share/X11/locale`, instead of the + * preconfigured directory. + * + * @param context + * The library context in which to create the compose table. + * @param locale + * The current locale. See @ref compose-locale. + * \n + * The value is copied, so it is safe to pass the result of getenv(3) + * (or similar) without fear of it being invalidated by a subsequent + * setenv(3) (or similar). + * @param flags + * Optional flags for the compose table, or 0. + * + * @returns A compose table for the given locale, or NULL if the + * compilation failed or a Compose file was not found. + * + * @memberof xkb_compose_table + */ +struct xkb_compose_table * +xkb_compose_table_new_from_locale(struct xkb_context *context, + const char *locale, + enum xkb_compose_compile_flags flags); + +/** + * Create a new compose table from a Compose file. + * + * @param context + * The library context in which to create the compose table. + * @param file + * The Compose file to compile. + * @param locale + * The current locale. See @ref compose-locale. + * @param format + * The text format of the Compose file to compile. + * @param flags + * Optional flags for the compose table, or 0. + * + * @returns A compose table compiled from the given file, or NULL if + * the compilation failed. + * + * @memberof xkb_compose_table + */ +struct xkb_compose_table * +xkb_compose_table_new_from_file(struct xkb_context *context, + FILE *file, + const char *locale, + enum xkb_compose_format format, + enum xkb_compose_compile_flags flags); + +/** + * Create a new compose table from a memory buffer. + * + * This is just like xkb_compose_table_new_from_file(), but instead of + * a file, gets the table as one enormous string. + * + * @see xkb_compose_table_new_from_file() + * @memberof xkb_compose_table + */ +struct xkb_compose_table * +xkb_compose_table_new_from_buffer(struct xkb_context *context, + const char *buffer, size_t length, + const char *locale, + enum xkb_compose_format format, + enum xkb_compose_compile_flags flags); + +/** + * Take a new reference on a compose table. + * + * @returns The passed in object. + * + * @memberof xkb_compose_table + */ +struct xkb_compose_table * +xkb_compose_table_ref(struct xkb_compose_table *table); + +/** + * Release a reference on a compose table, and possibly free it. + * + * @param table The object. If it is NULL, this function does nothing. + * + * @memberof xkb_compose_table + */ +void +xkb_compose_table_unref(struct xkb_compose_table *table); + +/** Flags for compose state creation. */ +enum xkb_compose_state_flags { + /** Do not apply any flags. */ + XKB_COMPOSE_STATE_NO_FLAGS = 0 +}; + +/** + * Create a new compose state object. + * + * @param table + * The compose table the state will use. + * @param flags + * Optional flags for the compose state, or 0. + * + * @returns A new compose state, or NULL on failure. + * + * @memberof xkb_compose_state + */ +struct xkb_compose_state * +xkb_compose_state_new(struct xkb_compose_table *table, + enum xkb_compose_state_flags flags); + +/** + * Take a new reference on a compose state object. + * + * @returns The passed in object. + * + * @memberof xkb_compose_state + */ +struct xkb_compose_state * +xkb_compose_state_ref(struct xkb_compose_state *state); + +/** + * Release a reference on a compose state object, and possibly free it. + * + * @param state The object. If NULL, do nothing. + * + * @memberof xkb_compose_state + */ +void +xkb_compose_state_unref(struct xkb_compose_state *state); + +/** + * Get the compose table which a compose state object is using. + * + * @returns The compose table which was passed to xkb_compose_state_new() + * when creating this state object. + * + * This function does not take a new reference on the compose table; you + * must explicitly reference it yourself if you plan to use it beyond the + * lifetime of the state. + * + * @memberof xkb_compose_state + */ +struct xkb_compose_table * +xkb_compose_state_get_compose_table(struct xkb_compose_state *state); + +/** Status of the Compose sequence state machine. */ +enum xkb_compose_status { + /** The initial state; no sequence has started yet. */ + XKB_COMPOSE_NOTHING, + /** In the middle of a sequence. */ + XKB_COMPOSE_COMPOSING, + /** A complete sequence has been matched. */ + XKB_COMPOSE_COMPOSED, + /** The last sequence was cancelled due to an unmatched keysym. */ + XKB_COMPOSE_CANCELLED +}; + +/** The effect of a keysym fed to xkb_compose_state_feed(). */ +enum xkb_compose_feed_result { + /** The keysym had no effect - it did not affect the status. */ + XKB_COMPOSE_FEED_IGNORED, + /** The keysym started, advanced or cancelled a sequence. */ + XKB_COMPOSE_FEED_ACCEPTED +}; + +/** + * Feed one keysym to the Compose sequence state machine. + * + * This function can advance into a compose sequence, cancel a sequence, + * start a new sequence, or do nothing in particular. The resulting + * status may be observed with xkb_compose_state_get_status(). + * + * Some keysyms, such as keysyms for modifier keys, are ignored - they + * have no effect on the status or otherwise. + * + * The following is a description of the possible status transitions, in + * the format CURRENT STATUS => NEXT STATUS, given a non-ignored input + * keysym `keysym`: + * + @verbatim + NOTHING or CANCELLED or COMPOSED => + NOTHING if keysym does not start a sequence. + COMPOSING if keysym starts a sequence. + COMPOSED if keysym starts and terminates a single-keysym sequence. + + COMPOSING => + COMPOSING if keysym advances any of the currently possible + sequences but does not terminate any of them. + COMPOSED if keysym terminates one of the currently possible + sequences. + CANCELLED if keysym does not advance any of the currently + possible sequences. + @endverbatim + * + * The current Compose formats do not support multiple-keysyms. + * Therefore, if you are using a function such as xkb_state_key_get_syms() + * and it returns more than one keysym, consider feeding XKB_KEY_NoSymbol + * instead. + * + * @param state + * The compose state object. + * @param keysym + * A keysym, usually obtained after a key-press event, with a + * function such as xkb_state_key_get_one_sym(). + * + * @returns Whether the keysym was ignored. This is useful, for example, + * if you want to keep a record of the sequence matched thus far. + * + * @memberof xkb_compose_state + */ +enum xkb_compose_feed_result +xkb_compose_state_feed(struct xkb_compose_state *state, + xkb_keysym_t keysym); + +/** + * Reset the Compose sequence state machine. + * + * The status is set to XKB_COMPOSE_NOTHING, and the current sequence + * is discarded. + * + * @memberof xkb_compose_state + */ +void +xkb_compose_state_reset(struct xkb_compose_state *state); + +/** + * Get the current status of the compose state machine. + * + * @see xkb_compose_status + * @memberof xkb_compose_state + **/ +enum xkb_compose_status +xkb_compose_state_get_status(struct xkb_compose_state *state); + +/** + * Get the result Unicode/UTF-8 string for a composed sequence. + * + * See @ref compose-overview for more details. This function is only + * useful when the status is XKB_COMPOSE_COMPOSED. + * + * @param[in] state + * The compose state. + * @param[out] buffer + * A buffer to write the string into. + * @param[in] size + * Size of the buffer. + * + * @warning If the buffer passed is too small, the string is truncated + * (though still NUL-terminated). + * + * @returns + * The number of bytes required for the string, excluding the NUL byte. + * If the sequence is not complete, or does not have a viable result + * string, returns 0, and sets `buffer` to the empty string (if possible). + * @returns + * You may check if truncation has occurred by comparing the return value + * with the size of `buffer`, similarly to the `snprintf`(3) function. + * You may safely pass NULL and 0 to `buffer` and `size` to find the + * required size (without the NUL-byte). + * + * @memberof xkb_compose_state + **/ +int +xkb_compose_state_get_utf8(struct xkb_compose_state *state, + char *buffer, size_t size); + +/** + * Get the result keysym for a composed sequence. + * + * See @ref compose-overview for more details. This function is only + * useful when the status is XKB_COMPOSE_COMPOSED. + * + * @returns The result keysym. If the sequence is not complete, or does + * not specify a result keysym, returns XKB_KEY_NoSymbol. + * + * @memberof xkb_compose_state + **/ +xkb_keysym_t +xkb_compose_state_get_one_sym(struct xkb_compose_state *state); + +/** @} */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* _XKBCOMMON_COMPOSE_H */ diff --git a/include/xkbcommon/xkbcommon-keysyms.h b/include/xkbcommon/xkbcommon-keysyms.h new file mode 100644 index 0000000..7c75c29 --- /dev/null +++ b/include/xkbcommon/xkbcommon-keysyms.h @@ -0,0 +1,3248 @@ +#ifndef _XKBCOMMON_KEYSYMS_H +#define _XKBCOMMON_KEYSYMS_H + +/* This file is autogenerated; please do not commit directly. */ + +#define XKB_KEY_NoSymbol 0x000000 /* Special KeySym */ + +/*********************************************************** +Copyright 1987, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/* + * The "X11 Window System Protocol" standard defines in Appendix A the + * keysym codes. These 29-bit integer values identify characters or + * functions associated with each key (e.g., via the visible + * engraving) of a keyboard layout. This file assigns mnemonic macro + * names for these keysyms. + * + * This file is also compiled (by src/util/makekeys.c in libX11) into + * hash tables that can be accessed with X11 library functions such as + * XStringToKeysym() and XKeysymToString(). + * + * Where a keysym corresponds one-to-one to an ISO 10646 / Unicode + * character, this is noted in a comment that provides both the U+xxxx + * Unicode position, as well as the official Unicode name of the + * character. + * + * Where the correspondence is either not one-to-one or semantically + * unclear, the Unicode position and name are enclosed in + * parentheses. Such legacy keysyms should be considered deprecated + * and are not recommended for use in future keyboard mappings. + * + * For any future extension of the keysyms with characters already + * found in ISO 10646 / Unicode, the following algorithm shall be + * used. The new keysym code position will simply be the character's + * Unicode number plus 0x01000000. The keysym values in the range + * 0x01000100 to 0x0110ffff are reserved to represent Unicode + * characters in the range U+0100 to U+10FFFF. + * + * While most newer Unicode-based X11 clients do already accept + * Unicode-mapped keysyms in the range 0x01000100 to 0x0110ffff, it + * will remain necessary for clients -- in the interest of + * compatibility with existing servers -- to also understand the + * existing legacy keysym values in the range 0x0100 to 0x20ff. + * + * Where several mnemonic names are defined for the same keysym in this + * file, all but the first one listed should be considered deprecated. + * + * Mnemonic names for keysyms are defined in this file with lines + * that match one of these Perl regular expressions: + * + * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\* U\+([0-9A-F]{4,6}) (.*) \*\/\s*$/ + * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\*\(U\+([0-9A-F]{4,6}) (.*)\)\*\/\s*$/ + * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/ + * + * Before adding new keysyms, please do consider the following: In + * addition to the keysym names defined in this file, the + * XStringToKeysym() and XKeysymToString() functions will also handle + * any keysym string of the form "U0020" to "U007E" and "U00A0" to + * "U10FFFF" for all possible Unicode characters. In other words, + * every possible Unicode character has already a keysym string + * defined algorithmically, even if it is not listed here. Therefore, + * defining an additional keysym macro is only necessary where a + * non-hexadecimal mnemonic name is needed, or where the new keysym + * does not represent any existing Unicode character. + * + * When adding new keysyms to this file, do not forget to also update the + * following as needed: + * + * - the mappings in src/KeyBind.c in the libX11 repo + * https://gitlab.freedesktop.org/xorg/lib/libx11 + * + * - the protocol specification in specs/keysyms.xml in this repo + * https://gitlab.freedesktop.org/xorg/proto/xorgproto + * + */ + +#define XKB_KEY_VoidSymbol 0xffffff /* Void symbol */ + +/* + * TTY function keys, cleverly chosen to map to ASCII, for convenience of + * programming, but could have been arbitrary (at the cost of lookup + * tables in client code). + */ + +#define XKB_KEY_BackSpace 0xff08 /* Back space, back char */ +#define XKB_KEY_Tab 0xff09 +#define XKB_KEY_Linefeed 0xff0a /* Linefeed, LF */ +#define XKB_KEY_Clear 0xff0b +#define XKB_KEY_Return 0xff0d /* Return, enter */ +#define XKB_KEY_Pause 0xff13 /* Pause, hold */ +#define XKB_KEY_Scroll_Lock 0xff14 +#define XKB_KEY_Sys_Req 0xff15 +#define XKB_KEY_Escape 0xff1b +#define XKB_KEY_Delete 0xffff /* Delete, rubout */ + + + +/* International & multi-key character composition */ + +#define XKB_KEY_Multi_key 0xff20 /* Multi-key character compose */ +#define XKB_KEY_Codeinput 0xff37 +#define XKB_KEY_SingleCandidate 0xff3c +#define XKB_KEY_MultipleCandidate 0xff3d +#define XKB_KEY_PreviousCandidate 0xff3e + +/* Japanese keyboard support */ + +#define XKB_KEY_Kanji 0xff21 /* Kanji, Kanji convert */ +#define XKB_KEY_Muhenkan 0xff22 /* Cancel Conversion */ +#define XKB_KEY_Henkan_Mode 0xff23 /* Start/Stop Conversion */ +#define XKB_KEY_Henkan 0xff23 /* Alias for Henkan_Mode */ +#define XKB_KEY_Romaji 0xff24 /* to Romaji */ +#define XKB_KEY_Hiragana 0xff25 /* to Hiragana */ +#define XKB_KEY_Katakana 0xff26 /* to Katakana */ +#define XKB_KEY_Hiragana_Katakana 0xff27 /* Hiragana/Katakana toggle */ +#define XKB_KEY_Zenkaku 0xff28 /* to Zenkaku */ +#define XKB_KEY_Hankaku 0xff29 /* to Hankaku */ +#define XKB_KEY_Zenkaku_Hankaku 0xff2a /* Zenkaku/Hankaku toggle */ +#define XKB_KEY_Touroku 0xff2b /* Add to Dictionary */ +#define XKB_KEY_Massyo 0xff2c /* Delete from Dictionary */ +#define XKB_KEY_Kana_Lock 0xff2d /* Kana Lock */ +#define XKB_KEY_Kana_Shift 0xff2e /* Kana Shift */ +#define XKB_KEY_Eisu_Shift 0xff2f /* Alphanumeric Shift */ +#define XKB_KEY_Eisu_toggle 0xff30 /* Alphanumeric toggle */ +#define XKB_KEY_Kanji_Bangou 0xff37 /* Codeinput */ +#define XKB_KEY_Zen_Koho 0xff3d /* Multiple/All Candidate(s) */ +#define XKB_KEY_Mae_Koho 0xff3e /* Previous Candidate */ + +/* 0xff31 thru 0xff3f are under XK_KOREAN */ + +/* Cursor control & motion */ + +#define XKB_KEY_Home 0xff50 +#define XKB_KEY_Left 0xff51 /* Move left, left arrow */ +#define XKB_KEY_Up 0xff52 /* Move up, up arrow */ +#define XKB_KEY_Right 0xff53 /* Move right, right arrow */ +#define XKB_KEY_Down 0xff54 /* Move down, down arrow */ +#define XKB_KEY_Prior 0xff55 /* Prior, previous */ +#define XKB_KEY_Page_Up 0xff55 +#define XKB_KEY_Next 0xff56 /* Next */ +#define XKB_KEY_Page_Down 0xff56 +#define XKB_KEY_End 0xff57 /* EOL */ +#define XKB_KEY_Begin 0xff58 /* BOL */ + + +/* Misc functions */ + +#define XKB_KEY_Select 0xff60 /* Select, mark */ +#define XKB_KEY_Print 0xff61 +#define XKB_KEY_Execute 0xff62 /* Execute, run, do */ +#define XKB_KEY_Insert 0xff63 /* Insert, insert here */ +#define XKB_KEY_Undo 0xff65 +#define XKB_KEY_Redo 0xff66 /* Redo, again */ +#define XKB_KEY_Menu 0xff67 +#define XKB_KEY_Find 0xff68 /* Find, search */ +#define XKB_KEY_Cancel 0xff69 /* Cancel, stop, abort, exit */ +#define XKB_KEY_Help 0xff6a /* Help */ +#define XKB_KEY_Break 0xff6b +#define XKB_KEY_Mode_switch 0xff7e /* Character set switch */ +#define XKB_KEY_script_switch 0xff7e /* Alias for mode_switch */ +#define XKB_KEY_Num_Lock 0xff7f + +/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ + +#define XKB_KEY_KP_Space 0xff80 /* Space */ +#define XKB_KEY_KP_Tab 0xff89 +#define XKB_KEY_KP_Enter 0xff8d /* Enter */ +#define XKB_KEY_KP_F1 0xff91 /* PF1, KP_A, ... */ +#define XKB_KEY_KP_F2 0xff92 +#define XKB_KEY_KP_F3 0xff93 +#define XKB_KEY_KP_F4 0xff94 +#define XKB_KEY_KP_Home 0xff95 +#define XKB_KEY_KP_Left 0xff96 +#define XKB_KEY_KP_Up 0xff97 +#define XKB_KEY_KP_Right 0xff98 +#define XKB_KEY_KP_Down 0xff99 +#define XKB_KEY_KP_Prior 0xff9a +#define XKB_KEY_KP_Page_Up 0xff9a +#define XKB_KEY_KP_Next 0xff9b +#define XKB_KEY_KP_Page_Down 0xff9b +#define XKB_KEY_KP_End 0xff9c +#define XKB_KEY_KP_Begin 0xff9d +#define XKB_KEY_KP_Insert 0xff9e +#define XKB_KEY_KP_Delete 0xff9f +#define XKB_KEY_KP_Equal 0xffbd /* Equals */ +#define XKB_KEY_KP_Multiply 0xffaa +#define XKB_KEY_KP_Add 0xffab +#define XKB_KEY_KP_Separator 0xffac /* Separator, often comma */ +#define XKB_KEY_KP_Subtract 0xffad +#define XKB_KEY_KP_Decimal 0xffae +#define XKB_KEY_KP_Divide 0xffaf + +#define XKB_KEY_KP_0 0xffb0 +#define XKB_KEY_KP_1 0xffb1 +#define XKB_KEY_KP_2 0xffb2 +#define XKB_KEY_KP_3 0xffb3 +#define XKB_KEY_KP_4 0xffb4 +#define XKB_KEY_KP_5 0xffb5 +#define XKB_KEY_KP_6 0xffb6 +#define XKB_KEY_KP_7 0xffb7 +#define XKB_KEY_KP_8 0xffb8 +#define XKB_KEY_KP_9 0xffb9 + + + +/* + * Auxiliary functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufacturers have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + +#define XKB_KEY_F1 0xffbe +#define XKB_KEY_F2 0xffbf +#define XKB_KEY_F3 0xffc0 +#define XKB_KEY_F4 0xffc1 +#define XKB_KEY_F5 0xffc2 +#define XKB_KEY_F6 0xffc3 +#define XKB_KEY_F7 0xffc4 +#define XKB_KEY_F8 0xffc5 +#define XKB_KEY_F9 0xffc6 +#define XKB_KEY_F10 0xffc7 +#define XKB_KEY_F11 0xffc8 +#define XKB_KEY_L1 0xffc8 +#define XKB_KEY_F12 0xffc9 +#define XKB_KEY_L2 0xffc9 +#define XKB_KEY_F13 0xffca +#define XKB_KEY_L3 0xffca +#define XKB_KEY_F14 0xffcb +#define XKB_KEY_L4 0xffcb +#define XKB_KEY_F15 0xffcc +#define XKB_KEY_L5 0xffcc +#define XKB_KEY_F16 0xffcd +#define XKB_KEY_L6 0xffcd +#define XKB_KEY_F17 0xffce +#define XKB_KEY_L7 0xffce +#define XKB_KEY_F18 0xffcf +#define XKB_KEY_L8 0xffcf +#define XKB_KEY_F19 0xffd0 +#define XKB_KEY_L9 0xffd0 +#define XKB_KEY_F20 0xffd1 +#define XKB_KEY_L10 0xffd1 +#define XKB_KEY_F21 0xffd2 +#define XKB_KEY_R1 0xffd2 +#define XKB_KEY_F22 0xffd3 +#define XKB_KEY_R2 0xffd3 +#define XKB_KEY_F23 0xffd4 +#define XKB_KEY_R3 0xffd4 +#define XKB_KEY_F24 0xffd5 +#define XKB_KEY_R4 0xffd5 +#define XKB_KEY_F25 0xffd6 +#define XKB_KEY_R5 0xffd6 +#define XKB_KEY_F26 0xffd7 +#define XKB_KEY_R6 0xffd7 +#define XKB_KEY_F27 0xffd8 +#define XKB_KEY_R7 0xffd8 +#define XKB_KEY_F28 0xffd9 +#define XKB_KEY_R8 0xffd9 +#define XKB_KEY_F29 0xffda +#define XKB_KEY_R9 0xffda +#define XKB_KEY_F30 0xffdb +#define XKB_KEY_R10 0xffdb +#define XKB_KEY_F31 0xffdc +#define XKB_KEY_R11 0xffdc +#define XKB_KEY_F32 0xffdd +#define XKB_KEY_R12 0xffdd +#define XKB_KEY_F33 0xffde +#define XKB_KEY_R13 0xffde +#define XKB_KEY_F34 0xffdf +#define XKB_KEY_R14 0xffdf +#define XKB_KEY_F35 0xffe0 +#define XKB_KEY_R15 0xffe0 + +/* Modifiers */ + +#define XKB_KEY_Shift_L 0xffe1 /* Left shift */ +#define XKB_KEY_Shift_R 0xffe2 /* Right shift */ +#define XKB_KEY_Control_L 0xffe3 /* Left control */ +#define XKB_KEY_Control_R 0xffe4 /* Right control */ +#define XKB_KEY_Caps_Lock 0xffe5 /* Caps lock */ +#define XKB_KEY_Shift_Lock 0xffe6 /* Shift lock */ + +#define XKB_KEY_Meta_L 0xffe7 /* Left meta */ +#define XKB_KEY_Meta_R 0xffe8 /* Right meta */ +#define XKB_KEY_Alt_L 0xffe9 /* Left alt */ +#define XKB_KEY_Alt_R 0xffea /* Right alt */ +#define XKB_KEY_Super_L 0xffeb /* Left super */ +#define XKB_KEY_Super_R 0xffec /* Right super */ +#define XKB_KEY_Hyper_L 0xffed /* Left hyper */ +#define XKB_KEY_Hyper_R 0xffee /* Right hyper */ + +/* + * Keyboard (XKB) Extension function and modifier keys + * (from Appendix C of "The X Keyboard Extension: Protocol Specification") + * Byte 3 = 0xfe + */ + +#define XKB_KEY_ISO_Lock 0xfe01 +#define XKB_KEY_ISO_Level2_Latch 0xfe02 +#define XKB_KEY_ISO_Level3_Shift 0xfe03 +#define XKB_KEY_ISO_Level3_Latch 0xfe04 +#define XKB_KEY_ISO_Level3_Lock 0xfe05 +#define XKB_KEY_ISO_Level5_Shift 0xfe11 +#define XKB_KEY_ISO_Level5_Latch 0xfe12 +#define XKB_KEY_ISO_Level5_Lock 0xfe13 +#define XKB_KEY_ISO_Group_Shift 0xff7e /* Alias for mode_switch */ +#define XKB_KEY_ISO_Group_Latch 0xfe06 +#define XKB_KEY_ISO_Group_Lock 0xfe07 +#define XKB_KEY_ISO_Next_Group 0xfe08 +#define XKB_KEY_ISO_Next_Group_Lock 0xfe09 +#define XKB_KEY_ISO_Prev_Group 0xfe0a +#define XKB_KEY_ISO_Prev_Group_Lock 0xfe0b +#define XKB_KEY_ISO_First_Group 0xfe0c +#define XKB_KEY_ISO_First_Group_Lock 0xfe0d +#define XKB_KEY_ISO_Last_Group 0xfe0e +#define XKB_KEY_ISO_Last_Group_Lock 0xfe0f + +#define XKB_KEY_ISO_Left_Tab 0xfe20 +#define XKB_KEY_ISO_Move_Line_Up 0xfe21 +#define XKB_KEY_ISO_Move_Line_Down 0xfe22 +#define XKB_KEY_ISO_Partial_Line_Up 0xfe23 +#define XKB_KEY_ISO_Partial_Line_Down 0xfe24 +#define XKB_KEY_ISO_Partial_Space_Left 0xfe25 +#define XKB_KEY_ISO_Partial_Space_Right 0xfe26 +#define XKB_KEY_ISO_Set_Margin_Left 0xfe27 +#define XKB_KEY_ISO_Set_Margin_Right 0xfe28 +#define XKB_KEY_ISO_Release_Margin_Left 0xfe29 +#define XKB_KEY_ISO_Release_Margin_Right 0xfe2a +#define XKB_KEY_ISO_Release_Both_Margins 0xfe2b +#define XKB_KEY_ISO_Fast_Cursor_Left 0xfe2c +#define XKB_KEY_ISO_Fast_Cursor_Right 0xfe2d +#define XKB_KEY_ISO_Fast_Cursor_Up 0xfe2e +#define XKB_KEY_ISO_Fast_Cursor_Down 0xfe2f +#define XKB_KEY_ISO_Continuous_Underline 0xfe30 +#define XKB_KEY_ISO_Discontinuous_Underline 0xfe31 +#define XKB_KEY_ISO_Emphasize 0xfe32 +#define XKB_KEY_ISO_Center_Object 0xfe33 +#define XKB_KEY_ISO_Enter 0xfe34 + +#define XKB_KEY_dead_grave 0xfe50 +#define XKB_KEY_dead_acute 0xfe51 +#define XKB_KEY_dead_circumflex 0xfe52 +#define XKB_KEY_dead_tilde 0xfe53 +#define XKB_KEY_dead_perispomeni 0xfe53 /* alias for dead_tilde */ +#define XKB_KEY_dead_macron 0xfe54 +#define XKB_KEY_dead_breve 0xfe55 +#define XKB_KEY_dead_abovedot 0xfe56 +#define XKB_KEY_dead_diaeresis 0xfe57 +#define XKB_KEY_dead_abovering 0xfe58 +#define XKB_KEY_dead_doubleacute 0xfe59 +#define XKB_KEY_dead_caron 0xfe5a +#define XKB_KEY_dead_cedilla 0xfe5b +#define XKB_KEY_dead_ogonek 0xfe5c +#define XKB_KEY_dead_iota 0xfe5d +#define XKB_KEY_dead_voiced_sound 0xfe5e +#define XKB_KEY_dead_semivoiced_sound 0xfe5f +#define XKB_KEY_dead_belowdot 0xfe60 +#define XKB_KEY_dead_hook 0xfe61 +#define XKB_KEY_dead_horn 0xfe62 +#define XKB_KEY_dead_stroke 0xfe63 +#define XKB_KEY_dead_abovecomma 0xfe64 +#define XKB_KEY_dead_psili 0xfe64 /* alias for dead_abovecomma */ +#define XKB_KEY_dead_abovereversedcomma 0xfe65 +#define XKB_KEY_dead_dasia 0xfe65 /* alias for dead_abovereversedcomma */ +#define XKB_KEY_dead_doublegrave 0xfe66 +#define XKB_KEY_dead_belowring 0xfe67 +#define XKB_KEY_dead_belowmacron 0xfe68 +#define XKB_KEY_dead_belowcircumflex 0xfe69 +#define XKB_KEY_dead_belowtilde 0xfe6a +#define XKB_KEY_dead_belowbreve 0xfe6b +#define XKB_KEY_dead_belowdiaeresis 0xfe6c +#define XKB_KEY_dead_invertedbreve 0xfe6d +#define XKB_KEY_dead_belowcomma 0xfe6e +#define XKB_KEY_dead_currency 0xfe6f + +/* extra dead elements for German T3 layout */ +#define XKB_KEY_dead_lowline 0xfe90 +#define XKB_KEY_dead_aboveverticalline 0xfe91 +#define XKB_KEY_dead_belowverticalline 0xfe92 +#define XKB_KEY_dead_longsolidusoverlay 0xfe93 + +/* dead vowels for universal syllable entry */ +#define XKB_KEY_dead_a 0xfe80 +#define XKB_KEY_dead_A 0xfe81 +#define XKB_KEY_dead_e 0xfe82 +#define XKB_KEY_dead_E 0xfe83 +#define XKB_KEY_dead_i 0xfe84 +#define XKB_KEY_dead_I 0xfe85 +#define XKB_KEY_dead_o 0xfe86 +#define XKB_KEY_dead_O 0xfe87 +#define XKB_KEY_dead_u 0xfe88 +#define XKB_KEY_dead_U 0xfe89 +#define XKB_KEY_dead_small_schwa 0xfe8a +#define XKB_KEY_dead_capital_schwa 0xfe8b + +#define XKB_KEY_dead_greek 0xfe8c + +#define XKB_KEY_First_Virtual_Screen 0xfed0 +#define XKB_KEY_Prev_Virtual_Screen 0xfed1 +#define XKB_KEY_Next_Virtual_Screen 0xfed2 +#define XKB_KEY_Last_Virtual_Screen 0xfed4 +#define XKB_KEY_Terminate_Server 0xfed5 + +#define XKB_KEY_AccessX_Enable 0xfe70 +#define XKB_KEY_AccessX_Feedback_Enable 0xfe71 +#define XKB_KEY_RepeatKeys_Enable 0xfe72 +#define XKB_KEY_SlowKeys_Enable 0xfe73 +#define XKB_KEY_BounceKeys_Enable 0xfe74 +#define XKB_KEY_StickyKeys_Enable 0xfe75 +#define XKB_KEY_MouseKeys_Enable 0xfe76 +#define XKB_KEY_MouseKeys_Accel_Enable 0xfe77 +#define XKB_KEY_Overlay1_Enable 0xfe78 +#define XKB_KEY_Overlay2_Enable 0xfe79 +#define XKB_KEY_AudibleBell_Enable 0xfe7a + +#define XKB_KEY_Pointer_Left 0xfee0 +#define XKB_KEY_Pointer_Right 0xfee1 +#define XKB_KEY_Pointer_Up 0xfee2 +#define XKB_KEY_Pointer_Down 0xfee3 +#define XKB_KEY_Pointer_UpLeft 0xfee4 +#define XKB_KEY_Pointer_UpRight 0xfee5 +#define XKB_KEY_Pointer_DownLeft 0xfee6 +#define XKB_KEY_Pointer_DownRight 0xfee7 +#define XKB_KEY_Pointer_Button_Dflt 0xfee8 +#define XKB_KEY_Pointer_Button1 0xfee9 +#define XKB_KEY_Pointer_Button2 0xfeea +#define XKB_KEY_Pointer_Button3 0xfeeb +#define XKB_KEY_Pointer_Button4 0xfeec +#define XKB_KEY_Pointer_Button5 0xfeed +#define XKB_KEY_Pointer_DblClick_Dflt 0xfeee +#define XKB_KEY_Pointer_DblClick1 0xfeef +#define XKB_KEY_Pointer_DblClick2 0xfef0 +#define XKB_KEY_Pointer_DblClick3 0xfef1 +#define XKB_KEY_Pointer_DblClick4 0xfef2 +#define XKB_KEY_Pointer_DblClick5 0xfef3 +#define XKB_KEY_Pointer_Drag_Dflt 0xfef4 +#define XKB_KEY_Pointer_Drag1 0xfef5 +#define XKB_KEY_Pointer_Drag2 0xfef6 +#define XKB_KEY_Pointer_Drag3 0xfef7 +#define XKB_KEY_Pointer_Drag4 0xfef8 +#define XKB_KEY_Pointer_Drag5 0xfefd + +#define XKB_KEY_Pointer_EnableKeys 0xfef9 +#define XKB_KEY_Pointer_Accelerate 0xfefa +#define XKB_KEY_Pointer_DfltBtnNext 0xfefb +#define XKB_KEY_Pointer_DfltBtnPrev 0xfefc + +/* Single-Stroke Multiple-Character N-Graph Keysyms For The X Input Method */ + +#define XKB_KEY_ch 0xfea0 +#define XKB_KEY_Ch 0xfea1 +#define XKB_KEY_CH 0xfea2 +#define XKB_KEY_c_h 0xfea3 +#define XKB_KEY_C_h 0xfea4 +#define XKB_KEY_C_H 0xfea5 + + +/* + * 3270 Terminal Keys + * Byte 3 = 0xfd + */ + +#define XKB_KEY_3270_Duplicate 0xfd01 +#define XKB_KEY_3270_FieldMark 0xfd02 +#define XKB_KEY_3270_Right2 0xfd03 +#define XKB_KEY_3270_Left2 0xfd04 +#define XKB_KEY_3270_BackTab 0xfd05 +#define XKB_KEY_3270_EraseEOF 0xfd06 +#define XKB_KEY_3270_EraseInput 0xfd07 +#define XKB_KEY_3270_Reset 0xfd08 +#define XKB_KEY_3270_Quit 0xfd09 +#define XKB_KEY_3270_PA1 0xfd0a +#define XKB_KEY_3270_PA2 0xfd0b +#define XKB_KEY_3270_PA3 0xfd0c +#define XKB_KEY_3270_Test 0xfd0d +#define XKB_KEY_3270_Attn 0xfd0e +#define XKB_KEY_3270_CursorBlink 0xfd0f +#define XKB_KEY_3270_AltCursor 0xfd10 +#define XKB_KEY_3270_KeyClick 0xfd11 +#define XKB_KEY_3270_Jump 0xfd12 +#define XKB_KEY_3270_Ident 0xfd13 +#define XKB_KEY_3270_Rule 0xfd14 +#define XKB_KEY_3270_Copy 0xfd15 +#define XKB_KEY_3270_Play 0xfd16 +#define XKB_KEY_3270_Setup 0xfd17 +#define XKB_KEY_3270_Record 0xfd18 +#define XKB_KEY_3270_ChangeScreen 0xfd19 +#define XKB_KEY_3270_DeleteWord 0xfd1a +#define XKB_KEY_3270_ExSelect 0xfd1b +#define XKB_KEY_3270_CursorSelect 0xfd1c +#define XKB_KEY_3270_PrintScreen 0xfd1d +#define XKB_KEY_3270_Enter 0xfd1e + +/* + * Latin 1 + * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF) + * Byte 3 = 0 + */ +#define XKB_KEY_space 0x0020 /* U+0020 SPACE */ +#define XKB_KEY_exclam 0x0021 /* U+0021 EXCLAMATION MARK */ +#define XKB_KEY_quotedbl 0x0022 /* U+0022 QUOTATION MARK */ +#define XKB_KEY_numbersign 0x0023 /* U+0023 NUMBER SIGN */ +#define XKB_KEY_dollar 0x0024 /* U+0024 DOLLAR SIGN */ +#define XKB_KEY_percent 0x0025 /* U+0025 PERCENT SIGN */ +#define XKB_KEY_ampersand 0x0026 /* U+0026 AMPERSAND */ +#define XKB_KEY_apostrophe 0x0027 /* U+0027 APOSTROPHE */ +#define XKB_KEY_quoteright 0x0027 /* deprecated */ +#define XKB_KEY_parenleft 0x0028 /* U+0028 LEFT PARENTHESIS */ +#define XKB_KEY_parenright 0x0029 /* U+0029 RIGHT PARENTHESIS */ +#define XKB_KEY_asterisk 0x002a /* U+002A ASTERISK */ +#define XKB_KEY_plus 0x002b /* U+002B PLUS SIGN */ +#define XKB_KEY_comma 0x002c /* U+002C COMMA */ +#define XKB_KEY_minus 0x002d /* U+002D HYPHEN-MINUS */ +#define XKB_KEY_period 0x002e /* U+002E FULL STOP */ +#define XKB_KEY_slash 0x002f /* U+002F SOLIDUS */ +#define XKB_KEY_0 0x0030 /* U+0030 DIGIT ZERO */ +#define XKB_KEY_1 0x0031 /* U+0031 DIGIT ONE */ +#define XKB_KEY_2 0x0032 /* U+0032 DIGIT TWO */ +#define XKB_KEY_3 0x0033 /* U+0033 DIGIT THREE */ +#define XKB_KEY_4 0x0034 /* U+0034 DIGIT FOUR */ +#define XKB_KEY_5 0x0035 /* U+0035 DIGIT FIVE */ +#define XKB_KEY_6 0x0036 /* U+0036 DIGIT SIX */ +#define XKB_KEY_7 0x0037 /* U+0037 DIGIT SEVEN */ +#define XKB_KEY_8 0x0038 /* U+0038 DIGIT EIGHT */ +#define XKB_KEY_9 0x0039 /* U+0039 DIGIT NINE */ +#define XKB_KEY_colon 0x003a /* U+003A COLON */ +#define XKB_KEY_semicolon 0x003b /* U+003B SEMICOLON */ +#define XKB_KEY_less 0x003c /* U+003C LESS-THAN SIGN */ +#define XKB_KEY_equal 0x003d /* U+003D EQUALS SIGN */ +#define XKB_KEY_greater 0x003e /* U+003E GREATER-THAN SIGN */ +#define XKB_KEY_question 0x003f /* U+003F QUESTION MARK */ +#define XKB_KEY_at 0x0040 /* U+0040 COMMERCIAL AT */ +#define XKB_KEY_A 0x0041 /* U+0041 LATIN CAPITAL LETTER A */ +#define XKB_KEY_B 0x0042 /* U+0042 LATIN CAPITAL LETTER B */ +#define XKB_KEY_C 0x0043 /* U+0043 LATIN CAPITAL LETTER C */ +#define XKB_KEY_D 0x0044 /* U+0044 LATIN CAPITAL LETTER D */ +#define XKB_KEY_E 0x0045 /* U+0045 LATIN CAPITAL LETTER E */ +#define XKB_KEY_F 0x0046 /* U+0046 LATIN CAPITAL LETTER F */ +#define XKB_KEY_G 0x0047 /* U+0047 LATIN CAPITAL LETTER G */ +#define XKB_KEY_H 0x0048 /* U+0048 LATIN CAPITAL LETTER H */ +#define XKB_KEY_I 0x0049 /* U+0049 LATIN CAPITAL LETTER I */ +#define XKB_KEY_J 0x004a /* U+004A LATIN CAPITAL LETTER J */ +#define XKB_KEY_K 0x004b /* U+004B LATIN CAPITAL LETTER K */ +#define XKB_KEY_L 0x004c /* U+004C LATIN CAPITAL LETTER L */ +#define XKB_KEY_M 0x004d /* U+004D LATIN CAPITAL LETTER M */ +#define XKB_KEY_N 0x004e /* U+004E LATIN CAPITAL LETTER N */ +#define XKB_KEY_O 0x004f /* U+004F LATIN CAPITAL LETTER O */ +#define XKB_KEY_P 0x0050 /* U+0050 LATIN CAPITAL LETTER P */ +#define XKB_KEY_Q 0x0051 /* U+0051 LATIN CAPITAL LETTER Q */ +#define XKB_KEY_R 0x0052 /* U+0052 LATIN CAPITAL LETTER R */ +#define XKB_KEY_S 0x0053 /* U+0053 LATIN CAPITAL LETTER S */ +#define XKB_KEY_T 0x0054 /* U+0054 LATIN CAPITAL LETTER T */ +#define XKB_KEY_U 0x0055 /* U+0055 LATIN CAPITAL LETTER U */ +#define XKB_KEY_V 0x0056 /* U+0056 LATIN CAPITAL LETTER V */ +#define XKB_KEY_W 0x0057 /* U+0057 LATIN CAPITAL LETTER W */ +#define XKB_KEY_X 0x0058 /* U+0058 LATIN CAPITAL LETTER X */ +#define XKB_KEY_Y 0x0059 /* U+0059 LATIN CAPITAL LETTER Y */ +#define XKB_KEY_Z 0x005a /* U+005A LATIN CAPITAL LETTER Z */ +#define XKB_KEY_bracketleft 0x005b /* U+005B LEFT SQUARE BRACKET */ +#define XKB_KEY_backslash 0x005c /* U+005C REVERSE SOLIDUS */ +#define XKB_KEY_bracketright 0x005d /* U+005D RIGHT SQUARE BRACKET */ +#define XKB_KEY_asciicircum 0x005e /* U+005E CIRCUMFLEX ACCENT */ +#define XKB_KEY_underscore 0x005f /* U+005F LOW LINE */ +#define XKB_KEY_grave 0x0060 /* U+0060 GRAVE ACCENT */ +#define XKB_KEY_quoteleft 0x0060 /* deprecated */ +#define XKB_KEY_a 0x0061 /* U+0061 LATIN SMALL LETTER A */ +#define XKB_KEY_b 0x0062 /* U+0062 LATIN SMALL LETTER B */ +#define XKB_KEY_c 0x0063 /* U+0063 LATIN SMALL LETTER C */ +#define XKB_KEY_d 0x0064 /* U+0064 LATIN SMALL LETTER D */ +#define XKB_KEY_e 0x0065 /* U+0065 LATIN SMALL LETTER E */ +#define XKB_KEY_f 0x0066 /* U+0066 LATIN SMALL LETTER F */ +#define XKB_KEY_g 0x0067 /* U+0067 LATIN SMALL LETTER G */ +#define XKB_KEY_h 0x0068 /* U+0068 LATIN SMALL LETTER H */ +#define XKB_KEY_i 0x0069 /* U+0069 LATIN SMALL LETTER I */ +#define XKB_KEY_j 0x006a /* U+006A LATIN SMALL LETTER J */ +#define XKB_KEY_k 0x006b /* U+006B LATIN SMALL LETTER K */ +#define XKB_KEY_l 0x006c /* U+006C LATIN SMALL LETTER L */ +#define XKB_KEY_m 0x006d /* U+006D LATIN SMALL LETTER M */ +#define XKB_KEY_n 0x006e /* U+006E LATIN SMALL LETTER N */ +#define XKB_KEY_o 0x006f /* U+006F LATIN SMALL LETTER O */ +#define XKB_KEY_p 0x0070 /* U+0070 LATIN SMALL LETTER P */ +#define XKB_KEY_q 0x0071 /* U+0071 LATIN SMALL LETTER Q */ +#define XKB_KEY_r 0x0072 /* U+0072 LATIN SMALL LETTER R */ +#define XKB_KEY_s 0x0073 /* U+0073 LATIN SMALL LETTER S */ +#define XKB_KEY_t 0x0074 /* U+0074 LATIN SMALL LETTER T */ +#define XKB_KEY_u 0x0075 /* U+0075 LATIN SMALL LETTER U */ +#define XKB_KEY_v 0x0076 /* U+0076 LATIN SMALL LETTER V */ +#define XKB_KEY_w 0x0077 /* U+0077 LATIN SMALL LETTER W */ +#define XKB_KEY_x 0x0078 /* U+0078 LATIN SMALL LETTER X */ +#define XKB_KEY_y 0x0079 /* U+0079 LATIN SMALL LETTER Y */ +#define XKB_KEY_z 0x007a /* U+007A LATIN SMALL LETTER Z */ +#define XKB_KEY_braceleft 0x007b /* U+007B LEFT CURLY BRACKET */ +#define XKB_KEY_bar 0x007c /* U+007C VERTICAL LINE */ +#define XKB_KEY_braceright 0x007d /* U+007D RIGHT CURLY BRACKET */ +#define XKB_KEY_asciitilde 0x007e /* U+007E TILDE */ + +#define XKB_KEY_nobreakspace 0x00a0 /* U+00A0 NO-BREAK SPACE */ +#define XKB_KEY_exclamdown 0x00a1 /* U+00A1 INVERTED EXCLAMATION MARK */ +#define XKB_KEY_cent 0x00a2 /* U+00A2 CENT SIGN */ +#define XKB_KEY_sterling 0x00a3 /* U+00A3 POUND SIGN */ +#define XKB_KEY_currency 0x00a4 /* U+00A4 CURRENCY SIGN */ +#define XKB_KEY_yen 0x00a5 /* U+00A5 YEN SIGN */ +#define XKB_KEY_brokenbar 0x00a6 /* U+00A6 BROKEN BAR */ +#define XKB_KEY_section 0x00a7 /* U+00A7 SECTION SIGN */ +#define XKB_KEY_diaeresis 0x00a8 /* U+00A8 DIAERESIS */ +#define XKB_KEY_copyright 0x00a9 /* U+00A9 COPYRIGHT SIGN */ +#define XKB_KEY_ordfeminine 0x00aa /* U+00AA FEMININE ORDINAL INDICATOR */ +#define XKB_KEY_guillemotleft 0x00ab /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ +#define XKB_KEY_notsign 0x00ac /* U+00AC NOT SIGN */ +#define XKB_KEY_hyphen 0x00ad /* U+00AD SOFT HYPHEN */ +#define XKB_KEY_registered 0x00ae /* U+00AE REGISTERED SIGN */ +#define XKB_KEY_macron 0x00af /* U+00AF MACRON */ +#define XKB_KEY_degree 0x00b0 /* U+00B0 DEGREE SIGN */ +#define XKB_KEY_plusminus 0x00b1 /* U+00B1 PLUS-MINUS SIGN */ +#define XKB_KEY_twosuperior 0x00b2 /* U+00B2 SUPERSCRIPT TWO */ +#define XKB_KEY_threesuperior 0x00b3 /* U+00B3 SUPERSCRIPT THREE */ +#define XKB_KEY_acute 0x00b4 /* U+00B4 ACUTE ACCENT */ +#define XKB_KEY_mu 0x00b5 /* U+00B5 MICRO SIGN */ +#define XKB_KEY_paragraph 0x00b6 /* U+00B6 PILCROW SIGN */ +#define XKB_KEY_periodcentered 0x00b7 /* U+00B7 MIDDLE DOT */ +#define XKB_KEY_cedilla 0x00b8 /* U+00B8 CEDILLA */ +#define XKB_KEY_onesuperior 0x00b9 /* U+00B9 SUPERSCRIPT ONE */ +#define XKB_KEY_masculine 0x00ba /* U+00BA MASCULINE ORDINAL INDICATOR */ +#define XKB_KEY_guillemotright 0x00bb /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ +#define XKB_KEY_onequarter 0x00bc /* U+00BC VULGAR FRACTION ONE QUARTER */ +#define XKB_KEY_onehalf 0x00bd /* U+00BD VULGAR FRACTION ONE HALF */ +#define XKB_KEY_threequarters 0x00be /* U+00BE VULGAR FRACTION THREE QUARTERS */ +#define XKB_KEY_questiondown 0x00bf /* U+00BF INVERTED QUESTION MARK */ +#define XKB_KEY_Agrave 0x00c0 /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ +#define XKB_KEY_Aacute 0x00c1 /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ +#define XKB_KEY_Acircumflex 0x00c2 /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ +#define XKB_KEY_Atilde 0x00c3 /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ +#define XKB_KEY_Adiaeresis 0x00c4 /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ +#define XKB_KEY_Aring 0x00c5 /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ +#define XKB_KEY_AE 0x00c6 /* U+00C6 LATIN CAPITAL LETTER AE */ +#define XKB_KEY_Ccedilla 0x00c7 /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ +#define XKB_KEY_Egrave 0x00c8 /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ +#define XKB_KEY_Eacute 0x00c9 /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ +#define XKB_KEY_Ecircumflex 0x00ca /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ +#define XKB_KEY_Ediaeresis 0x00cb /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ +#define XKB_KEY_Igrave 0x00cc /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ +#define XKB_KEY_Iacute 0x00cd /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ +#define XKB_KEY_Icircumflex 0x00ce /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ +#define XKB_KEY_Idiaeresis 0x00cf /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ +#define XKB_KEY_ETH 0x00d0 /* U+00D0 LATIN CAPITAL LETTER ETH */ +#define XKB_KEY_Eth 0x00d0 /* deprecated */ +#define XKB_KEY_Ntilde 0x00d1 /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ +#define XKB_KEY_Ograve 0x00d2 /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ +#define XKB_KEY_Oacute 0x00d3 /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ +#define XKB_KEY_Ocircumflex 0x00d4 /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ +#define XKB_KEY_Otilde 0x00d5 /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ +#define XKB_KEY_Odiaeresis 0x00d6 /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ +#define XKB_KEY_multiply 0x00d7 /* U+00D7 MULTIPLICATION SIGN */ +#define XKB_KEY_Oslash 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ +#define XKB_KEY_Ooblique 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ +#define XKB_KEY_Ugrave 0x00d9 /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ +#define XKB_KEY_Uacute 0x00da /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ +#define XKB_KEY_Ucircumflex 0x00db /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ +#define XKB_KEY_Udiaeresis 0x00dc /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ +#define XKB_KEY_Yacute 0x00dd /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ +#define XKB_KEY_THORN 0x00de /* U+00DE LATIN CAPITAL LETTER THORN */ +#define XKB_KEY_Thorn 0x00de /* deprecated */ +#define XKB_KEY_ssharp 0x00df /* U+00DF LATIN SMALL LETTER SHARP S */ +#define XKB_KEY_agrave 0x00e0 /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ +#define XKB_KEY_aacute 0x00e1 /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ +#define XKB_KEY_acircumflex 0x00e2 /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ +#define XKB_KEY_atilde 0x00e3 /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ +#define XKB_KEY_adiaeresis 0x00e4 /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ +#define XKB_KEY_aring 0x00e5 /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ +#define XKB_KEY_ae 0x00e6 /* U+00E6 LATIN SMALL LETTER AE */ +#define XKB_KEY_ccedilla 0x00e7 /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ +#define XKB_KEY_egrave 0x00e8 /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ +#define XKB_KEY_eacute 0x00e9 /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ +#define XKB_KEY_ecircumflex 0x00ea /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ +#define XKB_KEY_ediaeresis 0x00eb /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ +#define XKB_KEY_igrave 0x00ec /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ +#define XKB_KEY_iacute 0x00ed /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ +#define XKB_KEY_icircumflex 0x00ee /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ +#define XKB_KEY_idiaeresis 0x00ef /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ +#define XKB_KEY_eth 0x00f0 /* U+00F0 LATIN SMALL LETTER ETH */ +#define XKB_KEY_ntilde 0x00f1 /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ +#define XKB_KEY_ograve 0x00f2 /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ +#define XKB_KEY_oacute 0x00f3 /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ +#define XKB_KEY_ocircumflex 0x00f4 /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ +#define XKB_KEY_otilde 0x00f5 /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ +#define XKB_KEY_odiaeresis 0x00f6 /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ +#define XKB_KEY_division 0x00f7 /* U+00F7 DIVISION SIGN */ +#define XKB_KEY_oslash 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ +#define XKB_KEY_ooblique 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ +#define XKB_KEY_ugrave 0x00f9 /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ +#define XKB_KEY_uacute 0x00fa /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ +#define XKB_KEY_ucircumflex 0x00fb /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ +#define XKB_KEY_udiaeresis 0x00fc /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ +#define XKB_KEY_yacute 0x00fd /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ +#define XKB_KEY_thorn 0x00fe /* U+00FE LATIN SMALL LETTER THORN */ +#define XKB_KEY_ydiaeresis 0x00ff /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ + +/* + * Latin 2 + * Byte 3 = 1 + */ + +#define XKB_KEY_Aogonek 0x01a1 /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */ +#define XKB_KEY_breve 0x01a2 /* U+02D8 BREVE */ +#define XKB_KEY_Lstroke 0x01a3 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */ +#define XKB_KEY_Lcaron 0x01a5 /* U+013D LATIN CAPITAL LETTER L WITH CARON */ +#define XKB_KEY_Sacute 0x01a6 /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */ +#define XKB_KEY_Scaron 0x01a9 /* U+0160 LATIN CAPITAL LETTER S WITH CARON */ +#define XKB_KEY_Scedilla 0x01aa /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */ +#define XKB_KEY_Tcaron 0x01ab /* U+0164 LATIN CAPITAL LETTER T WITH CARON */ +#define XKB_KEY_Zacute 0x01ac /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */ +#define XKB_KEY_Zcaron 0x01ae /* U+017D LATIN CAPITAL LETTER Z WITH CARON */ +#define XKB_KEY_Zabovedot 0x01af /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */ +#define XKB_KEY_aogonek 0x01b1 /* U+0105 LATIN SMALL LETTER A WITH OGONEK */ +#define XKB_KEY_ogonek 0x01b2 /* U+02DB OGONEK */ +#define XKB_KEY_lstroke 0x01b3 /* U+0142 LATIN SMALL LETTER L WITH STROKE */ +#define XKB_KEY_lcaron 0x01b5 /* U+013E LATIN SMALL LETTER L WITH CARON */ +#define XKB_KEY_sacute 0x01b6 /* U+015B LATIN SMALL LETTER S WITH ACUTE */ +#define XKB_KEY_caron 0x01b7 /* U+02C7 CARON */ +#define XKB_KEY_scaron 0x01b9 /* U+0161 LATIN SMALL LETTER S WITH CARON */ +#define XKB_KEY_scedilla 0x01ba /* U+015F LATIN SMALL LETTER S WITH CEDILLA */ +#define XKB_KEY_tcaron 0x01bb /* U+0165 LATIN SMALL LETTER T WITH CARON */ +#define XKB_KEY_zacute 0x01bc /* U+017A LATIN SMALL LETTER Z WITH ACUTE */ +#define XKB_KEY_doubleacute 0x01bd /* U+02DD DOUBLE ACUTE ACCENT */ +#define XKB_KEY_zcaron 0x01be /* U+017E LATIN SMALL LETTER Z WITH CARON */ +#define XKB_KEY_zabovedot 0x01bf /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */ +#define XKB_KEY_Racute 0x01c0 /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */ +#define XKB_KEY_Abreve 0x01c3 /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */ +#define XKB_KEY_Lacute 0x01c5 /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */ +#define XKB_KEY_Cacute 0x01c6 /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */ +#define XKB_KEY_Ccaron 0x01c8 /* U+010C LATIN CAPITAL LETTER C WITH CARON */ +#define XKB_KEY_Eogonek 0x01ca /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */ +#define XKB_KEY_Ecaron 0x01cc /* U+011A LATIN CAPITAL LETTER E WITH CARON */ +#define XKB_KEY_Dcaron 0x01cf /* U+010E LATIN CAPITAL LETTER D WITH CARON */ +#define XKB_KEY_Dstroke 0x01d0 /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */ +#define XKB_KEY_Nacute 0x01d1 /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */ +#define XKB_KEY_Ncaron 0x01d2 /* U+0147 LATIN CAPITAL LETTER N WITH CARON */ +#define XKB_KEY_Odoubleacute 0x01d5 /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ +#define XKB_KEY_Rcaron 0x01d8 /* U+0158 LATIN CAPITAL LETTER R WITH CARON */ +#define XKB_KEY_Uring 0x01d9 /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */ +#define XKB_KEY_Udoubleacute 0x01db /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ +#define XKB_KEY_Tcedilla 0x01de /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */ +#define XKB_KEY_racute 0x01e0 /* U+0155 LATIN SMALL LETTER R WITH ACUTE */ +#define XKB_KEY_abreve 0x01e3 /* U+0103 LATIN SMALL LETTER A WITH BREVE */ +#define XKB_KEY_lacute 0x01e5 /* U+013A LATIN SMALL LETTER L WITH ACUTE */ +#define XKB_KEY_cacute 0x01e6 /* U+0107 LATIN SMALL LETTER C WITH ACUTE */ +#define XKB_KEY_ccaron 0x01e8 /* U+010D LATIN SMALL LETTER C WITH CARON */ +#define XKB_KEY_eogonek 0x01ea /* U+0119 LATIN SMALL LETTER E WITH OGONEK */ +#define XKB_KEY_ecaron 0x01ec /* U+011B LATIN SMALL LETTER E WITH CARON */ +#define XKB_KEY_dcaron 0x01ef /* U+010F LATIN SMALL LETTER D WITH CARON */ +#define XKB_KEY_dstroke 0x01f0 /* U+0111 LATIN SMALL LETTER D WITH STROKE */ +#define XKB_KEY_nacute 0x01f1 /* U+0144 LATIN SMALL LETTER N WITH ACUTE */ +#define XKB_KEY_ncaron 0x01f2 /* U+0148 LATIN SMALL LETTER N WITH CARON */ +#define XKB_KEY_odoubleacute 0x01f5 /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */ +#define XKB_KEY_rcaron 0x01f8 /* U+0159 LATIN SMALL LETTER R WITH CARON */ +#define XKB_KEY_uring 0x01f9 /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */ +#define XKB_KEY_udoubleacute 0x01fb /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */ +#define XKB_KEY_tcedilla 0x01fe /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */ +#define XKB_KEY_abovedot 0x01ff /* U+02D9 DOT ABOVE */ + +/* + * Latin 3 + * Byte 3 = 2 + */ + +#define XKB_KEY_Hstroke 0x02a1 /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */ +#define XKB_KEY_Hcircumflex 0x02a6 /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ +#define XKB_KEY_Iabovedot 0x02a9 /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */ +#define XKB_KEY_Gbreve 0x02ab /* U+011E LATIN CAPITAL LETTER G WITH BREVE */ +#define XKB_KEY_Jcircumflex 0x02ac /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ +#define XKB_KEY_hstroke 0x02b1 /* U+0127 LATIN SMALL LETTER H WITH STROKE */ +#define XKB_KEY_hcircumflex 0x02b6 /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */ +#define XKB_KEY_idotless 0x02b9 /* U+0131 LATIN SMALL LETTER DOTLESS I */ +#define XKB_KEY_gbreve 0x02bb /* U+011F LATIN SMALL LETTER G WITH BREVE */ +#define XKB_KEY_jcircumflex 0x02bc /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */ +#define XKB_KEY_Cabovedot 0x02c5 /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */ +#define XKB_KEY_Ccircumflex 0x02c6 /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ +#define XKB_KEY_Gabovedot 0x02d5 /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */ +#define XKB_KEY_Gcircumflex 0x02d8 /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ +#define XKB_KEY_Ubreve 0x02dd /* U+016C LATIN CAPITAL LETTER U WITH BREVE */ +#define XKB_KEY_Scircumflex 0x02de /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ +#define XKB_KEY_cabovedot 0x02e5 /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */ +#define XKB_KEY_ccircumflex 0x02e6 /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */ +#define XKB_KEY_gabovedot 0x02f5 /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */ +#define XKB_KEY_gcircumflex 0x02f8 /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */ +#define XKB_KEY_ubreve 0x02fd /* U+016D LATIN SMALL LETTER U WITH BREVE */ +#define XKB_KEY_scircumflex 0x02fe /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */ + + +/* + * Latin 4 + * Byte 3 = 3 + */ + +#define XKB_KEY_kra 0x03a2 /* U+0138 LATIN SMALL LETTER KRA */ +#define XKB_KEY_kappa 0x03a2 /* deprecated */ +#define XKB_KEY_Rcedilla 0x03a3 /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */ +#define XKB_KEY_Itilde 0x03a5 /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */ +#define XKB_KEY_Lcedilla 0x03a6 /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */ +#define XKB_KEY_Emacron 0x03aa /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */ +#define XKB_KEY_Gcedilla 0x03ab /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */ +#define XKB_KEY_Tslash 0x03ac /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */ +#define XKB_KEY_rcedilla 0x03b3 /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */ +#define XKB_KEY_itilde 0x03b5 /* U+0129 LATIN SMALL LETTER I WITH TILDE */ +#define XKB_KEY_lcedilla 0x03b6 /* U+013C LATIN SMALL LETTER L WITH CEDILLA */ +#define XKB_KEY_emacron 0x03ba /* U+0113 LATIN SMALL LETTER E WITH MACRON */ +#define XKB_KEY_gcedilla 0x03bb /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */ +#define XKB_KEY_tslash 0x03bc /* U+0167 LATIN SMALL LETTER T WITH STROKE */ +#define XKB_KEY_ENG 0x03bd /* U+014A LATIN CAPITAL LETTER ENG */ +#define XKB_KEY_eng 0x03bf /* U+014B LATIN SMALL LETTER ENG */ +#define XKB_KEY_Amacron 0x03c0 /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */ +#define XKB_KEY_Iogonek 0x03c7 /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */ +#define XKB_KEY_Eabovedot 0x03cc /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */ +#define XKB_KEY_Imacron 0x03cf /* U+012A LATIN CAPITAL LETTER I WITH MACRON */ +#define XKB_KEY_Ncedilla 0x03d1 /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */ +#define XKB_KEY_Omacron 0x03d2 /* U+014C LATIN CAPITAL LETTER O WITH MACRON */ +#define XKB_KEY_Kcedilla 0x03d3 /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */ +#define XKB_KEY_Uogonek 0x03d9 /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */ +#define XKB_KEY_Utilde 0x03dd /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */ +#define XKB_KEY_Umacron 0x03de /* U+016A LATIN CAPITAL LETTER U WITH MACRON */ +#define XKB_KEY_amacron 0x03e0 /* U+0101 LATIN SMALL LETTER A WITH MACRON */ +#define XKB_KEY_iogonek 0x03e7 /* U+012F LATIN SMALL LETTER I WITH OGONEK */ +#define XKB_KEY_eabovedot 0x03ec /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */ +#define XKB_KEY_imacron 0x03ef /* U+012B LATIN SMALL LETTER I WITH MACRON */ +#define XKB_KEY_ncedilla 0x03f1 /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */ +#define XKB_KEY_omacron 0x03f2 /* U+014D LATIN SMALL LETTER O WITH MACRON */ +#define XKB_KEY_kcedilla 0x03f3 /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */ +#define XKB_KEY_uogonek 0x03f9 /* U+0173 LATIN SMALL LETTER U WITH OGONEK */ +#define XKB_KEY_utilde 0x03fd /* U+0169 LATIN SMALL LETTER U WITH TILDE */ +#define XKB_KEY_umacron 0x03fe /* U+016B LATIN SMALL LETTER U WITH MACRON */ + +/* + * Latin 8 + */ +#define XKB_KEY_Wcircumflex 0x1000174 /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ +#define XKB_KEY_wcircumflex 0x1000175 /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */ +#define XKB_KEY_Ycircumflex 0x1000176 /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ +#define XKB_KEY_ycircumflex 0x1000177 /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */ +#define XKB_KEY_Babovedot 0x1001e02 /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */ +#define XKB_KEY_babovedot 0x1001e03 /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */ +#define XKB_KEY_Dabovedot 0x1001e0a /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */ +#define XKB_KEY_dabovedot 0x1001e0b /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */ +#define XKB_KEY_Fabovedot 0x1001e1e /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */ +#define XKB_KEY_fabovedot 0x1001e1f /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */ +#define XKB_KEY_Mabovedot 0x1001e40 /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */ +#define XKB_KEY_mabovedot 0x1001e41 /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */ +#define XKB_KEY_Pabovedot 0x1001e56 /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */ +#define XKB_KEY_pabovedot 0x1001e57 /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */ +#define XKB_KEY_Sabovedot 0x1001e60 /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */ +#define XKB_KEY_sabovedot 0x1001e61 /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */ +#define XKB_KEY_Tabovedot 0x1001e6a /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */ +#define XKB_KEY_tabovedot 0x1001e6b /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */ +#define XKB_KEY_Wgrave 0x1001e80 /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */ +#define XKB_KEY_wgrave 0x1001e81 /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */ +#define XKB_KEY_Wacute 0x1001e82 /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */ +#define XKB_KEY_wacute 0x1001e83 /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */ +#define XKB_KEY_Wdiaeresis 0x1001e84 /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */ +#define XKB_KEY_wdiaeresis 0x1001e85 /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */ +#define XKB_KEY_Ygrave 0x1001ef2 /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */ +#define XKB_KEY_ygrave 0x1001ef3 /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */ + +/* + * Latin 9 + * Byte 3 = 0x13 + */ + +#define XKB_KEY_OE 0x13bc /* U+0152 LATIN CAPITAL LIGATURE OE */ +#define XKB_KEY_oe 0x13bd /* U+0153 LATIN SMALL LIGATURE OE */ +#define XKB_KEY_Ydiaeresis 0x13be /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */ + +/* + * Katakana + * Byte 3 = 4 + */ + +#define XKB_KEY_overline 0x047e /* U+203E OVERLINE */ +#define XKB_KEY_kana_fullstop 0x04a1 /* U+3002 IDEOGRAPHIC FULL STOP */ +#define XKB_KEY_kana_openingbracket 0x04a2 /* U+300C LEFT CORNER BRACKET */ +#define XKB_KEY_kana_closingbracket 0x04a3 /* U+300D RIGHT CORNER BRACKET */ +#define XKB_KEY_kana_comma 0x04a4 /* U+3001 IDEOGRAPHIC COMMA */ +#define XKB_KEY_kana_conjunctive 0x04a5 /* U+30FB KATAKANA MIDDLE DOT */ +#define XKB_KEY_kana_middledot 0x04a5 /* deprecated */ +#define XKB_KEY_kana_WO 0x04a6 /* U+30F2 KATAKANA LETTER WO */ +#define XKB_KEY_kana_a 0x04a7 /* U+30A1 KATAKANA LETTER SMALL A */ +#define XKB_KEY_kana_i 0x04a8 /* U+30A3 KATAKANA LETTER SMALL I */ +#define XKB_KEY_kana_u 0x04a9 /* U+30A5 KATAKANA LETTER SMALL U */ +#define XKB_KEY_kana_e 0x04aa /* U+30A7 KATAKANA LETTER SMALL E */ +#define XKB_KEY_kana_o 0x04ab /* U+30A9 KATAKANA LETTER SMALL O */ +#define XKB_KEY_kana_ya 0x04ac /* U+30E3 KATAKANA LETTER SMALL YA */ +#define XKB_KEY_kana_yu 0x04ad /* U+30E5 KATAKANA LETTER SMALL YU */ +#define XKB_KEY_kana_yo 0x04ae /* U+30E7 KATAKANA LETTER SMALL YO */ +#define XKB_KEY_kana_tsu 0x04af /* U+30C3 KATAKANA LETTER SMALL TU */ +#define XKB_KEY_kana_tu 0x04af /* deprecated */ +#define XKB_KEY_prolongedsound 0x04b0 /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */ +#define XKB_KEY_kana_A 0x04b1 /* U+30A2 KATAKANA LETTER A */ +#define XKB_KEY_kana_I 0x04b2 /* U+30A4 KATAKANA LETTER I */ +#define XKB_KEY_kana_U 0x04b3 /* U+30A6 KATAKANA LETTER U */ +#define XKB_KEY_kana_E 0x04b4 /* U+30A8 KATAKANA LETTER E */ +#define XKB_KEY_kana_O 0x04b5 /* U+30AA KATAKANA LETTER O */ +#define XKB_KEY_kana_KA 0x04b6 /* U+30AB KATAKANA LETTER KA */ +#define XKB_KEY_kana_KI 0x04b7 /* U+30AD KATAKANA LETTER KI */ +#define XKB_KEY_kana_KU 0x04b8 /* U+30AF KATAKANA LETTER KU */ +#define XKB_KEY_kana_KE 0x04b9 /* U+30B1 KATAKANA LETTER KE */ +#define XKB_KEY_kana_KO 0x04ba /* U+30B3 KATAKANA LETTER KO */ +#define XKB_KEY_kana_SA 0x04bb /* U+30B5 KATAKANA LETTER SA */ +#define XKB_KEY_kana_SHI 0x04bc /* U+30B7 KATAKANA LETTER SI */ +#define XKB_KEY_kana_SU 0x04bd /* U+30B9 KATAKANA LETTER SU */ +#define XKB_KEY_kana_SE 0x04be /* U+30BB KATAKANA LETTER SE */ +#define XKB_KEY_kana_SO 0x04bf /* U+30BD KATAKANA LETTER SO */ +#define XKB_KEY_kana_TA 0x04c0 /* U+30BF KATAKANA LETTER TA */ +#define XKB_KEY_kana_CHI 0x04c1 /* U+30C1 KATAKANA LETTER TI */ +#define XKB_KEY_kana_TI 0x04c1 /* deprecated */ +#define XKB_KEY_kana_TSU 0x04c2 /* U+30C4 KATAKANA LETTER TU */ +#define XKB_KEY_kana_TU 0x04c2 /* deprecated */ +#define XKB_KEY_kana_TE 0x04c3 /* U+30C6 KATAKANA LETTER TE */ +#define XKB_KEY_kana_TO 0x04c4 /* U+30C8 KATAKANA LETTER TO */ +#define XKB_KEY_kana_NA 0x04c5 /* U+30CA KATAKANA LETTER NA */ +#define XKB_KEY_kana_NI 0x04c6 /* U+30CB KATAKANA LETTER NI */ +#define XKB_KEY_kana_NU 0x04c7 /* U+30CC KATAKANA LETTER NU */ +#define XKB_KEY_kana_NE 0x04c8 /* U+30CD KATAKANA LETTER NE */ +#define XKB_KEY_kana_NO 0x04c9 /* U+30CE KATAKANA LETTER NO */ +#define XKB_KEY_kana_HA 0x04ca /* U+30CF KATAKANA LETTER HA */ +#define XKB_KEY_kana_HI 0x04cb /* U+30D2 KATAKANA LETTER HI */ +#define XKB_KEY_kana_FU 0x04cc /* U+30D5 KATAKANA LETTER HU */ +#define XKB_KEY_kana_HU 0x04cc /* deprecated */ +#define XKB_KEY_kana_HE 0x04cd /* U+30D8 KATAKANA LETTER HE */ +#define XKB_KEY_kana_HO 0x04ce /* U+30DB KATAKANA LETTER HO */ +#define XKB_KEY_kana_MA 0x04cf /* U+30DE KATAKANA LETTER MA */ +#define XKB_KEY_kana_MI 0x04d0 /* U+30DF KATAKANA LETTER MI */ +#define XKB_KEY_kana_MU 0x04d1 /* U+30E0 KATAKANA LETTER MU */ +#define XKB_KEY_kana_ME 0x04d2 /* U+30E1 KATAKANA LETTER ME */ +#define XKB_KEY_kana_MO 0x04d3 /* U+30E2 KATAKANA LETTER MO */ +#define XKB_KEY_kana_YA 0x04d4 /* U+30E4 KATAKANA LETTER YA */ +#define XKB_KEY_kana_YU 0x04d5 /* U+30E6 KATAKANA LETTER YU */ +#define XKB_KEY_kana_YO 0x04d6 /* U+30E8 KATAKANA LETTER YO */ +#define XKB_KEY_kana_RA 0x04d7 /* U+30E9 KATAKANA LETTER RA */ +#define XKB_KEY_kana_RI 0x04d8 /* U+30EA KATAKANA LETTER RI */ +#define XKB_KEY_kana_RU 0x04d9 /* U+30EB KATAKANA LETTER RU */ +#define XKB_KEY_kana_RE 0x04da /* U+30EC KATAKANA LETTER RE */ +#define XKB_KEY_kana_RO 0x04db /* U+30ED KATAKANA LETTER RO */ +#define XKB_KEY_kana_WA 0x04dc /* U+30EF KATAKANA LETTER WA */ +#define XKB_KEY_kana_N 0x04dd /* U+30F3 KATAKANA LETTER N */ +#define XKB_KEY_voicedsound 0x04de /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */ +#define XKB_KEY_semivoicedsound 0x04df /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ +#define XKB_KEY_kana_switch 0xff7e /* Alias for mode_switch */ + +/* + * Arabic + * Byte 3 = 5 + */ + +#define XKB_KEY_Farsi_0 0x10006f0 /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */ +#define XKB_KEY_Farsi_1 0x10006f1 /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */ +#define XKB_KEY_Farsi_2 0x10006f2 /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */ +#define XKB_KEY_Farsi_3 0x10006f3 /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */ +#define XKB_KEY_Farsi_4 0x10006f4 /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */ +#define XKB_KEY_Farsi_5 0x10006f5 /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */ +#define XKB_KEY_Farsi_6 0x10006f6 /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */ +#define XKB_KEY_Farsi_7 0x10006f7 /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */ +#define XKB_KEY_Farsi_8 0x10006f8 /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */ +#define XKB_KEY_Farsi_9 0x10006f9 /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */ +#define XKB_KEY_Arabic_percent 0x100066a /* U+066A ARABIC PERCENT SIGN */ +#define XKB_KEY_Arabic_superscript_alef 0x1000670 /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */ +#define XKB_KEY_Arabic_tteh 0x1000679 /* U+0679 ARABIC LETTER TTEH */ +#define XKB_KEY_Arabic_peh 0x100067e /* U+067E ARABIC LETTER PEH */ +#define XKB_KEY_Arabic_tcheh 0x1000686 /* U+0686 ARABIC LETTER TCHEH */ +#define XKB_KEY_Arabic_ddal 0x1000688 /* U+0688 ARABIC LETTER DDAL */ +#define XKB_KEY_Arabic_rreh 0x1000691 /* U+0691 ARABIC LETTER RREH */ +#define XKB_KEY_Arabic_comma 0x05ac /* U+060C ARABIC COMMA */ +#define XKB_KEY_Arabic_fullstop 0x10006d4 /* U+06D4 ARABIC FULL STOP */ +#define XKB_KEY_Arabic_0 0x1000660 /* U+0660 ARABIC-INDIC DIGIT ZERO */ +#define XKB_KEY_Arabic_1 0x1000661 /* U+0661 ARABIC-INDIC DIGIT ONE */ +#define XKB_KEY_Arabic_2 0x1000662 /* U+0662 ARABIC-INDIC DIGIT TWO */ +#define XKB_KEY_Arabic_3 0x1000663 /* U+0663 ARABIC-INDIC DIGIT THREE */ +#define XKB_KEY_Arabic_4 0x1000664 /* U+0664 ARABIC-INDIC DIGIT FOUR */ +#define XKB_KEY_Arabic_5 0x1000665 /* U+0665 ARABIC-INDIC DIGIT FIVE */ +#define XKB_KEY_Arabic_6 0x1000666 /* U+0666 ARABIC-INDIC DIGIT SIX */ +#define XKB_KEY_Arabic_7 0x1000667 /* U+0667 ARABIC-INDIC DIGIT SEVEN */ +#define XKB_KEY_Arabic_8 0x1000668 /* U+0668 ARABIC-INDIC DIGIT EIGHT */ +#define XKB_KEY_Arabic_9 0x1000669 /* U+0669 ARABIC-INDIC DIGIT NINE */ +#define XKB_KEY_Arabic_semicolon 0x05bb /* U+061B ARABIC SEMICOLON */ +#define XKB_KEY_Arabic_question_mark 0x05bf /* U+061F ARABIC QUESTION MARK */ +#define XKB_KEY_Arabic_hamza 0x05c1 /* U+0621 ARABIC LETTER HAMZA */ +#define XKB_KEY_Arabic_maddaonalef 0x05c2 /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */ +#define XKB_KEY_Arabic_hamzaonalef 0x05c3 /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */ +#define XKB_KEY_Arabic_hamzaonwaw 0x05c4 /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */ +#define XKB_KEY_Arabic_hamzaunderalef 0x05c5 /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */ +#define XKB_KEY_Arabic_hamzaonyeh 0x05c6 /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */ +#define XKB_KEY_Arabic_alef 0x05c7 /* U+0627 ARABIC LETTER ALEF */ +#define XKB_KEY_Arabic_beh 0x05c8 /* U+0628 ARABIC LETTER BEH */ +#define XKB_KEY_Arabic_tehmarbuta 0x05c9 /* U+0629 ARABIC LETTER TEH MARBUTA */ +#define XKB_KEY_Arabic_teh 0x05ca /* U+062A ARABIC LETTER TEH */ +#define XKB_KEY_Arabic_theh 0x05cb /* U+062B ARABIC LETTER THEH */ +#define XKB_KEY_Arabic_jeem 0x05cc /* U+062C ARABIC LETTER JEEM */ +#define XKB_KEY_Arabic_hah 0x05cd /* U+062D ARABIC LETTER HAH */ +#define XKB_KEY_Arabic_khah 0x05ce /* U+062E ARABIC LETTER KHAH */ +#define XKB_KEY_Arabic_dal 0x05cf /* U+062F ARABIC LETTER DAL */ +#define XKB_KEY_Arabic_thal 0x05d0 /* U+0630 ARABIC LETTER THAL */ +#define XKB_KEY_Arabic_ra 0x05d1 /* U+0631 ARABIC LETTER REH */ +#define XKB_KEY_Arabic_zain 0x05d2 /* U+0632 ARABIC LETTER ZAIN */ +#define XKB_KEY_Arabic_seen 0x05d3 /* U+0633 ARABIC LETTER SEEN */ +#define XKB_KEY_Arabic_sheen 0x05d4 /* U+0634 ARABIC LETTER SHEEN */ +#define XKB_KEY_Arabic_sad 0x05d5 /* U+0635 ARABIC LETTER SAD */ +#define XKB_KEY_Arabic_dad 0x05d6 /* U+0636 ARABIC LETTER DAD */ +#define XKB_KEY_Arabic_tah 0x05d7 /* U+0637 ARABIC LETTER TAH */ +#define XKB_KEY_Arabic_zah 0x05d8 /* U+0638 ARABIC LETTER ZAH */ +#define XKB_KEY_Arabic_ain 0x05d9 /* U+0639 ARABIC LETTER AIN */ +#define XKB_KEY_Arabic_ghain 0x05da /* U+063A ARABIC LETTER GHAIN */ +#define XKB_KEY_Arabic_tatweel 0x05e0 /* U+0640 ARABIC TATWEEL */ +#define XKB_KEY_Arabic_feh 0x05e1 /* U+0641 ARABIC LETTER FEH */ +#define XKB_KEY_Arabic_qaf 0x05e2 /* U+0642 ARABIC LETTER QAF */ +#define XKB_KEY_Arabic_kaf 0x05e3 /* U+0643 ARABIC LETTER KAF */ +#define XKB_KEY_Arabic_lam 0x05e4 /* U+0644 ARABIC LETTER LAM */ +#define XKB_KEY_Arabic_meem 0x05e5 /* U+0645 ARABIC LETTER MEEM */ +#define XKB_KEY_Arabic_noon 0x05e6 /* U+0646 ARABIC LETTER NOON */ +#define XKB_KEY_Arabic_ha 0x05e7 /* U+0647 ARABIC LETTER HEH */ +#define XKB_KEY_Arabic_heh 0x05e7 /* deprecated */ +#define XKB_KEY_Arabic_waw 0x05e8 /* U+0648 ARABIC LETTER WAW */ +#define XKB_KEY_Arabic_alefmaksura 0x05e9 /* U+0649 ARABIC LETTER ALEF MAKSURA */ +#define XKB_KEY_Arabic_yeh 0x05ea /* U+064A ARABIC LETTER YEH */ +#define XKB_KEY_Arabic_fathatan 0x05eb /* U+064B ARABIC FATHATAN */ +#define XKB_KEY_Arabic_dammatan 0x05ec /* U+064C ARABIC DAMMATAN */ +#define XKB_KEY_Arabic_kasratan 0x05ed /* U+064D ARABIC KASRATAN */ +#define XKB_KEY_Arabic_fatha 0x05ee /* U+064E ARABIC FATHA */ +#define XKB_KEY_Arabic_damma 0x05ef /* U+064F ARABIC DAMMA */ +#define XKB_KEY_Arabic_kasra 0x05f0 /* U+0650 ARABIC KASRA */ +#define XKB_KEY_Arabic_shadda 0x05f1 /* U+0651 ARABIC SHADDA */ +#define XKB_KEY_Arabic_sukun 0x05f2 /* U+0652 ARABIC SUKUN */ +#define XKB_KEY_Arabic_madda_above 0x1000653 /* U+0653 ARABIC MADDAH ABOVE */ +#define XKB_KEY_Arabic_hamza_above 0x1000654 /* U+0654 ARABIC HAMZA ABOVE */ +#define XKB_KEY_Arabic_hamza_below 0x1000655 /* U+0655 ARABIC HAMZA BELOW */ +#define XKB_KEY_Arabic_jeh 0x1000698 /* U+0698 ARABIC LETTER JEH */ +#define XKB_KEY_Arabic_veh 0x10006a4 /* U+06A4 ARABIC LETTER VEH */ +#define XKB_KEY_Arabic_keheh 0x10006a9 /* U+06A9 ARABIC LETTER KEHEH */ +#define XKB_KEY_Arabic_gaf 0x10006af /* U+06AF ARABIC LETTER GAF */ +#define XKB_KEY_Arabic_noon_ghunna 0x10006ba /* U+06BA ARABIC LETTER NOON GHUNNA */ +#define XKB_KEY_Arabic_heh_doachashmee 0x10006be /* U+06BE ARABIC LETTER HEH DOACHASHMEE */ +#define XKB_KEY_Farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ +#define XKB_KEY_Arabic_farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ +#define XKB_KEY_Arabic_yeh_baree 0x10006d2 /* U+06D2 ARABIC LETTER YEH BARREE */ +#define XKB_KEY_Arabic_heh_goal 0x10006c1 /* U+06C1 ARABIC LETTER HEH GOAL */ +#define XKB_KEY_Arabic_switch 0xff7e /* Alias for mode_switch */ + +/* + * Cyrillic + * Byte 3 = 6 + */ +#define XKB_KEY_Cyrillic_GHE_bar 0x1000492 /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */ +#define XKB_KEY_Cyrillic_ghe_bar 0x1000493 /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */ +#define XKB_KEY_Cyrillic_ZHE_descender 0x1000496 /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */ +#define XKB_KEY_Cyrillic_zhe_descender 0x1000497 /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */ +#define XKB_KEY_Cyrillic_KA_descender 0x100049a /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */ +#define XKB_KEY_Cyrillic_ka_descender 0x100049b /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */ +#define XKB_KEY_Cyrillic_KA_vertstroke 0x100049c /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */ +#define XKB_KEY_Cyrillic_ka_vertstroke 0x100049d /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */ +#define XKB_KEY_Cyrillic_EN_descender 0x10004a2 /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */ +#define XKB_KEY_Cyrillic_en_descender 0x10004a3 /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */ +#define XKB_KEY_Cyrillic_U_straight 0x10004ae /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */ +#define XKB_KEY_Cyrillic_u_straight 0x10004af /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */ +#define XKB_KEY_Cyrillic_U_straight_bar 0x10004b0 /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */ +#define XKB_KEY_Cyrillic_u_straight_bar 0x10004b1 /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */ +#define XKB_KEY_Cyrillic_HA_descender 0x10004b2 /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */ +#define XKB_KEY_Cyrillic_ha_descender 0x10004b3 /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */ +#define XKB_KEY_Cyrillic_CHE_descender 0x10004b6 /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */ +#define XKB_KEY_Cyrillic_che_descender 0x10004b7 /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */ +#define XKB_KEY_Cyrillic_CHE_vertstroke 0x10004b8 /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */ +#define XKB_KEY_Cyrillic_che_vertstroke 0x10004b9 /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */ +#define XKB_KEY_Cyrillic_SHHA 0x10004ba /* U+04BA CYRILLIC CAPITAL LETTER SHHA */ +#define XKB_KEY_Cyrillic_shha 0x10004bb /* U+04BB CYRILLIC SMALL LETTER SHHA */ + +#define XKB_KEY_Cyrillic_SCHWA 0x10004d8 /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */ +#define XKB_KEY_Cyrillic_schwa 0x10004d9 /* U+04D9 CYRILLIC SMALL LETTER SCHWA */ +#define XKB_KEY_Cyrillic_I_macron 0x10004e2 /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */ +#define XKB_KEY_Cyrillic_i_macron 0x10004e3 /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */ +#define XKB_KEY_Cyrillic_O_bar 0x10004e8 /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */ +#define XKB_KEY_Cyrillic_o_bar 0x10004e9 /* U+04E9 CYRILLIC SMALL LETTER BARRED O */ +#define XKB_KEY_Cyrillic_U_macron 0x10004ee /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */ +#define XKB_KEY_Cyrillic_u_macron 0x10004ef /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */ + +#define XKB_KEY_Serbian_dje 0x06a1 /* U+0452 CYRILLIC SMALL LETTER DJE */ +#define XKB_KEY_Macedonia_gje 0x06a2 /* U+0453 CYRILLIC SMALL LETTER GJE */ +#define XKB_KEY_Cyrillic_io 0x06a3 /* U+0451 CYRILLIC SMALL LETTER IO */ +#define XKB_KEY_Ukrainian_ie 0x06a4 /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */ +#define XKB_KEY_Ukranian_je 0x06a4 /* deprecated */ +#define XKB_KEY_Macedonia_dse 0x06a5 /* U+0455 CYRILLIC SMALL LETTER DZE */ +#define XKB_KEY_Ukrainian_i 0x06a6 /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ +#define XKB_KEY_Ukranian_i 0x06a6 /* deprecated */ +#define XKB_KEY_Ukrainian_yi 0x06a7 /* U+0457 CYRILLIC SMALL LETTER YI */ +#define XKB_KEY_Ukranian_yi 0x06a7 /* deprecated */ +#define XKB_KEY_Cyrillic_je 0x06a8 /* U+0458 CYRILLIC SMALL LETTER JE */ +#define XKB_KEY_Serbian_je 0x06a8 /* deprecated */ +#define XKB_KEY_Cyrillic_lje 0x06a9 /* U+0459 CYRILLIC SMALL LETTER LJE */ +#define XKB_KEY_Serbian_lje 0x06a9 /* deprecated */ +#define XKB_KEY_Cyrillic_nje 0x06aa /* U+045A CYRILLIC SMALL LETTER NJE */ +#define XKB_KEY_Serbian_nje 0x06aa /* deprecated */ +#define XKB_KEY_Serbian_tshe 0x06ab /* U+045B CYRILLIC SMALL LETTER TSHE */ +#define XKB_KEY_Macedonia_kje 0x06ac /* U+045C CYRILLIC SMALL LETTER KJE */ +#define XKB_KEY_Ukrainian_ghe_with_upturn 0x06ad /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */ +#define XKB_KEY_Byelorussian_shortu 0x06ae /* U+045E CYRILLIC SMALL LETTER SHORT U */ +#define XKB_KEY_Cyrillic_dzhe 0x06af /* U+045F CYRILLIC SMALL LETTER DZHE */ +#define XKB_KEY_Serbian_dze 0x06af /* deprecated */ +#define XKB_KEY_numerosign 0x06b0 /* U+2116 NUMERO SIGN */ +#define XKB_KEY_Serbian_DJE 0x06b1 /* U+0402 CYRILLIC CAPITAL LETTER DJE */ +#define XKB_KEY_Macedonia_GJE 0x06b2 /* U+0403 CYRILLIC CAPITAL LETTER GJE */ +#define XKB_KEY_Cyrillic_IO 0x06b3 /* U+0401 CYRILLIC CAPITAL LETTER IO */ +#define XKB_KEY_Ukrainian_IE 0x06b4 /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */ +#define XKB_KEY_Ukranian_JE 0x06b4 /* deprecated */ +#define XKB_KEY_Macedonia_DSE 0x06b5 /* U+0405 CYRILLIC CAPITAL LETTER DZE */ +#define XKB_KEY_Ukrainian_I 0x06b6 /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ +#define XKB_KEY_Ukranian_I 0x06b6 /* deprecated */ +#define XKB_KEY_Ukrainian_YI 0x06b7 /* U+0407 CYRILLIC CAPITAL LETTER YI */ +#define XKB_KEY_Ukranian_YI 0x06b7 /* deprecated */ +#define XKB_KEY_Cyrillic_JE 0x06b8 /* U+0408 CYRILLIC CAPITAL LETTER JE */ +#define XKB_KEY_Serbian_JE 0x06b8 /* deprecated */ +#define XKB_KEY_Cyrillic_LJE 0x06b9 /* U+0409 CYRILLIC CAPITAL LETTER LJE */ +#define XKB_KEY_Serbian_LJE 0x06b9 /* deprecated */ +#define XKB_KEY_Cyrillic_NJE 0x06ba /* U+040A CYRILLIC CAPITAL LETTER NJE */ +#define XKB_KEY_Serbian_NJE 0x06ba /* deprecated */ +#define XKB_KEY_Serbian_TSHE 0x06bb /* U+040B CYRILLIC CAPITAL LETTER TSHE */ +#define XKB_KEY_Macedonia_KJE 0x06bc /* U+040C CYRILLIC CAPITAL LETTER KJE */ +#define XKB_KEY_Ukrainian_GHE_WITH_UPTURN 0x06bd /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ +#define XKB_KEY_Byelorussian_SHORTU 0x06be /* U+040E CYRILLIC CAPITAL LETTER SHORT U */ +#define XKB_KEY_Cyrillic_DZHE 0x06bf /* U+040F CYRILLIC CAPITAL LETTER DZHE */ +#define XKB_KEY_Serbian_DZE 0x06bf /* deprecated */ +#define XKB_KEY_Cyrillic_yu 0x06c0 /* U+044E CYRILLIC SMALL LETTER YU */ +#define XKB_KEY_Cyrillic_a 0x06c1 /* U+0430 CYRILLIC SMALL LETTER A */ +#define XKB_KEY_Cyrillic_be 0x06c2 /* U+0431 CYRILLIC SMALL LETTER BE */ +#define XKB_KEY_Cyrillic_tse 0x06c3 /* U+0446 CYRILLIC SMALL LETTER TSE */ +#define XKB_KEY_Cyrillic_de 0x06c4 /* U+0434 CYRILLIC SMALL LETTER DE */ +#define XKB_KEY_Cyrillic_ie 0x06c5 /* U+0435 CYRILLIC SMALL LETTER IE */ +#define XKB_KEY_Cyrillic_ef 0x06c6 /* U+0444 CYRILLIC SMALL LETTER EF */ +#define XKB_KEY_Cyrillic_ghe 0x06c7 /* U+0433 CYRILLIC SMALL LETTER GHE */ +#define XKB_KEY_Cyrillic_ha 0x06c8 /* U+0445 CYRILLIC SMALL LETTER HA */ +#define XKB_KEY_Cyrillic_i 0x06c9 /* U+0438 CYRILLIC SMALL LETTER I */ +#define XKB_KEY_Cyrillic_shorti 0x06ca /* U+0439 CYRILLIC SMALL LETTER SHORT I */ +#define XKB_KEY_Cyrillic_ka 0x06cb /* U+043A CYRILLIC SMALL LETTER KA */ +#define XKB_KEY_Cyrillic_el 0x06cc /* U+043B CYRILLIC SMALL LETTER EL */ +#define XKB_KEY_Cyrillic_em 0x06cd /* U+043C CYRILLIC SMALL LETTER EM */ +#define XKB_KEY_Cyrillic_en 0x06ce /* U+043D CYRILLIC SMALL LETTER EN */ +#define XKB_KEY_Cyrillic_o 0x06cf /* U+043E CYRILLIC SMALL LETTER O */ +#define XKB_KEY_Cyrillic_pe 0x06d0 /* U+043F CYRILLIC SMALL LETTER PE */ +#define XKB_KEY_Cyrillic_ya 0x06d1 /* U+044F CYRILLIC SMALL LETTER YA */ +#define XKB_KEY_Cyrillic_er 0x06d2 /* U+0440 CYRILLIC SMALL LETTER ER */ +#define XKB_KEY_Cyrillic_es 0x06d3 /* U+0441 CYRILLIC SMALL LETTER ES */ +#define XKB_KEY_Cyrillic_te 0x06d4 /* U+0442 CYRILLIC SMALL LETTER TE */ +#define XKB_KEY_Cyrillic_u 0x06d5 /* U+0443 CYRILLIC SMALL LETTER U */ +#define XKB_KEY_Cyrillic_zhe 0x06d6 /* U+0436 CYRILLIC SMALL LETTER ZHE */ +#define XKB_KEY_Cyrillic_ve 0x06d7 /* U+0432 CYRILLIC SMALL LETTER VE */ +#define XKB_KEY_Cyrillic_softsign 0x06d8 /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */ +#define XKB_KEY_Cyrillic_yeru 0x06d9 /* U+044B CYRILLIC SMALL LETTER YERU */ +#define XKB_KEY_Cyrillic_ze 0x06da /* U+0437 CYRILLIC SMALL LETTER ZE */ +#define XKB_KEY_Cyrillic_sha 0x06db /* U+0448 CYRILLIC SMALL LETTER SHA */ +#define XKB_KEY_Cyrillic_e 0x06dc /* U+044D CYRILLIC SMALL LETTER E */ +#define XKB_KEY_Cyrillic_shcha 0x06dd /* U+0449 CYRILLIC SMALL LETTER SHCHA */ +#define XKB_KEY_Cyrillic_che 0x06de /* U+0447 CYRILLIC SMALL LETTER CHE */ +#define XKB_KEY_Cyrillic_hardsign 0x06df /* U+044A CYRILLIC SMALL LETTER HARD SIGN */ +#define XKB_KEY_Cyrillic_YU 0x06e0 /* U+042E CYRILLIC CAPITAL LETTER YU */ +#define XKB_KEY_Cyrillic_A 0x06e1 /* U+0410 CYRILLIC CAPITAL LETTER A */ +#define XKB_KEY_Cyrillic_BE 0x06e2 /* U+0411 CYRILLIC CAPITAL LETTER BE */ +#define XKB_KEY_Cyrillic_TSE 0x06e3 /* U+0426 CYRILLIC CAPITAL LETTER TSE */ +#define XKB_KEY_Cyrillic_DE 0x06e4 /* U+0414 CYRILLIC CAPITAL LETTER DE */ +#define XKB_KEY_Cyrillic_IE 0x06e5 /* U+0415 CYRILLIC CAPITAL LETTER IE */ +#define XKB_KEY_Cyrillic_EF 0x06e6 /* U+0424 CYRILLIC CAPITAL LETTER EF */ +#define XKB_KEY_Cyrillic_GHE 0x06e7 /* U+0413 CYRILLIC CAPITAL LETTER GHE */ +#define XKB_KEY_Cyrillic_HA 0x06e8 /* U+0425 CYRILLIC CAPITAL LETTER HA */ +#define XKB_KEY_Cyrillic_I 0x06e9 /* U+0418 CYRILLIC CAPITAL LETTER I */ +#define XKB_KEY_Cyrillic_SHORTI 0x06ea /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */ +#define XKB_KEY_Cyrillic_KA 0x06eb /* U+041A CYRILLIC CAPITAL LETTER KA */ +#define XKB_KEY_Cyrillic_EL 0x06ec /* U+041B CYRILLIC CAPITAL LETTER EL */ +#define XKB_KEY_Cyrillic_EM 0x06ed /* U+041C CYRILLIC CAPITAL LETTER EM */ +#define XKB_KEY_Cyrillic_EN 0x06ee /* U+041D CYRILLIC CAPITAL LETTER EN */ +#define XKB_KEY_Cyrillic_O 0x06ef /* U+041E CYRILLIC CAPITAL LETTER O */ +#define XKB_KEY_Cyrillic_PE 0x06f0 /* U+041F CYRILLIC CAPITAL LETTER PE */ +#define XKB_KEY_Cyrillic_YA 0x06f1 /* U+042F CYRILLIC CAPITAL LETTER YA */ +#define XKB_KEY_Cyrillic_ER 0x06f2 /* U+0420 CYRILLIC CAPITAL LETTER ER */ +#define XKB_KEY_Cyrillic_ES 0x06f3 /* U+0421 CYRILLIC CAPITAL LETTER ES */ +#define XKB_KEY_Cyrillic_TE 0x06f4 /* U+0422 CYRILLIC CAPITAL LETTER TE */ +#define XKB_KEY_Cyrillic_U 0x06f5 /* U+0423 CYRILLIC CAPITAL LETTER U */ +#define XKB_KEY_Cyrillic_ZHE 0x06f6 /* U+0416 CYRILLIC CAPITAL LETTER ZHE */ +#define XKB_KEY_Cyrillic_VE 0x06f7 /* U+0412 CYRILLIC CAPITAL LETTER VE */ +#define XKB_KEY_Cyrillic_SOFTSIGN 0x06f8 /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */ +#define XKB_KEY_Cyrillic_YERU 0x06f9 /* U+042B CYRILLIC CAPITAL LETTER YERU */ +#define XKB_KEY_Cyrillic_ZE 0x06fa /* U+0417 CYRILLIC CAPITAL LETTER ZE */ +#define XKB_KEY_Cyrillic_SHA 0x06fb /* U+0428 CYRILLIC CAPITAL LETTER SHA */ +#define XKB_KEY_Cyrillic_E 0x06fc /* U+042D CYRILLIC CAPITAL LETTER E */ +#define XKB_KEY_Cyrillic_SHCHA 0x06fd /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */ +#define XKB_KEY_Cyrillic_CHE 0x06fe /* U+0427 CYRILLIC CAPITAL LETTER CHE */ +#define XKB_KEY_Cyrillic_HARDSIGN 0x06ff /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */ + +/* + * Greek + * (based on an early draft of, and not quite identical to, ISO/IEC 8859-7) + * Byte 3 = 7 + */ + +#define XKB_KEY_Greek_ALPHAaccent 0x07a1 /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */ +#define XKB_KEY_Greek_EPSILONaccent 0x07a2 /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */ +#define XKB_KEY_Greek_ETAaccent 0x07a3 /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */ +#define XKB_KEY_Greek_IOTAaccent 0x07a4 /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */ +#define XKB_KEY_Greek_IOTAdieresis 0x07a5 /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ +#define XKB_KEY_Greek_IOTAdiaeresis 0x07a5 /* old typo */ +#define XKB_KEY_Greek_OMICRONaccent 0x07a7 /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */ +#define XKB_KEY_Greek_UPSILONaccent 0x07a8 /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */ +#define XKB_KEY_Greek_UPSILONdieresis 0x07a9 /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ +#define XKB_KEY_Greek_OMEGAaccent 0x07ab /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */ +#define XKB_KEY_Greek_accentdieresis 0x07ae /* U+0385 GREEK DIALYTIKA TONOS */ +#define XKB_KEY_Greek_horizbar 0x07af /* U+2015 HORIZONTAL BAR */ +#define XKB_KEY_Greek_alphaaccent 0x07b1 /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */ +#define XKB_KEY_Greek_epsilonaccent 0x07b2 /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */ +#define XKB_KEY_Greek_etaaccent 0x07b3 /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */ +#define XKB_KEY_Greek_iotaaccent 0x07b4 /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */ +#define XKB_KEY_Greek_iotadieresis 0x07b5 /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */ +#define XKB_KEY_Greek_iotaaccentdieresis 0x07b6 /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ +#define XKB_KEY_Greek_omicronaccent 0x07b7 /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */ +#define XKB_KEY_Greek_upsilonaccent 0x07b8 /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */ +#define XKB_KEY_Greek_upsilondieresis 0x07b9 /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ +#define XKB_KEY_Greek_upsilonaccentdieresis 0x07ba /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ +#define XKB_KEY_Greek_omegaaccent 0x07bb /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */ +#define XKB_KEY_Greek_ALPHA 0x07c1 /* U+0391 GREEK CAPITAL LETTER ALPHA */ +#define XKB_KEY_Greek_BETA 0x07c2 /* U+0392 GREEK CAPITAL LETTER BETA */ +#define XKB_KEY_Greek_GAMMA 0x07c3 /* U+0393 GREEK CAPITAL LETTER GAMMA */ +#define XKB_KEY_Greek_DELTA 0x07c4 /* U+0394 GREEK CAPITAL LETTER DELTA */ +#define XKB_KEY_Greek_EPSILON 0x07c5 /* U+0395 GREEK CAPITAL LETTER EPSILON */ +#define XKB_KEY_Greek_ZETA 0x07c6 /* U+0396 GREEK CAPITAL LETTER ZETA */ +#define XKB_KEY_Greek_ETA 0x07c7 /* U+0397 GREEK CAPITAL LETTER ETA */ +#define XKB_KEY_Greek_THETA 0x07c8 /* U+0398 GREEK CAPITAL LETTER THETA */ +#define XKB_KEY_Greek_IOTA 0x07c9 /* U+0399 GREEK CAPITAL LETTER IOTA */ +#define XKB_KEY_Greek_KAPPA 0x07ca /* U+039A GREEK CAPITAL LETTER KAPPA */ +#define XKB_KEY_Greek_LAMDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ +#define XKB_KEY_Greek_LAMBDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ +#define XKB_KEY_Greek_MU 0x07cc /* U+039C GREEK CAPITAL LETTER MU */ +#define XKB_KEY_Greek_NU 0x07cd /* U+039D GREEK CAPITAL LETTER NU */ +#define XKB_KEY_Greek_XI 0x07ce /* U+039E GREEK CAPITAL LETTER XI */ +#define XKB_KEY_Greek_OMICRON 0x07cf /* U+039F GREEK CAPITAL LETTER OMICRON */ +#define XKB_KEY_Greek_PI 0x07d0 /* U+03A0 GREEK CAPITAL LETTER PI */ +#define XKB_KEY_Greek_RHO 0x07d1 /* U+03A1 GREEK CAPITAL LETTER RHO */ +#define XKB_KEY_Greek_SIGMA 0x07d2 /* U+03A3 GREEK CAPITAL LETTER SIGMA */ +#define XKB_KEY_Greek_TAU 0x07d4 /* U+03A4 GREEK CAPITAL LETTER TAU */ +#define XKB_KEY_Greek_UPSILON 0x07d5 /* U+03A5 GREEK CAPITAL LETTER UPSILON */ +#define XKB_KEY_Greek_PHI 0x07d6 /* U+03A6 GREEK CAPITAL LETTER PHI */ +#define XKB_KEY_Greek_CHI 0x07d7 /* U+03A7 GREEK CAPITAL LETTER CHI */ +#define XKB_KEY_Greek_PSI 0x07d8 /* U+03A8 GREEK CAPITAL LETTER PSI */ +#define XKB_KEY_Greek_OMEGA 0x07d9 /* U+03A9 GREEK CAPITAL LETTER OMEGA */ +#define XKB_KEY_Greek_alpha 0x07e1 /* U+03B1 GREEK SMALL LETTER ALPHA */ +#define XKB_KEY_Greek_beta 0x07e2 /* U+03B2 GREEK SMALL LETTER BETA */ +#define XKB_KEY_Greek_gamma 0x07e3 /* U+03B3 GREEK SMALL LETTER GAMMA */ +#define XKB_KEY_Greek_delta 0x07e4 /* U+03B4 GREEK SMALL LETTER DELTA */ +#define XKB_KEY_Greek_epsilon 0x07e5 /* U+03B5 GREEK SMALL LETTER EPSILON */ +#define XKB_KEY_Greek_zeta 0x07e6 /* U+03B6 GREEK SMALL LETTER ZETA */ +#define XKB_KEY_Greek_eta 0x07e7 /* U+03B7 GREEK SMALL LETTER ETA */ +#define XKB_KEY_Greek_theta 0x07e8 /* U+03B8 GREEK SMALL LETTER THETA */ +#define XKB_KEY_Greek_iota 0x07e9 /* U+03B9 GREEK SMALL LETTER IOTA */ +#define XKB_KEY_Greek_kappa 0x07ea /* U+03BA GREEK SMALL LETTER KAPPA */ +#define XKB_KEY_Greek_lamda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ +#define XKB_KEY_Greek_lambda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ +#define XKB_KEY_Greek_mu 0x07ec /* U+03BC GREEK SMALL LETTER MU */ +#define XKB_KEY_Greek_nu 0x07ed /* U+03BD GREEK SMALL LETTER NU */ +#define XKB_KEY_Greek_xi 0x07ee /* U+03BE GREEK SMALL LETTER XI */ +#define XKB_KEY_Greek_omicron 0x07ef /* U+03BF GREEK SMALL LETTER OMICRON */ +#define XKB_KEY_Greek_pi 0x07f0 /* U+03C0 GREEK SMALL LETTER PI */ +#define XKB_KEY_Greek_rho 0x07f1 /* U+03C1 GREEK SMALL LETTER RHO */ +#define XKB_KEY_Greek_sigma 0x07f2 /* U+03C3 GREEK SMALL LETTER SIGMA */ +#define XKB_KEY_Greek_finalsmallsigma 0x07f3 /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */ +#define XKB_KEY_Greek_tau 0x07f4 /* U+03C4 GREEK SMALL LETTER TAU */ +#define XKB_KEY_Greek_upsilon 0x07f5 /* U+03C5 GREEK SMALL LETTER UPSILON */ +#define XKB_KEY_Greek_phi 0x07f6 /* U+03C6 GREEK SMALL LETTER PHI */ +#define XKB_KEY_Greek_chi 0x07f7 /* U+03C7 GREEK SMALL LETTER CHI */ +#define XKB_KEY_Greek_psi 0x07f8 /* U+03C8 GREEK SMALL LETTER PSI */ +#define XKB_KEY_Greek_omega 0x07f9 /* U+03C9 GREEK SMALL LETTER OMEGA */ +#define XKB_KEY_Greek_switch 0xff7e /* Alias for mode_switch */ + +/* + * Technical + * (from the DEC VT330/VT420 Technical Character Set, http://vt100.net/charsets/technical.html) + * Byte 3 = 8 + */ + +#define XKB_KEY_leftradical 0x08a1 /* U+23B7 RADICAL SYMBOL BOTTOM */ +#define XKB_KEY_topleftradical 0x08a2 /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/ +#define XKB_KEY_horizconnector 0x08a3 /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/ +#define XKB_KEY_topintegral 0x08a4 /* U+2320 TOP HALF INTEGRAL */ +#define XKB_KEY_botintegral 0x08a5 /* U+2321 BOTTOM HALF INTEGRAL */ +#define XKB_KEY_vertconnector 0x08a6 /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/ +#define XKB_KEY_topleftsqbracket 0x08a7 /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */ +#define XKB_KEY_botleftsqbracket 0x08a8 /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */ +#define XKB_KEY_toprightsqbracket 0x08a9 /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */ +#define XKB_KEY_botrightsqbracket 0x08aa /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */ +#define XKB_KEY_topleftparens 0x08ab /* U+239B LEFT PARENTHESIS UPPER HOOK */ +#define XKB_KEY_botleftparens 0x08ac /* U+239D LEFT PARENTHESIS LOWER HOOK */ +#define XKB_KEY_toprightparens 0x08ad /* U+239E RIGHT PARENTHESIS UPPER HOOK */ +#define XKB_KEY_botrightparens 0x08ae /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */ +#define XKB_KEY_leftmiddlecurlybrace 0x08af /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */ +#define XKB_KEY_rightmiddlecurlybrace 0x08b0 /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */ +#define XKB_KEY_topleftsummation 0x08b1 +#define XKB_KEY_botleftsummation 0x08b2 +#define XKB_KEY_topvertsummationconnector 0x08b3 +#define XKB_KEY_botvertsummationconnector 0x08b4 +#define XKB_KEY_toprightsummation 0x08b5 +#define XKB_KEY_botrightsummation 0x08b6 +#define XKB_KEY_rightmiddlesummation 0x08b7 +#define XKB_KEY_lessthanequal 0x08bc /* U+2264 LESS-THAN OR EQUAL TO */ +#define XKB_KEY_notequal 0x08bd /* U+2260 NOT EQUAL TO */ +#define XKB_KEY_greaterthanequal 0x08be /* U+2265 GREATER-THAN OR EQUAL TO */ +#define XKB_KEY_integral 0x08bf /* U+222B INTEGRAL */ +#define XKB_KEY_therefore 0x08c0 /* U+2234 THEREFORE */ +#define XKB_KEY_variation 0x08c1 /* U+221D PROPORTIONAL TO */ +#define XKB_KEY_infinity 0x08c2 /* U+221E INFINITY */ +#define XKB_KEY_nabla 0x08c5 /* U+2207 NABLA */ +#define XKB_KEY_approximate 0x08c8 /* U+223C TILDE OPERATOR */ +#define XKB_KEY_similarequal 0x08c9 /* U+2243 ASYMPTOTICALLY EQUAL TO */ +#define XKB_KEY_ifonlyif 0x08cd /* U+21D4 LEFT RIGHT DOUBLE ARROW */ +#define XKB_KEY_implies 0x08ce /* U+21D2 RIGHTWARDS DOUBLE ARROW */ +#define XKB_KEY_identical 0x08cf /* U+2261 IDENTICAL TO */ +#define XKB_KEY_radical 0x08d6 /* U+221A SQUARE ROOT */ +#define XKB_KEY_includedin 0x08da /* U+2282 SUBSET OF */ +#define XKB_KEY_includes 0x08db /* U+2283 SUPERSET OF */ +#define XKB_KEY_intersection 0x08dc /* U+2229 INTERSECTION */ +#define XKB_KEY_union 0x08dd /* U+222A UNION */ +#define XKB_KEY_logicaland 0x08de /* U+2227 LOGICAL AND */ +#define XKB_KEY_logicalor 0x08df /* U+2228 LOGICAL OR */ +#define XKB_KEY_partialderivative 0x08ef /* U+2202 PARTIAL DIFFERENTIAL */ +#define XKB_KEY_function 0x08f6 /* U+0192 LATIN SMALL LETTER F WITH HOOK */ +#define XKB_KEY_leftarrow 0x08fb /* U+2190 LEFTWARDS ARROW */ +#define XKB_KEY_uparrow 0x08fc /* U+2191 UPWARDS ARROW */ +#define XKB_KEY_rightarrow 0x08fd /* U+2192 RIGHTWARDS ARROW */ +#define XKB_KEY_downarrow 0x08fe /* U+2193 DOWNWARDS ARROW */ + +/* + * Special + * (from the DEC VT100 Special Graphics Character Set) + * Byte 3 = 9 + */ + +#define XKB_KEY_blank 0x09df +#define XKB_KEY_soliddiamond 0x09e0 /* U+25C6 BLACK DIAMOND */ +#define XKB_KEY_checkerboard 0x09e1 /* U+2592 MEDIUM SHADE */ +#define XKB_KEY_ht 0x09e2 /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */ +#define XKB_KEY_ff 0x09e3 /* U+240C SYMBOL FOR FORM FEED */ +#define XKB_KEY_cr 0x09e4 /* U+240D SYMBOL FOR CARRIAGE RETURN */ +#define XKB_KEY_lf 0x09e5 /* U+240A SYMBOL FOR LINE FEED */ +#define XKB_KEY_nl 0x09e8 /* U+2424 SYMBOL FOR NEWLINE */ +#define XKB_KEY_vt 0x09e9 /* U+240B SYMBOL FOR VERTICAL TABULATION */ +#define XKB_KEY_lowrightcorner 0x09ea /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */ +#define XKB_KEY_uprightcorner 0x09eb /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */ +#define XKB_KEY_upleftcorner 0x09ec /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */ +#define XKB_KEY_lowleftcorner 0x09ed /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */ +#define XKB_KEY_crossinglines 0x09ee /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ +#define XKB_KEY_horizlinescan1 0x09ef /* U+23BA HORIZONTAL SCAN LINE-1 */ +#define XKB_KEY_horizlinescan3 0x09f0 /* U+23BB HORIZONTAL SCAN LINE-3 */ +#define XKB_KEY_horizlinescan5 0x09f1 /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */ +#define XKB_KEY_horizlinescan7 0x09f2 /* U+23BC HORIZONTAL SCAN LINE-7 */ +#define XKB_KEY_horizlinescan9 0x09f3 /* U+23BD HORIZONTAL SCAN LINE-9 */ +#define XKB_KEY_leftt 0x09f4 /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ +#define XKB_KEY_rightt 0x09f5 /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */ +#define XKB_KEY_bott 0x09f6 /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */ +#define XKB_KEY_topt 0x09f7 /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ +#define XKB_KEY_vertbar 0x09f8 /* U+2502 BOX DRAWINGS LIGHT VERTICAL */ + +/* + * Publishing + * (these are probably from a long forgotten DEC Publishing + * font that once shipped with DECwrite) + * Byte 3 = 0x0a + */ + +#define XKB_KEY_emspace 0x0aa1 /* U+2003 EM SPACE */ +#define XKB_KEY_enspace 0x0aa2 /* U+2002 EN SPACE */ +#define XKB_KEY_em3space 0x0aa3 /* U+2004 THREE-PER-EM SPACE */ +#define XKB_KEY_em4space 0x0aa4 /* U+2005 FOUR-PER-EM SPACE */ +#define XKB_KEY_digitspace 0x0aa5 /* U+2007 FIGURE SPACE */ +#define XKB_KEY_punctspace 0x0aa6 /* U+2008 PUNCTUATION SPACE */ +#define XKB_KEY_thinspace 0x0aa7 /* U+2009 THIN SPACE */ +#define XKB_KEY_hairspace 0x0aa8 /* U+200A HAIR SPACE */ +#define XKB_KEY_emdash 0x0aa9 /* U+2014 EM DASH */ +#define XKB_KEY_endash 0x0aaa /* U+2013 EN DASH */ +#define XKB_KEY_signifblank 0x0aac /*(U+2423 OPEN BOX)*/ +#define XKB_KEY_ellipsis 0x0aae /* U+2026 HORIZONTAL ELLIPSIS */ +#define XKB_KEY_doubbaselinedot 0x0aaf /* U+2025 TWO DOT LEADER */ +#define XKB_KEY_onethird 0x0ab0 /* U+2153 VULGAR FRACTION ONE THIRD */ +#define XKB_KEY_twothirds 0x0ab1 /* U+2154 VULGAR FRACTION TWO THIRDS */ +#define XKB_KEY_onefifth 0x0ab2 /* U+2155 VULGAR FRACTION ONE FIFTH */ +#define XKB_KEY_twofifths 0x0ab3 /* U+2156 VULGAR FRACTION TWO FIFTHS */ +#define XKB_KEY_threefifths 0x0ab4 /* U+2157 VULGAR FRACTION THREE FIFTHS */ +#define XKB_KEY_fourfifths 0x0ab5 /* U+2158 VULGAR FRACTION FOUR FIFTHS */ +#define XKB_KEY_onesixth 0x0ab6 /* U+2159 VULGAR FRACTION ONE SIXTH */ +#define XKB_KEY_fivesixths 0x0ab7 /* U+215A VULGAR FRACTION FIVE SIXTHS */ +#define XKB_KEY_careof 0x0ab8 /* U+2105 CARE OF */ +#define XKB_KEY_figdash 0x0abb /* U+2012 FIGURE DASH */ +#define XKB_KEY_leftanglebracket 0x0abc /*(U+2329 LEFT-POINTING ANGLE BRACKET)*/ +#define XKB_KEY_decimalpoint 0x0abd /*(U+002E FULL STOP)*/ +#define XKB_KEY_rightanglebracket 0x0abe /*(U+232A RIGHT-POINTING ANGLE BRACKET)*/ +#define XKB_KEY_marker 0x0abf +#define XKB_KEY_oneeighth 0x0ac3 /* U+215B VULGAR FRACTION ONE EIGHTH */ +#define XKB_KEY_threeeighths 0x0ac4 /* U+215C VULGAR FRACTION THREE EIGHTHS */ +#define XKB_KEY_fiveeighths 0x0ac5 /* U+215D VULGAR FRACTION FIVE EIGHTHS */ +#define XKB_KEY_seveneighths 0x0ac6 /* U+215E VULGAR FRACTION SEVEN EIGHTHS */ +#define XKB_KEY_trademark 0x0ac9 /* U+2122 TRADE MARK SIGN */ +#define XKB_KEY_signaturemark 0x0aca /*(U+2613 SALTIRE)*/ +#define XKB_KEY_trademarkincircle 0x0acb +#define XKB_KEY_leftopentriangle 0x0acc /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/ +#define XKB_KEY_rightopentriangle 0x0acd /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/ +#define XKB_KEY_emopencircle 0x0ace /*(U+25CB WHITE CIRCLE)*/ +#define XKB_KEY_emopenrectangle 0x0acf /*(U+25AF WHITE VERTICAL RECTANGLE)*/ +#define XKB_KEY_leftsinglequotemark 0x0ad0 /* U+2018 LEFT SINGLE QUOTATION MARK */ +#define XKB_KEY_rightsinglequotemark 0x0ad1 /* U+2019 RIGHT SINGLE QUOTATION MARK */ +#define XKB_KEY_leftdoublequotemark 0x0ad2 /* U+201C LEFT DOUBLE QUOTATION MARK */ +#define XKB_KEY_rightdoublequotemark 0x0ad3 /* U+201D RIGHT DOUBLE QUOTATION MARK */ +#define XKB_KEY_prescription 0x0ad4 /* U+211E PRESCRIPTION TAKE */ +#define XKB_KEY_permille 0x0ad5 /* U+2030 PER MILLE SIGN */ +#define XKB_KEY_minutes 0x0ad6 /* U+2032 PRIME */ +#define XKB_KEY_seconds 0x0ad7 /* U+2033 DOUBLE PRIME */ +#define XKB_KEY_latincross 0x0ad9 /* U+271D LATIN CROSS */ +#define XKB_KEY_hexagram 0x0ada +#define XKB_KEY_filledrectbullet 0x0adb /*(U+25AC BLACK RECTANGLE)*/ +#define XKB_KEY_filledlefttribullet 0x0adc /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/ +#define XKB_KEY_filledrighttribullet 0x0add /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/ +#define XKB_KEY_emfilledcircle 0x0ade /*(U+25CF BLACK CIRCLE)*/ +#define XKB_KEY_emfilledrect 0x0adf /*(U+25AE BLACK VERTICAL RECTANGLE)*/ +#define XKB_KEY_enopencircbullet 0x0ae0 /*(U+25E6 WHITE BULLET)*/ +#define XKB_KEY_enopensquarebullet 0x0ae1 /*(U+25AB WHITE SMALL SQUARE)*/ +#define XKB_KEY_openrectbullet 0x0ae2 /*(U+25AD WHITE RECTANGLE)*/ +#define XKB_KEY_opentribulletup 0x0ae3 /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/ +#define XKB_KEY_opentribulletdown 0x0ae4 /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/ +#define XKB_KEY_openstar 0x0ae5 /*(U+2606 WHITE STAR)*/ +#define XKB_KEY_enfilledcircbullet 0x0ae6 /*(U+2022 BULLET)*/ +#define XKB_KEY_enfilledsqbullet 0x0ae7 /*(U+25AA BLACK SMALL SQUARE)*/ +#define XKB_KEY_filledtribulletup 0x0ae8 /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/ +#define XKB_KEY_filledtribulletdown 0x0ae9 /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/ +#define XKB_KEY_leftpointer 0x0aea /*(U+261C WHITE LEFT POINTING INDEX)*/ +#define XKB_KEY_rightpointer 0x0aeb /*(U+261E WHITE RIGHT POINTING INDEX)*/ +#define XKB_KEY_club 0x0aec /* U+2663 BLACK CLUB SUIT */ +#define XKB_KEY_diamond 0x0aed /* U+2666 BLACK DIAMOND SUIT */ +#define XKB_KEY_heart 0x0aee /* U+2665 BLACK HEART SUIT */ +#define XKB_KEY_maltesecross 0x0af0 /* U+2720 MALTESE CROSS */ +#define XKB_KEY_dagger 0x0af1 /* U+2020 DAGGER */ +#define XKB_KEY_doubledagger 0x0af2 /* U+2021 DOUBLE DAGGER */ +#define XKB_KEY_checkmark 0x0af3 /* U+2713 CHECK MARK */ +#define XKB_KEY_ballotcross 0x0af4 /* U+2717 BALLOT X */ +#define XKB_KEY_musicalsharp 0x0af5 /* U+266F MUSIC SHARP SIGN */ +#define XKB_KEY_musicalflat 0x0af6 /* U+266D MUSIC FLAT SIGN */ +#define XKB_KEY_malesymbol 0x0af7 /* U+2642 MALE SIGN */ +#define XKB_KEY_femalesymbol 0x0af8 /* U+2640 FEMALE SIGN */ +#define XKB_KEY_telephone 0x0af9 /* U+260E BLACK TELEPHONE */ +#define XKB_KEY_telephonerecorder 0x0afa /* U+2315 TELEPHONE RECORDER */ +#define XKB_KEY_phonographcopyright 0x0afb /* U+2117 SOUND RECORDING COPYRIGHT */ +#define XKB_KEY_caret 0x0afc /* U+2038 CARET */ +#define XKB_KEY_singlelowquotemark 0x0afd /* U+201A SINGLE LOW-9 QUOTATION MARK */ +#define XKB_KEY_doublelowquotemark 0x0afe /* U+201E DOUBLE LOW-9 QUOTATION MARK */ +#define XKB_KEY_cursor 0x0aff + +/* + * APL + * Byte 3 = 0x0b + */ + +#define XKB_KEY_leftcaret 0x0ba3 /*(U+003C LESS-THAN SIGN)*/ +#define XKB_KEY_rightcaret 0x0ba6 /*(U+003E GREATER-THAN SIGN)*/ +#define XKB_KEY_downcaret 0x0ba8 /*(U+2228 LOGICAL OR)*/ +#define XKB_KEY_upcaret 0x0ba9 /*(U+2227 LOGICAL AND)*/ +#define XKB_KEY_overbar 0x0bc0 /*(U+00AF MACRON)*/ +#define XKB_KEY_downtack 0x0bc2 /* U+22A4 DOWN TACK */ +#define XKB_KEY_upshoe 0x0bc3 /*(U+2229 INTERSECTION)*/ +#define XKB_KEY_downstile 0x0bc4 /* U+230A LEFT FLOOR */ +#define XKB_KEY_underbar 0x0bc6 /*(U+005F LOW LINE)*/ +#define XKB_KEY_jot 0x0bca /* U+2218 RING OPERATOR */ +#define XKB_KEY_quad 0x0bcc /* U+2395 APL FUNCTIONAL SYMBOL QUAD */ +#define XKB_KEY_uptack 0x0bce /* U+22A5 UP TACK */ +#define XKB_KEY_circle 0x0bcf /* U+25CB WHITE CIRCLE */ +#define XKB_KEY_upstile 0x0bd3 /* U+2308 LEFT CEILING */ +#define XKB_KEY_downshoe 0x0bd6 /*(U+222A UNION)*/ +#define XKB_KEY_rightshoe 0x0bd8 /*(U+2283 SUPERSET OF)*/ +#define XKB_KEY_leftshoe 0x0bda /*(U+2282 SUBSET OF)*/ +#define XKB_KEY_lefttack 0x0bdc /* U+22A3 LEFT TACK */ +#define XKB_KEY_righttack 0x0bfc /* U+22A2 RIGHT TACK */ + +/* + * Hebrew + * Byte 3 = 0x0c + */ + +#define XKB_KEY_hebrew_doublelowline 0x0cdf /* U+2017 DOUBLE LOW LINE */ +#define XKB_KEY_hebrew_aleph 0x0ce0 /* U+05D0 HEBREW LETTER ALEF */ +#define XKB_KEY_hebrew_bet 0x0ce1 /* U+05D1 HEBREW LETTER BET */ +#define XKB_KEY_hebrew_beth 0x0ce1 /* deprecated */ +#define XKB_KEY_hebrew_gimel 0x0ce2 /* U+05D2 HEBREW LETTER GIMEL */ +#define XKB_KEY_hebrew_gimmel 0x0ce2 /* deprecated */ +#define XKB_KEY_hebrew_dalet 0x0ce3 /* U+05D3 HEBREW LETTER DALET */ +#define XKB_KEY_hebrew_daleth 0x0ce3 /* deprecated */ +#define XKB_KEY_hebrew_he 0x0ce4 /* U+05D4 HEBREW LETTER HE */ +#define XKB_KEY_hebrew_waw 0x0ce5 /* U+05D5 HEBREW LETTER VAV */ +#define XKB_KEY_hebrew_zain 0x0ce6 /* U+05D6 HEBREW LETTER ZAYIN */ +#define XKB_KEY_hebrew_zayin 0x0ce6 /* deprecated */ +#define XKB_KEY_hebrew_chet 0x0ce7 /* U+05D7 HEBREW LETTER HET */ +#define XKB_KEY_hebrew_het 0x0ce7 /* deprecated */ +#define XKB_KEY_hebrew_tet 0x0ce8 /* U+05D8 HEBREW LETTER TET */ +#define XKB_KEY_hebrew_teth 0x0ce8 /* deprecated */ +#define XKB_KEY_hebrew_yod 0x0ce9 /* U+05D9 HEBREW LETTER YOD */ +#define XKB_KEY_hebrew_finalkaph 0x0cea /* U+05DA HEBREW LETTER FINAL KAF */ +#define XKB_KEY_hebrew_kaph 0x0ceb /* U+05DB HEBREW LETTER KAF */ +#define XKB_KEY_hebrew_lamed 0x0cec /* U+05DC HEBREW LETTER LAMED */ +#define XKB_KEY_hebrew_finalmem 0x0ced /* U+05DD HEBREW LETTER FINAL MEM */ +#define XKB_KEY_hebrew_mem 0x0cee /* U+05DE HEBREW LETTER MEM */ +#define XKB_KEY_hebrew_finalnun 0x0cef /* U+05DF HEBREW LETTER FINAL NUN */ +#define XKB_KEY_hebrew_nun 0x0cf0 /* U+05E0 HEBREW LETTER NUN */ +#define XKB_KEY_hebrew_samech 0x0cf1 /* U+05E1 HEBREW LETTER SAMEKH */ +#define XKB_KEY_hebrew_samekh 0x0cf1 /* deprecated */ +#define XKB_KEY_hebrew_ayin 0x0cf2 /* U+05E2 HEBREW LETTER AYIN */ +#define XKB_KEY_hebrew_finalpe 0x0cf3 /* U+05E3 HEBREW LETTER FINAL PE */ +#define XKB_KEY_hebrew_pe 0x0cf4 /* U+05E4 HEBREW LETTER PE */ +#define XKB_KEY_hebrew_finalzade 0x0cf5 /* U+05E5 HEBREW LETTER FINAL TSADI */ +#define XKB_KEY_hebrew_finalzadi 0x0cf5 /* deprecated */ +#define XKB_KEY_hebrew_zade 0x0cf6 /* U+05E6 HEBREW LETTER TSADI */ +#define XKB_KEY_hebrew_zadi 0x0cf6 /* deprecated */ +#define XKB_KEY_hebrew_qoph 0x0cf7 /* U+05E7 HEBREW LETTER QOF */ +#define XKB_KEY_hebrew_kuf 0x0cf7 /* deprecated */ +#define XKB_KEY_hebrew_resh 0x0cf8 /* U+05E8 HEBREW LETTER RESH */ +#define XKB_KEY_hebrew_shin 0x0cf9 /* U+05E9 HEBREW LETTER SHIN */ +#define XKB_KEY_hebrew_taw 0x0cfa /* U+05EA HEBREW LETTER TAV */ +#define XKB_KEY_hebrew_taf 0x0cfa /* deprecated */ +#define XKB_KEY_Hebrew_switch 0xff7e /* Alias for mode_switch */ + +/* + * Thai + * Byte 3 = 0x0d + */ + +#define XKB_KEY_Thai_kokai 0x0da1 /* U+0E01 THAI CHARACTER KO KAI */ +#define XKB_KEY_Thai_khokhai 0x0da2 /* U+0E02 THAI CHARACTER KHO KHAI */ +#define XKB_KEY_Thai_khokhuat 0x0da3 /* U+0E03 THAI CHARACTER KHO KHUAT */ +#define XKB_KEY_Thai_khokhwai 0x0da4 /* U+0E04 THAI CHARACTER KHO KHWAI */ +#define XKB_KEY_Thai_khokhon 0x0da5 /* U+0E05 THAI CHARACTER KHO KHON */ +#define XKB_KEY_Thai_khorakhang 0x0da6 /* U+0E06 THAI CHARACTER KHO RAKHANG */ +#define XKB_KEY_Thai_ngongu 0x0da7 /* U+0E07 THAI CHARACTER NGO NGU */ +#define XKB_KEY_Thai_chochan 0x0da8 /* U+0E08 THAI CHARACTER CHO CHAN */ +#define XKB_KEY_Thai_choching 0x0da9 /* U+0E09 THAI CHARACTER CHO CHING */ +#define XKB_KEY_Thai_chochang 0x0daa /* U+0E0A THAI CHARACTER CHO CHANG */ +#define XKB_KEY_Thai_soso 0x0dab /* U+0E0B THAI CHARACTER SO SO */ +#define XKB_KEY_Thai_chochoe 0x0dac /* U+0E0C THAI CHARACTER CHO CHOE */ +#define XKB_KEY_Thai_yoying 0x0dad /* U+0E0D THAI CHARACTER YO YING */ +#define XKB_KEY_Thai_dochada 0x0dae /* U+0E0E THAI CHARACTER DO CHADA */ +#define XKB_KEY_Thai_topatak 0x0daf /* U+0E0F THAI CHARACTER TO PATAK */ +#define XKB_KEY_Thai_thothan 0x0db0 /* U+0E10 THAI CHARACTER THO THAN */ +#define XKB_KEY_Thai_thonangmontho 0x0db1 /* U+0E11 THAI CHARACTER THO NANGMONTHO */ +#define XKB_KEY_Thai_thophuthao 0x0db2 /* U+0E12 THAI CHARACTER THO PHUTHAO */ +#define XKB_KEY_Thai_nonen 0x0db3 /* U+0E13 THAI CHARACTER NO NEN */ +#define XKB_KEY_Thai_dodek 0x0db4 /* U+0E14 THAI CHARACTER DO DEK */ +#define XKB_KEY_Thai_totao 0x0db5 /* U+0E15 THAI CHARACTER TO TAO */ +#define XKB_KEY_Thai_thothung 0x0db6 /* U+0E16 THAI CHARACTER THO THUNG */ +#define XKB_KEY_Thai_thothahan 0x0db7 /* U+0E17 THAI CHARACTER THO THAHAN */ +#define XKB_KEY_Thai_thothong 0x0db8 /* U+0E18 THAI CHARACTER THO THONG */ +#define XKB_KEY_Thai_nonu 0x0db9 /* U+0E19 THAI CHARACTER NO NU */ +#define XKB_KEY_Thai_bobaimai 0x0dba /* U+0E1A THAI CHARACTER BO BAIMAI */ +#define XKB_KEY_Thai_popla 0x0dbb /* U+0E1B THAI CHARACTER PO PLA */ +#define XKB_KEY_Thai_phophung 0x0dbc /* U+0E1C THAI CHARACTER PHO PHUNG */ +#define XKB_KEY_Thai_fofa 0x0dbd /* U+0E1D THAI CHARACTER FO FA */ +#define XKB_KEY_Thai_phophan 0x0dbe /* U+0E1E THAI CHARACTER PHO PHAN */ +#define XKB_KEY_Thai_fofan 0x0dbf /* U+0E1F THAI CHARACTER FO FAN */ +#define XKB_KEY_Thai_phosamphao 0x0dc0 /* U+0E20 THAI CHARACTER PHO SAMPHAO */ +#define XKB_KEY_Thai_moma 0x0dc1 /* U+0E21 THAI CHARACTER MO MA */ +#define XKB_KEY_Thai_yoyak 0x0dc2 /* U+0E22 THAI CHARACTER YO YAK */ +#define XKB_KEY_Thai_rorua 0x0dc3 /* U+0E23 THAI CHARACTER RO RUA */ +#define XKB_KEY_Thai_ru 0x0dc4 /* U+0E24 THAI CHARACTER RU */ +#define XKB_KEY_Thai_loling 0x0dc5 /* U+0E25 THAI CHARACTER LO LING */ +#define XKB_KEY_Thai_lu 0x0dc6 /* U+0E26 THAI CHARACTER LU */ +#define XKB_KEY_Thai_wowaen 0x0dc7 /* U+0E27 THAI CHARACTER WO WAEN */ +#define XKB_KEY_Thai_sosala 0x0dc8 /* U+0E28 THAI CHARACTER SO SALA */ +#define XKB_KEY_Thai_sorusi 0x0dc9 /* U+0E29 THAI CHARACTER SO RUSI */ +#define XKB_KEY_Thai_sosua 0x0dca /* U+0E2A THAI CHARACTER SO SUA */ +#define XKB_KEY_Thai_hohip 0x0dcb /* U+0E2B THAI CHARACTER HO HIP */ +#define XKB_KEY_Thai_lochula 0x0dcc /* U+0E2C THAI CHARACTER LO CHULA */ +#define XKB_KEY_Thai_oang 0x0dcd /* U+0E2D THAI CHARACTER O ANG */ +#define XKB_KEY_Thai_honokhuk 0x0dce /* U+0E2E THAI CHARACTER HO NOKHUK */ +#define XKB_KEY_Thai_paiyannoi 0x0dcf /* U+0E2F THAI CHARACTER PAIYANNOI */ +#define XKB_KEY_Thai_saraa 0x0dd0 /* U+0E30 THAI CHARACTER SARA A */ +#define XKB_KEY_Thai_maihanakat 0x0dd1 /* U+0E31 THAI CHARACTER MAI HAN-AKAT */ +#define XKB_KEY_Thai_saraaa 0x0dd2 /* U+0E32 THAI CHARACTER SARA AA */ +#define XKB_KEY_Thai_saraam 0x0dd3 /* U+0E33 THAI CHARACTER SARA AM */ +#define XKB_KEY_Thai_sarai 0x0dd4 /* U+0E34 THAI CHARACTER SARA I */ +#define XKB_KEY_Thai_saraii 0x0dd5 /* U+0E35 THAI CHARACTER SARA II */ +#define XKB_KEY_Thai_saraue 0x0dd6 /* U+0E36 THAI CHARACTER SARA UE */ +#define XKB_KEY_Thai_sarauee 0x0dd7 /* U+0E37 THAI CHARACTER SARA UEE */ +#define XKB_KEY_Thai_sarau 0x0dd8 /* U+0E38 THAI CHARACTER SARA U */ +#define XKB_KEY_Thai_sarauu 0x0dd9 /* U+0E39 THAI CHARACTER SARA UU */ +#define XKB_KEY_Thai_phinthu 0x0dda /* U+0E3A THAI CHARACTER PHINTHU */ +#define XKB_KEY_Thai_maihanakat_maitho 0x0dde +#define XKB_KEY_Thai_baht 0x0ddf /* U+0E3F THAI CURRENCY SYMBOL BAHT */ +#define XKB_KEY_Thai_sarae 0x0de0 /* U+0E40 THAI CHARACTER SARA E */ +#define XKB_KEY_Thai_saraae 0x0de1 /* U+0E41 THAI CHARACTER SARA AE */ +#define XKB_KEY_Thai_sarao 0x0de2 /* U+0E42 THAI CHARACTER SARA O */ +#define XKB_KEY_Thai_saraaimaimuan 0x0de3 /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */ +#define XKB_KEY_Thai_saraaimaimalai 0x0de4 /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */ +#define XKB_KEY_Thai_lakkhangyao 0x0de5 /* U+0E45 THAI CHARACTER LAKKHANGYAO */ +#define XKB_KEY_Thai_maiyamok 0x0de6 /* U+0E46 THAI CHARACTER MAIYAMOK */ +#define XKB_KEY_Thai_maitaikhu 0x0de7 /* U+0E47 THAI CHARACTER MAITAIKHU */ +#define XKB_KEY_Thai_maiek 0x0de8 /* U+0E48 THAI CHARACTER MAI EK */ +#define XKB_KEY_Thai_maitho 0x0de9 /* U+0E49 THAI CHARACTER MAI THO */ +#define XKB_KEY_Thai_maitri 0x0dea /* U+0E4A THAI CHARACTER MAI TRI */ +#define XKB_KEY_Thai_maichattawa 0x0deb /* U+0E4B THAI CHARACTER MAI CHATTAWA */ +#define XKB_KEY_Thai_thanthakhat 0x0dec /* U+0E4C THAI CHARACTER THANTHAKHAT */ +#define XKB_KEY_Thai_nikhahit 0x0ded /* U+0E4D THAI CHARACTER NIKHAHIT */ +#define XKB_KEY_Thai_leksun 0x0df0 /* U+0E50 THAI DIGIT ZERO */ +#define XKB_KEY_Thai_leknung 0x0df1 /* U+0E51 THAI DIGIT ONE */ +#define XKB_KEY_Thai_leksong 0x0df2 /* U+0E52 THAI DIGIT TWO */ +#define XKB_KEY_Thai_leksam 0x0df3 /* U+0E53 THAI DIGIT THREE */ +#define XKB_KEY_Thai_leksi 0x0df4 /* U+0E54 THAI DIGIT FOUR */ +#define XKB_KEY_Thai_lekha 0x0df5 /* U+0E55 THAI DIGIT FIVE */ +#define XKB_KEY_Thai_lekhok 0x0df6 /* U+0E56 THAI DIGIT SIX */ +#define XKB_KEY_Thai_lekchet 0x0df7 /* U+0E57 THAI DIGIT SEVEN */ +#define XKB_KEY_Thai_lekpaet 0x0df8 /* U+0E58 THAI DIGIT EIGHT */ +#define XKB_KEY_Thai_lekkao 0x0df9 /* U+0E59 THAI DIGIT NINE */ + +/* + * Korean + * Byte 3 = 0x0e + */ + + +#define XKB_KEY_Hangul 0xff31 /* Hangul start/stop(toggle) */ +#define XKB_KEY_Hangul_Start 0xff32 /* Hangul start */ +#define XKB_KEY_Hangul_End 0xff33 /* Hangul end, English start */ +#define XKB_KEY_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */ +#define XKB_KEY_Hangul_Jamo 0xff35 /* Hangul Jamo mode */ +#define XKB_KEY_Hangul_Romaja 0xff36 /* Hangul Romaja mode */ +#define XKB_KEY_Hangul_Codeinput 0xff37 /* Hangul code input mode */ +#define XKB_KEY_Hangul_Jeonja 0xff38 /* Jeonja mode */ +#define XKB_KEY_Hangul_Banja 0xff39 /* Banja mode */ +#define XKB_KEY_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */ +#define XKB_KEY_Hangul_PostHanja 0xff3b /* Post Hanja conversion */ +#define XKB_KEY_Hangul_SingleCandidate 0xff3c /* Single candidate */ +#define XKB_KEY_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */ +#define XKB_KEY_Hangul_PreviousCandidate 0xff3e /* Previous candidate */ +#define XKB_KEY_Hangul_Special 0xff3f /* Special symbols */ +#define XKB_KEY_Hangul_switch 0xff7e /* Alias for mode_switch */ + +/* Hangul Consonant Characters */ +#define XKB_KEY_Hangul_Kiyeog 0x0ea1 /* U+3131 HANGUL LETTER KIYEOK */ +#define XKB_KEY_Hangul_SsangKiyeog 0x0ea2 /* U+3132 HANGUL LETTER SSANGKIYEOK */ +#define XKB_KEY_Hangul_KiyeogSios 0x0ea3 /* U+3133 HANGUL LETTER KIYEOK-SIOS */ +#define XKB_KEY_Hangul_Nieun 0x0ea4 /* U+3134 HANGUL LETTER NIEUN */ +#define XKB_KEY_Hangul_NieunJieuj 0x0ea5 /* U+3135 HANGUL LETTER NIEUN-CIEUC */ +#define XKB_KEY_Hangul_NieunHieuh 0x0ea6 /* U+3136 HANGUL LETTER NIEUN-HIEUH */ +#define XKB_KEY_Hangul_Dikeud 0x0ea7 /* U+3137 HANGUL LETTER TIKEUT */ +#define XKB_KEY_Hangul_SsangDikeud 0x0ea8 /* U+3138 HANGUL LETTER SSANGTIKEUT */ +#define XKB_KEY_Hangul_Rieul 0x0ea9 /* U+3139 HANGUL LETTER RIEUL */ +#define XKB_KEY_Hangul_RieulKiyeog 0x0eaa /* U+313A HANGUL LETTER RIEUL-KIYEOK */ +#define XKB_KEY_Hangul_RieulMieum 0x0eab /* U+313B HANGUL LETTER RIEUL-MIEUM */ +#define XKB_KEY_Hangul_RieulPieub 0x0eac /* U+313C HANGUL LETTER RIEUL-PIEUP */ +#define XKB_KEY_Hangul_RieulSios 0x0ead /* U+313D HANGUL LETTER RIEUL-SIOS */ +#define XKB_KEY_Hangul_RieulTieut 0x0eae /* U+313E HANGUL LETTER RIEUL-THIEUTH */ +#define XKB_KEY_Hangul_RieulPhieuf 0x0eaf /* U+313F HANGUL LETTER RIEUL-PHIEUPH */ +#define XKB_KEY_Hangul_RieulHieuh 0x0eb0 /* U+3140 HANGUL LETTER RIEUL-HIEUH */ +#define XKB_KEY_Hangul_Mieum 0x0eb1 /* U+3141 HANGUL LETTER MIEUM */ +#define XKB_KEY_Hangul_Pieub 0x0eb2 /* U+3142 HANGUL LETTER PIEUP */ +#define XKB_KEY_Hangul_SsangPieub 0x0eb3 /* U+3143 HANGUL LETTER SSANGPIEUP */ +#define XKB_KEY_Hangul_PieubSios 0x0eb4 /* U+3144 HANGUL LETTER PIEUP-SIOS */ +#define XKB_KEY_Hangul_Sios 0x0eb5 /* U+3145 HANGUL LETTER SIOS */ +#define XKB_KEY_Hangul_SsangSios 0x0eb6 /* U+3146 HANGUL LETTER SSANGSIOS */ +#define XKB_KEY_Hangul_Ieung 0x0eb7 /* U+3147 HANGUL LETTER IEUNG */ +#define XKB_KEY_Hangul_Jieuj 0x0eb8 /* U+3148 HANGUL LETTER CIEUC */ +#define XKB_KEY_Hangul_SsangJieuj 0x0eb9 /* U+3149 HANGUL LETTER SSANGCIEUC */ +#define XKB_KEY_Hangul_Cieuc 0x0eba /* U+314A HANGUL LETTER CHIEUCH */ +#define XKB_KEY_Hangul_Khieuq 0x0ebb /* U+314B HANGUL LETTER KHIEUKH */ +#define XKB_KEY_Hangul_Tieut 0x0ebc /* U+314C HANGUL LETTER THIEUTH */ +#define XKB_KEY_Hangul_Phieuf 0x0ebd /* U+314D HANGUL LETTER PHIEUPH */ +#define XKB_KEY_Hangul_Hieuh 0x0ebe /* U+314E HANGUL LETTER HIEUH */ + +/* Hangul Vowel Characters */ +#define XKB_KEY_Hangul_A 0x0ebf /* U+314F HANGUL LETTER A */ +#define XKB_KEY_Hangul_AE 0x0ec0 /* U+3150 HANGUL LETTER AE */ +#define XKB_KEY_Hangul_YA 0x0ec1 /* U+3151 HANGUL LETTER YA */ +#define XKB_KEY_Hangul_YAE 0x0ec2 /* U+3152 HANGUL LETTER YAE */ +#define XKB_KEY_Hangul_EO 0x0ec3 /* U+3153 HANGUL LETTER EO */ +#define XKB_KEY_Hangul_E 0x0ec4 /* U+3154 HANGUL LETTER E */ +#define XKB_KEY_Hangul_YEO 0x0ec5 /* U+3155 HANGUL LETTER YEO */ +#define XKB_KEY_Hangul_YE 0x0ec6 /* U+3156 HANGUL LETTER YE */ +#define XKB_KEY_Hangul_O 0x0ec7 /* U+3157 HANGUL LETTER O */ +#define XKB_KEY_Hangul_WA 0x0ec8 /* U+3158 HANGUL LETTER WA */ +#define XKB_KEY_Hangul_WAE 0x0ec9 /* U+3159 HANGUL LETTER WAE */ +#define XKB_KEY_Hangul_OE 0x0eca /* U+315A HANGUL LETTER OE */ +#define XKB_KEY_Hangul_YO 0x0ecb /* U+315B HANGUL LETTER YO */ +#define XKB_KEY_Hangul_U 0x0ecc /* U+315C HANGUL LETTER U */ +#define XKB_KEY_Hangul_WEO 0x0ecd /* U+315D HANGUL LETTER WEO */ +#define XKB_KEY_Hangul_WE 0x0ece /* U+315E HANGUL LETTER WE */ +#define XKB_KEY_Hangul_WI 0x0ecf /* U+315F HANGUL LETTER WI */ +#define XKB_KEY_Hangul_YU 0x0ed0 /* U+3160 HANGUL LETTER YU */ +#define XKB_KEY_Hangul_EU 0x0ed1 /* U+3161 HANGUL LETTER EU */ +#define XKB_KEY_Hangul_YI 0x0ed2 /* U+3162 HANGUL LETTER YI */ +#define XKB_KEY_Hangul_I 0x0ed3 /* U+3163 HANGUL LETTER I */ + +/* Hangul syllable-final (JongSeong) Characters */ +#define XKB_KEY_Hangul_J_Kiyeog 0x0ed4 /* U+11A8 HANGUL JONGSEONG KIYEOK */ +#define XKB_KEY_Hangul_J_SsangKiyeog 0x0ed5 /* U+11A9 HANGUL JONGSEONG SSANGKIYEOK */ +#define XKB_KEY_Hangul_J_KiyeogSios 0x0ed6 /* U+11AA HANGUL JONGSEONG KIYEOK-SIOS */ +#define XKB_KEY_Hangul_J_Nieun 0x0ed7 /* U+11AB HANGUL JONGSEONG NIEUN */ +#define XKB_KEY_Hangul_J_NieunJieuj 0x0ed8 /* U+11AC HANGUL JONGSEONG NIEUN-CIEUC */ +#define XKB_KEY_Hangul_J_NieunHieuh 0x0ed9 /* U+11AD HANGUL JONGSEONG NIEUN-HIEUH */ +#define XKB_KEY_Hangul_J_Dikeud 0x0eda /* U+11AE HANGUL JONGSEONG TIKEUT */ +#define XKB_KEY_Hangul_J_Rieul 0x0edb /* U+11AF HANGUL JONGSEONG RIEUL */ +#define XKB_KEY_Hangul_J_RieulKiyeog 0x0edc /* U+11B0 HANGUL JONGSEONG RIEUL-KIYEOK */ +#define XKB_KEY_Hangul_J_RieulMieum 0x0edd /* U+11B1 HANGUL JONGSEONG RIEUL-MIEUM */ +#define XKB_KEY_Hangul_J_RieulPieub 0x0ede /* U+11B2 HANGUL JONGSEONG RIEUL-PIEUP */ +#define XKB_KEY_Hangul_J_RieulSios 0x0edf /* U+11B3 HANGUL JONGSEONG RIEUL-SIOS */ +#define XKB_KEY_Hangul_J_RieulTieut 0x0ee0 /* U+11B4 HANGUL JONGSEONG RIEUL-THIEUTH */ +#define XKB_KEY_Hangul_J_RieulPhieuf 0x0ee1 /* U+11B5 HANGUL JONGSEONG RIEUL-PHIEUPH */ +#define XKB_KEY_Hangul_J_RieulHieuh 0x0ee2 /* U+11B6 HANGUL JONGSEONG RIEUL-HIEUH */ +#define XKB_KEY_Hangul_J_Mieum 0x0ee3 /* U+11B7 HANGUL JONGSEONG MIEUM */ +#define XKB_KEY_Hangul_J_Pieub 0x0ee4 /* U+11B8 HANGUL JONGSEONG PIEUP */ +#define XKB_KEY_Hangul_J_PieubSios 0x0ee5 /* U+11B9 HANGUL JONGSEONG PIEUP-SIOS */ +#define XKB_KEY_Hangul_J_Sios 0x0ee6 /* U+11BA HANGUL JONGSEONG SIOS */ +#define XKB_KEY_Hangul_J_SsangSios 0x0ee7 /* U+11BB HANGUL JONGSEONG SSANGSIOS */ +#define XKB_KEY_Hangul_J_Ieung 0x0ee8 /* U+11BC HANGUL JONGSEONG IEUNG */ +#define XKB_KEY_Hangul_J_Jieuj 0x0ee9 /* U+11BD HANGUL JONGSEONG CIEUC */ +#define XKB_KEY_Hangul_J_Cieuc 0x0eea /* U+11BE HANGUL JONGSEONG CHIEUCH */ +#define XKB_KEY_Hangul_J_Khieuq 0x0eeb /* U+11BF HANGUL JONGSEONG KHIEUKH */ +#define XKB_KEY_Hangul_J_Tieut 0x0eec /* U+11C0 HANGUL JONGSEONG THIEUTH */ +#define XKB_KEY_Hangul_J_Phieuf 0x0eed /* U+11C1 HANGUL JONGSEONG PHIEUPH */ +#define XKB_KEY_Hangul_J_Hieuh 0x0eee /* U+11C2 HANGUL JONGSEONG HIEUH */ + +/* Ancient Hangul Consonant Characters */ +#define XKB_KEY_Hangul_RieulYeorinHieuh 0x0eef /* U+316D HANGUL LETTER RIEUL-YEORINHIEUH */ +#define XKB_KEY_Hangul_SunkyeongeumMieum 0x0ef0 /* U+3171 HANGUL LETTER KAPYEOUNMIEUM */ +#define XKB_KEY_Hangul_SunkyeongeumPieub 0x0ef1 /* U+3178 HANGUL LETTER KAPYEOUNPIEUP */ +#define XKB_KEY_Hangul_PanSios 0x0ef2 /* U+317F HANGUL LETTER PANSIOS */ +#define XKB_KEY_Hangul_KkogjiDalrinIeung 0x0ef3 /* U+3181 HANGUL LETTER YESIEUNG */ +#define XKB_KEY_Hangul_SunkyeongeumPhieuf 0x0ef4 /* U+3184 HANGUL LETTER KAPYEOUNPHIEUPH */ +#define XKB_KEY_Hangul_YeorinHieuh 0x0ef5 /* U+3186 HANGUL LETTER YEORINHIEUH */ + +/* Ancient Hangul Vowel Characters */ +#define XKB_KEY_Hangul_AraeA 0x0ef6 /* U+318D HANGUL LETTER ARAEA */ +#define XKB_KEY_Hangul_AraeAE 0x0ef7 /* U+318E HANGUL LETTER ARAEAE */ + +/* Ancient Hangul syllable-final (JongSeong) Characters */ +#define XKB_KEY_Hangul_J_PanSios 0x0ef8 /* U+11EB HANGUL JONGSEONG PANSIOS */ +#define XKB_KEY_Hangul_J_KkogjiDalrinIeung 0x0ef9 /* U+11F0 HANGUL JONGSEONG YESIEUNG */ +#define XKB_KEY_Hangul_J_YeorinHieuh 0x0efa /* U+11F9 HANGUL JONGSEONG YEORINHIEUH */ + +/* Korean currency symbol */ +#define XKB_KEY_Korean_Won 0x0eff /*(U+20A9 WON SIGN)*/ + + +/* + * Armenian + */ + +#define XKB_KEY_Armenian_ligature_ew 0x1000587 /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */ +#define XKB_KEY_Armenian_full_stop 0x1000589 /* U+0589 ARMENIAN FULL STOP */ +#define XKB_KEY_Armenian_verjaket 0x1000589 /* U+0589 ARMENIAN FULL STOP */ +#define XKB_KEY_Armenian_separation_mark 0x100055d /* U+055D ARMENIAN COMMA */ +#define XKB_KEY_Armenian_but 0x100055d /* U+055D ARMENIAN COMMA */ +#define XKB_KEY_Armenian_hyphen 0x100058a /* U+058A ARMENIAN HYPHEN */ +#define XKB_KEY_Armenian_yentamna 0x100058a /* U+058A ARMENIAN HYPHEN */ +#define XKB_KEY_Armenian_exclam 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ +#define XKB_KEY_Armenian_amanak 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ +#define XKB_KEY_Armenian_accent 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ +#define XKB_KEY_Armenian_shesht 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ +#define XKB_KEY_Armenian_question 0x100055e /* U+055E ARMENIAN QUESTION MARK */ +#define XKB_KEY_Armenian_paruyk 0x100055e /* U+055E ARMENIAN QUESTION MARK */ +#define XKB_KEY_Armenian_AYB 0x1000531 /* U+0531 ARMENIAN CAPITAL LETTER AYB */ +#define XKB_KEY_Armenian_ayb 0x1000561 /* U+0561 ARMENIAN SMALL LETTER AYB */ +#define XKB_KEY_Armenian_BEN 0x1000532 /* U+0532 ARMENIAN CAPITAL LETTER BEN */ +#define XKB_KEY_Armenian_ben 0x1000562 /* U+0562 ARMENIAN SMALL LETTER BEN */ +#define XKB_KEY_Armenian_GIM 0x1000533 /* U+0533 ARMENIAN CAPITAL LETTER GIM */ +#define XKB_KEY_Armenian_gim 0x1000563 /* U+0563 ARMENIAN SMALL LETTER GIM */ +#define XKB_KEY_Armenian_DA 0x1000534 /* U+0534 ARMENIAN CAPITAL LETTER DA */ +#define XKB_KEY_Armenian_da 0x1000564 /* U+0564 ARMENIAN SMALL LETTER DA */ +#define XKB_KEY_Armenian_YECH 0x1000535 /* U+0535 ARMENIAN CAPITAL LETTER ECH */ +#define XKB_KEY_Armenian_yech 0x1000565 /* U+0565 ARMENIAN SMALL LETTER ECH */ +#define XKB_KEY_Armenian_ZA 0x1000536 /* U+0536 ARMENIAN CAPITAL LETTER ZA */ +#define XKB_KEY_Armenian_za 0x1000566 /* U+0566 ARMENIAN SMALL LETTER ZA */ +#define XKB_KEY_Armenian_E 0x1000537 /* U+0537 ARMENIAN CAPITAL LETTER EH */ +#define XKB_KEY_Armenian_e 0x1000567 /* U+0567 ARMENIAN SMALL LETTER EH */ +#define XKB_KEY_Armenian_AT 0x1000538 /* U+0538 ARMENIAN CAPITAL LETTER ET */ +#define XKB_KEY_Armenian_at 0x1000568 /* U+0568 ARMENIAN SMALL LETTER ET */ +#define XKB_KEY_Armenian_TO 0x1000539 /* U+0539 ARMENIAN CAPITAL LETTER TO */ +#define XKB_KEY_Armenian_to 0x1000569 /* U+0569 ARMENIAN SMALL LETTER TO */ +#define XKB_KEY_Armenian_ZHE 0x100053a /* U+053A ARMENIAN CAPITAL LETTER ZHE */ +#define XKB_KEY_Armenian_zhe 0x100056a /* U+056A ARMENIAN SMALL LETTER ZHE */ +#define XKB_KEY_Armenian_INI 0x100053b /* U+053B ARMENIAN CAPITAL LETTER INI */ +#define XKB_KEY_Armenian_ini 0x100056b /* U+056B ARMENIAN SMALL LETTER INI */ +#define XKB_KEY_Armenian_LYUN 0x100053c /* U+053C ARMENIAN CAPITAL LETTER LIWN */ +#define XKB_KEY_Armenian_lyun 0x100056c /* U+056C ARMENIAN SMALL LETTER LIWN */ +#define XKB_KEY_Armenian_KHE 0x100053d /* U+053D ARMENIAN CAPITAL LETTER XEH */ +#define XKB_KEY_Armenian_khe 0x100056d /* U+056D ARMENIAN SMALL LETTER XEH */ +#define XKB_KEY_Armenian_TSA 0x100053e /* U+053E ARMENIAN CAPITAL LETTER CA */ +#define XKB_KEY_Armenian_tsa 0x100056e /* U+056E ARMENIAN SMALL LETTER CA */ +#define XKB_KEY_Armenian_KEN 0x100053f /* U+053F ARMENIAN CAPITAL LETTER KEN */ +#define XKB_KEY_Armenian_ken 0x100056f /* U+056F ARMENIAN SMALL LETTER KEN */ +#define XKB_KEY_Armenian_HO 0x1000540 /* U+0540 ARMENIAN CAPITAL LETTER HO */ +#define XKB_KEY_Armenian_ho 0x1000570 /* U+0570 ARMENIAN SMALL LETTER HO */ +#define XKB_KEY_Armenian_DZA 0x1000541 /* U+0541 ARMENIAN CAPITAL LETTER JA */ +#define XKB_KEY_Armenian_dza 0x1000571 /* U+0571 ARMENIAN SMALL LETTER JA */ +#define XKB_KEY_Armenian_GHAT 0x1000542 /* U+0542 ARMENIAN CAPITAL LETTER GHAD */ +#define XKB_KEY_Armenian_ghat 0x1000572 /* U+0572 ARMENIAN SMALL LETTER GHAD */ +#define XKB_KEY_Armenian_TCHE 0x1000543 /* U+0543 ARMENIAN CAPITAL LETTER CHEH */ +#define XKB_KEY_Armenian_tche 0x1000573 /* U+0573 ARMENIAN SMALL LETTER CHEH */ +#define XKB_KEY_Armenian_MEN 0x1000544 /* U+0544 ARMENIAN CAPITAL LETTER MEN */ +#define XKB_KEY_Armenian_men 0x1000574 /* U+0574 ARMENIAN SMALL LETTER MEN */ +#define XKB_KEY_Armenian_HI 0x1000545 /* U+0545 ARMENIAN CAPITAL LETTER YI */ +#define XKB_KEY_Armenian_hi 0x1000575 /* U+0575 ARMENIAN SMALL LETTER YI */ +#define XKB_KEY_Armenian_NU 0x1000546 /* U+0546 ARMENIAN CAPITAL LETTER NOW */ +#define XKB_KEY_Armenian_nu 0x1000576 /* U+0576 ARMENIAN SMALL LETTER NOW */ +#define XKB_KEY_Armenian_SHA 0x1000547 /* U+0547 ARMENIAN CAPITAL LETTER SHA */ +#define XKB_KEY_Armenian_sha 0x1000577 /* U+0577 ARMENIAN SMALL LETTER SHA */ +#define XKB_KEY_Armenian_VO 0x1000548 /* U+0548 ARMENIAN CAPITAL LETTER VO */ +#define XKB_KEY_Armenian_vo 0x1000578 /* U+0578 ARMENIAN SMALL LETTER VO */ +#define XKB_KEY_Armenian_CHA 0x1000549 /* U+0549 ARMENIAN CAPITAL LETTER CHA */ +#define XKB_KEY_Armenian_cha 0x1000579 /* U+0579 ARMENIAN SMALL LETTER CHA */ +#define XKB_KEY_Armenian_PE 0x100054a /* U+054A ARMENIAN CAPITAL LETTER PEH */ +#define XKB_KEY_Armenian_pe 0x100057a /* U+057A ARMENIAN SMALL LETTER PEH */ +#define XKB_KEY_Armenian_JE 0x100054b /* U+054B ARMENIAN CAPITAL LETTER JHEH */ +#define XKB_KEY_Armenian_je 0x100057b /* U+057B ARMENIAN SMALL LETTER JHEH */ +#define XKB_KEY_Armenian_RA 0x100054c /* U+054C ARMENIAN CAPITAL LETTER RA */ +#define XKB_KEY_Armenian_ra 0x100057c /* U+057C ARMENIAN SMALL LETTER RA */ +#define XKB_KEY_Armenian_SE 0x100054d /* U+054D ARMENIAN CAPITAL LETTER SEH */ +#define XKB_KEY_Armenian_se 0x100057d /* U+057D ARMENIAN SMALL LETTER SEH */ +#define XKB_KEY_Armenian_VEV 0x100054e /* U+054E ARMENIAN CAPITAL LETTER VEW */ +#define XKB_KEY_Armenian_vev 0x100057e /* U+057E ARMENIAN SMALL LETTER VEW */ +#define XKB_KEY_Armenian_TYUN 0x100054f /* U+054F ARMENIAN CAPITAL LETTER TIWN */ +#define XKB_KEY_Armenian_tyun 0x100057f /* U+057F ARMENIAN SMALL LETTER TIWN */ +#define XKB_KEY_Armenian_RE 0x1000550 /* U+0550 ARMENIAN CAPITAL LETTER REH */ +#define XKB_KEY_Armenian_re 0x1000580 /* U+0580 ARMENIAN SMALL LETTER REH */ +#define XKB_KEY_Armenian_TSO 0x1000551 /* U+0551 ARMENIAN CAPITAL LETTER CO */ +#define XKB_KEY_Armenian_tso 0x1000581 /* U+0581 ARMENIAN SMALL LETTER CO */ +#define XKB_KEY_Armenian_VYUN 0x1000552 /* U+0552 ARMENIAN CAPITAL LETTER YIWN */ +#define XKB_KEY_Armenian_vyun 0x1000582 /* U+0582 ARMENIAN SMALL LETTER YIWN */ +#define XKB_KEY_Armenian_PYUR 0x1000553 /* U+0553 ARMENIAN CAPITAL LETTER PIWR */ +#define XKB_KEY_Armenian_pyur 0x1000583 /* U+0583 ARMENIAN SMALL LETTER PIWR */ +#define XKB_KEY_Armenian_KE 0x1000554 /* U+0554 ARMENIAN CAPITAL LETTER KEH */ +#define XKB_KEY_Armenian_ke 0x1000584 /* U+0584 ARMENIAN SMALL LETTER KEH */ +#define XKB_KEY_Armenian_O 0x1000555 /* U+0555 ARMENIAN CAPITAL LETTER OH */ +#define XKB_KEY_Armenian_o 0x1000585 /* U+0585 ARMENIAN SMALL LETTER OH */ +#define XKB_KEY_Armenian_FE 0x1000556 /* U+0556 ARMENIAN CAPITAL LETTER FEH */ +#define XKB_KEY_Armenian_fe 0x1000586 /* U+0586 ARMENIAN SMALL LETTER FEH */ +#define XKB_KEY_Armenian_apostrophe 0x100055a /* U+055A ARMENIAN APOSTROPHE */ + +/* + * Georgian + */ + +#define XKB_KEY_Georgian_an 0x10010d0 /* U+10D0 GEORGIAN LETTER AN */ +#define XKB_KEY_Georgian_ban 0x10010d1 /* U+10D1 GEORGIAN LETTER BAN */ +#define XKB_KEY_Georgian_gan 0x10010d2 /* U+10D2 GEORGIAN LETTER GAN */ +#define XKB_KEY_Georgian_don 0x10010d3 /* U+10D3 GEORGIAN LETTER DON */ +#define XKB_KEY_Georgian_en 0x10010d4 /* U+10D4 GEORGIAN LETTER EN */ +#define XKB_KEY_Georgian_vin 0x10010d5 /* U+10D5 GEORGIAN LETTER VIN */ +#define XKB_KEY_Georgian_zen 0x10010d6 /* U+10D6 GEORGIAN LETTER ZEN */ +#define XKB_KEY_Georgian_tan 0x10010d7 /* U+10D7 GEORGIAN LETTER TAN */ +#define XKB_KEY_Georgian_in 0x10010d8 /* U+10D8 GEORGIAN LETTER IN */ +#define XKB_KEY_Georgian_kan 0x10010d9 /* U+10D9 GEORGIAN LETTER KAN */ +#define XKB_KEY_Georgian_las 0x10010da /* U+10DA GEORGIAN LETTER LAS */ +#define XKB_KEY_Georgian_man 0x10010db /* U+10DB GEORGIAN LETTER MAN */ +#define XKB_KEY_Georgian_nar 0x10010dc /* U+10DC GEORGIAN LETTER NAR */ +#define XKB_KEY_Georgian_on 0x10010dd /* U+10DD GEORGIAN LETTER ON */ +#define XKB_KEY_Georgian_par 0x10010de /* U+10DE GEORGIAN LETTER PAR */ +#define XKB_KEY_Georgian_zhar 0x10010df /* U+10DF GEORGIAN LETTER ZHAR */ +#define XKB_KEY_Georgian_rae 0x10010e0 /* U+10E0 GEORGIAN LETTER RAE */ +#define XKB_KEY_Georgian_san 0x10010e1 /* U+10E1 GEORGIAN LETTER SAN */ +#define XKB_KEY_Georgian_tar 0x10010e2 /* U+10E2 GEORGIAN LETTER TAR */ +#define XKB_KEY_Georgian_un 0x10010e3 /* U+10E3 GEORGIAN LETTER UN */ +#define XKB_KEY_Georgian_phar 0x10010e4 /* U+10E4 GEORGIAN LETTER PHAR */ +#define XKB_KEY_Georgian_khar 0x10010e5 /* U+10E5 GEORGIAN LETTER KHAR */ +#define XKB_KEY_Georgian_ghan 0x10010e6 /* U+10E6 GEORGIAN LETTER GHAN */ +#define XKB_KEY_Georgian_qar 0x10010e7 /* U+10E7 GEORGIAN LETTER QAR */ +#define XKB_KEY_Georgian_shin 0x10010e8 /* U+10E8 GEORGIAN LETTER SHIN */ +#define XKB_KEY_Georgian_chin 0x10010e9 /* U+10E9 GEORGIAN LETTER CHIN */ +#define XKB_KEY_Georgian_can 0x10010ea /* U+10EA GEORGIAN LETTER CAN */ +#define XKB_KEY_Georgian_jil 0x10010eb /* U+10EB GEORGIAN LETTER JIL */ +#define XKB_KEY_Georgian_cil 0x10010ec /* U+10EC GEORGIAN LETTER CIL */ +#define XKB_KEY_Georgian_char 0x10010ed /* U+10ED GEORGIAN LETTER CHAR */ +#define XKB_KEY_Georgian_xan 0x10010ee /* U+10EE GEORGIAN LETTER XAN */ +#define XKB_KEY_Georgian_jhan 0x10010ef /* U+10EF GEORGIAN LETTER JHAN */ +#define XKB_KEY_Georgian_hae 0x10010f0 /* U+10F0 GEORGIAN LETTER HAE */ +#define XKB_KEY_Georgian_he 0x10010f1 /* U+10F1 GEORGIAN LETTER HE */ +#define XKB_KEY_Georgian_hie 0x10010f2 /* U+10F2 GEORGIAN LETTER HIE */ +#define XKB_KEY_Georgian_we 0x10010f3 /* U+10F3 GEORGIAN LETTER WE */ +#define XKB_KEY_Georgian_har 0x10010f4 /* U+10F4 GEORGIAN LETTER HAR */ +#define XKB_KEY_Georgian_hoe 0x10010f5 /* U+10F5 GEORGIAN LETTER HOE */ +#define XKB_KEY_Georgian_fi 0x10010f6 /* U+10F6 GEORGIAN LETTER FI */ + +/* + * Azeri (and other Turkic or Caucasian languages) + */ + +/* latin */ +#define XKB_KEY_Xabovedot 0x1001e8a /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */ +#define XKB_KEY_Ibreve 0x100012c /* U+012C LATIN CAPITAL LETTER I WITH BREVE */ +#define XKB_KEY_Zstroke 0x10001b5 /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */ +#define XKB_KEY_Gcaron 0x10001e6 /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */ +#define XKB_KEY_Ocaron 0x10001d1 /* U+01D1 LATIN CAPITAL LETTER O WITH CARON */ +#define XKB_KEY_Obarred 0x100019f /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ +#define XKB_KEY_xabovedot 0x1001e8b /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */ +#define XKB_KEY_ibreve 0x100012d /* U+012D LATIN SMALL LETTER I WITH BREVE */ +#define XKB_KEY_zstroke 0x10001b6 /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */ +#define XKB_KEY_gcaron 0x10001e7 /* U+01E7 LATIN SMALL LETTER G WITH CARON */ +#define XKB_KEY_ocaron 0x10001d2 /* U+01D2 LATIN SMALL LETTER O WITH CARON */ +#define XKB_KEY_obarred 0x1000275 /* U+0275 LATIN SMALL LETTER BARRED O */ +#define XKB_KEY_SCHWA 0x100018f /* U+018F LATIN CAPITAL LETTER SCHWA */ +#define XKB_KEY_schwa 0x1000259 /* U+0259 LATIN SMALL LETTER SCHWA */ +#define XKB_KEY_EZH 0x10001b7 /* U+01B7 LATIN CAPITAL LETTER EZH */ +#define XKB_KEY_ezh 0x1000292 /* U+0292 LATIN SMALL LETTER EZH */ +/* those are not really Caucasus */ +/* For Inupiak */ +#define XKB_KEY_Lbelowdot 0x1001e36 /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */ +#define XKB_KEY_lbelowdot 0x1001e37 /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */ + +/* + * Vietnamese + */ + +#define XKB_KEY_Abelowdot 0x1001ea0 /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */ +#define XKB_KEY_abelowdot 0x1001ea1 /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */ +#define XKB_KEY_Ahook 0x1001ea2 /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */ +#define XKB_KEY_ahook 0x1001ea3 /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */ +#define XKB_KEY_Acircumflexacute 0x1001ea4 /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_acircumflexacute 0x1001ea5 /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_Acircumflexgrave 0x1001ea6 /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_acircumflexgrave 0x1001ea7 /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_Acircumflexhook 0x1001ea8 /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_acircumflexhook 0x1001ea9 /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_Acircumflextilde 0x1001eaa /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_acircumflextilde 0x1001eab /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_Acircumflexbelowdot 0x1001eac /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_acircumflexbelowdot 0x1001ead /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_Abreveacute 0x1001eae /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ +#define XKB_KEY_abreveacute 0x1001eaf /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */ +#define XKB_KEY_Abrevegrave 0x1001eb0 /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ +#define XKB_KEY_abrevegrave 0x1001eb1 /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */ +#define XKB_KEY_Abrevehook 0x1001eb2 /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ +#define XKB_KEY_abrevehook 0x1001eb3 /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */ +#define XKB_KEY_Abrevetilde 0x1001eb4 /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ +#define XKB_KEY_abrevetilde 0x1001eb5 /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */ +#define XKB_KEY_Abrevebelowdot 0x1001eb6 /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ +#define XKB_KEY_abrevebelowdot 0x1001eb7 /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */ +#define XKB_KEY_Ebelowdot 0x1001eb8 /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */ +#define XKB_KEY_ebelowdot 0x1001eb9 /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */ +#define XKB_KEY_Ehook 0x1001eba /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */ +#define XKB_KEY_ehook 0x1001ebb /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */ +#define XKB_KEY_Etilde 0x1001ebc /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */ +#define XKB_KEY_etilde 0x1001ebd /* U+1EBD LATIN SMALL LETTER E WITH TILDE */ +#define XKB_KEY_Ecircumflexacute 0x1001ebe /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_ecircumflexacute 0x1001ebf /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_Ecircumflexgrave 0x1001ec0 /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_ecircumflexgrave 0x1001ec1 /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_Ecircumflexhook 0x1001ec2 /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_ecircumflexhook 0x1001ec3 /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_Ecircumflextilde 0x1001ec4 /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_ecircumflextilde 0x1001ec5 /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_Ecircumflexbelowdot 0x1001ec6 /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_ecircumflexbelowdot 0x1001ec7 /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_Ihook 0x1001ec8 /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */ +#define XKB_KEY_ihook 0x1001ec9 /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */ +#define XKB_KEY_Ibelowdot 0x1001eca /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */ +#define XKB_KEY_ibelowdot 0x1001ecb /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */ +#define XKB_KEY_Obelowdot 0x1001ecc /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */ +#define XKB_KEY_obelowdot 0x1001ecd /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */ +#define XKB_KEY_Ohook 0x1001ece /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */ +#define XKB_KEY_ohook 0x1001ecf /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */ +#define XKB_KEY_Ocircumflexacute 0x1001ed0 /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_ocircumflexacute 0x1001ed1 /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_Ocircumflexgrave 0x1001ed2 /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_ocircumflexgrave 0x1001ed3 /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_Ocircumflexhook 0x1001ed4 /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_ocircumflexhook 0x1001ed5 /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_Ocircumflextilde 0x1001ed6 /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_ocircumflextilde 0x1001ed7 /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_Ocircumflexbelowdot 0x1001ed8 /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_ocircumflexbelowdot 0x1001ed9 /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_Ohornacute 0x1001eda /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ +#define XKB_KEY_ohornacute 0x1001edb /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */ +#define XKB_KEY_Ohorngrave 0x1001edc /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ +#define XKB_KEY_ohorngrave 0x1001edd /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */ +#define XKB_KEY_Ohornhook 0x1001ede /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ +#define XKB_KEY_ohornhook 0x1001edf /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */ +#define XKB_KEY_Ohorntilde 0x1001ee0 /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */ +#define XKB_KEY_ohorntilde 0x1001ee1 /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */ +#define XKB_KEY_Ohornbelowdot 0x1001ee2 /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ +#define XKB_KEY_ohornbelowdot 0x1001ee3 /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */ +#define XKB_KEY_Ubelowdot 0x1001ee4 /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */ +#define XKB_KEY_ubelowdot 0x1001ee5 /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */ +#define XKB_KEY_Uhook 0x1001ee6 /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */ +#define XKB_KEY_uhook 0x1001ee7 /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */ +#define XKB_KEY_Uhornacute 0x1001ee8 /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ +#define XKB_KEY_uhornacute 0x1001ee9 /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */ +#define XKB_KEY_Uhorngrave 0x1001eea /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ +#define XKB_KEY_uhorngrave 0x1001eeb /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */ +#define XKB_KEY_Uhornhook 0x1001eec /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ +#define XKB_KEY_uhornhook 0x1001eed /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */ +#define XKB_KEY_Uhorntilde 0x1001eee /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */ +#define XKB_KEY_uhorntilde 0x1001eef /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */ +#define XKB_KEY_Uhornbelowdot 0x1001ef0 /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ +#define XKB_KEY_uhornbelowdot 0x1001ef1 /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */ +#define XKB_KEY_Ybelowdot 0x1001ef4 /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */ +#define XKB_KEY_ybelowdot 0x1001ef5 /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */ +#define XKB_KEY_Yhook 0x1001ef6 /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ +#define XKB_KEY_yhook 0x1001ef7 /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */ +#define XKB_KEY_Ytilde 0x1001ef8 /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */ +#define XKB_KEY_ytilde 0x1001ef9 /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */ +#define XKB_KEY_Ohorn 0x10001a0 /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */ +#define XKB_KEY_ohorn 0x10001a1 /* U+01A1 LATIN SMALL LETTER O WITH HORN */ +#define XKB_KEY_Uhorn 0x10001af /* U+01AF LATIN CAPITAL LETTER U WITH HORN */ +#define XKB_KEY_uhorn 0x10001b0 /* U+01B0 LATIN SMALL LETTER U WITH HORN */ +#define XKB_KEY_combining_tilde 0x1000303 /* U+0303 COMBINING TILDE */ +#define XKB_KEY_combining_grave 0x1000300 /* U+0300 COMBINING GRAVE ACCENT */ +#define XKB_KEY_combining_acute 0x1000301 /* U+0301 COMBINING ACUTE ACCENT */ +#define XKB_KEY_combining_hook 0x1000309 /* U+0309 COMBINING HOOK ABOVE */ +#define XKB_KEY_combining_belowdot 0x1000323 /* U+0323 COMBINING DOT BELOW */ + + +#define XKB_KEY_EcuSign 0x10020a0 /* U+20A0 EURO-CURRENCY SIGN */ +#define XKB_KEY_ColonSign 0x10020a1 /* U+20A1 COLON SIGN */ +#define XKB_KEY_CruzeiroSign 0x10020a2 /* U+20A2 CRUZEIRO SIGN */ +#define XKB_KEY_FFrancSign 0x10020a3 /* U+20A3 FRENCH FRANC SIGN */ +#define XKB_KEY_LiraSign 0x10020a4 /* U+20A4 LIRA SIGN */ +#define XKB_KEY_MillSign 0x10020a5 /* U+20A5 MILL SIGN */ +#define XKB_KEY_NairaSign 0x10020a6 /* U+20A6 NAIRA SIGN */ +#define XKB_KEY_PesetaSign 0x10020a7 /* U+20A7 PESETA SIGN */ +#define XKB_KEY_RupeeSign 0x10020a8 /* U+20A8 RUPEE SIGN */ +#define XKB_KEY_WonSign 0x10020a9 /* U+20A9 WON SIGN */ +#define XKB_KEY_NewSheqelSign 0x10020aa /* U+20AA NEW SHEQEL SIGN */ +#define XKB_KEY_DongSign 0x10020ab /* U+20AB DONG SIGN */ +#define XKB_KEY_EuroSign 0x20ac /* U+20AC EURO SIGN */ + +/* one, two and three are defined above. */ +#define XKB_KEY_zerosuperior 0x1002070 /* U+2070 SUPERSCRIPT ZERO */ +#define XKB_KEY_foursuperior 0x1002074 /* U+2074 SUPERSCRIPT FOUR */ +#define XKB_KEY_fivesuperior 0x1002075 /* U+2075 SUPERSCRIPT FIVE */ +#define XKB_KEY_sixsuperior 0x1002076 /* U+2076 SUPERSCRIPT SIX */ +#define XKB_KEY_sevensuperior 0x1002077 /* U+2077 SUPERSCRIPT SEVEN */ +#define XKB_KEY_eightsuperior 0x1002078 /* U+2078 SUPERSCRIPT EIGHT */ +#define XKB_KEY_ninesuperior 0x1002079 /* U+2079 SUPERSCRIPT NINE */ +#define XKB_KEY_zerosubscript 0x1002080 /* U+2080 SUBSCRIPT ZERO */ +#define XKB_KEY_onesubscript 0x1002081 /* U+2081 SUBSCRIPT ONE */ +#define XKB_KEY_twosubscript 0x1002082 /* U+2082 SUBSCRIPT TWO */ +#define XKB_KEY_threesubscript 0x1002083 /* U+2083 SUBSCRIPT THREE */ +#define XKB_KEY_foursubscript 0x1002084 /* U+2084 SUBSCRIPT FOUR */ +#define XKB_KEY_fivesubscript 0x1002085 /* U+2085 SUBSCRIPT FIVE */ +#define XKB_KEY_sixsubscript 0x1002086 /* U+2086 SUBSCRIPT SIX */ +#define XKB_KEY_sevensubscript 0x1002087 /* U+2087 SUBSCRIPT SEVEN */ +#define XKB_KEY_eightsubscript 0x1002088 /* U+2088 SUBSCRIPT EIGHT */ +#define XKB_KEY_ninesubscript 0x1002089 /* U+2089 SUBSCRIPT NINE */ +#define XKB_KEY_partdifferential 0x1002202 /* U+2202 PARTIAL DIFFERENTIAL */ +#define XKB_KEY_emptyset 0x1002205 /* U+2205 NULL SET */ +#define XKB_KEY_elementof 0x1002208 /* U+2208 ELEMENT OF */ +#define XKB_KEY_notelementof 0x1002209 /* U+2209 NOT AN ELEMENT OF */ +#define XKB_KEY_containsas 0x100220B /* U+220B CONTAINS AS MEMBER */ +#define XKB_KEY_squareroot 0x100221A /* U+221A SQUARE ROOT */ +#define XKB_KEY_cuberoot 0x100221B /* U+221B CUBE ROOT */ +#define XKB_KEY_fourthroot 0x100221C /* U+221C FOURTH ROOT */ +#define XKB_KEY_dintegral 0x100222C /* U+222C DOUBLE INTEGRAL */ +#define XKB_KEY_tintegral 0x100222D /* U+222D TRIPLE INTEGRAL */ +#define XKB_KEY_because 0x1002235 /* U+2235 BECAUSE */ +#define XKB_KEY_approxeq 0x1002248 /*(U+2248 ALMOST EQUAL TO)*/ +#define XKB_KEY_notapproxeq 0x1002247 /*(U+2247 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO)*/ +#define XKB_KEY_notidentical 0x1002262 /* U+2262 NOT IDENTICAL TO */ +#define XKB_KEY_stricteq 0x1002263 /* U+2263 STRICTLY EQUIVALENT TO */ + +#define XKB_KEY_braille_dot_1 0xfff1 +#define XKB_KEY_braille_dot_2 0xfff2 +#define XKB_KEY_braille_dot_3 0xfff3 +#define XKB_KEY_braille_dot_4 0xfff4 +#define XKB_KEY_braille_dot_5 0xfff5 +#define XKB_KEY_braille_dot_6 0xfff6 +#define XKB_KEY_braille_dot_7 0xfff7 +#define XKB_KEY_braille_dot_8 0xfff8 +#define XKB_KEY_braille_dot_9 0xfff9 +#define XKB_KEY_braille_dot_10 0xfffa +#define XKB_KEY_braille_blank 0x1002800 /* U+2800 BRAILLE PATTERN BLANK */ +#define XKB_KEY_braille_dots_1 0x1002801 /* U+2801 BRAILLE PATTERN DOTS-1 */ +#define XKB_KEY_braille_dots_2 0x1002802 /* U+2802 BRAILLE PATTERN DOTS-2 */ +#define XKB_KEY_braille_dots_12 0x1002803 /* U+2803 BRAILLE PATTERN DOTS-12 */ +#define XKB_KEY_braille_dots_3 0x1002804 /* U+2804 BRAILLE PATTERN DOTS-3 */ +#define XKB_KEY_braille_dots_13 0x1002805 /* U+2805 BRAILLE PATTERN DOTS-13 */ +#define XKB_KEY_braille_dots_23 0x1002806 /* U+2806 BRAILLE PATTERN DOTS-23 */ +#define XKB_KEY_braille_dots_123 0x1002807 /* U+2807 BRAILLE PATTERN DOTS-123 */ +#define XKB_KEY_braille_dots_4 0x1002808 /* U+2808 BRAILLE PATTERN DOTS-4 */ +#define XKB_KEY_braille_dots_14 0x1002809 /* U+2809 BRAILLE PATTERN DOTS-14 */ +#define XKB_KEY_braille_dots_24 0x100280a /* U+280a BRAILLE PATTERN DOTS-24 */ +#define XKB_KEY_braille_dots_124 0x100280b /* U+280b BRAILLE PATTERN DOTS-124 */ +#define XKB_KEY_braille_dots_34 0x100280c /* U+280c BRAILLE PATTERN DOTS-34 */ +#define XKB_KEY_braille_dots_134 0x100280d /* U+280d BRAILLE PATTERN DOTS-134 */ +#define XKB_KEY_braille_dots_234 0x100280e /* U+280e BRAILLE PATTERN DOTS-234 */ +#define XKB_KEY_braille_dots_1234 0x100280f /* U+280f BRAILLE PATTERN DOTS-1234 */ +#define XKB_KEY_braille_dots_5 0x1002810 /* U+2810 BRAILLE PATTERN DOTS-5 */ +#define XKB_KEY_braille_dots_15 0x1002811 /* U+2811 BRAILLE PATTERN DOTS-15 */ +#define XKB_KEY_braille_dots_25 0x1002812 /* U+2812 BRAILLE PATTERN DOTS-25 */ +#define XKB_KEY_braille_dots_125 0x1002813 /* U+2813 BRAILLE PATTERN DOTS-125 */ +#define XKB_KEY_braille_dots_35 0x1002814 /* U+2814 BRAILLE PATTERN DOTS-35 */ +#define XKB_KEY_braille_dots_135 0x1002815 /* U+2815 BRAILLE PATTERN DOTS-135 */ +#define XKB_KEY_braille_dots_235 0x1002816 /* U+2816 BRAILLE PATTERN DOTS-235 */ +#define XKB_KEY_braille_dots_1235 0x1002817 /* U+2817 BRAILLE PATTERN DOTS-1235 */ +#define XKB_KEY_braille_dots_45 0x1002818 /* U+2818 BRAILLE PATTERN DOTS-45 */ +#define XKB_KEY_braille_dots_145 0x1002819 /* U+2819 BRAILLE PATTERN DOTS-145 */ +#define XKB_KEY_braille_dots_245 0x100281a /* U+281a BRAILLE PATTERN DOTS-245 */ +#define XKB_KEY_braille_dots_1245 0x100281b /* U+281b BRAILLE PATTERN DOTS-1245 */ +#define XKB_KEY_braille_dots_345 0x100281c /* U+281c BRAILLE PATTERN DOTS-345 */ +#define XKB_KEY_braille_dots_1345 0x100281d /* U+281d BRAILLE PATTERN DOTS-1345 */ +#define XKB_KEY_braille_dots_2345 0x100281e /* U+281e BRAILLE PATTERN DOTS-2345 */ +#define XKB_KEY_braille_dots_12345 0x100281f /* U+281f BRAILLE PATTERN DOTS-12345 */ +#define XKB_KEY_braille_dots_6 0x1002820 /* U+2820 BRAILLE PATTERN DOTS-6 */ +#define XKB_KEY_braille_dots_16 0x1002821 /* U+2821 BRAILLE PATTERN DOTS-16 */ +#define XKB_KEY_braille_dots_26 0x1002822 /* U+2822 BRAILLE PATTERN DOTS-26 */ +#define XKB_KEY_braille_dots_126 0x1002823 /* U+2823 BRAILLE PATTERN DOTS-126 */ +#define XKB_KEY_braille_dots_36 0x1002824 /* U+2824 BRAILLE PATTERN DOTS-36 */ +#define XKB_KEY_braille_dots_136 0x1002825 /* U+2825 BRAILLE PATTERN DOTS-136 */ +#define XKB_KEY_braille_dots_236 0x1002826 /* U+2826 BRAILLE PATTERN DOTS-236 */ +#define XKB_KEY_braille_dots_1236 0x1002827 /* U+2827 BRAILLE PATTERN DOTS-1236 */ +#define XKB_KEY_braille_dots_46 0x1002828 /* U+2828 BRAILLE PATTERN DOTS-46 */ +#define XKB_KEY_braille_dots_146 0x1002829 /* U+2829 BRAILLE PATTERN DOTS-146 */ +#define XKB_KEY_braille_dots_246 0x100282a /* U+282a BRAILLE PATTERN DOTS-246 */ +#define XKB_KEY_braille_dots_1246 0x100282b /* U+282b BRAILLE PATTERN DOTS-1246 */ +#define XKB_KEY_braille_dots_346 0x100282c /* U+282c BRAILLE PATTERN DOTS-346 */ +#define XKB_KEY_braille_dots_1346 0x100282d /* U+282d BRAILLE PATTERN DOTS-1346 */ +#define XKB_KEY_braille_dots_2346 0x100282e /* U+282e BRAILLE PATTERN DOTS-2346 */ +#define XKB_KEY_braille_dots_12346 0x100282f /* U+282f BRAILLE PATTERN DOTS-12346 */ +#define XKB_KEY_braille_dots_56 0x1002830 /* U+2830 BRAILLE PATTERN DOTS-56 */ +#define XKB_KEY_braille_dots_156 0x1002831 /* U+2831 BRAILLE PATTERN DOTS-156 */ +#define XKB_KEY_braille_dots_256 0x1002832 /* U+2832 BRAILLE PATTERN DOTS-256 */ +#define XKB_KEY_braille_dots_1256 0x1002833 /* U+2833 BRAILLE PATTERN DOTS-1256 */ +#define XKB_KEY_braille_dots_356 0x1002834 /* U+2834 BRAILLE PATTERN DOTS-356 */ +#define XKB_KEY_braille_dots_1356 0x1002835 /* U+2835 BRAILLE PATTERN DOTS-1356 */ +#define XKB_KEY_braille_dots_2356 0x1002836 /* U+2836 BRAILLE PATTERN DOTS-2356 */ +#define XKB_KEY_braille_dots_12356 0x1002837 /* U+2837 BRAILLE PATTERN DOTS-12356 */ +#define XKB_KEY_braille_dots_456 0x1002838 /* U+2838 BRAILLE PATTERN DOTS-456 */ +#define XKB_KEY_braille_dots_1456 0x1002839 /* U+2839 BRAILLE PATTERN DOTS-1456 */ +#define XKB_KEY_braille_dots_2456 0x100283a /* U+283a BRAILLE PATTERN DOTS-2456 */ +#define XKB_KEY_braille_dots_12456 0x100283b /* U+283b BRAILLE PATTERN DOTS-12456 */ +#define XKB_KEY_braille_dots_3456 0x100283c /* U+283c BRAILLE PATTERN DOTS-3456 */ +#define XKB_KEY_braille_dots_13456 0x100283d /* U+283d BRAILLE PATTERN DOTS-13456 */ +#define XKB_KEY_braille_dots_23456 0x100283e /* U+283e BRAILLE PATTERN DOTS-23456 */ +#define XKB_KEY_braille_dots_123456 0x100283f /* U+283f BRAILLE PATTERN DOTS-123456 */ +#define XKB_KEY_braille_dots_7 0x1002840 /* U+2840 BRAILLE PATTERN DOTS-7 */ +#define XKB_KEY_braille_dots_17 0x1002841 /* U+2841 BRAILLE PATTERN DOTS-17 */ +#define XKB_KEY_braille_dots_27 0x1002842 /* U+2842 BRAILLE PATTERN DOTS-27 */ +#define XKB_KEY_braille_dots_127 0x1002843 /* U+2843 BRAILLE PATTERN DOTS-127 */ +#define XKB_KEY_braille_dots_37 0x1002844 /* U+2844 BRAILLE PATTERN DOTS-37 */ +#define XKB_KEY_braille_dots_137 0x1002845 /* U+2845 BRAILLE PATTERN DOTS-137 */ +#define XKB_KEY_braille_dots_237 0x1002846 /* U+2846 BRAILLE PATTERN DOTS-237 */ +#define XKB_KEY_braille_dots_1237 0x1002847 /* U+2847 BRAILLE PATTERN DOTS-1237 */ +#define XKB_KEY_braille_dots_47 0x1002848 /* U+2848 BRAILLE PATTERN DOTS-47 */ +#define XKB_KEY_braille_dots_147 0x1002849 /* U+2849 BRAILLE PATTERN DOTS-147 */ +#define XKB_KEY_braille_dots_247 0x100284a /* U+284a BRAILLE PATTERN DOTS-247 */ +#define XKB_KEY_braille_dots_1247 0x100284b /* U+284b BRAILLE PATTERN DOTS-1247 */ +#define XKB_KEY_braille_dots_347 0x100284c /* U+284c BRAILLE PATTERN DOTS-347 */ +#define XKB_KEY_braille_dots_1347 0x100284d /* U+284d BRAILLE PATTERN DOTS-1347 */ +#define XKB_KEY_braille_dots_2347 0x100284e /* U+284e BRAILLE PATTERN DOTS-2347 */ +#define XKB_KEY_braille_dots_12347 0x100284f /* U+284f BRAILLE PATTERN DOTS-12347 */ +#define XKB_KEY_braille_dots_57 0x1002850 /* U+2850 BRAILLE PATTERN DOTS-57 */ +#define XKB_KEY_braille_dots_157 0x1002851 /* U+2851 BRAILLE PATTERN DOTS-157 */ +#define XKB_KEY_braille_dots_257 0x1002852 /* U+2852 BRAILLE PATTERN DOTS-257 */ +#define XKB_KEY_braille_dots_1257 0x1002853 /* U+2853 BRAILLE PATTERN DOTS-1257 */ +#define XKB_KEY_braille_dots_357 0x1002854 /* U+2854 BRAILLE PATTERN DOTS-357 */ +#define XKB_KEY_braille_dots_1357 0x1002855 /* U+2855 BRAILLE PATTERN DOTS-1357 */ +#define XKB_KEY_braille_dots_2357 0x1002856 /* U+2856 BRAILLE PATTERN DOTS-2357 */ +#define XKB_KEY_braille_dots_12357 0x1002857 /* U+2857 BRAILLE PATTERN DOTS-12357 */ +#define XKB_KEY_braille_dots_457 0x1002858 /* U+2858 BRAILLE PATTERN DOTS-457 */ +#define XKB_KEY_braille_dots_1457 0x1002859 /* U+2859 BRAILLE PATTERN DOTS-1457 */ +#define XKB_KEY_braille_dots_2457 0x100285a /* U+285a BRAILLE PATTERN DOTS-2457 */ +#define XKB_KEY_braille_dots_12457 0x100285b /* U+285b BRAILLE PATTERN DOTS-12457 */ +#define XKB_KEY_braille_dots_3457 0x100285c /* U+285c BRAILLE PATTERN DOTS-3457 */ +#define XKB_KEY_braille_dots_13457 0x100285d /* U+285d BRAILLE PATTERN DOTS-13457 */ +#define XKB_KEY_braille_dots_23457 0x100285e /* U+285e BRAILLE PATTERN DOTS-23457 */ +#define XKB_KEY_braille_dots_123457 0x100285f /* U+285f BRAILLE PATTERN DOTS-123457 */ +#define XKB_KEY_braille_dots_67 0x1002860 /* U+2860 BRAILLE PATTERN DOTS-67 */ +#define XKB_KEY_braille_dots_167 0x1002861 /* U+2861 BRAILLE PATTERN DOTS-167 */ +#define XKB_KEY_braille_dots_267 0x1002862 /* U+2862 BRAILLE PATTERN DOTS-267 */ +#define XKB_KEY_braille_dots_1267 0x1002863 /* U+2863 BRAILLE PATTERN DOTS-1267 */ +#define XKB_KEY_braille_dots_367 0x1002864 /* U+2864 BRAILLE PATTERN DOTS-367 */ +#define XKB_KEY_braille_dots_1367 0x1002865 /* U+2865 BRAILLE PATTERN DOTS-1367 */ +#define XKB_KEY_braille_dots_2367 0x1002866 /* U+2866 BRAILLE PATTERN DOTS-2367 */ +#define XKB_KEY_braille_dots_12367 0x1002867 /* U+2867 BRAILLE PATTERN DOTS-12367 */ +#define XKB_KEY_braille_dots_467 0x1002868 /* U+2868 BRAILLE PATTERN DOTS-467 */ +#define XKB_KEY_braille_dots_1467 0x1002869 /* U+2869 BRAILLE PATTERN DOTS-1467 */ +#define XKB_KEY_braille_dots_2467 0x100286a /* U+286a BRAILLE PATTERN DOTS-2467 */ +#define XKB_KEY_braille_dots_12467 0x100286b /* U+286b BRAILLE PATTERN DOTS-12467 */ +#define XKB_KEY_braille_dots_3467 0x100286c /* U+286c BRAILLE PATTERN DOTS-3467 */ +#define XKB_KEY_braille_dots_13467 0x100286d /* U+286d BRAILLE PATTERN DOTS-13467 */ +#define XKB_KEY_braille_dots_23467 0x100286e /* U+286e BRAILLE PATTERN DOTS-23467 */ +#define XKB_KEY_braille_dots_123467 0x100286f /* U+286f BRAILLE PATTERN DOTS-123467 */ +#define XKB_KEY_braille_dots_567 0x1002870 /* U+2870 BRAILLE PATTERN DOTS-567 */ +#define XKB_KEY_braille_dots_1567 0x1002871 /* U+2871 BRAILLE PATTERN DOTS-1567 */ +#define XKB_KEY_braille_dots_2567 0x1002872 /* U+2872 BRAILLE PATTERN DOTS-2567 */ +#define XKB_KEY_braille_dots_12567 0x1002873 /* U+2873 BRAILLE PATTERN DOTS-12567 */ +#define XKB_KEY_braille_dots_3567 0x1002874 /* U+2874 BRAILLE PATTERN DOTS-3567 */ +#define XKB_KEY_braille_dots_13567 0x1002875 /* U+2875 BRAILLE PATTERN DOTS-13567 */ +#define XKB_KEY_braille_dots_23567 0x1002876 /* U+2876 BRAILLE PATTERN DOTS-23567 */ +#define XKB_KEY_braille_dots_123567 0x1002877 /* U+2877 BRAILLE PATTERN DOTS-123567 */ +#define XKB_KEY_braille_dots_4567 0x1002878 /* U+2878 BRAILLE PATTERN DOTS-4567 */ +#define XKB_KEY_braille_dots_14567 0x1002879 /* U+2879 BRAILLE PATTERN DOTS-14567 */ +#define XKB_KEY_braille_dots_24567 0x100287a /* U+287a BRAILLE PATTERN DOTS-24567 */ +#define XKB_KEY_braille_dots_124567 0x100287b /* U+287b BRAILLE PATTERN DOTS-124567 */ +#define XKB_KEY_braille_dots_34567 0x100287c /* U+287c BRAILLE PATTERN DOTS-34567 */ +#define XKB_KEY_braille_dots_134567 0x100287d /* U+287d BRAILLE PATTERN DOTS-134567 */ +#define XKB_KEY_braille_dots_234567 0x100287e /* U+287e BRAILLE PATTERN DOTS-234567 */ +#define XKB_KEY_braille_dots_1234567 0x100287f /* U+287f BRAILLE PATTERN DOTS-1234567 */ +#define XKB_KEY_braille_dots_8 0x1002880 /* U+2880 BRAILLE PATTERN DOTS-8 */ +#define XKB_KEY_braille_dots_18 0x1002881 /* U+2881 BRAILLE PATTERN DOTS-18 */ +#define XKB_KEY_braille_dots_28 0x1002882 /* U+2882 BRAILLE PATTERN DOTS-28 */ +#define XKB_KEY_braille_dots_128 0x1002883 /* U+2883 BRAILLE PATTERN DOTS-128 */ +#define XKB_KEY_braille_dots_38 0x1002884 /* U+2884 BRAILLE PATTERN DOTS-38 */ +#define XKB_KEY_braille_dots_138 0x1002885 /* U+2885 BRAILLE PATTERN DOTS-138 */ +#define XKB_KEY_braille_dots_238 0x1002886 /* U+2886 BRAILLE PATTERN DOTS-238 */ +#define XKB_KEY_braille_dots_1238 0x1002887 /* U+2887 BRAILLE PATTERN DOTS-1238 */ +#define XKB_KEY_braille_dots_48 0x1002888 /* U+2888 BRAILLE PATTERN DOTS-48 */ +#define XKB_KEY_braille_dots_148 0x1002889 /* U+2889 BRAILLE PATTERN DOTS-148 */ +#define XKB_KEY_braille_dots_248 0x100288a /* U+288a BRAILLE PATTERN DOTS-248 */ +#define XKB_KEY_braille_dots_1248 0x100288b /* U+288b BRAILLE PATTERN DOTS-1248 */ +#define XKB_KEY_braille_dots_348 0x100288c /* U+288c BRAILLE PATTERN DOTS-348 */ +#define XKB_KEY_braille_dots_1348 0x100288d /* U+288d BRAILLE PATTERN DOTS-1348 */ +#define XKB_KEY_braille_dots_2348 0x100288e /* U+288e BRAILLE PATTERN DOTS-2348 */ +#define XKB_KEY_braille_dots_12348 0x100288f /* U+288f BRAILLE PATTERN DOTS-12348 */ +#define XKB_KEY_braille_dots_58 0x1002890 /* U+2890 BRAILLE PATTERN DOTS-58 */ +#define XKB_KEY_braille_dots_158 0x1002891 /* U+2891 BRAILLE PATTERN DOTS-158 */ +#define XKB_KEY_braille_dots_258 0x1002892 /* U+2892 BRAILLE PATTERN DOTS-258 */ +#define XKB_KEY_braille_dots_1258 0x1002893 /* U+2893 BRAILLE PATTERN DOTS-1258 */ +#define XKB_KEY_braille_dots_358 0x1002894 /* U+2894 BRAILLE PATTERN DOTS-358 */ +#define XKB_KEY_braille_dots_1358 0x1002895 /* U+2895 BRAILLE PATTERN DOTS-1358 */ +#define XKB_KEY_braille_dots_2358 0x1002896 /* U+2896 BRAILLE PATTERN DOTS-2358 */ +#define XKB_KEY_braille_dots_12358 0x1002897 /* U+2897 BRAILLE PATTERN DOTS-12358 */ +#define XKB_KEY_braille_dots_458 0x1002898 /* U+2898 BRAILLE PATTERN DOTS-458 */ +#define XKB_KEY_braille_dots_1458 0x1002899 /* U+2899 BRAILLE PATTERN DOTS-1458 */ +#define XKB_KEY_braille_dots_2458 0x100289a /* U+289a BRAILLE PATTERN DOTS-2458 */ +#define XKB_KEY_braille_dots_12458 0x100289b /* U+289b BRAILLE PATTERN DOTS-12458 */ +#define XKB_KEY_braille_dots_3458 0x100289c /* U+289c BRAILLE PATTERN DOTS-3458 */ +#define XKB_KEY_braille_dots_13458 0x100289d /* U+289d BRAILLE PATTERN DOTS-13458 */ +#define XKB_KEY_braille_dots_23458 0x100289e /* U+289e BRAILLE PATTERN DOTS-23458 */ +#define XKB_KEY_braille_dots_123458 0x100289f /* U+289f BRAILLE PATTERN DOTS-123458 */ +#define XKB_KEY_braille_dots_68 0x10028a0 /* U+28a0 BRAILLE PATTERN DOTS-68 */ +#define XKB_KEY_braille_dots_168 0x10028a1 /* U+28a1 BRAILLE PATTERN DOTS-168 */ +#define XKB_KEY_braille_dots_268 0x10028a2 /* U+28a2 BRAILLE PATTERN DOTS-268 */ +#define XKB_KEY_braille_dots_1268 0x10028a3 /* U+28a3 BRAILLE PATTERN DOTS-1268 */ +#define XKB_KEY_braille_dots_368 0x10028a4 /* U+28a4 BRAILLE PATTERN DOTS-368 */ +#define XKB_KEY_braille_dots_1368 0x10028a5 /* U+28a5 BRAILLE PATTERN DOTS-1368 */ +#define XKB_KEY_braille_dots_2368 0x10028a6 /* U+28a6 BRAILLE PATTERN DOTS-2368 */ +#define XKB_KEY_braille_dots_12368 0x10028a7 /* U+28a7 BRAILLE PATTERN DOTS-12368 */ +#define XKB_KEY_braille_dots_468 0x10028a8 /* U+28a8 BRAILLE PATTERN DOTS-468 */ +#define XKB_KEY_braille_dots_1468 0x10028a9 /* U+28a9 BRAILLE PATTERN DOTS-1468 */ +#define XKB_KEY_braille_dots_2468 0x10028aa /* U+28aa BRAILLE PATTERN DOTS-2468 */ +#define XKB_KEY_braille_dots_12468 0x10028ab /* U+28ab BRAILLE PATTERN DOTS-12468 */ +#define XKB_KEY_braille_dots_3468 0x10028ac /* U+28ac BRAILLE PATTERN DOTS-3468 */ +#define XKB_KEY_braille_dots_13468 0x10028ad /* U+28ad BRAILLE PATTERN DOTS-13468 */ +#define XKB_KEY_braille_dots_23468 0x10028ae /* U+28ae BRAILLE PATTERN DOTS-23468 */ +#define XKB_KEY_braille_dots_123468 0x10028af /* U+28af BRAILLE PATTERN DOTS-123468 */ +#define XKB_KEY_braille_dots_568 0x10028b0 /* U+28b0 BRAILLE PATTERN DOTS-568 */ +#define XKB_KEY_braille_dots_1568 0x10028b1 /* U+28b1 BRAILLE PATTERN DOTS-1568 */ +#define XKB_KEY_braille_dots_2568 0x10028b2 /* U+28b2 BRAILLE PATTERN DOTS-2568 */ +#define XKB_KEY_braille_dots_12568 0x10028b3 /* U+28b3 BRAILLE PATTERN DOTS-12568 */ +#define XKB_KEY_braille_dots_3568 0x10028b4 /* U+28b4 BRAILLE PATTERN DOTS-3568 */ +#define XKB_KEY_braille_dots_13568 0x10028b5 /* U+28b5 BRAILLE PATTERN DOTS-13568 */ +#define XKB_KEY_braille_dots_23568 0x10028b6 /* U+28b6 BRAILLE PATTERN DOTS-23568 */ +#define XKB_KEY_braille_dots_123568 0x10028b7 /* U+28b7 BRAILLE PATTERN DOTS-123568 */ +#define XKB_KEY_braille_dots_4568 0x10028b8 /* U+28b8 BRAILLE PATTERN DOTS-4568 */ +#define XKB_KEY_braille_dots_14568 0x10028b9 /* U+28b9 BRAILLE PATTERN DOTS-14568 */ +#define XKB_KEY_braille_dots_24568 0x10028ba /* U+28ba BRAILLE PATTERN DOTS-24568 */ +#define XKB_KEY_braille_dots_124568 0x10028bb /* U+28bb BRAILLE PATTERN DOTS-124568 */ +#define XKB_KEY_braille_dots_34568 0x10028bc /* U+28bc BRAILLE PATTERN DOTS-34568 */ +#define XKB_KEY_braille_dots_134568 0x10028bd /* U+28bd BRAILLE PATTERN DOTS-134568 */ +#define XKB_KEY_braille_dots_234568 0x10028be /* U+28be BRAILLE PATTERN DOTS-234568 */ +#define XKB_KEY_braille_dots_1234568 0x10028bf /* U+28bf BRAILLE PATTERN DOTS-1234568 */ +#define XKB_KEY_braille_dots_78 0x10028c0 /* U+28c0 BRAILLE PATTERN DOTS-78 */ +#define XKB_KEY_braille_dots_178 0x10028c1 /* U+28c1 BRAILLE PATTERN DOTS-178 */ +#define XKB_KEY_braille_dots_278 0x10028c2 /* U+28c2 BRAILLE PATTERN DOTS-278 */ +#define XKB_KEY_braille_dots_1278 0x10028c3 /* U+28c3 BRAILLE PATTERN DOTS-1278 */ +#define XKB_KEY_braille_dots_378 0x10028c4 /* U+28c4 BRAILLE PATTERN DOTS-378 */ +#define XKB_KEY_braille_dots_1378 0x10028c5 /* U+28c5 BRAILLE PATTERN DOTS-1378 */ +#define XKB_KEY_braille_dots_2378 0x10028c6 /* U+28c6 BRAILLE PATTERN DOTS-2378 */ +#define XKB_KEY_braille_dots_12378 0x10028c7 /* U+28c7 BRAILLE PATTERN DOTS-12378 */ +#define XKB_KEY_braille_dots_478 0x10028c8 /* U+28c8 BRAILLE PATTERN DOTS-478 */ +#define XKB_KEY_braille_dots_1478 0x10028c9 /* U+28c9 BRAILLE PATTERN DOTS-1478 */ +#define XKB_KEY_braille_dots_2478 0x10028ca /* U+28ca BRAILLE PATTERN DOTS-2478 */ +#define XKB_KEY_braille_dots_12478 0x10028cb /* U+28cb BRAILLE PATTERN DOTS-12478 */ +#define XKB_KEY_braille_dots_3478 0x10028cc /* U+28cc BRAILLE PATTERN DOTS-3478 */ +#define XKB_KEY_braille_dots_13478 0x10028cd /* U+28cd BRAILLE PATTERN DOTS-13478 */ +#define XKB_KEY_braille_dots_23478 0x10028ce /* U+28ce BRAILLE PATTERN DOTS-23478 */ +#define XKB_KEY_braille_dots_123478 0x10028cf /* U+28cf BRAILLE PATTERN DOTS-123478 */ +#define XKB_KEY_braille_dots_578 0x10028d0 /* U+28d0 BRAILLE PATTERN DOTS-578 */ +#define XKB_KEY_braille_dots_1578 0x10028d1 /* U+28d1 BRAILLE PATTERN DOTS-1578 */ +#define XKB_KEY_braille_dots_2578 0x10028d2 /* U+28d2 BRAILLE PATTERN DOTS-2578 */ +#define XKB_KEY_braille_dots_12578 0x10028d3 /* U+28d3 BRAILLE PATTERN DOTS-12578 */ +#define XKB_KEY_braille_dots_3578 0x10028d4 /* U+28d4 BRAILLE PATTERN DOTS-3578 */ +#define XKB_KEY_braille_dots_13578 0x10028d5 /* U+28d5 BRAILLE PATTERN DOTS-13578 */ +#define XKB_KEY_braille_dots_23578 0x10028d6 /* U+28d6 BRAILLE PATTERN DOTS-23578 */ +#define XKB_KEY_braille_dots_123578 0x10028d7 /* U+28d7 BRAILLE PATTERN DOTS-123578 */ +#define XKB_KEY_braille_dots_4578 0x10028d8 /* U+28d8 BRAILLE PATTERN DOTS-4578 */ +#define XKB_KEY_braille_dots_14578 0x10028d9 /* U+28d9 BRAILLE PATTERN DOTS-14578 */ +#define XKB_KEY_braille_dots_24578 0x10028da /* U+28da BRAILLE PATTERN DOTS-24578 */ +#define XKB_KEY_braille_dots_124578 0x10028db /* U+28db BRAILLE PATTERN DOTS-124578 */ +#define XKB_KEY_braille_dots_34578 0x10028dc /* U+28dc BRAILLE PATTERN DOTS-34578 */ +#define XKB_KEY_braille_dots_134578 0x10028dd /* U+28dd BRAILLE PATTERN DOTS-134578 */ +#define XKB_KEY_braille_dots_234578 0x10028de /* U+28de BRAILLE PATTERN DOTS-234578 */ +#define XKB_KEY_braille_dots_1234578 0x10028df /* U+28df BRAILLE PATTERN DOTS-1234578 */ +#define XKB_KEY_braille_dots_678 0x10028e0 /* U+28e0 BRAILLE PATTERN DOTS-678 */ +#define XKB_KEY_braille_dots_1678 0x10028e1 /* U+28e1 BRAILLE PATTERN DOTS-1678 */ +#define XKB_KEY_braille_dots_2678 0x10028e2 /* U+28e2 BRAILLE PATTERN DOTS-2678 */ +#define XKB_KEY_braille_dots_12678 0x10028e3 /* U+28e3 BRAILLE PATTERN DOTS-12678 */ +#define XKB_KEY_braille_dots_3678 0x10028e4 /* U+28e4 BRAILLE PATTERN DOTS-3678 */ +#define XKB_KEY_braille_dots_13678 0x10028e5 /* U+28e5 BRAILLE PATTERN DOTS-13678 */ +#define XKB_KEY_braille_dots_23678 0x10028e6 /* U+28e6 BRAILLE PATTERN DOTS-23678 */ +#define XKB_KEY_braille_dots_123678 0x10028e7 /* U+28e7 BRAILLE PATTERN DOTS-123678 */ +#define XKB_KEY_braille_dots_4678 0x10028e8 /* U+28e8 BRAILLE PATTERN DOTS-4678 */ +#define XKB_KEY_braille_dots_14678 0x10028e9 /* U+28e9 BRAILLE PATTERN DOTS-14678 */ +#define XKB_KEY_braille_dots_24678 0x10028ea /* U+28ea BRAILLE PATTERN DOTS-24678 */ +#define XKB_KEY_braille_dots_124678 0x10028eb /* U+28eb BRAILLE PATTERN DOTS-124678 */ +#define XKB_KEY_braille_dots_34678 0x10028ec /* U+28ec BRAILLE PATTERN DOTS-34678 */ +#define XKB_KEY_braille_dots_134678 0x10028ed /* U+28ed BRAILLE PATTERN DOTS-134678 */ +#define XKB_KEY_braille_dots_234678 0x10028ee /* U+28ee BRAILLE PATTERN DOTS-234678 */ +#define XKB_KEY_braille_dots_1234678 0x10028ef /* U+28ef BRAILLE PATTERN DOTS-1234678 */ +#define XKB_KEY_braille_dots_5678 0x10028f0 /* U+28f0 BRAILLE PATTERN DOTS-5678 */ +#define XKB_KEY_braille_dots_15678 0x10028f1 /* U+28f1 BRAILLE PATTERN DOTS-15678 */ +#define XKB_KEY_braille_dots_25678 0x10028f2 /* U+28f2 BRAILLE PATTERN DOTS-25678 */ +#define XKB_KEY_braille_dots_125678 0x10028f3 /* U+28f3 BRAILLE PATTERN DOTS-125678 */ +#define XKB_KEY_braille_dots_35678 0x10028f4 /* U+28f4 BRAILLE PATTERN DOTS-35678 */ +#define XKB_KEY_braille_dots_135678 0x10028f5 /* U+28f5 BRAILLE PATTERN DOTS-135678 */ +#define XKB_KEY_braille_dots_235678 0x10028f6 /* U+28f6 BRAILLE PATTERN DOTS-235678 */ +#define XKB_KEY_braille_dots_1235678 0x10028f7 /* U+28f7 BRAILLE PATTERN DOTS-1235678 */ +#define XKB_KEY_braille_dots_45678 0x10028f8 /* U+28f8 BRAILLE PATTERN DOTS-45678 */ +#define XKB_KEY_braille_dots_145678 0x10028f9 /* U+28f9 BRAILLE PATTERN DOTS-145678 */ +#define XKB_KEY_braille_dots_245678 0x10028fa /* U+28fa BRAILLE PATTERN DOTS-245678 */ +#define XKB_KEY_braille_dots_1245678 0x10028fb /* U+28fb BRAILLE PATTERN DOTS-1245678 */ +#define XKB_KEY_braille_dots_345678 0x10028fc /* U+28fc BRAILLE PATTERN DOTS-345678 */ +#define XKB_KEY_braille_dots_1345678 0x10028fd /* U+28fd BRAILLE PATTERN DOTS-1345678 */ +#define XKB_KEY_braille_dots_2345678 0x10028fe /* U+28fe BRAILLE PATTERN DOTS-2345678 */ +#define XKB_KEY_braille_dots_12345678 0x10028ff /* U+28ff BRAILLE PATTERN DOTS-12345678 */ + +/* + * Sinhala (http://unicode.org/charts/PDF/U0D80.pdf) + * http://www.nongnu.org/sinhala/doc/transliteration/sinhala-transliteration_6.html + */ + +#define XKB_KEY_Sinh_ng 0x1000d82 /* U+0D82 SINHALA ANUSVARAYA */ +#define XKB_KEY_Sinh_h2 0x1000d83 /* U+0D83 SINHALA VISARGAYA */ +#define XKB_KEY_Sinh_a 0x1000d85 /* U+0D85 SINHALA AYANNA */ +#define XKB_KEY_Sinh_aa 0x1000d86 /* U+0D86 SINHALA AAYANNA */ +#define XKB_KEY_Sinh_ae 0x1000d87 /* U+0D87 SINHALA AEYANNA */ +#define XKB_KEY_Sinh_aee 0x1000d88 /* U+0D88 SINHALA AEEYANNA */ +#define XKB_KEY_Sinh_i 0x1000d89 /* U+0D89 SINHALA IYANNA */ +#define XKB_KEY_Sinh_ii 0x1000d8a /* U+0D8A SINHALA IIYANNA */ +#define XKB_KEY_Sinh_u 0x1000d8b /* U+0D8B SINHALA UYANNA */ +#define XKB_KEY_Sinh_uu 0x1000d8c /* U+0D8C SINHALA UUYANNA */ +#define XKB_KEY_Sinh_ri 0x1000d8d /* U+0D8D SINHALA IRUYANNA */ +#define XKB_KEY_Sinh_rii 0x1000d8e /* U+0D8E SINHALA IRUUYANNA */ +#define XKB_KEY_Sinh_lu 0x1000d8f /* U+0D8F SINHALA ILUYANNA */ +#define XKB_KEY_Sinh_luu 0x1000d90 /* U+0D90 SINHALA ILUUYANNA */ +#define XKB_KEY_Sinh_e 0x1000d91 /* U+0D91 SINHALA EYANNA */ +#define XKB_KEY_Sinh_ee 0x1000d92 /* U+0D92 SINHALA EEYANNA */ +#define XKB_KEY_Sinh_ai 0x1000d93 /* U+0D93 SINHALA AIYANNA */ +#define XKB_KEY_Sinh_o 0x1000d94 /* U+0D94 SINHALA OYANNA */ +#define XKB_KEY_Sinh_oo 0x1000d95 /* U+0D95 SINHALA OOYANNA */ +#define XKB_KEY_Sinh_au 0x1000d96 /* U+0D96 SINHALA AUYANNA */ +#define XKB_KEY_Sinh_ka 0x1000d9a /* U+0D9A SINHALA KAYANNA */ +#define XKB_KEY_Sinh_kha 0x1000d9b /* U+0D9B SINHALA MAHA. KAYANNA */ +#define XKB_KEY_Sinh_ga 0x1000d9c /* U+0D9C SINHALA GAYANNA */ +#define XKB_KEY_Sinh_gha 0x1000d9d /* U+0D9D SINHALA MAHA. GAYANNA */ +#define XKB_KEY_Sinh_ng2 0x1000d9e /* U+0D9E SINHALA KANTAJA NAASIKYAYA */ +#define XKB_KEY_Sinh_nga 0x1000d9f /* U+0D9F SINHALA SANYAKA GAYANNA */ +#define XKB_KEY_Sinh_ca 0x1000da0 /* U+0DA0 SINHALA CAYANNA */ +#define XKB_KEY_Sinh_cha 0x1000da1 /* U+0DA1 SINHALA MAHA. CAYANNA */ +#define XKB_KEY_Sinh_ja 0x1000da2 /* U+0DA2 SINHALA JAYANNA */ +#define XKB_KEY_Sinh_jha 0x1000da3 /* U+0DA3 SINHALA MAHA. JAYANNA */ +#define XKB_KEY_Sinh_nya 0x1000da4 /* U+0DA4 SINHALA TAALUJA NAASIKYAYA */ +#define XKB_KEY_Sinh_jnya 0x1000da5 /* U+0DA5 SINHALA TAALUJA SANYOOGA NAASIKYAYA */ +#define XKB_KEY_Sinh_nja 0x1000da6 /* U+0DA6 SINHALA SANYAKA JAYANNA */ +#define XKB_KEY_Sinh_tta 0x1000da7 /* U+0DA7 SINHALA TTAYANNA */ +#define XKB_KEY_Sinh_ttha 0x1000da8 /* U+0DA8 SINHALA MAHA. TTAYANNA */ +#define XKB_KEY_Sinh_dda 0x1000da9 /* U+0DA9 SINHALA DDAYANNA */ +#define XKB_KEY_Sinh_ddha 0x1000daa /* U+0DAA SINHALA MAHA. DDAYANNA */ +#define XKB_KEY_Sinh_nna 0x1000dab /* U+0DAB SINHALA MUURDHAJA NAYANNA */ +#define XKB_KEY_Sinh_ndda 0x1000dac /* U+0DAC SINHALA SANYAKA DDAYANNA */ +#define XKB_KEY_Sinh_tha 0x1000dad /* U+0DAD SINHALA TAYANNA */ +#define XKB_KEY_Sinh_thha 0x1000dae /* U+0DAE SINHALA MAHA. TAYANNA */ +#define XKB_KEY_Sinh_dha 0x1000daf /* U+0DAF SINHALA DAYANNA */ +#define XKB_KEY_Sinh_dhha 0x1000db0 /* U+0DB0 SINHALA MAHA. DAYANNA */ +#define XKB_KEY_Sinh_na 0x1000db1 /* U+0DB1 SINHALA DANTAJA NAYANNA */ +#define XKB_KEY_Sinh_ndha 0x1000db3 /* U+0DB3 SINHALA SANYAKA DAYANNA */ +#define XKB_KEY_Sinh_pa 0x1000db4 /* U+0DB4 SINHALA PAYANNA */ +#define XKB_KEY_Sinh_pha 0x1000db5 /* U+0DB5 SINHALA MAHA. PAYANNA */ +#define XKB_KEY_Sinh_ba 0x1000db6 /* U+0DB6 SINHALA BAYANNA */ +#define XKB_KEY_Sinh_bha 0x1000db7 /* U+0DB7 SINHALA MAHA. BAYANNA */ +#define XKB_KEY_Sinh_ma 0x1000db8 /* U+0DB8 SINHALA MAYANNA */ +#define XKB_KEY_Sinh_mba 0x1000db9 /* U+0DB9 SINHALA AMBA BAYANNA */ +#define XKB_KEY_Sinh_ya 0x1000dba /* U+0DBA SINHALA YAYANNA */ +#define XKB_KEY_Sinh_ra 0x1000dbb /* U+0DBB SINHALA RAYANNA */ +#define XKB_KEY_Sinh_la 0x1000dbd /* U+0DBD SINHALA DANTAJA LAYANNA */ +#define XKB_KEY_Sinh_va 0x1000dc0 /* U+0DC0 SINHALA VAYANNA */ +#define XKB_KEY_Sinh_sha 0x1000dc1 /* U+0DC1 SINHALA TAALUJA SAYANNA */ +#define XKB_KEY_Sinh_ssha 0x1000dc2 /* U+0DC2 SINHALA MUURDHAJA SAYANNA */ +#define XKB_KEY_Sinh_sa 0x1000dc3 /* U+0DC3 SINHALA DANTAJA SAYANNA */ +#define XKB_KEY_Sinh_ha 0x1000dc4 /* U+0DC4 SINHALA HAYANNA */ +#define XKB_KEY_Sinh_lla 0x1000dc5 /* U+0DC5 SINHALA MUURDHAJA LAYANNA */ +#define XKB_KEY_Sinh_fa 0x1000dc6 /* U+0DC6 SINHALA FAYANNA */ +#define XKB_KEY_Sinh_al 0x1000dca /* U+0DCA SINHALA AL-LAKUNA */ +#define XKB_KEY_Sinh_aa2 0x1000dcf /* U+0DCF SINHALA AELA-PILLA */ +#define XKB_KEY_Sinh_ae2 0x1000dd0 /* U+0DD0 SINHALA AEDA-PILLA */ +#define XKB_KEY_Sinh_aee2 0x1000dd1 /* U+0DD1 SINHALA DIGA AEDA-PILLA */ +#define XKB_KEY_Sinh_i2 0x1000dd2 /* U+0DD2 SINHALA IS-PILLA */ +#define XKB_KEY_Sinh_ii2 0x1000dd3 /* U+0DD3 SINHALA DIGA IS-PILLA */ +#define XKB_KEY_Sinh_u2 0x1000dd4 /* U+0DD4 SINHALA PAA-PILLA */ +#define XKB_KEY_Sinh_uu2 0x1000dd6 /* U+0DD6 SINHALA DIGA PAA-PILLA */ +#define XKB_KEY_Sinh_ru2 0x1000dd8 /* U+0DD8 SINHALA GAETTA-PILLA */ +#define XKB_KEY_Sinh_e2 0x1000dd9 /* U+0DD9 SINHALA KOMBUVA */ +#define XKB_KEY_Sinh_ee2 0x1000dda /* U+0DDA SINHALA DIGA KOMBUVA */ +#define XKB_KEY_Sinh_ai2 0x1000ddb /* U+0DDB SINHALA KOMBU DEKA */ +#define XKB_KEY_Sinh_o2 0x1000ddc /* U+0DDC SINHALA KOMBUVA HAA AELA-PILLA*/ +#define XKB_KEY_Sinh_oo2 0x1000ddd /* U+0DDD SINHALA KOMBUVA HAA DIGA AELA-PILLA*/ +#define XKB_KEY_Sinh_au2 0x1000dde /* U+0DDE SINHALA KOMBUVA HAA GAYANUKITTA */ +#define XKB_KEY_Sinh_lu2 0x1000ddf /* U+0DDF SINHALA GAYANUKITTA */ +#define XKB_KEY_Sinh_ruu2 0x1000df2 /* U+0DF2 SINHALA DIGA GAETTA-PILLA */ +#define XKB_KEY_Sinh_luu2 0x1000df3 /* U+0DF3 SINHALA DIGA GAYANUKITTA */ +#define XKB_KEY_Sinh_kunddaliya 0x1000df4 /* U+0DF4 SINHALA KUNDDALIYA */ +/* + * XFree86 vendor specific keysyms. + * + * The XFree86 keysym range is 0x10080001 - 0x1008FFFF. + * + * The XF86 set of keysyms is a catch-all set of defines for keysyms found + * on various multimedia keyboards. Originally specific to XFree86 they have + * been been adopted over time and are considered a "standard" part of X + * keysym definitions. + * XFree86 never properly commented these keysyms, so we have done our + * best to explain the semantic meaning of these keys. + * + * XFree86 has removed their mail archives of the period, that might have + * shed more light on some of these definitions. Until/unless we resurrect + * these archives, these are from memory and usage. + */ + +/* + * ModeLock + * + * This one is old, and not really used any more since XKB offers this + * functionality. + */ + +#define XKB_KEY_XF86ModeLock 0x1008FF01 /* Mode Switch Lock */ + +/* Backlight controls. */ +#define XKB_KEY_XF86MonBrightnessUp 0x1008FF02 /* Monitor/panel brightness */ +#define XKB_KEY_XF86MonBrightnessDown 0x1008FF03 /* Monitor/panel brightness */ +#define XKB_KEY_XF86KbdLightOnOff 0x1008FF04 /* Keyboards may be lit */ +#define XKB_KEY_XF86KbdBrightnessUp 0x1008FF05 /* Keyboards may be lit */ +#define XKB_KEY_XF86KbdBrightnessDown 0x1008FF06 /* Keyboards may be lit */ +#define XKB_KEY_XF86MonBrightnessCycle 0x1008FF07 /* Monitor/panel brightness */ + +/* + * Keys found on some "Internet" keyboards. + */ +#define XKB_KEY_XF86Standby 0x1008FF10 /* System into standby mode */ +#define XKB_KEY_XF86AudioLowerVolume 0x1008FF11 /* Volume control down */ +#define XKB_KEY_XF86AudioMute 0x1008FF12 /* Mute sound from the system */ +#define XKB_KEY_XF86AudioRaiseVolume 0x1008FF13 /* Volume control up */ +#define XKB_KEY_XF86AudioPlay 0x1008FF14 /* Start playing of audio > */ +#define XKB_KEY_XF86AudioStop 0x1008FF15 /* Stop playing audio */ +#define XKB_KEY_XF86AudioPrev 0x1008FF16 /* Previous track */ +#define XKB_KEY_XF86AudioNext 0x1008FF17 /* Next track */ +#define XKB_KEY_XF86HomePage 0x1008FF18 /* Display user's home page */ +#define XKB_KEY_XF86Mail 0x1008FF19 /* Invoke user's mail program */ +#define XKB_KEY_XF86Start 0x1008FF1A /* Start application */ +#define XKB_KEY_XF86Search 0x1008FF1B /* Search */ +#define XKB_KEY_XF86AudioRecord 0x1008FF1C /* Record audio application */ + +/* These are sometimes found on PDA's (e.g. Palm, PocketPC or elsewhere) */ +#define XKB_KEY_XF86Calculator 0x1008FF1D /* Invoke calculator program */ +#define XKB_KEY_XF86Memo 0x1008FF1E /* Invoke Memo taking program */ +#define XKB_KEY_XF86ToDoList 0x1008FF1F /* Invoke To Do List program */ +#define XKB_KEY_XF86Calendar 0x1008FF20 /* Invoke Calendar program */ +#define XKB_KEY_XF86PowerDown 0x1008FF21 /* Deep sleep the system */ +#define XKB_KEY_XF86ContrastAdjust 0x1008FF22 /* Adjust screen contrast */ +#define XKB_KEY_XF86RockerUp 0x1008FF23 /* Rocker switches exist up */ +#define XKB_KEY_XF86RockerDown 0x1008FF24 /* and down */ +#define XKB_KEY_XF86RockerEnter 0x1008FF25 /* and let you press them */ + +/* Some more "Internet" keyboard symbols */ +#define XKB_KEY_XF86Back 0x1008FF26 /* Like back on a browser */ +#define XKB_KEY_XF86Forward 0x1008FF27 /* Like forward on a browser */ +#define XKB_KEY_XF86Stop 0x1008FF28 /* Stop current operation */ +#define XKB_KEY_XF86Refresh 0x1008FF29 /* Refresh the page */ +#define XKB_KEY_XF86PowerOff 0x1008FF2A /* Power off system entirely */ +#define XKB_KEY_XF86WakeUp 0x1008FF2B /* Wake up system from sleep */ +#define XKB_KEY_XF86Eject 0x1008FF2C /* Eject device (e.g. DVD) */ +#define XKB_KEY_XF86ScreenSaver 0x1008FF2D /* Invoke screensaver */ +#define XKB_KEY_XF86WWW 0x1008FF2E /* Invoke web browser */ +#define XKB_KEY_XF86Sleep 0x1008FF2F /* Put system to sleep */ +#define XKB_KEY_XF86Favorites 0x1008FF30 /* Show favorite locations */ +#define XKB_KEY_XF86AudioPause 0x1008FF31 /* Pause audio playing */ +#define XKB_KEY_XF86AudioMedia 0x1008FF32 /* Launch media collection app */ +#define XKB_KEY_XF86MyComputer 0x1008FF33 /* Display "My Computer" window */ +#define XKB_KEY_XF86VendorHome 0x1008FF34 /* Display vendor home web site */ +#define XKB_KEY_XF86LightBulb 0x1008FF35 /* Light bulb keys exist */ +#define XKB_KEY_XF86Shop 0x1008FF36 /* Display shopping web site */ +#define XKB_KEY_XF86History 0x1008FF37 /* Show history of web surfing */ +#define XKB_KEY_XF86OpenURL 0x1008FF38 /* Open selected URL */ +#define XKB_KEY_XF86AddFavorite 0x1008FF39 /* Add URL to favorites list */ +#define XKB_KEY_XF86HotLinks 0x1008FF3A /* Show "hot" links */ +#define XKB_KEY_XF86BrightnessAdjust 0x1008FF3B /* Invoke brightness adj. UI */ +#define XKB_KEY_XF86Finance 0x1008FF3C /* Display financial site */ +#define XKB_KEY_XF86Community 0x1008FF3D /* Display user's community */ +#define XKB_KEY_XF86AudioRewind 0x1008FF3E /* "rewind" audio track */ +#define XKB_KEY_XF86BackForward 0x1008FF3F /* ??? */ +#define XKB_KEY_XF86Launch0 0x1008FF40 /* Launch Application */ +#define XKB_KEY_XF86Launch1 0x1008FF41 /* Launch Application */ +#define XKB_KEY_XF86Launch2 0x1008FF42 /* Launch Application */ +#define XKB_KEY_XF86Launch3 0x1008FF43 /* Launch Application */ +#define XKB_KEY_XF86Launch4 0x1008FF44 /* Launch Application */ +#define XKB_KEY_XF86Launch5 0x1008FF45 /* Launch Application */ +#define XKB_KEY_XF86Launch6 0x1008FF46 /* Launch Application */ +#define XKB_KEY_XF86Launch7 0x1008FF47 /* Launch Application */ +#define XKB_KEY_XF86Launch8 0x1008FF48 /* Launch Application */ +#define XKB_KEY_XF86Launch9 0x1008FF49 /* Launch Application */ +#define XKB_KEY_XF86LaunchA 0x1008FF4A /* Launch Application */ +#define XKB_KEY_XF86LaunchB 0x1008FF4B /* Launch Application */ +#define XKB_KEY_XF86LaunchC 0x1008FF4C /* Launch Application */ +#define XKB_KEY_XF86LaunchD 0x1008FF4D /* Launch Application */ +#define XKB_KEY_XF86LaunchE 0x1008FF4E /* Launch Application */ +#define XKB_KEY_XF86LaunchF 0x1008FF4F /* Launch Application */ + +#define XKB_KEY_XF86ApplicationLeft 0x1008FF50 /* switch to application, left */ +#define XKB_KEY_XF86ApplicationRight 0x1008FF51 /* switch to application, right*/ +#define XKB_KEY_XF86Book 0x1008FF52 /* Launch bookreader */ +#define XKB_KEY_XF86CD 0x1008FF53 /* Launch CD/DVD player */ +#define XKB_KEY_XF86Calculater 0x1008FF54 /* Launch Calculater */ +#define XKB_KEY_XF86Clear 0x1008FF55 /* Clear window, screen */ +#define XKB_KEY_XF86Close 0x1008FF56 /* Close window */ +#define XKB_KEY_XF86Copy 0x1008FF57 /* Copy selection */ +#define XKB_KEY_XF86Cut 0x1008FF58 /* Cut selection */ +#define XKB_KEY_XF86Display 0x1008FF59 /* Output switch key */ +#define XKB_KEY_XF86DOS 0x1008FF5A /* Launch DOS (emulation) */ +#define XKB_KEY_XF86Documents 0x1008FF5B /* Open documents window */ +#define XKB_KEY_XF86Excel 0x1008FF5C /* Launch spread sheet */ +#define XKB_KEY_XF86Explorer 0x1008FF5D /* Launch file explorer */ +#define XKB_KEY_XF86Game 0x1008FF5E /* Launch game */ +#define XKB_KEY_XF86Go 0x1008FF5F /* Go to URL */ +#define XKB_KEY_XF86iTouch 0x1008FF60 /* Logitech iTouch- don't use */ +#define XKB_KEY_XF86LogOff 0x1008FF61 /* Log off system */ +#define XKB_KEY_XF86Market 0x1008FF62 /* ?? */ +#define XKB_KEY_XF86Meeting 0x1008FF63 /* enter meeting in calendar */ +#define XKB_KEY_XF86MenuKB 0x1008FF65 /* distinguish keyboard from PB */ +#define XKB_KEY_XF86MenuPB 0x1008FF66 /* distinguish PB from keyboard */ +#define XKB_KEY_XF86MySites 0x1008FF67 /* Favourites */ +#define XKB_KEY_XF86New 0x1008FF68 /* New (folder, document... */ +#define XKB_KEY_XF86News 0x1008FF69 /* News */ +#define XKB_KEY_XF86OfficeHome 0x1008FF6A /* Office home (old Staroffice)*/ +#define XKB_KEY_XF86Open 0x1008FF6B /* Open */ +#define XKB_KEY_XF86Option 0x1008FF6C /* ?? */ +#define XKB_KEY_XF86Paste 0x1008FF6D /* Paste */ +#define XKB_KEY_XF86Phone 0x1008FF6E /* Launch phone; dial number */ +#define XKB_KEY_XF86Q 0x1008FF70 /* Compaq's Q - don't use */ +#define XKB_KEY_XF86Reply 0x1008FF72 /* Reply e.g., mail */ +#define XKB_KEY_XF86Reload 0x1008FF73 /* Reload web page, file, etc. */ +#define XKB_KEY_XF86RotateWindows 0x1008FF74 /* Rotate windows e.g. xrandr */ +#define XKB_KEY_XF86RotationPB 0x1008FF75 /* don't use */ +#define XKB_KEY_XF86RotationKB 0x1008FF76 /* don't use */ +#define XKB_KEY_XF86Save 0x1008FF77 /* Save (file, document, state */ +#define XKB_KEY_XF86ScrollUp 0x1008FF78 /* Scroll window/contents up */ +#define XKB_KEY_XF86ScrollDown 0x1008FF79 /* Scrool window/contentd down */ +#define XKB_KEY_XF86ScrollClick 0x1008FF7A /* Use XKB mousekeys instead */ +#define XKB_KEY_XF86Send 0x1008FF7B /* Send mail, file, object */ +#define XKB_KEY_XF86Spell 0x1008FF7C /* Spell checker */ +#define XKB_KEY_XF86SplitScreen 0x1008FF7D /* Split window or screen */ +#define XKB_KEY_XF86Support 0x1008FF7E /* Get support (??) */ +#define XKB_KEY_XF86TaskPane 0x1008FF7F /* Show tasks */ +#define XKB_KEY_XF86Terminal 0x1008FF80 /* Launch terminal emulator */ +#define XKB_KEY_XF86Tools 0x1008FF81 /* toolbox of desktop/app. */ +#define XKB_KEY_XF86Travel 0x1008FF82 /* ?? */ +#define XKB_KEY_XF86UserPB 0x1008FF84 /* ?? */ +#define XKB_KEY_XF86User1KB 0x1008FF85 /* ?? */ +#define XKB_KEY_XF86User2KB 0x1008FF86 /* ?? */ +#define XKB_KEY_XF86Video 0x1008FF87 /* Launch video player */ +#define XKB_KEY_XF86WheelButton 0x1008FF88 /* button from a mouse wheel */ +#define XKB_KEY_XF86Word 0x1008FF89 /* Launch word processor */ +#define XKB_KEY_XF86Xfer 0x1008FF8A +#define XKB_KEY_XF86ZoomIn 0x1008FF8B /* zoom in view, map, etc. */ +#define XKB_KEY_XF86ZoomOut 0x1008FF8C /* zoom out view, map, etc. */ + +#define XKB_KEY_XF86Away 0x1008FF8D /* mark yourself as away */ +#define XKB_KEY_XF86Messenger 0x1008FF8E /* as in instant messaging */ +#define XKB_KEY_XF86WebCam 0x1008FF8F /* Launch web camera app. */ +#define XKB_KEY_XF86MailForward 0x1008FF90 /* Forward in mail */ +#define XKB_KEY_XF86Pictures 0x1008FF91 /* Show pictures */ +#define XKB_KEY_XF86Music 0x1008FF92 /* Launch music application */ + +#define XKB_KEY_XF86Battery 0x1008FF93 /* Display battery information */ +#define XKB_KEY_XF86Bluetooth 0x1008FF94 /* Enable/disable Bluetooth */ +#define XKB_KEY_XF86WLAN 0x1008FF95 /* Enable/disable WLAN */ +#define XKB_KEY_XF86UWB 0x1008FF96 /* Enable/disable UWB */ + +#define XKB_KEY_XF86AudioForward 0x1008FF97 /* fast-forward audio track */ +#define XKB_KEY_XF86AudioRepeat 0x1008FF98 /* toggle repeat mode */ +#define XKB_KEY_XF86AudioRandomPlay 0x1008FF99 /* toggle shuffle mode */ +#define XKB_KEY_XF86Subtitle 0x1008FF9A /* cycle through subtitle */ +#define XKB_KEY_XF86AudioCycleTrack 0x1008FF9B /* cycle through audio tracks */ +#define XKB_KEY_XF86CycleAngle 0x1008FF9C /* cycle through angles */ +#define XKB_KEY_XF86FrameBack 0x1008FF9D /* video: go one frame back */ +#define XKB_KEY_XF86FrameForward 0x1008FF9E /* video: go one frame forward */ +#define XKB_KEY_XF86Time 0x1008FF9F /* display, or shows an entry for time seeking */ +#define XKB_KEY_XF86Select 0x1008FFA0 /* Select button on joypads and remotes */ +#define XKB_KEY_XF86View 0x1008FFA1 /* Show a view options/properties */ +#define XKB_KEY_XF86TopMenu 0x1008FFA2 /* Go to a top-level menu in a video */ + +#define XKB_KEY_XF86Red 0x1008FFA3 /* Red button */ +#define XKB_KEY_XF86Green 0x1008FFA4 /* Green button */ +#define XKB_KEY_XF86Yellow 0x1008FFA5 /* Yellow button */ +#define XKB_KEY_XF86Blue 0x1008FFA6 /* Blue button */ + +#define XKB_KEY_XF86Suspend 0x1008FFA7 /* Sleep to RAM */ +#define XKB_KEY_XF86Hibernate 0x1008FFA8 /* Sleep to disk */ +#define XKB_KEY_XF86TouchpadToggle 0x1008FFA9 /* Toggle between touchpad/trackstick */ +#define XKB_KEY_XF86TouchpadOn 0x1008FFB0 /* The touchpad got switched on */ +#define XKB_KEY_XF86TouchpadOff 0x1008FFB1 /* The touchpad got switched off */ + +#define XKB_KEY_XF86AudioMicMute 0x1008FFB2 /* Mute the Mic from the system */ + +#define XKB_KEY_XF86Keyboard 0x1008FFB3 /* User defined keyboard related action */ + +#define XKB_KEY_XF86WWAN 0x1008FFB4 /* Toggle WWAN (LTE, UMTS, etc.) radio */ +#define XKB_KEY_XF86RFKill 0x1008FFB5 /* Toggle radios on/off */ + +#define XKB_KEY_XF86AudioPreset 0x1008FFB6 /* Select equalizer preset, e.g. theatre-mode */ + +#define XKB_KEY_XF86RotationLockToggle 0x1008FFB7 /* Toggle screen rotation lock on/off */ + +#define XKB_KEY_XF86FullScreen 0x1008FFB8 /* Toggle fullscreen */ + +/* Keys for special action keys (hot keys) */ +/* Virtual terminals on some operating systems */ +#define XKB_KEY_XF86Switch_VT_1 0x1008FE01 +#define XKB_KEY_XF86Switch_VT_2 0x1008FE02 +#define XKB_KEY_XF86Switch_VT_3 0x1008FE03 +#define XKB_KEY_XF86Switch_VT_4 0x1008FE04 +#define XKB_KEY_XF86Switch_VT_5 0x1008FE05 +#define XKB_KEY_XF86Switch_VT_6 0x1008FE06 +#define XKB_KEY_XF86Switch_VT_7 0x1008FE07 +#define XKB_KEY_XF86Switch_VT_8 0x1008FE08 +#define XKB_KEY_XF86Switch_VT_9 0x1008FE09 +#define XKB_KEY_XF86Switch_VT_10 0x1008FE0A +#define XKB_KEY_XF86Switch_VT_11 0x1008FE0B +#define XKB_KEY_XF86Switch_VT_12 0x1008FE0C + +#define XKB_KEY_XF86Ungrab 0x1008FE20 /* force ungrab */ +#define XKB_KEY_XF86ClearGrab 0x1008FE21 /* kill application with grab */ +#define XKB_KEY_XF86Next_VMode 0x1008FE22 /* next video mode available */ +#define XKB_KEY_XF86Prev_VMode 0x1008FE23 /* prev. video mode available */ +#define XKB_KEY_XF86LogWindowTree 0x1008FE24 /* print window tree to log */ +#define XKB_KEY_XF86LogGrabInfo 0x1008FE25 /* print all active grabs to log */ + + +/* + * Reserved range for evdev symbols: 0x10081000-0x10081FFF + * + * Key syms within this range must match the Linux kernel + * input-event-codes.h file in the format: + * XF86XK_CamelCaseKernelName _EVDEVK(kernel value) + * For example, the kernel + * #define KEY_MACRO_RECORD_START 0x2b0 + * effectively ends up as: + * #define XKB_KEY_XF86MacroRecordStart 0x100812b0 + * + * For historical reasons, some keysyms within the reserved range will be + * missing, most notably all "normal" keys that are mapped through default + * XKB layouts (e.g. KEY_Q). + * + * CamelCasing is done with a human control as last authority, e.g. see VOD + * instead of Vod for the Video on Demand key. + * + * The format for #defines is strict: + * + * #define XKB_KEY_XF86FOO_EVDEVK(0xABC) |* kver KEY_FOO *| + * + * Where + * - alignment by tabs + * - the _EVDEVK macro must be used + * - the hex code must be in uppercase hex + * - the kernel version (kver) is in the form v5.10 + * - kver and key name are within a slash-star comment (a pipe is used in + * this example for technical reasons) + * These #defines are parsed by scripts. Do not stray from the given format. + * + * Where the evdev keycode is mapped to a different symbol, please add a + * comment line starting with Use: but otherwise the same format, e.g. + * Use: XF86XK_RotationLockToggle _EVDEVK(0x231) v4.16 KEY_ROTATE_LOCK_TOGGLE + * + */ +/* Use: XF86XK_Eject _EVDEVK(0x0A2) KEY_EJECTCLOSECD */ +/* Use: XF86XK_New _EVDEVK(0x0B5) v2.6.14 KEY_NEW */ +/* Use: XK_Redo _EVDEVK(0x0B6) v2.6.14 KEY_REDO */ +/* KEY_DASHBOARD has been mapped to LaunchB in xkeyboard-config since 2011 */ +/* Use: XF86XK_LaunchB _EVDEVK(0x0CC) v2.6.28 KEY_DASHBOARD */ +/* Use: XF86XK_Display _EVDEVK(0x0E3) v2.6.12 KEY_SWITCHVIDEOMODE */ +/* Use: XF86XK_KbdLightOnOff _EVDEVK(0x0E4) v2.6.12 KEY_KBDILLUMTOGGLE */ +/* Use: XF86XK_KbdBrightnessDown _EVDEVK(0x0E5) v2.6.12 KEY_KBDILLUMDOWN */ +/* Use: XF86XK_KbdBrightnessUp _EVDEVK(0x0E6) v2.6.12 KEY_KBDILLUMUP */ +/* Use: XF86XK_Send _EVDEVK(0x0E7) v2.6.14 KEY_SEND */ +/* Use: XF86XK_Reply _EVDEVK(0x0E8) v2.6.14 KEY_REPLY */ +/* Use: XF86XK_MailForward _EVDEVK(0x0E9) v2.6.14 KEY_FORWARDMAIL */ +/* Use: XF86XK_Save _EVDEVK(0x0EA) v2.6.14 KEY_SAVE */ +/* Use: XF86XK_Documents _EVDEVK(0x0EB) v2.6.14 KEY_DOCUMENTS */ +/* Use: XF86XK_Battery _EVDEVK(0x0EC) v2.6.17 KEY_BATTERY */ +/* Use: XF86XK_Bluetooth _EVDEVK(0x0ED) v2.6.19 KEY_BLUETOOTH */ +/* Use: XF86XK_WLAN _EVDEVK(0x0EE) v2.6.19 KEY_WLAN */ +/* Use: XF86XK_UWB _EVDEVK(0x0EF) v2.6.24 KEY_UWB */ +/* Use: XF86XK_Next_VMode _EVDEVK(0x0F1) v2.6.23 KEY_VIDEO_NEXT */ +/* Use: XF86XK_Prev_VMode _EVDEVK(0x0F2) v2.6.23 KEY_VIDEO_PREV */ +/* Use: XF86XK_MonBrightnessCycle _EVDEVK(0x0F3) v2.6.23 KEY_BRIGHTNESS_CYCLE */ +#define XKB_KEY_XF86BrightnessAuto 0x100810f4 /* v3.16 KEY_BRIGHTNESS_AUTO */ +#define XKB_KEY_XF86DisplayOff 0x100810f5 /* v2.6.23 KEY_DISPLAY_OFF */ +/* Use: XF86XK_WWAN _EVDEVK(0x0F6) v3.13 KEY_WWAN */ +/* Use: XF86XK_RFKill _EVDEVK(0x0F7) v2.6.33 KEY_RFKILL */ +/* Use: XF86XK_AudioMicMute _EVDEVK(0x0F8) v3.1 KEY_MICMUTE */ +#define XKB_KEY_XF86Info 0x10081166 /* KEY_INFO */ +/* Use: XF86XK_CycleAngle _EVDEVK(0x173) KEY_ANGLE */ +/* Use: XF86XK_FullScreen _EVDEVK(0x174) v5.1 KEY_FULL_SCREEN */ +#define XKB_KEY_XF86AspectRatio 0x10081177 /* v5.1 KEY_ASPECT_RATIO */ +#define XKB_KEY_XF86DVD 0x10081185 /* KEY_DVD */ +#define XKB_KEY_XF86Audio 0x10081188 /* KEY_AUDIO */ +/* Use: XF86XK_Video _EVDEVK(0x189) KEY_VIDEO */ +/* Use: XF86XK_Calendar _EVDEVK(0x18D) KEY_CALENDAR */ +#define XKB_KEY_XF86ChannelUp 0x10081192 /* KEY_CHANNELUP */ +#define XKB_KEY_XF86ChannelDown 0x10081193 /* KEY_CHANNELDOWN */ +/* Use: XF86XK_AudioRandomPlay _EVDEVK(0x19A) KEY_SHUFFLE */ +#define XKB_KEY_XF86Break 0x1008119b /* KEY_BREAK */ +#define XKB_KEY_XF86VideoPhone 0x100811a0 /* v2.6.20 KEY_VIDEOPHONE */ +/* Use: XF86XK_Game _EVDEVK(0x1A1) v2.6.20 KEY_GAMES */ +/* Use: XF86XK_ZoomIn _EVDEVK(0x1A2) v2.6.20 KEY_ZOOMIN */ +/* Use: XF86XK_ZoomOut _EVDEVK(0x1A3) v2.6.20 KEY_ZOOMOUT */ +#define XKB_KEY_XF86ZoomReset 0x100811a4 /* v2.6.20 KEY_ZOOMRESET */ +/* Use: XF86XK_Word _EVDEVK(0x1A5) v2.6.20 KEY_WORDPROCESSOR */ +#define XKB_KEY_XF86Editor 0x100811a6 /* v2.6.20 KEY_EDITOR */ +/* Use: XF86XK_Excel _EVDEVK(0x1A7) v2.6.20 KEY_SPREADSHEET */ +#define XKB_KEY_XF86GraphicsEditor 0x100811a8 /* v2.6.20 KEY_GRAPHICSEDITOR */ +#define XKB_KEY_XF86Presentation 0x100811a9 /* v2.6.20 KEY_PRESENTATION */ +#define XKB_KEY_XF86Database 0x100811aa /* v2.6.20 KEY_DATABASE */ +/* Use: XF86XK_News _EVDEVK(0x1AB) v2.6.20 KEY_NEWS */ +#define XKB_KEY_XF86Voicemail 0x100811ac /* v2.6.20 KEY_VOICEMAIL */ +#define XKB_KEY_XF86Addressbook 0x100811ad /* v2.6.20 KEY_ADDRESSBOOK */ +/* Use: XF86XK_Messenger _EVDEVK(0x1AE) v2.6.20 KEY_MESSENGER */ +#define XKB_KEY_XF86DisplayToggle 0x100811af /* v2.6.20 KEY_DISPLAYTOGGLE */ +#define XKB_KEY_XF86SpellCheck 0x100811b0 /* v2.6.24 KEY_SPELLCHECK */ +/* Use: XF86XK_LogOff _EVDEVK(0x1B1) v2.6.24 KEY_LOGOFF */ +/* Use: XK_dollar _EVDEVK(0x1B2) v2.6.24 KEY_DOLLAR */ +/* Use: XK_EuroSign _EVDEVK(0x1B3) v2.6.24 KEY_EURO */ +/* Use: XF86XK_FrameBack _EVDEVK(0x1B4) v2.6.24 KEY_FRAMEBACK */ +/* Use: XF86XK_FrameForward _EVDEVK(0x1B5) v2.6.24 KEY_FRAMEFORWARD */ +#define XKB_KEY_XF86ContextMenu 0x100811b6 /* v2.6.24 KEY_CONTEXT_MENU */ +#define XKB_KEY_XF86MediaRepeat 0x100811b7 /* v2.6.26 KEY_MEDIA_REPEAT */ +#define XKB_KEY_XF8610ChannelsUp 0x100811b8 /* v2.6.38 KEY_10CHANNELSUP */ +#define XKB_KEY_XF8610ChannelsDown 0x100811b9 /* v2.6.38 KEY_10CHANNELSDOWN */ +#define XKB_KEY_XF86Images 0x100811ba /* v2.6.39 KEY_IMAGES */ +#define XKB_KEY_XF86NotificationCenter 0x100811bc /* v5.10 KEY_NOTIFICATION_CENTER */ +#define XKB_KEY_XF86PickupPhone 0x100811bd /* v5.10 KEY_PICKUP_PHONE */ +#define XKB_KEY_XF86HangupPhone 0x100811be /* v5.10 KEY_HANGUP_PHONE */ +#define XKB_KEY_XF86Fn 0x100811d0 /* KEY_FN */ +#define XKB_KEY_XF86Fn_Esc 0x100811d1 /* KEY_FN_ESC */ +#define XKB_KEY_XF86FnRightShift 0x100811e5 /* v5.10 KEY_FN_RIGHT_SHIFT */ +/* Use: XK_braille_dot_1 _EVDEVK(0x1F1) v2.6.17 KEY_BRL_DOT1 */ +/* Use: XK_braille_dot_2 _EVDEVK(0x1F2) v2.6.17 KEY_BRL_DOT2 */ +/* Use: XK_braille_dot_3 _EVDEVK(0x1F3) v2.6.17 KEY_BRL_DOT3 */ +/* Use: XK_braille_dot_4 _EVDEVK(0x1F4) v2.6.17 KEY_BRL_DOT4 */ +/* Use: XK_braille_dot_5 _EVDEVK(0x1F5) v2.6.17 KEY_BRL_DOT5 */ +/* Use: XK_braille_dot_6 _EVDEVK(0x1F6) v2.6.17 KEY_BRL_DOT6 */ +/* Use: XK_braille_dot_7 _EVDEVK(0x1F7) v2.6.17 KEY_BRL_DOT7 */ +/* Use: XK_braille_dot_8 _EVDEVK(0x1F8) v2.6.17 KEY_BRL_DOT8 */ +/* Use: XK_braille_dot_9 _EVDEVK(0x1F9) v2.6.23 KEY_BRL_DOT9 */ +/* Use: XK_braille_dot_1 _EVDEVK(0x1FA) v2.6.23 KEY_BRL_DOT10 */ +#define XKB_KEY_XF86Numeric0 0x10081200 /* v2.6.28 KEY_NUMERIC_0 */ +#define XKB_KEY_XF86Numeric1 0x10081201 /* v2.6.28 KEY_NUMERIC_1 */ +#define XKB_KEY_XF86Numeric2 0x10081202 /* v2.6.28 KEY_NUMERIC_2 */ +#define XKB_KEY_XF86Numeric3 0x10081203 /* v2.6.28 KEY_NUMERIC_3 */ +#define XKB_KEY_XF86Numeric4 0x10081204 /* v2.6.28 KEY_NUMERIC_4 */ +#define XKB_KEY_XF86Numeric5 0x10081205 /* v2.6.28 KEY_NUMERIC_5 */ +#define XKB_KEY_XF86Numeric6 0x10081206 /* v2.6.28 KEY_NUMERIC_6 */ +#define XKB_KEY_XF86Numeric7 0x10081207 /* v2.6.28 KEY_NUMERIC_7 */ +#define XKB_KEY_XF86Numeric8 0x10081208 /* v2.6.28 KEY_NUMERIC_8 */ +#define XKB_KEY_XF86Numeric9 0x10081209 /* v2.6.28 KEY_NUMERIC_9 */ +#define XKB_KEY_XF86NumericStar 0x1008120a /* v2.6.28 KEY_NUMERIC_STAR */ +#define XKB_KEY_XF86NumericPound 0x1008120b /* v2.6.28 KEY_NUMERIC_POUND */ +#define XKB_KEY_XF86NumericA 0x1008120c /* v4.1 KEY_NUMERIC_A */ +#define XKB_KEY_XF86NumericB 0x1008120d /* v4.1 KEY_NUMERIC_B */ +#define XKB_KEY_XF86NumericC 0x1008120e /* v4.1 KEY_NUMERIC_C */ +#define XKB_KEY_XF86NumericD 0x1008120f /* v4.1 KEY_NUMERIC_D */ +#define XKB_KEY_XF86CameraFocus 0x10081210 /* v2.6.33 KEY_CAMERA_FOCUS */ +#define XKB_KEY_XF86WPSButton 0x10081211 /* v2.6.34 KEY_WPS_BUTTON */ +/* Use: XF86XK_TouchpadToggle _EVDEVK(0x212) v2.6.37 KEY_TOUCHPAD_TOGGLE */ +/* Use: XF86XK_TouchpadOn _EVDEVK(0x213) v2.6.37 KEY_TOUCHPAD_ON */ +/* Use: XF86XK_TouchpadOff _EVDEVK(0x214) v2.6.37 KEY_TOUCHPAD_OFF */ +#define XKB_KEY_XF86CameraZoomIn 0x10081215 /* v2.6.39 KEY_CAMERA_ZOOMIN */ +#define XKB_KEY_XF86CameraZoomOut 0x10081216 /* v2.6.39 KEY_CAMERA_ZOOMOUT */ +#define XKB_KEY_XF86CameraUp 0x10081217 /* v2.6.39 KEY_CAMERA_UP */ +#define XKB_KEY_XF86CameraDown 0x10081218 /* v2.6.39 KEY_CAMERA_DOWN */ +#define XKB_KEY_XF86CameraLeft 0x10081219 /* v2.6.39 KEY_CAMERA_LEFT */ +#define XKB_KEY_XF86CameraRight 0x1008121a /* v2.6.39 KEY_CAMERA_RIGHT */ +#define XKB_KEY_XF86AttendantOn 0x1008121b /* v3.10 KEY_ATTENDANT_ON */ +#define XKB_KEY_XF86AttendantOff 0x1008121c /* v3.10 KEY_ATTENDANT_OFF */ +#define XKB_KEY_XF86AttendantToggle 0x1008121d /* v3.10 KEY_ATTENDANT_TOGGLE */ +#define XKB_KEY_XF86LightsToggle 0x1008121e /* v3.10 KEY_LIGHTS_TOGGLE */ +#define XKB_KEY_XF86ALSToggle 0x10081230 /* v3.13 KEY_ALS_TOGGLE */ +/* Use: XF86XK_RotationLockToggle _EVDEVK(0x231) v4.16 KEY_ROTATE_LOCK_TOGGLE */ +#define XKB_KEY_XF86Buttonconfig 0x10081240 /* v3.16 KEY_BUTTONCONFIG */ +#define XKB_KEY_XF86Taskmanager 0x10081241 /* v3.16 KEY_TASKMANAGER */ +#define XKB_KEY_XF86Journal 0x10081242 /* v3.16 KEY_JOURNAL */ +#define XKB_KEY_XF86ControlPanel 0x10081243 /* v3.16 KEY_CONTROLPANEL */ +#define XKB_KEY_XF86AppSelect 0x10081244 /* v3.16 KEY_APPSELECT */ +#define XKB_KEY_XF86Screensaver 0x10081245 /* v3.16 KEY_SCREENSAVER */ +#define XKB_KEY_XF86VoiceCommand 0x10081246 /* v3.16 KEY_VOICECOMMAND */ +#define XKB_KEY_XF86Assistant 0x10081247 /* v4.13 KEY_ASSISTANT */ +/* Use: XK_ISO_Next_Group _EVDEVK(0x248) v5.2 KEY_KBD_LAYOUT_NEXT */ +#define XKB_KEY_XF86BrightnessMin 0x10081250 /* v3.16 KEY_BRIGHTNESS_MIN */ +#define XKB_KEY_XF86BrightnessMax 0x10081251 /* v3.16 KEY_BRIGHTNESS_MAX */ +#define XKB_KEY_XF86KbdInputAssistPrev 0x10081260 /* v3.18 KEY_KBDINPUTASSIST_PREV */ +#define XKB_KEY_XF86KbdInputAssistNext 0x10081261 /* v3.18 KEY_KBDINPUTASSIST_NEXT */ +#define XKB_KEY_XF86KbdInputAssistPrevgroup 0x10081262 /* v3.18 KEY_KBDINPUTASSIST_PREVGROUP */ +#define XKB_KEY_XF86KbdInputAssistNextgroup 0x10081263 /* v3.18 KEY_KBDINPUTASSIST_NEXTGROUP */ +#define XKB_KEY_XF86KbdInputAssistAccept 0x10081264 /* v3.18 KEY_KBDINPUTASSIST_ACCEPT */ +#define XKB_KEY_XF86KbdInputAssistCancel 0x10081265 /* v3.18 KEY_KBDINPUTASSIST_CANCEL */ +#define XKB_KEY_XF86RightUp 0x10081266 /* v4.7 KEY_RIGHT_UP */ +#define XKB_KEY_XF86RightDown 0x10081267 /* v4.7 KEY_RIGHT_DOWN */ +#define XKB_KEY_XF86LeftUp 0x10081268 /* v4.7 KEY_LEFT_UP */ +#define XKB_KEY_XF86LeftDown 0x10081269 /* v4.7 KEY_LEFT_DOWN */ +#define XKB_KEY_XF86RootMenu 0x1008126a /* v4.7 KEY_ROOT_MENU */ +#define XKB_KEY_XF86MediaTopMenu 0x1008126b /* v4.7 KEY_MEDIA_TOP_MENU */ +#define XKB_KEY_XF86Numeric11 0x1008126c /* v4.7 KEY_NUMERIC_11 */ +#define XKB_KEY_XF86Numeric12 0x1008126d /* v4.7 KEY_NUMERIC_12 */ +#define XKB_KEY_XF86AudioDesc 0x1008126e /* v4.7 KEY_AUDIO_DESC */ +#define XKB_KEY_XF863DMode 0x1008126f /* v4.7 KEY_3D_MODE */ +#define XKB_KEY_XF86NextFavorite 0x10081270 /* v4.7 KEY_NEXT_FAVORITE */ +#define XKB_KEY_XF86StopRecord 0x10081271 /* v4.7 KEY_STOP_RECORD */ +#define XKB_KEY_XF86PauseRecord 0x10081272 /* v4.7 KEY_PAUSE_RECORD */ +#define XKB_KEY_XF86VOD 0x10081273 /* v4.7 KEY_VOD */ +#define XKB_KEY_XF86Unmute 0x10081274 /* v4.7 KEY_UNMUTE */ +#define XKB_KEY_XF86FastReverse 0x10081275 /* v4.7 KEY_FASTREVERSE */ +#define XKB_KEY_XF86SlowReverse 0x10081276 /* v4.7 KEY_SLOWREVERSE */ +#define XKB_KEY_XF86Data 0x10081277 /* v4.7 KEY_DATA */ +#define XKB_KEY_XF86OnScreenKeyboard 0x10081278 /* v4.12 KEY_ONSCREEN_KEYBOARD */ +#define XKB_KEY_XF86PrivacyScreenToggle 0x10081279 /* v5.5 KEY_PRIVACY_SCREEN_TOGGLE */ +#define XKB_KEY_XF86SelectiveScreenshot 0x1008127a /* v5.6 KEY_SELECTIVE_SCREENSHOT */ +#define XKB_KEY_XF86Macro1 0x10081290 /* v5.5 KEY_MACRO1 */ +#define XKB_KEY_XF86Macro2 0x10081291 /* v5.5 KEY_MACRO2 */ +#define XKB_KEY_XF86Macro3 0x10081292 /* v5.5 KEY_MACRO3 */ +#define XKB_KEY_XF86Macro4 0x10081293 /* v5.5 KEY_MACRO4 */ +#define XKB_KEY_XF86Macro5 0x10081294 /* v5.5 KEY_MACRO5 */ +#define XKB_KEY_XF86Macro6 0x10081295 /* v5.5 KEY_MACRO6 */ +#define XKB_KEY_XF86Macro7 0x10081296 /* v5.5 KEY_MACRO7 */ +#define XKB_KEY_XF86Macro8 0x10081297 /* v5.5 KEY_MACRO8 */ +#define XKB_KEY_XF86Macro9 0x10081298 /* v5.5 KEY_MACRO9 */ +#define XKB_KEY_XF86Macro10 0x10081299 /* v5.5 KEY_MACRO10 */ +#define XKB_KEY_XF86Macro11 0x1008129a /* v5.5 KEY_MACRO11 */ +#define XKB_KEY_XF86Macro12 0x1008129b /* v5.5 KEY_MACRO12 */ +#define XKB_KEY_XF86Macro13 0x1008129c /* v5.5 KEY_MACRO13 */ +#define XKB_KEY_XF86Macro14 0x1008129d /* v5.5 KEY_MACRO14 */ +#define XKB_KEY_XF86Macro15 0x1008129e /* v5.5 KEY_MACRO15 */ +#define XKB_KEY_XF86Macro16 0x1008129f /* v5.5 KEY_MACRO16 */ +#define XKB_KEY_XF86Macro17 0x100812a0 /* v5.5 KEY_MACRO17 */ +#define XKB_KEY_XF86Macro18 0x100812a1 /* v5.5 KEY_MACRO18 */ +#define XKB_KEY_XF86Macro19 0x100812a2 /* v5.5 KEY_MACRO19 */ +#define XKB_KEY_XF86Macro20 0x100812a3 /* v5.5 KEY_MACRO20 */ +#define XKB_KEY_XF86Macro21 0x100812a4 /* v5.5 KEY_MACRO21 */ +#define XKB_KEY_XF86Macro22 0x100812a5 /* v5.5 KEY_MACRO22 */ +#define XKB_KEY_XF86Macro23 0x100812a6 /* v5.5 KEY_MACRO23 */ +#define XKB_KEY_XF86Macro24 0x100812a7 /* v5.5 KEY_MACRO24 */ +#define XKB_KEY_XF86Macro25 0x100812a8 /* v5.5 KEY_MACRO25 */ +#define XKB_KEY_XF86Macro26 0x100812a9 /* v5.5 KEY_MACRO26 */ +#define XKB_KEY_XF86Macro27 0x100812aa /* v5.5 KEY_MACRO27 */ +#define XKB_KEY_XF86Macro28 0x100812ab /* v5.5 KEY_MACRO28 */ +#define XKB_KEY_XF86Macro29 0x100812ac /* v5.5 KEY_MACRO29 */ +#define XKB_KEY_XF86Macro30 0x100812ad /* v5.5 KEY_MACRO30 */ +#define XKB_KEY_XF86MacroRecordStart 0x100812b0 /* v5.5 KEY_MACRO_RECORD_START */ +#define XKB_KEY_XF86MacroRecordStop 0x100812b1 /* v5.5 KEY_MACRO_RECORD_STOP */ +#define XKB_KEY_XF86MacroPresetCycle 0x100812b2 /* v5.5 KEY_MACRO_PRESET_CYCLE */ +#define XKB_KEY_XF86MacroPreset1 0x100812b3 /* v5.5 KEY_MACRO_PRESET1 */ +#define XKB_KEY_XF86MacroPreset2 0x100812b4 /* v5.5 KEY_MACRO_PRESET2 */ +#define XKB_KEY_XF86MacroPreset3 0x100812b5 /* v5.5 KEY_MACRO_PRESET3 */ +#define XKB_KEY_XF86KbdLcdMenu1 0x100812b8 /* v5.5 KEY_KBD_LCD_MENU1 */ +#define XKB_KEY_XF86KbdLcdMenu2 0x100812b9 /* v5.5 KEY_KBD_LCD_MENU2 */ +#define XKB_KEY_XF86KbdLcdMenu3 0x100812ba /* v5.5 KEY_KBD_LCD_MENU3 */ +#define XKB_KEY_XF86KbdLcdMenu4 0x100812bb /* v5.5 KEY_KBD_LCD_MENU4 */ +#define XKB_KEY_XF86KbdLcdMenu5 0x100812bc /* v5.5 KEY_KBD_LCD_MENU5 */ +#undef _EVDEVK +/* + * Copyright (c) 1991, Oracle and/or its affiliates. All rights reserved. + * + * 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. + */ +/************************************************************ + +Copyright 1991, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice 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 +OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +***********************************************************/ + +/* + * Floating Accent + */ + +#define XKB_KEY_SunFA_Grave 0x1005FF00 +#define XKB_KEY_SunFA_Circum 0x1005FF01 +#define XKB_KEY_SunFA_Tilde 0x1005FF02 +#define XKB_KEY_SunFA_Acute 0x1005FF03 +#define XKB_KEY_SunFA_Diaeresis 0x1005FF04 +#define XKB_KEY_SunFA_Cedilla 0x1005FF05 + +/* + * Miscellaneous Functions + */ + +#define XKB_KEY_SunF36 0x1005FF10 /* Labeled F11 */ +#define XKB_KEY_SunF37 0x1005FF11 /* Labeled F12 */ + +#define XKB_KEY_SunSys_Req 0x1005FF60 +#define XKB_KEY_SunPrint_Screen 0x0000FF61 /* Same as XK_Print */ + +/* + * International & Multi-Key Character Composition + */ + +#define XKB_KEY_SunCompose 0x0000FF20 /* Same as XK_Multi_key */ +#define XKB_KEY_SunAltGraph 0x0000FF7E /* Same as XK_Mode_switch */ + +/* + * Cursor Control + */ + +#define XKB_KEY_SunPageUp 0x0000FF55 /* Same as XK_Prior */ +#define XKB_KEY_SunPageDown 0x0000FF56 /* Same as XK_Next */ + +/* + * Open Look Functions + */ + +#define XKB_KEY_SunUndo 0x0000FF65 /* Same as XK_Undo */ +#define XKB_KEY_SunAgain 0x0000FF66 /* Same as XK_Redo */ +#define XKB_KEY_SunFind 0x0000FF68 /* Same as XK_Find */ +#define XKB_KEY_SunStop 0x0000FF69 /* Same as XK_Cancel */ +#define XKB_KEY_SunProps 0x1005FF70 +#define XKB_KEY_SunFront 0x1005FF71 +#define XKB_KEY_SunCopy 0x1005FF72 +#define XKB_KEY_SunOpen 0x1005FF73 +#define XKB_KEY_SunPaste 0x1005FF74 +#define XKB_KEY_SunCut 0x1005FF75 + +#define XKB_KEY_SunPowerSwitch 0x1005FF76 +#define XKB_KEY_SunAudioLowerVolume 0x1005FF77 +#define XKB_KEY_SunAudioMute 0x1005FF78 +#define XKB_KEY_SunAudioRaiseVolume 0x1005FF79 +#define XKB_KEY_SunVideoDegauss 0x1005FF7A +#define XKB_KEY_SunVideoLowerBrightness 0x1005FF7B +#define XKB_KEY_SunVideoRaiseBrightness 0x1005FF7C +#define XKB_KEY_SunPowerSwitchShift 0x1005FF7D +/*********************************************************** + +Copyright 1988, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice 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 +OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + +Copyright 1988 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/* + * DEC private keysyms + * (29th bit set) + */ + +/* two-key compose sequence initiators, chosen to map to Latin1 characters */ + +#define XKB_KEY_Dring_accent 0x1000FEB0 +#define XKB_KEY_Dcircumflex_accent 0x1000FE5E +#define XKB_KEY_Dcedilla_accent 0x1000FE2C +#define XKB_KEY_Dacute_accent 0x1000FE27 +#define XKB_KEY_Dgrave_accent 0x1000FE60 +#define XKB_KEY_Dtilde 0x1000FE7E +#define XKB_KEY_Ddiaeresis 0x1000FE22 + +/* special keysym for LK2** "Remove" key on editing keypad */ + +#define XKB_KEY_DRemove 0x1000FF00 /* Remove */ +/* + +Copyright 1987, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice 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 OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Hewlett Packard +or Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +HEWLETT-PACKARD MAKES NO WARRANTY OF ANY KIND WITH REGARD +TO THIS SOFTWARE, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. Hewlett-Packard shall not be liable for errors +contained herein or direct, indirect, special, incidental or +consequential damages in connection with the furnishing, +performance, or use of this material. + +*/ + + + +#define XKB_KEY_hpClearLine 0x1000FF6F +#define XKB_KEY_hpInsertLine 0x1000FF70 +#define XKB_KEY_hpDeleteLine 0x1000FF71 +#define XKB_KEY_hpInsertChar 0x1000FF72 +#define XKB_KEY_hpDeleteChar 0x1000FF73 +#define XKB_KEY_hpBackTab 0x1000FF74 +#define XKB_KEY_hpKP_BackTab 0x1000FF75 +#define XKB_KEY_hpModelock1 0x1000FF48 +#define XKB_KEY_hpModelock2 0x1000FF49 +#define XKB_KEY_hpReset 0x1000FF6C +#define XKB_KEY_hpSystem 0x1000FF6D +#define XKB_KEY_hpUser 0x1000FF6E +#define XKB_KEY_hpmute_acute 0x100000A8 +#define XKB_KEY_hpmute_grave 0x100000A9 +#define XKB_KEY_hpmute_asciicircum 0x100000AA +#define XKB_KEY_hpmute_diaeresis 0x100000AB +#define XKB_KEY_hpmute_asciitilde 0x100000AC +#define XKB_KEY_hplira 0x100000AF +#define XKB_KEY_hpguilder 0x100000BE +#define XKB_KEY_hpYdiaeresis 0x100000EE +#define XKB_KEY_hpIO 0x100000EE +#define XKB_KEY_hplongminus 0x100000F6 +#define XKB_KEY_hpblock 0x100000FC + + + +#define XKB_KEY_osfCopy 0x1004FF02 +#define XKB_KEY_osfCut 0x1004FF03 +#define XKB_KEY_osfPaste 0x1004FF04 +#define XKB_KEY_osfBackTab 0x1004FF07 +#define XKB_KEY_osfBackSpace 0x1004FF08 +#define XKB_KEY_osfClear 0x1004FF0B +#define XKB_KEY_osfEscape 0x1004FF1B +#define XKB_KEY_osfAddMode 0x1004FF31 +#define XKB_KEY_osfPrimaryPaste 0x1004FF32 +#define XKB_KEY_osfQuickPaste 0x1004FF33 +#define XKB_KEY_osfPageLeft 0x1004FF40 +#define XKB_KEY_osfPageUp 0x1004FF41 +#define XKB_KEY_osfPageDown 0x1004FF42 +#define XKB_KEY_osfPageRight 0x1004FF43 +#define XKB_KEY_osfActivate 0x1004FF44 +#define XKB_KEY_osfMenuBar 0x1004FF45 +#define XKB_KEY_osfLeft 0x1004FF51 +#define XKB_KEY_osfUp 0x1004FF52 +#define XKB_KEY_osfRight 0x1004FF53 +#define XKB_KEY_osfDown 0x1004FF54 +#define XKB_KEY_osfEndLine 0x1004FF57 +#define XKB_KEY_osfBeginLine 0x1004FF58 +#define XKB_KEY_osfEndData 0x1004FF59 +#define XKB_KEY_osfBeginData 0x1004FF5A +#define XKB_KEY_osfPrevMenu 0x1004FF5B +#define XKB_KEY_osfNextMenu 0x1004FF5C +#define XKB_KEY_osfPrevField 0x1004FF5D +#define XKB_KEY_osfNextField 0x1004FF5E +#define XKB_KEY_osfSelect 0x1004FF60 +#define XKB_KEY_osfInsert 0x1004FF63 +#define XKB_KEY_osfUndo 0x1004FF65 +#define XKB_KEY_osfMenu 0x1004FF67 +#define XKB_KEY_osfCancel 0x1004FF69 +#define XKB_KEY_osfHelp 0x1004FF6A +#define XKB_KEY_osfSelectAll 0x1004FF71 +#define XKB_KEY_osfDeselectAll 0x1004FF72 +#define XKB_KEY_osfReselect 0x1004FF73 +#define XKB_KEY_osfExtend 0x1004FF74 +#define XKB_KEY_osfRestore 0x1004FF78 +#define XKB_KEY_osfDelete 0x1004FFFF + + + +/************************************************************** + * The use of the following macros is deprecated. + * They are listed below only for backwards compatibility. + */ +#define XKB_KEY_Reset 0x1000FF6C +#define XKB_KEY_System 0x1000FF6D +#define XKB_KEY_User 0x1000FF6E +#define XKB_KEY_ClearLine 0x1000FF6F +#define XKB_KEY_InsertLine 0x1000FF70 +#define XKB_KEY_DeleteLine 0x1000FF71 +#define XKB_KEY_InsertChar 0x1000FF72 +#define XKB_KEY_DeleteChar 0x1000FF73 +#define XKB_KEY_BackTab 0x1000FF74 +#define XKB_KEY_KP_BackTab 0x1000FF75 +#define XKB_KEY_Ext16bit_L 0x1000FF76 +#define XKB_KEY_Ext16bit_R 0x1000FF77 +#define XKB_KEY_mute_acute 0x100000a8 +#define XKB_KEY_mute_grave 0x100000a9 +#define XKB_KEY_mute_asciicircum 0x100000aa +#define XKB_KEY_mute_diaeresis 0x100000ab +#define XKB_KEY_mute_asciitilde 0x100000ac +#define XKB_KEY_lira 0x100000af +#define XKB_KEY_guilder 0x100000be +#define XKB_KEY_IO 0x100000ee +#define XKB_KEY_longminus 0x100000f6 +#define XKB_KEY_block 0x100000fc + + + +#endif diff --git a/include/xkbcommon/xkbcommon-names.h b/include/xkbcommon/xkbcommon-names.h new file mode 100644 index 0000000..ecb551f --- /dev/null +++ b/include/xkbcommon/xkbcommon-names.h @@ -0,0 +1,45 @@ +/* + * Copyright © 2012 Intel Corporation + * + * 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. + * + * Author: Daniel Stone + */ + +#ifndef _XKBCOMMON_NAMES_H +#define _XKBCOMMON_NAMES_H + +/** + * @file + * @brief Predefined names for common modifiers and LEDs. + */ + +#define XKB_MOD_NAME_SHIFT "Shift" +#define XKB_MOD_NAME_CAPS "Lock" +#define XKB_MOD_NAME_CTRL "Control" +#define XKB_MOD_NAME_ALT "Mod1" +#define XKB_MOD_NAME_NUM "Mod2" +#define XKB_MOD_NAME_LOGO "Mod4" + +#define XKB_LED_NAME_CAPS "Caps Lock" +#define XKB_LED_NAME_NUM "Num Lock" +#define XKB_LED_NAME_SCROLL "Scroll Lock" + +#endif diff --git a/include/xkbcommon/xkbcommon-x11.h b/include/xkbcommon/xkbcommon-x11.h new file mode 100644 index 0000000..4eb716a --- /dev/null +++ b/include/xkbcommon/xkbcommon-x11.h @@ -0,0 +1,244 @@ +/* + * Copyright © 2013 Ran Benita + * + * 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. + */ + +#ifndef _XKBCOMMON_X11_H +#define _XKBCOMMON_X11_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file + * libxkbcommon-x11 API - Additional X11 support for xkbcommon. + */ + +/** + * @defgroup x11 X11 support + * Additional X11 support for xkbcommon. + * @since 0.4.0 + * + * @{ + */ + +/** + * @page x11-overview Overview + * @parblock + * + * The xkbcommon-x11 module provides a means for creating an xkb_keymap + * corresponding to the currently active keymap on the X server. To do + * so, it queries the XKB X11 extension using the xcb-xkb library. It + * can be used as a replacement for Xlib's keyboard handling. + * + * Following is an example workflow using xkbcommon-x11. A complete + * example may be found in the tools/interactive-x11.c file in the + * xkbcommon source repository. On startup: + * + * 1. Connect to the X server using xcb_connect(). + * 2. Setup the XKB X11 extension. You can do this either by using the + * xcb_xkb_use_extension() request directly, or by using the + * xkb_x11_setup_xkb_extension() helper function. + * + * The XKB extension supports using separate keymaps and states for + * different keyboard devices. The devices are identified by an integer + * device ID and are managed by another X11 extension, XInput. The + * original X11 protocol only had one keyboard device, called the "core + * keyboard", which is still supported as a "virtual device". + * + * 3. We will use the core keyboard as an example. To get its device ID, + * use either the xcb_xkb_get_device_info() request directly, or the + * xkb_x11_get_core_keyboard_device_id() helper function. + * 4. Create an initial xkb_keymap for this device, using the + * xkb_x11_keymap_new_from_device() function. + * 5. Create an initial xkb_state for this device, using the + * xkb_x11_state_new_from_device() function. + * + * @note At this point, you may consider setting various XKB controls and + * XKB per-client flags. For example, enabling detectable autorepeat: \n + * https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Detectable_Autorepeat + * + * Next, you need to react to state changes (e.g. a modifier was pressed, + * the layout was changed) and to keymap changes (e.g. a tool like xkbcomp, + * setxkbmap or xmodmap was used): + * + * 6. Select to listen to at least the following XKB events: + * NewKeyboardNotify, MapNotify, StateNotify; using the + * xcb_xkb_select_events_aux() request. + * 7. When NewKeyboardNotify or MapNotify are received, recreate the + * xkb_keymap and xkb_state as described above. + * 8. When StateNotify is received, update the xkb_state accordingly + * using the xkb_state_update_mask() function. + * + * @note It is also possible to use the KeyPress/KeyRelease @p state + * field to find the effective modifier and layout state, instead of + * using XkbStateNotify: \n + * https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Computing_A_State_Field_from_an_XKB_State + * \n However, XkbStateNotify is more accurate. + * + * @note There is no need to call xkb_state_update_key(); the state is + * already synchronized. + * + * Finally, when a key event is received, you can use ordinary xkbcommon + * functions, like xkb_state_key_get_one_sym() and xkb_state_key_get_utf8(), + * as you normally would. + * + * @endparblock + */ + +/** + * The minimal compatible major version of the XKB X11 extension which + * this library can use. + */ +#define XKB_X11_MIN_MAJOR_XKB_VERSION 1 +/** + * The minimal compatible minor version of the XKB X11 extension which + * this library can use (for the minimal major version). + */ +#define XKB_X11_MIN_MINOR_XKB_VERSION 0 + +/** Flags for the xkb_x11_setup_xkb_extension() function. */ +enum xkb_x11_setup_xkb_extension_flags { + /** Do not apply any flags. */ + XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS = 0 +}; + +/** + * Setup the XKB X11 extension for this X client. + * + * The xkbcommon-x11 library uses various XKB requests. Before doing so, + * an X client must notify the server that it will be using the extension. + * This function (or an XCB equivalent) must be called before any other + * function in this library is used. + * + * Some X servers may not support or disable the XKB extension. If you + * want to support such servers, you need to use a different fallback. + * + * You may call this function several times; it is idempotent. + * + * @param connection + * An XCB connection to the X server. + * @param major_xkb_version + * See @p minor_xkb_version. + * @param minor_xkb_version + * The XKB extension version to request. To operate correctly, you + * must have (major_xkb_version, minor_xkb_version) >= + * (XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION), + * though this is not enforced. + * @param flags + * Optional flags, or 0. + * @param[out] major_xkb_version_out + * See @p minor_xkb_version_out. + * @param[out] minor_xkb_version_out + * Backfilled with the compatible XKB extension version numbers picked + * by the server. Can be NULL. + * @param[out] base_event_out + * Backfilled with the XKB base (also known as first) event code, needed + * to distinguish XKB events. Can be NULL. + * @param[out] base_error_out + * Backfilled with the XKB base (also known as first) error code, needed + * to distinguish XKB errors. Can be NULL. + * + * @returns 1 on success, or 0 on failure. + */ +int +xkb_x11_setup_xkb_extension(xcb_connection_t *connection, + uint16_t major_xkb_version, + uint16_t minor_xkb_version, + enum xkb_x11_setup_xkb_extension_flags flags, + uint16_t *major_xkb_version_out, + uint16_t *minor_xkb_version_out, + uint8_t *base_event_out, + uint8_t *base_error_out); + +/** + * Get the keyboard device ID of the core X11 keyboard. + * + * @param connection An XCB connection to the X server. + * + * @returns A device ID which may be used with other xkb_x11_* functions, + * or -1 on failure. + */ +int32_t +xkb_x11_get_core_keyboard_device_id(xcb_connection_t *connection); + +/** + * Create a keymap from an X11 keyboard device. + * + * This function queries the X server with various requests, fetches the + * details of the active keymap on a keyboard device, and creates an + * xkb_keymap from these details. + * + * @param context + * The context in which to create the keymap. + * @param connection + * An XCB connection to the X server. + * @param device_id + * An XInput device ID (in the range 0-127) with input class KEY. + * Passing values outside of this range is an error (the XKB protocol + * predates the XInput2 protocol, which first allowed IDs > 127). + * @param flags + * Optional flags for the keymap, or 0. + * + * @returns A keymap retrieved from the X server, or NULL on failure. + * + * @memberof xkb_keymap + */ +struct xkb_keymap * +xkb_x11_keymap_new_from_device(struct xkb_context *context, + xcb_connection_t *connection, + int32_t device_id, + enum xkb_keymap_compile_flags flags); + +/** + * Create a new keyboard state object from an X11 keyboard device. + * + * This function is the same as xkb_state_new(), only pre-initialized + * with the state of the device at the time this function is called. + * + * @param keymap + * The keymap for which to create the state. + * @param connection + * An XCB connection to the X server. + * @param device_id + * An XInput 1 device ID (in the range 0-255) with input class KEY. + * Passing values outside of this range is an error. + * + * @returns A new keyboard state object, or NULL on failure. + * + * @memberof xkb_state + */ +struct xkb_state * +xkb_x11_state_new_from_device(struct xkb_keymap *keymap, + xcb_connection_t *connection, + int32_t device_id); + +/** @} */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* _XKBCOMMON_X11_H */ diff --git a/include/xkbcommon/xkbcommon.h b/include/xkbcommon/xkbcommon.h new file mode 100644 index 0000000..f52dcfa --- /dev/null +++ b/include/xkbcommon/xkbcommon.h @@ -0,0 +1,1954 @@ +/* + * Copyright 1985, 1987, 1990, 1998 The Open Group + * Copyright 2008 Dan Nicholson + * + * 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 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 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. + * + * Except as contained in this notice, the names of the authors or their + * institutions shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization from the authors. + */ + +/************************************************************ + * Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, and distribute this + * software and its documentation for any purpose and without + * fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting + * documentation, and that the name of Silicon Graphics not be + * used in advertising or publicity pertaining to distribution + * of the software without specific prior written permission. + * Silicon Graphics makes no representation about the suitability + * of this software for any purpose. It is provided "as is" + * without any express or implied warranty. + * + * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON + * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH + * THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + ********************************************************/ + +/* + * Copyright © 2009-2012 Daniel Stone + * Copyright © 2012 Intel Corporation + * Copyright © 2012 Ran Benita + * + * 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. + * + * Author: Daniel Stone + */ + +#ifndef _XKBCOMMON_H_ +#define _XKBCOMMON_H_ + +#include +#include +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file + * Main libxkbcommon API. + */ + +/** + * @struct xkb_context + * Opaque top level library context object. + * + * The context contains various general library data and state, like + * logging level and include paths. + * + * Objects are created in a specific context, and multiple contexts may + * coexist simultaneously. Objects from different contexts are completely + * separated and do not share any memory or state. + */ +struct xkb_context; + +/** + * @struct xkb_keymap + * Opaque compiled keymap object. + * + * The keymap object holds all of the static keyboard information obtained + * from compiling XKB files. + * + * A keymap is immutable after it is created (besides reference counts, etc.); + * if you need to change it, you must create a new one. + */ +struct xkb_keymap; + +/** + * @struct xkb_state + * Opaque keyboard state object. + * + * State objects contain the active state of a keyboard (or keyboards), such + * as the currently effective layout and the active modifiers. It acts as a + * simple state machine, wherein key presses and releases are the input, and + * key symbols (keysyms) are the output. + */ +struct xkb_state; + +/** + * A number used to represent a physical key on a keyboard. + * + * A standard PC-compatible keyboard might have 102 keys. An appropriate + * keymap would assign each of them a keycode, by which the user should + * refer to the key throughout the library. + * + * Historically, the X11 protocol, and consequentially the XKB protocol, + * assign only 8 bits for keycodes. This limits the number of different + * keys that can be used simultaneously in a single keymap to 256 + * (disregarding other limitations). This library does not share this limit; + * keycodes beyond 255 ('extended keycodes') are not treated specially. + * Keymaps and applications which are compatible with X11 should not use + * these keycodes. + * + * The values of specific keycodes are determined by the keymap and the + * underlying input system. For example, with an X11-compatible keymap + * and Linux evdev scan codes (see linux/input.h), a fixed offset is used: + * + * The keymap defines a canonical name for each key, plus possible aliases. + * Historically, the XKB protocol restricts these names to at most 4 (ASCII) + * characters, but this library does not share this limit. + * + * @code + * xkb_keycode_t keycode_A = KEY_A + 8; + * @endcode + * + * @sa xkb_keycode_is_legal_ext() xkb_keycode_is_legal_x11() + */ +typedef uint32_t xkb_keycode_t; + +/** + * A number used to represent the symbols generated from a key on a keyboard. + * + * A key, represented by a keycode, may generate different symbols according + * to keyboard state. For example, on a QWERTY keyboard, pressing the key + * labled \ generates the symbol 'a'. If the Shift key is held, it + * generates the symbol 'A'. If a different layout is used, say Greek, + * it generates the symbol 'α'. And so on. + * + * Each such symbol is represented by a keysym. Note that keysyms are + * somewhat more general, in that they can also represent some "function", + * such as "Left" or "Right" for the arrow keys. For more information, + * see: + * https://www.x.org/releases/current/doc/xproto/x11protocol.html#keysym_encoding + * + * Specifically named keysyms can be found in the + * xkbcommon/xkbcommon-keysyms.h header file. Their name does not include + * the XKB_KEY_ prefix. + * + * Besides those, any Unicode/ISO 10646 character in the range U0100 to + * U10FFFF can be represented by a keysym value in the range 0x01000100 to + * 0x0110FFFF. The name of Unicode keysyms is "U", e.g. "UA1B2". + * + * The name of other unnamed keysyms is the hexadecimal representation of + * their value, e.g. "0xabcd1234". + * + * Keysym names are case-sensitive. + */ +typedef uint32_t xkb_keysym_t; + +/** + * Index of a keyboard layout. + * + * The layout index is a state component which detemines which keyboard + * layout is active. These may be different alphabets, different key + * arrangements, etc. + * + * Layout indices are consecutive. The first layout has index 0. + * + * Each layout is not required to have a name, and the names are not + * guaranteed to be unique (though they are usually provided and unique). + * Therefore, it is not safe to use the name as a unique identifier for a + * layout. Layout names are case-sensitive. + * + * Layout names are specified in the layout's definition, for example + * "English (US)". These are different from the (conventionally) short names + * which are used to locate the layout, for example "us" or "us(intl)". These + * names are not present in a compiled keymap. + * + * If the user selects layouts from a list generated from the XKB registry + * (using libxkbregistry or directly), and this metadata is needed later on, it + * is recommended to store it along with the keymap. + * + * Layouts are also called "groups" by XKB. + * + * @sa xkb_keymap_num_layouts() xkb_keymap_num_layouts_for_key() + */ +typedef uint32_t xkb_layout_index_t; +/** A mask of layout indices. */ +typedef uint32_t xkb_layout_mask_t; + +/** + * Index of a shift level. + * + * Any key, in any layout, can have several shift levels. Each + * shift level can assign different keysyms to the key. The shift level + * to use is chosen according to the current keyboard state; for example, + * if no keys are pressed, the first level may be used; if the Left Shift + * key is pressed, the second; if Num Lock is pressed, the third; and + * many such combinations are possible (see xkb_mod_index_t). + * + * Level indices are consecutive. The first level has index 0. + */ +typedef uint32_t xkb_level_index_t; + +/** + * Index of a modifier. + * + * A @e modifier is a state component which changes the way keys are + * interpreted. A keymap defines a set of modifiers, such as Alt, Shift, + * Num Lock or Meta, and specifies which keys may @e activate which + * modifiers (in a many-to-many relationship, i.e. a key can activate + * several modifiers, and a modifier may be activated by several keys. + * Different keymaps do this differently). + * + * When retrieving the keysyms for a key, the active modifier set is + * consulted; this detemines the correct shift level to use within the + * currently active layout (see xkb_level_index_t). + * + * Modifier indices are consecutive. The first modifier has index 0. + * + * Each modifier must have a name, and the names are unique. Therefore, it + * is safe to use the name as a unique identifier for a modifier. The names + * of some common modifiers are provided in the xkbcommon/xkbcommon-names.h + * header file. Modifier names are case-sensitive. + * + * @sa xkb_keymap_num_mods() + */ +typedef uint32_t xkb_mod_index_t; +/** A mask of modifier indices. */ +typedef uint32_t xkb_mod_mask_t; + +/** + * Index of a keyboard LED. + * + * LEDs are logical objects which may be @e active or @e inactive. They + * typically correspond to the lights on the keyboard. Their state is + * determined by the current keyboard state. + * + * LED indices are non-consecutive. The first LED has index 0. + * + * Each LED must have a name, and the names are unique. Therefore, + * it is safe to use the name as a unique identifier for a LED. The names + * of some common LEDs are provided in the xkbcommon/xkbcommon-names.h + * header file. LED names are case-sensitive. + * + * @warning A given keymap may specify an exact index for a given LED. + * Therefore, LED indexing is not necessarily sequential, as opposed to + * modifiers and layouts. This means that when iterating over the LEDs + * in a keymap using e.g. xkb_keymap_num_leds(), some indices might be + * invalid. Given such an index, functions like xkb_keymap_led_get_name() + * will return NULL, and xkb_state_led_index_is_active() will return -1. + * + * LEDs are also called "indicators" by XKB. + * + * @sa xkb_keymap_num_leds() + */ +typedef uint32_t xkb_led_index_t; +/** A mask of LED indices. */ +typedef uint32_t xkb_led_mask_t; + +#define XKB_KEYCODE_INVALID (0xffffffff) +#define XKB_LAYOUT_INVALID (0xffffffff) +#define XKB_LEVEL_INVALID (0xffffffff) +#define XKB_MOD_INVALID (0xffffffff) +#define XKB_LED_INVALID (0xffffffff) + +#define XKB_KEYCODE_MAX (0xffffffff - 1) + +/** + * Test whether a value is a valid extended keycode. + * @sa xkb_keycode_t + **/ +#define xkb_keycode_is_legal_ext(key) (key <= XKB_KEYCODE_MAX) + +/** + * Test whether a value is a valid X11 keycode. + * @sa xkb_keycode_t + */ +#define xkb_keycode_is_legal_x11(key) (key >= 8 && key <= 255) + +/** + * Names to compile a keymap with, also known as RMLVO. + * + * The names are the common configuration values by which a user picks + * a keymap. + * + * If the entire struct is NULL, then each field is taken to be NULL. + * You should prefer passing NULL instead of choosing your own defaults. + */ +struct xkb_rule_names { + /** + * The rules file to use. The rules file describes how to interpret + * the values of the model, layout, variant and options fields. + * + * If NULL or the empty string "", a default value is used. + * If the XKB_DEFAULT_RULES environment variable is set, it is used + * as the default. Otherwise the system default is used. + */ + const char *rules; + /** + * The keyboard model by which to interpret keycodes and LEDs. + * + * If NULL or the empty string "", a default value is used. + * If the XKB_DEFAULT_MODEL environment variable is set, it is used + * as the default. Otherwise the system default is used. + */ + const char *model; + /** + * A comma separated list of layouts (languages) to include in the + * keymap. + * + * If NULL or the empty string "", a default value is used. + * If the XKB_DEFAULT_LAYOUT environment variable is set, it is used + * as the default. Otherwise the system default is used. + */ + const char *layout; + /** + * A comma separated list of variants, one per layout, which may + * modify or augment the respective layout in various ways. + * + * Generally, should either be empty or have the same number of values + * as the number of layouts. You may use empty values as in "intl,,neo". + * + * If NULL or the empty string "", and a default value is also used + * for the layout, a default value is used. Otherwise no variant is + * used. + * If the XKB_DEFAULT_VARIANT environment variable is set, it is used + * as the default. Otherwise the system default is used. + */ + const char *variant; + /** + * A comma separated list of options, through which the user specifies + * non-layout related preferences, like which key combinations are used + * for switching layouts, or which key is the Compose key. + * + * If NULL, a default value is used. If the empty string "", no + * options are used. + * If the XKB_DEFAULT_OPTIONS environment variable is set, it is used + * as the default. Otherwise the system default is used. + */ + const char *options; +}; + +/** + * @defgroup keysyms Keysyms + * Utility functions related to keysyms. + * + * @{ + */ + +/** + * @page keysym-transformations Keysym Transformations + * + * Keysym translation is subject to several "keysym transformations", + * as described in the XKB specification. These are: + * + * - Capitalization transformation. If the Caps Lock modifier is + * active and was not consumed by the translation process, a single + * keysym is transformed to its upper-case form (if applicable). + * Similarly, the UTF-8/UTF-32 string produced is capitalized. + * + * This is described in: + * https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Lock_Modifier + * + * - Control transformation. If the Control modifier is active and + * was not consumed by the translation process, the string produced + * is transformed to its matching ASCII control character (if + * applicable). Keysyms are not affected. + * + * This is described in: + * https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Control_Modifier + * + * Each relevant function discusses which transformations it performs. + * + * These transformations are not applicable when a key produces multiple + * keysyms. + */ + + +/** + * Get the name of a keysym. + * + * For a description of how keysyms are named, see @ref xkb_keysym_t. + * + * @param[in] keysym The keysym. + * @param[out] buffer A string buffer to write the name into. + * @param[in] size Size of the buffer. + * + * @warning If the buffer passed is too small, the string is truncated + * (though still NUL-terminated); a size of at least 64 bytes is recommended. + * + * @returns The number of bytes in the name, excluding the NUL byte. If + * the keysym is invalid, returns -1. + * + * You may check if truncation has occurred by comparing the return value + * with the length of buffer, similarly to the snprintf(3) function. + * + * @sa xkb_keysym_t + */ +int +xkb_keysym_get_name(xkb_keysym_t keysym, char *buffer, size_t size); + +/** Flags for xkb_keysym_from_name(). */ +enum xkb_keysym_flags { + /** Do not apply any flags. */ + XKB_KEYSYM_NO_FLAGS = 0, + /** Find keysym by case-insensitive search. */ + XKB_KEYSYM_CASE_INSENSITIVE = (1 << 0) +}; + +/** + * Get a keysym from its name. + * + * @param name The name of a keysym. See remarks in xkb_keysym_get_name(); + * this function will accept any name returned by that function. + * @param flags A set of flags controlling how the search is done. If + * invalid flags are passed, this will fail with XKB_KEY_NoSymbol. + * + * If you use the XKB_KEYSYM_CASE_INSENSITIVE flag and two keysym names + * differ only by case, then the lower-case keysym is returned. For + * instance, for KEY_a and KEY_A, this function would return KEY_a for the + * case-insensitive search. If this functionality is needed, it is + * recommended to first call this function without this flag; and if that + * fails, only then to try with this flag, while possibly warning the user + * he had misspelled the name, and might get wrong results. + * + * Case folding is done according to the C locale; the current locale is not + * consulted. + * + * @returns The keysym. If the name is invalid, returns XKB_KEY_NoSymbol. + * + * @sa xkb_keysym_t + */ +xkb_keysym_t +xkb_keysym_from_name(const char *name, enum xkb_keysym_flags flags); + +/** + * Get the Unicode/UTF-8 representation of a keysym. + * + * @param[in] keysym The keysym. + * @param[out] buffer A buffer to write the UTF-8 string into. + * @param[in] size The size of buffer. Must be at least 7. + * + * @returns The number of bytes written to the buffer (including the + * terminating byte). If the keysym does not have a Unicode + * representation, returns 0. If the buffer is too small, returns -1. + * + * This function does not perform any @ref keysym-transformations. + * Therefore, prefer to use xkb_state_key_get_utf8() if possible. + * + * @sa xkb_state_key_get_utf8() + */ +int +xkb_keysym_to_utf8(xkb_keysym_t keysym, char *buffer, size_t size); + +/** + * Get the Unicode/UTF-32 representation of a keysym. + * + * @returns The Unicode/UTF-32 representation of keysym, which is also + * compatible with UCS-4. If the keysym does not have a Unicode + * representation, returns 0. + * + * This function does not perform any @ref keysym-transformations. + * Therefore, prefer to use xkb_state_key_get_utf32() if possible. + * + * @sa xkb_state_key_get_utf32() + */ +uint32_t +xkb_keysym_to_utf32(xkb_keysym_t keysym); + +/** + * Get the keysym corresponding to a Unicode/UTF-32 codepoint. + * + * @returns The keysym corresponding to the specified Unicode + * codepoint, or XKB_KEY_NoSymbol if there is none. + * + * This function is the inverse of @ref xkb_keysym_to_utf32. In cases + * where a single codepoint corresponds to multiple keysyms, returns + * the keysym with the lowest value. + * + * Unicode codepoints which do not have a special (legacy) keysym + * encoding use a direct encoding scheme. These keysyms don't usually + * have an associated keysym constant (XKB_KEY_*). + * + * For noncharacter Unicode codepoints and codepoints outside of the + * defined Unicode planes this function returns XKB_KEY_NoSymbol. + * + * @sa xkb_keysym_to_utf32() + * @since 1.0.0 + */ +xkb_keysym_t +xkb_utf32_to_keysym(uint32_t ucs); + +/** + * Convert a keysym to its uppercase form. + * + * If there is no such form, the keysym is returned unchanged. + * + * The conversion rules may be incomplete; prefer to work with the Unicode + * representation instead, when possible. + */ +xkb_keysym_t +xkb_keysym_to_upper(xkb_keysym_t ks); + +/** + * Convert a keysym to its lowercase form. + * + * The conversion rules may be incomplete; prefer to work with the Unicode + * representation instead, when possible. + */ +xkb_keysym_t +xkb_keysym_to_lower(xkb_keysym_t ks); + +/** @} */ + +/** + * @defgroup context Library Context + * Creating, destroying and using library contexts. + * + * Every keymap compilation request must have a context associated with + * it. The context keeps around state such as the include path. + * + * @{ + */ + +/** + * @page envvars Environment Variables + * + * The user may set some environment variables which affect the library: + * + * - `XKB_CONFIG_ROOT`, `XKB_CONFIG_EXTRA_PATH`, `XDG_CONFIG_DIR`, `HOME` - see @ref include-path. + * - `XKB_LOG_LEVEL` - see xkb_context_set_log_level(). + * - `XKB_LOG_VERBOSITY` - see xkb_context_set_log_verbosity(). + * - `XKB_DEFAULT_RULES`, `XKB_DEFAULT_MODEL`, `XKB_DEFAULT_LAYOUT`, + * `XKB_DEFAULT_VARIANT`, `XKB_DEFAULT_OPTIONS` - see xkb_rule_names. + */ + +/** Flags for context creation. */ +enum xkb_context_flags { + /** Do not apply any context flags. */ + XKB_CONTEXT_NO_FLAGS = 0, + /** Create this context with an empty include path. */ + XKB_CONTEXT_NO_DEFAULT_INCLUDES = (1 << 0), + /** + * Don't take RMLVO names from the environment. + * @since 0.3.0 + */ + XKB_CONTEXT_NO_ENVIRONMENT_NAMES = (1 << 1) +}; + +/** + * Create a new context. + * + * @param flags Optional flags for the context, or 0. + * + * @returns A new context, or NULL on failure. + * + * @memberof xkb_context + */ +struct xkb_context * +xkb_context_new(enum xkb_context_flags flags); + +/** + * Take a new reference on a context. + * + * @returns The passed in context. + * + * @memberof xkb_context + */ +struct xkb_context * +xkb_context_ref(struct xkb_context *context); + +/** + * Release a reference on a context, and possibly free it. + * + * @param context The context. If it is NULL, this function does nothing. + * + * @memberof xkb_context + */ +void +xkb_context_unref(struct xkb_context *context); + +/** + * Store custom user data in the context. + * + * This may be useful in conjunction with xkb_context_set_log_fn() or other + * callbacks. + * + * @memberof xkb_context + */ +void +xkb_context_set_user_data(struct xkb_context *context, void *user_data); + +/** + * Retrieves stored user data from the context. + * + * @returns The stored user data. If the user data wasn't set, or the + * passed in context is NULL, returns NULL. + * + * This may be useful to access private user data from callbacks like a + * custom logging function. + * + * @memberof xkb_context + **/ +void * +xkb_context_get_user_data(struct xkb_context *context); + +/** @} */ + +/** + * @defgroup include-path Include Paths + * Manipulating the include paths in a context. + * + * The include paths are the file-system paths that are searched when an + * include statement is encountered during keymap compilation. + * + * The default include paths are, in that lookup order: + * - The path `$XDG_CONFIG_HOME/xkb`, with the usual `XDG_CONFIG_HOME` + * fallback to `$HOME/.config/` if unset. + * - The path `$HOME/.xkb`, where $HOME is the value of the environment + * variable `HOME`. + * - The `XKB_CONFIG_EXTRA_PATH` environment variable, if defined, otherwise the + * system configuration directory, defined at library configuration time + * (usually `/etc/xkb`). + * - The `XKB_CONFIG_ROOT` environment variable, if defined, otherwise + * the system XKB root, defined at library configuration time. + * + * @{ + */ + +/** + * Append a new entry to the context's include path. + * + * @returns 1 on success, or 0 if the include path could not be added or is + * inaccessible. + * + * @memberof xkb_context + */ +int +xkb_context_include_path_append(struct xkb_context *context, const char *path); + +/** + * Append the default include paths to the context's include path. + * + * @returns 1 on success, or 0 if the primary include path could not be added. + * + * @memberof xkb_context + */ +int +xkb_context_include_path_append_default(struct xkb_context *context); + +/** + * Reset the context's include path to the default. + * + * Removes all entries from the context's include path, and inserts the + * default paths. + * + * @returns 1 on success, or 0 if the primary include path could not be added. + * + * @memberof xkb_context + */ +int +xkb_context_include_path_reset_defaults(struct xkb_context *context); + +/** + * Remove all entries from the context's include path. + * + * @memberof xkb_context + */ +void +xkb_context_include_path_clear(struct xkb_context *context); + +/** + * Get the number of paths in the context's include path. + * + * @memberof xkb_context + */ +unsigned int +xkb_context_num_include_paths(struct xkb_context *context); + +/** + * Get a specific include path from the context's include path. + * + * @returns The include path at the specified index. If the index is + * invalid, returns NULL. + * + * @memberof xkb_context + */ +const char * +xkb_context_include_path_get(struct xkb_context *context, unsigned int index); + +/** @} */ + +/** + * @defgroup logging Logging Handling + * Manipulating how logging from this library is handled. + * + * @{ + */ + +/** Specifies a logging level. */ +enum xkb_log_level { + XKB_LOG_LEVEL_CRITICAL = 10, /**< Log critical internal errors only. */ + XKB_LOG_LEVEL_ERROR = 20, /**< Log all errors. */ + XKB_LOG_LEVEL_WARNING = 30, /**< Log warnings and errors. */ + XKB_LOG_LEVEL_INFO = 40, /**< Log information, warnings, and errors. */ + XKB_LOG_LEVEL_DEBUG = 50 /**< Log everything. */ +}; + +/** + * Set the current logging level. + * + * @param context The context in which to set the logging level. + * @param level The logging level to use. Only messages from this level + * and below will be logged. + * + * The default level is XKB_LOG_LEVEL_ERROR. The environment variable + * XKB_LOG_LEVEL, if set in the time the context was created, overrides the + * default value. It may be specified as a level number or name. + * + * @memberof xkb_context + */ +void +xkb_context_set_log_level(struct xkb_context *context, + enum xkb_log_level level); + +/** + * Get the current logging level. + * + * @memberof xkb_context + */ +enum xkb_log_level +xkb_context_get_log_level(struct xkb_context *context); + +/** + * Sets the current logging verbosity. + * + * The library can generate a number of warnings which are not helpful to + * ordinary users of the library. The verbosity may be increased if more + * information is desired (e.g. when developing a new keymap). + * + * The default verbosity is 0. The environment variable XKB_LOG_VERBOSITY, + * if set in the time the context was created, overrides the default value. + * + * @param context The context in which to use the set verbosity. + * @param verbosity The verbosity to use. Currently used values are + * 1 to 10, higher values being more verbose. 0 would result in no verbose + * messages being logged. + * + * Most verbose messages are of level XKB_LOG_LEVEL_WARNING or lower. + * + * @memberof xkb_context + */ +void +xkb_context_set_log_verbosity(struct xkb_context *context, int verbosity); + +/** + * Get the current logging verbosity of the context. + * + * @memberof xkb_context + */ +int +xkb_context_get_log_verbosity(struct xkb_context *context); + +/** + * Set a custom function to handle logging messages. + * + * @param context The context in which to use the set logging function. + * @param log_fn The function that will be called for logging messages. + * Passing NULL restores the default function, which logs to stderr. + * + * By default, log messages from this library are printed to stderr. This + * function allows you to replace the default behavior with a custom + * handler. The handler is only called with messages which match the + * current logging level and verbosity settings for the context. + * level is the logging level of the message. @a format and @a args are + * the same as in the vprintf(3) function. + * + * You may use xkb_context_set_user_data() on the context, and then call + * xkb_context_get_user_data() from within the logging function to provide + * it with additional private context. + * + * @memberof xkb_context + */ +void +xkb_context_set_log_fn(struct xkb_context *context, + void (*log_fn)(struct xkb_context *context, + enum xkb_log_level level, + const char *format, va_list args)); + +/** @} */ + +/** + * @defgroup keymap Keymap Creation + * Creating and destroying keymaps. + * + * @{ + */ + +/** Flags for keymap compilation. */ +enum xkb_keymap_compile_flags { + /** Do not apply any flags. */ + XKB_KEYMAP_COMPILE_NO_FLAGS = 0 +}; + +/** + * Create a keymap from RMLVO names. + * + * The primary keymap entry point: creates a new XKB keymap from a set of + * RMLVO (Rules + Model + Layouts + Variants + Options) names. + * + * @param context The context in which to create the keymap. + * @param names The RMLVO names to use. See xkb_rule_names. + * @param flags Optional flags for the keymap, or 0. + * + * @returns A keymap compiled according to the RMLVO names, or NULL if + * the compilation failed. + * + * @sa xkb_rule_names + * @memberof xkb_keymap + */ +struct xkb_keymap * +xkb_keymap_new_from_names(struct xkb_context *context, + const struct xkb_rule_names *names, + enum xkb_keymap_compile_flags flags); + +/** The possible keymap formats. */ +enum xkb_keymap_format { + /** The current/classic XKB text format, as generated by xkbcomp -xkb. */ + XKB_KEYMAP_FORMAT_TEXT_V1 = 1 +}; + +/** + * Create a keymap from a keymap file. + * + * @param context The context in which to create the keymap. + * @param file The keymap file to compile. + * @param format The text format of the keymap file to compile. + * @param flags Optional flags for the keymap, or 0. + * + * @returns A keymap compiled from the given XKB keymap file, or NULL if + * the compilation failed. + * + * The file must contain a complete keymap. For example, in the + * XKB_KEYMAP_FORMAT_TEXT_V1 format, this means the file must contain one + * top level '%xkb_keymap' section, which in turn contains other required + * sections. + * + * @memberof xkb_keymap + */ +struct xkb_keymap * +xkb_keymap_new_from_file(struct xkb_context *context, FILE *file, + enum xkb_keymap_format format, + enum xkb_keymap_compile_flags flags); + +/** + * Create a keymap from a keymap string. + * + * This is just like xkb_keymap_new_from_file(), but instead of a file, gets + * the keymap as one enormous string. + * + * @see xkb_keymap_new_from_file() + * @memberof xkb_keymap + */ +struct xkb_keymap * +xkb_keymap_new_from_string(struct xkb_context *context, const char *string, + enum xkb_keymap_format format, + enum xkb_keymap_compile_flags flags); + +/** + * Create a keymap from a memory buffer. + * + * This is just like xkb_keymap_new_from_string(), but takes a length argument + * so the input string does not have to be zero-terminated. + * + * @see xkb_keymap_new_from_string() + * @memberof xkb_keymap + * @since 0.3.0 + */ +struct xkb_keymap * +xkb_keymap_new_from_buffer(struct xkb_context *context, const char *buffer, + size_t length, enum xkb_keymap_format format, + enum xkb_keymap_compile_flags flags); + +/** + * Take a new reference on a keymap. + * + * @returns The passed in keymap. + * + * @memberof xkb_keymap + */ +struct xkb_keymap * +xkb_keymap_ref(struct xkb_keymap *keymap); + +/** + * Release a reference on a keymap, and possibly free it. + * + * @param keymap The keymap. If it is NULL, this function does nothing. + * + * @memberof xkb_keymap + */ +void +xkb_keymap_unref(struct xkb_keymap *keymap); + +/** + * Get the keymap as a string in the format from which it was created. + * @sa xkb_keymap_get_as_string() + **/ +#define XKB_KEYMAP_USE_ORIGINAL_FORMAT ((enum xkb_keymap_format) -1) + +/** + * Get the compiled keymap as a string. + * + * @param keymap The keymap to get as a string. + * @param format The keymap format to use for the string. You can pass + * in the special value XKB_KEYMAP_USE_ORIGINAL_FORMAT to use the format + * from which the keymap was originally created. + * + * @returns The keymap as a NUL-terminated string, or NULL if unsuccessful. + * + * The returned string may be fed back into xkb_keymap_new_from_string() to get + * the exact same keymap (possibly in another process, etc.). + * + * The returned string is dynamically allocated and should be freed by the + * caller. + * + * @memberof xkb_keymap + */ +char * +xkb_keymap_get_as_string(struct xkb_keymap *keymap, + enum xkb_keymap_format format); + +/** @} */ + +/** + * @defgroup components Keymap Components + * Enumeration of state components in a keymap. + * + * @{ + */ + +/** + * Get the minimum keycode in the keymap. + * + * @sa xkb_keycode_t + * @memberof xkb_keymap + * @since 0.3.1 + */ +xkb_keycode_t +xkb_keymap_min_keycode(struct xkb_keymap *keymap); + +/** + * Get the maximum keycode in the keymap. + * + * @sa xkb_keycode_t + * @memberof xkb_keymap + * @since 0.3.1 + */ +xkb_keycode_t +xkb_keymap_max_keycode(struct xkb_keymap *keymap); + +/** + * The iterator used by xkb_keymap_key_for_each(). + * + * @sa xkb_keymap_key_for_each + * @memberof xkb_keymap + * @since 0.3.1 + */ +typedef void +(*xkb_keymap_key_iter_t)(struct xkb_keymap *keymap, xkb_keycode_t key, + void *data); + +/** + * Run a specified function for every valid keycode in the keymap. If a + * keymap is sparse, this function may be called fewer than + * (max_keycode - min_keycode + 1) times. + * + * @sa xkb_keymap_min_keycode() xkb_keymap_max_keycode() xkb_keycode_t + * @memberof xkb_keymap + * @since 0.3.1 + */ +void +xkb_keymap_key_for_each(struct xkb_keymap *keymap, xkb_keymap_key_iter_t iter, + void *data); + +/** + * Find the name of the key with the given keycode. + * + * This function always returns the canonical name of the key (see + * description in xkb_keycode_t). + * + * @returns The key name. If no key with this keycode exists, + * returns NULL. + * + * @sa xkb_keycode_t + * @memberof xkb_keymap + * @since 0.6.0 + */ +const char * +xkb_keymap_key_get_name(struct xkb_keymap *keymap, xkb_keycode_t key); + +/** + * Find the keycode of the key with the given name. + * + * The name can be either a canonical name or an alias. + * + * @returns The keycode. If no key with this name exists, + * returns XKB_KEYCODE_INVALID. + * + * @sa xkb_keycode_t + * @memberof xkb_keymap + * @since 0.6.0 + */ +xkb_keycode_t +xkb_keymap_key_by_name(struct xkb_keymap *keymap, const char *name); + +/** + * Get the number of modifiers in the keymap. + * + * @sa xkb_mod_index_t + * @memberof xkb_keymap + */ +xkb_mod_index_t +xkb_keymap_num_mods(struct xkb_keymap *keymap); + +/** + * Get the name of a modifier by index. + * + * @returns The name. If the index is invalid, returns NULL. + * + * @sa xkb_mod_index_t + * @memberof xkb_keymap + */ +const char * +xkb_keymap_mod_get_name(struct xkb_keymap *keymap, xkb_mod_index_t idx); + +/** + * Get the index of a modifier by name. + * + * @returns The index. If no modifier with this name exists, returns + * XKB_MOD_INVALID. + * + * @sa xkb_mod_index_t + * @memberof xkb_keymap + */ +xkb_mod_index_t +xkb_keymap_mod_get_index(struct xkb_keymap *keymap, const char *name); + +/** + * Get the number of layouts in the keymap. + * + * @sa xkb_layout_index_t xkb_rule_names xkb_keymap_num_layouts_for_key() + * @memberof xkb_keymap + */ +xkb_layout_index_t +xkb_keymap_num_layouts(struct xkb_keymap *keymap); + +/** + * Get the name of a layout by index. + * + * @returns The name. If the index is invalid, or the layout does not have + * a name, returns NULL. + * + * @sa xkb_layout_index_t + * For notes on layout names. + * @memberof xkb_keymap + */ +const char * +xkb_keymap_layout_get_name(struct xkb_keymap *keymap, xkb_layout_index_t idx); + +/** + * Get the index of a layout by name. + * + * @returns The index. If no layout exists with this name, returns + * XKB_LAYOUT_INVALID. If more than one layout in the keymap has this name, + * returns the lowest index among them. + * + * @sa xkb_layout_index_t + * For notes on layout names. + * @memberof xkb_keymap + */ +xkb_layout_index_t +xkb_keymap_layout_get_index(struct xkb_keymap *keymap, const char *name); + +/** + * Get the number of LEDs in the keymap. + * + * @warning The range [ 0...xkb_keymap_num_leds() ) includes all of the LEDs + * in the keymap, but may also contain inactive LEDs. When iterating over + * this range, you need the handle this case when calling functions such as + * xkb_keymap_led_get_name() or xkb_state_led_index_is_active(). + * + * @sa xkb_led_index_t + * @memberof xkb_keymap + */ +xkb_led_index_t +xkb_keymap_num_leds(struct xkb_keymap *keymap); + +/** + * Get the name of a LED by index. + * + * @returns The name. If the index is invalid, returns NULL. + * + * @memberof xkb_keymap + */ +const char * +xkb_keymap_led_get_name(struct xkb_keymap *keymap, xkb_led_index_t idx); + +/** + * Get the index of a LED by name. + * + * @returns The index. If no LED with this name exists, returns + * XKB_LED_INVALID. + * + * @memberof xkb_keymap + */ +xkb_led_index_t +xkb_keymap_led_get_index(struct xkb_keymap *keymap, const char *name); + +/** + * Get the number of layouts for a specific key. + * + * This number can be different from xkb_keymap_num_layouts(), but is always + * smaller. It is the appropriate value to use when iterating over the + * layouts of a key. + * + * @sa xkb_layout_index_t + * @memberof xkb_keymap + */ +xkb_layout_index_t +xkb_keymap_num_layouts_for_key(struct xkb_keymap *keymap, xkb_keycode_t key); + +/** + * Get the number of shift levels for a specific key and layout. + * + * If @c layout is out of range for this key (that is, larger or equal to + * the value returned by xkb_keymap_num_layouts_for_key()), it is brought + * back into range in a manner consistent with xkb_state_key_get_layout(). + * + * @sa xkb_level_index_t + * @memberof xkb_keymap + */ +xkb_level_index_t +xkb_keymap_num_levels_for_key(struct xkb_keymap *keymap, xkb_keycode_t key, + xkb_layout_index_t layout); + +/** + * Retrieves every possible modifier mask that produces the specified + * shift level for a specific key and layout. + * + * This API is useful for inverse key transformation; i.e. finding out + * which modifiers need to be active in order to be able to type the + * keysym(s) corresponding to the specific key code, layout and level. + * + * @warning It returns only up to masks_size modifier masks. If the + * buffer passed is too small, some of the possible modifier combinations + * will not be returned. + * + * @param[in] keymap The keymap. + * @param[in] key The keycode of the key. + * @param[in] layout The layout for which to get modifiers. + * @param[in] level The shift level in the layout for which to get the + * modifiers. This should be smaller than: + * @code xkb_keymap_num_levels_for_key(keymap, key) @endcode + * @param[out] masks_out A buffer in which the requested masks should be + * stored. + * @param[out] masks_size The size of the buffer pointed to by masks_out. + * + * If @c layout is out of range for this key (that is, larger or equal to + * the value returned by xkb_keymap_num_layouts_for_key()), it is brought + * back into range in a manner consistent with xkb_state_key_get_layout(). + * + * @returns The number of modifier masks stored in the masks_out array. + * If the key is not in the keymap or if the specified shift level cannot + * be reached it returns 0 and does not modify the masks_out buffer. + * + * @sa xkb_level_index_t + * @sa xkb_mod_mask_t + * @memberof xkb_keymap + * @since 1.0.0 + */ +size_t +xkb_keymap_key_get_mods_for_level(struct xkb_keymap *keymap, + xkb_keycode_t key, + xkb_layout_index_t layout, + xkb_level_index_t level, + xkb_mod_mask_t *masks_out, + size_t masks_size); + +/** + * Get the keysyms obtained from pressing a key in a given layout and + * shift level. + * + * This function is like xkb_state_key_get_syms(), only the layout and + * shift level are not derived from the keyboard state but are instead + * specified explicitly. + * + * @param[in] keymap The keymap. + * @param[in] key The keycode of the key. + * @param[in] layout The layout for which to get the keysyms. + * @param[in] level The shift level in the layout for which to get the + * keysyms. This should be smaller than: + * @code xkb_keymap_num_levels_for_key(keymap, key) @endcode + * @param[out] syms_out An immutable array of keysyms corresponding to the + * key in the given layout and shift level. + * + * If @c layout is out of range for this key (that is, larger or equal to + * the value returned by xkb_keymap_num_layouts_for_key()), it is brought + * back into range in a manner consistent with xkb_state_key_get_layout(). + * + * @returns The number of keysyms in the syms_out array. If no keysyms + * are produced by the key in the given layout and shift level, returns 0 + * and sets syms_out to NULL. + * + * @sa xkb_state_key_get_syms() + * @memberof xkb_keymap + */ +int +xkb_keymap_key_get_syms_by_level(struct xkb_keymap *keymap, + xkb_keycode_t key, + xkb_layout_index_t layout, + xkb_level_index_t level, + const xkb_keysym_t **syms_out); + +/** + * Determine whether a key should repeat or not. + * + * A keymap may specify different repeat behaviors for different keys. + * Most keys should generally exhibit repeat behavior; for example, holding + * the 'a' key down in a text editor should normally insert a single 'a' + * character every few milliseconds, until the key is released. However, + * there are keys which should not or do not need to be repeated. For + * example, repeating modifier keys such as Left/Right Shift or Caps Lock + * is not generally useful or desired. + * + * @returns 1 if the key should repeat, 0 otherwise. + * + * @memberof xkb_keymap + */ +int +xkb_keymap_key_repeats(struct xkb_keymap *keymap, xkb_keycode_t key); + +/** @} */ + +/** + * @defgroup state Keyboard State + * Creating, destroying and manipulating keyboard state objects. + * + * @{ + */ + +/** + * Create a new keyboard state object. + * + * @param keymap The keymap which the state will use. + * + * @returns A new keyboard state object, or NULL on failure. + * + * @memberof xkb_state + */ +struct xkb_state * +xkb_state_new(struct xkb_keymap *keymap); + +/** + * Take a new reference on a keyboard state object. + * + * @returns The passed in object. + * + * @memberof xkb_state + */ +struct xkb_state * +xkb_state_ref(struct xkb_state *state); + +/** + * Release a reference on a keybaord state object, and possibly free it. + * + * @param state The state. If it is NULL, this function does nothing. + * + * @memberof xkb_state + */ +void +xkb_state_unref(struct xkb_state *state); + +/** + * Get the keymap which a keyboard state object is using. + * + * @returns The keymap which was passed to xkb_state_new() when creating + * this state object. + * + * This function does not take a new reference on the keymap; you must + * explicitly reference it yourself if you plan to use it beyond the + * lifetime of the state. + * + * @memberof xkb_state + */ +struct xkb_keymap * +xkb_state_get_keymap(struct xkb_state *state); + +/** Specifies the direction of the key (press / release). */ +enum xkb_key_direction { + XKB_KEY_UP, /**< The key was released. */ + XKB_KEY_DOWN /**< The key was pressed. */ +}; + +/** + * Modifier and layout types for state objects. This enum is bitmaskable, + * e.g. (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED) is valid to + * exclude locked modifiers. + * + * In XKB, the DEPRESSED components are also known as 'base'. + */ +enum xkb_state_component { + /** Depressed modifiers, i.e. a key is physically holding them. */ + XKB_STATE_MODS_DEPRESSED = (1 << 0), + /** Latched modifiers, i.e. will be unset after the next non-modifier + * key press. */ + XKB_STATE_MODS_LATCHED = (1 << 1), + /** Locked modifiers, i.e. will be unset after the key provoking the + * lock has been pressed again. */ + XKB_STATE_MODS_LOCKED = (1 << 2), + /** Effective modifiers, i.e. currently active and affect key + * processing (derived from the other state components). + * Use this unless you explicitly care how the state came about. */ + XKB_STATE_MODS_EFFECTIVE = (1 << 3), + /** Depressed layout, i.e. a key is physically holding it. */ + XKB_STATE_LAYOUT_DEPRESSED = (1 << 4), + /** Latched layout, i.e. will be unset after the next non-modifier + * key press. */ + XKB_STATE_LAYOUT_LATCHED = (1 << 5), + /** Locked layout, i.e. will be unset after the key provoking the lock + * has been pressed again. */ + XKB_STATE_LAYOUT_LOCKED = (1 << 6), + /** Effective layout, i.e. currently active and affects key processing + * (derived from the other state components). + * Use this unless you explicitly care how the state came about. */ + XKB_STATE_LAYOUT_EFFECTIVE = (1 << 7), + /** LEDs (derived from the other state components). */ + XKB_STATE_LEDS = (1 << 8) +}; + +/** + * Update the keyboard state to reflect a given key being pressed or + * released. + * + * This entry point is intended for programs which track the keyboard state + * explicitly (like an evdev client). If the state is serialized to you by + * a master process (like a Wayland compositor) using functions like + * xkb_state_serialize_mods(), you should use xkb_state_update_mask() instead. + * The two functions should not generally be used together. + * + * A series of calls to this function should be consistent; that is, a call + * with XKB_KEY_DOWN for a key should be matched by an XKB_KEY_UP; if a key + * is pressed twice, it should be released twice; etc. Otherwise (e.g. due + * to missed input events), situations like "stuck modifiers" may occur. + * + * This function is often used in conjunction with the function + * xkb_state_key_get_syms() (or xkb_state_key_get_one_sym()), for example, + * when handling a key event. In this case, you should prefer to get the + * keysyms *before* updating the key, such that the keysyms reported for + * the key event are not affected by the event itself. This is the + * conventional behavior. + * + * @returns A mask of state components that have changed as a result of + * the update. If nothing in the state has changed, returns 0. + * + * @memberof xkb_state + * + * @sa xkb_state_update_mask() + */ +enum xkb_state_component +xkb_state_update_key(struct xkb_state *state, xkb_keycode_t key, + enum xkb_key_direction direction); + +/** + * Update a keyboard state from a set of explicit masks. + * + * This entry point is intended for window systems and the like, where a + * master process holds an xkb_state, then serializes it over a wire + * protocol, and clients then use the serialization to feed in to their own + * xkb_state. + * + * All parameters must always be passed, or the resulting state may be + * incoherent. + * + * The serialization is lossy and will not survive round trips; it must only + * be used to feed slave state objects, and must not be used to update the + * master state. + * + * If you do not fit the description above, you should use + * xkb_state_update_key() instead. The two functions should not generally be + * used together. + * + * @returns A mask of state components that have changed as a result of + * the update. If nothing in the state has changed, returns 0. + * + * @memberof xkb_state + * + * @sa xkb_state_component + * @sa xkb_state_update_key + */ +enum xkb_state_component +xkb_state_update_mask(struct xkb_state *state, + xkb_mod_mask_t depressed_mods, + xkb_mod_mask_t latched_mods, + xkb_mod_mask_t locked_mods, + xkb_layout_index_t depressed_layout, + xkb_layout_index_t latched_layout, + xkb_layout_index_t locked_layout); + +/** + * Get the keysyms obtained from pressing a particular key in a given + * keyboard state. + * + * Get the keysyms for a key according to the current active layout, + * modifiers and shift level for the key, as determined by a keyboard + * state. + * + * @param[in] state The keyboard state object. + * @param[in] key The keycode of the key. + * @param[out] syms_out An immutable array of keysyms corresponding the + * key in the given keyboard state. + * + * As an extension to XKB, this function can return more than one keysym. + * If you do not want to handle this case, you can use + * xkb_state_key_get_one_sym() for a simpler interface. + * + * This function does not perform any @ref keysym-transformations. + * (This might change). + * + * @returns The number of keysyms in the syms_out array. If no keysyms + * are produced by the key in the given keyboard state, returns 0 and sets + * syms_out to NULL. + * + * @memberof xkb_state + */ +int +xkb_state_key_get_syms(struct xkb_state *state, xkb_keycode_t key, + const xkb_keysym_t **syms_out); + +/** + * Get the Unicode/UTF-8 string obtained from pressing a particular key + * in a given keyboard state. + * + * @param[in] state The keyboard state object. + * @param[in] key The keycode of the key. + * @param[out] buffer A buffer to write the string into. + * @param[in] size Size of the buffer. + * + * @warning If the buffer passed is too small, the string is truncated + * (though still NUL-terminated). + * + * @returns The number of bytes required for the string, excluding the + * NUL byte. If there is nothing to write, returns 0. + * + * You may check if truncation has occurred by comparing the return value + * with the size of @p buffer, similarly to the snprintf(3) function. + * You may safely pass NULL and 0 to @p buffer and @p size to find the + * required size (without the NUL-byte). + * + * This function performs Capitalization and Control @ref + * keysym-transformations. + * + * @memberof xkb_state + * @since 0.4.1 + */ +int +xkb_state_key_get_utf8(struct xkb_state *state, xkb_keycode_t key, + char *buffer, size_t size); + +/** + * Get the Unicode/UTF-32 codepoint obtained from pressing a particular + * key in a a given keyboard state. + * + * @returns The UTF-32 representation for the key, if it consists of only + * a single codepoint. Otherwise, returns 0. + * + * This function performs Capitalization and Control @ref + * keysym-transformations. + * + * @memberof xkb_state + * @since 0.4.1 + */ +uint32_t +xkb_state_key_get_utf32(struct xkb_state *state, xkb_keycode_t key); + +/** + * Get the single keysym obtained from pressing a particular key in a + * given keyboard state. + * + * This function is similar to xkb_state_key_get_syms(), but intended + * for users which cannot or do not want to handle the case where + * multiple keysyms are returned (in which case this function is + * preferred). + * + * @returns The keysym. If the key does not have exactly one keysym, + * returns XKB_KEY_NoSymbol + * + * This function performs Capitalization @ref keysym-transformations. + * + * @sa xkb_state_key_get_syms() + * @memberof xkb_state + */ +xkb_keysym_t +xkb_state_key_get_one_sym(struct xkb_state *state, xkb_keycode_t key); + +/** + * Get the effective layout index for a key in a given keyboard state. + * + * @returns The layout index for the key in the given keyboard state. If + * the given keycode is invalid, or if the key is not included in any + * layout at all, returns XKB_LAYOUT_INVALID. + * + * @invariant If the returned layout is valid, the following always holds: + * @code + * xkb_state_key_get_layout(state, key) < xkb_keymap_num_layouts_for_key(keymap, key) + * @endcode + * + * @memberof xkb_state + */ +xkb_layout_index_t +xkb_state_key_get_layout(struct xkb_state *state, xkb_keycode_t key); + +/** + * Get the effective shift level for a key in a given keyboard state and + * layout. + * + * @param state The keyboard state. + * @param key The keycode of the key. + * @param layout The layout for which to get the shift level. This must be + * smaller than: + * @code xkb_keymap_num_layouts_for_key(keymap, key) @endcode + * usually it would be: + * @code xkb_state_key_get_layout(state, key) @endcode + * + * @return The shift level index. If the key or layout are invalid, + * returns XKB_LEVEL_INVALID. + * + * @invariant If the returned level is valid, the following always holds: + * @code + * xkb_state_key_get_level(state, key, layout) < xkb_keymap_num_levels_for_key(keymap, key, layout) + * @endcode + * + * @memberof xkb_state + */ +xkb_level_index_t +xkb_state_key_get_level(struct xkb_state *state, xkb_keycode_t key, + xkb_layout_index_t layout); + +/** + * Match flags for xkb_state_mod_indices_are_active() and + * xkb_state_mod_names_are_active(), specifying the conditions for a + * successful match. XKB_STATE_MATCH_NON_EXCLUSIVE is bitmaskable with + * the other modes. + */ +enum xkb_state_match { + /** Returns true if any of the modifiers are active. */ + XKB_STATE_MATCH_ANY = (1 << 0), + /** Returns true if all of the modifiers are active. */ + XKB_STATE_MATCH_ALL = (1 << 1), + /** Makes matching non-exclusive, i.e. will not return false if a + * modifier not specified in the arguments is active. */ + XKB_STATE_MATCH_NON_EXCLUSIVE = (1 << 16) +}; + +/** + * The counterpart to xkb_state_update_mask for modifiers, to be used on + * the server side of serialization. + * + * @param state The keyboard state. + * @param components A mask of the modifier state components to serialize. + * State components other than XKB_STATE_MODS_* are ignored. + * If XKB_STATE_MODS_EFFECTIVE is included, all other state components are + * ignored. + * + * @returns A xkb_mod_mask_t representing the given components of the + * modifier state. + * + * This function should not be used in regular clients; please use the + * xkb_state_mod_*_is_active API instead. + * + * @memberof xkb_state + */ +xkb_mod_mask_t +xkb_state_serialize_mods(struct xkb_state *state, + enum xkb_state_component components); + +/** + * The counterpart to xkb_state_update_mask for layouts, to be used on + * the server side of serialization. + * + * @param state The keyboard state. + * @param components A mask of the layout state components to serialize. + * State components other than XKB_STATE_LAYOUT_* are ignored. + * If XKB_STATE_LAYOUT_EFFECTIVE is included, all other state components are + * ignored. + * + * @returns A layout index representing the given components of the + * layout state. + * + * This function should not be used in regular clients; please use the + * xkb_state_layout_*_is_active API instead. + * + * @memberof xkb_state + */ +xkb_layout_index_t +xkb_state_serialize_layout(struct xkb_state *state, + enum xkb_state_component components); + +/** + * Test whether a modifier is active in a given keyboard state by name. + * + * @returns 1 if the modifier is active, 0 if it is not. If the modifier + * name does not exist in the keymap, returns -1. + * + * @memberof xkb_state + */ +int +xkb_state_mod_name_is_active(struct xkb_state *state, const char *name, + enum xkb_state_component type); + +/** + * Test whether a set of modifiers are active in a given keyboard state by + * name. + * + * @param state The keyboard state. + * @param type The component of the state against which to match the + * given modifiers. + * @param match The manner by which to match the state against the + * given modifiers. + * @param ... The set of of modifier names to test, terminated by a NULL + * argument (sentinel). + * + * @returns 1 if the modifiers are active, 0 if they are not. If any of + * the modifier names do not exist in the keymap, returns -1. + * + * @memberof xkb_state + */ +int +xkb_state_mod_names_are_active(struct xkb_state *state, + enum xkb_state_component type, + enum xkb_state_match match, + ...); + +/** + * Test whether a modifier is active in a given keyboard state by index. + * + * @returns 1 if the modifier is active, 0 if it is not. If the modifier + * index is invalid in the keymap, returns -1. + * + * @memberof xkb_state + */ +int +xkb_state_mod_index_is_active(struct xkb_state *state, xkb_mod_index_t idx, + enum xkb_state_component type); + +/** + * Test whether a set of modifiers are active in a given keyboard state by + * index. + * + * @param state The keyboard state. + * @param type The component of the state against which to match the + * given modifiers. + * @param match The manner by which to match the state against the + * given modifiers. + * @param ... The set of of modifier indices to test, terminated by a + * XKB_MOD_INVALID argument (sentinel). + * + * @returns 1 if the modifiers are active, 0 if they are not. If any of + * the modifier indices are invalid in the keymap, returns -1. + * + * @memberof xkb_state + */ +int +xkb_state_mod_indices_are_active(struct xkb_state *state, + enum xkb_state_component type, + enum xkb_state_match match, + ...); + +/** + * @page consumed-modifiers Consumed Modifiers + * @parblock + * + * Some functions, like xkb_state_key_get_syms(), look at the state of + * the modifiers in the keymap and derive from it the correct shift level + * to use for the key. For example, in a US layout, pressing the key + * labeled \ while the Shift modifier is active, generates the keysym + * 'A'. In this case, the Shift modifier is said to be "consumed". + * However, the Num Lock modifier does not affect this translation at all, + * even if it is active, so it is not consumed by this translation. + * + * It may be desirable for some application to not reuse consumed modifiers + * for further processing, e.g. for hotkeys or keyboard shortcuts. To + * understand why, consider some requirements from a standard shortcut + * mechanism, and how they are implemented: + * + * 1. The shortcut's modifiers must match exactly to the state. For + * example, it is possible to bind separate actions to \\ + * and to \\\. Further, if only \\ is + * bound to an action, pressing \\\ should not + * trigger the shortcut. + * Effectively, this means that the modifiers are compared using the + * equality operator (==). + * + * 2. Only relevant modifiers are considered for the matching. For example, + * Caps Lock and Num Lock should not generally affect the matching, e.g. + * when matching \\ against the state, it does not matter + * whether Num Lock is active or not. These relevant, or "significant", + * modifiers usually include Alt, Control, Shift, Super and similar. + * Effectively, this means that non-significant modifiers are masked out, + * before doing the comparison as described above. + * + * 3. The matching must be independent of the layout/keymap. For example, + * the \ (+) symbol is found on the first level on some layouts, + * but requires holding Shift on others. If you simply bind the action + * to the \ keysym, it would work for the unshifted kind, but + * not for the others, because the match against Shift would fail. If + * you bind the action to \\, only the shifted kind would + * work. So what is needed is to recognize that Shift is used up in the + * translation of the keysym itself, and therefore should not be included + * in the matching. + * Effectively, this means that consumed modifiers (Shift in this example) + * are masked out as well, before doing the comparison. + * + * In summary, this is approximately how the matching would be performed: + * @code + * (keysym == shortcut_keysym) && + * ((state_mods & ~consumed_mods & significant_mods) == shortcut_mods) + * @endcode + * + * @c state_mods are the modifiers reported by + * xkb_state_mod_index_is_active() and similar functions. + * @c consumed_mods are the modifiers reported by + * xkb_state_mod_index_is_consumed() and similar functions. + * @c significant_mods are decided upon by the application/toolkit/user; + * it is up to them to decide whether these are configurable or hard-coded. + * + * @endparblock + */ + +/** + * Consumed modifiers mode. + * + * There are several possible methods for deciding which modifiers are + * consumed and which are not, each applicable for different systems or + * situations. The mode selects the method to use. + * + * Keep in mind that in all methods, the keymap may decide to "preserve" + * a modifier, meaning it is not reported as consumed even if it would + * have otherwise. + */ +enum xkb_consumed_mode { + /** + * This is the mode defined in the XKB specification and used by libX11. + * + * A modifier is consumed if and only if it *may affect* key translation. + * + * For example, if `Control+Alt+` produces some assigned keysym, + * then when pressing just ``, `Control` and `Alt` are consumed, + * even though they are not active, since if they *were* active they would + * have affected key translation. + */ + XKB_CONSUMED_MODE_XKB, + /** + * This is the mode used by the GTK+ toolkit. + * + * The mode consists of the following two independent heuristics: + * + * - The currently active set of modifiers, excluding modifiers which do + * not affect the key (as described for @ref XKB_CONSUMED_MODE_XKB), are + * considered consumed, if the keysyms produced when all of them are + * active are different from the keysyms produced when no modifiers are + * active. + * + * - A single modifier is considered consumed if the keysyms produced for + * the key when it is the only active modifier are different from the + * keysyms produced when no modifiers are active. + */ + XKB_CONSUMED_MODE_GTK +}; + +/** + * Get the mask of modifiers consumed by translating a given key. + * + * @param state The keyboard state. + * @param key The keycode of the key. + * @param mode The consumed modifiers mode to use; see enum description. + * + * @returns a mask of the consumed modifiers. + * + * @memberof xkb_state + * @since 0.7.0 + */ +xkb_mod_mask_t +xkb_state_key_get_consumed_mods2(struct xkb_state *state, xkb_keycode_t key, + enum xkb_consumed_mode mode); + +/** + * Same as xkb_state_key_get_consumed_mods2() with mode XKB_CONSUMED_MODE_XKB. + * + * @memberof xkb_state + * @since 0.4.1 + */ +xkb_mod_mask_t +xkb_state_key_get_consumed_mods(struct xkb_state *state, xkb_keycode_t key); + +/** + * Test whether a modifier is consumed by keyboard state translation for + * a key. + * + * @param state The keyboard state. + * @param key The keycode of the key. + * @param idx The index of the modifier to check. + * @param mode The consumed modifiers mode to use; see enum description. + * + * @returns 1 if the modifier is consumed, 0 if it is not. If the modifier + * index is not valid in the keymap, returns -1. + * + * @sa xkb_state_mod_mask_remove_consumed() + * @sa xkb_state_key_get_consumed_mods() + * @memberof xkb_state + * @since 0.7.0 + */ +int +xkb_state_mod_index_is_consumed2(struct xkb_state *state, + xkb_keycode_t key, + xkb_mod_index_t idx, + enum xkb_consumed_mode mode); + +/** + * Same as xkb_state_mod_index_is_consumed2() with mode XKB_CONSUMED_MOD_XKB. + * + * @memberof xkb_state + * @since 0.4.1 + */ +int +xkb_state_mod_index_is_consumed(struct xkb_state *state, xkb_keycode_t key, + xkb_mod_index_t idx); + +/** + * Remove consumed modifiers from a modifier mask for a key. + * + * @deprecated Use xkb_state_key_get_consumed_mods2() instead. + * + * Takes the given modifier mask, and removes all modifiers which are + * consumed for that particular key (as in xkb_state_mod_index_is_consumed()). + * + * @sa xkb_state_mod_index_is_consumed() + * @memberof xkb_state + */ +xkb_mod_mask_t +xkb_state_mod_mask_remove_consumed(struct xkb_state *state, xkb_keycode_t key, + xkb_mod_mask_t mask); + +/** + * Test whether a layout is active in a given keyboard state by name. + * + * @returns 1 if the layout is active, 0 if it is not. If no layout with + * this name exists in the keymap, return -1. + * + * If multiple layouts in the keymap have this name, the one with the lowest + * index is tested. + * + * @sa xkb_layout_index_t + * @memberof xkb_state + */ +int +xkb_state_layout_name_is_active(struct xkb_state *state, const char *name, + enum xkb_state_component type); + +/** + * Test whether a layout is active in a given keyboard state by index. + * + * @returns 1 if the layout is active, 0 if it is not. If the layout index + * is not valid in the keymap, returns -1. + * + * @sa xkb_layout_index_t + * @memberof xkb_state + */ +int +xkb_state_layout_index_is_active(struct xkb_state *state, + xkb_layout_index_t idx, + enum xkb_state_component type); + +/** + * Test whether a LED is active in a given keyboard state by name. + * + * @returns 1 if the LED is active, 0 if it not. If no LED with this name + * exists in the keymap, returns -1. + * + * @sa xkb_led_index_t + * @memberof xkb_state + */ +int +xkb_state_led_name_is_active(struct xkb_state *state, const char *name); + +/** + * Test whether a LED is active in a given keyboard state by index. + * + * @returns 1 if the LED is active, 0 if it not. If the LED index is not + * valid in the keymap, returns -1. + * + * @sa xkb_led_index_t + * @memberof xkb_state + */ +int +xkb_state_led_index_is_active(struct xkb_state *state, xkb_led_index_t idx); + +/** @} */ + +/* Leave this include last, so it can pick up our types, etc. */ +#include + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* _XKBCOMMON_H_ */ diff --git a/include/xkbcommon/xkbregistry.h b/include/xkbcommon/xkbregistry.h new file mode 100644 index 0000000..4e7e926 --- /dev/null +++ b/include/xkbcommon/xkbregistry.h @@ -0,0 +1,782 @@ +/* + * Copyright © 2020 Red Hat, Inc. + * + * 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. + */ + + +#ifndef _XKBREGISTRY_H_ +#define _XKBREGISTRY_H_ + +#include +#include + +/** + * @file + * @brief Query for available RMLVO + * + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup registry Query for available RMLVO + * + * The libxkbregistry API to query for available rules, models, layouts, + * variants and options (RMLVO). libxkbregistry is a separate library to + * libxkbcommon. + * + * This library is the replacement for clients currently parsing evdev.xml + * directly. The library is intended to provide easy access to the set of + * **possible** MLVO configurations for a given ruleset. It is not a library to + * apply these configurations, merely to enumerate them. The intended users of + * this library are the configuration UIs that allow a user to select their + * keyboard layout of choice. + * + * @{ + */ + +/** + * @struct rxkb_context + * + * Opaque top level library context object. + * + * The context contains general library state, like include paths and parsed + * data. Objects are created in a specific context, and multiple contexts + * may coexist simultaneously. Objects from different contexts are + * completely separated and do not share any memory or state. + */ +struct rxkb_context; + +/** + * @struct rxkb_model + * + * Opaque struct representing an XKB model. + */ +struct rxkb_model; + +/** + * @struct rxkb_layout + * + * Opaque struct representing an XKB layout, including an optional variant. + * Where the variant is NULL, the layout is the base layout. + * + * For example, "us" is the base layout, "us(intl)" is the "intl" variant of the + * layout "us". + */ +struct rxkb_layout; + +/** + * @struct rxkb_option_group + * + * Opaque struct representing an option group. Option groups divide the + * individual options into logical groups. Their main purpose is to indicate + * whether some options are mutually exclusive or not. + */ +struct rxkb_option_group; + +/** + * @struct rxkb_option + * + * Opaque struct representing an XKB option. Options are grouped inside an @ref + * rxkb_option_group. + */ +struct rxkb_option; + +/** + * + * @struct rxkb_iso639_code + * + * Opaque struct representing an ISO 639-3 code (e.g. "eng", "fra"). There + * is no guarantee that two identical ISO codes share the same struct. You + * must not rely on the pointer value of this struct. + * + * See https://iso639-3.sil.org/code_tables/639/data for a list of codes. + */ +struct rxkb_iso639_code; + +/** + * + * @struct rxkb_iso3166_code + * + * Opaque struct representing an ISO 3166 Alpha 2 code (e.g. "US", "FR"). + * There is no guarantee that two identical ISO codes share the same struct. + * You must not rely on the pointer value of this struct. + * + * See https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes for a list + * of codes. + */ +struct rxkb_iso3166_code; + +/** + * Describes the popularity of an item. Historically, some highly specialized or + * experimental definitions are excluded from the default list and shipped in + * separate files. If these extra definitions are loaded (see @ref + * RXKB_CONTEXT_LOAD_EXOTIC_RULES), the popularity of the item is set + * accordingly. + * + * If the exotic items are not loaded, all items will have the standard + * popularity. + */ +enum rxkb_popularity { + RXKB_POPULARITY_STANDARD = 1, + RXKB_POPULARITY_EXOTIC, +}; + +/** + * Flags for context creation. + */ +enum rxkb_context_flags { + RXKB_CONTEXT_NO_FLAGS = 0, + /** + * Skip the default include paths. This requires the caller to call + * rxkb_context_include_path_append() or + * rxkb_context_include_path_append_default(). + */ + RXKB_CONTEXT_NO_DEFAULT_INCLUDES = (1 << 0), + /** + * Load the extra items that are considered too exotic for the default list. + * + * For historical reasons, xkeyboard-config ships those exotic rules in a + * separate file (e.g. `evdev.extras.xml`). Where the exotic rules are + * requested, libxkbregistry will look for and load `$ruleset.extras.xml` + * in the include paths, see rxkb_context_include_path_append() for details + * on the lookup behavior. + */ + RXKB_CONTEXT_LOAD_EXOTIC_RULES = (1 << 1), +}; + +/** + * Create a new xkb registry context. + * + * The context has an initial refcount of 1. Use rxkb_context_unref() to release + * memory associated with this context. + * + * Creating a context does not parse the files yet, use + * rxkb_context_parse(). + * + * @param flags Flags affecting context behavior + * @return A new xkb registry context or NULL on failure + */ +struct rxkb_context * +rxkb_context_new(enum rxkb_context_flags flags); + +/** Specifies a logging level. */ +enum rxkb_log_level { + RXKB_LOG_LEVEL_CRITICAL = 10, /**< Log critical internal errors only. */ + RXKB_LOG_LEVEL_ERROR = 20, /**< Log all errors. */ + RXKB_LOG_LEVEL_WARNING = 30, /**< Log warnings and errors. */ + RXKB_LOG_LEVEL_INFO = 40, /**< Log information, warnings, and errors. */ + RXKB_LOG_LEVEL_DEBUG = 50 /**< Log everything. */ +}; + +/** + * Set the current logging level. + * + * @param ctx The context in which to set the logging level. + * @param level The logging level to use. Only messages from this level + * and below will be logged. + * + * The default level is RXKB_LOG_LEVEL_ERROR. The environment variable + * RXKB_LOG_LEVEL, if set at the time the context was created, overrides the + * default value. It may be specified as a level number or name. + */ +void +rxkb_context_set_log_level(struct rxkb_context *ctx, + enum rxkb_log_level level); + +/** + * Get the current logging level. + */ +enum rxkb_log_level +rxkb_context_get_log_level(struct rxkb_context *ctx); + +/** + * Set a custom function to handle logging messages. + * + * @param ctx The context in which to use the set logging function. + * @param log_fn The function that will be called for logging messages. + * Passing NULL restores the default function, which logs to stderr. + * + * By default, log messages from this library are printed to stderr. This + * function allows you to replace the default behavior with a custom + * handler. The handler is only called with messages which match the + * current logging level and verbosity settings for the context. + * level is the logging level of the message. @a format and @a args are + * the same as in the vprintf(3) function. + * + * You may use rxkb_context_set_user_data() on the context, and then call + * rxkb_context_get_user_data() from within the logging function to provide + * it with additional private context. + */ +void +rxkb_context_set_log_fn(struct rxkb_context *ctx, + void (*log_fn)(struct rxkb_context *ctx, + enum rxkb_log_level level, + const char *format, va_list args)); + + +/** + * Parse the given ruleset. This can only be called once per context and once + * parsed the data in the context is considered constant and will never + * change. + * + * This function parses all files with the given ruleset name. See + * rxkb_context_include_path_append() for details. + * + * If this function returns false, libxkbregistry failed to parse the xml files. + * This is usually caused by invalid files on the host and should be debugged by + * the host's administrator using external tools. Callers should reduce the + * include paths to known good paths and/or fall back to a default RMLVO set. + * + * If this function returns false, the context should be be considered dead and + * must be released with rxkb_context_unref(). + * + * @param ctx The xkb registry context + * @param ruleset The ruleset to parse, e.g. "evdev" + * @return true on success or false on failure + */ +bool +rxkb_context_parse(struct rxkb_context *ctx, const char *ruleset); + +/** + * Parse the default ruleset as configured at build time. See + * rxkb_context_parse() for details. + */ +bool +rxkb_context_parse_default_ruleset(struct rxkb_context *ctx); + +/** + * Increases the refcount of this object by one and returns the object. + * + * @param ctx The xkb registry context + * @return The passed in object + */ +struct rxkb_context* +rxkb_context_ref(struct rxkb_context *ctx); + +/** + * Decreases the refcount of this object by one. Where the refcount of an + * object hits zero, associated resources will be freed. + * + * @param ctx The xkb registry context + * @return always NULL + */ +struct rxkb_context* +rxkb_context_unref(struct rxkb_context *ctx); + +/** + * Assign user-specific data. libxkbregistry will not look at or modify the + * data, it will merely return the same pointer in + * rxkb_context_get_user_data(). + * + * @param ctx The xkb registry context + * @param user_data User-specific data pointer + */ +void +rxkb_context_set_user_data(struct rxkb_context *ctx, void *user_data); + +/** + * Return the pointer passed into rxkb_context_get_user_data(). + * + * @param ctx The xkb registry context + * @return User-specific data pointer + */ +void * +rxkb_context_get_user_data(struct rxkb_context *ctx); + +/** + * Append a new entry to the context's include path. + * + * The include path handling is optimized for the most common use-case: a set of + * system files that provide a complete set of MLVO and some + * custom MLVO provided by a user **in addition** to the system set. + * + * The include paths should be given so that the least complete path is + * specified first and the most complete path is appended last. For example: + * + * @code + * ctx = rxkb_context_new(RXKB_CONTEXT_NO_DEFAULT_INCLUDES); + * rxkb_context_include_path_append(ctx, "/home/user/.config/xkb"); + * rxkb_context_include_path_append(ctx, "/usr/share/X11/xkb"); + * rxkb_context_parse(ctx, "evdev"); + * @endcode + * + * The above example reflects the default behavior unless @ref + * RXKB_CONTEXT_NO_DEFAULT_INCLUDES is provided. + * + * Loading of the files is in **reverse order**, i.e. the last path appended is + * loaded first - in this case the ``/usr/share/X11/xkb`` path. + * Any models, layouts, variants and options defined in the "evdev" ruleset + * are loaded into the context. Then, any RMLVO found in the "evdev" ruleset of + * the user's path (``/home/user/.config/xkb`` in this example) are **appended** + * to the existing set. + * + * Note that data from previously loaded include paths is never overwritten, + * only appended to. It is not not possible to change the system-provided data, + * only to append new models, layouts, variants and options to it. + * + * In other words, to define a new variant of the "us" layout called "banana", + * the following XML is sufficient. + * + * @verbatim + * + * + * + * + * us + * + * + * + * + * banana + * English (Banana) + * + * + * + * + * + * @endverbatim + * + * The list of models, options and all other layouts (including "us" and its + * variants) is taken from the system files. The resulting list of layouts will + * thus have a "us" keyboard layout with the variant "banana" and all other + * system-provided variants (dvorak, colemak, intl, etc.) + * + * This function must be called before rxkb_context_parse() or + * rxkb_context_parse_default_ruleset(). + * + * @returns true on success, or false if the include path could not be added + * or is inaccessible. + */ +bool +rxkb_context_include_path_append(struct rxkb_context *ctx, const char *path); + +/** + * Append the default include paths to the context's include path. + * See rxkb_context_include_path_append() for details about the merge order. + * + * This function must be called before rxkb_context_parse() or + * rxkb_context_parse_default_ruleset(). + * + * @returns true on success, or false if the include path could not be added + * or is inaccessible. + */ +bool +rxkb_context_include_path_append_default(struct rxkb_context *ctx); + +/** + * Return the first model for this context. Use this to start iterating over + * the models, followed by calls to rxkb_model_next(). Models are not sorted. + * + * The refcount of the returned model is not increased. Use rxkb_model_ref() if + * you need to keep this struct outside the immediate scope. + * + * @return The first model in the model list. + */ +struct rxkb_model * +rxkb_model_first(struct rxkb_context *ctx); + +/** + * Return the next model for this context. Returns NULL when no more models + * are available. + * + * The refcount of the returned model is not increased. Use rxkb_model_ref() if + * you need to keep this struct outside the immediate scope. + * + * @return the next model or NULL at the end of the list + */ +struct rxkb_model * +rxkb_model_next(struct rxkb_model *m); + +/** + * Increase the refcount of the argument by one. + * + * @returns The argument passed in to this function. + */ +struct rxkb_model * +rxkb_model_ref(struct rxkb_model *m); + +/** + * Decrease the refcount of the argument by one. When the refcount hits zero, + * all memory associated with this struct is freed. + * + * @returns always NULL + */ +struct rxkb_model * +rxkb_model_unref(struct rxkb_model *m); + +/** + * Return the name of this model. This is the value for M in RMLVO, to be used + * with libxkbcommon. + */ +const char * +rxkb_model_get_name(struct rxkb_model *m); + +/** + * Return a human-readable description of this model. This function may return + * NULL. + */ +const char * +rxkb_model_get_description(struct rxkb_model *m); + +/** + * Return the vendor name for this model. This function may return NULL. + */ +const char * +rxkb_model_get_vendor(struct rxkb_model *m); + +/** + * Return the popularity for this model. + */ +enum rxkb_popularity +rxkb_model_get_popularity(struct rxkb_model *m); + +/** + * Return the first layout for this context. Use this to start iterating over + * the layouts, followed by calls to rxkb_layout_next(). Layouts are not sorted. + * + * The refcount of the returned layout is not increased. Use rxkb_layout_ref() if + * you need to keep this struct outside the immediate scope. + * + * @return The first layout in the layout list. + */ +struct rxkb_layout * +rxkb_layout_first(struct rxkb_context *ctx); + +/** + * Return the next layout for this context. Returns NULL when no more layouts + * are available. + * + * The refcount of the returned layout is not increased. Use rxkb_layout_ref() + * if you need to keep this struct outside the immediate scope. + * + * @return the next layout or NULL at the end of the list + */ +struct rxkb_layout * +rxkb_layout_next(struct rxkb_layout *l); + +/** + * Increase the refcount of the argument by one. + * + * @returns The argument passed in to this function. + */ +struct rxkb_layout * +rxkb_layout_ref(struct rxkb_layout *l); + +/** + * Decrease the refcount of the argument by one. When the refcount hits zero, + * all memory associated with this struct is freed. + * + * @returns always NULL + */ +struct rxkb_layout * +rxkb_layout_unref(struct rxkb_layout *l); + +/** + * Return the name of this layout. This is the value for L in RMLVO, to be used + * with libxkbcommon. + */ +const char * +rxkb_layout_get_name(struct rxkb_layout *l); + +/** + * Return the variant of this layout. This is the value for V in RMLVO, to be + * used with libxkbcommon. + * + * A variant does not stand on its own, it always depends on the base layout. + * e.g. there may be multiple variants called "intl" but there is only one + * "us(intl)". + * + * Where the variant is NULL, the layout is the base layout (e.g. "us"). + */ +const char * +rxkb_layout_get_variant(struct rxkb_layout *l); + +/** + * Return a short (one-word) description of this layout. This function may + * return NULL. + */ +const char * +rxkb_layout_get_brief(struct rxkb_layout *l); + +/** + * Return a human-readable description of this layout. This function may return + * NULL. + */ +const char * +rxkb_layout_get_description(struct rxkb_layout *l); + +/** + * Return the popularity for this layout. + */ +enum rxkb_popularity +rxkb_layout_get_popularity(struct rxkb_layout *l); + +/** + * Return the first option group for this context. Use this to start iterating + * over the option groups, followed by calls to rxkb_option_group_next(). + * Option groups are not sorted. + * + * The refcount of the returned option group is not increased. Use + * rxkb_option_group_ref() if you need to keep this struct outside the immediate + * scope. + * + * @return The first option group in the option group list. + */ +struct rxkb_option_group * +rxkb_option_group_first(struct rxkb_context *ctx); + +/** + * Return the next option group for this context. Returns NULL when no more + * option groups are available. + * + * The refcount of the returned option group is not increased. Use + * rxkb_option_group_ref() if you need to keep this struct outside the immediate + * scope. + * + * @return the next option group or NULL at the end of the list + */ +struct rxkb_option_group * +rxkb_option_group_next(struct rxkb_option_group *g); + +/** + * Increase the refcount of the argument by one. + * + * @returns The argument passed in to this function. + */ +struct rxkb_option_group * +rxkb_option_group_ref(struct rxkb_option_group *g); + +/** + * Decrease the refcount of the argument by one. When the refcount hits zero, + * all memory associated with this struct is freed. + * + * @returns always NULL + */ +struct rxkb_option_group * +rxkb_option_group_unref(struct rxkb_option_group *g); + +/** + * Return the name of this option group. This is **not** the value for O in + * RMLVO, the name can be used for internal sorting in the caller. This function + * may return NULL. + */ +const char * +rxkb_option_group_get_name(struct rxkb_option_group *m); + +/** + * Return a human-readable description of this option group. This function may + * return NULL. + */ +const char * +rxkb_option_group_get_description(struct rxkb_option_group *m); + +/** + * @return true if multiple options within this option group can be selected + * simultaneously, false if all options within this option group + * are mutually exclusive. + */ +bool +rxkb_option_group_allows_multiple(struct rxkb_option_group *g); + +/** + * Return the popularity for this option group. + */ +enum rxkb_popularity +rxkb_option_group_get_popularity(struct rxkb_option_group *g); + +/** + * Return the first option for this option group. Use this to start iterating + * over the options, followed by calls to rxkb_option_next(). Options are not + * sorted. + * + * The refcount of the returned option is not increased. Use rxkb_option_ref() + * if you need to keep this struct outside the immediate scope. + * + * @return The first option in the option list. + */ +struct rxkb_option * +rxkb_option_first(struct rxkb_option_group *group); + +/** + * Return the next option for this option group. Returns NULL when no more + * options are available. + * + * The refcount of the returned options is not increased. Use rxkb_option_ref() + * if you need to keep this struct outside the immediate scope. + * + * @returns The next option or NULL at the end of the list + */ +struct rxkb_option * +rxkb_option_next(struct rxkb_option *o); + +/** + * Increase the refcount of the argument by one. + * + * @returns The argument passed in to this function. + */ +struct rxkb_option * +rxkb_option_ref(struct rxkb_option *o); + +/** + * Decrease the refcount of the argument by one. When the refcount hits zero, + * all memory associated with this struct is freed. + * + * @returns always NULL + */ +struct rxkb_option * +rxkb_option_unref(struct rxkb_option *o); + +/** + * Return the name of this option. This is the value for O in RMLVO, to be used + * with libxkbcommon. + */ +const char * +rxkb_option_get_name(struct rxkb_option *o); + +/** + * Return a short (one-word) description of this option. This function may + * return NULL. + */ +const char * +rxkb_option_get_brief(struct rxkb_option *o); + +/** + * Return a human-readable description of this option. This function may return + * NULL. + */ +const char * +rxkb_option_get_description(struct rxkb_option *o); + +/** + * Return the popularity for this option. + */ +enum rxkb_popularity +rxkb_option_get_popularity(struct rxkb_option *o); + +/** + * Increase the refcount of the argument by one. + * + * @returns The argument passed in to this function. + */ +struct rxkb_iso639_code * +rxkb_iso639_code_ref(struct rxkb_iso639_code *iso639); + +/** + * Decrease the refcount of the argument by one. When the refcount hits zero, + * all memory associated with this struct is freed. + * + * @returns always NULL + */ +struct rxkb_iso639_code * +rxkb_iso639_code_unref(struct rxkb_iso639_code *iso639); + +/** + * Return the ISO 639-3 code for this code (e.g. "eng", "fra"). + */ +const char * +rxkb_iso639_code_get_code(struct rxkb_iso639_code *iso639); + +/** + * Return the first ISO 639 for this layout. Use this to start iterating over + * the codes, followed by calls to rxkb_iso639_code_next(). Codes are not + * sorted. + * + * The refcount of the returned code is not increased. Use rxkb_iso639_code_ref() + * if you need to keep this struct outside the immediate scope. + * + * @return The first code in the code list. + */ +struct rxkb_iso639_code * +rxkb_layout_get_iso639_first(struct rxkb_layout *layout); + +/** + * Return the next code in the list. Returns NULL when no more codes + * are available. + * + * The refcount of the returned codes is not increased. Use + * rxkb_iso639_code_ref() if you need to keep this struct outside the immediate + * scope. + * + * @returns The next code or NULL at the end of the list + */ +struct rxkb_iso639_code * +rxkb_iso639_code_next(struct rxkb_iso639_code *iso639); + +/** + * Increase the refcount of the argument by one. + * + * @returns The argument passed in to this function. + */ +struct rxkb_iso3166_code * +rxkb_iso3166_code_ref(struct rxkb_iso3166_code *iso3166); + +/** + * Decrease the refcount of the argument by one. When the refcount hits zero, + * all memory associated with this struct is freed. + * + * @returns always NULL + */ +struct rxkb_iso3166_code * +rxkb_iso3166_code_unref(struct rxkb_iso3166_code *iso3166); + +/** + * Return the ISO 3166 Alpha 2 code for this code (e.g. "US", "FR"). + */ +const char * +rxkb_iso3166_code_get_code(struct rxkb_iso3166_code *iso3166); + +/** + * Return the first ISO 3166 for this layout. Use this to start iterating over + * the codes, followed by calls to rxkb_iso3166_code_next(). Codes are not + * sorted. + * + * The refcount of the returned code is not increased. Use + * rxkb_iso3166_code_ref() if you need to keep this struct outside the immediate + * scope. + * + * @return The first code in the code list. + */ +struct rxkb_iso3166_code * +rxkb_layout_get_iso3166_first(struct rxkb_layout *layout); + +/** + * Return the next code in the list. Returns NULL when no more codes + * are available. + * + * The refcount of the returned codes is not increased. Use + * rxkb_iso3166_code_ref() if you need to keep this struct outside the immediate + * scope. + * + * @returns The next code or NULL at the end of the list + */ +struct rxkb_iso3166_code * +rxkb_iso3166_code_next(struct rxkb_iso3166_code *iso3166); + +/** @} */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* _XKBREGISTRY_H_ */ diff --git a/meson.build b/meson.build index 47c436f..fb77185 100644 --- a/meson.build +++ b/meson.build @@ -1,9 +1,9 @@ project( 'libxkbcommon', 'c', - version: '1.0.3', + version: '1.4.0', default_options: [ - 'c_std=c99', + 'c_std=c11', 'warning_level=2', 'b_lundef=true', ], @@ -49,7 +49,7 @@ endif XKBCONFIGEXTRAPATH = get_option('xkb-config-extra-path') if XKBCONFIGEXTRAPATH == '' - XKBCONFIGEXTRAPATH = join_paths(get_option('prefix'), get_option('sysconfdir'), 'xkb') + XKBCONFIGEXTRAPATH = get_option('prefix')/get_option('sysconfdir')/'xkb' endif # The X locale directory for compose. @@ -125,8 +125,6 @@ elif cc.has_header_symbol('stdlib.h', '__secure_getenv', prefix: system_ext_defi else message('C library does not support secure_getenv, using getenv instead') endif -have_getopt_long = cc.has_header_symbol('getopt.h', 'getopt_long', - prefix: '#define _GNU_SOURCE') if not cc.has_header_symbol('limits.h', 'PATH_MAX', prefix: system_ext_define) if host_machine.system() == 'windows' # see https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation @@ -152,6 +150,7 @@ have_version_script = cc.links( name: '-Wl,--version-script', ) +map_to_def = find_program('scripts/map-to-def') # libxkbcommon. # Note: we use some yacc extensions, which work with either GNU bison @@ -231,30 +230,42 @@ libxkbcommon_sources = [ 'src/utils.h', ] libxkbcommon_link_args = [] +libxkbcommon_link_deps = [] if have_version_script libxkbcommon_link_args += '-Wl,--version-script=' + meson.source_root()/'xkbcommon.map' + libxkbcommon_link_deps += 'xkbcommon.map' +elif cc.get_argument_syntax() == 'msvc' + libxkbcommon_def = custom_target('xkbcommon.def', + command: [map_to_def, '@INPUT@', '@OUTPUT@'], + input: 'xkbcommon.map', + output: 'kxbcommon.def', + ) + libxkbcommon_link_deps += libxkbcommon_def + libxkbcommon_link_args += '/DEF:' + libxkbcommon_def.full_path() endif libxkbcommon = library( 'xkbcommon', - 'xkbcommon/xkbcommon.h', + 'include/xkbcommon/xkbcommon.h', libxkbcommon_sources, link_args: libxkbcommon_link_args, - link_depends: 'xkbcommon.map', + link_depends: libxkbcommon_link_deps, gnu_symbol_visibility: 'hidden', version: '0.0.0', install: true, - include_directories: include_directories('src'), + include_directories: include_directories('src', 'include'), ) install_headers( - 'xkbcommon/xkbcommon.h', - 'xkbcommon/xkbcommon-compat.h', - 'xkbcommon/xkbcommon-compose.h', - 'xkbcommon/xkbcommon-keysyms.h', - 'xkbcommon/xkbcommon-names.h', + 'include/xkbcommon/xkbcommon.h', + 'include/xkbcommon/xkbcommon-compat.h', + 'include/xkbcommon/xkbcommon-compose.h', + 'include/xkbcommon/xkbcommon-keysyms.h', + 'include/xkbcommon/xkbcommon-names.h', subdir: 'xkbcommon', ) -libxkbcommon_dep = declare_dependency( + +dep_libxkbcommon = declare_dependency( link_with: libxkbcommon, + include_directories: include_directories('include'), ) pkgconfig.generate( libxkbcommon, @@ -287,19 +298,29 @@ You can disable X11 support with -Denable-x11=false.''') 'src/atom.c', ] libxkbcommon_x11_link_args = [] + libxkbcommon_x11_link_deps = [] if have_version_script libxkbcommon_x11_link_args += '-Wl,--version-script=' + meson.source_root()/'xkbcommon-x11.map' + libxkbcommon_x11_link_deps += 'xkbcommon-x11.map' + elif cc.get_argument_syntax() == 'msvc' + libxkbcommon_x11_def = custom_target('xkbcommon-x11.def', + command: [map_to_def, '@INPUT@', '@OUTPUT@'], + input: 'xkbcommon-x11.map', + output: 'xkbcommon-x11.def', + ) + libxkbcommon_x11_link_deps += libxkbcommon_x11_def + libxkbcommon_x11_link_args += '/DEF:' + libxkbcommon_x11_def.full_path() endif libxkbcommon_x11 = library( 'xkbcommon-x11', - 'xkbcommon/xkbcommon-x11.h', + 'include/xkbcommon/xkbcommon-x11.h', libxkbcommon_x11_sources, link_args: libxkbcommon_x11_link_args, - link_depends: 'xkbcommon-x11.map', + link_depends: libxkbcommon_x11_link_deps, gnu_symbol_visibility: 'hidden', version: '0.0.0', install: true, - include_directories: include_directories('src'), + include_directories: include_directories('src', 'include'), link_with: libxkbcommon, dependencies: [ xcb_dep, @@ -307,11 +328,12 @@ You can disable X11 support with -Denable-x11=false.''') ], ) install_headers( - 'xkbcommon/xkbcommon-x11.h', + 'include/xkbcommon/xkbcommon-x11.h', subdir: 'xkbcommon', ) - libxkbcommon_x11_dep = declare_dependency( + dep_libxkbcommon_x11 = declare_dependency( link_with: libxkbcommon_x11, + include_directories: include_directories('include'), ) pkgconfig.generate( libxkbcommon_x11, @@ -336,23 +358,33 @@ if get_option('enable-xkbregistry') 'src/util-list.c', ] libxkbregistry_link_args = [] + libxkbregistry_link_deps = [] if have_version_script libxkbregistry_link_args += '-Wl,--version-script=' + meson.source_root()/'xkbregistry.map' + libxkbregistry_link_deps += 'xkbregistry.map' + elif cc.get_argument_syntax() == 'msvc' + libxkbregistry_def = custom_target('xkbregistry.def', + command: [map_to_def, '@INPUT@', '@OUTPUT@'], + input: 'xkbregistry.map', + output: 'xkbregistry.def', + ) + libxkbregistry_link_deps += libxkbregistry_def + libxkbregistry_link_args += '/DEF:' + libxkbregistry_def.full_path() endif libxkbregistry = library( 'xkbregistry', - 'xkbcommon/xkbregistry.h', + 'include/xkbcommon/xkbregistry.h', libxkbregistry_sources, link_args: libxkbregistry_link_args, - link_depends: 'xkbregistry.map', + link_depends: libxkbregistry_link_deps, gnu_symbol_visibility: 'hidden', dependencies: deps_libxkbregistry, version: '0.0.0', install: true, - include_directories: include_directories('src'), + include_directories: include_directories('src', 'include'), ) install_headers( - 'xkbcommon/xkbregistry.h', + 'include/xkbcommon/xkbregistry.h', subdir: 'xkbcommon', ) pkgconfig.generate( @@ -364,24 +396,24 @@ if get_option('enable-xkbregistry') ) dep_libxkbregistry = declare_dependency( - include_directories: include_directories('xkbcommon'), - link_with: libxkbregistry - ) + link_with: libxkbregistry, + include_directories: include_directories('include'), + ) endif man_pages = [] # Tools -build_tools = have_getopt_long +build_tools = get_option('enable-tools') and cc.has_header_symbol('getopt.h', 'getopt_long', prefix: '#define _GNU_SOURCE') if build_tools libxkbcommon_tools_internal = static_library( 'tools-internal', 'tools/tools-common.h', 'tools/tools-common.c', - dependencies: libxkbcommon_dep, + dependencies: dep_libxkbcommon, ) tools_dep = declare_dependency( - include_directories: [include_directories('tools')], + include_directories: [include_directories('tools', 'include')], link_with: libxkbcommon_tools_internal, ) @@ -389,11 +421,11 @@ if build_tools dependencies: tools_dep, install: true) install_man('tools/xkbcli.1') - executable('xkbcli-compile-keymap', - 'tools/compile-keymap.c', - dependencies: tools_dep, - install: true, - install_dir: dir_libexec) + xkbcli_compile_keymap = executable('xkbcli-compile-keymap', + 'tools/compile-keymap.c', + dependencies: tools_dep, + install: true, + install_dir: dir_libexec) install_man('tools/xkbcli-compile-keymap.1') # The same tool again, but with access to some private APIs. executable('compile-keymap', @@ -401,7 +433,12 @@ if build_tools libxkbcommon_sources, dependencies: [tools_dep], c_args: ['-DENABLE_PRIVATE_APIS'], - include_directories: [include_directories('src')], + 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', @@ -518,17 +555,17 @@ libxkbcommon_test_internal = static_library( 'bench/bench.c', 'bench/bench.h', libxkbcommon_sources, - include_directories: include_directories('src'), + include_directories: include_directories('src', 'include'), ) test_dep = declare_dependency( - include_directories: include_directories('src'), + include_directories: include_directories('src', 'include'), link_with: libxkbcommon_test_internal, ) if get_option('enable-x11') libxkbcommon_x11_internal = static_library( 'xkbcommon-x11-internal', libxkbcommon_x11_sources, - include_directories: include_directories('src'), + include_directories: include_directories('src', 'include'), link_with: libxkbcommon_test_internal, dependencies: [ xcb_dep, @@ -657,6 +694,22 @@ if build_tools find_program('test/tool-option-parsing.py'), env: test_env, suite: ['python-tests']) + + # A set of keysyms to test for. Add one or two symbols to this array + # whenever the xorgproto gets updated to make sure we resolve them. + keysyms_to_test = [ + 'XF86Macro23', + ] + + env = environment() + env.set('XKB_CONFIG_ROOT', meson.source_root()/'test'/'data') + foreach keysym: keysyms_to_test + test('keysym-test-@0@'.format(keysym), + find_program('test/test-keysym.py'), + env: env, + args: [keysym, '--tool', xkbcli_compile_keymap], + suite: ['python-tests']) + endforeach endif valgrind = find_program('valgrind', required: false) @@ -701,6 +754,11 @@ benchmark( executable('bench-compose', 'bench/compose.c', dependencies: test_dep), env: bench_env, ) +benchmark( + 'atom', + executable('bench-atom', 'bench/atom.c', dependencies: test_dep), + env: bench_env, +) if get_option('enable-x11') benchmark( 'x11', @@ -726,11 +784,12 @@ You can disable the documentation with -Denable-docs=false.''') 'doc/compat.md', 'doc/user-configuration.md', 'doc/rules-format.md', - 'xkbcommon/xkbcommon.h', - 'xkbcommon/xkbcommon-names.h', - 'xkbcommon/xkbcommon-x11.h', - 'xkbcommon/xkbcommon-compose.h', - 'xkbcommon/xkbregistry.h', + 'doc/keymap-format-text-v1.md', + 'include/xkbcommon/xkbcommon.h', + 'include/xkbcommon/xkbcommon-names.h', + 'include/xkbcommon/xkbcommon-x11.h', + 'include/xkbcommon/xkbcommon-compose.h', + 'include/xkbcommon/xkbregistry.h', ] doxygen_data = configuration_data() doxygen_data.set('PACKAGE_NAME', meson.project_name()) @@ -756,3 +815,14 @@ You can disable the documentation with -Denable-docs=false.''') endif configure_file(output: 'config.h', configuration: configh_data) + + +# Stable variables for projects using xkbcommon as a subproject. +# These variables should not be renamed. +libxkbcommon_dep = dep_libxkbcommon +if get_option('enable-x11') + libxkbcommon_x11_dep = dep_libxkbcommon_x11 +endif +if get_option('enable-xkbregistry') + libxkbregistry_dep = dep_libxkbregistry +endif diff --git a/meson_options.txt b/meson_options.txt index 04982c6..69850b8 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -43,6 +43,12 @@ option( value: '', description: 'Default XKB options', ) +option( + 'enable-tools', + type: 'boolean', + value: true, + description: 'Enable building tools', +) option( 'enable-x11', type: 'boolean', @@ -59,7 +65,7 @@ option( 'enable-wayland', type: 'boolean', value: true, - description: 'Enable support for Wayland utility programs', + description: 'Enable support for Wayland utility programs (requires enable-tools)', ) option( 'enable-xkbregistry', diff --git a/scripts/makeheader b/scripts/makeheader index 600b565..52d1375 100755 --- a/scripts/makeheader +++ b/scripts/makeheader @@ -3,6 +3,9 @@ from __future__ import print_function import re import os +# expected format: +# #define XF86XK_FooBar _EVDEVK(0x123) /* some optional comment */ +evdev_pattern = re.compile(r'^#define\s+XF86XK_(?P\w+)\s+_EVDEVK\((?P0x[0-9A-Fa-f]+)\)') prefix = os.environ.get('X11_HEADERS_PREFIX', '/usr') HEADERS = [ @@ -35,6 +38,14 @@ for path in HEADERS: if 'XK_Ydiaeresis' in line and '0x100000ee' in line: continue + # Replace the xorgproto _EVDEVK macro with the actual value + # 0x10081000 is the base, the evdev hex code is added to that. + # We replace to make parsing of the keys later easier. + match = re.match(evdev_pattern, line) + if match: + value = 0x10081000 + int(match.group('value'), 16) + line = re.sub(r'_EVDEVK\(0x([0-9A-Fa-f]+)\)', '{:#x}'.format(value), line) + line = re.sub(r'#define\s*(\w*)XK_', r'#define XKB_KEY_\1', line) print(line, end='') diff --git a/scripts/makekeys b/scripts/makekeys index f6a0280..fe30067 100755 --- a/scripts/makekeys +++ b/scripts/makekeys @@ -2,10 +2,15 @@ import re, sys, itertools +import perfect_hash + pattern = re.compile(r'^#define\s+XKB_KEY_(?P\w+)\s+(?P0x[0-9a-fA-F]+)\s') matches = [pattern.match(line) for line in open(sys.argv[1])] entries = [(m.group("name"), int(m.group("value"), 16)) for m in matches if m] +entries_isorted = sorted(entries, key=lambda e: e[0].lower()) +entries_kssorted = sorted(entries, key=lambda e: e[1]) + print(''' /** * This file comes from libxkbcommon and was generated by makekeys.py @@ -24,7 +29,7 @@ print(''' static const char *keysym_names = '''.strip()) offs = 0 -for (name, _) in sorted(entries, key=lambda e: e[0].lower()): +for (name, _) in entries_isorted: entry_offsets[name] = offs print(' "{name}\\0"'.format(name=name)) offs += len(name) + 1 @@ -35,6 +40,35 @@ print(''' #endif '''.strip()) + +template = r''' +static const uint16_t keysym_name_G[] = { + $G +}; + +static size_t +keysym_name_hash_f(const char *key, const char *T) +{ + size_t sum = 0; + for (size_t i = 0; key[i] != '\0'; i++) + sum += T[i % $NS] * key[i]; + return sum % $NG; +} + +static size_t +keysym_name_perfect_hash(const char *key) +{ + return ( + keysym_name_G[keysym_name_hash_f(key, "$S1")] + + keysym_name_G[keysym_name_hash_f(key, "$S2")] + ) % $NG; +} +''' +print(perfect_hash.generate_code( + keys=[name for name, value in entries_isorted], + template=template, +)) + print(''' struct name_keysym { xkb_keysym_t keysym; @@ -46,10 +80,10 @@ def print_entries(x): print(' {{ 0x{value:08x}, {offs} }}, /* {name} */'.format(offs=entry_offsets[name], value=value, name=name)) print('static const struct name_keysym name_to_keysym[] = {') -print_entries(sorted(entries, key=lambda e: e[0].lower())) +print_entries(entries_isorted) print('};\n') # *.sort() is stable so we always get the first keysym for duplicate print('static const struct name_keysym keysym_to_name[] = {') -print_entries(next(g[1]) for g in itertools.groupby(sorted(entries, key=lambda e: e[1]), key=lambda e: e[1])) +print_entries(next(g[1]) for g in itertools.groupby(entries_kssorted, key=lambda e: e[1])) print('};') diff --git a/scripts/map-to-def b/scripts/map-to-def new file mode 100755 index 0000000..63b566e --- /dev/null +++ b/scripts/map-to-def @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +"""A script to generate MSVC Module-Definition files from version-script +files (which are maintained manually).""" + +import re +import sys +import pathlib + + +def symbols_from_map(path): + return re.findall(r'^\s+(r?xkb_.*);', path.read_text('utf-8'), re.MULTILINE) + + +if 2 > len(sys.argv) > 3: + raise SystemExit("Usage: {} file.map [file.def]".format(sys.argv[0])) + + +map_file = pathlib.Path(sys.argv[1]) +map_symbols = set(symbols_from_map(map_file)) + +if len(sys.argv) == 3: + def_file = open(sys.argv[2], "w", encoding="utf-8") +else: + def_file = sys.stdout + +def_file.write("LIBRARY {}\n".format(map_file.stem)) +def_file.write("EXPORTS\n") +for symbol in sorted(map_symbols): + def_file.write("\t{}\n".format(symbol)) diff --git a/scripts/meson-junit-report.py b/scripts/meson-junit-report.py deleted file mode 100644 index a6cbb0b..0000000 --- a/scripts/meson-junit-report.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import json -import sys -import unicodedata -import xml.etree.ElementTree as ET -from datetime import datetime - - -aparser = argparse.ArgumentParser( - description='Convert Meson test log into JUnit report') -aparser.add_argument('--project-name', metavar='NAME', - help='The project name', - default='unknown') -aparser.add_argument('--job-id', metavar='ID', - help='The job ID for the report', - default='Unknown') -aparser.add_argument('--branch', metavar='NAME', - help='Branch of the project being tested', - default='master') -aparser.add_argument('--output', metavar='FILE', - help='The output file, stdout by default', - type=argparse.FileType('w', encoding='UTF-8'), - default=sys.stdout) -aparser.add_argument('infile', metavar='FILE', - help='The input testlog.json, stdin by default', - type=argparse.FileType('r', encoding='UTF-8'), - default=sys.stdin) -args = aparser.parse_args() - -outfile = args.output - -testsuites = ET.Element('testsuites') -testsuites.set('id', '{}/{}'.format(args.job_id, args.branch)) -testsuites.set('package', args.project_name) -testsuites.set('timestamp', datetime.utcnow().isoformat(timespec='minutes')) - -testsuite = ET.SubElement(testsuites, 'testsuite') -testsuite.set('name', args.project_name) - -successes = 0 -failures = 0 -skips = 0 - - -def escape_control_chars(text): - return "".join(c if unicodedata.category(c)[0] != "C" else - "<{:02x}>".format(ord(c)) for c in text) - - -for line in args.infile: - unit = json.loads(line) - - testcase = ET.SubElement(testsuite, 'testcase') - testcase.set('classname', '{}/{}'.format(args.project_name, unit['name'])) - testcase.set('name', unit['name']) - testcase.set('time', str(unit['duration'])) - - stdout = escape_control_chars(unit.get('stdout', '')) - stderr = escape_control_chars(unit.get('stderr', '')) - if stdout: - ET.SubElement(testcase, 'system-out').text = stdout - if stderr: - ET.SubElement(testcase, 'system-out').text = stderr - - result = unit['result'].lower() - if result == 'skip': - skips += 1 - ET.SubElement(testcase, 'skipped') - elif result == 'fail': - failures += 1 - failure = ET.SubElement(testcase, 'failure') - failure.set('message', "{} failed".format(unit['name'])) - failure.text = "### stdout\n{}\n### stderr\n{}\n".format(stdout, - stderr) - else: - successes += 1 - assert unit['returncode'] == 0 - -testsuite.set('tests', str(successes + failures + skips)) -testsuite.set('skipped', str(skips)) -testsuite.set('errors', str(failures)) -testsuite.set('failures', str(failures)) - -print('{}: {} pass, {} fail, {} skip'.format(args.project_name, - successes, - failures, - skips)) - -output = ET.tostring(testsuites, encoding='unicode') -outfile.write(output) diff --git a/scripts/perfect_hash.py b/scripts/perfect_hash.py new file mode 100644 index 0000000..95c6156 --- /dev/null +++ b/scripts/perfect_hash.py @@ -0,0 +1,674 @@ +# Derived from: https://github.com/ilanschnell/perfect-hash +# Commit: 6b7dd80a525dbd4349ea2c69f04a9c96f3c2fd54 + +# BSD 3-Clause License +# +# Copyright (c) 2019 - 2021, Ilan Schnell +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the Ilan Schnell nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL ILAN SCHNELL BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +""" +Generate a minimal perfect hash function for the keys in a file, +desired hash values may be specified within this file as well. +A given code template is filled with parameters, such that the +output is code which implements the hash function. +Templates can easily be constructed for any programming language. + +The code is based on an a program A.M. Kuchling wrote: +http://www.amk.ca/python/code/perfect-hash + +The algorithm the program uses is described in the paper +'Optimal algorithms for minimal perfect hashing', +Z. J. Czech, G. Havas and B.S. Majewski. +http://citeseer.ist.psu.edu/122364.html + +The algorithm works like this: + +1. You have K keys, that you want to perfectly hash against some + desired hash values. + +2. Choose a number N larger than K. This is the number of + vertices in a graph G, and also the size of the resulting table G. + +3. Pick two random hash functions f1, f2, that return values from 0..N-1. + +4. Now, for all keys, you draw an edge between vertices f1(key) and f2(key) + of the graph G, and associate the desired hash value with that edge. + +5. If G is cyclic, go back to step 2. + +6. Assign values to each vertex such that, for each edge, you can add + the values for the two vertices and get the desired (hash) value + for that edge. This task is easy, because the graph is acyclic. + This is done by picking a vertex, and assigning it a value of 0. + Then do a depth-first search, assigning values to new vertices so that + they sum up properly. + +7. f1, f2, and vertex values of G now make up a perfect hash function. + + +For simplicity, the implementation of the algorithm combines steps 5 and 6. +That is, we check for loops in G and assign the vertex values in one procedure. +If this procedure succeeds, G is acyclic and the vertex values are assigned. +If the procedure fails, G is cyclic, and we go back to step 2, replacing G +with a new graph, and thereby discarding the vertex values from the failed +attempt. +""" +from __future__ import absolute_import, division, print_function + +import sys +import random +import string +import subprocess +import shutil +import tempfile +from collections import defaultdict +from os.path import join + +if sys.version_info[0] == 2: + from cStringIO import StringIO +else: + from io import StringIO + + +__version__ = '0.4.2' + + +verbose = False +trials = 150 + + +class Graph(object): + """ + Implements a graph with 'N' vertices. First, you connect the graph with + edges, which have a desired value associated. Then the vertex values + are assigned, which will fail if the graph is cyclic. The vertex values + are assigned such that the two values corresponding to an edge add up to + the desired edge value (mod N). + """ + def __init__(self, N): + self.N = N # number of vertices + + # maps a vertex number to the list of tuples (vertex, edge value) + # to which it is connected by edges. + self.adjacent = defaultdict(list) + + def connect(self, vertex1, vertex2, edge_value): + """ + Connect 'vertex1' and 'vertex2' with an edge, with associated + value 'value' + """ + # Add vertices to each other's adjacent list + self.adjacent[vertex1].append((vertex2, edge_value)) + self.adjacent[vertex2].append((vertex1, edge_value)) + + def assign_vertex_values(self): + """ + Try to assign the vertex values, such that, for each edge, you can + add the values for the two vertices involved and get the desired + value for that edge, i.e. the desired hash key. + This will fail when the graph is cyclic. + + This is done by a Depth-First Search of the graph. If the search + finds a vertex that was visited before, there's a loop and False is + returned immediately, i.e. the assignment is terminated. + On success (when the graph is acyclic) True is returned. + """ + self.vertex_values = self.N * [-1] # -1 means unassigned + + visited = self.N * [False] + + # Loop over all vertices, taking unvisited ones as roots. + for root in range(self.N): + if visited[root]: + continue + + # explore tree starting at 'root' + self.vertex_values[root] = 0 # set arbitrarily to zero + + # Stack of vertices to visit, a list of tuples (parent, vertex) + tovisit = [(None, root)] + while tovisit: + parent, vertex = tovisit.pop() + visited[vertex] = True + + # Loop over adjacent vertices, but skip the vertex we arrived + # here from the first time it is encountered. + skip = True + for neighbor, edge_value in self.adjacent[vertex]: + if skip and neighbor == parent: + skip = False + continue + + if visited[neighbor]: + # We visited here before, so the graph is cyclic. + return False + + tovisit.append((vertex, neighbor)) + + # Set new vertex's value to the desired edge value, + # minus the value of the vertex we came here from. + self.vertex_values[neighbor] = ( + edge_value - self.vertex_values[vertex]) % self.N + + # check if all vertices have a valid value + for vertex in range(self.N): + assert self.vertex_values[vertex] >= 0 + + # We got though, so the graph is acyclic, + # and all values are now assigned. + return True + + +class StrSaltHash(object): + """ + Random hash function generator. + Simple byte level hashing: each byte is multiplied to another byte from + a random string of characters, summed up, and finally modulo NG is + taken. + """ + chars = string.ascii_letters + string.digits + + def __init__(self, N): + self.N = N + self.salt = '' + + def __call__(self, key): + # XXX: xkbcommon modification: make the salt length a power of 2 + # so that the % operation in the hash is fast. + while len(self.salt) < max(len(key), 32): # add more salt as necessary + self.salt += random.choice(self.chars) + + return sum(ord(self.salt[i]) * ord(c) + for i, c in enumerate(key)) % self.N + + template = """ +def hash_f(key, T): + return sum(ord(T[i % $NS]) * ord(c) for i, c in enumerate(key)) % $NG + +def perfect_hash(key): + return (G[hash_f(key, "$S1")] + + G[hash_f(key, "$S2")]) % $NG +""" + +class IntSaltHash(object): + """ + Random hash function generator. + Simple byte level hashing, each byte is multiplied in sequence to a table + containing random numbers, summed tp, and finally modulo NG is taken. + """ + def __init__(self, N): + self.N = N + self.salt = [] + + def __call__(self, key): + while len(self.salt) < len(key): # add more salt as necessary + self.salt.append(random.randint(1, self.N - 1)) + + return sum(self.salt[i] * ord(c) + for i, c in enumerate(key)) % self.N + + template = """ +S1 = [$S1] +S2 = [$S2] +assert len(S1) == len(S2) == $NS + +def hash_f(key, T): + return sum(T[i % $NS] * ord(c) for i, c in enumerate(key)) % $NG + +def perfect_hash(key): + return (G[hash_f(key, S1)] + G[hash_f(key, S2)]) % $NG +""" + +def builtin_template(Hash): + return """\ +# ======================================================================= +# ================= Python code for perfect hash function =============== +# ======================================================================= + +G = [$G] +""" + Hash.template + """ +# ============================ Sanity check ============================= + +K = [$K] +assert len(K) == $NK + +for h, k in enumerate(K): + assert perfect_hash(k) == h +""" + + +class TooManyInterationsError(Exception): + pass + + +def generate_hash(keys, Hash=StrSaltHash): + """ + Return hash functions f1 and f2, and G for a perfect minimal hash. + Input is an iterable of 'keys', whos indicies are the desired hash values. + 'Hash' is a random hash function generator, that means Hash(N) returns a + returns a random hash function which returns hash values from 0..N-1. + """ + if not isinstance(keys, (list, tuple)): + raise TypeError("list or tuple expected") + NK = len(keys) + if NK != len(set(keys)): + raise ValueError("duplicate keys") + for key in keys: + if not isinstance(key, str): + raise TypeError("key a not string: %r" % key) + if NK > 10000 and Hash == StrSaltHash: + print("""\ +WARNING: You have %d keys. + Using --hft=1 is likely to fail for so many keys. + Please use --hft=2 instead. +""" % NK) + + # the number of vertices in the graph G + NG = NK + 1 + if verbose: + print('NG = %d' % NG) + + trial = 0 # Number of trial graphs so far + while True: + if (trial % trials) == 0: # trials failures, increase NG slightly + if trial > 0: + NG = max(NG + 1, int(1.05 * NG)) + if verbose: + sys.stdout.write('\nGenerating graphs NG = %d ' % NG) + trial += 1 + + if NG > 100 * (NK + 1): + raise TooManyInterationsError("%d keys" % NK) + + if verbose: + sys.stdout.write('.') + sys.stdout.flush() + + G = Graph(NG) # Create graph with NG vertices + f1 = Hash(NG) # Create 2 random hash functions + f2 = Hash(NG) + + # Connect vertices given by the values of the two hash functions + # for each key. Associate the desired hash value with each edge. + for hashval, key in enumerate(keys): + G.connect(f1(key), f2(key), hashval) + + # Try to assign the vertex values. This will fail when the graph + # is cyclic. But when the graph is acyclic it will succeed and we + # break out, because we're done. + if G.assign_vertex_values(): + break + + if verbose: + print('\nAcyclic graph found after %d trials.' % trial) + print('NG = %d' % NG) + + # Sanity check the result by actually verifying that all the keys + # hash to the right value. + for hashval, key in enumerate(keys): + assert hashval == ( + G.vertex_values[f1(key)] + G.vertex_values[f2(key)] + ) % NG + + if verbose: + print('OK') + + return f1, f2, G.vertex_values + + +class Format(object): + + def __init__(self, width=76, indent=4, delimiter=', '): + self.width = width + self.indent = indent + self.delimiter = delimiter + + def print_format(self): + print("Format options:") + for name in 'width', 'indent', 'delimiter': + print(' %s: %r' % (name, getattr(self, name))) + + def __call__(self, data, quote=False): + if not isinstance(data, (list, tuple)): + return str(data) + + lendel = len(self.delimiter) + aux = StringIO() + pos = 20 + for i, elt in enumerate(data): + last = bool(i == len(data) - 1) + + s = ('"%s"' if quote else '%s') % elt + + if pos + len(s) + lendel > self.width: + aux.write('\n' + (self.indent * ' ')) + pos = self.indent + + aux.write(s) + pos += len(s) + if not last: + aux.write(self.delimiter) + pos += lendel + + return '\n'.join(l.rstrip() for l in aux.getvalue().split('\n')) + + +def generate_code(keys, Hash=StrSaltHash, template=None, options=None): + """ + Takes a list of key value pairs and inserts the generated parameter + lists into the 'template' string. 'Hash' is the random hash function + generator, and the optional keywords are formating options. + The return value is the substituted code template. + """ + f1, f2, G = generate_hash(keys, Hash) + + assert f1.N == f2.N == len(G) + try: + salt_len = len(f1.salt) + assert salt_len == len(f2.salt) + except TypeError: + salt_len = None + + if template is None: + template = builtin_template(Hash) + + if options is None: + fmt = Format() + else: + fmt = Format(width=options.width, indent=options.indent, + delimiter=options.delimiter) + + if verbose: + fmt.print_format() + + return string.Template(template).substitute( + NS = salt_len, + S1 = fmt(f1.salt), + S2 = fmt(f2.salt), + NG = len(G), + G = fmt(G), + NK = len(keys), + K = fmt(list(keys), quote=True)) + + +def read_table(filename, options): + """ + Reads keys and desired hash value pairs from a file. If no column + for the hash value is specified, a sequence of hash values is generated, + from 0 to N-1, where N is the number of rows found in the file. + """ + if verbose: + print("Reading table from file `%s' to extract keys." % filename) + try: + fi = open(filename) + except IOError: + sys.exit("Error: Could not open `%s' for reading." % filename) + + keys = [] + + if verbose: + print("Reader options:") + for name in 'comment', 'splitby', 'keycol': + print(' %s: %r' % (name, getattr(options, name))) + + for n, line in enumerate(fi): + line = line.strip() + if not line or line.startswith(options.comment): + continue + + if line.count(options.comment): # strip content after comment + line = line.split(options.comment)[0].strip() + + row = [col.strip() for col in line.split(options.splitby)] + + try: + key = row[options.keycol - 1] + except IndexError: + sys.exit("%s:%d: Error: Cannot read key, not enough columns." % + (filename, n + 1)) + + keys.append(key) + + fi.close() + + if not keys: + exit("Error: no keys found in file `%s'." % filename) + + return keys + + +def read_template(filename): + if verbose: + print("Reading template from file `%s'" % filename) + try: + with open(filename, 'r') as fi: + return fi.read() + except IOError: + sys.exit("Error: Could not open `%s' for reading." % filename) + + +def run_code(code): + tmpdir = tempfile.mkdtemp() + path = join(tmpdir, 't.py') + with open(path, 'w') as fo: + fo.write(code) + try: + subprocess.check_call([sys.executable, path]) + except subprocess.CalledProcessError as e: + raise AssertionError(e) + finally: + shutil.rmtree(tmpdir) + + +def main(): + from optparse import OptionParser + + usage = "usage: %prog [options] KEYS_FILE [TMPL_FILE]" + + description = """\ +Generates code for perfect hash functions from +a file with keywords and a code template. +If no template file is provided, a small built-in Python template +is processed and the output code is written to stdout. +""" + + parser = OptionParser(usage = usage, + description = description, + prog = sys.argv[0], + version = "%prog: " + __version__) + + parser.add_option("--delimiter", + action = "store", + default = ", ", + help = "Delimiter for list items used in output, " + "the default delimiter is '%default'", + metavar = "STR") + + parser.add_option("--indent", + action = "store", + default = 4, + type = "int", + help = "Make INT spaces at the beginning of a " + "new line when generated list is wrapped. " + "Default is %default", + metavar = "INT") + + parser.add_option("--width", + action = "store", + default = 76, + type = "int", + help = "Maximal width of generated list when " + "wrapped. Default width is %default", + metavar = "INT") + + parser.add_option("--comment", + action = "store", + default = "#", + help = "STR is the character, or sequence of " + "characters, which marks the beginning " + "of a comment (which runs till " + "the end of the line), in the input " + "KEYS_FILE. " + "Default is '%default'", + metavar = "STR") + + parser.add_option("--splitby", + action = "store", + default = ",", + help = "STR is the character by which the columns " + "in the input KEYS_FILE are split. " + "Default is '%default'", + metavar = "STR") + + parser.add_option("--keycol", + action = "store", + default = 1, + type = "int", + help = "Specifies the column INT in the input " + "KEYS_FILE which contains the keys. " + "Default is %default, i.e. the first column.", + metavar = "INT") + + parser.add_option("--trials", + action = "store", + default = 5, + type = "int", + help = "Specifies the number of trials before " + "NG is increased. A small INT will give " + "compute faster, but the array G will be " + "large. A large INT will take longer to " + "compute but G will be smaller. " + "Default is %default", + metavar = "INT") + + parser.add_option("--hft", + action = "store", + default = 1, + type = "int", + help = "Hash function type INT. Possible values " + "are 1 (StrSaltHash) and 2 (IntSaltHash). " + "The default is %default", + metavar = "INT") + + parser.add_option("-e", "--execute", + action = "store_true", + help = "Execute the generated code within " + "the Python interpreter.") + + parser.add_option("-o", "--output", + action = "store", + help = "Specify output FILE explicitly. " + "`-o std' means standard output. " + "`-o no' means no output. " + "By default, the file name is obtained " + "from the name of the template file by " + "substituting `tmpl' to `code'.", + metavar = "FILE") + + parser.add_option("-v", "--verbose", + action = "store_true", + help = "verbosity") + + options, args = parser.parse_args() + + if options.trials <= 0: + parser.error("trials before increasing N has to be larger than zero") + + global trials + trials = options.trials + + global verbose + verbose = options.verbose + + if len(args) not in (1, 2): + parser.error("incorrect number of arguments") + + if len(args) == 2 and not args[1].count('tmpl'): + parser.error("template filename does not contain 'tmpl'") + + if options.hft == 1: + Hash = StrSaltHash + elif options.hft == 2: + Hash = IntSaltHash + else: + parser.error("Hash function %s not implemented." % options.hft) + + # --------------------- end parsing and checking -------------- + + keys_file = args[0] + + if verbose: + print("keys_file = %r" % keys_file) + + keys = read_table(keys_file, options) + + if verbose: + print("Number os keys: %d" % len(keys)) + + tmpl_file = args[1] if len(args) == 2 else None + + if verbose: + print("tmpl_file = %r" % tmpl_file) + + template = read_template(tmpl_file) if tmpl_file else None + + if options.output: + outname = options.output + else: + if tmpl_file: + if 'tmpl' not in tmpl_file: + sys.exit("Hmm, template filename does not contain 'tmpl'") + outname = tmpl_file.replace('tmpl', 'code') + else: + outname = 'std' + + if verbose: + print("outname = %r\n" % outname) + + if outname == 'std': + outstream = sys.stdout + elif outname == 'no': + outstream = None + else: + try: + outstream = open(outname, 'w') + except IOError: + sys.exit("Error: Could not open `%s' for writing." % outname) + + code = generate_code(keys, Hash, template, options) + + if options.execute or template == builtin_template(Hash): + if verbose: + print('Executing code...\n') + run_code(code) + + if outstream: + outstream.write(code) + if not outname == 'std': + outstream.close() + + +if __name__ == '__main__': + main() diff --git a/scripts/update-keysyms b/scripts/update-keysyms index 3356a35..5410474 100755 --- a/scripts/update-keysyms +++ b/scripts/update-keysyms @@ -2,5 +2,5 @@ # Run this to regenerate xkbcommon-keysyms.h from the X11 headers # defining the keysyms and update the name <-> keysym mapping. export LC_CTYPE=C -scripts/makeheader > xkbcommon/xkbcommon-keysyms.h -scripts/makekeys xkbcommon/xkbcommon-keysyms.h > src/ks_tables.h +scripts/makeheader > include/xkbcommon/xkbcommon-keysyms.h +scripts/makekeys include/xkbcommon/xkbcommon-keysyms.h > src/ks_tables.h diff --git a/src/atom.c b/src/atom.c index 180b25f..763bff5 100644 --- a/src/atom.c +++ b/src/atom.c @@ -72,8 +72,14 @@ #include "config.h" -#include "utils.h" +#include +#include +#include +#include + #include "atom.h" +#include "darray.h" +#include "utils.h" /* FNV-1a (http://www.isthe.com/chongo/tech/comp/fnv/). */ static inline uint32_t @@ -90,31 +96,14 @@ hash_buf(const char *string, size_t len) } /* - * The atom table is a insert-only unbalanced binary search tree - * mapping strings to atoms. - * - * The tree nodes are kept contiguously in the `table` array. - * - * The atom value is the index of the tree node in the array. - * - * As an optimization, strings are not compared by value directly, - * s1 < s2 - * instead, they are compared by fingerprint (hash) and the value - * is only used to resolve collisions: - * (fingerprint(s1), s1) < (fingerprint(s2), s2) - * Fingerprint are pre-calculated and saved in the tree nodes. - * - * Why is this not just a hash table? Who knows! + * The atom table is an insert-only linear probing hash table + * mapping strings to atoms. Another array maps the atoms to + * strings. The atom value is the position in the strings array. */ -struct atom_node { - xkb_atom_t left, right; - uint32_t fingerprint; - char *string; -}; - struct atom_table { - xkb_atom_t root; - darray(struct atom_node) table; + xkb_atom_t *index; + size_t index_size; + darray(char *) strings; }; struct atom_table * @@ -124,9 +113,10 @@ atom_table_new(void) if (!table) return NULL; - darray_init(table->table); - /* The original throw-away root is here, at the illegal atom 0. */ - darray_resize0(table->table, 1); + darray_init(table->strings); + darray_append(table->strings, NULL); + table->index_size = 4; + table->index = calloc(table->index_size, sizeof(*table->index)); return table; } @@ -137,61 +127,68 @@ atom_table_free(struct atom_table *table) if (!table) return; - struct atom_node *node; - darray_foreach(node, table->table) - free(node->string); - darray_free(table->table); + char **string; + darray_foreach(string, table->strings) + free(*string); + darray_free(table->strings); + free(table->index); free(table); } const char * atom_text(struct atom_table *table, xkb_atom_t atom) { - assert(atom < darray_size(table->table)); - return darray_item(table->table, atom).string; + assert(atom < darray_size(table->strings)); + return darray_item(table->strings, atom); } xkb_atom_t atom_intern(struct atom_table *table, const char *string, size_t len, bool add) { - uint32_t fingerprint = hash_buf(string, len); - - xkb_atom_t *atomp = &table->root; - while (*atomp != XKB_ATOM_NONE) { - struct atom_node *node = &darray_item(table->table, *atomp); - - if (fingerprint > node->fingerprint) { - atomp = &node->right; - } - else if (fingerprint < node->fingerprint) { - atomp = &node->left; - } - else { - /* Now start testing the strings. */ - const int cmp = strncmp(string, node->string, len); - if (likely(cmp == 0 && node->string[len] == '\0')) { - return *atomp; - } - else if (cmp > 0) { - atomp = &node->right; + if (darray_size(table->strings) > 0.80 * table->index_size) { + table->index_size *= 2; + table->index = realloc(table->index, table->index_size * sizeof(*table->index)); + memset(table->index, 0, table->index_size * sizeof(*table->index)); + for (size_t j = 1; j < darray_size(table->strings); j++) { + const char *s = darray_item(table->strings, j); + uint32_t hash = hash_buf(s, strlen(s)); + for (size_t i = 0; i < table->index_size; i++) { + size_t index_pos = (hash + i) & (table->index_size - 1); + if (index_pos == 0) + continue; + + xkb_atom_t atom = table->index[index_pos]; + if (atom == XKB_ATOM_NONE) { + table->index[index_pos] = j; + break; + } } - else { - atomp = &node->left; + } + } + + uint32_t hash = hash_buf(string, len); + for (size_t i = 0; i < table->index_size; i++) { + size_t index_pos = (hash + i) & (table->index_size - 1); + if (index_pos == 0) + continue; + + xkb_atom_t existing_atom = table->index[index_pos]; + if (existing_atom == XKB_ATOM_NONE) { + if (add) { + xkb_atom_t new_atom = darray_size(table->strings); + darray_append(table->strings, strndup(string, len)); + table->index[index_pos] = new_atom; + return new_atom; + } else { + return XKB_ATOM_NONE; } } + + const char *existing_value = darray_item(table->strings, existing_atom); + if (strncmp(existing_value, string, len) == 0 && existing_value[len] == '\0') + return existing_atom; } - if (!add) - return XKB_ATOM_NONE; - - struct atom_node node; - node.string = strndup(string, len); - assert(node.string != NULL); - node.left = node.right = XKB_ATOM_NONE; - node.fingerprint = fingerprint; - xkb_atom_t atom = darray_size(table->table); - /* Do this before the append, as it may realloc and change the offsets. */ - *atomp = atom; - darray_append(table->table, node); - return atom; + assert(!"couldn't find an empty slot during probing"); + return XKB_ATOM_NONE; } diff --git a/src/compose/parser.c b/src/compose/parser.c index 0f85a92..08018f2 100644 --- a/src/compose/parser.c +++ b/src/compose/parser.c @@ -327,109 +327,108 @@ struct production { xkb_mod_mask_t mods; }; -static uint32_t -add_node(struct xkb_compose_table *table, xkb_keysym_t keysym) -{ - struct compose_node new = { - .keysym = keysym, - .next = 0, - .is_leaf = true, - }; - darray_append(table->nodes, new); - return darray_size(table->nodes) - 1; -} - static void add_production(struct xkb_compose_table *table, struct scanner *s, const struct production *production) { - unsigned lhs_pos; - uint32_t curr; - struct compose_node *node; - - curr = 0; - node = &darray_item(table->nodes, curr); + unsigned lhs_pos = 0; + uint16_t curr = darray_size(table->nodes) == 1 ? 0 : 1; + uint16_t *pptr = NULL; + struct compose_node *node = NULL; + + /* Warn before potentially going over the limit, discard silently after. */ + if (darray_size(table->nodes) + production->len + MAX_LHS_LEN > MAX_COMPOSE_NODES) + scanner_warn(s, "too many sequences for one Compose file; will ignore further lines"); + if (darray_size(table->nodes) + production->len >= MAX_COMPOSE_NODES) + return; /* - * Insert the sequence to the trie, creating new nodes as needed. + * Insert the sequence to the ternary search tree, creating new nodes as + * needed. * - * TODO: This can be sped up a bit by first trying the path that the - * previous production took, and only then doing the linear search - * through the trie levels. This will work because sequences in the - * Compose files are often clustered by a common prefix; especially - * in the 1st and 2nd keysyms, which is where the largest variation - * (thus, longest search) is. + * TODO: We insert in the order given, this means some inputs can create + * long O(n) chains, which results in total O(n^2) parsing time. We should + * ensure the tree is reasonably balanced somehow. */ - for (lhs_pos = 0; lhs_pos < production->len; lhs_pos++) { - while (production->lhs[lhs_pos] != node->keysym) { - if (node->next == 0) { - uint32_t next = add_node(table, production->lhs[lhs_pos]); - /* Refetch since add_node could have realloc()ed. */ - node = &darray_item(table->nodes, curr); - node->next = next; + while (true) { + const xkb_keysym_t keysym = production->lhs[lhs_pos]; + const bool last = lhs_pos + 1 == production->len; + + if (curr == 0) { + /* + * Create a new node and update the parent pointer to it. + * Update the pointer first because the append invalidates it. + */ + struct compose_node new = { + .keysym = keysym, + .lokid = 0, + .hikid = 0, + .internal = { + .eqkid = 0, + .is_leaf = false, + }, + }; + curr = darray_size(table->nodes); + if (pptr != NULL) { + *pptr = curr; + pptr = NULL; } - - curr = node->next; - node = &darray_item(table->nodes, curr); + darray_append(table->nodes, new); } - if (lhs_pos + 1 == production->len) - break; + node = &darray_item(table->nodes, curr); - if (node->is_leaf) { - if (node->u.leaf.utf8 != 0 || - node->u.leaf.keysym != XKB_KEY_NoSymbol) { + if (keysym < node->keysym) { + pptr = &node->lokid; + curr = node->lokid; + } else if (keysym > node->keysym) { + pptr = &node->hikid; + curr = node->hikid; + } else if (!last) { + if (node->is_leaf) { scanner_warn(s, "a sequence already exists which is a prefix of this sequence; overriding"); - node->u.leaf.utf8 = 0; - node->u.leaf.keysym = XKB_KEY_NoSymbol; + node->internal.eqkid = node->lokid = node->hikid = 0; + node->internal.is_leaf = false; } - - { - uint32_t successor = add_node(table, production->lhs[lhs_pos + 1]); - /* Refetch since add_node could have realloc()ed. */ - node = &darray_item(table->nodes, curr); - node->is_leaf = false; - node->u.successor = successor; + lhs_pos++; + pptr = &node->internal.eqkid; + curr = node->internal.eqkid; + } else { + if (node->is_leaf) { + bool same_string = + (node->leaf.utf8 == 0 && !production->has_string) || + ( + node->leaf.utf8 != 0 && production->has_string && + streq(&darray_item(table->utf8, node->leaf.utf8), + production->string) + ); + bool same_keysym = + (node->leaf.keysym == XKB_KEY_NoSymbol && !production->has_keysym) || + ( + node->leaf.keysym != XKB_KEY_NoSymbol && production->has_keysym && + node->leaf.keysym == production->keysym + ); + if (same_string && same_keysym) { + scanner_warn(s, "this compose sequence is a duplicate of another; skipping line"); + return; + } else { + scanner_warn(s, "this compose sequence already exists; overriding"); + } + } else if (node->internal.eqkid != 0) { + scanner_warn(s, "this compose sequence is a prefix of another; skipping line"); + return; + } + node->is_leaf = true; + if (production->has_string) { + node->leaf.utf8 = darray_size(table->utf8); + darray_append_items(table->utf8, production->string, + strlen(production->string) + 1); + } + if (production->has_keysym) { + node->leaf.keysym = production->keysym; } - } - - curr = node->u.successor; - node = &darray_item(table->nodes, curr); - } - - if (!node->is_leaf) { - scanner_warn(s, "this compose sequence is a prefix of another; skipping line"); - return; - } - - if (node->u.leaf.utf8 != 0 || node->u.leaf.keysym != XKB_KEY_NoSymbol) { - bool same_string = - (node->u.leaf.utf8 == 0 && !production->has_string) || - ( - node->u.leaf.utf8 != 0 && production->has_string && - streq(&darray_item(table->utf8, node->u.leaf.utf8), - production->string) - ); - bool same_keysym = - (node->u.leaf.keysym == XKB_KEY_NoSymbol && !production->has_keysym) || - ( - node->u.leaf.keysym != XKB_KEY_NoSymbol && production->has_keysym && - node->u.leaf.keysym == production->keysym - ); - if (same_string && same_keysym) { - scanner_warn(s, "this compose sequence is a duplicate of another; skipping line"); return; } - scanner_warn(s, "this compose sequence already exists; overriding"); - } - - if (production->has_string) { - node->u.leaf.utf8 = darray_size(table->utf8); - darray_append_items(table->utf8, production->string, - strlen(production->string) + 1); - } - if (production->has_keysym) { - node->u.leaf.keysym = production->keysym; } } diff --git a/src/compose/state.c b/src/compose/state.c index 9c64eb4..6ba0344 100644 --- a/src/compose/state.c +++ b/src/compose/state.c @@ -41,8 +41,8 @@ struct xkb_compose_state { * This is also sufficient for inferring the current status; see * xkb_compose_state_get_status(). */ - uint32_t prev_context; - uint32_t context; + uint16_t prev_context; + uint16_t context; }; XKB_EXPORT struct xkb_compose_state * @@ -91,7 +91,7 @@ xkb_compose_state_get_compose_table(struct xkb_compose_state *state) XKB_EXPORT enum xkb_compose_feed_result xkb_compose_state_feed(struct xkb_compose_state *state, xkb_keysym_t keysym) { - uint32_t context; + uint16_t context; const struct compose_node *node; /* @@ -109,17 +109,20 @@ xkb_compose_state_feed(struct xkb_compose_state *state, xkb_keysym_t keysym) node = &darray_item(state->table->nodes, state->context); - context = (node->is_leaf ? 0 : node->u.successor); - node = &darray_item(state->table->nodes, context); + context = (node->is_leaf ? 1 : node->internal.eqkid); + if (context == 1 && darray_size(state->table->nodes) == 1) + context = 0; - while (node->keysym != keysym && node->next != 0) { - context = node->next; + while (context != 0) { node = &darray_item(state->table->nodes, context); + if (keysym < node->keysym) + context = node->lokid; + else if (keysym > node->keysym) + context = node->hikid; + else + break; } - if (node->keysym != keysym) - context = 0; - state->prev_context = state->context; state->context = context; return XKB_COMPOSE_FEED_ACCEPTED; @@ -164,11 +167,11 @@ xkb_compose_state_get_utf8(struct xkb_compose_state *state, /* If there's no string specified, but only a keysym, try to do the * most helpful thing. */ - if (node->u.leaf.utf8 == 0 && node->u.leaf.keysym != XKB_KEY_NoSymbol) { + if (node->leaf.utf8 == 0 && node->leaf.keysym != XKB_KEY_NoSymbol) { char name[64]; int ret; - ret = xkb_keysym_to_utf8(node->u.leaf.keysym, name, sizeof(name)); + ret = xkb_keysym_to_utf8(node->leaf.keysym, name, sizeof(name)); if (ret < 0 || ret == 0) { /* ret < 0 is impossible. * ret == 0 means the keysym has no string representation. */ @@ -179,7 +182,7 @@ xkb_compose_state_get_utf8(struct xkb_compose_state *state, } return snprintf(buffer, size, "%s", - &darray_item(state->table->utf8, node->u.leaf.utf8)); + &darray_item(state->table->utf8, node->leaf.utf8)); fail: if (size > 0) @@ -194,5 +197,5 @@ xkb_compose_state_get_one_sym(struct xkb_compose_state *state) &darray_item(state->table->nodes, state->context); if (!node->is_leaf) return XKB_KEY_NoSymbol; - return node->u.leaf.keysym; + return node->leaf.keysym; } diff --git a/src/compose/table.c b/src/compose/table.c index 38d4406..8a8d11f 100644 --- a/src/compose/table.c +++ b/src/compose/table.c @@ -1,5 +1,5 @@ /* - * Copyright © 2013 Ran Benita + * Copyright © 2013,2021 Ran Benita * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -36,7 +36,7 @@ xkb_compose_table_new(struct xkb_context *ctx, { char *resolved_locale; struct xkb_compose_table *table; - struct compose_node root; + struct compose_node dummy; resolved_locale = resolve_locale(locale); if (!resolved_locale) @@ -58,12 +58,11 @@ xkb_compose_table_new(struct xkb_context *ctx, darray_init(table->nodes); darray_init(table->utf8); - root.keysym = XKB_KEY_NoSymbol; - root.next = 0; - root.is_leaf = true; - root.u.leaf.utf8 = 0; - root.u.leaf.keysym = XKB_KEY_NoSymbol; - darray_append(table->nodes, root); + dummy.keysym = XKB_KEY_NoSymbol; + dummy.leaf.is_leaf = true; + dummy.leaf.utf8 = 0; + dummy.leaf.keysym = XKB_KEY_NoSymbol; + darray_append(table->nodes, dummy); darray_append(table->utf8, '\0'); @@ -207,7 +206,8 @@ xkb_compose_table_new_from_locale(struct xkb_context *ctx, } free(path); - log_err(ctx, "couldn't find a Compose file for locale \"%s\"\n", locale); + log_err(ctx, "couldn't find a Compose file for locale \"%s\" (mapped to \"%s\")\n", + locale, table->locale); xkb_compose_table_unref(table); return NULL; diff --git a/src/compose/table.h b/src/compose/table.h index 05a415f..6be4348 100644 --- a/src/compose/table.h +++ b/src/compose/table.h @@ -1,5 +1,5 @@ /* - * Copyright © 2013 Ran Benita + * Copyright © 2013,2021 Ran Benita * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -29,36 +29,43 @@ #include "context.h" /* - * The compose table data structure is a simple trie. An example will - * help. Given these sequences: + * The compose table data structure is a ternary search tree. * - * : "first" dead_a - * : "second" dead_b - * : "third" dead_c + * Reference: https://www.drdobbs.com/database/ternary-search-trees/184410528 + * Visualization: https://www.cs.usfca.edu/~galles/visualization/TST.html * - * the trie would look like: + * Short example. Given these sequences: + * + * : "first" dead_a + * : "second" dead_b + * : "third" dead_c + * + * the tree would look like: + * + * -------- []--------- + * | | # + * v V + * -- [] -- [] -------- + * # | # | | + * v # -- [] -- + * -- [] -- # | # + * # | # v + * # -- [] -- + * # | # + * # * - * [root] ---> [] -----------------> [] -# - * | | | - * # v v - * [] ---> [] -# [] -# - * | | - - * # v # - * [] -# - * | - * # * where: - * - [root] is a special empty root node. * - [] is a node for a sequence keysym . - * - right arrows are `next` pointers. - * - down arrows are `successor` pointers. + * - right arrows are `hikid` pointers. + * - left arrows are `lokid` pointers. + * - down arrows are `eqkid` pointers. * - # is a nil pointer. * * The nodes are all kept in a contiguous array. Pointers are represented * as integer offsets into this array. A nil pointer is represented as 0 - * (which, helpfully, is the offset of the empty root node). + * (which, helpfully, is the offset of an empty dummy node). * - * Nodes without a successor are leaf nodes. Since a sequence cannot be a + * Nodes without an eqkid are leaf nodes. Since a sequence cannot be a * prefix of another, these are exactly the nodes which terminate the * sequences (in a bijective manner). * @@ -68,21 +75,35 @@ * \0 is so offset 0 points to an empty string). */ +/* Fits in uint16_t, also a good idea to have some limit. */ +#define MAX_COMPOSE_NODES 65535 + struct compose_node { xkb_keysym_t keysym; - /* Offset into xkb_compose_table::nodes. */ - unsigned int next:31; - bool is_leaf:1; + + /* Offset into xkb_compose_table::nodes or 0. */ + uint16_t lokid; + /* Offset into xkb_compose_table::nodes or 0. */ + uint16_t hikid; union { - /* Offset into xkb_compose_table::nodes. */ - uint32_t successor; + struct { + uint32_t _pad:31; + bool is_leaf:1; + }; + struct { + uint32_t _pad:31; + bool is_leaf:1; + /* Offset into xkb_compose_table::nodes or 0. */ + uint16_t eqkid; + } internal; struct { /* Offset into xkb_compose_table::utf8. */ - uint32_t utf8; + uint32_t utf8:31; + bool is_leaf:1; xkb_keysym_t keysym; } leaf; - } u; + }; }; struct xkb_compose_table { diff --git a/src/keysym-utf.c b/src/keysym-utf.c index a49944a..7769672 100644 --- a/src/keysym-utf.c +++ b/src/keysym-utf.c @@ -614,8 +614,8 @@ static const struct codepair keysymtab[] = { { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */ { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */ { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */ - { 0x0bdc, 0x22a2 }, /* lefttack ⊢ RIGHT TACK */ - { 0x0bfc, 0x22a3 }, /* righttack ⊣ LEFT TACK */ + { 0x0bdc, 0x22a3 }, /* lefttack ⊣ LEFT TACK */ + { 0x0bfc, 0x22a2 }, /* righttack ⊢ RIGHT TACK */ { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */ { 0x0ce0, 0x05d0 }, /* hebrew_aleph א HEBREW LETTER ALEF */ { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */ @@ -810,7 +810,7 @@ static const struct codepair keysymtab[] = { { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */ { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */ { 0x0ef2, 0x317f }, /* Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */ -/* 0x0ef3 Hangul_KkogjiDalrinIeung ? ??? */ + { 0x0ef3, 0x3181 }, /* Hangul_KkogjiDalrinIeung ㆁ HANGUL LETTER YESIEUNG */ { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */ { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */ { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆍ HANGUL LETTER ARAEA */ diff --git a/src/keysym.c b/src/keysym.c index 7b492e2..bf49c63 100644 --- a/src/keysym.c +++ b/src/keysym.c @@ -61,42 +61,25 @@ get_name(const struct name_keysym *entry) return keysym_names + entry->offset; } -static int -compare_by_keysym(const void *a, const void *b) -{ - const xkb_keysym_t *key = a; - const struct name_keysym *entry = b; - if (*key < entry->keysym) - return -1; - if (*key > entry->keysym) - return 1; - return 0; -} - -static int -compare_by_name(const void *a, const void *b) -{ - const char *key = a; - const struct name_keysym *entry = b; - return istrcmp(key, get_name(entry)); -} - XKB_EXPORT int xkb_keysym_get_name(xkb_keysym_t ks, char *buffer, size_t size) { - const struct name_keysym *entry; - if ((ks & ((unsigned long) ~0x1fffffff)) != 0) { snprintf(buffer, size, "Invalid"); return -1; } - entry = bsearch(&ks, keysym_to_name, - ARRAY_SIZE(keysym_to_name), - sizeof(*keysym_to_name), - compare_by_keysym); - if (entry) - return snprintf(buffer, size, "%s", get_name(entry)); + int32_t lo = 0, hi = ARRAY_SIZE(keysym_to_name) - 1; + while (hi >= lo) { + int32_t mid = (lo + hi) / 2; + if (ks > keysym_to_name[mid].keysym) { + lo = mid + 1; + } else if (ks < keysym_to_name[mid].keysym) { + hi = mid - 1; + } else { + return snprintf(buffer, size, "%s", get_name(&keysym_to_name[mid])); + } + } /* Unnamed Unicode codepoint. */ if (ks >= 0x01000100 && ks <= 0x0110ffff) { @@ -109,108 +92,135 @@ xkb_keysym_get_name(xkb_keysym_t ks, char *buffer, size_t size) } /* - * Find the correct keysym if one case-insensitive match is given. - * - * The name_to_keysym table is sorted by istrcmp(). So bsearch() may return - * _any_ of all possible case-insensitive duplicates. This function searches the - * returned entry @entry, all previous and all next entries that match by - * case-insensitive comparison and returns the exact match to @name. If @icase - * is true, then this returns the best case-insensitive match instead of a - * correct match. - * The "best" case-insensitive match is the lower-case keysym which we find with - * the help of xkb_keysym_is_lower(). - * The only keysyms that only differ by letter-case are keysyms that are - * available as lower-case and upper-case variant (like KEY_a and KEY_A). So - * returning the first lower-case match is enough in this case. + * Parse the numeric part of a 0xXXXX and UXXXX keysym. + * Not using strtoul -- it's slower and accepts a bunch of stuff + * we don't want to allow, like signs, spaces, even locale stuff. */ -static const struct name_keysym * -find_sym(const struct name_keysym *entry, const char *name, bool icase) +static bool +parse_keysym_hex(const char *s, uint32_t *out) { - const struct name_keysym *iter, *last; - size_t len = ARRAY_SIZE(name_to_keysym); - - if (!entry) - return NULL; - - if (!icase && strcmp(get_name(entry), name) == 0) - return entry; - if (icase && xkb_keysym_is_lower(entry->keysym)) - return entry; - - for (iter = entry - 1; iter >= name_to_keysym; --iter) { - if (!icase && strcmp(get_name(iter), name) == 0) - return iter; - if (istrcmp(get_name(iter), get_name(entry)) != 0) - break; - if (icase && xkb_keysym_is_lower(iter->keysym)) - return iter; + uint32_t result = 0; + int i; + for (i = 0; i < 8 && s[i] != '\0'; i++) { + result <<= 4; + if ('0' <= s[i] && s[i] <= '9') + result += s[i] - '0'; + else if ('a' <= s[i] && s[i] <= 'f') + result += 10 + s[i] - 'a'; + else if ('A' <= s[i] && s[i] <= 'F') + result += 10 + s[i] - 'A'; + else + return false; } - - last = name_to_keysym + len; - for (iter = entry + 1; iter < last; ++iter) { - if (!icase && strcmp(get_name(iter), name) == 0) - return iter; - if (istrcmp(get_name(iter), get_name(entry)) != 0) - break; - if (icase && xkb_keysym_is_lower(iter->keysym)) - return iter; - } - - if (icase) - return entry; - return NULL; + *out = result; + return s[i] == '\0' && i > 0; } XKB_EXPORT xkb_keysym_t -xkb_keysym_from_name(const char *s, enum xkb_keysym_flags flags) +xkb_keysym_from_name(const char *name, enum xkb_keysym_flags flags) { - const struct name_keysym *entry; + const struct name_keysym *entry = NULL; char *tmp; - xkb_keysym_t val; + uint32_t val; bool icase = (flags & XKB_KEYSYM_CASE_INSENSITIVE); if (flags & ~XKB_KEYSYM_CASE_INSENSITIVE) return XKB_KEY_NoSymbol; - entry = bsearch(s, name_to_keysym, - ARRAY_SIZE(name_to_keysym), - sizeof(*name_to_keysym), - compare_by_name); - entry = find_sym(entry, s, icase); - if (entry) - return entry->keysym; - - if (*s == 'U' || (icase && *s == 'u')) { - val = strtoul(&s[1], &tmp, 16); - if (tmp && *tmp != '\0') + /* + * We need to !icase case to be fast, for e.g. Compose file parsing. + * So do it in a fast path. + */ + if (!icase) { + size_t pos = keysym_name_perfect_hash(name); + if (pos < ARRAY_SIZE(name_to_keysym)) { + const char *s = get_name(&name_to_keysym[pos]); + if (strcmp(name, s) == 0) + return name_to_keysym[pos].keysym; + } + } + /* + * Find the correct keysym for case-insensitive match. + * + * The name_to_keysym table is sorted by istrcmp(). So the binary + * search may return _any_ of all possible case-insensitive duplicates. This + * code searches the entry, all previous and all next entries that match by + * case-insensitive comparison and returns the "best" case-insensitive + * match. + * + * The "best" case-insensitive match is the lower-case keysym which we find + * with the help of xkb_keysym_is_lower(). The only keysyms that only differ + * by letter-case are keysyms that are available as lower-case and + * upper-case variant (like KEY_a and KEY_A). So returning the first + * lower-case match is enough in this case. + */ + else { + int32_t lo = 0, hi = ARRAY_SIZE(name_to_keysym) - 1; + while (hi >= lo) { + int32_t mid = (lo + hi) / 2; + int cmp = istrcmp(name, get_name(&name_to_keysym[mid])); + if (cmp > 0) { + lo = mid + 1; + } else if (cmp < 0) { + hi = mid - 1; + } else { + entry = &name_to_keysym[mid]; + break; + } + } + if (entry) { + const struct name_keysym *iter, *last; + + if (icase && xkb_keysym_is_lower(entry->keysym)) + return entry->keysym; + + for (iter = entry - 1; iter >= name_to_keysym; --iter) { + if (istrcmp(get_name(iter), get_name(entry)) != 0) + break; + if (xkb_keysym_is_lower(iter->keysym)) + return iter->keysym; + } + + last = name_to_keysym + ARRAY_SIZE(name_to_keysym); + for (iter = entry + 1; iter < last; ++iter) { + if (istrcmp(get_name(iter), get_name(entry)) != 0) + break; + if (xkb_keysym_is_lower(iter->keysym)) + return iter->keysym; + } + + return entry->keysym; + } + } + + if (*name == 'U' || (icase && *name == 'u')) { + if (!parse_keysym_hex(&name[1], &val)) return XKB_KEY_NoSymbol; if (val < 0x20 || (val > 0x7e && val < 0xa0)) return XKB_KEY_NoSymbol; if (val < 0x100) - return val; + return (xkb_keysym_t) val; if (val > 0x10ffff) return XKB_KEY_NoSymbol; - return val | 0x01000000; + return (xkb_keysym_t) val | 0x01000000; } - else if (s[0] == '0' && (s[1] == 'x' || (icase && s[1] == 'X'))) { - val = strtoul(&s[2], &tmp, 16); - if (tmp && *tmp != '\0') + else if (name[0] == '0' && (name[1] == 'x' || (icase && name[1] == 'X'))) { + if (!parse_keysym_hex(&name[2], &val)) return XKB_KEY_NoSymbol; - - return val; + return (xkb_keysym_t) val; } /* Stupid inconsistency between the headers and XKeysymDB: the former has * no separating underscore, while some XF86* syms in the latter did. * As a last ditch effort, try without. */ - if (strncmp(s, "XF86_", 5) == 0 || - (icase && istrncmp(s, "XF86_", 5) == 0)) { + if (strncmp(name, "XF86_", 5) == 0 || + (icase && istrncmp(name, "XF86_", 5) == 0)) { xkb_keysym_t ret; - tmp = strdup(s); + tmp = strdup(name); if (!tmp) return XKB_KEY_NoSymbol; - memmove(&tmp[4], &tmp[5], strlen(s) - 5 + 1); + memmove(&tmp[4], &tmp[5], strlen(name) - 5 + 1); ret = xkb_keysym_from_name(tmp, flags); free(tmp); return ret; diff --git a/src/ks_tables.h b/src/ks_tables.h index 12dc4c0..46d6f98 100644 --- a/src/ks_tables.h +++ b/src/ks_tables.h @@ -613,6 +613,11 @@ static const char *keysym_names = "Codeinput\0" "colon\0" "ColonSign\0" + "combining_acute\0" + "combining_belowdot\0" + "combining_grave\0" + "combining_hook\0" + "combining_tilde\0" "comma\0" "containsas\0" "Control_L\0" @@ -2203,10 +2208,23 @@ static const char *keysym_names = "x\0" "Xabovedot\0" "xabovedot\0" + "XF8610ChannelsDown\0" + "XF8610ChannelsUp\0" + "XF863DMode\0" "XF86AddFavorite\0" + "XF86Addressbook\0" + "XF86ALSToggle\0" "XF86ApplicationLeft\0" "XF86ApplicationRight\0" + "XF86AppSelect\0" + "XF86AspectRatio\0" + "XF86Assistant\0" + "XF86AttendantOff\0" + "XF86AttendantOn\0" + "XF86AttendantToggle\0" + "XF86Audio\0" "XF86AudioCycleTrack\0" + "XF86AudioDesc\0" "XF86AudioForward\0" "XF86AudioLowerVolume\0" "XF86AudioMedia\0" @@ -2230,41 +2248,83 @@ static const char *keysym_names = "XF86Blue\0" "XF86Bluetooth\0" "XF86Book\0" + "XF86Break\0" "XF86BrightnessAdjust\0" + "XF86BrightnessAuto\0" + "XF86BrightnessMax\0" + "XF86BrightnessMin\0" + "XF86Buttonconfig\0" "XF86Calculater\0" "XF86Calculator\0" "XF86Calendar\0" + "XF86CameraDown\0" + "XF86CameraFocus\0" + "XF86CameraLeft\0" + "XF86CameraRight\0" + "XF86CameraUp\0" + "XF86CameraZoomIn\0" + "XF86CameraZoomOut\0" "XF86CD\0" + "XF86ChannelDown\0" + "XF86ChannelUp\0" "XF86Clear\0" "XF86ClearGrab\0" "XF86Close\0" "XF86Community\0" + "XF86ContextMenu\0" "XF86ContrastAdjust\0" + "XF86ControlPanel\0" "XF86Copy\0" "XF86Cut\0" "XF86CycleAngle\0" + "XF86Data\0" + "XF86Database\0" "XF86Display\0" + "XF86DisplayOff\0" + "XF86DisplayToggle\0" "XF86Documents\0" "XF86DOS\0" + "XF86DVD\0" + "XF86Editor\0" "XF86Eject\0" "XF86Excel\0" "XF86Explorer\0" + "XF86FastReverse\0" "XF86Favorites\0" "XF86Finance\0" + "XF86Fn\0" + "XF86Fn_Esc\0" + "XF86FnRightShift\0" "XF86Forward\0" "XF86FrameBack\0" "XF86FrameForward\0" "XF86FullScreen\0" "XF86Game\0" "XF86Go\0" + "XF86GraphicsEditor\0" "XF86Green\0" + "XF86HangupPhone\0" "XF86Hibernate\0" "XF86History\0" "XF86HomePage\0" "XF86HotLinks\0" + "XF86Images\0" + "XF86Info\0" "XF86iTouch\0" + "XF86Journal\0" "XF86KbdBrightnessDown\0" "XF86KbdBrightnessUp\0" + "XF86KbdInputAssistAccept\0" + "XF86KbdInputAssistCancel\0" + "XF86KbdInputAssistNext\0" + "XF86KbdInputAssistNextgroup\0" + "XF86KbdInputAssistPrev\0" + "XF86KbdInputAssistPrevgroup\0" + "XF86KbdLcdMenu1\0" + "XF86KbdLcdMenu2\0" + "XF86KbdLcdMenu3\0" + "XF86KbdLcdMenu4\0" + "XF86KbdLcdMenu5\0" "XF86KbdLightOnOff\0" "XF86Keyboard\0" "XF86Launch0\0" @@ -2283,13 +2343,54 @@ static const char *keysym_names = "XF86LaunchD\0" "XF86LaunchE\0" "XF86LaunchF\0" + "XF86LeftDown\0" + "XF86LeftUp\0" "XF86LightBulb\0" + "XF86LightsToggle\0" "XF86LogGrabInfo\0" "XF86LogOff\0" "XF86LogWindowTree\0" + "XF86Macro1\0" + "XF86Macro10\0" + "XF86Macro11\0" + "XF86Macro12\0" + "XF86Macro13\0" + "XF86Macro14\0" + "XF86Macro15\0" + "XF86Macro16\0" + "XF86Macro17\0" + "XF86Macro18\0" + "XF86Macro19\0" + "XF86Macro2\0" + "XF86Macro20\0" + "XF86Macro21\0" + "XF86Macro22\0" + "XF86Macro23\0" + "XF86Macro24\0" + "XF86Macro25\0" + "XF86Macro26\0" + "XF86Macro27\0" + "XF86Macro28\0" + "XF86Macro29\0" + "XF86Macro3\0" + "XF86Macro30\0" + "XF86Macro4\0" + "XF86Macro5\0" + "XF86Macro6\0" + "XF86Macro7\0" + "XF86Macro8\0" + "XF86Macro9\0" + "XF86MacroPreset1\0" + "XF86MacroPreset2\0" + "XF86MacroPreset3\0" + "XF86MacroPresetCycle\0" + "XF86MacroRecordStart\0" + "XF86MacroRecordStop\0" "XF86Mail\0" "XF86MailForward\0" "XF86Market\0" + "XF86MediaRepeat\0" + "XF86MediaTopMenu\0" "XF86Meeting\0" "XF86Memo\0" "XF86MenuKB\0" @@ -2305,44 +2406,77 @@ static const char *keysym_names = "XF86New\0" "XF86News\0" "XF86Next_VMode\0" + "XF86NextFavorite\0" + "XF86NotificationCenter\0" + "XF86Numeric0\0" + "XF86Numeric1\0" + "XF86Numeric11\0" + "XF86Numeric12\0" + "XF86Numeric2\0" + "XF86Numeric3\0" + "XF86Numeric4\0" + "XF86Numeric5\0" + "XF86Numeric6\0" + "XF86Numeric7\0" + "XF86Numeric8\0" + "XF86Numeric9\0" + "XF86NumericA\0" + "XF86NumericB\0" + "XF86NumericC\0" + "XF86NumericD\0" + "XF86NumericPound\0" + "XF86NumericStar\0" "XF86OfficeHome\0" + "XF86OnScreenKeyboard\0" "XF86Open\0" "XF86OpenURL\0" "XF86Option\0" "XF86Paste\0" + "XF86PauseRecord\0" "XF86Phone\0" + "XF86PickupPhone\0" "XF86Pictures\0" "XF86PowerDown\0" "XF86PowerOff\0" + "XF86Presentation\0" "XF86Prev_VMode\0" + "XF86PrivacyScreenToggle\0" "XF86Q\0" "XF86Red\0" "XF86Refresh\0" "XF86Reload\0" "XF86Reply\0" "XF86RFKill\0" + "XF86RightDown\0" + "XF86RightUp\0" "XF86RockerDown\0" "XF86RockerEnter\0" "XF86RockerUp\0" + "XF86RootMenu\0" "XF86RotateWindows\0" "XF86RotationKB\0" "XF86RotationLockToggle\0" "XF86RotationPB\0" "XF86Save\0" "XF86ScreenSaver\0" + "XF86Screensaver\0" "XF86ScrollClick\0" "XF86ScrollDown\0" "XF86ScrollUp\0" "XF86Search\0" "XF86Select\0" + "XF86SelectiveScreenshot\0" "XF86Send\0" "XF86Shop\0" "XF86Sleep\0" + "XF86SlowReverse\0" "XF86Spell\0" + "XF86SpellCheck\0" "XF86SplitScreen\0" "XF86Standby\0" "XF86Start\0" "XF86Stop\0" + "XF86StopRecord\0" "XF86Subtitle\0" "XF86Support\0" "XF86Suspend\0" @@ -2358,6 +2492,7 @@ static const char *keysym_names = "XF86Switch_VT_7\0" "XF86Switch_VT_8\0" "XF86Switch_VT_9\0" + "XF86Taskmanager\0" "XF86TaskPane\0" "XF86Terminal\0" "XF86Time\0" @@ -2369,24 +2504,31 @@ static const char *keysym_names = "XF86TouchpadToggle\0" "XF86Travel\0" "XF86Ungrab\0" + "XF86Unmute\0" "XF86User1KB\0" "XF86User2KB\0" "XF86UserPB\0" "XF86UWB\0" "XF86VendorHome\0" "XF86Video\0" + "XF86VideoPhone\0" "XF86View\0" + "XF86VOD\0" + "XF86VoiceCommand\0" + "XF86Voicemail\0" "XF86WakeUp\0" "XF86WebCam\0" "XF86WheelButton\0" "XF86WLAN\0" "XF86Word\0" + "XF86WPSButton\0" "XF86WWAN\0" "XF86WWW\0" "XF86Xfer\0" "XF86Yellow\0" "XF86ZoomIn\0" "XF86ZoomOut\0" + "XF86ZoomReset\0" "Y\0" "y\0" "Yacute\0" @@ -2424,6 +2566,323 @@ static const char *keysym_names = #pragma GCC diagnostic pop #endif +static const uint16_t keysym_name_G[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1650, 0, 0, 0, 0, + 0, 1245, 0, 3310, 4490, 0, 0, 0, 0, 4529, 0, 0, 0, 0, 3857, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2266, 0, 0, 0, 0, 0, + 3688, 0, 0, 4511, 0, 0, 0, 0, 0, 0, 0, 3299, 0, 0, 0, 0, 0, 544, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1200, 3223, 4207, 0, 672, 0, 0, 0, 0, 0, 3303, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4369, 0, 2211, 0, 0, 0, 2592, 0, 0, + 0, 0, 1606, 0, 2530, 1223, 0, 0, 727, 0, 0, 297, 0, 4204, 0, 0, 0, 0, + 0, 2370, 0, 0, 3160, 0, 0, 0, 0, 3661, 0, 0, 0, 0, 1253, 0, 0, 2229, + 4008, 4269, 0, 0, 0, 0, 1572, 0, 1730, 3284, 0, 3643, 0, 0, 0, 4448, + 783, 0, 0, 0, 419, 0, 0, 564, 0, 0, 0, 0, 0, 1896, 2895, 0, 303, 0, + 3482, 1037, 0, 0, 0, 888, 0, 0, 0, 0, 3829, 0, 486, 0, 0, 0, 244, 0, + 1731, 0, 0, 0, 0, 1609, 417, 2333, 2106, 4289, 1503, 0, 0, 0, 0, 0, + 1880, 0, 0, 0, 0, 1740, 0, 0, 1273, 1470, 0, 0, 188, 0, 0, 0, 0, 1001, + 0, 0, 3155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2269, 3789, 0, 0, 0, 0, 0, 0, 0, + 0, 1492, 3200, 0, 0, 0, 0, 0, 2009, 24, 0, 0, 0, 80, 3123, 0, 0, 0, 0, + 0, 0, 0, 1126, 0, 0, 0, 0, 3585, 858, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 811, 0, 4003, 3813, 0, 0, 2583, 113, 4408, 0, 386, 4182, 0, 0, 142, + 1325, 0, 0, 3074, 2313, 1469, 0, 0, 0, 3369, 2485, 0, 0, 4129, 1512, 0, + 0, 0, 0, 0, 771, 0, 0, 0, 767, 0, 0, 0, 1664, 0, 1616, 0, 0, 2363, 0, + 0, 0, 0, 2513, 0, 496, 1054, 0, 2211, 0, 0, 0, 0, 0, 1986, 348, 0, 0, + 2203, 0, 2784, 1635, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 347, 3512, 0, + 0, 0, 1129, 4390, 0, 4273, 0, 0, 1171, 0, 0, 0, 114, 874, 4517, 0, 0, + 0, 0, 0, 0, 1747, 0, 0, 0, 0, 0, 4188, 0, 2430, 0, 0, 0, 0, 0, 0, 2788, + 0, 2921, 0, 0, 874, 0, 0, 0, 0, 0, 2047, 0, 1604, 0, 0, 3995, 2895, 0, + 0, 0, 0, 0, 2604, 0, 0, 1881, 0, 0, 0, 4253, 1024, 4228, 0, 0, 1914, + 4001, 1011, 1639, 0, 0, 0, 0, 0, 3540, 0, 0, 2461, 0, 0, 3833, 0, 0, + 2013, 0, 0, 0, 2245, 0, 3283, 2902, 2494, 0, 610, 1708, 0, 0, 0, 0, 0, + 2934, 4383, 0, 1636, 0, 0, 0, 0, 3355, 0, 1971, 482, 1599, 0, 3749, + 2152, 0, 0, 0, 0, 1097, 982, 3592, 2806, 0, 0, 0, 0, 173, 780, 0, 2659, + 3730, 0, 599, 361, 382, 0, 574, 571, 0, 158, 0, 0, 0, 4332, 654, 0, + 478, 2666, 0, 0, 4354, 0, 723, 745, 0, 2334, 0, 0, 0, 315, 0, 0, 0, + 2285, 0, 0, 0, 0, 0, 0, 0, 0, 190, 2779, 2749, 0, 0, 0, 0, 0, 2127, 0, + 0, 168, 0, 2437, 2837, 3502, 0, 0, 0, 0, 0, 0, 1849, 1598, 0, 4373, 0, + 1200, 0, 238, 3420, 0, 3178, 0, 1571, 372, 0, 0, 1495, 3121, 0, 4099, + 0, 3109, 0, 0, 0, 0, 0, 1373, 0, 4432, 0, 0, 3370, 3279, 0, 0, 2799, 0, + 0, 0, 0, 2953, 3278, 1971, 1613, 0, 0, 0, 0, 0, 0, 0, 0, 1369, 2843, 0, + 989, 0, 358, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 964, 3811, 0, 0, 0, 0, + 1364, 0, 0, 344, 2501, 0, 0, 1167, 1318, 137, 0, 0, 0, 930, 0, 1340, + 1404, 873, 0, 0, 0, 0, 0, 391, 0, 2376, 3115, 2659, 1273, 2214, 0, + 1769, 0, 194, 0, 3009, 0, 0, 1100, 2540, 1308, 1729, 3882, 0, 0, 1925, + 0, 0, 0, 0, 3324, 3605, 1221, 0, 0, 0, 644, 4360, 4557, 0, 0, 0, 0, + 1224, 2656, 0, 4378, 4065, 0, 0, 0, 0, 0, 203, 0, 173, 0, 0, 0, 435, + 2916, 3546, 288, 0, 0, 0, 0, 0, 3744, 2681, 0, 0, 4396, 0, 0, 0, 3078, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 615, 1523, 0, 0, 2313, 4347, 3320, 0, 0, + 3360, 566, 0, 88, 0, 0, 0, 0, 0, 2736, 0, 0, 4062, 0, 1939, 0, 2354, 0, + 4354, 4398, 0, 2328, 1976, 270, 0, 0, 2344, 1040, 0, 0, 3016, 4339, + 1220, 1136, 0, 1813, 0, 0, 990, 1892, 2453, 3252, 0, 2452, 2497, 2007, + 3329, 508, 0, 4500, 0, 0, 0, 0, 4293, 1207, 0, 719, 257, 0, 4532, 3884, + 2899, 2065, 967, 0, 0, 0, 4561, 0, 0, 1197, 0, 0, 0, 2578, 3109, 0, + 112, 0, 1923, 0, 809, 0, 4444, 3287, 0, 3693, 4508, 0, 0, 0, 0, 0, 0, + 0, 2024, 0, 0, 0, 0, 0, 2196, 0, 0, 0, 0, 3174, 3287, 0, 1813, 0, 0, + 3626, 2618, 2811, 0, 0, 0, 0, 910, 0, 1874, 0, 290, 1791, 0, 1291, 0, + 4027, 0, 3605, 0, 0, 0, 3275, 874, 3363, 0, 0, 1321, 0, 1500, 0, 0, + 4206, 2033, 4437, 2991, 0, 0, 0, 0, 4382, 3870, 1984, 0, 0, 0, 1096, 0, + 0, 4036, 0, 0, 3578, 1230, 0, 0, 2550, 0, 978, 3007, 0, 140, 0, 1157, + 0, 0, 0, 0, 0, 0, 4544, 4453, 0, 0, 0, 0, 504, 1136, 1395, 0, 0, 0, + 1736, 0, 2745, 952, 0, 0, 2650, 0, 0, 3808, 0, 0, 1148, 0, 0, 1821, + 622, 1626, 4464, 0, 0, 3930, 2404, 117, 0, 0, 10, 0, 2283, 1235, 4224, + 0, 0, 0, 0, 2917, 0, 0, 0, 2356, 0, 156, 1142, 0, 0, 0, 0, 1677, 0, + 3796, 3689, 602, 0, 0, 737, 0, 0, 1591, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 3265, 0, 0, 0, 0, 621, 2329, 2059, 2850, 0, 0, 0, 0, + 40, 0, 0, 1095, 0, 743, 3541, 0, 0, 0, 3625, 4459, 1580, 4164, 1255, 0, + 0, 0, 1599, 0, 1036, 0, 0, 3438, 2656, 0, 0, 0, 1261, 224, 3600, 0, + 3943, 949, 2512, 0, 2796, 4233, 0, 1863, 0, 3283, 175, 0, 148, 0, 0, + 4320, 2004, 1503, 0, 0, 1438, 2823, 402, 1019, 0, 3343, 4216, 0, 0, + 2357, 0, 0, 0, 0, 1547, 0, 0, 3307, 0, 2347, 256, 0, 853, 0, 0, 0, + 1785, 0, 0, 0, 0, 1663, 0, 3095, 2419, 1711, 0, 4493, 0, 0, 1144, 0, 0, + 0, 1492, 370, 0, 0, 1007, 3167, 2813, 0, 562, 2721, 2083, 0, 2706, 0, + 0, 0, 0, 2937, 0, 0, 1876, 568, 0, 1859, 0, 0, 0, 0, 0, 3006, 3663, + 3429, 0, 1369, 0, 1599, 0, 0, 771, 1338, 0, 0, 0, 0, 0, 0, 2529, 0, 0, + 178, 2516, 0, 0, 2130, 2859, 1920, 0, 1992, 0, 4554, 0, 0, 0, 0, 0, + 2702, 4463, 688, 0, 0, 1500, 2711, 0, 0, 206, 3960, 0, 0, 0, 1051, + 4456, 1089, 0, 0, 712, 879, 621, 0, 0, 1353, 779, 0, 1075, 0, 1778, 0, + 1311, 3544, 0, 1373, 0, 0, 650, 0, 1475, 4297, 1100, 0, 343, 2758, + 1764, 0, 4163, 1327, 3569, 1363, 0, 2967, 0, 0, 137, 2277, 0, 0, 2411, + 0, 2685, 0, 2001, 948, 0, 159, 870, 1921, 1561, 0, 0, 2183, 0, 1004, 0, + 0, 0, 2363, 0, 0, 3473, 0, 0, 0, 2218, 0, 1021, 1919, 0, 0, 0, 0, 0, + 2324, 0, 1031, 0, 3739, 185, 0, 1932, 2109, 1363, 0, 0, 35, 2104, 1041, + 573, 0, 1518, 0, 0, 1515, 0, 0, 0, 2500, 1426, 1422, 0, 0, 2395, 706, + 0, 214, 889, 3801, 4108, 0, 0, 0, 2087, 0, 0, 2881, 1904, 2258, 0, 0, + 2408, 0, 454, 3224, 0, 0, 0, 0, 1337, 1509, 3638, 0, 0, 0, 3689, 0, 0, + 1774, 0, 0, 0, 0, 0, 1252, 1139, 0, 0, 0, 0, 75, 3651, 0, 1656, 0, + 1937, 0, 0, 4027, 0, 0, 0, 911, 1719, 0, 0, 3449, 0, 0, 0, 0, 4342, + 3593, 0, 0, 3476, 1690, 2585, 4484, 4479, 0, 0, 3932, 0, 3837, 3028, + 4047, 0, 705, 2616, 3782, 0, 0, 0, 108, 0, 0, 0, 1874, 1744, 0, 0, + 1147, 0, 0, 0, 166, 4277, 513, 0, 3623, 415, 0, 1574, 3753, 2473, 734, + 1129, 0, 0, 0, 0, 2241, 862, 0, 0, 0, 0, 2103, 1999, 2605, 821, 0, 0, + 0, 1653, 3756, 0, 0, 0, 2470, 0, 400, 2791, 717, 0, 154, 3490, 197, + 2675, 1405, 0, 2048, 0, 0, 1560, 4143, 4495, 0, 0, 0, 1299, 4554, 3847, + 0, 4308, 1560, 0, 3992, 0, 3209, 0, 452, 0, 2346, 0, 0, 225, 3030, 0, + 4370, 12, 239, 881, 0, 1561, 4251, 3310, 494, 0, 0, 232, 2509, 3198, 0, + 0, 0, 3390, 2956, 0, 1255, 0, 2148, 2692, 3865, 3864, 2586, 293, 0, + 4220, 4073, 0, 3423, 1262, 0, 1410, 2104, 0, 2074, 0, 0, 980, 0, 1684, + 1686, 0, 0, 429, 0, 358, 161, 0, 0, 0, 2029, 0, 2511, 817, 0, 3331, 0, + 1552, 0, 3380, 0, 0, 0, 3240, 0, 3499, 4041, 2450, 0, 0, 0, 0, 2214, + 787, 2906, 464, 1122, 3813, 0, 0, 2034, 0, 0, 0, 1037, 961, 0, 0, 3884, + 0, 0, 2764, 0, 0, 915, 0, 1417, 0, 6, 4134, 0, 2797, 1881, 259, 795, 0, + 15, 0, 2863, 0, 0, 0, 0, 0, 223, 720, 0, 1702, 0, 0, 0, 984, 1110, 0, + 547, 1906, 0, 0, 4286, 1875, 0, 0, 0, 1324, 0, 3589, 3911, 0, 0, 0, 0, + 2520, 844, 2801, 1149, 656, 0, 1837, 3441, 2127, 0, 0, 1325, 377, 1012, + 4280, 2404, 0, 1286, 0, 0, 0, 855, 0, 1793, 0, 4512, 2776, 2200, 2056, + 0, 2144, 1763, 0, 0, 549, 2475, 845, 1493, 0, 0, 306, 1398, 0, 0, 3775, + 0, 1451, 597, 2130, 0, 232, 2836, 957, 0, 619, 0, 2041, 0, 0, 295, 0, + 4361, 0, 2223, 0, 3727, 0, 0, 4294, 0, 33, 4397, 4511, 3626, 3329, 0, + 40, 0, 0, 0, 0, 478, 0, 0, 0, 2925, 0, 0, 3779, 1880, 0, 1556, 0, 1545, + 3249, 0, 0, 0, 1080, 0, 4112, 0, 3086, 46, 0, 0, 3165, 3414, 0, 0, 342, + 1885, 0, 0, 0, 0, 3071, 3404, 0, 0, 35, 0, 0, 0, 0, 857, 0, 627, 21, 0, + 0, 0, 0, 1021, 2099, 3483, 0, 0, 2693, 1014, 11, 0, 3352, 0, 3751, + 2476, 3014, 0, 1327, 974, 3502, 0, 611, 1838, 0, 4467, 2970, 1191, 474, + 0, 1366, 230, 1879, 3942, 0, 0, 0, 0, 1406, 0, 1304, 0, 0, 0, 277, + 3398, 0, 735, 165, 0, 0, 4185, 0, 3404, 0, 3821, 0, 0, 3450, 4161, 0, + 761, 0, 0, 0, 1807, 0, 0, 0, 0, 0, 0, 3962, 0, 0, 1833, 0, 1710, 0, + 1670, 2946, 1186, 56, 0, 533, 991, 246, 141, 0, 0, 0, 0, 687, 3830, 0, + 2495, 245, 0, 0, 2921, 2534, 706, 3729, 3941, 4335, 4295, 1671, 549, + 2015, 1777, 3057, 0, 1399, 1197, 2741, 4091, 0, 938, 0, 4322, 561, 0, + 527, 0, 481, 2496, 0, 0, 1771, 3444, 0, 2951, 0, 0, 0, 2244, 1013, 256, + 0, 1672, 0, 3115, 2720, 0, 1458, 0, 1476, 0, 2729, 0, 0, 1889, 2226, + 3945, 0, 1937, 0, 0, 0, 0, 4254, 1906, 4260, 2108, 0, 197, 4071, 2688, + 1691, 0, 0, 4467, 0, 1271, 0, 2029, 1625, 0, 0, 4259, 1222, 4139, 1497, + 0, 2919, 0, 86, 0, 0, 1685, 2585, 0, 1363, 0, 0, 0, 1548, 3807, 1891, + 4369, 774, 409, 4191, 0, 0, 3898, 1893, 4164, 765, 893, 1340, 0, 0, 0, + 4086, 2119, 173, 3518, 0, 0, 742, 0, 2059, 0, 0, 2955, 612, 0, 1660, + 4201, 2466, 485, 3476, 0, 945, 1441, 0, 3974, 0, 1551, 0, 664, 2978, 0, + 0, 1798, 2640, 0, 0, 0, 349, 0, 0, 3992, 0, 4168, 0, 0, 3294, 308, + 1332, 1191, 0, 0, 3821, 3969, 411, 1184, 0, 1417, 4191, 0, 4509, 881, + 593, 407, 1659, 0, 4237, 0, 1285, 2877, 2965, 3187, 0, 2725, 997, 530, + 2675, 0, 541, 4405, 1975, 0, 0, 2067, 801, 0, 0, 0, 0, 3746, 3215, + 3657, 0, 82, 0, 0, 0, 1624, 221, 0, 0, 2193, 483, 1281, 669, 2430, 0, + 1340, 4426, 0, 2419, 0, 2303, 0, 2691, 0, 305, 0, 0, 4276, 2246, 0, + 2533, 1139, 0, 626, 0, 9, 0, 2276, 2052, 178, 527, 2479, 2242, 762, + 212, 0, 860, 1718, 537, 0, 0, 1190, 4038, 1017, 0, 0, 0, 0, 1271, 0, 0, + 2261, 732, 4062, 2896, 4335, 1570, 3121, 0, 1791, 1798, 3642, 0, 125, + 3588, 2802, 0, 1162, 4276, 3536, 4314, 999, 0, 1518, 34, 0, 264, 4085, + 85, 4152, 2133, 1519, 1367, 0, 0, 3903, 420, 0, 2737, 490, 1704, 4389, + 0, 1631, 3809, 0, 1758, 0, 1162, 154, 980, 0, 0, 1188, 0, 0, 0, 1634, + 2486, 0, 0, 2972, 3280, 0, 0, 1909, 1386, 915, 2446, 0, 0, 0, 2371, 0, + 4499, 1915, 656, 2964, 4228, 0, 0, 0, 0, 910, 0, 0, 0, 1505, 3300, 0, + 2754, 2586, 2505, 3028, 135, 1124, 2602, 34, 2658, 1047, 885, 0, 0, 0, + 2117, 221, 2841, 153, 2240, 0, 3880, 0, 1101, 4095, 3147, 1757, 692, + 2280, 3049, 0, 2319, 1519, 0, 0, 0, 0, 4291, 4464, 164, 0, 1108, 4291, + 2707, 3843, 0, 0, 1160, 4318, 2473, 0, 4391, 0, 0, 0, 2743, 2146, 1050, + 0, 0, 0, 58, 191, 1754, 1704, 0, 0, 2581, 1920, 2443, 0, 3264, 0, 1379, + 0, 3933, 1049, 4127, 0, 2030, 0, 1363, 1411, 720, 945, 0, 367, 1312, 0, + 0, 0, 0, 1257, 2000, 0, 0, 260, 2860, 3118, 0, 85, 2600, 1842, 3727, + 554, 0, 0, 3763, 111, 0, 2993, 2128, 4103, 620, 0, 4018, 3867, 967, + 3281, 808, 482, 0, 2321, 0, 0, 943, 574, 256, 4177, 574, 0, 4048, 212, + 3917, 0, 4026, 0, 4161, 3004, 0, 3974, 0, 668, 426, 1194, 0, 0, 0, + 2099, 3538, 0, 1951, 0, 0, 0, 2892, 0, 0, 451, 0, 3417, 2937, 0, 0, + 2086, 0, 406, 0, 0, 0, 0, 4572, 1399, 3622, 894, 824, 195, 2309, 0, 0, + 2169, 0, 1898, 2616, 0, 626, 1848, 7, 0, 3290, 2404, 0, 3593, 0, 4205, + 1884, 0, 0, 3522, 1862, 2700, 0, 946, 2876, 1349, 0, 4208, 0, 0, 0, + 670, 0, 0, 0, 2742, 145, 776, 0, 63, 850, 781, 0, 0, 3548, 1898, 1220, + 490, 0, 875, 0, 0, 0, 520, 877, 1172, 1527, 0, 897, 0, 2415, 1127, 638, + 4329, 0, 523, 4283, 1165, 0, 15, 2321, 978, 0, 1307, 0, 816, 1025, + 3393, 0, 240, 145, 0, 3635, 3382, 2315, 3567, 3047, 0, 1752, 49, 4512, + 4482, 3417, 0, 0, 4282, 463, 4462, 0, 128, 0, 23, 4462, 836, 0, 1029, + 0, 2019, 0, 0, 2658, 0, 4525, 0, 3862, 0, 1577, 0, 0, 2372, 4416, 2195, + 0, 516, 0, 0, 551, 849, 1716, 2507, 522, 550, 0, 1543, 1983, 4223, + 3500, 0, 0, 1262, 502, 1512, 0, 0, 898, 292, 1236, 0, 0, 1004, 1963, + 1952, 0, 0, 287, 2341, 3718, 1251, 4119, 1321, 3407, 0, 0, 0, 0, 2423, + 251, 573, 3729, 4519, 1526, 4165, 2557, 0, 788, 0, 1448, 0, 0, 618, 0, + 850, 0, 161, 1350, 644, 853, 1374, 0, 1767, 1315, 1539, 596, 753, 0, + 467, 0, 4512, 970, 1730, 0, 0, 527, 3617, 2164, 2371, 0, 2418, 0, 0, + 2504, 405, 0, 3599, 1925, 0, 1064, 0, 370, 0, 4526, 325, 1972, 0, 3356, + 1134, 3930, 1318, 421, 2514, 2476, 638, 3571, 0, 0, 2142, 3054, 0, + 2064, 2541, 1652, 3622, 0, 823, 1941, 878, 1673, 0, 3435, 0, 0, 0, 661, + 3064, 0, 627, 0, 0, 0, 2359, 4291, 2531, 0, 4000, 0, 296, 0, 3074, 225, + 0, 0, 2491, 99, 0, 0, 0, 0, 0, 0, 695, 1499, 0, 0, 2403, 3941, 558, 0, + 0, 2265, 1068, 0, 845, 0, 0, 2485, 1864, 0, 1349, 598, 1415, 0, 544, 0, + 3472, 0, 392, 113, 3942, 3088, 1266, 1235, 0, 540, 169, 436, 4186, + 1878, 4206, 4094, 0, 662, 0, 2003, 2545, 3270, 708, 0, 0, 4359, 59, 0, + 2044, 1527, 4373, 0, 528, 736, 0, 0, 0, 1621, 1206, 4202, 0, 0, 2613, + 4059, 0, 844, 0, 2071, 0, 1126, 1719, 448, 3767, 2876, 1428, 925, 0, 0, + 2965, 1816, 64, 0, 0, 3750, 0, 0, 1995, 0, 0, 1647, 0, 0, 0, 755, 0, 0, + 0, 0, 0, 3336, 3374, 123, 0, 2172, 0, 0, 0, 2338, 519, 2630, 3573, 0, + 0, 1269, 2325, 0, 1935, 485, 0, 0, 2310, 2413, 4405, 2397, 1122, 1824, + 2055, 4062, 1449, 671, 412, 446, 4007, 286, 3846, 1387, 1978, 2443, + 534, 0, 1061, 2005, 2269, 597, 2272, 0, 0, 3738, 0, 0, 1562, 741, 0, 0, + 0, 0, 2349, 0, 2030, 0, 0, 0, 0, 0, 991, 0, 2416, 0, 2178, 1493, 0, + 2163, 0, 17, 1651, 1348, 4337, 2029, 0, 117, 1605, 0, 3444, 1965, 0, + 1776, 458, 397, 3063, 5, 4058, 535, 2807, 977, 314, 3613, 105, 3191, + 153, 4397, 2752, 1412, 4069, 0, 0, 0, 0, 1089, 0, 1968, 0, 768, 2132, + 0, 2582, 0, 0, 3753, 3512, 0, 909, 3256, 3999, 2436, 710, 0, 700, 248, + 4078, 4347, 1222, 3669, 0, 0, 882, 0, 0, 0, 0, 2293, 362, 81, 1667, + 3662, 2259, 0, 433, 4306, 3200, 0, 2445, 786, 3554, 0, 0, 0, 704, 0, + 2695, 3256, 3676, 881, 2107, 1637, 0, 778, 0, 2232, 1858, 1616, 2872, + 1467, 1545, 1613, 2512, 1587, 0, 1816, 4354, 1844, 0, 0, 3707, 3982, + 3115, 2408, 1957, 0, 0, 4180, 177, 0, 759, 2615, 0, 2657, 208, 286, 0, + 0, 0, 3075, 174, 1690, 2099, 0, 1345, 2018, 19, 1714, 0, 4440, 0, 3433, + 0, 2951, 3090, 0, 1572, 1834, 3590, 0, 0, 443, 0, 3912, 0, 3850, 0, + 497, 0, 2180, 2326, 1839, 0, 4155, 2871, 767, 0, 1249, 1687, 32, 4323, + 4213, 2276, 1015, 0, 0, 2246, 327, 3992, 580, 1752, 3376, 2986, 2046, + 2680, 0, 3862, 1306, 1087, 0, 50, 0, 0, 1553, 307, 0, 2332, 2418, 2474, + 0, 1160, 1935, 1511, 0, 2082, 1193, 0, 0, 4054, 0, 367, 0, 1201, 1052, + 0, 4550, 0, 1202, 1630, 0, 3705, 0, 0, 1923, 1124, 0, 508, 0, 2268, 0, + 1205, 977, 2839, 0, 1054, 577, 3807, 1596, 0, 0, 1252, 0, 2653, 805, + 2845, 942, 2231, 4007, 0, 2601, 277, 0, 1288, 1431, 0, 236, 3253, 0, + 544, 1633, 928, 1446, 3652, 2, 467, 555, 1602, 0, 1105, 0, 10, 163, 0, + 0, 1877, 0, 0, 0, 162, 1367, 4327, 0, 2915, 2460, 0, 0, 3361, 719, + 1406, 201, 0, 467, 0, 0, 4303, 3609, 1599, 330, 108, 316, 0, 0, 0, 0, + 2013, 18, 120, 1763, 3139, 0, 3485, 2025, 855, 0, 0, 572, 2308, 2496, + 4410, 1711, 0, 3226, 0, 543, 0, 1621, 76, 3210, 3215, 17, 384, 0, 3294, + 4505, 0, 0, 0, 1675, 1668, 1035, 0, 119, 0, 2789, 0, 3570, 4549, 98, + 204, 2275, 0, 0, 0, 1949, 0, 0, 717, 0, 0, 0, 0, 113, 202, 0, 1557, 0, + 1485, 840, 1002, 0, 0, 4427, 626, 4249, 0, 0, 2078, 165, 0, 929, 705, + 1441, 0, 0, 1210, 972, 2190, 0, 0, 0, 0, 1931, 869, 0, 3521, 1203, 346, + 0, 0, 0, 0, 0, 318, 1320, 667, 2715, 699, 1811, 0, 129, 813, 133, 1170, + 0, 2082, 97, 0, 3526, 326, 0, 3954, 0, 4154, 0, 4309, 2381, 3528, 0, + 30, 871, 4124, 4443, 2937, 0, 1725, 0, 0, 0, 2310, 455, 1619, 0, 1311, + 0, 1380, 0, 0, 1836, 0, 0, 1089, 2913, 4345, 246, 0, 26, 961, 0, 0, + 4157, 784, 0, 0, 2551, 3071, 485, 939, 2498, 0, 0, 0, 780, 4229, 1715, + 0, 0, 0, 0, 70, 347, 3277, 639, 0, 0, 1504, 583, 0, 3743, 1826, 0, 45, + 0, 0, 1008, 2163, 334, 1442, 0, 3030, 2537, 2051, 2729, 233, 3286, 0, + 2576, 937, 950, 0, 2733, 0, 330, 4489, 2811, 0, 0, 0, 4544, 744, 2276, + 0, 0, 1033, 203, 1114, 4197, 0, 0, 0, 0, 0, 2414, 295, 2339, 320, 1012, + 0, 0, 3831, 2284, 0, 0, 1032, 134, 1726, 0, 0, 0, 3449, 0, 0, 3858, + 191, 0, 1722, 790, 0, 2422, 0, 0, 1274, 0, 2270, 0, 0, 1010, 0, 0, 0, + 1282, 1284, 0, 449, 0, 3027, 193, 0, 2027, 0, 1373, 0, 980, 3570, 1766, + 1599, 4117, 167, 2021, 0, 2297, 471, 4085, 3018, 0, 335, 2835, 0, 2171, + 0, 1360, 0, 1099, 3721, 1043, 0, 0, 0, 475, 3827, 16, 0, 672, 3315, 0, + 4339, 0, 4427, 2223, 0, 0, 337, 0, 501, 229, 355, 85, 2613, 1226, 2295, + 2336, 105, 0, 4538, 1538, 0, 0, 0, 2782, 3838, 0, 648, 0, 3778, 0, 0, + 0, 0, 0, 0, 1336, 0, 0, 0, 2497, 743, 2249, 4081, 1023, 1864, 0, 3566, + 2420, 1134, 1465, 1353, 1077, 149, 1704, 1778, 0, 0, 3553, 2079, 3287, + 0, 0, 0, 1268, 599, 0, 0, 1112, 3816, 2411, 2535, 508, 0, 1829, 3311, + 4312, 660, 2714, 0, 1657, 1994, 82, 3885, 1442, 0, 3432, 4337, 2665, + 2778, 1687, 2522, 0, 1835, 1945, 1097, 682, 3420, 0, 0, 1450, 2138, + 1006, 1376, 1456, 226, 3999, 982, 1417, 3602, 1964, 1894, 1525, 2505, + 0, 4288, 0, 0, 2350, 441, 0, 0, 4083, 925, 3113, 310, 2991, 189, 1721, + 544, 4105, 4546, 3498, 3022, 978, 0, 2007, 0, 1107, 0, 2286, 0, 1037, + 0, 0, 0, 285, 0, 1559, 0, 0, 1728, 0, 0, 0, 284, 624, 263, 303, 1181, + 2548, 1546, 2138, 0, 3610, 4024, 720, 2156, 0, 0, 446, 0, 0, 0, 0, 747, + 0, 3594, 461, 3128, 505, 0, 67, 0, 2413, 0, 2775, 0, 0, 1780, 802, 0, + 0, 0, 401, 1834, 2278, 4251, 0, 0, 0, 413, 0, 3070, 1726, 0, 0, 475, 0, + 1857, 685, 2597, 981, 0, 0, 1655, 1180, 2228, 1253, 132, 63, 4266, + 3166, 78, 0, 2635, 1295, 344, 3971, 743, 1580, 320, 4562, 0, 4412, + 1166, 4460, 2660, 2264, 2579, 2733, 0, 2113, 3809, 2064, 1495, 0, 618, + 886, 0, 0, 0, 4410, 1989, 0, 3907, 1781, 0, 2385, 92, 330, 1729, 3966, + 1631, 4133, 2905, 2557, 3232, 0, 0, 0, 0, 0, 0, 291, 220, 3039, 465, 0, + 4496, 0, 315, 3140, 0, 781, 0, 0, 0, 0, 0, 1419, 325, 4515, 4243, 1209, + 2121, 0, 0, 2217, 2871, 417, 0, 0, 2310, 0, 2700, 4347, 1805, 1330, + 3905, 760, 3564, 0, 2297, 2413, 1603, 1234, 3139, 0, 3836, 1431, 833, + 1461, 146, 2173, 1111, 0, 1226, 1383, 0, 683, 2289, 783, 0, 0, 0, 0, + 2024, 2362, 0, 2822, 0, 2184, 3117, 2289, 2884, 3942, 0, 0, 1806, 2073, + 1039, 1332, 4148, 3602, 1500, 703, 0, 0, 0, 4304, 4271, 3563, 0, 214, + 27, 1267, 1882, 3233, 3015, 0, 0, 0, 0, 2139, 1571, 0, 0, 4364, 3885, + 3251, 0, 1662, 481, 9, 595, 0, 0, 1805, 0, 1783, 1270, 4365, 1375, 0, + 0, 0, 3269, 1077, 2763, 324, 0, 4353, 2358, 2675, 0, 1843, 0, 1649, + 333, 0, 0, 3961, 4484, 0, 0, 1368, 0, 3211, 4118, 4373, 3908, 1991, 0, + 2189, 1381, 0, 2168, 1463, 1308, 466, 145, 3355, 0, 0, 298, 298, 1183, + 0, 1145, 2060, 1516, 199, 0, 3088, 3607, 4408, 2304, 0, 2190, 2747, 0, + 474, 0, 0, 3078, 4275, 820, 876, 1004, 2364, 0, 0, 3908, 2394, 1474, + 2723, 1814, 2086, 294, 1788, 4408, 0, 2955, 3862, 912, 3296, 2130, 116, + 1388, 2762, 2870, 0, 165, 0, 1852, 2287, 0, 0, 489, 2160, 441, 0, 2625, + 349, 2280, 3030, 58, 0, 0, 4201, 0, 1229, 1760, 0, 4234, 791, 1053, + 1349, 1951, 0, 1694, 1742, 4365, 3099, 2439, 4373, 0, 413, 0, 0, 0, 0, + 3261, 1612, 0, 0, 3708, 1350, 252, 2326, 3770, 2427, 0, 1973, 3648, + 2213, 253, 2017, 1533, 2014, 0, 0, 0, 1254, 2047, 0, 285, 1208, 2385, + 0, 3284, 1586, 1396, 0, 0, 0, 1567, 1056, 0, 2370, 2208, 2196, 930, + 1787, 0, 0, 0, 101, 0, 4554, 589, 1093, 3184, 0, 1063, 2620, 0, 323, + 3160, 0, 1985, 2649, 0, 2950, 1670, 1932, 303, 630, 0, 1604, 0, 384, + 1160, 4004, 3476, 4046, 1701, 0, 1182, 0, 3666, 1562, 1622, 1384, 0, 0, + 0, 3622, 1340, 0, 3506, 2618, 2792, 1141, 1702, 4495, 2269, 0, 4344, + 2047, 0, 2506, 0, 604, 0, 1979, 1455, 148, 2255, 0, 1069, 0, 4532, 0, + 0, 3671, 265, 87, 0, 0, 4398, 4347, 1070, 970, 0, 1960, 3092, 943, 0, + 1007, 0, 2528, 2173, 313, 347, 1560, 946, 4204, 2101, 0, 991, 0, 2102, + 2053, 0, 680, 1979, 0, 1701, 0, 3621, 1556, 0, 331, 2707, 2448, 1240, + 4042, 1616, 0, 3662, 0, 0, 0, 53, 4001, 0, 3069, 1309, 1446, 304, 357, + 0, 3309, 2111, 3132, 264, 0, 103, 1400, 3319, 809, 2150, 2224, 0, 1528, + 1147, 1528, 2667, 0, 0, 415, 0, 175, 3613, 1402, 1905, 0, 803, 1744, + 2833, 804, 0, 0, 0, 0, 4466, 585, 2964, 1606, 3440, 297, 4247, 1275, 0, + 0, 0, 1508, 0, 2835, 3573, 0, 400, 0, 4481, 3301, 734, 1036, 823, 1398, + 706, 0, 0, 3880, 2284, 0, 0, 619, 0, 1317, 0, 0, 2219, 0, 4480, 628, + 983, 4502, 3011, 1487, 44, 0, 0, 30, 2527, 2246, 804, 0, 2016, 2001, + 1657, 0, 0, 1330, 739, 0, 0, 0, 0, 3978, 219, 974, 339, 3993, 2, 1118, + 1395, 2451, 3610, 1189, 2341, 53, 110, 2132, 4538, 4392, 393, 53, 2176, + 92, 2282, 0, 584, 885, 1401, 2282, 79, 1644, 0, 4316, 0, 4033, 0, 4235, + 3232, 2752, 0, 0, 2010, 2446, 0, 0, 4547, 0, 2203, 247, 4125, 0, 0, + 1261, 216, 0, 4138, 0, 0, 0, 0, 1637, 0, 0, 200, 750, 262, 0, 4510, 0, + 1506, 2069, 4241, 1589, 661, 0, 277, 3425, 1294, 14, 0, 1747, 2220, + 2297, 0, 0, 238, 0, 547, 476, 2223, 4221, 4355, 1385, 1724, 0, 0, 2139, + 1990, 902, 0, 1183, 18, 0, 1607, 0, 2513, 1427, 395, 975, 0, 3106, + 1756, 2038, 561, 0, 1217, 925, 158, 989, 4043, 0, 0, 0, 2342, 0, 2070, + 297, 457, 0, 3756, 451, 0, 4085, 0, 4111, 2184, 0, 0, 0, 3984, 373, 0, + 3175, 1178, 4351, 1137, 2453, 1709, 1594, 4546, 3060, 0, 1834, 3303, 0, + 1327, 1177, 553, 404, 4148, 1271, 0, 603, 0, 0, 1541, 0, 2530, 0, 0, + 2593, 1055, 0, 2346, 0, 424, 2332, 0, 1654, 0, 2249, 466, 1189, 700, + 4013, 852, 126, 1203, 221, 852, 667, 350, 0, 758, 4008, 0, 4389, 854, + 2392, 0, 2277, 782, 1516, 0, 2643, 766, 1171, 137, 3759, 733, 981, 0, + 0, 1208, 1949, 2894, 0, 1871, 4499, 0, 1179, 0, 263, 414, 3460, 3873, + 131, 1836, 528, 0, 0, 2185, 0, 2149, 0, 0, 1688, 1626, 4532, 0, 4415, + 0, 4262, 0, 0, 1962, 0, 0, 453, 2195, 3045, 648, 3824, 1109, 2294, + 3776, 0, 1433, 3623, 761, 2010, 0, 2049, 496, 0, 2094, 4421, 0, 420, 0, + 0, 90, 0, 0, 485, 0, 0, 2499, 1177, 0, 0, 4511, 2369, 1523, 0, 0, 3755, + 2071 +}; + +static size_t +keysym_name_hash_f(const char *key, const char *T) +{ + size_t sum = 0; + for (size_t i = 0; key[i] != '\0'; i++) + sum += T[i % 32] * key[i]; + return sum % 4573; +} + +static size_t +keysym_name_perfect_hash(const char *key) +{ + return ( + keysym_name_G[keysym_name_hash_f(key, "xQ6s5AweQcmhYSjcMnXcbUZV5VlaPl27")] + + keysym_name_G[keysym_name_hash_f(key, "rCH1UKEZTzn9hlnUvX76Sw7VmrLuST7A")] + ) % 4573; +} + + struct name_keysym { xkb_keysym_t keysym; uint32_t offset; @@ -3033,1832 +3492,1974 @@ static const struct name_keysym name_to_keysym[] = { { 0x0000ff37, 8654 }, /* Codeinput */ { 0x0000003a, 8664 }, /* colon */ { 0x010020a1, 8670 }, /* ColonSign */ - { 0x0000002c, 8680 }, /* comma */ - { 0x0100220b, 8686 }, /* containsas */ - { 0x0000ffe3, 8697 }, /* Control_L */ - { 0x0000ffe4, 8707 }, /* Control_R */ - { 0x000000a9, 8717 }, /* copyright */ - { 0x000009e4, 8727 }, /* cr */ - { 0x000009ee, 8730 }, /* crossinglines */ - { 0x010020a2, 8744 }, /* CruzeiroSign */ - { 0x0100221b, 8757 }, /* cuberoot */ - { 0x000000a4, 8766 }, /* currency */ - { 0x00000aff, 8775 }, /* cursor */ - { 0x000006c1, 8782 }, /* Cyrillic_a */ - { 0x000006e1, 8793 }, /* Cyrillic_A */ - { 0x000006c2, 8804 }, /* Cyrillic_be */ - { 0x000006e2, 8816 }, /* Cyrillic_BE */ - { 0x000006de, 8828 }, /* Cyrillic_che */ - { 0x000006fe, 8841 }, /* Cyrillic_CHE */ - { 0x010004b6, 8854 }, /* Cyrillic_CHE_descender */ - { 0x010004b7, 8877 }, /* Cyrillic_che_descender */ - { 0x010004b8, 8900 }, /* Cyrillic_CHE_vertstroke */ - { 0x010004b9, 8924 }, /* Cyrillic_che_vertstroke */ - { 0x000006c4, 8948 }, /* Cyrillic_de */ - { 0x000006e4, 8960 }, /* Cyrillic_DE */ - { 0x000006af, 8972 }, /* Cyrillic_dzhe */ - { 0x000006bf, 8986 }, /* Cyrillic_DZHE */ - { 0x000006dc, 9000 }, /* Cyrillic_e */ - { 0x000006fc, 9011 }, /* Cyrillic_E */ - { 0x000006c6, 9022 }, /* Cyrillic_ef */ - { 0x000006e6, 9034 }, /* Cyrillic_EF */ - { 0x000006cc, 9046 }, /* Cyrillic_el */ - { 0x000006ec, 9058 }, /* Cyrillic_EL */ - { 0x000006cd, 9070 }, /* Cyrillic_em */ - { 0x000006ed, 9082 }, /* Cyrillic_EM */ - { 0x000006ce, 9094 }, /* Cyrillic_en */ - { 0x000006ee, 9106 }, /* Cyrillic_EN */ - { 0x010004a2, 9118 }, /* Cyrillic_EN_descender */ - { 0x010004a3, 9140 }, /* Cyrillic_en_descender */ - { 0x000006d2, 9162 }, /* Cyrillic_er */ - { 0x000006f2, 9174 }, /* Cyrillic_ER */ - { 0x000006d3, 9186 }, /* Cyrillic_es */ - { 0x000006f3, 9198 }, /* Cyrillic_ES */ - { 0x000006c7, 9210 }, /* Cyrillic_ghe */ - { 0x000006e7, 9223 }, /* Cyrillic_GHE */ - { 0x01000492, 9236 }, /* Cyrillic_GHE_bar */ - { 0x01000493, 9253 }, /* Cyrillic_ghe_bar */ - { 0x000006c8, 9270 }, /* Cyrillic_ha */ - { 0x000006e8, 9282 }, /* Cyrillic_HA */ - { 0x010004b2, 9294 }, /* Cyrillic_HA_descender */ - { 0x010004b3, 9316 }, /* Cyrillic_ha_descender */ - { 0x000006df, 9338 }, /* Cyrillic_hardsign */ - { 0x000006ff, 9356 }, /* Cyrillic_HARDSIGN */ - { 0x000006c9, 9374 }, /* Cyrillic_i */ - { 0x000006e9, 9385 }, /* Cyrillic_I */ - { 0x010004e2, 9396 }, /* Cyrillic_I_macron */ - { 0x010004e3, 9414 }, /* Cyrillic_i_macron */ - { 0x000006c5, 9432 }, /* Cyrillic_ie */ - { 0x000006e5, 9444 }, /* Cyrillic_IE */ - { 0x000006a3, 9456 }, /* Cyrillic_io */ - { 0x000006b3, 9468 }, /* Cyrillic_IO */ - { 0x000006a8, 9480 }, /* Cyrillic_je */ - { 0x000006b8, 9492 }, /* Cyrillic_JE */ - { 0x000006cb, 9504 }, /* Cyrillic_ka */ - { 0x000006eb, 9516 }, /* Cyrillic_KA */ - { 0x0100049a, 9528 }, /* Cyrillic_KA_descender */ - { 0x0100049b, 9550 }, /* Cyrillic_ka_descender */ - { 0x0100049c, 9572 }, /* Cyrillic_KA_vertstroke */ - { 0x0100049d, 9595 }, /* Cyrillic_ka_vertstroke */ - { 0x000006a9, 9618 }, /* Cyrillic_lje */ - { 0x000006b9, 9631 }, /* Cyrillic_LJE */ - { 0x000006aa, 9644 }, /* Cyrillic_nje */ - { 0x000006ba, 9657 }, /* Cyrillic_NJE */ - { 0x000006cf, 9670 }, /* Cyrillic_o */ - { 0x000006ef, 9681 }, /* Cyrillic_O */ - { 0x010004e8, 9692 }, /* Cyrillic_O_bar */ - { 0x010004e9, 9707 }, /* Cyrillic_o_bar */ - { 0x000006d0, 9722 }, /* Cyrillic_pe */ - { 0x000006f0, 9734 }, /* Cyrillic_PE */ - { 0x010004d8, 9746 }, /* Cyrillic_SCHWA */ - { 0x010004d9, 9761 }, /* Cyrillic_schwa */ - { 0x000006db, 9776 }, /* Cyrillic_sha */ - { 0x000006fb, 9789 }, /* Cyrillic_SHA */ - { 0x000006dd, 9802 }, /* Cyrillic_shcha */ - { 0x000006fd, 9817 }, /* Cyrillic_SHCHA */ - { 0x010004ba, 9832 }, /* Cyrillic_SHHA */ - { 0x010004bb, 9846 }, /* Cyrillic_shha */ - { 0x000006ca, 9860 }, /* Cyrillic_shorti */ - { 0x000006ea, 9876 }, /* Cyrillic_SHORTI */ - { 0x000006d8, 9892 }, /* Cyrillic_softsign */ - { 0x000006f8, 9910 }, /* Cyrillic_SOFTSIGN */ - { 0x000006d4, 9928 }, /* Cyrillic_te */ - { 0x000006f4, 9940 }, /* Cyrillic_TE */ - { 0x000006c3, 9952 }, /* Cyrillic_tse */ - { 0x000006e3, 9965 }, /* Cyrillic_TSE */ - { 0x000006d5, 9978 }, /* Cyrillic_u */ - { 0x000006f5, 9989 }, /* Cyrillic_U */ - { 0x010004ee, 10000 }, /* Cyrillic_U_macron */ - { 0x010004ef, 10018 }, /* Cyrillic_u_macron */ - { 0x010004ae, 10036 }, /* Cyrillic_U_straight */ - { 0x010004af, 10056 }, /* Cyrillic_u_straight */ - { 0x010004b0, 10076 }, /* Cyrillic_U_straight_bar */ - { 0x010004b1, 10100 }, /* Cyrillic_u_straight_bar */ - { 0x000006d7, 10124 }, /* Cyrillic_ve */ - { 0x000006f7, 10136 }, /* Cyrillic_VE */ - { 0x000006d1, 10148 }, /* Cyrillic_ya */ - { 0x000006f1, 10160 }, /* Cyrillic_YA */ - { 0x000006d9, 10172 }, /* Cyrillic_yeru */ - { 0x000006f9, 10186 }, /* Cyrillic_YERU */ - { 0x000006c0, 10200 }, /* Cyrillic_yu */ - { 0x000006e0, 10212 }, /* Cyrillic_YU */ - { 0x000006da, 10224 }, /* Cyrillic_ze */ - { 0x000006fa, 10236 }, /* Cyrillic_ZE */ - { 0x000006d6, 10248 }, /* Cyrillic_zhe */ - { 0x000006f6, 10261 }, /* Cyrillic_ZHE */ - { 0x01000496, 10274 }, /* Cyrillic_ZHE_descender */ - { 0x01000497, 10297 }, /* Cyrillic_zhe_descender */ - { 0x00000044, 10320 }, /* D */ - { 0x00000064, 10322 }, /* d */ - { 0x01001e0a, 10324 }, /* Dabovedot */ - { 0x01001e0b, 10334 }, /* dabovedot */ - { 0x1000fe27, 10344 }, /* Dacute_accent */ - { 0x00000af1, 10358 }, /* dagger */ - { 0x000001cf, 10365 }, /* Dcaron */ - { 0x000001ef, 10372 }, /* dcaron */ - { 0x1000fe2c, 10379 }, /* Dcedilla_accent */ - { 0x1000fe5e, 10395 }, /* Dcircumflex_accent */ - { 0x1000fe22, 10414 }, /* Ddiaeresis */ - { 0x0000fe80, 10425 }, /* dead_a */ - { 0x0000fe81, 10432 }, /* dead_A */ - { 0x0000fe64, 10439 }, /* dead_abovecomma */ - { 0x0000fe56, 10455 }, /* dead_abovedot */ - { 0x0000fe65, 10469 }, /* dead_abovereversedcomma */ - { 0x0000fe58, 10493 }, /* dead_abovering */ - { 0x0000fe91, 10508 }, /* dead_aboveverticalline */ - { 0x0000fe51, 10531 }, /* dead_acute */ - { 0x0000fe6b, 10542 }, /* dead_belowbreve */ - { 0x0000fe69, 10558 }, /* dead_belowcircumflex */ - { 0x0000fe6e, 10579 }, /* dead_belowcomma */ - { 0x0000fe6c, 10595 }, /* dead_belowdiaeresis */ - { 0x0000fe60, 10615 }, /* dead_belowdot */ - { 0x0000fe68, 10629 }, /* dead_belowmacron */ - { 0x0000fe67, 10646 }, /* dead_belowring */ - { 0x0000fe6a, 10661 }, /* dead_belowtilde */ - { 0x0000fe92, 10677 }, /* dead_belowverticalline */ - { 0x0000fe55, 10700 }, /* dead_breve */ - { 0x0000fe8b, 10711 }, /* dead_capital_schwa */ - { 0x0000fe5a, 10730 }, /* dead_caron */ - { 0x0000fe5b, 10741 }, /* dead_cedilla */ - { 0x0000fe52, 10754 }, /* dead_circumflex */ - { 0x0000fe6f, 10770 }, /* dead_currency */ - { 0x0000fe65, 10784 }, /* dead_dasia */ - { 0x0000fe57, 10795 }, /* dead_diaeresis */ - { 0x0000fe59, 10810 }, /* dead_doubleacute */ - { 0x0000fe66, 10827 }, /* dead_doublegrave */ - { 0x0000fe82, 10844 }, /* dead_e */ - { 0x0000fe83, 10851 }, /* dead_E */ - { 0x0000fe50, 10858 }, /* dead_grave */ - { 0x0000fe8c, 10869 }, /* dead_greek */ - { 0x0000fe61, 10880 }, /* dead_hook */ - { 0x0000fe62, 10890 }, /* dead_horn */ - { 0x0000fe84, 10900 }, /* dead_i */ - { 0x0000fe85, 10907 }, /* dead_I */ - { 0x0000fe6d, 10914 }, /* dead_invertedbreve */ - { 0x0000fe5d, 10933 }, /* dead_iota */ - { 0x0000fe93, 10943 }, /* dead_longsolidusoverlay */ - { 0x0000fe90, 10967 }, /* dead_lowline */ - { 0x0000fe54, 10980 }, /* dead_macron */ - { 0x0000fe86, 10992 }, /* dead_o */ - { 0x0000fe87, 10999 }, /* dead_O */ - { 0x0000fe5c, 11006 }, /* dead_ogonek */ - { 0x0000fe53, 11018 }, /* dead_perispomeni */ - { 0x0000fe64, 11035 }, /* dead_psili */ - { 0x0000fe5f, 11046 }, /* dead_semivoiced_sound */ - { 0x0000fe8a, 11068 }, /* dead_small_schwa */ - { 0x0000fe63, 11085 }, /* dead_stroke */ - { 0x0000fe53, 11097 }, /* dead_tilde */ - { 0x0000fe88, 11108 }, /* dead_u */ - { 0x0000fe89, 11115 }, /* dead_U */ - { 0x0000fe5e, 11122 }, /* dead_voiced_sound */ - { 0x00000abd, 11140 }, /* decimalpoint */ - { 0x000000b0, 11153 }, /* degree */ - { 0x0000ffff, 11160 }, /* Delete */ - { 0x1000ff73, 11167 }, /* DeleteChar */ - { 0x1000ff71, 11178 }, /* DeleteLine */ - { 0x1000fe60, 11189 }, /* Dgrave_accent */ - { 0x000000a8, 11203 }, /* diaeresis */ - { 0x00000aed, 11213 }, /* diamond */ - { 0x00000aa5, 11221 }, /* digitspace */ - { 0x0100222c, 11232 }, /* dintegral */ - { 0x000000f7, 11242 }, /* division */ - { 0x00000024, 11251 }, /* dollar */ - { 0x010020ab, 11258 }, /* DongSign */ - { 0x00000aaf, 11267 }, /* doubbaselinedot */ - { 0x000001bd, 11283 }, /* doubleacute */ - { 0x00000af2, 11295 }, /* doubledagger */ - { 0x00000afe, 11308 }, /* doublelowquotemark */ - { 0x0000ff54, 11327 }, /* Down */ - { 0x000008fe, 11332 }, /* downarrow */ - { 0x00000ba8, 11342 }, /* downcaret */ - { 0x00000bd6, 11352 }, /* downshoe */ - { 0x00000bc4, 11361 }, /* downstile */ - { 0x00000bc2, 11371 }, /* downtack */ - { 0x1000ff00, 11380 }, /* DRemove */ - { 0x1000feb0, 11388 }, /* Dring_accent */ - { 0x000001d0, 11401 }, /* Dstroke */ - { 0x000001f0, 11409 }, /* dstroke */ - { 0x1000fe7e, 11417 }, /* Dtilde */ - { 0x00000045, 11424 }, /* E */ - { 0x00000065, 11426 }, /* e */ - { 0x000003cc, 11428 }, /* Eabovedot */ - { 0x000003ec, 11438 }, /* eabovedot */ - { 0x000000c9, 11448 }, /* Eacute */ - { 0x000000e9, 11455 }, /* eacute */ - { 0x01001eb8, 11462 }, /* Ebelowdot */ - { 0x01001eb9, 11472 }, /* ebelowdot */ - { 0x000001cc, 11482 }, /* Ecaron */ - { 0x000001ec, 11489 }, /* ecaron */ - { 0x000000ca, 11496 }, /* Ecircumflex */ - { 0x000000ea, 11508 }, /* ecircumflex */ - { 0x01001ebe, 11520 }, /* Ecircumflexacute */ - { 0x01001ebf, 11537 }, /* ecircumflexacute */ - { 0x01001ec6, 11554 }, /* Ecircumflexbelowdot */ - { 0x01001ec7, 11574 }, /* ecircumflexbelowdot */ - { 0x01001ec0, 11594 }, /* Ecircumflexgrave */ - { 0x01001ec1, 11611 }, /* ecircumflexgrave */ - { 0x01001ec2, 11628 }, /* Ecircumflexhook */ - { 0x01001ec3, 11644 }, /* ecircumflexhook */ - { 0x01001ec4, 11660 }, /* Ecircumflextilde */ - { 0x01001ec5, 11677 }, /* ecircumflextilde */ - { 0x010020a0, 11694 }, /* EcuSign */ - { 0x000000cb, 11702 }, /* Ediaeresis */ - { 0x000000eb, 11713 }, /* ediaeresis */ - { 0x000000c8, 11724 }, /* Egrave */ - { 0x000000e8, 11731 }, /* egrave */ - { 0x01001eba, 11738 }, /* Ehook */ - { 0x01001ebb, 11744 }, /* ehook */ - { 0x01002088, 11750 }, /* eightsubscript */ - { 0x01002078, 11765 }, /* eightsuperior */ - { 0x0000ff2f, 11779 }, /* Eisu_Shift */ - { 0x0000ff30, 11790 }, /* Eisu_toggle */ - { 0x01002208, 11802 }, /* elementof */ - { 0x00000aae, 11812 }, /* ellipsis */ - { 0x00000aa3, 11821 }, /* em3space */ - { 0x00000aa4, 11830 }, /* em4space */ - { 0x000003aa, 11839 }, /* Emacron */ - { 0x000003ba, 11847 }, /* emacron */ - { 0x00000aa9, 11855 }, /* emdash */ - { 0x00000ade, 11862 }, /* emfilledcircle */ - { 0x00000adf, 11877 }, /* emfilledrect */ - { 0x00000ace, 11890 }, /* emopencircle */ - { 0x00000acf, 11903 }, /* emopenrectangle */ - { 0x01002205, 11919 }, /* emptyset */ - { 0x00000aa1, 11928 }, /* emspace */ - { 0x0000ff57, 11936 }, /* End */ - { 0x00000aaa, 11940 }, /* endash */ - { 0x00000ae6, 11947 }, /* enfilledcircbullet */ - { 0x00000ae7, 11966 }, /* enfilledsqbullet */ - { 0x000003bd, 11983 }, /* ENG */ - { 0x000003bf, 11987 }, /* eng */ - { 0x00000ae0, 11991 }, /* enopencircbullet */ - { 0x00000ae1, 12008 }, /* enopensquarebullet */ - { 0x00000aa2, 12027 }, /* enspace */ - { 0x000001ca, 12035 }, /* Eogonek */ - { 0x000001ea, 12043 }, /* eogonek */ - { 0x0000003d, 12051 }, /* equal */ - { 0x0000ff1b, 12057 }, /* Escape */ - { 0x000000d0, 12064 }, /* ETH */ - { 0x000000d0, 12068 }, /* Eth */ - { 0x000000f0, 12072 }, /* eth */ - { 0x01001ebc, 12076 }, /* Etilde */ - { 0x01001ebd, 12083 }, /* etilde */ - { 0x000020ac, 12090 }, /* EuroSign */ - { 0x00000021, 12099 }, /* exclam */ - { 0x000000a1, 12106 }, /* exclamdown */ - { 0x0000ff62, 12117 }, /* Execute */ - { 0x1000ff76, 12125 }, /* Ext16bit_L */ - { 0x1000ff77, 12136 }, /* Ext16bit_R */ - { 0x010001b7, 12147 }, /* EZH */ - { 0x01000292, 12151 }, /* ezh */ - { 0x00000046, 12155 }, /* F */ - { 0x00000066, 12157 }, /* f */ - { 0x0000ffbe, 12159 }, /* F1 */ - { 0x0000ffc7, 12162 }, /* F10 */ - { 0x0000ffc8, 12166 }, /* F11 */ - { 0x0000ffc9, 12170 }, /* F12 */ - { 0x0000ffca, 12174 }, /* F13 */ - { 0x0000ffcb, 12178 }, /* F14 */ - { 0x0000ffcc, 12182 }, /* F15 */ - { 0x0000ffcd, 12186 }, /* F16 */ - { 0x0000ffce, 12190 }, /* F17 */ - { 0x0000ffcf, 12194 }, /* F18 */ - { 0x0000ffd0, 12198 }, /* F19 */ - { 0x0000ffbf, 12202 }, /* F2 */ - { 0x0000ffd1, 12205 }, /* F20 */ - { 0x0000ffd2, 12209 }, /* F21 */ - { 0x0000ffd3, 12213 }, /* F22 */ - { 0x0000ffd4, 12217 }, /* F23 */ - { 0x0000ffd5, 12221 }, /* F24 */ - { 0x0000ffd6, 12225 }, /* F25 */ - { 0x0000ffd7, 12229 }, /* F26 */ - { 0x0000ffd8, 12233 }, /* F27 */ - { 0x0000ffd9, 12237 }, /* F28 */ - { 0x0000ffda, 12241 }, /* F29 */ - { 0x0000ffc0, 12245 }, /* F3 */ - { 0x0000ffdb, 12248 }, /* F30 */ - { 0x0000ffdc, 12252 }, /* F31 */ - { 0x0000ffdd, 12256 }, /* F32 */ - { 0x0000ffde, 12260 }, /* F33 */ - { 0x0000ffdf, 12264 }, /* F34 */ - { 0x0000ffe0, 12268 }, /* F35 */ - { 0x0000ffc1, 12272 }, /* F4 */ - { 0x0000ffc2, 12275 }, /* F5 */ - { 0x0000ffc3, 12278 }, /* F6 */ - { 0x0000ffc4, 12281 }, /* F7 */ - { 0x0000ffc5, 12284 }, /* F8 */ - { 0x0000ffc6, 12287 }, /* F9 */ - { 0x01001e1e, 12290 }, /* Fabovedot */ - { 0x01001e1f, 12300 }, /* fabovedot */ - { 0x010006f0, 12310 }, /* Farsi_0 */ - { 0x010006f1, 12318 }, /* Farsi_1 */ - { 0x010006f2, 12326 }, /* Farsi_2 */ - { 0x010006f3, 12334 }, /* Farsi_3 */ - { 0x010006f4, 12342 }, /* Farsi_4 */ - { 0x010006f5, 12350 }, /* Farsi_5 */ - { 0x010006f6, 12358 }, /* Farsi_6 */ - { 0x010006f7, 12366 }, /* Farsi_7 */ - { 0x010006f8, 12374 }, /* Farsi_8 */ - { 0x010006f9, 12382 }, /* Farsi_9 */ - { 0x010006cc, 12390 }, /* Farsi_yeh */ - { 0x00000af8, 12400 }, /* femalesymbol */ - { 0x000009e3, 12413 }, /* ff */ - { 0x010020a3, 12416 }, /* FFrancSign */ - { 0x00000abb, 12427 }, /* figdash */ - { 0x00000adc, 12435 }, /* filledlefttribullet */ - { 0x00000adb, 12455 }, /* filledrectbullet */ - { 0x00000add, 12472 }, /* filledrighttribullet */ - { 0x00000ae9, 12493 }, /* filledtribulletdown */ - { 0x00000ae8, 12513 }, /* filledtribulletup */ - { 0x0000ff68, 12531 }, /* Find */ - { 0x0000fed0, 12536 }, /* First_Virtual_Screen */ - { 0x00000ac5, 12557 }, /* fiveeighths */ - { 0x00000ab7, 12569 }, /* fivesixths */ - { 0x01002085, 12580 }, /* fivesubscript */ - { 0x01002075, 12594 }, /* fivesuperior */ - { 0x00000ab5, 12607 }, /* fourfifths */ - { 0x01002084, 12618 }, /* foursubscript */ - { 0x01002074, 12632 }, /* foursuperior */ - { 0x0100221c, 12645 }, /* fourthroot */ - { 0x000008f6, 12656 }, /* function */ - { 0x00000047, 12665 }, /* G */ - { 0x00000067, 12667 }, /* g */ - { 0x000002d5, 12669 }, /* Gabovedot */ - { 0x000002f5, 12679 }, /* gabovedot */ - { 0x000002ab, 12689 }, /* Gbreve */ - { 0x000002bb, 12696 }, /* gbreve */ - { 0x010001e6, 12703 }, /* Gcaron */ - { 0x010001e7, 12710 }, /* gcaron */ - { 0x000003ab, 12717 }, /* Gcedilla */ - { 0x000003bb, 12726 }, /* gcedilla */ - { 0x000002d8, 12735 }, /* Gcircumflex */ - { 0x000002f8, 12747 }, /* gcircumflex */ - { 0x010010d0, 12759 }, /* Georgian_an */ - { 0x010010d1, 12771 }, /* Georgian_ban */ - { 0x010010ea, 12784 }, /* Georgian_can */ - { 0x010010ed, 12797 }, /* Georgian_char */ - { 0x010010e9, 12811 }, /* Georgian_chin */ - { 0x010010ec, 12825 }, /* Georgian_cil */ - { 0x010010d3, 12838 }, /* Georgian_don */ - { 0x010010d4, 12851 }, /* Georgian_en */ - { 0x010010f6, 12863 }, /* Georgian_fi */ - { 0x010010d2, 12875 }, /* Georgian_gan */ - { 0x010010e6, 12888 }, /* Georgian_ghan */ - { 0x010010f0, 12902 }, /* Georgian_hae */ - { 0x010010f4, 12915 }, /* Georgian_har */ - { 0x010010f1, 12928 }, /* Georgian_he */ - { 0x010010f2, 12940 }, /* Georgian_hie */ - { 0x010010f5, 12953 }, /* Georgian_hoe */ - { 0x010010d8, 12966 }, /* Georgian_in */ - { 0x010010ef, 12978 }, /* Georgian_jhan */ - { 0x010010eb, 12992 }, /* Georgian_jil */ - { 0x010010d9, 13005 }, /* Georgian_kan */ - { 0x010010e5, 13018 }, /* Georgian_khar */ - { 0x010010da, 13032 }, /* Georgian_las */ - { 0x010010db, 13045 }, /* Georgian_man */ - { 0x010010dc, 13058 }, /* Georgian_nar */ - { 0x010010dd, 13071 }, /* Georgian_on */ - { 0x010010de, 13083 }, /* Georgian_par */ - { 0x010010e4, 13096 }, /* Georgian_phar */ - { 0x010010e7, 13110 }, /* Georgian_qar */ - { 0x010010e0, 13123 }, /* Georgian_rae */ - { 0x010010e1, 13136 }, /* Georgian_san */ - { 0x010010e8, 13149 }, /* Georgian_shin */ - { 0x010010d7, 13163 }, /* Georgian_tan */ - { 0x010010e2, 13176 }, /* Georgian_tar */ - { 0x010010e3, 13189 }, /* Georgian_un */ - { 0x010010d5, 13201 }, /* Georgian_vin */ - { 0x010010f3, 13214 }, /* Georgian_we */ - { 0x010010ee, 13226 }, /* Georgian_xan */ - { 0x010010d6, 13239 }, /* Georgian_zen */ - { 0x010010df, 13252 }, /* Georgian_zhar */ - { 0x00000060, 13266 }, /* grave */ - { 0x0000003e, 13272 }, /* greater */ - { 0x000008be, 13280 }, /* greaterthanequal */ - { 0x000007ae, 13297 }, /* Greek_accentdieresis */ - { 0x000007c1, 13318 }, /* Greek_ALPHA */ - { 0x000007e1, 13330 }, /* Greek_alpha */ - { 0x000007a1, 13342 }, /* Greek_ALPHAaccent */ - { 0x000007b1, 13360 }, /* Greek_alphaaccent */ - { 0x000007c2, 13378 }, /* Greek_BETA */ - { 0x000007e2, 13389 }, /* Greek_beta */ - { 0x000007d7, 13400 }, /* Greek_CHI */ - { 0x000007f7, 13410 }, /* Greek_chi */ - { 0x000007c4, 13420 }, /* Greek_DELTA */ - { 0x000007e4, 13432 }, /* Greek_delta */ - { 0x000007c5, 13444 }, /* Greek_EPSILON */ - { 0x000007e5, 13458 }, /* Greek_epsilon */ - { 0x000007a2, 13472 }, /* Greek_EPSILONaccent */ - { 0x000007b2, 13492 }, /* Greek_epsilonaccent */ - { 0x000007c7, 13512 }, /* Greek_ETA */ - { 0x000007e7, 13522 }, /* Greek_eta */ - { 0x000007a3, 13532 }, /* Greek_ETAaccent */ - { 0x000007b3, 13548 }, /* Greek_etaaccent */ - { 0x000007f3, 13564 }, /* Greek_finalsmallsigma */ - { 0x000007c3, 13586 }, /* Greek_GAMMA */ - { 0x000007e3, 13598 }, /* Greek_gamma */ - { 0x000007af, 13610 }, /* Greek_horizbar */ - { 0x000007c9, 13625 }, /* Greek_IOTA */ - { 0x000007e9, 13636 }, /* Greek_iota */ - { 0x000007a4, 13647 }, /* Greek_IOTAaccent */ - { 0x000007b4, 13664 }, /* Greek_iotaaccent */ - { 0x000007b6, 13681 }, /* Greek_iotaaccentdieresis */ - { 0x000007a5, 13706 }, /* Greek_IOTAdiaeresis */ - { 0x000007a5, 13726 }, /* Greek_IOTAdieresis */ - { 0x000007b5, 13745 }, /* Greek_iotadieresis */ - { 0x000007ca, 13764 }, /* Greek_KAPPA */ - { 0x000007ea, 13776 }, /* Greek_kappa */ - { 0x000007cb, 13788 }, /* Greek_LAMBDA */ - { 0x000007eb, 13801 }, /* Greek_lambda */ - { 0x000007cb, 13814 }, /* Greek_LAMDA */ - { 0x000007eb, 13826 }, /* Greek_lamda */ - { 0x000007cc, 13838 }, /* Greek_MU */ - { 0x000007ec, 13847 }, /* Greek_mu */ - { 0x000007cd, 13856 }, /* Greek_NU */ - { 0x000007ed, 13865 }, /* Greek_nu */ - { 0x000007d9, 13874 }, /* Greek_OMEGA */ - { 0x000007f9, 13886 }, /* Greek_omega */ - { 0x000007ab, 13898 }, /* Greek_OMEGAaccent */ - { 0x000007bb, 13916 }, /* Greek_omegaaccent */ - { 0x000007cf, 13934 }, /* Greek_OMICRON */ - { 0x000007ef, 13948 }, /* Greek_omicron */ - { 0x000007a7, 13962 }, /* Greek_OMICRONaccent */ - { 0x000007b7, 13982 }, /* Greek_omicronaccent */ - { 0x000007d6, 14002 }, /* Greek_PHI */ - { 0x000007f6, 14012 }, /* Greek_phi */ - { 0x000007d0, 14022 }, /* Greek_PI */ - { 0x000007f0, 14031 }, /* Greek_pi */ - { 0x000007d8, 14040 }, /* Greek_PSI */ - { 0x000007f8, 14050 }, /* Greek_psi */ - { 0x000007d1, 14060 }, /* Greek_RHO */ - { 0x000007f1, 14070 }, /* Greek_rho */ - { 0x000007d2, 14080 }, /* Greek_SIGMA */ - { 0x000007f2, 14092 }, /* Greek_sigma */ - { 0x0000ff7e, 14104 }, /* Greek_switch */ - { 0x000007d4, 14117 }, /* Greek_TAU */ - { 0x000007f4, 14127 }, /* Greek_tau */ - { 0x000007c8, 14137 }, /* Greek_THETA */ - { 0x000007e8, 14149 }, /* Greek_theta */ - { 0x000007d5, 14161 }, /* Greek_UPSILON */ - { 0x000007f5, 14175 }, /* Greek_upsilon */ - { 0x000007a8, 14189 }, /* Greek_UPSILONaccent */ - { 0x000007b8, 14209 }, /* Greek_upsilonaccent */ - { 0x000007ba, 14229 }, /* Greek_upsilonaccentdieresis */ - { 0x000007a9, 14257 }, /* Greek_UPSILONdieresis */ - { 0x000007b9, 14279 }, /* Greek_upsilondieresis */ - { 0x000007ce, 14301 }, /* Greek_XI */ - { 0x000007ee, 14310 }, /* Greek_xi */ - { 0x000007c6, 14319 }, /* Greek_ZETA */ - { 0x000007e6, 14330 }, /* Greek_zeta */ - { 0x100000be, 14341 }, /* guilder */ - { 0x000000ab, 14349 }, /* guillemotleft */ - { 0x000000bb, 14363 }, /* guillemotright */ - { 0x00000048, 14378 }, /* H */ - { 0x00000068, 14380 }, /* h */ - { 0x00000aa8, 14382 }, /* hairspace */ - { 0x0000ff31, 14392 }, /* Hangul */ - { 0x00000ebf, 14399 }, /* Hangul_A */ - { 0x00000ec0, 14408 }, /* Hangul_AE */ - { 0x00000ef6, 14418 }, /* Hangul_AraeA */ - { 0x00000ef7, 14431 }, /* Hangul_AraeAE */ - { 0x0000ff39, 14445 }, /* Hangul_Banja */ - { 0x00000eba, 14458 }, /* Hangul_Cieuc */ - { 0x0000ff37, 14471 }, /* Hangul_Codeinput */ - { 0x00000ea7, 14488 }, /* Hangul_Dikeud */ - { 0x00000ec4, 14502 }, /* Hangul_E */ - { 0x0000ff33, 14511 }, /* Hangul_End */ - { 0x00000ec3, 14522 }, /* Hangul_EO */ - { 0x00000ed1, 14532 }, /* Hangul_EU */ - { 0x0000ff34, 14542 }, /* Hangul_Hanja */ - { 0x00000ebe, 14555 }, /* Hangul_Hieuh */ - { 0x00000ed3, 14568 }, /* Hangul_I */ - { 0x00000eb7, 14577 }, /* Hangul_Ieung */ - { 0x00000eea, 14590 }, /* Hangul_J_Cieuc */ - { 0x00000eda, 14605 }, /* Hangul_J_Dikeud */ - { 0x00000eee, 14621 }, /* Hangul_J_Hieuh */ - { 0x00000ee8, 14636 }, /* Hangul_J_Ieung */ - { 0x00000ee9, 14651 }, /* Hangul_J_Jieuj */ - { 0x00000eeb, 14666 }, /* Hangul_J_Khieuq */ - { 0x00000ed4, 14682 }, /* Hangul_J_Kiyeog */ - { 0x00000ed6, 14698 }, /* Hangul_J_KiyeogSios */ - { 0x00000ef9, 14718 }, /* Hangul_J_KkogjiDalrinIeung */ - { 0x00000ee3, 14745 }, /* Hangul_J_Mieum */ - { 0x00000ed7, 14760 }, /* Hangul_J_Nieun */ - { 0x00000ed9, 14775 }, /* Hangul_J_NieunHieuh */ - { 0x00000ed8, 14795 }, /* Hangul_J_NieunJieuj */ - { 0x00000ef8, 14815 }, /* Hangul_J_PanSios */ - { 0x00000eed, 14832 }, /* Hangul_J_Phieuf */ - { 0x00000ee4, 14848 }, /* Hangul_J_Pieub */ - { 0x00000ee5, 14863 }, /* Hangul_J_PieubSios */ - { 0x00000edb, 14882 }, /* Hangul_J_Rieul */ - { 0x00000ee2, 14897 }, /* Hangul_J_RieulHieuh */ - { 0x00000edc, 14917 }, /* Hangul_J_RieulKiyeog */ - { 0x00000edd, 14938 }, /* Hangul_J_RieulMieum */ - { 0x00000ee1, 14958 }, /* Hangul_J_RieulPhieuf */ - { 0x00000ede, 14979 }, /* Hangul_J_RieulPieub */ - { 0x00000edf, 14999 }, /* Hangul_J_RieulSios */ - { 0x00000ee0, 15018 }, /* Hangul_J_RieulTieut */ - { 0x00000ee6, 15038 }, /* Hangul_J_Sios */ - { 0x00000ed5, 15052 }, /* Hangul_J_SsangKiyeog */ - { 0x00000ee7, 15073 }, /* Hangul_J_SsangSios */ - { 0x00000eec, 15092 }, /* Hangul_J_Tieut */ - { 0x00000efa, 15107 }, /* Hangul_J_YeorinHieuh */ - { 0x0000ff35, 15128 }, /* Hangul_Jamo */ - { 0x0000ff38, 15140 }, /* Hangul_Jeonja */ - { 0x00000eb8, 15154 }, /* Hangul_Jieuj */ - { 0x00000ebb, 15167 }, /* Hangul_Khieuq */ - { 0x00000ea1, 15181 }, /* Hangul_Kiyeog */ - { 0x00000ea3, 15195 }, /* Hangul_KiyeogSios */ - { 0x00000ef3, 15213 }, /* Hangul_KkogjiDalrinIeung */ - { 0x00000eb1, 15238 }, /* Hangul_Mieum */ - { 0x0000ff3d, 15251 }, /* Hangul_MultipleCandidate */ - { 0x00000ea4, 15276 }, /* Hangul_Nieun */ - { 0x00000ea6, 15289 }, /* Hangul_NieunHieuh */ - { 0x00000ea5, 15307 }, /* Hangul_NieunJieuj */ - { 0x00000ec7, 15325 }, /* Hangul_O */ - { 0x00000eca, 15334 }, /* Hangul_OE */ - { 0x00000ef2, 15344 }, /* Hangul_PanSios */ - { 0x00000ebd, 15359 }, /* Hangul_Phieuf */ - { 0x00000eb2, 15373 }, /* Hangul_Pieub */ - { 0x00000eb4, 15386 }, /* Hangul_PieubSios */ - { 0x0000ff3b, 15403 }, /* Hangul_PostHanja */ - { 0x0000ff3a, 15420 }, /* Hangul_PreHanja */ - { 0x0000ff3e, 15436 }, /* Hangul_PreviousCandidate */ - { 0x00000ea9, 15461 }, /* Hangul_Rieul */ - { 0x00000eb0, 15474 }, /* Hangul_RieulHieuh */ - { 0x00000eaa, 15492 }, /* Hangul_RieulKiyeog */ - { 0x00000eab, 15511 }, /* Hangul_RieulMieum */ - { 0x00000eaf, 15529 }, /* Hangul_RieulPhieuf */ - { 0x00000eac, 15548 }, /* Hangul_RieulPieub */ - { 0x00000ead, 15566 }, /* Hangul_RieulSios */ - { 0x00000eae, 15583 }, /* Hangul_RieulTieut */ - { 0x00000eef, 15601 }, /* Hangul_RieulYeorinHieuh */ - { 0x0000ff36, 15625 }, /* Hangul_Romaja */ - { 0x0000ff3c, 15639 }, /* Hangul_SingleCandidate */ - { 0x00000eb5, 15662 }, /* Hangul_Sios */ - { 0x0000ff3f, 15674 }, /* Hangul_Special */ - { 0x00000ea8, 15689 }, /* Hangul_SsangDikeud */ - { 0x00000eb9, 15708 }, /* Hangul_SsangJieuj */ - { 0x00000ea2, 15726 }, /* Hangul_SsangKiyeog */ - { 0x00000eb3, 15745 }, /* Hangul_SsangPieub */ - { 0x00000eb6, 15763 }, /* Hangul_SsangSios */ - { 0x0000ff32, 15780 }, /* Hangul_Start */ - { 0x00000ef0, 15793 }, /* Hangul_SunkyeongeumMieum */ - { 0x00000ef4, 15818 }, /* Hangul_SunkyeongeumPhieuf */ - { 0x00000ef1, 15844 }, /* Hangul_SunkyeongeumPieub */ - { 0x0000ff7e, 15869 }, /* Hangul_switch */ - { 0x00000ebc, 15883 }, /* Hangul_Tieut */ - { 0x00000ecc, 15896 }, /* Hangul_U */ - { 0x00000ec8, 15905 }, /* Hangul_WA */ - { 0x00000ec9, 15915 }, /* Hangul_WAE */ - { 0x00000ece, 15926 }, /* Hangul_WE */ - { 0x00000ecd, 15936 }, /* Hangul_WEO */ - { 0x00000ecf, 15947 }, /* Hangul_WI */ - { 0x00000ec1, 15957 }, /* Hangul_YA */ - { 0x00000ec2, 15967 }, /* Hangul_YAE */ - { 0x00000ec6, 15978 }, /* Hangul_YE */ - { 0x00000ec5, 15988 }, /* Hangul_YEO */ - { 0x00000ef5, 15999 }, /* Hangul_YeorinHieuh */ - { 0x00000ed2, 16018 }, /* Hangul_YI */ - { 0x00000ecb, 16028 }, /* Hangul_YO */ - { 0x00000ed0, 16038 }, /* Hangul_YU */ - { 0x0000ff29, 16048 }, /* Hankaku */ - { 0x000002a6, 16056 }, /* Hcircumflex */ - { 0x000002b6, 16068 }, /* hcircumflex */ - { 0x00000aee, 16080 }, /* heart */ - { 0x00000ce0, 16086 }, /* hebrew_aleph */ - { 0x00000cf2, 16099 }, /* hebrew_ayin */ - { 0x00000ce1, 16111 }, /* hebrew_bet */ - { 0x00000ce1, 16122 }, /* hebrew_beth */ - { 0x00000ce7, 16134 }, /* hebrew_chet */ - { 0x00000ce3, 16146 }, /* hebrew_dalet */ - { 0x00000ce3, 16159 }, /* hebrew_daleth */ - { 0x00000cdf, 16173 }, /* hebrew_doublelowline */ - { 0x00000cea, 16194 }, /* hebrew_finalkaph */ - { 0x00000ced, 16211 }, /* hebrew_finalmem */ - { 0x00000cef, 16227 }, /* hebrew_finalnun */ - { 0x00000cf3, 16243 }, /* hebrew_finalpe */ - { 0x00000cf5, 16258 }, /* hebrew_finalzade */ - { 0x00000cf5, 16275 }, /* hebrew_finalzadi */ - { 0x00000ce2, 16292 }, /* hebrew_gimel */ - { 0x00000ce2, 16305 }, /* hebrew_gimmel */ - { 0x00000ce4, 16319 }, /* hebrew_he */ - { 0x00000ce7, 16329 }, /* hebrew_het */ - { 0x00000ceb, 16340 }, /* hebrew_kaph */ - { 0x00000cf7, 16352 }, /* hebrew_kuf */ - { 0x00000cec, 16363 }, /* hebrew_lamed */ - { 0x00000cee, 16376 }, /* hebrew_mem */ - { 0x00000cf0, 16387 }, /* hebrew_nun */ - { 0x00000cf4, 16398 }, /* hebrew_pe */ - { 0x00000cf7, 16408 }, /* hebrew_qoph */ - { 0x00000cf8, 16420 }, /* hebrew_resh */ - { 0x00000cf1, 16432 }, /* hebrew_samech */ - { 0x00000cf1, 16446 }, /* hebrew_samekh */ - { 0x00000cf9, 16460 }, /* hebrew_shin */ - { 0x0000ff7e, 16472 }, /* Hebrew_switch */ - { 0x00000cfa, 16486 }, /* hebrew_taf */ - { 0x00000cfa, 16497 }, /* hebrew_taw */ - { 0x00000ce8, 16508 }, /* hebrew_tet */ - { 0x00000ce8, 16519 }, /* hebrew_teth */ - { 0x00000ce5, 16531 }, /* hebrew_waw */ - { 0x00000ce9, 16542 }, /* hebrew_yod */ - { 0x00000cf6, 16553 }, /* hebrew_zade */ - { 0x00000cf6, 16565 }, /* hebrew_zadi */ - { 0x00000ce6, 16577 }, /* hebrew_zain */ - { 0x00000ce6, 16589 }, /* hebrew_zayin */ - { 0x0000ff6a, 16602 }, /* Help */ - { 0x0000ff23, 16607 }, /* Henkan */ - { 0x0000ff23, 16614 }, /* Henkan_Mode */ - { 0x00000ada, 16626 }, /* hexagram */ - { 0x0000ff25, 16635 }, /* Hiragana */ - { 0x0000ff27, 16644 }, /* Hiragana_Katakana */ - { 0x0000ff50, 16662 }, /* Home */ - { 0x000008a3, 16667 }, /* horizconnector */ - { 0x000009ef, 16682 }, /* horizlinescan1 */ - { 0x000009f0, 16697 }, /* horizlinescan3 */ - { 0x000009f1, 16712 }, /* horizlinescan5 */ - { 0x000009f2, 16727 }, /* horizlinescan7 */ - { 0x000009f3, 16742 }, /* horizlinescan9 */ - { 0x1000ff74, 16757 }, /* hpBackTab */ - { 0x100000fc, 16767 }, /* hpblock */ - { 0x1000ff6f, 16775 }, /* hpClearLine */ - { 0x1000ff73, 16787 }, /* hpDeleteChar */ - { 0x1000ff71, 16800 }, /* hpDeleteLine */ - { 0x100000be, 16813 }, /* hpguilder */ - { 0x1000ff72, 16823 }, /* hpInsertChar */ - { 0x1000ff70, 16836 }, /* hpInsertLine */ - { 0x100000ee, 16849 }, /* hpIO */ - { 0x1000ff75, 16854 }, /* hpKP_BackTab */ - { 0x100000af, 16867 }, /* hplira */ - { 0x100000f6, 16874 }, /* hplongminus */ - { 0x1000ff48, 16886 }, /* hpModelock1 */ - { 0x1000ff49, 16898 }, /* hpModelock2 */ - { 0x100000a8, 16910 }, /* hpmute_acute */ - { 0x100000aa, 16923 }, /* hpmute_asciicircum */ - { 0x100000ac, 16942 }, /* hpmute_asciitilde */ - { 0x100000ab, 16960 }, /* hpmute_diaeresis */ - { 0x100000a9, 16977 }, /* hpmute_grave */ - { 0x1000ff6c, 16990 }, /* hpReset */ - { 0x1000ff6d, 16998 }, /* hpSystem */ - { 0x1000ff6e, 17007 }, /* hpUser */ - { 0x100000ee, 17014 }, /* hpYdiaeresis */ - { 0x000002a1, 17027 }, /* Hstroke */ - { 0x000002b1, 17035 }, /* hstroke */ - { 0x000009e2, 17043 }, /* ht */ - { 0x0000ffed, 17046 }, /* Hyper_L */ - { 0x0000ffee, 17054 }, /* Hyper_R */ - { 0x000000ad, 17062 }, /* hyphen */ - { 0x00000049, 17069 }, /* I */ - { 0x00000069, 17071 }, /* i */ - { 0x000002a9, 17073 }, /* Iabovedot */ - { 0x000000cd, 17083 }, /* Iacute */ - { 0x000000ed, 17090 }, /* iacute */ - { 0x01001eca, 17097 }, /* Ibelowdot */ - { 0x01001ecb, 17107 }, /* ibelowdot */ - { 0x0100012c, 17117 }, /* Ibreve */ - { 0x0100012d, 17124 }, /* ibreve */ - { 0x000000ce, 17131 }, /* Icircumflex */ - { 0x000000ee, 17143 }, /* icircumflex */ - { 0x000008cf, 17155 }, /* identical */ - { 0x000000cf, 17165 }, /* Idiaeresis */ - { 0x000000ef, 17176 }, /* idiaeresis */ - { 0x000002b9, 17187 }, /* idotless */ - { 0x000008cd, 17196 }, /* ifonlyif */ - { 0x000000cc, 17205 }, /* Igrave */ - { 0x000000ec, 17212 }, /* igrave */ - { 0x01001ec8, 17219 }, /* Ihook */ - { 0x01001ec9, 17225 }, /* ihook */ - { 0x000003cf, 17231 }, /* Imacron */ - { 0x000003ef, 17239 }, /* imacron */ - { 0x000008ce, 17247 }, /* implies */ - { 0x000008da, 17255 }, /* includedin */ - { 0x000008db, 17266 }, /* includes */ - { 0x000008c2, 17275 }, /* infinity */ - { 0x0000ff63, 17284 }, /* Insert */ - { 0x1000ff72, 17291 }, /* InsertChar */ - { 0x1000ff70, 17302 }, /* InsertLine */ - { 0x000008bf, 17313 }, /* integral */ - { 0x000008dc, 17322 }, /* intersection */ - { 0x100000ee, 17335 }, /* IO */ - { 0x000003c7, 17338 }, /* Iogonek */ - { 0x000003e7, 17346 }, /* iogonek */ - { 0x0000fe33, 17354 }, /* ISO_Center_Object */ - { 0x0000fe30, 17372 }, /* ISO_Continuous_Underline */ - { 0x0000fe31, 17397 }, /* ISO_Discontinuous_Underline */ - { 0x0000fe32, 17425 }, /* ISO_Emphasize */ - { 0x0000fe34, 17439 }, /* ISO_Enter */ - { 0x0000fe2f, 17449 }, /* ISO_Fast_Cursor_Down */ - { 0x0000fe2c, 17470 }, /* ISO_Fast_Cursor_Left */ - { 0x0000fe2d, 17491 }, /* ISO_Fast_Cursor_Right */ - { 0x0000fe2e, 17513 }, /* ISO_Fast_Cursor_Up */ - { 0x0000fe0c, 17532 }, /* ISO_First_Group */ - { 0x0000fe0d, 17548 }, /* ISO_First_Group_Lock */ - { 0x0000fe06, 17569 }, /* ISO_Group_Latch */ - { 0x0000fe07, 17585 }, /* ISO_Group_Lock */ - { 0x0000ff7e, 17600 }, /* ISO_Group_Shift */ - { 0x0000fe0e, 17616 }, /* ISO_Last_Group */ - { 0x0000fe0f, 17631 }, /* ISO_Last_Group_Lock */ - { 0x0000fe20, 17651 }, /* ISO_Left_Tab */ - { 0x0000fe02, 17664 }, /* ISO_Level2_Latch */ - { 0x0000fe04, 17681 }, /* ISO_Level3_Latch */ - { 0x0000fe05, 17698 }, /* ISO_Level3_Lock */ - { 0x0000fe03, 17714 }, /* ISO_Level3_Shift */ - { 0x0000fe12, 17731 }, /* ISO_Level5_Latch */ - { 0x0000fe13, 17748 }, /* ISO_Level5_Lock */ - { 0x0000fe11, 17764 }, /* ISO_Level5_Shift */ - { 0x0000fe01, 17781 }, /* ISO_Lock */ - { 0x0000fe22, 17790 }, /* ISO_Move_Line_Down */ - { 0x0000fe21, 17809 }, /* ISO_Move_Line_Up */ - { 0x0000fe08, 17826 }, /* ISO_Next_Group */ - { 0x0000fe09, 17841 }, /* ISO_Next_Group_Lock */ - { 0x0000fe24, 17861 }, /* ISO_Partial_Line_Down */ - { 0x0000fe23, 17883 }, /* ISO_Partial_Line_Up */ - { 0x0000fe25, 17903 }, /* ISO_Partial_Space_Left */ - { 0x0000fe26, 17926 }, /* ISO_Partial_Space_Right */ - { 0x0000fe0a, 17950 }, /* ISO_Prev_Group */ - { 0x0000fe0b, 17965 }, /* ISO_Prev_Group_Lock */ - { 0x0000fe2b, 17985 }, /* ISO_Release_Both_Margins */ - { 0x0000fe29, 18010 }, /* ISO_Release_Margin_Left */ - { 0x0000fe2a, 18034 }, /* ISO_Release_Margin_Right */ - { 0x0000fe27, 18059 }, /* ISO_Set_Margin_Left */ - { 0x0000fe28, 18079 }, /* ISO_Set_Margin_Right */ - { 0x000003a5, 18100 }, /* Itilde */ - { 0x000003b5, 18107 }, /* itilde */ - { 0x0000004a, 18114 }, /* J */ - { 0x0000006a, 18116 }, /* j */ - { 0x000002ac, 18118 }, /* Jcircumflex */ - { 0x000002bc, 18130 }, /* jcircumflex */ - { 0x00000bca, 18142 }, /* jot */ - { 0x0000004b, 18146 }, /* K */ - { 0x0000006b, 18148 }, /* k */ - { 0x000004a7, 18150 }, /* kana_a */ - { 0x000004b1, 18157 }, /* kana_A */ - { 0x000004c1, 18164 }, /* kana_CHI */ - { 0x000004a3, 18173 }, /* kana_closingbracket */ - { 0x000004a4, 18193 }, /* kana_comma */ - { 0x000004a5, 18204 }, /* kana_conjunctive */ - { 0x000004aa, 18221 }, /* kana_e */ - { 0x000004b4, 18228 }, /* kana_E */ - { 0x000004cc, 18235 }, /* kana_FU */ - { 0x000004a1, 18243 }, /* kana_fullstop */ - { 0x000004ca, 18257 }, /* kana_HA */ - { 0x000004cd, 18265 }, /* kana_HE */ - { 0x000004cb, 18273 }, /* kana_HI */ - { 0x000004ce, 18281 }, /* kana_HO */ - { 0x000004cc, 18289 }, /* kana_HU */ - { 0x000004a8, 18297 }, /* kana_i */ - { 0x000004b2, 18304 }, /* kana_I */ - { 0x000004b6, 18311 }, /* kana_KA */ - { 0x000004b9, 18319 }, /* kana_KE */ - { 0x000004b7, 18327 }, /* kana_KI */ - { 0x000004ba, 18335 }, /* kana_KO */ - { 0x000004b8, 18343 }, /* kana_KU */ - { 0x0000ff2d, 18351 }, /* Kana_Lock */ - { 0x000004cf, 18361 }, /* kana_MA */ - { 0x000004d2, 18369 }, /* kana_ME */ - { 0x000004d0, 18377 }, /* kana_MI */ - { 0x000004a5, 18385 }, /* kana_middledot */ - { 0x000004d3, 18400 }, /* kana_MO */ - { 0x000004d1, 18408 }, /* kana_MU */ - { 0x000004dd, 18416 }, /* kana_N */ - { 0x000004c5, 18423 }, /* kana_NA */ - { 0x000004c8, 18431 }, /* kana_NE */ - { 0x000004c6, 18439 }, /* kana_NI */ - { 0x000004c9, 18447 }, /* kana_NO */ - { 0x000004c7, 18455 }, /* kana_NU */ - { 0x000004ab, 18463 }, /* kana_o */ - { 0x000004b5, 18470 }, /* kana_O */ - { 0x000004a2, 18477 }, /* kana_openingbracket */ - { 0x000004d7, 18497 }, /* kana_RA */ - { 0x000004da, 18505 }, /* kana_RE */ - { 0x000004d8, 18513 }, /* kana_RI */ - { 0x000004db, 18521 }, /* kana_RO */ - { 0x000004d9, 18529 }, /* kana_RU */ - { 0x000004bb, 18537 }, /* kana_SA */ - { 0x000004be, 18545 }, /* kana_SE */ - { 0x000004bc, 18553 }, /* kana_SHI */ - { 0x0000ff2e, 18562 }, /* Kana_Shift */ - { 0x000004bf, 18573 }, /* kana_SO */ - { 0x000004bd, 18581 }, /* kana_SU */ - { 0x0000ff7e, 18589 }, /* kana_switch */ - { 0x000004c0, 18601 }, /* kana_TA */ - { 0x000004c3, 18609 }, /* kana_TE */ - { 0x000004c1, 18617 }, /* kana_TI */ - { 0x000004c4, 18625 }, /* kana_TO */ - { 0x000004af, 18633 }, /* kana_tsu */ - { 0x000004c2, 18642 }, /* kana_TSU */ - { 0x000004af, 18651 }, /* kana_tu */ - { 0x000004c2, 18659 }, /* kana_TU */ - { 0x000004a9, 18667 }, /* kana_u */ - { 0x000004b3, 18674 }, /* kana_U */ - { 0x000004dc, 18681 }, /* kana_WA */ - { 0x000004a6, 18689 }, /* kana_WO */ - { 0x000004ac, 18697 }, /* kana_ya */ - { 0x000004d4, 18705 }, /* kana_YA */ - { 0x000004ae, 18713 }, /* kana_yo */ - { 0x000004d6, 18721 }, /* kana_YO */ - { 0x000004ad, 18729 }, /* kana_yu */ - { 0x000004d5, 18737 }, /* kana_YU */ - { 0x0000ff21, 18745 }, /* Kanji */ - { 0x0000ff37, 18751 }, /* Kanji_Bangou */ - { 0x000003a2, 18764 }, /* kappa */ - { 0x0000ff26, 18770 }, /* Katakana */ - { 0x000003d3, 18779 }, /* Kcedilla */ - { 0x000003f3, 18788 }, /* kcedilla */ - { 0x00000eff, 18797 }, /* Korean_Won */ - { 0x0000ffb0, 18808 }, /* KP_0 */ - { 0x0000ffb1, 18813 }, /* KP_1 */ - { 0x0000ffb2, 18818 }, /* KP_2 */ - { 0x0000ffb3, 18823 }, /* KP_3 */ - { 0x0000ffb4, 18828 }, /* KP_4 */ - { 0x0000ffb5, 18833 }, /* KP_5 */ - { 0x0000ffb6, 18838 }, /* KP_6 */ - { 0x0000ffb7, 18843 }, /* KP_7 */ - { 0x0000ffb8, 18848 }, /* KP_8 */ - { 0x0000ffb9, 18853 }, /* KP_9 */ - { 0x0000ffab, 18858 }, /* KP_Add */ - { 0x1000ff75, 18865 }, /* KP_BackTab */ - { 0x0000ff9d, 18876 }, /* KP_Begin */ - { 0x0000ffae, 18885 }, /* KP_Decimal */ - { 0x0000ff9f, 18896 }, /* KP_Delete */ - { 0x0000ffaf, 18906 }, /* KP_Divide */ - { 0x0000ff99, 18916 }, /* KP_Down */ - { 0x0000ff9c, 18924 }, /* KP_End */ - { 0x0000ff8d, 18931 }, /* KP_Enter */ - { 0x0000ffbd, 18940 }, /* KP_Equal */ - { 0x0000ff91, 18949 }, /* KP_F1 */ - { 0x0000ff92, 18955 }, /* KP_F2 */ - { 0x0000ff93, 18961 }, /* KP_F3 */ - { 0x0000ff94, 18967 }, /* KP_F4 */ - { 0x0000ff95, 18973 }, /* KP_Home */ - { 0x0000ff9e, 18981 }, /* KP_Insert */ - { 0x0000ff96, 18991 }, /* KP_Left */ - { 0x0000ffaa, 18999 }, /* KP_Multiply */ - { 0x0000ff9b, 19011 }, /* KP_Next */ - { 0x0000ff9b, 19019 }, /* KP_Page_Down */ - { 0x0000ff9a, 19032 }, /* KP_Page_Up */ - { 0x0000ff9a, 19043 }, /* KP_Prior */ - { 0x0000ff98, 19052 }, /* KP_Right */ - { 0x0000ffac, 19061 }, /* KP_Separator */ - { 0x0000ff80, 19074 }, /* KP_Space */ - { 0x0000ffad, 19083 }, /* KP_Subtract */ - { 0x0000ff89, 19095 }, /* KP_Tab */ - { 0x0000ff97, 19102 }, /* KP_Up */ - { 0x000003a2, 19108 }, /* kra */ - { 0x0000004c, 19112 }, /* L */ - { 0x0000006c, 19114 }, /* l */ - { 0x0000ffc8, 19116 }, /* L1 */ - { 0x0000ffd1, 19119 }, /* L10 */ - { 0x0000ffc9, 19123 }, /* L2 */ - { 0x0000ffca, 19126 }, /* L3 */ - { 0x0000ffcb, 19129 }, /* L4 */ - { 0x0000ffcc, 19132 }, /* L5 */ - { 0x0000ffcd, 19135 }, /* L6 */ - { 0x0000ffce, 19138 }, /* L7 */ - { 0x0000ffcf, 19141 }, /* L8 */ - { 0x0000ffd0, 19144 }, /* L9 */ - { 0x000001c5, 19147 }, /* Lacute */ - { 0x000001e5, 19154 }, /* lacute */ - { 0x0000fed4, 19161 }, /* Last_Virtual_Screen */ - { 0x00000ad9, 19181 }, /* latincross */ - { 0x01001e36, 19192 }, /* Lbelowdot */ - { 0x01001e37, 19202 }, /* lbelowdot */ - { 0x000001a5, 19212 }, /* Lcaron */ - { 0x000001b5, 19219 }, /* lcaron */ - { 0x000003a6, 19226 }, /* Lcedilla */ - { 0x000003b6, 19235 }, /* lcedilla */ - { 0x0000ff51, 19244 }, /* Left */ - { 0x00000abc, 19249 }, /* leftanglebracket */ - { 0x000008fb, 19266 }, /* leftarrow */ - { 0x00000ba3, 19276 }, /* leftcaret */ - { 0x00000ad2, 19286 }, /* leftdoublequotemark */ - { 0x000008af, 19306 }, /* leftmiddlecurlybrace */ - { 0x00000acc, 19327 }, /* leftopentriangle */ - { 0x00000aea, 19344 }, /* leftpointer */ - { 0x000008a1, 19356 }, /* leftradical */ - { 0x00000bda, 19368 }, /* leftshoe */ - { 0x00000ad0, 19377 }, /* leftsinglequotemark */ - { 0x000009f4, 19397 }, /* leftt */ - { 0x00000bdc, 19403 }, /* lefttack */ - { 0x0000003c, 19412 }, /* less */ - { 0x000008bc, 19417 }, /* lessthanequal */ - { 0x000009e5, 19431 }, /* lf */ - { 0x0000ff0a, 19434 }, /* Linefeed */ - { 0x100000af, 19443 }, /* lira */ - { 0x010020a4, 19448 }, /* LiraSign */ - { 0x000008de, 19457 }, /* logicaland */ - { 0x000008df, 19468 }, /* logicalor */ - { 0x100000f6, 19478 }, /* longminus */ - { 0x000009ed, 19488 }, /* lowleftcorner */ - { 0x000009ea, 19502 }, /* lowrightcorner */ - { 0x000001a3, 19517 }, /* Lstroke */ - { 0x000001b3, 19525 }, /* lstroke */ - { 0x0000004d, 19533 }, /* M */ - { 0x0000006d, 19535 }, /* m */ - { 0x01001e40, 19537 }, /* Mabovedot */ - { 0x01001e41, 19547 }, /* mabovedot */ - { 0x000006a5, 19557 }, /* Macedonia_dse */ - { 0x000006b5, 19571 }, /* Macedonia_DSE */ - { 0x000006a2, 19585 }, /* Macedonia_gje */ - { 0x000006b2, 19599 }, /* Macedonia_GJE */ - { 0x000006ac, 19613 }, /* Macedonia_kje */ - { 0x000006bc, 19627 }, /* Macedonia_KJE */ - { 0x000000af, 19641 }, /* macron */ - { 0x0000ff3e, 19648 }, /* Mae_Koho */ - { 0x00000af7, 19657 }, /* malesymbol */ - { 0x00000af0, 19668 }, /* maltesecross */ - { 0x00000abf, 19681 }, /* marker */ - { 0x000000ba, 19688 }, /* masculine */ - { 0x0000ff2c, 19698 }, /* Massyo */ - { 0x0000ff67, 19705 }, /* Menu */ - { 0x0000ffe7, 19710 }, /* Meta_L */ - { 0x0000ffe8, 19717 }, /* Meta_R */ - { 0x010020a5, 19724 }, /* MillSign */ - { 0x0000002d, 19733 }, /* minus */ - { 0x00000ad6, 19739 }, /* minutes */ - { 0x0000ff7e, 19747 }, /* Mode_switch */ - { 0x0000fe77, 19759 }, /* MouseKeys_Accel_Enable */ - { 0x0000fe76, 19782 }, /* MouseKeys_Enable */ - { 0x000000b5, 19799 }, /* mu */ - { 0x0000ff22, 19802 }, /* Muhenkan */ - { 0x0000ff20, 19811 }, /* Multi_key */ - { 0x0000ff3d, 19821 }, /* MultipleCandidate */ - { 0x000000d7, 19839 }, /* multiply */ - { 0x00000af6, 19848 }, /* musicalflat */ - { 0x00000af5, 19860 }, /* musicalsharp */ - { 0x100000a8, 19873 }, /* mute_acute */ - { 0x100000aa, 19884 }, /* mute_asciicircum */ - { 0x100000ac, 19901 }, /* mute_asciitilde */ - { 0x100000ab, 19917 }, /* mute_diaeresis */ - { 0x100000a9, 19932 }, /* mute_grave */ - { 0x0000004e, 19943 }, /* N */ - { 0x0000006e, 19945 }, /* n */ - { 0x000008c5, 19947 }, /* nabla */ - { 0x000001d1, 19953 }, /* Nacute */ - { 0x000001f1, 19960 }, /* nacute */ - { 0x010020a6, 19967 }, /* NairaSign */ - { 0x000001d2, 19977 }, /* Ncaron */ - { 0x000001f2, 19984 }, /* ncaron */ - { 0x000003d1, 19991 }, /* Ncedilla */ - { 0x000003f1, 20000 }, /* ncedilla */ - { 0x010020aa, 20009 }, /* NewSheqelSign */ - { 0x0000ff56, 20023 }, /* Next */ - { 0x0000fed2, 20028 }, /* Next_Virtual_Screen */ - { 0x01002089, 20048 }, /* ninesubscript */ - { 0x01002079, 20062 }, /* ninesuperior */ - { 0x000009e8, 20075 }, /* nl */ - { 0x000000a0, 20078 }, /* nobreakspace */ - { 0x00000000, 20091 }, /* NoSymbol */ - { 0x01002247, 20100 }, /* notapproxeq */ - { 0x01002209, 20112 }, /* notelementof */ - { 0x000008bd, 20125 }, /* notequal */ - { 0x01002262, 20134 }, /* notidentical */ - { 0x000000ac, 20147 }, /* notsign */ - { 0x000000d1, 20155 }, /* Ntilde */ - { 0x000000f1, 20162 }, /* ntilde */ - { 0x0000ff7f, 20169 }, /* Num_Lock */ - { 0x00000023, 20178 }, /* numbersign */ - { 0x000006b0, 20189 }, /* numerosign */ - { 0x0000004f, 20200 }, /* O */ - { 0x0000006f, 20202 }, /* o */ - { 0x000000d3, 20204 }, /* Oacute */ - { 0x000000f3, 20211 }, /* oacute */ - { 0x0100019f, 20218 }, /* Obarred */ - { 0x01000275, 20226 }, /* obarred */ - { 0x01001ecc, 20234 }, /* Obelowdot */ - { 0x01001ecd, 20244 }, /* obelowdot */ - { 0x010001d1, 20254 }, /* Ocaron */ - { 0x010001d2, 20261 }, /* ocaron */ - { 0x000000d4, 20268 }, /* Ocircumflex */ - { 0x000000f4, 20280 }, /* ocircumflex */ - { 0x01001ed0, 20292 }, /* Ocircumflexacute */ - { 0x01001ed1, 20309 }, /* ocircumflexacute */ - { 0x01001ed8, 20326 }, /* Ocircumflexbelowdot */ - { 0x01001ed9, 20346 }, /* ocircumflexbelowdot */ - { 0x01001ed2, 20366 }, /* Ocircumflexgrave */ - { 0x01001ed3, 20383 }, /* ocircumflexgrave */ - { 0x01001ed4, 20400 }, /* Ocircumflexhook */ - { 0x01001ed5, 20416 }, /* ocircumflexhook */ - { 0x01001ed6, 20432 }, /* Ocircumflextilde */ - { 0x01001ed7, 20449 }, /* ocircumflextilde */ - { 0x000000d6, 20466 }, /* Odiaeresis */ - { 0x000000f6, 20477 }, /* odiaeresis */ - { 0x000001d5, 20488 }, /* Odoubleacute */ - { 0x000001f5, 20501 }, /* odoubleacute */ - { 0x000013bc, 20514 }, /* OE */ - { 0x000013bd, 20517 }, /* oe */ - { 0x000001b2, 20520 }, /* ogonek */ - { 0x000000d2, 20527 }, /* Ograve */ - { 0x000000f2, 20534 }, /* ograve */ - { 0x01001ece, 20541 }, /* Ohook */ - { 0x01001ecf, 20547 }, /* ohook */ - { 0x010001a0, 20553 }, /* Ohorn */ - { 0x010001a1, 20559 }, /* ohorn */ - { 0x01001eda, 20565 }, /* Ohornacute */ - { 0x01001edb, 20576 }, /* ohornacute */ - { 0x01001ee2, 20587 }, /* Ohornbelowdot */ - { 0x01001ee3, 20601 }, /* ohornbelowdot */ - { 0x01001edc, 20615 }, /* Ohorngrave */ - { 0x01001edd, 20626 }, /* ohorngrave */ - { 0x01001ede, 20637 }, /* Ohornhook */ - { 0x01001edf, 20647 }, /* ohornhook */ - { 0x01001ee0, 20657 }, /* Ohorntilde */ - { 0x01001ee1, 20668 }, /* ohorntilde */ - { 0x000003d2, 20679 }, /* Omacron */ - { 0x000003f2, 20687 }, /* omacron */ - { 0x00000ac3, 20695 }, /* oneeighth */ - { 0x00000ab2, 20705 }, /* onefifth */ - { 0x000000bd, 20714 }, /* onehalf */ - { 0x000000bc, 20722 }, /* onequarter */ - { 0x00000ab6, 20733 }, /* onesixth */ - { 0x01002081, 20742 }, /* onesubscript */ - { 0x000000b9, 20755 }, /* onesuperior */ - { 0x00000ab0, 20767 }, /* onethird */ - { 0x000000d8, 20776 }, /* Ooblique */ - { 0x000000f8, 20785 }, /* ooblique */ - { 0x00000ae2, 20794 }, /* openrectbullet */ - { 0x00000ae5, 20809 }, /* openstar */ - { 0x00000ae4, 20818 }, /* opentribulletdown */ - { 0x00000ae3, 20836 }, /* opentribulletup */ - { 0x000000aa, 20852 }, /* ordfeminine */ - { 0x1004ff44, 20864 }, /* osfActivate */ - { 0x1004ff31, 20876 }, /* osfAddMode */ - { 0x1004ff08, 20887 }, /* osfBackSpace */ - { 0x1004ff07, 20900 }, /* osfBackTab */ - { 0x1004ff5a, 20911 }, /* osfBeginData */ - { 0x1004ff58, 20924 }, /* osfBeginLine */ - { 0x1004ff69, 20937 }, /* osfCancel */ - { 0x1004ff0b, 20947 }, /* osfClear */ - { 0x1004ff02, 20956 }, /* osfCopy */ - { 0x1004ff03, 20964 }, /* osfCut */ - { 0x1004ffff, 20971 }, /* osfDelete */ - { 0x1004ff72, 20981 }, /* osfDeselectAll */ - { 0x1004ff54, 20996 }, /* osfDown */ - { 0x1004ff59, 21004 }, /* osfEndData */ - { 0x1004ff57, 21015 }, /* osfEndLine */ - { 0x1004ff1b, 21026 }, /* osfEscape */ - { 0x1004ff74, 21036 }, /* osfExtend */ - { 0x1004ff6a, 21046 }, /* osfHelp */ - { 0x1004ff63, 21054 }, /* osfInsert */ - { 0x1004ff51, 21064 }, /* osfLeft */ - { 0x1004ff67, 21072 }, /* osfMenu */ - { 0x1004ff45, 21080 }, /* osfMenuBar */ - { 0x1004ff5e, 21091 }, /* osfNextField */ - { 0x1004ff5c, 21104 }, /* osfNextMenu */ - { 0x1004ff42, 21116 }, /* osfPageDown */ - { 0x1004ff40, 21128 }, /* osfPageLeft */ - { 0x1004ff43, 21140 }, /* osfPageRight */ - { 0x1004ff41, 21153 }, /* osfPageUp */ - { 0x1004ff04, 21163 }, /* osfPaste */ - { 0x1004ff5d, 21172 }, /* osfPrevField */ - { 0x1004ff5b, 21185 }, /* osfPrevMenu */ - { 0x1004ff32, 21197 }, /* osfPrimaryPaste */ - { 0x1004ff33, 21213 }, /* osfQuickPaste */ - { 0x1004ff73, 21227 }, /* osfReselect */ - { 0x1004ff78, 21239 }, /* osfRestore */ - { 0x1004ff53, 21250 }, /* osfRight */ - { 0x1004ff60, 21259 }, /* osfSelect */ - { 0x1004ff71, 21269 }, /* osfSelectAll */ - { 0x1004ff65, 21282 }, /* osfUndo */ - { 0x1004ff52, 21290 }, /* osfUp */ - { 0x000000d8, 21296 }, /* Oslash */ - { 0x000000f8, 21303 }, /* oslash */ - { 0x000000d5, 21310 }, /* Otilde */ - { 0x000000f5, 21317 }, /* otilde */ - { 0x00000bc0, 21324 }, /* overbar */ - { 0x0000fe78, 21332 }, /* Overlay1_Enable */ - { 0x0000fe79, 21348 }, /* Overlay2_Enable */ - { 0x0000047e, 21364 }, /* overline */ - { 0x00000050, 21373 }, /* P */ - { 0x00000070, 21375 }, /* p */ - { 0x01001e56, 21377 }, /* Pabovedot */ - { 0x01001e57, 21387 }, /* pabovedot */ - { 0x0000ff56, 21397 }, /* Page_Down */ - { 0x0000ff55, 21407 }, /* Page_Up */ - { 0x000000b6, 21415 }, /* paragraph */ - { 0x00000028, 21425 }, /* parenleft */ - { 0x00000029, 21435 }, /* parenright */ - { 0x01002202, 21446 }, /* partdifferential */ - { 0x000008ef, 21463 }, /* partialderivative */ - { 0x0000ff13, 21481 }, /* Pause */ - { 0x00000025, 21487 }, /* percent */ - { 0x0000002e, 21495 }, /* period */ - { 0x000000b7, 21502 }, /* periodcentered */ - { 0x00000ad5, 21517 }, /* permille */ - { 0x010020a7, 21526 }, /* PesetaSign */ - { 0x00000afb, 21537 }, /* phonographcopyright */ - { 0x0000002b, 21557 }, /* plus */ - { 0x000000b1, 21562 }, /* plusminus */ - { 0x0000fefa, 21572 }, /* Pointer_Accelerate */ - { 0x0000fee9, 21591 }, /* Pointer_Button1 */ - { 0x0000feea, 21607 }, /* Pointer_Button2 */ - { 0x0000feeb, 21623 }, /* Pointer_Button3 */ - { 0x0000feec, 21639 }, /* Pointer_Button4 */ - { 0x0000feed, 21655 }, /* Pointer_Button5 */ - { 0x0000fee8, 21671 }, /* Pointer_Button_Dflt */ - { 0x0000feef, 21691 }, /* Pointer_DblClick1 */ - { 0x0000fef0, 21709 }, /* Pointer_DblClick2 */ - { 0x0000fef1, 21727 }, /* Pointer_DblClick3 */ - { 0x0000fef2, 21745 }, /* Pointer_DblClick4 */ - { 0x0000fef3, 21763 }, /* Pointer_DblClick5 */ - { 0x0000feee, 21781 }, /* Pointer_DblClick_Dflt */ - { 0x0000fefb, 21803 }, /* Pointer_DfltBtnNext */ - { 0x0000fefc, 21823 }, /* Pointer_DfltBtnPrev */ - { 0x0000fee3, 21843 }, /* Pointer_Down */ - { 0x0000fee6, 21856 }, /* Pointer_DownLeft */ - { 0x0000fee7, 21873 }, /* Pointer_DownRight */ - { 0x0000fef5, 21891 }, /* Pointer_Drag1 */ - { 0x0000fef6, 21905 }, /* Pointer_Drag2 */ - { 0x0000fef7, 21919 }, /* Pointer_Drag3 */ - { 0x0000fef8, 21933 }, /* Pointer_Drag4 */ - { 0x0000fefd, 21947 }, /* Pointer_Drag5 */ - { 0x0000fef4, 21961 }, /* Pointer_Drag_Dflt */ - { 0x0000fef9, 21979 }, /* Pointer_EnableKeys */ - { 0x0000fee0, 21998 }, /* Pointer_Left */ - { 0x0000fee1, 22011 }, /* Pointer_Right */ - { 0x0000fee2, 22025 }, /* Pointer_Up */ - { 0x0000fee4, 22036 }, /* Pointer_UpLeft */ - { 0x0000fee5, 22051 }, /* Pointer_UpRight */ - { 0x00000ad4, 22067 }, /* prescription */ - { 0x0000fed1, 22080 }, /* Prev_Virtual_Screen */ - { 0x0000ff3e, 22100 }, /* PreviousCandidate */ - { 0x0000ff61, 22118 }, /* Print */ - { 0x0000ff55, 22124 }, /* Prior */ - { 0x000004b0, 22130 }, /* prolongedsound */ - { 0x00000aa6, 22145 }, /* punctspace */ - { 0x00000051, 22156 }, /* Q */ - { 0x00000071, 22158 }, /* q */ - { 0x00000bcc, 22160 }, /* quad */ - { 0x0000003f, 22165 }, /* question */ - { 0x000000bf, 22174 }, /* questiondown */ - { 0x00000022, 22187 }, /* quotedbl */ - { 0x00000060, 22196 }, /* quoteleft */ - { 0x00000027, 22206 }, /* quoteright */ - { 0x00000052, 22217 }, /* R */ - { 0x00000072, 22219 }, /* r */ - { 0x0000ffd2, 22221 }, /* R1 */ - { 0x0000ffdb, 22224 }, /* R10 */ - { 0x0000ffdc, 22228 }, /* R11 */ - { 0x0000ffdd, 22232 }, /* R12 */ - { 0x0000ffde, 22236 }, /* R13 */ - { 0x0000ffdf, 22240 }, /* R14 */ - { 0x0000ffe0, 22244 }, /* R15 */ - { 0x0000ffd3, 22248 }, /* R2 */ - { 0x0000ffd4, 22251 }, /* R3 */ - { 0x0000ffd5, 22254 }, /* R4 */ - { 0x0000ffd6, 22257 }, /* R5 */ - { 0x0000ffd7, 22260 }, /* R6 */ - { 0x0000ffd8, 22263 }, /* R7 */ - { 0x0000ffd9, 22266 }, /* R8 */ - { 0x0000ffda, 22269 }, /* R9 */ - { 0x000001c0, 22272 }, /* Racute */ - { 0x000001e0, 22279 }, /* racute */ - { 0x000008d6, 22286 }, /* radical */ - { 0x000001d8, 22294 }, /* Rcaron */ - { 0x000001f8, 22301 }, /* rcaron */ - { 0x000003a3, 22308 }, /* Rcedilla */ - { 0x000003b3, 22317 }, /* rcedilla */ - { 0x0000ff66, 22326 }, /* Redo */ - { 0x000000ae, 22331 }, /* registered */ - { 0x0000fe72, 22342 }, /* RepeatKeys_Enable */ - { 0x1000ff6c, 22360 }, /* Reset */ - { 0x0000ff0d, 22366 }, /* Return */ - { 0x0000ff53, 22373 }, /* Right */ - { 0x00000abe, 22379 }, /* rightanglebracket */ - { 0x000008fd, 22397 }, /* rightarrow */ - { 0x00000ba6, 22408 }, /* rightcaret */ - { 0x00000ad3, 22419 }, /* rightdoublequotemark */ - { 0x000008b0, 22440 }, /* rightmiddlecurlybrace */ - { 0x000008b7, 22462 }, /* rightmiddlesummation */ - { 0x00000acd, 22483 }, /* rightopentriangle */ - { 0x00000aeb, 22501 }, /* rightpointer */ - { 0x00000bd8, 22514 }, /* rightshoe */ - { 0x00000ad1, 22524 }, /* rightsinglequotemark */ - { 0x000009f5, 22545 }, /* rightt */ - { 0x00000bfc, 22552 }, /* righttack */ - { 0x0000ff24, 22562 }, /* Romaji */ - { 0x010020a8, 22569 }, /* RupeeSign */ - { 0x00000053, 22579 }, /* S */ - { 0x00000073, 22581 }, /* s */ - { 0x01001e60, 22583 }, /* Sabovedot */ - { 0x01001e61, 22593 }, /* sabovedot */ - { 0x000001a6, 22603 }, /* Sacute */ - { 0x000001b6, 22610 }, /* sacute */ - { 0x000001a9, 22617 }, /* Scaron */ - { 0x000001b9, 22624 }, /* scaron */ - { 0x000001aa, 22631 }, /* Scedilla */ - { 0x000001ba, 22640 }, /* scedilla */ - { 0x0100018f, 22649 }, /* SCHWA */ - { 0x01000259, 22655 }, /* schwa */ - { 0x000002de, 22661 }, /* Scircumflex */ - { 0x000002fe, 22673 }, /* scircumflex */ - { 0x0000ff7e, 22685 }, /* script_switch */ - { 0x0000ff14, 22699 }, /* Scroll_Lock */ - { 0x00000ad7, 22711 }, /* seconds */ - { 0x000000a7, 22719 }, /* section */ - { 0x0000ff60, 22727 }, /* Select */ - { 0x0000003b, 22734 }, /* semicolon */ - { 0x000004df, 22744 }, /* semivoicedsound */ - { 0x000006a1, 22760 }, /* Serbian_dje */ - { 0x000006b1, 22772 }, /* Serbian_DJE */ - { 0x000006af, 22784 }, /* Serbian_dze */ - { 0x000006bf, 22796 }, /* Serbian_DZE */ - { 0x000006a8, 22808 }, /* Serbian_je */ - { 0x000006b8, 22819 }, /* Serbian_JE */ - { 0x000006a9, 22830 }, /* Serbian_lje */ - { 0x000006b9, 22842 }, /* Serbian_LJE */ - { 0x000006aa, 22854 }, /* Serbian_nje */ - { 0x000006ba, 22866 }, /* Serbian_NJE */ - { 0x000006ab, 22878 }, /* Serbian_tshe */ - { 0x000006bb, 22891 }, /* Serbian_TSHE */ - { 0x00000ac6, 22904 }, /* seveneighths */ - { 0x01002087, 22917 }, /* sevensubscript */ - { 0x01002077, 22932 }, /* sevensuperior */ - { 0x0000ffe1, 22946 }, /* Shift_L */ - { 0x0000ffe6, 22954 }, /* Shift_Lock */ - { 0x0000ffe2, 22965 }, /* Shift_R */ - { 0x00000aca, 22973 }, /* signaturemark */ - { 0x00000aac, 22987 }, /* signifblank */ - { 0x000008c9, 22999 }, /* similarequal */ - { 0x0000ff3c, 23012 }, /* SingleCandidate */ - { 0x00000afd, 23028 }, /* singlelowquotemark */ - { 0x01000d85, 23047 }, /* Sinh_a */ - { 0x01000d86, 23054 }, /* Sinh_aa */ - { 0x01000dcf, 23062 }, /* Sinh_aa2 */ - { 0x01000d87, 23071 }, /* Sinh_ae */ - { 0x01000dd0, 23079 }, /* Sinh_ae2 */ - { 0x01000d88, 23088 }, /* Sinh_aee */ - { 0x01000dd1, 23097 }, /* Sinh_aee2 */ - { 0x01000d93, 23107 }, /* Sinh_ai */ - { 0x01000ddb, 23115 }, /* Sinh_ai2 */ - { 0x01000dca, 23124 }, /* Sinh_al */ - { 0x01000d96, 23132 }, /* Sinh_au */ - { 0x01000dde, 23140 }, /* Sinh_au2 */ - { 0x01000db6, 23149 }, /* Sinh_ba */ - { 0x01000db7, 23157 }, /* Sinh_bha */ - { 0x01000da0, 23166 }, /* Sinh_ca */ - { 0x01000da1, 23174 }, /* Sinh_cha */ - { 0x01000da9, 23183 }, /* Sinh_dda */ - { 0x01000daa, 23192 }, /* Sinh_ddha */ - { 0x01000daf, 23202 }, /* Sinh_dha */ - { 0x01000db0, 23211 }, /* Sinh_dhha */ - { 0x01000d91, 23221 }, /* Sinh_e */ - { 0x01000dd9, 23228 }, /* Sinh_e2 */ - { 0x01000d92, 23236 }, /* Sinh_ee */ - { 0x01000dda, 23244 }, /* Sinh_ee2 */ - { 0x01000dc6, 23253 }, /* Sinh_fa */ - { 0x01000d9c, 23261 }, /* Sinh_ga */ - { 0x01000d9d, 23269 }, /* Sinh_gha */ - { 0x01000d83, 23278 }, /* Sinh_h2 */ - { 0x01000dc4, 23286 }, /* Sinh_ha */ - { 0x01000d89, 23294 }, /* Sinh_i */ - { 0x01000dd2, 23301 }, /* Sinh_i2 */ - { 0x01000d8a, 23309 }, /* Sinh_ii */ - { 0x01000dd3, 23317 }, /* Sinh_ii2 */ - { 0x01000da2, 23326 }, /* Sinh_ja */ - { 0x01000da3, 23334 }, /* Sinh_jha */ - { 0x01000da5, 23343 }, /* Sinh_jnya */ - { 0x01000d9a, 23353 }, /* Sinh_ka */ - { 0x01000d9b, 23361 }, /* Sinh_kha */ - { 0x01000df4, 23370 }, /* Sinh_kunddaliya */ - { 0x01000dbd, 23386 }, /* Sinh_la */ - { 0x01000dc5, 23394 }, /* Sinh_lla */ - { 0x01000d8f, 23403 }, /* Sinh_lu */ - { 0x01000ddf, 23411 }, /* Sinh_lu2 */ - { 0x01000d90, 23420 }, /* Sinh_luu */ - { 0x01000df3, 23429 }, /* Sinh_luu2 */ - { 0x01000db8, 23439 }, /* Sinh_ma */ - { 0x01000db9, 23447 }, /* Sinh_mba */ - { 0x01000db1, 23456 }, /* Sinh_na */ - { 0x01000dac, 23464 }, /* Sinh_ndda */ - { 0x01000db3, 23474 }, /* Sinh_ndha */ - { 0x01000d82, 23484 }, /* Sinh_ng */ - { 0x01000d9e, 23492 }, /* Sinh_ng2 */ - { 0x01000d9f, 23501 }, /* Sinh_nga */ - { 0x01000da6, 23510 }, /* Sinh_nja */ - { 0x01000dab, 23519 }, /* Sinh_nna */ - { 0x01000da4, 23528 }, /* Sinh_nya */ - { 0x01000d94, 23537 }, /* Sinh_o */ - { 0x01000ddc, 23544 }, /* Sinh_o2 */ - { 0x01000d95, 23552 }, /* Sinh_oo */ - { 0x01000ddd, 23560 }, /* Sinh_oo2 */ - { 0x01000db4, 23569 }, /* Sinh_pa */ - { 0x01000db5, 23577 }, /* Sinh_pha */ - { 0x01000dbb, 23586 }, /* Sinh_ra */ - { 0x01000d8d, 23594 }, /* Sinh_ri */ - { 0x01000d8e, 23602 }, /* Sinh_rii */ - { 0x01000dd8, 23611 }, /* Sinh_ru2 */ - { 0x01000df2, 23620 }, /* Sinh_ruu2 */ - { 0x01000dc3, 23630 }, /* Sinh_sa */ - { 0x01000dc1, 23638 }, /* Sinh_sha */ - { 0x01000dc2, 23647 }, /* Sinh_ssha */ - { 0x01000dad, 23657 }, /* Sinh_tha */ - { 0x01000dae, 23666 }, /* Sinh_thha */ - { 0x01000da7, 23676 }, /* Sinh_tta */ - { 0x01000da8, 23685 }, /* Sinh_ttha */ - { 0x01000d8b, 23695 }, /* Sinh_u */ - { 0x01000dd4, 23702 }, /* Sinh_u2 */ - { 0x01000d8c, 23710 }, /* Sinh_uu */ - { 0x01000dd6, 23718 }, /* Sinh_uu2 */ - { 0x01000dc0, 23727 }, /* Sinh_va */ - { 0x01000dba, 23735 }, /* Sinh_ya */ - { 0x01002086, 23743 }, /* sixsubscript */ - { 0x01002076, 23756 }, /* sixsuperior */ - { 0x0000002f, 23768 }, /* slash */ - { 0x0000fe73, 23774 }, /* SlowKeys_Enable */ - { 0x000009e0, 23790 }, /* soliddiamond */ - { 0x00000020, 23803 }, /* space */ - { 0x0100221a, 23809 }, /* squareroot */ - { 0x000000df, 23820 }, /* ssharp */ - { 0x000000a3, 23827 }, /* sterling */ - { 0x0000fe75, 23836 }, /* StickyKeys_Enable */ - { 0x01002263, 23854 }, /* stricteq */ - { 0x0000ff66, 23863 }, /* SunAgain */ - { 0x0000ff7e, 23872 }, /* SunAltGraph */ - { 0x1005ff77, 23884 }, /* SunAudioLowerVolume */ - { 0x1005ff78, 23904 }, /* SunAudioMute */ - { 0x1005ff79, 23917 }, /* SunAudioRaiseVolume */ - { 0x0000ff20, 23937 }, /* SunCompose */ - { 0x1005ff72, 23948 }, /* SunCopy */ - { 0x1005ff75, 23956 }, /* SunCut */ - { 0x1005ff10, 23963 }, /* SunF36 */ - { 0x1005ff11, 23970 }, /* SunF37 */ - { 0x1005ff03, 23977 }, /* SunFA_Acute */ - { 0x1005ff05, 23989 }, /* SunFA_Cedilla */ - { 0x1005ff01, 24003 }, /* SunFA_Circum */ - { 0x1005ff04, 24016 }, /* SunFA_Diaeresis */ - { 0x1005ff00, 24032 }, /* SunFA_Grave */ - { 0x1005ff02, 24044 }, /* SunFA_Tilde */ - { 0x0000ff68, 24056 }, /* SunFind */ - { 0x1005ff71, 24064 }, /* SunFront */ - { 0x1005ff73, 24073 }, /* SunOpen */ - { 0x0000ff56, 24081 }, /* SunPageDown */ - { 0x0000ff55, 24093 }, /* SunPageUp */ - { 0x1005ff74, 24103 }, /* SunPaste */ - { 0x1005ff76, 24112 }, /* SunPowerSwitch */ - { 0x1005ff7d, 24127 }, /* SunPowerSwitchShift */ - { 0x0000ff61, 24147 }, /* SunPrint_Screen */ - { 0x1005ff70, 24163 }, /* SunProps */ - { 0x0000ff69, 24172 }, /* SunStop */ - { 0x1005ff60, 24180 }, /* SunSys_Req */ - { 0x0000ff65, 24191 }, /* SunUndo */ - { 0x1005ff7a, 24199 }, /* SunVideoDegauss */ - { 0x1005ff7b, 24215 }, /* SunVideoLowerBrightness */ - { 0x1005ff7c, 24239 }, /* SunVideoRaiseBrightness */ - { 0x0000ffeb, 24263 }, /* Super_L */ - { 0x0000ffec, 24271 }, /* Super_R */ - { 0x0000ff15, 24279 }, /* Sys_Req */ - { 0x1000ff6d, 24287 }, /* System */ - { 0x00000054, 24294 }, /* T */ - { 0x00000074, 24296 }, /* t */ - { 0x0000ff09, 24298 }, /* Tab */ - { 0x01001e6a, 24302 }, /* Tabovedot */ - { 0x01001e6b, 24312 }, /* tabovedot */ - { 0x000001ab, 24322 }, /* Tcaron */ - { 0x000001bb, 24329 }, /* tcaron */ - { 0x000001de, 24336 }, /* Tcedilla */ - { 0x000001fe, 24345 }, /* tcedilla */ - { 0x00000af9, 24354 }, /* telephone */ - { 0x00000afa, 24364 }, /* telephonerecorder */ - { 0x0000fed5, 24382 }, /* Terminate_Server */ - { 0x00000ddf, 24399 }, /* Thai_baht */ - { 0x00000dba, 24409 }, /* Thai_bobaimai */ - { 0x00000da8, 24423 }, /* Thai_chochan */ - { 0x00000daa, 24436 }, /* Thai_chochang */ - { 0x00000da9, 24450 }, /* Thai_choching */ - { 0x00000dac, 24464 }, /* Thai_chochoe */ - { 0x00000dae, 24477 }, /* Thai_dochada */ - { 0x00000db4, 24490 }, /* Thai_dodek */ - { 0x00000dbd, 24501 }, /* Thai_fofa */ - { 0x00000dbf, 24511 }, /* Thai_fofan */ - { 0x00000dcb, 24522 }, /* Thai_hohip */ - { 0x00000dce, 24533 }, /* Thai_honokhuk */ - { 0x00000da2, 24547 }, /* Thai_khokhai */ - { 0x00000da5, 24560 }, /* Thai_khokhon */ - { 0x00000da3, 24573 }, /* Thai_khokhuat */ - { 0x00000da4, 24587 }, /* Thai_khokhwai */ - { 0x00000da6, 24601 }, /* Thai_khorakhang */ - { 0x00000da1, 24617 }, /* Thai_kokai */ - { 0x00000de5, 24628 }, /* Thai_lakkhangyao */ - { 0x00000df7, 24645 }, /* Thai_lekchet */ - { 0x00000df5, 24658 }, /* Thai_lekha */ - { 0x00000df6, 24669 }, /* Thai_lekhok */ - { 0x00000df9, 24681 }, /* Thai_lekkao */ - { 0x00000df1, 24693 }, /* Thai_leknung */ - { 0x00000df8, 24706 }, /* Thai_lekpaet */ - { 0x00000df3, 24719 }, /* Thai_leksam */ - { 0x00000df4, 24731 }, /* Thai_leksi */ - { 0x00000df2, 24742 }, /* Thai_leksong */ - { 0x00000df0, 24755 }, /* Thai_leksun */ - { 0x00000dcc, 24767 }, /* Thai_lochula */ - { 0x00000dc5, 24780 }, /* Thai_loling */ - { 0x00000dc6, 24792 }, /* Thai_lu */ - { 0x00000deb, 24800 }, /* Thai_maichattawa */ - { 0x00000de8, 24817 }, /* Thai_maiek */ - { 0x00000dd1, 24828 }, /* Thai_maihanakat */ - { 0x00000dde, 24844 }, /* Thai_maihanakat_maitho */ - { 0x00000de7, 24867 }, /* Thai_maitaikhu */ - { 0x00000de9, 24882 }, /* Thai_maitho */ - { 0x00000dea, 24894 }, /* Thai_maitri */ - { 0x00000de6, 24906 }, /* Thai_maiyamok */ - { 0x00000dc1, 24920 }, /* Thai_moma */ - { 0x00000da7, 24930 }, /* Thai_ngongu */ - { 0x00000ded, 24942 }, /* Thai_nikhahit */ - { 0x00000db3, 24956 }, /* Thai_nonen */ - { 0x00000db9, 24967 }, /* Thai_nonu */ - { 0x00000dcd, 24977 }, /* Thai_oang */ - { 0x00000dcf, 24987 }, /* Thai_paiyannoi */ - { 0x00000dda, 25002 }, /* Thai_phinthu */ - { 0x00000dbe, 25015 }, /* Thai_phophan */ - { 0x00000dbc, 25028 }, /* Thai_phophung */ - { 0x00000dc0, 25042 }, /* Thai_phosamphao */ - { 0x00000dbb, 25058 }, /* Thai_popla */ - { 0x00000dc3, 25069 }, /* Thai_rorua */ - { 0x00000dc4, 25080 }, /* Thai_ru */ - { 0x00000dd0, 25088 }, /* Thai_saraa */ - { 0x00000dd2, 25099 }, /* Thai_saraaa */ - { 0x00000de1, 25111 }, /* Thai_saraae */ - { 0x00000de4, 25123 }, /* Thai_saraaimaimalai */ - { 0x00000de3, 25143 }, /* Thai_saraaimaimuan */ - { 0x00000dd3, 25162 }, /* Thai_saraam */ - { 0x00000de0, 25174 }, /* Thai_sarae */ - { 0x00000dd4, 25185 }, /* Thai_sarai */ - { 0x00000dd5, 25196 }, /* Thai_saraii */ - { 0x00000de2, 25208 }, /* Thai_sarao */ - { 0x00000dd8, 25219 }, /* Thai_sarau */ - { 0x00000dd6, 25230 }, /* Thai_saraue */ - { 0x00000dd7, 25242 }, /* Thai_sarauee */ - { 0x00000dd9, 25255 }, /* Thai_sarauu */ - { 0x00000dc9, 25267 }, /* Thai_sorusi */ - { 0x00000dc8, 25279 }, /* Thai_sosala */ - { 0x00000dab, 25291 }, /* Thai_soso */ - { 0x00000dca, 25301 }, /* Thai_sosua */ - { 0x00000dec, 25312 }, /* Thai_thanthakhat */ - { 0x00000db1, 25329 }, /* Thai_thonangmontho */ - { 0x00000db2, 25348 }, /* Thai_thophuthao */ - { 0x00000db7, 25364 }, /* Thai_thothahan */ - { 0x00000db0, 25379 }, /* Thai_thothan */ - { 0x00000db8, 25392 }, /* Thai_thothong */ - { 0x00000db6, 25406 }, /* Thai_thothung */ - { 0x00000daf, 25420 }, /* Thai_topatak */ - { 0x00000db5, 25433 }, /* Thai_totao */ - { 0x00000dc7, 25444 }, /* Thai_wowaen */ - { 0x00000dc2, 25456 }, /* Thai_yoyak */ - { 0x00000dad, 25467 }, /* Thai_yoying */ - { 0x000008c0, 25479 }, /* therefore */ - { 0x00000aa7, 25489 }, /* thinspace */ - { 0x000000de, 25499 }, /* THORN */ - { 0x000000de, 25505 }, /* Thorn */ - { 0x000000fe, 25511 }, /* thorn */ - { 0x00000ac4, 25517 }, /* threeeighths */ - { 0x00000ab4, 25530 }, /* threefifths */ - { 0x000000be, 25542 }, /* threequarters */ - { 0x01002083, 25556 }, /* threesubscript */ - { 0x000000b3, 25571 }, /* threesuperior */ - { 0x0100222d, 25585 }, /* tintegral */ - { 0x000008a4, 25595 }, /* topintegral */ - { 0x000008ab, 25607 }, /* topleftparens */ - { 0x000008a2, 25621 }, /* topleftradical */ - { 0x000008a7, 25636 }, /* topleftsqbracket */ - { 0x000008b1, 25653 }, /* topleftsummation */ - { 0x000008ad, 25670 }, /* toprightparens */ - { 0x000008a9, 25685 }, /* toprightsqbracket */ - { 0x000008b5, 25703 }, /* toprightsummation */ - { 0x000009f7, 25721 }, /* topt */ - { 0x000008b3, 25726 }, /* topvertsummationconnector */ - { 0x0000ff2b, 25752 }, /* Touroku */ - { 0x00000ac9, 25760 }, /* trademark */ - { 0x00000acb, 25770 }, /* trademarkincircle */ - { 0x000003ac, 25788 }, /* Tslash */ - { 0x000003bc, 25795 }, /* tslash */ - { 0x00000ab3, 25802 }, /* twofifths */ - { 0x01002082, 25812 }, /* twosubscript */ - { 0x000000b2, 25825 }, /* twosuperior */ - { 0x00000ab1, 25837 }, /* twothirds */ - { 0x00000055, 25847 }, /* U */ - { 0x00000075, 25849 }, /* u */ - { 0x000000da, 25851 }, /* Uacute */ - { 0x000000fa, 25858 }, /* uacute */ - { 0x01001ee4, 25865 }, /* Ubelowdot */ - { 0x01001ee5, 25875 }, /* ubelowdot */ - { 0x000002dd, 25885 }, /* Ubreve */ - { 0x000002fd, 25892 }, /* ubreve */ - { 0x000000db, 25899 }, /* Ucircumflex */ - { 0x000000fb, 25911 }, /* ucircumflex */ - { 0x000000dc, 25923 }, /* Udiaeresis */ - { 0x000000fc, 25934 }, /* udiaeresis */ - { 0x000001db, 25945 }, /* Udoubleacute */ - { 0x000001fb, 25958 }, /* udoubleacute */ - { 0x000000d9, 25971 }, /* Ugrave */ - { 0x000000f9, 25978 }, /* ugrave */ - { 0x01001ee6, 25985 }, /* Uhook */ - { 0x01001ee7, 25991 }, /* uhook */ - { 0x010001af, 25997 }, /* Uhorn */ - { 0x010001b0, 26003 }, /* uhorn */ - { 0x01001ee8, 26009 }, /* Uhornacute */ - { 0x01001ee9, 26020 }, /* uhornacute */ - { 0x01001ef0, 26031 }, /* Uhornbelowdot */ - { 0x01001ef1, 26045 }, /* uhornbelowdot */ - { 0x01001eea, 26059 }, /* Uhorngrave */ - { 0x01001eeb, 26070 }, /* uhorngrave */ - { 0x01001eec, 26081 }, /* Uhornhook */ - { 0x01001eed, 26091 }, /* uhornhook */ - { 0x01001eee, 26101 }, /* Uhorntilde */ - { 0x01001eef, 26112 }, /* uhorntilde */ - { 0x000006ad, 26123 }, /* Ukrainian_ghe_with_upturn */ - { 0x000006bd, 26149 }, /* Ukrainian_GHE_WITH_UPTURN */ - { 0x000006a6, 26175 }, /* Ukrainian_i */ - { 0x000006b6, 26187 }, /* Ukrainian_I */ - { 0x000006a4, 26199 }, /* Ukrainian_ie */ - { 0x000006b4, 26212 }, /* Ukrainian_IE */ - { 0x000006a7, 26225 }, /* Ukrainian_yi */ - { 0x000006b7, 26238 }, /* Ukrainian_YI */ - { 0x000006a6, 26251 }, /* Ukranian_i */ - { 0x000006b6, 26262 }, /* Ukranian_I */ - { 0x000006a4, 26273 }, /* Ukranian_je */ - { 0x000006b4, 26285 }, /* Ukranian_JE */ - { 0x000006a7, 26297 }, /* Ukranian_yi */ - { 0x000006b7, 26309 }, /* Ukranian_YI */ - { 0x000003de, 26321 }, /* Umacron */ - { 0x000003fe, 26329 }, /* umacron */ - { 0x00000bc6, 26337 }, /* underbar */ - { 0x0000005f, 26346 }, /* underscore */ - { 0x0000ff65, 26357 }, /* Undo */ - { 0x000008dd, 26362 }, /* union */ - { 0x000003d9, 26368 }, /* Uogonek */ - { 0x000003f9, 26376 }, /* uogonek */ - { 0x0000ff52, 26384 }, /* Up */ - { 0x000008fc, 26387 }, /* uparrow */ - { 0x00000ba9, 26395 }, /* upcaret */ - { 0x000009ec, 26403 }, /* upleftcorner */ - { 0x000009eb, 26416 }, /* uprightcorner */ - { 0x00000bc3, 26430 }, /* upshoe */ - { 0x00000bd3, 26437 }, /* upstile */ - { 0x00000bce, 26445 }, /* uptack */ - { 0x000001d9, 26452 }, /* Uring */ - { 0x000001f9, 26458 }, /* uring */ - { 0x1000ff6e, 26464 }, /* User */ - { 0x000003dd, 26469 }, /* Utilde */ - { 0x000003fd, 26476 }, /* utilde */ - { 0x00000056, 26483 }, /* V */ - { 0x00000076, 26485 }, /* v */ - { 0x000008c1, 26487 }, /* variation */ - { 0x000009f8, 26497 }, /* vertbar */ - { 0x000008a6, 26505 }, /* vertconnector */ - { 0x000004de, 26519 }, /* voicedsound */ - { 0x00ffffff, 26531 }, /* VoidSymbol */ - { 0x000009e9, 26542 }, /* vt */ - { 0x00000057, 26545 }, /* W */ - { 0x00000077, 26547 }, /* w */ - { 0x01001e82, 26549 }, /* Wacute */ - { 0x01001e83, 26556 }, /* wacute */ - { 0x01000174, 26563 }, /* Wcircumflex */ - { 0x01000175, 26575 }, /* wcircumflex */ - { 0x01001e84, 26587 }, /* Wdiaeresis */ - { 0x01001e85, 26598 }, /* wdiaeresis */ - { 0x01001e80, 26609 }, /* Wgrave */ - { 0x01001e81, 26616 }, /* wgrave */ - { 0x010020a9, 26623 }, /* WonSign */ - { 0x00000058, 26631 }, /* X */ - { 0x00000078, 26633 }, /* x */ - { 0x01001e8a, 26635 }, /* Xabovedot */ - { 0x01001e8b, 26645 }, /* xabovedot */ - { 0x1008ff39, 26655 }, /* XF86AddFavorite */ - { 0x1008ff50, 26671 }, /* XF86ApplicationLeft */ - { 0x1008ff51, 26691 }, /* XF86ApplicationRight */ - { 0x1008ff9b, 26712 }, /* XF86AudioCycleTrack */ - { 0x1008ff97, 26732 }, /* XF86AudioForward */ - { 0x1008ff11, 26749 }, /* XF86AudioLowerVolume */ - { 0x1008ff32, 26770 }, /* XF86AudioMedia */ - { 0x1008ffb2, 26785 }, /* XF86AudioMicMute */ - { 0x1008ff12, 26802 }, /* XF86AudioMute */ - { 0x1008ff17, 26816 }, /* XF86AudioNext */ - { 0x1008ff31, 26830 }, /* XF86AudioPause */ - { 0x1008ff14, 26845 }, /* XF86AudioPlay */ - { 0x1008ffb6, 26859 }, /* XF86AudioPreset */ - { 0x1008ff16, 26875 }, /* XF86AudioPrev */ - { 0x1008ff13, 26889 }, /* XF86AudioRaiseVolume */ - { 0x1008ff99, 26910 }, /* XF86AudioRandomPlay */ - { 0x1008ff1c, 26930 }, /* XF86AudioRecord */ - { 0x1008ff98, 26946 }, /* XF86AudioRepeat */ - { 0x1008ff3e, 26962 }, /* XF86AudioRewind */ - { 0x1008ff15, 26978 }, /* XF86AudioStop */ - { 0x1008ff8d, 26992 }, /* XF86Away */ - { 0x1008ff26, 27001 }, /* XF86Back */ - { 0x1008ff3f, 27010 }, /* XF86BackForward */ - { 0x1008ff93, 27026 }, /* XF86Battery */ - { 0x1008ffa6, 27038 }, /* XF86Blue */ - { 0x1008ff94, 27047 }, /* XF86Bluetooth */ - { 0x1008ff52, 27061 }, /* XF86Book */ - { 0x1008ff3b, 27070 }, /* XF86BrightnessAdjust */ - { 0x1008ff54, 27091 }, /* XF86Calculater */ - { 0x1008ff1d, 27106 }, /* XF86Calculator */ - { 0x1008ff20, 27121 }, /* XF86Calendar */ - { 0x1008ff53, 27134 }, /* XF86CD */ - { 0x1008ff55, 27141 }, /* XF86Clear */ - { 0x1008fe21, 27151 }, /* XF86ClearGrab */ - { 0x1008ff56, 27165 }, /* XF86Close */ - { 0x1008ff3d, 27175 }, /* XF86Community */ - { 0x1008ff22, 27189 }, /* XF86ContrastAdjust */ - { 0x1008ff57, 27208 }, /* XF86Copy */ - { 0x1008ff58, 27217 }, /* XF86Cut */ - { 0x1008ff9c, 27225 }, /* XF86CycleAngle */ - { 0x1008ff59, 27240 }, /* XF86Display */ - { 0x1008ff5b, 27252 }, /* XF86Documents */ - { 0x1008ff5a, 27266 }, /* XF86DOS */ - { 0x1008ff2c, 27274 }, /* XF86Eject */ - { 0x1008ff5c, 27284 }, /* XF86Excel */ - { 0x1008ff5d, 27294 }, /* XF86Explorer */ - { 0x1008ff30, 27307 }, /* XF86Favorites */ - { 0x1008ff3c, 27321 }, /* XF86Finance */ - { 0x1008ff27, 27333 }, /* XF86Forward */ - { 0x1008ff9d, 27345 }, /* XF86FrameBack */ - { 0x1008ff9e, 27359 }, /* XF86FrameForward */ - { 0x1008ffb8, 27376 }, /* XF86FullScreen */ - { 0x1008ff5e, 27391 }, /* XF86Game */ - { 0x1008ff5f, 27400 }, /* XF86Go */ - { 0x1008ffa4, 27407 }, /* XF86Green */ - { 0x1008ffa8, 27417 }, /* XF86Hibernate */ - { 0x1008ff37, 27431 }, /* XF86History */ - { 0x1008ff18, 27443 }, /* XF86HomePage */ - { 0x1008ff3a, 27456 }, /* XF86HotLinks */ - { 0x1008ff60, 27469 }, /* XF86iTouch */ - { 0x1008ff06, 27480 }, /* XF86KbdBrightnessDown */ - { 0x1008ff05, 27502 }, /* XF86KbdBrightnessUp */ - { 0x1008ff04, 27522 }, /* XF86KbdLightOnOff */ - { 0x1008ffb3, 27540 }, /* XF86Keyboard */ - { 0x1008ff40, 27553 }, /* XF86Launch0 */ - { 0x1008ff41, 27565 }, /* XF86Launch1 */ - { 0x1008ff42, 27577 }, /* XF86Launch2 */ - { 0x1008ff43, 27589 }, /* XF86Launch3 */ - { 0x1008ff44, 27601 }, /* XF86Launch4 */ - { 0x1008ff45, 27613 }, /* XF86Launch5 */ - { 0x1008ff46, 27625 }, /* XF86Launch6 */ - { 0x1008ff47, 27637 }, /* XF86Launch7 */ - { 0x1008ff48, 27649 }, /* XF86Launch8 */ - { 0x1008ff49, 27661 }, /* XF86Launch9 */ - { 0x1008ff4a, 27673 }, /* XF86LaunchA */ - { 0x1008ff4b, 27685 }, /* XF86LaunchB */ - { 0x1008ff4c, 27697 }, /* XF86LaunchC */ - { 0x1008ff4d, 27709 }, /* XF86LaunchD */ - { 0x1008ff4e, 27721 }, /* XF86LaunchE */ - { 0x1008ff4f, 27733 }, /* XF86LaunchF */ - { 0x1008ff35, 27745 }, /* XF86LightBulb */ - { 0x1008fe25, 27759 }, /* XF86LogGrabInfo */ - { 0x1008ff61, 27775 }, /* XF86LogOff */ - { 0x1008fe24, 27786 }, /* XF86LogWindowTree */ - { 0x1008ff19, 27804 }, /* XF86Mail */ - { 0x1008ff90, 27813 }, /* XF86MailForward */ - { 0x1008ff62, 27829 }, /* XF86Market */ - { 0x1008ff63, 27840 }, /* XF86Meeting */ - { 0x1008ff1e, 27852 }, /* XF86Memo */ - { 0x1008ff65, 27861 }, /* XF86MenuKB */ - { 0x1008ff66, 27872 }, /* XF86MenuPB */ - { 0x1008ff8e, 27883 }, /* XF86Messenger */ - { 0x1008ff01, 27897 }, /* XF86ModeLock */ - { 0x1008ff07, 27910 }, /* XF86MonBrightnessCycle */ - { 0x1008ff03, 27933 }, /* XF86MonBrightnessDown */ - { 0x1008ff02, 27955 }, /* XF86MonBrightnessUp */ - { 0x1008ff92, 27975 }, /* XF86Music */ - { 0x1008ff33, 27985 }, /* XF86MyComputer */ - { 0x1008ff67, 28000 }, /* XF86MySites */ - { 0x1008ff68, 28012 }, /* XF86New */ - { 0x1008ff69, 28020 }, /* XF86News */ - { 0x1008fe22, 28029 }, /* XF86Next_VMode */ - { 0x1008ff6a, 28044 }, /* XF86OfficeHome */ - { 0x1008ff6b, 28059 }, /* XF86Open */ - { 0x1008ff38, 28068 }, /* XF86OpenURL */ - { 0x1008ff6c, 28080 }, /* XF86Option */ - { 0x1008ff6d, 28091 }, /* XF86Paste */ - { 0x1008ff6e, 28101 }, /* XF86Phone */ - { 0x1008ff91, 28111 }, /* XF86Pictures */ - { 0x1008ff21, 28124 }, /* XF86PowerDown */ - { 0x1008ff2a, 28138 }, /* XF86PowerOff */ - { 0x1008fe23, 28151 }, /* XF86Prev_VMode */ - { 0x1008ff70, 28166 }, /* XF86Q */ - { 0x1008ffa3, 28172 }, /* XF86Red */ - { 0x1008ff29, 28180 }, /* XF86Refresh */ - { 0x1008ff73, 28192 }, /* XF86Reload */ - { 0x1008ff72, 28203 }, /* XF86Reply */ - { 0x1008ffb5, 28213 }, /* XF86RFKill */ - { 0x1008ff24, 28224 }, /* XF86RockerDown */ - { 0x1008ff25, 28239 }, /* XF86RockerEnter */ - { 0x1008ff23, 28255 }, /* XF86RockerUp */ - { 0x1008ff74, 28268 }, /* XF86RotateWindows */ - { 0x1008ff76, 28286 }, /* XF86RotationKB */ - { 0x1008ffb7, 28301 }, /* XF86RotationLockToggle */ - { 0x1008ff75, 28324 }, /* XF86RotationPB */ - { 0x1008ff77, 28339 }, /* XF86Save */ - { 0x1008ff2d, 28348 }, /* XF86ScreenSaver */ - { 0x1008ff7a, 28364 }, /* XF86ScrollClick */ - { 0x1008ff79, 28380 }, /* XF86ScrollDown */ - { 0x1008ff78, 28395 }, /* XF86ScrollUp */ - { 0x1008ff1b, 28408 }, /* XF86Search */ - { 0x1008ffa0, 28419 }, /* XF86Select */ - { 0x1008ff7b, 28430 }, /* XF86Send */ - { 0x1008ff36, 28439 }, /* XF86Shop */ - { 0x1008ff2f, 28448 }, /* XF86Sleep */ - { 0x1008ff7c, 28458 }, /* XF86Spell */ - { 0x1008ff7d, 28468 }, /* XF86SplitScreen */ - { 0x1008ff10, 28484 }, /* XF86Standby */ - { 0x1008ff1a, 28496 }, /* XF86Start */ - { 0x1008ff28, 28506 }, /* XF86Stop */ - { 0x1008ff9a, 28515 }, /* XF86Subtitle */ - { 0x1008ff7e, 28528 }, /* XF86Support */ - { 0x1008ffa7, 28540 }, /* XF86Suspend */ - { 0x1008fe01, 28552 }, /* XF86Switch_VT_1 */ - { 0x1008fe0a, 28568 }, /* XF86Switch_VT_10 */ - { 0x1008fe0b, 28585 }, /* XF86Switch_VT_11 */ - { 0x1008fe0c, 28602 }, /* XF86Switch_VT_12 */ - { 0x1008fe02, 28619 }, /* XF86Switch_VT_2 */ - { 0x1008fe03, 28635 }, /* XF86Switch_VT_3 */ - { 0x1008fe04, 28651 }, /* XF86Switch_VT_4 */ - { 0x1008fe05, 28667 }, /* XF86Switch_VT_5 */ - { 0x1008fe06, 28683 }, /* XF86Switch_VT_6 */ - { 0x1008fe07, 28699 }, /* XF86Switch_VT_7 */ - { 0x1008fe08, 28715 }, /* XF86Switch_VT_8 */ - { 0x1008fe09, 28731 }, /* XF86Switch_VT_9 */ - { 0x1008ff7f, 28747 }, /* XF86TaskPane */ - { 0x1008ff80, 28760 }, /* XF86Terminal */ - { 0x1008ff9f, 28773 }, /* XF86Time */ - { 0x1008ff1f, 28782 }, /* XF86ToDoList */ - { 0x1008ff81, 28795 }, /* XF86Tools */ - { 0x1008ffa2, 28805 }, /* XF86TopMenu */ - { 0x1008ffb1, 28817 }, /* XF86TouchpadOff */ - { 0x1008ffb0, 28833 }, /* XF86TouchpadOn */ - { 0x1008ffa9, 28848 }, /* XF86TouchpadToggle */ - { 0x1008ff82, 28867 }, /* XF86Travel */ - { 0x1008fe20, 28878 }, /* XF86Ungrab */ - { 0x1008ff85, 28889 }, /* XF86User1KB */ - { 0x1008ff86, 28901 }, /* XF86User2KB */ - { 0x1008ff84, 28913 }, /* XF86UserPB */ - { 0x1008ff96, 28924 }, /* XF86UWB */ - { 0x1008ff34, 28932 }, /* XF86VendorHome */ - { 0x1008ff87, 28947 }, /* XF86Video */ - { 0x1008ffa1, 28957 }, /* XF86View */ - { 0x1008ff2b, 28966 }, /* XF86WakeUp */ - { 0x1008ff8f, 28977 }, /* XF86WebCam */ - { 0x1008ff88, 28988 }, /* XF86WheelButton */ - { 0x1008ff95, 29004 }, /* XF86WLAN */ - { 0x1008ff89, 29013 }, /* XF86Word */ - { 0x1008ffb4, 29022 }, /* XF86WWAN */ - { 0x1008ff2e, 29031 }, /* XF86WWW */ - { 0x1008ff8a, 29039 }, /* XF86Xfer */ - { 0x1008ffa5, 29048 }, /* XF86Yellow */ - { 0x1008ff8b, 29059 }, /* XF86ZoomIn */ - { 0x1008ff8c, 29070 }, /* XF86ZoomOut */ - { 0x00000059, 29082 }, /* Y */ - { 0x00000079, 29084 }, /* y */ - { 0x000000dd, 29086 }, /* Yacute */ - { 0x000000fd, 29093 }, /* yacute */ - { 0x01001ef4, 29100 }, /* Ybelowdot */ - { 0x01001ef5, 29110 }, /* ybelowdot */ - { 0x01000176, 29120 }, /* Ycircumflex */ - { 0x01000177, 29132 }, /* ycircumflex */ - { 0x000000ff, 29144 }, /* ydiaeresis */ - { 0x000013be, 29155 }, /* Ydiaeresis */ - { 0x000000a5, 29166 }, /* yen */ - { 0x01001ef2, 29170 }, /* Ygrave */ - { 0x01001ef3, 29177 }, /* ygrave */ - { 0x01001ef6, 29184 }, /* Yhook */ - { 0x01001ef7, 29190 }, /* yhook */ - { 0x01001ef8, 29196 }, /* Ytilde */ - { 0x01001ef9, 29203 }, /* ytilde */ - { 0x0000005a, 29210 }, /* Z */ - { 0x0000007a, 29212 }, /* z */ - { 0x000001af, 29214 }, /* Zabovedot */ - { 0x000001bf, 29224 }, /* zabovedot */ - { 0x000001ac, 29234 }, /* Zacute */ - { 0x000001bc, 29241 }, /* zacute */ - { 0x000001ae, 29248 }, /* Zcaron */ - { 0x000001be, 29255 }, /* zcaron */ - { 0x0000ff3d, 29262 }, /* Zen_Koho */ - { 0x0000ff28, 29271 }, /* Zenkaku */ - { 0x0000ff2a, 29279 }, /* Zenkaku_Hankaku */ - { 0x01002080, 29295 }, /* zerosubscript */ - { 0x01002070, 29309 }, /* zerosuperior */ - { 0x010001b5, 29322 }, /* Zstroke */ - { 0x010001b6, 29330 }, /* zstroke */ + { 0x01000301, 8680 }, /* combining_acute */ + { 0x01000323, 8696 }, /* combining_belowdot */ + { 0x01000300, 8715 }, /* combining_grave */ + { 0x01000309, 8731 }, /* combining_hook */ + { 0x01000303, 8746 }, /* combining_tilde */ + { 0x0000002c, 8762 }, /* comma */ + { 0x0100220b, 8768 }, /* containsas */ + { 0x0000ffe3, 8779 }, /* Control_L */ + { 0x0000ffe4, 8789 }, /* Control_R */ + { 0x000000a9, 8799 }, /* copyright */ + { 0x000009e4, 8809 }, /* cr */ + { 0x000009ee, 8812 }, /* crossinglines */ + { 0x010020a2, 8826 }, /* CruzeiroSign */ + { 0x0100221b, 8839 }, /* cuberoot */ + { 0x000000a4, 8848 }, /* currency */ + { 0x00000aff, 8857 }, /* cursor */ + { 0x000006c1, 8864 }, /* Cyrillic_a */ + { 0x000006e1, 8875 }, /* Cyrillic_A */ + { 0x000006c2, 8886 }, /* Cyrillic_be */ + { 0x000006e2, 8898 }, /* Cyrillic_BE */ + { 0x000006de, 8910 }, /* Cyrillic_che */ + { 0x000006fe, 8923 }, /* Cyrillic_CHE */ + { 0x010004b6, 8936 }, /* Cyrillic_CHE_descender */ + { 0x010004b7, 8959 }, /* Cyrillic_che_descender */ + { 0x010004b8, 8982 }, /* Cyrillic_CHE_vertstroke */ + { 0x010004b9, 9006 }, /* Cyrillic_che_vertstroke */ + { 0x000006c4, 9030 }, /* Cyrillic_de */ + { 0x000006e4, 9042 }, /* Cyrillic_DE */ + { 0x000006af, 9054 }, /* Cyrillic_dzhe */ + { 0x000006bf, 9068 }, /* Cyrillic_DZHE */ + { 0x000006dc, 9082 }, /* Cyrillic_e */ + { 0x000006fc, 9093 }, /* Cyrillic_E */ + { 0x000006c6, 9104 }, /* Cyrillic_ef */ + { 0x000006e6, 9116 }, /* Cyrillic_EF */ + { 0x000006cc, 9128 }, /* Cyrillic_el */ + { 0x000006ec, 9140 }, /* Cyrillic_EL */ + { 0x000006cd, 9152 }, /* Cyrillic_em */ + { 0x000006ed, 9164 }, /* Cyrillic_EM */ + { 0x000006ce, 9176 }, /* Cyrillic_en */ + { 0x000006ee, 9188 }, /* Cyrillic_EN */ + { 0x010004a2, 9200 }, /* Cyrillic_EN_descender */ + { 0x010004a3, 9222 }, /* Cyrillic_en_descender */ + { 0x000006d2, 9244 }, /* Cyrillic_er */ + { 0x000006f2, 9256 }, /* Cyrillic_ER */ + { 0x000006d3, 9268 }, /* Cyrillic_es */ + { 0x000006f3, 9280 }, /* Cyrillic_ES */ + { 0x000006c7, 9292 }, /* Cyrillic_ghe */ + { 0x000006e7, 9305 }, /* Cyrillic_GHE */ + { 0x01000492, 9318 }, /* Cyrillic_GHE_bar */ + { 0x01000493, 9335 }, /* Cyrillic_ghe_bar */ + { 0x000006c8, 9352 }, /* Cyrillic_ha */ + { 0x000006e8, 9364 }, /* Cyrillic_HA */ + { 0x010004b2, 9376 }, /* Cyrillic_HA_descender */ + { 0x010004b3, 9398 }, /* Cyrillic_ha_descender */ + { 0x000006df, 9420 }, /* Cyrillic_hardsign */ + { 0x000006ff, 9438 }, /* Cyrillic_HARDSIGN */ + { 0x000006c9, 9456 }, /* Cyrillic_i */ + { 0x000006e9, 9467 }, /* Cyrillic_I */ + { 0x010004e2, 9478 }, /* Cyrillic_I_macron */ + { 0x010004e3, 9496 }, /* Cyrillic_i_macron */ + { 0x000006c5, 9514 }, /* Cyrillic_ie */ + { 0x000006e5, 9526 }, /* Cyrillic_IE */ + { 0x000006a3, 9538 }, /* Cyrillic_io */ + { 0x000006b3, 9550 }, /* Cyrillic_IO */ + { 0x000006a8, 9562 }, /* Cyrillic_je */ + { 0x000006b8, 9574 }, /* Cyrillic_JE */ + { 0x000006cb, 9586 }, /* Cyrillic_ka */ + { 0x000006eb, 9598 }, /* Cyrillic_KA */ + { 0x0100049a, 9610 }, /* Cyrillic_KA_descender */ + { 0x0100049b, 9632 }, /* Cyrillic_ka_descender */ + { 0x0100049c, 9654 }, /* Cyrillic_KA_vertstroke */ + { 0x0100049d, 9677 }, /* Cyrillic_ka_vertstroke */ + { 0x000006a9, 9700 }, /* Cyrillic_lje */ + { 0x000006b9, 9713 }, /* Cyrillic_LJE */ + { 0x000006aa, 9726 }, /* Cyrillic_nje */ + { 0x000006ba, 9739 }, /* Cyrillic_NJE */ + { 0x000006cf, 9752 }, /* Cyrillic_o */ + { 0x000006ef, 9763 }, /* Cyrillic_O */ + { 0x010004e8, 9774 }, /* Cyrillic_O_bar */ + { 0x010004e9, 9789 }, /* Cyrillic_o_bar */ + { 0x000006d0, 9804 }, /* Cyrillic_pe */ + { 0x000006f0, 9816 }, /* Cyrillic_PE */ + { 0x010004d8, 9828 }, /* Cyrillic_SCHWA */ + { 0x010004d9, 9843 }, /* Cyrillic_schwa */ + { 0x000006db, 9858 }, /* Cyrillic_sha */ + { 0x000006fb, 9871 }, /* Cyrillic_SHA */ + { 0x000006dd, 9884 }, /* Cyrillic_shcha */ + { 0x000006fd, 9899 }, /* Cyrillic_SHCHA */ + { 0x010004ba, 9914 }, /* Cyrillic_SHHA */ + { 0x010004bb, 9928 }, /* Cyrillic_shha */ + { 0x000006ca, 9942 }, /* Cyrillic_shorti */ + { 0x000006ea, 9958 }, /* Cyrillic_SHORTI */ + { 0x000006d8, 9974 }, /* Cyrillic_softsign */ + { 0x000006f8, 9992 }, /* Cyrillic_SOFTSIGN */ + { 0x000006d4, 10010 }, /* Cyrillic_te */ + { 0x000006f4, 10022 }, /* Cyrillic_TE */ + { 0x000006c3, 10034 }, /* Cyrillic_tse */ + { 0x000006e3, 10047 }, /* Cyrillic_TSE */ + { 0x000006d5, 10060 }, /* Cyrillic_u */ + { 0x000006f5, 10071 }, /* Cyrillic_U */ + { 0x010004ee, 10082 }, /* Cyrillic_U_macron */ + { 0x010004ef, 10100 }, /* Cyrillic_u_macron */ + { 0x010004ae, 10118 }, /* Cyrillic_U_straight */ + { 0x010004af, 10138 }, /* Cyrillic_u_straight */ + { 0x010004b0, 10158 }, /* Cyrillic_U_straight_bar */ + { 0x010004b1, 10182 }, /* Cyrillic_u_straight_bar */ + { 0x000006d7, 10206 }, /* Cyrillic_ve */ + { 0x000006f7, 10218 }, /* Cyrillic_VE */ + { 0x000006d1, 10230 }, /* Cyrillic_ya */ + { 0x000006f1, 10242 }, /* Cyrillic_YA */ + { 0x000006d9, 10254 }, /* Cyrillic_yeru */ + { 0x000006f9, 10268 }, /* Cyrillic_YERU */ + { 0x000006c0, 10282 }, /* Cyrillic_yu */ + { 0x000006e0, 10294 }, /* Cyrillic_YU */ + { 0x000006da, 10306 }, /* Cyrillic_ze */ + { 0x000006fa, 10318 }, /* Cyrillic_ZE */ + { 0x000006d6, 10330 }, /* Cyrillic_zhe */ + { 0x000006f6, 10343 }, /* Cyrillic_ZHE */ + { 0x01000496, 10356 }, /* Cyrillic_ZHE_descender */ + { 0x01000497, 10379 }, /* Cyrillic_zhe_descender */ + { 0x00000044, 10402 }, /* D */ + { 0x00000064, 10404 }, /* d */ + { 0x01001e0a, 10406 }, /* Dabovedot */ + { 0x01001e0b, 10416 }, /* dabovedot */ + { 0x1000fe27, 10426 }, /* Dacute_accent */ + { 0x00000af1, 10440 }, /* dagger */ + { 0x000001cf, 10447 }, /* Dcaron */ + { 0x000001ef, 10454 }, /* dcaron */ + { 0x1000fe2c, 10461 }, /* Dcedilla_accent */ + { 0x1000fe5e, 10477 }, /* Dcircumflex_accent */ + { 0x1000fe22, 10496 }, /* Ddiaeresis */ + { 0x0000fe80, 10507 }, /* dead_a */ + { 0x0000fe81, 10514 }, /* dead_A */ + { 0x0000fe64, 10521 }, /* dead_abovecomma */ + { 0x0000fe56, 10537 }, /* dead_abovedot */ + { 0x0000fe65, 10551 }, /* dead_abovereversedcomma */ + { 0x0000fe58, 10575 }, /* dead_abovering */ + { 0x0000fe91, 10590 }, /* dead_aboveverticalline */ + { 0x0000fe51, 10613 }, /* dead_acute */ + { 0x0000fe6b, 10624 }, /* dead_belowbreve */ + { 0x0000fe69, 10640 }, /* dead_belowcircumflex */ + { 0x0000fe6e, 10661 }, /* dead_belowcomma */ + { 0x0000fe6c, 10677 }, /* dead_belowdiaeresis */ + { 0x0000fe60, 10697 }, /* dead_belowdot */ + { 0x0000fe68, 10711 }, /* dead_belowmacron */ + { 0x0000fe67, 10728 }, /* dead_belowring */ + { 0x0000fe6a, 10743 }, /* dead_belowtilde */ + { 0x0000fe92, 10759 }, /* dead_belowverticalline */ + { 0x0000fe55, 10782 }, /* dead_breve */ + { 0x0000fe8b, 10793 }, /* dead_capital_schwa */ + { 0x0000fe5a, 10812 }, /* dead_caron */ + { 0x0000fe5b, 10823 }, /* dead_cedilla */ + { 0x0000fe52, 10836 }, /* dead_circumflex */ + { 0x0000fe6f, 10852 }, /* dead_currency */ + { 0x0000fe65, 10866 }, /* dead_dasia */ + { 0x0000fe57, 10877 }, /* dead_diaeresis */ + { 0x0000fe59, 10892 }, /* dead_doubleacute */ + { 0x0000fe66, 10909 }, /* dead_doublegrave */ + { 0x0000fe82, 10926 }, /* dead_e */ + { 0x0000fe83, 10933 }, /* dead_E */ + { 0x0000fe50, 10940 }, /* dead_grave */ + { 0x0000fe8c, 10951 }, /* dead_greek */ + { 0x0000fe61, 10962 }, /* dead_hook */ + { 0x0000fe62, 10972 }, /* dead_horn */ + { 0x0000fe84, 10982 }, /* dead_i */ + { 0x0000fe85, 10989 }, /* dead_I */ + { 0x0000fe6d, 10996 }, /* dead_invertedbreve */ + { 0x0000fe5d, 11015 }, /* dead_iota */ + { 0x0000fe93, 11025 }, /* dead_longsolidusoverlay */ + { 0x0000fe90, 11049 }, /* dead_lowline */ + { 0x0000fe54, 11062 }, /* dead_macron */ + { 0x0000fe86, 11074 }, /* dead_o */ + { 0x0000fe87, 11081 }, /* dead_O */ + { 0x0000fe5c, 11088 }, /* dead_ogonek */ + { 0x0000fe53, 11100 }, /* dead_perispomeni */ + { 0x0000fe64, 11117 }, /* dead_psili */ + { 0x0000fe5f, 11128 }, /* dead_semivoiced_sound */ + { 0x0000fe8a, 11150 }, /* dead_small_schwa */ + { 0x0000fe63, 11167 }, /* dead_stroke */ + { 0x0000fe53, 11179 }, /* dead_tilde */ + { 0x0000fe88, 11190 }, /* dead_u */ + { 0x0000fe89, 11197 }, /* dead_U */ + { 0x0000fe5e, 11204 }, /* dead_voiced_sound */ + { 0x00000abd, 11222 }, /* decimalpoint */ + { 0x000000b0, 11235 }, /* degree */ + { 0x0000ffff, 11242 }, /* Delete */ + { 0x1000ff73, 11249 }, /* DeleteChar */ + { 0x1000ff71, 11260 }, /* DeleteLine */ + { 0x1000fe60, 11271 }, /* Dgrave_accent */ + { 0x000000a8, 11285 }, /* diaeresis */ + { 0x00000aed, 11295 }, /* diamond */ + { 0x00000aa5, 11303 }, /* digitspace */ + { 0x0100222c, 11314 }, /* dintegral */ + { 0x000000f7, 11324 }, /* division */ + { 0x00000024, 11333 }, /* dollar */ + { 0x010020ab, 11340 }, /* DongSign */ + { 0x00000aaf, 11349 }, /* doubbaselinedot */ + { 0x000001bd, 11365 }, /* doubleacute */ + { 0x00000af2, 11377 }, /* doubledagger */ + { 0x00000afe, 11390 }, /* doublelowquotemark */ + { 0x0000ff54, 11409 }, /* Down */ + { 0x000008fe, 11414 }, /* downarrow */ + { 0x00000ba8, 11424 }, /* downcaret */ + { 0x00000bd6, 11434 }, /* downshoe */ + { 0x00000bc4, 11443 }, /* downstile */ + { 0x00000bc2, 11453 }, /* downtack */ + { 0x1000ff00, 11462 }, /* DRemove */ + { 0x1000feb0, 11470 }, /* Dring_accent */ + { 0x000001d0, 11483 }, /* Dstroke */ + { 0x000001f0, 11491 }, /* dstroke */ + { 0x1000fe7e, 11499 }, /* Dtilde */ + { 0x00000045, 11506 }, /* E */ + { 0x00000065, 11508 }, /* e */ + { 0x000003cc, 11510 }, /* Eabovedot */ + { 0x000003ec, 11520 }, /* eabovedot */ + { 0x000000c9, 11530 }, /* Eacute */ + { 0x000000e9, 11537 }, /* eacute */ + { 0x01001eb8, 11544 }, /* Ebelowdot */ + { 0x01001eb9, 11554 }, /* ebelowdot */ + { 0x000001cc, 11564 }, /* Ecaron */ + { 0x000001ec, 11571 }, /* ecaron */ + { 0x000000ca, 11578 }, /* Ecircumflex */ + { 0x000000ea, 11590 }, /* ecircumflex */ + { 0x01001ebe, 11602 }, /* Ecircumflexacute */ + { 0x01001ebf, 11619 }, /* ecircumflexacute */ + { 0x01001ec6, 11636 }, /* Ecircumflexbelowdot */ + { 0x01001ec7, 11656 }, /* ecircumflexbelowdot */ + { 0x01001ec0, 11676 }, /* Ecircumflexgrave */ + { 0x01001ec1, 11693 }, /* ecircumflexgrave */ + { 0x01001ec2, 11710 }, /* Ecircumflexhook */ + { 0x01001ec3, 11726 }, /* ecircumflexhook */ + { 0x01001ec4, 11742 }, /* Ecircumflextilde */ + { 0x01001ec5, 11759 }, /* ecircumflextilde */ + { 0x010020a0, 11776 }, /* EcuSign */ + { 0x000000cb, 11784 }, /* Ediaeresis */ + { 0x000000eb, 11795 }, /* ediaeresis */ + { 0x000000c8, 11806 }, /* Egrave */ + { 0x000000e8, 11813 }, /* egrave */ + { 0x01001eba, 11820 }, /* Ehook */ + { 0x01001ebb, 11826 }, /* ehook */ + { 0x01002088, 11832 }, /* eightsubscript */ + { 0x01002078, 11847 }, /* eightsuperior */ + { 0x0000ff2f, 11861 }, /* Eisu_Shift */ + { 0x0000ff30, 11872 }, /* Eisu_toggle */ + { 0x01002208, 11884 }, /* elementof */ + { 0x00000aae, 11894 }, /* ellipsis */ + { 0x00000aa3, 11903 }, /* em3space */ + { 0x00000aa4, 11912 }, /* em4space */ + { 0x000003aa, 11921 }, /* Emacron */ + { 0x000003ba, 11929 }, /* emacron */ + { 0x00000aa9, 11937 }, /* emdash */ + { 0x00000ade, 11944 }, /* emfilledcircle */ + { 0x00000adf, 11959 }, /* emfilledrect */ + { 0x00000ace, 11972 }, /* emopencircle */ + { 0x00000acf, 11985 }, /* emopenrectangle */ + { 0x01002205, 12001 }, /* emptyset */ + { 0x00000aa1, 12010 }, /* emspace */ + { 0x0000ff57, 12018 }, /* End */ + { 0x00000aaa, 12022 }, /* endash */ + { 0x00000ae6, 12029 }, /* enfilledcircbullet */ + { 0x00000ae7, 12048 }, /* enfilledsqbullet */ + { 0x000003bd, 12065 }, /* ENG */ + { 0x000003bf, 12069 }, /* eng */ + { 0x00000ae0, 12073 }, /* enopencircbullet */ + { 0x00000ae1, 12090 }, /* enopensquarebullet */ + { 0x00000aa2, 12109 }, /* enspace */ + { 0x000001ca, 12117 }, /* Eogonek */ + { 0x000001ea, 12125 }, /* eogonek */ + { 0x0000003d, 12133 }, /* equal */ + { 0x0000ff1b, 12139 }, /* Escape */ + { 0x000000d0, 12146 }, /* ETH */ + { 0x000000d0, 12150 }, /* Eth */ + { 0x000000f0, 12154 }, /* eth */ + { 0x01001ebc, 12158 }, /* Etilde */ + { 0x01001ebd, 12165 }, /* etilde */ + { 0x000020ac, 12172 }, /* EuroSign */ + { 0x00000021, 12181 }, /* exclam */ + { 0x000000a1, 12188 }, /* exclamdown */ + { 0x0000ff62, 12199 }, /* Execute */ + { 0x1000ff76, 12207 }, /* Ext16bit_L */ + { 0x1000ff77, 12218 }, /* Ext16bit_R */ + { 0x010001b7, 12229 }, /* EZH */ + { 0x01000292, 12233 }, /* ezh */ + { 0x00000046, 12237 }, /* F */ + { 0x00000066, 12239 }, /* f */ + { 0x0000ffbe, 12241 }, /* F1 */ + { 0x0000ffc7, 12244 }, /* F10 */ + { 0x0000ffc8, 12248 }, /* F11 */ + { 0x0000ffc9, 12252 }, /* F12 */ + { 0x0000ffca, 12256 }, /* F13 */ + { 0x0000ffcb, 12260 }, /* F14 */ + { 0x0000ffcc, 12264 }, /* F15 */ + { 0x0000ffcd, 12268 }, /* F16 */ + { 0x0000ffce, 12272 }, /* F17 */ + { 0x0000ffcf, 12276 }, /* F18 */ + { 0x0000ffd0, 12280 }, /* F19 */ + { 0x0000ffbf, 12284 }, /* F2 */ + { 0x0000ffd1, 12287 }, /* F20 */ + { 0x0000ffd2, 12291 }, /* F21 */ + { 0x0000ffd3, 12295 }, /* F22 */ + { 0x0000ffd4, 12299 }, /* F23 */ + { 0x0000ffd5, 12303 }, /* F24 */ + { 0x0000ffd6, 12307 }, /* F25 */ + { 0x0000ffd7, 12311 }, /* F26 */ + { 0x0000ffd8, 12315 }, /* F27 */ + { 0x0000ffd9, 12319 }, /* F28 */ + { 0x0000ffda, 12323 }, /* F29 */ + { 0x0000ffc0, 12327 }, /* F3 */ + { 0x0000ffdb, 12330 }, /* F30 */ + { 0x0000ffdc, 12334 }, /* F31 */ + { 0x0000ffdd, 12338 }, /* F32 */ + { 0x0000ffde, 12342 }, /* F33 */ + { 0x0000ffdf, 12346 }, /* F34 */ + { 0x0000ffe0, 12350 }, /* F35 */ + { 0x0000ffc1, 12354 }, /* F4 */ + { 0x0000ffc2, 12357 }, /* F5 */ + { 0x0000ffc3, 12360 }, /* F6 */ + { 0x0000ffc4, 12363 }, /* F7 */ + { 0x0000ffc5, 12366 }, /* F8 */ + { 0x0000ffc6, 12369 }, /* F9 */ + { 0x01001e1e, 12372 }, /* Fabovedot */ + { 0x01001e1f, 12382 }, /* fabovedot */ + { 0x010006f0, 12392 }, /* Farsi_0 */ + { 0x010006f1, 12400 }, /* Farsi_1 */ + { 0x010006f2, 12408 }, /* Farsi_2 */ + { 0x010006f3, 12416 }, /* Farsi_3 */ + { 0x010006f4, 12424 }, /* Farsi_4 */ + { 0x010006f5, 12432 }, /* Farsi_5 */ + { 0x010006f6, 12440 }, /* Farsi_6 */ + { 0x010006f7, 12448 }, /* Farsi_7 */ + { 0x010006f8, 12456 }, /* Farsi_8 */ + { 0x010006f9, 12464 }, /* Farsi_9 */ + { 0x010006cc, 12472 }, /* Farsi_yeh */ + { 0x00000af8, 12482 }, /* femalesymbol */ + { 0x000009e3, 12495 }, /* ff */ + { 0x010020a3, 12498 }, /* FFrancSign */ + { 0x00000abb, 12509 }, /* figdash */ + { 0x00000adc, 12517 }, /* filledlefttribullet */ + { 0x00000adb, 12537 }, /* filledrectbullet */ + { 0x00000add, 12554 }, /* filledrighttribullet */ + { 0x00000ae9, 12575 }, /* filledtribulletdown */ + { 0x00000ae8, 12595 }, /* filledtribulletup */ + { 0x0000ff68, 12613 }, /* Find */ + { 0x0000fed0, 12618 }, /* First_Virtual_Screen */ + { 0x00000ac5, 12639 }, /* fiveeighths */ + { 0x00000ab7, 12651 }, /* fivesixths */ + { 0x01002085, 12662 }, /* fivesubscript */ + { 0x01002075, 12676 }, /* fivesuperior */ + { 0x00000ab5, 12689 }, /* fourfifths */ + { 0x01002084, 12700 }, /* foursubscript */ + { 0x01002074, 12714 }, /* foursuperior */ + { 0x0100221c, 12727 }, /* fourthroot */ + { 0x000008f6, 12738 }, /* function */ + { 0x00000047, 12747 }, /* G */ + { 0x00000067, 12749 }, /* g */ + { 0x000002d5, 12751 }, /* Gabovedot */ + { 0x000002f5, 12761 }, /* gabovedot */ + { 0x000002ab, 12771 }, /* Gbreve */ + { 0x000002bb, 12778 }, /* gbreve */ + { 0x010001e6, 12785 }, /* Gcaron */ + { 0x010001e7, 12792 }, /* gcaron */ + { 0x000003ab, 12799 }, /* Gcedilla */ + { 0x000003bb, 12808 }, /* gcedilla */ + { 0x000002d8, 12817 }, /* Gcircumflex */ + { 0x000002f8, 12829 }, /* gcircumflex */ + { 0x010010d0, 12841 }, /* Georgian_an */ + { 0x010010d1, 12853 }, /* Georgian_ban */ + { 0x010010ea, 12866 }, /* Georgian_can */ + { 0x010010ed, 12879 }, /* Georgian_char */ + { 0x010010e9, 12893 }, /* Georgian_chin */ + { 0x010010ec, 12907 }, /* Georgian_cil */ + { 0x010010d3, 12920 }, /* Georgian_don */ + { 0x010010d4, 12933 }, /* Georgian_en */ + { 0x010010f6, 12945 }, /* Georgian_fi */ + { 0x010010d2, 12957 }, /* Georgian_gan */ + { 0x010010e6, 12970 }, /* Georgian_ghan */ + { 0x010010f0, 12984 }, /* Georgian_hae */ + { 0x010010f4, 12997 }, /* Georgian_har */ + { 0x010010f1, 13010 }, /* Georgian_he */ + { 0x010010f2, 13022 }, /* Georgian_hie */ + { 0x010010f5, 13035 }, /* Georgian_hoe */ + { 0x010010d8, 13048 }, /* Georgian_in */ + { 0x010010ef, 13060 }, /* Georgian_jhan */ + { 0x010010eb, 13074 }, /* Georgian_jil */ + { 0x010010d9, 13087 }, /* Georgian_kan */ + { 0x010010e5, 13100 }, /* Georgian_khar */ + { 0x010010da, 13114 }, /* Georgian_las */ + { 0x010010db, 13127 }, /* Georgian_man */ + { 0x010010dc, 13140 }, /* Georgian_nar */ + { 0x010010dd, 13153 }, /* Georgian_on */ + { 0x010010de, 13165 }, /* Georgian_par */ + { 0x010010e4, 13178 }, /* Georgian_phar */ + { 0x010010e7, 13192 }, /* Georgian_qar */ + { 0x010010e0, 13205 }, /* Georgian_rae */ + { 0x010010e1, 13218 }, /* Georgian_san */ + { 0x010010e8, 13231 }, /* Georgian_shin */ + { 0x010010d7, 13245 }, /* Georgian_tan */ + { 0x010010e2, 13258 }, /* Georgian_tar */ + { 0x010010e3, 13271 }, /* Georgian_un */ + { 0x010010d5, 13283 }, /* Georgian_vin */ + { 0x010010f3, 13296 }, /* Georgian_we */ + { 0x010010ee, 13308 }, /* Georgian_xan */ + { 0x010010d6, 13321 }, /* Georgian_zen */ + { 0x010010df, 13334 }, /* Georgian_zhar */ + { 0x00000060, 13348 }, /* grave */ + { 0x0000003e, 13354 }, /* greater */ + { 0x000008be, 13362 }, /* greaterthanequal */ + { 0x000007ae, 13379 }, /* Greek_accentdieresis */ + { 0x000007c1, 13400 }, /* Greek_ALPHA */ + { 0x000007e1, 13412 }, /* Greek_alpha */ + { 0x000007a1, 13424 }, /* Greek_ALPHAaccent */ + { 0x000007b1, 13442 }, /* Greek_alphaaccent */ + { 0x000007c2, 13460 }, /* Greek_BETA */ + { 0x000007e2, 13471 }, /* Greek_beta */ + { 0x000007d7, 13482 }, /* Greek_CHI */ + { 0x000007f7, 13492 }, /* Greek_chi */ + { 0x000007c4, 13502 }, /* Greek_DELTA */ + { 0x000007e4, 13514 }, /* Greek_delta */ + { 0x000007c5, 13526 }, /* Greek_EPSILON */ + { 0x000007e5, 13540 }, /* Greek_epsilon */ + { 0x000007a2, 13554 }, /* Greek_EPSILONaccent */ + { 0x000007b2, 13574 }, /* Greek_epsilonaccent */ + { 0x000007c7, 13594 }, /* Greek_ETA */ + { 0x000007e7, 13604 }, /* Greek_eta */ + { 0x000007a3, 13614 }, /* Greek_ETAaccent */ + { 0x000007b3, 13630 }, /* Greek_etaaccent */ + { 0x000007f3, 13646 }, /* Greek_finalsmallsigma */ + { 0x000007c3, 13668 }, /* Greek_GAMMA */ + { 0x000007e3, 13680 }, /* Greek_gamma */ + { 0x000007af, 13692 }, /* Greek_horizbar */ + { 0x000007c9, 13707 }, /* Greek_IOTA */ + { 0x000007e9, 13718 }, /* Greek_iota */ + { 0x000007a4, 13729 }, /* Greek_IOTAaccent */ + { 0x000007b4, 13746 }, /* Greek_iotaaccent */ + { 0x000007b6, 13763 }, /* Greek_iotaaccentdieresis */ + { 0x000007a5, 13788 }, /* Greek_IOTAdiaeresis */ + { 0x000007a5, 13808 }, /* Greek_IOTAdieresis */ + { 0x000007b5, 13827 }, /* Greek_iotadieresis */ + { 0x000007ca, 13846 }, /* Greek_KAPPA */ + { 0x000007ea, 13858 }, /* Greek_kappa */ + { 0x000007cb, 13870 }, /* Greek_LAMBDA */ + { 0x000007eb, 13883 }, /* Greek_lambda */ + { 0x000007cb, 13896 }, /* Greek_LAMDA */ + { 0x000007eb, 13908 }, /* Greek_lamda */ + { 0x000007cc, 13920 }, /* Greek_MU */ + { 0x000007ec, 13929 }, /* Greek_mu */ + { 0x000007cd, 13938 }, /* Greek_NU */ + { 0x000007ed, 13947 }, /* Greek_nu */ + { 0x000007d9, 13956 }, /* Greek_OMEGA */ + { 0x000007f9, 13968 }, /* Greek_omega */ + { 0x000007ab, 13980 }, /* Greek_OMEGAaccent */ + { 0x000007bb, 13998 }, /* Greek_omegaaccent */ + { 0x000007cf, 14016 }, /* Greek_OMICRON */ + { 0x000007ef, 14030 }, /* Greek_omicron */ + { 0x000007a7, 14044 }, /* Greek_OMICRONaccent */ + { 0x000007b7, 14064 }, /* Greek_omicronaccent */ + { 0x000007d6, 14084 }, /* Greek_PHI */ + { 0x000007f6, 14094 }, /* Greek_phi */ + { 0x000007d0, 14104 }, /* Greek_PI */ + { 0x000007f0, 14113 }, /* Greek_pi */ + { 0x000007d8, 14122 }, /* Greek_PSI */ + { 0x000007f8, 14132 }, /* Greek_psi */ + { 0x000007d1, 14142 }, /* Greek_RHO */ + { 0x000007f1, 14152 }, /* Greek_rho */ + { 0x000007d2, 14162 }, /* Greek_SIGMA */ + { 0x000007f2, 14174 }, /* Greek_sigma */ + { 0x0000ff7e, 14186 }, /* Greek_switch */ + { 0x000007d4, 14199 }, /* Greek_TAU */ + { 0x000007f4, 14209 }, /* Greek_tau */ + { 0x000007c8, 14219 }, /* Greek_THETA */ + { 0x000007e8, 14231 }, /* Greek_theta */ + { 0x000007d5, 14243 }, /* Greek_UPSILON */ + { 0x000007f5, 14257 }, /* Greek_upsilon */ + { 0x000007a8, 14271 }, /* Greek_UPSILONaccent */ + { 0x000007b8, 14291 }, /* Greek_upsilonaccent */ + { 0x000007ba, 14311 }, /* Greek_upsilonaccentdieresis */ + { 0x000007a9, 14339 }, /* Greek_UPSILONdieresis */ + { 0x000007b9, 14361 }, /* Greek_upsilondieresis */ + { 0x000007ce, 14383 }, /* Greek_XI */ + { 0x000007ee, 14392 }, /* Greek_xi */ + { 0x000007c6, 14401 }, /* Greek_ZETA */ + { 0x000007e6, 14412 }, /* Greek_zeta */ + { 0x100000be, 14423 }, /* guilder */ + { 0x000000ab, 14431 }, /* guillemotleft */ + { 0x000000bb, 14445 }, /* guillemotright */ + { 0x00000048, 14460 }, /* H */ + { 0x00000068, 14462 }, /* h */ + { 0x00000aa8, 14464 }, /* hairspace */ + { 0x0000ff31, 14474 }, /* Hangul */ + { 0x00000ebf, 14481 }, /* Hangul_A */ + { 0x00000ec0, 14490 }, /* Hangul_AE */ + { 0x00000ef6, 14500 }, /* Hangul_AraeA */ + { 0x00000ef7, 14513 }, /* Hangul_AraeAE */ + { 0x0000ff39, 14527 }, /* Hangul_Banja */ + { 0x00000eba, 14540 }, /* Hangul_Cieuc */ + { 0x0000ff37, 14553 }, /* Hangul_Codeinput */ + { 0x00000ea7, 14570 }, /* Hangul_Dikeud */ + { 0x00000ec4, 14584 }, /* Hangul_E */ + { 0x0000ff33, 14593 }, /* Hangul_End */ + { 0x00000ec3, 14604 }, /* Hangul_EO */ + { 0x00000ed1, 14614 }, /* Hangul_EU */ + { 0x0000ff34, 14624 }, /* Hangul_Hanja */ + { 0x00000ebe, 14637 }, /* Hangul_Hieuh */ + { 0x00000ed3, 14650 }, /* Hangul_I */ + { 0x00000eb7, 14659 }, /* Hangul_Ieung */ + { 0x00000eea, 14672 }, /* Hangul_J_Cieuc */ + { 0x00000eda, 14687 }, /* Hangul_J_Dikeud */ + { 0x00000eee, 14703 }, /* Hangul_J_Hieuh */ + { 0x00000ee8, 14718 }, /* Hangul_J_Ieung */ + { 0x00000ee9, 14733 }, /* Hangul_J_Jieuj */ + { 0x00000eeb, 14748 }, /* Hangul_J_Khieuq */ + { 0x00000ed4, 14764 }, /* Hangul_J_Kiyeog */ + { 0x00000ed6, 14780 }, /* Hangul_J_KiyeogSios */ + { 0x00000ef9, 14800 }, /* Hangul_J_KkogjiDalrinIeung */ + { 0x00000ee3, 14827 }, /* Hangul_J_Mieum */ + { 0x00000ed7, 14842 }, /* Hangul_J_Nieun */ + { 0x00000ed9, 14857 }, /* Hangul_J_NieunHieuh */ + { 0x00000ed8, 14877 }, /* Hangul_J_NieunJieuj */ + { 0x00000ef8, 14897 }, /* Hangul_J_PanSios */ + { 0x00000eed, 14914 }, /* Hangul_J_Phieuf */ + { 0x00000ee4, 14930 }, /* Hangul_J_Pieub */ + { 0x00000ee5, 14945 }, /* Hangul_J_PieubSios */ + { 0x00000edb, 14964 }, /* Hangul_J_Rieul */ + { 0x00000ee2, 14979 }, /* Hangul_J_RieulHieuh */ + { 0x00000edc, 14999 }, /* Hangul_J_RieulKiyeog */ + { 0x00000edd, 15020 }, /* Hangul_J_RieulMieum */ + { 0x00000ee1, 15040 }, /* Hangul_J_RieulPhieuf */ + { 0x00000ede, 15061 }, /* Hangul_J_RieulPieub */ + { 0x00000edf, 15081 }, /* Hangul_J_RieulSios */ + { 0x00000ee0, 15100 }, /* Hangul_J_RieulTieut */ + { 0x00000ee6, 15120 }, /* Hangul_J_Sios */ + { 0x00000ed5, 15134 }, /* Hangul_J_SsangKiyeog */ + { 0x00000ee7, 15155 }, /* Hangul_J_SsangSios */ + { 0x00000eec, 15174 }, /* Hangul_J_Tieut */ + { 0x00000efa, 15189 }, /* Hangul_J_YeorinHieuh */ + { 0x0000ff35, 15210 }, /* Hangul_Jamo */ + { 0x0000ff38, 15222 }, /* Hangul_Jeonja */ + { 0x00000eb8, 15236 }, /* Hangul_Jieuj */ + { 0x00000ebb, 15249 }, /* Hangul_Khieuq */ + { 0x00000ea1, 15263 }, /* Hangul_Kiyeog */ + { 0x00000ea3, 15277 }, /* Hangul_KiyeogSios */ + { 0x00000ef3, 15295 }, /* Hangul_KkogjiDalrinIeung */ + { 0x00000eb1, 15320 }, /* Hangul_Mieum */ + { 0x0000ff3d, 15333 }, /* Hangul_MultipleCandidate */ + { 0x00000ea4, 15358 }, /* Hangul_Nieun */ + { 0x00000ea6, 15371 }, /* Hangul_NieunHieuh */ + { 0x00000ea5, 15389 }, /* Hangul_NieunJieuj */ + { 0x00000ec7, 15407 }, /* Hangul_O */ + { 0x00000eca, 15416 }, /* Hangul_OE */ + { 0x00000ef2, 15426 }, /* Hangul_PanSios */ + { 0x00000ebd, 15441 }, /* Hangul_Phieuf */ + { 0x00000eb2, 15455 }, /* Hangul_Pieub */ + { 0x00000eb4, 15468 }, /* Hangul_PieubSios */ + { 0x0000ff3b, 15485 }, /* Hangul_PostHanja */ + { 0x0000ff3a, 15502 }, /* Hangul_PreHanja */ + { 0x0000ff3e, 15518 }, /* Hangul_PreviousCandidate */ + { 0x00000ea9, 15543 }, /* Hangul_Rieul */ + { 0x00000eb0, 15556 }, /* Hangul_RieulHieuh */ + { 0x00000eaa, 15574 }, /* Hangul_RieulKiyeog */ + { 0x00000eab, 15593 }, /* Hangul_RieulMieum */ + { 0x00000eaf, 15611 }, /* Hangul_RieulPhieuf */ + { 0x00000eac, 15630 }, /* Hangul_RieulPieub */ + { 0x00000ead, 15648 }, /* Hangul_RieulSios */ + { 0x00000eae, 15665 }, /* Hangul_RieulTieut */ + { 0x00000eef, 15683 }, /* Hangul_RieulYeorinHieuh */ + { 0x0000ff36, 15707 }, /* Hangul_Romaja */ + { 0x0000ff3c, 15721 }, /* Hangul_SingleCandidate */ + { 0x00000eb5, 15744 }, /* Hangul_Sios */ + { 0x0000ff3f, 15756 }, /* Hangul_Special */ + { 0x00000ea8, 15771 }, /* Hangul_SsangDikeud */ + { 0x00000eb9, 15790 }, /* Hangul_SsangJieuj */ + { 0x00000ea2, 15808 }, /* Hangul_SsangKiyeog */ + { 0x00000eb3, 15827 }, /* Hangul_SsangPieub */ + { 0x00000eb6, 15845 }, /* Hangul_SsangSios */ + { 0x0000ff32, 15862 }, /* Hangul_Start */ + { 0x00000ef0, 15875 }, /* Hangul_SunkyeongeumMieum */ + { 0x00000ef4, 15900 }, /* Hangul_SunkyeongeumPhieuf */ + { 0x00000ef1, 15926 }, /* Hangul_SunkyeongeumPieub */ + { 0x0000ff7e, 15951 }, /* Hangul_switch */ + { 0x00000ebc, 15965 }, /* Hangul_Tieut */ + { 0x00000ecc, 15978 }, /* Hangul_U */ + { 0x00000ec8, 15987 }, /* Hangul_WA */ + { 0x00000ec9, 15997 }, /* Hangul_WAE */ + { 0x00000ece, 16008 }, /* Hangul_WE */ + { 0x00000ecd, 16018 }, /* Hangul_WEO */ + { 0x00000ecf, 16029 }, /* Hangul_WI */ + { 0x00000ec1, 16039 }, /* Hangul_YA */ + { 0x00000ec2, 16049 }, /* Hangul_YAE */ + { 0x00000ec6, 16060 }, /* Hangul_YE */ + { 0x00000ec5, 16070 }, /* Hangul_YEO */ + { 0x00000ef5, 16081 }, /* Hangul_YeorinHieuh */ + { 0x00000ed2, 16100 }, /* Hangul_YI */ + { 0x00000ecb, 16110 }, /* Hangul_YO */ + { 0x00000ed0, 16120 }, /* Hangul_YU */ + { 0x0000ff29, 16130 }, /* Hankaku */ + { 0x000002a6, 16138 }, /* Hcircumflex */ + { 0x000002b6, 16150 }, /* hcircumflex */ + { 0x00000aee, 16162 }, /* heart */ + { 0x00000ce0, 16168 }, /* hebrew_aleph */ + { 0x00000cf2, 16181 }, /* hebrew_ayin */ + { 0x00000ce1, 16193 }, /* hebrew_bet */ + { 0x00000ce1, 16204 }, /* hebrew_beth */ + { 0x00000ce7, 16216 }, /* hebrew_chet */ + { 0x00000ce3, 16228 }, /* hebrew_dalet */ + { 0x00000ce3, 16241 }, /* hebrew_daleth */ + { 0x00000cdf, 16255 }, /* hebrew_doublelowline */ + { 0x00000cea, 16276 }, /* hebrew_finalkaph */ + { 0x00000ced, 16293 }, /* hebrew_finalmem */ + { 0x00000cef, 16309 }, /* hebrew_finalnun */ + { 0x00000cf3, 16325 }, /* hebrew_finalpe */ + { 0x00000cf5, 16340 }, /* hebrew_finalzade */ + { 0x00000cf5, 16357 }, /* hebrew_finalzadi */ + { 0x00000ce2, 16374 }, /* hebrew_gimel */ + { 0x00000ce2, 16387 }, /* hebrew_gimmel */ + { 0x00000ce4, 16401 }, /* hebrew_he */ + { 0x00000ce7, 16411 }, /* hebrew_het */ + { 0x00000ceb, 16422 }, /* hebrew_kaph */ + { 0x00000cf7, 16434 }, /* hebrew_kuf */ + { 0x00000cec, 16445 }, /* hebrew_lamed */ + { 0x00000cee, 16458 }, /* hebrew_mem */ + { 0x00000cf0, 16469 }, /* hebrew_nun */ + { 0x00000cf4, 16480 }, /* hebrew_pe */ + { 0x00000cf7, 16490 }, /* hebrew_qoph */ + { 0x00000cf8, 16502 }, /* hebrew_resh */ + { 0x00000cf1, 16514 }, /* hebrew_samech */ + { 0x00000cf1, 16528 }, /* hebrew_samekh */ + { 0x00000cf9, 16542 }, /* hebrew_shin */ + { 0x0000ff7e, 16554 }, /* Hebrew_switch */ + { 0x00000cfa, 16568 }, /* hebrew_taf */ + { 0x00000cfa, 16579 }, /* hebrew_taw */ + { 0x00000ce8, 16590 }, /* hebrew_tet */ + { 0x00000ce8, 16601 }, /* hebrew_teth */ + { 0x00000ce5, 16613 }, /* hebrew_waw */ + { 0x00000ce9, 16624 }, /* hebrew_yod */ + { 0x00000cf6, 16635 }, /* hebrew_zade */ + { 0x00000cf6, 16647 }, /* hebrew_zadi */ + { 0x00000ce6, 16659 }, /* hebrew_zain */ + { 0x00000ce6, 16671 }, /* hebrew_zayin */ + { 0x0000ff6a, 16684 }, /* Help */ + { 0x0000ff23, 16689 }, /* Henkan */ + { 0x0000ff23, 16696 }, /* Henkan_Mode */ + { 0x00000ada, 16708 }, /* hexagram */ + { 0x0000ff25, 16717 }, /* Hiragana */ + { 0x0000ff27, 16726 }, /* Hiragana_Katakana */ + { 0x0000ff50, 16744 }, /* Home */ + { 0x000008a3, 16749 }, /* horizconnector */ + { 0x000009ef, 16764 }, /* horizlinescan1 */ + { 0x000009f0, 16779 }, /* horizlinescan3 */ + { 0x000009f1, 16794 }, /* horizlinescan5 */ + { 0x000009f2, 16809 }, /* horizlinescan7 */ + { 0x000009f3, 16824 }, /* horizlinescan9 */ + { 0x1000ff74, 16839 }, /* hpBackTab */ + { 0x100000fc, 16849 }, /* hpblock */ + { 0x1000ff6f, 16857 }, /* hpClearLine */ + { 0x1000ff73, 16869 }, /* hpDeleteChar */ + { 0x1000ff71, 16882 }, /* hpDeleteLine */ + { 0x100000be, 16895 }, /* hpguilder */ + { 0x1000ff72, 16905 }, /* hpInsertChar */ + { 0x1000ff70, 16918 }, /* hpInsertLine */ + { 0x100000ee, 16931 }, /* hpIO */ + { 0x1000ff75, 16936 }, /* hpKP_BackTab */ + { 0x100000af, 16949 }, /* hplira */ + { 0x100000f6, 16956 }, /* hplongminus */ + { 0x1000ff48, 16968 }, /* hpModelock1 */ + { 0x1000ff49, 16980 }, /* hpModelock2 */ + { 0x100000a8, 16992 }, /* hpmute_acute */ + { 0x100000aa, 17005 }, /* hpmute_asciicircum */ + { 0x100000ac, 17024 }, /* hpmute_asciitilde */ + { 0x100000ab, 17042 }, /* hpmute_diaeresis */ + { 0x100000a9, 17059 }, /* hpmute_grave */ + { 0x1000ff6c, 17072 }, /* hpReset */ + { 0x1000ff6d, 17080 }, /* hpSystem */ + { 0x1000ff6e, 17089 }, /* hpUser */ + { 0x100000ee, 17096 }, /* hpYdiaeresis */ + { 0x000002a1, 17109 }, /* Hstroke */ + { 0x000002b1, 17117 }, /* hstroke */ + { 0x000009e2, 17125 }, /* ht */ + { 0x0000ffed, 17128 }, /* Hyper_L */ + { 0x0000ffee, 17136 }, /* Hyper_R */ + { 0x000000ad, 17144 }, /* hyphen */ + { 0x00000049, 17151 }, /* I */ + { 0x00000069, 17153 }, /* i */ + { 0x000002a9, 17155 }, /* Iabovedot */ + { 0x000000cd, 17165 }, /* Iacute */ + { 0x000000ed, 17172 }, /* iacute */ + { 0x01001eca, 17179 }, /* Ibelowdot */ + { 0x01001ecb, 17189 }, /* ibelowdot */ + { 0x0100012c, 17199 }, /* Ibreve */ + { 0x0100012d, 17206 }, /* ibreve */ + { 0x000000ce, 17213 }, /* Icircumflex */ + { 0x000000ee, 17225 }, /* icircumflex */ + { 0x000008cf, 17237 }, /* identical */ + { 0x000000cf, 17247 }, /* Idiaeresis */ + { 0x000000ef, 17258 }, /* idiaeresis */ + { 0x000002b9, 17269 }, /* idotless */ + { 0x000008cd, 17278 }, /* ifonlyif */ + { 0x000000cc, 17287 }, /* Igrave */ + { 0x000000ec, 17294 }, /* igrave */ + { 0x01001ec8, 17301 }, /* Ihook */ + { 0x01001ec9, 17307 }, /* ihook */ + { 0x000003cf, 17313 }, /* Imacron */ + { 0x000003ef, 17321 }, /* imacron */ + { 0x000008ce, 17329 }, /* implies */ + { 0x000008da, 17337 }, /* includedin */ + { 0x000008db, 17348 }, /* includes */ + { 0x000008c2, 17357 }, /* infinity */ + { 0x0000ff63, 17366 }, /* Insert */ + { 0x1000ff72, 17373 }, /* InsertChar */ + { 0x1000ff70, 17384 }, /* InsertLine */ + { 0x000008bf, 17395 }, /* integral */ + { 0x000008dc, 17404 }, /* intersection */ + { 0x100000ee, 17417 }, /* IO */ + { 0x000003c7, 17420 }, /* Iogonek */ + { 0x000003e7, 17428 }, /* iogonek */ + { 0x0000fe33, 17436 }, /* ISO_Center_Object */ + { 0x0000fe30, 17454 }, /* ISO_Continuous_Underline */ + { 0x0000fe31, 17479 }, /* ISO_Discontinuous_Underline */ + { 0x0000fe32, 17507 }, /* ISO_Emphasize */ + { 0x0000fe34, 17521 }, /* ISO_Enter */ + { 0x0000fe2f, 17531 }, /* ISO_Fast_Cursor_Down */ + { 0x0000fe2c, 17552 }, /* ISO_Fast_Cursor_Left */ + { 0x0000fe2d, 17573 }, /* ISO_Fast_Cursor_Right */ + { 0x0000fe2e, 17595 }, /* ISO_Fast_Cursor_Up */ + { 0x0000fe0c, 17614 }, /* ISO_First_Group */ + { 0x0000fe0d, 17630 }, /* ISO_First_Group_Lock */ + { 0x0000fe06, 17651 }, /* ISO_Group_Latch */ + { 0x0000fe07, 17667 }, /* ISO_Group_Lock */ + { 0x0000ff7e, 17682 }, /* ISO_Group_Shift */ + { 0x0000fe0e, 17698 }, /* ISO_Last_Group */ + { 0x0000fe0f, 17713 }, /* ISO_Last_Group_Lock */ + { 0x0000fe20, 17733 }, /* ISO_Left_Tab */ + { 0x0000fe02, 17746 }, /* ISO_Level2_Latch */ + { 0x0000fe04, 17763 }, /* ISO_Level3_Latch */ + { 0x0000fe05, 17780 }, /* ISO_Level3_Lock */ + { 0x0000fe03, 17796 }, /* ISO_Level3_Shift */ + { 0x0000fe12, 17813 }, /* ISO_Level5_Latch */ + { 0x0000fe13, 17830 }, /* ISO_Level5_Lock */ + { 0x0000fe11, 17846 }, /* ISO_Level5_Shift */ + { 0x0000fe01, 17863 }, /* ISO_Lock */ + { 0x0000fe22, 17872 }, /* ISO_Move_Line_Down */ + { 0x0000fe21, 17891 }, /* ISO_Move_Line_Up */ + { 0x0000fe08, 17908 }, /* ISO_Next_Group */ + { 0x0000fe09, 17923 }, /* ISO_Next_Group_Lock */ + { 0x0000fe24, 17943 }, /* ISO_Partial_Line_Down */ + { 0x0000fe23, 17965 }, /* ISO_Partial_Line_Up */ + { 0x0000fe25, 17985 }, /* ISO_Partial_Space_Left */ + { 0x0000fe26, 18008 }, /* ISO_Partial_Space_Right */ + { 0x0000fe0a, 18032 }, /* ISO_Prev_Group */ + { 0x0000fe0b, 18047 }, /* ISO_Prev_Group_Lock */ + { 0x0000fe2b, 18067 }, /* ISO_Release_Both_Margins */ + { 0x0000fe29, 18092 }, /* ISO_Release_Margin_Left */ + { 0x0000fe2a, 18116 }, /* ISO_Release_Margin_Right */ + { 0x0000fe27, 18141 }, /* ISO_Set_Margin_Left */ + { 0x0000fe28, 18161 }, /* ISO_Set_Margin_Right */ + { 0x000003a5, 18182 }, /* Itilde */ + { 0x000003b5, 18189 }, /* itilde */ + { 0x0000004a, 18196 }, /* J */ + { 0x0000006a, 18198 }, /* j */ + { 0x000002ac, 18200 }, /* Jcircumflex */ + { 0x000002bc, 18212 }, /* jcircumflex */ + { 0x00000bca, 18224 }, /* jot */ + { 0x0000004b, 18228 }, /* K */ + { 0x0000006b, 18230 }, /* k */ + { 0x000004a7, 18232 }, /* kana_a */ + { 0x000004b1, 18239 }, /* kana_A */ + { 0x000004c1, 18246 }, /* kana_CHI */ + { 0x000004a3, 18255 }, /* kana_closingbracket */ + { 0x000004a4, 18275 }, /* kana_comma */ + { 0x000004a5, 18286 }, /* kana_conjunctive */ + { 0x000004aa, 18303 }, /* kana_e */ + { 0x000004b4, 18310 }, /* kana_E */ + { 0x000004cc, 18317 }, /* kana_FU */ + { 0x000004a1, 18325 }, /* kana_fullstop */ + { 0x000004ca, 18339 }, /* kana_HA */ + { 0x000004cd, 18347 }, /* kana_HE */ + { 0x000004cb, 18355 }, /* kana_HI */ + { 0x000004ce, 18363 }, /* kana_HO */ + { 0x000004cc, 18371 }, /* kana_HU */ + { 0x000004a8, 18379 }, /* kana_i */ + { 0x000004b2, 18386 }, /* kana_I */ + { 0x000004b6, 18393 }, /* kana_KA */ + { 0x000004b9, 18401 }, /* kana_KE */ + { 0x000004b7, 18409 }, /* kana_KI */ + { 0x000004ba, 18417 }, /* kana_KO */ + { 0x000004b8, 18425 }, /* kana_KU */ + { 0x0000ff2d, 18433 }, /* Kana_Lock */ + { 0x000004cf, 18443 }, /* kana_MA */ + { 0x000004d2, 18451 }, /* kana_ME */ + { 0x000004d0, 18459 }, /* kana_MI */ + { 0x000004a5, 18467 }, /* kana_middledot */ + { 0x000004d3, 18482 }, /* kana_MO */ + { 0x000004d1, 18490 }, /* kana_MU */ + { 0x000004dd, 18498 }, /* kana_N */ + { 0x000004c5, 18505 }, /* kana_NA */ + { 0x000004c8, 18513 }, /* kana_NE */ + { 0x000004c6, 18521 }, /* kana_NI */ + { 0x000004c9, 18529 }, /* kana_NO */ + { 0x000004c7, 18537 }, /* kana_NU */ + { 0x000004ab, 18545 }, /* kana_o */ + { 0x000004b5, 18552 }, /* kana_O */ + { 0x000004a2, 18559 }, /* kana_openingbracket */ + { 0x000004d7, 18579 }, /* kana_RA */ + { 0x000004da, 18587 }, /* kana_RE */ + { 0x000004d8, 18595 }, /* kana_RI */ + { 0x000004db, 18603 }, /* kana_RO */ + { 0x000004d9, 18611 }, /* kana_RU */ + { 0x000004bb, 18619 }, /* kana_SA */ + { 0x000004be, 18627 }, /* kana_SE */ + { 0x000004bc, 18635 }, /* kana_SHI */ + { 0x0000ff2e, 18644 }, /* Kana_Shift */ + { 0x000004bf, 18655 }, /* kana_SO */ + { 0x000004bd, 18663 }, /* kana_SU */ + { 0x0000ff7e, 18671 }, /* kana_switch */ + { 0x000004c0, 18683 }, /* kana_TA */ + { 0x000004c3, 18691 }, /* kana_TE */ + { 0x000004c1, 18699 }, /* kana_TI */ + { 0x000004c4, 18707 }, /* kana_TO */ + { 0x000004af, 18715 }, /* kana_tsu */ + { 0x000004c2, 18724 }, /* kana_TSU */ + { 0x000004af, 18733 }, /* kana_tu */ + { 0x000004c2, 18741 }, /* kana_TU */ + { 0x000004a9, 18749 }, /* kana_u */ + { 0x000004b3, 18756 }, /* kana_U */ + { 0x000004dc, 18763 }, /* kana_WA */ + { 0x000004a6, 18771 }, /* kana_WO */ + { 0x000004ac, 18779 }, /* kana_ya */ + { 0x000004d4, 18787 }, /* kana_YA */ + { 0x000004ae, 18795 }, /* kana_yo */ + { 0x000004d6, 18803 }, /* kana_YO */ + { 0x000004ad, 18811 }, /* kana_yu */ + { 0x000004d5, 18819 }, /* kana_YU */ + { 0x0000ff21, 18827 }, /* Kanji */ + { 0x0000ff37, 18833 }, /* Kanji_Bangou */ + { 0x000003a2, 18846 }, /* kappa */ + { 0x0000ff26, 18852 }, /* Katakana */ + { 0x000003d3, 18861 }, /* Kcedilla */ + { 0x000003f3, 18870 }, /* kcedilla */ + { 0x00000eff, 18879 }, /* Korean_Won */ + { 0x0000ffb0, 18890 }, /* KP_0 */ + { 0x0000ffb1, 18895 }, /* KP_1 */ + { 0x0000ffb2, 18900 }, /* KP_2 */ + { 0x0000ffb3, 18905 }, /* KP_3 */ + { 0x0000ffb4, 18910 }, /* KP_4 */ + { 0x0000ffb5, 18915 }, /* KP_5 */ + { 0x0000ffb6, 18920 }, /* KP_6 */ + { 0x0000ffb7, 18925 }, /* KP_7 */ + { 0x0000ffb8, 18930 }, /* KP_8 */ + { 0x0000ffb9, 18935 }, /* KP_9 */ + { 0x0000ffab, 18940 }, /* KP_Add */ + { 0x1000ff75, 18947 }, /* KP_BackTab */ + { 0x0000ff9d, 18958 }, /* KP_Begin */ + { 0x0000ffae, 18967 }, /* KP_Decimal */ + { 0x0000ff9f, 18978 }, /* KP_Delete */ + { 0x0000ffaf, 18988 }, /* KP_Divide */ + { 0x0000ff99, 18998 }, /* KP_Down */ + { 0x0000ff9c, 19006 }, /* KP_End */ + { 0x0000ff8d, 19013 }, /* KP_Enter */ + { 0x0000ffbd, 19022 }, /* KP_Equal */ + { 0x0000ff91, 19031 }, /* KP_F1 */ + { 0x0000ff92, 19037 }, /* KP_F2 */ + { 0x0000ff93, 19043 }, /* KP_F3 */ + { 0x0000ff94, 19049 }, /* KP_F4 */ + { 0x0000ff95, 19055 }, /* KP_Home */ + { 0x0000ff9e, 19063 }, /* KP_Insert */ + { 0x0000ff96, 19073 }, /* KP_Left */ + { 0x0000ffaa, 19081 }, /* KP_Multiply */ + { 0x0000ff9b, 19093 }, /* KP_Next */ + { 0x0000ff9b, 19101 }, /* KP_Page_Down */ + { 0x0000ff9a, 19114 }, /* KP_Page_Up */ + { 0x0000ff9a, 19125 }, /* KP_Prior */ + { 0x0000ff98, 19134 }, /* KP_Right */ + { 0x0000ffac, 19143 }, /* KP_Separator */ + { 0x0000ff80, 19156 }, /* KP_Space */ + { 0x0000ffad, 19165 }, /* KP_Subtract */ + { 0x0000ff89, 19177 }, /* KP_Tab */ + { 0x0000ff97, 19184 }, /* KP_Up */ + { 0x000003a2, 19190 }, /* kra */ + { 0x0000004c, 19194 }, /* L */ + { 0x0000006c, 19196 }, /* l */ + { 0x0000ffc8, 19198 }, /* L1 */ + { 0x0000ffd1, 19201 }, /* L10 */ + { 0x0000ffc9, 19205 }, /* L2 */ + { 0x0000ffca, 19208 }, /* L3 */ + { 0x0000ffcb, 19211 }, /* L4 */ + { 0x0000ffcc, 19214 }, /* L5 */ + { 0x0000ffcd, 19217 }, /* L6 */ + { 0x0000ffce, 19220 }, /* L7 */ + { 0x0000ffcf, 19223 }, /* L8 */ + { 0x0000ffd0, 19226 }, /* L9 */ + { 0x000001c5, 19229 }, /* Lacute */ + { 0x000001e5, 19236 }, /* lacute */ + { 0x0000fed4, 19243 }, /* Last_Virtual_Screen */ + { 0x00000ad9, 19263 }, /* latincross */ + { 0x01001e36, 19274 }, /* Lbelowdot */ + { 0x01001e37, 19284 }, /* lbelowdot */ + { 0x000001a5, 19294 }, /* Lcaron */ + { 0x000001b5, 19301 }, /* lcaron */ + { 0x000003a6, 19308 }, /* Lcedilla */ + { 0x000003b6, 19317 }, /* lcedilla */ + { 0x0000ff51, 19326 }, /* Left */ + { 0x00000abc, 19331 }, /* leftanglebracket */ + { 0x000008fb, 19348 }, /* leftarrow */ + { 0x00000ba3, 19358 }, /* leftcaret */ + { 0x00000ad2, 19368 }, /* leftdoublequotemark */ + { 0x000008af, 19388 }, /* leftmiddlecurlybrace */ + { 0x00000acc, 19409 }, /* leftopentriangle */ + { 0x00000aea, 19426 }, /* leftpointer */ + { 0x000008a1, 19438 }, /* leftradical */ + { 0x00000bda, 19450 }, /* leftshoe */ + { 0x00000ad0, 19459 }, /* leftsinglequotemark */ + { 0x000009f4, 19479 }, /* leftt */ + { 0x00000bdc, 19485 }, /* lefttack */ + { 0x0000003c, 19494 }, /* less */ + { 0x000008bc, 19499 }, /* lessthanequal */ + { 0x000009e5, 19513 }, /* lf */ + { 0x0000ff0a, 19516 }, /* Linefeed */ + { 0x100000af, 19525 }, /* lira */ + { 0x010020a4, 19530 }, /* LiraSign */ + { 0x000008de, 19539 }, /* logicaland */ + { 0x000008df, 19550 }, /* logicalor */ + { 0x100000f6, 19560 }, /* longminus */ + { 0x000009ed, 19570 }, /* lowleftcorner */ + { 0x000009ea, 19584 }, /* lowrightcorner */ + { 0x000001a3, 19599 }, /* Lstroke */ + { 0x000001b3, 19607 }, /* lstroke */ + { 0x0000004d, 19615 }, /* M */ + { 0x0000006d, 19617 }, /* m */ + { 0x01001e40, 19619 }, /* Mabovedot */ + { 0x01001e41, 19629 }, /* mabovedot */ + { 0x000006a5, 19639 }, /* Macedonia_dse */ + { 0x000006b5, 19653 }, /* Macedonia_DSE */ + { 0x000006a2, 19667 }, /* Macedonia_gje */ + { 0x000006b2, 19681 }, /* Macedonia_GJE */ + { 0x000006ac, 19695 }, /* Macedonia_kje */ + { 0x000006bc, 19709 }, /* Macedonia_KJE */ + { 0x000000af, 19723 }, /* macron */ + { 0x0000ff3e, 19730 }, /* Mae_Koho */ + { 0x00000af7, 19739 }, /* malesymbol */ + { 0x00000af0, 19750 }, /* maltesecross */ + { 0x00000abf, 19763 }, /* marker */ + { 0x000000ba, 19770 }, /* masculine */ + { 0x0000ff2c, 19780 }, /* Massyo */ + { 0x0000ff67, 19787 }, /* Menu */ + { 0x0000ffe7, 19792 }, /* Meta_L */ + { 0x0000ffe8, 19799 }, /* Meta_R */ + { 0x010020a5, 19806 }, /* MillSign */ + { 0x0000002d, 19815 }, /* minus */ + { 0x00000ad6, 19821 }, /* minutes */ + { 0x0000ff7e, 19829 }, /* Mode_switch */ + { 0x0000fe77, 19841 }, /* MouseKeys_Accel_Enable */ + { 0x0000fe76, 19864 }, /* MouseKeys_Enable */ + { 0x000000b5, 19881 }, /* mu */ + { 0x0000ff22, 19884 }, /* Muhenkan */ + { 0x0000ff20, 19893 }, /* Multi_key */ + { 0x0000ff3d, 19903 }, /* MultipleCandidate */ + { 0x000000d7, 19921 }, /* multiply */ + { 0x00000af6, 19930 }, /* musicalflat */ + { 0x00000af5, 19942 }, /* musicalsharp */ + { 0x100000a8, 19955 }, /* mute_acute */ + { 0x100000aa, 19966 }, /* mute_asciicircum */ + { 0x100000ac, 19983 }, /* mute_asciitilde */ + { 0x100000ab, 19999 }, /* mute_diaeresis */ + { 0x100000a9, 20014 }, /* mute_grave */ + { 0x0000004e, 20025 }, /* N */ + { 0x0000006e, 20027 }, /* n */ + { 0x000008c5, 20029 }, /* nabla */ + { 0x000001d1, 20035 }, /* Nacute */ + { 0x000001f1, 20042 }, /* nacute */ + { 0x010020a6, 20049 }, /* NairaSign */ + { 0x000001d2, 20059 }, /* Ncaron */ + { 0x000001f2, 20066 }, /* ncaron */ + { 0x000003d1, 20073 }, /* Ncedilla */ + { 0x000003f1, 20082 }, /* ncedilla */ + { 0x010020aa, 20091 }, /* NewSheqelSign */ + { 0x0000ff56, 20105 }, /* Next */ + { 0x0000fed2, 20110 }, /* Next_Virtual_Screen */ + { 0x01002089, 20130 }, /* ninesubscript */ + { 0x01002079, 20144 }, /* ninesuperior */ + { 0x000009e8, 20157 }, /* nl */ + { 0x000000a0, 20160 }, /* nobreakspace */ + { 0x00000000, 20173 }, /* NoSymbol */ + { 0x01002247, 20182 }, /* notapproxeq */ + { 0x01002209, 20194 }, /* notelementof */ + { 0x000008bd, 20207 }, /* notequal */ + { 0x01002262, 20216 }, /* notidentical */ + { 0x000000ac, 20229 }, /* notsign */ + { 0x000000d1, 20237 }, /* Ntilde */ + { 0x000000f1, 20244 }, /* ntilde */ + { 0x0000ff7f, 20251 }, /* Num_Lock */ + { 0x00000023, 20260 }, /* numbersign */ + { 0x000006b0, 20271 }, /* numerosign */ + { 0x0000004f, 20282 }, /* O */ + { 0x0000006f, 20284 }, /* o */ + { 0x000000d3, 20286 }, /* Oacute */ + { 0x000000f3, 20293 }, /* oacute */ + { 0x0100019f, 20300 }, /* Obarred */ + { 0x01000275, 20308 }, /* obarred */ + { 0x01001ecc, 20316 }, /* Obelowdot */ + { 0x01001ecd, 20326 }, /* obelowdot */ + { 0x010001d1, 20336 }, /* Ocaron */ + { 0x010001d2, 20343 }, /* ocaron */ + { 0x000000d4, 20350 }, /* Ocircumflex */ + { 0x000000f4, 20362 }, /* ocircumflex */ + { 0x01001ed0, 20374 }, /* Ocircumflexacute */ + { 0x01001ed1, 20391 }, /* ocircumflexacute */ + { 0x01001ed8, 20408 }, /* Ocircumflexbelowdot */ + { 0x01001ed9, 20428 }, /* ocircumflexbelowdot */ + { 0x01001ed2, 20448 }, /* Ocircumflexgrave */ + { 0x01001ed3, 20465 }, /* ocircumflexgrave */ + { 0x01001ed4, 20482 }, /* Ocircumflexhook */ + { 0x01001ed5, 20498 }, /* ocircumflexhook */ + { 0x01001ed6, 20514 }, /* Ocircumflextilde */ + { 0x01001ed7, 20531 }, /* ocircumflextilde */ + { 0x000000d6, 20548 }, /* Odiaeresis */ + { 0x000000f6, 20559 }, /* odiaeresis */ + { 0x000001d5, 20570 }, /* Odoubleacute */ + { 0x000001f5, 20583 }, /* odoubleacute */ + { 0x000013bc, 20596 }, /* OE */ + { 0x000013bd, 20599 }, /* oe */ + { 0x000001b2, 20602 }, /* ogonek */ + { 0x000000d2, 20609 }, /* Ograve */ + { 0x000000f2, 20616 }, /* ograve */ + { 0x01001ece, 20623 }, /* Ohook */ + { 0x01001ecf, 20629 }, /* ohook */ + { 0x010001a0, 20635 }, /* Ohorn */ + { 0x010001a1, 20641 }, /* ohorn */ + { 0x01001eda, 20647 }, /* Ohornacute */ + { 0x01001edb, 20658 }, /* ohornacute */ + { 0x01001ee2, 20669 }, /* Ohornbelowdot */ + { 0x01001ee3, 20683 }, /* ohornbelowdot */ + { 0x01001edc, 20697 }, /* Ohorngrave */ + { 0x01001edd, 20708 }, /* ohorngrave */ + { 0x01001ede, 20719 }, /* Ohornhook */ + { 0x01001edf, 20729 }, /* ohornhook */ + { 0x01001ee0, 20739 }, /* Ohorntilde */ + { 0x01001ee1, 20750 }, /* ohorntilde */ + { 0x000003d2, 20761 }, /* Omacron */ + { 0x000003f2, 20769 }, /* omacron */ + { 0x00000ac3, 20777 }, /* oneeighth */ + { 0x00000ab2, 20787 }, /* onefifth */ + { 0x000000bd, 20796 }, /* onehalf */ + { 0x000000bc, 20804 }, /* onequarter */ + { 0x00000ab6, 20815 }, /* onesixth */ + { 0x01002081, 20824 }, /* onesubscript */ + { 0x000000b9, 20837 }, /* onesuperior */ + { 0x00000ab0, 20849 }, /* onethird */ + { 0x000000d8, 20858 }, /* Ooblique */ + { 0x000000f8, 20867 }, /* ooblique */ + { 0x00000ae2, 20876 }, /* openrectbullet */ + { 0x00000ae5, 20891 }, /* openstar */ + { 0x00000ae4, 20900 }, /* opentribulletdown */ + { 0x00000ae3, 20918 }, /* opentribulletup */ + { 0x000000aa, 20934 }, /* ordfeminine */ + { 0x1004ff44, 20946 }, /* osfActivate */ + { 0x1004ff31, 20958 }, /* osfAddMode */ + { 0x1004ff08, 20969 }, /* osfBackSpace */ + { 0x1004ff07, 20982 }, /* osfBackTab */ + { 0x1004ff5a, 20993 }, /* osfBeginData */ + { 0x1004ff58, 21006 }, /* osfBeginLine */ + { 0x1004ff69, 21019 }, /* osfCancel */ + { 0x1004ff0b, 21029 }, /* osfClear */ + { 0x1004ff02, 21038 }, /* osfCopy */ + { 0x1004ff03, 21046 }, /* osfCut */ + { 0x1004ffff, 21053 }, /* osfDelete */ + { 0x1004ff72, 21063 }, /* osfDeselectAll */ + { 0x1004ff54, 21078 }, /* osfDown */ + { 0x1004ff59, 21086 }, /* osfEndData */ + { 0x1004ff57, 21097 }, /* osfEndLine */ + { 0x1004ff1b, 21108 }, /* osfEscape */ + { 0x1004ff74, 21118 }, /* osfExtend */ + { 0x1004ff6a, 21128 }, /* osfHelp */ + { 0x1004ff63, 21136 }, /* osfInsert */ + { 0x1004ff51, 21146 }, /* osfLeft */ + { 0x1004ff67, 21154 }, /* osfMenu */ + { 0x1004ff45, 21162 }, /* osfMenuBar */ + { 0x1004ff5e, 21173 }, /* osfNextField */ + { 0x1004ff5c, 21186 }, /* osfNextMenu */ + { 0x1004ff42, 21198 }, /* osfPageDown */ + { 0x1004ff40, 21210 }, /* osfPageLeft */ + { 0x1004ff43, 21222 }, /* osfPageRight */ + { 0x1004ff41, 21235 }, /* osfPageUp */ + { 0x1004ff04, 21245 }, /* osfPaste */ + { 0x1004ff5d, 21254 }, /* osfPrevField */ + { 0x1004ff5b, 21267 }, /* osfPrevMenu */ + { 0x1004ff32, 21279 }, /* osfPrimaryPaste */ + { 0x1004ff33, 21295 }, /* osfQuickPaste */ + { 0x1004ff73, 21309 }, /* osfReselect */ + { 0x1004ff78, 21321 }, /* osfRestore */ + { 0x1004ff53, 21332 }, /* osfRight */ + { 0x1004ff60, 21341 }, /* osfSelect */ + { 0x1004ff71, 21351 }, /* osfSelectAll */ + { 0x1004ff65, 21364 }, /* osfUndo */ + { 0x1004ff52, 21372 }, /* osfUp */ + { 0x000000d8, 21378 }, /* Oslash */ + { 0x000000f8, 21385 }, /* oslash */ + { 0x000000d5, 21392 }, /* Otilde */ + { 0x000000f5, 21399 }, /* otilde */ + { 0x00000bc0, 21406 }, /* overbar */ + { 0x0000fe78, 21414 }, /* Overlay1_Enable */ + { 0x0000fe79, 21430 }, /* Overlay2_Enable */ + { 0x0000047e, 21446 }, /* overline */ + { 0x00000050, 21455 }, /* P */ + { 0x00000070, 21457 }, /* p */ + { 0x01001e56, 21459 }, /* Pabovedot */ + { 0x01001e57, 21469 }, /* pabovedot */ + { 0x0000ff56, 21479 }, /* Page_Down */ + { 0x0000ff55, 21489 }, /* Page_Up */ + { 0x000000b6, 21497 }, /* paragraph */ + { 0x00000028, 21507 }, /* parenleft */ + { 0x00000029, 21517 }, /* parenright */ + { 0x01002202, 21528 }, /* partdifferential */ + { 0x000008ef, 21545 }, /* partialderivative */ + { 0x0000ff13, 21563 }, /* Pause */ + { 0x00000025, 21569 }, /* percent */ + { 0x0000002e, 21577 }, /* period */ + { 0x000000b7, 21584 }, /* periodcentered */ + { 0x00000ad5, 21599 }, /* permille */ + { 0x010020a7, 21608 }, /* PesetaSign */ + { 0x00000afb, 21619 }, /* phonographcopyright */ + { 0x0000002b, 21639 }, /* plus */ + { 0x000000b1, 21644 }, /* plusminus */ + { 0x0000fefa, 21654 }, /* Pointer_Accelerate */ + { 0x0000fee9, 21673 }, /* Pointer_Button1 */ + { 0x0000feea, 21689 }, /* Pointer_Button2 */ + { 0x0000feeb, 21705 }, /* Pointer_Button3 */ + { 0x0000feec, 21721 }, /* Pointer_Button4 */ + { 0x0000feed, 21737 }, /* Pointer_Button5 */ + { 0x0000fee8, 21753 }, /* Pointer_Button_Dflt */ + { 0x0000feef, 21773 }, /* Pointer_DblClick1 */ + { 0x0000fef0, 21791 }, /* Pointer_DblClick2 */ + { 0x0000fef1, 21809 }, /* Pointer_DblClick3 */ + { 0x0000fef2, 21827 }, /* Pointer_DblClick4 */ + { 0x0000fef3, 21845 }, /* Pointer_DblClick5 */ + { 0x0000feee, 21863 }, /* Pointer_DblClick_Dflt */ + { 0x0000fefb, 21885 }, /* Pointer_DfltBtnNext */ + { 0x0000fefc, 21905 }, /* Pointer_DfltBtnPrev */ + { 0x0000fee3, 21925 }, /* Pointer_Down */ + { 0x0000fee6, 21938 }, /* Pointer_DownLeft */ + { 0x0000fee7, 21955 }, /* Pointer_DownRight */ + { 0x0000fef5, 21973 }, /* Pointer_Drag1 */ + { 0x0000fef6, 21987 }, /* Pointer_Drag2 */ + { 0x0000fef7, 22001 }, /* Pointer_Drag3 */ + { 0x0000fef8, 22015 }, /* Pointer_Drag4 */ + { 0x0000fefd, 22029 }, /* Pointer_Drag5 */ + { 0x0000fef4, 22043 }, /* Pointer_Drag_Dflt */ + { 0x0000fef9, 22061 }, /* Pointer_EnableKeys */ + { 0x0000fee0, 22080 }, /* Pointer_Left */ + { 0x0000fee1, 22093 }, /* Pointer_Right */ + { 0x0000fee2, 22107 }, /* Pointer_Up */ + { 0x0000fee4, 22118 }, /* Pointer_UpLeft */ + { 0x0000fee5, 22133 }, /* Pointer_UpRight */ + { 0x00000ad4, 22149 }, /* prescription */ + { 0x0000fed1, 22162 }, /* Prev_Virtual_Screen */ + { 0x0000ff3e, 22182 }, /* PreviousCandidate */ + { 0x0000ff61, 22200 }, /* Print */ + { 0x0000ff55, 22206 }, /* Prior */ + { 0x000004b0, 22212 }, /* prolongedsound */ + { 0x00000aa6, 22227 }, /* punctspace */ + { 0x00000051, 22238 }, /* Q */ + { 0x00000071, 22240 }, /* q */ + { 0x00000bcc, 22242 }, /* quad */ + { 0x0000003f, 22247 }, /* question */ + { 0x000000bf, 22256 }, /* questiondown */ + { 0x00000022, 22269 }, /* quotedbl */ + { 0x00000060, 22278 }, /* quoteleft */ + { 0x00000027, 22288 }, /* quoteright */ + { 0x00000052, 22299 }, /* R */ + { 0x00000072, 22301 }, /* r */ + { 0x0000ffd2, 22303 }, /* R1 */ + { 0x0000ffdb, 22306 }, /* R10 */ + { 0x0000ffdc, 22310 }, /* R11 */ + { 0x0000ffdd, 22314 }, /* R12 */ + { 0x0000ffde, 22318 }, /* R13 */ + { 0x0000ffdf, 22322 }, /* R14 */ + { 0x0000ffe0, 22326 }, /* R15 */ + { 0x0000ffd3, 22330 }, /* R2 */ + { 0x0000ffd4, 22333 }, /* R3 */ + { 0x0000ffd5, 22336 }, /* R4 */ + { 0x0000ffd6, 22339 }, /* R5 */ + { 0x0000ffd7, 22342 }, /* R6 */ + { 0x0000ffd8, 22345 }, /* R7 */ + { 0x0000ffd9, 22348 }, /* R8 */ + { 0x0000ffda, 22351 }, /* R9 */ + { 0x000001c0, 22354 }, /* Racute */ + { 0x000001e0, 22361 }, /* racute */ + { 0x000008d6, 22368 }, /* radical */ + { 0x000001d8, 22376 }, /* Rcaron */ + { 0x000001f8, 22383 }, /* rcaron */ + { 0x000003a3, 22390 }, /* Rcedilla */ + { 0x000003b3, 22399 }, /* rcedilla */ + { 0x0000ff66, 22408 }, /* Redo */ + { 0x000000ae, 22413 }, /* registered */ + { 0x0000fe72, 22424 }, /* RepeatKeys_Enable */ + { 0x1000ff6c, 22442 }, /* Reset */ + { 0x0000ff0d, 22448 }, /* Return */ + { 0x0000ff53, 22455 }, /* Right */ + { 0x00000abe, 22461 }, /* rightanglebracket */ + { 0x000008fd, 22479 }, /* rightarrow */ + { 0x00000ba6, 22490 }, /* rightcaret */ + { 0x00000ad3, 22501 }, /* rightdoublequotemark */ + { 0x000008b0, 22522 }, /* rightmiddlecurlybrace */ + { 0x000008b7, 22544 }, /* rightmiddlesummation */ + { 0x00000acd, 22565 }, /* rightopentriangle */ + { 0x00000aeb, 22583 }, /* rightpointer */ + { 0x00000bd8, 22596 }, /* rightshoe */ + { 0x00000ad1, 22606 }, /* rightsinglequotemark */ + { 0x000009f5, 22627 }, /* rightt */ + { 0x00000bfc, 22634 }, /* righttack */ + { 0x0000ff24, 22644 }, /* Romaji */ + { 0x010020a8, 22651 }, /* RupeeSign */ + { 0x00000053, 22661 }, /* S */ + { 0x00000073, 22663 }, /* s */ + { 0x01001e60, 22665 }, /* Sabovedot */ + { 0x01001e61, 22675 }, /* sabovedot */ + { 0x000001a6, 22685 }, /* Sacute */ + { 0x000001b6, 22692 }, /* sacute */ + { 0x000001a9, 22699 }, /* Scaron */ + { 0x000001b9, 22706 }, /* scaron */ + { 0x000001aa, 22713 }, /* Scedilla */ + { 0x000001ba, 22722 }, /* scedilla */ + { 0x0100018f, 22731 }, /* SCHWA */ + { 0x01000259, 22737 }, /* schwa */ + { 0x000002de, 22743 }, /* Scircumflex */ + { 0x000002fe, 22755 }, /* scircumflex */ + { 0x0000ff7e, 22767 }, /* script_switch */ + { 0x0000ff14, 22781 }, /* Scroll_Lock */ + { 0x00000ad7, 22793 }, /* seconds */ + { 0x000000a7, 22801 }, /* section */ + { 0x0000ff60, 22809 }, /* Select */ + { 0x0000003b, 22816 }, /* semicolon */ + { 0x000004df, 22826 }, /* semivoicedsound */ + { 0x000006a1, 22842 }, /* Serbian_dje */ + { 0x000006b1, 22854 }, /* Serbian_DJE */ + { 0x000006af, 22866 }, /* Serbian_dze */ + { 0x000006bf, 22878 }, /* Serbian_DZE */ + { 0x000006a8, 22890 }, /* Serbian_je */ + { 0x000006b8, 22901 }, /* Serbian_JE */ + { 0x000006a9, 22912 }, /* Serbian_lje */ + { 0x000006b9, 22924 }, /* Serbian_LJE */ + { 0x000006aa, 22936 }, /* Serbian_nje */ + { 0x000006ba, 22948 }, /* Serbian_NJE */ + { 0x000006ab, 22960 }, /* Serbian_tshe */ + { 0x000006bb, 22973 }, /* Serbian_TSHE */ + { 0x00000ac6, 22986 }, /* seveneighths */ + { 0x01002087, 22999 }, /* sevensubscript */ + { 0x01002077, 23014 }, /* sevensuperior */ + { 0x0000ffe1, 23028 }, /* Shift_L */ + { 0x0000ffe6, 23036 }, /* Shift_Lock */ + { 0x0000ffe2, 23047 }, /* Shift_R */ + { 0x00000aca, 23055 }, /* signaturemark */ + { 0x00000aac, 23069 }, /* signifblank */ + { 0x000008c9, 23081 }, /* similarequal */ + { 0x0000ff3c, 23094 }, /* SingleCandidate */ + { 0x00000afd, 23110 }, /* singlelowquotemark */ + { 0x01000d85, 23129 }, /* Sinh_a */ + { 0x01000d86, 23136 }, /* Sinh_aa */ + { 0x01000dcf, 23144 }, /* Sinh_aa2 */ + { 0x01000d87, 23153 }, /* Sinh_ae */ + { 0x01000dd0, 23161 }, /* Sinh_ae2 */ + { 0x01000d88, 23170 }, /* Sinh_aee */ + { 0x01000dd1, 23179 }, /* Sinh_aee2 */ + { 0x01000d93, 23189 }, /* Sinh_ai */ + { 0x01000ddb, 23197 }, /* Sinh_ai2 */ + { 0x01000dca, 23206 }, /* Sinh_al */ + { 0x01000d96, 23214 }, /* Sinh_au */ + { 0x01000dde, 23222 }, /* Sinh_au2 */ + { 0x01000db6, 23231 }, /* Sinh_ba */ + { 0x01000db7, 23239 }, /* Sinh_bha */ + { 0x01000da0, 23248 }, /* Sinh_ca */ + { 0x01000da1, 23256 }, /* Sinh_cha */ + { 0x01000da9, 23265 }, /* Sinh_dda */ + { 0x01000daa, 23274 }, /* Sinh_ddha */ + { 0x01000daf, 23284 }, /* Sinh_dha */ + { 0x01000db0, 23293 }, /* Sinh_dhha */ + { 0x01000d91, 23303 }, /* Sinh_e */ + { 0x01000dd9, 23310 }, /* Sinh_e2 */ + { 0x01000d92, 23318 }, /* Sinh_ee */ + { 0x01000dda, 23326 }, /* Sinh_ee2 */ + { 0x01000dc6, 23335 }, /* Sinh_fa */ + { 0x01000d9c, 23343 }, /* Sinh_ga */ + { 0x01000d9d, 23351 }, /* Sinh_gha */ + { 0x01000d83, 23360 }, /* Sinh_h2 */ + { 0x01000dc4, 23368 }, /* Sinh_ha */ + { 0x01000d89, 23376 }, /* Sinh_i */ + { 0x01000dd2, 23383 }, /* Sinh_i2 */ + { 0x01000d8a, 23391 }, /* Sinh_ii */ + { 0x01000dd3, 23399 }, /* Sinh_ii2 */ + { 0x01000da2, 23408 }, /* Sinh_ja */ + { 0x01000da3, 23416 }, /* Sinh_jha */ + { 0x01000da5, 23425 }, /* Sinh_jnya */ + { 0x01000d9a, 23435 }, /* Sinh_ka */ + { 0x01000d9b, 23443 }, /* Sinh_kha */ + { 0x01000df4, 23452 }, /* Sinh_kunddaliya */ + { 0x01000dbd, 23468 }, /* Sinh_la */ + { 0x01000dc5, 23476 }, /* Sinh_lla */ + { 0x01000d8f, 23485 }, /* Sinh_lu */ + { 0x01000ddf, 23493 }, /* Sinh_lu2 */ + { 0x01000d90, 23502 }, /* Sinh_luu */ + { 0x01000df3, 23511 }, /* Sinh_luu2 */ + { 0x01000db8, 23521 }, /* Sinh_ma */ + { 0x01000db9, 23529 }, /* Sinh_mba */ + { 0x01000db1, 23538 }, /* Sinh_na */ + { 0x01000dac, 23546 }, /* Sinh_ndda */ + { 0x01000db3, 23556 }, /* Sinh_ndha */ + { 0x01000d82, 23566 }, /* Sinh_ng */ + { 0x01000d9e, 23574 }, /* Sinh_ng2 */ + { 0x01000d9f, 23583 }, /* Sinh_nga */ + { 0x01000da6, 23592 }, /* Sinh_nja */ + { 0x01000dab, 23601 }, /* Sinh_nna */ + { 0x01000da4, 23610 }, /* Sinh_nya */ + { 0x01000d94, 23619 }, /* Sinh_o */ + { 0x01000ddc, 23626 }, /* Sinh_o2 */ + { 0x01000d95, 23634 }, /* Sinh_oo */ + { 0x01000ddd, 23642 }, /* Sinh_oo2 */ + { 0x01000db4, 23651 }, /* Sinh_pa */ + { 0x01000db5, 23659 }, /* Sinh_pha */ + { 0x01000dbb, 23668 }, /* Sinh_ra */ + { 0x01000d8d, 23676 }, /* Sinh_ri */ + { 0x01000d8e, 23684 }, /* Sinh_rii */ + { 0x01000dd8, 23693 }, /* Sinh_ru2 */ + { 0x01000df2, 23702 }, /* Sinh_ruu2 */ + { 0x01000dc3, 23712 }, /* Sinh_sa */ + { 0x01000dc1, 23720 }, /* Sinh_sha */ + { 0x01000dc2, 23729 }, /* Sinh_ssha */ + { 0x01000dad, 23739 }, /* Sinh_tha */ + { 0x01000dae, 23748 }, /* Sinh_thha */ + { 0x01000da7, 23758 }, /* Sinh_tta */ + { 0x01000da8, 23767 }, /* Sinh_ttha */ + { 0x01000d8b, 23777 }, /* Sinh_u */ + { 0x01000dd4, 23784 }, /* Sinh_u2 */ + { 0x01000d8c, 23792 }, /* Sinh_uu */ + { 0x01000dd6, 23800 }, /* Sinh_uu2 */ + { 0x01000dc0, 23809 }, /* Sinh_va */ + { 0x01000dba, 23817 }, /* Sinh_ya */ + { 0x01002086, 23825 }, /* sixsubscript */ + { 0x01002076, 23838 }, /* sixsuperior */ + { 0x0000002f, 23850 }, /* slash */ + { 0x0000fe73, 23856 }, /* SlowKeys_Enable */ + { 0x000009e0, 23872 }, /* soliddiamond */ + { 0x00000020, 23885 }, /* space */ + { 0x0100221a, 23891 }, /* squareroot */ + { 0x000000df, 23902 }, /* ssharp */ + { 0x000000a3, 23909 }, /* sterling */ + { 0x0000fe75, 23918 }, /* StickyKeys_Enable */ + { 0x01002263, 23936 }, /* stricteq */ + { 0x0000ff66, 23945 }, /* SunAgain */ + { 0x0000ff7e, 23954 }, /* SunAltGraph */ + { 0x1005ff77, 23966 }, /* SunAudioLowerVolume */ + { 0x1005ff78, 23986 }, /* SunAudioMute */ + { 0x1005ff79, 23999 }, /* SunAudioRaiseVolume */ + { 0x0000ff20, 24019 }, /* SunCompose */ + { 0x1005ff72, 24030 }, /* SunCopy */ + { 0x1005ff75, 24038 }, /* SunCut */ + { 0x1005ff10, 24045 }, /* SunF36 */ + { 0x1005ff11, 24052 }, /* SunF37 */ + { 0x1005ff03, 24059 }, /* SunFA_Acute */ + { 0x1005ff05, 24071 }, /* SunFA_Cedilla */ + { 0x1005ff01, 24085 }, /* SunFA_Circum */ + { 0x1005ff04, 24098 }, /* SunFA_Diaeresis */ + { 0x1005ff00, 24114 }, /* SunFA_Grave */ + { 0x1005ff02, 24126 }, /* SunFA_Tilde */ + { 0x0000ff68, 24138 }, /* SunFind */ + { 0x1005ff71, 24146 }, /* SunFront */ + { 0x1005ff73, 24155 }, /* SunOpen */ + { 0x0000ff56, 24163 }, /* SunPageDown */ + { 0x0000ff55, 24175 }, /* SunPageUp */ + { 0x1005ff74, 24185 }, /* SunPaste */ + { 0x1005ff76, 24194 }, /* SunPowerSwitch */ + { 0x1005ff7d, 24209 }, /* SunPowerSwitchShift */ + { 0x0000ff61, 24229 }, /* SunPrint_Screen */ + { 0x1005ff70, 24245 }, /* SunProps */ + { 0x0000ff69, 24254 }, /* SunStop */ + { 0x1005ff60, 24262 }, /* SunSys_Req */ + { 0x0000ff65, 24273 }, /* SunUndo */ + { 0x1005ff7a, 24281 }, /* SunVideoDegauss */ + { 0x1005ff7b, 24297 }, /* SunVideoLowerBrightness */ + { 0x1005ff7c, 24321 }, /* SunVideoRaiseBrightness */ + { 0x0000ffeb, 24345 }, /* Super_L */ + { 0x0000ffec, 24353 }, /* Super_R */ + { 0x0000ff15, 24361 }, /* Sys_Req */ + { 0x1000ff6d, 24369 }, /* System */ + { 0x00000054, 24376 }, /* T */ + { 0x00000074, 24378 }, /* t */ + { 0x0000ff09, 24380 }, /* Tab */ + { 0x01001e6a, 24384 }, /* Tabovedot */ + { 0x01001e6b, 24394 }, /* tabovedot */ + { 0x000001ab, 24404 }, /* Tcaron */ + { 0x000001bb, 24411 }, /* tcaron */ + { 0x000001de, 24418 }, /* Tcedilla */ + { 0x000001fe, 24427 }, /* tcedilla */ + { 0x00000af9, 24436 }, /* telephone */ + { 0x00000afa, 24446 }, /* telephonerecorder */ + { 0x0000fed5, 24464 }, /* Terminate_Server */ + { 0x00000ddf, 24481 }, /* Thai_baht */ + { 0x00000dba, 24491 }, /* Thai_bobaimai */ + { 0x00000da8, 24505 }, /* Thai_chochan */ + { 0x00000daa, 24518 }, /* Thai_chochang */ + { 0x00000da9, 24532 }, /* Thai_choching */ + { 0x00000dac, 24546 }, /* Thai_chochoe */ + { 0x00000dae, 24559 }, /* Thai_dochada */ + { 0x00000db4, 24572 }, /* Thai_dodek */ + { 0x00000dbd, 24583 }, /* Thai_fofa */ + { 0x00000dbf, 24593 }, /* Thai_fofan */ + { 0x00000dcb, 24604 }, /* Thai_hohip */ + { 0x00000dce, 24615 }, /* Thai_honokhuk */ + { 0x00000da2, 24629 }, /* Thai_khokhai */ + { 0x00000da5, 24642 }, /* Thai_khokhon */ + { 0x00000da3, 24655 }, /* Thai_khokhuat */ + { 0x00000da4, 24669 }, /* Thai_khokhwai */ + { 0x00000da6, 24683 }, /* Thai_khorakhang */ + { 0x00000da1, 24699 }, /* Thai_kokai */ + { 0x00000de5, 24710 }, /* Thai_lakkhangyao */ + { 0x00000df7, 24727 }, /* Thai_lekchet */ + { 0x00000df5, 24740 }, /* Thai_lekha */ + { 0x00000df6, 24751 }, /* Thai_lekhok */ + { 0x00000df9, 24763 }, /* Thai_lekkao */ + { 0x00000df1, 24775 }, /* Thai_leknung */ + { 0x00000df8, 24788 }, /* Thai_lekpaet */ + { 0x00000df3, 24801 }, /* Thai_leksam */ + { 0x00000df4, 24813 }, /* Thai_leksi */ + { 0x00000df2, 24824 }, /* Thai_leksong */ + { 0x00000df0, 24837 }, /* Thai_leksun */ + { 0x00000dcc, 24849 }, /* Thai_lochula */ + { 0x00000dc5, 24862 }, /* Thai_loling */ + { 0x00000dc6, 24874 }, /* Thai_lu */ + { 0x00000deb, 24882 }, /* Thai_maichattawa */ + { 0x00000de8, 24899 }, /* Thai_maiek */ + { 0x00000dd1, 24910 }, /* Thai_maihanakat */ + { 0x00000dde, 24926 }, /* Thai_maihanakat_maitho */ + { 0x00000de7, 24949 }, /* Thai_maitaikhu */ + { 0x00000de9, 24964 }, /* Thai_maitho */ + { 0x00000dea, 24976 }, /* Thai_maitri */ + { 0x00000de6, 24988 }, /* Thai_maiyamok */ + { 0x00000dc1, 25002 }, /* Thai_moma */ + { 0x00000da7, 25012 }, /* Thai_ngongu */ + { 0x00000ded, 25024 }, /* Thai_nikhahit */ + { 0x00000db3, 25038 }, /* Thai_nonen */ + { 0x00000db9, 25049 }, /* Thai_nonu */ + { 0x00000dcd, 25059 }, /* Thai_oang */ + { 0x00000dcf, 25069 }, /* Thai_paiyannoi */ + { 0x00000dda, 25084 }, /* Thai_phinthu */ + { 0x00000dbe, 25097 }, /* Thai_phophan */ + { 0x00000dbc, 25110 }, /* Thai_phophung */ + { 0x00000dc0, 25124 }, /* Thai_phosamphao */ + { 0x00000dbb, 25140 }, /* Thai_popla */ + { 0x00000dc3, 25151 }, /* Thai_rorua */ + { 0x00000dc4, 25162 }, /* Thai_ru */ + { 0x00000dd0, 25170 }, /* Thai_saraa */ + { 0x00000dd2, 25181 }, /* Thai_saraaa */ + { 0x00000de1, 25193 }, /* Thai_saraae */ + { 0x00000de4, 25205 }, /* Thai_saraaimaimalai */ + { 0x00000de3, 25225 }, /* Thai_saraaimaimuan */ + { 0x00000dd3, 25244 }, /* Thai_saraam */ + { 0x00000de0, 25256 }, /* Thai_sarae */ + { 0x00000dd4, 25267 }, /* Thai_sarai */ + { 0x00000dd5, 25278 }, /* Thai_saraii */ + { 0x00000de2, 25290 }, /* Thai_sarao */ + { 0x00000dd8, 25301 }, /* Thai_sarau */ + { 0x00000dd6, 25312 }, /* Thai_saraue */ + { 0x00000dd7, 25324 }, /* Thai_sarauee */ + { 0x00000dd9, 25337 }, /* Thai_sarauu */ + { 0x00000dc9, 25349 }, /* Thai_sorusi */ + { 0x00000dc8, 25361 }, /* Thai_sosala */ + { 0x00000dab, 25373 }, /* Thai_soso */ + { 0x00000dca, 25383 }, /* Thai_sosua */ + { 0x00000dec, 25394 }, /* Thai_thanthakhat */ + { 0x00000db1, 25411 }, /* Thai_thonangmontho */ + { 0x00000db2, 25430 }, /* Thai_thophuthao */ + { 0x00000db7, 25446 }, /* Thai_thothahan */ + { 0x00000db0, 25461 }, /* Thai_thothan */ + { 0x00000db8, 25474 }, /* Thai_thothong */ + { 0x00000db6, 25488 }, /* Thai_thothung */ + { 0x00000daf, 25502 }, /* Thai_topatak */ + { 0x00000db5, 25515 }, /* Thai_totao */ + { 0x00000dc7, 25526 }, /* Thai_wowaen */ + { 0x00000dc2, 25538 }, /* Thai_yoyak */ + { 0x00000dad, 25549 }, /* Thai_yoying */ + { 0x000008c0, 25561 }, /* therefore */ + { 0x00000aa7, 25571 }, /* thinspace */ + { 0x000000de, 25581 }, /* THORN */ + { 0x000000de, 25587 }, /* Thorn */ + { 0x000000fe, 25593 }, /* thorn */ + { 0x00000ac4, 25599 }, /* threeeighths */ + { 0x00000ab4, 25612 }, /* threefifths */ + { 0x000000be, 25624 }, /* threequarters */ + { 0x01002083, 25638 }, /* threesubscript */ + { 0x000000b3, 25653 }, /* threesuperior */ + { 0x0100222d, 25667 }, /* tintegral */ + { 0x000008a4, 25677 }, /* topintegral */ + { 0x000008ab, 25689 }, /* topleftparens */ + { 0x000008a2, 25703 }, /* topleftradical */ + { 0x000008a7, 25718 }, /* topleftsqbracket */ + { 0x000008b1, 25735 }, /* topleftsummation */ + { 0x000008ad, 25752 }, /* toprightparens */ + { 0x000008a9, 25767 }, /* toprightsqbracket */ + { 0x000008b5, 25785 }, /* toprightsummation */ + { 0x000009f7, 25803 }, /* topt */ + { 0x000008b3, 25808 }, /* topvertsummationconnector */ + { 0x0000ff2b, 25834 }, /* Touroku */ + { 0x00000ac9, 25842 }, /* trademark */ + { 0x00000acb, 25852 }, /* trademarkincircle */ + { 0x000003ac, 25870 }, /* Tslash */ + { 0x000003bc, 25877 }, /* tslash */ + { 0x00000ab3, 25884 }, /* twofifths */ + { 0x01002082, 25894 }, /* twosubscript */ + { 0x000000b2, 25907 }, /* twosuperior */ + { 0x00000ab1, 25919 }, /* twothirds */ + { 0x00000055, 25929 }, /* U */ + { 0x00000075, 25931 }, /* u */ + { 0x000000da, 25933 }, /* Uacute */ + { 0x000000fa, 25940 }, /* uacute */ + { 0x01001ee4, 25947 }, /* Ubelowdot */ + { 0x01001ee5, 25957 }, /* ubelowdot */ + { 0x000002dd, 25967 }, /* Ubreve */ + { 0x000002fd, 25974 }, /* ubreve */ + { 0x000000db, 25981 }, /* Ucircumflex */ + { 0x000000fb, 25993 }, /* ucircumflex */ + { 0x000000dc, 26005 }, /* Udiaeresis */ + { 0x000000fc, 26016 }, /* udiaeresis */ + { 0x000001db, 26027 }, /* Udoubleacute */ + { 0x000001fb, 26040 }, /* udoubleacute */ + { 0x000000d9, 26053 }, /* Ugrave */ + { 0x000000f9, 26060 }, /* ugrave */ + { 0x01001ee6, 26067 }, /* Uhook */ + { 0x01001ee7, 26073 }, /* uhook */ + { 0x010001af, 26079 }, /* Uhorn */ + { 0x010001b0, 26085 }, /* uhorn */ + { 0x01001ee8, 26091 }, /* Uhornacute */ + { 0x01001ee9, 26102 }, /* uhornacute */ + { 0x01001ef0, 26113 }, /* Uhornbelowdot */ + { 0x01001ef1, 26127 }, /* uhornbelowdot */ + { 0x01001eea, 26141 }, /* Uhorngrave */ + { 0x01001eeb, 26152 }, /* uhorngrave */ + { 0x01001eec, 26163 }, /* Uhornhook */ + { 0x01001eed, 26173 }, /* uhornhook */ + { 0x01001eee, 26183 }, /* Uhorntilde */ + { 0x01001eef, 26194 }, /* uhorntilde */ + { 0x000006ad, 26205 }, /* Ukrainian_ghe_with_upturn */ + { 0x000006bd, 26231 }, /* Ukrainian_GHE_WITH_UPTURN */ + { 0x000006a6, 26257 }, /* Ukrainian_i */ + { 0x000006b6, 26269 }, /* Ukrainian_I */ + { 0x000006a4, 26281 }, /* Ukrainian_ie */ + { 0x000006b4, 26294 }, /* Ukrainian_IE */ + { 0x000006a7, 26307 }, /* Ukrainian_yi */ + { 0x000006b7, 26320 }, /* Ukrainian_YI */ + { 0x000006a6, 26333 }, /* Ukranian_i */ + { 0x000006b6, 26344 }, /* Ukranian_I */ + { 0x000006a4, 26355 }, /* Ukranian_je */ + { 0x000006b4, 26367 }, /* Ukranian_JE */ + { 0x000006a7, 26379 }, /* Ukranian_yi */ + { 0x000006b7, 26391 }, /* Ukranian_YI */ + { 0x000003de, 26403 }, /* Umacron */ + { 0x000003fe, 26411 }, /* umacron */ + { 0x00000bc6, 26419 }, /* underbar */ + { 0x0000005f, 26428 }, /* underscore */ + { 0x0000ff65, 26439 }, /* Undo */ + { 0x000008dd, 26444 }, /* union */ + { 0x000003d9, 26450 }, /* Uogonek */ + { 0x000003f9, 26458 }, /* uogonek */ + { 0x0000ff52, 26466 }, /* Up */ + { 0x000008fc, 26469 }, /* uparrow */ + { 0x00000ba9, 26477 }, /* upcaret */ + { 0x000009ec, 26485 }, /* upleftcorner */ + { 0x000009eb, 26498 }, /* uprightcorner */ + { 0x00000bc3, 26512 }, /* upshoe */ + { 0x00000bd3, 26519 }, /* upstile */ + { 0x00000bce, 26527 }, /* uptack */ + { 0x000001d9, 26534 }, /* Uring */ + { 0x000001f9, 26540 }, /* uring */ + { 0x1000ff6e, 26546 }, /* User */ + { 0x000003dd, 26551 }, /* Utilde */ + { 0x000003fd, 26558 }, /* utilde */ + { 0x00000056, 26565 }, /* V */ + { 0x00000076, 26567 }, /* v */ + { 0x000008c1, 26569 }, /* variation */ + { 0x000009f8, 26579 }, /* vertbar */ + { 0x000008a6, 26587 }, /* vertconnector */ + { 0x000004de, 26601 }, /* voicedsound */ + { 0x00ffffff, 26613 }, /* VoidSymbol */ + { 0x000009e9, 26624 }, /* vt */ + { 0x00000057, 26627 }, /* W */ + { 0x00000077, 26629 }, /* w */ + { 0x01001e82, 26631 }, /* Wacute */ + { 0x01001e83, 26638 }, /* wacute */ + { 0x01000174, 26645 }, /* Wcircumflex */ + { 0x01000175, 26657 }, /* wcircumflex */ + { 0x01001e84, 26669 }, /* Wdiaeresis */ + { 0x01001e85, 26680 }, /* wdiaeresis */ + { 0x01001e80, 26691 }, /* Wgrave */ + { 0x01001e81, 26698 }, /* wgrave */ + { 0x010020a9, 26705 }, /* WonSign */ + { 0x00000058, 26713 }, /* X */ + { 0x00000078, 26715 }, /* x */ + { 0x01001e8a, 26717 }, /* Xabovedot */ + { 0x01001e8b, 26727 }, /* xabovedot */ + { 0x100811b9, 26737 }, /* XF8610ChannelsDown */ + { 0x100811b8, 26756 }, /* XF8610ChannelsUp */ + { 0x1008126f, 26773 }, /* XF863DMode */ + { 0x1008ff39, 26784 }, /* XF86AddFavorite */ + { 0x100811ad, 26800 }, /* XF86Addressbook */ + { 0x10081230, 26816 }, /* XF86ALSToggle */ + { 0x1008ff50, 26830 }, /* XF86ApplicationLeft */ + { 0x1008ff51, 26850 }, /* XF86ApplicationRight */ + { 0x10081244, 26871 }, /* XF86AppSelect */ + { 0x10081177, 26885 }, /* XF86AspectRatio */ + { 0x10081247, 26901 }, /* XF86Assistant */ + { 0x1008121c, 26915 }, /* XF86AttendantOff */ + { 0x1008121b, 26932 }, /* XF86AttendantOn */ + { 0x1008121d, 26948 }, /* XF86AttendantToggle */ + { 0x10081188, 26968 }, /* XF86Audio */ + { 0x1008ff9b, 26978 }, /* XF86AudioCycleTrack */ + { 0x1008126e, 26998 }, /* XF86AudioDesc */ + { 0x1008ff97, 27012 }, /* XF86AudioForward */ + { 0x1008ff11, 27029 }, /* XF86AudioLowerVolume */ + { 0x1008ff32, 27050 }, /* XF86AudioMedia */ + { 0x1008ffb2, 27065 }, /* XF86AudioMicMute */ + { 0x1008ff12, 27082 }, /* XF86AudioMute */ + { 0x1008ff17, 27096 }, /* XF86AudioNext */ + { 0x1008ff31, 27110 }, /* XF86AudioPause */ + { 0x1008ff14, 27125 }, /* XF86AudioPlay */ + { 0x1008ffb6, 27139 }, /* XF86AudioPreset */ + { 0x1008ff16, 27155 }, /* XF86AudioPrev */ + { 0x1008ff13, 27169 }, /* XF86AudioRaiseVolume */ + { 0x1008ff99, 27190 }, /* XF86AudioRandomPlay */ + { 0x1008ff1c, 27210 }, /* XF86AudioRecord */ + { 0x1008ff98, 27226 }, /* XF86AudioRepeat */ + { 0x1008ff3e, 27242 }, /* XF86AudioRewind */ + { 0x1008ff15, 27258 }, /* XF86AudioStop */ + { 0x1008ff8d, 27272 }, /* XF86Away */ + { 0x1008ff26, 27281 }, /* XF86Back */ + { 0x1008ff3f, 27290 }, /* XF86BackForward */ + { 0x1008ff93, 27306 }, /* XF86Battery */ + { 0x1008ffa6, 27318 }, /* XF86Blue */ + { 0x1008ff94, 27327 }, /* XF86Bluetooth */ + { 0x1008ff52, 27341 }, /* XF86Book */ + { 0x1008119b, 27350 }, /* XF86Break */ + { 0x1008ff3b, 27360 }, /* XF86BrightnessAdjust */ + { 0x100810f4, 27381 }, /* XF86BrightnessAuto */ + { 0x10081251, 27400 }, /* XF86BrightnessMax */ + { 0x10081250, 27418 }, /* XF86BrightnessMin */ + { 0x10081240, 27436 }, /* XF86Buttonconfig */ + { 0x1008ff54, 27453 }, /* XF86Calculater */ + { 0x1008ff1d, 27468 }, /* XF86Calculator */ + { 0x1008ff20, 27483 }, /* XF86Calendar */ + { 0x10081218, 27496 }, /* XF86CameraDown */ + { 0x10081210, 27511 }, /* XF86CameraFocus */ + { 0x10081219, 27527 }, /* XF86CameraLeft */ + { 0x1008121a, 27542 }, /* XF86CameraRight */ + { 0x10081217, 27558 }, /* XF86CameraUp */ + { 0x10081215, 27571 }, /* XF86CameraZoomIn */ + { 0x10081216, 27588 }, /* XF86CameraZoomOut */ + { 0x1008ff53, 27606 }, /* XF86CD */ + { 0x10081193, 27613 }, /* XF86ChannelDown */ + { 0x10081192, 27629 }, /* XF86ChannelUp */ + { 0x1008ff55, 27643 }, /* XF86Clear */ + { 0x1008fe21, 27653 }, /* XF86ClearGrab */ + { 0x1008ff56, 27667 }, /* XF86Close */ + { 0x1008ff3d, 27677 }, /* XF86Community */ + { 0x100811b6, 27691 }, /* XF86ContextMenu */ + { 0x1008ff22, 27707 }, /* XF86ContrastAdjust */ + { 0x10081243, 27726 }, /* XF86ControlPanel */ + { 0x1008ff57, 27743 }, /* XF86Copy */ + { 0x1008ff58, 27752 }, /* XF86Cut */ + { 0x1008ff9c, 27760 }, /* XF86CycleAngle */ + { 0x10081277, 27775 }, /* XF86Data */ + { 0x100811aa, 27784 }, /* XF86Database */ + { 0x1008ff59, 27797 }, /* XF86Display */ + { 0x100810f5, 27809 }, /* XF86DisplayOff */ + { 0x100811af, 27824 }, /* XF86DisplayToggle */ + { 0x1008ff5b, 27842 }, /* XF86Documents */ + { 0x1008ff5a, 27856 }, /* XF86DOS */ + { 0x10081185, 27864 }, /* XF86DVD */ + { 0x100811a6, 27872 }, /* XF86Editor */ + { 0x1008ff2c, 27883 }, /* XF86Eject */ + { 0x1008ff5c, 27893 }, /* XF86Excel */ + { 0x1008ff5d, 27903 }, /* XF86Explorer */ + { 0x10081275, 27916 }, /* XF86FastReverse */ + { 0x1008ff30, 27932 }, /* XF86Favorites */ + { 0x1008ff3c, 27946 }, /* XF86Finance */ + { 0x100811d0, 27958 }, /* XF86Fn */ + { 0x100811d1, 27965 }, /* XF86Fn_Esc */ + { 0x100811e5, 27976 }, /* XF86FnRightShift */ + { 0x1008ff27, 27993 }, /* XF86Forward */ + { 0x1008ff9d, 28005 }, /* XF86FrameBack */ + { 0x1008ff9e, 28019 }, /* XF86FrameForward */ + { 0x1008ffb8, 28036 }, /* XF86FullScreen */ + { 0x1008ff5e, 28051 }, /* XF86Game */ + { 0x1008ff5f, 28060 }, /* XF86Go */ + { 0x100811a8, 28067 }, /* XF86GraphicsEditor */ + { 0x1008ffa4, 28086 }, /* XF86Green */ + { 0x100811be, 28096 }, /* XF86HangupPhone */ + { 0x1008ffa8, 28112 }, /* XF86Hibernate */ + { 0x1008ff37, 28126 }, /* XF86History */ + { 0x1008ff18, 28138 }, /* XF86HomePage */ + { 0x1008ff3a, 28151 }, /* XF86HotLinks */ + { 0x100811ba, 28164 }, /* XF86Images */ + { 0x10081166, 28175 }, /* XF86Info */ + { 0x1008ff60, 28184 }, /* XF86iTouch */ + { 0x10081242, 28195 }, /* XF86Journal */ + { 0x1008ff06, 28207 }, /* XF86KbdBrightnessDown */ + { 0x1008ff05, 28229 }, /* XF86KbdBrightnessUp */ + { 0x10081264, 28249 }, /* XF86KbdInputAssistAccept */ + { 0x10081265, 28274 }, /* XF86KbdInputAssistCancel */ + { 0x10081261, 28299 }, /* XF86KbdInputAssistNext */ + { 0x10081263, 28322 }, /* XF86KbdInputAssistNextgroup */ + { 0x10081260, 28350 }, /* XF86KbdInputAssistPrev */ + { 0x10081262, 28373 }, /* XF86KbdInputAssistPrevgroup */ + { 0x100812b8, 28401 }, /* XF86KbdLcdMenu1 */ + { 0x100812b9, 28417 }, /* XF86KbdLcdMenu2 */ + { 0x100812ba, 28433 }, /* XF86KbdLcdMenu3 */ + { 0x100812bb, 28449 }, /* XF86KbdLcdMenu4 */ + { 0x100812bc, 28465 }, /* XF86KbdLcdMenu5 */ + { 0x1008ff04, 28481 }, /* XF86KbdLightOnOff */ + { 0x1008ffb3, 28499 }, /* XF86Keyboard */ + { 0x1008ff40, 28512 }, /* XF86Launch0 */ + { 0x1008ff41, 28524 }, /* XF86Launch1 */ + { 0x1008ff42, 28536 }, /* XF86Launch2 */ + { 0x1008ff43, 28548 }, /* XF86Launch3 */ + { 0x1008ff44, 28560 }, /* XF86Launch4 */ + { 0x1008ff45, 28572 }, /* XF86Launch5 */ + { 0x1008ff46, 28584 }, /* XF86Launch6 */ + { 0x1008ff47, 28596 }, /* XF86Launch7 */ + { 0x1008ff48, 28608 }, /* XF86Launch8 */ + { 0x1008ff49, 28620 }, /* XF86Launch9 */ + { 0x1008ff4a, 28632 }, /* XF86LaunchA */ + { 0x1008ff4b, 28644 }, /* XF86LaunchB */ + { 0x1008ff4c, 28656 }, /* XF86LaunchC */ + { 0x1008ff4d, 28668 }, /* XF86LaunchD */ + { 0x1008ff4e, 28680 }, /* XF86LaunchE */ + { 0x1008ff4f, 28692 }, /* XF86LaunchF */ + { 0x10081269, 28704 }, /* XF86LeftDown */ + { 0x10081268, 28717 }, /* XF86LeftUp */ + { 0x1008ff35, 28728 }, /* XF86LightBulb */ + { 0x1008121e, 28742 }, /* XF86LightsToggle */ + { 0x1008fe25, 28759 }, /* XF86LogGrabInfo */ + { 0x1008ff61, 28775 }, /* XF86LogOff */ + { 0x1008fe24, 28786 }, /* XF86LogWindowTree */ + { 0x10081290, 28804 }, /* XF86Macro1 */ + { 0x10081299, 28815 }, /* XF86Macro10 */ + { 0x1008129a, 28827 }, /* XF86Macro11 */ + { 0x1008129b, 28839 }, /* XF86Macro12 */ + { 0x1008129c, 28851 }, /* XF86Macro13 */ + { 0x1008129d, 28863 }, /* XF86Macro14 */ + { 0x1008129e, 28875 }, /* XF86Macro15 */ + { 0x1008129f, 28887 }, /* XF86Macro16 */ + { 0x100812a0, 28899 }, /* XF86Macro17 */ + { 0x100812a1, 28911 }, /* XF86Macro18 */ + { 0x100812a2, 28923 }, /* XF86Macro19 */ + { 0x10081291, 28935 }, /* XF86Macro2 */ + { 0x100812a3, 28946 }, /* XF86Macro20 */ + { 0x100812a4, 28958 }, /* XF86Macro21 */ + { 0x100812a5, 28970 }, /* XF86Macro22 */ + { 0x100812a6, 28982 }, /* XF86Macro23 */ + { 0x100812a7, 28994 }, /* XF86Macro24 */ + { 0x100812a8, 29006 }, /* XF86Macro25 */ + { 0x100812a9, 29018 }, /* XF86Macro26 */ + { 0x100812aa, 29030 }, /* XF86Macro27 */ + { 0x100812ab, 29042 }, /* XF86Macro28 */ + { 0x100812ac, 29054 }, /* XF86Macro29 */ + { 0x10081292, 29066 }, /* XF86Macro3 */ + { 0x100812ad, 29077 }, /* XF86Macro30 */ + { 0x10081293, 29089 }, /* XF86Macro4 */ + { 0x10081294, 29100 }, /* XF86Macro5 */ + { 0x10081295, 29111 }, /* XF86Macro6 */ + { 0x10081296, 29122 }, /* XF86Macro7 */ + { 0x10081297, 29133 }, /* XF86Macro8 */ + { 0x10081298, 29144 }, /* XF86Macro9 */ + { 0x100812b3, 29155 }, /* XF86MacroPreset1 */ + { 0x100812b4, 29172 }, /* XF86MacroPreset2 */ + { 0x100812b5, 29189 }, /* XF86MacroPreset3 */ + { 0x100812b2, 29206 }, /* XF86MacroPresetCycle */ + { 0x100812b0, 29227 }, /* XF86MacroRecordStart */ + { 0x100812b1, 29248 }, /* XF86MacroRecordStop */ + { 0x1008ff19, 29268 }, /* XF86Mail */ + { 0x1008ff90, 29277 }, /* XF86MailForward */ + { 0x1008ff62, 29293 }, /* XF86Market */ + { 0x100811b7, 29304 }, /* XF86MediaRepeat */ + { 0x1008126b, 29320 }, /* XF86MediaTopMenu */ + { 0x1008ff63, 29337 }, /* XF86Meeting */ + { 0x1008ff1e, 29349 }, /* XF86Memo */ + { 0x1008ff65, 29358 }, /* XF86MenuKB */ + { 0x1008ff66, 29369 }, /* XF86MenuPB */ + { 0x1008ff8e, 29380 }, /* XF86Messenger */ + { 0x1008ff01, 29394 }, /* XF86ModeLock */ + { 0x1008ff07, 29407 }, /* XF86MonBrightnessCycle */ + { 0x1008ff03, 29430 }, /* XF86MonBrightnessDown */ + { 0x1008ff02, 29452 }, /* XF86MonBrightnessUp */ + { 0x1008ff92, 29472 }, /* XF86Music */ + { 0x1008ff33, 29482 }, /* XF86MyComputer */ + { 0x1008ff67, 29497 }, /* XF86MySites */ + { 0x1008ff68, 29509 }, /* XF86New */ + { 0x1008ff69, 29517 }, /* XF86News */ + { 0x1008fe22, 29526 }, /* XF86Next_VMode */ + { 0x10081270, 29541 }, /* XF86NextFavorite */ + { 0x100811bc, 29558 }, /* XF86NotificationCenter */ + { 0x10081200, 29581 }, /* XF86Numeric0 */ + { 0x10081201, 29594 }, /* XF86Numeric1 */ + { 0x1008126c, 29607 }, /* XF86Numeric11 */ + { 0x1008126d, 29621 }, /* XF86Numeric12 */ + { 0x10081202, 29635 }, /* XF86Numeric2 */ + { 0x10081203, 29648 }, /* XF86Numeric3 */ + { 0x10081204, 29661 }, /* XF86Numeric4 */ + { 0x10081205, 29674 }, /* XF86Numeric5 */ + { 0x10081206, 29687 }, /* XF86Numeric6 */ + { 0x10081207, 29700 }, /* XF86Numeric7 */ + { 0x10081208, 29713 }, /* XF86Numeric8 */ + { 0x10081209, 29726 }, /* XF86Numeric9 */ + { 0x1008120c, 29739 }, /* XF86NumericA */ + { 0x1008120d, 29752 }, /* XF86NumericB */ + { 0x1008120e, 29765 }, /* XF86NumericC */ + { 0x1008120f, 29778 }, /* XF86NumericD */ + { 0x1008120b, 29791 }, /* XF86NumericPound */ + { 0x1008120a, 29808 }, /* XF86NumericStar */ + { 0x1008ff6a, 29824 }, /* XF86OfficeHome */ + { 0x10081278, 29839 }, /* XF86OnScreenKeyboard */ + { 0x1008ff6b, 29860 }, /* XF86Open */ + { 0x1008ff38, 29869 }, /* XF86OpenURL */ + { 0x1008ff6c, 29881 }, /* XF86Option */ + { 0x1008ff6d, 29892 }, /* XF86Paste */ + { 0x10081272, 29902 }, /* XF86PauseRecord */ + { 0x1008ff6e, 29918 }, /* XF86Phone */ + { 0x100811bd, 29928 }, /* XF86PickupPhone */ + { 0x1008ff91, 29944 }, /* XF86Pictures */ + { 0x1008ff21, 29957 }, /* XF86PowerDown */ + { 0x1008ff2a, 29971 }, /* XF86PowerOff */ + { 0x100811a9, 29984 }, /* XF86Presentation */ + { 0x1008fe23, 30001 }, /* XF86Prev_VMode */ + { 0x10081279, 30016 }, /* XF86PrivacyScreenToggle */ + { 0x1008ff70, 30040 }, /* XF86Q */ + { 0x1008ffa3, 30046 }, /* XF86Red */ + { 0x1008ff29, 30054 }, /* XF86Refresh */ + { 0x1008ff73, 30066 }, /* XF86Reload */ + { 0x1008ff72, 30077 }, /* XF86Reply */ + { 0x1008ffb5, 30087 }, /* XF86RFKill */ + { 0x10081267, 30098 }, /* XF86RightDown */ + { 0x10081266, 30112 }, /* XF86RightUp */ + { 0x1008ff24, 30124 }, /* XF86RockerDown */ + { 0x1008ff25, 30139 }, /* XF86RockerEnter */ + { 0x1008ff23, 30155 }, /* XF86RockerUp */ + { 0x1008126a, 30168 }, /* XF86RootMenu */ + { 0x1008ff74, 30181 }, /* XF86RotateWindows */ + { 0x1008ff76, 30199 }, /* XF86RotationKB */ + { 0x1008ffb7, 30214 }, /* XF86RotationLockToggle */ + { 0x1008ff75, 30237 }, /* XF86RotationPB */ + { 0x1008ff77, 30252 }, /* XF86Save */ + { 0x1008ff2d, 30261 }, /* XF86ScreenSaver */ + { 0x10081245, 30277 }, /* XF86Screensaver */ + { 0x1008ff7a, 30293 }, /* XF86ScrollClick */ + { 0x1008ff79, 30309 }, /* XF86ScrollDown */ + { 0x1008ff78, 30324 }, /* XF86ScrollUp */ + { 0x1008ff1b, 30337 }, /* XF86Search */ + { 0x1008ffa0, 30348 }, /* XF86Select */ + { 0x1008127a, 30359 }, /* XF86SelectiveScreenshot */ + { 0x1008ff7b, 30383 }, /* XF86Send */ + { 0x1008ff36, 30392 }, /* XF86Shop */ + { 0x1008ff2f, 30401 }, /* XF86Sleep */ + { 0x10081276, 30411 }, /* XF86SlowReverse */ + { 0x1008ff7c, 30427 }, /* XF86Spell */ + { 0x100811b0, 30437 }, /* XF86SpellCheck */ + { 0x1008ff7d, 30452 }, /* XF86SplitScreen */ + { 0x1008ff10, 30468 }, /* XF86Standby */ + { 0x1008ff1a, 30480 }, /* XF86Start */ + { 0x1008ff28, 30490 }, /* XF86Stop */ + { 0x10081271, 30499 }, /* XF86StopRecord */ + { 0x1008ff9a, 30514 }, /* XF86Subtitle */ + { 0x1008ff7e, 30527 }, /* XF86Support */ + { 0x1008ffa7, 30539 }, /* XF86Suspend */ + { 0x1008fe01, 30551 }, /* XF86Switch_VT_1 */ + { 0x1008fe0a, 30567 }, /* XF86Switch_VT_10 */ + { 0x1008fe0b, 30584 }, /* XF86Switch_VT_11 */ + { 0x1008fe0c, 30601 }, /* XF86Switch_VT_12 */ + { 0x1008fe02, 30618 }, /* XF86Switch_VT_2 */ + { 0x1008fe03, 30634 }, /* XF86Switch_VT_3 */ + { 0x1008fe04, 30650 }, /* XF86Switch_VT_4 */ + { 0x1008fe05, 30666 }, /* XF86Switch_VT_5 */ + { 0x1008fe06, 30682 }, /* XF86Switch_VT_6 */ + { 0x1008fe07, 30698 }, /* XF86Switch_VT_7 */ + { 0x1008fe08, 30714 }, /* XF86Switch_VT_8 */ + { 0x1008fe09, 30730 }, /* XF86Switch_VT_9 */ + { 0x10081241, 30746 }, /* XF86Taskmanager */ + { 0x1008ff7f, 30762 }, /* XF86TaskPane */ + { 0x1008ff80, 30775 }, /* XF86Terminal */ + { 0x1008ff9f, 30788 }, /* XF86Time */ + { 0x1008ff1f, 30797 }, /* XF86ToDoList */ + { 0x1008ff81, 30810 }, /* XF86Tools */ + { 0x1008ffa2, 30820 }, /* XF86TopMenu */ + { 0x1008ffb1, 30832 }, /* XF86TouchpadOff */ + { 0x1008ffb0, 30848 }, /* XF86TouchpadOn */ + { 0x1008ffa9, 30863 }, /* XF86TouchpadToggle */ + { 0x1008ff82, 30882 }, /* XF86Travel */ + { 0x1008fe20, 30893 }, /* XF86Ungrab */ + { 0x10081274, 30904 }, /* XF86Unmute */ + { 0x1008ff85, 30915 }, /* XF86User1KB */ + { 0x1008ff86, 30927 }, /* XF86User2KB */ + { 0x1008ff84, 30939 }, /* XF86UserPB */ + { 0x1008ff96, 30950 }, /* XF86UWB */ + { 0x1008ff34, 30958 }, /* XF86VendorHome */ + { 0x1008ff87, 30973 }, /* XF86Video */ + { 0x100811a0, 30983 }, /* XF86VideoPhone */ + { 0x1008ffa1, 30998 }, /* XF86View */ + { 0x10081273, 31007 }, /* XF86VOD */ + { 0x10081246, 31015 }, /* XF86VoiceCommand */ + { 0x100811ac, 31032 }, /* XF86Voicemail */ + { 0x1008ff2b, 31046 }, /* XF86WakeUp */ + { 0x1008ff8f, 31057 }, /* XF86WebCam */ + { 0x1008ff88, 31068 }, /* XF86WheelButton */ + { 0x1008ff95, 31084 }, /* XF86WLAN */ + { 0x1008ff89, 31093 }, /* XF86Word */ + { 0x10081211, 31102 }, /* XF86WPSButton */ + { 0x1008ffb4, 31116 }, /* XF86WWAN */ + { 0x1008ff2e, 31125 }, /* XF86WWW */ + { 0x1008ff8a, 31133 }, /* XF86Xfer */ + { 0x1008ffa5, 31142 }, /* XF86Yellow */ + { 0x1008ff8b, 31153 }, /* XF86ZoomIn */ + { 0x1008ff8c, 31164 }, /* XF86ZoomOut */ + { 0x100811a4, 31176 }, /* XF86ZoomReset */ + { 0x00000059, 31190 }, /* Y */ + { 0x00000079, 31192 }, /* y */ + { 0x000000dd, 31194 }, /* Yacute */ + { 0x000000fd, 31201 }, /* yacute */ + { 0x01001ef4, 31208 }, /* Ybelowdot */ + { 0x01001ef5, 31218 }, /* ybelowdot */ + { 0x01000176, 31228 }, /* Ycircumflex */ + { 0x01000177, 31240 }, /* ycircumflex */ + { 0x000000ff, 31252 }, /* ydiaeresis */ + { 0x000013be, 31263 }, /* Ydiaeresis */ + { 0x000000a5, 31274 }, /* yen */ + { 0x01001ef2, 31278 }, /* Ygrave */ + { 0x01001ef3, 31285 }, /* ygrave */ + { 0x01001ef6, 31292 }, /* Yhook */ + { 0x01001ef7, 31298 }, /* yhook */ + { 0x01001ef8, 31304 }, /* Ytilde */ + { 0x01001ef9, 31311 }, /* ytilde */ + { 0x0000005a, 31318 }, /* Z */ + { 0x0000007a, 31320 }, /* z */ + { 0x000001af, 31322 }, /* Zabovedot */ + { 0x000001bf, 31332 }, /* zabovedot */ + { 0x000001ac, 31342 }, /* Zacute */ + { 0x000001bc, 31349 }, /* zacute */ + { 0x000001ae, 31356 }, /* Zcaron */ + { 0x000001be, 31363 }, /* zcaron */ + { 0x0000ff3d, 31370 }, /* Zen_Koho */ + { 0x0000ff28, 31379 }, /* Zenkaku */ + { 0x0000ff2a, 31387 }, /* Zenkaku_Hankaku */ + { 0x01002080, 31403 }, /* zerosubscript */ + { 0x01002070, 31417 }, /* zerosuperior */ + { 0x010001b5, 31430 }, /* Zstroke */ + { 0x010001b6, 31438 }, /* zstroke */ }; static const struct name_keysym keysym_to_name[] = { - { 0x00000000, 20091 }, /* NoSymbol */ - { 0x00000020, 23803 }, /* space */ - { 0x00000021, 12099 }, /* exclam */ - { 0x00000022, 22187 }, /* quotedbl */ - { 0x00000023, 20178 }, /* numbersign */ - { 0x00000024, 11251 }, /* dollar */ - { 0x00000025, 21487 }, /* percent */ + { 0x00000000, 20173 }, /* NoSymbol */ + { 0x00000020, 23885 }, /* space */ + { 0x00000021, 12181 }, /* exclam */ + { 0x00000022, 22269 }, /* quotedbl */ + { 0x00000023, 20260 }, /* numbersign */ + { 0x00000024, 11333 }, /* dollar */ + { 0x00000025, 21569 }, /* percent */ { 0x00000026, 908 }, /* ampersand */ { 0x00000027, 934 }, /* apostrophe */ - { 0x00000028, 21425 }, /* parenleft */ - { 0x00000029, 21435 }, /* parenright */ + { 0x00000028, 21507 }, /* parenleft */ + { 0x00000029, 21517 }, /* parenright */ { 0x0000002a, 3283 }, /* asterisk */ - { 0x0000002b, 21557 }, /* plus */ - { 0x0000002c, 8680 }, /* comma */ - { 0x0000002d, 19733 }, /* minus */ - { 0x0000002e, 21495 }, /* period */ - { 0x0000002f, 23768 }, /* slash */ + { 0x0000002b, 21639 }, /* plus */ + { 0x0000002c, 8762 }, /* comma */ + { 0x0000002d, 19815 }, /* minus */ + { 0x0000002e, 21577 }, /* period */ + { 0x0000002f, 23850 }, /* slash */ { 0x00000030, 0 }, /* 0 */ { 0x00000031, 2 }, /* 1 */ { 0x00000032, 4 }, /* 2 */ @@ -4870,106 +5471,106 @@ static const struct name_keysym keysym_to_name[] = { { 0x00000038, 394 }, /* 8 */ { 0x00000039, 396 }, /* 9 */ { 0x0000003a, 8664 }, /* colon */ - { 0x0000003b, 22734 }, /* semicolon */ - { 0x0000003c, 19412 }, /* less */ - { 0x0000003d, 12051 }, /* equal */ - { 0x0000003e, 13272 }, /* greater */ - { 0x0000003f, 22165 }, /* question */ + { 0x0000003b, 22816 }, /* semicolon */ + { 0x0000003c, 19494 }, /* less */ + { 0x0000003d, 12133 }, /* equal */ + { 0x0000003e, 13354 }, /* greater */ + { 0x0000003f, 22247 }, /* question */ { 0x00000040, 3292 }, /* at */ { 0x00000041, 398 }, /* A */ { 0x00000042, 3328 }, /* B */ { 0x00000043, 8439 }, /* C */ - { 0x00000044, 10320 }, /* D */ - { 0x00000045, 11424 }, /* E */ - { 0x00000046, 12155 }, /* F */ - { 0x00000047, 12665 }, /* G */ - { 0x00000048, 14378 }, /* H */ - { 0x00000049, 17069 }, /* I */ - { 0x0000004a, 18114 }, /* J */ - { 0x0000004b, 18146 }, /* K */ - { 0x0000004c, 19112 }, /* L */ - { 0x0000004d, 19533 }, /* M */ - { 0x0000004e, 19943 }, /* N */ - { 0x0000004f, 20200 }, /* O */ - { 0x00000050, 21373 }, /* P */ - { 0x00000051, 22156 }, /* Q */ - { 0x00000052, 22217 }, /* R */ - { 0x00000053, 22579 }, /* S */ - { 0x00000054, 24294 }, /* T */ - { 0x00000055, 25847 }, /* U */ - { 0x00000056, 26483 }, /* V */ - { 0x00000057, 26545 }, /* W */ - { 0x00000058, 26631 }, /* X */ - { 0x00000059, 29082 }, /* Y */ - { 0x0000005a, 29210 }, /* Z */ + { 0x00000044, 10402 }, /* D */ + { 0x00000045, 11506 }, /* E */ + { 0x00000046, 12237 }, /* F */ + { 0x00000047, 12747 }, /* G */ + { 0x00000048, 14460 }, /* H */ + { 0x00000049, 17151 }, /* I */ + { 0x0000004a, 18196 }, /* J */ + { 0x0000004b, 18228 }, /* K */ + { 0x0000004c, 19194 }, /* L */ + { 0x0000004d, 19615 }, /* M */ + { 0x0000004e, 20025 }, /* N */ + { 0x0000004f, 20282 }, /* O */ + { 0x00000050, 21455 }, /* P */ + { 0x00000051, 22238 }, /* Q */ + { 0x00000052, 22299 }, /* R */ + { 0x00000053, 22661 }, /* S */ + { 0x00000054, 24376 }, /* T */ + { 0x00000055, 25929 }, /* U */ + { 0x00000056, 26565 }, /* V */ + { 0x00000057, 26627 }, /* W */ + { 0x00000058, 26713 }, /* X */ + { 0x00000059, 31190 }, /* Y */ + { 0x0000005a, 31318 }, /* Z */ { 0x0000005b, 3603 }, /* bracketleft */ { 0x0000005c, 3352 }, /* backslash */ { 0x0000005d, 3615 }, /* bracketright */ { 0x0000005e, 3260 }, /* asciicircum */ - { 0x0000005f, 26346 }, /* underscore */ - { 0x00000060, 13266 }, /* grave */ + { 0x0000005f, 26428 }, /* underscore */ + { 0x00000060, 13348 }, /* grave */ { 0x00000061, 400 }, /* a */ { 0x00000062, 3330 }, /* b */ { 0x00000063, 8441 }, /* c */ - { 0x00000064, 10322 }, /* d */ - { 0x00000065, 11426 }, /* e */ - { 0x00000066, 12157 }, /* f */ - { 0x00000067, 12667 }, /* g */ - { 0x00000068, 14380 }, /* h */ - { 0x00000069, 17071 }, /* i */ - { 0x0000006a, 18116 }, /* j */ - { 0x0000006b, 18148 }, /* k */ - { 0x0000006c, 19114 }, /* l */ - { 0x0000006d, 19535 }, /* m */ - { 0x0000006e, 19945 }, /* n */ - { 0x0000006f, 20202 }, /* o */ - { 0x00000070, 21375 }, /* p */ - { 0x00000071, 22158 }, /* q */ - { 0x00000072, 22219 }, /* r */ - { 0x00000073, 22581 }, /* s */ - { 0x00000074, 24296 }, /* t */ - { 0x00000075, 25849 }, /* u */ - { 0x00000076, 26485 }, /* v */ - { 0x00000077, 26547 }, /* w */ - { 0x00000078, 26633 }, /* x */ - { 0x00000079, 29084 }, /* y */ - { 0x0000007a, 29212 }, /* z */ + { 0x00000064, 10404 }, /* d */ + { 0x00000065, 11508 }, /* e */ + { 0x00000066, 12239 }, /* f */ + { 0x00000067, 12749 }, /* g */ + { 0x00000068, 14462 }, /* h */ + { 0x00000069, 17153 }, /* i */ + { 0x0000006a, 18198 }, /* j */ + { 0x0000006b, 18230 }, /* k */ + { 0x0000006c, 19196 }, /* l */ + { 0x0000006d, 19617 }, /* m */ + { 0x0000006e, 20027 }, /* n */ + { 0x0000006f, 20284 }, /* o */ + { 0x00000070, 21457 }, /* p */ + { 0x00000071, 22240 }, /* q */ + { 0x00000072, 22301 }, /* r */ + { 0x00000073, 22663 }, /* s */ + { 0x00000074, 24378 }, /* t */ + { 0x00000075, 25931 }, /* u */ + { 0x00000076, 26567 }, /* v */ + { 0x00000077, 26629 }, /* w */ + { 0x00000078, 26715 }, /* x */ + { 0x00000079, 31192 }, /* y */ + { 0x0000007a, 31320 }, /* z */ { 0x0000007b, 3582 }, /* braceleft */ { 0x0000007c, 3392 }, /* bar */ { 0x0000007d, 3592 }, /* braceright */ { 0x0000007e, 3272 }, /* asciitilde */ - { 0x000000a0, 20078 }, /* nobreakspace */ - { 0x000000a1, 12106 }, /* exclamdown */ + { 0x000000a0, 20160 }, /* nobreakspace */ + { 0x000000a1, 12188 }, /* exclamdown */ { 0x000000a2, 8589 }, /* cent */ - { 0x000000a3, 23827 }, /* sterling */ - { 0x000000a4, 8766 }, /* currency */ - { 0x000000a5, 29166 }, /* yen */ + { 0x000000a3, 23909 }, /* sterling */ + { 0x000000a4, 8848 }, /* currency */ + { 0x000000a5, 31274 }, /* yen */ { 0x000000a6, 8389 }, /* brokenbar */ - { 0x000000a7, 22719 }, /* section */ - { 0x000000a8, 11203 }, /* diaeresis */ - { 0x000000a9, 8717 }, /* copyright */ - { 0x000000aa, 20852 }, /* ordfeminine */ - { 0x000000ab, 14349 }, /* guillemotleft */ - { 0x000000ac, 20147 }, /* notsign */ - { 0x000000ad, 17062 }, /* hyphen */ - { 0x000000ae, 22331 }, /* registered */ - { 0x000000af, 19641 }, /* macron */ - { 0x000000b0, 11153 }, /* degree */ - { 0x000000b1, 21562 }, /* plusminus */ - { 0x000000b2, 25825 }, /* twosuperior */ - { 0x000000b3, 25571 }, /* threesuperior */ + { 0x000000a7, 22801 }, /* section */ + { 0x000000a8, 11285 }, /* diaeresis */ + { 0x000000a9, 8799 }, /* copyright */ + { 0x000000aa, 20934 }, /* ordfeminine */ + { 0x000000ab, 14431 }, /* guillemotleft */ + { 0x000000ac, 20229 }, /* notsign */ + { 0x000000ad, 17144 }, /* hyphen */ + { 0x000000ae, 22413 }, /* registered */ + { 0x000000af, 19723 }, /* macron */ + { 0x000000b0, 11235 }, /* degree */ + { 0x000000b1, 21644 }, /* plusminus */ + { 0x000000b2, 25907 }, /* twosuperior */ + { 0x000000b3, 25653 }, /* threesuperior */ { 0x000000b4, 820 }, /* acute */ - { 0x000000b5, 19799 }, /* mu */ - { 0x000000b6, 21415 }, /* paragraph */ - { 0x000000b7, 21502 }, /* periodcentered */ + { 0x000000b5, 19881 }, /* mu */ + { 0x000000b6, 21497 }, /* paragraph */ + { 0x000000b7, 21584 }, /* periodcentered */ { 0x000000b8, 8581 }, /* cedilla */ - { 0x000000b9, 20755 }, /* onesuperior */ - { 0x000000ba, 19688 }, /* masculine */ - { 0x000000bb, 14363 }, /* guillemotright */ - { 0x000000bc, 20722 }, /* onequarter */ - { 0x000000bd, 20714 }, /* onehalf */ - { 0x000000be, 25542 }, /* threequarters */ - { 0x000000bf, 22174 }, /* questiondown */ + { 0x000000b9, 20837 }, /* onesuperior */ + { 0x000000ba, 19770 }, /* masculine */ + { 0x000000bb, 14445 }, /* guillemotright */ + { 0x000000bc, 20804 }, /* onequarter */ + { 0x000000bd, 20796 }, /* onehalf */ + { 0x000000be, 25624 }, /* threequarters */ + { 0x000000bf, 22256 }, /* questiondown */ { 0x000000c0, 854 }, /* Agrave */ { 0x000000c1, 402 }, /* Aacute */ { 0x000000c2, 622 }, /* Acircumflex */ @@ -4978,30 +5579,30 @@ static const struct name_keysym keysym_to_name[] = { { 0x000000c5, 2036 }, /* Aring */ { 0x000000c6, 848 }, /* AE */ { 0x000000c7, 8539 }, /* Ccedilla */ - { 0x000000c8, 11724 }, /* Egrave */ - { 0x000000c9, 11448 }, /* Eacute */ - { 0x000000ca, 11496 }, /* Ecircumflex */ - { 0x000000cb, 11702 }, /* Ediaeresis */ - { 0x000000cc, 17205 }, /* Igrave */ - { 0x000000cd, 17083 }, /* Iacute */ - { 0x000000ce, 17131 }, /* Icircumflex */ - { 0x000000cf, 17165 }, /* Idiaeresis */ - { 0x000000d0, 12064 }, /* ETH */ - { 0x000000d1, 20155 }, /* Ntilde */ - { 0x000000d2, 20527 }, /* Ograve */ - { 0x000000d3, 20204 }, /* Oacute */ - { 0x000000d4, 20268 }, /* Ocircumflex */ - { 0x000000d5, 21310 }, /* Otilde */ - { 0x000000d6, 20466 }, /* Odiaeresis */ - { 0x000000d7, 19839 }, /* multiply */ - { 0x000000d8, 21296 }, /* Oslash */ - { 0x000000d9, 25971 }, /* Ugrave */ - { 0x000000da, 25851 }, /* Uacute */ - { 0x000000db, 25899 }, /* Ucircumflex */ - { 0x000000dc, 25923 }, /* Udiaeresis */ - { 0x000000dd, 29086 }, /* Yacute */ - { 0x000000de, 25499 }, /* THORN */ - { 0x000000df, 23820 }, /* ssharp */ + { 0x000000c8, 11806 }, /* Egrave */ + { 0x000000c9, 11530 }, /* Eacute */ + { 0x000000ca, 11578 }, /* Ecircumflex */ + { 0x000000cb, 11784 }, /* Ediaeresis */ + { 0x000000cc, 17287 }, /* Igrave */ + { 0x000000cd, 17165 }, /* Iacute */ + { 0x000000ce, 17213 }, /* Icircumflex */ + { 0x000000cf, 17247 }, /* Idiaeresis */ + { 0x000000d0, 12146 }, /* ETH */ + { 0x000000d1, 20237 }, /* Ntilde */ + { 0x000000d2, 20609 }, /* Ograve */ + { 0x000000d3, 20286 }, /* Oacute */ + { 0x000000d4, 20350 }, /* Ocircumflex */ + { 0x000000d5, 21392 }, /* Otilde */ + { 0x000000d6, 20548 }, /* Odiaeresis */ + { 0x000000d7, 19921 }, /* multiply */ + { 0x000000d8, 21378 }, /* Oslash */ + { 0x000000d9, 26053 }, /* Ugrave */ + { 0x000000da, 25933 }, /* Uacute */ + { 0x000000db, 25981 }, /* Ucircumflex */ + { 0x000000dc, 26005 }, /* Udiaeresis */ + { 0x000000dd, 31194 }, /* Yacute */ + { 0x000000de, 25581 }, /* THORN */ + { 0x000000df, 23902 }, /* ssharp */ { 0x000000e0, 861 }, /* agrave */ { 0x000000e1, 409 }, /* aacute */ { 0x000000e2, 634 }, /* acircumflex */ @@ -5010,208 +5611,208 @@ static const struct name_keysym keysym_to_name[] = { { 0x000000e5, 2042 }, /* aring */ { 0x000000e6, 851 }, /* ae */ { 0x000000e7, 8548 }, /* ccedilla */ - { 0x000000e8, 11731 }, /* egrave */ - { 0x000000e9, 11455 }, /* eacute */ - { 0x000000ea, 11508 }, /* ecircumflex */ - { 0x000000eb, 11713 }, /* ediaeresis */ - { 0x000000ec, 17212 }, /* igrave */ - { 0x000000ed, 17090 }, /* iacute */ - { 0x000000ee, 17143 }, /* icircumflex */ - { 0x000000ef, 17176 }, /* idiaeresis */ - { 0x000000f0, 12072 }, /* eth */ - { 0x000000f1, 20162 }, /* ntilde */ - { 0x000000f2, 20534 }, /* ograve */ - { 0x000000f3, 20211 }, /* oacute */ - { 0x000000f4, 20280 }, /* ocircumflex */ - { 0x000000f5, 21317 }, /* otilde */ - { 0x000000f6, 20477 }, /* odiaeresis */ - { 0x000000f7, 11242 }, /* division */ - { 0x000000f8, 21303 }, /* oslash */ - { 0x000000f9, 25978 }, /* ugrave */ - { 0x000000fa, 25858 }, /* uacute */ - { 0x000000fb, 25911 }, /* ucircumflex */ - { 0x000000fc, 25934 }, /* udiaeresis */ - { 0x000000fd, 29093 }, /* yacute */ - { 0x000000fe, 25511 }, /* thorn */ - { 0x000000ff, 29144 }, /* ydiaeresis */ + { 0x000000e8, 11813 }, /* egrave */ + { 0x000000e9, 11537 }, /* eacute */ + { 0x000000ea, 11590 }, /* ecircumflex */ + { 0x000000eb, 11795 }, /* ediaeresis */ + { 0x000000ec, 17294 }, /* igrave */ + { 0x000000ed, 17172 }, /* iacute */ + { 0x000000ee, 17225 }, /* icircumflex */ + { 0x000000ef, 17258 }, /* idiaeresis */ + { 0x000000f0, 12154 }, /* eth */ + { 0x000000f1, 20244 }, /* ntilde */ + { 0x000000f2, 20616 }, /* ograve */ + { 0x000000f3, 20293 }, /* oacute */ + { 0x000000f4, 20362 }, /* ocircumflex */ + { 0x000000f5, 21399 }, /* otilde */ + { 0x000000f6, 20559 }, /* odiaeresis */ + { 0x000000f7, 11324 }, /* division */ + { 0x000000f8, 21385 }, /* oslash */ + { 0x000000f9, 26060 }, /* ugrave */ + { 0x000000fa, 25940 }, /* uacute */ + { 0x000000fb, 25993 }, /* ucircumflex */ + { 0x000000fc, 26016 }, /* udiaeresis */ + { 0x000000fd, 31201 }, /* yacute */ + { 0x000000fe, 25593 }, /* thorn */ + { 0x000000ff, 31252 }, /* ydiaeresis */ { 0x000001a1, 918 }, /* Aogonek */ { 0x000001a2, 8383 }, /* breve */ - { 0x000001a3, 19517 }, /* Lstroke */ - { 0x000001a5, 19212 }, /* Lcaron */ - { 0x000001a6, 22603 }, /* Sacute */ - { 0x000001a9, 22617 }, /* Scaron */ - { 0x000001aa, 22631 }, /* Scedilla */ - { 0x000001ab, 24322 }, /* Tcaron */ - { 0x000001ac, 29234 }, /* Zacute */ - { 0x000001ae, 29248 }, /* Zcaron */ - { 0x000001af, 29214 }, /* Zabovedot */ + { 0x000001a3, 19599 }, /* Lstroke */ + { 0x000001a5, 19294 }, /* Lcaron */ + { 0x000001a6, 22685 }, /* Sacute */ + { 0x000001a9, 22699 }, /* Scaron */ + { 0x000001aa, 22713 }, /* Scedilla */ + { 0x000001ab, 24404 }, /* Tcaron */ + { 0x000001ac, 31342 }, /* Zacute */ + { 0x000001ae, 31356 }, /* Zcaron */ + { 0x000001af, 31322 }, /* Zabovedot */ { 0x000001b1, 926 }, /* aogonek */ - { 0x000001b2, 20520 }, /* ogonek */ - { 0x000001b3, 19525 }, /* lstroke */ - { 0x000001b5, 19219 }, /* lcaron */ - { 0x000001b6, 22610 }, /* sacute */ + { 0x000001b2, 20602 }, /* ogonek */ + { 0x000001b3, 19607 }, /* lstroke */ + { 0x000001b5, 19301 }, /* lcaron */ + { 0x000001b6, 22692 }, /* sacute */ { 0x000001b7, 8519 }, /* caron */ - { 0x000001b9, 22624 }, /* scaron */ - { 0x000001ba, 22640 }, /* scedilla */ - { 0x000001bb, 24329 }, /* tcaron */ - { 0x000001bc, 29241 }, /* zacute */ - { 0x000001bd, 11283 }, /* doubleacute */ - { 0x000001be, 29255 }, /* zcaron */ - { 0x000001bf, 29224 }, /* zabovedot */ - { 0x000001c0, 22272 }, /* Racute */ + { 0x000001b9, 22706 }, /* scaron */ + { 0x000001ba, 22722 }, /* scedilla */ + { 0x000001bb, 24411 }, /* tcaron */ + { 0x000001bc, 31349 }, /* zacute */ + { 0x000001bd, 11365 }, /* doubleacute */ + { 0x000001be, 31363 }, /* zcaron */ + { 0x000001bf, 31332 }, /* zabovedot */ + { 0x000001c0, 22354 }, /* Racute */ { 0x000001c3, 445 }, /* Abreve */ - { 0x000001c5, 19147 }, /* Lacute */ + { 0x000001c5, 19229 }, /* Lacute */ { 0x000001c6, 8475 }, /* Cacute */ { 0x000001c8, 8525 }, /* Ccaron */ - { 0x000001ca, 12035 }, /* Eogonek */ - { 0x000001cc, 11482 }, /* Ecaron */ - { 0x000001cf, 10365 }, /* Dcaron */ - { 0x000001d0, 11401 }, /* Dstroke */ - { 0x000001d1, 19953 }, /* Nacute */ - { 0x000001d2, 19977 }, /* Ncaron */ - { 0x000001d5, 20488 }, /* Odoubleacute */ - { 0x000001d8, 22294 }, /* Rcaron */ - { 0x000001d9, 26452 }, /* Uring */ - { 0x000001db, 25945 }, /* Udoubleacute */ - { 0x000001de, 24336 }, /* Tcedilla */ - { 0x000001e0, 22279 }, /* racute */ + { 0x000001ca, 12117 }, /* Eogonek */ + { 0x000001cc, 11564 }, /* Ecaron */ + { 0x000001cf, 10447 }, /* Dcaron */ + { 0x000001d0, 11483 }, /* Dstroke */ + { 0x000001d1, 20035 }, /* Nacute */ + { 0x000001d2, 20059 }, /* Ncaron */ + { 0x000001d5, 20570 }, /* Odoubleacute */ + { 0x000001d8, 22376 }, /* Rcaron */ + { 0x000001d9, 26534 }, /* Uring */ + { 0x000001db, 26027 }, /* Udoubleacute */ + { 0x000001de, 24418 }, /* Tcedilla */ + { 0x000001e0, 22361 }, /* racute */ { 0x000001e3, 452 }, /* abreve */ - { 0x000001e5, 19154 }, /* lacute */ + { 0x000001e5, 19236 }, /* lacute */ { 0x000001e6, 8482 }, /* cacute */ { 0x000001e8, 8532 }, /* ccaron */ - { 0x000001ea, 12043 }, /* eogonek */ - { 0x000001ec, 11489 }, /* ecaron */ - { 0x000001ef, 10372 }, /* dcaron */ - { 0x000001f0, 11409 }, /* dstroke */ - { 0x000001f1, 19960 }, /* nacute */ - { 0x000001f2, 19984 }, /* ncaron */ - { 0x000001f5, 20501 }, /* odoubleacute */ - { 0x000001f8, 22301 }, /* rcaron */ - { 0x000001f9, 26458 }, /* uring */ - { 0x000001fb, 25958 }, /* udoubleacute */ - { 0x000001fe, 24345 }, /* tcedilla */ + { 0x000001ea, 12125 }, /* eogonek */ + { 0x000001ec, 11571 }, /* ecaron */ + { 0x000001ef, 10454 }, /* dcaron */ + { 0x000001f0, 11491 }, /* dstroke */ + { 0x000001f1, 20042 }, /* nacute */ + { 0x000001f2, 20066 }, /* ncaron */ + { 0x000001f5, 20583 }, /* odoubleacute */ + { 0x000001f8, 22383 }, /* rcaron */ + { 0x000001f9, 26540 }, /* uring */ + { 0x000001fb, 26040 }, /* udoubleacute */ + { 0x000001fe, 24427 }, /* tcedilla */ { 0x000001ff, 436 }, /* abovedot */ - { 0x000002a1, 17027 }, /* Hstroke */ - { 0x000002a6, 16056 }, /* Hcircumflex */ - { 0x000002a9, 17073 }, /* Iabovedot */ - { 0x000002ab, 12689 }, /* Gbreve */ - { 0x000002ac, 18118 }, /* Jcircumflex */ - { 0x000002b1, 17035 }, /* hstroke */ - { 0x000002b6, 16068 }, /* hcircumflex */ - { 0x000002b9, 17187 }, /* idotless */ - { 0x000002bb, 12696 }, /* gbreve */ - { 0x000002bc, 18130 }, /* jcircumflex */ + { 0x000002a1, 17109 }, /* Hstroke */ + { 0x000002a6, 16138 }, /* Hcircumflex */ + { 0x000002a9, 17155 }, /* Iabovedot */ + { 0x000002ab, 12771 }, /* Gbreve */ + { 0x000002ac, 18200 }, /* Jcircumflex */ + { 0x000002b1, 17117 }, /* hstroke */ + { 0x000002b6, 16150 }, /* hcircumflex */ + { 0x000002b9, 17269 }, /* idotless */ + { 0x000002bb, 12778 }, /* gbreve */ + { 0x000002bc, 18212 }, /* jcircumflex */ { 0x000002c5, 8455 }, /* Cabovedot */ { 0x000002c6, 8557 }, /* Ccircumflex */ - { 0x000002d5, 12669 }, /* Gabovedot */ - { 0x000002d8, 12735 }, /* Gcircumflex */ - { 0x000002dd, 25885 }, /* Ubreve */ - { 0x000002de, 22661 }, /* Scircumflex */ + { 0x000002d5, 12751 }, /* Gabovedot */ + { 0x000002d8, 12817 }, /* Gcircumflex */ + { 0x000002dd, 25967 }, /* Ubreve */ + { 0x000002de, 22743 }, /* Scircumflex */ { 0x000002e5, 8465 }, /* cabovedot */ { 0x000002e6, 8569 }, /* ccircumflex */ - { 0x000002f5, 12679 }, /* gabovedot */ - { 0x000002f8, 12747 }, /* gcircumflex */ - { 0x000002fd, 25892 }, /* ubreve */ - { 0x000002fe, 22673 }, /* scircumflex */ - { 0x000003a2, 19108 }, /* kra */ - { 0x000003a3, 22308 }, /* Rcedilla */ - { 0x000003a5, 18100 }, /* Itilde */ - { 0x000003a6, 19226 }, /* Lcedilla */ - { 0x000003aa, 11839 }, /* Emacron */ - { 0x000003ab, 12717 }, /* Gcedilla */ - { 0x000003ac, 25788 }, /* Tslash */ - { 0x000003b3, 22317 }, /* rcedilla */ - { 0x000003b5, 18107 }, /* itilde */ - { 0x000003b6, 19235 }, /* lcedilla */ - { 0x000003ba, 11847 }, /* emacron */ - { 0x000003bb, 12726 }, /* gcedilla */ - { 0x000003bc, 25795 }, /* tslash */ - { 0x000003bd, 11983 }, /* ENG */ - { 0x000003bf, 11987 }, /* eng */ + { 0x000002f5, 12761 }, /* gabovedot */ + { 0x000002f8, 12829 }, /* gcircumflex */ + { 0x000002fd, 25974 }, /* ubreve */ + { 0x000002fe, 22755 }, /* scircumflex */ + { 0x000003a2, 19190 }, /* kra */ + { 0x000003a3, 22390 }, /* Rcedilla */ + { 0x000003a5, 18182 }, /* Itilde */ + { 0x000003a6, 19308 }, /* Lcedilla */ + { 0x000003aa, 11921 }, /* Emacron */ + { 0x000003ab, 12799 }, /* Gcedilla */ + { 0x000003ac, 25870 }, /* Tslash */ + { 0x000003b3, 22399 }, /* rcedilla */ + { 0x000003b5, 18189 }, /* itilde */ + { 0x000003b6, 19317 }, /* lcedilla */ + { 0x000003ba, 11929 }, /* emacron */ + { 0x000003bb, 12808 }, /* gcedilla */ + { 0x000003bc, 25877 }, /* tslash */ + { 0x000003bd, 12065 }, /* ENG */ + { 0x000003bf, 12069 }, /* eng */ { 0x000003c0, 892 }, /* Amacron */ - { 0x000003c7, 17338 }, /* Iogonek */ - { 0x000003cc, 11428 }, /* Eabovedot */ - { 0x000003cf, 17231 }, /* Imacron */ - { 0x000003d1, 19991 }, /* Ncedilla */ - { 0x000003d2, 20679 }, /* Omacron */ - { 0x000003d3, 18779 }, /* Kcedilla */ - { 0x000003d9, 26368 }, /* Uogonek */ - { 0x000003dd, 26469 }, /* Utilde */ - { 0x000003de, 26321 }, /* Umacron */ + { 0x000003c7, 17420 }, /* Iogonek */ + { 0x000003cc, 11510 }, /* Eabovedot */ + { 0x000003cf, 17313 }, /* Imacron */ + { 0x000003d1, 20073 }, /* Ncedilla */ + { 0x000003d2, 20761 }, /* Omacron */ + { 0x000003d3, 18861 }, /* Kcedilla */ + { 0x000003d9, 26450 }, /* Uogonek */ + { 0x000003dd, 26551 }, /* Utilde */ + { 0x000003de, 26403 }, /* Umacron */ { 0x000003e0, 900 }, /* amacron */ - { 0x000003e7, 17346 }, /* iogonek */ - { 0x000003ec, 11438 }, /* eabovedot */ - { 0x000003ef, 17239 }, /* imacron */ - { 0x000003f1, 20000 }, /* ncedilla */ - { 0x000003f2, 20687 }, /* omacron */ - { 0x000003f3, 18788 }, /* kcedilla */ - { 0x000003f9, 26376 }, /* uogonek */ - { 0x000003fd, 26476 }, /* utilde */ - { 0x000003fe, 26329 }, /* umacron */ - { 0x0000047e, 21364 }, /* overline */ - { 0x000004a1, 18243 }, /* kana_fullstop */ - { 0x000004a2, 18477 }, /* kana_openingbracket */ - { 0x000004a3, 18173 }, /* kana_closingbracket */ - { 0x000004a4, 18193 }, /* kana_comma */ - { 0x000004a5, 18204 }, /* kana_conjunctive */ - { 0x000004a6, 18689 }, /* kana_WO */ - { 0x000004a7, 18150 }, /* kana_a */ - { 0x000004a8, 18297 }, /* kana_i */ - { 0x000004a9, 18667 }, /* kana_u */ - { 0x000004aa, 18221 }, /* kana_e */ - { 0x000004ab, 18463 }, /* kana_o */ - { 0x000004ac, 18697 }, /* kana_ya */ - { 0x000004ad, 18729 }, /* kana_yu */ - { 0x000004ae, 18713 }, /* kana_yo */ - { 0x000004af, 18633 }, /* kana_tsu */ - { 0x000004b0, 22130 }, /* prolongedsound */ - { 0x000004b1, 18157 }, /* kana_A */ - { 0x000004b2, 18304 }, /* kana_I */ - { 0x000004b3, 18674 }, /* kana_U */ - { 0x000004b4, 18228 }, /* kana_E */ - { 0x000004b5, 18470 }, /* kana_O */ - { 0x000004b6, 18311 }, /* kana_KA */ - { 0x000004b7, 18327 }, /* kana_KI */ - { 0x000004b8, 18343 }, /* kana_KU */ - { 0x000004b9, 18319 }, /* kana_KE */ - { 0x000004ba, 18335 }, /* kana_KO */ - { 0x000004bb, 18537 }, /* kana_SA */ - { 0x000004bc, 18553 }, /* kana_SHI */ - { 0x000004bd, 18581 }, /* kana_SU */ - { 0x000004be, 18545 }, /* kana_SE */ - { 0x000004bf, 18573 }, /* kana_SO */ - { 0x000004c0, 18601 }, /* kana_TA */ - { 0x000004c1, 18164 }, /* kana_CHI */ - { 0x000004c2, 18642 }, /* kana_TSU */ - { 0x000004c3, 18609 }, /* kana_TE */ - { 0x000004c4, 18625 }, /* kana_TO */ - { 0x000004c5, 18423 }, /* kana_NA */ - { 0x000004c6, 18439 }, /* kana_NI */ - { 0x000004c7, 18455 }, /* kana_NU */ - { 0x000004c8, 18431 }, /* kana_NE */ - { 0x000004c9, 18447 }, /* kana_NO */ - { 0x000004ca, 18257 }, /* kana_HA */ - { 0x000004cb, 18273 }, /* kana_HI */ - { 0x000004cc, 18235 }, /* kana_FU */ - { 0x000004cd, 18265 }, /* kana_HE */ - { 0x000004ce, 18281 }, /* kana_HO */ - { 0x000004cf, 18361 }, /* kana_MA */ - { 0x000004d0, 18377 }, /* kana_MI */ - { 0x000004d1, 18408 }, /* kana_MU */ - { 0x000004d2, 18369 }, /* kana_ME */ - { 0x000004d3, 18400 }, /* kana_MO */ - { 0x000004d4, 18705 }, /* kana_YA */ - { 0x000004d5, 18737 }, /* kana_YU */ - { 0x000004d6, 18721 }, /* kana_YO */ - { 0x000004d7, 18497 }, /* kana_RA */ - { 0x000004d8, 18513 }, /* kana_RI */ - { 0x000004d9, 18529 }, /* kana_RU */ - { 0x000004da, 18505 }, /* kana_RE */ - { 0x000004db, 18521 }, /* kana_RO */ - { 0x000004dc, 18681 }, /* kana_WA */ - { 0x000004dd, 18416 }, /* kana_N */ - { 0x000004de, 26519 }, /* voicedsound */ - { 0x000004df, 22744 }, /* semivoicedsound */ + { 0x000003e7, 17428 }, /* iogonek */ + { 0x000003ec, 11520 }, /* eabovedot */ + { 0x000003ef, 17321 }, /* imacron */ + { 0x000003f1, 20082 }, /* ncedilla */ + { 0x000003f2, 20769 }, /* omacron */ + { 0x000003f3, 18870 }, /* kcedilla */ + { 0x000003f9, 26458 }, /* uogonek */ + { 0x000003fd, 26558 }, /* utilde */ + { 0x000003fe, 26411 }, /* umacron */ + { 0x0000047e, 21446 }, /* overline */ + { 0x000004a1, 18325 }, /* kana_fullstop */ + { 0x000004a2, 18559 }, /* kana_openingbracket */ + { 0x000004a3, 18255 }, /* kana_closingbracket */ + { 0x000004a4, 18275 }, /* kana_comma */ + { 0x000004a5, 18286 }, /* kana_conjunctive */ + { 0x000004a6, 18771 }, /* kana_WO */ + { 0x000004a7, 18232 }, /* kana_a */ + { 0x000004a8, 18379 }, /* kana_i */ + { 0x000004a9, 18749 }, /* kana_u */ + { 0x000004aa, 18303 }, /* kana_e */ + { 0x000004ab, 18545 }, /* kana_o */ + { 0x000004ac, 18779 }, /* kana_ya */ + { 0x000004ad, 18811 }, /* kana_yu */ + { 0x000004ae, 18795 }, /* kana_yo */ + { 0x000004af, 18715 }, /* kana_tsu */ + { 0x000004b0, 22212 }, /* prolongedsound */ + { 0x000004b1, 18239 }, /* kana_A */ + { 0x000004b2, 18386 }, /* kana_I */ + { 0x000004b3, 18756 }, /* kana_U */ + { 0x000004b4, 18310 }, /* kana_E */ + { 0x000004b5, 18552 }, /* kana_O */ + { 0x000004b6, 18393 }, /* kana_KA */ + { 0x000004b7, 18409 }, /* kana_KI */ + { 0x000004b8, 18425 }, /* kana_KU */ + { 0x000004b9, 18401 }, /* kana_KE */ + { 0x000004ba, 18417 }, /* kana_KO */ + { 0x000004bb, 18619 }, /* kana_SA */ + { 0x000004bc, 18635 }, /* kana_SHI */ + { 0x000004bd, 18663 }, /* kana_SU */ + { 0x000004be, 18627 }, /* kana_SE */ + { 0x000004bf, 18655 }, /* kana_SO */ + { 0x000004c0, 18683 }, /* kana_TA */ + { 0x000004c1, 18246 }, /* kana_CHI */ + { 0x000004c2, 18724 }, /* kana_TSU */ + { 0x000004c3, 18691 }, /* kana_TE */ + { 0x000004c4, 18707 }, /* kana_TO */ + { 0x000004c5, 18505 }, /* kana_NA */ + { 0x000004c6, 18521 }, /* kana_NI */ + { 0x000004c7, 18537 }, /* kana_NU */ + { 0x000004c8, 18513 }, /* kana_NE */ + { 0x000004c9, 18529 }, /* kana_NO */ + { 0x000004ca, 18339 }, /* kana_HA */ + { 0x000004cb, 18355 }, /* kana_HI */ + { 0x000004cc, 18317 }, /* kana_FU */ + { 0x000004cd, 18347 }, /* kana_HE */ + { 0x000004ce, 18363 }, /* kana_HO */ + { 0x000004cf, 18443 }, /* kana_MA */ + { 0x000004d0, 18459 }, /* kana_MI */ + { 0x000004d1, 18490 }, /* kana_MU */ + { 0x000004d2, 18451 }, /* kana_ME */ + { 0x000004d3, 18482 }, /* kana_MO */ + { 0x000004d4, 18787 }, /* kana_YA */ + { 0x000004d5, 18819 }, /* kana_YU */ + { 0x000004d6, 18803 }, /* kana_YO */ + { 0x000004d7, 18579 }, /* kana_RA */ + { 0x000004d8, 18595 }, /* kana_RI */ + { 0x000004d9, 18611 }, /* kana_RU */ + { 0x000004da, 18587 }, /* kana_RE */ + { 0x000004db, 18603 }, /* kana_RO */ + { 0x000004dc, 18763 }, /* kana_WA */ + { 0x000004dd, 18498 }, /* kana_N */ + { 0x000004de, 26601 }, /* voicedsound */ + { 0x000004df, 22826 }, /* semivoicedsound */ { 0x000005ac, 1109 }, /* Arabic_comma */ { 0x000005bb, 1764 }, /* Arabic_semicolon */ { 0x000005bf, 1698 }, /* Arabic_question_mark */ @@ -5260,555 +5861,555 @@ static const struct name_keysym keysym_to_name[] = { { 0x000005f0, 1515 }, /* Arabic_kasra */ { 0x000005f1, 1781 }, /* Arabic_shadda */ { 0x000005f2, 1808 }, /* Arabic_sukun */ - { 0x000006a1, 22760 }, /* Serbian_dje */ - { 0x000006a2, 19585 }, /* Macedonia_gje */ - { 0x000006a3, 9456 }, /* Cyrillic_io */ - { 0x000006a4, 26199 }, /* Ukrainian_ie */ - { 0x000006a5, 19557 }, /* Macedonia_dse */ - { 0x000006a6, 26175 }, /* Ukrainian_i */ - { 0x000006a7, 26225 }, /* Ukrainian_yi */ - { 0x000006a8, 9480 }, /* Cyrillic_je */ - { 0x000006a9, 9618 }, /* Cyrillic_lje */ - { 0x000006aa, 9644 }, /* Cyrillic_nje */ - { 0x000006ab, 22878 }, /* Serbian_tshe */ - { 0x000006ac, 19613 }, /* Macedonia_kje */ - { 0x000006ad, 26123 }, /* Ukrainian_ghe_with_upturn */ + { 0x000006a1, 22842 }, /* Serbian_dje */ + { 0x000006a2, 19667 }, /* Macedonia_gje */ + { 0x000006a3, 9538 }, /* Cyrillic_io */ + { 0x000006a4, 26281 }, /* Ukrainian_ie */ + { 0x000006a5, 19639 }, /* Macedonia_dse */ + { 0x000006a6, 26257 }, /* Ukrainian_i */ + { 0x000006a7, 26307 }, /* Ukrainian_yi */ + { 0x000006a8, 9562 }, /* Cyrillic_je */ + { 0x000006a9, 9700 }, /* Cyrillic_lje */ + { 0x000006aa, 9726 }, /* Cyrillic_nje */ + { 0x000006ab, 22960 }, /* Serbian_tshe */ + { 0x000006ac, 19695 }, /* Macedonia_kje */ + { 0x000006ad, 26205 }, /* Ukrainian_ghe_with_upturn */ { 0x000006ae, 8399 }, /* Byelorussian_shortu */ - { 0x000006af, 8972 }, /* Cyrillic_dzhe */ - { 0x000006b0, 20189 }, /* numerosign */ - { 0x000006b1, 22772 }, /* Serbian_DJE */ - { 0x000006b2, 19599 }, /* Macedonia_GJE */ - { 0x000006b3, 9468 }, /* Cyrillic_IO */ - { 0x000006b4, 26212 }, /* Ukrainian_IE */ - { 0x000006b5, 19571 }, /* Macedonia_DSE */ - { 0x000006b6, 26187 }, /* Ukrainian_I */ - { 0x000006b7, 26238 }, /* Ukrainian_YI */ - { 0x000006b8, 9492 }, /* Cyrillic_JE */ - { 0x000006b9, 9631 }, /* Cyrillic_LJE */ - { 0x000006ba, 9657 }, /* Cyrillic_NJE */ - { 0x000006bb, 22891 }, /* Serbian_TSHE */ - { 0x000006bc, 19627 }, /* Macedonia_KJE */ - { 0x000006bd, 26149 }, /* Ukrainian_GHE_WITH_UPTURN */ + { 0x000006af, 9054 }, /* Cyrillic_dzhe */ + { 0x000006b0, 20271 }, /* numerosign */ + { 0x000006b1, 22854 }, /* Serbian_DJE */ + { 0x000006b2, 19681 }, /* Macedonia_GJE */ + { 0x000006b3, 9550 }, /* Cyrillic_IO */ + { 0x000006b4, 26294 }, /* Ukrainian_IE */ + { 0x000006b5, 19653 }, /* Macedonia_DSE */ + { 0x000006b6, 26269 }, /* Ukrainian_I */ + { 0x000006b7, 26320 }, /* Ukrainian_YI */ + { 0x000006b8, 9574 }, /* Cyrillic_JE */ + { 0x000006b9, 9713 }, /* Cyrillic_LJE */ + { 0x000006ba, 9739 }, /* Cyrillic_NJE */ + { 0x000006bb, 22973 }, /* Serbian_TSHE */ + { 0x000006bc, 19709 }, /* Macedonia_KJE */ + { 0x000006bd, 26231 }, /* Ukrainian_GHE_WITH_UPTURN */ { 0x000006be, 8419 }, /* Byelorussian_SHORTU */ - { 0x000006bf, 8986 }, /* Cyrillic_DZHE */ - { 0x000006c0, 10200 }, /* Cyrillic_yu */ - { 0x000006c1, 8782 }, /* Cyrillic_a */ - { 0x000006c2, 8804 }, /* Cyrillic_be */ - { 0x000006c3, 9952 }, /* Cyrillic_tse */ - { 0x000006c4, 8948 }, /* Cyrillic_de */ - { 0x000006c5, 9432 }, /* Cyrillic_ie */ - { 0x000006c6, 9022 }, /* Cyrillic_ef */ - { 0x000006c7, 9210 }, /* Cyrillic_ghe */ - { 0x000006c8, 9270 }, /* Cyrillic_ha */ - { 0x000006c9, 9374 }, /* Cyrillic_i */ - { 0x000006ca, 9860 }, /* Cyrillic_shorti */ - { 0x000006cb, 9504 }, /* Cyrillic_ka */ - { 0x000006cc, 9046 }, /* Cyrillic_el */ - { 0x000006cd, 9070 }, /* Cyrillic_em */ - { 0x000006ce, 9094 }, /* Cyrillic_en */ - { 0x000006cf, 9670 }, /* Cyrillic_o */ - { 0x000006d0, 9722 }, /* Cyrillic_pe */ - { 0x000006d1, 10148 }, /* Cyrillic_ya */ - { 0x000006d2, 9162 }, /* Cyrillic_er */ - { 0x000006d3, 9186 }, /* Cyrillic_es */ - { 0x000006d4, 9928 }, /* Cyrillic_te */ - { 0x000006d5, 9978 }, /* Cyrillic_u */ - { 0x000006d6, 10248 }, /* Cyrillic_zhe */ - { 0x000006d7, 10124 }, /* Cyrillic_ve */ - { 0x000006d8, 9892 }, /* Cyrillic_softsign */ - { 0x000006d9, 10172 }, /* Cyrillic_yeru */ - { 0x000006da, 10224 }, /* Cyrillic_ze */ - { 0x000006db, 9776 }, /* Cyrillic_sha */ - { 0x000006dc, 9000 }, /* Cyrillic_e */ - { 0x000006dd, 9802 }, /* Cyrillic_shcha */ - { 0x000006de, 8828 }, /* Cyrillic_che */ - { 0x000006df, 9338 }, /* Cyrillic_hardsign */ - { 0x000006e0, 10212 }, /* Cyrillic_YU */ - { 0x000006e1, 8793 }, /* Cyrillic_A */ - { 0x000006e2, 8816 }, /* Cyrillic_BE */ - { 0x000006e3, 9965 }, /* Cyrillic_TSE */ - { 0x000006e4, 8960 }, /* Cyrillic_DE */ - { 0x000006e5, 9444 }, /* Cyrillic_IE */ - { 0x000006e6, 9034 }, /* Cyrillic_EF */ - { 0x000006e7, 9223 }, /* Cyrillic_GHE */ - { 0x000006e8, 9282 }, /* Cyrillic_HA */ - { 0x000006e9, 9385 }, /* Cyrillic_I */ - { 0x000006ea, 9876 }, /* Cyrillic_SHORTI */ - { 0x000006eb, 9516 }, /* Cyrillic_KA */ - { 0x000006ec, 9058 }, /* Cyrillic_EL */ - { 0x000006ed, 9082 }, /* Cyrillic_EM */ - { 0x000006ee, 9106 }, /* Cyrillic_EN */ - { 0x000006ef, 9681 }, /* Cyrillic_O */ - { 0x000006f0, 9734 }, /* Cyrillic_PE */ - { 0x000006f1, 10160 }, /* Cyrillic_YA */ - { 0x000006f2, 9174 }, /* Cyrillic_ER */ - { 0x000006f3, 9198 }, /* Cyrillic_ES */ - { 0x000006f4, 9940 }, /* Cyrillic_TE */ - { 0x000006f5, 9989 }, /* Cyrillic_U */ - { 0x000006f6, 10261 }, /* Cyrillic_ZHE */ - { 0x000006f7, 10136 }, /* Cyrillic_VE */ - { 0x000006f8, 9910 }, /* Cyrillic_SOFTSIGN */ - { 0x000006f9, 10186 }, /* Cyrillic_YERU */ - { 0x000006fa, 10236 }, /* Cyrillic_ZE */ - { 0x000006fb, 9789 }, /* Cyrillic_SHA */ - { 0x000006fc, 9011 }, /* Cyrillic_E */ - { 0x000006fd, 9817 }, /* Cyrillic_SHCHA */ - { 0x000006fe, 8841 }, /* Cyrillic_CHE */ - { 0x000006ff, 9356 }, /* Cyrillic_HARDSIGN */ - { 0x000007a1, 13342 }, /* Greek_ALPHAaccent */ - { 0x000007a2, 13472 }, /* Greek_EPSILONaccent */ - { 0x000007a3, 13532 }, /* Greek_ETAaccent */ - { 0x000007a4, 13647 }, /* Greek_IOTAaccent */ - { 0x000007a5, 13726 }, /* Greek_IOTAdieresis */ - { 0x000007a7, 13962 }, /* Greek_OMICRONaccent */ - { 0x000007a8, 14189 }, /* Greek_UPSILONaccent */ - { 0x000007a9, 14257 }, /* Greek_UPSILONdieresis */ - { 0x000007ab, 13898 }, /* Greek_OMEGAaccent */ - { 0x000007ae, 13297 }, /* Greek_accentdieresis */ - { 0x000007af, 13610 }, /* Greek_horizbar */ - { 0x000007b1, 13360 }, /* Greek_alphaaccent */ - { 0x000007b2, 13492 }, /* Greek_epsilonaccent */ - { 0x000007b3, 13548 }, /* Greek_etaaccent */ - { 0x000007b4, 13664 }, /* Greek_iotaaccent */ - { 0x000007b5, 13745 }, /* Greek_iotadieresis */ - { 0x000007b6, 13681 }, /* Greek_iotaaccentdieresis */ - { 0x000007b7, 13982 }, /* Greek_omicronaccent */ - { 0x000007b8, 14209 }, /* Greek_upsilonaccent */ - { 0x000007b9, 14279 }, /* Greek_upsilondieresis */ - { 0x000007ba, 14229 }, /* Greek_upsilonaccentdieresis */ - { 0x000007bb, 13916 }, /* Greek_omegaaccent */ - { 0x000007c1, 13318 }, /* Greek_ALPHA */ - { 0x000007c2, 13378 }, /* Greek_BETA */ - { 0x000007c3, 13586 }, /* Greek_GAMMA */ - { 0x000007c4, 13420 }, /* Greek_DELTA */ - { 0x000007c5, 13444 }, /* Greek_EPSILON */ - { 0x000007c6, 14319 }, /* Greek_ZETA */ - { 0x000007c7, 13512 }, /* Greek_ETA */ - { 0x000007c8, 14137 }, /* Greek_THETA */ - { 0x000007c9, 13625 }, /* Greek_IOTA */ - { 0x000007ca, 13764 }, /* Greek_KAPPA */ - { 0x000007cb, 13814 }, /* Greek_LAMDA */ - { 0x000007cc, 13838 }, /* Greek_MU */ - { 0x000007cd, 13856 }, /* Greek_NU */ - { 0x000007ce, 14301 }, /* Greek_XI */ - { 0x000007cf, 13934 }, /* Greek_OMICRON */ - { 0x000007d0, 14022 }, /* Greek_PI */ - { 0x000007d1, 14060 }, /* Greek_RHO */ - { 0x000007d2, 14080 }, /* Greek_SIGMA */ - { 0x000007d4, 14117 }, /* Greek_TAU */ - { 0x000007d5, 14161 }, /* Greek_UPSILON */ - { 0x000007d6, 14002 }, /* Greek_PHI */ - { 0x000007d7, 13400 }, /* Greek_CHI */ - { 0x000007d8, 14040 }, /* Greek_PSI */ - { 0x000007d9, 13874 }, /* Greek_OMEGA */ - { 0x000007e1, 13330 }, /* Greek_alpha */ - { 0x000007e2, 13389 }, /* Greek_beta */ - { 0x000007e3, 13598 }, /* Greek_gamma */ - { 0x000007e4, 13432 }, /* Greek_delta */ - { 0x000007e5, 13458 }, /* Greek_epsilon */ - { 0x000007e6, 14330 }, /* Greek_zeta */ - { 0x000007e7, 13522 }, /* Greek_eta */ - { 0x000007e8, 14149 }, /* Greek_theta */ - { 0x000007e9, 13636 }, /* Greek_iota */ - { 0x000007ea, 13776 }, /* Greek_kappa */ - { 0x000007eb, 13826 }, /* Greek_lamda */ - { 0x000007ec, 13847 }, /* Greek_mu */ - { 0x000007ed, 13865 }, /* Greek_nu */ - { 0x000007ee, 14310 }, /* Greek_xi */ - { 0x000007ef, 13948 }, /* Greek_omicron */ - { 0x000007f0, 14031 }, /* Greek_pi */ - { 0x000007f1, 14070 }, /* Greek_rho */ - { 0x000007f2, 14092 }, /* Greek_sigma */ - { 0x000007f3, 13564 }, /* Greek_finalsmallsigma */ - { 0x000007f4, 14127 }, /* Greek_tau */ - { 0x000007f5, 14175 }, /* Greek_upsilon */ - { 0x000007f6, 14012 }, /* Greek_phi */ - { 0x000007f7, 13410 }, /* Greek_chi */ - { 0x000007f8, 14050 }, /* Greek_psi */ - { 0x000007f9, 13886 }, /* Greek_omega */ - { 0x000008a1, 19356 }, /* leftradical */ - { 0x000008a2, 25621 }, /* topleftradical */ - { 0x000008a3, 16667 }, /* horizconnector */ - { 0x000008a4, 25595 }, /* topintegral */ + { 0x000006bf, 9068 }, /* Cyrillic_DZHE */ + { 0x000006c0, 10282 }, /* Cyrillic_yu */ + { 0x000006c1, 8864 }, /* Cyrillic_a */ + { 0x000006c2, 8886 }, /* Cyrillic_be */ + { 0x000006c3, 10034 }, /* Cyrillic_tse */ + { 0x000006c4, 9030 }, /* Cyrillic_de */ + { 0x000006c5, 9514 }, /* Cyrillic_ie */ + { 0x000006c6, 9104 }, /* Cyrillic_ef */ + { 0x000006c7, 9292 }, /* Cyrillic_ghe */ + { 0x000006c8, 9352 }, /* Cyrillic_ha */ + { 0x000006c9, 9456 }, /* Cyrillic_i */ + { 0x000006ca, 9942 }, /* Cyrillic_shorti */ + { 0x000006cb, 9586 }, /* Cyrillic_ka */ + { 0x000006cc, 9128 }, /* Cyrillic_el */ + { 0x000006cd, 9152 }, /* Cyrillic_em */ + { 0x000006ce, 9176 }, /* Cyrillic_en */ + { 0x000006cf, 9752 }, /* Cyrillic_o */ + { 0x000006d0, 9804 }, /* Cyrillic_pe */ + { 0x000006d1, 10230 }, /* Cyrillic_ya */ + { 0x000006d2, 9244 }, /* Cyrillic_er */ + { 0x000006d3, 9268 }, /* Cyrillic_es */ + { 0x000006d4, 10010 }, /* Cyrillic_te */ + { 0x000006d5, 10060 }, /* Cyrillic_u */ + { 0x000006d6, 10330 }, /* Cyrillic_zhe */ + { 0x000006d7, 10206 }, /* Cyrillic_ve */ + { 0x000006d8, 9974 }, /* Cyrillic_softsign */ + { 0x000006d9, 10254 }, /* Cyrillic_yeru */ + { 0x000006da, 10306 }, /* Cyrillic_ze */ + { 0x000006db, 9858 }, /* Cyrillic_sha */ + { 0x000006dc, 9082 }, /* Cyrillic_e */ + { 0x000006dd, 9884 }, /* Cyrillic_shcha */ + { 0x000006de, 8910 }, /* Cyrillic_che */ + { 0x000006df, 9420 }, /* Cyrillic_hardsign */ + { 0x000006e0, 10294 }, /* Cyrillic_YU */ + { 0x000006e1, 8875 }, /* Cyrillic_A */ + { 0x000006e2, 8898 }, /* Cyrillic_BE */ + { 0x000006e3, 10047 }, /* Cyrillic_TSE */ + { 0x000006e4, 9042 }, /* Cyrillic_DE */ + { 0x000006e5, 9526 }, /* Cyrillic_IE */ + { 0x000006e6, 9116 }, /* Cyrillic_EF */ + { 0x000006e7, 9305 }, /* Cyrillic_GHE */ + { 0x000006e8, 9364 }, /* Cyrillic_HA */ + { 0x000006e9, 9467 }, /* Cyrillic_I */ + { 0x000006ea, 9958 }, /* Cyrillic_SHORTI */ + { 0x000006eb, 9598 }, /* Cyrillic_KA */ + { 0x000006ec, 9140 }, /* Cyrillic_EL */ + { 0x000006ed, 9164 }, /* Cyrillic_EM */ + { 0x000006ee, 9188 }, /* Cyrillic_EN */ + { 0x000006ef, 9763 }, /* Cyrillic_O */ + { 0x000006f0, 9816 }, /* Cyrillic_PE */ + { 0x000006f1, 10242 }, /* Cyrillic_YA */ + { 0x000006f2, 9256 }, /* Cyrillic_ER */ + { 0x000006f3, 9280 }, /* Cyrillic_ES */ + { 0x000006f4, 10022 }, /* Cyrillic_TE */ + { 0x000006f5, 10071 }, /* Cyrillic_U */ + { 0x000006f6, 10343 }, /* Cyrillic_ZHE */ + { 0x000006f7, 10218 }, /* Cyrillic_VE */ + { 0x000006f8, 9992 }, /* Cyrillic_SOFTSIGN */ + { 0x000006f9, 10268 }, /* Cyrillic_YERU */ + { 0x000006fa, 10318 }, /* Cyrillic_ZE */ + { 0x000006fb, 9871 }, /* Cyrillic_SHA */ + { 0x000006fc, 9093 }, /* Cyrillic_E */ + { 0x000006fd, 9899 }, /* Cyrillic_SHCHA */ + { 0x000006fe, 8923 }, /* Cyrillic_CHE */ + { 0x000006ff, 9438 }, /* Cyrillic_HARDSIGN */ + { 0x000007a1, 13424 }, /* Greek_ALPHAaccent */ + { 0x000007a2, 13554 }, /* Greek_EPSILONaccent */ + { 0x000007a3, 13614 }, /* Greek_ETAaccent */ + { 0x000007a4, 13729 }, /* Greek_IOTAaccent */ + { 0x000007a5, 13808 }, /* Greek_IOTAdieresis */ + { 0x000007a7, 14044 }, /* Greek_OMICRONaccent */ + { 0x000007a8, 14271 }, /* Greek_UPSILONaccent */ + { 0x000007a9, 14339 }, /* Greek_UPSILONdieresis */ + { 0x000007ab, 13980 }, /* Greek_OMEGAaccent */ + { 0x000007ae, 13379 }, /* Greek_accentdieresis */ + { 0x000007af, 13692 }, /* Greek_horizbar */ + { 0x000007b1, 13442 }, /* Greek_alphaaccent */ + { 0x000007b2, 13574 }, /* Greek_epsilonaccent */ + { 0x000007b3, 13630 }, /* Greek_etaaccent */ + { 0x000007b4, 13746 }, /* Greek_iotaaccent */ + { 0x000007b5, 13827 }, /* Greek_iotadieresis */ + { 0x000007b6, 13763 }, /* Greek_iotaaccentdieresis */ + { 0x000007b7, 14064 }, /* Greek_omicronaccent */ + { 0x000007b8, 14291 }, /* Greek_upsilonaccent */ + { 0x000007b9, 14361 }, /* Greek_upsilondieresis */ + { 0x000007ba, 14311 }, /* Greek_upsilonaccentdieresis */ + { 0x000007bb, 13998 }, /* Greek_omegaaccent */ + { 0x000007c1, 13400 }, /* Greek_ALPHA */ + { 0x000007c2, 13460 }, /* Greek_BETA */ + { 0x000007c3, 13668 }, /* Greek_GAMMA */ + { 0x000007c4, 13502 }, /* Greek_DELTA */ + { 0x000007c5, 13526 }, /* Greek_EPSILON */ + { 0x000007c6, 14401 }, /* Greek_ZETA */ + { 0x000007c7, 13594 }, /* Greek_ETA */ + { 0x000007c8, 14219 }, /* Greek_THETA */ + { 0x000007c9, 13707 }, /* Greek_IOTA */ + { 0x000007ca, 13846 }, /* Greek_KAPPA */ + { 0x000007cb, 13896 }, /* Greek_LAMDA */ + { 0x000007cc, 13920 }, /* Greek_MU */ + { 0x000007cd, 13938 }, /* Greek_NU */ + { 0x000007ce, 14383 }, /* Greek_XI */ + { 0x000007cf, 14016 }, /* Greek_OMICRON */ + { 0x000007d0, 14104 }, /* Greek_PI */ + { 0x000007d1, 14142 }, /* Greek_RHO */ + { 0x000007d2, 14162 }, /* Greek_SIGMA */ + { 0x000007d4, 14199 }, /* Greek_TAU */ + { 0x000007d5, 14243 }, /* Greek_UPSILON */ + { 0x000007d6, 14084 }, /* Greek_PHI */ + { 0x000007d7, 13482 }, /* Greek_CHI */ + { 0x000007d8, 14122 }, /* Greek_PSI */ + { 0x000007d9, 13956 }, /* Greek_OMEGA */ + { 0x000007e1, 13412 }, /* Greek_alpha */ + { 0x000007e2, 13471 }, /* Greek_beta */ + { 0x000007e3, 13680 }, /* Greek_gamma */ + { 0x000007e4, 13514 }, /* Greek_delta */ + { 0x000007e5, 13540 }, /* Greek_epsilon */ + { 0x000007e6, 14412 }, /* Greek_zeta */ + { 0x000007e7, 13604 }, /* Greek_eta */ + { 0x000007e8, 14231 }, /* Greek_theta */ + { 0x000007e9, 13718 }, /* Greek_iota */ + { 0x000007ea, 13858 }, /* Greek_kappa */ + { 0x000007eb, 13908 }, /* Greek_lamda */ + { 0x000007ec, 13929 }, /* Greek_mu */ + { 0x000007ed, 13947 }, /* Greek_nu */ + { 0x000007ee, 14392 }, /* Greek_xi */ + { 0x000007ef, 14030 }, /* Greek_omicron */ + { 0x000007f0, 14113 }, /* Greek_pi */ + { 0x000007f1, 14152 }, /* Greek_rho */ + { 0x000007f2, 14174 }, /* Greek_sigma */ + { 0x000007f3, 13646 }, /* Greek_finalsmallsigma */ + { 0x000007f4, 14209 }, /* Greek_tau */ + { 0x000007f5, 14257 }, /* Greek_upsilon */ + { 0x000007f6, 14094 }, /* Greek_phi */ + { 0x000007f7, 13492 }, /* Greek_chi */ + { 0x000007f8, 14132 }, /* Greek_psi */ + { 0x000007f9, 13968 }, /* Greek_omega */ + { 0x000008a1, 19438 }, /* leftradical */ + { 0x000008a2, 25703 }, /* topleftradical */ + { 0x000008a3, 16749 }, /* horizconnector */ + { 0x000008a4, 25677 }, /* topintegral */ { 0x000008a5, 3422 }, /* botintegral */ - { 0x000008a6, 26505 }, /* vertconnector */ - { 0x000008a7, 25636 }, /* topleftsqbracket */ + { 0x000008a6, 26587 }, /* vertconnector */ + { 0x000008a7, 25718 }, /* topleftsqbracket */ { 0x000008a8, 3448 }, /* botleftsqbracket */ - { 0x000008a9, 25685 }, /* toprightsqbracket */ + { 0x000008a9, 25767 }, /* toprightsqbracket */ { 0x000008aa, 3497 }, /* botrightsqbracket */ - { 0x000008ab, 25607 }, /* topleftparens */ + { 0x000008ab, 25689 }, /* topleftparens */ { 0x000008ac, 3434 }, /* botleftparens */ - { 0x000008ad, 25670 }, /* toprightparens */ + { 0x000008ad, 25752 }, /* toprightparens */ { 0x000008ae, 3482 }, /* botrightparens */ - { 0x000008af, 19306 }, /* leftmiddlecurlybrace */ - { 0x000008b0, 22440 }, /* rightmiddlecurlybrace */ - { 0x000008b1, 25653 }, /* topleftsummation */ + { 0x000008af, 19388 }, /* leftmiddlecurlybrace */ + { 0x000008b0, 22522 }, /* rightmiddlecurlybrace */ + { 0x000008b1, 25735 }, /* topleftsummation */ { 0x000008b2, 3465 }, /* botleftsummation */ - { 0x000008b3, 25726 }, /* topvertsummationconnector */ + { 0x000008b3, 25808 }, /* topvertsummationconnector */ { 0x000008b4, 3538 }, /* botvertsummationconnector */ - { 0x000008b5, 25703 }, /* toprightsummation */ + { 0x000008b5, 25785 }, /* toprightsummation */ { 0x000008b6, 3515 }, /* botrightsummation */ - { 0x000008b7, 22462 }, /* rightmiddlesummation */ - { 0x000008bc, 19417 }, /* lessthanequal */ - { 0x000008bd, 20125 }, /* notequal */ - { 0x000008be, 13280 }, /* greaterthanequal */ - { 0x000008bf, 17313 }, /* integral */ - { 0x000008c0, 25479 }, /* therefore */ - { 0x000008c1, 26487 }, /* variation */ - { 0x000008c2, 17275 }, /* infinity */ - { 0x000008c5, 19947 }, /* nabla */ + { 0x000008b7, 22544 }, /* rightmiddlesummation */ + { 0x000008bc, 19499 }, /* lessthanequal */ + { 0x000008bd, 20207 }, /* notequal */ + { 0x000008be, 13362 }, /* greaterthanequal */ + { 0x000008bf, 17395 }, /* integral */ + { 0x000008c0, 25561 }, /* therefore */ + { 0x000008c1, 26569 }, /* variation */ + { 0x000008c2, 17357 }, /* infinity */ + { 0x000008c5, 20029 }, /* nabla */ { 0x000008c8, 954 }, /* approximate */ - { 0x000008c9, 22999 }, /* similarequal */ - { 0x000008cd, 17196 }, /* ifonlyif */ - { 0x000008ce, 17247 }, /* implies */ - { 0x000008cf, 17155 }, /* identical */ - { 0x000008d6, 22286 }, /* radical */ - { 0x000008da, 17255 }, /* includedin */ - { 0x000008db, 17266 }, /* includes */ - { 0x000008dc, 17322 }, /* intersection */ - { 0x000008dd, 26362 }, /* union */ - { 0x000008de, 19457 }, /* logicaland */ - { 0x000008df, 19468 }, /* logicalor */ - { 0x000008ef, 21463 }, /* partialderivative */ - { 0x000008f6, 12656 }, /* function */ - { 0x000008fb, 19266 }, /* leftarrow */ - { 0x000008fc, 26387 }, /* uparrow */ - { 0x000008fd, 22397 }, /* rightarrow */ - { 0x000008fe, 11332 }, /* downarrow */ + { 0x000008c9, 23081 }, /* similarequal */ + { 0x000008cd, 17278 }, /* ifonlyif */ + { 0x000008ce, 17329 }, /* implies */ + { 0x000008cf, 17237 }, /* identical */ + { 0x000008d6, 22368 }, /* radical */ + { 0x000008da, 17337 }, /* includedin */ + { 0x000008db, 17348 }, /* includes */ + { 0x000008dc, 17404 }, /* intersection */ + { 0x000008dd, 26444 }, /* union */ + { 0x000008de, 19539 }, /* logicaland */ + { 0x000008df, 19550 }, /* logicalor */ + { 0x000008ef, 21545 }, /* partialderivative */ + { 0x000008f6, 12738 }, /* function */ + { 0x000008fb, 19348 }, /* leftarrow */ + { 0x000008fc, 26469 }, /* uparrow */ + { 0x000008fd, 22479 }, /* rightarrow */ + { 0x000008fe, 11414 }, /* downarrow */ { 0x000009df, 3410 }, /* blank */ - { 0x000009e0, 23790 }, /* soliddiamond */ + { 0x000009e0, 23872 }, /* soliddiamond */ { 0x000009e1, 8603 }, /* checkerboard */ - { 0x000009e2, 17043 }, /* ht */ - { 0x000009e3, 12413 }, /* ff */ - { 0x000009e4, 8727 }, /* cr */ - { 0x000009e5, 19431 }, /* lf */ - { 0x000009e8, 20075 }, /* nl */ - { 0x000009e9, 26542 }, /* vt */ - { 0x000009ea, 19502 }, /* lowrightcorner */ - { 0x000009eb, 26416 }, /* uprightcorner */ - { 0x000009ec, 26403 }, /* upleftcorner */ - { 0x000009ed, 19488 }, /* lowleftcorner */ - { 0x000009ee, 8730 }, /* crossinglines */ - { 0x000009ef, 16682 }, /* horizlinescan1 */ - { 0x000009f0, 16697 }, /* horizlinescan3 */ - { 0x000009f1, 16712 }, /* horizlinescan5 */ - { 0x000009f2, 16727 }, /* horizlinescan7 */ - { 0x000009f3, 16742 }, /* horizlinescan9 */ - { 0x000009f4, 19397 }, /* leftt */ - { 0x000009f5, 22545 }, /* rightt */ + { 0x000009e2, 17125 }, /* ht */ + { 0x000009e3, 12495 }, /* ff */ + { 0x000009e4, 8809 }, /* cr */ + { 0x000009e5, 19513 }, /* lf */ + { 0x000009e8, 20157 }, /* nl */ + { 0x000009e9, 26624 }, /* vt */ + { 0x000009ea, 19584 }, /* lowrightcorner */ + { 0x000009eb, 26498 }, /* uprightcorner */ + { 0x000009ec, 26485 }, /* upleftcorner */ + { 0x000009ed, 19570 }, /* lowleftcorner */ + { 0x000009ee, 8812 }, /* crossinglines */ + { 0x000009ef, 16764 }, /* horizlinescan1 */ + { 0x000009f0, 16779 }, /* horizlinescan3 */ + { 0x000009f1, 16794 }, /* horizlinescan5 */ + { 0x000009f2, 16809 }, /* horizlinescan7 */ + { 0x000009f3, 16824 }, /* horizlinescan9 */ + { 0x000009f4, 19479 }, /* leftt */ + { 0x000009f5, 22627 }, /* rightt */ { 0x000009f6, 3533 }, /* bott */ - { 0x000009f7, 25721 }, /* topt */ - { 0x000009f8, 26497 }, /* vertbar */ - { 0x00000aa1, 11928 }, /* emspace */ - { 0x00000aa2, 12027 }, /* enspace */ - { 0x00000aa3, 11821 }, /* em3space */ - { 0x00000aa4, 11830 }, /* em4space */ - { 0x00000aa5, 11221 }, /* digitspace */ - { 0x00000aa6, 22145 }, /* punctspace */ - { 0x00000aa7, 25489 }, /* thinspace */ - { 0x00000aa8, 14382 }, /* hairspace */ - { 0x00000aa9, 11855 }, /* emdash */ - { 0x00000aaa, 11940 }, /* endash */ - { 0x00000aac, 22987 }, /* signifblank */ - { 0x00000aae, 11812 }, /* ellipsis */ - { 0x00000aaf, 11267 }, /* doubbaselinedot */ - { 0x00000ab0, 20767 }, /* onethird */ - { 0x00000ab1, 25837 }, /* twothirds */ - { 0x00000ab2, 20705 }, /* onefifth */ - { 0x00000ab3, 25802 }, /* twofifths */ - { 0x00000ab4, 25530 }, /* threefifths */ - { 0x00000ab5, 12607 }, /* fourfifths */ - { 0x00000ab6, 20733 }, /* onesixth */ - { 0x00000ab7, 12569 }, /* fivesixths */ + { 0x000009f7, 25803 }, /* topt */ + { 0x000009f8, 26579 }, /* vertbar */ + { 0x00000aa1, 12010 }, /* emspace */ + { 0x00000aa2, 12109 }, /* enspace */ + { 0x00000aa3, 11903 }, /* em3space */ + { 0x00000aa4, 11912 }, /* em4space */ + { 0x00000aa5, 11303 }, /* digitspace */ + { 0x00000aa6, 22227 }, /* punctspace */ + { 0x00000aa7, 25571 }, /* thinspace */ + { 0x00000aa8, 14464 }, /* hairspace */ + { 0x00000aa9, 11937 }, /* emdash */ + { 0x00000aaa, 12022 }, /* endash */ + { 0x00000aac, 23069 }, /* signifblank */ + { 0x00000aae, 11894 }, /* ellipsis */ + { 0x00000aaf, 11349 }, /* doubbaselinedot */ + { 0x00000ab0, 20849 }, /* onethird */ + { 0x00000ab1, 25919 }, /* twothirds */ + { 0x00000ab2, 20787 }, /* onefifth */ + { 0x00000ab3, 25884 }, /* twofifths */ + { 0x00000ab4, 25612 }, /* threefifths */ + { 0x00000ab5, 12689 }, /* fourfifths */ + { 0x00000ab6, 20815 }, /* onesixth */ + { 0x00000ab7, 12651 }, /* fivesixths */ { 0x00000ab8, 8506 }, /* careof */ - { 0x00000abb, 12427 }, /* figdash */ - { 0x00000abc, 19249 }, /* leftanglebracket */ - { 0x00000abd, 11140 }, /* decimalpoint */ - { 0x00000abe, 22379 }, /* rightanglebracket */ - { 0x00000abf, 19681 }, /* marker */ - { 0x00000ac3, 20695 }, /* oneeighth */ - { 0x00000ac4, 25517 }, /* threeeighths */ - { 0x00000ac5, 12557 }, /* fiveeighths */ - { 0x00000ac6, 22904 }, /* seveneighths */ - { 0x00000ac9, 25760 }, /* trademark */ - { 0x00000aca, 22973 }, /* signaturemark */ - { 0x00000acb, 25770 }, /* trademarkincircle */ - { 0x00000acc, 19327 }, /* leftopentriangle */ - { 0x00000acd, 22483 }, /* rightopentriangle */ - { 0x00000ace, 11890 }, /* emopencircle */ - { 0x00000acf, 11903 }, /* emopenrectangle */ - { 0x00000ad0, 19377 }, /* leftsinglequotemark */ - { 0x00000ad1, 22524 }, /* rightsinglequotemark */ - { 0x00000ad2, 19286 }, /* leftdoublequotemark */ - { 0x00000ad3, 22419 }, /* rightdoublequotemark */ - { 0x00000ad4, 22067 }, /* prescription */ - { 0x00000ad5, 21517 }, /* permille */ - { 0x00000ad6, 19739 }, /* minutes */ - { 0x00000ad7, 22711 }, /* seconds */ - { 0x00000ad9, 19181 }, /* latincross */ - { 0x00000ada, 16626 }, /* hexagram */ - { 0x00000adb, 12455 }, /* filledrectbullet */ - { 0x00000adc, 12435 }, /* filledlefttribullet */ - { 0x00000add, 12472 }, /* filledrighttribullet */ - { 0x00000ade, 11862 }, /* emfilledcircle */ - { 0x00000adf, 11877 }, /* emfilledrect */ - { 0x00000ae0, 11991 }, /* enopencircbullet */ - { 0x00000ae1, 12008 }, /* enopensquarebullet */ - { 0x00000ae2, 20794 }, /* openrectbullet */ - { 0x00000ae3, 20836 }, /* opentribulletup */ - { 0x00000ae4, 20818 }, /* opentribulletdown */ - { 0x00000ae5, 20809 }, /* openstar */ - { 0x00000ae6, 11947 }, /* enfilledcircbullet */ - { 0x00000ae7, 11966 }, /* enfilledsqbullet */ - { 0x00000ae8, 12513 }, /* filledtribulletup */ - { 0x00000ae9, 12493 }, /* filledtribulletdown */ - { 0x00000aea, 19344 }, /* leftpointer */ - { 0x00000aeb, 22501 }, /* rightpointer */ + { 0x00000abb, 12509 }, /* figdash */ + { 0x00000abc, 19331 }, /* leftanglebracket */ + { 0x00000abd, 11222 }, /* decimalpoint */ + { 0x00000abe, 22461 }, /* rightanglebracket */ + { 0x00000abf, 19763 }, /* marker */ + { 0x00000ac3, 20777 }, /* oneeighth */ + { 0x00000ac4, 25599 }, /* threeeighths */ + { 0x00000ac5, 12639 }, /* fiveeighths */ + { 0x00000ac6, 22986 }, /* seveneighths */ + { 0x00000ac9, 25842 }, /* trademark */ + { 0x00000aca, 23055 }, /* signaturemark */ + { 0x00000acb, 25852 }, /* trademarkincircle */ + { 0x00000acc, 19409 }, /* leftopentriangle */ + { 0x00000acd, 22565 }, /* rightopentriangle */ + { 0x00000ace, 11972 }, /* emopencircle */ + { 0x00000acf, 11985 }, /* emopenrectangle */ + { 0x00000ad0, 19459 }, /* leftsinglequotemark */ + { 0x00000ad1, 22606 }, /* rightsinglequotemark */ + { 0x00000ad2, 19368 }, /* leftdoublequotemark */ + { 0x00000ad3, 22501 }, /* rightdoublequotemark */ + { 0x00000ad4, 22149 }, /* prescription */ + { 0x00000ad5, 21599 }, /* permille */ + { 0x00000ad6, 19821 }, /* minutes */ + { 0x00000ad7, 22793 }, /* seconds */ + { 0x00000ad9, 19263 }, /* latincross */ + { 0x00000ada, 16708 }, /* hexagram */ + { 0x00000adb, 12537 }, /* filledrectbullet */ + { 0x00000adc, 12517 }, /* filledlefttribullet */ + { 0x00000add, 12554 }, /* filledrighttribullet */ + { 0x00000ade, 11944 }, /* emfilledcircle */ + { 0x00000adf, 11959 }, /* emfilledrect */ + { 0x00000ae0, 12073 }, /* enopencircbullet */ + { 0x00000ae1, 12090 }, /* enopensquarebullet */ + { 0x00000ae2, 20876 }, /* openrectbullet */ + { 0x00000ae3, 20918 }, /* opentribulletup */ + { 0x00000ae4, 20900 }, /* opentribulletdown */ + { 0x00000ae5, 20891 }, /* openstar */ + { 0x00000ae6, 12029 }, /* enfilledcircbullet */ + { 0x00000ae7, 12048 }, /* enfilledsqbullet */ + { 0x00000ae8, 12595 }, /* filledtribulletup */ + { 0x00000ae9, 12575 }, /* filledtribulletdown */ + { 0x00000aea, 19426 }, /* leftpointer */ + { 0x00000aeb, 22583 }, /* rightpointer */ { 0x00000aec, 8649 }, /* club */ - { 0x00000aed, 11213 }, /* diamond */ - { 0x00000aee, 16080 }, /* heart */ - { 0x00000af0, 19668 }, /* maltesecross */ - { 0x00000af1, 10358 }, /* dagger */ - { 0x00000af2, 11295 }, /* doubledagger */ + { 0x00000aed, 11295 }, /* diamond */ + { 0x00000aee, 16162 }, /* heart */ + { 0x00000af0, 19750 }, /* maltesecross */ + { 0x00000af1, 10440 }, /* dagger */ + { 0x00000af2, 11377 }, /* doubledagger */ { 0x00000af3, 8616 }, /* checkmark */ { 0x00000af4, 3380 }, /* ballotcross */ - { 0x00000af5, 19860 }, /* musicalsharp */ - { 0x00000af6, 19848 }, /* musicalflat */ - { 0x00000af7, 19657 }, /* malesymbol */ - { 0x00000af8, 12400 }, /* femalesymbol */ - { 0x00000af9, 24354 }, /* telephone */ - { 0x00000afa, 24364 }, /* telephonerecorder */ - { 0x00000afb, 21537 }, /* phonographcopyright */ + { 0x00000af5, 19942 }, /* musicalsharp */ + { 0x00000af6, 19930 }, /* musicalflat */ + { 0x00000af7, 19739 }, /* malesymbol */ + { 0x00000af8, 12482 }, /* femalesymbol */ + { 0x00000af9, 24436 }, /* telephone */ + { 0x00000afa, 24446 }, /* telephonerecorder */ + { 0x00000afb, 21619 }, /* phonographcopyright */ { 0x00000afc, 8513 }, /* caret */ - { 0x00000afd, 23028 }, /* singlelowquotemark */ - { 0x00000afe, 11308 }, /* doublelowquotemark */ - { 0x00000aff, 8775 }, /* cursor */ - { 0x00000ba3, 19276 }, /* leftcaret */ - { 0x00000ba6, 22408 }, /* rightcaret */ - { 0x00000ba8, 11342 }, /* downcaret */ - { 0x00000ba9, 26395 }, /* upcaret */ - { 0x00000bc0, 21324 }, /* overbar */ - { 0x00000bc2, 11371 }, /* downtack */ - { 0x00000bc3, 26430 }, /* upshoe */ - { 0x00000bc4, 11361 }, /* downstile */ - { 0x00000bc6, 26337 }, /* underbar */ - { 0x00000bca, 18142 }, /* jot */ - { 0x00000bcc, 22160 }, /* quad */ - { 0x00000bce, 26445 }, /* uptack */ + { 0x00000afd, 23110 }, /* singlelowquotemark */ + { 0x00000afe, 11390 }, /* doublelowquotemark */ + { 0x00000aff, 8857 }, /* cursor */ + { 0x00000ba3, 19358 }, /* leftcaret */ + { 0x00000ba6, 22490 }, /* rightcaret */ + { 0x00000ba8, 11424 }, /* downcaret */ + { 0x00000ba9, 26477 }, /* upcaret */ + { 0x00000bc0, 21406 }, /* overbar */ + { 0x00000bc2, 11453 }, /* downtack */ + { 0x00000bc3, 26512 }, /* upshoe */ + { 0x00000bc4, 11443 }, /* downstile */ + { 0x00000bc6, 26419 }, /* underbar */ + { 0x00000bca, 18224 }, /* jot */ + { 0x00000bcc, 22242 }, /* quad */ + { 0x00000bce, 26527 }, /* uptack */ { 0x00000bcf, 8626 }, /* circle */ - { 0x00000bd3, 26437 }, /* upstile */ - { 0x00000bd6, 11352 }, /* downshoe */ - { 0x00000bd8, 22514 }, /* rightshoe */ - { 0x00000bda, 19368 }, /* leftshoe */ - { 0x00000bdc, 19403 }, /* lefttack */ - { 0x00000bfc, 22552 }, /* righttack */ - { 0x00000cdf, 16173 }, /* hebrew_doublelowline */ - { 0x00000ce0, 16086 }, /* hebrew_aleph */ - { 0x00000ce1, 16111 }, /* hebrew_bet */ - { 0x00000ce2, 16292 }, /* hebrew_gimel */ - { 0x00000ce3, 16146 }, /* hebrew_dalet */ - { 0x00000ce4, 16319 }, /* hebrew_he */ - { 0x00000ce5, 16531 }, /* hebrew_waw */ - { 0x00000ce6, 16577 }, /* hebrew_zain */ - { 0x00000ce7, 16134 }, /* hebrew_chet */ - { 0x00000ce8, 16508 }, /* hebrew_tet */ - { 0x00000ce9, 16542 }, /* hebrew_yod */ - { 0x00000cea, 16194 }, /* hebrew_finalkaph */ - { 0x00000ceb, 16340 }, /* hebrew_kaph */ - { 0x00000cec, 16363 }, /* hebrew_lamed */ - { 0x00000ced, 16211 }, /* hebrew_finalmem */ - { 0x00000cee, 16376 }, /* hebrew_mem */ - { 0x00000cef, 16227 }, /* hebrew_finalnun */ - { 0x00000cf0, 16387 }, /* hebrew_nun */ - { 0x00000cf1, 16432 }, /* hebrew_samech */ - { 0x00000cf2, 16099 }, /* hebrew_ayin */ - { 0x00000cf3, 16243 }, /* hebrew_finalpe */ - { 0x00000cf4, 16398 }, /* hebrew_pe */ - { 0x00000cf5, 16258 }, /* hebrew_finalzade */ - { 0x00000cf6, 16553 }, /* hebrew_zade */ - { 0x00000cf7, 16408 }, /* hebrew_qoph */ - { 0x00000cf8, 16420 }, /* hebrew_resh */ - { 0x00000cf9, 16460 }, /* hebrew_shin */ - { 0x00000cfa, 16497 }, /* hebrew_taw */ - { 0x00000da1, 24617 }, /* Thai_kokai */ - { 0x00000da2, 24547 }, /* Thai_khokhai */ - { 0x00000da3, 24573 }, /* Thai_khokhuat */ - { 0x00000da4, 24587 }, /* Thai_khokhwai */ - { 0x00000da5, 24560 }, /* Thai_khokhon */ - { 0x00000da6, 24601 }, /* Thai_khorakhang */ - { 0x00000da7, 24930 }, /* Thai_ngongu */ - { 0x00000da8, 24423 }, /* Thai_chochan */ - { 0x00000da9, 24450 }, /* Thai_choching */ - { 0x00000daa, 24436 }, /* Thai_chochang */ - { 0x00000dab, 25291 }, /* Thai_soso */ - { 0x00000dac, 24464 }, /* Thai_chochoe */ - { 0x00000dad, 25467 }, /* Thai_yoying */ - { 0x00000dae, 24477 }, /* Thai_dochada */ - { 0x00000daf, 25420 }, /* Thai_topatak */ - { 0x00000db0, 25379 }, /* Thai_thothan */ - { 0x00000db1, 25329 }, /* Thai_thonangmontho */ - { 0x00000db2, 25348 }, /* Thai_thophuthao */ - { 0x00000db3, 24956 }, /* Thai_nonen */ - { 0x00000db4, 24490 }, /* Thai_dodek */ - { 0x00000db5, 25433 }, /* Thai_totao */ - { 0x00000db6, 25406 }, /* Thai_thothung */ - { 0x00000db7, 25364 }, /* Thai_thothahan */ - { 0x00000db8, 25392 }, /* Thai_thothong */ - { 0x00000db9, 24967 }, /* Thai_nonu */ - { 0x00000dba, 24409 }, /* Thai_bobaimai */ - { 0x00000dbb, 25058 }, /* Thai_popla */ - { 0x00000dbc, 25028 }, /* Thai_phophung */ - { 0x00000dbd, 24501 }, /* Thai_fofa */ - { 0x00000dbe, 25015 }, /* Thai_phophan */ - { 0x00000dbf, 24511 }, /* Thai_fofan */ - { 0x00000dc0, 25042 }, /* Thai_phosamphao */ - { 0x00000dc1, 24920 }, /* Thai_moma */ - { 0x00000dc2, 25456 }, /* Thai_yoyak */ - { 0x00000dc3, 25069 }, /* Thai_rorua */ - { 0x00000dc4, 25080 }, /* Thai_ru */ - { 0x00000dc5, 24780 }, /* Thai_loling */ - { 0x00000dc6, 24792 }, /* Thai_lu */ - { 0x00000dc7, 25444 }, /* Thai_wowaen */ - { 0x00000dc8, 25279 }, /* Thai_sosala */ - { 0x00000dc9, 25267 }, /* Thai_sorusi */ - { 0x00000dca, 25301 }, /* Thai_sosua */ - { 0x00000dcb, 24522 }, /* Thai_hohip */ - { 0x00000dcc, 24767 }, /* Thai_lochula */ - { 0x00000dcd, 24977 }, /* Thai_oang */ - { 0x00000dce, 24533 }, /* Thai_honokhuk */ - { 0x00000dcf, 24987 }, /* Thai_paiyannoi */ - { 0x00000dd0, 25088 }, /* Thai_saraa */ - { 0x00000dd1, 24828 }, /* Thai_maihanakat */ - { 0x00000dd2, 25099 }, /* Thai_saraaa */ - { 0x00000dd3, 25162 }, /* Thai_saraam */ - { 0x00000dd4, 25185 }, /* Thai_sarai */ - { 0x00000dd5, 25196 }, /* Thai_saraii */ - { 0x00000dd6, 25230 }, /* Thai_saraue */ - { 0x00000dd7, 25242 }, /* Thai_sarauee */ - { 0x00000dd8, 25219 }, /* Thai_sarau */ - { 0x00000dd9, 25255 }, /* Thai_sarauu */ - { 0x00000dda, 25002 }, /* Thai_phinthu */ - { 0x00000dde, 24844 }, /* Thai_maihanakat_maitho */ - { 0x00000ddf, 24399 }, /* Thai_baht */ - { 0x00000de0, 25174 }, /* Thai_sarae */ - { 0x00000de1, 25111 }, /* Thai_saraae */ - { 0x00000de2, 25208 }, /* Thai_sarao */ - { 0x00000de3, 25143 }, /* Thai_saraaimaimuan */ - { 0x00000de4, 25123 }, /* Thai_saraaimaimalai */ - { 0x00000de5, 24628 }, /* Thai_lakkhangyao */ - { 0x00000de6, 24906 }, /* Thai_maiyamok */ - { 0x00000de7, 24867 }, /* Thai_maitaikhu */ - { 0x00000de8, 24817 }, /* Thai_maiek */ - { 0x00000de9, 24882 }, /* Thai_maitho */ - { 0x00000dea, 24894 }, /* Thai_maitri */ - { 0x00000deb, 24800 }, /* Thai_maichattawa */ - { 0x00000dec, 25312 }, /* Thai_thanthakhat */ - { 0x00000ded, 24942 }, /* Thai_nikhahit */ - { 0x00000df0, 24755 }, /* Thai_leksun */ - { 0x00000df1, 24693 }, /* Thai_leknung */ - { 0x00000df2, 24742 }, /* Thai_leksong */ - { 0x00000df3, 24719 }, /* Thai_leksam */ - { 0x00000df4, 24731 }, /* Thai_leksi */ - { 0x00000df5, 24658 }, /* Thai_lekha */ - { 0x00000df6, 24669 }, /* Thai_lekhok */ - { 0x00000df7, 24645 }, /* Thai_lekchet */ - { 0x00000df8, 24706 }, /* Thai_lekpaet */ - { 0x00000df9, 24681 }, /* Thai_lekkao */ - { 0x00000ea1, 15181 }, /* Hangul_Kiyeog */ - { 0x00000ea2, 15726 }, /* Hangul_SsangKiyeog */ - { 0x00000ea3, 15195 }, /* Hangul_KiyeogSios */ - { 0x00000ea4, 15276 }, /* Hangul_Nieun */ - { 0x00000ea5, 15307 }, /* Hangul_NieunJieuj */ - { 0x00000ea6, 15289 }, /* Hangul_NieunHieuh */ - { 0x00000ea7, 14488 }, /* Hangul_Dikeud */ - { 0x00000ea8, 15689 }, /* Hangul_SsangDikeud */ - { 0x00000ea9, 15461 }, /* Hangul_Rieul */ - { 0x00000eaa, 15492 }, /* Hangul_RieulKiyeog */ - { 0x00000eab, 15511 }, /* Hangul_RieulMieum */ - { 0x00000eac, 15548 }, /* Hangul_RieulPieub */ - { 0x00000ead, 15566 }, /* Hangul_RieulSios */ - { 0x00000eae, 15583 }, /* Hangul_RieulTieut */ - { 0x00000eaf, 15529 }, /* Hangul_RieulPhieuf */ - { 0x00000eb0, 15474 }, /* Hangul_RieulHieuh */ - { 0x00000eb1, 15238 }, /* Hangul_Mieum */ - { 0x00000eb2, 15373 }, /* Hangul_Pieub */ - { 0x00000eb3, 15745 }, /* Hangul_SsangPieub */ - { 0x00000eb4, 15386 }, /* Hangul_PieubSios */ - { 0x00000eb5, 15662 }, /* Hangul_Sios */ - { 0x00000eb6, 15763 }, /* Hangul_SsangSios */ - { 0x00000eb7, 14577 }, /* Hangul_Ieung */ - { 0x00000eb8, 15154 }, /* Hangul_Jieuj */ - { 0x00000eb9, 15708 }, /* Hangul_SsangJieuj */ - { 0x00000eba, 14458 }, /* Hangul_Cieuc */ - { 0x00000ebb, 15167 }, /* Hangul_Khieuq */ - { 0x00000ebc, 15883 }, /* Hangul_Tieut */ - { 0x00000ebd, 15359 }, /* Hangul_Phieuf */ - { 0x00000ebe, 14555 }, /* Hangul_Hieuh */ - { 0x00000ebf, 14399 }, /* Hangul_A */ - { 0x00000ec0, 14408 }, /* Hangul_AE */ - { 0x00000ec1, 15957 }, /* Hangul_YA */ - { 0x00000ec2, 15967 }, /* Hangul_YAE */ - { 0x00000ec3, 14522 }, /* Hangul_EO */ - { 0x00000ec4, 14502 }, /* Hangul_E */ - { 0x00000ec5, 15988 }, /* Hangul_YEO */ - { 0x00000ec6, 15978 }, /* Hangul_YE */ - { 0x00000ec7, 15325 }, /* Hangul_O */ - { 0x00000ec8, 15905 }, /* Hangul_WA */ - { 0x00000ec9, 15915 }, /* Hangul_WAE */ - { 0x00000eca, 15334 }, /* Hangul_OE */ - { 0x00000ecb, 16028 }, /* Hangul_YO */ - { 0x00000ecc, 15896 }, /* Hangul_U */ - { 0x00000ecd, 15936 }, /* Hangul_WEO */ - { 0x00000ece, 15926 }, /* Hangul_WE */ - { 0x00000ecf, 15947 }, /* Hangul_WI */ - { 0x00000ed0, 16038 }, /* Hangul_YU */ - { 0x00000ed1, 14532 }, /* Hangul_EU */ - { 0x00000ed2, 16018 }, /* Hangul_YI */ - { 0x00000ed3, 14568 }, /* Hangul_I */ - { 0x00000ed4, 14682 }, /* Hangul_J_Kiyeog */ - { 0x00000ed5, 15052 }, /* Hangul_J_SsangKiyeog */ - { 0x00000ed6, 14698 }, /* Hangul_J_KiyeogSios */ - { 0x00000ed7, 14760 }, /* Hangul_J_Nieun */ - { 0x00000ed8, 14795 }, /* Hangul_J_NieunJieuj */ - { 0x00000ed9, 14775 }, /* Hangul_J_NieunHieuh */ - { 0x00000eda, 14605 }, /* Hangul_J_Dikeud */ - { 0x00000edb, 14882 }, /* Hangul_J_Rieul */ - { 0x00000edc, 14917 }, /* Hangul_J_RieulKiyeog */ - { 0x00000edd, 14938 }, /* Hangul_J_RieulMieum */ - { 0x00000ede, 14979 }, /* Hangul_J_RieulPieub */ - { 0x00000edf, 14999 }, /* Hangul_J_RieulSios */ - { 0x00000ee0, 15018 }, /* Hangul_J_RieulTieut */ - { 0x00000ee1, 14958 }, /* Hangul_J_RieulPhieuf */ - { 0x00000ee2, 14897 }, /* Hangul_J_RieulHieuh */ - { 0x00000ee3, 14745 }, /* Hangul_J_Mieum */ - { 0x00000ee4, 14848 }, /* Hangul_J_Pieub */ - { 0x00000ee5, 14863 }, /* Hangul_J_PieubSios */ - { 0x00000ee6, 15038 }, /* Hangul_J_Sios */ - { 0x00000ee7, 15073 }, /* Hangul_J_SsangSios */ - { 0x00000ee8, 14636 }, /* Hangul_J_Ieung */ - { 0x00000ee9, 14651 }, /* Hangul_J_Jieuj */ - { 0x00000eea, 14590 }, /* Hangul_J_Cieuc */ - { 0x00000eeb, 14666 }, /* Hangul_J_Khieuq */ - { 0x00000eec, 15092 }, /* Hangul_J_Tieut */ - { 0x00000eed, 14832 }, /* Hangul_J_Phieuf */ - { 0x00000eee, 14621 }, /* Hangul_J_Hieuh */ - { 0x00000eef, 15601 }, /* Hangul_RieulYeorinHieuh */ - { 0x00000ef0, 15793 }, /* Hangul_SunkyeongeumMieum */ - { 0x00000ef1, 15844 }, /* Hangul_SunkyeongeumPieub */ - { 0x00000ef2, 15344 }, /* Hangul_PanSios */ - { 0x00000ef3, 15213 }, /* Hangul_KkogjiDalrinIeung */ - { 0x00000ef4, 15818 }, /* Hangul_SunkyeongeumPhieuf */ - { 0x00000ef5, 15999 }, /* Hangul_YeorinHieuh */ - { 0x00000ef6, 14418 }, /* Hangul_AraeA */ - { 0x00000ef7, 14431 }, /* Hangul_AraeAE */ - { 0x00000ef8, 14815 }, /* Hangul_J_PanSios */ - { 0x00000ef9, 14718 }, /* Hangul_J_KkogjiDalrinIeung */ - { 0x00000efa, 15107 }, /* Hangul_J_YeorinHieuh */ - { 0x00000eff, 18797 }, /* Korean_Won */ - { 0x000013bc, 20514 }, /* OE */ - { 0x000013bd, 20517 }, /* oe */ - { 0x000013be, 29155 }, /* Ydiaeresis */ - { 0x000020ac, 12090 }, /* EuroSign */ + { 0x00000bd3, 26519 }, /* upstile */ + { 0x00000bd6, 11434 }, /* downshoe */ + { 0x00000bd8, 22596 }, /* rightshoe */ + { 0x00000bda, 19450 }, /* leftshoe */ + { 0x00000bdc, 19485 }, /* lefttack */ + { 0x00000bfc, 22634 }, /* righttack */ + { 0x00000cdf, 16255 }, /* hebrew_doublelowline */ + { 0x00000ce0, 16168 }, /* hebrew_aleph */ + { 0x00000ce1, 16193 }, /* hebrew_bet */ + { 0x00000ce2, 16374 }, /* hebrew_gimel */ + { 0x00000ce3, 16228 }, /* hebrew_dalet */ + { 0x00000ce4, 16401 }, /* hebrew_he */ + { 0x00000ce5, 16613 }, /* hebrew_waw */ + { 0x00000ce6, 16659 }, /* hebrew_zain */ + { 0x00000ce7, 16216 }, /* hebrew_chet */ + { 0x00000ce8, 16590 }, /* hebrew_tet */ + { 0x00000ce9, 16624 }, /* hebrew_yod */ + { 0x00000cea, 16276 }, /* hebrew_finalkaph */ + { 0x00000ceb, 16422 }, /* hebrew_kaph */ + { 0x00000cec, 16445 }, /* hebrew_lamed */ + { 0x00000ced, 16293 }, /* hebrew_finalmem */ + { 0x00000cee, 16458 }, /* hebrew_mem */ + { 0x00000cef, 16309 }, /* hebrew_finalnun */ + { 0x00000cf0, 16469 }, /* hebrew_nun */ + { 0x00000cf1, 16514 }, /* hebrew_samech */ + { 0x00000cf2, 16181 }, /* hebrew_ayin */ + { 0x00000cf3, 16325 }, /* hebrew_finalpe */ + { 0x00000cf4, 16480 }, /* hebrew_pe */ + { 0x00000cf5, 16340 }, /* hebrew_finalzade */ + { 0x00000cf6, 16635 }, /* hebrew_zade */ + { 0x00000cf7, 16490 }, /* hebrew_qoph */ + { 0x00000cf8, 16502 }, /* hebrew_resh */ + { 0x00000cf9, 16542 }, /* hebrew_shin */ + { 0x00000cfa, 16579 }, /* hebrew_taw */ + { 0x00000da1, 24699 }, /* Thai_kokai */ + { 0x00000da2, 24629 }, /* Thai_khokhai */ + { 0x00000da3, 24655 }, /* Thai_khokhuat */ + { 0x00000da4, 24669 }, /* Thai_khokhwai */ + { 0x00000da5, 24642 }, /* Thai_khokhon */ + { 0x00000da6, 24683 }, /* Thai_khorakhang */ + { 0x00000da7, 25012 }, /* Thai_ngongu */ + { 0x00000da8, 24505 }, /* Thai_chochan */ + { 0x00000da9, 24532 }, /* Thai_choching */ + { 0x00000daa, 24518 }, /* Thai_chochang */ + { 0x00000dab, 25373 }, /* Thai_soso */ + { 0x00000dac, 24546 }, /* Thai_chochoe */ + { 0x00000dad, 25549 }, /* Thai_yoying */ + { 0x00000dae, 24559 }, /* Thai_dochada */ + { 0x00000daf, 25502 }, /* Thai_topatak */ + { 0x00000db0, 25461 }, /* Thai_thothan */ + { 0x00000db1, 25411 }, /* Thai_thonangmontho */ + { 0x00000db2, 25430 }, /* Thai_thophuthao */ + { 0x00000db3, 25038 }, /* Thai_nonen */ + { 0x00000db4, 24572 }, /* Thai_dodek */ + { 0x00000db5, 25515 }, /* Thai_totao */ + { 0x00000db6, 25488 }, /* Thai_thothung */ + { 0x00000db7, 25446 }, /* Thai_thothahan */ + { 0x00000db8, 25474 }, /* Thai_thothong */ + { 0x00000db9, 25049 }, /* Thai_nonu */ + { 0x00000dba, 24491 }, /* Thai_bobaimai */ + { 0x00000dbb, 25140 }, /* Thai_popla */ + { 0x00000dbc, 25110 }, /* Thai_phophung */ + { 0x00000dbd, 24583 }, /* Thai_fofa */ + { 0x00000dbe, 25097 }, /* Thai_phophan */ + { 0x00000dbf, 24593 }, /* Thai_fofan */ + { 0x00000dc0, 25124 }, /* Thai_phosamphao */ + { 0x00000dc1, 25002 }, /* Thai_moma */ + { 0x00000dc2, 25538 }, /* Thai_yoyak */ + { 0x00000dc3, 25151 }, /* Thai_rorua */ + { 0x00000dc4, 25162 }, /* Thai_ru */ + { 0x00000dc5, 24862 }, /* Thai_loling */ + { 0x00000dc6, 24874 }, /* Thai_lu */ + { 0x00000dc7, 25526 }, /* Thai_wowaen */ + { 0x00000dc8, 25361 }, /* Thai_sosala */ + { 0x00000dc9, 25349 }, /* Thai_sorusi */ + { 0x00000dca, 25383 }, /* Thai_sosua */ + { 0x00000dcb, 24604 }, /* Thai_hohip */ + { 0x00000dcc, 24849 }, /* Thai_lochula */ + { 0x00000dcd, 25059 }, /* Thai_oang */ + { 0x00000dce, 24615 }, /* Thai_honokhuk */ + { 0x00000dcf, 25069 }, /* Thai_paiyannoi */ + { 0x00000dd0, 25170 }, /* Thai_saraa */ + { 0x00000dd1, 24910 }, /* Thai_maihanakat */ + { 0x00000dd2, 25181 }, /* Thai_saraaa */ + { 0x00000dd3, 25244 }, /* Thai_saraam */ + { 0x00000dd4, 25267 }, /* Thai_sarai */ + { 0x00000dd5, 25278 }, /* Thai_saraii */ + { 0x00000dd6, 25312 }, /* Thai_saraue */ + { 0x00000dd7, 25324 }, /* Thai_sarauee */ + { 0x00000dd8, 25301 }, /* Thai_sarau */ + { 0x00000dd9, 25337 }, /* Thai_sarauu */ + { 0x00000dda, 25084 }, /* Thai_phinthu */ + { 0x00000dde, 24926 }, /* Thai_maihanakat_maitho */ + { 0x00000ddf, 24481 }, /* Thai_baht */ + { 0x00000de0, 25256 }, /* Thai_sarae */ + { 0x00000de1, 25193 }, /* Thai_saraae */ + { 0x00000de2, 25290 }, /* Thai_sarao */ + { 0x00000de3, 25225 }, /* Thai_saraaimaimuan */ + { 0x00000de4, 25205 }, /* Thai_saraaimaimalai */ + { 0x00000de5, 24710 }, /* Thai_lakkhangyao */ + { 0x00000de6, 24988 }, /* Thai_maiyamok */ + { 0x00000de7, 24949 }, /* Thai_maitaikhu */ + { 0x00000de8, 24899 }, /* Thai_maiek */ + { 0x00000de9, 24964 }, /* Thai_maitho */ + { 0x00000dea, 24976 }, /* Thai_maitri */ + { 0x00000deb, 24882 }, /* Thai_maichattawa */ + { 0x00000dec, 25394 }, /* Thai_thanthakhat */ + { 0x00000ded, 25024 }, /* Thai_nikhahit */ + { 0x00000df0, 24837 }, /* Thai_leksun */ + { 0x00000df1, 24775 }, /* Thai_leknung */ + { 0x00000df2, 24824 }, /* Thai_leksong */ + { 0x00000df3, 24801 }, /* Thai_leksam */ + { 0x00000df4, 24813 }, /* Thai_leksi */ + { 0x00000df5, 24740 }, /* Thai_lekha */ + { 0x00000df6, 24751 }, /* Thai_lekhok */ + { 0x00000df7, 24727 }, /* Thai_lekchet */ + { 0x00000df8, 24788 }, /* Thai_lekpaet */ + { 0x00000df9, 24763 }, /* Thai_lekkao */ + { 0x00000ea1, 15263 }, /* Hangul_Kiyeog */ + { 0x00000ea2, 15808 }, /* Hangul_SsangKiyeog */ + { 0x00000ea3, 15277 }, /* Hangul_KiyeogSios */ + { 0x00000ea4, 15358 }, /* Hangul_Nieun */ + { 0x00000ea5, 15389 }, /* Hangul_NieunJieuj */ + { 0x00000ea6, 15371 }, /* Hangul_NieunHieuh */ + { 0x00000ea7, 14570 }, /* Hangul_Dikeud */ + { 0x00000ea8, 15771 }, /* Hangul_SsangDikeud */ + { 0x00000ea9, 15543 }, /* Hangul_Rieul */ + { 0x00000eaa, 15574 }, /* Hangul_RieulKiyeog */ + { 0x00000eab, 15593 }, /* Hangul_RieulMieum */ + { 0x00000eac, 15630 }, /* Hangul_RieulPieub */ + { 0x00000ead, 15648 }, /* Hangul_RieulSios */ + { 0x00000eae, 15665 }, /* Hangul_RieulTieut */ + { 0x00000eaf, 15611 }, /* Hangul_RieulPhieuf */ + { 0x00000eb0, 15556 }, /* Hangul_RieulHieuh */ + { 0x00000eb1, 15320 }, /* Hangul_Mieum */ + { 0x00000eb2, 15455 }, /* Hangul_Pieub */ + { 0x00000eb3, 15827 }, /* Hangul_SsangPieub */ + { 0x00000eb4, 15468 }, /* Hangul_PieubSios */ + { 0x00000eb5, 15744 }, /* Hangul_Sios */ + { 0x00000eb6, 15845 }, /* Hangul_SsangSios */ + { 0x00000eb7, 14659 }, /* Hangul_Ieung */ + { 0x00000eb8, 15236 }, /* Hangul_Jieuj */ + { 0x00000eb9, 15790 }, /* Hangul_SsangJieuj */ + { 0x00000eba, 14540 }, /* Hangul_Cieuc */ + { 0x00000ebb, 15249 }, /* Hangul_Khieuq */ + { 0x00000ebc, 15965 }, /* Hangul_Tieut */ + { 0x00000ebd, 15441 }, /* Hangul_Phieuf */ + { 0x00000ebe, 14637 }, /* Hangul_Hieuh */ + { 0x00000ebf, 14481 }, /* Hangul_A */ + { 0x00000ec0, 14490 }, /* Hangul_AE */ + { 0x00000ec1, 16039 }, /* Hangul_YA */ + { 0x00000ec2, 16049 }, /* Hangul_YAE */ + { 0x00000ec3, 14604 }, /* Hangul_EO */ + { 0x00000ec4, 14584 }, /* Hangul_E */ + { 0x00000ec5, 16070 }, /* Hangul_YEO */ + { 0x00000ec6, 16060 }, /* Hangul_YE */ + { 0x00000ec7, 15407 }, /* Hangul_O */ + { 0x00000ec8, 15987 }, /* Hangul_WA */ + { 0x00000ec9, 15997 }, /* Hangul_WAE */ + { 0x00000eca, 15416 }, /* Hangul_OE */ + { 0x00000ecb, 16110 }, /* Hangul_YO */ + { 0x00000ecc, 15978 }, /* Hangul_U */ + { 0x00000ecd, 16018 }, /* Hangul_WEO */ + { 0x00000ece, 16008 }, /* Hangul_WE */ + { 0x00000ecf, 16029 }, /* Hangul_WI */ + { 0x00000ed0, 16120 }, /* Hangul_YU */ + { 0x00000ed1, 14614 }, /* Hangul_EU */ + { 0x00000ed2, 16100 }, /* Hangul_YI */ + { 0x00000ed3, 14650 }, /* Hangul_I */ + { 0x00000ed4, 14764 }, /* Hangul_J_Kiyeog */ + { 0x00000ed5, 15134 }, /* Hangul_J_SsangKiyeog */ + { 0x00000ed6, 14780 }, /* Hangul_J_KiyeogSios */ + { 0x00000ed7, 14842 }, /* Hangul_J_Nieun */ + { 0x00000ed8, 14877 }, /* Hangul_J_NieunJieuj */ + { 0x00000ed9, 14857 }, /* Hangul_J_NieunHieuh */ + { 0x00000eda, 14687 }, /* Hangul_J_Dikeud */ + { 0x00000edb, 14964 }, /* Hangul_J_Rieul */ + { 0x00000edc, 14999 }, /* Hangul_J_RieulKiyeog */ + { 0x00000edd, 15020 }, /* Hangul_J_RieulMieum */ + { 0x00000ede, 15061 }, /* Hangul_J_RieulPieub */ + { 0x00000edf, 15081 }, /* Hangul_J_RieulSios */ + { 0x00000ee0, 15100 }, /* Hangul_J_RieulTieut */ + { 0x00000ee1, 15040 }, /* Hangul_J_RieulPhieuf */ + { 0x00000ee2, 14979 }, /* Hangul_J_RieulHieuh */ + { 0x00000ee3, 14827 }, /* Hangul_J_Mieum */ + { 0x00000ee4, 14930 }, /* Hangul_J_Pieub */ + { 0x00000ee5, 14945 }, /* Hangul_J_PieubSios */ + { 0x00000ee6, 15120 }, /* Hangul_J_Sios */ + { 0x00000ee7, 15155 }, /* Hangul_J_SsangSios */ + { 0x00000ee8, 14718 }, /* Hangul_J_Ieung */ + { 0x00000ee9, 14733 }, /* Hangul_J_Jieuj */ + { 0x00000eea, 14672 }, /* Hangul_J_Cieuc */ + { 0x00000eeb, 14748 }, /* Hangul_J_Khieuq */ + { 0x00000eec, 15174 }, /* Hangul_J_Tieut */ + { 0x00000eed, 14914 }, /* Hangul_J_Phieuf */ + { 0x00000eee, 14703 }, /* Hangul_J_Hieuh */ + { 0x00000eef, 15683 }, /* Hangul_RieulYeorinHieuh */ + { 0x00000ef0, 15875 }, /* Hangul_SunkyeongeumMieum */ + { 0x00000ef1, 15926 }, /* Hangul_SunkyeongeumPieub */ + { 0x00000ef2, 15426 }, /* Hangul_PanSios */ + { 0x00000ef3, 15295 }, /* Hangul_KkogjiDalrinIeung */ + { 0x00000ef4, 15900 }, /* Hangul_SunkyeongeumPhieuf */ + { 0x00000ef5, 16081 }, /* Hangul_YeorinHieuh */ + { 0x00000ef6, 14500 }, /* Hangul_AraeA */ + { 0x00000ef7, 14513 }, /* Hangul_AraeAE */ + { 0x00000ef8, 14897 }, /* Hangul_J_PanSios */ + { 0x00000ef9, 14800 }, /* Hangul_J_KkogjiDalrinIeung */ + { 0x00000efa, 15189 }, /* Hangul_J_YeorinHieuh */ + { 0x00000eff, 18879 }, /* Korean_Won */ + { 0x000013bc, 20596 }, /* OE */ + { 0x000013bd, 20599 }, /* oe */ + { 0x000013be, 31263 }, /* Ydiaeresis */ + { 0x000020ac, 12172 }, /* EuroSign */ { 0x0000fd01, 125 }, /* 3270_Duplicate */ { 0x0000fd02, 195 }, /* 3270_FieldMark */ { 0x0000fd03, 343 }, /* 3270_Right2 */ @@ -5839,293 +6440,293 @@ static const struct name_keysym keysym_to_name[] = { { 0x0000fd1c, 91 }, /* 3270_CursorSelect */ { 0x0000fd1d, 293 }, /* 3270_PrintScreen */ { 0x0000fd1e, 140 }, /* 3270_Enter */ - { 0x0000fe01, 17781 }, /* ISO_Lock */ - { 0x0000fe02, 17664 }, /* ISO_Level2_Latch */ - { 0x0000fe03, 17714 }, /* ISO_Level3_Shift */ - { 0x0000fe04, 17681 }, /* ISO_Level3_Latch */ - { 0x0000fe05, 17698 }, /* ISO_Level3_Lock */ - { 0x0000fe06, 17569 }, /* ISO_Group_Latch */ - { 0x0000fe07, 17585 }, /* ISO_Group_Lock */ - { 0x0000fe08, 17826 }, /* ISO_Next_Group */ - { 0x0000fe09, 17841 }, /* ISO_Next_Group_Lock */ - { 0x0000fe0a, 17950 }, /* ISO_Prev_Group */ - { 0x0000fe0b, 17965 }, /* ISO_Prev_Group_Lock */ - { 0x0000fe0c, 17532 }, /* ISO_First_Group */ - { 0x0000fe0d, 17548 }, /* ISO_First_Group_Lock */ - { 0x0000fe0e, 17616 }, /* ISO_Last_Group */ - { 0x0000fe0f, 17631 }, /* ISO_Last_Group_Lock */ - { 0x0000fe11, 17764 }, /* ISO_Level5_Shift */ - { 0x0000fe12, 17731 }, /* ISO_Level5_Latch */ - { 0x0000fe13, 17748 }, /* ISO_Level5_Lock */ - { 0x0000fe20, 17651 }, /* ISO_Left_Tab */ - { 0x0000fe21, 17809 }, /* ISO_Move_Line_Up */ - { 0x0000fe22, 17790 }, /* ISO_Move_Line_Down */ - { 0x0000fe23, 17883 }, /* ISO_Partial_Line_Up */ - { 0x0000fe24, 17861 }, /* ISO_Partial_Line_Down */ - { 0x0000fe25, 17903 }, /* ISO_Partial_Space_Left */ - { 0x0000fe26, 17926 }, /* ISO_Partial_Space_Right */ - { 0x0000fe27, 18059 }, /* ISO_Set_Margin_Left */ - { 0x0000fe28, 18079 }, /* ISO_Set_Margin_Right */ - { 0x0000fe29, 18010 }, /* ISO_Release_Margin_Left */ - { 0x0000fe2a, 18034 }, /* ISO_Release_Margin_Right */ - { 0x0000fe2b, 17985 }, /* ISO_Release_Both_Margins */ - { 0x0000fe2c, 17470 }, /* ISO_Fast_Cursor_Left */ - { 0x0000fe2d, 17491 }, /* ISO_Fast_Cursor_Right */ - { 0x0000fe2e, 17513 }, /* ISO_Fast_Cursor_Up */ - { 0x0000fe2f, 17449 }, /* ISO_Fast_Cursor_Down */ - { 0x0000fe30, 17372 }, /* ISO_Continuous_Underline */ - { 0x0000fe31, 17397 }, /* ISO_Discontinuous_Underline */ - { 0x0000fe32, 17425 }, /* ISO_Emphasize */ - { 0x0000fe33, 17354 }, /* ISO_Center_Object */ - { 0x0000fe34, 17439 }, /* ISO_Enter */ - { 0x0000fe50, 10858 }, /* dead_grave */ - { 0x0000fe51, 10531 }, /* dead_acute */ - { 0x0000fe52, 10754 }, /* dead_circumflex */ - { 0x0000fe53, 11097 }, /* dead_tilde */ - { 0x0000fe54, 10980 }, /* dead_macron */ - { 0x0000fe55, 10700 }, /* dead_breve */ - { 0x0000fe56, 10455 }, /* dead_abovedot */ - { 0x0000fe57, 10795 }, /* dead_diaeresis */ - { 0x0000fe58, 10493 }, /* dead_abovering */ - { 0x0000fe59, 10810 }, /* dead_doubleacute */ - { 0x0000fe5a, 10730 }, /* dead_caron */ - { 0x0000fe5b, 10741 }, /* dead_cedilla */ - { 0x0000fe5c, 11006 }, /* dead_ogonek */ - { 0x0000fe5d, 10933 }, /* dead_iota */ - { 0x0000fe5e, 11122 }, /* dead_voiced_sound */ - { 0x0000fe5f, 11046 }, /* dead_semivoiced_sound */ - { 0x0000fe60, 10615 }, /* dead_belowdot */ - { 0x0000fe61, 10880 }, /* dead_hook */ - { 0x0000fe62, 10890 }, /* dead_horn */ - { 0x0000fe63, 11085 }, /* dead_stroke */ - { 0x0000fe64, 10439 }, /* dead_abovecomma */ - { 0x0000fe65, 10469 }, /* dead_abovereversedcomma */ - { 0x0000fe66, 10827 }, /* dead_doublegrave */ - { 0x0000fe67, 10646 }, /* dead_belowring */ - { 0x0000fe68, 10629 }, /* dead_belowmacron */ - { 0x0000fe69, 10558 }, /* dead_belowcircumflex */ - { 0x0000fe6a, 10661 }, /* dead_belowtilde */ - { 0x0000fe6b, 10542 }, /* dead_belowbreve */ - { 0x0000fe6c, 10595 }, /* dead_belowdiaeresis */ - { 0x0000fe6d, 10914 }, /* dead_invertedbreve */ - { 0x0000fe6e, 10579 }, /* dead_belowcomma */ - { 0x0000fe6f, 10770 }, /* dead_currency */ + { 0x0000fe01, 17863 }, /* ISO_Lock */ + { 0x0000fe02, 17746 }, /* ISO_Level2_Latch */ + { 0x0000fe03, 17796 }, /* ISO_Level3_Shift */ + { 0x0000fe04, 17763 }, /* ISO_Level3_Latch */ + { 0x0000fe05, 17780 }, /* ISO_Level3_Lock */ + { 0x0000fe06, 17651 }, /* ISO_Group_Latch */ + { 0x0000fe07, 17667 }, /* ISO_Group_Lock */ + { 0x0000fe08, 17908 }, /* ISO_Next_Group */ + { 0x0000fe09, 17923 }, /* ISO_Next_Group_Lock */ + { 0x0000fe0a, 18032 }, /* ISO_Prev_Group */ + { 0x0000fe0b, 18047 }, /* ISO_Prev_Group_Lock */ + { 0x0000fe0c, 17614 }, /* ISO_First_Group */ + { 0x0000fe0d, 17630 }, /* ISO_First_Group_Lock */ + { 0x0000fe0e, 17698 }, /* ISO_Last_Group */ + { 0x0000fe0f, 17713 }, /* ISO_Last_Group_Lock */ + { 0x0000fe11, 17846 }, /* ISO_Level5_Shift */ + { 0x0000fe12, 17813 }, /* ISO_Level5_Latch */ + { 0x0000fe13, 17830 }, /* ISO_Level5_Lock */ + { 0x0000fe20, 17733 }, /* ISO_Left_Tab */ + { 0x0000fe21, 17891 }, /* ISO_Move_Line_Up */ + { 0x0000fe22, 17872 }, /* ISO_Move_Line_Down */ + { 0x0000fe23, 17965 }, /* ISO_Partial_Line_Up */ + { 0x0000fe24, 17943 }, /* ISO_Partial_Line_Down */ + { 0x0000fe25, 17985 }, /* ISO_Partial_Space_Left */ + { 0x0000fe26, 18008 }, /* ISO_Partial_Space_Right */ + { 0x0000fe27, 18141 }, /* ISO_Set_Margin_Left */ + { 0x0000fe28, 18161 }, /* ISO_Set_Margin_Right */ + { 0x0000fe29, 18092 }, /* ISO_Release_Margin_Left */ + { 0x0000fe2a, 18116 }, /* ISO_Release_Margin_Right */ + { 0x0000fe2b, 18067 }, /* ISO_Release_Both_Margins */ + { 0x0000fe2c, 17552 }, /* ISO_Fast_Cursor_Left */ + { 0x0000fe2d, 17573 }, /* ISO_Fast_Cursor_Right */ + { 0x0000fe2e, 17595 }, /* ISO_Fast_Cursor_Up */ + { 0x0000fe2f, 17531 }, /* ISO_Fast_Cursor_Down */ + { 0x0000fe30, 17454 }, /* ISO_Continuous_Underline */ + { 0x0000fe31, 17479 }, /* ISO_Discontinuous_Underline */ + { 0x0000fe32, 17507 }, /* ISO_Emphasize */ + { 0x0000fe33, 17436 }, /* ISO_Center_Object */ + { 0x0000fe34, 17521 }, /* ISO_Enter */ + { 0x0000fe50, 10940 }, /* dead_grave */ + { 0x0000fe51, 10613 }, /* dead_acute */ + { 0x0000fe52, 10836 }, /* dead_circumflex */ + { 0x0000fe53, 11179 }, /* dead_tilde */ + { 0x0000fe54, 11062 }, /* dead_macron */ + { 0x0000fe55, 10782 }, /* dead_breve */ + { 0x0000fe56, 10537 }, /* dead_abovedot */ + { 0x0000fe57, 10877 }, /* dead_diaeresis */ + { 0x0000fe58, 10575 }, /* dead_abovering */ + { 0x0000fe59, 10892 }, /* dead_doubleacute */ + { 0x0000fe5a, 10812 }, /* dead_caron */ + { 0x0000fe5b, 10823 }, /* dead_cedilla */ + { 0x0000fe5c, 11088 }, /* dead_ogonek */ + { 0x0000fe5d, 11015 }, /* dead_iota */ + { 0x0000fe5e, 11204 }, /* dead_voiced_sound */ + { 0x0000fe5f, 11128 }, /* dead_semivoiced_sound */ + { 0x0000fe60, 10697 }, /* dead_belowdot */ + { 0x0000fe61, 10962 }, /* dead_hook */ + { 0x0000fe62, 10972 }, /* dead_horn */ + { 0x0000fe63, 11167 }, /* dead_stroke */ + { 0x0000fe64, 10521 }, /* dead_abovecomma */ + { 0x0000fe65, 10551 }, /* dead_abovereversedcomma */ + { 0x0000fe66, 10909 }, /* dead_doublegrave */ + { 0x0000fe67, 10728 }, /* dead_belowring */ + { 0x0000fe68, 10711 }, /* dead_belowmacron */ + { 0x0000fe69, 10640 }, /* dead_belowcircumflex */ + { 0x0000fe6a, 10743 }, /* dead_belowtilde */ + { 0x0000fe6b, 10624 }, /* dead_belowbreve */ + { 0x0000fe6c, 10677 }, /* dead_belowdiaeresis */ + { 0x0000fe6d, 10996 }, /* dead_invertedbreve */ + { 0x0000fe6e, 10661 }, /* dead_belowcomma */ + { 0x0000fe6f, 10852 }, /* dead_currency */ { 0x0000fe70, 583 }, /* AccessX_Enable */ { 0x0000fe71, 598 }, /* AccessX_Feedback_Enable */ - { 0x0000fe72, 22342 }, /* RepeatKeys_Enable */ - { 0x0000fe73, 23774 }, /* SlowKeys_Enable */ + { 0x0000fe72, 22424 }, /* RepeatKeys_Enable */ + { 0x0000fe73, 23856 }, /* SlowKeys_Enable */ { 0x0000fe74, 3564 }, /* BounceKeys_Enable */ - { 0x0000fe75, 23836 }, /* StickyKeys_Enable */ - { 0x0000fe76, 19782 }, /* MouseKeys_Enable */ - { 0x0000fe77, 19759 }, /* MouseKeys_Accel_Enable */ - { 0x0000fe78, 21332 }, /* Overlay1_Enable */ - { 0x0000fe79, 21348 }, /* Overlay2_Enable */ + { 0x0000fe75, 23918 }, /* StickyKeys_Enable */ + { 0x0000fe76, 19864 }, /* MouseKeys_Enable */ + { 0x0000fe77, 19841 }, /* MouseKeys_Accel_Enable */ + { 0x0000fe78, 21414 }, /* Overlay1_Enable */ + { 0x0000fe79, 21430 }, /* Overlay2_Enable */ { 0x0000fe7a, 3309 }, /* AudibleBell_Enable */ - { 0x0000fe80, 10425 }, /* dead_a */ - { 0x0000fe81, 10432 }, /* dead_A */ - { 0x0000fe82, 10844 }, /* dead_e */ - { 0x0000fe83, 10851 }, /* dead_E */ - { 0x0000fe84, 10900 }, /* dead_i */ - { 0x0000fe85, 10907 }, /* dead_I */ - { 0x0000fe86, 10992 }, /* dead_o */ - { 0x0000fe87, 10999 }, /* dead_O */ - { 0x0000fe88, 11108 }, /* dead_u */ - { 0x0000fe89, 11115 }, /* dead_U */ - { 0x0000fe8a, 11068 }, /* dead_small_schwa */ - { 0x0000fe8b, 10711 }, /* dead_capital_schwa */ - { 0x0000fe8c, 10869 }, /* dead_greek */ - { 0x0000fe90, 10967 }, /* dead_lowline */ - { 0x0000fe91, 10508 }, /* dead_aboveverticalline */ - { 0x0000fe92, 10677 }, /* dead_belowverticalline */ - { 0x0000fe93, 10943 }, /* dead_longsolidusoverlay */ + { 0x0000fe80, 10507 }, /* dead_a */ + { 0x0000fe81, 10514 }, /* dead_A */ + { 0x0000fe82, 10926 }, /* dead_e */ + { 0x0000fe83, 10933 }, /* dead_E */ + { 0x0000fe84, 10982 }, /* dead_i */ + { 0x0000fe85, 10989 }, /* dead_I */ + { 0x0000fe86, 11074 }, /* dead_o */ + { 0x0000fe87, 11081 }, /* dead_O */ + { 0x0000fe88, 11190 }, /* dead_u */ + { 0x0000fe89, 11197 }, /* dead_U */ + { 0x0000fe8a, 11150 }, /* dead_small_schwa */ + { 0x0000fe8b, 10793 }, /* dead_capital_schwa */ + { 0x0000fe8c, 10951 }, /* dead_greek */ + { 0x0000fe90, 11049 }, /* dead_lowline */ + { 0x0000fe91, 10590 }, /* dead_aboveverticalline */ + { 0x0000fe92, 10759 }, /* dead_belowverticalline */ + { 0x0000fe93, 11025 }, /* dead_longsolidusoverlay */ { 0x0000fea0, 8594 }, /* ch */ { 0x0000fea1, 8597 }, /* Ch */ { 0x0000fea2, 8600 }, /* CH */ { 0x0000fea3, 8443 }, /* c_h */ { 0x0000fea4, 8447 }, /* C_h */ { 0x0000fea5, 8451 }, /* C_H */ - { 0x0000fed0, 12536 }, /* First_Virtual_Screen */ - { 0x0000fed1, 22080 }, /* Prev_Virtual_Screen */ - { 0x0000fed2, 20028 }, /* Next_Virtual_Screen */ - { 0x0000fed4, 19161 }, /* Last_Virtual_Screen */ - { 0x0000fed5, 24382 }, /* Terminate_Server */ - { 0x0000fee0, 21998 }, /* Pointer_Left */ - { 0x0000fee1, 22011 }, /* Pointer_Right */ - { 0x0000fee2, 22025 }, /* Pointer_Up */ - { 0x0000fee3, 21843 }, /* Pointer_Down */ - { 0x0000fee4, 22036 }, /* Pointer_UpLeft */ - { 0x0000fee5, 22051 }, /* Pointer_UpRight */ - { 0x0000fee6, 21856 }, /* Pointer_DownLeft */ - { 0x0000fee7, 21873 }, /* Pointer_DownRight */ - { 0x0000fee8, 21671 }, /* Pointer_Button_Dflt */ - { 0x0000fee9, 21591 }, /* Pointer_Button1 */ - { 0x0000feea, 21607 }, /* Pointer_Button2 */ - { 0x0000feeb, 21623 }, /* Pointer_Button3 */ - { 0x0000feec, 21639 }, /* Pointer_Button4 */ - { 0x0000feed, 21655 }, /* Pointer_Button5 */ - { 0x0000feee, 21781 }, /* Pointer_DblClick_Dflt */ - { 0x0000feef, 21691 }, /* Pointer_DblClick1 */ - { 0x0000fef0, 21709 }, /* Pointer_DblClick2 */ - { 0x0000fef1, 21727 }, /* Pointer_DblClick3 */ - { 0x0000fef2, 21745 }, /* Pointer_DblClick4 */ - { 0x0000fef3, 21763 }, /* Pointer_DblClick5 */ - { 0x0000fef4, 21961 }, /* Pointer_Drag_Dflt */ - { 0x0000fef5, 21891 }, /* Pointer_Drag1 */ - { 0x0000fef6, 21905 }, /* Pointer_Drag2 */ - { 0x0000fef7, 21919 }, /* Pointer_Drag3 */ - { 0x0000fef8, 21933 }, /* Pointer_Drag4 */ - { 0x0000fef9, 21979 }, /* Pointer_EnableKeys */ - { 0x0000fefa, 21572 }, /* Pointer_Accelerate */ - { 0x0000fefb, 21803 }, /* Pointer_DfltBtnNext */ - { 0x0000fefc, 21823 }, /* Pointer_DfltBtnPrev */ - { 0x0000fefd, 21947 }, /* Pointer_Drag5 */ + { 0x0000fed0, 12618 }, /* First_Virtual_Screen */ + { 0x0000fed1, 22162 }, /* Prev_Virtual_Screen */ + { 0x0000fed2, 20110 }, /* Next_Virtual_Screen */ + { 0x0000fed4, 19243 }, /* Last_Virtual_Screen */ + { 0x0000fed5, 24464 }, /* Terminate_Server */ + { 0x0000fee0, 22080 }, /* Pointer_Left */ + { 0x0000fee1, 22093 }, /* Pointer_Right */ + { 0x0000fee2, 22107 }, /* Pointer_Up */ + { 0x0000fee3, 21925 }, /* Pointer_Down */ + { 0x0000fee4, 22118 }, /* Pointer_UpLeft */ + { 0x0000fee5, 22133 }, /* Pointer_UpRight */ + { 0x0000fee6, 21938 }, /* Pointer_DownLeft */ + { 0x0000fee7, 21955 }, /* Pointer_DownRight */ + { 0x0000fee8, 21753 }, /* Pointer_Button_Dflt */ + { 0x0000fee9, 21673 }, /* Pointer_Button1 */ + { 0x0000feea, 21689 }, /* Pointer_Button2 */ + { 0x0000feeb, 21705 }, /* Pointer_Button3 */ + { 0x0000feec, 21721 }, /* Pointer_Button4 */ + { 0x0000feed, 21737 }, /* Pointer_Button5 */ + { 0x0000feee, 21863 }, /* Pointer_DblClick_Dflt */ + { 0x0000feef, 21773 }, /* Pointer_DblClick1 */ + { 0x0000fef0, 21791 }, /* Pointer_DblClick2 */ + { 0x0000fef1, 21809 }, /* Pointer_DblClick3 */ + { 0x0000fef2, 21827 }, /* Pointer_DblClick4 */ + { 0x0000fef3, 21845 }, /* Pointer_DblClick5 */ + { 0x0000fef4, 22043 }, /* Pointer_Drag_Dflt */ + { 0x0000fef5, 21973 }, /* Pointer_Drag1 */ + { 0x0000fef6, 21987 }, /* Pointer_Drag2 */ + { 0x0000fef7, 22001 }, /* Pointer_Drag3 */ + { 0x0000fef8, 22015 }, /* Pointer_Drag4 */ + { 0x0000fef9, 22061 }, /* Pointer_EnableKeys */ + { 0x0000fefa, 21654 }, /* Pointer_Accelerate */ + { 0x0000fefb, 21885 }, /* Pointer_DfltBtnNext */ + { 0x0000fefc, 21905 }, /* Pointer_DfltBtnPrev */ + { 0x0000fefd, 22029 }, /* Pointer_Drag5 */ { 0x0000ff08, 3362 }, /* BackSpace */ - { 0x0000ff09, 24298 }, /* Tab */ - { 0x0000ff0a, 19434 }, /* Linefeed */ + { 0x0000ff09, 24380 }, /* Tab */ + { 0x0000ff0a, 19516 }, /* Linefeed */ { 0x0000ff0b, 8633 }, /* Clear */ - { 0x0000ff0d, 22366 }, /* Return */ - { 0x0000ff13, 21481 }, /* Pause */ - { 0x0000ff14, 22699 }, /* Scroll_Lock */ - { 0x0000ff15, 24279 }, /* Sys_Req */ - { 0x0000ff1b, 12057 }, /* Escape */ - { 0x0000ff20, 19811 }, /* Multi_key */ - { 0x0000ff21, 18745 }, /* Kanji */ - { 0x0000ff22, 19802 }, /* Muhenkan */ - { 0x0000ff23, 16614 }, /* Henkan_Mode */ - { 0x0000ff24, 22562 }, /* Romaji */ - { 0x0000ff25, 16635 }, /* Hiragana */ - { 0x0000ff26, 18770 }, /* Katakana */ - { 0x0000ff27, 16644 }, /* Hiragana_Katakana */ - { 0x0000ff28, 29271 }, /* Zenkaku */ - { 0x0000ff29, 16048 }, /* Hankaku */ - { 0x0000ff2a, 29279 }, /* Zenkaku_Hankaku */ - { 0x0000ff2b, 25752 }, /* Touroku */ - { 0x0000ff2c, 19698 }, /* Massyo */ - { 0x0000ff2d, 18351 }, /* Kana_Lock */ - { 0x0000ff2e, 18562 }, /* Kana_Shift */ - { 0x0000ff2f, 11779 }, /* Eisu_Shift */ - { 0x0000ff30, 11790 }, /* Eisu_toggle */ - { 0x0000ff31, 14392 }, /* Hangul */ - { 0x0000ff32, 15780 }, /* Hangul_Start */ - { 0x0000ff33, 14511 }, /* Hangul_End */ - { 0x0000ff34, 14542 }, /* Hangul_Hanja */ - { 0x0000ff35, 15128 }, /* Hangul_Jamo */ - { 0x0000ff36, 15625 }, /* Hangul_Romaja */ + { 0x0000ff0d, 22448 }, /* Return */ + { 0x0000ff13, 21563 }, /* Pause */ + { 0x0000ff14, 22781 }, /* Scroll_Lock */ + { 0x0000ff15, 24361 }, /* Sys_Req */ + { 0x0000ff1b, 12139 }, /* Escape */ + { 0x0000ff20, 19893 }, /* Multi_key */ + { 0x0000ff21, 18827 }, /* Kanji */ + { 0x0000ff22, 19884 }, /* Muhenkan */ + { 0x0000ff23, 16696 }, /* Henkan_Mode */ + { 0x0000ff24, 22644 }, /* Romaji */ + { 0x0000ff25, 16717 }, /* Hiragana */ + { 0x0000ff26, 18852 }, /* Katakana */ + { 0x0000ff27, 16726 }, /* Hiragana_Katakana */ + { 0x0000ff28, 31379 }, /* Zenkaku */ + { 0x0000ff29, 16130 }, /* Hankaku */ + { 0x0000ff2a, 31387 }, /* Zenkaku_Hankaku */ + { 0x0000ff2b, 25834 }, /* Touroku */ + { 0x0000ff2c, 19780 }, /* Massyo */ + { 0x0000ff2d, 18433 }, /* Kana_Lock */ + { 0x0000ff2e, 18644 }, /* Kana_Shift */ + { 0x0000ff2f, 11861 }, /* Eisu_Shift */ + { 0x0000ff30, 11872 }, /* Eisu_toggle */ + { 0x0000ff31, 14474 }, /* Hangul */ + { 0x0000ff32, 15862 }, /* Hangul_Start */ + { 0x0000ff33, 14593 }, /* Hangul_End */ + { 0x0000ff34, 14624 }, /* Hangul_Hanja */ + { 0x0000ff35, 15210 }, /* Hangul_Jamo */ + { 0x0000ff36, 15707 }, /* Hangul_Romaja */ { 0x0000ff37, 8654 }, /* Codeinput */ - { 0x0000ff38, 15140 }, /* Hangul_Jeonja */ - { 0x0000ff39, 14445 }, /* Hangul_Banja */ - { 0x0000ff3a, 15420 }, /* Hangul_PreHanja */ - { 0x0000ff3b, 15403 }, /* Hangul_PostHanja */ - { 0x0000ff3c, 23012 }, /* SingleCandidate */ - { 0x0000ff3d, 19821 }, /* MultipleCandidate */ - { 0x0000ff3e, 22100 }, /* PreviousCandidate */ - { 0x0000ff3f, 15674 }, /* Hangul_Special */ - { 0x0000ff50, 16662 }, /* Home */ - { 0x0000ff51, 19244 }, /* Left */ - { 0x0000ff52, 26384 }, /* Up */ - { 0x0000ff53, 22373 }, /* Right */ - { 0x0000ff54, 11327 }, /* Down */ - { 0x0000ff55, 22124 }, /* Prior */ - { 0x0000ff56, 20023 }, /* Next */ - { 0x0000ff57, 11936 }, /* End */ + { 0x0000ff38, 15222 }, /* Hangul_Jeonja */ + { 0x0000ff39, 14527 }, /* Hangul_Banja */ + { 0x0000ff3a, 15502 }, /* Hangul_PreHanja */ + { 0x0000ff3b, 15485 }, /* Hangul_PostHanja */ + { 0x0000ff3c, 23094 }, /* SingleCandidate */ + { 0x0000ff3d, 19903 }, /* MultipleCandidate */ + { 0x0000ff3e, 22182 }, /* PreviousCandidate */ + { 0x0000ff3f, 15756 }, /* Hangul_Special */ + { 0x0000ff50, 16744 }, /* Home */ + { 0x0000ff51, 19326 }, /* Left */ + { 0x0000ff52, 26466 }, /* Up */ + { 0x0000ff53, 22455 }, /* Right */ + { 0x0000ff54, 11409 }, /* Down */ + { 0x0000ff55, 22206 }, /* Prior */ + { 0x0000ff56, 20105 }, /* Next */ + { 0x0000ff57, 12018 }, /* End */ { 0x0000ff58, 3404 }, /* Begin */ - { 0x0000ff60, 22727 }, /* Select */ - { 0x0000ff61, 22118 }, /* Print */ - { 0x0000ff62, 12117 }, /* Execute */ - { 0x0000ff63, 17284 }, /* Insert */ - { 0x0000ff65, 26357 }, /* Undo */ - { 0x0000ff66, 22326 }, /* Redo */ - { 0x0000ff67, 19705 }, /* Menu */ - { 0x0000ff68, 12531 }, /* Find */ + { 0x0000ff60, 22809 }, /* Select */ + { 0x0000ff61, 22200 }, /* Print */ + { 0x0000ff62, 12199 }, /* Execute */ + { 0x0000ff63, 17366 }, /* Insert */ + { 0x0000ff65, 26439 }, /* Undo */ + { 0x0000ff66, 22408 }, /* Redo */ + { 0x0000ff67, 19787 }, /* Menu */ + { 0x0000ff68, 12613 }, /* Find */ { 0x0000ff69, 8489 }, /* Cancel */ - { 0x0000ff6a, 16602 }, /* Help */ + { 0x0000ff6a, 16684 }, /* Help */ { 0x0000ff6b, 8377 }, /* Break */ - { 0x0000ff7e, 19747 }, /* Mode_switch */ - { 0x0000ff7f, 20169 }, /* Num_Lock */ - { 0x0000ff80, 19074 }, /* KP_Space */ - { 0x0000ff89, 19095 }, /* KP_Tab */ - { 0x0000ff8d, 18931 }, /* KP_Enter */ - { 0x0000ff91, 18949 }, /* KP_F1 */ - { 0x0000ff92, 18955 }, /* KP_F2 */ - { 0x0000ff93, 18961 }, /* KP_F3 */ - { 0x0000ff94, 18967 }, /* KP_F4 */ - { 0x0000ff95, 18973 }, /* KP_Home */ - { 0x0000ff96, 18991 }, /* KP_Left */ - { 0x0000ff97, 19102 }, /* KP_Up */ - { 0x0000ff98, 19052 }, /* KP_Right */ - { 0x0000ff99, 18916 }, /* KP_Down */ - { 0x0000ff9a, 19043 }, /* KP_Prior */ - { 0x0000ff9b, 19011 }, /* KP_Next */ - { 0x0000ff9c, 18924 }, /* KP_End */ - { 0x0000ff9d, 18876 }, /* KP_Begin */ - { 0x0000ff9e, 18981 }, /* KP_Insert */ - { 0x0000ff9f, 18896 }, /* KP_Delete */ - { 0x0000ffaa, 18999 }, /* KP_Multiply */ - { 0x0000ffab, 18858 }, /* KP_Add */ - { 0x0000ffac, 19061 }, /* KP_Separator */ - { 0x0000ffad, 19083 }, /* KP_Subtract */ - { 0x0000ffae, 18885 }, /* KP_Decimal */ - { 0x0000ffaf, 18906 }, /* KP_Divide */ - { 0x0000ffb0, 18808 }, /* KP_0 */ - { 0x0000ffb1, 18813 }, /* KP_1 */ - { 0x0000ffb2, 18818 }, /* KP_2 */ - { 0x0000ffb3, 18823 }, /* KP_3 */ - { 0x0000ffb4, 18828 }, /* KP_4 */ - { 0x0000ffb5, 18833 }, /* KP_5 */ - { 0x0000ffb6, 18838 }, /* KP_6 */ - { 0x0000ffb7, 18843 }, /* KP_7 */ - { 0x0000ffb8, 18848 }, /* KP_8 */ - { 0x0000ffb9, 18853 }, /* KP_9 */ - { 0x0000ffbd, 18940 }, /* KP_Equal */ - { 0x0000ffbe, 12159 }, /* F1 */ - { 0x0000ffbf, 12202 }, /* F2 */ - { 0x0000ffc0, 12245 }, /* F3 */ - { 0x0000ffc1, 12272 }, /* F4 */ - { 0x0000ffc2, 12275 }, /* F5 */ - { 0x0000ffc3, 12278 }, /* F6 */ - { 0x0000ffc4, 12281 }, /* F7 */ - { 0x0000ffc5, 12284 }, /* F8 */ - { 0x0000ffc6, 12287 }, /* F9 */ - { 0x0000ffc7, 12162 }, /* F10 */ - { 0x0000ffc8, 12166 }, /* F11 */ - { 0x0000ffc9, 12170 }, /* F12 */ - { 0x0000ffca, 12174 }, /* F13 */ - { 0x0000ffcb, 12178 }, /* F14 */ - { 0x0000ffcc, 12182 }, /* F15 */ - { 0x0000ffcd, 12186 }, /* F16 */ - { 0x0000ffce, 12190 }, /* F17 */ - { 0x0000ffcf, 12194 }, /* F18 */ - { 0x0000ffd0, 12198 }, /* F19 */ - { 0x0000ffd1, 12205 }, /* F20 */ - { 0x0000ffd2, 12209 }, /* F21 */ - { 0x0000ffd3, 12213 }, /* F22 */ - { 0x0000ffd4, 12217 }, /* F23 */ - { 0x0000ffd5, 12221 }, /* F24 */ - { 0x0000ffd6, 12225 }, /* F25 */ - { 0x0000ffd7, 12229 }, /* F26 */ - { 0x0000ffd8, 12233 }, /* F27 */ - { 0x0000ffd9, 12237 }, /* F28 */ - { 0x0000ffda, 12241 }, /* F29 */ - { 0x0000ffdb, 12248 }, /* F30 */ - { 0x0000ffdc, 12252 }, /* F31 */ - { 0x0000ffdd, 12256 }, /* F32 */ - { 0x0000ffde, 12260 }, /* F33 */ - { 0x0000ffdf, 12264 }, /* F34 */ - { 0x0000ffe0, 12268 }, /* F35 */ - { 0x0000ffe1, 22946 }, /* Shift_L */ - { 0x0000ffe2, 22965 }, /* Shift_R */ - { 0x0000ffe3, 8697 }, /* Control_L */ - { 0x0000ffe4, 8707 }, /* Control_R */ + { 0x0000ff7e, 19829 }, /* Mode_switch */ + { 0x0000ff7f, 20251 }, /* Num_Lock */ + { 0x0000ff80, 19156 }, /* KP_Space */ + { 0x0000ff89, 19177 }, /* KP_Tab */ + { 0x0000ff8d, 19013 }, /* KP_Enter */ + { 0x0000ff91, 19031 }, /* KP_F1 */ + { 0x0000ff92, 19037 }, /* KP_F2 */ + { 0x0000ff93, 19043 }, /* KP_F3 */ + { 0x0000ff94, 19049 }, /* KP_F4 */ + { 0x0000ff95, 19055 }, /* KP_Home */ + { 0x0000ff96, 19073 }, /* KP_Left */ + { 0x0000ff97, 19184 }, /* KP_Up */ + { 0x0000ff98, 19134 }, /* KP_Right */ + { 0x0000ff99, 18998 }, /* KP_Down */ + { 0x0000ff9a, 19125 }, /* KP_Prior */ + { 0x0000ff9b, 19093 }, /* KP_Next */ + { 0x0000ff9c, 19006 }, /* KP_End */ + { 0x0000ff9d, 18958 }, /* KP_Begin */ + { 0x0000ff9e, 19063 }, /* KP_Insert */ + { 0x0000ff9f, 18978 }, /* KP_Delete */ + { 0x0000ffaa, 19081 }, /* KP_Multiply */ + { 0x0000ffab, 18940 }, /* KP_Add */ + { 0x0000ffac, 19143 }, /* KP_Separator */ + { 0x0000ffad, 19165 }, /* KP_Subtract */ + { 0x0000ffae, 18967 }, /* KP_Decimal */ + { 0x0000ffaf, 18988 }, /* KP_Divide */ + { 0x0000ffb0, 18890 }, /* KP_0 */ + { 0x0000ffb1, 18895 }, /* KP_1 */ + { 0x0000ffb2, 18900 }, /* KP_2 */ + { 0x0000ffb3, 18905 }, /* KP_3 */ + { 0x0000ffb4, 18910 }, /* KP_4 */ + { 0x0000ffb5, 18915 }, /* KP_5 */ + { 0x0000ffb6, 18920 }, /* KP_6 */ + { 0x0000ffb7, 18925 }, /* KP_7 */ + { 0x0000ffb8, 18930 }, /* KP_8 */ + { 0x0000ffb9, 18935 }, /* KP_9 */ + { 0x0000ffbd, 19022 }, /* KP_Equal */ + { 0x0000ffbe, 12241 }, /* F1 */ + { 0x0000ffbf, 12284 }, /* F2 */ + { 0x0000ffc0, 12327 }, /* F3 */ + { 0x0000ffc1, 12354 }, /* F4 */ + { 0x0000ffc2, 12357 }, /* F5 */ + { 0x0000ffc3, 12360 }, /* F6 */ + { 0x0000ffc4, 12363 }, /* F7 */ + { 0x0000ffc5, 12366 }, /* F8 */ + { 0x0000ffc6, 12369 }, /* F9 */ + { 0x0000ffc7, 12244 }, /* F10 */ + { 0x0000ffc8, 12248 }, /* F11 */ + { 0x0000ffc9, 12252 }, /* F12 */ + { 0x0000ffca, 12256 }, /* F13 */ + { 0x0000ffcb, 12260 }, /* F14 */ + { 0x0000ffcc, 12264 }, /* F15 */ + { 0x0000ffcd, 12268 }, /* F16 */ + { 0x0000ffce, 12272 }, /* F17 */ + { 0x0000ffcf, 12276 }, /* F18 */ + { 0x0000ffd0, 12280 }, /* F19 */ + { 0x0000ffd1, 12287 }, /* F20 */ + { 0x0000ffd2, 12291 }, /* F21 */ + { 0x0000ffd3, 12295 }, /* F22 */ + { 0x0000ffd4, 12299 }, /* F23 */ + { 0x0000ffd5, 12303 }, /* F24 */ + { 0x0000ffd6, 12307 }, /* F25 */ + { 0x0000ffd7, 12311 }, /* F26 */ + { 0x0000ffd8, 12315 }, /* F27 */ + { 0x0000ffd9, 12319 }, /* F28 */ + { 0x0000ffda, 12323 }, /* F29 */ + { 0x0000ffdb, 12330 }, /* F30 */ + { 0x0000ffdc, 12334 }, /* F31 */ + { 0x0000ffdd, 12338 }, /* F32 */ + { 0x0000ffde, 12342 }, /* F33 */ + { 0x0000ffdf, 12346 }, /* F34 */ + { 0x0000ffe0, 12350 }, /* F35 */ + { 0x0000ffe1, 23028 }, /* Shift_L */ + { 0x0000ffe2, 23047 }, /* Shift_R */ + { 0x0000ffe3, 8779 }, /* Control_L */ + { 0x0000ffe4, 8789 }, /* Control_R */ { 0x0000ffe5, 8496 }, /* Caps_Lock */ - { 0x0000ffe6, 22954 }, /* Shift_Lock */ - { 0x0000ffe7, 19710 }, /* Meta_L */ - { 0x0000ffe8, 19717 }, /* Meta_R */ + { 0x0000ffe6, 23036 }, /* Shift_Lock */ + { 0x0000ffe7, 19792 }, /* Meta_L */ + { 0x0000ffe8, 19799 }, /* Meta_R */ { 0x0000ffe9, 880 }, /* Alt_L */ { 0x0000ffea, 886 }, /* Alt_R */ - { 0x0000ffeb, 24263 }, /* Super_L */ - { 0x0000ffec, 24271 }, /* Super_R */ - { 0x0000ffed, 17046 }, /* Hyper_L */ - { 0x0000ffee, 17054 }, /* Hyper_R */ + { 0x0000ffeb, 24345 }, /* Super_L */ + { 0x0000ffec, 24353 }, /* Super_R */ + { 0x0000ffed, 17128 }, /* Hyper_L */ + { 0x0000ffee, 17136 }, /* Hyper_R */ { 0x0000fff1, 3642 }, /* braille_dot_1 */ { 0x0000fff2, 3671 }, /* braille_dot_2 */ { 0x0000fff3, 3685 }, /* braille_dot_3 */ @@ -6136,60 +6737,65 @@ static const struct name_keysym keysym_to_name[] = { { 0x0000fff8, 3755 }, /* braille_dot_8 */ { 0x0000fff9, 3769 }, /* braille_dot_9 */ { 0x0000fffa, 3656 }, /* braille_dot_10 */ - { 0x0000ffff, 11160 }, /* Delete */ - { 0x00ffffff, 26531 }, /* VoidSymbol */ - { 0x0100012c, 17117 }, /* Ibreve */ - { 0x0100012d, 17124 }, /* ibreve */ - { 0x01000174, 26563 }, /* Wcircumflex */ - { 0x01000175, 26575 }, /* wcircumflex */ - { 0x01000176, 29120 }, /* Ycircumflex */ - { 0x01000177, 29132 }, /* ycircumflex */ - { 0x0100018f, 22649 }, /* SCHWA */ - { 0x0100019f, 20218 }, /* Obarred */ - { 0x010001a0, 20553 }, /* Ohorn */ - { 0x010001a1, 20559 }, /* ohorn */ - { 0x010001af, 25997 }, /* Uhorn */ - { 0x010001b0, 26003 }, /* uhorn */ - { 0x010001b5, 29322 }, /* Zstroke */ - { 0x010001b6, 29330 }, /* zstroke */ - { 0x010001b7, 12147 }, /* EZH */ - { 0x010001d1, 20254 }, /* Ocaron */ - { 0x010001d2, 20261 }, /* ocaron */ - { 0x010001e6, 12703 }, /* Gcaron */ - { 0x010001e7, 12710 }, /* gcaron */ - { 0x01000259, 22655 }, /* schwa */ - { 0x01000275, 20226 }, /* obarred */ - { 0x01000292, 12151 }, /* ezh */ - { 0x01000492, 9236 }, /* Cyrillic_GHE_bar */ - { 0x01000493, 9253 }, /* Cyrillic_ghe_bar */ - { 0x01000496, 10274 }, /* Cyrillic_ZHE_descender */ - { 0x01000497, 10297 }, /* Cyrillic_zhe_descender */ - { 0x0100049a, 9528 }, /* Cyrillic_KA_descender */ - { 0x0100049b, 9550 }, /* Cyrillic_ka_descender */ - { 0x0100049c, 9572 }, /* Cyrillic_KA_vertstroke */ - { 0x0100049d, 9595 }, /* Cyrillic_ka_vertstroke */ - { 0x010004a2, 9118 }, /* Cyrillic_EN_descender */ - { 0x010004a3, 9140 }, /* Cyrillic_en_descender */ - { 0x010004ae, 10036 }, /* Cyrillic_U_straight */ - { 0x010004af, 10056 }, /* Cyrillic_u_straight */ - { 0x010004b0, 10076 }, /* Cyrillic_U_straight_bar */ - { 0x010004b1, 10100 }, /* Cyrillic_u_straight_bar */ - { 0x010004b2, 9294 }, /* Cyrillic_HA_descender */ - { 0x010004b3, 9316 }, /* Cyrillic_ha_descender */ - { 0x010004b6, 8854 }, /* Cyrillic_CHE_descender */ - { 0x010004b7, 8877 }, /* Cyrillic_che_descender */ - { 0x010004b8, 8900 }, /* Cyrillic_CHE_vertstroke */ - { 0x010004b9, 8924 }, /* Cyrillic_che_vertstroke */ - { 0x010004ba, 9832 }, /* Cyrillic_SHHA */ - { 0x010004bb, 9846 }, /* Cyrillic_shha */ - { 0x010004d8, 9746 }, /* Cyrillic_SCHWA */ - { 0x010004d9, 9761 }, /* Cyrillic_schwa */ - { 0x010004e2, 9396 }, /* Cyrillic_I_macron */ - { 0x010004e3, 9414 }, /* Cyrillic_i_macron */ - { 0x010004e8, 9692 }, /* Cyrillic_O_bar */ - { 0x010004e9, 9707 }, /* Cyrillic_o_bar */ - { 0x010004ee, 10000 }, /* Cyrillic_U_macron */ - { 0x010004ef, 10018 }, /* Cyrillic_u_macron */ + { 0x0000ffff, 11242 }, /* Delete */ + { 0x00ffffff, 26613 }, /* VoidSymbol */ + { 0x0100012c, 17199 }, /* Ibreve */ + { 0x0100012d, 17206 }, /* ibreve */ + { 0x01000174, 26645 }, /* Wcircumflex */ + { 0x01000175, 26657 }, /* wcircumflex */ + { 0x01000176, 31228 }, /* Ycircumflex */ + { 0x01000177, 31240 }, /* ycircumflex */ + { 0x0100018f, 22731 }, /* SCHWA */ + { 0x0100019f, 20300 }, /* Obarred */ + { 0x010001a0, 20635 }, /* Ohorn */ + { 0x010001a1, 20641 }, /* ohorn */ + { 0x010001af, 26079 }, /* Uhorn */ + { 0x010001b0, 26085 }, /* uhorn */ + { 0x010001b5, 31430 }, /* Zstroke */ + { 0x010001b6, 31438 }, /* zstroke */ + { 0x010001b7, 12229 }, /* EZH */ + { 0x010001d1, 20336 }, /* Ocaron */ + { 0x010001d2, 20343 }, /* ocaron */ + { 0x010001e6, 12785 }, /* Gcaron */ + { 0x010001e7, 12792 }, /* gcaron */ + { 0x01000259, 22737 }, /* schwa */ + { 0x01000275, 20308 }, /* obarred */ + { 0x01000292, 12233 }, /* ezh */ + { 0x01000300, 8715 }, /* combining_grave */ + { 0x01000301, 8680 }, /* combining_acute */ + { 0x01000303, 8746 }, /* combining_tilde */ + { 0x01000309, 8731 }, /* combining_hook */ + { 0x01000323, 8696 }, /* combining_belowdot */ + { 0x01000492, 9318 }, /* Cyrillic_GHE_bar */ + { 0x01000493, 9335 }, /* Cyrillic_ghe_bar */ + { 0x01000496, 10356 }, /* Cyrillic_ZHE_descender */ + { 0x01000497, 10379 }, /* Cyrillic_zhe_descender */ + { 0x0100049a, 9610 }, /* Cyrillic_KA_descender */ + { 0x0100049b, 9632 }, /* Cyrillic_ka_descender */ + { 0x0100049c, 9654 }, /* Cyrillic_KA_vertstroke */ + { 0x0100049d, 9677 }, /* Cyrillic_ka_vertstroke */ + { 0x010004a2, 9200 }, /* Cyrillic_EN_descender */ + { 0x010004a3, 9222 }, /* Cyrillic_en_descender */ + { 0x010004ae, 10118 }, /* Cyrillic_U_straight */ + { 0x010004af, 10138 }, /* Cyrillic_u_straight */ + { 0x010004b0, 10158 }, /* Cyrillic_U_straight_bar */ + { 0x010004b1, 10182 }, /* Cyrillic_u_straight_bar */ + { 0x010004b2, 9376 }, /* Cyrillic_HA_descender */ + { 0x010004b3, 9398 }, /* Cyrillic_ha_descender */ + { 0x010004b6, 8936 }, /* Cyrillic_CHE_descender */ + { 0x010004b7, 8959 }, /* Cyrillic_che_descender */ + { 0x010004b8, 8982 }, /* Cyrillic_CHE_vertstroke */ + { 0x010004b9, 9006 }, /* Cyrillic_che_vertstroke */ + { 0x010004ba, 9914 }, /* Cyrillic_SHHA */ + { 0x010004bb, 9928 }, /* Cyrillic_shha */ + { 0x010004d8, 9828 }, /* Cyrillic_SCHWA */ + { 0x010004d9, 9843 }, /* Cyrillic_schwa */ + { 0x010004e2, 9478 }, /* Cyrillic_I_macron */ + { 0x010004e3, 9496 }, /* Cyrillic_i_macron */ + { 0x010004e8, 9774 }, /* Cyrillic_O_bar */ + { 0x010004e9, 9789 }, /* Cyrillic_o_bar */ + { 0x010004ee, 10082 }, /* Cyrillic_U_macron */ + { 0x010004ef, 10100 }, /* Cyrillic_u_macron */ { 0x01000531, 2124 }, /* Armenian_AYB */ { 0x01000532, 2150 }, /* Armenian_BEN */ { 0x01000533, 2374 }, /* Armenian_GIM */ @@ -6301,162 +6907,162 @@ static const struct name_keysym keysym_to_name[] = { { 0x010006ba, 1642 }, /* Arabic_noon_ghunna */ { 0x010006be, 1442 }, /* Arabic_heh_doachashmee */ { 0x010006c1, 1465 }, /* Arabic_heh_goal */ - { 0x010006cc, 12390 }, /* Farsi_yeh */ + { 0x010006cc, 12472 }, /* Farsi_yeh */ { 0x010006d2, 1996 }, /* Arabic_yeh_baree */ { 0x010006d4, 1242 }, /* Arabic_fullstop */ - { 0x010006f0, 12310 }, /* Farsi_0 */ - { 0x010006f1, 12318 }, /* Farsi_1 */ - { 0x010006f2, 12326 }, /* Farsi_2 */ - { 0x010006f3, 12334 }, /* Farsi_3 */ - { 0x010006f4, 12342 }, /* Farsi_4 */ - { 0x010006f5, 12350 }, /* Farsi_5 */ - { 0x010006f6, 12358 }, /* Farsi_6 */ - { 0x010006f7, 12366 }, /* Farsi_7 */ - { 0x010006f8, 12374 }, /* Farsi_8 */ - { 0x010006f9, 12382 }, /* Farsi_9 */ - { 0x01000d82, 23484 }, /* Sinh_ng */ - { 0x01000d83, 23278 }, /* Sinh_h2 */ - { 0x01000d85, 23047 }, /* Sinh_a */ - { 0x01000d86, 23054 }, /* Sinh_aa */ - { 0x01000d87, 23071 }, /* Sinh_ae */ - { 0x01000d88, 23088 }, /* Sinh_aee */ - { 0x01000d89, 23294 }, /* Sinh_i */ - { 0x01000d8a, 23309 }, /* Sinh_ii */ - { 0x01000d8b, 23695 }, /* Sinh_u */ - { 0x01000d8c, 23710 }, /* Sinh_uu */ - { 0x01000d8d, 23594 }, /* Sinh_ri */ - { 0x01000d8e, 23602 }, /* Sinh_rii */ - { 0x01000d8f, 23403 }, /* Sinh_lu */ - { 0x01000d90, 23420 }, /* Sinh_luu */ - { 0x01000d91, 23221 }, /* Sinh_e */ - { 0x01000d92, 23236 }, /* Sinh_ee */ - { 0x01000d93, 23107 }, /* Sinh_ai */ - { 0x01000d94, 23537 }, /* Sinh_o */ - { 0x01000d95, 23552 }, /* Sinh_oo */ - { 0x01000d96, 23132 }, /* Sinh_au */ - { 0x01000d9a, 23353 }, /* Sinh_ka */ - { 0x01000d9b, 23361 }, /* Sinh_kha */ - { 0x01000d9c, 23261 }, /* Sinh_ga */ - { 0x01000d9d, 23269 }, /* Sinh_gha */ - { 0x01000d9e, 23492 }, /* Sinh_ng2 */ - { 0x01000d9f, 23501 }, /* Sinh_nga */ - { 0x01000da0, 23166 }, /* Sinh_ca */ - { 0x01000da1, 23174 }, /* Sinh_cha */ - { 0x01000da2, 23326 }, /* Sinh_ja */ - { 0x01000da3, 23334 }, /* Sinh_jha */ - { 0x01000da4, 23528 }, /* Sinh_nya */ - { 0x01000da5, 23343 }, /* Sinh_jnya */ - { 0x01000da6, 23510 }, /* Sinh_nja */ - { 0x01000da7, 23676 }, /* Sinh_tta */ - { 0x01000da8, 23685 }, /* Sinh_ttha */ - { 0x01000da9, 23183 }, /* Sinh_dda */ - { 0x01000daa, 23192 }, /* Sinh_ddha */ - { 0x01000dab, 23519 }, /* Sinh_nna */ - { 0x01000dac, 23464 }, /* Sinh_ndda */ - { 0x01000dad, 23657 }, /* Sinh_tha */ - { 0x01000dae, 23666 }, /* Sinh_thha */ - { 0x01000daf, 23202 }, /* Sinh_dha */ - { 0x01000db0, 23211 }, /* Sinh_dhha */ - { 0x01000db1, 23456 }, /* Sinh_na */ - { 0x01000db3, 23474 }, /* Sinh_ndha */ - { 0x01000db4, 23569 }, /* Sinh_pa */ - { 0x01000db5, 23577 }, /* Sinh_pha */ - { 0x01000db6, 23149 }, /* Sinh_ba */ - { 0x01000db7, 23157 }, /* Sinh_bha */ - { 0x01000db8, 23439 }, /* Sinh_ma */ - { 0x01000db9, 23447 }, /* Sinh_mba */ - { 0x01000dba, 23735 }, /* Sinh_ya */ - { 0x01000dbb, 23586 }, /* Sinh_ra */ - { 0x01000dbd, 23386 }, /* Sinh_la */ - { 0x01000dc0, 23727 }, /* Sinh_va */ - { 0x01000dc1, 23638 }, /* Sinh_sha */ - { 0x01000dc2, 23647 }, /* Sinh_ssha */ - { 0x01000dc3, 23630 }, /* Sinh_sa */ - { 0x01000dc4, 23286 }, /* Sinh_ha */ - { 0x01000dc5, 23394 }, /* Sinh_lla */ - { 0x01000dc6, 23253 }, /* Sinh_fa */ - { 0x01000dca, 23124 }, /* Sinh_al */ - { 0x01000dcf, 23062 }, /* Sinh_aa2 */ - { 0x01000dd0, 23079 }, /* Sinh_ae2 */ - { 0x01000dd1, 23097 }, /* Sinh_aee2 */ - { 0x01000dd2, 23301 }, /* Sinh_i2 */ - { 0x01000dd3, 23317 }, /* Sinh_ii2 */ - { 0x01000dd4, 23702 }, /* Sinh_u2 */ - { 0x01000dd6, 23718 }, /* Sinh_uu2 */ - { 0x01000dd8, 23611 }, /* Sinh_ru2 */ - { 0x01000dd9, 23228 }, /* Sinh_e2 */ - { 0x01000dda, 23244 }, /* Sinh_ee2 */ - { 0x01000ddb, 23115 }, /* Sinh_ai2 */ - { 0x01000ddc, 23544 }, /* Sinh_o2 */ - { 0x01000ddd, 23560 }, /* Sinh_oo2 */ - { 0x01000dde, 23140 }, /* Sinh_au2 */ - { 0x01000ddf, 23411 }, /* Sinh_lu2 */ - { 0x01000df2, 23620 }, /* Sinh_ruu2 */ - { 0x01000df3, 23429 }, /* Sinh_luu2 */ - { 0x01000df4, 23370 }, /* Sinh_kunddaliya */ - { 0x010010d0, 12759 }, /* Georgian_an */ - { 0x010010d1, 12771 }, /* Georgian_ban */ - { 0x010010d2, 12875 }, /* Georgian_gan */ - { 0x010010d3, 12838 }, /* Georgian_don */ - { 0x010010d4, 12851 }, /* Georgian_en */ - { 0x010010d5, 13201 }, /* Georgian_vin */ - { 0x010010d6, 13239 }, /* Georgian_zen */ - { 0x010010d7, 13163 }, /* Georgian_tan */ - { 0x010010d8, 12966 }, /* Georgian_in */ - { 0x010010d9, 13005 }, /* Georgian_kan */ - { 0x010010da, 13032 }, /* Georgian_las */ - { 0x010010db, 13045 }, /* Georgian_man */ - { 0x010010dc, 13058 }, /* Georgian_nar */ - { 0x010010dd, 13071 }, /* Georgian_on */ - { 0x010010de, 13083 }, /* Georgian_par */ - { 0x010010df, 13252 }, /* Georgian_zhar */ - { 0x010010e0, 13123 }, /* Georgian_rae */ - { 0x010010e1, 13136 }, /* Georgian_san */ - { 0x010010e2, 13176 }, /* Georgian_tar */ - { 0x010010e3, 13189 }, /* Georgian_un */ - { 0x010010e4, 13096 }, /* Georgian_phar */ - { 0x010010e5, 13018 }, /* Georgian_khar */ - { 0x010010e6, 12888 }, /* Georgian_ghan */ - { 0x010010e7, 13110 }, /* Georgian_qar */ - { 0x010010e8, 13149 }, /* Georgian_shin */ - { 0x010010e9, 12811 }, /* Georgian_chin */ - { 0x010010ea, 12784 }, /* Georgian_can */ - { 0x010010eb, 12992 }, /* Georgian_jil */ - { 0x010010ec, 12825 }, /* Georgian_cil */ - { 0x010010ed, 12797 }, /* Georgian_char */ - { 0x010010ee, 13226 }, /* Georgian_xan */ - { 0x010010ef, 12978 }, /* Georgian_jhan */ - { 0x010010f0, 12902 }, /* Georgian_hae */ - { 0x010010f1, 12928 }, /* Georgian_he */ - { 0x010010f2, 12940 }, /* Georgian_hie */ - { 0x010010f3, 13214 }, /* Georgian_we */ - { 0x010010f4, 12915 }, /* Georgian_har */ - { 0x010010f5, 12953 }, /* Georgian_hoe */ - { 0x010010f6, 12863 }, /* Georgian_fi */ + { 0x010006f0, 12392 }, /* Farsi_0 */ + { 0x010006f1, 12400 }, /* Farsi_1 */ + { 0x010006f2, 12408 }, /* Farsi_2 */ + { 0x010006f3, 12416 }, /* Farsi_3 */ + { 0x010006f4, 12424 }, /* Farsi_4 */ + { 0x010006f5, 12432 }, /* Farsi_5 */ + { 0x010006f6, 12440 }, /* Farsi_6 */ + { 0x010006f7, 12448 }, /* Farsi_7 */ + { 0x010006f8, 12456 }, /* Farsi_8 */ + { 0x010006f9, 12464 }, /* Farsi_9 */ + { 0x01000d82, 23566 }, /* Sinh_ng */ + { 0x01000d83, 23360 }, /* Sinh_h2 */ + { 0x01000d85, 23129 }, /* Sinh_a */ + { 0x01000d86, 23136 }, /* Sinh_aa */ + { 0x01000d87, 23153 }, /* Sinh_ae */ + { 0x01000d88, 23170 }, /* Sinh_aee */ + { 0x01000d89, 23376 }, /* Sinh_i */ + { 0x01000d8a, 23391 }, /* Sinh_ii */ + { 0x01000d8b, 23777 }, /* Sinh_u */ + { 0x01000d8c, 23792 }, /* Sinh_uu */ + { 0x01000d8d, 23676 }, /* Sinh_ri */ + { 0x01000d8e, 23684 }, /* Sinh_rii */ + { 0x01000d8f, 23485 }, /* Sinh_lu */ + { 0x01000d90, 23502 }, /* Sinh_luu */ + { 0x01000d91, 23303 }, /* Sinh_e */ + { 0x01000d92, 23318 }, /* Sinh_ee */ + { 0x01000d93, 23189 }, /* Sinh_ai */ + { 0x01000d94, 23619 }, /* Sinh_o */ + { 0x01000d95, 23634 }, /* Sinh_oo */ + { 0x01000d96, 23214 }, /* Sinh_au */ + { 0x01000d9a, 23435 }, /* Sinh_ka */ + { 0x01000d9b, 23443 }, /* Sinh_kha */ + { 0x01000d9c, 23343 }, /* Sinh_ga */ + { 0x01000d9d, 23351 }, /* Sinh_gha */ + { 0x01000d9e, 23574 }, /* Sinh_ng2 */ + { 0x01000d9f, 23583 }, /* Sinh_nga */ + { 0x01000da0, 23248 }, /* Sinh_ca */ + { 0x01000da1, 23256 }, /* Sinh_cha */ + { 0x01000da2, 23408 }, /* Sinh_ja */ + { 0x01000da3, 23416 }, /* Sinh_jha */ + { 0x01000da4, 23610 }, /* Sinh_nya */ + { 0x01000da5, 23425 }, /* Sinh_jnya */ + { 0x01000da6, 23592 }, /* Sinh_nja */ + { 0x01000da7, 23758 }, /* Sinh_tta */ + { 0x01000da8, 23767 }, /* Sinh_ttha */ + { 0x01000da9, 23265 }, /* Sinh_dda */ + { 0x01000daa, 23274 }, /* Sinh_ddha */ + { 0x01000dab, 23601 }, /* Sinh_nna */ + { 0x01000dac, 23546 }, /* Sinh_ndda */ + { 0x01000dad, 23739 }, /* Sinh_tha */ + { 0x01000dae, 23748 }, /* Sinh_thha */ + { 0x01000daf, 23284 }, /* Sinh_dha */ + { 0x01000db0, 23293 }, /* Sinh_dhha */ + { 0x01000db1, 23538 }, /* Sinh_na */ + { 0x01000db3, 23556 }, /* Sinh_ndha */ + { 0x01000db4, 23651 }, /* Sinh_pa */ + { 0x01000db5, 23659 }, /* Sinh_pha */ + { 0x01000db6, 23231 }, /* Sinh_ba */ + { 0x01000db7, 23239 }, /* Sinh_bha */ + { 0x01000db8, 23521 }, /* Sinh_ma */ + { 0x01000db9, 23529 }, /* Sinh_mba */ + { 0x01000dba, 23817 }, /* Sinh_ya */ + { 0x01000dbb, 23668 }, /* Sinh_ra */ + { 0x01000dbd, 23468 }, /* Sinh_la */ + { 0x01000dc0, 23809 }, /* Sinh_va */ + { 0x01000dc1, 23720 }, /* Sinh_sha */ + { 0x01000dc2, 23729 }, /* Sinh_ssha */ + { 0x01000dc3, 23712 }, /* Sinh_sa */ + { 0x01000dc4, 23368 }, /* Sinh_ha */ + { 0x01000dc5, 23476 }, /* Sinh_lla */ + { 0x01000dc6, 23335 }, /* Sinh_fa */ + { 0x01000dca, 23206 }, /* Sinh_al */ + { 0x01000dcf, 23144 }, /* Sinh_aa2 */ + { 0x01000dd0, 23161 }, /* Sinh_ae2 */ + { 0x01000dd1, 23179 }, /* Sinh_aee2 */ + { 0x01000dd2, 23383 }, /* Sinh_i2 */ + { 0x01000dd3, 23399 }, /* Sinh_ii2 */ + { 0x01000dd4, 23784 }, /* Sinh_u2 */ + { 0x01000dd6, 23800 }, /* Sinh_uu2 */ + { 0x01000dd8, 23693 }, /* Sinh_ru2 */ + { 0x01000dd9, 23310 }, /* Sinh_e2 */ + { 0x01000dda, 23326 }, /* Sinh_ee2 */ + { 0x01000ddb, 23197 }, /* Sinh_ai2 */ + { 0x01000ddc, 23626 }, /* Sinh_o2 */ + { 0x01000ddd, 23642 }, /* Sinh_oo2 */ + { 0x01000dde, 23222 }, /* Sinh_au2 */ + { 0x01000ddf, 23493 }, /* Sinh_lu2 */ + { 0x01000df2, 23702 }, /* Sinh_ruu2 */ + { 0x01000df3, 23511 }, /* Sinh_luu2 */ + { 0x01000df4, 23452 }, /* Sinh_kunddaliya */ + { 0x010010d0, 12841 }, /* Georgian_an */ + { 0x010010d1, 12853 }, /* Georgian_ban */ + { 0x010010d2, 12957 }, /* Georgian_gan */ + { 0x010010d3, 12920 }, /* Georgian_don */ + { 0x010010d4, 12933 }, /* Georgian_en */ + { 0x010010d5, 13283 }, /* Georgian_vin */ + { 0x010010d6, 13321 }, /* Georgian_zen */ + { 0x010010d7, 13245 }, /* Georgian_tan */ + { 0x010010d8, 13048 }, /* Georgian_in */ + { 0x010010d9, 13087 }, /* Georgian_kan */ + { 0x010010da, 13114 }, /* Georgian_las */ + { 0x010010db, 13127 }, /* Georgian_man */ + { 0x010010dc, 13140 }, /* Georgian_nar */ + { 0x010010dd, 13153 }, /* Georgian_on */ + { 0x010010de, 13165 }, /* Georgian_par */ + { 0x010010df, 13334 }, /* Georgian_zhar */ + { 0x010010e0, 13205 }, /* Georgian_rae */ + { 0x010010e1, 13218 }, /* Georgian_san */ + { 0x010010e2, 13258 }, /* Georgian_tar */ + { 0x010010e3, 13271 }, /* Georgian_un */ + { 0x010010e4, 13178 }, /* Georgian_phar */ + { 0x010010e5, 13100 }, /* Georgian_khar */ + { 0x010010e6, 12970 }, /* Georgian_ghan */ + { 0x010010e7, 13192 }, /* Georgian_qar */ + { 0x010010e8, 13231 }, /* Georgian_shin */ + { 0x010010e9, 12893 }, /* Georgian_chin */ + { 0x010010ea, 12866 }, /* Georgian_can */ + { 0x010010eb, 13074 }, /* Georgian_jil */ + { 0x010010ec, 12907 }, /* Georgian_cil */ + { 0x010010ed, 12879 }, /* Georgian_char */ + { 0x010010ee, 13308 }, /* Georgian_xan */ + { 0x010010ef, 13060 }, /* Georgian_jhan */ + { 0x010010f0, 12984 }, /* Georgian_hae */ + { 0x010010f1, 13010 }, /* Georgian_he */ + { 0x010010f2, 13022 }, /* Georgian_hie */ + { 0x010010f3, 13296 }, /* Georgian_we */ + { 0x010010f4, 12997 }, /* Georgian_har */ + { 0x010010f5, 13035 }, /* Georgian_hoe */ + { 0x010010f6, 12945 }, /* Georgian_fi */ { 0x01001e02, 3332 }, /* Babovedot */ { 0x01001e03, 3342 }, /* babovedot */ - { 0x01001e0a, 10324 }, /* Dabovedot */ - { 0x01001e0b, 10334 }, /* dabovedot */ - { 0x01001e1e, 12290 }, /* Fabovedot */ - { 0x01001e1f, 12300 }, /* fabovedot */ - { 0x01001e36, 19192 }, /* Lbelowdot */ - { 0x01001e37, 19202 }, /* lbelowdot */ - { 0x01001e40, 19537 }, /* Mabovedot */ - { 0x01001e41, 19547 }, /* mabovedot */ - { 0x01001e56, 21377 }, /* Pabovedot */ - { 0x01001e57, 21387 }, /* pabovedot */ - { 0x01001e60, 22583 }, /* Sabovedot */ - { 0x01001e61, 22593 }, /* sabovedot */ - { 0x01001e6a, 24302 }, /* Tabovedot */ - { 0x01001e6b, 24312 }, /* tabovedot */ - { 0x01001e80, 26609 }, /* Wgrave */ - { 0x01001e81, 26616 }, /* wgrave */ - { 0x01001e82, 26549 }, /* Wacute */ - { 0x01001e83, 26556 }, /* wacute */ - { 0x01001e84, 26587 }, /* Wdiaeresis */ - { 0x01001e85, 26598 }, /* wdiaeresis */ - { 0x01001e8a, 26635 }, /* Xabovedot */ - { 0x01001e8b, 26645 }, /* xabovedot */ + { 0x01001e0a, 10406 }, /* Dabovedot */ + { 0x01001e0b, 10416 }, /* dabovedot */ + { 0x01001e1e, 12372 }, /* Fabovedot */ + { 0x01001e1f, 12382 }, /* fabovedot */ + { 0x01001e36, 19274 }, /* Lbelowdot */ + { 0x01001e37, 19284 }, /* lbelowdot */ + { 0x01001e40, 19619 }, /* Mabovedot */ + { 0x01001e41, 19629 }, /* mabovedot */ + { 0x01001e56, 21459 }, /* Pabovedot */ + { 0x01001e57, 21469 }, /* pabovedot */ + { 0x01001e60, 22665 }, /* Sabovedot */ + { 0x01001e61, 22675 }, /* sabovedot */ + { 0x01001e6a, 24384 }, /* Tabovedot */ + { 0x01001e6b, 24394 }, /* tabovedot */ + { 0x01001e80, 26691 }, /* Wgrave */ + { 0x01001e81, 26698 }, /* wgrave */ + { 0x01001e82, 26631 }, /* Wacute */ + { 0x01001e83, 26638 }, /* wacute */ + { 0x01001e84, 26669 }, /* Wdiaeresis */ + { 0x01001e85, 26680 }, /* wdiaeresis */ + { 0x01001e8a, 26717 }, /* Xabovedot */ + { 0x01001e8b, 26727 }, /* xabovedot */ { 0x01001ea0, 416 }, /* Abelowdot */ { 0x01001ea1, 426 }, /* abelowdot */ { 0x01001ea2, 868 }, /* Ahook */ @@ -6481,116 +7087,116 @@ static const struct name_keysym keysym_to_name[] = { { 0x01001eb5, 571 }, /* abrevetilde */ { 0x01001eb6, 483 }, /* Abrevebelowdot */ { 0x01001eb7, 498 }, /* abrevebelowdot */ - { 0x01001eb8, 11462 }, /* Ebelowdot */ - { 0x01001eb9, 11472 }, /* ebelowdot */ - { 0x01001eba, 11738 }, /* Ehook */ - { 0x01001ebb, 11744 }, /* ehook */ - { 0x01001ebc, 12076 }, /* Etilde */ - { 0x01001ebd, 12083 }, /* etilde */ - { 0x01001ebe, 11520 }, /* Ecircumflexacute */ - { 0x01001ebf, 11537 }, /* ecircumflexacute */ - { 0x01001ec0, 11594 }, /* Ecircumflexgrave */ - { 0x01001ec1, 11611 }, /* ecircumflexgrave */ - { 0x01001ec2, 11628 }, /* Ecircumflexhook */ - { 0x01001ec3, 11644 }, /* ecircumflexhook */ - { 0x01001ec4, 11660 }, /* Ecircumflextilde */ - { 0x01001ec5, 11677 }, /* ecircumflextilde */ - { 0x01001ec6, 11554 }, /* Ecircumflexbelowdot */ - { 0x01001ec7, 11574 }, /* ecircumflexbelowdot */ - { 0x01001ec8, 17219 }, /* Ihook */ - { 0x01001ec9, 17225 }, /* ihook */ - { 0x01001eca, 17097 }, /* Ibelowdot */ - { 0x01001ecb, 17107 }, /* ibelowdot */ - { 0x01001ecc, 20234 }, /* Obelowdot */ - { 0x01001ecd, 20244 }, /* obelowdot */ - { 0x01001ece, 20541 }, /* Ohook */ - { 0x01001ecf, 20547 }, /* ohook */ - { 0x01001ed0, 20292 }, /* Ocircumflexacute */ - { 0x01001ed1, 20309 }, /* ocircumflexacute */ - { 0x01001ed2, 20366 }, /* Ocircumflexgrave */ - { 0x01001ed3, 20383 }, /* ocircumflexgrave */ - { 0x01001ed4, 20400 }, /* Ocircumflexhook */ - { 0x01001ed5, 20416 }, /* ocircumflexhook */ - { 0x01001ed6, 20432 }, /* Ocircumflextilde */ - { 0x01001ed7, 20449 }, /* ocircumflextilde */ - { 0x01001ed8, 20326 }, /* Ocircumflexbelowdot */ - { 0x01001ed9, 20346 }, /* ocircumflexbelowdot */ - { 0x01001eda, 20565 }, /* Ohornacute */ - { 0x01001edb, 20576 }, /* ohornacute */ - { 0x01001edc, 20615 }, /* Ohorngrave */ - { 0x01001edd, 20626 }, /* ohorngrave */ - { 0x01001ede, 20637 }, /* Ohornhook */ - { 0x01001edf, 20647 }, /* ohornhook */ - { 0x01001ee0, 20657 }, /* Ohorntilde */ - { 0x01001ee1, 20668 }, /* ohorntilde */ - { 0x01001ee2, 20587 }, /* Ohornbelowdot */ - { 0x01001ee3, 20601 }, /* ohornbelowdot */ - { 0x01001ee4, 25865 }, /* Ubelowdot */ - { 0x01001ee5, 25875 }, /* ubelowdot */ - { 0x01001ee6, 25985 }, /* Uhook */ - { 0x01001ee7, 25991 }, /* uhook */ - { 0x01001ee8, 26009 }, /* Uhornacute */ - { 0x01001ee9, 26020 }, /* uhornacute */ - { 0x01001eea, 26059 }, /* Uhorngrave */ - { 0x01001eeb, 26070 }, /* uhorngrave */ - { 0x01001eec, 26081 }, /* Uhornhook */ - { 0x01001eed, 26091 }, /* uhornhook */ - { 0x01001eee, 26101 }, /* Uhorntilde */ - { 0x01001eef, 26112 }, /* uhorntilde */ - { 0x01001ef0, 26031 }, /* Uhornbelowdot */ - { 0x01001ef1, 26045 }, /* uhornbelowdot */ - { 0x01001ef2, 29170 }, /* Ygrave */ - { 0x01001ef3, 29177 }, /* ygrave */ - { 0x01001ef4, 29100 }, /* Ybelowdot */ - { 0x01001ef5, 29110 }, /* ybelowdot */ - { 0x01001ef6, 29184 }, /* Yhook */ - { 0x01001ef7, 29190 }, /* yhook */ - { 0x01001ef8, 29196 }, /* Ytilde */ - { 0x01001ef9, 29203 }, /* ytilde */ - { 0x01002070, 29309 }, /* zerosuperior */ - { 0x01002074, 12632 }, /* foursuperior */ - { 0x01002075, 12594 }, /* fivesuperior */ - { 0x01002076, 23756 }, /* sixsuperior */ - { 0x01002077, 22932 }, /* sevensuperior */ - { 0x01002078, 11765 }, /* eightsuperior */ - { 0x01002079, 20062 }, /* ninesuperior */ - { 0x01002080, 29295 }, /* zerosubscript */ - { 0x01002081, 20742 }, /* onesubscript */ - { 0x01002082, 25812 }, /* twosubscript */ - { 0x01002083, 25556 }, /* threesubscript */ - { 0x01002084, 12618 }, /* foursubscript */ - { 0x01002085, 12580 }, /* fivesubscript */ - { 0x01002086, 23743 }, /* sixsubscript */ - { 0x01002087, 22917 }, /* sevensubscript */ - { 0x01002088, 11750 }, /* eightsubscript */ - { 0x01002089, 20048 }, /* ninesubscript */ - { 0x010020a0, 11694 }, /* EcuSign */ + { 0x01001eb8, 11544 }, /* Ebelowdot */ + { 0x01001eb9, 11554 }, /* ebelowdot */ + { 0x01001eba, 11820 }, /* Ehook */ + { 0x01001ebb, 11826 }, /* ehook */ + { 0x01001ebc, 12158 }, /* Etilde */ + { 0x01001ebd, 12165 }, /* etilde */ + { 0x01001ebe, 11602 }, /* Ecircumflexacute */ + { 0x01001ebf, 11619 }, /* ecircumflexacute */ + { 0x01001ec0, 11676 }, /* Ecircumflexgrave */ + { 0x01001ec1, 11693 }, /* ecircumflexgrave */ + { 0x01001ec2, 11710 }, /* Ecircumflexhook */ + { 0x01001ec3, 11726 }, /* ecircumflexhook */ + { 0x01001ec4, 11742 }, /* Ecircumflextilde */ + { 0x01001ec5, 11759 }, /* ecircumflextilde */ + { 0x01001ec6, 11636 }, /* Ecircumflexbelowdot */ + { 0x01001ec7, 11656 }, /* ecircumflexbelowdot */ + { 0x01001ec8, 17301 }, /* Ihook */ + { 0x01001ec9, 17307 }, /* ihook */ + { 0x01001eca, 17179 }, /* Ibelowdot */ + { 0x01001ecb, 17189 }, /* ibelowdot */ + { 0x01001ecc, 20316 }, /* Obelowdot */ + { 0x01001ecd, 20326 }, /* obelowdot */ + { 0x01001ece, 20623 }, /* Ohook */ + { 0x01001ecf, 20629 }, /* ohook */ + { 0x01001ed0, 20374 }, /* Ocircumflexacute */ + { 0x01001ed1, 20391 }, /* ocircumflexacute */ + { 0x01001ed2, 20448 }, /* Ocircumflexgrave */ + { 0x01001ed3, 20465 }, /* ocircumflexgrave */ + { 0x01001ed4, 20482 }, /* Ocircumflexhook */ + { 0x01001ed5, 20498 }, /* ocircumflexhook */ + { 0x01001ed6, 20514 }, /* Ocircumflextilde */ + { 0x01001ed7, 20531 }, /* ocircumflextilde */ + { 0x01001ed8, 20408 }, /* Ocircumflexbelowdot */ + { 0x01001ed9, 20428 }, /* ocircumflexbelowdot */ + { 0x01001eda, 20647 }, /* Ohornacute */ + { 0x01001edb, 20658 }, /* ohornacute */ + { 0x01001edc, 20697 }, /* Ohorngrave */ + { 0x01001edd, 20708 }, /* ohorngrave */ + { 0x01001ede, 20719 }, /* Ohornhook */ + { 0x01001edf, 20729 }, /* ohornhook */ + { 0x01001ee0, 20739 }, /* Ohorntilde */ + { 0x01001ee1, 20750 }, /* ohorntilde */ + { 0x01001ee2, 20669 }, /* Ohornbelowdot */ + { 0x01001ee3, 20683 }, /* ohornbelowdot */ + { 0x01001ee4, 25947 }, /* Ubelowdot */ + { 0x01001ee5, 25957 }, /* ubelowdot */ + { 0x01001ee6, 26067 }, /* Uhook */ + { 0x01001ee7, 26073 }, /* uhook */ + { 0x01001ee8, 26091 }, /* Uhornacute */ + { 0x01001ee9, 26102 }, /* uhornacute */ + { 0x01001eea, 26141 }, /* Uhorngrave */ + { 0x01001eeb, 26152 }, /* uhorngrave */ + { 0x01001eec, 26163 }, /* Uhornhook */ + { 0x01001eed, 26173 }, /* uhornhook */ + { 0x01001eee, 26183 }, /* Uhorntilde */ + { 0x01001eef, 26194 }, /* uhorntilde */ + { 0x01001ef0, 26113 }, /* Uhornbelowdot */ + { 0x01001ef1, 26127 }, /* uhornbelowdot */ + { 0x01001ef2, 31278 }, /* Ygrave */ + { 0x01001ef3, 31285 }, /* ygrave */ + { 0x01001ef4, 31208 }, /* Ybelowdot */ + { 0x01001ef5, 31218 }, /* ybelowdot */ + { 0x01001ef6, 31292 }, /* Yhook */ + { 0x01001ef7, 31298 }, /* yhook */ + { 0x01001ef8, 31304 }, /* Ytilde */ + { 0x01001ef9, 31311 }, /* ytilde */ + { 0x01002070, 31417 }, /* zerosuperior */ + { 0x01002074, 12714 }, /* foursuperior */ + { 0x01002075, 12676 }, /* fivesuperior */ + { 0x01002076, 23838 }, /* sixsuperior */ + { 0x01002077, 23014 }, /* sevensuperior */ + { 0x01002078, 11847 }, /* eightsuperior */ + { 0x01002079, 20144 }, /* ninesuperior */ + { 0x01002080, 31403 }, /* zerosubscript */ + { 0x01002081, 20824 }, /* onesubscript */ + { 0x01002082, 25894 }, /* twosubscript */ + { 0x01002083, 25638 }, /* threesubscript */ + { 0x01002084, 12700 }, /* foursubscript */ + { 0x01002085, 12662 }, /* fivesubscript */ + { 0x01002086, 23825 }, /* sixsubscript */ + { 0x01002087, 22999 }, /* sevensubscript */ + { 0x01002088, 11832 }, /* eightsubscript */ + { 0x01002089, 20130 }, /* ninesubscript */ + { 0x010020a0, 11776 }, /* EcuSign */ { 0x010020a1, 8670 }, /* ColonSign */ - { 0x010020a2, 8744 }, /* CruzeiroSign */ - { 0x010020a3, 12416 }, /* FFrancSign */ - { 0x010020a4, 19448 }, /* LiraSign */ - { 0x010020a5, 19724 }, /* MillSign */ - { 0x010020a6, 19967 }, /* NairaSign */ - { 0x010020a7, 21526 }, /* PesetaSign */ - { 0x010020a8, 22569 }, /* RupeeSign */ - { 0x010020a9, 26623 }, /* WonSign */ - { 0x010020aa, 20009 }, /* NewSheqelSign */ - { 0x010020ab, 11258 }, /* DongSign */ - { 0x01002202, 21446 }, /* partdifferential */ - { 0x01002205, 11919 }, /* emptyset */ - { 0x01002208, 11802 }, /* elementof */ - { 0x01002209, 20112 }, /* notelementof */ - { 0x0100220b, 8686 }, /* containsas */ - { 0x0100221a, 23809 }, /* squareroot */ - { 0x0100221b, 8757 }, /* cuberoot */ - { 0x0100221c, 12645 }, /* fourthroot */ - { 0x0100222c, 11232 }, /* dintegral */ - { 0x0100222d, 25585 }, /* tintegral */ + { 0x010020a2, 8826 }, /* CruzeiroSign */ + { 0x010020a3, 12498 }, /* FFrancSign */ + { 0x010020a4, 19530 }, /* LiraSign */ + { 0x010020a5, 19806 }, /* MillSign */ + { 0x010020a6, 20049 }, /* NairaSign */ + { 0x010020a7, 21608 }, /* PesetaSign */ + { 0x010020a8, 22651 }, /* RupeeSign */ + { 0x010020a9, 26705 }, /* WonSign */ + { 0x010020aa, 20091 }, /* NewSheqelSign */ + { 0x010020ab, 11340 }, /* DongSign */ + { 0x01002202, 21528 }, /* partdifferential */ + { 0x01002205, 12001 }, /* emptyset */ + { 0x01002208, 11884 }, /* elementof */ + { 0x01002209, 20194 }, /* notelementof */ + { 0x0100220b, 8768 }, /* containsas */ + { 0x0100221a, 23891 }, /* squareroot */ + { 0x0100221b, 8839 }, /* cuberoot */ + { 0x0100221c, 12727 }, /* fourthroot */ + { 0x0100222c, 11314 }, /* dintegral */ + { 0x0100222d, 25667 }, /* tintegral */ { 0x01002235, 3396 }, /* because */ - { 0x01002247, 20100 }, /* notapproxeq */ + { 0x01002247, 20182 }, /* notapproxeq */ { 0x01002248, 945 }, /* approxeq */ - { 0x01002262, 20134 }, /* notidentical */ - { 0x01002263, 23854 }, /* stricteq */ + { 0x01002262, 20216 }, /* notidentical */ + { 0x01002263, 23936 }, /* stricteq */ { 0x01002800, 3628 }, /* braille_blank */ { 0x01002801, 3783 }, /* braille_dots_1 */ { 0x01002802, 6151 }, /* braille_dots_2 */ @@ -6847,283 +7453,420 @@ static const struct name_keysym keysym_to_name[] = { { 0x010028fd, 5104 }, /* braille_dots_1345678 */ { 0x010028fe, 6256 }, /* braille_dots_2345678 */ { 0x010028ff, 3909 }, /* braille_dots_12345678 */ - { 0x100000a8, 16910 }, /* hpmute_acute */ - { 0x100000a9, 16977 }, /* hpmute_grave */ - { 0x100000aa, 16923 }, /* hpmute_asciicircum */ - { 0x100000ab, 16960 }, /* hpmute_diaeresis */ - { 0x100000ac, 16942 }, /* hpmute_asciitilde */ - { 0x100000af, 16867 }, /* hplira */ - { 0x100000be, 16813 }, /* hpguilder */ - { 0x100000ee, 17014 }, /* hpYdiaeresis */ - { 0x100000f6, 16874 }, /* hplongminus */ - { 0x100000fc, 16767 }, /* hpblock */ - { 0x1000fe22, 10414 }, /* Ddiaeresis */ - { 0x1000fe27, 10344 }, /* Dacute_accent */ - { 0x1000fe2c, 10379 }, /* Dcedilla_accent */ - { 0x1000fe5e, 10395 }, /* Dcircumflex_accent */ - { 0x1000fe60, 11189 }, /* Dgrave_accent */ - { 0x1000fe7e, 11417 }, /* Dtilde */ - { 0x1000feb0, 11388 }, /* Dring_accent */ - { 0x1000ff00, 11380 }, /* DRemove */ - { 0x1000ff48, 16886 }, /* hpModelock1 */ - { 0x1000ff49, 16898 }, /* hpModelock2 */ - { 0x1000ff6c, 16990 }, /* hpReset */ - { 0x1000ff6d, 16998 }, /* hpSystem */ - { 0x1000ff6e, 17007 }, /* hpUser */ - { 0x1000ff6f, 16775 }, /* hpClearLine */ - { 0x1000ff70, 16836 }, /* hpInsertLine */ - { 0x1000ff71, 16800 }, /* hpDeleteLine */ - { 0x1000ff72, 16823 }, /* hpInsertChar */ - { 0x1000ff73, 16787 }, /* hpDeleteChar */ - { 0x1000ff74, 16757 }, /* hpBackTab */ - { 0x1000ff75, 16854 }, /* hpKP_BackTab */ - { 0x1000ff76, 12125 }, /* Ext16bit_L */ - { 0x1000ff77, 12136 }, /* Ext16bit_R */ - { 0x1004ff02, 20956 }, /* osfCopy */ - { 0x1004ff03, 20964 }, /* osfCut */ - { 0x1004ff04, 21163 }, /* osfPaste */ - { 0x1004ff07, 20900 }, /* osfBackTab */ - { 0x1004ff08, 20887 }, /* osfBackSpace */ - { 0x1004ff0b, 20947 }, /* osfClear */ - { 0x1004ff1b, 21026 }, /* osfEscape */ - { 0x1004ff31, 20876 }, /* osfAddMode */ - { 0x1004ff32, 21197 }, /* osfPrimaryPaste */ - { 0x1004ff33, 21213 }, /* osfQuickPaste */ - { 0x1004ff40, 21128 }, /* osfPageLeft */ - { 0x1004ff41, 21153 }, /* osfPageUp */ - { 0x1004ff42, 21116 }, /* osfPageDown */ - { 0x1004ff43, 21140 }, /* osfPageRight */ - { 0x1004ff44, 20864 }, /* osfActivate */ - { 0x1004ff45, 21080 }, /* osfMenuBar */ - { 0x1004ff51, 21064 }, /* osfLeft */ - { 0x1004ff52, 21290 }, /* osfUp */ - { 0x1004ff53, 21250 }, /* osfRight */ - { 0x1004ff54, 20996 }, /* osfDown */ - { 0x1004ff57, 21015 }, /* osfEndLine */ - { 0x1004ff58, 20924 }, /* osfBeginLine */ - { 0x1004ff59, 21004 }, /* osfEndData */ - { 0x1004ff5a, 20911 }, /* osfBeginData */ - { 0x1004ff5b, 21185 }, /* osfPrevMenu */ - { 0x1004ff5c, 21104 }, /* osfNextMenu */ - { 0x1004ff5d, 21172 }, /* osfPrevField */ - { 0x1004ff5e, 21091 }, /* osfNextField */ - { 0x1004ff60, 21259 }, /* osfSelect */ - { 0x1004ff63, 21054 }, /* osfInsert */ - { 0x1004ff65, 21282 }, /* osfUndo */ - { 0x1004ff67, 21072 }, /* osfMenu */ - { 0x1004ff69, 20937 }, /* osfCancel */ - { 0x1004ff6a, 21046 }, /* osfHelp */ - { 0x1004ff71, 21269 }, /* osfSelectAll */ - { 0x1004ff72, 20981 }, /* osfDeselectAll */ - { 0x1004ff73, 21227 }, /* osfReselect */ - { 0x1004ff74, 21036 }, /* osfExtend */ - { 0x1004ff78, 21239 }, /* osfRestore */ - { 0x1004ffff, 20971 }, /* osfDelete */ - { 0x1005ff00, 24032 }, /* SunFA_Grave */ - { 0x1005ff01, 24003 }, /* SunFA_Circum */ - { 0x1005ff02, 24044 }, /* SunFA_Tilde */ - { 0x1005ff03, 23977 }, /* SunFA_Acute */ - { 0x1005ff04, 24016 }, /* SunFA_Diaeresis */ - { 0x1005ff05, 23989 }, /* SunFA_Cedilla */ - { 0x1005ff10, 23963 }, /* SunF36 */ - { 0x1005ff11, 23970 }, /* SunF37 */ - { 0x1005ff60, 24180 }, /* SunSys_Req */ - { 0x1005ff70, 24163 }, /* SunProps */ - { 0x1005ff71, 24064 }, /* SunFront */ - { 0x1005ff72, 23948 }, /* SunCopy */ - { 0x1005ff73, 24073 }, /* SunOpen */ - { 0x1005ff74, 24103 }, /* SunPaste */ - { 0x1005ff75, 23956 }, /* SunCut */ - { 0x1005ff76, 24112 }, /* SunPowerSwitch */ - { 0x1005ff77, 23884 }, /* SunAudioLowerVolume */ - { 0x1005ff78, 23904 }, /* SunAudioMute */ - { 0x1005ff79, 23917 }, /* SunAudioRaiseVolume */ - { 0x1005ff7a, 24199 }, /* SunVideoDegauss */ - { 0x1005ff7b, 24215 }, /* SunVideoLowerBrightness */ - { 0x1005ff7c, 24239 }, /* SunVideoRaiseBrightness */ - { 0x1005ff7d, 24127 }, /* SunPowerSwitchShift */ - { 0x1008fe01, 28552 }, /* XF86Switch_VT_1 */ - { 0x1008fe02, 28619 }, /* XF86Switch_VT_2 */ - { 0x1008fe03, 28635 }, /* XF86Switch_VT_3 */ - { 0x1008fe04, 28651 }, /* XF86Switch_VT_4 */ - { 0x1008fe05, 28667 }, /* XF86Switch_VT_5 */ - { 0x1008fe06, 28683 }, /* XF86Switch_VT_6 */ - { 0x1008fe07, 28699 }, /* XF86Switch_VT_7 */ - { 0x1008fe08, 28715 }, /* XF86Switch_VT_8 */ - { 0x1008fe09, 28731 }, /* XF86Switch_VT_9 */ - { 0x1008fe0a, 28568 }, /* XF86Switch_VT_10 */ - { 0x1008fe0b, 28585 }, /* XF86Switch_VT_11 */ - { 0x1008fe0c, 28602 }, /* XF86Switch_VT_12 */ - { 0x1008fe20, 28878 }, /* XF86Ungrab */ - { 0x1008fe21, 27151 }, /* XF86ClearGrab */ - { 0x1008fe22, 28029 }, /* XF86Next_VMode */ - { 0x1008fe23, 28151 }, /* XF86Prev_VMode */ - { 0x1008fe24, 27786 }, /* XF86LogWindowTree */ - { 0x1008fe25, 27759 }, /* XF86LogGrabInfo */ - { 0x1008ff01, 27897 }, /* XF86ModeLock */ - { 0x1008ff02, 27955 }, /* XF86MonBrightnessUp */ - { 0x1008ff03, 27933 }, /* XF86MonBrightnessDown */ - { 0x1008ff04, 27522 }, /* XF86KbdLightOnOff */ - { 0x1008ff05, 27502 }, /* XF86KbdBrightnessUp */ - { 0x1008ff06, 27480 }, /* XF86KbdBrightnessDown */ - { 0x1008ff07, 27910 }, /* XF86MonBrightnessCycle */ - { 0x1008ff10, 28484 }, /* XF86Standby */ - { 0x1008ff11, 26749 }, /* XF86AudioLowerVolume */ - { 0x1008ff12, 26802 }, /* XF86AudioMute */ - { 0x1008ff13, 26889 }, /* XF86AudioRaiseVolume */ - { 0x1008ff14, 26845 }, /* XF86AudioPlay */ - { 0x1008ff15, 26978 }, /* XF86AudioStop */ - { 0x1008ff16, 26875 }, /* XF86AudioPrev */ - { 0x1008ff17, 26816 }, /* XF86AudioNext */ - { 0x1008ff18, 27443 }, /* XF86HomePage */ - { 0x1008ff19, 27804 }, /* XF86Mail */ - { 0x1008ff1a, 28496 }, /* XF86Start */ - { 0x1008ff1b, 28408 }, /* XF86Search */ - { 0x1008ff1c, 26930 }, /* XF86AudioRecord */ - { 0x1008ff1d, 27106 }, /* XF86Calculator */ - { 0x1008ff1e, 27852 }, /* XF86Memo */ - { 0x1008ff1f, 28782 }, /* XF86ToDoList */ - { 0x1008ff20, 27121 }, /* XF86Calendar */ - { 0x1008ff21, 28124 }, /* XF86PowerDown */ - { 0x1008ff22, 27189 }, /* XF86ContrastAdjust */ - { 0x1008ff23, 28255 }, /* XF86RockerUp */ - { 0x1008ff24, 28224 }, /* XF86RockerDown */ - { 0x1008ff25, 28239 }, /* XF86RockerEnter */ - { 0x1008ff26, 27001 }, /* XF86Back */ - { 0x1008ff27, 27333 }, /* XF86Forward */ - { 0x1008ff28, 28506 }, /* XF86Stop */ - { 0x1008ff29, 28180 }, /* XF86Refresh */ - { 0x1008ff2a, 28138 }, /* XF86PowerOff */ - { 0x1008ff2b, 28966 }, /* XF86WakeUp */ - { 0x1008ff2c, 27274 }, /* XF86Eject */ - { 0x1008ff2d, 28348 }, /* XF86ScreenSaver */ - { 0x1008ff2e, 29031 }, /* XF86WWW */ - { 0x1008ff2f, 28448 }, /* XF86Sleep */ - { 0x1008ff30, 27307 }, /* XF86Favorites */ - { 0x1008ff31, 26830 }, /* XF86AudioPause */ - { 0x1008ff32, 26770 }, /* XF86AudioMedia */ - { 0x1008ff33, 27985 }, /* XF86MyComputer */ - { 0x1008ff34, 28932 }, /* XF86VendorHome */ - { 0x1008ff35, 27745 }, /* XF86LightBulb */ - { 0x1008ff36, 28439 }, /* XF86Shop */ - { 0x1008ff37, 27431 }, /* XF86History */ - { 0x1008ff38, 28068 }, /* XF86OpenURL */ - { 0x1008ff39, 26655 }, /* XF86AddFavorite */ - { 0x1008ff3a, 27456 }, /* XF86HotLinks */ - { 0x1008ff3b, 27070 }, /* XF86BrightnessAdjust */ - { 0x1008ff3c, 27321 }, /* XF86Finance */ - { 0x1008ff3d, 27175 }, /* XF86Community */ - { 0x1008ff3e, 26962 }, /* XF86AudioRewind */ - { 0x1008ff3f, 27010 }, /* XF86BackForward */ - { 0x1008ff40, 27553 }, /* XF86Launch0 */ - { 0x1008ff41, 27565 }, /* XF86Launch1 */ - { 0x1008ff42, 27577 }, /* XF86Launch2 */ - { 0x1008ff43, 27589 }, /* XF86Launch3 */ - { 0x1008ff44, 27601 }, /* XF86Launch4 */ - { 0x1008ff45, 27613 }, /* XF86Launch5 */ - { 0x1008ff46, 27625 }, /* XF86Launch6 */ - { 0x1008ff47, 27637 }, /* XF86Launch7 */ - { 0x1008ff48, 27649 }, /* XF86Launch8 */ - { 0x1008ff49, 27661 }, /* XF86Launch9 */ - { 0x1008ff4a, 27673 }, /* XF86LaunchA */ - { 0x1008ff4b, 27685 }, /* XF86LaunchB */ - { 0x1008ff4c, 27697 }, /* XF86LaunchC */ - { 0x1008ff4d, 27709 }, /* XF86LaunchD */ - { 0x1008ff4e, 27721 }, /* XF86LaunchE */ - { 0x1008ff4f, 27733 }, /* XF86LaunchF */ - { 0x1008ff50, 26671 }, /* XF86ApplicationLeft */ - { 0x1008ff51, 26691 }, /* XF86ApplicationRight */ - { 0x1008ff52, 27061 }, /* XF86Book */ - { 0x1008ff53, 27134 }, /* XF86CD */ - { 0x1008ff54, 27091 }, /* XF86Calculater */ - { 0x1008ff55, 27141 }, /* XF86Clear */ - { 0x1008ff56, 27165 }, /* XF86Close */ - { 0x1008ff57, 27208 }, /* XF86Copy */ - { 0x1008ff58, 27217 }, /* XF86Cut */ - { 0x1008ff59, 27240 }, /* XF86Display */ - { 0x1008ff5a, 27266 }, /* XF86DOS */ - { 0x1008ff5b, 27252 }, /* XF86Documents */ - { 0x1008ff5c, 27284 }, /* XF86Excel */ - { 0x1008ff5d, 27294 }, /* XF86Explorer */ - { 0x1008ff5e, 27391 }, /* XF86Game */ - { 0x1008ff5f, 27400 }, /* XF86Go */ - { 0x1008ff60, 27469 }, /* XF86iTouch */ - { 0x1008ff61, 27775 }, /* XF86LogOff */ - { 0x1008ff62, 27829 }, /* XF86Market */ - { 0x1008ff63, 27840 }, /* XF86Meeting */ - { 0x1008ff65, 27861 }, /* XF86MenuKB */ - { 0x1008ff66, 27872 }, /* XF86MenuPB */ - { 0x1008ff67, 28000 }, /* XF86MySites */ - { 0x1008ff68, 28012 }, /* XF86New */ - { 0x1008ff69, 28020 }, /* XF86News */ - { 0x1008ff6a, 28044 }, /* XF86OfficeHome */ - { 0x1008ff6b, 28059 }, /* XF86Open */ - { 0x1008ff6c, 28080 }, /* XF86Option */ - { 0x1008ff6d, 28091 }, /* XF86Paste */ - { 0x1008ff6e, 28101 }, /* XF86Phone */ - { 0x1008ff70, 28166 }, /* XF86Q */ - { 0x1008ff72, 28203 }, /* XF86Reply */ - { 0x1008ff73, 28192 }, /* XF86Reload */ - { 0x1008ff74, 28268 }, /* XF86RotateWindows */ - { 0x1008ff75, 28324 }, /* XF86RotationPB */ - { 0x1008ff76, 28286 }, /* XF86RotationKB */ - { 0x1008ff77, 28339 }, /* XF86Save */ - { 0x1008ff78, 28395 }, /* XF86ScrollUp */ - { 0x1008ff79, 28380 }, /* XF86ScrollDown */ - { 0x1008ff7a, 28364 }, /* XF86ScrollClick */ - { 0x1008ff7b, 28430 }, /* XF86Send */ - { 0x1008ff7c, 28458 }, /* XF86Spell */ - { 0x1008ff7d, 28468 }, /* XF86SplitScreen */ - { 0x1008ff7e, 28528 }, /* XF86Support */ - { 0x1008ff7f, 28747 }, /* XF86TaskPane */ - { 0x1008ff80, 28760 }, /* XF86Terminal */ - { 0x1008ff81, 28795 }, /* XF86Tools */ - { 0x1008ff82, 28867 }, /* XF86Travel */ - { 0x1008ff84, 28913 }, /* XF86UserPB */ - { 0x1008ff85, 28889 }, /* XF86User1KB */ - { 0x1008ff86, 28901 }, /* XF86User2KB */ - { 0x1008ff87, 28947 }, /* XF86Video */ - { 0x1008ff88, 28988 }, /* XF86WheelButton */ - { 0x1008ff89, 29013 }, /* XF86Word */ - { 0x1008ff8a, 29039 }, /* XF86Xfer */ - { 0x1008ff8b, 29059 }, /* XF86ZoomIn */ - { 0x1008ff8c, 29070 }, /* XF86ZoomOut */ - { 0x1008ff8d, 26992 }, /* XF86Away */ - { 0x1008ff8e, 27883 }, /* XF86Messenger */ - { 0x1008ff8f, 28977 }, /* XF86WebCam */ - { 0x1008ff90, 27813 }, /* XF86MailForward */ - { 0x1008ff91, 28111 }, /* XF86Pictures */ - { 0x1008ff92, 27975 }, /* XF86Music */ - { 0x1008ff93, 27026 }, /* XF86Battery */ - { 0x1008ff94, 27047 }, /* XF86Bluetooth */ - { 0x1008ff95, 29004 }, /* XF86WLAN */ - { 0x1008ff96, 28924 }, /* XF86UWB */ - { 0x1008ff97, 26732 }, /* XF86AudioForward */ - { 0x1008ff98, 26946 }, /* XF86AudioRepeat */ - { 0x1008ff99, 26910 }, /* XF86AudioRandomPlay */ - { 0x1008ff9a, 28515 }, /* XF86Subtitle */ - { 0x1008ff9b, 26712 }, /* XF86AudioCycleTrack */ - { 0x1008ff9c, 27225 }, /* XF86CycleAngle */ - { 0x1008ff9d, 27345 }, /* XF86FrameBack */ - { 0x1008ff9e, 27359 }, /* XF86FrameForward */ - { 0x1008ff9f, 28773 }, /* XF86Time */ - { 0x1008ffa0, 28419 }, /* XF86Select */ - { 0x1008ffa1, 28957 }, /* XF86View */ - { 0x1008ffa2, 28805 }, /* XF86TopMenu */ - { 0x1008ffa3, 28172 }, /* XF86Red */ - { 0x1008ffa4, 27407 }, /* XF86Green */ - { 0x1008ffa5, 29048 }, /* XF86Yellow */ - { 0x1008ffa6, 27038 }, /* XF86Blue */ - { 0x1008ffa7, 28540 }, /* XF86Suspend */ - { 0x1008ffa8, 27417 }, /* XF86Hibernate */ - { 0x1008ffa9, 28848 }, /* XF86TouchpadToggle */ - { 0x1008ffb0, 28833 }, /* XF86TouchpadOn */ - { 0x1008ffb1, 28817 }, /* XF86TouchpadOff */ - { 0x1008ffb2, 26785 }, /* XF86AudioMicMute */ - { 0x1008ffb3, 27540 }, /* XF86Keyboard */ - { 0x1008ffb4, 29022 }, /* XF86WWAN */ - { 0x1008ffb5, 28213 }, /* XF86RFKill */ - { 0x1008ffb6, 26859 }, /* XF86AudioPreset */ - { 0x1008ffb7, 28301 }, /* XF86RotationLockToggle */ - { 0x1008ffb8, 27376 }, /* XF86FullScreen */ + { 0x100000a8, 16992 }, /* hpmute_acute */ + { 0x100000a9, 17059 }, /* hpmute_grave */ + { 0x100000aa, 17005 }, /* hpmute_asciicircum */ + { 0x100000ab, 17042 }, /* hpmute_diaeresis */ + { 0x100000ac, 17024 }, /* hpmute_asciitilde */ + { 0x100000af, 16949 }, /* hplira */ + { 0x100000be, 16895 }, /* hpguilder */ + { 0x100000ee, 17096 }, /* hpYdiaeresis */ + { 0x100000f6, 16956 }, /* hplongminus */ + { 0x100000fc, 16849 }, /* hpblock */ + { 0x1000fe22, 10496 }, /* Ddiaeresis */ + { 0x1000fe27, 10426 }, /* Dacute_accent */ + { 0x1000fe2c, 10461 }, /* Dcedilla_accent */ + { 0x1000fe5e, 10477 }, /* Dcircumflex_accent */ + { 0x1000fe60, 11271 }, /* Dgrave_accent */ + { 0x1000fe7e, 11499 }, /* Dtilde */ + { 0x1000feb0, 11470 }, /* Dring_accent */ + { 0x1000ff00, 11462 }, /* DRemove */ + { 0x1000ff48, 16968 }, /* hpModelock1 */ + { 0x1000ff49, 16980 }, /* hpModelock2 */ + { 0x1000ff6c, 17072 }, /* hpReset */ + { 0x1000ff6d, 17080 }, /* hpSystem */ + { 0x1000ff6e, 17089 }, /* hpUser */ + { 0x1000ff6f, 16857 }, /* hpClearLine */ + { 0x1000ff70, 16918 }, /* hpInsertLine */ + { 0x1000ff71, 16882 }, /* hpDeleteLine */ + { 0x1000ff72, 16905 }, /* hpInsertChar */ + { 0x1000ff73, 16869 }, /* hpDeleteChar */ + { 0x1000ff74, 16839 }, /* hpBackTab */ + { 0x1000ff75, 16936 }, /* hpKP_BackTab */ + { 0x1000ff76, 12207 }, /* Ext16bit_L */ + { 0x1000ff77, 12218 }, /* Ext16bit_R */ + { 0x1004ff02, 21038 }, /* osfCopy */ + { 0x1004ff03, 21046 }, /* osfCut */ + { 0x1004ff04, 21245 }, /* osfPaste */ + { 0x1004ff07, 20982 }, /* osfBackTab */ + { 0x1004ff08, 20969 }, /* osfBackSpace */ + { 0x1004ff0b, 21029 }, /* osfClear */ + { 0x1004ff1b, 21108 }, /* osfEscape */ + { 0x1004ff31, 20958 }, /* osfAddMode */ + { 0x1004ff32, 21279 }, /* osfPrimaryPaste */ + { 0x1004ff33, 21295 }, /* osfQuickPaste */ + { 0x1004ff40, 21210 }, /* osfPageLeft */ + { 0x1004ff41, 21235 }, /* osfPageUp */ + { 0x1004ff42, 21198 }, /* osfPageDown */ + { 0x1004ff43, 21222 }, /* osfPageRight */ + { 0x1004ff44, 20946 }, /* osfActivate */ + { 0x1004ff45, 21162 }, /* osfMenuBar */ + { 0x1004ff51, 21146 }, /* osfLeft */ + { 0x1004ff52, 21372 }, /* osfUp */ + { 0x1004ff53, 21332 }, /* osfRight */ + { 0x1004ff54, 21078 }, /* osfDown */ + { 0x1004ff57, 21097 }, /* osfEndLine */ + { 0x1004ff58, 21006 }, /* osfBeginLine */ + { 0x1004ff59, 21086 }, /* osfEndData */ + { 0x1004ff5a, 20993 }, /* osfBeginData */ + { 0x1004ff5b, 21267 }, /* osfPrevMenu */ + { 0x1004ff5c, 21186 }, /* osfNextMenu */ + { 0x1004ff5d, 21254 }, /* osfPrevField */ + { 0x1004ff5e, 21173 }, /* osfNextField */ + { 0x1004ff60, 21341 }, /* osfSelect */ + { 0x1004ff63, 21136 }, /* osfInsert */ + { 0x1004ff65, 21364 }, /* osfUndo */ + { 0x1004ff67, 21154 }, /* osfMenu */ + { 0x1004ff69, 21019 }, /* osfCancel */ + { 0x1004ff6a, 21128 }, /* osfHelp */ + { 0x1004ff71, 21351 }, /* osfSelectAll */ + { 0x1004ff72, 21063 }, /* osfDeselectAll */ + { 0x1004ff73, 21309 }, /* osfReselect */ + { 0x1004ff74, 21118 }, /* osfExtend */ + { 0x1004ff78, 21321 }, /* osfRestore */ + { 0x1004ffff, 21053 }, /* osfDelete */ + { 0x1005ff00, 24114 }, /* SunFA_Grave */ + { 0x1005ff01, 24085 }, /* SunFA_Circum */ + { 0x1005ff02, 24126 }, /* SunFA_Tilde */ + { 0x1005ff03, 24059 }, /* SunFA_Acute */ + { 0x1005ff04, 24098 }, /* SunFA_Diaeresis */ + { 0x1005ff05, 24071 }, /* SunFA_Cedilla */ + { 0x1005ff10, 24045 }, /* SunF36 */ + { 0x1005ff11, 24052 }, /* SunF37 */ + { 0x1005ff60, 24262 }, /* SunSys_Req */ + { 0x1005ff70, 24245 }, /* SunProps */ + { 0x1005ff71, 24146 }, /* SunFront */ + { 0x1005ff72, 24030 }, /* SunCopy */ + { 0x1005ff73, 24155 }, /* SunOpen */ + { 0x1005ff74, 24185 }, /* SunPaste */ + { 0x1005ff75, 24038 }, /* SunCut */ + { 0x1005ff76, 24194 }, /* SunPowerSwitch */ + { 0x1005ff77, 23966 }, /* SunAudioLowerVolume */ + { 0x1005ff78, 23986 }, /* SunAudioMute */ + { 0x1005ff79, 23999 }, /* SunAudioRaiseVolume */ + { 0x1005ff7a, 24281 }, /* SunVideoDegauss */ + { 0x1005ff7b, 24297 }, /* SunVideoLowerBrightness */ + { 0x1005ff7c, 24321 }, /* SunVideoRaiseBrightness */ + { 0x1005ff7d, 24209 }, /* SunPowerSwitchShift */ + { 0x100810f4, 27381 }, /* XF86BrightnessAuto */ + { 0x100810f5, 27809 }, /* XF86DisplayOff */ + { 0x10081166, 28175 }, /* XF86Info */ + { 0x10081177, 26885 }, /* XF86AspectRatio */ + { 0x10081185, 27864 }, /* XF86DVD */ + { 0x10081188, 26968 }, /* XF86Audio */ + { 0x10081192, 27629 }, /* XF86ChannelUp */ + { 0x10081193, 27613 }, /* XF86ChannelDown */ + { 0x1008119b, 27350 }, /* XF86Break */ + { 0x100811a0, 30983 }, /* XF86VideoPhone */ + { 0x100811a4, 31176 }, /* XF86ZoomReset */ + { 0x100811a6, 27872 }, /* XF86Editor */ + { 0x100811a8, 28067 }, /* XF86GraphicsEditor */ + { 0x100811a9, 29984 }, /* XF86Presentation */ + { 0x100811aa, 27784 }, /* XF86Database */ + { 0x100811ac, 31032 }, /* XF86Voicemail */ + { 0x100811ad, 26800 }, /* XF86Addressbook */ + { 0x100811af, 27824 }, /* XF86DisplayToggle */ + { 0x100811b0, 30437 }, /* XF86SpellCheck */ + { 0x100811b6, 27691 }, /* XF86ContextMenu */ + { 0x100811b7, 29304 }, /* XF86MediaRepeat */ + { 0x100811b8, 26756 }, /* XF8610ChannelsUp */ + { 0x100811b9, 26737 }, /* XF8610ChannelsDown */ + { 0x100811ba, 28164 }, /* XF86Images */ + { 0x100811bc, 29558 }, /* XF86NotificationCenter */ + { 0x100811bd, 29928 }, /* XF86PickupPhone */ + { 0x100811be, 28096 }, /* XF86HangupPhone */ + { 0x100811d0, 27958 }, /* XF86Fn */ + { 0x100811d1, 27965 }, /* XF86Fn_Esc */ + { 0x100811e5, 27976 }, /* XF86FnRightShift */ + { 0x10081200, 29581 }, /* XF86Numeric0 */ + { 0x10081201, 29594 }, /* XF86Numeric1 */ + { 0x10081202, 29635 }, /* XF86Numeric2 */ + { 0x10081203, 29648 }, /* XF86Numeric3 */ + { 0x10081204, 29661 }, /* XF86Numeric4 */ + { 0x10081205, 29674 }, /* XF86Numeric5 */ + { 0x10081206, 29687 }, /* XF86Numeric6 */ + { 0x10081207, 29700 }, /* XF86Numeric7 */ + { 0x10081208, 29713 }, /* XF86Numeric8 */ + { 0x10081209, 29726 }, /* XF86Numeric9 */ + { 0x1008120a, 29808 }, /* XF86NumericStar */ + { 0x1008120b, 29791 }, /* XF86NumericPound */ + { 0x1008120c, 29739 }, /* XF86NumericA */ + { 0x1008120d, 29752 }, /* XF86NumericB */ + { 0x1008120e, 29765 }, /* XF86NumericC */ + { 0x1008120f, 29778 }, /* XF86NumericD */ + { 0x10081210, 27511 }, /* XF86CameraFocus */ + { 0x10081211, 31102 }, /* XF86WPSButton */ + { 0x10081215, 27571 }, /* XF86CameraZoomIn */ + { 0x10081216, 27588 }, /* XF86CameraZoomOut */ + { 0x10081217, 27558 }, /* XF86CameraUp */ + { 0x10081218, 27496 }, /* XF86CameraDown */ + { 0x10081219, 27527 }, /* XF86CameraLeft */ + { 0x1008121a, 27542 }, /* XF86CameraRight */ + { 0x1008121b, 26932 }, /* XF86AttendantOn */ + { 0x1008121c, 26915 }, /* XF86AttendantOff */ + { 0x1008121d, 26948 }, /* XF86AttendantToggle */ + { 0x1008121e, 28742 }, /* XF86LightsToggle */ + { 0x10081230, 26816 }, /* XF86ALSToggle */ + { 0x10081240, 27436 }, /* XF86Buttonconfig */ + { 0x10081241, 30746 }, /* XF86Taskmanager */ + { 0x10081242, 28195 }, /* XF86Journal */ + { 0x10081243, 27726 }, /* XF86ControlPanel */ + { 0x10081244, 26871 }, /* XF86AppSelect */ + { 0x10081245, 30277 }, /* XF86Screensaver */ + { 0x10081246, 31015 }, /* XF86VoiceCommand */ + { 0x10081247, 26901 }, /* XF86Assistant */ + { 0x10081250, 27418 }, /* XF86BrightnessMin */ + { 0x10081251, 27400 }, /* XF86BrightnessMax */ + { 0x10081260, 28350 }, /* XF86KbdInputAssistPrev */ + { 0x10081261, 28299 }, /* XF86KbdInputAssistNext */ + { 0x10081262, 28373 }, /* XF86KbdInputAssistPrevgroup */ + { 0x10081263, 28322 }, /* XF86KbdInputAssistNextgroup */ + { 0x10081264, 28249 }, /* XF86KbdInputAssistAccept */ + { 0x10081265, 28274 }, /* XF86KbdInputAssistCancel */ + { 0x10081266, 30112 }, /* XF86RightUp */ + { 0x10081267, 30098 }, /* XF86RightDown */ + { 0x10081268, 28717 }, /* XF86LeftUp */ + { 0x10081269, 28704 }, /* XF86LeftDown */ + { 0x1008126a, 30168 }, /* XF86RootMenu */ + { 0x1008126b, 29320 }, /* XF86MediaTopMenu */ + { 0x1008126c, 29607 }, /* XF86Numeric11 */ + { 0x1008126d, 29621 }, /* XF86Numeric12 */ + { 0x1008126e, 26998 }, /* XF86AudioDesc */ + { 0x1008126f, 26773 }, /* XF863DMode */ + { 0x10081270, 29541 }, /* XF86NextFavorite */ + { 0x10081271, 30499 }, /* XF86StopRecord */ + { 0x10081272, 29902 }, /* XF86PauseRecord */ + { 0x10081273, 31007 }, /* XF86VOD */ + { 0x10081274, 30904 }, /* XF86Unmute */ + { 0x10081275, 27916 }, /* XF86FastReverse */ + { 0x10081276, 30411 }, /* XF86SlowReverse */ + { 0x10081277, 27775 }, /* XF86Data */ + { 0x10081278, 29839 }, /* XF86OnScreenKeyboard */ + { 0x10081279, 30016 }, /* XF86PrivacyScreenToggle */ + { 0x1008127a, 30359 }, /* XF86SelectiveScreenshot */ + { 0x10081290, 28804 }, /* XF86Macro1 */ + { 0x10081291, 28935 }, /* XF86Macro2 */ + { 0x10081292, 29066 }, /* XF86Macro3 */ + { 0x10081293, 29089 }, /* XF86Macro4 */ + { 0x10081294, 29100 }, /* XF86Macro5 */ + { 0x10081295, 29111 }, /* XF86Macro6 */ + { 0x10081296, 29122 }, /* XF86Macro7 */ + { 0x10081297, 29133 }, /* XF86Macro8 */ + { 0x10081298, 29144 }, /* XF86Macro9 */ + { 0x10081299, 28815 }, /* XF86Macro10 */ + { 0x1008129a, 28827 }, /* XF86Macro11 */ + { 0x1008129b, 28839 }, /* XF86Macro12 */ + { 0x1008129c, 28851 }, /* XF86Macro13 */ + { 0x1008129d, 28863 }, /* XF86Macro14 */ + { 0x1008129e, 28875 }, /* XF86Macro15 */ + { 0x1008129f, 28887 }, /* XF86Macro16 */ + { 0x100812a0, 28899 }, /* XF86Macro17 */ + { 0x100812a1, 28911 }, /* XF86Macro18 */ + { 0x100812a2, 28923 }, /* XF86Macro19 */ + { 0x100812a3, 28946 }, /* XF86Macro20 */ + { 0x100812a4, 28958 }, /* XF86Macro21 */ + { 0x100812a5, 28970 }, /* XF86Macro22 */ + { 0x100812a6, 28982 }, /* XF86Macro23 */ + { 0x100812a7, 28994 }, /* XF86Macro24 */ + { 0x100812a8, 29006 }, /* XF86Macro25 */ + { 0x100812a9, 29018 }, /* XF86Macro26 */ + { 0x100812aa, 29030 }, /* XF86Macro27 */ + { 0x100812ab, 29042 }, /* XF86Macro28 */ + { 0x100812ac, 29054 }, /* XF86Macro29 */ + { 0x100812ad, 29077 }, /* XF86Macro30 */ + { 0x100812b0, 29227 }, /* XF86MacroRecordStart */ + { 0x100812b1, 29248 }, /* XF86MacroRecordStop */ + { 0x100812b2, 29206 }, /* XF86MacroPresetCycle */ + { 0x100812b3, 29155 }, /* XF86MacroPreset1 */ + { 0x100812b4, 29172 }, /* XF86MacroPreset2 */ + { 0x100812b5, 29189 }, /* XF86MacroPreset3 */ + { 0x100812b8, 28401 }, /* XF86KbdLcdMenu1 */ + { 0x100812b9, 28417 }, /* XF86KbdLcdMenu2 */ + { 0x100812ba, 28433 }, /* XF86KbdLcdMenu3 */ + { 0x100812bb, 28449 }, /* XF86KbdLcdMenu4 */ + { 0x100812bc, 28465 }, /* XF86KbdLcdMenu5 */ + { 0x1008fe01, 30551 }, /* XF86Switch_VT_1 */ + { 0x1008fe02, 30618 }, /* XF86Switch_VT_2 */ + { 0x1008fe03, 30634 }, /* XF86Switch_VT_3 */ + { 0x1008fe04, 30650 }, /* XF86Switch_VT_4 */ + { 0x1008fe05, 30666 }, /* XF86Switch_VT_5 */ + { 0x1008fe06, 30682 }, /* XF86Switch_VT_6 */ + { 0x1008fe07, 30698 }, /* XF86Switch_VT_7 */ + { 0x1008fe08, 30714 }, /* XF86Switch_VT_8 */ + { 0x1008fe09, 30730 }, /* XF86Switch_VT_9 */ + { 0x1008fe0a, 30567 }, /* XF86Switch_VT_10 */ + { 0x1008fe0b, 30584 }, /* XF86Switch_VT_11 */ + { 0x1008fe0c, 30601 }, /* XF86Switch_VT_12 */ + { 0x1008fe20, 30893 }, /* XF86Ungrab */ + { 0x1008fe21, 27653 }, /* XF86ClearGrab */ + { 0x1008fe22, 29526 }, /* XF86Next_VMode */ + { 0x1008fe23, 30001 }, /* XF86Prev_VMode */ + { 0x1008fe24, 28786 }, /* XF86LogWindowTree */ + { 0x1008fe25, 28759 }, /* XF86LogGrabInfo */ + { 0x1008ff01, 29394 }, /* XF86ModeLock */ + { 0x1008ff02, 29452 }, /* XF86MonBrightnessUp */ + { 0x1008ff03, 29430 }, /* XF86MonBrightnessDown */ + { 0x1008ff04, 28481 }, /* XF86KbdLightOnOff */ + { 0x1008ff05, 28229 }, /* XF86KbdBrightnessUp */ + { 0x1008ff06, 28207 }, /* XF86KbdBrightnessDown */ + { 0x1008ff07, 29407 }, /* XF86MonBrightnessCycle */ + { 0x1008ff10, 30468 }, /* XF86Standby */ + { 0x1008ff11, 27029 }, /* XF86AudioLowerVolume */ + { 0x1008ff12, 27082 }, /* XF86AudioMute */ + { 0x1008ff13, 27169 }, /* XF86AudioRaiseVolume */ + { 0x1008ff14, 27125 }, /* XF86AudioPlay */ + { 0x1008ff15, 27258 }, /* XF86AudioStop */ + { 0x1008ff16, 27155 }, /* XF86AudioPrev */ + { 0x1008ff17, 27096 }, /* XF86AudioNext */ + { 0x1008ff18, 28138 }, /* XF86HomePage */ + { 0x1008ff19, 29268 }, /* XF86Mail */ + { 0x1008ff1a, 30480 }, /* XF86Start */ + { 0x1008ff1b, 30337 }, /* XF86Search */ + { 0x1008ff1c, 27210 }, /* XF86AudioRecord */ + { 0x1008ff1d, 27468 }, /* XF86Calculator */ + { 0x1008ff1e, 29349 }, /* XF86Memo */ + { 0x1008ff1f, 30797 }, /* XF86ToDoList */ + { 0x1008ff20, 27483 }, /* XF86Calendar */ + { 0x1008ff21, 29957 }, /* XF86PowerDown */ + { 0x1008ff22, 27707 }, /* XF86ContrastAdjust */ + { 0x1008ff23, 30155 }, /* XF86RockerUp */ + { 0x1008ff24, 30124 }, /* XF86RockerDown */ + { 0x1008ff25, 30139 }, /* XF86RockerEnter */ + { 0x1008ff26, 27281 }, /* XF86Back */ + { 0x1008ff27, 27993 }, /* XF86Forward */ + { 0x1008ff28, 30490 }, /* XF86Stop */ + { 0x1008ff29, 30054 }, /* XF86Refresh */ + { 0x1008ff2a, 29971 }, /* XF86PowerOff */ + { 0x1008ff2b, 31046 }, /* XF86WakeUp */ + { 0x1008ff2c, 27883 }, /* XF86Eject */ + { 0x1008ff2d, 30261 }, /* XF86ScreenSaver */ + { 0x1008ff2e, 31125 }, /* XF86WWW */ + { 0x1008ff2f, 30401 }, /* XF86Sleep */ + { 0x1008ff30, 27932 }, /* XF86Favorites */ + { 0x1008ff31, 27110 }, /* XF86AudioPause */ + { 0x1008ff32, 27050 }, /* XF86AudioMedia */ + { 0x1008ff33, 29482 }, /* XF86MyComputer */ + { 0x1008ff34, 30958 }, /* XF86VendorHome */ + { 0x1008ff35, 28728 }, /* XF86LightBulb */ + { 0x1008ff36, 30392 }, /* XF86Shop */ + { 0x1008ff37, 28126 }, /* XF86History */ + { 0x1008ff38, 29869 }, /* XF86OpenURL */ + { 0x1008ff39, 26784 }, /* XF86AddFavorite */ + { 0x1008ff3a, 28151 }, /* XF86HotLinks */ + { 0x1008ff3b, 27360 }, /* XF86BrightnessAdjust */ + { 0x1008ff3c, 27946 }, /* XF86Finance */ + { 0x1008ff3d, 27677 }, /* XF86Community */ + { 0x1008ff3e, 27242 }, /* XF86AudioRewind */ + { 0x1008ff3f, 27290 }, /* XF86BackForward */ + { 0x1008ff40, 28512 }, /* XF86Launch0 */ + { 0x1008ff41, 28524 }, /* XF86Launch1 */ + { 0x1008ff42, 28536 }, /* XF86Launch2 */ + { 0x1008ff43, 28548 }, /* XF86Launch3 */ + { 0x1008ff44, 28560 }, /* XF86Launch4 */ + { 0x1008ff45, 28572 }, /* XF86Launch5 */ + { 0x1008ff46, 28584 }, /* XF86Launch6 */ + { 0x1008ff47, 28596 }, /* XF86Launch7 */ + { 0x1008ff48, 28608 }, /* XF86Launch8 */ + { 0x1008ff49, 28620 }, /* XF86Launch9 */ + { 0x1008ff4a, 28632 }, /* XF86LaunchA */ + { 0x1008ff4b, 28644 }, /* XF86LaunchB */ + { 0x1008ff4c, 28656 }, /* XF86LaunchC */ + { 0x1008ff4d, 28668 }, /* XF86LaunchD */ + { 0x1008ff4e, 28680 }, /* XF86LaunchE */ + { 0x1008ff4f, 28692 }, /* XF86LaunchF */ + { 0x1008ff50, 26830 }, /* XF86ApplicationLeft */ + { 0x1008ff51, 26850 }, /* XF86ApplicationRight */ + { 0x1008ff52, 27341 }, /* XF86Book */ + { 0x1008ff53, 27606 }, /* XF86CD */ + { 0x1008ff54, 27453 }, /* XF86Calculater */ + { 0x1008ff55, 27643 }, /* XF86Clear */ + { 0x1008ff56, 27667 }, /* XF86Close */ + { 0x1008ff57, 27743 }, /* XF86Copy */ + { 0x1008ff58, 27752 }, /* XF86Cut */ + { 0x1008ff59, 27797 }, /* XF86Display */ + { 0x1008ff5a, 27856 }, /* XF86DOS */ + { 0x1008ff5b, 27842 }, /* XF86Documents */ + { 0x1008ff5c, 27893 }, /* XF86Excel */ + { 0x1008ff5d, 27903 }, /* XF86Explorer */ + { 0x1008ff5e, 28051 }, /* XF86Game */ + { 0x1008ff5f, 28060 }, /* XF86Go */ + { 0x1008ff60, 28184 }, /* XF86iTouch */ + { 0x1008ff61, 28775 }, /* XF86LogOff */ + { 0x1008ff62, 29293 }, /* XF86Market */ + { 0x1008ff63, 29337 }, /* XF86Meeting */ + { 0x1008ff65, 29358 }, /* XF86MenuKB */ + { 0x1008ff66, 29369 }, /* XF86MenuPB */ + { 0x1008ff67, 29497 }, /* XF86MySites */ + { 0x1008ff68, 29509 }, /* XF86New */ + { 0x1008ff69, 29517 }, /* XF86News */ + { 0x1008ff6a, 29824 }, /* XF86OfficeHome */ + { 0x1008ff6b, 29860 }, /* XF86Open */ + { 0x1008ff6c, 29881 }, /* XF86Option */ + { 0x1008ff6d, 29892 }, /* XF86Paste */ + { 0x1008ff6e, 29918 }, /* XF86Phone */ + { 0x1008ff70, 30040 }, /* XF86Q */ + { 0x1008ff72, 30077 }, /* XF86Reply */ + { 0x1008ff73, 30066 }, /* XF86Reload */ + { 0x1008ff74, 30181 }, /* XF86RotateWindows */ + { 0x1008ff75, 30237 }, /* XF86RotationPB */ + { 0x1008ff76, 30199 }, /* XF86RotationKB */ + { 0x1008ff77, 30252 }, /* XF86Save */ + { 0x1008ff78, 30324 }, /* XF86ScrollUp */ + { 0x1008ff79, 30309 }, /* XF86ScrollDown */ + { 0x1008ff7a, 30293 }, /* XF86ScrollClick */ + { 0x1008ff7b, 30383 }, /* XF86Send */ + { 0x1008ff7c, 30427 }, /* XF86Spell */ + { 0x1008ff7d, 30452 }, /* XF86SplitScreen */ + { 0x1008ff7e, 30527 }, /* XF86Support */ + { 0x1008ff7f, 30762 }, /* XF86TaskPane */ + { 0x1008ff80, 30775 }, /* XF86Terminal */ + { 0x1008ff81, 30810 }, /* XF86Tools */ + { 0x1008ff82, 30882 }, /* XF86Travel */ + { 0x1008ff84, 30939 }, /* XF86UserPB */ + { 0x1008ff85, 30915 }, /* XF86User1KB */ + { 0x1008ff86, 30927 }, /* XF86User2KB */ + { 0x1008ff87, 30973 }, /* XF86Video */ + { 0x1008ff88, 31068 }, /* XF86WheelButton */ + { 0x1008ff89, 31093 }, /* XF86Word */ + { 0x1008ff8a, 31133 }, /* XF86Xfer */ + { 0x1008ff8b, 31153 }, /* XF86ZoomIn */ + { 0x1008ff8c, 31164 }, /* XF86ZoomOut */ + { 0x1008ff8d, 27272 }, /* XF86Away */ + { 0x1008ff8e, 29380 }, /* XF86Messenger */ + { 0x1008ff8f, 31057 }, /* XF86WebCam */ + { 0x1008ff90, 29277 }, /* XF86MailForward */ + { 0x1008ff91, 29944 }, /* XF86Pictures */ + { 0x1008ff92, 29472 }, /* XF86Music */ + { 0x1008ff93, 27306 }, /* XF86Battery */ + { 0x1008ff94, 27327 }, /* XF86Bluetooth */ + { 0x1008ff95, 31084 }, /* XF86WLAN */ + { 0x1008ff96, 30950 }, /* XF86UWB */ + { 0x1008ff97, 27012 }, /* XF86AudioForward */ + { 0x1008ff98, 27226 }, /* XF86AudioRepeat */ + { 0x1008ff99, 27190 }, /* XF86AudioRandomPlay */ + { 0x1008ff9a, 30514 }, /* XF86Subtitle */ + { 0x1008ff9b, 26978 }, /* XF86AudioCycleTrack */ + { 0x1008ff9c, 27760 }, /* XF86CycleAngle */ + { 0x1008ff9d, 28005 }, /* XF86FrameBack */ + { 0x1008ff9e, 28019 }, /* XF86FrameForward */ + { 0x1008ff9f, 30788 }, /* XF86Time */ + { 0x1008ffa0, 30348 }, /* XF86Select */ + { 0x1008ffa1, 30998 }, /* XF86View */ + { 0x1008ffa2, 30820 }, /* XF86TopMenu */ + { 0x1008ffa3, 30046 }, /* XF86Red */ + { 0x1008ffa4, 28086 }, /* XF86Green */ + { 0x1008ffa5, 31142 }, /* XF86Yellow */ + { 0x1008ffa6, 27318 }, /* XF86Blue */ + { 0x1008ffa7, 30539 }, /* XF86Suspend */ + { 0x1008ffa8, 28112 }, /* XF86Hibernate */ + { 0x1008ffa9, 30863 }, /* XF86TouchpadToggle */ + { 0x1008ffb0, 30848 }, /* XF86TouchpadOn */ + { 0x1008ffb1, 30832 }, /* XF86TouchpadOff */ + { 0x1008ffb2, 27065 }, /* XF86AudioMicMute */ + { 0x1008ffb3, 28499 }, /* XF86Keyboard */ + { 0x1008ffb4, 31116 }, /* XF86WWAN */ + { 0x1008ffb5, 30087 }, /* XF86RFKill */ + { 0x1008ffb6, 27139 }, /* XF86AudioPreset */ + { 0x1008ffb7, 30214 }, /* XF86RotationLockToggle */ + { 0x1008ffb8, 28036 }, /* XF86FullScreen */ }; diff --git a/src/registry.c b/src/registry.c index dcaaa1b..dbaac2a 100644 --- a/src/registry.c +++ b/src/registry.c @@ -742,6 +742,10 @@ parse_config_item(struct rxkb_context *ctx, if (!*name || !strlen(*name)) { log_err(ctx, "xml:%d: missing required element 'name'\n", ci->line); + free(*name); + free(*description); + free(*brief); + free(*vendor); return false; } @@ -804,6 +808,11 @@ parse_language_list(xmlNode *language_list, struct rxkb_layout *layout) char *str = extract_text(node); struct rxkb_object *parent; + if (!str || strlen(str) != 3) { + free(str); + continue; + } + parent = &layout->base; code = rxkb_iso639_code_create(parent); code->code = str; @@ -823,6 +832,11 @@ parse_country_list(xmlNode *country_list, struct rxkb_layout *layout) char *str = extract_text(node); struct rxkb_object *parent; + if (!str || strlen(str) != 2) { + free(str); + continue; + } + parent = &layout->base; code = rxkb_iso3166_code_create(parent); code->code = str; @@ -856,7 +870,8 @@ parse_variant(struct rxkb_context *ctx, struct rxkb_layout *l, v->name = strdup(l->name); v->variant = name; v->description = description; - v->brief = brief; + // if variant omits brief, inherit from parent layout. + v->brief = brief == NULL ? strdup_safe(l->brief) : brief; v->popularity = popularity; list_append(&ctx->layouts, &v->base.link); @@ -866,11 +881,35 @@ parse_variant(struct rxkb_context *ctx, struct rxkb_layout *l, if (!is_node(ci, "configItem")) continue; + bool found_language_list = false; + bool found_country_list = false; for (node = ci->children; node; node = node->next) { - if (is_node(node, "languageList")) + if (is_node(node, "languageList")) { parse_language_list(node, v); - if (is_node(node, "countryList")) + found_language_list = true; + } + if (is_node(node, "countryList")) { parse_country_list(node, v); + found_country_list = true; + } + } + if (!found_language_list) { + // inherit from parent layout + struct rxkb_iso639_code* x; + list_for_each(x, &l->iso639s, base.link) { + struct rxkb_iso639_code* code = rxkb_iso639_code_create(&v->base); + code->code = strdup(x->code); + list_append(&v->iso639s, &code->base.link); + } + } + if (!found_country_list) { + // inherit from parent layout + struct rxkb_iso3166_code* x; + list_for_each(x, &l->iso3166s, base.link) { + struct rxkb_iso3166_code* code = rxkb_iso3166_code_create(&v->base); + code->code = strdup(x->code); + list_append(&v->iso3166s, &code->base.link); + } } } } else { @@ -1193,7 +1232,6 @@ parse(struct rxkb_context *ctx, const char *path, success = true; error: xmlFreeDoc(doc); - xmlCleanupParser(); return success; } diff --git a/src/utils.h b/src/utils.h index cd3e9b1..7557dab 100644 --- a/src/utils.h +++ b/src/utils.h @@ -66,6 +66,7 @@ istrncmp(const char *a, const char *b, size_t n); static inline bool streq(const char *s1, const char *s2) { + assert(s1 && s2); return strcmp(s1, s2) == 0; } diff --git a/src/x11/keymap.c b/src/x11/keymap.c index f5b368f..473a89d 100644 --- a/src/x11/keymap.c +++ b/src/x11/keymap.c @@ -88,6 +88,33 @@ } \ } while (0) +static const xcb_xkb_map_part_t get_map_required_components = + (XCB_XKB_MAP_PART_KEY_TYPES | + XCB_XKB_MAP_PART_KEY_SYMS | + XCB_XKB_MAP_PART_MODIFIER_MAP | + XCB_XKB_MAP_PART_EXPLICIT_COMPONENTS | + XCB_XKB_MAP_PART_KEY_ACTIONS | + XCB_XKB_MAP_PART_VIRTUAL_MODS | + XCB_XKB_MAP_PART_VIRTUAL_MOD_MAP); + +static const xcb_xkb_name_detail_t get_names_wanted = + (XCB_XKB_NAME_DETAIL_KEYCODES | + XCB_XKB_NAME_DETAIL_SYMBOLS | + XCB_XKB_NAME_DETAIL_TYPES | + XCB_XKB_NAME_DETAIL_COMPAT | + XCB_XKB_NAME_DETAIL_KEY_TYPE_NAMES | + XCB_XKB_NAME_DETAIL_KT_LEVEL_NAMES | + XCB_XKB_NAME_DETAIL_INDICATOR_NAMES | + XCB_XKB_NAME_DETAIL_KEY_NAMES | + XCB_XKB_NAME_DETAIL_KEY_ALIASES | + XCB_XKB_NAME_DETAIL_VIRTUAL_MOD_NAMES | + XCB_XKB_NAME_DETAIL_GROUP_NAMES); +static const xcb_xkb_name_detail_t get_names_required = + (XCB_XKB_NAME_DETAIL_KEY_TYPE_NAMES | + XCB_XKB_NAME_DETAIL_KT_LEVEL_NAMES | + XCB_XKB_NAME_DETAIL_KEY_NAMES | + XCB_XKB_NAME_DETAIL_VIRTUAL_MOD_NAMES); + static xkb_mod_mask_t translate_mods(uint8_t rmods, uint16_t vmods_low, uint16_t vmods_high) @@ -645,26 +672,15 @@ fail: } static bool -get_map(struct xkb_keymap *keymap, xcb_connection_t *conn, uint16_t device_id) +get_map(struct xkb_keymap *keymap, xcb_connection_t *conn, + xcb_xkb_get_map_cookie_t cookie) { - static const xcb_xkb_map_part_t required_components = - (XCB_XKB_MAP_PART_KEY_TYPES | - XCB_XKB_MAP_PART_KEY_SYMS | - XCB_XKB_MAP_PART_MODIFIER_MAP | - XCB_XKB_MAP_PART_EXPLICIT_COMPONENTS | - XCB_XKB_MAP_PART_KEY_ACTIONS | - XCB_XKB_MAP_PART_VIRTUAL_MODS | - XCB_XKB_MAP_PART_VIRTUAL_MOD_MAP); - - xcb_xkb_get_map_cookie_t cookie = - xcb_xkb_get_map(conn, device_id, required_components, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); xcb_xkb_get_map_reply_t *reply = xcb_xkb_get_map_reply(conn, cookie, NULL); xcb_xkb_get_map_map_t map; FAIL_IF_BAD_REPLY(reply, "XkbGetMap"); - if ((reply->present & required_components) != required_components) + if ((reply->present & get_map_required_components) != get_map_required_components) goto fail; xcb_xkb_get_map_map_unpack(xcb_xkb_get_map_map(reply), @@ -749,10 +765,8 @@ get_indicators(struct xkb_keymap *keymap, xcb_connection_t *conn, static bool get_indicator_map(struct xkb_keymap *keymap, xcb_connection_t *conn, - uint16_t device_id) + xcb_xkb_get_indicator_map_cookie_t cookie) { - xcb_xkb_get_indicator_map_cookie_t cookie = - xcb_xkb_get_indicator_map(conn, device_id, ALL_INDICATORS_MASK); xcb_xkb_get_indicator_map_reply_t *reply = xcb_xkb_get_indicator_map_reply(conn, cookie, NULL); @@ -831,10 +845,8 @@ fail: static bool get_compat_map(struct xkb_keymap *keymap, xcb_connection_t *conn, - uint16_t device_id) + xcb_xkb_get_compat_map_cookie_t cookie) { - xcb_xkb_get_compat_map_cookie_t cookie = - xcb_xkb_get_compat_map(conn, device_id, 0, true, 0, 0); xcb_xkb_get_compat_map_reply_t *reply = xcb_xkb_get_compat_map_reply(conn, cookie, NULL); @@ -852,7 +864,7 @@ fail: } static bool -get_type_names(struct xkb_keymap *keymap, xcb_connection_t *conn, +get_type_names(struct xkb_keymap *keymap, struct x11_atom_interner *interner, xcb_xkb_get_names_reply_t *reply, xcb_xkb_get_names_value_list_t *list) { @@ -880,13 +892,11 @@ get_type_names(struct xkb_keymap *keymap, xcb_connection_t *conn, ALLOC_OR_FAIL(type->level_names, type->num_levels); - if (!adopt_atom(keymap->ctx, conn, wire_type_name, &type->name)) - goto fail; - - if (!adopt_atoms(keymap->ctx, conn, - kt_level_names_iter, type->level_names, - wire_num_levels)) - goto fail; + x11_atom_interner_adopt_atom(interner, wire_type_name, &type->name); + for (size_t j = 0; j < wire_num_levels; j++) { + x11_atom_interner_adopt_atom(interner, kt_level_names_iter[j], + &type->level_names[j]); + } type->num_level_names = type->num_levels; kt_level_names_iter += wire_num_levels; @@ -901,7 +911,8 @@ fail: } static bool -get_indicator_names(struct xkb_keymap *keymap, xcb_connection_t *conn, +get_indicator_names(struct xkb_keymap *keymap, + struct x11_atom_interner *interner, xcb_xkb_get_names_reply_t *reply, xcb_xkb_get_names_value_list_t *list) { @@ -914,8 +925,7 @@ get_indicator_names(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_atom_t wire = *iter; struct xkb_led *led = &keymap->leds[i]; - if (!adopt_atom(keymap->ctx, conn, wire, &led->name)) - return false; + x11_atom_interner_adopt_atom(interner, wire, &led->name); iter++; } @@ -928,7 +938,7 @@ fail: } static bool -get_vmod_names(struct xkb_keymap *keymap, xcb_connection_t *conn, +get_vmod_names(struct xkb_keymap *keymap, struct x11_atom_interner *interner, xcb_xkb_get_names_reply_t *reply, xcb_xkb_get_names_value_list_t *list) { @@ -947,8 +957,7 @@ get_vmod_names(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_atom_t wire = *iter; struct xkb_mod *mod = &keymap->mods.mods[NUM_REAL_MODS + i]; - if (!adopt_atom(keymap->ctx, conn, wire, &mod->name)) - return false; + x11_atom_interner_adopt_atom(interner, wire, &mod->name); iter++; } @@ -958,7 +967,7 @@ get_vmod_names(struct xkb_keymap *keymap, xcb_connection_t *conn, } static bool -get_group_names(struct xkb_keymap *keymap, xcb_connection_t *conn, +get_group_names(struct xkb_keymap *keymap, struct x11_atom_interner *interner, xcb_xkb_get_names_reply_t *reply, xcb_xkb_get_names_value_list_t *list) { @@ -968,9 +977,10 @@ get_group_names(struct xkb_keymap *keymap, xcb_connection_t *conn, keymap->num_group_names = msb_pos(reply->groupNames); ALLOC_OR_FAIL(keymap->group_names, keymap->num_group_names); - if (!adopt_atoms(keymap->ctx, conn, - iter, keymap->group_names, length)) - goto fail; + for (int i = 0; i < length; i++) { + x11_atom_interner_adopt_atom(interner, iter[i], + &keymap->group_names[i]); + } return true; @@ -1051,36 +1061,17 @@ fail: } static bool -get_names(struct xkb_keymap *keymap, xcb_connection_t *conn, - uint16_t device_id) +get_names(struct xkb_keymap *keymap, struct x11_atom_interner *interner, + xcb_xkb_get_names_cookie_t cookie) { - static const xcb_xkb_name_detail_t wanted = - (XCB_XKB_NAME_DETAIL_KEYCODES | - XCB_XKB_NAME_DETAIL_SYMBOLS | - XCB_XKB_NAME_DETAIL_TYPES | - XCB_XKB_NAME_DETAIL_COMPAT | - XCB_XKB_NAME_DETAIL_KEY_TYPE_NAMES | - XCB_XKB_NAME_DETAIL_KT_LEVEL_NAMES | - XCB_XKB_NAME_DETAIL_INDICATOR_NAMES | - XCB_XKB_NAME_DETAIL_KEY_NAMES | - XCB_XKB_NAME_DETAIL_KEY_ALIASES | - XCB_XKB_NAME_DETAIL_VIRTUAL_MOD_NAMES | - XCB_XKB_NAME_DETAIL_GROUP_NAMES); - static const xcb_xkb_name_detail_t required = - (XCB_XKB_NAME_DETAIL_KEY_TYPE_NAMES | - XCB_XKB_NAME_DETAIL_KT_LEVEL_NAMES | - XCB_XKB_NAME_DETAIL_KEY_NAMES | - XCB_XKB_NAME_DETAIL_VIRTUAL_MOD_NAMES); - - xcb_xkb_get_names_cookie_t cookie = - xcb_xkb_get_names(conn, device_id, wanted); + xcb_connection_t *conn = interner->conn; xcb_xkb_get_names_reply_t *reply = xcb_xkb_get_names_reply(conn, cookie, NULL); xcb_xkb_get_names_value_list_t list; FAIL_IF_BAD_REPLY(reply, "XkbGetNames"); - FAIL_UNLESS((reply->which & required) == required); + FAIL_UNLESS((reply->which & get_names_required) == get_names_required); xcb_xkb_get_names_value_list_unpack(xcb_xkb_get_names_value_list(reply), reply->nTypes, @@ -1093,23 +1084,22 @@ get_names(struct xkb_keymap *keymap, xcb_connection_t *conn, reply->which, &list); - if (!get_atom_name(conn, list.keycodesName, &keymap->keycodes_section_name) || - !get_atom_name(conn, list.symbolsName, &keymap->symbols_section_name) || - !get_atom_name(conn, list.typesName, &keymap->types_section_name) || - !get_atom_name(conn, list.compatName, &keymap->compat_section_name) || - !get_type_names(keymap, conn, reply, &list) || - !get_indicator_names(keymap, conn, reply, &list) || - !get_vmod_names(keymap, conn, reply, &list) || - !get_group_names(keymap, conn, reply, &list) || + x11_atom_interner_get_escaped_atom_name(interner, list.keycodesName, + &keymap->keycodes_section_name); + x11_atom_interner_get_escaped_atom_name(interner, list.symbolsName, + &keymap->symbols_section_name); + x11_atom_interner_get_escaped_atom_name(interner, list.typesName, + &keymap->types_section_name); + x11_atom_interner_get_escaped_atom_name(interner, list.compatName, + &keymap->compat_section_name); + if (!get_type_names(keymap, interner, reply, &list) || + !get_indicator_names(keymap, interner, reply, &list) || + !get_vmod_names(keymap, interner, reply, &list) || + !get_group_names(keymap, interner, reply, &list) || !get_key_names(keymap, conn, reply, &list) || !get_aliases(keymap, conn, reply, &list)) goto fail; - XkbEscapeMapName(keymap->keycodes_section_name); - XkbEscapeMapName(keymap->symbols_section_name); - XkbEscapeMapName(keymap->types_section_name); - XkbEscapeMapName(keymap->compat_section_name); - free(reply); return true; @@ -1120,10 +1110,8 @@ fail: static bool get_controls(struct xkb_keymap *keymap, xcb_connection_t *conn, - uint16_t device_id) + xcb_xkb_get_controls_cookie_t cookie) { - xcb_xkb_get_controls_cookie_t cookie = - xcb_xkb_get_controls(conn, device_id); xcb_xkb_get_controls_reply_t *reply = xcb_xkb_get_controls_reply(conn, cookie, NULL); @@ -1169,14 +1157,52 @@ xkb_x11_keymap_new_from_device(struct xkb_context *ctx, if (!keymap) return NULL; - if (!get_map(keymap, conn, device_id) || - !get_indicator_map(keymap, conn, device_id) || - !get_compat_map(keymap, conn, device_id) || - !get_names(keymap, conn, device_id) || - !get_controls(keymap, conn, device_id)) { - xkb_keymap_unref(keymap); - return NULL; - } + struct x11_atom_interner interner; + x11_atom_interner_init(&interner, ctx, conn); + + /* + * Send all requests together so only one roundtrip is needed + * to get the replies. + */ + xcb_xkb_get_map_cookie_t map_cookie = + xcb_xkb_get_map(conn, device_id, get_map_required_components, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + xcb_xkb_get_indicator_map_cookie_t indicator_map_cookie = + xcb_xkb_get_indicator_map(conn, device_id, ALL_INDICATORS_MASK); + xcb_xkb_get_compat_map_cookie_t compat_map_cookie = + xcb_xkb_get_compat_map(conn, device_id, 0, true, 0, 0); + xcb_xkb_get_names_cookie_t names_cookie = + xcb_xkb_get_names(conn, device_id, get_names_wanted); + xcb_xkb_get_controls_cookie_t controls_cookie = + xcb_xkb_get_controls(conn, device_id); + + if (!get_map(keymap, conn, map_cookie)) + goto err_map; + if (!get_indicator_map(keymap, conn, indicator_map_cookie)) + goto err_indicator_map; + if (!get_compat_map(keymap, conn, compat_map_cookie)) + goto err_compat_map; + if (!get_names(keymap, &interner, names_cookie)) + goto err_names; + if (!get_controls(keymap, conn, controls_cookie)) + goto err_controls; + x11_atom_interner_round_trip(&interner); + if (interner.had_error) + goto err_interner; return keymap; + +err_map: + xcb_discard_reply(conn, indicator_map_cookie.sequence); +err_indicator_map: + xcb_discard_reply(conn, compat_map_cookie.sequence); +err_compat_map: + xcb_discard_reply(conn, names_cookie.sequence); +err_names: + xcb_discard_reply(conn, controls_cookie.sequence); +err_controls: + x11_atom_interner_round_trip(&interner); +err_interner: + xkb_keymap_unref(keymap); + return NULL; } diff --git a/src/x11/util.c b/src/x11/util.c index 660d885..cc4c71c 100644 --- a/src/x11/util.c +++ b/src/x11/util.c @@ -124,37 +124,6 @@ xkb_x11_get_core_keyboard_device_id(xcb_connection_t *conn) return device_id; } -bool -get_atom_name(xcb_connection_t *conn, xcb_atom_t atom, char **out) -{ - xcb_get_atom_name_cookie_t cookie; - xcb_get_atom_name_reply_t *reply; - int length; - char *name; - - if (atom == 0) { - *out = NULL; - return true; - } - - cookie = xcb_get_atom_name(conn, atom); - reply = xcb_get_atom_name_reply(conn, cookie, NULL); - if (!reply) - return false; - - length = xcb_get_atom_name_name_length(reply); - name = xcb_get_atom_name_name(reply); - - *out = strndup(name, length); - if (!*out) { - free(reply); - return false; - } - - free(reply); - return true; -} - struct x11_atom_cache { /* * Invalidate the cache based on the XCB connection. @@ -169,14 +138,9 @@ struct x11_atom_cache { size_t len; }; -bool -adopt_atoms(struct xkb_context *ctx, xcb_connection_t *conn, - const xcb_atom_t *from, xkb_atom_t *to, const size_t count) +static struct x11_atom_cache * +get_cache(struct xkb_context *ctx, xcb_connection_t *conn) { - enum { SIZE = 128 }; - xcb_get_atom_name_cookie_t cookies[SIZE]; - const size_t num_batches = ROUNDUP(count, SIZE) / SIZE; - if (!ctx->x11_atom_cache) { ctx->x11_atom_cache = calloc(1, sizeof(struct x11_atom_cache)); } @@ -186,79 +150,149 @@ adopt_atoms(struct xkb_context *ctx, xcb_connection_t *conn, cache->conn = conn; cache->len = 0; } + return cache; +} - memset(to, 0, count * sizeof(*to)); - - /* Send and collect the atoms in batches of reasonable SIZE. */ - for (size_t batch = 0; batch < num_batches; batch++) { - const size_t start = batch * SIZE; - const size_t stop = MIN((batch + 1) * SIZE, count); - - /* Send. */ - for (size_t i = start; i < stop; i++) { - bool cache_hit = false; - if (cache) { - for (size_t c = 0; c < cache->len; c++) { - if (cache->cache[c].from == from[i]) { - to[i] = cache->cache[c].to; - cache_hit = true; - break; - } - } +void +x11_atom_interner_init(struct x11_atom_interner *interner, + struct xkb_context *ctx, xcb_connection_t *conn) +{ + interner->had_error = false; + interner->ctx = ctx; + interner->conn = conn; + interner->num_pending = 0; + interner->num_copies = 0; + interner->num_escaped = 0; +} + +void +x11_atom_interner_adopt_atom(struct x11_atom_interner *interner, + const xcb_atom_t atom, xkb_atom_t *out) +{ + *out = XKB_ATOM_NONE; + + if (atom == XCB_ATOM_NONE) + return; + + /* Can be NULL in case the malloc failed. */ + struct x11_atom_cache *cache = get_cache(interner->ctx, interner->conn); + +retry: + + /* Already in the cache? */ + if (cache) { + for (size_t c = 0; c < cache->len; c++) { + if (cache->cache[c].from == atom) { + *out = cache->cache[c].to; + return; } - if (!cache_hit && from[i] != XCB_ATOM_NONE) - cookies[i % SIZE] = xcb_get_atom_name(conn, from[i]); } + } - /* Collect. */ - for (size_t i = start; i < stop; i++) { - xcb_get_atom_name_reply_t *reply; - - if (from[i] == XCB_ATOM_NONE) - continue; + /* Already pending? */ + for (size_t i = 0; i < interner->num_pending; i++) { + if (interner->pending[i].from == atom) { + if (interner->num_copies == ARRAY_SIZE(interner->copies)) { + x11_atom_interner_round_trip(interner); + goto retry; + } - /* Was filled from cache. */ - if (to[i] != 0) - continue; + size_t idx = interner->num_copies++; + interner->copies[idx].from = atom; + interner->copies[idx].out = out; + return; + } + } - reply = xcb_get_atom_name_reply(conn, cookies[i % SIZE], NULL); - if (!reply) - goto err_discard; + /* We have to send a GetAtomName request */ + if (interner->num_pending == ARRAY_SIZE(interner->pending)) { + x11_atom_interner_round_trip(interner); + assert(interner->num_pending < ARRAY_SIZE(interner->pending)); + } + size_t idx = interner->num_pending++; + interner->pending[idx].from = atom; + interner->pending[idx].out = out; + interner->pending[idx].cookie = xcb_get_atom_name(interner->conn, atom); +} - to[i] = xkb_atom_intern(ctx, - xcb_get_atom_name_name(reply), - xcb_get_atom_name_name_length(reply)); - free(reply); +void +x11_atom_interner_round_trip(struct x11_atom_interner *interner) { + struct xkb_context *ctx = interner->ctx; + xcb_connection_t *conn = interner->conn; - if (to[i] == XKB_ATOM_NONE) - goto err_discard; + /* Can be NULL in case the malloc failed. */ + struct x11_atom_cache *cache = get_cache(ctx, conn); - if (cache && cache->len < ARRAY_SIZE(cache->cache)) { - size_t idx = cache->len++; - cache->cache[idx].from = from[i]; - cache->cache[idx].to = to[i]; - } + for (size_t i = 0; i < interner->num_pending; i++) { + xcb_get_atom_name_reply_t *reply; + reply = xcb_get_atom_name_reply(conn, interner->pending[i].cookie, NULL); + if (!reply) { + interner->had_error = true; continue; + } + xcb_atom_t x11_atom = interner->pending[i].from; + xkb_atom_t atom = xkb_atom_intern(ctx, + xcb_get_atom_name_name(reply), + xcb_get_atom_name_name_length(reply)); + free(reply); - /* - * If we don't discard the uncollected replies, they just - * sit in the XCB queue waiting forever. Sad. - */ -err_discard: - for (size_t j = i + 1; j < stop; j++) - if (from[j] != XCB_ATOM_NONE) - xcb_discard_reply(conn, cookies[j % SIZE].sequence); - return false; + if (cache && cache->len < ARRAY_SIZE(cache->cache)) { + size_t idx = cache->len++; + cache->cache[idx].from = x11_atom; + cache->cache[idx].to = atom; + } + + *interner->pending[i].out = atom; + + for (size_t j = 0; j < interner->num_copies; j++) { + if (interner->copies[j].from == x11_atom) + *interner->copies[j].out = atom; } } - return true; + for (size_t i = 0; i < interner->num_escaped; i++) { + xcb_get_atom_name_reply_t *reply; + int length; + char *name; + char **out = interner->escaped[i].out; + + reply = xcb_get_atom_name_reply(conn, interner->escaped[i].cookie, NULL); + *interner->escaped[i].out = NULL; + if (!reply) { + interner->had_error = true; + } else { + length = xcb_get_atom_name_name_length(reply); + name = xcb_get_atom_name_name(reply); + + *out = strndup(name, length); + free(reply); + if (*out == NULL) { + interner->had_error = true; + } else { + XkbEscapeMapName(*out); + } + } + } + + interner->num_pending = 0; + interner->num_copies = 0; + interner->num_escaped = 0; } -bool -adopt_atom(struct xkb_context *ctx, xcb_connection_t *conn, xcb_atom_t atom, - xkb_atom_t *out) +void +x11_atom_interner_get_escaped_atom_name(struct x11_atom_interner *interner, + xcb_atom_t atom, char **out) { - return adopt_atoms(ctx, conn, &atom, out, 1); + if (atom == 0) { + *out = NULL; + return; + } + size_t idx = interner->num_escaped++; + /* There can only be a fixed number of calls to this function "in-flight", + * thus we assert this number. Increase the array size if this assert fails. + */ + assert(idx < ARRAY_SIZE(interner->escaped)); + interner->escaped[idx].out = out; + interner->escaped[idx].cookie = xcb_get_atom_name(interner->conn, atom); } diff --git a/src/x11/x11-priv.h b/src/x11/x11-priv.h index 3a19e99..7f37fd5 100644 --- a/src/x11/x11-priv.h +++ b/src/x11/x11-priv.h @@ -29,26 +29,52 @@ #include "keymap.h" #include "xkbcommon/xkbcommon-x11.h" -/* Get a strdup'd name of an X atom. */ -bool -get_atom_name(xcb_connection_t *conn, xcb_atom_t atom, char **out); +struct x11_atom_interner { + struct xkb_context *ctx; + xcb_connection_t *conn; + bool had_error; + /* Atoms for which we send a GetAtomName request */ + struct { + xcb_atom_t from; + xkb_atom_t *out; + xcb_get_atom_name_cookie_t cookie; + } pending[128]; + size_t num_pending; + /* Atoms which were already pending but queried again */ + struct { + xcb_atom_t from; + xkb_atom_t *out; + } copies[128]; + size_t num_copies; + /* These are not interned, but saved directly (after XkbEscapeMapName) */ + struct { + xcb_get_atom_name_cookie_t cookie; + char **out; + } escaped[4]; + size_t num_escaped; +}; + +void +x11_atom_interner_init(struct x11_atom_interner *interner, + struct xkb_context *ctx, xcb_connection_t *conn); + +void +x11_atom_interner_round_trip(struct x11_atom_interner *interner); /* - * Make a xkb_atom_t's from X atoms (prefer to send as many as possible - * at once, to avoid many roundtrips). - * - * TODO: We can make this more flexible, such that @to doesn't have to - * be sequential. Then we can convert most adopt_atom() calls to - * adopt_atoms(). - * Atom caching would also likely be useful for avoiding quite a - * few requests. + * Make a xkb_atom_t's from X atoms. The actual write is delayed until the next + * call to x11_atom_interner_round_trip() or when too many atoms are pending. */ -bool -adopt_atoms(struct xkb_context *ctx, xcb_connection_t *conn, - const xcb_atom_t *from, xkb_atom_t *to, size_t count); +void +x11_atom_interner_adopt_atom(struct x11_atom_interner *interner, + const xcb_atom_t atom, xkb_atom_t *out); -bool -adopt_atom(struct xkb_context *ctx, xcb_connection_t *conn, xcb_atom_t atom, - xkb_atom_t *out); +/* + * Get a strdup'd and XkbEscapeMapName'd name of an X atom. The actual write is + * delayed until the next call to x11_atom_interner_round_trip(). + */ +void +x11_atom_interner_get_escaped_atom_name(struct x11_atom_interner *interner, + xcb_atom_t atom, char **out); #endif diff --git a/src/xkbcomp/.gitignore b/src/xkbcomp/.gitignore deleted file mode 100644 index d7814e4..0000000 --- a/src/xkbcomp/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -parser.c -parser.h diff --git a/src/xkbcomp/action.c b/src/xkbcomp/action.c index 605f159..e2d4c40 100644 --- a/src/xkbcomp/action.c +++ b/src/xkbcomp/action.c @@ -700,15 +700,16 @@ HandlePrivate(struct xkb_context *ctx, const struct xkb_mod_set *mods, str = xkb_atom_text(ctx, val); len = strlen(str); - if (len < 1 || len > 7) { + if (len < 1 || len > sizeof(act->data)) { log_warn(ctx, - "A private action has 7 data bytes; " - "Illegal data ignored\n"); + "A private action has %ld data bytes; " + "Illegal data ignored\n", sizeof(act->data)); return false; } /* act->data may not be null-terminated, this is intentional */ - strncpy((char *) act->data, str, sizeof(act->data)); + memset(act->data, 0, sizeof(act->data)); + memcpy(act->data, str, len); return true; } else { diff --git a/src/xkbcomp/ast-build.c b/src/xkbcomp/ast-build.c index 7ee13d0..347eed8 100644 --- a/src/xkbcomp/ast-build.c +++ b/src/xkbcomp/ast-build.c @@ -462,15 +462,16 @@ IncludeStmt * IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge) { IncludeStmt *incl, *first; - char *file, *map, *stmt, *tmp, *extra_data; + char *stmt, *tmp; char nextop; incl = first = NULL; - file = map = NULL; tmp = str; stmt = strdup_safe(str); while (tmp && *tmp) { + char *file = NULL, *map = NULL, *extra_data = NULL; + if (!ParseIncludeMap(&tmp, &file, &map, &nextop, &extra_data)) goto err; @@ -494,8 +495,12 @@ IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge) incl = incl->next_incl; } - if (!incl) + if (!incl) { + free(file); + free(map); + free(extra_data); break; + } incl->common.type = STMT_INCLUDE; incl->common.next = NULL; diff --git a/src/xkbcomp/ast.h b/src/xkbcomp/ast.h index ee61106..6c51ce4 100644 --- a/src/xkbcomp/ast.h +++ b/src/xkbcomp/ast.h @@ -243,7 +243,6 @@ typedef struct { union ExprDef { ParseCommon common; - /* Maybe someday we can use C11 anonymous struct for ExprCommon here. */ ExprCommon expr; ExprIdent ident; ExprString string; diff --git a/src/xkbcomp/compat.c b/src/xkbcomp/compat.c index 26b2bb7..b8922c9 100644 --- a/src/xkbcomp/compat.c +++ b/src/xkbcomp/compat.c @@ -690,7 +690,7 @@ HandleInterpDef(CompatInfo *info, InterpDef *def, enum merge_mode merge) } si = info->default_interp; - si.merge = merge = (def->merge == MERGE_DEFAULT ? merge : def->merge); + si.merge = (def->merge == MERGE_DEFAULT ? merge : def->merge); si.interp.sym = def->sym; si.interp.match = pred; si.interp.mods = mods; diff --git a/test/.gitignore b/test/.gitignore deleted file mode 100644 index def76f0..0000000 --- a/test/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -*.log -*.trs -filecomp -rulescomp -keymap -keysym -state -context -rules-file -stringcomp -buffercomp -keyseq -log -interactive-evdev -rmlvo-to-kccgst -rmlvo-to-keymap -print-compiled-keymap -atom -x11 -interactive-x11 -interactive-wayland -utf8 -x11comp -compose diff --git a/test/compose.c b/test/compose.c index 5ba5751..35790a3 100644 --- a/test/compose.c +++ b/test/compose.c @@ -179,7 +179,7 @@ test_seqs(struct xkb_context *ctx) char *path; FILE *file; - path = test_get_path("compose/en_US.UTF-8/Compose"); + path = test_get_path("locale/en_US.UTF-8/Compose"); file = fopen(path, "rb"); assert(file); free(path); @@ -353,7 +353,7 @@ test_state(struct xkb_context *ctx) char *path; FILE *file; - path = test_get_path("compose/en_US.UTF-8/Compose"); + path = test_get_path("locale/en_US.UTF-8/Compose"); file = fopen(path, "rb"); assert(file); free(path); @@ -410,7 +410,7 @@ test_XCOMPOSEFILE(struct xkb_context *ctx) struct xkb_compose_table *table; char *path; - path = test_get_path("compose/en_US.UTF-8/Compose"); + path = test_get_path("locale/en_US.UTF-8/Compose"); setenv("XCOMPOSEFILE", path, 1); free(path); @@ -418,6 +418,8 @@ test_XCOMPOSEFILE(struct xkb_context *ctx) XKB_COMPOSE_COMPILE_NO_FLAGS); assert(table); + unsetenv("XCOMPOSEFILE"); + assert(test_compose_seq(table, XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_space, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "~", XKB_KEY_asciitilde, @@ -426,6 +428,49 @@ test_XCOMPOSEFILE(struct xkb_context *ctx) xkb_compose_table_unref(table); } +static void +test_from_locale(struct xkb_context *ctx) +{ + struct xkb_compose_table *table; + char *path; + + path = test_get_path("locale"); + setenv("XLOCALEDIR", path, 1); + free(path); + + /* Direct directory name match. */ + table = xkb_compose_table_new_from_locale(ctx, "en_US.UTF-8", + XKB_COMPOSE_COMPILE_NO_FLAGS); + assert(table); + xkb_compose_table_unref(table); + + /* Direct locale name match. */ + table = xkb_compose_table_new_from_locale(ctx, "C.UTF-8", + XKB_COMPOSE_COMPILE_NO_FLAGS); + assert(table); + xkb_compose_table_unref(table); + + /* Alias. */ + table = xkb_compose_table_new_from_locale(ctx, "univ.utf8", + XKB_COMPOSE_COMPILE_NO_FLAGS); + assert(table); + xkb_compose_table_unref(table); + + /* Special case - C. */ + table = xkb_compose_table_new_from_locale(ctx, "C", + XKB_COMPOSE_COMPILE_NO_FLAGS); + assert(table); + xkb_compose_table_unref(table); + + /* Bogus - not found. */ + table = xkb_compose_table_new_from_locale(ctx, "blabla", + XKB_COMPOSE_COMPILE_NO_FLAGS); + assert(!table); + + unsetenv("XLOCALEDIR"); +} + + static void test_modifier_syntax(struct xkb_context *ctx) { @@ -486,7 +531,7 @@ test_include(struct xkb_context *ctx) { char *path, *table_string; - path = test_get_path("compose/en_US.UTF-8/Compose"); + path = test_get_path("locale/en_US.UTF-8/Compose"); assert(path); /* We don't have a mechanism to change the include paths like we @@ -526,6 +571,7 @@ main(int argc, char *argv[]) test_seqs(ctx); test_conflicting(ctx); test_XCOMPOSEFILE(ctx); + test_from_locale(ctx); test_state(ctx); test_modifier_syntax(ctx); test_include(ctx); diff --git a/test/data/locale/compose.dir b/test/data/locale/compose.dir new file mode 100644 index 0000000..ee88bdc --- /dev/null +++ b/test/data/locale/compose.dir @@ -0,0 +1,944 @@ +# +# This file contains compose table file names. +# The first word is the compose table file name +# and the second word is the full locale name. +# +# +iso8859-1/Compose C +iso8859-1/Compose af_ZA.ISO8859-1 +iso8859-6/Compose ar_AA.ISO8859-6 +iso8859-6/Compose ar_AE.ISO8859-6 +iso8859-6/Compose ar_BH.ISO8859-6 +iso8859-6/Compose ar_DZ.ISO8859-6 +iso8859-6/Compose ar_EG.ISO8859-6 +iso8859-6/Compose ar_IQ.ISO8859-6 +iso8859-6/Compose ar_JO.ISO8859-6 +iso8859-6/Compose ar_KW.ISO8859-6 +iso8859-6/Compose ar_LB.ISO8859-6 +iso8859-6/Compose ar_LY.ISO8859-6 +iso8859-6/Compose ar_MA.ISO8859-6 +iso8859-6/Compose ar_OM.ISO8859-6 +iso8859-6/Compose ar_QA.ISO8859-6 +iso8859-6/Compose ar_SA.ISO8859-6 +iso8859-6/Compose ar_SD.ISO8859-6 +iso8859-6/Compose ar_SY.ISO8859-6 +iso8859-6/Compose ar_TN.ISO8859-6 +iso8859-6/Compose ar_YE.ISO8859-6 +iso8859-9e/Compose az_AZ.ISO8859-9E +koi8-c/Compose az_AZ.KOI8-C +microsoft-cp1251/Compose be_BY.CP1251 +iso8859-5/Compose be_BY.ISO8859-5 +iso8859-5/Compose bg_BG.ISO8859-5 +microsoft-cp1251/Compose bg_BG.CP1251 +koi8-r/Compose bg_BG.KOI8-R +iso8859-1/Compose br_FR.ISO8859-1 +iso8859-14/Compose br_FR.ISO8859-14 +iso8859-15/Compose br_FR.ISO8859-15 +iso8859-2/Compose bs_BA.ISO8859-2 +iso8859-1/Compose ca_AD.ISO8859-1 +iso8859-15/Compose ca_AD.ISO8859-15 +iso8859-1/Compose ca_ES.ISO8859-1 +iso8859-15/Compose ca_ES.ISO8859-15 +iso8859-1/Compose ca_FR.ISO8859-1 +iso8859-15/Compose ca_FR.ISO8859-15 +iso8859-1/Compose ca_IT.ISO8859-1 +iso8859-15/Compose ca_IT.ISO8859-15 +iso8859-2/Compose cs_CZ.ISO8859-2 +iso8859-1/Compose cy_GB.ISO8859-1 +iso8859-14/Compose cy_GB.ISO8859-14 +iso8859-15/Compose cy_GB.ISO8859-15 +iso8859-1/Compose da_DK.ISO8859-1 +iso8859-15/Compose da_DK.ISO8859-15 +iso8859-1/Compose de_AT.ISO8859-1 +iso8859-15/Compose de_AT.ISO8859-15 +iso8859-1/Compose de_BE.ISO8859-1 +iso8859-15/Compose de_BE.ISO8859-15 +iso8859-1/Compose de_CH.ISO8859-1 +iso8859-15/Compose de_CH.ISO8859-15 +iso8859-1/Compose de_DE.ISO8859-1 +iso8859-15/Compose de_DE.ISO8859-15 +iso8859-1/Compose de_LI.ISO8859-1 +iso8859-15/Compose de_LI.ISO8859-15 +iso8859-1/Compose de_LU.ISO8859-1 +iso8859-15/Compose de_LU.ISO8859-15 +iso8859-4/Compose ee_EE.ISO8859-4 +iso8859-7/Compose el_GR.ISO8859-7 +iso8859-15/Compose el_GR.ISO8859-15 +iso8859-1/Compose en_AU.ISO8859-1 +iso8859-1/Compose en_BE.ISO8859-1 +iso8859-15/Compose en_BE.ISO8859-15 +iso8859-1/Compose en_BW.ISO8859-1 +iso8859-1/Compose en_BZ.ISO8859-1 +iso8859-1/Compose en_CA.ISO8859-1 +iso8859-1/Compose en_EN.ISO8859-1 +iso8859-1/Compose en_GB.ISO8859-1 +iso8859-15/Compose en_GB.ISO8859-15 +iso8859-1/Compose en_HK.ISO8859-1 +iso8859-1/Compose en_IE.ISO8859-1 +iso8859-15/Compose en_IE.ISO8859-15 +iso8859-15/Compose en_IN.ISO8859-15 +iso8859-1/Compose en_JM.ISO8859-1 +iso8859-1/Compose en_NZ.ISO8859-1 +iso8859-1/Compose en_PH.ISO8859-1 +iso8859-1/Compose en_SG.ISO8859-1 +iso8859-1/Compose en_TT.ISO8859-1 +iso8859-1/Compose en_UK.ISO8859-1 +iso8859-15/Compose en_UK.ISO8859-15 +iso8859-1/Compose en_US.ISO8859-1 +iso8859-15/Compose en_US.ISO8859-15 +iso8859-1/Compose en_ZA.ISO8859-1 +iso8859-15/Compose en_ZA.ISO8859-15 +iso8859-1/Compose en_ZW.ISO8859-1 +iso8859-3/Compose eo_EO.ISO8859-3 +iso8859-3/Compose eo_XX.ISO8859-3 +iso8859-1/Compose es_AR.ISO8859-1 +iso8859-1/Compose es_BO.ISO8859-1 +iso8859-1/Compose es_CL.ISO8859-1 +iso8859-1/Compose es_CO.ISO8859-1 +iso8859-1/Compose es_CR.ISO8859-1 +iso8859-1/Compose es_DO.ISO8859-1 +iso8859-1/Compose es_EC.ISO8859-1 +iso8859-1/Compose es_ES.ISO8859-1 +iso8859-15/Compose es_ES.ISO8859-15 +iso8859-1/Compose es_GT.ISO8859-1 +iso8859-1/Compose es_HN.ISO8859-1 +iso8859-1/Compose es_MX.ISO8859-1 +iso8859-1/Compose es_NI.ISO8859-1 +iso8859-1/Compose es_PA.ISO8859-1 +iso8859-15/Compose es_PA.ISO8859-15 +iso8859-1/Compose es_PE.ISO8859-1 +iso8859-15/Compose es_PE.ISO8859-15 +iso8859-1/Compose es_PR.ISO8859-1 +iso8859-1/Compose es_PY.ISO8859-1 +iso8859-15/Compose es_PY.ISO8859-15 +iso8859-1/Compose es_SV.ISO8859-1 +iso8859-15/Compose es_SV.ISO8859-15 +iso8859-1/Compose es_US.ISO8859-1 +iso8859-1/Compose es_UY.ISO8859-1 +iso8859-15/Compose es_UY.ISO8859-15 +iso8859-1/Compose es_VE.ISO8859-1 +iso8859-15/Compose es_VE.ISO8859-15 +iso8859-1/Compose et_EE.ISO8859-1 +iso8859-4/Compose et_EE.ISO8859-4 +iso8859-13/Compose et_EE.ISO8859-13 +iso8859-15/Compose et_EE.ISO8859-15 +iso8859-1/Compose eu_ES.ISO8859-1 +iso8859-15/Compose eu_ES.ISO8859-15 +isiri-3342/Compose fa_IR.ISIRI-3342 +iso8859-1/Compose fi_FI.ISO8859-1 +iso8859-15/Compose fi_FI.ISO8859-15 +iso8859-1/Compose fo_FO.ISO8859-1 +iso8859-15/Compose fo_FO.ISO8859-15 +iso8859-1/Compose fr_BE.ISO8859-1 +iso8859-15/Compose fr_BE.ISO8859-15 +iso8859-1/Compose fr_CA.ISO8859-1 +iso8859-15/Compose fr_CA.ISO8859-15 +iso8859-1/Compose fr_CH.ISO8859-1 +iso8859-15/Compose fr_CH.ISO8859-15 +iso8859-1/Compose fr_FR.ISO8859-1 +iso8859-15/Compose fr_FR.ISO8859-15 +iso8859-1/Compose fr_LU.ISO8859-1 +iso8859-15/Compose fr_LU.ISO8859-15 +iso8859-1/Compose ga_IE.ISO8859-1 +iso8859-14/Compose ga_IE.ISO8859-14 +iso8859-15/Compose ga_IE.ISO8859-15 +iso8859-1/Compose gd_GB.ISO8859-1 +iso8859-14/Compose gd_GB.ISO8859-14 +iso8859-15/Compose gd_GB.ISO8859-15 +iso8859-1/Compose gl_ES.ISO8859-1 +iso8859-15/Compose gl_ES.ISO8859-15 +iso8859-1/Compose gv_GB.ISO8859-1 +iso8859-14/Compose gv_GB.ISO8859-14 +iso8859-15/Compose gv_GB.ISO8859-15 +iso8859-8/Compose he_IL.ISO8859-8 +microsoft-cp1255/Compose he_IL.CP1255 +iscii-dev/Compose hi_IN.ISCII-DEV +iso8859-2/Compose hr_HR.ISO8859-2 +iso8859-2/Compose hu_HU.ISO8859-2 +armscii-8/Compose hy_AM.ARMSCII-8 +iso8859-1/Compose id_ID.ISO8859-1 +iso8859-15/Compose id_ID.ISO8859-15 +iso8859-1/Compose is_IS.ISO8859-1 +iso8859-15/Compose is_IS.ISO8859-15 +iso8859-1/Compose it_CH.ISO8859-1 +iso8859-15/Compose it_CH.ISO8859-15 +iso8859-1/Compose it_IT.ISO8859-1 +iso8859-15/Compose it_IT.ISO8859-15 +ja/Compose ja_JP.eucJP +ja.SJIS/Compose ja_JP.SJIS +ja.JIS/Compose ja_JP.JIS7 +georgian-academy/Compose ka_GE.GEORGIAN-ACADEMY +georgian-ps/Compose ka_GE.GEORGIAN-PS +iso8859-1/Compose kl_GL.ISO8859-1 +iso8859-15/Compose kl_GL.ISO8859-15 +iso8859-1/Compose kw_GB.ISO8859-1 +iso8859-14/Compose kw_GB.ISO8859-14 +iso8859-15/Compose kw_GB.ISO8859-15 +ko/Compose ko_KR.eucKR +ibm-cp1133/Compose lo_LA.IBM-CP1133 +mulelao-1/Compose lo_LA.MULELAO-1 +iso8859-4/Compose lt_LT.ISO8859-4 +iso8859-13/Compose lt_LT.ISO8859-13 +iso8859-4/Compose lv_LV.ISO8859-4 +iso8859-13/Compose lv_LV.ISO8859-13 +iso8859-13/Compose mi_NZ.ISO8859-13 +iso8859-5/Compose mk_MK.ISO8859-5 +microsoft-cp1251/Compose mk_MK.CP1251 +iso8859-1/Compose ms_MY.ISO8859-1 +iso8859-3/Compose mt_MT.ISO8859-3 +iso8859-1/Compose nl_BE.ISO8859-1 +iso8859-15/Compose nl_BE.ISO8859-15 +iso8859-1/Compose nl_NL.ISO8859-1 +iso8859-15/Compose nl_NL.ISO8859-15 +iso8859-1/Compose no_NO.ISO8859-1 +iso8859-15/Compose no_NO.ISO8859-15 +iso8859-1/Compose nb_NO.ISO8859-1 +iso8859-15/Compose nb_NO.ISO8859-15 +iso8859-1/Compose nn_NO.ISO8859-1 +iso8859-15/Compose nn_NO.ISO8859-15 +iso8859-1/Compose nr_ZA.ISO8859-1 +iso8859-15/Compose nso_ZA.ISO8859-15 +iso8859-1/Compose ny_NO.ISO8859-1 +iso8859-15/Compose ny_NO.ISO8859-15 +iso8859-1/Compose oc_FR.ISO8859-1 +iso8859-15/Compose oc_FR.ISO8859-15 +iso8859-1/Compose pd_DE.ISO8859-1 +iso8859-15/Compose pd_DE.ISO8859-15 +iso8859-1/Compose pd_US.ISO8859-1 +iso8859-15/Compose pd_US.ISO8859-15 +iso8859-1/Compose ph_PH.ISO8859-1 +iso8859-2/Compose pl_PL.ISO8859-2 +iso8859-1/Compose pp_AN.ISO8859-1 +iso8859-1/Compose pt_BR.ISO8859-1 +iso8859-15/Compose pt_BR.ISO8859-15 +iso8859-1/Compose pt_PT.ISO8859-1 +iso8859-15/Compose pt_PT.ISO8859-15 +iso8859-2/Compose ro_RO.ISO8859-2 +koi8-r/Compose ru_RU.KOI8-R +iso8859-5/Compose ru_RU.ISO8859-5 +microsoft-cp1251/Compose ru_RU.CP1251 +microsoft-cp1251/Compose ru_UA.CP1251 +koi8-u/Compose ru_UA.KOI8-U +iso8859-1/Compose rw_RW.ISO8859-1 +iso8859-2/Compose sh_YU.ISO8859-2 +iso8859-2/Compose sk_SK.ISO8859-2 +iso8859-2/Compose sl_SI.ISO8859-2 +iso8859-2/Compose sq_AL.ISO8859-2 +iso8859-2/Compose sr_YU.ISO8859-2 +microsoft-cp1251/Compose sr_YU.CP1251 +iso8859-5/Compose sr_YU.ISO8859-5 +iso8859-1/Compose ss_ZA.ISO8859-1 +iso8859-1/Compose st_ZA.ISO8859-1 +iso8859-1/Compose sv_FI.ISO8859-1 +iso8859-15/Compose sv_FI.ISO8859-15 +iso8859-1/Compose sv_SE.ISO8859-1 +iso8859-15/Compose sv_SE.ISO8859-15 +tscii-0/Compose ta_IN.TSCII-0 +koi8-c/Compose tg_TJ.KOI8-C +iso8859-1/Compose tl_PH.ISO8859-1 +iso8859-11/Compose th_TH.ISO8859-11 +th_TH/Compose th_TH.TIS620 +iso8859-15/Compose tn_ZA.ISO8859-15 +iso8859-9/Compose tr_TR.ISO8859-9 +iso8859-1/Compose ts_ZA.ISO8859-1 +tatar-cyr/Compose tt_RU.TATAR-CYR +microsoft-cp1251/Compose uk_UA.CP1251 +koi8-c/Compose tt_RU.KOI8-C +koi8-u/Compose uk_UA.KOI8-U +iso8859-5/Compose uk_UA.ISO8859-5 +microsoft-cp1256/Compose ur_PK.CP1256 +iso8859-1/Compose uz_UZ.ISO8859-1 +vi_VN.viscii/Compose vi_VN.VISCII +vi_VN.tcvn/Compose vi_VN.TCVN +iso8859-1/Compose wa_BE.ISO8859-1 +iso8859-15/Compose wa_BE.ISO8859-15 +iso8859-1/Compose xh_ZA.ISO8859-1 +microsoft-cp1255/Compose yi_US.CP1255 +zh_CN/Compose zh_CN.eucCN +zh_CN/Compose zh_CN.gb2312 +zh_CN.gbk/Compose zh_CN.gbk +zh_CN.gb18030/Compose zh_CN.gb18030 +zh_HK.big5/Compose zh_HK.big5 +zh_HK.big5hkscs/Compose zh_HK.big5hkscs +zh_TW.big5/Compose zh_TW.big5 +zh_TW/Compose zh_TW.eucTW +iso8859-1/Compose zu_ZA.ISO8859-1 +# +# +en_US.UTF-8/Compose C.UTF-8 +en_US.UTF-8/Compose af_ZA.UTF-8 +am_ET.UTF-8/Compose am_ET.UTF-8 +en_US.UTF-8/Compose ar_AA.UTF-8 +en_US.UTF-8/Compose ar_AE.UTF-8 +en_US.UTF-8/Compose ar_BH.UTF-8 +en_US.UTF-8/Compose ar_DZ.UTF-8 +en_US.UTF-8/Compose ar_EG.UTF-8 +en_US.UTF-8/Compose ar_IN.UTF-8 +en_US.UTF-8/Compose ar_IQ.UTF-8 +en_US.UTF-8/Compose ar_JO.UTF-8 +en_US.UTF-8/Compose ar_KW.UTF-8 +en_US.UTF-8/Compose ar_LB.UTF-8 +en_US.UTF-8/Compose ar_LY.UTF-8 +en_US.UTF-8/Compose ar_MA.UTF-8 +en_US.UTF-8/Compose ar_OM.UTF-8 +en_US.UTF-8/Compose ar_QA.UTF-8 +en_US.UTF-8/Compose ar_SA.UTF-8 +en_US.UTF-8/Compose ar_SD.UTF-8 +en_US.UTF-8/Compose ar_SY.UTF-8 +en_US.UTF-8/Compose ar_TN.UTF-8 +en_US.UTF-8/Compose ar_YE.UTF-8 +en_US.UTF-8/Compose ast_ES.UTF-8 +en_US.UTF-8/Compose as_IN.UTF-8 +en_US.UTF-8/Compose az_AZ.UTF-8 +en_US.UTF-8/Compose be_BY.UTF-8 +en_US.UTF-8/Compose bg_BG.UTF-8 +en_US.UTF-8/Compose bn_BD.UTF-8 +en_US.UTF-8/Compose bn_IN.UTF-8 +en_US.UTF-8/Compose bo_IN.UTF-8 +en_US.UTF-8/Compose br_FR.UTF-8 +en_US.UTF-8/Compose bs_BA.UTF-8 +en_US.UTF-8/Compose ca_AD.UTF-8 +en_US.UTF-8/Compose ca_ES.UTF-8 +en_US.UTF-8/Compose ca_FR.UTF-8 +en_US.UTF-8/Compose ca_IT.UTF-8 +cs_CZ.UTF-8/Compose cs_CZ.UTF-8 +en_US.UTF-8/Compose cy_GB.UTF-8 +en_US.UTF-8/Compose da_DK.UTF-8 +en_US.UTF-8/Compose de_AT.UTF-8 +en_US.UTF-8/Compose de_BE.UTF-8 +en_US.UTF-8/Compose de_CH.UTF-8 +en_US.UTF-8/Compose de_DE.UTF-8 +en_US.UTF-8/Compose de_IT.UTF-8 +en_US.UTF-8/Compose de_LI.UTF-8 +en_US.UTF-8/Compose de_LU.UTF-8 +el_GR.UTF-8/Compose el_CY.UTF-8 +el_GR.UTF-8/Compose el_GR.UTF-8 +en_US.UTF-8/Compose en_AU.UTF-8 +en_US.UTF-8/Compose en_BE.UTF-8 +en_US.UTF-8/Compose en_BW.UTF-8 +en_US.UTF-8/Compose en_BZ.UTF-8 +en_US.UTF-8/Compose en_CA.UTF-8 +en_US.UTF-8/Compose en_DK.UTF-8 +en_US.UTF-8/Compose en_EN.UTF-8 +en_US.UTF-8/Compose en_GB.UTF-8 +en_US.UTF-8/Compose en_HK.UTF-8 +en_US.UTF-8/Compose en_IE.UTF-8 +en_US.UTF-8/Compose en_IN.UTF-8 +en_US.UTF-8/Compose en_JM.UTF-8 +en_US.UTF-8/Compose en_MT.UTF-8 +en_US.UTF-8/Compose en_NZ.UTF-8 +en_US.UTF-8/Compose en_PH.UTF-8 +en_US.UTF-8/Compose en_SG.UTF-8 +en_US.UTF-8/Compose en_TT.UTF-8 +en_US.UTF-8/Compose en_UK.UTF-8 +en_US.UTF-8/Compose en_US.UTF-8 +en_US.UTF-8/Compose en_ZA.UTF-8 +en_US.UTF-8/Compose en_ZW.UTF-8 +en_US.UTF-8/Compose eo_EO.UTF-8 +en_US.UTF-8/Compose eo_XX.UTF-8 +en_US.UTF-8/Compose es_AR.UTF-8 +en_US.UTF-8/Compose es_BO.UTF-8 +en_US.UTF-8/Compose es_CL.UTF-8 +en_US.UTF-8/Compose es_CO.UTF-8 +en_US.UTF-8/Compose es_CR.UTF-8 +en_US.UTF-8/Compose es_DO.UTF-8 +en_US.UTF-8/Compose es_EC.UTF-8 +en_US.UTF-8/Compose es_ES.UTF-8 +en_US.UTF-8/Compose es_GT.UTF-8 +en_US.UTF-8/Compose es_HN.UTF-8 +en_US.UTF-8/Compose es_MX.UTF-8 +en_US.UTF-8/Compose es_NI.UTF-8 +en_US.UTF-8/Compose es_PA.UTF-8 +en_US.UTF-8/Compose es_PE.UTF-8 +en_US.UTF-8/Compose es_PR.UTF-8 +en_US.UTF-8/Compose es_PY.UTF-8 +en_US.UTF-8/Compose es_SV.UTF-8 +en_US.UTF-8/Compose es_US.UTF-8 +en_US.UTF-8/Compose es_UY.UTF-8 +en_US.UTF-8/Compose es_VE.UTF-8 +en_US.UTF-8/Compose et_EE.UTF-8 +en_US.UTF-8/Compose eu_ES.UTF-8 +en_US.UTF-8/Compose fa_IR.UTF-8 +fi_FI.UTF-8/Compose fi_FI.UTF-8 +en_US.UTF-8/Compose fo_FO.UTF-8 +en_US.UTF-8/Compose fr_BE.UTF-8 +en_US.UTF-8/Compose fr_CA.UTF-8 +en_US.UTF-8/Compose fr_CH.UTF-8 +en_US.UTF-8/Compose fr_FR.UTF-8 +en_US.UTF-8/Compose fr_LU.UTF-8 +en_US.UTF-8/Compose ga_IE.UTF-8 +en_US.UTF-8/Compose gd_GB.UTF-8 +en_US.UTF-8/Compose gl_ES.UTF-8 +en_US.UTF-8/Compose gu_IN.UTF-8 +en_US.UTF-8/Compose gv_GB.UTF-8 +en_US.UTF-8/Compose he_IL.UTF-8 +en_US.UTF-8/Compose hi_IN.UTF-8 +en_US.UTF-8/Compose hne_IN.UTF-8 +en_US.UTF-8/Compose hr_HR.UTF-8 +en_US.UTF-8/Compose hu_HU.UTF-8 +en_US.UTF-8/Compose hy_AM.UTF-8 +en_US.UTF-8/Compose id_ID.UTF-8 +en_US.UTF-8/Compose is_IS.UTF-8 +en_US.UTF-8/Compose it_CH.UTF-8 +en_US.UTF-8/Compose it_IT.UTF-8 +en_US.UTF-8/Compose iu_CA.UTF-8 +ja_JP.UTF-8/Compose ja_JP.UTF-8 +en_US.UTF-8/Compose ka_GE.UTF-8 +en_US.UTF-8/Compose kk_KZ.UTF-8 +en_US.UTF-8/Compose kl_GL.UTF-8 +km_KH.UTF-8/Compose km_KH.UTF-8 +en_US.UTF-8/Compose kn_IN.UTF-8 +ko_KR.UTF-8/Compose ko_KR.UTF-8 +en_US.UTF-8/Compose ks_IN.UTF-8 +en_US.UTF-8/Compose ks_IN.UTF-8@devanagari +en_US.UTF-8/Compose ku_TR.UTF-8 +en_US.UTF-8/Compose kw_GB.UTF-8 +en_US.UTF-8/Compose ky_KG.UTF-8 +en_US.UTF-8/Compose lo_LA.UTF-8 +en_US.UTF-8/Compose lt_LT.UTF-8 +en_US.UTF-8/Compose lv_LV.UTF-8 +en_US.UTF-8/Compose mai_IN.UTF-8 +en_US.UTF-8/Compose mi_NZ.UTF-8 +en_US.UTF-8/Compose mk_MK.UTF-8 +en_US.UTF-8/Compose ml_IN.UTF-8 +en_US.UTF-8/Compose mr_IN.UTF-8 +en_US.UTF-8/Compose ms_MY.UTF-8 +en_US.UTF-8/Compose mt_MT.UTF-8 +en_US.UTF-8/Compose ne_NP.UTF-8 +en_US.UTF-8/Compose nl_BE.UTF-8 +en_US.UTF-8/Compose nl_NL.UTF-8 +en_US.UTF-8/Compose nn_NO.UTF-8 +en_US.UTF-8/Compose no_NO.UTF-8 +en_US.UTF-8/Compose nb_NO.UTF-8 +en_US.UTF-8/Compose nr_ZA.UTF-8 +en_US.UTF-8/Compose nso_ZA.UTF-8 +en_US.UTF-8/Compose ny_NO.UTF-8 +en_US.UTF-8/Compose oc_FR.UTF-8 +en_US.UTF-8/Compose or_IN.UTF-8 +en_US.UTF-8/Compose pa_IN.UTF-8 +en_US.UTF-8/Compose pa_PK.UTF-8 +en_US.UTF-8/Compose pd_DE.UTF-8 +en_US.UTF-8/Compose pd_US.UTF-8 +en_US.UTF-8/Compose ph_PH.UTF-8 +en_US.UTF-8/Compose pl_PL.UTF-8 +en_US.UTF-8/Compose pp_AN.UTF-8 +pt_BR.UTF-8/Compose pt_BR.UTF-8 +pt_PT.UTF-8/Compose pt_PT.UTF-8 +en_US.UTF-8/Compose ro_RO.UTF-8 +ru_RU.UTF-8/Compose ru_RU.UTF-8 +en_US.UTF-8/Compose ru_UA.UTF-8 +en_US.UTF-8/Compose rw_RW.UTF-8 +en_US.UTF-8/Compose sa_IN.UTF-8 +en_US.UTF-8/Compose sd_IN.UTF-8 +en_US.UTF-8/Compose sd_IN.UTF-8@devanagari +en_US.UTF-8/Compose se_NO.UTF-8 +en_US.UTF-8/Compose sh_BA.UTF-8 +en_US.UTF-8/Compose sh_YU.UTF-8 +en_US.UTF-8/Compose si_LK.UTF-8 +en_US.UTF-8/Compose sk_SK.UTF-8 +en_US.UTF-8/Compose sl_SI.UTF-8 +en_US.UTF-8/Compose sq_AL.UTF-8 +en_US.UTF-8/Compose sr_ME.UTF-8 +en_US.UTF-8/Compose sr_RS.UTF-8 +en_US.UTF-8/Compose sr_YU.UTF-8 +en_US.UTF-8/Compose ss_ZA.UTF-8 +en_US.UTF-8/Compose st_ZA.UTF-8 +en_US.UTF-8/Compose sv_FI.UTF-8 +en_US.UTF-8/Compose sv_SE.UTF-8 +en_US.UTF-8/Compose ta_IN.UTF-8 +en_US.UTF-8/Compose te_IN.UTF-8 +en_US.UTF-8/Compose tg_TJ.UTF-8 +th_TH.UTF-8/Compose th_TH.UTF-8 +en_US.UTF-8/Compose ti_ER.UTF-8 +en_US.UTF-8/Compose ti_ET.UTF-8 +en_US.UTF-8/Compose tl_PH.UTF-8 +en_US.UTF-8/Compose tn_ZA.UTF-8 +en_US.UTF-8/Compose tr_TR.UTF-8 +en_US.UTF-8/Compose ts_ZA.UTF-8 +en_US.UTF-8/Compose tt_RU.UTF-8 +en_US.UTF-8/Compose uk_UA.UTF-8 +en_US.UTF-8/Compose ur_IN.UTF-8 +en_US.UTF-8/Compose ur_PK.UTF-8 +en_US.UTF-8/Compose uz_UZ.UTF-8 +en_US.UTF-8/Compose ve_ZA.UTF-8 +en_US.UTF-8/Compose vi_VN.UTF-8 +en_US.UTF-8/Compose wa_BE.UTF-8 +en_US.UTF-8/Compose xh_ZA.UTF-8 +en_US.UTF-8/Compose yi_US.UTF-8 +zh_CN.UTF-8/Compose zh_CN.UTF-8 +zh_HK.UTF-8/Compose zh_HK.UTF-8 +en_US.UTF-8/Compose zh_SG.UTF-8 +zh_TW.UTF-8/Compose zh_TW.UTF-8 +en_US.UTF-8/Compose zu_ZA.UTF-8 +# +# This file contains compose table file names. +# The first word is the compose table file name +# and the second word is the full locale name. +# +# +iso8859-1/Compose: C +iso8859-1/Compose: af_ZA.ISO8859-1 +iso8859-6/Compose: ar_AA.ISO8859-6 +iso8859-6/Compose: ar_AE.ISO8859-6 +iso8859-6/Compose: ar_BH.ISO8859-6 +iso8859-6/Compose: ar_DZ.ISO8859-6 +iso8859-6/Compose: ar_EG.ISO8859-6 +iso8859-6/Compose: ar_IQ.ISO8859-6 +iso8859-6/Compose: ar_JO.ISO8859-6 +iso8859-6/Compose: ar_KW.ISO8859-6 +iso8859-6/Compose: ar_LB.ISO8859-6 +iso8859-6/Compose: ar_LY.ISO8859-6 +iso8859-6/Compose: ar_MA.ISO8859-6 +iso8859-6/Compose: ar_OM.ISO8859-6 +iso8859-6/Compose: ar_QA.ISO8859-6 +iso8859-6/Compose: ar_SA.ISO8859-6 +iso8859-6/Compose: ar_SD.ISO8859-6 +iso8859-6/Compose: ar_SY.ISO8859-6 +iso8859-6/Compose: ar_TN.ISO8859-6 +iso8859-6/Compose: ar_YE.ISO8859-6 +iso8859-9e/Compose: az_AZ.ISO8859-9E +koi8-c/Compose: az_AZ.KOI8-C +microsoft-cp1251/Compose: be_BY.CP1251 +iso8859-5/Compose: be_BY.ISO8859-5 +iso8859-5/Compose: bg_BG.ISO8859-5 +microsoft-cp1251/Compose: bg_BG.CP1251 +koi8-r/Compose: bg_BG.KOI8-R +iso8859-1/Compose: br_FR.ISO8859-1 +iso8859-14/Compose: br_FR.ISO8859-14 +iso8859-15/Compose: br_FR.ISO8859-15 +iso8859-2/Compose: bs_BA.ISO8859-2 +iso8859-1/Compose: ca_AD.ISO8859-1 +iso8859-15/Compose: ca_AD.ISO8859-15 +iso8859-1/Compose: ca_ES.ISO8859-1 +iso8859-15/Compose: ca_ES.ISO8859-15 +iso8859-1/Compose: ca_FR.ISO8859-1 +iso8859-15/Compose: ca_FR.ISO8859-15 +iso8859-1/Compose: ca_IT.ISO8859-1 +iso8859-15/Compose: ca_IT.ISO8859-15 +iso8859-2/Compose: cs_CZ.ISO8859-2 +iso8859-1/Compose: cy_GB.ISO8859-1 +iso8859-14/Compose: cy_GB.ISO8859-14 +iso8859-15/Compose: cy_GB.ISO8859-15 +iso8859-1/Compose: da_DK.ISO8859-1 +iso8859-15/Compose: da_DK.ISO8859-15 +iso8859-1/Compose: de_AT.ISO8859-1 +iso8859-15/Compose: de_AT.ISO8859-15 +iso8859-1/Compose: de_BE.ISO8859-1 +iso8859-15/Compose: de_BE.ISO8859-15 +iso8859-1/Compose: de_CH.ISO8859-1 +iso8859-15/Compose: de_CH.ISO8859-15 +iso8859-1/Compose: de_DE.ISO8859-1 +iso8859-15/Compose: de_DE.ISO8859-15 +iso8859-1/Compose: de_LI.ISO8859-1 +iso8859-15/Compose: de_LI.ISO8859-15 +iso8859-1/Compose: de_LU.ISO8859-1 +iso8859-15/Compose: de_LU.ISO8859-15 +iso8859-4/Compose: ee_EE.ISO8859-4 +iso8859-7/Compose: el_GR.ISO8859-7 +iso8859-15/Compose: el_GR.ISO8859-15 +iso8859-1/Compose: en_AU.ISO8859-1 +iso8859-1/Compose: en_BE.ISO8859-1 +iso8859-15/Compose: en_BE.ISO8859-15 +iso8859-1/Compose: en_BW.ISO8859-1 +iso8859-1/Compose: en_BZ.ISO8859-1 +iso8859-1/Compose: en_CA.ISO8859-1 +iso8859-1/Compose: en_EN.ISO8859-1 +iso8859-1/Compose: en_GB.ISO8859-1 +iso8859-15/Compose: en_GB.ISO8859-15 +iso8859-1/Compose: en_HK.ISO8859-1 +iso8859-1/Compose: en_IE.ISO8859-1 +iso8859-15/Compose: en_IE.ISO8859-15 +iso8859-15/Compose: en_IN.ISO8859-15 +iso8859-1/Compose: en_JM.ISO8859-1 +iso8859-1/Compose: en_NZ.ISO8859-1 +iso8859-1/Compose: en_PH.ISO8859-1 +iso8859-1/Compose: en_SG.ISO8859-1 +iso8859-1/Compose: en_TT.ISO8859-1 +iso8859-1/Compose: en_UK.ISO8859-1 +iso8859-15/Compose: en_UK.ISO8859-15 +iso8859-1/Compose: en_US.ISO8859-1 +iso8859-15/Compose: en_US.ISO8859-15 +iso8859-1/Compose: en_ZA.ISO8859-1 +iso8859-15/Compose: en_ZA.ISO8859-15 +iso8859-1/Compose: en_ZW.ISO8859-1 +iso8859-3/Compose: eo_EO.ISO8859-3 +iso8859-3/Compose: eo_XX.ISO8859-3 +iso8859-1/Compose: es_AR.ISO8859-1 +iso8859-1/Compose: es_BO.ISO8859-1 +iso8859-1/Compose: es_CL.ISO8859-1 +iso8859-1/Compose: es_CO.ISO8859-1 +iso8859-1/Compose: es_CR.ISO8859-1 +iso8859-1/Compose: es_DO.ISO8859-1 +iso8859-1/Compose: es_EC.ISO8859-1 +iso8859-1/Compose: es_ES.ISO8859-1 +iso8859-15/Compose: es_ES.ISO8859-15 +iso8859-1/Compose: es_GT.ISO8859-1 +iso8859-1/Compose: es_HN.ISO8859-1 +iso8859-1/Compose: es_MX.ISO8859-1 +iso8859-1/Compose: es_NI.ISO8859-1 +iso8859-1/Compose: es_PA.ISO8859-1 +iso8859-15/Compose: es_PA.ISO8859-15 +iso8859-1/Compose: es_PE.ISO8859-1 +iso8859-15/Compose: es_PE.ISO8859-15 +iso8859-1/Compose: es_PR.ISO8859-1 +iso8859-1/Compose: es_PY.ISO8859-1 +iso8859-15/Compose: es_PY.ISO8859-15 +iso8859-1/Compose: es_SV.ISO8859-1 +iso8859-15/Compose: es_SV.ISO8859-15 +iso8859-1/Compose: es_US.ISO8859-1 +iso8859-1/Compose: es_UY.ISO8859-1 +iso8859-15/Compose: es_UY.ISO8859-15 +iso8859-1/Compose: es_VE.ISO8859-1 +iso8859-15/Compose: es_VE.ISO8859-15 +iso8859-1/Compose: et_EE.ISO8859-1 +iso8859-4/Compose: et_EE.ISO8859-4 +iso8859-13/Compose: et_EE.ISO8859-13 +iso8859-15/Compose: et_EE.ISO8859-15 +iso8859-1/Compose: eu_ES.ISO8859-1 +iso8859-15/Compose: eu_ES.ISO8859-15 +isiri-3342/Compose: fa_IR.ISIRI-3342 +iso8859-1/Compose: fi_FI.ISO8859-1 +iso8859-15/Compose: fi_FI.ISO8859-15 +iso8859-1/Compose: fo_FO.ISO8859-1 +iso8859-15/Compose: fo_FO.ISO8859-15 +iso8859-1/Compose: fr_BE.ISO8859-1 +iso8859-15/Compose: fr_BE.ISO8859-15 +iso8859-1/Compose: fr_CA.ISO8859-1 +iso8859-15/Compose: fr_CA.ISO8859-15 +iso8859-1/Compose: fr_CH.ISO8859-1 +iso8859-15/Compose: fr_CH.ISO8859-15 +iso8859-1/Compose: fr_FR.ISO8859-1 +iso8859-15/Compose: fr_FR.ISO8859-15 +iso8859-1/Compose: fr_LU.ISO8859-1 +iso8859-15/Compose: fr_LU.ISO8859-15 +iso8859-1/Compose: ga_IE.ISO8859-1 +iso8859-14/Compose: ga_IE.ISO8859-14 +iso8859-15/Compose: ga_IE.ISO8859-15 +iso8859-1/Compose: gd_GB.ISO8859-1 +iso8859-14/Compose: gd_GB.ISO8859-14 +iso8859-15/Compose: gd_GB.ISO8859-15 +iso8859-1/Compose: gl_ES.ISO8859-1 +iso8859-15/Compose: gl_ES.ISO8859-15 +iso8859-1/Compose: gv_GB.ISO8859-1 +iso8859-14/Compose: gv_GB.ISO8859-14 +iso8859-15/Compose: gv_GB.ISO8859-15 +iso8859-8/Compose: he_IL.ISO8859-8 +microsoft-cp1255/Compose: he_IL.CP1255 +iscii-dev/Compose: hi_IN.ISCII-DEV +iso8859-2/Compose: hr_HR.ISO8859-2 +iso8859-2/Compose: hu_HU.ISO8859-2 +armscii-8/Compose: hy_AM.ARMSCII-8 +iso8859-1/Compose: id_ID.ISO8859-1 +iso8859-15/Compose: id_ID.ISO8859-15 +iso8859-1/Compose: is_IS.ISO8859-1 +iso8859-15/Compose: is_IS.ISO8859-15 +iso8859-1/Compose: it_CH.ISO8859-1 +iso8859-15/Compose: it_CH.ISO8859-15 +iso8859-1/Compose: it_IT.ISO8859-1 +iso8859-15/Compose: it_IT.ISO8859-15 +ja/Compose: ja_JP.eucJP +ja.SJIS/Compose: ja_JP.SJIS +ja.JIS/Compose: ja_JP.JIS7 +georgian-academy/Compose: ka_GE.GEORGIAN-ACADEMY +georgian-ps/Compose: ka_GE.GEORGIAN-PS +iso8859-1/Compose: kl_GL.ISO8859-1 +iso8859-15/Compose: kl_GL.ISO8859-15 +iso8859-1/Compose: kw_GB.ISO8859-1 +iso8859-14/Compose: kw_GB.ISO8859-14 +iso8859-15/Compose: kw_GB.ISO8859-15 +ko/Compose: ko_KR.eucKR +ibm-cp1133/Compose: lo_LA.IBM-CP1133 +mulelao-1/Compose: lo_LA.MULELAO-1 +iso8859-4/Compose: lt_LT.ISO8859-4 +iso8859-13/Compose: lt_LT.ISO8859-13 +iso8859-4/Compose: lv_LV.ISO8859-4 +iso8859-13/Compose: lv_LV.ISO8859-13 +iso8859-13/Compose: mi_NZ.ISO8859-13 +iso8859-5/Compose: mk_MK.ISO8859-5 +microsoft-cp1251/Compose: mk_MK.CP1251 +iso8859-1/Compose: ms_MY.ISO8859-1 +iso8859-3/Compose: mt_MT.ISO8859-3 +iso8859-1/Compose: nl_BE.ISO8859-1 +iso8859-15/Compose: nl_BE.ISO8859-15 +iso8859-1/Compose: nl_NL.ISO8859-1 +iso8859-15/Compose: nl_NL.ISO8859-15 +iso8859-1/Compose: no_NO.ISO8859-1 +iso8859-15/Compose: no_NO.ISO8859-15 +iso8859-1/Compose: nb_NO.ISO8859-1 +iso8859-15/Compose: nb_NO.ISO8859-15 +iso8859-1/Compose: nn_NO.ISO8859-1 +iso8859-15/Compose: nn_NO.ISO8859-15 +iso8859-1/Compose: nr_ZA.ISO8859-1 +iso8859-15/Compose: nso_ZA.ISO8859-15 +iso8859-1/Compose: ny_NO.ISO8859-1 +iso8859-15/Compose: ny_NO.ISO8859-15 +iso8859-1/Compose: oc_FR.ISO8859-1 +iso8859-15/Compose: oc_FR.ISO8859-15 +iso8859-1/Compose: pd_DE.ISO8859-1 +iso8859-15/Compose: pd_DE.ISO8859-15 +iso8859-1/Compose: pd_US.ISO8859-1 +iso8859-15/Compose: pd_US.ISO8859-15 +iso8859-1/Compose: ph_PH.ISO8859-1 +iso8859-2/Compose: pl_PL.ISO8859-2 +iso8859-1/Compose: pp_AN.ISO8859-1 +iso8859-1/Compose: pt_BR.ISO8859-1 +iso8859-15/Compose: pt_BR.ISO8859-15 +iso8859-1/Compose: pt_PT.ISO8859-1 +iso8859-15/Compose: pt_PT.ISO8859-15 +iso8859-2/Compose: ro_RO.ISO8859-2 +koi8-r/Compose: ru_RU.KOI8-R +iso8859-5/Compose: ru_RU.ISO8859-5 +microsoft-cp1251/Compose: ru_RU.CP1251 +microsoft-cp1251/Compose: ru_UA.CP1251 +koi8-u/Compose: ru_UA.KOI8-U +iso8859-1/Compose: rw_RW.ISO8859-1 +iso8859-2/Compose: sh_YU.ISO8859-2 +iso8859-2/Compose: sk_SK.ISO8859-2 +iso8859-2/Compose: sl_SI.ISO8859-2 +iso8859-2/Compose: sq_AL.ISO8859-2 +iso8859-2/Compose: sr_YU.ISO8859-2 +microsoft-cp1251/Compose: sr_YU.CP1251 +iso8859-5/Compose: sr_YU.ISO8859-5 +iso8859-1/Compose: ss_ZA.ISO8859-1 +iso8859-1/Compose: st_ZA.ISO8859-1 +iso8859-1/Compose: sv_FI.ISO8859-1 +iso8859-15/Compose: sv_FI.ISO8859-15 +iso8859-1/Compose: sv_SE.ISO8859-1 +iso8859-15/Compose: sv_SE.ISO8859-15 +tscii-0/Compose: ta_IN.TSCII-0 +koi8-c/Compose: tg_TJ.KOI8-C +iso8859-1/Compose: tl_PH.ISO8859-1 +iso8859-11/Compose: th_TH.ISO8859-11 +th_TH/Compose: th_TH.TIS620 +iso8859-15/Compose: tn_ZA.ISO8859-15 +iso8859-9/Compose: tr_TR.ISO8859-9 +iso8859-1/Compose: ts_ZA.ISO8859-1 +tatar-cyr/Compose: tt_RU.TATAR-CYR +microsoft-cp1251/Compose: uk_UA.CP1251 +koi8-c/Compose: tt_RU.KOI8-C +koi8-u/Compose: uk_UA.KOI8-U +iso8859-5/Compose: uk_UA.ISO8859-5 +microsoft-cp1256/Compose: ur_PK.CP1256 +iso8859-1/Compose: uz_UZ.ISO8859-1 +vi_VN.viscii/Compose: vi_VN.VISCII +vi_VN.tcvn/Compose: vi_VN.TCVN +iso8859-1/Compose: wa_BE.ISO8859-1 +iso8859-15/Compose: wa_BE.ISO8859-15 +iso8859-1/Compose: xh_ZA.ISO8859-1 +microsoft-cp1255/Compose: yi_US.CP1255 +zh_CN/Compose: zh_CN.eucCN +zh_CN/Compose: zh_CN.gb2312 +zh_CN.gbk/Compose: zh_CN.gbk +zh_CN.gb18030/Compose: zh_CN.gb18030 +zh_HK.big5/Compose: zh_HK.big5 +zh_HK.big5hkscs/Compose: zh_HK.big5hkscs +zh_TW.big5/Compose: zh_TW.big5 +zh_TW/Compose: zh_TW.eucTW +iso8859-1/Compose: zu_ZA.ISO8859-1 +# +# +en_US.UTF-8/Compose: C.UTF-8 +en_US.UTF-8/Compose: af_ZA.UTF-8 +am_ET.UTF-8/Compose: am_ET.UTF-8 +en_US.UTF-8/Compose: ar_AA.UTF-8 +en_US.UTF-8/Compose: ar_AE.UTF-8 +en_US.UTF-8/Compose: ar_BH.UTF-8 +en_US.UTF-8/Compose: ar_DZ.UTF-8 +en_US.UTF-8/Compose: ar_EG.UTF-8 +en_US.UTF-8/Compose: ar_IN.UTF-8 +en_US.UTF-8/Compose: ar_IQ.UTF-8 +en_US.UTF-8/Compose: ar_JO.UTF-8 +en_US.UTF-8/Compose: ar_KW.UTF-8 +en_US.UTF-8/Compose: ar_LB.UTF-8 +en_US.UTF-8/Compose: ar_LY.UTF-8 +en_US.UTF-8/Compose: ar_MA.UTF-8 +en_US.UTF-8/Compose: ar_OM.UTF-8 +en_US.UTF-8/Compose: ar_QA.UTF-8 +en_US.UTF-8/Compose: ar_SA.UTF-8 +en_US.UTF-8/Compose: ar_SD.UTF-8 +en_US.UTF-8/Compose: ar_SY.UTF-8 +en_US.UTF-8/Compose: ar_TN.UTF-8 +en_US.UTF-8/Compose: ar_YE.UTF-8 +en_US.UTF-8/Compose: ast_ES.UTF-8 +en_US.UTF-8/Compose: as_IN.UTF-8 +en_US.UTF-8/Compose: az_AZ.UTF-8 +en_US.UTF-8/Compose: be_BY.UTF-8 +en_US.UTF-8/Compose: bg_BG.UTF-8 +en_US.UTF-8/Compose: bn_BD.UTF-8 +en_US.UTF-8/Compose: bn_IN.UTF-8 +en_US.UTF-8/Compose: bo_IN.UTF-8 +en_US.UTF-8/Compose: br_FR.UTF-8 +en_US.UTF-8/Compose: bs_BA.UTF-8 +en_US.UTF-8/Compose: ca_AD.UTF-8 +en_US.UTF-8/Compose: ca_ES.UTF-8 +en_US.UTF-8/Compose: ca_FR.UTF-8 +en_US.UTF-8/Compose: ca_IT.UTF-8 +cs_CZ.UTF-8/Compose: cs_CZ.UTF-8 +en_US.UTF-8/Compose: cy_GB.UTF-8 +en_US.UTF-8/Compose: da_DK.UTF-8 +en_US.UTF-8/Compose: de_AT.UTF-8 +en_US.UTF-8/Compose: de_BE.UTF-8 +en_US.UTF-8/Compose: de_CH.UTF-8 +en_US.UTF-8/Compose: de_DE.UTF-8 +en_US.UTF-8/Compose: de_IT.UTF-8 +en_US.UTF-8/Compose: de_LI.UTF-8 +en_US.UTF-8/Compose: de_LU.UTF-8 +el_GR.UTF-8/Compose: el_CY.UTF-8 +el_GR.UTF-8/Compose: el_GR.UTF-8 +en_US.UTF-8/Compose: en_AU.UTF-8 +en_US.UTF-8/Compose: en_BE.UTF-8 +en_US.UTF-8/Compose: en_BW.UTF-8 +en_US.UTF-8/Compose: en_BZ.UTF-8 +en_US.UTF-8/Compose: en_CA.UTF-8 +en_US.UTF-8/Compose: en_DK.UTF-8 +en_US.UTF-8/Compose: en_EN.UTF-8 +en_US.UTF-8/Compose: en_GB.UTF-8 +en_US.UTF-8/Compose: en_HK.UTF-8 +en_US.UTF-8/Compose: en_IE.UTF-8 +en_US.UTF-8/Compose: en_IN.UTF-8 +en_US.UTF-8/Compose: en_JM.UTF-8 +en_US.UTF-8/Compose: en_MT.UTF-8 +en_US.UTF-8/Compose: en_NZ.UTF-8 +en_US.UTF-8/Compose: en_PH.UTF-8 +en_US.UTF-8/Compose: en_SG.UTF-8 +en_US.UTF-8/Compose: en_TT.UTF-8 +en_US.UTF-8/Compose: en_UK.UTF-8 +en_US.UTF-8/Compose: en_US.UTF-8 +en_US.UTF-8/Compose: en_ZA.UTF-8 +en_US.UTF-8/Compose: en_ZW.UTF-8 +en_US.UTF-8/Compose: eo_EO.UTF-8 +en_US.UTF-8/Compose: eo_XX.UTF-8 +en_US.UTF-8/Compose: es_AR.UTF-8 +en_US.UTF-8/Compose: es_BO.UTF-8 +en_US.UTF-8/Compose: es_CL.UTF-8 +en_US.UTF-8/Compose: es_CO.UTF-8 +en_US.UTF-8/Compose: es_CR.UTF-8 +en_US.UTF-8/Compose: es_DO.UTF-8 +en_US.UTF-8/Compose: es_EC.UTF-8 +en_US.UTF-8/Compose: es_ES.UTF-8 +en_US.UTF-8/Compose: es_GT.UTF-8 +en_US.UTF-8/Compose: es_HN.UTF-8 +en_US.UTF-8/Compose: es_MX.UTF-8 +en_US.UTF-8/Compose: es_NI.UTF-8 +en_US.UTF-8/Compose: es_PA.UTF-8 +en_US.UTF-8/Compose: es_PE.UTF-8 +en_US.UTF-8/Compose: es_PR.UTF-8 +en_US.UTF-8/Compose: es_PY.UTF-8 +en_US.UTF-8/Compose: es_SV.UTF-8 +en_US.UTF-8/Compose: es_US.UTF-8 +en_US.UTF-8/Compose: es_UY.UTF-8 +en_US.UTF-8/Compose: es_VE.UTF-8 +en_US.UTF-8/Compose: et_EE.UTF-8 +en_US.UTF-8/Compose: eu_ES.UTF-8 +en_US.UTF-8/Compose: fa_IR.UTF-8 +fi_FI.UTF-8/Compose: fi_FI.UTF-8 +en_US.UTF-8/Compose: fo_FO.UTF-8 +en_US.UTF-8/Compose: fr_BE.UTF-8 +en_US.UTF-8/Compose: fr_CA.UTF-8 +en_US.UTF-8/Compose: fr_CH.UTF-8 +en_US.UTF-8/Compose: fr_FR.UTF-8 +en_US.UTF-8/Compose: fr_LU.UTF-8 +en_US.UTF-8/Compose: ga_IE.UTF-8 +en_US.UTF-8/Compose: gd_GB.UTF-8 +en_US.UTF-8/Compose: gl_ES.UTF-8 +en_US.UTF-8/Compose: gu_IN.UTF-8 +en_US.UTF-8/Compose: gv_GB.UTF-8 +en_US.UTF-8/Compose: he_IL.UTF-8 +en_US.UTF-8/Compose: hi_IN.UTF-8 +en_US.UTF-8/Compose: hne_IN.UTF-8 +en_US.UTF-8/Compose: hr_HR.UTF-8 +en_US.UTF-8/Compose: hu_HU.UTF-8 +en_US.UTF-8/Compose: hy_AM.UTF-8 +en_US.UTF-8/Compose: id_ID.UTF-8 +en_US.UTF-8/Compose: is_IS.UTF-8 +en_US.UTF-8/Compose: it_CH.UTF-8 +en_US.UTF-8/Compose: it_IT.UTF-8 +en_US.UTF-8/Compose: iu_CA.UTF-8 +ja_JP.UTF-8/Compose: ja_JP.UTF-8 +en_US.UTF-8/Compose: ka_GE.UTF-8 +en_US.UTF-8/Compose: kk_KZ.UTF-8 +en_US.UTF-8/Compose: kl_GL.UTF-8 +km_KH.UTF-8/Compose: km_KH.UTF-8 +en_US.UTF-8/Compose: kn_IN.UTF-8 +ko_KR.UTF-8/Compose: ko_KR.UTF-8 +en_US.UTF-8/Compose: ks_IN.UTF-8 +en_US.UTF-8/Compose: ks_IN.UTF-8@devanagari +en_US.UTF-8/Compose: ku_TR.UTF-8 +en_US.UTF-8/Compose: kw_GB.UTF-8 +en_US.UTF-8/Compose: ky_KG.UTF-8 +en_US.UTF-8/Compose: lo_LA.UTF-8 +en_US.UTF-8/Compose: lt_LT.UTF-8 +en_US.UTF-8/Compose: lv_LV.UTF-8 +en_US.UTF-8/Compose: mai_IN.UTF-8 +en_US.UTF-8/Compose: mi_NZ.UTF-8 +en_US.UTF-8/Compose: mk_MK.UTF-8 +en_US.UTF-8/Compose: ml_IN.UTF-8 +en_US.UTF-8/Compose: mr_IN.UTF-8 +en_US.UTF-8/Compose: ms_MY.UTF-8 +en_US.UTF-8/Compose: mt_MT.UTF-8 +en_US.UTF-8/Compose: ne_NP.UTF-8 +en_US.UTF-8/Compose: nl_BE.UTF-8 +en_US.UTF-8/Compose: nl_NL.UTF-8 +en_US.UTF-8/Compose: nn_NO.UTF-8 +en_US.UTF-8/Compose: no_NO.UTF-8 +en_US.UTF-8/Compose: nb_NO.UTF-8 +en_US.UTF-8/Compose: nr_ZA.UTF-8 +en_US.UTF-8/Compose: nso_ZA.UTF-8 +en_US.UTF-8/Compose: ny_NO.UTF-8 +en_US.UTF-8/Compose: oc_FR.UTF-8 +en_US.UTF-8/Compose: or_IN.UTF-8 +en_US.UTF-8/Compose: pa_IN.UTF-8 +en_US.UTF-8/Compose: pa_PK.UTF-8 +en_US.UTF-8/Compose: pd_DE.UTF-8 +en_US.UTF-8/Compose: pd_US.UTF-8 +en_US.UTF-8/Compose: ph_PH.UTF-8 +en_US.UTF-8/Compose: pl_PL.UTF-8 +en_US.UTF-8/Compose: pp_AN.UTF-8 +pt_BR.UTF-8/Compose: pt_BR.UTF-8 +pt_PT.UTF-8/Compose: pt_PT.UTF-8 +en_US.UTF-8/Compose: ro_RO.UTF-8 +ru_RU.UTF-8/Compose: ru_RU.UTF-8 +en_US.UTF-8/Compose: ru_UA.UTF-8 +en_US.UTF-8/Compose: rw_RW.UTF-8 +en_US.UTF-8/Compose: sa_IN.UTF-8 +en_US.UTF-8/Compose: sd_IN.UTF-8 +en_US.UTF-8/Compose: sd_IN.UTF-8@devanagari +en_US.UTF-8/Compose: se_NO.UTF-8 +en_US.UTF-8/Compose: sh_BA.UTF-8 +en_US.UTF-8/Compose: sh_YU.UTF-8 +en_US.UTF-8/Compose: si_LK.UTF-8 +en_US.UTF-8/Compose: sk_SK.UTF-8 +en_US.UTF-8/Compose: sl_SI.UTF-8 +en_US.UTF-8/Compose: sq_AL.UTF-8 +en_US.UTF-8/Compose: sr_ME.UTF-8 +en_US.UTF-8/Compose: sr_RS.UTF-8 +en_US.UTF-8/Compose: sr_YU.UTF-8 +en_US.UTF-8/Compose: ss_ZA.UTF-8 +en_US.UTF-8/Compose: st_ZA.UTF-8 +en_US.UTF-8/Compose: sv_FI.UTF-8 +en_US.UTF-8/Compose: sv_SE.UTF-8 +en_US.UTF-8/Compose: ta_IN.UTF-8 +en_US.UTF-8/Compose: te_IN.UTF-8 +en_US.UTF-8/Compose: tg_TJ.UTF-8 +th_TH.UTF-8/Compose: th_TH.UTF-8 +en_US.UTF-8/Compose: ti_ER.UTF-8 +en_US.UTF-8/Compose: ti_ET.UTF-8 +en_US.UTF-8/Compose: tl_PH.UTF-8 +en_US.UTF-8/Compose: tn_ZA.UTF-8 +en_US.UTF-8/Compose: tr_TR.UTF-8 +en_US.UTF-8/Compose: ts_ZA.UTF-8 +en_US.UTF-8/Compose: tt_RU.UTF-8 +en_US.UTF-8/Compose: uk_UA.UTF-8 +en_US.UTF-8/Compose: ur_IN.UTF-8 +en_US.UTF-8/Compose: ur_PK.UTF-8 +en_US.UTF-8/Compose: uz_UZ.UTF-8 +en_US.UTF-8/Compose: ve_ZA.UTF-8 +en_US.UTF-8/Compose: vi_VN.UTF-8 +en_US.UTF-8/Compose: wa_BE.UTF-8 +en_US.UTF-8/Compose: xh_ZA.UTF-8 +en_US.UTF-8/Compose: yi_US.UTF-8 +zh_CN.UTF-8/Compose: zh_CN.UTF-8 +zh_HK.UTF-8/Compose: zh_HK.UTF-8 +en_US.UTF-8/Compose: zh_SG.UTF-8 +zh_TW.UTF-8/Compose: zh_TW.UTF-8 +en_US.UTF-8/Compose: zu_ZA.UTF-8 diff --git a/test/data/locale/en_US.UTF-8/Compose b/test/data/locale/en_US.UTF-8/Compose new file mode 100644 index 0000000..6f2f17a --- /dev/null +++ b/test/data/locale/en_US.UTF-8/Compose @@ -0,0 +1,5973 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +# UTF-8 (Unicode) compose sequence +# David.Monniaux@ens.fr +# + +# Part 1 - Manual definitions + +# Spacing versions of dead accents + : "~" asciitilde # TILDE + : "~" asciitilde # TILDE + : "'" apostrophe # APOSTROPHE + : "´" acute # ACUTE ACCENT + : "´" acute # ACUTE ACCENT + : "`" grave # GRAVE ACCENT + : "`" grave # GRAVE ACCENT + : "^" asciicircum # CIRCUMFLEX ACCENT + : "^" asciicircum # CIRCUMFLEX ACCENT + : "°" degree # DEGREE SIGN + : "°" degree # DEGREE SIGN + : "¯" macron # MACRON + : "¯" macron # MACRON + : "¯" macron # MACRON + : "¯" macron # MACRON + : "¯" macron # MACRON + : "¯" macron # MACRON + : "˘" breve # BREVE + : "˘" breve # BREVE + : "˘" breve # BREVE + : "˘" breve # BREVE + : "˙" abovedot # DOT ABOVE + : "˙" abovedot # DOT ABOVE + : "¨" diaeresis # DIAERESIS + : "¨" diaeresis # DIAERESIS + : "\"" quotedbl # REVERSE SOLIDUS + : "˝" U2dd # DOUBLE ACUTE ACCENT + : "˝" U2dd # DOUBLE ACUTE ACCENT + : "ˇ" caron # CARON + : "ˇ" caron # CARON + : "ˇ" caron # CARON + : "ˇ" caron # CARON + : "¸" cedilla # CEDILLA + : "¸" cedilla # CEDILLA + : "˛" ogonek # OGONEK + : "˛" ogonek # OGONEK + : "ͺ" U37a # GREEK YPOGEGRAMMENI + : "ͺ" U37a # GREEK YPOGEGRAMMENI + : "­" U00ad # SOFT HYPHEN + + +# ASCII characters that may be difficult to access +# on some keyboards. + : "#" numbersign # NUMBER SIGN + : "'" apostrophe # APOSTROPHE + : "'" apostrophe # APOSTROPHE + : "@" at # COMMERCIAL AT + : "[" bracketleft # LEFT SQUARE BRACKET + : "\\" backslash # REVERSE SOLIDUS + : "\\" backslash # REVERSE SOLIDUS + : "\\" backslash # REVERSE SOLIDUS + : "]" bracketright # RIGHT SQUARE BRACKET + + : "^" asciicircum # CIRCUMFLEX ACCENT + : "^" asciicircum # CIRCUMFLEX ACCENT + : "^" asciicircum # CIRCUMFLEX ACCENT + : "^" asciicircum # CIRCUMFLEX ACCENT + + : "`" grave # GRAVE ACCENT + : "`" grave # GRAVE ACCENT + + : "¸" cedilla # CEDILLA + : "¸" cedilla # CEDILLA + : "¸" cedilla # CEDILLA + + : "{" braceleft # LEFT CURLY BRACKET + : "{" braceleft # LEFT CURLY BRACKET + + : "|" bar # VERTICAL LINE + : "|" bar # VERTICAL LINE + : "|" bar # VERTICAL LINE + : "|" bar # VERTICAL LINE + : "|" bar # VERTICAL LINE + : "|" bar # VERTICAL LINE + + : "}" braceright # RIGHT CURLY BRACKET + : "}" braceright # RIGHT CURLY BRACKET + + : "~" asciitilde # TILDE + : "~" asciitilde # TILDE + : "~" asciitilde # TILDE + : "~" asciitilde # TILDE + +# Spaces + : " " nobreakspace # NO-BREAK SPACE + : " " U2008 # PUNCTUATION SPACE + + : "©" copyright # COPYRIGHT SIGN + : "©" copyright # COPYRIGHT SIGN + : "©" copyright # COPYRIGHT SIGN + : "©" copyright # COPYRIGHT SIGN + : "©" copyright # COPYRIGHT SIGN + : "©" copyright # COPYRIGHT SIGN + + : "®" registered # REGISTERED SIGN + : "®" registered # REGISTERED SIGN + : "®" registered # REGISTERED SIGN + : "®" registered # REGISTERED SIGN + : "®" registered # REGISTERED SIGN + + : "›" U203a # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + : "‹" U2039 # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + : "…" ellipsis # HORIZONTAL ELLIPSIS + : "·" periodcentered # MIDDLE DOT + : "·" periodcentered # MIDDLE DOT + : "·" periodcentered # MIDDLE DOT + : "•" enfilledcircbullet # BULLET + : "¦" brokenbar # BROKEN BAR + : "¡" exclamdown # INVERTED EXCLAMATION MARK +

: "¶" paragraph # PILCROW SIGN +

: "¶" paragraph # PILCROW SIGN + : "±" plusminus # PLUS-MINUS SIGN + : "±" plusminus # PLUS-MINUS SIGN + : "¿" questiondown # INVERTED QUESTION MARK + : "đ" dstroke # LATIN SMALL LETTER D WITH STROKE + : "Đ" Dstroke # LATIN CAPITAL LETTER D WITH STROKE + : "ß" ssharp # LATIN SMALL LETTER SHARP S + : "ẞ" U1e9e # LATIN CAPITAL LETTER SHARP S + + : "œ" oe # LATIN SMALL LIGATURE OE + : "Œ" OE # LATIN CAPITAL LIGATURE OE + : "æ" ae # LATIN SMALL LETTER AE + : "Æ" AE # LATIN CAPITAL LETTER AE + : "ff" Ufb00 # LATIN SMALL LIGATURE FF + : "fi" Ufb01 # LATIN SMALL LIGATURE FI + : "fl" Ufb02 # LATIN SMALL LIGATURE FL + : "ffi" Ufb03 # LATIN SMALL LIGATURE FFI + : "ffl" Ufb04 # LATIN SMALL LIGATURE FFL + : "IJ" U0132 # LATIN CAPITAL LIGATURE IJ + : "IJ" U0132 # LATIN CAPITAL LIGATURE IJ + : "ij" U0133 # LATIN SMALL LIGATURE IJ + + : "°" degree # DEGREE SIGN + <0> : "°" degree # DEGREE SIGN + <0> : "°" degree # DEGREE SIGN + +# Quotation marks + : "«" guillemotleft # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + : "»" guillemotright # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + : "‘" U2018 # LEFT SINGLE QUOTATION MARK + : "‘" U2018 # LEFT SINGLE QUOTATION MARK + : "’" U2019 # RIGHT SINGLE QUOTATION MARK + : "’" U2019 # RIGHT SINGLE QUOTATION MARK + : "‚" U201a # SINGLE LOW-9 QUOTATION MARK + : "‚" U201a # SINGLE LOW-9 QUOTATION MARK + : "“" U201c # LEFT DOUBLE QUOTATION MARK + : "“" U201c # LEFT DOUBLE QUOTATION MARK + : "”" U201d # RIGHT DOUBLE QUOTATION MARK + : "”" U201d # RIGHT DOUBLE QUOTATION MARK + : "„" U201e # DOUBLE LOW-9 QUOTATION MARK + : "„" U201e # DOUBLE LOW-9 QUOTATION MARK + +# Per xxx + : "‰" U2030 # PER MILLE SIGN + +# Currencies + : "₠" U20a0 # EURO-CURRENCY SIGN + : "₡" U20a1 # COLON SIGN + : "₡" U20a1 # COLON SIGN + : "₢" U20a2 # CRUZEIRO SIGN + : "₣" U20a3 # FRENCH FRANC SIGN + : "₤" U20a4 # LIRA SIGN + : "₤" U20a4 # LIRA SIGN + : "₥" U20a5 # MILL SIGN + : "₥" U20a5 # MILL SIGN + : "₦" U20a6 # NAIRA SIGN + : "₦" U20a6 # NAIRA SIGN +

: "₧" U20a7 # PESETA SIGN + : "₨" U20a8 # RUPEE SIGN + : "₩" U20a9 # WON SIGN + : "₩" U20a9 # WON SIGN +# "₪" U20aa NEW SHEQEL SIGN + : "₫" U20ab # DONG SIGN + : "₫" U20ab # DONG SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN +# "₭" U20ad KIP SIGN +# "₮" U20ae TUGRIK SIGN +# "₯" U20af DRACHMA SIGN +# "₰" U20b0 GERMAN PENNY SIGN +# "₱" U20b1 PESO SIGN +# "₲" U20b2 GUARANI SIGN +# "₳" U20b3 AUSTRAL SIGN +# "₴" U20b4 HRYVNIA SIGN +# "₵" U20b5 CEDI SIGN + + + : "¢" cent # CENT SIGN + : "¢" cent # CENT SIGN + : "¢" cent # CENT SIGN + : "¢" cent # CENT SIGN + : "¢" cent # CENT SIGN + : "¢" cent # CENT SIGN + : "£" sterling # POUND SIGN + : "£" sterling # POUND SIGN + : "£" sterling # POUND SIGN + : "£" sterling # POUND SIGN + : "¥" yen # YEN SIGN + : "¥" yen # YEN SIGN + : "¥" yen # YEN SIGN + : "¥" yen # YEN SIGN + : "¥" yen # YEN SIGN + : "¥" yen # YEN SIGN + : "¥" yen # YEN SIGN + : "¥" yen # YEN SIGN + +# Long S + : "ſ" U017f # LATIN SMALL LETTER LONG S + : "ſ" U017f # LATIN SMALL LETTER LONG S + : "ẛ" U1e9b # LATIN SMALL LETTER LONG S WITH DOT ABOVE + : "ẛ" U1e9b # LATIN SMALL LETTER LONG S WITH DOT ABOVE + +# Dashes + : "–" U2013 # EN DASH + : "—" U2014 # EM DASH + +# Musical alterations + : "♩" U2669 # QUARTER NOTE + : "♪" U266a # EIGHTH NOTE + : "♫" U266b # BEAMED EIGHTH NOTES + : "♬" U266c # BEAMED SIXTEENTH NOTES + : "♭" U266d # MUSIC FLAT SIGN + : "♮" U266e # MUSIC NATURAL SIGN + : "♯" U266f # MUSIC SHARP SIGN + +# Other symbols + : "§" section # SECTION SIGN + : "§" section # SECTION SIGN + : "§" section # SECTION SIGN + : "§" section # SECTION SIGN + : "§" section # SECTION SIGN + : "§" section # SECTION SIGN + : "§" section # SECTION SIGN + + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + +

: "¶" paragraph # PILCROW SIGN + + : "№" numerosign # NUMERO SIGN + : "№" numerosign # NUMERO SIGN + : "№" numerosign # NUMERO SIGN + : "№" numerosign # NUMERO SIGN + + : "⸘" U2E18 # INVERTED INTERROBANG + : "‽" U203D # INTERROBANG + +

: "☭" U262D # HAMMER AND SICKLE + : "Ⓐ" U24B6 # CIRCLED LATIN CAPITAL LETTER A + <3> : "♥" U2665 # BLACK HEART SUIT + + : "☺" U263A # WHITE SMILING FACE + : "☹" U2639 # WHITE FROWNING FACE + +# Part 2 + +# Compose map for Korean Hangul(Choseongul) Conjoining Jamos automatically +# generated from UnicodeData-2.0.14.txt at +# ftp://ftp.unicode.org/Public/2.0-Update/UnicodeData-2.0.14.txt +# by Jungshik Shin 2002-10-17 +# There are some conflicts among sequences, but I left them alone. +# +# group 1: cluster jamos made of three basic jamos + + + : "ᄁ" U1101 # HANGUL CHOSEONG SSANGKIYEOK + : "ᄄ" U1104 # HANGUL CHOSEONG SSANGTIKEUT + : "ᄈ" U1108 # HANGUL CHOSEONG SSANGPIEUP + : "ᄊ" U110a # HANGUL CHOSEONG SSANGSIOS + : "ᄍ" U110d # HANGUL CHOSEONG SSANGCIEUC + : "ᄓ" U1113 # HANGUL CHOSEONG NIEUN-KIYEOK + : "ᄔ" U1114 # HANGUL CHOSEONG SSANGNIEUN + : "ᄕ" U1115 # HANGUL CHOSEONG NIEUN-TIKEUT + : "ᄖ" U1116 # HANGUL CHOSEONG NIEUN-PIEUP + : "ᄗ" U1117 # HANGUL CHOSEONG TIKEUT-KIYEOK + : "ᄘ" U1118 # HANGUL CHOSEONG RIEUL-NIEUN + : "ᄙ" U1119 # HANGUL CHOSEONG SSANGRIEUL + : "ᄚ" U111a # HANGUL CHOSEONG RIEUL-HIEUH + : "ᄛ" U111b # HANGUL CHOSEONG KAPYEOUNRIEUL + : "ᄜ" U111c # HANGUL CHOSEONG MIEUM-PIEUP + : "ᄝ" U111d # HANGUL CHOSEONG KAPYEOUNMIEUM + : "ᄞ" U111e # HANGUL CHOSEONG PIEUP-KIYEOK + : "ᄟ" U111f # HANGUL CHOSEONG PIEUP-NIEUN + : "ᄠ" U1120 # HANGUL CHOSEONG PIEUP-TIKEUT + : "ᄡ" U1121 # HANGUL CHOSEONG PIEUP-SIOS + : "ᄧ" U1127 # HANGUL CHOSEONG PIEUP-CIEUC + : "ᄨ" U1128 # HANGUL CHOSEONG PIEUP-CHIEUCH + : "ᄩ" U1129 # HANGUL CHOSEONG PIEUP-THIEUTH + : "ᄪ" U112a # HANGUL CHOSEONG PIEUP-PHIEUPH + : "ᄫ" U112b # HANGUL CHOSEONG KAPYEOUNPIEUP + : "ᄭ" U112d # HANGUL CHOSEONG SIOS-KIYEOK + : "ᄮ" U112e # HANGUL CHOSEONG SIOS-NIEUN + : "ᄯ" U112f # HANGUL CHOSEONG SIOS-TIKEUT + : "ᄰ" U1130 # HANGUL CHOSEONG SIOS-RIEUL + : "ᄱ" U1131 # HANGUL CHOSEONG SIOS-MIEUM + : "ᄲ" U1132 # HANGUL CHOSEONG SIOS-PIEUP + : "ᄵ" U1135 # HANGUL CHOSEONG SIOS-IEUNG + : "ᄶ" U1136 # HANGUL CHOSEONG SIOS-CIEUC + : "ᄷ" U1137 # HANGUL CHOSEONG SIOS-CHIEUCH + : "ᄸ" U1138 # HANGUL CHOSEONG SIOS-KHIEUKH + : "ᄹ" U1139 # HANGUL CHOSEONG SIOS-THIEUTH + : "ᄺ" U113a # HANGUL CHOSEONG SIOS-PHIEUPH + : "ᄻ" U113b # HANGUL CHOSEONG SIOS-HIEUH + : "ᄽ" U113d # HANGUL CHOSEONG CHITUEUMSSANGSIOS + : "ᄿ" U113f # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS + : "ᅁ" U1141 # HANGUL CHOSEONG IEUNG-KIYEOK + : "ᅂ" U1142 # HANGUL CHOSEONG IEUNG-TIKEUT + : "ᅃ" U1143 # HANGUL CHOSEONG IEUNG-MIEUM + : "ᅄ" U1144 # HANGUL CHOSEONG IEUNG-PIEUP + : "ᅅ" U1145 # HANGUL CHOSEONG IEUNG-SIOS + : "ᅆ" U1146 # HANGUL CHOSEONG IEUNG-PANSIOS + : "ᅇ" U1147 # HANGUL CHOSEONG SSANGIEUNG + : "ᅈ" U1148 # HANGUL CHOSEONG IEUNG-CIEUC + : "ᅉ" U1149 # HANGUL CHOSEONG IEUNG-CHIEUCH + : "ᅊ" U114a # HANGUL CHOSEONG IEUNG-THIEUTH + : "ᅋ" U114b # HANGUL CHOSEONG IEUNG-PHIEUPH + : "ᅍ" U114d # HANGUL CHOSEONG CIEUC-IEUNG + : "ᅏ" U114f # HANGUL CHOSEONG CHITUEUMSSANGCIEUC + : "ᅑ" U1151 # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC + : "ᅒ" U1152 # HANGUL CHOSEONG CHIEUCH-KHIEUKH + : "ᅓ" U1153 # HANGUL CHOSEONG CHIEUCH-HIEUH + : "ᅖ" U1156 # HANGUL CHOSEONG PHIEUPH-PIEUP + : "ᅗ" U1157 # HANGUL CHOSEONG KAPYEOUNPHIEUPH + : "ᅘ" U1158 # HANGUL CHOSEONG SSANGHIEUH + : "ᅢ" U1162 # HANGUL JUNGSEONG AE + : "ᅤ" U1164 # HANGUL JUNGSEONG YAE + : "ᅦ" U1166 # HANGUL JUNGSEONG E + : "ᅨ" U1168 # HANGUL JUNGSEONG YE + : "ᅪ" U116a # HANGUL JUNGSEONG WA + : "ᅬ" U116c # HANGUL JUNGSEONG OE + : "ᅯ" U116f # HANGUL JUNGSEONG WEO + : "ᅱ" U1171 # HANGUL JUNGSEONG WI + : "ᅴ" U1174 # HANGUL JUNGSEONG YI + : "ᅶ" U1176 # HANGUL JUNGSEONG A-O + : "ᅷ" U1177 # HANGUL JUNGSEONG A-U + : "ᅸ" U1178 # HANGUL JUNGSEONG YA-O + : "ᅹ" U1179 # HANGUL JUNGSEONG YA-YO + : "ᅺ" U117a # HANGUL JUNGSEONG EO-O + : "ᅻ" U117b # HANGUL JUNGSEONG EO-U + : "ᅼ" U117c # HANGUL JUNGSEONG EO-EU + : "ᅽ" U117d # HANGUL JUNGSEONG YEO-O + : "ᅾ" U117e # HANGUL JUNGSEONG YEO-U + : "ᅿ" U117f # HANGUL JUNGSEONG O-EO + : "ᆀ" U1180 # HANGUL JUNGSEONG O-E + : "ᆁ" U1181 # HANGUL JUNGSEONG O-YE + : "ᆂ" U1182 # HANGUL JUNGSEONG O-O + : "ᆃ" U1183 # HANGUL JUNGSEONG O-U + : "ᆄ" U1184 # HANGUL JUNGSEONG YO-YA + : "ᆅ" U1185 # HANGUL JUNGSEONG YO-YAE + : "ᆆ" U1186 # HANGUL JUNGSEONG YO-YEO + : "ᆇ" U1187 # HANGUL JUNGSEONG YO-O + : "ᆈ" U1188 # HANGUL JUNGSEONG YO-I + : "ᆉ" U1189 # HANGUL JUNGSEONG U-A + : "ᆊ" U118a # HANGUL JUNGSEONG U-AE + : "ᆌ" U118c # HANGUL JUNGSEONG U-YE + : "ᆍ" U118d # HANGUL JUNGSEONG U-U + : "ᆎ" U118e # HANGUL JUNGSEONG YU-A + : "ᆏ" U118f # HANGUL JUNGSEONG YU-EO + : "ᆐ" U1190 # HANGUL JUNGSEONG YU-E + : "ᆑ" U1191 # HANGUL JUNGSEONG YU-YEO + : "ᆒ" U1192 # HANGUL JUNGSEONG YU-YE + : "ᆓ" U1193 # HANGUL JUNGSEONG YU-U + : "ᆔ" U1194 # HANGUL JUNGSEONG YU-I + : "ᆕ" U1195 # HANGUL JUNGSEONG EU-U + : "ᆖ" U1196 # HANGUL JUNGSEONG EU-EU + : "ᆗ" U1197 # HANGUL JUNGSEONG YI-U + : "ᆘ" U1198 # HANGUL JUNGSEONG I-A + : "ᆙ" U1199 # HANGUL JUNGSEONG I-YA + : "ᆚ" U119a # HANGUL JUNGSEONG I-O + : "ᆛ" U119b # HANGUL JUNGSEONG I-U + : "ᆜ" U119c # HANGUL JUNGSEONG I-EU + : "ᆝ" U119d # HANGUL JUNGSEONG I-ARAEA + : "ᆟ" U119f # HANGUL JUNGSEONG ARAEA-EO + : "ᆠ" U11a0 # HANGUL JUNGSEONG ARAEA-U + : "ᆡ" U11a1 # HANGUL JUNGSEONG ARAEA-I + : "ᆢ" U11a2 # HANGUL JUNGSEONG SSANGARAEA + : "ᆩ" U11a9 # HANGUL JONGSEONG SSANGKIYEOK + : "ᆪ" U11aa # HANGUL JONGSEONG KIYEOK-SIOS + : "ᆬ" U11ac # HANGUL JONGSEONG NIEUN-CIEUC + : "ᆭ" U11ad # HANGUL JONGSEONG NIEUN-HIEUH + : "ᆰ" U11b0 # HANGUL JONGSEONG RIEUL-KIYEOK + : "ᆱ" U11b1 # HANGUL JONGSEONG RIEUL-MIEUM + : "ᆲ" U11b2 # HANGUL JONGSEONG RIEUL-PIEUP + : "ᆳ" U11b3 # HANGUL JONGSEONG RIEUL-SIOS + : "ᆴ" U11b4 # HANGUL JONGSEONG RIEUL-THIEUTH + : "ᆵ" U11b5 # HANGUL JONGSEONG RIEUL-PHIEUPH + : "ᆶ" U11b6 # HANGUL JONGSEONG RIEUL-HIEUH + : "ᆹ" U11b9 # HANGUL JONGSEONG PIEUP-SIOS + : "ᆻ" U11bb # HANGUL JONGSEONG SSANGSIOS + : "ᇃ" U11c3 # HANGUL JONGSEONG KIYEOK-RIEUL + : "ᇅ" U11c5 # HANGUL JONGSEONG NIEUN-KIYEOK + : "ᇆ" U11c6 # HANGUL JONGSEONG NIEUN-TIKEUT + : "ᇇ" U11c7 # HANGUL JONGSEONG NIEUN-SIOS + : "ᇈ" U11c8 # HANGUL JONGSEONG NIEUN-PANSIOS + : "ᇉ" U11c9 # HANGUL JONGSEONG NIEUN-THIEUTH + : "ᇊ" U11ca # HANGUL JONGSEONG TIKEUT-KIYEOK + : "ᇋ" U11cb # HANGUL JONGSEONG TIKEUT-RIEUL + : "ᇍ" U11cd # HANGUL JONGSEONG RIEUL-NIEUN + : "ᇎ" U11ce # HANGUL JONGSEONG RIEUL-TIKEUT + : "ᇐ" U11d0 # HANGUL JONGSEONG SSANGRIEUL + : "ᇗ" U11d7 # HANGUL JONGSEONG RIEUL-PANSIOS + : "ᇘ" U11d8 # HANGUL JONGSEONG RIEUL-KHIEUKH + : "ᇙ" U11d9 # HANGUL JONGSEONG RIEUL-YEORINHIEUH + : "ᇚ" U11da # HANGUL JONGSEONG MIEUM-KIYEOK + : "ᇛ" U11db # HANGUL JONGSEONG MIEUM-RIEUL + : "ᇜ" U11dc # HANGUL JONGSEONG MIEUM-PIEUP + : "ᇝ" U11dd # HANGUL JONGSEONG MIEUM-SIOS + : "ᇟ" U11df # HANGUL JONGSEONG MIEUM-PANSIOS + : "ᇠ" U11e0 # HANGUL JONGSEONG MIEUM-CHIEUCH + : "ᇡ" U11e1 # HANGUL JONGSEONG MIEUM-HIEUH + : "ᇢ" U11e2 # HANGUL JONGSEONG KAPYEOUNMIEUM + : "ᇣ" U11e3 # HANGUL JONGSEONG PIEUP-RIEUL + : "ᇤ" U11e4 # HANGUL JONGSEONG PIEUP-PHIEUPH + : "ᇥ" U11e5 # HANGUL JONGSEONG PIEUP-HIEUH + : "ᇦ" U11e6 # HANGUL JONGSEONG KAPYEOUNPIEUP + : "ᇧ" U11e7 # HANGUL JONGSEONG SIOS-KIYEOK + : "ᇨ" U11e8 # HANGUL JONGSEONG SIOS-TIKEUT + : "ᇩ" U11e9 # HANGUL JONGSEONG SIOS-RIEUL + : "ᇪ" U11ea # HANGUL JONGSEONG SIOS-PIEUP + : "ᇬ" U11ec # HANGUL JONGSEONG IEUNG-KIYEOK + : "ᇮ" U11ee # HANGUL JONGSEONG SSANGIEUNG + : "ᇯ" U11ef # HANGUL JONGSEONG IEUNG-KHIEUKH + : "ᇱ" U11f1 # HANGUL JONGSEONG YESIEUNG-SIOS + : "ᇲ" U11f2 # HANGUL JONGSEONG YESIEUNG-PANSIOS + : "ᇳ" U11f3 # HANGUL JONGSEONG PHIEUPH-PIEUP + : "ᇴ" U11f4 # HANGUL JONGSEONG KAPYEOUNPHIEUPH + : "ᇵ" U11f5 # HANGUL JONGSEONG HIEUH-NIEUN + : "ᇶ" U11f6 # HANGUL JONGSEONG HIEUH-RIEUL + : "ᇷ" U11f7 # HANGUL JONGSEONG HIEUH-MIEUM + : "ᇸ" U11f8 # HANGUL JONGSEONG HIEUH-PIEUP + : "ᄢ" U1122 # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK + : "ᄣ" U1123 # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT + : "ᄤ" U1124 # HANGUL CHOSEONG PIEUP-SIOS-PIEUP + : "ᄥ" U1125 # HANGUL CHOSEONG PIEUP-SSANGSIOS + : "ᄦ" U1126 # HANGUL CHOSEONG PIEUP-SIOS-CIEUC + : "ᄬ" U112c # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP + : "ᄳ" U1133 # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK + : "ᄴ" U1134 # HANGUL CHOSEONG SIOS-SSANGSIOS + : "ᅫ" U116b # HANGUL JUNGSEONG WAE + : "ᅰ" U1170 # HANGUL JUNGSEONG WE + : "ᆋ" U118b # HANGUL JUNGSEONG U-EO-EU + : "ᇄ" U11c4 # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK + : "ᇌ" U11cc # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS + : "ᇏ" U11cf # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH + : "ᇑ" U11d1 # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK + : "ᇒ" U11d2 # HANGUL JONGSEONG RIEUL-MIEUM-SIOS + : "ᇓ" U11d3 # HANGUL JONGSEONG RIEUL-PIEUP-SIOS + : "ᇔ" U11d4 # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH + : "ᇕ" U11d5 # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP + : "ᇖ" U11d6 # HANGUL JONGSEONG RIEUL-SSANGSIOS + : "ᇞ" U11de # HANGUL JONGSEONG MIEUM-SSANGSIOS + : "ᇭ" U11ed # HANGUL JONGSEONG IEUNG-SSANGKIYEOK + : "ᄢ" U1122 # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK + : "ᄣ" U1123 # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT + : "ᄤ" U1124 # HANGUL CHOSEONG PIEUP-SIOS-PIEUP + : "ᄥ" U1125 # HANGUL CHOSEONG PIEUP-SSANGSIOS + : "ᄦ" U1126 # HANGUL CHOSEONG PIEUP-SIOS-CIEUC + : "ᄬ" U112c # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP + : "ᄳ" U1133 # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK + : "ᄴ" U1134 # HANGUL CHOSEONG SIOS-SSANGSIOS + : "ᅫ" U116b # HANGUL JUNGSEONG WAE + : "ᅰ" U1170 # HANGUL JUNGSEONG WE + : "ᆋ" U118b # HANGUL JUNGSEONG U-EO-EU + : "ᇄ" U11c4 # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK + : "ᇌ" U11cc # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS + : "ᇑ" U11d1 # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK + : "ᇒ" U11d2 # HANGUL JONGSEONG RIEUL-MIEUM-SIOS + : "ᇓ" U11d3 # HANGUL JONGSEONG RIEUL-PIEUP-SIOS + : "ᇔ" U11d4 # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH + : "ᇕ" U11d5 # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP + : "ᇖ" U11d6 # HANGUL JONGSEONG RIEUL-SSANGSIOS + : "ᇞ" U11de # HANGUL JONGSEONG MIEUM-SSANGSIOS + : "ᇭ" U11ed # HANGUL JONGSEONG IEUNG-SSANGKIYEOK + +# Part 3 + : "¬" notsign # NOT SIGN + : "¬" notsign # NOT SIGN + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + <2> : "²" twosuperior # SUPERSCRIPT TWO + <2> : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + <2> : "²" twosuperior # SUPERSCRIPT TWO + <3> : "³" threesuperior # SUPERSCRIPT THREE + <3> : "³" threesuperior # SUPERSCRIPT THREE + : "³" threesuperior # SUPERSCRIPT THREE + : "³" threesuperior # SUPERSCRIPT THREE + <3> : "³" threesuperior # SUPERSCRIPT THREE + : "µ" mu # MICRO SIGN + : "µ" mu # MICRO SIGN + : "µ" mu # MICRO SIGN + <1> : "¹" onesuperior # SUPERSCRIPT ONE + <1> : "¹" onesuperior # SUPERSCRIPT ONE + : "¹" onesuperior # SUPERSCRIPT ONE + : "¹" onesuperior # SUPERSCRIPT ONE + <1> : "¹" onesuperior # SUPERSCRIPT ONE + : "º" masculine # MASCULINE ORDINAL INDICATOR + : "º" masculine # MASCULINE ORDINAL INDICATOR + : "º" masculine # MASCULINE ORDINAL INDICATOR + : "º" masculine # MASCULINE ORDINAL INDICATOR + <1> <4> : "¼" onequarter # VULGAR FRACTION ONE QUARTER + <1> <2> : "½" onehalf # VULGAR FRACTION ONE HALF + <3> <4> : "¾" threequarters # VULGAR FRACTION THREE QUARTERS + : "À" Agrave # LATIN CAPITAL LETTER A WITH GRAVE + : "À" Agrave # LATIN CAPITAL LETTER A WITH GRAVE + : "À" Agrave # LATIN CAPITAL LETTER A WITH GRAVE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : "Ã" Atilde # LATIN CAPITAL LETTER A WITH TILDE + : "Ã" Atilde # LATIN CAPITAL LETTER A WITH TILDE + : "Ã" Atilde # LATIN CAPITAL LETTER A WITH TILDE + : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS + : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS + : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS + : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS + : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS + : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE + : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE + : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE + : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE + : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE + : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA + : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA + : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA + : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA + : "È" Egrave # LATIN CAPITAL LETTER E WITH GRAVE + : "È" Egrave # LATIN CAPITAL LETTER E WITH GRAVE + : "È" Egrave # LATIN CAPITAL LETTER E WITH GRAVE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS + : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS + : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS + : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS + : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS + : "Ì" Igrave # LATIN CAPITAL LETTER I WITH GRAVE + : "Ì" Igrave # LATIN CAPITAL LETTER I WITH GRAVE + : "Ì" Igrave # LATIN CAPITAL LETTER I WITH GRAVE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS + : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS + : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS + : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS + : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS + : "J́" # LATIN CAPITAL LETTER J U004A with COMBINING ACUTE ACCENT U0301 + : "J́" # LATIN CAPITAL LETTER J U004A with COMBINING ACUTE ACCENT U0301 + : "J́" # LATIN CAPITAL LETTER J U004A with COMBINING ACUTE ACCENT U0301 + : "J́" # LATIN CAPITAL LETTER J U004A with COMBINING ACUTE ACCENT U0301 + : "J́" # LATIN CAPITAL LETTER J U004A with COMBINING ACUTE ACCENT U0301 + : "Ð" ETH # LATIN CAPITAL LETTER ETH + : "Ñ" Ntilde # LATIN CAPITAL LETTER N WITH TILDE + : "Ñ" Ntilde # LATIN CAPITAL LETTER N WITH TILDE + : "Ñ" Ntilde # LATIN CAPITAL LETTER N WITH TILDE + : "Ò" Ograve # LATIN CAPITAL LETTER O WITH GRAVE + : "Ò" Ograve # LATIN CAPITAL LETTER O WITH GRAVE + : "Ò" Ograve # LATIN CAPITAL LETTER O WITH GRAVE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + : "Õ" Otilde # LATIN CAPITAL LETTER O WITH TILDE + : "Õ" Otilde # LATIN CAPITAL LETTER O WITH TILDE + : "Õ" Otilde # LATIN CAPITAL LETTER O WITH TILDE + : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS + : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS + : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS + : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS + : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS + : "×" multiply # MULTIPLICATION SIGN + : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE + : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE + : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE + : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE + : "Ù" Ugrave # LATIN CAPITAL LETTER U WITH GRAVE + : "Ù" Ugrave # LATIN CAPITAL LETTER U WITH GRAVE + : "Ù" Ugrave # LATIN CAPITAL LETTER U WITH GRAVE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS + : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS + : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS + : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS + : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Þ" THORN # LATIN CAPITAL LETTER THORN + : "à" agrave # LATIN SMALL LETTER A WITH GRAVE + : "à" agrave # LATIN SMALL LETTER A WITH GRAVE + : "à" agrave # LATIN SMALL LETTER A WITH GRAVE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX + : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX + : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX + : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX + : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX + : "ã" atilde # LATIN SMALL LETTER A WITH TILDE + : "ã" atilde # LATIN SMALL LETTER A WITH TILDE + : "ã" atilde # LATIN SMALL LETTER A WITH TILDE + : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS + : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS + : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS + : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS + : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS + : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE + : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE + : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE + : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE + : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE + : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA + : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA + : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA + : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA + : "è" egrave # LATIN SMALL LETTER E WITH GRAVE + : "è" egrave # LATIN SMALL LETTER E WITH GRAVE + : "è" egrave # LATIN SMALL LETTER E WITH GRAVE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX + : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX + : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX + : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX + : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX + : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS + : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS + : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS + : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS + : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS + : "ì" igrave # LATIN SMALL LETTER I WITH GRAVE + : "ì" igrave # LATIN SMALL LETTER I WITH GRAVE + : "ì" igrave # LATIN SMALL LETTER I WITH GRAVE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX + : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX + : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX + : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX + : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX + : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS + : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS + : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS + : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS + : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS + : "j́" # LATIN SMALL LETTER J U006A with COMBINING ACUTE ACCENT U0301 + : "j́" # LATIN SMALL LETTER J U006A with COMBINING ACUTE ACCENT U0301 + : "j́" # LATIN SMALL LETTER J U006A with COMBINING ACUTE ACCENT U0301 + : "j́" # LATIN SMALL LETTER J U006A with COMBINING ACUTE ACCENT U0301 + : "j́" # LATIN SMALL LETTER J U006A with COMBINING ACUTE ACCENT U0301 + : "ð" eth # LATIN SMALL LETTER ETH + : "ñ" ntilde # LATIN SMALL LETTER N WITH TILDE + : "ñ" ntilde # LATIN SMALL LETTER N WITH TILDE + : "ñ" ntilde # LATIN SMALL LETTER N WITH TILDE + : "ò" ograve # LATIN SMALL LETTER O WITH GRAVE + : "ò" ograve # LATIN SMALL LETTER O WITH GRAVE + : "ò" ograve # LATIN SMALL LETTER O WITH GRAVE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX + : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX + : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX + : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX + : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX + : "õ" otilde # LATIN SMALL LETTER O WITH TILDE + : "õ" otilde # LATIN SMALL LETTER O WITH TILDE + : "õ" otilde # LATIN SMALL LETTER O WITH TILDE + : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS + : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS + : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS + : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS + : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS + : "÷" division # DIVISION SIGN + : "÷" division # DIVISION SIGN + : "ø" oslash # LATIN SMALL LETTER O WITH STROKE + : "ø" oslash # LATIN SMALL LETTER O WITH STROKE + : "ø" oslash # LATIN SMALL LETTER O WITH STROKE + : "ø" oslash # LATIN SMALL LETTER O WITH STROKE + : "ù" ugrave # LATIN SMALL LETTER U WITH GRAVE + : "ù" ugrave # LATIN SMALL LETTER U WITH GRAVE + : "ù" ugrave # LATIN SMALL LETTER U WITH GRAVE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX + : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX + : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX + : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX + : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX + : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS + : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS + : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS + : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS + : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "þ" thorn # LATIN SMALL LETTER THORN + : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS + : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS + : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS + : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS + : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS + : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON + : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON + : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON + : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON + : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON + : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON + : "ā" U0101 # LATIN SMALL LETTER A WITH MACRON + : "ā" U0101 # LATIN SMALL LETTER A WITH MACRON + : "ā" U0101 # LATIN SMALL LETTER A WITH MACRON + : "ā" U0101 # LATIN SMALL LETTER A WITH MACRON + : "ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON + : "ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON + : "Ă" U0102 # LATIN CAPITAL LETTER A WITH BREVE + : "Ă" U0102 # LATIN CAPITAL LETTER A WITH BREVE + : "Ă" U0102 # LATIN CAPITAL LETTER A WITH BREVE + : "Ă" U0102 # LATIN CAPITAL LETTER A WITH BREVE + : "ă" U0103 # LATIN SMALL LETTER A WITH BREVE + : "ă" U0103 # LATIN SMALL LETTER A WITH BREVE + : "ă" U0103 # LATIN SMALL LETTER A WITH BREVE + : "ă" U0103 # LATIN SMALL LETTER A WITH BREVE + : "Ą" U0104 # LATIN CAPITAL LETTER A WITH OGONEK + : "Ą" U0104 # LATIN CAPITAL LETTER A WITH OGONEK + : "Ą" U0104 # LATIN CAPITAL LETTER A WITH OGONEK + : "Ą" U0104 # LATIN CAPITAL LETTER A WITH OGONEK + : "ą" U0105 # LATIN SMALL LETTER A WITH OGONEK + : "ą" U0105 # LATIN SMALL LETTER A WITH OGONEK + : "ą" U0105 # LATIN SMALL LETTER A WITH OGONEK + : "ą" U0105 # LATIN SMALL LETTER A WITH OGONEK + : "Ć" U0106 # LATIN CAPITAL LETTER C WITH ACUTE + : "Ć" U0106 # LATIN CAPITAL LETTER C WITH ACUTE + : "Ć" U0106 # LATIN CAPITAL LETTER C WITH ACUTE + : "Ć" U0106 # LATIN CAPITAL LETTER C WITH ACUTE + : "ć" U0107 # LATIN SMALL LETTER C WITH ACUTE + : "ć" U0107 # LATIN SMALL LETTER C WITH ACUTE + : "ć" U0107 # LATIN SMALL LETTER C WITH ACUTE + : "ć" U0107 # LATIN SMALL LETTER C WITH ACUTE + : "Ĉ" U0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX + : "Ĉ" U0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX + : "ĉ" U0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX + : "ĉ" U0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX + : "Ċ" U010A # LATIN CAPITAL LETTER C WITH DOT ABOVE + : "Ċ" U010A # LATIN CAPITAL LETTER C WITH DOT ABOVE + : "Ċ" U010A # LATIN CAPITAL LETTER C WITH DOT ABOVE + : "ċ" U010B # LATIN SMALL LETTER C WITH DOT ABOVE + : "ċ" U010B # LATIN SMALL LETTER C WITH DOT ABOVE + : "ċ" U010B # LATIN SMALL LETTER C WITH DOT ABOVE + : "Č" U010C # LATIN CAPITAL LETTER C WITH CARON + : "Č" U010C # LATIN CAPITAL LETTER C WITH CARON + : "Č" U010C # LATIN CAPITAL LETTER C WITH CARON + : "Č" U010C # LATIN CAPITAL LETTER C WITH CARON + : "č" U010D # LATIN SMALL LETTER C WITH CARON + : "č" U010D # LATIN SMALL LETTER C WITH CARON + : "č" U010D # LATIN SMALL LETTER C WITH CARON + : "č" U010D # LATIN SMALL LETTER C WITH CARON + : "Ď" U010E # LATIN CAPITAL LETTER D WITH CARON + : "Ď" U010E # LATIN CAPITAL LETTER D WITH CARON + : "Ď" U010E # LATIN CAPITAL LETTER D WITH CARON + : "Ď" U010E # LATIN CAPITAL LETTER D WITH CARON + : "ď" U010F # LATIN SMALL LETTER D WITH CARON + : "ď" U010F # LATIN SMALL LETTER D WITH CARON + : "ď" U010F # LATIN SMALL LETTER D WITH CARON + : "ď" U010F # LATIN SMALL LETTER D WITH CARON + : "Đ" Dstroke # LATIN CAPITAL LETTER D WITH STROKE + : "Đ" Dstroke # LATIN CAPITAL LETTER D WITH STROKE + : "Đ" Dstroke # LATIN CAPITAL LETTER D WITH STROKE + : "Đ" Dstroke # LATIN CAPITAL LETTER D WITH STROKE + : "đ" dstroke # LATIN SMALL LETTER D WITH STROKE + : "đ" dstroke # LATIN SMALL LETTER D WITH STROKE + : "đ" dstroke # LATIN SMALL LETTER D WITH STROKE + : "đ" dstroke # LATIN SMALL LETTER D WITH STROKE + : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON + : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON + : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON + : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON + : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON + : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON + : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON + : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON + : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON + : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON + : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON + : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON + : "Ĕ" U0114 # LATIN CAPITAL LETTER E WITH BREVE + : "Ĕ" U0114 # LATIN CAPITAL LETTER E WITH BREVE + : "Ĕ" U0114 # LATIN CAPITAL LETTER E WITH BREVE + : "ĕ" U0115 # LATIN SMALL LETTER E WITH BREVE + : "ĕ" U0115 # LATIN SMALL LETTER E WITH BREVE + : "ĕ" U0115 # LATIN SMALL LETTER E WITH BREVE + : "Ė" U0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE + : "Ė" U0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE + : "Ė" U0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE + : "ė" U0117 # LATIN SMALL LETTER E WITH DOT ABOVE + : "ė" U0117 # LATIN SMALL LETTER E WITH DOT ABOVE + : "ė" U0117 # LATIN SMALL LETTER E WITH DOT ABOVE + : "Ę" U0118 # LATIN CAPITAL LETTER E WITH OGONEK + : "Ę" U0118 # LATIN CAPITAL LETTER E WITH OGONEK + : "Ę" U0118 # LATIN CAPITAL LETTER E WITH OGONEK + : "Ę" U0118 # LATIN CAPITAL LETTER E WITH OGONEK + : "ę" U0119 # LATIN SMALL LETTER E WITH OGONEK + : "ę" U0119 # LATIN SMALL LETTER E WITH OGONEK + : "ę" U0119 # LATIN SMALL LETTER E WITH OGONEK + : "ę" U0119 # LATIN SMALL LETTER E WITH OGONEK + : "Ě" U011A # LATIN CAPITAL LETTER E WITH CARON + : "Ě" U011A # LATIN CAPITAL LETTER E WITH CARON + : "Ě" U011A # LATIN CAPITAL LETTER E WITH CARON + : "Ě" U011A # LATIN CAPITAL LETTER E WITH CARON + : "ě" U011B # LATIN SMALL LETTER E WITH CARON + : "ě" U011B # LATIN SMALL LETTER E WITH CARON + : "ě" U011B # LATIN SMALL LETTER E WITH CARON + : "ě" U011B # LATIN SMALL LETTER E WITH CARON + : "Ĝ" U011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX + : "Ĝ" U011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX + : "ĝ" U011D # LATIN SMALL LETTER G WITH CIRCUMFLEX + : "ĝ" U011D # LATIN SMALL LETTER G WITH CIRCUMFLEX + : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE + : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE + : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE + : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE + : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE + : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE + : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE + : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE + : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE + : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE + : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE + : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE + : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE + : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE + : "Ġ" U0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE + : "Ġ" U0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE + : "Ġ" U0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE + : "ġ" U0121 # LATIN SMALL LETTER G WITH DOT ABOVE + : "ġ" U0121 # LATIN SMALL LETTER G WITH DOT ABOVE + : "ġ" U0121 # LATIN SMALL LETTER G WITH DOT ABOVE + : "Ģ" U0122 # LATIN CAPITAL LETTER G WITH CEDILLA + : "Ģ" U0122 # LATIN CAPITAL LETTER G WITH CEDILLA + : "Ģ" U0122 # LATIN CAPITAL LETTER G WITH CEDILLA + : "Ģ" U0122 # LATIN CAPITAL LETTER G WITH CEDILLA + : "ģ" U0123 # LATIN SMALL LETTER G WITH CEDILLA + : "ģ" U0123 # LATIN SMALL LETTER G WITH CEDILLA + : "ģ" U0123 # LATIN SMALL LETTER G WITH CEDILLA + : "ģ" U0123 # LATIN SMALL LETTER G WITH CEDILLA + : "Ĥ" U0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX + : "Ĥ" U0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX + : "ĥ" U0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX + : "ĥ" U0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX + : "Ħ" U0126 # LATIN CAPITAL LETTER H WITH STROKE + : "Ħ" U0126 # LATIN CAPITAL LETTER H WITH STROKE + : "Ħ" U0126 # LATIN CAPITAL LETTER H WITH STROKE + : "ħ" U0127 # LATIN SMALL LETTER H WITH STROKE + : "ħ" U0127 # LATIN SMALL LETTER H WITH STROKE + : "ħ" U0127 # LATIN SMALL LETTER H WITH STROKE + : "Ĩ" U0128 # LATIN CAPITAL LETTER I WITH TILDE + : "Ĩ" U0128 # LATIN CAPITAL LETTER I WITH TILDE + : "Ĩ" U0128 # LATIN CAPITAL LETTER I WITH TILDE + : "ĩ" U0129 # LATIN SMALL LETTER I WITH TILDE + : "ĩ" U0129 # LATIN SMALL LETTER I WITH TILDE + : "ĩ" U0129 # LATIN SMALL LETTER I WITH TILDE + : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON + : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON + : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON + : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON + : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON + : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON + : "ī" U012B # LATIN SMALL LETTER I WITH MACRON + : "ī" U012B # LATIN SMALL LETTER I WITH MACRON + : "ī" U012B # LATIN SMALL LETTER I WITH MACRON + : "ī" U012B # LATIN SMALL LETTER I WITH MACRON + : "ī" U012B # LATIN SMALL LETTER I WITH MACRON + : "ī" U012B # LATIN SMALL LETTER I WITH MACRON + : "Ĭ" U012C # LATIN CAPITAL LETTER I WITH BREVE + : "Ĭ" U012C # LATIN CAPITAL LETTER I WITH BREVE + : "Ĭ" U012C # LATIN CAPITAL LETTER I WITH BREVE + : "ĭ" U012D # LATIN SMALL LETTER I WITH BREVE + : "ĭ" U012D # LATIN SMALL LETTER I WITH BREVE + : "ĭ" U012D # LATIN SMALL LETTER I WITH BREVE + : "Į" U012E # LATIN CAPITAL LETTER I WITH OGONEK + : "Į" U012E # LATIN CAPITAL LETTER I WITH OGONEK + : "Į" U012E # LATIN CAPITAL LETTER I WITH OGONEK + : "Į" U012E # LATIN CAPITAL LETTER I WITH OGONEK + : "į" U012F # LATIN SMALL LETTER I WITH OGONEK + : "į" U012F # LATIN SMALL LETTER I WITH OGONEK + : "į" U012F # LATIN SMALL LETTER I WITH OGONEK + : "į" U012F # LATIN SMALL LETTER I WITH OGONEK + : "į" U012F # LATIN SMALL LETTER I WITH OGONEK + : "İ" U0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE + : "İ" U0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE + : "İ" U0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE + : "ı" U0131 # LATIN SMALL LETTER DOTLESS I + : "ı" U0131 # LATIN SMALL LETTER DOTLESS I + : "ı" U0131 # LATIN SMALL LETTER DOTLESS I + : "Ĵ" U0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX + : "Ĵ" U0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX + : "ĵ" U0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX + : "ĵ" U0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX + : "Ķ" U0136 # LATIN CAPITAL LETTER K WITH CEDILLA + : "Ķ" U0136 # LATIN CAPITAL LETTER K WITH CEDILLA + : "Ķ" U0136 # LATIN CAPITAL LETTER K WITH CEDILLA + : "Ķ" U0136 # LATIN CAPITAL LETTER K WITH CEDILLA + : "ķ" U0137 # LATIN SMALL LETTER K WITH CEDILLA + : "ķ" U0137 # LATIN SMALL LETTER K WITH CEDILLA + : "ķ" U0137 # LATIN SMALL LETTER K WITH CEDILLA + : "ķ" U0137 # LATIN SMALL LETTER K WITH CEDILLA + : "ĸ" U0138 # LATIN SMALL LETTER KRA + : "Ĺ" U0139 # LATIN CAPITAL LETTER L WITH ACUTE + : "Ĺ" U0139 # LATIN CAPITAL LETTER L WITH ACUTE + : "Ĺ" U0139 # LATIN CAPITAL LETTER L WITH ACUTE + : "Ĺ" U0139 # LATIN CAPITAL LETTER L WITH ACUTE + : "ĺ" U013A # LATIN SMALL LETTER L WITH ACUTE + : "ĺ" U013A # LATIN SMALL LETTER L WITH ACUTE + : "ĺ" U013A # LATIN SMALL LETTER L WITH ACUTE + : "ĺ" U013A # LATIN SMALL LETTER L WITH ACUTE + : "Ļ" U013B # LATIN CAPITAL LETTER L WITH CEDILLA + : "Ļ" U013B # LATIN CAPITAL LETTER L WITH CEDILLA + : "Ļ" U013B # LATIN CAPITAL LETTER L WITH CEDILLA + : "Ļ" U013B # LATIN CAPITAL LETTER L WITH CEDILLA + : "ļ" U013C # LATIN SMALL LETTER L WITH CEDILLA + : "ļ" U013C # LATIN SMALL LETTER L WITH CEDILLA + : "ļ" U013C # LATIN SMALL LETTER L WITH CEDILLA + : "ļ" U013C # LATIN SMALL LETTER L WITH CEDILLA + : "Ľ" U013D # LATIN CAPITAL LETTER L WITH CARON + : "Ľ" U013D # LATIN CAPITAL LETTER L WITH CARON + : "Ľ" U013D # LATIN CAPITAL LETTER L WITH CARON + : "Ľ" U013D # LATIN CAPITAL LETTER L WITH CARON + : "ľ" U013E # LATIN SMALL LETTER L WITH CARON + : "ľ" U013E # LATIN SMALL LETTER L WITH CARON + : "ľ" U013E # LATIN SMALL LETTER L WITH CARON + : "ľ" U013E # LATIN SMALL LETTER L WITH CARON + : "Ł" U0141 # LATIN CAPITAL LETTER L WITH STROKE + : "Ł" U0141 # LATIN CAPITAL LETTER L WITH STROKE + : "Ł" U0141 # LATIN CAPITAL LETTER L WITH STROKE + : "Ł" U0141 # LATIN CAPITAL LETTER L WITH STROKE + : "ł" U0142 # LATIN SMALL LETTER L WITH STROKE + : "ł" U0142 # LATIN SMALL LETTER L WITH STROKE + : "ł" U0142 # LATIN SMALL LETTER L WITH STROKE + : "ł" U0142 # LATIN SMALL LETTER L WITH STROKE + : "Ń" U0143 # LATIN CAPITAL LETTER N WITH ACUTE + : "Ń" U0143 # LATIN CAPITAL LETTER N WITH ACUTE + : "Ń" U0143 # LATIN CAPITAL LETTER N WITH ACUTE + : "Ń" U0143 # LATIN CAPITAL LETTER N WITH ACUTE + : "ń" U0144 # LATIN SMALL LETTER N WITH ACUTE + : "ń" U0144 # LATIN SMALL LETTER N WITH ACUTE + : "ń" U0144 # LATIN SMALL LETTER N WITH ACUTE + : "ń" U0144 # LATIN SMALL LETTER N WITH ACUTE + : "Ņ" U0145 # LATIN CAPITAL LETTER N WITH CEDILLA + : "Ņ" U0145 # LATIN CAPITAL LETTER N WITH CEDILLA + : "Ņ" U0145 # LATIN CAPITAL LETTER N WITH CEDILLA + : "Ņ" U0145 # LATIN CAPITAL LETTER N WITH CEDILLA + : "ņ" U0146 # LATIN SMALL LETTER N WITH CEDILLA + : "ņ" U0146 # LATIN SMALL LETTER N WITH CEDILLA + : "ņ" U0146 # LATIN SMALL LETTER N WITH CEDILLA + : "ņ" U0146 # LATIN SMALL LETTER N WITH CEDILLA + : "Ň" U0147 # LATIN CAPITAL LETTER N WITH CARON + : "Ň" U0147 # LATIN CAPITAL LETTER N WITH CARON + : "Ň" U0147 # LATIN CAPITAL LETTER N WITH CARON + : "Ň" U0147 # LATIN CAPITAL LETTER N WITH CARON + : "ň" U0148 # LATIN SMALL LETTER N WITH CARON + : "ň" U0148 # LATIN SMALL LETTER N WITH CARON + : "ň" U0148 # LATIN SMALL LETTER N WITH CARON + : "ň" U0148 # LATIN SMALL LETTER N WITH CARON + : "Ŋ" U014A # LATIN CAPITAL LETTER ENG + : "ŋ" U014B # LATIN SMALL LETTER ENG + : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON + : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON + : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON + : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON + : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON + : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON + : "ō" U014D # LATIN SMALL LETTER O WITH MACRON + : "ō" U014D # LATIN SMALL LETTER O WITH MACRON + : "ō" U014D # LATIN SMALL LETTER O WITH MACRON + : "ō" U014D # LATIN SMALL LETTER O WITH MACRON + : "ō" U014D # LATIN SMALL LETTER O WITH MACRON + : "ō" U014D # LATIN SMALL LETTER O WITH MACRON + : "Ŏ" U014E # LATIN CAPITAL LETTER O WITH BREVE + : "Ŏ" U014E # LATIN CAPITAL LETTER O WITH BREVE + : "Ŏ" U014E # LATIN CAPITAL LETTER O WITH BREVE + : "ŏ" U014F # LATIN SMALL LETTER O WITH BREVE + : "ŏ" U014F # LATIN SMALL LETTER O WITH BREVE + : "ŏ" U014F # LATIN SMALL LETTER O WITH BREVE + : "Ő" U0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + : "Ő" U0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + : "ő" U0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE + : "ő" U0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE + : "Ŕ" U0154 # LATIN CAPITAL LETTER R WITH ACUTE + : "Ŕ" U0154 # LATIN CAPITAL LETTER R WITH ACUTE + : "Ŕ" U0154 # LATIN CAPITAL LETTER R WITH ACUTE + : "Ŕ" U0154 # LATIN CAPITAL LETTER R WITH ACUTE + : "ŕ" U0155 # LATIN SMALL LETTER R WITH ACUTE + : "ŕ" U0155 # LATIN SMALL LETTER R WITH ACUTE + : "ŕ" U0155 # LATIN SMALL LETTER R WITH ACUTE + : "ŕ" U0155 # LATIN SMALL LETTER R WITH ACUTE + : "Ŗ" U0156 # LATIN CAPITAL LETTER R WITH CEDILLA + : "Ŗ" U0156 # LATIN CAPITAL LETTER R WITH CEDILLA + : "Ŗ" U0156 # LATIN CAPITAL LETTER R WITH CEDILLA + : "Ŗ" U0156 # LATIN CAPITAL LETTER R WITH CEDILLA + : "ŗ" U0157 # LATIN SMALL LETTER R WITH CEDILLA + : "ŗ" U0157 # LATIN SMALL LETTER R WITH CEDILLA + : "ŗ" U0157 # LATIN SMALL LETTER R WITH CEDILLA + : "ŗ" U0157 # LATIN SMALL LETTER R WITH CEDILLA + : "Ř" U0158 # LATIN CAPITAL LETTER R WITH CARON + : "Ř" U0158 # LATIN CAPITAL LETTER R WITH CARON + : "Ř" U0158 # LATIN CAPITAL LETTER R WITH CARON + : "Ř" U0158 # LATIN CAPITAL LETTER R WITH CARON + : "ř" U0159 # LATIN SMALL LETTER R WITH CARON + : "ř" U0159 # LATIN SMALL LETTER R WITH CARON + : "ř" U0159 # LATIN SMALL LETTER R WITH CARON + : "ř" U0159 # LATIN SMALL LETTER R WITH CARON + : "Ś" U015A # LATIN CAPITAL LETTER S WITH ACUTE + : "Ś" U015A # LATIN CAPITAL LETTER S WITH ACUTE + : "Ś" U015A # LATIN CAPITAL LETTER S WITH ACUTE + : "Ś" U015A # LATIN CAPITAL LETTER S WITH ACUTE + : "ś" U015B # LATIN SMALL LETTER S WITH ACUTE + : "ś" U015B # LATIN SMALL LETTER S WITH ACUTE + : "ś" U015B # LATIN SMALL LETTER S WITH ACUTE + : "ś" U015B # LATIN SMALL LETTER S WITH ACUTE + : "Ŝ" U015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX + : "Ŝ" U015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX + : "ŝ" U015D # LATIN SMALL LETTER S WITH CIRCUMFLEX + : "ŝ" U015D # LATIN SMALL LETTER S WITH CIRCUMFLEX + : "Ş" U015E # LATIN CAPITAL LETTER S WITH CEDILLA + : "Ş" U015E # LATIN CAPITAL LETTER S WITH CEDILLA + : "Ş" U015E # LATIN CAPITAL LETTER S WITH CEDILLA + : "Ş" U015E # LATIN CAPITAL LETTER S WITH CEDILLA + : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA + : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA + : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA + : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA + : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA + : "Š" U0160 # LATIN CAPITAL LETTER S WITH CARON + : "Š" U0160 # LATIN CAPITAL LETTER S WITH CARON + : "Š" U0160 # LATIN CAPITAL LETTER S WITH CARON + : "Š" U0160 # LATIN CAPITAL LETTER S WITH CARON + : "š" U0161 # LATIN SMALL LETTER S WITH CARON + : "š" U0161 # LATIN SMALL LETTER S WITH CARON + : "š" U0161 # LATIN SMALL LETTER S WITH CARON + : "š" U0161 # LATIN SMALL LETTER S WITH CARON + : "Ţ" U0162 # LATIN CAPITAL LETTER T WITH CEDILLA + : "Ţ" U0162 # LATIN CAPITAL LETTER T WITH CEDILLA + : "Ţ" U0162 # LATIN CAPITAL LETTER T WITH CEDILLA + : "Ţ" U0162 # LATIN CAPITAL LETTER T WITH CEDILLA + : "ţ" U0163 # LATIN SMALL LETTER T WITH CEDILLA + : "ţ" U0163 # LATIN SMALL LETTER T WITH CEDILLA + : "ţ" U0163 # LATIN SMALL LETTER T WITH CEDILLA + : "ţ" U0163 # LATIN SMALL LETTER T WITH CEDILLA + : "Ť" U0164 # LATIN CAPITAL LETTER T WITH CARON + : "Ť" U0164 # LATIN CAPITAL LETTER T WITH CARON + : "Ť" U0164 # LATIN CAPITAL LETTER T WITH CARON + : "Ť" U0164 # LATIN CAPITAL LETTER T WITH CARON + : "ť" U0165 # LATIN SMALL LETTER T WITH CARON + : "ť" U0165 # LATIN SMALL LETTER T WITH CARON + : "ť" U0165 # LATIN SMALL LETTER T WITH CARON + : "ť" U0165 # LATIN SMALL LETTER T WITH CARON + : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE + : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE + : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE + : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE + : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE + : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE + : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE + : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE + : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE + : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE + : "Ũ" U0168 # LATIN CAPITAL LETTER U WITH TILDE + : "Ũ" U0168 # LATIN CAPITAL LETTER U WITH TILDE + : "Ũ" U0168 # LATIN CAPITAL LETTER U WITH TILDE + : "ũ" U0169 # LATIN SMALL LETTER U WITH TILDE + : "ũ" U0169 # LATIN SMALL LETTER U WITH TILDE + : "ũ" U0169 # LATIN SMALL LETTER U WITH TILDE + : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON + : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON + : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON + : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON + : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON + : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON + : "ū" U016B # LATIN SMALL LETTER U WITH MACRON + : "ū" U016B # LATIN SMALL LETTER U WITH MACRON + : "ū" U016B # LATIN SMALL LETTER U WITH MACRON + : "ū" U016B # LATIN SMALL LETTER U WITH MACRON + : "ū" U016B # LATIN SMALL LETTER U WITH MACRON + : "ū" U016B # LATIN SMALL LETTER U WITH MACRON + : "Ŭ" U016C # LATIN CAPITAL LETTER U WITH BREVE + : "Ŭ" U016C # LATIN CAPITAL LETTER U WITH BREVE + : "Ŭ" U016C # LATIN CAPITAL LETTER U WITH BREVE + : "ŭ" U016D # LATIN SMALL LETTER U WITH BREVE + : "ŭ" U016D # LATIN SMALL LETTER U WITH BREVE + : "ŭ" U016D # LATIN SMALL LETTER U WITH BREVE + : "ŭ" U016D # LATIN SMALL LETTER U WITH BREVE + : "Ů" U016E # LATIN CAPITAL LETTER U WITH RING ABOVE + : "Ů" U016E # LATIN CAPITAL LETTER U WITH RING ABOVE + : "Ů" U016E # LATIN CAPITAL LETTER U WITH RING ABOVE + : "Ů" U016E # LATIN CAPITAL LETTER U WITH RING ABOVE + : "ů" U016F # LATIN SMALL LETTER U WITH RING ABOVE + : "ů" U016F # LATIN SMALL LETTER U WITH RING ABOVE + : "ů" U016F # LATIN SMALL LETTER U WITH RING ABOVE + : "ů" U016F # LATIN SMALL LETTER U WITH RING ABOVE + : "Ű" U0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + : "Ű" U0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + : "ű" U0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE + : "ű" U0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE + : "Ų" U0172 # LATIN CAPITAL LETTER U WITH OGONEK + : "Ų" U0172 # LATIN CAPITAL LETTER U WITH OGONEK + : "Ų" U0172 # LATIN CAPITAL LETTER U WITH OGONEK + : "Ų" U0172 # LATIN CAPITAL LETTER U WITH OGONEK + : "ų" U0173 # LATIN SMALL LETTER U WITH OGONEK + : "ų" U0173 # LATIN SMALL LETTER U WITH OGONEK + : "ų" U0173 # LATIN SMALL LETTER U WITH OGONEK + : "ų" U0173 # LATIN SMALL LETTER U WITH OGONEK + : "Ŵ" U0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX + : "Ŵ" U0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX + : "Ŵ" U0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX + : "ŵ" U0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX + : "ŵ" U0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX + : "ŵ" U0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX + : "Ŷ" U0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + : "Ŷ" U0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + : "Ŷ" U0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + : "ŷ" U0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX + : "ŷ" U0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX + : "ŷ" U0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX + : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS + : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS + : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS + : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS + : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS + : "Ź" U0179 # LATIN CAPITAL LETTER Z WITH ACUTE + : "Ź" U0179 # LATIN CAPITAL LETTER Z WITH ACUTE + : "Ź" U0179 # LATIN CAPITAL LETTER Z WITH ACUTE + : "Ź" U0179 # LATIN CAPITAL LETTER Z WITH ACUTE + : "ź" U017A # LATIN SMALL LETTER Z WITH ACUTE + : "ź" U017A # LATIN SMALL LETTER Z WITH ACUTE + : "ź" U017A # LATIN SMALL LETTER Z WITH ACUTE + : "ź" U017A # LATIN SMALL LETTER Z WITH ACUTE + : "Ż" U017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE + : "Ż" U017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE + : "Ż" U017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE + : "ż" U017C # LATIN SMALL LETTER Z WITH DOT ABOVE + : "ż" U017C # LATIN SMALL LETTER Z WITH DOT ABOVE + : "ż" U017C # LATIN SMALL LETTER Z WITH DOT ABOVE + : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON + : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON + : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON + : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON + : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON + : "ž" U017E # LATIN SMALL LETTER Z WITH CARON + : "ž" U017E # LATIN SMALL LETTER Z WITH CARON + : "ž" U017E # LATIN SMALL LETTER Z WITH CARON + : "ž" U017E # LATIN SMALL LETTER Z WITH CARON + : "ž" U017E # LATIN SMALL LETTER Z WITH CARON + : "ƀ" U0180 # LATIN SMALL LETTER B WITH STROKE + : "ƀ" U0180 # LATIN SMALL LETTER B WITH STROKE + : "ƀ" U0180 # LATIN SMALL LETTER B WITH STROKE + : "Ɨ" U0197 # LATIN CAPITAL LETTER I WITH STROKE + : "Ɨ" U0197 # LATIN CAPITAL LETTER I WITH STROKE + : "Ɨ" U0197 # LATIN CAPITAL LETTER I WITH STROKE + : "Ơ" U01A0 # LATIN CAPITAL LETTER O WITH HORN + : "Ơ" U01A0 # LATIN CAPITAL LETTER O WITH HORN + : "ơ" U01A1 # LATIN SMALL LETTER O WITH HORN + : "ơ" U01A1 # LATIN SMALL LETTER O WITH HORN + : "Ư" U01AF # LATIN CAPITAL LETTER U WITH HORN + : "Ư" U01AF # LATIN CAPITAL LETTER U WITH HORN + : "ư" U01B0 # LATIN SMALL LETTER U WITH HORN + : "ư" U01B0 # LATIN SMALL LETTER U WITH HORN + : "Ƶ" U01B5 # LATIN CAPITAL LETTER Z WITH STROKE + : "Ƶ" U01B5 # LATIN CAPITAL LETTER Z WITH STROKE + : "Ƶ" U01B5 # LATIN CAPITAL LETTER Z WITH STROKE + : "ƶ" U01B6 # LATIN SMALL LETTER Z WITH STROKE + : "ƶ" U01B6 # LATIN SMALL LETTER Z WITH STROKE + : "ƶ" U01B6 # LATIN SMALL LETTER Z WITH STROKE + : "Ǎ" U01CD # LATIN CAPITAL LETTER A WITH CARON + : "Ǎ" U01CD # LATIN CAPITAL LETTER A WITH CARON + : "ǎ" U01CE # LATIN SMALL LETTER A WITH CARON + : "ǎ" U01CE # LATIN SMALL LETTER A WITH CARON + : "Ǐ" U01CF # LATIN CAPITAL LETTER I WITH CARON + : "Ǐ" U01CF # LATIN CAPITAL LETTER I WITH CARON + : "ǐ" U01D0 # LATIN SMALL LETTER I WITH CARON + : "ǐ" U01D0 # LATIN SMALL LETTER I WITH CARON + : "Ǒ" U01D1 # LATIN CAPITAL LETTER O WITH CARON + : "Ǒ" U01D1 # LATIN CAPITAL LETTER O WITH CARON + : "ǒ" U01D2 # LATIN SMALL LETTER O WITH CARON + : "ǒ" U01D2 # LATIN SMALL LETTER O WITH CARON + : "Ǔ" U01D3 # LATIN CAPITAL LETTER U WITH CARON + : "Ǔ" U01D3 # LATIN CAPITAL LETTER U WITH CARON + : "ǔ" U01D4 # LATIN SMALL LETTER U WITH CARON + : "ǔ" U01D4 # LATIN SMALL LETTER U WITH CARON + : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON + : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON + : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON + : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON + : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON + : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON + : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + : "Ǣ" U01E2 # LATIN CAPITAL LETTER AE WITH MACRON + : "Ǣ" U01E2 # LATIN CAPITAL LETTER AE WITH MACRON + : "Ǣ" U01E2 # LATIN CAPITAL LETTER AE WITH MACRON + : "ǣ" U01E3 # LATIN SMALL LETTER AE WITH MACRON + : "ǣ" U01E3 # LATIN SMALL LETTER AE WITH MACRON + : "ǣ" U01E3 # LATIN SMALL LETTER AE WITH MACRON + : "Ǥ" U01E4 # LATIN CAPITAL LETTER G WITH STROKE + : "Ǥ" U01E4 # LATIN CAPITAL LETTER G WITH STROKE + : "Ǥ" U01E4 # LATIN CAPITAL LETTER G WITH STROKE + : "ǥ" U01E5 # LATIN SMALL LETTER G WITH STROKE + : "ǥ" U01E5 # LATIN SMALL LETTER G WITH STROKE + : "ǥ" U01E5 # LATIN SMALL LETTER G WITH STROKE + : "Ǧ" U01E6 # LATIN CAPITAL LETTER G WITH CARON + : "Ǧ" U01E6 # LATIN CAPITAL LETTER G WITH CARON + : "ǧ" U01E7 # LATIN SMALL LETTER G WITH CARON + : "ǧ" U01E7 # LATIN SMALL LETTER G WITH CARON + : "Ǩ" U01E8 # LATIN CAPITAL LETTER K WITH CARON + : "Ǩ" U01E8 # LATIN CAPITAL LETTER K WITH CARON + : "ǩ" U01E9 # LATIN SMALL LETTER K WITH CARON + : "ǩ" U01E9 # LATIN SMALL LETTER K WITH CARON + : "Ǫ" U01EA # LATIN CAPITAL LETTER O WITH OGONEK + : "Ǫ" U01EA # LATIN CAPITAL LETTER O WITH OGONEK + : "ǫ" U01EB # LATIN SMALL LETTER O WITH OGONEK + : "ǫ" U01EB # LATIN SMALL LETTER O WITH OGONEK + : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON + : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON + : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON + : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON + : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON + : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON + : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON + : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON + : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON + : "Ǯ" U01EE # LATIN CAPITAL LETTER EZH WITH CARON + : "Ǯ" U01EE # LATIN CAPITAL LETTER EZH WITH CARON + : "ǯ" U01EF # LATIN SMALL LETTER EZH WITH CARON + : "ǯ" U01EF # LATIN SMALL LETTER EZH WITH CARON + : "ǰ" U01F0 # LATIN SMALL LETTER J WITH CARON + : "ǰ" U01F0 # LATIN SMALL LETTER J WITH CARON + : "Ǵ" U01F4 # LATIN CAPITAL LETTER G WITH ACUTE + : "Ǵ" U01F4 # LATIN CAPITAL LETTER G WITH ACUTE + : "Ǵ" U01F4 # LATIN CAPITAL LETTER G WITH ACUTE + : "ǵ" U01F5 # LATIN SMALL LETTER G WITH ACUTE + : "ǵ" U01F5 # LATIN SMALL LETTER G WITH ACUTE + : "ǵ" U01F5 # LATIN SMALL LETTER G WITH ACUTE + : "Ǹ" U01F8 # LATIN CAPITAL LETTER N WITH GRAVE + : "Ǹ" U01F8 # LATIN CAPITAL LETTER N WITH GRAVE + : "ǹ" U01F9 # LATIN SMALL LETTER N WITH GRAVE + : "ǹ" U01F9 # LATIN SMALL LETTER N WITH GRAVE + : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : "Ǽ" U01FC # LATIN CAPITAL LETTER AE WITH ACUTE + : "Ǽ" U01FC # LATIN CAPITAL LETTER AE WITH ACUTE + : "Ǽ" U01FC # LATIN CAPITAL LETTER AE WITH ACUTE + : "ǽ" U01FD # LATIN SMALL LETTER AE WITH ACUTE + : "ǽ" U01FD # LATIN SMALL LETTER AE WITH ACUTE + : "ǽ" U01FD # LATIN SMALL LETTER AE WITH ACUTE + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE + : "Ȁ" U0200 # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE + : "ȁ" U0201 # LATIN SMALL LETTER A WITH DOUBLE GRAVE + : "Ȃ" U0202 # LATIN CAPITAL LETTER A WITH INVERTED BREVE + : "ȃ" U0203 # LATIN SMALL LETTER A WITH INVERTED BREVE + : "Ȅ" U0204 # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE + : "ȅ" U0205 # LATIN SMALL LETTER E WITH DOUBLE GRAVE + : "Ȇ" U0206 # LATIN CAPITAL LETTER E WITH INVERTED BREVE + : "ȇ" U0207 # LATIN SMALL LETTER E WITH INVERTED BREVE + : "Ȉ" U0208 # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE + : "ȉ" U0209 # LATIN SMALL LETTER I WITH DOUBLE GRAVE + : "Ȋ" U020A # LATIN CAPITAL LETTER I WITH INVERTED BREVE + : "ȋ" U020B # LATIN SMALL LETTER I WITH INVERTED BREVE + : "Ȍ" U020C # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE + : "ȍ" U020D # LATIN SMALL LETTER O WITH DOUBLE GRAVE + : "Ȏ" U020E # LATIN CAPITAL LETTER O WITH INVERTED BREVE + : "ȏ" U020F # LATIN SMALL LETTER O WITH INVERTED BREVE + : "Ȑ" U0210 # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE + : "ȑ" U0211 # LATIN SMALL LETTER R WITH DOUBLE GRAVE + : "Ȓ" U0212 # LATIN CAPITAL LETTER R WITH INVERTED BREVE + : "ȓ" U0213 # LATIN SMALL LETTER R WITH INVERTED BREVE + : "Ȕ" U0214 # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE + : "ȕ" U0215 # LATIN SMALL LETTER U WITH DOUBLE GRAVE + : "Ȗ" U0216 # LATIN CAPITAL LETTER U WITH INVERTED BREVE + : "ȗ" U0217 # LATIN SMALL LETTER U WITH INVERTED BREVE + : "Ȟ" U021E # LATIN CAPITAL LETTER H WITH CARON + : "Ȟ" U021E # LATIN CAPITAL LETTER H WITH CARON + : "ȟ" U021F # LATIN SMALL LETTER H WITH CARON + : "ȟ" U021F # LATIN SMALL LETTER H WITH CARON + : "Ȧ" U0226 # LATIN CAPITAL LETTER A WITH DOT ABOVE + : "Ȧ" U0226 # LATIN CAPITAL LETTER A WITH DOT ABOVE + : "ȧ" U0227 # LATIN SMALL LETTER A WITH DOT ABOVE + : "ȧ" U0227 # LATIN SMALL LETTER A WITH DOT ABOVE + : "Ȩ" U0228 # LATIN CAPITAL LETTER E WITH CEDILLA + : "Ȩ" U0228 # LATIN CAPITAL LETTER E WITH CEDILLA + : "ȩ" U0229 # LATIN SMALL LETTER E WITH CEDILLA + : "ȩ" U0229 # LATIN SMALL LETTER E WITH CEDILLA + : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON + : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON + : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON + : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON + : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON + : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON + : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON + : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON + : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON + : "Ȯ" U022E # LATIN CAPITAL LETTER O WITH DOT ABOVE + : "Ȯ" U022E # LATIN CAPITAL LETTER O WITH DOT ABOVE + : "ȯ" U022F # LATIN SMALL LETTER O WITH DOT ABOVE + : "ȯ" U022F # LATIN SMALL LETTER O WITH DOT ABOVE + : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + : "Ȳ" U0232 # LATIN CAPITAL LETTER Y WITH MACRON + : "Ȳ" U0232 # LATIN CAPITAL LETTER Y WITH MACRON + : "Ȳ" U0232 # LATIN CAPITAL LETTER Y WITH MACRON + : "ȳ" U0233 # LATIN SMALL LETTER Y WITH MACRON + : "ȳ" U0233 # LATIN SMALL LETTER Y WITH MACRON + : "ȳ" U0233 # LATIN SMALL LETTER Y WITH MACRON + : "ə" U0259 # LATIN SMALL LETTER SCHWA + : "ɨ" U0268 # LATIN SMALL LETTER I WITH STROKE + : "ɨ" U0268 # LATIN SMALL LETTER I WITH STROKE + : "ɨ" U0268 # LATIN SMALL LETTER I WITH STROKE + : "ʡ" U02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE + : "ʡ" U02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE + : "ʰ" U02B0 # MODIFIER LETTER SMALL H + : "ʰ" U02B0 # MODIFIER LETTER SMALL H + : "ʰ" U02B0 # MODIFIER LETTER SMALL H + : "ʰ" U02B0 # MODIFIER LETTER SMALL H + : "ʱ" U02B1 # MODIFIER LETTER SMALL H WITH HOOK + : "ʱ" U02B1 # MODIFIER LETTER SMALL H WITH HOOK + : "ʱ" U02B1 # MODIFIER LETTER SMALL H WITH HOOK + : "ʱ" U02B1 # MODIFIER LETTER SMALL H WITH HOOK + : "ʲ" U02B2 # MODIFIER LETTER SMALL J + : "ʲ" U02B2 # MODIFIER LETTER SMALL J + : "ʲ" U02B2 # MODIFIER LETTER SMALL J + : "ʲ" U02B2 # MODIFIER LETTER SMALL J + : "ʳ" U02B3 # MODIFIER LETTER SMALL R + : "ʳ" U02B3 # MODIFIER LETTER SMALL R + : "ʳ" U02B3 # MODIFIER LETTER SMALL R + : "ʳ" U02B3 # MODIFIER LETTER SMALL R + : "ʴ" U02B4 # MODIFIER LETTER SMALL TURNED R + : "ʴ" U02B4 # MODIFIER LETTER SMALL TURNED R + : "ʴ" U02B4 # MODIFIER LETTER SMALL TURNED R + : "ʴ" U02B4 # MODIFIER LETTER SMALL TURNED R + : "ʵ" U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK + : "ʵ" U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK + : "ʵ" U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK + : "ʵ" U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK + : "ʶ" U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R + : "ʶ" U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R + : "ʶ" U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R + : "ʶ" U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R + : "ʷ" U02B7 # MODIFIER LETTER SMALL W + : "ʷ" U02B7 # MODIFIER LETTER SMALL W + : "ʷ" U02B7 # MODIFIER LETTER SMALL W + : "ʷ" U02B7 # MODIFIER LETTER SMALL W + : "ʸ" U02B8 # MODIFIER LETTER SMALL Y + : "ʸ" U02B8 # MODIFIER LETTER SMALL Y + : "ʸ" U02B8 # MODIFIER LETTER SMALL Y + : "ʸ" U02B8 # MODIFIER LETTER SMALL Y + : "ˠ" U02E0 # MODIFIER LETTER SMALL GAMMA + : "ˠ" U02E0 # MODIFIER LETTER SMALL GAMMA + : "ˠ" U02E0 # MODIFIER LETTER SMALL GAMMA + : "ˠ" U02E0 # MODIFIER LETTER SMALL GAMMA + : "ˡ" U02E1 # MODIFIER LETTER SMALL L + : "ˡ" U02E1 # MODIFIER LETTER SMALL L + : "ˡ" U02E1 # MODIFIER LETTER SMALL L + : "ˡ" U02E1 # MODIFIER LETTER SMALL L + : "ˢ" U02E2 # MODIFIER LETTER SMALL S + : "ˢ" U02E2 # MODIFIER LETTER SMALL S + : "ˢ" U02E2 # MODIFIER LETTER SMALL S + : "ˢ" U02E2 # MODIFIER LETTER SMALL S + : "ˣ" U02E3 # MODIFIER LETTER SMALL X + : "ˣ" U02E3 # MODIFIER LETTER SMALL X + : "ˣ" U02E3 # MODIFIER LETTER SMALL X + : "ˣ" U02E3 # MODIFIER LETTER SMALL X + : "ˤ" U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP + : "ˤ" U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP + : "ˤ" U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP + : "ˤ" U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP + : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS + : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS + : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS + : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS + : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS + : "΅" U0385 # GREEK DIALYTIKA TONOS + : "΅" U0385 # GREEK DIALYTIKA TONOS + : "΅" U0385 # GREEK DIALYTIKA TONOS + : "΅" U0385 # GREEK DIALYTIKA TONOS + : "΅" U0385 # GREEK DIALYTIKA TONOS + : "΅" U0385 # GREEK DIALYTIKA TONOS + : "Ά" U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS + : "Ά" U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS + : "Ά" U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS + : "Ά" U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS + : "Έ" U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS + : "Έ" U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS + : "Έ" U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS + : "Έ" U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS + : "Ή" U0389 # GREEK CAPITAL LETTER ETA WITH TONOS + : "Ή" U0389 # GREEK CAPITAL LETTER ETA WITH TONOS + : "Ή" U0389 # GREEK CAPITAL LETTER ETA WITH TONOS + : "Ή" U0389 # GREEK CAPITAL LETTER ETA WITH TONOS + : "Ί" U038A # GREEK CAPITAL LETTER IOTA WITH TONOS + : "Ί" U038A # GREEK CAPITAL LETTER IOTA WITH TONOS + : "Ί" U038A # GREEK CAPITAL LETTER IOTA WITH TONOS + : "Ί" U038A # GREEK CAPITAL LETTER IOTA WITH TONOS + : "Ό" U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS + : "Ό" U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS + : "Ό" U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS + : "Ό" U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS + : "Ύ" U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS + : "Ύ" U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS + : "Ύ" U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS + : "Ύ" U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS + : "Ώ" U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS + : "Ώ" U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS + : "Ώ" U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS + : "Ώ" U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "Ϊ" U03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + : "Ϊ" U03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + : "Ϊ" U03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + : "Ϋ" U03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + : "Ϋ" U03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + : "Ϋ" U03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + : "ά" U03AC # GREEK SMALL LETTER ALPHA WITH TONOS + : "ά" U03AC # GREEK SMALL LETTER ALPHA WITH TONOS + : "ά" U03AC # GREEK SMALL LETTER ALPHA WITH TONOS + : "ά" U03AC # GREEK SMALL LETTER ALPHA WITH TONOS + : "έ" U03AD # GREEK SMALL LETTER EPSILON WITH TONOS + : "έ" U03AD # GREEK SMALL LETTER EPSILON WITH TONOS + : "έ" U03AD # GREEK SMALL LETTER EPSILON WITH TONOS + : "έ" U03AD # GREEK SMALL LETTER EPSILON WITH TONOS + : "ή" U03AE # GREEK SMALL LETTER ETA WITH TONOS + : "ή" U03AE # GREEK SMALL LETTER ETA WITH TONOS + : "ή" U03AE # GREEK SMALL LETTER ETA WITH TONOS + : "ή" U03AE # GREEK SMALL LETTER ETA WITH TONOS + : "ί" U03AF # GREEK SMALL LETTER IOTA WITH TONOS + : "ί" U03AF # GREEK SMALL LETTER IOTA WITH TONOS + : "ί" U03AF # GREEK SMALL LETTER IOTA WITH TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ϊ" U03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA + : "ϊ" U03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA + : "ϊ" U03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA + : "ϋ" U03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + : "ϋ" U03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + : "ϋ" U03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + : "ό" U03CC # GREEK SMALL LETTER OMICRON WITH TONOS + : "ό" U03CC # GREEK SMALL LETTER OMICRON WITH TONOS + : "ό" U03CC # GREEK SMALL LETTER OMICRON WITH TONOS + : "ό" U03CC # GREEK SMALL LETTER OMICRON WITH TONOS + : "ύ" U03CD # GREEK SMALL LETTER UPSILON WITH TONOS + : "ύ" U03CD # GREEK SMALL LETTER UPSILON WITH TONOS + : "ύ" U03CD # GREEK SMALL LETTER UPSILON WITH TONOS + : "ύ" U03CD # GREEK SMALL LETTER UPSILON WITH TONOS + : "ώ" U03CE # GREEK SMALL LETTER OMEGA WITH TONOS + : "ώ" U03CE # GREEK SMALL LETTER OMEGA WITH TONOS + : "ώ" U03CE # GREEK SMALL LETTER OMEGA WITH TONOS + : "ώ" U03CE # GREEK SMALL LETTER OMEGA WITH TONOS + : "ϔ" U03D4 # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL + : "Ѐ" U0400 # CYRILLIC CAPITAL LETTER IE WITH GRAVE + : "Ѐ" U0400 # CYRILLIC CAPITAL LETTER IE WITH GRAVE + : "Ё" U0401 # CYRILLIC CAPITAL LETTER IO + : "Ё" U0401 # CYRILLIC CAPITAL LETTER IO + : "Ѓ" U0403 # CYRILLIC CAPITAL LETTER GJE + : "Ѓ" U0403 # CYRILLIC CAPITAL LETTER GJE + : "Ѓ" U0403 # CYRILLIC CAPITAL LETTER GJE + : "Ї" U0407 # CYRILLIC CAPITAL LETTER YI + : "Ї" U0407 # CYRILLIC CAPITAL LETTER YI + : "Ќ" U040C # CYRILLIC CAPITAL LETTER KJE + : "Ќ" U040C # CYRILLIC CAPITAL LETTER KJE + : "Ќ" U040C # CYRILLIC CAPITAL LETTER KJE + : "Ѝ" U040D # CYRILLIC CAPITAL LETTER I WITH GRAVE + : "Ѝ" U040D # CYRILLIC CAPITAL LETTER I WITH GRAVE + : "Ў" U040E # CYRILLIC CAPITAL LETTER SHORT U + : "Ў" U040E # CYRILLIC CAPITAL LETTER SHORT U + : "Ў" U040E # CYRILLIC CAPITAL LETTER SHORT U + : "Й" U0419 # CYRILLIC CAPITAL LETTER SHORT I + : "Й" U0419 # CYRILLIC CAPITAL LETTER SHORT I + : "Й" U0419 # CYRILLIC CAPITAL LETTER SHORT I + : "й" U0439 # CYRILLIC SMALL LETTER SHORT I + : "й" U0439 # CYRILLIC SMALL LETTER SHORT I + : "й" U0439 # CYRILLIC SMALL LETTER SHORT I + : "ѐ" U0450 # CYRILLIC SMALL LETTER IE WITH GRAVE + : "ѐ" U0450 # CYRILLIC SMALL LETTER IE WITH GRAVE + : "ё" U0451 # CYRILLIC SMALL LETTER IO + : "ё" U0451 # CYRILLIC SMALL LETTER IO + : "ѓ" U0453 # CYRILLIC SMALL LETTER GJE + : "ѓ" U0453 # CYRILLIC SMALL LETTER GJE + : "ѓ" U0453 # CYRILLIC SMALL LETTER GJE + : "ї" U0457 # CYRILLIC SMALL LETTER YI + : "ї" U0457 # CYRILLIC SMALL LETTER YI + : "ќ" U045C # CYRILLIC SMALL LETTER KJE + : "ќ" U045C # CYRILLIC SMALL LETTER KJE + : "ќ" U045C # CYRILLIC SMALL LETTER KJE + : "ѝ" U045D # CYRILLIC SMALL LETTER I WITH GRAVE + : "ѝ" U045D # CYRILLIC SMALL LETTER I WITH GRAVE + : "ў" U045E # CYRILLIC SMALL LETTER SHORT U + : "ў" U045E # CYRILLIC SMALL LETTER SHORT U + : "ў" U045E # CYRILLIC SMALL LETTER SHORT U + : "Ѷ" U0476 # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT + : "ѷ" U0477 # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT + : "Ғ" U0492 # CYRILLIC CAPITAL LETTER GHE WITH STROKE + : "Ғ" U0492 # CYRILLIC CAPITAL LETTER GHE WITH STROKE + : "ғ" U0493 # CYRILLIC SMALL LETTER GHE WITH STROKE + : "ғ" U0493 # CYRILLIC SMALL LETTER GHE WITH STROKE + : "Ҟ" U049E # CYRILLIC CAPITAL LETTER KA WITH STROKE + : "Ҟ" U049E # CYRILLIC CAPITAL LETTER KA WITH STROKE + : "ҟ" U049F # CYRILLIC SMALL LETTER KA WITH STROKE + : "ҟ" U049F # CYRILLIC SMALL LETTER KA WITH STROKE + : "Ұ" U04B0 # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + : "Ұ" U04B0 # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + : "ұ" U04B1 # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + : "ұ" U04B1 # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + : "Ӂ" U04C1 # CYRILLIC CAPITAL LETTER ZHE WITH BREVE + : "Ӂ" U04C1 # CYRILLIC CAPITAL LETTER ZHE WITH BREVE + : "Ӂ" U04C1 # CYRILLIC CAPITAL LETTER ZHE WITH BREVE + : "ӂ" U04C2 # CYRILLIC SMALL LETTER ZHE WITH BREVE + : "ӂ" U04C2 # CYRILLIC SMALL LETTER ZHE WITH BREVE + : "ӂ" U04C2 # CYRILLIC SMALL LETTER ZHE WITH BREVE + : "Ӑ" U04D0 # CYRILLIC CAPITAL LETTER A WITH BREVE + : "Ӑ" U04D0 # CYRILLIC CAPITAL LETTER A WITH BREVE + : "Ӑ" U04D0 # CYRILLIC CAPITAL LETTER A WITH BREVE + : "ӑ" U04D1 # CYRILLIC SMALL LETTER A WITH BREVE + : "ӑ" U04D1 # CYRILLIC SMALL LETTER A WITH BREVE + : "ӑ" U04D1 # CYRILLIC SMALL LETTER A WITH BREVE + : "Ӓ" U04D2 # CYRILLIC CAPITAL LETTER A WITH DIAERESIS + : "Ӓ" U04D2 # CYRILLIC CAPITAL LETTER A WITH DIAERESIS + : "ӓ" U04D3 # CYRILLIC SMALL LETTER A WITH DIAERESIS + : "ӓ" U04D3 # CYRILLIC SMALL LETTER A WITH DIAERESIS + : "Ӗ" U04D6 # CYRILLIC CAPITAL LETTER IE WITH BREVE + : "Ӗ" U04D6 # CYRILLIC CAPITAL LETTER IE WITH BREVE + : "Ӗ" U04D6 # CYRILLIC CAPITAL LETTER IE WITH BREVE + : "ӗ" U04D7 # CYRILLIC SMALL LETTER IE WITH BREVE + : "ӗ" U04D7 # CYRILLIC SMALL LETTER IE WITH BREVE + : "ӗ" U04D7 # CYRILLIC SMALL LETTER IE WITH BREVE + : "Ӛ" U04DA # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS + : "Ӛ" U04DA # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS + : "ӛ" U04DB # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS + : "ӛ" U04DB # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS + : "Ӝ" U04DC # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS + : "Ӝ" U04DC # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS + : "ӝ" U04DD # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS + : "ӝ" U04DD # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS + : "Ӟ" U04DE # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS + : "Ӟ" U04DE # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS + : "ӟ" U04DF # CYRILLIC SMALL LETTER ZE WITH DIAERESIS + : "ӟ" U04DF # CYRILLIC SMALL LETTER ZE WITH DIAERESIS + : "Ӣ" U04E2 # CYRILLIC CAPITAL LETTER I WITH MACRON + : "Ӣ" U04E2 # CYRILLIC CAPITAL LETTER I WITH MACRON + : "Ӣ" U04E2 # CYRILLIC CAPITAL LETTER I WITH MACRON + : "ӣ" U04E3 # CYRILLIC SMALL LETTER I WITH MACRON + : "ӣ" U04E3 # CYRILLIC SMALL LETTER I WITH MACRON + : "ӣ" U04E3 # CYRILLIC SMALL LETTER I WITH MACRON + : "Ӥ" U04E4 # CYRILLIC CAPITAL LETTER I WITH DIAERESIS + : "Ӥ" U04E4 # CYRILLIC CAPITAL LETTER I WITH DIAERESIS + : "ӥ" U04E5 # CYRILLIC SMALL LETTER I WITH DIAERESIS + : "ӥ" U04E5 # CYRILLIC SMALL LETTER I WITH DIAERESIS + : "Ӧ" U04E6 # CYRILLIC CAPITAL LETTER O WITH DIAERESIS + : "Ӧ" U04E6 # CYRILLIC CAPITAL LETTER O WITH DIAERESIS + : "ӧ" U04E7 # CYRILLIC SMALL LETTER O WITH DIAERESIS + : "ӧ" U04E7 # CYRILLIC SMALL LETTER O WITH DIAERESIS + : "Ӫ" U04EA # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS + : "Ӫ" U04EA # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS + : "ӫ" U04EB # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS + : "ӫ" U04EB # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS + : "Ӭ" U04EC # CYRILLIC CAPITAL LETTER E WITH DIAERESIS + : "Ӭ" U04EC # CYRILLIC CAPITAL LETTER E WITH DIAERESIS + : "ӭ" U04ED # CYRILLIC SMALL LETTER E WITH DIAERESIS + : "ӭ" U04ED # CYRILLIC SMALL LETTER E WITH DIAERESIS + : "Ӯ" U04EE # CYRILLIC CAPITAL LETTER U WITH MACRON + : "Ӯ" U04EE # CYRILLIC CAPITAL LETTER U WITH MACRON + : "Ӯ" U04EE # CYRILLIC CAPITAL LETTER U WITH MACRON + : "ӯ" U04EF # CYRILLIC SMALL LETTER U WITH MACRON + : "ӯ" U04EF # CYRILLIC SMALL LETTER U WITH MACRON + : "ӯ" U04EF # CYRILLIC SMALL LETTER U WITH MACRON + : "Ӱ" U04F0 # CYRILLIC CAPITAL LETTER U WITH DIAERESIS + : "Ӱ" U04F0 # CYRILLIC CAPITAL LETTER U WITH DIAERESIS + : "ӱ" U04F1 # CYRILLIC SMALL LETTER U WITH DIAERESIS + : "ӱ" U04F1 # CYRILLIC SMALL LETTER U WITH DIAERESIS + : "Ӳ" U04F2 # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE + : "Ӳ" U04F2 # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE + : "ӳ" U04F3 # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE + : "ӳ" U04F3 # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE + : "Ӵ" U04F4 # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS + : "Ӵ" U04F4 # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS + : "ӵ" U04F5 # CYRILLIC SMALL LETTER CHE WITH DIAERESIS + : "ӵ" U04F5 # CYRILLIC SMALL LETTER CHE WITH DIAERESIS + : "Ӹ" U04F8 # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS + : "Ӹ" U04F8 # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS + : "ӹ" U04F9 # CYRILLIC SMALL LETTER YERU WITH DIAERESIS + : "ӹ" U04F9 # CYRILLIC SMALL LETTER YERU WITH DIAERESIS + : "آ" U0622 # ARABIC LETTER ALEF WITH MADDA ABOVE + : "أ" U0623 # ARABIC LETTER ALEF WITH HAMZA ABOVE + : "ؤ" U0624 # ARABIC LETTER WAW WITH HAMZA ABOVE + : "إ" U0625 # ARABIC LETTER ALEF WITH HAMZA BELOW + : "ئ" U0626 # ARABIC LETTER YEH WITH HAMZA ABOVE + : "ۀ" U06C0 # ARABIC LETTER HEH WITH YEH ABOVE + : "ۂ" U06C2 # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE + : "ۓ" U06D3 # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE + : "ऩ" U0929 # DEVANAGARI LETTER NNNA + : "ऱ" U0931 # DEVANAGARI LETTER RRA + : "ऴ" U0934 # DEVANAGARI LETTER LLLA + : "क़" U0958 # DEVANAGARI LETTER QA + : "ख़" U0959 # DEVANAGARI LETTER KHHA + : "ग़" U095A # DEVANAGARI LETTER GHHA + : "ज़" U095B # DEVANAGARI LETTER ZA + : "ड़" U095C # DEVANAGARI LETTER DDDHA + : "ढ़" U095D # DEVANAGARI LETTER RHA + : "फ़" U095E # DEVANAGARI LETTER FA + : "य़" U095F # DEVANAGARI LETTER YYA + : "ো" U09CB # BENGALI VOWEL SIGN O + : "ৌ" U09CC # BENGALI VOWEL SIGN AU + : "ড়" U09DC # BENGALI LETTER RRA + : "ঢ়" U09DD # BENGALI LETTER RHA + : "য়" U09DF # BENGALI LETTER YYA + : "ਲ਼" U0A33 # GURMUKHI LETTER LLA + : "ਸ਼" U0A36 # GURMUKHI LETTER SHA + : "ਖ਼" U0A59 # GURMUKHI LETTER KHHA + : "ਗ਼" U0A5A # GURMUKHI LETTER GHHA + : "ਜ਼" U0A5B # GURMUKHI LETTER ZA + : "ਫ਼" U0A5E # GURMUKHI LETTER FA + : "ୈ" U0B48 # ORIYA VOWEL SIGN AI + : "ୋ" U0B4B # ORIYA VOWEL SIGN O + : "ୌ" U0B4C # ORIYA VOWEL SIGN AU + : "ଡ଼" U0B5C # ORIYA LETTER RRA + : "ଢ଼" U0B5D # ORIYA LETTER RHA + : "ஔ" U0B94 # TAMIL LETTER AU + : "ொ" U0BCA # TAMIL VOWEL SIGN O + : "ோ" U0BCB # TAMIL VOWEL SIGN OO + : "ௌ" U0BCC # TAMIL VOWEL SIGN AU + : "ై" U0C48 # TELUGU VOWEL SIGN AI + : "ೀ" U0CC0 # KANNADA VOWEL SIGN II + : "ೇ" U0CC7 # KANNADA VOWEL SIGN EE + : "ೈ" U0CC8 # KANNADA VOWEL SIGN AI + : "ೊ" U0CCA # KANNADA VOWEL SIGN O + : "ೋ" U0CCB # KANNADA VOWEL SIGN OO + + : "ൊ" U0D4A # MALAYALAM VOWEL SIGN O + : "ോ" U0D4B # MALAYALAM VOWEL SIGN OO + : "ൌ" U0D4C # MALAYALAM VOWEL SIGN AU + : "ේ" U0DDA # SINHALA VOWEL SIGN DIGA KOMBUVA + : "ො" U0DDC # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA + : "ෝ" U0DDD # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA + + : "ෞ" U0DDE # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA + : "གྷ" U0F43 # TIBETAN LETTER GHA + : "ཌྷ" U0F4D # TIBETAN LETTER DDHA + : "དྷ" U0F52 # TIBETAN LETTER DHA + : "བྷ" U0F57 # TIBETAN LETTER BHA + : "ཛྷ" U0F5C # TIBETAN LETTER DZHA + : "ཀྵ" U0F69 # TIBETAN LETTER KSSA + : "ཱི" U0F73 # TIBETAN VOWEL SIGN II + : "ཱུ" U0F75 # TIBETAN VOWEL SIGN UU + : "ྲྀ" U0F76 # TIBETAN VOWEL SIGN VOCALIC R + : "ླྀ" U0F78 # TIBETAN VOWEL SIGN VOCALIC L + : "ཱྀ" U0F81 # TIBETAN VOWEL SIGN REVERSED II + : "ྒྷ" U0F93 # TIBETAN SUBJOINED LETTER GHA + : "ྜྷ" U0F9D # TIBETAN SUBJOINED LETTER DDHA + : "ྡྷ" U0FA2 # TIBETAN SUBJOINED LETTER DHA + : "ྦྷ" U0FA7 # TIBETAN SUBJOINED LETTER BHA + : "ྫྷ" U0FAC # TIBETAN SUBJOINED LETTER DZHA + : "ྐྵ" U0FB9 # TIBETAN SUBJOINED LETTER KSSA + : "ဦ" U1026 # MYANMAR LETTER UU + : "Ḁ" U1E00 # LATIN CAPITAL LETTER A WITH RING BELOW + : "ḁ" U1E01 # LATIN SMALL LETTER A WITH RING BELOW + : "Ḃ" U1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE + : "Ḃ" U1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE + : "Ḃ" U1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE + : "ḃ" U1E03 # LATIN SMALL LETTER B WITH DOT ABOVE + : "ḃ" U1E03 # LATIN SMALL LETTER B WITH DOT ABOVE + : "ḃ" U1E03 # LATIN SMALL LETTER B WITH DOT ABOVE + : "Ḅ" U1E04 # LATIN CAPITAL LETTER B WITH DOT BELOW + : "Ḅ" U1E04 # LATIN CAPITAL LETTER B WITH DOT BELOW + : "ḅ" U1E05 # LATIN SMALL LETTER B WITH DOT BELOW + : "ḅ" U1E05 # LATIN SMALL LETTER B WITH DOT BELOW + : "Ḇ" U1E06 # LATIN CAPITAL LETTER B WITH LINE BELOW + : "ḇ" U1E07 # LATIN SMALL LETTER B WITH LINE BELOW + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "Ḋ" U1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE + : "Ḋ" U1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE + : "Ḋ" U1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE + : "ḋ" U1E0B # LATIN SMALL LETTER D WITH DOT ABOVE + : "ḋ" U1E0B # LATIN SMALL LETTER D WITH DOT ABOVE + : "ḋ" U1E0B # LATIN SMALL LETTER D WITH DOT ABOVE + : "Ḍ" U1E0C # LATIN CAPITAL LETTER D WITH DOT BELOW + : "Ḍ" U1E0C # LATIN CAPITAL LETTER D WITH DOT BELOW + : "ḍ" U1E0D # LATIN SMALL LETTER D WITH DOT BELOW + : "ḍ" U1E0D # LATIN SMALL LETTER D WITH DOT BELOW + : "Ḏ" U1E0E # LATIN CAPITAL LETTER D WITH LINE BELOW + : "ḏ" U1E0F # LATIN SMALL LETTER D WITH LINE BELOW + : "Ḑ" U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA + : "Ḑ" U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA + : "Ḑ" U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA + : "Ḑ" U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA + : "ḑ" U1E11 # LATIN SMALL LETTER D WITH CEDILLA + : "ḑ" U1E11 # LATIN SMALL LETTER D WITH CEDILLA + : "ḑ" U1E11 # LATIN SMALL LETTER D WITH CEDILLA + : "ḑ" U1E11 # LATIN SMALL LETTER D WITH CEDILLA + : "Ḓ" U1E12 # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW + : "ḓ" U1E13 # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW + : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE + : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE + : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE + : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE + : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE + : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE + : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE + : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "Ḙ" U1E18 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW + : "ḙ" U1E19 # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW + : "Ḛ" U1E1A # LATIN CAPITAL LETTER E WITH TILDE BELOW + : "ḛ" U1E1B # LATIN SMALL LETTER E WITH TILDE BELOW + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "Ḟ" U1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE + : "Ḟ" U1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE + : "Ḟ" U1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE + : "ḟ" U1E1F # LATIN SMALL LETTER F WITH DOT ABOVE + : "ḟ" U1E1F # LATIN SMALL LETTER F WITH DOT ABOVE + : "ḟ" U1E1F # LATIN SMALL LETTER F WITH DOT ABOVE + : "Ḡ" U1E20 # LATIN CAPITAL LETTER G WITH MACRON + : "Ḡ" U1E20 # LATIN CAPITAL LETTER G WITH MACRON + : "Ḡ" U1E20 # LATIN CAPITAL LETTER G WITH MACRON + : "ḡ" U1E21 # LATIN SMALL LETTER G WITH MACRON + : "ḡ" U1E21 # LATIN SMALL LETTER G WITH MACRON + : "ḡ" U1E21 # LATIN SMALL LETTER G WITH MACRON + : "Ḣ" U1E22 # LATIN CAPITAL LETTER H WITH DOT ABOVE + : "Ḣ" U1E22 # LATIN CAPITAL LETTER H WITH DOT ABOVE + : "ḣ" U1E23 # LATIN SMALL LETTER H WITH DOT ABOVE + : "ḣ" U1E23 # LATIN SMALL LETTER H WITH DOT ABOVE + : "Ḥ" U1E24 # LATIN CAPITAL LETTER H WITH DOT BELOW + : "Ḥ" U1E24 # LATIN CAPITAL LETTER H WITH DOT BELOW + : "ḥ" U1E25 # LATIN SMALL LETTER H WITH DOT BELOW + : "ḥ" U1E25 # LATIN SMALL LETTER H WITH DOT BELOW + : "Ḧ" U1E26 # LATIN CAPITAL LETTER H WITH DIAERESIS + : "Ḧ" U1E26 # LATIN CAPITAL LETTER H WITH DIAERESIS + : "ḧ" U1E27 # LATIN SMALL LETTER H WITH DIAERESIS + : "ḧ" U1E27 # LATIN SMALL LETTER H WITH DIAERESIS + : "Ḩ" U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA + : "Ḩ" U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA + : "Ḩ" U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA + : "Ḩ" U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA + : "ḩ" U1E29 # LATIN SMALL LETTER H WITH CEDILLA + : "ḩ" U1E29 # LATIN SMALL LETTER H WITH CEDILLA + : "ḩ" U1E29 # LATIN SMALL LETTER H WITH CEDILLA + : "ḩ" U1E29 # LATIN SMALL LETTER H WITH CEDILLA + : "Ḫ" U1E2A # LATIN CAPITAL LETTER H WITH BREVE BELOW + : "ḫ" U1E2B # LATIN SMALL LETTER H WITH BREVE BELOW + : "Ḭ" U1E2C # LATIN CAPITAL LETTER I WITH TILDE BELOW + : "ḭ" U1E2D # LATIN SMALL LETTER I WITH TILDE BELOW + : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : "Ḱ" U1E30 # LATIN CAPITAL LETTER K WITH ACUTE + : "Ḱ" U1E30 # LATIN CAPITAL LETTER K WITH ACUTE + : "Ḱ" U1E30 # LATIN CAPITAL LETTER K WITH ACUTE + : "ḱ" U1E31 # LATIN SMALL LETTER K WITH ACUTE + : "ḱ" U1E31 # LATIN SMALL LETTER K WITH ACUTE + : "ḱ" U1E31 # LATIN SMALL LETTER K WITH ACUTE + : "Ḳ" U1E32 # LATIN CAPITAL LETTER K WITH DOT BELOW + : "Ḳ" U1E32 # LATIN CAPITAL LETTER K WITH DOT BELOW + : "ḳ" U1E33 # LATIN SMALL LETTER K WITH DOT BELOW + : "ḳ" U1E33 # LATIN SMALL LETTER K WITH DOT BELOW + : "Ḵ" U1E34 # LATIN CAPITAL LETTER K WITH LINE BELOW + : "ḵ" U1E35 # LATIN SMALL LETTER K WITH LINE BELOW + : "Ḷ" U1E36 # LATIN CAPITAL LETTER L WITH DOT BELOW + : "Ḷ" U1E36 # LATIN CAPITAL LETTER L WITH DOT BELOW + : "ḷ" U1E37 # LATIN SMALL LETTER L WITH DOT BELOW + : "ḷ" U1E37 # LATIN SMALL LETTER L WITH DOT BELOW + : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + : "Ḻ" U1E3A # LATIN CAPITAL LETTER L WITH LINE BELOW + : "ḻ" U1E3B # LATIN SMALL LETTER L WITH LINE BELOW + : "Ḽ" U1E3C # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW + : "ḽ" U1E3D # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW + : "Ḿ" U1E3E # LATIN CAPITAL LETTER M WITH ACUTE + : "Ḿ" U1E3E # LATIN CAPITAL LETTER M WITH ACUTE + : "Ḿ" U1E3E # LATIN CAPITAL LETTER M WITH ACUTE + : "ḿ" U1E3F # LATIN SMALL LETTER M WITH ACUTE + : "ḿ" U1E3F # LATIN SMALL LETTER M WITH ACUTE + : "ḿ" U1E3F # LATIN SMALL LETTER M WITH ACUTE + : "Ṁ" U1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE + : "Ṁ" U1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE + : "Ṁ" U1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE + : "ṁ" U1E41 # LATIN SMALL LETTER M WITH DOT ABOVE + : "ṁ" U1E41 # LATIN SMALL LETTER M WITH DOT ABOVE + : "ṁ" U1E41 # LATIN SMALL LETTER M WITH DOT ABOVE + : "Ṃ" U1E42 # LATIN CAPITAL LETTER M WITH DOT BELOW + : "Ṃ" U1E42 # LATIN CAPITAL LETTER M WITH DOT BELOW + : "ṃ" U1E43 # LATIN SMALL LETTER M WITH DOT BELOW + : "ṃ" U1E43 # LATIN SMALL LETTER M WITH DOT BELOW + : "Ṅ" U1E44 # LATIN CAPITAL LETTER N WITH DOT ABOVE + : "Ṅ" U1E44 # LATIN CAPITAL LETTER N WITH DOT ABOVE + : "ṅ" U1E45 # LATIN SMALL LETTER N WITH DOT ABOVE + : "ṅ" U1E45 # LATIN SMALL LETTER N WITH DOT ABOVE + : "Ṇ" U1E46 # LATIN CAPITAL LETTER N WITH DOT BELOW + : "Ṇ" U1E46 # LATIN CAPITAL LETTER N WITH DOT BELOW + : "ṇ" U1E47 # LATIN SMALL LETTER N WITH DOT BELOW + : "ṇ" U1E47 # LATIN SMALL LETTER N WITH DOT BELOW + : "Ṉ" U1E48 # LATIN CAPITAL LETTER N WITH LINE BELOW + : "ṉ" U1E49 # LATIN SMALL LETTER N WITH LINE BELOW + : "Ṋ" U1E4A # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW + : "ṋ" U1E4B # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW + : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE + : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE + : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE + : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE + : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE + : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE + : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE + : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE + : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE + : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS + : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS + : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS + : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS + : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS + : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS + : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE + : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE + : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE + : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE + : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE + : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE + : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE + : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE +

: "Ṕ" U1E54 # LATIN CAPITAL LETTER P WITH ACUTE +

: "Ṕ" U1E54 # LATIN CAPITAL LETTER P WITH ACUTE +

: "Ṕ" U1E54 # LATIN CAPITAL LETTER P WITH ACUTE +

: "ṕ" U1E55 # LATIN SMALL LETTER P WITH ACUTE +

: "ṕ" U1E55 # LATIN SMALL LETTER P WITH ACUTE +

: "ṕ" U1E55 # LATIN SMALL LETTER P WITH ACUTE +

: "Ṗ" U1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE +

: "Ṗ" U1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE +

: "Ṗ" U1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE +

: "ṗ" U1E57 # LATIN SMALL LETTER P WITH DOT ABOVE +

: "ṗ" U1E57 # LATIN SMALL LETTER P WITH DOT ABOVE +

: "ṗ" U1E57 # LATIN SMALL LETTER P WITH DOT ABOVE + : "Ṙ" U1E58 # LATIN CAPITAL LETTER R WITH DOT ABOVE + : "Ṙ" U1E58 # LATIN CAPITAL LETTER R WITH DOT ABOVE + : "ṙ" U1E59 # LATIN SMALL LETTER R WITH DOT ABOVE + : "ṙ" U1E59 # LATIN SMALL LETTER R WITH DOT ABOVE + : "Ṛ" U1E5A # LATIN CAPITAL LETTER R WITH DOT BELOW + : "Ṛ" U1E5A # LATIN CAPITAL LETTER R WITH DOT BELOW + : "ṛ" U1E5B # LATIN SMALL LETTER R WITH DOT BELOW + : "ṛ" U1E5B # LATIN SMALL LETTER R WITH DOT BELOW + : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + : "Ṟ" U1E5E # LATIN CAPITAL LETTER R WITH LINE BELOW + : "ṟ" U1E5F # LATIN SMALL LETTER R WITH LINE BELOW + : "Ṡ" U1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE + : "Ṡ" U1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE + : "Ṡ" U1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE + : "ṡ" U1E61 # LATIN SMALL LETTER S WITH DOT ABOVE + : "ṡ" U1E61 # LATIN SMALL LETTER S WITH DOT ABOVE + : "ṡ" U1E61 # LATIN SMALL LETTER S WITH DOT ABOVE + : "Ṣ" U1E62 # LATIN CAPITAL LETTER S WITH DOT BELOW + : "Ṣ" U1E62 # LATIN CAPITAL LETTER S WITH DOT BELOW + : "ṣ" U1E63 # LATIN SMALL LETTER S WITH DOT BELOW + : "ṣ" U1E63 # LATIN SMALL LETTER S WITH DOT BELOW + : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE + : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE + : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE + : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE + : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE + : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE + : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE + : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE + : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE + : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE + : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE + : "Ṫ" U1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE + : "Ṫ" U1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE + : "Ṫ" U1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE + : "ṫ" U1E6B # LATIN SMALL LETTER T WITH DOT ABOVE + : "ṫ" U1E6B # LATIN SMALL LETTER T WITH DOT ABOVE + : "ṫ" U1E6B # LATIN SMALL LETTER T WITH DOT ABOVE + : "Ṭ" U1E6C # LATIN CAPITAL LETTER T WITH DOT BELOW + : "Ṭ" U1E6C # LATIN CAPITAL LETTER T WITH DOT BELOW + : "ṭ" U1E6D # LATIN SMALL LETTER T WITH DOT BELOW + : "ṭ" U1E6D # LATIN SMALL LETTER T WITH DOT BELOW + : "Ṯ" U1E6E # LATIN CAPITAL LETTER T WITH LINE BELOW + : "ṯ" U1E6F # LATIN SMALL LETTER T WITH LINE BELOW + : "Ṱ" U1E70 # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW + : "ṱ" U1E71 # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW + : "Ṳ" U1E72 # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW + : "ṳ" U1E73 # LATIN SMALL LETTER U WITH DIAERESIS BELOW + : "Ṵ" U1E74 # LATIN CAPITAL LETTER U WITH TILDE BELOW + : "ṵ" U1E75 # LATIN SMALL LETTER U WITH TILDE BELOW + : "Ṷ" U1E76 # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW + : "ṷ" U1E77 # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW + : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE + : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE + : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE + : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE + : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE + : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE + : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE + : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE + : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE + : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS + : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS + : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS + : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS + : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS + : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS + : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS + : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS + : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS + : "Ṽ" U1E7C # LATIN CAPITAL LETTER V WITH TILDE + : "Ṽ" U1E7C # LATIN CAPITAL LETTER V WITH TILDE + : "ṽ" U1E7D # LATIN SMALL LETTER V WITH TILDE + : "ṽ" U1E7D # LATIN SMALL LETTER V WITH TILDE + : "Ṿ" U1E7E # LATIN CAPITAL LETTER V WITH DOT BELOW + : "Ṿ" U1E7E # LATIN CAPITAL LETTER V WITH DOT BELOW + : "ṿ" U1E7F # LATIN SMALL LETTER V WITH DOT BELOW + : "ṿ" U1E7F # LATIN SMALL LETTER V WITH DOT BELOW + : "Ẁ" U1E80 # LATIN CAPITAL LETTER W WITH GRAVE + : "Ẁ" U1E80 # LATIN CAPITAL LETTER W WITH GRAVE + : "ẁ" U1E81 # LATIN SMALL LETTER W WITH GRAVE + : "ẁ" U1E81 # LATIN SMALL LETTER W WITH GRAVE + : "Ẃ" U1E82 # LATIN CAPITAL LETTER W WITH ACUTE + : "Ẃ" U1E82 # LATIN CAPITAL LETTER W WITH ACUTE + : "Ẃ" U1E82 # LATIN CAPITAL LETTER W WITH ACUTE + : "ẃ" U1E83 # LATIN SMALL LETTER W WITH ACUTE + : "ẃ" U1E83 # LATIN SMALL LETTER W WITH ACUTE + : "ẃ" U1E83 # LATIN SMALL LETTER W WITH ACUTE + : "Ẅ" U1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS + : "Ẅ" U1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS + : "ẅ" U1E85 # LATIN SMALL LETTER W WITH DIAERESIS + : "ẅ" U1E85 # LATIN SMALL LETTER W WITH DIAERESIS + : "Ẇ" U1E86 # LATIN CAPITAL LETTER W WITH DOT ABOVE + : "Ẇ" U1E86 # LATIN CAPITAL LETTER W WITH DOT ABOVE + : "ẇ" U1E87 # LATIN SMALL LETTER W WITH DOT ABOVE + : "ẇ" U1E87 # LATIN SMALL LETTER W WITH DOT ABOVE + : "Ẉ" U1E88 # LATIN CAPITAL LETTER W WITH DOT BELOW + : "Ẉ" U1E88 # LATIN CAPITAL LETTER W WITH DOT BELOW + : "ẉ" U1E89 # LATIN SMALL LETTER W WITH DOT BELOW + : "ẉ" U1E89 # LATIN SMALL LETTER W WITH DOT BELOW + : "Ẋ" U1E8A # LATIN CAPITAL LETTER X WITH DOT ABOVE + : "Ẋ" U1E8A # LATIN CAPITAL LETTER X WITH DOT ABOVE + : "ẋ" U1E8B # LATIN SMALL LETTER X WITH DOT ABOVE + : "ẋ" U1E8B # LATIN SMALL LETTER X WITH DOT ABOVE + : "Ẍ" U1E8C # LATIN CAPITAL LETTER X WITH DIAERESIS + : "Ẍ" U1E8C # LATIN CAPITAL LETTER X WITH DIAERESIS + : "ẍ" U1E8D # LATIN SMALL LETTER X WITH DIAERESIS + : "ẍ" U1E8D # LATIN SMALL LETTER X WITH DIAERESIS + : "Ẏ" U1E8E # LATIN CAPITAL LETTER Y WITH DOT ABOVE + : "Ẏ" U1E8E # LATIN CAPITAL LETTER Y WITH DOT ABOVE + : "ẏ" U1E8F # LATIN SMALL LETTER Y WITH DOT ABOVE + : "ẏ" U1E8F # LATIN SMALL LETTER Y WITH DOT ABOVE + : "Ẑ" U1E90 # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX + : "Ẑ" U1E90 # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX + : "ẑ" U1E91 # LATIN SMALL LETTER Z WITH CIRCUMFLEX + : "ẑ" U1E91 # LATIN SMALL LETTER Z WITH CIRCUMFLEX + : "Ẓ" U1E92 # LATIN CAPITAL LETTER Z WITH DOT BELOW + : "Ẓ" U1E92 # LATIN CAPITAL LETTER Z WITH DOT BELOW + : "ẓ" U1E93 # LATIN SMALL LETTER Z WITH DOT BELOW + : "ẓ" U1E93 # LATIN SMALL LETTER Z WITH DOT BELOW + : "Ẕ" U1E94 # LATIN CAPITAL LETTER Z WITH LINE BELOW + : "ẕ" U1E95 # LATIN SMALL LETTER Z WITH LINE BELOW + : "ẖ" U1E96 # LATIN SMALL LETTER H WITH LINE BELOW + : "ẗ" U1E97 # LATIN SMALL LETTER T WITH DIAERESIS + : "ẗ" U1E97 # LATIN SMALL LETTER T WITH DIAERESIS + : "ẘ" U1E98 # LATIN SMALL LETTER W WITH RING ABOVE + : "ẘ" U1E98 # LATIN SMALL LETTER W WITH RING ABOVE + : "ẙ" U1E99 # LATIN SMALL LETTER Y WITH RING ABOVE + : "ẙ" U1E99 # LATIN SMALL LETTER Y WITH RING ABOVE + : "ẛ" U1E9B # LATIN SMALL LETTER LONG S WITH DOT ABOVE + : "ẛ" U1E9B # LATIN SMALL LETTER LONG S WITH DOT ABOVE + : "Ạ" U1EA0 # LATIN CAPITAL LETTER A WITH DOT BELOW + : "Ạ" U1EA0 # LATIN CAPITAL LETTER A WITH DOT BELOW + : "ạ" U1EA1 # LATIN SMALL LETTER A WITH DOT BELOW + : "ạ" U1EA1 # LATIN SMALL LETTER A WITH DOT BELOW + : "Ả" U1EA2 # LATIN CAPITAL LETTER A WITH HOOK ABOVE + : "Ả" U1EA2 # LATIN CAPITAL LETTER A WITH HOOK ABOVE + : "ả" U1EA3 # LATIN SMALL LETTER A WITH HOOK ABOVE + : "ả" U1EA3 # LATIN SMALL LETTER A WITH HOOK ABOVE + : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE + : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE + : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE + : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE + : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE + : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE + : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE + : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE + : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE + : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE + : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE + : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE + : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE + : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE + : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE + : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE + : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE + : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE + : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE + : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE + : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE + : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE + : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE + : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE + : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE + : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE + : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE + : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE + : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE + : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE + : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE + : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE + : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE + : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : "Ẹ" U1EB8 # LATIN CAPITAL LETTER E WITH DOT BELOW + : "Ẹ" U1EB8 # LATIN CAPITAL LETTER E WITH DOT BELOW + : "ẹ" U1EB9 # LATIN SMALL LETTER E WITH DOT BELOW + : "ẹ" U1EB9 # LATIN SMALL LETTER E WITH DOT BELOW + : "Ẻ" U1EBA # LATIN CAPITAL LETTER E WITH HOOK ABOVE + : "Ẻ" U1EBA # LATIN CAPITAL LETTER E WITH HOOK ABOVE + : "ẻ" U1EBB # LATIN SMALL LETTER E WITH HOOK ABOVE + : "ẻ" U1EBB # LATIN SMALL LETTER E WITH HOOK ABOVE + : "Ẽ" U1EBC # LATIN CAPITAL LETTER E WITH TILDE + : "Ẽ" U1EBC # LATIN CAPITAL LETTER E WITH TILDE + : "ẽ" U1EBD # LATIN SMALL LETTER E WITH TILDE + : "ẽ" U1EBD # LATIN SMALL LETTER E WITH TILDE + : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE + : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE + : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE + : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE + : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE + : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE + : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "Ỉ" U1EC8 # LATIN CAPITAL LETTER I WITH HOOK ABOVE + : "Ỉ" U1EC8 # LATIN CAPITAL LETTER I WITH HOOK ABOVE + : "ỉ" U1EC9 # LATIN SMALL LETTER I WITH HOOK ABOVE + : "ỉ" U1EC9 # LATIN SMALL LETTER I WITH HOOK ABOVE + : "Ị" U1ECA # LATIN CAPITAL LETTER I WITH DOT BELOW + : "Ị" U1ECA # LATIN CAPITAL LETTER I WITH DOT BELOW + : "ị" U1ECB # LATIN SMALL LETTER I WITH DOT BELOW + : "ị" U1ECB # LATIN SMALL LETTER I WITH DOT BELOW + : "Ọ" U1ECC # LATIN CAPITAL LETTER O WITH DOT BELOW + : "Ọ" U1ECC # LATIN CAPITAL LETTER O WITH DOT BELOW + : "ọ" U1ECD # LATIN SMALL LETTER O WITH DOT BELOW + : "ọ" U1ECD # LATIN SMALL LETTER O WITH DOT BELOW + : "Ỏ" U1ECE # LATIN CAPITAL LETTER O WITH HOOK ABOVE + : "Ỏ" U1ECE # LATIN CAPITAL LETTER O WITH HOOK ABOVE + : "ỏ" U1ECF # LATIN SMALL LETTER O WITH HOOK ABOVE + : "ỏ" U1ECF # LATIN SMALL LETTER O WITH HOOK ABOVE + : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE + : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE + : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE + : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE + : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE + : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE + : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE + : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE + : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE + : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE + : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE + : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE + : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE + : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE + : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE + : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE + : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE + : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE + : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE + : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE + : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE + : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE + : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE + : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE + : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE + : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE + : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE + : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE + : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE + : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE + : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE + : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE + : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE + : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE + : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE + : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE + : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE + : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE + : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE + : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE + : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE + : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE + : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE + : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE + : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE + : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW + : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW + : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW + : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW + : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW + : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW + : "Ụ" U1EE4 # LATIN CAPITAL LETTER U WITH DOT BELOW + : "Ụ" U1EE4 # LATIN CAPITAL LETTER U WITH DOT BELOW + : "ụ" U1EE5 # LATIN SMALL LETTER U WITH DOT BELOW + : "ụ" U1EE5 # LATIN SMALL LETTER U WITH DOT BELOW + : "Ủ" U1EE6 # LATIN CAPITAL LETTER U WITH HOOK ABOVE + : "Ủ" U1EE6 # LATIN CAPITAL LETTER U WITH HOOK ABOVE + : "ủ" U1EE7 # LATIN SMALL LETTER U WITH HOOK ABOVE + : "ủ" U1EE7 # LATIN SMALL LETTER U WITH HOOK ABOVE + : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE + : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE + : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE + : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE + : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE + : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE + : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE + : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE + : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE + : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE + : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE + : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE + : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE + : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE + : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE + : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE + : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE + : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE + : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE + : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE + : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE + : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE + : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE + : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE + : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE + : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE + : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE + : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE + : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE + : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE + : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE + : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE + : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE + : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW + : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW + : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW + : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW + : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW + : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW + : "Ỳ" U1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE + : "Ỳ" U1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE + : "ỳ" U1EF3 # LATIN SMALL LETTER Y WITH GRAVE + : "ỳ" U1EF3 # LATIN SMALL LETTER Y WITH GRAVE + : "Ỵ" U1EF4 # LATIN CAPITAL LETTER Y WITH DOT BELOW + : "Ỵ" U1EF4 # LATIN CAPITAL LETTER Y WITH DOT BELOW + : "ỵ" U1EF5 # LATIN SMALL LETTER Y WITH DOT BELOW + : "ỵ" U1EF5 # LATIN SMALL LETTER Y WITH DOT BELOW + : "Ỷ" U1EF6 # LATIN CAPITAL LETTER Y WITH HOOK ABOVE + : "Ỷ" U1EF6 # LATIN CAPITAL LETTER Y WITH HOOK ABOVE + : "ỷ" U1EF7 # LATIN SMALL LETTER Y WITH HOOK ABOVE + : "ỷ" U1EF7 # LATIN SMALL LETTER Y WITH HOOK ABOVE + : "Ỹ" U1EF8 # LATIN CAPITAL LETTER Y WITH TILDE + : "Ỹ" U1EF8 # LATIN CAPITAL LETTER Y WITH TILDE + : "ỹ" U1EF9 # LATIN SMALL LETTER Y WITH TILDE + : "ỹ" U1EF9 # LATIN SMALL LETTER Y WITH TILDE + : "ἀ" U1F00 # GREEK SMALL LETTER ALPHA WITH PSILI + : "ἀ" U1F00 # GREEK SMALL LETTER ALPHA WITH PSILI + : "ἁ" U1F01 # GREEK SMALL LETTER ALPHA WITH DASIA + : "ἁ" U1F01 # GREEK SMALL LETTER ALPHA WITH DASIA + : "ἂ" U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA + : "ἂ" U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA + : "ἂ" U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA + : "ἂ" U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA + : "ἂ" U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA + : "ἂ" U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA + : "ἃ" U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA + : "ἃ" U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA + : "ἃ" U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA + : "ἃ" U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA + : "ἃ" U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA + : "ἃ" U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA + : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA + : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA + : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA + : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA + : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA + : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA + : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA + : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA + : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA + : "ἆ" U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "ἆ" U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "ἆ" U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "ἆ" U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "ἆ" U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "ἆ" U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "ἇ" U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "ἇ" U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "ἇ" U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "ἇ" U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "ἇ" U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "ἇ" U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "Ἀ" U1F08 # GREEK CAPITAL LETTER ALPHA WITH PSILI + : "Ἀ" U1F08 # GREEK CAPITAL LETTER ALPHA WITH PSILI + : "Ἁ" U1F09 # GREEK CAPITAL LETTER ALPHA WITH DASIA + : "Ἁ" U1F09 # GREEK CAPITAL LETTER ALPHA WITH DASIA + : "Ἂ" U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA + : "Ἂ" U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA + : "Ἂ" U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA + : "Ἂ" U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA + : "Ἂ" U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA + : "Ἂ" U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA + : "Ἃ" U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA + : "Ἃ" U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA + : "Ἃ" U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA + : "Ἃ" U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA + : "Ἃ" U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA + : "Ἃ" U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA + : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA + : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA + : "Ἆ" U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "Ἆ" U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "Ἆ" U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "Ἆ" U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "Ἆ" U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "Ἆ" U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI + : "Ἇ" U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "Ἇ" U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "Ἇ" U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "Ἇ" U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "Ἇ" U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "Ἇ" U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI + : "ἐ" U1F10 # GREEK SMALL LETTER EPSILON WITH PSILI + : "ἐ" U1F10 # GREEK SMALL LETTER EPSILON WITH PSILI + : "ἑ" U1F11 # GREEK SMALL LETTER EPSILON WITH DASIA + : "ἑ" U1F11 # GREEK SMALL LETTER EPSILON WITH DASIA + : "ἒ" U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA + : "ἒ" U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA + : "ἒ" U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA + : "ἒ" U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA + : "ἒ" U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA + : "ἒ" U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA + : "ἓ" U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA + : "ἓ" U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA + : "ἓ" U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA + : "ἓ" U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA + : "ἓ" U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA + : "ἓ" U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA + : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA + : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA + : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA + : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA + : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA + : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA + : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA + : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA + : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA + : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + : "Ἐ" U1F18 # GREEK CAPITAL LETTER EPSILON WITH PSILI + : "Ἐ" U1F18 # GREEK CAPITAL LETTER EPSILON WITH PSILI + : "Ἑ" U1F19 # GREEK CAPITAL LETTER EPSILON WITH DASIA + : "Ἑ" U1F19 # GREEK CAPITAL LETTER EPSILON WITH DASIA + : "Ἒ" U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA + : "Ἒ" U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA + : "Ἒ" U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA + : "Ἒ" U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA + : "Ἒ" U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA + : "Ἒ" U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA + : "Ἓ" U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA + : "Ἓ" U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA + : "Ἓ" U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA + : "Ἓ" U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA + : "Ἓ" U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA + : "Ἓ" U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA + : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA + : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + : "ἠ" U1F20 # GREEK SMALL LETTER ETA WITH PSILI + : "ἠ" U1F20 # GREEK SMALL LETTER ETA WITH PSILI + : "ἡ" U1F21 # GREEK SMALL LETTER ETA WITH DASIA + : "ἡ" U1F21 # GREEK SMALL LETTER ETA WITH DASIA + : "ἢ" U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA + : "ἢ" U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA + : "ἢ" U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA + : "ἢ" U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA + : "ἢ" U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA + : "ἢ" U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA + : "ἣ" U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA + : "ἣ" U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA + : "ἣ" U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA + : "ἣ" U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA + : "ἣ" U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA + : "ἣ" U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA + : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA + : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA + : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA + : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA + : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA + : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA + : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA + : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA + : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA + : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA + : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA + : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA + : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA + : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA + : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA + : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA + : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA + : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA + : "ἦ" U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI + : "ἦ" U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI + : "ἦ" U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI + : "ἦ" U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI + : "ἦ" U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI + : "ἦ" U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI + : "ἧ" U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI + : "ἧ" U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI + : "ἧ" U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI + : "ἧ" U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI + : "ἧ" U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI + : "ἧ" U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI + : "Ἠ" U1F28 # GREEK CAPITAL LETTER ETA WITH PSILI + : "Ἠ" U1F28 # GREEK CAPITAL LETTER ETA WITH PSILI + : "Ἡ" U1F29 # GREEK CAPITAL LETTER ETA WITH DASIA + : "Ἡ" U1F29 # GREEK CAPITAL LETTER ETA WITH DASIA + : "Ἢ" U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA + : "Ἢ" U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA + : "Ἢ" U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA + : "Ἢ" U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA + : "Ἢ" U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA + : "Ἢ" U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA + : "Ἣ" U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA + : "Ἣ" U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA + : "Ἣ" U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA + : "Ἣ" U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA + : "Ἣ" U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA + : "Ἣ" U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA + : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA + : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA + : "Ἦ" U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI + : "Ἦ" U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI + : "Ἦ" U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI + : "Ἦ" U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI + : "Ἦ" U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI + : "Ἦ" U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI + : "Ἧ" U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + : "Ἧ" U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + : "Ἧ" U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + : "Ἧ" U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + : "Ἧ" U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + : "Ἧ" U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI + : "ἰ" U1F30 # GREEK SMALL LETTER IOTA WITH PSILI + : "ἰ" U1F30 # GREEK SMALL LETTER IOTA WITH PSILI + : "ἱ" U1F31 # GREEK SMALL LETTER IOTA WITH DASIA + : "ἱ" U1F31 # GREEK SMALL LETTER IOTA WITH DASIA + : "ἲ" U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA + : "ἲ" U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA + : "ἲ" U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA + : "ἲ" U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA + : "ἲ" U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA + : "ἲ" U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA + : "ἳ" U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA + : "ἳ" U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA + : "ἳ" U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA + : "ἳ" U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA + : "ἳ" U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA + : "ἳ" U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA + : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA + : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA + : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA + : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA + : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA + : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA + : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA + : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA + : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA + : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA + : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA + : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA + : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA + : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA + : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA + : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA + : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA + : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA + : "ἶ" U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI + : "ἶ" U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI + : "ἶ" U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI + : "ἶ" U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI + : "ἶ" U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI + : "ἶ" U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI + : "ἷ" U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI + : "ἷ" U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI + : "ἷ" U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI + : "ἷ" U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI + : "ἷ" U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI + : "ἷ" U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI + : "Ἰ" U1F38 # GREEK CAPITAL LETTER IOTA WITH PSILI + : "Ἰ" U1F38 # GREEK CAPITAL LETTER IOTA WITH PSILI + : "Ἱ" U1F39 # GREEK CAPITAL LETTER IOTA WITH DASIA + : "Ἱ" U1F39 # GREEK CAPITAL LETTER IOTA WITH DASIA + : "Ἲ" U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA + : "Ἲ" U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA + : "Ἲ" U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA + : "Ἲ" U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA + : "Ἲ" U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA + : "Ἲ" U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA + : "Ἳ" U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA + : "Ἳ" U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA + : "Ἳ" U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA + : "Ἳ" U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA + : "Ἳ" U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA + : "Ἳ" U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA + : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA + : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA + : "Ἶ" U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI + : "Ἶ" U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI + : "Ἶ" U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI + : "Ἶ" U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI + : "Ἶ" U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI + : "Ἶ" U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI + : "Ἷ" U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI + : "Ἷ" U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI + : "Ἷ" U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI + : "Ἷ" U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI + : "Ἷ" U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI + : "Ἷ" U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI + : "ὀ" U1F40 # GREEK SMALL LETTER OMICRON WITH PSILI + : "ὀ" U1F40 # GREEK SMALL LETTER OMICRON WITH PSILI + : "ὁ" U1F41 # GREEK SMALL LETTER OMICRON WITH DASIA + : "ὁ" U1F41 # GREEK SMALL LETTER OMICRON WITH DASIA + : "ὂ" U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA + : "ὂ" U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA + : "ὂ" U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA + : "ὂ" U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA + : "ὂ" U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA + : "ὂ" U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA + : "ὃ" U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA + : "ὃ" U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA + : "ὃ" U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA + : "ὃ" U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA + : "ὃ" U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA + : "ὃ" U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA + : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA + : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA + : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA + : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA + : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA + : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA + : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA + : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA + : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA + : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + : "Ὀ" U1F48 # GREEK CAPITAL LETTER OMICRON WITH PSILI + : "Ὀ" U1F48 # GREEK CAPITAL LETTER OMICRON WITH PSILI + : "Ὁ" U1F49 # GREEK CAPITAL LETTER OMICRON WITH DASIA + : "Ὁ" U1F49 # GREEK CAPITAL LETTER OMICRON WITH DASIA + : "Ὂ" U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA + : "Ὂ" U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA + : "Ὂ" U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA + : "Ὂ" U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA + : "Ὂ" U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA + : "Ὂ" U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA + : "Ὃ" U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA + : "Ὃ" U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA + : "Ὃ" U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA + : "Ὃ" U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA + : "Ὃ" U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA + : "Ὃ" U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA + : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA + : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + : "ὐ" U1F50 # GREEK SMALL LETTER UPSILON WITH PSILI + : "ὐ" U1F50 # GREEK SMALL LETTER UPSILON WITH PSILI + : "ὑ" U1F51 # GREEK SMALL LETTER UPSILON WITH DASIA + : "ὑ" U1F51 # GREEK SMALL LETTER UPSILON WITH DASIA + : "ὒ" U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA + : "ὒ" U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA + : "ὒ" U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA + : "ὒ" U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA + : "ὒ" U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA + : "ὒ" U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA + : "ὓ" U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA + : "ὓ" U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA + : "ὓ" U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA + : "ὓ" U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA + : "ὓ" U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA + : "ὓ" U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA + : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA + : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA + : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA + : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA + : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA + : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA + : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA + : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA + : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA + : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA + : "ὖ" U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI + : "ὖ" U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI + : "ὖ" U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI + : "ὖ" U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI + : "ὖ" U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI + : "ὖ" U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI + : "ὗ" U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "ὗ" U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "ὗ" U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "ὗ" U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "ὗ" U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "ὗ" U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "Ὑ" U1F59 # GREEK CAPITAL LETTER UPSILON WITH DASIA + : "Ὑ" U1F59 # GREEK CAPITAL LETTER UPSILON WITH DASIA + : "Ὓ" U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + : "Ὓ" U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + : "Ὓ" U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + : "Ὓ" U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + : "Ὓ" U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + : "Ὓ" U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA + : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA + : "Ὗ" U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "Ὗ" U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "Ὗ" U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "Ὗ" U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "Ὗ" U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "Ὗ" U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + : "ὠ" U1F60 # GREEK SMALL LETTER OMEGA WITH PSILI + : "ὠ" U1F60 # GREEK SMALL LETTER OMEGA WITH PSILI + : "ὡ" U1F61 # GREEK SMALL LETTER OMEGA WITH DASIA + : "ὡ" U1F61 # GREEK SMALL LETTER OMEGA WITH DASIA + : "ὢ" U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA + : "ὢ" U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA + : "ὢ" U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA + : "ὢ" U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA + : "ὢ" U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA + : "ὢ" U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA + : "ὣ" U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA + : "ὣ" U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA + : "ὣ" U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA + : "ὣ" U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA + : "ὣ" U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA + : "ὣ" U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA + : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA + : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA + : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA + : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA + : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA + : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA + : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA + : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA + : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA + : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA + : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA + : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA + : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA + : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA + : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA + : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA + : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA + : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA + : "ὦ" U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "ὦ" U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "ὦ" U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "ὦ" U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "ὦ" U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "ὦ" U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "ὧ" U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "ὧ" U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "ὧ" U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "ὧ" U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "ὧ" U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "ὧ" U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "Ὠ" U1F68 # GREEK CAPITAL LETTER OMEGA WITH PSILI + : "Ὠ" U1F68 # GREEK CAPITAL LETTER OMEGA WITH PSILI + : "Ὡ" U1F69 # GREEK CAPITAL LETTER OMEGA WITH DASIA + : "Ὡ" U1F69 # GREEK CAPITAL LETTER OMEGA WITH DASIA + : "Ὢ" U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA + : "Ὢ" U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA + : "Ὢ" U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA + : "Ὢ" U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA + : "Ὢ" U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA + : "Ὢ" U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA + : "Ὣ" U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA + : "Ὣ" U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA + : "Ὣ" U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA + : "Ὣ" U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA + : "Ὣ" U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA + : "Ὣ" U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA + : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA + : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA + : "Ὦ" U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "Ὦ" U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "Ὦ" U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "Ὦ" U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "Ὦ" U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "Ὦ" U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI + : "Ὧ" U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "Ὧ" U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "Ὧ" U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "Ὧ" U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "Ὧ" U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "Ὧ" U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI + : "ὰ" U1F70 # GREEK SMALL LETTER ALPHA WITH VARIA + : "ὰ" U1F70 # GREEK SMALL LETTER ALPHA WITH VARIA + : "ὲ" U1F72 # GREEK SMALL LETTER EPSILON WITH VARIA + : "ὲ" U1F72 # GREEK SMALL LETTER EPSILON WITH VARIA + : "ὴ" U1F74 # GREEK SMALL LETTER ETA WITH VARIA + : "ὴ" U1F74 # GREEK SMALL LETTER ETA WITH VARIA + : "ὶ" U1F76 # GREEK SMALL LETTER IOTA WITH VARIA + : "ὶ" U1F76 # GREEK SMALL LETTER IOTA WITH VARIA + : "ὸ" U1F78 # GREEK SMALL LETTER OMICRON WITH VARIA + : "ὸ" U1F78 # GREEK SMALL LETTER OMICRON WITH VARIA + : "ὺ" U1F7A # GREEK SMALL LETTER UPSILON WITH VARIA + : "ὺ" U1F7A # GREEK SMALL LETTER UPSILON WITH VARIA + : "ὼ" U1F7C # GREEK SMALL LETTER OMEGA WITH VARIA + : "ὼ" U1F7C # GREEK SMALL LETTER OMEGA WITH VARIA + : "ᾀ" U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI + : "ᾀ" U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI + : "ᾀ" U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI + : "ᾀ" U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI + : "ᾀ" U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI + : "ᾀ" U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI + : "ᾁ" U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI + : "ᾁ" U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI + : "ᾁ" U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI + : "ᾁ" U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI + : "ᾁ" U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI + : "ᾁ" U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾈ" U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + : "ᾈ" U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + : "ᾈ" U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + : "ᾈ" U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + : "ᾈ" U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + : "ᾈ" U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + : "ᾉ" U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI + : "ᾉ" U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI + : "ᾉ" U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI + : "ᾉ" U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI + : "ᾉ" U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI + : "ᾉ" U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾐ" U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI + : "ᾐ" U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI + : "ᾐ" U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI + : "ᾐ" U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI + : "ᾐ" U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI + : "ᾐ" U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI + : "ᾑ" U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI + : "ᾑ" U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI + : "ᾑ" U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI + : "ᾑ" U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI + : "ᾑ" U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI + : "ᾑ" U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾘ" U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI + : "ᾘ" U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI + : "ᾘ" U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI + : "ᾘ" U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI + : "ᾘ" U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI + : "ᾘ" U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI + : "ᾙ" U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI + : "ᾙ" U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI + : "ᾙ" U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI + : "ᾙ" U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI + : "ᾙ" U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI + : "ᾙ" U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾠ" U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI + : "ᾠ" U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI + : "ᾠ" U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI + : "ᾠ" U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI + : "ᾠ" U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI + : "ᾠ" U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI + : "ᾡ" U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI + : "ᾡ" U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI + : "ᾡ" U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI + : "ᾡ" U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI + : "ᾡ" U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI + : "ᾡ" U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI + : "ᾨ" U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI + : "ᾨ" U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI + : "ᾨ" U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI + : "ᾨ" U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI + : "ᾨ" U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI + : "ᾨ" U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI + : "ᾩ" U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI + : "ᾩ" U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI + : "ᾩ" U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI + : "ᾩ" U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI + : "ᾩ" U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI + : "ᾩ" U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI + : "ᾰ" U1FB0 # GREEK SMALL LETTER ALPHA WITH VRACHY + : "ᾰ" U1FB0 # GREEK SMALL LETTER ALPHA WITH VRACHY + : "ᾰ" U1FB0 # GREEK SMALL LETTER ALPHA WITH VRACHY + : "ᾱ" U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON + : "ᾱ" U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON + : "ᾱ" U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON + : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI + : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI + : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI + : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI + : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI + : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI + : "ᾳ" U1FB3 # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI + : "ᾳ" U1FB3 # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI + : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + : "ᾶ" U1FB6 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI + : "ᾶ" U1FB6 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI + : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI + : "Ᾰ" U1FB8 # GREEK CAPITAL LETTER ALPHA WITH VRACHY + : "Ᾰ" U1FB8 # GREEK CAPITAL LETTER ALPHA WITH VRACHY + : "Ᾰ" U1FB8 # GREEK CAPITAL LETTER ALPHA WITH VRACHY + : "Ᾱ" U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON + : "Ᾱ" U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON + : "Ᾱ" U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON + : "Ὰ" U1FBA # GREEK CAPITAL LETTER ALPHA WITH VARIA + : "Ὰ" U1FBA # GREEK CAPITAL LETTER ALPHA WITH VARIA + : "ᾼ" U1FBC # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI + : "ᾼ" U1FBC # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI + : "῁" U1FC1 # GREEK DIALYTIKA AND PERISPOMENI + : "῁" U1FC1 # GREEK DIALYTIKA AND PERISPOMENI + : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI + : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI + : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI + : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI + : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI + : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI + : "ῃ" U1FC3 # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI + : "ῃ" U1FC3 # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI + : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + : "ῆ" U1FC6 # GREEK SMALL LETTER ETA WITH PERISPOMENI + : "ῆ" U1FC6 # GREEK SMALL LETTER ETA WITH PERISPOMENI + : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI + : "Ὲ" U1FC8 # GREEK CAPITAL LETTER EPSILON WITH VARIA + : "Ὲ" U1FC8 # GREEK CAPITAL LETTER EPSILON WITH VARIA + : "Ὴ" U1FCA # GREEK CAPITAL LETTER ETA WITH VARIA + : "Ὴ" U1FCA # GREEK CAPITAL LETTER ETA WITH VARIA + : "ῌ" U1FCC # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI + : "ῌ" U1FCC # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI + : "῍" U1FCD # GREEK PSILI AND VARIA + : "῍" U1FCD # GREEK PSILI AND VARIA + : "῎" U1FCE # GREEK PSILI AND OXIA + : "῎" U1FCE # GREEK PSILI AND OXIA + : "῎" U1FCE # GREEK PSILI AND OXIA + : "῏" U1FCF # GREEK PSILI AND PERISPOMENI + : "῏" U1FCF # GREEK PSILI AND PERISPOMENI + : "ῐ" U1FD0 # GREEK SMALL LETTER IOTA WITH VRACHY + : "ῐ" U1FD0 # GREEK SMALL LETTER IOTA WITH VRACHY + : "ῐ" U1FD0 # GREEK SMALL LETTER IOTA WITH VRACHY + : "ῑ" U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON + : "ῑ" U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON + : "ῑ" U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON + : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA + : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA + : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA + : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA + : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA + : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA + : "ῖ" U1FD6 # GREEK SMALL LETTER IOTA WITH PERISPOMENI + : "ῖ" U1FD6 # GREEK SMALL LETTER IOTA WITH PERISPOMENI + : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI + : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI + : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI + : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI + : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI + : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI + : "Ῐ" U1FD8 # GREEK CAPITAL LETTER IOTA WITH VRACHY + : "Ῐ" U1FD8 # GREEK CAPITAL LETTER IOTA WITH VRACHY + : "Ῐ" U1FD8 # GREEK CAPITAL LETTER IOTA WITH VRACHY + : "Ῑ" U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON + : "Ῑ" U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON + : "Ῑ" U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON + : "Ὶ" U1FDA # GREEK CAPITAL LETTER IOTA WITH VARIA + : "Ὶ" U1FDA # GREEK CAPITAL LETTER IOTA WITH VARIA + : "῝" U1FDD # GREEK DASIA AND VARIA + : "῝" U1FDD # GREEK DASIA AND VARIA + : "῞" U1FDE # GREEK DASIA AND OXIA + : "῞" U1FDE # GREEK DASIA AND OXIA + : "῞" U1FDE # GREEK DASIA AND OXIA + : "῟" U1FDF # GREEK DASIA AND PERISPOMENI + : "῟" U1FDF # GREEK DASIA AND PERISPOMENI + : "ῠ" U1FE0 # GREEK SMALL LETTER UPSILON WITH VRACHY + : "ῠ" U1FE0 # GREEK SMALL LETTER UPSILON WITH VRACHY + : "ῠ" U1FE0 # GREEK SMALL LETTER UPSILON WITH VRACHY + : "ῡ" U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON + : "ῡ" U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON + : "ῡ" U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON + : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA + : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA + : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA + : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA + : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA + : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA + : "ῤ" U1FE4 # GREEK SMALL LETTER RHO WITH PSILI + : "ῤ" U1FE4 # GREEK SMALL LETTER RHO WITH PSILI + : "ῥ" U1FE5 # GREEK SMALL LETTER RHO WITH DASIA + : "ῥ" U1FE5 # GREEK SMALL LETTER RHO WITH DASIA + : "ῦ" U1FE6 # GREEK SMALL LETTER UPSILON WITH PERISPOMENI + : "ῦ" U1FE6 # GREEK SMALL LETTER UPSILON WITH PERISPOMENI + : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI + : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI + : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI + : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI + : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI + : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI + : "Ῠ" U1FE8 # GREEK CAPITAL LETTER UPSILON WITH VRACHY + : "Ῠ" U1FE8 # GREEK CAPITAL LETTER UPSILON WITH VRACHY + : "Ῠ" U1FE8 # GREEK CAPITAL LETTER UPSILON WITH VRACHY + : "Ῡ" U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON + : "Ῡ" U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON + : "Ῡ" U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON + : "Ὺ" U1FEA # GREEK CAPITAL LETTER UPSILON WITH VARIA + : "Ὺ" U1FEA # GREEK CAPITAL LETTER UPSILON WITH VARIA + : "Ῥ" U1FEC # GREEK CAPITAL LETTER RHO WITH DASIA + : "Ῥ" U1FEC # GREEK CAPITAL LETTER RHO WITH DASIA + : "῭" U1FED # GREEK DIALYTIKA AND VARIA + : "῭" U1FED # GREEK DIALYTIKA AND VARIA + : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI + : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI + : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI + : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI + : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI + : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI + : "ῳ" U1FF3 # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI + : "ῳ" U1FF3 # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI + : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + : "ῶ" U1FF6 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI + : "ῶ" U1FF6 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI + : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + : "Ὸ" U1FF8 # GREEK CAPITAL LETTER OMICRON WITH VARIA + : "Ὸ" U1FF8 # GREEK CAPITAL LETTER OMICRON WITH VARIA + : "Ὼ" U1FFA # GREEK CAPITAL LETTER OMEGA WITH VARIA + : "Ὼ" U1FFA # GREEK CAPITAL LETTER OMEGA WITH VARIA + : "ῼ" U1FFC # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + : "ῼ" U1FFC # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + <0> : "⁰" U2070 # SUPERSCRIPT ZERO + <0> : "⁰" U2070 # SUPERSCRIPT ZERO + : "⁰" U2070 # SUPERSCRIPT ZERO + : "⁰" U2070 # SUPERSCRIPT ZERO + : "ⁱ" U2071 # SUPERSCRIPT LATIN SMALL LETTER I + : "ⁱ" U2071 # SUPERSCRIPT LATIN SMALL LETTER I + : "ⁱ" U2071 # SUPERSCRIPT LATIN SMALL LETTER I + : "ⁱ" U2071 # SUPERSCRIPT LATIN SMALL LETTER I + <4> : "⁴" U2074 # SUPERSCRIPT FOUR + <4> : "⁴" U2074 # SUPERSCRIPT FOUR + : "⁴" U2074 # SUPERSCRIPT FOUR + : "⁴" U2074 # SUPERSCRIPT FOUR + <5> : "⁵" U2075 # SUPERSCRIPT FIVE + <5> : "⁵" U2075 # SUPERSCRIPT FIVE + : "⁵" U2075 # SUPERSCRIPT FIVE + : "⁵" U2075 # SUPERSCRIPT FIVE + <6> : "⁶" U2076 # SUPERSCRIPT SIX + <6> : "⁶" U2076 # SUPERSCRIPT SIX + : "⁶" U2076 # SUPERSCRIPT SIX + : "⁶" U2076 # SUPERSCRIPT SIX + <7> : "⁷" U2077 # SUPERSCRIPT SEVEN + <7> : "⁷" U2077 # SUPERSCRIPT SEVEN + : "⁷" U2077 # SUPERSCRIPT SEVEN + : "⁷" U2077 # SUPERSCRIPT SEVEN + <8> : "⁸" U2078 # SUPERSCRIPT EIGHT + <8> : "⁸" U2078 # SUPERSCRIPT EIGHT + : "⁸" U2078 # SUPERSCRIPT EIGHT + : "⁸" U2078 # SUPERSCRIPT EIGHT + <9> : "⁹" U2079 # SUPERSCRIPT NINE + <9> : "⁹" U2079 # SUPERSCRIPT NINE + : "⁹" U2079 # SUPERSCRIPT NINE + : "⁹" U2079 # SUPERSCRIPT NINE + : "⁺" U207A # SUPERSCRIPT PLUS SIGN + : "⁺" U207A # SUPERSCRIPT PLUS SIGN + : "⁺" U207A # SUPERSCRIPT PLUS SIGN + : "⁺" U207A # SUPERSCRIPT PLUS SIGN + : "⁻" U207B # SUPERSCRIPT MINUS + : "⁻" U207B # SUPERSCRIPT MINUS + : "⁼" U207C # SUPERSCRIPT EQUALS SIGN + : "⁼" U207C # SUPERSCRIPT EQUALS SIGN + : "⁼" U207C # SUPERSCRIPT EQUALS SIGN + : "⁼" U207C # SUPERSCRIPT EQUALS SIGN + : "⁽" U207D # SUPERSCRIPT LEFT PARENTHESIS + : "⁽" U207D # SUPERSCRIPT LEFT PARENTHESIS + : "⁾" U207E # SUPERSCRIPT RIGHT PARENTHESIS + : "⁾" U207E # SUPERSCRIPT RIGHT PARENTHESIS + : "ⁿ" U207F # SUPERSCRIPT LATIN SMALL LETTER N + : "ⁿ" U207F # SUPERSCRIPT LATIN SMALL LETTER N + : "ⁿ" U207F # SUPERSCRIPT LATIN SMALL LETTER N + : "ⁿ" U207F # SUPERSCRIPT LATIN SMALL LETTER N + <0> : "₀" U2080 # SUBSCRIPT ZERO + : "₀" U2080 # SUBSCRIPT ZERO + <0> : "₀" U2080 # SUBSCRIPT ZERO + : "₀" U2080 # SUBSCRIPT ZERO + <1> : "₁" U2081 # SUBSCRIPT ONE + : "₁" U2081 # SUBSCRIPT ONE + <1> : "₁" U2081 # SUBSCRIPT ONE + : "₁" U2081 # SUBSCRIPT ONE + <2> : "₂" U2082 # SUBSCRIPT TWO + : "₂" U2082 # SUBSCRIPT TWO + : "₂" U2082 # SUBSCRIPT TWO + <2> : "₂" U2082 # SUBSCRIPT TWO + : "₂" U2082 # SUBSCRIPT TWO + : "₂" U2082 # SUBSCRIPT TWO + <3> : "₃" U2083 # SUBSCRIPT THREE + : "₃" U2083 # SUBSCRIPT THREE + <3> : "₃" U2083 # SUBSCRIPT THREE + : "₃" U2083 # SUBSCRIPT THREE + <4> : "₄" U2084 # SUBSCRIPT FOUR + : "₄" U2084 # SUBSCRIPT FOUR + <4> : "₄" U2084 # SUBSCRIPT FOUR + : "₄" U2084 # SUBSCRIPT FOUR + <5> : "₅" U2085 # SUBSCRIPT FIVE + : "₅" U2085 # SUBSCRIPT FIVE + <5> : "₅" U2085 # SUBSCRIPT FIVE + : "₅" U2085 # SUBSCRIPT FIVE + <6> : "₆" U2086 # SUBSCRIPT SIX + : "₆" U2086 # SUBSCRIPT SIX + <6> : "₆" U2086 # SUBSCRIPT SIX + : "₆" U2086 # SUBSCRIPT SIX + <7> : "₇" U2087 # SUBSCRIPT SEVEN + : "₇" U2087 # SUBSCRIPT SEVEN + <7> : "₇" U2087 # SUBSCRIPT SEVEN + : "₇" U2087 # SUBSCRIPT SEVEN + <8> : "₈" U2088 # SUBSCRIPT EIGHT + : "₈" U2088 # SUBSCRIPT EIGHT + <8> : "₈" U2088 # SUBSCRIPT EIGHT + : "₈" U2088 # SUBSCRIPT EIGHT + <9> : "₉" U2089 # SUBSCRIPT NINE + : "₉" U2089 # SUBSCRIPT NINE + <9> : "₉" U2089 # SUBSCRIPT NINE + : "₉" U2089 # SUBSCRIPT NINE + : "₊" U208A # SUBSCRIPT PLUS SIGN + : "₊" U208A # SUBSCRIPT PLUS SIGN + : "₊" U208A # SUBSCRIPT PLUS SIGN + : "₊" U208A # SUBSCRIPT PLUS SIGN + : "₋" U208B # SUBSCRIPT MINUS + : "₋" U208B # SUBSCRIPT MINUS + : "₌" U208C # SUBSCRIPT EQUALS SIGN + : "₌" U208C # SUBSCRIPT EQUALS SIGN + : "₌" U208C # SUBSCRIPT EQUALS SIGN + : "₌" U208C # SUBSCRIPT EQUALS SIGN + : "₍" U208D # SUBSCRIPT LEFT PARENTHESIS + : "₍" U208D # SUBSCRIPT LEFT PARENTHESIS + : "₎" U208E # SUBSCRIPT RIGHT PARENTHESIS + : "₎" U208E # SUBSCRIPT RIGHT PARENTHESIS + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + <1> <7> : "⅐" U2150 # VULGAR FRACTION ONE SEVENTH + <1> <9> : "⅑" U2151 # VULGAR FRACTION ONE NINTH + <1> <1> <0> : "⅒" U2152 # VULGAR FRACTION ONE TENTH + <1> <3> : "⅓" U2153 # VULGAR FRACTION ONE THIRD + <2> <3> : "⅔" U2154 # VULGAR FRACTION TWO THIRDS + <1> <5> : "⅕" U2155 # VULGAR FRACTION ONE FIFTH + <2> <5> : "⅖" U2156 # VULGAR FRACTION TWO FIFTHS + <3> <5> : "⅗" U2157 # VULGAR FRACTION THREE FIFTHS + <4> <5> : "⅘" U2158 # VULGAR FRACTION FOUR FIFTHS + <1> <6> : "⅙" U2159 # VULGAR FRACTION ONE SIXTH + <5> <6> : "⅚" U215A # VULGAR FRACTION FIVE SIXTHS + <1> <8> : "⅛" U215B # VULGAR FRACTION ONE EIGHTH + <3> <8> : "⅜" U215C # VULGAR FRACTION THREE EIGHTHS + <5> <8> : "⅝" U215D # VULGAR FRACTION FIVE EIGHTHS + <7> <8> : "⅞" U215E # VULGAR FRACTION SEVEN EIGHTHS + <0> <3> : "↉" U2189 # VULGAR FRACTION ZERO THIRDS + : "↚" U219A # LEFTWARDS ARROW WITH STROKE + : "↚" U219A # LEFTWARDS ARROW WITH STROKE + : "↛" U219B # RIGHTWARDS ARROW WITH STROKE + : "↛" U219B # RIGHTWARDS ARROW WITH STROKE + : "↮" U21AE # LEFT RIGHT ARROW WITH STROKE + : "↮" U21AE # LEFT RIGHT ARROW WITH STROKE + : "←" U2190 # LEFTWARDS ARROW + : "→" U2192 # RIGHTWARDS ARROW + : "∄" U2204 # THERE DOES NOT EXIST + : "∅" U2205 # EMPTY SET + : "∉" U2209 # NOT AN ELEMENT OF + : "∌" U220C # DOES NOT CONTAIN AS MEMBER + : "∤" U2224 # DOES NOT DIVIDE + : "∦" U2226 # NOT PARALLEL TO + : "≁" U2241 # NOT TILDE + : "≄" U2244 # NOT ASYMPTOTICALLY EQUAL TO + : "≇" U2247 # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO + : "≉" U2249 # NOT ALMOST EQUAL TO + : "≠" U2260 # NOT EQUAL TO + : "≠" U2260 # NOT EQUAL TO + : "≠" U2260 # NOT EQUAL TO + : "≠" U2260 # NOT EQUAL TO + : "≢" U2262 # NOT IDENTICAL TO + : "≤" U2264 # LESS-THAN OR EQUAL TO + : "≥" U2265 # GREATER-THAN OR EQUAL TO + : "≭" U226D # NOT EQUIVALENT TO + : "≮" U226E # NOT LESS-THAN + : "≮" U226E # NOT LESS-THAN + : "≯" U226F # NOT GREATER-THAN + : "≯" U226F # NOT GREATER-THAN + : "≰" U2270 # NEITHER LESS-THAN NOR EQUAL TO + : "≱" U2271 # NEITHER GREATER-THAN NOR EQUAL TO + : "≴" U2274 # NEITHER LESS-THAN NOR EQUIVALENT TO + : "≵" U2275 # NEITHER GREATER-THAN NOR EQUIVALENT TO + : "≸" U2278 # NEITHER LESS-THAN NOR GREATER-THAN + : "≹" U2279 # NEITHER GREATER-THAN NOR LESS-THAN + : "⊀" U2280 # DOES NOT PRECEDE + : "⊁" U2281 # DOES NOT SUCCEED + : "⊄" U2284 # NOT A SUBSET OF + : "⊄" U2284 # NOT A SUBSET OF + : "⊅" U2285 # NOT A SUPERSET OF + : "⊅" U2285 # NOT A SUPERSET OF + : "⊈" U2288 # NEITHER A SUBSET OF NOR EQUAL TO + : "⊉" U2289 # NEITHER A SUPERSET OF NOR EQUAL TO + : "⊬" U22AC # DOES NOT PROVE + : "⊭" U22AD # NOT TRUE + : "⊮" U22AE # DOES NOT FORCE + : "⊯" U22AF # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE + : "⋠" U22E0 # DOES NOT PRECEDE OR EQUAL + : "⋡" U22E1 # DOES NOT SUCCEED OR EQUAL + : "⋢" U22E2 # NOT SQUARE IMAGE OF OR EQUAL TO + : "⋣" U22E3 # NOT SQUARE ORIGINAL OF OR EQUAL TO + : "⋪" U22EA # NOT NORMAL SUBGROUP OF + : "⋫" U22EB # DOES NOT CONTAIN AS NORMAL SUBGROUP + : "⋬" U22EC # NOT NORMAL SUBGROUP OF OR EQUAL TO + : "⋭" U22ED # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL + : "⌀" U2300 # DIAMETER SIGN + <1> : "①" U2460 # CIRCLED DIGIT ONE + : "①" U2460 # CIRCLED DIGIT ONE + <2> : "②" U2461 # CIRCLED DIGIT TWO + : "②" U2461 # CIRCLED DIGIT TWO + : "②" U2461 # CIRCLED DIGIT TWO + <3> : "③" U2462 # CIRCLED DIGIT THREE + : "③" U2462 # CIRCLED DIGIT THREE + <4> : "④" U2463 # CIRCLED DIGIT FOUR + : "④" U2463 # CIRCLED DIGIT FOUR + <5> : "⑤" U2464 # CIRCLED DIGIT FIVE + : "⑤" U2464 # CIRCLED DIGIT FIVE + <6> : "⑥" U2465 # CIRCLED DIGIT SIX + : "⑥" U2465 # CIRCLED DIGIT SIX + <7> : "⑦" U2466 # CIRCLED DIGIT SEVEN + : "⑦" U2466 # CIRCLED DIGIT SEVEN + <8> : "⑧" U2467 # CIRCLED DIGIT EIGHT + : "⑧" U2467 # CIRCLED DIGIT EIGHT + <9> : "⑨" U2468 # CIRCLED DIGIT NINE + : "⑨" U2468 # CIRCLED DIGIT NINE + <1> <0> : "⑩" U2469 # CIRCLED NUMBER TEN + <1> : "⑩" U2469 # CIRCLED NUMBER TEN + <0> : "⑩" U2469 # CIRCLED NUMBER TEN + : "⑩" U2469 # CIRCLED NUMBER TEN + <1> <1> : "⑪" U246A # CIRCLED NUMBER ELEVEN + <1> : "⑪" U246A # CIRCLED NUMBER ELEVEN + <1> : "⑪" U246A # CIRCLED NUMBER ELEVEN + : "⑪" U246A # CIRCLED NUMBER ELEVEN + <1> <2> : "⑫" U246B # CIRCLED NUMBER TWELVE + <1> : "⑫" U246B # CIRCLED NUMBER TWELVE + <1> : "⑫" U246B # CIRCLED NUMBER TWELVE + <2> : "⑫" U246B # CIRCLED NUMBER TWELVE + : "⑫" U246B # CIRCLED NUMBER TWELVE + : "⑫" U246B # CIRCLED NUMBER TWELVE + <1> <3> : "⑬" U246C # CIRCLED NUMBER THIRTEEN + <1> : "⑬" U246C # CIRCLED NUMBER THIRTEEN + <3> : "⑬" U246C # CIRCLED NUMBER THIRTEEN + : "⑬" U246C # CIRCLED NUMBER THIRTEEN + <1> <4> : "⑭" U246D # CIRCLED NUMBER FOURTEEN + <1> : "⑭" U246D # CIRCLED NUMBER FOURTEEN + <4> : "⑭" U246D # CIRCLED NUMBER FOURTEEN + : "⑭" U246D # CIRCLED NUMBER FOURTEEN + <1> <5> : "⑮" U246E # CIRCLED NUMBER FIFTEEN + <1> : "⑮" U246E # CIRCLED NUMBER FIFTEEN + <5> : "⑮" U246E # CIRCLED NUMBER FIFTEEN + : "⑮" U246E # CIRCLED NUMBER FIFTEEN + <1> <6> : "⑯" U246F # CIRCLED NUMBER SIXTEEN + <1> : "⑯" U246F # CIRCLED NUMBER SIXTEEN + <6> : "⑯" U246F # CIRCLED NUMBER SIXTEEN + : "⑯" U246F # CIRCLED NUMBER SIXTEEN + <1> <7> : "⑰" U2470 # CIRCLED NUMBER SEVENTEEN + <1> : "⑰" U2470 # CIRCLED NUMBER SEVENTEEN + <7> : "⑰" U2470 # CIRCLED NUMBER SEVENTEEN + : "⑰" U2470 # CIRCLED NUMBER SEVENTEEN + <1> <8> : "⑱" U2471 # CIRCLED NUMBER EIGHTEEN + <1> : "⑱" U2471 # CIRCLED NUMBER EIGHTEEN + <8> : "⑱" U2471 # CIRCLED NUMBER EIGHTEEN + : "⑱" U2471 # CIRCLED NUMBER EIGHTEEN + <1> <9> : "⑲" U2472 # CIRCLED NUMBER NINETEEN + <1> : "⑲" U2472 # CIRCLED NUMBER NINETEEN + <9> : "⑲" U2472 # CIRCLED NUMBER NINETEEN + : "⑲" U2472 # CIRCLED NUMBER NINETEEN + <2> <0> : "⑳" U2473 # CIRCLED NUMBER TWENTY + <2> : "⑳" U2473 # CIRCLED NUMBER TWENTY + <0> : "⑳" U2473 # CIRCLED NUMBER TWENTY + : "⑳" U2473 # CIRCLED NUMBER TWENTY + <0> : "⑳" U2473 # CIRCLED NUMBER TWENTY + : "⑳" U2473 # CIRCLED NUMBER TWENTY + : "Ⓐ" U24B6 # CIRCLED LATIN CAPITAL LETTER A + : "Ⓑ" U24B7 # CIRCLED LATIN CAPITAL LETTER B + : "Ⓒ" U24B8 # CIRCLED LATIN CAPITAL LETTER C + : "Ⓓ" U24B9 # CIRCLED LATIN CAPITAL LETTER D + : "Ⓔ" U24BA # CIRCLED LATIN CAPITAL LETTER E + : "Ⓕ" U24BB # CIRCLED LATIN CAPITAL LETTER F + : "Ⓖ" U24BC # CIRCLED LATIN CAPITAL LETTER G + : "Ⓗ" U24BD # CIRCLED LATIN CAPITAL LETTER H + : "Ⓘ" U24BE # CIRCLED LATIN CAPITAL LETTER I + : "Ⓙ" U24BF # CIRCLED LATIN CAPITAL LETTER J + : "Ⓚ" U24C0 # CIRCLED LATIN CAPITAL LETTER K + : "Ⓛ" U24C1 # CIRCLED LATIN CAPITAL LETTER L + : "Ⓜ" U24C2 # CIRCLED LATIN CAPITAL LETTER M + : "Ⓝ" U24C3 # CIRCLED LATIN CAPITAL LETTER N + : "Ⓞ" U24C4 # CIRCLED LATIN CAPITAL LETTER O +

: "Ⓟ" U24C5 # CIRCLED LATIN CAPITAL LETTER P + : "Ⓠ" U24C6 # CIRCLED LATIN CAPITAL LETTER Q + : "Ⓡ" U24C7 # CIRCLED LATIN CAPITAL LETTER R + : "Ⓢ" U24C8 # CIRCLED LATIN CAPITAL LETTER S + : "Ⓣ" U24C9 # CIRCLED LATIN CAPITAL LETTER T + : "Ⓤ" U24CA # CIRCLED LATIN CAPITAL LETTER U + : "Ⓥ" U24CB # CIRCLED LATIN CAPITAL LETTER V + : "Ⓦ" U24CC # CIRCLED LATIN CAPITAL LETTER W + : "Ⓧ" U24CD # CIRCLED LATIN CAPITAL LETTER X + : "Ⓨ" U24CE # CIRCLED LATIN CAPITAL LETTER Y + : "Ⓩ" U24CF # CIRCLED LATIN CAPITAL LETTER Z + : "ⓐ" U24D0 # CIRCLED LATIN SMALL LETTER A + : "ⓑ" U24D1 # CIRCLED LATIN SMALL LETTER B + : "ⓒ" U24D2 # CIRCLED LATIN SMALL LETTER C + : "ⓓ" U24D3 # CIRCLED LATIN SMALL LETTER D + : "ⓔ" U24D4 # CIRCLED LATIN SMALL LETTER E + : "ⓕ" U24D5 # CIRCLED LATIN SMALL LETTER F + : "ⓖ" U24D6 # CIRCLED LATIN SMALL LETTER G + : "ⓗ" U24D7 # CIRCLED LATIN SMALL LETTER H + : "ⓘ" U24D8 # CIRCLED LATIN SMALL LETTER I + : "ⓙ" U24D9 # CIRCLED LATIN SMALL LETTER J + : "ⓚ" U24DA # CIRCLED LATIN SMALL LETTER K + : "ⓛ" U24DB # CIRCLED LATIN SMALL LETTER L + : "ⓜ" U24DC # CIRCLED LATIN SMALL LETTER M + : "ⓝ" U24DD # CIRCLED LATIN SMALL LETTER N + : "ⓞ" U24DE # CIRCLED LATIN SMALL LETTER O +

: "ⓟ" U24DF # CIRCLED LATIN SMALL LETTER P + : "ⓠ" U24E0 # CIRCLED LATIN SMALL LETTER Q + : "ⓡ" U24E1 # CIRCLED LATIN SMALL LETTER R + : "ⓢ" U24E2 # CIRCLED LATIN SMALL LETTER S + : "ⓣ" U24E3 # CIRCLED LATIN SMALL LETTER T + : "ⓤ" U24E4 # CIRCLED LATIN SMALL LETTER U + : "ⓥ" U24E5 # CIRCLED LATIN SMALL LETTER V + : "ⓦ" U24E6 # CIRCLED LATIN SMALL LETTER W + : "ⓧ" U24E7 # CIRCLED LATIN SMALL LETTER X + : "ⓨ" U24E8 # CIRCLED LATIN SMALL LETTER Y + : "ⓩ" U24E9 # CIRCLED LATIN SMALL LETTER Z + <0> : "⓪" U24EA # CIRCLED DIGIT ZERO + : "⓪" U24EA # CIRCLED DIGIT ZERO + : "⨥" U2A25 # PLUS SIGN WITH DOT BELOW + : "⨦" U2A26 # PLUS SIGN WITH TILDE BELOW + : "⨪" U2A2A # MINUS SIGN WITH DOT BELOW + : "⩦" U2A66 # EQUALS SIGN WITH DOT BELOW + : "⩷" U2A77 # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW + : "⩷" U2A77 # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW + : "⫝̸" U2ADC # FORKING + : "⫰" U2AF0 # VERTICAL LINE WITH CIRCLE BELOW + : "が" U304C # HIRAGANA LETTER GA + : "ぎ" U304E # HIRAGANA LETTER GI + : "ぐ" U3050 # HIRAGANA LETTER GU + : "げ" U3052 # HIRAGANA LETTER GE + : "ご" U3054 # HIRAGANA LETTER GO + : "ざ" U3056 # HIRAGANA LETTER ZA + : "じ" U3058 # HIRAGANA LETTER ZI + : "ず" U305A # HIRAGANA LETTER ZU + : "ぜ" U305C # HIRAGANA LETTER ZE + : "ぞ" U305E # HIRAGANA LETTER ZO + : "だ" U3060 # HIRAGANA LETTER DA + : "ぢ" U3062 # HIRAGANA LETTER DI + : "づ" U3065 # HIRAGANA LETTER DU + : "で" U3067 # HIRAGANA LETTER DE + : "ど" U3069 # HIRAGANA LETTER DO + : "ば" U3070 # HIRAGANA LETTER BA + : "ぱ" U3071 # HIRAGANA LETTER PA + : "び" U3073 # HIRAGANA LETTER BI + : "ぴ" U3074 # HIRAGANA LETTER PI + : "ぶ" U3076 # HIRAGANA LETTER BU + : "ぷ" U3077 # HIRAGANA LETTER PU + : "べ" U3079 # HIRAGANA LETTER BE + : "ぺ" U307A # HIRAGANA LETTER PE + : "ぼ" U307C # HIRAGANA LETTER BO + : "ぽ" U307D # HIRAGANA LETTER PO + : "ゔ" U3094 # HIRAGANA LETTER VU + : "ゞ" U309E # HIRAGANA VOICED ITERATION MARK + : "ガ" U30AC # KATAKANA LETTER GA + : "ギ" U30AE # KATAKANA LETTER GI + : "グ" U30B0 # KATAKANA LETTER GU + : "ゲ" U30B2 # KATAKANA LETTER GE + : "ゴ" U30B4 # KATAKANA LETTER GO + : "ザ" U30B6 # KATAKANA LETTER ZA + : "ジ" U30B8 # KATAKANA LETTER ZI + : "ズ" U30BA # KATAKANA LETTER ZU + : "ゼ" U30BC # KATAKANA LETTER ZE + : "ゾ" U30BE # KATAKANA LETTER ZO + : "ダ" U30C0 # KATAKANA LETTER DA + : "ヂ" U30C2 # KATAKANA LETTER DI + : "ヅ" U30C5 # KATAKANA LETTER DU + : "デ" U30C7 # KATAKANA LETTER DE + : "ド" U30C9 # KATAKANA LETTER DO + : "バ" U30D0 # KATAKANA LETTER BA + : "パ" U30D1 # KATAKANA LETTER PA + : "ビ" U30D3 # KATAKANA LETTER BI + : "ピ" U30D4 # KATAKANA LETTER PI + : "ブ" U30D6 # KATAKANA LETTER BU + : "プ" U30D7 # KATAKANA LETTER PU + : "ベ" U30D9 # KATAKANA LETTER BE + : "ペ" U30DA # KATAKANA LETTER PE + : "ボ" U30DC # KATAKANA LETTER BO + : "ポ" U30DD # KATAKANA LETTER PO + : "ヴ" U30F4 # KATAKANA LETTER VU + : "ヷ" U30F7 # KATAKANA LETTER VA + : "ヸ" U30F8 # KATAKANA LETTER VI + : "ヹ" U30F9 # KATAKANA LETTER VE + : "ヺ" U30FA # KATAKANA LETTER VO + : "ヾ" U30FE # KATAKANA VOICED ITERATION MARK + : "㆒" U3192 # IDEOGRAPHIC ANNOTATION ONE MARK + : "㆒" U3192 # IDEOGRAPHIC ANNOTATION ONE MARK + : "㆓" U3193 # IDEOGRAPHIC ANNOTATION TWO MARK + : "㆓" U3193 # IDEOGRAPHIC ANNOTATION TWO MARK + : "㆔" U3194 # IDEOGRAPHIC ANNOTATION THREE MARK + : "㆔" U3194 # IDEOGRAPHIC ANNOTATION THREE MARK + : "㆕" U3195 # IDEOGRAPHIC ANNOTATION FOUR MARK + : "㆕" U3195 # IDEOGRAPHIC ANNOTATION FOUR MARK + : "㆖" U3196 # IDEOGRAPHIC ANNOTATION TOP MARK + : "㆖" U3196 # IDEOGRAPHIC ANNOTATION TOP MARK + : "㆗" U3197 # IDEOGRAPHIC ANNOTATION MIDDLE MARK + : "㆗" U3197 # IDEOGRAPHIC ANNOTATION MIDDLE MARK + : "㆘" U3198 # IDEOGRAPHIC ANNOTATION BOTTOM MARK + : "㆘" U3198 # IDEOGRAPHIC ANNOTATION BOTTOM MARK + : "㆙" U3199 # IDEOGRAPHIC ANNOTATION FIRST MARK + : "㆙" U3199 # IDEOGRAPHIC ANNOTATION FIRST MARK + : "㆚" U319A # IDEOGRAPHIC ANNOTATION SECOND MARK + : "㆚" U319A # IDEOGRAPHIC ANNOTATION SECOND MARK + : "㆛" U319B # IDEOGRAPHIC ANNOTATION THIRD MARK + : "㆛" U319B # IDEOGRAPHIC ANNOTATION THIRD MARK + : "㆜" U319C # IDEOGRAPHIC ANNOTATION FOURTH MARK + : "㆜" U319C # IDEOGRAPHIC ANNOTATION FOURTH MARK + : "㆝" U319D # IDEOGRAPHIC ANNOTATION HEAVEN MARK + : "㆝" U319D # IDEOGRAPHIC ANNOTATION HEAVEN MARK + : "㆞" U319E # IDEOGRAPHIC ANNOTATION EARTH MARK + : "㆞" U319E # IDEOGRAPHIC ANNOTATION EARTH MARK + : "㆟" U319F # IDEOGRAPHIC ANNOTATION MAN MARK + : "㆟" U319F # IDEOGRAPHIC ANNOTATION MAN MARK + <2> <1> : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE + <2> : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE + <1> : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE + : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE + <1> : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE + : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE + <2> <2> : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO + <2> : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO + <2> : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO + <2> : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO + : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO + : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO + <2> : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO + : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO + : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO + <2> <3> : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE + <2> : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE + <3> : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE + : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE + <3> : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE + : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE + <2> <4> : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR + <2> : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR + <4> : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR + : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR + <4> : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR + : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR + <2> <5> : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE + <2> : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE + <5> : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE + : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE + <5> : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE + : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE + <2> <6> : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX + <2> : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX + <6> : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX + : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX + <6> : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX + : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX + <2> <7> : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN + <2> : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN + <7> : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN + : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN + <7> : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN + : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN + <2> <8> : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT + <2> : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT + <8> : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT + : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT + <8> : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT + : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT + <2> <9> : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE + <2> : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE + <9> : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE + : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE + <9> : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE + : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE + <3> <0> : "㉚" U325A # CIRCLED NUMBER THIRTY + <3> : "㉚" U325A # CIRCLED NUMBER THIRTY + <0> : "㉚" U325A # CIRCLED NUMBER THIRTY + : "㉚" U325A # CIRCLED NUMBER THIRTY + <3> <1> : "㉛" U325B # CIRCLED NUMBER THIRTY ONE + <3> : "㉛" U325B # CIRCLED NUMBER THIRTY ONE + <1> : "㉛" U325B # CIRCLED NUMBER THIRTY ONE + : "㉛" U325B # CIRCLED NUMBER THIRTY ONE + <3> <2> : "㉜" U325C # CIRCLED NUMBER THIRTY TWO + <3> : "㉜" U325C # CIRCLED NUMBER THIRTY TWO + <3> : "㉜" U325C # CIRCLED NUMBER THIRTY TWO + <2> : "㉜" U325C # CIRCLED NUMBER THIRTY TWO + : "㉜" U325C # CIRCLED NUMBER THIRTY TWO + : "㉜" U325C # CIRCLED NUMBER THIRTY TWO + <3> <3> : "㉝" U325D # CIRCLED NUMBER THIRTY THREE + <3> : "㉝" U325D # CIRCLED NUMBER THIRTY THREE + <3> : "㉝" U325D # CIRCLED NUMBER THIRTY THREE + : "㉝" U325D # CIRCLED NUMBER THIRTY THREE + <3> <4> : "㉞" U325E # CIRCLED NUMBER THIRTY FOUR + <3> : "㉞" U325E # CIRCLED NUMBER THIRTY FOUR + <4> : "㉞" U325E # CIRCLED NUMBER THIRTY FOUR + : "㉞" U325E # CIRCLED NUMBER THIRTY FOUR + <3> <5> : "㉟" U325F # CIRCLED NUMBER THIRTY FIVE + <3> : "㉟" U325F # CIRCLED NUMBER THIRTY FIVE + <5> : "㉟" U325F # CIRCLED NUMBER THIRTY FIVE + : "㉟" U325F # CIRCLED NUMBER THIRTY FIVE + : "㉠" U3260 # CIRCLED HANGUL KIYEOK + : "㉡" U3261 # CIRCLED HANGUL NIEUN + : "㉢" U3262 # CIRCLED HANGUL TIKEUT + : "㉣" U3263 # CIRCLED HANGUL RIEUL + : "㉤" U3264 # CIRCLED HANGUL MIEUM + : "㉥" U3265 # CIRCLED HANGUL PIEUP + : "㉦" U3266 # CIRCLED HANGUL SIOS + : "㉧" U3267 # CIRCLED HANGUL IEUNG + : "㉨" U3268 # CIRCLED HANGUL CIEUC + : "㉩" U3269 # CIRCLED HANGUL CHIEUCH + : "㉪" U326A # CIRCLED HANGUL KHIEUKH + : "㉫" U326B # CIRCLED HANGUL THIEUTH + : "㉬" U326C # CIRCLED HANGUL PHIEUPH + : "㉭" U326D # CIRCLED HANGUL HIEUH + : "㉮" U326E # CIRCLED HANGUL KIYEOK A + : "㉯" U326F # CIRCLED HANGUL NIEUN A + : "㉰" U3270 # CIRCLED HANGUL TIKEUT A + : "㉱" U3271 # CIRCLED HANGUL RIEUL A + : "㉲" U3272 # CIRCLED HANGUL MIEUM A + : "㉳" U3273 # CIRCLED HANGUL PIEUP A + : "㉴" U3274 # CIRCLED HANGUL SIOS A + : "㉵" U3275 # CIRCLED HANGUL IEUNG A + : "㉶" U3276 # CIRCLED HANGUL CIEUC A + : "㉷" U3277 # CIRCLED HANGUL CHIEUCH A + : "㉸" U3278 # CIRCLED HANGUL KHIEUKH A + : "㉹" U3279 # CIRCLED HANGUL THIEUTH A + : "㉺" U327A # CIRCLED HANGUL PHIEUPH A + : "㉻" U327B # CIRCLED HANGUL HIEUH A + : "㊀" U3280 # CIRCLED IDEOGRAPH ONE + : "㊁" U3281 # CIRCLED IDEOGRAPH TWO + : "㊂" U3282 # CIRCLED IDEOGRAPH THREE + : "㊃" U3283 # CIRCLED IDEOGRAPH FOUR + : "㊄" U3284 # CIRCLED IDEOGRAPH FIVE + : "㊅" U3285 # CIRCLED IDEOGRAPH SIX + : "㊆" U3286 # CIRCLED IDEOGRAPH SEVEN + : "㊇" U3287 # CIRCLED IDEOGRAPH EIGHT + : "㊈" U3288 # CIRCLED IDEOGRAPH NINE + : "㊉" U3289 # CIRCLED IDEOGRAPH TEN + : "㊊" U328A # CIRCLED IDEOGRAPH MOON + : "㊋" U328B # CIRCLED IDEOGRAPH FIRE + : "㊌" U328C # CIRCLED IDEOGRAPH WATER + : "㊍" U328D # CIRCLED IDEOGRAPH WOOD + : "㊎" U328E # CIRCLED IDEOGRAPH METAL + : "㊏" U328F # CIRCLED IDEOGRAPH EARTH + : "㊐" U3290 # CIRCLED IDEOGRAPH SUN + : "㊑" U3291 # CIRCLED IDEOGRAPH STOCK + : "㊒" U3292 # CIRCLED IDEOGRAPH HAVE + : "㊓" U3293 # CIRCLED IDEOGRAPH SOCIETY + : "㊔" U3294 # CIRCLED IDEOGRAPH NAME + : "㊕" U3295 # CIRCLED IDEOGRAPH SPECIAL + : "㊖" U3296 # CIRCLED IDEOGRAPH FINANCIAL + : "㊗" U3297 # CIRCLED IDEOGRAPH CONGRATULATION + : "㊘" U3298 # CIRCLED IDEOGRAPH LABOR + : "㊙" U3299 # CIRCLED IDEOGRAPH SECRET + : "㊚" U329A # CIRCLED IDEOGRAPH MALE + : "㊛" U329B # CIRCLED IDEOGRAPH FEMALE + : "㊜" U329C # CIRCLED IDEOGRAPH SUITABLE + : "㊝" U329D # CIRCLED IDEOGRAPH EXCELLENT + : "㊞" U329E # CIRCLED IDEOGRAPH PRINT + : "㊟" U329F # CIRCLED IDEOGRAPH ATTENTION + : "㊠" U32A0 # CIRCLED IDEOGRAPH ITEM + : "㊡" U32A1 # CIRCLED IDEOGRAPH REST + : "㊢" U32A2 # CIRCLED IDEOGRAPH COPY + : "㊣" U32A3 # CIRCLED IDEOGRAPH CORRECT + : "㊤" U32A4 # CIRCLED IDEOGRAPH HIGH + : "㊥" U32A5 # CIRCLED IDEOGRAPH CENTRE + : "㊦" U32A6 # CIRCLED IDEOGRAPH LOW + : "㊧" U32A7 # CIRCLED IDEOGRAPH LEFT + : "㊨" U32A8 # CIRCLED IDEOGRAPH RIGHT + : "㊩" U32A9 # CIRCLED IDEOGRAPH MEDICINE + : "㊪" U32AA # CIRCLED IDEOGRAPH RELIGION + : "㊫" U32AB # CIRCLED IDEOGRAPH STUDY + : "㊬" U32AC # CIRCLED IDEOGRAPH SUPERVISE + : "㊭" U32AD # CIRCLED IDEOGRAPH ENTERPRISE + : "㊮" U32AE # CIRCLED IDEOGRAPH RESOURCE + : "㊯" U32AF # CIRCLED IDEOGRAPH ALLIANCE + : "㊰" U32B0 # CIRCLED IDEOGRAPH NIGHT + <3> <6> : "㊱" U32B1 # CIRCLED NUMBER THIRTY SIX + <3> : "㊱" U32B1 # CIRCLED NUMBER THIRTY SIX + <6> : "㊱" U32B1 # CIRCLED NUMBER THIRTY SIX + : "㊱" U32B1 # CIRCLED NUMBER THIRTY SIX + <3> <7> : "㊲" U32B2 # CIRCLED NUMBER THIRTY SEVEN + <3> : "㊲" U32B2 # CIRCLED NUMBER THIRTY SEVEN + <7> : "㊲" U32B2 # CIRCLED NUMBER THIRTY SEVEN + : "㊲" U32B2 # CIRCLED NUMBER THIRTY SEVEN + <3> <8> : "㊳" U32B3 # CIRCLED NUMBER THIRTY EIGHT + <3> : "㊳" U32B3 # CIRCLED NUMBER THIRTY EIGHT + <8> : "㊳" U32B3 # CIRCLED NUMBER THIRTY EIGHT + : "㊳" U32B3 # CIRCLED NUMBER THIRTY EIGHT + <3> <9> : "㊴" U32B4 # CIRCLED NUMBER THIRTY NINE + <3> : "㊴" U32B4 # CIRCLED NUMBER THIRTY NINE + <9> : "㊴" U32B4 # CIRCLED NUMBER THIRTY NINE + : "㊴" U32B4 # CIRCLED NUMBER THIRTY NINE + <4> <0> : "㊵" U32B5 # CIRCLED NUMBER FORTY + <4> : "㊵" U32B5 # CIRCLED NUMBER FORTY + <0> : "㊵" U32B5 # CIRCLED NUMBER FORTY + : "㊵" U32B5 # CIRCLED NUMBER FORTY + <4> <1> : "㊶" U32B6 # CIRCLED NUMBER FORTY ONE + <4> : "㊶" U32B6 # CIRCLED NUMBER FORTY ONE + <1> : "㊶" U32B6 # CIRCLED NUMBER FORTY ONE + : "㊶" U32B6 # CIRCLED NUMBER FORTY ONE + <4> <2> : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO + <4> : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO + <4> : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO + <2> : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO + : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO + : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO + <4> <3> : "㊸" U32B8 # CIRCLED NUMBER FORTY THREE + <4> : "㊸" U32B8 # CIRCLED NUMBER FORTY THREE + <3> : "㊸" U32B8 # CIRCLED NUMBER FORTY THREE + : "㊸" U32B8 # CIRCLED NUMBER FORTY THREE + <4> <4> : "㊹" U32B9 # CIRCLED NUMBER FORTY FOUR + <4> : "㊹" U32B9 # CIRCLED NUMBER FORTY FOUR + <4> : "㊹" U32B9 # CIRCLED NUMBER FORTY FOUR + : "㊹" U32B9 # CIRCLED NUMBER FORTY FOUR + <4> <5> : "㊺" U32BA # CIRCLED NUMBER FORTY FIVE + <4> : "㊺" U32BA # CIRCLED NUMBER FORTY FIVE + <5> : "㊺" U32BA # CIRCLED NUMBER FORTY FIVE + : "㊺" U32BA # CIRCLED NUMBER FORTY FIVE + <4> <6> : "㊻" U32BB # CIRCLED NUMBER FORTY SIX + <4> : "㊻" U32BB # CIRCLED NUMBER FORTY SIX + <6> : "㊻" U32BB # CIRCLED NUMBER FORTY SIX + : "㊻" U32BB # CIRCLED NUMBER FORTY SIX + <4> <7> : "㊼" U32BC # CIRCLED NUMBER FORTY SEVEN + <4> : "㊼" U32BC # CIRCLED NUMBER FORTY SEVEN + <7> : "㊼" U32BC # CIRCLED NUMBER FORTY SEVEN + : "㊼" U32BC # CIRCLED NUMBER FORTY SEVEN + <4> <8> : "㊽" U32BD # CIRCLED NUMBER FORTY EIGHT + <4> : "㊽" U32BD # CIRCLED NUMBER FORTY EIGHT + <8> : "㊽" U32BD # CIRCLED NUMBER FORTY EIGHT + : "㊽" U32BD # CIRCLED NUMBER FORTY EIGHT + <4> <9> : "㊾" U32BE # CIRCLED NUMBER FORTY NINE + <4> : "㊾" U32BE # CIRCLED NUMBER FORTY NINE + <9> : "㊾" U32BE # CIRCLED NUMBER FORTY NINE + : "㊾" U32BE # CIRCLED NUMBER FORTY NINE + <5> <0> : "㊿" U32BF # CIRCLED NUMBER FIFTY + <5> : "㊿" U32BF # CIRCLED NUMBER FIFTY + <0> : "㊿" U32BF # CIRCLED NUMBER FIFTY + : "㊿" U32BF # CIRCLED NUMBER FIFTY + : "㋐" U32D0 # CIRCLED KATAKANA A + : "㋑" U32D1 # CIRCLED KATAKANA I + : "㋒" U32D2 # CIRCLED KATAKANA U + : "㋓" U32D3 # CIRCLED KATAKANA E + : "㋔" U32D4 # CIRCLED KATAKANA O + : "㋕" U32D5 # CIRCLED KATAKANA KA + : "㋖" U32D6 # CIRCLED KATAKANA KI + : "㋗" U32D7 # CIRCLED KATAKANA KU + : "㋘" U32D8 # CIRCLED KATAKANA KE + : "㋙" U32D9 # CIRCLED KATAKANA KO + : "㋚" U32DA # CIRCLED KATAKANA SA + : "㋛" U32DB # CIRCLED KATAKANA SI + : "㋜" U32DC # CIRCLED KATAKANA SU + : "㋝" U32DD # CIRCLED KATAKANA SE + : "㋞" U32DE # CIRCLED KATAKANA SO + : "㋟" U32DF # CIRCLED KATAKANA TA + : "㋠" U32E0 # CIRCLED KATAKANA TI + : "㋡" U32E1 # CIRCLED KATAKANA TU + : "㋢" U32E2 # CIRCLED KATAKANA TE + : "㋣" U32E3 # CIRCLED KATAKANA TO + : "㋤" U32E4 # CIRCLED KATAKANA NA + : "㋥" U32E5 # CIRCLED KATAKANA NI + : "㋦" U32E6 # CIRCLED KATAKANA NU + : "㋧" U32E7 # CIRCLED KATAKANA NE + : "㋨" U32E8 # CIRCLED KATAKANA NO + : "㋩" U32E9 # CIRCLED KATAKANA HA + : "㋪" U32EA # CIRCLED KATAKANA HI + : "㋫" U32EB # CIRCLED KATAKANA HU + : "㋬" U32EC # CIRCLED KATAKANA HE + : "㋭" U32ED # CIRCLED KATAKANA HO + : "㋮" U32EE # CIRCLED KATAKANA MA + : "㋯" U32EF # CIRCLED KATAKANA MI + : "㋰" U32F0 # CIRCLED KATAKANA MU + : "㋱" U32F1 # CIRCLED KATAKANA ME + : "㋲" U32F2 # CIRCLED KATAKANA MO + : "㋳" U32F3 # CIRCLED KATAKANA YA + : "㋴" U32F4 # CIRCLED KATAKANA YU + : "㋵" U32F5 # CIRCLED KATAKANA YO + : "㋶" U32F6 # CIRCLED KATAKANA RA + : "㋷" U32F7 # CIRCLED KATAKANA RI + : "㋸" U32F8 # CIRCLED KATAKANA RU + : "㋹" U32F9 # CIRCLED KATAKANA RE + : "㋺" U32FA # CIRCLED KATAKANA RO + : "㋻" U32FB # CIRCLED KATAKANA WA + : "㋼" U32FC # CIRCLED KATAKANA WI + : "㋽" U32FD # CIRCLED KATAKANA WE + : "㋾" U32FE # CIRCLED KATAKANA WO + : "יִ" UFB1D # HEBREW LETTER YOD WITH HIRIQ + : "ײַ" UFB1F # HEBREW LIGATURE YIDDISH YOD YOD PATAH + : "שׁ" UFB2A # HEBREW LETTER SHIN WITH SHIN DOT + : "שׂ" UFB2B # HEBREW LETTER SHIN WITH SIN DOT + : "שּׁ" UFB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT + : "שּׁ" UFB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT + : "שּׂ" UFB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT + : "שּׂ" UFB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT + : "אַ" UFB2E # HEBREW LETTER ALEF WITH PATAH + : "אָ" UFB2F # HEBREW LETTER ALEF WITH QAMATS + : "אּ" UFB30 # HEBREW LETTER ALEF WITH MAPIQ + : "בּ" UFB31 # HEBREW LETTER BET WITH DAGESH + : "גּ" UFB32 # HEBREW LETTER GIMEL WITH DAGESH + : "דּ" UFB33 # HEBREW LETTER DALET WITH DAGESH + : "הּ" UFB34 # HEBREW LETTER HE WITH MAPIQ + : "וּ" UFB35 # HEBREW LETTER VAV WITH DAGESH + : "זּ" UFB36 # HEBREW LETTER ZAYIN WITH DAGESH + : "טּ" UFB38 # HEBREW LETTER TET WITH DAGESH + : "יּ" UFB39 # HEBREW LETTER YOD WITH DAGESH + : "ךּ" UFB3A # HEBREW LETTER FINAL KAF WITH DAGESH + : "כּ" UFB3B # HEBREW LETTER KAF WITH DAGESH + : "לּ" UFB3C # HEBREW LETTER LAMED WITH DAGESH + : "מּ" UFB3E # HEBREW LETTER MEM WITH DAGESH + : "נּ" UFB40 # HEBREW LETTER NUN WITH DAGESH + : "סּ" UFB41 # HEBREW LETTER SAMEKH WITH DAGESH + : "ףּ" UFB43 # HEBREW LETTER FINAL PE WITH DAGESH + : "פּ" UFB44 # HEBREW LETTER PE WITH DAGESH + : "צּ" UFB46 # HEBREW LETTER TSADI WITH DAGESH + : "קּ" UFB47 # HEBREW LETTER QOF WITH DAGESH + : "רּ" UFB48 # HEBREW LETTER RESH WITH DAGESH + : "שּ" UFB49 # HEBREW LETTER SHIN WITH DAGESH + : "תּ" UFB4A # HEBREW LETTER TAV WITH DAGESH + : "וֹ" UFB4B # HEBREW LETTER VAV WITH HOLAM + : "בֿ" UFB4C # HEBREW LETTER BET WITH RAFE + : "כֿ" UFB4D # HEBREW LETTER KAF WITH RAFE + : "פֿ" UFB4E # HEBREW LETTER PE WITH RAFE + : "𝅗𝅥" U1D15E # MUSICAL SYMBOL HALF NOTE + : "𝅘𝅥" U1D15F # MUSICAL SYMBOL QUARTER NOTE + : "𝅘𝅥𝅮" U1D160 # MUSICAL SYMBOL EIGHTH NOTE + + : "𝅘𝅥𝅯" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE + + : "𝅘𝅥𝅰" U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE + + : "𝅘𝅥𝅱" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE + + : "𝅘𝅥𝅲" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE + + : "𝆹𝅥" U1D1BB # MUSICAL SYMBOL MINIMA + : "𝆺𝅥" U1D1BC # MUSICAL SYMBOL MINIMA BLACK + : "𝆹𝅥𝅮" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE + + : "𝆺𝅥𝅮" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK + + : "𝆹𝅥𝅯" U1D1BF # MUSICAL SYMBOL FUSA WHITE + + : "𝆺𝅥𝅯" U1D1C0 # MUSICAL SYMBOL FUSA BLACK + + +# +# Khmer digraphs +# + + : "ាំ" + : "ោះ" + : "េះ" + : "ុំ" + : "ុះ" + +# +# Arabic Lam-Alef ligatures +# + + : "لا" # ARABIC LIGATURE LAM WITH ALEF + : "لأ" # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE + : "لإ" # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW + : "لآ" # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE + +# +# French-Dvorak Bépo compositions +# + + : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + : "ȷ" U0237 # LATIN SMALL LETTER DOTLESS J + : "Ŀ" U013F # LATIN CAPITAL LETTER L WITH MIDDLE DOT + : "ŀ" U0140 # LATIN SMALL LETTER L WITH MIDDLE DOT + : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + : "̇" U0307 # COMBINING DOT ABOVE + : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "́" U0301 # COMBINING ACUTE ACCENT + : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE + : "̣" U0323 # COMBINING DOT BELOW + : "̣" U0323 # COMBINING DOT BELOW + : "̣" U0323 # COMBINING DOT BELOW + : "Ắ" Abreveacute # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "Ằ" Abrevegrave # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + : "Ẳ" Abrevehook # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + : "Ẵ" Abrevetilde # LATIN CAPITAL LETTER A WITH BREVE AND TILDE + : "ắ" abreveacute # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "ằ" abrevegrave # LATIN SMALL LETTER A WITH BREVE AND GRAVE + : "ẳ" abrevehook # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + : "ẵ" abrevetilde # LATIN SMALL LETTER A WITH BREVE AND TILDE + : "̆" U0306 # COMBINING BREVE + : "₍" U208D # SUBSCRIPT LEFT PARENTHESIS + : "₎" U208E # SUBSCRIPT RIGHT PARENTHESIS + : "₊" U208A # SUBSCRIPT PLUS SIGN + : "₋" U208B # SUBSCRIPT MINUS + <0> : "₀" zerosubscript # SUBSCRIPT ZERO + <1> : "₁" onesubscript # SUBSCRIPT ONE + <2> : "₂" twosubscript # SUBSCRIPT TWO + <3> : "₃" threesubscript # SUBSCRIPT THREE + <4> : "₄" foursubscript # SUBSCRIPT FOUR + <5> : "₅" fivesubscript # SUBSCRIPT FIVE + <6> : "₆" sixsubscript # SUBSCRIPT SIX + <7> : "₇" sevensubscript # SUBSCRIPT SEVEN + <8> : "₈" eightsubscript # SUBSCRIPT EIGHT + <9> : "₉" ninesubscript # SUBSCRIPT NINE + : "₌" U208C # SUBSCRIPT EQUALS SIGN + : "Dž" U01C5 # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON + : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE + : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON + : "̌" U030C # COMBINING CARON + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "₵" U20B5 # CEDI SIGN + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "₵" U20B5 # CEDI SIGN + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "̧" U0327 # COMBINING CEDILLA + : "⁻" U207B # SUPERSCRIPT MINUS + : "Ấ" Acircumflexacute # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : "Ầ" Acircumflexgrave # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + : "Ẩ" Acircumflexhook # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "Ẫ" Acircumflextilde # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + : "ấ" acircumflexacute # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : "ầ" acircumflexgrave # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE + : "ẩ" acircumflexhook # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "ẫ" acircumflextilde # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE + : "Ế" Ecircumflexacute # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : "Ề" Ecircumflexgrave # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + : "Ể" Ecircumflexhook # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "Ễ" Ecircumflextilde # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + : "ế" ecircumflexacute # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : "ề" ecircumflexgrave # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + : "ể" ecircumflexhook # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "ễ" ecircumflextilde # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE + : "Ố" Ocircumflexacute # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : "Ồ" Ocircumflexgrave # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + : "Ổ" Ocircumflexhook # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "Ỗ" Ocircumflextilde # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + : "ố" ocircumflexacute # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : "ồ" ocircumflexgrave # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE + : "ổ" ocircumflexhook # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "ỗ" ocircumflextilde # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE + : "̂" U0302 # COMBINING CIRCUMFLEX ACCENT + : "Ș" U0218 # LATIN CAPITAL LETTER S WITH COMMA BELOW + : "ș" U0219 # LATIN SMALL LETTER S WITH COMMA BELOW + : "Ț" U021A # LATIN CAPITAL LETTER T WITH COMMA BELOW + : "ț" U021B # LATIN SMALL LETTER T WITH COMMA BELOW + : "," comma # COMMA + : "̦" U0326 # COMBINING COMMA BELOW + : "," comma # COMMA + : "₳" U20B3 # AUSTRAL SIGN + : "؋" U060B # AFGHANI SIGN + : "₱" U20B1 # PESO SIGN + : "฿" Thai_baht # THAI CURRENCY SYMBOL BAHT + : "₵" U20B5 # CEDI SIGN + : "₡" ColonSign # COLON SIGN + : "₵" U20B5 # CEDI SIGN + : "¢" cent # CENT SIGN + : "₯" U20AF # DRACHMA SIGN + : "₫" DongSign # DONG SIGN + : "₠" EcuSign # EURO-CURRENCY SIGN + : "€" EuroSign # EURO SIGN + : "₣" FFrancSign # FRENCH FRANC SIGN + : "ƒ" function # LATIN SMALL LETTER F WITH HOOK + : "₲" U20B2 # GUARANI SIGN + : "₲" U20B2 # GUARANI SIGN + : "₴" U20B4 # HRYVNIA SIGN + : "₴" U20B4 # HRYVNIA SIGN + : "៛" U17DB # KHMER CURRENCY SYMBOL RIEL + : "﷼" UFDFC # RIAL SIGN + : "₭" U20AD # KIP SIGN + : "₭" U20AD # KIP SIGN + : "₤" LiraSign # LIRA SIGN + : "£" sterling # POUND SIGN + : "ℳ" U2133 # SCRIPT CAPITAL M + : "₥" MillSign # MILL SIGN + : "₦" NairaSign # NAIRA SIGN + : "₦" NairaSign # NAIRA SIGN + : "૱" U0AF1 # GUJARATI RUPEE SIGN + : "௹" U0BF9 # TAMIL RUPEE SIGN +

: "₧" PesetaSign # PESETA SIGN +

: "₰" U20B0 # GERMAN PENNY SIGN + : "₢" CruzeiroSign # CRUZEIRO SIGN + : "₨" RupeeSign # RUPEE SIGN + : "$" dollar # DOLLAR SIGN + : "₪" NewSheqelSign # NEW SHEQEL SIGN + : "₮" U20AE # TUGRIK SIGN + : "৳" U09F3 # BENGALI RUPEE SIGN + : "৲" U09F2 # BENGALI RUPEE MARK + : "৲" U09F2 # BENGALI RUPEE MARK + : "圓" U5713 # YUAN / WEN + : "元" U5143 # YUAN / WEN + : "₩" WonSign # WON SIGN + : "₩" WonSign # WON SIGN + : "円" U5186 # YEN + : "¥" yen # YEN SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON + : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + : "̈" U0308 # COMBINING DIAERESIS + : "̋" U030B # COMBINING DOUBLE ACUTE ACCENT + : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + : "̀" U0300 # COMBINING GRAVE ACCENT + : "Α" U0391 # GREEK CAPITAL LETTER ALPHA + : "α" U03B1 # GREEK SMALL LETTER ALPHA + : "Β" U0392 # GREEK CAPITAL LETTER BETA + : "β" U03B2 # GREEK SMALL LETTER BETA + : "Δ" U0394 # GREEK CAPITAL LETTER DELTA + : "δ" U03B4 # GREEK SMALL LETTER DELTA + : "Ε" U0395 # GREEK CAPITAL LETTER EPSILON + : "ε" U03B5 # GREEK SMALL LETTER EPSILON + : "Φ" U03A6 # GREEK CAPITAL LETTER PHI + : "φ" U03C6 # GREEK SMALL LETTER PHI + : "Γ" U0393 # GREEK CAPITAL LETTER GAMMA + : "γ" U03B3 # GREEK SMALL LETTER GAMMA + : "Η" U0397 # GREEK CAPITAL LETTER ETA + : "η" U03B7 # GREEK SMALL LETTER ETA + : "Ι" U0399 # GREEK CAPITAL LETTER IOTA + : "ι" U03B9 # GREEK SMALL LETTER IOTA + : "Θ" U0398 # GREEK CAPITAL LETTER THETA + : "θ" U03B8 # GREEK SMALL LETTER THETA + : "Κ" U039A # GREEK CAPITAL LETTER KAPPA + : "κ" U03BA # GREEK SMALL LETTER KAPPA + : "Λ" U039B # GREEK CAPITAL LETTER LAMDA + : "λ" U03BB # GREEK SMALL LETTER LAMDA + : "Μ" U039C # GREEK CAPITAL LETTER MU + : "μ" U03BC # GREEK SMALL LETTER MU + : "Ν" U039D # GREEK CAPITAL LETTER NU + : "ν" U03BD # GREEK SMALL LETTER NU + : "Ο" U039F # GREEK CAPITAL LETTER OMICRON + : "ο" U03BF # GREEK SMALL LETTER OMICRON +

: "Π" U03A0 # GREEK CAPITAL LETTER PI +

: "π" U03C0 # GREEK SMALL LETTER PI + : "Χ" U03A7 # GREEK CAPITAL LETTER CHI + : "χ" U03C7 # GREEK SMALL LETTER CHI + : "Ρ" U03A1 # GREEK CAPITAL LETTER RHO + : "ρ" U03C1 # GREEK SMALL LETTER RHO + : "Σ" U03A3 # GREEK CAPITAL LETTER SIGMA + : "σ" U03C3 # GREEK SMALL LETTER SIGMA + : "Τ" U03A4 # GREEK CAPITAL LETTER TAU + : "τ" U03C4 # GREEK SMALL LETTER TAU + : "Υ" U03A5 # GREEK CAPITAL LETTER UPSILON + : "υ" U03C5 # GREEK SMALL LETTER UPSILON + : "Ω" U03A9 # GREEK CAPITAL LETTER OMEGA + : "ω" U03C9 # GREEK SMALL LETTER OMEGA + : "Ξ" U039E # GREEK CAPITAL LETTER XI + : "ξ" U03BE # GREEK SMALL LETTER XI + : "Ψ" U03A8 # GREEK CAPITAL LETTER PSI + : "ψ" U03C8 # GREEK SMALL LETTER PSI + : "Ζ" U0396 # GREEK CAPITAL LETTER ZETA + : "ζ" U03B6 # GREEK SMALL LETTER ZETA + : "µ" U00B5 # MICRO SIGN + : "µ" U00B5 # MICRO SIGN + : "µ" U00B5 # MICRO SIGN + : "Ɓ" U0181 # LATIN CAPITAL LETTER B WITH HOOK + : "ɓ" U0253 # LATIN SMALL LETTER B WITH HOOK + : "Ƈ" U0187 # LATIN CAPITAL LETTER C WITH HOOK + : "ƈ" U0188 # LATIN SMALL LETTER C WITH HOOK + : "Ɗ" U018A # LATIN CAPITAL LETTER D WITH HOOK + : "ɗ" U0257 # LATIN SMALL LETTER D WITH HOOK + : "ᶑ" U1D91 # LATIN SMALL LETTER D WITH HOOK AND TAIL + : "Ƒ" U0191 # LATIN CAPITAL LETTER F WITH HOOK + : "ƒ" function # LATIN SMALL LETTER F WITH HOOK + : "Ɠ" U0193 # LATIN CAPITAL LETTER G WITH HOOK + : "ɠ" U0260 # LATIN SMALL LETTER G WITH HOOK + : "ɦ" U0266 # LATIN SMALL LETTER H WITH HOOK + : "ʄ" U0284 # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK + : "Ƙ" U0198 # LATIN CAPITAL LETTER K WITH HOOK + : "ƙ" U0199 # LATIN SMALL LETTER K WITH HOOK + : "Ɱ" U2C6E # LATIN CAPITAL LETTER M WITH HOOK + : "ɱ" U0271 # LATIN SMALL LETTER M WITH HOOK + : "Ɲ" U019D # LATIN CAPITAL LETTER N WITH LEFT HOOK + : "ɲ" U0272 # LATIN SMALL LETTER N WITH LEFT HOOK +

: "Ƥ" U01A4 # LATIN CAPITAL LETTER P WITH HOOK +

: "ƥ" U01A5 # LATIN SMALL LETTER P WITH HOOK + : "ʠ" U02A0 # LATIN SMALL LETTER Q WITH HOOK + : "ɝ" U025D # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK + : "ɼ" U027C # LATIN SMALL LETTER R WITH LONG LEG + : "ʂ" U0282 # LATIN SMALL LETTER S WITH HOOK + : "ɚ" U025A # LATIN SMALL LETTER SCHWA WITH HOOK + : "Ƭ" U01AC # LATIN CAPITAL LETTER T WITH HOOK + : "ƭ" U01AD # LATIN SMALL LETTER T WITH HOOK + : "ɻ" U027B # LATIN SMALL LETTER TURNED R WITH HOOK + : "Ʋ" U01B2 # LATIN CAPITAL LETTER V WITH HOOK + : "ʋ" U028B # LATIN SMALL LETTER V WITH HOOK + : "Ⱳ" U2C72 # LATIN CAPITAL LETTER W WITH HOOK + : "ⱳ" U2C73 # LATIN SMALL LETTER W WITH HOOK + : "Ȥ" U0224 # LATIN CAPITAL LETTER Z WITH HOOK + : "ȥ" U0225 # LATIN SMALL LETTER Z WITH HOOK + : "̉" U0309 # COMBINING HOOK ABOVE + : "̉" U0309 # COMBINING HOOK ABOVE + : "̉" U0309 # COMBINING HOOK ABOVE + : "Ớ" Ohornacute # LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : "Ợ" Ohornbelowdot # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + : "Ờ" Ohorngrave # LATIN CAPITAL LETTER O WITH HORN AND GRAVE + : "Ở" Ohornhook # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + : "Ỡ" Ohorntilde # LATIN CAPITAL LETTER O WITH HORN AND TILDE + : "ớ" ohornacute # LATIN SMALL LETTER O WITH HORN AND ACUTE + : "ợ" ohornbelowdot # LATIN SMALL LETTER O WITH HORN AND DOT BELOW + : "ờ" ohorngrave # LATIN SMALL LETTER O WITH HORN AND GRAVE + : "ở" ohornhook # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + : "ỡ" ohorntilde # LATIN SMALL LETTER O WITH HORN AND TILDE + : "Ứ" Uhornacute # LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : "Ự" Uhornbelowdot # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + : "Ừ" Uhorngrave # LATIN CAPITAL LETTER U WITH HORN AND GRAVE + : "Ử" Uhornhook # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + : "Ữ" Uhorntilde # LATIN CAPITAL LETTER U WITH HORN AND TILDE + : "ứ" uhornacute # LATIN SMALL LETTER U WITH HORN AND ACUTE + : "ự" uhornbelowdot # LATIN SMALL LETTER U WITH HORN AND DOT BELOW + : "ừ" uhorngrave # LATIN SMALL LETTER U WITH HORN AND GRAVE + : "ử" uhornhook # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + : "ữ" uhorntilde # LATIN SMALL LETTER U WITH HORN AND TILDE + : "̛" U031B # COMBINING HORN + : "̛" U031B # COMBINING HORN + : "̛" U031B # COMBINING HORN + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE + : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + : "̄" U0304 # COMBINING MACRON + : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON + : "̨" U0328 # COMBINING OGONEK + : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : "̊" U030A # COMBINING RING ABOVE + <2> : "ƻ" U01BB # LATIN LETTER TWO WITH STROKE + : "≠" notequal # NOT EQUAL TO + : "Ⱥ" U023A # LATIN CAPITAL LETTER A WITH STROKE + : "ⱥ" U2C65 # LATIN SMALL LETTER A WITH STROKE + : "Ƀ" U0243 # LATIN CAPITAL LETTER B WITH STROKE + : "Ȼ" U023B # LATIN CAPITAL LETTER C WITH STROKE + : "ȼ" U023C # LATIN SMALL LETTER C WITH STROKE + : "Ɇ" U0246 # LATIN CAPITAL LETTER E WITH STROKE + : "ɇ" U0247 # LATIN SMALL LETTER E WITH STROKE + : "≯" U226F # NOT GREATER-THAN + : "≱" U2271 # NEITHER GREATER-THAN NOR EQUAL TO + : "Ɉ" U0248 # LATIN CAPITAL LETTER J WITH STROKE + : "ɉ" U0249 # LATIN SMALL LETTER J WITH STROKE + : "ᵼ" U1D7C # LATIN SMALL LETTER IOTA WITH STROKE + : "ɟ" U025F # LATIN SMALL LETTER DOTLESS J WITH STROKE + : "≮" U226E # NOT LESS-THAN + : "≰" U2270 # NEITHER LESS-THAN NOR EQUAL TO + : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE + : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE +

: "Ᵽ" U2C63 # LATIN CAPITAL LETTER P WITH STROKE +

: "ᵽ" U1D7D # LATIN SMALL LETTER P WITH STROKE + : "Ɍ" U024C # LATIN CAPITAL LETTER R WITH STROKE + : "ɍ" U024D # LATIN SMALL LETTER R WITH STROKE + : "Ʉ" U0244 # LATIN CAPITAL LETTER U BAR + : "ʉ" U0289 # LATIN SMALL LETTER U BAR + : "Ɏ" U024E # LATIN CAPITAL LETTER Y WITH STROKE + : "ɏ" U024F # LATIN SMALL LETTER Y WITH STROKE + : "/" slash # SOLIDUS + : "̸" U0338 # COMBINING LONG SOLIDUS OVERLAY + : "/" slash # SOLIDUS + : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE + : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS + : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON + : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE + : "≃" similarequal # ASYMPTOTICALLY EQUAL TO + : "≲" U2272 # LESS-THAN OR EQUIVALENT TO + : "≳" U2273 # GREATER-THAN OR EQUIVALENT TO + : "̃" U0303 # COMBINING TILDE + : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE + : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE + : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE + : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE + : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE + : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE + : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON + : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON + : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON + : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON + : "ɟ" U025F # LATIN SMALL LETTER DOTLESS J WITH STROKE + : "ɟ" U025F # LATIN SMALL LETTER DOTLESS J WITH STROKE + : "Ắ" Abreveacute # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE + : "ắ" abreveacute # LATIN SMALL LETTER A WITH BREVE AND ACUTE + : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE + : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE + : "Ấ" Acircumflexacute # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE + : "ấ" acircumflexacute # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + : "Ế" Ecircumflexacute # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE + : "ế" ecircumflexacute # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + : "Ố" Ocircumflexacute # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE + : "ố" ocircumflexacute # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE + : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE + : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + : "Ớ" Ohornacute # LATIN CAPITAL LETTER O WITH HORN AND ACUTE + : "ớ" ohornacute # LATIN SMALL LETTER O WITH HORN AND ACUTE + : "Ứ" Uhornacute # LATIN CAPITAL LETTER U WITH HORN AND ACUTE + : "ứ" uhornacute # LATIN SMALL LETTER U WITH HORN AND ACUTE + : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE + : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE + : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE + : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE + : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE + : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE + : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE + : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE + : "Ặ" Abrevebelowdot # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW + : "ặ" abrevebelowdot # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + : "Ậ" Acircumflexbelowdot # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "ậ" acircumflexbelowdot # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW + : "Ệ" Ecircumflexbelowdot # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "ệ" ecircumflexbelowdot # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW + : "Ộ" Ocircumflexbelowdot # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "ộ" ocircumflexbelowdot # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW + : "Ợ" Ohornbelowdot # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW + : "ợ" ohornbelowdot # LATIN SMALL LETTER O WITH HORN AND DOT BELOW + : "Ự" Uhornbelowdot # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW + : "ự" uhornbelowdot # LATIN SMALL LETTER U WITH HORN AND DOT BELOW + : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON + : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON + : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON + : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "Ằ" Abrevegrave # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE + : "ằ" abrevegrave # LATIN SMALL LETTER A WITH BREVE AND GRAVE + : "Ẳ" Abrevehook # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE + : "ẳ" abrevehook # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + : "Ẵ" Abrevetilde # LATIN CAPITAL LETTER A WITH BREVE AND TILDE + : "ẵ" abrevetilde # LATIN SMALL LETTER A WITH BREVE AND TILDE + : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON + : "₵" U20B5 # CEDI SIGN + : "₵" U20B5 # CEDI SIGN + : "₵" U20B5 # CEDI SIGN + : "₵" U20B5 # CEDI SIGN + : "Ầ" Acircumflexgrave # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE + : "ầ" acircumflexgrave # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE + : "Ề" Ecircumflexgrave # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE + : "ề" ecircumflexgrave # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + : "Ồ" Ocircumflexgrave # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE + : "ồ" ocircumflexgrave # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE + : "Ẩ" Acircumflexhook # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "ẩ" acircumflexhook # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + : "Ể" Ecircumflexhook # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "ể" ecircumflexhook # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + : "Ổ" Ocircumflexhook # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "ổ" ocircumflexhook # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + : "Ẫ" Acircumflextilde # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE + : "ẫ" acircumflextilde # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE + : "Ễ" Ecircumflextilde # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE + : "ễ" ecircumflextilde # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE + : "Ỗ" Ocircumflextilde # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE + : "ỗ" ocircumflextilde # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE + : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON + : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON + : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON + : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON + : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS + : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS + : "Ờ" Ohorngrave # LATIN CAPITAL LETTER O WITH HORN AND GRAVE + : "ờ" ohorngrave # LATIN SMALL LETTER O WITH HORN AND GRAVE + : "Ừ" Uhorngrave # LATIN CAPITAL LETTER U WITH HORN AND GRAVE + : "ừ" uhorngrave # LATIN SMALL LETTER U WITH HORN AND GRAVE + : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE + : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE + : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE + : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE + : "Ở" Ohornhook # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE + : "ở" ohornhook # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + : "Ử" Uhornhook # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE + : "ử" uhornhook # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + : "Ỡ" Ohorntilde # LATIN CAPITAL LETTER O WITH HORN AND TILDE + : "ỡ" ohorntilde # LATIN SMALL LETTER O WITH HORN AND TILDE + : "Ữ" Uhorntilde # LATIN CAPITAL LETTER U WITH HORN AND TILDE + : "ữ" uhorntilde # LATIN SMALL LETTER U WITH HORN AND TILDE + : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON + : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON + : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON + : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON + : "ϒ" U03D2 # GREEK UPSILON WITH HOOK SYMBOL + : "ϒ" U03D2 # GREEK UPSILON WITH HOOK SYMBOL + : "Ᾱ" U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON + : "Ᾱ" U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON + : "ᾱ" U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON + : "ᾱ" U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON + : "Ῑ" U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON + : "Ῑ" U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON + : "ῑ" U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON + : "ῑ" U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON + : "Ῡ" U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON + : "Ῡ" U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON + : "ῡ" U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON + : "ῡ" U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON + : "ϼ" U03FC # GREEK RHO WITH STROKE SYMBOL + : "ϼ" U03FC # GREEK RHO WITH STROKE SYMBOL + +# +# Cyrillic NFDs +# + + : "а̏" # CYRILLIC SMALL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT + : "а̏" # CYRILLIC SMALL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT + + : "а̑" # CYRILLIC SMALL LETTER A WITH COMBINING INVERTED BREVE + + : "а̀" # CYRILLIC SMALL LETTER A WITH COMBINING GRAVE ACCENT + : "а̀" # CYRILLIC SMALL LETTER A WITH COMBINING GRAVE ACCENT + + : "а́" # CYRILLIC SMALL LETTER A WITH COMBINING ACUTE ACCENT + : "а́" # CYRILLIC SMALL LETTER A WITH COMBINING ACUTE ACCENT + : "а́" # CYRILLIC SMALL LETTER A WITH COMBINING ACUTE ACCENT + + : "а̄" # CYRILLIC SMALL LETTER A WITH COMBINING MACRON + : "а̄" # CYRILLIC SMALL LETTER A WITH COMBINING MACRON + : "а̄" # CYRILLIC SMALL LETTER A WITH COMBINING MACRON + + : "а̂" # CYRILLIC SMALL LETTER A WITH COMBINING CIRCUMFLEX ACCENT + : "а̂" # CYRILLIC SMALL LETTER A WITH COMBINING CIRCUMFLEX ACCENT + + : "А̏" # CYRILLIC CAPITAL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT + : "А̏" # CYRILLIC CAPITAL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT + + : "А̑" # CYRILLIC CAPITAL LETTER A WITH COMBINING INVERTED BREVE + + : "А̀" # CYRILLIC CAPITAL LETTER A WITH COMBINING GRAVE ACCENT + : "А̀" # CYRILLIC CAPITAL LETTER A WITH COMBINING GRAVE ACCENT + + : "А́" # CYRILLIC CAPITAL LETTER A WITH COMBINING ACUTE ACCENT + : "А́" # CYRILLIC CAPITAL LETTER A WITH COMBINING ACUTE ACCENT + : "А́" # CYRILLIC CAPITAL LETTER A WITH COMBINING ACUTE ACCENT + + : "А̄" # CYRILLIC CAPITAL LETTER A WITH COMBINING MACRON + : "А̄" # CYRILLIC CAPITAL LETTER A WITH COMBINING MACRON + : "А̄" # CYRILLIC CAPITAL LETTER A WITH COMBINING MACRON + + : "А̂" # CYRILLIC CAPITAL LETTER A WITH COMBINING CIRCUMFLEX ACCENT + : "А̂" # CYRILLIC CAPITAL LETTER A WITH COMBINING CIRCUMFLEX ACCENT + + : "е̏" # CYRILLIC SMALL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT + : "е̏" # CYRILLIC SMALL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT + + : "е̑" # CYRILLIC SMALL LETTER IE WITH COMBINING INVERTED BREVE + + : "е́" # CYRILLIC SMALL LETTER IE WITH COMBINING ACUTE ACCENT + : "е́" # CYRILLIC SMALL LETTER IE WITH COMBINING ACUTE ACCENT + : "е́" # CYRILLIC SMALL LETTER IE WITH COMBINING ACUTE ACCENT + + : "е̄" # CYRILLIC SMALL LETTER IE WITH COMBINING MACRON + : "е̄" # CYRILLIC SMALL LETTER IE WITH COMBINING MACRON + : "е̄" # CYRILLIC SMALL LETTER IE WITH COMBINING MACRON + + : "е̂" # CYRILLIC SMALL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT + : "е̂" # CYRILLIC SMALL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT + + : "Е̏" # CYRILLIC CAPITAL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT + : "Е̏" # CYRILLIC CAPITAL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT + + : "Е̑" # CYRILLIC CAPITAL LETTER IE WITH COMBINING INVERTED BREVE + + : "Е́" # CYRILLIC CAPITAL LETTER IE WITH COMBINING ACUTE ACCENT + : "Е́" # CYRILLIC CAPITAL LETTER IE WITH COMBINING ACUTE ACCENT + : "Е́" # CYRILLIC CAPITAL LETTER IE WITH COMBINING ACUTE ACCENT + + : "Е̄" # CYRILLIC CAPITAL LETTER IE WITH COMBINING MACRON + : "Е̄" # CYRILLIC CAPITAL LETTER IE WITH COMBINING MACRON + : "Е̄" # CYRILLIC CAPITAL LETTER IE WITH COMBINING MACRON + + : "Е̂" # CYRILLIC CAPITAL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT + : "Е̂" # CYRILLIC CAPITAL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT + + : "и̏" # CYRILLIC SMALL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT + : "и̏" # CYRILLIC SMALL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT + + : "и̑" # CYRILLIC SMALL LETTER I WITH COMBINING INVERTED BREVE + + : "и́" # CYRILLIC SMALL LETTER I WITH COMBINING ACUTE ACCENT + : "и́" # CYRILLIC SMALL LETTER I WITH COMBINING ACUTE ACCENT + : "и́" # CYRILLIC SMALL LETTER I WITH COMBINING ACUTE ACCENT + + : "и̂" # CYRILLIC SMALL LETTER I WITH COMBINING CIRCUMFLEX ACCENT + : "и̂" # CYRILLIC SMALL LETTER I WITH COMBINING CIRCUMFLEX ACCENT + + : "И̏" # CYRILLIC CAPITAL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT + : "И̏" # CYRILLIC CAPITAL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT + + : "И̑" # CYRILLIC CAPITAL LETTER I WITH COMBINING INVERTED BREVE + + : "И́" # CYRILLIC CAPITAL LETTER I WITH COMBINING ACUTE ACCENT + : "И́" # CYRILLIC CAPITAL LETTER I WITH COMBINING ACUTE ACCENT + : "И́" # CYRILLIC CAPITAL LETTER I WITH COMBINING ACUTE ACCENT + + : "И̂" # CYRILLIC CAPITAL LETTER I WITH COMBINING CIRCUMFLEX ACCENT + : "И̂" # CYRILLIC CAPITAL LETTER I WITH COMBINING CIRCUMFLEX ACCENT + + : "о̏" # CYRILLIC SMALL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT + : "о̏" # CYRILLIC SMALL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT + + : "о̑" # CYRILLIC SMALL LETTER O WITH COMBINING INVERTED BREVE + + : "о̀" # CYRILLIC SMALL LETTER O WITH COMBINING GRAVE ACCENT + : "о̀" # CYRILLIC SMALL LETTER O WITH COMBINING GRAVE ACCENT + + : "о́" # CYRILLIC SMALL LETTER O WITH COMBINING ACUTE ACCENT + : "о́" # CYRILLIC SMALL LETTER O WITH COMBINING ACUTE ACCENT + : "о́" # CYRILLIC SMALL LETTER O WITH COMBINING ACUTE ACCENT + + : "о̄" # CYRILLIC SMALL LETTER O WITH COMBINING MACRON + : "о̄" # CYRILLIC SMALL LETTER O WITH COMBINING MACRON + : "о̄" # CYRILLIC SMALL LETTER O WITH COMBINING MACRON + + : "о̂" # CYRILLIC SMALL LETTER O WITH COMBINING CIRCUMFLEX ACCENT + : "о̂" # CYRILLIC SMALL LETTER O WITH COMBINING CIRCUMFLEX ACCENT + + : "О̏" # CYRILLIC CAPITAL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT + : "О̏" # CYRILLIC CAPITAL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT + + : "О̑" # CYRILLIC CAPITAL LETTER O WITH COMBINING INVERTED BREVE + + : "О̀" # CYRILLIC CAPITAL LETTER O WITH COMBINING GRAVE ACCENT + : "О̀" # CYRILLIC CAPITAL LETTER O WITH COMBINING GRAVE ACCENT + + : "О́" # CYRILLIC CAPITAL LETTER O WITH COMBINING ACUTE ACCENT + : "О́" # CYRILLIC CAPITAL LETTER O WITH COMBINING ACUTE ACCENT + : "О́" # CYRILLIC CAPITAL LETTER O WITH COMBINING ACUTE ACCENT + + : "О̄" # CYRILLIC CAPITAL LETTER O WITH COMBINING MACRON + : "О̄" # CYRILLIC CAPITAL LETTER O WITH COMBINING MACRON + : "О̄" # CYRILLIC CAPITAL LETTER O WITH COMBINING MACRON + + : "О̂" # CYRILLIC CAPITAL LETTER O WITH COMBINING CIRCUMFLEX ACCENT + : "О̂" # CYRILLIC CAPITAL LETTER O WITH COMBINING CIRCUMFLEX ACCENT + + : "у̏" # CYRILLIC SMALL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT + : "у̏" # CYRILLIC SMALL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT + + : "у̑" # CYRILLIC SMALL LETTER U WITH COMBINING INVERTED BREVE + + : "у̀" # CYRILLIC SMALL LETTER U WITH COMBINING GRAVE ACCENT + : "у̀" # CYRILLIC SMALL LETTER U WITH COMBINING GRAVE ACCENT + + : "у́" # CYRILLIC SMALL LETTER U WITH COMBINING ACUTE ACCENT + : "у́" # CYRILLIC SMALL LETTER U WITH COMBINING ACUTE ACCENT + : "у́" # CYRILLIC SMALL LETTER U WITH COMBINING ACUTE ACCENT + + : "у̂" # CYRILLIC SMALL LETTER U WITH COMBINING CIRCUMFLEX ACCENT + : "у̂" # CYRILLIC SMALL LETTER U WITH COMBINING CIRCUMFLEX ACCENT + + : "У̏" # CYRILLIC CAPITAL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT + : "У̏" # CYRILLIC CAPITAL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT + + : "У̑" # CYRILLIC CAPITAL LETTER U WITH COMBINING INVERTED BREVE + + : "У̀" # CYRILLIC CAPITAL LETTER U WITH COMBINING GRAVE ACCENT + : "У̀" # CYRILLIC CAPITAL LETTER U WITH COMBINING GRAVE ACCENT + + : "У́" # CYRILLIC CAPITAL LETTER U WITH COMBINING ACUTE ACCENT + : "У́" # CYRILLIC CAPITAL LETTER U WITH COMBINING ACUTE ACCENT + : "У́" # CYRILLIC CAPITAL LETTER U WITH COMBINING ACUTE ACCENT + + : "У̂" # CYRILLIC CAPITAL LETTER U WITH COMBINING CIRCUMFLEX ACCENT + : "У̂" # CYRILLIC CAPITAL LETTER U WITH COMBINING CIRCUMFLEX ACCENT + + : "р̏" # CYRILLIC SMALL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT + : "р̏" # CYRILLIC SMALL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT + + : "р̑" # CYRILLIC SMALL LETTER ER WITH COMBINING INVERTED BREVE + + : "р̀" # CYRILLIC SMALL LETTER ER WITH COMBINING GRAVE ACCENT + : "р̀" # CYRILLIC SMALL LETTER ER WITH COMBINING GRAVE ACCENT + + : "р́" # CYRILLIC SMALL LETTER ER WITH COMBINING ACUTE ACCENT + : "р́" # CYRILLIC SMALL LETTER ER WITH COMBINING ACUTE ACCENT + : "р́" # CYRILLIC SMALL LETTER ER WITH COMBINING ACUTE ACCENT + + : "р̄" # CYRILLIC SMALL LETTER ER WITH COMBINING MACRON + : "р̄" # CYRILLIC SMALL LETTER ER WITH COMBINING MACRON + : "р̄" # CYRILLIC SMALL LETTER ER WITH COMBINING MACRON + + : "р̂" # CYRILLIC SMALL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT + : "р̂" # CYRILLIC SMALL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT + + : "Р̏" # CYRILLIC CAPITAL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT + : "Р̏" # CYRILLIC CAPITAL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT + + : "Р̑" # CYRILLIC CAPITAL LETTER ER WITH COMBINING INVERTED BREVE + + : "Р̀" # CYRILLIC CAPITAL LETTER ER WITH COMBINING GRAVE ACCENT + : "Р̀" # CYRILLIC CAPITAL LETTER ER WITH COMBINING GRAVE ACCENT + + : "Р́" # CYRILLIC CAPITAL LETTER ER WITH COMBINING ACUTE ACCENT + : "Р́" # CYRILLIC CAPITAL LETTER ER WITH COMBINING ACUTE ACCENT + : "Р́" # CYRILLIC CAPITAL LETTER ER WITH COMBINING ACUTE ACCENT + + : "Р̄" # CYRILLIC CAPITAL LETTER ER WITH COMBINING MACRON + : "Р̄" # CYRILLIC CAPITAL LETTER ER WITH COMBINING MACRON + : "Р̄" # CYRILLIC CAPITAL LETTER ER WITH COMBINING MACRON + + : "Р̂" # CYRILLIC CAPITAL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT + : "Р̂" # CYRILLIC CAPITAL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT + + : "🙌" # PERSON RAISING BOTH HANDS IN CELEBRATION + +# APL support Geoff Streeter 2012-01-04 + +# APL was initially an overstruck language. The original APL terminal was an IBM golfball +# with a specially designed golfball. This meant that characters could be overstruck to +# produce other characters. This gave APL a richness of primitives which is still powerful +# today. Overstrikes were always independent of order. + +# APLs have extended this into a number of dialects. Let us try to support lots of them. +# Together with some that have not been used yet. Some traditional ones are not included. + +# Characters from "Mathematical Operators" + + : "√" U221a # v / SQUARE ROOT + : "√" U221a # / v SQUARE ROOT + <8> <8> : "∞" U221e # 8 8 INFINITY + : "≡" U2261 # = _ IDENTICAL TO + : "≢" U2262 # _ ≠ NOT IDENTICAL TO + : "≢" U2262 # ≠ _ NOT IDENTICAL TO + : "≤" U2264 # < _ LESS-THAN OR EQUAL TO + : "≤" U2264 # _ < LESS-THAN OR EQUAL TO + : "≥" U2265 # > _ GREATER-THAN OR EQUAL TO + : "≥" U2265 # _ > GREATER-THAN OR EQUAL TO + : "⊆" U2286 # _ ⊂ SUBSET OF OR EQUAL TO + : "⊆" U2286 # ⊂ _ SUBSET OF OR EQUAL TO + : "⊇" U2287 # _ ⊃ SUPERSET OF OR EQUAL TO + : "⊇" U2287 # ⊃ _ SUPERSET OF OR EQUAL TO + : "⊖" U2296 # ○ - CIRCLED MINUS + : "⊖" U2296 # - ○ CIRCLED MINUS + : "⊙" U2299 # ○ - CIRCLED DOT + : "⊙" U2299 # - ○ CIRCLED DOT + : "⋄" U22c4 # < > DIAMOND OPERATOR + : "⋄" U22c4 # > < DIAMOND OPERATOR + : "⋄" U22c4 # ∧ ∨ DIAMOND OPERATOR + : "⋄" U22c4 # ∨ ∧ DIAMOND OPERATOR + : "∴" therefore # THEREFORE + : "∵" because # BECAUSE + +# Characters from "Miscellaneous Technical" + + : "⌶" U2336 # ⊥ ⊤ APL FUNCTIONAL SYMBOL I-BEAM + : "⌶" U2336 # ⊥ ⊤ APL FUNCTIONAL SYMBOL I-BEAM + : "⌷" U2337 # [ ] APL FUNCTIONAL SYMBOL SQUISH QUAD + : "⌷" U2337 # ] [ APL FUNCTIONAL SYMBOL SQUISH QUAD + : "⌸" U2338 # ⎕ = APL FUNCTIONAL SYMBOL QUAD EQUAL + : "⌸" U2338 # = ⎕ APL FUNCTIONAL SYMBOL QUAD EQUAL + : "⌹" U2339 # ⎕ ÷ APL FUNCTIONAL SYMBOL QUAD DIVIDE + : "⌹" U2339 # ÷ ⎕ APL FUNCTIONAL SYMBOL QUAD DIVIDE + : "⌺" U233a # ⎕ ⋄ APL FUNCTIONAL SYMBOL QUAD DIAMOND + : "⌺" U233a # ⋄ ⎕ APL FUNCTIONAL SYMBOL QUAD DIAMOND + : "⌻" U233b # ⎕ ∘ APL FUNCTIONAL SYMBOL QUAD JOT + : "⌻" U233b # ∘ ⎕ APL FUNCTIONAL SYMBOL QUAD JOT + : "⌼" U233c # ⎕ ○ APL FUNCTIONAL SYMBOL QUAD CIRCLE + : "⌼" U233c # ○ ⎕ APL FUNCTIONAL SYMBOL QUAD CIRCLE + : "⌽" U233d # ○ | APL FUNCTIONAL SYMBOL CIRCLE STILE + : "⌽" U233d # | ○ APL FUNCTIONAL SYMBOL CIRCLE STILE + : "⌾" U233e # ○ ∘ APL FUNCTIONAL SYMBOL CIRCLE JOT + : "⌾" U233e # ∘ ○ APL FUNCTIONAL SYMBOL CIRCLE JOT + : "⌿" U233f # / - APL FUNCTIONAL SYMBOL SLASH BAR + : "⌿" U233f # - / APL FUNCTIONAL SYMBOL SLASH BAR + : "⍀" U2340 # \ - APL FUNCTIONAL SYMBOL BACKSLASH BAR + : "⍀" U2340 # - \ APL FUNCTIONAL SYMBOL BACKSLASH BAR + : "⍁" U2341 # / ⎕ APL FUNCTIONAL SYMBOL QUAD SLASH + : "⍁" U2341 # ⎕ / APL FUNCTIONAL SYMBOL QUAD SLASH + : "⍂" U2342 # \ ⎕ APL FUNCTIONAL SYMBOL QUAD BACKSLASH + : "⍂" U2342 # ⎕ \ APL FUNCTIONAL SYMBOL QUAD BACKSLASH + : "⍃" U2343 # < ⎕ APL FUNCTIONAL SYMBOL QUAD LESS-THAN + : "⍃" U2343 # ⎕ < APL FUNCTIONAL SYMBOL QUAD LESS-THAN + : "⍄" U2344 # > ⎕ APL FUNCTIONAL SYMBOL QUAD GREATER-THAN + : "⍄" U2344 # ⎕ > APL FUNCTIONAL SYMBOL QUAD GREATER-THAN + : "⍅" U2345 # ← | APL FUNCTIONAL SYMBOL LEFTWARDS VANE + : "⍅" U2345 # | ← APL FUNCTIONAL SYMBOL LEFTWARDS VANE + : "⍆" U2346 # → | APL FUNCTIONAL SYMBOL RIGHTWARDS VANE + : "⍆" U2346 # | → APL FUNCTIONAL SYMBOL RIGHTWARDS VANE + : "⍇" U2347 # ← ⎕ APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW + : "⍇" U2347 # ⎕ ← APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW + : "⍈" U2348 # → ⎕ APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW + : "⍈" U2348 # ⎕ → APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW + : "⍉" U2349 # ○ \ APL FUNCTIONAL SYMBOL CIRCLE SLOPE + : "⍉" U2349 # \ ○ APL FUNCTIONAL SYMBOL CIRCLE SLOPE + : "⍊" U234a # _ ⊥ APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR + : "⍊" U234a # ⊥ _ APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR + : "⍋" U234b # ∆ | APL FUNCTIONAL SYMBOL DELTA STILE + : "⍋" U234b # | ∆ APL FUNCTIONAL SYMBOL DELTA STILE + : "⍌" U234c # ∨ ⎕ APL FUNCTIONAL SYMBOL QUAD DOWN CARET + : "⍌" U234c # ⎕ ∨ APL FUNCTIONAL SYMBOL QUAD DOWN CARET + : "⍍" U234d # ∆ ⎕ APL FUNCTIONAL SYMBOL QUAD DELTA + : "⍍" U234d # ⎕ ∆ APL FUNCTIONAL SYMBOL QUAD DELTA + : "⍎" U234e # ∘ ⊥ APL FUNCTIONAL SYMBOL DOWN TACK JOT + : "⍎" U234e # ⊥ ∘ APL FUNCTIONAL SYMBOL DOWN TACK JOT + : "⍏" U234f # ↑ - APL FUNCTIONAL SYMBOL UPWARDS VANE + : "⍏" U234f # - ↑ APL FUNCTIONAL SYMBOL UPWARDS VANE + : "⍐" U2350 # ↑ ⎕ APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW + : "⍐" U2350 # ⎕ ↑ APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW +# I cannot get anything to work with . Given that no extant APLs use ⍑ I will just leave the lines +# in place. + : "⍑" U2351 # ¯ ⊤ APL FUNCTIONAL SYMBOL UP TACK OVERBAR + : "⍑" U2351 # ⊤ ¯ APL FUNCTIONAL SYMBOL UP TACK OVERBAR + : "⍒" U2352 # ∇ | APL FUNCTIONAL SYMBOL DEL STILE + : "⍒" U2352 # | ∇ APL FUNCTIONAL SYMBOL DEL STILE + : "⍓" U2353 # ∧ ⎕ APL FUNCTIONAL SYMBOL QUAD UP CARET + : "⍓" U2353 # ⎕ ∧ APL FUNCTIONAL SYMBOL QUAD UP CARET + : "⍔" U2354 # ∇ ⎕ APL FUNCTIONAL SYMBOL QUAD DEL + : "⍔" U2354 # ⎕ ∇ APL FUNCTIONAL SYMBOL QUAD DEL + : "⍕" U2355 # ∘ ⊤ APL FUNCTIONAL SYMBOL UP TACK JOT + : "⍕" U2355 # ⊤ ∘ APL FUNCTIONAL SYMBOL UP TACK JOT + : "⍖" U2356 # ↓ - APL FUNCTIONAL SYMBOL DOWNWARDS VANE + : "⍖" U2356 # - ↓ APL FUNCTIONAL SYMBOL DOWNWARDS VANE + : "⍗" U2357 # ↓ ⎕ APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW + : "⍗" U2357 # ⎕ ↓ APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW +# This line clashes with the (and similar) that appear to be there to provide +# a work around for the problems with . Or to cope with keyboards that do not have (more likely). +# All APL keyboards have , it is used as the -ve sign for numbers. +# I do not know of an extant APL using ⍘ + : "⍘" U2358 # _ ' APL FUNCTIONAL SYMBOL QUOTE UNDERBAR + : "⍙" U2359 # ∆ _ APL FUNCTIONAL SYMBOL DELTA UNDERBAR + : "⍙" U2359 # _ ∆ APL FUNCTIONAL SYMBOL DELTA UNDERBAR + : "⍚" U235a # ⋄ _ APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR + : "⍚" U235a # _ ⋄ APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR + : "⍛" U235b # ∘ _ APL FUNCTIONAL SYMBOL JOT UNDERBAR + : "⍛" U235b # _ ∘ APL FUNCTIONAL SYMBOL JOT UNDERBAR + : "⍜" U235c # ○ _ APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR + : "⍜" U235c # _ ○ APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR + : "⍝" U235d # ∘ ∩ APL FUNCTIONAL SYMBOL UP SHOE JOT + : "⍝" U235d # ∩ ∘ APL FUNCTIONAL SYMBOL UP SHOE JOT + : "⍞" U235e # * ¨ APL FUNCTIONAL SYMBOL QUOTE QUAD + : "⍞" U235e # ¨ * APL FUNCTIONAL SYMBOL QUOTE QUAD + : "⍟" U235f # ○ * APL FUNCTIONAL SYMBOL CIRCLE STAR + : "⍟" U235f # * ○ APL FUNCTIONAL SYMBOL CIRCLE STAR + : "⍠" U2360 # : ⎕ APL FUNCTIONAL SYMBOL QUAD COLON + : "⍠" U2360 # ⎕ : APL FUNCTIONAL SYMBOL QUAD COLON + : "⍡" U2361 # ¨ ⊤ APL FUNCTIONAL SYMBOL UP TACK DIAERESIS + : "⍡" U2361 # ⊤ ¨ APL FUNCTIONAL SYMBOL UP TACK DIAERESIS + : "⍢" U2362 # ¨ ∇ APL FUNCTIONAL SYMBOL DEL DIAERESIS + : "⍢" U2362 # ∇ ¨ APL FUNCTIONAL SYMBOL DEL DIAERESIS + : "⍣" U2363 # * ¨ APL FUNCTIONAL SYMBOL STAR DIAERESIS + : "⍣" U2363 # ¨ * APL FUNCTIONAL SYMBOL STAR DIAERESIS + : "⍤" U2364 # ∘ ¨ APL FUNCTIONAL SYMBOL JOT DIAERESIS + : "⍤" U2364 # ¨ ∘ APL FUNCTIONAL SYMBOL JOT DIAERESIS + : "⍥" U2365 # ○ ¨ APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS + : "⍥" U2365 # ¨ ○ APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS + : "⍦" U2366 # ∪ | APL FUNCTIONAL SYMBOL DOWN SHOE STILE + : "⍦" U2366 # | ∪ APL FUNCTIONAL SYMBOL DOWN SHOE STILE + : "⍧" U2367 # ⊂ | APL FUNCTIONAL SYMBOL LEFT SHOE STILE + : "⍧" U2367 # | ⊂ APL FUNCTIONAL SYMBOL LEFT SHOE STILE + : "⍨" U2368 # ~ ¨ APL FUNCTIONAL SYMBOL TILDE DIAERESIS + : "⍩" U2369 # ¨ > APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS + : "⍩" U2369 # > ¨ APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS + : "⍫" U236b # ∇ ~ APL FUNCTIONAL SYMBOL DEL TILDE + : "⍫" U236b # ~ ∇ APL FUNCTIONAL SYMBOL DEL TILDE + <0> : "⍬" U236c # 0 ~ APL FUNCTIONAL SYMBOL ZILDE + <0> : "⍬" U236c # ~ 0 APL FUNCTIONAL SYMBOL ZILDE + : "⍭" U236d # | ~ APL FUNCTIONAL SYMBOL STILE TILDE + : "⍭" U236d # ~ | APL FUNCTIONAL SYMBOL STILE TILDE +# This line does not work. It clashes with +# for Ǭ and +# for ǭ. +# Given that no extant APLs use ⍮ I will just leave the line in place. + : "⍮" U236e # ; _ APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR + : "⍯" U236f # ≠ ⎕ APL FUNCTIONAL SYMBOL QUAD NOT EQUAL + : "⍯" U236f # ⎕ ≠ APL FUNCTIONAL SYMBOL QUAD NOT EQUAL + : "⍰" U2370 # ? ⎕ APL FUNCTIONAL SYMBOL QUAD QUESTION + : "⍰" U2370 # ⎕ ? APL FUNCTIONAL SYMBOL QUAD QUESTION + : "⍱" U2371 # ∨ ~ APL FUNCTIONAL SYMBOL DOWN CARET TILDE + : "⍱" U2371 # ~ ∨ APL FUNCTIONAL SYMBOL DOWN CARET TILDE + : "⍲" U2372 # ∧ ~ APL FUNCTIONAL SYMBOL UP CARET TILDE + : "⍲" U2372 # ~ ∧ APL FUNCTIONAL SYMBOL UP CARET TILDE + : "⍶" U2376 # ⍺ _ APL FUNCTIONAL SYMBOL ALPHA UNDERBAR + : "⍶" U2376 # _ ⍺ APL FUNCTIONAL SYMBOL ALPHA UNDERBAR + : "⍷" U2377 # ∊ _ APL FUNCTIONAL SYMBOL EPSILON UNDERBAR + : "⍷" U2377 # _ ∊ APL FUNCTIONAL SYMBOL EPSILON UNDERBAR + : "⍸" U2378 # ⍳ _ APL FUNCTIONAL SYMBOL IOTA UNDERBAR + : "⍸" U2378 # _ ⍳ APL FUNCTIONAL SYMBOL IOTA UNDERBAR + : "⍹" U2379 # ⍵ _ APL FUNCTIONAL SYMBOL OMEGA UNDERBAR + : "⍹" U2379 # _ ⍵ APL FUNCTIONAL SYMBOL OMEGA UNDERBAR diff --git a/test/data/locale/locale.alias b/test/data/locale/locale.alias new file mode 100644 index 0000000..03cd99c --- /dev/null +++ b/test/data/locale/locale.alias @@ -0,0 +1,2482 @@ +# +# This file contains alias names of locales. +# Each alias name is described within one line. +# The first word is the alias name (simplified locale name), +# the second word is the full locale name. +# +# +POSIX C +POSIX-UTF2 C +C_C.C C +C.en C +C.ASCII C +C.iso88591 en_US.ISO8859-1 +Cextend en_US.ISO8859-1 +Cextend.en en_US.ISO8859-1 +English_United-States.437 C +C.UTF-8 en_US.UTF-8 +# a3 is not an ISO 639 language code, but in Cyrillic, "Z" looks like "3". +a3 az_AZ.KOI8-C +a3_AZ az_AZ.KOI8-C +a3_AZ.koi8c az_AZ.KOI8-C +a3_AZ.KOI-C az_AZ.KOI8-C +a3_AZ.UTF-8 az_AZ.UTF-8 +af af_ZA.ISO8859-1 +af_ZA af_ZA.ISO8859-1 +af_ZA.iso88591 af_ZA.ISO8859-1 +af_ZA.ISO-8859-1 af_ZA.ISO8859-1 +af_ZA.utf8 af_ZA.UTF-8 +am am_ET.UTF-8 +am_ET am_ET.UTF-8 +ar ar_AA.ISO8859-6 +ar_AA ar_AA.ISO8859-6 +AR_AA ar_AA.ISO8859-6 +Ar_AA ar_AA.ISO8859-6 +AR_AA.UTF-8 ar_AA.UTF-8 +ar_AA.iso88596 ar_AA.ISO8859-6 +ar_AA.ISO-8859-6 ar_AA.ISO8859-6 +ar_AE ar_AE.ISO8859-6 +ar_AE.iso88596 ar_AE.ISO8859-6 +ar_AE.ISO-8859-6 ar_AE.ISO8859-6 +ar_AE.utf8 ar_AE.UTF-8 +ar_BH ar_BH.ISO8859-6 +ar_BH.iso88596 ar_BH.ISO8859-6 +ar_BH.ISO-8859-6 ar_BH.ISO8859-6 +ar_BH.utf8 ar_BH.UTF-8 +ar_DZ ar_DZ.ISO8859-6 +ar_DZ.iso88596 ar_DZ.ISO8859-6 +ar_DZ.ISO-8859-6 ar_DZ.ISO8859-6 +ar_DZ.utf8 ar_DZ.UTF-8 +ar_EG ar_EG.ISO8859-6 +ar_EG.iso88596 ar_EG.ISO8859-6 +ar_EG.ISO-8859-6 ar_EG.ISO8859-6 +ar_EG.utf8 ar_EG.UTF-8 +ar_IN ar_IN.UTF-8 +ar_IN.utf8 ar_IN.UTF-8 +ar_IQ ar_IQ.ISO8859-6 +ar_IQ.iso88596 ar_IQ.ISO8859-6 +ar_IQ.ISO-8859-6 ar_IQ.ISO8859-6 +ar_IQ.utf8 ar_IQ.UTF-8 +ar_JO ar_JO.ISO8859-6 +ar_JO.iso88596 ar_JO.ISO8859-6 +ar_JO.ISO-8859-6 ar_JO.ISO8859-6 +ar_JO.utf8 ar_JO.UTF-8 +ar_KW ar_KW.ISO8859-6 +ar_KW.iso88596 ar_KW.ISO8859-6 +ar_KW.ISO-8859-6 ar_KW.ISO8859-6 +ar_KW.utf8 ar_KW.UTF-8 +ar_LB ar_LB.ISO8859-6 +ar_LB.iso88596 ar_LB.ISO8859-6 +ar_LB.ISO-8859-6 ar_LB.ISO8859-6 +ar_LB.utf8 ar_LB.UTF-8 +ar_LY ar_LY.ISO8859-6 +ar_LY.iso88596 ar_LY.ISO8859-6 +ar_LY.ISO-8859-6 ar_LY.ISO8859-6 +ar_LY.utf8 ar_LY.UTF-8 +ar_MA ar_MA.ISO8859-6 +ar_MA.iso88596 ar_MA.ISO8859-6 +ar_MA.ISO-8859-6 ar_MA.ISO8859-6 +ar_MA.utf8 ar_MA.UTF-8 +ar_OM ar_OM.ISO8859-6 +ar_OM.iso88596 ar_OM.ISO8859-6 +ar_OM.ISO-8859-6 ar_OM.ISO8859-6 +ar_OM.utf8 ar_OM.UTF-8 +ar_QA ar_QA.ISO8859-6 +ar_QA.iso88596 ar_QA.ISO8859-6 +ar_QA.ISO-8859-6 ar_QA.ISO8859-6 +ar_QA.utf8 ar_QA.UTF-8 +ar_SA ar_SA.ISO8859-6 +ar_SA.iso88596 ar_SA.ISO8859-6 +ar_SA.ISO-8859-6 ar_SA.ISO8859-6 +ar_SA.utf8 ar_SA.UTF-8 +ar_SD ar_SD.ISO8859-6 +ar_SD.iso88596 ar_SD.ISO8859-6 +ar_SD.ISO-8859-6 ar_SD.ISO8859-6 +ar_SD.utf8 ar_SD.UTF-8 +ar_SY ar_SY.ISO8859-6 +ar_SY.iso88596 ar_SY.ISO8859-6 +ar_SY.ISO-8859-6 ar_SY.ISO8859-6 +ar_SY.utf8 ar_SY.UTF-8 +ar_TN ar_TN.ISO8859-6 +ar_TN.iso88596 ar_TN.ISO8859-6 +ar_TN.ISO-8859-6 ar_TN.ISO8859-6 +ar_TN.utf8 ar_TN.UTF-8 +as as_IN.UTF-8 +as_IN as_IN.UTF-8 +as_IN.utf8 as_IN.UTF-8 +ar_YE ar_YE.ISO8859-6 +ar_YE.iso88596 ar_YE.ISO8859-6 +ar_YE.ISO-8859-6 ar_YE.ISO8859-6 +ar_YE.utf8 ar_YE.UTF-8 +az az_AZ.ISO8859-9E +az_AZ az_AZ.ISO8859-9E +az_AZ.iso88599e az_AZ.ISO8859-9E +be be_BY.CP1251 +be@latin be_BY.UTF-8@latin +be_BY be_BY.CP1251 +be_BY@latin be_BY.UTF-8@latin +be_BY.cp1251 be_BY.CP1251 +be_BY.microsoftcp1251 be_BY.CP1251 +be_BY.microsoft-cp1251 be_BY.CP1251 +be_BY.MICROSOFT-CP1251 be_BY.CP1251 +be_BY.utf8 be_BY.UTF-8 +be_BY.utf8@latin be_BY.UTF-8@latin +bg bg_BG.CP1251 +bg_BG bg_BG.CP1251 +bg_BG.cp1251 bg_BG.CP1251 +bg_BG.microsoftcp1251 bg_BG.CP1251 +bg_BG.microsoft-cp1251 bg_BG.CP1251 +bg_BG.MICROSOFT-CP1251 bg_BG.CP1251 +bg_BG.iso88595 bg_BG.ISO8859-5 +bg_BG.ISO-8859-5 bg_BG.ISO8859-5 +bg_BG.koi8r bg_BG.KOI8-R +be_BG.utf8 bg_BG.UTF-8 +bn_IN bn_IN.UTF-8 +bn_IN.utf8 bn_IN.UTF-8 +bo_IN bo_IN.UTF-8 +bo_IN.utf8 bo_IN.UTF-8 +br br_FR.ISO8859-1 +br_FR br_FR.ISO8859-1 +br_FR.iso88591 br_FR.ISO8859-1 +br_FR.ISO-8859-1 br_FR.ISO8859-1 +br_FR.iso885914 br_FR.ISO8859-14 +br_FR.ISO-8859-14 br_FR.ISO8859-14 +br_FR.iso885915 br_FR.ISO8859-15 +br_FR.ISO-8859-15 br_FR.ISO8859-15 +br_FR.ISO-8859-15@euro br_FR.ISO8859-15 +br_FR@euro br_FR.ISO8859-15 +br_FR.UTF-8@euro br_FR.UTF-8 +bs bs_BA.ISO8859-2 +bs_BA bs_BA.ISO8859-2 +bs_BA.iso88592 bs_BA.ISO8859-2 +bs_BA.ISO-8859-2 bs_BA.ISO8859-2 +bs_BA.ISO_8859-2 bs_BA.ISO8859-2 +ca ca_ES.ISO8859-1 +ca_AD ca_AD.ISO8859-1 +ca_AD@euro ca_AD.ISO8859-15 +ca_AD.iso88591 ca_AD.ISO8859-1 +ca_AD.ISO-8859-1 ca_AD.ISO8859-1 +ca_AD.iso885915 ca_AD.ISO8859-15 +ca_AD.utf8 ca_AD.UTF-8 +ca_AD.ISO-8859-15 ca_AD.ISO8859-15 +ca_AD.ISO-8859-15@euro ca_AD.ISO8859-15 +ca_AD.UTF-8@euro ca_AD.UTF-8 +ca_ES ca_ES.ISO8859-1 +ca_ES@euro ca_ES.ISO8859-15 +ca_ES.iso88591 ca_ES.ISO8859-1 +ca_ES.ISO-8859-1 ca_ES.ISO8859-1 +ca_ES.iso885915 ca_ES.ISO8859-15 +ca_ES.utf8 ca_ES.UTF-8 +ca_ES.ISO-8859-15 ca_ES.ISO8859-15 +ca_ES.ISO-8859-15@euro ca_ES.ISO8859-15 +ca_ES.UTF-8@euro ca_ES.UTF-8 +ca_FR ca_FR.ISO8859-1 +ca_FR@euro ca_FR.ISO8859-15 +ca_FR.iso88591 ca_FR.ISO8859-1 +ca_FR.ISO-8859-1 ca_FR.ISO8859-1 +ca_FR.iso885915 ca_FR.ISO8859-15 +ca_FR.utf8 ca_FR.UTF-8 +ca_FR.ISO-8859-15 ca_FR.ISO8859-15 +ca_FR.ISO-8859-15@euro ca_FR.ISO8859-15 +ca_FR.UTF-8@euro ca_FR.UTF-8 +ca_IT ca_IT.ISO8859-1 +ca_IT@euro ca_IT.ISO8859-15 +ca_IT.iso88591 ca_IT.ISO8859-1 +ca_IT.ISO-8859-1 ca_IT.ISO8859-1 +ca_IT.iso885915 ca_IT.ISO8859-15 +ca_IT.utf8 ca_IT.UTF-8 +ca_IT.ISO-8859-15 ca_IT.ISO8859-15 +ca_IT.ISO-8859-15@euro ca_IT.ISO8859-15 +ca_IT.UTF-8@euro ca_IT.UTF-8 +cs cs_CZ.ISO8859-2 +cs_CS cs_CZ.ISO8859-2 +cs_CS.ISO8859-2 cs_CZ.ISO8859-2 +cs_CZ cs_CZ.ISO8859-2 +cs_CZ.iso88592 cs_CZ.ISO8859-2 +cs_CS.iso8859-2 cs_CZ.ISO8859-2 +cs_CZ.ISO-8859-2 cs_CZ.ISO8859-2 +cs_CZ.ISO_8859-2 cs_CZ.ISO8859-2 +cs_CZ.utf8 cs_CZ.UTF-8 +cy cy_GB.ISO8859-1 +cy_GB cy_GB.ISO8859-1 +cy_GB.iso88591 cy_GB.ISO8859-1 +cy_GB.ISO-8859-1 cy_GB.ISO8859-1 +cy_GB.iso885914 cy_GB.ISO8859-14 +cy_GB.ISO-8859-14 cy_GB.ISO8859-14 +cy_GB.iso885915 cy_GB.ISO8859-15 +cy_GB.ISO-8859-15 cy_GB.ISO8859-15 +da da_DK.ISO8859-1 +da.ISO8859-15 da_DK.ISO8859-15 +da_DK da_DK.ISO8859-1 +DA_DK da_DK.ISO8859-1 +da_DK.88591 da_DK.ISO8859-1 +da_DK.88591.en da_DK.ISO8859-1 +da_DK.iso88591 da_DK.ISO8859-1 +da_DK.ISO-8859-1 da_DK.ISO8859-1 +da_DK.ISO_8859-1 da_DK.ISO8859-1 +da_DK.iso885915 da_DK.ISO8859-15 +da_DK.ISO-8859-15 da_DK.ISO8859-15 +da_DK.8859-15 da_DK.ISO8859-15 +da_DK.utf8 da_DK.UTF-8 +DA_DK.UTF-8 da_DK.UTF-8 +de de_DE.ISO8859-1 +de.ISO8859-15 de_DE.ISO8859-15 +de_AT de_AT.ISO8859-1 +de_AT@euro de_AT.ISO8859-15 +de_AT.iso88591 de_AT.ISO8859-1 +de_AT.ISO-8859-1 de_AT.ISO8859-1 +de_AT.ISO_8859-1 de_AT.ISO8859-1 +de_AT.iso885915 de_AT.ISO8859-15 +de_AT.ISO-8859-15 de_AT.ISO8859-15 +de_AT.ISO-8859-15@euro de_AT.ISO8859-15 +de_AT.UTF-8@euro de_AT.UTF-8 +de_AT.utf8 de_AT.UTF-8 +de_BE de_BE.ISO8859-1 +de_BE@euro de_BE.ISO8859-15 +de_BE.iso88591 de_BE.ISO8859-1 +de_BE.ISO_8859-1 de_BE.ISO8859-1 +de_BE.ISO-8859-1 de_BE.ISO8859-1 +de_BE.iso885915 de_BE.ISO8859-15 +de_BE.ISO_8859-15 de_BE.ISO8859-15 +de_BE.ISO-8859-15 de_BE.ISO8859-15 +de_BE.ISO-8859-15@euro de_BE.ISO8859-15 +de_BE.UTF-8@euro de_BE.UTF-8 +de_CH de_CH.ISO8859-1 +de_CH.iso88591 de_CH.ISO8859-1 +de_CH.ISO_8859-1 de_CH.ISO8859-1 +de_CH.ISO-8859-1 de_CH.ISO8859-1 +de_CH.iso885915 de_CH.ISO8859-15 +de_CH.ISO_8859-15 de_CH.ISO8859-15 +de_CH.ISO-8859-15 de_CH.ISO8859-15 +de_CH.utf8 de_CH.UTF-8 +de_DE de_DE.ISO8859-1 +de_DE@euro de_DE.ISO8859-15 +de_DE.88591 de_DE.ISO8859-1 +de_DE.88591.en de_DE.ISO8859-1 +de_DE.iso88591 de_DE.ISO8859-1 +de_DE.ISO-8859-1 de_DE.ISO8859-1 +de_DE.ISO_8859-1 de_DE.ISO8859-1 +de_DE.iso885915 de_DE.ISO8859-15 +de_DE.ISO-8859-15 de_DE.ISO8859-15 +de_DE.ISO_8859-15 de_DE.ISO8859-15 +de_DE.8859-15 de_DE.ISO8859-15 +de_DE.8859-15@euro de_DE.ISO8859-15 +de_DE.ISO-8859-15@euro de_DE.ISO8859-15 +de_DE.UTF-8@euro de_DE.UTF-8 +de_DE.utf8 de_DE.UTF-8 +de_IT de_IT.UTF-8 +de_IT.utf8 de_IT.UTF-8 +de_LI de_LI.ISO8859-1 +de_LI.iso88591 de_LI.ISO8859-1 +de_LI.ISO_8859-1 de_LI.ISO8859-1 +de_LI.ISO-8859-1 de_LI.ISO8859-1 +de_LI.iso885915 de_LI.ISO8859-15 +de_LI.ISO_8859-15 de_LI.ISO8859-15 +de_LI.ISO-8859-15 de_LI.ISO8859-15 +de_LI.utf8 de_LI.UTF-8 +de_LU de_LU.ISO8859-1 +de_LU@euro de_LU.ISO8859-15 +de_LU.iso88591 de_LU.ISO8859-1 +de_LU.ISO_8859-1 de_LU.ISO8859-1 +de_LU.ISO-8859-1 de_LU.ISO8859-1 +de_LU.iso885915 de_LU.ISO8859-15 +de_LU.ISO_8859-15 de_LU.ISO8859-15 +de_LU.ISO-8859-15 de_LU.ISO8859-15 +de_LU.ISO-8859-15@euro de_LU.ISO8859-15 +de_LU.UTF-8@euro de_LU.UTF-8 +de_LU.utf8 de_LU.UTF-8 +GER_DE.8859 de_DE.ISO8859-1 +GER_DE.8859.in de_DE.ISO8859-1 +ee ee_EE.ISO8859-4 +ee_EE ee_EE.ISO8859-4 +ee_EE.iso88594 ee_EE.ISO8859-4 +el el_GR.ISO8859-7 +el_GR el_GR.ISO8859-7 +el_GR.iso88597 el_GR.ISO8859-7 +el_GR.ISO-8859-7 el_GR.ISO8859-7 +el_GR@euro el_GR.ISO8859-15 +el_GR.utf8 el_GR.UTF-8 +en en_US.ISO8859-1 +en.ISO-8859-1 en_US.ISO8859-1 +en_AU en_AU.ISO8859-1 +en_AU.iso88591 en_AU.ISO8859-1 +en_AU.ISO-8859-1 en_AU.ISO8859-1 +en_AU.ISO_8859-1 en_AU.ISO8859-1 +en_AU.utf8 en_AU.UTF-8 +en_BE en_BE.ISO8859-1 +en_BE@euro en_BE.ISO8859-15 +en_BE.utf8 en_BE.UTF-8 +en_BW en_BW.ISO8859-1 +en_BW.utf8 en_BW.UTF-8 +en_BW.iso88591 en_BW.ISO8859-1 +en_BW.ISO-8859-1 en_BW.ISO8859-1 +en_CA en_CA.ISO8859-1 +en_CA.iso88591 en_CA.ISO8859-1 +en_CA.ISO-8859-1 en_CA.ISO8859-1 +en_CA.ISO_8859-1 en_CA.ISO8859-1 +en_CA.utf8 en_CA.UTF-8 +en_DL.utf8 en_DL.UTF-8 +en_GB en_GB.ISO8859-1 +en_GB.88591 en_GB.ISO8859-1 +en_GB.88591.en en_GB.ISO8859-1 +en_GB.iso88591 en_GB.ISO8859-1 +en_GB.ISO-8859-1 en_GB.ISO8859-1 +en_GB.ISO_8859-1 en_GB.ISO8859-1 +en_GB.iso885915 en_GB.ISO8859-15 +en_GB.ISO-8859-15 en_GB.ISO8859-15 +en_GB.utf8 en_GB.UTF-8 +en_UK en_GB.ISO8859-1 +ENG_GB.8859 en_GB.ISO8859-1 +ENG_GB.8859.in en_GB.ISO8859-1 +en_HK en_HK.ISO8859-1 +en_HK.iso88591 en_HK.ISO8859-1 +en_HK.ISO-8859-1 en_HK.ISO8859-1 +en_HK.utf8 en_HK.UTF-8 +en_IE en_IE.ISO8859-1 +en_IE.iso88591 en_IE.ISO8859-1 +en_IE.ISO-8859-1 en_IE.ISO8859-1 +en_IE.iso885915 en_IE.ISO8859-15 +en_IE.ISO-8859-15 en_IE.ISO8859-15 +en_IE.ISO-8859-15@euro en_IE.ISO8859-15 +en_IE@euro en_IE.ISO8859-15 +en_IE.UTF-8@euro en_IE.UTF-8 +en_IE.utf8 en_IE.UTF-8 +en_IN.utf8 en_IN.UTF-8 +en_IN en_IN.ISO8859-1 +en_NZ en_NZ.ISO8859-1 +en_NZ.iso88591 en_NZ.ISO8859-1 +en_NZ.ISO-8859-1 en_NZ.ISO8859-1 +en_NZ.utf8 en_NZ.UTF-8 +en_PH en_PH.ISO8859-1 +en_PH.utf8 en_PH.UTF-8 +en_PH.iso88591 en_PH.ISO8859-1 +en_PH.ISO-8859-1 en_PH.ISO8859-1 +en_SG en_SG.ISO8859-1 +en_SG.utf8 en_SG.UTF-8 +en_SG.iso88591 en_SG.ISO8859-1 +en_SG.ISO-8859-1 en_SG.ISO8859-1 +en_US en_US.ISO8859-1 +EN_US en_US.ISO8859-1 +en_US.88591 en_US.ISO8859-1 +en_US.88591.en en_US.ISO8859-1 +en_US.iso88591 en_US.ISO8859-1 +en_US.ISO-8859-1 en_US.ISO8859-1 +en_US.ISO_8859-1 en_US.ISO8859-1 +en_US.iso885915 en_US.ISO8859-15 +en_US.ISO-8859-15 en_US.ISO8859-15 +en_US.8859-15 en_US.ISO8859-15 +en_US.ISO8859-15@euro en_US.ISO8859-15 +en_US.utf8 en_US.UTF-8 +EN_US.UTF-8 en_US.UTF-8 +en_ZA en_ZA.ISO8859-1 +en_ZA.88591 en_ZA.ISO8859-1 +en_ZA.88591.en en_ZA.ISO8859-1 +en_ZA.iso88591 en_ZA.ISO8859-1 +en_ZA.ISO-8859-1 en_ZA.ISO8859-1 +en_ZA.ISO_8859-1 en_ZA.ISO8859-1 +en_ZA.iso885915 en_ZA.ISO8859-15 +en_ZA.ISO-8859-15 en_ZA.ISO8859-15 +en_ZA.utf8 en_ZA.UTF-8 +en_ZW en_ZW.ISO8859-1 +en_ZW.utf8 en_ZS.UTF-8 +en_ZW.iso88591 en_ZW.ISO8859-1 +en_ZW.ISO-8859-1 en_ZW.ISO8859-1 +eo eo_XX.ISO8859-3 +eo_EO eo_EO.ISO8859-3 +eo_XX eo_XX.ISO8859-3 +es es_ES.ISO8859-1 +es.UTF-8 es_ES.UTF-8 +es_AR es_AR.ISO8859-1 +es_AR.iso88591 es_AR.ISO8859-1 +es_AR.ISO-8859-1 es_AR.ISO8859-1 +es_AR.utf8 es_AR.UTF-8 +es_BO es_BO.ISO8859-1 +es_BO.iso88591 es_BO.ISO8859-1 +es_BO.ISO-8859-1 es_BO.ISO8859-1 +es_BO.utf8 es_BO.UTF-8 +es_CL es_CL.ISO8859-1 +es_CL.iso88591 es_CL.ISO8859-1 +es_CL.ISO-8859-1 es_CL.ISO8859-1 +es_CL.utf8 es_CL.UTF-8 +es_CO es_CO.ISO8859-1 +es_CO.iso88591 es_CO.ISO8859-1 +es_CO.ISO-8859-1 es_CO.ISO8859-1 +es_CO.utf8 es_CO.UTF-8 +es_CR es_CR.ISO8859-1 +es_CR.iso88591 es_CR.ISO8859-1 +es_CR.ISO-8859-1 es_CR.ISO8859-1 +es_CR.utf8 es_CR.UTF-8 +es_DO es_DO.ISO8859-1 +es_DO.iso88591 es_DO.ISO8859-1 +es_DO.ISO-8859-1 es_DO.ISO8859-1 +es_DO.utf8 es_DO.UTF-8 +es_EC es_EC.ISO8859-1 +es_EC.iso88591 es_EC.ISO8859-1 +es_EC.ISO-8859-1 es_EC.ISO8859-1 +es_EC.utf8 es_EC.UTF-8 +es_ES es_ES.ISO8859-1 +es_ES.88591 es_ES.ISO8859-1 +es_ES.88591.en es_ES.ISO8859-1 +es_ES.iso88591 es_ES.ISO8859-1 +es_ES.ISO-8859-1 es_ES.ISO8859-1 +es_ES.ISO_8859-1 es_ES.ISO8859-1 +es_ES.iso885915 es_ES.ISO8859-15 +es_ES.ISO-8859-15 es_ES.ISO8859-15 +es_ES.ISO-8859-15@euro es_ES.ISO8859-15 +es_ES@euro es_ES.ISO8859-15 +es_ES.UTF-8@euro es_ES.UTF-8 +es_ES.utf8 es_ES.UTF-8 +es_GT es_GT.ISO8859-1 +es_GT.iso88591 es_GT.ISO8859-1 +es_GT.ISO-8859-1 es_GT.ISO8859-1 +es_GT.utf8 es_GT.UTF-8 +es_HN es_HN.ISO8859-1 +es_HN.iso88591 es_HN.ISO8859-1 +es_HN.ISO-8859-1 es_HN.ISO8859-1 +es_HN.utf8 es_HN.UTF-8 +es_MX es_MX.ISO8859-1 +es_MX.iso88591 es_MX.ISO8859-1 +es_MX.ISO-8859-1 es_MX.ISO8859-1 +es_MX.utf8 es_MX.UTF-8 +es_NI es_NI.ISO8859-1 +es_NI.iso88591 es_NI.ISO8859-1 +es_NI.ISO-8859-1 es_NI.ISO8859-1 +es_NI.utf8 es_NI.UTF-8 +es_PA es_PA.ISO8859-1 +es_PA.iso88591 es_PA.ISO8859-1 +es_PA.ISO-8859-1 es_PA.ISO8859-1 +es_PA.iso885915 es_PA.ISO8859-15 +es_PA.utf8 es_PA.UTF-8 +es_PE es_PE.ISO8859-1 +es_PE.iso88591 es_PE.ISO8859-1 +es_PE.ISO-8859-1 es_PE.ISO8859-1 +es_PE.iso885915 es_PE.ISO8859-15 +es_PE.utf8 es_PE.UTF-8 +es_PR es_PR.ISO8859-1 +es_PR.iso88591 es_PR.ISO8859-1 +es_PR.ISO-8859-1 es_PR.ISO8859-1 +es_PR.utf8 es_PR.UTF-8 +es_PY es_PY.ISO8859-1 +es_PY.iso88591 es_PY.ISO8859-1 +es_PY.ISO-8859-1 es_PY.ISO8859-1 +es_PY.iso885915 es_PY.ISO8859-15 +es_PY.utf8 es_PY.UTF-8 +es_SV es_SV.ISO8859-1 +es_SV.iso88591 es_SV.ISO8859-1 +es_SV.ISO-8859-1 es_SV.ISO8859-1 +es_SV.iso885915 es_SV.ISO8859-15 +es_SV.utf8 es_SV.UTF-8 +es_US es_US.ISO8859-1 +es_US.iso88591 es_US.ISO8859-1 +es_US.ISO-8859-1 es_US.ISO8859-1 +es_UY es_UY.ISO8859-1 +es_UY.iso88591 es_UY.ISO8859-1 +es_UY.ISO-8859-1 es_UY.ISO8859-1 +es_UY.iso885915 es_UY.ISO8859-15 +es_UY.utf8 es_UY.UTF-8 +es_VE es_VE.ISO8859-1 +es_VE.iso88591 es_VE.ISO8859-1 +es_VE.ISO-8859-1 es_VE.ISO8859-1 +es_VE.iso885915 es_VE.ISO8859-15 +es_VE.utf8 es_VE.UTF-8 +# According to Estonian local standards, ISO8859-4 is not a recommended +# charset. EVS8:2000 specifies ISO8859-15 as the base charset. +et et_EE.ISO8859-15 +et_EE et_EE.ISO8859-15 +et_EE.iso88591 et_EE.ISO8859-1 +et_EE.ISO-8859-1 et_EE.ISO8859-1 +et_EE.iso88594 et_EE.ISO8859-4 +et_EE.ISO-8859-4 et_EE.ISO8859-4 +et_EE.iso885913 et_EE.ISO8859-13 +et_EE.ISO-8859-13 et_EE.ISO8859-13 +et_EE.iso885915 et_EE.ISO8859-15 +et_EE.ISO-8859-15 et_EE.ISO8859-15 +et_EE.utf8 et_EE.UTF-8 +eu eu_ES.ISO8859-1 +eu_ES eu_ES.ISO8859-1 +eu_ES.iso88591 eu_ES.ISO8859-1 +eu_ES.ISO-8859-1 eu_ES.ISO8859-1 +eu_ES.iso885915 eu_ES.ISO8859-15 +eu_ES.ISO-8859-15 eu_ES.ISO8859-15 +eu_ES.ISO-8859-15@euro eu_ES.ISO8859-15 +eu_ES@euro eu_ES.ISO8859-15 +eu_ES.UTF-8@euro eu_ES.UTF-8 +fa fa_IR.UTF-8 +fa_IR fa_IR.UTF-8 +fa_IR.isiri3342 fa_IR.ISIRI-3342 +fa_IR.utf8 fa_IR.UTF-8 +fi fi_FI.ISO8859-15 +fi.ISO8859-15 fi_FI.ISO8859-15 +fi_FI fi_FI.ISO8859-15 +fi_FI.88591 fi_FI.ISO8859-1 +fi_FI.88591.en fi_FI.ISO8859-1 +fi_FI.iso88591 fi_FI.ISO8859-1 +fi_FI.ISO-8859-1 fi_FI.ISO8859-1 +fi_FI.ISO_8859-1 fi_FI.ISO8859-1 +fi_FI.iso885915 fi_FI.ISO8859-15 +fi_FI.ISO-8859-15 fi_FI.ISO8859-15 +fi_FI.ISO-8859-15@euro fi_FI.ISO8859-15 +fi_FI@euro fi_FI.ISO8859-15 +fi_FI.utf8 fi_FI.UTF-8 +fi_FI.UTF-8@euro fi_FI.UTF-8 +fo fo_FO.ISO8859-1 +fo_FO fo_FO.ISO8859-1 +fo_FO.iso88591 fo_FO.ISO8859-1 +fo_FO.ISO-8859-1 fo_FO.ISO8859-1 +fo_FO.iso885915 fo_FO.ISO8859-15 +fo_FO.ISO-8859-15 fo_FO.ISO8859-15 +fo_FO.utf8 fo_FO.UTF-8 +fr fr_FR.ISO8859-1 +fr.ISO8859-15 fr_FR.ISO8859-15 +fr.UTF-8 fr_FR.UTF-8 +fr_BE fr_BE.ISO8859-1 +fr_BE.88591 fr_BE.ISO8859-1 +fr_BE.88591.en fr_BE.ISO8859-1 +fr_BE.ISO-8859-1 fr_BE.ISO8859-1 +fr_BE.ISO_8859-1 fr_BE.ISO8859-1 +fr_BE.iso885915 fr_BE.ISO8859-15 +fr_BE.ISO-8859-15 fr_BE.ISO8859-15 +fr_BE.ISO-8859-15@euro fr_BE.ISO8859-15 +fr_BE@euro fr_BE.ISO8859-15 +fr_BE.utf8 fr_BE.UTF-8 +fr_BE.UTF-8@euro fr_BE.UTF-8 +fr_CA fr_CA.ISO8859-1 +fr_CA.88591 fr_CA.ISO8859-1 +fr_CA.88591.en fr_CA.ISO8859-1 +fr_CA.iso88591 fr_CA.ISO8859-1 +fr_CA.ISO-8859-1 fr_CA.ISO8859-1 +fr_CA.ISO_8859-1 fr_CA.ISO8859-1 +fr_CA.iso885915 fr_CA.ISO8859-15 +fr_CA.ISO-8859-15 fr_CA.ISO8859-15 +fr_CA.utf8 fr_CA.UTF-8 +fr_CH fr_CH.ISO8859-1 +fr_CH.88591 fr_CH.ISO8859-1 +fr_CH.88591.en fr_CH.ISO8859-1 +fr_CH.ISO-8859-1 fr_CH.ISO8859-1 +fr_CH.ISO_8859-1 fr_CH.ISO8859-1 +fr_CH.iso885915 fr_CH.ISO8859-15 +fr_CH.ISO-8859-15 fr_CH.ISO8859-15 +fr_CH.utf8 fr_CH.UTF-8 +fr_FR fr_FR.ISO8859-1 +fr_FR.88591 fr_FR.ISO8859-1 +fr_FR.88591.en fr_FR.ISO8859-1 +fr_FR.iso88591 fr_FR.ISO8859-1 +fr_FR.ISO-8859-1 fr_FR.ISO8859-1 +fr_FR.ISO_8859-1 fr_FR.ISO8859-1 +fr_FR.iso885915 fr_FR.ISO8859-15 +fr_FR.ISO-8859-15 fr_FR.ISO8859-15 +fr_FR.ISO-8859-15@euro fr_FR.ISO8859-15 +fr_FR@euro fr_FR.ISO8859-15 +fr_FR.UTF-8@euro fr_FR.UTF-8 +fr_FR.utf8 fr_FR.UTF-8 +fr_LU fr_LU.ISO8859-1 +fr_LU.88591 fr_LU.ISO8859-1 +fr_LU.88591.en fr_LU.ISO8859-1 +fr_LU.iso88591 fr_LU.ISO8859-1 +fr_LU.ISO-8859-1 fr_LU.ISO8859-1 +fr_LU.ISO_8859-1 fr_LU.ISO8859-1 +fr_LU.iso885915 fr_LU.ISO8859-15 +fr_LU.ISO-8859-15 fr_LU.ISO8859-15 +fr_LU.ISO-8859-15@euro fr_LU.ISO8859-15 +fr_LU@euro fr_LU.ISO8859-15 +fr_LU.UTF-8@euro fr_LU.UTF-8 +fr_LU.utf8 fr_LU.UTF-8 +FRE_FR.8859 fr_FR.ISO8859-1 +FRE_FR.8859.in fr_FR.ISO8859-1 +ga ga_IE.ISO8859-1 +ga_IE ga_IE.ISO8859-1 +ga_IE.iso88591 ga_IE.ISO8859-1 +ga_IE.ISO-8859-1 ga_IE.ISO8859-1 +ga_IE.iso885914 ga_IE.ISO8859-14 +ga_IE.ISO-8859-14 ga_IE.ISO8859-14 +ga_IE.iso885915 ga_IE.ISO8859-15 +ga_IE.ISO-8859-15 ga_IE.ISO8859-15 +ga_IE.ISO-8859-15@euro ga_IE.ISO8859-15 +ga_IE@euro ga_IE.ISO8859-15 +ga_IE.UTF-8@euro ga_IE.UTF-8 +ga_IE.utf8 ga_IE.UTF-8 +gd gd_GB.ISO8859-1 +gd_GB gd_GB.ISO8859-1 +gd_GB.iso88591 gd_GB.ISO8859-1 +gd_GB.ISO-8859-1 gd_GB.ISO8859-1 +gd_GB.iso885914 gd_GB.ISO8859-14 +gd_GB.ISO-8859-14 gd_GB.ISO8859-14 +gd_GB.iso885915 gd_GB.ISO8859-15 +gd_GB.ISO-8859-15 gd_GB.ISO8859-15 +gl gl_ES.ISO8859-1 +gl_ES gl_ES.ISO8859-1 +gl_ES.iso88591 gl_ES.ISO8859-1 +gl_ES.ISO-8859-1 gl_ES.ISO8859-1 +gl_ES.iso885915 gl_ES.ISO8859-15 +gl_ES.ISO-8859-15 gl_ES.ISO8859-15 +gl_ES.ISO-8859-15@euro gl_ES.ISO8859-15 +gl_ES@euro gl_ES.ISO8859-15 +gl_ES.UTF-8@euro gl_ES.UTF-8 +gl_ES.utf8 gl_ES.UTF-8 +gu_IN gu_IN.UTF-8 +gu_IN.utf8 gu_IN.UTF-8 +gv gv_GB.ISO8859-1 +gv_GB gv_GB.ISO8859-1 +gv_GB.iso88591 gv_GB.ISO8859-1 +gv_GB.ISO-8859-1 gv_GB.ISO8859-1 +gv_GB.iso885914 gv_GB.ISO8859-14 +gv_GB.ISO-8859-14 gv_GB.ISO8859-14 +gv_GB.iso885915 gv_GB.ISO8859-15 +gv_GB.ISO-8859-15 gv_GB.ISO8859-15 +he he_IL.ISO8859-8 +he_IL he_IL.ISO8859-8 +HE_IL he_IL.ISO8859-8 +he_IL.iso88598 he_IL.ISO8859-8 +he_IL.ISO-8859-8 he_IL.ISO8859-8 +he_IL.cp1255 he_IL.CP1255 +he_IL.microsoftcp1255 he_IL.CP1255 +he_IL.microsoft-cp1255 he_IL.CP1255 +he_IL.MICROSOFT-CP1255 he_IL.CP1255 +he_IL.utf8 he_IL.UTF-8 +HE_IL.UTF-8 he_IL.UTF-8 +hi hi_IN.ISCII-DEV +hi_IN hi_IN.ISCII-DEV +HI_IN hi_IN.ISCII-DEV +hi_IN.isciidev hi_IN.ISCII-DEV +hi_IN.utf8 hi_IN.UTF-8 +HI_IN.UTF-8 hi_IN.UTF-8 +hne hne_IN.UTF-8 +hne_IN hne_IN.UTF-8 +hne_IN.utf8 hne_IN.UTF-8 +hr hr_HR.ISO8859-2 +hr_HR hr_HR.ISO8859-2 +hr_HR.iso88592 hr_HR.ISO8859-2 +hr_HR.ISO-8859-2 hr_HR.ISO8859-2 +hr_HR.ISO_8859-2 hr_HR.ISO8859-2 +hr_HR.utf8 hr_HR.UTF-8 +hu hu_HU.ISO8859-2 +hu_HU hu_HU.ISO8859-2 +hu_HU.iso88592 hu_HU.ISO8859-2 +hu_HU.ISO-8859-2 hu_HU.ISO8859-2 +hu_HU.utf8 hu_HU.UTF-8 +ia ia.UTF-8 +ia.utf8 ia.UTF-8 +ie ie.UTF-8 +ie.utf8 ie.UTF-8 +is is_IS.ISO8859-1 +is_IS is_IS.ISO8859-1 +is_IS.iso88591 is_IS.ISO8859-1 +is_IS.ISO-8859-1 is_IS.ISO8859-1 +is_IS.ISO_8859-1 is_IS.ISO8859-1 +is_IS.iso885915 is_IS.ISO8859-15 +is_IS.ISO-8859-15 is_IS.ISO8859-15 +is_IS.utf8 is_IS.UTF-8 +it it_IT.ISO8859-1 +it.ISO8859-15 it_IT.ISO8859-15 +it.UTF-8 it_IT.UTF-8 +it_CH it_CH.ISO8859-1 +it_CH.iso88591 it_CH.ISO8859-1 +it_CH.ISO_8859-1 it_CH.ISO8859-1 +it_CH.ISO-8859-1 it_CH.ISO8859-1 +it_CH.iso885915 it_CH.ISO8859-15 +it_CH.utf8 it_CH.UTF-8 +it_IT it_IT.ISO8859-1 +it_IT.88591 it_IT.ISO8859-1 +it_IT.88591.en it_IT.ISO8859-1 +it_IT.iso88591 it_IT.ISO8859-1 +it_IT.ISO-8859-1 it_IT.ISO8859-1 +it_IT.ISO_8859-1 it_IT.ISO8859-1 +it_IT.iso885915 it_IT.ISO8859-15 +it_IT.ISO-8859-15 it_IT.ISO8859-15 +it_IT.ISO-8859-15@euro it_IT.ISO8859-15 +it_IT@euro it_IT.ISO8859-15 +it_IT.utf8 it_IT.UTF-8 +it_IT.UTF-8@euro it_IT.UTF-8 +# NUNACOM is an encoding for the Inuktitut syllabics +# we have little else on this encoding. +iu iu_CA.NUNACOM-8 +iu_CA iu_CA.NUNACOM-8 +iu_CA.nunacom8 iu_CA.NUNACOM-8 +ja_JP ja_JP.eucJP +ja ja_JP.eucJP +ja.JIS ja_JP.JIS7 +ja.SJIS ja_JP.SJIS +ja_JP.ujis ja_JP.eucJP +Jp_JP ja_JP.eucJP +ja_JP.AJEC ja_JP.eucJP +ja_JP.EUC ja_JP.eucJP +ja_JP.EUC-JP ja_JP.eucJP +ja_JP.EUC_JP ja_JP.eucJP +ja_JP.eucjp ja_JP.eucJP +ja_JP.ISO-2022-JP ja_JP.JIS7 +ja_JP.JIS ja_JP.JIS7 +ja_JP.jis7 ja_JP.JIS7 +ja_JP.mscode ja_JP.SJIS +ja_JP.PCK ja_JP.SJIS +ja_JP.sjis ja_JP.SJIS +ja_JP.utf8 ja_JP.UTF-8 +JA_JP.utf8 ja_JP.UTF-8 +ka ka_GE.GEORGIAN-ACADEMY +ka_GE ka_GE.GEORGIAN-ACADEMY +ka_GE.georgianacademy ka_GE.GEORGIAN-ACADEMY +ka_GE.georgianrs ka_GE.GEORGIAN-ACADEMY +ka_GE.georgianps ka_GE.GEORGIAN-PS +kl kl_GL.ISO8859-1 +kl_GL kl_GL.ISO8859-1 +kl_GL.iso88591 kl_GL.ISO8859-1 +kl_GL.ISO-8859-1 kl_GL.ISO8859-1 +kl_GL.iso885915 kl_GL.ISO8859-15 +kl_GL.utf8 kl_GL.UTF-8 +km_KH km_KH.UTF-8 +km_KH.utf8 km_KH.UTF-8 +kn kn_IN.UTF-8 +kn_IN kn_IN.UTF-8 +kn_IN.utf8 kn_IN.UTF-8 +ko ko_KR.eucKR +ko.UTF-8 ko_KR.UTF-8 +ko_KR ko_KR.eucKR +KO_KR ko_KR.eucKR +ko_KR.EUC ko_KR.eucKR +ko_KR.EUC-KR ko_KR.eucKR +ko_KR.euc ko_KR.eucKR +ko_KR.euckr ko_KR.eucKR +ko_KR.utf8 ko_KR.UTF-8 +KO_KR.UTF-8 ko_KR.UTF-8 +ks ks_IN.UTF-8 +ks_IN ks_IN.UTF-8 +ks_IN.utf8 ks_IN.UTF-8 +ks_IN@devanagari ks_IN.UTF-8@devanagari +ks_IN.utf8@devanagari ks_IN.UTF-8@devanagari +kw kw_GB.ISO8859-1 +kw_GB kw_GB.ISO8859-1 +kw_GB.iso88591 kw_GB.ISO8859-1 +kw_GB.ISO-8859-1 kw_GB.ISO8859-1 +kw_GB.iso885914 kw_GB.ISO8859-14 +kw_GB.ISO-8859-14 kw_GB.ISO8859-14 +kw_GB.iso885915 kw_GB.ISO8859-15 +kw_GB.ISO-8859-15 kw_GB.ISO8859-15 +ky ky_KG.UTF-8 +ky_KG ky_KG.UTF-8 +ky_KG.utf8 ky_KG.UTF-8 +lo lo_LA.MULELAO-1 +lo_LA lo_LA.MULELAO-1 +lo_LA.cp1133 lo_LA.IBM-CP1133 +lo_LA.ibmcp1133 lo_LA.IBM-CP1133 +lo_LA.mulelao1 lo_LA.MULELAO-1 +lt lt_LT.ISO8859-13 +lt_LT lt_LT.ISO8859-13 +lt_LT.iso88594 lt_LT.ISO8859-4 +lt_LT.ISO-8859-4 lt_LT.ISO8859-4 +lt_LT.ISO_8859-4 lt_LT.ISO8859-4 +lt_LT.iso885913 lt_LT.ISO8859-13 +lt_LT.ISO-8859-13 lt_LT.ISO8859-13 +lt_LT.ISO_8859-13 lt_LT.ISO8859-13 +lt_LT.utf8 lt_LT.UTF-8 +lv lv_LV.ISO8859-13 +lv_LV lv_LV.ISO8859-13 +lv_LV.iso88594 lv_LV.ISO8859-4 +lv_LV.ISO-8859-4 lv_LV.ISO8859-4 +lv_LV.iso885913 lv_LV.ISO8859-13 +lv_LV.ISO-8859-13 lv_LV.ISO8859-13 +lv_LV.ISO_8859-13 lv_LV.ISO8859-13 +lv_LV.utf8 lv_LV.UTF-8 +mai mai_IN.UTF-8 +mai_IN mai_IN.UTF-8 +mai_IN.utf8 mai_IN.UTF-8 +mi mi_NZ.ISO8859-1 +mi_NZ mi_NZ.ISO8859-1 +mi_NZ.iso88591 mi_NZ.ISO8859-1 +mk mk_MK.ISO8859-5 +mk_MK mk_MK.ISO8859-5 +mk_MK.iso88595 mk_MK.ISO8859-5 +mk_MK.ISO-8859-5 mk_MK.ISO8859-5 +mk_MK.cp1251 mk_MK.CP1251 +mk_MK.microsoftcp1251 mk_MK.CP1251 +mk_MK.microsoft-cp1251 mk_MK.CP1251 +mk_MK.MICROSOFT-CP1251 mk_MK.CP1251 +mk_MK.utf8 mk_MK.UTF-8 +ml ml_IN.UTF-8 +ml_IN ml_IN.UTF-8 +ml_IN.utf8 ml_IN.UTF-8 +mr mr_IN.UTF-8 +mr_IN mr_IN.UTF-8 +mr_IN.utf8 mr_IN.UTF-8 +ms ms_MY.ISO8859-1 +ms_MY ms_MY.ISO8859-1 +ms_MY.iso88591 ms_MY.ISO8859-1 +ms_MY.ISO-8859-1 ms_MY.ISO8859-1 +mt mt_MT.ISO8859-3 +mt_MT mt_MT.ISO8859-3 +mt_MT.ISO-8859-3 mt_MT.ISO8859-3 +nb nb_NO.ISO8859-1 +nb_NO nb_NO.ISO8859-1 +nb_NO.88591 nb_NO.ISO8859-1 +nb_NO.iso88591 nb_NO.ISO8859-1 +nb_NO.ISO-8859-1 nb_NO.ISO8859-1 +nb_NO.iso885915 nb_NO.ISO8859-15 +nb_NO.ISO-8859-15 nb_NO.ISO8859-15 +nb_NO.utf8 nb_NO.UTF-8 +ne_NP ne_NP.UTF-8 +ne_NP.utf8 ne_NP.UTF-8 +nl nl_NL.ISO8859-1 +nl.ISO8859-15 nl_NL.ISO8859-15 +nl_BE nl_BE.ISO8859-1 +nl_BE.88591 nl_BE.ISO8859-1 +nl_BE.88591.en nl_BE.ISO8859-1 +nl_BE.iso88591 nl_BE.ISO8859-1 +nl_BE.ISO-8859-1 nl_BE.ISO8859-1 +nl_BE.ISO_8859-1 nl_BE.ISO8859-1 +nl_BE.iso885915 nl_BE.ISO8859-15 +nl_BE.ISO-8859-15 nl_BE.ISO8859-15 +nl_BE.ISO-8859-15@euro nl_BE.ISO8859-15 +nl_BE@euro nl_BE.ISO8859-15 +nl_BE.utf8 nl_BE.UTF-8 +nl_BE.UTF-8@euro nl_BE.UTF-8 +nl_NL nl_NL.ISO8859-1 +nl_NL.88591 nl_NL.ISO8859-1 +nl_NL.88591.en nl_NL.ISO8859-1 +nl_NL.iso88591 nl_NL.ISO8859-1 +nl_NL.ISO-8859-1 nl_NL.ISO8859-1 +nl_NL.ISO_8859-1 nl_NL.ISO8859-1 +nl_NL.iso885915 nl_NL.ISO8859-15 +nl_NL.ISO-8859-15 nl_NL.ISO8859-15 +nl_NL.ISO-8859-15@euro nl_NL.ISO8859-15 +nl_NL@euro nl_NL.ISO8859-15 +nl_NL.utf8 nl_NL.UTF-8 +nl_NL.UTF-8@euro nl_NL.UTF-8 +nn nn_NO.ISO8859-1 +nn_NO nn_NO.ISO8859-1 +nn_NO.88591 nn_NO.ISO8859-1 +nn_NO.ISO-8859-1 nn_NO.ISO8859-1 +nn_NO.ISO_8859-1 nn_NO.ISO8859-1 +nn_NO.iso885915 nn_NO.ISO8859-15 +nn_NO.ISO-8859-15 nn_NO.ISO8859-15 +nn_NO.utf8 nn_NO.UTF-8 +no no_NO.ISO8859-1 +no_NO no_NO.ISO8859-1 +no_NO.88591 no_NO.ISO8859-1 +no_NO.88591.en no_NO.ISO8859-1 +no_NO.iso88591 no_NO.ISO8859-1 +no_NO.ISO-8859-1 no_NO.ISO8859-1 +no_NO.ISO8859-1@bokmal no_NO.ISO8859-1 +no_NO.ISO8859-1@nynorsk no_NO.ISO8859-1 +no_NO.iso885915 no_NO.ISO8859-15 +no_NO.ISO-8859-15 no_NO.ISO8859-15 +no_NO.utf8 no_NO.UTF-8 +nr nr_ZA.ISO8859-1 +nr_ZA nr_ZA.ISO8859-1 +nr_ZA.iso88591 nr_ZA.ISO8859-1 +nr_ZA.utf8 nr_ZA.UTF-8 +nso nso_ZA.ISO8859-15 +nso_ZA nso_ZA.ISO8859-15 +nso_ZA.iso885915 nso_ZA.ISO8859-15 +nso_ZA.utf8 nso_ZA.UTF-8 +ny ny_NO.ISO8859-1 +ny_NO ny_NO.ISO8859-1 +ny_NO.88591 ny_NO.ISO8859-1 +ny_NO.ISO_8859-1 ny_NO.ISO8859-1 +ny_NO.iso885915 ny_NO.ISO8859-15 +no@nynorsk ny_NO.ISO8859-1 +nynorsk nn_NO.ISO8859-1 +oc oc_FR.ISO8859-1 +oc_FR oc_FR.ISO8859-1 +oc_FR.iso88591 oc_FR.ISO8859-1 +oc_FR.ISO-8859-1 oc_FR.ISO8859-1 +oc_FR.iso885915 oc_FR.ISO8859-15 +oc_FR.ISO-8859-15 oc_FR.ISO8859-15 +oc_FR@euro oc_FR.ISO8859-15 +or or_IN.UTF-8 +or_IN or_IN.UTF-8 +or_IN.utf8 or_IN.UTF-8 +pa pa_IN.UTF-8 +pa_IN pa_IN.UTF-8 +pa_IN.utf8 pa_IN.UTF-8 +pa_PK.utf8 pa_PK.UTF-8 +pd pd_US.ISO8859-1 +pd_DE pd_DE.ISO8859-1 +pd_US pd_US.ISO8859-1 +pd_DE.iso88591 pd_DE.ISO8859-1 +pd_US.iso88591 pd_US.ISO8859-1 +pd_DE.iso885915 pd_DE.ISO8859-15 +pd_US.iso885915 pd_US.ISO8859-15 +ph ph_PH.ISO8859-1 +ph_PH ph_PH.ISO8859-1 +ph_PH.iso88591 ph_PH.ISO8859-1 +pl pl_PL.ISO8859-2 +pl.UTF-8 pl_PL.UTF-8 +pl_PL pl_PL.ISO8859-2 +pl_PL.iso88592 pl_PL.ISO8859-2 +pl_PL.ISO-8859-2 pl_PL.ISO8859-2 +pl_PL.utf8 pl_PL.UTF-8 +pp pp_AN.ISO8859-1 +pp_AN pp_AN.ISO8859-1 +pp_AN.iso88591 pp_AN.ISO8859-1 +pt pt_PT.ISO8859-1 +pt.ISO8859-15 pt_PT.ISO8859-15 +pt_BR pt_BR.ISO8859-1 +pt_BR.88591 pt_BR.ISO8859-1 +pt_BR.88591.en pt_BR.ISO8859-1 +pt_BR.iso88591 pt_BR.ISO8859-1 +pt_BR.ISO-8859-1 pt_BR.ISO8859-1 +pt_BR.ISO_8859-1 pt_BR.ISO8859-1 +pt_BR.iso885915 pt_BR.ISO8859-15 +pt_BR.utf8 pt_BR.UTF-8 +pt_PT pt_PT.ISO8859-1 +pt_PT.88591 pt_PT.ISO8859-1 +pt_PT.88591.en pt_PT.ISO8859-1 +pt_PT.iso88591 pt_PT.ISO8859-1 +pt_PT.ISO-8859-1 pt_PT.ISO8859-1 +pt_PT.ISO_8859-1 pt_PT.ISO8859-1 +pt_PT.iso885915 pt_PT.ISO8859-15 +pt_PT.ISO-8859-15 pt_PT.ISO8859-15 +pt_PT.ISO-8859-15@euro pt_PT.ISO8859-15 +pt_PT@euro pt_PT.ISO8859-15 +pt_PT.utf8 pt_PT.UTF-8 +pt_PT.UTF-8@euro pt_PT.UTF-8 +ro ro_RO.ISO8859-2 +ro_RO ro_RO.ISO8859-2 +ro_RO.iso88592 ro_RO.ISO8859-2 +ro_RO.ISO-8859-2 ro_RO.ISO8859-2 +ro_RO.utf8 ro_RO.UTF-8 +ru ru_RU.UTF-8 +ru.koi8-r ru_RU.KOI8-R +ru.UTF-8 ru_RU.UTF-8 +ru_RU ru_RU.UTF-8 +ru_RU.utf8 ru_RU.UTF-8 +ru_RU.iso88595 ru_RU.ISO8859-5 +ru_RU.ISO-8859-5 ru_RU.ISO8859-5 +ru_RU.koi8r ru_RU.KOI8-R +ru_RU.cp1251 ru_RU.CP1251 +ru_RU.microsoftcp1251 ru_RU.CP1251 +ru_RU.microsoft-cp1251 ru_RU.CP1251 +ru_RU.MICROSOFT-CP1251 ru_RU.CP1251 +ru_UA ru_UA.KOI8-U +ru_UA.koi8u ru_UA.KOI8-U +ru_UA.cp1251 ru_UA.CP1251 +ru_UA.microsoftcp1251 ru_UA.CP1251 +ru_UA.microsoft-cp1251 ru_UA.CP1251 +ru_UA.MICROSOFT-CP1251 ru_UA.CP1251 +rw rw_RW.ISO8859-1 +rw_RW rw_RW.ISO8859-1 +rw_RW.iso8859-1 rw_RW.ISO8859-1 +rw_RW.ISO-8859-1 rw_RW.ISO8859-1 +rw_RW.utf8 rw_RW.UTF-8 +sd sd_IN.UTF-8 +sd_IN.utf8 sd_IN.UTF-8 +sd@devanagari sd_IN.UTF-8@devanagari +sd_IN@devanagari sd_IN.UTF-8@devanagari +sd_IN.utf8@devanagari sd_IN.UTF-8@devanagari +se_NO se_NO.UTF-8 +se_NO.utf8 se_NO.UTF-8 +si si_LK.UTF-8 +si_LK si_LK.UTF-8 +sk sk_SK.ISO8859-2 +sk_SK sk_SK.ISO8859-2 +sk_SK.iso88592 sk_SK.ISO8859-2 +sk_SK.ISO-8859-2 sk_SK.ISO8859-2 +sk_SK.utf8 sk_SK.UTF-8 +sl sl_SI.ISO8859-2 +sl_SI sl_SI.ISO8859-2 +sl_SI.iso88592 sl_SI.ISO8859-2 +sl_SI.ISO-8859-2 sl_SI.ISO8859-2 +sl_SI.utf8 sl_SI.UTF-8 +sq sq_AL.ISO8859-2 +sq_AL sq_AL.ISO8859-2 +sq_AL.iso88592 sq_AL.ISO8859-2 +sq_AL.ISO-8859-2 sq_AL.ISO8859-2 +sq_AL.utf8 sq_AL.UTF-8 +sr sr_RS.UTF-8 +sr@cyrillic sr_RS.UTF-8 +sr@latin sr_RS.UTF-8@latin +sr@Latn sr_RS.UTF-8@latin +sr_RS sr_RS.UTF-8 +sr_RS@latin sr_RS.UTF-8@latin +sr_RS@Latn sr_RS.UTF-8@latin +sr_RS.UTF-8@Latn sr_RS.UTF-8@latin +sr_RS.utf8 sr_RS.UTF-8 +sr_ME sr_ME.UTF-8 +sr_ME.utf8 sr_ME.UTF-8 +ss ss_ZA.ISO8859-1 +ss_ZA ss_ZA.ISO8859-1 +ss_ZA.iso88591 ss_ZA.ISO8859-1 +ss_ZA.utf8 ss_ZA.UTF-8 +st st_ZA.ISO8859-1 +st_ZA st_ZA.ISO8859-1 +st_ZA.iso88591 st_ZA.ISO8859-1 +st_ZA.utf8 st_ZA.UTF-8 +sv sv_SE.ISO8859-1 +sv.ISO8859-15 sv_SE.ISO8859-15 +sv.UTF-8 sv_SE.UTF-8 +sv_FI sv_FI.ISO8859-1 +sv_FI.iso88591 sv_FI.ISO8859-1 +sv_FI.ISO-8859-1 sv_FI.ISO8859-1 +sv_FI.iso885915 sv_FI.ISO8859-15 +sv_FI.ISO-8859-15 sv_FI.ISO8859-15 +sv_FI.ISO-8859-15@euro sv_FI.ISO8859-15 +sv_FI@euro sv_FI.ISO8859-15 +sv_FI.UTF-8@euro sv_FI.UTF-8 +sv_FI.utf8 sv_FI.UTF-8 +sv_SE sv_SE.ISO8859-1 +sv_SE.88591 sv_SE.ISO8859-1 +sv_SE.88591.en sv_SE.ISO8859-1 +sv_SE.iso88591 sv_SE.ISO8859-1 +sv_SE.ISO-8859-1 sv_SE.ISO8859-1 +sv_SE.ISO_8859-1 sv_SE.ISO8859-1 +sv_SE.iso885915 sv_SE.ISO8859-15 +sv_SE.ISO-8859-15 sv_SE.ISO8859-15 +sv_SE@euro sv_SE.ISO8859-15 +sv_SE.utf8 sv_SE.UTF-8 +ta ta_IN.TSCII-0 +ta_IN ta_IN.TSCII-0 +ta_IN.tscii ta_IN.TSCII-0 +ta_IN.tscii0 ta_IN.TSCII-0 +te te_IN.UTF-8 +te.UTF-8 te_IN.UTF-8 +te_IN.utf8 te_IN.UTF-8 +tg tg_TJ.KOI8-C +tg_TJ tg_TJ.KOI8-C +tg_TJ.koi8c tg_TJ.KOI8-C +th th_TH.ISO8859-11 +th_TH th_TH.ISO8859-11 +th_TH.ISO-8859-11 th_TH.ISO8859-11 +th_TH.tis620 th_TH.TIS620 +th_TH.TIS-620 th_TH.TIS620 +th_TH.TACTIS th_TH.TIS620 +th_TH.utf8 th_TH.UTF-8 +tl tl_PH.ISO8859-1 +tl_PH tl_PH.ISO8859-1 +tl_PH.iso88591 tl_PH.ISO8859-1 +tl_PH.ISO-8859-1 tl_PH.ISO8859-1 +tn tn_ZA.ISO8859-15 +tn_ZA tn_ZA.ISO8859-15 +tn_ZA.iso8859-15 tn_ZA.ISO8859-15 +tn_ZA.utf8 tn_ZA.UTF-8 +tr tr_TR.ISO8859-9 +tr_TR tr_TR.ISO8859-9 +TR_TR tr_TR.ISO8859-9 +tr_TR.iso88599 tr_TR.ISO8859-9 +tr_TR.ISO-8859-9 tr_TR.ISO8859-9 +tr_TR.utf8 tr_TR.UTF-8 +TR_TR.utf8 tr_TR.UTF-8 +ts ts_ZA.ISO8859-1 +ts_ZA ts_ZA.ISO8859-1 +ts_ZA.iso88591 ts_ZA.ISO8859-1 +ts_ZA.utf8 ts_ZA.UTF-8 +tt tt_RU.TATAR-CYR +tt_RU tt_RU.TATAR-CYR +tt_RU.tatarcyr tt_RU.TATAR-CYR +tt_RU.koi8c tt_RU.KOI8-C +uk uk_UA.KOI8-U +uk_UA uk_UA.KOI8-U +uk_UA.iso88595 uk_UA.ISO8859-5 +uk_UA.koi8u uk_UA.KOI8-U +uk_UA.cp1251 uk_UA.CP1251 +uk_UA.microsoftcp1251 uk_UA.CP1251 +uk_UA.microsoft-cp1251 uk_UA.CP1251 +uk_UA.MICROSOFT-CP1251 uk_UA.CP1251 +uk_UA.utf8 uk_UA.UTF-8 +ur ur_IN.UTF-8 +ur_IN ur_IN.UTF-8 +ur_IN.utf8 ur_IN.UTF-8 +ur ur_PK.CP1256 +ur_PK ur_PK.CP1256 +ur_PK.cp1256 ur_PK.CP1256 +ur_PK.microsoftcp1256 ur_PK.CP1256 +ur_PK.microsoft-cp1256 ur_PK.CP1256 +ur_PK.MICROSOFT-CP1256 ur_PK.CP1256 +uz uz_UZ.UTF-8 +uz_UZ uz_UZ.UTF-8 +uz_UZ.ISO-8859-1 uz_UZ.ISO8859-1 +uz_UZ@cyrillic uz_UZ.UTF-8 +uz_UZ.UTF-8@cyrillic uz_UZ.UTF-8 +ve ve_ZA.UTF-8 +ve_ZA ve_ZA.UTF-8 +ve_ZA.utf8 ve_ZA.UTF-8 +vi vi_VN.TCVN +vi_VN vi_VN.TCVN +Vi_VN vi_VN.TCVN +VI_VN vi_VN.TCVN +vi_VN.tcvn vi_VN.TCVN +vi_VN.tcvn5712 vi_VN.TCVN +vi_VN.viscii vi_VN.VISCII +vi_VN.viscii111 vi_VN.VISCII +vi_VN.utf8 vi_VN.UTF-8 +VI_VN.UTF-8 vi_VN.UTF-8 +wa wa_BE.ISO8859-1 +wa_BE wa_BE.ISO8859-1 +wa_BE.iso88591 wa_BE.ISO8859-1 +wa_BE.ISO-8859-1 wa_BE.ISO8859-1 +wa_BE.iso885915 wa_BE.ISO8859-15 +wa_BE.ISO-8859-15 wa_BE.ISO8859-15 +wa_BE.ISO-8859-15@euro wa_BE.ISO8859-15 +wa_BE@euro wa_BE.ISO8859-15 +xh xh_ZA.ISO8859-1 +xh_ZA xh_ZA.ISO8859-1 +xh_ZA.iso88591 xh_ZA.ISO8859-1 +xh_ZA.utf8 xh_ZA.UTF-8 +yi yi_US.CP1255 +yi_US yi_US.CP1255 +yi_US.cp1255 yi_US.CP1255 +yi_US.microsoftcp1255 yi_US.CP1255 +yi_US.microsoft-cp1255 yi_US.CP1255 +yi_US.MICROSOFT-CP1255 yi_US.CP1255 +zh_CN zh_CN.gb2312 +zh_CN.Big5 zh_TW.big5 +zh_CN.EUC zh_CN.eucCN +zh_CN.GB2312 zh_CN.gb2312 +zh_CN.GBK zh_CN.gbk +zh_CN.GB18030 zh_CN.gb18030 +zh_CN.big5 zh_TW.big5 +zh_CN.euc zh_CN.eucCN +zh_CN.utf8 zh_CN.UTF-8 +ZH_CN.UTF-8 zh_CN.UTF-8 +zh_HK zh_HK.big5hkscs +zh_HK.BIG5HK zh_HK.big5hkscs +zh_HK.Big5hkscs zh_HK.big5hkscs +zh_HK.Big5-hkscs zh_HK.big5hkscs +zh_HK.Big5_hkscs zh_HK.big5hkscs +zh_HK.Big5HKSCS zh_HK.big5hkscs +zh_HK.BIG5-HKSCS zh_HK.big5hkscs +zh_HK.BIG5_HKSCS zh_HK.big5hkscs +zh_HK.Big5-HKSCS zh_HK.big5hkscs +zh_HK.big5-hkscs zh_HK.big5hkscs +zh_HK.Big5-HKSCS zh_HK.big5hkscs +zh_HK.Big5HKSCS zh_HK.big5hkscs +zh_HK.Big5 zh_HK.big5 +zh_HK.utf8 zh_HK.UTF-8 +ZH_HK.UTF-8 zh_HK.UTF-8 +ZH_SG.UTF-8 zh_SG.UTF-8 +zh_TW zh_TW.big5 +zh_TW.Big5 zh_TW.big5 +zh_TW.BIG5 zh_TW.big5 +Zh_TW.big5 zh_TW.big5 +zh_TW.EUC zh_TW.eucTW +zh_TW.EUC-TW zh_TW.eucTW +zh_TW.utf8 zh_TW.UTF-8 +ZH_TW.UTF-8 zh_TW.UTF-8 +zu zu_ZA.ISO8859-1 +zu_ZA zu_ZA.ISO8859-1 +zu_ZA.iso88591 zu_ZA.ISO8859-1 +zu_ZA.utf8 zu_ZA.UTF-8 +# The following locale names are used in SCO 3.0 +english_uk.8859 en_GB.ISO8859-1 +english_us.8859 en_US.ISO8859-1 +english_us.ascii en_US.ISO8859-1 +french_france.8859 fr_FR.ISO8859-1 +german_germany.8859 de_DE.ISO8859-1 +portuguese_brazil.8859 pt_BR.ISO8859-1 +spanish_spain.8859 es_ES.ISO8859-1 +# The following locale names are used in HPUX 9.x +american.iso88591 en_US.ISO8859-1 +arabic.iso88596 ar_AA.ISO8859-6 +bokmal nb_NO.ISO8859-1 +bokml nb_NO.ISO8859-1 +bulgarian bg_BG.CP1251 +c-french.iso88591 fr_CA.ISO8859-1 +catalan ca_ES.ISO8859-1 +chinese-s zh_CN.eucCN +chinese-t zh_TW.eucTW +croatian hr_HR.ISO8859-2 +czech cs_CZ.ISO8859-2 +danish da_DK.ISO8859-1 +dansk da_DK.ISO8859-1 +danish.iso88591 da_DK.ISO8859-1 +deutsch de_DE.ISO8859-1 +dutch nl_NL.ISO8859-1 +dutch.iso88591 nl_BE.ISO8859-1 +eesti et_EE.ISO8859-1 +english.iso88591 en_EN.ISO8859-1 +estonian et_EE.ISO8859-1 +finnish fi_FI.ISO8859-1 +finnish.iso88591 fi_FI.ISO8859-1 +franais fr_FR.ISO8859-1 +french fr_FR.ISO8859-1 +french.iso88591 fr_CH.ISO8859-1 +galego gl_ES.ISO8859-1 +galician gl_ES.ISO8859-1 +german de_DE.ISO8859-1 +german.iso88591 de_CH.ISO8859-1 +greek el_GR.ISO8859-7 +greek.iso88597 el_GR.ISO8859-7 +hebrew he_IL.ISO8859-8 +hebrew.iso88598 he_IL.ISO8859-8 +hrvatski hr_HR.ISO8859-2 +hungarian hu_HU.ISO8859-2 +icelandic.iso88591 is_IS.ISO8859-1 +icelandic is_IS.ISO8859-1 +italian it_IT.ISO8859-1 +italian.iso88591 it_IT.ISO8859-1 +japanese ja_JP.eucJP +japanese.euc ja_JP.eucJP +japanese.sjis ja_JP.SJIS +korean ko_KR.eucKR +korean.euc ko_KR.eucKR +lithuanian lt_LT.ISO8859-13 +norwegian no_NO.ISO8859-1 +norwegian.iso88591 no_NO.ISO8859-1 +polish pl_PL.ISO8859-2 +portuguese pt_PT.ISO8859-1 +portuguese.iso88591 pt_PT.ISO8859-1 +romanian ro_RO.ISO8859-2 +rumanian ro_RO.ISO8859-2 +russian ru_RU.ISO8859-5 +serbocroatian sr_RS.UTF-8@latin +sinhala si_LK.UTF-8 +slovak sk_SK.ISO8859-2 +slovene sl_SI.ISO8859-2 +slovenian sl_SI.ISO8859-2 +spanish es_ES.ISO8859-1 +spanish.iso88591 es_ES.ISO8859-1 +swedish sv_SE.ISO8859-1 +swedish.iso88591 sv_SE.ISO8859-1 +turkish tr_TR.ISO8859-9 +turkish.iso88599 tr_TR.ISO8859-9 +thai th_TH.ISO8859-11 +univ.utf8 en_US.UTF-8 +# Digital Unix utf +universal.utf8@ucs4 en_US.UTF-8 +# Solaris and SunOS have iso_8859_1 and iso_8859_15 LC_CTYPES +# to augment LANG=C +iso_8859_1 en_US.ISO8859-1 +iso_8859_15 en_US.ISO8859-15 +# Other miscellaneous locale names +ISO8859-1 en_US.ISO8859-1 +ISO-8859-1 en_US.ISO8859-1 +japan ja_JP.eucJP +Japanese-EUC ja_JP.eucJP +# +# This file contains alias names of locales. +# Each alias name is described within one line. +# The first word is the alias name (simplified locale name), +# the second word is the full locale name. +# +# +POSIX: C +POSIX-UTF2: C +C_C.C: C +C.en: C +C.ASCII: C +C.iso88591: en_US.ISO8859-1 +Cextend: en_US.ISO8859-1 +Cextend.en: en_US.ISO8859-1 +English_United-States.437: C +C.UTF-8: en_US.UTF-8 +# a3 is not an ISO 639 language code, but in Cyrillic, "Z" looks like "3". +a3: az_AZ.KOI8-C +a3_AZ: az_AZ.KOI8-C +a3_AZ.koi8c: az_AZ.KOI8-C +a3_AZ.KOI-C: az_AZ.KOI8-C +a3_AZ.UTF-8: az_AZ.UTF-8 +af: af_ZA.ISO8859-1 +af_ZA: af_ZA.ISO8859-1 +af_ZA.iso88591: af_ZA.ISO8859-1 +af_ZA.ISO-8859-1: af_ZA.ISO8859-1 +af_ZA.utf8: af_ZA.UTF-8 +am: am_ET.UTF-8 +am_ET: am_ET.UTF-8 +ar: ar_AA.ISO8859-6 +ar_AA: ar_AA.ISO8859-6 +AR_AA: ar_AA.ISO8859-6 +Ar_AA: ar_AA.ISO8859-6 +AR_AA.UTF-8: ar_AA.UTF-8 +ar_AA.iso88596: ar_AA.ISO8859-6 +ar_AA.ISO-8859-6: ar_AA.ISO8859-6 +ar_AE: ar_AE.ISO8859-6 +ar_AE.iso88596: ar_AE.ISO8859-6 +ar_AE.ISO-8859-6: ar_AE.ISO8859-6 +ar_AE.utf8: ar_AE.UTF-8 +ar_BH: ar_BH.ISO8859-6 +ar_BH.iso88596: ar_BH.ISO8859-6 +ar_BH.ISO-8859-6: ar_BH.ISO8859-6 +ar_BH.utf8: ar_BH.UTF-8 +ar_DZ: ar_DZ.ISO8859-6 +ar_DZ.iso88596: ar_DZ.ISO8859-6 +ar_DZ.ISO-8859-6: ar_DZ.ISO8859-6 +ar_DZ.utf8: ar_DZ.UTF-8 +ar_EG: ar_EG.ISO8859-6 +ar_EG.iso88596: ar_EG.ISO8859-6 +ar_EG.ISO-8859-6: ar_EG.ISO8859-6 +ar_EG.utf8: ar_EG.UTF-8 +ar_IN: ar_IN.UTF-8 +ar_IN.utf8: ar_IN.UTF-8 +ar_IQ: ar_IQ.ISO8859-6 +ar_IQ.iso88596: ar_IQ.ISO8859-6 +ar_IQ.ISO-8859-6: ar_IQ.ISO8859-6 +ar_IQ.utf8: ar_IQ.UTF-8 +ar_JO: ar_JO.ISO8859-6 +ar_JO.iso88596: ar_JO.ISO8859-6 +ar_JO.ISO-8859-6: ar_JO.ISO8859-6 +ar_JO.utf8: ar_JO.UTF-8 +ar_KW: ar_KW.ISO8859-6 +ar_KW.iso88596: ar_KW.ISO8859-6 +ar_KW.ISO-8859-6: ar_KW.ISO8859-6 +ar_KW.utf8: ar_KW.UTF-8 +ar_LB: ar_LB.ISO8859-6 +ar_LB.iso88596: ar_LB.ISO8859-6 +ar_LB.ISO-8859-6: ar_LB.ISO8859-6 +ar_LB.utf8: ar_LB.UTF-8 +ar_LY: ar_LY.ISO8859-6 +ar_LY.iso88596: ar_LY.ISO8859-6 +ar_LY.ISO-8859-6: ar_LY.ISO8859-6 +ar_LY.utf8: ar_LY.UTF-8 +ar_MA: ar_MA.ISO8859-6 +ar_MA.iso88596: ar_MA.ISO8859-6 +ar_MA.ISO-8859-6: ar_MA.ISO8859-6 +ar_MA.utf8: ar_MA.UTF-8 +ar_OM: ar_OM.ISO8859-6 +ar_OM.iso88596: ar_OM.ISO8859-6 +ar_OM.ISO-8859-6: ar_OM.ISO8859-6 +ar_OM.utf8: ar_OM.UTF-8 +ar_QA: ar_QA.ISO8859-6 +ar_QA.iso88596: ar_QA.ISO8859-6 +ar_QA.ISO-8859-6: ar_QA.ISO8859-6 +ar_QA.utf8: ar_QA.UTF-8 +ar_SA: ar_SA.ISO8859-6 +ar_SA.iso88596: ar_SA.ISO8859-6 +ar_SA.ISO-8859-6: ar_SA.ISO8859-6 +ar_SA.utf8: ar_SA.UTF-8 +ar_SD: ar_SD.ISO8859-6 +ar_SD.iso88596: ar_SD.ISO8859-6 +ar_SD.ISO-8859-6: ar_SD.ISO8859-6 +ar_SD.utf8: ar_SD.UTF-8 +ar_SY: ar_SY.ISO8859-6 +ar_SY.iso88596: ar_SY.ISO8859-6 +ar_SY.ISO-8859-6: ar_SY.ISO8859-6 +ar_SY.utf8: ar_SY.UTF-8 +ar_TN: ar_TN.ISO8859-6 +ar_TN.iso88596: ar_TN.ISO8859-6 +ar_TN.ISO-8859-6: ar_TN.ISO8859-6 +ar_TN.utf8: ar_TN.UTF-8 +as: as_IN.UTF-8 +as_IN: as_IN.UTF-8 +as_IN.utf8: as_IN.UTF-8 +ar_YE: ar_YE.ISO8859-6 +ar_YE.iso88596: ar_YE.ISO8859-6 +ar_YE.ISO-8859-6: ar_YE.ISO8859-6 +ar_YE.utf8: ar_YE.UTF-8 +az: az_AZ.ISO8859-9E +az_AZ: az_AZ.ISO8859-9E +az_AZ.iso88599e: az_AZ.ISO8859-9E +be: be_BY.CP1251 +be@latin: be_BY.UTF-8@latin +be_BY: be_BY.CP1251 +be_BY@latin: be_BY.UTF-8@latin +be_BY.cp1251: be_BY.CP1251 +be_BY.microsoftcp1251: be_BY.CP1251 +be_BY.microsoft-cp1251: be_BY.CP1251 +be_BY.MICROSOFT-CP1251: be_BY.CP1251 +be_BY.utf8: be_BY.UTF-8 +be_BY.utf8@latin: be_BY.UTF-8@latin +bg: bg_BG.CP1251 +bg_BG: bg_BG.CP1251 +bg_BG.cp1251: bg_BG.CP1251 +bg_BG.microsoftcp1251: bg_BG.CP1251 +bg_BG.microsoft-cp1251: bg_BG.CP1251 +bg_BG.MICROSOFT-CP1251: bg_BG.CP1251 +bg_BG.iso88595: bg_BG.ISO8859-5 +bg_BG.ISO-8859-5: bg_BG.ISO8859-5 +bg_BG.koi8r: bg_BG.KOI8-R +be_BG.utf8: bg_BG.UTF-8 +bn_IN: bn_IN.UTF-8 +bn_IN.utf8: bn_IN.UTF-8 +bo_IN: bo_IN.UTF-8 +bo_IN.utf8: bo_IN.UTF-8 +br: br_FR.ISO8859-1 +br_FR: br_FR.ISO8859-1 +br_FR.iso88591: br_FR.ISO8859-1 +br_FR.ISO-8859-1: br_FR.ISO8859-1 +br_FR.iso885914: br_FR.ISO8859-14 +br_FR.ISO-8859-14: br_FR.ISO8859-14 +br_FR.iso885915: br_FR.ISO8859-15 +br_FR.ISO-8859-15: br_FR.ISO8859-15 +br_FR.ISO-8859-15@euro: br_FR.ISO8859-15 +br_FR@euro: br_FR.ISO8859-15 +br_FR.UTF-8@euro: br_FR.UTF-8 +bs: bs_BA.ISO8859-2 +bs_BA: bs_BA.ISO8859-2 +bs_BA.iso88592: bs_BA.ISO8859-2 +bs_BA.ISO-8859-2: bs_BA.ISO8859-2 +bs_BA.ISO_8859-2: bs_BA.ISO8859-2 +ca: ca_ES.ISO8859-1 +ca_AD: ca_AD.ISO8859-1 +ca_AD@euro: ca_AD.ISO8859-15 +ca_AD.iso88591: ca_AD.ISO8859-1 +ca_AD.ISO-8859-1: ca_AD.ISO8859-1 +ca_AD.iso885915: ca_AD.ISO8859-15 +ca_AD.utf8: ca_AD.UTF-8 +ca_AD.ISO-8859-15: ca_AD.ISO8859-15 +ca_AD.ISO-8859-15@euro: ca_AD.ISO8859-15 +ca_AD.UTF-8@euro: ca_AD.UTF-8 +ca_ES: ca_ES.ISO8859-1 +ca_ES@euro: ca_ES.ISO8859-15 +ca_ES.iso88591: ca_ES.ISO8859-1 +ca_ES.ISO-8859-1: ca_ES.ISO8859-1 +ca_ES.iso885915: ca_ES.ISO8859-15 +ca_ES.utf8: ca_ES.UTF-8 +ca_ES.ISO-8859-15: ca_ES.ISO8859-15 +ca_ES.ISO-8859-15@euro: ca_ES.ISO8859-15 +ca_ES.UTF-8@euro: ca_ES.UTF-8 +ca_FR: ca_FR.ISO8859-1 +ca_FR@euro: ca_FR.ISO8859-15 +ca_FR.iso88591: ca_FR.ISO8859-1 +ca_FR.ISO-8859-1: ca_FR.ISO8859-1 +ca_FR.iso885915: ca_FR.ISO8859-15 +ca_FR.utf8: ca_FR.UTF-8 +ca_FR.ISO-8859-15: ca_FR.ISO8859-15 +ca_FR.ISO-8859-15@euro: ca_FR.ISO8859-15 +ca_FR.UTF-8@euro: ca_FR.UTF-8 +ca_IT: ca_IT.ISO8859-1 +ca_IT@euro: ca_IT.ISO8859-15 +ca_IT.iso88591: ca_IT.ISO8859-1 +ca_IT.ISO-8859-1: ca_IT.ISO8859-1 +ca_IT.iso885915: ca_IT.ISO8859-15 +ca_IT.utf8: ca_IT.UTF-8 +ca_IT.ISO-8859-15: ca_IT.ISO8859-15 +ca_IT.ISO-8859-15@euro: ca_IT.ISO8859-15 +ca_IT.UTF-8@euro: ca_IT.UTF-8 +cs: cs_CZ.ISO8859-2 +cs_CS: cs_CZ.ISO8859-2 +cs_CS.ISO8859-2: cs_CZ.ISO8859-2 +cs_CZ: cs_CZ.ISO8859-2 +cs_CZ.iso88592: cs_CZ.ISO8859-2 +cs_CS.iso8859-2: cs_CZ.ISO8859-2 +cs_CZ.ISO-8859-2: cs_CZ.ISO8859-2 +cs_CZ.ISO_8859-2: cs_CZ.ISO8859-2 +cs_CZ.utf8: cs_CZ.UTF-8 +cy: cy_GB.ISO8859-1 +cy_GB: cy_GB.ISO8859-1 +cy_GB.iso88591: cy_GB.ISO8859-1 +cy_GB.ISO-8859-1: cy_GB.ISO8859-1 +cy_GB.iso885914: cy_GB.ISO8859-14 +cy_GB.ISO-8859-14: cy_GB.ISO8859-14 +cy_GB.iso885915: cy_GB.ISO8859-15 +cy_GB.ISO-8859-15: cy_GB.ISO8859-15 +da: da_DK.ISO8859-1 +da.ISO8859-15: da_DK.ISO8859-15 +da_DK: da_DK.ISO8859-1 +DA_DK: da_DK.ISO8859-1 +da_DK.88591: da_DK.ISO8859-1 +da_DK.88591.en: da_DK.ISO8859-1 +da_DK.iso88591: da_DK.ISO8859-1 +da_DK.ISO-8859-1: da_DK.ISO8859-1 +da_DK.ISO_8859-1: da_DK.ISO8859-1 +da_DK.iso885915: da_DK.ISO8859-15 +da_DK.ISO-8859-15: da_DK.ISO8859-15 +da_DK.8859-15: da_DK.ISO8859-15 +da_DK.utf8: da_DK.UTF-8 +DA_DK.UTF-8: da_DK.UTF-8 +de: de_DE.ISO8859-1 +de.ISO8859-15: de_DE.ISO8859-15 +de_AT: de_AT.ISO8859-1 +de_AT@euro: de_AT.ISO8859-15 +de_AT.iso88591: de_AT.ISO8859-1 +de_AT.ISO-8859-1: de_AT.ISO8859-1 +de_AT.ISO_8859-1: de_AT.ISO8859-1 +de_AT.iso885915: de_AT.ISO8859-15 +de_AT.ISO-8859-15: de_AT.ISO8859-15 +de_AT.ISO-8859-15@euro: de_AT.ISO8859-15 +de_AT.UTF-8@euro: de_AT.UTF-8 +de_AT.utf8: de_AT.UTF-8 +de_BE: de_BE.ISO8859-1 +de_BE@euro: de_BE.ISO8859-15 +de_BE.iso88591: de_BE.ISO8859-1 +de_BE.ISO_8859-1: de_BE.ISO8859-1 +de_BE.ISO-8859-1: de_BE.ISO8859-1 +de_BE.iso885915: de_BE.ISO8859-15 +de_BE.ISO_8859-15: de_BE.ISO8859-15 +de_BE.ISO-8859-15: de_BE.ISO8859-15 +de_BE.ISO-8859-15@euro: de_BE.ISO8859-15 +de_BE.UTF-8@euro: de_BE.UTF-8 +de_CH: de_CH.ISO8859-1 +de_CH.iso88591: de_CH.ISO8859-1 +de_CH.ISO_8859-1: de_CH.ISO8859-1 +de_CH.ISO-8859-1: de_CH.ISO8859-1 +de_CH.iso885915: de_CH.ISO8859-15 +de_CH.ISO_8859-15: de_CH.ISO8859-15 +de_CH.ISO-8859-15: de_CH.ISO8859-15 +de_CH.utf8: de_CH.UTF-8 +de_DE: de_DE.ISO8859-1 +de_DE@euro: de_DE.ISO8859-15 +de_DE.88591: de_DE.ISO8859-1 +de_DE.88591.en: de_DE.ISO8859-1 +de_DE.iso88591: de_DE.ISO8859-1 +de_DE.ISO-8859-1: de_DE.ISO8859-1 +de_DE.ISO_8859-1: de_DE.ISO8859-1 +de_DE.iso885915: de_DE.ISO8859-15 +de_DE.ISO-8859-15: de_DE.ISO8859-15 +de_DE.ISO_8859-15: de_DE.ISO8859-15 +de_DE.8859-15: de_DE.ISO8859-15 +de_DE.8859-15@euro: de_DE.ISO8859-15 +de_DE.ISO-8859-15@euro: de_DE.ISO8859-15 +de_DE.UTF-8@euro: de_DE.UTF-8 +de_DE.utf8: de_DE.UTF-8 +de_IT: de_IT.UTF-8 +de_IT.utf8: de_IT.UTF-8 +de_LI: de_LI.ISO8859-1 +de_LI.iso88591: de_LI.ISO8859-1 +de_LI.ISO_8859-1: de_LI.ISO8859-1 +de_LI.ISO-8859-1: de_LI.ISO8859-1 +de_LI.iso885915: de_LI.ISO8859-15 +de_LI.ISO_8859-15: de_LI.ISO8859-15 +de_LI.ISO-8859-15: de_LI.ISO8859-15 +de_LI.utf8: de_LI.UTF-8 +de_LU: de_LU.ISO8859-1 +de_LU@euro: de_LU.ISO8859-15 +de_LU.iso88591: de_LU.ISO8859-1 +de_LU.ISO_8859-1: de_LU.ISO8859-1 +de_LU.ISO-8859-1: de_LU.ISO8859-1 +de_LU.iso885915: de_LU.ISO8859-15 +de_LU.ISO_8859-15: de_LU.ISO8859-15 +de_LU.ISO-8859-15: de_LU.ISO8859-15 +de_LU.ISO-8859-15@euro: de_LU.ISO8859-15 +de_LU.UTF-8@euro: de_LU.UTF-8 +de_LU.utf8: de_LU.UTF-8 +GER_DE.8859: de_DE.ISO8859-1 +GER_DE.8859.in: de_DE.ISO8859-1 +ee: ee_EE.ISO8859-4 +ee_EE: ee_EE.ISO8859-4 +ee_EE.iso88594: ee_EE.ISO8859-4 +el: el_GR.ISO8859-7 +el_GR: el_GR.ISO8859-7 +el_GR.iso88597: el_GR.ISO8859-7 +el_GR.ISO-8859-7: el_GR.ISO8859-7 +el_GR@euro: el_GR.ISO8859-15 +el_GR.utf8: el_GR.UTF-8 +en: en_US.ISO8859-1 +en.ISO-8859-1: en_US.ISO8859-1 +en_AU: en_AU.ISO8859-1 +en_AU.iso88591: en_AU.ISO8859-1 +en_AU.ISO-8859-1: en_AU.ISO8859-1 +en_AU.ISO_8859-1: en_AU.ISO8859-1 +en_AU.utf8: en_AU.UTF-8 +en_BE: en_BE.ISO8859-1 +en_BE@euro: en_BE.ISO8859-15 +en_BE.utf8: en_BE.UTF-8 +en_BW: en_BW.ISO8859-1 +en_BW.utf8: en_BW.UTF-8 +en_BW.iso88591: en_BW.ISO8859-1 +en_BW.ISO-8859-1: en_BW.ISO8859-1 +en_CA: en_CA.ISO8859-1 +en_CA.iso88591: en_CA.ISO8859-1 +en_CA.ISO-8859-1: en_CA.ISO8859-1 +en_CA.ISO_8859-1: en_CA.ISO8859-1 +en_CA.utf8: en_CA.UTF-8 +en_DL.utf8: en_DL.UTF-8 +en_GB: en_GB.ISO8859-1 +en_GB.88591: en_GB.ISO8859-1 +en_GB.88591.en: en_GB.ISO8859-1 +en_GB.iso88591: en_GB.ISO8859-1 +en_GB.ISO-8859-1: en_GB.ISO8859-1 +en_GB.ISO_8859-1: en_GB.ISO8859-1 +en_GB.iso885915: en_GB.ISO8859-15 +en_GB.ISO-8859-15: en_GB.ISO8859-15 +en_GB.utf8: en_GB.UTF-8 +en_UK: en_GB.ISO8859-1 +ENG_GB.8859: en_GB.ISO8859-1 +ENG_GB.8859.in: en_GB.ISO8859-1 +en_HK: en_HK.ISO8859-1 +en_HK.iso88591: en_HK.ISO8859-1 +en_HK.ISO-8859-1: en_HK.ISO8859-1 +en_HK.utf8: en_HK.UTF-8 +en_IE: en_IE.ISO8859-1 +en_IE.iso88591: en_IE.ISO8859-1 +en_IE.ISO-8859-1: en_IE.ISO8859-1 +en_IE.iso885915: en_IE.ISO8859-15 +en_IE.ISO-8859-15: en_IE.ISO8859-15 +en_IE.ISO-8859-15@euro: en_IE.ISO8859-15 +en_IE@euro: en_IE.ISO8859-15 +en_IE.UTF-8@euro: en_IE.UTF-8 +en_IE.utf8: en_IE.UTF-8 +en_IN.utf8: en_IN.UTF-8 +en_IN: en_IN.ISO8859-1 +en_NZ: en_NZ.ISO8859-1 +en_NZ.iso88591: en_NZ.ISO8859-1 +en_NZ.ISO-8859-1: en_NZ.ISO8859-1 +en_NZ.utf8: en_NZ.UTF-8 +en_PH: en_PH.ISO8859-1 +en_PH.utf8: en_PH.UTF-8 +en_PH.iso88591: en_PH.ISO8859-1 +en_PH.ISO-8859-1: en_PH.ISO8859-1 +en_SG: en_SG.ISO8859-1 +en_SG.utf8: en_SG.UTF-8 +en_SG.iso88591: en_SG.ISO8859-1 +en_SG.ISO-8859-1: en_SG.ISO8859-1 +en_US: en_US.ISO8859-1 +EN_US: en_US.ISO8859-1 +en_US.88591: en_US.ISO8859-1 +en_US.88591.en: en_US.ISO8859-1 +en_US.iso88591: en_US.ISO8859-1 +en_US.ISO-8859-1: en_US.ISO8859-1 +en_US.ISO_8859-1: en_US.ISO8859-1 +en_US.iso885915: en_US.ISO8859-15 +en_US.ISO-8859-15: en_US.ISO8859-15 +en_US.8859-15: en_US.ISO8859-15 +en_US.ISO8859-15@euro: en_US.ISO8859-15 +en_US.utf8: en_US.UTF-8 +EN_US.UTF-8: en_US.UTF-8 +en_ZA: en_ZA.ISO8859-1 +en_ZA.88591: en_ZA.ISO8859-1 +en_ZA.88591.en: en_ZA.ISO8859-1 +en_ZA.iso88591: en_ZA.ISO8859-1 +en_ZA.ISO-8859-1: en_ZA.ISO8859-1 +en_ZA.ISO_8859-1: en_ZA.ISO8859-1 +en_ZA.iso885915: en_ZA.ISO8859-15 +en_ZA.ISO-8859-15: en_ZA.ISO8859-15 +en_ZA.utf8: en_ZA.UTF-8 +en_ZW: en_ZW.ISO8859-1 +en_ZW.utf8: en_ZS.UTF-8 +en_ZW.iso88591: en_ZW.ISO8859-1 +en_ZW.ISO-8859-1: en_ZW.ISO8859-1 +eo: eo_XX.ISO8859-3 +eo_EO: eo_EO.ISO8859-3 +eo_XX: eo_XX.ISO8859-3 +es: es_ES.ISO8859-1 +es.UTF-8: es_ES.UTF-8 +es_AR: es_AR.ISO8859-1 +es_AR.iso88591: es_AR.ISO8859-1 +es_AR.ISO-8859-1: es_AR.ISO8859-1 +es_AR.utf8: es_AR.UTF-8 +es_BO: es_BO.ISO8859-1 +es_BO.iso88591: es_BO.ISO8859-1 +es_BO.ISO-8859-1: es_BO.ISO8859-1 +es_BO.utf8: es_BO.UTF-8 +es_CL: es_CL.ISO8859-1 +es_CL.iso88591: es_CL.ISO8859-1 +es_CL.ISO-8859-1: es_CL.ISO8859-1 +es_CL.utf8: es_CL.UTF-8 +es_CO: es_CO.ISO8859-1 +es_CO.iso88591: es_CO.ISO8859-1 +es_CO.ISO-8859-1: es_CO.ISO8859-1 +es_CO.utf8: es_CO.UTF-8 +es_CR: es_CR.ISO8859-1 +es_CR.iso88591: es_CR.ISO8859-1 +es_CR.ISO-8859-1: es_CR.ISO8859-1 +es_CR.utf8: es_CR.UTF-8 +es_DO: es_DO.ISO8859-1 +es_DO.iso88591: es_DO.ISO8859-1 +es_DO.ISO-8859-1: es_DO.ISO8859-1 +es_DO.utf8: es_DO.UTF-8 +es_EC: es_EC.ISO8859-1 +es_EC.iso88591: es_EC.ISO8859-1 +es_EC.ISO-8859-1: es_EC.ISO8859-1 +es_EC.utf8: es_EC.UTF-8 +es_ES: es_ES.ISO8859-1 +es_ES.88591: es_ES.ISO8859-1 +es_ES.88591.en: es_ES.ISO8859-1 +es_ES.iso88591: es_ES.ISO8859-1 +es_ES.ISO-8859-1: es_ES.ISO8859-1 +es_ES.ISO_8859-1: es_ES.ISO8859-1 +es_ES.iso885915: es_ES.ISO8859-15 +es_ES.ISO-8859-15: es_ES.ISO8859-15 +es_ES.ISO-8859-15@euro: es_ES.ISO8859-15 +es_ES@euro: es_ES.ISO8859-15 +es_ES.UTF-8@euro: es_ES.UTF-8 +es_ES.utf8: es_ES.UTF-8 +es_GT: es_GT.ISO8859-1 +es_GT.iso88591: es_GT.ISO8859-1 +es_GT.ISO-8859-1: es_GT.ISO8859-1 +es_GT.utf8: es_GT.UTF-8 +es_HN: es_HN.ISO8859-1 +es_HN.iso88591: es_HN.ISO8859-1 +es_HN.ISO-8859-1: es_HN.ISO8859-1 +es_HN.utf8: es_HN.UTF-8 +es_MX: es_MX.ISO8859-1 +es_MX.iso88591: es_MX.ISO8859-1 +es_MX.ISO-8859-1: es_MX.ISO8859-1 +es_MX.utf8: es_MX.UTF-8 +es_NI: es_NI.ISO8859-1 +es_NI.iso88591: es_NI.ISO8859-1 +es_NI.ISO-8859-1: es_NI.ISO8859-1 +es_NI.utf8: es_NI.UTF-8 +es_PA: es_PA.ISO8859-1 +es_PA.iso88591: es_PA.ISO8859-1 +es_PA.ISO-8859-1: es_PA.ISO8859-1 +es_PA.iso885915: es_PA.ISO8859-15 +es_PA.utf8: es_PA.UTF-8 +es_PE: es_PE.ISO8859-1 +es_PE.iso88591: es_PE.ISO8859-1 +es_PE.ISO-8859-1: es_PE.ISO8859-1 +es_PE.iso885915: es_PE.ISO8859-15 +es_PE.utf8: es_PE.UTF-8 +es_PR: es_PR.ISO8859-1 +es_PR.iso88591: es_PR.ISO8859-1 +es_PR.ISO-8859-1: es_PR.ISO8859-1 +es_PR.utf8: es_PR.UTF-8 +es_PY: es_PY.ISO8859-1 +es_PY.iso88591: es_PY.ISO8859-1 +es_PY.ISO-8859-1: es_PY.ISO8859-1 +es_PY.iso885915: es_PY.ISO8859-15 +es_PY.utf8: es_PY.UTF-8 +es_SV: es_SV.ISO8859-1 +es_SV.iso88591: es_SV.ISO8859-1 +es_SV.ISO-8859-1: es_SV.ISO8859-1 +es_SV.iso885915: es_SV.ISO8859-15 +es_SV.utf8: es_SV.UTF-8 +es_US: es_US.ISO8859-1 +es_US.iso88591: es_US.ISO8859-1 +es_US.ISO-8859-1: es_US.ISO8859-1 +es_UY: es_UY.ISO8859-1 +es_UY.iso88591: es_UY.ISO8859-1 +es_UY.ISO-8859-1: es_UY.ISO8859-1 +es_UY.iso885915: es_UY.ISO8859-15 +es_UY.utf8: es_UY.UTF-8 +es_VE: es_VE.ISO8859-1 +es_VE.iso88591: es_VE.ISO8859-1 +es_VE.ISO-8859-1: es_VE.ISO8859-1 +es_VE.iso885915: es_VE.ISO8859-15 +es_VE.utf8: es_VE.UTF-8 +# According to Estonian local standards, ISO8859-4 is not a recommended +# charset. EVS8:2000 specifies ISO8859-15 as the base charset. +et: et_EE.ISO8859-15 +et_EE: et_EE.ISO8859-15 +et_EE.iso88591: et_EE.ISO8859-1 +et_EE.ISO-8859-1: et_EE.ISO8859-1 +et_EE.iso88594: et_EE.ISO8859-4 +et_EE.ISO-8859-4: et_EE.ISO8859-4 +et_EE.iso885913: et_EE.ISO8859-13 +et_EE.ISO-8859-13: et_EE.ISO8859-13 +et_EE.iso885915: et_EE.ISO8859-15 +et_EE.ISO-8859-15: et_EE.ISO8859-15 +et_EE.utf8: et_EE.UTF-8 +eu: eu_ES.ISO8859-1 +eu_ES: eu_ES.ISO8859-1 +eu_ES.iso88591: eu_ES.ISO8859-1 +eu_ES.ISO-8859-1: eu_ES.ISO8859-1 +eu_ES.iso885915: eu_ES.ISO8859-15 +eu_ES.ISO-8859-15: eu_ES.ISO8859-15 +eu_ES.ISO-8859-15@euro: eu_ES.ISO8859-15 +eu_ES@euro: eu_ES.ISO8859-15 +eu_ES.UTF-8@euro: eu_ES.UTF-8 +fa: fa_IR.UTF-8 +fa_IR: fa_IR.UTF-8 +fa_IR.isiri3342: fa_IR.ISIRI-3342 +fa_IR.utf8: fa_IR.UTF-8 +fi: fi_FI.ISO8859-15 +fi.ISO8859-15: fi_FI.ISO8859-15 +fi_FI: fi_FI.ISO8859-15 +fi_FI.88591: fi_FI.ISO8859-1 +fi_FI.88591.en: fi_FI.ISO8859-1 +fi_FI.iso88591: fi_FI.ISO8859-1 +fi_FI.ISO-8859-1: fi_FI.ISO8859-1 +fi_FI.ISO_8859-1: fi_FI.ISO8859-1 +fi_FI.iso885915: fi_FI.ISO8859-15 +fi_FI.ISO-8859-15: fi_FI.ISO8859-15 +fi_FI.ISO-8859-15@euro: fi_FI.ISO8859-15 +fi_FI@euro: fi_FI.ISO8859-15 +fi_FI.utf8: fi_FI.UTF-8 +fi_FI.UTF-8@euro: fi_FI.UTF-8 +fo: fo_FO.ISO8859-1 +fo_FO: fo_FO.ISO8859-1 +fo_FO.iso88591: fo_FO.ISO8859-1 +fo_FO.ISO-8859-1: fo_FO.ISO8859-1 +fo_FO.iso885915: fo_FO.ISO8859-15 +fo_FO.ISO-8859-15: fo_FO.ISO8859-15 +fo_FO.utf8: fo_FO.UTF-8 +fr: fr_FR.ISO8859-1 +fr.ISO8859-15: fr_FR.ISO8859-15 +fr.UTF-8: fr_FR.UTF-8 +fr_BE: fr_BE.ISO8859-1 +fr_BE.88591: fr_BE.ISO8859-1 +fr_BE.88591.en: fr_BE.ISO8859-1 +fr_BE.ISO-8859-1: fr_BE.ISO8859-1 +fr_BE.ISO_8859-1: fr_BE.ISO8859-1 +fr_BE.iso885915: fr_BE.ISO8859-15 +fr_BE.ISO-8859-15: fr_BE.ISO8859-15 +fr_BE.ISO-8859-15@euro: fr_BE.ISO8859-15 +fr_BE@euro: fr_BE.ISO8859-15 +fr_BE.utf8: fr_BE.UTF-8 +fr_BE.UTF-8@euro: fr_BE.UTF-8 +fr_CA: fr_CA.ISO8859-1 +fr_CA.88591: fr_CA.ISO8859-1 +fr_CA.88591.en: fr_CA.ISO8859-1 +fr_CA.iso88591: fr_CA.ISO8859-1 +fr_CA.ISO-8859-1: fr_CA.ISO8859-1 +fr_CA.ISO_8859-1: fr_CA.ISO8859-1 +fr_CA.iso885915: fr_CA.ISO8859-15 +fr_CA.ISO-8859-15: fr_CA.ISO8859-15 +fr_CA.utf8: fr_CA.UTF-8 +fr_CH: fr_CH.ISO8859-1 +fr_CH.88591: fr_CH.ISO8859-1 +fr_CH.88591.en: fr_CH.ISO8859-1 +fr_CH.ISO-8859-1: fr_CH.ISO8859-1 +fr_CH.ISO_8859-1: fr_CH.ISO8859-1 +fr_CH.iso885915: fr_CH.ISO8859-15 +fr_CH.ISO-8859-15: fr_CH.ISO8859-15 +fr_CH.utf8: fr_CH.UTF-8 +fr_FR: fr_FR.ISO8859-1 +fr_FR.88591: fr_FR.ISO8859-1 +fr_FR.88591.en: fr_FR.ISO8859-1 +fr_FR.iso88591: fr_FR.ISO8859-1 +fr_FR.ISO-8859-1: fr_FR.ISO8859-1 +fr_FR.ISO_8859-1: fr_FR.ISO8859-1 +fr_FR.iso885915: fr_FR.ISO8859-15 +fr_FR.ISO-8859-15: fr_FR.ISO8859-15 +fr_FR.ISO-8859-15@euro: fr_FR.ISO8859-15 +fr_FR@euro: fr_FR.ISO8859-15 +fr_FR.UTF-8@euro: fr_FR.UTF-8 +fr_FR.utf8: fr_FR.UTF-8 +fr_LU: fr_LU.ISO8859-1 +fr_LU.88591: fr_LU.ISO8859-1 +fr_LU.88591.en: fr_LU.ISO8859-1 +fr_LU.iso88591: fr_LU.ISO8859-1 +fr_LU.ISO-8859-1: fr_LU.ISO8859-1 +fr_LU.ISO_8859-1: fr_LU.ISO8859-1 +fr_LU.iso885915: fr_LU.ISO8859-15 +fr_LU.ISO-8859-15: fr_LU.ISO8859-15 +fr_LU.ISO-8859-15@euro: fr_LU.ISO8859-15 +fr_LU@euro: fr_LU.ISO8859-15 +fr_LU.UTF-8@euro: fr_LU.UTF-8 +fr_LU.utf8: fr_LU.UTF-8 +FRE_FR.8859: fr_FR.ISO8859-1 +FRE_FR.8859.in: fr_FR.ISO8859-1 +ga: ga_IE.ISO8859-1 +ga_IE: ga_IE.ISO8859-1 +ga_IE.iso88591: ga_IE.ISO8859-1 +ga_IE.ISO-8859-1: ga_IE.ISO8859-1 +ga_IE.iso885914: ga_IE.ISO8859-14 +ga_IE.ISO-8859-14: ga_IE.ISO8859-14 +ga_IE.iso885915: ga_IE.ISO8859-15 +ga_IE.ISO-8859-15: ga_IE.ISO8859-15 +ga_IE.ISO-8859-15@euro: ga_IE.ISO8859-15 +ga_IE@euro: ga_IE.ISO8859-15 +ga_IE.UTF-8@euro: ga_IE.UTF-8 +ga_IE.utf8: ga_IE.UTF-8 +gd: gd_GB.ISO8859-1 +gd_GB: gd_GB.ISO8859-1 +gd_GB.iso88591: gd_GB.ISO8859-1 +gd_GB.ISO-8859-1: gd_GB.ISO8859-1 +gd_GB.iso885914: gd_GB.ISO8859-14 +gd_GB.ISO-8859-14: gd_GB.ISO8859-14 +gd_GB.iso885915: gd_GB.ISO8859-15 +gd_GB.ISO-8859-15: gd_GB.ISO8859-15 +gl: gl_ES.ISO8859-1 +gl_ES: gl_ES.ISO8859-1 +gl_ES.iso88591: gl_ES.ISO8859-1 +gl_ES.ISO-8859-1: gl_ES.ISO8859-1 +gl_ES.iso885915: gl_ES.ISO8859-15 +gl_ES.ISO-8859-15: gl_ES.ISO8859-15 +gl_ES.ISO-8859-15@euro: gl_ES.ISO8859-15 +gl_ES@euro: gl_ES.ISO8859-15 +gl_ES.UTF-8@euro: gl_ES.UTF-8 +gl_ES.utf8: gl_ES.UTF-8 +gu_IN: gu_IN.UTF-8 +gu_IN.utf8: gu_IN.UTF-8 +gv: gv_GB.ISO8859-1 +gv_GB: gv_GB.ISO8859-1 +gv_GB.iso88591: gv_GB.ISO8859-1 +gv_GB.ISO-8859-1: gv_GB.ISO8859-1 +gv_GB.iso885914: gv_GB.ISO8859-14 +gv_GB.ISO-8859-14: gv_GB.ISO8859-14 +gv_GB.iso885915: gv_GB.ISO8859-15 +gv_GB.ISO-8859-15: gv_GB.ISO8859-15 +he: he_IL.ISO8859-8 +he_IL: he_IL.ISO8859-8 +HE_IL: he_IL.ISO8859-8 +he_IL.iso88598: he_IL.ISO8859-8 +he_IL.ISO-8859-8: he_IL.ISO8859-8 +he_IL.cp1255: he_IL.CP1255 +he_IL.microsoftcp1255: he_IL.CP1255 +he_IL.microsoft-cp1255: he_IL.CP1255 +he_IL.MICROSOFT-CP1255: he_IL.CP1255 +he_IL.utf8: he_IL.UTF-8 +HE_IL.UTF-8: he_IL.UTF-8 +hi: hi_IN.ISCII-DEV +hi_IN: hi_IN.ISCII-DEV +HI_IN: hi_IN.ISCII-DEV +hi_IN.isciidev: hi_IN.ISCII-DEV +hi_IN.utf8: hi_IN.UTF-8 +HI_IN.UTF-8: hi_IN.UTF-8 +hne: hne_IN.UTF-8 +hne_IN: hne_IN.UTF-8 +hne_IN.utf8: hne_IN.UTF-8 +hr: hr_HR.ISO8859-2 +hr_HR: hr_HR.ISO8859-2 +hr_HR.iso88592: hr_HR.ISO8859-2 +hr_HR.ISO-8859-2: hr_HR.ISO8859-2 +hr_HR.ISO_8859-2: hr_HR.ISO8859-2 +hr_HR.utf8: hr_HR.UTF-8 +hu: hu_HU.ISO8859-2 +hu_HU: hu_HU.ISO8859-2 +hu_HU.iso88592: hu_HU.ISO8859-2 +hu_HU.ISO-8859-2: hu_HU.ISO8859-2 +hu_HU.utf8: hu_HU.UTF-8 +ia: ia.UTF-8 +ia.utf8: ia.UTF-8 +ie: ie.UTF-8 +ie.utf8: ie.UTF-8 +is: is_IS.ISO8859-1 +is_IS: is_IS.ISO8859-1 +is_IS.iso88591: is_IS.ISO8859-1 +is_IS.ISO-8859-1: is_IS.ISO8859-1 +is_IS.ISO_8859-1: is_IS.ISO8859-1 +is_IS.iso885915: is_IS.ISO8859-15 +is_IS.ISO-8859-15: is_IS.ISO8859-15 +is_IS.utf8: is_IS.UTF-8 +it: it_IT.ISO8859-1 +it.ISO8859-15: it_IT.ISO8859-15 +it.UTF-8: it_IT.UTF-8 +it_CH: it_CH.ISO8859-1 +it_CH.iso88591: it_CH.ISO8859-1 +it_CH.ISO_8859-1: it_CH.ISO8859-1 +it_CH.ISO-8859-1: it_CH.ISO8859-1 +it_CH.iso885915: it_CH.ISO8859-15 +it_CH.utf8: it_CH.UTF-8 +it_IT: it_IT.ISO8859-1 +it_IT.88591: it_IT.ISO8859-1 +it_IT.88591.en: it_IT.ISO8859-1 +it_IT.iso88591: it_IT.ISO8859-1 +it_IT.ISO-8859-1: it_IT.ISO8859-1 +it_IT.ISO_8859-1: it_IT.ISO8859-1 +it_IT.iso885915: it_IT.ISO8859-15 +it_IT.ISO-8859-15: it_IT.ISO8859-15 +it_IT.ISO-8859-15@euro: it_IT.ISO8859-15 +it_IT@euro: it_IT.ISO8859-15 +it_IT.utf8: it_IT.UTF-8 +it_IT.UTF-8@euro: it_IT.UTF-8 +# NUNACOM is an encoding for the Inuktitut syllabics +# we have little else on this encoding. +iu: iu_CA.NUNACOM-8 +iu_CA: iu_CA.NUNACOM-8 +iu_CA.nunacom8: iu_CA.NUNACOM-8 +ja_JP: ja_JP.eucJP +ja: ja_JP.eucJP +ja.JIS: ja_JP.JIS7 +ja.SJIS: ja_JP.SJIS +ja_JP.ujis: ja_JP.eucJP +Jp_JP: ja_JP.eucJP +ja_JP.AJEC: ja_JP.eucJP +ja_JP.EUC: ja_JP.eucJP +ja_JP.EUC-JP: ja_JP.eucJP +ja_JP.EUC_JP: ja_JP.eucJP +ja_JP.eucjp: ja_JP.eucJP +ja_JP.ISO-2022-JP: ja_JP.JIS7 +ja_JP.JIS: ja_JP.JIS7 +ja_JP.jis7: ja_JP.JIS7 +ja_JP.mscode: ja_JP.SJIS +ja_JP.PCK: ja_JP.SJIS +ja_JP.sjis: ja_JP.SJIS +ja_JP.utf8: ja_JP.UTF-8 +JA_JP.utf8: ja_JP.UTF-8 +ka: ka_GE.GEORGIAN-ACADEMY +ka_GE: ka_GE.GEORGIAN-ACADEMY +ka_GE.georgianacademy: ka_GE.GEORGIAN-ACADEMY +ka_GE.georgianrs: ka_GE.GEORGIAN-ACADEMY +ka_GE.georgianps: ka_GE.GEORGIAN-PS +kl: kl_GL.ISO8859-1 +kl_GL: kl_GL.ISO8859-1 +kl_GL.iso88591: kl_GL.ISO8859-1 +kl_GL.ISO-8859-1: kl_GL.ISO8859-1 +kl_GL.iso885915: kl_GL.ISO8859-15 +kl_GL.utf8: kl_GL.UTF-8 +km_KH: km_KH.UTF-8 +km_KH.utf8: km_KH.UTF-8 +kn: kn_IN.UTF-8 +kn_IN: kn_IN.UTF-8 +kn_IN.utf8: kn_IN.UTF-8 +ko: ko_KR.eucKR +ko.UTF-8: ko_KR.UTF-8 +ko_KR: ko_KR.eucKR +KO_KR: ko_KR.eucKR +ko_KR.EUC: ko_KR.eucKR +ko_KR.EUC-KR: ko_KR.eucKR +ko_KR.euc: ko_KR.eucKR +ko_KR.euckr: ko_KR.eucKR +ko_KR.utf8: ko_KR.UTF-8 +KO_KR.UTF-8: ko_KR.UTF-8 +ks: ks_IN.UTF-8 +ks_IN: ks_IN.UTF-8 +ks_IN.utf8: ks_IN.UTF-8 +ks_IN@devanagari: ks_IN.UTF-8@devanagari +ks_IN.utf8@devanagari: ks_IN.UTF-8@devanagari +kw: kw_GB.ISO8859-1 +kw_GB: kw_GB.ISO8859-1 +kw_GB.iso88591: kw_GB.ISO8859-1 +kw_GB.ISO-8859-1: kw_GB.ISO8859-1 +kw_GB.iso885914: kw_GB.ISO8859-14 +kw_GB.ISO-8859-14: kw_GB.ISO8859-14 +kw_GB.iso885915: kw_GB.ISO8859-15 +kw_GB.ISO-8859-15: kw_GB.ISO8859-15 +ky: ky_KG.UTF-8 +ky_KG: ky_KG.UTF-8 +ky_KG.utf8: ky_KG.UTF-8 +lo: lo_LA.MULELAO-1 +lo_LA: lo_LA.MULELAO-1 +lo_LA.cp1133: lo_LA.IBM-CP1133 +lo_LA.ibmcp1133: lo_LA.IBM-CP1133 +lo_LA.mulelao1: lo_LA.MULELAO-1 +lt: lt_LT.ISO8859-13 +lt_LT: lt_LT.ISO8859-13 +lt_LT.iso88594: lt_LT.ISO8859-4 +lt_LT.ISO-8859-4: lt_LT.ISO8859-4 +lt_LT.ISO_8859-4: lt_LT.ISO8859-4 +lt_LT.iso885913: lt_LT.ISO8859-13 +lt_LT.ISO-8859-13: lt_LT.ISO8859-13 +lt_LT.ISO_8859-13: lt_LT.ISO8859-13 +lt_LT.utf8: lt_LT.UTF-8 +lv: lv_LV.ISO8859-13 +lv_LV: lv_LV.ISO8859-13 +lv_LV.iso88594: lv_LV.ISO8859-4 +lv_LV.ISO-8859-4: lv_LV.ISO8859-4 +lv_LV.iso885913: lv_LV.ISO8859-13 +lv_LV.ISO-8859-13: lv_LV.ISO8859-13 +lv_LV.ISO_8859-13: lv_LV.ISO8859-13 +lv_LV.utf8: lv_LV.UTF-8 +mai: mai_IN.UTF-8 +mai_IN: mai_IN.UTF-8 +mai_IN.utf8: mai_IN.UTF-8 +mi: mi_NZ.ISO8859-1 +mi_NZ: mi_NZ.ISO8859-1 +mi_NZ.iso88591: mi_NZ.ISO8859-1 +mk: mk_MK.ISO8859-5 +mk_MK: mk_MK.ISO8859-5 +mk_MK.iso88595: mk_MK.ISO8859-5 +mk_MK.ISO-8859-5: mk_MK.ISO8859-5 +mk_MK.cp1251: mk_MK.CP1251 +mk_MK.microsoftcp1251: mk_MK.CP1251 +mk_MK.microsoft-cp1251: mk_MK.CP1251 +mk_MK.MICROSOFT-CP1251: mk_MK.CP1251 +mk_MK.utf8: mk_MK.UTF-8 +ml: ml_IN.UTF-8 +ml_IN: ml_IN.UTF-8 +ml_IN.utf8: ml_IN.UTF-8 +mr: mr_IN.UTF-8 +mr_IN: mr_IN.UTF-8 +mr_IN.utf8: mr_IN.UTF-8 +ms: ms_MY.ISO8859-1 +ms_MY: ms_MY.ISO8859-1 +ms_MY.iso88591: ms_MY.ISO8859-1 +ms_MY.ISO-8859-1: ms_MY.ISO8859-1 +mt: mt_MT.ISO8859-3 +mt_MT: mt_MT.ISO8859-3 +mt_MT.ISO-8859-3: mt_MT.ISO8859-3 +nb: nb_NO.ISO8859-1 +nb_NO: nb_NO.ISO8859-1 +nb_NO.88591: nb_NO.ISO8859-1 +nb_NO.iso88591: nb_NO.ISO8859-1 +nb_NO.ISO-8859-1: nb_NO.ISO8859-1 +nb_NO.iso885915: nb_NO.ISO8859-15 +nb_NO.ISO-8859-15: nb_NO.ISO8859-15 +nb_NO.utf8: nb_NO.UTF-8 +ne_NP: ne_NP.UTF-8 +ne_NP.utf8: ne_NP.UTF-8 +nl: nl_NL.ISO8859-1 +nl.ISO8859-15: nl_NL.ISO8859-15 +nl_BE: nl_BE.ISO8859-1 +nl_BE.88591: nl_BE.ISO8859-1 +nl_BE.88591.en: nl_BE.ISO8859-1 +nl_BE.iso88591: nl_BE.ISO8859-1 +nl_BE.ISO-8859-1: nl_BE.ISO8859-1 +nl_BE.ISO_8859-1: nl_BE.ISO8859-1 +nl_BE.iso885915: nl_BE.ISO8859-15 +nl_BE.ISO-8859-15: nl_BE.ISO8859-15 +nl_BE.ISO-8859-15@euro: nl_BE.ISO8859-15 +nl_BE@euro: nl_BE.ISO8859-15 +nl_BE.utf8: nl_BE.UTF-8 +nl_BE.UTF-8@euro: nl_BE.UTF-8 +nl_NL: nl_NL.ISO8859-1 +nl_NL.88591: nl_NL.ISO8859-1 +nl_NL.88591.en: nl_NL.ISO8859-1 +nl_NL.iso88591: nl_NL.ISO8859-1 +nl_NL.ISO-8859-1: nl_NL.ISO8859-1 +nl_NL.ISO_8859-1: nl_NL.ISO8859-1 +nl_NL.iso885915: nl_NL.ISO8859-15 +nl_NL.ISO-8859-15: nl_NL.ISO8859-15 +nl_NL.ISO-8859-15@euro: nl_NL.ISO8859-15 +nl_NL@euro: nl_NL.ISO8859-15 +nl_NL.utf8: nl_NL.UTF-8 +nl_NL.UTF-8@euro: nl_NL.UTF-8 +nn: nn_NO.ISO8859-1 +nn_NO: nn_NO.ISO8859-1 +nn_NO.88591: nn_NO.ISO8859-1 +nn_NO.ISO-8859-1: nn_NO.ISO8859-1 +nn_NO.ISO_8859-1: nn_NO.ISO8859-1 +nn_NO.iso885915: nn_NO.ISO8859-15 +nn_NO.ISO-8859-15: nn_NO.ISO8859-15 +nn_NO.utf8: nn_NO.UTF-8 +no: no_NO.ISO8859-1 +no_NO: no_NO.ISO8859-1 +no_NO.88591: no_NO.ISO8859-1 +no_NO.88591.en: no_NO.ISO8859-1 +no_NO.iso88591: no_NO.ISO8859-1 +no_NO.ISO-8859-1: no_NO.ISO8859-1 +no_NO.ISO8859-1@bokmal: no_NO.ISO8859-1 +no_NO.ISO8859-1@nynorsk: no_NO.ISO8859-1 +no_NO.iso885915: no_NO.ISO8859-15 +no_NO.ISO-8859-15: no_NO.ISO8859-15 +no_NO.utf8: no_NO.UTF-8 +nr: nr_ZA.ISO8859-1 +nr_ZA: nr_ZA.ISO8859-1 +nr_ZA.iso88591: nr_ZA.ISO8859-1 +nr_ZA.utf8: nr_ZA.UTF-8 +nso: nso_ZA.ISO8859-15 +nso_ZA: nso_ZA.ISO8859-15 +nso_ZA.iso885915: nso_ZA.ISO8859-15 +nso_ZA.utf8: nso_ZA.UTF-8 +ny: ny_NO.ISO8859-1 +ny_NO: ny_NO.ISO8859-1 +ny_NO.88591: ny_NO.ISO8859-1 +ny_NO.ISO_8859-1: ny_NO.ISO8859-1 +ny_NO.iso885915: ny_NO.ISO8859-15 +no@nynorsk: ny_NO.ISO8859-1 +nynorsk: nn_NO.ISO8859-1 +oc: oc_FR.ISO8859-1 +oc_FR: oc_FR.ISO8859-1 +oc_FR.iso88591: oc_FR.ISO8859-1 +oc_FR.ISO-8859-1: oc_FR.ISO8859-1 +oc_FR.iso885915: oc_FR.ISO8859-15 +oc_FR.ISO-8859-15: oc_FR.ISO8859-15 +oc_FR@euro: oc_FR.ISO8859-15 +or: or_IN.UTF-8 +or_IN: or_IN.UTF-8 +or_IN.utf8: or_IN.UTF-8 +pa: pa_IN.UTF-8 +pa_IN: pa_IN.UTF-8 +pa_IN.utf8: pa_IN.UTF-8 +pa_PK.utf8: pa_PK.UTF-8 +pd: pd_US.ISO8859-1 +pd_DE: pd_DE.ISO8859-1 +pd_US: pd_US.ISO8859-1 +pd_DE.iso88591: pd_DE.ISO8859-1 +pd_US.iso88591: pd_US.ISO8859-1 +pd_DE.iso885915: pd_DE.ISO8859-15 +pd_US.iso885915: pd_US.ISO8859-15 +ph: ph_PH.ISO8859-1 +ph_PH: ph_PH.ISO8859-1 +ph_PH.iso88591: ph_PH.ISO8859-1 +pl: pl_PL.ISO8859-2 +pl.UTF-8: pl_PL.UTF-8 +pl_PL: pl_PL.ISO8859-2 +pl_PL.iso88592: pl_PL.ISO8859-2 +pl_PL.ISO-8859-2: pl_PL.ISO8859-2 +pl_PL.utf8: pl_PL.UTF-8 +pp: pp_AN.ISO8859-1 +pp_AN: pp_AN.ISO8859-1 +pp_AN.iso88591: pp_AN.ISO8859-1 +pt: pt_PT.ISO8859-1 +pt.ISO8859-15: pt_PT.ISO8859-15 +pt_BR: pt_BR.ISO8859-1 +pt_BR.88591: pt_BR.ISO8859-1 +pt_BR.88591.en: pt_BR.ISO8859-1 +pt_BR.iso88591: pt_BR.ISO8859-1 +pt_BR.ISO-8859-1: pt_BR.ISO8859-1 +pt_BR.ISO_8859-1: pt_BR.ISO8859-1 +pt_BR.iso885915: pt_BR.ISO8859-15 +pt_BR.utf8: pt_BR.UTF-8 +pt_PT: pt_PT.ISO8859-1 +pt_PT.88591: pt_PT.ISO8859-1 +pt_PT.88591.en: pt_PT.ISO8859-1 +pt_PT.iso88591: pt_PT.ISO8859-1 +pt_PT.ISO-8859-1: pt_PT.ISO8859-1 +pt_PT.ISO_8859-1: pt_PT.ISO8859-1 +pt_PT.iso885915: pt_PT.ISO8859-15 +pt_PT.ISO-8859-15: pt_PT.ISO8859-15 +pt_PT.ISO-8859-15@euro: pt_PT.ISO8859-15 +pt_PT@euro: pt_PT.ISO8859-15 +pt_PT.utf8: pt_PT.UTF-8 +pt_PT.UTF-8@euro: pt_PT.UTF-8 +ro: ro_RO.ISO8859-2 +ro_RO: ro_RO.ISO8859-2 +ro_RO.iso88592: ro_RO.ISO8859-2 +ro_RO.ISO-8859-2: ro_RO.ISO8859-2 +ro_RO.utf8: ro_RO.UTF-8 +ru: ru_RU.UTF-8 +ru.koi8-r: ru_RU.KOI8-R +ru.UTF-8: ru_RU.UTF-8 +ru_RU: ru_RU.UTF-8 +ru_RU.utf8: ru_RU.UTF-8 +ru_RU.iso88595: ru_RU.ISO8859-5 +ru_RU.ISO-8859-5: ru_RU.ISO8859-5 +ru_RU.koi8r: ru_RU.KOI8-R +ru_RU.cp1251: ru_RU.CP1251 +ru_RU.microsoftcp1251: ru_RU.CP1251 +ru_RU.microsoft-cp1251: ru_RU.CP1251 +ru_RU.MICROSOFT-CP1251: ru_RU.CP1251 +ru_UA: ru_UA.KOI8-U +ru_UA.koi8u: ru_UA.KOI8-U +ru_UA.cp1251: ru_UA.CP1251 +ru_UA.microsoftcp1251: ru_UA.CP1251 +ru_UA.microsoft-cp1251: ru_UA.CP1251 +ru_UA.MICROSOFT-CP1251: ru_UA.CP1251 +rw: rw_RW.ISO8859-1 +rw_RW: rw_RW.ISO8859-1 +rw_RW.iso8859-1: rw_RW.ISO8859-1 +rw_RW.ISO-8859-1: rw_RW.ISO8859-1 +rw_RW.utf8: rw_RW.UTF-8 +sd: sd_IN.UTF-8 +sd_IN.utf8: sd_IN.UTF-8 +sd@devanagari: sd_IN.UTF-8@devanagari +sd_IN@devanagari: sd_IN.UTF-8@devanagari +sd_IN.utf8@devanagari: sd_IN.UTF-8@devanagari +se_NO: se_NO.UTF-8 +se_NO.utf8: se_NO.UTF-8 +si: si_LK.UTF-8 +si_LK: si_LK.UTF-8 +sk: sk_SK.ISO8859-2 +sk_SK: sk_SK.ISO8859-2 +sk_SK.iso88592: sk_SK.ISO8859-2 +sk_SK.ISO-8859-2: sk_SK.ISO8859-2 +sk_SK.utf8: sk_SK.UTF-8 +sl: sl_SI.ISO8859-2 +sl_SI: sl_SI.ISO8859-2 +sl_SI.iso88592: sl_SI.ISO8859-2 +sl_SI.ISO-8859-2: sl_SI.ISO8859-2 +sl_SI.utf8: sl_SI.UTF-8 +sq: sq_AL.ISO8859-2 +sq_AL: sq_AL.ISO8859-2 +sq_AL.iso88592: sq_AL.ISO8859-2 +sq_AL.ISO-8859-2: sq_AL.ISO8859-2 +sq_AL.utf8: sq_AL.UTF-8 +sr: sr_RS.UTF-8 +sr@cyrillic: sr_RS.UTF-8 +sr@latin: sr_RS.UTF-8@latin +sr@Latn: sr_RS.UTF-8@latin +sr_RS: sr_RS.UTF-8 +sr_RS@latin: sr_RS.UTF-8@latin +sr_RS@Latn: sr_RS.UTF-8@latin +sr_RS.UTF-8@Latn: sr_RS.UTF-8@latin +sr_RS.utf8: sr_RS.UTF-8 +sr_ME: sr_ME.UTF-8 +sr_ME.utf8: sr_ME.UTF-8 +ss: ss_ZA.ISO8859-1 +ss_ZA: ss_ZA.ISO8859-1 +ss_ZA.iso88591: ss_ZA.ISO8859-1 +ss_ZA.utf8: ss_ZA.UTF-8 +st: st_ZA.ISO8859-1 +st_ZA: st_ZA.ISO8859-1 +st_ZA.iso88591: st_ZA.ISO8859-1 +st_ZA.utf8: st_ZA.UTF-8 +sv: sv_SE.ISO8859-1 +sv.ISO8859-15: sv_SE.ISO8859-15 +sv.UTF-8: sv_SE.UTF-8 +sv_FI: sv_FI.ISO8859-1 +sv_FI.iso88591: sv_FI.ISO8859-1 +sv_FI.ISO-8859-1: sv_FI.ISO8859-1 +sv_FI.iso885915: sv_FI.ISO8859-15 +sv_FI.ISO-8859-15: sv_FI.ISO8859-15 +sv_FI.ISO-8859-15@euro: sv_FI.ISO8859-15 +sv_FI@euro: sv_FI.ISO8859-15 +sv_FI.UTF-8@euro: sv_FI.UTF-8 +sv_FI.utf8: sv_FI.UTF-8 +sv_SE: sv_SE.ISO8859-1 +sv_SE.88591: sv_SE.ISO8859-1 +sv_SE.88591.en: sv_SE.ISO8859-1 +sv_SE.iso88591: sv_SE.ISO8859-1 +sv_SE.ISO-8859-1: sv_SE.ISO8859-1 +sv_SE.ISO_8859-1: sv_SE.ISO8859-1 +sv_SE.iso885915: sv_SE.ISO8859-15 +sv_SE.ISO-8859-15: sv_SE.ISO8859-15 +sv_SE@euro: sv_SE.ISO8859-15 +sv_SE.utf8: sv_SE.UTF-8 +ta: ta_IN.TSCII-0 +ta_IN: ta_IN.TSCII-0 +ta_IN.tscii: ta_IN.TSCII-0 +ta_IN.tscii0: ta_IN.TSCII-0 +te: te_IN.UTF-8 +te.UTF-8: te_IN.UTF-8 +te_IN.utf8: te_IN.UTF-8 +tg: tg_TJ.KOI8-C +tg_TJ: tg_TJ.KOI8-C +tg_TJ.koi8c: tg_TJ.KOI8-C +th: th_TH.ISO8859-11 +th_TH: th_TH.ISO8859-11 +th_TH.ISO-8859-11: th_TH.ISO8859-11 +th_TH.tis620: th_TH.TIS620 +th_TH.TIS-620: th_TH.TIS620 +th_TH.TACTIS: th_TH.TIS620 +th_TH.utf8: th_TH.UTF-8 +tl: tl_PH.ISO8859-1 +tl_PH: tl_PH.ISO8859-1 +tl_PH.iso88591: tl_PH.ISO8859-1 +tl_PH.ISO-8859-1: tl_PH.ISO8859-1 +tn: tn_ZA.ISO8859-15 +tn_ZA: tn_ZA.ISO8859-15 +tn_ZA.iso8859-15: tn_ZA.ISO8859-15 +tn_ZA.utf8: tn_ZA.UTF-8 +tr: tr_TR.ISO8859-9 +tr_TR: tr_TR.ISO8859-9 +TR_TR: tr_TR.ISO8859-9 +tr_TR.iso88599: tr_TR.ISO8859-9 +tr_TR.ISO-8859-9: tr_TR.ISO8859-9 +tr_TR.utf8: tr_TR.UTF-8 +TR_TR.utf8: tr_TR.UTF-8 +ts: ts_ZA.ISO8859-1 +ts_ZA: ts_ZA.ISO8859-1 +ts_ZA.iso88591: ts_ZA.ISO8859-1 +ts_ZA.utf8: ts_ZA.UTF-8 +tt: tt_RU.TATAR-CYR +tt_RU: tt_RU.TATAR-CYR +tt_RU.tatarcyr: tt_RU.TATAR-CYR +tt_RU.koi8c: tt_RU.KOI8-C +uk: uk_UA.KOI8-U +uk_UA: uk_UA.KOI8-U +uk_UA.iso88595: uk_UA.ISO8859-5 +uk_UA.koi8u: uk_UA.KOI8-U +uk_UA.cp1251: uk_UA.CP1251 +uk_UA.microsoftcp1251: uk_UA.CP1251 +uk_UA.microsoft-cp1251: uk_UA.CP1251 +uk_UA.MICROSOFT-CP1251: uk_UA.CP1251 +uk_UA.utf8: uk_UA.UTF-8 +ur: ur_IN.UTF-8 +ur_IN: ur_IN.UTF-8 +ur_IN.utf8: ur_IN.UTF-8 +ur: ur_PK.CP1256 +ur_PK: ur_PK.CP1256 +ur_PK.cp1256: ur_PK.CP1256 +ur_PK.microsoftcp1256: ur_PK.CP1256 +ur_PK.microsoft-cp1256: ur_PK.CP1256 +ur_PK.MICROSOFT-CP1256: ur_PK.CP1256 +uz: uz_UZ.UTF-8 +uz_UZ: uz_UZ.UTF-8 +uz_UZ.ISO-8859-1: uz_UZ.ISO8859-1 +uz_UZ@cyrillic: uz_UZ.UTF-8 +uz_UZ.UTF-8@cyrillic: uz_UZ.UTF-8 +ve: ve_ZA.UTF-8 +ve_ZA: ve_ZA.UTF-8 +ve_ZA.utf8: ve_ZA.UTF-8 +vi: vi_VN.TCVN +vi_VN: vi_VN.TCVN +Vi_VN: vi_VN.TCVN +VI_VN: vi_VN.TCVN +vi_VN.tcvn: vi_VN.TCVN +vi_VN.tcvn5712: vi_VN.TCVN +vi_VN.viscii: vi_VN.VISCII +vi_VN.viscii111: vi_VN.VISCII +vi_VN.utf8: vi_VN.UTF-8 +VI_VN.UTF-8: vi_VN.UTF-8 +wa: wa_BE.ISO8859-1 +wa_BE: wa_BE.ISO8859-1 +wa_BE.iso88591: wa_BE.ISO8859-1 +wa_BE.ISO-8859-1: wa_BE.ISO8859-1 +wa_BE.iso885915: wa_BE.ISO8859-15 +wa_BE.ISO-8859-15: wa_BE.ISO8859-15 +wa_BE.ISO-8859-15@euro: wa_BE.ISO8859-15 +wa_BE@euro: wa_BE.ISO8859-15 +xh: xh_ZA.ISO8859-1 +xh_ZA: xh_ZA.ISO8859-1 +xh_ZA.iso88591: xh_ZA.ISO8859-1 +xh_ZA.utf8: xh_ZA.UTF-8 +yi: yi_US.CP1255 +yi_US: yi_US.CP1255 +yi_US.cp1255: yi_US.CP1255 +yi_US.microsoftcp1255: yi_US.CP1255 +yi_US.microsoft-cp1255: yi_US.CP1255 +yi_US.MICROSOFT-CP1255: yi_US.CP1255 +zh_CN: zh_CN.gb2312 +zh_CN.Big5: zh_TW.big5 +zh_CN.EUC: zh_CN.eucCN +zh_CN.GB2312: zh_CN.gb2312 +zh_CN.GBK: zh_CN.gbk +zh_CN.GB18030: zh_CN.gb18030 +zh_CN.big5: zh_TW.big5 +zh_CN.euc: zh_CN.eucCN +zh_CN.utf8: zh_CN.UTF-8 +ZH_CN.UTF-8: zh_CN.UTF-8 +zh_HK: zh_HK.big5hkscs +zh_HK.BIG5HK: zh_HK.big5hkscs +zh_HK.Big5hkscs: zh_HK.big5hkscs +zh_HK.Big5-hkscs: zh_HK.big5hkscs +zh_HK.Big5_hkscs: zh_HK.big5hkscs +zh_HK.Big5HKSCS: zh_HK.big5hkscs +zh_HK.BIG5-HKSCS: zh_HK.big5hkscs +zh_HK.BIG5_HKSCS: zh_HK.big5hkscs +zh_HK.Big5-HKSCS: zh_HK.big5hkscs +zh_HK.big5-hkscs: zh_HK.big5hkscs +zh_HK.Big5-HKSCS: zh_HK.big5hkscs +zh_HK.Big5HKSCS: zh_HK.big5hkscs +zh_HK.Big5: zh_HK.big5 +zh_HK.utf8: zh_HK.UTF-8 +ZH_HK.UTF-8: zh_HK.UTF-8 +ZH_SG.UTF-8: zh_SG.UTF-8 +zh_TW: zh_TW.big5 +zh_TW.Big5: zh_TW.big5 +zh_TW.BIG5: zh_TW.big5 +Zh_TW.big5: zh_TW.big5 +zh_TW.EUC: zh_TW.eucTW +zh_TW.EUC-TW: zh_TW.eucTW +zh_TW.utf8: zh_TW.UTF-8 +ZH_TW.UTF-8: zh_TW.UTF-8 +zu: zu_ZA.ISO8859-1 +zu_ZA: zu_ZA.ISO8859-1 +zu_ZA.iso88591: zu_ZA.ISO8859-1 +zu_ZA.utf8: zu_ZA.UTF-8 +# The following locale names are used in SCO 3.0 +english_uk.8859: en_GB.ISO8859-1 +english_us.8859: en_US.ISO8859-1 +english_us.ascii: en_US.ISO8859-1 +french_france.8859: fr_FR.ISO8859-1 +german_germany.8859: de_DE.ISO8859-1 +portuguese_brazil.8859: pt_BR.ISO8859-1 +spanish_spain.8859: es_ES.ISO8859-1 +# The following locale names are used in HPUX 9.x +american.iso88591: en_US.ISO8859-1 +arabic.iso88596: ar_AA.ISO8859-6 +bokmal: nb_NO.ISO8859-1 +bokml: nb_NO.ISO8859-1 +bulgarian: bg_BG.CP1251 +c-french.iso88591: fr_CA.ISO8859-1 +catalan: ca_ES.ISO8859-1 +chinese-s: zh_CN.eucCN +chinese-t: zh_TW.eucTW +croatian: hr_HR.ISO8859-2 +czech: cs_CZ.ISO8859-2 +danish: da_DK.ISO8859-1 +dansk: da_DK.ISO8859-1 +danish.iso88591: da_DK.ISO8859-1 +deutsch: de_DE.ISO8859-1 +dutch: nl_NL.ISO8859-1 +dutch.iso88591: nl_BE.ISO8859-1 +eesti: et_EE.ISO8859-1 +english.iso88591: en_EN.ISO8859-1 +estonian: et_EE.ISO8859-1 +finnish: fi_FI.ISO8859-1 +finnish.iso88591: fi_FI.ISO8859-1 +franais: fr_FR.ISO8859-1 +french: fr_FR.ISO8859-1 +french.iso88591: fr_CH.ISO8859-1 +galego: gl_ES.ISO8859-1 +galician: gl_ES.ISO8859-1 +german: de_DE.ISO8859-1 +german.iso88591: de_CH.ISO8859-1 +greek: el_GR.ISO8859-7 +greek.iso88597: el_GR.ISO8859-7 +hebrew: he_IL.ISO8859-8 +hebrew.iso88598: he_IL.ISO8859-8 +hrvatski: hr_HR.ISO8859-2 +hungarian: hu_HU.ISO8859-2 +icelandic.iso88591: is_IS.ISO8859-1 +icelandic: is_IS.ISO8859-1 +italian: it_IT.ISO8859-1 +italian.iso88591: it_IT.ISO8859-1 +japanese: ja_JP.eucJP +japanese.euc: ja_JP.eucJP +japanese.sjis: ja_JP.SJIS +korean: ko_KR.eucKR +korean.euc: ko_KR.eucKR +lithuanian: lt_LT.ISO8859-13 +norwegian: no_NO.ISO8859-1 +norwegian.iso88591: no_NO.ISO8859-1 +polish: pl_PL.ISO8859-2 +portuguese: pt_PT.ISO8859-1 +portuguese.iso88591: pt_PT.ISO8859-1 +romanian: ro_RO.ISO8859-2 +rumanian: ro_RO.ISO8859-2 +russian: ru_RU.ISO8859-5 +serbocroatian: sr_RS.UTF-8@latin +sinhala: si_LK.UTF-8 +slovak: sk_SK.ISO8859-2 +slovene: sl_SI.ISO8859-2 +slovenian: sl_SI.ISO8859-2 +spanish: es_ES.ISO8859-1 +spanish.iso88591: es_ES.ISO8859-1 +swedish: sv_SE.ISO8859-1 +swedish.iso88591: sv_SE.ISO8859-1 +turkish: tr_TR.ISO8859-9 +turkish.iso88599: tr_TR.ISO8859-9 +thai: th_TH.ISO8859-11 +univ.utf8: en_US.UTF-8 +# Digital Unix utf +universal.utf8@ucs4: en_US.UTF-8 +# Solaris and SunOS have iso_8859_1 and iso_8859_15 LC_CTYPES +# to augment LANG=C +iso_8859_1: en_US.ISO8859-1 +iso_8859_15: en_US.ISO8859-15 +# Other miscellaneous locale names +ISO8859-1: en_US.ISO8859-1 +ISO-8859-1: en_US.ISO8859-1 +japan: ja_JP.eucJP +Japanese-EUC: ja_JP.eucJP diff --git a/test/data/locale/locale.dir b/test/data/locale/locale.dir new file mode 100644 index 0000000..8bdaf5f --- /dev/null +++ b/test/data/locale/locale.dir @@ -0,0 +1,948 @@ +# +# This file contains locale database file names +# The first word is the locale database file name and +# the second word is the full locale name. +# +# +C/XLC_LOCALE C +iso8859-1/XLC_LOCALE af_ZA.ISO8859-1 +iso8859-6/XLC_LOCALE ar_AA.ISO8859-6 +iso8859-6/XLC_LOCALE ar_BH.ISO8859-6 +iso8859-6/XLC_LOCALE ar_DZ.ISO8859-6 +iso8859-6/XLC_LOCALE ar_EG.ISO8859-6 +iso8859-6/XLC_LOCALE ar_IQ.ISO8859-6 +iso8859-6/XLC_LOCALE ar_JO.ISO8859-6 +iso8859-6/XLC_LOCALE ar_KW.ISO8859-6 +iso8859-6/XLC_LOCALE ar_LB.ISO8859-6 +iso8859-6/XLC_LOCALE ar_LY.ISO8859-6 +iso8859-6/XLC_LOCALE ar_MA.ISO8859-6 +iso8859-6/XLC_LOCALE ar_OM.ISO8859-6 +iso8859-6/XLC_LOCALE ar_QA.ISO8859-6 +iso8859-6/XLC_LOCALE ar_SA.ISO8859-6 +iso8859-6/XLC_LOCALE ar_SD.ISO8859-6 +iso8859-6/XLC_LOCALE ar_SY.ISO8859-6 +iso8859-6/XLC_LOCALE ar_TN.ISO8859-6 +iso8859-6/XLC_LOCALE ar_YE.ISO8859-6 +iso8859-6/XLC_LOCALE ar_AE.ISO8859-6 +iso8859-9e/XLC_LOCALE az_AZ.ISO8859-9E +koi8-c/XLC_LOCALE az_AZ.KOI8-C +iso8859-5/XLC_LOCALE be_BY.ISO8859-5 +microsoft-cp1251/XLC_LOCALE be_BY.CP1251 +iso8859-5/XLC_LOCALE bg_BG.ISO8859-5 +microsoft-cp1251/XLC_LOCALE bg_BG.CP1251 +koi8-r/XLC_LOCALE bg_BG.KOI8-R +iso8859-2/XLC_LOCALE bs_BA.ISO8859-2 +iso8859-1/XLC_LOCALE br_FR.ISO8859-1 +iso8859-14/XLC_LOCALE br_FR.ISO8859-14 +iso8859-15/XLC_LOCALE br_FR.ISO8859-15 +iso8859-1/XLC_LOCALE ca_AD.ISO8859-1 +iso8859-15/XLC_LOCALE ca_AD.ISO8859-15 +iso8859-1/XLC_LOCALE ca_ES.ISO8859-1 +iso8859-15/XLC_LOCALE ca_ES.ISO8859-15 +iso8859-1/XLC_LOCALE ca_FR.ISO8859-1 +iso8859-15/XLC_LOCALE ca_FR.ISO8859-15 +iso8859-1/XLC_LOCALE ca_IT.ISO8859-1 +iso8859-15/XLC_LOCALE ca_IT.ISO8859-15 +iso8859-2/XLC_LOCALE cs_CZ.ISO8859-2 +iso8859-1/XLC_LOCALE cy_GB.ISO8859-1 +iso8859-14/XLC_LOCALE cy_GB.ISO8859-14 +iso8859-15/XLC_LOCALE cy_GB.ISO8859-15 +iso8859-1/XLC_LOCALE da_DK.ISO8859-1 +iso8859-15/XLC_LOCALE da_DK.ISO8859-15 +iso8859-1/XLC_LOCALE de_AT.ISO8859-1 +iso8859-15/XLC_LOCALE de_AT.ISO8859-15 +iso8859-1/XLC_LOCALE de_BE.ISO8859-1 +iso8859-15/XLC_LOCALE de_BE.ISO8859-15 +iso8859-1/XLC_LOCALE de_CH.ISO8859-1 +iso8859-15/XLC_LOCALE de_CH.ISO8859-15 +iso8859-1/XLC_LOCALE de_DE.ISO8859-1 +iso8859-15/XLC_LOCALE de_DE.ISO8859-15 +iso8859-1/XLC_LOCALE de_LI.ISO8859-1 +iso8859-15/XLC_LOCALE de_LI.ISO8859-15 +iso8859-1/XLC_LOCALE de_LU.ISO8859-1 +iso8859-15/XLC_LOCALE de_LU.ISO8859-15 +iso8859-7/XLC_LOCALE el_GR.ISO8859-7 +iso8859-4/XLC_LOCALE ee_EE.ISO8859-4 +iso8859-15/XLC_LOCALE el_GR.ISO8859-15 +iso8859-1/XLC_LOCALE en_AU.ISO8859-1 +iso8859-1/XLC_LOCALE en_BE.ISO8859-1 +iso8859-15/XLC_LOCALE en_BE.ISO8859-15 +iso8859-1/XLC_LOCALE en_BZ.ISO8859-1 +iso8859-1/XLC_LOCALE en_BW.ISO8859-1 +iso8859-1/XLC_LOCALE en_CA.ISO8859-1 +iso8859-1/XLC_LOCALE en_EN.ISO8859-1 +iso8859-1/XLC_LOCALE en_GB.ISO8859-1 +iso8859-15/XLC_LOCALE en_GB.ISO8859-15 +iso8859-1/XLC_LOCALE en_HK.ISO8859-1 +iso8859-1/XLC_LOCALE en_IE.ISO8859-1 +iso8859-15/XLC_LOCALE en_IE.ISO8859-15 +iso8859-15/XLC_LOCALE en_IN.ISO8859-15 +iso8859-1/XLC_LOCALE en_JM.ISO8859-1 +iso8859-1/XLC_LOCALE en_NZ.ISO8859-1 +iso8859-1/XLC_LOCALE en_PH.ISO8859-1 +iso8859-1/XLC_LOCALE en_SG.ISO8859-1 +iso8859-1/XLC_LOCALE en_TT.ISO8859-1 +iso8859-1/XLC_LOCALE en_UK.ISO8859-1 +iso8859-15/XLC_LOCALE en_UK.ISO8859-15 +iso8859-1/XLC_LOCALE en_US.ISO8859-1 +iso8859-15/XLC_LOCALE en_US.ISO8859-15 +iso8859-1/XLC_LOCALE en_ZA.ISO8859-1 +iso8859-15/XLC_LOCALE en_ZA.ISO8859-15 +iso8859-1/XLC_LOCALE en_ZW.ISO8859-1 +iso8859-3/XLC_LOCALE eo_EO.ISO8859-3 +iso8859-3/XLC_LOCALE eo_XX.ISO8859-3 +iso8859-1/XLC_LOCALE es_AR.ISO8859-1 +iso8859-1/XLC_LOCALE es_BO.ISO8859-1 +iso8859-1/XLC_LOCALE es_CL.ISO8859-1 +iso8859-1/XLC_LOCALE es_CO.ISO8859-1 +iso8859-1/XLC_LOCALE es_CR.ISO8859-1 +iso8859-1/XLC_LOCALE es_DO.ISO8859-1 +iso8859-1/XLC_LOCALE es_EC.ISO8859-1 +iso8859-1/XLC_LOCALE es_ES.ISO8859-1 +iso8859-15/XLC_LOCALE es_ES.ISO8859-15 +iso8859-1/XLC_LOCALE es_GT.ISO8859-1 +iso8859-1/XLC_LOCALE es_HN.ISO8859-1 +iso8859-1/XLC_LOCALE es_MX.ISO8859-1 +iso8859-1/XLC_LOCALE es_NI.ISO8859-1 +iso8859-1/XLC_LOCALE es_PA.ISO8859-1 +iso8859-15/XLC_LOCALE es_PA.ISO8859-15 +iso8859-1/XLC_LOCALE es_PE.ISO8859-1 +iso8859-15/XLC_LOCALE es_PE.ISO8859-15 +iso8859-1/XLC_LOCALE es_PR.ISO8859-1 +iso8859-1/XLC_LOCALE es_PY.ISO8859-1 +iso8859-15/XLC_LOCALE es_PY.ISO8859-15 +iso8859-1/XLC_LOCALE es_SV.ISO8859-1 +iso8859-15/XLC_LOCALE es_SV.ISO8859-15 +iso8859-1/XLC_LOCALE es_US.ISO8859-1 +iso8859-1/XLC_LOCALE es_UY.ISO8859-1 +iso8859-15/XLC_LOCALE es_UY.ISO8859-15 +iso8859-1/XLC_LOCALE es_VE.ISO8859-1 +iso8859-15/XLC_LOCALE es_VE.ISO8859-15 +iso8859-1/XLC_LOCALE et_EE.ISO8859-1 +iso8859-4/XLC_LOCALE et_EE.ISO8859-4 +iso8859-13/XLC_LOCALE et_EE.ISO8859-13 +iso8859-15/XLC_LOCALE et_EE.ISO8859-15 +iso8859-1/XLC_LOCALE eu_ES.ISO8859-1 +iso8859-15/XLC_LOCALE eu_ES.ISO8859-15 +isiri-3342/XLC_LOCALE fa_IR.ISIRI-3342 +iso8859-1/XLC_LOCALE fi_FI.ISO8859-1 +iso8859-15/XLC_LOCALE fi_FI.ISO8859-15 +iso8859-1/XLC_LOCALE fo_FO.ISO8859-1 +iso8859-15/XLC_LOCALE fo_FO.ISO8859-15 +iso8859-1/XLC_LOCALE fr_BE.ISO8859-1 +iso8859-15/XLC_LOCALE fr_BE.ISO8859-15 +iso8859-1/XLC_LOCALE fr_CA.ISO8859-1 +iso8859-15/XLC_LOCALE fr_CA.ISO8859-15 +iso8859-1/XLC_LOCALE fr_CH.ISO8859-1 +iso8859-15/XLC_LOCALE fr_CH.ISO8859-15 +iso8859-1/XLC_LOCALE fr_FR.ISO8859-1 +iso8859-15/XLC_LOCALE fr_FR.ISO8859-15 +iso8859-1/XLC_LOCALE fr_LU.ISO8859-1 +iso8859-15/XLC_LOCALE fr_LU.ISO8859-15 +iso8859-1/XLC_LOCALE ga_IE.ISO8859-1 +iso8859-14/XLC_LOCALE ga_IE.ISO8859-14 +iso8859-15/XLC_LOCALE ga_IE.ISO8859-15 +iso8859-1/XLC_LOCALE gd_GB.ISO8859-1 +iso8859-14/XLC_LOCALE gd_GB.ISO8859-14 +iso8859-15/XLC_LOCALE gd_GB.ISO8859-15 +iso8859-1/XLC_LOCALE gl_ES.ISO8859-1 +iso8859-15/XLC_LOCALE gl_ES.ISO8859-15 +iso8859-1/XLC_LOCALE gv_GB.ISO8859-1 +iso8859-14/XLC_LOCALE gv_GB.ISO8859-14 +iso8859-15/XLC_LOCALE gv_GB.ISO8859-15 +iso8859-8/XLC_LOCALE he_IL.ISO8859-8 +microsoft-cp1255/XLC_LOCALE he_IL.CP1255 +iscii-dev/XLC_LOCALE hi_IN.ISCII-DEV +iso8859-2/XLC_LOCALE hr_HR.ISO8859-2 +iso8859-2/XLC_LOCALE hu_HU.ISO8859-2 +armscii-8/XLC_LOCALE hy_AM.ARMSCII-8 +iso8859-1/XLC_LOCALE id_ID.ISO8859-1 +iso8859-1/XLC_LOCALE id_ID.ISO8859-15 +iso8859-1/XLC_LOCALE is_IS.ISO8859-1 +iso8859-15/XLC_LOCALE is_IS.ISO8859-15 +iso8859-1/XLC_LOCALE it_CH.ISO8859-1 +iso8859-15/XLC_LOCALE it_CH.ISO8859-15 +iso8859-1/XLC_LOCALE it_IT.ISO8859-1 +iso8859-15/XLC_LOCALE it_IT.ISO8859-15 +ja/XLC_LOCALE ja_JP.eucJP +ja.SJIS/XLC_LOCALE ja_JP.SJIS +ja.JIS/XLC_LOCALE ja_JP.JIS7 +georgian-academy/XLC_LOCALE ka_GE.GEORGIAN-ACADEMY +georgian-ps/XLC_LOCALE ka_GE.GEORGIAN-PS +iso8859-1/XLC_LOCALE kl_GL.ISO8859-1 +iso8859-15/XLC_LOCALE kl_GL.ISO8859-15 +ko/XLC_LOCALE ko_KR.eucKR +iso8859-1/XLC_LOCALE kw_GB.ISO8859-1 +iso8859-14/XLC_LOCALE kw_GB.ISO8859-14 +iso8859-15/XLC_LOCALE kw_GB.ISO8859-15 +ibm-cp1133/XLC_LOCALE lo_LA.IBM-CP1133 +mulelao-1/XLC_LOCALE lo_LA.MULELAO-1 +iso8859-4/XLC_LOCALE lt_LT.ISO8859-4 +iso8859-13/XLC_LOCALE lt_LT.ISO8859-13 +iso8859-4/XLC_LOCALE lv_LV.ISO8859-4 +iso8859-13/XLC_LOCALE lv_LV.ISO8859-13 +iso8859-13/XLC_LOCALE mi_NZ.ISO8859-13 +iso8859-5/XLC_LOCALE mk_MK.ISO8859-5 +microsoft-cp1251/XLC_LOCALE mk_MK.CP1251 +iso8859-1/XLC_LOCALE ms_MY.ISO8859-1 +iso8859-3/XLC_LOCALE mt_MT.ISO8859-3 +iso8859-1/XLC_LOCALE nb_NO.ISO8859-1 +iso8859-1/XLC_LOCALE nb_NO.ISO8859-15 +iso8859-1/XLC_LOCALE nl_BE.ISO8859-1 +iso8859-15/XLC_LOCALE nl_BE.ISO8859-15 +iso8859-1/XLC_LOCALE nl_NL.ISO8859-1 +iso8859-15/XLC_LOCALE nl_NL.ISO8859-15 +iso8859-1/XLC_LOCALE nn_NO.ISO8859-1 +iso8859-1/XLC_LOCALE nn_NO.ISO8859-15 +iso8859-1/XLC_LOCALE no_NO.ISO8859-1 +iso8859-1/XLC_LOCALE no_NO.ISO8859-15 +iso8859-1/XLC_LOCALE nr_ZA.ISO8859-1 +iso8859-15/XLC_LOCALE nso_ZA.ISO8859-15 +iso8859-1/XLC_LOCALE ny_NO.ISO8859-1 +iso8859-1/XLC_LOCALE ny_NO.ISO8859-15 +iso8859-1/XLC_LOCALE oc_FR.ISO8859-1 +iso8859-15/XLC_LOCALE oc_FR.ISO8859-15 +iso8859-1/XLC_LOCALE pd_DE.ISO8859-1 +iso8859-15/XLC_LOCALE pd_DE.ISO8859-15 +iso8859-1/XLC_LOCALE pd_US.ISO8859-1 +iso8859-15/XLC_LOCALE pd_US.ISO8859-15 +iso8859-1/XLC_LOCALE ph_PH.ISO8859-1 +iso8859-2/XLC_LOCALE pl_PL.ISO8859-2 +iso8859-1/XLC_LOCALE pp_AN.ISO8859-1 +iso8859-1/XLC_LOCALE pt_BR.ISO8859-1 +iso8859-15/XLC_LOCALE pt_BR.ISO8859-15 +iso8859-1/XLC_LOCALE pt_PT.ISO8859-1 +iso8859-15/XLC_LOCALE pt_PT.ISO8859-15 +iso8859-2/XLC_LOCALE ro_RO.ISO8859-2 +iso8859-5/XLC_LOCALE ru_RU.ISO8859-5 +microsoft-cp1251/XLC_LOCALE ru_RU.CP1251 +koi8-r/XLC_LOCALE ru_RU.KOI8-R +microsoft-cp1251/XLC_LOCALE ru_UA.CP1251 +koi8-u/XLC_LOCALE ru_UA.KOI8-U +iso8859-1/XLC_LOCALE rw_RW.ISO8859-1 +iso8859-2/XLC_LOCALE sh_YU.ISO8859-2 +iso8859-2/XLC_LOCALE sk_SK.ISO8859-2 +iso8859-2/XLC_LOCALE sl_SI.ISO8859-2 +iso8859-2/XLC_LOCALE sq_AL.ISO8859-2 +iso8859-2/XLC_LOCALE sr_YU.ISO8859-2 +iso8859-5/XLC_LOCALE sr_YU.ISO8859-5 +microsoft-cp1251/XLC_LOCALE sr_YU.CP1251 +iso8859-1/XLC_LOCALE ss_ZA.ISO8859-1 +iso8859-1/XLC_LOCALE st_ZA.ISO8859-1 +iso8859-1/XLC_LOCALE sv_FI.ISO8859-1 +iso8859-15/XLC_LOCALE sv_FI.ISO8859-15 +iso8859-1/XLC_LOCALE sv_SE.ISO8859-1 +iso8859-15/XLC_LOCALE sv_SE.ISO8859-15 +tscii-0/XLC_LOCALE ta_IN.TSCII-0 +koi8-c/XLC_LOCALE tg_TJ.KOI8-C +th_TH/XLC_LOCALE th_TH.TIS620 +iso8859-11/XLC_LOCALE th_TH.ISO8859-11 +iso8859-1/XLC_LOCALE tl_PH.ISO8859-1 +iso8859-15/XLC_LOCALE tn_ZA.ISO8859-15 +iso8859-9/XLC_LOCALE tr_TR.ISO8859-9 +iso8859-1/XLC_LOCALE ts_ZA.ISO8859-1 +tatar-cyr/XLC_LOCALE tt_RU.TATAR-CYR +koi8-c/XLC_LOCALE tt_RU.KOI8-C +iso8859-5/XLC_LOCALE uk_UA.ISO8859-5 +microsoft-cp1251/XLC_LOCALE uk_UA.CP1251 +koi8-u/XLC_LOCALE uk_UA.KOI8-U +microsoft-cp1256/XLC_LOCALE ur_PK.CP1256 +iso8859-1/XLC_LOCALE uz_UZ.ISO8859-1 +vi_VN.tcvn/XLC_LOCALE vi_VN.TCVN +vi_VN.viscii/XLC_LOCALE vi_VN.VISCII +iso8859-1/XLC_LOCALE wa_BE.ISO8859-1 +iso8859-15/XLC_LOCALE wa_BE.ISO8859-15 +iso8859-1/XLC_LOCALE xh_ZA.ISO8859-1 +microsoft-cp1255/XLC_LOCALE yi_US.CP1255 +zh_CN/XLC_LOCALE zh_CN.eucCN +zh_CN/XLC_LOCALE zh_CN.gb2312 +zh_CN.gbk/XLC_LOCALE zh_CN.gbk +zh_CN.gb18030/XLC_LOCALE zh_CN.gb18030 +zh_HK.big5/XLC_LOCALE zh_HK.big5 +zh_HK.big5hkscs/XLC_LOCALE zh_HK.big5hkscs +zh_TW.big5/XLC_LOCALE zh_TW.big5 +zh_TW/XLC_LOCALE zh_TW.eucTW +iso8859-1/XLC_LOCALE zu_ZA.ISO8859-1 +# Note: The UTF-8 locales don't work correctly yet. Work in progress. +en_US.UTF-8/XLC_LOCALE af_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE am_ET.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_AA.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_AE.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_BH.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_DZ.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_EG.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_IQ.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_JO.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_KW.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_LB.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_LY.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_MA.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_OM.UTF-8 +en_US.UTF-8/XLC_LOCALE bs_BA.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_QA.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_SA.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_SD.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_SY.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_TN.UTF-8 +en_US.UTF-8/XLC_LOCALE ar_YE.UTF-8 +en_US.UTF-8/XLC_LOCALE as_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE ast_ES.UTF-8 +en_US.UTF-8/XLC_LOCALE az_AZ.UTF-8 +en_US.UTF-8/XLC_LOCALE be_BY.UTF-8 +en_US.UTF-8/XLC_LOCALE be_BY.UTF-8@latin +en_US.UTF-8/XLC_LOCALE bg_BG.UTF-8 +en_US.UTF-8/XLC_LOCALE bn_BD.UTF-8 +en_US.UTF-8/XLC_LOCALE bn_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE bo_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE br_FR.UTF-8 +en_US.UTF-8/XLC_LOCALE ca_AD.UTF-8 +en_US.UTF-8/XLC_LOCALE ca_ES.UTF-8 +en_US.UTF-8/XLC_LOCALE ca_FR.UTF-8 +en_US.UTF-8/XLC_LOCALE ca_IT.UTF-8 +en_US.UTF-8/XLC_LOCALE cs_CZ.UTF-8 +en_US.UTF-8/XLC_LOCALE cy_GB.UTF-8 +en_US.UTF-8/XLC_LOCALE da_DK.UTF-8 +en_US.UTF-8/XLC_LOCALE de_AT.UTF-8 +en_US.UTF-8/XLC_LOCALE de_BE.UTF-8 +en_US.UTF-8/XLC_LOCALE de_CH.UTF-8 +en_US.UTF-8/XLC_LOCALE de_DE.UTF-8 +en_US.UTF-8/XLC_LOCALE de_IT.UTF-8 +en_US.UTF-8/XLC_LOCALE de_LI.UTF-8 +en_US.UTF-8/XLC_LOCALE de_LU.UTF-8 +en_US.UTF-8/XLC_LOCALE el_CY.UTF-8 +en_US.UTF-8/XLC_LOCALE el_GR.UTF-8 +en_US.UTF-8/XLC_LOCALE en_AU.UTF-8 +en_US.UTF-8/XLC_LOCALE en_BE.UTF-8 +en_US.UTF-8/XLC_LOCALE en_BW.UTF-8 +en_US.UTF-8/XLC_LOCALE en_BZ.UTF-8 +en_US.UTF-8/XLC_LOCALE en_CA.UTF-8 +en_US.UTF-8/XLC_LOCALE en_DK.UTF-8 +en_US.UTF-8/XLC_LOCALE en_GB.UTF-8 +en_US.UTF-8/XLC_LOCALE en_EN.UTF-8 +en_US.UTF-8/XLC_LOCALE en_HK.UTF-8 +en_US.UTF-8/XLC_LOCALE en_IE.UTF-8 +en_US.UTF-8/XLC_LOCALE en_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE en_JM.UTF-8 +en_US.UTF-8/XLC_LOCALE en_MT.UTF-8 +en_US.UTF-8/XLC_LOCALE en_NZ.UTF-8 +en_US.UTF-8/XLC_LOCALE en_PH.UTF-8 +en_US.UTF-8/XLC_LOCALE en_SG.UTF-8 +en_US.UTF-8/XLC_LOCALE en_TT.UTF-8 +en_US.UTF-8/XLC_LOCALE en_UK.UTF-8 +en_US.UTF-8/XLC_LOCALE en_US.UTF-8 +en_US.UTF-8/XLC_LOCALE en_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE en_ZW.UTF-8 +en_US.UTF-8/XLC_LOCALE eo_EO.UTF-8 +en_US.UTF-8/XLC_LOCALE eo_XX.UTF-8 +en_US.UTF-8/XLC_LOCALE es_AR.UTF-8 +en_US.UTF-8/XLC_LOCALE es_BO.UTF-8 +en_US.UTF-8/XLC_LOCALE es_CL.UTF-8 +en_US.UTF-8/XLC_LOCALE es_CO.UTF-8 +en_US.UTF-8/XLC_LOCALE es_CR.UTF-8 +en_US.UTF-8/XLC_LOCALE es_DO.UTF-8 +en_US.UTF-8/XLC_LOCALE es_EC.UTF-8 +en_US.UTF-8/XLC_LOCALE es_ES.UTF-8 +en_US.UTF-8/XLC_LOCALE es_GT.UTF-8 +en_US.UTF-8/XLC_LOCALE es_HN.UTF-8 +en_US.UTF-8/XLC_LOCALE es_MX.UTF-8 +en_US.UTF-8/XLC_LOCALE es_NI.UTF-8 +en_US.UTF-8/XLC_LOCALE es_PA.UTF-8 +en_US.UTF-8/XLC_LOCALE es_PE.UTF-8 +en_US.UTF-8/XLC_LOCALE es_PR.UTF-8 +en_US.UTF-8/XLC_LOCALE es_PY.UTF-8 +en_US.UTF-8/XLC_LOCALE es_SV.UTF-8 +en_US.UTF-8/XLC_LOCALE es_US.UTF-8 +en_US.UTF-8/XLC_LOCALE es_UY.UTF-8 +en_US.UTF-8/XLC_LOCALE es_VE.UTF-8 +en_US.UTF-8/XLC_LOCALE et_EE.UTF-8 +en_US.UTF-8/XLC_LOCALE eu_ES.UTF-8 +en_US.UTF-8/XLC_LOCALE fa_IR.UTF-8 +en_US.UTF-8/XLC_LOCALE fi_FI.UTF-8 +en_US.UTF-8/XLC_LOCALE fo_FO.UTF-8 +en_US.UTF-8/XLC_LOCALE fr_BE.UTF-8 +en_US.UTF-8/XLC_LOCALE fr_CA.UTF-8 +en_US.UTF-8/XLC_LOCALE fr_CH.UTF-8 +en_US.UTF-8/XLC_LOCALE fr_FR.UTF-8 +en_US.UTF-8/XLC_LOCALE fr_LU.UTF-8 +en_US.UTF-8/XLC_LOCALE ga_IE.UTF-8 +en_US.UTF-8/XLC_LOCALE gd_GB.UTF-8 +en_US.UTF-8/XLC_LOCALE gl_ES.UTF-8 +en_US.UTF-8/XLC_LOCALE gu_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE gv_GB.UTF-8 +en_US.UTF-8/XLC_LOCALE he_IL.UTF-8 +en_US.UTF-8/XLC_LOCALE hi_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE hne_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE hr_HR.UTF-8 +en_US.UTF-8/XLC_LOCALE hu_HU.UTF-8 +en_US.UTF-8/XLC_LOCALE hy_AM.UTF-8 +en_US.UTF-8/XLC_LOCALE ia.UTF-8 +en_US.UTF-8/XLC_LOCALE id_ID.UTF-8 +en_US.UTF-8/XLC_LOCALE ie.UTF-8 +en_US.UTF-8/XLC_LOCALE is_IS.UTF-8 +en_US.UTF-8/XLC_LOCALE it_CH.UTF-8 +en_US.UTF-8/XLC_LOCALE it_IT.UTF-8 +en_US.UTF-8/XLC_LOCALE iu_CA.UTF-8 +ja_JP.UTF-8/XLC_LOCALE ja_JP.UTF-8 +en_US.UTF-8/XLC_LOCALE ka_GE.UTF-8 +en_US.UTF-8/XLC_LOCALE kk_KZ.UTF-8 +en_US.UTF-8/XLC_LOCALE kl_GL.UTF-8 +en_US.UTF-8/XLC_LOCALE km_KH.UTF-8 +en_US.UTF-8/XLC_LOCALE kn_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE ks_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE ks_IN.UTF-8@devanagari +ko_KR.UTF-8/XLC_LOCALE ko_KR.UTF-8 +en_US.UTF-8/XLC_LOCALE ku_TR.UTF-8 +en_US.UTF-8/XLC_LOCALE kw_GB.UTF-8 +en_US.UTF-8/XLC_LOCALE ky_KG.UTF-8 +en_US.UTF-8/XLC_LOCALE lo_LA.UTF-8 +en_US.UTF-8/XLC_LOCALE lt_LT.UTF-8 +en_US.UTF-8/XLC_LOCALE lv_LV.UTF-8 +en_US.UTF-8/XLC_LOCALE mai_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE mi_NZ.UTF-8 +en_US.UTF-8/XLC_LOCALE mk_MK.UTF-8 +en_US.UTF-8/XLC_LOCALE ml_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE mr_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE ms_MY.UTF-8 +en_US.UTF-8/XLC_LOCALE mt_MT.UTF-8 +en_US.UTF-8/XLC_LOCALE nl_BE.UTF-8 +en_US.UTF-8/XLC_LOCALE nl_NL.UTF-8 +en_US.UTF-8/XLC_LOCALE nb_NO.UTF-8 +en_US.UTF-8/XLC_LOCALE nn_NO.UTF-8 +en_US.UTF-8/XLC_LOCALE no_NO.UTF-8 +en_US.UTF-8/XLC_LOCALE nr_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE nso_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE ny_NO.UTF-8 +en_US.UTF-8/XLC_LOCALE oc_FR.UTF-8 +en_US.UTF-8/XLC_LOCALE or_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE pa_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE pa_PK.UTF-8 +en_US.UTF-8/XLC_LOCALE pd_DE.UTF-8 +en_US.UTF-8/XLC_LOCALE pd_US.UTF-8 +en_US.UTF-8/XLC_LOCALE ph_PH.UTF-8 +en_US.UTF-8/XLC_LOCALE pl_PL.UTF-8 +en_US.UTF-8/XLC_LOCALE pp_AN.UTF-8 +pt_BR.UTF-8/XLC_LOCALE pt_BR.UTF-8 +pt_PT.UTF-8/XLC_LOCALE pt_PT.UTF-8 +en_US.UTF-8/XLC_LOCALE ro_RO.UTF-8 +ru_RU.UTF-8/XLC_LOCALE ru_RU.UTF-8 +en_US.UTF-8/XLC_LOCALE ru_UA.UTF-8 +en_US.UTF-8/XLC_LOCALE rw_RW.UTF-8 +en_US.UTF-8/XLC_LOCALE sa_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE sd_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE sd_IN.UTF-8@devanagari +en_US.UTF-8/XLC_LOCALE se_NO.UTF-8 +en_US.UTF-8/XLC_LOCALE sh_BA.UTF-8 +en_US.UTF-8/XLC_LOCALE sh_YU.UTF-8 +en_US.UTF-8/XLC_LOCALE si_LK.UTF-8 +en_US.UTF-8/XLC_LOCALE sk_SK.UTF-8 +en_US.UTF-8/XLC_LOCALE sl_SI.UTF-8 +en_US.UTF-8/XLC_LOCALE sq_AL.UTF-8 +en_US.UTF-8/XLC_LOCALE sr_ME.UTF-8 +en_US.UTF-8/XLC_LOCALE sr_RS.UTF-8 +en_US.UTF-8/XLC_LOCALE sr_RS.UTF-8@latin +en_US.UTF-8/XLC_LOCALE sr_YU.UTF-8 +en_US.UTF-8/XLC_LOCALE ss_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE st_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE sv_FI.UTF-8 +en_US.UTF-8/XLC_LOCALE sv_SE.UTF-8 +en_US.UTF-8/XLC_LOCALE ta_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE te_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE tg_TJ.UTF-8 +th_TH.UTF-8/XLC_LOCALE th_TH.UTF-8 +en_US.UTF-8/XLC_LOCALE ti_ER.UTF-8 +en_US.UTF-8/XLC_LOCALE ti_ET.UTF-8 +en_US.UTF-8/XLC_LOCALE tl_PH.UTF-8 +en_US.UTF-8/XLC_LOCALE tn_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE tr_TR.UTF-8 +en_US.UTF-8/XLC_LOCALE ts_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE tt_RU.UTF-8 +en_US.UTF-8/XLC_LOCALE uk_UA.UTF-8 +en_US.UTF-8/XLC_LOCALE ur_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE ur_PK.UTF-8 +en_US.UTF-8/XLC_LOCALE uz_UZ.UTF-8 +en_US.UTF-8/XLC_LOCALE ve_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE vi_VN.UTF-8 +en_US.UTF-8/XLC_LOCALE wa_BE.UTF-8 +en_US.UTF-8/XLC_LOCALE xh_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE yi_US.UTF-8 +en_US.UTF-8/XLC_LOCALE ne_NP.UTF-8 +zh_CN.UTF-8/XLC_LOCALE zh_CN.UTF-8 +zh_HK.UTF-8/XLC_LOCALE zh_HK.UTF-8 +zh_CN.UTF-8/XLC_LOCALE zh_SG.UTF-8 +zh_TW.UTF-8/XLC_LOCALE zh_TW.UTF-8 +en_US.UTF-8/XLC_LOCALE zu_ZA.UTF-8 +# +# This file contains locale database file names +# The first word is the locale database file name and +# the second word is the full locale name. +# +# +C/XLC_LOCALE: C +iso8859-1/XLC_LOCALE: af_ZA.ISO8859-1 +iso8859-6/XLC_LOCALE: ar_AA.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_BH.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_DZ.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_EG.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_IQ.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_JO.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_KW.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_LB.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_LY.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_MA.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_OM.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_QA.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_SA.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_SD.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_SY.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_TN.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_YE.ISO8859-6 +iso8859-6/XLC_LOCALE: ar_AE.ISO8859-6 +iso8859-9e/XLC_LOCALE: az_AZ.ISO8859-9E +koi8-c/XLC_LOCALE: az_AZ.KOI8-C +iso8859-5/XLC_LOCALE: be_BY.ISO8859-5 +microsoft-cp1251/XLC_LOCALE: be_BY.CP1251 +iso8859-5/XLC_LOCALE: bg_BG.ISO8859-5 +microsoft-cp1251/XLC_LOCALE: bg_BG.CP1251 +koi8-r/XLC_LOCALE: bg_BG.KOI8-R +iso8859-2/XLC_LOCALE: bs_BA.ISO8859-2 +iso8859-1/XLC_LOCALE: br_FR.ISO8859-1 +iso8859-14/XLC_LOCALE: br_FR.ISO8859-14 +iso8859-15/XLC_LOCALE: br_FR.ISO8859-15 +iso8859-1/XLC_LOCALE: ca_AD.ISO8859-1 +iso8859-15/XLC_LOCALE: ca_AD.ISO8859-15 +iso8859-1/XLC_LOCALE: ca_ES.ISO8859-1 +iso8859-15/XLC_LOCALE: ca_ES.ISO8859-15 +iso8859-1/XLC_LOCALE: ca_FR.ISO8859-1 +iso8859-15/XLC_LOCALE: ca_FR.ISO8859-15 +iso8859-1/XLC_LOCALE: ca_IT.ISO8859-1 +iso8859-15/XLC_LOCALE: ca_IT.ISO8859-15 +iso8859-2/XLC_LOCALE: cs_CZ.ISO8859-2 +iso8859-1/XLC_LOCALE: cy_GB.ISO8859-1 +iso8859-14/XLC_LOCALE: cy_GB.ISO8859-14 +iso8859-15/XLC_LOCALE: cy_GB.ISO8859-15 +iso8859-1/XLC_LOCALE: da_DK.ISO8859-1 +iso8859-15/XLC_LOCALE: da_DK.ISO8859-15 +iso8859-1/XLC_LOCALE: de_AT.ISO8859-1 +iso8859-15/XLC_LOCALE: de_AT.ISO8859-15 +iso8859-1/XLC_LOCALE: de_BE.ISO8859-1 +iso8859-15/XLC_LOCALE: de_BE.ISO8859-15 +iso8859-1/XLC_LOCALE: de_CH.ISO8859-1 +iso8859-15/XLC_LOCALE: de_CH.ISO8859-15 +iso8859-1/XLC_LOCALE: de_DE.ISO8859-1 +iso8859-15/XLC_LOCALE: de_DE.ISO8859-15 +iso8859-1/XLC_LOCALE: de_LI.ISO8859-1 +iso8859-15/XLC_LOCALE: de_LI.ISO8859-15 +iso8859-1/XLC_LOCALE: de_LU.ISO8859-1 +iso8859-15/XLC_LOCALE: de_LU.ISO8859-15 +iso8859-7/XLC_LOCALE: el_GR.ISO8859-7 +iso8859-4/XLC_LOCALE: ee_EE.ISO8859-4 +iso8859-15/XLC_LOCALE: el_GR.ISO8859-15 +iso8859-1/XLC_LOCALE: en_AU.ISO8859-1 +iso8859-1/XLC_LOCALE: en_BE.ISO8859-1 +iso8859-15/XLC_LOCALE: en_BE.ISO8859-15 +iso8859-1/XLC_LOCALE: en_BZ.ISO8859-1 +iso8859-1/XLC_LOCALE: en_BW.ISO8859-1 +iso8859-1/XLC_LOCALE: en_CA.ISO8859-1 +iso8859-1/XLC_LOCALE: en_EN.ISO8859-1 +iso8859-1/XLC_LOCALE: en_GB.ISO8859-1 +iso8859-15/XLC_LOCALE: en_GB.ISO8859-15 +iso8859-1/XLC_LOCALE: en_HK.ISO8859-1 +iso8859-1/XLC_LOCALE: en_IE.ISO8859-1 +iso8859-15/XLC_LOCALE: en_IE.ISO8859-15 +iso8859-15/XLC_LOCALE: en_IN.ISO8859-15 +iso8859-1/XLC_LOCALE: en_JM.ISO8859-1 +iso8859-1/XLC_LOCALE: en_NZ.ISO8859-1 +iso8859-1/XLC_LOCALE: en_PH.ISO8859-1 +iso8859-1/XLC_LOCALE: en_SG.ISO8859-1 +iso8859-1/XLC_LOCALE: en_TT.ISO8859-1 +iso8859-1/XLC_LOCALE: en_UK.ISO8859-1 +iso8859-15/XLC_LOCALE: en_UK.ISO8859-15 +iso8859-1/XLC_LOCALE: en_US.ISO8859-1 +iso8859-15/XLC_LOCALE: en_US.ISO8859-15 +iso8859-1/XLC_LOCALE: en_ZA.ISO8859-1 +iso8859-15/XLC_LOCALE: en_ZA.ISO8859-15 +iso8859-1/XLC_LOCALE: en_ZW.ISO8859-1 +iso8859-3/XLC_LOCALE: eo_EO.ISO8859-3 +iso8859-3/XLC_LOCALE: eo_XX.ISO8859-3 +iso8859-1/XLC_LOCALE: es_AR.ISO8859-1 +iso8859-1/XLC_LOCALE: es_BO.ISO8859-1 +iso8859-1/XLC_LOCALE: es_CL.ISO8859-1 +iso8859-1/XLC_LOCALE: es_CO.ISO8859-1 +iso8859-1/XLC_LOCALE: es_CR.ISO8859-1 +iso8859-1/XLC_LOCALE: es_DO.ISO8859-1 +iso8859-1/XLC_LOCALE: es_EC.ISO8859-1 +iso8859-1/XLC_LOCALE: es_ES.ISO8859-1 +iso8859-15/XLC_LOCALE: es_ES.ISO8859-15 +iso8859-1/XLC_LOCALE: es_GT.ISO8859-1 +iso8859-1/XLC_LOCALE: es_HN.ISO8859-1 +iso8859-1/XLC_LOCALE: es_MX.ISO8859-1 +iso8859-1/XLC_LOCALE: es_NI.ISO8859-1 +iso8859-1/XLC_LOCALE: es_PA.ISO8859-1 +iso8859-15/XLC_LOCALE: es_PA.ISO8859-15 +iso8859-1/XLC_LOCALE: es_PE.ISO8859-1 +iso8859-15/XLC_LOCALE: es_PE.ISO8859-15 +iso8859-1/XLC_LOCALE: es_PR.ISO8859-1 +iso8859-1/XLC_LOCALE: es_PY.ISO8859-1 +iso8859-15/XLC_LOCALE: es_PY.ISO8859-15 +iso8859-1/XLC_LOCALE: es_SV.ISO8859-1 +iso8859-15/XLC_LOCALE: es_SV.ISO8859-15 +iso8859-1/XLC_LOCALE: es_US.ISO8859-1 +iso8859-1/XLC_LOCALE: es_UY.ISO8859-1 +iso8859-15/XLC_LOCALE: es_UY.ISO8859-15 +iso8859-1/XLC_LOCALE: es_VE.ISO8859-1 +iso8859-15/XLC_LOCALE: es_VE.ISO8859-15 +iso8859-1/XLC_LOCALE: et_EE.ISO8859-1 +iso8859-4/XLC_LOCALE: et_EE.ISO8859-4 +iso8859-13/XLC_LOCALE: et_EE.ISO8859-13 +iso8859-15/XLC_LOCALE: et_EE.ISO8859-15 +iso8859-1/XLC_LOCALE: eu_ES.ISO8859-1 +iso8859-15/XLC_LOCALE: eu_ES.ISO8859-15 +isiri-3342/XLC_LOCALE: fa_IR.ISIRI-3342 +iso8859-1/XLC_LOCALE: fi_FI.ISO8859-1 +iso8859-15/XLC_LOCALE: fi_FI.ISO8859-15 +iso8859-1/XLC_LOCALE: fo_FO.ISO8859-1 +iso8859-15/XLC_LOCALE: fo_FO.ISO8859-15 +iso8859-1/XLC_LOCALE: fr_BE.ISO8859-1 +iso8859-15/XLC_LOCALE: fr_BE.ISO8859-15 +iso8859-1/XLC_LOCALE: fr_CA.ISO8859-1 +iso8859-15/XLC_LOCALE: fr_CA.ISO8859-15 +iso8859-1/XLC_LOCALE: fr_CH.ISO8859-1 +iso8859-15/XLC_LOCALE: fr_CH.ISO8859-15 +iso8859-1/XLC_LOCALE: fr_FR.ISO8859-1 +iso8859-15/XLC_LOCALE: fr_FR.ISO8859-15 +iso8859-1/XLC_LOCALE: fr_LU.ISO8859-1 +iso8859-15/XLC_LOCALE: fr_LU.ISO8859-15 +iso8859-1/XLC_LOCALE: ga_IE.ISO8859-1 +iso8859-14/XLC_LOCALE: ga_IE.ISO8859-14 +iso8859-15/XLC_LOCALE: ga_IE.ISO8859-15 +iso8859-1/XLC_LOCALE: gd_GB.ISO8859-1 +iso8859-14/XLC_LOCALE: gd_GB.ISO8859-14 +iso8859-15/XLC_LOCALE: gd_GB.ISO8859-15 +iso8859-1/XLC_LOCALE: gl_ES.ISO8859-1 +iso8859-15/XLC_LOCALE: gl_ES.ISO8859-15 +iso8859-1/XLC_LOCALE: gv_GB.ISO8859-1 +iso8859-14/XLC_LOCALE: gv_GB.ISO8859-14 +iso8859-15/XLC_LOCALE: gv_GB.ISO8859-15 +iso8859-8/XLC_LOCALE: he_IL.ISO8859-8 +microsoft-cp1255/XLC_LOCALE: he_IL.CP1255 +iscii-dev/XLC_LOCALE: hi_IN.ISCII-DEV +iso8859-2/XLC_LOCALE: hr_HR.ISO8859-2 +iso8859-2/XLC_LOCALE: hu_HU.ISO8859-2 +armscii-8/XLC_LOCALE: hy_AM.ARMSCII-8 +iso8859-1/XLC_LOCALE: id_ID.ISO8859-1 +iso8859-1/XLC_LOCALE: id_ID.ISO8859-15 +iso8859-1/XLC_LOCALE: is_IS.ISO8859-1 +iso8859-15/XLC_LOCALE: is_IS.ISO8859-15 +iso8859-1/XLC_LOCALE: it_CH.ISO8859-1 +iso8859-15/XLC_LOCALE: it_CH.ISO8859-15 +iso8859-1/XLC_LOCALE: it_IT.ISO8859-1 +iso8859-15/XLC_LOCALE: it_IT.ISO8859-15 +ja/XLC_LOCALE: ja_JP.eucJP +ja.SJIS/XLC_LOCALE: ja_JP.SJIS +ja.JIS/XLC_LOCALE: ja_JP.JIS7 +georgian-academy/XLC_LOCALE: ka_GE.GEORGIAN-ACADEMY +georgian-ps/XLC_LOCALE: ka_GE.GEORGIAN-PS +iso8859-1/XLC_LOCALE: kl_GL.ISO8859-1 +iso8859-15/XLC_LOCALE: kl_GL.ISO8859-15 +ko/XLC_LOCALE: ko_KR.eucKR +iso8859-1/XLC_LOCALE: kw_GB.ISO8859-1 +iso8859-14/XLC_LOCALE: kw_GB.ISO8859-14 +iso8859-15/XLC_LOCALE: kw_GB.ISO8859-15 +ibm-cp1133/XLC_LOCALE: lo_LA.IBM-CP1133 +mulelao-1/XLC_LOCALE: lo_LA.MULELAO-1 +iso8859-4/XLC_LOCALE: lt_LT.ISO8859-4 +iso8859-13/XLC_LOCALE: lt_LT.ISO8859-13 +iso8859-4/XLC_LOCALE: lv_LV.ISO8859-4 +iso8859-13/XLC_LOCALE: lv_LV.ISO8859-13 +iso8859-13/XLC_LOCALE: mi_NZ.ISO8859-13 +iso8859-5/XLC_LOCALE: mk_MK.ISO8859-5 +microsoft-cp1251/XLC_LOCALE: mk_MK.CP1251 +iso8859-1/XLC_LOCALE: ms_MY.ISO8859-1 +iso8859-3/XLC_LOCALE: mt_MT.ISO8859-3 +iso8859-1/XLC_LOCALE: nb_NO.ISO8859-1 +iso8859-1/XLC_LOCALE: nb_NO.ISO8859-15 +iso8859-1/XLC_LOCALE: nl_BE.ISO8859-1 +iso8859-15/XLC_LOCALE: nl_BE.ISO8859-15 +iso8859-1/XLC_LOCALE: nl_NL.ISO8859-1 +iso8859-15/XLC_LOCALE: nl_NL.ISO8859-15 +iso8859-1/XLC_LOCALE: nn_NO.ISO8859-1 +iso8859-1/XLC_LOCALE: nn_NO.ISO8859-15 +iso8859-1/XLC_LOCALE: no_NO.ISO8859-1 +iso8859-1/XLC_LOCALE: no_NO.ISO8859-15 +iso8859-1/XLC_LOCALE: nr_ZA.ISO8859-1 +iso8859-15/XLC_LOCALE: nso_ZA.ISO8859-15 +iso8859-1/XLC_LOCALE: ny_NO.ISO8859-1 +iso8859-1/XLC_LOCALE: ny_NO.ISO8859-15 +iso8859-1/XLC_LOCALE: oc_FR.ISO8859-1 +iso8859-15/XLC_LOCALE: oc_FR.ISO8859-15 +iso8859-1/XLC_LOCALE: pd_DE.ISO8859-1 +iso8859-15/XLC_LOCALE: pd_DE.ISO8859-15 +iso8859-1/XLC_LOCALE: pd_US.ISO8859-1 +iso8859-15/XLC_LOCALE: pd_US.ISO8859-15 +iso8859-1/XLC_LOCALE: ph_PH.ISO8859-1 +iso8859-2/XLC_LOCALE: pl_PL.ISO8859-2 +iso8859-1/XLC_LOCALE: pp_AN.ISO8859-1 +iso8859-1/XLC_LOCALE: pt_BR.ISO8859-1 +iso8859-15/XLC_LOCALE: pt_BR.ISO8859-15 +iso8859-1/XLC_LOCALE: pt_PT.ISO8859-1 +iso8859-15/XLC_LOCALE: pt_PT.ISO8859-15 +iso8859-2/XLC_LOCALE: ro_RO.ISO8859-2 +iso8859-5/XLC_LOCALE: ru_RU.ISO8859-5 +microsoft-cp1251/XLC_LOCALE: ru_RU.CP1251 +koi8-r/XLC_LOCALE: ru_RU.KOI8-R +microsoft-cp1251/XLC_LOCALE: ru_UA.CP1251 +koi8-u/XLC_LOCALE: ru_UA.KOI8-U +iso8859-1/XLC_LOCALE: rw_RW.ISO8859-1 +iso8859-2/XLC_LOCALE: sh_YU.ISO8859-2 +iso8859-2/XLC_LOCALE: sk_SK.ISO8859-2 +iso8859-2/XLC_LOCALE: sl_SI.ISO8859-2 +iso8859-2/XLC_LOCALE: sq_AL.ISO8859-2 +iso8859-2/XLC_LOCALE: sr_YU.ISO8859-2 +iso8859-5/XLC_LOCALE: sr_YU.ISO8859-5 +microsoft-cp1251/XLC_LOCALE: sr_YU.CP1251 +iso8859-1/XLC_LOCALE: ss_ZA.ISO8859-1 +iso8859-1/XLC_LOCALE: st_ZA.ISO8859-1 +iso8859-1/XLC_LOCALE: sv_FI.ISO8859-1 +iso8859-15/XLC_LOCALE: sv_FI.ISO8859-15 +iso8859-1/XLC_LOCALE: sv_SE.ISO8859-1 +iso8859-15/XLC_LOCALE: sv_SE.ISO8859-15 +tscii-0/XLC_LOCALE: ta_IN.TSCII-0 +koi8-c/XLC_LOCALE: tg_TJ.KOI8-C +th_TH/XLC_LOCALE: th_TH.TIS620 +iso8859-11/XLC_LOCALE: th_TH.ISO8859-11 +iso8859-1/XLC_LOCALE: tl_PH.ISO8859-1 +iso8859-15/XLC_LOCALE: tn_ZA.ISO8859-15 +iso8859-9/XLC_LOCALE: tr_TR.ISO8859-9 +iso8859-1/XLC_LOCALE: ts_ZA.ISO8859-1 +tatar-cyr/XLC_LOCALE: tt_RU.TATAR-CYR +koi8-c/XLC_LOCALE: tt_RU.KOI8-C +iso8859-5/XLC_LOCALE: uk_UA.ISO8859-5 +microsoft-cp1251/XLC_LOCALE: uk_UA.CP1251 +koi8-u/XLC_LOCALE: uk_UA.KOI8-U +microsoft-cp1256/XLC_LOCALE: ur_PK.CP1256 +iso8859-1/XLC_LOCALE: uz_UZ.ISO8859-1 +vi_VN.tcvn/XLC_LOCALE: vi_VN.TCVN +vi_VN.viscii/XLC_LOCALE: vi_VN.VISCII +iso8859-1/XLC_LOCALE: wa_BE.ISO8859-1 +iso8859-15/XLC_LOCALE: wa_BE.ISO8859-15 +iso8859-1/XLC_LOCALE: xh_ZA.ISO8859-1 +microsoft-cp1255/XLC_LOCALE: yi_US.CP1255 +zh_CN/XLC_LOCALE: zh_CN.eucCN +zh_CN/XLC_LOCALE: zh_CN.gb2312 +zh_CN.gbk/XLC_LOCALE: zh_CN.gbk +zh_CN.gb18030/XLC_LOCALE: zh_CN.gb18030 +zh_HK.big5/XLC_LOCALE: zh_HK.big5 +zh_HK.big5hkscs/XLC_LOCALE: zh_HK.big5hkscs +zh_TW.big5/XLC_LOCALE: zh_TW.big5 +zh_TW/XLC_LOCALE: zh_TW.eucTW +iso8859-1/XLC_LOCALE: zu_ZA.ISO8859-1 +# Note: The UTF-8 locales don't work correctly yet. Work in progress. +en_US.UTF-8/XLC_LOCALE: af_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE: am_ET.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_AA.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_AE.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_BH.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_DZ.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_EG.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_IQ.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_JO.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_KW.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_LB.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_LY.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_MA.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_OM.UTF-8 +en_US.UTF-8/XLC_LOCALE: bs_BA.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_QA.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_SA.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_SD.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_SY.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_TN.UTF-8 +en_US.UTF-8/XLC_LOCALE: ar_YE.UTF-8 +en_US.UTF-8/XLC_LOCALE: as_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: ast_ES.UTF-8 +en_US.UTF-8/XLC_LOCALE: az_AZ.UTF-8 +en_US.UTF-8/XLC_LOCALE: be_BY.UTF-8 +en_US.UTF-8/XLC_LOCALE: be_BY.UTF-8@latin +en_US.UTF-8/XLC_LOCALE: bg_BG.UTF-8 +en_US.UTF-8/XLC_LOCALE: bn_BD.UTF-8 +en_US.UTF-8/XLC_LOCALE: bn_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: bo_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: br_FR.UTF-8 +en_US.UTF-8/XLC_LOCALE: ca_AD.UTF-8 +en_US.UTF-8/XLC_LOCALE: ca_ES.UTF-8 +en_US.UTF-8/XLC_LOCALE: ca_FR.UTF-8 +en_US.UTF-8/XLC_LOCALE: ca_IT.UTF-8 +en_US.UTF-8/XLC_LOCALE: cs_CZ.UTF-8 +en_US.UTF-8/XLC_LOCALE: cy_GB.UTF-8 +en_US.UTF-8/XLC_LOCALE: da_DK.UTF-8 +en_US.UTF-8/XLC_LOCALE: de_AT.UTF-8 +en_US.UTF-8/XLC_LOCALE: de_BE.UTF-8 +en_US.UTF-8/XLC_LOCALE: de_CH.UTF-8 +en_US.UTF-8/XLC_LOCALE: de_DE.UTF-8 +en_US.UTF-8/XLC_LOCALE: de_IT.UTF-8 +en_US.UTF-8/XLC_LOCALE: de_LI.UTF-8 +en_US.UTF-8/XLC_LOCALE: de_LU.UTF-8 +en_US.UTF-8/XLC_LOCALE: el_CY.UTF-8 +en_US.UTF-8/XLC_LOCALE: el_GR.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_AU.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_BE.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_BW.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_BZ.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_CA.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_DK.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_GB.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_EN.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_HK.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_IE.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_JM.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_MT.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_NZ.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_PH.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_SG.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_TT.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_UK.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_US.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE: en_ZW.UTF-8 +en_US.UTF-8/XLC_LOCALE: eo_EO.UTF-8 +en_US.UTF-8/XLC_LOCALE: eo_XX.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_AR.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_BO.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_CL.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_CO.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_CR.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_DO.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_EC.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_ES.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_GT.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_HN.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_MX.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_NI.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_PA.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_PE.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_PR.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_PY.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_SV.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_US.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_UY.UTF-8 +en_US.UTF-8/XLC_LOCALE: es_VE.UTF-8 +en_US.UTF-8/XLC_LOCALE: et_EE.UTF-8 +en_US.UTF-8/XLC_LOCALE: eu_ES.UTF-8 +en_US.UTF-8/XLC_LOCALE: fa_IR.UTF-8 +en_US.UTF-8/XLC_LOCALE: fi_FI.UTF-8 +en_US.UTF-8/XLC_LOCALE: fo_FO.UTF-8 +en_US.UTF-8/XLC_LOCALE: fr_BE.UTF-8 +en_US.UTF-8/XLC_LOCALE: fr_CA.UTF-8 +en_US.UTF-8/XLC_LOCALE: fr_CH.UTF-8 +en_US.UTF-8/XLC_LOCALE: fr_FR.UTF-8 +en_US.UTF-8/XLC_LOCALE: fr_LU.UTF-8 +en_US.UTF-8/XLC_LOCALE: ga_IE.UTF-8 +en_US.UTF-8/XLC_LOCALE: gd_GB.UTF-8 +en_US.UTF-8/XLC_LOCALE: gl_ES.UTF-8 +en_US.UTF-8/XLC_LOCALE: gu_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: gv_GB.UTF-8 +en_US.UTF-8/XLC_LOCALE: he_IL.UTF-8 +en_US.UTF-8/XLC_LOCALE: hi_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: hne_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: hr_HR.UTF-8 +en_US.UTF-8/XLC_LOCALE: hu_HU.UTF-8 +en_US.UTF-8/XLC_LOCALE: hy_AM.UTF-8 +en_US.UTF-8/XLC_LOCALE: ia.UTF-8 +en_US.UTF-8/XLC_LOCALE: id_ID.UTF-8 +en_US.UTF-8/XLC_LOCALE: ie.UTF-8 +en_US.UTF-8/XLC_LOCALE: is_IS.UTF-8 +en_US.UTF-8/XLC_LOCALE: it_CH.UTF-8 +en_US.UTF-8/XLC_LOCALE: it_IT.UTF-8 +en_US.UTF-8/XLC_LOCALE: iu_CA.UTF-8 +ja_JP.UTF-8/XLC_LOCALE: ja_JP.UTF-8 +en_US.UTF-8/XLC_LOCALE: ka_GE.UTF-8 +en_US.UTF-8/XLC_LOCALE: kk_KZ.UTF-8 +en_US.UTF-8/XLC_LOCALE: kl_GL.UTF-8 +en_US.UTF-8/XLC_LOCALE: km_KH.UTF-8 +en_US.UTF-8/XLC_LOCALE: kn_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: ks_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: ks_IN.UTF-8@devanagari +ko_KR.UTF-8/XLC_LOCALE: ko_KR.UTF-8 +en_US.UTF-8/XLC_LOCALE: ku_TR.UTF-8 +en_US.UTF-8/XLC_LOCALE: kw_GB.UTF-8 +en_US.UTF-8/XLC_LOCALE: ky_KG.UTF-8 +en_US.UTF-8/XLC_LOCALE: lo_LA.UTF-8 +en_US.UTF-8/XLC_LOCALE: lt_LT.UTF-8 +en_US.UTF-8/XLC_LOCALE: lv_LV.UTF-8 +en_US.UTF-8/XLC_LOCALE: mai_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: mi_NZ.UTF-8 +en_US.UTF-8/XLC_LOCALE: mk_MK.UTF-8 +en_US.UTF-8/XLC_LOCALE: ml_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: mr_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: ms_MY.UTF-8 +en_US.UTF-8/XLC_LOCALE: mt_MT.UTF-8 +en_US.UTF-8/XLC_LOCALE: nl_BE.UTF-8 +en_US.UTF-8/XLC_LOCALE: nl_NL.UTF-8 +en_US.UTF-8/XLC_LOCALE: nb_NO.UTF-8 +en_US.UTF-8/XLC_LOCALE: nn_NO.UTF-8 +en_US.UTF-8/XLC_LOCALE: no_NO.UTF-8 +en_US.UTF-8/XLC_LOCALE: nr_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE: nso_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE: ny_NO.UTF-8 +en_US.UTF-8/XLC_LOCALE: oc_FR.UTF-8 +en_US.UTF-8/XLC_LOCALE: or_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: pa_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: pa_PK.UTF-8 +en_US.UTF-8/XLC_LOCALE: pd_DE.UTF-8 +en_US.UTF-8/XLC_LOCALE: pd_US.UTF-8 +en_US.UTF-8/XLC_LOCALE: ph_PH.UTF-8 +en_US.UTF-8/XLC_LOCALE: pl_PL.UTF-8 +en_US.UTF-8/XLC_LOCALE: pp_AN.UTF-8 +pt_BR.UTF-8/XLC_LOCALE: pt_BR.UTF-8 +pt_PT.UTF-8/XLC_LOCALE: pt_PT.UTF-8 +en_US.UTF-8/XLC_LOCALE: ro_RO.UTF-8 +ru_RU.UTF-8/XLC_LOCALE: ru_RU.UTF-8 +en_US.UTF-8/XLC_LOCALE: ru_UA.UTF-8 +en_US.UTF-8/XLC_LOCALE: rw_RW.UTF-8 +en_US.UTF-8/XLC_LOCALE: sa_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: sd_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: sd_IN.UTF-8@devanagari +en_US.UTF-8/XLC_LOCALE: se_NO.UTF-8 +en_US.UTF-8/XLC_LOCALE: sh_BA.UTF-8 +en_US.UTF-8/XLC_LOCALE: sh_YU.UTF-8 +en_US.UTF-8/XLC_LOCALE: si_LK.UTF-8 +en_US.UTF-8/XLC_LOCALE: sk_SK.UTF-8 +en_US.UTF-8/XLC_LOCALE: sl_SI.UTF-8 +en_US.UTF-8/XLC_LOCALE: sq_AL.UTF-8 +en_US.UTF-8/XLC_LOCALE: sr_ME.UTF-8 +en_US.UTF-8/XLC_LOCALE: sr_RS.UTF-8 +en_US.UTF-8/XLC_LOCALE: sr_RS.UTF-8@latin +en_US.UTF-8/XLC_LOCALE: sr_YU.UTF-8 +en_US.UTF-8/XLC_LOCALE: ss_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE: st_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE: sv_FI.UTF-8 +en_US.UTF-8/XLC_LOCALE: sv_SE.UTF-8 +en_US.UTF-8/XLC_LOCALE: ta_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: te_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: tg_TJ.UTF-8 +th_TH.UTF-8/XLC_LOCALE: th_TH.UTF-8 +en_US.UTF-8/XLC_LOCALE: ti_ER.UTF-8 +en_US.UTF-8/XLC_LOCALE: ti_ET.UTF-8 +en_US.UTF-8/XLC_LOCALE: tl_PH.UTF-8 +en_US.UTF-8/XLC_LOCALE: tn_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE: tr_TR.UTF-8 +en_US.UTF-8/XLC_LOCALE: ts_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE: tt_RU.UTF-8 +en_US.UTF-8/XLC_LOCALE: uk_UA.UTF-8 +en_US.UTF-8/XLC_LOCALE: ur_IN.UTF-8 +en_US.UTF-8/XLC_LOCALE: ur_PK.UTF-8 +en_US.UTF-8/XLC_LOCALE: uz_UZ.UTF-8 +en_US.UTF-8/XLC_LOCALE: ve_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE: vi_VN.UTF-8 +en_US.UTF-8/XLC_LOCALE: wa_BE.UTF-8 +en_US.UTF-8/XLC_LOCALE: xh_ZA.UTF-8 +en_US.UTF-8/XLC_LOCALE: yi_US.UTF-8 +en_US.UTF-8/XLC_LOCALE: ne_NP.UTF-8 +zh_CN.UTF-8/XLC_LOCALE: zh_CN.UTF-8 +zh_HK.UTF-8/XLC_LOCALE: zh_HK.UTF-8 +zh_CN.UTF-8/XLC_LOCALE: zh_SG.UTF-8 +zh_TW.UTF-8/XLC_LOCALE: zh_TW.UTF-8 +en_US.UTF-8/XLC_LOCALE: zu_ZA.UTF-8 diff --git a/test/data/symbols/compose b/test/data/symbols/compose new file mode 100644 index 0000000..08446bf --- /dev/null +++ b/test/data/symbols/compose @@ -0,0 +1,89 @@ +partial modifier_keys +xkb_symbols "ralt" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "lwin" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "lwin-altgr" { + key { type[Group1]="FOUR_LEVEL", [ Super_L, Super_L, Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "rwin" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "rwin-altgr" { + key { type[Group1]="FOUR_LEVEL", [ Super_R, Super_R, Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "menu" { + key

{ type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "menu-altgr" { + key { type[Group1]="FOUR_LEVEL", [ Menu, Menu, Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "rctrl" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "rctrl-altgr" { + key { type[Group1]="FOUR_LEVEL", [ Control_R, Control_R, Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "lctrl" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "lctrl-altgr" { + key { type[Group1]="FOUR_LEVEL", [ Control_L, Control_L, Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "caps" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "caps-altgr" { + key { type[Group1]="FOUR_LEVEL", [ Caps_Lock, Caps_Lock, Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "102" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "102-altgr" { + key { type[Group1]="FOUR_LEVEL", [ less, greater, Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "paus" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "prsc" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "sclk" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; diff --git a/test/data/sync.sh b/test/data/sync.sh index 10001bc..2cbcc0a 100755 --- a/test/data/sync.sh +++ b/test/data/sync.sh @@ -1,6 +1,8 @@ #/bin/sh +set -euo pipefail XKBCONFIGROOT='/usr/share/X11/xkb' +XLOCALEDIR='/usr/share/X11/locale' if [ ! -d test/data ]; then echo "Run this from the top source dir" @@ -67,3 +69,12 @@ for file in \ ; do cp "$XKBCONFIGROOT/$file" "test/data/$file" done + +for file in \ + compose.dir \ + locale.alias \ + locale.dir \ + en_US.UTF-8/Compose \ +; do + cp "$XLOCALEDIR/$file" "test/data/locale/$file" +done diff --git a/test/keysym.c b/test/keysym.c index bb2ec28..2c98c24 100644 --- a/test/keysym.c +++ b/test/keysym.c @@ -76,12 +76,13 @@ test_utf8(xkb_keysym_t keysym, const char *expected) if (ret <= 0) return ret; + assert(expected != NULL); + fprintf(stderr, "Expected keysym %#x -> %s (%u bytes)\n", keysym, expected, (unsigned) strlen(expected)); fprintf(stderr, "Received keysym %#x -> %s (%u bytes)\n\n", keysym, s, (unsigned) strlen(s)); - assert(expected != NULL); return streq(s, expected); } @@ -135,7 +136,18 @@ main(void) assert(test_string("XF86_Switch_VT_5", 0x1008FE05)); assert(test_string("VoidSymbol", 0xFFFFFF)); assert(test_string("U4567", 0x1004567)); + assert(test_string("U+4567", XKB_KEY_NoSymbol)); + assert(test_string("U+4567ffff", XKB_KEY_NoSymbol)); + assert(test_string("U+4567ffffff", XKB_KEY_NoSymbol)); + assert(test_string("U 4567", XKB_KEY_NoSymbol)); + assert(test_string("U +4567", XKB_KEY_NoSymbol)); assert(test_string("0x10203040", 0x10203040)); + assert(test_string("0x102030400", XKB_KEY_NoSymbol)); + assert(test_string("0x010203040", XKB_KEY_NoSymbol)); + assert(test_string("0x+10203040", XKB_KEY_NoSymbol)); + assert(test_string("0x 10203040", XKB_KEY_NoSymbol)); + assert(test_string("0x +10203040", XKB_KEY_NoSymbol)); + assert(test_string("0x-10203040", XKB_KEY_NoSymbol)); assert(test_string("a", 0x61)); assert(test_string("A", 0x41)); assert(test_string("ch", 0xfea0)); @@ -144,6 +156,10 @@ main(void) assert(test_string("THORN", 0x00de)); assert(test_string("Thorn", 0x00de)); assert(test_string("thorn", 0x00fe)); + /* Max keysym. */ + assert(test_string("0xffffffff", 0xffffffff)); + /* Outside range. */ + assert(test_string("0x100000000", XKB_KEY_NoSymbol)); assert(test_keysym(0x1008FF56, "XF86Close")); assert(test_keysym(0x0, "NoSymbol")); @@ -173,6 +189,9 @@ main(void) assert(test_casestring("Thorn", 0x00fe)); assert(test_casestring("thorn", 0x00fe)); + assert(test_string("", XKB_KEY_NoSymbol)); + assert(test_casestring("", XKB_KEY_NoSymbol)); + assert(test_utf8(XKB_KEY_y, "y")); assert(test_utf8(XKB_KEY_u, "u")); assert(test_utf8(XKB_KEY_m, "m")); diff --git a/test/registry.c b/test/registry.c index fab3b69..71a480f 100644 --- a/test/registry.c +++ b/test/registry.c @@ -56,6 +56,8 @@ struct test_layout { const char *variant; const char *brief; const char *description; + const char *iso639[3]; /* language list (iso639 three letter codes), 3 is enough for our test */ + const char *iso3166[3]; /* country list (iso3166 two letter codes), 3 is enough for our tests */ }; struct test_option { @@ -76,7 +78,9 @@ fprint_config_item(FILE *fp, const char *name, const char *vendor, const char *brief, - const char *description) + const char *description, + const char * const iso639[3], + const char * const iso3166[3]) { fprintf(fp, " \n" " %s\n", name); @@ -86,6 +90,27 @@ fprint_config_item(FILE *fp, fprintf(fp, " %s\n", description); if (vendor) fprintf(fp, " %s\n", vendor); + if (iso3166 && iso3166[0]) { + fprintf(fp, " \n"); + for (int i = 0; i < 3; i++) { + const char *iso = iso3166[i]; + if (!iso) + break; + fprintf(fp, " %s\n", iso); + } + fprintf(fp, " \n"); + } + if (iso639 && iso639[0]) { + fprintf(fp, " \n"); + for (int i = 0; i < 3; i++) { + const char *iso = iso639[i]; + if (!iso) + break; + fprintf(fp, " %s\n", iso); + } + fprintf(fp, " \n"); + } + fprintf(fp, " \n"); } @@ -131,7 +156,7 @@ test_create_rules(const char *ruleset, for (const struct test_model *m = test_models; m->name; m++) { fprintf(fp, "\n"); - fprint_config_item(fp, m->name, m->vendor, NULL, m->description); + fprint_config_item(fp, m->name, m->vendor, NULL, m->description, NULL, NULL); fprintf(fp, "\n"); } fprintf(fp, "\n"); @@ -149,14 +174,13 @@ test_create_rules(const char *ruleset, while (l->name) { fprintf(fp, "\n"); - fprint_config_item(fp, l->name, NULL, l->brief, l->description); + fprint_config_item(fp, l->name, NULL, l->brief, l->description, l->iso639, l->iso3166); if (next->name && streq(next->name, l->name)) { fprintf(fp, "\n"); do { fprintf(fp, "\n"); - fprint_config_item(fp, next->variant, NULL, next->brief, - next->description); + fprint_config_item(fp, next->variant, NULL, next->brief, next->description, next->iso639, next->iso3166); fprintf(fp, "\n"); l = next; next++; @@ -175,10 +199,10 @@ test_create_rules(const char *ruleset, for (const struct test_option_group *g = test_groups; g->name; g++) { fprintf(fp, "\n", g->allow_multiple_selection ? "true" : "false"); - fprint_config_item(fp, g->name, NULL, NULL, g->description); + fprint_config_item(fp, g->name, NULL, NULL, g->description, NULL, NULL); for (const struct test_option *o = g->options; o->name; o++) { fprintf(fp, " \n"); } fprintf(fp, "\n"); @@ -282,18 +306,21 @@ find_models(struct rxkb_context *ctx, ...) va_list args; const char *name; int idx = 0; + bool rc = false; va_start(args, ctx); name = va_arg(args, const char *); while(name) { assert(++idx < 20); /* safety guard */ if (!find_model(ctx, name)) - return false; + goto out; name = va_arg(args, const char *); }; + rc = true; +out: va_end(args); - return true; + return rc; } static struct rxkb_layout * @@ -326,6 +353,7 @@ find_layouts(struct rxkb_context *ctx, ...) va_list args; const char *name, *variant; int idx = 0; + bool rc = false; va_start(args, ctx); name = va_arg(args, const char *); @@ -333,14 +361,16 @@ find_layouts(struct rxkb_context *ctx, ...) while(name) { assert(++idx < 20); /* safety guard */ if (!find_layout(ctx, name, variant)) - return false; + goto out; name = va_arg(args, const char *); if (name) variant = va_arg(args, const char *); }; + rc = true; +out: va_end(args); - return true; + return rc; } static struct rxkb_option_group * @@ -396,6 +426,7 @@ find_options(struct rxkb_context *ctx, ...) va_list args; const char *grp, *opt; int idx = 0; + bool rc = false; va_start(args, ctx); grp = va_arg(args, const char *); @@ -403,14 +434,16 @@ find_options(struct rxkb_context *ctx, ...) while(grp) { assert(++idx < 20); /* safety guard */ if (!find_option(ctx, grp, opt)) - return false; + goto out; grp = va_arg(args, const char *); if (grp) opt = va_arg(args, const char *); }; + rc = true; +out: va_end(args); - return true; + return rc; } static bool @@ -434,6 +467,9 @@ cmp_models(struct test_model *tm, struct rxkb_model *m) static bool cmp_layouts(struct test_layout *tl, struct rxkb_layout *l) { + struct rxkb_iso3166_code *iso3166 = NULL; + struct rxkb_iso639_code *iso639 = NULL; + if (!tl || !l) return false; @@ -449,6 +485,36 @@ cmp_layouts(struct test_layout *tl, struct rxkb_layout *l) if (!streq_null(tl->description, rxkb_layout_get_description(l))) return false; + iso3166 = rxkb_layout_get_iso3166_first(l); + for (size_t i = 0; i < sizeof(tl->iso3166); i++) { + const char *iso = tl->iso3166[i]; + if (iso == NULL && iso3166 == NULL) + break; + + if (!streq_null(iso, rxkb_iso3166_code_get_code(iso3166))) + return false; + + iso3166 = rxkb_iso3166_code_next(iso3166); + } + + if (iso3166 != NULL) + return false; + + iso639 = rxkb_layout_get_iso639_first(l); + for (size_t i = 0; i < sizeof(tl->iso639); i++) { + const char *iso = tl->iso639[i]; + if (iso == NULL && iso639 == NULL) + break; + + if (!streq_null(iso, rxkb_iso639_code_get_code(iso639))) + return false; + + iso639 = rxkb_iso639_code_next(iso639); + } + + if (iso639 != NULL) + return false; + return true; } @@ -554,6 +620,7 @@ test_load_full(void) struct test_layout system_layouts[] = { {"l1", NO_VARIANT, "lbrief1", "ldesc1"}, {"l1", "v1", "vbrief1", "vdesc1"}, + {"l1", "v2", NULL, "vdesc2"}, {NULL}, }; struct test_option_group system_groups[] = { @@ -588,6 +655,11 @@ test_load_full(void) assert(cmp_layouts(&system_layouts[1], l)); rxkb_layout_unref(l); + l = fetch_layout(ctx, "l1", "v2"); + struct test_layout expected = {"l1", "v2", "lbrief1", "vdesc2"}; + assert(cmp_layouts(&expected, l)); + rxkb_layout_unref(l); + g = fetch_option_group(ctx, "grp1"); assert(cmp_option_groups(&system_groups[0], g, CMP_EXACT)); rxkb_option_group_unref(g); @@ -599,6 +671,107 @@ test_load_full(void) rxkb_context_unref(ctx); } +static void +test_load_languages(void) +{ + struct test_model system_models[] = { + {"m1", "vendor1", "desc1"}, + {NULL}, + }; + struct test_layout system_layouts[] = { + {"l1", NO_VARIANT, "lbrief1", "ldesc1", + .iso639 = { "abc", "def" }, + .iso3166 = { "uv", "wx" }}, + {"l1", "v1", "vbrief1", "vdesc1", + .iso639 = {"efg"}, + .iso3166 = {"yz"}}, + {"l2", NO_VARIANT, "lbrief1", "ldesc1", + .iso639 = { "hij", "klm" }, + .iso3166 = { "op", "qr" }}, + {"l2", "v2", "lbrief1", "ldesc1", + .iso639 = { NULL }, /* inherit from parent */ + .iso3166 = { NULL }}, /* inherit from parent */ + {NULL}, + }; + struct test_option_group system_groups[] = { + {"grp1", "gdesc1", true, + { {"grp1:1", "odesc11"}, {"grp1:2", "odesc12"} } }, + { NULL }, + }; + struct rxkb_context *ctx; + struct rxkb_layout *l; + struct rxkb_iso3166_code *iso3166; + struct rxkb_iso639_code *iso639; + + ctx = test_setup_context(system_models, NULL, + system_layouts, NULL, + system_groups, NULL); + + l = fetch_layout(ctx, "l1", NO_VARIANT); + assert(cmp_layouts(&system_layouts[0], l)); + rxkb_layout_unref(l); + + l = fetch_layout(ctx, "l1", "v1"); + assert(cmp_layouts(&system_layouts[1], l)); + rxkb_layout_unref(l); + + l = fetch_layout(ctx, "l2", "v2"); + iso3166 = rxkb_layout_get_iso3166_first(l); + assert(streq(rxkb_iso3166_code_get_code(iso3166), "op")); + iso3166 = rxkb_iso3166_code_next(iso3166); + assert(streq(rxkb_iso3166_code_get_code(iso3166), "qr")); + + iso639 = rxkb_layout_get_iso639_first(l); + assert(streq(rxkb_iso639_code_get_code(iso639), "hij")); + iso639 = rxkb_iso639_code_next(iso639); + assert(streq(rxkb_iso639_code_get_code(iso639), "klm")); + + rxkb_layout_unref(l); + rxkb_context_unref(ctx); +} + +static void +test_load_invalid_languages(void) +{ + struct test_model system_models[] = { + {"m1", "vendor1", "desc1"}, + {NULL}, + }; + struct test_layout system_layouts[] = { + {"l1", NO_VARIANT, "lbrief1", "ldesc1", + .iso639 = { "ab", "def" }, + .iso3166 = { "uvw", "xz" }}, + {NULL}, + }; + struct test_option_group system_groups[] = { + {"grp1", "gdesc1", true, + { {"grp1:1", "odesc11"}, {"grp1:2", "odesc12"} } }, + { NULL }, + }; + struct rxkb_context *ctx; + struct rxkb_layout *l; + struct rxkb_iso3166_code *iso3166; + struct rxkb_iso639_code *iso639; + + ctx = test_setup_context(system_models, NULL, + system_layouts, NULL, + system_groups, NULL); + + l = fetch_layout(ctx, "l1", NO_VARIANT); + /* uvw is invalid, we expect 2 letters, verify it was ignored */ + iso3166 = rxkb_layout_get_iso3166_first(l); + assert(streq(rxkb_iso3166_code_get_code(iso3166), "xz")); + assert(rxkb_iso3166_code_next(iso3166) == NULL); + + /* ab is invalid, we expect 3 letters, verify it was ignored */ + iso639 = rxkb_layout_get_iso639_first(l); + assert(streq(rxkb_iso639_code_get_code(iso639), "def")); + assert(rxkb_iso639_code_next(iso639) == NULL); + rxkb_layout_unref(l); + + rxkb_context_unref(ctx); +} + static void test_popularity(void) { @@ -840,6 +1013,8 @@ main(void) test_load_full(); test_load_merge(); test_load_merge_no_overwrite(); + test_load_languages(); + test_load_invalid_languages(); test_popularity(); return 0; diff --git a/test/test-keysym.py b/test/test-keysym.py new file mode 100755 index 0000000..d237f31 --- /dev/null +++ b/test/test-keysym.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +# +# This script creates a custom layout, overriding the TDLE key with the first +# argument given. + +import argparse +import tempfile +from pathlib import Path +import subprocess +import os +import re +import sys + +# Template to force our key to TLDE +template = """ +default +xkb_symbols "basic" {{ + include "us(basic)" + replace key {{ [ {} ] }}; +}}; +""" + +parser = argparse.ArgumentParser( + description='Tool to verify whether a keysym is resolved' +) +parser.add_argument('keysym', type=str, help='XKB keysym') +parser.add_argument('--tool', type=str, nargs=1, + default=['xkbcli', 'compile-keymap'], + help='Full path to the xkbcli-compile-keymap tool') +args = parser.parse_args() + +with tempfile.TemporaryDirectory() as tmpdir: + symfile = Path(tmpdir) / "symbols" / "keytest" + symfile.parent.mkdir() + with symfile.open(mode='w') as f: + f.write(template.format(args.keysym)) + + try: + cmd = [ + *args.tool, + '--layout', 'keytest', + ] + + env = os.environ.copy() + env['XKB_CONFIG_EXTRA_PATH'] = tmpdir + + result = subprocess.run(cmd, env=env, capture_output=True, + universal_newlines=True) + if result.returncode != 0: + print('ERROR: Failed to compile:') + print(result.stderr) + sys.exit(1) + + # grep for TLDE actually being remapped + for l in result.stdout.split('\n'): + match = re.match(r'\s+key \\s+{\s+\[\s+(?P\w+)\s+\]\s+}', l) + if match: + if args.keysym == match.group('keysym'): + sys.exit(0) + elif match.group('keysym') == 'NoSymbol': + print('ERROR: key {} not resolved:'.format(args.keysym), l) + else: + print('ERROR: key {} mapped to wrong key:'.format(args.keysym), l) + sys.exit(1) + + print(result.stdout) + print('ERROR: above keymap is missing key mapping for {}'.format(args.keysym)) + sys.exit(1) + except FileNotFoundError as err: + print('ERROR: invalid or missing tool: {}'.format(err)) + sys.exit(1) diff --git a/test/tool-option-parsing.py b/test/tool-option-parsing.py index a2072b3..6692d58 100755 --- a/test/tool-option-parsing.py +++ b/test/tool-option-parsing.py @@ -31,8 +31,19 @@ import tempfile import unittest -top_builddir = os.environ['top_builddir'] -top_srcdir = os.environ['top_srcdir'] +try: + top_builddir = os.environ['top_builddir'] + top_srcdir = os.environ['top_srcdir'] +except KeyError: + print('Required environment variables not found: top_srcdir/top_builddir', file=sys.stderr) + from pathlib import Path + top_srcdir = '.' + try: + top_builddir = next(Path('.').glob('**/meson-logs/')).parent + except StopIteration: + sys.exit(1) + print('Using srcdir "{}", builddir "{}"'.format(top_srcdir, top_builddir), file=sys.stderr) + logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger('test') @@ -65,10 +76,11 @@ class XkbcliTool: xkbcli_tool = 'xkbcli' subtool = None - def __init__(self, subtool=None, skipIf=()): + def __init__(self, subtool=None, skipIf=(), skipError=()): self.tool_path = top_builddir self.subtool = subtool self.skipIf = skipIf + self.skipError = skipError def run_command(self, args): for condition, reason in self.skipIf: @@ -84,7 +96,11 @@ class XkbcliTool: def run_command_success(self, args): rc, stdout, stderr = self.run_command(args) - assert rc == 0, (stdout, stderr) + if rc != 0: + for testfunc, reason in self.skipError: + if testfunc(rc, stdout, stderr): + raise unittest.SkipTest(reason) + assert rc == 0, (rc, stdout, stderr) return stdout, stderr def run_command_invalid(self, args): @@ -121,7 +137,11 @@ class TestXkbcli(unittest.TestCase): (not int(os.getenv('HAVE_XKBCLI_INTERACTIVE_EVDEV', '1')), 'evdev not enabled'), (not os.path.exists('/dev/input/event0'), 'event node required'), (not os.access('/dev/input/event0', os.R_OK), 'insufficient permissions'), - )) + ), skipError=( + (lambda rc, stdout, stderr: 'Couldn\'t find any keyboards' in stderr, + 'No keyboards available'), + ), + ) cls.xkbcli_interactive_x11 = XkbcliTool('interactive-x11', skipIf=( (not int(os.getenv('HAVE_XKBCLI_INTERACTIVE_X11', '1')), 'x11 not enabled'), (not os.getenv('DISPLAY'), 'DISPLAY not set'), @@ -250,7 +270,7 @@ class TestXkbcli(unittest.TestCase): def test_interactive_evdev_rmlvo(self): for rmlvo in rmlvos: with self.subTest(rmlvo=rmlvo): - self.xkbcli_interactive_evdev.run_command_success(rmlvos) + self.xkbcli_interactive_evdev.run_command_success(rmlvo) def test_interactive_evdev(self): # Note: --enable-compose fails if $prefix doesn't have the compose tables @@ -278,6 +298,10 @@ if __name__ == '__main__': with tempfile.TemporaryDirectory() as tmpdir: # Use our own test xkeyboard-config copy. os.environ['XKB_CONFIG_ROOT'] = top_srcdir + '/test/data' + # Use our own X11 locale copy. + os.environ['XLOCALEDIR'] = top_srcdir + '/test/data/locale' + # Use our own locale. + os.environ['LC_CTYPE'] = 'en_US.UTF-8' # libxkbcommon has fallbacks when XDG_CONFIG_HOME isn't set so we need # to override it with a known (empty) directory. Otherwise our test # behavior depends on the system the test is run on. diff --git a/test/xkeyboard-config-test.py.in b/test/xkeyboard-config-test.py.in index 001f1b6..66deca4 100755 --- a/test/xkeyboard-config-test.py.in +++ b/test/xkeyboard-config-test.py.in @@ -1,14 +1,14 @@ #!/usr/bin/env python3 import argparse +import multiprocessing import sys import subprocess import os -import io import xml.etree.ElementTree as ET -from multiprocessing import Pool +from pathlib import Path -verbose = True +verbose = False DEFAULT_RULES_XML = '@XKB_CONFIG_ROOT@/rules/evdev.xml' @@ -17,29 +17,103 @@ EXTRA_PATH = '@MESON_BUILD_ROOT@' os.environ['PATH'] = ':'.join([EXTRA_PATH, os.getenv('PATH')]) -def noop_progress_bar(x, total): - return x +def escape(s): + return s.replace('"', '\\"') # The function generating the progress bar (if any). -progress_bar = noop_progress_bar -if os.isatty(sys.stdout.fileno()): - try: - from tqdm import tqdm - progress_bar = tqdm +def create_progress_bar(verbose): + def noop_progress_bar(x, total, file=None): + return x - verbose = False - except ImportError: - pass + progress_bar = noop_progress_bar + if not verbose and os.isatty(sys.stdout.fileno()): + try: + from tqdm import tqdm + progress_bar = tqdm + except ImportError: + pass + + return progress_bar + + +class Invocation: + def __init__(self, r, m, l, v, o): + self.command = "" + self.rules = r + self.model = m + self.layout = l + self.variant = v + self.option = o + self.exitstatus = 77 # default to skipped + self.error = None + self.keymap = None # The fully compiled keymap + + @property + def rmlvo(self): + return self.rules, self.model, self.layout, self.variant, self.option + + def __str__(self): + s = [] + rmlvo = [x or "" for x in self.rmlvo] + rmlvo = ', '.join([f'"{x}"' for x in rmlvo]) + s.append(f'- rmlvo: [{rmlvo}]') + s.append(f' cmd: "{escape(self.command)}"') + s.append(f' status: {self.exitstatus}') + if self.error: + s.append(f' error: "{escape(self.error.strip())}"') + return '\n'.join(s) + + def run(self): + raise NotImplementedError + + +class XkbCompInvocation(Invocation): + def run(self): + r, m, l, v, o = self.rmlvo + args = ['setxkbmap', '-print'] + if r is not None: + args.append('-rules') + args.append('{}'.format(r)) + if m is not None: + args.append('-model') + args.append('{}'.format(m)) + if l is not None: + args.append('-layout') + args.append('{}'.format(l)) + if v is not None: + args.append('-variant') + args.append('{}'.format(v)) + if o is not None: + args.append('-option') + args.append('{}'.format(o)) + xkbcomp_args = ['xkbcomp', '-xkb', '-', '-'] -def xkbcommontool(rmlvo): - try: - r = rmlvo.get('r', 'evdev') - m = rmlvo.get('m', 'pc105') - l = rmlvo.get('l', 'us') - v = rmlvo.get('v', None) - o = rmlvo.get('o', None) + self.command = " ".join(args + ["|"] + xkbcomp_args) + + setxkbmap = subprocess.Popen(args, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, universal_newlines=True) + stdout, stderr = setxkbmap.communicate() + if "Cannot open display" in stderr: + self.error = stderr + self.exitstatus = 90 + else: + xkbcomp = subprocess.Popen(xkbcomp_args, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + universal_newlines=True) + stdout, stderr = xkbcomp.communicate(stdout) + if xkbcomp.returncode != 0: + self.error = "failed to compile keymap" + self.exitstatus = xkbcomp.returncode + else: + self.keymap = stdout + self.exitstatus = 0 + + +class XkbcommonInvocation(Invocation): + def run(self): + r, m, l, v, o = self.rmlvo args = [ 'xkbcli-compile-keymap', # this is run in the builddir '--verbose', @@ -52,28 +126,33 @@ def xkbcommontool(rmlvo): if o is not None: args += ['--options', o] - success = True - out = io.StringIO() - if verbose: - print(':: {}'.format(' '.join(args)), file=out) - + self.command = " ".join(args) try: output = subprocess.check_output(args, stderr=subprocess.STDOUT, universal_newlines=True) - if verbose: - print(output, file=out) - if "unrecognized keysym" in output: for line in output.split('\n'): if "unrecognized keysym" in line: - print('ERROR: {}'.format(line)) - success = False + self.error = line + self.exitstatus = 99 # tool doesn't generate this one + else: + self.exitstatus = 0 + self.keymap = output except subprocess.CalledProcessError as err: - print('ERROR: Failed to compile: {}'.format(' '.join(args)), file=out) - print(err.output, file=out) - success = False + self.error = "failed to compile keymap" + self.exitstatus = err.returncode - return success, out.getvalue() + +def xkbcommontool(rmlvo): + try: + r = rmlvo.get('r', 'evdev') + m = rmlvo.get('m', 'pc105') + l = rmlvo.get('l', 'us') + v = rmlvo.get('v', None) + o = rmlvo.get('o', None) + tool = XkbcommonInvocation(r, m, l, v, o) + tool.run() + return tool except KeyboardInterrupt: pass @@ -85,51 +164,9 @@ def xkbcomp(rmlvo): l = rmlvo.get('l', 'us') v = rmlvo.get('v', None) o = rmlvo.get('o', None) - args = ['setxkbmap', '-print'] - if r is not None: - args.append('-rules') - args.append('{}'.format(r)) - if m is not None: - args.append('-model') - args.append('{}'.format(m)) - if l is not None: - args.append('-layout') - args.append('{}'.format(l)) - if v is not None: - args.append('-variant') - args.append('{}'.format(v)) - if o is not None: - args.append('-option') - args.append('{}'.format(o)) - - success = True - out = io.StringIO() - if verbose: - print(':: {}'.format(' '.join(args)), file=out) - - try: - xkbcomp_args = ['xkbcomp', '-xkb', '-', '-'] - - setxkbmap = subprocess.Popen(args, stdout=subprocess.PIPE) - xkbcomp = subprocess.Popen(xkbcomp_args, stdin=setxkbmap.stdout, - stdout=subprocess.PIPE, stderr=subprocess.PIPE, - universal_newlines=True) - setxkbmap.stdout.close() - stdout, stderr = xkbcomp.communicate() - if xkbcomp.returncode != 0: - print('ERROR: Failed to compile: {}'.format(' '.join(args)), file=out) - success = False - if xkbcomp.returncode != 0 or verbose: - print(stdout, file=out) - print(stderr, file=out) - - # This catches setxkbmap errors. - except subprocess.CalledProcessError as err: - print('ERROR: Failed to compile: {}'.format(' '.join(args)), file=out) - print(err.output, file=out) - success = False - - return success, out.getvalue() + tool = XkbCompInvocation(r, m, l, v, o) + tool.run() + return tool except KeyboardInterrupt: pass @@ -159,26 +196,68 @@ def parse(path): return combos -def run(combos, tool, njobs): +def run(combos, tool, njobs, keymap_output_dir): + if keymap_output_dir: + keymap_output_dir = Path(keymap_output_dir) + try: + keymap_output_dir.mkdir() + except FileExistsError as e: + print(e, file=sys.stderr) + return False + + keymap_file = None + keymap_file_fd = None + failed = False - with Pool(njobs) as p: + with multiprocessing.Pool(njobs) as p: results = p.imap_unordered(tool, combos) - for success, output in progress_bar(results, total=len(combos)): - if not success: + for invocation in progress_bar(results, total=len(combos), file=sys.stdout): + if invocation.exitstatus != 0: failed = True - if output: - print(output, file=sys.stdout if success else sys.stderr) + target = sys.stderr + else: + target = sys.stdout if verbose else None + + if target: + print(invocation, file=target) + + if keymap_output_dir: + # we're running through the layouts in a somewhat sorted manner, + # so let's keep the fd open until we switch layouts + layout = invocation.layout + if invocation.variant: + layout += f"({invocation.variant})" + fname = keymap_output_dir / layout + if fname != keymap_file: + keymap_file = fname + if keymap_file_fd: + keymap_file_fd.close() + keymap_file_fd = open(keymap_file, 'a') + + rmlvo = ', '.join([x or '' for x in invocation.rmlvo]) + print(f"// {rmlvo}", file=keymap_file_fd) + print(invocation.keymap, file=keymap_file_fd) + keymap_file_fd.flush() + return failed def main(args): + global progress_bar + global verbose + tools = { 'libxkbcommon': xkbcommontool, 'xkbcomp': xkbcomp, } parser = argparse.ArgumentParser( - description='Tool to test all layout/variant/option combinations.' + description=''' + This tool compiles a keymap for each layout, variant and + options combination in the given rules XML file. The output + of this tool is YAML, use your favorite YAML parser to + extract error messages. Errors are printed to stderr. + ''' ) parser.add_argument('path', metavar='/path/to/evdev.xml', nargs='?', type=str, @@ -190,12 +269,33 @@ def main(args): parser.add_argument('--jobs', '-j', type=int, default=os.cpu_count() * 4, help='number of processes to use') + parser.add_argument('--verbose', '-v', default=False, action="store_true") + parser.add_argument('--keymap-output-dir', default=None, type=str, + help='Directory to print compiled keymaps to') + parser.add_argument('--layout', default=None, type=str, + help='Only test the given layout') + parser.add_argument('--variant', default=None, type=str, + help='Only test the given variant') + parser.add_argument('--option', default=None, type=str, + help='Only test the given option') + args = parser.parse_args() + verbose = args.verbose + keymapdir = args.keymap_output_dir + progress_bar = create_progress_bar(verbose) + tool = tools[args.tool] - combos = parse(args.path) - failed = run(combos, tool, args.jobs) + if any([args.layout, args.variant, args.option]): + combos = [{ + 'l': args.layout, + 'v': args.variant, + 'o': args.option, + }] + else: + combos = parse(args.path) + failed = run(combos, tool, args.jobs, keymapdir) sys.exit(failed) @@ -203,4 +303,4 @@ if __name__ == '__main__': try: main(sys.argv) except KeyboardInterrupt: - print('Exiting after Ctrl+C') + print('# Exiting after Ctrl+C') diff --git a/tools/compose.c b/tools/compose.c new file mode 100644 index 0000000..2b3ba64 --- /dev/null +++ b/tools/compose.c @@ -0,0 +1,126 @@ +/* + * Copyright © 2021 Ran Benita + * + * 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 +#include +#include +#include + +#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; +} diff --git a/tools/how-to-type.c b/tools/how-to-type.c index 0a6f79e..91ebd00 100644 --- a/tools/how-to-type.c +++ b/tools/how-to-type.c @@ -24,6 +24,7 @@ #include "config.h" #include +#include #include #include #include @@ -35,9 +36,9 @@ static void usage(const char *argv0, FILE *fp) { - fprintf(fp, "Usage: %s [--rules ] [--model ] " + fprintf(fp, "Usage: %s [--keysym] [--rules ] [--model ] " "[--layout ] [--variant ] [--options ]" - " \n", argv0); + " \n", argv0); } int @@ -48,6 +49,7 @@ main(int argc, char *argv[]) const char *layout_ = NULL; const char *variant = NULL; const char *options = NULL; + bool keysym_mode = false; int err = EXIT_FAILURE; struct xkb_context *ctx = NULL; char *endp; @@ -60,6 +62,7 @@ main(int argc, char *argv[]) xkb_keycode_t min_keycode, max_keycode; xkb_mod_index_t num_mods; enum options { + OPT_KEYSYM, OPT_RULES, OPT_MODEL, OPT_LAYOUT, @@ -68,6 +71,7 @@ main(int argc, char *argv[]) }; static struct option opts[] = { {"help", no_argument, 0, 'h'}, + {"keysym", no_argument, 0, OPT_KEYSYM}, {"rules", required_argument, 0, OPT_RULES}, {"model", required_argument, 0, OPT_MODEL}, {"layout", required_argument, 0, OPT_LAYOUT}, @@ -85,6 +89,9 @@ main(int argc, char *argv[]) break; switch (opt) { + case OPT_KEYSYM: + keysym_mode = true; + break; case OPT_RULES: rules = optarg; break; @@ -113,18 +120,26 @@ main(int argc, char *argv[]) exit(EXIT_INVALID_USAGE); } - errno = 0; - val = strtol(argv[optind], &endp, 0); - if (errno != 0 || endp == argv[optind] || val < 0 || val > 0x10FFFF) { - usage(argv[0], stderr); - exit(EXIT_INVALID_USAGE); - } - codepoint = (uint32_t) val; + if (keysym_mode) { + keysym = xkb_keysym_from_name(argv[optind], XKB_KEYSYM_NO_FLAGS); + if (keysym == XKB_KEY_NoSymbol) { + fprintf(stderr, "Failed to convert argument to keysym\n"); + goto err; + } + } else { + errno = 0; + val = strtol(argv[optind], &endp, 0); + if (errno != 0 || endp == argv[optind] || val < 0 || val > 0x10FFFF) { + usage(argv[0], stderr); + exit(EXIT_INVALID_USAGE); + } + codepoint = (uint32_t) val; - keysym = xkb_utf32_to_keysym(codepoint); - if (keysym == XKB_KEY_NoSymbol) { - fprintf(stderr, "Failed to convert codepoint to keysym\n"); - goto err; + keysym = xkb_utf32_to_keysym(codepoint); + if (keysym == XKB_KEY_NoSymbol) { + fprintf(stderr, "Failed to convert codepoint to keysym\n"); + goto err; + } } ret = xkb_keysym_get_name(keysym, name, sizeof(name)); diff --git a/tools/interactive-evdev.c b/tools/interactive-evdev.c index 9c8c94e..8b0bce0 100644 --- a/tools/interactive-evdev.c +++ b/tools/interactive-evdev.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -38,7 +39,6 @@ #include #include -#include #include #include "xkbcommon/xkbcommon.h" @@ -313,33 +313,25 @@ read_keyboard(struct keyboard *kbd) static int loop(struct keyboard *kbds) { - int i, ret = 1; - int epfd = -1; + int ret = -1; struct keyboard *kbd; - struct epoll_event ev; - struct epoll_event evs[16]; + nfds_t nfds, i; + struct pollfd *fds = NULL; - epfd = epoll_create1(0); - if (epfd < 0) { - fprintf(stderr, "Couldn't create epoll instance: %s\n", - strerror(errno)); + for (kbd = kbds, nfds = 0; kbd; kbd = kbd->next, nfds++) {} + fds = calloc(nfds, sizeof(*fds)); + if (fds == NULL) { + fprintf(stderr, "Out of memory"); goto out; } - for (kbd = kbds; kbd; kbd = kbd->next) { - memset(&ev, 0, sizeof(ev)); - ev.events = EPOLLIN; - ev.data.ptr = kbd; - ret = epoll_ctl(epfd, EPOLL_CTL_ADD, kbd->fd, &ev); - if (ret) { - fprintf(stderr, "Couldn't add %s to epoll: %s\n", - kbd->path, strerror(errno)); - goto out; - } + for (i = 0, kbd = kbds; kbd; kbd = kbd->next, i++) { + fds[i].fd = kbd->fd; + fds[i].events = POLLIN; } while (!terminate) { - ret = epoll_wait(epfd, evs, 16, -1); + ret = poll(fds, nfds, -1); if (ret < 0) { if (errno == EINTR) continue; @@ -348,18 +340,19 @@ loop(struct keyboard *kbds) goto out; } - for (i = 0; i < ret; i++) { - kbd = evs[i].data.ptr; - ret = read_keyboard(kbd); - if (ret) { - goto out; + for (i = 0, kbd = kbds; kbd; kbd = kbd->next, i++) { + if (fds[i].revents != 0) { + ret = read_keyboard(kbd); + if (ret) { + goto out; + } } } } ret = 0; out: - close(epfd); + free(fds); return ret; } diff --git a/tools/interactive-wayland.c b/tools/interactive-wayland.c index 3ac7ad7..d23432d 100644 --- a/tools/interactive-wayland.c +++ b/tools/interactive-wayland.c @@ -130,6 +130,27 @@ create_tmpfile_cloexec(char *tmpname) } #endif +static int +os_resize_anonymous_file(int fd, off_t size) +{ + int ret; +#ifdef HAVE_POSIX_FALLOCATE + ret = posix_fallocate(fd, 0, size); + if (ret == 0) + return 0; + /* + * Filesystems that do support fallocate will return EINVAL + * or EOPNOTSUPP, fallback to ftruncate() then. + */ + if (ret != EINVAL && ret != EOPNOTSUPP) + return ret; +#endif + ret = ftruncate(fd, size); + if (ret != 0) + return errno; + return 0; +} + /* * Create a new, unique, anonymous file of the given size, and * return the file descriptor for it. The file descriptor is set @@ -148,8 +169,8 @@ create_tmpfile_cloexec(char *tmpname) * If the C library implements posix_fallocate(), it is used to * guarantee that disk space is available for the file at the * given size. If disk space is insufficent, errno is set to ENOSPC. - * If posix_fallocate() is not supported, program may receive - * SIGBUS on accessing mmap()'ed file contents instead. + * If posix_fallocate() is not supported, program will fallback + * to ftruncate() instead. */ static int os_create_anonymous_file(off_t size) @@ -180,20 +201,12 @@ os_create_anonymous_file(off_t size) if (fd < 0) return -1; -#ifdef HAVE_POSIX_FALLOCATE - ret = posix_fallocate(fd, 0, size); + ret = os_resize_anonymous_file(fd, size); if (ret != 0) { close(fd); errno = ret; return -1; } -#else - ret = ftruncate(fd, size); - if (ret < 0) { - close(fd); - return -1; - } -#endif return fd; } diff --git a/tools/interactive-x11.c b/tools/interactive-x11.c index c7ca9aa..eea22fa 100644 --- a/tools/interactive-x11.c +++ b/tools/interactive-x11.c @@ -246,7 +246,7 @@ process_event(xcb_generic_event_t *gevent, struct keyboard *kbd) XKB_CONSUMED_MODE_XKB); /* Exit on ESC. */ - if (keycode == 9) + if (xkb_state_key_get_one_sym(kbd->state, keycode) == XKB_KEY_Escape) terminate = true; break; } diff --git a/tools/registry-list.c b/tools/registry-list.c index 0dc71d1..c360da7 100644 --- a/tools/registry-list.c +++ b/tools/registry-list.c @@ -136,19 +136,22 @@ main(int argc, char **argv) goto err; } - printf("Models:\n"); + printf("models:\n"); m = rxkb_model_first(ctx); assert(m); /* Empty model list is usually a bug or a bad xml file */ while (m) { - printf("- %s:%s:%s\n", + const char *vendor = rxkb_model_get_vendor(m); + printf("- name: %s\n" + " vendor: %s\n" + " description: %s\n", rxkb_model_get_name(m), - rxkb_model_get_vendor(m), + vendor ? vendor : "''", rxkb_model_get_description(m)); m = rxkb_model_next(m); } printf("\n"); - printf("Layouts:\n"); + printf("layouts:\n"); l = rxkb_layout_first(ctx); assert(l); /* Empty layout list is usually a bug or a bad xml file */ while (l) { @@ -156,56 +159,63 @@ main(int argc, char **argv) struct rxkb_iso3166_code *iso3166; const char *variant = rxkb_layout_get_variant(l); const char *brief = rxkb_layout_get_brief(l); - bool first; - printf("- %s%s%s%s:%s:%s", + printf("- layout: '%s'\n" + " variant: '%s'\n" + " brief: '%s'\n" + " description: %s\n", rxkb_layout_get_name(l), - variant ? "(" : "", variant ? variant : "", - variant ? ")" : "", - brief ? brief : "", + brief ? brief : "''", rxkb_layout_get_description(l)); + printf(" iso639: ["); iso639 = rxkb_layout_get_iso639_first(l); - if (iso639) - printf(":iso639-"); - first = true; - while (iso639) { - printf("%s%s", first ? "" : ",", rxkb_iso639_code_get_code(iso639)); - iso639 = rxkb_iso639_code_next(iso639); - first = false; + if (iso639) { + const char *sep = ""; + while (iso639) { + printf("%s'%s'", sep, rxkb_iso639_code_get_code(iso639)); + iso639 = rxkb_iso639_code_next(iso639); + sep = ", "; + } } + printf("]\n"); + printf(" iso3166: ["); iso3166 = rxkb_layout_get_iso3166_first(l); - if (iso3166) - printf(":iso3166-"); - first = true; - while (iso3166) { - printf("%s%s", first ? "" : ",", rxkb_iso3166_code_get_code(iso3166)); - iso3166 = rxkb_iso3166_code_next(iso3166); - first = false; + if (iso3166) { + const char *sep = ""; + while (iso3166) { + printf("%s'%s'", sep, rxkb_iso3166_code_get_code(iso3166)); + iso3166 = rxkb_iso3166_code_next(iso3166); + sep = ", "; + } } - - printf("\n"); + printf("]\n"); l = rxkb_layout_next(l); } printf("\n"); - printf("Options:\n"); + printf("option_groups:\n"); g = rxkb_option_group_first(ctx); assert(g); /* Empty option goups list is usually a bug or a bad xml file */ while (g) { struct rxkb_option *o; - printf("- %s:%s (%s)\n", + printf("- name: '%s'\n" + " description: %s\n" + " allows_multiple: %s\n" + " options:\n", rxkb_option_group_get_name(g), rxkb_option_group_get_description(g), - rxkb_option_group_allows_multiple(g) ? "multiple" : "single"); + rxkb_option_group_allows_multiple(g) ? "true" : "false"); o = rxkb_option_first(g); assert(o); /* Empty option list is usually a bug or a bad xml file */ while (o) { const char *brief = rxkb_option_get_brief(o); - printf(" - %s:%s:%s\n", + printf(" - name: '%s'\n" + " brief: '%s'\n" + " description: '%s'\n", rxkb_option_get_name(o), brief ? brief : "", rxkb_option_get_description(o)); diff --git a/tools/xkbcli-how-to-type.1 b/tools/xkbcli-how-to-type.1 index 5211d0f..d5002ae 100644 --- a/tools/xkbcli-how-to-type.1 +++ b/tools/xkbcli-how-to-type.1 @@ -9,7 +9,7 @@ .Sh SYNOPSIS .Nm .Op options -.Ar codepoint +.Ar codepoint/keysym . .Sh DESCRIPTION .Nm @@ -17,6 +17,9 @@ prints the key combinations (keycode + modifiers) in the keymap's layouts which would produce the given Unicode codepoint. . .Bl -tag -width Ds +.It Fl \-keysym +Treat the argument as a keysym, not a Unicode codepoint +. .It Fl \-rules Ar rules The XKB ruleset . diff --git a/tools/xkbcli-interactive-evdev.1 b/tools/xkbcli-interactive-evdev.1 index be1b70f..58be555 100644 --- a/tools/xkbcli-interactive-evdev.1 +++ b/tools/xkbcli-interactive-evdev.1 @@ -14,7 +14,7 @@ .Nm is a commandline tool to interactively debug XKB keymaps by listening to .Pa /dev/input/eventX -evdev devices (Linux). +evdev devices. . .Pp .Nm diff --git a/tools/xkbcli-list.1 b/tools/xkbcli-list.1 index a72477b..66ea09b 100644 --- a/tools/xkbcli-list.1 +++ b/tools/xkbcli-list.1 @@ -1,4 +1,4 @@ -.Dd July 27, 2020 +.Dd November 1, 2021 .Dt XKBCLI\-LIST 1 .Os . @@ -11,11 +11,11 @@ .Op Pa /path/to/xkbbase Oo Pa /path/to/xkbbase Oc ... . .Sh DESCRIPTION -.Nm -is a commandline tool to list available model, layout, variant and option (MLVO) values from the XKB registry. +List available model, layout, variant and option (MLVO) values from the XKB registry. +The output is in YAML 1.2 format. . .Pp -Positional arguments provided on the commandline are treated as XKB base directory installations. +Positional arguments are treated as XKB base directory installations. . .Bl -tag -width Ds .It Fl \-help diff --git a/tools/xkbcli.1 b/tools/xkbcli.1 index 9ea0416..18f7732 100644 --- a/tools/xkbcli.1 +++ b/tools/xkbcli.1 @@ -27,6 +27,10 @@ Print the version and exit . .Ss COMMANDS .Bl -tag -width Ds +.It Ic compile\-keymap +Compile an XKB keymap, see +.Xr xkbcli\-compile\-keymap 1 + .It Ic how\-to\-type Show how to type a given Unicode codepoint, see .Xr xkbcli\-how\-to\-type 1 @@ -40,7 +44,7 @@ Interactive debugger for XKB keymaps for Wayland, see .Xr xkbcli\-interactive\-wayland 1 . .It Ic interactive\-evdev -Interactive debugger for XKB keymaps for evdev (Linux), see +Interactive debugger for XKB keymaps for evdev, see .Xr xkbcli\-interactive\-evdev 1 . .It Ic list diff --git a/tools/xkbcli.c b/tools/xkbcli.c index 1f3ed3f..75f72fe 100644 --- a/tools/xkbcli.c +++ b/tools/xkbcli.c @@ -55,7 +55,7 @@ usage(void) #endif #if HAVE_XKBCLI_INTERACTIVE_EVDEV " interactive-evdev\n" - " Interactive debugger for XKB keymaps for evdev (Linux)\n" + " Interactive debugger for XKB keymaps for evdev\n" "\n" #endif #if HAVE_XKBCLI_COMPILE_KEYMAP diff --git a/xkbcommon/xkbcommon-compat.h b/xkbcommon/xkbcommon-compat.h deleted file mode 100644 index 299732f..0000000 --- a/xkbcommon/xkbcommon-compat.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright © 2012 Daniel Stone - * - * 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. - * - * Author: Daniel Stone - */ - -#ifndef _XKBCOMMON_COMPAT_H -#define _XKBCOMMON_COMPAT_H - -/** - * Renamed keymap API. - */ -#define xkb_group_index_t xkb_layout_index_t -#define xkb_group_mask_t xkb_layout_mask_t -#define xkb_map_compile_flags xkb_keymap_compile_flags -#define XKB_GROUP_INVALID XKB_LAYOUT_INVALID - -#define XKB_STATE_DEPRESSED \ - (XKB_STATE_MODS_DEPRESSED | XKB_STATE_LAYOUT_DEPRESSED) -#define XKB_STATE_LATCHED \ - (XKB_STATE_MODS_LATCHED | XKB_STATE_LAYOUT_LATCHED) -#define XKB_STATE_LOCKED \ - (XKB_STATE_MODS_LOCKED | XKB_STATE_LAYOUT_LOCKED) -#define XKB_STATE_EFFECTIVE \ - (XKB_STATE_DEPRESSED | XKB_STATE_LATCHED | XKB_STATE_LOCKED | \ - XKB_STATE_MODS_EFFECTIVE | XKB_STATE_LAYOUT_EFFECTIVE) - -#define xkb_map_new_from_names(context, names, flags) \ - xkb_keymap_new_from_names(context, names, flags) -#define xkb_map_new_from_file(context, file, format, flags) \ - xkb_keymap_new_from_file(context, file, format, flags) -#define xkb_map_new_from_string(context, string, format, flags) \ - xkb_keymap_new_from_string(context, string, format, flags) -#define xkb_map_get_as_string(keymap) \ - xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1) -#define xkb_map_ref(keymap) xkb_keymap_ref(keymap) -#define xkb_map_unref(keymap) xkb_keymap_unref(keymap) - -#define xkb_map_num_mods(keymap) xkb_keymap_num_mods(keymap) -#define xkb_map_mod_get_name(keymap, idx) xkb_keymap_mod_get_name(keymap, idx) -#define xkb_map_mod_get_index(keymap, str) xkb_keymap_mod_get_index(keymap, str) -#define xkb_key_mod_index_is_consumed(state, key, mod) \ - xkb_state_mod_index_is_consumed(state, key, mod) -#define xkb_key_mod_mask_remove_consumed(state, key, modmask) \ - xkb_state_mod_mask_remove_consumed(state, key, modmask) - -#define xkb_map_num_groups(keymap) xkb_keymap_num_layouts(keymap) -#define xkb_key_num_groups(keymap, key) \ - xkb_keymap_num_layouts_for_key(keymap, key) -#define xkb_map_group_get_name(keymap, idx) \ - xkb_keymap_layout_get_name(keymap, idx) -#define xkb_map_group_get_index(keymap, str) \ - xkb_keymap_layout_get_index(keymap, str) - -#define xkb_map_num_leds(keymap) xkb_keymap_num_leds(keymap) -#define xkb_map_led_get_name(keymap, idx) xkb_keymap_led_get_name(keymap, idx) -#define xkb_map_led_get_index(keymap, str) \ - xkb_keymap_led_get_index(keymap, str) - -#define xkb_key_repeats(keymap, key) xkb_keymap_key_repeats(keymap, key) - -#define xkb_key_get_syms(state, key, syms_out) \ - xkb_state_key_get_syms(state, key, syms_out) - -#define xkb_state_group_name_is_active(state, name, type) \ - xkb_state_layout_name_is_active(state, name, type) -#define xkb_state_group_index_is_active(state, idx, type) \ - xkb_state_layout_index_is_active(state, idx, type) - -#define xkb_state_serialize_group(state, component) \ - xkb_state_serialize_layout(state, component) - -#define xkb_state_get_map(state) xkb_state_get_keymap(state) - -/* Not needed anymore, since there's NO_FLAGS. */ -#define XKB_MAP_COMPILE_PLACEHOLDER XKB_KEYMAP_COMPILE_NO_FLAGS -#define XKB_MAP_COMPILE_NO_FLAGS XKB_KEYMAP_COMPILE_NO_FLAGS - -#endif diff --git a/xkbcommon/xkbcommon-compose.h b/xkbcommon/xkbcommon-compose.h deleted file mode 100644 index 8b41b98..0000000 --- a/xkbcommon/xkbcommon-compose.h +++ /dev/null @@ -1,500 +0,0 @@ -/* - * Copyright © 2013 Ran Benita - * - * 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. - */ - -#ifndef _XKBCOMMON_COMPOSE_H -#define _XKBCOMMON_COMPOSE_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @file - * libxkbcommon Compose API - support for Compose and dead-keys. - */ - -/** - * @defgroup compose Compose and dead-keys support - * Support for Compose and dead-keys. - * @since 0.5.0 - * - * @{ - */ - -/** - * @page compose-overview Overview - * @parblock - * - * Compose and dead-keys are a common feature of many keyboard input - * systems. They extend the range of the keysysm that can be produced - * directly from a keyboard by using a sequence of key strokes, instead - * of just one. - * - * Here are some example sequences, in the libX11 Compose file format: - * - * : "á" aacute # LATIN SMALL LETTER A WITH ACUTE - * : "@" at # COMMERCIAL AT - * - * When the user presses a key which produces the `` keysym, - * nothing initially happens (thus the key is dubbed a "dead-key"). But - * when the user enters ``, "á" is "composed", in place of "a". If - * instead the user had entered a keysym which does not follow - * `` in any compose sequence, the sequence is said to be - * "cancelled". - * - * Compose files define many such sequences. For a description of the - * common file format for Compose files, see the Compose(5) man page. - * - * A successfuly-composed sequence has two results: a keysym and a UTF-8 - * string. At least one of the two is defined for each sequence. If only - * a keysym is given, the keysym's string representation is used for the - * result string (using xkb_keysym_to_utf8()). - * - * This library provides low-level support for Compose file parsing and - * processing. Higher-level APIs (such as libX11's `Xutf8LookupString`(3)) - * may be built upon it, or it can be used directly. - * - * @endparblock - */ - -/** - * @page compose-conflicting Conflicting Sequences - * @parblock - * - * To avoid ambiguity, a sequence is not allowed to be a prefix of another. - * In such a case, the conflict is resolved thus: - * - * 1. A longer sequence overrides a shorter one. - * 2. An equal sequence overrides an existing one. - * 3. A shorter sequence does not override a longer one. - * - * Sequences of length 1 are allowed. - * - * @endparblock - */ - -/** - * @page compose-cancellation Cancellation Behavior - * @parblock - * - * What should happen when a sequence is cancelled? For example, consider - * there are only the above sequences, and the input keysyms are - * ` `. There are a few approaches: - * - * 1. Swallow the cancelling keysym; that is, no keysym is produced. - * This is the approach taken by libX11. - * 2. Let the cancelling keysym through; that is, `` is produced. - * 3. Replay the entire sequence; that is, ` ` is produced. - * This is the approach taken by Microsoft Windows (approximately; - * instead of ``, the underlying key is used. This is - * difficult to simulate with XKB keymaps). - * - * You can program whichever approach best fits users' expectations. - * - * @endparblock - */ - -/** - * @struct xkb_compose_table - * Opaque Compose table object. - * - * The compose table holds the definitions of the Compose sequences, as - * gathered from Compose files. It is immutable. - */ -struct xkb_compose_table; - -/** - * @struct xkb_compose_state - * Opaque Compose state object. - * - * The compose state maintains state for compose sequence matching, such - * as which possible sequences are being matched, and the position within - * these sequences. It acts as a simple state machine wherein keysyms are - * the input, and composed keysyms and strings are the output. - * - * The compose state is usually associated with a keyboard device. - */ -struct xkb_compose_state; - -/** Flags affecting Compose file compilation. */ -enum xkb_compose_compile_flags { - /** Do not apply any flags. */ - XKB_COMPOSE_COMPILE_NO_FLAGS = 0 -}; - -/** The recognized Compose file formats. */ -enum xkb_compose_format { - /** The classic libX11 Compose text format, described in Compose(5). */ - XKB_COMPOSE_FORMAT_TEXT_V1 = 1 -}; - -/** - * @page compose-locale Compose Locale - * @parblock - * - * Compose files are locale dependent: - * - Compose files are written for a locale, and the locale is used when - * searching for the appropriate file to use. - * - Compose files may reference the locale internally, with directives - * such as \%L. - * - * As such, functions like xkb_compose_table_new_from_locale() require - * a `locale` parameter. This will usually be the current locale (see - * locale(7) for more details). You may also want to allow the user to - * explicitly configure it, so he can use the Compose file of a given - * locale, but not use that locale for other things. - * - * You may query the current locale as follows: - * @code - * const char *locale; - * locale = setlocale(LC_CTYPE, NULL); - * @endcode - * - * This will only give useful results if the program had previously set - * the current locale using setlocale(3), with `LC_CTYPE` or `LC_ALL` - * and a non-NULL argument. - * - * If you prefer not to use the locale system of the C runtime library, - * you may nevertheless obtain the user's locale directly using - * environment variables, as described in locale(7). For example, - * @code - * const char *locale; - * locale = getenv("LC_ALL"); - * if (!locale || !*locale) - * locale = getenv("LC_CTYPE"); - * if (!locale || !*locale) - * locale = getenv("LANG"); - * if (!locale || !*locale) - * locale = "C"; - * @endcode - * - * Note that some locales supported by the C standard library may not - * have a Compose file assigned. - * - * @endparblock - */ - -/** - * Create a compose table for a given locale. - * - * The locale is used for searching the file-system for an appropriate - * Compose file. The search order is described in Compose(5). It is - * affected by the following environment variables: - * - * 1. `XCOMPOSEFILE` - see Compose(5). - * 2. `XDG_CONFIG_HOME` - before `$HOME/.XCompose` is checked, - * `$XDG_CONFIG_HOME/XCompose` is checked (with a fall back to - * `$HOME/.config/XCompose` if `XDG_CONFIG_HOME` is not defined). - * This is a libxkbcommon extension to the search procedure in - * Compose(5) (since libxkbcommon 1.0.0). Note that other - * implementations, such as libX11, might not find a Compose file in - * this path. - * 3. `HOME` - see Compose(5). - * 4. `XLOCALEDIR` - if set, used as the base directory for the system's - * X locale files, e.g. `/usr/share/X11/locale`, instead of the - * preconfigured directory. - * - * @param context - * The library context in which to create the compose table. - * @param locale - * The current locale. See @ref compose-locale. - * \n - * The value is copied, so it is safe to pass the result of getenv(3) - * (or similar) without fear of it being invalidated by a subsequent - * setenv(3) (or similar). - * @param flags - * Optional flags for the compose table, or 0. - * - * @returns A compose table for the given locale, or NULL if the - * compilation failed or a Compose file was not found. - * - * @memberof xkb_compose_table - */ -struct xkb_compose_table * -xkb_compose_table_new_from_locale(struct xkb_context *context, - const char *locale, - enum xkb_compose_compile_flags flags); - -/** - * Create a new compose table from a Compose file. - * - * @param context - * The library context in which to create the compose table. - * @param file - * The Compose file to compile. - * @param locale - * The current locale. See @ref compose-locale. - * @param format - * The text format of the Compose file to compile. - * @param flags - * Optional flags for the compose table, or 0. - * - * @returns A compose table compiled from the given file, or NULL if - * the compilation failed. - * - * @memberof xkb_compose_table - */ -struct xkb_compose_table * -xkb_compose_table_new_from_file(struct xkb_context *context, - FILE *file, - const char *locale, - enum xkb_compose_format format, - enum xkb_compose_compile_flags flags); - -/** - * Create a new compose table from a memory buffer. - * - * This is just like xkb_compose_table_new_from_file(), but instead of - * a file, gets the table as one enormous string. - * - * @see xkb_compose_table_new_from_file() - * @memberof xkb_compose_table - */ -struct xkb_compose_table * -xkb_compose_table_new_from_buffer(struct xkb_context *context, - const char *buffer, size_t length, - const char *locale, - enum xkb_compose_format format, - enum xkb_compose_compile_flags flags); - -/** - * Take a new reference on a compose table. - * - * @returns The passed in object. - * - * @memberof xkb_compose_table - */ -struct xkb_compose_table * -xkb_compose_table_ref(struct xkb_compose_table *table); - -/** - * Release a reference on a compose table, and possibly free it. - * - * @param table The object. If it is NULL, this function does nothing. - * - * @memberof xkb_compose_table - */ -void -xkb_compose_table_unref(struct xkb_compose_table *table); - -/** Flags for compose state creation. */ -enum xkb_compose_state_flags { - /** Do not apply any flags. */ - XKB_COMPOSE_STATE_NO_FLAGS = 0 -}; - -/** - * Create a new compose state object. - * - * @param table - * The compose table the state will use. - * @param flags - * Optional flags for the compose state, or 0. - * - * @returns A new compose state, or NULL on failure. - * - * @memberof xkb_compose_state - */ -struct xkb_compose_state * -xkb_compose_state_new(struct xkb_compose_table *table, - enum xkb_compose_state_flags flags); - -/** - * Take a new reference on a compose state object. - * - * @returns The passed in object. - * - * @memberof xkb_compose_state - */ -struct xkb_compose_state * -xkb_compose_state_ref(struct xkb_compose_state *state); - -/** - * Release a reference on a compose state object, and possibly free it. - * - * @param state The object. If NULL, do nothing. - * - * @memberof xkb_compose_state - */ -void -xkb_compose_state_unref(struct xkb_compose_state *state); - -/** - * Get the compose table which a compose state object is using. - * - * @returns The compose table which was passed to xkb_compose_state_new() - * when creating this state object. - * - * This function does not take a new reference on the compose table; you - * must explicitly reference it yourself if you plan to use it beyond the - * lifetime of the state. - * - * @memberof xkb_compose_state - */ -struct xkb_compose_table * -xkb_compose_state_get_compose_table(struct xkb_compose_state *state); - -/** Status of the Compose sequence state machine. */ -enum xkb_compose_status { - /** The initial state; no sequence has started yet. */ - XKB_COMPOSE_NOTHING, - /** In the middle of a sequence. */ - XKB_COMPOSE_COMPOSING, - /** A complete sequence has been matched. */ - XKB_COMPOSE_COMPOSED, - /** The last sequence was cancelled due to an unmatched keysym. */ - XKB_COMPOSE_CANCELLED -}; - -/** The effect of a keysym fed to xkb_compose_state_feed(). */ -enum xkb_compose_feed_result { - /** The keysym had no effect - it did not affect the status. */ - XKB_COMPOSE_FEED_IGNORED, - /** The keysym started, advanced or cancelled a sequence. */ - XKB_COMPOSE_FEED_ACCEPTED -}; - -/** - * Feed one keysym to the Compose sequence state machine. - * - * This function can advance into a compose sequence, cancel a sequence, - * start a new sequence, or do nothing in particular. The resulting - * status may be observed with xkb_compose_state_get_status(). - * - * Some keysyms, such as keysyms for modifier keys, are ignored - they - * have no effect on the status or otherwise. - * - * The following is a description of the possible status transitions, in - * the format CURRENT STATUS => NEXT STATUS, given a non-ignored input - * keysym `keysym`: - * - @verbatim - NOTHING or CANCELLED or COMPOSED => - NOTHING if keysym does not start a sequence. - COMPOSING if keysym starts a sequence. - COMPOSED if keysym starts and terminates a single-keysym sequence. - - COMPOSING => - COMPOSING if keysym advances any of the currently possible - sequences but does not terminate any of them. - COMPOSED if keysym terminates one of the currently possible - sequences. - CANCELLED if keysym does not advance any of the currently - possible sequences. - @endverbatim - * - * The current Compose formats do not support multiple-keysyms. - * Therefore, if you are using a function such as xkb_state_key_get_syms() - * and it returns more than one keysym, consider feeding XKB_KEY_NoSymbol - * instead. - * - * @param state - * The compose state object. - * @param keysym - * A keysym, usually obtained after a key-press event, with a - * function such as xkb_state_key_get_one_sym(). - * - * @returns Whether the keysym was ignored. This is useful, for example, - * if you want to keep a record of the sequence matched thus far. - * - * @memberof xkb_compose_state - */ -enum xkb_compose_feed_result -xkb_compose_state_feed(struct xkb_compose_state *state, - xkb_keysym_t keysym); - -/** - * Reset the Compose sequence state machine. - * - * The status is set to XKB_COMPOSE_NOTHING, and the current sequence - * is discarded. - * - * @memberof xkb_compose_state - */ -void -xkb_compose_state_reset(struct xkb_compose_state *state); - -/** - * Get the current status of the compose state machine. - * - * @see xkb_compose_status - * @memberof xkb_compose_state - **/ -enum xkb_compose_status -xkb_compose_state_get_status(struct xkb_compose_state *state); - -/** - * Get the result Unicode/UTF-8 string for a composed sequence. - * - * See @ref compose-overview for more details. This function is only - * useful when the status is XKB_COMPOSE_COMPOSED. - * - * @param[in] state - * The compose state. - * @param[out] buffer - * A buffer to write the string into. - * @param[in] size - * Size of the buffer. - * - * @warning If the buffer passed is too small, the string is truncated - * (though still NUL-terminated). - * - * @returns - * The number of bytes required for the string, excluding the NUL byte. - * If the sequence is not complete, or does not have a viable result - * string, returns 0, and sets `buffer` to the empty string (if possible). - * @returns - * You may check if truncation has occurred by comparing the return value - * with the size of `buffer`, similarly to the `snprintf`(3) function. - * You may safely pass NULL and 0 to `buffer` and `size` to find the - * required size (without the NUL-byte). - * - * @memberof xkb_compose_state - **/ -int -xkb_compose_state_get_utf8(struct xkb_compose_state *state, - char *buffer, size_t size); - -/** - * Get the result keysym for a composed sequence. - * - * See @ref compose-overview for more details. This function is only - * useful when the status is XKB_COMPOSE_COMPOSED. - * - * @returns The result keysym. If the sequence is not complete, or does - * not specify a result keysym, returns XKB_KEY_NoSymbol. - * - * @memberof xkb_compose_state - **/ -xkb_keysym_t -xkb_compose_state_get_one_sym(struct xkb_compose_state *state); - -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* _XKBCOMMON_COMPOSE_H */ diff --git a/xkbcommon/xkbcommon-keysyms.h b/xkbcommon/xkbcommon-keysyms.h deleted file mode 100644 index 540704e..0000000 --- a/xkbcommon/xkbcommon-keysyms.h +++ /dev/null @@ -1,3009 +0,0 @@ -#ifndef _XKBCOMMON_KEYSYMS_H -#define _XKBCOMMON_KEYSYMS_H - -/* This file is autogenerated; please do not commit directly. */ - -#define XKB_KEY_NoSymbol 0x000000 /* Special KeySym */ - -/*********************************************************** -Copyright 1987, 1994, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice 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 OPEN GROUP 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. - -Except as contained in this notice, the name of The Open Group shall -not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization -from The Open Group. - - -Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Digital not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -******************************************************************/ - -/* - * The "X11 Window System Protocol" standard defines in Appendix A the - * keysym codes. These 29-bit integer values identify characters or - * functions associated with each key (e.g., via the visible - * engraving) of a keyboard layout. This file assigns mnemonic macro - * names for these keysyms. - * - * This file is also compiled (by src/util/makekeys.c in libX11) into - * hash tables that can be accessed with X11 library functions such as - * XStringToKeysym() and XKeysymToString(). - * - * Where a keysym corresponds one-to-one to an ISO 10646 / Unicode - * character, this is noted in a comment that provides both the U+xxxx - * Unicode position, as well as the official Unicode name of the - * character. - * - * Where the correspondence is either not one-to-one or semantically - * unclear, the Unicode position and name are enclosed in - * parentheses. Such legacy keysyms should be considered deprecated - * and are not recommended for use in future keyboard mappings. - * - * For any future extension of the keysyms with characters already - * found in ISO 10646 / Unicode, the following algorithm shall be - * used. The new keysym code position will simply be the character's - * Unicode number plus 0x01000000. The keysym values in the range - * 0x01000100 to 0x0110ffff are reserved to represent Unicode - * characters in the range U+0100 to U+10FFFF. - * - * While most newer Unicode-based X11 clients do already accept - * Unicode-mapped keysyms in the range 0x01000100 to 0x0110ffff, it - * will remain necessary for clients -- in the interest of - * compatibility with existing servers -- to also understand the - * existing legacy keysym values in the range 0x0100 to 0x20ff. - * - * Where several mnemonic names are defined for the same keysym in this - * file, all but the first one listed should be considered deprecated. - * - * Mnemonic names for keysyms are defined in this file with lines - * that match one of these Perl regular expressions: - * - * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\* U+([0-9A-F]{4,6}) (.*) \*\/\s*$/ - * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\*\(U+([0-9A-F]{4,6}) (.*)\)\*\/\s*$/ - * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/ - * - * Before adding new keysyms, please do consider the following: In - * addition to the keysym names defined in this file, the - * XStringToKeysym() and XKeysymToString() functions will also handle - * any keysym string of the form "U0020" to "U007E" and "U00A0" to - * "U10FFFF" for all possible Unicode characters. In other words, - * every possible Unicode character has already a keysym string - * defined algorithmically, even if it is not listed here. Therefore, - * defining an additional keysym macro is only necessary where a - * non-hexadecimal mnemonic name is needed, or where the new keysym - * does not represent any existing Unicode character. - * - * When adding new keysyms to this file, do not forget to also update the - * following as needed: - * - * - the mappings in src/KeyBind.c in the libX11 repo - * https://gitlab.freedesktop.org/xorg/lib/libx11 - * - * - the protocol specification in specs/keysyms.xml in this repo - * https://gitlab.freedesktop.org/xorg/proto/xorgproto - * - */ - -#define XKB_KEY_VoidSymbol 0xffffff /* Void symbol */ - -/* - * TTY function keys, cleverly chosen to map to ASCII, for convenience of - * programming, but could have been arbitrary (at the cost of lookup - * tables in client code). - */ - -#define XKB_KEY_BackSpace 0xff08 /* Back space, back char */ -#define XKB_KEY_Tab 0xff09 -#define XKB_KEY_Linefeed 0xff0a /* Linefeed, LF */ -#define XKB_KEY_Clear 0xff0b -#define XKB_KEY_Return 0xff0d /* Return, enter */ -#define XKB_KEY_Pause 0xff13 /* Pause, hold */ -#define XKB_KEY_Scroll_Lock 0xff14 -#define XKB_KEY_Sys_Req 0xff15 -#define XKB_KEY_Escape 0xff1b -#define XKB_KEY_Delete 0xffff /* Delete, rubout */ - - - -/* International & multi-key character composition */ - -#define XKB_KEY_Multi_key 0xff20 /* Multi-key character compose */ -#define XKB_KEY_Codeinput 0xff37 -#define XKB_KEY_SingleCandidate 0xff3c -#define XKB_KEY_MultipleCandidate 0xff3d -#define XKB_KEY_PreviousCandidate 0xff3e - -/* Japanese keyboard support */ - -#define XKB_KEY_Kanji 0xff21 /* Kanji, Kanji convert */ -#define XKB_KEY_Muhenkan 0xff22 /* Cancel Conversion */ -#define XKB_KEY_Henkan_Mode 0xff23 /* Start/Stop Conversion */ -#define XKB_KEY_Henkan 0xff23 /* Alias for Henkan_Mode */ -#define XKB_KEY_Romaji 0xff24 /* to Romaji */ -#define XKB_KEY_Hiragana 0xff25 /* to Hiragana */ -#define XKB_KEY_Katakana 0xff26 /* to Katakana */ -#define XKB_KEY_Hiragana_Katakana 0xff27 /* Hiragana/Katakana toggle */ -#define XKB_KEY_Zenkaku 0xff28 /* to Zenkaku */ -#define XKB_KEY_Hankaku 0xff29 /* to Hankaku */ -#define XKB_KEY_Zenkaku_Hankaku 0xff2a /* Zenkaku/Hankaku toggle */ -#define XKB_KEY_Touroku 0xff2b /* Add to Dictionary */ -#define XKB_KEY_Massyo 0xff2c /* Delete from Dictionary */ -#define XKB_KEY_Kana_Lock 0xff2d /* Kana Lock */ -#define XKB_KEY_Kana_Shift 0xff2e /* Kana Shift */ -#define XKB_KEY_Eisu_Shift 0xff2f /* Alphanumeric Shift */ -#define XKB_KEY_Eisu_toggle 0xff30 /* Alphanumeric toggle */ -#define XKB_KEY_Kanji_Bangou 0xff37 /* Codeinput */ -#define XKB_KEY_Zen_Koho 0xff3d /* Multiple/All Candidate(s) */ -#define XKB_KEY_Mae_Koho 0xff3e /* Previous Candidate */ - -/* 0xff31 thru 0xff3f are under XK_KOREAN */ - -/* Cursor control & motion */ - -#define XKB_KEY_Home 0xff50 -#define XKB_KEY_Left 0xff51 /* Move left, left arrow */ -#define XKB_KEY_Up 0xff52 /* Move up, up arrow */ -#define XKB_KEY_Right 0xff53 /* Move right, right arrow */ -#define XKB_KEY_Down 0xff54 /* Move down, down arrow */ -#define XKB_KEY_Prior 0xff55 /* Prior, previous */ -#define XKB_KEY_Page_Up 0xff55 -#define XKB_KEY_Next 0xff56 /* Next */ -#define XKB_KEY_Page_Down 0xff56 -#define XKB_KEY_End 0xff57 /* EOL */ -#define XKB_KEY_Begin 0xff58 /* BOL */ - - -/* Misc functions */ - -#define XKB_KEY_Select 0xff60 /* Select, mark */ -#define XKB_KEY_Print 0xff61 -#define XKB_KEY_Execute 0xff62 /* Execute, run, do */ -#define XKB_KEY_Insert 0xff63 /* Insert, insert here */ -#define XKB_KEY_Undo 0xff65 -#define XKB_KEY_Redo 0xff66 /* Redo, again */ -#define XKB_KEY_Menu 0xff67 -#define XKB_KEY_Find 0xff68 /* Find, search */ -#define XKB_KEY_Cancel 0xff69 /* Cancel, stop, abort, exit */ -#define XKB_KEY_Help 0xff6a /* Help */ -#define XKB_KEY_Break 0xff6b -#define XKB_KEY_Mode_switch 0xff7e /* Character set switch */ -#define XKB_KEY_script_switch 0xff7e /* Alias for mode_switch */ -#define XKB_KEY_Num_Lock 0xff7f - -/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ - -#define XKB_KEY_KP_Space 0xff80 /* Space */ -#define XKB_KEY_KP_Tab 0xff89 -#define XKB_KEY_KP_Enter 0xff8d /* Enter */ -#define XKB_KEY_KP_F1 0xff91 /* PF1, KP_A, ... */ -#define XKB_KEY_KP_F2 0xff92 -#define XKB_KEY_KP_F3 0xff93 -#define XKB_KEY_KP_F4 0xff94 -#define XKB_KEY_KP_Home 0xff95 -#define XKB_KEY_KP_Left 0xff96 -#define XKB_KEY_KP_Up 0xff97 -#define XKB_KEY_KP_Right 0xff98 -#define XKB_KEY_KP_Down 0xff99 -#define XKB_KEY_KP_Prior 0xff9a -#define XKB_KEY_KP_Page_Up 0xff9a -#define XKB_KEY_KP_Next 0xff9b -#define XKB_KEY_KP_Page_Down 0xff9b -#define XKB_KEY_KP_End 0xff9c -#define XKB_KEY_KP_Begin 0xff9d -#define XKB_KEY_KP_Insert 0xff9e -#define XKB_KEY_KP_Delete 0xff9f -#define XKB_KEY_KP_Equal 0xffbd /* Equals */ -#define XKB_KEY_KP_Multiply 0xffaa -#define XKB_KEY_KP_Add 0xffab -#define XKB_KEY_KP_Separator 0xffac /* Separator, often comma */ -#define XKB_KEY_KP_Subtract 0xffad -#define XKB_KEY_KP_Decimal 0xffae -#define XKB_KEY_KP_Divide 0xffaf - -#define XKB_KEY_KP_0 0xffb0 -#define XKB_KEY_KP_1 0xffb1 -#define XKB_KEY_KP_2 0xffb2 -#define XKB_KEY_KP_3 0xffb3 -#define XKB_KEY_KP_4 0xffb4 -#define XKB_KEY_KP_5 0xffb5 -#define XKB_KEY_KP_6 0xffb6 -#define XKB_KEY_KP_7 0xffb7 -#define XKB_KEY_KP_8 0xffb8 -#define XKB_KEY_KP_9 0xffb9 - - - -/* - * Auxiliary functions; note the duplicate definitions for left and right - * function keys; Sun keyboards and a few other manufacturers have such - * function key groups on the left and/or right sides of the keyboard. - * We've not found a keyboard with more than 35 function keys total. - */ - -#define XKB_KEY_F1 0xffbe -#define XKB_KEY_F2 0xffbf -#define XKB_KEY_F3 0xffc0 -#define XKB_KEY_F4 0xffc1 -#define XKB_KEY_F5 0xffc2 -#define XKB_KEY_F6 0xffc3 -#define XKB_KEY_F7 0xffc4 -#define XKB_KEY_F8 0xffc5 -#define XKB_KEY_F9 0xffc6 -#define XKB_KEY_F10 0xffc7 -#define XKB_KEY_F11 0xffc8 -#define XKB_KEY_L1 0xffc8 -#define XKB_KEY_F12 0xffc9 -#define XKB_KEY_L2 0xffc9 -#define XKB_KEY_F13 0xffca -#define XKB_KEY_L3 0xffca -#define XKB_KEY_F14 0xffcb -#define XKB_KEY_L4 0xffcb -#define XKB_KEY_F15 0xffcc -#define XKB_KEY_L5 0xffcc -#define XKB_KEY_F16 0xffcd -#define XKB_KEY_L6 0xffcd -#define XKB_KEY_F17 0xffce -#define XKB_KEY_L7 0xffce -#define XKB_KEY_F18 0xffcf -#define XKB_KEY_L8 0xffcf -#define XKB_KEY_F19 0xffd0 -#define XKB_KEY_L9 0xffd0 -#define XKB_KEY_F20 0xffd1 -#define XKB_KEY_L10 0xffd1 -#define XKB_KEY_F21 0xffd2 -#define XKB_KEY_R1 0xffd2 -#define XKB_KEY_F22 0xffd3 -#define XKB_KEY_R2 0xffd3 -#define XKB_KEY_F23 0xffd4 -#define XKB_KEY_R3 0xffd4 -#define XKB_KEY_F24 0xffd5 -#define XKB_KEY_R4 0xffd5 -#define XKB_KEY_F25 0xffd6 -#define XKB_KEY_R5 0xffd6 -#define XKB_KEY_F26 0xffd7 -#define XKB_KEY_R6 0xffd7 -#define XKB_KEY_F27 0xffd8 -#define XKB_KEY_R7 0xffd8 -#define XKB_KEY_F28 0xffd9 -#define XKB_KEY_R8 0xffd9 -#define XKB_KEY_F29 0xffda -#define XKB_KEY_R9 0xffda -#define XKB_KEY_F30 0xffdb -#define XKB_KEY_R10 0xffdb -#define XKB_KEY_F31 0xffdc -#define XKB_KEY_R11 0xffdc -#define XKB_KEY_F32 0xffdd -#define XKB_KEY_R12 0xffdd -#define XKB_KEY_F33 0xffde -#define XKB_KEY_R13 0xffde -#define XKB_KEY_F34 0xffdf -#define XKB_KEY_R14 0xffdf -#define XKB_KEY_F35 0xffe0 -#define XKB_KEY_R15 0xffe0 - -/* Modifiers */ - -#define XKB_KEY_Shift_L 0xffe1 /* Left shift */ -#define XKB_KEY_Shift_R 0xffe2 /* Right shift */ -#define XKB_KEY_Control_L 0xffe3 /* Left control */ -#define XKB_KEY_Control_R 0xffe4 /* Right control */ -#define XKB_KEY_Caps_Lock 0xffe5 /* Caps lock */ -#define XKB_KEY_Shift_Lock 0xffe6 /* Shift lock */ - -#define XKB_KEY_Meta_L 0xffe7 /* Left meta */ -#define XKB_KEY_Meta_R 0xffe8 /* Right meta */ -#define XKB_KEY_Alt_L 0xffe9 /* Left alt */ -#define XKB_KEY_Alt_R 0xffea /* Right alt */ -#define XKB_KEY_Super_L 0xffeb /* Left super */ -#define XKB_KEY_Super_R 0xffec /* Right super */ -#define XKB_KEY_Hyper_L 0xffed /* Left hyper */ -#define XKB_KEY_Hyper_R 0xffee /* Right hyper */ - -/* - * Keyboard (XKB) Extension function and modifier keys - * (from Appendix C of "The X Keyboard Extension: Protocol Specification") - * Byte 3 = 0xfe - */ - -#define XKB_KEY_ISO_Lock 0xfe01 -#define XKB_KEY_ISO_Level2_Latch 0xfe02 -#define XKB_KEY_ISO_Level3_Shift 0xfe03 -#define XKB_KEY_ISO_Level3_Latch 0xfe04 -#define XKB_KEY_ISO_Level3_Lock 0xfe05 -#define XKB_KEY_ISO_Level5_Shift 0xfe11 -#define XKB_KEY_ISO_Level5_Latch 0xfe12 -#define XKB_KEY_ISO_Level5_Lock 0xfe13 -#define XKB_KEY_ISO_Group_Shift 0xff7e /* Alias for mode_switch */ -#define XKB_KEY_ISO_Group_Latch 0xfe06 -#define XKB_KEY_ISO_Group_Lock 0xfe07 -#define XKB_KEY_ISO_Next_Group 0xfe08 -#define XKB_KEY_ISO_Next_Group_Lock 0xfe09 -#define XKB_KEY_ISO_Prev_Group 0xfe0a -#define XKB_KEY_ISO_Prev_Group_Lock 0xfe0b -#define XKB_KEY_ISO_First_Group 0xfe0c -#define XKB_KEY_ISO_First_Group_Lock 0xfe0d -#define XKB_KEY_ISO_Last_Group 0xfe0e -#define XKB_KEY_ISO_Last_Group_Lock 0xfe0f - -#define XKB_KEY_ISO_Left_Tab 0xfe20 -#define XKB_KEY_ISO_Move_Line_Up 0xfe21 -#define XKB_KEY_ISO_Move_Line_Down 0xfe22 -#define XKB_KEY_ISO_Partial_Line_Up 0xfe23 -#define XKB_KEY_ISO_Partial_Line_Down 0xfe24 -#define XKB_KEY_ISO_Partial_Space_Left 0xfe25 -#define XKB_KEY_ISO_Partial_Space_Right 0xfe26 -#define XKB_KEY_ISO_Set_Margin_Left 0xfe27 -#define XKB_KEY_ISO_Set_Margin_Right 0xfe28 -#define XKB_KEY_ISO_Release_Margin_Left 0xfe29 -#define XKB_KEY_ISO_Release_Margin_Right 0xfe2a -#define XKB_KEY_ISO_Release_Both_Margins 0xfe2b -#define XKB_KEY_ISO_Fast_Cursor_Left 0xfe2c -#define XKB_KEY_ISO_Fast_Cursor_Right 0xfe2d -#define XKB_KEY_ISO_Fast_Cursor_Up 0xfe2e -#define XKB_KEY_ISO_Fast_Cursor_Down 0xfe2f -#define XKB_KEY_ISO_Continuous_Underline 0xfe30 -#define XKB_KEY_ISO_Discontinuous_Underline 0xfe31 -#define XKB_KEY_ISO_Emphasize 0xfe32 -#define XKB_KEY_ISO_Center_Object 0xfe33 -#define XKB_KEY_ISO_Enter 0xfe34 - -#define XKB_KEY_dead_grave 0xfe50 -#define XKB_KEY_dead_acute 0xfe51 -#define XKB_KEY_dead_circumflex 0xfe52 -#define XKB_KEY_dead_tilde 0xfe53 -#define XKB_KEY_dead_perispomeni 0xfe53 /* alias for dead_tilde */ -#define XKB_KEY_dead_macron 0xfe54 -#define XKB_KEY_dead_breve 0xfe55 -#define XKB_KEY_dead_abovedot 0xfe56 -#define XKB_KEY_dead_diaeresis 0xfe57 -#define XKB_KEY_dead_abovering 0xfe58 -#define XKB_KEY_dead_doubleacute 0xfe59 -#define XKB_KEY_dead_caron 0xfe5a -#define XKB_KEY_dead_cedilla 0xfe5b -#define XKB_KEY_dead_ogonek 0xfe5c -#define XKB_KEY_dead_iota 0xfe5d -#define XKB_KEY_dead_voiced_sound 0xfe5e -#define XKB_KEY_dead_semivoiced_sound 0xfe5f -#define XKB_KEY_dead_belowdot 0xfe60 -#define XKB_KEY_dead_hook 0xfe61 -#define XKB_KEY_dead_horn 0xfe62 -#define XKB_KEY_dead_stroke 0xfe63 -#define XKB_KEY_dead_abovecomma 0xfe64 -#define XKB_KEY_dead_psili 0xfe64 /* alias for dead_abovecomma */ -#define XKB_KEY_dead_abovereversedcomma 0xfe65 -#define XKB_KEY_dead_dasia 0xfe65 /* alias for dead_abovereversedcomma */ -#define XKB_KEY_dead_doublegrave 0xfe66 -#define XKB_KEY_dead_belowring 0xfe67 -#define XKB_KEY_dead_belowmacron 0xfe68 -#define XKB_KEY_dead_belowcircumflex 0xfe69 -#define XKB_KEY_dead_belowtilde 0xfe6a -#define XKB_KEY_dead_belowbreve 0xfe6b -#define XKB_KEY_dead_belowdiaeresis 0xfe6c -#define XKB_KEY_dead_invertedbreve 0xfe6d -#define XKB_KEY_dead_belowcomma 0xfe6e -#define XKB_KEY_dead_currency 0xfe6f - -/* extra dead elements for German T3 layout */ -#define XKB_KEY_dead_lowline 0xfe90 -#define XKB_KEY_dead_aboveverticalline 0xfe91 -#define XKB_KEY_dead_belowverticalline 0xfe92 -#define XKB_KEY_dead_longsolidusoverlay 0xfe93 - -/* dead vowels for universal syllable entry */ -#define XKB_KEY_dead_a 0xfe80 -#define XKB_KEY_dead_A 0xfe81 -#define XKB_KEY_dead_e 0xfe82 -#define XKB_KEY_dead_E 0xfe83 -#define XKB_KEY_dead_i 0xfe84 -#define XKB_KEY_dead_I 0xfe85 -#define XKB_KEY_dead_o 0xfe86 -#define XKB_KEY_dead_O 0xfe87 -#define XKB_KEY_dead_u 0xfe88 -#define XKB_KEY_dead_U 0xfe89 -#define XKB_KEY_dead_small_schwa 0xfe8a -#define XKB_KEY_dead_capital_schwa 0xfe8b - -#define XKB_KEY_dead_greek 0xfe8c - -#define XKB_KEY_First_Virtual_Screen 0xfed0 -#define XKB_KEY_Prev_Virtual_Screen 0xfed1 -#define XKB_KEY_Next_Virtual_Screen 0xfed2 -#define XKB_KEY_Last_Virtual_Screen 0xfed4 -#define XKB_KEY_Terminate_Server 0xfed5 - -#define XKB_KEY_AccessX_Enable 0xfe70 -#define XKB_KEY_AccessX_Feedback_Enable 0xfe71 -#define XKB_KEY_RepeatKeys_Enable 0xfe72 -#define XKB_KEY_SlowKeys_Enable 0xfe73 -#define XKB_KEY_BounceKeys_Enable 0xfe74 -#define XKB_KEY_StickyKeys_Enable 0xfe75 -#define XKB_KEY_MouseKeys_Enable 0xfe76 -#define XKB_KEY_MouseKeys_Accel_Enable 0xfe77 -#define XKB_KEY_Overlay1_Enable 0xfe78 -#define XKB_KEY_Overlay2_Enable 0xfe79 -#define XKB_KEY_AudibleBell_Enable 0xfe7a - -#define XKB_KEY_Pointer_Left 0xfee0 -#define XKB_KEY_Pointer_Right 0xfee1 -#define XKB_KEY_Pointer_Up 0xfee2 -#define XKB_KEY_Pointer_Down 0xfee3 -#define XKB_KEY_Pointer_UpLeft 0xfee4 -#define XKB_KEY_Pointer_UpRight 0xfee5 -#define XKB_KEY_Pointer_DownLeft 0xfee6 -#define XKB_KEY_Pointer_DownRight 0xfee7 -#define XKB_KEY_Pointer_Button_Dflt 0xfee8 -#define XKB_KEY_Pointer_Button1 0xfee9 -#define XKB_KEY_Pointer_Button2 0xfeea -#define XKB_KEY_Pointer_Button3 0xfeeb -#define XKB_KEY_Pointer_Button4 0xfeec -#define XKB_KEY_Pointer_Button5 0xfeed -#define XKB_KEY_Pointer_DblClick_Dflt 0xfeee -#define XKB_KEY_Pointer_DblClick1 0xfeef -#define XKB_KEY_Pointer_DblClick2 0xfef0 -#define XKB_KEY_Pointer_DblClick3 0xfef1 -#define XKB_KEY_Pointer_DblClick4 0xfef2 -#define XKB_KEY_Pointer_DblClick5 0xfef3 -#define XKB_KEY_Pointer_Drag_Dflt 0xfef4 -#define XKB_KEY_Pointer_Drag1 0xfef5 -#define XKB_KEY_Pointer_Drag2 0xfef6 -#define XKB_KEY_Pointer_Drag3 0xfef7 -#define XKB_KEY_Pointer_Drag4 0xfef8 -#define XKB_KEY_Pointer_Drag5 0xfefd - -#define XKB_KEY_Pointer_EnableKeys 0xfef9 -#define XKB_KEY_Pointer_Accelerate 0xfefa -#define XKB_KEY_Pointer_DfltBtnNext 0xfefb -#define XKB_KEY_Pointer_DfltBtnPrev 0xfefc - -/* Single-Stroke Multiple-Character N-Graph Keysyms For The X Input Method */ - -#define XKB_KEY_ch 0xfea0 -#define XKB_KEY_Ch 0xfea1 -#define XKB_KEY_CH 0xfea2 -#define XKB_KEY_c_h 0xfea3 -#define XKB_KEY_C_h 0xfea4 -#define XKB_KEY_C_H 0xfea5 - - -/* - * 3270 Terminal Keys - * Byte 3 = 0xfd - */ - -#define XKB_KEY_3270_Duplicate 0xfd01 -#define XKB_KEY_3270_FieldMark 0xfd02 -#define XKB_KEY_3270_Right2 0xfd03 -#define XKB_KEY_3270_Left2 0xfd04 -#define XKB_KEY_3270_BackTab 0xfd05 -#define XKB_KEY_3270_EraseEOF 0xfd06 -#define XKB_KEY_3270_EraseInput 0xfd07 -#define XKB_KEY_3270_Reset 0xfd08 -#define XKB_KEY_3270_Quit 0xfd09 -#define XKB_KEY_3270_PA1 0xfd0a -#define XKB_KEY_3270_PA2 0xfd0b -#define XKB_KEY_3270_PA3 0xfd0c -#define XKB_KEY_3270_Test 0xfd0d -#define XKB_KEY_3270_Attn 0xfd0e -#define XKB_KEY_3270_CursorBlink 0xfd0f -#define XKB_KEY_3270_AltCursor 0xfd10 -#define XKB_KEY_3270_KeyClick 0xfd11 -#define XKB_KEY_3270_Jump 0xfd12 -#define XKB_KEY_3270_Ident 0xfd13 -#define XKB_KEY_3270_Rule 0xfd14 -#define XKB_KEY_3270_Copy 0xfd15 -#define XKB_KEY_3270_Play 0xfd16 -#define XKB_KEY_3270_Setup 0xfd17 -#define XKB_KEY_3270_Record 0xfd18 -#define XKB_KEY_3270_ChangeScreen 0xfd19 -#define XKB_KEY_3270_DeleteWord 0xfd1a -#define XKB_KEY_3270_ExSelect 0xfd1b -#define XKB_KEY_3270_CursorSelect 0xfd1c -#define XKB_KEY_3270_PrintScreen 0xfd1d -#define XKB_KEY_3270_Enter 0xfd1e - -/* - * Latin 1 - * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF) - * Byte 3 = 0 - */ -#define XKB_KEY_space 0x0020 /* U+0020 SPACE */ -#define XKB_KEY_exclam 0x0021 /* U+0021 EXCLAMATION MARK */ -#define XKB_KEY_quotedbl 0x0022 /* U+0022 QUOTATION MARK */ -#define XKB_KEY_numbersign 0x0023 /* U+0023 NUMBER SIGN */ -#define XKB_KEY_dollar 0x0024 /* U+0024 DOLLAR SIGN */ -#define XKB_KEY_percent 0x0025 /* U+0025 PERCENT SIGN */ -#define XKB_KEY_ampersand 0x0026 /* U+0026 AMPERSAND */ -#define XKB_KEY_apostrophe 0x0027 /* U+0027 APOSTROPHE */ -#define XKB_KEY_quoteright 0x0027 /* deprecated */ -#define XKB_KEY_parenleft 0x0028 /* U+0028 LEFT PARENTHESIS */ -#define XKB_KEY_parenright 0x0029 /* U+0029 RIGHT PARENTHESIS */ -#define XKB_KEY_asterisk 0x002a /* U+002A ASTERISK */ -#define XKB_KEY_plus 0x002b /* U+002B PLUS SIGN */ -#define XKB_KEY_comma 0x002c /* U+002C COMMA */ -#define XKB_KEY_minus 0x002d /* U+002D HYPHEN-MINUS */ -#define XKB_KEY_period 0x002e /* U+002E FULL STOP */ -#define XKB_KEY_slash 0x002f /* U+002F SOLIDUS */ -#define XKB_KEY_0 0x0030 /* U+0030 DIGIT ZERO */ -#define XKB_KEY_1 0x0031 /* U+0031 DIGIT ONE */ -#define XKB_KEY_2 0x0032 /* U+0032 DIGIT TWO */ -#define XKB_KEY_3 0x0033 /* U+0033 DIGIT THREE */ -#define XKB_KEY_4 0x0034 /* U+0034 DIGIT FOUR */ -#define XKB_KEY_5 0x0035 /* U+0035 DIGIT FIVE */ -#define XKB_KEY_6 0x0036 /* U+0036 DIGIT SIX */ -#define XKB_KEY_7 0x0037 /* U+0037 DIGIT SEVEN */ -#define XKB_KEY_8 0x0038 /* U+0038 DIGIT EIGHT */ -#define XKB_KEY_9 0x0039 /* U+0039 DIGIT NINE */ -#define XKB_KEY_colon 0x003a /* U+003A COLON */ -#define XKB_KEY_semicolon 0x003b /* U+003B SEMICOLON */ -#define XKB_KEY_less 0x003c /* U+003C LESS-THAN SIGN */ -#define XKB_KEY_equal 0x003d /* U+003D EQUALS SIGN */ -#define XKB_KEY_greater 0x003e /* U+003E GREATER-THAN SIGN */ -#define XKB_KEY_question 0x003f /* U+003F QUESTION MARK */ -#define XKB_KEY_at 0x0040 /* U+0040 COMMERCIAL AT */ -#define XKB_KEY_A 0x0041 /* U+0041 LATIN CAPITAL LETTER A */ -#define XKB_KEY_B 0x0042 /* U+0042 LATIN CAPITAL LETTER B */ -#define XKB_KEY_C 0x0043 /* U+0043 LATIN CAPITAL LETTER C */ -#define XKB_KEY_D 0x0044 /* U+0044 LATIN CAPITAL LETTER D */ -#define XKB_KEY_E 0x0045 /* U+0045 LATIN CAPITAL LETTER E */ -#define XKB_KEY_F 0x0046 /* U+0046 LATIN CAPITAL LETTER F */ -#define XKB_KEY_G 0x0047 /* U+0047 LATIN CAPITAL LETTER G */ -#define XKB_KEY_H 0x0048 /* U+0048 LATIN CAPITAL LETTER H */ -#define XKB_KEY_I 0x0049 /* U+0049 LATIN CAPITAL LETTER I */ -#define XKB_KEY_J 0x004a /* U+004A LATIN CAPITAL LETTER J */ -#define XKB_KEY_K 0x004b /* U+004B LATIN CAPITAL LETTER K */ -#define XKB_KEY_L 0x004c /* U+004C LATIN CAPITAL LETTER L */ -#define XKB_KEY_M 0x004d /* U+004D LATIN CAPITAL LETTER M */ -#define XKB_KEY_N 0x004e /* U+004E LATIN CAPITAL LETTER N */ -#define XKB_KEY_O 0x004f /* U+004F LATIN CAPITAL LETTER O */ -#define XKB_KEY_P 0x0050 /* U+0050 LATIN CAPITAL LETTER P */ -#define XKB_KEY_Q 0x0051 /* U+0051 LATIN CAPITAL LETTER Q */ -#define XKB_KEY_R 0x0052 /* U+0052 LATIN CAPITAL LETTER R */ -#define XKB_KEY_S 0x0053 /* U+0053 LATIN CAPITAL LETTER S */ -#define XKB_KEY_T 0x0054 /* U+0054 LATIN CAPITAL LETTER T */ -#define XKB_KEY_U 0x0055 /* U+0055 LATIN CAPITAL LETTER U */ -#define XKB_KEY_V 0x0056 /* U+0056 LATIN CAPITAL LETTER V */ -#define XKB_KEY_W 0x0057 /* U+0057 LATIN CAPITAL LETTER W */ -#define XKB_KEY_X 0x0058 /* U+0058 LATIN CAPITAL LETTER X */ -#define XKB_KEY_Y 0x0059 /* U+0059 LATIN CAPITAL LETTER Y */ -#define XKB_KEY_Z 0x005a /* U+005A LATIN CAPITAL LETTER Z */ -#define XKB_KEY_bracketleft 0x005b /* U+005B LEFT SQUARE BRACKET */ -#define XKB_KEY_backslash 0x005c /* U+005C REVERSE SOLIDUS */ -#define XKB_KEY_bracketright 0x005d /* U+005D RIGHT SQUARE BRACKET */ -#define XKB_KEY_asciicircum 0x005e /* U+005E CIRCUMFLEX ACCENT */ -#define XKB_KEY_underscore 0x005f /* U+005F LOW LINE */ -#define XKB_KEY_grave 0x0060 /* U+0060 GRAVE ACCENT */ -#define XKB_KEY_quoteleft 0x0060 /* deprecated */ -#define XKB_KEY_a 0x0061 /* U+0061 LATIN SMALL LETTER A */ -#define XKB_KEY_b 0x0062 /* U+0062 LATIN SMALL LETTER B */ -#define XKB_KEY_c 0x0063 /* U+0063 LATIN SMALL LETTER C */ -#define XKB_KEY_d 0x0064 /* U+0064 LATIN SMALL LETTER D */ -#define XKB_KEY_e 0x0065 /* U+0065 LATIN SMALL LETTER E */ -#define XKB_KEY_f 0x0066 /* U+0066 LATIN SMALL LETTER F */ -#define XKB_KEY_g 0x0067 /* U+0067 LATIN SMALL LETTER G */ -#define XKB_KEY_h 0x0068 /* U+0068 LATIN SMALL LETTER H */ -#define XKB_KEY_i 0x0069 /* U+0069 LATIN SMALL LETTER I */ -#define XKB_KEY_j 0x006a /* U+006A LATIN SMALL LETTER J */ -#define XKB_KEY_k 0x006b /* U+006B LATIN SMALL LETTER K */ -#define XKB_KEY_l 0x006c /* U+006C LATIN SMALL LETTER L */ -#define XKB_KEY_m 0x006d /* U+006D LATIN SMALL LETTER M */ -#define XKB_KEY_n 0x006e /* U+006E LATIN SMALL LETTER N */ -#define XKB_KEY_o 0x006f /* U+006F LATIN SMALL LETTER O */ -#define XKB_KEY_p 0x0070 /* U+0070 LATIN SMALL LETTER P */ -#define XKB_KEY_q 0x0071 /* U+0071 LATIN SMALL LETTER Q */ -#define XKB_KEY_r 0x0072 /* U+0072 LATIN SMALL LETTER R */ -#define XKB_KEY_s 0x0073 /* U+0073 LATIN SMALL LETTER S */ -#define XKB_KEY_t 0x0074 /* U+0074 LATIN SMALL LETTER T */ -#define XKB_KEY_u 0x0075 /* U+0075 LATIN SMALL LETTER U */ -#define XKB_KEY_v 0x0076 /* U+0076 LATIN SMALL LETTER V */ -#define XKB_KEY_w 0x0077 /* U+0077 LATIN SMALL LETTER W */ -#define XKB_KEY_x 0x0078 /* U+0078 LATIN SMALL LETTER X */ -#define XKB_KEY_y 0x0079 /* U+0079 LATIN SMALL LETTER Y */ -#define XKB_KEY_z 0x007a /* U+007A LATIN SMALL LETTER Z */ -#define XKB_KEY_braceleft 0x007b /* U+007B LEFT CURLY BRACKET */ -#define XKB_KEY_bar 0x007c /* U+007C VERTICAL LINE */ -#define XKB_KEY_braceright 0x007d /* U+007D RIGHT CURLY BRACKET */ -#define XKB_KEY_asciitilde 0x007e /* U+007E TILDE */ - -#define XKB_KEY_nobreakspace 0x00a0 /* U+00A0 NO-BREAK SPACE */ -#define XKB_KEY_exclamdown 0x00a1 /* U+00A1 INVERTED EXCLAMATION MARK */ -#define XKB_KEY_cent 0x00a2 /* U+00A2 CENT SIGN */ -#define XKB_KEY_sterling 0x00a3 /* U+00A3 POUND SIGN */ -#define XKB_KEY_currency 0x00a4 /* U+00A4 CURRENCY SIGN */ -#define XKB_KEY_yen 0x00a5 /* U+00A5 YEN SIGN */ -#define XKB_KEY_brokenbar 0x00a6 /* U+00A6 BROKEN BAR */ -#define XKB_KEY_section 0x00a7 /* U+00A7 SECTION SIGN */ -#define XKB_KEY_diaeresis 0x00a8 /* U+00A8 DIAERESIS */ -#define XKB_KEY_copyright 0x00a9 /* U+00A9 COPYRIGHT SIGN */ -#define XKB_KEY_ordfeminine 0x00aa /* U+00AA FEMININE ORDINAL INDICATOR */ -#define XKB_KEY_guillemotleft 0x00ab /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ -#define XKB_KEY_notsign 0x00ac /* U+00AC NOT SIGN */ -#define XKB_KEY_hyphen 0x00ad /* U+00AD SOFT HYPHEN */ -#define XKB_KEY_registered 0x00ae /* U+00AE REGISTERED SIGN */ -#define XKB_KEY_macron 0x00af /* U+00AF MACRON */ -#define XKB_KEY_degree 0x00b0 /* U+00B0 DEGREE SIGN */ -#define XKB_KEY_plusminus 0x00b1 /* U+00B1 PLUS-MINUS SIGN */ -#define XKB_KEY_twosuperior 0x00b2 /* U+00B2 SUPERSCRIPT TWO */ -#define XKB_KEY_threesuperior 0x00b3 /* U+00B3 SUPERSCRIPT THREE */ -#define XKB_KEY_acute 0x00b4 /* U+00B4 ACUTE ACCENT */ -#define XKB_KEY_mu 0x00b5 /* U+00B5 MICRO SIGN */ -#define XKB_KEY_paragraph 0x00b6 /* U+00B6 PILCROW SIGN */ -#define XKB_KEY_periodcentered 0x00b7 /* U+00B7 MIDDLE DOT */ -#define XKB_KEY_cedilla 0x00b8 /* U+00B8 CEDILLA */ -#define XKB_KEY_onesuperior 0x00b9 /* U+00B9 SUPERSCRIPT ONE */ -#define XKB_KEY_masculine 0x00ba /* U+00BA MASCULINE ORDINAL INDICATOR */ -#define XKB_KEY_guillemotright 0x00bb /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ -#define XKB_KEY_onequarter 0x00bc /* U+00BC VULGAR FRACTION ONE QUARTER */ -#define XKB_KEY_onehalf 0x00bd /* U+00BD VULGAR FRACTION ONE HALF */ -#define XKB_KEY_threequarters 0x00be /* U+00BE VULGAR FRACTION THREE QUARTERS */ -#define XKB_KEY_questiondown 0x00bf /* U+00BF INVERTED QUESTION MARK */ -#define XKB_KEY_Agrave 0x00c0 /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ -#define XKB_KEY_Aacute 0x00c1 /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ -#define XKB_KEY_Acircumflex 0x00c2 /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ -#define XKB_KEY_Atilde 0x00c3 /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ -#define XKB_KEY_Adiaeresis 0x00c4 /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ -#define XKB_KEY_Aring 0x00c5 /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ -#define XKB_KEY_AE 0x00c6 /* U+00C6 LATIN CAPITAL LETTER AE */ -#define XKB_KEY_Ccedilla 0x00c7 /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ -#define XKB_KEY_Egrave 0x00c8 /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ -#define XKB_KEY_Eacute 0x00c9 /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ -#define XKB_KEY_Ecircumflex 0x00ca /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ -#define XKB_KEY_Ediaeresis 0x00cb /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ -#define XKB_KEY_Igrave 0x00cc /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ -#define XKB_KEY_Iacute 0x00cd /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ -#define XKB_KEY_Icircumflex 0x00ce /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ -#define XKB_KEY_Idiaeresis 0x00cf /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ -#define XKB_KEY_ETH 0x00d0 /* U+00D0 LATIN CAPITAL LETTER ETH */ -#define XKB_KEY_Eth 0x00d0 /* deprecated */ -#define XKB_KEY_Ntilde 0x00d1 /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ -#define XKB_KEY_Ograve 0x00d2 /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ -#define XKB_KEY_Oacute 0x00d3 /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ -#define XKB_KEY_Ocircumflex 0x00d4 /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ -#define XKB_KEY_Otilde 0x00d5 /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ -#define XKB_KEY_Odiaeresis 0x00d6 /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ -#define XKB_KEY_multiply 0x00d7 /* U+00D7 MULTIPLICATION SIGN */ -#define XKB_KEY_Oslash 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ -#define XKB_KEY_Ooblique 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ -#define XKB_KEY_Ugrave 0x00d9 /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ -#define XKB_KEY_Uacute 0x00da /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ -#define XKB_KEY_Ucircumflex 0x00db /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ -#define XKB_KEY_Udiaeresis 0x00dc /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ -#define XKB_KEY_Yacute 0x00dd /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ -#define XKB_KEY_THORN 0x00de /* U+00DE LATIN CAPITAL LETTER THORN */ -#define XKB_KEY_Thorn 0x00de /* deprecated */ -#define XKB_KEY_ssharp 0x00df /* U+00DF LATIN SMALL LETTER SHARP S */ -#define XKB_KEY_agrave 0x00e0 /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ -#define XKB_KEY_aacute 0x00e1 /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ -#define XKB_KEY_acircumflex 0x00e2 /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ -#define XKB_KEY_atilde 0x00e3 /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ -#define XKB_KEY_adiaeresis 0x00e4 /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ -#define XKB_KEY_aring 0x00e5 /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ -#define XKB_KEY_ae 0x00e6 /* U+00E6 LATIN SMALL LETTER AE */ -#define XKB_KEY_ccedilla 0x00e7 /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ -#define XKB_KEY_egrave 0x00e8 /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ -#define XKB_KEY_eacute 0x00e9 /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ -#define XKB_KEY_ecircumflex 0x00ea /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ -#define XKB_KEY_ediaeresis 0x00eb /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ -#define XKB_KEY_igrave 0x00ec /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ -#define XKB_KEY_iacute 0x00ed /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ -#define XKB_KEY_icircumflex 0x00ee /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ -#define XKB_KEY_idiaeresis 0x00ef /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ -#define XKB_KEY_eth 0x00f0 /* U+00F0 LATIN SMALL LETTER ETH */ -#define XKB_KEY_ntilde 0x00f1 /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ -#define XKB_KEY_ograve 0x00f2 /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ -#define XKB_KEY_oacute 0x00f3 /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ -#define XKB_KEY_ocircumflex 0x00f4 /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ -#define XKB_KEY_otilde 0x00f5 /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ -#define XKB_KEY_odiaeresis 0x00f6 /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ -#define XKB_KEY_division 0x00f7 /* U+00F7 DIVISION SIGN */ -#define XKB_KEY_oslash 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ -#define XKB_KEY_ooblique 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ -#define XKB_KEY_ugrave 0x00f9 /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ -#define XKB_KEY_uacute 0x00fa /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ -#define XKB_KEY_ucircumflex 0x00fb /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ -#define XKB_KEY_udiaeresis 0x00fc /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ -#define XKB_KEY_yacute 0x00fd /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ -#define XKB_KEY_thorn 0x00fe /* U+00FE LATIN SMALL LETTER THORN */ -#define XKB_KEY_ydiaeresis 0x00ff /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ - -/* - * Latin 2 - * Byte 3 = 1 - */ - -#define XKB_KEY_Aogonek 0x01a1 /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */ -#define XKB_KEY_breve 0x01a2 /* U+02D8 BREVE */ -#define XKB_KEY_Lstroke 0x01a3 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */ -#define XKB_KEY_Lcaron 0x01a5 /* U+013D LATIN CAPITAL LETTER L WITH CARON */ -#define XKB_KEY_Sacute 0x01a6 /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */ -#define XKB_KEY_Scaron 0x01a9 /* U+0160 LATIN CAPITAL LETTER S WITH CARON */ -#define XKB_KEY_Scedilla 0x01aa /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */ -#define XKB_KEY_Tcaron 0x01ab /* U+0164 LATIN CAPITAL LETTER T WITH CARON */ -#define XKB_KEY_Zacute 0x01ac /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */ -#define XKB_KEY_Zcaron 0x01ae /* U+017D LATIN CAPITAL LETTER Z WITH CARON */ -#define XKB_KEY_Zabovedot 0x01af /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */ -#define XKB_KEY_aogonek 0x01b1 /* U+0105 LATIN SMALL LETTER A WITH OGONEK */ -#define XKB_KEY_ogonek 0x01b2 /* U+02DB OGONEK */ -#define XKB_KEY_lstroke 0x01b3 /* U+0142 LATIN SMALL LETTER L WITH STROKE */ -#define XKB_KEY_lcaron 0x01b5 /* U+013E LATIN SMALL LETTER L WITH CARON */ -#define XKB_KEY_sacute 0x01b6 /* U+015B LATIN SMALL LETTER S WITH ACUTE */ -#define XKB_KEY_caron 0x01b7 /* U+02C7 CARON */ -#define XKB_KEY_scaron 0x01b9 /* U+0161 LATIN SMALL LETTER S WITH CARON */ -#define XKB_KEY_scedilla 0x01ba /* U+015F LATIN SMALL LETTER S WITH CEDILLA */ -#define XKB_KEY_tcaron 0x01bb /* U+0165 LATIN SMALL LETTER T WITH CARON */ -#define XKB_KEY_zacute 0x01bc /* U+017A LATIN SMALL LETTER Z WITH ACUTE */ -#define XKB_KEY_doubleacute 0x01bd /* U+02DD DOUBLE ACUTE ACCENT */ -#define XKB_KEY_zcaron 0x01be /* U+017E LATIN SMALL LETTER Z WITH CARON */ -#define XKB_KEY_zabovedot 0x01bf /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */ -#define XKB_KEY_Racute 0x01c0 /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */ -#define XKB_KEY_Abreve 0x01c3 /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */ -#define XKB_KEY_Lacute 0x01c5 /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */ -#define XKB_KEY_Cacute 0x01c6 /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */ -#define XKB_KEY_Ccaron 0x01c8 /* U+010C LATIN CAPITAL LETTER C WITH CARON */ -#define XKB_KEY_Eogonek 0x01ca /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */ -#define XKB_KEY_Ecaron 0x01cc /* U+011A LATIN CAPITAL LETTER E WITH CARON */ -#define XKB_KEY_Dcaron 0x01cf /* U+010E LATIN CAPITAL LETTER D WITH CARON */ -#define XKB_KEY_Dstroke 0x01d0 /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */ -#define XKB_KEY_Nacute 0x01d1 /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */ -#define XKB_KEY_Ncaron 0x01d2 /* U+0147 LATIN CAPITAL LETTER N WITH CARON */ -#define XKB_KEY_Odoubleacute 0x01d5 /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ -#define XKB_KEY_Rcaron 0x01d8 /* U+0158 LATIN CAPITAL LETTER R WITH CARON */ -#define XKB_KEY_Uring 0x01d9 /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */ -#define XKB_KEY_Udoubleacute 0x01db /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ -#define XKB_KEY_Tcedilla 0x01de /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */ -#define XKB_KEY_racute 0x01e0 /* U+0155 LATIN SMALL LETTER R WITH ACUTE */ -#define XKB_KEY_abreve 0x01e3 /* U+0103 LATIN SMALL LETTER A WITH BREVE */ -#define XKB_KEY_lacute 0x01e5 /* U+013A LATIN SMALL LETTER L WITH ACUTE */ -#define XKB_KEY_cacute 0x01e6 /* U+0107 LATIN SMALL LETTER C WITH ACUTE */ -#define XKB_KEY_ccaron 0x01e8 /* U+010D LATIN SMALL LETTER C WITH CARON */ -#define XKB_KEY_eogonek 0x01ea /* U+0119 LATIN SMALL LETTER E WITH OGONEK */ -#define XKB_KEY_ecaron 0x01ec /* U+011B LATIN SMALL LETTER E WITH CARON */ -#define XKB_KEY_dcaron 0x01ef /* U+010F LATIN SMALL LETTER D WITH CARON */ -#define XKB_KEY_dstroke 0x01f0 /* U+0111 LATIN SMALL LETTER D WITH STROKE */ -#define XKB_KEY_nacute 0x01f1 /* U+0144 LATIN SMALL LETTER N WITH ACUTE */ -#define XKB_KEY_ncaron 0x01f2 /* U+0148 LATIN SMALL LETTER N WITH CARON */ -#define XKB_KEY_odoubleacute 0x01f5 /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */ -#define XKB_KEY_rcaron 0x01f8 /* U+0159 LATIN SMALL LETTER R WITH CARON */ -#define XKB_KEY_uring 0x01f9 /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */ -#define XKB_KEY_udoubleacute 0x01fb /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */ -#define XKB_KEY_tcedilla 0x01fe /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */ -#define XKB_KEY_abovedot 0x01ff /* U+02D9 DOT ABOVE */ - -/* - * Latin 3 - * Byte 3 = 2 - */ - -#define XKB_KEY_Hstroke 0x02a1 /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */ -#define XKB_KEY_Hcircumflex 0x02a6 /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ -#define XKB_KEY_Iabovedot 0x02a9 /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */ -#define XKB_KEY_Gbreve 0x02ab /* U+011E LATIN CAPITAL LETTER G WITH BREVE */ -#define XKB_KEY_Jcircumflex 0x02ac /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ -#define XKB_KEY_hstroke 0x02b1 /* U+0127 LATIN SMALL LETTER H WITH STROKE */ -#define XKB_KEY_hcircumflex 0x02b6 /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */ -#define XKB_KEY_idotless 0x02b9 /* U+0131 LATIN SMALL LETTER DOTLESS I */ -#define XKB_KEY_gbreve 0x02bb /* U+011F LATIN SMALL LETTER G WITH BREVE */ -#define XKB_KEY_jcircumflex 0x02bc /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */ -#define XKB_KEY_Cabovedot 0x02c5 /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */ -#define XKB_KEY_Ccircumflex 0x02c6 /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ -#define XKB_KEY_Gabovedot 0x02d5 /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */ -#define XKB_KEY_Gcircumflex 0x02d8 /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ -#define XKB_KEY_Ubreve 0x02dd /* U+016C LATIN CAPITAL LETTER U WITH BREVE */ -#define XKB_KEY_Scircumflex 0x02de /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ -#define XKB_KEY_cabovedot 0x02e5 /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */ -#define XKB_KEY_ccircumflex 0x02e6 /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */ -#define XKB_KEY_gabovedot 0x02f5 /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */ -#define XKB_KEY_gcircumflex 0x02f8 /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */ -#define XKB_KEY_ubreve 0x02fd /* U+016D LATIN SMALL LETTER U WITH BREVE */ -#define XKB_KEY_scircumflex 0x02fe /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */ - - -/* - * Latin 4 - * Byte 3 = 3 - */ - -#define XKB_KEY_kra 0x03a2 /* U+0138 LATIN SMALL LETTER KRA */ -#define XKB_KEY_kappa 0x03a2 /* deprecated */ -#define XKB_KEY_Rcedilla 0x03a3 /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */ -#define XKB_KEY_Itilde 0x03a5 /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */ -#define XKB_KEY_Lcedilla 0x03a6 /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */ -#define XKB_KEY_Emacron 0x03aa /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */ -#define XKB_KEY_Gcedilla 0x03ab /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */ -#define XKB_KEY_Tslash 0x03ac /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */ -#define XKB_KEY_rcedilla 0x03b3 /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */ -#define XKB_KEY_itilde 0x03b5 /* U+0129 LATIN SMALL LETTER I WITH TILDE */ -#define XKB_KEY_lcedilla 0x03b6 /* U+013C LATIN SMALL LETTER L WITH CEDILLA */ -#define XKB_KEY_emacron 0x03ba /* U+0113 LATIN SMALL LETTER E WITH MACRON */ -#define XKB_KEY_gcedilla 0x03bb /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */ -#define XKB_KEY_tslash 0x03bc /* U+0167 LATIN SMALL LETTER T WITH STROKE */ -#define XKB_KEY_ENG 0x03bd /* U+014A LATIN CAPITAL LETTER ENG */ -#define XKB_KEY_eng 0x03bf /* U+014B LATIN SMALL LETTER ENG */ -#define XKB_KEY_Amacron 0x03c0 /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */ -#define XKB_KEY_Iogonek 0x03c7 /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */ -#define XKB_KEY_Eabovedot 0x03cc /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */ -#define XKB_KEY_Imacron 0x03cf /* U+012A LATIN CAPITAL LETTER I WITH MACRON */ -#define XKB_KEY_Ncedilla 0x03d1 /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */ -#define XKB_KEY_Omacron 0x03d2 /* U+014C LATIN CAPITAL LETTER O WITH MACRON */ -#define XKB_KEY_Kcedilla 0x03d3 /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */ -#define XKB_KEY_Uogonek 0x03d9 /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */ -#define XKB_KEY_Utilde 0x03dd /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */ -#define XKB_KEY_Umacron 0x03de /* U+016A LATIN CAPITAL LETTER U WITH MACRON */ -#define XKB_KEY_amacron 0x03e0 /* U+0101 LATIN SMALL LETTER A WITH MACRON */ -#define XKB_KEY_iogonek 0x03e7 /* U+012F LATIN SMALL LETTER I WITH OGONEK */ -#define XKB_KEY_eabovedot 0x03ec /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */ -#define XKB_KEY_imacron 0x03ef /* U+012B LATIN SMALL LETTER I WITH MACRON */ -#define XKB_KEY_ncedilla 0x03f1 /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */ -#define XKB_KEY_omacron 0x03f2 /* U+014D LATIN SMALL LETTER O WITH MACRON */ -#define XKB_KEY_kcedilla 0x03f3 /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */ -#define XKB_KEY_uogonek 0x03f9 /* U+0173 LATIN SMALL LETTER U WITH OGONEK */ -#define XKB_KEY_utilde 0x03fd /* U+0169 LATIN SMALL LETTER U WITH TILDE */ -#define XKB_KEY_umacron 0x03fe /* U+016B LATIN SMALL LETTER U WITH MACRON */ - -/* - * Latin 8 - */ -#define XKB_KEY_Wcircumflex 0x1000174 /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ -#define XKB_KEY_wcircumflex 0x1000175 /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */ -#define XKB_KEY_Ycircumflex 0x1000176 /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ -#define XKB_KEY_ycircumflex 0x1000177 /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */ -#define XKB_KEY_Babovedot 0x1001e02 /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */ -#define XKB_KEY_babovedot 0x1001e03 /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */ -#define XKB_KEY_Dabovedot 0x1001e0a /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */ -#define XKB_KEY_dabovedot 0x1001e0b /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */ -#define XKB_KEY_Fabovedot 0x1001e1e /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */ -#define XKB_KEY_fabovedot 0x1001e1f /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */ -#define XKB_KEY_Mabovedot 0x1001e40 /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */ -#define XKB_KEY_mabovedot 0x1001e41 /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */ -#define XKB_KEY_Pabovedot 0x1001e56 /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */ -#define XKB_KEY_pabovedot 0x1001e57 /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */ -#define XKB_KEY_Sabovedot 0x1001e60 /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */ -#define XKB_KEY_sabovedot 0x1001e61 /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */ -#define XKB_KEY_Tabovedot 0x1001e6a /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */ -#define XKB_KEY_tabovedot 0x1001e6b /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */ -#define XKB_KEY_Wgrave 0x1001e80 /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */ -#define XKB_KEY_wgrave 0x1001e81 /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */ -#define XKB_KEY_Wacute 0x1001e82 /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */ -#define XKB_KEY_wacute 0x1001e83 /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */ -#define XKB_KEY_Wdiaeresis 0x1001e84 /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */ -#define XKB_KEY_wdiaeresis 0x1001e85 /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */ -#define XKB_KEY_Ygrave 0x1001ef2 /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */ -#define XKB_KEY_ygrave 0x1001ef3 /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */ - -/* - * Latin 9 - * Byte 3 = 0x13 - */ - -#define XKB_KEY_OE 0x13bc /* U+0152 LATIN CAPITAL LIGATURE OE */ -#define XKB_KEY_oe 0x13bd /* U+0153 LATIN SMALL LIGATURE OE */ -#define XKB_KEY_Ydiaeresis 0x13be /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */ - -/* - * Katakana - * Byte 3 = 4 - */ - -#define XKB_KEY_overline 0x047e /* U+203E OVERLINE */ -#define XKB_KEY_kana_fullstop 0x04a1 /* U+3002 IDEOGRAPHIC FULL STOP */ -#define XKB_KEY_kana_openingbracket 0x04a2 /* U+300C LEFT CORNER BRACKET */ -#define XKB_KEY_kana_closingbracket 0x04a3 /* U+300D RIGHT CORNER BRACKET */ -#define XKB_KEY_kana_comma 0x04a4 /* U+3001 IDEOGRAPHIC COMMA */ -#define XKB_KEY_kana_conjunctive 0x04a5 /* U+30FB KATAKANA MIDDLE DOT */ -#define XKB_KEY_kana_middledot 0x04a5 /* deprecated */ -#define XKB_KEY_kana_WO 0x04a6 /* U+30F2 KATAKANA LETTER WO */ -#define XKB_KEY_kana_a 0x04a7 /* U+30A1 KATAKANA LETTER SMALL A */ -#define XKB_KEY_kana_i 0x04a8 /* U+30A3 KATAKANA LETTER SMALL I */ -#define XKB_KEY_kana_u 0x04a9 /* U+30A5 KATAKANA LETTER SMALL U */ -#define XKB_KEY_kana_e 0x04aa /* U+30A7 KATAKANA LETTER SMALL E */ -#define XKB_KEY_kana_o 0x04ab /* U+30A9 KATAKANA LETTER SMALL O */ -#define XKB_KEY_kana_ya 0x04ac /* U+30E3 KATAKANA LETTER SMALL YA */ -#define XKB_KEY_kana_yu 0x04ad /* U+30E5 KATAKANA LETTER SMALL YU */ -#define XKB_KEY_kana_yo 0x04ae /* U+30E7 KATAKANA LETTER SMALL YO */ -#define XKB_KEY_kana_tsu 0x04af /* U+30C3 KATAKANA LETTER SMALL TU */ -#define XKB_KEY_kana_tu 0x04af /* deprecated */ -#define XKB_KEY_prolongedsound 0x04b0 /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */ -#define XKB_KEY_kana_A 0x04b1 /* U+30A2 KATAKANA LETTER A */ -#define XKB_KEY_kana_I 0x04b2 /* U+30A4 KATAKANA LETTER I */ -#define XKB_KEY_kana_U 0x04b3 /* U+30A6 KATAKANA LETTER U */ -#define XKB_KEY_kana_E 0x04b4 /* U+30A8 KATAKANA LETTER E */ -#define XKB_KEY_kana_O 0x04b5 /* U+30AA KATAKANA LETTER O */ -#define XKB_KEY_kana_KA 0x04b6 /* U+30AB KATAKANA LETTER KA */ -#define XKB_KEY_kana_KI 0x04b7 /* U+30AD KATAKANA LETTER KI */ -#define XKB_KEY_kana_KU 0x04b8 /* U+30AF KATAKANA LETTER KU */ -#define XKB_KEY_kana_KE 0x04b9 /* U+30B1 KATAKANA LETTER KE */ -#define XKB_KEY_kana_KO 0x04ba /* U+30B3 KATAKANA LETTER KO */ -#define XKB_KEY_kana_SA 0x04bb /* U+30B5 KATAKANA LETTER SA */ -#define XKB_KEY_kana_SHI 0x04bc /* U+30B7 KATAKANA LETTER SI */ -#define XKB_KEY_kana_SU 0x04bd /* U+30B9 KATAKANA LETTER SU */ -#define XKB_KEY_kana_SE 0x04be /* U+30BB KATAKANA LETTER SE */ -#define XKB_KEY_kana_SO 0x04bf /* U+30BD KATAKANA LETTER SO */ -#define XKB_KEY_kana_TA 0x04c0 /* U+30BF KATAKANA LETTER TA */ -#define XKB_KEY_kana_CHI 0x04c1 /* U+30C1 KATAKANA LETTER TI */ -#define XKB_KEY_kana_TI 0x04c1 /* deprecated */ -#define XKB_KEY_kana_TSU 0x04c2 /* U+30C4 KATAKANA LETTER TU */ -#define XKB_KEY_kana_TU 0x04c2 /* deprecated */ -#define XKB_KEY_kana_TE 0x04c3 /* U+30C6 KATAKANA LETTER TE */ -#define XKB_KEY_kana_TO 0x04c4 /* U+30C8 KATAKANA LETTER TO */ -#define XKB_KEY_kana_NA 0x04c5 /* U+30CA KATAKANA LETTER NA */ -#define XKB_KEY_kana_NI 0x04c6 /* U+30CB KATAKANA LETTER NI */ -#define XKB_KEY_kana_NU 0x04c7 /* U+30CC KATAKANA LETTER NU */ -#define XKB_KEY_kana_NE 0x04c8 /* U+30CD KATAKANA LETTER NE */ -#define XKB_KEY_kana_NO 0x04c9 /* U+30CE KATAKANA LETTER NO */ -#define XKB_KEY_kana_HA 0x04ca /* U+30CF KATAKANA LETTER HA */ -#define XKB_KEY_kana_HI 0x04cb /* U+30D2 KATAKANA LETTER HI */ -#define XKB_KEY_kana_FU 0x04cc /* U+30D5 KATAKANA LETTER HU */ -#define XKB_KEY_kana_HU 0x04cc /* deprecated */ -#define XKB_KEY_kana_HE 0x04cd /* U+30D8 KATAKANA LETTER HE */ -#define XKB_KEY_kana_HO 0x04ce /* U+30DB KATAKANA LETTER HO */ -#define XKB_KEY_kana_MA 0x04cf /* U+30DE KATAKANA LETTER MA */ -#define XKB_KEY_kana_MI 0x04d0 /* U+30DF KATAKANA LETTER MI */ -#define XKB_KEY_kana_MU 0x04d1 /* U+30E0 KATAKANA LETTER MU */ -#define XKB_KEY_kana_ME 0x04d2 /* U+30E1 KATAKANA LETTER ME */ -#define XKB_KEY_kana_MO 0x04d3 /* U+30E2 KATAKANA LETTER MO */ -#define XKB_KEY_kana_YA 0x04d4 /* U+30E4 KATAKANA LETTER YA */ -#define XKB_KEY_kana_YU 0x04d5 /* U+30E6 KATAKANA LETTER YU */ -#define XKB_KEY_kana_YO 0x04d6 /* U+30E8 KATAKANA LETTER YO */ -#define XKB_KEY_kana_RA 0x04d7 /* U+30E9 KATAKANA LETTER RA */ -#define XKB_KEY_kana_RI 0x04d8 /* U+30EA KATAKANA LETTER RI */ -#define XKB_KEY_kana_RU 0x04d9 /* U+30EB KATAKANA LETTER RU */ -#define XKB_KEY_kana_RE 0x04da /* U+30EC KATAKANA LETTER RE */ -#define XKB_KEY_kana_RO 0x04db /* U+30ED KATAKANA LETTER RO */ -#define XKB_KEY_kana_WA 0x04dc /* U+30EF KATAKANA LETTER WA */ -#define XKB_KEY_kana_N 0x04dd /* U+30F3 KATAKANA LETTER N */ -#define XKB_KEY_voicedsound 0x04de /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */ -#define XKB_KEY_semivoicedsound 0x04df /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ -#define XKB_KEY_kana_switch 0xff7e /* Alias for mode_switch */ - -/* - * Arabic - * Byte 3 = 5 - */ - -#define XKB_KEY_Farsi_0 0x10006f0 /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */ -#define XKB_KEY_Farsi_1 0x10006f1 /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */ -#define XKB_KEY_Farsi_2 0x10006f2 /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */ -#define XKB_KEY_Farsi_3 0x10006f3 /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */ -#define XKB_KEY_Farsi_4 0x10006f4 /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */ -#define XKB_KEY_Farsi_5 0x10006f5 /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */ -#define XKB_KEY_Farsi_6 0x10006f6 /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */ -#define XKB_KEY_Farsi_7 0x10006f7 /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */ -#define XKB_KEY_Farsi_8 0x10006f8 /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */ -#define XKB_KEY_Farsi_9 0x10006f9 /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */ -#define XKB_KEY_Arabic_percent 0x100066a /* U+066A ARABIC PERCENT SIGN */ -#define XKB_KEY_Arabic_superscript_alef 0x1000670 /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */ -#define XKB_KEY_Arabic_tteh 0x1000679 /* U+0679 ARABIC LETTER TTEH */ -#define XKB_KEY_Arabic_peh 0x100067e /* U+067E ARABIC LETTER PEH */ -#define XKB_KEY_Arabic_tcheh 0x1000686 /* U+0686 ARABIC LETTER TCHEH */ -#define XKB_KEY_Arabic_ddal 0x1000688 /* U+0688 ARABIC LETTER DDAL */ -#define XKB_KEY_Arabic_rreh 0x1000691 /* U+0691 ARABIC LETTER RREH */ -#define XKB_KEY_Arabic_comma 0x05ac /* U+060C ARABIC COMMA */ -#define XKB_KEY_Arabic_fullstop 0x10006d4 /* U+06D4 ARABIC FULL STOP */ -#define XKB_KEY_Arabic_0 0x1000660 /* U+0660 ARABIC-INDIC DIGIT ZERO */ -#define XKB_KEY_Arabic_1 0x1000661 /* U+0661 ARABIC-INDIC DIGIT ONE */ -#define XKB_KEY_Arabic_2 0x1000662 /* U+0662 ARABIC-INDIC DIGIT TWO */ -#define XKB_KEY_Arabic_3 0x1000663 /* U+0663 ARABIC-INDIC DIGIT THREE */ -#define XKB_KEY_Arabic_4 0x1000664 /* U+0664 ARABIC-INDIC DIGIT FOUR */ -#define XKB_KEY_Arabic_5 0x1000665 /* U+0665 ARABIC-INDIC DIGIT FIVE */ -#define XKB_KEY_Arabic_6 0x1000666 /* U+0666 ARABIC-INDIC DIGIT SIX */ -#define XKB_KEY_Arabic_7 0x1000667 /* U+0667 ARABIC-INDIC DIGIT SEVEN */ -#define XKB_KEY_Arabic_8 0x1000668 /* U+0668 ARABIC-INDIC DIGIT EIGHT */ -#define XKB_KEY_Arabic_9 0x1000669 /* U+0669 ARABIC-INDIC DIGIT NINE */ -#define XKB_KEY_Arabic_semicolon 0x05bb /* U+061B ARABIC SEMICOLON */ -#define XKB_KEY_Arabic_question_mark 0x05bf /* U+061F ARABIC QUESTION MARK */ -#define XKB_KEY_Arabic_hamza 0x05c1 /* U+0621 ARABIC LETTER HAMZA */ -#define XKB_KEY_Arabic_maddaonalef 0x05c2 /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */ -#define XKB_KEY_Arabic_hamzaonalef 0x05c3 /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */ -#define XKB_KEY_Arabic_hamzaonwaw 0x05c4 /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */ -#define XKB_KEY_Arabic_hamzaunderalef 0x05c5 /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */ -#define XKB_KEY_Arabic_hamzaonyeh 0x05c6 /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */ -#define XKB_KEY_Arabic_alef 0x05c7 /* U+0627 ARABIC LETTER ALEF */ -#define XKB_KEY_Arabic_beh 0x05c8 /* U+0628 ARABIC LETTER BEH */ -#define XKB_KEY_Arabic_tehmarbuta 0x05c9 /* U+0629 ARABIC LETTER TEH MARBUTA */ -#define XKB_KEY_Arabic_teh 0x05ca /* U+062A ARABIC LETTER TEH */ -#define XKB_KEY_Arabic_theh 0x05cb /* U+062B ARABIC LETTER THEH */ -#define XKB_KEY_Arabic_jeem 0x05cc /* U+062C ARABIC LETTER JEEM */ -#define XKB_KEY_Arabic_hah 0x05cd /* U+062D ARABIC LETTER HAH */ -#define XKB_KEY_Arabic_khah 0x05ce /* U+062E ARABIC LETTER KHAH */ -#define XKB_KEY_Arabic_dal 0x05cf /* U+062F ARABIC LETTER DAL */ -#define XKB_KEY_Arabic_thal 0x05d0 /* U+0630 ARABIC LETTER THAL */ -#define XKB_KEY_Arabic_ra 0x05d1 /* U+0631 ARABIC LETTER REH */ -#define XKB_KEY_Arabic_zain 0x05d2 /* U+0632 ARABIC LETTER ZAIN */ -#define XKB_KEY_Arabic_seen 0x05d3 /* U+0633 ARABIC LETTER SEEN */ -#define XKB_KEY_Arabic_sheen 0x05d4 /* U+0634 ARABIC LETTER SHEEN */ -#define XKB_KEY_Arabic_sad 0x05d5 /* U+0635 ARABIC LETTER SAD */ -#define XKB_KEY_Arabic_dad 0x05d6 /* U+0636 ARABIC LETTER DAD */ -#define XKB_KEY_Arabic_tah 0x05d7 /* U+0637 ARABIC LETTER TAH */ -#define XKB_KEY_Arabic_zah 0x05d8 /* U+0638 ARABIC LETTER ZAH */ -#define XKB_KEY_Arabic_ain 0x05d9 /* U+0639 ARABIC LETTER AIN */ -#define XKB_KEY_Arabic_ghain 0x05da /* U+063A ARABIC LETTER GHAIN */ -#define XKB_KEY_Arabic_tatweel 0x05e0 /* U+0640 ARABIC TATWEEL */ -#define XKB_KEY_Arabic_feh 0x05e1 /* U+0641 ARABIC LETTER FEH */ -#define XKB_KEY_Arabic_qaf 0x05e2 /* U+0642 ARABIC LETTER QAF */ -#define XKB_KEY_Arabic_kaf 0x05e3 /* U+0643 ARABIC LETTER KAF */ -#define XKB_KEY_Arabic_lam 0x05e4 /* U+0644 ARABIC LETTER LAM */ -#define XKB_KEY_Arabic_meem 0x05e5 /* U+0645 ARABIC LETTER MEEM */ -#define XKB_KEY_Arabic_noon 0x05e6 /* U+0646 ARABIC LETTER NOON */ -#define XKB_KEY_Arabic_ha 0x05e7 /* U+0647 ARABIC LETTER HEH */ -#define XKB_KEY_Arabic_heh 0x05e7 /* deprecated */ -#define XKB_KEY_Arabic_waw 0x05e8 /* U+0648 ARABIC LETTER WAW */ -#define XKB_KEY_Arabic_alefmaksura 0x05e9 /* U+0649 ARABIC LETTER ALEF MAKSURA */ -#define XKB_KEY_Arabic_yeh 0x05ea /* U+064A ARABIC LETTER YEH */ -#define XKB_KEY_Arabic_fathatan 0x05eb /* U+064B ARABIC FATHATAN */ -#define XKB_KEY_Arabic_dammatan 0x05ec /* U+064C ARABIC DAMMATAN */ -#define XKB_KEY_Arabic_kasratan 0x05ed /* U+064D ARABIC KASRATAN */ -#define XKB_KEY_Arabic_fatha 0x05ee /* U+064E ARABIC FATHA */ -#define XKB_KEY_Arabic_damma 0x05ef /* U+064F ARABIC DAMMA */ -#define XKB_KEY_Arabic_kasra 0x05f0 /* U+0650 ARABIC KASRA */ -#define XKB_KEY_Arabic_shadda 0x05f1 /* U+0651 ARABIC SHADDA */ -#define XKB_KEY_Arabic_sukun 0x05f2 /* U+0652 ARABIC SUKUN */ -#define XKB_KEY_Arabic_madda_above 0x1000653 /* U+0653 ARABIC MADDAH ABOVE */ -#define XKB_KEY_Arabic_hamza_above 0x1000654 /* U+0654 ARABIC HAMZA ABOVE */ -#define XKB_KEY_Arabic_hamza_below 0x1000655 /* U+0655 ARABIC HAMZA BELOW */ -#define XKB_KEY_Arabic_jeh 0x1000698 /* U+0698 ARABIC LETTER JEH */ -#define XKB_KEY_Arabic_veh 0x10006a4 /* U+06A4 ARABIC LETTER VEH */ -#define XKB_KEY_Arabic_keheh 0x10006a9 /* U+06A9 ARABIC LETTER KEHEH */ -#define XKB_KEY_Arabic_gaf 0x10006af /* U+06AF ARABIC LETTER GAF */ -#define XKB_KEY_Arabic_noon_ghunna 0x10006ba /* U+06BA ARABIC LETTER NOON GHUNNA */ -#define XKB_KEY_Arabic_heh_doachashmee 0x10006be /* U+06BE ARABIC LETTER HEH DOACHASHMEE */ -#define XKB_KEY_Farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ -#define XKB_KEY_Arabic_farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ -#define XKB_KEY_Arabic_yeh_baree 0x10006d2 /* U+06D2 ARABIC LETTER YEH BARREE */ -#define XKB_KEY_Arabic_heh_goal 0x10006c1 /* U+06C1 ARABIC LETTER HEH GOAL */ -#define XKB_KEY_Arabic_switch 0xff7e /* Alias for mode_switch */ - -/* - * Cyrillic - * Byte 3 = 6 - */ -#define XKB_KEY_Cyrillic_GHE_bar 0x1000492 /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */ -#define XKB_KEY_Cyrillic_ghe_bar 0x1000493 /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */ -#define XKB_KEY_Cyrillic_ZHE_descender 0x1000496 /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */ -#define XKB_KEY_Cyrillic_zhe_descender 0x1000497 /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */ -#define XKB_KEY_Cyrillic_KA_descender 0x100049a /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */ -#define XKB_KEY_Cyrillic_ka_descender 0x100049b /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */ -#define XKB_KEY_Cyrillic_KA_vertstroke 0x100049c /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */ -#define XKB_KEY_Cyrillic_ka_vertstroke 0x100049d /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */ -#define XKB_KEY_Cyrillic_EN_descender 0x10004a2 /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */ -#define XKB_KEY_Cyrillic_en_descender 0x10004a3 /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */ -#define XKB_KEY_Cyrillic_U_straight 0x10004ae /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */ -#define XKB_KEY_Cyrillic_u_straight 0x10004af /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */ -#define XKB_KEY_Cyrillic_U_straight_bar 0x10004b0 /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */ -#define XKB_KEY_Cyrillic_u_straight_bar 0x10004b1 /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */ -#define XKB_KEY_Cyrillic_HA_descender 0x10004b2 /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */ -#define XKB_KEY_Cyrillic_ha_descender 0x10004b3 /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */ -#define XKB_KEY_Cyrillic_CHE_descender 0x10004b6 /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */ -#define XKB_KEY_Cyrillic_che_descender 0x10004b7 /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */ -#define XKB_KEY_Cyrillic_CHE_vertstroke 0x10004b8 /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */ -#define XKB_KEY_Cyrillic_che_vertstroke 0x10004b9 /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */ -#define XKB_KEY_Cyrillic_SHHA 0x10004ba /* U+04BA CYRILLIC CAPITAL LETTER SHHA */ -#define XKB_KEY_Cyrillic_shha 0x10004bb /* U+04BB CYRILLIC SMALL LETTER SHHA */ - -#define XKB_KEY_Cyrillic_SCHWA 0x10004d8 /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */ -#define XKB_KEY_Cyrillic_schwa 0x10004d9 /* U+04D9 CYRILLIC SMALL LETTER SCHWA */ -#define XKB_KEY_Cyrillic_I_macron 0x10004e2 /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */ -#define XKB_KEY_Cyrillic_i_macron 0x10004e3 /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */ -#define XKB_KEY_Cyrillic_O_bar 0x10004e8 /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */ -#define XKB_KEY_Cyrillic_o_bar 0x10004e9 /* U+04E9 CYRILLIC SMALL LETTER BARRED O */ -#define XKB_KEY_Cyrillic_U_macron 0x10004ee /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */ -#define XKB_KEY_Cyrillic_u_macron 0x10004ef /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */ - -#define XKB_KEY_Serbian_dje 0x06a1 /* U+0452 CYRILLIC SMALL LETTER DJE */ -#define XKB_KEY_Macedonia_gje 0x06a2 /* U+0453 CYRILLIC SMALL LETTER GJE */ -#define XKB_KEY_Cyrillic_io 0x06a3 /* U+0451 CYRILLIC SMALL LETTER IO */ -#define XKB_KEY_Ukrainian_ie 0x06a4 /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */ -#define XKB_KEY_Ukranian_je 0x06a4 /* deprecated */ -#define XKB_KEY_Macedonia_dse 0x06a5 /* U+0455 CYRILLIC SMALL LETTER DZE */ -#define XKB_KEY_Ukrainian_i 0x06a6 /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ -#define XKB_KEY_Ukranian_i 0x06a6 /* deprecated */ -#define XKB_KEY_Ukrainian_yi 0x06a7 /* U+0457 CYRILLIC SMALL LETTER YI */ -#define XKB_KEY_Ukranian_yi 0x06a7 /* deprecated */ -#define XKB_KEY_Cyrillic_je 0x06a8 /* U+0458 CYRILLIC SMALL LETTER JE */ -#define XKB_KEY_Serbian_je 0x06a8 /* deprecated */ -#define XKB_KEY_Cyrillic_lje 0x06a9 /* U+0459 CYRILLIC SMALL LETTER LJE */ -#define XKB_KEY_Serbian_lje 0x06a9 /* deprecated */ -#define XKB_KEY_Cyrillic_nje 0x06aa /* U+045A CYRILLIC SMALL LETTER NJE */ -#define XKB_KEY_Serbian_nje 0x06aa /* deprecated */ -#define XKB_KEY_Serbian_tshe 0x06ab /* U+045B CYRILLIC SMALL LETTER TSHE */ -#define XKB_KEY_Macedonia_kje 0x06ac /* U+045C CYRILLIC SMALL LETTER KJE */ -#define XKB_KEY_Ukrainian_ghe_with_upturn 0x06ad /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */ -#define XKB_KEY_Byelorussian_shortu 0x06ae /* U+045E CYRILLIC SMALL LETTER SHORT U */ -#define XKB_KEY_Cyrillic_dzhe 0x06af /* U+045F CYRILLIC SMALL LETTER DZHE */ -#define XKB_KEY_Serbian_dze 0x06af /* deprecated */ -#define XKB_KEY_numerosign 0x06b0 /* U+2116 NUMERO SIGN */ -#define XKB_KEY_Serbian_DJE 0x06b1 /* U+0402 CYRILLIC CAPITAL LETTER DJE */ -#define XKB_KEY_Macedonia_GJE 0x06b2 /* U+0403 CYRILLIC CAPITAL LETTER GJE */ -#define XKB_KEY_Cyrillic_IO 0x06b3 /* U+0401 CYRILLIC CAPITAL LETTER IO */ -#define XKB_KEY_Ukrainian_IE 0x06b4 /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */ -#define XKB_KEY_Ukranian_JE 0x06b4 /* deprecated */ -#define XKB_KEY_Macedonia_DSE 0x06b5 /* U+0405 CYRILLIC CAPITAL LETTER DZE */ -#define XKB_KEY_Ukrainian_I 0x06b6 /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ -#define XKB_KEY_Ukranian_I 0x06b6 /* deprecated */ -#define XKB_KEY_Ukrainian_YI 0x06b7 /* U+0407 CYRILLIC CAPITAL LETTER YI */ -#define XKB_KEY_Ukranian_YI 0x06b7 /* deprecated */ -#define XKB_KEY_Cyrillic_JE 0x06b8 /* U+0408 CYRILLIC CAPITAL LETTER JE */ -#define XKB_KEY_Serbian_JE 0x06b8 /* deprecated */ -#define XKB_KEY_Cyrillic_LJE 0x06b9 /* U+0409 CYRILLIC CAPITAL LETTER LJE */ -#define XKB_KEY_Serbian_LJE 0x06b9 /* deprecated */ -#define XKB_KEY_Cyrillic_NJE 0x06ba /* U+040A CYRILLIC CAPITAL LETTER NJE */ -#define XKB_KEY_Serbian_NJE 0x06ba /* deprecated */ -#define XKB_KEY_Serbian_TSHE 0x06bb /* U+040B CYRILLIC CAPITAL LETTER TSHE */ -#define XKB_KEY_Macedonia_KJE 0x06bc /* U+040C CYRILLIC CAPITAL LETTER KJE */ -#define XKB_KEY_Ukrainian_GHE_WITH_UPTURN 0x06bd /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ -#define XKB_KEY_Byelorussian_SHORTU 0x06be /* U+040E CYRILLIC CAPITAL LETTER SHORT U */ -#define XKB_KEY_Cyrillic_DZHE 0x06bf /* U+040F CYRILLIC CAPITAL LETTER DZHE */ -#define XKB_KEY_Serbian_DZE 0x06bf /* deprecated */ -#define XKB_KEY_Cyrillic_yu 0x06c0 /* U+044E CYRILLIC SMALL LETTER YU */ -#define XKB_KEY_Cyrillic_a 0x06c1 /* U+0430 CYRILLIC SMALL LETTER A */ -#define XKB_KEY_Cyrillic_be 0x06c2 /* U+0431 CYRILLIC SMALL LETTER BE */ -#define XKB_KEY_Cyrillic_tse 0x06c3 /* U+0446 CYRILLIC SMALL LETTER TSE */ -#define XKB_KEY_Cyrillic_de 0x06c4 /* U+0434 CYRILLIC SMALL LETTER DE */ -#define XKB_KEY_Cyrillic_ie 0x06c5 /* U+0435 CYRILLIC SMALL LETTER IE */ -#define XKB_KEY_Cyrillic_ef 0x06c6 /* U+0444 CYRILLIC SMALL LETTER EF */ -#define XKB_KEY_Cyrillic_ghe 0x06c7 /* U+0433 CYRILLIC SMALL LETTER GHE */ -#define XKB_KEY_Cyrillic_ha 0x06c8 /* U+0445 CYRILLIC SMALL LETTER HA */ -#define XKB_KEY_Cyrillic_i 0x06c9 /* U+0438 CYRILLIC SMALL LETTER I */ -#define XKB_KEY_Cyrillic_shorti 0x06ca /* U+0439 CYRILLIC SMALL LETTER SHORT I */ -#define XKB_KEY_Cyrillic_ka 0x06cb /* U+043A CYRILLIC SMALL LETTER KA */ -#define XKB_KEY_Cyrillic_el 0x06cc /* U+043B CYRILLIC SMALL LETTER EL */ -#define XKB_KEY_Cyrillic_em 0x06cd /* U+043C CYRILLIC SMALL LETTER EM */ -#define XKB_KEY_Cyrillic_en 0x06ce /* U+043D CYRILLIC SMALL LETTER EN */ -#define XKB_KEY_Cyrillic_o 0x06cf /* U+043E CYRILLIC SMALL LETTER O */ -#define XKB_KEY_Cyrillic_pe 0x06d0 /* U+043F CYRILLIC SMALL LETTER PE */ -#define XKB_KEY_Cyrillic_ya 0x06d1 /* U+044F CYRILLIC SMALL LETTER YA */ -#define XKB_KEY_Cyrillic_er 0x06d2 /* U+0440 CYRILLIC SMALL LETTER ER */ -#define XKB_KEY_Cyrillic_es 0x06d3 /* U+0441 CYRILLIC SMALL LETTER ES */ -#define XKB_KEY_Cyrillic_te 0x06d4 /* U+0442 CYRILLIC SMALL LETTER TE */ -#define XKB_KEY_Cyrillic_u 0x06d5 /* U+0443 CYRILLIC SMALL LETTER U */ -#define XKB_KEY_Cyrillic_zhe 0x06d6 /* U+0436 CYRILLIC SMALL LETTER ZHE */ -#define XKB_KEY_Cyrillic_ve 0x06d7 /* U+0432 CYRILLIC SMALL LETTER VE */ -#define XKB_KEY_Cyrillic_softsign 0x06d8 /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */ -#define XKB_KEY_Cyrillic_yeru 0x06d9 /* U+044B CYRILLIC SMALL LETTER YERU */ -#define XKB_KEY_Cyrillic_ze 0x06da /* U+0437 CYRILLIC SMALL LETTER ZE */ -#define XKB_KEY_Cyrillic_sha 0x06db /* U+0448 CYRILLIC SMALL LETTER SHA */ -#define XKB_KEY_Cyrillic_e 0x06dc /* U+044D CYRILLIC SMALL LETTER E */ -#define XKB_KEY_Cyrillic_shcha 0x06dd /* U+0449 CYRILLIC SMALL LETTER SHCHA */ -#define XKB_KEY_Cyrillic_che 0x06de /* U+0447 CYRILLIC SMALL LETTER CHE */ -#define XKB_KEY_Cyrillic_hardsign 0x06df /* U+044A CYRILLIC SMALL LETTER HARD SIGN */ -#define XKB_KEY_Cyrillic_YU 0x06e0 /* U+042E CYRILLIC CAPITAL LETTER YU */ -#define XKB_KEY_Cyrillic_A 0x06e1 /* U+0410 CYRILLIC CAPITAL LETTER A */ -#define XKB_KEY_Cyrillic_BE 0x06e2 /* U+0411 CYRILLIC CAPITAL LETTER BE */ -#define XKB_KEY_Cyrillic_TSE 0x06e3 /* U+0426 CYRILLIC CAPITAL LETTER TSE */ -#define XKB_KEY_Cyrillic_DE 0x06e4 /* U+0414 CYRILLIC CAPITAL LETTER DE */ -#define XKB_KEY_Cyrillic_IE 0x06e5 /* U+0415 CYRILLIC CAPITAL LETTER IE */ -#define XKB_KEY_Cyrillic_EF 0x06e6 /* U+0424 CYRILLIC CAPITAL LETTER EF */ -#define XKB_KEY_Cyrillic_GHE 0x06e7 /* U+0413 CYRILLIC CAPITAL LETTER GHE */ -#define XKB_KEY_Cyrillic_HA 0x06e8 /* U+0425 CYRILLIC CAPITAL LETTER HA */ -#define XKB_KEY_Cyrillic_I 0x06e9 /* U+0418 CYRILLIC CAPITAL LETTER I */ -#define XKB_KEY_Cyrillic_SHORTI 0x06ea /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */ -#define XKB_KEY_Cyrillic_KA 0x06eb /* U+041A CYRILLIC CAPITAL LETTER KA */ -#define XKB_KEY_Cyrillic_EL 0x06ec /* U+041B CYRILLIC CAPITAL LETTER EL */ -#define XKB_KEY_Cyrillic_EM 0x06ed /* U+041C CYRILLIC CAPITAL LETTER EM */ -#define XKB_KEY_Cyrillic_EN 0x06ee /* U+041D CYRILLIC CAPITAL LETTER EN */ -#define XKB_KEY_Cyrillic_O 0x06ef /* U+041E CYRILLIC CAPITAL LETTER O */ -#define XKB_KEY_Cyrillic_PE 0x06f0 /* U+041F CYRILLIC CAPITAL LETTER PE */ -#define XKB_KEY_Cyrillic_YA 0x06f1 /* U+042F CYRILLIC CAPITAL LETTER YA */ -#define XKB_KEY_Cyrillic_ER 0x06f2 /* U+0420 CYRILLIC CAPITAL LETTER ER */ -#define XKB_KEY_Cyrillic_ES 0x06f3 /* U+0421 CYRILLIC CAPITAL LETTER ES */ -#define XKB_KEY_Cyrillic_TE 0x06f4 /* U+0422 CYRILLIC CAPITAL LETTER TE */ -#define XKB_KEY_Cyrillic_U 0x06f5 /* U+0423 CYRILLIC CAPITAL LETTER U */ -#define XKB_KEY_Cyrillic_ZHE 0x06f6 /* U+0416 CYRILLIC CAPITAL LETTER ZHE */ -#define XKB_KEY_Cyrillic_VE 0x06f7 /* U+0412 CYRILLIC CAPITAL LETTER VE */ -#define XKB_KEY_Cyrillic_SOFTSIGN 0x06f8 /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */ -#define XKB_KEY_Cyrillic_YERU 0x06f9 /* U+042B CYRILLIC CAPITAL LETTER YERU */ -#define XKB_KEY_Cyrillic_ZE 0x06fa /* U+0417 CYRILLIC CAPITAL LETTER ZE */ -#define XKB_KEY_Cyrillic_SHA 0x06fb /* U+0428 CYRILLIC CAPITAL LETTER SHA */ -#define XKB_KEY_Cyrillic_E 0x06fc /* U+042D CYRILLIC CAPITAL LETTER E */ -#define XKB_KEY_Cyrillic_SHCHA 0x06fd /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */ -#define XKB_KEY_Cyrillic_CHE 0x06fe /* U+0427 CYRILLIC CAPITAL LETTER CHE */ -#define XKB_KEY_Cyrillic_HARDSIGN 0x06ff /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */ - -/* - * Greek - * (based on an early draft of, and not quite identical to, ISO/IEC 8859-7) - * Byte 3 = 7 - */ - -#define XKB_KEY_Greek_ALPHAaccent 0x07a1 /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */ -#define XKB_KEY_Greek_EPSILONaccent 0x07a2 /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */ -#define XKB_KEY_Greek_ETAaccent 0x07a3 /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */ -#define XKB_KEY_Greek_IOTAaccent 0x07a4 /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */ -#define XKB_KEY_Greek_IOTAdieresis 0x07a5 /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ -#define XKB_KEY_Greek_IOTAdiaeresis 0x07a5 /* old typo */ -#define XKB_KEY_Greek_OMICRONaccent 0x07a7 /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */ -#define XKB_KEY_Greek_UPSILONaccent 0x07a8 /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */ -#define XKB_KEY_Greek_UPSILONdieresis 0x07a9 /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ -#define XKB_KEY_Greek_OMEGAaccent 0x07ab /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */ -#define XKB_KEY_Greek_accentdieresis 0x07ae /* U+0385 GREEK DIALYTIKA TONOS */ -#define XKB_KEY_Greek_horizbar 0x07af /* U+2015 HORIZONTAL BAR */ -#define XKB_KEY_Greek_alphaaccent 0x07b1 /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */ -#define XKB_KEY_Greek_epsilonaccent 0x07b2 /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */ -#define XKB_KEY_Greek_etaaccent 0x07b3 /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */ -#define XKB_KEY_Greek_iotaaccent 0x07b4 /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */ -#define XKB_KEY_Greek_iotadieresis 0x07b5 /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */ -#define XKB_KEY_Greek_iotaaccentdieresis 0x07b6 /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ -#define XKB_KEY_Greek_omicronaccent 0x07b7 /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */ -#define XKB_KEY_Greek_upsilonaccent 0x07b8 /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */ -#define XKB_KEY_Greek_upsilondieresis 0x07b9 /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ -#define XKB_KEY_Greek_upsilonaccentdieresis 0x07ba /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ -#define XKB_KEY_Greek_omegaaccent 0x07bb /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */ -#define XKB_KEY_Greek_ALPHA 0x07c1 /* U+0391 GREEK CAPITAL LETTER ALPHA */ -#define XKB_KEY_Greek_BETA 0x07c2 /* U+0392 GREEK CAPITAL LETTER BETA */ -#define XKB_KEY_Greek_GAMMA 0x07c3 /* U+0393 GREEK CAPITAL LETTER GAMMA */ -#define XKB_KEY_Greek_DELTA 0x07c4 /* U+0394 GREEK CAPITAL LETTER DELTA */ -#define XKB_KEY_Greek_EPSILON 0x07c5 /* U+0395 GREEK CAPITAL LETTER EPSILON */ -#define XKB_KEY_Greek_ZETA 0x07c6 /* U+0396 GREEK CAPITAL LETTER ZETA */ -#define XKB_KEY_Greek_ETA 0x07c7 /* U+0397 GREEK CAPITAL LETTER ETA */ -#define XKB_KEY_Greek_THETA 0x07c8 /* U+0398 GREEK CAPITAL LETTER THETA */ -#define XKB_KEY_Greek_IOTA 0x07c9 /* U+0399 GREEK CAPITAL LETTER IOTA */ -#define XKB_KEY_Greek_KAPPA 0x07ca /* U+039A GREEK CAPITAL LETTER KAPPA */ -#define XKB_KEY_Greek_LAMDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ -#define XKB_KEY_Greek_LAMBDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ -#define XKB_KEY_Greek_MU 0x07cc /* U+039C GREEK CAPITAL LETTER MU */ -#define XKB_KEY_Greek_NU 0x07cd /* U+039D GREEK CAPITAL LETTER NU */ -#define XKB_KEY_Greek_XI 0x07ce /* U+039E GREEK CAPITAL LETTER XI */ -#define XKB_KEY_Greek_OMICRON 0x07cf /* U+039F GREEK CAPITAL LETTER OMICRON */ -#define XKB_KEY_Greek_PI 0x07d0 /* U+03A0 GREEK CAPITAL LETTER PI */ -#define XKB_KEY_Greek_RHO 0x07d1 /* U+03A1 GREEK CAPITAL LETTER RHO */ -#define XKB_KEY_Greek_SIGMA 0x07d2 /* U+03A3 GREEK CAPITAL LETTER SIGMA */ -#define XKB_KEY_Greek_TAU 0x07d4 /* U+03A4 GREEK CAPITAL LETTER TAU */ -#define XKB_KEY_Greek_UPSILON 0x07d5 /* U+03A5 GREEK CAPITAL LETTER UPSILON */ -#define XKB_KEY_Greek_PHI 0x07d6 /* U+03A6 GREEK CAPITAL LETTER PHI */ -#define XKB_KEY_Greek_CHI 0x07d7 /* U+03A7 GREEK CAPITAL LETTER CHI */ -#define XKB_KEY_Greek_PSI 0x07d8 /* U+03A8 GREEK CAPITAL LETTER PSI */ -#define XKB_KEY_Greek_OMEGA 0x07d9 /* U+03A9 GREEK CAPITAL LETTER OMEGA */ -#define XKB_KEY_Greek_alpha 0x07e1 /* U+03B1 GREEK SMALL LETTER ALPHA */ -#define XKB_KEY_Greek_beta 0x07e2 /* U+03B2 GREEK SMALL LETTER BETA */ -#define XKB_KEY_Greek_gamma 0x07e3 /* U+03B3 GREEK SMALL LETTER GAMMA */ -#define XKB_KEY_Greek_delta 0x07e4 /* U+03B4 GREEK SMALL LETTER DELTA */ -#define XKB_KEY_Greek_epsilon 0x07e5 /* U+03B5 GREEK SMALL LETTER EPSILON */ -#define XKB_KEY_Greek_zeta 0x07e6 /* U+03B6 GREEK SMALL LETTER ZETA */ -#define XKB_KEY_Greek_eta 0x07e7 /* U+03B7 GREEK SMALL LETTER ETA */ -#define XKB_KEY_Greek_theta 0x07e8 /* U+03B8 GREEK SMALL LETTER THETA */ -#define XKB_KEY_Greek_iota 0x07e9 /* U+03B9 GREEK SMALL LETTER IOTA */ -#define XKB_KEY_Greek_kappa 0x07ea /* U+03BA GREEK SMALL LETTER KAPPA */ -#define XKB_KEY_Greek_lamda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ -#define XKB_KEY_Greek_lambda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ -#define XKB_KEY_Greek_mu 0x07ec /* U+03BC GREEK SMALL LETTER MU */ -#define XKB_KEY_Greek_nu 0x07ed /* U+03BD GREEK SMALL LETTER NU */ -#define XKB_KEY_Greek_xi 0x07ee /* U+03BE GREEK SMALL LETTER XI */ -#define XKB_KEY_Greek_omicron 0x07ef /* U+03BF GREEK SMALL LETTER OMICRON */ -#define XKB_KEY_Greek_pi 0x07f0 /* U+03C0 GREEK SMALL LETTER PI */ -#define XKB_KEY_Greek_rho 0x07f1 /* U+03C1 GREEK SMALL LETTER RHO */ -#define XKB_KEY_Greek_sigma 0x07f2 /* U+03C3 GREEK SMALL LETTER SIGMA */ -#define XKB_KEY_Greek_finalsmallsigma 0x07f3 /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */ -#define XKB_KEY_Greek_tau 0x07f4 /* U+03C4 GREEK SMALL LETTER TAU */ -#define XKB_KEY_Greek_upsilon 0x07f5 /* U+03C5 GREEK SMALL LETTER UPSILON */ -#define XKB_KEY_Greek_phi 0x07f6 /* U+03C6 GREEK SMALL LETTER PHI */ -#define XKB_KEY_Greek_chi 0x07f7 /* U+03C7 GREEK SMALL LETTER CHI */ -#define XKB_KEY_Greek_psi 0x07f8 /* U+03C8 GREEK SMALL LETTER PSI */ -#define XKB_KEY_Greek_omega 0x07f9 /* U+03C9 GREEK SMALL LETTER OMEGA */ -#define XKB_KEY_Greek_switch 0xff7e /* Alias for mode_switch */ - -/* - * Technical - * (from the DEC VT330/VT420 Technical Character Set, http://vt100.net/charsets/technical.html) - * Byte 3 = 8 - */ - -#define XKB_KEY_leftradical 0x08a1 /* U+23B7 RADICAL SYMBOL BOTTOM */ -#define XKB_KEY_topleftradical 0x08a2 /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/ -#define XKB_KEY_horizconnector 0x08a3 /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/ -#define XKB_KEY_topintegral 0x08a4 /* U+2320 TOP HALF INTEGRAL */ -#define XKB_KEY_botintegral 0x08a5 /* U+2321 BOTTOM HALF INTEGRAL */ -#define XKB_KEY_vertconnector 0x08a6 /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/ -#define XKB_KEY_topleftsqbracket 0x08a7 /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */ -#define XKB_KEY_botleftsqbracket 0x08a8 /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */ -#define XKB_KEY_toprightsqbracket 0x08a9 /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */ -#define XKB_KEY_botrightsqbracket 0x08aa /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */ -#define XKB_KEY_topleftparens 0x08ab /* U+239B LEFT PARENTHESIS UPPER HOOK */ -#define XKB_KEY_botleftparens 0x08ac /* U+239D LEFT PARENTHESIS LOWER HOOK */ -#define XKB_KEY_toprightparens 0x08ad /* U+239E RIGHT PARENTHESIS UPPER HOOK */ -#define XKB_KEY_botrightparens 0x08ae /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */ -#define XKB_KEY_leftmiddlecurlybrace 0x08af /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */ -#define XKB_KEY_rightmiddlecurlybrace 0x08b0 /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */ -#define XKB_KEY_topleftsummation 0x08b1 -#define XKB_KEY_botleftsummation 0x08b2 -#define XKB_KEY_topvertsummationconnector 0x08b3 -#define XKB_KEY_botvertsummationconnector 0x08b4 -#define XKB_KEY_toprightsummation 0x08b5 -#define XKB_KEY_botrightsummation 0x08b6 -#define XKB_KEY_rightmiddlesummation 0x08b7 -#define XKB_KEY_lessthanequal 0x08bc /* U+2264 LESS-THAN OR EQUAL TO */ -#define XKB_KEY_notequal 0x08bd /* U+2260 NOT EQUAL TO */ -#define XKB_KEY_greaterthanequal 0x08be /* U+2265 GREATER-THAN OR EQUAL TO */ -#define XKB_KEY_integral 0x08bf /* U+222B INTEGRAL */ -#define XKB_KEY_therefore 0x08c0 /* U+2234 THEREFORE */ -#define XKB_KEY_variation 0x08c1 /* U+221D PROPORTIONAL TO */ -#define XKB_KEY_infinity 0x08c2 /* U+221E INFINITY */ -#define XKB_KEY_nabla 0x08c5 /* U+2207 NABLA */ -#define XKB_KEY_approximate 0x08c8 /* U+223C TILDE OPERATOR */ -#define XKB_KEY_similarequal 0x08c9 /* U+2243 ASYMPTOTICALLY EQUAL TO */ -#define XKB_KEY_ifonlyif 0x08cd /* U+21D4 LEFT RIGHT DOUBLE ARROW */ -#define XKB_KEY_implies 0x08ce /* U+21D2 RIGHTWARDS DOUBLE ARROW */ -#define XKB_KEY_identical 0x08cf /* U+2261 IDENTICAL TO */ -#define XKB_KEY_radical 0x08d6 /* U+221A SQUARE ROOT */ -#define XKB_KEY_includedin 0x08da /* U+2282 SUBSET OF */ -#define XKB_KEY_includes 0x08db /* U+2283 SUPERSET OF */ -#define XKB_KEY_intersection 0x08dc /* U+2229 INTERSECTION */ -#define XKB_KEY_union 0x08dd /* U+222A UNION */ -#define XKB_KEY_logicaland 0x08de /* U+2227 LOGICAL AND */ -#define XKB_KEY_logicalor 0x08df /* U+2228 LOGICAL OR */ -#define XKB_KEY_partialderivative 0x08ef /* U+2202 PARTIAL DIFFERENTIAL */ -#define XKB_KEY_function 0x08f6 /* U+0192 LATIN SMALL LETTER F WITH HOOK */ -#define XKB_KEY_leftarrow 0x08fb /* U+2190 LEFTWARDS ARROW */ -#define XKB_KEY_uparrow 0x08fc /* U+2191 UPWARDS ARROW */ -#define XKB_KEY_rightarrow 0x08fd /* U+2192 RIGHTWARDS ARROW */ -#define XKB_KEY_downarrow 0x08fe /* U+2193 DOWNWARDS ARROW */ - -/* - * Special - * (from the DEC VT100 Special Graphics Character Set) - * Byte 3 = 9 - */ - -#define XKB_KEY_blank 0x09df -#define XKB_KEY_soliddiamond 0x09e0 /* U+25C6 BLACK DIAMOND */ -#define XKB_KEY_checkerboard 0x09e1 /* U+2592 MEDIUM SHADE */ -#define XKB_KEY_ht 0x09e2 /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */ -#define XKB_KEY_ff 0x09e3 /* U+240C SYMBOL FOR FORM FEED */ -#define XKB_KEY_cr 0x09e4 /* U+240D SYMBOL FOR CARRIAGE RETURN */ -#define XKB_KEY_lf 0x09e5 /* U+240A SYMBOL FOR LINE FEED */ -#define XKB_KEY_nl 0x09e8 /* U+2424 SYMBOL FOR NEWLINE */ -#define XKB_KEY_vt 0x09e9 /* U+240B SYMBOL FOR VERTICAL TABULATION */ -#define XKB_KEY_lowrightcorner 0x09ea /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */ -#define XKB_KEY_uprightcorner 0x09eb /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */ -#define XKB_KEY_upleftcorner 0x09ec /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */ -#define XKB_KEY_lowleftcorner 0x09ed /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */ -#define XKB_KEY_crossinglines 0x09ee /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ -#define XKB_KEY_horizlinescan1 0x09ef /* U+23BA HORIZONTAL SCAN LINE-1 */ -#define XKB_KEY_horizlinescan3 0x09f0 /* U+23BB HORIZONTAL SCAN LINE-3 */ -#define XKB_KEY_horizlinescan5 0x09f1 /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */ -#define XKB_KEY_horizlinescan7 0x09f2 /* U+23BC HORIZONTAL SCAN LINE-7 */ -#define XKB_KEY_horizlinescan9 0x09f3 /* U+23BD HORIZONTAL SCAN LINE-9 */ -#define XKB_KEY_leftt 0x09f4 /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ -#define XKB_KEY_rightt 0x09f5 /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */ -#define XKB_KEY_bott 0x09f6 /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */ -#define XKB_KEY_topt 0x09f7 /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ -#define XKB_KEY_vertbar 0x09f8 /* U+2502 BOX DRAWINGS LIGHT VERTICAL */ - -/* - * Publishing - * (these are probably from a long forgotten DEC Publishing - * font that once shipped with DECwrite) - * Byte 3 = 0x0a - */ - -#define XKB_KEY_emspace 0x0aa1 /* U+2003 EM SPACE */ -#define XKB_KEY_enspace 0x0aa2 /* U+2002 EN SPACE */ -#define XKB_KEY_em3space 0x0aa3 /* U+2004 THREE-PER-EM SPACE */ -#define XKB_KEY_em4space 0x0aa4 /* U+2005 FOUR-PER-EM SPACE */ -#define XKB_KEY_digitspace 0x0aa5 /* U+2007 FIGURE SPACE */ -#define XKB_KEY_punctspace 0x0aa6 /* U+2008 PUNCTUATION SPACE */ -#define XKB_KEY_thinspace 0x0aa7 /* U+2009 THIN SPACE */ -#define XKB_KEY_hairspace 0x0aa8 /* U+200A HAIR SPACE */ -#define XKB_KEY_emdash 0x0aa9 /* U+2014 EM DASH */ -#define XKB_KEY_endash 0x0aaa /* U+2013 EN DASH */ -#define XKB_KEY_signifblank 0x0aac /*(U+2423 OPEN BOX)*/ -#define XKB_KEY_ellipsis 0x0aae /* U+2026 HORIZONTAL ELLIPSIS */ -#define XKB_KEY_doubbaselinedot 0x0aaf /* U+2025 TWO DOT LEADER */ -#define XKB_KEY_onethird 0x0ab0 /* U+2153 VULGAR FRACTION ONE THIRD */ -#define XKB_KEY_twothirds 0x0ab1 /* U+2154 VULGAR FRACTION TWO THIRDS */ -#define XKB_KEY_onefifth 0x0ab2 /* U+2155 VULGAR FRACTION ONE FIFTH */ -#define XKB_KEY_twofifths 0x0ab3 /* U+2156 VULGAR FRACTION TWO FIFTHS */ -#define XKB_KEY_threefifths 0x0ab4 /* U+2157 VULGAR FRACTION THREE FIFTHS */ -#define XKB_KEY_fourfifths 0x0ab5 /* U+2158 VULGAR FRACTION FOUR FIFTHS */ -#define XKB_KEY_onesixth 0x0ab6 /* U+2159 VULGAR FRACTION ONE SIXTH */ -#define XKB_KEY_fivesixths 0x0ab7 /* U+215A VULGAR FRACTION FIVE SIXTHS */ -#define XKB_KEY_careof 0x0ab8 /* U+2105 CARE OF */ -#define XKB_KEY_figdash 0x0abb /* U+2012 FIGURE DASH */ -#define XKB_KEY_leftanglebracket 0x0abc /*(U+27E8 MATHEMATICAL LEFT ANGLE BRACKET)*/ -#define XKB_KEY_decimalpoint 0x0abd /*(U+002E FULL STOP)*/ -#define XKB_KEY_rightanglebracket 0x0abe /*(U+27E9 MATHEMATICAL RIGHT ANGLE BRACKET)*/ -#define XKB_KEY_marker 0x0abf -#define XKB_KEY_oneeighth 0x0ac3 /* U+215B VULGAR FRACTION ONE EIGHTH */ -#define XKB_KEY_threeeighths 0x0ac4 /* U+215C VULGAR FRACTION THREE EIGHTHS */ -#define XKB_KEY_fiveeighths 0x0ac5 /* U+215D VULGAR FRACTION FIVE EIGHTHS */ -#define XKB_KEY_seveneighths 0x0ac6 /* U+215E VULGAR FRACTION SEVEN EIGHTHS */ -#define XKB_KEY_trademark 0x0ac9 /* U+2122 TRADE MARK SIGN */ -#define XKB_KEY_signaturemark 0x0aca /*(U+2613 SALTIRE)*/ -#define XKB_KEY_trademarkincircle 0x0acb -#define XKB_KEY_leftopentriangle 0x0acc /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/ -#define XKB_KEY_rightopentriangle 0x0acd /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/ -#define XKB_KEY_emopencircle 0x0ace /*(U+25CB WHITE CIRCLE)*/ -#define XKB_KEY_emopenrectangle 0x0acf /*(U+25AF WHITE VERTICAL RECTANGLE)*/ -#define XKB_KEY_leftsinglequotemark 0x0ad0 /* U+2018 LEFT SINGLE QUOTATION MARK */ -#define XKB_KEY_rightsinglequotemark 0x0ad1 /* U+2019 RIGHT SINGLE QUOTATION MARK */ -#define XKB_KEY_leftdoublequotemark 0x0ad2 /* U+201C LEFT DOUBLE QUOTATION MARK */ -#define XKB_KEY_rightdoublequotemark 0x0ad3 /* U+201D RIGHT DOUBLE QUOTATION MARK */ -#define XKB_KEY_prescription 0x0ad4 /* U+211E PRESCRIPTION TAKE */ -#define XKB_KEY_permille 0x0ad5 /* U+2030 PER MILLE SIGN */ -#define XKB_KEY_minutes 0x0ad6 /* U+2032 PRIME */ -#define XKB_KEY_seconds 0x0ad7 /* U+2033 DOUBLE PRIME */ -#define XKB_KEY_latincross 0x0ad9 /* U+271D LATIN CROSS */ -#define XKB_KEY_hexagram 0x0ada -#define XKB_KEY_filledrectbullet 0x0adb /*(U+25AC BLACK RECTANGLE)*/ -#define XKB_KEY_filledlefttribullet 0x0adc /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/ -#define XKB_KEY_filledrighttribullet 0x0add /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/ -#define XKB_KEY_emfilledcircle 0x0ade /*(U+25CF BLACK CIRCLE)*/ -#define XKB_KEY_emfilledrect 0x0adf /*(U+25AE BLACK VERTICAL RECTANGLE)*/ -#define XKB_KEY_enopencircbullet 0x0ae0 /*(U+25E6 WHITE BULLET)*/ -#define XKB_KEY_enopensquarebullet 0x0ae1 /*(U+25AB WHITE SMALL SQUARE)*/ -#define XKB_KEY_openrectbullet 0x0ae2 /*(U+25AD WHITE RECTANGLE)*/ -#define XKB_KEY_opentribulletup 0x0ae3 /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/ -#define XKB_KEY_opentribulletdown 0x0ae4 /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/ -#define XKB_KEY_openstar 0x0ae5 /*(U+2606 WHITE STAR)*/ -#define XKB_KEY_enfilledcircbullet 0x0ae6 /*(U+2022 BULLET)*/ -#define XKB_KEY_enfilledsqbullet 0x0ae7 /*(U+25AA BLACK SMALL SQUARE)*/ -#define XKB_KEY_filledtribulletup 0x0ae8 /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/ -#define XKB_KEY_filledtribulletdown 0x0ae9 /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/ -#define XKB_KEY_leftpointer 0x0aea /*(U+261C WHITE LEFT POINTING INDEX)*/ -#define XKB_KEY_rightpointer 0x0aeb /*(U+261E WHITE RIGHT POINTING INDEX)*/ -#define XKB_KEY_club 0x0aec /* U+2663 BLACK CLUB SUIT */ -#define XKB_KEY_diamond 0x0aed /* U+2666 BLACK DIAMOND SUIT */ -#define XKB_KEY_heart 0x0aee /* U+2665 BLACK HEART SUIT */ -#define XKB_KEY_maltesecross 0x0af0 /* U+2720 MALTESE CROSS */ -#define XKB_KEY_dagger 0x0af1 /* U+2020 DAGGER */ -#define XKB_KEY_doubledagger 0x0af2 /* U+2021 DOUBLE DAGGER */ -#define XKB_KEY_checkmark 0x0af3 /* U+2713 CHECK MARK */ -#define XKB_KEY_ballotcross 0x0af4 /* U+2717 BALLOT X */ -#define XKB_KEY_musicalsharp 0x0af5 /* U+266F MUSIC SHARP SIGN */ -#define XKB_KEY_musicalflat 0x0af6 /* U+266D MUSIC FLAT SIGN */ -#define XKB_KEY_malesymbol 0x0af7 /* U+2642 MALE SIGN */ -#define XKB_KEY_femalesymbol 0x0af8 /* U+2640 FEMALE SIGN */ -#define XKB_KEY_telephone 0x0af9 /* U+260E BLACK TELEPHONE */ -#define XKB_KEY_telephonerecorder 0x0afa /* U+2315 TELEPHONE RECORDER */ -#define XKB_KEY_phonographcopyright 0x0afb /* U+2117 SOUND RECORDING COPYRIGHT */ -#define XKB_KEY_caret 0x0afc /* U+2038 CARET */ -#define XKB_KEY_singlelowquotemark 0x0afd /* U+201A SINGLE LOW-9 QUOTATION MARK */ -#define XKB_KEY_doublelowquotemark 0x0afe /* U+201E DOUBLE LOW-9 QUOTATION MARK */ -#define XKB_KEY_cursor 0x0aff - -/* - * APL - * Byte 3 = 0x0b - */ - -#define XKB_KEY_leftcaret 0x0ba3 /*(U+003C LESS-THAN SIGN)*/ -#define XKB_KEY_rightcaret 0x0ba6 /*(U+003E GREATER-THAN SIGN)*/ -#define XKB_KEY_downcaret 0x0ba8 /*(U+2228 LOGICAL OR)*/ -#define XKB_KEY_upcaret 0x0ba9 /*(U+2227 LOGICAL AND)*/ -#define XKB_KEY_overbar 0x0bc0 /*(U+00AF MACRON)*/ -#define XKB_KEY_downtack 0x0bc2 /* U+22A4 DOWN TACK */ -#define XKB_KEY_upshoe 0x0bc3 /*(U+2229 INTERSECTION)*/ -#define XKB_KEY_downstile 0x0bc4 /* U+230A LEFT FLOOR */ -#define XKB_KEY_underbar 0x0bc6 /*(U+005F LOW LINE)*/ -#define XKB_KEY_jot 0x0bca /* U+2218 RING OPERATOR */ -#define XKB_KEY_quad 0x0bcc /* U+2395 APL FUNCTIONAL SYMBOL QUAD */ -#define XKB_KEY_uptack 0x0bce /* U+22A5 UP TACK */ -#define XKB_KEY_circle 0x0bcf /* U+25CB WHITE CIRCLE */ -#define XKB_KEY_upstile 0x0bd3 /* U+2308 LEFT CEILING */ -#define XKB_KEY_downshoe 0x0bd6 /*(U+222A UNION)*/ -#define XKB_KEY_rightshoe 0x0bd8 /*(U+2283 SUPERSET OF)*/ -#define XKB_KEY_leftshoe 0x0bda /*(U+2282 SUBSET OF)*/ -#define XKB_KEY_lefttack 0x0bdc /* U+22A3 LEFT TACK */ -#define XKB_KEY_righttack 0x0bfc /* U+22A2 RIGHT TACK */ - -/* - * Hebrew - * Byte 3 = 0x0c - */ - -#define XKB_KEY_hebrew_doublelowline 0x0cdf /* U+2017 DOUBLE LOW LINE */ -#define XKB_KEY_hebrew_aleph 0x0ce0 /* U+05D0 HEBREW LETTER ALEF */ -#define XKB_KEY_hebrew_bet 0x0ce1 /* U+05D1 HEBREW LETTER BET */ -#define XKB_KEY_hebrew_beth 0x0ce1 /* deprecated */ -#define XKB_KEY_hebrew_gimel 0x0ce2 /* U+05D2 HEBREW LETTER GIMEL */ -#define XKB_KEY_hebrew_gimmel 0x0ce2 /* deprecated */ -#define XKB_KEY_hebrew_dalet 0x0ce3 /* U+05D3 HEBREW LETTER DALET */ -#define XKB_KEY_hebrew_daleth 0x0ce3 /* deprecated */ -#define XKB_KEY_hebrew_he 0x0ce4 /* U+05D4 HEBREW LETTER HE */ -#define XKB_KEY_hebrew_waw 0x0ce5 /* U+05D5 HEBREW LETTER VAV */ -#define XKB_KEY_hebrew_zain 0x0ce6 /* U+05D6 HEBREW LETTER ZAYIN */ -#define XKB_KEY_hebrew_zayin 0x0ce6 /* deprecated */ -#define XKB_KEY_hebrew_chet 0x0ce7 /* U+05D7 HEBREW LETTER HET */ -#define XKB_KEY_hebrew_het 0x0ce7 /* deprecated */ -#define XKB_KEY_hebrew_tet 0x0ce8 /* U+05D8 HEBREW LETTER TET */ -#define XKB_KEY_hebrew_teth 0x0ce8 /* deprecated */ -#define XKB_KEY_hebrew_yod 0x0ce9 /* U+05D9 HEBREW LETTER YOD */ -#define XKB_KEY_hebrew_finalkaph 0x0cea /* U+05DA HEBREW LETTER FINAL KAF */ -#define XKB_KEY_hebrew_kaph 0x0ceb /* U+05DB HEBREW LETTER KAF */ -#define XKB_KEY_hebrew_lamed 0x0cec /* U+05DC HEBREW LETTER LAMED */ -#define XKB_KEY_hebrew_finalmem 0x0ced /* U+05DD HEBREW LETTER FINAL MEM */ -#define XKB_KEY_hebrew_mem 0x0cee /* U+05DE HEBREW LETTER MEM */ -#define XKB_KEY_hebrew_finalnun 0x0cef /* U+05DF HEBREW LETTER FINAL NUN */ -#define XKB_KEY_hebrew_nun 0x0cf0 /* U+05E0 HEBREW LETTER NUN */ -#define XKB_KEY_hebrew_samech 0x0cf1 /* U+05E1 HEBREW LETTER SAMEKH */ -#define XKB_KEY_hebrew_samekh 0x0cf1 /* deprecated */ -#define XKB_KEY_hebrew_ayin 0x0cf2 /* U+05E2 HEBREW LETTER AYIN */ -#define XKB_KEY_hebrew_finalpe 0x0cf3 /* U+05E3 HEBREW LETTER FINAL PE */ -#define XKB_KEY_hebrew_pe 0x0cf4 /* U+05E4 HEBREW LETTER PE */ -#define XKB_KEY_hebrew_finalzade 0x0cf5 /* U+05E5 HEBREW LETTER FINAL TSADI */ -#define XKB_KEY_hebrew_finalzadi 0x0cf5 /* deprecated */ -#define XKB_KEY_hebrew_zade 0x0cf6 /* U+05E6 HEBREW LETTER TSADI */ -#define XKB_KEY_hebrew_zadi 0x0cf6 /* deprecated */ -#define XKB_KEY_hebrew_qoph 0x0cf7 /* U+05E7 HEBREW LETTER QOF */ -#define XKB_KEY_hebrew_kuf 0x0cf7 /* deprecated */ -#define XKB_KEY_hebrew_resh 0x0cf8 /* U+05E8 HEBREW LETTER RESH */ -#define XKB_KEY_hebrew_shin 0x0cf9 /* U+05E9 HEBREW LETTER SHIN */ -#define XKB_KEY_hebrew_taw 0x0cfa /* U+05EA HEBREW LETTER TAV */ -#define XKB_KEY_hebrew_taf 0x0cfa /* deprecated */ -#define XKB_KEY_Hebrew_switch 0xff7e /* Alias for mode_switch */ - -/* - * Thai - * Byte 3 = 0x0d - */ - -#define XKB_KEY_Thai_kokai 0x0da1 /* U+0E01 THAI CHARACTER KO KAI */ -#define XKB_KEY_Thai_khokhai 0x0da2 /* U+0E02 THAI CHARACTER KHO KHAI */ -#define XKB_KEY_Thai_khokhuat 0x0da3 /* U+0E03 THAI CHARACTER KHO KHUAT */ -#define XKB_KEY_Thai_khokhwai 0x0da4 /* U+0E04 THAI CHARACTER KHO KHWAI */ -#define XKB_KEY_Thai_khokhon 0x0da5 /* U+0E05 THAI CHARACTER KHO KHON */ -#define XKB_KEY_Thai_khorakhang 0x0da6 /* U+0E06 THAI CHARACTER KHO RAKHANG */ -#define XKB_KEY_Thai_ngongu 0x0da7 /* U+0E07 THAI CHARACTER NGO NGU */ -#define XKB_KEY_Thai_chochan 0x0da8 /* U+0E08 THAI CHARACTER CHO CHAN */ -#define XKB_KEY_Thai_choching 0x0da9 /* U+0E09 THAI CHARACTER CHO CHING */ -#define XKB_KEY_Thai_chochang 0x0daa /* U+0E0A THAI CHARACTER CHO CHANG */ -#define XKB_KEY_Thai_soso 0x0dab /* U+0E0B THAI CHARACTER SO SO */ -#define XKB_KEY_Thai_chochoe 0x0dac /* U+0E0C THAI CHARACTER CHO CHOE */ -#define XKB_KEY_Thai_yoying 0x0dad /* U+0E0D THAI CHARACTER YO YING */ -#define XKB_KEY_Thai_dochada 0x0dae /* U+0E0E THAI CHARACTER DO CHADA */ -#define XKB_KEY_Thai_topatak 0x0daf /* U+0E0F THAI CHARACTER TO PATAK */ -#define XKB_KEY_Thai_thothan 0x0db0 /* U+0E10 THAI CHARACTER THO THAN */ -#define XKB_KEY_Thai_thonangmontho 0x0db1 /* U+0E11 THAI CHARACTER THO NANGMONTHO */ -#define XKB_KEY_Thai_thophuthao 0x0db2 /* U+0E12 THAI CHARACTER THO PHUTHAO */ -#define XKB_KEY_Thai_nonen 0x0db3 /* U+0E13 THAI CHARACTER NO NEN */ -#define XKB_KEY_Thai_dodek 0x0db4 /* U+0E14 THAI CHARACTER DO DEK */ -#define XKB_KEY_Thai_totao 0x0db5 /* U+0E15 THAI CHARACTER TO TAO */ -#define XKB_KEY_Thai_thothung 0x0db6 /* U+0E16 THAI CHARACTER THO THUNG */ -#define XKB_KEY_Thai_thothahan 0x0db7 /* U+0E17 THAI CHARACTER THO THAHAN */ -#define XKB_KEY_Thai_thothong 0x0db8 /* U+0E18 THAI CHARACTER THO THONG */ -#define XKB_KEY_Thai_nonu 0x0db9 /* U+0E19 THAI CHARACTER NO NU */ -#define XKB_KEY_Thai_bobaimai 0x0dba /* U+0E1A THAI CHARACTER BO BAIMAI */ -#define XKB_KEY_Thai_popla 0x0dbb /* U+0E1B THAI CHARACTER PO PLA */ -#define XKB_KEY_Thai_phophung 0x0dbc /* U+0E1C THAI CHARACTER PHO PHUNG */ -#define XKB_KEY_Thai_fofa 0x0dbd /* U+0E1D THAI CHARACTER FO FA */ -#define XKB_KEY_Thai_phophan 0x0dbe /* U+0E1E THAI CHARACTER PHO PHAN */ -#define XKB_KEY_Thai_fofan 0x0dbf /* U+0E1F THAI CHARACTER FO FAN */ -#define XKB_KEY_Thai_phosamphao 0x0dc0 /* U+0E20 THAI CHARACTER PHO SAMPHAO */ -#define XKB_KEY_Thai_moma 0x0dc1 /* U+0E21 THAI CHARACTER MO MA */ -#define XKB_KEY_Thai_yoyak 0x0dc2 /* U+0E22 THAI CHARACTER YO YAK */ -#define XKB_KEY_Thai_rorua 0x0dc3 /* U+0E23 THAI CHARACTER RO RUA */ -#define XKB_KEY_Thai_ru 0x0dc4 /* U+0E24 THAI CHARACTER RU */ -#define XKB_KEY_Thai_loling 0x0dc5 /* U+0E25 THAI CHARACTER LO LING */ -#define XKB_KEY_Thai_lu 0x0dc6 /* U+0E26 THAI CHARACTER LU */ -#define XKB_KEY_Thai_wowaen 0x0dc7 /* U+0E27 THAI CHARACTER WO WAEN */ -#define XKB_KEY_Thai_sosala 0x0dc8 /* U+0E28 THAI CHARACTER SO SALA */ -#define XKB_KEY_Thai_sorusi 0x0dc9 /* U+0E29 THAI CHARACTER SO RUSI */ -#define XKB_KEY_Thai_sosua 0x0dca /* U+0E2A THAI CHARACTER SO SUA */ -#define XKB_KEY_Thai_hohip 0x0dcb /* U+0E2B THAI CHARACTER HO HIP */ -#define XKB_KEY_Thai_lochula 0x0dcc /* U+0E2C THAI CHARACTER LO CHULA */ -#define XKB_KEY_Thai_oang 0x0dcd /* U+0E2D THAI CHARACTER O ANG */ -#define XKB_KEY_Thai_honokhuk 0x0dce /* U+0E2E THAI CHARACTER HO NOKHUK */ -#define XKB_KEY_Thai_paiyannoi 0x0dcf /* U+0E2F THAI CHARACTER PAIYANNOI */ -#define XKB_KEY_Thai_saraa 0x0dd0 /* U+0E30 THAI CHARACTER SARA A */ -#define XKB_KEY_Thai_maihanakat 0x0dd1 /* U+0E31 THAI CHARACTER MAI HAN-AKAT */ -#define XKB_KEY_Thai_saraaa 0x0dd2 /* U+0E32 THAI CHARACTER SARA AA */ -#define XKB_KEY_Thai_saraam 0x0dd3 /* U+0E33 THAI CHARACTER SARA AM */ -#define XKB_KEY_Thai_sarai 0x0dd4 /* U+0E34 THAI CHARACTER SARA I */ -#define XKB_KEY_Thai_saraii 0x0dd5 /* U+0E35 THAI CHARACTER SARA II */ -#define XKB_KEY_Thai_saraue 0x0dd6 /* U+0E36 THAI CHARACTER SARA UE */ -#define XKB_KEY_Thai_sarauee 0x0dd7 /* U+0E37 THAI CHARACTER SARA UEE */ -#define XKB_KEY_Thai_sarau 0x0dd8 /* U+0E38 THAI CHARACTER SARA U */ -#define XKB_KEY_Thai_sarauu 0x0dd9 /* U+0E39 THAI CHARACTER SARA UU */ -#define XKB_KEY_Thai_phinthu 0x0dda /* U+0E3A THAI CHARACTER PHINTHU */ -#define XKB_KEY_Thai_maihanakat_maitho 0x0dde -#define XKB_KEY_Thai_baht 0x0ddf /* U+0E3F THAI CURRENCY SYMBOL BAHT */ -#define XKB_KEY_Thai_sarae 0x0de0 /* U+0E40 THAI CHARACTER SARA E */ -#define XKB_KEY_Thai_saraae 0x0de1 /* U+0E41 THAI CHARACTER SARA AE */ -#define XKB_KEY_Thai_sarao 0x0de2 /* U+0E42 THAI CHARACTER SARA O */ -#define XKB_KEY_Thai_saraaimaimuan 0x0de3 /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */ -#define XKB_KEY_Thai_saraaimaimalai 0x0de4 /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */ -#define XKB_KEY_Thai_lakkhangyao 0x0de5 /* U+0E45 THAI CHARACTER LAKKHANGYAO */ -#define XKB_KEY_Thai_maiyamok 0x0de6 /* U+0E46 THAI CHARACTER MAIYAMOK */ -#define XKB_KEY_Thai_maitaikhu 0x0de7 /* U+0E47 THAI CHARACTER MAITAIKHU */ -#define XKB_KEY_Thai_maiek 0x0de8 /* U+0E48 THAI CHARACTER MAI EK */ -#define XKB_KEY_Thai_maitho 0x0de9 /* U+0E49 THAI CHARACTER MAI THO */ -#define XKB_KEY_Thai_maitri 0x0dea /* U+0E4A THAI CHARACTER MAI TRI */ -#define XKB_KEY_Thai_maichattawa 0x0deb /* U+0E4B THAI CHARACTER MAI CHATTAWA */ -#define XKB_KEY_Thai_thanthakhat 0x0dec /* U+0E4C THAI CHARACTER THANTHAKHAT */ -#define XKB_KEY_Thai_nikhahit 0x0ded /* U+0E4D THAI CHARACTER NIKHAHIT */ -#define XKB_KEY_Thai_leksun 0x0df0 /* U+0E50 THAI DIGIT ZERO */ -#define XKB_KEY_Thai_leknung 0x0df1 /* U+0E51 THAI DIGIT ONE */ -#define XKB_KEY_Thai_leksong 0x0df2 /* U+0E52 THAI DIGIT TWO */ -#define XKB_KEY_Thai_leksam 0x0df3 /* U+0E53 THAI DIGIT THREE */ -#define XKB_KEY_Thai_leksi 0x0df4 /* U+0E54 THAI DIGIT FOUR */ -#define XKB_KEY_Thai_lekha 0x0df5 /* U+0E55 THAI DIGIT FIVE */ -#define XKB_KEY_Thai_lekhok 0x0df6 /* U+0E56 THAI DIGIT SIX */ -#define XKB_KEY_Thai_lekchet 0x0df7 /* U+0E57 THAI DIGIT SEVEN */ -#define XKB_KEY_Thai_lekpaet 0x0df8 /* U+0E58 THAI DIGIT EIGHT */ -#define XKB_KEY_Thai_lekkao 0x0df9 /* U+0E59 THAI DIGIT NINE */ - -/* - * Korean - * Byte 3 = 0x0e - */ - - -#define XKB_KEY_Hangul 0xff31 /* Hangul start/stop(toggle) */ -#define XKB_KEY_Hangul_Start 0xff32 /* Hangul start */ -#define XKB_KEY_Hangul_End 0xff33 /* Hangul end, English start */ -#define XKB_KEY_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */ -#define XKB_KEY_Hangul_Jamo 0xff35 /* Hangul Jamo mode */ -#define XKB_KEY_Hangul_Romaja 0xff36 /* Hangul Romaja mode */ -#define XKB_KEY_Hangul_Codeinput 0xff37 /* Hangul code input mode */ -#define XKB_KEY_Hangul_Jeonja 0xff38 /* Jeonja mode */ -#define XKB_KEY_Hangul_Banja 0xff39 /* Banja mode */ -#define XKB_KEY_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */ -#define XKB_KEY_Hangul_PostHanja 0xff3b /* Post Hanja conversion */ -#define XKB_KEY_Hangul_SingleCandidate 0xff3c /* Single candidate */ -#define XKB_KEY_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */ -#define XKB_KEY_Hangul_PreviousCandidate 0xff3e /* Previous candidate */ -#define XKB_KEY_Hangul_Special 0xff3f /* Special symbols */ -#define XKB_KEY_Hangul_switch 0xff7e /* Alias for mode_switch */ - -/* Hangul Consonant Characters */ -#define XKB_KEY_Hangul_Kiyeog 0x0ea1 -#define XKB_KEY_Hangul_SsangKiyeog 0x0ea2 -#define XKB_KEY_Hangul_KiyeogSios 0x0ea3 -#define XKB_KEY_Hangul_Nieun 0x0ea4 -#define XKB_KEY_Hangul_NieunJieuj 0x0ea5 -#define XKB_KEY_Hangul_NieunHieuh 0x0ea6 -#define XKB_KEY_Hangul_Dikeud 0x0ea7 -#define XKB_KEY_Hangul_SsangDikeud 0x0ea8 -#define XKB_KEY_Hangul_Rieul 0x0ea9 -#define XKB_KEY_Hangul_RieulKiyeog 0x0eaa -#define XKB_KEY_Hangul_RieulMieum 0x0eab -#define XKB_KEY_Hangul_RieulPieub 0x0eac -#define XKB_KEY_Hangul_RieulSios 0x0ead -#define XKB_KEY_Hangul_RieulTieut 0x0eae -#define XKB_KEY_Hangul_RieulPhieuf 0x0eaf -#define XKB_KEY_Hangul_RieulHieuh 0x0eb0 -#define XKB_KEY_Hangul_Mieum 0x0eb1 -#define XKB_KEY_Hangul_Pieub 0x0eb2 -#define XKB_KEY_Hangul_SsangPieub 0x0eb3 -#define XKB_KEY_Hangul_PieubSios 0x0eb4 -#define XKB_KEY_Hangul_Sios 0x0eb5 -#define XKB_KEY_Hangul_SsangSios 0x0eb6 -#define XKB_KEY_Hangul_Ieung 0x0eb7 -#define XKB_KEY_Hangul_Jieuj 0x0eb8 -#define XKB_KEY_Hangul_SsangJieuj 0x0eb9 -#define XKB_KEY_Hangul_Cieuc 0x0eba -#define XKB_KEY_Hangul_Khieuq 0x0ebb -#define XKB_KEY_Hangul_Tieut 0x0ebc -#define XKB_KEY_Hangul_Phieuf 0x0ebd -#define XKB_KEY_Hangul_Hieuh 0x0ebe - -/* Hangul Vowel Characters */ -#define XKB_KEY_Hangul_A 0x0ebf -#define XKB_KEY_Hangul_AE 0x0ec0 -#define XKB_KEY_Hangul_YA 0x0ec1 -#define XKB_KEY_Hangul_YAE 0x0ec2 -#define XKB_KEY_Hangul_EO 0x0ec3 -#define XKB_KEY_Hangul_E 0x0ec4 -#define XKB_KEY_Hangul_YEO 0x0ec5 -#define XKB_KEY_Hangul_YE 0x0ec6 -#define XKB_KEY_Hangul_O 0x0ec7 -#define XKB_KEY_Hangul_WA 0x0ec8 -#define XKB_KEY_Hangul_WAE 0x0ec9 -#define XKB_KEY_Hangul_OE 0x0eca -#define XKB_KEY_Hangul_YO 0x0ecb -#define XKB_KEY_Hangul_U 0x0ecc -#define XKB_KEY_Hangul_WEO 0x0ecd -#define XKB_KEY_Hangul_WE 0x0ece -#define XKB_KEY_Hangul_WI 0x0ecf -#define XKB_KEY_Hangul_YU 0x0ed0 -#define XKB_KEY_Hangul_EU 0x0ed1 -#define XKB_KEY_Hangul_YI 0x0ed2 -#define XKB_KEY_Hangul_I 0x0ed3 - -/* Hangul syllable-final (JongSeong) Characters */ -#define XKB_KEY_Hangul_J_Kiyeog 0x0ed4 -#define XKB_KEY_Hangul_J_SsangKiyeog 0x0ed5 -#define XKB_KEY_Hangul_J_KiyeogSios 0x0ed6 -#define XKB_KEY_Hangul_J_Nieun 0x0ed7 -#define XKB_KEY_Hangul_J_NieunJieuj 0x0ed8 -#define XKB_KEY_Hangul_J_NieunHieuh 0x0ed9 -#define XKB_KEY_Hangul_J_Dikeud 0x0eda -#define XKB_KEY_Hangul_J_Rieul 0x0edb -#define XKB_KEY_Hangul_J_RieulKiyeog 0x0edc -#define XKB_KEY_Hangul_J_RieulMieum 0x0edd -#define XKB_KEY_Hangul_J_RieulPieub 0x0ede -#define XKB_KEY_Hangul_J_RieulSios 0x0edf -#define XKB_KEY_Hangul_J_RieulTieut 0x0ee0 -#define XKB_KEY_Hangul_J_RieulPhieuf 0x0ee1 -#define XKB_KEY_Hangul_J_RieulHieuh 0x0ee2 -#define XKB_KEY_Hangul_J_Mieum 0x0ee3 -#define XKB_KEY_Hangul_J_Pieub 0x0ee4 -#define XKB_KEY_Hangul_J_PieubSios 0x0ee5 -#define XKB_KEY_Hangul_J_Sios 0x0ee6 -#define XKB_KEY_Hangul_J_SsangSios 0x0ee7 -#define XKB_KEY_Hangul_J_Ieung 0x0ee8 -#define XKB_KEY_Hangul_J_Jieuj 0x0ee9 -#define XKB_KEY_Hangul_J_Cieuc 0x0eea -#define XKB_KEY_Hangul_J_Khieuq 0x0eeb -#define XKB_KEY_Hangul_J_Tieut 0x0eec -#define XKB_KEY_Hangul_J_Phieuf 0x0eed -#define XKB_KEY_Hangul_J_Hieuh 0x0eee - -/* Ancient Hangul Consonant Characters */ -#define XKB_KEY_Hangul_RieulYeorinHieuh 0x0eef -#define XKB_KEY_Hangul_SunkyeongeumMieum 0x0ef0 -#define XKB_KEY_Hangul_SunkyeongeumPieub 0x0ef1 -#define XKB_KEY_Hangul_PanSios 0x0ef2 -#define XKB_KEY_Hangul_KkogjiDalrinIeung 0x0ef3 -#define XKB_KEY_Hangul_SunkyeongeumPhieuf 0x0ef4 -#define XKB_KEY_Hangul_YeorinHieuh 0x0ef5 - -/* Ancient Hangul Vowel Characters */ -#define XKB_KEY_Hangul_AraeA 0x0ef6 -#define XKB_KEY_Hangul_AraeAE 0x0ef7 - -/* Ancient Hangul syllable-final (JongSeong) Characters */ -#define XKB_KEY_Hangul_J_PanSios 0x0ef8 -#define XKB_KEY_Hangul_J_KkogjiDalrinIeung 0x0ef9 -#define XKB_KEY_Hangul_J_YeorinHieuh 0x0efa - -/* Korean currency symbol */ -#define XKB_KEY_Korean_Won 0x0eff /*(U+20A9 WON SIGN)*/ - - -/* - * Armenian - */ - -#define XKB_KEY_Armenian_ligature_ew 0x1000587 /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */ -#define XKB_KEY_Armenian_full_stop 0x1000589 /* U+0589 ARMENIAN FULL STOP */ -#define XKB_KEY_Armenian_verjaket 0x1000589 /* U+0589 ARMENIAN FULL STOP */ -#define XKB_KEY_Armenian_separation_mark 0x100055d /* U+055D ARMENIAN COMMA */ -#define XKB_KEY_Armenian_but 0x100055d /* U+055D ARMENIAN COMMA */ -#define XKB_KEY_Armenian_hyphen 0x100058a /* U+058A ARMENIAN HYPHEN */ -#define XKB_KEY_Armenian_yentamna 0x100058a /* U+058A ARMENIAN HYPHEN */ -#define XKB_KEY_Armenian_exclam 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ -#define XKB_KEY_Armenian_amanak 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ -#define XKB_KEY_Armenian_accent 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ -#define XKB_KEY_Armenian_shesht 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ -#define XKB_KEY_Armenian_question 0x100055e /* U+055E ARMENIAN QUESTION MARK */ -#define XKB_KEY_Armenian_paruyk 0x100055e /* U+055E ARMENIAN QUESTION MARK */ -#define XKB_KEY_Armenian_AYB 0x1000531 /* U+0531 ARMENIAN CAPITAL LETTER AYB */ -#define XKB_KEY_Armenian_ayb 0x1000561 /* U+0561 ARMENIAN SMALL LETTER AYB */ -#define XKB_KEY_Armenian_BEN 0x1000532 /* U+0532 ARMENIAN CAPITAL LETTER BEN */ -#define XKB_KEY_Armenian_ben 0x1000562 /* U+0562 ARMENIAN SMALL LETTER BEN */ -#define XKB_KEY_Armenian_GIM 0x1000533 /* U+0533 ARMENIAN CAPITAL LETTER GIM */ -#define XKB_KEY_Armenian_gim 0x1000563 /* U+0563 ARMENIAN SMALL LETTER GIM */ -#define XKB_KEY_Armenian_DA 0x1000534 /* U+0534 ARMENIAN CAPITAL LETTER DA */ -#define XKB_KEY_Armenian_da 0x1000564 /* U+0564 ARMENIAN SMALL LETTER DA */ -#define XKB_KEY_Armenian_YECH 0x1000535 /* U+0535 ARMENIAN CAPITAL LETTER ECH */ -#define XKB_KEY_Armenian_yech 0x1000565 /* U+0565 ARMENIAN SMALL LETTER ECH */ -#define XKB_KEY_Armenian_ZA 0x1000536 /* U+0536 ARMENIAN CAPITAL LETTER ZA */ -#define XKB_KEY_Armenian_za 0x1000566 /* U+0566 ARMENIAN SMALL LETTER ZA */ -#define XKB_KEY_Armenian_E 0x1000537 /* U+0537 ARMENIAN CAPITAL LETTER EH */ -#define XKB_KEY_Armenian_e 0x1000567 /* U+0567 ARMENIAN SMALL LETTER EH */ -#define XKB_KEY_Armenian_AT 0x1000538 /* U+0538 ARMENIAN CAPITAL LETTER ET */ -#define XKB_KEY_Armenian_at 0x1000568 /* U+0568 ARMENIAN SMALL LETTER ET */ -#define XKB_KEY_Armenian_TO 0x1000539 /* U+0539 ARMENIAN CAPITAL LETTER TO */ -#define XKB_KEY_Armenian_to 0x1000569 /* U+0569 ARMENIAN SMALL LETTER TO */ -#define XKB_KEY_Armenian_ZHE 0x100053a /* U+053A ARMENIAN CAPITAL LETTER ZHE */ -#define XKB_KEY_Armenian_zhe 0x100056a /* U+056A ARMENIAN SMALL LETTER ZHE */ -#define XKB_KEY_Armenian_INI 0x100053b /* U+053B ARMENIAN CAPITAL LETTER INI */ -#define XKB_KEY_Armenian_ini 0x100056b /* U+056B ARMENIAN SMALL LETTER INI */ -#define XKB_KEY_Armenian_LYUN 0x100053c /* U+053C ARMENIAN CAPITAL LETTER LIWN */ -#define XKB_KEY_Armenian_lyun 0x100056c /* U+056C ARMENIAN SMALL LETTER LIWN */ -#define XKB_KEY_Armenian_KHE 0x100053d /* U+053D ARMENIAN CAPITAL LETTER XEH */ -#define XKB_KEY_Armenian_khe 0x100056d /* U+056D ARMENIAN SMALL LETTER XEH */ -#define XKB_KEY_Armenian_TSA 0x100053e /* U+053E ARMENIAN CAPITAL LETTER CA */ -#define XKB_KEY_Armenian_tsa 0x100056e /* U+056E ARMENIAN SMALL LETTER CA */ -#define XKB_KEY_Armenian_KEN 0x100053f /* U+053F ARMENIAN CAPITAL LETTER KEN */ -#define XKB_KEY_Armenian_ken 0x100056f /* U+056F ARMENIAN SMALL LETTER KEN */ -#define XKB_KEY_Armenian_HO 0x1000540 /* U+0540 ARMENIAN CAPITAL LETTER HO */ -#define XKB_KEY_Armenian_ho 0x1000570 /* U+0570 ARMENIAN SMALL LETTER HO */ -#define XKB_KEY_Armenian_DZA 0x1000541 /* U+0541 ARMENIAN CAPITAL LETTER JA */ -#define XKB_KEY_Armenian_dza 0x1000571 /* U+0571 ARMENIAN SMALL LETTER JA */ -#define XKB_KEY_Armenian_GHAT 0x1000542 /* U+0542 ARMENIAN CAPITAL LETTER GHAD */ -#define XKB_KEY_Armenian_ghat 0x1000572 /* U+0572 ARMENIAN SMALL LETTER GHAD */ -#define XKB_KEY_Armenian_TCHE 0x1000543 /* U+0543 ARMENIAN CAPITAL LETTER CHEH */ -#define XKB_KEY_Armenian_tche 0x1000573 /* U+0573 ARMENIAN SMALL LETTER CHEH */ -#define XKB_KEY_Armenian_MEN 0x1000544 /* U+0544 ARMENIAN CAPITAL LETTER MEN */ -#define XKB_KEY_Armenian_men 0x1000574 /* U+0574 ARMENIAN SMALL LETTER MEN */ -#define XKB_KEY_Armenian_HI 0x1000545 /* U+0545 ARMENIAN CAPITAL LETTER YI */ -#define XKB_KEY_Armenian_hi 0x1000575 /* U+0575 ARMENIAN SMALL LETTER YI */ -#define XKB_KEY_Armenian_NU 0x1000546 /* U+0546 ARMENIAN CAPITAL LETTER NOW */ -#define XKB_KEY_Armenian_nu 0x1000576 /* U+0576 ARMENIAN SMALL LETTER NOW */ -#define XKB_KEY_Armenian_SHA 0x1000547 /* U+0547 ARMENIAN CAPITAL LETTER SHA */ -#define XKB_KEY_Armenian_sha 0x1000577 /* U+0577 ARMENIAN SMALL LETTER SHA */ -#define XKB_KEY_Armenian_VO 0x1000548 /* U+0548 ARMENIAN CAPITAL LETTER VO */ -#define XKB_KEY_Armenian_vo 0x1000578 /* U+0578 ARMENIAN SMALL LETTER VO */ -#define XKB_KEY_Armenian_CHA 0x1000549 /* U+0549 ARMENIAN CAPITAL LETTER CHA */ -#define XKB_KEY_Armenian_cha 0x1000579 /* U+0579 ARMENIAN SMALL LETTER CHA */ -#define XKB_KEY_Armenian_PE 0x100054a /* U+054A ARMENIAN CAPITAL LETTER PEH */ -#define XKB_KEY_Armenian_pe 0x100057a /* U+057A ARMENIAN SMALL LETTER PEH */ -#define XKB_KEY_Armenian_JE 0x100054b /* U+054B ARMENIAN CAPITAL LETTER JHEH */ -#define XKB_KEY_Armenian_je 0x100057b /* U+057B ARMENIAN SMALL LETTER JHEH */ -#define XKB_KEY_Armenian_RA 0x100054c /* U+054C ARMENIAN CAPITAL LETTER RA */ -#define XKB_KEY_Armenian_ra 0x100057c /* U+057C ARMENIAN SMALL LETTER RA */ -#define XKB_KEY_Armenian_SE 0x100054d /* U+054D ARMENIAN CAPITAL LETTER SEH */ -#define XKB_KEY_Armenian_se 0x100057d /* U+057D ARMENIAN SMALL LETTER SEH */ -#define XKB_KEY_Armenian_VEV 0x100054e /* U+054E ARMENIAN CAPITAL LETTER VEW */ -#define XKB_KEY_Armenian_vev 0x100057e /* U+057E ARMENIAN SMALL LETTER VEW */ -#define XKB_KEY_Armenian_TYUN 0x100054f /* U+054F ARMENIAN CAPITAL LETTER TIWN */ -#define XKB_KEY_Armenian_tyun 0x100057f /* U+057F ARMENIAN SMALL LETTER TIWN */ -#define XKB_KEY_Armenian_RE 0x1000550 /* U+0550 ARMENIAN CAPITAL LETTER REH */ -#define XKB_KEY_Armenian_re 0x1000580 /* U+0580 ARMENIAN SMALL LETTER REH */ -#define XKB_KEY_Armenian_TSO 0x1000551 /* U+0551 ARMENIAN CAPITAL LETTER CO */ -#define XKB_KEY_Armenian_tso 0x1000581 /* U+0581 ARMENIAN SMALL LETTER CO */ -#define XKB_KEY_Armenian_VYUN 0x1000552 /* U+0552 ARMENIAN CAPITAL LETTER YIWN */ -#define XKB_KEY_Armenian_vyun 0x1000582 /* U+0582 ARMENIAN SMALL LETTER YIWN */ -#define XKB_KEY_Armenian_PYUR 0x1000553 /* U+0553 ARMENIAN CAPITAL LETTER PIWR */ -#define XKB_KEY_Armenian_pyur 0x1000583 /* U+0583 ARMENIAN SMALL LETTER PIWR */ -#define XKB_KEY_Armenian_KE 0x1000554 /* U+0554 ARMENIAN CAPITAL LETTER KEH */ -#define XKB_KEY_Armenian_ke 0x1000584 /* U+0584 ARMENIAN SMALL LETTER KEH */ -#define XKB_KEY_Armenian_O 0x1000555 /* U+0555 ARMENIAN CAPITAL LETTER OH */ -#define XKB_KEY_Armenian_o 0x1000585 /* U+0585 ARMENIAN SMALL LETTER OH */ -#define XKB_KEY_Armenian_FE 0x1000556 /* U+0556 ARMENIAN CAPITAL LETTER FEH */ -#define XKB_KEY_Armenian_fe 0x1000586 /* U+0586 ARMENIAN SMALL LETTER FEH */ -#define XKB_KEY_Armenian_apostrophe 0x100055a /* U+055A ARMENIAN APOSTROPHE */ - -/* - * Georgian - */ - -#define XKB_KEY_Georgian_an 0x10010d0 /* U+10D0 GEORGIAN LETTER AN */ -#define XKB_KEY_Georgian_ban 0x10010d1 /* U+10D1 GEORGIAN LETTER BAN */ -#define XKB_KEY_Georgian_gan 0x10010d2 /* U+10D2 GEORGIAN LETTER GAN */ -#define XKB_KEY_Georgian_don 0x10010d3 /* U+10D3 GEORGIAN LETTER DON */ -#define XKB_KEY_Georgian_en 0x10010d4 /* U+10D4 GEORGIAN LETTER EN */ -#define XKB_KEY_Georgian_vin 0x10010d5 /* U+10D5 GEORGIAN LETTER VIN */ -#define XKB_KEY_Georgian_zen 0x10010d6 /* U+10D6 GEORGIAN LETTER ZEN */ -#define XKB_KEY_Georgian_tan 0x10010d7 /* U+10D7 GEORGIAN LETTER TAN */ -#define XKB_KEY_Georgian_in 0x10010d8 /* U+10D8 GEORGIAN LETTER IN */ -#define XKB_KEY_Georgian_kan 0x10010d9 /* U+10D9 GEORGIAN LETTER KAN */ -#define XKB_KEY_Georgian_las 0x10010da /* U+10DA GEORGIAN LETTER LAS */ -#define XKB_KEY_Georgian_man 0x10010db /* U+10DB GEORGIAN LETTER MAN */ -#define XKB_KEY_Georgian_nar 0x10010dc /* U+10DC GEORGIAN LETTER NAR */ -#define XKB_KEY_Georgian_on 0x10010dd /* U+10DD GEORGIAN LETTER ON */ -#define XKB_KEY_Georgian_par 0x10010de /* U+10DE GEORGIAN LETTER PAR */ -#define XKB_KEY_Georgian_zhar 0x10010df /* U+10DF GEORGIAN LETTER ZHAR */ -#define XKB_KEY_Georgian_rae 0x10010e0 /* U+10E0 GEORGIAN LETTER RAE */ -#define XKB_KEY_Georgian_san 0x10010e1 /* U+10E1 GEORGIAN LETTER SAN */ -#define XKB_KEY_Georgian_tar 0x10010e2 /* U+10E2 GEORGIAN LETTER TAR */ -#define XKB_KEY_Georgian_un 0x10010e3 /* U+10E3 GEORGIAN LETTER UN */ -#define XKB_KEY_Georgian_phar 0x10010e4 /* U+10E4 GEORGIAN LETTER PHAR */ -#define XKB_KEY_Georgian_khar 0x10010e5 /* U+10E5 GEORGIAN LETTER KHAR */ -#define XKB_KEY_Georgian_ghan 0x10010e6 /* U+10E6 GEORGIAN LETTER GHAN */ -#define XKB_KEY_Georgian_qar 0x10010e7 /* U+10E7 GEORGIAN LETTER QAR */ -#define XKB_KEY_Georgian_shin 0x10010e8 /* U+10E8 GEORGIAN LETTER SHIN */ -#define XKB_KEY_Georgian_chin 0x10010e9 /* U+10E9 GEORGIAN LETTER CHIN */ -#define XKB_KEY_Georgian_can 0x10010ea /* U+10EA GEORGIAN LETTER CAN */ -#define XKB_KEY_Georgian_jil 0x10010eb /* U+10EB GEORGIAN LETTER JIL */ -#define XKB_KEY_Georgian_cil 0x10010ec /* U+10EC GEORGIAN LETTER CIL */ -#define XKB_KEY_Georgian_char 0x10010ed /* U+10ED GEORGIAN LETTER CHAR */ -#define XKB_KEY_Georgian_xan 0x10010ee /* U+10EE GEORGIAN LETTER XAN */ -#define XKB_KEY_Georgian_jhan 0x10010ef /* U+10EF GEORGIAN LETTER JHAN */ -#define XKB_KEY_Georgian_hae 0x10010f0 /* U+10F0 GEORGIAN LETTER HAE */ -#define XKB_KEY_Georgian_he 0x10010f1 /* U+10F1 GEORGIAN LETTER HE */ -#define XKB_KEY_Georgian_hie 0x10010f2 /* U+10F2 GEORGIAN LETTER HIE */ -#define XKB_KEY_Georgian_we 0x10010f3 /* U+10F3 GEORGIAN LETTER WE */ -#define XKB_KEY_Georgian_har 0x10010f4 /* U+10F4 GEORGIAN LETTER HAR */ -#define XKB_KEY_Georgian_hoe 0x10010f5 /* U+10F5 GEORGIAN LETTER HOE */ -#define XKB_KEY_Georgian_fi 0x10010f6 /* U+10F6 GEORGIAN LETTER FI */ - -/* - * Azeri (and other Turkic or Caucasian languages) - */ - -/* latin */ -#define XKB_KEY_Xabovedot 0x1001e8a /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */ -#define XKB_KEY_Ibreve 0x100012c /* U+012C LATIN CAPITAL LETTER I WITH BREVE */ -#define XKB_KEY_Zstroke 0x10001b5 /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */ -#define XKB_KEY_Gcaron 0x10001e6 /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */ -#define XKB_KEY_Ocaron 0x10001d1 /* U+01D1 LATIN CAPITAL LETTER O WITH CARON */ -#define XKB_KEY_Obarred 0x100019f /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ -#define XKB_KEY_xabovedot 0x1001e8b /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */ -#define XKB_KEY_ibreve 0x100012d /* U+012D LATIN SMALL LETTER I WITH BREVE */ -#define XKB_KEY_zstroke 0x10001b6 /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */ -#define XKB_KEY_gcaron 0x10001e7 /* U+01E7 LATIN SMALL LETTER G WITH CARON */ -#define XKB_KEY_ocaron 0x10001d2 /* U+01D2 LATIN SMALL LETTER O WITH CARON */ -#define XKB_KEY_obarred 0x1000275 /* U+0275 LATIN SMALL LETTER BARRED O */ -#define XKB_KEY_SCHWA 0x100018f /* U+018F LATIN CAPITAL LETTER SCHWA */ -#define XKB_KEY_schwa 0x1000259 /* U+0259 LATIN SMALL LETTER SCHWA */ -#define XKB_KEY_EZH 0x10001b7 /* U+01B7 LATIN CAPITAL LETTER EZH */ -#define XKB_KEY_ezh 0x1000292 /* U+0292 LATIN SMALL LETTER EZH */ -/* those are not really Caucasus */ -/* For Inupiak */ -#define XKB_KEY_Lbelowdot 0x1001e36 /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */ -#define XKB_KEY_lbelowdot 0x1001e37 /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */ - -/* - * Vietnamese - */ - -#define XKB_KEY_Abelowdot 0x1001ea0 /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */ -#define XKB_KEY_abelowdot 0x1001ea1 /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */ -#define XKB_KEY_Ahook 0x1001ea2 /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */ -#define XKB_KEY_ahook 0x1001ea3 /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */ -#define XKB_KEY_Acircumflexacute 0x1001ea4 /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_acircumflexacute 0x1001ea5 /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_Acircumflexgrave 0x1001ea6 /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_acircumflexgrave 0x1001ea7 /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_Acircumflexhook 0x1001ea8 /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_acircumflexhook 0x1001ea9 /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_Acircumflextilde 0x1001eaa /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_acircumflextilde 0x1001eab /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_Acircumflexbelowdot 0x1001eac /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_acircumflexbelowdot 0x1001ead /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_Abreveacute 0x1001eae /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ -#define XKB_KEY_abreveacute 0x1001eaf /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */ -#define XKB_KEY_Abrevegrave 0x1001eb0 /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ -#define XKB_KEY_abrevegrave 0x1001eb1 /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */ -#define XKB_KEY_Abrevehook 0x1001eb2 /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ -#define XKB_KEY_abrevehook 0x1001eb3 /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */ -#define XKB_KEY_Abrevetilde 0x1001eb4 /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ -#define XKB_KEY_abrevetilde 0x1001eb5 /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */ -#define XKB_KEY_Abrevebelowdot 0x1001eb6 /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ -#define XKB_KEY_abrevebelowdot 0x1001eb7 /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */ -#define XKB_KEY_Ebelowdot 0x1001eb8 /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */ -#define XKB_KEY_ebelowdot 0x1001eb9 /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */ -#define XKB_KEY_Ehook 0x1001eba /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */ -#define XKB_KEY_ehook 0x1001ebb /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */ -#define XKB_KEY_Etilde 0x1001ebc /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */ -#define XKB_KEY_etilde 0x1001ebd /* U+1EBD LATIN SMALL LETTER E WITH TILDE */ -#define XKB_KEY_Ecircumflexacute 0x1001ebe /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_ecircumflexacute 0x1001ebf /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_Ecircumflexgrave 0x1001ec0 /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_ecircumflexgrave 0x1001ec1 /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_Ecircumflexhook 0x1001ec2 /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_ecircumflexhook 0x1001ec3 /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_Ecircumflextilde 0x1001ec4 /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_ecircumflextilde 0x1001ec5 /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_Ecircumflexbelowdot 0x1001ec6 /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_ecircumflexbelowdot 0x1001ec7 /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_Ihook 0x1001ec8 /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */ -#define XKB_KEY_ihook 0x1001ec9 /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */ -#define XKB_KEY_Ibelowdot 0x1001eca /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */ -#define XKB_KEY_ibelowdot 0x1001ecb /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */ -#define XKB_KEY_Obelowdot 0x1001ecc /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */ -#define XKB_KEY_obelowdot 0x1001ecd /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */ -#define XKB_KEY_Ohook 0x1001ece /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */ -#define XKB_KEY_ohook 0x1001ecf /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */ -#define XKB_KEY_Ocircumflexacute 0x1001ed0 /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_ocircumflexacute 0x1001ed1 /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_Ocircumflexgrave 0x1001ed2 /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_ocircumflexgrave 0x1001ed3 /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_Ocircumflexhook 0x1001ed4 /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_ocircumflexhook 0x1001ed5 /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_Ocircumflextilde 0x1001ed6 /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_ocircumflextilde 0x1001ed7 /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_Ocircumflexbelowdot 0x1001ed8 /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_ocircumflexbelowdot 0x1001ed9 /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_Ohornacute 0x1001eda /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ -#define XKB_KEY_ohornacute 0x1001edb /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */ -#define XKB_KEY_Ohorngrave 0x1001edc /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ -#define XKB_KEY_ohorngrave 0x1001edd /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */ -#define XKB_KEY_Ohornhook 0x1001ede /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ -#define XKB_KEY_ohornhook 0x1001edf /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */ -#define XKB_KEY_Ohorntilde 0x1001ee0 /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */ -#define XKB_KEY_ohorntilde 0x1001ee1 /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */ -#define XKB_KEY_Ohornbelowdot 0x1001ee2 /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ -#define XKB_KEY_ohornbelowdot 0x1001ee3 /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */ -#define XKB_KEY_Ubelowdot 0x1001ee4 /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */ -#define XKB_KEY_ubelowdot 0x1001ee5 /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */ -#define XKB_KEY_Uhook 0x1001ee6 /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */ -#define XKB_KEY_uhook 0x1001ee7 /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */ -#define XKB_KEY_Uhornacute 0x1001ee8 /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ -#define XKB_KEY_uhornacute 0x1001ee9 /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */ -#define XKB_KEY_Uhorngrave 0x1001eea /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ -#define XKB_KEY_uhorngrave 0x1001eeb /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */ -#define XKB_KEY_Uhornhook 0x1001eec /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ -#define XKB_KEY_uhornhook 0x1001eed /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */ -#define XKB_KEY_Uhorntilde 0x1001eee /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */ -#define XKB_KEY_uhorntilde 0x1001eef /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */ -#define XKB_KEY_Uhornbelowdot 0x1001ef0 /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ -#define XKB_KEY_uhornbelowdot 0x1001ef1 /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */ -#define XKB_KEY_Ybelowdot 0x1001ef4 /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */ -#define XKB_KEY_ybelowdot 0x1001ef5 /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */ -#define XKB_KEY_Yhook 0x1001ef6 /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ -#define XKB_KEY_yhook 0x1001ef7 /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */ -#define XKB_KEY_Ytilde 0x1001ef8 /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */ -#define XKB_KEY_ytilde 0x1001ef9 /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */ -#define XKB_KEY_Ohorn 0x10001a0 /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */ -#define XKB_KEY_ohorn 0x10001a1 /* U+01A1 LATIN SMALL LETTER O WITH HORN */ -#define XKB_KEY_Uhorn 0x10001af /* U+01AF LATIN CAPITAL LETTER U WITH HORN */ -#define XKB_KEY_uhorn 0x10001b0 /* U+01B0 LATIN SMALL LETTER U WITH HORN */ - - -#define XKB_KEY_EcuSign 0x10020a0 /* U+20A0 EURO-CURRENCY SIGN */ -#define XKB_KEY_ColonSign 0x10020a1 /* U+20A1 COLON SIGN */ -#define XKB_KEY_CruzeiroSign 0x10020a2 /* U+20A2 CRUZEIRO SIGN */ -#define XKB_KEY_FFrancSign 0x10020a3 /* U+20A3 FRENCH FRANC SIGN */ -#define XKB_KEY_LiraSign 0x10020a4 /* U+20A4 LIRA SIGN */ -#define XKB_KEY_MillSign 0x10020a5 /* U+20A5 MILL SIGN */ -#define XKB_KEY_NairaSign 0x10020a6 /* U+20A6 NAIRA SIGN */ -#define XKB_KEY_PesetaSign 0x10020a7 /* U+20A7 PESETA SIGN */ -#define XKB_KEY_RupeeSign 0x10020a8 /* U+20A8 RUPEE SIGN */ -#define XKB_KEY_WonSign 0x10020a9 /* U+20A9 WON SIGN */ -#define XKB_KEY_NewSheqelSign 0x10020aa /* U+20AA NEW SHEQEL SIGN */ -#define XKB_KEY_DongSign 0x10020ab /* U+20AB DONG SIGN */ -#define XKB_KEY_EuroSign 0x20ac /* U+20AC EURO SIGN */ - -/* one, two and three are defined above. */ -#define XKB_KEY_zerosuperior 0x1002070 /* U+2070 SUPERSCRIPT ZERO */ -#define XKB_KEY_foursuperior 0x1002074 /* U+2074 SUPERSCRIPT FOUR */ -#define XKB_KEY_fivesuperior 0x1002075 /* U+2075 SUPERSCRIPT FIVE */ -#define XKB_KEY_sixsuperior 0x1002076 /* U+2076 SUPERSCRIPT SIX */ -#define XKB_KEY_sevensuperior 0x1002077 /* U+2077 SUPERSCRIPT SEVEN */ -#define XKB_KEY_eightsuperior 0x1002078 /* U+2078 SUPERSCRIPT EIGHT */ -#define XKB_KEY_ninesuperior 0x1002079 /* U+2079 SUPERSCRIPT NINE */ -#define XKB_KEY_zerosubscript 0x1002080 /* U+2080 SUBSCRIPT ZERO */ -#define XKB_KEY_onesubscript 0x1002081 /* U+2081 SUBSCRIPT ONE */ -#define XKB_KEY_twosubscript 0x1002082 /* U+2082 SUBSCRIPT TWO */ -#define XKB_KEY_threesubscript 0x1002083 /* U+2083 SUBSCRIPT THREE */ -#define XKB_KEY_foursubscript 0x1002084 /* U+2084 SUBSCRIPT FOUR */ -#define XKB_KEY_fivesubscript 0x1002085 /* U+2085 SUBSCRIPT FIVE */ -#define XKB_KEY_sixsubscript 0x1002086 /* U+2086 SUBSCRIPT SIX */ -#define XKB_KEY_sevensubscript 0x1002087 /* U+2087 SUBSCRIPT SEVEN */ -#define XKB_KEY_eightsubscript 0x1002088 /* U+2088 SUBSCRIPT EIGHT */ -#define XKB_KEY_ninesubscript 0x1002089 /* U+2089 SUBSCRIPT NINE */ -#define XKB_KEY_partdifferential 0x1002202 /* U+2202 PARTIAL DIFFERENTIAL */ -#define XKB_KEY_emptyset 0x1002205 /* U+2205 NULL SET */ -#define XKB_KEY_elementof 0x1002208 /* U+2208 ELEMENT OF */ -#define XKB_KEY_notelementof 0x1002209 /* U+2209 NOT AN ELEMENT OF */ -#define XKB_KEY_containsas 0x100220B /* U+220B CONTAINS AS MEMBER */ -#define XKB_KEY_squareroot 0x100221A /* U+221A SQUARE ROOT */ -#define XKB_KEY_cuberoot 0x100221B /* U+221B CUBE ROOT */ -#define XKB_KEY_fourthroot 0x100221C /* U+221C FOURTH ROOT */ -#define XKB_KEY_dintegral 0x100222C /* U+222C DOUBLE INTEGRAL */ -#define XKB_KEY_tintegral 0x100222D /* U+222D TRIPLE INTEGRAL */ -#define XKB_KEY_because 0x1002235 /* U+2235 BECAUSE */ -#define XKB_KEY_approxeq 0x1002248 /* U+2245 ALMOST EQUAL TO */ -#define XKB_KEY_notapproxeq 0x1002247 /* U+2247 NOT ALMOST EQUAL TO */ -#define XKB_KEY_notidentical 0x1002262 /* U+2262 NOT IDENTICAL TO */ -#define XKB_KEY_stricteq 0x1002263 /* U+2263 STRICTLY EQUIVALENT TO */ - -#define XKB_KEY_braille_dot_1 0xfff1 -#define XKB_KEY_braille_dot_2 0xfff2 -#define XKB_KEY_braille_dot_3 0xfff3 -#define XKB_KEY_braille_dot_4 0xfff4 -#define XKB_KEY_braille_dot_5 0xfff5 -#define XKB_KEY_braille_dot_6 0xfff6 -#define XKB_KEY_braille_dot_7 0xfff7 -#define XKB_KEY_braille_dot_8 0xfff8 -#define XKB_KEY_braille_dot_9 0xfff9 -#define XKB_KEY_braille_dot_10 0xfffa -#define XKB_KEY_braille_blank 0x1002800 /* U+2800 BRAILLE PATTERN BLANK */ -#define XKB_KEY_braille_dots_1 0x1002801 /* U+2801 BRAILLE PATTERN DOTS-1 */ -#define XKB_KEY_braille_dots_2 0x1002802 /* U+2802 BRAILLE PATTERN DOTS-2 */ -#define XKB_KEY_braille_dots_12 0x1002803 /* U+2803 BRAILLE PATTERN DOTS-12 */ -#define XKB_KEY_braille_dots_3 0x1002804 /* U+2804 BRAILLE PATTERN DOTS-3 */ -#define XKB_KEY_braille_dots_13 0x1002805 /* U+2805 BRAILLE PATTERN DOTS-13 */ -#define XKB_KEY_braille_dots_23 0x1002806 /* U+2806 BRAILLE PATTERN DOTS-23 */ -#define XKB_KEY_braille_dots_123 0x1002807 /* U+2807 BRAILLE PATTERN DOTS-123 */ -#define XKB_KEY_braille_dots_4 0x1002808 /* U+2808 BRAILLE PATTERN DOTS-4 */ -#define XKB_KEY_braille_dots_14 0x1002809 /* U+2809 BRAILLE PATTERN DOTS-14 */ -#define XKB_KEY_braille_dots_24 0x100280a /* U+280a BRAILLE PATTERN DOTS-24 */ -#define XKB_KEY_braille_dots_124 0x100280b /* U+280b BRAILLE PATTERN DOTS-124 */ -#define XKB_KEY_braille_dots_34 0x100280c /* U+280c BRAILLE PATTERN DOTS-34 */ -#define XKB_KEY_braille_dots_134 0x100280d /* U+280d BRAILLE PATTERN DOTS-134 */ -#define XKB_KEY_braille_dots_234 0x100280e /* U+280e BRAILLE PATTERN DOTS-234 */ -#define XKB_KEY_braille_dots_1234 0x100280f /* U+280f BRAILLE PATTERN DOTS-1234 */ -#define XKB_KEY_braille_dots_5 0x1002810 /* U+2810 BRAILLE PATTERN DOTS-5 */ -#define XKB_KEY_braille_dots_15 0x1002811 /* U+2811 BRAILLE PATTERN DOTS-15 */ -#define XKB_KEY_braille_dots_25 0x1002812 /* U+2812 BRAILLE PATTERN DOTS-25 */ -#define XKB_KEY_braille_dots_125 0x1002813 /* U+2813 BRAILLE PATTERN DOTS-125 */ -#define XKB_KEY_braille_dots_35 0x1002814 /* U+2814 BRAILLE PATTERN DOTS-35 */ -#define XKB_KEY_braille_dots_135 0x1002815 /* U+2815 BRAILLE PATTERN DOTS-135 */ -#define XKB_KEY_braille_dots_235 0x1002816 /* U+2816 BRAILLE PATTERN DOTS-235 */ -#define XKB_KEY_braille_dots_1235 0x1002817 /* U+2817 BRAILLE PATTERN DOTS-1235 */ -#define XKB_KEY_braille_dots_45 0x1002818 /* U+2818 BRAILLE PATTERN DOTS-45 */ -#define XKB_KEY_braille_dots_145 0x1002819 /* U+2819 BRAILLE PATTERN DOTS-145 */ -#define XKB_KEY_braille_dots_245 0x100281a /* U+281a BRAILLE PATTERN DOTS-245 */ -#define XKB_KEY_braille_dots_1245 0x100281b /* U+281b BRAILLE PATTERN DOTS-1245 */ -#define XKB_KEY_braille_dots_345 0x100281c /* U+281c BRAILLE PATTERN DOTS-345 */ -#define XKB_KEY_braille_dots_1345 0x100281d /* U+281d BRAILLE PATTERN DOTS-1345 */ -#define XKB_KEY_braille_dots_2345 0x100281e /* U+281e BRAILLE PATTERN DOTS-2345 */ -#define XKB_KEY_braille_dots_12345 0x100281f /* U+281f BRAILLE PATTERN DOTS-12345 */ -#define XKB_KEY_braille_dots_6 0x1002820 /* U+2820 BRAILLE PATTERN DOTS-6 */ -#define XKB_KEY_braille_dots_16 0x1002821 /* U+2821 BRAILLE PATTERN DOTS-16 */ -#define XKB_KEY_braille_dots_26 0x1002822 /* U+2822 BRAILLE PATTERN DOTS-26 */ -#define XKB_KEY_braille_dots_126 0x1002823 /* U+2823 BRAILLE PATTERN DOTS-126 */ -#define XKB_KEY_braille_dots_36 0x1002824 /* U+2824 BRAILLE PATTERN DOTS-36 */ -#define XKB_KEY_braille_dots_136 0x1002825 /* U+2825 BRAILLE PATTERN DOTS-136 */ -#define XKB_KEY_braille_dots_236 0x1002826 /* U+2826 BRAILLE PATTERN DOTS-236 */ -#define XKB_KEY_braille_dots_1236 0x1002827 /* U+2827 BRAILLE PATTERN DOTS-1236 */ -#define XKB_KEY_braille_dots_46 0x1002828 /* U+2828 BRAILLE PATTERN DOTS-46 */ -#define XKB_KEY_braille_dots_146 0x1002829 /* U+2829 BRAILLE PATTERN DOTS-146 */ -#define XKB_KEY_braille_dots_246 0x100282a /* U+282a BRAILLE PATTERN DOTS-246 */ -#define XKB_KEY_braille_dots_1246 0x100282b /* U+282b BRAILLE PATTERN DOTS-1246 */ -#define XKB_KEY_braille_dots_346 0x100282c /* U+282c BRAILLE PATTERN DOTS-346 */ -#define XKB_KEY_braille_dots_1346 0x100282d /* U+282d BRAILLE PATTERN DOTS-1346 */ -#define XKB_KEY_braille_dots_2346 0x100282e /* U+282e BRAILLE PATTERN DOTS-2346 */ -#define XKB_KEY_braille_dots_12346 0x100282f /* U+282f BRAILLE PATTERN DOTS-12346 */ -#define XKB_KEY_braille_dots_56 0x1002830 /* U+2830 BRAILLE PATTERN DOTS-56 */ -#define XKB_KEY_braille_dots_156 0x1002831 /* U+2831 BRAILLE PATTERN DOTS-156 */ -#define XKB_KEY_braille_dots_256 0x1002832 /* U+2832 BRAILLE PATTERN DOTS-256 */ -#define XKB_KEY_braille_dots_1256 0x1002833 /* U+2833 BRAILLE PATTERN DOTS-1256 */ -#define XKB_KEY_braille_dots_356 0x1002834 /* U+2834 BRAILLE PATTERN DOTS-356 */ -#define XKB_KEY_braille_dots_1356 0x1002835 /* U+2835 BRAILLE PATTERN DOTS-1356 */ -#define XKB_KEY_braille_dots_2356 0x1002836 /* U+2836 BRAILLE PATTERN DOTS-2356 */ -#define XKB_KEY_braille_dots_12356 0x1002837 /* U+2837 BRAILLE PATTERN DOTS-12356 */ -#define XKB_KEY_braille_dots_456 0x1002838 /* U+2838 BRAILLE PATTERN DOTS-456 */ -#define XKB_KEY_braille_dots_1456 0x1002839 /* U+2839 BRAILLE PATTERN DOTS-1456 */ -#define XKB_KEY_braille_dots_2456 0x100283a /* U+283a BRAILLE PATTERN DOTS-2456 */ -#define XKB_KEY_braille_dots_12456 0x100283b /* U+283b BRAILLE PATTERN DOTS-12456 */ -#define XKB_KEY_braille_dots_3456 0x100283c /* U+283c BRAILLE PATTERN DOTS-3456 */ -#define XKB_KEY_braille_dots_13456 0x100283d /* U+283d BRAILLE PATTERN DOTS-13456 */ -#define XKB_KEY_braille_dots_23456 0x100283e /* U+283e BRAILLE PATTERN DOTS-23456 */ -#define XKB_KEY_braille_dots_123456 0x100283f /* U+283f BRAILLE PATTERN DOTS-123456 */ -#define XKB_KEY_braille_dots_7 0x1002840 /* U+2840 BRAILLE PATTERN DOTS-7 */ -#define XKB_KEY_braille_dots_17 0x1002841 /* U+2841 BRAILLE PATTERN DOTS-17 */ -#define XKB_KEY_braille_dots_27 0x1002842 /* U+2842 BRAILLE PATTERN DOTS-27 */ -#define XKB_KEY_braille_dots_127 0x1002843 /* U+2843 BRAILLE PATTERN DOTS-127 */ -#define XKB_KEY_braille_dots_37 0x1002844 /* U+2844 BRAILLE PATTERN DOTS-37 */ -#define XKB_KEY_braille_dots_137 0x1002845 /* U+2845 BRAILLE PATTERN DOTS-137 */ -#define XKB_KEY_braille_dots_237 0x1002846 /* U+2846 BRAILLE PATTERN DOTS-237 */ -#define XKB_KEY_braille_dots_1237 0x1002847 /* U+2847 BRAILLE PATTERN DOTS-1237 */ -#define XKB_KEY_braille_dots_47 0x1002848 /* U+2848 BRAILLE PATTERN DOTS-47 */ -#define XKB_KEY_braille_dots_147 0x1002849 /* U+2849 BRAILLE PATTERN DOTS-147 */ -#define XKB_KEY_braille_dots_247 0x100284a /* U+284a BRAILLE PATTERN DOTS-247 */ -#define XKB_KEY_braille_dots_1247 0x100284b /* U+284b BRAILLE PATTERN DOTS-1247 */ -#define XKB_KEY_braille_dots_347 0x100284c /* U+284c BRAILLE PATTERN DOTS-347 */ -#define XKB_KEY_braille_dots_1347 0x100284d /* U+284d BRAILLE PATTERN DOTS-1347 */ -#define XKB_KEY_braille_dots_2347 0x100284e /* U+284e BRAILLE PATTERN DOTS-2347 */ -#define XKB_KEY_braille_dots_12347 0x100284f /* U+284f BRAILLE PATTERN DOTS-12347 */ -#define XKB_KEY_braille_dots_57 0x1002850 /* U+2850 BRAILLE PATTERN DOTS-57 */ -#define XKB_KEY_braille_dots_157 0x1002851 /* U+2851 BRAILLE PATTERN DOTS-157 */ -#define XKB_KEY_braille_dots_257 0x1002852 /* U+2852 BRAILLE PATTERN DOTS-257 */ -#define XKB_KEY_braille_dots_1257 0x1002853 /* U+2853 BRAILLE PATTERN DOTS-1257 */ -#define XKB_KEY_braille_dots_357 0x1002854 /* U+2854 BRAILLE PATTERN DOTS-357 */ -#define XKB_KEY_braille_dots_1357 0x1002855 /* U+2855 BRAILLE PATTERN DOTS-1357 */ -#define XKB_KEY_braille_dots_2357 0x1002856 /* U+2856 BRAILLE PATTERN DOTS-2357 */ -#define XKB_KEY_braille_dots_12357 0x1002857 /* U+2857 BRAILLE PATTERN DOTS-12357 */ -#define XKB_KEY_braille_dots_457 0x1002858 /* U+2858 BRAILLE PATTERN DOTS-457 */ -#define XKB_KEY_braille_dots_1457 0x1002859 /* U+2859 BRAILLE PATTERN DOTS-1457 */ -#define XKB_KEY_braille_dots_2457 0x100285a /* U+285a BRAILLE PATTERN DOTS-2457 */ -#define XKB_KEY_braille_dots_12457 0x100285b /* U+285b BRAILLE PATTERN DOTS-12457 */ -#define XKB_KEY_braille_dots_3457 0x100285c /* U+285c BRAILLE PATTERN DOTS-3457 */ -#define XKB_KEY_braille_dots_13457 0x100285d /* U+285d BRAILLE PATTERN DOTS-13457 */ -#define XKB_KEY_braille_dots_23457 0x100285e /* U+285e BRAILLE PATTERN DOTS-23457 */ -#define XKB_KEY_braille_dots_123457 0x100285f /* U+285f BRAILLE PATTERN DOTS-123457 */ -#define XKB_KEY_braille_dots_67 0x1002860 /* U+2860 BRAILLE PATTERN DOTS-67 */ -#define XKB_KEY_braille_dots_167 0x1002861 /* U+2861 BRAILLE PATTERN DOTS-167 */ -#define XKB_KEY_braille_dots_267 0x1002862 /* U+2862 BRAILLE PATTERN DOTS-267 */ -#define XKB_KEY_braille_dots_1267 0x1002863 /* U+2863 BRAILLE PATTERN DOTS-1267 */ -#define XKB_KEY_braille_dots_367 0x1002864 /* U+2864 BRAILLE PATTERN DOTS-367 */ -#define XKB_KEY_braille_dots_1367 0x1002865 /* U+2865 BRAILLE PATTERN DOTS-1367 */ -#define XKB_KEY_braille_dots_2367 0x1002866 /* U+2866 BRAILLE PATTERN DOTS-2367 */ -#define XKB_KEY_braille_dots_12367 0x1002867 /* U+2867 BRAILLE PATTERN DOTS-12367 */ -#define XKB_KEY_braille_dots_467 0x1002868 /* U+2868 BRAILLE PATTERN DOTS-467 */ -#define XKB_KEY_braille_dots_1467 0x1002869 /* U+2869 BRAILLE PATTERN DOTS-1467 */ -#define XKB_KEY_braille_dots_2467 0x100286a /* U+286a BRAILLE PATTERN DOTS-2467 */ -#define XKB_KEY_braille_dots_12467 0x100286b /* U+286b BRAILLE PATTERN DOTS-12467 */ -#define XKB_KEY_braille_dots_3467 0x100286c /* U+286c BRAILLE PATTERN DOTS-3467 */ -#define XKB_KEY_braille_dots_13467 0x100286d /* U+286d BRAILLE PATTERN DOTS-13467 */ -#define XKB_KEY_braille_dots_23467 0x100286e /* U+286e BRAILLE PATTERN DOTS-23467 */ -#define XKB_KEY_braille_dots_123467 0x100286f /* U+286f BRAILLE PATTERN DOTS-123467 */ -#define XKB_KEY_braille_dots_567 0x1002870 /* U+2870 BRAILLE PATTERN DOTS-567 */ -#define XKB_KEY_braille_dots_1567 0x1002871 /* U+2871 BRAILLE PATTERN DOTS-1567 */ -#define XKB_KEY_braille_dots_2567 0x1002872 /* U+2872 BRAILLE PATTERN DOTS-2567 */ -#define XKB_KEY_braille_dots_12567 0x1002873 /* U+2873 BRAILLE PATTERN DOTS-12567 */ -#define XKB_KEY_braille_dots_3567 0x1002874 /* U+2874 BRAILLE PATTERN DOTS-3567 */ -#define XKB_KEY_braille_dots_13567 0x1002875 /* U+2875 BRAILLE PATTERN DOTS-13567 */ -#define XKB_KEY_braille_dots_23567 0x1002876 /* U+2876 BRAILLE PATTERN DOTS-23567 */ -#define XKB_KEY_braille_dots_123567 0x1002877 /* U+2877 BRAILLE PATTERN DOTS-123567 */ -#define XKB_KEY_braille_dots_4567 0x1002878 /* U+2878 BRAILLE PATTERN DOTS-4567 */ -#define XKB_KEY_braille_dots_14567 0x1002879 /* U+2879 BRAILLE PATTERN DOTS-14567 */ -#define XKB_KEY_braille_dots_24567 0x100287a /* U+287a BRAILLE PATTERN DOTS-24567 */ -#define XKB_KEY_braille_dots_124567 0x100287b /* U+287b BRAILLE PATTERN DOTS-124567 */ -#define XKB_KEY_braille_dots_34567 0x100287c /* U+287c BRAILLE PATTERN DOTS-34567 */ -#define XKB_KEY_braille_dots_134567 0x100287d /* U+287d BRAILLE PATTERN DOTS-134567 */ -#define XKB_KEY_braille_dots_234567 0x100287e /* U+287e BRAILLE PATTERN DOTS-234567 */ -#define XKB_KEY_braille_dots_1234567 0x100287f /* U+287f BRAILLE PATTERN DOTS-1234567 */ -#define XKB_KEY_braille_dots_8 0x1002880 /* U+2880 BRAILLE PATTERN DOTS-8 */ -#define XKB_KEY_braille_dots_18 0x1002881 /* U+2881 BRAILLE PATTERN DOTS-18 */ -#define XKB_KEY_braille_dots_28 0x1002882 /* U+2882 BRAILLE PATTERN DOTS-28 */ -#define XKB_KEY_braille_dots_128 0x1002883 /* U+2883 BRAILLE PATTERN DOTS-128 */ -#define XKB_KEY_braille_dots_38 0x1002884 /* U+2884 BRAILLE PATTERN DOTS-38 */ -#define XKB_KEY_braille_dots_138 0x1002885 /* U+2885 BRAILLE PATTERN DOTS-138 */ -#define XKB_KEY_braille_dots_238 0x1002886 /* U+2886 BRAILLE PATTERN DOTS-238 */ -#define XKB_KEY_braille_dots_1238 0x1002887 /* U+2887 BRAILLE PATTERN DOTS-1238 */ -#define XKB_KEY_braille_dots_48 0x1002888 /* U+2888 BRAILLE PATTERN DOTS-48 */ -#define XKB_KEY_braille_dots_148 0x1002889 /* U+2889 BRAILLE PATTERN DOTS-148 */ -#define XKB_KEY_braille_dots_248 0x100288a /* U+288a BRAILLE PATTERN DOTS-248 */ -#define XKB_KEY_braille_dots_1248 0x100288b /* U+288b BRAILLE PATTERN DOTS-1248 */ -#define XKB_KEY_braille_dots_348 0x100288c /* U+288c BRAILLE PATTERN DOTS-348 */ -#define XKB_KEY_braille_dots_1348 0x100288d /* U+288d BRAILLE PATTERN DOTS-1348 */ -#define XKB_KEY_braille_dots_2348 0x100288e /* U+288e BRAILLE PATTERN DOTS-2348 */ -#define XKB_KEY_braille_dots_12348 0x100288f /* U+288f BRAILLE PATTERN DOTS-12348 */ -#define XKB_KEY_braille_dots_58 0x1002890 /* U+2890 BRAILLE PATTERN DOTS-58 */ -#define XKB_KEY_braille_dots_158 0x1002891 /* U+2891 BRAILLE PATTERN DOTS-158 */ -#define XKB_KEY_braille_dots_258 0x1002892 /* U+2892 BRAILLE PATTERN DOTS-258 */ -#define XKB_KEY_braille_dots_1258 0x1002893 /* U+2893 BRAILLE PATTERN DOTS-1258 */ -#define XKB_KEY_braille_dots_358 0x1002894 /* U+2894 BRAILLE PATTERN DOTS-358 */ -#define XKB_KEY_braille_dots_1358 0x1002895 /* U+2895 BRAILLE PATTERN DOTS-1358 */ -#define XKB_KEY_braille_dots_2358 0x1002896 /* U+2896 BRAILLE PATTERN DOTS-2358 */ -#define XKB_KEY_braille_dots_12358 0x1002897 /* U+2897 BRAILLE PATTERN DOTS-12358 */ -#define XKB_KEY_braille_dots_458 0x1002898 /* U+2898 BRAILLE PATTERN DOTS-458 */ -#define XKB_KEY_braille_dots_1458 0x1002899 /* U+2899 BRAILLE PATTERN DOTS-1458 */ -#define XKB_KEY_braille_dots_2458 0x100289a /* U+289a BRAILLE PATTERN DOTS-2458 */ -#define XKB_KEY_braille_dots_12458 0x100289b /* U+289b BRAILLE PATTERN DOTS-12458 */ -#define XKB_KEY_braille_dots_3458 0x100289c /* U+289c BRAILLE PATTERN DOTS-3458 */ -#define XKB_KEY_braille_dots_13458 0x100289d /* U+289d BRAILLE PATTERN DOTS-13458 */ -#define XKB_KEY_braille_dots_23458 0x100289e /* U+289e BRAILLE PATTERN DOTS-23458 */ -#define XKB_KEY_braille_dots_123458 0x100289f /* U+289f BRAILLE PATTERN DOTS-123458 */ -#define XKB_KEY_braille_dots_68 0x10028a0 /* U+28a0 BRAILLE PATTERN DOTS-68 */ -#define XKB_KEY_braille_dots_168 0x10028a1 /* U+28a1 BRAILLE PATTERN DOTS-168 */ -#define XKB_KEY_braille_dots_268 0x10028a2 /* U+28a2 BRAILLE PATTERN DOTS-268 */ -#define XKB_KEY_braille_dots_1268 0x10028a3 /* U+28a3 BRAILLE PATTERN DOTS-1268 */ -#define XKB_KEY_braille_dots_368 0x10028a4 /* U+28a4 BRAILLE PATTERN DOTS-368 */ -#define XKB_KEY_braille_dots_1368 0x10028a5 /* U+28a5 BRAILLE PATTERN DOTS-1368 */ -#define XKB_KEY_braille_dots_2368 0x10028a6 /* U+28a6 BRAILLE PATTERN DOTS-2368 */ -#define XKB_KEY_braille_dots_12368 0x10028a7 /* U+28a7 BRAILLE PATTERN DOTS-12368 */ -#define XKB_KEY_braille_dots_468 0x10028a8 /* U+28a8 BRAILLE PATTERN DOTS-468 */ -#define XKB_KEY_braille_dots_1468 0x10028a9 /* U+28a9 BRAILLE PATTERN DOTS-1468 */ -#define XKB_KEY_braille_dots_2468 0x10028aa /* U+28aa BRAILLE PATTERN DOTS-2468 */ -#define XKB_KEY_braille_dots_12468 0x10028ab /* U+28ab BRAILLE PATTERN DOTS-12468 */ -#define XKB_KEY_braille_dots_3468 0x10028ac /* U+28ac BRAILLE PATTERN DOTS-3468 */ -#define XKB_KEY_braille_dots_13468 0x10028ad /* U+28ad BRAILLE PATTERN DOTS-13468 */ -#define XKB_KEY_braille_dots_23468 0x10028ae /* U+28ae BRAILLE PATTERN DOTS-23468 */ -#define XKB_KEY_braille_dots_123468 0x10028af /* U+28af BRAILLE PATTERN DOTS-123468 */ -#define XKB_KEY_braille_dots_568 0x10028b0 /* U+28b0 BRAILLE PATTERN DOTS-568 */ -#define XKB_KEY_braille_dots_1568 0x10028b1 /* U+28b1 BRAILLE PATTERN DOTS-1568 */ -#define XKB_KEY_braille_dots_2568 0x10028b2 /* U+28b2 BRAILLE PATTERN DOTS-2568 */ -#define XKB_KEY_braille_dots_12568 0x10028b3 /* U+28b3 BRAILLE PATTERN DOTS-12568 */ -#define XKB_KEY_braille_dots_3568 0x10028b4 /* U+28b4 BRAILLE PATTERN DOTS-3568 */ -#define XKB_KEY_braille_dots_13568 0x10028b5 /* U+28b5 BRAILLE PATTERN DOTS-13568 */ -#define XKB_KEY_braille_dots_23568 0x10028b6 /* U+28b6 BRAILLE PATTERN DOTS-23568 */ -#define XKB_KEY_braille_dots_123568 0x10028b7 /* U+28b7 BRAILLE PATTERN DOTS-123568 */ -#define XKB_KEY_braille_dots_4568 0x10028b8 /* U+28b8 BRAILLE PATTERN DOTS-4568 */ -#define XKB_KEY_braille_dots_14568 0x10028b9 /* U+28b9 BRAILLE PATTERN DOTS-14568 */ -#define XKB_KEY_braille_dots_24568 0x10028ba /* U+28ba BRAILLE PATTERN DOTS-24568 */ -#define XKB_KEY_braille_dots_124568 0x10028bb /* U+28bb BRAILLE PATTERN DOTS-124568 */ -#define XKB_KEY_braille_dots_34568 0x10028bc /* U+28bc BRAILLE PATTERN DOTS-34568 */ -#define XKB_KEY_braille_dots_134568 0x10028bd /* U+28bd BRAILLE PATTERN DOTS-134568 */ -#define XKB_KEY_braille_dots_234568 0x10028be /* U+28be BRAILLE PATTERN DOTS-234568 */ -#define XKB_KEY_braille_dots_1234568 0x10028bf /* U+28bf BRAILLE PATTERN DOTS-1234568 */ -#define XKB_KEY_braille_dots_78 0x10028c0 /* U+28c0 BRAILLE PATTERN DOTS-78 */ -#define XKB_KEY_braille_dots_178 0x10028c1 /* U+28c1 BRAILLE PATTERN DOTS-178 */ -#define XKB_KEY_braille_dots_278 0x10028c2 /* U+28c2 BRAILLE PATTERN DOTS-278 */ -#define XKB_KEY_braille_dots_1278 0x10028c3 /* U+28c3 BRAILLE PATTERN DOTS-1278 */ -#define XKB_KEY_braille_dots_378 0x10028c4 /* U+28c4 BRAILLE PATTERN DOTS-378 */ -#define XKB_KEY_braille_dots_1378 0x10028c5 /* U+28c5 BRAILLE PATTERN DOTS-1378 */ -#define XKB_KEY_braille_dots_2378 0x10028c6 /* U+28c6 BRAILLE PATTERN DOTS-2378 */ -#define XKB_KEY_braille_dots_12378 0x10028c7 /* U+28c7 BRAILLE PATTERN DOTS-12378 */ -#define XKB_KEY_braille_dots_478 0x10028c8 /* U+28c8 BRAILLE PATTERN DOTS-478 */ -#define XKB_KEY_braille_dots_1478 0x10028c9 /* U+28c9 BRAILLE PATTERN DOTS-1478 */ -#define XKB_KEY_braille_dots_2478 0x10028ca /* U+28ca BRAILLE PATTERN DOTS-2478 */ -#define XKB_KEY_braille_dots_12478 0x10028cb /* U+28cb BRAILLE PATTERN DOTS-12478 */ -#define XKB_KEY_braille_dots_3478 0x10028cc /* U+28cc BRAILLE PATTERN DOTS-3478 */ -#define XKB_KEY_braille_dots_13478 0x10028cd /* U+28cd BRAILLE PATTERN DOTS-13478 */ -#define XKB_KEY_braille_dots_23478 0x10028ce /* U+28ce BRAILLE PATTERN DOTS-23478 */ -#define XKB_KEY_braille_dots_123478 0x10028cf /* U+28cf BRAILLE PATTERN DOTS-123478 */ -#define XKB_KEY_braille_dots_578 0x10028d0 /* U+28d0 BRAILLE PATTERN DOTS-578 */ -#define XKB_KEY_braille_dots_1578 0x10028d1 /* U+28d1 BRAILLE PATTERN DOTS-1578 */ -#define XKB_KEY_braille_dots_2578 0x10028d2 /* U+28d2 BRAILLE PATTERN DOTS-2578 */ -#define XKB_KEY_braille_dots_12578 0x10028d3 /* U+28d3 BRAILLE PATTERN DOTS-12578 */ -#define XKB_KEY_braille_dots_3578 0x10028d4 /* U+28d4 BRAILLE PATTERN DOTS-3578 */ -#define XKB_KEY_braille_dots_13578 0x10028d5 /* U+28d5 BRAILLE PATTERN DOTS-13578 */ -#define XKB_KEY_braille_dots_23578 0x10028d6 /* U+28d6 BRAILLE PATTERN DOTS-23578 */ -#define XKB_KEY_braille_dots_123578 0x10028d7 /* U+28d7 BRAILLE PATTERN DOTS-123578 */ -#define XKB_KEY_braille_dots_4578 0x10028d8 /* U+28d8 BRAILLE PATTERN DOTS-4578 */ -#define XKB_KEY_braille_dots_14578 0x10028d9 /* U+28d9 BRAILLE PATTERN DOTS-14578 */ -#define XKB_KEY_braille_dots_24578 0x10028da /* U+28da BRAILLE PATTERN DOTS-24578 */ -#define XKB_KEY_braille_dots_124578 0x10028db /* U+28db BRAILLE PATTERN DOTS-124578 */ -#define XKB_KEY_braille_dots_34578 0x10028dc /* U+28dc BRAILLE PATTERN DOTS-34578 */ -#define XKB_KEY_braille_dots_134578 0x10028dd /* U+28dd BRAILLE PATTERN DOTS-134578 */ -#define XKB_KEY_braille_dots_234578 0x10028de /* U+28de BRAILLE PATTERN DOTS-234578 */ -#define XKB_KEY_braille_dots_1234578 0x10028df /* U+28df BRAILLE PATTERN DOTS-1234578 */ -#define XKB_KEY_braille_dots_678 0x10028e0 /* U+28e0 BRAILLE PATTERN DOTS-678 */ -#define XKB_KEY_braille_dots_1678 0x10028e1 /* U+28e1 BRAILLE PATTERN DOTS-1678 */ -#define XKB_KEY_braille_dots_2678 0x10028e2 /* U+28e2 BRAILLE PATTERN DOTS-2678 */ -#define XKB_KEY_braille_dots_12678 0x10028e3 /* U+28e3 BRAILLE PATTERN DOTS-12678 */ -#define XKB_KEY_braille_dots_3678 0x10028e4 /* U+28e4 BRAILLE PATTERN DOTS-3678 */ -#define XKB_KEY_braille_dots_13678 0x10028e5 /* U+28e5 BRAILLE PATTERN DOTS-13678 */ -#define XKB_KEY_braille_dots_23678 0x10028e6 /* U+28e6 BRAILLE PATTERN DOTS-23678 */ -#define XKB_KEY_braille_dots_123678 0x10028e7 /* U+28e7 BRAILLE PATTERN DOTS-123678 */ -#define XKB_KEY_braille_dots_4678 0x10028e8 /* U+28e8 BRAILLE PATTERN DOTS-4678 */ -#define XKB_KEY_braille_dots_14678 0x10028e9 /* U+28e9 BRAILLE PATTERN DOTS-14678 */ -#define XKB_KEY_braille_dots_24678 0x10028ea /* U+28ea BRAILLE PATTERN DOTS-24678 */ -#define XKB_KEY_braille_dots_124678 0x10028eb /* U+28eb BRAILLE PATTERN DOTS-124678 */ -#define XKB_KEY_braille_dots_34678 0x10028ec /* U+28ec BRAILLE PATTERN DOTS-34678 */ -#define XKB_KEY_braille_dots_134678 0x10028ed /* U+28ed BRAILLE PATTERN DOTS-134678 */ -#define XKB_KEY_braille_dots_234678 0x10028ee /* U+28ee BRAILLE PATTERN DOTS-234678 */ -#define XKB_KEY_braille_dots_1234678 0x10028ef /* U+28ef BRAILLE PATTERN DOTS-1234678 */ -#define XKB_KEY_braille_dots_5678 0x10028f0 /* U+28f0 BRAILLE PATTERN DOTS-5678 */ -#define XKB_KEY_braille_dots_15678 0x10028f1 /* U+28f1 BRAILLE PATTERN DOTS-15678 */ -#define XKB_KEY_braille_dots_25678 0x10028f2 /* U+28f2 BRAILLE PATTERN DOTS-25678 */ -#define XKB_KEY_braille_dots_125678 0x10028f3 /* U+28f3 BRAILLE PATTERN DOTS-125678 */ -#define XKB_KEY_braille_dots_35678 0x10028f4 /* U+28f4 BRAILLE PATTERN DOTS-35678 */ -#define XKB_KEY_braille_dots_135678 0x10028f5 /* U+28f5 BRAILLE PATTERN DOTS-135678 */ -#define XKB_KEY_braille_dots_235678 0x10028f6 /* U+28f6 BRAILLE PATTERN DOTS-235678 */ -#define XKB_KEY_braille_dots_1235678 0x10028f7 /* U+28f7 BRAILLE PATTERN DOTS-1235678 */ -#define XKB_KEY_braille_dots_45678 0x10028f8 /* U+28f8 BRAILLE PATTERN DOTS-45678 */ -#define XKB_KEY_braille_dots_145678 0x10028f9 /* U+28f9 BRAILLE PATTERN DOTS-145678 */ -#define XKB_KEY_braille_dots_245678 0x10028fa /* U+28fa BRAILLE PATTERN DOTS-245678 */ -#define XKB_KEY_braille_dots_1245678 0x10028fb /* U+28fb BRAILLE PATTERN DOTS-1245678 */ -#define XKB_KEY_braille_dots_345678 0x10028fc /* U+28fc BRAILLE PATTERN DOTS-345678 */ -#define XKB_KEY_braille_dots_1345678 0x10028fd /* U+28fd BRAILLE PATTERN DOTS-1345678 */ -#define XKB_KEY_braille_dots_2345678 0x10028fe /* U+28fe BRAILLE PATTERN DOTS-2345678 */ -#define XKB_KEY_braille_dots_12345678 0x10028ff /* U+28ff BRAILLE PATTERN DOTS-12345678 */ - -/* - * Sinhala (http://unicode.org/charts/PDF/U0D80.pdf) - * http://www.nongnu.org/sinhala/doc/transliteration/sinhala-transliteration_6.html - */ - -#define XKB_KEY_Sinh_ng 0x1000d82 /* U+0D82 SINHALA ANUSVARAYA */ -#define XKB_KEY_Sinh_h2 0x1000d83 /* U+0D83 SINHALA VISARGAYA */ -#define XKB_KEY_Sinh_a 0x1000d85 /* U+0D85 SINHALA AYANNA */ -#define XKB_KEY_Sinh_aa 0x1000d86 /* U+0D86 SINHALA AAYANNA */ -#define XKB_KEY_Sinh_ae 0x1000d87 /* U+0D87 SINHALA AEYANNA */ -#define XKB_KEY_Sinh_aee 0x1000d88 /* U+0D88 SINHALA AEEYANNA */ -#define XKB_KEY_Sinh_i 0x1000d89 /* U+0D89 SINHALA IYANNA */ -#define XKB_KEY_Sinh_ii 0x1000d8a /* U+0D8A SINHALA IIYANNA */ -#define XKB_KEY_Sinh_u 0x1000d8b /* U+0D8B SINHALA UYANNA */ -#define XKB_KEY_Sinh_uu 0x1000d8c /* U+0D8C SINHALA UUYANNA */ -#define XKB_KEY_Sinh_ri 0x1000d8d /* U+0D8D SINHALA IRUYANNA */ -#define XKB_KEY_Sinh_rii 0x1000d8e /* U+0D8E SINHALA IRUUYANNA */ -#define XKB_KEY_Sinh_lu 0x1000d8f /* U+0D8F SINHALA ILUYANNA */ -#define XKB_KEY_Sinh_luu 0x1000d90 /* U+0D90 SINHALA ILUUYANNA */ -#define XKB_KEY_Sinh_e 0x1000d91 /* U+0D91 SINHALA EYANNA */ -#define XKB_KEY_Sinh_ee 0x1000d92 /* U+0D92 SINHALA EEYANNA */ -#define XKB_KEY_Sinh_ai 0x1000d93 /* U+0D93 SINHALA AIYANNA */ -#define XKB_KEY_Sinh_o 0x1000d94 /* U+0D94 SINHALA OYANNA */ -#define XKB_KEY_Sinh_oo 0x1000d95 /* U+0D95 SINHALA OOYANNA */ -#define XKB_KEY_Sinh_au 0x1000d96 /* U+0D96 SINHALA AUYANNA */ -#define XKB_KEY_Sinh_ka 0x1000d9a /* U+0D9A SINHALA KAYANNA */ -#define XKB_KEY_Sinh_kha 0x1000d9b /* U+0D9B SINHALA MAHA. KAYANNA */ -#define XKB_KEY_Sinh_ga 0x1000d9c /* U+0D9C SINHALA GAYANNA */ -#define XKB_KEY_Sinh_gha 0x1000d9d /* U+0D9D SINHALA MAHA. GAYANNA */ -#define XKB_KEY_Sinh_ng2 0x1000d9e /* U+0D9E SINHALA KANTAJA NAASIKYAYA */ -#define XKB_KEY_Sinh_nga 0x1000d9f /* U+0D9F SINHALA SANYAKA GAYANNA */ -#define XKB_KEY_Sinh_ca 0x1000da0 /* U+0DA0 SINHALA CAYANNA */ -#define XKB_KEY_Sinh_cha 0x1000da1 /* U+0DA1 SINHALA MAHA. CAYANNA */ -#define XKB_KEY_Sinh_ja 0x1000da2 /* U+0DA2 SINHALA JAYANNA */ -#define XKB_KEY_Sinh_jha 0x1000da3 /* U+0DA3 SINHALA MAHA. JAYANNA */ -#define XKB_KEY_Sinh_nya 0x1000da4 /* U+0DA4 SINHALA TAALUJA NAASIKYAYA */ -#define XKB_KEY_Sinh_jnya 0x1000da5 /* U+0DA5 SINHALA TAALUJA SANYOOGA NAASIKYAYA */ -#define XKB_KEY_Sinh_nja 0x1000da6 /* U+0DA6 SINHALA SANYAKA JAYANNA */ -#define XKB_KEY_Sinh_tta 0x1000da7 /* U+0DA7 SINHALA TTAYANNA */ -#define XKB_KEY_Sinh_ttha 0x1000da8 /* U+0DA8 SINHALA MAHA. TTAYANNA */ -#define XKB_KEY_Sinh_dda 0x1000da9 /* U+0DA9 SINHALA DDAYANNA */ -#define XKB_KEY_Sinh_ddha 0x1000daa /* U+0DAA SINHALA MAHA. DDAYANNA */ -#define XKB_KEY_Sinh_nna 0x1000dab /* U+0DAB SINHALA MUURDHAJA NAYANNA */ -#define XKB_KEY_Sinh_ndda 0x1000dac /* U+0DAC SINHALA SANYAKA DDAYANNA */ -#define XKB_KEY_Sinh_tha 0x1000dad /* U+0DAD SINHALA TAYANNA */ -#define XKB_KEY_Sinh_thha 0x1000dae /* U+0DAE SINHALA MAHA. TAYANNA */ -#define XKB_KEY_Sinh_dha 0x1000daf /* U+0DAF SINHALA DAYANNA */ -#define XKB_KEY_Sinh_dhha 0x1000db0 /* U+0DB0 SINHALA MAHA. DAYANNA */ -#define XKB_KEY_Sinh_na 0x1000db1 /* U+0DB1 SINHALA DANTAJA NAYANNA */ -#define XKB_KEY_Sinh_ndha 0x1000db3 /* U+0DB3 SINHALA SANYAKA DAYANNA */ -#define XKB_KEY_Sinh_pa 0x1000db4 /* U+0DB4 SINHALA PAYANNA */ -#define XKB_KEY_Sinh_pha 0x1000db5 /* U+0DB5 SINHALA MAHA. PAYANNA */ -#define XKB_KEY_Sinh_ba 0x1000db6 /* U+0DB6 SINHALA BAYANNA */ -#define XKB_KEY_Sinh_bha 0x1000db7 /* U+0DB7 SINHALA MAHA. BAYANNA */ -#define XKB_KEY_Sinh_ma 0x1000db8 /* U+0DB8 SINHALA MAYANNA */ -#define XKB_KEY_Sinh_mba 0x1000db9 /* U+0DB9 SINHALA AMBA BAYANNA */ -#define XKB_KEY_Sinh_ya 0x1000dba /* U+0DBA SINHALA YAYANNA */ -#define XKB_KEY_Sinh_ra 0x1000dbb /* U+0DBB SINHALA RAYANNA */ -#define XKB_KEY_Sinh_la 0x1000dbd /* U+0DBD SINHALA DANTAJA LAYANNA */ -#define XKB_KEY_Sinh_va 0x1000dc0 /* U+0DC0 SINHALA VAYANNA */ -#define XKB_KEY_Sinh_sha 0x1000dc1 /* U+0DC1 SINHALA TAALUJA SAYANNA */ -#define XKB_KEY_Sinh_ssha 0x1000dc2 /* U+0DC2 SINHALA MUURDHAJA SAYANNA */ -#define XKB_KEY_Sinh_sa 0x1000dc3 /* U+0DC3 SINHALA DANTAJA SAYANNA */ -#define XKB_KEY_Sinh_ha 0x1000dc4 /* U+0DC4 SINHALA HAYANNA */ -#define XKB_KEY_Sinh_lla 0x1000dc5 /* U+0DC5 SINHALA MUURDHAJA LAYANNA */ -#define XKB_KEY_Sinh_fa 0x1000dc6 /* U+0DC6 SINHALA FAYANNA */ -#define XKB_KEY_Sinh_al 0x1000dca /* U+0DCA SINHALA AL-LAKUNA */ -#define XKB_KEY_Sinh_aa2 0x1000dcf /* U+0DCF SINHALA AELA-PILLA */ -#define XKB_KEY_Sinh_ae2 0x1000dd0 /* U+0DD0 SINHALA AEDA-PILLA */ -#define XKB_KEY_Sinh_aee2 0x1000dd1 /* U+0DD1 SINHALA DIGA AEDA-PILLA */ -#define XKB_KEY_Sinh_i2 0x1000dd2 /* U+0DD2 SINHALA IS-PILLA */ -#define XKB_KEY_Sinh_ii2 0x1000dd3 /* U+0DD3 SINHALA DIGA IS-PILLA */ -#define XKB_KEY_Sinh_u2 0x1000dd4 /* U+0DD4 SINHALA PAA-PILLA */ -#define XKB_KEY_Sinh_uu2 0x1000dd6 /* U+0DD6 SINHALA DIGA PAA-PILLA */ -#define XKB_KEY_Sinh_ru2 0x1000dd8 /* U+0DD8 SINHALA GAETTA-PILLA */ -#define XKB_KEY_Sinh_e2 0x1000dd9 /* U+0DD9 SINHALA KOMBUVA */ -#define XKB_KEY_Sinh_ee2 0x1000dda /* U+0DDA SINHALA DIGA KOMBUVA */ -#define XKB_KEY_Sinh_ai2 0x1000ddb /* U+0DDB SINHALA KOMBU DEKA */ -#define XKB_KEY_Sinh_o2 0x1000ddc /* U+0DDC SINHALA KOMBUVA HAA AELA-PILLA*/ -#define XKB_KEY_Sinh_oo2 0x1000ddd /* U+0DDD SINHALA KOMBUVA HAA DIGA AELA-PILLA*/ -#define XKB_KEY_Sinh_au2 0x1000dde /* U+0DDE SINHALA KOMBUVA HAA GAYANUKITTA */ -#define XKB_KEY_Sinh_lu2 0x1000ddf /* U+0DDF SINHALA GAYANUKITTA */ -#define XKB_KEY_Sinh_ruu2 0x1000df2 /* U+0DF2 SINHALA DIGA GAETTA-PILLA */ -#define XKB_KEY_Sinh_luu2 0x1000df3 /* U+0DF3 SINHALA DIGA GAYANUKITTA */ -#define XKB_KEY_Sinh_kunddaliya 0x1000df4 /* U+0DF4 SINHALA KUNDDALIYA */ -/* - * XFree86 vendor specific keysyms. - * - * The XFree86 keysym range is 0x10080001 - 0x1008FFFF. - * - * X.Org will not be adding to the XF86 set of keysyms, though they have - * been adopted and are considered a "standard" part of X keysym definitions. - * XFree86 never properly commented these keysyms, so we have done our - * best to explain the semantic meaning of these keys. - * - * XFree86 has removed their mail archives of the period, that might have - * shed more light on some of these definitions. Until/unless we resurrect - * these archives, these are from memory and usage. - */ - -/* - * ModeLock - * - * This one is old, and not really used any more since XKB offers this - * functionality. - */ - -#define XKB_KEY_XF86ModeLock 0x1008FF01 /* Mode Switch Lock */ - -/* Backlight controls. */ -#define XKB_KEY_XF86MonBrightnessUp 0x1008FF02 /* Monitor/panel brightness */ -#define XKB_KEY_XF86MonBrightnessDown 0x1008FF03 /* Monitor/panel brightness */ -#define XKB_KEY_XF86KbdLightOnOff 0x1008FF04 /* Keyboards may be lit */ -#define XKB_KEY_XF86KbdBrightnessUp 0x1008FF05 /* Keyboards may be lit */ -#define XKB_KEY_XF86KbdBrightnessDown 0x1008FF06 /* Keyboards may be lit */ -#define XKB_KEY_XF86MonBrightnessCycle 0x1008FF07 /* Monitor/panel brightness */ - -/* - * Keys found on some "Internet" keyboards. - */ -#define XKB_KEY_XF86Standby 0x1008FF10 /* System into standby mode */ -#define XKB_KEY_XF86AudioLowerVolume 0x1008FF11 /* Volume control down */ -#define XKB_KEY_XF86AudioMute 0x1008FF12 /* Mute sound from the system */ -#define XKB_KEY_XF86AudioRaiseVolume 0x1008FF13 /* Volume control up */ -#define XKB_KEY_XF86AudioPlay 0x1008FF14 /* Start playing of audio > */ -#define XKB_KEY_XF86AudioStop 0x1008FF15 /* Stop playing audio */ -#define XKB_KEY_XF86AudioPrev 0x1008FF16 /* Previous track */ -#define XKB_KEY_XF86AudioNext 0x1008FF17 /* Next track */ -#define XKB_KEY_XF86HomePage 0x1008FF18 /* Display user's home page */ -#define XKB_KEY_XF86Mail 0x1008FF19 /* Invoke user's mail program */ -#define XKB_KEY_XF86Start 0x1008FF1A /* Start application */ -#define XKB_KEY_XF86Search 0x1008FF1B /* Search */ -#define XKB_KEY_XF86AudioRecord 0x1008FF1C /* Record audio application */ - -/* These are sometimes found on PDA's (e.g. Palm, PocketPC or elsewhere) */ -#define XKB_KEY_XF86Calculator 0x1008FF1D /* Invoke calculator program */ -#define XKB_KEY_XF86Memo 0x1008FF1E /* Invoke Memo taking program */ -#define XKB_KEY_XF86ToDoList 0x1008FF1F /* Invoke To Do List program */ -#define XKB_KEY_XF86Calendar 0x1008FF20 /* Invoke Calendar program */ -#define XKB_KEY_XF86PowerDown 0x1008FF21 /* Deep sleep the system */ -#define XKB_KEY_XF86ContrastAdjust 0x1008FF22 /* Adjust screen contrast */ -#define XKB_KEY_XF86RockerUp 0x1008FF23 /* Rocker switches exist up */ -#define XKB_KEY_XF86RockerDown 0x1008FF24 /* and down */ -#define XKB_KEY_XF86RockerEnter 0x1008FF25 /* and let you press them */ - -/* Some more "Internet" keyboard symbols */ -#define XKB_KEY_XF86Back 0x1008FF26 /* Like back on a browser */ -#define XKB_KEY_XF86Forward 0x1008FF27 /* Like forward on a browser */ -#define XKB_KEY_XF86Stop 0x1008FF28 /* Stop current operation */ -#define XKB_KEY_XF86Refresh 0x1008FF29 /* Refresh the page */ -#define XKB_KEY_XF86PowerOff 0x1008FF2A /* Power off system entirely */ -#define XKB_KEY_XF86WakeUp 0x1008FF2B /* Wake up system from sleep */ -#define XKB_KEY_XF86Eject 0x1008FF2C /* Eject device (e.g. DVD) */ -#define XKB_KEY_XF86ScreenSaver 0x1008FF2D /* Invoke screensaver */ -#define XKB_KEY_XF86WWW 0x1008FF2E /* Invoke web browser */ -#define XKB_KEY_XF86Sleep 0x1008FF2F /* Put system to sleep */ -#define XKB_KEY_XF86Favorites 0x1008FF30 /* Show favorite locations */ -#define XKB_KEY_XF86AudioPause 0x1008FF31 /* Pause audio playing */ -#define XKB_KEY_XF86AudioMedia 0x1008FF32 /* Launch media collection app */ -#define XKB_KEY_XF86MyComputer 0x1008FF33 /* Display "My Computer" window */ -#define XKB_KEY_XF86VendorHome 0x1008FF34 /* Display vendor home web site */ -#define XKB_KEY_XF86LightBulb 0x1008FF35 /* Light bulb keys exist */ -#define XKB_KEY_XF86Shop 0x1008FF36 /* Display shopping web site */ -#define XKB_KEY_XF86History 0x1008FF37 /* Show history of web surfing */ -#define XKB_KEY_XF86OpenURL 0x1008FF38 /* Open selected URL */ -#define XKB_KEY_XF86AddFavorite 0x1008FF39 /* Add URL to favorites list */ -#define XKB_KEY_XF86HotLinks 0x1008FF3A /* Show "hot" links */ -#define XKB_KEY_XF86BrightnessAdjust 0x1008FF3B /* Invoke brightness adj. UI */ -#define XKB_KEY_XF86Finance 0x1008FF3C /* Display financial site */ -#define XKB_KEY_XF86Community 0x1008FF3D /* Display user's community */ -#define XKB_KEY_XF86AudioRewind 0x1008FF3E /* "rewind" audio track */ -#define XKB_KEY_XF86BackForward 0x1008FF3F /* ??? */ -#define XKB_KEY_XF86Launch0 0x1008FF40 /* Launch Application */ -#define XKB_KEY_XF86Launch1 0x1008FF41 /* Launch Application */ -#define XKB_KEY_XF86Launch2 0x1008FF42 /* Launch Application */ -#define XKB_KEY_XF86Launch3 0x1008FF43 /* Launch Application */ -#define XKB_KEY_XF86Launch4 0x1008FF44 /* Launch Application */ -#define XKB_KEY_XF86Launch5 0x1008FF45 /* Launch Application */ -#define XKB_KEY_XF86Launch6 0x1008FF46 /* Launch Application */ -#define XKB_KEY_XF86Launch7 0x1008FF47 /* Launch Application */ -#define XKB_KEY_XF86Launch8 0x1008FF48 /* Launch Application */ -#define XKB_KEY_XF86Launch9 0x1008FF49 /* Launch Application */ -#define XKB_KEY_XF86LaunchA 0x1008FF4A /* Launch Application */ -#define XKB_KEY_XF86LaunchB 0x1008FF4B /* Launch Application */ -#define XKB_KEY_XF86LaunchC 0x1008FF4C /* Launch Application */ -#define XKB_KEY_XF86LaunchD 0x1008FF4D /* Launch Application */ -#define XKB_KEY_XF86LaunchE 0x1008FF4E /* Launch Application */ -#define XKB_KEY_XF86LaunchF 0x1008FF4F /* Launch Application */ - -#define XKB_KEY_XF86ApplicationLeft 0x1008FF50 /* switch to application, left */ -#define XKB_KEY_XF86ApplicationRight 0x1008FF51 /* switch to application, right*/ -#define XKB_KEY_XF86Book 0x1008FF52 /* Launch bookreader */ -#define XKB_KEY_XF86CD 0x1008FF53 /* Launch CD/DVD player */ -#define XKB_KEY_XF86Calculater 0x1008FF54 /* Launch Calculater */ -#define XKB_KEY_XF86Clear 0x1008FF55 /* Clear window, screen */ -#define XKB_KEY_XF86Close 0x1008FF56 /* Close window */ -#define XKB_KEY_XF86Copy 0x1008FF57 /* Copy selection */ -#define XKB_KEY_XF86Cut 0x1008FF58 /* Cut selection */ -#define XKB_KEY_XF86Display 0x1008FF59 /* Output switch key */ -#define XKB_KEY_XF86DOS 0x1008FF5A /* Launch DOS (emulation) */ -#define XKB_KEY_XF86Documents 0x1008FF5B /* Open documents window */ -#define XKB_KEY_XF86Excel 0x1008FF5C /* Launch spread sheet */ -#define XKB_KEY_XF86Explorer 0x1008FF5D /* Launch file explorer */ -#define XKB_KEY_XF86Game 0x1008FF5E /* Launch game */ -#define XKB_KEY_XF86Go 0x1008FF5F /* Go to URL */ -#define XKB_KEY_XF86iTouch 0x1008FF60 /* Logitech iTouch- don't use */ -#define XKB_KEY_XF86LogOff 0x1008FF61 /* Log off system */ -#define XKB_KEY_XF86Market 0x1008FF62 /* ?? */ -#define XKB_KEY_XF86Meeting 0x1008FF63 /* enter meeting in calendar */ -#define XKB_KEY_XF86MenuKB 0x1008FF65 /* distinguish keyboard from PB */ -#define XKB_KEY_XF86MenuPB 0x1008FF66 /* distinguish PB from keyboard */ -#define XKB_KEY_XF86MySites 0x1008FF67 /* Favourites */ -#define XKB_KEY_XF86New 0x1008FF68 /* New (folder, document... */ -#define XKB_KEY_XF86News 0x1008FF69 /* News */ -#define XKB_KEY_XF86OfficeHome 0x1008FF6A /* Office home (old Staroffice)*/ -#define XKB_KEY_XF86Open 0x1008FF6B /* Open */ -#define XKB_KEY_XF86Option 0x1008FF6C /* ?? */ -#define XKB_KEY_XF86Paste 0x1008FF6D /* Paste */ -#define XKB_KEY_XF86Phone 0x1008FF6E /* Launch phone; dial number */ -#define XKB_KEY_XF86Q 0x1008FF70 /* Compaq's Q - don't use */ -#define XKB_KEY_XF86Reply 0x1008FF72 /* Reply e.g., mail */ -#define XKB_KEY_XF86Reload 0x1008FF73 /* Reload web page, file, etc. */ -#define XKB_KEY_XF86RotateWindows 0x1008FF74 /* Rotate windows e.g. xrandr */ -#define XKB_KEY_XF86RotationPB 0x1008FF75 /* don't use */ -#define XKB_KEY_XF86RotationKB 0x1008FF76 /* don't use */ -#define XKB_KEY_XF86Save 0x1008FF77 /* Save (file, document, state */ -#define XKB_KEY_XF86ScrollUp 0x1008FF78 /* Scroll window/contents up */ -#define XKB_KEY_XF86ScrollDown 0x1008FF79 /* Scrool window/contentd down */ -#define XKB_KEY_XF86ScrollClick 0x1008FF7A /* Use XKB mousekeys instead */ -#define XKB_KEY_XF86Send 0x1008FF7B /* Send mail, file, object */ -#define XKB_KEY_XF86Spell 0x1008FF7C /* Spell checker */ -#define XKB_KEY_XF86SplitScreen 0x1008FF7D /* Split window or screen */ -#define XKB_KEY_XF86Support 0x1008FF7E /* Get support (??) */ -#define XKB_KEY_XF86TaskPane 0x1008FF7F /* Show tasks */ -#define XKB_KEY_XF86Terminal 0x1008FF80 /* Launch terminal emulator */ -#define XKB_KEY_XF86Tools 0x1008FF81 /* toolbox of desktop/app. */ -#define XKB_KEY_XF86Travel 0x1008FF82 /* ?? */ -#define XKB_KEY_XF86UserPB 0x1008FF84 /* ?? */ -#define XKB_KEY_XF86User1KB 0x1008FF85 /* ?? */ -#define XKB_KEY_XF86User2KB 0x1008FF86 /* ?? */ -#define XKB_KEY_XF86Video 0x1008FF87 /* Launch video player */ -#define XKB_KEY_XF86WheelButton 0x1008FF88 /* button from a mouse wheel */ -#define XKB_KEY_XF86Word 0x1008FF89 /* Launch word processor */ -#define XKB_KEY_XF86Xfer 0x1008FF8A -#define XKB_KEY_XF86ZoomIn 0x1008FF8B /* zoom in view, map, etc. */ -#define XKB_KEY_XF86ZoomOut 0x1008FF8C /* zoom out view, map, etc. */ - -#define XKB_KEY_XF86Away 0x1008FF8D /* mark yourself as away */ -#define XKB_KEY_XF86Messenger 0x1008FF8E /* as in instant messaging */ -#define XKB_KEY_XF86WebCam 0x1008FF8F /* Launch web camera app. */ -#define XKB_KEY_XF86MailForward 0x1008FF90 /* Forward in mail */ -#define XKB_KEY_XF86Pictures 0x1008FF91 /* Show pictures */ -#define XKB_KEY_XF86Music 0x1008FF92 /* Launch music application */ - -#define XKB_KEY_XF86Battery 0x1008FF93 /* Display battery information */ -#define XKB_KEY_XF86Bluetooth 0x1008FF94 /* Enable/disable Bluetooth */ -#define XKB_KEY_XF86WLAN 0x1008FF95 /* Enable/disable WLAN */ -#define XKB_KEY_XF86UWB 0x1008FF96 /* Enable/disable UWB */ - -#define XKB_KEY_XF86AudioForward 0x1008FF97 /* fast-forward audio track */ -#define XKB_KEY_XF86AudioRepeat 0x1008FF98 /* toggle repeat mode */ -#define XKB_KEY_XF86AudioRandomPlay 0x1008FF99 /* toggle shuffle mode */ -#define XKB_KEY_XF86Subtitle 0x1008FF9A /* cycle through subtitle */ -#define XKB_KEY_XF86AudioCycleTrack 0x1008FF9B /* cycle through audio tracks */ -#define XKB_KEY_XF86CycleAngle 0x1008FF9C /* cycle through angles */ -#define XKB_KEY_XF86FrameBack 0x1008FF9D /* video: go one frame back */ -#define XKB_KEY_XF86FrameForward 0x1008FF9E /* video: go one frame forward */ -#define XKB_KEY_XF86Time 0x1008FF9F /* display, or shows an entry for time seeking */ -#define XKB_KEY_XF86Select 0x1008FFA0 /* Select button on joypads and remotes */ -#define XKB_KEY_XF86View 0x1008FFA1 /* Show a view options/properties */ -#define XKB_KEY_XF86TopMenu 0x1008FFA2 /* Go to a top-level menu in a video */ - -#define XKB_KEY_XF86Red 0x1008FFA3 /* Red button */ -#define XKB_KEY_XF86Green 0x1008FFA4 /* Green button */ -#define XKB_KEY_XF86Yellow 0x1008FFA5 /* Yellow button */ -#define XKB_KEY_XF86Blue 0x1008FFA6 /* Blue button */ - -#define XKB_KEY_XF86Suspend 0x1008FFA7 /* Sleep to RAM */ -#define XKB_KEY_XF86Hibernate 0x1008FFA8 /* Sleep to disk */ -#define XKB_KEY_XF86TouchpadToggle 0x1008FFA9 /* Toggle between touchpad/trackstick */ -#define XKB_KEY_XF86TouchpadOn 0x1008FFB0 /* The touchpad got switched on */ -#define XKB_KEY_XF86TouchpadOff 0x1008FFB1 /* The touchpad got switched off */ - -#define XKB_KEY_XF86AudioMicMute 0x1008FFB2 /* Mute the Mic from the system */ - -#define XKB_KEY_XF86Keyboard 0x1008FFB3 /* User defined keyboard related action */ - -#define XKB_KEY_XF86WWAN 0x1008FFB4 /* Toggle WWAN (LTE, UMTS, etc.) radio */ -#define XKB_KEY_XF86RFKill 0x1008FFB5 /* Toggle radios on/off */ - -#define XKB_KEY_XF86AudioPreset 0x1008FFB6 /* Select equalizer preset, e.g. theatre-mode */ - -#define XKB_KEY_XF86RotationLockToggle 0x1008FFB7 /* Toggle screen rotation lock on/off */ - -#define XKB_KEY_XF86FullScreen 0x1008FFB8 /* Toggle fullscreen */ - -/* Keys for special action keys (hot keys) */ -/* Virtual terminals on some operating systems */ -#define XKB_KEY_XF86Switch_VT_1 0x1008FE01 -#define XKB_KEY_XF86Switch_VT_2 0x1008FE02 -#define XKB_KEY_XF86Switch_VT_3 0x1008FE03 -#define XKB_KEY_XF86Switch_VT_4 0x1008FE04 -#define XKB_KEY_XF86Switch_VT_5 0x1008FE05 -#define XKB_KEY_XF86Switch_VT_6 0x1008FE06 -#define XKB_KEY_XF86Switch_VT_7 0x1008FE07 -#define XKB_KEY_XF86Switch_VT_8 0x1008FE08 -#define XKB_KEY_XF86Switch_VT_9 0x1008FE09 -#define XKB_KEY_XF86Switch_VT_10 0x1008FE0A -#define XKB_KEY_XF86Switch_VT_11 0x1008FE0B -#define XKB_KEY_XF86Switch_VT_12 0x1008FE0C - -#define XKB_KEY_XF86Ungrab 0x1008FE20 /* force ungrab */ -#define XKB_KEY_XF86ClearGrab 0x1008FE21 /* kill application with grab */ -#define XKB_KEY_XF86Next_VMode 0x1008FE22 /* next video mode available */ -#define XKB_KEY_XF86Prev_VMode 0x1008FE23 /* prev. video mode available */ -#define XKB_KEY_XF86LogWindowTree 0x1008FE24 /* print window tree to log */ -#define XKB_KEY_XF86LogGrabInfo 0x1008FE25 /* print all active grabs to log */ -/* - * Copyright (c) 1991, Oracle and/or its affiliates. All rights reserved. - * - * 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. - */ -/************************************************************ - -Copyright 1991, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice 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 -OPEN GROUP 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. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - -***********************************************************/ - -/* - * Floating Accent - */ - -#define XKB_KEY_SunFA_Grave 0x1005FF00 -#define XKB_KEY_SunFA_Circum 0x1005FF01 -#define XKB_KEY_SunFA_Tilde 0x1005FF02 -#define XKB_KEY_SunFA_Acute 0x1005FF03 -#define XKB_KEY_SunFA_Diaeresis 0x1005FF04 -#define XKB_KEY_SunFA_Cedilla 0x1005FF05 - -/* - * Miscellaneous Functions - */ - -#define XKB_KEY_SunF36 0x1005FF10 /* Labeled F11 */ -#define XKB_KEY_SunF37 0x1005FF11 /* Labeled F12 */ - -#define XKB_KEY_SunSys_Req 0x1005FF60 -#define XKB_KEY_SunPrint_Screen 0x0000FF61 /* Same as XK_Print */ - -/* - * International & Multi-Key Character Composition - */ - -#define XKB_KEY_SunCompose 0x0000FF20 /* Same as XK_Multi_key */ -#define XKB_KEY_SunAltGraph 0x0000FF7E /* Same as XK_Mode_switch */ - -/* - * Cursor Control - */ - -#define XKB_KEY_SunPageUp 0x0000FF55 /* Same as XK_Prior */ -#define XKB_KEY_SunPageDown 0x0000FF56 /* Same as XK_Next */ - -/* - * Open Look Functions - */ - -#define XKB_KEY_SunUndo 0x0000FF65 /* Same as XK_Undo */ -#define XKB_KEY_SunAgain 0x0000FF66 /* Same as XK_Redo */ -#define XKB_KEY_SunFind 0x0000FF68 /* Same as XK_Find */ -#define XKB_KEY_SunStop 0x0000FF69 /* Same as XK_Cancel */ -#define XKB_KEY_SunProps 0x1005FF70 -#define XKB_KEY_SunFront 0x1005FF71 -#define XKB_KEY_SunCopy 0x1005FF72 -#define XKB_KEY_SunOpen 0x1005FF73 -#define XKB_KEY_SunPaste 0x1005FF74 -#define XKB_KEY_SunCut 0x1005FF75 - -#define XKB_KEY_SunPowerSwitch 0x1005FF76 -#define XKB_KEY_SunAudioLowerVolume 0x1005FF77 -#define XKB_KEY_SunAudioMute 0x1005FF78 -#define XKB_KEY_SunAudioRaiseVolume 0x1005FF79 -#define XKB_KEY_SunVideoDegauss 0x1005FF7A -#define XKB_KEY_SunVideoLowerBrightness 0x1005FF7B -#define XKB_KEY_SunVideoRaiseBrightness 0x1005FF7C -#define XKB_KEY_SunPowerSwitchShift 0x1005FF7D -/*********************************************************** - -Copyright 1988, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice 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 -OPEN GROUP 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. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - - -Copyright 1988 by Digital Equipment Corporation, Maynard, Massachusetts. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Digital not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -******************************************************************/ - -/* - * DEC private keysyms - * (29th bit set) - */ - -/* two-key compose sequence initiators, chosen to map to Latin1 characters */ - -#define XKB_KEY_Dring_accent 0x1000FEB0 -#define XKB_KEY_Dcircumflex_accent 0x1000FE5E -#define XKB_KEY_Dcedilla_accent 0x1000FE2C -#define XKB_KEY_Dacute_accent 0x1000FE27 -#define XKB_KEY_Dgrave_accent 0x1000FE60 -#define XKB_KEY_Dtilde 0x1000FE7E -#define XKB_KEY_Ddiaeresis 0x1000FE22 - -/* special keysym for LK2** "Remove" key on editing keypad */ - -#define XKB_KEY_DRemove 0x1000FF00 /* Remove */ -/* - -Copyright 1987, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice 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 OPEN GROUP 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. - -Except as contained in this notice, the name of The Open Group shall -not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization -from The Open Group. - -Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the names of Hewlett Packard -or Digital not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -HEWLETT-PACKARD MAKES NO WARRANTY OF ANY KIND WITH REGARD -TO THIS SOFWARE, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. Hewlett-Packard shall not be liable for errors -contained herein or direct, indirect, special, incidental or -consequential damages in connection with the furnishing, -performance, or use of this material. - -*/ - - - -#define XKB_KEY_hpClearLine 0x1000FF6F -#define XKB_KEY_hpInsertLine 0x1000FF70 -#define XKB_KEY_hpDeleteLine 0x1000FF71 -#define XKB_KEY_hpInsertChar 0x1000FF72 -#define XKB_KEY_hpDeleteChar 0x1000FF73 -#define XKB_KEY_hpBackTab 0x1000FF74 -#define XKB_KEY_hpKP_BackTab 0x1000FF75 -#define XKB_KEY_hpModelock1 0x1000FF48 -#define XKB_KEY_hpModelock2 0x1000FF49 -#define XKB_KEY_hpReset 0x1000FF6C -#define XKB_KEY_hpSystem 0x1000FF6D -#define XKB_KEY_hpUser 0x1000FF6E -#define XKB_KEY_hpmute_acute 0x100000A8 -#define XKB_KEY_hpmute_grave 0x100000A9 -#define XKB_KEY_hpmute_asciicircum 0x100000AA -#define XKB_KEY_hpmute_diaeresis 0x100000AB -#define XKB_KEY_hpmute_asciitilde 0x100000AC -#define XKB_KEY_hplira 0x100000AF -#define XKB_KEY_hpguilder 0x100000BE -#define XKB_KEY_hpYdiaeresis 0x100000EE -#define XKB_KEY_hpIO 0x100000EE -#define XKB_KEY_hplongminus 0x100000F6 -#define XKB_KEY_hpblock 0x100000FC - - - -#define XKB_KEY_osfCopy 0x1004FF02 -#define XKB_KEY_osfCut 0x1004FF03 -#define XKB_KEY_osfPaste 0x1004FF04 -#define XKB_KEY_osfBackTab 0x1004FF07 -#define XKB_KEY_osfBackSpace 0x1004FF08 -#define XKB_KEY_osfClear 0x1004FF0B -#define XKB_KEY_osfEscape 0x1004FF1B -#define XKB_KEY_osfAddMode 0x1004FF31 -#define XKB_KEY_osfPrimaryPaste 0x1004FF32 -#define XKB_KEY_osfQuickPaste 0x1004FF33 -#define XKB_KEY_osfPageLeft 0x1004FF40 -#define XKB_KEY_osfPageUp 0x1004FF41 -#define XKB_KEY_osfPageDown 0x1004FF42 -#define XKB_KEY_osfPageRight 0x1004FF43 -#define XKB_KEY_osfActivate 0x1004FF44 -#define XKB_KEY_osfMenuBar 0x1004FF45 -#define XKB_KEY_osfLeft 0x1004FF51 -#define XKB_KEY_osfUp 0x1004FF52 -#define XKB_KEY_osfRight 0x1004FF53 -#define XKB_KEY_osfDown 0x1004FF54 -#define XKB_KEY_osfEndLine 0x1004FF57 -#define XKB_KEY_osfBeginLine 0x1004FF58 -#define XKB_KEY_osfEndData 0x1004FF59 -#define XKB_KEY_osfBeginData 0x1004FF5A -#define XKB_KEY_osfPrevMenu 0x1004FF5B -#define XKB_KEY_osfNextMenu 0x1004FF5C -#define XKB_KEY_osfPrevField 0x1004FF5D -#define XKB_KEY_osfNextField 0x1004FF5E -#define XKB_KEY_osfSelect 0x1004FF60 -#define XKB_KEY_osfInsert 0x1004FF63 -#define XKB_KEY_osfUndo 0x1004FF65 -#define XKB_KEY_osfMenu 0x1004FF67 -#define XKB_KEY_osfCancel 0x1004FF69 -#define XKB_KEY_osfHelp 0x1004FF6A -#define XKB_KEY_osfSelectAll 0x1004FF71 -#define XKB_KEY_osfDeselectAll 0x1004FF72 -#define XKB_KEY_osfReselect 0x1004FF73 -#define XKB_KEY_osfExtend 0x1004FF74 -#define XKB_KEY_osfRestore 0x1004FF78 -#define XKB_KEY_osfDelete 0x1004FFFF - - - -/************************************************************** - * The use of the following macros is deprecated. - * They are listed below only for backwards compatibility. - */ -#define XKB_KEY_Reset 0x1000FF6C -#define XKB_KEY_System 0x1000FF6D -#define XKB_KEY_User 0x1000FF6E -#define XKB_KEY_ClearLine 0x1000FF6F -#define XKB_KEY_InsertLine 0x1000FF70 -#define XKB_KEY_DeleteLine 0x1000FF71 -#define XKB_KEY_InsertChar 0x1000FF72 -#define XKB_KEY_DeleteChar 0x1000FF73 -#define XKB_KEY_BackTab 0x1000FF74 -#define XKB_KEY_KP_BackTab 0x1000FF75 -#define XKB_KEY_Ext16bit_L 0x1000FF76 -#define XKB_KEY_Ext16bit_R 0x1000FF77 -#define XKB_KEY_mute_acute 0x100000a8 -#define XKB_KEY_mute_grave 0x100000a9 -#define XKB_KEY_mute_asciicircum 0x100000aa -#define XKB_KEY_mute_diaeresis 0x100000ab -#define XKB_KEY_mute_asciitilde 0x100000ac -#define XKB_KEY_lira 0x100000af -#define XKB_KEY_guilder 0x100000be -#define XKB_KEY_IO 0x100000ee -#define XKB_KEY_longminus 0x100000f6 -#define XKB_KEY_block 0x100000fc - - - -#endif diff --git a/xkbcommon/xkbcommon-names.h b/xkbcommon/xkbcommon-names.h deleted file mode 100644 index ecb551f..0000000 --- a/xkbcommon/xkbcommon-names.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * - * 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. - * - * Author: Daniel Stone - */ - -#ifndef _XKBCOMMON_NAMES_H -#define _XKBCOMMON_NAMES_H - -/** - * @file - * @brief Predefined names for common modifiers and LEDs. - */ - -#define XKB_MOD_NAME_SHIFT "Shift" -#define XKB_MOD_NAME_CAPS "Lock" -#define XKB_MOD_NAME_CTRL "Control" -#define XKB_MOD_NAME_ALT "Mod1" -#define XKB_MOD_NAME_NUM "Mod2" -#define XKB_MOD_NAME_LOGO "Mod4" - -#define XKB_LED_NAME_CAPS "Caps Lock" -#define XKB_LED_NAME_NUM "Num Lock" -#define XKB_LED_NAME_SCROLL "Scroll Lock" - -#endif diff --git a/xkbcommon/xkbcommon-x11.h b/xkbcommon/xkbcommon-x11.h deleted file mode 100644 index 4eb716a..0000000 --- a/xkbcommon/xkbcommon-x11.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright © 2013 Ran Benita - * - * 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. - */ - -#ifndef _XKBCOMMON_X11_H -#define _XKBCOMMON_X11_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @file - * libxkbcommon-x11 API - Additional X11 support for xkbcommon. - */ - -/** - * @defgroup x11 X11 support - * Additional X11 support for xkbcommon. - * @since 0.4.0 - * - * @{ - */ - -/** - * @page x11-overview Overview - * @parblock - * - * The xkbcommon-x11 module provides a means for creating an xkb_keymap - * corresponding to the currently active keymap on the X server. To do - * so, it queries the XKB X11 extension using the xcb-xkb library. It - * can be used as a replacement for Xlib's keyboard handling. - * - * Following is an example workflow using xkbcommon-x11. A complete - * example may be found in the tools/interactive-x11.c file in the - * xkbcommon source repository. On startup: - * - * 1. Connect to the X server using xcb_connect(). - * 2. Setup the XKB X11 extension. You can do this either by using the - * xcb_xkb_use_extension() request directly, or by using the - * xkb_x11_setup_xkb_extension() helper function. - * - * The XKB extension supports using separate keymaps and states for - * different keyboard devices. The devices are identified by an integer - * device ID and are managed by another X11 extension, XInput. The - * original X11 protocol only had one keyboard device, called the "core - * keyboard", which is still supported as a "virtual device". - * - * 3. We will use the core keyboard as an example. To get its device ID, - * use either the xcb_xkb_get_device_info() request directly, or the - * xkb_x11_get_core_keyboard_device_id() helper function. - * 4. Create an initial xkb_keymap for this device, using the - * xkb_x11_keymap_new_from_device() function. - * 5. Create an initial xkb_state for this device, using the - * xkb_x11_state_new_from_device() function. - * - * @note At this point, you may consider setting various XKB controls and - * XKB per-client flags. For example, enabling detectable autorepeat: \n - * https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Detectable_Autorepeat - * - * Next, you need to react to state changes (e.g. a modifier was pressed, - * the layout was changed) and to keymap changes (e.g. a tool like xkbcomp, - * setxkbmap or xmodmap was used): - * - * 6. Select to listen to at least the following XKB events: - * NewKeyboardNotify, MapNotify, StateNotify; using the - * xcb_xkb_select_events_aux() request. - * 7. When NewKeyboardNotify or MapNotify are received, recreate the - * xkb_keymap and xkb_state as described above. - * 8. When StateNotify is received, update the xkb_state accordingly - * using the xkb_state_update_mask() function. - * - * @note It is also possible to use the KeyPress/KeyRelease @p state - * field to find the effective modifier and layout state, instead of - * using XkbStateNotify: \n - * https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Computing_A_State_Field_from_an_XKB_State - * \n However, XkbStateNotify is more accurate. - * - * @note There is no need to call xkb_state_update_key(); the state is - * already synchronized. - * - * Finally, when a key event is received, you can use ordinary xkbcommon - * functions, like xkb_state_key_get_one_sym() and xkb_state_key_get_utf8(), - * as you normally would. - * - * @endparblock - */ - -/** - * The minimal compatible major version of the XKB X11 extension which - * this library can use. - */ -#define XKB_X11_MIN_MAJOR_XKB_VERSION 1 -/** - * The minimal compatible minor version of the XKB X11 extension which - * this library can use (for the minimal major version). - */ -#define XKB_X11_MIN_MINOR_XKB_VERSION 0 - -/** Flags for the xkb_x11_setup_xkb_extension() function. */ -enum xkb_x11_setup_xkb_extension_flags { - /** Do not apply any flags. */ - XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS = 0 -}; - -/** - * Setup the XKB X11 extension for this X client. - * - * The xkbcommon-x11 library uses various XKB requests. Before doing so, - * an X client must notify the server that it will be using the extension. - * This function (or an XCB equivalent) must be called before any other - * function in this library is used. - * - * Some X servers may not support or disable the XKB extension. If you - * want to support such servers, you need to use a different fallback. - * - * You may call this function several times; it is idempotent. - * - * @param connection - * An XCB connection to the X server. - * @param major_xkb_version - * See @p minor_xkb_version. - * @param minor_xkb_version - * The XKB extension version to request. To operate correctly, you - * must have (major_xkb_version, minor_xkb_version) >= - * (XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION), - * though this is not enforced. - * @param flags - * Optional flags, or 0. - * @param[out] major_xkb_version_out - * See @p minor_xkb_version_out. - * @param[out] minor_xkb_version_out - * Backfilled with the compatible XKB extension version numbers picked - * by the server. Can be NULL. - * @param[out] base_event_out - * Backfilled with the XKB base (also known as first) event code, needed - * to distinguish XKB events. Can be NULL. - * @param[out] base_error_out - * Backfilled with the XKB base (also known as first) error code, needed - * to distinguish XKB errors. Can be NULL. - * - * @returns 1 on success, or 0 on failure. - */ -int -xkb_x11_setup_xkb_extension(xcb_connection_t *connection, - uint16_t major_xkb_version, - uint16_t minor_xkb_version, - enum xkb_x11_setup_xkb_extension_flags flags, - uint16_t *major_xkb_version_out, - uint16_t *minor_xkb_version_out, - uint8_t *base_event_out, - uint8_t *base_error_out); - -/** - * Get the keyboard device ID of the core X11 keyboard. - * - * @param connection An XCB connection to the X server. - * - * @returns A device ID which may be used with other xkb_x11_* functions, - * or -1 on failure. - */ -int32_t -xkb_x11_get_core_keyboard_device_id(xcb_connection_t *connection); - -/** - * Create a keymap from an X11 keyboard device. - * - * This function queries the X server with various requests, fetches the - * details of the active keymap on a keyboard device, and creates an - * xkb_keymap from these details. - * - * @param context - * The context in which to create the keymap. - * @param connection - * An XCB connection to the X server. - * @param device_id - * An XInput device ID (in the range 0-127) with input class KEY. - * Passing values outside of this range is an error (the XKB protocol - * predates the XInput2 protocol, which first allowed IDs > 127). - * @param flags - * Optional flags for the keymap, or 0. - * - * @returns A keymap retrieved from the X server, or NULL on failure. - * - * @memberof xkb_keymap - */ -struct xkb_keymap * -xkb_x11_keymap_new_from_device(struct xkb_context *context, - xcb_connection_t *connection, - int32_t device_id, - enum xkb_keymap_compile_flags flags); - -/** - * Create a new keyboard state object from an X11 keyboard device. - * - * This function is the same as xkb_state_new(), only pre-initialized - * with the state of the device at the time this function is called. - * - * @param keymap - * The keymap for which to create the state. - * @param connection - * An XCB connection to the X server. - * @param device_id - * An XInput 1 device ID (in the range 0-255) with input class KEY. - * Passing values outside of this range is an error. - * - * @returns A new keyboard state object, or NULL on failure. - * - * @memberof xkb_state - */ -struct xkb_state * -xkb_x11_state_new_from_device(struct xkb_keymap *keymap, - xcb_connection_t *connection, - int32_t device_id); - -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* _XKBCOMMON_X11_H */ diff --git a/xkbcommon/xkbcommon.h b/xkbcommon/xkbcommon.h deleted file mode 100644 index ee7143c..0000000 --- a/xkbcommon/xkbcommon.h +++ /dev/null @@ -1,1951 +0,0 @@ -/* - * Copyright 1985, 1987, 1990, 1998 The Open Group - * Copyright 2008 Dan Nicholson - * - * 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 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 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. - * - * Except as contained in this notice, the names of the authors or their - * institutions shall not be used in advertising or otherwise to promote the - * sale, use or other dealings in this Software without prior written - * authorization from the authors. - */ - -/************************************************************ - * Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2009-2012 Daniel Stone - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita - * - * 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. - * - * Author: Daniel Stone - */ - -#ifndef _XKBCOMMON_H_ -#define _XKBCOMMON_H_ - -#include -#include -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @file - * Main libxkbcommon API. - */ - -/** - * @struct xkb_context - * Opaque top level library context object. - * - * The context contains various general library data and state, like - * logging level and include paths. - * - * Objects are created in a specific context, and multiple contexts may - * coexist simultaneously. Objects from different contexts are completely - * separated and do not share any memory or state. - */ -struct xkb_context; - -/** - * @struct xkb_keymap - * Opaque compiled keymap object. - * - * The keymap object holds all of the static keyboard information obtained - * from compiling XKB files. - * - * A keymap is immutable after it is created (besides reference counts, etc.); - * if you need to change it, you must create a new one. - */ -struct xkb_keymap; - -/** - * @struct xkb_state - * Opaque keyboard state object. - * - * State objects contain the active state of a keyboard (or keyboards), such - * as the currently effective layout and the active modifiers. It acts as a - * simple state machine, wherein key presses and releases are the input, and - * key symbols (keysyms) are the output. - */ -struct xkb_state; - -/** - * A number used to represent a physical key on a keyboard. - * - * A standard PC-compatible keyboard might have 102 keys. An appropriate - * keymap would assign each of them a keycode, by which the user should - * refer to the key throughout the library. - * - * Historically, the X11 protocol, and consequentially the XKB protocol, - * assign only 8 bits for keycodes. This limits the number of different - * keys that can be used simultaneously in a single keymap to 256 - * (disregarding other limitations). This library does not share this limit; - * keycodes beyond 255 ('extended keycodes') are not treated specially. - * Keymaps and applications which are compatible with X11 should not use - * these keycodes. - * - * The values of specific keycodes are determined by the keymap and the - * underlying input system. For example, with an X11-compatible keymap - * and Linux evdev scan codes (see linux/input.h), a fixed offset is used: - * - * The keymap defines a canonical name for each key, plus possible aliases. - * Historically, the XKB protocol restricts these names to at most 4 (ASCII) - * characters, but this library does not share this limit. - * - * @code - * xkb_keycode_t keycode_A = KEY_A + 8; - * @endcode - * - * @sa xkb_keycode_is_legal_ext() xkb_keycode_is_legal_x11() - */ -typedef uint32_t xkb_keycode_t; - -/** - * A number used to represent the symbols generated from a key on a keyboard. - * - * A key, represented by a keycode, may generate different symbols according - * to keyboard state. For example, on a QWERTY keyboard, pressing the key - * labled \ generates the symbol 'a'. If the Shift key is held, it - * generates the symbol 'A'. If a different layout is used, say Greek, - * it generates the symbol 'α'. And so on. - * - * Each such symbol is represented by a keysym. Note that keysyms are - * somewhat more general, in that they can also represent some "function", - * such as "Left" or "Right" for the arrow keys. For more information, - * see: - * https://www.x.org/releases/current/doc/xproto/x11protocol.html#keysym_encoding - * - * Specifically named keysyms can be found in the - * xkbcommon/xkbcommon-keysyms.h header file. Their name does not include - * the XKB_KEY_ prefix. - * - * Besides those, any Unicode/ISO 10646 character in the range U0100 to - * U10FFFF can be represented by a keysym value in the range 0x01000100 to - * 0x0110FFFF. The name of Unicode keysyms is "U", e.g. "UA1B2". - * - * The name of other unnamed keysyms is the hexadecimal representation of - * their value, e.g. "0xabcd1234". - * - * Keysym names are case-sensitive. - */ -typedef uint32_t xkb_keysym_t; - -/** - * Index of a keyboard layout. - * - * The layout index is a state component which detemines which keyboard - * layout is active. These may be different alphabets, different key - * arrangements, etc. - * - * Layout indices are consecutive. The first layout has index 0. - * - * Each layout is not required to have a name, and the names are not - * guaranteed to be unique (though they are usually provided and unique). - * Therefore, it is not safe to use the name as a unique identifier for a - * layout. Layout names are case-sensitive. - * - * Layout names are specified in the layout's definition, for example - * "English (US)". These are different from the (conventionally) short names - * which are used to locate the layout, for example "us" or "us(intl)". These - * names are not present in a compiled keymap. - * - * If the user selects layouts from a list generated from the XKB registry - * (using libxkbregistry or directly), and this metadata is needed later on, it - * is recommended to store it along with the keymap. - * - * Layouts are also called "groups" by XKB. - * - * @sa xkb_keymap_num_layouts() xkb_keymap_num_layouts_for_key() - */ -typedef uint32_t xkb_layout_index_t; -/** A mask of layout indices. */ -typedef uint32_t xkb_layout_mask_t; - -/** - * Index of a shift level. - * - * Any key, in any layout, can have several shift levels. Each - * shift level can assign different keysyms to the key. The shift level - * to use is chosen according to the current keyboard state; for example, - * if no keys are pressed, the first level may be used; if the Left Shift - * key is pressed, the second; if Num Lock is pressed, the third; and - * many such combinations are possible (see xkb_mod_index_t). - * - * Level indices are consecutive. The first level has index 0. - */ -typedef uint32_t xkb_level_index_t; - -/** - * Index of a modifier. - * - * A @e modifier is a state component which changes the way keys are - * interpreted. A keymap defines a set of modifiers, such as Alt, Shift, - * Num Lock or Meta, and specifies which keys may @e activate which - * modifiers (in a many-to-many relationship, i.e. a key can activate - * several modifiers, and a modifier may be activated by several keys. - * Different keymaps do this differently). - * - * When retrieving the keysyms for a key, the active modifier set is - * consulted; this detemines the correct shift level to use within the - * currently active layout (see xkb_level_index_t). - * - * Modifier indices are consecutive. The first modifier has index 0. - * - * Each modifier must have a name, and the names are unique. Therefore, it - * is safe to use the name as a unique identifier for a modifier. The names - * of some common modifiers are provided in the xkbcommon/xkbcommon-names.h - * header file. Modifier names are case-sensitive. - * - * @sa xkb_keymap_num_mods() - */ -typedef uint32_t xkb_mod_index_t; -/** A mask of modifier indices. */ -typedef uint32_t xkb_mod_mask_t; - -/** - * Index of a keyboard LED. - * - * LEDs are logical objects which may be @e active or @e inactive. They - * typically correspond to the lights on the keyboard. Their state is - * determined by the current keyboard state. - * - * LED indices are non-consecutive. The first LED has index 0. - * - * Each LED must have a name, and the names are unique. Therefore, - * it is safe to use the name as a unique identifier for a LED. The names - * of some common LEDs are provided in the xkbcommon/xkbcommon-names.h - * header file. LED names are case-sensitive. - * - * @warning A given keymap may specify an exact index for a given LED. - * Therefore, LED indexing is not necessarily sequential, as opposed to - * modifiers and layouts. This means that when iterating over the LEDs - * in a keymap using e.g. xkb_keymap_num_leds(), some indices might be - * invalid. Given such an index, functions like xkb_keymap_led_get_name() - * will return NULL, and xkb_state_led_index_is_active() will return -1. - * - * LEDs are also called "indicators" by XKB. - * - * @sa xkb_keymap_num_leds() - */ -typedef uint32_t xkb_led_index_t; -/** A mask of LED indices. */ -typedef uint32_t xkb_led_mask_t; - -#define XKB_KEYCODE_INVALID (0xffffffff) -#define XKB_LAYOUT_INVALID (0xffffffff) -#define XKB_LEVEL_INVALID (0xffffffff) -#define XKB_MOD_INVALID (0xffffffff) -#define XKB_LED_INVALID (0xffffffff) - -#define XKB_KEYCODE_MAX (0xffffffff - 1) - -/** - * Test whether a value is a valid extended keycode. - * @sa xkb_keycode_t - **/ -#define xkb_keycode_is_legal_ext(key) (key <= XKB_KEYCODE_MAX) - -/** - * Test whether a value is a valid X11 keycode. - * @sa xkb_keycode_t - */ -#define xkb_keycode_is_legal_x11(key) (key >= 8 && key <= 255) - -/** - * Names to compile a keymap with, also known as RMLVO. - * - * The names are the common configuration values by which a user picks - * a keymap. - * - * If the entire struct is NULL, then each field is taken to be NULL. - * You should prefer passing NULL instead of choosing your own defaults. - */ -struct xkb_rule_names { - /** - * The rules file to use. The rules file describes how to interpret - * the values of the model, layout, variant and options fields. - * - * If NULL or the empty string "", a default value is used. - * If the XKB_DEFAULT_RULES environment variable is set, it is used - * as the default. Otherwise the system default is used. - */ - const char *rules; - /** - * The keyboard model by which to interpret keycodes and LEDs. - * - * If NULL or the empty string "", a default value is used. - * If the XKB_DEFAULT_MODEL environment variable is set, it is used - * as the default. Otherwise the system default is used. - */ - const char *model; - /** - * A comma separated list of layouts (languages) to include in the - * keymap. - * - * If NULL or the empty string "", a default value is used. - * If the XKB_DEFAULT_LAYOUT environment variable is set, it is used - * as the default. Otherwise the system default is used. - */ - const char *layout; - /** - * A comma separated list of variants, one per layout, which may - * modify or augment the respective layout in various ways. - * - * If NULL or the empty string "", and a default value is also used - * for the layout, a default value is used. Otherwise no variant is - * used. - * If the XKB_DEFAULT_VARIANT environment variable is set, it is used - * as the default. Otherwise the system default is used. - */ - const char *variant; - /** - * A comma separated list of options, through which the user specifies - * non-layout related preferences, like which key combinations are used - * for switching layouts, or which key is the Compose key. - * - * If NULL, a default value is used. If the empty string "", no - * options are used. - * If the XKB_DEFAULT_OPTIONS environment variable is set, it is used - * as the default. Otherwise the system default is used. - */ - const char *options; -}; - -/** - * @defgroup keysyms Keysyms - * Utility functions related to keysyms. - * - * @{ - */ - -/** - * @page keysym-transformations Keysym Transformations - * - * Keysym translation is subject to several "keysym transformations", - * as described in the XKB specification. These are: - * - * - Capitalization transformation. If the Caps Lock modifier is - * active and was not consumed by the translation process, a single - * keysym is transformed to its upper-case form (if applicable). - * Similarly, the UTF-8/UTF-32 string produced is capitalized. - * - * This is described in: - * https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Lock_Modifier - * - * - Control transformation. If the Control modifier is active and - * was not consumed by the translation process, the string produced - * is transformed to its matching ASCII control character (if - * applicable). Keysyms are not affected. - * - * This is described in: - * https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Control_Modifier - * - * Each relevant function discusses which transformations it performs. - * - * These transformations are not applicable when a key produces multiple - * keysyms. - */ - - -/** - * Get the name of a keysym. - * - * For a description of how keysyms are named, see @ref xkb_keysym_t. - * - * @param[in] keysym The keysym. - * @param[out] buffer A string buffer to write the name into. - * @param[in] size Size of the buffer. - * - * @warning If the buffer passed is too small, the string is truncated - * (though still NUL-terminated); a size of at least 64 bytes is recommended. - * - * @returns The number of bytes in the name, excluding the NUL byte. If - * the keysym is invalid, returns -1. - * - * You may check if truncation has occurred by comparing the return value - * with the length of buffer, similarly to the snprintf(3) function. - * - * @sa xkb_keysym_t - */ -int -xkb_keysym_get_name(xkb_keysym_t keysym, char *buffer, size_t size); - -/** Flags for xkb_keysym_from_name(). */ -enum xkb_keysym_flags { - /** Do not apply any flags. */ - XKB_KEYSYM_NO_FLAGS = 0, - /** Find keysym by case-insensitive search. */ - XKB_KEYSYM_CASE_INSENSITIVE = (1 << 0) -}; - -/** - * Get a keysym from its name. - * - * @param name The name of a keysym. See remarks in xkb_keysym_get_name(); - * this function will accept any name returned by that function. - * @param flags A set of flags controlling how the search is done. If - * invalid flags are passed, this will fail with XKB_KEY_NoSymbol. - * - * If you use the XKB_KEYSYM_CASE_INSENSITIVE flag and two keysym names - * differ only by case, then the lower-case keysym is returned. For - * instance, for KEY_a and KEY_A, this function would return KEY_a for the - * case-insensitive search. If this functionality is needed, it is - * recommended to first call this function without this flag; and if that - * fails, only then to try with this flag, while possibly warning the user - * he had misspelled the name, and might get wrong results. - * - * Case folding is done according to the C locale; the current locale is not - * consulted. - * - * @returns The keysym. If the name is invalid, returns XKB_KEY_NoSymbol. - * - * @sa xkb_keysym_t - */ -xkb_keysym_t -xkb_keysym_from_name(const char *name, enum xkb_keysym_flags flags); - -/** - * Get the Unicode/UTF-8 representation of a keysym. - * - * @param[in] keysym The keysym. - * @param[out] buffer A buffer to write the UTF-8 string into. - * @param[in] size The size of buffer. Must be at least 7. - * - * @returns The number of bytes written to the buffer (including the - * terminating byte). If the keysym does not have a Unicode - * representation, returns 0. If the buffer is too small, returns -1. - * - * This function does not perform any @ref keysym-transformations. - * Therefore, prefer to use xkb_state_key_get_utf8() if possible. - * - * @sa xkb_state_key_get_utf8() - */ -int -xkb_keysym_to_utf8(xkb_keysym_t keysym, char *buffer, size_t size); - -/** - * Get the Unicode/UTF-32 representation of a keysym. - * - * @returns The Unicode/UTF-32 representation of keysym, which is also - * compatible with UCS-4. If the keysym does not have a Unicode - * representation, returns 0. - * - * This function does not perform any @ref keysym-transformations. - * Therefore, prefer to use xkb_state_key_get_utf32() if possible. - * - * @sa xkb_state_key_get_utf32() - */ -uint32_t -xkb_keysym_to_utf32(xkb_keysym_t keysym); - -/** - * Get the keysym corresponding to a Unicode/UTF-32 codepoint. - * - * @returns The keysym corresponding to the specified Unicode - * codepoint, or XKB_KEY_NoSymbol if there is none. - * - * This function is the inverse of @ref xkb_keysym_to_utf32. In cases - * where a single codepoint corresponds to multiple keysyms, returns - * the keysym with the lowest value. - * - * Unicode codepoints which do not have a special (legacy) keysym - * encoding use a direct encoding scheme. These keysyms don't usually - * have an associated keysym constant (XKB_KEY_*). - * - * For noncharacter Unicode codepoints and codepoints outside of the - * defined Unicode planes this function returns XKB_KEY_NoSymbol. - * - * @sa xkb_keysym_to_utf32() - * @since 1.0.0 - */ -xkb_keysym_t -xkb_utf32_to_keysym(uint32_t ucs); - -/** - * Convert a keysym to its uppercase form. - * - * If there is no such form, the keysym is returned unchanged. - * - * The conversion rules may be incomplete; prefer to work with the Unicode - * representation instead, when possible. - */ -xkb_keysym_t -xkb_keysym_to_upper(xkb_keysym_t ks); - -/** - * Convert a keysym to its lowercase form. - * - * The conversion rules may be incomplete; prefer to work with the Unicode - * representation instead, when possible. - */ -xkb_keysym_t -xkb_keysym_to_lower(xkb_keysym_t ks); - -/** @} */ - -/** - * @defgroup context Library Context - * Creating, destroying and using library contexts. - * - * Every keymap compilation request must have a context associated with - * it. The context keeps around state such as the include path. - * - * @{ - */ - -/** - * @page envvars Environment Variables - * - * The user may set some environment variables which affect the library: - * - * - `XKB_CONFIG_ROOT`, `XKB_EXTRA_PATH`, `XDG_CONFIG_DIR`, `HOME` - see @ref include-path. - * - `XKB_LOG_LEVEL` - see xkb_context_set_log_level(). - * - `XKB_LOG_VERBOSITY` - see xkb_context_set_log_verbosity(). - * - `XKB_DEFAULT_RULES`, `XKB_DEFAULT_MODEL`, `XKB_DEFAULT_LAYOUT`, - * `XKB_DEFAULT_VARIANT`, `XKB_DEFAULT_OPTIONS` - see xkb_rule_names. - */ - -/** Flags for context creation. */ -enum xkb_context_flags { - /** Do not apply any context flags. */ - XKB_CONTEXT_NO_FLAGS = 0, - /** Create this context with an empty include path. */ - XKB_CONTEXT_NO_DEFAULT_INCLUDES = (1 << 0), - /** - * Don't take RMLVO names from the environment. - * @since 0.3.0 - */ - XKB_CONTEXT_NO_ENVIRONMENT_NAMES = (1 << 1) -}; - -/** - * Create a new context. - * - * @param flags Optional flags for the context, or 0. - * - * @returns A new context, or NULL on failure. - * - * @memberof xkb_context - */ -struct xkb_context * -xkb_context_new(enum xkb_context_flags flags); - -/** - * Take a new reference on a context. - * - * @returns The passed in context. - * - * @memberof xkb_context - */ -struct xkb_context * -xkb_context_ref(struct xkb_context *context); - -/** - * Release a reference on a context, and possibly free it. - * - * @param context The context. If it is NULL, this function does nothing. - * - * @memberof xkb_context - */ -void -xkb_context_unref(struct xkb_context *context); - -/** - * Store custom user data in the context. - * - * This may be useful in conjunction with xkb_context_set_log_fn() or other - * callbacks. - * - * @memberof xkb_context - */ -void -xkb_context_set_user_data(struct xkb_context *context, void *user_data); - -/** - * Retrieves stored user data from the context. - * - * @returns The stored user data. If the user data wasn't set, or the - * passed in context is NULL, returns NULL. - * - * This may be useful to access private user data from callbacks like a - * custom logging function. - * - * @memberof xkb_context - **/ -void * -xkb_context_get_user_data(struct xkb_context *context); - -/** @} */ - -/** - * @defgroup include-path Include Paths - * Manipulating the include paths in a context. - * - * The include paths are the file-system paths that are searched when an - * include statement is encountered during keymap compilation. - * - * The default include paths are, in that lookup order: - * - The path `$XDG_CONFIG_HOME/xkb`, with the usual `XDG_CONFIG_HOME` - * fallback to `$HOME/.config/` if unset. - * - The path `$HOME/.xkb`, where $HOME is the value of the environment - * variable `HOME`. - * - The `XKB_EXTRA_PATH` environment variable, if defined, otherwise the - * system configuration directory, defined at library configuration time - * (usually `/etc/xkb`). - * - The `XKB_CONFIG_ROOT` environment variable, if defined, otherwise - * the system XKB root, defined at library configuration time. - * - * @{ - */ - -/** - * Append a new entry to the context's include path. - * - * @returns 1 on success, or 0 if the include path could not be added or is - * inaccessible. - * - * @memberof xkb_context - */ -int -xkb_context_include_path_append(struct xkb_context *context, const char *path); - -/** - * Append the default include paths to the context's include path. - * - * @returns 1 on success, or 0 if the primary include path could not be added. - * - * @memberof xkb_context - */ -int -xkb_context_include_path_append_default(struct xkb_context *context); - -/** - * Reset the context's include path to the default. - * - * Removes all entries from the context's include path, and inserts the - * default paths. - * - * @returns 1 on success, or 0 if the primary include path could not be added. - * - * @memberof xkb_context - */ -int -xkb_context_include_path_reset_defaults(struct xkb_context *context); - -/** - * Remove all entries from the context's include path. - * - * @memberof xkb_context - */ -void -xkb_context_include_path_clear(struct xkb_context *context); - -/** - * Get the number of paths in the context's include path. - * - * @memberof xkb_context - */ -unsigned int -xkb_context_num_include_paths(struct xkb_context *context); - -/** - * Get a specific include path from the context's include path. - * - * @returns The include path at the specified index. If the index is - * invalid, returns NULL. - * - * @memberof xkb_context - */ -const char * -xkb_context_include_path_get(struct xkb_context *context, unsigned int index); - -/** @} */ - -/** - * @defgroup logging Logging Handling - * Manipulating how logging from this library is handled. - * - * @{ - */ - -/** Specifies a logging level. */ -enum xkb_log_level { - XKB_LOG_LEVEL_CRITICAL = 10, /**< Log critical internal errors only. */ - XKB_LOG_LEVEL_ERROR = 20, /**< Log all errors. */ - XKB_LOG_LEVEL_WARNING = 30, /**< Log warnings and errors. */ - XKB_LOG_LEVEL_INFO = 40, /**< Log information, warnings, and errors. */ - XKB_LOG_LEVEL_DEBUG = 50 /**< Log everything. */ -}; - -/** - * Set the current logging level. - * - * @param context The context in which to set the logging level. - * @param level The logging level to use. Only messages from this level - * and below will be logged. - * - * The default level is XKB_LOG_LEVEL_ERROR. The environment variable - * XKB_LOG_LEVEL, if set in the time the context was created, overrides the - * default value. It may be specified as a level number or name. - * - * @memberof xkb_context - */ -void -xkb_context_set_log_level(struct xkb_context *context, - enum xkb_log_level level); - -/** - * Get the current logging level. - * - * @memberof xkb_context - */ -enum xkb_log_level -xkb_context_get_log_level(struct xkb_context *context); - -/** - * Sets the current logging verbosity. - * - * The library can generate a number of warnings which are not helpful to - * ordinary users of the library. The verbosity may be increased if more - * information is desired (e.g. when developing a new keymap). - * - * The default verbosity is 0. The environment variable XKB_LOG_VERBOSITY, - * if set in the time the context was created, overrides the default value. - * - * @param context The context in which to use the set verbosity. - * @param verbosity The verbosity to use. Currently used values are - * 1 to 10, higher values being more verbose. 0 would result in no verbose - * messages being logged. - * - * Most verbose messages are of level XKB_LOG_LEVEL_WARNING or lower. - * - * @memberof xkb_context - */ -void -xkb_context_set_log_verbosity(struct xkb_context *context, int verbosity); - -/** - * Get the current logging verbosity of the context. - * - * @memberof xkb_context - */ -int -xkb_context_get_log_verbosity(struct xkb_context *context); - -/** - * Set a custom function to handle logging messages. - * - * @param context The context in which to use the set logging function. - * @param log_fn The function that will be called for logging messages. - * Passing NULL restores the default function, which logs to stderr. - * - * By default, log messages from this library are printed to stderr. This - * function allows you to replace the default behavior with a custom - * handler. The handler is only called with messages which match the - * current logging level and verbosity settings for the context. - * level is the logging level of the message. @a format and @a args are - * the same as in the vprintf(3) function. - * - * You may use xkb_context_set_user_data() on the context, and then call - * xkb_context_get_user_data() from within the logging function to provide - * it with additional private context. - * - * @memberof xkb_context - */ -void -xkb_context_set_log_fn(struct xkb_context *context, - void (*log_fn)(struct xkb_context *context, - enum xkb_log_level level, - const char *format, va_list args)); - -/** @} */ - -/** - * @defgroup keymap Keymap Creation - * Creating and destroying keymaps. - * - * @{ - */ - -/** Flags for keymap compilation. */ -enum xkb_keymap_compile_flags { - /** Do not apply any flags. */ - XKB_KEYMAP_COMPILE_NO_FLAGS = 0 -}; - -/** - * Create a keymap from RMLVO names. - * - * The primary keymap entry point: creates a new XKB keymap from a set of - * RMLVO (Rules + Model + Layouts + Variants + Options) names. - * - * @param context The context in which to create the keymap. - * @param names The RMLVO names to use. See xkb_rule_names. - * @param flags Optional flags for the keymap, or 0. - * - * @returns A keymap compiled according to the RMLVO names, or NULL if - * the compilation failed. - * - * @sa xkb_rule_names - * @memberof xkb_keymap - */ -struct xkb_keymap * -xkb_keymap_new_from_names(struct xkb_context *context, - const struct xkb_rule_names *names, - enum xkb_keymap_compile_flags flags); - -/** The possible keymap formats. */ -enum xkb_keymap_format { - /** The current/classic XKB text format, as generated by xkbcomp -xkb. */ - XKB_KEYMAP_FORMAT_TEXT_V1 = 1 -}; - -/** - * Create a keymap from a keymap file. - * - * @param context The context in which to create the keymap. - * @param file The keymap file to compile. - * @param format The text format of the keymap file to compile. - * @param flags Optional flags for the keymap, or 0. - * - * @returns A keymap compiled from the given XKB keymap file, or NULL if - * the compilation failed. - * - * The file must contain a complete keymap. For example, in the - * XKB_KEYMAP_FORMAT_TEXT_V1 format, this means the file must contain one - * top level '%xkb_keymap' section, which in turn contains other required - * sections. - * - * @memberof xkb_keymap - */ -struct xkb_keymap * -xkb_keymap_new_from_file(struct xkb_context *context, FILE *file, - enum xkb_keymap_format format, - enum xkb_keymap_compile_flags flags); - -/** - * Create a keymap from a keymap string. - * - * This is just like xkb_keymap_new_from_file(), but instead of a file, gets - * the keymap as one enormous string. - * - * @see xkb_keymap_new_from_file() - * @memberof xkb_keymap - */ -struct xkb_keymap * -xkb_keymap_new_from_string(struct xkb_context *context, const char *string, - enum xkb_keymap_format format, - enum xkb_keymap_compile_flags flags); - -/** - * Create a keymap from a memory buffer. - * - * This is just like xkb_keymap_new_from_string(), but takes a length argument - * so the input string does not have to be zero-terminated. - * - * @see xkb_keymap_new_from_string() - * @memberof xkb_keymap - * @since 0.3.0 - */ -struct xkb_keymap * -xkb_keymap_new_from_buffer(struct xkb_context *context, const char *buffer, - size_t length, enum xkb_keymap_format format, - enum xkb_keymap_compile_flags flags); - -/** - * Take a new reference on a keymap. - * - * @returns The passed in keymap. - * - * @memberof xkb_keymap - */ -struct xkb_keymap * -xkb_keymap_ref(struct xkb_keymap *keymap); - -/** - * Release a reference on a keymap, and possibly free it. - * - * @param keymap The keymap. If it is NULL, this function does nothing. - * - * @memberof xkb_keymap - */ -void -xkb_keymap_unref(struct xkb_keymap *keymap); - -/** - * Get the keymap as a string in the format from which it was created. - * @sa xkb_keymap_get_as_string() - **/ -#define XKB_KEYMAP_USE_ORIGINAL_FORMAT ((enum xkb_keymap_format) -1) - -/** - * Get the compiled keymap as a string. - * - * @param keymap The keymap to get as a string. - * @param format The keymap format to use for the string. You can pass - * in the special value XKB_KEYMAP_USE_ORIGINAL_FORMAT to use the format - * from which the keymap was originally created. - * - * @returns The keymap as a NUL-terminated string, or NULL if unsuccessful. - * - * The returned string may be fed back into xkb_keymap_new_from_string() to get - * the exact same keymap (possibly in another process, etc.). - * - * The returned string is dynamically allocated and should be freed by the - * caller. - * - * @memberof xkb_keymap - */ -char * -xkb_keymap_get_as_string(struct xkb_keymap *keymap, - enum xkb_keymap_format format); - -/** @} */ - -/** - * @defgroup components Keymap Components - * Enumeration of state components in a keymap. - * - * @{ - */ - -/** - * Get the minimum keycode in the keymap. - * - * @sa xkb_keycode_t - * @memberof xkb_keymap - * @since 0.3.1 - */ -xkb_keycode_t -xkb_keymap_min_keycode(struct xkb_keymap *keymap); - -/** - * Get the maximum keycode in the keymap. - * - * @sa xkb_keycode_t - * @memberof xkb_keymap - * @since 0.3.1 - */ -xkb_keycode_t -xkb_keymap_max_keycode(struct xkb_keymap *keymap); - -/** - * The iterator used by xkb_keymap_key_for_each(). - * - * @sa xkb_keymap_key_for_each - * @memberof xkb_keymap - * @since 0.3.1 - */ -typedef void -(*xkb_keymap_key_iter_t)(struct xkb_keymap *keymap, xkb_keycode_t key, - void *data); - -/** - * Run a specified function for every valid keycode in the keymap. If a - * keymap is sparse, this function may be called fewer than - * (max_keycode - min_keycode + 1) times. - * - * @sa xkb_keymap_min_keycode() xkb_keymap_max_keycode() xkb_keycode_t - * @memberof xkb_keymap - * @since 0.3.1 - */ -void -xkb_keymap_key_for_each(struct xkb_keymap *keymap, xkb_keymap_key_iter_t iter, - void *data); - -/** - * Find the name of the key with the given keycode. - * - * This function always returns the canonical name of the key (see - * description in xkb_keycode_t). - * - * @returns The key name. If no key with this keycode exists, - * returns NULL. - * - * @sa xkb_keycode_t - * @memberof xkb_keymap - * @since 0.6.0 - */ -const char * -xkb_keymap_key_get_name(struct xkb_keymap *keymap, xkb_keycode_t key); - -/** - * Find the keycode of the key with the given name. - * - * The name can be either a canonical name or an alias. - * - * @returns The keycode. If no key with this name exists, - * returns XKB_KEYCODE_INVALID. - * - * @sa xkb_keycode_t - * @memberof xkb_keymap - * @since 0.6.0 - */ -xkb_keycode_t -xkb_keymap_key_by_name(struct xkb_keymap *keymap, const char *name); - -/** - * Get the number of modifiers in the keymap. - * - * @sa xkb_mod_index_t - * @memberof xkb_keymap - */ -xkb_mod_index_t -xkb_keymap_num_mods(struct xkb_keymap *keymap); - -/** - * Get the name of a modifier by index. - * - * @returns The name. If the index is invalid, returns NULL. - * - * @sa xkb_mod_index_t - * @memberof xkb_keymap - */ -const char * -xkb_keymap_mod_get_name(struct xkb_keymap *keymap, xkb_mod_index_t idx); - -/** - * Get the index of a modifier by name. - * - * @returns The index. If no modifier with this name exists, returns - * XKB_MOD_INVALID. - * - * @sa xkb_mod_index_t - * @memberof xkb_keymap - */ -xkb_mod_index_t -xkb_keymap_mod_get_index(struct xkb_keymap *keymap, const char *name); - -/** - * Get the number of layouts in the keymap. - * - * @sa xkb_layout_index_t xkb_rule_names xkb_keymap_num_layouts_for_key() - * @memberof xkb_keymap - */ -xkb_layout_index_t -xkb_keymap_num_layouts(struct xkb_keymap *keymap); - -/** - * Get the name of a layout by index. - * - * @returns The name. If the index is invalid, or the layout does not have - * a name, returns NULL. - * - * @sa xkb_layout_index_t - * For notes on layout names. - * @memberof xkb_keymap - */ -const char * -xkb_keymap_layout_get_name(struct xkb_keymap *keymap, xkb_layout_index_t idx); - -/** - * Get the index of a layout by name. - * - * @returns The index. If no layout exists with this name, returns - * XKB_LAYOUT_INVALID. If more than one layout in the keymap has this name, - * returns the lowest index among them. - * - * @sa xkb_layout_index_t - * For notes on layout names. - * @memberof xkb_keymap - */ -xkb_layout_index_t -xkb_keymap_layout_get_index(struct xkb_keymap *keymap, const char *name); - -/** - * Get the number of LEDs in the keymap. - * - * @warning The range [ 0...xkb_keymap_num_leds() ) includes all of the LEDs - * in the keymap, but may also contain inactive LEDs. When iterating over - * this range, you need the handle this case when calling functions such as - * xkb_keymap_led_get_name() or xkb_state_led_index_is_active(). - * - * @sa xkb_led_index_t - * @memberof xkb_keymap - */ -xkb_led_index_t -xkb_keymap_num_leds(struct xkb_keymap *keymap); - -/** - * Get the name of a LED by index. - * - * @returns The name. If the index is invalid, returns NULL. - * - * @memberof xkb_keymap - */ -const char * -xkb_keymap_led_get_name(struct xkb_keymap *keymap, xkb_led_index_t idx); - -/** - * Get the index of a LED by name. - * - * @returns The index. If no LED with this name exists, returns - * XKB_LED_INVALID. - * - * @memberof xkb_keymap - */ -xkb_led_index_t -xkb_keymap_led_get_index(struct xkb_keymap *keymap, const char *name); - -/** - * Get the number of layouts for a specific key. - * - * This number can be different from xkb_keymap_num_layouts(), but is always - * smaller. It is the appropriate value to use when iterating over the - * layouts of a key. - * - * @sa xkb_layout_index_t - * @memberof xkb_keymap - */ -xkb_layout_index_t -xkb_keymap_num_layouts_for_key(struct xkb_keymap *keymap, xkb_keycode_t key); - -/** - * Get the number of shift levels for a specific key and layout. - * - * If @c layout is out of range for this key (that is, larger or equal to - * the value returned by xkb_keymap_num_layouts_for_key()), it is brought - * back into range in a manner consistent with xkb_state_key_get_layout(). - * - * @sa xkb_level_index_t - * @memberof xkb_keymap - */ -xkb_level_index_t -xkb_keymap_num_levels_for_key(struct xkb_keymap *keymap, xkb_keycode_t key, - xkb_layout_index_t layout); - -/** - * Retrieves every possible modifier mask that produces the specified - * shift level for a specific key and layout. - * - * This API is useful for inverse key transformation; i.e. finding out - * which modifiers need to be active in order to be able to type the - * keysym(s) corresponding to the specific key code, layout and level. - * - * @warning It returns only up to masks_size modifier masks. If the - * buffer passed is too small, some of the possible modifier combinations - * will not be returned. - * - * @param[in] keymap The keymap. - * @param[in] key The keycode of the key. - * @param[in] layout The layout for which to get modifiers. - * @param[in] level The shift level in the layout for which to get the - * modifiers. This should be smaller than: - * @code xkb_keymap_num_levels_for_key(keymap, key) @endcode - * @param[out] masks_out A buffer in which the requested masks should be - * stored. - * @param[out] masks_size The size of the buffer pointed to by masks_out. - * - * If @c layout is out of range for this key (that is, larger or equal to - * the value returned by xkb_keymap_num_layouts_for_key()), it is brought - * back into range in a manner consistent with xkb_state_key_get_layout(). - * - * @returns The number of modifier masks stored in the masks_out array. - * If the key is not in the keymap or if the specified shift level cannot - * be reached it returns 0 and does not modify the masks_out buffer. - * - * @sa xkb_level_index_t - * @sa xkb_mod_mask_t - * @memberof xkb_keymap - * @since 1.0.0 - */ -size_t -xkb_keymap_key_get_mods_for_level(struct xkb_keymap *keymap, - xkb_keycode_t key, - xkb_layout_index_t layout, - xkb_level_index_t level, - xkb_mod_mask_t *masks_out, - size_t masks_size); - -/** - * Get the keysyms obtained from pressing a key in a given layout and - * shift level. - * - * This function is like xkb_state_key_get_syms(), only the layout and - * shift level are not derived from the keyboard state but are instead - * specified explicitly. - * - * @param[in] keymap The keymap. - * @param[in] key The keycode of the key. - * @param[in] layout The layout for which to get the keysyms. - * @param[in] level The shift level in the layout for which to get the - * keysyms. This should be smaller than: - * @code xkb_keymap_num_levels_for_key(keymap, key) @endcode - * @param[out] syms_out An immutable array of keysyms corresponding to the - * key in the given layout and shift level. - * - * If @c layout is out of range for this key (that is, larger or equal to - * the value returned by xkb_keymap_num_layouts_for_key()), it is brought - * back into range in a manner consistent with xkb_state_key_get_layout(). - * - * @returns The number of keysyms in the syms_out array. If no keysyms - * are produced by the key in the given layout and shift level, returns 0 - * and sets syms_out to NULL. - * - * @sa xkb_state_key_get_syms() - * @memberof xkb_keymap - */ -int -xkb_keymap_key_get_syms_by_level(struct xkb_keymap *keymap, - xkb_keycode_t key, - xkb_layout_index_t layout, - xkb_level_index_t level, - const xkb_keysym_t **syms_out); - -/** - * Determine whether a key should repeat or not. - * - * A keymap may specify different repeat behaviors for different keys. - * Most keys should generally exhibit repeat behavior; for example, holding - * the 'a' key down in a text editor should normally insert a single 'a' - * character every few milliseconds, until the key is released. However, - * there are keys which should not or do not need to be repeated. For - * example, repeating modifier keys such as Left/Right Shift or Caps Lock - * is not generally useful or desired. - * - * @returns 1 if the key should repeat, 0 otherwise. - * - * @memberof xkb_keymap - */ -int -xkb_keymap_key_repeats(struct xkb_keymap *keymap, xkb_keycode_t key); - -/** @} */ - -/** - * @defgroup state Keyboard State - * Creating, destroying and manipulating keyboard state objects. - * - * @{ - */ - -/** - * Create a new keyboard state object. - * - * @param keymap The keymap which the state will use. - * - * @returns A new keyboard state object, or NULL on failure. - * - * @memberof xkb_state - */ -struct xkb_state * -xkb_state_new(struct xkb_keymap *keymap); - -/** - * Take a new reference on a keyboard state object. - * - * @returns The passed in object. - * - * @memberof xkb_state - */ -struct xkb_state * -xkb_state_ref(struct xkb_state *state); - -/** - * Release a reference on a keybaord state object, and possibly free it. - * - * @param state The state. If it is NULL, this function does nothing. - * - * @memberof xkb_state - */ -void -xkb_state_unref(struct xkb_state *state); - -/** - * Get the keymap which a keyboard state object is using. - * - * @returns The keymap which was passed to xkb_state_new() when creating - * this state object. - * - * This function does not take a new reference on the keymap; you must - * explicitly reference it yourself if you plan to use it beyond the - * lifetime of the state. - * - * @memberof xkb_state - */ -struct xkb_keymap * -xkb_state_get_keymap(struct xkb_state *state); - -/** Specifies the direction of the key (press / release). */ -enum xkb_key_direction { - XKB_KEY_UP, /**< The key was released. */ - XKB_KEY_DOWN /**< The key was pressed. */ -}; - -/** - * Modifier and layout types for state objects. This enum is bitmaskable, - * e.g. (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED) is valid to - * exclude locked modifiers. - * - * In XKB, the DEPRESSED components are also known as 'base'. - */ -enum xkb_state_component { - /** Depressed modifiers, i.e. a key is physically holding them. */ - XKB_STATE_MODS_DEPRESSED = (1 << 0), - /** Latched modifiers, i.e. will be unset after the next non-modifier - * key press. */ - XKB_STATE_MODS_LATCHED = (1 << 1), - /** Locked modifiers, i.e. will be unset after the key provoking the - * lock has been pressed again. */ - XKB_STATE_MODS_LOCKED = (1 << 2), - /** Effective modifiers, i.e. currently active and affect key - * processing (derived from the other state components). - * Use this unless you explicitly care how the state came about. */ - XKB_STATE_MODS_EFFECTIVE = (1 << 3), - /** Depressed layout, i.e. a key is physically holding it. */ - XKB_STATE_LAYOUT_DEPRESSED = (1 << 4), - /** Latched layout, i.e. will be unset after the next non-modifier - * key press. */ - XKB_STATE_LAYOUT_LATCHED = (1 << 5), - /** Locked layout, i.e. will be unset after the key provoking the lock - * has been pressed again. */ - XKB_STATE_LAYOUT_LOCKED = (1 << 6), - /** Effective layout, i.e. currently active and affects key processing - * (derived from the other state components). - * Use this unless you explicitly care how the state came about. */ - XKB_STATE_LAYOUT_EFFECTIVE = (1 << 7), - /** LEDs (derived from the other state components). */ - XKB_STATE_LEDS = (1 << 8) -}; - -/** - * Update the keyboard state to reflect a given key being pressed or - * released. - * - * This entry point is intended for programs which track the keyboard state - * explicitly (like an evdev client). If the state is serialized to you by - * a master process (like a Wayland compositor) using functions like - * xkb_state_serialize_mods(), you should use xkb_state_update_mask() instead. - * The two functions should not generally be used together. - * - * A series of calls to this function should be consistent; that is, a call - * with XKB_KEY_DOWN for a key should be matched by an XKB_KEY_UP; if a key - * is pressed twice, it should be released twice; etc. Otherwise (e.g. due - * to missed input events), situations like "stuck modifiers" may occur. - * - * This function is often used in conjunction with the function - * xkb_state_key_get_syms() (or xkb_state_key_get_one_sym()), for example, - * when handling a key event. In this case, you should prefer to get the - * keysyms *before* updating the key, such that the keysyms reported for - * the key event are not affected by the event itself. This is the - * conventional behavior. - * - * @returns A mask of state components that have changed as a result of - * the update. If nothing in the state has changed, returns 0. - * - * @memberof xkb_state - * - * @sa xkb_state_update_mask() - */ -enum xkb_state_component -xkb_state_update_key(struct xkb_state *state, xkb_keycode_t key, - enum xkb_key_direction direction); - -/** - * Update a keyboard state from a set of explicit masks. - * - * This entry point is intended for window systems and the like, where a - * master process holds an xkb_state, then serializes it over a wire - * protocol, and clients then use the serialization to feed in to their own - * xkb_state. - * - * All parameters must always be passed, or the resulting state may be - * incoherent. - * - * The serialization is lossy and will not survive round trips; it must only - * be used to feed slave state objects, and must not be used to update the - * master state. - * - * If you do not fit the description above, you should use - * xkb_state_update_key() instead. The two functions should not generally be - * used together. - * - * @returns A mask of state components that have changed as a result of - * the update. If nothing in the state has changed, returns 0. - * - * @memberof xkb_state - * - * @sa xkb_state_component - * @sa xkb_state_update_key - */ -enum xkb_state_component -xkb_state_update_mask(struct xkb_state *state, - xkb_mod_mask_t depressed_mods, - xkb_mod_mask_t latched_mods, - xkb_mod_mask_t locked_mods, - xkb_layout_index_t depressed_layout, - xkb_layout_index_t latched_layout, - xkb_layout_index_t locked_layout); - -/** - * Get the keysyms obtained from pressing a particular key in a given - * keyboard state. - * - * Get the keysyms for a key according to the current active layout, - * modifiers and shift level for the key, as determined by a keyboard - * state. - * - * @param[in] state The keyboard state object. - * @param[in] key The keycode of the key. - * @param[out] syms_out An immutable array of keysyms corresponding the - * key in the given keyboard state. - * - * As an extension to XKB, this function can return more than one keysym. - * If you do not want to handle this case, you can use - * xkb_state_key_get_one_sym() for a simpler interface. - * - * This function does not perform any @ref keysym-transformations. - * (This might change). - * - * @returns The number of keysyms in the syms_out array. If no keysyms - * are produced by the key in the given keyboard state, returns 0 and sets - * syms_out to NULL. - * - * @memberof xkb_state - */ -int -xkb_state_key_get_syms(struct xkb_state *state, xkb_keycode_t key, - const xkb_keysym_t **syms_out); - -/** - * Get the Unicode/UTF-8 string obtained from pressing a particular key - * in a given keyboard state. - * - * @param[in] state The keyboard state object. - * @param[in] key The keycode of the key. - * @param[out] buffer A buffer to write the string into. - * @param[in] size Size of the buffer. - * - * @warning If the buffer passed is too small, the string is truncated - * (though still NUL-terminated). - * - * @returns The number of bytes required for the string, excluding the - * NUL byte. If there is nothing to write, returns 0. - * - * You may check if truncation has occurred by comparing the return value - * with the size of @p buffer, similarly to the snprintf(3) function. - * You may safely pass NULL and 0 to @p buffer and @p size to find the - * required size (without the NUL-byte). - * - * This function performs Capitalization and Control @ref - * keysym-transformations. - * - * @memberof xkb_state - * @since 0.4.1 - */ -int -xkb_state_key_get_utf8(struct xkb_state *state, xkb_keycode_t key, - char *buffer, size_t size); - -/** - * Get the Unicode/UTF-32 codepoint obtained from pressing a particular - * key in a a given keyboard state. - * - * @returns The UTF-32 representation for the key, if it consists of only - * a single codepoint. Otherwise, returns 0. - * - * This function performs Capitalization and Control @ref - * keysym-transformations. - * - * @memberof xkb_state - * @since 0.4.1 - */ -uint32_t -xkb_state_key_get_utf32(struct xkb_state *state, xkb_keycode_t key); - -/** - * Get the single keysym obtained from pressing a particular key in a - * given keyboard state. - * - * This function is similar to xkb_state_key_get_syms(), but intended - * for users which cannot or do not want to handle the case where - * multiple keysyms are returned (in which case this function is - * preferred). - * - * @returns The keysym. If the key does not have exactly one keysym, - * returns XKB_KEY_NoSymbol - * - * This function performs Capitalization @ref keysym-transformations. - * - * @sa xkb_state_key_get_syms() - * @memberof xkb_state - */ -xkb_keysym_t -xkb_state_key_get_one_sym(struct xkb_state *state, xkb_keycode_t key); - -/** - * Get the effective layout index for a key in a given keyboard state. - * - * @returns The layout index for the key in the given keyboard state. If - * the given keycode is invalid, or if the key is not included in any - * layout at all, returns XKB_LAYOUT_INVALID. - * - * @invariant If the returned layout is valid, the following always holds: - * @code - * xkb_state_key_get_layout(state, key) < xkb_keymap_num_layouts_for_key(keymap, key) - * @endcode - * - * @memberof xkb_state - */ -xkb_layout_index_t -xkb_state_key_get_layout(struct xkb_state *state, xkb_keycode_t key); - -/** - * Get the effective shift level for a key in a given keyboard state and - * layout. - * - * @param state The keyboard state. - * @param key The keycode of the key. - * @param layout The layout for which to get the shift level. This must be - * smaller than: - * @code xkb_keymap_num_layouts_for_key(keymap, key) @endcode - * usually it would be: - * @code xkb_state_key_get_layout(state, key) @endcode - * - * @return The shift level index. If the key or layout are invalid, - * returns XKB_LEVEL_INVALID. - * - * @invariant If the returned level is valid, the following always holds: - * @code - * xkb_state_key_get_level(state, key, layout) < xkb_keymap_num_levels_for_key(keymap, key, layout) - * @endcode - * - * @memberof xkb_state - */ -xkb_level_index_t -xkb_state_key_get_level(struct xkb_state *state, xkb_keycode_t key, - xkb_layout_index_t layout); - -/** - * Match flags for xkb_state_mod_indices_are_active() and - * xkb_state_mod_names_are_active(), specifying the conditions for a - * successful match. XKB_STATE_MATCH_NON_EXCLUSIVE is bitmaskable with - * the other modes. - */ -enum xkb_state_match { - /** Returns true if any of the modifiers are active. */ - XKB_STATE_MATCH_ANY = (1 << 0), - /** Returns true if all of the modifiers are active. */ - XKB_STATE_MATCH_ALL = (1 << 1), - /** Makes matching non-exclusive, i.e. will not return false if a - * modifier not specified in the arguments is active. */ - XKB_STATE_MATCH_NON_EXCLUSIVE = (1 << 16) -}; - -/** - * The counterpart to xkb_state_update_mask for modifiers, to be used on - * the server side of serialization. - * - * @param state The keyboard state. - * @param components A mask of the modifier state components to serialize. - * State components other than XKB_STATE_MODS_* are ignored. - * If XKB_STATE_MODS_EFFECTIVE is included, all other state components are - * ignored. - * - * @returns A xkb_mod_mask_t representing the given components of the - * modifier state. - * - * This function should not be used in regular clients; please use the - * xkb_state_mod_*_is_active API instead. - * - * @memberof xkb_state - */ -xkb_mod_mask_t -xkb_state_serialize_mods(struct xkb_state *state, - enum xkb_state_component components); - -/** - * The counterpart to xkb_state_update_mask for layouts, to be used on - * the server side of serialization. - * - * @param state The keyboard state. - * @param components A mask of the layout state components to serialize. - * State components other than XKB_STATE_LAYOUT_* are ignored. - * If XKB_STATE_LAYOUT_EFFECTIVE is included, all other state components are - * ignored. - * - * @returns A layout index representing the given components of the - * layout state. - * - * This function should not be used in regular clients; please use the - * xkb_state_layout_*_is_active API instead. - * - * @memberof xkb_state - */ -xkb_layout_index_t -xkb_state_serialize_layout(struct xkb_state *state, - enum xkb_state_component components); - -/** - * Test whether a modifier is active in a given keyboard state by name. - * - * @returns 1 if the modifier is active, 0 if it is not. If the modifier - * name does not exist in the keymap, returns -1. - * - * @memberof xkb_state - */ -int -xkb_state_mod_name_is_active(struct xkb_state *state, const char *name, - enum xkb_state_component type); - -/** - * Test whether a set of modifiers are active in a given keyboard state by - * name. - * - * @param state The keyboard state. - * @param type The component of the state against which to match the - * given modifiers. - * @param match The manner by which to match the state against the - * given modifiers. - * @param ... The set of of modifier names to test, terminated by a NULL - * argument (sentinel). - * - * @returns 1 if the modifiers are active, 0 if they are not. If any of - * the modifier names do not exist in the keymap, returns -1. - * - * @memberof xkb_state - */ -int -xkb_state_mod_names_are_active(struct xkb_state *state, - enum xkb_state_component type, - enum xkb_state_match match, - ...); - -/** - * Test whether a modifier is active in a given keyboard state by index. - * - * @returns 1 if the modifier is active, 0 if it is not. If the modifier - * index is invalid in the keymap, returns -1. - * - * @memberof xkb_state - */ -int -xkb_state_mod_index_is_active(struct xkb_state *state, xkb_mod_index_t idx, - enum xkb_state_component type); - -/** - * Test whether a set of modifiers are active in a given keyboard state by - * index. - * - * @param state The keyboard state. - * @param type The component of the state against which to match the - * given modifiers. - * @param match The manner by which to match the state against the - * given modifiers. - * @param ... The set of of modifier indices to test, terminated by a - * XKB_MOD_INVALID argument (sentinel). - * - * @returns 1 if the modifiers are active, 0 if they are not. If any of - * the modifier indices are invalid in the keymap, returns -1. - * - * @memberof xkb_state - */ -int -xkb_state_mod_indices_are_active(struct xkb_state *state, - enum xkb_state_component type, - enum xkb_state_match match, - ...); - -/** - * @page consumed-modifiers Consumed Modifiers - * @parblock - * - * Some functions, like xkb_state_key_get_syms(), look at the state of - * the modifiers in the keymap and derive from it the correct shift level - * to use for the key. For example, in a US layout, pressing the key - * labeled \ while the Shift modifier is active, generates the keysym - * 'A'. In this case, the Shift modifier is said to be "consumed". - * However, the Num Lock modifier does not affect this translation at all, - * even if it is active, so it is not consumed by this translation. - * - * It may be desirable for some application to not reuse consumed modifiers - * for further processing, e.g. for hotkeys or keyboard shortcuts. To - * understand why, consider some requirements from a standard shortcut - * mechanism, and how they are implemented: - * - * 1. The shortcut's modifiers must match exactly to the state. For - * example, it is possible to bind separate actions to \\ - * and to \\\. Further, if only \\ is - * bound to an action, pressing \\\ should not - * trigger the shortcut. - * Effectively, this means that the modifiers are compared using the - * equality operator (==). - * - * 2. Only relevant modifiers are considered for the matching. For example, - * Caps Lock and Num Lock should not generally affect the matching, e.g. - * when matching \\ against the state, it does not matter - * whether Num Lock is active or not. These relevant, or "significant", - * modifiers usually include Alt, Control, Shift, Super and similar. - * Effectively, this means that non-significant modifiers are masked out, - * before doing the comparison as described above. - * - * 3. The matching must be independent of the layout/keymap. For example, - * the \ (+) symbol is found on the first level on some layouts, - * but requires holding Shift on others. If you simply bind the action - * to the \ keysym, it would work for the unshifted kind, but - * not for the others, because the match against Shift would fail. If - * you bind the action to \\, only the shifted kind would - * work. So what is needed is to recognize that Shift is used up in the - * translation of the keysym itself, and therefore should not be included - * in the matching. - * Effectively, this means that consumed modifiers (Shift in this example) - * are masked out as well, before doing the comparison. - * - * In summary, this is approximately how the matching would be performed: - * @code - * (keysym == shortcut_keysym) && - * ((state_mods & ~consumed_mods & significant_mods) == shortcut_mods) - * @endcode - * - * @c state_mods are the modifiers reported by - * xkb_state_mod_index_is_active() and similar functions. - * @c consumed_mods are the modifiers reported by - * xkb_state_mod_index_is_consumed() and similar functions. - * @c significant_mods are decided upon by the application/toolkit/user; - * it is up to them to decide whether these are configurable or hard-coded. - * - * @endparblock - */ - -/** - * Consumed modifiers mode. - * - * There are several possible methods for deciding which modifiers are - * consumed and which are not, each applicable for different systems or - * situations. The mode selects the method to use. - * - * Keep in mind that in all methods, the keymap may decide to "preserve" - * a modifier, meaning it is not reported as consumed even if it would - * have otherwise. - */ -enum xkb_consumed_mode { - /** - * This is the mode defined in the XKB specification and used by libX11. - * - * A modifier is consumed if and only if it *may affect* key translation. - * - * For example, if `Control+Alt+` produces some assigned keysym, - * then when pressing just ``, `Control` and `Alt` are consumed, - * even though they are not active, since if they *were* active they would - * have affected key translation. - */ - XKB_CONSUMED_MODE_XKB, - /** - * This is the mode used by the GTK+ toolkit. - * - * The mode consists of the following two independent heuristics: - * - * - The currently active set of modifiers, excluding modifiers which do - * not affect the key (as described for @ref XKB_CONSUMED_MODE_XKB), are - * considered consumed, if the keysyms produced when all of them are - * active are different from the keysyms produced when no modifiers are - * active. - * - * - A single modifier is considered consumed if the keysyms produced for - * the key when it is the only active modifier are different from the - * keysyms produced when no modifiers are active. - */ - XKB_CONSUMED_MODE_GTK -}; - -/** - * Get the mask of modifiers consumed by translating a given key. - * - * @param state The keyboard state. - * @param key The keycode of the key. - * @param mode The consumed modifiers mode to use; see enum description. - * - * @returns a mask of the consumed modifiers. - * - * @memberof xkb_state - * @since 0.7.0 - */ -xkb_mod_mask_t -xkb_state_key_get_consumed_mods2(struct xkb_state *state, xkb_keycode_t key, - enum xkb_consumed_mode mode); - -/** - * Same as xkb_state_key_get_consumed_mods2() with mode XKB_CONSUMED_MODE_XKB. - * - * @memberof xkb_state - * @since 0.4.1 - */ -xkb_mod_mask_t -xkb_state_key_get_consumed_mods(struct xkb_state *state, xkb_keycode_t key); - -/** - * Test whether a modifier is consumed by keyboard state translation for - * a key. - * - * @param state The keyboard state. - * @param key The keycode of the key. - * @param idx The index of the modifier to check. - * @param mode The consumed modifiers mode to use; see enum description. - * - * @returns 1 if the modifier is consumed, 0 if it is not. If the modifier - * index is not valid in the keymap, returns -1. - * - * @sa xkb_state_mod_mask_remove_consumed() - * @sa xkb_state_key_get_consumed_mods() - * @memberof xkb_state - * @since 0.7.0 - */ -int -xkb_state_mod_index_is_consumed2(struct xkb_state *state, - xkb_keycode_t key, - xkb_mod_index_t idx, - enum xkb_consumed_mode mode); - -/** - * Same as xkb_state_mod_index_is_consumed2() with mode XKB_CONSUMED_MOD_XKB. - * - * @memberof xkb_state - * @since 0.4.1 - */ -int -xkb_state_mod_index_is_consumed(struct xkb_state *state, xkb_keycode_t key, - xkb_mod_index_t idx); - -/** - * Remove consumed modifiers from a modifier mask for a key. - * - * @deprecated Use xkb_state_key_get_consumed_mods2() instead. - * - * Takes the given modifier mask, and removes all modifiers which are - * consumed for that particular key (as in xkb_state_mod_index_is_consumed()). - * - * @sa xkb_state_mod_index_is_consumed() - * @memberof xkb_state - */ -xkb_mod_mask_t -xkb_state_mod_mask_remove_consumed(struct xkb_state *state, xkb_keycode_t key, - xkb_mod_mask_t mask); - -/** - * Test whether a layout is active in a given keyboard state by name. - * - * @returns 1 if the layout is active, 0 if it is not. If no layout with - * this name exists in the keymap, return -1. - * - * If multiple layouts in the keymap have this name, the one with the lowest - * index is tested. - * - * @sa xkb_layout_index_t - * @memberof xkb_state - */ -int -xkb_state_layout_name_is_active(struct xkb_state *state, const char *name, - enum xkb_state_component type); - -/** - * Test whether a layout is active in a given keyboard state by index. - * - * @returns 1 if the layout is active, 0 if it is not. If the layout index - * is not valid in the keymap, returns -1. - * - * @sa xkb_layout_index_t - * @memberof xkb_state - */ -int -xkb_state_layout_index_is_active(struct xkb_state *state, - xkb_layout_index_t idx, - enum xkb_state_component type); - -/** - * Test whether a LED is active in a given keyboard state by name. - * - * @returns 1 if the LED is active, 0 if it not. If no LED with this name - * exists in the keymap, returns -1. - * - * @sa xkb_led_index_t - * @memberof xkb_state - */ -int -xkb_state_led_name_is_active(struct xkb_state *state, const char *name); - -/** - * Test whether a LED is active in a given keyboard state by index. - * - * @returns 1 if the LED is active, 0 if it not. If the LED index is not - * valid in the keymap, returns -1. - * - * @sa xkb_led_index_t - * @memberof xkb_state - */ -int -xkb_state_led_index_is_active(struct xkb_state *state, xkb_led_index_t idx); - -/** @} */ - -/* Leave this include last, so it can pick up our types, etc. */ -#include - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* _XKBCOMMON_H_ */ diff --git a/xkbcommon/xkbregistry.h b/xkbcommon/xkbregistry.h deleted file mode 100644 index 4e7e926..0000000 --- a/xkbcommon/xkbregistry.h +++ /dev/null @@ -1,782 +0,0 @@ -/* - * Copyright © 2020 Red Hat, Inc. - * - * 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. - */ - - -#ifndef _XKBREGISTRY_H_ -#define _XKBREGISTRY_H_ - -#include -#include - -/** - * @file - * @brief Query for available RMLVO - * - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup registry Query for available RMLVO - * - * The libxkbregistry API to query for available rules, models, layouts, - * variants and options (RMLVO). libxkbregistry is a separate library to - * libxkbcommon. - * - * This library is the replacement for clients currently parsing evdev.xml - * directly. The library is intended to provide easy access to the set of - * **possible** MLVO configurations for a given ruleset. It is not a library to - * apply these configurations, merely to enumerate them. The intended users of - * this library are the configuration UIs that allow a user to select their - * keyboard layout of choice. - * - * @{ - */ - -/** - * @struct rxkb_context - * - * Opaque top level library context object. - * - * The context contains general library state, like include paths and parsed - * data. Objects are created in a specific context, and multiple contexts - * may coexist simultaneously. Objects from different contexts are - * completely separated and do not share any memory or state. - */ -struct rxkb_context; - -/** - * @struct rxkb_model - * - * Opaque struct representing an XKB model. - */ -struct rxkb_model; - -/** - * @struct rxkb_layout - * - * Opaque struct representing an XKB layout, including an optional variant. - * Where the variant is NULL, the layout is the base layout. - * - * For example, "us" is the base layout, "us(intl)" is the "intl" variant of the - * layout "us". - */ -struct rxkb_layout; - -/** - * @struct rxkb_option_group - * - * Opaque struct representing an option group. Option groups divide the - * individual options into logical groups. Their main purpose is to indicate - * whether some options are mutually exclusive or not. - */ -struct rxkb_option_group; - -/** - * @struct rxkb_option - * - * Opaque struct representing an XKB option. Options are grouped inside an @ref - * rxkb_option_group. - */ -struct rxkb_option; - -/** - * - * @struct rxkb_iso639_code - * - * Opaque struct representing an ISO 639-3 code (e.g. "eng", "fra"). There - * is no guarantee that two identical ISO codes share the same struct. You - * must not rely on the pointer value of this struct. - * - * See https://iso639-3.sil.org/code_tables/639/data for a list of codes. - */ -struct rxkb_iso639_code; - -/** - * - * @struct rxkb_iso3166_code - * - * Opaque struct representing an ISO 3166 Alpha 2 code (e.g. "US", "FR"). - * There is no guarantee that two identical ISO codes share the same struct. - * You must not rely on the pointer value of this struct. - * - * See https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes for a list - * of codes. - */ -struct rxkb_iso3166_code; - -/** - * Describes the popularity of an item. Historically, some highly specialized or - * experimental definitions are excluded from the default list and shipped in - * separate files. If these extra definitions are loaded (see @ref - * RXKB_CONTEXT_LOAD_EXOTIC_RULES), the popularity of the item is set - * accordingly. - * - * If the exotic items are not loaded, all items will have the standard - * popularity. - */ -enum rxkb_popularity { - RXKB_POPULARITY_STANDARD = 1, - RXKB_POPULARITY_EXOTIC, -}; - -/** - * Flags for context creation. - */ -enum rxkb_context_flags { - RXKB_CONTEXT_NO_FLAGS = 0, - /** - * Skip the default include paths. This requires the caller to call - * rxkb_context_include_path_append() or - * rxkb_context_include_path_append_default(). - */ - RXKB_CONTEXT_NO_DEFAULT_INCLUDES = (1 << 0), - /** - * Load the extra items that are considered too exotic for the default list. - * - * For historical reasons, xkeyboard-config ships those exotic rules in a - * separate file (e.g. `evdev.extras.xml`). Where the exotic rules are - * requested, libxkbregistry will look for and load `$ruleset.extras.xml` - * in the include paths, see rxkb_context_include_path_append() for details - * on the lookup behavior. - */ - RXKB_CONTEXT_LOAD_EXOTIC_RULES = (1 << 1), -}; - -/** - * Create a new xkb registry context. - * - * The context has an initial refcount of 1. Use rxkb_context_unref() to release - * memory associated with this context. - * - * Creating a context does not parse the files yet, use - * rxkb_context_parse(). - * - * @param flags Flags affecting context behavior - * @return A new xkb registry context or NULL on failure - */ -struct rxkb_context * -rxkb_context_new(enum rxkb_context_flags flags); - -/** Specifies a logging level. */ -enum rxkb_log_level { - RXKB_LOG_LEVEL_CRITICAL = 10, /**< Log critical internal errors only. */ - RXKB_LOG_LEVEL_ERROR = 20, /**< Log all errors. */ - RXKB_LOG_LEVEL_WARNING = 30, /**< Log warnings and errors. */ - RXKB_LOG_LEVEL_INFO = 40, /**< Log information, warnings, and errors. */ - RXKB_LOG_LEVEL_DEBUG = 50 /**< Log everything. */ -}; - -/** - * Set the current logging level. - * - * @param ctx The context in which to set the logging level. - * @param level The logging level to use. Only messages from this level - * and below will be logged. - * - * The default level is RXKB_LOG_LEVEL_ERROR. The environment variable - * RXKB_LOG_LEVEL, if set at the time the context was created, overrides the - * default value. It may be specified as a level number or name. - */ -void -rxkb_context_set_log_level(struct rxkb_context *ctx, - enum rxkb_log_level level); - -/** - * Get the current logging level. - */ -enum rxkb_log_level -rxkb_context_get_log_level(struct rxkb_context *ctx); - -/** - * Set a custom function to handle logging messages. - * - * @param ctx The context in which to use the set logging function. - * @param log_fn The function that will be called for logging messages. - * Passing NULL restores the default function, which logs to stderr. - * - * By default, log messages from this library are printed to stderr. This - * function allows you to replace the default behavior with a custom - * handler. The handler is only called with messages which match the - * current logging level and verbosity settings for the context. - * level is the logging level of the message. @a format and @a args are - * the same as in the vprintf(3) function. - * - * You may use rxkb_context_set_user_data() on the context, and then call - * rxkb_context_get_user_data() from within the logging function to provide - * it with additional private context. - */ -void -rxkb_context_set_log_fn(struct rxkb_context *ctx, - void (*log_fn)(struct rxkb_context *ctx, - enum rxkb_log_level level, - const char *format, va_list args)); - - -/** - * Parse the given ruleset. This can only be called once per context and once - * parsed the data in the context is considered constant and will never - * change. - * - * This function parses all files with the given ruleset name. See - * rxkb_context_include_path_append() for details. - * - * If this function returns false, libxkbregistry failed to parse the xml files. - * This is usually caused by invalid files on the host and should be debugged by - * the host's administrator using external tools. Callers should reduce the - * include paths to known good paths and/or fall back to a default RMLVO set. - * - * If this function returns false, the context should be be considered dead and - * must be released with rxkb_context_unref(). - * - * @param ctx The xkb registry context - * @param ruleset The ruleset to parse, e.g. "evdev" - * @return true on success or false on failure - */ -bool -rxkb_context_parse(struct rxkb_context *ctx, const char *ruleset); - -/** - * Parse the default ruleset as configured at build time. See - * rxkb_context_parse() for details. - */ -bool -rxkb_context_parse_default_ruleset(struct rxkb_context *ctx); - -/** - * Increases the refcount of this object by one and returns the object. - * - * @param ctx The xkb registry context - * @return The passed in object - */ -struct rxkb_context* -rxkb_context_ref(struct rxkb_context *ctx); - -/** - * Decreases the refcount of this object by one. Where the refcount of an - * object hits zero, associated resources will be freed. - * - * @param ctx The xkb registry context - * @return always NULL - */ -struct rxkb_context* -rxkb_context_unref(struct rxkb_context *ctx); - -/** - * Assign user-specific data. libxkbregistry will not look at or modify the - * data, it will merely return the same pointer in - * rxkb_context_get_user_data(). - * - * @param ctx The xkb registry context - * @param user_data User-specific data pointer - */ -void -rxkb_context_set_user_data(struct rxkb_context *ctx, void *user_data); - -/** - * Return the pointer passed into rxkb_context_get_user_data(). - * - * @param ctx The xkb registry context - * @return User-specific data pointer - */ -void * -rxkb_context_get_user_data(struct rxkb_context *ctx); - -/** - * Append a new entry to the context's include path. - * - * The include path handling is optimized for the most common use-case: a set of - * system files that provide a complete set of MLVO and some - * custom MLVO provided by a user **in addition** to the system set. - * - * The include paths should be given so that the least complete path is - * specified first and the most complete path is appended last. For example: - * - * @code - * ctx = rxkb_context_new(RXKB_CONTEXT_NO_DEFAULT_INCLUDES); - * rxkb_context_include_path_append(ctx, "/home/user/.config/xkb"); - * rxkb_context_include_path_append(ctx, "/usr/share/X11/xkb"); - * rxkb_context_parse(ctx, "evdev"); - * @endcode - * - * The above example reflects the default behavior unless @ref - * RXKB_CONTEXT_NO_DEFAULT_INCLUDES is provided. - * - * Loading of the files is in **reverse order**, i.e. the last path appended is - * loaded first - in this case the ``/usr/share/X11/xkb`` path. - * Any models, layouts, variants and options defined in the "evdev" ruleset - * are loaded into the context. Then, any RMLVO found in the "evdev" ruleset of - * the user's path (``/home/user/.config/xkb`` in this example) are **appended** - * to the existing set. - * - * Note that data from previously loaded include paths is never overwritten, - * only appended to. It is not not possible to change the system-provided data, - * only to append new models, layouts, variants and options to it. - * - * In other words, to define a new variant of the "us" layout called "banana", - * the following XML is sufficient. - * - * @verbatim - * - * - * - * - * us - * - * - * - * - * banana - * English (Banana) - * - * - * - * - * - * @endverbatim - * - * The list of models, options and all other layouts (including "us" and its - * variants) is taken from the system files. The resulting list of layouts will - * thus have a "us" keyboard layout with the variant "banana" and all other - * system-provided variants (dvorak, colemak, intl, etc.) - * - * This function must be called before rxkb_context_parse() or - * rxkb_context_parse_default_ruleset(). - * - * @returns true on success, or false if the include path could not be added - * or is inaccessible. - */ -bool -rxkb_context_include_path_append(struct rxkb_context *ctx, const char *path); - -/** - * Append the default include paths to the context's include path. - * See rxkb_context_include_path_append() for details about the merge order. - * - * This function must be called before rxkb_context_parse() or - * rxkb_context_parse_default_ruleset(). - * - * @returns true on success, or false if the include path could not be added - * or is inaccessible. - */ -bool -rxkb_context_include_path_append_default(struct rxkb_context *ctx); - -/** - * Return the first model for this context. Use this to start iterating over - * the models, followed by calls to rxkb_model_next(). Models are not sorted. - * - * The refcount of the returned model is not increased. Use rxkb_model_ref() if - * you need to keep this struct outside the immediate scope. - * - * @return The first model in the model list. - */ -struct rxkb_model * -rxkb_model_first(struct rxkb_context *ctx); - -/** - * Return the next model for this context. Returns NULL when no more models - * are available. - * - * The refcount of the returned model is not increased. Use rxkb_model_ref() if - * you need to keep this struct outside the immediate scope. - * - * @return the next model or NULL at the end of the list - */ -struct rxkb_model * -rxkb_model_next(struct rxkb_model *m); - -/** - * Increase the refcount of the argument by one. - * - * @returns The argument passed in to this function. - */ -struct rxkb_model * -rxkb_model_ref(struct rxkb_model *m); - -/** - * Decrease the refcount of the argument by one. When the refcount hits zero, - * all memory associated with this struct is freed. - * - * @returns always NULL - */ -struct rxkb_model * -rxkb_model_unref(struct rxkb_model *m); - -/** - * Return the name of this model. This is the value for M in RMLVO, to be used - * with libxkbcommon. - */ -const char * -rxkb_model_get_name(struct rxkb_model *m); - -/** - * Return a human-readable description of this model. This function may return - * NULL. - */ -const char * -rxkb_model_get_description(struct rxkb_model *m); - -/** - * Return the vendor name for this model. This function may return NULL. - */ -const char * -rxkb_model_get_vendor(struct rxkb_model *m); - -/** - * Return the popularity for this model. - */ -enum rxkb_popularity -rxkb_model_get_popularity(struct rxkb_model *m); - -/** - * Return the first layout for this context. Use this to start iterating over - * the layouts, followed by calls to rxkb_layout_next(). Layouts are not sorted. - * - * The refcount of the returned layout is not increased. Use rxkb_layout_ref() if - * you need to keep this struct outside the immediate scope. - * - * @return The first layout in the layout list. - */ -struct rxkb_layout * -rxkb_layout_first(struct rxkb_context *ctx); - -/** - * Return the next layout for this context. Returns NULL when no more layouts - * are available. - * - * The refcount of the returned layout is not increased. Use rxkb_layout_ref() - * if you need to keep this struct outside the immediate scope. - * - * @return the next layout or NULL at the end of the list - */ -struct rxkb_layout * -rxkb_layout_next(struct rxkb_layout *l); - -/** - * Increase the refcount of the argument by one. - * - * @returns The argument passed in to this function. - */ -struct rxkb_layout * -rxkb_layout_ref(struct rxkb_layout *l); - -/** - * Decrease the refcount of the argument by one. When the refcount hits zero, - * all memory associated with this struct is freed. - * - * @returns always NULL - */ -struct rxkb_layout * -rxkb_layout_unref(struct rxkb_layout *l); - -/** - * Return the name of this layout. This is the value for L in RMLVO, to be used - * with libxkbcommon. - */ -const char * -rxkb_layout_get_name(struct rxkb_layout *l); - -/** - * Return the variant of this layout. This is the value for V in RMLVO, to be - * used with libxkbcommon. - * - * A variant does not stand on its own, it always depends on the base layout. - * e.g. there may be multiple variants called "intl" but there is only one - * "us(intl)". - * - * Where the variant is NULL, the layout is the base layout (e.g. "us"). - */ -const char * -rxkb_layout_get_variant(struct rxkb_layout *l); - -/** - * Return a short (one-word) description of this layout. This function may - * return NULL. - */ -const char * -rxkb_layout_get_brief(struct rxkb_layout *l); - -/** - * Return a human-readable description of this layout. This function may return - * NULL. - */ -const char * -rxkb_layout_get_description(struct rxkb_layout *l); - -/** - * Return the popularity for this layout. - */ -enum rxkb_popularity -rxkb_layout_get_popularity(struct rxkb_layout *l); - -/** - * Return the first option group for this context. Use this to start iterating - * over the option groups, followed by calls to rxkb_option_group_next(). - * Option groups are not sorted. - * - * The refcount of the returned option group is not increased. Use - * rxkb_option_group_ref() if you need to keep this struct outside the immediate - * scope. - * - * @return The first option group in the option group list. - */ -struct rxkb_option_group * -rxkb_option_group_first(struct rxkb_context *ctx); - -/** - * Return the next option group for this context. Returns NULL when no more - * option groups are available. - * - * The refcount of the returned option group is not increased. Use - * rxkb_option_group_ref() if you need to keep this struct outside the immediate - * scope. - * - * @return the next option group or NULL at the end of the list - */ -struct rxkb_option_group * -rxkb_option_group_next(struct rxkb_option_group *g); - -/** - * Increase the refcount of the argument by one. - * - * @returns The argument passed in to this function. - */ -struct rxkb_option_group * -rxkb_option_group_ref(struct rxkb_option_group *g); - -/** - * Decrease the refcount of the argument by one. When the refcount hits zero, - * all memory associated with this struct is freed. - * - * @returns always NULL - */ -struct rxkb_option_group * -rxkb_option_group_unref(struct rxkb_option_group *g); - -/** - * Return the name of this option group. This is **not** the value for O in - * RMLVO, the name can be used for internal sorting in the caller. This function - * may return NULL. - */ -const char * -rxkb_option_group_get_name(struct rxkb_option_group *m); - -/** - * Return a human-readable description of this option group. This function may - * return NULL. - */ -const char * -rxkb_option_group_get_description(struct rxkb_option_group *m); - -/** - * @return true if multiple options within this option group can be selected - * simultaneously, false if all options within this option group - * are mutually exclusive. - */ -bool -rxkb_option_group_allows_multiple(struct rxkb_option_group *g); - -/** - * Return the popularity for this option group. - */ -enum rxkb_popularity -rxkb_option_group_get_popularity(struct rxkb_option_group *g); - -/** - * Return the first option for this option group. Use this to start iterating - * over the options, followed by calls to rxkb_option_next(). Options are not - * sorted. - * - * The refcount of the returned option is not increased. Use rxkb_option_ref() - * if you need to keep this struct outside the immediate scope. - * - * @return The first option in the option list. - */ -struct rxkb_option * -rxkb_option_first(struct rxkb_option_group *group); - -/** - * Return the next option for this option group. Returns NULL when no more - * options are available. - * - * The refcount of the returned options is not increased. Use rxkb_option_ref() - * if you need to keep this struct outside the immediate scope. - * - * @returns The next option or NULL at the end of the list - */ -struct rxkb_option * -rxkb_option_next(struct rxkb_option *o); - -/** - * Increase the refcount of the argument by one. - * - * @returns The argument passed in to this function. - */ -struct rxkb_option * -rxkb_option_ref(struct rxkb_option *o); - -/** - * Decrease the refcount of the argument by one. When the refcount hits zero, - * all memory associated with this struct is freed. - * - * @returns always NULL - */ -struct rxkb_option * -rxkb_option_unref(struct rxkb_option *o); - -/** - * Return the name of this option. This is the value for O in RMLVO, to be used - * with libxkbcommon. - */ -const char * -rxkb_option_get_name(struct rxkb_option *o); - -/** - * Return a short (one-word) description of this option. This function may - * return NULL. - */ -const char * -rxkb_option_get_brief(struct rxkb_option *o); - -/** - * Return a human-readable description of this option. This function may return - * NULL. - */ -const char * -rxkb_option_get_description(struct rxkb_option *o); - -/** - * Return the popularity for this option. - */ -enum rxkb_popularity -rxkb_option_get_popularity(struct rxkb_option *o); - -/** - * Increase the refcount of the argument by one. - * - * @returns The argument passed in to this function. - */ -struct rxkb_iso639_code * -rxkb_iso639_code_ref(struct rxkb_iso639_code *iso639); - -/** - * Decrease the refcount of the argument by one. When the refcount hits zero, - * all memory associated with this struct is freed. - * - * @returns always NULL - */ -struct rxkb_iso639_code * -rxkb_iso639_code_unref(struct rxkb_iso639_code *iso639); - -/** - * Return the ISO 639-3 code for this code (e.g. "eng", "fra"). - */ -const char * -rxkb_iso639_code_get_code(struct rxkb_iso639_code *iso639); - -/** - * Return the first ISO 639 for this layout. Use this to start iterating over - * the codes, followed by calls to rxkb_iso639_code_next(). Codes are not - * sorted. - * - * The refcount of the returned code is not increased. Use rxkb_iso639_code_ref() - * if you need to keep this struct outside the immediate scope. - * - * @return The first code in the code list. - */ -struct rxkb_iso639_code * -rxkb_layout_get_iso639_first(struct rxkb_layout *layout); - -/** - * Return the next code in the list. Returns NULL when no more codes - * are available. - * - * The refcount of the returned codes is not increased. Use - * rxkb_iso639_code_ref() if you need to keep this struct outside the immediate - * scope. - * - * @returns The next code or NULL at the end of the list - */ -struct rxkb_iso639_code * -rxkb_iso639_code_next(struct rxkb_iso639_code *iso639); - -/** - * Increase the refcount of the argument by one. - * - * @returns The argument passed in to this function. - */ -struct rxkb_iso3166_code * -rxkb_iso3166_code_ref(struct rxkb_iso3166_code *iso3166); - -/** - * Decrease the refcount of the argument by one. When the refcount hits zero, - * all memory associated with this struct is freed. - * - * @returns always NULL - */ -struct rxkb_iso3166_code * -rxkb_iso3166_code_unref(struct rxkb_iso3166_code *iso3166); - -/** - * Return the ISO 3166 Alpha 2 code for this code (e.g. "US", "FR"). - */ -const char * -rxkb_iso3166_code_get_code(struct rxkb_iso3166_code *iso3166); - -/** - * Return the first ISO 3166 for this layout. Use this to start iterating over - * the codes, followed by calls to rxkb_iso3166_code_next(). Codes are not - * sorted. - * - * The refcount of the returned code is not increased. Use - * rxkb_iso3166_code_ref() if you need to keep this struct outside the immediate - * scope. - * - * @return The first code in the code list. - */ -struct rxkb_iso3166_code * -rxkb_layout_get_iso3166_first(struct rxkb_layout *layout); - -/** - * Return the next code in the list. Returns NULL when no more codes - * are available. - * - * The refcount of the returned codes is not increased. Use - * rxkb_iso3166_code_ref() if you need to keep this struct outside the immediate - * scope. - * - * @returns The next code or NULL at the end of the list - */ -struct rxkb_iso3166_code * -rxkb_iso3166_code_next(struct rxkb_iso3166_code *iso3166); - -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* _XKBREGISTRY_H_ */ -- cgit v1.2.3