aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorHaibo Huang <hhb@google.com>2020-09-08 17:10:03 -0700
committerHaibo Huang <hhb@google.com>2020-09-10 22:20:42 +0000
commitbffa8499cb8ce3cc4366055be8fe62d501d6a8e5 (patch)
tree648dfaada5799a6227dd5f1af43d89ed8d71d96d /test
parente4e474780d90ed6166f7113a7464371baa275007 (diff)
downloadplatform_external_libxkbcommon-master.tar.gz
platform_external_libxkbcommon-master.tar.bz2
platform_external_libxkbcommon-master.zip
Upgrade libxkbcommon to xkbcommon-1.0.0HEADmaster
1. Run meson build locally: meson config -Denable-x11=false -Denable-wayland=false -Denable-docs=false 2. Copy over generated parser.h / parser.c 3. Copy over config.h, and remove defines for not supported functions. Change-Id: Id7f3c822c1d958fa541685344961507bcfa03b17
Diffstat (limited to 'test')
-rw-r--r--test/.gitignore24
-rw-r--r--test/atom.c187
-rw-r--r--test/buffercomp.c92
-rw-r--r--test/common.c358
-rw-r--r--test/compose.c535
-rw-r--r--test/context.c343
-rw-r--r--test/data/.gitattributes1
-rw-r--r--test/data/compat/accessx52
-rw-r--r--test/data/compat/basic49
-rw-r--r--test/data/compat/caps11
-rw-r--r--test/data/compat/complete10
-rw-r--r--test/data/compat/iso999577
-rw-r--r--test/data/compat/ledcaps24
-rw-r--r--test/data/compat/lednum24
-rw-r--r--test/data/compat/ledscroll24
-rw-r--r--test/data/compat/level556
-rw-r--r--test/data/compat/misc122
-rw-r--r--test/data/compat/mousekeys201
-rw-r--r--test/data/compat/pc17
-rw-r--r--test/data/compat/xfree8666
-rw-r--r--test/data/keycodes/aliases99
-rw-r--r--test/data/keycodes/aliases-xkbcommon99
-rw-r--r--test/data/keycodes/empty4
-rw-r--r--test/data/keycodes/evdev314
-rw-r--r--test/data/keycodes/evdev-xkbcommon505
-rw-r--r--test/data/keycodes/xfree86410
-rw-r--r--test/data/keymaps/bad.xkb5
-rw-r--r--test/data/keymaps/basic.xkb6
-rw-r--r--test/data/keymaps/comprehensive-plus-geom.xkb1813
-rw-r--r--test/data/keymaps/divide-by-zero.xkb21
-rw-r--r--test/data/keymaps/host.xkb1669
-rw-r--r--test/data/keymaps/no-aliases.xkb1337
-rw-r--r--test/data/keymaps/no-types.xkb1025
-rw-r--r--test/data/keymaps/quartz.xkb1139
-rw-r--r--test/data/keymaps/stringcomp.data1913
-rw-r--r--test/data/keymaps/syntax-error.xkb1814
-rw-r--r--test/data/keymaps/syntax-error2.xkb7
-rw-r--r--test/data/keymaps/unbound-vmod.xkb1533
-rw-r--r--test/data/rules/base1268
-rw-r--r--test/data/rules/evdev1156
-rw-r--r--test/data/rules/evdev-xkbcommon1092
-rw-r--r--test/data/rules/groups20
-rw-r--r--test/data/rules/inc-dst-loop-twice20
-rw-r--r--test/data/rules/inc-dst-simple18
-rw-r--r--test/data/rules/inc-src-before-after7
-rw-r--r--test/data/rules/inc-src-loop-twice4
-rw-r--r--test/data/rules/inc-src-looped1
-rw-r--r--test/data/rules/inc-src-nested1
-rw-r--r--test/data/rules/inc-src-options10
-rw-r--r--test/data/rules/inc-src-simple4
-rw-r--r--test/data/rules/index28
-rw-r--r--test/data/rules/multiple-options27
-rw-r--r--test/data/rules/simple21
-rw-r--r--test/data/symbols/altwin116
-rw-r--r--test/data/symbols/awesome26
-rw-r--r--test/data/symbols/ca531
-rw-r--r--test/data/symbols/capslock79
-rw-r--r--test/data/symbols/ch217
-rw-r--r--test/data/symbols/ctrl104
-rw-r--r--test/data/symbols/cz255
-rw-r--r--test/data/symbols/de1153
-rw-r--r--test/data/symbols/empty4
-rw-r--r--test/data/symbols/eurosign23
-rw-r--r--test/data/symbols/group469
-rw-r--r--test/data/symbols/il323
-rw-r--r--test/data/symbols/in2207
-rw-r--r--test/data/symbols/inet1909
-rw-r--r--test/data/symbols/keypad624
-rw-r--r--test/data/symbols/kpdl102
-rw-r--r--test/data/symbols/latin256
-rw-r--r--test/data/symbols/level3211
-rw-r--r--test/data/symbols/level5152
-rw-r--r--test/data/symbols/macintosh_vndr/apple141
-rw-r--r--test/data/symbols/macintosh_vndr/us145
-rw-r--r--test/data/symbols/nbsp204
-rw-r--r--test/data/symbols/pc87
-rw-r--r--test/data/symbols/ru961
-rw-r--r--test/data/symbols/rupeesign5
-rw-r--r--test/data/symbols/shift87
-rw-r--r--test/data/symbols/srvr_ctrl110
-rw-r--r--test/data/symbols/terminate7
-rw-r--r--test/data/symbols/us1789
-rwxr-xr-xtest/data/sync.sh69
-rw-r--r--test/data/types/basic30
-rw-r--r--test/data/types/complete9
-rw-r--r--test/data/types/extra158
-rw-r--r--test/data/types/iso999518
-rw-r--r--test/data/types/level5214
-rw-r--r--test/data/types/mousekeys10
-rw-r--r--test/data/types/numpad67
-rw-r--r--test/data/types/pc126
-rw-r--r--test/evdev-scancodes.h587
-rw-r--r--test/filecomp.c69
-rw-r--r--test/keymap.c107
-rw-r--r--test/keyseq.c489
-rw-r--r--test/keysym.c295
-rw-r--r--test/log.c123
-rw-r--r--test/registry.c843
-rw-r--r--test/rules-file-includes.c164
-rw-r--r--test/rules-file.c175
-rw-r--r--test/rulescomp.c205
-rw-r--r--test/state.c745
-rw-r--r--test/stringcomp.c107
-rwxr-xr-xtest/symbols-leak-test.py62
-rw-r--r--test/test.h88
-rwxr-xr-xtest/tool-option-parsing.py312
-rw-r--r--test/utf8.c185
-rw-r--r--test/utils.c56
-rw-r--r--test/x11.c86
-rw-r--r--test/x11comp.c170
-rwxr-xr-xtest/xkeyboard-config-test.py.in199
111 files changed, 37728 insertions, 0 deletions
diff --git a/test/.gitignore b/test/.gitignore
new file mode 100644
index 0000000..def76f0
--- /dev/null
+++ b/test/.gitignore
@@ -0,0 +1,24 @@
+*.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/atom.c b/test/atom.c
new file mode 100644
index 0000000..a2f7541
--- /dev/null
+++ b/test/atom.c
@@ -0,0 +1,187 @@
+/*
+ * Copyright © 2012 Ran Benita <ran234@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "config.h"
+
+#include <time.h>
+
+#include "test.h"
+#include "atom.h"
+
+#define INTERN_LITERAL(table, literal) \
+ atom_intern(table, literal, sizeof(literal) - 1, true)
+
+#define LOOKUP_LITERAL(table, literal) \
+ atom_intern(table, literal, sizeof(literal) - 1, false)
+
+static void
+random_string(char **str_out, size_t *len_out)
+{
+ /* Keep this small, so collisions might happen. */
+ static const char random_chars[] = {
+ 'a', 'b', 'c', 'd', 'e', 'f', 'g'
+ };
+
+ size_t len;
+ char *str;
+
+ len = rand() % 15;
+ str = malloc(len + 1);
+ assert(str);
+
+ for (size_t i = 0; i < len; i++)
+ str[i] = random_chars[rand() % ARRAY_SIZE(random_chars)];
+ /* Don't always terminate it; should work without. */
+ if (rand() % 2 == 0)
+ str[len] = '\0';
+
+ *str_out = str;
+ *len_out = len;
+}
+
+static void
+test_random_strings(void)
+{
+ struct atom_string {
+ xkb_atom_t atom;
+ char *string;
+ size_t len;
+ };
+
+ struct atom_table *table;
+ struct atom_string *arr;
+ int N;
+ xkb_atom_t atom;
+ const char *string;
+
+ table = atom_table_new();
+ assert(table);
+
+ unsigned seed = (unsigned) clock();
+ srand(seed);
+
+ N = 1 + rand() % 100000;
+ arr = calloc(N, sizeof(*arr));
+ assert(arr);
+
+ for (int i = 0; i < N; i++) {
+ random_string(&arr[i].string, &arr[i].len);
+
+ atom = atom_intern(table, arr[i].string, arr[i].len, false);
+ if (atom != XKB_ATOM_NONE) {
+ string = atom_text(table, atom);
+ assert(string);
+
+ if (arr[i].len != strlen(string) ||
+ strncmp(string, arr[i].string, arr[i].len) != 0) {
+ fprintf(stderr, "got a collision, but strings don't match!\n");
+ fprintf(stderr, "existing length %zu, string %s\n",
+ strlen(string), string);
+ fprintf(stderr, "new length %zu, string %.*s\n",
+ arr[i].len, (int) arr[i].len, arr[i].string);
+ fprintf(stderr, "seed: %u\n", seed);
+ assert(false);
+ }
+
+ /* OK, got a real collision. */
+ free(arr[i].string);
+ i--;
+ continue;
+ }
+
+ arr[i].atom = atom_intern(table, arr[i].string, arr[i].len, true);
+ if (arr[i].atom == XKB_ATOM_NONE) {
+ fprintf(stderr, "failed to intern! len: %zu, string: %.*s\n",
+ arr[i].len, (int) arr[i].len, arr[i].string);
+ fprintf(stderr, "seed: %u\n", seed);
+ assert(false);
+ }
+ }
+
+ for (int i = 0; i < N; i++) {
+ string = atom_text(table, arr[i].atom);
+ assert(string);
+
+ if (arr[i].len != strlen(string) ||
+ strncmp(string, arr[i].string, arr[i].len) != 0) {
+ fprintf(stderr, "looked-up string doesn't match!\n");
+ fprintf(stderr, "found length %zu, string %s\n",
+ strlen(string), string);
+ fprintf(stderr, "expected length %zu, string %.*s\n",
+ arr[i].len, (int) arr[i].len, arr[i].string);
+
+ /* Since this is random, we need to dump the failing data,
+ * so we might have some chance to reproduce. */
+ fprintf(stderr, "START dump of arr, N=%d\n", N);
+ for (int j = 0; j < N; j++) {
+ fprintf(stderr, "%u\t\t%zu\t\t%.*s\n", arr[i].atom,
+ arr[i].len, (int) arr[i].len, arr[i].string);
+ }
+ fprintf(stderr, "END\n");
+
+ fprintf(stderr, "seed: %u\n", seed);
+ assert(false);
+ }
+ }
+
+ for (int i = 0; i < N; i++)
+ free(arr[i].string);
+ free(arr);
+ atom_table_free(table);
+}
+
+int
+main(void)
+{
+ struct atom_table *table;
+ xkb_atom_t atom1, atom2, atom3;
+
+ table = atom_table_new();
+ assert(table);
+
+ assert(atom_text(table, XKB_ATOM_NONE) == NULL);
+ assert(atom_intern(table, NULL, 0, false) == XKB_ATOM_NONE);
+
+ atom1 = INTERN_LITERAL(table, "hello");
+ assert(atom1 != XKB_ATOM_NONE);
+ assert(atom1 == LOOKUP_LITERAL(table, "hello"));
+ assert(streq(atom_text(table, atom1), "hello"));
+
+ atom2 = atom_intern(table, "hello", 3, true);
+ assert(atom2 != XKB_ATOM_NONE);
+ assert(atom1 != atom2);
+ assert(streq(atom_text(table, atom2), "hel"));
+ assert(LOOKUP_LITERAL(table, "hel") == atom2);
+ assert(LOOKUP_LITERAL(table, "hell") == XKB_ATOM_NONE);
+ assert(LOOKUP_LITERAL(table, "hello") == atom1);
+
+ atom3 = atom_intern(table, "", 0, true);
+ assert(atom3 != XKB_ATOM_NONE);
+ assert(LOOKUP_LITERAL(table, "") == atom3);
+
+ atom_table_free(table);
+
+ test_random_strings();
+
+ return 0;
+}
diff --git a/test/buffercomp.c b/test/buffercomp.c
new file mode 100644
index 0000000..12b67fe
--- /dev/null
+++ b/test/buffercomp.c
@@ -0,0 +1,92 @@
+/*
+ * Copyright © 2009 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 (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 <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "test.h"
+
+#define DATA_PATH "keymaps/stringcomp.data"
+
+int
+main(int argc, char *argv[])
+{
+ struct xkb_context *ctx = test_get_context(0);
+ struct xkb_keymap *keymap;
+ char *original, *dump;
+
+ assert(ctx);
+
+ /* Load in a prebuilt keymap, make sure we can compile it from memory,
+ * then compare it to make sure we get the same result when dumping it
+ * to a string. */
+ original = test_read_file(DATA_PATH);
+ assert(original);
+
+ keymap = test_compile_buffer(ctx, original, strlen(original));
+ assert(keymap);
+
+ dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_USE_ORIGINAL_FORMAT);
+ assert(dump);
+
+ if (!streq(original, dump)) {
+ fprintf(stderr,
+ "round-trip test failed: dumped map differs from original\n");
+ fprintf(stderr, "path to original file: %s\n",
+ test_get_path(DATA_PATH));
+ fprintf(stderr, "length: dumped %lu, original %lu\n",
+ (unsigned long) strlen(dump),
+ (unsigned long) strlen(original));
+ fprintf(stderr, "dumped map:\n");
+ fprintf(stderr, "%s\n", dump);
+ fflush(stderr);
+ assert(0);
+ }
+
+ free(original);
+ free(dump);
+ xkb_keymap_unref(keymap);
+
+ /* Make sure we can't (falsely claim to) compile an empty string. */
+ keymap = test_compile_buffer(ctx, "", 0);
+ assert(!keymap);
+
+ /* Make sure we can recompile our output for a normal keymap from rules. */
+ keymap = test_compile_rules(ctx, NULL, NULL,
+ "ru,ca,de,us", ",multix,neo,intl", NULL);
+ assert(keymap);
+ dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_USE_ORIGINAL_FORMAT);
+ assert(dump);
+ xkb_keymap_unref(keymap);
+ keymap = test_compile_buffer(ctx, dump, strlen(dump));
+ assert(keymap);
+ xkb_keymap_unref(keymap);
+ free(dump);
+
+ xkb_context_unref(ctx);
+
+ return 0;
+}
diff --git a/test/common.c b/test/common.c
new file mode 100644
index 0000000..c6f6644
--- /dev/null
+++ b/test/common.c
@@ -0,0 +1,358 @@
+/*
+ * Copyright © 2009 Dan Nicholson <dbn.lists@gmail.com>
+ * Copyright © 2012 Intel Corporation
+ * Copyright © 2012 Ran Benita <ran234@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice 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.
+ *
+ * Author: Dan Nicholson <dbn.lists@gmail.com>
+ * Daniel Stone <daniel@fooishbar.org>
+ * Ran Benita <ran234@gmail.com>
+ */
+
+#include "config.h"
+
+#include <limits.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef _MSC_VER
+#include <io.h>
+#include <windows.h>
+#else
+#include <unistd.h>
+#include <termios.h>
+#endif
+
+#include "test.h"
+#include "utils.h"
+
+/*
+ * Test a sequence of keysyms, resulting from a sequence of key presses,
+ * against the keysyms they're supposed to generate.
+ *
+ * - Each test runs with a clean state.
+ * - Each line in the test is made up of:
+ * + A keycode, given as a KEY_* from linux/input.h.
+ * + A direction - DOWN for press, UP for release, BOTH for
+ * immediate press + release, REPEAT to just get the syms.
+ * + A sequence of keysyms that should result from this keypress.
+ *
+ * The vararg format is:
+ * <KEY_*> <DOWN | UP | BOTH> <XKB_KEY_* (zero or more)> <NEXT | FINISH>
+ *
+ * See below for examples.
+ */
+int
+test_key_seq_va(struct xkb_keymap *keymap, va_list ap)
+{
+ struct xkb_state *state;
+
+ xkb_keycode_t kc;
+ int op;
+ xkb_keysym_t keysym;
+
+ const xkb_keysym_t *syms;
+ xkb_keysym_t sym;
+ unsigned int nsyms, i;
+ char ksbuf[64];
+
+ fprintf(stderr, "----\n");
+
+ state = xkb_state_new(keymap);
+ assert(state);
+
+ for (;;) {
+ kc = va_arg(ap, int) + EVDEV_OFFSET;
+ op = va_arg(ap, int);
+
+ nsyms = xkb_state_key_get_syms(state, kc, &syms);
+ if (nsyms == 1) {
+ sym = xkb_state_key_get_one_sym(state, kc);
+ syms = &sym;
+ }
+
+ fprintf(stderr, "got %u syms for keycode %u: [", nsyms, kc);
+
+ if (op == DOWN || op == BOTH)
+ xkb_state_update_key(state, kc, XKB_KEY_DOWN);
+ if (op == UP || op == BOTH)
+ xkb_state_update_key(state, kc, XKB_KEY_UP);
+
+ for (i = 0; i < nsyms; i++) {
+ keysym = va_arg(ap, int);
+ xkb_keysym_get_name(syms[i], ksbuf, sizeof(ksbuf));
+ fprintf(stderr, "%s%s", (i != 0) ? ", " : "", ksbuf);
+
+ if (keysym == FINISH || keysym == NEXT) {
+ xkb_keysym_get_name(syms[i], ksbuf, sizeof(ksbuf));
+ fprintf(stderr, "Did not expect keysym: %s.\n", ksbuf);
+ goto fail;
+ }
+
+ if (keysym != syms[i]) {
+ xkb_keysym_get_name(keysym, ksbuf, sizeof(ksbuf));
+ fprintf(stderr, "Expected keysym: %s. ", ksbuf);;
+ xkb_keysym_get_name(syms[i], ksbuf, sizeof(ksbuf));
+ fprintf(stderr, "Got keysym: %s.\n", ksbuf);;
+ goto fail;
+ }
+ }
+
+ if (nsyms == 0) {
+ keysym = va_arg(ap, int);
+ if (keysym != XKB_KEY_NoSymbol) {
+ xkb_keysym_get_name(keysym, ksbuf, sizeof(ksbuf));
+ fprintf(stderr, "Expected %s, but got no keysyms.\n", ksbuf);
+ goto fail;
+ }
+ }
+
+ fprintf(stderr, "]\n");
+
+ keysym = va_arg(ap, int);
+ if (keysym == NEXT)
+ continue;
+ if (keysym == FINISH)
+ break;
+
+ xkb_keysym_get_name(keysym, ksbuf, sizeof(ksbuf));
+ fprintf(stderr, "Expected keysym: %s. Didn't get it.\n", ksbuf);
+ goto fail;
+ }
+
+ xkb_state_unref(state);
+ return 1;
+
+fail:
+ xkb_state_unref(state);
+ return 0;
+}
+
+int
+test_key_seq(struct xkb_keymap *keymap, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start(ap, keymap);
+ ret = test_key_seq_va(keymap, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+char *
+test_get_path(const char *path_rel)
+{
+ char *path;
+ const char *srcdir;
+
+ srcdir = getenv("top_srcdir");
+ if (!srcdir)
+ srcdir = ".";
+
+ if (path_rel[0] == '/')
+ return strdup(path_rel);
+
+ path = asprintf_safe("%s/test/data%s%s", srcdir,
+ path_rel[0] ? "/" : "", path_rel);
+ if (!path) {
+ fprintf(stderr, "Failed to allocate path for %s\n", path_rel);
+ return NULL;
+ }
+ return path;
+}
+
+char *
+test_read_file(const char *path_rel)
+{
+ struct stat info;
+ char *ret, *tmp, *path;
+ int fd, count, remaining;
+
+ path = test_get_path(path_rel);
+ if (!path)
+ return NULL;
+
+ fd = open(path, O_RDONLY);
+ free(path);
+ if (fd < 0)
+ return NULL;
+
+ if (fstat(fd, &info) != 0) {
+ close(fd);
+ return NULL;
+ }
+
+ ret = malloc(info.st_size + 1);
+ if (!ret) {
+ close(fd);
+ return NULL;
+ }
+
+ remaining = info.st_size;
+ tmp = ret;
+ while ((count = read(fd, tmp, remaining))) {
+ remaining -= count;
+ tmp += count;
+ }
+ ret[info.st_size] = '\0';
+ close(fd);
+
+ if (remaining != 0) {
+ free(ret);
+ return NULL;
+ }
+
+ return ret;
+}
+
+struct xkb_context *
+test_get_context(enum test_context_flags test_flags)
+{
+ enum xkb_context_flags ctx_flags;
+ struct xkb_context *ctx;
+ char *path;
+
+ ctx_flags = XKB_CONTEXT_NO_DEFAULT_INCLUDES;
+ if (test_flags & CONTEXT_ALLOW_ENVIRONMENT_NAMES) {
+ unsetenv("XKB_DEFAULT_RULES");
+ unsetenv("XKB_DEFAULT_MODEL");
+ unsetenv("XKB_DEFAULT_LAYOUT");
+ unsetenv("XKB_DEFAULT_VARIANT");
+ unsetenv("XKB_DEFAULT_OPTIONS");
+ }
+ else {
+ ctx_flags |= XKB_CONTEXT_NO_ENVIRONMENT_NAMES;
+ }
+
+ ctx = xkb_context_new(ctx_flags);
+ if (!ctx)
+ return NULL;
+
+ path = test_get_path("");
+ if (!path) {
+ xkb_context_unref(ctx);
+ return NULL;
+ }
+
+ xkb_context_include_path_append(ctx, path);
+ free(path);
+
+ return ctx;
+}
+
+struct xkb_keymap *
+test_compile_file(struct xkb_context *context, const char *path_rel)
+{
+ struct xkb_keymap *keymap;
+ FILE *file;
+ char *path;
+
+ path = test_get_path(path_rel);
+ if (!path)
+ return NULL;
+
+ file = fopen(path, "rb");
+ if (!file) {
+ fprintf(stderr, "Failed to open path: %s\n", path);
+ free(path);
+ return NULL;
+ }
+ assert(file != NULL);
+
+ keymap = xkb_keymap_new_from_file(context, file,
+ XKB_KEYMAP_FORMAT_TEXT_V1, 0);
+ fclose(file);
+
+ if (!keymap) {
+ fprintf(stderr, "Failed to compile path: %s\n", path);
+ free(path);
+ return NULL;
+ }
+
+ fprintf(stderr, "Successfully compiled path: %s\n", path);
+ free(path);
+
+ return keymap;
+}
+
+struct xkb_keymap *
+test_compile_string(struct xkb_context *context, const char *string)
+{
+ struct xkb_keymap *keymap;
+
+ keymap = xkb_keymap_new_from_string(context, string,
+ XKB_KEYMAP_FORMAT_TEXT_V1, 0);
+ if (!keymap) {
+ fprintf(stderr, "Failed to compile string\n");
+ return NULL;
+ }
+
+ return keymap;
+}
+
+struct xkb_keymap *
+test_compile_buffer(struct xkb_context *context, const char *buf, size_t len)
+{
+ struct xkb_keymap *keymap;
+
+ keymap = xkb_keymap_new_from_buffer(context, buf, len,
+ XKB_KEYMAP_FORMAT_TEXT_V1, 0);
+ if (!keymap) {
+ fprintf(stderr, "Failed to compile keymap from memory buffer\n");
+ return NULL;
+ }
+
+ return keymap;
+}
+
+struct xkb_keymap *
+test_compile_rules(struct xkb_context *context, const char *rules,
+ const char *model, const char *layout,
+ const char *variant, const char *options)
+{
+ struct xkb_keymap *keymap;
+ struct xkb_rule_names rmlvo = {
+ .rules = isempty(rules) ? NULL : rules,
+ .model = isempty(model) ? NULL : model,
+ .layout = isempty(layout) ? NULL : layout,
+ .variant = isempty(variant) ? NULL : variant,
+ .options = isempty(options) ? NULL : options
+ };
+
+ if (!rules && !model && !layout && !variant && !options)
+ keymap = xkb_keymap_new_from_names(context, NULL, 0);
+ else
+ keymap = xkb_keymap_new_from_names(context, &rmlvo, 0);
+
+ if (!keymap) {
+ fprintf(stderr,
+ "Failed to compile RMLVO: '%s', '%s', '%s', '%s', '%s'\n",
+ rules, model, layout, variant, options);
+ return NULL;
+ }
+
+ return keymap;
+}
diff --git a/test/compose.c b/test/compose.c
new file mode 100644
index 0000000..5ba5751
--- /dev/null
+++ b/test/compose.c
@@ -0,0 +1,535 @@
+/*
+ * Copyright © 2014 Ran Benita <ran234@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "config.h"
+
+#include "xkbcommon/xkbcommon-compose.h"
+
+#include "test.h"
+
+static const char *
+compose_status_string(enum xkb_compose_status status)
+{
+ switch (status) {
+ case XKB_COMPOSE_NOTHING:
+ return "nothing";
+ case XKB_COMPOSE_COMPOSING:
+ return "composing";
+ case XKB_COMPOSE_COMPOSED:
+ return "composed";
+ case XKB_COMPOSE_CANCELLED:
+ return "cancelled";
+ }
+
+ return "<invalid-status>";
+}
+
+static const char *
+feed_result_string(enum xkb_compose_feed_result result)
+{
+ switch (result) {
+ case XKB_COMPOSE_FEED_IGNORED:
+ return "ignored";
+ case XKB_COMPOSE_FEED_ACCEPTED:
+ return "accepted";
+ }
+
+ return "<invalid-result>";
+}
+
+/*
+ * Feed a sequence of keysyms to a fresh compose state and test the outcome.
+ *
+ * The varargs consists of lines in the following format:
+ * <input keysym> <expected feed result> <expected status> <expected string> <expected keysym>
+ * Terminated by a line consisting only of XKB_KEY_NoSymbol.
+ */
+static bool
+test_compose_seq_va(struct xkb_compose_table *table, va_list ap)
+{
+ int ret;
+ struct xkb_compose_state *state;
+ char buffer[64];
+
+ state = xkb_compose_state_new(table, XKB_COMPOSE_STATE_NO_FLAGS);
+ assert(state);
+
+ for (int i = 1; ; i++) {
+ xkb_keysym_t input_keysym;
+ enum xkb_compose_feed_result result, expected_result;
+ enum xkb_compose_status status, expected_status;
+ const char *expected_string;
+ xkb_keysym_t keysym, expected_keysym;
+
+ input_keysym = va_arg(ap, xkb_keysym_t);
+ if (input_keysym == XKB_KEY_NoSymbol)
+ break;
+
+ expected_result = va_arg(ap, enum xkb_compose_feed_result);
+ expected_status = va_arg(ap, enum xkb_compose_status);
+ expected_string = va_arg(ap, const char *);
+ expected_keysym = va_arg(ap, xkb_keysym_t);
+
+ result = xkb_compose_state_feed(state, input_keysym);
+
+ if (result != expected_result) {
+ fprintf(stderr, "after feeding %d keysyms:\n", i);
+ fprintf(stderr, "expected feed result: %s\n",
+ feed_result_string(expected_result));
+ fprintf(stderr, "got feed result: %s\n",
+ feed_result_string(result));
+ goto fail;
+ }
+
+ status = xkb_compose_state_get_status(state);
+ if (status != expected_status) {
+ fprintf(stderr, "after feeding %d keysyms:\n", i);
+ fprintf(stderr, "expected status: %s\n",
+ compose_status_string(expected_status));
+ fprintf(stderr, "got status: %s\n",
+ compose_status_string(status));
+ goto fail;
+ }
+
+ ret = xkb_compose_state_get_utf8(state, buffer, sizeof(buffer));
+ if (ret < 0 || (size_t) ret >= sizeof(buffer)) {
+ fprintf(stderr, "after feeding %d keysyms:\n", i);
+ fprintf(stderr, "expected string: %s\n", expected_string);
+ fprintf(stderr, "got error: %d\n", ret);
+ goto fail;
+ }
+ if (!streq(buffer, expected_string)) {
+ fprintf(stderr, "after feeding %d keysyms:\n", i);
+ fprintf(stderr, "expected string: %s\n", strempty(expected_string));
+ fprintf(stderr, "got string: %s\n", buffer);
+ goto fail;
+ }
+
+ keysym = xkb_compose_state_get_one_sym(state);
+ if (keysym != expected_keysym) {
+ fprintf(stderr, "after feeding %d keysyms:\n", i);
+ xkb_keysym_get_name(expected_keysym, buffer, sizeof(buffer));
+ fprintf(stderr, "expected keysym: %s\n", buffer);
+ xkb_keysym_get_name(keysym, buffer, sizeof(buffer));
+ fprintf(stderr, "got keysym (%#x): %s\n", keysym, buffer);
+ goto fail;
+ }
+ }
+
+ xkb_compose_state_unref(state);
+ return true;
+
+fail:
+ xkb_compose_state_unref(state);
+ return false;
+}
+
+static bool
+test_compose_seq(struct xkb_compose_table *table, ...)
+{
+ va_list ap;
+ bool ok;
+ va_start(ap, table);
+ ok = test_compose_seq_va(table, ap);
+ va_end(ap);
+ return ok;
+}
+
+static bool
+test_compose_seq_buffer(struct xkb_context *ctx, const char *buffer, ...)
+{
+ va_list ap;
+ bool ok;
+ struct xkb_compose_table *table;
+ table = xkb_compose_table_new_from_buffer(ctx, buffer, strlen(buffer), "",
+ XKB_COMPOSE_FORMAT_TEXT_V1,
+ XKB_COMPOSE_COMPILE_NO_FLAGS);
+ assert(table);
+ va_start(ap, buffer);
+ ok = test_compose_seq_va(table, ap);
+ va_end(ap);
+ xkb_compose_table_unref(table);
+ return ok;
+}
+
+static void
+test_seqs(struct xkb_context *ctx)
+{
+ struct xkb_compose_table *table;
+ char *path;
+ FILE *file;
+
+ path = test_get_path("compose/en_US.UTF-8/Compose");
+ file = fopen(path, "rb");
+ assert(file);
+ free(path);
+
+ table = xkb_compose_table_new_from_file(ctx, file, "",
+ XKB_COMPOSE_FORMAT_TEXT_V1,
+ XKB_COMPOSE_COMPILE_NO_FLAGS);
+ assert(table);
+ fclose(file);
+
+ 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,
+ XKB_KEY_NoSymbol));
+
+ 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,
+ 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,
+ XKB_KEY_NoSymbol));
+
+ assert(test_compose_seq(table,
+ XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "~", XKB_KEY_asciitilde,
+ XKB_KEY_NoSymbol));
+
+ assert(test_compose_seq(table,
+ XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_space, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "'", XKB_KEY_apostrophe,
+ XKB_KEY_Caps_Lock, XKB_COMPOSE_FEED_IGNORED, XKB_COMPOSE_COMPOSED, "'", XKB_KEY_apostrophe,
+ XKB_KEY_NoSymbol));
+
+ assert(test_compose_seq(table,
+ XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "´", XKB_KEY_acute,
+ XKB_KEY_NoSymbol));
+
+ assert(test_compose_seq(table,
+ XKB_KEY_Multi_key, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_Shift_L, XKB_COMPOSE_FEED_IGNORED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_Caps_Lock, XKB_COMPOSE_FEED_IGNORED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_Control_L, XKB_COMPOSE_FEED_IGNORED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_T, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "@", XKB_KEY_at,
+ XKB_KEY_NoSymbol));
+
+ assert(test_compose_seq(table,
+ XKB_KEY_7, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_a, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_b, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_NoSymbol));
+
+ assert(test_compose_seq(table,
+ XKB_KEY_Multi_key, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_apostrophe, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_7, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_CANCELLED, "", XKB_KEY_NoSymbol,
+ XKB_KEY_7, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_Caps_Lock, XKB_COMPOSE_FEED_IGNORED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_NoSymbol));
+
+ xkb_compose_table_unref(table);
+
+ /* Make sure one-keysym sequences work. */
+ assert(test_compose_seq_buffer(ctx,
+ "<A> : \"foo\" X \n"
+ "<B> <A> : \"baz\" Y \n",
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "foo", XKB_KEY_X,
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "foo", XKB_KEY_X,
+ XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "baz", XKB_KEY_Y,
+ XKB_KEY_NoSymbol));
+
+ /* No sequences at all. */
+ assert(test_compose_seq_buffer(ctx,
+ "",
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_Multi_key, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_NoSymbol));
+
+ /* Only keysym - string derived from keysym. */
+ assert(test_compose_seq_buffer(ctx,
+ "<A> <B> : X \n"
+ "<B> <A> : dollar \n"
+ "<C> : dead_acute \n",
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "X", XKB_KEY_X,
+ XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "$", XKB_KEY_dollar,
+ XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "", XKB_KEY_dead_acute,
+ XKB_KEY_NoSymbol));
+
+ /* Make sure a cancelling keysym doesn't start a new sequence. */
+ assert(test_compose_seq_buffer(ctx,
+ "<A> <B> : X \n"
+ "<C> <D> : Y \n",
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_CANCELLED, "", XKB_KEY_NoSymbol,
+ XKB_KEY_D, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_CANCELLED, "", XKB_KEY_NoSymbol,
+ XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_D, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "Y", XKB_KEY_Y,
+ XKB_KEY_NoSymbol));
+}
+
+static void
+test_conflicting(struct xkb_context *ctx)
+{
+ // new is prefix of old
+ assert(test_compose_seq_buffer(ctx,
+ "<A> <B> <C> : \"foo\" A \n"
+ "<A> <B> : \"bar\" B \n",
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "foo", XKB_KEY_A,
+ XKB_KEY_NoSymbol));
+
+ // old is a prefix of new
+ assert(test_compose_seq_buffer(ctx,
+ "<A> <B> : \"bar\" B \n"
+ "<A> <B> <C> : \"foo\" A \n",
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "foo", XKB_KEY_A,
+ XKB_KEY_NoSymbol));
+
+ // new duplicate of old
+ assert(test_compose_seq_buffer(ctx,
+ "<A> <B> : \"bar\" B \n"
+ "<A> <B> : \"bar\" B \n",
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "bar", XKB_KEY_B,
+ XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_NoSymbol));
+
+ // new same length as old #1
+ assert(test_compose_seq_buffer(ctx,
+ "<A> <B> : \"foo\" A \n"
+ "<A> <B> : \"bar\" B \n",
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "bar", XKB_KEY_B,
+ XKB_KEY_NoSymbol));
+
+ // new same length as old #2
+ assert(test_compose_seq_buffer(ctx,
+ "<A> <B> : \"foo\" A \n"
+ "<A> <B> : \"foo\" B \n",
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "foo", XKB_KEY_B,
+ XKB_KEY_NoSymbol));
+
+ // new same length as old #3
+ assert(test_compose_seq_buffer(ctx,
+ "<A> <B> : \"foo\" A \n"
+ "<A> <B> : \"bar\" A \n",
+ XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "bar", XKB_KEY_A,
+ XKB_KEY_NoSymbol));
+}
+
+static void
+test_state(struct xkb_context *ctx)
+{
+ struct xkb_compose_table *table;
+ struct xkb_compose_state *state;
+ char *path;
+ FILE *file;
+
+ path = test_get_path("compose/en_US.UTF-8/Compose");
+ file = fopen(path, "rb");
+ assert(file);
+ free(path);
+
+ table = xkb_compose_table_new_from_file(ctx, file, "",
+ XKB_COMPOSE_FORMAT_TEXT_V1,
+ XKB_COMPOSE_COMPILE_NO_FLAGS);
+ assert(table);
+ fclose(file);
+
+ state = xkb_compose_state_new(table, XKB_COMPOSE_STATE_NO_FLAGS);
+ assert(state);
+
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING);
+ xkb_compose_state_reset(state);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING);
+ xkb_compose_state_feed(state, XKB_KEY_NoSymbol);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING);
+ xkb_compose_state_feed(state, XKB_KEY_Multi_key);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSING);
+ xkb_compose_state_reset(state);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING);
+ xkb_compose_state_feed(state, XKB_KEY_Multi_key);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSING);
+ xkb_compose_state_feed(state, XKB_KEY_Multi_key);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_CANCELLED);
+ xkb_compose_state_feed(state, XKB_KEY_Multi_key);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSING);
+ xkb_compose_state_feed(state, XKB_KEY_Multi_key);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_CANCELLED);
+ xkb_compose_state_reset(state);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING);
+ xkb_compose_state_feed(state, XKB_KEY_dead_acute);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSING);
+ xkb_compose_state_feed(state, XKB_KEY_A);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSED);
+ xkb_compose_state_reset(state);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING);
+ xkb_compose_state_feed(state, XKB_KEY_dead_acute);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSING);
+ xkb_compose_state_feed(state, XKB_KEY_A);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSED);
+ xkb_compose_state_reset(state);
+ xkb_compose_state_feed(state, XKB_KEY_NoSymbol);
+ assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING);
+
+ xkb_compose_state_unref(state);
+ xkb_compose_table_unref(table);
+}
+
+static void
+test_XCOMPOSEFILE(struct xkb_context *ctx)
+{
+ struct xkb_compose_table *table;
+ char *path;
+
+ path = test_get_path("compose/en_US.UTF-8/Compose");
+ setenv("XCOMPOSEFILE", path, 1);
+ free(path);
+
+ table = xkb_compose_table_new_from_locale(ctx, "blabla",
+ XKB_COMPOSE_COMPILE_NO_FLAGS);
+ assert(table);
+
+ 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,
+ XKB_KEY_NoSymbol));
+
+ xkb_compose_table_unref(table);
+}
+
+static void
+test_modifier_syntax(struct xkb_context *ctx)
+{
+ const char *table_string;
+
+ /* We don't do anything with the modifiers, but make sure we can parse
+ * them. */
+
+ assert(test_compose_seq_buffer(ctx,
+ "None <A> : X \n"
+ "Shift <B> : Y \n"
+ "Ctrl <C> : Y \n"
+ "Alt <D> : Y \n"
+ "Caps <E> : Y \n"
+ "Lock <F> : Y \n"
+ "Shift Ctrl <G> : Y \n"
+ "~Shift <H> : Y \n"
+ "~Shift Ctrl <I> : Y \n"
+ "Shift ~Ctrl <J> : Y \n"
+ "Shift ~Ctrl ~Alt <K> : Y \n"
+ "! Shift <B> : Y \n"
+ "! Ctrl <C> : Y \n"
+ "! Alt <D> : Y \n"
+ "! Caps <E> : Y \n"
+ "! Lock <F> : Y \n"
+ "! Shift Ctrl <G> : Y \n"
+ "! ~Shift <H> : Y \n"
+ "! ~Shift Ctrl <I> : Y \n"
+ "! Shift ~Ctrl <J> : Y \n"
+ "! Shift ~Ctrl ~Alt <K> : Y \n"
+ "<L> ! Shift <M> : Y \n"
+ "None <N> ! Shift <O> : Y \n"
+ "None <P> ! Shift <Q> : Y \n",
+ XKB_KEY_NoSymbol));
+
+ fprintf(stderr, "<START bad input string>\n");
+ table_string =
+ "! None <A> : X \n"
+ "! Foo <B> : X \n"
+ "None ! Shift <C> : X \n"
+ "! ! <D> : X \n"
+ "! ~ <E> : X \n"
+ "! ! <F> : X \n"
+ "! Ctrl ! Ctrl <G> : X \n"
+ "<H> ! : X \n"
+ "<I> None : X \n"
+ "None None <J> : X \n"
+ "<K> : !Shift X \n";
+ assert(!xkb_compose_table_new_from_buffer(ctx, table_string,
+ strlen(table_string), "C",
+ XKB_COMPOSE_FORMAT_TEXT_V1,
+ XKB_COMPOSE_COMPILE_NO_FLAGS));
+ fprintf(stderr, "<END bad input string>\n");
+}
+
+static void
+test_include(struct xkb_context *ctx)
+{
+ char *path, *table_string;
+
+ path = test_get_path("compose/en_US.UTF-8/Compose");
+ assert(path);
+
+ /* We don't have a mechanism to change the include paths like we
+ * have for keymaps. So we must include the full path. */
+ table_string = asprintf_safe("<dead_tilde> <space> : \"foo\" X\n"
+ "include \"%s\"\n"
+ "<dead_tilde> <dead_tilde> : \"bar\" Y\n", path);
+ assert(table_string);
+
+ assert(test_compose_seq_buffer(ctx, table_string,
+ /* No conflict. */
+ XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "´", XKB_KEY_acute,
+
+ /* Comes before - doesn't override. */
+ 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,
+
+ /* Comes after - does override. */
+ XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol,
+ XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "bar", XKB_KEY_Y,
+
+ XKB_KEY_NoSymbol));
+
+ free(path);
+ free(table_string);
+}
+
+int
+main(int argc, char *argv[])
+{
+ struct xkb_context *ctx;
+
+ ctx = test_get_context(CONTEXT_NO_FLAG);
+ assert(ctx);
+
+ test_seqs(ctx);
+ test_conflicting(ctx);
+ test_XCOMPOSEFILE(ctx);
+ test_state(ctx);
+ test_modifier_syntax(ctx);
+ test_include(ctx);
+
+ xkb_context_unref(ctx);
+ return 0;
+}
diff --git a/test/context.c b/test/context.c
new file mode 100644
index 0000000..f91be54
--- /dev/null
+++ b/test/context.c
@@ -0,0 +1,343 @@
+/*
+ * 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 <daniel@fooishbar.org>
+ */
+
+#include "config.h"
+
+#include "test.h"
+#include "context.h"
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#ifdef _MSC_VER
+# include <io.h>
+# include <direct.h>
+# ifndef S_ISDIR
+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+# endif
+#else
+# include <unistd.h>
+#endif
+
+/* keeps a cache of all makedir/maketmpdir directories so we can free and
+ * rmdir them in one go, see unmakedirs() */
+char *dirnames[64];
+int ndirs;
+
+/* keeps a cache of all buffered env vars so we can restore
+ * them in one go, see restore_env() */
+struct env {
+ char *key;
+ char *value;
+} environment[64];
+int nenviron;
+
+static void buffer_env(const char *key)
+{
+ char *v = getenv(key);
+
+ environment[nenviron].key = strdup(key);
+ environment[nenviron].value = v ? strdup(v) : NULL;
+ nenviron++;
+}
+
+static void restore_env(void)
+{
+ for (int i = 0; i < nenviron; i++) {
+ char *key = environment[i].key,
+ *value = environment[i].value;
+
+ if (value)
+ setenv(key, value, 1);
+ else
+ unsetenv(key);
+
+ free(key);
+ free(value);
+ }
+ nenviron = 0;
+ memset(environment, 0, sizeof(environment));
+}
+
+static const char *makedir(const char *parent, const char *path)
+{
+ char *dirname;
+ int err;
+
+ dirname = asprintf_safe("%s/%s", parent, path);
+ assert(dirname);
+ err = mkdir(dirname, 0777);
+ assert(err == 0);
+
+ dirnames[ndirs++] = dirname;
+
+ return dirname;
+}
+
+static const char *maketmpdir(void)
+{
+ const char *template = "/tmp/xkbcommon-test.XXXXXX";
+ char *tmpdir = strdup(template);
+
+ tmpdir = mkdtemp(tmpdir);
+ assert(tmpdir != NULL);
+
+ dirnames[ndirs++] = tmpdir;
+
+ return tmpdir;
+}
+
+static void unmakedirs(void)
+{
+ /* backwards order for rmdir to work */
+ for (int i = ndirs - 1; i >= 0; i--) {
+ char *dir = dirnames[i];
+ if (!dir)
+ break;
+ rmdir(dir);
+ free(dir);
+ }
+ ndirs = 0;
+ memset(dirnames, 0, sizeof(dirnames));
+}
+
+static void
+test_config_root_include_path(void)
+{
+ struct xkb_context *ctx;
+ const char *tmpdir;
+ const char *context_path;
+ int nincludes;
+
+ buffer_env("XKB_CONFIG_ROOT");
+ buffer_env("HOME");
+ buffer_env("XDG_CONFIG_HOME");
+
+ tmpdir = maketmpdir();
+ setenv("XKB_CONFIG_ROOT", tmpdir, 1);
+ unsetenv("HOME");
+ unsetenv("XDG_CONFIG_HOME");
+
+ /* built-in path is last */
+ ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+ nincludes = xkb_context_num_include_paths(ctx);
+ assert(nincludes >= 1);
+ context_path = xkb_context_include_path_get(ctx, nincludes - 1);
+ assert(strcmp(context_path, tmpdir) == 0);
+ xkb_context_unref(ctx);
+
+ unmakedirs();
+ restore_env();
+}
+
+static void
+test_config_root_include_path_fallback(void)
+{
+ struct xkb_context *ctx;
+ const char *xkbdir = DFLT_XKB_CONFIG_ROOT;
+ const char *context_path;
+ int nincludes;
+
+ /* quick and dirty check that the default directory exists.
+ * It may not on a vanilla test box if we just run the test
+ * suite, so where it's not there just skip this test. */
+ struct stat stat_buf;
+ int err = stat(xkbdir, &stat_buf);
+ if (err != 0)
+ return;
+ if (!S_ISDIR(stat_buf.st_mode))
+ return;
+
+ buffer_env("XKB_CONFIG_ROOT");
+ buffer_env("HOME");
+ buffer_env("XDG_CONFIG_HOME");
+
+ unsetenv("XKB_CONFIG_ROOT");
+ unsetenv("HOME");
+ unsetenv("XDG_CONFIG_HOME");
+
+ /* built-in path is last */
+ ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+ nincludes = xkb_context_num_include_paths(ctx);
+ assert(nincludes >= 1);
+ context_path = xkb_context_include_path_get(ctx, nincludes - 1);
+ assert(strcmp(context_path, xkbdir) == 0);
+ xkb_context_unref(ctx);
+
+ unmakedirs();
+ restore_env();
+}
+
+static void
+test_xkbdir_include_path(void)
+{
+ struct xkb_context *ctx;
+ const char *tmpdir;
+ const char *xkb_path;
+ const char *context_path;
+
+ buffer_env("HOME");
+ buffer_env("XDG_CONFIG_HOME");
+
+ tmpdir = maketmpdir();
+ xkb_path = makedir(tmpdir, ".xkb");
+ setenv("HOME", tmpdir, 1);
+ setenv("XDG_CONFIG_HOME", tmpdir, 1);
+
+ /* No XDG directory in our tmpdir, so we expect
+ * the $HOME/.xkb to be the first include path */
+ ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+ assert(xkb_context_num_include_paths(ctx) >= 1);
+ context_path = xkb_context_include_path_get(ctx, 0);
+ assert(strcmp(context_path, xkb_path) == 0);
+ xkb_context_unref(ctx);
+
+ unmakedirs();
+ restore_env();
+}
+
+static void
+test_xdg_include_path(void)
+{
+ struct xkb_context *ctx;
+ const char *tmpdir;
+ const char *xdg_path;
+ const char *context_path;
+
+ buffer_env("XDG_CONFIG_HOME");
+
+ tmpdir = maketmpdir();
+ xdg_path = makedir(tmpdir, "xkb");
+ setenv("XDG_CONFIG_HOME", tmpdir, 1);
+
+ /* XDG path is always first */
+ ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+ assert(xkb_context_num_include_paths(ctx) >= 1);
+ context_path = xkb_context_include_path_get(ctx, 0);
+ assert(strcmp(context_path, xdg_path) == 0);
+ xkb_context_unref(ctx);
+
+ unmakedirs();
+ restore_env();
+}
+
+static void
+test_xdg_include_path_fallback(void)
+{
+ struct xkb_context *ctx;
+ const char *tmpdir;
+ const char *xdg_root, *xdg_path;
+ const char *context_path;
+
+ buffer_env("XDG_CONFIG_HOME");
+ buffer_env("HOME");
+
+ tmpdir = maketmpdir();
+ xdg_root = makedir(tmpdir, ".config");
+ xdg_path = makedir(xdg_root, "xkb");
+ setenv("HOME", tmpdir, 1);
+ unsetenv("XDG_CONFIG_HOME");
+
+ /* XDG path is always first, even if fallback */
+ ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+ assert(xkb_context_num_include_paths(ctx) >= 1);
+ context_path = xkb_context_include_path_get(ctx, 0);
+ assert(strcmp(context_path, xdg_path) == 0);
+ xkb_context_unref(ctx);
+
+ unmakedirs();
+ restore_env();
+}
+
+static void
+test_include_order(void)
+{
+ struct xkb_context *ctx;
+ const char *tmpdir;
+ const char *xdg_path;
+ const char *xkb_home_path;
+ const char *xkb_root_path;
+ const char *context_path;
+
+ buffer_env("XKB_CONFIG_ROOT");
+ buffer_env("XDG_CONFIG_HOME");
+ buffer_env("HOME");
+
+ tmpdir = maketmpdir();
+ xdg_path = makedir(tmpdir, "xkb");
+ xkb_home_path = makedir(tmpdir, ".xkb");
+ xkb_root_path = makedir(tmpdir, "xkbroot");
+ setenv("HOME", tmpdir, 1);
+ setenv("XDG_CONFIG_HOME", tmpdir, 1);
+ setenv("XKB_CONFIG_ROOT", xkb_root_path, 1);
+
+ ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+ assert(xkb_context_num_include_paths(ctx) >= 3);
+ /* XDG is first */
+ context_path = xkb_context_include_path_get(ctx, 0);
+ assert(strcmp(context_path, xdg_path) == 0);
+ /* $HOME/.xkb is second */
+ context_path = xkb_context_include_path_get(ctx, 1);
+ assert(strcmp(context_path, xkb_home_path) == 0);
+ /* CONFIG_ROOT is last */
+ context_path = xkb_context_include_path_get(ctx, 2);
+ assert(strcmp(context_path, xkb_root_path) == 0);
+
+ xkb_context_unref(ctx);
+
+ unmakedirs();
+ restore_env();
+}
+
+int
+main(void)
+{
+ struct xkb_context *context = test_get_context(0);
+ xkb_atom_t atom;
+
+ assert(context);
+
+ assert(xkb_context_num_include_paths(context) == 1);
+ assert(!xkb_context_include_path_append(context, "¡NONSENSE!"));
+ assert(xkb_context_num_include_paths(context) == 1);
+
+ atom = xkb_atom_intern(context, "HELLOjunkjunkjunk", 5);
+ assert(atom != XKB_ATOM_NONE);
+ assert(streq(xkb_atom_text(context, atom), "HELLO"));
+
+ atom = xkb_atom_intern_literal(context, "HELLOjunkjunkjunk");
+ assert(atom != XKB_ATOM_NONE);
+ assert(streq(xkb_atom_text(context, atom), "HELLOjunkjunkjunk"));
+
+ xkb_context_unref(context);
+
+ test_config_root_include_path();
+ test_config_root_include_path_fallback();
+ test_xkbdir_include_path();
+ test_xdg_include_path();
+ test_xdg_include_path_fallback();
+ test_include_order();
+
+ return 0;
+}
diff --git a/test/data/.gitattributes b/test/data/.gitattributes
new file mode 100644
index 0000000..fae8897
--- /dev/null
+++ b/test/data/.gitattributes
@@ -0,0 +1 @@
+* eol=lf
diff --git a/test/data/compat/accessx b/test/data/compat/accessx
new file mode 100644
index 0000000..6dd6ca9
--- /dev/null
+++ b/test/data/compat/accessx
@@ -0,0 +1,52 @@
+default partial xkb_compatibility "basic" {
+ interpret AccessX_Enable {
+ action= LockControls(controls=AccessXKeys);
+ };
+};
+
+partial xkb_compatibility "full" {
+
+ interpret AccessX_Enable {
+ action= LockControls(controls=AccessXKeys);
+ };
+
+ interpret AccessX_Feedback_Enable {
+ action= LockControls(controls=AccessXFeedback);
+ };
+
+ interpret RepeatKeys_Enable {
+ action= LockControls(controls=RepeatKeys);
+ };
+
+ interpret SlowKeys_Enable {
+ action= LockControls(controls=SlowKeys);
+ };
+
+ interpret BounceKeys_Enable {
+ action= LockControls(controls=BounceKeys);
+ };
+
+ interpret StickyKeys_Enable {
+ action= LockControls(controls=StickyKeys);
+ };
+
+ interpret MouseKeys_Enable {
+ action= LockControls(controls=MouseKeys);
+ };
+
+ interpret MouseKeys_Accel_Enable {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+
+ interpret Overlay1_Enable {
+ action= LockControls(controls=Overlay1);
+ };
+
+ interpret Overlay2_Enable {
+ action= LockControls(controls=Overlay2);
+ };
+
+ interpret AudibleBell_Enable {
+ action= LockControls(controls=AudibleBell);
+ };
+};
diff --git a/test/data/compat/basic b/test/data/compat/basic
new file mode 100644
index 0000000..745cbba
--- /dev/null
+++ b/test/data/compat/basic
@@ -0,0 +1,49 @@
+// Minimal set of symbol interpretations to provide
+// reasonable default behavior (Num lock, Shift lock,
+// Caps lock, and Mode switch) and set up the
+// automatic updating of common keyboard LEDs.
+
+default xkb_compatibility "basic" {
+
+ virtual_modifiers NumLock,AltGr;
+
+ interpret.repeat= False;
+ setMods.clearLocks= True;
+ latchMods.clearLocks= True;
+ latchMods.latchToLock= True;
+
+ interpret Shift_Lock+AnyOf(Shift+Lock) {
+ action= LockMods(modifiers=Shift);
+ };
+
+ interpret Any+Lock {
+ action= LockMods(modifiers=Lock);
+ };
+
+ interpret Num_Lock+Any {
+ virtualModifier= NumLock;
+ action= LockMods(modifiers=NumLock);
+ };
+
+ interpret Mode_switch {
+ useModMapMods= level1;
+ virtualModifier= AltGr;
+ action= SetGroup(group=+1);
+ };
+
+ interpret Any + Any {
+ action= SetMods(modifiers=modMapMods);
+ };
+
+ group 2 = AltGr;
+ group 3 = AltGr;
+ group 4 = AltGr;
+
+ include "ledcaps"
+ include "lednum"
+ indicator "Shift Lock" {
+ !allowExplicit;
+ whichModState= Locked;
+ modifiers= Shift;
+ };
+};
diff --git a/test/data/compat/caps b/test/data/compat/caps
new file mode 100644
index 0000000..4793051
--- /dev/null
+++ b/test/data/compat/caps
@@ -0,0 +1,11 @@
+partial xkb_compatibility "caps_lock" {
+ // Keysym Caps_Lock locks the Lock modifier.
+ // With this definition, the keysym Caps_Lock can be used without binding
+ // the whole key to a real modifier. This is essential when you don't
+ // want to use Caps_Lock on the first level.
+ // This should not have any compatibility issues when used together with
+ // other layouts which don't utilize this capability.
+ interpret Caps_Lock {
+ action = LockMods(modifiers = Lock);
+ };
+};
diff --git a/test/data/compat/complete b/test/data/compat/complete
new file mode 100644
index 0000000..8f77538
--- /dev/null
+++ b/test/data/compat/complete
@@ -0,0 +1,10 @@
+default xkb_compatibility "complete" {
+ include "basic"
+ augment "iso9995"
+ augment "mousekeys"
+ augment "accessx(full)"
+ augment "misc"
+ augment "xfree86"
+ augment "level5"
+ augment "caps(caps_lock)"
+};
diff --git a/test/data/compat/iso9995 b/test/data/compat/iso9995
new file mode 100644
index 0000000..0f3025b
--- /dev/null
+++ b/test/data/compat/iso9995
@@ -0,0 +1,77 @@
+// Fairly complete set of symbol interpretations
+// to provide reasonable default behavior.
+
+default partial xkb_compatibility "default" {
+
+ virtual_modifiers LevelThree,AltGr;
+
+ interpret.repeat= False;
+ setMods.clearLocks= True;
+ latchMods.clearLocks= True;
+ latchMods.latchToLock= True;
+
+ interpret ISO_Level2_Latch+Shift {
+ useModMapMods= level1;
+ action= LatchMods(modifiers=Shift);
+ };
+
+ interpret ISO_Level3_Shift+Any {
+ useModMapMods= level1;
+ virtualModifier= LevelThree;
+ action= SetMods(modifiers=LevelThree);
+ };
+
+ interpret ISO_Level3_Shift {
+ action= SetMods(modifiers=LevelThree);
+ };
+
+ interpret ISO_Level3_Latch+Any {
+ useModMapMods= level1;
+ virtualModifier= LevelThree;
+ action= LatchMods(modifiers=LevelThree);
+ };
+
+ interpret ISO_Level3_Latch {
+ action= LatchMods(modifiers=LevelThree);
+ };
+
+ interpret ISO_Level3_Lock+Any {
+ useModMapMods= level1;
+ virtualModifier= LevelThree;
+ action= LockMods(modifiers=LevelThree);
+ };
+
+ interpret ISO_Level3_Lock {
+ action= LockMods(modifiers=LevelThree);
+ };
+
+ interpret ISO_Group_Latch {
+ useModMapMods= level1;
+ virtualModifier= AltGr;
+ action= LatchGroup(group=2);
+ };
+
+ interpret ISO_Next_Group {
+ useModMapMods= level1;
+ virtualModifier= AltGr;
+ action= LockGroup(group=+1);
+ };
+
+ interpret ISO_Prev_Group {
+ useModMapMods= level1;
+ virtualModifier= AltGr;
+ action= LockGroup(group=-1);
+ };
+ interpret ISO_First_Group {
+ action= LockGroup(group=1);
+ };
+
+ interpret ISO_Last_Group {
+ action= LockGroup(group=2);
+ };
+
+ indicator "Group 2" {
+ !allowExplicit;
+ groups= All-Group1;
+ };
+};
diff --git a/test/data/compat/ledcaps b/test/data/compat/ledcaps
new file mode 100644
index 0000000..f1460ba
--- /dev/null
+++ b/test/data/compat/ledcaps
@@ -0,0 +1,24 @@
+// Use the Caps Lock LED to show either
+// Caps Lock, Group, or Shift Lock state.
+
+default partial xkb_compatibility "caps_lock" {
+ indicator "Caps Lock" {
+ !allowExplicit;
+ whichModState= Locked;
+ modifiers= Lock;
+ };
+};
+
+partial xkb_compatibility "group_lock" {
+ indicator "Caps Lock" {
+ modifiers= None;
+ groups=All-group1;
+ };
+};
+
+partial xkb_compatibility "shift_lock" {
+ indicator "Caps Lock" {
+ whichModState= Locked;
+ modifiers= Shift;
+ };
+};
diff --git a/test/data/compat/lednum b/test/data/compat/lednum
new file mode 100644
index 0000000..bfdcd74
--- /dev/null
+++ b/test/data/compat/lednum
@@ -0,0 +1,24 @@
+// Use the Num Lock LED to show either
+// Num Lock, Group, or Shift Lock state.
+
+default partial xkb_compatibility "num_lock" {
+ indicator "Num Lock" {
+ !allowExplicit;
+ whichModState= Locked;
+ modifiers= NumLock;
+ };
+};
+
+partial xkb_compatibility "group_lock" {
+ indicator "Num Lock" {
+ modifiers= None;
+ groups=All-group1;
+ };
+};
+
+partial xkb_compatibility "shift_lock" {
+ indicator "Num Lock" {
+ whichModState= Locked;
+ modifiers= Shift;
+ };
+};
diff --git a/test/data/compat/ledscroll b/test/data/compat/ledscroll
new file mode 100644
index 0000000..a241698
--- /dev/null
+++ b/test/data/compat/ledscroll
@@ -0,0 +1,24 @@
+// Use the Scroll Lock LED to show either
+// Scroll Lock, Group, or Shift Lock state.
+
+default partial xkb_compatibility "scroll_lock" {
+ indicator "Scroll Lock" {
+ allowExplicit;
+ whichModState= Locked;
+ modifiers= ScrollLock;
+ };
+};
+
+partial xkb_compatibility "group_lock" {
+ indicator "Scroll Lock" {
+ modifiers= None;
+ groups=All-group1;
+ };
+};
+
+partial xkb_compatibility "shift_lock" {
+ indicator "Scroll Lock" {
+ whichModState= Locked;
+ modifiers= Shift;
+ };
+};
diff --git a/test/data/compat/level5 b/test/data/compat/level5
new file mode 100644
index 0000000..54f749d
--- /dev/null
+++ b/test/data/compat/level5
@@ -0,0 +1,56 @@
+// Fairly complete set of symbol interpretations
+// to provide reasonable default behavior.
+
+default partial xkb_compatibility "default" {
+
+ virtual_modifiers LevelFive;
+
+ interpret.repeat= False;
+ setMods.clearLocks= True;
+ latchMods.clearLocks= True;
+ latchMods.latchToLock= True;
+
+ interpret ISO_Level5_Shift+Any {
+ useModMapMods= level1;
+ virtualModifier= LevelFive;
+ action= SetMods(modifiers=LevelFive);
+ };
+
+ interpret ISO_Level5_Shift {
+ action= SetMods(modifiers=LevelFive);
+ };
+
+ interpret ISO_Level5_Latch+Any {
+ useModMapMods= level1;
+ virtualModifier= LevelFive;
+ action= LatchMods(modifiers=LevelFive);
+ };
+
+ interpret ISO_Level5_Latch {
+ action= LatchMods(modifiers=LevelFive);
+ };
+
+ interpret ISO_Level5_Lock+Any {
+ useModMapMods= level1;
+ virtualModifier= LevelFive;
+ action= LockMods(modifiers=LevelFive);
+ };
+
+ interpret ISO_Level5_Lock {
+ action= LockMods(modifiers=LevelFive);
+ };
+};
+
+partial xkb_compatibility "level5_lock" {
+ // This defines a Level5-Lock using the NumLock real modifier
+ // in order to create arbitrary level-behaviour, which would
+ // not be possible with the virtual modifier.
+ // See also: types/level5 : EIGHT_LEVEL_LEVEL_FIVE_LOCK
+ // See also: symbols/level5(lock)
+
+ virtual_modifiers NumLock;
+
+ interpret ISO_Level5_Lock {
+ action = LockMods(modifiers = NumLock);
+ };
+};
diff --git a/test/data/compat/misc b/test/data/compat/misc
new file mode 100644
index 0000000..964f471
--- /dev/null
+++ b/test/data/compat/misc
@@ -0,0 +1,122 @@
+default partial xkb_compatibility "misc" {
+
+ virtual_modifiers Alt,Meta,Super,Hyper,ScrollLock;
+
+ // Interpretations for some other useful keys.
+
+ interpret Terminate_Server {
+ action = Terminate();
+ };
+
+ setMods.clearLocks= True;
+
+ // Sets the "Alt" virtual modifier.
+
+ interpret Alt_L+Any {
+ //useModMapMods= level1;
+ virtualModifier= Alt;
+ action = SetMods(modifiers=modMapMods);
+ };
+
+ interpret Alt_L {
+ action = SetMods(modifiers=Alt);
+ };
+
+ interpret Alt_R+Any {
+ //useModMapMods= level1;
+ virtualModifier= Alt;
+ action = SetMods(modifiers=modMapMods);
+ };
+
+ interpret Alt_R {
+ action = SetMods(modifiers=Alt);
+ };
+
+ // Sets the "Meta" virtual modifier.
+
+ interpret Meta_L+Any {
+ //useModMapMods= level1;
+ virtualModifier= Meta;
+ action = SetMods(modifiers=modMapMods);
+ };
+
+ interpret Meta_L {
+ action = SetMods(modifiers=Meta);
+ };
+
+ interpret Meta_R+Any {
+ //useModMapMods= level1;
+ virtualModifier= Meta;
+ action = SetMods(modifiers=modMapMods);
+ };
+
+ interpret Meta_R {
+ action = SetMods(modifiers=Meta);
+ };
+
+ // Sets the "Super" virtual modifier.
+
+ interpret Super_L+Any {
+ //useModMapMods= level1;
+ virtualModifier= Super;
+ action = SetMods(modifiers=modMapMods);
+ };
+
+ interpret Super_L {
+ action = SetMods(modifiers=Super);
+ };
+
+ interpret Super_R+Any {
+ //useModMapMods= level1;
+ virtualModifier= Super;
+ action = SetMods(modifiers=modMapMods);
+ };
+
+ interpret Super_R {
+ action = SetMods(modifiers=Super);
+ };
+
+ // Sets the "Hyper" virtual modifier.
+
+ interpret Hyper_L+Any {
+ //useModMapMods= level1;
+ virtualModifier= Hyper;
+ action = SetMods(modifiers=modMapMods);
+ };
+
+ interpret Hyper_L {
+ action = SetMods(modifiers=Hyper);
+ };
+
+ interpret Hyper_R+Any {
+ //useModMapMods= level1;
+ virtualModifier= Hyper;
+ action = SetMods(modifiers=modMapMods);
+ };
+
+ interpret Hyper_R {
+ action = SetMods(modifiers=Hyper);
+ };
+
+ // Sets the "ScrollLock" virtual modifier and
+ // makes it actually lock when pressed. Sets
+ // up a map for the scroll lock indicator.
+ interpret Scroll_Lock+Any {
+ virtualModifier= ScrollLock;
+ action = LockMods(modifiers=modMapMods);
+ };
+
+ include "ledscroll"
+
+ include "misc(assign_shift_left_action)"
+};
+
+partial xkb_compatibility "assign_shift_left_action" {
+ // Because of the irrevertable modifier mapping in symbols/pc,
+ // <LFSH> is getting bound to the Lock modifier when using
+ // symbols/shift(both_capslock), creating unwanted behaviour.
+ // This is a quirk, to circumvent the problem.
+ interpret Shift_L {
+ action = SetMods(modifiers = Shift);
+ };
+};
diff --git a/test/data/compat/mousekeys b/test/data/compat/mousekeys
new file mode 100644
index 0000000..6b96fbc
--- /dev/null
+++ b/test/data/compat/mousekeys
@@ -0,0 +1,201 @@
+// Interpretations for arrow keys and a bunch of
+// other common keysyms which make it possible to
+// bind "mouse" keys using xmodmap and activate or
+// deactivate them from the keyboard.
+
+default partial xkb_compatibility "mousekeys" {
+
+ // Keypad actions.
+
+ interpret.repeat= True;
+
+ interpret KP_1 {
+ action = MovePtr(x=-1,y= +1);
+ };
+ interpret KP_End {
+ action = MovePtr(x=-1,y= +1);
+ };
+
+ interpret KP_2 {
+ action = MovePtr(x=+0,y= +1);
+ };
+ interpret KP_Down {
+ action = MovePtr(x=+0,y= +1);
+ };
+
+ interpret KP_3 {
+ action = MovePtr(x=+1,y=+1);
+ };
+ interpret KP_Next {
+ action = MovePtr(x=+1,y=+1);
+ };
+
+ interpret KP_4 {
+ action = MovePtr(x=-1,y=+0);
+ };
+ interpret KP_Left {
+ action = MovePtr(x=-1,y=+0);
+ };
+
+ interpret KP_6 {
+ action = MovePtr(x=+1,y=+0);
+ };
+ interpret KP_Right {
+ action = MovePtr(x=+1,y=+0);
+ };
+
+ interpret KP_7 {
+ action = MovePtr(x=-1,y=-1);
+ };
+ interpret KP_Home {
+ action = MovePtr(x=-1,y=-1);
+ };
+
+ interpret KP_8 {
+ action = MovePtr(x=+0,y=-1);
+ };
+ interpret KP_Up {
+ action = MovePtr(x=+0,y=-1);
+ };
+
+ interpret KP_9 {
+ action = MovePtr(x=+1,y=-1);
+ };
+ interpret KP_Prior {
+ action = MovePtr(x=+1,y=-1);
+ };
+
+ interpret KP_5 {
+ action = PointerButton(button=default);
+ };
+ interpret KP_Begin {
+ action = PointerButton(button=default);
+ };
+
+ interpret KP_F2 {
+ action = SetPtrDflt(affect=defaultButton,button=1);
+ };
+ interpret KP_Divide {
+ action = SetPtrDflt(affect=defaultButton,button=1);
+ };
+
+ interpret KP_F3 {
+ action = SetPtrDflt(affect=defaultButton,button=2);
+ };
+ interpret KP_Multiply {
+ action = SetPtrDflt(affect=defaultButton,button=2);
+ };
+
+ interpret KP_F4 {
+ action = SetPtrDflt(affect=defaultButton,button=3);
+ };
+ interpret KP_Subtract {
+ action = SetPtrDflt(affect=defaultButton,button=3);
+ };
+
+ interpret KP_Separator {
+ action = PointerButton(button=default,count=2);
+ };
+ interpret KP_Add {
+ action = PointerButton(button=default,count=2);
+ };
+
+ interpret KP_0 {
+ action = LockPointerButton(button=default,affect=lock);
+ };
+ interpret KP_Insert {
+ action = LockPointerButton(button=default,affect=lock);
+ };
+
+ interpret KP_Decimal {
+ action = LockPointerButton(button=default,affect=unlock);
+ };
+ interpret KP_Delete {
+ action = LockPointerButton(button=default,affect=unlock);
+ };
+
+ // Additional mappings for Solaris keypad compatibility.
+
+ interpret F25 { // aka KP_Divide
+ action = SetPtrDflt(affect=defaultButton,button=1);
+ };
+ interpret F26 { // aka KP_Multiply
+ action = SetPtrDflt(affect=defaultButton,button=2);
+ };
+ interpret F27 { // aka KP_Home
+ action = MovePtr(x=-1,y=-1);
+ };
+ interpret F29 { // aka KP_Prior
+ action = MovePtr(x=+1,y=-1);
+ };
+ interpret F31 { // aka KP_Begin
+ action = PointerButton(button=default);
+ };
+ interpret F33 { // aka KP_End
+ action = MovePtr(x=-1,y= +1);
+ };
+ interpret F35 { // aka KP_Next
+ action = MovePtr(x=+1,y=+1);
+ };
+
+ interpret.repeat= False;
+
+ // New keysym actions.
+
+ interpret Pointer_Button_Dflt {
+ action= PointerButton(button=default);
+ };
+ interpret Pointer_Button1 {
+ action= PointerButton(button=1);
+ };
+ interpret Pointer_Button2 {
+ action= PointerButton(button=2);
+ };
+ interpret Pointer_Button3 {
+ action= PointerButton(button=3);
+ };
+ interpret Pointer_DblClick_Dflt {
+ action= PointerButton(button=default,count=2);
+ };
+ interpret Pointer_DblClick1 {
+ action= PointerButton(button=1,count=2);
+ };
+ interpret Pointer_DblClick2 {
+ action= PointerButton(button=2,count=2);
+ };
+ interpret Pointer_DblClick3 {
+ action= PointerButton(button=3,count=2);
+ };
+ interpret Pointer_Drag_Dflt {
+ action= LockPointerButton(button=default);
+ };
+ interpret Pointer_Drag1 {
+ action= LockPointerButton(button=1);
+ };
+ interpret Pointer_Drag2 {
+ action= LockPointerButton(button=2);
+ };
+ interpret Pointer_Drag3 {
+ action= LockPointerButton(button=3);
+ };
+
+ interpret Pointer_EnableKeys {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret Pointer_Accelerate {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Pointer_DfltBtnNext {
+ action= SetPtrDflt(affect=defaultButton,button= +1);
+ };
+ interpret Pointer_DfltBtnPrev {
+ action= SetPtrDflt(affect=defaultButton,button= -1);
+ };
+
+ // Allow an indicator for MouseKeys.
+ indicator "Mouse Keys" {
+ //!allowExplicit;
+ indicatorDrivesKeyboard;
+ controls= MouseKeys;
+ };
+};
diff --git a/test/data/compat/pc b/test/data/compat/pc
new file mode 100644
index 0000000..f69b54d
--- /dev/null
+++ b/test/data/compat/pc
@@ -0,0 +1,17 @@
+default partial xkb_compatibility "pc" {
+
+ // Sets the "Alt" virtual modifier.
+
+ virtual_modifiers Alt;
+
+ setMods.clearLocks= True;
+ interpret Alt_L+Any {
+ virtualModifier= Alt;
+ action = SetMods(modifiers=modMapMods);
+ };
+
+ interpret Alt_R+Any {
+ virtualModifier= Alt;
+ action = SetMods(modifiers=modMapMods);
+ };
+};
diff --git a/test/data/compat/xfree86 b/test/data/compat/xfree86
new file mode 100644
index 0000000..cc43819
--- /dev/null
+++ b/test/data/compat/xfree86
@@ -0,0 +1,66 @@
+// XFree86 special keysyms.
+
+default partial xkb_compatibility "basic" {
+
+ interpret.repeat= True;
+
+ interpret XF86_Switch_VT_1 {
+ action = SwitchScreen(Screen=1, !SameServer);
+ };
+ interpret XF86_Switch_VT_2 {
+ action = SwitchScreen(Screen=2, !SameServer);
+ };
+ interpret XF86_Switch_VT_3 {
+ action = SwitchScreen(Screen=3, !SameServer);
+ };
+ interpret XF86_Switch_VT_4 {
+ action = SwitchScreen(Screen=4, !SameServer);
+ };
+ interpret XF86_Switch_VT_5 {
+ action = SwitchScreen(Screen=5, !SameServer);
+ };
+ interpret XF86_Switch_VT_6 {
+ action = SwitchScreen(Screen=6, !SameServer);
+ };
+ interpret XF86_Switch_VT_7 {
+ action = SwitchScreen(Screen=7, !SameServer);
+ };
+ interpret XF86_Switch_VT_8 {
+ action = SwitchScreen(Screen=8, !SameServer);
+ };
+ interpret XF86_Switch_VT_9 {
+ action = SwitchScreen(Screen=9, !SameServer);
+ };
+ interpret XF86_Switch_VT_10 {
+ action = SwitchScreen(Screen=10, !SameServer);
+ };
+ interpret XF86_Switch_VT_11 {
+ action = SwitchScreen(Screen=11, !SameServer);
+ };
+ interpret XF86_Switch_VT_12 {
+ action = SwitchScreen(Screen=12, !SameServer);
+ };
+
+ interpret XF86LogGrabInfo {
+ action = Private(type=0x86, data="PrGrbs");
+ };
+ interpret XF86LogWindowTree {
+ action = Private(type=0x86, data="PrWins");
+ };
+
+ interpret XF86_Next_VMode {
+ action = Private(type=0x86, data="+VMode");
+ };
+ interpret XF86_Prev_VMode {
+ action = Private(type=0x86, data="-VMode");
+ };
+};
+
+partial xkb_compatibility "grab_break" {
+ interpret XF86_Ungrab {
+ action = Private(type=0x86, data="Ungrab");
+ };
+ interpret XF86_ClearGrab {
+ action = Private(type=0x86, data="ClsGrb");
+ };
+};
diff --git a/test/data/keycodes/aliases b/test/data/keycodes/aliases
new file mode 100644
index 0000000..f398772
--- /dev/null
+++ b/test/data/keycodes/aliases
@@ -0,0 +1,99 @@
+
+// keycode aliases for phonetic keyboard maps
+
+default
+xkb_keycodes "qwerty" {
+
+ alias <LatQ> = <AD01>;
+ alias <LatW> = <AD02>;
+ alias <LatE> = <AD03>;
+ alias <LatR> = <AD04>;
+ alias <LatT> = <AD05>;
+ alias <LatY> = <AD06>;
+ alias <LatU> = <AD07>;
+ alias <LatI> = <AD08>;
+ alias <LatO> = <AD09>;
+ alias <LatP> = <AD10>;
+
+ alias <LatA> = <AC01>;
+ alias <LatS> = <AC02>;
+ alias <LatD> = <AC03>;
+ alias <LatF> = <AC04>;
+ alias <LatG> = <AC05>;
+ alias <LatH> = <AC06>;
+ alias <LatJ> = <AC07>;
+ alias <LatK> = <AC08>;
+ alias <LatL> = <AC09>;
+
+ alias <LatZ> = <AB01>;
+ alias <LatX> = <AB02>;
+ alias <LatC> = <AB03>;
+ alias <LatV> = <AB04>;
+ alias <LatB> = <AB05>;
+ alias <LatN> = <AB06>;
+ alias <LatM> = <AB07>;
+};
+
+xkb_keycodes "azerty" {
+
+ alias <LatA> = <AD01>;
+ alias <LatZ> = <AD02>;
+ alias <LatE> = <AD03>;
+ alias <LatR> = <AD04>;
+ alias <LatT> = <AD05>;
+ alias <LatY> = <AD06>;
+ alias <LatU> = <AD07>;
+ alias <LatI> = <AD08>;
+ alias <LatO> = <AD09>;
+ alias <LatP> = <AD10>;
+
+ alias <LatQ> = <AC01>;
+ alias <LatS> = <AC02>;
+ alias <LatD> = <AC03>;
+ alias <LatF> = <AC04>;
+ alias <LatG> = <AC05>;
+ alias <LatH> = <AC06>;
+ alias <LatJ> = <AC07>;
+ alias <LatK> = <AC08>;
+ alias <LatL> = <AC09>;
+ alias <LatM> = <AC10>;
+
+ alias <LatW> = <AB01>;
+ alias <LatX> = <AB02>;
+ alias <LatC> = <AB03>;
+ alias <LatV> = <AB04>;
+ alias <LatB> = <AB05>;
+ alias <LatN> = <AB06>;
+};
+
+xkb_keycodes "qwertz" {
+
+ alias <LatQ> = <AD01>;
+ alias <LatW> = <AD02>;
+ alias <LatE> = <AD03>;
+ alias <LatR> = <AD04>;
+ alias <LatT> = <AD05>;
+ alias <LatZ> = <AD06>;
+ alias <LatU> = <AD07>;
+ alias <LatI> = <AD08>;
+ alias <LatO> = <AD09>;
+ alias <LatP> = <AD10>;
+
+ alias <LatA> = <AC01>;
+ alias <LatS> = <AC02>;
+ alias <LatD> = <AC03>;
+ alias <LatF> = <AC04>;
+ alias <LatG> = <AC05>;
+ alias <LatH> = <AC06>;
+ alias <LatJ> = <AC07>;
+ alias <LatK> = <AC08>;
+ alias <LatL> = <AC09>;
+
+ alias <LatY> = <AB01>;
+ alias <LatX> = <AB02>;
+ alias <LatC> = <AB03>;
+ alias <LatV> = <AB04>;
+ alias <LatB> = <AB05>;
+ alias <LatN> = <AB06>;
+ alias <LatM> = <AB07>;
+};
diff --git a/test/data/keycodes/aliases-xkbcommon b/test/data/keycodes/aliases-xkbcommon
new file mode 100644
index 0000000..96a17ab
--- /dev/null
+++ b/test/data/keycodes/aliases-xkbcommon
@@ -0,0 +1,99 @@
+
+// keycode aliases for phonetic keyboard maps
+
+default
+xkb_keycodes "qwerty" {
+
+ alias <LatQ> = <Q>;
+ alias <LatW> = <W>;
+ alias <LatE> = <E>;
+ alias <LatR> = <R>;
+ alias <LatT> = <T>;
+ alias <LatY> = <Y>;
+ alias <LatU> = <U>;
+ alias <LatI> = <I>;
+ alias <LatO> = <O>;
+ alias <LatP> = <P>;
+
+ alias <LatA> = <A>;
+ alias <LatS> = <S>;
+ alias <LatD> = <D>;
+ alias <LatF> = <F>;
+ alias <LatG> = <G>;
+ alias <LatH> = <H>;
+ alias <LatJ> = <J>;
+ alias <LatK> = <K>;
+ alias <LatL> = <L>;
+
+ alias <LatZ> = <Z>;
+ alias <LatX> = <X>;
+ alias <LatC> = <C>;
+ alias <LatV> = <V>;
+ alias <LatB> = <B>;
+ alias <LatN> = <N>;
+ alias <LatM> = <M>;
+};
+
+xkb_keycodes "azerty" {
+
+ alias <LatA> = <Q>;
+ alias <LatZ> = <W>;
+ alias <LatE> = <E>;
+ alias <LatR> = <R>;
+ alias <LatT> = <T>;
+ alias <LatY> = <Y>;
+ alias <LatU> = <U>;
+ alias <LatI> = <I>;
+ alias <LatO> = <O>;
+ alias <LatP> = <P>;
+
+ alias <LatQ> = <A>;
+ alias <LatS> = <S>;
+ alias <LatD> = <D>;
+ alias <LatF> = <F>;
+ alias <LatG> = <G>;
+ alias <LatH> = <H>;
+ alias <LatJ> = <J>;
+ alias <LatK> = <K>;
+ alias <LatL> = <L>;
+ alias <LatM> = <SEMICOLON>;
+
+ alias <LatW> = <Z>;
+ alias <LatX> = <X>;
+ alias <LatC> = <C>;
+ alias <LatV> = <V>;
+ alias <LatB> = <B>;
+ alias <LatN> = <N>;
+};
+
+xkb_keycodes "qwertz" {
+
+ alias <LatQ> = <Q>;
+ alias <LatW> = <W>;
+ alias <LatE> = <E>;
+ alias <LatR> = <R>;
+ alias <LatT> = <T>;
+ alias <LatZ> = <Y>;
+ alias <LatU> = <U>;
+ alias <LatI> = <I>;
+ alias <LatO> = <O>;
+ alias <LatP> = <P>;
+
+ alias <LatA> = <A>;
+ alias <LatS> = <S>;
+ alias <LatD> = <D>;
+ alias <LatF> = <F>;
+ alias <LatG> = <G>;
+ alias <LatH> = <H>;
+ alias <LatJ> = <J>;
+ alias <LatK> = <K>;
+ alias <LatL> = <L>;
+
+ alias <LatY> = <Z>;
+ alias <LatX> = <X>;
+ alias <LatC> = <C>;
+ alias <LatV> = <V>;
+ alias <LatB> = <B>;
+ alias <LatN> = <N>;
+ alias <LatM> = <M>;
+};
diff --git a/test/data/keycodes/empty b/test/data/keycodes/empty
new file mode 100644
index 0000000..eedc943
--- /dev/null
+++ b/test/data/keycodes/empty
@@ -0,0 +1,4 @@
+default xkb_keycodes "empty" {
+ minimum= 8;
+ maximum= 255;
+};
diff --git a/test/data/keycodes/evdev b/test/data/keycodes/evdev
new file mode 100644
index 0000000..624ac68
--- /dev/null
+++ b/test/data/keycodes/evdev
@@ -0,0 +1,314 @@
+// translation from evdev scancodes to something resembling xfree86 keycodes.
+
+default xkb_keycodes "evdev" {
+ minimum = 8;
+ maximum = 255;
+
+ # Added for pc105 compatibility
+ <LSGT> = 94;
+
+ <TLDE> = 49;
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <BKSL> = 51;
+ alias <AC12> = <BKSL>;
+ <RTRN> = 36;
+
+ <CAPS> = 66;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+
+ <LFSH> = 50;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+
+ <LALT> = 64;
+ <LCTL> = 37;
+ <SPCE> = 65;
+ <RCTL> = 105;
+ <RALT> = 108;
+ // Microsoft keyboard extra keys
+ <LWIN> = 133;
+ <RWIN> = 134;
+ <COMP> = 135;
+ alias <MENU> = <COMP>;
+
+ <ESC> = 9;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <FK11> = 95;
+ <FK12> = 96;
+
+ <PRSC> = 107;
+ // <SYRQ> = 107;
+ <SCLK> = 78;
+ <PAUS> = 127;
+ // <BRK> = 419;
+
+ <INS> = 118;
+ <HOME> = 110;
+ <PGUP> = 112;
+ <DELE> = 119;
+ <END> = 115;
+ <PGDN> = 117;
+
+ <UP> = 111;
+ <LEFT> = 113;
+ <DOWN> = 116;
+ <RGHT> = 114;
+
+ <NMLK> = 77;
+ <KPDV> = 106;
+ <KPMU> = 63;
+ <KPSU> = 82;
+
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPAD> = 86;
+
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KPEN> = 104;
+
+ <KP0> = 90;
+ <KPDL> = 91;
+ <KPEQ> = 125;
+
+ <FK13> = 191;
+ <FK14> = 192;
+ <FK15> = 193;
+ <FK16> = 194;
+ <FK17> = 195;
+ <FK18> = 196;
+ <FK19> = 197;
+ <FK20> = 198;
+ <FK21> = 199;
+ <FK22> = 200;
+ <FK23> = 201;
+ <FK24> = 202;
+
+ // Keys that are generated on Japanese keyboards
+
+ //<HZTG> = 93; // Hankaku/Zenkakau toggle - not actually used
+ alias <HZTG> = <TLDE>;
+ <HKTG> = 101; // Hiragana/Katakana toggle
+ <AB11> = 97; // backslash/underscore
+ <HENK> = 100; // Henkan
+ <MUHE> = 102; // Muhenkan
+ <AE13> = 132; // Yen
+ <KATA> = 98; // Katakana
+ <HIRA> = 99; // Hiragana
+ <JPCM> = 103; // KPJPComma
+ //<RO> = 97; // Romaji
+
+ // Keys that are generated on Korean keyboards
+
+ <HNGL> = 130; // Hangul Latin toggle
+ <HJCV> = 131; // Hangul to Hanja conversion
+
+ // Solaris compatibility
+
+ alias <LMTA> = <LWIN>;
+ alias <RMTA> = <RWIN>;
+ <MUTE> = 121;
+ <VOL-> = 122;
+ <VOL+> = 123;
+ <POWR> = 124;
+ <STOP> = 136;
+ <AGAI> = 137;
+ <PROP> = 138;
+ <UNDO> = 139;
+ <FRNT> = 140;
+ <COPY> = 141;
+ <OPEN> = 142;
+ <PAST> = 143;
+ <FIND> = 144;
+ <CUT> = 145;
+ <HELP> = 146;
+
+ // Extended keys that may be generated on "Internet" keyboards.
+ // evdev has standardize names for these.
+
+ <LNFD> = 109; // #define KEY_LINEFEED 101
+ <I120> = 120; // #define KEY_MACRO 112
+ <I126> = 126; // #define KEY_KPPLUSMINUS 118
+ <I128> = 128; // #define KEY_SCALE 120
+ <I129> = 129; // #define KEY_KPCOMMA 121
+ <I147> = 147; // #define KEY_MENU 139
+ <I148> = 148; // #define KEY_CALC 140
+ <I149> = 149; // #define KEY_SETUP 141
+ <I150> = 150; // #define KEY_SLEEP 142
+ <I151> = 151; // #define KEY_WAKEUP 143
+ <I152> = 152; // #define KEY_FILE 144
+ <I153> = 153; // #define KEY_SENDFILE 145
+ <I154> = 154; // #define KEY_DELETEFILE 146
+ <I155> = 155; // #define KEY_XFER 147
+ <I156> = 156; // #define KEY_PROG1 148
+ <I157> = 157; // #define KEY_PROG2 149
+ <I158> = 158; // #define KEY_WWW 150
+ <I159> = 159; // #define KEY_MSDOS 151
+ <I160> = 160; // #define KEY_COFFEE 152
+ <I161> = 161; // #define KEY_DIRECTION 153
+ <I162> = 162; // #define KEY_CYCLEWINDOWS 154
+ <I163> = 163; // #define KEY_MAIL 155
+ <I164> = 164; // #define KEY_BOOKMARKS 156
+ <I165> = 165; // #define KEY_COMPUTER 157
+ <I166> = 166; // #define KEY_BACK 158
+ <I167> = 167; // #define KEY_FORWARD 159
+ <I168> = 168; // #define KEY_CLOSECD 160
+ <I169> = 169; // #define KEY_EJECTCD 161
+ <I170> = 170; // #define KEY_EJECTCLOSECD 162
+ <I171> = 171; // #define KEY_NEXTSONG 163
+ <I172> = 172; // #define KEY_PLAYPAUSE 164
+ <I173> = 173; // #define KEY_PREVIOUSSONG 165
+ <I174> = 174; // #define KEY_STOPCD 166
+ <I175> = 175; // #define KEY_RECORD 167
+ <I176> = 176; // #define KEY_REWIND 168
+ <I177> = 177; // #define KEY_PHONE 169
+ <I178> = 178; // #define KEY_ISO 170
+ <I179> = 179; // #define KEY_CONFIG 171
+ <I180> = 180; // #define KEY_HOMEPAGE 172
+ <I181> = 181; // #define KEY_REFRESH 173
+ <I182> = 182; // #define KEY_EXIT 174
+ <I183> = 183; // #define KEY_MOVE 175
+ <I184> = 184; // #define KEY_EDIT 176
+ <I185> = 185; // #define KEY_SCROLLUP 177
+ <I186> = 186; // #define KEY_SCROLLDOWN 178
+ <I187> = 187; // #define KEY_KPLEFTPAREN 179
+ <I188> = 188; // #define KEY_KPRIGHTPAREN 180
+ <I189> = 189; // #define KEY_NEW 181
+ <I190> = 190; // #define KEY_REDO 182
+ <I208> = 208; // #define KEY_PLAYCD 200
+ <I209> = 209; // #define KEY_PAUSECD 201
+ <I210> = 210; // #define KEY_PROG3 202
+ <I211> = 211; // #define KEY_PROG4 203 conflicts with AB11
+ <I212> = 212; // #define KEY_DASHBOARD 204
+ <I213> = 213; // #define KEY_SUSPEND 205
+ <I214> = 214; // #define KEY_CLOSE 206
+ <I215> = 215; // #define KEY_PLAY 207
+ <I216> = 216; // #define KEY_FASTFORWARD 208
+ <I217> = 217; // #define KEY_BASSBOOST 209
+ <I218> = 218; // #define KEY_PRINT 210
+ <I219> = 219; // #define KEY_HP 211
+ <I220> = 220; // #define KEY_CAMERA 212
+ <I221> = 221; // #define KEY_SOUND 213
+ <I222> = 222; // #define KEY_QUESTION 214
+ <I223> = 223; // #define KEY_EMAIL 215
+ <I224> = 224; // #define KEY_CHAT 216
+ <I225> = 225; // #define KEY_SEARCH 217
+ <I226> = 226; // #define KEY_CONNECT 218
+ <I227> = 227; // #define KEY_FINANCE 219
+ <I228> = 228; // #define KEY_SPORT 220
+ <I229> = 229; // #define KEY_SHOP 221
+ <I230> = 230; // #define KEY_ALTERASE 222
+ <I231> = 231; // #define KEY_CANCEL 223
+ <I232> = 232; // #define KEY_BRIGHTNESSDOWN 224
+ <I233> = 233; // #define KEY_BRIGHTNESSUP 225
+ <I234> = 234; // #define KEY_MEDIA 226
+ <I235> = 235; // #define KEY_SWITCHVIDEOMODE 227
+ <I236> = 236; // #define KEY_KBDILLUMTOGGLE 228
+ <I237> = 237; // #define KEY_KBDILLUMDOWN 229
+ <I238> = 238; // #define KEY_KBDILLUMUP 230
+ <I239> = 239; // #define KEY_SEND 231
+ <I240> = 240; // #define KEY_REPLY 232
+ <I241> = 241; // #define KEY_FORWARDMAIL 233
+ <I242> = 242; // #define KEY_SAVE 234
+ <I243> = 243; // #define KEY_DOCUMENTS 235
+ <I244> = 244; // #define KEY_BATTERY 236
+ <I245> = 245; // #define KEY_BLUETOOTH 237
+ <I246> = 246; // #define KEY_WLAN 238
+ <I247> = 247; // #define KEY_UWB 239
+ <I248> = 248; // #define KEY_UNKNOWN 240
+ <I249> = 249; // #define KEY_VIDEO_NEXT 241
+ <I250> = 250; // #define KEY_VIDEO_PREV 242
+ <I251> = 251; // #define KEY_BRIGHTNESS_CYCLE 243
+ <I252> = 252; // #define KEY_BRIGHTNESS_ZERO 244
+ <I253> = 253; // #define KEY_DISPLAY_OFF 245
+
+ // Fake keycodes for virtual keys
+ <LVL3> = 92;
+ <MDSW> = 203;
+ <ALT> = 204;
+ <META> = 205;
+ <SUPR> = 206;
+ <HYPR> = 207;
+
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+ indicator 4 = "Compose";
+ indicator 5 = "Kana";
+ indicator 6 = "Sleep";
+ indicator 7 = "Suspend";
+ indicator 8 = "Mute";
+ indicator 9 = "Misc";
+ indicator 10 = "Mail";
+ indicator 11 = "Charging";
+
+ alias <ALGR> = <RALT>;
+
+ // For Brazilian ABNT2
+ alias <KPPT> = <I129>;
+};
+
+// PC98
+xkb_keycodes "pc98" {
+ include "evdev(evdev)"
+};
diff --git a/test/data/keycodes/evdev-xkbcommon b/test/data/keycodes/evdev-xkbcommon
new file mode 100644
index 0000000..5d688fa
--- /dev/null
+++ b/test/data/keycodes/evdev-xkbcommon
@@ -0,0 +1,505 @@
+default xkb_keycodes "evdev" {
+ <ZERO> = 0;
+ <ESC> = 1;
+ <1> = 2;
+ <2> = 3;
+ <3> = 4;
+ <4> = 5;
+ <5> = 6;
+ <6> = 7;
+ <7> = 8;
+ <8> = 9;
+ <9> = 10;
+ <0> = 11;
+ <MINUS> = 12;
+ <EQUAL> = 13;
+ <BACKSPACE> = 14;
+ <TAB> = 15;
+ <Q> = 16;
+ <W> = 17;
+ <E> = 18;
+ <R> = 19;
+ <T> = 20;
+ <Y> = 21;
+ <U> = 22;
+ <I> = 23;
+ <O> = 24;
+ <P> = 25;
+ <LEFTBRACE> = 26;
+ <RIGHTBRACE> = 27;
+ <ENTER> = 28;
+ <LEFTCTRL> = 29;
+ <A> = 30;
+ <S> = 31;
+ <D> = 32;
+ <F> = 33;
+ <G> = 34;
+ <H> = 35;
+ <J> = 36;
+ <K> = 37;
+ <L> = 38;
+ <SEMICOLON> = 39;
+ <APOSTROPHE> = 40;
+ <GRAVE> = 41;
+ <LEFTSHIFT> = 42;
+ <BACKSLASH> = 43;
+ <Z> = 44;
+ <X> = 45;
+ <C> = 46;
+ <V> = 47;
+ <B> = 48;
+ <N> = 49;
+ <M> = 50;
+ <COMMA> = 51;
+ <DOT> = 52;
+ <SLASH> = 53;
+ <RIGHTSHIFT> = 54;
+ <KPASTERISK> = 55;
+ <LEFTALT> = 56;
+ <SPACE> = 57;
+ <CAPSLOCK> = 58;
+ <F1> = 59;
+ <F2> = 60;
+ <F3> = 61;
+ <F4> = 62;
+ <F5> = 63;
+ <F6> = 64;
+ <F7> = 65;
+ <F8> = 66;
+ <F9> = 67;
+ <F10> = 68;
+ <NUMLOCK> = 69;
+ <SCROLLLOCK> = 70;
+ <KP7> = 71;
+ <KP8> = 72;
+ <KP9> = 73;
+ <KPMINUS> = 74;
+ <KP4> = 75;
+ <KP5> = 76;
+ <KP6> = 77;
+ <KPPLUS> = 78;
+ <KP1> = 79;
+ <KP2> = 80;
+ <KP3> = 81;
+ <KP0> = 82;
+ <KPDOT> = 83;
+ <ZENKAKUHANKAKU> = 85;
+ <102ND> = 86;
+ <F11> = 87;
+ <F12> = 88;
+ <RO> = 89;
+ <KATAKANA> = 90;
+ <HIRAGANA> = 91;
+ <HENKAN> = 92;
+ <KATAKANAHIRAGANA> = 93;
+ <MUHENKAN> = 94;
+ <KPJPCOMMA> = 95;
+ <KPENTER> = 96;
+ <RIGHTCTRL> = 97;
+ <KPSLASH> = 98;
+ <SYSRQ> = 99;
+ <RIGHTALT> = 100;
+ <LINEFEED> = 101;
+ <HOME> = 102;
+ <UP> = 103;
+ <PAGEUP> = 104;
+ <LEFT> = 105;
+ <RIGHT> = 106;
+ <END> = 107;
+ <DOWN> = 108;
+ <PAGEDOWN> = 109;
+ <INSERT> = 110;
+ <DELETE> = 111;
+ <MACRO> = 112;
+ <MUTE> = 113;
+ <VOLUMEDOWN> = 114;
+ <VOLUMEUP> = 115;
+ <POWER> = 116;
+ <KPEQUAL> = 117;
+ <KPPLUSMINUS> = 118;
+ <PAUSE> = 119;
+ <SCALE> = 120;
+ <KPCOMMA> = 121;
+ <HANGEUL> = 122;
+ <HANJA> = 123;
+ <YEN> = 124;
+ <LEFTMETA> = 125;
+ <RIGHTMETA> = 126;
+ <COMPOSE> = 127;
+ <STOP> = 128;
+ <AGAIN> = 129;
+ <PROPS> = 130;
+ <UNDO> = 131;
+ <FRONT> = 132;
+ <COPY> = 133;
+ <OPEN> = 134;
+ <PASTE> = 135;
+ <FIND> = 136;
+ <CUT> = 137;
+ <HELP> = 138;
+ <MENU> = 139;
+ <CALC> = 140;
+ <SETUP> = 141;
+ <SLEEP> = 142;
+ <WAKEUP> = 143;
+ <FILE> = 144;
+ <SENDFILE> = 145;
+ <DELETEFILE> = 146;
+ <XFER> = 147;
+ <PROG1> = 148;
+ <PROG2> = 149;
+ <WWW> = 150;
+ <MSDOS> = 151;
+ <COFFEE> = 152;
+ <DIRECTION> = 153;
+ <CYCLEWINDOWS> = 154;
+ <MAIL> = 155;
+ <BOOKMARKS> = 156;
+ <COMPUTER> = 157;
+ <BACK> = 158;
+ <FORWARD> = 159;
+ <CLOSECD> = 160;
+ <EJECTCD> = 161;
+ <EJECTCLOSECD> = 162;
+ <NEXTSONG> = 163;
+ <PLAYPAUSE> = 164;
+ <PREVIOUSSONG> = 165;
+ <STOPCD> = 166;
+ <RECORD> = 167;
+ <REWIND> = 168;
+ <PHONE> = 169;
+ <ISO> = 170;
+ <CONFIG> = 171;
+ <HOMEPAGE> = 172;
+ <REFRESH> = 173;
+ <EXIT> = 174;
+ <MOVE> = 175;
+ <EDIT> = 176;
+ <SCROLLUP> = 177;
+ <SCROLLDOWN> = 178;
+ <KPLEFTPAREN> = 179;
+ <KPRIGHTPAREN> = 180;
+ <NEW> = 181;
+ <REDO> = 182;
+ <F13> = 183;
+ <F14> = 184;
+ <F15> = 185;
+ <F16> = 186;
+ <F17> = 187;
+ <F18> = 188;
+ <F19> = 189;
+ <F20> = 190;
+ <F21> = 191;
+ <F22> = 192;
+ <F23> = 193;
+ <F24> = 194;
+ <PLAYCD> = 200;
+ <PAUSECD> = 201;
+ <PROG3> = 202;
+ <PROG4> = 203;
+ <DASHBOARD> = 204;
+ <SUSPEND> = 205;
+ <CLOSE> = 206;
+ <PLAY> = 207;
+ <FASTFORWARD> = 208;
+ <BASSBOOST> = 209;
+ <PRINT> = 210;
+ <HP> = 211;
+ <CAMERA> = 212;
+ <SOUND> = 213;
+ <QUESTION> = 214;
+ <EMAIL> = 215;
+ <CHAT> = 216;
+ <SEARCH> = 217;
+ <CONNECT> = 218;
+ <FINANCE> = 219;
+ <SPORT> = 220;
+ <SHOP> = 221;
+ <ALTERASE> = 222;
+ <CANCEL> = 223;
+ <BRIGHTNESSDOWN> = 224;
+ <BRIGHTNESSUP> = 225;
+ <MEDIA> = 226;
+ <SWITCHVIDEOMODE> = 227;
+ <KBDILLUMTOGGLE> = 228;
+ <KBDILLUMDOWN> = 229;
+ <KBDILLUMUP> = 230;
+ <SEND> = 231;
+ <REPLY> = 232;
+ <FORWARDMAIL> = 233;
+ <SAVE> = 234;
+ <DOCUMENTS> = 235;
+ <BATTERY> = 236;
+ <BLUETOOTH> = 237;
+ <WLAN> = 238;
+ <UWB> = 239;
+ <UNKNOWN> = 240;
+ <VIDEO_NEXT> = 241;
+ <VIDEO_PREV> = 242;
+ <BRIGHTNESS_CYCLE> = 243;
+ <BRIGHTNESS_ZERO> = 244;
+ <DISPLAY_OFF> = 245;
+ <WIMAX> = 246;
+ <RFKILL> = 247;
+ <MICMUTE> = 248;
+
+ // Fake keycodes for virtual keys
+ <LVL3> = 84;
+ <MDSW> = 195;
+ <ALT> = 196;
+ <META> = 197;
+ <SUPR> = 198;
+ <HYPR> = 199;
+
+ indicator 0x01 = "Num Lock"; // NUML
+ indicator 0x02 = "Caps Lock"; // CAPSL
+ indicator 0x03 = "Scroll Lock"; // SCROLLL
+ indicator 0x04 = "Compose"; // COMPOSE
+ indicator 0x05 = "Kana"; // KANA
+ indicator 0x06 = "Sleep"; // SLEEP
+ indicator 0x07 = "Suspend"; // SUSPEND
+ indicator 0x08 = "Mute"; // MUTE
+ indicator 0x09 = "Misc"; // MISC
+ indicator 0x0a = "Mail"; // MAIL
+ indicator 0x0b = "Charging"; // CHARGING
+
+ alias <TLDE> = <GRAVE>;
+ alias <AE01> = <1>;
+ alias <AE02> = <2>;
+ alias <AE03> = <3>;
+ alias <AE04> = <4>;
+ alias <AE05> = <5>;
+ alias <AE06> = <6>;
+ alias <AE07> = <7>;
+ alias <AE08> = <8>;
+ alias <AE09> = <9>;
+ alias <AE10> = <0>;
+ alias <AE11> = <MINUS>;
+ alias <AE12> = <EQUAL>;
+ alias <BKSP> = <BACKSPACE>;
+
+ alias <AD01> = <Q>;
+ alias <AD02> = <W>;
+ alias <AD03> = <E>;
+ alias <AD04> = <R>;
+ alias <AD05> = <T>;
+ alias <AD06> = <Y>;
+ alias <AD07> = <U>;
+ alias <AD08> = <I>;
+ alias <AD09> = <O>;
+ alias <AD10> = <P>;
+ alias <AD11> = <LEFTBRACE>;
+ alias <AD12> = <RIGHTBRACE>;
+ alias <BKSL> = <BACKSLASH>;
+ alias <AC12> = <BACKSLASH>;
+ alias <RTRN> = <ENTER>;
+
+ alias <CAPS> = <CAPSLOCK>;
+ alias <AC01> = <A>;
+ alias <AC02> = <S>;
+ alias <AC03> = <D>;
+ alias <AC04> = <F>;
+ alias <AC05> = <G>;
+ alias <AC06> = <H>;
+ alias <AC07> = <J>;
+ alias <AC08> = <K>;
+ alias <AC09> = <L>;
+ alias <AC10> = <SEMICOLON>;
+ alias <AC11> = <APOSTROPHE>;
+
+ alias <LFSH> = <LEFTSHIFT>;
+ alias <AB01> = <Z>;
+ alias <AB02> = <X>;
+ alias <AB03> = <C>;
+ alias <AB04> = <V>;
+ alias <AB05> = <B>;
+ alias <AB06> = <N>;
+ alias <AB07> = <M>;
+ alias <AB08> = <COMMA>;
+ alias <AB09> = <DOT>;
+ alias <AB10> = <SLASH>;
+ alias <RTSH> = <RIGHTSHIFT>;
+
+ alias <LALT> = <LEFTALT>;
+ alias <LCTL> = <LEFTCTRL>;
+ alias <SPCE> = <SPACE>;
+ alias <RCTL> = <RIGHTCTRL>;
+ alias <RALT> = <RIGHTALT>;
+ alias <LWIN> = <LEFTMETA>;
+ alias <RWIN> = <RIGHTMETA>;
+ alias <COMP> = <COMPOSE>;
+ alias <MENU> = <COMPOSE>;
+
+ alias <FK01> = <F1>;
+ alias <FK02> = <F2>;
+ alias <FK03> = <F3>;
+ alias <FK04> = <F4>;
+ alias <FK05> = <F5>;
+ alias <FK06> = <F6>;
+ alias <FK07> = <F7>;
+ alias <FK08> = <F8>;
+ alias <FK09> = <F9>;
+ alias <FK10> = <F10>;
+ alias <FK11> = <F11>;
+ alias <FK12> = <F12>;
+
+ alias <PRSC> = <SYSRQ>;
+ alias <SCLK> = <SCROLLLOCK>;
+ alias <PAUS> = <PAUSE>;
+
+ alias <INS> = <INSERT>;
+ alias <PGUP> = <PAGEUP>;
+ alias <DELE> = <DELETE>;
+ alias <PGDN> = <PAGEDOWN>;
+
+ alias <RGHT> = <RIGHT>;
+
+ alias <NMLK> = <NUMLOCK>;
+ alias <KPDV> = <KPSLASH>;
+ alias <KPMU> = <KPASTERISK>;
+ alias <KPSU> = <KPMINUS>;
+
+ alias <KPAD> = <KPPLUS>;
+
+ alias <KPEN> = <KPENTER>;
+
+ alias <KPDL> = <KPDOT>;
+ alias <KPEQ> = <KPEQUAL>;
+
+ alias <FK13> = <F13>;
+ alias <FK14> = <F14>;
+ alias <FK15> = <F15>;
+ alias <FK16> = <F16>;
+ alias <FK17> = <F17>;
+ alias <FK18> = <F18>;
+ alias <FK19> = <F19>;
+ alias <FK20> = <F20>;
+ alias <FK21> = <F21>;
+ alias <FK22> = <F22>;
+ alias <FK23> = <F23>;
+ alias <FK24> = <F24>;
+
+ alias <HZTG> = <APOSTROPHE>;
+ alias <HKTG> = <KATAKANAHIRAGANA>;
+ alias <AB11> = <RO>;
+ alias <HENK> = <HENKAN>;
+ alias <MUHE> = <MUHENKAN>;
+ alias <AE13> = <YEN>;
+ alias <KATA> = <KATAKANA>;
+ alias <HIRA> = <HIRAGANA>;
+ alias <JPCM> = <KPJPCOMMA>;
+
+ alias <HNGL> = <HANGEUL>;
+ alias <HJCV> = <HANJA>;
+
+ alias <LMTA> = <LEFTMETA>;
+ alias <RMTA> = <RIGHTMETA>;
+ alias <VOL-> = <VOLUMEDOWN>;
+ alias <VOL+> = <VOLUMEUP>;
+ alias <POWR> = <POWER>;
+ alias <AGAI> = <AGAIN>;
+ alias <PROP> = <PROPS>;
+ alias <FRNT> = <FRONT>;
+ alias <PAST> = <PASTE>;
+
+ alias <LNFD> = <LINEFEED>;
+ alias <I120> = <MACRO>;
+ alias <I126> = <KPPLUSMINUS>;
+ alias <I128> = <SCALE>;
+ alias <I129> = <KPCOMMA>;
+ alias <I147> = <MENU>;
+ alias <I148> = <CALC>;
+ alias <I149> = <SETUP>;
+ alias <I150> = <SLEEP>;
+ alias <I151> = <WAKEUP>;
+ alias <I152> = <FILE>;
+ alias <I153> = <SENDFILE>;
+ alias <I154> = <DELETEFILE>;
+ alias <I155> = <XFER>;
+ alias <I156> = <PROG1>;
+ alias <I157> = <PROG2>;
+ alias <I158> = <WWW>;
+ alias <I159> = <MSDOS>;
+ alias <I160> = <COFFEE>;
+ alias <I161> = <DIRECTION>;
+ alias <I162> = <CYCLEWINDOWS>;
+ alias <I163> = <MAIL>;
+ alias <I164> = <BOOKMARKS>;
+ alias <I165> = <COMPUTER>;
+ alias <I166> = <BACK>;
+ alias <I167> = <FORWARD>;
+ alias <I168> = <CLOSECD>;
+ alias <I169> = <EJECTCD>;
+ alias <I170> = <EJECTCLOSECD>;
+ alias <I171> = <NEXTSONG>;
+ alias <I172> = <PLAYPAUSE>;
+ alias <I173> = <PREVIOUSSONG>;
+ alias <I174> = <STOPCD>;
+ alias <I175> = <RECORD>;
+ alias <I176> = <REWIND>;
+ alias <I177> = <PHONE>;
+ alias <I178> = <ISO>;
+ alias <I179> = <CONFIG>;
+ alias <I180> = <HOMEPAGE>;
+ alias <I181> = <REFRESH>;
+ alias <I182> = <EXIT>;
+ alias <I183> = <MOVE>;
+ alias <I184> = <EDIT>;
+ alias <I185> = <SCROLLUP>;
+ alias <I186> = <SCROLLDOWN>;
+ alias <I187> = <KPLEFTPAREN>;
+ alias <I188> = <KPRIGHTPAREN>;
+ alias <I189> = <NEW>;
+ alias <I190> = <REDO>;
+ alias <I208> = <PLAYCD>;
+ alias <I209> = <PAUSECD>;
+ alias <I210> = <PROG3>;
+ alias <I211> = <PROG4>;
+ alias <I212> = <DASHBOARD>;
+ alias <I213> = <SUSPEND>;
+ alias <I214> = <CLOSE>;
+ alias <I215> = <PLAY>;
+ alias <I216> = <FASTFORWARD>;
+ alias <I217> = <BASSBOOST>;
+ alias <I218> = <PRINT>;
+ alias <I219> = <HP>;
+ alias <I220> = <CAMERA>;
+ alias <I221> = <SOUND>;
+ alias <I222> = <QUESTION>;
+ alias <I223> = <EMAIL>;
+ alias <I224> = <CHAT>;
+ alias <I225> = <SEARCH>;
+ alias <I226> = <CONNECT>;
+ alias <I227> = <FINANCE>;
+ alias <I228> = <SPORT>;
+ alias <I229> = <SHOP>;
+ alias <I230> = <ALTERASE>;
+ alias <I231> = <CANCEL>;
+ alias <I232> = <BRIGHTNESSDOWN>;
+ alias <I233> = <BRIGHTNESSUP>;
+ alias <I234> = <MEDIA>;
+ alias <I235> = <SWITCHVIDEOMODE>;
+ alias <I236> = <KBDILLUMTOGGLE>;
+ alias <I237> = <KBDILLUMDOWN>;
+ alias <I238> = <KBDILLUMUP>;
+ alias <I239> = <SEND>;
+ alias <I240> = <REPLY>;
+ alias <I241> = <FORWARDMAIL>;
+ alias <I242> = <SAVE>;
+ alias <I243> = <DOCUMENTS>;
+ alias <I244> = <BATTERY>;
+ alias <I245> = <BLUETOOTH>;
+ alias <I246> = <WLAN>;
+ alias <I247> = <UWB>;
+ alias <I248> = <UNKNOWN>;
+ alias <I249> = <VIDEO_NEXT>;
+ alias <I250> = <VIDEO_PREV>;
+ alias <I251> = <BRIGHTNESS_CYCLE>;
+ alias <I252> = <BRIGHTNESS_ZERO>;
+ alias <I253> = <DISPLAY_OFF>;
+
+ alias <ALGR> = <RIGHTALT>;
+
+ // For Brazilian ABNT2
+ alias <KPPT> = <KPCOMMA>;
+};
diff --git a/test/data/keycodes/xfree86 b/test/data/keycodes/xfree86
new file mode 100644
index 0000000..47dc893
--- /dev/null
+++ b/test/data/keycodes/xfree86
@@ -0,0 +1,410 @@
+// "standard" XFree86 codes
+// It seems that the "default" must be the first entry in the file.
+
+default xkb_keycodes "xfree86" {
+ include "xfree86(basic)"
+ <BKSL> = 51;
+ alias <AC12> = <BKSL>;
+ <LSGT> = 94;
+};
+
+xkb_keycodes "basic" {
+
+ minimum= 8;
+ maximum= 255;
+
+ <TLDE> = 49;
+ alias <AE00> = <TLDE>; // Some geometries use AE00
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <RTRN> = 36;
+
+ <CAPS> = 66;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+
+ <LFSH> = 50;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+
+ <LALT> = 64;
+ <LCTL> = 37;
+ <SPCE> = 65;
+ <RCTL> = 109;
+ <RALT> = 113;
+ // Microsoft keyboard extra keys
+ <LWIN> = 115;
+ <RWIN> = 116;
+ <MENU> = 117;
+
+ <ESC> = 9;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <FK11> = 95;
+ <FK12> = 96;
+
+ <PRSC> = 111;
+ <SYRQ> = 92;
+ <SCLK> = 78;
+ <PAUS> = 110;
+ <BRK> = 114;
+
+ <INS> = 106;
+ <HOME> = 97;
+ <PGUP> = 99;
+ <DELE> = 107;
+ <END> = 103;
+ <PGDN> = 105;
+
+ <UP> = 98;
+ <LEFT> = 100;
+ <DOWN> = 104;
+ <RGHT> = 102;
+
+ <NMLK> = 77;
+ <KPDV> = 112;
+ <KPMU> = 63;
+ <KPSU> = 82;
+
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPAD> = 86;
+
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KPEN> = 108;
+
+ <KP0> = 90;
+ <KPDL> = 91;
+ <KPEQ> = 126;
+
+ <FK13> = 118;
+ <FK14> = 119;
+ <FK15> = 120;
+ <FK16> = 121;
+ <FK17> = 122;
+ <KPDC> = 123;
+
+ // Keys that are generated on Japanese keyboards
+
+ alias <HZTG> = <TLDE>; // Hankaku_Zenkaku toggle
+ <HKTG> = 208; // Hiragana_Katakana toggle
+ <AB11> = 211; // backslash/underscore
+ <XFER> = 129; // Henkan
+ <NFER> = 131; // Muhenkan
+ <AE13> = 133; // Yen
+ <EISU> = 210; // Alphanumeric mode on macintosh
+ <KANA> = 209; // Kana mode on macintosh
+
+ // Keys that are generated on Korean keyboards
+
+ alias <HNGL> = <FK16>; // Hangul Latin toggle
+ alias <HJCV> = <FK17>; // Hangul to Hanja conversion
+
+ // Extended keys that may be generated on "Internet" keyboards.
+ // These are not standardised, hence the meaningless names.
+ // The entries commented out are never generated because the raw codes
+ // in those positions are already used for well-defined keys.
+
+ <I02> = 130;
+ <I04> = 132;
+ alias <I05> = <AE13>;
+ <I06> = 134;
+ <I07> = 135;
+ <I08> = 136;
+ <I09> = 137;
+ <I0A> = 138;
+ <I0B> = 139;
+ <I0C> = 140;
+ <I0D> = 141;
+ <I0E> = 142;
+ <I0F> = 143;
+ <I10> = 144;
+ <I11> = 145;
+ <I12> = 146;
+ <I13> = 147;
+ <I14> = 148;
+ <I15> = 149;
+ <I16> = 150;
+ <I17> = 151;
+ <I18> = 152;
+ <I19> = 153;
+ <I1A> = 154;
+ <I1B> = 155;
+ // <I1C> = 156; <META>
+ // <I1D> = 157; <K59>
+ <I1E> = 158;
+ <I1F> = 159;
+ <I20> = 160;
+ <I21> = 161;
+ <I22> = 162;
+ <I23> = 163;
+ <I24> = 164;
+ <I25> = 165;
+ <I26> = 166;
+ <I27> = 167;
+ <I28> = 168;
+ <I29> = 169;
+ // <I2A> = 170; <K5A>
+ <I2B> = 171;
+ <I2C> = 172;
+ <I2D> = 173;
+ <I2E> = 174;
+ <I2F> = 175;
+ <I30> = 176;
+ <I31> = 177;
+ <I32> = 178;
+ <I33> = 179;
+ <I34> = 180;
+ // <I35> = 181; <K5B>
+ // <I36> = 182; <K5D>
+ // <I37> = 183; <K5E>
+ // <I38> = 184; <K5F>
+ <I39> = 185;
+ <I3A> = 186;
+ <I3B> = 187;
+ <I3C> = 188;
+ // <I3D> = 189; <K62>
+ // <I3E> = 190; <K63>
+ // <I3F> = 191; <K64>
+ // <I40> = 192; <K65>
+ // <I41> = 193; <K66>
+ <I42> = 194;
+ <I43> = 195;
+ <I44> = 196;
+ <I45> = 197;
+ // <I46> = 198; <K67>
+ // <I47> = 199; <K68>
+ // <I48> = 200; <K69>
+ // <I49> = 201; <K6A>
+ <I4A> = 202;
+ // <I4B> = 203; <K6B>
+ // <I4C> = 204; <K6C>
+ // <I4D> = 205; <K6D>
+ // <I4E> = 206; <K6E>
+ // <I4F> = 207; <K6F>
+ // <I50> = 208; <K70>
+ // <I51> = 209; <K71>
+ // <I52> = 210; <K72>
+ // <I53> = 211; <K73>
+ <I54> = 212;
+ <I55> = 213;
+ <I56> = 214;
+ <I57> = 215;
+ <I58> = 216;
+ <I59> = 217;
+ <I5A> = 218;
+ // <I5B> = 219; <K74>
+ // <I5C> = 220; <K75>
+ // <I5D> = 221; <K76>
+ <I5E> = 222;
+ <I5F> = 223;
+ <I60> = 224;
+ <I61> = 225;
+ <I62> = 226;
+ <I63> = 227;
+ <I64> = 228;
+ <I65> = 229;
+ <I66> = 230;
+ <I67> = 231;
+ <I68> = 232;
+ <I69> = 233;
+ <I6A> = 234;
+ <I6B> = 235;
+ <I6C> = 236;
+ <I6D> = 237;
+ <I6E> = 238;
+ <I6F> = 239;
+ <I70> = 240;
+ <I71> = 241;
+ <I72> = 242;
+ <I73> = 243;
+ <I74> = 244;
+ <I75> = 245;
+ <I76> = 246;
+ <I77> = 247;
+ <I78> = 248;
+ <I79> = 249;
+ <I7A> = 250;
+ <I7B> = 251;
+ <I7C> = 252;
+ alias <IR7C> = <I7C>;
+ <I7D> = 253;
+ alias <IR7D> = <I7D>;
+ <I7E> = 254;
+ <I7F> = 255;
+
+ // MacBooks generate 0x65 for the lower brightness key
+ <II65> = 101;
+
+ // Required for apple/logitech_g15 keyboard
+ <II5D> = 93;
+
+ // Codes generated for scancodes 0x59-0x5f, 0x62-0x76
+ <K59> = 157; // <I1D>
+ <K5A> = 170; // <I2A>
+ <K5B> = 181; // <I35>
+ alias <K5C> = <KPEQ>;
+ <K5D> = 182; // <I36>
+ <K5E> = 183; // <I37>
+ <K5F> = 184; // <I38>
+ <K62> = 189; // <I3D>
+ <K63> = 190; // <I3E>
+ <K64> = 191; // <I3F>
+ <K65> = 192; // <I40>
+ <K66> = 193; // <I41>
+ <K67> = 198; // <I46>
+ <K68> = 199; // <I47>
+ <K69> = 200; // <I48>
+ <K6A> = 201; // <I49>
+ <K6B> = 203; // <I4B>
+ <K6C> = 204; // <I4C>
+ <K6D> = 205; // <I4D>
+ <K6E> = 206; // <I4E>
+ <K6F> = 207; // <I4F>
+ alias <K70> = <HKTG>; // <I50>
+ alias <K71> = <KANA>; // <I51>
+ alias <K72> = <EISU>; // <I52>
+ alias <K73> = <AB11>; // <I53>
+ <K74> = 219; // <I5B>
+ <K75> = 220; // <I5C>
+ <K76> = 221; // <I5D>
+
+ // Solaris compatibility
+
+ alias <LMTA> = <LWIN>;
+ alias <RMTA> = <RWIN>;
+ alias <COMP> = <MENU>;
+ alias <POWR> = <I0C>;
+ alias <MUTE> = <I0D>;
+ alias <VOL-> = <I0E>;
+ alias <VOL+> = <I0F>;
+ alias <HELP> = <I10>;
+ alias <STOP> = <I11>;
+ alias <AGAI> = <I12>;
+ alias <PROP> = <I13>;
+ alias <UNDO> = <I14>;
+ alias <FRNT> = <I15>;
+ alias <COPY> = <I16>;
+ alias <OPEN> = <I17>;
+ alias <PAST> = <I18>;
+ alias <FIND> = <I19>;
+ alias <CUT> = <I1A>;
+ alias <OUTP> = <I56>;
+ alias <KITG> = <I57>;
+ alias <KIDN> = <I58>;
+ alias <KIUP> = <I59>;
+
+ // Other codes never generated. The XFree86 ddx never generates
+ // these codes.
+ // Thus we can use them as fake keys
+ <MDSW> = 8;
+ <LVL3> = 124; // <U7C>
+ <ALT> = 125; // <U7D>
+ <META> = 156; // <I1C>
+ <SUPR> = 127; // <U7F>
+ <HYPR> = 128; // <U80>
+
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+
+ alias <ALGR> = <RALT>;
+
+ // For Brazilian ABNT2
+ alias <KPPT> = <I06>;
+};
+
+// What keyboard is this?
+
+xkb_keycodes "102" {
+ include "xfree86(xfree86)"
+
+ // There will be warnings from xkbcomp because of multiple definitions.
+
+ <RALT> = 122;
+ <RCTL> = 123;
+
+ <PRSC> = 121;
+ <PAUS> = 118;
+
+ <INS> = 131;
+ <HOME> = 135;
+ <PGUP> = 119;
+ <DELE> = 129;
+ <END> = 130;
+ <PGDN> = 134;
+
+ <UP> = 128;
+ <LEFT> = 132;
+ <DOWN> = 120;
+ <RGHT> = 133;
+
+ <KPDV> = 125;
+
+ <KPEN> = 124;
+};
+
+
+// IBM ThinkPad Z60m/Z60t/Z61m/Z61t
+xkb_keycodes "thinkpadz60" {
+ include "xfree86(xfree86)"
+ <MENU> = 227;
+};
diff --git a/test/data/keymaps/bad.xkb b/test/data/keymaps/bad.xkb
new file mode 100644
index 0000000..f969cbc
--- /dev/null
+++ b/test/data/keymaps/bad.xkb
@@ -0,0 +1,5 @@
+xkb_keymap {
+ xkb_types { include "complete" };
+ xkb_compat { include "complete" };
+ xkb_symbols { include "pc+us" };
+};
diff --git a/test/data/keymaps/basic.xkb b/test/data/keymaps/basic.xkb
new file mode 100644
index 0000000..654aed6
--- /dev/null
+++ b/test/data/keymaps/basic.xkb
@@ -0,0 +1,6 @@
+xkb_keymap {
+ xkb_keycodes { include "evdev+aliases(qwerty)" };
+ xkb_types { include "complete" };
+ xkb_compat { include "complete" };
+ xkb_symbols { include "pc+us" };
+};
diff --git a/test/data/keymaps/comprehensive-plus-geom.xkb b/test/data/keymaps/comprehensive-plus-geom.xkb
new file mode 100644
index 0000000..c9361e9
--- /dev/null
+++ b/test/data/keymaps/comprehensive-plus-geom.xkb
@@ -0,0 +1,1813 @@
+xkb_keymap {
+xkb_keycodes "evdev+aliases(qwerty)" {
+ minimum = 8;
+ maximum = 255;
+ <ESC> = 9;
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <RTRN> = 36;
+ <LCTL> = 37;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+ <TLDE> = 49;
+ <LFSH> = 50;
+ <BKSL> = 51;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+ <KPMU> = 63;
+ <LALT> = 64;
+ <SPCE> = 65;
+ <CAPS> = 66;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <NMLK> = 77;
+ <SCLK> = 78;
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPSU> = 82;
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+ <KPAD> = 86;
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KP0> = 90;
+ <KPDL> = 91;
+ <LVL3> = 92;
+ <LSGT> = 94;
+ <FK11> = 95;
+ <FK12> = 96;
+ <AB11> = 97;
+ <KATA> = 98;
+ <HIRA> = 99;
+ <HENK> = 100;
+ <HKTG> = 101;
+ <MUHE> = 102;
+ <JPCM> = 103;
+ <KPEN> = 104;
+ <RCTL> = 105;
+ <KPDV> = 106;
+ <PRSC> = 107;
+ <RALT> = 108;
+ <LNFD> = 109;
+ <HOME> = 110;
+ <UP> = 111;
+ <PGUP> = 112;
+ <LEFT> = 113;
+ <RGHT> = 114;
+ <END> = 115;
+ <DOWN> = 116;
+ <PGDN> = 117;
+ <INS> = 118;
+ <DELE> = 119;
+ <I120> = 120;
+ <MUTE> = 121;
+ <VOL-> = 122;
+ <VOL+> = 123;
+ <POWR> = 124;
+ <KPEQ> = 125;
+ <I126> = 126;
+ <PAUS> = 127;
+ <I128> = 128;
+ <I129> = 129;
+ <HNGL> = 130;
+ <HJCV> = 131;
+ <AE13> = 132;
+ <LWIN> = 133;
+ <RWIN> = 134;
+ <COMP> = 135;
+ <STOP> = 136;
+ <AGAI> = 137;
+ <PROP> = 138;
+ <UNDO> = 139;
+ <FRNT> = 140;
+ <COPY> = 141;
+ <OPEN> = 142;
+ <PAST> = 143;
+ <FIND> = 144;
+ <CUT> = 145;
+ <HELP> = 146;
+ <I147> = 147;
+ <I148> = 148;
+ <I149> = 149;
+ <I150> = 150;
+ <I151> = 151;
+ <I152> = 152;
+ <I153> = 153;
+ <I154> = 154;
+ <I155> = 155;
+ <I156> = 156;
+ <I157> = 157;
+ <I158> = 158;
+ <I159> = 159;
+ <I160> = 160;
+ <I161> = 161;
+ <I162> = 162;
+ <I163> = 163;
+ <I164> = 164;
+ <I165> = 165;
+ <I166> = 166;
+ <I167> = 167;
+ <I168> = 168;
+ <I169> = 169;
+ <I170> = 170;
+ <I171> = 171;
+ <I172> = 172;
+ <I173> = 173;
+ <I174> = 174;
+ <I175> = 175;
+ <I176> = 176;
+ <I177> = 177;
+ <I178> = 178;
+ <I179> = 179;
+ <I180> = 180;
+ <I181> = 181;
+ <I182> = 182;
+ <I183> = 183;
+ <I184> = 184;
+ <I185> = 185;
+ <I186> = 186;
+ <I187> = 187;
+ <I188> = 188;
+ <I189> = 189;
+ <I190> = 190;
+ <FK13> = 191;
+ <FK14> = 192;
+ <FK15> = 193;
+ <FK16> = 194;
+ <FK17> = 195;
+ <FK18> = 196;
+ <FK19> = 197;
+ <FK20> = 198;
+ <FK21> = 199;
+ <FK22> = 200;
+ <FK23> = 201;
+ <FK24> = 202;
+ <MDSW> = 203;
+ <ALT> = 204;
+ <META> = 205;
+ <SUPR> = 206;
+ <HYPR> = 207;
+ <I208> = 208;
+ <I209> = 209;
+ <I210> = 210;
+ <I211> = 211;
+ <I212> = 212;
+ <I213> = 213;
+ <I214> = 214;
+ <I215> = 215;
+ <I216> = 216;
+ <I217> = 217;
+ <I218> = 218;
+ <I219> = 219;
+ <I220> = 220;
+ <I221> = 221;
+ <I222> = 222;
+ <I223> = 223;
+ <I224> = 224;
+ <I225> = 225;
+ <I226> = 226;
+ <I227> = 227;
+ <I228> = 228;
+ <I229> = 229;
+ <I230> = 230;
+ <I231> = 231;
+ <I232> = 232;
+ <I233> = 233;
+ <I234> = 234;
+ <I235> = 235;
+ <I236> = 236;
+ <I237> = 237;
+ <I238> = 238;
+ <I239> = 239;
+ <I240> = 240;
+ <I241> = 241;
+ <I242> = 242;
+ <I243> = 243;
+ <I244> = 244;
+ <I245> = 245;
+ <I246> = 246;
+ <I247> = 247;
+ <I248> = 248;
+ <I249> = 249;
+ <I250> = 250;
+ <I251> = 251;
+ <I252> = 252;
+ <I253> = 253;
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+ indicator 4 = "Compose";
+ indicator 5 = "Kana";
+ indicator 6 = "Sleep";
+ indicator 7 = "Suspend";
+ indicator 8 = "Mute";
+ indicator 9 = "Misc";
+ indicator 10 = "Mail";
+ indicator 11 = "Charging";
+ virtual indicator 12 = "Shift Lock";
+ virtual indicator 13 = "Group 2";
+ virtual indicator 14 = "Mouse Keys";
+ alias <AC12> = <BKSL>;
+ alias <MENU> = <COMP>;
+ alias <HZTG> = <TLDE>;
+ alias <LMTA> = <LWIN>;
+ alias <RMTA> = <RWIN>;
+ alias <ALGR> = <RALT>;
+ alias <KPPT> = <I129>;
+ alias <LatQ> = <AD01>;
+ alias <LatW> = <AD02>;
+ alias <LatE> = <AD03>;
+ alias <LatR> = <AD04>;
+ alias <LatT> = <AD05>;
+ alias <LatY> = <AD06>;
+ alias <LatU> = <AD07>;
+ alias <LatI> = <AD08>;
+ alias <LatO> = <AD09>;
+ alias <LatP> = <AD10>;
+ alias <LatA> = <AC01>;
+ alias <LatS> = <AC02>;
+ alias <LatD> = <AC03>;
+ alias <LatF> = <AC04>;
+ alias <LatG> = <AC05>;
+ alias <LatH> = <AC06>;
+ alias <LatJ> = <AC07>;
+ alias <LatK> = <AC08>;
+ alias <LatL> = <AC09>;
+ alias <LatZ> = <AB01>;
+ alias <LatX> = <AB02>;
+ alias <LatC> = <AB03>;
+ alias <LatV> = <AB04>;
+ alias <LatB> = <AB05>;
+ alias <LatN> = <AB06>;
+ alias <LatM> = <AB07>;
+};
+
+xkb_types "complete" {
+
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ type "ONE_LEVEL" {
+ modifiers= none;
+ level_name[Level1]= "Any";
+ };
+ type "TWO_LEVEL" {
+ modifiers= Shift;
+ map[Shift]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ };
+ type "ALPHABETIC" {
+ modifiers= Shift+Lock;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Caps";
+ };
+ type "KEYPAD" {
+ modifiers= Shift+NumLock;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ };
+ type "SHIFT+ALT" {
+ modifiers= Shift+Alt;
+ map[Shift+Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift+Alt";
+ };
+ type "PC_CONTROL_LEVEL2" {
+ modifiers= Control;
+ map[Control]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Control";
+ };
+ type "PC_LCONTROL_LEVEL2" {
+ modifiers= LControl;
+ map[LControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LControl";
+ };
+ type "PC_RCONTROL_LEVEL2" {
+ modifiers= RControl;
+ map[RControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RControl";
+ };
+ type "PC_ALT_LEVEL2" {
+ modifiers= Alt;
+ map[Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt";
+ };
+ type "PC_LALT_LEVEL2" {
+ modifiers= LAlt;
+ map[LAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LAlt";
+ };
+ type "PC_RALT_LEVEL2" {
+ modifiers= RAlt;
+ map[RAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RAlt";
+ };
+ type "CTRL+ALT" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Control+Alt]= Level5;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "Ctrl+Alt";
+ };
+ type "LOCAL_EIGHT_LEVEL" {
+ modifiers= Shift+Lock+Control+LevelThree;
+ map[Shift+Lock]= Level1;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Control]= Level5;
+ map[Shift+Lock+Control]= Level5;
+ map[Shift+Control]= Level6;
+ map[Lock+Control]= Level6;
+ map[Control+LevelThree]= Level7;
+ map[Shift+Lock+Control+LevelThree]= Level7;
+ map[Shift+Control+LevelThree]= Level8;
+ map[Lock+Control+LevelThree]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ level_name[Level4]= "Shift Level3";
+ level_name[Level5]= "Ctrl";
+ level_name[Level6]= "Shift Ctrl";
+ level_name[Level7]= "Level3 Ctrl";
+ level_name[Level8]= "Shift Level3 Ctrl";
+ };
+ type "THREE_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ };
+ type "EIGHT_LEVEL" {
+ modifiers= Shift+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level8;
+ map[Shift+Lock+LevelThree+LevelFive]= Level7;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ preserve[Lock+LevelFive]= Lock;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level7;
+ preserve[Lock+LevelThree+LevelFive]= Lock;
+ map[Shift+Lock+LevelThree+LevelFive]= Level8;
+ preserve[Shift+Lock+LevelThree+LevelFive]= Lock;
+ map[Shift+Lock+LevelFive]= Level1;
+ preserve[Shift+Lock+LevelFive]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "FOUR_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_MIXED_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[Shift+NumLock]= Level1;
+ map[NumLock]= Level2;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[NumLock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_X" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[LevelThree]= Level2;
+ map[Shift+LevelThree]= Level3;
+ map[Control+Alt]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt Base";
+ level_name[Level3]= "Shift Alt";
+ level_name[Level4]= "Ctrl+Alt";
+ };
+ type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level4;
+ preserve[Lock]= Lock;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "AltGr Base";
+ level_name[Level4]= "Shift AltGr";
+ };
+ type "FOUR_LEVEL_PLUS_LOCK" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock]= Level5;
+ map[Shift+Lock]= Level2;
+ map[Lock+LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "Lock";
+ };
+ type "FOUR_LEVEL_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[NumLock+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Alt Number";
+ };
+};
+
+xkb_compatibility "complete" {
+
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ interpret.useModMapMods= AnyLevel;
+ interpret.repeat= False;
+ interpret.locking= False;
+ interpret ISO_Level2_Latch+Exactly(Shift) {
+ useModMapMods=level1;
+ action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
+ };
+ interpret Shift_Lock+AnyOf(Shift+Lock) {
+ action= LockMods(modifiers=Shift);
+ };
+ interpret Num_Lock+AnyOf(all) {
+ virtualModifier= NumLock;
+ action= LockMods(modifiers=NumLock);
+ };
+ interpret ISO_Lock+AnyOf(all) {
+ action= ISOLock(modifiers=modMapMods,affect=all);
+ };
+ interpret ISO_Level3_Shift+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret Alt_L+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Alt_R+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_L+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_R+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_L+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_R+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_L+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_R+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Scroll_Lock+AnyOf(all) {
+ virtualModifier= ScrollLock;
+ action= LockMods(modifiers=modMapMods);
+ };
+ interpret ISO_Level5_Shift+AnyOf(all) {
+ virtualModifier= LevelFive;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Mode_switch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= SetGroup(group=+1);
+ };
+ interpret ISO_Level3_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret ISO_Group_Latch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LatchGroup(group=2);
+ };
+ interpret ISO_Next_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=+1);
+ };
+ interpret ISO_Prev_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=-1);
+ };
+ interpret ISO_First_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=1);
+ };
+ interpret ISO_Last_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=2);
+ };
+ interpret KP_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_End+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_Down+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_Next+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_Left+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_Right+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_Home+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_Up+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_Prior+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_Begin+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_F2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_Divide+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_F3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_Multiply+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_F4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Subtract+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Separator+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_Add+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_0+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Insert+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Decimal+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret KP_Delete+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret F25+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret F26+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret F27+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret F29+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret F31+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret F33+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret F35+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret Pointer_Button_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default);
+ };
+ interpret Pointer_Button1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1);
+ };
+ interpret Pointer_Button2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2);
+ };
+ interpret Pointer_Button3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3);
+ };
+ interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret Pointer_DblClick1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1,count=2);
+ };
+ interpret Pointer_DblClick2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2,count=2);
+ };
+ interpret Pointer_DblClick3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3,count=2);
+ };
+ interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=default,affect=both);
+ };
+ interpret Pointer_Drag1+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=1,affect=both);
+ };
+ interpret Pointer_Drag2+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=2,affect=both);
+ };
+ interpret Pointer_Drag3+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=3,affect=both);
+ };
+ interpret Pointer_EnableKeys+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret Pointer_Accelerate+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=+1);
+ };
+ interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=-1);
+ };
+ interpret AccessX_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXKeys);
+ };
+ interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXFeedback);
+ };
+ interpret RepeatKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=RepeatKeys);
+ };
+ interpret SlowKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=SlowKeys);
+ };
+ interpret BounceKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=BounceKeys);
+ };
+ interpret StickyKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=StickyKeys);
+ };
+ interpret MouseKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Overlay1_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=Overlay1);
+ };
+ interpret Overlay2_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=Overlay2);
+ };
+ interpret AudibleBell_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AudibleBell);
+ };
+ interpret Terminate_Server+AnyOfOrNone(all) {
+ action= Terminate();
+ };
+ interpret Alt_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Alt_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Meta_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Meta_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Super_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Super_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Hyper_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Hyper_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Shift_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Shift,clearLocks);
+ };
+ interpret XF86Switch_VT_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=1,!same);
+ };
+ interpret XF86Switch_VT_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=2,!same);
+ };
+ interpret XF86Switch_VT_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=3,!same);
+ };
+ interpret XF86Switch_VT_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=4,!same);
+ };
+ interpret XF86Switch_VT_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=5,!same);
+ };
+ interpret XF86Switch_VT_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=6,!same);
+ };
+ interpret XF86Switch_VT_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=7,!same);
+ };
+ interpret XF86Switch_VT_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=8,!same);
+ };
+ interpret XF86Switch_VT_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=9,!same);
+ };
+ interpret XF86Switch_VT_10+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=10,!same);
+ };
+ interpret XF86Switch_VT_11+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=11,!same);
+ };
+ interpret XF86Switch_VT_12+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=12,!same);
+ };
+ interpret XF86LogGrabInfo+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86LogWindowTree+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86Next_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret XF86Prev_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret ISO_Level5_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Caps_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+Exactly(Lock) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+AnyOf(all) {
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ indicator "Caps Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= Lock;
+ };
+ indicator "Num Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= NumLock;
+ };
+ indicator "Scroll Lock" {
+ whichModState= locked;
+ modifiers= ScrollLock;
+ };
+ indicator "Shift Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= Shift;
+ };
+ indicator "Group 2" {
+ !allowExplicit;
+ groups= 0xfe;
+ };
+ indicator "Mouse Keys" {
+ indicatorDrivesKeyboard;
+ controls= mouseKeys;
+ };
+};
+
+xkb_symbols "pc+us+inet(evdev)+ctrl(nocaps)+compose(rwin)+terminate(ctrl_alt_bksp)" {
+
+ name[group1]="English (US)";
+
+ key <ESC> { [ Escape ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, asciicircum ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSP> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ BackSpace, BackSpace, NoSymbol, NoSymbol, Terminate_Server ]
+ };
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ q, Q ]
+ };
+ key <AD02> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ w, W ]
+ };
+ key <AD03> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ e, E ]
+ };
+ key <AD04> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ r, R ]
+ };
+ key <AD05> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ t, T ]
+ };
+ key <AD06> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ y, Y ]
+ };
+ key <AD07> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ u, U ]
+ };
+ key <AD08> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ i, I ]
+ };
+ key <AD09> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ o, O ]
+ };
+ key <AD10> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ p, P ]
+ };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+ key <RTRN> { [ Return ] };
+ key <LCTL> { [ Control_L ] };
+ key <AC01> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ a, A ]
+ };
+ key <AC02> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ s, S ]
+ };
+ key <AC03> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ d, D ]
+ };
+ key <AC04> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ f, F ]
+ };
+ key <AC05> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ g, G ]
+ };
+ key <AC06> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ h, H ]
+ };
+ key <AC07> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ j, J ]
+ };
+ key <AC08> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ k, K ]
+ };
+ key <AC09> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ l, L ]
+ };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+ key <TLDE> { [ grave, asciitilde ] };
+ key <LFSH> { [ Shift_L ] };
+ key <BKSL> { [ backslash, bar ] };
+ key <AB01> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ z, Z ]
+ };
+ key <AB02> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ x, X ]
+ };
+ key <AB03> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ c, C ]
+ };
+ key <AB04> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ v, V ]
+ };
+ key <AB05> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ b, B ]
+ };
+ key <AB06> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ n, N ]
+ };
+ key <AB07> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ m, M ]
+ };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+ key <RTSH> { [ Shift_R ] };
+ key <KPMU> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ]
+ };
+ key <LALT> { [ Alt_L, Meta_L ] };
+ key <SPCE> { [ space ] };
+ key <CAPS> { [ Control_L, Control_L ] };
+ key <FK01> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ]
+ };
+ key <FK02> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ]
+ };
+ key <FK03> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ]
+ };
+ key <FK04> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ]
+ };
+ key <FK05> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ]
+ };
+ key <FK06> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ]
+ };
+ key <FK07> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ]
+ };
+ key <FK08> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ]
+ };
+ key <FK09> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ]
+ };
+ key <FK10> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ]
+ };
+ key <NMLK> { [ Num_Lock ] };
+ key <SCLK> { [ Scroll_Lock ] };
+ key <KP7> { [ KP_Home, KP_7 ] };
+ key <KP8> { [ KP_Up, KP_8 ] };
+ key <KP9> { [ KP_Prior, KP_9 ] };
+ key <KPSU> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ]
+ };
+ key <KP4> { [ KP_Left, KP_4 ] };
+ key <KP5> { [ KP_Begin, KP_5 ] };
+ key <KP6> { [ KP_Right, KP_6 ] };
+ key <KPAD> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ]
+ };
+ key <KP1> { [ KP_End, KP_1 ] };
+ key <KP2> { [ KP_Down, KP_2 ] };
+ key <KP3> { [ KP_Next, KP_3 ] };
+ key <KP0> { [ KP_Insert, KP_0 ] };
+ key <KPDL> { [ KP_Delete, KP_Decimal ] };
+ key <LVL3> { [ ISO_Level3_Shift ] };
+ key <LSGT> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ less, greater, bar, brokenbar ]
+ };
+ key <FK11> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ]
+ };
+ key <FK12> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ]
+ };
+ key <KATA> { [ Katakana ] };
+ key <HIRA> { [ Hiragana ] };
+ key <HENK> { [ Henkan_Mode ] };
+ key <HKTG> { [ Hiragana_Katakana ] };
+ key <MUHE> { [ Muhenkan ] };
+ key <KPEN> { [ KP_Enter ] };
+ key <RCTL> { [ Control_R ] };
+ key <KPDV> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ]
+ };
+ key <PRSC> {
+ type= "PC_ALT_LEVEL2",
+ symbols[Group1]= [ Print, Sys_Req ]
+ };
+ key <RALT> {
+ type= "TWO_LEVEL",
+ symbols[Group1]= [ Alt_R, Meta_R ]
+ };
+ key <LNFD> { [ Linefeed ] };
+ key <HOME> { [ Home ] };
+ key <UP> { [ Up ] };
+ key <PGUP> { [ Prior ] };
+ key <LEFT> { [ Left ] };
+ key <RGHT> { [ Right ] };
+ key <END> { [ End ] };
+ key <DOWN> { [ Down ] };
+ key <PGDN> { [ Next ] };
+ key <INS> { [ Insert ] };
+ key <DELE> { [ Delete ] };
+ key <MUTE> { [ XF86AudioMute ] };
+ key <VOL-> { [ XF86AudioLowerVolume ] };
+ key <VOL+> { [ XF86AudioRaiseVolume ] };
+ key <POWR> { [ XF86PowerOff ] };
+ key <KPEQ> { [ KP_Equal ] };
+ key <I126> { [ plusminus ] };
+ key <PAUS> {
+ type= "PC_CONTROL_LEVEL2",
+ symbols[Group1]= [ Pause, Break ]
+ };
+ key <I128> { [ XF86LaunchA ] };
+ key <I129> { [ KP_Decimal, KP_Decimal ] };
+ key <HNGL> { [ Hangul ] };
+ key <HJCV> { [ Hangul_Hanja ] };
+ key <LWIN> { [ Super_L ] };
+ key <RWIN> {
+ type= "TWO_LEVEL",
+ symbols[Group1]= [ Multi_key, Multi_key ]
+ };
+ key <COMP> { [ Menu ] };
+ key <STOP> { [ Cancel ] };
+ key <AGAI> { [ Redo ] };
+ key <PROP> { [ SunProps ] };
+ key <UNDO> { [ Undo ] };
+ key <FRNT> { [ SunFront ] };
+ key <COPY> { [ XF86Copy ] };
+ key <OPEN> { [ SunOpen ] };
+ key <PAST> { [ XF86Paste ] };
+ key <FIND> { [ Find ] };
+ key <CUT> { [ XF86Cut ] };
+ key <HELP> { [ Help ] };
+ key <I147> { [ XF86MenuKB ] };
+ key <I148> { [ XF86Calculator ] };
+ key <I150> { [ XF86Sleep ] };
+ key <I151> { [ XF86WakeUp ] };
+ key <I152> { [ XF86Explorer ] };
+ key <I153> { [ XF86Send ] };
+ key <I155> { [ XF86Xfer ] };
+ key <I156> { [ XF86Launch1 ] };
+ key <I157> { [ XF86Launch2 ] };
+ key <I158> { [ XF86WWW ] };
+ key <I159> { [ XF86DOS ] };
+ key <I160> { [ XF86ScreenSaver ] };
+ key <I162> { [ XF86RotateWindows ] };
+ key <I163> { [ XF86Mail ] };
+ key <I164> { [ XF86Favorites ] };
+ key <I165> { [ XF86MyComputer ] };
+ key <I166> { [ XF86Back ] };
+ key <I167> { [ XF86Forward ] };
+ key <I169> { [ XF86Eject ] };
+ key <I170> { [ XF86Eject, XF86Eject ] };
+ key <I171> { [ XF86AudioNext ] };
+ key <I172> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I173> { [ XF86AudioPrev ] };
+ key <I174> { [ XF86AudioStop, XF86Eject ] };
+ key <I175> { [ XF86AudioRecord ] };
+ key <I176> { [ XF86AudioRewind ] };
+ key <I177> { [ XF86Phone ] };
+ key <I179> { [ XF86Tools ] };
+ key <I180> { [ XF86HomePage ] };
+ key <I181> { [ XF86Reload ] };
+ key <I182> { [ XF86Close ] };
+ key <I185> { [ XF86ScrollUp ] };
+ key <I186> { [ XF86ScrollDown ] };
+ key <I187> { [ parenleft ] };
+ key <I188> { [ parenright ] };
+ key <I189> { [ XF86New ] };
+ key <I190> { [ Redo ] };
+ key <FK13> { [ XF86Tools ] };
+ key <FK14> { [ XF86Launch5 ] };
+ key <FK15> { [ XF86Launch6 ] };
+ key <FK16> { [ XF86Launch7 ] };
+ key <FK17> { [ XF86Launch8 ] };
+ key <FK18> { [ XF86Launch9 ] };
+ key <FK21> { [ XF86TouchpadToggle ] };
+ key <FK22> { [ XF86TouchpadOn ] };
+ key <FK23> { [ XF86TouchpadOff ] };
+ key <MDSW> { [ Mode_switch ] };
+ key <ALT> { [ NoSymbol, Alt_L ] };
+ key <META> { [ NoSymbol, Meta_L ] };
+ key <SUPR> { [ NoSymbol, Super_L ] };
+ key <HYPR> { [ NoSymbol, Hyper_L ] };
+ key <I208> { [ XF86AudioPlay ] };
+ key <I209> { [ XF86AudioPause ] };
+ key <I210> { [ XF86Launch3 ] };
+ key <I211> { [ XF86Launch4 ] };
+ key <I212> { [ XF86LaunchB ] };
+ key <I213> { [ XF86Suspend ] };
+ key <I214> { [ XF86Close ] };
+ key <I215> { [ XF86AudioPlay ] };
+ key <I216> { [ XF86AudioForward ] };
+ key <I218> { [ Print ] };
+ key <I220> { [ XF86WebCam ] };
+ key <I223> { [ XF86Mail ] };
+ key <I224> { [ XF86Messenger ] };
+ key <I225> { [ XF86Search ] };
+ key <I226> { [ XF86Go ] };
+ key <I227> { [ XF86Finance ] };
+ key <I228> { [ XF86Game ] };
+ key <I229> { [ XF86Shop ] };
+ key <I231> { [ Cancel ] };
+ key <I232> { [ XF86MonBrightnessDown ] };
+ key <I233> { [ XF86MonBrightnessUp ] };
+ key <I234> { [ XF86AudioMedia ] };
+ key <I235> { [ XF86Display ] };
+ key <I236> { [ XF86KbdLightOnOff ] };
+ key <I237> { [ XF86KbdBrightnessDown ] };
+ key <I238> { [ XF86KbdBrightnessUp ] };
+ key <I239> { [ XF86Send ] };
+ key <I240> { [ XF86Reply ] };
+ key <I241> { [ XF86MailForward ] };
+ key <I242> { [ XF86Save ] };
+ key <I243> { [ XF86Documents ] };
+ key <I244> { [ XF86Battery ] };
+ key <I245> { [ XF86Bluetooth ] };
+ key <I246> { [ XF86WLAN ] };
+ modifier_map Control { <LCTL> };
+ modifier_map Shift { <LFSH> };
+ modifier_map Shift { <RTSH> };
+ modifier_map Mod1 { <LALT> };
+ modifier_map Control { <CAPS> };
+ modifier_map Mod2 { <NMLK> };
+ modifier_map Mod5 { <LVL3> };
+ modifier_map Control { <RCTL> };
+ modifier_map Mod1 { <RALT> };
+ modifier_map Mod4 { <LWIN> };
+ modifier_map Mod5 { <MDSW> };
+ modifier_map Mod1 { <META> };
+ modifier_map Mod4 { <SUPR> };
+ modifier_map Mod4 { <HYPR> };
+};
+
+xkb_geometry "pc(pc105)" {
+
+ width= 470;
+ height= 180;
+
+ alias <AC00> = <CAPS>;
+ alias <AA00> = <LCTL>;
+
+ baseColor= "white";
+ labelColor= "black";
+ xfont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ description= "Generic 105";
+
+ shape "NORM" {
+ corner= 1,
+ { [ 18, 18 ] },
+ { [ 2, 1 ], [ 16, 16 ] }
+ };
+ shape "BKSP" {
+ corner= 1,
+ { [ 38, 18 ] },
+ { [ 2, 1 ], [ 36, 16 ] }
+ };
+ shape "TABK" {
+ corner= 1,
+ { [ 28, 18 ] },
+ { [ 2, 1 ], [ 26, 16 ] }
+ };
+ shape "BKSL" {
+ corner= 1,
+ { [ 28, 18 ] },
+ { [ 2, 1 ], [ 26, 16 ] }
+ };
+ shape "RTRN" {
+ corner= 1,
+ { [ 0, 0 ], [ 28, 0 ], [ 28, 37 ], [ 5, 37 ],
+ [ 5, 18 ], [ 0, 18 ] },
+ { [ 2, 1 ], [ 26, 1 ], [ 26, 35 ], [ 7, 35 ],
+ [ 7, 16 ], [ 2, 16 ] },
+ approx= { [ 5, 0 ], [ 28, 37 ] }
+ };
+ shape "CAPS" {
+ corner= 1,
+ { [ 33, 18 ] },
+ { [ 2, 1 ], [ 31, 16 ] }
+ };
+ shape "LFSH" {
+ corner= 1,
+ { [ 25, 18 ] },
+ { [ 2, 1 ], [ 23, 16 ] }
+ };
+ shape "RTSH" {
+ corner= 1,
+ { [ 50, 18 ] },
+ { [ 2, 1 ], [ 48, 16 ] }
+ };
+ shape "MODK" {
+ corner= 1,
+ { [ 27, 18 ] },
+ { [ 2, 1 ], [ 25, 16 ] }
+ };
+ shape "SMOD" {
+ corner= 1,
+ { [ 23, 18 ] },
+ { [ 2, 1 ], [ 21, 16 ] }
+ };
+ shape "SPCE" {
+ corner= 1,
+ { [ 113, 18 ] },
+ { [ 2, 1 ], [ 111, 16 ] }
+ };
+ shape "KP0" {
+ corner= 1,
+ { [ 37, 18 ] },
+ { [ 2, 1 ], [ 35, 16 ] }
+ };
+ shape "KPAD" {
+ corner= 1,
+ { [ 18, 37 ] },
+ { [ 2, 1 ], [ 16, 35 ] }
+ };
+ shape "LEDS" { { [ 75, 20 ] } };
+ shape "LED" { { [ 5, 1 ] } };
+ section "Function" {
+ key.color= "grey20";
+ priority= 7;
+ top= 22;
+ left= 19;
+ width= 351;
+ height= 19;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <ESC>, "NORM", 1 },
+ { <FK01>, "NORM", 20, color="white" },
+ { <FK02>, "NORM", 1, color="white" },
+ { <FK03>, "NORM", 1, color="white" },
+ { <FK04>, "NORM", 1, color="white" },
+ { <FK05>, "NORM", 11, color="white" },
+ { <FK06>, "NORM", 1, color="white" },
+ { <FK07>, "NORM", 1, color="white" },
+ { <FK08>, "NORM", 1, color="white" },
+ { <FK09>, "NORM", 11, color="white" },
+ { <FK10>, "NORM", 1, color="white" },
+ { <FK11>, "NORM", 1, color="white" },
+ { <FK12>, "NORM", 1, color="white" },
+ { <PRSC>, "NORM", 8, color="white" },
+ { <SCLK>, "NORM", 1, color="white" },
+ { <PAUS>, "NORM", 1, color="white" }
+ };
+ };
+ }; // End of "Function" section
+
+ section "Alpha" {
+ key.color= "white";
+ priority= 8;
+ top= 61;
+ left= 19;
+ width= 287;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <TLDE>, "NORM", 1 }, { <AE01>, "NORM", 1 },
+ { <AE02>, "NORM", 1 }, { <AE03>, "NORM", 1 },
+ { <AE04>, "NORM", 1 }, { <AE05>, "NORM", 1 },
+ { <AE06>, "NORM", 1 }, { <AE07>, "NORM", 1 },
+ { <AE08>, "NORM", 1 }, { <AE09>, "NORM", 1 },
+ { <AE10>, "NORM", 1 }, { <AE11>, "NORM", 1 },
+ { <AE12>, "NORM", 1 },
+ { <BKSP>, "BKSP", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <TAB>, "TABK", 1, color="grey20" },
+ { <AD01>, "NORM", 1 }, { <AD02>, "NORM", 1 },
+ { <AD03>, "NORM", 1 }, { <AD04>, "NORM", 1 },
+ { <AD05>, "NORM", 1 }, { <AD06>, "NORM", 1 },
+ { <AD07>, "NORM", 1 }, { <AD08>, "NORM", 1 },
+ { <AD09>, "NORM", 1 }, { <AD10>, "NORM", 1 },
+ { <AD11>, "NORM", 1 }, { <AD12>, "NORM", 1 },
+ { <RTRN>, "RTRN", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 39;
+ left= 1;
+ keys {
+ { <CAPS>, "CAPS", 1, color="grey20" },
+ { <AC01>, "NORM", 1 }, { <AC02>, "NORM", 1 },
+ { <AC03>, "NORM", 1 }, { <AC04>, "NORM", 1 },
+ { <AC05>, "NORM", 1 }, { <AC06>, "NORM", 1 },
+ { <AC07>, "NORM", 1 }, { <AC08>, "NORM", 1 },
+ { <AC09>, "NORM", 1 }, { <AC10>, "NORM", 1 },
+ { <AC11>, "NORM", 1 }, { <BKSL>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 58;
+ left= 1;
+ keys {
+ { <LFSH>, "LFSH", 1, color="grey20" },
+ { <LSGT>, "NORM", 1 }, { <AB01>, "NORM", 1 },
+ { <AB02>, "NORM", 1 }, { <AB03>, "NORM", 1 },
+ { <AB04>, "NORM", 1 }, { <AB05>, "NORM", 1 },
+ { <AB06>, "NORM", 1 }, { <AB07>, "NORM", 1 },
+ { <AB08>, "NORM", 1 }, { <AB09>, "NORM", 1 },
+ { <AB10>, "NORM", 1 },
+ { <RTSH>, "RTSH", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <LCTL>, "MODK", 1, color="grey20" },
+ { <LWIN>, "SMOD", 1, color="grey20" },
+ { <LALT>, "SMOD", 1, color="grey20" },
+ { <SPCE>, "SPCE", 1 },
+ { <RALT>, "SMOD", 1, color="grey20" },
+ { <RWIN>, "SMOD", 1, color="grey20" },
+ { <MENU>, "SMOD", 1, color="grey20" },
+ { <RCTL>, "SMOD", 1, color="grey20" }
+ };
+ };
+ }; // End of "Alpha" section
+
+ section "Editing" {
+ key.color= "grey20";
+ priority= 9;
+ top= 61;
+ left= 312;
+ width= 58;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <INS>, "NORM", 1 }, { <HOME>, "NORM", 1 },
+ { <PGUP>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <DELE>, "NORM", 1 }, { <END>, "NORM", 1 },
+ { <PGDN>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 58;
+ left= 20;
+ keys {
+ { <UP>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <LEFT>, "NORM", 1 }, { <DOWN>, "NORM", 1 },
+ { <RGHT>, "NORM", 1 }
+ };
+ };
+ }; // End of "Editing" section
+
+ section "Keypad" {
+ key.color= "grey20";
+ priority= 10;
+ top= 61;
+ left= 376;
+ width= 77;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <NMLK>, "NORM", 1 }, { <KPDV>, "NORM", 1 },
+ { <KPMU>, "NORM", 1 }, { <KPSU>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <KP7>, "NORM", 1, color="white" },
+ { <KP8>, "NORM", 1, color="white" },
+ { <KP9>, "NORM", 1, color="white" },
+ { <KPAD>, "KPAD", 1 }
+ };
+ };
+ row {
+ top= 39;
+ left= 1;
+ keys {
+ { <KP4>, "NORM", 1, color="white" },
+ { <KP5>, "NORM", 1, color="white" },
+ { <KP6>, "NORM", 1, color="white" }
+ };
+ };
+ row {
+ top= 58;
+ left= 1;
+ keys {
+ { <KP1>, "NORM", 1, color="white" },
+ { <KP2>, "NORM", 1, color="white" },
+ { <KP3>, "NORM", 1, color="white" },
+ { <KPEN>, "KPAD", 1 }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <KP0>, "KP0", 1, color="white" },
+ { <KPDL>, "NORM", 1, color="white" }
+ };
+ };
+ }; // End of "Keypad" section
+
+ solid "LedPanel" {
+ top= 22;
+ left= 377;
+ priority= 0;
+ color= "grey10";
+ shape= "LEDS";
+ };
+ indicator "Num Lock" {
+ top= 37;
+ left= 382;
+ priority= 1;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ indicator "Caps Lock" {
+ top= 37;
+ left= 407;
+ priority= 2;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ indicator "Scroll Lock" {
+ top= 37;
+ left= 433;
+ priority= 3;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ text "NumLockLabel" {
+ top= 25;
+ left= 378;
+ priority= 4;
+ width= 19.8;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Num\nLock";
+ };
+ text "CapsLockLabel" {
+ top= 25;
+ left= 403;
+ priority= 5;
+ width= 26.4;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Caps\nLock";
+ };
+ text "ScrollLockLabel" {
+ top= 25;
+ left= 428;
+ priority= 6;
+ width= 39.6;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Scroll\nLock";
+ };
+};
+
+};
diff --git a/test/data/keymaps/divide-by-zero.xkb b/test/data/keymaps/divide-by-zero.xkb
new file mode 100644
index 0000000..9e3417f
--- /dev/null
+++ b/test/data/keymaps/divide-by-zero.xkb
@@ -0,0 +1,21 @@
+xkb_keymap {
+ xkb_keycodes {
+ <ESC> = 1;
+ };
+
+ xkb_types {
+ virtual_modifiers NumLock;
+ };
+
+ xkb_compatibility {
+ virtual_modifiers NumLock;
+ interpret KP_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=(1/0),y=+1);
+ };
+ };
+
+ xkb_symbols {
+ key <HYPR> { [ NoSymbol, Hyper_L ] };
+ };
+};
diff --git a/test/data/keymaps/host.xkb b/test/data/keymaps/host.xkb
new file mode 100644
index 0000000..c7d606f
--- /dev/null
+++ b/test/data/keymaps/host.xkb
@@ -0,0 +1,1669 @@
+xkb_keymap {
+xkb_keycodes "evdev_aliases(qwerty)" {
+ minimum = 8;
+ maximum = 255;
+ <ESC> = 9;
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <RTRN> = 36;
+ <LCTL> = 37;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+ <TLDE> = 49;
+ <LFSH> = 50;
+ <BKSL> = 51;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+ <KPMU> = 63;
+ <LALT> = 64;
+ <SPCE> = 65;
+ <CAPS> = 66;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <NMLK> = 77;
+ <SCLK> = 78;
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPSU> = 82;
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+ <KPAD> = 86;
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KP0> = 90;
+ <KPDL> = 91;
+ <LVL3> = 92;
+ <LSGT> = 94;
+ <FK11> = 95;
+ <FK12> = 96;
+ <AB11> = 97;
+ <KATA> = 98;
+ <HIRA> = 99;
+ <HENK> = 100;
+ <HKTG> = 101;
+ <MUHE> = 102;
+ <JPCM> = 103;
+ <KPEN> = 104;
+ <RCTL> = 105;
+ <KPDV> = 106;
+ <PRSC> = 107;
+ <RALT> = 108;
+ <LNFD> = 109;
+ <HOME> = 110;
+ <UP> = 111;
+ <PGUP> = 112;
+ <LEFT> = 113;
+ <RGHT> = 114;
+ <END> = 115;
+ <DOWN> = 116;
+ <PGDN> = 117;
+ <INS> = 118;
+ <DELE> = 119;
+ <I120> = 120;
+ <MUTE> = 121;
+ <VOL-> = 122;
+ <VOL+> = 123;
+ <POWR> = 124;
+ <KPEQ> = 125;
+ <I126> = 126;
+ <PAUS> = 127;
+ <I128> = 128;
+ <I129> = 129;
+ <HNGL> = 130;
+ <HJCV> = 131;
+ <AE13> = 132;
+ <LWIN> = 133;
+ <RWIN> = 134;
+ <COMP> = 135;
+ <STOP> = 136;
+ <AGAI> = 137;
+ <PROP> = 138;
+ <UNDO> = 139;
+ <FRNT> = 140;
+ <COPY> = 141;
+ <OPEN> = 142;
+ <PAST> = 143;
+ <FIND> = 144;
+ <CUT> = 145;
+ <HELP> = 146;
+ <I147> = 147;
+ <I148> = 148;
+ <I149> = 149;
+ <I150> = 150;
+ <I151> = 151;
+ <I152> = 152;
+ <I153> = 153;
+ <I154> = 154;
+ <I155> = 155;
+ <I156> = 156;
+ <I157> = 157;
+ <I158> = 158;
+ <I159> = 159;
+ <I160> = 160;
+ <I161> = 161;
+ <I162> = 162;
+ <I163> = 163;
+ <I164> = 164;
+ <I165> = 165;
+ <I166> = 166;
+ <I167> = 167;
+ <I168> = 168;
+ <I169> = 169;
+ <I170> = 170;
+ <I171> = 171;
+ <I172> = 172;
+ <I173> = 173;
+ <I174> = 174;
+ <I175> = 175;
+ <I176> = 176;
+ <I177> = 177;
+ <I178> = 178;
+ <I179> = 179;
+ <I180> = 180;
+ <I181> = 181;
+ <I182> = 182;
+ <I183> = 183;
+ <I184> = 184;
+ <I185> = 185;
+ <I186> = 186;
+ <I187> = 187;
+ <I188> = 188;
+ <I189> = 189;
+ <I190> = 190;
+ <FK13> = 191;
+ <FK14> = 192;
+ <FK15> = 193;
+ <FK16> = 194;
+ <FK17> = 195;
+ <FK18> = 196;
+ <FK19> = 197;
+ <FK20> = 198;
+ <FK21> = 199;
+ <FK22> = 200;
+ <FK23> = 201;
+ <FK24> = 202;
+ <MDSW> = 203;
+ <ALT> = 204;
+ <META> = 205;
+ <SUPR> = 206;
+ <HYPR> = 207;
+ <I208> = 208;
+ <I209> = 209;
+ <I210> = 210;
+ <I211> = 211;
+ <I212> = 212;
+ <I213> = 213;
+ <I214> = 214;
+ <I215> = 215;
+ <I216> = 216;
+ <I217> = 217;
+ <I218> = 218;
+ <I219> = 219;
+ <I220> = 220;
+ <I221> = 221;
+ <I222> = 222;
+ <I223> = 223;
+ <I224> = 224;
+ <I225> = 225;
+ <I226> = 226;
+ <I227> = 227;
+ <I228> = 228;
+ <I229> = 229;
+ <I230> = 230;
+ <I231> = 231;
+ <I232> = 232;
+ <I233> = 233;
+ <I234> = 234;
+ <I235> = 235;
+ <I236> = 236;
+ <I237> = 237;
+ <I238> = 238;
+ <I239> = 239;
+ <I240> = 240;
+ <I241> = 241;
+ <I242> = 242;
+ <I243> = 243;
+ <I244> = 244;
+ <I245> = 245;
+ <I246> = 246;
+ <I247> = 247;
+ <I248> = 248;
+ <I249> = 249;
+ <I250> = 250;
+ <I251> = 251;
+ <I252> = 252;
+ <I253> = 253;
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+ indicator 4 = "Compose";
+ indicator 5 = "Kana";
+ indicator 6 = "Sleep";
+ indicator 7 = "Suspend";
+ indicator 8 = "Mute";
+ indicator 9 = "Misc";
+ indicator 10 = "Mail";
+ indicator 11 = "Charging";
+ indicator 12 = "Shift Lock";
+ indicator 13 = "Group 2";
+ indicator 14 = "Mouse Keys";
+ alias <AC12> = <BKSL>;
+ alias <MENU> = <COMP>;
+ alias <HZTG> = <TLDE>;
+ alias <LMTA> = <LWIN>;
+ alias <RMTA> = <RWIN>;
+ alias <ALGR> = <RALT>;
+ alias <KPPT> = <I129>;
+ alias <LatQ> = <AD01>;
+ alias <LatW> = <AD02>;
+ alias <LatE> = <AD03>;
+ alias <LatR> = <AD04>;
+ alias <LatT> = <AD05>;
+ alias <LatY> = <AD06>;
+ alias <LatU> = <AD07>;
+ alias <LatI> = <AD08>;
+ alias <LatO> = <AD09>;
+ alias <LatP> = <AD10>;
+ alias <LatA> = <AC01>;
+ alias <LatS> = <AC02>;
+ alias <LatD> = <AC03>;
+ alias <LatF> = <AC04>;
+ alias <LatG> = <AC05>;
+ alias <LatH> = <AC06>;
+ alias <LatJ> = <AC07>;
+ alias <LatK> = <AC08>;
+ alias <LatL> = <AC09>;
+ alias <LatZ> = <AB01>;
+ alias <LatX> = <AB02>;
+ alias <LatC> = <AB03>;
+ alias <LatV> = <AB04>;
+ alias <LatB> = <AB05>;
+ alias <LatN> = <AB06>;
+ alias <LatM> = <AB07>;
+};
+
+xkb_types "complete" {
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ type "ONE_LEVEL" {
+ modifiers= none;
+ level_name[Level1]= "Any";
+ };
+ type "TWO_LEVEL" {
+ modifiers= Shift;
+ map[Shift]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ };
+ type "ALPHABETIC" {
+ modifiers= Shift+Lock;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Caps";
+ };
+ type "KEYPAD" {
+ modifiers= Shift+NumLock;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ };
+ type "SHIFT+ALT" {
+ modifiers= Shift+Alt;
+ map[Shift+Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift+Alt";
+ };
+ type "PC_SUPER_LEVEL2" {
+ modifiers= Mod4;
+ map[Mod4]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Super";
+ };
+ type "PC_CONTROL_LEVEL2" {
+ modifiers= Control;
+ map[Control]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Control";
+ };
+ type "PC_LCONTROL_LEVEL2" {
+ modifiers= LControl;
+ map[LControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LControl";
+ };
+ type "PC_RCONTROL_LEVEL2" {
+ modifiers= RControl;
+ map[RControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RControl";
+ };
+ type "PC_ALT_LEVEL2" {
+ modifiers= Alt;
+ map[Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt";
+ };
+ type "PC_LALT_LEVEL2" {
+ modifiers= LAlt;
+ map[LAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LAlt";
+ };
+ type "PC_RALT_LEVEL2" {
+ modifiers= RAlt;
+ map[RAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RAlt";
+ };
+ type "CTRL+ALT" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[Shift]= Level2;
+ preserve[Shift]= Shift;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ preserve[Shift+LevelThree]= Shift;
+ map[Control+Alt]= Level5;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "Ctrl+Alt";
+ };
+ type "LOCAL_EIGHT_LEVEL" {
+ modifiers= Shift+Lock+Control+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Control]= Level5;
+ map[Shift+Lock+Control]= Level5;
+ map[Shift+Control]= Level6;
+ map[Lock+Control]= Level6;
+ map[Control+LevelThree]= Level7;
+ map[Shift+Lock+Control+LevelThree]= Level7;
+ map[Shift+Control+LevelThree]= Level8;
+ map[Lock+Control+LevelThree]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ level_name[Level4]= "Shift Level3";
+ level_name[Level5]= "Ctrl";
+ level_name[Level6]= "Shift Ctrl";
+ level_name[Level7]= "Level3 Ctrl";
+ level_name[Level8]= "Shift Level3 Ctrl";
+ };
+ type "THREE_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ };
+ type "EIGHT_LEVEL" {
+ modifiers= Shift+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level8;
+ map[Shift+Lock+LevelThree+LevelFive]= Level7;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ preserve[Lock+LevelFive]= Lock;
+ map[Shift+Lock+LevelFive]= Level6;
+ preserve[Shift+Lock+LevelFive]= Lock;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level7;
+ preserve[Lock+LevelThree+LevelFive]= Lock;
+ map[Shift+Lock+LevelThree+LevelFive]= Level8;
+ preserve[Shift+Lock+LevelThree+LevelFive]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "FOUR_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_MIXED_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[NumLock]= Level2;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[NumLock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_X" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[LevelThree]= Level2;
+ map[Shift+LevelThree]= Level3;
+ map[Control+Alt]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt Base";
+ level_name[Level3]= "Shift Alt";
+ level_name[Level4]= "Ctrl+Alt";
+ };
+ type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level4;
+ preserve[Lock]= Lock;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "AltGr Base";
+ level_name[Level4]= "Shift AltGr";
+ };
+ type "FOUR_LEVEL_PLUS_LOCK" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock]= Level5;
+ map[Shift+Lock]= Level2;
+ map[Lock+LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "Lock";
+ };
+ type "FOUR_LEVEL_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[NumLock+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Alt Number";
+ };
+};
+
+xkb_compatibility "complete" {
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ interpret.useModMapMods= AnyLevel;
+ interpret.repeat= False;
+ interpret ISO_Level2_Latch+Exactly(Shift) {
+ useModMapMods=level1;
+ action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
+ };
+ interpret Shift_Lock+AnyOf(Shift+Lock) {
+ action= LockMods(modifiers=Shift);
+ };
+ interpret Num_Lock+AnyOf(all) {
+ virtualModifier= NumLock;
+ action= LockMods(modifiers=NumLock);
+ };
+ interpret ISO_Level3_Shift+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret Alt_L+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Alt_R+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_L+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_R+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_L+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_R+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_L+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_R+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Scroll_Lock+AnyOf(all) {
+ virtualModifier= ScrollLock;
+ action= LockMods(modifiers=modMapMods);
+ };
+ interpret ISO_Level5_Shift+AnyOf(all) {
+ virtualModifier= LevelFive;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOf(all) {
+ virtualModifier= LevelFive;
+ useModMapMods=level1;
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOf(all) {
+ virtualModifier= LevelFive;
+ useModMapMods=level1;
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Mode_switch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= SetGroup(group=+1);
+ };
+ interpret ISO_Level3_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret ISO_Group_Latch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LatchGroup(group=2);
+ };
+ interpret ISO_Next_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=+1);
+ };
+ interpret ISO_Prev_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=-1);
+ };
+ interpret ISO_First_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=1);
+ };
+ interpret ISO_Last_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=2);
+ };
+ interpret KP_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_End+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_Down+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_Next+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_Left+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_Right+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_Home+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_Up+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_Prior+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_Begin+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_F2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_Divide+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_F3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_Multiply+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_F4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Subtract+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Separator+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_Add+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_0+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Insert+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Decimal+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret KP_Delete+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret F25+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret F26+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret F27+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret F29+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret F31+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret F33+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret F35+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret Pointer_Button_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default);
+ };
+ interpret Pointer_Button1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1);
+ };
+ interpret Pointer_Button2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2);
+ };
+ interpret Pointer_Button3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3);
+ };
+ interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret Pointer_DblClick1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1,count=2);
+ };
+ interpret Pointer_DblClick2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2,count=2);
+ };
+ interpret Pointer_DblClick3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3,count=2);
+ };
+ interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=default);
+ };
+ interpret Pointer_Drag1+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=1);
+ };
+ interpret Pointer_Drag2+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=2);
+ };
+ interpret Pointer_Drag3+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=3);
+ };
+ interpret Pointer_EnableKeys+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret Pointer_Accelerate+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=+1);
+ };
+ interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=-1);
+ };
+ interpret AccessX_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXKeys);
+ };
+ interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXFeedback);
+ };
+ interpret RepeatKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=RepeatKeys);
+ };
+ interpret SlowKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=SlowKeys);
+ };
+ interpret BounceKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=BounceKeys);
+ };
+ interpret StickyKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=StickyKeys);
+ };
+ interpret MouseKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Overlay1_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=none);
+ };
+ interpret Overlay2_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=none);
+ };
+ interpret AudibleBell_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AudibleBell);
+ };
+ interpret Terminate_Server+AnyOfOrNone(all) {
+ action= Terminate();
+ };
+ interpret Alt_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Alt_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Meta_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Meta_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Super_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Super_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Hyper_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Hyper_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Shift_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Shift,clearLocks);
+ };
+ interpret XF86Switch_VT_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=1,!same);
+ };
+ interpret XF86Switch_VT_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=2,!same);
+ };
+ interpret XF86Switch_VT_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=3,!same);
+ };
+ interpret XF86Switch_VT_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=4,!same);
+ };
+ interpret XF86Switch_VT_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=5,!same);
+ };
+ interpret XF86Switch_VT_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=6,!same);
+ };
+ interpret XF86Switch_VT_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=7,!same);
+ };
+ interpret XF86Switch_VT_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=8,!same);
+ };
+ interpret XF86Switch_VT_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=9,!same);
+ };
+ interpret XF86Switch_VT_10+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=10,!same);
+ };
+ interpret XF86Switch_VT_11+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=11,!same);
+ };
+ interpret XF86Switch_VT_12+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=12,!same);
+ };
+ interpret XF86LogGrabInfo+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86LogWindowTree+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86Next_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret XF86Prev_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret ISO_Level5_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Caps_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+Exactly(Lock) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+AnyOf(all) {
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ indicator "Caps Lock" {
+ whichModState= locked;
+ modifiers= Lock;
+ };
+ indicator "Num Lock" {
+ whichModState= locked;
+ modifiers= NumLock;
+ };
+ indicator "Scroll Lock" {
+ whichModState= locked;
+ modifiers= ScrollLock;
+ };
+ indicator "Shift Lock" {
+ whichModState= locked;
+ modifiers= Shift;
+ };
+ indicator "Group 2" {
+ groups= 0xfe;
+ };
+ indicator "Mouse Keys" {
+ controls= MouseKeys;
+ };
+};
+
+xkb_symbols "pc_us_pt_2_us_3_inet(evdev)_group(shift_caps_toggle)_compose(ralt)" {
+ name[group1]="English (US)";
+ name[group2]="Portuguese";
+ name[group3]="English (US)";
+
+ key <ESC> { [ Escape ] };
+ key <AE01> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ 1, exclam ],
+ symbols[Group2]= [ 1, exclam, onesuperior, exclamdown ],
+ symbols[Group3]= [ 1, exclam ]
+ };
+ key <AE02> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ 2, at ],
+ symbols[Group2]= [ 2, quotedbl, at, oneeighth ],
+ symbols[Group3]= [ 2, at ]
+ };
+ key <AE03> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ 3, numbersign ],
+ symbols[Group2]= [ 3, numbersign, sterling, sterling ],
+ symbols[Group3]= [ 3, numbersign ]
+ };
+ key <AE04> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ 4, dollar ],
+ symbols[Group2]= [ 4, dollar, section, dollar ],
+ symbols[Group3]= [ 4, dollar ]
+ };
+ key <AE05> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ 5, percent ],
+ symbols[Group2]= [ 5, percent, onehalf, threeeighths ],
+ symbols[Group3]= [ 5, percent ]
+ };
+ key <AE06> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ 6, asciicircum ],
+ symbols[Group2]= [ 6, ampersand, notsign, fiveeighths ],
+ symbols[Group3]= [ 6, asciicircum ]
+ };
+ key <AE07> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ 7, ampersand ],
+ symbols[Group2]= [ 7, slash, braceleft, seveneighths ],
+ symbols[Group3]= [ 7, ampersand ]
+ };
+ key <AE08> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ 8, asterisk ],
+ symbols[Group2]= [ 8, parenleft, bracketleft, trademark ],
+ symbols[Group3]= [ 8, asterisk ]
+ };
+ key <AE09> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ 9, parenleft ],
+ symbols[Group2]= [ 9, parenright, bracketright, plusminus ],
+ symbols[Group3]= [ 9, parenleft ]
+ };
+ key <AE10> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ 0, parenright ],
+ symbols[Group2]= [ 0, equal, braceright, degree ],
+ symbols[Group3]= [ 0, parenright ]
+ };
+ key <AE11> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ minus, underscore ],
+ symbols[Group2]= [ apostrophe, question, backslash, questiondown ],
+ symbols[Group3]= [ minus, underscore ]
+ };
+ key <AE12> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ equal, plus ],
+ symbols[Group2]= [ guillemotleft, guillemotright, dead_cedilla, dead_ogonek ],
+ symbols[Group3]= [ equal, plus ]
+ };
+ key <BKSP> { [ BackSpace, BackSpace ] };
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ q, Q ],
+ symbols[Group2]= [ q, Q, at, Greek_OMEGA ],
+ symbols[Group3]= [ q, Q ]
+ };
+ key <AD02> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_ALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ w, W ],
+ symbols[Group2]= [ w, W, lstroke, Lstroke ],
+ symbols[Group3]= [ w, W ]
+ };
+ key <AD03> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ e, E ],
+ symbols[Group2]= [ e, E, EuroSign, cent ],
+ symbols[Group3]= [ e, E ]
+ };
+ key <AD04> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ r, R ],
+ symbols[Group2]= [ r, R, paragraph, registered ],
+ symbols[Group3]= [ r, R ]
+ };
+ key <AD05> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_ALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ t, T ],
+ symbols[Group2]= [ t, T, tslash, Tslash ],
+ symbols[Group3]= [ t, T ]
+ };
+ key <AD06> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ y, Y ],
+ symbols[Group2]= [ y, Y, leftarrow, yen ],
+ symbols[Group3]= [ y, Y ]
+ };
+ key <AD07> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ u, U ],
+ symbols[Group2]= [ u, U, downarrow, uparrow ],
+ symbols[Group3]= [ u, U ]
+ };
+ key <AD08> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ i, I ],
+ symbols[Group2]= [ i, I, rightarrow, idotless ],
+ symbols[Group3]= [ i, I ]
+ };
+ key <AD09> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_ALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ o, O ],
+ symbols[Group2]= [ o, O, oslash, Oslash ],
+ symbols[Group3]= [ o, O ]
+ };
+ key <AD10> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_ALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ p, P ],
+ symbols[Group2]= [ p, P, thorn, THORN ],
+ symbols[Group3]= [ p, P ]
+ };
+ key <AD11> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ bracketleft, braceleft ],
+ symbols[Group2]= [ plus, asterisk, dead_diaeresis, dead_abovering ],
+ symbols[Group3]= [ bracketleft, braceleft ]
+ };
+ key <AD12> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ bracketright, braceright ],
+ symbols[Group2]= [ dead_acute, dead_grave, dead_tilde, dead_macron ],
+ symbols[Group3]= [ bracketright, braceright ]
+ };
+ key <RTRN> { [ Return ] };
+ key <LCTL> { [ Control_L ] };
+ key <AC01> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_ALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ a, A ],
+ symbols[Group2]= [ a, A, ae, AE ],
+ symbols[Group3]= [ a, A ]
+ };
+ key <AC02> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ s, S ],
+ symbols[Group2]= [ s, S, ssharp, section ],
+ symbols[Group3]= [ s, S ]
+ };
+ key <AC03> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_ALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ d, D ],
+ symbols[Group2]= [ d, D, eth, ETH ],
+ symbols[Group3]= [ d, D ]
+ };
+ key <AC04> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ f, F ],
+ symbols[Group2]= [ f, F, dstroke, ordfeminine ],
+ symbols[Group3]= [ f, F ]
+ };
+ key <AC05> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_ALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ g, G ],
+ symbols[Group2]= [ g, G, eng, ENG ],
+ symbols[Group3]= [ g, G ]
+ };
+ key <AC06> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_ALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ h, H ],
+ symbols[Group2]= [ h, H, hstroke, Hstroke ],
+ symbols[Group3]= [ h, H ]
+ };
+ key <AC07> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ j, J ],
+ symbols[Group2]= [ j, J, dead_hook, dead_horn ],
+ symbols[Group3]= [ j, J ]
+ };
+ key <AC08> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ k, K ],
+ symbols[Group2]= [ k, K, kra, ampersand ],
+ symbols[Group3]= [ k, K ]
+ };
+ key <AC09> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_ALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ l, L ],
+ symbols[Group2]= [ l, L, lstroke, Lstroke ],
+ symbols[Group3]= [ l, L ]
+ };
+ key <AC10> {
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ semicolon, colon ],
+ symbols[Group2]= [ ccedilla, Ccedilla, dead_acute, dead_doubleacute ],
+ symbols[Group3]= [ semicolon, colon ]
+ };
+ key <AC11> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ apostrophe, quotedbl ],
+ symbols[Group2]= [ masculine, ordfeminine, dead_circumflex, dead_caron ],
+ symbols[Group3]= [ apostrophe, quotedbl ]
+ };
+ key <TLDE> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ grave, asciitilde ],
+ symbols[Group2]= [ backslash, bar, notsign, notsign ],
+ symbols[Group3]= [ grave, asciitilde ]
+ };
+ key <LFSH> { [ Shift_L ] };
+ key <BKSL> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ backslash, bar ],
+ symbols[Group2]= [ dead_tilde, dead_circumflex, dead_grave, dead_breve ],
+ symbols[Group3]= [ backslash, bar ]
+ };
+ key <AB01> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ z, Z ],
+ symbols[Group2]= [ z, Z, guillemotleft, less ],
+ symbols[Group3]= [ z, Z ]
+ };
+ key <AB02> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ x, X ],
+ symbols[Group2]= [ x, X, guillemotright, greater ],
+ symbols[Group3]= [ x, X ]
+ };
+ key <AB03> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ c, C ],
+ symbols[Group2]= [ c, C, cent, copyright ],
+ symbols[Group3]= [ c, C ]
+ };
+ key <AB04> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ v, V ],
+ symbols[Group2]= [ v, V, leftdoublequotemark, leftsinglequotemark ],
+ symbols[Group3]= [ v, V ]
+ };
+ key <AB05> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ b, B ],
+ symbols[Group2]= [ b, B, rightdoublequotemark, rightsinglequotemark ],
+ symbols[Group3]= [ b, B ]
+ };
+ key <AB06> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_ALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ n, N ],
+ symbols[Group2]= [ n, N, n, N ],
+ symbols[Group3]= [ n, N ]
+ };
+ key <AB07> {
+ type[group1]= "ALPHABETIC",
+ type[group2]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[group3]= "ALPHABETIC",
+ symbols[Group1]= [ m, M ],
+ symbols[Group2]= [ m, M, mu, masculine ],
+ symbols[Group3]= [ m, M ]
+ };
+ key <AB08> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ comma, less ],
+ symbols[Group2]= [ comma, semicolon, horizconnector, multiply ],
+ symbols[Group3]= [ comma, less ]
+ };
+ key <AB09> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ period, greater ],
+ symbols[Group2]= [ period, colon, periodcentered, division ],
+ symbols[Group3]= [ period, greater ]
+ };
+ key <AB10> {
+ type[group2]= "FOUR_LEVEL",
+ symbols[Group1]= [ slash, question ],
+ symbols[Group2]= [ minus, underscore, dead_belowdot, dead_abovedot ],
+ symbols[Group3]= [ slash, question ]
+ };
+ key <RTSH> { [ Shift_R ] };
+ key <KPMU> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ]
+ };
+ key <LALT> { [ Alt_L, Meta_L ] };
+ key <SPCE> { [ space ] };
+ key <CAPS> { [ Caps_Lock, ISO_Next_Group ] };
+ key <FK01> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ]
+ };
+ key <FK02> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ]
+ };
+ key <FK03> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ]
+ };
+ key <FK04> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ]
+ };
+ key <FK05> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ]
+ };
+ key <FK06> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ]
+ };
+ key <FK07> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ]
+ };
+ key <FK08> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ]
+ };
+ key <FK09> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ]
+ };
+ key <FK10> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ]
+ };
+ key <NMLK> { [ Num_Lock ] };
+ key <SCLK> { [ Scroll_Lock ] };
+ key <KP7> { [ KP_Home, KP_7 ] };
+ key <KP8> { [ KP_Up, KP_8 ] };
+ key <KP9> { [ KP_Prior, KP_9 ] };
+ key <KPSU> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ]
+ };
+ key <KP4> { [ KP_Left, KP_4 ] };
+ key <KP5> { [ KP_Begin, KP_5 ] };
+ key <KP6> { [ KP_Right, KP_6 ] };
+ key <KPAD> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ]
+ };
+ key <KP1> { [ KP_End, KP_1 ] };
+ key <KP2> { [ KP_Down, KP_2 ] };
+ key <KP3> { [ KP_Next, KP_3 ] };
+ key <KP0> { [ KP_Insert, KP_0 ] };
+ key <KPDL> { [ KP_Delete, KP_Decimal ] };
+ key <LVL3> {
+ type= "ONE_LEVEL",
+ symbols[Group1]= [ ISO_Level3_Shift ]
+ };
+ key <LSGT> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ less, greater, bar, brokenbar ],
+ symbols[Group2]= [ less, greater, backslash, backslash ]
+ };
+ key <FK11> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ]
+ };
+ key <FK12> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ]
+ };
+ key <KATA> { [ Katakana ] };
+ key <HIRA> { [ Hiragana ] };
+ key <HENK> { [ Henkan_Mode ] };
+ key <HKTG> { [ Hiragana_Katakana ] };
+ key <MUHE> { [ Muhenkan ] };
+ key <KPEN> { [ KP_Enter ] };
+ key <RCTL> { [ Control_R ] };
+ key <KPDV> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ]
+ };
+ key <PRSC> {
+ type= "PC_ALT_LEVEL2",
+ symbols[Group1]= [ Print, Sys_Req ]
+ };
+ key <RALT> {
+ type[group1]= "TWO_LEVEL",
+ type[group2]= "ONE_LEVEL",
+ symbols[Group1]= [ Multi_key, Multi_key ],
+ symbols[Group2]= [ ISO_Level3_Shift ]
+ };
+ key <LNFD> { [ Linefeed ] };
+ key <HOME> { [ Home ] };
+ key <UP> { [ Up ] };
+ key <PGUP> { [ Prior ] };
+ key <LEFT> { [ Left ] };
+ key <RGHT> { [ Right ] };
+ key <END> { [ End ] };
+ key <DOWN> { [ Down ] };
+ key <PGDN> { [ Next ] };
+ key <INS> { [ Insert ] };
+ key <DELE> { [ Delete ] };
+ key <MUTE> { [ XF86AudioMute ] };
+ key <VOL-> { [ XF86AudioLowerVolume ] };
+ key <VOL+> { [ XF86AudioRaiseVolume ] };
+ key <POWR> { [ XF86PowerOff ] };
+ key <KPEQ> { [ KP_Equal ] };
+ key <I126> { [ plusminus ] };
+ key <PAUS> {
+ type= "PC_CONTROL_LEVEL2",
+ symbols[Group1]= [ Pause, Break ]
+ };
+ key <I128> { [ XF86LaunchA ] };
+ key <I129> { [ KP_Decimal, KP_Decimal ] };
+ key <HNGL> { [ Hangul ] };
+ key <HJCV> { [ Hangul_Hanja ] };
+ key <LWIN> { [ Super_L ] };
+ key <RWIN> { [ Super_R ] };
+ key <COMP> { [ Menu ] };
+ key <STOP> { [ Cancel ] };
+ key <AGAI> { [ Redo ] };
+ key <PROP> { [ SunProps ] };
+ key <UNDO> { [ Undo ] };
+ key <FRNT> { [ SunFront ] };
+ key <COPY> { [ XF86Copy ] };
+ key <OPEN> { [ XF86Open ] };
+ key <PAST> { [ XF86Paste ] };
+ key <FIND> { [ Find ] };
+ key <CUT> { [ XF86Cut ] };
+ key <HELP> { [ Help ] };
+ key <I147> { [ XF86MenuKB ] };
+ key <I148> { [ XF86Calculator ] };
+ key <I150> { [ XF86Sleep ] };
+ key <I151> { [ XF86WakeUp ] };
+ key <I152> { [ XF86Explorer ] };
+ key <I153> { [ XF86Send ] };
+ key <I155> { [ XF86Xfer ] };
+ key <I156> { [ XF86Launch1 ] };
+ key <I157> { [ XF86Launch2 ] };
+ key <I158> { [ XF86WWW ] };
+ key <I159> { [ XF86DOS ] };
+ key <I160> { [ XF86ScreenSaver ] };
+ key <I161> { [ XF86RotateWindows ] };
+ key <I162> { [ XF86TaskPane ] };
+ key <I163> { [ XF86Mail ] };
+ key <I164> { [ XF86Favorites ] };
+ key <I165> { [ XF86MyComputer ] };
+ key <I166> { [ XF86Back ] };
+ key <I167> { [ XF86Forward ] };
+ key <I169> { [ XF86Eject ] };
+ key <I170> { [ XF86Eject, XF86Eject ] };
+ key <I171> { [ XF86AudioNext ] };
+ key <I172> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I173> { [ XF86AudioPrev ] };
+ key <I174> { [ XF86AudioStop, XF86Eject ] };
+ key <I175> { [ XF86AudioRecord ] };
+ key <I176> { [ XF86AudioRewind ] };
+ key <I177> { [ XF86Phone ] };
+ key <I179> { [ XF86Tools ] };
+ key <I180> { [ XF86HomePage ] };
+ key <I181> { [ XF86Reload ] };
+ key <I182> { [ XF86Close ] };
+ key <I185> { [ XF86ScrollUp ] };
+ key <I186> { [ XF86ScrollDown ] };
+ key <I187> { [ parenleft ] };
+ key <I188> { [ parenright ] };
+ key <I189> { [ XF86New ] };
+ key <I190> { [ Redo ] };
+ key <FK13> { [ XF86Tools ] };
+ key <FK14> { [ XF86Launch5 ] };
+ key <FK15> { [ XF86Launch6 ] };
+ key <FK16> { [ XF86Launch7 ] };
+ key <FK17> { [ XF86Launch8 ] };
+ key <FK18> { [ XF86Launch9 ] };
+ key <FK20> { [ XF86AudioMicMute ] };
+ key <FK21> { [ XF86TouchpadToggle ] };
+ key <FK22> { [ XF86TouchpadOn ] };
+ key <FK23> { [ XF86TouchpadOff ] };
+ key <MDSW> { [ Mode_switch ] };
+ key <ALT> { [ NoSymbol, Alt_L ] };
+ key <META> { [ NoSymbol, Meta_L ] };
+ key <SUPR> { [ NoSymbol, Super_L ] };
+ key <HYPR> { [ NoSymbol, Hyper_L ] };
+ key <I208> { [ XF86AudioPlay ] };
+ key <I209> { [ XF86AudioPause ] };
+ key <I210> { [ XF86Launch3 ] };
+ key <I211> { [ XF86Launch4 ] };
+ key <I212> { [ XF86LaunchB ] };
+ key <I213> { [ XF86Suspend ] };
+ key <I214> { [ XF86Close ] };
+ key <I215> { [ XF86AudioPlay ] };
+ key <I216> { [ XF86AudioForward ] };
+ key <I218> { [ Print ] };
+ key <I220> { [ XF86WebCam ] };
+ key <I223> { [ XF86Mail ] };
+ key <I224> { [ XF86Messenger ] };
+ key <I225> { [ XF86Search ] };
+ key <I226> { [ XF86Go ] };
+ key <I227> { [ XF86Finance ] };
+ key <I228> { [ XF86Game ] };
+ key <I229> { [ XF86Shop ] };
+ key <I231> { [ Cancel ] };
+ key <I232> { [ XF86MonBrightnessDown ] };
+ key <I233> { [ XF86MonBrightnessUp ] };
+ key <I234> { [ XF86AudioMedia ] };
+ key <I235> { [ XF86Display ] };
+ key <I236> { [ XF86KbdLightOnOff ] };
+ key <I237> { [ XF86KbdBrightnessDown ] };
+ key <I238> { [ XF86KbdBrightnessUp ] };
+ key <I239> { [ XF86Send ] };
+ key <I240> { [ XF86Reply ] };
+ key <I241> { [ XF86MailForward ] };
+ key <I242> { [ XF86Save ] };
+ key <I243> { [ XF86Documents ] };
+ key <I244> { [ XF86Battery ] };
+ key <I245> { [ XF86Bluetooth ] };
+ key <I246> { [ XF86WLAN ] };
+ modifier_map Shift { <LFSH>, <RTSH> };
+ modifier_map Lock { <CAPS> };
+ modifier_map Control { <LCTL>, <RCTL> };
+ modifier_map Mod1 { <LALT>, <META> };
+ modifier_map Mod2 { <NMLK> };
+ modifier_map Mod4 { <LWIN>, <RWIN>, <SUPR>, <HYPR> };
+ modifier_map Mod5 { <LVL3>, <MDSW> };
+};
+
+};
diff --git a/test/data/keymaps/no-aliases.xkb b/test/data/keymaps/no-aliases.xkb
new file mode 100644
index 0000000..1d07c6e
--- /dev/null
+++ b/test/data/keymaps/no-aliases.xkb
@@ -0,0 +1,1337 @@
+xkb_keymap {
+xkb_keycodes "evdev_aliases(qwerty)" {
+ minimum = 8;
+ maximum = 255;
+ <ESC> = 9;
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <RTRN> = 36;
+ <LCTL> = 37;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+ <TLDE> = 49;
+ <LFSH> = 50;
+ <BKSL> = 51;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+ <KPMU> = 63;
+ <LALT> = 64;
+ <SPCE> = 65;
+ <CAPS> = 66;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <NMLK> = 77;
+ <SCLK> = 78;
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPSU> = 82;
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+ <KPAD> = 86;
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KP0> = 90;
+ <KPDL> = 91;
+ <LVL3> = 92;
+ <LSGT> = 94;
+ <FK11> = 95;
+ <FK12> = 96;
+ <AB11> = 97;
+ <KATA> = 98;
+ <HIRA> = 99;
+ <HENK> = 100;
+ <HKTG> = 101;
+ <MUHE> = 102;
+ <JPCM> = 103;
+ <KPEN> = 104;
+ <RCTL> = 105;
+ <KPDV> = 106;
+ <PRSC> = 107;
+ <RALT> = 108;
+ <LNFD> = 109;
+ <HOME> = 110;
+ <UP> = 111;
+ <PGUP> = 112;
+ <LEFT> = 113;
+ <RGHT> = 114;
+ <END> = 115;
+ <DOWN> = 116;
+ <PGDN> = 117;
+ <INS> = 118;
+ <DELE> = 119;
+ <I120> = 120;
+ <MUTE> = 121;
+ <VOL-> = 122;
+ <VOL+> = 123;
+ <POWR> = 124;
+ <KPEQ> = 125;
+ <I126> = 126;
+ <PAUS> = 127;
+ <I128> = 128;
+ <I129> = 129;
+ <HNGL> = 130;
+ <HJCV> = 131;
+ <AE13> = 132;
+ <LWIN> = 133;
+ <RWIN> = 134;
+ <COMP> = 135;
+ <STOP> = 136;
+ <AGAI> = 137;
+ <PROP> = 138;
+ <UNDO> = 139;
+ <FRNT> = 140;
+ <COPY> = 141;
+ <OPEN> = 142;
+ <PAST> = 143;
+ <FIND> = 144;
+ <CUT> = 145;
+ <HELP> = 146;
+ <I147> = 147;
+ <I148> = 148;
+ <I149> = 149;
+ <I150> = 150;
+ <I151> = 151;
+ <I152> = 152;
+ <I153> = 153;
+ <I154> = 154;
+ <I155> = 155;
+ <I156> = 156;
+ <I157> = 157;
+ <I158> = 158;
+ <I159> = 159;
+ <I160> = 160;
+ <I161> = 161;
+ <I162> = 162;
+ <I163> = 163;
+ <I164> = 164;
+ <I165> = 165;
+ <I166> = 166;
+ <I167> = 167;
+ <I168> = 168;
+ <I169> = 169;
+ <I170> = 170;
+ <I171> = 171;
+ <I172> = 172;
+ <I173> = 173;
+ <I174> = 174;
+ <I175> = 175;
+ <I176> = 176;
+ <I177> = 177;
+ <I178> = 178;
+ <I179> = 179;
+ <I180> = 180;
+ <I181> = 181;
+ <I182> = 182;
+ <I183> = 183;
+ <I184> = 184;
+ <I185> = 185;
+ <I186> = 186;
+ <I187> = 187;
+ <I188> = 188;
+ <I189> = 189;
+ <I190> = 190;
+ <FK13> = 191;
+ <FK14> = 192;
+ <FK15> = 193;
+ <FK16> = 194;
+ <FK17> = 195;
+ <FK18> = 196;
+ <FK19> = 197;
+ <FK20> = 198;
+ <FK21> = 199;
+ <FK22> = 200;
+ <FK23> = 201;
+ <FK24> = 202;
+ <MDSW> = 203;
+ <ALT> = 204;
+ <META> = 205;
+ <SUPR> = 206;
+ <HYPR> = 207;
+ <I208> = 208;
+ <I209> = 209;
+ <I210> = 210;
+ <I211> = 211;
+ <I212> = 212;
+ <I213> = 213;
+ <I214> = 214;
+ <I215> = 215;
+ <I216> = 216;
+ <I217> = 217;
+ <I218> = 218;
+ <I219> = 219;
+ <I220> = 220;
+ <I221> = 221;
+ <I222> = 222;
+ <I223> = 223;
+ <I224> = 224;
+ <I225> = 225;
+ <I226> = 226;
+ <I227> = 227;
+ <I228> = 228;
+ <I229> = 229;
+ <I230> = 230;
+ <I231> = 231;
+ <I232> = 232;
+ <I233> = 233;
+ <I234> = 234;
+ <I235> = 235;
+ <I236> = 236;
+ <I237> = 237;
+ <I238> = 238;
+ <I239> = 239;
+ <I240> = 240;
+ <I241> = 241;
+ <I242> = 242;
+ <I243> = 243;
+ <I244> = 244;
+ <I245> = 245;
+ <I246> = 246;
+ <I247> = 247;
+ <I248> = 248;
+ <I249> = 249;
+ <I250> = 250;
+ <I251> = 251;
+ <I252> = 252;
+ <I253> = 253;
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+ indicator 4 = "Compose";
+ indicator 5 = "Kana";
+ indicator 6 = "Sleep";
+ indicator 7 = "Suspend";
+ indicator 8 = "Mute";
+ indicator 9 = "Misc";
+ indicator 10 = "Mail";
+ indicator 11 = "Charging";
+ indicator 12 = "Shift Lock";
+ indicator 13 = "Group 2";
+ indicator 14 = "Mouse Keys";
+};
+
+xkb_types "complete" {
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ type "ONE_LEVEL" {
+ modifiers= none;
+ level_name[Level1]= "Any";
+ };
+ type "TWO_LEVEL" {
+ modifiers= Shift;
+ map[Shift]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ };
+ type "ALPHABETIC" {
+ modifiers= Shift+Lock;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Caps";
+ };
+ type "SHIFT+ALT" {
+ modifiers= Shift+Alt;
+ map[Shift+Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift+Alt";
+ };
+ type "PC_CONTROL_LEVEL2" {
+ modifiers= Control;
+ map[Control]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Control";
+ };
+ type "PC_LCONTROL_LEVEL2" {
+ modifiers= LControl;
+ map[LControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LControl";
+ };
+ type "PC_RCONTROL_LEVEL2" {
+ modifiers= RControl;
+ map[RControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RControl";
+ };
+ type "PC_ALT_LEVEL2" {
+ modifiers= Alt;
+ map[Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt";
+ };
+ type "PC_LALT_LEVEL2" {
+ modifiers= LAlt;
+ map[LAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LAlt";
+ };
+ type "PC_RALT_LEVEL2" {
+ modifiers= RAlt;
+ map[RAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RAlt";
+ };
+ type "CTRL+ALT" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[Shift]= Level2;
+ preserve[Shift]= Shift;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ preserve[Shift+LevelThree]= Shift;
+ map[Control+Alt]= Level5;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "Ctrl+Alt";
+ };
+ type "LOCAL_EIGHT_LEVEL" {
+ modifiers= Shift+Lock+Control+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Control]= Level5;
+ map[Shift+Lock+Control]= Level5;
+ map[Shift+Control]= Level6;
+ map[Lock+Control]= Level6;
+ map[Control+LevelThree]= Level7;
+ map[Shift+Lock+Control+LevelThree]= Level7;
+ map[Shift+Control+LevelThree]= Level8;
+ map[Lock+Control+LevelThree]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ level_name[Level4]= "Shift Level3";
+ level_name[Level5]= "Ctrl";
+ level_name[Level6]= "Shift Ctrl";
+ level_name[Level7]= "Level3 Ctrl";
+ level_name[Level8]= "Shift Level3 Ctrl";
+ };
+ type "THREE_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ };
+ type "EIGHT_LEVEL" {
+ modifiers= Shift+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level8;
+ map[Shift+Lock+LevelThree+LevelFive]= Level7;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ preserve[Lock+LevelFive]= Lock;
+ map[Shift+Lock+LevelFive]= Level6;
+ preserve[Shift+Lock+LevelFive]= Lock;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level7;
+ preserve[Lock+LevelThree+LevelFive]= Lock;
+ map[Shift+Lock+LevelThree+LevelFive]= Level8;
+ preserve[Shift+Lock+LevelThree+LevelFive]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "FOUR_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_MIXED_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[NumLock]= Level2;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[NumLock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_X" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[LevelThree]= Level2;
+ map[Shift+LevelThree]= Level3;
+ map[Control+Alt]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt Base";
+ level_name[Level3]= "Shift Alt";
+ level_name[Level4]= "Ctrl+Alt";
+ };
+ type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level4;
+ preserve[Lock]= Lock;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "AltGr Base";
+ level_name[Level4]= "Shift AltGr";
+ };
+ type "FOUR_LEVEL_PLUS_LOCK" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock]= Level5;
+ map[Shift+Lock]= Level2;
+ map[Lock+LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "Lock";
+ };
+ type "KEYPAD" {
+ modifiers= Shift+NumLock;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ };
+ type "FOUR_LEVEL_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[NumLock+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Alt Number";
+ };
+};
+
+xkb_compatibility "complete" {
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ interpret.useModMapMods= AnyLevel;
+ interpret.repeat= False;
+ interpret ISO_Level2_Latch+Exactly(Shift) {
+ useModMapMods=level1;
+ action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
+ };
+ interpret Shift_Lock+AnyOf(Shift+Lock) {
+ action= LockMods(modifiers=Shift);
+ };
+ interpret Num_Lock+AnyOf(all) {
+ virtualModifier= NumLock;
+ action= LockMods(modifiers=NumLock);
+ };
+ interpret ISO_Level3_Shift+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret Alt_L+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Alt_R+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_L+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_R+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_L+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_R+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_L+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_R+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Scroll_Lock+AnyOf(all) {
+ virtualModifier= ScrollLock;
+ action= LockMods(modifiers=modMapMods);
+ };
+ interpret ISO_Level5_Shift+AnyOf(all) {
+ virtualModifier= LevelFive;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Mode_switch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= SetGroup(group=+1);
+ };
+ interpret ISO_Level3_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret ISO_Group_Latch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LatchGroup(group=2);
+ };
+ interpret ISO_Next_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=+1);
+ };
+ interpret ISO_Prev_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=-1);
+ };
+ interpret ISO_First_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=1);
+ };
+ interpret ISO_Last_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=2);
+ };
+ interpret KP_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_End+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_Down+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_Next+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_Left+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_Right+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_Home+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_Up+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_Prior+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_Begin+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_F2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_Divide+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_F3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_Multiply+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_F4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Subtract+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Separator+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_Add+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_0+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Insert+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Decimal+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret KP_Delete+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret F25+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret F26+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret F27+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret F29+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret F31+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret F33+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret F35+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret Pointer_Button_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default);
+ };
+ interpret Pointer_Button1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1);
+ };
+ interpret Pointer_Button2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2);
+ };
+ interpret Pointer_Button3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3);
+ };
+ interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret Pointer_DblClick1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1,count=2);
+ };
+ interpret Pointer_DblClick2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2,count=2);
+ };
+ interpret Pointer_DblClick3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3,count=2);
+ };
+ interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=default);
+ };
+ interpret Pointer_Drag1+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=1);
+ };
+ interpret Pointer_Drag2+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=2);
+ };
+ interpret Pointer_Drag3+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=3);
+ };
+ interpret Pointer_EnableKeys+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret Pointer_Accelerate+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=+1);
+ };
+ interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=-1);
+ };
+ interpret AccessX_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXKeys);
+ };
+ interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXFeedback);
+ };
+ interpret RepeatKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=RepeatKeys);
+ };
+ interpret SlowKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=SlowKeys);
+ };
+ interpret BounceKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=BounceKeys);
+ };
+ interpret StickyKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=StickyKeys);
+ };
+ interpret MouseKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Overlay1_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=none);
+ };
+ interpret Overlay2_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=none);
+ };
+ interpret AudibleBell_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AudibleBell);
+ };
+ interpret Terminate_Server+AnyOfOrNone(all) {
+ action= Terminate();
+ };
+ interpret Alt_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Alt_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Meta_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Meta_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Super_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Super_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Hyper_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Hyper_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Shift_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Shift,clearLocks);
+ };
+ interpret XF86Switch_VT_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=1,!same);
+ };
+ interpret XF86Switch_VT_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=2,!same);
+ };
+ interpret XF86Switch_VT_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=3,!same);
+ };
+ interpret XF86Switch_VT_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=4,!same);
+ };
+ interpret XF86Switch_VT_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=5,!same);
+ };
+ interpret XF86Switch_VT_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=6,!same);
+ };
+ interpret XF86Switch_VT_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=7,!same);
+ };
+ interpret XF86Switch_VT_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=8,!same);
+ };
+ interpret XF86Switch_VT_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=9,!same);
+ };
+ interpret XF86Switch_VT_10+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=10,!same);
+ };
+ interpret XF86Switch_VT_11+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=11,!same);
+ };
+ interpret XF86Switch_VT_12+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=12,!same);
+ };
+ interpret XF86LogGrabInfo+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86LogWindowTree+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86Next_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret XF86Prev_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret ISO_Level5_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Caps_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+Exactly(Lock) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+AnyOf(all) {
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ indicator "Caps Lock" {
+ whichModState= locked;
+ modifiers= Lock;
+ };
+ indicator "Num Lock" {
+ whichModState= locked;
+ modifiers= NumLock;
+ };
+ indicator "Scroll Lock" {
+ whichModState= locked;
+ modifiers= ScrollLock;
+ };
+ indicator "Shift Lock" {
+ whichModState= locked;
+ modifiers= Shift;
+ };
+ indicator "Group 2" {
+ groups= 0xfe;
+ };
+ indicator "Mouse Keys" {
+ controls= MouseKeys;
+ };
+};
+
+xkb_symbols "pc_us_inet(evdev)" {
+ name[group1]="English (US)";
+
+ key <ESC> { [ Escape ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ { H, E, L, L, O }, asciicircum ] };
+ key <AE07> { [ { Y, E, S, space, T, H, I, S, space, I, S, space, D, O, G }, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSP> { [ BackSpace, BackSpace ] };
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E ] };
+ key <AD04> { [ r, R ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ y, Y ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I ] };
+ key <AD09> { [ o, O ] };
+ key <AD10> { [ p, P ] };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+ key <RTRN> { [ Return ] };
+ key <LCTL> { [ Control_L ] };
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ d, D ] };
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ j, J ] };
+ key <AC08> { [ k, K ] };
+ key <AC09> { [ l, L ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+ key <TLDE> { [ grave, asciitilde ] };
+ key <LFSH> { [ Shift_L ] };
+ key <BKSL> { [ backslash, bar ] };
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+ key <RTSH> { [ Shift_R ] };
+ key <KPMU> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ]
+ };
+ key <LALT> { [ Alt_L, Meta_L ] };
+ key <SPCE> { [ space ] };
+ key <CAPS> { [ Caps_Lock ] };
+ key <FK01> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ]
+ };
+ key <FK02> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ]
+ };
+ key <FK03> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ]
+ };
+ key <FK04> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ]
+ };
+ key <FK05> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ]
+ };
+ key <FK06> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ]
+ };
+ key <FK07> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ]
+ };
+ key <FK08> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ]
+ };
+ key <FK09> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ]
+ };
+ key <FK10> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ]
+ };
+ key <NMLK> { [ Num_Lock ] };
+ key <SCLK> { [ Scroll_Lock ] };
+ key <KP7> { [ KP_Home, KP_7 ] };
+ key <KP8> { [ KP_Up, KP_8 ] };
+ key <KP9> { [ KP_Prior, KP_9 ] };
+ key <KPSU> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ]
+ };
+ key <KP4> { [ KP_Left, KP_4 ] };
+ key <KP5> { [ KP_Begin, KP_5 ] };
+ key <KP6> { [ KP_Right, KP_6 ] };
+ key <KPAD> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ]
+ };
+ key <KP1> { [ KP_End, KP_1 ] };
+ key <KP2> { [ KP_Down, KP_2 ] };
+ key <KP3> { [ KP_Next, KP_3 ] };
+ key <KP0> { [ KP_Insert, KP_0 ] };
+ key <KPDL> { [ KP_Delete, KP_Decimal ] };
+ key <LVL3> { [ ISO_Level3_Shift ] };
+ key <LSGT> { [ less, greater, bar, brokenbar ] };
+ key <FK11> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ]
+ };
+ key <FK12> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ]
+ };
+ key <KATA> { [ Katakana ] };
+ key <HIRA> { [ Hiragana ] };
+ key <HENK> { [ Henkan_Mode ] };
+ key <HKTG> { [ Hiragana_Katakana ] };
+ key <MUHE> { [ Muhenkan ] };
+ key <KPEN> { [ KP_Enter ] };
+ key <RCTL> { [ Control_R ] };
+ key <KPDV> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ]
+ };
+ key <PRSC> {
+ type= "PC_ALT_LEVEL2",
+ symbols[Group1]= [ Print, Sys_Req ]
+ };
+ key <RALT> {
+ type= "TWO_LEVEL",
+ symbols[Group1]= [ Alt_R, Meta_R ]
+ };
+ key <LNFD> { [ Linefeed ] };
+ key <HOME> { [ Home ] };
+ key <UP> { [ Up ] };
+ key <PGUP> { [ Prior ] };
+ key <LEFT> { [ Left ] };
+ key <RGHT> { [ Right ] };
+ key <END> { [ End ] };
+ key <DOWN> { [ Down ] };
+ key <PGDN> { [ Next ] };
+ key <INS> { [ Insert ] };
+ key <DELE> { [ Delete ] };
+ key <MUTE> { [ XF86AudioMute ] };
+ key <VOL-> { [ XF86AudioLowerVolume ] };
+ key <VOL+> { [ XF86AudioRaiseVolume ] };
+ key <POWR> { [ XF86PowerOff ] };
+ key <KPEQ> { [ KP_Equal ] };
+ key <I126> { [ plusminus ] };
+ key <PAUS> {
+ type= "PC_CONTROL_LEVEL2",
+ symbols[Group1]= [ Pause, Break ]
+ };
+ key <I128> { [ XF86LaunchA ] };
+ key <I129> { [ KP_Decimal, KP_Decimal ] };
+ key <HNGL> { [ Hangul ] };
+ key <HJCV> { [ Hangul_Hanja ] };
+ key <LWIN> { [ Super_L ] };
+ key <RWIN> { [ Super_R ] };
+ key <COMP> { [ Menu ] };
+ key <STOP> { [ Cancel ] };
+ key <AGAI> { [ Redo ] };
+ key <PROP> { [ SunProps ] };
+ key <UNDO> { [ Undo ] };
+ key <FRNT> { [ SunFront ] };
+ key <COPY> { [ XF86Copy ] };
+ key <OPEN> { [ XF86Open ] };
+ key <PAST> { [ XF86Paste ] };
+ key <FIND> { [ Find ] };
+ key <CUT> { [ XF86Cut ] };
+ key <HELP> { [ Help ] };
+ key <I147> { [ XF86MenuKB ] };
+ key <I148> { [ XF86Calculator ] };
+ key <I150> { [ XF86Sleep ] };
+ key <I151> { [ XF86WakeUp ] };
+ key <I152> { [ XF86Explorer ] };
+ key <I153> { [ XF86Send ] };
+ key <I155> { [ XF86Xfer ] };
+ key <I156> { [ XF86Launch1 ] };
+ key <I157> { [ XF86Launch2 ] };
+ key <I158> { [ XF86WWW ] };
+ key <I159> { [ XF86DOS ] };
+ key <I160> { [ XF86ScreenSaver ] };
+ key <I162> { [ XF86RotateWindows ] };
+ key <I163> { [ XF86Mail ] };
+ key <I164> { [ XF86Favorites ] };
+ key <I165> { [ XF86MyComputer ] };
+ key <I166> { [ XF86Back ] };
+ key <I167> { [ XF86Forward ] };
+ key <I169> { [ XF86Eject ] };
+ key <I170> { [ XF86Eject, XF86Eject ] };
+ key <I171> { [ XF86AudioNext ] };
+ key <I172> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I173> { [ XF86AudioPrev ] };
+ key <I174> { [ XF86AudioStop, XF86Eject ] };
+ key <I175> { [ XF86AudioRecord ] };
+ key <I176> { [ XF86AudioRewind ] };
+ key <I177> { [ XF86Phone ] };
+ key <I179> { [ XF86Tools ] };
+ key <I180> { [ XF86HomePage ] };
+ key <I181> { [ XF86Reload ] };
+ key <I182> { [ XF86Close ] };
+ key <I185> { [ XF86ScrollUp ] };
+ key <I186> { [ XF86ScrollDown ] };
+ key <I187> { [ parenleft ] };
+ key <I188> { [ parenright ] };
+ key <I189> { [ XF86New ] };
+ key <I190> { [ Redo ] };
+ key <FK13> { [ XF86Tools ] };
+ key <FK14> { [ XF86Launch5 ] };
+ key <FK15> { [ XF86Launch6 ] };
+ key <FK16> { [ XF86Launch7 ] };
+ key <FK17> { [ XF86Launch8 ] };
+ key <FK18> { [ XF86Launch9 ] };
+ key <FK20> { [ XF86AudioMicMute ] };
+ key <FK21> { [ XF86TouchpadToggle ] };
+ key <FK22> { [ XF86TouchpadOn ] };
+ key <FK23> { [ XF86TouchpadOff ] };
+ key <MDSW> { [ Mode_switch ] };
+ key <ALT> { [ NoSymbol, Alt_L ] };
+ key <META> { [ NoSymbol, Meta_L ] };
+ key <SUPR> { [ NoSymbol, Super_L ] };
+ key <HYPR> { [ NoSymbol, Hyper_L ] };
+ key <I208> { [ XF86AudioPlay ] };
+ key <I209> { [ XF86AudioPause ] };
+ key <I210> { [ XF86Launch3 ] };
+ key <I211> { [ XF86Launch4 ] };
+ key <I212> { [ XF86LaunchB ] };
+ key <I213> { [ XF86Suspend ] };
+ key <I214> { [ XF86Close ] };
+ key <I215> { [ XF86AudioPlay ] };
+ key <I216> { [ XF86AudioForward ] };
+ key <I218> { [ Print ] };
+ key <I220> { [ XF86WebCam ] };
+ key <I223> { [ XF86Mail ] };
+ key <I224> { [ XF86Messenger ] };
+ key <I225> { [ XF86Search ] };
+ key <I226> { [ XF86Go ] };
+ key <I227> { [ XF86Finance ] };
+ key <I228> { [ XF86Game ] };
+ key <I229> { [ XF86Shop ] };
+ key <I231> { [ Cancel ] };
+ key <I232> { [ XF86MonBrightnessDown ] };
+ key <I233> { [ XF86MonBrightnessUp ] };
+ key <I234> { [ XF86AudioMedia ] };
+ key <I235> { [ XF86Display ] };
+ key <I236> { [ XF86KbdLightOnOff ] };
+ key <I237> { [ XF86KbdBrightnessDown ] };
+ key <I238> { [ XF86KbdBrightnessUp ] };
+ key <I239> { [ XF86Send ] };
+ key <I240> { [ XF86Reply ] };
+ key <I241> { [ XF86MailForward ] };
+ key <I242> { [ XF86Save ] };
+ key <I243> { [ XF86Documents ] };
+ key <I244> { [ XF86Battery ] };
+ key <I245> { [ XF86Bluetooth ] };
+ key <I246> { [ XF86WLAN ] };
+ modifier_map Control { <LCTL> };
+ modifier_map Shift { <LFSH> };
+ modifier_map Shift { <RTSH> };
+ modifier_map Mod1 { <LALT> };
+ modifier_map Lock { <CAPS> };
+ modifier_map Mod2 { <NMLK> };
+ modifier_map Mod5 { <LVL3> };
+ modifier_map Control { <RCTL> };
+ modifier_map Mod1 { <RALT> };
+ modifier_map Mod4 { <LWIN> };
+ modifier_map Mod4 { <RWIN> };
+ modifier_map Mod5 { <MDSW> };
+ modifier_map Mod1 { <META> };
+ modifier_map Mod4 { <SUPR> };
+ modifier_map Mod4 { <HYPR> };
+};
+
+};
diff --git a/test/data/keymaps/no-types.xkb b/test/data/keymaps/no-types.xkb
new file mode 100644
index 0000000..2f70e3e
--- /dev/null
+++ b/test/data/keymaps/no-types.xkb
@@ -0,0 +1,1025 @@
+xkb_keymap {
+ xkb_keycodes {
+ minimum = 8;
+ maximum = 255;
+ <ESC> = 9;
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <RTRN> = 36;
+ <LCTL> = 37;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+ <TLDE> = 49;
+ <LFSH> = 50;
+ <BKSL> = 51;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+ <KPMU> = 63;
+ <LALT> = 64;
+ <SPCE> = 65;
+ <CAPS> = 66;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <NMLK> = 77;
+ <SCLK> = 78;
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPSU> = 82;
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+ <KPAD> = 86;
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KP0> = 90;
+ <KPDL> = 91;
+ <LVL3> = 92;
+ <LSGT> = 94;
+ <FK11> = 95;
+ <FK12> = 96;
+ <AB11> = 97;
+ <KATA> = 98;
+ <HIRA> = 99;
+ <HENK> = 100;
+ <HKTG> = 101;
+ <MUHE> = 102;
+ <JPCM> = 103;
+ <KPEN> = 104;
+ <RCTL> = 105;
+ <KPDV> = 106;
+ <PRSC> = 107;
+ <RALT> = 108;
+ <LNFD> = 109;
+ <HOME> = 110;
+ <UP> = 111;
+ <PGUP> = 112;
+ <LEFT> = 113;
+ <RGHT> = 114;
+ <END> = 115;
+ <DOWN> = 116;
+ <PGDN> = 117;
+ <INS> = 118;
+ <DELE> = 119;
+ <I120> = 120;
+ <MUTE> = 121;
+ <VOL-> = 122;
+ <VOL+> = 123;
+ <POWR> = 124;
+ <KPEQ> = 125;
+ <I126> = 126;
+ <PAUS> = 127;
+ <I128> = 128;
+ <I129> = 129;
+ <HNGL> = 130;
+ <HJCV> = 131;
+ <AE13> = 132;
+ <LWIN> = 133;
+ <RWIN> = 134;
+ <COMP> = 135;
+ <STOP> = 136;
+ <AGAI> = 137;
+ <PROP> = 138;
+ <UNDO> = 139;
+ <FRNT> = 140;
+ <COPY> = 141;
+ <OPEN> = 142;
+ <PAST> = 143;
+ <FIND> = 144;
+ <CUT> = 145;
+ <HELP> = 146;
+ <I147> = 147;
+ <I148> = 148;
+ <I149> = 149;
+ <I150> = 150;
+ <I151> = 151;
+ <I152> = 152;
+ <I153> = 153;
+ <I154> = 154;
+ <I155> = 155;
+ <I156> = 156;
+ <I157> = 157;
+ <I158> = 158;
+ <I159> = 159;
+ <I160> = 160;
+ <I161> = 161;
+ <I162> = 162;
+ <I163> = 163;
+ <I164> = 164;
+ <I165> = 165;
+ <I166> = 166;
+ <I167> = 167;
+ <I168> = 168;
+ <I169> = 169;
+ <I170> = 170;
+ <I171> = 171;
+ <I172> = 172;
+ <I173> = 173;
+ <I174> = 174;
+ <I175> = 175;
+ <I176> = 176;
+ <I177> = 177;
+ <I178> = 178;
+ <I179> = 179;
+ <I180> = 180;
+ <I181> = 181;
+ <I182> = 182;
+ <I183> = 183;
+ <I184> = 184;
+ <I185> = 185;
+ <I186> = 186;
+ <I187> = 187;
+ <I188> = 188;
+ <I189> = 189;
+ <I190> = 190;
+ <FK13> = 191;
+ <FK14> = 192;
+ <FK15> = 193;
+ <FK16> = 194;
+ <FK17> = 195;
+ <FK18> = 196;
+ <FK19> = 197;
+ <FK20> = 198;
+ <FK21> = 199;
+ <FK22> = 200;
+ <FK23> = 201;
+ <FK24> = 202;
+ <MDSW> = 203;
+ <ALT> = 204;
+ <META> = 205;
+ <SUPR> = 206;
+ <HYPR> = 207;
+ <I208> = 208;
+ <I209> = 209;
+ <I210> = 210;
+ <I211> = 211;
+ <I212> = 212;
+ <I213> = 213;
+ <I214> = 214;
+ <I215> = 215;
+ <I216> = 216;
+ <I217> = 217;
+ <I218> = 218;
+ <I219> = 219;
+ <I220> = 220;
+ <I221> = 221;
+ <I222> = 222;
+ <I223> = 223;
+ <I224> = 224;
+ <I225> = 225;
+ <I226> = 226;
+ <I227> = 227;
+ <I228> = 228;
+ <I229> = 229;
+ <I230> = 230;
+ <I231> = 231;
+ <I232> = 232;
+ <I233> = 233;
+ <I234> = 234;
+ <I235> = 235;
+ <I236> = 236;
+ <I237> = 237;
+ <I238> = 238;
+ <I239> = 239;
+ <I240> = 240;
+ <I241> = 241;
+ <I242> = 242;
+ <I243> = 243;
+ <I244> = 244;
+ <I245> = 245;
+ <I246> = 246;
+ <I247> = 247;
+ <I248> = 248;
+ <I249> = 249;
+ <I250> = 250;
+ <I251> = 251;
+ <I252> = 252;
+ <I253> = 253;
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+ indicator 4 = "Compose";
+ indicator 5 = "Kana";
+ indicator 6 = "Sleep";
+ indicator 7 = "Suspend";
+ indicator 8 = "Mute";
+ indicator 9 = "Misc";
+ indicator 10 = "Mail";
+ indicator 11 = "Charging";
+ indicator 12 = "Shift Lock";
+ indicator 13 = "Group 2";
+ indicator 14 = "Mouse Keys";
+ alias <AC12> = <BKSL>;
+ alias <MENU> = <COMP>;
+ alias <HZTG> = <TLDE>;
+ alias <LMTA> = <LWIN>;
+ alias <RMTA> = <RWIN>;
+ alias <ALGR> = <RALT>;
+ alias <KPPT> = <I129>;
+ alias <LatQ> = <AD01>;
+ alias <LatW> = <AD02>;
+ alias <LatE> = <AD03>;
+ alias <LatR> = <AD04>;
+ alias <LatT> = <AD05>;
+ alias <LatY> = <AD06>;
+ alias <LatU> = <AD07>;
+ alias <LatI> = <AD08>;
+ alias <LatO> = <AD09>;
+ alias <LatP> = <AD10>;
+ alias <LatA> = <AC01>;
+ alias <LatS> = <AC02>;
+ alias <LatD> = <AC03>;
+ alias <LatF> = <AC04>;
+ alias <LatG> = <AC05>;
+ alias <LatH> = <AC06>;
+ alias <LatJ> = <AC07>;
+ alias <LatK> = <AC08>;
+ alias <LatL> = <AC09>;
+ alias <LatZ> = <AB01>;
+ alias <LatX> = <AB02>;
+ alias <LatC> = <AB03>;
+ alias <LatV> = <AB04>;
+ alias <LatB> = <AB05>;
+ alias <LatN> = <AB06>;
+ alias <LatM> = <AB07>;
+ };
+
+ xkb_types {
+ };
+
+ xkb_compatibility {
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ interpret.useModMapMods= AnyLevel;
+ interpret.repeat= false;
+ interpret.locking= false;
+ interpret ISO_Level2_Latch+Exactly(Shift) {
+ useModMapMods=level1;
+ action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
+ };
+ interpret Shift_Lock+AnyOf(Shift+Lock) {
+ action= LockMods(modifiers=Shift);
+ };
+ interpret Num_Lock+AnyOf(all) {
+ virtualModifier= NumLock;
+ action= LockMods(modifiers=NumLock);
+ };
+ interpret ISO_Lock+AnyOf(all) {
+ action= NoAction();
+ };
+ interpret ISO_Level3_Shift+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret Alt_L+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Alt_R+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_L+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_R+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_L+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_R+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_L+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_R+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Scroll_Lock+AnyOf(all) {
+ virtualModifier= ScrollLock;
+ action= LockMods(modifiers=modMapMods);
+ };
+ interpret ISO_Level5_Shift+AnyOf(all) {
+ virtualModifier= LevelFive;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Mode_switch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= SetGroup(group=+1);
+ };
+ interpret ISO_Level3_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret ISO_Group_Latch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LatchGroup(group=2);
+ };
+ interpret ISO_Next_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=+1);
+ };
+ interpret ISO_Prev_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=-1);
+ };
+ interpret ISO_First_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=1);
+ };
+ interpret ISO_Last_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=2);
+ };
+ interpret KP_1+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_End+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_2+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_Down+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_3+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_Next+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_4+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_Left+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_6+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_Right+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_7+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_Home+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_8+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_Up+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_9+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_Prior+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_5+AnyOfOrNone(all) {
+ repeat= true;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_Begin+AnyOfOrNone(all) {
+ repeat= true;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_F2+AnyOfOrNone(all) {
+ repeat= true;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_Divide+AnyOfOrNone(all) {
+ repeat= true;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_F3+AnyOfOrNone(all) {
+ repeat= true;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_Multiply+AnyOfOrNone(all) {
+ repeat= true;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_F4+AnyOfOrNone(all) {
+ repeat= true;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Subtract+AnyOfOrNone(all) {
+ repeat= true;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Separator+AnyOfOrNone(all) {
+ repeat= true;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_Add+AnyOfOrNone(all) {
+ repeat= true;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_0+AnyOfOrNone(all) {
+ repeat= true;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Insert+AnyOfOrNone(all) {
+ repeat= true;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Decimal+AnyOfOrNone(all) {
+ repeat= true;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret KP_Delete+AnyOfOrNone(all) {
+ repeat= true;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret F25+AnyOfOrNone(all) {
+ repeat= true;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret F26+AnyOfOrNone(all) {
+ repeat= true;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret F27+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret F29+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret F31+AnyOfOrNone(all) {
+ repeat= true;
+ action= PtrBtn(button=default);
+ };
+ interpret F33+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret F35+AnyOfOrNone(all) {
+ repeat= true;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret Pointer_Button_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default);
+ };
+ interpret Pointer_Button1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1);
+ };
+ interpret Pointer_Button2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2);
+ };
+ interpret Pointer_Button3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3);
+ };
+ interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret Pointer_DblClick1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1,count=2);
+ };
+ interpret Pointer_DblClick2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2,count=2);
+ };
+ interpret Pointer_DblClick3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3,count=2);
+ };
+ interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=default,affect=both);
+ };
+ interpret Pointer_Drag1+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=1,affect=both);
+ };
+ interpret Pointer_Drag2+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=2,affect=both);
+ };
+ interpret Pointer_Drag3+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=3,affect=both);
+ };
+ interpret Pointer_EnableKeys+AnyOfOrNone(all) {
+ action= LockControls(controls=mouseKeys);
+ };
+ interpret Pointer_Accelerate+AnyOfOrNone(all) {
+ action= LockControls(controls=mouseKeysAccel);
+ };
+ interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=+1);
+ };
+ interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=-1);
+ };
+ interpret AccessX_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=accessXKeys);
+ };
+ interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=accessXFeedback);
+ };
+ interpret RepeatKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=repeatKeys);
+ };
+ interpret SlowKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=slowKeys);
+ };
+ interpret BounceKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=bounceKeys);
+ };
+ interpret StickyKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=stickyKeys);
+ };
+ interpret MouseKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=mouseKeys);
+ };
+ interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=mouseKeysAccel);
+ };
+ interpret Overlay1_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=none);
+ };
+ interpret Overlay2_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=none);
+ };
+ interpret AudibleBell_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=audibleBell);
+ };
+ interpret Terminate_Server+AnyOfOrNone(all) {
+ action= Terminate();
+ };
+ interpret Alt_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Alt_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Meta_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Meta_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Super_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Super_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Hyper_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Hyper_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Shift_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Shift,clearLocks);
+ };
+ interpret XF86Switch_VT_1+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=1,!same);
+ };
+ interpret XF86Switch_VT_2+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=2,!same);
+ };
+ interpret XF86Switch_VT_3+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=3,!same);
+ };
+ interpret XF86Switch_VT_4+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=4,!same);
+ };
+ interpret XF86Switch_VT_5+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=5,!same);
+ };
+ interpret XF86Switch_VT_6+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=6,!same);
+ };
+ interpret XF86Switch_VT_7+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=7,!same);
+ };
+ interpret XF86Switch_VT_8+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=8,!same);
+ };
+ interpret XF86Switch_VT_9+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=9,!same);
+ };
+ interpret XF86Switch_VT_10+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=10,!same);
+ };
+ interpret XF86Switch_VT_11+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=11,!same);
+ };
+ interpret XF86Switch_VT_12+AnyOfOrNone(all) {
+ repeat= true;
+ action= SwitchScreen(screen=12,!same);
+ };
+ interpret XF86LogGrabInfo+AnyOfOrNone(all) {
+ repeat= true;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86LogWindowTree+AnyOfOrNone(all) {
+ repeat= true;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86Next_VMode+AnyOfOrNone(all) {
+ repeat= true;
+ action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret XF86Prev_VMode+AnyOfOrNone(all) {
+ repeat= true;
+ action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret ISO_Level5_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Caps_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+Exactly(Lock) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+AnyOf(all) {
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ group 2 = AltGr;
+ group 3 = AltGr;
+ group 4 = AltGr;
+ indicator "Caps Lock" {
+ whichModState= locked;
+ modifiers= Lock;
+ };
+ indicator "Num Lock" {
+ whichModState= locked;
+ modifiers= NumLock;
+ };
+ indicator "Scroll Lock" {
+ whichModState= locked;
+ modifiers= ScrollLock;
+ };
+ indicator "Shift Lock" {
+ whichModState= locked;
+ modifiers= Shift;
+ };
+ indicator "Group 2" {
+ groups= 0xfe;
+ };
+ indicator "Mouse Keys" {
+ controls= mouseKeys;
+ };
+ };
+
+ xkb_symbols {
+ name[group1]="English (US)";
+
+ key <ESC> { [ Escape ] };
+ key <AE01> { [ 1 ] };
+ key <AE02> { [ 2 ] };
+ key <AE03> { [ 3 ] };
+ key <AE04> { [ 4 ] };
+ key <AE05> { [ 5 ] };
+ key <AE06> { [ 6 ] };
+ key <AE07> { [ 7 ] };
+ key <AE08> { [ 8 ] };
+ key <AE09> { [ 9 ] };
+ key <AE10> { [ 0 ] };
+ key <AE11> { [ minus ] };
+ key <AE12> { [ equal ] };
+ key <BKSP> { [ BackSpace ] };
+ key <TAB> { [ Tab ] };
+ key <AD01> { [ q ] };
+ key <AD02> { [ w ] };
+ key <AD03> { [ e ] };
+ key <AD04> { [ r ] };
+ key <AD05> { [ t ] };
+ key <AD06> { [ y ] };
+ key <AD07> { [ u ] };
+ key <AD08> { [ i ] };
+ key <AD09> { [ o ] };
+ key <AD10> { [ p ] };
+ key <AD11> { [ bracketleft ] };
+ key <AD12> { [ bracketright ] };
+ key <RTRN> { [ Return ] };
+ key <LCTL> { [ Control_L ] };
+ key <AC01> { [ a ] };
+ key <AC02> { [ s ] };
+ key <AC03> { [ d ] };
+ key <AC04> { [ f ] };
+ key <AC05> { [ g ] };
+ key <AC06> { [ h ] };
+ key <AC07> { [ j ] };
+ key <AC08> { [ k ] };
+ key <AC09> { [ l ] };
+ key <AC10> { [ semicolon ] };
+ key <AC11> { [ apostrophe ] };
+ key <TLDE> { [ grave ] };
+ key <LFSH> { [ Shift_L ] };
+ key <BKSL> { [ NoSymbol ] };
+ key <AB01> { [ z ] };
+ key <AB02> { [ x ] };
+ key <AB03> { [ c ] };
+ key <AB04> { [ v ] };
+ key <AB05> { [ b ] };
+ key <AB06> { [ n ] };
+ key <AB07> { [ m ] };
+ key <AB08> { [ comma ] };
+ key <AB09> { [ period ] };
+ key <AB10> { [ slash ] };
+ key <RTSH> { [ Shift_R ] };
+ key <KPMU> { [ KP_Multiply ] };
+ key <LALT> { [ Alt_L ] };
+ key <SPCE> { [ space ] };
+ key <CAPS> { [ Caps_Lock ] };
+ key <FK01> { [ F1 ] };
+ key <FK02> { [ F2 ] };
+ key <FK03> { [ F3 ] };
+ key <FK04> { [ F4 ] };
+ key <FK05> { [ F5 ] };
+ key <FK06> { [ F6 ] };
+ key <FK07> { [ F7 ] };
+ key <FK08> { [ F8 ] };
+ key <FK09> { [ F9 ] };
+ key <FK10> { [ F10 ] };
+ key <NMLK> { [ Num_Lock ] };
+ key <SCLK> { [ Scroll_Lock ] };
+ key <KP7> { [ KP_Home ] };
+ key <KP8> { [ KP_Up ] };
+ key <KP9> { [ KP_Prior ] };
+ key <KPSU> { [ KP_Subtract ] };
+ key <KP4> { [ KP_Left ] };
+ key <KP5> { [ KP_Begin ] };
+ key <KP6> { [ KP_Right ] };
+ key <KPAD> { [ KP_Add ] };
+ key <KP1> { [ KP_End ] };
+ key <KP2> { [ KP_Down ] };
+ key <KP3> { [ KP_Next ] };
+ key <KP0> { [ KP_Insert ] };
+ key <KPDL> { [ KP_Delete ] };
+ key <LVL3> { [ ISO_Level3_Shift ] };
+ key <LSGT> { [ less ] };
+ key <FK11> { [ F11 ] };
+ key <FK12> { [ F12 ] };
+ key <KATA> { [ Katakana ] };
+ key <HIRA> { [ Hiragana ] };
+ key <HENK> { [ Henkan_Mode ] };
+ key <HKTG> { [ Hiragana_Katakana ] };
+ key <MUHE> { [ Muhenkan ] };
+ key <KPEN> { [ KP_Enter ] };
+ key <RCTL> { [ Control_R ] };
+ key <KPDV> { [ KP_Divide ] };
+ key <PRSC> { [ Print ] };
+ key <RALT> { [ Alt_R ] };
+ key <LNFD> { [ Linefeed ] };
+ key <HOME> { [ Home ] };
+ key <UP> { [ Up ] };
+ key <PGUP> { [ Prior ] };
+ key <LEFT> { [ Left ] };
+ key <RGHT> { [ Right ] };
+ key <END> { [ End ] };
+ key <DOWN> { [ Down ] };
+ key <PGDN> { [ Next ] };
+ key <INS> { [ Insert ] };
+ key <DELE> { [ Delete ] };
+ key <MUTE> { [ XF86AudioMute ] };
+ key <VOL-> { [ XF86AudioLowerVolume ] };
+ key <VOL+> { [ XF86AudioRaiseVolume ] };
+ key <POWR> { [ XF86PowerOff ] };
+ key <KPEQ> { [ KP_Equal ] };
+ key <I126> { [ plusminus ] };
+ key <PAUS> { [ Pause ] };
+ key <I128> { [ XF86LaunchA ] };
+ key <I129> { [ KP_Decimal] };
+ key <HNGL> { [ Hangul ] };
+ key <HJCV> { [ Hangul_Hanja ] };
+ key <LWIN> { [ Super_L ] };
+ key <RWIN> { [ Super_R ] };
+ key <COMP> { [ Menu ] };
+ key <STOP> { [ Cancel ] };
+ key <AGAI> { [ Redo ] };
+ key <PROP> { [ SunProps ] };
+ key <UNDO> { [ Undo ] };
+ key <FRNT> { [ SunFront ] };
+ key <COPY> { [ XF86Copy ] };
+ key <OPEN> { [ SunOpen ] };
+ key <PAST> { [ XF86Paste ] };
+ key <FIND> { [ Find ] };
+ key <CUT> { [ XF86Cut ] };
+ key <HELP> { [ Help ] };
+ key <I147> { [ XF86MenuKB ] };
+ key <I148> { [ XF86Calculator ] };
+ key <I150> { [ XF86Sleep ] };
+ key <I151> { [ XF86WakeUp ] };
+ key <I152> { [ XF86Explorer ] };
+ key <I153> { [ XF86Send ] };
+ key <I155> { [ XF86Xfer ] };
+ key <I156> { [ XF86Launch1 ] };
+ key <I157> { [ XF86Launch2 ] };
+ key <I158> { [ XF86WWW ] };
+ key <I159> { [ XF86DOS ] };
+ key <I160> { [ XF86ScreenSaver ] };
+ key <I162> { [ XF86RotateWindows ] };
+ key <I163> { [ XF86Mail ] };
+ key <I164> { [ XF86Favorites ] };
+ key <I165> { [ XF86MyComputer ] };
+ key <I166> { [ XF86Back ] };
+ key <I167> { [ XF86Forward ] };
+ key <I169> { [ XF86Eject ] };
+ key <I170> { [ XF86Eject ] };
+ key <I171> { [ XF86AudioNext ] };
+ key <I172> { [ XF86AudioPlay ] };
+ key <I173> { [ XF86AudioPrev ] };
+ key <I174> { [ XF86AudioStop ] };
+ key <I175> { [ XF86AudioRecord ] };
+ key <I176> { [ XF86AudioRewind ] };
+ key <I177> { [ XF86Phone ] };
+ key <I179> { [ XF86Tools ] };
+ key <I180> { [ XF86HomePage ] };
+ key <I181> { [ XF86Reload ] };
+ key <I182> { [ XF86Close ] };
+ key <I185> { [ XF86ScrollUp ] };
+ key <I186> { [ XF86ScrollDown ] };
+ key <I187> { [ parenleft ] };
+ key <I188> { [ parenright ] };
+ key <I189> { [ XF86New ] };
+ key <I190> { [ Redo ] };
+ key <FK13> { [ XF86Tools ] };
+ key <FK14> { [ XF86Launch5 ] };
+ key <FK15> { [ XF86Launch6 ] };
+ key <FK16> { [ XF86Launch7 ] };
+ key <FK17> { [ XF86Launch8 ] };
+ key <FK18> { [ XF86Launch9 ] };
+ key <FK21> { [ XF86TouchpadToggle ] };
+ key <FK22> { [ XF86TouchpadOn ] };
+ key <FK23> { [ XF86TouchpadOff ] };
+ key <MDSW> { [ Mode_switch ] };
+ key <ALT> { [ NoSymbol ] };
+ key <META> { [ NoSymbol ] };
+ key <SUPR> { [ NoSymbol ] };
+ key <HYPR> { [ NoSymbol ] };
+ key <I208> { [ XF86AudioPlay ] };
+ key <I209> { [ XF86AudioPause ] };
+ key <I210> { [ XF86Launch3 ] };
+ key <I211> { [ XF86Launch4 ] };
+ key <I212> { [ XF86LaunchB ] };
+ key <I213> { [ XF86Suspend ] };
+ key <I214> { [ XF86Close ] };
+ key <I215> { [ XF86AudioPlay ] };
+ key <I216> { [ XF86AudioForward ] };
+ key <I218> { [ Print ] };
+ key <I220> { [ XF86WebCam ] };
+ key <I223> { [ XF86Mail ] };
+ key <I224> { [ XF86Messenger ] };
+ key <I225> { [ XF86Search ] };
+ key <I226> { [ XF86Go ] };
+ key <I227> { [ XF86Finance ] };
+ key <I228> { [ XF86Game ] };
+ key <I229> { [ XF86Shop ] };
+ key <I231> { [ Cancel ] };
+ key <I232> { [ XF86MonBrightnessDown ] };
+ key <I233> { [ XF86MonBrightnessUp ] };
+ key <I234> { [ XF86AudioMedia ] };
+ key <I235> { [ XF86Display ] };
+ key <I236> { [ XF86KbdLightOnOff ] };
+ key <I237> { [ XF86KbdBrightnessDown ] };
+ key <I238> { [ XF86KbdBrightnessUp ] };
+ key <I239> { [ XF86Send ] };
+ key <I240> { [ XF86Reply ] };
+ key <I241> { [ XF86MailForward ] };
+ key <I242> { [ XF86Save ] };
+ key <I243> { [ XF86Documents ] };
+ key <I244> { [ XF86Battery ] };
+ key <I245> { [ XF86Bluetooth ] };
+ key <I246> { [ XF86WLAN ] };
+ modifier_map Control { <LCTL> };
+ modifier_map Shift { <LFSH> };
+ modifier_map Shift { <RTSH> };
+ modifier_map Mod1 { <LALT> };
+ modifier_map Lock { <CAPS> };
+ modifier_map Mod2 { <NMLK> };
+ modifier_map Mod5 { <LVL3> };
+ modifier_map Control { <RCTL> };
+ modifier_map Mod1 { <RALT> };
+ modifier_map Mod4 { <LWIN> };
+ modifier_map Mod4 { <RWIN> };
+ modifier_map Mod5 { <MDSW> };
+ modifier_map Mod1 { <META> };
+ modifier_map Mod4 { <SUPR> };
+ modifier_map Mod4 { <HYPR> };
+ };
+};
diff --git a/test/data/keymaps/quartz.xkb b/test/data/keymaps/quartz.xkb
new file mode 100644
index 0000000..c976fce
--- /dev/null
+++ b/test/data/keymaps/quartz.xkb
@@ -0,0 +1,1139 @@
+xkb_keymap {
+xkb_keycodes "empty_aliases(qwerty)" {
+ minimum = 8;
+ maximum = 255;
+ virtual indicator 1 = "Caps Lock";
+ virtual indicator 2 = "Num Lock";
+ virtual indicator 3 = "Shift Lock";
+ virtual indicator 4 = "Group 2";
+ virtual indicator 5 = "Mouse Keys";
+ virtual indicator 6 = "Scroll Lock";
+};
+
+xkb_types "complete" {
+
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ type "ONE_LEVEL" {
+ modifiers= none;
+ level_name[Level1]= "Any";
+ };
+ type "TWO_LEVEL" {
+ modifiers= Shift;
+ map[Shift]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ };
+ type "ALPHABETIC" {
+ modifiers= Shift+Lock;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Caps";
+ };
+ type "KEYPAD" {
+ modifiers= Shift+NumLock;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ };
+ type "SHIFT+ALT" {
+ modifiers= Shift+Alt;
+ map[Shift+Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift+Alt";
+ };
+ type "PC_CONTROL_LEVEL2" {
+ modifiers= Control;
+ map[Control]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Control";
+ };
+ type "PC_LCONTROL_LEVEL2" {
+ modifiers= LControl;
+ map[LControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LControl";
+ };
+ type "PC_RCONTROL_LEVEL2" {
+ modifiers= RControl;
+ map[RControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RControl";
+ };
+ type "PC_ALT_LEVEL2" {
+ modifiers= Alt;
+ map[Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt";
+ };
+ type "PC_LALT_LEVEL2" {
+ modifiers= LAlt;
+ map[LAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LAlt";
+ };
+ type "PC_RALT_LEVEL2" {
+ modifiers= RAlt;
+ map[RAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RAlt";
+ };
+ type "CTRL+ALT" {
+ modifiers= Control+Alt;
+ map[Control+Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Ctrl+Alt";
+ };
+ type "LOCAL_EIGHT_LEVEL" {
+ modifiers= Shift+Lock+Control+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Control]= Level5;
+ map[Shift+Lock+Control]= Level5;
+ map[Shift+Control]= Level6;
+ map[Lock+Control]= Level6;
+ map[Control+LevelThree]= Level7;
+ map[Shift+Lock+Control+LevelThree]= Level7;
+ map[Shift+Control+LevelThree]= Level8;
+ map[Lock+Control+LevelThree]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ level_name[Level4]= "Shift Level3";
+ level_name[Level5]= "Ctrl";
+ level_name[Level6]= "Shift Ctrl";
+ level_name[Level7]= "Level3 Ctrl";
+ level_name[Level8]= "Shift Level3 Ctrl";
+ };
+ type "THREE_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ };
+ type "EIGHT_LEVEL" {
+ modifiers= Shift+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level8;
+ map[Shift+Lock+LevelThree+LevelFive]= Level7;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ preserve[Lock+LevelFive]= Lock;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level7;
+ preserve[Lock+LevelThree+LevelFive]= Lock;
+ map[Shift+Lock+LevelThree+LevelFive]= Level8;
+ preserve[Shift+Lock+LevelThree+LevelFive]= Lock;
+ map[Shift+Lock+LevelFive]= Level1;
+ preserve[Shift+Lock+LevelFive]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "FOUR_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_MIXED_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[NumLock]= Level2;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[NumLock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_X" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[LevelThree]= Level2;
+ map[Shift+LevelThree]= Level3;
+ map[Control+Alt]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt Base";
+ level_name[Level3]= "Shift Alt";
+ level_name[Level4]= "Ctrl+Alt";
+ };
+ type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level4;
+ preserve[Lock]= Lock;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "AltGr Base";
+ level_name[Level4]= "Shift AltGr";
+ };
+ type "FOUR_LEVEL_PLUS_LOCK" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock]= Level5;
+ map[Shift+Lock]= Level2;
+ map[Lock+LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "Lock";
+ };
+ type "FOUR_LEVEL_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[NumLock+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Alt Number";
+ };
+};
+
+xkb_compatibility "complete" {
+
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ interpret.useModMapMods= AnyLevel;
+ interpret.repeat= False;
+ interpret.locking= False;
+ interpret ISO_Level2_Latch+Exactly(Shift) {
+ useModMapMods=level1;
+ action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
+ };
+ interpret Shift_Lock+AnyOf(Shift+Lock) {
+ action= LockMods(modifiers=Shift);
+ };
+ interpret Num_Lock+AnyOf(all) {
+ virtualModifier= NumLock;
+ action= LockMods(modifiers=NumLock);
+ };
+ interpret ISO_Lock+AnyOf(all) {
+ action= ISOLock(modifiers=modMapMods,affect=all);
+ };
+ interpret ISO_Level3_Shift+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret Alt_L+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Alt_R+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_L+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_R+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_L+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_R+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_L+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_R+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Scroll_Lock+AnyOf(all) {
+ virtualModifier= ScrollLock;
+ action= LockMods(modifiers=modMapMods);
+ };
+ interpret ISO_Level5_Shift+AnyOf(all) {
+ virtualModifier= LevelFive;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Mode_switch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= SetGroup(group=+1);
+ };
+ interpret ISO_Level3_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret ISO_Group_Latch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LatchGroup(group=2);
+ };
+ interpret ISO_Next_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=+1);
+ };
+ interpret ISO_Prev_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=-1);
+ };
+ interpret ISO_First_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=1);
+ };
+ interpret ISO_Last_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=2);
+ };
+ interpret KP_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_End+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_Down+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_Next+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_Left+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_Right+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_Home+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_Up+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_Prior+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_Begin+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_F2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_Divide+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_F3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_Multiply+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_F4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Subtract+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Separator+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_Add+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_0+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Insert+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Decimal+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret KP_Delete+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret F25+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret F26+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret F27+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret F29+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret F31+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret F33+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret F35+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret Pointer_Button_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default);
+ };
+ interpret Pointer_Button1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1);
+ };
+ interpret Pointer_Button2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2);
+ };
+ interpret Pointer_Button3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3);
+ };
+ interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret Pointer_DblClick1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1,count=2);
+ };
+ interpret Pointer_DblClick2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2,count=2);
+ };
+ interpret Pointer_DblClick3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3,count=2);
+ };
+ interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=default,affect=both);
+ };
+ interpret Pointer_Drag1+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=1,affect=both);
+ };
+ interpret Pointer_Drag2+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=2,affect=both);
+ };
+ interpret Pointer_Drag3+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=3,affect=both);
+ };
+ interpret Pointer_EnableKeys+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret Pointer_Accelerate+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=+1);
+ };
+ interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=-1);
+ };
+ interpret AccessX_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXKeys);
+ };
+ interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXFeedback);
+ };
+ interpret RepeatKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=RepeatKeys);
+ };
+ interpret SlowKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=SlowKeys);
+ };
+ interpret BounceKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=BounceKeys);
+ };
+ interpret StickyKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=StickyKeys);
+ };
+ interpret MouseKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Overlay1_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=Overlay1);
+ };
+ interpret Overlay2_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=Overlay2);
+ };
+ interpret AudibleBell_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AudibleBell);
+ };
+ interpret Terminate_Server+AnyOfOrNone(all) {
+ action= Terminate();
+ };
+ interpret Alt_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Alt_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Meta_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Meta_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Super_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Super_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Hyper_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Hyper_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret XF86Switch_VT_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=1,!same);
+ };
+ interpret XF86Switch_VT_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=2,!same);
+ };
+ interpret XF86Switch_VT_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=3,!same);
+ };
+ interpret XF86Switch_VT_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=4,!same);
+ };
+ interpret XF86Switch_VT_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=5,!same);
+ };
+ interpret XF86Switch_VT_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=6,!same);
+ };
+ interpret XF86Switch_VT_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=7,!same);
+ };
+ interpret XF86Switch_VT_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=8,!same);
+ };
+ interpret XF86Switch_VT_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=9,!same);
+ };
+ interpret XF86Switch_VT_10+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=10,!same);
+ };
+ interpret XF86Switch_VT_11+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=11,!same);
+ };
+ interpret XF86Switch_VT_12+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=12,!same);
+ };
+ interpret XF86Ungrab+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x55,data[1]=0x6e,data[2]=0x67,data[3]=0x72,data[4]=0x61,data[5]=0x62,data[6]=0x00);
+ };
+ interpret XF86ClearGrab+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x43,data[1]=0x6c,data[2]=0x73,data[3]=0x47,data[4]=0x72,data[5]=0x62,data[6]=0x00);
+ };
+ interpret XF86Next_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret XF86Prev_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret ISO_Level5_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Any+Exactly(Lock) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+AnyOf(all) {
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ group 2 = AltGr;
+ group 3 = AltGr;
+ group 4 = AltGr;
+ indicator "Caps Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= Lock;
+ };
+ indicator "Num Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= NumLock;
+ };
+ indicator "Shift Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= Shift;
+ };
+ indicator "Group 2" {
+ !allowExplicit;
+ groups= 0xfe;
+ };
+ indicator "Mouse Keys" {
+ indicatorDrivesKeyboard;
+ controls= mouseKeys;
+ };
+ indicator "Scroll Lock" {
+ whichModState= locked;
+ modifiers= ScrollLock;
+ };
+};
+
+xkb_symbols "unknown" {
+
+ key <> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ a, A ],
+ symbols[Group2]= [ aring, Aring ]
+ };
+ modifier_map Mod2 { <> };
+};
+
+xkb_geometry "pc(pc104)" {
+
+ width= 470;
+ height= 180;
+
+ baseColor= "white";
+ labelColor= "black";
+ xfont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ description= "Generic 104";
+
+ shape "NORM" {
+ corner= 1,
+ { [ 18, 18 ] },
+ { [ 2, 1 ], [ 16, 16 ] }
+ };
+ shape "BKSP" {
+ corner= 1,
+ { [ 38, 18 ] },
+ { [ 2, 1 ], [ 36, 16 ] }
+ };
+ shape "TABK" {
+ corner= 1,
+ { [ 28, 18 ] },
+ { [ 2, 1 ], [ 26, 16 ] }
+ };
+ shape "BKSL" {
+ corner= 1,
+ { [ 28, 18 ] },
+ { [ 2, 1 ], [ 26, 16 ] }
+ };
+ shape "RTRN" {
+ corner= 1,
+ { [ 42, 18 ] },
+ { [ 2, 1 ], [ 40, 16 ] }
+ };
+ shape "CAPS" {
+ corner= 1,
+ { [ 33, 18 ] },
+ { [ 2, 1 ], [ 31, 16 ] }
+ };
+ shape "LFSH" {
+ corner= 1,
+ { [ 42, 18 ] },
+ { [ 2, 1 ], [ 40, 16 ] }
+ };
+ shape "RTSH" {
+ corner= 1,
+ { [ 52, 18 ] },
+ { [ 2, 1 ], [ 50, 16 ] }
+ };
+ shape "MODK" {
+ corner= 1,
+ { [ 27, 18 ] },
+ { [ 2, 1 ], [ 25, 16 ] }
+ };
+ shape "SMOD" {
+ corner= 1,
+ { [ 23, 18 ] },
+ { [ 2, 1 ], [ 21, 16 ] }
+ };
+ shape "SPCE" {
+ corner= 1,
+ { [ 113, 18 ] },
+ { [ 2, 1 ], [ 111, 16 ] }
+ };
+ shape "KP0" {
+ corner= 1,
+ { [ 37, 18 ] },
+ { [ 2, 1 ], [ 35, 16 ] }
+ };
+ shape "KPAD" {
+ corner= 1,
+ { [ 18, 37 ] },
+ { [ 2, 1 ], [ 16, 35 ] }
+ };
+ shape "LEDS" { { [ 75, 20 ] } };
+ shape "LED" { { [ 5, 1 ] } };
+ section "Function" {
+ key.color= "grey20";
+ priority= 7;
+ top= 22;
+ left= 19;
+ width= 351;
+ height= 19;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <ESC>, "NORM", 1 },
+ { <FK01>, "NORM", 20, color="white" },
+ { <FK02>, "NORM", 1, color="white" },
+ { <FK03>, "NORM", 1, color="white" },
+ { <FK04>, "NORM", 1, color="white" },
+ { <FK05>, "NORM", 11, color="white" },
+ { <FK06>, "NORM", 1, color="white" },
+ { <FK07>, "NORM", 1, color="white" },
+ { <FK08>, "NORM", 1, color="white" },
+ { <FK09>, "NORM", 11, color="white" },
+ { <FK10>, "NORM", 1, color="white" },
+ { <FK11>, "NORM", 1, color="white" },
+ { <FK12>, "NORM", 1, color="white" },
+ { <PRSC>, "NORM", 8, color="white" },
+ { <SCLK>, "NORM", 1, color="white" },
+ { <PAUS>, "NORM", 1, color="white" }
+ };
+ };
+ }; // End of "Function" section
+
+ section "Alpha" {
+ key.color= "white";
+ priority= 8;
+ top= 61;
+ left= 19;
+ width= 287;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <TLDE>, "NORM", 1 }, { <AE01>, "NORM", 1 },
+ { <AE02>, "NORM", 1 }, { <AE03>, "NORM", 1 },
+ { <AE04>, "NORM", 1 }, { <AE05>, "NORM", 1 },
+ { <AE06>, "NORM", 1 }, { <AE07>, "NORM", 1 },
+ { <AE08>, "NORM", 1 }, { <AE09>, "NORM", 1 },
+ { <AE10>, "NORM", 1 }, { <AE11>, "NORM", 1 },
+ { <AE12>, "NORM", 1 },
+ { <BKSP>, "BKSP", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <TAB>, "TABK", 1, color="grey20" },
+ { <AD01>, "NORM", 1 }, { <AD02>, "NORM", 1 },
+ { <AD03>, "NORM", 1 }, { <AD04>, "NORM", 1 },
+ { <AD05>, "NORM", 1 }, { <AD06>, "NORM", 1 },
+ { <AD07>, "NORM", 1 }, { <AD08>, "NORM", 1 },
+ { <AD09>, "NORM", 1 }, { <AD10>, "NORM", 1 },
+ { <AD11>, "NORM", 1 }, { <AD12>, "NORM", 1 },
+ { <BKSL>, "BKSL", 1 }
+ };
+ };
+ row {
+ top= 39;
+ left= 1;
+ keys {
+ { <CAPS>, "CAPS", 1, color="grey20" },
+ { <AC01>, "NORM", 1 }, { <AC02>, "NORM", 1 },
+ { <AC03>, "NORM", 1 }, { <AC04>, "NORM", 1 },
+ { <AC05>, "NORM", 1 }, { <AC06>, "NORM", 1 },
+ { <AC07>, "NORM", 1 }, { <AC08>, "NORM", 1 },
+ { <AC09>, "NORM", 1 }, { <AC10>, "NORM", 1 },
+ { <AC11>, "NORM", 1 },
+ { <RTRN>, "RTRN", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 58;
+ left= 1;
+ keys {
+ { <LFSH>, "LFSH", 1, color="grey20" },
+ { <AB01>, "NORM", 1 }, { <AB02>, "NORM", 1 },
+ { <AB03>, "NORM", 1 }, { <AB04>, "NORM", 1 },
+ { <AB05>, "NORM", 1 }, { <AB06>, "NORM", 1 },
+ { <AB07>, "NORM", 1 }, { <AB08>, "NORM", 1 },
+ { <AB09>, "NORM", 1 }, { <AB10>, "NORM", 1 },
+ { <RTSH>, "RTSH", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <LCTL>, "MODK", 1, color="grey20" },
+ { <LWIN>, "SMOD", 1, color="grey20" },
+ { <LALT>, "SMOD", 1, color="grey20" },
+ { <SPCE>, "SPCE", 1 },
+ { <RALT>, "SMOD", 1, color="grey20" },
+ { <RWIN>, "SMOD", 1, color="grey20" },
+ { <MENU>, "SMOD", 1, color="grey20" },
+ { <RCTL>, "SMOD", 1, color="grey20" }
+ };
+ };
+ }; // End of "Alpha" section
+
+ section "Editing" {
+ key.color= "grey20";
+ priority= 9;
+ top= 61;
+ left= 312;
+ width= 58;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <INS>, "NORM", 1 }, { <HOME>, "NORM", 1 },
+ { <PGUP>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <DELE>, "NORM", 1 }, { <END>, "NORM", 1 },
+ { <PGDN>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 58;
+ left= 20;
+ keys {
+ { <UP>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <LEFT>, "NORM", 1 }, { <DOWN>, "NORM", 1 },
+ { <RGHT>, "NORM", 1 }
+ };
+ };
+ }; // End of "Editing" section
+
+ section "Keypad" {
+ key.color= "grey20";
+ priority= 10;
+ top= 61;
+ left= 376;
+ width= 77;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <NMLK>, "NORM", 1 }, { <KPDV>, "NORM", 1 },
+ { <KPMU>, "NORM", 1 }, { <KPSU>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <KP7>, "NORM", 1, color="white" },
+ { <KP8>, "NORM", 1, color="white" },
+ { <KP9>, "NORM", 1, color="white" },
+ { <KPAD>, "KPAD", 1 }
+ };
+ };
+ row {
+ top= 39;
+ left= 1;
+ keys {
+ { <KP4>, "NORM", 1, color="white" },
+ { <KP5>, "NORM", 1, color="white" },
+ { <KP6>, "NORM", 1, color="white" }
+ };
+ };
+ row {
+ top= 58;
+ left= 1;
+ keys {
+ { <KP1>, "NORM", 1, color="white" },
+ { <KP2>, "NORM", 1, color="white" },
+ { <KP3>, "NORM", 1, color="white" },
+ { <KPEN>, "KPAD", 1 }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <KP0>, "KP0", 1, color="white" },
+ { <KPDL>, "NORM", 1, color="white" }
+ };
+ };
+ }; // End of "Keypad" section
+
+ solid "LedPanel" {
+ top= 22;
+ left= 377;
+ priority= 0;
+ color= "grey10";
+ shape= "LEDS";
+ };
+ indicator "Num Lock" {
+ top= 37;
+ left= 382;
+ priority= 1;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ indicator "Caps Lock" {
+ top= 37;
+ left= 407;
+ priority= 2;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ indicator "Scroll Lock" {
+ top= 37;
+ left= 433;
+ priority= 3;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ text "NumLockLabel" {
+ top= 25;
+ left= 378;
+ priority= 4;
+ width= 19.8;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Num\nLock";
+ };
+ text "CapsLockLabel" {
+ top= 25;
+ left= 403;
+ priority= 5;
+ width= 26.4;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Caps\nLock";
+ };
+ text "ScrollLockLabel" {
+ top= 25;
+ left= 428;
+ priority= 6;
+ width= 39.6;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Scroll\nLock";
+ };
+};
+
+}; \ No newline at end of file
diff --git a/test/data/keymaps/stringcomp.data b/test/data/keymaps/stringcomp.data
new file mode 100644
index 0000000..2fd27df
--- /dev/null
+++ b/test/data/keymaps/stringcomp.data
@@ -0,0 +1,1913 @@
+xkb_keymap {
+xkb_keycodes "evdev_aliases(qwerty)" {
+ minimum = 8;
+ maximum = 255;
+ <ESC> = 9;
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <RTRN> = 36;
+ <LCTL> = 37;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+ <TLDE> = 49;
+ <LFSH> = 50;
+ <BKSL> = 51;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+ <KPMU> = 63;
+ <LALT> = 64;
+ <SPCE> = 65;
+ <CAPS> = 66;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <NMLK> = 77;
+ <SCLK> = 78;
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPSU> = 82;
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+ <KPAD> = 86;
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KP0> = 90;
+ <KPDL> = 91;
+ <LVL3> = 92;
+ <LSGT> = 94;
+ <FK11> = 95;
+ <FK12> = 96;
+ <AB11> = 97;
+ <KATA> = 98;
+ <HIRA> = 99;
+ <HENK> = 100;
+ <HKTG> = 101;
+ <MUHE> = 102;
+ <JPCM> = 103;
+ <KPEN> = 104;
+ <RCTL> = 105;
+ <KPDV> = 106;
+ <PRSC> = 107;
+ <RALT> = 108;
+ <LNFD> = 109;
+ <HOME> = 110;
+ <UP> = 111;
+ <PGUP> = 112;
+ <LEFT> = 113;
+ <RGHT> = 114;
+ <END> = 115;
+ <DOWN> = 116;
+ <PGDN> = 117;
+ <INS> = 118;
+ <DELE> = 119;
+ <I120> = 120;
+ <MUTE> = 121;
+ <VOL-> = 122;
+ <VOL+> = 123;
+ <POWR> = 124;
+ <KPEQ> = 125;
+ <I126> = 126;
+ <PAUS> = 127;
+ <I128> = 128;
+ <I129> = 129;
+ <HNGL> = 130;
+ <HJCV> = 131;
+ <AE13> = 132;
+ <LWIN> = 133;
+ <RWIN> = 134;
+ <COMP> = 135;
+ <STOP> = 136;
+ <AGAI> = 137;
+ <PROP> = 138;
+ <UNDO> = 139;
+ <FRNT> = 140;
+ <COPY> = 141;
+ <OPEN> = 142;
+ <PAST> = 143;
+ <FIND> = 144;
+ <CUT> = 145;
+ <HELP> = 146;
+ <I147> = 147;
+ <I148> = 148;
+ <I149> = 149;
+ <I150> = 150;
+ <I151> = 151;
+ <I152> = 152;
+ <I153> = 153;
+ <I154> = 154;
+ <I155> = 155;
+ <I156> = 156;
+ <I157> = 157;
+ <I158> = 158;
+ <I159> = 159;
+ <I160> = 160;
+ <I161> = 161;
+ <I162> = 162;
+ <I163> = 163;
+ <I164> = 164;
+ <I165> = 165;
+ <I166> = 166;
+ <I167> = 167;
+ <I168> = 168;
+ <I169> = 169;
+ <I170> = 170;
+ <I171> = 171;
+ <I172> = 172;
+ <I173> = 173;
+ <I174> = 174;
+ <I175> = 175;
+ <I176> = 176;
+ <I177> = 177;
+ <I178> = 178;
+ <I179> = 179;
+ <I180> = 180;
+ <I181> = 181;
+ <I182> = 182;
+ <I183> = 183;
+ <I184> = 184;
+ <I185> = 185;
+ <I186> = 186;
+ <I187> = 187;
+ <I188> = 188;
+ <I189> = 189;
+ <I190> = 190;
+ <FK13> = 191;
+ <FK14> = 192;
+ <FK15> = 193;
+ <FK16> = 194;
+ <FK17> = 195;
+ <FK18> = 196;
+ <FK19> = 197;
+ <FK20> = 198;
+ <FK21> = 199;
+ <FK22> = 200;
+ <FK23> = 201;
+ <FK24> = 202;
+ <MDSW> = 203;
+ <ALT> = 204;
+ <META> = 205;
+ <SUPR> = 206;
+ <HYPR> = 207;
+ <I208> = 208;
+ <I209> = 209;
+ <I210> = 210;
+ <I211> = 211;
+ <I212> = 212;
+ <I213> = 213;
+ <I214> = 214;
+ <I215> = 215;
+ <I216> = 216;
+ <I217> = 217;
+ <I218> = 218;
+ <I219> = 219;
+ <I220> = 220;
+ <I221> = 221;
+ <I222> = 222;
+ <I223> = 223;
+ <I224> = 224;
+ <I225> = 225;
+ <I226> = 226;
+ <I227> = 227;
+ <I228> = 228;
+ <I229> = 229;
+ <I230> = 230;
+ <I231> = 231;
+ <I232> = 232;
+ <I233> = 233;
+ <I234> = 234;
+ <I235> = 235;
+ <I236> = 236;
+ <I237> = 237;
+ <I238> = 238;
+ <I239> = 239;
+ <I240> = 240;
+ <I241> = 241;
+ <I242> = 242;
+ <I243> = 243;
+ <I244> = 244;
+ <I245> = 245;
+ <I246> = 246;
+ <I247> = 247;
+ <I248> = 248;
+ <I249> = 249;
+ <I250> = 250;
+ <I251> = 251;
+ <I252> = 252;
+ <I253> = 253;
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+ indicator 4 = "Compose";
+ indicator 5 = "Kana";
+ indicator 6 = "Sleep";
+ indicator 7 = "Suspend";
+ indicator 8 = "Mute";
+ indicator 9 = "Misc";
+ indicator 10 = "Mail";
+ indicator 11 = "Charging";
+ indicator 12 = "Shift Lock";
+ indicator 13 = "Group 2";
+ indicator 14 = "Mouse Keys";
+ alias <AC12> = <BKSL>;
+ alias <MENU> = <COMP>;
+ alias <HZTG> = <TLDE>;
+ alias <LMTA> = <LWIN>;
+ alias <RMTA> = <RWIN>;
+ alias <ALGR> = <RALT>;
+ alias <KPPT> = <I129>;
+ alias <LatQ> = <AD01>;
+ alias <LatW> = <AD02>;
+ alias <LatE> = <AD03>;
+ alias <LatR> = <AD04>;
+ alias <LatT> = <AD05>;
+ alias <LatY> = <AD06>;
+ alias <LatU> = <AD07>;
+ alias <LatI> = <AD08>;
+ alias <LatO> = <AD09>;
+ alias <LatP> = <AD10>;
+ alias <LatA> = <AC01>;
+ alias <LatS> = <AC02>;
+ alias <LatD> = <AC03>;
+ alias <LatF> = <AC04>;
+ alias <LatG> = <AC05>;
+ alias <LatH> = <AC06>;
+ alias <LatJ> = <AC07>;
+ alias <LatK> = <AC08>;
+ alias <LatL> = <AC09>;
+ alias <LatZ> = <AB01>;
+ alias <LatX> = <AB02>;
+ alias <LatC> = <AB03>;
+ alias <LatV> = <AB04>;
+ alias <LatB> = <AB05>;
+ alias <LatN> = <AB06>;
+ alias <LatM> = <AB07>;
+};
+
+xkb_types "complete" {
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ type "ONE_LEVEL" {
+ modifiers= none;
+ level_name[1]= "Any";
+ };
+ type "TWO_LEVEL" {
+ modifiers= Shift;
+ map[Shift]= 2;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ };
+ type "ALPHABETIC" {
+ modifiers= Shift+Lock;
+ map[Shift]= 2;
+ map[Lock]= 2;
+ level_name[1]= "Base";
+ level_name[2]= "Caps";
+ };
+ type "SHIFT+ALT" {
+ modifiers= Shift+Alt;
+ map[Shift+Alt]= 2;
+ level_name[1]= "Base";
+ level_name[2]= "Shift+Alt";
+ };
+ type "PC_CONTROL_LEVEL2" {
+ modifiers= Control;
+ map[Control]= 2;
+ level_name[1]= "Base";
+ level_name[2]= "Control";
+ };
+ type "PC_LCONTROL_LEVEL2" {
+ modifiers= LControl;
+ map[LControl]= 2;
+ level_name[1]= "Base";
+ level_name[2]= "LControl";
+ };
+ type "PC_RCONTROL_LEVEL2" {
+ modifiers= RControl;
+ map[RControl]= 2;
+ level_name[1]= "Base";
+ level_name[2]= "RControl";
+ };
+ type "PC_ALT_LEVEL2" {
+ modifiers= Alt;
+ map[Alt]= 2;
+ level_name[1]= "Base";
+ level_name[2]= "Alt";
+ };
+ type "PC_LALT_LEVEL2" {
+ modifiers= LAlt;
+ map[LAlt]= 2;
+ level_name[1]= "Base";
+ level_name[2]= "LAlt";
+ };
+ type "PC_RALT_LEVEL2" {
+ modifiers= RAlt;
+ map[RAlt]= 2;
+ level_name[1]= "Base";
+ level_name[2]= "RAlt";
+ };
+ type "CTRL+ALT" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[Shift]= 2;
+ map[LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ map[Control+Alt]= 5;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ level_name[3]= "Alt Base";
+ level_name[4]= "Shift Alt";
+ level_name[5]= "Ctrl+Alt";
+ };
+ type "LOCAL_EIGHT_LEVEL" {
+ modifiers= Shift+Lock+Control+LevelThree;
+ map[Shift]= 2;
+ map[Lock]= 2;
+ map[LevelThree]= 3;
+ map[Shift+Lock+LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ map[Lock+LevelThree]= 4;
+ map[Control]= 5;
+ map[Shift+Lock+Control]= 5;
+ map[Shift+Control]= 6;
+ map[Lock+Control]= 6;
+ map[Control+LevelThree]= 7;
+ map[Shift+Lock+Control+LevelThree]= 7;
+ map[Shift+Control+LevelThree]= 8;
+ map[Lock+Control+LevelThree]= 8;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ level_name[3]= "Level3";
+ level_name[4]= "Shift Level3";
+ level_name[5]= "Ctrl";
+ level_name[6]= "Shift Ctrl";
+ level_name[7]= "Level3 Ctrl";
+ level_name[8]= "Shift Level3 Ctrl";
+ };
+ type "THREE_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= 2;
+ map[LevelThree]= 3;
+ map[Shift+LevelThree]= 3;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ level_name[3]= "Level3";
+ };
+ type "EIGHT_LEVEL" {
+ modifiers= Shift+LevelThree+LevelFive;
+ map[Shift]= 2;
+ map[LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ map[LevelFive]= 5;
+ map[Shift+LevelFive]= 6;
+ map[LevelThree+LevelFive]= 7;
+ map[Shift+LevelThree+LevelFive]= 8;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ level_name[3]= "Alt Base";
+ level_name[4]= "Shift Alt";
+ level_name[5]= "X";
+ level_name[6]= "X Shift";
+ level_name[7]= "X Alt Base";
+ level_name[8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= 2;
+ map[Lock]= 2;
+ map[LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ map[Lock+LevelThree]= 4;
+ map[Shift+Lock+LevelThree]= 3;
+ map[LevelFive]= 5;
+ map[Shift+LevelFive]= 6;
+ map[Lock+LevelFive]= 6;
+ map[LevelThree+LevelFive]= 7;
+ map[Shift+LevelThree+LevelFive]= 8;
+ map[Lock+LevelThree+LevelFive]= 8;
+ map[Shift+Lock+LevelThree+LevelFive]= 7;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ level_name[3]= "Alt Base";
+ level_name[4]= "Shift Alt";
+ level_name[5]= "X";
+ level_name[6]= "X Shift";
+ level_name[7]= "X Alt Base";
+ level_name[8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= 2;
+ map[Lock]= 2;
+ map[LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ map[Lock+LevelThree]= 3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= 4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ map[LevelFive]= 5;
+ map[Shift+LevelFive]= 6;
+ map[Lock+LevelFive]= 6;
+ preserve[Lock+LevelFive]= Lock;
+ map[LevelThree+LevelFive]= 7;
+ map[Shift+LevelThree+LevelFive]= 8;
+ map[Lock+LevelThree+LevelFive]= 7;
+ preserve[Lock+LevelThree+LevelFive]= Lock;
+ map[Shift+Lock+LevelThree+LevelFive]= 8;
+ preserve[Shift+Lock+LevelThree+LevelFive]= Lock;
+ map[Shift+Lock+LevelFive]= 1;
+ preserve[Shift+Lock+LevelFive]= Lock;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ level_name[3]= "Alt Base";
+ level_name[4]= "Shift Alt";
+ level_name[5]= "X";
+ level_name[6]= "X Shift";
+ level_name[7]= "X Alt Base";
+ level_name[8]= "X Shift Alt";
+ };
+ type "FOUR_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= 2;
+ map[LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ level_name[3]= "Alt Base";
+ level_name[4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= 2;
+ map[Lock]= 2;
+ map[LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ map[Lock+LevelThree]= 4;
+ map[Shift+Lock+LevelThree]= 3;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ level_name[3]= "Alt Base";
+ level_name[4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= 2;
+ map[Lock]= 2;
+ map[LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ map[Lock+LevelThree]= 3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= 4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ level_name[3]= "Alt Base";
+ level_name[4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_MIXED_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[NumLock]= 2;
+ map[Shift]= 2;
+ map[LevelThree]= 3;
+ map[NumLock+LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ map[Shift+NumLock+LevelThree]= 4;
+ level_name[1]= "Base";
+ level_name[2]= "Number";
+ level_name[3]= "Alt Base";
+ level_name[4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_X" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[LevelThree]= 2;
+ map[Shift+LevelThree]= 3;
+ map[Control+Alt]= 4;
+ level_name[1]= "Base";
+ level_name[2]= "Alt Base";
+ level_name[3]= "Shift Alt";
+ level_name[4]= "Ctrl+Alt";
+ };
+ type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= 2;
+ map[Lock]= 4;
+ preserve[Lock]= Lock;
+ map[LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ map[Lock+LevelThree]= 3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= 3;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ level_name[3]= "AltGr Base";
+ level_name[4]= "Shift AltGr";
+ };
+ type "FOUR_LEVEL_PLUS_LOCK" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= 2;
+ map[LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ map[Lock]= 5;
+ map[Shift+Lock]= 2;
+ map[Lock+LevelThree]= 3;
+ map[Shift+Lock+LevelThree]= 4;
+ level_name[1]= "Base";
+ level_name[2]= "Shift";
+ level_name[3]= "Alt Base";
+ level_name[4]= "Shift Alt";
+ level_name[5]= "Lock";
+ };
+ type "KEYPAD" {
+ modifiers= Shift+NumLock;
+ map[Shift]= 2;
+ map[NumLock]= 2;
+ level_name[1]= "Base";
+ level_name[2]= "Number";
+ };
+ type "FOUR_LEVEL_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[Shift]= 2;
+ map[NumLock]= 2;
+ map[LevelThree]= 3;
+ map[Shift+LevelThree]= 4;
+ map[NumLock+LevelThree]= 4;
+ map[Shift+NumLock+LevelThree]= 3;
+ level_name[1]= "Base";
+ level_name[2]= "Number";
+ level_name[3]= "Alt Base";
+ level_name[4]= "Alt Number";
+ };
+};
+
+xkb_compatibility "complete_caps(caps_lock)_4_misc(assign_shift_left_action)_4_level5(level5_lock)_4" {
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ interpret.useModMapMods= AnyLevel;
+ interpret.repeat= False;
+ interpret ISO_Level2_Latch+Exactly(Shift) {
+ useModMapMods=level1;
+ action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
+ };
+ interpret Shift_Lock+AnyOf(Shift+Lock) {
+ action= LockMods(modifiers=Shift);
+ };
+ interpret Num_Lock+AnyOf(all) {
+ virtualModifier= NumLock;
+ action= LockMods(modifiers=NumLock);
+ };
+ interpret ISO_Lock+AnyOf(all) {
+ action= NoAction();
+ };
+ interpret ISO_Level3_Shift+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret Alt_L+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Alt_R+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_L+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_R+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_L+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_R+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_L+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_R+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Scroll_Lock+AnyOf(all) {
+ virtualModifier= ScrollLock;
+ action= LockMods(modifiers=modMapMods);
+ };
+ interpret ISO_Level5_Shift+AnyOf(all) {
+ virtualModifier= LevelFive;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Mode_switch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= SetGroup(group=+1);
+ };
+ interpret ISO_Level3_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret ISO_Group_Latch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LatchGroup(group=2);
+ };
+ interpret ISO_Next_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=+1);
+ };
+ interpret ISO_Prev_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=-1);
+ };
+ interpret ISO_First_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=1);
+ };
+ interpret ISO_Last_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=2);
+ };
+ interpret KP_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_End+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_Down+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_Next+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_Left+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_Right+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_Home+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_Up+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_Prior+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_Begin+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_F2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_Divide+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_F3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_Multiply+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_F4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Subtract+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Separator+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_Add+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_0+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Insert+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Decimal+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret KP_Delete+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret F25+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret F26+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret F27+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret F29+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret F31+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret F33+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret F35+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret Pointer_Button_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default);
+ };
+ interpret Pointer_Button1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1);
+ };
+ interpret Pointer_Button2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2);
+ };
+ interpret Pointer_Button3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3);
+ };
+ interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret Pointer_DblClick1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1,count=2);
+ };
+ interpret Pointer_DblClick2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2,count=2);
+ };
+ interpret Pointer_DblClick3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3,count=2);
+ };
+ interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=default);
+ };
+ interpret Pointer_Drag1+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=1);
+ };
+ interpret Pointer_Drag2+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=2);
+ };
+ interpret Pointer_Drag3+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=3);
+ };
+ interpret Pointer_EnableKeys+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret Pointer_Accelerate+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=+1);
+ };
+ interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=-1);
+ };
+ interpret AccessX_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXKeys);
+ };
+ interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXFeedback);
+ };
+ interpret RepeatKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=RepeatKeys);
+ };
+ interpret SlowKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=SlowKeys);
+ };
+ interpret BounceKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=BounceKeys);
+ };
+ interpret StickyKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=StickyKeys);
+ };
+ interpret MouseKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Overlay1_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=none);
+ };
+ interpret Overlay2_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=none);
+ };
+ interpret AudibleBell_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AudibleBell);
+ };
+ interpret Terminate_Server+AnyOfOrNone(all) {
+ action= Terminate();
+ };
+ interpret Alt_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Alt_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Meta_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Meta_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Super_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Super_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Hyper_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Hyper_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Shift_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Shift);
+ };
+ interpret XF86Switch_VT_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=1,!same);
+ };
+ interpret XF86Switch_VT_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=2,!same);
+ };
+ interpret XF86Switch_VT_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=3,!same);
+ };
+ interpret XF86Switch_VT_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=4,!same);
+ };
+ interpret XF86Switch_VT_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=5,!same);
+ };
+ interpret XF86Switch_VT_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=6,!same);
+ };
+ interpret XF86Switch_VT_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=7,!same);
+ };
+ interpret XF86Switch_VT_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=8,!same);
+ };
+ interpret XF86Switch_VT_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=9,!same);
+ };
+ interpret XF86Switch_VT_10+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=10,!same);
+ };
+ interpret XF86Switch_VT_11+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=11,!same);
+ };
+ interpret XF86Switch_VT_12+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=12,!same);
+ };
+ interpret XF86LogGrabInfo+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86LogWindowTree+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86Next_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret XF86Prev_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret ISO_Level5_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=NumLock);
+ };
+ interpret Caps_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+Exactly(Lock) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+AnyOf(all) {
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ indicator "Caps Lock" {
+ whichModState= locked;
+ modifiers= Lock;
+ };
+ indicator "Num Lock" {
+ whichModState= locked;
+ modifiers= NumLock;
+ };
+ indicator "Scroll Lock" {
+ whichModState= locked;
+ modifiers= ScrollLock;
+ };
+ indicator "Shift Lock" {
+ whichModState= locked;
+ modifiers= Shift;
+ };
+ indicator "Group 2" {
+ groups= 0xfe;
+ };
+ indicator "Mouse Keys" {
+ controls= MouseKeys;
+ };
+};
+
+xkb_symbols "pc_us_ru_2_ca(multix)_3_de(neo)_4_inet(evdev)" {
+ name[Group1]="English (US)";
+ name[Group2]="Russian";
+ name[Group3]="Canadian Multilingual";
+ name[Group4]="German (Neo 2)";
+
+ key <ESC> { [ Escape ] };
+ key <AE01> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ 1, exclam ],
+ symbols[Group2]= [ 1, exclam ],
+ symbols[Group3]= [ 1, exclam, plusminus, NoSymbol, onesuperior, exclamdown, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ 1, degree, onesuperior, onesubscript, ordfeminine, NoSymbol, notsign, NoSymbol ]
+ };
+ key <AE02> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ 2, at ],
+ symbols[Group2]= [ 2, quotedbl ],
+ symbols[Group3]= [ 2, at, at, NoSymbol, twosuperior, NoSymbol, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ 2, section, twosuperior, twosubscript, masculine, NoSymbol, logicalor, NoSymbol ]
+ };
+ key <AE03> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ 3, numbersign ],
+ symbols[Group2]= [ 3, numerosign ],
+ symbols[Group3]= [ 3, numbersign, sterling, NoSymbol, threesuperior, sterling, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ 3, U2113, threesuperior, threesubscript, numerosign, NoSymbol, logicaland, NoSymbol ]
+ };
+ key <AE04> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ 4, dollar ],
+ symbols[Group2]= [ 4, semicolon ],
+ symbols[Group3]= [ 4, dollar, cent, NoSymbol, onequarter, currency, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ 4, guillemotright, U203A, femalesymbol, NoSymbol, NoSymbol, U22A5, NoSymbol ]
+ };
+ key <AE05> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ 5, percent ],
+ symbols[Group2]= [ 5, percent ],
+ symbols[Group3]= [ 5, percent, currency, NoSymbol, onehalf, threeeighths, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ 5, guillemotleft, U2039, malesymbol, periodcentered, NoSymbol, U2221, NoSymbol ]
+ };
+ key <AE06> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ { H, E, L, L, O }, asciicircum ],
+ symbols[Group2]= [ 6, colon ],
+ symbols[Group3]= [ 6, question, notsign, NoSymbol, threequarters, fiveeighths, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ 6, dollar, cent, U26A5, sterling, NoSymbol, U2225, NoSymbol ]
+ };
+ key <AE07> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ { Y, E, S, space, T, H, I, S, space, I, S, space, D, O, G }, ampersand ],
+ symbols[Group2]= [ 7, question ],
+ symbols[Group3]= [ 7, ampersand, braceleft, NoSymbol, NoSymbol, seveneighths, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ 7, EuroSign, yen, U03F0, currency, NoSymbol, rightarrow, NoSymbol ]
+ };
+ key <AE08> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ 8, asterisk ],
+ symbols[Group2]= [ 8, asterisk ],
+ symbols[Group3]= [ 8, asterisk, braceright, NoSymbol, NoSymbol, trademark, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ 8, doublelowquotemark, singlelowquotemark, U27E8, Tab, ISO_Left_Tab, U221E, NoSymbol ]
+ };
+ key <AE09> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ 9, parenleft ],
+ symbols[Group2]= [ 9, parenleft ],
+ symbols[Group3]= [ 9, parenleft, bracketleft, NoSymbol, NoSymbol, plusminus, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ 9, leftdoublequotemark, leftsinglequotemark, U27E9, KP_Divide, KP_Divide, variation, NoSymbol ]
+ };
+ key <AE10> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ 0, parenright ],
+ symbols[Group2]= [ 0, parenright ],
+ symbols[Group3]= [ 0, parenright, bracketright, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ 0, rightdoublequotemark, rightsinglequotemark, zerosubscript, KP_Multiply, KP_Multiply, emptyset, NoSymbol ]
+ };
+ key <AE11> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ minus, underscore ],
+ symbols[Group2]= [ minus, underscore ],
+ symbols[Group3]= [ minus, underscore, onehalf, NoSymbol, NoSymbol, questiondown, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ minus, emdash, NoSymbol, U2011, KP_Subtract, KP_Subtract, hyphen, NoSymbol ]
+ };
+ key <AE12> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ equal, plus ],
+ symbols[Group2]= [ equal, plus ],
+ symbols[Group3]= [ equal, plus, notsign, NoSymbol, dead_cedilla, dead_ogonek, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ dead_grave, dead_cedilla, dead_abovering, dead_abovereversedcomma, dead_diaeresis, NoSymbol, dead_macron, NoSymbol ]
+ };
+ key <BKSP> { [ BackSpace, BackSpace ] };
+ key <TAB> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ Tab, ISO_Left_Tab ],
+ symbols[Group2]= [ Tab, ISO_Left_Tab ],
+ symbols[Group3]= [ Tab, ISO_Left_Tab ],
+ symbols[Group4]= [ Tab, ISO_Left_Tab, Multi_key, ISO_Level5_Lock, NoSymbol, NoSymbol, NoSymbol, ISO_Level5_Lock ]
+ };
+ key <AD01> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ q, Q ],
+ symbols[Group2]= [ Cyrillic_shorti, Cyrillic_SHORTI ],
+ symbols[Group3]= [ q, Q, NoSymbol, NoSymbol, NoSymbol, Greek_OMEGA, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ x, X, ellipsis, Greek_xi, Prior, Prior, Greek_XI, NoSymbol ]
+ };
+ key <AD02> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ w, W ],
+ symbols[Group2]= [ Cyrillic_tse, Cyrillic_TSE ],
+ symbols[Group3]= [ w, W, NoSymbol, NoSymbol, lstroke, Lstroke, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ v, V, underscore, NoSymbol, BackSpace, BackSpace, radical, NoSymbol ]
+ };
+ key <AD03> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ e, E ],
+ symbols[Group2]= [ Cyrillic_u, Cyrillic_U ],
+ symbols[Group3]= [ e, E, NoSymbol, NoSymbol, oe, OE, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ l, L, bracketleft, Greek_lamda, Up, Up, Greek_LAMDA, NoSymbol ]
+ };
+ key <AD04> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ r, R ],
+ symbols[Group2]= [ Cyrillic_ka, Cyrillic_KA ],
+ symbols[Group3]= [ r, R, NoSymbol, NoSymbol, paragraph, registered, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ c, C, bracketright, Greek_chi, Delete, Delete, U2102, NoSymbol ]
+ };
+ key <AD05> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ t, T ],
+ symbols[Group2]= [ Cyrillic_ie, Cyrillic_IE ],
+ symbols[Group3]= [ t, T, NoSymbol, NoSymbol, tslash, Tslash, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ w, W, asciicircum, Greek_omega, Next, Next, Greek_OMEGA, NoSymbol ]
+ };
+ key <AD06> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ y, Y ],
+ symbols[Group2]= [ Cyrillic_en, Cyrillic_EN ],
+ symbols[Group3]= [ y, Y, NoSymbol, NoSymbol, leftarrow, yen, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ k, K, exclam, Greek_kappa, exclamdown, NoSymbol, multiply, NoSymbol ]
+ };
+ key <AD07> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ u, U ],
+ symbols[Group2]= [ Cyrillic_ghe, Cyrillic_GHE ],
+ symbols[Group3]= [ u, U, NoSymbol, NoSymbol, downarrow, uparrow, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ h, H, less, Greek_psi, KP_7, KP_7, Greek_PSI, NoSymbol ]
+ };
+ key <AD08> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ i, I ],
+ symbols[Group2]= [ Cyrillic_sha, Cyrillic_SHA ],
+ symbols[Group3]= [ i, I, NoSymbol, NoSymbol, rightarrow, idotless, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ g, G, greater, Greek_gamma, KP_8, KP_8, Greek_GAMMA, NoSymbol ]
+ };
+ key <AD09> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ o, O ],
+ symbols[Group2]= [ Cyrillic_shcha, Cyrillic_SHCHA ],
+ symbols[Group3]= [ o, O, section, NoSymbol, oslash, Oslash, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ f, F, equal, Greek_phi, KP_9, KP_9, Greek_PHI, NoSymbol ]
+ };
+ key <AD10> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ p, P ],
+ symbols[Group2]= [ Cyrillic_ze, Cyrillic_ZE ],
+ symbols[Group3]= [ p, P, paragraph, NoSymbol, thorn, THORN, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ q, Q, ampersand, U03D5, KP_Add, KP_Add, U211A, NoSymbol ]
+ };
+ key <AD11> {
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ bracketleft, braceleft ],
+ symbols[Group2]= [ Cyrillic_ha, Cyrillic_HA ],
+ symbols[Group3]= [ dead_circumflex, dead_diaeresis, dead_grave, NoSymbol, NoSymbol, dead_abovering, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ ssharp, U1E9E, U017F, Greek_finalsmallsigma, U2212, NoSymbol, jot, NoSymbol ]
+ };
+ key <AD12> {
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ bracketright, braceright ],
+ symbols[Group2]= [ Cyrillic_hardsign, Cyrillic_HARDSIGN ],
+ symbols[Group3]= [ ccedilla, Ccedilla, asciitilde, NoSymbol, dead_tilde, dead_macron, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ dead_acute, dead_tilde, dead_stroke, dead_abovecomma, dead_doubleacute, NoSymbol, dead_breve, NoSymbol ]
+ };
+ key <RTRN> { [ Return ] };
+ key <LCTL> { [ Control_L ] };
+ key <AC01> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ a, A ],
+ symbols[Group2]= [ Cyrillic_ef, Cyrillic_EF ],
+ symbols[Group3]= [ a, A, NoSymbol, NoSymbol, ae, AE, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ u, U, backslash, NoSymbol, Home, Home, includedin, NoSymbol ]
+ };
+ key <AC02> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ s, S ],
+ symbols[Group2]= [ Cyrillic_yeru, Cyrillic_YERU ],
+ symbols[Group3]= [ s, S, NoSymbol, NoSymbol, ssharp, section, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ i, I, slash, Greek_iota, Left, Left, integral, NoSymbol ]
+ };
+ key <AC03> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ d, D ],
+ symbols[Group2]= [ Cyrillic_ve, Cyrillic_VE ],
+ symbols[Group3]= [ d, D, NoSymbol, NoSymbol, eth, ETH, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ a, A, braceleft, Greek_alpha, Down, Down, U2200, NoSymbol ]
+ };
+ key <AC04> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ f, F ],
+ symbols[Group2]= [ Cyrillic_a, Cyrillic_A ],
+ symbols[Group3]= [ f, F, NoSymbol, NoSymbol, NoSymbol, ordfeminine, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ e, E, braceright, Greek_epsilon, Right, Right, U2203, NoSymbol ]
+ };
+ key <AC05> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ g, G ],
+ symbols[Group2]= [ Cyrillic_pe, Cyrillic_PE ],
+ symbols[Group3]= [ g, G, NoSymbol, NoSymbol, eng, ENG, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ o, O, asterisk, Greek_omicron, End, End, elementof, NoSymbol ]
+ };
+ key <AC06> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ h, H ],
+ symbols[Group2]= [ Cyrillic_er, Cyrillic_ER ],
+ symbols[Group3]= [ h, H, NoSymbol, NoSymbol, hstroke, Hstroke, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ s, S, question, Greek_sigma, questiondown, NoSymbol, Greek_SIGMA, NoSymbol ]
+ };
+ key <AC07> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ j, J ],
+ symbols[Group2]= [ Cyrillic_o, Cyrillic_O ],
+ symbols[Group3]= [ j, J, NoSymbol, NoSymbol, U0133, U0132, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ n, N, parenleft, Greek_nu, KP_4, KP_4, U2115, NoSymbol ]
+ };
+ key <AC08> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ k, K ],
+ symbols[Group2]= [ Cyrillic_el, Cyrillic_EL ],
+ symbols[Group3]= [ k, K, NoSymbol, NoSymbol, kra, NoSymbol, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ r, R, parenright, Greek_rho, KP_5, KP_5, U211D, NoSymbol ]
+ };
+ key <AC09> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ l, L ],
+ symbols[Group2]= [ Cyrillic_de, Cyrillic_DE ],
+ symbols[Group3]= [ l, L, NoSymbol, NoSymbol, U0140, U013F, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ t, T, minus, Greek_tau, KP_6, KP_6, partialderivative, NoSymbol ]
+ };
+ key <AC10> {
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ semicolon, colon ],
+ symbols[Group2]= [ Cyrillic_zhe, Cyrillic_ZHE ],
+ symbols[Group3]= [ semicolon, colon, degree, NoSymbol, dead_acute, dead_doubleacute, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ d, D, colon, Greek_delta, KP_Separator, comma, Greek_DELTA, NoSymbol ]
+ };
+ key <AC11> {
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ apostrophe, quotedbl ],
+ symbols[Group2]= [ Cyrillic_e, Cyrillic_E ],
+ symbols[Group3]= [ egrave, Egrave, braceleft, NoSymbol, NoSymbol, dead_caron, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ y, Y, at, Greek_upsilon, period, KP_Decimal, nabla, NoSymbol ]
+ };
+ key <TLDE> {
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ grave, asciitilde ],
+ symbols[Group2]= [ Cyrillic_io, Cyrillic_IO ],
+ symbols[Group3]= [ slash, backslash, bar, NoSymbol, NoSymbol, hyphen, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ dead_circumflex, dead_caron, U21BB, U02DE, dead_abovedot, Pointer_EnableKeys, dead_belowdot, NoSymbol ]
+ };
+ key <LFSH> {
+ type[Group4]= "TWO_LEVEL",
+ symbols[Group1]= [ Shift_L ],
+ symbols[Group2]= [ Shift_L ],
+ symbols[Group3]= [ Shift_L ],
+ symbols[Group4]= [ Shift_L, Caps_Lock ]
+ };
+ key <BKSL> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "ONE_LEVEL",
+ symbols[Group1]= [ backslash, bar ],
+ symbols[Group2]= [ backslash, slash ],
+ symbols[Group3]= [ agrave, Agrave, braceright, NoSymbol, NoSymbol, dead_breve, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ ISO_Level3_Shift ]
+ };
+ key <AB01> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ z, Z ],
+ symbols[Group2]= [ Cyrillic_ya, Cyrillic_YA ],
+ symbols[Group3]= [ z, Z, guillemotleft, NoSymbol ],
+ symbols[Group4]= [ udiaeresis, Udiaeresis, numbersign, NoSymbol, Escape, Escape, union, NoSymbol ]
+ };
+ key <AB02> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "FOUR_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ x, X ],
+ symbols[Group2]= [ Cyrillic_che, Cyrillic_CHE ],
+ symbols[Group3]= [ x, X, guillemotright, NoSymbol ],
+ symbols[Group4]= [ odiaeresis, Odiaeresis, dollar, U03F5, Tab, Tab, intersection, NoSymbol ]
+ };
+ key <AB03> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ c, C ],
+ symbols[Group2]= [ Cyrillic_es, Cyrillic_ES ],
+ symbols[Group3]= [ c, C, NoSymbol, NoSymbol, cent, copyright, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ adiaeresis, Adiaeresis, bar, Greek_eta, Insert, Insert, U2135, NoSymbol ]
+ };
+ key <AB04> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ v, V ],
+ symbols[Group2]= [ Cyrillic_em, Cyrillic_EM ],
+ symbols[Group3]= [ v, V, NoSymbol, NoSymbol, leftdoublequotemark, leftsinglequotemark, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ p, P, asciitilde, Greek_pi, Return, Return, Greek_PI, NoSymbol ]
+ };
+ key <AB05> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ b, B ],
+ symbols[Group2]= [ Cyrillic_i, Cyrillic_I ],
+ symbols[Group3]= [ b, B, NoSymbol, NoSymbol, rightdoublequotemark, rightsinglequotemark, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ z, Z, grave, Greek_zeta, Undo, Undo, U2124, NoSymbol ]
+ };
+ key <AB06> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ n, N ],
+ symbols[Group2]= [ Cyrillic_te, Cyrillic_TE ],
+ symbols[Group3]= [ n, N, NoSymbol, NoSymbol, U0149, U266A, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ b, B, plus, Greek_beta, colon, NoSymbol, U21D0, NoSymbol ]
+ };
+ key <AB07> {
+ type[Group1]= "ALPHABETIC",
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ m, M ],
+ symbols[Group2]= [ Cyrillic_softsign, Cyrillic_SOFTSIGN ],
+ symbols[Group3]= [ m, M, mu, NoSymbol, mu, masculine, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ m, M, percent, Greek_mu, KP_1, KP_1, ifonlyif, NoSymbol ]
+ };
+ key <AB08> {
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ comma, less ],
+ symbols[Group2]= [ Cyrillic_be, Cyrillic_BE ],
+ symbols[Group3]= [ comma, apostrophe, less, NoSymbol, Greek_horizbar, multiply, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ comma, endash, quotedbl, U03F1, KP_2, KP_2, U21D2, NoSymbol ]
+ };
+ key <AB09> {
+ type[Group2]= "ALPHABETIC",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ period, greater ],
+ symbols[Group2]= [ Cyrillic_yu, Cyrillic_YU ],
+ symbols[Group3]= [ period, quotedbl, greater, NoSymbol, periodcentered, division, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ period, enfilledcircbullet, apostrophe, U03D1, KP_3, KP_3, U21A6, NoSymbol ]
+ };
+ key <AB10> {
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ slash, question ],
+ symbols[Group2]= [ period, comma ],
+ symbols[Group3]= [ eacute, Eacute, dead_acute, NoSymbol, NoSymbol, dead_abovedot, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ j, J, semicolon, Greek_theta, semicolon, NoSymbol, Greek_THETA, NoSymbol ]
+ };
+ key <RTSH> {
+ type[Group4]= "TWO_LEVEL",
+ symbols[Group1]= [ Shift_R ],
+ symbols[Group2]= [ Shift_R ],
+ symbols[Group3]= [ Shift_R ],
+ symbols[Group4]= [ Shift_R, Caps_Lock ]
+ };
+ key <KPMU> {
+ type[Group1]= "CTRL+ALT",
+ type[Group2]= "CTRL+ALT",
+ type[Group3]= "CTRL+ALT",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ],
+ symbols[Group2]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ],
+ symbols[Group3]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ],
+ symbols[Group4]= [ KP_Multiply, KP_Multiply, U2219, U2299, multiply, NoSymbol, U2297, NoSymbol ]
+ };
+ key <LALT> { [ Alt_L, Meta_L ] };
+ key <SPCE> {
+ type[Group3]= "FOUR_LEVEL",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ space ],
+ symbols[Group2]= [ space ],
+ symbols[Group3]= [ space, space, nobreakspace, NoSymbol ],
+ symbols[Group4]= [ space, space, space, nobreakspace, KP_0, KP_0, U202F, NoSymbol ]
+ };
+ key <CAPS> {
+ type= "ONE_LEVEL",
+ symbols[Group1]= [ Caps_Lock ],
+ symbols[Group2]= [ Caps_Lock ],
+ symbols[Group3]= [ Caps_Lock ],
+ symbols[Group4]= [ ISO_Level3_Shift ]
+ };
+ key <FK01> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ]
+ };
+ key <FK02> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ]
+ };
+ key <FK03> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ]
+ };
+ key <FK04> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ]
+ };
+ key <FK05> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ]
+ };
+ key <FK06> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ]
+ };
+ key <FK07> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ]
+ };
+ key <FK08> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ]
+ };
+ key <FK09> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ]
+ };
+ key <FK10> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ]
+ };
+ key <NMLK> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ Num_Lock ],
+ symbols[Group2]= [ Num_Lock ],
+ symbols[Group3]= [ Num_Lock ],
+ symbols[Group4]= [ Tab, ISO_Left_Tab, equal, approxeq, notequal, Pointer_EnableKeys, identical, NoSymbol ]
+ };
+ key <SCLK> { [ Scroll_Lock ] };
+ key <KP7> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Home, KP_7 ],
+ symbols[Group2]= [ KP_Home, KP_7 ],
+ symbols[Group3]= [ KP_Home, KP_7 ],
+ symbols[Group4]= [ KP_7, U2714, U2195, U226A, KP_Home, KP_Home, upstile, NoSymbol ]
+ };
+ key <KP8> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Up, KP_8 ],
+ symbols[Group2]= [ KP_Up, KP_8 ],
+ symbols[Group3]= [ KP_Up, KP_8 ],
+ symbols[Group4]= [ KP_8, U2718, uparrow, intersection, KP_Up, KP_Up, U22C2, NoSymbol ]
+ };
+ key <KP9> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Prior, KP_9 ],
+ symbols[Group2]= [ KP_Prior, KP_9 ],
+ symbols[Group3]= [ KP_Prior, KP_9 ],
+ symbols[Group4]= [ KP_9, dagger, U20D7, U226B, KP_Prior, KP_Prior, U2309, NoSymbol ]
+ };
+ key <KPSU> {
+ type[Group1]= "CTRL+ALT",
+ type[Group2]= "CTRL+ALT",
+ type[Group3]= "CTRL+ALT",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ],
+ symbols[Group2]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ],
+ symbols[Group3]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ],
+ symbols[Group4]= [ KP_Subtract, KP_Subtract, U2212, U2296, U2216, NoSymbol, U2238, NoSymbol ]
+ };
+ key <KP4> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Left, KP_4 ],
+ symbols[Group2]= [ KP_Left, KP_4 ],
+ symbols[Group3]= [ KP_Left, KP_4 ],
+ symbols[Group4]= [ KP_4, club, leftarrow, includedin, KP_Left, KP_Left, U2286, NoSymbol ]
+ };
+ key <KP5> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Begin, KP_5 ],
+ symbols[Group2]= [ KP_Begin, KP_5 ],
+ symbols[Group3]= [ KP_Begin, KP_5 ],
+ symbols[Group4]= [ KP_5, EuroSign, colon, U22B6, KP_Begin, KP_Begin, U22B7, NoSymbol ]
+ };
+ key <KP6> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Right, KP_6 ],
+ symbols[Group2]= [ KP_Right, KP_6 ],
+ symbols[Group3]= [ KP_Right, KP_6 ],
+ symbols[Group4]= [ KP_6, U2023, rightarrow, includes, KP_Right, KP_Right, U2287, NoSymbol ]
+ };
+ key <KPAD> {
+ type[Group1]= "CTRL+ALT",
+ type[Group2]= "CTRL+ALT",
+ type[Group3]= "CTRL+ALT",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ],
+ symbols[Group2]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ],
+ symbols[Group3]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ],
+ symbols[Group4]= [ KP_Add, KP_Add, plusminus, U2295, U2213, NoSymbol, U2214, NoSymbol ]
+ };
+ key <KP1> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_End, KP_1 ],
+ symbols[Group2]= [ KP_End, KP_1 ],
+ symbols[Group3]= [ KP_End, KP_1 ],
+ symbols[Group4]= [ KP_1, diamond, U2194, lessthanequal, KP_End, KP_End, downstile, NoSymbol ]
+ };
+ key <KP2> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Down, KP_2 ],
+ symbols[Group2]= [ KP_Down, KP_2 ],
+ symbols[Group3]= [ KP_Down, KP_2 ],
+ symbols[Group4]= [ KP_2, heart, downarrow, union, KP_Down, KP_Down, U22C3, NoSymbol ]
+ };
+ key <KP3> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Next, KP_3 ],
+ symbols[Group2]= [ KP_Next, KP_3 ],
+ symbols[Group3]= [ KP_Next, KP_3 ],
+ symbols[Group4]= [ KP_3, U2660, U21CC, greaterthanequal, KP_Next, KP_Next, U230B, NoSymbol ]
+ };
+ key <KP0> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Insert, KP_0 ],
+ symbols[Group2]= [ KP_Insert, KP_0 ],
+ symbols[Group3]= [ KP_Insert, KP_0 ],
+ symbols[Group4]= [ KP_0, U2423, percent, U2030, KP_Insert, KP_Insert, U25A1, NoSymbol ]
+ };
+ key <KPDL> {
+ type[Group2]= "KEYPAD",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Delete, KP_Decimal ],
+ symbols[Group2]= [ KP_Delete, KP_Separator ],
+ symbols[Group3]= [ KP_Delete, KP_Decimal ],
+ symbols[Group4]= [ KP_Separator, period, comma, minutes, KP_Delete, KP_Delete, seconds, NoSymbol ]
+ };
+ key <LVL3> { [ ISO_Level3_Shift ] };
+ key <LSGT> {
+ type[Group1]= "FOUR_LEVEL",
+ type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC",
+ type[Group4]= "ONE_LEVEL",
+ symbols[Group1]= [ less, greater, bar, brokenbar ],
+ symbols[Group2]= [ slash, bar ],
+ symbols[Group3]= [ ugrave, Ugrave, degree, NoSymbol, NoSymbol, brokenbar, NoSymbol, NoSymbol ],
+ symbols[Group4]= [ ISO_Level5_Shift ]
+ };
+ key <FK11> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ]
+ };
+ key <FK12> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ]
+ };
+ key <KATA> { [ Katakana ] };
+ key <HIRA> { [ Hiragana ] };
+ key <HENK> { [ Henkan_Mode ] };
+ key <HKTG> { [ Hiragana_Katakana ] };
+ key <MUHE> { [ Muhenkan ] };
+ key <KPEN> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Enter ],
+ symbols[Group2]= [ KP_Enter ],
+ symbols[Group3]= [ KP_Enter ],
+ symbols[Group4]= [ KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, NoSymbol ]
+ };
+ key <RCTL> {
+ type= "ONE_LEVEL",
+ symbols[Group1]= [ Control_R ],
+ symbols[Group2]= [ Control_R ],
+ symbols[Group3]= [ ISO_Level5_Shift ]
+ };
+ key <KPDV> {
+ type[Group1]= "CTRL+ALT",
+ type[Group2]= "CTRL+ALT",
+ type[Group3]= "CTRL+ALT",
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ],
+ symbols[Group2]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ],
+ symbols[Group3]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ],
+ symbols[Group4]= [ KP_Divide, KP_Divide, division, U2300, U2215, NoSymbol, U2223, NoSymbol ]
+ };
+ key <PRSC> {
+ type= "PC_ALT_LEVEL2",
+ symbols[Group1]= [ Print, Sys_Req ]
+ };
+ key <RALT> {
+ type[Group1]= "TWO_LEVEL",
+ type[Group2]= "TWO_LEVEL",
+ type[Group3]= "ONE_LEVEL",
+ type[Group4]= "ONE_LEVEL",
+ symbols[Group1]= [ Alt_R, Meta_R ],
+ symbols[Group2]= [ Alt_R, Meta_R ],
+ symbols[Group3]= [ ISO_Level3_Shift ],
+ symbols[Group4]= [ ISO_Level5_Shift ]
+ };
+ key <LNFD> { [ Linefeed ] };
+ key <HOME> { [ Home ] };
+ key <UP> { [ Up ] };
+ key <PGUP> { [ Prior ] };
+ key <LEFT> { [ Left ] };
+ key <RGHT> { [ Right ] };
+ key <END> { [ End ] };
+ key <DOWN> { [ Down ] };
+ key <PGDN> { [ Next ] };
+ key <INS> { [ Insert ] };
+ key <DELE> { [ Delete ] };
+ key <MUTE> { [ XF86AudioMute ] };
+ key <VOL-> { [ XF86AudioLowerVolume ] };
+ key <VOL+> { [ XF86AudioRaiseVolume ] };
+ key <POWR> { [ XF86PowerOff ] };
+ key <KPEQ> {
+ type[Group4]= "EIGHT_LEVEL",
+ symbols[Group1]= [ KP_Equal ],
+ symbols[Group2]= [ KP_Equal ],
+ symbols[Group3]= [ KP_Equal ],
+ symbols[Group4]= [ KP_Equal, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ]
+ };
+ key <I126> { [ plusminus ] };
+ key <PAUS> {
+ type= "PC_CONTROL_LEVEL2",
+ symbols[Group1]= [ Pause, Break ]
+ };
+ key <I128> { [ XF86LaunchA ] };
+ key <I129> { [ KP_Decimal, KP_Decimal ] };
+ key <HNGL> { [ Hangul ] };
+ key <HJCV> { [ Hangul_Hanja ] };
+ key <LWIN> { [ Super_L ] };
+ key <RWIN> { [ Super_R ] };
+ key <COMP> { [ Menu ] };
+ key <STOP> { [ Cancel ] };
+ key <AGAI> { [ Redo ] };
+ key <PROP> { [ SunProps ] };
+ key <UNDO> { [ Undo ] };
+ key <FRNT> { [ SunFront ] };
+ key <COPY> { [ XF86Copy ] };
+ key <OPEN> { [ SunOpen ] };
+ key <PAST> { [ XF86Paste ] };
+ key <FIND> { [ Find ] };
+ key <CUT> { [ XF86Cut ] };
+ key <HELP> { [ Help ] };
+ key <I147> { [ XF86MenuKB ] };
+ key <I148> { [ XF86Calculator ] };
+ key <I150> { [ XF86Sleep ] };
+ key <I151> { [ XF86WakeUp ] };
+ key <I152> { [ XF86Explorer ] };
+ key <I153> { [ XF86Send ] };
+ key <I155> { [ XF86Xfer ] };
+ key <I156> { [ XF86Launch1 ] };
+ key <I157> { [ XF86Launch2 ] };
+ key <I158> { [ XF86WWW ] };
+ key <I159> { [ XF86DOS ] };
+ key <I160> { [ XF86ScreenSaver ] };
+ key <I162> { [ XF86RotateWindows ] };
+ key <I163> { [ XF86Mail ] };
+ key <I164> { [ XF86Favorites ] };
+ key <I165> { [ XF86MyComputer ] };
+ key <I166> { [ XF86Back ] };
+ key <I167> { [ XF86Forward ] };
+ key <I169> { [ XF86Eject ] };
+ key <I170> { [ XF86Eject, XF86Eject ] };
+ key <I171> { [ XF86AudioNext ] };
+ key <I172> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I173> { [ XF86AudioPrev ] };
+ key <I174> { [ XF86AudioStop, XF86Eject ] };
+ key <I175> { [ XF86AudioRecord ] };
+ key <I176> { [ XF86AudioRewind ] };
+ key <I177> { [ XF86Phone ] };
+ key <I179> { [ XF86Tools ] };
+ key <I180> { [ XF86HomePage ] };
+ key <I181> { [ XF86Reload ] };
+ key <I182> { [ XF86Close ] };
+ key <I185> { [ XF86ScrollUp ] };
+ key <I186> { [ XF86ScrollDown ] };
+ key <I187> { [ parenleft ] };
+ key <I188> { [ parenright ] };
+ key <I189> { [ XF86New ] };
+ key <I190> { [ Redo ] };
+ key <FK13> { [ XF86Tools ] };
+ key <FK14> { [ XF86Launch5 ] };
+ key <FK15> { [ XF86Launch6 ] };
+ key <FK16> { [ XF86Launch7 ] };
+ key <FK17> { [ XF86Launch8 ] };
+ key <FK18> { [ XF86Launch9 ] };
+ key <FK21> { [ XF86TouchpadToggle ] };
+ key <FK22> { [ XF86TouchpadOn ] };
+ key <FK23> { [ XF86TouchpadOff ] };
+ key <MDSW> { [ Mode_switch ] };
+ key <ALT> { [ NoSymbol, Alt_L ] };
+ key <META> { [ NoSymbol, Meta_L ] };
+ key <SUPR> { [ NoSymbol, Super_L ] };
+ key <HYPR> { [ NoSymbol, Hyper_L ] };
+ key <I208> { [ XF86AudioPlay ] };
+ key <I209> { [ XF86AudioPause ] };
+ key <I210> { [ XF86Launch3 ] };
+ key <I211> { [ XF86Launch4 ] };
+ key <I212> { [ XF86LaunchB ] };
+ key <I213> { [ XF86Suspend ] };
+ key <I214> { [ XF86Close ] };
+ key <I215> { [ XF86AudioPlay ] };
+ key <I216> { [ XF86AudioForward ] };
+ key <I218> { [ Print ] };
+ key <I220> { [ XF86WebCam ] };
+ key <I223> { [ XF86Mail ] };
+ key <I224> { [ XF86Messenger ] };
+ key <I225> { [ XF86Search ] };
+ key <I226> { [ XF86Go ] };
+ key <I227> { [ XF86Finance ] };
+ key <I228> { [ XF86Game ] };
+ key <I229> { [ XF86Shop ] };
+ key <I231> { [ Cancel ] };
+ key <I232> { [ XF86MonBrightnessDown ] };
+ key <I233> { [ XF86MonBrightnessUp ] };
+ key <I234> { [ XF86AudioMedia ] };
+ key <I235> { [ XF86Display ] };
+ key <I236> { [ XF86KbdLightOnOff ] };
+ key <I237> { [ XF86KbdBrightnessDown ] };
+ key <I238> { [ XF86KbdBrightnessUp ] };
+ key <I239> { [ XF86Send ] };
+ key <I240> { [ XF86Reply ] };
+ key <I241> { [ XF86MailForward ] };
+ key <I242> { [ XF86Save ] };
+ key <I243> { [ XF86Documents ] };
+ key <I244> { [ XF86Battery ] };
+ key <I245> { [ XF86Bluetooth ] };
+ key <I246> { [ XF86WLAN ] };
+ modifier_map Shift { <LFSH>, <RTSH> };
+ modifier_map Lock { <CAPS> };
+ modifier_map Control { <LCTL> };
+ modifier_map Mod1 { <LALT>, <RALT>, <META> };
+ modifier_map Mod2 { <NMLK> };
+ modifier_map Mod3 { <RCTL> };
+ modifier_map Mod4 { <LWIN>, <RWIN>, <SUPR>, <HYPR> };
+ modifier_map Mod5 { <LVL3>, <MDSW> };
+};
+
+};
diff --git a/test/data/keymaps/syntax-error.xkb b/test/data/keymaps/syntax-error.xkb
new file mode 100644
index 0000000..6c1cb38
--- /dev/null
+++ b/test/data/keymaps/syntax-error.xkb
@@ -0,0 +1,1814 @@
+xkb_keymap {
+xkb_keycodes "evdev+aliases(qwerty)" {
+ minimum = 8;
+ maximum = 255;
+ <ESC> = 9;
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <RTRN> = 36;
+ <LCTL> = 37;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+ <TLDE> = 49;
+ <LFSH> = 50;
+ <BKSL> = 51;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+ <KPMU> = 63;
+ <LALT> = 64;
+ <SPCE> = 65;
+ <CAPS> = 66;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <NMLK> = 77;
+ <SCLK> = 78;
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPSU> = 82;
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+ <KPAD> = 86;
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KP0> = 90;
+ <KPDL> = 91;
+ <LVL3> = 92;
+ <LSGT> = 94;
+ <FK11> = 95;
+ <FK12> = 96;
+ <AB11> = 97;
+ <KATA> = 98;
+ <HIRA> = 99;
+ <HENK> = 100;
+ <HKTG> = 101;
+ <MUHE> = 102;
+ <JPCM> = 103;
+ <KPEN> = 104;
+ <RCTL> = 105;
+ <KPDV> = 106;
+ <PRSC> = 107;
+ <RALT> = 108;
+ <LNFD> = 109;
+ <HOME> = 110;
+ <UP> = 111;
+ <PGUP> = 112;
+ <LEFT> = 113;
+ <RGHT> = 114;
+ <END> = 115;
+ <DOWN> = 116;
+ <PGDN> = 117;
+ <INS> = 118;
+ <DELE> = 119;
+ <I120> = 120;
+ <MUTE> = 121;
+ <VOL-> = 122;
+ <VOL+> = 123;
+ <POWR> = 124;
+ <KPEQ> = 125;
+ <I126> = 126;
+ <PAUS> = 127;
+ <I128> = 128;
+ <I129> = 129;
+ <HNGL> = 130;
+ <HJCV> = 131;
+ <AE13> = 132;
+ <LWIN> = 133;
+ <RWIN> = 134;
+ <COMP> = 135;
+ <STOP> = 136;
+ <AGAI> = 137;
+ <PROP> = 138;
+ <UNDO> = 139;
+ <FRNT> = 140;
+ <COPY> = 141;
+ <OPEN> = 142;
+ <PAST> = 143;
+ <FIND> = 144;
+ <CUT> = 145;
+ <HELP> = 146;
+ <I147> = 147;
+ <I148> = 148;
+ <I149> = 149;
+ <I150> = 150;
+ <I151> = 151;
+ <I152> = 152;
+ <I153> = 153;
+ <I154> = 154;
+ <I155> = 155;
+ <I156> = 156;
+ <I157> = 157;
+ <I158> = 158;
+ <I159> = 159;
+ <I160> = 160;
+ <I161> = 161;
+ <I162> = 162;
+ <I163> = 163;
+ <I164> = 164;
+ <I165> = 165;
+ <I166> = 166;
+ <I167> = 167;
+ <I168> = 168;
+ <I169> = 169;
+ <I170> = 170;
+ <I171> = 171;
+ <I172> = 172;
+ <I173> = 173;
+ <I174> = 174;
+ <I175> = 175;
+ <I176> = 176;
+ <I177> = 177;
+ <I178> = 178;
+ <I179> = 179;
+ <I180> = 180;
+ <I181> = 181;
+ <I182> = 182;
+ <I183> = 183;
+ <I184> = 184;
+ <I185> = 185;
+ <I186> = 186;
+ <I187> = 187;
+ <I188> = 188;
+ <I189> = 189;
+ <I190> = 190;
+ <FK13> = 191;
+ <FK14> = 192;
+ <FK15> = 193;
+ <FK16> = 194;
+ <FK17> = 195;
+ <FK18> = 196;
+ <FK19> = 197;
+ <FK20> = 198;
+ <FK21> = 199;
+ <FK22> = 200;
+ <FK23> = 201;
+ <FK24> = 202;
+ <MDSW> = 203;
+ <ALT> = 204;
+ <META> = 205;
+ <SUPR> = 206;
+ <HYPR> = 207;
+ <I208> = 208;
+ <I209> = 209;
+ <I210> = 210;
+ <I211> = 211;
+ <I212> = 212;
+ <I213> = 213;
+ <I214> = 214;
+ <I215> = 215;
+ <I216> = 216;
+ <I217> = 217;
+ <I218> = 218;
+ <I219> = 219;
+ <I220> = 220;
+ <I221> = 221;
+ <I222> = 222;
+ <I223> = 223;
+ <I224> = 224;
+ <I225> = 225;
+ <I226> = 226;
+ <I227> = 227;
+ <I228> = 228;
+ <I229> = 229;
+ <I230> = 230;
+ <I231> = 231;
+ <I232> = 232;
+ <I233> = 233;
+ <I234> = 234;
+ <I235> = 235;
+ <I236> = 236;
+ <I237> = 237;
+ <I238> = 238;
+ <I239> = 239;
+ <I240> = 240;
+ <I241> = 241;
+ <I242> = 242;
+ <I243> = 243;
+ <I244> = 244;
+ <I245> = 245;
+ <I246> = 246;
+ <I247> = 247;
+ <I248> = 248;
+ <I249> = 249;
+ <I250> = 250;
+ <I251> = 251;
+ <I252> = 252;
+ <I253> = 253;
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+ indicator 4 = "Compose";
+ indicator 5 = "Kana";
+ indicator 6 = "Sleep";
+ indicator 7 = "Suspend";
+ indicator 8 = "Mute";
+ indicator 9 = "Misc";
+ indicator 10 = "Mail";
+ indicator 11 = "Charging";
+ virtual indicator 12 = "Shift Lock";
+ virtual indicator 13 = "Group 2";
+ virtual indicator 14 = "Mouse Keys";
+ alias <AC12> = <BKSL>;
+ alias <MENU> = <COMP>;
+ alias <HZTG> = <TLDE>;
+ alias <LMTA> = <LWIN>;
+ alias <RMTA> = <RWIN>;
+ alias <ALGR> = <RALT>;
+ alias <KPPT> = <I129>;
+ alias <LatQ> = <AD01>;
+ alias <LatW> = <AD02>;
+ alias <LatE> = <AD03>;
+ alias <LatR> = <AD04>;
+ alias <LatT> = <AD05>;
+ alias <LatY> = <AD06>;
+ alias <LatU> = <AD07>;
+ alias <LatI> = <AD08>;
+ alias <LatO> = <AD09>;
+ alias <LatP> = <AD10>;
+ alias <LatA> = <AC01>;
+ alias <LatS> = <AC02>;
+ alias <LatD> = <AC03>;
+ alias <LatF> = <AC04>;
+ alias <LatG> = <AC05>;
+ alias <LatH> = <AC06>;
+ alias <LatJ> = <AC07>;
+ alias <LatK> = <AC08>;
+ alias <LatL> = <AC09>;
+ alias <LatZ> = <AB01>;
+ alias <LatX> = <AB02>;
+ alias <LatC> = <AB03>;
+ alias <LatV> = <AB04>;
+ alias <LatB> = <AB05>;
+ alias <LatN> = <AB06>;
+ alias <LatM> = <AB07>;
+};
+
+xkb_types "complete" {
+
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ type "ONE_LEVEL" {
+ modifiers= none;
+ level_name[Level1]= "Any";
+ };
+ type "TWO_LEVEL" {
+ modifiers= Shift;
+ map[Shift]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ };
+ type "ALPHABETIC" {
+ modifiers= Shift+Lock;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Caps";
+ };
+ type "KEYPAD" {
+ modifiers= Shift+NumLock;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ };
+ type "SHIFT+ALT" {
+ modifiers= Shift+Alt;
+ map[Shift+Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift+Alt";
+ };
+ type "PC_CONTROL_LEVEL2" {
+ modifiers= Control;
+ map[Control]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Control";
+ };
+ type "PC_LCONTROL_LEVEL2" {
+ modifiers= LControl;
+ map[LControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LControl";
+ };
+ type "PC_RCONTROL_LEVEL2" {
+ modifiers= RControl;
+ map[RControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RControl";
+ };
+ type "PC_ALT_LEVEL2" {
+ modifiers= Alt;
+ map[Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt";
+ };
+ type "PC_LALT_LEVEL2" {
+ modifiers= LAlt;
+ map[LAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LAlt";
+ };
+ type "PC_RALT_LEVEL2" {
+ modifiers= RAlt;
+ map[RAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RAlt";
+ };
+ type "CTRL+ALT" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Control+Alt]= Level5;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "Ctrl+Alt";
+ };
+ type "LOCAL_EIGHT_LEVEL" {
+ modifiers= Shift+Lock+Control+LevelThree;
+ map[Shift+Lock]= Level1;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Control]= Level5;
+ map[Shift+Lock+Control]= Level5;
+ map[Shift+Control]= Level6;
+ map[Lock+Control]= Level6;
+ map[Control+LevelThree]= Level7;
+ map[Shift+Lock+Control+LevelThree]= Level7;
+ map[Shift+Control+LevelThree]= Level8;
+ map[Lock+Control+LevelThree]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ level_name[Level4]= "Shift Level3";
+ level_name[Level5]= "Ctrl";
+ level_name[Level6]= "Shift Ctrl";
+ level_name[Level7]= "Level3 Ctrl";
+ level_name[Level8]= "Shift Level3 Ctrl";
+ };
+ type "THREE_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ };
+ type "EIGHT_LEVEL" {
+ modifiers= Shift+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level8;
+ map[Shift+Lock+LevelThree+LevelFive]= Level7;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ preserve[Lock+LevelFive]= Lock;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level7;
+ preserve[Lock+LevelThree+LevelFive]= Lock;
+ map[Shift+Lock+LevelThree+LevelFive]= Level8;
+ preserve[Shift+Lock+LevelThree+LevelFive]= Lock;
+ map[Shift+Lock+LevelFive]= Level1;
+ preserve[Shift+Lock+LevelFive]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "FOUR_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_MIXED_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[Shift+NumLock]= Level1;
+ map[NumLock]= Level2;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[NumLock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_X" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[LevelThree]= Level2;
+ map[Shift+LevelThree]= Level3;
+ map[Control+Alt]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt Base";
+ level_name[Level3]= "Shift Alt";
+ level_name[Level4]= "Ctrl+Alt";
+ };
+ type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level4;
+ preserve[Lock]= Lock;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "AltGr Base";
+ level_name[Level4]= "Shift AltGr";
+ };
+ type "FOUR_LEVEL_PLUS_LOCK" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock]= Level5;
+ map[Shift+Lock]= Level2;
+ map[Lock+LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "Lock";
+ };
+ type "FOUR_LEVEL_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[NumLock+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Alt Number";
+ };
+};
+
+xkb_compatibility "complete" {
+
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ interpret.useModMapMods= AnyLevel;
+ interpret.repeat= False;
+ interpret.locking= False;
+ interpret ISO_Level2_Latch+Exactly(Shift) {
+ useModMapMods=level1;
+ action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
+ };
+ interpret Shift_Lock+AnyOf(Shift+Lock) {
+ action= LockMods(modifiers=Shift);
+ };
+ interpret Num_Lock+AnyOf(all) {
+ virtualModifier= NumLock;
+ action= LockMods(modifiers=NumLock);
+ };
+ interpret ISO_Lock+AnyOf(all) {
+ action= ISOLock(modifiers=modMapMods,affect=all);
+ };
+ interpret ISO_Level3_Shift+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret Alt_L+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Alt_R+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_L+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_R+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_L+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_R+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_L+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_R+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Scroll_Lock+AnyOf(all) {
+ virtualModifier= ScrollLock;
+ action= LockMods(modifiers=modMapMods);
+ };
+ interpret ISO_Level5_Shift+AnyOf(all) {
+ virtualModifier= LevelFive;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Mode_switch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= SetGroup(group=+1);
+ };
+ interpret ISO_Level3_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret ISO_Group_Latch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LatchGroup(group=2);
+ };
+ interpret ISO_Next_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=+1);
+ };
+ interpret ISO_Prev_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=-1);
+ };
+ interpret ISO_First_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=1);
+ };
+ interpret ISO_Last_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=2);
+ };
+ interpret KP_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_End+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_Down+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_Next+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_Left+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_Right+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_Home+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_Up+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_Prior+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_Begin+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_F2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_Divide+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_F3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_Multiply+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_F4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Subtract+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Separator+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_Add+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_0+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Insert+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Decimal+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret KP_Delete+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret F25+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret F26+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret F27+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret F29+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret F31+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret F33+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret F35+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret Pointer_Button_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default);
+ };
+ interpret Pointer_Button1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1);
+ };
+ interpret Pointer_Button2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2);
+ };
+ interpret Pointer_Button3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3);
+ };
+ interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret Pointer_DblClick1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1,count=2);
+ };
+ interpret Pointer_DblClick2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2,count=2);
+ };
+ interpret Pointer_DblClick3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3,count=2);
+ };
+ interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=default,affect=both);
+ };
+ interpret Pointer_Drag1+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=1,affect=both);
+ };
+ interpret Pointer_Drag2+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=2,affect=both);
+ };
+ interpret Pointer_Drag3+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=3,affect=both);
+ };
+ interpret Pointer_EnableKeys+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret Pointer_Accelerate+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=+1);
+ };
+ interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=-1);
+ };
+ interpret AccessX_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXKeys);
+ };
+ interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXFeedback);
+ };
+ interpret RepeatKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=RepeatKeys);
+ };
+ interpret SlowKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=SlowKeys);
+ };
+ interpret BounceKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=BounceKeys);
+ };
+ interpret StickyKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=StickyKeys);
+ };
+ interpret MouseKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Overlay1_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=Overlay1);
+ };
+ interpret Overlay2_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=Overlay2);
+ };
+ interpret AudibleBell_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AudibleBell);
+ };
+ interpret Terminate_Server+AnyOfOrNone(all) {
+ action= Terminate();
+ };
+ interpret Alt_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Alt_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Meta_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Meta_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Super_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Super_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Hyper_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Hyper_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Shift_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Shift,clearLocks);
+ };
+ interpret XF86Switch_VT_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=1,!same);
+ };
+ interpret XF86Switch_VT_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=2,!same);
+ };
+ interpret XF86Switch_VT_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=3,!same);
+ };
+ interpret XF86Switch_VT_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=4,!same);
+ };
+ interpret XF86Switch_VT_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=5,!same);
+ };
+ interpret XF86Switch_VT_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=6,!same);
+ };
+ interpret XF86Switch_VT_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=7,!same);
+ };
+ interpret XF86Switch_VT_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=8,!same);
+ };
+ interpret XF86Switch_VT_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=9,!same);
+ };
+ interpret XF86Switch_VT_10+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=10,!same);
+ };
+ interpret XF86Switch_VT_11+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=11,!same);
+ };
+ interpret XF86Switch_VT_12+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=12,!same);
+ };
+ interpret XF86LogGrabInfo+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86LogWindowTree+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86Next_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret XF86Prev_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret ISO_Level5_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Caps_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+Exactly(Lock) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+AnyOf(all) {
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ indicator "Caps Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= Lock;
+ };
+ indicator "Num Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= NumLock;
+ };
+ indicator "Scroll Lock" {
+ whichModState= locked;
+ modifiers= ScrollLock;
+ };
+ indicator "Shift Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= Shift;
+ };
+ indicator "Group 2" {
+ !allowExplicit;
+ groups= 0xfe;
+ };
+ indicator "Mouse Keys" {
+ indicatorDrivesKeyboard;
+ controls= mouseKeys;
+ };
+};
+
+xkb_symbols "pc+us+inet(evdev)+ctrl(nocaps)+compose(rwin)+terminate(ctrl_alt_bksp)" {
+
+ name[group1]="English (US)";
+
+ key <ESC> { [ Escape ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, asciicircum ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSP> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ BackSpace, BackSpace, NoSymbol, NoSymbol, Terminate_Server ]
+ SYNTAX ERROR
+ };
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ q, Q ]
+ };
+ key <AD02> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ w, W ]
+ };
+ key <AD03> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ e, E ]
+ };
+ key <AD04> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ r, R ]
+ };
+ key <AD05> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ t, T ]
+ };
+ key <AD06> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ y, Y ]
+ };
+ key <AD07> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ u, U ]
+ };
+ key <AD08> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ i, I ]
+ };
+ key <AD09> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ o, O ]
+ };
+ key <AD10> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ p, P ]
+ };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+ key <RTRN> { [ Return ] };
+ key <LCTL> { [ Control_L ] };
+ key <AC01> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ a, A ]
+ };
+ key <AC02> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ s, S ]
+ };
+ key <AC03> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ d, D ]
+ };
+ key <AC04> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ f, F ]
+ };
+ key <AC05> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ g, G ]
+ };
+ key <AC06> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ h, H ]
+ };
+ key <AC07> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ j, J ]
+ };
+ key <AC08> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ k, K ]
+ };
+ key <AC09> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ l, L ]
+ };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+ key <TLDE> { [ grave, asciitilde ] };
+ key <LFSH> { [ Shift_L ] };
+ key <BKSL> { [ backslash, bar ] };
+ key <AB01> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ z, Z ]
+ };
+ key <AB02> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ x, X ]
+ };
+ key <AB03> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ c, C ]
+ };
+ key <AB04> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ v, V ]
+ };
+ key <AB05> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ b, B ]
+ };
+ key <AB06> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ n, N ]
+ };
+ key <AB07> {
+ type= "ALPHABETIC",
+ symbols[Group1]= [ m, M ]
+ };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+ key <RTSH> { [ Shift_R ] };
+ key <KPMU> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ]
+ };
+ key <LALT> { [ Alt_L, Meta_L ] };
+ key <SPCE> { [ space ] };
+ key <CAPS> { [ Control_L, Control_L ] };
+ key <FK01> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ]
+ };
+ key <FK02> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ]
+ };
+ key <FK03> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ]
+ };
+ key <FK04> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ]
+ };
+ key <FK05> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ]
+ };
+ key <FK06> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ]
+ };
+ key <FK07> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ]
+ };
+ key <FK08> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ]
+ };
+ key <FK09> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ]
+ };
+ key <FK10> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ]
+ };
+ key <NMLK> { [ Num_Lock ] };
+ key <SCLK> { [ Scroll_Lock ] };
+ key <KP7> { [ KP_Home, KP_7 ] };
+ key <KP8> { [ KP_Up, KP_8 ] };
+ key <KP9> { [ KP_Prior, KP_9 ] };
+ key <KPSU> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ]
+ };
+ key <KP4> { [ KP_Left, KP_4 ] };
+ key <KP5> { [ KP_Begin, KP_5 ] };
+ key <KP6> { [ KP_Right, KP_6 ] };
+ key <KPAD> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ]
+ };
+ key <KP1> { [ KP_End, KP_1 ] };
+ key <KP2> { [ KP_Down, KP_2 ] };
+ key <KP3> { [ KP_Next, KP_3 ] };
+ key <KP0> { [ KP_Insert, KP_0 ] };
+ key <KPDL> { [ KP_Delete, KP_Decimal ] };
+ key <LVL3> { [ ISO_Level3_Shift ] };
+ key <LSGT> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ less, greater, bar, brokenbar ]
+ };
+ key <FK11> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ]
+ };
+ key <FK12> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ]
+ };
+ key <KATA> { [ Katakana ] };
+ key <HIRA> { [ Hiragana ] };
+ key <HENK> { [ Henkan_Mode ] };
+ key <HKTG> { [ Hiragana_Katakana ] };
+ key <MUHE> { [ Muhenkan ] };
+ key <KPEN> { [ KP_Enter ] };
+ key <RCTL> { [ Control_R ] };
+ key <KPDV> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ]
+ };
+ key <PRSC> {
+ type= "PC_ALT_LEVEL2",
+ symbols[Group1]= [ Print, Sys_Req ]
+ };
+ key <RALT> {
+ type= "TWO_LEVEL",
+ symbols[Group1]= [ Alt_R, Meta_R ]
+ };
+ key <LNFD> { [ Linefeed ] };
+ key <HOME> { [ Home ] };
+ key <UP> { [ Up ] };
+ key <PGUP> { [ Prior ] };
+ key <LEFT> { [ Left ] };
+ key <RGHT> { [ Right ] };
+ key <END> { [ End ] };
+ key <DOWN> { [ Down ] };
+ key <PGDN> { [ Next ] };
+ key <INS> { [ Insert ] };
+ key <DELE> { [ Delete ] };
+ key <MUTE> { [ XF86AudioMute ] };
+ key <VOL-> { [ XF86AudioLowerVolume ] };
+ key <VOL+> { [ XF86AudioRaiseVolume ] };
+ key <POWR> { [ XF86PowerOff ] };
+ key <KPEQ> { [ KP_Equal ] };
+ key <I126> { [ plusminus ] };
+ key <PAUS> {
+ type= "PC_CONTROL_LEVEL2",
+ symbols[Group1]= [ Pause, Break ]
+ };
+ key <I128> { [ XF86LaunchA ] };
+ key <I129> { [ KP_Decimal, KP_Decimal ] };
+ key <HNGL> { [ Hangul ] };
+ key <HJCV> { [ Hangul_Hanja ] };
+ key <LWIN> { [ Super_L ] };
+ key <RWIN> {
+ type= "TWO_LEVEL",
+ symbols[Group1]= [ Multi_key, Multi_key ]
+ };
+ key <COMP> { [ Menu ] };
+ key <STOP> { [ Cancel ] };
+ key <AGAI> { [ Redo ] };
+ key <PROP> { [ SunProps ] };
+ key <UNDO> { [ Undo ] };
+ key <FRNT> { [ SunFront ] };
+ key <COPY> { [ XF86Copy ] };
+ key <OPEN> { [ SunOpen ] };
+ key <PAST> { [ XF86Paste ] };
+ key <FIND> { [ Find ] };
+ key <CUT> { [ XF86Cut ] };
+ key <HELP> { [ Help ] };
+ key <I147> { [ XF86MenuKB ] };
+ key <I148> { [ XF86Calculator ] };
+ key <I150> { [ XF86Sleep ] };
+ key <I151> { [ XF86WakeUp ] };
+ key <I152> { [ XF86Explorer ] };
+ key <I153> { [ XF86Send ] };
+ key <I155> { [ XF86Xfer ] };
+ key <I156> { [ XF86Launch1 ] };
+ key <I157> { [ XF86Launch2 ] };
+ key <I158> { [ XF86WWW ] };
+ key <I159> { [ XF86DOS ] };
+ key <I160> { [ XF86ScreenSaver ] };
+ key <I162> { [ XF86RotateWindows ] };
+ key <I163> { [ XF86Mail ] };
+ key <I164> { [ XF86Favorites ] };
+ key <I165> { [ XF86MyComputer ] };
+ key <I166> { [ XF86Back ] };
+ key <I167> { [ XF86Forward ] };
+ key <I169> { [ XF86Eject ] };
+ key <I170> { [ XF86Eject, XF86Eject ] };
+ key <I171> { [ XF86AudioNext ] };
+ key <I172> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I173> { [ XF86AudioPrev ] };
+ key <I174> { [ XF86AudioStop, XF86Eject ] };
+ key <I175> { [ XF86AudioRecord ] };
+ key <I176> { [ XF86AudioRewind ] };
+ key <I177> { [ XF86Phone ] };
+ key <I179> { [ XF86Tools ] };
+ key <I180> { [ XF86HomePage ] };
+ key <I181> { [ XF86Reload ] };
+ key <I182> { [ XF86Close ] };
+ key <I185> { [ XF86ScrollUp ] };
+ key <I186> { [ XF86ScrollDown ] };
+ key <I187> { [ parenleft ] };
+ key <I188> { [ parenright ] };
+ key <I189> { [ XF86New ] };
+ key <I190> { [ Redo ] };
+ key <FK13> { [ XF86Tools ] };
+ key <FK14> { [ XF86Launch5 ] };
+ key <FK15> { [ XF86Launch6 ] };
+ key <FK16> { [ XF86Launch7 ] };
+ key <FK17> { [ XF86Launch8 ] };
+ key <FK18> { [ XF86Launch9 ] };
+ key <FK21> { [ XF86TouchpadToggle ] };
+ key <FK22> { [ XF86TouchpadOn ] };
+ key <FK23> { [ XF86TouchpadOff ] };
+ key <MDSW> { [ Mode_switch ] };
+ key <ALT> { [ NoSymbol, Alt_L ] };
+ key <META> { [ NoSymbol, Meta_L ] };
+ key <SUPR> { [ NoSymbol, Super_L ] };
+ key <HYPR> { [ NoSymbol, Hyper_L ] };
+ key <I208> { [ XF86AudioPlay ] };
+ key <I209> { [ XF86AudioPause ] };
+ key <I210> { [ XF86Launch3 ] };
+ key <I211> { [ XF86Launch4 ] };
+ key <I212> { [ XF86LaunchB ] };
+ key <I213> { [ XF86Suspend ] };
+ key <I214> { [ XF86Close ] };
+ key <I215> { [ XF86AudioPlay ] };
+ key <I216> { [ XF86AudioForward ] };
+ key <I218> { [ Print ] };
+ key <I220> { [ XF86WebCam ] };
+ key <I223> { [ XF86Mail ] };
+ key <I224> { [ XF86Messenger ] };
+ key <I225> { [ XF86Search ] };
+ key <I226> { [ XF86Go ] };
+ key <I227> { [ XF86Finance ] };
+ key <I228> { [ XF86Game ] };
+ key <I229> { [ XF86Shop ] };
+ key <I231> { [ Cancel ] };
+ key <I232> { [ XF86MonBrightnessDown ] };
+ key <I233> { [ XF86MonBrightnessUp ] };
+ key <I234> { [ XF86AudioMedia ] };
+ key <I235> { [ XF86Display ] };
+ key <I236> { [ XF86KbdLightOnOff ] };
+ key <I237> { [ XF86KbdBrightnessDown ] };
+ key <I238> { [ XF86KbdBrightnessUp ] };
+ key <I239> { [ XF86Send ] };
+ key <I240> { [ XF86Reply ] };
+ key <I241> { [ XF86MailForward ] };
+ key <I242> { [ XF86Save ] };
+ key <I243> { [ XF86Documents ] };
+ key <I244> { [ XF86Battery ] };
+ key <I245> { [ XF86Bluetooth ] };
+ key <I246> { [ XF86WLAN ] };
+ modifier_map Control { <LCTL> };
+ modifier_map Shift { <LFSH> };
+ modifier_map Shift { <RTSH> };
+ modifier_map Mod1 { <LALT> };
+ modifier_map Control { <CAPS> };
+ modifier_map Mod2 { <NMLK> };
+ modifier_map Mod5 { <LVL3> };
+ modifier_map Control { <RCTL> };
+ modifier_map Mod1 { <RALT> };
+ modifier_map Mod4 { <LWIN> };
+ modifier_map Mod5 { <MDSW> };
+ modifier_map Mod1 { <META> };
+ modifier_map Mod4 { <SUPR> };
+ modifier_map Mod4 { <HYPR> };
+};
+
+xkb_geometry "pc(pc105)" {
+
+ width= 470;
+ height= 180;
+
+ alias <AC00> = <CAPS>;
+ alias <AA00> = <LCTL>;
+
+ baseColor= "white";
+ labelColor= "black";
+ xfont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ description= "Generic 105";
+
+ shape "NORM" {
+ corner= 1,
+ { [ 18, 18 ] },
+ { [ 2, 1 ], [ 16, 16 ] }
+ };
+ shape "BKSP" {
+ corner= 1,
+ { [ 38, 18 ] },
+ { [ 2, 1 ], [ 36, 16 ] }
+ };
+ shape "TABK" {
+ corner= 1,
+ { [ 28, 18 ] },
+ { [ 2, 1 ], [ 26, 16 ] }
+ };
+ shape "BKSL" {
+ corner= 1,
+ { [ 28, 18 ] },
+ { [ 2, 1 ], [ 26, 16 ] }
+ };
+ shape "RTRN" {
+ corner= 1,
+ { [ 0, 0 ], [ 28, 0 ], [ 28, 37 ], [ 5, 37 ],
+ [ 5, 18 ], [ 0, 18 ] },
+ { [ 2, 1 ], [ 26, 1 ], [ 26, 35 ], [ 7, 35 ],
+ [ 7, 16 ], [ 2, 16 ] },
+ approx= { [ 5, 0 ], [ 28, 37 ] }
+ };
+ shape "CAPS" {
+ corner= 1,
+ { [ 33, 18 ] },
+ { [ 2, 1 ], [ 31, 16 ] }
+ };
+ shape "LFSH" {
+ corner= 1,
+ { [ 25, 18 ] },
+ { [ 2, 1 ], [ 23, 16 ] }
+ };
+ shape "RTSH" {
+ corner= 1,
+ { [ 50, 18 ] },
+ { [ 2, 1 ], [ 48, 16 ] }
+ };
+ shape "MODK" {
+ corner= 1,
+ { [ 27, 18 ] },
+ { [ 2, 1 ], [ 25, 16 ] }
+ };
+ shape "SMOD" {
+ corner= 1,
+ { [ 23, 18 ] },
+ { [ 2, 1 ], [ 21, 16 ] }
+ };
+ shape "SPCE" {
+ corner= 1,
+ { [ 113, 18 ] },
+ { [ 2, 1 ], [ 111, 16 ] }
+ };
+ shape "KP0" {
+ corner= 1,
+ { [ 37, 18 ] },
+ { [ 2, 1 ], [ 35, 16 ] }
+ };
+ shape "KPAD" {
+ corner= 1,
+ { [ 18, 37 ] },
+ { [ 2, 1 ], [ 16, 35 ] }
+ };
+ shape "LEDS" { { [ 75, 20 ] } };
+ shape "LED" { { [ 5, 1 ] } };
+ section "Function" {
+ key.color= "grey20";
+ priority= 7;
+ top= 22;
+ left= 19;
+ width= 351;
+ height= 19;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <ESC>, "NORM", 1 },
+ { <FK01>, "NORM", 20, color="white" },
+ { <FK02>, "NORM", 1, color="white" },
+ { <FK03>, "NORM", 1, color="white" },
+ { <FK04>, "NORM", 1, color="white" },
+ { <FK05>, "NORM", 11, color="white" },
+ { <FK06>, "NORM", 1, color="white" },
+ { <FK07>, "NORM", 1, color="white" },
+ { <FK08>, "NORM", 1, color="white" },
+ { <FK09>, "NORM", 11, color="white" },
+ { <FK10>, "NORM", 1, color="white" },
+ { <FK11>, "NORM", 1, color="white" },
+ { <FK12>, "NORM", 1, color="white" },
+ { <PRSC>, "NORM", 8, color="white" },
+ { <SCLK>, "NORM", 1, color="white" },
+ { <PAUS>, "NORM", 1, color="white" }
+ };
+ };
+ }; // End of "Function" section
+
+ section "Alpha" {
+ key.color= "white";
+ priority= 8;
+ top= 61;
+ left= 19;
+ width= 287;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <TLDE>, "NORM", 1 }, { <AE01>, "NORM", 1 },
+ { <AE02>, "NORM", 1 }, { <AE03>, "NORM", 1 },
+ { <AE04>, "NORM", 1 }, { <AE05>, "NORM", 1 },
+ { <AE06>, "NORM", 1 }, { <AE07>, "NORM", 1 },
+ { <AE08>, "NORM", 1 }, { <AE09>, "NORM", 1 },
+ { <AE10>, "NORM", 1 }, { <AE11>, "NORM", 1 },
+ { <AE12>, "NORM", 1 },
+ { <BKSP>, "BKSP", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <TAB>, "TABK", 1, color="grey20" },
+ { <AD01>, "NORM", 1 }, { <AD02>, "NORM", 1 },
+ { <AD03>, "NORM", 1 }, { <AD04>, "NORM", 1 },
+ { <AD05>, "NORM", 1 }, { <AD06>, "NORM", 1 },
+ { <AD07>, "NORM", 1 }, { <AD08>, "NORM", 1 },
+ { <AD09>, "NORM", 1 }, { <AD10>, "NORM", 1 },
+ { <AD11>, "NORM", 1 }, { <AD12>, "NORM", 1 },
+ { <RTRN>, "RTRN", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 39;
+ left= 1;
+ keys {
+ { <CAPS>, "CAPS", 1, color="grey20" },
+ { <AC01>, "NORM", 1 }, { <AC02>, "NORM", 1 },
+ { <AC03>, "NORM", 1 }, { <AC04>, "NORM", 1 },
+ { <AC05>, "NORM", 1 }, { <AC06>, "NORM", 1 },
+ { <AC07>, "NORM", 1 }, { <AC08>, "NORM", 1 },
+ { <AC09>, "NORM", 1 }, { <AC10>, "NORM", 1 },
+ { <AC11>, "NORM", 1 }, { <BKSL>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 58;
+ left= 1;
+ keys {
+ { <LFSH>, "LFSH", 1, color="grey20" },
+ { <LSGT>, "NORM", 1 }, { <AB01>, "NORM", 1 },
+ { <AB02>, "NORM", 1 }, { <AB03>, "NORM", 1 },
+ { <AB04>, "NORM", 1 }, { <AB05>, "NORM", 1 },
+ { <AB06>, "NORM", 1 }, { <AB07>, "NORM", 1 },
+ { <AB08>, "NORM", 1 }, { <AB09>, "NORM", 1 },
+ { <AB10>, "NORM", 1 },
+ { <RTSH>, "RTSH", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <LCTL>, "MODK", 1, color="grey20" },
+ { <LWIN>, "SMOD", 1, color="grey20" },
+ { <LALT>, "SMOD", 1, color="grey20" },
+ { <SPCE>, "SPCE", 1 },
+ { <RALT>, "SMOD", 1, color="grey20" },
+ { <RWIN>, "SMOD", 1, color="grey20" },
+ { <MENU>, "SMOD", 1, color="grey20" },
+ { <RCTL>, "SMOD", 1, color="grey20" }
+ };
+ };
+ }; // End of "Alpha" section
+
+ section "Editing" {
+ key.color= "grey20";
+ priority= 9;
+ top= 61;
+ left= 312;
+ width= 58;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <INS>, "NORM", 1 }, { <HOME>, "NORM", 1 },
+ { <PGUP>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <DELE>, "NORM", 1 }, { <END>, "NORM", 1 },
+ { <PGDN>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 58;
+ left= 20;
+ keys {
+ { <UP>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <LEFT>, "NORM", 1 }, { <DOWN>, "NORM", 1 },
+ { <RGHT>, "NORM", 1 }
+ };
+ };
+ }; // End of "Editing" section
+
+ section "Keypad" {
+ key.color= "grey20";
+ priority= 10;
+ top= 61;
+ left= 376;
+ width= 77;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <NMLK>, "NORM", 1 }, { <KPDV>, "NORM", 1 },
+ { <KPMU>, "NORM", 1 }, { <KPSU>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <KP7>, "NORM", 1, color="white" },
+ { <KP8>, "NORM", 1, color="white" },
+ { <KP9>, "NORM", 1, color="white" },
+ { <KPAD>, "KPAD", 1 }
+ };
+ };
+ row {
+ top= 39;
+ left= 1;
+ keys {
+ { <KP4>, "NORM", 1, color="white" },
+ { <KP5>, "NORM", 1, color="white" },
+ { <KP6>, "NORM", 1, color="white" }
+ };
+ };
+ row {
+ top= 58;
+ left= 1;
+ keys {
+ { <KP1>, "NORM", 1, color="white" },
+ { <KP2>, "NORM", 1, color="white" },
+ { <KP3>, "NORM", 1, color="white" },
+ { <KPEN>, "KPAD", 1 }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <KP0>, "KP0", 1, color="white" },
+ { <KPDL>, "NORM", 1, color="white" }
+ };
+ };
+ }; // End of "Keypad" section
+
+ solid "LedPanel" {
+ top= 22;
+ left= 377;
+ priority= 0;
+ color= "grey10";
+ shape= "LEDS";
+ };
+ indicator "Num Lock" {
+ top= 37;
+ left= 382;
+ priority= 1;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ indicator "Caps Lock" {
+ top= 37;
+ left= 407;
+ priority= 2;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ indicator "Scroll Lock" {
+ top= 37;
+ left= 433;
+ priority= 3;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ text "NumLockLabel" {
+ top= 25;
+ left= 378;
+ priority= 4;
+ width= 19.8;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Num\nLock";
+ };
+ text "CapsLockLabel" {
+ top= 25;
+ left= 403;
+ priority= 5;
+ width= 26.4;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Caps\nLock";
+ };
+ text "ScrollLockLabel" {
+ top= 25;
+ left= 428;
+ priority= 6;
+ width= 39.6;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Scroll\nLock";
+ };
+};
+
+};
diff --git a/test/data/keymaps/syntax-error2.xkb b/test/data/keymaps/syntax-error2.xkb
new file mode 100644
index 0000000..0ca28f2
--- /dev/null
+++ b/test/data/keymaps/syntax-error2.xkb
@@ -0,0 +1,7 @@
+xkb_keymap {
+xkb_compatibility "complete" {
+ interpret ISO_Level2_Latch+Exactly(Shift) {
+ action == LatchMods(modifiers=Shift,clearLocks,latchToLock);
+ };
+};
+};
diff --git a/test/data/keymaps/unbound-vmod.xkb b/test/data/keymaps/unbound-vmod.xkb
new file mode 100644
index 0000000..a1733c1
--- /dev/null
+++ b/test/data/keymaps/unbound-vmod.xkb
@@ -0,0 +1,1533 @@
+xkb_keymap {
+xkb_keycodes "evdev+aliases(qwertz)" {
+ minimum = 8;
+ maximum = 255;
+ <ESC> = 9;
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <RTRN> = 36;
+ <LCTL> = 37;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+ <TLDE> = 49;
+ <LFSH> = 50;
+ <BKSL> = 51;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+ <KPMU> = 63;
+ <LALT> = 64;
+ <SPCE> = 65;
+ <CAPS> = 66;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <NMLK> = 77;
+ <SCLK> = 78;
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPSU> = 82;
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+ <KPAD> = 86;
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KP0> = 90;
+ <KPDL> = 91;
+ <LVL3> = 92;
+ <LSGT> = 94;
+ <FK11> = 95;
+ <FK12> = 96;
+ <AB11> = 97;
+ <KATA> = 98;
+ <HIRA> = 99;
+ <HENK> = 100;
+ <HKTG> = 101;
+ <MUHE> = 102;
+ <JPCM> = 103;
+ <KPEN> = 104;
+ <RCTL> = 105;
+ <KPDV> = 106;
+ <PRSC> = 107;
+ <RALT> = 108;
+ <LNFD> = 109;
+ <HOME> = 110;
+ <UP> = 111;
+ <PGUP> = 112;
+ <LEFT> = 113;
+ <RGHT> = 114;
+ <END> = 115;
+ <DOWN> = 116;
+ <PGDN> = 117;
+ <INS> = 118;
+ <DELE> = 119;
+ <I120> = 120;
+ <MUTE> = 121;
+ <VOL-> = 122;
+ <VOL+> = 123;
+ <POWR> = 124;
+ <KPEQ> = 125;
+ <I126> = 126;
+ <PAUS> = 127;
+ <I128> = 128;
+ <I129> = 129;
+ <HNGL> = 130;
+ <HJCV> = 131;
+ <AE13> = 132;
+ <LWIN> = 133;
+ <RWIN> = 134;
+ <COMP> = 135;
+ <STOP> = 136;
+ <AGAI> = 137;
+ <PROP> = 138;
+ <UNDO> = 139;
+ <FRNT> = 140;
+ <COPY> = 141;
+ <OPEN> = 142;
+ <PAST> = 143;
+ <FIND> = 144;
+ <CUT> = 145;
+ <HELP> = 146;
+ <I147> = 147;
+ <I148> = 148;
+ <I149> = 149;
+ <I150> = 150;
+ <I151> = 151;
+ <I152> = 152;
+ <I153> = 153;
+ <I154> = 154;
+ <I155> = 155;
+ <I156> = 156;
+ <I157> = 157;
+ <I158> = 158;
+ <I159> = 159;
+ <I160> = 160;
+ <I161> = 161;
+ <I162> = 162;
+ <I163> = 163;
+ <I164> = 164;
+ <I165> = 165;
+ <I166> = 166;
+ <I167> = 167;
+ <I168> = 168;
+ <I169> = 169;
+ <I170> = 170;
+ <I171> = 171;
+ <I172> = 172;
+ <I173> = 173;
+ <I174> = 174;
+ <I175> = 175;
+ <I176> = 176;
+ <I177> = 177;
+ <I178> = 178;
+ <I179> = 179;
+ <I180> = 180;
+ <I181> = 181;
+ <I182> = 182;
+ <I183> = 183;
+ <I184> = 184;
+ <I185> = 185;
+ <I186> = 186;
+ <I187> = 187;
+ <I188> = 188;
+ <I189> = 189;
+ <I190> = 190;
+ <FK13> = 191;
+ <FK14> = 192;
+ <FK15> = 193;
+ <FK16> = 194;
+ <FK17> = 195;
+ <FK18> = 196;
+ <FK19> = 197;
+ <FK20> = 198;
+ <FK21> = 199;
+ <FK22> = 200;
+ <FK23> = 201;
+ <FK24> = 202;
+ <MDSW> = 203;
+ <ALT> = 204;
+ <META> = 205;
+ <SUPR> = 206;
+ <HYPR> = 207;
+ <I208> = 208;
+ <I209> = 209;
+ <I210> = 210;
+ <I211> = 211;
+ <I212> = 212;
+ <I213> = 213;
+ <I214> = 214;
+ <I215> = 215;
+ <I216> = 216;
+ <I217> = 217;
+ <I218> = 218;
+ <I219> = 219;
+ <I220> = 220;
+ <I221> = 221;
+ <I222> = 222;
+ <I223> = 223;
+ <I224> = 224;
+ <I225> = 225;
+ <I226> = 226;
+ <I227> = 227;
+ <I228> = 228;
+ <I229> = 229;
+ <I230> = 230;
+ <I231> = 231;
+ <I232> = 232;
+ <I233> = 233;
+ <I234> = 234;
+ <I235> = 235;
+ <I236> = 236;
+ <I237> = 237;
+ <I238> = 238;
+ <I239> = 239;
+ <I240> = 240;
+ <I241> = 241;
+ <I242> = 242;
+ <I243> = 243;
+ <I244> = 244;
+ <I245> = 245;
+ <I246> = 246;
+ <I247> = 247;
+ <I248> = 248;
+ <I249> = 249;
+ <I250> = 250;
+ <I251> = 251;
+ <I252> = 252;
+ <I253> = 253;
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+ indicator 4 = "Compose";
+ indicator 5 = "Kana";
+ indicator 6 = "Sleep";
+ indicator 7 = "Suspend";
+ indicator 8 = "Mute";
+ indicator 9 = "Misc";
+ indicator 10 = "Mail";
+ indicator 11 = "Charging";
+ virtual indicator 12 = "Shift Lock";
+ virtual indicator 13 = "Group 2";
+ virtual indicator 14 = "Mouse Keys";
+ alias <AC12> = <BKSL>;
+ alias <MENU> = <COMP>;
+ alias <HZTG> = <TLDE>;
+ alias <LMTA> = <LWIN>;
+ alias <RMTA> = <RWIN>;
+ alias <ALGR> = <RALT>;
+ alias <KPPT> = <I129>;
+ alias <LatQ> = <AD01>;
+ alias <LatW> = <AD02>;
+ alias <LatE> = <AD03>;
+ alias <LatR> = <AD04>;
+ alias <LatT> = <AD05>;
+ alias <LatZ> = <AD06>;
+ alias <LatU> = <AD07>;
+ alias <LatI> = <AD08>;
+ alias <LatO> = <AD09>;
+ alias <LatP> = <AD10>;
+ alias <LatA> = <AC01>;
+ alias <LatS> = <AC02>;
+ alias <LatD> = <AC03>;
+ alias <LatF> = <AC04>;
+ alias <LatG> = <AC05>;
+ alias <LatH> = <AC06>;
+ alias <LatJ> = <AC07>;
+ alias <LatK> = <AC08>;
+ alias <LatL> = <AC09>;
+ alias <LatY> = <AB01>;
+ alias <LatX> = <AB02>;
+ alias <LatC> = <AB03>;
+ alias <LatV> = <AB04>;
+ alias <LatB> = <AB05>;
+ alias <LatN> = <AB06>;
+ alias <LatM> = <AB07>;
+};
+
+xkb_types "complete" {
+
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ type "ONE_LEVEL" {
+ modifiers= none;
+ level_name[Level1]= "Any";
+ };
+ type "TWO_LEVEL" {
+ modifiers= Shift;
+ map[Shift]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ };
+ type "ALPHABETIC" {
+ modifiers= Shift+Lock;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Caps";
+ };
+ type "KEYPAD" {
+ modifiers= Shift+NumLock;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ };
+ type "SHIFT+ALT" {
+ modifiers= Shift+Alt;
+ map[Shift+Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift+Alt";
+ };
+ type "PC_CONTROL_LEVEL2" {
+ modifiers= Control;
+ map[Control]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Control";
+ };
+ type "PC_LCONTROL_LEVEL2" {
+ modifiers= LControl;
+ map[LControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LControl";
+ };
+ type "PC_RCONTROL_LEVEL2" {
+ modifiers= RControl;
+ map[RControl]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RControl";
+ };
+ type "PC_ALT_LEVEL2" {
+ modifiers= Alt;
+ map[Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt";
+ };
+ type "PC_LALT_LEVEL2" {
+ modifiers= LAlt;
+ map[LAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "LAlt";
+ };
+ type "PC_RALT_LEVEL2" {
+ modifiers= RAlt;
+ map[RAlt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "RAlt";
+ };
+ type "CTRL+ALT" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[Shift]= Level2;
+ preserve[Shift]= Shift;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ preserve[Shift+LevelThree]= Shift;
+ map[Control+Alt]= Level5;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "Ctrl+Alt";
+ };
+ type "LOCAL_EIGHT_LEVEL" {
+ modifiers= Shift+Lock+Control+LevelThree;
+ map[Shift+Lock]= Level1;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Control]= Level5;
+ map[Shift+Lock+Control]= Level5;
+ map[Shift+Control]= Level6;
+ map[Lock+Control]= Level6;
+ map[Control+LevelThree]= Level7;
+ map[Shift+Lock+Control+LevelThree]= Level7;
+ map[Shift+Control+LevelThree]= Level8;
+ map[Lock+Control+LevelThree]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ level_name[Level4]= "Shift Level3";
+ level_name[Level5]= "Ctrl";
+ level_name[Level6]= "Shift Ctrl";
+ level_name[Level7]= "Level3 Ctrl";
+ level_name[Level8]= "Shift Level3 Ctrl";
+ };
+ type "THREE_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ };
+ type "EIGHT_LEVEL" {
+ modifiers= Shift+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level8;
+ map[Shift+Lock+LevelThree+LevelFive]= Level7;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "EIGHT_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree+LevelFive;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ map[LevelFive]= Level5;
+ map[Shift+LevelFive]= Level6;
+ map[Lock+LevelFive]= Level6;
+ preserve[Lock+LevelFive]= Lock;
+ map[Shift+Lock+LevelFive]= Level6;
+ preserve[Shift+Lock+LevelFive]= Lock;
+ map[LevelThree+LevelFive]= Level7;
+ map[Shift+LevelThree+LevelFive]= Level8;
+ map[Lock+LevelThree+LevelFive]= Level7;
+ preserve[Lock+LevelThree+LevelFive]= Lock;
+ map[Shift+Lock+LevelThree+LevelFive]= Level8;
+ preserve[Shift+Lock+LevelThree+LevelFive]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "X";
+ level_name[Level6]= "X Shift";
+ level_name[Level7]= "X Alt Base";
+ level_name[Level8]= "X Shift Alt";
+ };
+ type "FOUR_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level4;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_SEMIALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level4;
+ preserve[Shift+Lock+LevelThree]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_MIXED_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[Shift+NumLock]= Level1;
+ map[NumLock]= Level2;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[NumLock+LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_X" {
+ modifiers= Shift+Control+Alt+LevelThree;
+ map[LevelThree]= Level2;
+ map[Shift+LevelThree]= Level3;
+ map[Control+Alt]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt Base";
+ level_name[Level3]= "Shift Alt";
+ level_name[Level4]= "Ctrl+Alt";
+ };
+ type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[Lock]= Level4;
+ preserve[Lock]= Lock;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock+LevelThree]= Level3;
+ preserve[Lock+LevelThree]= Lock;
+ map[Shift+Lock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "AltGr Base";
+ level_name[Level4]= "Shift AltGr";
+ };
+ type "FOUR_LEVEL_PLUS_LOCK" {
+ modifiers= Shift+Lock+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[Lock]= Level5;
+ map[Shift+Lock]= Level2;
+ map[Lock+LevelThree]= Level3;
+ map[Shift+Lock+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ level_name[Level5]= "Lock";
+ };
+ type "FOUR_LEVEL_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[NumLock+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Alt Number";
+ };
+};
+
+xkb_compatibility "complete" {
+
+ virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+ interpret.useModMapMods= AnyLevel;
+ interpret.repeat= False;
+ interpret.locking= False;
+ interpret ISO_Level2_Latch+Exactly(Shift) {
+ useModMapMods=level1;
+ action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
+ };
+ interpret Shift_Lock+AnyOf(Shift+Lock) {
+ action= LockMods(modifiers=Shift);
+ };
+ interpret Num_Lock+AnyOf(all) {
+ virtualModifier= NumLock;
+ action= LockMods(modifiers=NumLock);
+ };
+ interpret ISO_Level3_Shift+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret Alt_L+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Alt_R+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_L+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Meta_R+AnyOf(all) {
+ virtualModifier= Meta;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_L+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Super_R+AnyOf(all) {
+ virtualModifier= Super;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_L+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Hyper_R+AnyOf(all) {
+ virtualModifier= Hyper;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Scroll_Lock+AnyOf(all) {
+ virtualModifier= ScrollLock;
+ action= LockMods(modifiers=modMapMods);
+ };
+ interpret ISO_Level5_Shift+AnyOf(all) {
+ virtualModifier= LevelFive;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOf(all) {
+ virtualModifier= LevelFive;
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Mode_switch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= SetGroup(group=+1);
+ };
+ interpret ISO_Level3_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret ISO_Level3_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelThree);
+ };
+ interpret ISO_Group_Latch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LatchGroup(group=2);
+ };
+ interpret ISO_Next_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=+1);
+ };
+ interpret ISO_Prev_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=-1);
+ };
+ interpret ISO_First_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=1);
+ };
+ interpret ISO_Last_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=2);
+ };
+ interpret KP_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_End+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_Down+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_Next+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_Left+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_Right+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_Home+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_Up+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_Prior+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_Begin+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_F2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_Divide+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_F3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_Multiply+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_F4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Subtract+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Separator+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_Add+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_0+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Insert+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Decimal+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret KP_Delete+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret F25+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret F26+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret F27+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret F29+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret F31+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret F33+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret F35+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret Pointer_Button_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default);
+ };
+ interpret Pointer_Button1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1);
+ };
+ interpret Pointer_Button2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2);
+ };
+ interpret Pointer_Button3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3);
+ };
+ interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret Pointer_DblClick1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1,count=2);
+ };
+ interpret Pointer_DblClick2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2,count=2);
+ };
+ interpret Pointer_DblClick3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3,count=2);
+ };
+ interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=default,affect=both);
+ };
+ interpret Pointer_Drag1+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=1,affect=both);
+ };
+ interpret Pointer_Drag2+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=2,affect=both);
+ };
+ interpret Pointer_Drag3+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=3,affect=both);
+ };
+ interpret Pointer_EnableKeys+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret Pointer_Accelerate+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=+1);
+ };
+ interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=-1);
+ };
+ interpret AccessX_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXKeys);
+ };
+ interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXFeedback);
+ };
+ interpret RepeatKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=RepeatKeys);
+ };
+ interpret SlowKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=SlowKeys);
+ };
+ interpret BounceKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=BounceKeys);
+ };
+ interpret StickyKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=StickyKeys);
+ };
+ interpret MouseKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Overlay1_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=Overlay1);
+ };
+ interpret Overlay2_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=Overlay2);
+ };
+ interpret AudibleBell_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AudibleBell);
+ };
+ interpret Terminate_Server+AnyOfOrNone(all) {
+ action= Terminate();
+ };
+ interpret Alt_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Alt_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Alt,clearLocks);
+ };
+ interpret Meta_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Meta_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Meta,clearLocks);
+ };
+ interpret Super_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Super_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Super,clearLocks);
+ };
+ interpret Hyper_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Hyper_R+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Hyper,clearLocks);
+ };
+ interpret Shift_L+AnyOfOrNone(all) {
+ action= SetMods(modifiers=Shift,clearLocks);
+ };
+ interpret XF86Switch_VT_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=1,!same);
+ };
+ interpret XF86Switch_VT_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=2,!same);
+ };
+ interpret XF86Switch_VT_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=3,!same);
+ };
+ interpret XF86Switch_VT_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=4,!same);
+ };
+ interpret XF86Switch_VT_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=5,!same);
+ };
+ interpret XF86Switch_VT_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=6,!same);
+ };
+ interpret XF86Switch_VT_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=7,!same);
+ };
+ interpret XF86Switch_VT_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=8,!same);
+ };
+ interpret XF86Switch_VT_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=9,!same);
+ };
+ interpret XF86Switch_VT_10+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=10,!same);
+ };
+ interpret XF86Switch_VT_11+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=11,!same);
+ };
+ interpret XF86Switch_VT_12+AnyOfOrNone(all) {
+ repeat= True;
+ action= SwitchScreen(screen=12,!same);
+ };
+ interpret XF86LogGrabInfo+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86LogWindowTree+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00);
+ };
+ interpret XF86Next_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret XF86Prev_VMode+AnyOfOrNone(all) {
+ repeat= True;
+ action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+ };
+ interpret ISO_Level5_Shift+AnyOfOrNone(all) {
+ action= SetMods(modifiers=LevelFive,clearLocks);
+ };
+ interpret ISO_Level5_Latch+AnyOfOrNone(all) {
+ action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+ };
+ interpret ISO_Level5_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=LevelFive);
+ };
+ interpret Caps_Lock+AnyOfOrNone(all) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+Exactly(Lock) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+AnyOf(all) {
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ group 2 = AltGr;
+ group 3 = AltGr;
+ group 4 = AltGr;
+ indicator "Caps Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= Lock;
+ };
+ indicator "Num Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= NumLock;
+ };
+ indicator "Scroll Lock" {
+ whichModState= locked;
+ modifiers= ScrollLock;
+ };
+ indicator "Shift Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= Shift;
+ };
+ indicator "Group 2" {
+ !allowExplicit;
+ groups= 0xfe;
+ };
+ indicator "Mouse Keys" {
+ indicatorDrivesKeyboard;
+ controls= mouseKeys;
+ };
+};
+
+xkb_symbols "pc+de+inet(evdev)+group(menu_toggle)+ctrl(nocaps)" {
+
+ name[group1]="German";
+
+ key <ESC> { [ Escape ] };
+ key <AE01> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ 1, exclam, onesuperior, exclamdown ]
+ };
+ key <AE02> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ 2, quotedbl, twosuperior, oneeighth ]
+ };
+ key <AE03> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ 3, section, threesuperior, sterling ]
+ };
+ key <AE04> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ 4, dollar, onequarter, currency ]
+ };
+ key <AE05> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ 5, percent, onehalf, threeeighths ]
+ };
+ key <AE06> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ 6, ampersand, notsign, fiveeighths ]
+ };
+ key <AE07> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ 7, slash, braceleft, seveneighths ]
+ };
+ key <AE08> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ 8, parenleft, bracketleft, trademark ]
+ };
+ key <AE09> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ 9, parenright, bracketright, plusminus ]
+ };
+ key <AE10> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ 0, equal, braceright, degree ]
+ };
+ key <AE11> {
+ type= "FOUR_LEVEL_PLUS_LOCK",
+ symbols[Group1]= [ ssharp, question, backslash, questiondown, U1E9E ]
+ };
+ key <AE12> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ dead_acute, dead_grave, dead_cedilla, dead_ogonek ]
+ };
+ key <BKSP> { [ BackSpace, BackSpace ] };
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ q, Q, at, Greek_OMEGA ]
+ };
+ key <AD02> {
+ type= "FOUR_LEVEL_ALPHABETIC",
+ symbols[Group1]= [ w, W, lstroke, Lstroke ]
+ };
+ key <AD03> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ e, E, EuroSign, EuroSign ]
+ };
+ key <AD04> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ r, R, paragraph, registered ]
+ };
+ key <AD05> {
+ type= "FOUR_LEVEL_ALPHABETIC",
+ symbols[Group1]= [ t, T, tslash, Tslash ]
+ };
+ key <AD06> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ z, Z, leftarrow, yen ]
+ };
+ key <AD07> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ u, U, downarrow, uparrow ]
+ };
+ key <AD08> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ i, I, rightarrow, idotless ]
+ };
+ key <AD09> {
+ type= "FOUR_LEVEL_ALPHABETIC",
+ symbols[Group1]= [ o, O, oslash, Oslash ]
+ };
+ key <AD10> {
+ type= "FOUR_LEVEL_ALPHABETIC",
+ symbols[Group1]= [ p, P, thorn, THORN ]
+ };
+ key <AD11> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ udiaeresis, Udiaeresis, dead_diaeresis, dead_abovering ]
+ };
+ key <AD12> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ plus, asterisk, asciitilde, macron ]
+ };
+ key <RTRN> { [ Return ] };
+ key <LCTL> { [ Control_L ] };
+ key <AC01> {
+ type= "FOUR_LEVEL_ALPHABETIC",
+ symbols[Group1]= [ a, A, ae, AE ]
+ };
+ key <AC02> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ s, S, U017F, U1E9E ]
+ };
+ key <AC03> {
+ type= "FOUR_LEVEL_ALPHABETIC",
+ symbols[Group1]= [ d, D, eth, ETH ]
+ };
+ key <AC04> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ f, F, dstroke, ordfeminine ]
+ };
+ key <AC05> {
+ type= "FOUR_LEVEL_ALPHABETIC",
+ symbols[Group1]= [ g, G, eng, ENG ]
+ };
+ key <AC06> {
+ type= "FOUR_LEVEL_ALPHABETIC",
+ symbols[Group1]= [ h, H, hstroke, Hstroke ]
+ };
+ key <AC07> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ j, J, dead_belowdot, dead_abovedot ]
+ };
+ key <AC08> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ k, K, kra, ampersand ]
+ };
+ key <AC09> {
+ type= "FOUR_LEVEL_ALPHABETIC",
+ symbols[Group1]= [ l, L, lstroke, Lstroke ]
+ };
+ key <AC10> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ odiaeresis, Odiaeresis, dead_doubleacute, dead_belowdot ]
+ };
+ key <AC11> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ adiaeresis, Adiaeresis, dead_circumflex, dead_caron ]
+ };
+ key <TLDE> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ dead_circumflex, degree, U2032, U2033 ]
+ };
+ key <LFSH> { [ Shift_L ] };
+ key <BKSL> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ numbersign, apostrophe, rightsinglequotemark, dead_breve ]
+ };
+ key <AB01> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ y, Y, guillemotright, U203A ]
+ };
+ key <AB02> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ x, X, guillemotleft, U2039 ]
+ };
+ key <AB03> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ c, C, cent, copyright ]
+ };
+ key <AB04> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ v, V, doublelowquotemark, singlelowquotemark ]
+ };
+ key <AB05> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ b, B, leftdoublequotemark, leftsinglequotemark ]
+ };
+ key <AB06> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ n, N, rightdoublequotemark, rightsinglequotemark ]
+ };
+ key <AB07> {
+ type= "FOUR_LEVEL_SEMIALPHABETIC",
+ symbols[Group1]= [ m, M, mu, masculine ]
+ };
+ key <AB08> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ comma, semicolon, periodcentered, multiply ]
+ };
+ key <AB09> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ period, colon, U2026, division ]
+ };
+ key <AB10> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ minus, underscore, endash, emdash ]
+ };
+ key <RTSH> { [ Shift_R ] };
+ key <KPMU> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ]
+ };
+ key <LALT> { [ Alt_L, Meta_L ] };
+ key <SPCE> { [ space ] };
+ key <CAPS> { [ Control_L, Control_L ] };
+ key <FK01> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ]
+ };
+ key <FK02> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ]
+ };
+ key <FK03> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ]
+ };
+ key <FK04> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ]
+ };
+ key <FK05> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ]
+ };
+ key <FK06> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ]
+ };
+ key <FK07> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ]
+ };
+ key <FK08> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ]
+ };
+ key <FK09> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ]
+ };
+ key <FK10> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ]
+ };
+ key <NMLK> { [ Num_Lock ] };
+ key <SCLK> { [ Scroll_Lock ] };
+ key <KP7> { [ KP_Home, KP_7 ] };
+ key <KP8> { [ KP_Up, KP_8 ] };
+ key <KP9> { [ KP_Prior, KP_9 ] };
+ key <KPSU> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ]
+ };
+ key <KP4> { [ KP_Left, KP_4 ] };
+ key <KP5> { [ KP_Begin, KP_5 ] };
+ key <KP6> { [ KP_Right, KP_6 ] };
+ key <KPAD> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ]
+ };
+ key <KP1> { [ KP_End, KP_1 ] };
+ key <KP2> { [ KP_Down, KP_2 ] };
+ key <KP3> { [ KP_Next, KP_3 ] };
+ key <KP0> { [ KP_Insert, KP_0 ] };
+ key <KPDL> {
+ type= "KEYPAD",
+ symbols[Group1]= [ KP_Delete, KP_Separator ]
+ };
+ key <LVL3> {
+ type= "ONE_LEVEL",
+ symbols[Group1]= [ ISO_Level3_Shift ],
+ actions[Group1]= [ SetMods(modifiers=LevelThree) ]
+ };
+ key <LSGT> {
+ type= "FOUR_LEVEL",
+ symbols[Group1]= [ less, greater, bar, brokenbar ]
+ };
+ key <FK11> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ]
+ };
+ key <FK12> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ]
+ };
+ key <KATA> { [ Katakana ] };
+ key <HIRA> { [ Hiragana ] };
+ key <HENK> { [ Henkan_Mode ] };
+ key <HKTG> { [ Hiragana_Katakana ] };
+ key <MUHE> { [ Muhenkan ] };
+ key <KPEN> { [ KP_Enter ] };
+ key <RCTL> { [ Control_R ] };
+ key <KPDV> {
+ type= "CTRL+ALT",
+ symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ]
+ };
+ key <PRSC> {
+ type= "PC_ALT_LEVEL2",
+ symbols[Group1]= [ Print, Sys_Req ]
+ };
+ key <RALT> {
+ type= "ONE_LEVEL",
+ symbols[Group1]= [ ISO_Level3_Shift ]
+ };
+ key <LNFD> { [ Linefeed ] };
+ key <HOME> { [ Home ] };
+ key <UP> { [ Up ] };
+ key <PGUP> { [ Prior ] };
+ key <LEFT> { [ Left ] };
+ key <RGHT> { [ Right ] };
+ key <END> { [ End ] };
+ key <DOWN> { [ Down ] };
+ key <PGDN> { [ Next ] };
+ key <INS> { [ Insert ] };
+ key <DELE> { [ Delete ] };
+ key <MUTE> { [ XF86AudioMute ] };
+ key <VOL-> { [ XF86AudioLowerVolume ] };
+ key <VOL+> { [ XF86AudioRaiseVolume ] };
+ key <POWR> { [ XF86PowerOff ] };
+ key <KPEQ> { [ KP_Equal ] };
+ key <I126> { [ plusminus ] };
+ key <PAUS> {
+ type= "PC_CONTROL_LEVEL2",
+ symbols[Group1]= [ Pause, Break ]
+ };
+ key <I128> { [ XF86LaunchA ] };
+ key <I129> { [ KP_Decimal, KP_Decimal ] };
+ key <HNGL> { [ Hangul ] };
+ key <HJCV> { [ Hangul_Hanja ] };
+ key <LWIN> { [ Super_L ] };
+ key <RWIN> { [ Super_R ] };
+ key <COMP> { [ ISO_Next_Group, Menu ] };
+ key <STOP> { [ Cancel ] };
+ key <AGAI> { [ Redo ] };
+ key <PROP> { [ SunProps ] };
+ key <UNDO> { [ Undo ] };
+ key <FRNT> { [ SunFront ] };
+ key <COPY> { [ XF86Copy ] };
+ key <OPEN> { [ XF86Open ] };
+ key <PAST> { [ XF86Paste ] };
+ key <FIND> { [ Find ] };
+ key <CUT> { [ XF86Cut ] };
+ key <HELP> { [ Help ] };
+ key <I147> { [ XF86MenuKB ] };
+ key <I148> { [ XF86Calculator ] };
+ key <I150> { [ XF86Sleep ] };
+ key <I151> { [ XF86WakeUp ] };
+ key <I152> { [ XF86Explorer ] };
+ key <I153> { [ XF86Send ] };
+ key <I155> { [ XF86Xfer ] };
+ key <I156> { [ XF86Launch1 ] };
+ key <I157> { [ XF86Launch2 ] };
+ key <I158> { [ XF86WWW ] };
+ key <I159> { [ XF86DOS ] };
+ key <I160> { [ XF86ScreenSaver ] };
+ key <I162> { [ XF86RotateWindows ] };
+ key <I163> { [ XF86Mail ] };
+ key <I164> { [ XF86Favorites ] };
+ key <I165> { [ XF86MyComputer ] };
+ key <I166> { [ XF86Back ] };
+ key <I167> { [ XF86Forward ] };
+ key <I169> { [ XF86Eject ] };
+ key <I170> { [ XF86Eject, XF86Eject ] };
+ key <I171> { [ XF86AudioNext ] };
+ key <I172> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I173> { [ XF86AudioPrev ] };
+ key <I174> { [ XF86AudioStop, XF86Eject ] };
+ key <I175> { [ XF86AudioRecord ] };
+ key <I176> { [ XF86AudioRewind ] };
+ key <I177> { [ XF86Phone ] };
+ key <I179> { [ XF86Tools ] };
+ key <I180> { [ XF86HomePage ] };
+ key <I181> { [ XF86Reload ] };
+ key <I182> { [ XF86Close ] };
+ key <I185> { [ XF86ScrollUp ] };
+ key <I186> { [ XF86ScrollDown ] };
+ key <I187> { [ parenleft ] };
+ key <I188> { [ parenright ] };
+ key <I189> { [ XF86New ] };
+ key <I190> { [ Redo ] };
+ key <FK13> { [ XF86Tools ] };
+ key <FK14> { [ XF86Launch5 ] };
+ key <FK15> { [ XF86Launch6 ] };
+ key <FK16> { [ XF86Launch7 ] };
+ key <FK17> { [ XF86Launch8 ] };
+ key <FK18> { [ XF86Launch9 ] };
+ key <FK21> { [ XF86TouchpadToggle ] };
+ key <FK22> { [ XF86TouchpadOn ] };
+ key <FK23> { [ XF86TouchpadOff ] };
+ key <MDSW> { [ Mode_switch ] };
+ key <ALT> { [ NoSymbol, Alt_L ] };
+ key <META> { [ NoSymbol, Meta_L ] };
+ key <SUPR> { [ NoSymbol, Super_L ] };
+ key <HYPR> { [ NoSymbol, Hyper_L ] };
+ key <I208> { [ XF86AudioPlay ] };
+ key <I209> { [ XF86AudioPause ] };
+ key <I210> { [ XF86Launch3 ] };
+ key <I211> { [ XF86Launch4 ] };
+ key <I212> { [ XF86LaunchB ] };
+ key <I213> { [ XF86Suspend ] };
+ key <I214> { [ XF86Close ] };
+ key <I215> { [ XF86AudioPlay ] };
+ key <I216> { [ XF86AudioForward ] };
+ key <I218> { [ Print ] };
+ key <I220> { [ XF86WebCam ] };
+ key <I223> { [ XF86Mail ] };
+ key <I224> { [ XF86Messenger ] };
+ key <I225> { [ XF86Search ] };
+ key <I226> { [ XF86Go ] };
+ key <I227> { [ XF86Finance ] };
+ key <I228> { [ XF86Game ] };
+ key <I229> { [ XF86Shop ] };
+ key <I231> { [ Cancel ] };
+ key <I232> { [ XF86MonBrightnessDown ] };
+ key <I233> { [ XF86MonBrightnessUp ] };
+ key <I234> { [ XF86AudioMedia ] };
+ key <I235> { [ XF86Display ] };
+ key <I236> { [ XF86KbdLightOnOff ] };
+ key <I237> { [ XF86KbdBrightnessDown ] };
+ key <I238> { [ XF86KbdBrightnessUp ] };
+ key <I239> { [ XF86Send ] };
+ key <I240> { [ XF86Reply ] };
+ key <I241> { [ XF86MailForward ] };
+ key <I242> { [ XF86Save ] };
+ key <I243> { [ XF86Documents ] };
+ key <I244> { [ XF86Battery ] };
+ key <I245> { [ XF86Bluetooth ] };
+ key <I246> { [ XF86WLAN ] };
+ modifier_map Control { <LCTL> };
+ modifier_map Shift { <LFSH> };
+ modifier_map Shift { <RTSH> };
+ modifier_map Mod1 { <LALT> };
+ modifier_map Control { <CAPS> };
+ modifier_map Mod2 { <NMLK> };
+ modifier_map Mod5 { <LVL3> };
+ modifier_map Control { <RCTL> };
+ modifier_map Mod4 { <LWIN> };
+ modifier_map Mod4 { <RWIN> };
+ modifier_map Mod5 { <MDSW> };
+ modifier_map Mod1 { <META> };
+ modifier_map Mod4 { <SUPR> };
+ modifier_map Mod4 { <HYPR> };
+};
+
+};
diff --git a/test/data/rules/base b/test/data/rules/base
new file mode 100644
index 0000000..11e1b56
--- /dev/null
+++ b/test/data/rules/base
@@ -0,0 +1,1268 @@
+// DO NOT EDIT THIS FILE - IT WAS AUTOGENERATED BY merge.sh FROM rules/*.part
+//
+// Rules for resolving XKB components for use with XFree86
+// Copyright 1996 by Joseph Moss
+//
+// 2002 Modifier: Ivan Pascal The XFree86 Project
+//
+
+// If you want non-latin layouts implicitly include the en_US layout
+// uncomment lines below
+//! $nonlatin = am ara ben bd bg bt by cs deva ge gh gr guj guru il \
+// in ir iku jp kan kh kr la lao lk mk mm mn mv mal olck \
+// ori pk ru scc sy syr tel th tj tam ua uz
+
+// PC models
+! $pcmodels = pc101 pc102 pc104 pc105
+
+// Jolla devices and keyboards
+! $jollamodels = jollasbj
+
+// Microsoft models (using MS geometry)
+! $msmodels = microsoft microsoft4000 microsoft7000 microsoftpro microsoftprousb microsoftprose
+
+// Nokia devices and keyboards
+! $nokiamodels = nokiasu8w nokiarx44 nokiarx51
+
+// PC geometries - they have special geometry but symbols are mostly pc105
+! $pcgeometries = latitude
+
+// TypeMatrix geometries
+! $tmgeometries = tm2020 tm2030PS2 tm2030USB tm2030USB-102 tm2030USB-106
+
+// Layouts that provide further specializations for the OLPC
+! $olpclayouts = af am ara br ca es et fr it kh kz in mn np ru th tr us
+
+! $macbooks = macbook78 macbook79
+! $maclaptop = ibook powerbook macbook78 macbook79
+! $applealu = applealu_ansi applealu_iso applealu_jis
+! $macs = macintosh macintosh_old ibook powerbook macbook78 macbook79
+
+! $macvendorlayouts = ch de dk fi fr gb is it latam nl no pt se us
+
+! $azerty = be fr
+! $qwertz = al cz de hr hu ro si sk
+
+
+// all layouts with 3rd and 4th groups
+! $threelevellayouts = al az \
+ be br bt \
+ ca ch cs cz \
+ de dk \
+ ee es \
+ fi fo fr \
+ gb gr \
+ hu \
+ ie ir is it \
+ latam \
+ lk lt \
+ mn mt \
+ nl no \
+ pl pt \
+ ro \
+ se sk \
+ tr \
+ us \
+ vn \
+ za
+
+! $thinkpads = thinkpad thinkpad60 thinkpadz60
+
+! $sun = sun_type6_jp sun_type6_usb sun_type6_euro_usb \
+ sun_type6_jp_usb sun_type6_unix_usb sun_type7_jp_usb \
+ sun_type7_usb sun_type7_euro_usb sun_type7_unix_usb
+
+! $sun_jp = sun_type6_jp sun_type6_jp_usb sun_type7_jp_usb
+
+// Sun Type_6_7 keyboards with custom layouts
+! $sun_custom = ara be br ca ch cz de dk \
+ ee es fi fr gb gr it jp \
+ kr lt lv nl no pl pt ro \
+ ru se sk tr tw ua us
+
+! $sun_var = sun_type6 sun_type6_suncompat sun_type6_de sun_type6_fr \
+ sun_type7 sun_type7_suncompat suncompat
+
+! $sun_compat = sun_type6 sun_type6_suncompat sun_type7_suncompat suncompat
+
+! $htcdreamlayouts = us it de
+
+! $inetkbds = acer_c300 acer_ferrari4k acer_laptop \
+ airkey \
+ apple armada azonaRF2300 \
+ benqx brother \
+ btc5113rf btc9000 btc9000a btc9001ah btc5090 btc9019u \
+ cherryblue cherrybluea cherryblueb \
+ cherrycyboard cherrycmexpert \
+ chicony chicony0108 chicony0420 chicony9885 \
+ compalfl90 \
+ compaqeak8 compaqik7 compaqik13 compaqik18 \
+ creativedw7000 \
+ cymotionlinux \
+ dell dellm65 inspiron dellusbmm \
+ emachines ennyah_dkb1008 evdev \
+ genius geniuscomfy2 \
+ gyration honeywell_euroboard \
+ hp250x hp5xx hp500fa hpdv5 \
+ hpi6 hpxe3gc hpxe3gf hpxe4xxx hpxt1000 hpzt11xx htcdream \
+ ibm_spacesaver ipaq inspiron intel \
+ logiaccess logicda logicink \
+ logiex110 logiclx300 \
+ logiinkse logiinkseusb logiitc logiik \
+ logitech_base itouch logiultrax \
+ logitech_g15 \
+ logidinovo logidinovoedge \
+ microsoft4000 microsoft7000 microsoftinet microsoftprousb microsoftprooem microsoftprose \
+ microsoftoffice microsoftmult \
+ mx1998 mx2500 mx2750 \
+ oretec \
+ pc105 \
+ presario propeller \
+ qtronix \
+ rapidaccess rapidaccess2 thinkpad60 \
+ samsung4500 samsung4510 \
+ silvercrest \
+ sk1300 sk2500 sk6200 sk7100 \
+ sven sven303 symplon \
+ toshiba_s3000 trust trustda \
+ unitekkb1925 yahoo \
+ teck227 teck229 \
+ apex300
+
+! $inetmediakbds = acer_ferrari4k acer_laptop btc5090 btc9019u cherryblueb \
+ cherrybluea herrycyboard chicony042 compaqik13 compaqik18 \
+ armada presario dellm65 inspiron dellusbmm diamond \
+ ennyah_dkb1008 genius geniuscomfy2 hpi6 hpxe3gc hpxe3gf \
+ hpxt1000 hpzt11xx hpdv5 hpxe4xxx hp5xx thinkpad60 ogitech_base \
+ logidinovo logidinovoedge logitech_g15 mx1998 mx2500 mx2750 \
+ microsoft4000 microsoft7000 microsoftprooem microsoftmult \
+ propeller samsung4500 samsung4510 sk1300 sk2500 sk7100 \
+ toshiba_s3000 trust trustda cymotionlinux silvercrest \
+ emachines benqx unitekkb1925 creativedw7000 compalfl90 \
+ pc105 a4techKB21 a4techKBS8 a4_rfkb23 asus_laptop btc6301urf \
+ dexxa dtk2000 fscaa1667g geniuskb19e geniuscomfy latitude \
+ microsoftpro precision_m scorpius sp_inet targa_v811 thinkpad \
+ tm2030USB-102 tm2030USB-106 trust_slimline
+
+! $dvoraklayouts = br ca de ee es fr gb no pl se us
+
+! model = keycodes
+ amiga = amiga(de)
+ ataritt = ataritt(de)
+ empty = empty
+ $sun_jp = sun(type6_jp_usb)
+ $sun = sun(type6_usb)
+ pc98 = xfree98(pc98)
+ $applealu = macintosh(alukbd)
+ macintosh_hhk = macintosh(hhk)
+ macintosh_old = macintosh(old)
+ $macs = macintosh
+ thinkpadz60 = xfree86(thinkpadz60)
+ * = xfree86
+
+! layout[1] = keycodes
+ $azerty = +aliases(azerty)
+ $qwertz = +aliases(qwertz)
+ * = +aliases(qwerty)
+
+! layout = keycodes
+ $azerty = +aliases(azerty)
+ $qwertz = +aliases(qwertz)
+ * = +aliases(qwerty)
+
+! option = keycodes
+
+! model layout = geometry
+ thinkpad us = thinkpad(us)
+
+! model = geometry
+ microsoftelite = microsoft(elite)
+ $msmodels = microsoft(natural)
+ dell101 = dell(dell101)
+ dellm65 = dell(dellm65)
+ latitude = dell(latitude)
+ flexpro = keytronic(FlexPro)
+ hp6000 = hp(omnibook)
+ hpmini110 = hp(mini110)
+ hpdv5 = hp(dv5)
+ omnikey101 = northgate(omnikey101)
+ sanwaskbkg3 = sanwa(sanwaskbkg3)
+ $pcmodels = pc(%m)
+ $pcgeometries = pc(%m)
+ everex = everex(STEPnote)
+ thinkpad = thinkpad(intl)
+ thinkpad60 = thinkpad(60)
+ thinkpadz60 = thinkpad(60)
+ apex300 = steelseries(apex300)
+ $tmgeometries = typematrix(%m)
+ winbook = winbook(XP5)
+ pc98 = nec(pc98)
+ $applealu = macintosh(%m)
+ $macbooks = macintosh(%m)
+ $macs = macintosh(macintosh)
+ hhk = hhk(basic)
+ kinesis = kinesis(model100)
+ $nokiamodels = nokia(%m)
+ sun_type6_jp = sun(type6jp)
+ sun_type6_usb = sun(type6)
+ sun_type6_euro_usb = sun(type6tuv)
+ sun_type6_jp_usb = sun(type6jp)
+ sun_type6_unix_usb = sun(type6unix)
+ sun_type7_jp_usb = sun(type6jp)
+ sun_type7_usb = sun(type7)
+ sun_type7_euro_usb = sun(type7tuv)
+ sun_type7_unix_usb = sun(type7unix)
+ * = pc(pc104)
+
+! model layout variant = symbols
+ * ben basic = pc+in(ben)
+ * ben probhat = pc+in(ben_probhat)
+ * dev basic = pc+in(deva)
+ * dvorak $dvoraklayouts = pc+%v(dvorak)
+ * dvorak basic = pc+us(dvorak)
+ * dvorak pl_basic = pc+pl(dvorak)
+ * dvorak pl = pc+pl(dvorak_quotes)
+ * dvorak pl_altquotes = pc+pl(dvorak_altquotes)
+ * dzdwi basic = pc+bt(basic)
+ * fi basic = pc+fi(classic)
+ * ge azerty_tskapo = pc+fr(geo)
+ * guj basic = pc+in(guj)
+ * gur basic = pc+in(guru)
+ * ie laptop = pc+ie(basic)
+ * ie CloGaelachLaptop = pc+ie(CloGaelach)
+ * in urd = pc+in(urd-phonetic)
+ * iu basic = pc+ca(ike)
+ * lo basic = pc+la(basic)
+ * kan basic = pc+in(kan)
+ * mal basic = pc+in(mal)
+ * mal mlplusnum = pc+in(mal)
+ * ogham basic = pc+ie(ogam)
+ * ogham laptop = pc+ie(ogam)
+ * ogham is434 = pc+ie(ogam_is434)
+ * ogham is434laptop = pc+ie(ogam_is434)
+ * ori basic = pc+in(ori)
+ * ro de = pc+ro(winkeys)
+ * ro us = pc+ro(std)
+ * ro academic = pc+ro(std)
+ * ro std_comma = pc+ro(std)
+ * ro comma = pc+ro(basic)
+ * ru os = pc+ru(os_legacy)
+ * pk urd = pc+pk(urd-phonetic)
+ * sapmi basic = pc+no(smi)
+ * sapmi nodeadkeys = pc+no(smi_nodeadkeys)
+ * sapmi sefi = pc+fi(smi)
+ * sin phonetic-static = pc+in(sin_phonetic)
+ * syr basic = pc+sy(syc)
+ * syr phonetic = pc+sy(syc_phonetic)
+ * tam INSCRIPT = pc+in(tam)
+ * tam UNI = pc+in(tam_unicode)
+ * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals)
+ * tam TAB = pc+in(tam_TAB)
+ * tam TSCII = pc+in(tam_TSCII)
+ * tel basic = pc+in(tel)
+ * yu basic = pc+srp(latin)
+ * yu unicode = pc+srp(latinunicode)
+ * yu yz = pc+srp(latinyz)
+ * yu unicodeyz = pc+srp(latinunicodeyz)
+ classmate us intl = pc+us(classmate-intl)
+ classmate us alt-intl = pc+us(classmate-alt-intl)
+ classmate us altgr-intl = pc+us(classmate-altgr-intl)
+ nokiarx51 cz qwerty = nokia_vndr/rx-51(cz_qwerty)
+ * $sun_custom $sun_var = pc+sun_vndr/%l%(v)
+
+! model layout = symbols
+ * ar = pc+ara
+ * ben = pc+in(ben)
+ * bs = pc+ba
+ * cs = pc+rs
+ * cz_qwerty = pc+cz(qwerty)
+ * dev = pc+in(deva)
+ * dvorak = pc+us(dvorak)
+ * dzdwi = pc+bt
+ * el = pc+gr
+ * en_US = pc+latin
+ * guj = pc+in(guj)
+ * gur = pc+in(guru)
+ * iu = pc+ca(ike)
+ * lo = pc+la
+ * kan = pc+in(kan)
+ * mi = pc+mao
+ * ogham = pc+ie(ogam)
+ * ori = pc+ie(ori)
+ * sapmi = pc+no(smi)
+ * sr = pc+srp
+ * syr = pc+sy(syc)
+ * tel = pc+in(tel)
+ * tml = pc+in(tam)
+ * yu = pc+srp
+ * fr-latin9 = pc+fr(latin9)
+ * us_intl = pc+us(alt-intl)
+ * ben(basic) = pc+in(ben)
+ * ben(probhat) = pc+in(ben_probhat)
+ * dev(basic) = pc+in(deva)
+ * dvorak($dvoraklayouts) = pc+%v(dvorak)
+ * dvorak(basic) = pc+us(dvorak)
+ * dvorak(pl_basic) = pc+pl(dvorak)
+ * dvorak(pl) = pc+pl(dvorak_quotes)
+ * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes)
+ * dzdwi(basic) = pc+bt(basic)
+ * fi(basic) = pc+fi(classic)
+ * ge(azerty_tskapo) = pc+fr(geo)
+ * guj(basic) = pc+in(guj)
+ * gur(basic) = pc+in(guru)
+ * ie(laptop) = pc+ie(basic)
+ * ie(CloGaelachLaptop) = pc+ie(CloGaelach)
+ * in(urd) = pc+in(urd-phonetic)
+ * iu(basic) = pc+ca(ike)
+ * lo(basic) = pc+la(basic)
+ * kan(basic) = pc+in(kan)
+ * mal(basic) = pc+in(mal)
+ * mal(mlplusnum) = pc+in(mal)
+ * ogham(basic) = pc+ie(ogam)
+ * ogham(laptop) = pc+ie(ogam)
+ * ogham(is434) = pc+ie(ogam_is434)
+ * ogham(is434laptop) = pc+ie(ogam_is434)
+ * ori(basic) = pc+in(ori)
+ * ro(de) = pc+ro(winkeys)
+ * ro(us) = pc+ro(std)
+ * ro(academic) = pc+ro(std)
+ * ro(std_comma) = pc+ro(std)
+ * ro(comma) = pc+ro(basic)
+ * ru(os) = pc+ru(os_legacy)
+ * pk(urd) = pc+pk(urd-phonetic)
+ * sapmi(basic) = pc+no(smi)
+ * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys)
+ * sapmi(sefi) = pc+fi(smi)
+ * sin(phonetic-static) = pc+in(sin_phonetic)
+ * syr(basic) = pc+sy(syc)
+ * syr(phonetic) = pc+sy(syc_phonetic)
+ * tam(INSCRIPT) = pc+in(tam)
+ * tam(UNI) = pc+in(tam_unicode)
+ * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals)
+ * tam(TAB) = pc+in(tam_TAB)
+ * tam(TSCII) = pc+in(tam_TSCII)
+ * tel(basic) = pc+in(tel)
+ * yu(basic) = pc+srp(latin)
+ * yu(unicode) = pc+srp(latinunicode)
+ * yu(yz) = pc+srp(latinyz)
+ * yu(unicodeyz) = pc+srp(latinunicodeyz)
+ ataritt $nonlatin = xfree68_vndr/ataritt(us)+%l%(v):2
+ ataritt * = xfree68_vndr/ataritt(us)+%l%(v)
+ amiga $nonlatin = xfree68_vndr/amiga(usa1)+%l%(v):2
+ amiga * = xfree68_vndr/amiga(usa1)+%l%(v)
+ classmate us = pc+%l(classmate)
+ empty * = empty(basic)
+ * empty = empty(basic)
+ jollasbj $nonlatin = jolla_vndr/sbj(common)+us+%l%(v):2
+ jollasbj * = jolla_vndr/sbj(common)+%l%(v)
+ $sun $sun_custom = pc+sun_vndr/%l%(v)
+ pc98 nec_vndr/jp = nec_vndr/jp(pc98)
+ macintosh_old us = macintosh_vndr/us(oldmac)
+ macintosh_old en_US = macintosh_vndr/us(oldmac)
+ macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l%(v)
+ macintosh_old $nonlatin = macintosh_vndr/us(oldmac)+%l%(v):2
+ macintosh_old * = macintosh_vndr/us(oldmac)+%l%(v)
+ applealu_jis jp = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)+macintosh_vndr/jp(mac):2
+ applealu_jis * = macintosh_vndr/apple(alukbd)+%l%(v)+macintosh_vndr/jp(mac):2
+ $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l%(v)
+ $applealu * = macintosh_vndr/apple(alukbd)+%l%(v)
+ $macs en_US = pc+macintosh_vndr/us(extended)
+ $macs $macvendorlayouts = pc+macintosh_vndr/%l%(v)
+ nokiarx44 * = nokia_vndr/rx-44(%l)
+ nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty)
+ nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l%_v)
+ nokiasu8w * = nokia_vndr/su-8w(%l)
+ olpc $olpclayouts = olpc+%l%(m)
+ olpc * = olpc+%l%(v)
+ olpcm $olpclayouts = olpc+%l%(m)
+ olpcm * = olpc+%l%(v)
+ $thinkpads br = pc+br(thinkpad)
+ sl-c3x00 * = pc+sharp_vndr/sl-c3x00(basic)
+ ws003sh * = pc+sharp_vndr/ws003sh(basic)
+ ws007sh * = pc+sharp_vndr/ws007sh(basic)
+ ws011sh * = pc+sharp_vndr/ws011sh(basic)
+ ws020sh * = pc+sharp_vndr/ws020sh(basic)
+ htcdream $htcdreamlayouts = %l(htcdream)
+ * $nonlatin = pc+us+%l%(v):2
+ * * = pc+%l%(v)
+
+! model layout[1] = symbols
+ * ar = pc+ara%(v[1])
+ * ben = pc+in(ben)
+ * bs = pc+ba%(v[1])
+ * cs = pc+rs%(v[1])
+ * cz_qwerty = pc+cz(qwerty)
+ * dev = pc+in(deva)
+ * dvorak = pc+us(dvorak)
+ * dzdwi = pc+bt%(v[1])
+ * el = pc+gr%(v[1])
+ * en_US = pc+latin%(v[1])
+ * guj = pc+in(guj)
+ * gur = pc+in(guru)
+ * iu = pc+ca(ike)
+ * lo = pc+la%(v[1])
+ * kan = pc+in(kan)
+ * mi = pc+mao%(v[1])
+ * ogham = pc+ie(ogam)
+ * ori = pc+ie(ori)
+ * sapmi = pc+no(smi)
+ * sr = pc+srp%(v[1])
+ * syr = pc+sy(syc)
+ * tel = pc+in(tel)
+ * tml = pc+in(tam)
+ * yu = pc+srp%(v[1])
+ * fr-latin9 = pc+fr(latin9)
+ * us_intl = pc+us(alt-intl)
+ * ben(basic) = pc+in(ben)
+ * ben(probhat) = pc+in(ben_probhat)
+ * dev(basic) = pc+in(deva)
+ * dvorak($dvoraklayouts) = pc+%v(dvorak)
+ * dvorak(basic) = pc+us(dvorak)
+ * dvorak(pl_basic) = pc+pl(dvorak)
+ * dvorak(pl) = pc+pl(dvorak_quotes)
+ * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes)
+ * dzdwi(basic) = pc+bt(basic)
+ * fi(basic) = pc+fi(classic)
+ * ge(azerty_tskapo) = pc+fr(geo)
+ * guj(basic) = pc+in(guj)
+ * gur(basic) = pc+in(guru)
+ * ie(laptop) = pc+ie(basic)
+ * ie(CloGaelachLaptop) = pc+ie(CloGaelach)
+ * in(urd) = pc+in(urd-phonetic)
+ * iu(basic) = pc+ca(ike)
+ * lo(basic) = pc+la(basic)
+ * kan(basic) = pc+in(kan)
+ * mal(basic) = pc+in(mal)
+ * mal(mlplusnum) = pc+in(mal)
+ * ogham(basic) = pc+ie(ogam)
+ * ogham(laptop) = pc+ie(ogam)
+ * ogham(is434) = pc+ie(ogam_is434)
+ * ogham(is434laptop) = pc+ie(ogam_is434)
+ * ori(basic) = pc+in(ori)
+ * ro(de) = pc+ro(winkeys)
+ * ro(us) = pc+ro(std)
+ * ro(academic) = pc+ro(std)
+ * ro(std_comma) = pc+ro(std)
+ * ro(comma) = pc+ro(basic)
+ * ru(os) = pc+ru(os_legacy)
+ * pk(urd) = pc+pk(urd-phonetic)
+ * sapmi(basic) = pc+no(smi)
+ * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys)
+ * sapmi(sefi) = pc+fi(smi)
+ * sin(phonetic-static) = pc+in(sin_phonetic)
+ * syr(basic) = pc+sy(syc)
+ * syr(phonetic) = pc+sy(syc_phonetic)
+ * tam(INSCRIPT) = pc+in(tam)
+ * tam(UNI) = pc+in(tam_unicode)
+ * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals)
+ * tam(TAB) = pc+in(tam_TAB)
+ * tam(TSCII) = pc+in(tam_TSCII)
+ * tel(basic) = pc+in(tel)
+ * yu(basic) = pc+srp(latin)
+ * yu(unicode) = pc+srp(latinunicode)
+ * yu(yz) = pc+srp(latinyz)
+ * yu(unicodeyz) = pc+srp(latinunicodeyz)
+ ataritt * = xfree68_vndr/ataritt(us)+%l[1]%(v[1])
+ amiga * = xfree68_vndr/amiga(usa1)+%l[1]%(v[1])
+ jollasbj * = jolla_vndr/sbj(common)+%l[1]%(v[1])
+ $sun $sun_custom = pc+sun_vndr/%l[1]%(v[1])
+ macintosh_old us = macintosh_vndr/us(oldmac)
+ macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l[1]%(v[1])
+ macintosh_old * = macintosh_vndr/us(oldmac)+%l[1]%(v[1])
+ applealu_jis us = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)
+ $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l[1]%(v[1])
+ $applealu * = macintosh_vndr/apple(alukbd)+%l[1]%(v[1])
+ $macs $macvendorlayouts = pc+macintosh_vndr/%l[1]%(v[1])
+ nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty)
+ nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l[1]%_v[1])
+ $thinkpads br = pc+%l[1](thinkpad)
+ * * = pc+%l[1]%(v[1])
+
+! model layout[1] variant[1] = symbols
+ * ben basic = pc+in(ben)
+ * ben probhat = pc+in(ben_probhat)
+ * dev basic = pc+in(deva)
+ * dvorak $dvoraklayouts = pc+%v(dvorak)
+ * dvorak basic = pc+us(dvorak)
+ * dvorak pl_basic = pc+pl(dvorak)
+ * dvorak pl = pc+pl(dvorak_quotes)
+ * dvorak pl_altquotes = pc+pl(dvorak_altquotes)
+ * dzdwi basic = pc+bt(basic)
+ * fi basic = pc+fi(classic)
+ * ge azerty_tskapo = pc+fr(geo)
+ * guj basic = pc+in(guj)
+ * gur basic = pc+in(guru)
+ * ie laptop = pc+ie(basic)
+ * ie CloGaelachLaptop = pc+ie(CloGaelach)
+ * in urd = pc+in(urd-phonetic)
+ * iu basic = pc+ca(ike)
+ * lo basic = pc+la(basic)
+ * kan basic = pc+in(kan)
+ * mal basic = pc+in(mal)
+ * mal mlplusnum = pc+in(mal)
+ * ogham basic = pc+ie(ogam)
+ * ogham laptop = pc+ie(ogam)
+ * ogham is434 = pc+ie(ogam_is434)
+ * ogham is434laptop = pc+ie(ogam_is434)
+ * ori basic = pc+in(ori)
+ * ro de = pc+ro(winkeys)
+ * ro us = pc+ro(std)
+ * ro academic = pc+ro(std)
+ * ro std_comma = pc+ro(std)
+ * ro comma = pc+ro(basic)
+ * ru os = pc+ru(os_legacy)
+ * pk urd = pc+pk(urd-phonetic)
+ * sapmi basic = pc+no(smi)
+ * sapmi nodeadkeys = pc+no(smi_nodeadkeys)
+ * sapmi sefi = pc+fi(smi)
+ * sin phonetic-static = pc+in(sin_phonetic)
+ * syr basic = pc+sy(syc)
+ * syr phonetic = pc+sy(syc_phonetic)
+ * tam INSCRIPT = pc+in(tam)
+ * tam UNI = pc+in(tam_unicode)
+ * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals)
+ * tam TAB = pc+in(tam_TAB)
+ * tam TSCII = pc+in(tam_TSCII)
+ * tel basic = pc+in(tel)
+ * yu basic = pc+srp(latin)
+ * yu unicode = pc+srp(latinunicode)
+ * yu yz = pc+srp(latinyz)
+ * yu unicodeyz = pc+srp(latinunicodeyz)
+
+! model layout[2] = symbols
+ * ar = +ara%(v[2]):2
+ * ben = +in(ben):2
+ * bs = +ba%(v[2]):2
+ * cs = +rs%(v[2]):2
+ * cz_qwerty = +cz(qwerty):2
+ * dev = +in(deva):2
+ * dvorak = +us(dvorak):2
+ * dzdwi = +bt%(v[2]):2
+ * el = +gr%(v[2]):2
+ * en_US = +latin%(v[2]):2
+ * guj = +in(guj):2
+ * gur = +in(guru):2
+ * iu = +ca(ike):2
+ * lo = +la%(v[2]):2
+ * kan = +in(kan):2
+ * mi = +mao%(v[2]):2
+ * ogham = +ie(ogam):2
+ * ori = +ie(ori):2
+ * sapmi = +no(smi):2
+ * sr = +srp%(v[2]):2
+ * syr = +sy(syc):2
+ * tel = +in(tel):2
+ * tml = +in(tam):2
+ * yu = +srp%(v[2]):2
+ * fr-latin9 = +fr(latin9):2
+ * us_intl = +us(alt-intl):2
+ * ben(basic) = +in(ben):2
+ * ben(probhat) = +in(ben_probhat):2
+ * dev(basic) = +in(deva):2
+ * dvorak($dvoraklayouts) = +%v(dvorak):2
+ * dvorak(basic) = +us(dvorak):2
+ * dvorak(pl_basic) = +pl(dvorak):2
+ * dvorak(pl) = +pl(dvorak_quotes):2
+ * dvorak(pl_altquotes) = +pl(dvorak_altquotes):2
+ * dzdwi(basic) = +bt(basic):2
+ * fi(basic) = +fi(classic):2
+ * ge(azerty_tskapo) = +fr(geo):2
+ * guj(basic) = +in(guj):2
+ * gur(basic) = +in(guru):2
+ * ie(laptop) = +ie(basic):2
+ * ie(CloGaelachLaptop) = +ie(CloGaelach):2
+ * in(urd) = +in(urd-phonetic):2
+ * iu(basic) = +ca(ike):2
+ * lo(basic) = +la(basic):2
+ * kan(basic) = +in(kan):2
+ * mal(basic) = +in(mal):2
+ * mal(mlplusnum) = +in(mal):2
+ * ogham(basic) = +ie(ogam):2
+ * ogham(laptop) = +ie(ogam):2
+ * ogham(is434) = +ie(ogam_is434):2
+ * ogham(is434laptop) = +ie(ogam_is434):2
+ * ori(basic) = +in(ori):2
+ * ro(de) = +ro(winkeys):2
+ * ro(us) = +ro(std):2
+ * ro(academic) = +ro(std):2
+ * ro(std_comma) = +ro(std):2
+ * ro(comma) = +ro(basic):2
+ * ru(os) = +ru(os_legacy):2
+ * pk(urd) = +pk(urd-phonetic):2
+ * sapmi(basic) = +no(smi):2
+ * sapmi(nodeadkeys) = +no(smi_nodeadkeys):2
+ * sapmi(sefi) = +fi(smi):2
+ * sin(phonetic-static) = +in(sin_phonetic):2
+ * syr(basic) = +sy(syc):2
+ * syr(phonetic) = +sy(syc_phonetic):2
+ * tam(INSCRIPT) = +in(tam):2
+ * tam(UNI) = +in(tam_unicode):2
+ * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):2
+ * tam(TAB) = +in(tam_TAB):2
+ * tam(TSCII) = +in(tam_TSCII):2
+ * tel(basic) = +in(tel):2
+ * yu(basic) = +srp(latin):2
+ * yu(unicode) = +srp(latinunicode):2
+ * yu(yz) = +srp(latinyz):2
+ * yu(unicodeyz) = +srp(latinunicodeyz):2
+ nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):2
+ nokiarx51 * = +nokia_vndr/rx-51(%l[2]%_v[2]):2
+ $sun $sun_custom = +sun_vndr/%l[2]%(v[2]):2
+ * * = +%l[2]%(v[2]):2
+
+! model layout[3] = symbols
+ * ar = +ara%(v[3]):3
+ * ben = +in(ben):3
+ * bs = +ba%(v[3]):3
+ * cs = +rs%(v[3]):3
+ * cz_qwerty = +cz(qwerty):3
+ * dev = +in(deva):3
+ * dvorak = +us(dvorak):3
+ * dzdwi = +bt%(v[3]):3
+ * el = +gr%(v[3]):3
+ * en_US = +latin%(v[3]):3
+ * guj = +in(guj):3
+ * gur = +in(guru):3
+ * iu = +ca(ike):3
+ * lo = +la%(v[3]):3
+ * kan = +in(kan):3
+ * mi = +mao%(v[3]):3
+ * ogham = +ie(ogam):3
+ * ori = +ie(ori):3
+ * sapmi = +no(smi):3
+ * sr = +srp%(v[3]):3
+ * syr = +sy(syc):3
+ * tel = +in(tel):3
+ * tml = +in(tam):3
+ * yu = +srp%(v[3]):3
+ * fr-latin9 = +fr(latin9):3
+ * us_intl = +us(alt-intl):3
+ * ben(basic) = +in(ben):3
+ * ben(probhat) = +in(ben_probhat):3
+ * dev(basic) = +in(deva):3
+ * dvorak($dvoraklayouts) = +%v(dvorak):3
+ * dvorak(basic) = +us(dvorak):3
+ * dvorak(pl_basic) = +pl(dvorak):3
+ * dvorak(pl) = +pl(dvorak_quotes):3
+ * dvorak(pl_altquotes) = +pl(dvorak_altquotes):3
+ * dzdwi(basic) = +bt(basic):3
+ * fi(basic) = +fi(classic):3
+ * ge(azerty_tskapo) = +fr(geo):3
+ * guj(basic) = +in(guj):3
+ * gur(basic) = +in(guru):3
+ * ie(laptop) = +ie(basic):3
+ * ie(CloGaelachLaptop) = +ie(CloGaelach):3
+ * in(urd) = +in(urd-phonetic):3
+ * iu(basic) = +ca(ike):3
+ * lo(basic) = +la(basic):3
+ * kan(basic) = +in(kan):3
+ * mal(basic) = +in(mal):3
+ * mal(mlplusnum) = +in(mal):3
+ * ogham(basic) = +ie(ogam):3
+ * ogham(laptop) = +ie(ogam):3
+ * ogham(is434) = +ie(ogam_is434):3
+ * ogham(is434laptop) = +ie(ogam_is434):3
+ * ori(basic) = +in(ori):3
+ * ro(de) = +ro(winkeys):3
+ * ro(us) = +ro(std):3
+ * ro(academic) = +ro(std):3
+ * ro(std_comma) = +ro(std):3
+ * ro(comma) = +ro(basic):3
+ * ru(os) = +ru(os_legacy):3
+ * pk(urd) = +pk(urd-phonetic):3
+ * sapmi(basic) = +no(smi):3
+ * sapmi(nodeadkeys) = +no(smi_nodeadkeys):3
+ * sapmi(sefi) = +fi(smi):3
+ * sin(phonetic-static) = +in(sin_phonetic):3
+ * syr(basic) = +sy(syc):3
+ * syr(phonetic) = +sy(syc_phonetic):3
+ * tam(INSCRIPT) = +in(tam):3
+ * tam(UNI) = +in(tam_unicode):3
+ * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):3
+ * tam(TAB) = +in(tam_TAB):3
+ * tam(TSCII) = +in(tam_TSCII):3
+ * tel(basic) = +in(tel):3
+ * yu(basic) = +srp(latin):3
+ * yu(unicode) = +srp(latinunicode):3
+ * yu(yz) = +srp(latinyz):3
+ * yu(unicodeyz) = +srp(latinunicodeyz):3
+ nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):3
+ nokiarx51 * = +nokia_vndr/rx-51(%l[3]%_v[3]):3
+ $sun $sun_custom = +sun_vndr/%l[3]%(v[3]):3
+ * * = +%l[3]%(v[3]):3
+
+! model layout[4] = symbols
+ * ar = +ara%(v[4]):4
+ * ben = +in(ben):4
+ * bs = +ba%(v[4]):4
+ * cs = +rs%(v[4]):4
+ * cz_qwerty = +cz(qwerty):4
+ * dev = +in(deva):4
+ * dvorak = +us(dvorak):4
+ * dzdwi = +bt%(v[4]):4
+ * el = +gr%(v[4]):4
+ * en_US = +latin%(v[4]):4
+ * guj = +in(guj):4
+ * gur = +in(guru):4
+ * iu = +ca(ike):4
+ * lo = +la%(v[4]):4
+ * kan = +in(kan):4
+ * mi = +mao%(v[4]):4
+ * ogham = +ie(ogam):4
+ * ori = +ie(ori):4
+ * sapmi = +no(smi):4
+ * sr = +srp%(v[4]):4
+ * syr = +sy(syc):4
+ * tel = +in(tel):4
+ * tml = +in(tam):4
+ * yu = +srp%(v[4]):4
+ * fr-latin9 = +fr(latin9):4
+ * us_intl = +us(alt-intl):4
+ * ben(basic) = +in(ben):4
+ * ben(probhat) = +in(ben_probhat):4
+ * dev(basic) = +in(deva):4
+ * dvorak($dvoraklayouts) = +%v(dvorak):4
+ * dvorak(basic) = +us(dvorak):4
+ * dvorak(pl_basic) = +pl(dvorak):4
+ * dvorak(pl) = +pl(dvorak_quotes):4
+ * dvorak(pl_altquotes) = +pl(dvorak_altquotes):4
+ * dzdwi(basic) = +bt(basic):4
+ * fi(basic) = +fi(classic):4
+ * ge(azerty_tskapo) = +fr(geo):4
+ * guj(basic) = +in(guj):4
+ * gur(basic) = +in(guru):4
+ * ie(laptop) = +ie(basic):4
+ * ie(CloGaelachLaptop) = +ie(CloGaelach):4
+ * in(urd) = +in(urd-phonetic):4
+ * iu(basic) = +ca(ike):4
+ * lo(basic) = +la(basic):4
+ * kan(basic) = +in(kan):4
+ * mal(basic) = +in(mal):4
+ * mal(mlplusnum) = +in(mal):4
+ * ogham(basic) = +ie(ogam):4
+ * ogham(laptop) = +ie(ogam):4
+ * ogham(is434) = +ie(ogam_is434):4
+ * ogham(is434laptop) = +ie(ogam_is434):4
+ * ori(basic) = +in(ori):4
+ * ro(de) = +ro(winkeys):4
+ * ro(us) = +ro(std):4
+ * ro(academic) = +ro(std):4
+ * ro(std_comma) = +ro(std):4
+ * ro(comma) = +ro(basic):4
+ * ru(os) = +ru(os_legacy):4
+ * pk(urd) = +pk(urd-phonetic):4
+ * sapmi(basic) = +no(smi):4
+ * sapmi(nodeadkeys) = +no(smi_nodeadkeys):4
+ * sapmi(sefi) = +fi(smi):4
+ * sin(phonetic-static) = +in(sin_phonetic):4
+ * syr(basic) = +sy(syc):4
+ * syr(phonetic) = +sy(syc_phonetic):4
+ * tam(INSCRIPT) = +in(tam):4
+ * tam(UNI) = +in(tam_unicode):4
+ * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):4
+ * tam(TAB) = +in(tam_TAB):4
+ * tam(TSCII) = +in(tam_TSCII):4
+ * tel(basic) = +in(tel):4
+ * yu(basic) = +srp(latin):4
+ * yu(unicode) = +srp(latinunicode):4
+ * yu(yz) = +srp(latinyz):4
+ * yu(unicodeyz) = +srp(latinunicodeyz):4
+ nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):4
+ nokiarx51 * = +nokia_vndr/rx-51(%l[4]%_v[4]):4
+ $sun $sun_custom = +sun_vndr/%l[4]%(v[4]):4
+ * * = +%l[4]%(v[4]):4
+
+! model layout[2] variant[2] = symbols
+ * ben basic = +in(ben):2
+ * ben probhat = +in(ben_probhat):2
+ * dev basic = +in(deva):2
+ * dvorak $dvoraklayouts = +%v(dvorak):2
+ * dvorak basic = +us(dvorak):2
+ * dvorak pl_basic = +pl(dvorak):2
+ * dvorak pl = +pl(dvorak_quotes):2
+ * dvorak pl_altquotes = +pl(dvorak_altquotes):2
+ * dzdwi basic = +bt(basic):2
+ * fi basic = +fi(classic):2
+ * ge azerty_tskapo = +fr(geo):2
+ * guj basic = +in(guj):2
+ * gur basic = +in(guru):2
+ * ie laptop = +ie(basic):2
+ * ie CloGaelachLaptop = +ie(CloGaelach):2
+ * in urd = +in(urd-phonetic):2
+ * iu basic = +ca(ike):2
+ * lo basic = +la(basic):2
+ * kan basic = +in(kan):2
+ * mal basic = +in(mal):2
+ * mal mlplusnum = +in(mal):2
+ * ogham basic = +ie(ogam):2
+ * ogham laptop = +ie(ogam):2
+ * ogham is434 = +ie(ogam_is434):2
+ * ogham is434laptop = +ie(ogam_is434):2
+ * ori basic = +in(ori):2
+ * ro de = +ro(winkeys):2
+ * ro us = +ro(std):2
+ * ro academic = +ro(std):2
+ * ro std_comma = +ro(std):2
+ * ro comma = +ro(basic):2
+ * ru os = +ru(os_legacy):2
+ * pk urd = +pk(urd-phonetic):2
+ * sapmi basic = +no(smi):2
+ * sapmi nodeadkeys = +no(smi_nodeadkeys):2
+ * sapmi sefi = +fi(smi):2
+ * sin phonetic-static = +in(sin_phonetic):2
+ * syr basic = +sy(syc):2
+ * syr phonetic = +sy(syc_phonetic):2
+ * tam INSCRIPT = +in(tam):2
+ * tam UNI = +in(tam_unicode):2
+ * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):2
+ * tam TAB = +in(tam_TAB):2
+ * tam TSCII = +in(tam_TSCII):2
+ * tel basic = +in(tel):2
+ * yu basic = +srp(latin):2
+ * yu unicode = +srp(latinunicode):2
+ * yu yz = +srp(latinyz):2
+ * yu unicodeyz = +srp(latinunicodeyz):2
+
+! model layout[3] variant[3] = symbols
+ * ben basic = +in(ben):3
+ * ben probhat = +in(ben_probhat):3
+ * dev basic = +in(deva):3
+ * dvorak $dvoraklayouts = +%v(dvorak):3
+ * dvorak basic = +us(dvorak):3
+ * dvorak pl_basic = +pl(dvorak):3
+ * dvorak pl = +pl(dvorak_quotes):3
+ * dvorak pl_altquotes = +pl(dvorak_altquotes):3
+ * dzdwi basic = +bt(basic):3
+ * fi basic = +fi(classic):3
+ * ge azerty_tskapo = +fr(geo):3
+ * guj basic = +in(guj):3
+ * gur basic = +in(guru):3
+ * ie laptop = +ie(basic):3
+ * ie CloGaelachLaptop = +ie(CloGaelach):3
+ * in urd = +in(urd-phonetic):3
+ * iu basic = +ca(ike):3
+ * lo basic = +la(basic):3
+ * kan basic = +in(kan):3
+ * mal basic = +in(mal):3
+ * mal mlplusnum = +in(mal):3
+ * ogham basic = +ie(ogam):3
+ * ogham laptop = +ie(ogam):3
+ * ogham is434 = +ie(ogam_is434):3
+ * ogham is434laptop = +ie(ogam_is434):3
+ * ori basic = +in(ori):3
+ * ro de = +ro(winkeys):3
+ * ro us = +ro(std):3
+ * ro academic = +ro(std):3
+ * ro std_comma = +ro(std):3
+ * ro comma = +ro(basic):3
+ * ru os = +ru(os_legacy):3
+ * pk urd = +pk(urd-phonetic):3
+ * sapmi basic = +no(smi):3
+ * sapmi nodeadkeys = +no(smi_nodeadkeys):3
+ * sapmi sefi = +fi(smi):3
+ * sin phonetic-static = +in(sin_phonetic):3
+ * syr basic = +sy(syc):3
+ * syr phonetic = +sy(syc_phonetic):3
+ * tam INSCRIPT = +in(tam):3
+ * tam UNI = +in(tam_unicode):3
+ * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):3
+ * tam TAB = +in(tam_TAB):3
+ * tam TSCII = +in(tam_TSCII):3
+ * tel basic = +in(tel):3
+ * yu basic = +srp(latin):3
+ * yu unicode = +srp(latinunicode):3
+ * yu yz = +srp(latinyz):3
+ * yu unicodeyz = +srp(latinunicodeyz):3
+
+! model layout[4] variant[4] = symbols
+ * ben basic = +in(ben):4
+ * ben probhat = +in(ben_probhat):4
+ * dev basic = +in(deva):4
+ * dvorak $dvoraklayouts = +%v(dvorak):4
+ * dvorak basic = +us(dvorak):4
+ * dvorak pl_basic = +pl(dvorak):4
+ * dvorak pl = +pl(dvorak_quotes):4
+ * dvorak pl_altquotes = +pl(dvorak_altquotes):4
+ * dzdwi basic = +bt(basic):4
+ * fi basic = +fi(classic):4
+ * ge azerty_tskapo = +fr(geo):4
+ * guj basic = +in(guj):4
+ * gur basic = +in(guru):4
+ * ie laptop = +ie(basic):4
+ * ie CloGaelachLaptop = +ie(CloGaelach):4
+ * in urd = +in(urd-phonetic):4
+ * iu basic = +ca(ike):4
+ * lo basic = +la(basic):4
+ * kan basic = +in(kan):4
+ * mal basic = +in(mal):4
+ * mal mlplusnum = +in(mal):4
+ * ogham basic = +ie(ogam):4
+ * ogham laptop = +ie(ogam):4
+ * ogham is434 = +ie(ogam_is434):4
+ * ogham is434laptop = +ie(ogam_is434):4
+ * ori basic = +in(ori):4
+ * ro de = +ro(winkeys):4
+ * ro us = +ro(std):4
+ * ro academic = +ro(std):4
+ * ro std_comma = +ro(std):4
+ * ro comma = +ro(basic):4
+ * ru os = +ru(os_legacy):4
+ * pk urd = +pk(urd-phonetic):4
+ * sapmi basic = +no(smi):4
+ * sapmi nodeadkeys = +no(smi_nodeadkeys):4
+ * sapmi sefi = +fi(smi):4
+ * sin phonetic-static = +in(sin_phonetic):4
+ * syr basic = +sy(syc):4
+ * syr phonetic = +sy(syc_phonetic):4
+ * tam INSCRIPT = +in(tam):4
+ * tam UNI = +in(tam_unicode):4
+ * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):4
+ * tam TAB = +in(tam_TAB):4
+ * tam TSCII = +in(tam_TSCII):4
+ * tel basic = +in(tel):4
+ * yu basic = +srp(latin):4
+ * yu unicode = +srp(latinunicode):4
+ * yu yz = +srp(latinyz):4
+ * yu unicodeyz = +srp(latinunicodeyz):4
+
+! model = symbols
+ a4techKB21 = +inet(media_nav_common)
+ a4techKBS8 = +inet(media_nav_acpi_common)
+ a4_rfkb23 = +inet(media_nav_acpi_common)
+ asus_laptop = +inet(media_common)
+ acer_tm_800 = +inet(acer_laptop)
+ benqx730 = +inet(benqx)
+ benqx800 = +inet(benqx)
+ btc5126t = +inet(nav_acpi_common)
+ btc9116u = +inet(btc9019u)
+ btc6301urf = +inet(media_nav_acpi_common)
+ chromebook = +inet(chromebook)
+ dellsk8125 = +inet(dell)
+ dellsk8135 = +inet(dell)
+ cherrybunlim = +inet(nav_common)
+ dexxa = +inet(media_nav_common)
+ dtk2000 = +inet(media_nav_acpi_common)
+ fscaa1667g = +inet(media_nav_common)
+ geniuskb19e = +inet(media_nav_acpi_common)
+ geniuscomfy = +inet(media_nav_acpi_common)
+ geniuskkb2050hs = +inet(dellusbmm)
+ hpnx9020 = +inet(hpi6)
+ latitude = +inet(media_common)
+ logicd = +inet(logitech_base)
+ logicd_it = +inet(logitech_base)
+ logicd_nav = +inet(logitech_base)
+ logicd_opt = +inet(logitech_base)
+ logiultrax = +inet(logitech_base)
+ logiclx300 = +inet(logiex110)
+ logii350 = +inet(logiex110)
+ logimel = +inet(logiex110)
+ logicdit = +inet(logicd)
+ logicdo = +inet(logicd)
+ logicdp = +inet(logicd)
+ logicdpa = +inet(logicda)
+ logiciink = +inet(logicink)
+ ltcd = +inet(logicda)
+ microsoftccurve2k = +inet(microsoftprooem)
+ microsoftpro = +inet(media_nav_acpi_common)
+ precision_m = +inet(media_nav_common)
+ scorpius = +inet(media_nav_acpi_common)
+ sp_inet = +inet(media_nav_acpi_common)
+ targa_v811 = +inet(media_nav_acpi_common)
+ thinkpad = +inet(media_nav_common)
+ thinkpadz60 = +inet(thinkpad60)
+ tm2030USB-102 = +inet(media_nav_acpi_common)
+ tm2030USB-106 = +inet(media_nav_acpi_common)
+ trust_slimline = +inet(media_nav_acpi_common)
+ vsonku306 = +inet(microsoftprooem)
+ $inetkbds = +inet(%m)
+ $maclaptop = +inet(apple)+level3(enter_switch)
+ $applealu = +inet(apple)
+ $macs = +inet(apple)
+ sun_type7_jp_usb = +sun_vndr/solaris(defaults_type7jp)
+ $sun = +sun_vndr/solaris(defaults)
+
+! model layout = symbols
+ $inetmediakbds jp = +jp(henkan)
+
+! layout variant = compat
+ de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de adnw = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de koy = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de bone = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de bone_eszett_home = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de neo_qwertz = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de neo_qwerty = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ jp $sun_compat = complete+japan(kana_lock)
+
+! layout[1] variant[1] = compat
+ de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de adnw = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de koy = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de bone = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de bone_eszett_home = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de neo_qwertz = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de neo_qwerty = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ jp $sun_compat = complete+japan(kana_lock)
+
+! layout[2] variant[2] = compat
+ de neo = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de adnw = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de koy = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de bone = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de bone_eszett_home = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de neo_qwertz = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de neo_qwerty = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ jp $sun_compat = +complete+japan(kana_lock):2
+
+! layout[3] variant[3] = compat
+ de neo = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de adnw = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de koy = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de bone = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de bone_eszett_home = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de neo_qwertz = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de neo_qwerty = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ jp $sun_compat = +complete+japan(kana_lock):3
+
+! layout[4] variant[4] = compat
+ de neo = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de adnw = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de koy = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de bone = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de bone_eszett_home = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de neo_qwertz = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de neo_qwerty = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ jp $sun_compat = +complete+japan(kana_lock):4
+
+! model layout = compat
+ pc98 nec_vndr/jp = pc98(basic)
+ * jp = complete+japan
+ olpc * = olpc
+ olpcm * = olpc
+ * * = complete
+
+! model layout[1] = compat
+ * * = complete
+
+! model = types
+ $macs = complete+numpad(mac)
+ $applealu = complete+numpad(mac)
+ $nokiamodels = complete+nokia
+ * = complete
+
+! layout option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle)
+ * misc:typo = +typo(base)
+
+! layout[1] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):1
+ * misc:typo = +typo(base):1
+
+! layout[2] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):2
+ * misc:typo = +typo(base):2
+
+! layout[3] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):3
+ * misc:typo = +typo(base):3
+
+! layout[4] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):4
+ * misc:typo = +typo(base):4
+
+! option = symbols
+ grp:shift_toggle = +group(shifts_toggle)
+ altwin:menu = +altwin(menu)
+ altwin:meta_alt = +altwin(meta_alt)
+ altwin:alt_win = +altwin(alt_win)
+ altwin:ctrl_win = +altwin(ctrl_win)
+ altwin:ctrl_alt_win = +altwin(ctrl_alt_win)
+ altwin:meta_win = +altwin(meta_win)
+ altwin:left_meta_win = +altwin(left_meta_win)
+ altwin:hyper_win = +altwin(hyper_win)
+ altwin:alt_super_win = +altwin(alt_super_win)
+ altwin:swap_lalt_lwin = +altwin(swap_lalt_lwin)
+ altwin:swap_alt_win = +altwin(swap_alt_win)
+ altwin:prtsc_rwin = +altwin(prtsc_rwin)
+ grab:debug = +srvr_ctrl(grab_debug)
+ grp:switch = +group(switch)
+ grp:lswitch = +group(lswitch)
+ grp:win_switch = +group(win_switch)
+ grp:lwin_switch = +group(lwin_switch)
+ grp:rwin_switch = +group(rwin_switch)
+ grp:menu_switch = +group(menu_switch)
+ grp:toggle = +group(toggle)
+ grp:shifts_toggle = +group(shifts_toggle)
+ grp:ctrls_toggle = +group(ctrls_toggle)
+ grp:alts_toggle = +group(alts_toggle)
+ grp:caps_toggle = +capslock(grouplock)
+ grp:caps_switch = +capslock(groupshift)
+ grp:shift_caps_toggle = +group(shift_caps_toggle)
+ grp:shift_caps_switch = +group(shift_caps_switch)
+ grp:win_space_toggle = +group(win_space_toggle)
+ grp:win_menu_switch = +group(win_menu_switch)
+ grp:alt_caps_toggle = +group(alt_caps_toggle)
+ grp:alt_space_toggle = +group(alt_space_toggle)
+ grp:menu_toggle = +group(menu_toggle)
+ grp:lwin_toggle = +group(lwin_toggle)
+ grp:rwin_toggle = +group(rwin_toggle)
+ grp:lshift_toggle = +group(lshift_toggle)
+ grp:rshift_toggle = +group(rshift_toggle)
+ grp:rctrl_switch = +group(rctrl_switch)
+ grp:lctrl_toggle = +group(lctrl_toggle)
+ grp:rctrl_toggle = +group(rctrl_toggle)
+ grp:lalt_toggle = +group(lalt_toggle)
+ grp:sclk_toggle = +group(sclk_toggle)
+ grp:lctrl_rctrl_switch = +group(lctrl_rctrl_switch)
+ grp:lctrl_lwin_rctrl_menu = +group(lctrl_lwin_rctrl_menu)
+ grp:lctrl_lalt_toggle = +group(lctrl_lalt_toggle)
+ grp:rctrl_ralt_toggle = +group(rctrl_ralt_toggle)
+ grp:ctrl_alt_toggle = +group(ctrl_alt_toggle)
+ grp:ctrl_alt_toggle_bidir = +group(ctrl_alt_toggle_bidir)
+ grp:lctrl_lshift_toggle = +group(lctrl_lshift_toggle)
+ grp:rctrl_rshift_toggle = +group(rctrl_rshift_toggle)
+ grp:ctrl_shift_toggle = +group(ctrl_shift_toggle)
+ grp:ctrl_shift_toggle_bidir = +group(ctrl_shift_toggle_bidir)
+ grp:lalt_lshift_toggle = +group(lalt_lshift_toggle)
+ grp:ralt_rshift_toggle = +group(ralt_rshift_toggle)
+ grp:alt_shift_toggle = +group(alt_shift_toggle)
+ grp:alt_shift_toggle_bidir = +group(alt_shift_toggle_bidir)
+ grp:lctrl_lwin_toggle = +group(lctrl_lwin_toggle)
+ lv3:switch = +level3(switch)
+ lv3:ralt_switch = +level3(ralt_switch)
+ lv3:ralt_switch_multikey = +level3(ralt_switch_multikey)
+ lv3:ralt_alt = +level3(ralt_alt)
+ lv3:lalt_switch = +level3(lalt_switch)
+ lv3:alt_switch = +level3(alt_switch)
+ lv3:menu_switch = +level3(menu_switch)
+ lv3:win_switch = +level3(win_switch)
+ lv3:lwin_switch = +level3(lwin_switch)
+ lv3:rwin_switch = +level3(rwin_switch)
+ lv3:enter_switch = +level3(enter_switch)
+ caps:capslock = +capslock(capslock)
+ caps:numlock = +capslock(numlock)
+ caps:shiftlock = +capslock(shiftlock)
+ caps:swapescape = +capslock(swapescape)
+ caps:escape = +capslock(escape)
+ caps:backspace = +capslock(backspace)
+ caps:super = +capslock(super)
+ caps:hyper = +capslock(hyper)
+ caps:menu = +capslock(menu)
+ caps:none = +capslock(none)
+ caps:ctrl_modifier = +capslock(ctrl_modifier)
+ ctrl:nocaps = +ctrl(nocaps)
+ ctrl:lctrl_meta = +ctrl(lctrl_meta)
+ ctrl:swapcaps = +ctrl(swapcaps)
+ ctrl:ac_ctrl = +ctrl(ac_ctrl)
+ ctrl:aa_ctrl = +ctrl(aa_ctrl)
+ ctrl:rctrl_ralt = +ctrl(rctrl_ralt)
+ ctrl:menu_rctrl = +ctrl(menu_rctrl)
+ ctrl:ralt_rctrl = +ctrl(ralt_rctrl)
+ ctrl:swap_lalt_lctl = +ctrl(swap_lalt_lctl)
+ ctrl:swap_lwin_lctl = +ctrl(swap_lwin_lctl)
+ ctrl:swap_rwin_rctl = +ctrl(swap_rwin_rctl)
+ ctrl:swap_lalt_lctl_lwin = +ctrl(swap_lalt_lctl_lwin)
+ compose:ralt = +compose(ralt)
+ compose:lwin = +compose(lwin)
+ compose:lwin-altgr = +compose(lwin-altgr)
+ compose:rwin = +compose(rwin)
+ compose:rwin-altgr = +compose(rwin-altgr)
+ compose:menu = +compose(menu)
+ compose:menu-altgr = +compose(menu-altgr)
+ compose:lctrl = +compose(lctrl)
+ compose:lctrl-altgr = +compose(lctrl-altgr)
+ compose:rctrl = +compose(rctrl)
+ compose:rctrl-altgr = +compose(rctrl-altgr)
+ compose:caps = +compose(caps)
+ compose:caps-altgr = +compose(caps-altgr)
+ compose:102 = +compose(102)
+ compose:102-altgr = +compose(102-altgr)
+ compose:paus = +compose(paus)
+ compose:prsc = +compose(prsc)
+ compose:sclk = +compose(sclk)
+ srvrkeys:none = +srvr_ctrl(no_srvr_keys)
+ eurosign:e = +eurosign(e)
+ eurosign:2 = +eurosign(2)
+ eurosign:4 = +eurosign(4)
+ eurosign:5 = +eurosign(5)
+ rupeesign:4 = +rupeesign(4)
+ keypad:oss = +keypad(oss)
+ keypad:legacy = +keypad(legacy)
+ keypad:legacy_wang = +keypad(legacy_wang)
+ keypad:oss_wang = +keypad(oss_wang)
+ keypad:future = +keypad(future)
+ keypad:future_wang = +keypad(future_wang)
+ keypad:hex = +keypad(ops)+keypad(hex)
+ keypad:atm = +keypad(ops)+keypad(hex)+keypad(atm)
+ nbsp:none = +nbsp(none)
+ nbsp:level2 = +nbsp(level2)
+ nbsp:level3 = +nbsp(level3)
+ nbsp:level3s = +nbsp(level3s)
+ nbsp:level3n = +nbsp(level3n)
+ nbsp:level4 = +nbsp(level4)
+ nbsp:level4n = +nbsp(level4n)
+ nbsp:level4nl = +nbsp(level4nl)
+ japan:nicola_f_bs = +jp(nicola_f_bs)
+ japan:hztg_escape = +jp(hztg_escape)
+ korean:ralt_rctrl = +kr(ralt_hangul)+kr(rctrl_hanja)
+ korean:rctrl_ralt = +kr(rctrl_hangul)+kr(ralt_hanja)
+ kpdl:dot = +kpdl(dot)
+ kpdl:comma = +kpdl(comma)
+ kpdl:dotoss = +kpdl(dotoss)
+ kpdl:dotoss_latin9 = +kpdl(dotoss_latin9)
+ kpdl:commaoss = +kpdl(commaoss)
+ kpdl:momayyezoss = +kpdl(momayyezoss)
+ kpdl:kposs = +kpdl(kposs)
+ kpdl:semi = +kpdl(semi)
+ shift:breaks_caps = +shift(breaks_caps)
+ esperanto:qwerty = +epo(qwerty)
+ esperanto:dvorak = +epo(dvorak)
+ esperanto:colemak = +epo(colemak)
+ terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp)
+ keypad:pointerkeys = +keypad(pointerkeys)
+ apple:alupckeys = +macintosh_vndr/apple(alupckeys)
+ shift:both_capslock = +shift(both_capslock)
+ shift:lshift_both_capslock = +shift(lshift_both_capslock)
+ shift:rshift_both_capslock = +shift(rshift_both_capslock)
+ shift:both_capslock_cancel = +shift(both_capslock_cancel)
+ shift:lshift_both_capslock_cancel = +shift(lshift_both_capslock_cancel)
+ shift:rshift_both_capslock_cancel = +shift(rshift_both_capslock_cancel)
+ shift:both_shiftlock = +shift(both_shiftlock)
+ shift:lshift_both_shiftlock = +shift(lshift_both_shiftlock)
+ shift:rshift_both_shiftlock = +shift(rshift_both_shiftlock)
+ solaris:sun_compat = +sun_vndr/solaris(sun_compat)
+ lv3:caps_switch = +level3(caps_switch)
+ lv3:bksl_switch = +level3(bksl_switch)
+ lv3:lsgt_switch = +level3(lsgt_switch)
+ lv3:caps_switch_latch = +level3(caps_switch_latch)
+ lv3:bksl_switch_latch = +level3(bksl_switch_latch)
+ lv3:lsgt_switch_latch = +level3(lsgt_switch_latch)
+ lv5:lsgt_switch_lock = +level5(lsgt_switch_lock)
+ lv5:ralt_switch_lock = +level5(ralt_switch_lock)
+ lv5:lwin_switch_lock = +level5(lwin_switch_lock)
+ lv5:rwin_switch_lock = +level5(rwin_switch_lock)
+ lv5:lsgt_switch_lock_cancel = +level5(lsgt_switch_lock_cancel)
+ lv5:ralt_switch_lock_cancel = +level5(ralt_switch_lock_cancel)
+ lv5:lwin_switch_lock_cancel = +level5(lwin_switch_lock_cancel)
+ lv5:rwin_switch_lock_cancel = +level5(rwin_switch_lock_cancel)
+ parens:swap_brackets = +parens(swap_brackets)
+
+
+! option = compat
+ grp_led:num = +lednum(group_lock)
+ grp_led:caps = +ledcaps(group_lock)
+ grp_led:scroll = +ledscroll(group_lock)
+ japan:kana_lock = +japan(kana_lock)
+ caps:shiftlock = +ledcaps(shift_lock)
+ grab:break_actions = +xfree86(grab_break)
+
+
+! option = types
+ caps:internal = +caps(internal)
+ caps:internal_nocancel = +caps(internal_nocancel)
+ caps:shift = +caps(shift)
+ caps:shift_nocancel = +caps(shift_nocancel)
+ numpad:pc = +numpad(pc)
+ numpad:mac = +numpad(mac)
+ numpad:microsoft = +numpad(microsoft)
+ numpad:shift3 = +numpad(shift3)
diff --git a/test/data/rules/evdev b/test/data/rules/evdev
new file mode 100644
index 0000000..872e1de
--- /dev/null
+++ b/test/data/rules/evdev
@@ -0,0 +1,1156 @@
+// DO NOT EDIT THIS FILE - IT WAS AUTOGENERATED BY merge.sh FROM rules/*.part
+//
+// Rules for resolving XKB components for use with XFree86
+// Copyright 1996 by Joseph Moss
+//
+// 2002 Modifier: Ivan Pascal The XFree86 Project
+//
+
+// If you want non-latin layouts implicitly include the en_US layout
+// uncomment lines below
+//! $nonlatin = am ara ben bd bg bt by cs deva ge gh gr guj guru il \
+// in ir iku jp kan kh kr la lao lk mk mm mn mv mal olck \
+// ori pk ru scc sy syr tel th tj tam ua uz
+
+// PC models
+! $pcmodels = pc101 pc102 pc104 pc105
+
+// Jolla devices and keyboards
+! $jollamodels = jollasbj
+
+// Microsoft models (using MS geometry)
+! $msmodels = microsoft microsoft4000 microsoft7000 microsoftpro microsoftprousb microsoftprose
+
+// Nokia devices and keyboards
+! $nokiamodels = nokiasu8w nokiarx44 nokiarx51
+
+// PC geometries - they have special geometry but symbols are mostly pc105
+! $pcgeometries = latitude
+
+// TypeMatrix geometries
+! $tmgeometries = tm2020 tm2030PS2 tm2030USB tm2030USB-102 tm2030USB-106
+
+// Layouts that provide further specializations for the OLPC
+! $olpclayouts = af am ara br ca es et fr it kh kz in mn np ru th tr us
+
+! $macbooks = macbook78 macbook79
+! $maclaptop = ibook powerbook macbook78 macbook79
+! $applealu = applealu_ansi applealu_iso applealu_jis
+! $macs = macintosh macintosh_old ibook powerbook macbook78 macbook79
+
+! $macvendorlayouts = ch de dk fi fr gb is it latam nl no pt se us
+
+! $azerty = be fr
+! $qwertz = al cz de hr hu ro si sk
+
+
+// all layouts with 3rd and 4th groups
+! $threelevellayouts = al az \
+ be br bt \
+ ca ch cs cz \
+ de dk \
+ ee es \
+ fi fo fr \
+ gb gr \
+ hu \
+ ie ir is it \
+ latam \
+ lk lt \
+ mn mt \
+ nl no \
+ pl pt \
+ ro \
+ se sk \
+ tr \
+ us \
+ vn \
+ za
+
+! $thinkpads = thinkpad thinkpad60 thinkpadz60
+
+! $sun = sun_type6_jp sun_type6_usb sun_type6_euro_usb \
+ sun_type6_jp_usb sun_type6_unix_usb sun_type7_jp_usb \
+ sun_type7_usb sun_type7_euro_usb sun_type7_unix_usb
+
+! $sun_jp = sun_type6_jp sun_type6_jp_usb sun_type7_jp_usb
+
+// Sun Type_6_7 keyboards with custom layouts
+! $sun_custom = ara be br ca ch cz de dk \
+ ee es fi fr gb gr it jp \
+ kr lt lv nl no pl pt ro \
+ ru se sk tr tw ua us
+
+! $sun_var = sun_type6 sun_type6_suncompat sun_type6_de sun_type6_fr \
+ sun_type7 sun_type7_suncompat suncompat
+
+! $sun_compat = sun_type6 sun_type6_suncompat sun_type7_suncompat suncompat
+
+! $htcdreamlayouts = us it de
+
+! $evdevkbds = ibm_spacesaver
+
+! $dvoraklayouts = br ca de ee es fr gb no pl se us
+
+! model = keycodes
+ pc98 = evdev(pc98)
+ applealu_jis = evdev+macintosh(jisevdev)
+ $jollamodels = evdev+jolla(jolla)
+ olpc = evdev+olpc(olpc)
+ olpcm = evdev+olpc(olpcm)
+ * = evdev
+
+! layout[1] = keycodes
+ $azerty = +aliases(azerty)
+ $qwertz = +aliases(qwertz)
+ * = +aliases(qwerty)
+
+! layout = keycodes
+ $azerty = +aliases(azerty)
+ $qwertz = +aliases(qwertz)
+ * = +aliases(qwerty)
+
+! option = keycodes
+
+! model layout = geometry
+ thinkpad us = thinkpad(us)
+
+! model = geometry
+ microsoftelite = microsoft(elite)
+ $msmodels = microsoft(natural)
+ dell101 = dell(dell101)
+ dellm65 = dell(dellm65)
+ latitude = dell(latitude)
+ flexpro = keytronic(FlexPro)
+ hp6000 = hp(omnibook)
+ hpmini110 = hp(mini110)
+ hpdv5 = hp(dv5)
+ omnikey101 = northgate(omnikey101)
+ sanwaskbkg3 = sanwa(sanwaskbkg3)
+ $pcmodels = pc(%m)
+ $pcgeometries = pc(%m)
+ everex = everex(STEPnote)
+ thinkpad = thinkpad(intl)
+ thinkpad60 = thinkpad(60)
+ thinkpadz60 = thinkpad(60)
+ apex300 = steelseries(apex300)
+ $tmgeometries = typematrix(%m)
+ winbook = winbook(XP5)
+ pc98 = nec(pc98)
+ $applealu = macintosh(%m)
+ $macbooks = macintosh(%m)
+ $macs = macintosh(macintosh)
+ hhk = hhk(basic)
+ kinesis = kinesis(model100)
+ $nokiamodels = nokia(%m)
+ sun_type6_jp = sun(type6jp)
+ sun_type6_usb = sun(type6)
+ sun_type6_euro_usb = sun(type6tuv)
+ sun_type6_jp_usb = sun(type6jp)
+ sun_type6_unix_usb = sun(type6unix)
+ sun_type7_jp_usb = sun(type6jp)
+ sun_type7_usb = sun(type7)
+ sun_type7_euro_usb = sun(type7tuv)
+ sun_type7_unix_usb = sun(type7unix)
+ * = pc(pc104)
+
+! model layout variant = symbols
+ * ben basic = pc+in(ben)
+ * ben probhat = pc+in(ben_probhat)
+ * dev basic = pc+in(deva)
+ * dvorak $dvoraklayouts = pc+%v(dvorak)
+ * dvorak basic = pc+us(dvorak)
+ * dvorak pl_basic = pc+pl(dvorak)
+ * dvorak pl = pc+pl(dvorak_quotes)
+ * dvorak pl_altquotes = pc+pl(dvorak_altquotes)
+ * dzdwi basic = pc+bt(basic)
+ * fi basic = pc+fi(classic)
+ * ge azerty_tskapo = pc+fr(geo)
+ * guj basic = pc+in(guj)
+ * gur basic = pc+in(guru)
+ * ie laptop = pc+ie(basic)
+ * ie CloGaelachLaptop = pc+ie(CloGaelach)
+ * in urd = pc+in(urd-phonetic)
+ * iu basic = pc+ca(ike)
+ * lo basic = pc+la(basic)
+ * kan basic = pc+in(kan)
+ * mal basic = pc+in(mal)
+ * mal mlplusnum = pc+in(mal)
+ * ogham basic = pc+ie(ogam)
+ * ogham laptop = pc+ie(ogam)
+ * ogham is434 = pc+ie(ogam_is434)
+ * ogham is434laptop = pc+ie(ogam_is434)
+ * ori basic = pc+in(ori)
+ * ro de = pc+ro(winkeys)
+ * ro us = pc+ro(std)
+ * ro academic = pc+ro(std)
+ * ro std_comma = pc+ro(std)
+ * ro comma = pc+ro(basic)
+ * ru os = pc+ru(os_legacy)
+ * pk urd = pc+pk(urd-phonetic)
+ * sapmi basic = pc+no(smi)
+ * sapmi nodeadkeys = pc+no(smi_nodeadkeys)
+ * sapmi sefi = pc+fi(smi)
+ * sin phonetic-static = pc+in(sin_phonetic)
+ * syr basic = pc+sy(syc)
+ * syr phonetic = pc+sy(syc_phonetic)
+ * tam INSCRIPT = pc+in(tam)
+ * tam UNI = pc+in(tam_unicode)
+ * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals)
+ * tam TAB = pc+in(tam_TAB)
+ * tam TSCII = pc+in(tam_TSCII)
+ * tel basic = pc+in(tel)
+ * yu basic = pc+srp(latin)
+ * yu unicode = pc+srp(latinunicode)
+ * yu yz = pc+srp(latinyz)
+ * yu unicodeyz = pc+srp(latinunicodeyz)
+ classmate us intl = pc+us(classmate-intl)
+ classmate us alt-intl = pc+us(classmate-alt-intl)
+ classmate us altgr-intl = pc+us(classmate-altgr-intl)
+ nokiarx51 cz qwerty = nokia_vndr/rx-51(cz_qwerty)
+ * $sun_custom $sun_var = pc+sun_vndr/%l%(v)
+
+! model layout = symbols
+ * ar = pc+ara
+ * ben = pc+in(ben)
+ * bs = pc+ba
+ * cs = pc+rs
+ * cz_qwerty = pc+cz(qwerty)
+ * dev = pc+in(deva)
+ * dvorak = pc+us(dvorak)
+ * dzdwi = pc+bt
+ * el = pc+gr
+ * en_US = pc+latin
+ * guj = pc+in(guj)
+ * gur = pc+in(guru)
+ * iu = pc+ca(ike)
+ * lo = pc+la
+ * kan = pc+in(kan)
+ * mi = pc+mao
+ * ogham = pc+ie(ogam)
+ * ori = pc+ie(ori)
+ * sapmi = pc+no(smi)
+ * sr = pc+srp
+ * syr = pc+sy(syc)
+ * tel = pc+in(tel)
+ * tml = pc+in(tam)
+ * yu = pc+srp
+ * fr-latin9 = pc+fr(latin9)
+ * us_intl = pc+us(alt-intl)
+ * ben(basic) = pc+in(ben)
+ * ben(probhat) = pc+in(ben_probhat)
+ * dev(basic) = pc+in(deva)
+ * dvorak($dvoraklayouts) = pc+%v(dvorak)
+ * dvorak(basic) = pc+us(dvorak)
+ * dvorak(pl_basic) = pc+pl(dvorak)
+ * dvorak(pl) = pc+pl(dvorak_quotes)
+ * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes)
+ * dzdwi(basic) = pc+bt(basic)
+ * fi(basic) = pc+fi(classic)
+ * ge(azerty_tskapo) = pc+fr(geo)
+ * guj(basic) = pc+in(guj)
+ * gur(basic) = pc+in(guru)
+ * ie(laptop) = pc+ie(basic)
+ * ie(CloGaelachLaptop) = pc+ie(CloGaelach)
+ * in(urd) = pc+in(urd-phonetic)
+ * iu(basic) = pc+ca(ike)
+ * lo(basic) = pc+la(basic)
+ * kan(basic) = pc+in(kan)
+ * mal(basic) = pc+in(mal)
+ * mal(mlplusnum) = pc+in(mal)
+ * ogham(basic) = pc+ie(ogam)
+ * ogham(laptop) = pc+ie(ogam)
+ * ogham(is434) = pc+ie(ogam_is434)
+ * ogham(is434laptop) = pc+ie(ogam_is434)
+ * ori(basic) = pc+in(ori)
+ * ro(de) = pc+ro(winkeys)
+ * ro(us) = pc+ro(std)
+ * ro(academic) = pc+ro(std)
+ * ro(std_comma) = pc+ro(std)
+ * ro(comma) = pc+ro(basic)
+ * ru(os) = pc+ru(os_legacy)
+ * pk(urd) = pc+pk(urd-phonetic)
+ * sapmi(basic) = pc+no(smi)
+ * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys)
+ * sapmi(sefi) = pc+fi(smi)
+ * sin(phonetic-static) = pc+in(sin_phonetic)
+ * syr(basic) = pc+sy(syc)
+ * syr(phonetic) = pc+sy(syc_phonetic)
+ * tam(INSCRIPT) = pc+in(tam)
+ * tam(UNI) = pc+in(tam_unicode)
+ * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals)
+ * tam(TAB) = pc+in(tam_TAB)
+ * tam(TSCII) = pc+in(tam_TSCII)
+ * tel(basic) = pc+in(tel)
+ * yu(basic) = pc+srp(latin)
+ * yu(unicode) = pc+srp(latinunicode)
+ * yu(yz) = pc+srp(latinyz)
+ * yu(unicodeyz) = pc+srp(latinunicodeyz)
+ ataritt $nonlatin = xfree68_vndr/ataritt(us)+%l%(v):2
+ ataritt * = xfree68_vndr/ataritt(us)+%l%(v)
+ amiga $nonlatin = xfree68_vndr/amiga(usa1)+%l%(v):2
+ amiga * = xfree68_vndr/amiga(usa1)+%l%(v)
+ classmate us = pc+%l(classmate)
+ empty * = empty(basic)
+ * empty = empty(basic)
+ jollasbj $nonlatin = jolla_vndr/sbj(common)+us+%l%(v):2
+ jollasbj * = jolla_vndr/sbj(common)+%l%(v)
+ $sun $sun_custom = pc+sun_vndr/%l%(v)
+ pc98 nec_vndr/jp = nec_vndr/jp(pc98)
+ macintosh_old us = macintosh_vndr/us(oldmac)
+ macintosh_old en_US = macintosh_vndr/us(oldmac)
+ macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l%(v)
+ macintosh_old $nonlatin = macintosh_vndr/us(oldmac)+%l%(v):2
+ macintosh_old * = macintosh_vndr/us(oldmac)+%l%(v)
+ applealu_jis jp = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)+macintosh_vndr/jp(mac):2
+ applealu_jis * = macintosh_vndr/apple(alukbd)+%l%(v)+macintosh_vndr/jp(mac):2
+ $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l%(v)
+ $applealu * = macintosh_vndr/apple(alukbd)+%l%(v)
+ $macs en_US = pc+macintosh_vndr/us(extended)
+ $macs $macvendorlayouts = pc+macintosh_vndr/%l%(v)
+ nokiarx44 * = nokia_vndr/rx-44(%l)
+ nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty)
+ nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l%_v)
+ nokiasu8w * = nokia_vndr/su-8w(%l)
+ olpc $olpclayouts = olpc+%l%(m)
+ olpc * = olpc+%l%(v)
+ olpcm $olpclayouts = olpc+%l%(m)
+ olpcm * = olpc+%l%(v)
+ $thinkpads br = pc+br(thinkpad)
+ sl-c3x00 * = pc+sharp_vndr/sl-c3x00(basic)
+ ws003sh * = pc+sharp_vndr/ws003sh(basic)
+ ws007sh * = pc+sharp_vndr/ws007sh(basic)
+ ws011sh * = pc+sharp_vndr/ws011sh(basic)
+ ws020sh * = pc+sharp_vndr/ws020sh(basic)
+ htcdream $htcdreamlayouts = %l(htcdream)
+ * $nonlatin = pc+us+%l%(v):2
+ * * = pc+%l%(v)
+
+! model layout[1] = symbols
+ * ar = pc+ara%(v[1])
+ * ben = pc+in(ben)
+ * bs = pc+ba%(v[1])
+ * cs = pc+rs%(v[1])
+ * cz_qwerty = pc+cz(qwerty)
+ * dev = pc+in(deva)
+ * dvorak = pc+us(dvorak)
+ * dzdwi = pc+bt%(v[1])
+ * el = pc+gr%(v[1])
+ * en_US = pc+latin%(v[1])
+ * guj = pc+in(guj)
+ * gur = pc+in(guru)
+ * iu = pc+ca(ike)
+ * lo = pc+la%(v[1])
+ * kan = pc+in(kan)
+ * mi = pc+mao%(v[1])
+ * ogham = pc+ie(ogam)
+ * ori = pc+ie(ori)
+ * sapmi = pc+no(smi)
+ * sr = pc+srp%(v[1])
+ * syr = pc+sy(syc)
+ * tel = pc+in(tel)
+ * tml = pc+in(tam)
+ * yu = pc+srp%(v[1])
+ * fr-latin9 = pc+fr(latin9)
+ * us_intl = pc+us(alt-intl)
+ * ben(basic) = pc+in(ben)
+ * ben(probhat) = pc+in(ben_probhat)
+ * dev(basic) = pc+in(deva)
+ * dvorak($dvoraklayouts) = pc+%v(dvorak)
+ * dvorak(basic) = pc+us(dvorak)
+ * dvorak(pl_basic) = pc+pl(dvorak)
+ * dvorak(pl) = pc+pl(dvorak_quotes)
+ * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes)
+ * dzdwi(basic) = pc+bt(basic)
+ * fi(basic) = pc+fi(classic)
+ * ge(azerty_tskapo) = pc+fr(geo)
+ * guj(basic) = pc+in(guj)
+ * gur(basic) = pc+in(guru)
+ * ie(laptop) = pc+ie(basic)
+ * ie(CloGaelachLaptop) = pc+ie(CloGaelach)
+ * in(urd) = pc+in(urd-phonetic)
+ * iu(basic) = pc+ca(ike)
+ * lo(basic) = pc+la(basic)
+ * kan(basic) = pc+in(kan)
+ * mal(basic) = pc+in(mal)
+ * mal(mlplusnum) = pc+in(mal)
+ * ogham(basic) = pc+ie(ogam)
+ * ogham(laptop) = pc+ie(ogam)
+ * ogham(is434) = pc+ie(ogam_is434)
+ * ogham(is434laptop) = pc+ie(ogam_is434)
+ * ori(basic) = pc+in(ori)
+ * ro(de) = pc+ro(winkeys)
+ * ro(us) = pc+ro(std)
+ * ro(academic) = pc+ro(std)
+ * ro(std_comma) = pc+ro(std)
+ * ro(comma) = pc+ro(basic)
+ * ru(os) = pc+ru(os_legacy)
+ * pk(urd) = pc+pk(urd-phonetic)
+ * sapmi(basic) = pc+no(smi)
+ * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys)
+ * sapmi(sefi) = pc+fi(smi)
+ * sin(phonetic-static) = pc+in(sin_phonetic)
+ * syr(basic) = pc+sy(syc)
+ * syr(phonetic) = pc+sy(syc_phonetic)
+ * tam(INSCRIPT) = pc+in(tam)
+ * tam(UNI) = pc+in(tam_unicode)
+ * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals)
+ * tam(TAB) = pc+in(tam_TAB)
+ * tam(TSCII) = pc+in(tam_TSCII)
+ * tel(basic) = pc+in(tel)
+ * yu(basic) = pc+srp(latin)
+ * yu(unicode) = pc+srp(latinunicode)
+ * yu(yz) = pc+srp(latinyz)
+ * yu(unicodeyz) = pc+srp(latinunicodeyz)
+ ataritt * = xfree68_vndr/ataritt(us)+%l[1]%(v[1])
+ amiga * = xfree68_vndr/amiga(usa1)+%l[1]%(v[1])
+ jollasbj * = jolla_vndr/sbj(common)+%l[1]%(v[1])
+ $sun $sun_custom = pc+sun_vndr/%l[1]%(v[1])
+ macintosh_old us = macintosh_vndr/us(oldmac)
+ macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l[1]%(v[1])
+ macintosh_old * = macintosh_vndr/us(oldmac)+%l[1]%(v[1])
+ applealu_jis us = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)
+ $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l[1]%(v[1])
+ $applealu * = macintosh_vndr/apple(alukbd)+%l[1]%(v[1])
+ $macs $macvendorlayouts = pc+macintosh_vndr/%l[1]%(v[1])
+ nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty)
+ nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l[1]%_v[1])
+ $thinkpads br = pc+%l[1](thinkpad)
+ * * = pc+%l[1]%(v[1])
+
+! model layout[1] variant[1] = symbols
+ * ben basic = pc+in(ben)
+ * ben probhat = pc+in(ben_probhat)
+ * dev basic = pc+in(deva)
+ * dvorak $dvoraklayouts = pc+%v(dvorak)
+ * dvorak basic = pc+us(dvorak)
+ * dvorak pl_basic = pc+pl(dvorak)
+ * dvorak pl = pc+pl(dvorak_quotes)
+ * dvorak pl_altquotes = pc+pl(dvorak_altquotes)
+ * dzdwi basic = pc+bt(basic)
+ * fi basic = pc+fi(classic)
+ * ge azerty_tskapo = pc+fr(geo)
+ * guj basic = pc+in(guj)
+ * gur basic = pc+in(guru)
+ * ie laptop = pc+ie(basic)
+ * ie CloGaelachLaptop = pc+ie(CloGaelach)
+ * in urd = pc+in(urd-phonetic)
+ * iu basic = pc+ca(ike)
+ * lo basic = pc+la(basic)
+ * kan basic = pc+in(kan)
+ * mal basic = pc+in(mal)
+ * mal mlplusnum = pc+in(mal)
+ * ogham basic = pc+ie(ogam)
+ * ogham laptop = pc+ie(ogam)
+ * ogham is434 = pc+ie(ogam_is434)
+ * ogham is434laptop = pc+ie(ogam_is434)
+ * ori basic = pc+in(ori)
+ * ro de = pc+ro(winkeys)
+ * ro us = pc+ro(std)
+ * ro academic = pc+ro(std)
+ * ro std_comma = pc+ro(std)
+ * ro comma = pc+ro(basic)
+ * ru os = pc+ru(os_legacy)
+ * pk urd = pc+pk(urd-phonetic)
+ * sapmi basic = pc+no(smi)
+ * sapmi nodeadkeys = pc+no(smi_nodeadkeys)
+ * sapmi sefi = pc+fi(smi)
+ * sin phonetic-static = pc+in(sin_phonetic)
+ * syr basic = pc+sy(syc)
+ * syr phonetic = pc+sy(syc_phonetic)
+ * tam INSCRIPT = pc+in(tam)
+ * tam UNI = pc+in(tam_unicode)
+ * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals)
+ * tam TAB = pc+in(tam_TAB)
+ * tam TSCII = pc+in(tam_TSCII)
+ * tel basic = pc+in(tel)
+ * yu basic = pc+srp(latin)
+ * yu unicode = pc+srp(latinunicode)
+ * yu yz = pc+srp(latinyz)
+ * yu unicodeyz = pc+srp(latinunicodeyz)
+
+! model layout[2] = symbols
+ * ar = +ara%(v[2]):2
+ * ben = +in(ben):2
+ * bs = +ba%(v[2]):2
+ * cs = +rs%(v[2]):2
+ * cz_qwerty = +cz(qwerty):2
+ * dev = +in(deva):2
+ * dvorak = +us(dvorak):2
+ * dzdwi = +bt%(v[2]):2
+ * el = +gr%(v[2]):2
+ * en_US = +latin%(v[2]):2
+ * guj = +in(guj):2
+ * gur = +in(guru):2
+ * iu = +ca(ike):2
+ * lo = +la%(v[2]):2
+ * kan = +in(kan):2
+ * mi = +mao%(v[2]):2
+ * ogham = +ie(ogam):2
+ * ori = +ie(ori):2
+ * sapmi = +no(smi):2
+ * sr = +srp%(v[2]):2
+ * syr = +sy(syc):2
+ * tel = +in(tel):2
+ * tml = +in(tam):2
+ * yu = +srp%(v[2]):2
+ * fr-latin9 = +fr(latin9):2
+ * us_intl = +us(alt-intl):2
+ * ben(basic) = +in(ben):2
+ * ben(probhat) = +in(ben_probhat):2
+ * dev(basic) = +in(deva):2
+ * dvorak($dvoraklayouts) = +%v(dvorak):2
+ * dvorak(basic) = +us(dvorak):2
+ * dvorak(pl_basic) = +pl(dvorak):2
+ * dvorak(pl) = +pl(dvorak_quotes):2
+ * dvorak(pl_altquotes) = +pl(dvorak_altquotes):2
+ * dzdwi(basic) = +bt(basic):2
+ * fi(basic) = +fi(classic):2
+ * ge(azerty_tskapo) = +fr(geo):2
+ * guj(basic) = +in(guj):2
+ * gur(basic) = +in(guru):2
+ * ie(laptop) = +ie(basic):2
+ * ie(CloGaelachLaptop) = +ie(CloGaelach):2
+ * in(urd) = +in(urd-phonetic):2
+ * iu(basic) = +ca(ike):2
+ * lo(basic) = +la(basic):2
+ * kan(basic) = +in(kan):2
+ * mal(basic) = +in(mal):2
+ * mal(mlplusnum) = +in(mal):2
+ * ogham(basic) = +ie(ogam):2
+ * ogham(laptop) = +ie(ogam):2
+ * ogham(is434) = +ie(ogam_is434):2
+ * ogham(is434laptop) = +ie(ogam_is434):2
+ * ori(basic) = +in(ori):2
+ * ro(de) = +ro(winkeys):2
+ * ro(us) = +ro(std):2
+ * ro(academic) = +ro(std):2
+ * ro(std_comma) = +ro(std):2
+ * ro(comma) = +ro(basic):2
+ * ru(os) = +ru(os_legacy):2
+ * pk(urd) = +pk(urd-phonetic):2
+ * sapmi(basic) = +no(smi):2
+ * sapmi(nodeadkeys) = +no(smi_nodeadkeys):2
+ * sapmi(sefi) = +fi(smi):2
+ * sin(phonetic-static) = +in(sin_phonetic):2
+ * syr(basic) = +sy(syc):2
+ * syr(phonetic) = +sy(syc_phonetic):2
+ * tam(INSCRIPT) = +in(tam):2
+ * tam(UNI) = +in(tam_unicode):2
+ * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):2
+ * tam(TAB) = +in(tam_TAB):2
+ * tam(TSCII) = +in(tam_TSCII):2
+ * tel(basic) = +in(tel):2
+ * yu(basic) = +srp(latin):2
+ * yu(unicode) = +srp(latinunicode):2
+ * yu(yz) = +srp(latinyz):2
+ * yu(unicodeyz) = +srp(latinunicodeyz):2
+ nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):2
+ nokiarx51 * = +nokia_vndr/rx-51(%l[2]%_v[2]):2
+ $sun $sun_custom = +sun_vndr/%l[2]%(v[2]):2
+ * * = +%l[2]%(v[2]):2
+
+! model layout[3] = symbols
+ * ar = +ara%(v[3]):3
+ * ben = +in(ben):3
+ * bs = +ba%(v[3]):3
+ * cs = +rs%(v[3]):3
+ * cz_qwerty = +cz(qwerty):3
+ * dev = +in(deva):3
+ * dvorak = +us(dvorak):3
+ * dzdwi = +bt%(v[3]):3
+ * el = +gr%(v[3]):3
+ * en_US = +latin%(v[3]):3
+ * guj = +in(guj):3
+ * gur = +in(guru):3
+ * iu = +ca(ike):3
+ * lo = +la%(v[3]):3
+ * kan = +in(kan):3
+ * mi = +mao%(v[3]):3
+ * ogham = +ie(ogam):3
+ * ori = +ie(ori):3
+ * sapmi = +no(smi):3
+ * sr = +srp%(v[3]):3
+ * syr = +sy(syc):3
+ * tel = +in(tel):3
+ * tml = +in(tam):3
+ * yu = +srp%(v[3]):3
+ * fr-latin9 = +fr(latin9):3
+ * us_intl = +us(alt-intl):3
+ * ben(basic) = +in(ben):3
+ * ben(probhat) = +in(ben_probhat):3
+ * dev(basic) = +in(deva):3
+ * dvorak($dvoraklayouts) = +%v(dvorak):3
+ * dvorak(basic) = +us(dvorak):3
+ * dvorak(pl_basic) = +pl(dvorak):3
+ * dvorak(pl) = +pl(dvorak_quotes):3
+ * dvorak(pl_altquotes) = +pl(dvorak_altquotes):3
+ * dzdwi(basic) = +bt(basic):3
+ * fi(basic) = +fi(classic):3
+ * ge(azerty_tskapo) = +fr(geo):3
+ * guj(basic) = +in(guj):3
+ * gur(basic) = +in(guru):3
+ * ie(laptop) = +ie(basic):3
+ * ie(CloGaelachLaptop) = +ie(CloGaelach):3
+ * in(urd) = +in(urd-phonetic):3
+ * iu(basic) = +ca(ike):3
+ * lo(basic) = +la(basic):3
+ * kan(basic) = +in(kan):3
+ * mal(basic) = +in(mal):3
+ * mal(mlplusnum) = +in(mal):3
+ * ogham(basic) = +ie(ogam):3
+ * ogham(laptop) = +ie(ogam):3
+ * ogham(is434) = +ie(ogam_is434):3
+ * ogham(is434laptop) = +ie(ogam_is434):3
+ * ori(basic) = +in(ori):3
+ * ro(de) = +ro(winkeys):3
+ * ro(us) = +ro(std):3
+ * ro(academic) = +ro(std):3
+ * ro(std_comma) = +ro(std):3
+ * ro(comma) = +ro(basic):3
+ * ru(os) = +ru(os_legacy):3
+ * pk(urd) = +pk(urd-phonetic):3
+ * sapmi(basic) = +no(smi):3
+ * sapmi(nodeadkeys) = +no(smi_nodeadkeys):3
+ * sapmi(sefi) = +fi(smi):3
+ * sin(phonetic-static) = +in(sin_phonetic):3
+ * syr(basic) = +sy(syc):3
+ * syr(phonetic) = +sy(syc_phonetic):3
+ * tam(INSCRIPT) = +in(tam):3
+ * tam(UNI) = +in(tam_unicode):3
+ * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):3
+ * tam(TAB) = +in(tam_TAB):3
+ * tam(TSCII) = +in(tam_TSCII):3
+ * tel(basic) = +in(tel):3
+ * yu(basic) = +srp(latin):3
+ * yu(unicode) = +srp(latinunicode):3
+ * yu(yz) = +srp(latinyz):3
+ * yu(unicodeyz) = +srp(latinunicodeyz):3
+ nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):3
+ nokiarx51 * = +nokia_vndr/rx-51(%l[3]%_v[3]):3
+ $sun $sun_custom = +sun_vndr/%l[3]%(v[3]):3
+ * * = +%l[3]%(v[3]):3
+
+! model layout[4] = symbols
+ * ar = +ara%(v[4]):4
+ * ben = +in(ben):4
+ * bs = +ba%(v[4]):4
+ * cs = +rs%(v[4]):4
+ * cz_qwerty = +cz(qwerty):4
+ * dev = +in(deva):4
+ * dvorak = +us(dvorak):4
+ * dzdwi = +bt%(v[4]):4
+ * el = +gr%(v[4]):4
+ * en_US = +latin%(v[4]):4
+ * guj = +in(guj):4
+ * gur = +in(guru):4
+ * iu = +ca(ike):4
+ * lo = +la%(v[4]):4
+ * kan = +in(kan):4
+ * mi = +mao%(v[4]):4
+ * ogham = +ie(ogam):4
+ * ori = +ie(ori):4
+ * sapmi = +no(smi):4
+ * sr = +srp%(v[4]):4
+ * syr = +sy(syc):4
+ * tel = +in(tel):4
+ * tml = +in(tam):4
+ * yu = +srp%(v[4]):4
+ * fr-latin9 = +fr(latin9):4
+ * us_intl = +us(alt-intl):4
+ * ben(basic) = +in(ben):4
+ * ben(probhat) = +in(ben_probhat):4
+ * dev(basic) = +in(deva):4
+ * dvorak($dvoraklayouts) = +%v(dvorak):4
+ * dvorak(basic) = +us(dvorak):4
+ * dvorak(pl_basic) = +pl(dvorak):4
+ * dvorak(pl) = +pl(dvorak_quotes):4
+ * dvorak(pl_altquotes) = +pl(dvorak_altquotes):4
+ * dzdwi(basic) = +bt(basic):4
+ * fi(basic) = +fi(classic):4
+ * ge(azerty_tskapo) = +fr(geo):4
+ * guj(basic) = +in(guj):4
+ * gur(basic) = +in(guru):4
+ * ie(laptop) = +ie(basic):4
+ * ie(CloGaelachLaptop) = +ie(CloGaelach):4
+ * in(urd) = +in(urd-phonetic):4
+ * iu(basic) = +ca(ike):4
+ * lo(basic) = +la(basic):4
+ * kan(basic) = +in(kan):4
+ * mal(basic) = +in(mal):4
+ * mal(mlplusnum) = +in(mal):4
+ * ogham(basic) = +ie(ogam):4
+ * ogham(laptop) = +ie(ogam):4
+ * ogham(is434) = +ie(ogam_is434):4
+ * ogham(is434laptop) = +ie(ogam_is434):4
+ * ori(basic) = +in(ori):4
+ * ro(de) = +ro(winkeys):4
+ * ro(us) = +ro(std):4
+ * ro(academic) = +ro(std):4
+ * ro(std_comma) = +ro(std):4
+ * ro(comma) = +ro(basic):4
+ * ru(os) = +ru(os_legacy):4
+ * pk(urd) = +pk(urd-phonetic):4
+ * sapmi(basic) = +no(smi):4
+ * sapmi(nodeadkeys) = +no(smi_nodeadkeys):4
+ * sapmi(sefi) = +fi(smi):4
+ * sin(phonetic-static) = +in(sin_phonetic):4
+ * syr(basic) = +sy(syc):4
+ * syr(phonetic) = +sy(syc_phonetic):4
+ * tam(INSCRIPT) = +in(tam):4
+ * tam(UNI) = +in(tam_unicode):4
+ * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):4
+ * tam(TAB) = +in(tam_TAB):4
+ * tam(TSCII) = +in(tam_TSCII):4
+ * tel(basic) = +in(tel):4
+ * yu(basic) = +srp(latin):4
+ * yu(unicode) = +srp(latinunicode):4
+ * yu(yz) = +srp(latinyz):4
+ * yu(unicodeyz) = +srp(latinunicodeyz):4
+ nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):4
+ nokiarx51 * = +nokia_vndr/rx-51(%l[4]%_v[4]):4
+ $sun $sun_custom = +sun_vndr/%l[4]%(v[4]):4
+ * * = +%l[4]%(v[4]):4
+
+! model layout[2] variant[2] = symbols
+ * ben basic = +in(ben):2
+ * ben probhat = +in(ben_probhat):2
+ * dev basic = +in(deva):2
+ * dvorak $dvoraklayouts = +%v(dvorak):2
+ * dvorak basic = +us(dvorak):2
+ * dvorak pl_basic = +pl(dvorak):2
+ * dvorak pl = +pl(dvorak_quotes):2
+ * dvorak pl_altquotes = +pl(dvorak_altquotes):2
+ * dzdwi basic = +bt(basic):2
+ * fi basic = +fi(classic):2
+ * ge azerty_tskapo = +fr(geo):2
+ * guj basic = +in(guj):2
+ * gur basic = +in(guru):2
+ * ie laptop = +ie(basic):2
+ * ie CloGaelachLaptop = +ie(CloGaelach):2
+ * in urd = +in(urd-phonetic):2
+ * iu basic = +ca(ike):2
+ * lo basic = +la(basic):2
+ * kan basic = +in(kan):2
+ * mal basic = +in(mal):2
+ * mal mlplusnum = +in(mal):2
+ * ogham basic = +ie(ogam):2
+ * ogham laptop = +ie(ogam):2
+ * ogham is434 = +ie(ogam_is434):2
+ * ogham is434laptop = +ie(ogam_is434):2
+ * ori basic = +in(ori):2
+ * ro de = +ro(winkeys):2
+ * ro us = +ro(std):2
+ * ro academic = +ro(std):2
+ * ro std_comma = +ro(std):2
+ * ro comma = +ro(basic):2
+ * ru os = +ru(os_legacy):2
+ * pk urd = +pk(urd-phonetic):2
+ * sapmi basic = +no(smi):2
+ * sapmi nodeadkeys = +no(smi_nodeadkeys):2
+ * sapmi sefi = +fi(smi):2
+ * sin phonetic-static = +in(sin_phonetic):2
+ * syr basic = +sy(syc):2
+ * syr phonetic = +sy(syc_phonetic):2
+ * tam INSCRIPT = +in(tam):2
+ * tam UNI = +in(tam_unicode):2
+ * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):2
+ * tam TAB = +in(tam_TAB):2
+ * tam TSCII = +in(tam_TSCII):2
+ * tel basic = +in(tel):2
+ * yu basic = +srp(latin):2
+ * yu unicode = +srp(latinunicode):2
+ * yu yz = +srp(latinyz):2
+ * yu unicodeyz = +srp(latinunicodeyz):2
+
+! model layout[3] variant[3] = symbols
+ * ben basic = +in(ben):3
+ * ben probhat = +in(ben_probhat):3
+ * dev basic = +in(deva):3
+ * dvorak $dvoraklayouts = +%v(dvorak):3
+ * dvorak basic = +us(dvorak):3
+ * dvorak pl_basic = +pl(dvorak):3
+ * dvorak pl = +pl(dvorak_quotes):3
+ * dvorak pl_altquotes = +pl(dvorak_altquotes):3
+ * dzdwi basic = +bt(basic):3
+ * fi basic = +fi(classic):3
+ * ge azerty_tskapo = +fr(geo):3
+ * guj basic = +in(guj):3
+ * gur basic = +in(guru):3
+ * ie laptop = +ie(basic):3
+ * ie CloGaelachLaptop = +ie(CloGaelach):3
+ * in urd = +in(urd-phonetic):3
+ * iu basic = +ca(ike):3
+ * lo basic = +la(basic):3
+ * kan basic = +in(kan):3
+ * mal basic = +in(mal):3
+ * mal mlplusnum = +in(mal):3
+ * ogham basic = +ie(ogam):3
+ * ogham laptop = +ie(ogam):3
+ * ogham is434 = +ie(ogam_is434):3
+ * ogham is434laptop = +ie(ogam_is434):3
+ * ori basic = +in(ori):3
+ * ro de = +ro(winkeys):3
+ * ro us = +ro(std):3
+ * ro academic = +ro(std):3
+ * ro std_comma = +ro(std):3
+ * ro comma = +ro(basic):3
+ * ru os = +ru(os_legacy):3
+ * pk urd = +pk(urd-phonetic):3
+ * sapmi basic = +no(smi):3
+ * sapmi nodeadkeys = +no(smi_nodeadkeys):3
+ * sapmi sefi = +fi(smi):3
+ * sin phonetic-static = +in(sin_phonetic):3
+ * syr basic = +sy(syc):3
+ * syr phonetic = +sy(syc_phonetic):3
+ * tam INSCRIPT = +in(tam):3
+ * tam UNI = +in(tam_unicode):3
+ * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):3
+ * tam TAB = +in(tam_TAB):3
+ * tam TSCII = +in(tam_TSCII):3
+ * tel basic = +in(tel):3
+ * yu basic = +srp(latin):3
+ * yu unicode = +srp(latinunicode):3
+ * yu yz = +srp(latinyz):3
+ * yu unicodeyz = +srp(latinunicodeyz):3
+
+! model layout[4] variant[4] = symbols
+ * ben basic = +in(ben):4
+ * ben probhat = +in(ben_probhat):4
+ * dev basic = +in(deva):4
+ * dvorak $dvoraklayouts = +%v(dvorak):4
+ * dvorak basic = +us(dvorak):4
+ * dvorak pl_basic = +pl(dvorak):4
+ * dvorak pl = +pl(dvorak_quotes):4
+ * dvorak pl_altquotes = +pl(dvorak_altquotes):4
+ * dzdwi basic = +bt(basic):4
+ * fi basic = +fi(classic):4
+ * ge azerty_tskapo = +fr(geo):4
+ * guj basic = +in(guj):4
+ * gur basic = +in(guru):4
+ * ie laptop = +ie(basic):4
+ * ie CloGaelachLaptop = +ie(CloGaelach):4
+ * in urd = +in(urd-phonetic):4
+ * iu basic = +ca(ike):4
+ * lo basic = +la(basic):4
+ * kan basic = +in(kan):4
+ * mal basic = +in(mal):4
+ * mal mlplusnum = +in(mal):4
+ * ogham basic = +ie(ogam):4
+ * ogham laptop = +ie(ogam):4
+ * ogham is434 = +ie(ogam_is434):4
+ * ogham is434laptop = +ie(ogam_is434):4
+ * ori basic = +in(ori):4
+ * ro de = +ro(winkeys):4
+ * ro us = +ro(std):4
+ * ro academic = +ro(std):4
+ * ro std_comma = +ro(std):4
+ * ro comma = +ro(basic):4
+ * ru os = +ru(os_legacy):4
+ * pk urd = +pk(urd-phonetic):4
+ * sapmi basic = +no(smi):4
+ * sapmi nodeadkeys = +no(smi_nodeadkeys):4
+ * sapmi sefi = +fi(smi):4
+ * sin phonetic-static = +in(sin_phonetic):4
+ * syr basic = +sy(syc):4
+ * syr phonetic = +sy(syc_phonetic):4
+ * tam INSCRIPT = +in(tam):4
+ * tam UNI = +in(tam_unicode):4
+ * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):4
+ * tam TAB = +in(tam_TAB):4
+ * tam TSCII = +in(tam_TSCII):4
+ * tel basic = +in(tel):4
+ * yu basic = +srp(latin):4
+ * yu unicode = +srp(latinunicode):4
+ * yu yz = +srp(latinyz):4
+ * yu unicodeyz = +srp(latinunicodeyz):4
+
+! model = symbols
+ $evdevkbds = +inet(evdev)+inet(%m)
+ chromebook = +inet(evdev)+inet(chromebook)
+ applealu_jis = +inet(evdev)+macintosh_vndr/jp(alujiskeys)
+ * = +inet(evdev)
+
+! model layout = symbols
+
+! layout variant = compat
+ de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de adnw = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de koy = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de bone = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de bone_eszett_home = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de neo_qwertz = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de neo_qwerty = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ jp $sun_compat = complete+japan(kana_lock)
+
+! layout[1] variant[1] = compat
+ de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de adnw = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de koy = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de bone = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de bone_eszett_home = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de neo_qwertz = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ de neo_qwerty = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+ jp $sun_compat = complete+japan(kana_lock)
+
+! layout[2] variant[2] = compat
+ de neo = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de adnw = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de koy = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de bone = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de bone_eszett_home = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de neo_qwertz = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ de neo_qwerty = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+ jp $sun_compat = +complete+japan(kana_lock):2
+
+! layout[3] variant[3] = compat
+ de neo = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de adnw = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de koy = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de bone = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de bone_eszett_home = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de neo_qwertz = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ de neo_qwerty = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+ jp $sun_compat = +complete+japan(kana_lock):3
+
+! layout[4] variant[4] = compat
+ de neo = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de adnw = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de koy = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de bone = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de bone_eszett_home = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de neo_qwertz = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ de neo_qwerty = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+ jp $sun_compat = +complete+japan(kana_lock):4
+
+! model layout = compat
+ pc98 nec_vndr/jp = pc98(basic)
+ * jp = complete+japan
+ olpc * = olpc
+ olpcm * = olpc
+ * * = complete
+
+! model layout[1] = compat
+ * * = complete
+
+! model = types
+ $macs = complete+numpad(mac)
+ $applealu = complete+numpad(mac)
+ $nokiamodels = complete+nokia
+ * = complete
+
+! layout option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle)
+ * misc:typo = +typo(base)
+
+! layout[1] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):1
+ * misc:typo = +typo(base):1
+
+! layout[2] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):2
+ * misc:typo = +typo(base):2
+
+! layout[3] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):3
+ * misc:typo = +typo(base):3
+
+! layout[4] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):4
+ * misc:typo = +typo(base):4
+
+! option = symbols
+ grp:shift_toggle = +group(shifts_toggle)
+ altwin:menu = +altwin(menu)
+ altwin:meta_alt = +altwin(meta_alt)
+ altwin:alt_win = +altwin(alt_win)
+ altwin:ctrl_win = +altwin(ctrl_win)
+ altwin:ctrl_alt_win = +altwin(ctrl_alt_win)
+ altwin:meta_win = +altwin(meta_win)
+ altwin:left_meta_win = +altwin(left_meta_win)
+ altwin:hyper_win = +altwin(hyper_win)
+ altwin:alt_super_win = +altwin(alt_super_win)
+ altwin:swap_lalt_lwin = +altwin(swap_lalt_lwin)
+ altwin:swap_alt_win = +altwin(swap_alt_win)
+ altwin:prtsc_rwin = +altwin(prtsc_rwin)
+ grab:debug = +srvr_ctrl(grab_debug)
+ grp:switch = +group(switch)
+ grp:lswitch = +group(lswitch)
+ grp:win_switch = +group(win_switch)
+ grp:lwin_switch = +group(lwin_switch)
+ grp:rwin_switch = +group(rwin_switch)
+ grp:menu_switch = +group(menu_switch)
+ grp:toggle = +group(toggle)
+ grp:shifts_toggle = +group(shifts_toggle)
+ grp:ctrls_toggle = +group(ctrls_toggle)
+ grp:alts_toggle = +group(alts_toggle)
+ grp:caps_toggle = +capslock(grouplock)
+ grp:caps_switch = +capslock(groupshift)
+ grp:shift_caps_toggle = +group(shift_caps_toggle)
+ grp:shift_caps_switch = +group(shift_caps_switch)
+ grp:win_space_toggle = +group(win_space_toggle)
+ grp:win_menu_switch = +group(win_menu_switch)
+ grp:alt_caps_toggle = +group(alt_caps_toggle)
+ grp:alt_space_toggle = +group(alt_space_toggle)
+ grp:menu_toggle = +group(menu_toggle)
+ grp:lwin_toggle = +group(lwin_toggle)
+ grp:rwin_toggle = +group(rwin_toggle)
+ grp:lshift_toggle = +group(lshift_toggle)
+ grp:rshift_toggle = +group(rshift_toggle)
+ grp:rctrl_switch = +group(rctrl_switch)
+ grp:lctrl_toggle = +group(lctrl_toggle)
+ grp:rctrl_toggle = +group(rctrl_toggle)
+ grp:lalt_toggle = +group(lalt_toggle)
+ grp:sclk_toggle = +group(sclk_toggle)
+ grp:lctrl_rctrl_switch = +group(lctrl_rctrl_switch)
+ grp:lctrl_lwin_rctrl_menu = +group(lctrl_lwin_rctrl_menu)
+ grp:lctrl_lalt_toggle = +group(lctrl_lalt_toggle)
+ grp:rctrl_ralt_toggle = +group(rctrl_ralt_toggle)
+ grp:ctrl_alt_toggle = +group(ctrl_alt_toggle)
+ grp:ctrl_alt_toggle_bidir = +group(ctrl_alt_toggle_bidir)
+ grp:lctrl_lshift_toggle = +group(lctrl_lshift_toggle)
+ grp:rctrl_rshift_toggle = +group(rctrl_rshift_toggle)
+ grp:ctrl_shift_toggle = +group(ctrl_shift_toggle)
+ grp:ctrl_shift_toggle_bidir = +group(ctrl_shift_toggle_bidir)
+ grp:lalt_lshift_toggle = +group(lalt_lshift_toggle)
+ grp:ralt_rshift_toggle = +group(ralt_rshift_toggle)
+ grp:alt_shift_toggle = +group(alt_shift_toggle)
+ grp:alt_shift_toggle_bidir = +group(alt_shift_toggle_bidir)
+ grp:lctrl_lwin_toggle = +group(lctrl_lwin_toggle)
+ lv3:switch = +level3(switch)
+ lv3:ralt_switch = +level3(ralt_switch)
+ lv3:ralt_switch_multikey = +level3(ralt_switch_multikey)
+ lv3:ralt_alt = +level3(ralt_alt)
+ lv3:lalt_switch = +level3(lalt_switch)
+ lv3:alt_switch = +level3(alt_switch)
+ lv3:menu_switch = +level3(menu_switch)
+ lv3:win_switch = +level3(win_switch)
+ lv3:lwin_switch = +level3(lwin_switch)
+ lv3:rwin_switch = +level3(rwin_switch)
+ lv3:enter_switch = +level3(enter_switch)
+ caps:capslock = +capslock(capslock)
+ caps:numlock = +capslock(numlock)
+ caps:shiftlock = +capslock(shiftlock)
+ caps:swapescape = +capslock(swapescape)
+ caps:escape = +capslock(escape)
+ caps:backspace = +capslock(backspace)
+ caps:super = +capslock(super)
+ caps:hyper = +capslock(hyper)
+ caps:menu = +capslock(menu)
+ caps:none = +capslock(none)
+ caps:ctrl_modifier = +capslock(ctrl_modifier)
+ ctrl:nocaps = +ctrl(nocaps)
+ ctrl:lctrl_meta = +ctrl(lctrl_meta)
+ ctrl:swapcaps = +ctrl(swapcaps)
+ ctrl:ac_ctrl = +ctrl(ac_ctrl)
+ ctrl:aa_ctrl = +ctrl(aa_ctrl)
+ ctrl:rctrl_ralt = +ctrl(rctrl_ralt)
+ ctrl:menu_rctrl = +ctrl(menu_rctrl)
+ ctrl:ralt_rctrl = +ctrl(ralt_rctrl)
+ ctrl:swap_lalt_lctl = +ctrl(swap_lalt_lctl)
+ ctrl:swap_lwin_lctl = +ctrl(swap_lwin_lctl)
+ ctrl:swap_rwin_rctl = +ctrl(swap_rwin_rctl)
+ ctrl:swap_lalt_lctl_lwin = +ctrl(swap_lalt_lctl_lwin)
+ compose:ralt = +compose(ralt)
+ compose:lwin = +compose(lwin)
+ compose:lwin-altgr = +compose(lwin-altgr)
+ compose:rwin = +compose(rwin)
+ compose:rwin-altgr = +compose(rwin-altgr)
+ compose:menu = +compose(menu)
+ compose:menu-altgr = +compose(menu-altgr)
+ compose:lctrl = +compose(lctrl)
+ compose:lctrl-altgr = +compose(lctrl-altgr)
+ compose:rctrl = +compose(rctrl)
+ compose:rctrl-altgr = +compose(rctrl-altgr)
+ compose:caps = +compose(caps)
+ compose:caps-altgr = +compose(caps-altgr)
+ compose:102 = +compose(102)
+ compose:102-altgr = +compose(102-altgr)
+ compose:paus = +compose(paus)
+ compose:prsc = +compose(prsc)
+ compose:sclk = +compose(sclk)
+ srvrkeys:none = +srvr_ctrl(no_srvr_keys)
+ eurosign:e = +eurosign(e)
+ eurosign:2 = +eurosign(2)
+ eurosign:4 = +eurosign(4)
+ eurosign:5 = +eurosign(5)
+ rupeesign:4 = +rupeesign(4)
+ keypad:oss = +keypad(oss)
+ keypad:legacy = +keypad(legacy)
+ keypad:legacy_wang = +keypad(legacy_wang)
+ keypad:oss_wang = +keypad(oss_wang)
+ keypad:future = +keypad(future)
+ keypad:future_wang = +keypad(future_wang)
+ keypad:hex = +keypad(ops)+keypad(hex)
+ keypad:atm = +keypad(ops)+keypad(hex)+keypad(atm)
+ nbsp:none = +nbsp(none)
+ nbsp:level2 = +nbsp(level2)
+ nbsp:level3 = +nbsp(level3)
+ nbsp:level3s = +nbsp(level3s)
+ nbsp:level3n = +nbsp(level3n)
+ nbsp:level4 = +nbsp(level4)
+ nbsp:level4n = +nbsp(level4n)
+ nbsp:level4nl = +nbsp(level4nl)
+ japan:nicola_f_bs = +jp(nicola_f_bs)
+ japan:hztg_escape = +jp(hztg_escape)
+ korean:ralt_rctrl = +kr(ralt_hangul)+kr(rctrl_hanja)
+ korean:rctrl_ralt = +kr(rctrl_hangul)+kr(ralt_hanja)
+ kpdl:dot = +kpdl(dot)
+ kpdl:comma = +kpdl(comma)
+ kpdl:dotoss = +kpdl(dotoss)
+ kpdl:dotoss_latin9 = +kpdl(dotoss_latin9)
+ kpdl:commaoss = +kpdl(commaoss)
+ kpdl:momayyezoss = +kpdl(momayyezoss)
+ kpdl:kposs = +kpdl(kposs)
+ kpdl:semi = +kpdl(semi)
+ shift:breaks_caps = +shift(breaks_caps)
+ esperanto:qwerty = +epo(qwerty)
+ esperanto:dvorak = +epo(dvorak)
+ esperanto:colemak = +epo(colemak)
+ terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp)
+ keypad:pointerkeys = +keypad(pointerkeys)
+ apple:alupckeys = +macintosh_vndr/apple(alupckeys)
+ shift:both_capslock = +shift(both_capslock)
+ shift:lshift_both_capslock = +shift(lshift_both_capslock)
+ shift:rshift_both_capslock = +shift(rshift_both_capslock)
+ shift:both_capslock_cancel = +shift(both_capslock_cancel)
+ shift:lshift_both_capslock_cancel = +shift(lshift_both_capslock_cancel)
+ shift:rshift_both_capslock_cancel = +shift(rshift_both_capslock_cancel)
+ shift:both_shiftlock = +shift(both_shiftlock)
+ shift:lshift_both_shiftlock = +shift(lshift_both_shiftlock)
+ shift:rshift_both_shiftlock = +shift(rshift_both_shiftlock)
+ solaris:sun_compat = +sun_vndr/solaris(sun_compat)
+ lv3:caps_switch = +level3(caps_switch)
+ lv3:bksl_switch = +level3(bksl_switch)
+ lv3:lsgt_switch = +level3(lsgt_switch)
+ lv3:caps_switch_latch = +level3(caps_switch_latch)
+ lv3:bksl_switch_latch = +level3(bksl_switch_latch)
+ lv3:lsgt_switch_latch = +level3(lsgt_switch_latch)
+ lv5:lsgt_switch_lock = +level5(lsgt_switch_lock)
+ lv5:ralt_switch_lock = +level5(ralt_switch_lock)
+ lv5:lwin_switch_lock = +level5(lwin_switch_lock)
+ lv5:rwin_switch_lock = +level5(rwin_switch_lock)
+ lv5:lsgt_switch_lock_cancel = +level5(lsgt_switch_lock_cancel)
+ lv5:ralt_switch_lock_cancel = +level5(ralt_switch_lock_cancel)
+ lv5:lwin_switch_lock_cancel = +level5(lwin_switch_lock_cancel)
+ lv5:rwin_switch_lock_cancel = +level5(rwin_switch_lock_cancel)
+ parens:swap_brackets = +parens(swap_brackets)
+
+
+! option = compat
+ grp_led:num = +lednum(group_lock)
+ grp_led:caps = +ledcaps(group_lock)
+ grp_led:scroll = +ledscroll(group_lock)
+ japan:kana_lock = +japan(kana_lock)
+ caps:shiftlock = +ledcaps(shift_lock)
+ grab:break_actions = +xfree86(grab_break)
+
+
+! option = types
+ caps:internal = +caps(internal)
+ caps:internal_nocancel = +caps(internal_nocancel)
+ caps:shift = +caps(shift)
+ caps:shift_nocancel = +caps(shift_nocancel)
+ numpad:pc = +numpad(pc)
+ numpad:mac = +numpad(mac)
+ numpad:microsoft = +numpad(microsoft)
+ numpad:shift3 = +numpad(shift3)
diff --git a/test/data/rules/evdev-xkbcommon b/test/data/rules/evdev-xkbcommon
new file mode 100644
index 0000000..bde6ad2
--- /dev/null
+++ b/test/data/rules/evdev-xkbcommon
@@ -0,0 +1,1092 @@
+// DO NOT EDIT THIS FILE - IT WAS AUTOGENERATED BY merge.sh FROM rules/*.part
+//
+// Rules for resolving XKB components for use with XFree86
+// Copyright 1996 by Joseph Moss
+//
+// 2002 Modifier: Ivan Pascal The XFree86 Project
+//
+
+// If you want non-latin layouts implicitly include the en_US layout
+// uncomment lines below
+//! $nonlatin = am ara ben bd bg bt by cs deva ge gh gr guj guru il \
+// in ir iku jp kan kh kr la lao lk mk mm mn mv mal ori pk \
+// ru scc sy syr tel th tj tam ua uz
+
+// PC models
+! $pcmodels = pc101 pc102 pc104 pc105
+
+// Microsoft models (using MS geometry)
+! $msmodels = microsoft microsoft4000 microsoft7000 microsoftpro microsoftprousb microsoftprose
+
+// Nokia devices and keyboards
+! $nokiamodels = nokiasu8w nokiarx44 nokiarx51
+
+// PC geometries - they have special geometry but symbols are mostly pc105
+! $pcgeometries = latitude
+
+// TypeMatrix geometries
+! $tmgeometries = tm2020 tm2030PS2 tm2030USB tm2030USB-102 tm2030USB-106
+
+// Layouts that provide further specializations for the OLPC
+! $olpclayouts = af am ara br ca es et fr it kh kz in mn np ru th tr us
+
+! $macbooks = macbook78 macbook79
+! $maclaptop = ibook powerbook macbook78 macbook79
+! $applealu = applealu_ansi applealu_iso applealu_jis
+! $macs = macintosh macintosh_old ibook powerbook macbook78 macbook79
+
+! $macvendorlayouts = ch de dk fi fr gb is it latam nl no pt se us
+
+! $azerty = be fr
+! $qwertz = al cz de hr hu ro si sk
+
+! $inetkbds = acer_c300 acer_ferrari4k acer_laptop \
+ airkey \
+ apple armada azonaRF2300 \
+ benqx brother \
+ btc5113rf btc9000 btc9000a btc9001ah btc5090 btc9019u \
+ cherryblue cherrybluea cherryblueb \
+ cherrycyboard cherrycmexpert \
+ chicony chicony0108 chicony0420 chicony9885 \
+ compalfl90 \
+ compaqeak8 compaqik7 compaqik13 compaqik18 \
+ creativedw7000 \
+ cymotionlinux \
+ dell dellm65 inspiron dellusbmm \
+ emachines ennyah_dkb1008 evdev \
+ genius geniuscomfy2 \
+ gyration honeywell_euroboard \
+ hp250x hp5xx hp500fa hpdv5 \
+ hpi6 hpxe3gc hpxe3gf hpxe4xxx hpxt1000 hpzt11xx htcdream \
+ ibm_spacesaver ipaq inspiron intel \
+ logiaccess logicda logicink \
+ logiex110 logiclx300 \
+ logiinkse logiinkseusb logiitc logiik \
+ logitech_base itouch logiultrax \
+ logitech_g15 \
+ logidinovo logidinovoedge \
+ microsoft4000 microsoft7000 microsoftinet microsoftprousb microsoftprooem microsoftprose \
+ microsoftoffice microsoftmult \
+ mx1998 mx2500 mx2750 \
+ oretec \
+ pc105 \
+ presario propeller \
+ qtronix \
+ rapidaccess rapidaccess2 thinkpad60 \
+ samsung4500 samsung4510 \
+ silvercrest \
+ sk1300 sk2500 sk6200 sk7100 \
+ sven sven303 symplon \
+ toshiba_s3000 trust trustda \
+ unitekkb1925 yahoo
+
+// all layouts with 3rd and 4th groups
+! $threelevellayouts = al az \
+ be br bt \
+ ca ch cs cz \
+ de dk \
+ ee es \
+ fi fo fr \
+ gb gr \
+ hu \
+ ie ir is it \
+ latam \
+ lk lt \
+ mn mt \
+ nl no \
+ pl pt \
+ ro \
+ se sk \
+ tr \
+ us \
+ vn \
+ za
+
+! $evdevkbds = ibm_spacesaver
+
+! $thinkpads = thinkpad thinkpad60 thinkpadz60
+
+! $sun_t6_custom = ara be br ca ch cz de dk \
+ ee es fi fr gb gr it kr \
+ lt lv nl no pl pt ro ru \
+ se sk tr tw ua
+
+! $htcdreamlayouts = us it de
+
+! $dvoraklayouts = br ca de ee es fr gb no pl se us
+
+! model = keycodes
+ * = evdev-xkbcommon
+
+! layout[1] = keycodes
+ $azerty = +aliases-xkbcommon(azerty)
+ $qwertz = +aliases-xkbcommon(qwertz)
+ * = +aliases-xkbcommon(qwerty)
+
+! layout = keycodes
+ $azerty = +aliases-xkbcommon(azerty)
+ $qwertz = +aliases-xkbcommon(qwertz)
+ * = +aliases-xkbcommon(qwerty)
+
+! model layout = geometry
+ thinkpad us = thinkpad(us)
+
+! model = geometry
+ microsoftelite = microsoft(elite)
+ $msmodels = microsoft(natural)
+ dell101 = dell(dell101)
+ dellm65 = dell(dellm65)
+ latitude = dell(latitude)
+ flexpro = keytronic(FlexPro)
+ hp6000 = hp(omnibook)
+ hpmini110 = hp(mini110)
+ hpdv5 = hp(dv5)
+ omnikey101 = northgate(omnikey101)
+ sanwaskbkg3 = sanwa(sanwaskbkg3)
+ $pcmodels = pc(%m)
+ $pcgeometries = pc(%m)
+ everex = everex(STEPnote)
+ thinkpad = thinkpad(intl)
+ thinkpad60 = thinkpad(60)
+ thinkpadz60 = thinkpad(60)
+ $tmgeometries = typematrix(%m)
+ winbook = winbook(XP5)
+ pc98 = nec(pc98)
+ $applealu = macintosh(%m)
+ $macbooks = macintosh(%m)
+ $macs = macintosh(macintosh)
+ hhk = hhk(basic)
+ kinesis = kinesis(model100)
+ $nokiamodels = nokia(%m)
+ * = pc(pc104)
+
+! model layout variant = symbols
+ * ben basic = pc+in(ben)
+ * ben probhat = pc+in(ben_probhat)
+ * dev basic = pc+in(deva)
+ * dvorak $dvoraklayouts = pc+%v(dvorak)
+ * dvorak basic = pc+us(dvorak)
+ * dvorak pl_basic = pc+pl(dvorak)
+ * dvorak pl = pc+pl(dvorak_quotes)
+ * dvorak pl_altquotes = pc+pl(dvorak_altquotes)
+ * dzdwi basic = pc+bt(basic)
+ * fi basic = pc+fi(classic)
+ * ge azerty_tskapo = pc+fr(geo)
+ * guj basic = pc+in(guj)
+ * gur basic = pc+in(guru)
+ * ie laptop = pc+ie(basic)
+ * ie CloGaelachLaptop = pc+ie(CloGaelach)
+ * in urd = pc+in(urd-phonetic)
+ * iu basic = pc+ca(ike)
+ * lo basic = pc+la(basic)
+ * kan basic = pc+in(kan)
+ * mal basic = pc+in(mal)
+ * mal mlplusnum = pc+in(mal)
+ * ogham basic = pc+ie(ogam)
+ * ogham laptop = pc+ie(ogam)
+ * ogham is434 = pc+ie(ogam_is434)
+ * ogham is434laptop = pc+ie(ogam_is434)
+ * ori basic = pc+in(ori)
+ * ro de = pc+ro(winkeys)
+ * ro us = pc+ro(std)
+ * ro academic = pc+ro(std)
+ * ro std_comma = pc+ro(std)
+ * ro comma = pc+ro(basic)
+ * ru os = pc+ru(os_legacy)
+ * pk urd = pc+pk(urd-phonetic)
+ * sapmi basic = pc+no(smi)
+ * sapmi nodeadkeys = pc+no(smi_nodeadkeys)
+ * sapmi sefi = pc+fi(smi)
+ * sin phonetic-static = pc+in(sin_phonetic)
+ * syr basic = pc+sy(syc)
+ * syr phonetic = pc+sy(syc_phonetic)
+ * tam INSCRIPT = pc+in(tam)
+ * tam UNI = pc+in(tam_unicode)
+ * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals)
+ * tam TAB = pc+in(tam_TAB)
+ * tam TSCII = pc+in(tam_TSCII)
+ * tel basic = pc+in(tel)
+ * yu basic = pc+srp(latin)
+ * yu unicode = pc+srp(latinunicode)
+ * yu yz = pc+srp(latinyz)
+ * yu unicodeyz = pc+srp(latinunicodeyz)
+ classmate us intl = pc+us(classmate-intl)
+ classmate us alt-intl = pc+us(classmate-alt-intl)
+ classmate us altgr-intl = pc+us(classmate-altgr-intl)
+ nokiarx51 cz qwerty = nokia_vndr/rx-51(cz_qwerty)
+
+! model layout = symbols
+ * ar = pc+ara
+ * ben = pc+in(ben)
+ * bs = pc+ba
+ * cs = pc+rs
+ * cz_qwerty = pc+cz(qwerty)
+ * dev = pc+in(deva)
+ * dvorak = pc+us(dvorak)
+ * dzdwi = pc+bt
+ * el = pc+gr
+ * en_US = pc+latin
+ * guj = pc+in(guj)
+ * gur = pc+in(guru)
+ * iu = pc+ca(ike)
+ * lo = pc+la
+ * kan = pc+in(kan)
+ * mi = pc+mao
+ * ml = pc+in(mal)
+ * ogham = pc+ie(ogam)
+ * ori = pc+ie(ori)
+ * sapmi = pc+no(smi)
+ * sr = pc+srp
+ * syr = pc+sy(syc)
+ * tel = pc+in(tel)
+ * tml = pc+in(tam)
+ * yu = pc+srp
+ * fr-latin9 = pc+fr(latin9)
+ * us_intl = pc+us(alt-intl)
+ * ben(basic) = pc+in(ben)
+ * ben(probhat) = pc+in(ben_probhat)
+ * dev(basic) = pc+in(deva)
+ * dvorak($dvoraklayouts) = pc+%v(dvorak)
+ * dvorak(basic) = pc+us(dvorak)
+ * dvorak(pl_basic) = pc+pl(dvorak)
+ * dvorak(pl) = pc+pl(dvorak_quotes)
+ * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes)
+ * dzdwi(basic) = pc+bt(basic)
+ * fi(basic) = pc+fi(classic)
+ * ge(azerty_tskapo) = pc+fr(geo)
+ * guj(basic) = pc+in(guj)
+ * gur(basic) = pc+in(guru)
+ * ie(laptop) = pc+ie(basic)
+ * ie(CloGaelachLaptop) = pc+ie(CloGaelach)
+ * in(urd) = pc+in(urd-phonetic)
+ * iu(basic) = pc+ca(ike)
+ * lo(basic) = pc+la(basic)
+ * kan(basic) = pc+in(kan)
+ * mal(basic) = pc+in(mal)
+ * mal(mlplusnum) = pc+in(mal)
+ * ogham(basic) = pc+ie(ogam)
+ * ogham(laptop) = pc+ie(ogam)
+ * ogham(is434) = pc+ie(ogam_is434)
+ * ogham(is434laptop) = pc+ie(ogam_is434)
+ * ori(basic) = pc+in(ori)
+ * ro(de) = pc+ro(winkeys)
+ * ro(us) = pc+ro(std)
+ * ro(academic) = pc+ro(std)
+ * ro(std_comma) = pc+ro(std)
+ * ro(comma) = pc+ro(basic)
+ * ru(os) = pc+ru(os_legacy)
+ * pk(urd) = pc+pk(urd-phonetic)
+ * sapmi(basic) = pc+no(smi)
+ * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys)
+ * sapmi(sefi) = pc+fi(smi)
+ * sin(phonetic-static) = pc+in(sin_phonetic)
+ * syr(basic) = pc+sy(syc)
+ * syr(phonetic) = pc+sy(syc_phonetic)
+ * tam(INSCRIPT) = pc+in(tam)
+ * tam(UNI) = pc+in(tam_unicode)
+ * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals)
+ * tam(TAB) = pc+in(tam_TAB)
+ * tam(TSCII) = pc+in(tam_TSCII)
+ * tel(basic) = pc+in(tel)
+ * yu(basic) = pc+srp(latin)
+ * yu(unicode) = pc+srp(latinunicode)
+ * yu(yz) = pc+srp(latinyz)
+ * yu(unicodeyz) = pc+srp(latinunicodeyz)
+ ataritt $nonlatin = xfree68_vndr/ataritt(us)+%l%(v):2
+ ataritt * = xfree68_vndr/ataritt(us)+%l%(v)
+ amiga $nonlatin = xfree68_vndr/amiga(usa1)+%l%(v):2
+ amiga * = xfree68_vndr/amiga(usa1)+%l%(v)
+ classmate us = pc+%l(classmate)
+ empty * = empty(basic)
+ * empty = empty(basic)
+ sun4 $nonlatin = latin+sun_vndr/us(type4)+%l%(v):2
+ sun4 * = latin+sun_vndr/us(type4)+%l%(v)
+ sun5 $nonlatin = latin+sun_vndr/us(type5)+%l%(v):2
+ sun5 * = latin+sun_vndr/us(type5)+%l%(v)
+ sun6 us = pc+sun_vndr/us(type6)
+ sun6 en_US = pc+sun_vndr/us(type6)+iso9995-3(basic)
+ sun6 $sun_t6_custom = pc+sun_vndr/us(type6)+sun_vndr/%l%(v)
+ sun6 * = pc+sun_vndr/us(type6)+%l%(v)
+ sun6euro us = pc+sun_vndr/us(type6)
+ sun6euro en_US = pc+sun_vndr/us(type6)+iso9995-3(basic)
+ sun6euro $sun_t6_custom = pc+sun_vndr/us(type6)+sun_vndr/%l%(v)
+ sun6euro * = pc+sun_vndr/us(type6)+%l%(v)
+ pc98 nec_vndr/jp = nec_vndr/jp(pc98)
+ macintosh_old us = macintosh_vndr/us(oldmac)
+ macintosh_old en_US = macintosh_vndr/us(oldmac)
+ macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l%(v)
+ macintosh_old $nonlatin = macintosh_vndr/us(oldmac)+%l%(v):2
+ macintosh_old * = macintosh_vndr/us(oldmac)+%l%(v)
+ applealu_jis jp = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)+macintosh_vndr/jp(mac):2
+ applealu_jis * = macintosh_vndr/apple(alukbd)+%l%(v)+macintosh_vndr/jp(mac):2
+ $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l%(v)
+ $applealu * = macintosh_vndr/apple(alukbd)+%l%(v)
+ $macs en_US = pc+macintosh_vndr/us(extended)
+ $macs $macvendorlayouts = pc+macintosh_vndr/%l%(v)
+ nokiarx44 * = nokia_vndr/rx-44(%l)
+ nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty)
+ nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l%_v)
+ nokiasu8w * = nokia_vndr/su-8w(%l)
+ olpc $olpclayouts = olpc+%l%(m)
+ olpc * = olpc+%l%(v)
+ $thinkpads br = pc+br(thinkpad)
+ htcdream $htcdreamlayouts = %l(htcdream)
+ * $nonlatin = pc+us+%l%(v):2
+ * * = pc+%l%(v)
+
+! model layout[1] = symbols
+ * ar = pc+ara%(v[1])
+ * ben = pc+in(ben)
+ * bs = pc+ba%(v[1])
+ * cs = pc+rs%(v[1])
+ * cz_qwerty = pc+cz(qwerty)
+ * dev = pc+in(deva)
+ * dvorak = pc+us(dvorak)
+ * dzdwi = pc+bt%(v[1])
+ * el = pc+gr%(v[1])
+ * en_US = pc+latin%(v[1])
+ * guj = pc+in(guj)
+ * gur = pc+in(guru)
+ * iu = pc+ca(ike)
+ * lo = pc+la%(v[1])
+ * kan = pc+in(kan)
+ * mi = pc+mao%(v[1])
+ * ml = pc+in(mal)
+ * ogham = pc+ie(ogam)
+ * ori = pc+ie(ori)
+ * sapmi = pc+no(smi)
+ * sr = pc+srp%(v[1])
+ * syr = pc+sy(syc)
+ * tel = pc+in(tel)
+ * tml = pc+in(tam)
+ * yu = pc+srp%(v[1])
+ * fr-latin9 = pc+fr(latin9)
+ * us_intl = pc+us(alt-intl)
+ * ben(basic) = pc+in(ben)
+ * ben(probhat) = pc+in(ben_probhat)
+ * dev(basic) = pc+in(deva)
+ * dvorak($dvoraklayouts) = pc+%v(dvorak)
+ * dvorak(basic) = pc+us(dvorak)
+ * dvorak(pl_basic) = pc+pl(dvorak)
+ * dvorak(pl) = pc+pl(dvorak_quotes)
+ * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes)
+ * dzdwi(basic) = pc+bt(basic)
+ * fi(basic) = pc+fi(classic)
+ * ge(azerty_tskapo) = pc+fr(geo)
+ * guj(basic) = pc+in(guj)
+ * gur(basic) = pc+in(guru)
+ * ie(laptop) = pc+ie(basic)
+ * ie(CloGaelachLaptop) = pc+ie(CloGaelach)
+ * in(urd) = pc+in(urd-phonetic)
+ * iu(basic) = pc+ca(ike)
+ * lo(basic) = pc+la(basic)
+ * kan(basic) = pc+in(kan)
+ * mal(basic) = pc+in(mal)
+ * mal(mlplusnum) = pc+in(mal)
+ * ogham(basic) = pc+ie(ogam)
+ * ogham(laptop) = pc+ie(ogam)
+ * ogham(is434) = pc+ie(ogam_is434)
+ * ogham(is434laptop) = pc+ie(ogam_is434)
+ * ori(basic) = pc+in(ori)
+ * ro(de) = pc+ro(winkeys)
+ * ro(us) = pc+ro(std)
+ * ro(academic) = pc+ro(std)
+ * ro(std_comma) = pc+ro(std)
+ * ro(comma) = pc+ro(basic)
+ * ru(os) = pc+ru(os_legacy)
+ * pk(urd) = pc+pk(urd-phonetic)
+ * sapmi(basic) = pc+no(smi)
+ * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys)
+ * sapmi(sefi) = pc+fi(smi)
+ * sin(phonetic-static) = pc+in(sin_phonetic)
+ * syr(basic) = pc+sy(syc)
+ * syr(phonetic) = pc+sy(syc_phonetic)
+ * tam(INSCRIPT) = pc+in(tam)
+ * tam(UNI) = pc+in(tam_unicode)
+ * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals)
+ * tam(TAB) = pc+in(tam_TAB)
+ * tam(TSCII) = pc+in(tam_TSCII)
+ * tel(basic) = pc+in(tel)
+ * yu(basic) = pc+srp(latin)
+ * yu(unicode) = pc+srp(latinunicode)
+ * yu(yz) = pc+srp(latinyz)
+ * yu(unicodeyz) = pc+srp(latinunicodeyz)
+ ataritt * = xfree68_vndr/ataritt(us)+%l[1]%(v[1])
+ amiga * = xfree68_vndr/amiga(usa1)+%l[1]%(v[1])
+ sun4 * = latin+sun_vndr/us(type4)+%l[1]%(v[1])
+ sun5 * = latin+sun_vndr/us(type5)+%l[1]%(v[1])
+ macintosh_old us = macintosh_vndr/us(oldmac)
+ macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l[1]%(v[1])
+ macintosh_old * = macintosh_vndr/us(oldmac)+%l[1]%(v[1])
+ applealu_jis us = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)
+ $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l[1]%(v[1])
+ $applealu * = macintosh_vndr/apple(alukbd)+%l[1]%(v[1])
+ $macs $macvendorlayouts = pc+macintosh_vndr/%l[1]%(v[1])
+ nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty)
+ nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l[1]%_v[1])
+ $thinkpads br = pc+%l[1](thinkpad)
+ * * = pc+%l[1]%(v[1])
+
+! model layout[1] variant[1] = symbols
+ * ben basic = pc+in(ben)
+ * ben probhat = pc+in(ben_probhat)
+ * dev basic = pc+in(deva)
+ * dvorak $dvoraklayouts = pc+%v(dvorak)
+ * dvorak basic = pc+us(dvorak)
+ * dvorak pl_basic = pc+pl(dvorak)
+ * dvorak pl = pc+pl(dvorak_quotes)
+ * dvorak pl_altquotes = pc+pl(dvorak_altquotes)
+ * dzdwi basic = pc+bt(basic)
+ * fi basic = pc+fi(classic)
+ * ge azerty_tskapo = pc+fr(geo)
+ * guj basic = pc+in(guj)
+ * gur basic = pc+in(guru)
+ * ie laptop = pc+ie(basic)
+ * ie CloGaelachLaptop = pc+ie(CloGaelach)
+ * in urd = pc+in(urd-phonetic)
+ * iu basic = pc+ca(ike)
+ * lo basic = pc+la(basic)
+ * kan basic = pc+in(kan)
+ * mal basic = pc+in(mal)
+ * mal mlplusnum = pc+in(mal)
+ * ogham basic = pc+ie(ogam)
+ * ogham laptop = pc+ie(ogam)
+ * ogham is434 = pc+ie(ogam_is434)
+ * ogham is434laptop = pc+ie(ogam_is434)
+ * ori basic = pc+in(ori)
+ * ro de = pc+ro(winkeys)
+ * ro us = pc+ro(std)
+ * ro academic = pc+ro(std)
+ * ro std_comma = pc+ro(std)
+ * ro comma = pc+ro(basic)
+ * ru os = pc+ru(os_legacy)
+ * pk urd = pc+pk(urd-phonetic)
+ * sapmi basic = pc+no(smi)
+ * sapmi nodeadkeys = pc+no(smi_nodeadkeys)
+ * sapmi sefi = pc+fi(smi)
+ * sin phonetic-static = pc+in(sin_phonetic)
+ * syr basic = pc+sy(syc)
+ * syr phonetic = pc+sy(syc_phonetic)
+ * tam INSCRIPT = pc+in(tam)
+ * tam UNI = pc+in(tam_unicode)
+ * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals)
+ * tam TAB = pc+in(tam_TAB)
+ * tam TSCII = pc+in(tam_TSCII)
+ * tel basic = pc+in(tel)
+ * yu basic = pc+srp(latin)
+ * yu unicode = pc+srp(latinunicode)
+ * yu yz = pc+srp(latinyz)
+ * yu unicodeyz = pc+srp(latinunicodeyz)
+
+! model layout[2] = symbols
+ * ar = +ara%(v[2]):2
+ * ben = +in(ben):2
+ * bs = +ba%(v[2]):2
+ * cs = +rs%(v[2]):2
+ * cz_qwerty = +cz(qwerty):2
+ * dev = +in(deva):2
+ * dvorak = +us(dvorak):2
+ * dzdwi = +bt%(v[2]):2
+ * el = +gr%(v[2]):2
+ * en_US = +latin%(v[2]):2
+ * guj = +in(guj):2
+ * gur = +in(guru):2
+ * iu = +ca(ike):2
+ * lo = +la%(v[2]):2
+ * kan = +in(kan):2
+ * mi = +mao%(v[2]):2
+ * ml = +in(mal):2
+ * ogham = +ie(ogam):2
+ * ori = +ie(ori):2
+ * sapmi = +no(smi):2
+ * sr = +srp%(v[2]):2
+ * syr = +sy(syc):2
+ * tel = +in(tel):2
+ * tml = +in(tam):2
+ * yu = +srp%(v[2]):2
+ * fr-latin9 = +fr(latin9):2
+ * us_intl = +us(alt-intl):2
+ * ben(basic) = +in(ben):2
+ * ben(probhat) = +in(ben_probhat):2
+ * dev(basic) = +in(deva):2
+ * dvorak($dvoraklayouts) = +%v(dvorak):2
+ * dvorak(basic) = +us(dvorak):2
+ * dvorak(pl_basic) = +pl(dvorak):2
+ * dvorak(pl) = +pl(dvorak_quotes):2
+ * dvorak(pl_altquotes) = +pl(dvorak_altquotes):2
+ * dzdwi(basic) = +bt(basic):2
+ * fi(basic) = +fi(classic):2
+ * ge(azerty_tskapo) = +fr(geo):2
+ * guj(basic) = +in(guj):2
+ * gur(basic) = +in(guru):2
+ * ie(laptop) = +ie(basic):2
+ * ie(CloGaelachLaptop) = +ie(CloGaelach):2
+ * in(urd) = +in(urd-phonetic):2
+ * iu(basic) = +ca(ike):2
+ * lo(basic) = +la(basic):2
+ * kan(basic) = +in(kan):2
+ * mal(basic) = +in(mal):2
+ * mal(mlplusnum) = +in(mal):2
+ * ogham(basic) = +ie(ogam):2
+ * ogham(laptop) = +ie(ogam):2
+ * ogham(is434) = +ie(ogam_is434):2
+ * ogham(is434laptop) = +ie(ogam_is434):2
+ * ori(basic) = +in(ori):2
+ * ro(de) = +ro(winkeys):2
+ * ro(us) = +ro(std):2
+ * ro(academic) = +ro(std):2
+ * ro(std_comma) = +ro(std):2
+ * ro(comma) = +ro(basic):2
+ * ru(os) = +ru(os_legacy):2
+ * pk(urd) = +pk(urd-phonetic):2
+ * sapmi(basic) = +no(smi):2
+ * sapmi(nodeadkeys) = +no(smi_nodeadkeys):2
+ * sapmi(sefi) = +fi(smi):2
+ * sin(phonetic-static) = +in(sin_phonetic):2
+ * syr(basic) = +sy(syc):2
+ * syr(phonetic) = +sy(syc_phonetic):2
+ * tam(INSCRIPT) = +in(tam):2
+ * tam(UNI) = +in(tam_unicode):2
+ * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):2
+ * tam(TAB) = +in(tam_TAB):2
+ * tam(TSCII) = +in(tam_TSCII):2
+ * tel(basic) = +in(tel):2
+ * yu(basic) = +srp(latin):2
+ * yu(unicode) = +srp(latinunicode):2
+ * yu(yz) = +srp(latinyz):2
+ * yu(unicodeyz) = +srp(latinunicodeyz):2
+ nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):2
+ nokiarx51 * = +nokia_vndr/rx-51(%l[2]%_v[2]):2
+ * * = +%l[2]%(v[2]):2
+
+! model layout[3] = symbols
+ * ar = +ara%(v[3]):3
+ * ben = +in(ben):3
+ * bs = +ba%(v[3]):3
+ * cs = +rs%(v[3]):3
+ * cz_qwerty = +cz(qwerty):3
+ * dev = +in(deva):3
+ * dvorak = +us(dvorak):3
+ * dzdwi = +bt%(v[3]):3
+ * el = +gr%(v[3]):3
+ * en_US = +latin%(v[3]):3
+ * guj = +in(guj):3
+ * gur = +in(guru):3
+ * iu = +ca(ike):3
+ * lo = +la%(v[3]):3
+ * kan = +in(kan):3
+ * mi = +mao%(v[3]):3
+ * ml = +in(mal):3
+ * ogham = +ie(ogam):3
+ * ori = +ie(ori):3
+ * sapmi = +no(smi):3
+ * sr = +srp%(v[3]):3
+ * syr = +sy(syc):3
+ * tel = +in(tel):3
+ * tml = +in(tam):3
+ * yu = +srp%(v[3]):3
+ * fr-latin9 = +fr(latin9):3
+ * us_intl = +us(alt-intl):3
+ * ben(basic) = +in(ben):3
+ * ben(probhat) = +in(ben_probhat):3
+ * dev(basic) = +in(deva):3
+ * dvorak($dvoraklayouts) = +%v(dvorak):3
+ * dvorak(basic) = +us(dvorak):3
+ * dvorak(pl_basic) = +pl(dvorak):3
+ * dvorak(pl) = +pl(dvorak_quotes):3
+ * dvorak(pl_altquotes) = +pl(dvorak_altquotes):3
+ * dzdwi(basic) = +bt(basic):3
+ * fi(basic) = +fi(classic):3
+ * ge(azerty_tskapo) = +fr(geo):3
+ * guj(basic) = +in(guj):3
+ * gur(basic) = +in(guru):3
+ * ie(laptop) = +ie(basic):3
+ * ie(CloGaelachLaptop) = +ie(CloGaelach):3
+ * in(urd) = +in(urd-phonetic):3
+ * iu(basic) = +ca(ike):3
+ * lo(basic) = +la(basic):3
+ * kan(basic) = +in(kan):3
+ * mal(basic) = +in(mal):3
+ * mal(mlplusnum) = +in(mal):3
+ * ogham(basic) = +ie(ogam):3
+ * ogham(laptop) = +ie(ogam):3
+ * ogham(is434) = +ie(ogam_is434):3
+ * ogham(is434laptop) = +ie(ogam_is434):3
+ * ori(basic) = +in(ori):3
+ * ro(de) = +ro(winkeys):3
+ * ro(us) = +ro(std):3
+ * ro(academic) = +ro(std):3
+ * ro(std_comma) = +ro(std):3
+ * ro(comma) = +ro(basic):3
+ * ru(os) = +ru(os_legacy):3
+ * pk(urd) = +pk(urd-phonetic):3
+ * sapmi(basic) = +no(smi):3
+ * sapmi(nodeadkeys) = +no(smi_nodeadkeys):3
+ * sapmi(sefi) = +fi(smi):3
+ * sin(phonetic-static) = +in(sin_phonetic):3
+ * syr(basic) = +sy(syc):3
+ * syr(phonetic) = +sy(syc_phonetic):3
+ * tam(INSCRIPT) = +in(tam):3
+ * tam(UNI) = +in(tam_unicode):3
+ * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):3
+ * tam(TAB) = +in(tam_TAB):3
+ * tam(TSCII) = +in(tam_TSCII):3
+ * tel(basic) = +in(tel):3
+ * yu(basic) = +srp(latin):3
+ * yu(unicode) = +srp(latinunicode):3
+ * yu(yz) = +srp(latinyz):3
+ * yu(unicodeyz) = +srp(latinunicodeyz):3
+ nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):3
+ nokiarx51 * = +nokia_vndr/rx-51(%l[3]%_v[3]):3
+ * * = +%l[3]%(v[3]):3
+
+! model layout[4] = symbols
+ * ar = +ara%(v[4]):4
+ * ben = +in(ben):4
+ * bs = +ba%(v[4]):4
+ * cs = +rs%(v[4]):4
+ * cz_qwerty = +cz(qwerty):4
+ * dev = +in(deva):4
+ * dvorak = +us(dvorak):4
+ * dzdwi = +bt%(v[4]):4
+ * el = +gr%(v[4]):4
+ * en_US = +latin%(v[4]):4
+ * guj = +in(guj):4
+ * gur = +in(guru):4
+ * iu = +ca(ike):4
+ * lo = +la%(v[4]):4
+ * kan = +in(kan):4
+ * mi = +mao%(v[4]):4
+ * ml = +in(mal):4
+ * ogham = +ie(ogam):4
+ * ori = +ie(ori):4
+ * sapmi = +no(smi):4
+ * sr = +srp%(v[4]):4
+ * syr = +sy(syc):4
+ * tel = +in(tel):4
+ * tml = +in(tam):4
+ * yu = +srp%(v[4]):4
+ * fr-latin9 = +fr(latin9):4
+ * us_intl = +us(alt-intl):4
+ * ben(basic) = +in(ben):4
+ * ben(probhat) = +in(ben_probhat):4
+ * dev(basic) = +in(deva):4
+ * dvorak($dvoraklayouts) = +%v(dvorak):4
+ * dvorak(basic) = +us(dvorak):4
+ * dvorak(pl_basic) = +pl(dvorak):4
+ * dvorak(pl) = +pl(dvorak_quotes):4
+ * dvorak(pl_altquotes) = +pl(dvorak_altquotes):4
+ * dzdwi(basic) = +bt(basic):4
+ * fi(basic) = +fi(classic):4
+ * ge(azerty_tskapo) = +fr(geo):4
+ * guj(basic) = +in(guj):4
+ * gur(basic) = +in(guru):4
+ * ie(laptop) = +ie(basic):4
+ * ie(CloGaelachLaptop) = +ie(CloGaelach):4
+ * in(urd) = +in(urd-phonetic):4
+ * iu(basic) = +ca(ike):4
+ * lo(basic) = +la(basic):4
+ * kan(basic) = +in(kan):4
+ * mal(basic) = +in(mal):4
+ * mal(mlplusnum) = +in(mal):4
+ * ogham(basic) = +ie(ogam):4
+ * ogham(laptop) = +ie(ogam):4
+ * ogham(is434) = +ie(ogam_is434):4
+ * ogham(is434laptop) = +ie(ogam_is434):4
+ * ori(basic) = +in(ori):4
+ * ro(de) = +ro(winkeys):4
+ * ro(us) = +ro(std):4
+ * ro(academic) = +ro(std):4
+ * ro(std_comma) = +ro(std):4
+ * ro(comma) = +ro(basic):4
+ * ru(os) = +ru(os_legacy):4
+ * pk(urd) = +pk(urd-phonetic):4
+ * sapmi(basic) = +no(smi):4
+ * sapmi(nodeadkeys) = +no(smi_nodeadkeys):4
+ * sapmi(sefi) = +fi(smi):4
+ * sin(phonetic-static) = +in(sin_phonetic):4
+ * syr(basic) = +sy(syc):4
+ * syr(phonetic) = +sy(syc_phonetic):4
+ * tam(INSCRIPT) = +in(tam):4
+ * tam(UNI) = +in(tam_unicode):4
+ * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):4
+ * tam(TAB) = +in(tam_TAB):4
+ * tam(TSCII) = +in(tam_TSCII):4
+ * tel(basic) = +in(tel):4
+ * yu(basic) = +srp(latin):4
+ * yu(unicode) = +srp(latinunicode):4
+ * yu(yz) = +srp(latinyz):4
+ * yu(unicodeyz) = +srp(latinunicodeyz):4
+ nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):4
+ nokiarx51 * = +nokia_vndr/rx-51(%l[4]%_v[4]):4
+ * * = +%l[4]%(v[4]):4
+
+! model layout[2] variant[2] = symbols
+ * ben basic = +in(ben):2
+ * ben probhat = +in(ben_probhat):2
+ * dev basic = +in(deva):2
+ * dvorak $dvoraklayouts = +%v(dvorak):2
+ * dvorak basic = +us(dvorak):2
+ * dvorak pl_basic = +pl(dvorak):2
+ * dvorak pl = +pl(dvorak_quotes):2
+ * dvorak pl_altquotes = +pl(dvorak_altquotes):2
+ * dzdwi basic = +bt(basic):2
+ * fi basic = +fi(classic):2
+ * ge azerty_tskapo = +fr(geo):2
+ * guj basic = +in(guj):2
+ * gur basic = +in(guru):2
+ * ie laptop = +ie(basic):2
+ * ie CloGaelachLaptop = +ie(CloGaelach):2
+ * in urd = +in(urd-phonetic):2
+ * iu basic = +ca(ike):2
+ * lo basic = +la(basic):2
+ * kan basic = +in(kan):2
+ * mal basic = +in(mal):2
+ * mal mlplusnum = +in(mal):2
+ * ogham basic = +ie(ogam):2
+ * ogham laptop = +ie(ogam):2
+ * ogham is434 = +ie(ogam_is434):2
+ * ogham is434laptop = +ie(ogam_is434):2
+ * ori basic = +in(ori):2
+ * ro de = +ro(winkeys):2
+ * ro us = +ro(std):2
+ * ro academic = +ro(std):2
+ * ro std_comma = +ro(std):2
+ * ro comma = +ro(basic):2
+ * ru os = +ru(os_legacy):2
+ * pk urd = +pk(urd-phonetic):2
+ * sapmi basic = +no(smi):2
+ * sapmi nodeadkeys = +no(smi_nodeadkeys):2
+ * sapmi sefi = +fi(smi):2
+ * sin phonetic-static = +in(sin_phonetic):2
+ * syr basic = +sy(syc):2
+ * syr phonetic = +sy(syc_phonetic):2
+ * tam INSCRIPT = +in(tam):2
+ * tam UNI = +in(tam_unicode):2
+ * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):2
+ * tam TAB = +in(tam_TAB):2
+ * tam TSCII = +in(tam_TSCII):2
+ * tel basic = +in(tel):2
+ * yu basic = +srp(latin):2
+ * yu unicode = +srp(latinunicode):2
+ * yu yz = +srp(latinyz):2
+ * yu unicodeyz = +srp(latinunicodeyz):2
+
+! model layout[3] variant[3] = symbols
+ * ben basic = +in(ben):3
+ * ben probhat = +in(ben_probhat):3
+ * dev basic = +in(deva):3
+ * dvorak $dvoraklayouts = +%v(dvorak):3
+ * dvorak basic = +us(dvorak):3
+ * dvorak pl_basic = +pl(dvorak):3
+ * dvorak pl = +pl(dvorak_quotes):3
+ * dvorak pl_altquotes = +pl(dvorak_altquotes):3
+ * dzdwi basic = +bt(basic):3
+ * fi basic = +fi(classic):3
+ * ge azerty_tskapo = +fr(geo):3
+ * guj basic = +in(guj):3
+ * gur basic = +in(guru):3
+ * ie laptop = +ie(basic):3
+ * ie CloGaelachLaptop = +ie(CloGaelach):3
+ * in urd = +in(urd-phonetic):3
+ * iu basic = +ca(ike):3
+ * lo basic = +la(basic):3
+ * kan basic = +in(kan):3
+ * mal basic = +in(mal):3
+ * mal mlplusnum = +in(mal):3
+ * ogham basic = +ie(ogam):3
+ * ogham laptop = +ie(ogam):3
+ * ogham is434 = +ie(ogam_is434):3
+ * ogham is434laptop = +ie(ogam_is434):3
+ * ori basic = +in(ori):3
+ * ro de = +ro(winkeys):3
+ * ro us = +ro(std):3
+ * ro academic = +ro(std):3
+ * ro std_comma = +ro(std):3
+ * ro comma = +ro(basic):3
+ * ru os = +ru(os_legacy):3
+ * pk urd = +pk(urd-phonetic):3
+ * sapmi basic = +no(smi):3
+ * sapmi nodeadkeys = +no(smi_nodeadkeys):3
+ * sapmi sefi = +fi(smi):3
+ * sin phonetic-static = +in(sin_phonetic):3
+ * syr basic = +sy(syc):3
+ * syr phonetic = +sy(syc_phonetic):3
+ * tam INSCRIPT = +in(tam):3
+ * tam UNI = +in(tam_unicode):3
+ * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):3
+ * tam TAB = +in(tam_TAB):3
+ * tam TSCII = +in(tam_TSCII):3
+ * tel basic = +in(tel):3
+ * yu basic = +srp(latin):3
+ * yu unicode = +srp(latinunicode):3
+ * yu yz = +srp(latinyz):3
+ * yu unicodeyz = +srp(latinunicodeyz):3
+
+! model layout[4] variant[4] = symbols
+ * ben basic = +in(ben):4
+ * ben probhat = +in(ben_probhat):4
+ * dev basic = +in(deva):4
+ * dvorak $dvoraklayouts = +%v(dvorak):4
+ * dvorak basic = +us(dvorak):4
+ * dvorak pl_basic = +pl(dvorak):4
+ * dvorak pl = +pl(dvorak_quotes):4
+ * dvorak pl_altquotes = +pl(dvorak_altquotes):4
+ * dzdwi basic = +bt(basic):4
+ * fi basic = +fi(classic):4
+ * ge azerty_tskapo = +fr(geo):4
+ * guj basic = +in(guj):4
+ * gur basic = +in(guru):4
+ * ie laptop = +ie(basic):4
+ * ie CloGaelachLaptop = +ie(CloGaelach):4
+ * in urd = +in(urd-phonetic):4
+ * iu basic = +ca(ike):4
+ * lo basic = +la(basic):4
+ * kan basic = +in(kan):4
+ * mal basic = +in(mal):4
+ * mal mlplusnum = +in(mal):4
+ * ogham basic = +ie(ogam):4
+ * ogham laptop = +ie(ogam):4
+ * ogham is434 = +ie(ogam_is434):4
+ * ogham is434laptop = +ie(ogam_is434):4
+ * ori basic = +in(ori):4
+ * ro de = +ro(winkeys):4
+ * ro us = +ro(std):4
+ * ro academic = +ro(std):4
+ * ro std_comma = +ro(std):4
+ * ro comma = +ro(basic):4
+ * ru os = +ru(os_legacy):4
+ * pk urd = +pk(urd-phonetic):4
+ * sapmi basic = +no(smi):4
+ * sapmi nodeadkeys = +no(smi_nodeadkeys):4
+ * sapmi sefi = +fi(smi):4
+ * sin phonetic-static = +in(sin_phonetic):4
+ * syr basic = +sy(syc):4
+ * syr phonetic = +sy(syc_phonetic):4
+ * tam INSCRIPT = +in(tam):4
+ * tam UNI = +in(tam_unicode):4
+ * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):4
+ * tam TAB = +in(tam_TAB):4
+ * tam TSCII = +in(tam_TSCII):4
+ * tel basic = +in(tel):4
+ * yu basic = +srp(latin):4
+ * yu unicode = +srp(latinunicode):4
+ * yu yz = +srp(latinyz):4
+ * yu unicodeyz = +srp(latinunicodeyz):4
+
+! model = symbols
+ $evdevkbds = +inet(evdev)+inet(%m)
+ applealu_jis = +inet(evdev)+macintosh_vndr/jp(alujiskeys)
+ * = +inet(evdev)
+
+! layout variant = compat
+ de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+
+! layout[1] variant[1] = compat
+ de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)
+
+! layout[2] variant[2] = compat
+ de neo = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2
+
+! layout[3] variant[3] = compat
+ de neo = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3
+
+! layout[4] variant[4] = compat
+ de neo = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4
+
+! model layout = compat
+ pc98 nec_vndr/jp = pc98(basic)
+ * jp = complete+japan
+ olpc * = olpc
+ * * = complete
+
+! model layout[1] = compat
+ * * = complete
+
+! model = types
+ $macs = complete+numpad(mac)
+ $applealu = complete+numpad(mac)
+ $nokiamodels = complete+nokia
+ * = complete
+
+! layout option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle)
+ * misc:typo = +typo(base)
+
+! layout[1] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):1
+ * misc:typo = +typo(base):1
+
+! layout[2] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):2
+ * misc:typo = +typo(base):2
+
+! layout[3] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):3
+ * misc:typo = +typo(base):3
+
+! layout[4] option = symbols
+ $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):4
+ * misc:typo = +typo(base):4
+
+! option = symbols
+ grp:shift_toggle = +group(shifts_toggle)
+ altwin:menu = +altwin(menu)
+ altwin:meta_alt = +altwin(meta_alt)
+ altwin:ctrl_win = +altwin(ctrl_win)
+ altwin:ctrl_alt_win = +altwin(ctrl_alt_win)
+ altwin:meta_win = +altwin(meta_win)
+ altwin:left_meta_win = +altwin(left_meta_win)
+ altwin:hyper_win = +altwin(hyper_win)
+ altwin:alt_super_win = +altwin(alt_super_win)
+ altwin:swap_lalt_lwin = +altwin(swap_lalt_lwin)
+ grp:switch = +group(switch)
+ grp:lswitch = +group(lswitch)
+ grp:win_switch = +group(win_switch)
+ grp:lwin_switch = +group(lwin_switch)
+ grp:rwin_switch = +group(rwin_switch)
+ grp:toggle = +group(toggle)
+ grp:shifts_toggle = +group(shifts_toggle)
+ grp:ctrls_toggle = +group(ctrls_toggle)
+ grp:alts_toggle = +group(alts_toggle)
+ grp:caps_toggle = +capslock(grouplock)
+ grp:caps_switch = +capslock(groupshift)
+ grp:shift_caps_toggle = +group(shift_caps_toggle)
+ grp:shift_caps_switch = +group(shift_caps_switch)
+ grp:win_menu_switch = +group(win_menu_switch)
+ grp:alt_caps_toggle = +group(alt_caps_toggle)
+ grp:alt_space_toggle = +group(alt_space_toggle)
+ grp:menu_toggle = +group(menu_toggle)
+ grp:lwin_toggle = +group(lwin_toggle)
+ grp:rwin_toggle = +group(rwin_toggle)
+ grp:lshift_toggle = +group(lshift_toggle)
+ grp:rshift_toggle = +group(rshift_toggle)
+ grp:rctrl_switch = +group(rctrl_switch)
+ grp:lctrl_toggle = +group(lctrl_toggle)
+ grp:rctrl_toggle = +group(rctrl_toggle)
+ grp:lalt_toggle = +group(lalt_toggle)
+ grp:sclk_toggle = +group(sclk_toggle)
+ grp:lctrl_rctrl_switch = +group(lctrl_rctrl_switch)
+ grp:lctrl_lwin_rctrl_menu = +group(lctrl_lwin_rctrl_menu)
+ grp:lctrl_lalt_toggle = +group(lctrl_lalt_toggle)
+ grp:rctrl_ralt_toggle = +group(rctrl_ralt_toggle)
+ grp:ctrl_alt_toggle = +group(ctrl_alt_toggle)
+ grp:ctrl_alt_toggle_bidir = +group(ctrl_alt_toggle_bidir)
+ grp:lctrl_lshift_toggle = +group(lctrl_lshift_toggle)
+ grp:rctrl_rshift_toggle = +group(rctrl_rshift_toggle)
+ grp:ctrl_shift_toggle = +group(ctrl_shift_toggle)
+ grp:ctrl_shift_toggle_bidir = +group(ctrl_shift_toggle_bidir)
+ grp:lalt_lshift_toggle = +group(lalt_lshift_toggle)
+ grp:ralt_rshift_toggle = +group(ralt_rshift_toggle)
+ grp:alt_shift_toggle = +group(alt_shift_toggle)
+ grp:alt_shift_toggle_bidir = +group(alt_shift_toggle_bidir)
+ lv3:switch = +level3(switch)
+ lv3:ralt_switch = +level3(ralt_switch)
+ lv3:ralt_switch_multikey = +level3(ralt_switch_multikey)
+ lv3:ralt_alt = +level3(ralt_alt)
+ lv3:lalt_switch = +level3(lalt_switch)
+ lv3:alt_switch = +level3(alt_switch)
+ lv3:menu_switch = +level3(menu_switch)
+ lv3:win_switch = +level3(win_switch)
+ lv3:lwin_switch = +level3(lwin_switch)
+ lv3:rwin_switch = +level3(rwin_switch)
+ lv3:enter_switch = +level3(enter_switch)
+ caps:capslock = +capslock(capslock)
+ caps:numlock = +capslock(numlock)
+ caps:shiftlock = +capslock(shiftlock)
+ caps:swapescape = +capslock(swapescape)
+ caps:escape = +capslock(escape)
+ caps:backspace = +capslock(backspace)
+ caps:super = +capslock(super)
+ caps:hyper = +capslock(hyper)
+ caps:none = +capslock(none)
+ caps:ctrl_modifier = +capslock(ctrl_modifier)
+ ctrl:nocaps = +ctrl(nocaps)
+ ctrl:lctrl_meta = +ctrl(lctrl_meta)
+ ctrl:swapcaps = +ctrl(swapcaps)
+ ctrl:ac_ctrl = +ctrl(ac_ctrl)
+ ctrl:aa_ctrl = +ctrl(aa_ctrl)
+ ctrl:rctrl_ralt = +ctrl(rctrl_ralt)
+ ctrl:menu_rctrl = +ctrl(menu_rctrl)
+ ctrl:ralt_rctrl = +ctrl(ralt_rctrl)
+ compose:ralt = +compose(ralt)
+ compose:lwin = +compose(lwin)
+ compose:rwin = +compose(rwin)
+ compose:menu = +compose(menu)
+ compose:lctrl = +compose(lctrl)
+ compose:rctrl = +compose(rctrl)
+ compose:caps = +compose(caps)
+ compose:102 = +compose(102)
+ compose:paus = +compose(paus)
+ compose:prsc = +compose(prsc)
+ compose:sclk = +compose(sclk)
+ srvrkeys:none = +srvr_ctrl(no_srvr_keys)
+ eurosign:e = +eurosign(e)
+ eurosign:2 = +eurosign(2)
+ eurosign:4 = +eurosign(4)
+ eurosign:5 = +eurosign(5)
+ rupeesign:4 = +rupeesign(4)
+ keypad:oss = +keypad(oss)
+ keypad:legacy = +keypad(legacy)
+ keypad:legacy_wang = +keypad(legacy_wang)
+ keypad:oss_wang = +keypad(oss_wang)
+ keypad:future = +keypad(future)
+ keypad:future_wang = +keypad(future_wang)
+ keypad:hex = +keypad(ops)+keypad(hex)
+ keypad:atm = +keypad(ops)+keypad(hex)+keypad(atm)
+ nbsp:none = +nbsp(none)
+ nbsp:level2 = +nbsp(level2)
+ nbsp:level3 = +nbsp(level3)
+ nbsp:level3s = +nbsp(level3s)
+ nbsp:level3n = +nbsp(level3n)
+ nbsp:level4 = +nbsp(level4)
+ nbsp:level4n = +nbsp(level4n)
+ nbsp:level4nl = +nbsp(level4nl)
+ japan:nicola_f_bs = +jp(nicola_f_bs)
+ japan:hztg_escape = +jp(hztg_escape)
+ kpdl:dot = +kpdl(dot)
+ kpdl:comma = +kpdl(comma)
+ kpdl:dotoss = +kpdl(dotoss)
+ kpdl:dotoss_latin9 = +kpdl(dotoss_latin9)
+ kpdl:commaoss = +kpdl(commaoss)
+ kpdl:momayyezoss = +kpdl(momayyezoss)
+ kpdl:kposs = +kpdl(kposs)
+ kpdl:semi = +kpdl(semi)
+ shift:breaks_caps = +shift(breaks_caps)
+ esperanto:qwerty = +epo(qwerty)
+ esperanto:dvorak = +epo(dvorak)
+ terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp)
+ keypad:pointerkeys = +keypad(pointerkeys)
+ apple:alupckeys = +macintosh_vndr/apple(alupckeys)
+ shift:both_capslock = +shift(both_capslock)
+ shift:lshift_both_capslock = +shift(lshift_both_capslock)
+ shift:rshift_both_capslock = +shift(rshift_both_capslock)
+ shift:both_capslock_cancel = +shift(both_capslock_cancel)
+ shift:lshift_both_capslock_cancel = +shift(lshift_both_capslock_cancel)
+ shift:rshift_both_capslock_cancel = +shift(rshift_both_capslock_cancel)
+ shift:both_shiftlock = +shift(both_shiftlock)
+ shift:lshift_both_shiftlock = +shift(lshift_both_shiftlock)
+ shift:rshift_both_shiftlock = +shift(rshift_both_shiftlock)
+ lv3:caps_switch = +level3(caps_switch)
+ lv3:bksl_switch = +level3(bksl_switch)
+ lv3:lsgt_switch = +level3(lsgt_switch)
+ lv3:caps_switch_latch = +level3(caps_switch_latch)
+ lv3:bksl_switch_latch = +level3(bksl_switch_latch)
+ lv3:lsgt_switch_latch = +level3(lsgt_switch_latch)
+ lv5:lsgt_switch_lock = +level5(lsgt_switch_lock)
+ lv5:ralt_switch_lock = +level5(ralt_switch_lock)
+ lv5:lwin_switch_lock = +level5(lwin_switch_lock)
+ lv5:rwin_switch_lock = +level5(rwin_switch_lock)
+ lv5:lsgt_switch_lock_cancel = +level5(lsgt_switch_lock_cancel)
+ lv5:ralt_switch_lock_cancel = +level5(ralt_switch_lock_cancel)
+ lv5:lwin_switch_lock_cancel = +level5(lwin_switch_lock_cancel)
+ lv5:rwin_switch_lock_cancel = +level5(rwin_switch_lock_cancel)
+
+
+
+! option = compat
+ grp_led:num = +lednum(group_lock)
+ grp_led:caps = +ledcaps(group_lock)
+ grp_led:scroll = +ledscroll(group_lock)
+ caps:shiftlock = +ledcaps(shift_lock)
+ grab:break_actions = +xfree86(grab_break)
diff --git a/test/data/rules/groups b/test/data/rules/groups
new file mode 100644
index 0000000..15dc3c5
--- /dev/null
+++ b/test/data/rules/groups
@@ -0,0 +1,20 @@
+! $model_group = pc101 pc102 \
+ pc104\
+ pc105\
+ pc106
+! $layout_group = ar br cr us
+! $variant_group =
+
+! model = keycodes
+ $model_group = something(%m)
+ * = default_keycodes
+
+! layout variant = symbols
+ $layout_group * = my_symbols+%(v)
+ * * = default_symbols
+
+! model = types
+ * = default_types
+
+! model = compat
+ * = default_compat
diff --git a/test/data/rules/inc-dst-loop-twice b/test/data/rules/inc-dst-loop-twice
new file mode 100644
index 0000000..abb11b0
--- /dev/null
+++ b/test/data/rules/inc-dst-loop-twice
@@ -0,0 +1,20 @@
+! model = keycodes
+ * = default_keycodes
+
+! layout variant = symbols
+ my_layout my_variant = my_symbols+extra_variant
+
+! layout = symbols
+ my_layout = my_symbols
+ * = default_symbols
+
+! model = types
+ * = default_types
+
+! model = compat
+ * = default_compat
+
+! option = compat
+ my_option = |some:compat
+
+! include %S/inc-src-loop-twice
diff --git a/test/data/rules/inc-dst-simple b/test/data/rules/inc-dst-simple
new file mode 100644
index 0000000..a8d0605
--- /dev/null
+++ b/test/data/rules/inc-dst-simple
@@ -0,0 +1,18 @@
+! model = keycodes
+ my_model = my_keycodes
+ * = default_keycodes
+
+! layout variant = symbols
+ my_layout my_variant = my_symbols+extra_variant
+
+! layout = symbols
+ * = default_symbols
+
+! model = types
+ * = default_types
+
+! model = compat
+ * = default_compat
+
+! option = compat
+ my_option = |some:compat
diff --git a/test/data/rules/inc-src-before-after b/test/data/rules/inc-src-before-after
new file mode 100644
index 0000000..6ea34f0
--- /dev/null
+++ b/test/data/rules/inc-src-before-after
@@ -0,0 +1,7 @@
+! model = keycodes
+ before_model = my_keycodes
+
+! include %S/inc-dst-simple
+
+! layout = symbols
+ after_layout = my_symbols
diff --git a/test/data/rules/inc-src-loop-twice b/test/data/rules/inc-src-loop-twice
new file mode 100644
index 0000000..67e66c1
--- /dev/null
+++ b/test/data/rules/inc-src-loop-twice
@@ -0,0 +1,4 @@
+! model = keycodes
+ my_model = my_keycodes
+
+! include %S/inc-dst-loop-twice
diff --git a/test/data/rules/inc-src-looped b/test/data/rules/inc-src-looped
new file mode 100644
index 0000000..652abdd
--- /dev/null
+++ b/test/data/rules/inc-src-looped
@@ -0,0 +1 @@
+! include %S/inc-src-looped
diff --git a/test/data/rules/inc-src-nested b/test/data/rules/inc-src-nested
new file mode 100644
index 0000000..7f23207
--- /dev/null
+++ b/test/data/rules/inc-src-nested
@@ -0,0 +1 @@
+! include %S/inc-src-simple
diff --git a/test/data/rules/inc-src-options b/test/data/rules/inc-src-options
new file mode 100644
index 0000000..6fa13ec
--- /dev/null
+++ b/test/data/rules/inc-src-options
@@ -0,0 +1,10 @@
+! option = compat
+ option111 = +substring
+ option1 = +some:compat
+ option11 = +group(bla)
+
+! include %S/inc-dst-simple
+
+! option = symbols
+ option3 = +compose(foo)+keypad(bar)
+ colon:opt = +altwin(menu)
diff --git a/test/data/rules/inc-src-simple b/test/data/rules/inc-src-simple
new file mode 100644
index 0000000..afe4742
--- /dev/null
+++ b/test/data/rules/inc-src-simple
@@ -0,0 +1,4 @@
+! layout = symbols
+ my_layout = my_symbols
+
+! include %S/inc-dst-simple
diff --git a/test/data/rules/index b/test/data/rules/index
new file mode 100644
index 0000000..cc97ad1
--- /dev/null
+++ b/test/data/rules/index
@@ -0,0 +1,28 @@
+! $layouts = al az br cn us
+
+! layout option = symbols
+ $layouts some:opt = +extra
+
+! layout[1] option = symbols
+ $layouts some:opt = +extra:1
+
+! layout[2] option = symbols
+ $layouts some:opt = +extra:2
+
+! layout[3] option = symbols
+ $layouts some:opt = +extra:3
+
+! layout[4] option = symbols
+ $layouts some:opt = +extra:4
+
+! model = symbols
+ * = default_symbols
+
+! model = keycodes
+ * = default_keycodes
+
+! model = types
+ * = default_types
+
+! model = compat
+ * = default_compat
diff --git a/test/data/rules/multiple-options b/test/data/rules/multiple-options
new file mode 100644
index 0000000..afbdc9f
--- /dev/null
+++ b/test/data/rules/multiple-options
@@ -0,0 +1,27 @@
+! model = keycodes
+ my_model = my_keycodes
+ * = default_keycodes
+
+! layout variant = symbols
+ my_layout my_variant = my_symbols+extra_variant
+
+! layout = symbols
+ my_layout = my_symbols
+ * = default_symbols
+
+! model = types
+ my_model = my_types
+ * = default_types
+
+! model = compat
+ my_model = my_compat
+ * = default_compat
+
+! option = compat
+ option111 = +substring
+ option1 = +some:compat
+ option11 = +group(bla)
+
+! option = symbols
+ option3 = +compose(foo)+keypad(bar)
+ colon:opt = +altwin(menu)
diff --git a/test/data/rules/simple b/test/data/rules/simple
new file mode 100644
index 0000000..446954e
--- /dev/null
+++ b/test/data/rules/simple
@@ -0,0 +1,21 @@
+! model = keycodes
+ my_model = my_keycodes
+ * = default_keycodes
+
+! layout variant = symbols
+ my_layout my_variant = my_symbols+extra_variant
+
+! layout = symbols
+ my_layout = my_symbols
+ * = default_symbols
+
+! model = types
+ my_model = my_types
+ * = default_types
+
+! model = compat
+ my_model = my_compat
+ * = default_compat
+
+! option = compat
+ my_option = |some:compat
diff --git a/test/data/symbols/altwin b/test/data/symbols/altwin
new file mode 100644
index 0000000..7240ab8
--- /dev/null
+++ b/test/data/symbols/altwin
@@ -0,0 +1,116 @@
+// Meta is mapped to second level of Alt.
+partial modifier_keys
+xkb_symbols "meta_alt" {
+ key <LALT> { [ Alt_L, Meta_L ] };
+ key <RALT> { type[Group1] = "TWO_LEVEL",
+ symbols[Group1] = [ Alt_R, Meta_R ] };
+ modifier_map Mod1 { Alt_L, Alt_R, Meta_L, Meta_R };
+// modifier_map Mod4 {};
+};
+
+// Alt is mapped to the Super and the usual Alt.
+partial modifier_keys
+xkb_symbols "alt_win" {
+ key <LWIN> { [ Alt_L ] };
+ key <RWIN> { [ Alt_R ] };
+ modifier_map Mod1 { <LWIN>, <RWIN> };
+};
+
+// Ctrl is mapped to the Super and the usual Ctrl keys.
+partial modifier_keys
+xkb_symbols "ctrl_win" {
+ key <LWIN> { [ Control_L ] };
+ key <RWIN> { [ Control_R ] };
+ modifier_map Control { <LWIN>, <RWIN> };
+};
+
+// Ctrl is mapped to the Alt, Alt to the Super, and Win to the Ctrl keys.
+partial modifier_keys
+xkb_symbols "ctrl_alt_win" {
+ key <LALT> { [ Control_L, Control_L ] };
+ key <RALT> { type[Group1] = "TWO_LEVEL",
+ symbols[Group1] = [ Control_R, Control_R ] };
+ key <LWIN> { [ Alt_L, Meta_L ] };
+ key <RWIN> { [ Alt_R, Meta_R ] };
+ key <LCTL> { [ Super_L ] };
+ key <RCTL> { [ Super_R ] };
+ modifier_map Control { <RALT>, <LALT> };
+ modifier_map Mod1 { <LWIN>, <RWIN> };
+ modifier_map Mod4 { <LCTL>, <RCTL> };
+};
+
+// Meta is mapped to the Super.
+partial modifier_keys
+xkb_symbols "meta_win" {
+ key <LALT> { [ Alt_L, Alt_L ] };
+ key <RALT> { type[Group1] = "TWO_LEVEL",
+ symbols[Group1] = [ Alt_R, Alt_R ] };
+ key <LWIN> { [ Meta_L ] };
+ key <RWIN> { [ Meta_R ] };
+ modifier_map Mod1 { Alt_L, Alt_R };
+ modifier_map Mod4 { <META>, Meta_L, Meta_R };
+};
+
+// Meta is mapped to the left Win key.
+partial modifier_keys
+xkb_symbols "left_meta_win" {
+ key <LALT> { [ Alt_L, Alt_L ] };
+ key <LWIN> { [ Meta_L ] };
+ modifier_map Mod1 { Alt_L };
+ modifier_map Mod4 { <META>, Meta_L };
+};
+
+// Hyper is mapped to the Super.
+partial modifier_keys
+xkb_symbols "hyper_win" {
+ key <LWIN> { [ Hyper_L ] };
+ key <RWIN> { [ Hyper_R ] };
+ modifier_map Mod4 { Hyper_L, Hyper_R };
+};
+
+// Menu is mapped to the Menu key.
+partial modifier_keys
+xkb_symbols "menu" {
+ key <MENU> { [ Menu ] };
+};
+
+// Layout for Tux key caps with additional right Alt key
+partial modifier_keys
+xkb_symbols "alt_super_win" {
+ key <LALT> { [ Alt_L, Meta_L ] };
+ key <RWIN> { [ Alt_R, Meta_R ] };
+ key <LWIN> { [ Super_L ]};
+ key <MENU> { [ Super_R ] };
+ modifier_map Mod1 { Alt_L, Alt_R, Meta_L, Meta_R };
+ modifier_map Mod4 { Super_L, Super_R };
+};
+
+// Swap the Alt and Super.
+partial modifier_keys
+xkb_symbols "swap_alt_win" {
+ include "altwin(swap_lalt_lwin)"
+ include "altwin(swap_ralt_rwin)"
+};
+
+// Swap the left Alt and Super.
+partial modifier_keys
+xkb_symbols "swap_lalt_lwin" {
+ key <LALT> { type[Group1] = "ONE_LEVEL",
+ symbols[Group1] = [ Super_L ] };
+ key <LWIN> { [ Alt_L, Meta_L ] };
+};
+
+// Swap the right Alt and Super.
+hidden partial modifier_keys
+xkb_symbols "swap_ralt_rwin" {
+ key <RALT> { type[Group1] = "ONE_LEVEL",
+ symbols[Group1] = [ Super_R ] };
+ key <RWIN> { [ Alt_R, Meta_R ] };
+};
+
+// Win is mapped to the PrtSc key (and the usual Win key).
+partial modifier_keys
+xkb_symbols "prtsc_rwin" {
+ replace key <PRSC> { [ Super_R, Super_R ] };
+ modifier_map Mod4 { <PRSC>, <RWIN> };
+};
diff --git a/test/data/symbols/awesome b/test/data/symbols/awesome
new file mode 100644
index 0000000..a8d38c4
--- /dev/null
+++ b/test/data/symbols/awesome
@@ -0,0 +1,26 @@
+default alphanumeric_keys modifier_keys function_keys alternate_group
+xkb_symbols "awesome" {
+ include "us"
+
+ name[Group1]= "My Awesome Layout";
+
+ key <AE02> { [ 2, at, Page_Up, Page_Up ] };
+ key <AE03> { [ 3, numbersign, Page_Down, Page_Down ] };
+
+ key <AD01> { [ q, Q, Escape, Escape ] };
+ key <AD02> { [ w, W, Home, Home ] };
+ key <AD03> {
+ type="THREE_LEVEL",
+ symbols=[ e, E, Up]
+ };
+ key <AD04> { [ r, R, End, End ] };
+ key <AD05> { [ t, T, Tab, Tab ] };
+
+ key <AC01> { [ a, A, Return, Return ] };
+ key <AC02> { [ s, S, Left] };
+ key <AC03> { [ d, D, Down] };
+ key <AC04> { [ f, F, Righ] };
+ key <AC05> { [ g, G, BackSpace, BackSpace ] };
+
+ key <AB05> { [ b, B, Delete, Delete ] };
+};
diff --git a/test/data/symbols/ca b/test/data/symbols/ca
new file mode 100644
index 0000000..84f153c
--- /dev/null
+++ b/test/data/symbols/ca
@@ -0,0 +1,531 @@
+default partial
+xkb_symbols "fr" {
+ name[Group1] = "French (Canada)";
+
+ key <TLDE> { [ numbersign, bar, backslash ] };
+ key <AE01> { [ 1, exclam, plusminus ] };
+ key <AE02> { [ 2, quotedbl, at ] };
+ key <AE03> { [ 3, slash, sterling ] };
+ key <AE04> { [ 4, dollar, cent ] };
+ key <AE05> { [ 5, percent, currency ] };
+ key <AE06> { [ 6, question, notsign ] };
+ key <AE07> { [ 7, ampersand, brokenbar ] };
+ key <AE08> { [ 8, asterisk, twosuperior ] };
+ key <AE09> { [ 9, parenleft, threesuperior ] };
+ key <AE10> { [ 0, parenright, onequarter ] };
+ key <AE11> { [ minus, underscore, onehalf ] };
+ key <AE12> { [ equal, plus, threequarters ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E ] };
+ key <AD04> { [ r, R ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ y, Y ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I ] };
+ key <AD09> { [ o, O, section ] };
+ key <AD10> { [ p, P, paragraph ] };
+ key <AD11> { [dead_circumflex, dead_circumflex, bracketleft ] };
+ key <AD12> { [ dead_cedilla, dead_diaeresis, bracketright ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ d, D ] };
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ j, J ] };
+ key <AC08> { [ k, K ] };
+ key <AC09> { [ l, L ] };
+ key <AC10> { [ semicolon, colon, asciitilde ] };
+ key <AC11> { [dead_grave, dead_grave, braceleft ] };
+ key <BKSL> { [ less, greater, braceright ] };
+
+ key <LSGT> { [guillemotleft, guillemotright, degree] };
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ m, M, mu ] };
+ key <AB08> { [ comma, apostrophe, macron ] };
+ key <AB09> { [ period, period, hyphen ] };
+ key <AB10> { [ eacute, Eacute, dead_acute ] };
+
+ key <SPCE> { [ space, space, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+};
+
+xkb_symbols "fr-dvorak" {
+ name[Group1] = "French (Canada, Dvorak)";
+
+ key <TLDE> { [ numbersign, bar, backslash ] };
+ key <AE01> { [ 1, exclam, plusminus ] };
+ key <AE02> { [ 2, quotedbl, at ] };
+ key <AE03> { [ 3, slash, sterling ] };
+ key <AE04> { [ 4, dollar, cent ] };
+ key <AE05> { [ 5, percent, currency ] };
+ key <AE06> { [ 6, question, notsign ] };
+ key <AE07> { [ 7, ampersand, brokenbar ] };
+ key <AE08> { [ 8, asterisk, twosuperior ] };
+ key <AE09> { [ 9, parenleft, threesuperior ] };
+ key <AE10> { [ 0, parenright, onequarter ] };
+ key <AE11> { [dead_circumflex, dead_circumflex, bracketleft ] };
+ key <AE12> { [ dead_cedilla, dead_diaeresis, bracketright ] };
+
+ key <AD01> { [dead_grave, dead_grave, braceleft ] };
+ key <AD02> { [ comma, apostrophe, macron ] };
+ key <AD03> { [ period, period, hyphen ] };
+ key <AD04> { [ p, P, paragraph ] };
+ key <AD05> { [ y, Y ] };
+ key <AD06> { [ f, F ] };
+ key <AD07> { [ g, G ] };
+ key <AD08> { [ c, C ] };
+ key <AD09> { [ r, R ] };
+ key <AD10> { [ l, L ] };
+ key <AD11> { [ eacute, Eacute, dead_acute ] };
+ key <AD12> { [ equal, plus, threequarters ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ o, O, section ] };
+ key <AC03> { [ e, E ] };
+ key <AC04> { [ u, U ] };
+ key <AC05> { [ i, I ] };
+ key <AC06> { [ d, D ] };
+ key <AC07> { [ h, H ] };
+ key <AC08> { [ t, T ] };
+ key <AC09> { [ n, N ] };
+ key <AC10> { [ s, S ] };
+ key <AC11> { [ minus, underscore, onehalf ] };
+ key <BKSL> { [ less, greater, braceright ] };
+
+ key <LSGT> { [guillemotleft, guillemotright, degree] };
+ key <AB01> { [ semicolon, colon, asciitilde ] };
+ key <AB02> { [ q, Q ] };
+ key <AB03> { [ j, J ] };
+ key <AB04> { [ k, K ] };
+ key <AB05> { [ x, X ] };
+ key <AB06> { [ b, B ] };
+ key <AB07> { [ m, M, mu ] };
+ key <AB08> { [ w, W ] };
+ key <AB09> { [ v, V ] };
+ key <AB10> { [ z, Z ] };
+
+ key <SPCE> { [ space, space, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial
+xkb_symbols "fr-legacy" {
+
+ include "ca(fr)"
+
+ name[Group1] = "French (Canada, legacy)";
+
+ key <TLDE> { [ degree, degree, notsign ] };
+ key <AE01> { [ 1, exclam, onesuperior ] };
+
+ key <AE03> { [ 3, numbersign, threesuperior ] };
+ key <AE04> { [ 4, dollar, onequarter ] };
+ key <AE05> { [ 5, percent, onehalf ] };
+ key <AE06> { [ 6, question, threequarters ] };
+ key <AE07> { [ 7, ampersand, braceleft ] };
+ key <AE08> { [ 8, asterisk, bracketleft ] };
+ key <AE09> { [ 9, parenleft, bracketright, plusminus ] };
+ key <AE10> { [ 0, parenright, braceright ] };
+ key <AE11> { [ minus, underscore, bar, questiondown] };
+ key <AE12> { [ equal, plus, dead_cedilla ] };
+
+ key <AD04> { [ r, R, paragraph, registered ] };
+ key <AD06> { [ y, Y, yen ] };
+ key <AD09> { [ o, O, oslash, Ooblique ] };
+ key <AD10> { [ p, P, thorn, THORN ] };
+ key <AD11> { [dead_circumflex, dead_circumflex, degree ] };
+ key <AD12> { [ ccedilla, Ccedilla, dead_tilde, dead_diaeresis ] };
+
+ key <AC01> { [ a, A, ae, AE ] };
+ key <AC02> { [ s, S, ssharp, section ] };
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, ordfeminine ] };
+ key <AC10> { [ semicolon, colon, dead_acute, dead_acute ] };
+ key <AC11> { [ egrave, Egrave ] };
+ key <BKSL> { [ agrave, Agrave, dead_grave ] };
+
+ key <LSGT> { [ ugrave, Ugrave, backslash, bar ] };
+ key <AB01> { [ z, Z, guillemotleft ] };
+ key <AB02> { [ x, X, guillemotright ] };
+ key <AB03> { [ c, C, cent, copyright ] };
+ key <AB07> { [ m, M, mu, masculine ] };
+ key <AB08> { [ comma, apostrophe, less ] };
+ key <AB09> { [ period, period, greater ] };
+ key <AB10> { [ eacute, Eacute, slash ] };
+};
+
+partial
+xkb_symbols "multi" {
+
+ include "ca(fr)"
+
+ name[Group1] = "Canadian Multilingual (1st part)";
+
+ key <TLDE> { [ slash, backslash, bar ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, question ] };
+ key <AE07> { [ 7, ampersand, braceleft ] };
+ key <AE08> { [ 8, asterisk, braceright ] };
+ key <AE09> { [ 9, parenleft, bracketleft ] };
+ key <AE10> { [ 0, parenright, bracketright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus, notsign ] };
+
+ key <AD09> { [ o, O ] };
+ key <AD10> { [ p, P ] };
+ key <AD11> { [dead_circumflex, dead_diaeresis, dead_grave ] };
+ key <AD12> { [ ccedilla, Ccedilla, asciitilde ] };
+
+ key <AC10> { [ semicolon, colon, degree ] };
+ key <AC11> { [ egrave, Egrave ] };
+ key <BKSL> { [ agrave, Agrave ] };
+
+ key <LSGT> { [ ugrave, Ugrave ] };
+ key <AB01> { [ z, Z, guillemotleft ] };
+ key <AB02> { [ x, X, guillemotright ] };
+ key <AB08> { [ comma, apostrophe, less ] };
+ key <AB09> { [ period, quotedbl, greater ] };
+ key <AB10> { [ eacute, Eacute ] };
+};
+
+partial
+xkb_symbols "multi-2gr" {
+
+ name[Group1] = "Canadian Multilingual (2nd part)";
+
+ key <TLDE> { [ NoSymbol, hyphen ] };
+ key <AE01> { [ onesuperior, exclamdown ] };
+ key <AE02> { [ twosuperior, NoSymbol ] };
+ key <AE03> { [ threesuperior, sterling ] };
+ key <AE04> { [ onequarter, currency ] };
+ key <AE05> { [ onehalf,threeeighths ] };
+ key <AE06> { [ threequarters, fiveeighths ] };
+ key <AE07> { [ NoSymbol,seveneighths ] };
+ key <AE08> { [ NoSymbol, trademark ] };
+ key <AE09> { [ NoSymbol, plusminus ] };
+
+ key <AE11> { [ NoSymbol, questiondown] };
+ key <AE12> { [ dead_cedilla, dead_ogonek ] };
+
+ key <AD01> { [ NoSymbol, Greek_OMEGA ] };
+ key <AD02> { [ lstroke, Lstroke ] };
+ key <AD03> { [ oe, OE ] };
+ key <AD04> { [ paragraph, registered ] };
+ key <AD05> { [ tslash, Tslash ] };
+ key <AD06> { [ leftarrow, yen ] };
+ key <AD07> { [ downarrow, uparrow ] };
+ key <AD08> { [ rightarrow, idotless ] };
+ key <AD09> { [ oslash, Ooblique ] };
+ key <AD10> { [ thorn, THORN ] };
+ key <AD11> { [ NoSymbol, dead_abovering ] };
+ key <AD12> { [ dead_tilde, dead_macron ] };
+
+ key <AC01> { [ ae, AE ] };
+ key <AC02> { [ ssharp, section ] };
+ key <AC03> { [ eth, ETH ] };
+ key <AC04> { [ NoSymbol, ordfeminine ] };
+ key <AC05> { [ eng, ENG ] };
+ key <AC06> { [ hstroke, Hstroke ] };
+ key <AC07> { [ U0133, U0132 ] };
+ key <AC08> { [ kra, NoSymbol ] };
+ key <AC09> { [ U0140, U013F ] };
+ key <AC10> { [ dead_acute, dead_doubleacute ] };
+ key <AC11> { [ NoSymbol, dead_caron ] };
+ key <BKSL> { [ NoSymbol, dead_breve ] };
+
+
+ key <LSGT> { [ NoSymbol, brokenbar ] };
+
+ key <AB03> { [ cent, copyright ] };
+ key <AB04> { [ leftdoublequotemark, leftsinglequotemark ] };
+ key <AB05> { [ rightdoublequotemark, rightsinglequotemark ] };
+ key <AB06> { [ U0149, U266A ] };
+ key <AB07> { [ mu, masculine ] };
+ key <AB08> { [ Greek_horizbar, multiply ] };
+ key <AB09> { [ periodcentered, division ] };
+ key <AB10> { [ NoSymbol, dead_abovedot ] };
+};
+
+// based on
+// Inuktitut keyboard for X11
+// written by Pablo Saratxaga <pablo@mandrakesoft.com>
+
+alphanumeric_keys
+xkb_symbols "ike" {
+
+ name[Group1]= "Inuktitut";
+
+ key <AE01> { [ 0x01001595, 1 ] };
+ key <AE02> { [ 0x01001449, 2 ] };
+ key <AE03> { [ 0x01001550, 3 ] };
+ key <AE04> { [ 0x01001483, 4 ] };
+ key <AE05> { [ 0x01001466, 5 ] };
+ key <AE06> { [ 0x01001585, 6 ] };
+ key <AE07> { [ 0x010014bb, 7 ] };
+ key <AE08> { [ 0x010014d0, 8 ] };
+ key <AE09> { [ 0x010014ea, 9 ] };
+ key <AE10> { [ 0x0100153e, 0 ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ 0x0100155d, equal ] };
+
+ key <AD01> { [ 0x0100158f, 0x0100148b ] };
+ key <AD02> { [ 0x01001403, 0x01001431 ] };
+ key <AD03> { [ 0x0100157f, 0x01001546 ] };
+ key <AD04> { [ 0x0100146d, 0x01001596 ] };
+ key <AD05> { [ 0x0100144e, 0x01001671 ] };
+ key <AD06> { [ 0x010014ef, 0x01001673 ] };
+ key <AD07> { [ 0x010014a5, 0x01001675 ] };
+ key <AD08> { [ 0x010014c2, 0x010015a4 ] };
+ key <AD09> { [ 0x010014d5, 0x010015a0 ] };
+ key <AD10> { [ 0x01001528, 0x010015a6 ] };
+ key <AD11> { [ 0x010014a1, 0x01001505 ] };
+ key <AD12> { [ dead_abovedot, 0x0100141e] };
+
+ key <AC01> { [ 0x01001591, 0x0100148d ] };
+ key <AC02> { [ 0x01001405, 0x01001433 ] };
+ key <AC03> { [ 0x01001581, 0x01001548 ] };
+ key <AC04> { [ 0x0100146f, 0x01001555 ] };
+ key <AC05> { [ 0x01001450, parenleft ] };
+ key <AC06> { [ 0x010014f1, parenright ] };
+ key <AC07> { [ 0x010014a7, 0x0100152a ] };
+ key <AC08> { [ 0x010014c4, 0x01001557 ] };
+ key <AC09> { [ 0x010014d7, 0x010015a2 ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ 0x01001593, 0x01001490 ] };
+ key <AB02> { [ 0x0100140a, 0x01001438 ] };
+ key <AB03> { [ 0x01001583, 0x0100154b ] };
+ key <AB04> { [ 0x01001472, question ] };
+ key <AB05> { [ 0x01001455, 0x0100157c ] };
+ key <AB06> { [ 0x010014f4, 0x010014c7 ] };
+ key <AB07> { [ 0x010014aa, 0x010014da ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ 0x0100152d, 0x01001559 ] };
+
+ key <TLDE> { [ 0x0100157b, 0x01001575 ] };
+ key <LSGT> { [ 0x01001579, 0x01001577 ] };
+ key <BKSL> { [ backslash, bar ] };
+};
+
+partial
+xkb_symbols "multix" {
+
+ name[Group1] = "Canadian Multilingual";
+
+ key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
+ key <TLDE> { [ slash, backslash, bar, NoSymbol,
+ NoSymbol, hyphen ] };
+ key <AE01> { [ 1, exclam, plusminus, NoSymbol,
+ onesuperior, exclamdown ] };
+ key <AE02> { [ 2, at, at, NoSymbol,
+ twosuperior, NoSymbol ] };
+ key <AE03> { [ 3, numbersign, sterling, NoSymbol,
+ threesuperior, sterling ] };
+ key <AE04> { [ 4, dollar, cent, NoSymbol,
+ onequarter, currency ] };
+ key <AE05> { [ 5, percent, currency, NoSymbol,
+ onehalf, threeeighths ] };
+ key <AE06> { [ 6, question, notsign, NoSymbol,
+ threequarters, fiveeighths ] };
+ key <AE07> { [ 7, ampersand, braceleft, NoSymbol,
+ NoSymbol, seveneighths ] };
+ key <AE08> { [ 8, asterisk, braceright, NoSymbol,
+ NoSymbol, trademark ] };
+ key <AE09> { [ 9, parenleft, bracketleft, NoSymbol,
+ NoSymbol, plusminus ] };
+ key <AE10> { [ 0, parenright, bracketright, NoSymbol ] };
+ key <AE11> { [ minus, underscore, onehalf, NoSymbol,
+ NoSymbol, questiondown] };
+ key <AE12> { [ equal, plus, notsign, NoSymbol,
+ dead_cedilla, dead_ogonek ] };
+
+ key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
+ key <AD01> { [ q, Q, NoSymbol, NoSymbol,
+ NoSymbol, Greek_OMEGA ] };
+ key <AD02> { [ w, W, NoSymbol, NoSymbol,
+ lstroke, Lstroke ] };
+ key <AD03> { [ e, E, NoSymbol, NoSymbol,
+ oe, OE ] };
+ key <AD04> { [ r, R, NoSymbol, NoSymbol,
+ paragraph, registered ] };
+ key <AD05> { [ t, T, NoSymbol, NoSymbol,
+ tslash, Tslash ] };
+ key <AD06> { [ y, Y, NoSymbol, NoSymbol,
+ leftarrow, yen ] };
+ key <AD07> { [ u, U, NoSymbol, NoSymbol,
+ downarrow, uparrow ] };
+ key <AD08> { [ i, I, NoSymbol, NoSymbol,
+ rightarrow, idotless ] };
+ key <AD09> { [ o, O, section, NoSymbol,
+ oslash, Ooblique ] };
+ key <AD10> { [ p, P, paragraph, NoSymbol,
+ thorn, THORN ] };
+
+ key.type[group1]="EIGHT_LEVEL";
+ key <AD11> { [dead_circumflex, dead_diaeresis, dead_grave, NoSymbol,
+ NoSymbol, dead_abovering ] };
+
+ key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
+ key <AD12> { [ ccedilla, Ccedilla, asciitilde, NoSymbol,
+ dead_tilde, dead_macron ] };
+
+ key <AC01> { [ a, A, NoSymbol, NoSymbol,
+ ae, AE ] };
+ key <AC02> { [ s, S, NoSymbol, NoSymbol,
+ ssharp, section ] };
+ key <AC03> { [ d, D, NoSymbol, NoSymbol,
+ eth, ETH ] };
+ key <AC04> { [ f, F, NoSymbol, NoSymbol,
+ NoSymbol, ordfeminine ] };
+ key <AC05> { [ g, G, NoSymbol, NoSymbol,
+ eng, ENG ] };
+ key <AC06> { [ h, H, NoSymbol, NoSymbol,
+ hstroke, Hstroke ] };
+ key <AC07> { [ j, J, NoSymbol, NoSymbol,
+ U0133, U0132 ] };
+ key <AC08> { [ k, K, NoSymbol, NoSymbol,
+ kra, NoSymbol ] };
+ key <AC09> { [ l, L, NoSymbol, NoSymbol,
+ U0140, U013F ] };
+
+ key.type[group1]="EIGHT_LEVEL";
+ key <AC10> { [ semicolon, colon, degree, NoSymbol,
+ dead_acute, dead_doubleacute ] };
+
+ key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
+ key <AC11> { [ egrave, Egrave, braceleft, NoSymbol,
+ NoSymbol, dead_caron ] };
+ key <BKSL> { [ agrave, Agrave, braceright, NoSymbol,
+ NoSymbol, dead_breve ] };
+
+ key <LSGT> { [ ugrave, Ugrave, degree, NoSymbol,
+ NoSymbol, brokenbar ] };
+
+ key.type[group1]="FOUR_LEVEL_SEMIALPHABETIC";
+ key <AB01> { [ z, Z, guillemotleft, NoSymbol ] };
+ key <AB02> { [ x, X, guillemotright, NoSymbol ] };
+
+ key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
+ key <AB03> { [ c, C, NoSymbol, NoSymbol,
+ cent, copyright ] };
+ key <AB04> { [ v, V, NoSymbol, NoSymbol,
+ leftdoublequotemark, leftsinglequotemark ] };
+ key <AB05> { [ b, B, NoSymbol, NoSymbol,
+ rightdoublequotemark, rightsinglequotemark ] };
+ key <AB06> { [ n, N, NoSymbol, NoSymbol,
+ U0149, U266A ] };
+ key <AB07> { [ m, M, mu, NoSymbol,
+ mu, masculine ] };
+ key <AB08> { [ comma, apostrophe, less, NoSymbol,
+ Greek_horizbar, multiply ] };
+ key <AB09> { [ period, quotedbl, greater, NoSymbol,
+ periodcentered, division ] };
+ key <AB10> { [ eacute, Eacute, dead_acute, NoSymbol,
+ NoSymbol, dead_abovedot ] };
+
+ include "nbsp(level3s)"
+
+ modifier_map Control{ Control_L };
+
+ include "level3(ralt_switch)"
+ include "level5(rctrl_switch)"
+};
+
+// OLPC Section
+xkb_symbols "olpc" {
+
+ include "ca(fr)"
+
+ key <AE02> { [ 2, quotedbl, ograve, Ograve ] };
+ key <AE03> { [ 3, slash, at, VoidSymbol ] };
+
+ key <AD03> { [ e, E, EuroSign, VoidSymbol] };
+
+ key <AB09> { [ period, period, 0x1002010 ] };
+
+ key <I219> { [ guillemotleft, guillemotright, degree, VoidSymbol ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "eng" {
+ include "us(basic)"
+ name[Group1] = "English (Canada)";
+
+ key <LSGT> { [ backslash, bar, VoidSymbol, VoidSymbol ] };
+};
+
+// EXTRAS:
+
+partial alphanumeric_keys
+xkb_symbols "kut" {
+
+ // Ejective U0313 and acute accents are taken from shs layout.
+ include "ca(shs)"
+
+ name[Group1]= "Kutenai";
+
+ // Alveolar Click
+ key <AD05> { [ t, T,U01C2 ,U01C2 ] };
+
+ //Cent sign
+ key <AB03> { [ c, C,U00A2,U00A2 ] };
+
+ //Mid dot
+ key <AB09> { [ period, greater,U00B7 ] };
+
+ //Glottal stop
+ key <AB10> { [ slash, question, U0294 ] };
+
+ //COMBINING COMMA ABOVE RIGHT
+ key <AC11> { [ apostrophe, quotedbl, U0315,U0315 ] };
+
+ //MODIFIER LETTER RIGHT HALF RING
+ key <AC10> { [ semicolon, colon,U02BE,U02BE ] };
+};
+
+// Secwepemctsin keyboard for X11
+// written by Neskie Manuel <neskiem@gmail.com>
+partial alphanumeric_keys
+xkb_symbols "shs" {
+
+ include "us"
+
+ name[Group1]= "Secwepemctsin";
+
+ // Using a "dead key" to get a COMBINING COMMA ABOVE
+ // for ejectives on q, l, t, s, m, g, k, p, w, y, r.
+ // The Compose key is used for the other acutes and grave.
+
+ key <AB08> { [ comma, less, U0313 ] };
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+
+ include "level3(ralt_switch)"
+ include "compose(rctrl)"
+};
+
+
+partial alphanumeric_keys
+ xkb_symbols "sun_type6" {
+ include "sun_vndr/ca(sun_type6)"
+};
diff --git a/test/data/symbols/capslock b/test/data/symbols/capslock
new file mode 100644
index 0000000..6b85c3d
--- /dev/null
+++ b/test/data/symbols/capslock
@@ -0,0 +1,79 @@
+default hidden partial modifier_keys
+xkb_symbols "capslock" {
+ replace key <CAPS> { [ Caps_Lock ] };
+ modifier_map Lock { Caps_Lock };
+};
+
+hidden partial modifier_keys
+xkb_symbols "shiftlock" {
+ replace key <CAPS> { [ Shift_Lock ] };
+ modifier_map Shift { Shift_Lock };
+};
+
+hidden partial modifier_keys
+xkb_symbols "grouplock" {
+ replace key <CAPS> { [ ISO_Next_Group, Caps_Lock ] };
+};
+
+hidden partial modifier_keys
+xkb_symbols "groupshift" {
+ key <CAPS> {
+ type[Group1] = "PC_ALT_LEVEL2",
+ [ Mode_switch, Caps_Lock ]
+ };
+};
+
+hidden partial modifier_keys
+xkb_symbols "swapescape" {
+ key <CAPS> { [ Escape ] };
+ key <ESC> { [ Caps_Lock ] };
+};
+
+hidden partial modifier_keys
+xkb_symbols "escape" {
+ key <CAPS> { [ Escape ] };
+};
+
+hidden partial modifier_keys
+xkb_symbols "backspace" {
+ key <CAPS> { [ BackSpace ] };
+};
+
+hidden partial modifier_keys
+xkb_symbols "super" {
+ key <CAPS> { [ Super_L ] };
+ modifier_map Mod4 { <CAPS> };
+};
+
+hidden partial modifier_keys
+xkb_symbols "hyper" {
+ key <CAPS> { [ Hyper_L ] };
+ modifier_map Mod4 { <CAPS> };
+};
+
+hidden partial modifier_keys
+xkb_symbols "menu" {
+ key <CAPS> { [ Menu ] };
+};
+
+hidden partial modifier_keys
+xkb_symbols "numlock" {
+ key <CAPS> { [ Num_Lock ] };
+};
+
+// This changes the <CAPS> key to become a Control modifier,
+// but it will still produce the Caps_Lock keysym.
+hidden partial modifier_keys
+xkb_symbols "ctrl_modifier" {
+ replace key <CAPS> {
+ type[Group1] = "ONE_LEVEL",
+ symbols[Group1] = [ Caps_Lock ],
+ actions[Group1] = [ SetMods(modifiers=Control) ]
+ };
+ modifier_map Control { <CAPS> };
+};
+
+hidden partial modifier_keys
+xkb_symbols "none" {
+ key <CAPS> { [ VoidSymbol ] };
+};
diff --git a/test/data/symbols/ch b/test/data/symbols/ch
new file mode 100644
index 0000000..a87f93a
--- /dev/null
+++ b/test/data/symbols/ch
@@ -0,0 +1,217 @@
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin"
+ name[Group1]= "German (Switzerland)";
+
+ key <TLDE> { [ section, degree ] };
+ key <AE01> { [ 1, plus, bar, exclamdown ] };
+ key <AE02> { [ 2, quotedbl, at, oneeighth ] };
+ key <AE03> { [ 3, asterisk, numbersign ] };
+ key <AE04> { [ 4, ccedilla ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, ampersand, notsign ] };
+ key <AE07> { [ 7, slash, bar ] };
+ key <AE08> { [ 8, parenleft, cent ] };
+ key <AE09> { [ 9, parenright ] };
+ key <AE10> { [ 0, equal ] };
+ key <AE11> { [ apostrophe, question, dead_acute ] };
+ key <AE12> { [ dead_circumflex, dead_grave, dead_tilde ] };
+
+ key <AD03> { [ e, E, EuroSign ] };
+ key <AD06> { [ z, Z ] };
+ key <AD09> { [ o, O, oe, OE ] };
+ key <AD11> { [ udiaeresis, egrave, bracketleft ] };
+ key <AD12> { [ dead_diaeresis, exclam, bracketright ] };
+
+ key <AC10> { [ odiaeresis, eacute ] };
+ key <AC11> { [ adiaeresis, agrave, braceleft ] };
+ key <BKSL> { [ dollar, sterling, braceright ] };
+
+ key <LSGT> { [ less, greater, backslash, brokenbar ] };
+ key <AB01> { [ y, Y ] };
+ key <AB08> { [ comma, semicolon ] };
+ key <AB09> { [ period, colon ] };
+ key <AB10> { [ minus, underscore ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "legacy" {
+ include "ch(basic)"
+
+ name[Group1]= "German (Switzerland, legacy)";
+ key <AE07> { [ 7, slash, brokenbar ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "de" {
+ include "ch(basic)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "de_Sundeadkeys" {
+ // modify the basic Swiss German layout to use Sun dead keys
+ include "ch(basic)"
+ key <AE11> { [ apostrophe, question, dead_acute ] };
+ key <AE12> { [ dead_circumflex, dead_grave, dead_tilde ] };
+ key <AD12> { [ dead_diaeresis, exclam, bracketright ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "de_sundeadkeys" {
+ include "ch(de_Sundeadkeys)"
+ name[Group1]= "German (Switzerland, with Sun dead keys)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "de_nodeadkeys" {
+ // modify the basic Swiss German layout not to have any dead keys
+ include "ch(basic)"
+ name[Group1]= "German (Switzerland, no dead keys)";
+ key <AE11> { [ apostrophe, question, acute ] };
+ key <AE12> { [ asciicircum, grave, asciitilde ] };
+ key <AD12> { [ diaeresis, exclam, bracketright ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "fr" {
+
+ include "ch(basic)"
+ name[Group1]= "French (Switzerland)";
+
+ override key <AD11> {
+ [ egrave, udiaeresis, bracketleft ]
+ };
+ override key <AC10> {
+ [ eacute, odiaeresis ]
+ };
+ override key <AC11> {
+ [ agrave, adiaeresis, braceleft ]
+ };
+};
+
+partial alphanumeric_keys
+xkb_symbols "fr_Sundeadkeys" {
+ // modify the basic Swiss French layout to use Sun dead keys
+ include "ch(fr)"
+ key <AE11> { [ apostrophe, question, dead_acute ] };
+ key <AE12> { [ dead_circumflex, dead_grave, dead_tilde ] };
+ key <AD12> { [ dead_diaeresis, exclam, bracketright ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "fr_sundeadkeys" {
+ include "ch(fr_Sundeadkeys)"
+ name[Group1]= "French (Switzerland, with Sun dead keys)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "fr_nodeadkeys" {
+ // modify the basic Swiss French layout not to have any dead keys
+ include "ch(fr)"
+ name[Group1]= "French (Switzerland, no dead keys)";
+ key <AE11> { [ apostrophe, question, acute ] };
+ key <AE12> { [ asciicircum, grave, asciitilde ] };
+ key <AD12> { [ diaeresis, exclam, bracketright ] };
+};
+
+// Copied from macintosh_vndr/ch
+// 03.01.2003
+// Andreas Tobler <a.tobler@schweiz.ch>
+// modified for Swiss German Apple Extended Keyboard II
+
+partial alphanumeric_keys
+xkb_symbols "de_mac" {
+
+ name[Group1]= "German (Switzerland, Macintosh)";
+
+ key <AE01> { [ 1, plus, plusminus, infinity ] };
+ key <AE02> { [ 2, quotedbl, leftdoublequotemark, rightdoublequotemark ] };
+ key <AE03> { [ 3, asterisk, numbersign, leftcaret ] };
+ // not displayed here
+ key <AE04> { [ 4, ccedilla, Ccedilla, slash ] };
+ key <AE05> { [ 5, percent, bracketleft ] };
+ key <AE06> { [ 6, ampersand, bracketright ] };
+ key <AE07> { [ 7, slash, bar, backslash ] };
+ key <AE08> { [ 8, parenleft, braceleft, Ograve ] };
+ key <AE09> { [ 9, parenright, braceright, Ocircumflex ] };
+ key <AE10> { [ 0, equal, notequal, Uacute ] };
+ key <AE11> { [ apostrophe, question, questiondown, NoSymbol ] };
+ key <AE12> { [ dead_circumflex,dead_grave, dead_acute, asciicircum ] };
+ key <AD01> { [ q, Q, oe, OE ] };
+ key <AD02> { [ w, W, Greek_SIGMA, Aacute ] };
+ key <AD03> { [ e, E, EuroSign, Ediaeresis ] };
+ key <AD04> { [ r, R, registered, Egrave ] };
+ key <AD05> { [ t, T, dagger, Icircumflex ] };
+ key <AD06> { [ z, Z, Greek_OMEGA, Iacute ] };
+ key <AD07> { [ u, U, degree, Ugrave ] };
+ key <AD08> { [ i, I, exclamdown, idotless ] };
+ key <AD09> { [ o, O, oslash, Ooblique ] };
+ key <AD10> { [ p, P, Greek_pi, Greek_PI ] };
+ key <AD11> { [ udiaeresis, egrave, section, ydiaeresis ] };
+ key <AD12> { [ dead_diaeresis, exclam, grave, apostrophe ] };
+ key <AC01> { [ a, A, aring, Aring ] };
+ key <AC02> { [ s, S, ssharp, NoSymbol ] };
+ // ligature fl
+ key <AC03> { [ d, D, Greek_sigma, NoSymbol ] };
+ // partialderivative is not available here att
+ key <AC04> { [ f, F, function, doubledagger ] };
+ key <AC05> { [ g, G, at, comma ] };
+ key <AC06> { [ h, H, ordfeminine, periodcentered ] };
+ key <AC07> { [ j, J, masculine, eth ] };
+ key <AC08> { [ k, K, Greek_DELTA, macron ] };
+ key <AC09> { [ l, L, notsign, caret ] };
+ key <AC10> { [ odiaeresis, eacute, cent, breve ] };
+ key <AC11> { [ adiaeresis, agrave, ae, AE ] };
+ key <AB01> { [ y, Y, yen, Ydiaeresis ] };
+ key <AB02> { [ x, X, similarequal, trademark ] };
+ key <AB03> { [ c, C, copyright, NoSymbol ] };
+ key <AB04> { [ v, V, radical, diamond ] };
+ key <AB05> { [ b, B, integral, NoSymbol ] };
+ key <AB06> { [ n, N, dead_tilde, enopencircbullet ] };
+ // to be fixed att
+ key <AB07> { [ m, M, mu, dead_abovering ] };
+ // not sure att
+ key <AB08> { [ comma, semicolon, guillemotleft, guillemotright ] };
+ key <AB09> { [ period, colon, ellipsis, division ] };
+ key <AB10> { [ minus, underscore, hyphen, emdash ] };
+ key <TLDE> { [ section, degree, NoSymbol, NoSymbol ] };
+ // ligature fi // per mille
+ key <SPCE> { [ space, nobreakspace, nobreakspace ] };
+ key <LSGT> { [ less, greater, lessthanequal, greaterthanequal ] };
+ key <BKSL> { [ dollar, sterling, paragraph, enfilledcircbullet ] };
+
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "fr_mac" {
+
+ include "ch(de_mac)"
+ name[Group1]= "French (Switzerland, Macintosh)";
+
+ override key <AD11> {
+ [ egrave, udiaeresis, bracketleft ]
+ };
+ override key <AC10> {
+ [ eacute, odiaeresis ]
+ };
+ override key <AC11> {
+ [ agrave, adiaeresis, braceleft ]
+ };
+};
+
+// EXTRAS:
+
+partial alphanumeric_keys
+ xkb_symbols "sun_type6_de" {
+ include "sun_vndr/ch(sun_type6_de)"
+};
+
+partial alphanumeric_keys
+ xkb_symbols "sun_type6_fr" {
+ include "sun_vndr/ch(sun_type6_fr)"
+};
diff --git a/test/data/symbols/ctrl b/test/data/symbols/ctrl
new file mode 100644
index 0000000..8791b49
--- /dev/null
+++ b/test/data/symbols/ctrl
@@ -0,0 +1,104 @@
+// Eliminate CapsLock, making it another Ctrl.
+partial modifier_keys
+xkb_symbols "nocaps" {
+ replace key <CAPS> { [ Control_L, Control_L ] };
+ modifier_map Control { <CAPS>, <LCTL> };
+};
+
+// Make the left Ctrl key a left Meta.
+xkb_symbols "lctrl_meta" {
+ replace key <LCTL> { [ Meta_L ] };
+ modifier_map Mod4 { <LCTL> };
+};
+
+// Swap the functions of the CapsLock key and the left Ctrl key.
+partial modifier_keys
+xkb_symbols "swapcaps" {
+ replace key <CAPS> { [ Control_L ] };
+ replace key <LCTL> { [ Caps_Lock ] };
+ modifier_map Control { <CAPS> };
+ modifier_map Lock { <LCTL> };
+};
+
+// Move Ctrl to the leftmost key on the middle row and CapsLock to the
+// leftmost key on the bottom row. Only works if the geometry or keycodes
+// file has defined appropriate aliases for the keys in question.
+partial modifier_keys
+xkb_symbols "ac_ctrl" {
+ replace key <AC00> { [ Control_L ] };
+ replace key <AA00> { [ Caps_Lock ] };
+ modifier_map Control { <AC00> };
+ modifier_map Lock { <AA00> };
+};
+
+// Move Ctrl to the leftmost key on the bottom row and CapsLock to the
+// leftmost key on the middle row. Only works if the geometry or keycodes
+// file has defined appropriate aliases for the keys in question.
+partial modifier_keys
+xkb_symbols "aa_ctrl" {
+ replace key <AA00> { [ Control_L ] };
+ replace key <AC00> { [ Caps_Lock ] };
+ modifier_map Control { <AA00> };
+ modifier_map Lock { <AC00> };
+};
+
+// Right Ctrl functions as another right Alt.
+partial modifier_keys
+xkb_symbols "rctrl_ralt" {
+ key <RCTL> { symbols[Group1]= [ Alt_R ] };
+ modifier_map Mod1{ <RCTL> };
+};
+
+// Menu key functions as another right Ctrl.
+partial modifier_keys
+xkb_symbols "menu_rctrl" {
+ replace key <MENU> { [ Control_R, Control_R ] };
+ modifier_map Control { Control_L, <MENU> };
+};
+
+// Right Alt key functions as another right Ctrl.
+partial modifier_keys
+xkb_symbols "ralt_rctrl" {
+ replace key <RALT> { type[Group1] = "TWO_LEVEL",
+ symbols[Group1] = [ Control_R, Control_R ] };
+ modifier_map Control { <RALT> };
+};
+
+// Swap the functions of the left Alt key and the left Ctrl key.
+partial modifier_keys
+xkb_symbols "swap_lalt_lctl" {
+ replace key <LALT> { [ Control_L, Control_L ] };
+ replace key <LCTL> { [ Alt_L, Meta_L ] };
+ modifier_map Mod1 { <LCTL> };
+ modifier_map Control { <LALT> };
+};
+
+// Swap the functions of the left Win key and the left Ctrl key.
+partial modifier_keys
+xkb_symbols "swap_lwin_lctl" {
+ replace key <LWIN> { [ Control_L ] };
+ replace key <LCTL> { [ Super_L ] };
+ modifier_map Mod4 { <LCTL> };
+ modifier_map Control { <LWIN> };
+};
+
+// Swap the functions of the right Win key and the right Ctrl key.
+partial modifier_keys
+xkb_symbols "swap_rwin_rctl" {
+ replace key <RWIN> { [ Control_R ] };
+ replace key <RCTL> { [ Super_R ] };
+ modifier_map Mod4 { <RCTL> };
+ modifier_map Control { <RWIN> };
+};
+
+// Map Ctrl to the left Alt key, Alt to the left Win key,
+// and Super to the left Ctrl key.
+partial modifier_keys
+xkb_symbols "swap_lalt_lctl_lwin" {
+ replace key <LALT> { [ Control_L, Control_L ] };
+ replace key <LWIN> { [ Alt_L, Meta_L ] };
+ replace key <LCTL> { [ Super_L ] };
+ modifier_map Mod1 { <LWIN> };
+ modifier_map Mod4 { <LCTL> };
+ modifier_map Control { <LALT> };
+};
diff --git a/test/data/symbols/cz b/test/data/symbols/cz
new file mode 100644
index 0000000..3407e92
--- /dev/null
+++ b/test/data/symbols/cz
@@ -0,0 +1,255 @@
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+
+ // This layout conforms to a new Czech compromise standard
+ // designed to satisfy most Unix, Windows and Mac users.
+ // 2001 by Kamil Toman <ktoman@email.cz>
+
+ include "latin"
+ name[Group1]= "Czech";
+
+ key <TLDE> { [ semicolon, dead_abovering, grave, asciitilde ] };
+ key <AE01> { [ plus, 1, exclam, dead_tilde ] };
+ key <AE02> { [ ecaron, 2, at, dead_caron ] };
+ key <AE03> { [ scaron, 3, numbersign, dead_circumflex ] };
+ key <AE04> { [ ccaron, 4, dollar, dead_breve ] };
+ key <AE05> { [ rcaron, 5, percent, dead_abovering]};
+ key <AE06> { [ zcaron, 6, asciicircum, dead_ogonek ] };
+ key <AE07> { [ yacute, 7, ampersand, dead_grave ] };
+ key <AE08> { [ aacute, 8, asterisk, dead_abovedot] };
+ key <AE09> { [ iacute, 9, braceleft, dead_acute ] };
+ key <AE10> { [ eacute, 0, braceright, dead_doubleacute ] };
+ key <AE11> { [ equal, percent, NoSymbol, dead_diaeresis]};
+ key <AE12> { [dead_acute, dead_caron, dead_macron, dead_cedilla ] };
+
+ key <AD01> { [ q, Q, backslash, NoSymbol ] };
+ key <AD02> { [ w, W, bar, Nosymbol ] };
+ key <AD03> { [ e, E, EuroSign, NoSymbol ] };
+ key <AD04> { [ r, R, NoSymbol, NoSymbol ] };
+ key <AD05> { [ t, T, NoSymbol, NoSymbol ] };
+ key <AD06> { [ z, Z, NoSymbol, NoSymbol ] };
+ key <AD07> { [ u, U, NoSymbol, NoSymbol ] };
+ key <AD08> { [ i, I, NoSymbol, NoSymbol ] };
+ key <AD09> { [ o, O, NoSymbol, NoSymbol ] };
+ key <AD10> { [ p, P, NoSymbol, NoSymbol ] };
+
+ key <AD11> { [ uacute, slash, bracketleft, division ] };
+ key <AD12> { [parenright, parenleft, bracketright, multiply ] };
+
+ key <AC01> { [ a, A, asciitilde, NoSymbol ] };
+ key <AC02> { [ s, S, dstroke, NoSymbol ] };
+ key <AC03> { [ d, D, Dstroke, NoSymbol ] };
+ key <AC04> { [ f, F, bracketleft, NoSymbol ] };
+ key <AC05> { [ g, G, bracketright, NoSymbol ] };
+ key <AC06> { [ h, H, grave, NoSymbol ] };
+ key <AC07> { [ j, J, apostrophe, NoSymbol ] };
+ key <AC08> { [ k, K, lstroke, NoSymbol ] };
+ key <AC09> { [ l, L, Lstroke, NoSymbol ] };
+
+ key <AC10> { [ uring, quotedbl, dollar, NoSymbol ] };
+ key <AC11> { [ section, exclam, apostrophe, ssharp ] };
+ key <AC12> { [ EuroSign, dead_diaeresis, NoSymbol, NoSymbol ] };
+ key <BKSL> { [dead_diaeresis, apostrophe, backslash, bar ] };
+
+ key <LSGT> { [ backslash, bar, slash, NoSymbol ] };
+ key <AB01> { [ y, Y, degree, NoSymbol ] };
+ key <AB02> { [ x, X, numbersign, Nosymbol ] };
+ key <AB03> { [ c, C, ampersand, NoSymbol ] };
+ key <AB04> { [ v, V, at, NoSymbol ] };
+ key <AB05> { [ b, B, braceleft, NoSymbol ] };
+ key <AB06> { [ n, N, braceright, NoSymbol ] };
+ key <AB07> { [ m, M, asciicircum, NoSymbol ] };
+ key <AB08> { [ comma, question, less, NoSymbol ] };
+ key <AB09> { [ period, colon, greater, NoSymbol ] };
+ key <AB10> { [ minus, underscore, asterisk, NoSymbol ] };
+
+ key <SPCE> { [ space, space, space, space ] };
+
+ include "level3(ralt_switch)"
+};
+
+xkb_symbols "bksl" {
+
+ // Use <BKSL> instead of <LSGT> (useful for keyboards without <LSGT> key).
+
+ include "cz(basic)"
+ name[Group1]= "Czech (with <\|> key)";
+
+ key <BKSL> { [ backslash, bar, slash, NoSymbol ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "qwerty" {
+
+ // This layout represents the actual Czech keyboards;
+ // it complies with the symbols printed on the keys.
+ // 2011 by Lukáš Mojžíš <lmojzis@grenames.cz>
+
+ include "cz(basic)"
+ name[Group1]= "Czech (QWERTY)";
+
+ key <AB01> { [ z, Z, degree, NoSymbol ] };
+ key <AC10> { [ uring, quotedbl, semicolon, colon ] };
+ key <AC11> { [ section, exclam, apostrophe, ssharp ] };
+ key <AD06> { [ y, Y, NoSymbol, NoSymbol ] };
+ key <AD11> { [ uacute, slash, bracketleft, braceleft ] };
+ key <AD12> { [parenright, parenleft, bracketright, braceright ] };
+ key <AE09> { [ iacute, 9, parenleft, dead_acute ] };
+ key <AE10> { [ eacute, 0, parenright, dead_doubleacute ] };
+};
+
+xkb_symbols "qwerty_bksl" {
+
+ // Use <BKSL> instead of <LSGT> (useful for keyboards without <LSGT> key).
+
+ include "cz(qwerty)"
+ name[Group1]= "Czech (QWERTY, extended backslash)";
+
+ key <BKSL> { [ backslash, bar, slash, NoSymbol ] };
+};
+
+partial alphanumeric_keys alternate_group
+xkb_symbols "ucw" {
+
+ // This layout is usually used as the second group,
+ // it contains accented characters only, no 'latin' set.
+ // 2008 by Milan Vancura <mvancura@suse.cz>
+
+ name[Group1]= "Czech (UCW, only accented letters)";
+
+ key <AB01> { [zcaron, Zcaron ] };
+ key <AB02> { [ssharp ] };
+ key <AB03> { [ccaron, Ccaron ] };
+ key <AB04> { [ccedilla, Ccedilla ] };
+ key <AB05> { [ntilde, Ntilde ] };
+ key <AB06> { [ncaron, Ncaron ] };
+ key <AB07> { [lacute, Lacute ] };
+
+ key <AC01> { [aacute, Aacute ] };
+ key <AC02> { [scaron, Scaron ] };
+ key <AC03> { [dcaron, Dcaron ] };
+ key <AC04> { [ediaeresis, Ediaeresis ] };
+ key <AC05> { [racute, Racute ] };
+ key <AC06> { [uacute, Uacute ] };
+ key <AC07> { [udiaeresis, Udiaeresis ] };
+ key <AC08> { [ocircumflex, Ocircumflex ] };
+ key <AC09> { [lcaron, Lcaron ] };
+
+ key <AD01> { [adiaeresis, Adiaeresis ] };
+ key <AD02> { [ecaron, Ecaron ] };
+ key <AD03> { [eacute, Eacute ] };
+ key <AD04> { [rcaron, Rcaron ] };
+ key <AD05> { [tcaron, Tcaron ] };
+ key <AD06> { [yacute, Yacute ] };
+ key <AD07> { [uring, Uring ] };
+ key <AD08> { [iacute, Iacute ] };
+ key <AD09> { [oacute, Oacute ] };
+ key <AD10> { [odiaeresis, Odiaeresis ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "dvorak-ucw" {
+
+ // US Dvorak layout extended with UCW,
+ // AltGr produces accented characters.
+
+ include "us(dvorak)"
+ name[Group1]= "Czech (US, Dvorak, UCW support)";
+
+ key <AB03> { [ j, J, eacute, Eacute ] };
+ key <AB04> { [ k, K, uacute, Uacute ] };
+ key <AB10> { [ z, Z, zcaron, Zcaron ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC02> { [ o, O, oacute, Oacute ] };
+ key <AC03> { [ e, E, ecaron, Ecaron ] };
+ key <AC04> { [ u, U, uring, Uring ] };
+ key <AC05> { [ i, I, iacute, Iacute ] };
+ key <AC06> { [ d, D, dcaron, Dcaron ] };
+ key <AC08> { [ t, T, tcaron, Tcaron ] };
+ key <AC09> { [ n, N, ncaron, Ncaron ] };
+ key <AC10> { [ s, S, scaron, Scaron ] };
+
+ key <AD05> { [ y, Y, yacute, Yacute ] };
+ key <AD08> { [ c, C, ccaron, Ccaron ] };
+ key <AD09> { [ r, R, rcaron, Rcaron ] };
+
+ include "level3(ralt_switch)"
+};
+
+// phonetic layout for Russian letters on an CZ (QWERTY) keyboard
+// originaly created by Pavel Sorejs <sorejs@gmail.com>
+
+partial alphanumeric_keys
+xkb_symbols "rus" {
+
+ include "cz(qwerty)"
+ name[Group1]= "Russian (Czech, phonetic)";
+
+ key <AE01> { [ plus, ampersand, 1 , 1 ] };
+ key <AE02> { [ Cyrillic_hardsign, 2, 2 , 2 ] };
+ key <AE03> { [ Cyrillic_sha, Cyrillic_SHA, 3 , 3 ] };
+ key <AE04> { [ Cyrillic_che, Cyrillic_CHE, 4 , 4 ] };
+ key <AE05> { [ Cyrillic_shcha, Cyrillic_SHCHA, 5 , 5 ] };
+ key <AE06> { [ Cyrillic_zhe, Cyrillic_ZHE, 6 , 6 ] };
+ key <AE07> { [ quotedbl, 4, 7 , 7 ] };
+ key <AE08> { [ section, 5, 8 , 8 ] };
+ key <AE09> { [ dollar, 6, 9 , 9 ] };
+ key <AE10> { [ equal, 7, 0 , 0 ] };
+ key <AE11> { [ percent, 8 ] };
+ key <AE12> { [ apostrophe, 9 ] };
+
+ key <AB08> { [ comma, question ] };
+ key <AB09> { [ period, exclam ] };
+ key <AB10> { [ minus, slash ] };
+
+ key <AC11> { [ semicolon, colon ] };
+
+ key <LSGT> { [ bar, brokenbar ] };
+
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
+
+
+ key <AD01> { [ numerosign, 1, q, Q ] };
+ key <AD02> { [ Cyrillic_yu, Cyrillic_YU, w, W ] };
+ key <AD03> { [ Cyrillic_ie, Cyrillic_IE, e, E ] };
+ key <AD04> { [ Cyrillic_er, Cyrillic_ER, r, R ] };
+ key <AD05> { [ Cyrillic_te, Cyrillic_TE, t, T ] };
+ key <AD06> { [ Cyrillic_yeru, Cyrillic_YERU, y, Y ] };
+ key <AD07> { [ Cyrillic_u, Cyrillic_U, u, U ] };
+ key <AD08> { [ Cyrillic_i, Cyrillic_I, i, I ] };
+ key <AD09> { [ Cyrillic_o, Cyrillic_O, o, O ] };
+ key <AD10> { [ Cyrillic_pe, Cyrillic_PE, p, P ] };
+ key <AD11> { [ Cyrillic_e, Cyrillic_E, bracketleft, division ] };
+ key <AD12> { [ parenright, parenleft, bracketright, multiply ] };
+
+ key <AC01> { [ Cyrillic_a, Cyrillic_A, a, A ] };
+ key <AC02> { [ Cyrillic_es, Cyrillic_ES, s, S ] };
+ key <AC03> { [ Cyrillic_de, Cyrillic_DE, d, D ] };
+ key <AC04> { [ Cyrillic_ef, Cyrillic_EF, f, F ] };
+ key <AC05> { [ Cyrillic_ghe, Cyrillic_GHE, g, G ] };
+ key <AC06> { [ Cyrillic_ha, Cyrillic_HA, h, H ] };
+ key <AC07> { [ Cyrillic_shorti, Cyrillic_SHORTI, j, J ] };
+ key <AC08> { [ Cyrillic_ka, Cyrillic_KA, k, K ] };
+ key <AC09> { [ Cyrillic_el, Cyrillic_EL, l, L ] };
+ key <AC10> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, less, greater ] };
+
+ key <AB01> { [ Cyrillic_ze, Cyrillic_ZE, z, Z ] };
+ key <AB02> { [ Cyrillic_ya, Cyrillic_YA, x, X ] };
+ key <AB03> { [ Cyrillic_tse, Cyrillic_TSE, c, C ] };
+ key <AB04> { [ Cyrillic_ve, Cyrillic_VE, v, V ] };
+ key <AB05> { [ Cyrillic_be, Cyrillic_BE, b, B ] };
+ key <AB06> { [ Cyrillic_en, Cyrillic_EN, n, N ] };
+ key <AB07> { [ Cyrillic_em, Cyrillic_EM, m, M ] };
+
+ key <BKSL> { [ backslash, brokenbar ] };
+
+ include "level3(ralt_switch)"
+};
+
+// EXTRAS:
+
+partial alphanumeric_keys
+ xkb_symbols "sun_type6" {
+ include "sun_vndr/cz(sun_type6)"
+};
diff --git a/test/data/symbols/de b/test/data/symbols/de
new file mode 100644
index 0000000..c025a1c
--- /dev/null
+++ b/test/data/symbols/de
@@ -0,0 +1,1153 @@
+// based on a keyboard map from an 'xkb/symbols/de' file
+
+default
+xkb_symbols "basic" {
+
+ include "latin(type4)"
+
+ name[Group1]="German";
+
+ key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
+ key <AE03> { [ 3, section, threesuperior, sterling ] };
+ key <AE04> { [ 4, dollar, onequarter, currency ] };
+
+ key <AE11> {type[Group1]="FOUR_LEVEL_PLUS_LOCK", symbols[Group1]=
+ [ssharp, question, backslash, questiondown, 0x1001E9E ]};
+ key <AE12> { [dead_acute, dead_grave, dead_cedilla, dead_ogonek ] };
+
+ key <AD03> { [ e, E, EuroSign, EuroSign ] };
+ key <AD06> { [ z, Z, leftarrow, yen ] };
+ key <AD11> { [udiaeresis, Udiaeresis, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [ plus, asterisk, asciitilde, macron ] };
+
+ key <AC02> { [ s, S, U017F, U1E9E ] };
+ key <AC07> { [ j, J, dead_belowdot, dead_abovedot ] };
+ key <AC10> { [odiaeresis, Odiaeresis, dead_doubleacute, dead_belowdot ] };
+ key <AC11> { [adiaeresis, Adiaeresis, dead_circumflex, dead_caron ] };
+ key <TLDE> { [dead_circumflex, degree, U2032, U2033 ] };
+
+ key <BKSL> { [numbersign, apostrophe, rightsinglequotemark, dead_breve ] };
+ key <AB01> { [ y, Y, guillemotright, U203A ] };
+ key <AB02> { [ x, X, guillemotleft, U2039 ] };
+ key <AB04> { [ v, V, doublelowquotemark, singlelowquotemark ] };
+ key <AB05> { [ b, B, leftdoublequotemark, leftsinglequotemark ] };
+ key <AB06> { [ n, N, rightdoublequotemark, rightsinglequotemark ] };
+ key <AB08> { [ comma, semicolon, periodcentered, multiply ] };
+ key <AB09> { [ period, colon, U2026, division ] };
+ key <AB10> { [ minus, underscore, endash, emdash ] };
+ key <LSGT> { [ less, greater, bar, dead_belowmacron ] };
+
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "deadtilde" {
+ // previous standard German layout with tilde as dead key
+
+ include "de(basic)"
+ name[Group1]="German (dead tilde)";
+
+ key <AD12> { [ plus, asterisk, dead_tilde, dead_macron ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ // modify the basic German layout to not have any dead keys
+
+ include "de(basic)"
+ name[Group1]="German (no dead keys)";
+
+ key <TLDE> { [asciicircum, degree, notsign, notsign ] };
+ key <AE12> { [ acute, grave, cedilla, cedilla ] };
+ key <AD11> { [ udiaeresis, Udiaeresis, diaeresis, diaeresis ] };
+ key <AD12> { [ plus, asterisk, asciitilde, macron ] };
+ key <AC10> { [ odiaeresis, Odiaeresis, doubleacute, doubleacute ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, asciicircum, asciicircum ] };
+ key <BKSL> { [ numbersign, apostrophe, rightsinglequotemark, grave ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "deadgraveacute" {
+ // modify the basic German layout to have only acute and grave
+ // as dead keys (tilde and circumflex are needed as spacing characters
+ // in many programming languages)
+
+ include "de(basic)"
+ name[Group1]="German (dead grave acute)";
+
+ key <TLDE> { [asciicircum, degree, notsign, notsign ] };
+ key <AD12> { [ plus, asterisk, asciitilde, dead_macron ] };
+ key <BKSL> { [ numbersign, apostrophe, rightsinglequotemark, grave ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "deadacute" {
+ // modify the basic German layout to have only acute as
+ // dead keys (ASCII grave, tilde and circumflex are needed as
+ // spacing characters in many programming languages and text formatters)
+
+ include "de(deadgraveacute)"
+
+ name[Group1]="German (dead acute)";
+
+ key <AE12> { [dead_acute, grave, dead_cedilla, dead_ogonek ] };
+ key <BKSL> { [numbersign, apostrophe, rightsinglequotemark, dead_grave ] };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "T3" {
+ name[Group1]="German (T3)";
+
+ key.type[Group1] = "EIGHT_LEVEL";
+ key <TLDE> { [ dead_circumflex, degree, multiply, NoSymbol, U204A, hyphen, bar, NoSymbol ] };
+ key <AE01> { [ 1, exclam, rightsinglequotemark, NoSymbol, onesuperior, exclamdown, U02B9, NoSymbol ] };
+ key <AE02> { [ 2, quotedbl, twosuperior, NoSymbol, twosuperior, currency, U02BA, NoSymbol ] };
+ key <AE03> { [ 3, section, threesuperior, NoSymbol, threesuperior, sterling, U02BF, NoSymbol ] };
+ key <AE04> { [ 4, dollar, emdash, NoSymbol, onequarter, 0x20AC, U02BE, NoSymbol ] };
+ key <AE05> { [ 5, percent, exclamdown, NoSymbol, onehalf, uparrow, U02C1, NoSymbol ] };
+ key <AE06> { [ 6, ampersand, questiondown, NoSymbol, threequarters, downarrow, U02C0, NoSymbol ] };
+ key <AE07> { [ 7, slash, braceleft, NoSymbol, oneeighth, leftarrow, braceleft, NoSymbol ] };
+ key <AE08> { [ 8, parenleft, bracketleft, NoSymbol, threeeighths, rightarrow, braceright, NoSymbol ] };
+ key <AE09> { [ 9, parenright, bracketright, NoSymbol, fiveeighths, plusminus, bracketleft, NoSymbol ] };
+ key <AE10> { [ 0, equal, braceright, NoSymbol, seveneighths, trademark, bracketright, NoSymbol ] };
+ key <AE11> { [ ssharp, question, backslash, NoSymbol, backslash, questiondown, U02BB, NoSymbol ] };
+ key <AE12> { [ dead_acute, dead_grave, dead_abovedot, NoSymbol, dead_cedilla, dead_ogonek, notsign, NoSymbol ] };
+
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC";
+ key <AD01> { [ q, Q, at, NoSymbol, U0242, U0241, U030D, NoSymbol ] };
+ key <AD02> { [ w, W, dead_caron, NoSymbol, U02B7, U2126, dead_abovedot, NoSymbol ] };
+ key <AD03> { [ e, E, EuroSign, NoSymbol, oe, OE, dead_breve, NoSymbol ] };
+ key <AD04> { [ r, R, dead_diaeresis, NoSymbol, paragraph, registered, dead_circumflex, NoSymbol ] };
+ key <AD05> { [ t, T, dead_macron, NoSymbol, UA78C, UA78B, dead_diaeresis, NoSymbol ] };
+ key <AD06> { [ z, Z, dead_doubleacute, NoSymbol, U027C, yen, dead_invertedbreve, NoSymbol ] };
+ key <AD07> { [ u, U, dead_breve, NoSymbol, U0223, U0222, dead_caron, NoSymbol ] };
+ key <AD08> { [ i, I, dead_tilde, NoSymbol, idotless, U214D, dead_abovecomma, NoSymbol ] };
+ key <AD09> { [ o, O, dead_abovering, NoSymbol, oslash, Oslash, dead_horn, NoSymbol ] };
+ key <AD10> { [ p, P, dead_hook, NoSymbol, thorn, THORN, dead_hook, NoSymbol ] };
+ key <AD11> { [ udiaeresis, Udiaeresis, dead_horn, NoSymbol, U017F, dead_abovering, dead_grave, NoSymbol ] };
+ key.type[Group1] = "EIGHT_LEVEL";
+ key <AD12> { [ plus, asterisk, asciitilde, NoSymbol, dead_tilde, dead_macron, at, NoSymbol ] };
+
+ key.type[Group1] = "ONE_LEVEL";
+ key <CAPS> { [ Caps_Lock ] };
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC";
+ key <AC01> { [ a, A, lessthanequal, NoSymbol, ae, AE, U0329, NoSymbol ] };
+ key <AC02> { [ s, S, greaterthanequal, NoSymbol, ssharp, section, dead_belowdot, NoSymbol ] };
+ key <AC03> { [ d, D, U2300, NoSymbol, eth, ETH, dead_belowbreve, NoSymbol ] };
+ key <AC04> { [ f, F, minutes, NoSymbol, U0294, ordfeminine, dead_belowcircumflex, NoSymbol ] };
+ key <AC05> { [ g, G, seconds, NoSymbol, eng, ENG, dead_belowmacron, NoSymbol ] };
+ key <AC06> { [ h, H, U1E9E, NoSymbol, U0272, U019D, U0332, NoSymbol ] };
+ key <AC07> { [ j, J, dead_cedilla, NoSymbol, U0133, U0132, dead_belowring, NoSymbol ] };
+ key <AC08> { [ k, K, dead_belowcomma, NoSymbol, kra, dead_belowcomma, dead_stroke, NoSymbol ] };
+ key <AC09> { [ l, L, dead_ogonek, NoSymbol, lstroke, Lstroke, U0338, NoSymbol ] };
+ key <AC10> { [ odiaeresis, Odiaeresis, dead_belowdot, NoSymbol, dead_acute, dead_doubleacute, degree, NoSymbol ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, dead_stroke, NoSymbol, U019B, U1E9E, minutes, NoSymbol ] };
+ key.type[Group1] = "EIGHT_LEVEL";
+ key <BKSL> { [ numbersign, apostrophe, registered, NoSymbol, schwa, SCHWA, seconds, NoSymbol ] };
+
+ key <LSGT> { [ less, greater, bar, NoSymbol, U0149, brokenbar, U266A, NoSymbol ] };
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC";
+ key <AB01> { [ y, Y, U203A, NoSymbol, U0292, U01B7, guillemotleft, NoSymbol ] };
+ key <AB02> { [ x, X, guillemotright, NoSymbol, doublelowquotemark, singlelowquotemark, guillemotright, NoSymbol ] };
+ key <AB03> { [ c, C, copyright, NoSymbol, cent, copyright, Greek_horizbar, NoSymbol ] };
+ key <AB04> { [ v, V, guillemotleft, NoSymbol, leftdoublequotemark, leftsinglequotemark, U2039, NoSymbol ] };
+ key <AB05> { [ b, B, U2039, NoSymbol, rightdoublequotemark, rightsinglequotemark, U203A, NoSymbol ] };
+ key <AB06> { [ n, N, endash, NoSymbol, U019E, U0220, endash, NoSymbol ] };
+ key <AB07> { [ m, M, Greek_mu, NoSymbol, mu, masculine, emdash, NoSymbol ] };
+ key.type[Group1] = "EIGHT_LEVEL";
+ key <AB08> { [ comma, semicolon, U02BB, NoSymbol, ellipsis, multiply, dollar, NoSymbol ] };
+ key <AB09> { [ period, colon, U200C, NoSymbol, periodcentered, division, numbersign, NoSymbol ] };
+ key <AB10> { [ minus, underscore, hyphen, NoSymbol, U0140, U013F, U2011, NoSymbol ] };
+
+ key <SPCE> { [ space, space, nobreakspace, NoSymbol, U202F, U200C, nobreakspace, NoSymbol ] };
+
+ include "kpdl(comma)"
+
+ include "level5(modifier_mapping)"
+ include "level3(modifier_mapping)"
+ key.type[Group1] = "THREE_LEVEL";
+ key <LFSH> { [ Shift_L, Shift_L, ISO_Level5_Latch ] };
+ key <RTSH> { [ Shift_R, Shift_R, ISO_Level5_Latch ] };
+ key <RALT> { [ ISO_Level3_Shift, ISO_Level5_Latch, ISO_Level5_Latch ] };
+ };
+
+partial alphanumeric_keys
+xkb_symbols "ro" {
+ // add romanian-specific letters to the basic German layout.
+ // Romanian symbols are accessible with combination of <AltGr> and
+ // 'a', 's', 't', 'i', 'ä (&auml)' (+<Shift> for capital letters).
+ // To view romanian-specific symbols, add "export LC_CTYPE=ro_RO"
+ // or "export LC_CTYPE=de_DE.utf8" to your .profile.
+
+ include "de(basic)"
+
+ name[Group1]="Romanian (Germany)";
+
+ key <AD05> { [ t, T, tcedilla, Tcedilla ] };
+ key <AD08> { [ i, I, icircumflex, Icircumflex ] };
+ key <AC01> { [ a, A, acircumflex, Acircumflex ] };
+ key <AC02> { [ s, S, scedilla, Scedilla ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, abreve, Abreve ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "ro_nodeadkeys" {
+ // add romanian-specific letters to the German nodeadkeys layout.
+ // Read the comment for de_ro !
+
+ include "de(nodeadkeys)"
+ name[Group1]="Romanian (Germany, no dead keys)";
+
+ key <AD05> { [ t, T, tcedilla, Tcedilla ] };
+ key <AD08> { [ i, I, icircumflex, Icircumflex ] };
+ key <AC01> { [ a, A, acircumflex, Acircumflex ] };
+ key <AC02> { [ s, S, scedilla, Scedilla ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, abreve, Abreve ] };
+};
+
+// German Dvorak keymap by Thorsten Staerk (www.staerk.de/thorsten)
+// Have acute and grave as dead keys, tilde and circumflex alive as they are needed
+// in many programming languages.
+// to use this keymap, use a 105-key-keyboard and the command setxkbmap -model pc105 -layout dvorak -variant de
+// source: http://www-lehre.informatik.uni-osnabrueck.de/~rfreund/dvorak.php
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+ include "us(dvorak)"
+
+ name[Group1]="German (Dvorak)";
+
+ key <TLDE> { [ asciicircum, degree ] };
+
+ key <AE01> { [ 1, exclam, onesuperior ] };
+ key <AE02> { [ 2, quotedbl, twosuperior ] };
+ key <AE03> { [ 3, section, threesuperior ] };
+ key <AE04> { [ 4, dollar, bar ] };
+ key <AE05> { [ 5, percent, bar ] };
+ key <AE06> { [ 6, ampersand, brokenbar ] };
+ key <AE07> { [ 7, slash, braceleft ] };
+ key <AE08> { [ 8, parenleft, bracketleft ] };
+ key <AE09> { [ 9, parenright, bracketright ] };
+ key <AE10> { [ 0, equal, braceright ] };
+ key <AE11> { [ plus, asterisk, asciitilde ] };
+ key <AE12> { [ less, greater, dead_grave ] };
+
+ key <AD01> { [ udiaeresis, Udiaeresis, at ] };
+ key <AD02> { [ comma, semicolon, dead_diaeresis ] };
+ key <AD03> { [ period, colon ] };
+ key <AD08> { [ c, C, copyright, Cacute ] };
+ key <AD09> { [ t, T, trademark ] };
+ key <AD10> { [ z, Z, zabovedot, Zabovedot ] };
+ key <AD11> { [ question, ssharp ] };
+ key <AD12> { [ slash, backslash, dead_acute ] };
+
+ key <AC01> { [ a, A, at, aogonek ] };
+ key <AC02> { [ o, O, oacute, Oacute ] };
+ key <AC03> { [ e, E, EuroSign, eogonek ] };
+ key <AC04> { [ i, I ] };
+ key <AC05> { [ u, U ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ d, D ] };
+ key <AC08> { [ r, R, registered ] };
+ key <AC09> { [ n, N, nacute, Nacute ] };
+ key <AC10> { [ s, S, sacute, Sacute] };
+ key <AC11> { [ l, L, lstroke, Lstroke ] };
+
+ key <AB01> { [ odiaeresis, Odiaeresis ] };
+ key <AB02> { [ q, Q, at ] };
+ key <AB07> { [ m, M, mu ] };
+ key <AB10> { [ numbersign, apostrophe ] };
+
+ key <BKSL> { [ minus, underscore, hyphen, diaeresis] };
+
+ key <LSGT> { [ adiaeresis, Adiaeresis, bar ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "Sundeadkeys" {
+
+ // For naming consistency
+
+ include "de(basic)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "sundeadkeys" {
+
+ // For naming consistency
+
+ include "de(Sundeadkeys)"
+
+ name[Group1]="German (with Sun dead keys)";
+};
+
+
+// German Neo-Layout Version 2
+// adopted 2004 by Hanno Behrens <Hanno.Behrens@gmx.de>
+// inspired by Dvorak/de-ergo http://www.goebel-consult.de/de-ergo/
+//
+// Authors:
+// Stephan Hilb <stephan at ehilb dot de>
+// <lucky at zankt dot net>
+// Benjamin Kellermann <Benjamin dot Kellermann at gmx dot Germany>
+// Erik Streb <mail at erikstreb dot de>
+// and many other contributors
+//
+// http://www.neo-layout.org
+//
+// $Revision$, $Date$
+
+partial alphanumeric_keys modifier_keys keypad_keys
+xkb_symbols "neo_base" {
+
+ // Levels in Neo jargon
+ // --------------------------------------------------------------
+ // Ebene 1: normal
+ // Ebene 2: Shift
+ // Ebene 3: Mod3
+ // Ebene 4: Mod4 (for marking something use Shift + Mod4)
+ // Ebene 5: Shift + Mod3
+ // Ebene 6: Mod3 + Mod4
+ // Compose (not a level): Mod3 + Tab
+ // Feststelltaste (Capslock): Shift + Shift
+ // Mod4-Lock: Mod4 + Mod4
+ // Mod4-Lock: Shift + Mod3 + Tab
+
+ // Legend
+ // ===============
+ // Levels in Xkbmap jargon to be found here in the definitions.
+ // These are the levels used, and Xorg's translations:
+ // --------------------------------------------------------------
+ // Xorg: Level1 Level2 Level3 Level4 Level5 Level6 Level7 Level8
+ // Neo: Ebene1 Ebene2 Ebene3 Ebene5 Ebene4 Pseudo-Ebene Ebene6 ???
+ // Keys (Neo): None Shift Mod3 Mod3 + Shift Mod4 Mod4 + Shift Mod3 + Mod4 Mod3 + Mod4 + Shift
+
+
+ // Alphanumeric-keys
+ // ===============
+ key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK";
+
+ // Tab as Multi_key (Compose)
+ // --------------------------------------------------------------
+ key <TAB> { [ Tab, ISO_Left_Tab, Multi_key, ISO_Level5_Lock, NoSymbol, NoSymbol, NoSymbol, ISO_Level5_Lock ] };
+
+
+ // Number row
+ // --------------------------------------------------------------
+ key <TLDE> { [ dead_circumflex, dead_caron, U21BB, U02DE, dead_abovedot, Pointer_EnableKeys, dead_belowdot, NoSymbol ] };
+
+ key <AE01> { [ 1, degree, onesuperior, onesubscript, ordfeminine, NoSymbol, notsign, NoSymbol ] };
+ key <AE02> { [ 2, section, twosuperior, twosubscript, masculine, NoSymbol, logicalor, NoSymbol ] };
+ key <AE03> { [ 3, U2113, threesuperior, threesubscript, numerosign, NoSymbol, logicaland, NoSymbol ] };
+ key <AE04> { [ 4, guillemotright, U203A, femalesymbol, NoSymbol, NoSymbol, U22A5, NoSymbol ] };
+ key <AE05> { [ 5, guillemotleft, U2039, malesymbol, periodcentered, NoSymbol, U2221, NoSymbol ] };
+ key <AE06> { [ 6, dollar, cent, U26A5, sterling, NoSymbol, U2225, NoSymbol ] };
+
+ key <AE07> { [ 7, EuroSign, yen, U03F0, currency, NoSymbol, rightarrow, NoSymbol ] };
+ key <AE08> { [ 8, doublelowquotemark, singlelowquotemark, U27E8, Tab, ISO_Left_Tab, U221E, NoSymbol ] };
+ key <AE09> { [ 9, leftdoublequotemark, leftsinglequotemark, U27E9, KP_Divide, KP_Divide, variation, NoSymbol ] };
+ key <AE10> { [ 0, rightdoublequotemark, rightsinglequotemark, zerosubscript, KP_Multiply, KP_Multiply, emptyset, NoSymbol ] };
+
+ key <AE11> { [ minus, emdash, NoSymbol, U2011, KP_Subtract, KP_Subtract, hyphen, NoSymbol ] };
+ key <AE12> { [ dead_grave, dead_cedilla, dead_abovering, dead_dasia, dead_diaeresis, NoSymbol, dead_macron, NoSymbol ] };
+
+ // Top row
+ // --------------------------------------------------------------
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK";
+ key <AD01> { [ x, X, ellipsis, Greek_xi, Prior, Prior, Greek_XI, NoSymbol ] };
+ key <AD02> { [ v, V, underscore, NoSymbol, BackSpace, BackSpace, radical, NoSymbol ] };
+ key <AD03> { [ l, L, bracketleft, Greek_lambda, Up, Up, Greek_LAMBDA, NoSymbol ] };
+ key <AD04> { [ c, C, bracketright, Greek_chi, Delete, Delete, U2102, NoSymbol ] };
+ key <AD05> { [ w, W, asciicircum, Greek_omega, Next, Next, Greek_OMEGA, NoSymbol ] };
+
+ key <AD06> { [ k, K, exclam, Greek_kappa, exclamdown, NoSymbol, multiply, NoSymbol ] };
+ key <AD07> { [ h, H, less, Greek_psi, KP_7, KP_7, Greek_PSI, NoSymbol ] };
+ key <AD08> { [ g, G, greater, Greek_gamma, KP_8, KP_8, Greek_GAMMA, NoSymbol ] };
+ key <AD09> { [ f, F, equal, Greek_phi, KP_9, KP_9, Greek_PHI, NoSymbol ] };
+ key <AD10> { [ q, Q, ampersand, U03D5, KP_Add, KP_Add, U211A, NoSymbol ] };
+
+ key <AD11> { [ ssharp, U1E9E, U017F, Greek_finalsmallsigma, U2212, NoSymbol, jot, NoSymbol ] };
+
+ key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK";
+ key <AD12> { [ dead_acute, dead_tilde, dead_stroke, dead_psili, dead_doubleacute, NoSymbol, dead_breve, NoSymbol ] };
+
+ // Middle row
+ // --------------------------------------------------------------
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK";
+ key <AC01> { [ u, U, backslash, NoSymbol, Home, Home, includedin, NoSymbol ] };
+ key <AC02> { [ i, I, slash, Greek_iota, Left, Left, integral, NoSymbol ] };
+ key <AC03> { [ a, A, braceleft, Greek_alpha, Down, Down, U2200, NoSymbol ] };
+ key <AC04> { [ e, E, braceright, Greek_epsilon, Right, Right, U2203, NoSymbol ] };
+ key <AC05> { [ o, O, asterisk, Greek_omicron, End, End, elementof, NoSymbol ] };
+
+ key <AC06> { [ s, S, question, Greek_sigma, questiondown, NoSymbol, Greek_SIGMA, NoSymbol ] };
+ key <AC07> { [ n, N, parenleft, Greek_nu, KP_4, KP_4, U2115, NoSymbol ] };
+ key <AC08> { [ r, R, parenright, Greek_rho, KP_5, KP_5, U211D, NoSymbol ] };
+ key <AC09> { [ t, T, minus, Greek_tau, KP_6, KP_6, partialderivative, NoSymbol ] };
+ key <AC10> { [ d, D, colon, Greek_delta, KP_Separator, comma, Greek_DELTA, NoSymbol ] };
+
+ key <AC11> { [ y, Y, at, Greek_upsilon, period, KP_Decimal, nabla, NoSymbol ] };
+
+ // Bottom row
+ // --------------------------------------------------------------
+ key <AB01> { [ udiaeresis, Udiaeresis, numbersign, NoSymbol, Escape, Escape, union, NoSymbol ] };
+ key <AB02> { [ odiaeresis, Odiaeresis, dollar, U03F5, Tab, Tab, intersection, NoSymbol ] };
+ key <AB03> { [ adiaeresis, Adiaeresis, bar, Greek_eta, Insert, Insert, U2135, NoSymbol ] };
+ key <AB04> { [ p, P, asciitilde, Greek_pi, Return, Return, Greek_PI, NoSymbol ] };
+ key <AB05> { [ z, Z, grave, Greek_zeta, Undo, Redo, U2124, NoSymbol ] };
+
+ key <AB06> { [ b, B, plus, Greek_beta, colon, NoSymbol, U21D0, NoSymbol ] };
+ key <AB07> { [ m, M, percent, Greek_mu, KP_1, KP_1, ifonlyif, NoSymbol ] };
+ key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK";
+ key <AB08> { [ comma, endash, quotedbl, U03F1, KP_2, KP_2, U21D2, NoSymbol ] };
+ key <AB09> { [ period, enfilledcircbullet, apostrophe, U03D1, KP_3, KP_3, U21A6, NoSymbol ] };
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK";
+ key <AB10> { [ j, J, semicolon, Greek_theta, semicolon, NoSymbol, Greek_THETA, NoSymbol ] };
+ key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK";
+
+ // Space key
+ // --------------------------------------------------------------
+ key <SPCE> { [ space, space, space, nobreakspace, KP_0, KP_0, U202F, NoSymbol ] };
+
+
+ // Keypad-keys
+ // ===============
+
+ // The former Numlock key:
+ key <NMLK> { [ Tab, ISO_Left_Tab, equal, approxeq, notequal, Pointer_EnableKeys, identical, NoSymbol ] };
+
+ // Topmost row
+ // --------------------------------------------------------------
+ key <KPDV> { [ KP_Divide, KP_Divide, division, U2300, U2215, NoSymbol, U2223, NoSymbol ] };
+ key <KPMU> { [ KP_Multiply, KP_Multiply, U22C5, U2299, multiply, NoSymbol, U2297, NoSymbol ] };
+ key <KPSU> { [ KP_Subtract, KP_Subtract, U2212, U2296, U2216, NoSymbol, U2238, NoSymbol ] };
+
+ // Top row
+ // --------------------------------------------------------------
+ key <KP7> { [ KP_7, U2714, U2195, U226A, KP_Home, KP_Home, upstile, NoSymbol ] };
+ key <KP8> { [ KP_8, U2718, uparrow, intersection, KP_Up, KP_Up, U22C2, NoSymbol ] };
+ key <KP9> { [ KP_9, dagger, U20D7, U226B, KP_Prior, KP_Prior, U2309, NoSymbol ] };
+ key <KPAD> { [ KP_Add, KP_Add, plusminus, U2295, U2213, NoSymbol, U2214, NoSymbol ] };
+
+ // Middle row
+ // --------------------------------------------------------------
+ key <KP4> { [ KP_4, club, leftarrow, includedin, KP_Left, KP_Left, U2286, NoSymbol ] };
+ key <KP5> { [ KP_5, EuroSign, colon, U22B6, KP_Begin, KP_Begin, U22B7, NoSymbol ] };
+ key <KP6> { [ KP_6, U2023, rightarrow, includes, KP_Right, KP_Right, U2287, NoSymbol ] };
+
+ // Bottom row
+ // --------------------------------------------------------------
+ key <KP1> { [ KP_1, diamond, U2194, lessthanequal, KP_End, KP_End, downstile, NoSymbol ] };
+ key <KP2> { [ KP_2, heart, downarrow, union, KP_Down, KP_Down, U22C3, NoSymbol ] };
+ key <KP3> { [ KP_3, U2660, U21CC, greaterthanequal, KP_Next, KP_Next, U230B, NoSymbol ] };
+ key <KPEN> { [ KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, NoSymbol ] };
+ key <KPEQ> { [ KP_Equal, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ] };
+
+ // Bottommost row
+ // --------------------------------------------------------------
+ key <KP0> { [ KP_0, U2423, percent, U2030, KP_Insert, KP_Insert, U25A1, NoSymbol ] };
+ key <KPDL> { [ KP_Separator, period, comma, minutes, KP_Delete, KP_Delete, seconds, NoSymbol ] };
+};
+
+partial alphanumeric_keys modifier_keys keypad_keys
+xkb_symbols "neo" {
+
+ include "de(neo_base)"
+
+ name[Group1]= "German (Neo 2)";
+
+ include "shift(both_capslock)"
+ include "level3(caps_switch)"
+ include "level3(bksl_switch)"
+ include "level5(lsgt_switch_lock)"
+ include "level5(ralt_switch_lock)"
+};
+
+// Copied from macintosh_vndr/de
+// olh@suse.de very close to MacOS map
+
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ include "de"
+ name[Group1]= "German (Macintosh)";
+
+ key <AE01> { [ 1, exclam, exclamdown, at ] };
+ key <AE05> { [ 5, percent, bracketleft ] };
+ key <AE06> { [ 6, ampersand, bracketright ] };
+ key <AE07> { [ 7, slash, bar, backslash ] };
+ key <AE08> { [ 8, parenleft, braceleft, asciitilde ] };
+ key <AE09> { [ 9, parenright, braceright ] };
+ key <AD01> { [ q, Q, guillemotleft, guillemotright ] };
+ key <AD04> { [ r, R, registered ] };
+ key <AD07> { [ u, U, diaeresis, Aacute ] };
+ key <AD08> { [ i, I, slash, Ucircumflex ] };
+ key <AD11> { [ udiaeresis, Udiaeresis, periodcentered, degree ] };
+ key <AD12> { [ plus, asterisk, asciitilde ] };
+ key <AC01> { [ a, A, aring, Aring ] };
+ key <AC05> { [ g, G, copyright ] };
+ key <AC06> { [ h, H, ordfeminine ] };
+ key <AC09> { [ l, L, at ] };
+ key <AC10> { [ odiaeresis, Odiaeresis, dead_acute ] };
+ key <AB06> { [ n, N, asciitilde ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "mac_nodeadkeys" {
+ // modify the standard German mac layout to not have any dead keys
+ include "de(mac)"
+ name[Group1]= "German (Macintosh, no dead keys)";
+
+ key <TLDE> { [ asciicircum, degree, notsign ] };
+ key <AE04> { [ 4, dollar, onequarter, currency ] };
+ key <AE12> { [ acute, grave, cedilla ] };
+ key <AD11> { [ udiaeresis, Udiaeresis, diaeresis ] };
+ key <AD12> { [ plus, asterisk, asciitilde, macron ] };
+ key <AC10> { [ odiaeresis, Odiaeresis, acute ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, asciicircum ] };
+
+ key <BKSL> { [ numbersign, apostrophe, rightsinglequotemark ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "dsb"
+{
+ include "latin(basic)"
+ name[Group1] = "Lower Sorbian";
+ key <AB01> { [ z, Z, zcaron, Zcaron ] };
+ key <AB02> { [ x, X, zacute, Zacute ] };
+ key <AB03> { [ c, C, cacute, Cacute ] };
+ key <AB04> { [ v, V, ccaron, Ccaron ] };
+ key <AB06> { [ n, N, nacute, Nacute ] };
+ key <AC02> { [ s, S, sacute, Sacute ] };
+ key <AC03> { [ d, D, scaron, Scaron ] };
+ key <AC04> { [ f, F ] };
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E, ecaron, Ecaron ] };
+ key <AD04> { [ r, R, racute, Racute ] };
+ key <AD05> { [ t, T, U20B5, EuroSign ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "dsb_qwertz"
+{
+ include "latin(basic)"
+ name[Group1] = "Lower Sorbian (QWERTZ)";
+ key <AB01> { [ y, Y ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C, cacute, Cacute ] };
+ key <AB04> { [ v, V, ccaron, Ccaron ] };
+ key <AB06> { [ n, N, nacute, Nacute ] };
+ key <AC02> { [ s, S, sacute, Sacute ] };
+ key <AC03> { [ d, D, scaron, Scaron ] };
+ key <AC04> { [ f, F ] };
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E, ecaron, Ecaron ] };
+ key <AD04> { [ r, R, racute, Racute ] };
+ key <AD05> { [ t, T, U20B5, EuroSign ] };
+ key <AD06> { [ z, Z, zcaron, Zcaron ] };
+ key <AD07> { [ u, U, zacute, Zacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "qwerty" {
+
+ // This layout should work exactly as a de with the exception
+ // of 'Z' and 'Y' keys, which are in the qwerty style (ie. swapped).
+ // 2008 by Matej Košík <kosik@fiit.stuba.sk>
+
+ include "de(basic)"
+
+ name[Group1] = "German (QWERTY)";
+
+ key <AB01> { [ z, Z, leftarrow, yen ] };
+ key <AD06> { [ y, Y, guillemotleft, less ] };
+};
+
+// layout for Russian letters on an german keyboard
+// based on US-RU layout by Ivan Popov <pin@konvalo.org> 2005-07-17
+// adopted for german layout by Alexey Fisher <bug-track@fisher-privat.net> 2010-08-19
+
+partial alphanumeric_keys
+xkb_symbols "ru" {
+
+ include "de(basic)"
+
+ name[Group1]= "Russian (Germany, phonetic)";
+
+ key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO, asciitilde ] };
+ key <LatX> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AC10> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA, plus, asterisk ] };
+ key <AE12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <LatV> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
+ key <BKSL> { [ Cyrillic_yu, Cyrillic_YU, numbersign, apostrophe ] };
+ key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
+
+ include "level3(ralt_switch)"
+};
+
+// layout for Russian (recommended) letters on a german keyboard
+// based on "Russisch für Deutsche, empfohlen" by B. Bendixen und H. Rothe http://russisch.urz.uni-leipzig.de/key2000.htm 2016-02-01
+// adapted for Linux by Niko Krause <nikokrause@gmx.de> 2016-06-09
+
+partial alphanumeric_keys
+xkb_symbols "ru-recom" {
+
+ include "de(basic)"
+
+ name[Group1]= "Russian (Germany, recommended)";
+
+ key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE, Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <TLDE> { [ Cyrillic_ya, Cyrillic_YA, asciicircum, degree ] };
+ key <LatX> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatZ> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <LatI> { [ Cyrillic_i, Cyrillic_I, Ukrainian_i, Ukrainian_I ] };
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI, Ukrainian_yi, Ukrainian_YI ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES, Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatH> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <LatC> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AC10> { [ Cyrillic_io, Cyrillic_IO ] };
+ key <AD11> { [ Cyrillic_yu, Cyrillic_YU ] };
+ key <AD12> { [ Cyrillic_sha, Cyrillic_SHA, plus, asterisk ] };
+ key <LSGT> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <LatV> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie, Ukrainian_IE ] };
+ key <BKSL> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, numbersign, apostrophe ] };
+ key <LatQ> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+
+ key <AE11> { [ asciitilde, question, backslash, questiondown ] };
+ key <AE12> { [ U0301, U0300, U0323, U0307 ] };
+
+ include "level3(ralt_switch)"
+};
+
+// layout for Russian (transliteration) letters on a german keyboard
+// based on "Russisch für Deutsche, Transliteration" by B. Bendixen und H. Rothe http://russisch.urz.uni-leipzig.de/key2000.htm 2016-02-01
+// adapted for Linux by Niko Krause <nikokrause@gmx.de> 2016-06-09
+
+partial alphanumeric_keys
+xkb_symbols "ru-translit" {
+
+ include "de(basic)"
+
+ name[Group1]= "Russian (Germany, transliteration)";
+
+ key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatW> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE, Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <TLDE> { [ Cyrillic_ya, Cyrillic_YA, asciicircum, degree ] };
+ key <LatX> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatI> { [ Cyrillic_i, Cyrillic_I, Ukrainian_i, Ukrainian_I ] };
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI, Ukrainian_yi, Ukrainian_YI ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES, Cyrillic_che, Cyrillic_CHE ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatH> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AC10> { [ Cyrillic_io, Cyrillic_IO ] };
+ key <AD11> { [ Cyrillic_yu, Cyrillic_YU ] };
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, plus, asterisk ] };
+ key <LSGT> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <LatV> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie, Ukrainian_IE ] };
+ key <BKSL> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, numbersign, apostrophe ] };
+ key <LatQ> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+
+ key <AE11> { [ asciitilde, question, backslash, questiondown ] };
+ key <AE12> { [ U0301, U0300, U0323, U0307 ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "pl" {
+
+ // Combined layout for entering both German and Polish symbols on a German physical
+ // keyboard. Based on German (no dead keys) and Polish (basic). Polish diacritics
+ // on AltGr+"acelnosxz". EuroSign moved to AE04 (AltGr+dollar key) to avoid conflict
+ // with Polish eogonek.
+ //
+ // https://github.com/kontextify/xkeyboard-config
+
+ include "latin(type4)"
+
+ name[Group1]= "Polish (Germany, no dead keys)";
+
+ include "de(nodeadkeys)"
+ key <AE04> { [ 4, dollar, EuroSign, currency ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E, eogonek, Eogonek ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ key <AC01> { [ a, A, aogonek, Aogonek ] };
+ key <AC02> { [ s, S, sacute, Sacute ] };
+ key <AC04> { [ f, F ] };
+ key <AD06> { [ z, Z, zabovedot, Zabovedot ] };
+ key <AB02> { [ x, X, zacute, Zacute ] };
+ key <AB03> { [ c, C, cacute, Cacute ] };
+ key <AB06> { [ n, N, nacute, Nacute ] };
+
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "htcdream" {
+ include "inet(htcdream)"
+
+ name[Group1]= "German";
+
+ //second row
+ key <AD01> { [ q, Q, Tab, Tab ] };
+ key <AD02> { [ w, W, grave, grave ] };
+ key <AD03> { [ e, E, EuroSign, EuroSign ] };
+ key <AD04> { [ r, R, underscore, underscore ] };
+ key <AD05> { [ t, T, sterling, sterling] };
+ key <AD06> { [ z, Z, division, division ] };
+ key <AD07> { [ u, U, udiaeresis, udiaeresis ] };
+ key <AD08> { [ i, I, minus, minus ] };
+ key <AD09> { [ o, O, odiaeresis, odiaeresis ] };
+ key <AD10> { [ p, P, equal, equal ] };
+
+ //third row
+ key <AC01> { [ a, A, adiaeresis, adiaeresis ] };
+ key <AC02> { [ s, S, ssharp, ssharp] };
+ key <AC03> { [ d ,D, backslash, backslash ] };
+ key <AC04> { [ f, F, braceleft, braceleft ] };
+ key <AC05> { [ g, G, braceright, braceright ] };
+ key <AC06> { [ h, H, multiply, multiply ] };
+ key <AC07> { [ j, J, colon, colon ] };
+ key <AC08> { [ k, K, plus, plus ] };
+ key <AC09> { [ l, L, apostrophe, apostrophe ] };
+
+ //forth row
+ key <AB01> { [ y, Y, bar, bar ] };
+ key <AB02> { [ x, X, bracketleft, bracketleft ] };
+ key <AB03> { [ c, C, bracketright, bracketright ] };
+ key <AB04> { [ v, V, less, less ] };
+ key <AB05> { [ b, B, greater, greater ] };
+ key <AB06> { [ n, N, semicolon, semicolon ] };
+ key <AB07> { [ m, M, quotedbl, quotedbl ] };
+ key <AB08> { [ comma, comma, question, question ] };
+
+ //fifth row
+ key <FK15> { [ at, at, asciitilde, asciitilde ] };
+
+ include "level3(alt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "tr" {
+
+ // add turkish-specific letters to the basic German layout.
+ // Turkish symbols are accessible with combination of <AltGr> and
+ // 'i', 's', 'g', 'c'' (+<Shift> for capital letters).
+
+ include "de(basic)"
+
+ name[Group1]="Turkish (Germany)";
+
+ key <AD08> { [ i, I, U0131, U0130 ] };
+ key <AC02> { [ s, S, U015F, U015E ] };
+ key <AC05> { [ g, G, U011F, U011E ] };
+ key <AB03> { [ c, C, U0E7, U0C7 ] };
+
+};
+
+// EXTRAS:
+
+partial alphanumeric_keys
+xkb_symbols "us" {
+ include "us"
+
+ name[Group1]="German (US, with German letters)";
+
+ key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
+ key <AC02> { [ s, S, ssharp, ssharp ] };
+ key <AC10> { [ semicolon, colon, odiaeresis, Odiaeresis ] };
+ key <AC11> { [ apostrophe, quotedbl, adiaeresis, Adiaeresis ] };
+ key <AD03> { [ e, E, EuroSign, EuroSign ] };
+ key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
+ key <AD11> { [ bracketleft, braceleft, udiaeresis, Udiaeresis ] };
+ key <AE03> { [ 3, numbersign, section, section ] };
+ key <AE11> { [ minus, underscore, ssharp, question ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "hu" {
+
+ // modify the basic German layout to not have any dead keys and add Hungarian letters
+
+ include "de(basic)"
+ name[Group1]="German (with Hungarian letters and no dead keys)";
+
+ key <AB01> { [ y, Y, guillemotleft, less ] };
+ key <AC10> { [odiaeresis, Odiaeresis, eacute, Eacute ] };
+ key <AC11> { [adiaeresis, Adiaeresis, aacute, Aacute] };
+ key <AD03> { [ e, E, EuroSign, EuroSign ] };
+ key <AD06> { [ z, Z, leftarrow, yen ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, odoubleacute, Odoubleacute ] };
+ key <AD11> { [udiaeresis, Udiaeresis, udoubleacute, Udoubleacute ] };
+ key <AD12> { [ plus, asterisk, asciitilde, macron ] };
+ key <AE12> { [ acute, grave, oacute, Oacute ] };
+ key <BKSL> { [numbersign, apostrophe, rightsinglequotemark, grave ] };
+ key <TLDE> { [asciicircum, degree, notsign, notsign ] };
+};
+
+partial alphanumeric_keys
+ xkb_symbols "sun_type6" {
+ include "sun_vndr/de(sun_type6)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "adnw_base" {
+ include "de(neo_base)"
+
+ key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK";
+ key <AD04> { [ period, enfilledcircbullet, NoSymbol, U03D1, NoSymbol, NoSymbol, U21A6, NoSymbol ] };
+ key <AB04> { [ comma, endash, NoSymbol, U03F1, NoSymbol, NoSymbol, U21D2, NoSymbol ] };
+
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK";
+ key <AD01> { [ k, K, NoSymbol, Greek_kappa, NoSymbol, NoSymbol, multiply, NoSymbol ] };
+ key <AD02> { [ u, U, NoSymbol, NoSymbol, NoSymbol, NoSymbol, includedin, NoSymbol ] };
+ key <AD03> { [ udiaeresis, Udiaeresis, NoSymbol, NoSymbol, NoSymbol, NoSymbol, union, NoSymbol ] };
+ key <AD05> { [ adiaeresis, Adiaeresis, NoSymbol, Greek_eta, NoSymbol, NoSymbol, U2135, NoSymbol ] };
+ key <AD06> { [ v, V, NoSymbol, NoSymbol, NoSymbol, NoSymbol, radical, NoSymbol ] };
+ key <AD07> { [ g, G, NoSymbol, Greek_gamma, NoSymbol, NoSymbol, Greek_GAMMA, NoSymbol ] };
+ key <AD08> { [ c, C, NoSymbol, Greek_chi, NoSymbol, NoSymbol, U2102, NoSymbol ] };
+ key <AD09> { [ l, L, NoSymbol, Greek_lambda, NoSymbol, NoSymbol, Greek_LAMBDA, NoSymbol ] };
+ key <AD10> { [ j, J, NoSymbol, Greek_theta, NoSymbol, NoSymbol, Greek_THETA, NoSymbol ] };
+ key <AD11> { [ f, F, NoSymbol, Greek_phi, NoSymbol, NoSymbol, Greek_PHI, NoSymbol ] };
+ key <AC01> { [ h, H, NoSymbol, Greek_psi, NoSymbol, NoSymbol, Greek_PSI, NoSymbol ] };
+ key <AC02> { [ i, I, NoSymbol, Greek_iota, NoSymbol, NoSymbol, integral, NoSymbol ] };
+ key <AC03> { [ e, E, NoSymbol, Greek_epsilon, NoSymbol, NoSymbol, U2203, NoSymbol ] };
+ key <AC04> { [ a, A, NoSymbol, Greek_alpha, NoSymbol, NoSymbol, U2200, NoSymbol ] };
+ key <AC05> { [ o, O, NoSymbol, Greek_omicron, NoSymbol, NoSymbol, elementof, NoSymbol ] };
+ key <AC06> { [ d, D, NoSymbol, Greek_delta, NoSymbol, NoSymbol, Greek_DELTA, NoSymbol ] };
+ key <AC07> { [ t, T, NoSymbol, Greek_tau, NoSymbol, NoSymbol, partialderivative, NoSymbol ] };
+ key <AC08> { [ r, R, NoSymbol, Greek_rho, NoSymbol, NoSymbol, U211D, NoSymbol ] };
+ key <AC09> { [ n, N, NoSymbol, Greek_nu, NoSymbol, NoSymbol, U2115, NoSymbol ] };
+ key <AC10> { [ s, S, NoSymbol, Greek_sigma, NoSymbol, NoSymbol, Greek_SIGMA, NoSymbol ] };
+ key <AC11> { [ ssharp, U1E9E, NoSymbol, Greek_finalsmallsigma, NoSymbol, NoSymbol, jot, NoSymbol ] };
+ key <AB01> { [ x, X, NoSymbol, Greek_xi, NoSymbol, NoSymbol, Greek_XI, NoSymbol ] };
+ key <AB02> { [ y, Y, NoSymbol, Greek_upsilon, NoSymbol, NoSymbol, nabla, NoSymbol ] };
+ key <AB03> { [ odiaeresis, Odiaeresis, NoSymbol, U03F5, NoSymbol, NoSymbol, intersection, NoSymbol ] };
+ key <AB05> { [ q, Q, NoSymbol, U03D5, NoSymbol, NoSymbol, U211A, NoSymbol ] };
+ key <AB06> { [ b, B, NoSymbol, Greek_beta, NoSymbol, NoSymbol, U21D0, NoSymbol ] };
+ key <AB07> { [ p, P, NoSymbol, Greek_pi, NoSymbol, NoSymbol, Greek_PI, NoSymbol ] };
+ key <AB08> { [ w, W, NoSymbol, Greek_omega, NoSymbol, NoSymbol, Greek_OMEGA, NoSymbol ] };
+ key <AB09> { [ m, M, NoSymbol, Greek_mu, NoSymbol, NoSymbol, ifonlyif, NoSymbol ] };
+ key <AB10> { [ z, Z, NoSymbol, Greek_zeta, NoSymbol, NoSymbol, U2124, NoSymbol ] };
+};
+
+partial alphanumeric_keys modifier_keys keypad_keys
+xkb_symbols "adnw" {
+
+ include "de(adnw_base)"
+
+ name[Group1]= "German (Aus der Neo-Welt)";
+
+ include "shift(both_capslock)"
+ include "level3(caps_switch)"
+ include "level3(bksl_switch)"
+ include "level5(lsgt_switch_lock)"
+ include "level5(ralt_switch_lock)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "koy_base" {
+ include "de(neo_base)"
+
+ key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK";
+ key <AD02> { [ period, enfilledcircbullet, NoSymbol, U03D1, NoSymbol, NoSymbol, U21A6, NoSymbol ] };
+ key <AD04> { [ comma, endash, NoSymbol, U03F1, NoSymbol, NoSymbol, U21D2, NoSymbol ] };
+
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK";
+ key <AD01> { [ k, K, NoSymbol, Greek_kappa, NoSymbol, NoSymbol, multiply, NoSymbol ] };
+ key <AD03> { [ o, O, NoSymbol, Greek_omicron, NoSymbol, NoSymbol, elementof, NoSymbol ] };
+ key <AD05> { [ y, Y, NoSymbol, Greek_upsilon, NoSymbol, NoSymbol, nabla, NoSymbol ] };
+ key <AD06> { [ v, V, NoSymbol, NoSymbol, NoSymbol, NoSymbol, radical, NoSymbol ] };
+ key <AD07> { [ g, G, NoSymbol, Greek_gamma, NoSymbol, NoSymbol, Greek_GAMMA, NoSymbol ] };
+ key <AD08> { [ c, C, NoSymbol, Greek_chi, NoSymbol, NoSymbol, U2102, NoSymbol ] };
+ key <AD09> { [ l, L, NoSymbol, Greek_lambda, NoSymbol, NoSymbol, Greek_LAMBDA, NoSymbol ] };
+ key <AD10> { [ ssharp, U1E9E, NoSymbol, Greek_finalsmallsigma, NoSymbol, NoSymbol, jot, NoSymbol ] };
+ key <AD11> { [ z, Z, NoSymbol, Greek_zeta, NoSymbol, NoSymbol, U2124, NoSymbol ] };
+ key <AC01> { [ h, H, NoSymbol, Greek_psi, NoSymbol, NoSymbol, Greek_PSI, NoSymbol ] };
+ key <AC02> { [ a, A, NoSymbol, Greek_alpha, NoSymbol, NoSymbol, U2200, NoSymbol ] };
+ key <AC03> { [ e, E, NoSymbol, Greek_epsilon, NoSymbol, NoSymbol, U2203, NoSymbol ] };
+ key <AC04> { [ i, I, NoSymbol, Greek_iota, NoSymbol, NoSymbol, integral, NoSymbol ] };
+ key <AC05> { [ u, U, NoSymbol, NoSymbol, NoSymbol, NoSymbol, includedin, NoSymbol ] };
+ key <AC06> { [ d, D, NoSymbol, Greek_delta, NoSymbol, NoSymbol, Greek_DELTA, NoSymbol ] };
+ key <AC07> { [ t, T, NoSymbol, Greek_tau, NoSymbol, NoSymbol, partialderivative, NoSymbol ] };
+ key <AC08> { [ r, R, NoSymbol, Greek_rho, NoSymbol, NoSymbol, U211D, NoSymbol ] };
+ key <AC09> { [ n, N, NoSymbol, Greek_nu, NoSymbol, NoSymbol, U2115, NoSymbol ] };
+ key <AC10> { [ s, S, NoSymbol, Greek_sigma, NoSymbol, NoSymbol, Greek_SIGMA, NoSymbol ] };
+ key <AC11> { [ f, F, NoSymbol, Greek_phi, NoSymbol, NoSymbol, Greek_PHI, NoSymbol ] };
+ key <AB01> { [ x, X, NoSymbol, Greek_xi, NoSymbol, NoSymbol, Greek_XI, NoSymbol ] };
+ key <AB02> { [ q, Q, NoSymbol, U03D5, NoSymbol, NoSymbol, U211A, NoSymbol ] };
+ key <AB03> { [ adiaeresis, Adiaeresis, NoSymbol, Greek_eta, NoSymbol, NoSymbol, U2135, NoSymbol ] };
+ key <AB04> { [ udiaeresis, Udiaeresis, NoSymbol, NoSymbol, NoSymbol, NoSymbol, union, NoSymbol ] };
+ key <AB05> { [ odiaeresis, Odiaeresis, NoSymbol, U03F5, NoSymbol, NoSymbol, intersection, NoSymbol ] };
+ key <AB06> { [ b, B, NoSymbol, Greek_beta, NoSymbol, NoSymbol, U21D0, NoSymbol ] };
+ key <AB07> { [ p, P, NoSymbol, Greek_pi, NoSymbol, NoSymbol, Greek_PI, NoSymbol ] };
+ key <AB08> { [ w, W, NoSymbol, Greek_omega, NoSymbol, NoSymbol, Greek_OMEGA, NoSymbol ] };
+ key <AB09> { [ m, M, NoSymbol, Greek_mu, NoSymbol, NoSymbol, ifonlyif, NoSymbol ] };
+ key <AB10> { [ j, J, NoSymbol, Greek_theta, NoSymbol, NoSymbol, Greek_THETA, NoSymbol ] };
+};
+
+partial alphanumeric_keys modifier_keys keypad_keys
+xkb_symbols "koy" {
+
+ include "de(koy_base)"
+
+ name[Group1]= "German (KOY)";
+
+ include "shift(both_capslock)"
+ include "level3(caps_switch)"
+ include "level3(bksl_switch)"
+ include "level5(lsgt_switch_lock)"
+ include "level5(ralt_switch_lock)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "bone_base" {
+ include "de(neo_base)"
+
+ key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK";
+ key <AB08> { [ comma, endash, NoSymbol, U03F1, NoSymbol, NoSymbol, U21D2, NoSymbol ] };
+ key <AB09> { [ period, enfilledcircbullet, NoSymbol, U03D1, NoSymbol, NoSymbol, U21A6, NoSymbol ] };
+
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK";
+ key <AD01> { [ j, J, NoSymbol, Greek_theta, NoSymbol, NoSymbol, Greek_THETA, NoSymbol ] };
+ key <AD02> { [ d, D, NoSymbol, Greek_delta, NoSymbol, NoSymbol, Greek_DELTA, NoSymbol ] };
+ key <AD03> { [ u, U, NoSymbol, NoSymbol, NoSymbol, NoSymbol, includedin, NoSymbol ] };
+ key <AD04> { [ a, A, NoSymbol, Greek_alpha, NoSymbol, NoSymbol, U2200, NoSymbol ] };
+ key <AD05> { [ x, X, NoSymbol, Greek_xi, NoSymbol, NoSymbol, Greek_XI, NoSymbol ] };
+ key <AD06> { [ p, P, NoSymbol, Greek_pi, NoSymbol, NoSymbol, Greek_PI, NoSymbol ] };
+ key <AD07> { [ h, H, NoSymbol, Greek_psi, NoSymbol, NoSymbol, Greek_PSI, NoSymbol ] };
+ key <AD08> { [ l, L, NoSymbol, Greek_lambda, NoSymbol, NoSymbol, Greek_LAMBDA, NoSymbol ] };
+ key <AD09> { [ m, M, NoSymbol, Greek_mu, NoSymbol, NoSymbol, ifonlyif, NoSymbol ] };
+ key <AD10> { [ w, W, NoSymbol, Greek_omega, NoSymbol, NoSymbol, Greek_OMEGA, NoSymbol ] };
+ key <AD11> { [ ssharp, U1E9E, NoSymbol, Greek_finalsmallsigma, NoSymbol, NoSymbol, jot, NoSymbol ] };
+ key <AC01> { [ c, C, NoSymbol, Greek_chi, NoSymbol, NoSymbol, U2102, NoSymbol ] };
+ key <AC02> { [ t, T, NoSymbol, Greek_tau, NoSymbol, NoSymbol, partialderivative, NoSymbol ] };
+ key <AC03> { [ i, I, NoSymbol, Greek_iota, NoSymbol, NoSymbol, integral, NoSymbol ] };
+ key <AC04> { [ e, E, NoSymbol, Greek_epsilon, NoSymbol, NoSymbol, U2203, NoSymbol ] };
+ key <AC05> { [ o, O, NoSymbol, Greek_omicron, NoSymbol, NoSymbol, elementof, NoSymbol ] };
+ key <AC06> { [ b, B, NoSymbol, Greek_beta, NoSymbol, NoSymbol, U21D0, NoSymbol ] };
+ key <AC07> { [ n, N, NoSymbol, Greek_nu, NoSymbol, NoSymbol, U2115, NoSymbol ] };
+ key <AC08> { [ r, R, NoSymbol, Greek_rho, NoSymbol, NoSymbol, U211D, NoSymbol ] };
+ key <AC09> { [ s, S, NoSymbol, Greek_sigma, NoSymbol, NoSymbol, Greek_SIGMA, NoSymbol ] };
+ key <AC10> { [ g, G, NoSymbol, Greek_gamma, NoSymbol, NoSymbol, Greek_GAMMA, NoSymbol ] };
+ key <AC11> { [ q, Q, NoSymbol, U03D5, NoSymbol, NoSymbol, U211A, NoSymbol ] };
+ key <AB01> { [ f, F, NoSymbol, Greek_phi, NoSymbol, NoSymbol, Greek_PHI, NoSymbol ] };
+ key <AB02> { [ v, V, NoSymbol, NoSymbol, NoSymbol, NoSymbol, radical, NoSymbol ] };
+ key <AB03> { [ udiaeresis, Udiaeresis, NoSymbol, NoSymbol, NoSymbol, NoSymbol, union, NoSymbol ] };
+ key <AB04> { [ adiaeresis, Adiaeresis, NoSymbol, Greek_eta, NoSymbol, NoSymbol, U2135, NoSymbol ] };
+ key <AB05> { [ odiaeresis, Odiaeresis, NoSymbol, U03F5, NoSymbol, NoSymbol, intersection, NoSymbol ] };
+ key <AB06> { [ y, Y, NoSymbol, Greek_upsilon, NoSymbol, NoSymbol, nabla, NoSymbol ] };
+ key <AB07> { [ z, Z, NoSymbol, Greek_zeta, NoSymbol, NoSymbol, U2124, NoSymbol ] };
+ key <AB10> { [ k, K, NoSymbol, Greek_kappa, NoSymbol, NoSymbol, multiply, NoSymbol ] };
+};
+
+partial alphanumeric_keys modifier_keys keypad_keys
+xkb_symbols "bone" {
+
+ include "de(bone_base)"
+
+ name[Group1]= "German (Bone)";
+
+ include "shift(both_capslock)"
+ include "level3(caps_switch)"
+ include "level3(bksl_switch)"
+ include "level5(lsgt_switch_lock)"
+ include "level5(ralt_switch_lock)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "bone_eszett_home_base" {
+ include "de(bone_base)"
+
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK";
+ key <AD11> { [ q, Q, NoSymbol, U03D5, NoSymbol, NoSymbol, U211A, NoSymbol ] };
+ key <AC11> { [ ssharp, U1E9E, NoSymbol, Greek_finalsmallsigma, NoSymbol, NoSymbol, jot, NoSymbol ] };
+};
+
+partial alphanumeric_keys modifier_keys keypad_keys
+xkb_symbols "bone_eszett_home" {
+
+ include "de(bone_eszett_home_base)"
+
+ name[Group1]= "German (Bone, eszett home row)";
+
+ include "shift(both_capslock)"
+ include "level3(caps_switch)"
+ include "level3(bksl_switch)"
+ include "level5(lsgt_switch_lock)"
+ include "level5(ralt_switch_lock)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "neo_qwertz_base" {
+ include "de(neo_base)"
+
+ key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK";
+ key <AB08> { [ comma, endash, NoSymbol, U03F1, NoSymbol, NoSymbol, U21D2, NoSymbol ] };
+ key <AB09> { [ period, enfilledcircbullet, NoSymbol, U03D1, NoSymbol, NoSymbol, U21A6, NoSymbol ] };
+ key <AB10> { [ minus, emdash, NoSymbol, U2011, NoSymbol, NoSymbol, hyphen, NoSymbol ] };
+
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK";
+ key <AE11> { [ ssharp, U1E9E, NoSymbol, Greek_finalsmallsigma, NoSymbol, NoSymbol, jot, NoSymbol ] };
+ key <AD01> { [ q, Q, NoSymbol, U03D5, NoSymbol, NoSymbol, U211A, NoSymbol ] };
+ key <AD02> { [ w, W, NoSymbol, Greek_omega, NoSymbol, NoSymbol, Greek_OMEGA, NoSymbol ] };
+ key <AD03> { [ e, E, NoSymbol, Greek_epsilon, NoSymbol, NoSymbol, U2203, NoSymbol ] };
+ key <AD04> { [ r, R, NoSymbol, Greek_rho, NoSymbol, NoSymbol, U211D, NoSymbol ] };
+ key <AD05> { [ t, T, NoSymbol, Greek_tau, NoSymbol, NoSymbol, partialderivative, NoSymbol ] };
+ key <AD06> { [ z, Z, NoSymbol, Greek_zeta, NoSymbol, NoSymbol, U2124, NoSymbol ] };
+ key <AD07> { [ u, U, NoSymbol, NoSymbol, NoSymbol, NoSymbol, includedin, NoSymbol ] };
+ key <AD08> { [ i, I, NoSymbol, Greek_iota, NoSymbol, NoSymbol, integral, NoSymbol ] };
+ key <AD09> { [ o, O, NoSymbol, Greek_omicron, NoSymbol, NoSymbol, elementof, NoSymbol ] };
+ key <AD10> { [ p, P, NoSymbol, Greek_pi, NoSymbol, NoSymbol, Greek_PI, NoSymbol ] };
+ key <AD11> { [ udiaeresis, Udiaeresis, NoSymbol, NoSymbol, NoSymbol, NoSymbol, union, NoSymbol ] };
+ key <AC01> { [ a, A, NoSymbol, Greek_alpha, NoSymbol, NoSymbol, U2200, NoSymbol ] };
+ key <AC02> { [ s, S, NoSymbol, Greek_sigma, NoSymbol, NoSymbol, Greek_SIGMA, NoSymbol ] };
+ key <AC03> { [ d, D, NoSymbol, Greek_delta, NoSymbol, NoSymbol, Greek_DELTA, NoSymbol ] };
+ key <AC04> { [ f, F, NoSymbol, Greek_phi, NoSymbol, NoSymbol, Greek_PHI, NoSymbol ] };
+ key <AC05> { [ g, G, NoSymbol, Greek_gamma, NoSymbol, NoSymbol, Greek_GAMMA, NoSymbol ] };
+ key <AC06> { [ h, H, NoSymbol, Greek_psi, NoSymbol, NoSymbol, Greek_PSI, NoSymbol ] };
+ key <AC07> { [ j, J, NoSymbol, Greek_theta, NoSymbol, NoSymbol, Greek_THETA, NoSymbol ] };
+ key <AC08> { [ k, K, NoSymbol, Greek_kappa, NoSymbol, NoSymbol, multiply, NoSymbol ] };
+ key <AC09> { [ l, L, NoSymbol, Greek_lambda, NoSymbol, NoSymbol, Greek_LAMBDA, NoSymbol ] };
+ key <AC10> { [ odiaeresis, Odiaeresis, NoSymbol, U03F5, NoSymbol, NoSymbol, intersection, NoSymbol ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, NoSymbol, Greek_eta, NoSymbol, NoSymbol, U2135, NoSymbol ] };
+ key <AB01> { [ y, Y, NoSymbol, Greek_upsilon, NoSymbol, NoSymbol, nabla, NoSymbol ] };
+ key <AB02> { [ x, X, NoSymbol, Greek_xi, NoSymbol, NoSymbol, Greek_XI, NoSymbol ] };
+ key <AB03> { [ c, C, NoSymbol, Greek_chi, NoSymbol, NoSymbol, U2102, NoSymbol ] };
+ key <AB04> { [ v, V, NoSymbol, NoSymbol, NoSymbol, NoSymbol, radical, NoSymbol ] };
+ key <AB05> { [ b, B, NoSymbol, Greek_beta, NoSymbol, NoSymbol, U21D0, NoSymbol ] };
+ key <AB06> { [ n, N, NoSymbol, Greek_nu, NoSymbol, NoSymbol, U2115, NoSymbol ] };
+ key <AB07> { [ m, M, NoSymbol, Greek_mu, NoSymbol, NoSymbol, ifonlyif, NoSymbol ] };
+};
+
+partial alphanumeric_keys modifier_keys keypad_keys
+xkb_symbols "neo_qwertz" {
+
+ include "de(neo_qwertz_base)"
+
+ name[Group1]= "German (Neo qwertz)";
+
+ include "shift(both_capslock)"
+ include "level3(caps_switch)"
+ include "level3(bksl_switch)"
+ include "level5(lsgt_switch_lock)"
+ include "level5(ralt_switch_lock)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "neo_qwerty_base" {
+ include "de(neo_qwertz_base)"
+
+ key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK";
+ key <AD06> { [ y, Y, NoSymbol, Greek_upsilon, NoSymbol, NoSymbol, nabla, NoSymbol ] };
+ key <AB01> { [ z, Z, NoSymbol, Greek_zeta, NoSymbol, NoSymbol, U2124, NoSymbol ] };
+};
+
+partial alphanumeric_keys modifier_keys keypad_keys
+xkb_symbols "neo_qwerty" {
+
+ include "de(neo_qwerty_base)"
+
+ name[Group1]= "German (Neo qwerty)";
+
+ include "shift(both_capslock)"
+ include "level3(caps_switch)"
+ include "level3(bksl_switch)"
+ include "level5(lsgt_switch_lock)"
+ include "level5(ralt_switch_lock)"
+};
+
+partial alphanumeric_keys
+ xkb_symbols "lld" {
+ include "de(basic)"
+ name[Group1] = "German Ladin";
+
+ key <AD10> { [ p, P, ediaeresis, Ediaeresis ] };
+
+};
diff --git a/test/data/symbols/empty b/test/data/symbols/empty
new file mode 100644
index 0000000..acdd677
--- /dev/null
+++ b/test/data/symbols/empty
@@ -0,0 +1,4 @@
+default partial alphanumeric_keys modifier_keys
+xkb_symbols "basic" {
+ name[Group1]= "Empty";
+};
diff --git a/test/data/symbols/eurosign b/test/data/symbols/eurosign
new file mode 100644
index 0000000..0d95a90
--- /dev/null
+++ b/test/data/symbols/eurosign
@@ -0,0 +1,23 @@
+// Most keyboards have the EuroSign engraved on the E key
+partial
+xkb_symbols "e" {
+ key <AD03> { [ NoSymbol, NoSymbol, EuroSign, NoSymbol ] };
+};
+
+// Many Apple keyboards have the EuroSign engraved on the 2 key
+partial
+xkb_symbols "2" {
+ key <AE02> { [ NoSymbol, NoSymbol, EuroSign, NoSymbol ] };
+};
+
+// Some keyboards have the EuroSign engraved on the 4 key
+partial
+xkb_symbols "4" {
+ key <AE04> { [ NoSymbol, NoSymbol, EuroSign, NoSymbol ] };
+};
+
+// Many keyboards have the EuroSign engraved on the 5 key
+partial
+xkb_symbols "5" {
+ key <AE05> { [ NoSymbol, NoSymbol, EuroSign, NoSymbol ] };
+};
diff --git a/test/data/symbols/group b/test/data/symbols/group
new file mode 100644
index 0000000..12f35a4
--- /dev/null
+++ b/test/data/symbols/group
@@ -0,0 +1,469 @@
+// The right Alt key (while pressed) chooses the second keyboard group.
+partial modifier_keys
+xkb_symbols "switch" {
+ key <RALT> {
+ symbols[Group1] = [ Mode_switch, Multi_key ],
+ virtualMods= AltGr
+ };
+};
+
+// The left Alt key (while pressed) chooses the second keyboard group.
+partial modifier_keys
+xkb_symbols "lswitch" {
+ key <LALT> {
+ symbols[Group1] = [ Mode_switch, Multi_key ],
+ virtualMods= AltGr
+ };
+};
+
+// Either Win key (while pressed) chooses the second keyboard group.
+partial modifier_keys
+xkb_symbols "win_switch" {
+ include "group(lwin_switch)"
+ include "group(rwin_switch)"
+};
+
+// The left Win key (while pressed) chooses the second keyboard group.
+// (Using this map, you should declare your keyboard as pc101 or pc102
+// instead of pc104 or pc105.)
+partial modifier_keys
+xkb_symbols "lwin_switch" {
+ key <LWIN> {
+ symbols[Group1] = [ Mode_switch, Multi_key ],
+ virtualMods= AltGr
+ };
+};
+
+// The right Win key (while pressed) chooses the second keyboard group.
+// (Using this map, you should declare your keyboard as pc101 or pc102
+// instead of pc104 or pc105.)
+partial modifier_keys
+xkb_symbols "rwin_switch" {
+ key <RWIN> {
+ symbols[Group1] = [ Mode_switch, Multi_key ],
+ virtualMods= AltGr
+ };
+};
+
+// The right Menu key (while pressed) chooses the second keyboard group.
+// while Shift+Menu acts as Menu.
+partial modifier_keys
+xkb_symbols "menu_switch" {
+ key <MENU> {
+ symbols[Group1] = [ Mode_switch, Menu ],
+ virtualMods= AltGr
+ };
+};
+
+// The right Ctrl key (while pressed) chooses the second keyboard group.
+// (Needed mainly for the Canadian keyboard.)
+partial modifier_keys
+xkb_symbols "rctrl_switch" {
+ key <RCTL> {
+ symbols[Group1] = [ Mode_switch ]
+ };
+};
+
+// Pressing the right Alt key switches to the next group.
+partial modifier_keys
+xkb_symbols "toggle" {
+ virtual_modifiers AltGr;
+ key <RALT> {
+ symbols[Group1] = [ ISO_Next_Group ],
+ virtualMods= AltGr
+ };
+};
+
+// Pressing both Shift keys switches to the next or previous group
+// (depending on which Shift is pressed first).
+partial modifier_keys
+xkb_symbols "shifts_toggle" {
+ key <LFSH> { [ Shift_L, ISO_Prev_Group ] };
+ key <RTSH> { [ Shift_R, ISO_Next_Group ] };
+};
+
+// Pressing Shift+Caps_Lock switches to the next group.
+partial modifier_keys
+xkb_symbols "shift_caps_toggle" {
+ key <CAPS> { [ Caps_Lock, ISO_Next_Group ] };
+};
+
+// Pressing Caps_Lock selects the first group,
+// pressing Shift+Caps_Lock selects the last group.
+partial modifier_keys
+xkb_symbols "shift_caps_switch" {
+ key <CAPS> { [ ISO_First_Group, ISO_Last_Group ] };
+};
+
+// toggle using win + space as combo
+partial modifier_keys
+xkb_symbols "win_space_toggle" {
+ key <SPCE> {
+ type="PC_SUPER_LEVEL2",
+ symbols[Group1]= [ space, ISO_Next_Group ],
+ symbols[Group2]= [ space, ISO_Next_Group ]
+ };
+};
+
+// Pressing the left Win key selects the first group,
+// pressing the right Win or the Menu key selects the last group.
+partial modifier_keys
+xkb_symbols "win_menu_switch" {
+ virtual_modifiers AltGr;
+ key <LWIN> {
+ virtualMods= AltGr,
+ symbols[Group1] = [ ISO_First_Group ]
+ };
+ key <MENU> {
+ virtualMods= AltGr,
+ symbols[Group1] = [ ISO_Last_Group ]
+ };
+ key <RWIN> {
+ virtualMods= AltGr,
+ symbols[Group1] = [ ISO_Last_Group ]
+ };
+};
+
+// Pressing the left Ctrl key selects the first group,
+// pressing the right Ctrl key selects the last group.
+partial modifier_keys
+xkb_symbols "lctrl_rctrl_switch" {
+ virtual_modifiers AltGr;
+ key <LCTL> {
+ virtualMods= AltGr,
+ symbols[Group1] = [ ISO_First_Group ]
+ };
+ key <RCTL> {
+ virtualMods= AltGr,
+ symbols[Group1] = [ ISO_Last_Group ]
+ };
+};
+
+
+//
+// CTRL-SHIFT toggle section
+//
+partial modifier_keys
+xkb_symbols "lctrl_lshift_toggle" {
+ key <LFSH> {
+ type[Group1]="PC_CONTROL_LEVEL2",
+ symbols[Group1] = [ Shift_L, ISO_Next_Group ]
+ };
+ key <LCTL> { [ Control_L, ISO_Next_Group ] };
+};
+
+partial modifier_keys
+xkb_symbols "lctrl_lshift_toggle_rev" {
+ key <LFSH> {
+ type[Group1]="PC_CONTROL_LEVEL2",
+ symbols[Group1] = [ Shift_L, ISO_Prev_Group ]
+ };
+ key <LCTL> { [ Control_L, ISO_Prev_Group ] };
+};
+
+partial modifier_keys
+xkb_symbols "rctrl_rshift_toggle" {
+ key <RTSH> {
+ type[Group1]="PC_CONTROL_LEVEL2",
+ symbols[Group1] = [ Shift_R, ISO_Next_Group ]
+ };
+ key <RCTL> { [ Control_R, ISO_Next_Group ] };
+};
+
+partial modifier_keys
+xkb_symbols "ctrl_shift_toggle" {
+ include "group(lctrl_lshift_toggle)"
+ include "group(rctrl_rshift_toggle)"
+};
+
+partial modifier_keys
+xkb_symbols "ctrl_shift_toggle_bidir" {
+ include "group(lctrl_lshift_toggle_rev)"
+ include "group(rctrl_rshift_toggle)"
+};
+
+
+//
+// CTRL-ALT toggle section
+//
+partial modifier_keys
+xkb_symbols "lctrl_lalt_toggle" {
+ virtual_modifiers Alt;
+ key <LALT> {
+ type[Group1]="PC_CONTROL_LEVEL2",
+ symbols[Group1] = [ NoSymbol, ISO_Next_Group ],
+ virtualMods= Alt
+ };
+ key <LCTL> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1] = [ Control_L, ISO_Next_Group ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "lctrl_lalt_toggle_rev" {
+ virtual_modifiers Alt;
+ key <LALT> {
+ type[Group1]="PC_CONTROL_LEVEL2",
+ symbols[Group1] = [ NoSymbol, ISO_Prev_Group ],
+ virtualMods= Alt
+ };
+ key <LCTL> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1] = [ Control_L, ISO_Prev_Group ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "rctrl_ralt_toggle" {
+ virtual_modifiers Alt;
+ key <RALT> {
+ type[Group1]="PC_CONTROL_LEVEL2",
+ symbols[Group1] = [ NoSymbol, ISO_Next_Group ],
+ virtualMods= Alt
+ };
+ key <RCTL> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1] = [ Control_R, ISO_Next_Group ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "ctrl_alt_toggle" {
+ include "group(lctrl_lalt_toggle)"
+ include "group(rctrl_ralt_toggle)"
+};
+
+partial modifier_keys
+xkb_symbols "ctrl_alt_toggle_bidir" {
+ include "group(lctrl_lalt_toggle_rev)"
+ include "group(rctrl_ralt_toggle)"
+};
+
+
+//
+// ALT-SHIFT toggle section
+//
+partial modifier_keys
+xkb_symbols "lalt_lshift_toggle" {
+ virtual_modifiers Alt;
+ key <LALT> {
+ symbols[Group1] = [ NoSymbol, ISO_Next_Group ],
+ virtualMods= Alt
+ };
+ key <LFSH> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1] = [ Shift_L, ISO_Next_Group ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "lalt_lshift_toggle_rev" {
+ virtual_modifiers Alt;
+ key <LALT> {
+ symbols[Group1] = [ NoSymbol, ISO_Prev_Group ],
+ virtualMods= Alt
+ };
+ key <LFSH> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1] = [ Shift_L, ISO_Prev_Group ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "ralt_rshift_toggle" {
+ virtual_modifiers Alt;
+ key <RALT> {
+ symbols[Group1] = [ NoSymbol, ISO_Next_Group ],
+ virtualMods= Alt
+ };
+ key <RTSH> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1] = [ Shift_R, ISO_Next_Group ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "alt_shift_toggle" {
+ include "group(lalt_lshift_toggle)"
+ include "group(ralt_rshift_toggle)"
+};
+
+partial modifier_keys
+xkb_symbols "alt_shift_toggle_bidir" {
+ include "group(lalt_lshift_toggle_rev)"
+ include "group(ralt_rshift_toggle)"
+};
+
+
+// Pressing the Menu key switches to the next group,
+// while Shift+Menu acts as Menu.
+partial modifier_keys
+xkb_symbols "menu_toggle" {
+ key <MENU> { [ ISO_Next_Group, Menu ] };
+};
+
+// Pressing the left Win key switches to the next group.
+// (Using this map, you should declare your keyboard as
+// pc101 or pc102 instead of pc104 or pc105.)
+partial modifier_keys
+xkb_symbols "lwin_toggle" {
+ virtual_modifiers AltGr;
+ key <LWIN> {
+ virtualMods= AltGr,
+ symbols[Group1] = [ ISO_Next_Group ]
+ };
+};
+
+// Pressing the right Win key switches to the next group.
+// (Using this map, you should declare your keyboard as
+// pc101 or pc102 instead of pc104 or pc105.)
+partial modifier_keys
+xkb_symbols "rwin_toggle" {
+ virtual_modifiers AltGr;
+ key <RWIN> {
+ virtualMods= AltGr,
+ symbols[Group1] = [ ISO_Next_Group ]
+ };
+};
+
+// Pressing both Ctrl keys switches to the next or previous group
+// (depending on which Ctrl is pressed first).
+partial modifier_keys
+xkb_symbols "ctrls_toggle" {
+ virtual_modifiers LControl, RControl;
+ key <LCTL> {
+ type[Group1]="PC_CONTROL_LEVEL2",
+ symbols[Group1] = [ NoSymbol, ISO_Prev_Group ],
+ virtualMods= LControl
+ };
+ key <RCTL> {
+ type[Group1]="PC_CONTROL_LEVEL2",
+ symbols[Group1] = [ NoSymbol, ISO_Next_Group ],
+ virtualMods= RControl
+ };
+};
+
+// Pressing both Alt switches to the next or previous group
+// (depending on which Alt is pressed first).
+partial modifier_keys
+xkb_symbols "alts_toggle" {
+ virtual_modifiers LAlt, RAlt;
+ key <LALT> {
+ type[Group1]="PC_RALT_LEVEL2",
+ symbols[Group1] = [ NoSymbol, ISO_Prev_Group ],
+ virtualMods= LAlt
+ };
+ key <RALT> {
+ type[Group1]="PC_LALT_LEVEL2",
+ symbols[Group1] = [ NoSymbol, ISO_Next_Group ],
+ virtualMods= RAlt
+ };
+};
+
+// Pressing the left Shift key switches to the next group.
+partial modifier_keys
+xkb_symbols "lshift_toggle" {
+ virtual_modifiers AltGr;
+ key <LFSH> {
+ symbols[Group1] = [ ISO_Next_Group ],
+ virtualMods= AltGr
+ };
+};
+
+// Pressing the right Shift key switches to the next group.
+partial modifier_keys
+xkb_symbols "rshift_toggle" {
+ virtual_modifiers AltGr;
+ key <RTSH> {
+ symbols[Group1] = [ ISO_Next_Group ],
+ virtualMods= AltGr
+ };
+};
+
+// Pressing the left Alt key switches to the next group.
+partial modifier_keys
+xkb_symbols "lalt_toggle" {
+ virtual_modifiers AltGr;
+ key <LALT> {
+ symbols[Group1] = [ ISO_Next_Group ],
+ virtualMods= AltGr
+ };
+};
+
+// Pressing the left Ctrl key switches to the next group.
+partial modifier_keys
+xkb_symbols "lctrl_toggle" {
+ virtual_modifiers AltGr;
+ key <LCTL> {
+ symbols[Group1] = [ ISO_Next_Group ],
+ virtualMods= AltGr
+ };
+};
+
+// Pressing the right Ctrl key switches to the next group.
+partial modifier_keys
+xkb_symbols "rctrl_toggle" {
+ virtual_modifiers AltGr;
+ key <RCTL> {
+ symbols[Group1] = [ ISO_Next_Group ],
+ virtualMods= AltGr
+ };
+};
+
+// Pressing Alt+Caps_Lock switches to the next group,
+// pressing Caps_Lock toggles CapsLock.
+partial modifier_keys
+xkb_symbols "alt_caps_toggle" {
+ key <CAPS> {
+ type="PC_ALT_LEVEL2",
+ symbols[Group1] = [ Caps_Lock, ISO_Next_Group ]
+ };
+};
+
+hidden partial modifier_keys
+xkb_symbols "olpc" {
+ key <I219> { [ ISO_Next_Group, ISO_Prev_Group ] };
+};
+
+partial modifier_keys
+xkb_symbols "alt_space_toggle" {
+ key <SPCE> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1] = [ space, ISO_Next_Group ]
+ };
+};
+
+// Pressing the Scroll Lock key switches to the next group,
+partial modifier_keys
+xkb_symbols "sclk_toggle" {
+ virtual_modifiers AltGr;
+ key <SCLK> {
+ virtualMods= AltGr,
+ symbols[Group1] = [ ISO_Next_Group ]
+ };
+};
+
+// Control_L+Win_L selects the first group (presumably Lat),
+// Control_R+Menu selects the second group (presumably Rus).
+partial modifier_keys
+xkb_symbols "lctrl_lwin_rctrl_menu" {
+ key <LWIN> {
+ type[Group1] = "PC_CONTROL_LEVEL2",
+ symbols[Group1] = [ Super_L, ISO_First_Group ]
+ };
+ key <MENU> {
+ type[Group1] = "PC_CONTROL_LEVEL2",
+ symbols[Group1] = [ Menu, ISO_Last_Group ]
+ };
+};
+
+// Control_L+Win_L toggles groups.
+partial modifier_keys
+xkb_symbols "lctrl_lwin_toggle" {
+ key <LWIN> {
+ type[ Group1 ] = "PC_CONTROL_LEVEL2",
+ symbols[ Group1 ] = [ Super_L, ISO_Next_Group ]
+ };
+};
+
diff --git a/test/data/symbols/il b/test/data/symbols/il
new file mode 100644
index 0000000..67487c1
--- /dev/null
+++ b/test/data/symbols/il
@@ -0,0 +1,323 @@
+// based on a keyboard map from an 'xkb/symbols/il' file
+
+// This is an implemetation of the Israeli standard SI-1452 (2013)
+// It does not implement changes to the English layout, as that part
+// of the standard is not normative nor really useful in the context
+// of xkb.
+// This implementation extends the standard with Yiddish digraphs
+// (a common extension) and Nun Hafukha (a fun character).
+
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+ // uses the kbd layout in use in Israel.
+
+ name[Group1]= "Hebrew";
+ key.type[Group1] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ key <AB01> { [ hebrew_zain, Z ] };
+ key <AB02> { [ hebrew_samech, X, U05B6 ] }; // Segol
+ key <AB03> { [ hebrew_bet, C, U05B1 ] }; // Hataf Segol
+ key <AB04> { [ hebrew_he, V ] };
+ key <AB05> { [ hebrew_nun, B, NoSymbol, U05C6 ]}; // Nun Hafukha
+ key <AB06> { [ hebrew_mem, N ] };
+ key <AB07> { [ hebrew_zade, M, U05B5 ] }; // Tsere
+ key <AB08> { [ hebrew_taw, greater, rightsinglequotemark ]}; // greater Mirrored
+ key <AB09> { [ hebrew_finalzade, less, singlelowquotemark ]}; // less Mirrored
+
+ key <AC01> { [ hebrew_shin, A, U05B0 ] }; // Shva
+ key <AC02> { [ hebrew_dalet,S, U05BC ] }; // Dagesh
+ key <AC03> { [ hebrew_gimel,D ] };
+ key <AC04> { [ hebrew_kaph, F ] };
+ key <AC05> { [ hebrew_ayin, G, U05F1 ] }; // Yiddish Vav Yod
+ key <AC06> { [ hebrew_yod, H, U05F2 ] }; // Yiddish Double Yod
+ key <AC07> { [ hebrew_chet, J, U05B4 ] }; // Hiriq
+ key <AC08> { [ hebrew_lamed, K ] };
+ key <AC09> { [ hebrew_finalkaph, L, rightdoublequotemark ]};
+ key <AC10> { [ hebrew_finalpe, colon, doublelowquotemark ]};
+
+ key <AD01> { [ slash, Q, U05C2 ] }; // Sin Dot
+ key <AD02> { [ apostrophe, W, U05C1 ] }; // Shin Dot
+ key <AD03> { [ hebrew_qoph, E, U05B8 ] }; // Qamats
+ key <AD04> { [ hebrew_resh, R, U05B3 ] }; // Hataf Qamats
+ key <AD05> { [ hebrew_aleph,T ] };
+ key <AD06> { [ hebrew_tet, Y, U05F0 ] }; // Yiddish Double Vav
+ key <AD07> { [ hebrew_waw, U, U05B9 ] }; // Holam
+ key <AD08> { [ hebrew_finalnun, I ] };
+ key <AD09> { [ hebrew_finalmem, O ] };
+ key <AD10> { [ hebrew_pe, P, U05B7 ] }; // Patah
+
+ key.type[Group1] = "FOUR_LEVEL";
+
+ // Non-alphanumeric keys
+ key <AB10> { [ period, question, division ]};
+ key <AC11> { [ comma, quotedbl, U05F4] }; // Gershayim
+ key <AD11> { [ bracketright, braceright, U05B2 ]}; // Mirrored; Hataf Patah
+ key <AD12> { [ bracketleft, braceleft, U05BF ]}; // Mirrored; Rafe
+ key <BKSL> { [ backslash, bar, U05BB ] }; // Qubuts
+
+ // Top (digits) row
+ key <TLDE> { [ semicolon, asciitilde, U05F3 ]}; // Geresh
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign, EuroSign ]};
+ key <AE04> { [ 4, dollar, NewSheqelSign ]};
+ key <AE05> { [ 5, percent, degree ]};
+ key <AE06> { [ 6, asciicircum, U05AB ]}; // Hebrew Accent Ole
+ key <AE07> { [ 7, ampersand, U05BD ]}; // Meteg
+ key <AE08> { [ 8, asterisk, multiply]};
+ key <AE09> { [ 9, parenright, U200E ]}; // LRM; Paren Mirrored
+ key <AE10> { [ 0, parenleft, U200F ]}; // RLM; Paren Mirrored
+ key <AE11> { [ minus, underscore, U05BE ]}; // Maqaf
+ key <AE12> { [ equal, plus, endash ]};
+
+ include "level3(ralt_switch)"
+};
+
+
+// nikud patter based on Dekel Tsur's Hebrew mapping for LyX
+partial alphanumeric_keys
+xkb_symbols "lyx" {
+ name[Group1]= "Hebrew (lyx)";
+
+ key <TLDE> { [ semicolon, asciitilde ] };
+ // On some key (e.g. AD01, right below) there is not yet mapping for the
+ // second shift level. Since I could not figure a simple way to map this
+ // to "emit nothing", it is currently mapped to the same letter of the
+ // first shift level (avoiding mapping may risk it be used by a character
+ // from a different group).
+ key <AD01> { [ slash, slash ] };
+ key <AD02> { [ apostrophe, apostrophe ] };
+ key <AD03> { [ hebrew_qoph, 0x10005b8 ] }; // Qamats
+ key <AD04> { [ hebrew_resh, 0x10005bc ] }; // Dagesh/Shuruq
+ key <AD05> { [ hebrew_aleph, 0x100200e ] }; // LRM
+ key <AD06> { [ hebrew_tet, 0x100200f ] }; // RLM
+ key <AD07> { [ hebrew_waw, 0x10005b9 ] }; // Holam
+ key <AD08> { [ hebrew_finalnun,hebrew_finalnun] };
+ key <AD09> { [ hebrew_finalmem,hebrew_finalmem] };
+ key <AD10> { [ hebrew_pe, 0x10005b7 ] }; // Patah
+
+ key <AC01> { [ hebrew_shin, 0x10005b0 ] }; // Sheva
+ key <AC02> { [ hebrew_dalet, 0x10005bc ] }; // Dagesh/Shuruq
+ key <AC03> { [ hebrew_gimel, hebrew_gimel ] };
+ key <AC04> { [ hebrew_kaph, hebrew_kaph ] };
+ key <AC05> { [ hebrew_ayin, 0x10005c2 ] }; // Sin dot
+ key <AC06> { [ hebrew_yod, 0x10005c1 ] }; // Shin dot
+ key <AC07> { [ hebrew_chet, 0x10005b4 ] }; // Hiriq
+ key <AC08> { [ hebrew_lamed, 0x10020aa ] }; // NIS
+ key <AC09> { [ hebrew_finalkaph,hebrew_finalkaph] };
+ key <AC10> { [ hebrew_finalpe, colon ] };
+ key <AC11> { [ comma, quotedbl ] };
+
+ key <AB01> { [ hebrew_zain, hebrew_zain ] };
+ key <AB02> { [ hebrew_samech,0x10005b6 ] }; // Segol
+ key <AB03> { [ hebrew_bet, 0x10005bb ] }; // Qubuts
+ key <AB04> { [ hebrew_he, 0x10005b1 ] }; // H. Segol
+ key <AB05> { [ hebrew_nun, 0x10005b2 ] }; // H. Patah
+ key <AB06> { [ hebrew_mem, 0x10005b3 ] }; // H. Qamats
+ key <AB07> { [ hebrew_zade, 0x10005b5 ] }; // Tsere
+ key <AB08> { [ hebrew_taw, greater ] };
+ key <AB09> { [ hebrew_finalzade, less ] };
+ key <AB10> { [ period, question ] };
+
+ // Note the parens mirroring below:
+ key <AD11> { [ bracketright, braceright ] };
+ key <AD12> { [ bracketleft, braceleft ] };
+ key <AE01> { [ 1, exclam ]};
+ key <AE02> { [ 2, at ]};
+ key <AE03> { [ 3, numbersign ]};
+ key <AE04> { [ 4, dollar ]};
+ key <AE05> { [ 5, percent ]};
+ key <AE06> { [ 6, asciicircum ]};
+ key <AE07> { [ 7, ampersand ]};
+ key <AE08> { [ 8, asterisk ]};
+ key <AE09> { [ 9, parenright ]};
+ key <AE10> { [ 0, parenleft ]};
+
+ key <AE11> { [ minus , 0x10005be ] }; // H. Hiphen
+ key <AE12> { [ equal , plus ] };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "phonetic" {
+
+ // uses the phonetic layout from old Slackware 'il.map' file
+
+ name[Group1]= "Hebrew (phonetic)";
+
+ key <AE12> { [ equal, plus, hebrew_doublelowline, hebrew_doublelowline ]};
+
+ key <LatQ> { [ hebrew_qoph, hebrew_qoph ] };
+ key <LatW> { [ hebrew_waw, hebrew_waw ] };
+ key <LatE> { [ hebrew_aleph, hebrew_aleph ] };
+ key <LatR> { [ hebrew_resh, hebrew_resh ] };
+ key <LatT> { [ hebrew_taw, hebrew_tet ] };
+ key <LatY> { [ hebrew_ayin, hebrew_ayin ] };
+ key <LatU> { [ hebrew_waw, hebrew_waw ] };
+ key <LatI> { [ hebrew_yod, hebrew_yod ] };
+ key <LatO> { [ hebrew_samech, hebrew_samech ] };
+ key <LatP> { [ hebrew_pe, hebrew_finalpe ] };
+
+ key <LatA> { [ hebrew_aleph, hebrew_aleph ] };
+ key <LatS> { [ hebrew_shin, hebrew_shin ] };
+ key <LatD> { [ hebrew_dalet, hebrew_dalet ] };
+ key <LatF> { [ hebrew_pe, hebrew_finalpe ] };
+ key <LatG> { [ hebrew_gimel, hebrew_gimel ] };
+ key <LatH> { [ hebrew_he, hebrew_he ] };
+ key <LatJ> { [ hebrew_yod, hebrew_yod ] };
+ key <LatK> { [ hebrew_kaph, hebrew_finalkaph ] };
+ key <LatL> { [ hebrew_lamed, hebrew_lamed ] };
+
+ key <LatZ> { [ hebrew_zain, hebrew_zain ] };
+ key <LatX> { [ hebrew_chet, hebrew_chet ] };
+ key <LatC> { [ hebrew_zade, hebrew_finalzade ] };
+ key <LatV> { [ hebrew_waw, hebrew_waw ] };
+ key <LatB> { [ hebrew_bet, hebrew_bet ] };
+ key <LatN> { [ hebrew_nun, hebrew_finalnun ] };
+ key <LatM> { [ hebrew_mem, hebrew_finalmem ] };
+};
+
+// The 'Biblical Hebrew' keyboard layout as defined by Tiro for use with the
+// 'SBL Hebrew' font was added 2006.11.13 by Sebastian J. Bronner
+// <waschtl@sbronner.com>. Its primary features (as compared to the lyx layout)
+// are that the consonants are in the Israeli standard positions, that a great
+// multitude of glyphs can be input directly from the keyboard, and that it is
+// the closest thing to a standard layout a theologian can hope for.
+// Documentation (including printable keyboard tables), SBL Hebrew font, and
+// keyboard layout for Windows are available at
+// http://www.sbl-site.org/Resources/Resources_BiblicalFonts.aspx.
+//
+// It is of interest that the 'basic' layout defined first in this file (as
+// ships with x.org disagrees in the non-consonant characters that the Tiro-
+// layout claims to be the Israeli standard. Tiros apparent diligence in the
+// PDF-documentation accompanying the keyboard-layout-files lead me to put
+// greater stock in their claim than in this file. Therefore, the 'biblical'
+// layout below does not include 'il(basic)' but redoes the _whole_ thing from
+// scratch.
+
+partial alphanumeric_keys
+xkb_symbols "biblical" {
+ name[Group1]= "Hebrew (Biblical, Tiro)";
+ key.type = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ key <TLDE> { [ U05C3, U05AE, semicolon, asciitilde ] };
+ key <AE01> { [ 1, U05A9, VoidSymbol, exclam ] };
+ key <AE02> { [ 2, U0599, VoidSymbol, at ] };
+ key <AE03> { [ 3, U0592, VoidSymbol, numbersign ] };
+ key <AE04> { [ 4, U05AF, NewSheqelSign, dollar ] };
+ key <AE05> { [ 5, U05BA, U200D, percent ] };
+ key <AE06> { [ 6, U05B9, U200C, asciicircum ] };
+ key <AE07> { [ 7, U05BF, U034F, ampersand ] };
+ key <AE08> { [ 8, U05C2, U200E, asterisk ] };
+ key <AE09> { [ 9, U05C1, U200F, parenright ] };
+ key <AE10> { [ 0, U059D, U25CC, parenleft ] };
+ key <AE11> { [ U05BE, U05A0, minus, underscore ] };
+ key <AE12> { [ equal, U05BC, VoidSymbol, plus ] };
+
+ key <AD01> { [ U0307, U05C4, U0308, slash ] };
+ key <AD02> { [ U05F3, U05AC, U05F4, apostrophe ] };
+ key <AD03> { [ hebrew_qoph, U05AB, U20AC ] };
+ key <AD04> { [ hebrew_resh, U059F ] };
+ key <AD05> { [ hebrew_aleph, U0593 ] };
+ key <AD06> { [ hebrew_tet, U059E ] };
+ key <AD07> { [ hebrew_waw, U059C, U05F0 ] };
+ key <AD08> { [ hebrew_finalnun, U05A1 ] };
+ key <AD09> { [ hebrew_finalmem, U0595 ] };
+ key <AD10> { [ hebrew_pe, U0594 ] };
+ key <AD11> { [ bracketright, U0597, VoidSymbol, braceright ] };
+ key <AD12> { [ bracketleft, U0598, VoidSymbol, braceleft ] };
+ key <BKSL> { [ U05C0, U05A8, backslash, bar ] };
+
+ key <AC01> { [ hebrew_shin, U05BD ] };
+ key <AC02> { [ hebrew_dalet, U05B0 ] };
+ key <AC03> { [ hebrew_gimel, U05BB ] };
+ key <AC04> { [ hebrew_kaph, U05B4 ] };
+ key <AC05> { [ hebrew_ayin, U05B1 ] };
+ key <AC06> { [ hebrew_yod, U05B6, U05F2 ] };
+ key <AC07> { [ hebrew_chet, U05B5, U05F1 ] };
+ key <AC08> { [ hebrew_lamed, U05B3 ] };
+ key <AC09> { [ hebrew_finalkaph, U05B8, U05C7 ] };
+ key <AC10> { [ hebrew_finalpe, U05B2, VoidSymbol, colon ] };
+ key <AC11> { [ U059a, U05B7, comma, quotedbl ] };
+
+ key <AB01> { [ hebrew_zain, U05C5 ] };
+ key <AB02> { [ hebrew_samech, U05A4 ] };
+ key <AB03> { [ hebrew_bet, U05AA, U05A2 ] };
+ key <AB04> { [ hebrew_he, U05A6 ] };
+ key <AB05> { [ hebrew_nun, U05A5, U05C6 ] };
+ key <AB06> { [ hebrew_mem, U05A7 ] };
+ key <AB07> { [ hebrew_zade, U059B ] };
+ key <AB08> { [ hebrew_taw, U0591, VoidSymbol, greater ] };
+ key <AB09> { [ hebrew_finalzade, U0596, VoidSymbol, less ] };
+ key <AB10> { [ U05AD, U05A3, period, question ] };
+
+ key <SPCE> { [ space, space, thinspace, nobreakspace ] };
+};
+
+// EXTRAS
+
+// Biblical hebrew (SIL) US Standard layout version 1.5
+// This map is based closely on v 1.5 of the standard. The only deviation being the replacement of the composite characters sin and shin
+// by their more recent Unicodev6 counterparts
+// this map contains all the characters found in Biblical annotation, masoretic and Dead Sea Scroll related work.
+// The layout corresponds phonetically to a US standard layout or similar (Qwerty).
+// If you are using an actual Hebrew keyboard, you are probably better off using a Tiro compliant scholarly layout
+// This linux port created and maintained by Dennis Meulensteen, dennis@meulensteen.nl
+partial alphanumeric_keys
+xkb_symbols "biblicalSIL" {
+ name[Group1]= "Hebrew (Biblical, SIL phonetic)";
+ key.type = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ key <TLDE> { [ U20AC, U20AA, U0024 ] }; //Euro, Shekel, Dollar -
+ key <AE01> { [ 1, U0021, U05BD, U0597 ] }; //1, exclamation meteg revia
+ key <AE02> { [ 2, U0598, U05A2, U05AE ] }; //2, zarqa atn. hafukh zinor
+ key <AE03> { [ 3, U05A8, U0596, U0599 ] }; //3, qadma tipeha pashta
+ key <AE04> { [ 4, U059C, U05A5, U05A0 ] }; //4, geresh merkha tel. gedola
+ key <AE05> { [ 5, U059E, U05A6, U05A9 ] }; //5, gershayim mer. kefula tel qetana
+ key <AE06> { [ 6, VoidSymbol, U05AD, U059F ] }; //6, - dehi qar. para
+ key <AE07> { [ 7, U05AC, U05A3, U05A1 ] }; //7, iluy munah pazer
+ key <AE08> { [ 8, U059D, U059B, U0595 ] }; //8, g. muqdam tevir zaq. gadol
+ key <AE09> { [ 9, U0029, U05A7, U0593 ] }; //9, parenth.R darqa shalshelet
+ key <AE10> { [ 0, U0028, U05AA, U05AF ] }; //0, paren.L yer. ben yomo masora c.
+ key <AE11> { [ U05BE, U2013, U2014, U05BF ] }; //Maqaf, en dash em dash rafe
+ key <AE12> { [ U05BC, VoidSymbol, U0591, U25CC ] }; //Dagesh - etnahta mark base
+
+ key <AD01> { [ hebrew_qoph, U0597 ] }; //Qof revia - -
+ key <AD02> { [ hebrew_waw] }; //waw - - -
+ key <AD03> { [ U05B6, U05B5, VoidSymbol, U05B1 ] }; //segol tsere - hat. segol
+ key <AD04> { [ hebrew_resh ] }; //resh - - -
+ key <AD05> { [ hebrew_taw ] }; //taw - - -
+ key <AD06> { [ hebrew_yod, U059F ] }; //jod qar. para - -
+ key <AD07> { [ U05BB] }; //quibuts - - -
+ key <AD08> { [ U05B4 ] }; //hiriq, - - -
+ key <AD09> { [ U05B9, U05BA, U05C7, U05B3 ] }; //holam, holam(wav) qam. qatan hat. Qamats
+ key <AD10> { [ hebrew_pe, hebrew_finalpe, VoidSymbol, U034F ] }; //pe final pe - c. grapheme joiner
+ key <AD11> { [ bracketright, braceright, VoidSymbol, U0594 ] }; //Bracket R brace R - zaq. qatan
+ key <AD12> { [ bracketleft, braceleft, U059A, U0592 ] }; //Brachket L brace L yetiv segolta
+ key <BKSL> { [ U05C0, U05C0, U05A4, U05AB ] };//Paseq Paseq mahapakh ole
+
+ key <AC01> { [ U05B7, U05B8, U05C7, U05B2 ] }; //patah Qamats Qam. Qatan hat. patah
+ key <AC02> { [ hebrew_samech, U05E9 ] }; //Samech, shin no dot - -
+ key <AC03> { [ hebrew_dalet ] }; //dalet - - -
+ key <AC04> { [ UFB2B, hebrew_shin, U05C2 ] }; //UCSv6 Sin shin (nodot) sindot -
+ key <AC05> { [ hebrew_gimel, VoidSymbol, U25E6, U2022 ] }; //gimel - bullet(DSS) bulletfill (DSS)
+ key <AC06> { [ hebrew_he, VoidSymbol, U0336, U030A ] };//he - strikeout(DSS) Ring Above(DSS)
+ key <AC07> { [ UFB2A, hebrew_shin, U05C1] }; //UCSv6 Shin shin (nodot) shindot -
+ key <AC08> { [ hebrew_kaph, hebrew_finalkaph ] }; //kaph Final kaph -
+ key <AC09> { [ hebrew_lamed, VoidSymbol ] }; //lamed - -
+ key <AC10> { [ U05B0, U05F4, semicolon, U05C3 ] }; //sva gers. p semicolon sof pasuq
+ key <AC11> { [ U2019, U201D, U0323, U05C4 ] };//QuoteRight double R Quote punctum punctum Above
+
+ key <AB01> { [ hebrew_zain ] }; //Zayin - -
+ key <AB02> { [ hebrew_chet ] }; //chet - -
+ key <AB03> { [ hebrew_zade, U05E5 ] }; // tzade, final tzade -
+ key <AB04> { [ hebrew_tet ] }; //tet - -
+ key <AB05> { [ hebrew_bet ] }; //bet - -
+ key <AB06> { [ hebrew_nun, hebrew_finalnun ] }; //nun, final nun
+ key <AB07> { [ hebrew_mem, hebrew_finalmem, U200C, U200D ] }; //mem, final mem 0.wid.non.join. 0.wid.joiner
+ key <AB08> { [ U002C, U05E2, U00AB, U0307 ] }; //comma, ayin guillemetsR masora dot
+ key <AB09> { [ U0002E, U05D0, U00BB, U0308 ] }; //period, alef guillemetsL thousands
+ key <AB10> { [ slash, question, U05F3 ] }; //slash question geresh P
+
+ key <SPCE> { [ space, space, thinspace, nobreakspace ] };//space space thin space, nbsp
+};
diff --git a/test/data/symbols/in b/test/data/symbols/in
new file mode 100644
index 0000000..79d5099
--- /dev/null
+++ b/test/data/symbols/in
@@ -0,0 +1,2207 @@
+// This layout includes all Indian layouts, including:
+// - Devanagari (Hindi, Marathi, Sanskrit)
+// - Bangla
+// - Gujarati
+// - Kannada
+// - Malayalam
+// - Ol Chiki
+// - Oriya
+// - Tamil
+// - Telugu
+// - Urdu
+
+// Links:
+// - Indic INSCRIPT keyboard layout diagrams:
+// http://java.sun.com/products/jfc/tsc/articles/InputMethod/indiclayout.html
+// - Bangla Baishakhi (Bangla layouts):
+// - Bangla Baishakhi Inscript (Bangla layouts):
+// - Bangla Bornona (Bangla layouts):
+// - Uni Gitanjali (Bangla layouts):
+// http://nltr.org
+// - Ekusheyr Shadhinota (Bangla layouts):
+// http://ekushey.org/projects/shadhinota/index.html
+// - Microsoft Windows XP SP2: Indic Language Standards - an Introduction:
+// http://www.bhashaindia.com/MSProducts/XpSp2/Articles/IndicLanguageStandards.aspx
+// - Ol Chiki:
+// http://www.unicode.org/L2/L2005/05243r-n2984-ol-chiki.pdf (fig. 9)
+
+// based on a keyboard map from an 'xkb/symbols/dev' file
+
+// Devangari is the default. Kill me if I am wrong:)
+default partial alphanumeric_keys
+xkb_symbols "deva" {
+ // March 2004 -- David Holl <smyrph+dev_xkb@ece.wpi.edu>
+ name[Group1]="Indian";
+
+ key.type="FOUR_LEVEL";
+
+ key <TLDE> { [ U094a, U0912, grave, asciitilde ] };
+ key <AE01> { [ U0967, U090d, 1, exclam ] };
+ key <AE02> { [ U0968, U0945, 2, at ] };
+ // Shift+AE0[3-8] really need to return a macro of keys defined by
+ // INSCRIPT in place of the symbols that are here for now. But this
+ // requires XKB to map 1 key into two to three other key presses.
+ key <AE03> { [ U0969, numbersign, 3, numbersign ] };
+ key <AE04> { [ U096a, dollar, 4 ] };
+ key <AE05> { [ U096b, percent, 5, percent ] };
+ key <AE06> { [ U096c, asciicircum, 6, asciicircum ] };
+ key <AE07> { [ U096d, ampersand, 7, ampersand ] };
+ key <AE08> { [ U096e, asterisk, 8, asterisk ] };
+ key <AE09> { [ U096f, parenleft, 9, parenleft ] };
+ key <AE10> { [ U0966, parenright, 0, parenright ] };
+ key <AE11> { [ minus, U0903, minus, underscore ] };
+ key <AE12> { [ U0943, U090b, U0944, U0960 ] };
+
+ key <AD01> { [ U094c, U0914 ] };
+ key <AD02> { [ U0948, U0910 ] };
+ key <AD03> { [ U093e, U0906 ] };
+ key <AD04> { [ U0940, U0908, U0963, U0961 ] };
+ key <AD05> { [ U0942, U090a ] };
+ key <AD06> { [ U092c, U092d ] };
+ key <AD07> { [ U0939, U0919 ] };
+ key <AD08> { [ U0917, U0918, U095a ] };
+ key <AD09> { [ U0926, U0927 ] };
+ key <AD10> { [ U091c, U091d, U095b ] };
+ key <AD11> { [ U0921, U0922, U095c, U095d ] };
+ key <AD12> { [ U093c, U091e ] };
+ // I added \ / ? | for shell-convenience (file names and piping)
+ key <BKSL> { [ U0949, U0911, U005C, U007C ] };
+
+ key <AC01> { [ U094b, U0913 ] };
+ key <AC02> { [ U0947, U090f ] };
+ key <AC03> { [ U094d, U0905 ] };
+ key <AC04> { [ U093f, U0907, U0962, U090c ] };
+ key <AC05> { [ U0941, U0909 ] };
+ key <AC06> { [ U092a, U092b, NoSymbol, U095e ] };
+ key <AC07> { [ U0930, U0931 ] };
+ key <AC08> { [ U0915, U0916, U0958, U0959 ] };
+ key <AC09> { [ U0924, U0925 ] };
+ key <AC10> { [ U091a, U091b, U0952 ] };
+ key <AC11> { [ U091f, U0920, NoSymbol, U0951 ] };
+
+ key <AB01> { [ U0946, U090e, U0953 ] };
+ key <AB02> { [ U0902, U0901, NoSymbol, U0950 ] };
+ key <AB03> { [ U092e, U0923, U0954 ] };
+ key <AB04> { [ U0928, U0929 ] };
+ key <AB05> { [ U0935, U0934 ] };
+ key <AB06> { [ U0932, U0933 ] };
+ key <AB07> { [ U0938, U0936 ] };
+ key <AB08> { [ comma, U0937, U0970 ] };
+ key <AB09> { [ period, U0964, U0965, U093d ] };
+ // I added \ / ? | for shell-convenience (file names and piping)
+ key <AB10> { [ U092f, U095f, slash, question ] };
+
+ // space, space, Zero-Width-Non-Joiner (ZWNJ), Zero-Width-Joiner (ZWJ):
+ include "nbsp(zwnj3zwj4)"
+ include "rupeesign(4)"
+ include "level3(ralt_switch)"
+};
+
+//Name : Bolnagri (Combined)
+//Description : A phonetic keyboard layout for Devnagari(Hindi)
+// http://www.indlinux.org/wiki/index.php/BolNagri
+//NOTE : This is a combined map of bolnagri_matras and bolnagri_vowels.
+//Inspired by "devrom" keymap by Steve Smith for the windows tool "keyman"
+//Original Author : Noah Levitt<nlevitt at columbia.edu>
+//Past Authors : Pramod.R <pramodr at gmail.com> and Ravikant <ravikant at sarai.net>
+//Current Main. : G Karunakar <karunakar@indlinux.org>
+
+partial alphanumeric_keys
+xkb_symbols "bolnagri" {
+ name[Group1] = "Hindi (Bolnagri)";
+ key.type="FOUR_LEVEL";
+
+ // Roman digits
+ key <TLDE> { [ U0902, U0901, apostrophe, asciitilde ] }; // apostrophe: anusvara, candrabindu
+ key <AE01> { [ 1, exclam, U0967, exclam ] };
+ key <AE02> { [ 2, at, U0968, at ] };
+ key <AE03> { [ 3, numbersign, U0969, numbersign ] };
+ key <AE04> { [ 4, dollar, U096A ] }; // Rupee symbol on AltGr+4
+ key <AE05> { [ 5, percent, U096B, percent ] };
+ key <AE06> { [ 6, asciicircum, U096C, asciicircum ] };
+ key <AE07> { [ 7, ampersand, U096D, ampersand ] };
+ key <AE08> { [ 8, asterisk, U096E, asterisk ] };
+ key <AE09> { [ 9, parenleft, U096F, parenleft ] };
+ key <AE10> { [ 0, parenright, U0966, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSL> { [ U0964, U0965, U007C, U005C ] }; //pipe : danda, double danda
+
+ //Q Row
+ key <AD01> { [ U200C, U200D ] }; // Q: ZWNJ, ZWJ
+ key <AD02> { [ U0935, U950 ] }; // W: wa, OM
+ key <AD03> { [ U0947, U0948, U090F, U0910 ] }; // E: e, ai matras
+ key <AD04> { [ U0930, U0943, U0931, U090B ] }; // R: ra, vocalic Ri
+ key <AD05> { [ U0924, U0925 ] }; // T: ta, tha
+ key <AD06> { [ U092f, U091E ] }; // Y: ya, nya
+ key <AD07> { [ U0941, U0942, U0909, U090A ] }; // U: u, uu matras
+ key <AD08> { [ U093F, U0940, U0907, U0908 ] }; // I: i, ii matras
+ key <AD09> { [ U094B, U094C, U0913, U0914 ] }; // O: o, au matras
+ key <AD10> { [ U092A, U092B ] }; // P: pa, pha
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+
+ //A Row
+ key <AC01> { [ U093E, U0906, U0905, U0906 ] }; // A: aa, full A, AA
+ key <AC02> { [ U0938, U0937 ] }; // S: sa, ssa
+ key <AC03> { [ U0926, U0927 ] }; // D: da, dha
+ key <AC04> { [ U091F, U0920 ] }; // F: TA, THA
+ key <AC05> { [ U0917, U0918 ] }; // G: ga, gha
+ key <AC06> { [ U0939, U0903 ] }; // H: ha, visarg
+ key <AC07> { [ U091C, U091D ] }; // J: ja, jha
+ key <AC08> { [ U0915, U0916 ] }; // K: ka, kha
+ key <AC09> { [ U0932, U0933, U0962, U090C ] }; // L: la, vocalic L or lru matra
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [apostrophe, quotedbl ] };
+
+ //Z Row
+ key <AB01> { [ U0936, U0945, U0936, U090D ] }; // Z: sha, akaar candra
+ key <AB02> { [ U094D, U0949, U094D, U0911 ] }; // X: halant, aakaar candra, chandra A
+ key <AB03> { [ U091A, U091B ] }; // C: ca, cha
+ key <AB04> { [ U0921, U0922 ] }; // V: da, dha
+ key <AB05> { [ U092C, U092D ] }; // B: ba, bha
+ key <AB06> { [ U0928, U0923 ] }; // N: na, nna
+ key <AB07> { [ U092E, U0919, U092E, U093D ] }; // M: ma, nga, avagraha
+ key <AB08> { [ comma, U0970 ] };// comma: comma, dev abbreviation sign
+ key <AB09> { [ period, U093C ] }; // period: period, nukta
+ key <AB10> { [ slash, question ] };
+
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+// modifier_map Mod3 { Mode_switch };
+
+ include "level3(ralt_switch)"
+ include "rupeesign(4)"
+};
+
+// based on a keyboard map from an 'xkb/symbols/ben' file
+
+partial alphanumeric_keys
+xkb_symbols "ben" {
+ name[Group1]= "Bangla (India)";
+
+ // Mainly numbers.
+ key <AE01> { [ U09E7 ] };
+ key <AE02> { [ U09E8 ] };
+ key <AE03> { [ U09E9 ] };
+ key <AE04> { [ U09EA ] };
+ key <AE05> { [ U09EB ] };
+ key <AE06> { [ U09EC ] };
+ key <AE07> { [ U09ED ] };
+ key <AE08> { [ U09EE ] };
+ key <AE09> { [ U09EF, parenleft ] };
+ key <AE10> { [ U09E6, parenright ] };
+ key <AE11> { [ minus, U0983 ] };
+ key <AE12> { [ U098B, U09C3 ] };
+
+// Mainly long vowels
+
+ key <AD01> { [ U09CC, U0994 ] };
+ key <AD02> { [ U09C8, U0990 ] };
+ key <AD03> { [ U09BE, U0986 ] };
+ key <AD04> { [ U09C0, U0988 ] };
+ key <AD05> { [ U09C2, U098A ] };
+
+// Mainly voiced consonants
+
+ key <AD06> { [ U09AC, U09AD ] };
+ key <AD07> { [ U09B9, U0999 ] };
+ key <AD08> { [ U0997, U0998 ] };
+ key <AD09> { [ U09A6, U09A7 ] };
+ key <AD10> { [ U099C, U099D ] };
+ key <AD11> { [ U09A1, U09A2 ] };
+ key <AD12> { [ U09BC, U099E ] };
+
+// Mainly short vowels
+ key <AC01> { [ U09CB, U0993 ] };
+ key <AC02> { [ U09C7, U098F ] };
+ key <AC03> { [ U09CD, U0985 ] };
+ key <AC04> { [ U09BF, U0987 ] };
+ key <AC05> { [ U09C1, U0989 ] };
+
+
+// Mainly unvoiced consonants
+
+ key <AC06> { [ U09AA, U09AB ] };
+ key <AC07> { [ U09B0, U09DD ] };
+ key <AC08> { [ U0995, U0996 ] };
+ key <AC09> { [ U09A4, U09A5 ] };
+ key <AC10> { [ U099A, U099B ] };
+ key <AC11> { [ U099F, U09A0 ] };
+ key <BKSL> { [ U005C, U007C ] };
+
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ U0982, U0981 ] };
+ key <AB03> { [ U09AE, U09A3 ] };
+ key <AB04> { [ U09A8, U09A8 ] };
+ key <AB05> { [ U09AC, U09AC ] };
+ key <AB06> { [ U09B2, U09B2 ] };
+ key <AB07> { [ U09B8, U09B6 ] };
+ key <AB08> { [ comma, U09B7 ] };
+ key <AB09> { [ period, U0964 ] };
+ key <AB10> { [ U09DF, U09AF ] };
+
+ include "level3(ralt_switch)"
+ include "rupeesign(4)"
+};
+
+xkb_symbols "ben_probhat" {
+ name[Group1]= "Bangla (India, Probhat)";
+ key <ESC> { [ Escape ] };
+
+// numbers
+ key <TLDE> { [ U200D, asciitilde ] };
+ key <AE01> { [ U09E7, exclam ] };
+ key <AE02> { [ U09E8, at ] };
+ key <AE03> { [ U09E9, numbersign ] };
+ key <AE04> { [ U09EA, U09F3 ] };
+ key <AE05> { [ U09EB, percent ] };
+ key <AE06> { [ U09EC, asciicircum ] };
+ key <AE07> { [ U09ED, U099E ] };
+ key <AE08> { [ U09EE, U09CE ] };
+ key <AE09> { [ U09EF, parenleft ] };
+ key <AE10> { [ U09E6, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSP> { [ BackSpace ] };
+
+// tab, q to ]
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> { [ U09A6, U09A7 ] };
+ key <AD02> { [ U09C2, U098A ] };
+ key <AD03> { [ U09C0, U0988 ] };
+ key <AD04> { [ U09B0, U09DC ] };
+ key <AD05> { [ U099F, U09A0 ] };
+ key <AD06> { [ U098F, U0990 ] };
+ key <AD07> { [ U09C1, U0989 ] };
+ key <AD08> { [ U09BF, U0987 ] };
+ key <AD09> { [ U0993, U0994 ] };
+ key <AD10> { [ U09AA, U09AB ] };
+ key <AD11> { [ U09C7, U09C8 ] };
+ key <AD12> { [ U09CB, U09CC ] };
+ key <RTRN> { [ Return ] };
+
+// caps, a to '
+// key <CAPS> { [ Caps_Lock ] };
+ key <AC01> { [ U09BE, U0985 ] };
+ key <AC02> { [ U09B8, U09B7 ] };
+ key <AC03> { [ U09A1, U09A2 ] };
+ key <AC04> { [ U09A4, U09A5 ] };
+ key <AC05> { [ U0997, U0998 ] };
+ key <AC06> { [ U09B9, U0983 ] };
+ key <AC07> { [ U099C, U099D ] };
+ key <AC08> { [ U0995, U0996 ] };
+ key <AC09> { [ U09B2, U0982 ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+// shift, z to /
+// key <LFSH> { [ Shift_L ] };
+ key <AB01> { [ U09DF, U09AF ] };
+ key <AB02> { [ U09B6, U09DD ] };
+ key <AB03> { [ U099A, U099B ] };
+ key <AB04> { [ U0986, U098B ] };
+ key <AB05> { [ U09AC, U09AD ] };
+ key <AB06> { [ U09A8, U09A3 ] };
+ key <AB07> { [ U09AE, U0999 ] };
+ key <AB08> { [ comma, U09C3 ] };
+ key <AB09> { [ U0964, U0981 ] };
+ key <AB10> { [ U09CD, question ] };
+ key <BKSL> { [ U200C, U0965 ] };
+
+// key <LCTL> { [ Control_L ] };
+// key <SPCE> { [ space ] };
+
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+
+ include "level3(ralt_switch)"
+ include "rupeesign(4)"
+};
+
+// Bangla Baishakhi, Bangla Baishakhi Inscript, Bangla Bornona, Uni Gitanjali Layouts are added by Promathesh Mandal <promathesh812004@gmail.com>
+
+xkb_symbols "ben_baishakhi" {
+ name[Group1]= "Bangla (India, Baishakhi)";
+ key <ESC> { [ Escape ] };
+
+// numbers
+ key <TLDE> { [ 0x100200D, 0x100200C ] };
+ key <AE01> { [ 0x10009E7, exclam ] };
+ key <AE02> { [ 0x10009E8, at ] };
+ key <AE03> { [ 0x10009E9, numbersign ] };
+ key <AE04> { [ 0x10009EA, dollar, 0x10009F2 ] };
+ key <AE05> { [ 0x10009EB, percent ] };
+ key <AE06> { [ 0x10009EC, asciicircum, 0x10009D7 ] };
+ key <AE07> { [ 0x10009ED, ampersand ] };
+ key <AE08> { [ 0x10009EE, asterisk,0x10009FA ] };
+ key <AE09> { [ 0x10009EF, parenleft ] };
+ key <AE10> { [ 0x10009E6, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSP> { [ BackSpace ] };
+
+// tab, q to ]
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> { [ 0x10009A1, 0x10009A2 ] };
+ key <AD02> { [ 0x10009C0 , 0x10009C2 ] };
+ key <AD03> { [ 0x10009C7, 0x100098F, 0x1000990 ] };
+ key <AD04> { [ 0x10009B0 , 0x10009C3, 0x100098B ] };
+ key <AD05> { [ 0x100099F, 0x10009A0 ] };
+ key <AD06> { [ 0x10009AF, 0x10009DF ] };
+ key <AD07> { [ 0x10009C1, 0x1000989, 0x100098A ] };
+ key <AD08> { [ 0x10009BF, 0x1000987, 0x1000988 ] };
+ key <AD09> { [ 0x10009CB, 0x1000993, 0x1000994 ] };
+ key <AD10> { [ 0x10009AA, 0x10009AB ] };
+ key <AD11> { [ bracketleft, braceleft] };
+ key <AD12> { [ bracketright, braceright ] };
+ key <RTRN> { [ Return ] };
+
+// caps, a to '
+// key <CAPS> { [ Caps_Lock ] };
+ key <AC01> { [ 0x10009BE, 0x1000985, 0x1000986 ] };
+ key <AC02> { [ 0x10009B8, 0x10009B6, 0x10009B7 ] };
+ key <AC03> { [ 0x10009A6, 0x10009A7 ] };
+ key <AC04> { [ 0x10009A4, 0x10009A5, 0x10009CE ] };
+ key <AC05> { [ 0x1000997, 0x1000998 ] };
+ key <AC06> { [ 0x10009CD, 0x10009B9, 0x1000983 ] };
+ key <AC07> { [ 0x100099C, 0x100099D ] };
+ key <AC08> { [ 0x1000995, 0x1000996 ] };
+ key <AC09> { [ 0x10009B2, 0x1000964, 0x100098C ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+// shift, z to /
+// key <LFSH> { [ Shift_L ] };
+ key <AB01> { [ 0x10009C8, 0x10009CC ] };
+ key <AB02> { [ 0x10009DC, 0x10009DD ] };
+ key <AB03> { [ 0x100099A, 0x100099B ] };
+ key <AB04> { [ 0x10009F1, 0x10009F0 ] };
+ key <AB05> { [ 0x10009AC, 0x10009AD ] };
+ key <AB06> { [ 0x10009A8, 0x10009A3, 0x100099E ] };
+ key <AB07> { [ 0x10009AE, 0x1000999, 0x1000981 ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater,0x10009BC ] };
+ key <AB10> { [ slash, question, 0x1000982 ] };
+ key <BKSL> { [ backslash, bar ] };
+
+// third level with right-alt
+ include "level3(ralt_switch)"
+
+// key <LCTL> { [ Control_L ] };
+// key <SPCE> { [ space ] };
+
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+};
+
+xkb_symbols "ben_inscript" {
+ name[Group1]= "Bangla (India, Baishakhi Inscript)";
+
+ // Mainly numbers.
+ key <TLDE> { [ 0x100200D, 0x100200C ] };
+ key <AE01> { [ 0x10009E7 ] };
+ key <AE02> { [ 0x10009E8 ] };
+ key <AE03> { [ 0x10009E9 ] };
+ key <AE04> { [ 0x10009EA ] };
+ key <AE05> { [ 0x10009EB ] };
+ key <AE06> { [ 0x10009EC ] };
+ key <AE07> { [ 0x10009ED ] };
+ key <AE08> { [ 0x10009EE ] };
+ key <AE09> { [ 0x10009EF, parenleft ] };
+ key <AE10> { [ 0x10009E6, parenright ] };
+ key <AE11> { [ minus, 0x1000983 ] };
+ key <AE12> { [ 0x10009C3, 0x100098B ] };
+
+// Mainly long vowels
+
+ key <AD01> { [ 0x10009CC, 0x1000994 ] };
+ key <AD02> { [ 0x10009C8, 0x1000990 ] };
+ key <AD03> { [ 0x10009BE, 0x1000986 ] };
+ key <AD04> { [ 0x10009C0, 0x1000988 ] };
+ key <AD05> { [ 0x10009C2, 0x100098A ] };
+
+// Mainly voiced consonants
+
+ key <AD06> { [ 0x10009AC, 0x10009AD ] };
+ key <AD07> { [ 0x10009B9, 0x1000999 ] };
+ key <AD08> { [ 0x1000997, 0x1000998 ] };
+ key <AD09> { [ 0x10009A6, 0x10009A7 ] };
+ key <AD10> { [ 0x100099C, 0x100099D ] };
+ key <AD11> { [ 0x10009A1, 0x10009A2 ] };
+ key <AD12> { [ 0x10009BC, 0x100099E ] };
+
+// Mainly short vowels
+ key <AC01> { [ 0x10009CB, 0x1000993 ] };
+ key <AC02> { [ 0x10009C7, 0x100098F ] };
+ key <AC03> { [ 0x10009CD, 0x1000985 ] };
+ key <AC04> { [ 0x10009BF, 0x1000987 ] };
+ key <AC05> { [ 0x10009C1, 0x1000989 ] };
+
+
+// Mainly unvoiced consonants
+
+ key <AC06> { [ 0x10009AA, 0x10009AB ] };
+ key <AC07> { [ 0x10009B0, 0x10009DD ] };
+ key <AC08> { [ 0x1000995, 0x1000996 ] };
+ key <AC09> { [ 0x10009A4, 0x10009A5 ] };
+ key <AC10> { [ 0x100099A, 0x100099B ] };
+ key <AC11> { [ 0x100099F, 0x10009A0 ] };
+ key <BKSL> { [ backslash, bar ] };
+
+ key <AB01> { [ 0x10009CE ] };
+ key <AB02> { [ 0x1000982, 0x1000981 ] };
+ key <AB03> { [ 0x10009AE, 0x10009A3 ] };
+ key <AB04> { [ 0x10009A8, 0x10009A8 ] };
+ key <AB05> { [ 0x10009AC, 0x10009AC ] };
+ key <AB06> { [ 0x10009B2, 0x10009B2 ] };
+ key <AB07> { [ 0x10009B8, 0x10009B6 ] };
+ key <AB08> { [ comma, 0x10009B7 ] };
+ key <AB09> { [ period, 0x1000964 ] };
+ key <AB10> { [ 0x10009DF, 0x10009AF ] };
+};
+
+xkb_symbols "ben_gitanjali" {
+ name[Group1]= "Bangla (India, Uni Gitanjali)";
+ key <ESC> { [ Escape ] };
+
+// numbers
+ key <TLDE> { [ colon, question ] };
+ key <AE01> { [ 0x10009E7, 0x10009CE ] };
+ key <AE02> { [ 0x10009E8, apostrophe ] };
+ key <AE03> { [ 0x10009E9, numbersign ] };
+ key <AE04> { [ 0x10009EA, 0x10009F3 ] };
+ key <AE05> { [ 0x10009EB, slash ] };
+ key <AE06> { [ 0x10009EC, period ] };
+ key <AE07> { [ 0x10009ED, ampersand ] };
+ key <AE08> { [ 0x10009EE, asterisk ] };
+ key <AE09> { [ 0x10009EF, parenleft ] };
+ key <AE10> { [ 0x10009E6, parenright ] };
+ key <AE11> { [ minus, 0x1000983 ] };
+ key <AE12> { [ 0x10009C3, 0x100098B ] };
+ key <BKSP> { [ BackSpace ] };
+
+// tab, q to ]
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> { [ 0x10009D7, 0x1000994 ] };
+ key <AD02> { [ 0x10009C8, 0x1000990 ] };
+ key <AD03> { [ 0x10009BE, 0x1000985 ] };
+ key <AD04> { [ 0x10009C0, 0x1000988 ] };
+ key <AD05> { [ 0x10009C2, 0x100098A ] };
+ key <AD06> { [ 0x10009AC, 0x10009AD ] };
+ key <AD07> { [ 0x10009B9, 0x1000999 ] };
+ key <AD08> { [ 0x1000997, 0x1000998 ] };
+ key <AD09> { [ 0x10009A6, 0x10009A7 ] };
+ key <AD10> { [ 0x100099C, 0x100099D ] };
+ key <AD11> { [ 0x10009A1, 0x10009A2 ] };
+ key <AD12> { [ 0x100200C, 0x100099E ] };
+ key <RTRN> { [ Return ] };
+
+// caps, a to '
+// key <CAPS> { [ Caps_Lock ] };
+ key <AC01> { [ 0x100200D, 0x1000993 ] };
+ key <AC02> { [ 0x10009C7, 0x100098F ] };
+ key <AC03> { [ 0x10009CD ] };
+ key <AC04> { [ 0x10009BF, 0x1000987 ] };
+ key <AC05> { [ 0x10009C1, 0x1000989 ] };
+ key <AC06> { [ 0x10009AA, 0x10009AB ] };
+ key <AC07> { [ 0x10009B0, 0x10009F0 ] };
+ key <AC08> { [ 0x1000995, 0x1000996 ] };
+ key <AC09> { [ 0x10009A4, 0x10009A5 ] };
+ key <AC10> { [ 0x100099A, 0x100099B ] };
+ key <AC11> { [ 0x100099F, 0x10009A0 ] };
+
+// shift, z to /
+// key <LFSH> { [ Shift_L ] };
+ key <AB01> { [ 0x10009C7, 0x100098F ] };
+ key <AB02> { [ 0x1000982, 0x1000981 ] };
+ key <AB03> { [ 0x10009AE, 0x10009A3 ] };
+ key <AB04> { [ 0x10009A8, 0x10009DC ] };
+ key <AB05> { [ 0x10009F1, 0x10009DD ] };
+ key <AB06> { [ 0x10009B2 ] };
+ key <AB07> { [ 0x10009B8, 0x10009B6 ] };
+ key <AB08> { [ comma, 0x10009B7 ] };
+ key <AB09> { [ 0x1000964, 0x10009FA ] };
+ key <AB10> { [ 0x10009AF, 0x10009DF ] };
+ key <BKSL> { [ backslash, bar ] };
+
+// third level with right-win
+// include "level3(lwin_switch)"
+
+// key <LCTL> { [ Control_L ] };
+// key <SPCE> { [ space ] };
+
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+};
+
+
+xkb_symbols "ben_bornona" {
+ name[Group1]= "Bangla (India, Bornona)";
+ key <ESC> { [ Escape ] };
+
+// numbers
+ key <TLDE> { [ 0x100200D, 0x100200C ] };
+ key <AE01> { [ 0x10009E7, exclam ] };
+ key <AE02> { [ 0x10009E8, 0x1000981 ] };
+ key <AE03> { [ 0x10009E9, numbersign ] };
+ key <AE04> { [ 0x10009EA, 0x10009F3 ] };
+ key <AE05> { [ 0x10009EB, percent ] };
+ key <AE06> { [ 0x10009EC, 0x1000983 ] };
+ key <AE07> { [ 0x10009ED, 0x10009CE ] };
+ key <AE08> { [ 0x10009EE, asterisk ] };
+ key <AE09> { [ 0x10009EF, parenleft ] };
+ key <AE10> { [ 0x10009E6, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSP> { [ BackSpace ] };
+
+// tab, q to ]
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> { [ 0x1000982, 0x1000999, 0x10009D7 ] };
+ key <AD02> { [ 0x10009A2, 0x10009A0, 0x100098A ] };
+ key <AD03> { [ 0x10009C7, 0x10009C8, 0x1000988 ] };
+ key <AD04> { [ 0x10009B0, 0x10009C3, 0x100098B ] };
+ key <AD05> { [ 0x10009A4, 0x100099F ] };
+ key <AD06> { [ 0x10009A7, 0x10009A5, 0x100098F ] };
+ key <AD07> { [ 0x10009C1, 0x10009C2, 0x1000989 ] };
+ key <AD08> { [ 0x10009BF, 0x10009C0, 0x1000987 ] };
+ key <AD09> { [ 0x10009CB, 0x10009CC, 0x1000993 ] };
+ key <AD10> { [ 0x10009AA, 0x1000990, 0x1000994 ] };
+ key <AD11> { [ 0x100005B, 0x100007B, 0x10009DC ] };
+ key <AD12> { [ 0x100005D, 0x100007D ] };
+ key <RTRN> { [ Return ] };
+
+// caps, a to '
+// key <CAPS> { [ Caps_Lock ] };
+ key <AC01> { [ 0x10009BE, 0x1000985, 0x10009F4 ] };
+ key <AC02> { [ 0x10009B8, 0x10009B6, 0x10009F5 ] };
+ key <AC03> { [ 0x10009A6, 0x10009A1, 0x10009F8 ] };
+ key <AC04> { [ 0x10009AB ] };
+ key <AC05> { [ 0x1000997, 0x1000998 ] };
+ key <AC06> { [ 0x10009CD, 0x10009B9 ] };
+ key <AC07> { [ 0x100099C, 0x100099D ] };
+ key <AC08> { [ 0x1000995, 0x1000996 ] };
+ key <AC09> { [ 0x10009B2, 0x1000964 ] };
+ key <AC10> { [ semicolon, 0x100003A ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+// shift, z to /
+// key <LFSH> { [ Shift_L ] };
+ key <AB01> { [ 0x10009AF, 0x10009DC ] };
+ key <AB02> { [ 0x10009B7, 0x10009DD, 0x10009FA ] };
+ key <AB03> { [ 0x100099A, 0x100099B ] };
+ key <AB04> { [ 0x10009AD ] };
+ key <AB05> { [ 0x10009AC, 0x10009DF ] };
+ key <AB06> { [ 0x10009A8, 0x10009A3 ] };
+ key <AB07> { [ 0x10009AE, 0x100099E ] };
+ key <AB08> { [ comma, 0x100003C ] };
+ key <AB09> { [ 0x100002E, 0x100003E ] };
+ key <AB10> { [ 0x100002F, question ] };
+ key <BKSL> { [ 0x10009F1, 0x10009F0 ] };
+
+// key <LCTL> { [ Control_L ] };
+// key <SPCE> { [ space ] };
+
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+// third level with right-alt
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "guj" {
+ name[Group1]= "Gujarati";
+
+ // Mainly numbers.
+ key <AE01> { [ U0AE7, U0A8D ] };
+ key <AE02> { [ U0AE8, U0AC5 ] };
+ key <AE03> { [ U0AE9 ] };
+ key <AE04> { [ U0AEA ] };
+ key <AE05> { [ U0AEB ] };
+ key <AE06> { [ U0AEC ] };
+ key <AE07> { [ U0AED ] };
+ key <AE08> { [ U0AEE ] };
+ key <AE09> { [ U0AEF, parenleft ] };
+ key <AE10> { [ U0AE6, parenright ] };
+ key <AE11> { [ minus, U0A83 ] };
+ key <AE12> { [ U0A8B, U0AC3 ] };
+
+// Mainly long vowels
+
+ key <AD01> { [ U0ACC, U0A94 ] };
+ key <AD02> { [ U0AC8, U0A90 ] };
+ key <AD03> { [ U0ABE, U0A86 ] };
+ key <AD04> { [ U0AC0, U0A88 ] };
+ key <AD05> { [ U0AC2, U0A8A ] };
+
+// Mainly voiced consonants
+
+ key <AD06> { [ U0AAC, U0AAD ] };
+ key <AD07> { [ U0AB9, U0A99 ] };
+ key <AD08> { [ U0A97, U0A98 ] };
+ key <AD09> { [ U0AA6, U0AA7 ] };
+ key <AD10> { [ U0A9C, U0A9D ] };
+ key <AD11> { [ U0AA1, U0AA2 ] };
+ key <AD12> { [ U0ABC, U0A9E ] };
+
+// Mainly short vowels
+ key <AC01> { [ U0ACB, U0A93 ] };
+ key <AC02> { [ U0AC7, U0A8F ] };
+ key <AC03> { [ U0ACD, U0A85 ] };
+ key <AC04> { [ U0ABF, U0A87 ] };
+ key <AC05> { [ U0AC1, U0A89 ] };
+
+// Mainly unvoiced consonants
+
+ key <AC06> { [ U0AAA, U0AAB ] };
+ key <AC07> { [ U0AB0, U0AB0 ] };
+ key <AC08> { [ U0A95, U0A96 ] };
+ key <AC09> { [ U0AA4, U0AA5 ] };
+ key <AC10> { [ U0A9A, U0A9B ] };
+ key <AC11> { [ U0A9F, U0AA0 ] };
+ key <BKSL> { [ U0AC9, U0A91 ] };
+
+ key <AB01> { [ z , Z ] };
+ key <AB02> { [ U0A82, U0A81 ] };
+ key <AB03> { [ U0AAE, U0AA3 ] };
+ key <AB04> { [ U0AA8, U0AA8 ] };
+ key <AB05> { [ U0AB5, U0AB5 ] };
+ key <AB06> { [ U0AB2, U0AB3 ] };
+ key <AB07> { [ U0AB8, U0AB6 ] };
+ key <AB08> { [ comma, U0AB7 ] };
+ key <AB09> { [ period, U0964 ] };
+ key <AB10> { [ U0AAF, question ] };
+ include "rupeesign(4)"
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "kan" {
+
+ // Inscript layout for Kannada
+ // Author : G Karunakar <karunakar@freedomink.org>
+ // Date : Wed Nov 13 17:22:58 IST 2002
+ // Kannada digits mapped in basic only
+
+ name[Group1]= "Kannada";
+
+ key <TLDE> { [ U0cca, U0c92 ] };
+ key <AE01> { [ U0ce7 ] };
+ key <AE02> { [ U0ce8 ] };
+ key <AE03> { [ U0ce9 ] };
+ key <AE04> { [ U0cea ] };
+ key <AE05> { [ U0ceb ] };
+ key <AE06> { [ U0cec ] };
+ key <AE07> { [ U0ced ] };
+ key <AE08> { [ U0cee ] };
+ key <AE09> { [ U0cef ] };
+ key <AE10> { [ U0ce6 ] };
+ key <AE11> { [ U0c83 ] };
+ key <AE12> { [ U0cc3, U0c8b ] };
+
+ key <AD01> { [ U0ccc, U0c94 ] };
+ key <AD02> { [ U0cc8, U0c90 ] };
+ key <AD03> { [ U0cbe, U0c86 ] };
+ key <AD04> { [ U0cc0, U0c88 ] };
+ key <AD05> { [ U0cc2, U0c8a ] };
+ key <AD06> { [ U0cac, U0cad ] };
+ key <AD07> { [ U0cb9, U0c99 ] };
+ key <AD08> { [ U0c97, U0c98 ] };
+ key <AD09> { [ U0ca6, U0ca7 ] };
+ key <AD10> { [ U0c9c, U0c9d ] };
+ key <AD11> { [ U0ca1, U0ca2 ] };
+ key <AD12> { [ U0cbc, U0c9e ] };
+
+ key <AC01> { [ U0ccb, U0c93 ] };
+ key <AC02> { [ U0cc7, U0c8f ] };
+ key <AC03> { [ U0ccd, U0c85 ] };
+ key <AC04> { [ U0cbf, U0c87 ] };
+ key <AC05> { [ U0cc1, U0c89 ] };
+ key <AC06> { [ U0caa, U0cab ] };
+ key <AC07> { [ U0cb0, U0cb1 ] };
+ key <AC08> { [ U0c95, U0c96 ] };
+ key <AC09> { [ U0ca4, U0ca5 ] };
+ key <AC10> { [ U0c9a, U0c9b ] };
+ key <AC11> { [ U0c9f, U0ca0 ] };
+
+ key <AB01> { [ U0cc6, U0c8e ] };
+ key <AB02> { [ U0c82 ] };
+ key <AB03> { [ U0cae, U0ca3 ] };
+ key <AB04> { [ U0ca8 ] };
+ key <AB05> { [ U0cb5, U0cb4 ] };
+ key <AB06> { [ U0cb2, U0cb3 ] };
+ key <AB07> { [ U0cb8, U0cb6 ] };
+ key <AB08> { [ comma , U0cb7 ] };
+ key <AB09> { [ period ] };
+ key <AB10> { [ U0caf, U0040 ] };
+
+ key <RALT> {
+ symbols[Group1] = [ Mode_switch, Multi_key ],
+ virtualMods = AltGr
+ };
+ include "rupeesign(4)"
+ include "level3(ralt_switch)"
+};
+
+// Description : A keymap for Malayalam
+// Encoding : Unicode (http://www.unicode.org)
+// Author : Baiju M <baiju@freeshell.org>
+// Date : Sat Aug 17 21:10:48 IST 2002
+// Mapping:
+
+partial alphanumeric_keys
+xkb_symbols "mal" {
+
+ name[Group1] = "Malayalam";
+
+ //From grave to backslash (\)
+
+ key <TLDE> { [ U0d4a , U0d12 ] };
+
+// svu:
+// These lines were in former "mal" variant -
+// but the digits are replaced with the ones from 'mal_plusnum' -
+// for the integrity of all Indian layouts
+//
+// key <AE01> { [1 , exclam ] };
+// key <AE02> { [2 , at ] };
+// key <AE03> { [3 , numbersign ] };
+// key <AE04> { [4 , dollar ] };
+// key <AE05> { [5 , percent ] };
+// key <AE06> { [6 ,asciicircum ] };
+// key <AE07> { [7 , ampersand ] };
+// key <AE08> { [8 , asterisk ] };
+// key <AE09> { [9 , parenleft ] };
+// key <AE10> { [0 , parenright ] };
+
+ key <AE01> { [ U0d67 , exclam ] };
+ key <AE02> { [ U0d68 , at ] };
+ key <AE03> { [ U0d69 , numbersign ] };
+ key <AE04> { [ U0d6a , dollar ] };
+ key <AE05> { [ U0d6b , percent ] };
+ key <AE06> { [ U0d6c , asciicircum ] };
+ key <AE07> { [ U0d6d , ampersand ] };
+ key <AE08> { [ U0d6e , asterisk ] };
+ key <AE09> { [ U0d6f , parenleft ] };
+ key <AE10> { [ U0d66 , parenright ] };
+
+ key <AE11> { [ minus , U0d03 ] };
+ key <AE12> { [ U0d43 , U0d0b ] };
+ key <BKSL> { [U0200c, U05C ]};//bksl: ZWNJ
+
+
+ // From 'q' to right bracket (])
+
+ key <AD01> { [ U0d4c , U0d14 ] };
+ key <AD02> { [ U0d48 , U0d10 ] };
+ key <AD03> { [ U0d3e , U0d06 ] };
+ key <AD04> { [ U0d40 , U0d08 ] };
+ key <AD05> { [ U0d42 , U0d0a ] };
+ key <AD06> { [ U0d2c , U0d2d ] };
+ key <AD07> { [ U0d39 , U0d19 ] };
+ key <AD08> { [ U0d17 , U0d18 ] };
+ key <AD09> { [ U0d26 , U0d27 ] };
+ key <AD10> { [ U0d1c , U0d1d ] };
+ key <AD11> { [ U0d21 , U0d22 ] };
+ key <AD12> { [ U0200d , U0d1e ] };
+
+ // From 'a' to apostrophe (')
+
+ key <AC01> { [ U0d4b , U0d13 ] };
+ key <AC02> { [ U0d47 , U0d0f ] };
+ key <AC03> { [ U0d4d , U0d05 ] };
+ key <AC04> { [ U0d3f , U0d07 ] };
+ key <AC05> { [ U0d41 , U0d09 ] };
+ key <AC06> { [ U0d2a , U0d2b ] };
+ key <AC07> { [ U0d30 , U0d31 ] };
+ key <AC08> { [ U0d15 , U0d16 ] };
+ key <AC09> { [ U0d24 , U0d25 ] };
+ key <AC10> { [ U0d1a , U0d1b ] };
+ key <AC11> { [ U0d1f , U0d20 ] };
+
+ // From 'z' to slash (/)
+
+ key <AB01> { [ U0d46 , U0d0e ] };
+ key <AB02> { [ U0d02 , U200b ] };//X:ZWSP
+ key <AB03> { [ U0d2e , U0d23 ] };
+ key <AB04> { [ U0d28 ] };
+ key <AB05> { [ U0d35 , U0d34 ] };
+ key <AB06> { [ U0d32 , U0d33 ] };
+ key <AB07> { [ U0d38 , U0d36 ] };
+ key <AB08> { [ comma , U0d37 ] };
+ key <AB09> { [ period , U0200d ] };
+ key <AB10> { [ U0d2f , question ] };
+
+ include "rupeesign(4)"
+ include "level3(ralt_switch)"
+};
+
+//Name : Lalitha
+//Description : A transliteration keyboard layout for Malayalam
+//Original Author : Noah Levitt<nlevitt at columbia.edu>
+//Current Main : Jinesh K.J<jinesh.k@gmail.com>, Swathantra Malayalam Computing (SMC)<smc-discuss@googlegroups.com>
+
+partial alphanumeric_keys
+xkb_symbols "mal_lalitha" {
+ name[Group1] = "Malayalam (Lalitha)";
+ key.type="FOUR_LEVEL";
+
+ // Roman digits
+ key <TLDE> { [ U0D4D, U0D02, apostrophe, asciitilde ] }; // apostrophe: virama(chandrakala),anusvara
+ key <AE01> { [ 1, exclam, U0D67, exclam ] };
+ key <AE02> { [ 2, at, U0D68, at ] };
+ key <AE03> { [ 3, numbersign, U0D69, numbersign ] };
+ key <AE04> { [ 4, dollar, U0D6A ] };
+ key <AE05> { [ 5, percent, U0D6B, percent ] };
+ key <AE06> { [ 6, asciicircum, U0D6C, asciicircum ] };
+ key <AE07> { [ 7, ampersand, U0D6D, ampersand ] };
+ key <AE08> { [ 8, asterisk, U0D6E, asterisk ] };
+ key <AE09> { [ 9, parenleft, U0D6F, parenleft ] };
+ key <AE10> { [ 0, parenright, U0D66, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSL> { [ U005C, U007C, U200C ] };//backslash:pipe,backslash,ZWNJ
+
+ //Q Row
+ key <AD01> { [ U0D48, U0D4C, U0D10, U0D14 ] }; // Q: ai and au matras
+ key <AD02> { [ U0D35 ] }; // W: wa, OM
+ key <AD03> { [ U0D46, U0D47, U0D0E, U0D0F ] }; // E: e,ee matras
+ key <AD04> { [ U0D30, U0D31, U0D43, U0D0B ] }; // R: ra,rra, vocalic Ri
+ key <AD05> { [ U0D24, U0D25, U0D1F, U0D20 ] }; // T: tha, ttha,ta,tta
+ key <AD06> { [ U0D2f ] }; // Y: ya
+ key <AD07> { [ U0D41, U0D42, U0D09, U0D0A ] }; // U: u, uu matras
+ key <AD08> { [ U0D3F, U0D40, U0D07, U0D08 ] }; // I: i, ii matras
+ key <AD09> { [ U0D4A, U0D4B, U0D12, U0D13 ] }; // O: o, oo matras
+ key <AD10> { [ U0D2A ] }; // P: pa
+ key <AD11> { [ bracketleft, braceleft ] };//braceleft:
+ key <AD12> { [ bracketright, braceright ] };//braceright:
+
+ //A Row
+ key <AC01> { [ U0D3E, U0D05, U0D06, U0D05 ] }; // A: a,aa
+ key <AC02> { [ U0D38, U0D37 ] }; // S: sa, ssa
+ key <AC03> { [ U0D26, U0D27, U0D21, U0D22 ] }; // D: soft da,soft dda,hard da,hard dda,
+ key <AC04> { [ U0D2B ] }; // F: pha
+ key <AC05> { [ U0D17, U0D18 ] }; // G: ga, gha
+ key <AC06> { [ U0D39, U0D03 ] }; // H: ha, visarg
+ key <AC07> { [ U0D1C, U0D1D ] }; // J: ja, jha
+ key <AC08> { [ U0D15, U0D16 ] }; // K: ka, kha
+ key <AC09> { [ U0D32, U0D33 ] }; // L: la, vocalic L or lru matra`
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [apostrophe, quotedbl ] };
+
+ //Z Row
+ key <AB01> { [ U0D34, U0D36 ] }; // Z: sha,zha
+ key <AB02> { [ U0D4D, U200B ] }; // X: chandrakala,ZWSP
+ key <AB03> { [ U0D1A, U0D1B ] }; // C: ca, cha
+ key <AB04> { [ U0D35, U200D ] }; // V: va,ZWJ
+ key <AB05> { [ U0D2C, U0D2D ] }; // B: ba, bha
+ key <AB06> { [ U0D28, U0D23, U0D19, U0D1E ] }; // N: na, hard na,nga,nha
+ key <AB07> { [ U0D2E, U0D02 ] }; // M: ma
+ key <AB08> { [ comma, U003C ] };// comma: comma
+ key <AB09> { [ period, U003E ] }; // period: period
+ key <AB10> { [ slash, question ] };
+
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+// modifier_map Mod3 { Mode_switch };
+ include "level3(ralt_switch)"
+ include "rupeesign(4)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "olck" {
+
+ // Layout for the Ol Chiki script.
+ // http://www.unicode.org/L2/L2005/05243r-n2984-ol-chiki.pdf (figure 9)
+
+ name[Group1]= "Ol Chiki";
+
+ key <TLDE> { [ grave, U1C7B ] };
+
+ key <AE01> { [ U1C51, exclam ] };
+ key <AE02> { [ U1C52, at ] };
+ key <AE03> { [ U1C53, numbersign ] };
+ key <AE04> { [ U1C54, dollar, U20B9 ] };
+ key <AE05> { [ U1C55, percent ] };
+ key <AE06> { [ U1C56, asciicircum ] };
+ key <AE07> { [ U1C57, ampersand ] };
+ key <AE08> { [ U1C58, asterisk ] };
+ key <AE09> { [ U1C59, parenleft ] };
+ key <AE10> { [ U1C50, parenright ] };
+ key <AE11> { [ minus, U1C7C ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD01> { [ U1C67 ] };
+ key <AD02> { [ U1C63 ] };
+ key <AD03> { [ U1C6E ] };
+ key <AD04> { [ U1C68 ] };
+ key <AD05> { [ U1C74, U1C5B ] };
+ key <AD06> { [ U1C6D ] };
+ key <AD07> { [ U1C69 ] };
+ key <AD08> { [ U1C64 ] };
+ key <AD09> { [ U1C5A, U1C73 ] };
+ key <AD10> { [ U1C6F ] };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+ key <BKSL> { [ U1C7F, U1C7E ] };
+
+ key <AC01> { [ U1C5F ] };
+ key <AC02> { [ U1C65 ] };
+ key <AC03> { [ U1C70, U1C6B ] };
+ key <AC04> { [ U1C5D ] };
+ key <AC05> { [ U1C5C ] };
+ key <AC06> { [ U1C66, U1C77 ] };
+ key <AC07> { [ U1C61 ] };
+ key <AC08> { [ U1C60 ] };
+ key <AC09> { [ U1C5E ] };
+ key <AC10> { [ semicolon, U1C7A ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ U1C72 ] };
+ key <AB02> { [ U1C7D ] };
+ key <AB03> { [ U1C6A ] };
+ key <AB04> { [ U1C76 ] };
+ key <AB05> { [ U1C75 ] };
+ key <AB06> { [ U1C71, U1C78 ] };
+ key <AB07> { [ U1C62, U1C6C ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ U1C79, greater ] };
+ key <AB10> { [ slash, question ] };
+
+ key <RALT> {
+ symbols[Group1] = [ Mode_switch, Multi_key ],
+ virtualMods = AltGr
+ };
+
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "ori" {
+ // Inscript layout for Oriya
+ // Author: G Karunakar <karunakar@freedomink.org>
+ // Date: Wed Nov 13 18:16:19 IST 2002
+
+ name[Group1]= "Oriya";
+
+ key <AE01> { [ U0b67 ] };
+ key <AE02> { [ U0b68 ] };
+ key <AE03> { [ U0b69 ] };
+ key <AE04> { [ U0b6a ] };
+ key <AE05> { [ U0b6b ] };
+ key <AE06> { [ U0b6c ] };
+ key <AE07> { [ U0b6d ] };
+ key <AE08> { [ U0b6e ] };
+ key <AE09> { [ U0b6f ] };
+ key <AE10> { [ U0b66 ] };
+ key <AE11> { [ U0b03 ] };
+ key <AE12> { [ U0b43, U0b0b ] };
+
+ key <AD01> { [ U0b4c, U0b14 ] };
+ key <AD02> { [ U0b48, U0b10 ] };
+ key <AD03> { [ U0b3e, U0b06 ] };
+ key <AD04> { [ U0b40, U0b08 ] };
+ key <AD05> { [ U0b42, U0b0a ] };
+ key <AD06> { [ U0b2c, U0b2d ] };
+ key <AD07> { [ U0b39, U0b19 ] };
+ key <AD08> { [ U0b17, U0b18 ] };
+ key <AD09> { [ U0b26, U0b27 ] };
+ key <AD10> { [ U0b1c, U0b1d ] };
+ key <AD11> { [ U0b21, U0b22 ] };
+ key <AD12> { [ U0b3c, U0b1e ] };
+
+ key <AC01> { [ U0b4b, U0b13 ] };
+ key <AC02> { [ U0b47, U0b0f ] };
+ key <AC03> { [ U0b4d, U0b05 ] };
+ key <AC04> { [ U0b3f, U0b07 ] };
+ key <AC05> { [ U0b41, U0b09 ] };
+ key <AC06> { [ U0b2a, U0b2b ] };
+ key <AC07> { [ U0b30 ] };
+ key <AC08> { [ U0b15, U0b16 ] };
+ key <AC09> { [ U0b24, U0b25 ] };
+ key <AC10> { [ U0b1a, U0b1b ] };
+ key <AC11> { [ U0b1f, U0b20 ] };
+
+ key <AB02> { [ U0b02, U0b01 ] };
+ key <AB03> { [ U0b2e, U0b23 ] };
+ key <AB04> { [ U0b28 ] };
+ key <AB05> { [ U0b35 ] };
+ key <AB06> { [ U0b32, U0b33 ] };
+ key <AB07> { [ U0b38, U0b36 ] };
+ key <AB08> { [ comma , U0b37 ] };
+ key <AB09> { [ period ] };
+ key <AB10> { [ U0b2f, U0040 ] };
+
+ key <RALT> {
+ symbols[Group1] = [ Mode_switch, Multi_key ],
+ virtualMods = AltGr
+ };
+ include "rupeesign(4)"
+ include "level3(ralt_switch)"
+};
+
+// based on a keyboard map from an 'xkb/symbols/tml' file
+// INSCRIPT
+partial alphanumeric_keys
+xkb_symbols "tam" {
+ name[Group1]= "Tamil";
+
+ key <TLDE> { [ U0BCA, U0B92 ] };
+
+ // Mainly numbers.
+ key <AE01> { [ U0BE7 ] };
+ key <AE02> { [ U0BE8 ] };
+ key <AE03> { [ U0BE9 ] };
+ key <AE04> { [ U0BEA ] };
+ key <AE05> { [ U0BEB ] };
+ key <AE06> { [ U0BEC ] };
+ key <AE07> { [ U0BED ] };
+ key <AE08> { [ U0BEE ] };
+ key <AE09> { [ U0BEF, parenleft ] };
+ key <AE10> { [ U0BF0, parenright ] };
+ key <AE11> { [ U0BF1, U0B83 ] };
+ key <AE12> { [ U0BF2, plus ] };
+
+// Mainly long vowels
+
+ key <AD01> { [ U0BCC, U0B94 ] };
+ key <AD02> { [ U0BC8, U0B90 ] };
+ key <AD03> { [ U0BBE, U0B86 ] };
+ key <AD04> { [ U0BC0, U0B88 ] };
+ key <AD05> { [ U0BC2, U0B8A ] };
+
+// Mainly voiced consonants
+
+ key <AD07> { [ U0BB9, U0B99 ] };
+ key <AD10> { [ U0B9c ] };
+ key <AD12> { [ U0B9E ] };
+
+// Mainly short vowels
+ key <AC01> { [ U0BCB, U0B93 ] };
+ key <AC02> { [ U0BC7, U0B8F ] };
+ key <AC03> { [ U0BCD, U0B85 ] };
+ key <AC04> { [ U0BBF, U0B87 ] };
+ key <AC05> { [ U0BC1, U0B89 ] };
+
+// Mainly unvoiced consonants
+
+ key <AC06> { [ U0BAA ] };
+ key <AC07> { [ U0BB0, U0BB1 ] };
+ key <AC08> { [ U0B95 ] };
+ key <AC09> { [ U0BA4 ] };
+ key <AC10> { [ U0B9A ] };
+ key <AC11> { [ U0B9F ] };
+ key <BKSL> { [ U005C, U007C ] };//backslash-bar - Changed to Unicode
+
+ key <AB01> { [ U0BC6, U0B8E ] };
+ key <AB02> { [ U0B82 ] };
+ key <AB03> { [ U0BAE, U0BA3 ] };
+ key <AB04> { [ U0BA8, U0BA9 ] };
+ key <AB05> { [ U0BB5, U0BB4 ] };
+ key <AB06> { [ U0BB2, U0BB3 ] };
+ key <AB07> { [ U0BB8, U0BB6 ] };
+ key <AB08> { [ comma, U0BB7 ] };
+ key <AB09> { [ period, U0964 ] };
+ key <AB10> { [ U0BAF, question ] };
+
+ include "level3(ralt_switch)"
+ include "rupeesign(4)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "tam_unicode" {
+
+// Description: A keymap based on the TamilNet'99 typewriter keyboard
+// Encoding: Unicode (http://www.unicode.org)
+// Author: Thuraiappah Vaseeharan <vasee@ieee.org>
+// Modifed by: Malathi S <malathiramya@gmail.com>
+// Secondary contact: Sri Ramadoss M <amachu@au-kbc.org>
+// Date : Fri Sep 4 11:32:00 CST 2009
+// Mapping:
+
+ name[Group1]= "Tamil (Unicode)";
+
+ // granthas
+ key <TLDE> { [ apostrophe, asciitilde ] };
+ key <AE01> { [ U0031, exclam ] } ;
+ key <AE02> { [ U0032, at ] } ;
+ key <AE03> { [ U0033, numbersign ] } ;
+ key <AE04> { [ U0034, U0BF9 ] } ;
+ key <AE05> { [ U0035, percent ] } ;
+ key <AE06> { [ U0036, asciicircum ] } ;
+ key <AE07> { [ U0037, ampersand ] } ;
+ key <AE08> { [ U0038, asterisk ] } ;
+ key <AE09> { [ U0039, parenleft ] } ;
+ key <AE10> { [ U0030, parenright ] } ;
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+
+ // Qrow
+ key <AD01> { [ U0B9E, U0BB6 ] };
+ key <AD02> { [ U0BB1, U0BB7 ] };
+ key <AD03> { [ U0BA8, U0BB8 ] };
+ key <AD04> { [ U0B9A, U0BB9 ] };
+ key <AD05> { [ U0BB5, U0B9C ] };
+ key <AD06> { [ U0BB2 ] };
+ key <AD07> { [ U0BB0 ] };
+ key <AD08> { [ U0BC8, U0B90 ] };
+ key <AD09> { [ U0BCA, U0BCB ] };
+ key <AD10> { [ U0BBF, U0BC0 ] };
+ key <AD11> { [ U0BC1, U0BC2 ] };
+
+ // Arow
+ key <AC01> { [ U0BAF ] };
+ key <AC02> { [ U0BB3 ] };
+ key <AC03> { [ U0BA9 ] };
+ key <AC04> { [ U0B95 ] };
+ key <AC05> { [ U0BAA ] };
+ key <AC06> { [ U0BBE, U0BB4 ] };
+ key <AC07> { [ U0BA4 ] };
+ key <AC08> { [ U0BAE ] };
+ key <AC09> { [ U0B9F ] };
+ key <AC10> { [ U0BCD, U0B83 ] };
+ key <AC11> { [ U0B99 ] };
+
+ // Zrow
+ key <AB01> { [ U0BA3 ] };
+ key <AB02> { [ U0B92, U0B93 ] };
+ key <AB03> { [ U0B89, U0B8A ] };
+ key <AB04> { [ U0B8E, U0B8F ] };
+ key <AB05> { [ U0BC6, U0BC7 ] };
+ key <AB06> { [ U0B94, U0BCC ] };
+ key <AB07> { [ U0B85, U0B86 ] };
+ key <AB08> { [ U0B87, U0B88 ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "tam_keyboard_with_numerals" {
+
+// Description: A keymap based on the TamilNet'99 typewriter keyboard
+// Encoding: Unicode (http://www.unicode.org)
+// Author: Malathi S <malathiramya@gmail.com>
+// Secondary contact: Sri Ramadoss M <amachu@au-kbc.org>
+// Date : Fri Sep 4 11:33:00 CST 2009
+// Mapping:
+
+ name[Group1]= "Tamil (keyboard with numerals)";
+
+ // Mainly numbers.
+ key <TLDE> { [ apostrophe, asciitilde ] };
+ key <AE01> { [ U0BE7, exclam ] };
+ key <AE02> { [ U0BE8, at ] };
+ key <AE03> { [ U0BE9, numbersign ] };
+ key <AE04> { [ U0BEA, U0BF9 ] };
+ key <AE05> { [ U0BEB, percent ] };
+ key <AE06> { [ U0BEC, asciicircum ] };
+ key <AE07> { [ U0BED, ampersand ] };
+ key <AE08> { [ U0BEE, asterisk ] };
+ key <AE09> { [ U0BEF, parenleft ] };
+ key <AE10> { [ U0BE6, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+
+ // Qrow
+ key <AD01> { [ U0B9E, U0BB6 ] };
+ key <AD02> { [ U0BB1, U0BB7 ] };
+ key <AD03> { [ U0BA8, U0BB8 ] };
+ key <AD04> { [ U0B9a, U0BB9 ] };
+ key <AD05> { [ U0BB5, U0B9c ] };
+ key <AD06> { [ U0BB2 ] };
+ key <AD07> { [ U0BB0 ] };
+ key <AD08> { [ U0BC8, U0B90 ] };
+ key <AD09> { [ U0BCA, U0BCB ] };
+ key <AD10> { [ U0BBF, U0BC0 ] };
+ key <AD11> { [ U0BC1, U0BC2 ] };
+
+ // Arow
+ key <AC01> { [ U0BAF ] };
+ key <AC02> { [ U0BB3 ] };
+ key <AC03> { [ U0BA9 ] };
+ key <AC04> { [ U0B95 ] };
+ key <AC05> { [ U0BAA ] };
+ key <AC06> { [ U0BBE, U0BB4 ] };
+ key <AC07> { [ U0BA4 ] };
+ key <AC08> { [ U0BAE ] };
+ key <AC09> { [ U0B9F ] };
+ key <AC10> { [ U0BCD, U0B83 ] };
+ key <AC11> { [ U0B99 ] };
+
+ // Zrow
+ key <AB01> { [ U0BA3 ] };
+ key <AB02> { [ U0B92, U0B93 ] };
+ key <AB03> { [ U0B89, U0B8A ] };
+ key <AB04> { [ U0B8E, U0B8F ] };
+ key <AB05> { [ U0BC6, U0BC7 ] };
+ key <AB06> { [ U0B94, U0BCC ] };
+ key <AB07> { [ U0B85, U0B86 ] };
+ key <AB08> { [ U0B87, U0B88 ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "tam_TSCII" {
+
+// Description : A Tamil typewrite-style keymap
+// loosely based on TamilNet'99 reommendations
+// Encoding : TSCII (http://www.tscii.org)
+// Author : Thuraiappah Vaseeharan <vasee@ieee.org>
+// Last Modified: Sat Jan 5 17:11:26 CST 2002
+
+ name[Group1]= "Tamil (TSCII typewriter)";
+
+ key <AE01> { [ 0x10000b7, 0x10000a4 ] }; // aytham
+ key <AE02> { [ 0x1000082, 0x10000a5 ] }; // shri
+ key <AE03> { [ 0x1000083, 0x1000088 ] }; // ja
+ key <AE04> { [ 0x1000084, 0x1000089 ] }; // sha
+ key <AE05> { [ 0x1000085, 0x100008a ] }; // sa
+ key <AE06> { [ 0x1000086, 0x100008b ] }; // ha
+ key <AE07> { [ 0x1000087, 0x100008c ] }; // ksha
+
+ // Qrow
+ key <AD01> { [ 0x10000bb, 0x100009a ] }; // nja
+ key <AD02> { [ 0x10000c8, 0x10000da ] }; // Ra
+ key <AD03> { [ 0x10000bf, 0x10000d1 ] }; // NNa
+ key <AD04> { [ 0x10000ba, 0x10000cd ] }; // ca
+ key <AD05> { [ 0x10000c5, 0x10000d7 ] }; // va
+ key <AD06> { [ 0x10000c4, 0x10000d6 ] }; // la
+ key <AD07> { [ 0x10000c3, 0x10000d5 ] }; // ra
+ key <AD08> { [ 0x10000a8, 0x10000b3 ] }; // sangili, ai
+ key <AD09> { [ 0x10000ca, 0x10000cb ] }; // di, dI
+ key <AD10> { [ 0x10000a2, 0x10000a3 ] }; // visiri
+ key <AD11> { [ dead_acute, 0x10000a3 ] }; // Ukaaram
+
+ // Arow
+ key <AC01> { [ 0x10000c2, 0x10000d4 ] }; // ya
+ key <AC02> { [ 0x10000c7, 0x10000d9 ] }; // La
+ key <AC03> { [ 0x10000c9, 0x10000db ] }; // na
+ key <AC04> { [ 0x10000b8, 0x10000cc ] }; // ka
+ key <AC05> { [ 0x10000c0, 0x10000d2 ] }; // pa
+ key <AC06> { [ dead_grave,0x10000a1 ] }; // pulli,aravu
+ key <AC07> { [ 0x10000be, 0x10000d0 ] }; // tha
+ key <AC08> { [ 0x10000c1, 0x10000d3 ] }; // ma
+ key <AC09> { [ 0x10000bc, 0x10000ce ] }; // da
+ key <AC10> { [ 0x10000c6, 0x10000d8 ] }; // zha
+ key <AC11> { [ 0x10000b9, 0x1000099 ] }; // nga
+
+ // Zrow
+ key <AB01> { [ 0x10000bd, 0x10000cf ] }; // Na
+ key <AB02> { [ 0x10000b4, 0x10000b5 ] }; // o, O
+ key <AB03> { [ 0x10000af, 0x10000b0 ] }; // u, U
+ key <AB04> { [ 0x10000b1, 0x10000b2 ] }; // e, E
+ key <AB05> { [ 0x10000a6, 0x10000a7 ] }; // kombus
+ key <AB06> { [ 0x10000b6, 0x10000aa ] }; // au
+ key <AB07> { [ 0x10000ab, 0x10000ac ] }; // a, A
+ key <AB08> { [ 0x10000fe, 0x10000ae ] }; // i, I
+};
+
+partial alphanumeric_keys
+xkb_symbols "tam_TAB" {
+
+// Description: A keymap based on the TamilNet'99 typewriter keyboard
+// Encoding: TAB (http://www.tamilnet99.org)
+// Author: Thuraiappah Vaseeharan <t_vasee@yahoo.com>
+// Date : Sun Aug 12 02:23:00 CDT 2001
+
+ name[Group1]= "Tamil (TAB typewriter)";
+
+ // numeral row
+ key <AE01> { [ 0x10000e7, 0x10000a7 ] } ;
+ key <AE02> { [ 0x10000fa, 0x10000a8 ] } ;
+ key <AE03> { [ 0x10000fb ] } ;
+ key <AE04> { [ 0x10000fc ] } ;
+ key <AE05> { [ 0x10000fd ] } ;
+ key <AE06> { [ 0x10000fe ] } ;
+ key <AE07> { [ 0x10000ff ] } ;
+
+ // q-row
+ key <AD01> { [ 0x10000eb, 0x10000b3 ] };
+ key <AD02> { [ 0x10000f8, 0x10000c1 ] };
+ key <AD03> { [ 0x10000ef, 0x10000b8 ] };
+ key <AD04> { [ 0x10000ea, 0x10000b2 ] };
+ key <AD05> { [ 0x10000f5, 0x10000be ] };
+ key <AD06> { [ 0x10000f4, 0x10000bd ] };
+ key <AD07> { [ 0x10000f3, 0x10000bc ] };
+ key <AD08> { [ 0x10000ac, 0x10000e4 ] };
+ key <AD09> { [ 0x10000ae, 0x10000af ] };
+ key <AD10> { [ 0x10000a4, 0x10000a6 ] };
+ key <AD11> { [ dead_circumflex, 0x10000a6 ] }; // Ukaaram
+
+ // a-row
+ key <AC01> { [ 0x10000f2, 0x10000bb ] };
+ key <AC02> { [ 0x10000f7, 0x10000c0 ] };
+ key <AC03> { [ 0x10000f9, 0x10000c2 ] };
+ key <AC04> { [ 0x10000e8, 0x10000b0 ] };
+ key <AC05> { [ 0x10000f0, 0x10000b9 ] };
+ key <AC06> { [ 0x10000a2, 0x10000a3 ] };
+ key <AC07> { [ 0x10000ee, 0x10000b6 ] };
+ key <AC08> { [ 0x10000f1, 0x10000ba ] };
+ key <AC09> { [ 0x10000ec, 0x10000b4 ] };
+ key <AC10> { [ 0x10000f6, 0x10000bf ] };
+ key <AC11> { [ 0x10000e9, 0x10000b1 ] };
+
+ // z-row
+ key <AB01> { [ 0x10000ed, 0x10000b5 ] };
+ key <AB02> { [ 0x10000e5, 0x10000e6 ] };
+ key <AB03> { [ 0x10000e0, 0x10000e1 ] };
+ key <AB04> { [ 0x10000e2, 0x10000e3 ] };
+ key <AB05> { [ 0x10000aa, 0x10000ab ] };
+ key <AB06> { [ 0x10000ac, 0x10000a3 ] };
+ key <AB07> { [ 0x10000dc, 0x10000dd ] };
+ key <AB08> { [ 0x10000de, 0x10000df ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "tel" {
+
+ // Inscript layout for Telugu using Unicode
+ // Author: G Karunakar <karunakar@freedomink.org>
+ // Date:
+ // See layout at http://www.indlinux.org/keymap/telugu.php
+
+ name[Group1]= "Telugu";
+
+ key <TLDE> { [ U0c4a, U0c12 ] };
+ key <AE01> { [ U0c67 ] };
+ key <AE02> { [ U0c68 ] };
+ key <AE03> { [ U0c69, numbersign ] };
+ key <AE04> { [ U0c6a, dollar ] };
+ key <AE05> { [ U0c6b, percent ] };
+ key <AE06> { [ U0c6c, asciicircum ] };
+ key <AE07> { [ U0c6d, ampersand ] };
+ key <AE08> { [ U0c6e, asterisk ] };
+ key <AE09> { [ U0c6f, parenleft ] };
+ key <AE10> { [ U0c66, parenright ] };
+ key <AE11> { [ U0c03, underscore ] };
+ key <AE12> { [ U0c43, U0c0b ] };
+ key <BKSP> { [ BackSpace ] };
+
+ key <AD01> { [ U0c4c, U0c14 ] };
+ key <AD02> { [ U0c48, U0c10 ] };
+ key <AD03> { [ U0c3e, U0c06 ] };
+ key <AD04> { [ U0c40, U0c08 ] };
+ key <AD05> { [ U0c42, U0c0a ] };
+ key <AD06> { [ U0c2c, U0c2d ] };
+ key <AD07> { [ U0c39, U0c19 ] };
+ key <AD08> { [ U0c17, U0c18 ] };
+ key <AD09> { [ U0c26, U0c27 ] };
+ key <AD10> { [ U0c1c, U0c1d ] };
+ key <AD11> { [ U0c21, U0c22 ] };
+ key <AD12> { [ U0c1e ] };
+
+ key <AC01> { [ U0c4b, U0c13 ] };
+ key <AC02> { [ U0c47, U0c0f ] };
+ key <AC03> { [ U0c4d, U0c05 ] };
+ key <AC04> { [ U0c3f, U0c07 ] };
+ key <AC05> { [ U0c41, U0c09 ] };
+ key <AC06> { [ U0c2a, U0c2b ] };
+ key <AC07> { [ U0c30, U0c31 ] };
+ key <AC08> { [ U0c15, U0c16 ] };
+ key <AC09> { [ U0c24, U0c25 ] };
+ key <AC10> { [ U0c1a, U0c1b ] };
+ key <AC11> { [ U0c1f, U0c20 ] };
+
+ key <AB01> { [ U0c46, U0c0e ] };
+ key <AB02> { [ U0c02, U0c01 ] };
+ key <AB03> { [ U0c2e, U0c23 ] };
+ key <AB04> { [ U0c28 ] };
+ key <AB05> { [ U0c35 ] };
+ key <AB06> { [ U0c32, U0c33 ] };
+ key <AB07> { [ U0c38, U0c36 ] };
+ key <AB08> { [ comma , U0c37 ] };
+ key <AB09> { [ period ] };
+ key <AB10> { [ U0c2f, U0040 ] };
+
+ key <RALT> {
+ symbols[Group1] = [ Mode_switch, Multi_key ],
+ virtualMods = AltGr
+ };
+ include "rupeesign(4)"
+ include "level3(ralt_switch)"
+};
+
+//Name : Sarala
+//Description : This is an adaptation of the Sarala keyboard (http://www.medhajananam.org/sarala/) developed
+// by Krishna Dhullipalla. Because of the way keyboard shortcuts are laid out in KDE, the keyboard
+// modifiers had to be changed. The layout does not take any part of the original Sarala keyboard
+// code however. It has been developed from scratch, so the experience may differ.
+//
+// There is a ibus-m17n version of Sarala layout developed by Satya Pothamsetti <potham@gmail.com> on
+// http://www.medhajananam.org/.
+//Standard : Supports Unicode 9.0.
+//Help : This layout differs slightly from the layout on Medhajenanam. The layout has been depicted in the
+// pdf file attached to this post on Sarala google group.
+// (https://groups.google.com/forum/#!topic/sarala-keyboard/-gsa90dUFcs).
+//
+//Layout Developed by : Krishna Dhullipalla <krishnadvr@yahoo.com> (http://www.medhajananam.org/)
+//Author : Venkat R Akkineni <venkatram.akkineni@india.com>
+//Date : Apr 28 2017
+partial alphanumeric_keys
+xkb_symbols "tel-sarala"
+{
+ name[Group1] = "Telugu (Sarala)";
+ key.type="FOUR_LEVEL";
+ // sequence base, shift, alt, alt + shift
+ key <AB01> { [ U0C4A, U0C12 ] }; // ొ ఒ
+ key <AB02> { [ U0C42, U0C0A ] }; // ూ ఊ
+ key <AB03> { [ U0C21, U0C22 ] }; // డ ఢ
+ key <AB04> { [ U0C35, U0C39 ] }; // వ హ
+ key <AB05> { [ U0C2C, U0C2D ] }; // బ భ
+ key <AB06> { [ U0C28, U0C23 ] }; // న ణ
+ key <AB07> { [ U0C2E, U0C01 ] }; // మ ఁ
+ key <AB08> { [ U002C, U0C1E, leftcaret ] }; // , ఞ <
+ key <AB09> { [ U002E, U0C19, rightcaret ] }; // . ఙ >
+ key <AB10> { [ U0C36, question, KP_Divide ] }; // శ ? /
+ key <AC01> { [ U0C2F, U0C3D ] }; // య ఽ
+ key <AC02> { [ U0C02, U0C03 ] }; // ం ః
+ key <AC03> { [ U0C26, U0C27 ] }; // ద ధ
+ key <AC04> { [ U0C4D, U0C05 ] }; // ్ అ
+ key <AC05> { [ U0C17, U0C18 ] }; // గ ఘ
+ key <AC06> { [ U0C1A, U0C1B, U0C58, U0C59 ] }; // చ ఛ ౘ ౙ
+ key <AC07> { [ U0C3E, U0C06 ] }; // ా ఆ
+ key <AC08> { [ U0C15, U0C16, U0C62, U0C63 ] }; // క ఖ ౢ ౣ
+ key <AC09> { [ U0C32, U0C33, U0C0C, U0C61 ] }; // ల ళ ఌ ౡ
+ key <AC10> { [ U0C1F, U0C20, semicolon, colon ] }; // ట ఠ ; :
+ key <AC11> { [ quoteright, quotedbl ] }; // ' "
+ key <AD01> { [ U0C46, U0C0E, U0C44, U0C34 ] }; // ె ఎ ౄ ఴ
+ key <AD02> { [ U0C38, U0C37, U0C44 ] }; // స ష ౄ
+ key <AD03> { [ U0C47, U0C0F, U0C44 ] }; // ే ఏ ౄ
+ key <AD04> { [ U0C30, U0C31, U0C44, U0C60 ] }; // ర ఱ ౄ ౠ
+ key <AD05> { [ U0C24, U0C25 ] }; // త థ
+ key <AD06> { [ U0C40, U0C08 ] }; // ీ ఈ
+ key <AD07> { [ U0C41, U0C09 ] }; // ు ఉ
+ key <AD08> { [ U0C3F, U0C07 ] }; // ి ఇ
+ key <AD09> { [ U0C4B, U0C13 ] }; // ో ఓ
+ key <AD10> { [ U0C2A, U0C2B ] }; // ప ఫ
+ key <AD11> { [ U0C1C, U0C1D, bracketleft, braceleft ] }; // జ ఝ [ {
+ key <AD12> { [ U0C48, U0C10, bracketright, braceright ] }; // ై ఐ ] }
+ key <AE01> { [ KP_1, exclam, U0C67, U0C78 ] }; // 1 ! ౦ ౸
+ key <AE02> { [ KP_2, at, U0C68, U0C79 ] }; // 2 @ ౨ ౹
+ key <AE03> { [ KP_3, numbersign, U0C69, U0C7A ] }; // 3 # ౩ ౺
+ key <AE04> { [ KP_4, dollar, U0C6A, U0C7B ] }; // 4 $ ౪ ౻
+ key <AE05> { [ KP_5, percent, U0C6B, U0C7C ] }; // 5 % ౫ ౼
+ key <AE06> { [ KP_6, asciicircum, U0C6C, U0C7D ] }; // 6 ^ ౬ ౽
+ key <AE07> { [ KP_7, ampersand, U0C6D, U0C7E ] }; // 7 & ౭ ౾
+ key <AE08> { [ KP_8, KP_Multiply, U0C6E, U0C7F ] }; // 8 * ౮ ౿
+ key <AE09> { [ KP_9, U0028, U0C6F, U20B9 ] }; // 9 ( ౯ ₹
+ key <AE10> { [ KP_0, U0029, U0C66, U0C55 ] }; // 0 ) ౦ ౕ
+ key <AE11> { [ KP_Subtract, underbar, NoSymbol, U0C56 ] }; // - _ ౖ
+ key <AE12> { [ KP_Equal, KP_Add ] }; // = +
+ key <BKSL> { [ U0C4C, U0C14, U0964, U0965 ] }; // ౌ ఔ । ॥
+ key <TLDE> { [ U0C43, U0C0B, quoteleft, asciitilde ] }; // ృ ఋ ` ~
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "urd-phonetic" {
+ include "pk(urd-phonetic)"
+ name[Group1]= "Urdu (phonetic)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "urd-phonetic3" {
+ include "pk(urd-crulp)"
+ name[Group1]= "Urdu (alt. phonetic)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "urd-winkeys" {
+ include "pk(urd-nla)"
+ name[Group1]= "Urdu (Win keys)";
+};
+
+// based on a keyboard map from an 'xkb/symbols/gur' file
+
+partial alphanumeric_keys
+xkb_symbols "guru" {
+ name[Group1]= "Punjabi (Gurmukhi)";
+
+ // Mainly numbers.
+ key <AE01> { [ U0A67 ] };
+ key <AE02> { [ U0A68 ] };
+ key <AE03> { [ U0A69, U0A71 ] };
+ key <AE04> { [ U0A6A, U0A74 ] };
+ key <AE05> { [ U0A6B, U262C ] };
+ key <AE06> { [ U0A6C ] };
+ key <AE07> { [ U0A6D ] };
+ key <AE08> { [ U0A6e ] };
+ key <AE09> { [ U0A6F, parenleft ] };
+ key <AE10> { [ U0A66, parenright ] };
+ key <AE11> { [ U0A03 ] };
+ key <AE12> { [ equal, plus ] };
+
+// Mainly long vowels
+
+ key <AD01> { [ U0A4C, U0A14 ] };
+ key <AD02> { [ U0A48, U0A10 ] };
+ key <AD03> { [ U0A3E, U0A06 ] };
+ key <AD04> { [ U0A40, U0A08 ] };
+ key <AD05> { [ U0A42, U0A0A ] };
+
+// Mainly voiced consonants
+
+ key <AD06> { [ U0A2C, U0A2D ] };
+ key <AD07> { [ U0A39, U0A19 ] };
+ key <AD08> { [ U0A17, U0A18 ] };
+ key <AD09> { [ U0A26, U0A27 ] };
+ key <AD10> { [ U0A1C, U0A1D ] };
+ key <AD11> { [ U0A21, U0A22 ] };
+ key <AD12> { [ U0A3C, U0A1E ] };
+
+// Mainly short vowels
+ key <AC01> { [ U0A4B, U0A13 ] };
+ key <AC02> { [ U0A47, U0A0F ] };
+ key <AC03> { [ U0A4D, U0A05 ] };
+ key <AC04> { [ U0A3F, U0A07 ] };
+ key <AC05> { [ U0A41, U0A09 ] };
+
+// Mainly unvoiced consonants
+
+ key <AC06> { [ U0A2A, U0A2B ] };
+ key <AC07> { [ U0A30, U0A5C ] };
+ key <AC08> { [ U0A15, U0A16 ] };
+ key <AC09> { [ U0A24, U0A25 ] };
+ key <AC10> { [ U0A1A, U0A1B ] };
+ key <AC11> { [ U0A1F, U0A20 ] };
+ key <BKSL> { [ U005C, U007C ] };
+
+ key <AB01> { [ z, U0A01 ] };
+ key <AB02> { [ U0A02, U0A70, U0A71 ] };
+ key <AB03> { [ U0A2E, U0A23 ] };
+ key <AB04> { [ U0A28, U0A28 ] };
+ key <AB05> { [ U0A35, U0A35 ] };
+ key <AB06> { [ U0A32, U0A33 ] };
+ key <AB07> { [ U0A38, U0A36 ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, U0964 ] };
+ key <AB10> { [ U0A2F, question ] };
+
+ include "rupeesign(4)"
+ include "level3(ralt_switch)"
+};
+
+//Name : Jhelum (Refind Inscript)
+//Description : A Jhelum keyboard layout for Gurmukhi (Punjabi)
+// http://www.satluj.org/Jhelum.html
+//Modified for Inscript to make
+//Original Author : Amanpreet Singh Alam <apreet.alam@gmail.com
+
+partial alphanumeric_keys
+xkb_symbols "jhelum" {
+ name[Group1] = "Punjabi (Gurmukhi Jhelum)";
+ key.type="FOUR_LEVEL";
+
+ // Roman digits
+ key <TLDE> { [ apostrophe, asciitilde, U0A02,U0A01 ] }; // apostrophe: anusvara, candrabindu
+ key <AE01> { [ 1,exclam, U0A67, exclam ] };
+ key <AE02> { [ 2,at, U0A68, at ] };
+ key <AE03> { [ 3,numbersign, U0A69, numbersign ] };
+ key <AE04> { [ 4,dollar, U0A6A ] };
+ key <AE05> { [ 5,percent,U0A6B, percent ] };
+ key <AE06> { [ 6,U0A73, U0A6C,asciicircum ] };
+ key <AE07> { [ 7,U0A72,U0A6D,ampersand ] };
+ key <AE08> { [ 8,asterisk,U0A6E, asterisk ] };
+ key <AE09> { [ 9,parenleft,U0A6F,parenleft ] };
+ key <AE10> { [ 0,parenright,U0A66,parenright ] };
+ key <AE11> { [ minus,underscore] };
+ key <AE12> { [ equal,plus] };
+ key <BKSL> { [ U0964,U0965,U007C,U005C] }; //pipe : danda, double danda
+
+ //Q Row
+ key <AD01> { [ U0A4C, U0A14 ] }; // Q: oo, ooh
+ key <AD02> { [ U0A48, U0A10 ] }; // W: ee, ae
+ key <AD03> { [ U0A3E, U0A06 ] }; // E: a, aa
+ key <AD04> { [ U0A40, U0A08, U20B9 ] }; // R: ee, ai, rupeesign
+ key <AD05> { [ U0A42, U0A0A ] }; // T: u, uu
+ key <AD06> { [ U0A30, U0A5C ] }; // Y: ra, raa
+ key <AD07> { [ U0A26, U0A27 ] }; // U: tha, thha
+ key <AD08> { [ U0A17, U0A18, U0A5A ] }; // I:ga, gha
+ key <AD09> { [ U0A24, U0A1F ] }; // O: ta, tha
+ key <AD10> { [ U0A2A, U0A5E, VoidSymbol,U0A5E ] }; // P: pa, pha
+ key <AD11> { [ U0A21, U0A22, bracketleft, braceleft ] };
+ key <AD12> { [ U0A19, U0A1E, bracketright, braceright ] };
+
+ //A Row
+ key <AC01> { [ U0A4B, U0A13 ] }; // A: o, oo
+ key <AC02> { [ U0A47, U0A0F ] }; // S: e, ee
+ key <AC03> { [ U0A4D, U0A05 ] }; // D: halant, aa
+ key <AC04> { [ U0A3F, U0A07 ] }; // F: i, aa
+ key <AC05> { [ U0A41, U0A09 ] }; // G: u, uh
+ key <AC06> { [ U0A39, U0A20 ] }; // H: ha, thha
+ key <AC07> { [ U0A1C, U0A1D, U0A5B ] }; // J: ja, jha
+ key <AC08> { [ U0A15, U0A16,VoidSymbol ,U0A59 ] }; // K: ka, kha
+ key <AC09> { [ U0A32, U0A25, U0A33 ] }; // L: la, tha
+ key <AC10> { [ U0A38, colon, U0A36 ] }; //; sa
+ key <AC11> { [apostrophe, quotedbl ] };
+
+ //Z Row
+ key <AB01> { [ U0A71, U0A3C ] }; // Z: addak, par bindi
+ key <AB02> { [ U0A02, U0A70 ] }; // X: bindi, tippi
+ key <AB03> { [ U0A1A, U0A1B ] }; // C: ca, cha
+ key <AB04> { [ U0A35, U0A2F ] }; // V: va, ya
+ key <AB05> { [ U0A2C, U0A2D ] }; // B: ba, bha
+ key <AB06> { [ U0A28, U0A23 ] }; // N: na, nha
+ key <AB07> { [ U0A2E, U0A2E ] }; // M: ma
+ key <AB08> { [ comma, U262C ] };// comma: comma, dev abbreviation sign
+ key <AB09> { [ period, U0A74 ] }; // period: period, nukta
+ key <AB10> { [ slash, question ] };
+
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+// modifier_map Mod3 { Mode_switch };
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+// Contact: Walter Bender <walter@laptop.org>
+
+ include "in(deva)"
+ key <TLDE> { [ U094A, U0912 ] }; // DEVANAGARI VOWEL SIGN SHORT O; DEVANAGARI LETTER SHORT O
+ key <AE01> { [ U0967, U090D ] }; // DEVANAGARI DIGIT ONE; DEVANAGARI LETTER CANDRA E
+ key <AE02> { [ U0968, U0945 ] }; // DEVANAGARI DIGIT TWO; DEVANAGARI VOWEL SIGN CANDRA E
+ key <AE03> { [ U0969 ] }; // DEVANAGARI DIGIT THREE;
+ key <AE04> { [ U096A ] }; // DEVANAGARI DIGIT FOUR;
+ key <AE05> { [ U096B ] }; // DEVANAGARI DIGIT FIVE;
+ key <AE06> { [ U096C ] }; // DEVANAGARI DIGIT SIX;
+ key <AE07> { [ U096D ] }; // DEVANAGARI DIGIT SEVEN;
+ key <AE08> { [ U096E ] }; // DEVANAGARI DIGIT EIGHT;
+ key <AE09> { [ U096F, parenleft ] }; // DEVANAGARI DIGIT NINE;
+ key <AE10> { [ U0966, parenright ] }; // DEVANAGARI DIGIT ZERO;
+ key <AE11> { [ minus, U0903 ] }; // DEVANAGARI SIGN VISARGA;
+ key <AE12> { [ U0943, U090B ] }; // DEVANAGARI VOWEL SIGN VOCALIC R; DEVANAGARI LETTER VOCALIC R
+
+ key <AD01> { [ U094C, U0914 ] }; // DEVANAGARI VOWEL SIGN AU; DEVANAGARI LETTER AU
+ key <AD02> { [ U0948, U0910 ] }; // DEVANAGARI VOWEL SIGN AI; DEVANAGARI LETTER AI
+ key <AD03> { [ U093E, U0906 ] }; // DEVANAGARI VOWEL SIGN AA; DEVANAGARI LETTER AA
+ key <AD04> { [ U0940, U0908 ] }; // DEVANAGARI VOWEL SIGN II; DEVANAGARI LETTER II
+ key <AD05> { [ U0942, U090A ] }; // DEVANAGARI VOWEL SIGN UU; DEVANAGARI LETTER UU
+ key <AD06> { [ U092C, U092D ] }; // DEVANAGARI LETTER BA; DEVANAGARI LETTER BHA
+ key <AD07> { [ U0939, U0919 ] }; // DEVANAGARI LETTER HA; DEVANAGARI LETTER NGA
+ key <AD08> { [ U0917, U0918 ] }; // DEVANAGARI LETTER GA; DEVANAGARI LETTER GHA
+ key <AD09> { [ U0926, U0927 ] }; // DEVANAGARI LETTER DA; DEVANAGARI LETTER DHA
+ key <AD10> { [ U091C, U091D ] }; // DEVANAGARI LETTER JA; DEVANAGARI LETTER JHA
+ key <AD11> { [ U0921, U0922 ] }; // DEVANAGARI LETTER DDA; DEVANAGARI LETTER DDHA
+ key <AD12> { [ U093C, U091E ] }; // DEVANAGARI SIGN NUKTA; DEVANAGARI LETTER NYA
+
+ key <BKSL> { [ U0949, U0911 ] }; // DEVANAGARI VOWEL SIGN CANDRA O; DEVANAGARI LETTER CANDRA O
+
+ key <AC01> { [ U094B, U0913 ] }; // DEVANAGARI VOWEL SIGN O; DEVANAGARI LETTER O
+ key <AC02> { [ U0947, U090F ] }; // DEVANAGARI VOWEL SIGN E; DEVANAGARI LETTER E
+ key <AC03> { [ U094D, U0905 ] }; // DEVANAGARI SIGN VIRAMA; DEVANAGARI LETTER A
+ key <AC04> { [ U093F, U0907 ] }; // DEVANAGARI VOWEL SIGN I; DEVANAGARI LETTER I
+ key <AC05> { [ U0941, U0909 ] }; // DEVANAGARI VOWEL SIGN U; DEVANAGARI LETTER U
+ key <AC06> { [ U092A, U092B ] }; // DEVANAGARI LETTER PA; DEVANAGARI LETTER PHA
+ key <AC07> { [ U0930, U0931 ] }; // DEVANAGARI LETTER RA; DEVANAGARI LETTER RRA
+ key <AC08> { [ U0915, U0916 ] }; // DEVANAGARI LETTER KA; DEVANAGARI LETTER KHA
+ key <AC09> { [ U0924, U0925 ] }; // DEVANAGARI LETTER TA; DEVANAGARI LETTER THA
+ key <AC10> { [ U091A, U091B ] }; // DEVANAGARI LETTER CA; DEVANAGARI LETTER CHA
+ key <AC11> { [ U091F, U0920 ] }; // DEVANAGARI LETTER TTA; DEVANAGARI LETTER TTHA
+
+ key <AB01> { [ U0946, U090E ] }; // DEVANAGARI VOWEL SIGN SHORT E; DEVANAGARI LETTER SHORT E
+ key <AB02> { [ U0902, U0901 ] }; // DEVANAGARI SIGN ANUSVARA; DEVANAGARI SIGN CANDRABINDU
+ key <AB03> { [ U092E, U0923 ] }; // DEVANAGARI LETTER MA; DEVANAGARI LETTER NNA
+ key <AB04> { [ U0928, U0929 ] }; // DEVANAGARI LETTER NA; DEVANAGARI LETTER NNNA
+ key <AB05> { [ U0935, U0934 ] }; // DEVANAGARI LETTER VA; DEVANAGARI LETTER LLLA
+ key <AB06> { [ U0932, U0933 ] }; // DEVANAGARI LETTER LA; DEVANAGARI LETTER LLA
+ key <AB07> { [ U0938, U0936 ] }; // DEVANAGARI LETTER SA; DEVANAGARI LETTER SHA
+ key <AB08> { [ comma, U0937 ] }; // DEVANAGARI LETTER SSA
+ key <AB09> { [ period, U0964 ] }; // DEVANAGARI DANDA
+ key <AB10> { [ U092F, U095F ] }; // DEVANAGARI LETTER YA; DEVANAGARI LETTER YYA
+
+ // space, space, Zero-Width-Non-Joiner (ZWNJ), Zero-Width-Joiner (ZWJ):
+ include "nbsp(zwnj3zwj4)"
+
+ include "group(olpc)"
+ include "rupeesign(4)"
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "hin-wx" {
+
+ name[Group1]= "Hindi (Wx)";
+
+ key <TLDE> { [ grave, asciitilde, 2, 3 ] };
+
+ key <AE01> { [ 0x1000967, exclam ] };
+ key <AE02> { [ 0x1000968, at ] };
+ key <AE03> { [ 0x1000969 , numbersign ] };
+ key <AE04> { [ 0x100096A , dollar ] };
+ key <AE05> { [ 0x100096B , percent ] };
+ key <AE06> { [ 0x100096C , asciicircum ] };
+ key <AE07> { [ 0x100096D , ampersand ] };
+ key <AE08> { [ 0x100096e , asterisk ] };
+ key <AE09> { [ 0x100096F, parenleft ] };
+ key <AE10> { [ 0x1000966, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+
+ key <AD01> { [ 0x1000943, 0x1000944, 0x100090B, 0x1000960] };
+ key <AD02> { [ 0x1000924, 0x1000925 ] };
+ key <AD03> { [ 0x1000947, 0x1000948, 0x100090F, 0x1000910] };
+ key <AD04> { [ 0x1000930, 0x1000937 ] };
+ key <AD05> { [ 0x100091F, 0x1000920 ] };
+
+
+ key <AD06> { [ 0x100092F ] };
+ key <AD07> { [ 0x1000941, 0x1000942, 0x1000909, 0x100090A ] };
+ key <AD08> { [ 0x100093F, 0x1000940, 0x1000907, 0x1000908 ] };
+ key <AD09> { [ 0x100094B, 0x100094C, 0x1000913, 0x1000914] };
+ key <AD10> { [ 0x100092A, 0x100092B ] };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+ key <BKSL> { [ backslash, bar, 0x1000964, 0x1000965 ] };
+
+ key <AC01> { [ 0x100094D, 0x100093E, 0x1000905,0x1000906 ] };
+ key <AC02> { [ 0x1000938, 0x1000936 ] };
+ key <AC03> { [ 0x1000921, 0x1000922 ] };
+ key <AC04> { [ 0x1000919, 0x100091E ] };
+ key <AC05> { [ 0x1000917, 0x1000918 ] };
+
+
+ key <AC06> { [ 0x1000939, 0x1000903 ] };
+ key <AC07> { [ 0x100091C, 0x100091D ] };
+ key <AC08> { [ 0x1000915, 0x1000916 ] };
+ key <AC09> { [ 0x1000932, 0x1000962, 0x1000933, 0x100090C] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ 0x1000901, 0x100093C, 0x100093D, 0x1000950] };
+ key <AB02> { [ 0x1000926, 0x1000927 ] };
+ key <AB03> { [ 0x100091A, 0x100091B ] };
+ key <AB04> { [ 0x1000935 ] };
+ key <AB05> { [ 0x100092C, 0x100092D ] };
+ key <AB06> { [ 0x1000928, 0x1000923 ] };
+ key <AB07> { [ 0x100092E, 0x1000902 ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+
+ include "level3(ralt_switch)"
+ include "rupeesign(4)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "eng" {
+
+ include "us(basic)"
+ name[Group1]= "English (India, with rupee)";
+
+ include "rupeesign(4)"
+ include "level3(ralt_switch)"
+};
+
+
+// Description : Enhanced INSCRIPT keymap for Malayalam
+// Encoding : Unicode (http://www.unicode.org)
+// Author : Mahesh T Pai <paivakil@gmail.com>
+// Date : March, 2011
+// Source : http://www.nongnu.org/smc/docs/images/ml_inscript_layout.jpg
+// Comment : Based on the Inscript Keyboard created by M Baiju
+// Mapping:
+
+partial alphanumeric_keys
+xkb_symbols "mal_enhanced" {
+
+ name[Group1] = "Malayalam (enhanced Inscript, with rupee)";
+
+ //From grave to backslash (\)
+
+ key <TLDE> { [ U0d4a , U0d12 ] };
+ key <AE01> { [ U0d67 , exclam ] };
+ key <AE02> { [ U0d68 , at ] };
+ key <AE03> { [ U0d69 , numbersign ] };
+ key <AE04> { [ U0d6a , dollar ] };
+ key <AE05> { [ U0d6b , percent ] };
+ key <AE06> { [ U0d6c , asciicircum ] };
+ key <AE07> { [ U0d6d , ampersand ] };
+ key <AE08> { [ U0d6e , U0d7e ] };
+ key <AE09> { [ U0d6f , parenleft ] };
+ key <AE10> { [ U0d66 , parenright ] };
+
+ key <AE11> { [ minus , U0d03 ] };
+ key <AE12> { [ U0d43 , U0d0b ] };
+ key <BKSL> { [ U0d7c , U05C ] }; //bksl: chillu RR
+
+
+ // From 'q' to right bracket (])
+
+ key <AD01> { [ U0d57 , U0d14 ] };
+ key <AD02> { [ U0d48 , U0d10 ] };
+ key <AD03> { [ U0d3e , U0d06 ] };
+ key <AD04> { [ U0d40 , U0d08 ] };
+ key <AD05> { [ U0d42 , U0d0a ] };
+ key <AD06> { [ U0d2c , U0d2d ] };
+ key <AD07> { [ U0d39 , U0d19 ] };
+ key <AD08> { [ U0d17 , U0d18 ] };
+ key <AD09> { [ U0d26 , U0d27 ] };
+ key <AD10> { [ U0d1c , U0d1d ] };
+ key <AD11> { [ U0d21 , U0d22 ] };
+ key <AD12> { [ U0200d , U0d1e ] };
+
+ // From 'a' to apostrophe (')
+
+ key <AC01> { [ U0d4b , U0d13 ] };
+ key <AC02> { [ U0d47 , U0d0f ] };
+ key <AC03> { [ U0d4d , U0d05 ] };
+ key <AC04> { [ U0d3f , U0d07 ] };
+ key <AC05> { [ U0d41 , U0d09 ] };
+ key <AC06> { [ U0d2a , U0d2b ] };
+ key <AC07> { [ U0d30 , U0d31 ] };
+ key <AC08> { [ U0d15 , U0d16 ] };
+ key <AC09> { [ U0d24 , U0d25 ] };
+ key <AC10> { [ U0d1a , U0d1b ] };
+ key <AC11> { [ U0d1f , U0d20 ] };
+
+ // From 'z' to slash (/)
+
+ key <AB01> { [ U0d46 , U0d0e ] };
+ key <AB02> { [ U0d02 , U0d7a ] };
+ key <AB03> { [ U0d2e , U0d23 ] };
+ key <AB04> { [ U0d28 , U0d7b ] };
+ key <AB05> { [ U0d35 , U0d34 ] };
+ key <AB06> { [ U0d32 , U0d33 ] };
+ key <AB07> { [ U0d38 , U0d36 ] };
+ key <AB08> { [ comma , U0d37 ] };
+ key <AB09> { [ period , U0d7d ] }; //chillu l
+ key <AB10> { [ U0d2f , question ] };
+
+ include "rupeesign(4)"
+ include "level3(ralt_switch)"
+};
+
+
+// ---- BEGIN Hindi KaGaPa phonetic ----
+// Name: KaGaPa phonetic
+// Brief: Devanagari layout (Hindi, Sanskrit, Nepali, Marathi, etc.)
+// Diagram: (Original)[http://baraha.com/help/Keyboards/dev_brhkbd.htm]
+// (This layout)[http://bdsatish.in/lang/dev-kagapa.png]
+//
+// Description: Based on KaGaPa layout (also called Baraha layout or Nudi layout)
+// which is a modified layout of the specification by Dr. K. P. Rao.
+// This is a phonetic layout with the following features:
+// [1] All letters are mapped to phonetically-similar English keys
+// as much as possible.
+// [2] The independent vowel (svara) and its dependent vowel (maatra)
+// use the same key (depending upon SHIFT, ALTGR or ALTGR + SHIFT).
+// [3] Consonant conjuncts are produced by explicitly invoking the
+// 'viraama' (key f). The 'short a' maatra is implicit in all
+// consonants.
+// [4] Zero width non-joiner and joiner are on keys 6 and 7
+// respectively. These are absolutely essential for alternative
+// glyph renderings of consonant half-forms.
+// [5] Rigvedic accent marks, visarga variants.
+//
+// Author: Satish BD <bdsatish@gmail.com>
+//
+partial alphanumeric_keys
+xkb_symbols "hin-kagapa" {
+ name[Group1] = "Hindi (KaGaPa phonetic)";
+ key.type="FOUR_LEVEL";
+
+ // Roman digits
+ key <TLDE> { [ apostrophe, asciitilde, U201C ] }; // U201C: left double quotation mark
+ key <AE01> { [ 1, exclam, U0967 ] };
+ key <AE02> { [ 2, at, U0968, U20A8 ] }; // U20A8: generic rupee sign (Rs)
+ key <AE03> { [ 3, numbersign, U0969 ] };
+ key <AE04> { [ 4, dollar, U096A, U20B9 ] }; // U20B9: new Indian rupee sign
+ key <AE05> { [ 5, percent, U096B ] };
+ key <AE06> { [ 6, asciicircum, U096C, U200C ] }; // ZWNJ
+ key <AE07> { [ 7, ampersand, U096D, U200D ] }; // ZWJ
+ key <AE08> { [ 8, asterisk, U096E, U0901 ] }; // U0901: Devanagari candrabindu
+ key <AE09> { [ 9, parenleft, U096F ] };
+ key <AE10> { [ 0, parenright, U0966, U0970 ] }; // U0970: Devanagari abbreviation sign
+ key <AE11> { [ minus, underscore, U0952 ] }; // U0952: Devanagari stress sign anudatta
+ key <AE12> { [ equal, plus ] };
+ key <BKSL> { [ U005C, U007C, U0964, U0965 ] }; // backslash, pipe, danda, double danda
+
+ //Q Row
+ key <AD01> { [ U091F, U0920 ] }; // Q: retroflex Ta, Tha
+ key <AD02> { [ U0921, U0922, U095C, U095D ] }; // W: retroflex Da, Dha, Da-nukta, Dha-nukta
+ key <AD03> { [ U0946, U0947, U090E, U090F ] }; // E: matras, short E, long E
+ key <AD04> { [ U0930, U0943, U090B, U0931 ] }; // R: ra, vocalic R matra, vocalic R, ra-nukta
+ key <AD05> { [ U0924, U0925 ] }; // T: dental ta, tha
+ key <AD06> { [ U092F, U0948, U0910, U095F ] }; // Y: ya, ai matra, ai, ya-nukta
+ key <AD07> { [ U0941, U0942, U0909, U090A ] }; // U: matras, u, uu
+ key <AD08> { [ U093F, U0940, U0907, U0908 ] }; // I: matras, i, ii
+ key <AD09> { [ U094A, U094B, U0912, U0913 ] }; // O: matras, short o, long o
+ key <AD10> { [ U092A, U092B, U095E ] }; // P: pa, pha, pha-nukta
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+
+ //A Row
+ key <AC01> { [ U093E, U0906, U0905, U0972 ] }; // A: aa matra, aa, short a, candra a
+ key <AC02> { [ U0938, U0936 ] }; // S: sa, sha
+ key <AC03> { [ U0926, U0927 ] }; // D: dental da, dha
+ key <AC04> { [ U094D, U0944, U0960 ] }; // F: virama, vocalic RR matra, vocalic RR
+ key <AC05> { [ U0917, U0918, U095A ] }; // G: ga, gha, ga-nukta
+ key <AC06> { [ U0939, U0903, U1CF5, U1CF6 ] }; // H: ha, visarga, jihvamuliya, upadhmaniya
+ key <AC07> { [ U091C, U091D, U095B ] }; // J: ja, jha, ja-nukta
+ key <AC08> { [ U0915, U0916, U0958, U0959 ] }; // K: ka, kha, ka-nukta, kha-nukta
+ key <AC09> { [ U0932, U0933, U0962, U090C ] }; // L: la, lla, vocalic L matra, vocalic L
+ key <AC10> { [ semicolon, colon, U1CF2, U1CF3 ] }; // U1CF2/3: ardhavisarga/rotated ardhavisarga
+ key <AC11> { [ apostrophe, quotedbl, U0951, U201D ] }; // U0951: Devanagari stress sign udatta
+ // U201D: Right double quotation mark
+ //Z Row
+ key <AB01> { [ U091E, U0919 ] }; // Z: nya, nga
+ key <AB02> { [ U0937, U093C, U0934 ] }; // X: ssa, nukta below, lla-nukta
+ key <AB03> { [ U091A, U091B ] }; // C: ca, cha
+ key <AB04> { [ U0935, U094C, U0914 ] }; // V: va, matra au, au
+ key <AB05> { [ U092C, U092D ] }; // B: ba, bha
+ key <AB06> { [ U0928, U0923, U0929 ] }; // N: na, nna, nnna
+ key <AB07> { [ U092E, U0902, U093D, U0950 ] }; // M: ma, anusvara, avagraha, Devanagari OM
+ key <AB08> { [ comma, U003C, U0945, U090D ] }; // comma: comma, less than, matra, candra e
+ key <AB09> { [ period, U003E, U0949, U0911 ] }; // period: period, greater than, matra, candra o
+ key <AB10> { [ slash, question ] };
+
+ include "level3(ralt_switch)"
+};
+// ---- END Hindi KaGaPa ----
+
+// Sanskrit uses Devanagari layout of Hindi
+partial alphanumeric_keys
+xkb_symbols "san-kagapa" {
+ include "in(hin-kagapa)"
+ name[Group1] = "Sanskrit (KaGaPa phonetic)";
+};
+
+// Marathi uses Devanagari layout of Hindi
+partial alphanumeric_keys
+xkb_symbols "mar-kagapa" {
+ include "in(hin-kagapa)"
+ name[Group1] = "Marathi (KaGaPa phonetic)";
+};
+
+
+// ---- BEGIN Kannada KaGaPa phonetic ----
+// Name: Kannada KaGaPa phonetic
+// Diagram: (Original)[http://www.baraha.com/help/Keyboards/kan_brhkbd.htm]
+// (This layout)[http://bdsatish.in/lang/kan-kagapa.png]
+//
+// Description: Based on KaGaPa layout (also called Baraha layout or Nudi layout).
+// See the description to "hin-kagapa" above.
+// Certain punctuation characters from Devanagari block are
+// retained for compatibility.
+//
+// Author: Satish BD <bdsatish@gmail.com>
+//
+partial alphanumeric_keys
+xkb_symbols "kan-kagapa" {
+ name[Group1] = "Kannada (KaGaPa phonetic)";
+ key.type="FOUR_LEVEL";
+
+ // Roman digits
+ key <TLDE> { [ apostrophe, asciitilde, U201C ] }; // U201C: left double quotation mark
+ key <AE01> { [ 1, exclam, U0CE7 ] };
+ key <AE02> { [ 2, at, U0CE8, U20A8 ] }; // U20A8: generic rupee sign (Rs)
+ key <AE03> { [ 3, numbersign, U0CE9 ] };
+ key <AE04> { [ 4, dollar, U0CEA, U20B9 ] }; // U20B9: new Indian rupee sign
+ key <AE05> { [ 5, percent, U0CEB ] };
+ key <AE06> { [ 6, asciicircum, U0CEC, U200C ] }; // ZWNJ
+ key <AE07> { [ 7, ampersand, U0CED, U200D ] }; // ZWJ
+ key <AE08> { [ 8, asterisk, U0CEE, U0901 ] }; // U0901: Devanagari candrabindu
+ key <AE09> { [ 9, parenleft, U0CEF ] };
+ key <AE10> { [ 0, parenright, U0CE6 ] };
+ key <AE11> { [ minus, underscore, U0952 ] }; // U0952: Devanagari stress sign anudatta
+ key <AE12> { [ equal, plus ] };
+ key <BKSL> { [ U005C, U007C, U0964, U0965 ] }; // backslash, pipe, danda, double danda
+
+ //Q Row
+ key <AD01> { [ U0C9F, U0CA0 ] }; // Q: retroflex Ta, Tha
+ key <AD02> { [ U0CA1, U0CA2 ] }; // W: retroflex Da, Dha
+ key <AD03> { [ U0CC6, U0CC7, U0C8E, U0C8F ] }; // E: matras, short E, long E
+ key <AD04> { [ U0CB0, U0CC3, U0C8B, U0CB1 ] }; // R: ra, vocalic R matra, vocalic R, RRA
+ key <AD05> { [ U0CA4, U0CA5 ] }; // T: dental ta, tha
+ key <AD06> { [ U0CAF, U0CC8, U0C90 ] }; // Y: ya, ai matra, ai
+ key <AD07> { [ U0CC1, U0CC2, U0C89, U0C8A ] }; // U: matras, u, uu
+ key <AD08> { [ U0CBF, U0CC0, U0C87, U0C88 ] }; // I: matras, i, ii
+ key <AD09> { [ U0CCA, U0CCB, U0C92, U0C93 ] }; // O: matras, short o, long o
+ key <AD10> { [ U0CAA, U0CAB ] }; // P: pa, pha
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+
+ //A Row
+ key <AC01> { [ U0CBE, U0C86, U0C85 ] }; // A: aa matra, aa, short a
+ key <AC02> { [ U0CB8, U0CB6 ] }; // S: sa, sha
+ key <AC03> { [ U0CA6, U0CA7 ] }; // D: dental da, dha
+ key <AC04> { [ U0CCD, U0CC4, U0CE0 ] }; // F: virama, vocalic RR matra, vocalic RR
+ key <AC05> { [ U0C97, U0C98 ] }; // G: ga, gha
+ key <AC06> { [ U0CB9, U0C83, U0CF1, U0CF2 ] }; // H: ha, visarga, jihvanuliya, upadhmaniya
+ key <AC07> { [ U0C9C, U0C9D ] }; // J: ja, jha
+ key <AC08> { [ U0C95, U0C96 ] }; // K: ka, kha
+ key <AC09> { [ U0CB2, U0CB3, U0CE2, U0C8C ] }; // L: la, lla, vocalic L matra, vocalic L
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl, U0951, U201D ] }; // U0951: Devanagari stress sign udatta
+ // U201D: Right double quotation mark
+ //Z Row
+ key <AB01> { [ U0C9E, U0C99 ] }; // Z: nya, nga
+ key <AB02> { [ U0CB7, U0CBC, U0CDE ] }; // X: ssa, nukta below, LLLA
+ key <AB03> { [ U0C9A, U0C9B ] }; // C: ca, cha
+ key <AB04> { [ U0CB5, U0CCC, U0C94 ] }; // V: va, matra au, au
+ key <AB05> { [ U0CAC, U0CAD ] }; // B: ba, bha
+ key <AB06> { [ U0CA8, U0CA3 ] }; // N: na, nna
+ key <AB07> { [ U0CAE, U0C82, U0CBD, U0950 ] }; // M: ma, anusvara, avagraha, Devanagari OM
+ key <AB08> { [ comma, U003C, U0CB1 ] }; // comma: comma, less than, RRA
+ key <AB09> { [ period, U003E, U0CDE ] }; // period: period, greater than, LLLA
+ key <AB10> { [ slash, question ] };
+
+ include "level3(ralt_switch)"
+};
+// ---- END Kannada KaGaPa ----
+
+
+// ---- BEGIN Telugu KaGaPa phonetic ----
+// Name: Telugu KaGaPa phonetic
+// Diagram: (Original)[http://www.baraha.com/help/Keyboards/tel_brhkbd.htm]
+// (This layout)[http://bdsatish.in/lang/tel-kagapa.png]
+//
+// Description: Based on KaGaPa layout (also called Baraha layout or Nudi layout).
+// See the description to "hin-kagapa" above.
+// Certain punctuation characters from Devanagari block are
+// retained for compatibility.
+//
+// Author: Satish BD <bdsatish@gmail.com>
+//
+partial alphanumeric_keys
+xkb_symbols "tel-kagapa" {
+ name[Group1] = "Telugu (KaGaPa phonetic)";
+ key.type="FOUR_LEVEL";
+
+ // Roman digits
+ key <TLDE> { [ apostrophe, asciitilde, U201C ] }; // U201C: left double quotation mark
+ key <AE01> { [ 1, exclam, U0C67 ] };
+ key <AE02> { [ 2, at, U0C68, U20A8 ] }; // U20A8: generic rupee sign (Rs)
+ key <AE03> { [ 3, numbersign, U0C69 ] };
+ key <AE04> { [ 4, dollar, U0C6A, U20B9 ] }; // U20B9: new Indian rupee sign
+ key <AE05> { [ 5, percent, U0C6B ] };
+ key <AE06> { [ 6, asciicircum, U0C6C, U200C ] }; // ZWNJ
+ key <AE07> { [ 7, ampersand, U0C6D, U200D ] }; // ZWJ
+ key <AE08> { [ 8, asterisk, U0C6E, U0C01 ] }; // U0C01: Telugu arasunna
+ key <AE09> { [ 9, parenleft, U0C6F ] };
+ key <AE10> { [ 0, parenright, U0C66 ] };
+ key <AE11> { [ minus, underscore, U0952 ] }; // U0952: Devanagari stress sign anudatta
+ key <AE12> { [ equal, plus ] };
+ key <BKSL> { [ U005C, U007C, U0964, U0965 ] }; // backslash, pipe, danda, double danda
+
+ //Q Row
+ key <AD01> { [ U0C1F, U0C20 ] }; // Q: retroflex Ta, Tha
+ key <AD02> { [ U0C21, U0C22 ] }; // W: retroflex Da, Dha
+ key <AD03> { [ U0C46, U0C47, U0C0E, U0C0F ] }; // E: matras, short E, long E
+ key <AD04> { [ U0C30, U0C43, U0C0B, U0C31 ] }; // R: ra, vocalic R matra, vocalic R, RRA
+ key <AD05> { [ U0C24, U0C25 ] }; // T: dental ta, tha
+ key <AD06> { [ U0C2F, U0C48, U0C10 ] }; // Y: ya, ai matra, ai
+ key <AD07> { [ U0C41, U0C42, U0C09, U0C0A ] }; // U: matras, u, uu
+ key <AD08> { [ U0C3F, U0C40, U0C07, U0C08 ] }; // I: matras, i, ii
+ key <AD09> { [ U0C4A, U0C4B, U0C12, U0C13 ] }; // O: matras, short o, long o
+ key <AD10> { [ U0C2A, U0C2B ] }; // P: pa, pha
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+
+ //A Row
+ key <AC01> { [ U0C3E, U0C06, U0C05 ] }; // A: aa matra, aa, short a
+ key <AC02> { [ U0C38, U0C36 ] }; // S: sa, sha
+ key <AC03> { [ U0C26, U0C27 ] }; // D: dental da, dha
+ key <AC04> { [ U0C4D, U0C44, U0C60 ] }; // F: virama, vocalic RR matra, vocalic RR
+ key <AC05> { [ U0C17, U0C18 ] }; // G: ga, gha
+ key <AC06> { [ U0C39, U0C03 ] }; // H: ha, visarga
+ key <AC07> { [ U0C1C, U0C1D ] }; // J: ja, jha
+ key <AC08> { [ U0C15, U0C16 ] }; // K: ka, kha
+ key <AC09> { [ U0C32, U0C33, U0C62, U0C0C ] }; // L: la, lla, vocalic L matra, vocalic L
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl, U0951, U201D ] }; // U0951: Devanagari stress sign udatta
+ // U201D: Right double quotation mark
+ //Z Row
+ key <AB01> { [ U0C1E, U0C19 ] }; // Z: nya, nga
+ key <AB02> { [ U0C37 ] }; // X: ssa
+ key <AB03> { [ U0C1A, U0C1B ] }; // C: ca, cha
+ key <AB04> { [ U0C35, U0C4C, U0C14 ] }; // V: va, matra au, au
+ key <AB05> { [ U0C2C, U0C2D ] }; // B: ba, bha
+ key <AB06> { [ U0C28, U0C23 ] }; // N: na, nna
+ key <AB07> { [ U0C2E, U0C02, U0C3D, U0950 ] }; // M: ma, anusvara, avagraha, Devanagari OM
+ key <AB08> { [ comma, U003C, U0C58 ] }; // comma: comma, less than, TSA
+ key <AB09> { [ period, U003E, U0C59 ] }; // period: period, greater than, DZA
+ key <AB10> { [ slash, question ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Description : Keymap for Manipuri language (Meetei mayek script)
+// Encoding : Unicode (http://www.unicode.org)
+// Author : Santosh Heigrujam <santosh.tomba@gmail.com>
+// Date : December, 2013
+// Source :
+// Comment :
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "eeyek" {
+
+ name[Group1]= "Manipuri (Eeyek)";
+
+ key <TLDE> { [ grave, asciitilde ] };
+ key <AE01> { [ Uabf1, exclam ] };
+ key <AE02> { [ Uabf2, at ] };
+ key <AE03> { [ Uabf3, numbersign ] };
+ key <AE04> { [ Uabf4, dollar ] };
+ key <AE05> { [ Uabf5, percent ] };
+ key <AE06> { [ Uabf6, asciicircum ] };
+ key <AE07> { [ Uabf7, ampersand ] };
+ key <AE08> { [ Uabf8, asterisk ] };
+ key <AE09> { [ Uabf9, parenleft ] };
+ key <AE10> { [ Uabf0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD01> { [ Uabc8, Uabd8 ] };
+ key <AD02> { [ Uabcb, Uabcb ] };
+ key <AD03> { [ Uabcf, Uabe2 ] };
+ key <AD04> { [ Uabd4, Uabd4 ] };
+ key <AD05> { [ Uabc7, Uabe0 ] };
+ key <AD06> { [ Uabcc, Uabe6 ] };
+ key <AD07> { [ Uabce, Uabe8 ] };
+ key <AD08> { [ Uabe4, Uabe9 ] };
+ key <AD09> { [ Uabe3, Uabe7 ] };
+ key <AD10> { [ Uabc4, Uabde ] };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+
+ key <AC01> { [ Uabd1, Uabe5 ] };
+ key <AC02> { [ Uabc1, Uabd3 ] };
+ key <AC03> { [ Uabd7, Uabd9 ] };
+ key <AC04> { [ Uabd0, Uabda ] };
+ key <AC05> { [ Uabd2, Uabd8 ] };
+ key <AC06> { [ Uabcd, Uabea ] };
+ key <AC07> { [ Uabd6, Uabd3 ] };
+ key <AC08> { [ Uabc0, Uabdb ] };
+ key <AC09> { [ Uabc2, Uabdc ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ Uabc9, Uabe1 ] };
+ key <AB02> { [ Uabca, Uabd9 ] };
+ key <AB03> { [ Uabc6, Uabeb ] };
+ key <AB04> { [ Uabda, Uabed ] };
+ key <AB05> { [ Uabd5, Uabec ] };
+ key <AB06> { [ Uabc5, Uabdf ] };
+ key <AB07> { [ Uabc3, Uabdd ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+
+ key <BKSL> { [ backslash, bar ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/test/data/symbols/inet b/test/data/symbols/inet
new file mode 100644
index 0000000..5403e77
--- /dev/null
+++ b/test/data/symbols/inet
@@ -0,0 +1,1909 @@
+// EAK (Easy Access keyboards: Internet, Multimedia, PDA)
+// Copyright (C) 2002 Stanislav Brabec <sbrabec@suse.cz>
+//
+// Based on the LinEAK project.
+// LinEAK - Linux support for Easy Access and Internets
+// Copyright (C) 2001, 2002 Mark Smulders <Mark@PIRnet.nl>
+
+// Usage in XF86Config:
+// Option "XkbLayout" "my_kb_layout"
+// Option "XkbVariant" "my_kb_variant"
+// Option "XkbModel" "my_eak_type"
+// Option "XkbRules" "xfree86"
+// Simple command line usage:
+// setxkbmap 'my_kb_layout' -variant 'my_kb_variant' -model 'my_eak_type'
+
+// Very common set of media keys.
+hidden partial alphanumeric_keys
+xkb_symbols "media_common" {
+ key <I01> { [ XF86AudioMedia ] };
+ key <I10> { [ XF86AudioPrev ] };
+ key <I19> { [ XF86AudioNext ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I24> { [ XF86AudioStop, XF86Eject ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <K5A> { [ XF86Eject ] };
+ key <K6C> { [ XF86Eject ] };
+};
+
+// Popular web navigation keys.
+hidden partial alphanumeric_keys
+xkb_symbols "nav_common" {
+ key <I21> { [ XF86Calculator ] };
+ key <I32> { [ XF86WWW ] };
+ key <I65> { [ XF86Search ] };
+ key <I66> { [ XF86Favorites ] };
+ key <I67> { [ XF86Reload ] };
+ key <I68> { [ XF86Stop ] };
+ key <I69> { [ XF86Forward ] };
+ key <I6A> { [ XF86Back ] };
+ key <I6B> { [ XF86MyComputer ] };
+ key <I6C> { [ XF86Mail ] };
+ key <I6D> { [ XF86AudioMedia ] };
+};
+
+// ACPI Standard
+hidden partial alphanumeric_keys
+xkb_symbols "acpi_common" {
+ key <I5E> { [ XF86PowerOff ] };
+ key <I5F> { [ XF86Standby ] };
+ key <I63> { [ XF86WakeUp ] };
+ key <I74> { [ XF86Battery ] };
+ key <I76> { [ XF86WLAN ] };
+ key <I16> { [ XF86Sleep ] };
+};
+
+// Combined sections, for simplicity.
+hidden partial alphanumeric_keys
+xkb_symbols "media_nav_common" {
+ include "inet(media_common)"
+ include "inet(nav_common)"
+};
+
+hidden partial alphanumeric_keys
+xkb_symbols "media_nav_acpi_common" {
+ include "inet(media_common)"
+ include "inet(nav_common)"
+ include "inet(acpi_common)"
+};
+
+hidden partial alphanumeric_keys
+xkb_symbols "nav_acpi_common" {
+ include "inet(nav_common)"
+ include "inet(acpi_common)"
+};
+
+hidden partial alphanumeric_keys
+xkb_symbols "media_acpi_common" {
+ include "inet(media_common)"
+ include "inet(acpi_common)"
+};
+
+// Evdev Standardized Keycodes
+partial alphanumeric_keys
+xkb_symbols "evdev" {
+ key <MUTE> { [ XF86AudioMute ] };
+ key <VOL-> { [ XF86AudioLowerVolume ] };
+ key <VOL+> { [ XF86AudioRaiseVolume ] };
+ key <POWR> { [ XF86PowerOff ] };
+ key <STOP> { [ Cancel ] };
+ key <AGAI> { [ Redo ] };
+ key <PROP> { [ SunProps ] };
+ key <UNDO> { [ Undo ] };
+ key <FRNT> { [ SunFront ] };
+ key <COPY> { [ XF86Copy ] };
+ key <OPEN> { [ XF86Open ] };
+ key <PAST> { [ XF86Paste ] };
+ key <FIND> { [ Find ] };
+ key <CUT> { [ XF86Cut ] };
+ key <HELP> { [ Help ] };
+ key <LNFD> { [ Linefeed ] };
+
+// Commented out because HZTG has same keycode as TLDE
+// key <HZTG> { [ Zenkaku_Hankaku ] };
+
+ key <HKTG> { [ Hiragana_Katakana ] };
+ key <HENK> { [ Henkan ] };
+ key <MUHE> { [ Muhenkan ] };
+ key <KATA> { [ Katakana ] };
+ key <HIRA> { [ Hiragana ] };
+ key <RO> { [ Romaji ] };
+
+ key <HNGL> { [ Hangul ] };
+ key <HJCV> { [ Hangul_Hanja ] };
+ key <FK21> { [ XF86TouchpadToggle ] };
+ key <FK22> { [ XF86TouchpadOn ] };
+ key <FK23> { [ XF86TouchpadOff ] };
+
+ key <FK20> { [ XF86AudioMicMute ] };
+
+// key <I120> { [ ] }; // KEY_MACRO
+ key <I126> { [ plusminus ] };
+ key <I128> { [ XF86LaunchA ] };
+ key <I147> { [ XF86MenuKB ] };
+ key <I148> { [ XF86Calculator ] };
+// key <I149> { [ ] }; // KEY_SETUP
+ key <I150> { [ XF86Sleep ] };
+ key <I151> { [ XF86WakeUp ] };
+ key <I152> { [ XF86Explorer ] };
+ key <I153> { [ XF86Send ] };
+// key <I154> { [ ] }; // KEY_DELETEFILE
+ key <I155> { [ XF86Xfer ] };
+ key <I156> { [ XF86Launch1 ] };
+ key <I157> { [ XF86Launch2 ] };
+ key <I158> { [ XF86WWW ] };
+ key <I159> { [ XF86DOS ] };
+ key <I160> { [ XF86ScreenSaver ] };
+ key <I161> { [ XF86RotateWindows ] };
+ key <I162> { [ XF86TaskPane ] };
+ key <I163> { [ XF86Mail ] };
+ key <I164> { [ XF86Favorites ] };
+ key <I165> { [ XF86MyComputer ] };
+ key <I166> { [ XF86Back ] };
+ key <I167> { [ XF86Forward ] };
+// key <I168> { [ ] }; // KEY_CLOSECD (opposite of eject)
+ key <I169> { [ XF86Eject ] };
+ key <I170> { [ XF86Eject, XF86Eject ] };
+ key <I171> { [ XF86AudioNext ] };
+ key <I172> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I173> { [ XF86AudioPrev ] };
+ key <I174> { [ XF86AudioStop, XF86Eject ] };
+ key <I175> { [ XF86AudioRecord ] };
+ key <I176> { [ XF86AudioRewind ] };
+ key <I177> { [ XF86Phone ] };
+// key <I178> { [ ] }; // KEY_ISO
+ key <I179> { [ XF86Tools ] };
+ key <I180> { [ XF86HomePage ] };
+ key <I181> { [ XF86Reload ] };
+ key <I182> { [ XF86Close ] };
+// key <I183> { [ ] }; // KEY_MOVE
+// key <I184> { [ ] }; // KEY_EDIT
+ key <I185> { [ XF86ScrollUp ] };
+ key <I186> { [ XF86ScrollDown ] };
+ key <I187> { [ parenleft ] };
+ key <I188> { [ parenright ] };
+ key <I189> { [ XF86New ] };
+ key <I190> { [ Redo ] };
+ key <I192> { [ XF86LaunchA ] };
+ key <I193> { [ XF86LaunchC ] };
+ key <I194> { [ XF86LaunchD ] };
+ key <I195> { [ XF86LaunchE ] };
+ key <I196> { [ XF86LaunchF ] };
+ key <I208> { [ XF86AudioPlay ] };
+ key <I209> { [ XF86AudioPause ] };
+ key <I210> { [ XF86Launch3 ] };
+ key <I211> { [ XF86Launch4 ] };
+ key <I212> { [ XF86LaunchB ] };
+ key <I213> { [ XF86Suspend ] };
+ key <I214> { [ XF86Close ] };
+ key <I215> { [ XF86AudioPlay ] };
+ key <I216> { [ XF86AudioForward ] };
+// key <I217> { [ ] }; // KEY_BASSBOOST
+ key <I218> { [ Print ] };
+// key <I219> { [ ] }; // KEY_HP
+ key <I220> { [ XF86WebCam ] };
+// key <I221> { [ ] }; // KEY_SOUND
+// key <I222> { [ ] }; // KEY_QUESTION
+ key <I223> { [ XF86Mail ] };
+ key <I224> { [ XF86Messenger ] }; // KEY_CHAT
+ key <I225> { [ XF86Search ] };
+ key <I226> { [ XF86Go ] }; // KEY_CONNECT
+ key <I227> { [ XF86Finance ] };
+ key <I228> { [ XF86Game ] }; // KEY_SPORT
+ key <I229> { [ XF86Shop ] };
+// key <I230> { [ ] }; // KEY_ALTERASE
+ key <I231> { [ Cancel ] };
+ key <I232> { [ XF86MonBrightnessDown ] };
+ key <I233> { [ XF86MonBrightnessUp ] };
+ key <I234> { [ XF86AudioMedia ] };
+ key <I235> { [ XF86Display ] };
+ key <I236> { [ XF86KbdLightOnOff ] }; // KEY_KBDILLUMTOGGLE
+ key <I237> { [ XF86KbdBrightnessDown ] }; // KEY_KBDILLUMDOWN
+ key <I238> { [ XF86KbdBrightnessUp ] }; // KEY_KBDILLUMUP
+ key <I239> { [ XF86Send ] };
+ key <I240> { [ XF86Reply ] };
+ key <I241> { [ XF86MailForward ] };
+ key <I242> { [ XF86Save ] };
+ key <I243> { [ XF86Documents ] };
+ key <I244> { [ XF86Battery ] };
+ key <I245> { [ XF86Bluetooth ] };
+ key <I246> { [ XF86WLAN ] };
+// key <I249> { [ ] }; // KEY_VIDEO_NEXT -- drive next video source
+// key <I250> { [ ] }; // KEY_VIDEO_PREV -- drive previous video source
+// key <I251> { [ ] }; // KEY_BRIGHTNESS_CYCLE -- bright up, max++ == min
+// key <I252> { [ ] }; // KEY_BRIGHTNESS_ZERO -- brightness off
+// key <I253> { [ ] }; // KEY_DISPLAY_OFF -- turn off display
+// key <I254> { [ ] }; // KEY_WIMAX
+ key <I255> { [ XF86Hibernate ] }; // KEY_HIBERNATE
+
+ key <FK13> { [ XF86Tools ] };
+ key <FK14> { [ XF86Launch5 ] };
+ key <FK15> { [ XF86Launch6 ] };
+ key <FK16> { [ XF86Launch7 ] };
+ key <FK17> { [ XF86Launch8 ] };
+ key <FK18> { [ XF86Launch9 ] };
+};
+
+
+// Acer
+
+// Acer AirKey V
+partial alphanumeric_keys
+xkb_symbols "airkey" {
+ include "inet(acpi_common)"
+ key <I13> { [ XF86AudioNext ] };
+ key <I15> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I16> { [ XF86Mail ] };
+ key <I18> { [ XF86AudioPrev ] };
+ key <I19> { [ XF86AudioMute ] };
+ key <I24> { [ XF86WWW ] };
+ key <I26> { [ XF86AudioLowerVolume ] };
+ key <I2D> { [ XF86AudioRaiseVolume ] };
+ key <I2F> { [ XF86Terminal ] };
+ key <I31> { [ XF86AudioStop, XF86Eject ] };
+};
+
+// Acer C300 laptop
+partial alphanumeric_keys
+xkb_symbols "acer_c300" {
+ include "inet(nav_common)"
+ key <I17> { [ F14 ] };
+ key <I1F> { [ F13 ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I5E> { [ XF86Launch2 ] };
+ key <I75> { [ Help ] };
+ key <IR7C> { [ XF86Launch1 ] };
+};
+
+// Acer Ferrari 4000 Keyboard
+// From Alex Dubov <oakad@yahoo.com>
+partial alphanumeric_keys
+xkb_symbols "acer_ferrari4k" {
+ include "inet(media_nav_common)"
+ key <I24> { [ dollar ] };
+ key <I25> { [ EuroSign ] };
+ key <I26> { [ XF86Display ] };
+ // Missing keycodes - set-up with setkeycodes
+ key <I70> { [ Help ] };
+ key <I71> { [ XF86Launch1 ] };
+ key <I72> { [ XF86Launch2 ] };
+ key <I73> { [ XF86Launch3 ] };
+ key <I74> { [ XF86Launch4 ] };
+};
+
+// Acer laptop (Generic layout for Acer laptops from 2004 onwards)
+// From Carlos Corbacho <cathectic@gmail.com>
+// Keys marked (HAL) require HAL 0.5.10 (or newer) to be set up correctly
+// (Your laptop must also be added to hal-info)
+// (Not all these keys will be available on every Acer laptop)
+partial alphanumeric_keys
+xkb_symbols "acer_laptop" {
+ include "inet(media_nav_acpi_common)"
+ key <I17> { [ XF86Launch2 ] }; // "P" or "P2" (HAL)
+ key <I1F> { [ XF86Launch1 ] }; // "e" or "P1" (HAL)
+
+ // Hotkeys (Function)
+ // Launch Keys
+ // Device keys
+ key <I56> { [ XF86Display ] }; // Fn+F5 (HAL)
+ key <I71> { [ XF86Launch4 ] }; // Fn+F3 (HAL)
+ key <I72> { [ XF86LaunchB ] }; // Bluetooth (HAL)
+ key <I73> { [ XF86LaunchA ] }; // Wireless (HAL)
+ key <I75> { [ Help ] }; // Fn+F1 (HAL)
+ key <I79> { [ XF86Launch5 ] }; // Fn+F7 (HAL)
+ key <K66> { [ XF86Launch3 ] }; // Fn+F2 (HAL)
+
+ // Special Characters
+ // To avoid setting a precedent/standard that will be broken in later
+ // versions of HAL, these keys are commented out for now. When they are no
+ // longer marked 'FIXME' and have saner keycodes, these two entries can be
+ // fixed and permanently uncommented. In the meantime, just uncomment these
+ // to make the keys work.
+// key <K5D> { [ EuroSign ] }; // Euro (HAL)
+// key <K5E> { [ dollar ] }; // Dollar (HAL)
+};
+
+
+// Azona
+
+// Azona RF2300 wireless Internet
+partial alphanumeric_keys
+xkb_symbols "azonaRF2300" {
+ // From Radics Laszlo <garaboncias@mailbox.hu>
+ include "inet(nav_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I3C> { [ XF86Copy ] };
+ key <I78> { [ XF86Cut ] };
+// key <RCTL> { [ XF86Paste ] };
+};
+
+
+// Brother
+
+// Brother Internet
+partial alphanumeric_keys
+xkb_symbols "brother" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86ScrollUp ] };
+ key <I12> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I17> { [ XF86AudioPrev ] };
+ key <I18> { [ XF86ScrollDown ] };
+ key <I19> { [ XF86ZoomOut ] };
+ key <I1E> { [ XF86AudioMute ] };
+ key <I21> { [ XF86WWW ] };
+ key <I22> { [ Menu ] };
+ key <I23> { [ XF86AudioStop ] };
+ key <I24> { [ XF86Calculator ] };
+ key <I25> { [ XF86Xfer ] };
+ key <I26> { [ XF86Mail ] };
+ key <I2E> { [ XF86AudioNext ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I32> { [ XF86ZoomIn ] };
+ key <I68> { [ XF86AudioLowerVolume ] };
+};
+
+
+// BTC
+
+// BTC 5113RF Multimedia
+partial alphanumeric_keys
+xkb_symbols "btc5113rf" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86AudioStop ] };
+ key <I12> { [ XF86AudioMute ] };
+ key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I20> { [ XF86Favorites ] };
+ key <I21> { [ XF86Eject ] };
+ key <I22> { [ XF86AudioPrev ] };
+ key <I24> { [ XF86AudioNext ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86Back ] };
+ key <I30> { [ XF86WWW ] };
+ key <I32> { [ XF86Search ] };
+};
+
+// BTC 9000
+partial alphanumeric_keys
+xkb_symbols "btc9000" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86AudioStop ] };
+ key <I12> { [ XF86AudioMute ] };
+ key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I20> { [ XF86Favorites ] };
+ key <I21> { [ XF86AudioMedia ] };
+ key <I22> { [ XF86AudioPrev ] };
+ key <I24> { [ XF86AudioNext ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86Reload ] };
+ key <I2E> { [ XF86Mail ] };
+ key <I30> { [ XF86HomePage ] };
+ key <I32> { [ XF86Search ] };
+};
+
+// BTC 9000A
+partial alphanumeric_keys
+xkb_symbols "btc9000a" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86AudioStop ] };
+ key <I12> { [ XF86AudioMute ] };
+ key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I20> { [ XF86Favorites ] };
+ key <I21> { [ XF86Eject ] };
+ key <I22> { [ XF86AudioPrev ] };
+ key <I24> { [ XF86AudioNext ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86HomePage ] };
+ key <I2E> { [ Help ] };
+ key <I30> { [ XF86WWW ] };
+ key <I32> { [ XF86Search ] };
+};
+
+// BTC 9001AH
+xkb_symbols "btc9001ah" {
+ include "inet(acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I6C> { [ XF86Mail ] };
+ key <RWIN> { [ XF86Eject ] };
+};
+
+// BTC 5090
+partial alphanumeric_keys
+xkb_symbols "btc5090" {
+ include "inet(media_nav_acpi_common)"
+ key <I26> { [ XF86Start ] };
+ key <I33> { [ XF86Eject ] };
+};
+
+// BTC 9019U
+partial alphanumeric_keys
+xkb_symbols "btc9019u" {
+ include "inet(media_nav_acpi_common)"
+ key <FK17> { [ XF86Search ] };
+ key <I02> { [ XF86HomePage ] };
+};
+
+
+// Cherry
+
+// Cherry Blue Line CyBo@rd
+partial alphanumeric_keys
+xkb_symbols "cherryblue" {
+ include "inet(nav_common)"
+ key <FK16> { [ XF86Reload ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I63> { [ XF86Standby ] };
+ key <PRSC> { [ XF86Terminal ] };
+ key <IR7C> { [ XF86Go ] };
+};
+
+// Cherry CyMotion Master XPress
+partial alphanumeric_keys
+xkb_symbols "cherryblueb" {
+ include "inet(media_nav_common)"
+ key <FK16> { [ XF86Reload ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I07> { [ XF86Forward ] };
+ key <I08> { [ XF86Back ] };
+ key <I0A> { [ XF86Copy ] };
+ key <I0B> { [ XF86ScrollUp ] };
+ key <I12> { [ XF86ScrollDown ] };
+ key <I17> { [ XF86Cut ] };
+ key <I18> { [ XF86Paste ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I2C> { [ XF86Book ] };
+ key <I32> { [ XF86Finance ] };
+ key <I63> { [ XF86Standby ] };
+ key <I67> { [ XF86AudioRewind ] };
+ key <I70> { [ XF86Eject ] };
+ key <I71> { [ XF86Book ] };
+ key <I72> { [ XF86Book ] };
+ key <PRSC> { [ XF86Terminal ] };
+ key <IR7C> { [ XF86Go ] };
+};
+
+// Cherry Blue Line CyBo@rd (alt.)
+partial alphanumeric_keys
+xkb_symbols "cherrybluea" {
+ include "inet(media_nav_acpi_common)"
+ key <I6D> { [ XF86Go ] };
+};
+
+// Cherry CyBo@rd USB-Hub
+partial alphanumeric_keys
+xkb_symbols "cherrycyboard" {
+ include "inet(media_nav_acpi_common)"
+ key <FK17> { [ XF86Search ] };
+ key <I02> { [ XF86HomePage ] };
+ key <K67> { [ XF86Terminal ] };
+ key <IR7C> { [ XF86AudioMedia ] };
+};
+
+// Cherry CyMotion Expert
+partial alphanumeric_keys
+xkb_symbols "cherrycmexpert" {
+ include "inet(cherryblueb)"
+ include "inet(acpi_common)"
+ key <FK15> { [ XF86Mail ] };
+};
+
+
+// Chicony
+
+// Chicony Internet
+partial alphanumeric_keys
+xkb_symbols "chicony" {
+ include "inet(acpi_common)"
+ key <I12> { [ XF86AudioMute ] };
+ key <I17> { [ XF86Mail ] };
+ key <I19> { [ XF86AudioLowerVolume ] };
+ key <I1E> { [ XF86Forward ] };
+ key <I20> { [ XF86AudioNext ] };
+ key <I21> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioPrev ] };
+ key <I23> { [ XF86AudioRaiseVolume ] };
+ key <I24> { [ XF86AudioStop ] };
+ key <I25> { [ XF86Back ] };
+ key <I26> { [ XF86LaunchB ] };
+ key <I2E> { [ XF86LaunchC ] };
+ key <I30> { [ XF86LaunchA ] };
+ key <I32> { [ XF86WWW ] };
+ key <I5F> { [ XF86ContrastAdjust ] };
+ key <I63> { [ XF86BrightnessAdjust ] };
+};
+
+// Chicony KU-0108
+partial alphanumeric_keys
+xkb_symbols "chicony0108" {
+ include "inet(cherrycyboard)"
+};
+
+// Chicony KU-0420 AKA Targus Slim Internet Media USB Keyboard
+partial alphanumeric_keys
+xkb_symbols "chicony0420" {
+ include "inet(media_nav_acpi_common)"
+ key <I01> { [ XF86AudioMedia ] };
+ key <K67> { [ XF86MyComputer ] };
+};
+
+// Chicony KB-9885
+partial alphanumeric_keys
+xkb_symbols "chicony9885" {
+ include "inet(acpi_common)"
+ key <I12> { [ XF86AudioMute ] };
+ key <I17> { [ XF86Mail ] };
+ key <I19> { [ XF86AudioLowerVolume ] };
+ key <I1E> { [ XF86Forward ] };
+ key <I20> { [ XF86AudioNext ] };
+ key <I21> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioPrev ] };
+ key <I23> { [ XF86AudioRaiseVolume ] };
+ key <I24> { [ XF86AudioStop ] };
+ key <I25> { [ XF86Back ] };
+ key <I26> { [ XF86LaunchB ] };
+ key <I2E> { [ XF86LaunchC ] };
+ key <I30> { [ XF86LaunchA ] };
+ key <I32> { [ XF86WWW ] };
+};
+
+
+// Compaq
+
+// Compaq Easy Access
+partial alphanumeric_keys
+xkb_symbols "compaqeak8" {
+ key <I13> { [ XF86Community ] };
+ key <I14> { [ XF86Market ] };
+ key <I15> { [ XF86Meeting ] };
+ key <I1A> { [ XF86Search ] };
+ key <I1B> { [ XF86News ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I1F> { [ XF86HomePage ] };
+ key <I23> { [ XF86WWW ] };
+};
+
+// Compaq Internet (7 keys)
+partial alphanumeric_keys
+xkb_symbols "compaqik7" {
+ key <I12> { [ XF86LightBulb ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I21> { [ XF86Search ] };
+ key <I23> { [ Help ] };
+ key <I25> { [ XF86VendorHome ] };
+ key <I26> { [ XF86HomePage ] };
+ key <I32> { [ XF86Shop ] };
+};
+
+// Compaq Internet (13 keys)
+partial alphanumeric_keys
+xkb_symbols "compaqik13" {
+ include "inet(media_acpi_common)"
+ key <I1E> { [ XF86Mail ] };
+ key <I1F> { [ XF86Go ] };
+ key <I21> { [ XF86Search ] };
+ key <I23> { [ XF86WWW ] };
+ key <I32> { [ XF86Shop ] };
+};
+
+// Compaq Internet (18 keys)
+partial alphanumeric_keys
+xkb_symbols "compaqik18" {
+ include "inet(media_acpi_common)"
+ key <I12> { [ XF86LightBulb ] };
+ key <I18> { [ XF86Eject ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I1F> { [ XF86Go ] };
+ key <I21> { [ XF86Search ] };
+ key <I23> { [ XF86WWW ] };
+ key <I25> { [ XF86VendorHome ] };
+ key <I26> { [ XF86Community ] };
+ key <I32> { [ XF86Shop ] };
+ key <I68> { [ Print ] };
+};
+
+// laptop/notebook Compaq (eg. Armada, Evo) laptop Keyboard
+partial alphanumeric_keys
+xkb_symbols "armada" {
+ include "inet(media_acpi_common)"
+ key <I1A> { [ XF86Search ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I1F> { [ XF86HomePage ] };
+ key <I23> { [ XF86WWW ] };
+ key <I59> { [ XF86Launch2 ] }; // Battery Monitor
+ key <I6F> { [ XF86AudioMedia ] };
+ key <I75> { [ XF86Launch0 ] }; // Info Center
+};
+
+// Compaq Presario laptop
+partial alphanumeric_keys
+xkb_symbols "presario" {
+ include "inet(media_acpi_common)"
+ key <I14> { [ XF86Q ] };
+ key <I18> { [ XF86Launch2 ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I1F> { [ XF86Launch1 ] };
+ key <I23> { [ XF86WWW ] };
+ key <I32> { [ XF86Shop ] };
+ key <I75> { [ XF86AudioMedia ] };
+};
+
+// Compaq iPaq
+partial alphanumeric_keys
+xkb_symbols "ipaq" {
+ key <FK16> { [ XF86Shop ] };
+ key <I02> { [ XF86Standby ] };
+ key <I65> { [ XF86Search ] };
+ key <I66> { [ XF86Travel ] };
+ key <I69> { [ XF86BackForward ] };
+ key <I6A> { [ XF86Q ] };
+ key <I6C> { [ XF86Mail ] };
+};
+
+
+// Dell
+
+partial alphanumeric_keys
+xkb_symbols "dell" {
+ include "inet(acpi_common)"
+ key <I12> { [ XF86Mail ] };
+ key <I1E> { [ XF86Search ] };
+ key <I26> { [ XF86HomePage ] };
+};
+
+// Dell Precision M65 laptop
+partial alphanumeric_keys
+xkb_symbols "dellm65" {
+ include "inet(media_common)"
+ key <I04> { [ XF86PowerOff ] };
+ key <LWIN> { [ Super_L ] };
+};
+
+// laptop/notebook Dell Inspiron 8xxx
+partial alphanumeric_keys
+xkb_symbols "inspiron" {
+ include "inet(media_common)"
+ key <I02> { [ XF86AudioStop ] };
+ key <I04> { [ XF86AudioNext ] };
+ key <I21> { [ XF86Eject ] };
+ key <I56> { [ XF86Display ] };
+ key <IR7D> { [ XF86AudioPrev ] };
+ key <IR7C> { [ XF86AudioPlay, XF86AudioPause ] };
+};
+
+// DELL USB Multimedia (former 8135, generalized, superset of 8125)
+partial alphanumeric_keys
+xkb_symbols "dellusbmm" {
+ // Describes the extra keys on a SK-8135 Multimedia keyboard
+ // From Olivier Lahaye <olivier dot lahaye at motorola dot com>
+ include "inet(media_nav_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <K67> { [ XF86MyComputer ] };
+ key <IR7C> { [ XF86AudioMedia ] };
+};
+
+
+// Diamond
+
+// Diamond 9801/9802
+partial alphanumeric_keys
+xkb_symbols "diamond" {
+ include "inet(media_nav_acpi_common)"
+ key <I6D> { [ XF86Go ] };
+};
+
+
+// Ennyah
+
+// Ennyah DKB-1008
+partial alphanumeric_keys
+xkb_symbols "ennyah_dkb1008" {
+ include "inet(media_nav_acpi_common)"
+ key <IR7C> { [ XF86AudioMedia ] };
+};
+
+
+// Genius
+
+// Genius Comfy KB-16M/Multimedia KWD-910
+partial alphanumeric_keys
+xkb_symbols "genius" {
+ include "inet(media_acpi_common)"
+ key <I12> { [ XF86AudioRaiseVolume ] };
+ key <I17> { [ XF86Calculator ] };
+ key <I19> { [ XF86AudioLowerVolume ] };
+ key <I1E> { [ XF86Forward ] };
+ key <I21> { [ XF86AudioNext ] };
+ key <I23> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86Back ] };
+ key <I26> { [ XF86ScreenSaver ] };
+ key <I2E> { [ XF86Mail ] };
+ key <I30> { [ XF86Eject ] };
+ key <I32> { [ XF86WWW ] };
+};
+
+// Genius Comfy 21e
+partial alphanumeric_keys
+xkb_symbols "geniuscomfy2" {
+ // Describes the extra keys on a Genius Comfy KB-21e-Scroll
+ // From Radics Laszlo <garaboncias@mailbox.hu>
+ include "inet(media_nav_acpi_common)"
+ key <I23> { [ Return ] };
+};
+
+
+// Gyration
+
+partial alphanumeric_keys
+xkb_symbols "gyration" {
+ include "inet(nav_common)"
+ key <FK16> { [ XF86Reload ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+};
+
+
+// Hewlett-Packard
+
+// Hewlett-Packard Internet
+partial alphanumeric_keys
+xkb_symbols "hpi6" {
+ include "inet(media_nav_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I12> { [ XF86Search ] };
+ key <I14> { [ XF86VendorHome ] };
+ key <I15> { [ XF86Community ] };
+ key <I16> { [ XF86AudioMedia ] };
+ key <I18> { [ XF86Eject ] };
+ key <I1E> { [ XF86Shop ] };
+ key <I1F> { [ XF86Launch1 ] };
+ key <I26> { [ Help ] };
+ key <I27> { [ XF86Finance ] };
+ key <I39> { [ Print ] };
+ key <I75> { [ Help ] };
+};
+
+// Hewlett-Packard SK-2501, SK-2505 Multimedia
+partial alphanumeric_keys
+xkb_symbols "hp250x" {
+ key <I12> { [ XF86Tools ] };
+ key <I17> { [ XF86Search ] };
+ key <I18> { [ XF86Eject ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I21> { [ XF86Launch5 ] };
+ key <I22> { [ XF86Launch3 ] };
+ key <I23> { [ XF86Launch2 ] };
+ key <I24> { [ XF86Launch4 ] };
+ key <I25> { [ XF86Standby ] };
+ key <I26> { [ Help ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I32> { [ XF86WWW ] };
+};
+
+// Hewlett-Packard Omnibook XE3 GC, GD, GE and Pavilion N5xxx
+partial alphanumeric_keys
+xkb_symbols "hpxe3gc" {
+ // Describes the OneTouch buttons on HP Omnibook XE3 GC and
+ // HP Pavilion N52XX models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_common)"
+ key <I71> { [ Help ] };
+ key <I72> { [ XF86Launch1 ] };
+ key <I73> { [ XF86WWW ] };
+ key <I74> { [ XF86Mail ] };
+};
+
+// Hewlett-Packard Omnibook XE3 GF
+partial alphanumeric_keys
+xkb_symbols "hpxe3gf" {
+ // Describes the OneTouch buttons on HP Omnibook XE3 GF models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_nav_common)"
+ key <I73> { [ Help ] };
+ key <I74> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Omnibook XT1000
+partial alphanumeric_keys
+xkb_symbols "hpxt1000" {
+ // Describes the OneTouch buttons on HP Omnibook XT1000 models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_nav_common)"
+ key <I71> { [ XF86Launch3 ] };
+ key <I72> { [ Help ] };
+ key <I73> { [ XF86Launch2 ] };
+ key <I74> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Pavilion ZT1100
+partial alphanumeric_keys
+xkb_symbols "hpzt11xx" {
+ // Describes the OneTouch buttons on HP Pavilion ZT11xx models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_nav_common)"
+ key <I71> { [ XF86Launch3 ] };
+ key <I72> { [ Help ] };
+ key <I73> { [ XF86Launch2 ] };
+ key <I74> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Pavilion dv5
+partial alphanumeric_keys
+xkb_symbols "hpdv5" {
+ // Describes the OneTouch buttons on HP Pavilion dv5 models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_common)"
+ key <I12> { [ XF86ScreenSaver ] };
+ key <I32> { [ XF86WWW ] };
+ key <I75> { [ Help ] };
+ key <K6D> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Omnibook XE4xxx and ZE4xxx
+partial alphanumeric_keys
+xkb_symbols "hpxe4xxx" {
+ // Describes the OneTouch buttons on HP Omnibook XE4xxx and ZE4xxx
+ // models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_nav_common)"
+ key <I70> { [ Help ] };
+ key <I71> { [ XF86Launch2 ] };
+ key <I73> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Omnibook 500 FA
+partial alphanumeric_keys
+xkb_symbols "hp500fa" {
+ // Describes the OneTouch buttons on HP Omnibook 500 FA models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ key <I73> { [ Help ] };
+ key <I74> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Omnibook 500
+partial alphanumeric_keys
+xkb_symbols "hp5xx" {
+ // Describes the OneTouch buttons on HP Omnibook 5xx models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_common)"
+ key <I73> { [ Help ] };
+ key <I74> { [ XF86Launch1 ] };
+};
+
+
+// Honeywell
+
+// Honeywell Euroboard
+partial alphanumeric_keys
+xkb_symbols "honeywell_euroboard" {
+ // January 2002
+ // Scott Penrose <scottp@dd.com.au>
+ // http://linux.dd.com.au/quest/linux/keyboard/honeywell/
+ key <I10> { [ XF86Game ] };
+ key <I12> { [ XF86AudioPrev ] };
+ key <I17> { [ XF86Eject ] };
+ key <I18> { [ XF86Launch2 ] };
+ key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I1E> { [ XF86Launch1 ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I23> { [ XF86AudioStop ] };
+ key <I24> { [ XF86Mail ] };
+ key <I25> { [ XF86ScreenSaver ] };
+ key <I26> { [ XF86Calculator ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I32> { [ XF86WWW ] };
+};
+
+
+// IBM
+
+// IBM Rapid Access
+partial alphanumeric_keys
+xkb_symbols "rapidaccess" {
+ key <I12> { [ XF86AudioMute ] };
+ key <I17> { [ XF86Launch2 ] };
+ key <I1E> { [ XF86AudioLowerVolume ] };
+ key <I20> { [ XF86AudioRaiseVolume ] };
+ key <I21> { [ XF86AudioNext ] };
+ key <I22> { [ XF86AudioPause ] };
+ key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I23> { [ XF86AudioPrev ] };
+ key <I24> { [ XF86AudioStop ] };
+ key <I25> { [ XF86Standby ] };
+ key <I26> { [ Help ] };
+ key <I2E> { [ XF86Launch4 ] };
+ key <I30> { [ XF86Launch3 ] };
+ key <I32> { [ XF86Launch1 ] };
+};
+
+// IBM Rapid Access II
+partial alphanumeric_keys
+xkb_symbols "rapidaccess2" {
+ include "inet(acpi_common)"
+ key <I12> { [ XF86AudioNext ] };
+ key <I17> { [ XF86Favorites ] };
+ key <I1E> { [ XF86AudioMute ] };
+ key <I20> { [ XF86AudioStop ] };
+ key <I21> { [ XF86AudioLowerVolume ] };
+ key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I23> { [ XF86AudioRaiseVolume ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86HomePage ] };
+ key <I26> { [ XF86Shop ] };
+ key <I2E> { [ XF86Search ] };
+ key <I30> { [ XF86MyComputer ] };
+ key <I32> { [ XF86VendorHome ] };
+};
+
+// IBM ThinkPad 60 series
+partial alphanumeric_keys
+xkb_symbols "thinkpad60" {
+ include "inet(media_nav_common)"
+ key <I1F> { [ XF86VendorHome ] };
+};
+
+// IBM Space Saver
+partial alphanumeric_keys
+xkb_symbols "ibm_spacesaver" {
+ key <NMLK> {
+ type="ONE_LEVEL",
+ symbols[Group1]= [ Num_Lock ]
+ };
+};
+
+
+// Logitech
+
+// Logitech common definitions
+hidden partial alphanumeric_keys
+xkb_symbols "logitech_base" {
+ include "inet(media_nav_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I15> { [ XF86Community ] };
+ key <I16> { [ XF86ScrollClick ] };
+ key <I21> { [ XF86VendorHome ] };
+ key <I3B> { [ XF86New ] };
+ key <I3C> { [ XF86Reply ] };
+ key <I43> { [ XF86MyComputer ] };
+ key <I44> { [ XF86Documents ] };
+ key <I57> { [ XF86Pictures ] };
+ key <I58> { [ XF86Music ] };
+};
+
+// Logitech second set of common keys
+hidden partial alphanumeric_keys
+xkb_symbols "logitech_set3" {
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I44> { [ XF86New ] }; // F1
+ key <I45> { [ XF86Reply ] }; // F2
+ key <I4A> { [ XF86Send ] }; // F4
+ key <I54> { [ Print ] }; // F7
+ key <I55> { [ XF86Save ] }; // F8
+ key <I56> { [ XF86Documents ] }; // F10
+ key <I69> { [ XF86Go ] };
+ key <IR7C> { [ XF86AudioMedia ] };
+};
+
+// Logitech Access
+partial alphanumeric_keys
+xkb_symbols "logiaccess" {
+ include "inet(logitech_base)"
+ key <FK13> { [ XF86MailForward ] };
+ key <FK14> { [ XF86Send ] };
+ key <I11> { [ XF86Messenger ] };
+ key <I12> { [ XF86WebCam ] };
+};
+
+// Logitech Cordless Desktop (alt.)
+partial alphanumeric_keys
+xkb_symbols "logicda" {
+ include "inet(logitech_base)"
+ include "inet(logitech_set3)"
+};
+
+// Logitech Internet Navigator
+partial alphanumeric_keys
+xkb_symbols "logicink" {
+ include "inet(logitech_base)"
+ key <I11> { [ XF86Shop ] };
+ key <I12> { [ XF86VendorHome ] };
+ key <I13> { [ XF86Finance ] };
+ key <I14> { [ XF86Start ] };
+};
+
+// Logitech Cordless Desktop EX110
+partial alphanumeric_keys
+xkb_symbols "logiex110" {
+ include "inet(logitech_base)"
+ key <I2F> { [ XF86Close ] }; // Close
+// Extended function keys
+// In the Console before starting X
+// Using setkeycodes e03b 212 e03c 213 e03d 214 e03e 215 e03f 216 e040 217
+// setkeycodes e041 218 e042 219 e043 220 e044 221 e057 222 e058 223 6d 206
+// *=keys that are there but need different symbol names.
+ key <I3B> { [ Help ] }; // F1
+ key <FK13> { [ XF86Word ] }; // F2
+ key <FK14> { [ XF86Excel ] }; // F3
+ key <FK15> { [ XF86Pictures ] }; // F4
+ key <FK16> { [ Undo ] }; // F5
+ key <I65> { [ Redo ] }; // F6 *
+ key <I42> { [ Print ] }; // F7
+ key <I43> { [ XF86Save ] }; // F8
+ key <I44> { [ XF86Launch1 ] }; // F9 *
+ key <I45> { [ XF86Launch2 ] }; // F10
+ key <I14> { [ XF86Launch3 ] }; // F11
+ key <I4A> { [ XF86Launch4 ] }; // F12
+};
+
+// Logitech iTouch Internet Navigator SE
+partial alphanumeric_keys
+xkb_symbols "logiinkse" {
+ include "inet(logitech_base)"
+ key <FK13> { [ XF86MailForward ] }; // F3
+ key <FK14> { [ XF86Send ] }; // F4
+ key <FK15> { [ Undo ] }; // F5
+ key <FK16> { [ Redo ] }; // F6
+ key <FK17> { [ Print ] }; // F7
+ key <I11> { [ XF86Messenger ] };
+ key <I12> { [ XF86WebCam ] };
+ key <I13> { [ XF86VendorHome ] };
+ key <I14> { [ XF86Shop ] };
+ key <I42> { [ XF86Save ] }; // F8
+};
+
+// Logitech iTouch Internet Navigator SE USB
+partial alphanumeric_keys
+xkb_symbols "logiinkseusb" {
+ include "inet(logitech_base)"
+ include "inet(logitech_set3)"
+};
+
+// Logitech iTouch Cordless Y-RB6
+partial alphanumeric_keys
+xkb_symbols "logiitc" {
+ include "inet(logitech_base)"
+ key <I2F> { [ XF86AudioRaiseVolume ] };
+
+ // Just to override RaiseVolume from logitech_base,
+ // since no keysym can have two keycodes, see
+ // https://bugs.freedesktop.org/show_bug.cgi?id=7095
+ key <I30> { [ XF86Launch1 ] };
+};
+
+// Logitech Internet
+partial alphanumeric_keys
+xkb_symbols "logiik" {
+ include "inet(logitech_base)"
+ key <I12> { [ Find ] };
+ key <I17> { [ Print ] };
+ key <I18> { [ XF86Favorites ] };
+ key <I19> { [ XF86Reload ] };
+ key <I1E> { [ XF86Search ] };
+ key <I20> { [ XF86HotLinks ] };
+ key <I22> { [ XF86Forward ] };
+ key <I23> { [ XF86HomePage ] };
+ key <I24> { [ XF86Stop ] };
+ key <I25> { [ XF86OpenURL ] };
+ key <I26> { [ XF86AddFavorite ] };
+ key <I32> { [ XF86History ] };
+ key <I7A> { [ XF86WWW ] };
+};
+
+// Logitech iTouch
+partial alphanumeric_keys
+xkb_symbols "itouch" {
+ include "inet(logitech_base)"
+ key <I1F> { [ XF86AudioMute ] };
+ key <I2B> { [ XF86AudioLowerVolume ] };
+ key <I2D> { [ XF86AudioRaiseVolume ] };
+};
+
+// Logitech UltraX Cordless Media Desktop
+partial alphanumeric_keys
+xkb_symbols "logiultraxc" {
+ key <FK16> { [ XF86AudioMute ] };
+ key <FK17> { [ XF86AudioLowerVolume ] };
+ key <I2B> { [ XF86AudioNext ] };
+ key <I2D> { [ XF86AudioPrev ] };
+ key <I2C> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <KPDC> { [ XF86AudioRaiseVolume ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "logidinovo" {
+ include "inet(media_nav_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I12> { [ XF86Standby ] };
+ key <I17> { [ XF86Search ] };
+ key <I21> { [ XF86AudioRaiseVolume ] };
+ key <K66> { [ XF86AudioLowerVolume ] };
+ key <KPDC> { [ XF86AudioMute ] };
+ key <IR7C> { [ XF86AudioMedia ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "logidinovoedge" {
+ include "inet(media_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I6C> { [ XF86Mail ] };
+ key <FK17> { [ XF86Search ] };
+ key <IR7C> { [ XF86AudioMedia ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "logitech_g15" {
+ include "inet(media_nav_acpi_common)"
+ key <AE13> { [ XF86Messenger ] };
+ key <HKTG> { [ XF86Launch7 ] };
+ key <I02> { [ XF86Launch9 ] };
+ key <I04> { [ XF86Phone ] };
+ key <I08> { [ XF86LaunchD ] };
+ key <I09> { [ XF86Support ] };
+ key <I0F> { [ XF86LaunchF ] };
+ key <I16> { [ XF86LogOff ] };
+ key <I18> { [ XF86Launch5 ] };
+ key <I21> { [ XF86Travel ] };
+ key <I23> { [ XF86Spell ] };
+ key <I31> { [ XF86Launch4 ] };
+ key <I3C> { [ XF86Music ] };
+ key <I42> { [ XF86Forward ] };
+ key <I43> { [ XF86Send ] };
+ key <I57> { [ XF86Save ] };
+ key <I64> { [ XF86Pictures ] };
+ key <I67> { [ XF86LaunchA ] };
+ key <I76> { [ XF86iTouch ] };
+ key <I77> { [ XF86Launch3 ] };
+ key <I79> { [ XF86ToDoList ] };
+ key <I7B> { [ XF86Calculator ] };
+ key <K5A> { [ XF86VendorHome ] };
+ key <K5D> { [ XF86Away ] };
+ key <K5E> { [ XF86WebCam ] };
+ key <K5F> { [ XF86Launch0 ] };
+ key <K63> { [ XF86Launch6 ] };
+ key <K6D> { [ XF86Calendar ] };
+ key <K71> { [ XF86LaunchB ] };
+ key <K72> { [ XF86LaunchC ] };
+ key <K74> { [ XF86WWW ] };
+ key <K75> { [ XF86LaunchE ] };
+ key <II5D> { [ XF86Launch1 ] };
+ key <IR7D> { [ XF86Launch2 ] };
+ key <IR7C> { [ XF86Launch8 ] };
+};
+
+
+// Memorex
+
+// Memorex MX1998
+partial alphanumeric_keys
+xkb_symbols "mx1998" {
+ include "inet(media_acpi_common)"
+ key <DOWN> { [ XF86ScrollDown ] };
+ key <I12> { [ XF86AudioRewind ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Xfer ] };
+ key <I1E> { [ XF86AudioRecord ] };
+ key <I21> { [ XF86Documents ] };
+ key <I23> { [ XF86Game ] };
+ key <I25> { [ XF86Calculator ] };
+ key <I26> { [ Menu ] };
+ key <I32> { [ XF86WWW ] };
+ key <I57> { [ XF86WakeUp ] };
+ key <I68> { [ XF86DOS ] };
+ key <I7A> { [ XF86ScreenSaver ] };
+ key <UP> { [ XF86ScrollUp ] };
+};
+
+// Memorex MX2500 EZ-Access
+partial alphanumeric_keys
+xkb_symbols "mx2500" {
+ include "inet(media_nav_acpi_common)"
+ key <I12> { [ XF86Clear ] };
+ key <I13> { [ XF86Phone ] };
+ key <I14> { [ XF86DOS ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Xfer ] };
+ key <I1E> { [ XF86Eject ] };
+ key <I1F> { [ XF86Documents ] };
+ key <I26> { [ XF86News ] };
+ key <I6B> { [ XF86WakeUp ] };
+ key <I6D> { [ XF86RotateWindows ] };
+};
+
+// Memorex MX2750
+partial alphanumeric_keys
+xkb_symbols "mx2750" {
+ include "inet(media_nav_acpi_common)"
+ key <I32> { [ XF86Launch0 ] };
+};
+
+
+// Microsoft
+
+// Microsoft Natural Ergonomic 4000
+partial alphanumeric_keys
+xkb_symbols "microsoft4000" {
+ include "inet(media_nav_common)"
+ key <I192> { [ XF86Launch1 ] };
+ key <I193> { [ XF86Launch2 ] };
+ key <I194> { [ XF86Launch3 ] };
+ key <I195> { [ XF86Launch4 ] };
+ key <I196> { [ XF86Launch5 ] };
+// Missing because of lack of support from kbd driver: Zoom in and
+// slider.
+};
+
+// Microsoft Natural Wireless Ergonomic 7000
+partial alphanumeric_keys
+xkb_symbols "microsoft7000" {
+ include "inet(media_nav_common)"
+ key <I07> { [ Undo ] };
+ key <I09> { [ XF86New ] };
+ key <I0A> { [ Redo ] };
+ key <I0E> { [ XF86MailForward ] };
+ key <I2F> { [ XF86Close ] };
+ key <I39> { [ Print ] };
+ key <I55> { [ XF86Save ] };
+ key <I5A> { [ XF86Send ] };
+ key <I62> { [ Help ] };
+ key <I64> { [ XF86Reply ] };
+ key <I76> { [ parenleft ] };
+ key <I7B> { [ parenright ] };
+ key <K59> { [ KP_Equal ] };
+ key <K64> { [ XF86Open ] };
+// Missing because of lack of support from kbd driver: Spell, Launch,
+// and Zoom in and out buttons.
+};
+
+// Microsoft Internet
+partial alphanumeric_keys
+xkb_symbols "microsoftinet" {
+ include "inet(nav_acpi_common)"
+ key <I68> { [ XF86AudioStop ] };
+};
+
+// Microsoft Natural Pro USB
+partial alphanumeric_keys
+xkb_symbols "microsoftprousb" {
+ include "inet(nav_common)"
+ key <FK16> { [ XF86Reload ] };
+ key <I01> { [ XF86AudioMedia ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I63> { [ XF86Standby ] };
+// Internet Section -- Left Side
+// Multimedia Section -- Right Side
+// My Computer Section -- Far Right
+// My computer maps to printscreen, so leaving commented out for now
+// key <PRSC> { [ XF86MyComputer ] };
+};
+
+// Microsoft Natural Pro OEM
+partial alphanumeric_keys
+xkb_symbols "microsoftprooem" {
+ include "inet(media_nav_common)"
+ key <FK17> { [ XF86Search ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I63> { [ XF86Standby ] };
+ key <K67> { [ XF86MyComputer ] };
+// Internet Section -- Left Side
+// Multimedia Section -- Right Side
+// My Computer Section -- Far Right
+};
+
+// Microsoft Internet Pro (Swedish)
+partial alphanumeric_keys
+xkb_symbols "microsoftprose" {
+ include "inet(nav_common)"
+ key <FK16> { [ XF86Reload ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I63> { [ XF86Standby ] };
+ key <I68> { [ XF86AudioStop ] };
+ key <PRSC> { [ XF86MyComputer ] };
+ key <IR7C> { [ XF86AudioMedia ] };
+};
+
+// Microsoft Office Keyboard
+partial alphanumeric_keys
+xkb_symbols "microsoftoffice" {
+ include "inet(nav_acpi_common)"
+ key <BRK> { [ XF86Calendar ] };
+ key <END> { [ Undo ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I1E> { [ XF86AudioLowerVolume ] };
+ key <I25> { [ XF86AudioRaiseVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I3C> { [ XF86Cut ] };
+ key <I4A> { [ XF86LogOff ] };
+ key <I54> { [ XF86ApplicationLeft ] };
+ key <I55> { [ XF86TaskPane ] };
+ key <I56> { [ XF86Spell ] };
+ key <I57> { [ XF86WWW ] };
+ key <I58> { [ XF86New ] };
+ key <I59> { [ XF86Open ] };
+ key <I5A> { [ XF86Close ] };
+ key <I62> { [ Help ] };
+ key <I64> { [ XF86Save ] };
+ key <I67> { [ Print ] };
+ key <I6D> { [ XF86OfficeHome ] };
+ key <I70> { [ Redo ] };
+ key <I71> { [ XF86Reply ] };
+ key <I72> { [ XF86MailForward ] };
+ key <I73> { [ XF86Send ] };
+ key <I78> { [ XF86Copy ] };
+ key <MOAR> { [ XF86ApplicationRight ] };
+ key <RCTL> { [ XF86Paste ] };
+};
+
+// Microsoft Wireless Multimedia 1.0A
+partial alphanumeric_keys
+xkb_symbols "microsoftmult" {
+ include "inet(media_nav_acpi_common)"
+ key <AE13> { [ XF86Messenger ] };
+ key <FK14> { [ XF86New ] };
+ key <FK15> { [ XF86Open ] };
+ key <FK16> { [ XF86Close ] };
+ key <FK17> { [ XF86Reply ] };
+ key <I07> { [ Redo ] };
+ key <I08> { [ Undo ] };
+ key <I16> { [ XF86LogOff ] };
+ key <I23> { [ XF86Spell ] };
+ key <I3B> { [ Help ] };
+ key <I3C> { [ XF86Music ] };
+ key <I42> { [ XF86Forward ] };
+ key <I43> { [ XF86Send ] };
+ key <I57> { [ XF86Save ] };
+ key <I58> { [ Print ] };
+ key <I64> { [ XF86Pictures ] };
+ key <I80> { [ XF86Documents ] };
+};
+
+
+// Oretec
+
+// Oretec MCK-800 MM/Internet keyboard
+partial alphanumeric_keys
+xkb_symbols "oretec" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86ScrollUp ] };
+ key <I12> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I17> { [ XF86AudioPrev ] };
+ key <I18> { [ XF86ScrollDown ] };
+ key <I19> { [ XF86ZoomOut ] };
+ key <I1E> { [ XF86AudioMute ] };
+ key <I21> { [ XF86WWW ] };
+ key <I22> { [ Menu ] };
+ key <I23> { [ XF86AudioStop ] };
+ key <I24> { [ XF86Calculator ] };
+ key <I25> { [ XF86Xfer ] };
+ key <I26> { [ XF86Mail ] };
+ key <I2E> { [ XF86AudioNext ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I32> { [ XF86ZoomIn ] };
+ key <I68> { [ XF86AudioLowerVolume ] };
+};
+
+
+// Propeller
+
+// Propeller Voyager KTEZ-1000
+partial alphanumeric_keys
+xkb_symbols "propeller" {
+ include "inet(media_common)"
+ key <I12> { [ XF86AudioRewind ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Xfer ] };
+ key <I1E> { [ XF86AudioRecord ] };
+ key <I21> { [ XF86Documents ] };
+ key <I23> { [ XF86Game ] };
+ key <I25> { [ XF86Calculator ] };
+ key <I26> { [ Menu ] };
+ key <I32> { [ XF86WWW ] };
+ key <I68> { [ XF86DOS ] };
+ key <I7A> { [ XF86Standby ] };
+};
+
+
+// QTronix
+
+// QTronix Scorpius 98N+
+partial alphanumeric_keys
+xkb_symbols "qtronix" {
+ key <I10> { [ XF86ScrollDown ] };
+ key <I12> { [ XF86Forward ] };
+ key <I13> { [ XF86WakeUp ] };
+ key <I17> { [ XF86Search ] };
+ key <I18> { [ XF86Standby ] };
+ key <I19> { [ XF86ScrollUp ] };
+ key <I1E> { [ XF86Back ] };
+ key <I1F> { [ XF86Reload ] };
+ key <I20> { [ XF86AudioRaiseVolume ] };
+ key <I21> { [ XF86AudioPrev ] };
+ key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I23> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioStop ] };
+ key <I25> { [ XF86HomePage ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRecord ] };
+ key <I31> { [ XF86PowerOff ] };
+ key <I32> { [ XF86Stop ] };
+ key <I68> { [ XF86Calculator ] };
+};
+
+
+// Samsung
+
+// Samsung SDM 4500P
+partial alphanumeric_keys
+xkb_symbols "samsung4500" {
+ include "inet(media_nav_acpi_common)"
+ key <AE13> { [ XF86Launch4 ] };
+ key <I02> { [ XF86Launch1 ] };
+ key <I04> { [ XF86Launch3 ] };
+ key <I06> { [ XF86Launch5 ] };
+ key <I09> { [ XF86Close ] };
+ key <I0A> { [ XF86Book ] };
+ key <I18> { [ XF86Eject ] };
+ key <I26> { [ Help ] };
+ key <I59> { [ XF86Explorer ] };
+ key <IR7D> { [ XF86Launch2 ] };
+};
+
+// Samsung SDM 4510P
+partial alphanumeric_keys
+xkb_symbols "samsung4510" {
+ include "inet(media_acpi_common)"
+ key <I02> { [ XF86Launch1 ] };
+ key <I04> { [ XF86Launch3 ] };
+ key <I18> { [ XF86Eject ] };
+ key <IR7D> { [ XF86Launch2 ] };
+};
+
+
+// SK
+
+// NEC SK-1300
+partial alphanumeric_keys
+xkb_symbols "sk1300" {
+ include "inet(media_common)"
+ key <I12> { [ XF86Eject ] };
+ key <I1E> { [ XF86Forward ] };
+ key <I20> { [ XF86WWW ] };
+ key <I25> { [ XF86Standby ] };
+ key <I26> { [ XF86Back ] };
+ key <I32> { [ XF86Stop ] };
+};
+
+// NEC SK-2500
+partial alphanumeric_keys
+xkb_symbols "sk2500" {
+ include "inet(media_nav_common)"
+ key <I12> { [ XF86AudioRewind ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Eject ] };
+ key <I18> { [ XF86Eject ] };
+ key <I19> { [ XF86Forward ] };
+ key <I1E> { [ XF86AudioRecord ] };
+ key <I23> { [ XF86Xfer ] };
+ key <I25> { [ XF86PowerOff ] };
+ key <I26> { [ Menu ] };
+ key <I7A> { [ XF86ScreenSaver ] };
+};
+
+// NEC SK-6200
+partial alphanumeric_keys
+xkb_symbols "sk6200" {
+ include "inet(acpi_common)"
+ key <I12> { [ XF86Favorites ] };
+ key <I14> { [ XF86AudioLowerVolume ] };
+ key <I16> { [ XF86AudioRaiseVolume ] };
+ key <I17> { [ XF86Back ] };
+ key <I19> { [ XF86Forward ] };
+ key <I1E> { [ XF86WWW ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I21> { [ XF86AudioNext ] };
+ key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I23> { [ XF86AudioPrev ] };
+ key <I24> { [ XF86AudioStop ] };
+ key <I32> { [ XF86Mail ] };
+};
+
+// NEC SK-7100
+partial alphanumeric_keys
+xkb_symbols "sk7100" {
+ include "inet(media_common)"
+ key <I12> { [ XF86AudioPause ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Video ] };
+ key <I1E> { [ XF86Eject ] };
+ key <I25> { [ XF86CD ] };
+ key <I26> { [ XF86Display ] };
+ key <I32> { [ XF86WWW ] };
+};
+
+
+// Sven
+
+// SVEN Ergonomic 2500
+partial alphanumeric_keys
+xkb_symbols "sven" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I12> { [ XF86Forward ] };
+ key <I17> { [ XF86AudioRaiseVolume ] };
+ key <I18> { [ XF86ZoomOut ] };
+ key <I19> { [ XF86AudioPrev ] };
+ key <I1A> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86HomePage ] };
+ key <I20> { [ XF86Mail ] };
+ key <I21> { [ XF86ZoomIn ] };
+ key <I22> { [ XF86MyComputer ] };
+ key <I23> { [ XF86Stop ] };
+ key <I24> { [ XF86ScreenSaver ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I28> { [ XF86Calculator ] };
+ key <I29> { [ XF86Reload ] };
+ key <I2E> { [ XF86Search ] };
+ key <I30> { [ XF86Favorites ] };
+ key <I31> { [ XF86ScrollUp ] };
+ key <I32> { [ XF86ScrollDown ] };
+ key <I62> { [ XF86AudioNext ] };
+ key <I68> { [ XF86Back ] };
+};
+
+// SVEN Slim 303
+partial alphanumeric_keys
+xkb_symbols "sven303" {
+ key <I11> { [ XF86PowerOff ] };
+ key <I12> { [ XF86Sleep ] };
+ key <I16> { [ XF86WakeUp ] };
+};
+
+
+// Symplon
+
+// Symplon PaceBook tablet
+partial alphanumeric_keys
+xkb_symbols "symplon" {
+ include "inet(nav_acpi_common)"
+ key <HOME> { [ XF86RotationPB ] };
+ key <I13> { [ XF86SplitScreen ] };
+ key <I14> { [ XF86Support ] };
+ key <I17> { [ XF86New ] };
+ key <I21> { [ XF86User2KB ] };
+ key <I25> { [ XF86RotationKB ] };
+ key <I26> { [ XF86MenuKB ] };
+ key <I6B> { [ XF86User1KB ] };
+ key <PAUS> { [ XF86UserPB ] };
+ key <UP> { [ XF86MenuPB ] };
+};
+
+
+// Toshiba
+
+// Toshiba Satellite S3000
+partial alphanumeric_keys
+xkb_symbols "toshiba_s3000" {
+ include "inet(media_common)"
+ // Describes the Special buttons on Toshiba Satellite 3000 models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ key <I06> { [ XF86Launch1 ] };
+ key <I13> { [ XF86Launch2 ] };
+ key <I71> { [ XF86WWW ] };
+ key <I73> { [ XF86Mail ] };
+ key <I75> { [ XF86AudioRaiseVolume ] };
+ key <I76> { [ XF86AudioLowerVolume ] };
+};
+
+
+// Trust
+
+// Trust Wireless Classic
+partial alphanumeric_keys
+xkb_symbols "trust" {
+ include "inet(media_nav_acpi_common)"
+ key <I11> { [ XF86ScreenSaver ] };
+ key <I1E> { [ XF86Eject ] };
+};
+
+// Trust Direct Access
+partial alphanumeric_keys
+xkb_symbols "trustda" {
+ include "inet(media_common)"
+ key <I12> { [ XF86AudioRewind ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Eject ] };
+ key <I1E> { [ XF86AudioRecord ] };
+ key <I23> { [ XF86Xfer ] };
+ key <I25> { [ XF86Standby ] };
+ key <I26> { [ Help ] };
+ key <I32> { [ XF86WWW ] };
+ key <I7A> { [ XF86Away ] };
+};
+
+
+// YaHoo!
+
+// Yahoo! Internet
+partial alphanumeric_keys
+xkb_symbols "yahoo" {
+ include "inet(acpi_common)"
+ key <I11> { [ XF86AudioPrev ] };
+ key <I12> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I1E> { [ XF86AudioStop ] };
+ key <I1F> { [ XF86AudioNext ] };
+ key <I20> { [ XF86AudioRecord ] };
+ key <I21> { [ XF86AudioLowerVolume ] };
+ key <I22> { [ XF86AudioRaiseVolume ] };
+ key <I23> { [ XF86AudioMute ] };
+ key <I24> { [ XF86Close ] };
+ key <I25> { [ XF86Calculator ] };
+ key <I26> { [ Help ] };
+ key <I27> { [ XF86Mail ] };
+ key <I28> { [ XF86WWW ] };
+};
+
+
+// Apple keyboards (macbooks, powerbooks, powermac G5, etc)
+partial alphanumeric_keys
+xkb_symbols "apple" {
+// Really brightness up/down
+ key <II65> { [ XF86BrightnessAdjust ] };
+ key <I54> { [ XF86BrightnessAdjust ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I56> { [ XF86RotateWindows ] };
+// Really keyboard backlight off/up/down
+ key <I57> { [ XF86Launch0 ] };
+ key <I58> { [ XF86Launch1 ] };
+ key <I59> { [ XF86Launch2 ] };
+ key <I5E> { [ XF86PowerOff ] };
+ key <K5D> { [ F13 ] };
+ key <K5E> { [ F14 ] };
+ key <K5F> { [ F15 ] };
+ key <K6C> { [ XF86Eject ] };
+ key <II5D> { [ F16 ] };
+ key <KPEQ> { [ KP_Equal ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "cymotionlinux" {
+ include "inet(media_nav_acpi_common)"
+ key <I07> { [ Undo ] };
+ key <I0A> { [ Redo ] };
+ key <I0F> { [ XF86ScrollDown ] };
+ key <I17> { [ XF86Launch2 ] };
+ key <I1F> { [ XF86Launch1 ] };
+ key <I28> { [ XF86MenuKB ] };
+ key <I2B> { [ XF86Launch3 ] };
+ key <I3C> { [ XF86Cut ] };
+ key <I78> { [ XF86Copy ] };
+ key <K65> { [ XF86Paste ] };
+ key <K75> { [ XF86ScrollUp ] };
+ key <IR7C> { [ XF86AudioMedia ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "silvercrest" {
+ include "inet(media_nav_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I21> { [ XF86Launch2 ] };
+ key <K67> { [ XF86Launch1 ] };
+};
+
+
+// eMachines
+
+partial alphanumeric_keys
+xkb_symbols "emachines" {
+ include "inet(media_nav_acpi_common)"
+ key <I32> { [ XF86iTouch ] };
+ key <KP0> { [ KP_0 ] };
+ key <KP1> { [ KP_1 ] };
+ key <KP2> { [ KP_2 ] };
+ key <KP3> { [ KP_3 ] };
+ key <KP4> { [ KP_4 ] };
+ key <KP5> { [ KP_5 ] };
+ key <KP6> { [ KP_6 ] };
+ key <KP7> { [ KP_7 ] };
+ key <KP8> { [ KP_8 ] };
+ key <KP9> { [ KP_9 ] };
+ key <KPAD> { [ KP_Add ] };
+ key <KPDL> { [ KP_Decimal ] };
+ key <KPDV> { [ KP_Divide ] };
+ key <KPMU> { [ KP_Multiply ] };
+ key <KPSU> { [ KP_Subtract ] };
+};
+
+
+// BenQ
+
+// BenQ X* (X730, X500, X800)
+//
+// To make the FN_LOCK and CONFIG key work on the BenQ X500 , use:
+// setkeycodes e074 130 # KEY_PROPS from /usr/include/linux/input.h
+// setkeycodes e075 171 # KEY_CONFIG from /usr/include/linux/input.h
+partial alphanumeric_keys
+xkb_symbols "benqx" {
+ include "inet(media_nav_acpi_common)"
+ key <I02> { [ XF86ModeLock ] };
+ key <I21> { [ XF86WWW ] };
+ key <I2B> { [ XF86Go ] };
+ key <I31> { [ XF86Calendar ] };
+};
+
+
+// Intel
+
+// Intel Classmate
+partial alphanumeric_keys
+xkb_symbols "classmate" {
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+};
+
+
+// Unitek
+
+partial alphanumeric_keys
+xkb_symbols "unitekkb1925" {
+ include "inet(media_nav_common)"
+ key <I0C> { [ XF86AudioMute ] };
+ key <I11> { [ XF86PowerOff ] };
+ key <I12> { [ XF86Sleep ] };
+ key <I16> { [ XF86WakeUp ] };
+ key <I18> { [ XF86Search ] };
+ key <I1A> { [ XF86Reload ] };
+};
+
+
+// Creative
+
+// Creative Desktop Wireless 7000
+partial alphanumeric_keys
+xkb_symbols "creativedw7000" {
+ include "inet(media_nav_acpi_common)"
+ key <I66> { [ XF86Pictures ] };
+};
+
+
+// Compal
+
+// Compal FL90
+partial alphanumeric_keys
+xkb_symbols "compalfl90" {
+ include "inet(media_nav_acpi_common)"
+ key <I54> { [ XF86MonBrightnessUp ] };
+ key <II65> { [ XF86MonBrightnessDown ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "pc105" {
+ include "inet(media_nav_acpi_common)"
+};
+
+
+// HTC Dream
+partial alphanumeric_keys
+xkb_symbols "htcdream" {
+ key <BKSP> { [ BackSpace ] };
+ key <RTRN> { [ Return ] };
+
+ key <AE01> { [ 1, 1, exclam, exclam ] };
+ key <AE02> { [ 2, 2, at, at ] };
+ key <AE03> { [ 3, 3, numbersign, numbersign ] };
+ key <AE04> { [ 4, 4, dollar, dollar ] };
+ key <AE05> { [ 5, 5, percent, percent ] };
+ key <AE06> { [ 6, 6, dead_circumflex, dead_circumflex ] };
+ key <AE07> { [ 7, 7, ampersand, ampersand ] };
+ key <AE08> { [ 8, 8, asterisk, asterisk ] };
+ key <AE09> { [ 9, 9, parenleft, parenleft ] };
+ key <AE10> { [ 0, 0, parenright, parenright ] };
+
+ key <LFSH> { [ Shift_L ] };
+ key <SPCE> { [ space ] };
+ key <AB09> { [ period, period, slash, slash ] };
+ key <RTSH> { [ Shift_R ] };
+
+ modifier_map Shift { <LFSH>, <RTSH> };
+};
+
+partial alphanumeric_keys
+xkb_symbols "chromebook" {
+ include "level3(ralt_switch)"
+ key <FK01> { [ XF86Back ] };
+ key <FK02> { [ XF86Forward ] };
+ key <FK03> { [ XF86Reload ] };
+ key <FK04> { [ F11 ] };
+// key <FK05> { [ F5, F5, F5, F5 ] }; // Overview key
+ key <FK06> { [ XF86MonBrightnessDown ] };
+ key <FK07> { [ XF86MonBrightnessUp ] };
+ key <FK08> { [ XF86AudioMute ] };
+ key <FK09> { [ XF86AudioLowerVolume ] };
+ key <FK10> { [ XF86AudioRaiseVolume ] };
+ key <BKSP> { [ BackSpace, BackSpace, Delete ] };
+ key <UP> { [ Up, Up, Prior, Up ] };
+ key <DOWN> { [ Down, Down, Next, Down ] };
+ key <LEFT> { [ Left, Left, Home, Left ] };
+ key <RGHT> { [ Right, Right, End, Right ] };
+ key <LWIN> { [ Super_L, Super_L, Caps_Lock, Super_L ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "teck227" {
+ include "inet(media_nav_common)"
+ key <HIRA> { [ Hiragana ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "teck229" {
+ include "inet(teck227)"
+};
diff --git a/test/data/symbols/keypad b/test/data/symbols/keypad
new file mode 100644
index 0000000..8b0e098
--- /dev/null
+++ b/test/data/symbols/keypad
@@ -0,0 +1,624 @@
+default hidden partial keypad_keys
+xkb_symbols "x11" {
+
+ include "keypad(operators)"
+
+ key <KP7> { [ KP_Home, KP_7 ] };
+ key <KP8> { [ KP_Up, KP_8 ] };
+ key <KP9> { [ KP_Prior, KP_9 ] };
+
+ key <KP4> { [ KP_Left, KP_4 ] };
+ key <KP5> { [ KP_Begin, KP_5 ] };
+ key <KP6> { [ KP_Right, KP_6 ] };
+
+ key <KP1> { [ KP_End, KP_1 ] };
+ key <KP2> { [ KP_Down, KP_2 ] };
+ key <KP3> { [ KP_Next, KP_3 ] };
+ key <KPEN> { [ KP_Enter ] };
+ key <KPEQ> { [ KP_Equal ] };
+
+ key <KP0> { [ KP_Insert, KP_0 ] };
+ key <KPDL> { [ KP_Delete, KP_Decimal ] };
+ key <KPPT> { [ KP_Decimal, KP_Decimal ] };
+};
+
+hidden partial keypad_keys
+xkb_symbols "overlay" {
+ include "keypad(overlay1)"
+};
+
+hidden partial keypad_keys
+xkb_symbols "overlay1" {
+
+ key <KP7> { [ KP_Home ], overlay1=<KO7> };
+ key <KP8> { [ KP_Up ], overlay1=<KO8> };
+ key <KP9> { [ KP_Prior ], overlay1=<KO9> };
+
+ key <KP4> { [ KP_Left ], overlay1=<KO4> };
+ key <KP5> { [ KP_Begin ], overlay1=<KO5> };
+ key <KP6> { [ KP_Right ], overlay1=<KO6> };
+
+ key <KP1> { [ KP_End ], overlay1=<KO1> };
+ key <KP2> { [ KP_Down ], overlay1=<KO2> };
+ key <KP3> { [ KP_Next ], overlay1=<KO3> };
+
+ key <KP0> { [ KP_Insert ], overlay1=<KO0> };
+ key <KPDL> { [ KP_Delete ], overlay1=<KODL> };
+
+ key <KO7> { [ KP_7 ] };
+ key <KO8> { [ KP_8 ] };
+ key <KO9> { [ KP_9 ] };
+
+ key <KO4> { [ KP_4 ] };
+ key <KO5> { [ KP_5 ] };
+ key <KO6> { [ KP_6 ] };
+
+ key <KO1> { [ KP_1 ] };
+ key <KO2> { [ KP_2 ] };
+ key <KO3> { [ KP_3 ] };
+
+ key <KO0> { [ KP_0 ] };
+ key <KODL> { [ KP_Decimal ] };
+};
+
+hidden partial keypad_keys
+xkb_symbols "overlay2" {
+
+ key <KP7> { [ KP_Home ], overlay2=<KO7> };
+ key <KP8> { [ KP_Up ], overlay2=<KO8> };
+ key <KP9> { [ KP_Prior ], overlay2=<KO9> };
+
+ key <KP4> { [ KP_Left ], overlay2=<KO4> };
+ key <KP5> { [ KP_Begin ], overlay2=<KO5> };
+ key <KP6> { [ KP_Right ], overlay2=<KO6> };
+
+ key <KP1> { [ KP_End ], overlay2=<KO1> };
+ key <KP2> { [ KP_Down ], overlay2=<KO2> };
+ key <KP3> { [ KP_Next ], overlay2=<KO3> };
+
+ key <KP0> { [ KP_Insert ], overlay2=<KO0> };
+ key <KPDL> { [ KP_Delete ], overlay2=<KODL> };
+
+ key <KO7> { [ KP_7 ] };
+ key <KO8> { [ KP_8 ] };
+ key <KO9> { [ KP_9 ] };
+
+ key <KO4> { [ KP_4 ] };
+ key <KO5> { [ KP_5 ] };
+ key <KO6> { [ KP_6 ] };
+
+ key <KO1> { [ KP_1 ] };
+ key <KO2> { [ KP_2 ] };
+ key <KO3> { [ KP_3 ] };
+
+ key <KO0> { [ KP_0 ] };
+ key <KODL> { [ KP_Decimal ] };
+};
+
+hidden partial keypad_keys
+xkb_symbols "operators" {
+ // Puts some commands to control the X server on
+ // the fifth level of the keypad's operator keys.
+ key <KPDV> {
+ type="CTRL+ALT", // Ungrab cancels server/keyboard/pointer grabs
+ symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86_Ungrab ]
+ };
+ key <KPMU> {
+ type="CTRL+ALT", // ClsGrb kills whichever client has a grab in effect
+ symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86_ClearGrab ]
+ };
+ key <KPSU> {
+ type="CTRL+ALT", // -VMode switches to the previous video mode
+ symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86_Prev_VMode ]
+ };
+ key <KPAD> {
+ type="CTRL+ALT", // +VMode switches to the next video mode
+ symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86_Next_VMode ]
+ };
+};
+
+// Legacy PC keypad definition
+// Copyright © 2006-2007 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+keypad_keys
+xkb_symbols "legacy" {
+
+ include "keypad(core)"
+ include "keypad(legacymath)"
+ include "keypad(legacynumber)"
+ include "kpdl(dot)"
+};
+
+
+// Legacy Wang 725-3771-ae and 725-3771-uk keypad definition
+// Copyright © 2006-2007 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+keypad_keys
+xkb_symbols "legacy_wang" {
+
+ include "keypad(core)"
+ include "keypad(legacymath)"
+ include "keypad(legacynumber_wang)"
+ include "kpdl(dot)"
+};
+
+
+// Complete new keypad definition
+// Copyright © 2006-2007 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+keypad_keys
+xkb_symbols "oss" {
+
+ include "keypad(core)"
+ include "keypad(ossmath)"
+ include "keypad(ossnumber)"
+ include "kpdl(dotoss)"
+};
+
+
+// Latin9 restriction of new keypad definition
+// Copyright © 2006-2007 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+keypad_keys
+xkb_symbols "oss_latin9" {
+
+ include "keypad(core)"
+ include "keypad(ossmath_latin9)"
+ include "keypad(legacynumber)"
+ include "kpdl(dotoss_latin9)"
+};
+
+
+// Wang 725-3771-ae and 725-3771-uk keypad variant of oss keypad
+// Copyright © 2006-2007 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+keypad_keys
+xkb_symbols "oss_wang" {
+
+ include "keypad(core)"
+ include "keypad(ossmath)"
+ include "keypad(ossnumber_wang)"
+ include "kpdl(dotoss)"
+};
+
+
+// Forward-looking keypad definition
+// Won't work with applications that make ASCII assumptions
+// Copyright © 2007 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+keypad_keys
+xkb_symbols "future" {
+
+ include "keypad(core)"
+ include "keypad(futuremath)"
+ include "keypad(ossnumber)"
+ include "kpdl(commaoss)"
+};
+
+
+// Forward-looking keypad definition
+// Won't work with applications that make ASCII assumptions
+// Copyright © 2007 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+keypad_keys
+xkb_symbols "future_wang" {
+
+ include "keypad(core)"
+ include "keypad(futuremath)"
+ include "keypad(ossnumber_wang)"
+ include "kpdl(commaoss)"
+};
+
+
+// Keypad keys nobody changes
+// Copyright © 2006 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+partial keypad_keys
+xkb_symbols "core" {
+
+ modifier_map Mod2 { Num_Lock };
+
+ key <NMLK> { [ Num_Lock ] };
+ key <KPEN> { [ KP_Enter ] };
+ key <KPEQ> { [ KP_Equal ] };
+};
+
+
+// Legacy keypad math area
+// Copyright © 2006 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+//
+// ┏━━━━━┱─────┬─────┬─────┐
+// ┃Num ┃ ₁ │ ₂ │ ₃ │ ₁ <XF86_Ungrab>
+// ┃Lock⇭┃ / │ * │ - │ ₂ <XF86_ClearGrab>
+// ┡━━━━━╃─────┼─────┼─────┤ ₃ <XF86_Prev_VMode>
+// │ ₄ │ ₄ <XF86_Next_VMode>
+// │ │
+// ┤ │ 1 None
+// │ │ 2 Ctrl+Alt
+// │ + │
+// ╆━━━━━┪
+partial keypad_keys
+xkb_symbols "legacymath" {
+
+ key.type[Group1]="CTRL+ALT" ;
+
+ key <KPDV> { [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86_Ungrab ] }; // / <XF86_Ungrab>
+ key <KPMU> { [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86_ClearGrab ] }; // * <XF86_ClearGrab>
+ key <KPSU> { [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86_Prev_VMode ] }; // - <XF86_Prev_VMode>
+
+ key <KPAD> { [ KP_Add, KP_Add, KP_Add, KP_Add, XF86_Next_VMode ] }; // + <XF86_Next_VMode>
+};
+
+
+// Keypad math area with non-CS operators
+// Copyright © 2006 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+//
+// ┏━━━━━┱─────┬─────┬─────┐
+// ┃Num ┃ ∕ ₁ │ . ₂ │ − ₃ │ ₁ <XF86_Ungrab>
+// ┃Lock⇭┃ / ÷ │ * × │ - − │ ₂ <XF86_ClearGrab>
+// ┡━━━━━╃─────┼─────┼─────┤ ₃ <XF86_Prev_VMode>
+// │ + ₄ │ ₄ <XF86_Next_VMode>
+// │ │
+// ┤ │ 1 None
+// │ │ 2 Level3 ⇮
+// │ + + │ 3 Shift+Level3 ⇧⇮
+// ╆━━━━━┪ 4 Ctrl+Alt
+partial keypad_keys
+xkb_symbols "ossmath" {
+
+ key.type[Group1]="CTRL+ALT" ;
+
+ key <KPDV> { [ KP_Divide, 0x1002215, 0x10000F7, VoidSymbol, XF86_Ungrab ] }; // / ∕ ÷ <XF86_Ungrab>
+ key <KPMU> { [ KP_Multiply, 0x10022C5, 0x10000D7, VoidSymbol, XF86_ClearGrab ] }; // * ⋅ × <XF86_ClearGrab>
+ key <KPSU> { [ KP_Subtract, 0x1002212, 0x1002212, VoidSymbol, XF86_Prev_VMode ] }; // - − − <XF86_Prev_VMode>
+
+ key <KPAD> { [ KP_Add, 0x100002B, 0x100002B, VoidSymbol, XF86_Next_VMode ] }; // + + + <XF86_Next_VMode>
+};
+
+
+// Keypad math area with non-CS operators in first levels
+// As demanded by users not interested in legacy pre-unicode junk
+// Copyright © 2007 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+//
+// ┏━━━━━┱─────┬─────┬─────┐
+// ┃Num ┃ / ₁ │ * ₂ │ - ₃ │ ₁ <XF86_Ungrab>
+// ┃Lock⇭┃ ∕ ÷ │ . × │ − − │ ₂ <XF86_ClearGrab>
+// ┡━━━━━╃─────┼─────┼─────┤ ₃ <XF86_Prev_VMode>
+// │ + ₄ │ ₄ <XF86_Next_VMode>
+// │ │
+// ┤ │ 1 None
+// │ │ 2 Level3 ⇮
+// │ + + │ 3 Shift+Level3 ⇧⇮
+// ╆━━━━━┪ 4 Ctrl+Alt
+partial keypad_keys
+xkb_symbols "futuremath" {
+
+ key.type[Group1]="FOUR_LEVEL_X" ;
+
+ key <KPDV> { [ 0x1002215, KP_Divide, 0x10000F7, XF86_Ungrab ] }; // ∕ / ÷ <XF86_Ungrab>
+ key <KPMU> { [ 0x10022C5, KP_Multiply, 0x10000D7, XF86_ClearGrab ] }; // ⋅ * × <XF86_ClearGrab>
+ key <KPSU> { [ 0x1002212, KP_Subtract, 0x1002212, XF86_Prev_VMode ] }; // − - − <XF86_Prev_VMode>
+
+ key <KPAD> { [ 0x100002B, KP_Add, 0x100002B, XF86_Next_VMode ] }; // + + + <XF86_Next_VMode>
+};
+
+
+// Keypad math area with non-CS operators, restricted to latin9
+// Copyright © 2006 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+//
+// ┏━━━━━┱─────┬─────┬─────┐
+// ┃Num ┃ / ₁ │ · ₂ │ - ₃ │ ₁ <XF86_Ungrab>
+// ┃Lock⇭┃ / ÷ │ * × │ - - │ ₂ <XF86_ClearGrab>
+// ┡━━━━━╃─────┼─────┼─────┤ ₃ <XF86_Prev_VMode>
+// │ + ₄ │ ₄ <XF86_Next_VMode>
+// │ │
+// ┤ │ 1 None
+// │ │ 2 Level3 ⇮
+// │ + + │ 3 Shift+Level3 ⇧⇮
+// ╆━━━━━┪ 4 Ctrl+Alt
+partial keypad_keys
+xkb_symbols "ossmath_latin9" {
+
+ key.type[Group1]="FOUR_LEVEL_X";
+
+ key <KPDV> { [ KP_Divide, slash, division, XF86_Ungrab ] }; // / / ÷ <XF86_Ungrab>
+ key <KPMU> { [ KP_Multiply, periodcentered, multiply, XF86_ClearGrab ] }; // * · × <XF86_ClearGrab>
+ key <KPSU> { [ KP_Subtract, minus, minus, XF86_Prev_VMode ] }; // - - - <XF86_Prev_VMode>
+
+ key <KPAD> { [ KP_Add, plus, plus, XF86_Next_VMode ] }; // + + + <XF86_Next_VMode>
+};
+
+
+// Legacy keypad number area
+// Copyright © 2006 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+//
+// ┏━━━━━┱
+// ┃Num ┃ ⇱ Home
+// ┃Lock⇭┃ ⇲ End
+// ┡━━━━━╃─────┼─────┼ ⇞ Page up
+// │ 7 │ 8 │ 9 │ ⇟ Page down
+// │ ⇱ │ ⇧ │ ⇞ │ ⎀ Insert
+// ├─────┼─────┼─────┤ ␥ Delete
+// │ 4 │ 5 │ 6 │ ⇦⇧⇨⇩ Directions
+// │ ⇦ │ │ ⇨ │
+// ├─────┼─────┼─────╆
+// │ 1 │ 2 │ 3 ┃
+// │ ⇲ │ ⇩ │ ⇟ ┃ 1 None
+// ├─────┴─────┼─────┨ 2 Num Lock ⇭
+// │ 0 │
+// │ ⎀ │
+// └───────────┴
+partial keypad_keys
+xkb_symbols "legacynumber" {
+
+ key.type[Group1]="KEYPAD" ;
+
+ key <KP7> { [ KP_Home, KP_7 ] }; // <home> 7
+ key <KP8> { [ KP_Up, KP_8 ] }; // <up> 8
+ key <KP9> { [ KP_Prior, KP_9 ] }; // <prior> 9
+
+ key <KP4> { [ KP_Left, KP_4 ] }; // <left> 4
+ key <KP5> { [ KP_Begin, KP_5 ] }; // <begin> 5
+ key <KP6> { [ KP_Right, KP_6 ] }; // <right> 6
+
+ key <KP1> { [ KP_End, KP_1 ] }; // <end> 1
+ key <KP2> { [ KP_Down, KP_2 ] }; // <down> 2
+ key <KP3> { [ KP_Next, KP_3 ] }; // <next> 3
+
+ key <KP0> { [ KP_Insert, KP_0 ] }; // <insert> 0
+};
+
+
+// Legacy Wang 725-3771-ae and 725-3771-uk keypad number area
+// Copyright © 2007 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+// This is actually a three-level keypad, declared as four-level
+// to avoid defining a new type
+//
+// ┏━━━━━┱
+// ┃Num ┃ ⇱ Home
+// ┃Lock⇭┃ ⇲ End
+// ┡━━━━━╃─────┼─────┼ ⇞ Page up
+// │ 7 │ 8 │ 9 │ ⇟ Page down
+// │ ⇱ < │ ⇧ > │ ⇞ ^ │ ⎀ Insert
+// ├─────┼─────┼─────┤ ␥ Delete
+// │ 4 │ 5 │ 6 │ ⇦⇧⇨⇩ Directions
+// │ ⇦ [ │ ] │ ⇨ $ │
+// ├─────┼─────┼─────╆
+// │ 1 │ 2 │ 3 ┃
+// │ ⇲ & │ ⇩ @ │ ⇟ # ┃ 1 None
+// ├─────┴─────┼─────┨ 2 Num Lock ⇭
+// │ 0 │ 3 Level3 ⇮
+// │ ⎀ │
+// └───────────┴
+partial keypad_keys
+xkb_symbols "legacynumber_wang" {
+
+ key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ;
+
+ key <KP7> { [ KP_Home, KP_7, less ] }; // <home> 7 <
+ key <KP8> { [ KP_Up, KP_8, greater ] }; // <up> 8 >
+ key <KP9> { [ KP_Prior, KP_9, asciicircum ] }; // <prior> 9 ^
+
+ key <KP4> { [ KP_Left, KP_4, bracketleft ] }; // <left> 4 [
+ key <KP5> { [ KP_Begin, KP_5, bracketright ] }; // <begin> 5 ]
+ key <KP6> { [ KP_Right, KP_6, dollar ] }; // <right> 6 $
+
+ key <KP1> { [ KP_End, KP_1, ampersand ] }; // <end> 1 &
+ key <KP2> { [ KP_Down, KP_2, at ] }; // <down> 2 @
+ key <KP3> { [ KP_Next, KP_3, numbersign ] }; // <next> 3 #
+
+ key <KP0> { [ KP_Insert, KP_0, apostrophe ] }; // <insert> 0 '
+};
+
+
+// Keypad number area with arrow symbols
+// Copyright © 2006 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+//
+// ┏━━━━━┱
+// ┃Num ┃ ⇱ Home
+// ┃Lock⇭┃ ⇲ End
+// ┡━━━━━╃─────┼─────┼ ⇞ Page up
+// │ 7 ⇖ │ 8 ⇑ │ 9 ⇗ │ ⇟ Page down
+// │ ⇱ ↖ │ ⇧ ↑ │ ⇞ ↗ │ ⎀ Insert
+// ├─────┼─────┼─────┤ ␥ Delete
+// │ 4 ⇐ │ 5 ⇔ │ 6 ⇒ │ ⇦⇧⇨⇩ Directions
+// │ ⇦ ← │ ↔ │ ⇨ → │ ⍽ narrow no-break space
+// ├─────┼─────┼─────╆
+// │ 1 ⇙ │ 2 ⇓ │ 3 ⇘ ┃
+// │ ⇲ ↙ │ ⇩ ↓ │ ⇟ ↘ ┃ 1 None
+// ├─────┴─────┼─────┨ 2 Num Lock ⇭
+// │ 0 ⇕ │ 3 Level3 ⇮
+// │ ⎀ ↕ │ 4 Shift+Level3 ⇧⇮
+// └───────────┴
+partial keypad_keys
+xkb_symbols "ossnumber" {
+
+ key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ;
+
+ key <KP7> { [ KP_Home, KP_7, 0x1002196, 0x10021D6 ] }; // <home> 7 ↖ ⇖
+ key <KP8> { [ KP_Up, KP_8, 0x1002191, 0x10021D1 ] }; // <up> 8 ↑ ⇑
+ key <KP9> { [ KP_Prior, KP_9, 0x1002197, 0x10021D7 ] }; // <prior> 9 ↗ ⇗
+
+ key <KP4> { [ KP_Left, KP_4, 0x1002190, 0x10021D0 ] }; // <left> 4 ← ⇐
+ key <KP5> { [ KP_Begin, KP_5, 0x1002194, 0x10021D4 ] }; // <begin> 5 ↔ ⇔
+ key <KP6> { [ KP_Right, KP_6, 0x1002192, 0x10021D2 ] }; // <right> 6 → ⇒
+
+ key <KP1> { [ KP_End, KP_1, 0x1002199, 0x10021D9 ] }; // <end> 1 ↙ ⇙
+ key <KP2> { [ KP_Down, KP_2, 0x1002193, 0x10021D3 ] }; // <down> 2 ↓ ⇓
+ key <KP3> { [ KP_Next, KP_3, 0x1002198, 0x10021D8 ] }; // <next> 3 ↘ ⇘
+
+ key <KP0> { [ KP_Insert, KP_0, 0x1002195, 0x10021D5 ] }; // <insert> 0 ↕ ⇕
+};
+
+
+// Wang 725-3771-ae and 725-3771-uk keypad number area with additional arrow symbols
+// Copyright © 2007 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+//
+// ┏━━━━━┱
+// ┃Num ┃ ⇱ Home
+// ┃Lock⇭┃ ⇲ End
+// ┡━━━━━╃─────┼─────┼ ⇞ Page up
+// │ 7 ↖ │ 8 ↑ │ 9 ↗ │ ⇟ Page down
+// │ ⇱ < │ ⇧ > │ ⇞ ^ │ ⎀ Insert
+// ├─────┼─────┼─────┤ ␥ Delete
+// │ 4 ← │ 5 ↔ │ 6 → │ ⇦⇧⇨⇩ Directions
+// │ ⇦ [ │ ] │ ⇨ $ │ ⍽ narrow no-break space
+// ├─────┼─────┼─────╆
+// │ 1 ↙ │ 2 ↓ │ 3 ↘ ┃
+// │ ⇲ & │ ⇩ @ │ ⇟ # ┃ 1 None
+// ├─────┴─────┼─────┨ 2 Num Lock ⇭
+// │ 0 ↕ │ 3 Level3 ⇮
+// │ ⎀ ' │ 4 Shift+Level3 ⇧⇮
+// └───────────┴
+partial keypad_keys
+xkb_symbols "ossnumber_wang" {
+
+ key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ;
+
+ key <KP7> { [ KP_Home, KP_7, less, 0x1002196 ] }; // <home> 7 < ↖
+ key <KP8> { [ KP_Up, KP_8, greater, 0x1002191 ] }; // <up> 8 > ↑
+ key <KP9> { [ KP_Prior, KP_9, asciicircum, 0x1002197 ] }; // <prior> 9 ^ ↗
+
+ key <KP4> { [ KP_Left, KP_4, bracketleft, 0x1002190 ] }; // <left> 4 [ ←
+ key <KP5> { [ KP_Begin, KP_5, bracketright, 0x1002194 ] }; // <begin> 5 ] ↔
+ key <KP6> { [ KP_Right, KP_6, dollar, 0x1002192 ] }; // <right> 6 $ →
+
+ key <KP1> { [ KP_End, KP_1, ampersand, 0x1002199 ] }; // <end> 1 & ↙
+ key <KP2> { [ KP_Down, KP_2, at, 0x1002193 ] }; // <down> 2 @ ↓
+ key <KP3> { [ KP_Next, KP_3, numbersign, 0x1002198 ] }; // <next> 3 # ↘
+
+ key <KP0> { [ KP_Insert, KP_0, apostrophe, 0x1002195 ] }; // <insert> 0 ' ↕
+};
+
+// Standard base "pc" layout only contains cursor keys, and then gets
+// augmented with the digits later. If you define your own layout for
+// the numpad you can inherit the cursors, but you'll have to define
+// the digits yourself. This module can be included in the rules to
+// define math operators; these are the variants used in computer
+// languages that are based on ASCII. NoSymbol does not mean that
+// nothing is bound to the key but that no assignment is done here.
+// srvr_ctrl(stdkeypad) and keypad(x11) declare the operator keys to
+// be of type CTRL+ALT in order to assign server control events to
+// them, but it uses the second level which is overwritten if we have
+// more than one definition (shift state) for the key. Instead, here
+// the commands are put at the 4th lever.
+partial keypad_keys
+xkb_symbols "ops" {
+ key <KPDV> { [ NoSymbol, slash, NoSymbol, XF86_Ungrab ] };
+ key <KPMU> { [ NoSymbol, asterisk, NoSymbol, XF86_ClearGrab ] };
+ key <KPSU> { [ NoSymbol, minus, NoSymbol, XF86_Prev_VMode ] };
+ key <KPAD> { [ NoSymbol, plus, NoSymbol, XF86_Next_VMode ] };
+ key <KPEQ> { [ NoSymbol, equal ] };
+};
+
+// Hexadecimal Numpad, by Roland Kaufmann <rlndkfmn at gmail dot com>
+// License: BSD (also covers variant with ATM digit order)
+// Third-level gives the letters used in hexadecimal numbers, or
+// columns in small spreadsheets. As a bonus, having 'e' available at
+// the center of the keyboard makes it easy to enter floating point
+// numbers in scientific notation.
+// Equal is added to start formulas (most numpads on PCs don't have
+// their own equal key), comma as a list separator (as most
+// programming languages wants period as a decimal separator) and
+// colon to enter times and ranges. Someone also may want to represent
+// multiplication and division in prose using x and colon.
+// Two first levels are specified as NoSymbol to not override any
+// previous specification. Combine this with another keypad specifier,
+// e.g. "legacy".
+partial keypad_keys
+xkb_symbols "hex" {
+ key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ;
+
+ // None NumLock AltGr
+ // symbol row
+ key <KPDV> { [ NoSymbol, NoSymbol, parenleft ] };
+ key <KPMU> { [ NoSymbol, NoSymbol, parenright ] };
+ key <KPSU> { [ NoSymbol, NoSymbol, dollar ] };
+
+ // upper row
+ key <KP7> { [ NoSymbol, NoSymbol, a ] };
+ key <KP8> { [ NoSymbol, NoSymbol, b ] };
+ key <KP9> { [ NoSymbol, NoSymbol, c ] };
+
+ // home row
+ key <KP4> { [ NoSymbol, NoSymbol, d ] };
+ key <KP5> { [ NoSymbol, NoSymbol, e ] };
+ key <KP6> { [ NoSymbol, NoSymbol, f ] };
+ key <KPAD> { [ NoSymbol, NoSymbol, comma ] };
+
+ // lower row
+ key <KP1> { [ NoSymbol, NoSymbol, equal ] };
+ key <KP2> { [ NoSymbol, NoSymbol, x ] };
+ key <KP3> { [ NoSymbol, NoSymbol, colon ] };
+
+ // decimal row
+ key <KP0> { [ NoSymbol, NoSymbol, backslash ] };
+};
+
+// Main numbers follows the traditions from ATMs and phones with
+// numbers increasing downwards to the right. (It is easier to
+// change the keyboard layout than to reprogram your local ATM;
+// also cell-phones are becoming more common while calculators are
+// becoming more rare).
+// First level is left unspecified, so it may be combined with another
+// layout, e.g. "legacy".
+partial keypad_keys
+xkb_symbols "atm" {
+ // upper row
+ key <KP7> { [ NoSymbol, KP_1 ] };
+ key <KP8> { [ NoSymbol, KP_2 ] };
+ key <KP9> { [ NoSymbol, KP_3 ] };
+
+ // lower row
+ key <KP1> { [ NoSymbol, KP_7 ] };
+ key <KP2> { [ NoSymbol, KP_8 ] };
+ key <KP3> { [ NoSymbol, KP_9 ] };
+};
+
+
+partial modifier_keys
+xkb_symbols "pointerkeys" {
+ key <NMLK> { [ Num_Lock, Pointer_EnableKeys ] };
+};
+
+
+// Only numbers, operators and decimal separator,
+// as seen on keypad overlay on Japanese keyboard.
+// ┌─┬─┬─┬─┐
+// │7│8│9│*│
+// ├─┼─┼─┼─┤
+// │4│5│6│-│
+// ├─┼─┼─┼─┤
+// │1│2│3│+│
+// ├─┼─┼─┼─┤
+// │0│ │·│/│
+// └─┴─┴─┴─┘
+partial keypad_keys
+xkb_symbols "numoperdecsep" {
+ key <KO7> { [ KP_7 ] };
+ key <KO8> { [ KP_8 ] };
+ key <KO9> { [ KP_9 ] };
+// ClsGrb kills whichever client has a grab in effect
+ key <KOMU> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86_ClearGrab ]
+ };
+
+ key <KO4> { [ KP_4 ] };
+ key <KO5> { [ KP_5 ] };
+ key <KO6> { [ KP_6 ] };
+// -VMode switches to the previous video mode
+ key <KOSU> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86_Prev_VMode ]
+ };
+
+ key <KO1> { [ KP_1 ] };
+ key <KO2> { [ KP_2 ] };
+ key <KO3> { [ KP_3 ] };
+// +VMode switches to the next video mode
+ key <KOAD> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86_Next_VMode ]
+ };
+
+ key <KO0> { [ KP_0 ] };
+ key <KODL> { [ KP_Decimal ] };
+// Ungrab cancels server/keyboard/pointer grabs
+ key <KODV> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86_Ungrab ]
+ };
+};
diff --git a/test/data/symbols/kpdl b/test/data/symbols/kpdl
new file mode 100644
index 0000000..968dbd2
--- /dev/null
+++ b/test/data/symbols/kpdl
@@ -0,0 +1,102 @@
+// The <KPDL> key is a mess.
+// It was probably originally meant to be a decimal separator.
+// Except since it was declared by USA people it didn't use the original
+// SI separator "," but a "." (since then the USA managed to f-up the SI
+// by making "." an accepted alternative, but standards still use "," as
+// default)
+// As a result users of SI-abiding countries expect either a "." or a ","
+// or a "decimal_separator" which may or may not be translated in one of the
+// above depending on applications.
+// It's not possible to define a default per-country since user expectations
+// depend on the conflicting choices of their most-used applications,
+// operating system, etc. Therefore it needs to be a configuration setting
+// Copyright © 2007 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+
+
+// Legacy <KPDL> #1
+// This assumes KP_Decimal will be translated in a dot
+partial keypad_keys
+xkb_symbols "dot" {
+
+ key.type[Group1]="KEYPAD" ;
+
+ key <KPDL> { [ KP_Delete, KP_Decimal ] }; // <delete> <separator>
+};
+
+
+// Legacy <KPDL> #2
+// This assumes KP_Separator will be translated in a comma
+partial keypad_keys
+xkb_symbols "comma" {
+
+ key.type[Group1]="KEYPAD" ;
+
+ key <KPDL> { [ KP_Delete, KP_Separator ] }; // <delete> <separator>
+};
+
+
+// Period <KPDL>, usual keyboard serigraphy in most countries
+partial keypad_keys
+xkb_symbols "dotoss" {
+
+ key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ;
+
+ key <KPDL> { [ KP_Delete, period, comma, 0x100202F ] }; // <delete> . , ⍽ (narrow no-break space)
+};
+
+
+// Period <KPDL>, usual keyboard serigraphy in most countries, latin-9 restriction
+partial keypad_keys
+xkb_symbols "dotoss_latin9" {
+
+ key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ;
+
+ key <KPDL> { [ KP_Delete, period, comma, nobreakspace ] }; // <delete> . , ⍽ (no-break space)
+};
+
+
+// Comma <KPDL>, what most non anglo-saxon people consider the real separator
+partial keypad_keys
+xkb_symbols "commaoss" {
+
+ key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ;
+
+ key <KPDL> { [ KP_Delete, comma, period, 0x100202F ] }; // <delete> , . ⍽ (narrow no-break space)
+};
+
+
+// Momayyez <KPDL>: Bahrain, Iran, Iraq, Kuwait, Oman, Qatar, Saudi Arabia, Syria, UAE
+partial keypad_keys
+xkb_symbols "momayyezoss" {
+
+ key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ;
+
+ key <KPDL> { [ KP_Delete, 0x100066B, comma, 0x100202F ] }; // <delete> ? , ⍽ (narrow no-break space)
+};
+
+
+// Abstracted <KPDL>, pray everything will work out (it usually does not)
+partial keypad_keys
+xkb_symbols "kposs" {
+
+ key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ;
+
+ key <KPDL> { [ KP_Delete, KP_Decimal, KP_Separator, 0x100202F ] }; // <delete> ? ? ⍽ (narrow no-break space)
+};
+
+// Spreadsheets may be configured to use the dot as decimal
+// punctuation, comma as a thousands separator and then semi-colon as
+// the list separator. Of these, dot and semi-colon is most important
+// when entering data by the keyboard; the comma can then be inferred
+// and added to the presentation afterwards. Using semi-colon as a
+// general separator may in fact be preferred to avoid ambiguities
+// in data files. Most times a decimal separator is hard-coded, it
+// seems to be period, probably since this is the syntax used in
+// (most) programming languages.
+partial keypad_keys
+xkb_symbols "semi" {
+
+ key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ;
+
+ key <KPDL> { [ NoSymbol, NoSymbol, semicolon ] };
+};
diff --git a/test/data/symbols/latin b/test/data/symbols/latin
new file mode 100644
index 0000000..d88e3c4
--- /dev/null
+++ b/test/data/symbols/latin
@@ -0,0 +1,256 @@
+// Common Latin alphabet layout
+
+default partial
+xkb_symbols "basic" {
+
+ key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
+ key <AE02> { [ 2, at, twosuperior, oneeighth ] };
+ key <AE03> { [ 3, numbersign, threesuperior, sterling ] };
+ key <AE04> { [ 4, dollar, onequarter, dollar ] };
+ key <AE05> { [ 5, percent, onehalf, threeeighths ] };
+ key <AE06> { [ 6, asciicircum, threequarters, fiveeighths ] };
+ key <AE07> { [ 7, ampersand, braceleft, seveneighths ] };
+ key <AE08> { [ 8, asterisk, bracketleft, trademark ] };
+ key <AE09> { [ 9, parenleft, bracketright, plusminus ] };
+ key <AE10> { [ 0, parenright, braceright, degree ] };
+ key <AE11> { [ minus, underscore, backslash, questiondown ] };
+ key <AE12> { [ equal, plus, dead_cedilla, dead_ogonek ] };
+
+ key <AD01> { [ q, Q, at, Greek_OMEGA ] };
+ key <AD02> { [ w, W, lstroke, Lstroke ] };
+ key <AD03> { [ e, E, e, E ] };
+ key <AD04> { [ r, R, paragraph, registered ] };
+ key <AD05> { [ t, T, tslash, Tslash ] };
+ key <AD06> { [ y, Y, leftarrow, yen ] };
+ key <AD07> { [ u, U, downarrow, uparrow ] };
+ key <AD08> { [ i, I, rightarrow, idotless ] };
+ key <AD09> { [ o, O, oslash, Ooblique ] };
+ key <AD10> { [ p, P, thorn, THORN ] };
+ key <AD11> { [bracketleft, braceleft, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [bracketright, braceright, dead_tilde, dead_macron ] };
+
+ key <AC01> { [ a, A, ae, AE ] };
+ key <AC02> { [ s, S, ssharp, section ] };
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, dstroke, ordfeminine ] };
+ key <AC05> { [ g, G, eng, ENG ] };
+ key <AC06> { [ h, H, hstroke, Hstroke ] };
+ key <AC07> { [ j, J, dead_hook, dead_horn ] };
+ key <AC08> { [ k, K, kra, ampersand ] };
+ key <AC09> { [ l, L, lstroke, Lstroke ] };
+ key <AC10> { [ semicolon, colon, dead_acute, dead_doubleacute ] };
+ key <AC11> { [apostrophe, quotedbl, dead_circumflex, dead_caron ] };
+ key <TLDE> { [ grave, asciitilde, notsign, notsign ] };
+
+ key <BKSL> { [ backslash, bar, dead_grave, dead_breve ] };
+ key <AB01> { [ z, Z, guillemotleft, less ] };
+ key <AB02> { [ x, X, guillemotright, greater ] };
+ key <AB03> { [ c, C, cent, copyright ] };
+ key <AB04> { [ v, V, leftdoublequotemark, leftsinglequotemark ] };
+ key <AB05> { [ b, B, rightdoublequotemark, rightsinglequotemark ] };
+ key <AB06> { [ n, N, n, N ] };
+ key <AB07> { [ m, M, mu, masculine ] };
+ key <AB08> { [ comma, less, horizconnector, multiply ] };
+ key <AB09> { [ period, greater, periodcentered, division ] };
+ key <AB10> { [ slash, question, dead_belowdot, dead_abovedot ] };
+
+};
+
+// Northern Europe ( Danish, Finnish, Norwegian, Swedish) common layout
+
+partial
+xkb_symbols "type2" {
+
+ include "latin"
+
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, quotedbl, at, twosuperior ] };
+ key <AE03> { [ 3, numbersign, sterling, threesuperior] };
+ key <AE04> { [ 4, currency, dollar, onequarter ] };
+ key <AE05> { [ 5, percent, onehalf, cent ] };
+ key <AE06> { [ 6, ampersand, yen, fiveeighths ] };
+ key <AE07> { [ 7, slash, braceleft, division ] };
+ key <AE08> { [ 8, parenleft, bracketleft, guillemotleft] };
+ key <AE09> { [ 9, parenright, bracketright, guillemotright] };
+ key <AE10> { [ 0, equal, braceright, degree ] };
+
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD04> { [ r, R, registered, registered ] };
+ key <AD05> { [ t, T, thorn, THORN ] };
+ key <AD09> { [ o, O, oe, OE ] };
+ key <AD11> { [ aring, Aring, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [dead_diaeresis, dead_circumflex, dead_tilde, dead_caron ] };
+
+ key <AC01> { [ a, A, ordfeminine, masculine ] };
+
+ key <AB03> { [ c, C, copyright, copyright ] };
+ key <AB08> { [ comma, semicolon, dead_cedilla, dead_ogonek ] };
+ key <AB09> { [ period, colon, periodcentered, dead_abovedot ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
+};
+
+// Slavic Latin ( Albanian, Croatian, Polish, Slovene, Yugoslav)
+// common layout
+
+partial
+xkb_symbols "type3" {
+
+ include "latin"
+
+ key <AD01> { [ q, Q, backslash, Greek_OMEGA ] };
+ key <AD02> { [ w, W, bar, Lstroke ] };
+ key <AD06> { [ z, Z, leftarrow, yen ] };
+
+ key <AC04> { [ f, F, bracketleft, ordfeminine ] };
+ key <AC05> { [ g, G, bracketright, ENG ] };
+ key <AC08> { [ k, K, lstroke, ampersand ] };
+
+ key <AB01> { [ y, Y, guillemotleft, less ] };
+ key <AB04> { [ v, V, at, grave ] };
+ key <AB05> { [ b, B, braceleft, apostrophe ] };
+ key <AB06> { [ n, N, braceright, braceright ] };
+ key <AB07> { [ m, M, section, masculine ] };
+ key <AB08> { [ comma, semicolon, less, multiply ] };
+ key <AB09> { [ period, colon, greater, division ] };
+};
+
+// Another common Latin layout
+// (German, Estonian, Spanish, Icelandic, Italian, Latin American, Portuguese)
+
+partial
+xkb_symbols "type4" {
+
+ include "latin"
+
+ key <AE02> { [ 2, quotedbl, at, oneeighth ] };
+ key <AE06> { [ 6, ampersand, notsign, fiveeighths ] };
+ key <AE07> { [ 7, slash, braceleft, seveneighths ] };
+ key <AE08> { [ 8, parenleft, bracketleft, trademark ] };
+ key <AE09> { [ 9, parenright, bracketright, plusminus ] };
+ key <AE10> { [ 0, equal, braceright, degree ] };
+
+ key <AD03> { [ e, E, EuroSign, cent ] };
+
+ key <AB08> { [ comma, semicolon, horizconnector, multiply ] };
+ key <AB09> { [ period, colon, periodcentered, division ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
+};
+
+partial
+xkb_symbols "nodeadkeys" {
+
+ key <AE12> { [ equal, plus, cedilla, ogonek ] };
+ key <AD11> { [bracketleft, braceleft, diaeresis, degree ] };
+ key <AD12> { [bracketright, braceright, asciitilde, macron ] };
+ key <AC10> { [ semicolon, colon, acute, doubleacute ] };
+ key <AC11> { [apostrophe, quotedbl, asciicircum, caron ] };
+ key <BKSL> { [ backslash, bar, grave, breve ] };
+ key <AB10> { [ slash, question, dead_belowdot, abovedot ] };
+};
+
+partial
+xkb_symbols "type2_nodeadkeys" {
+
+ include "latin(nodeadkeys)"
+
+ key <AD11> { [ aring, Aring, diaeresis, degree ] };
+ key <AD12> { [ diaeresis, asciicircum, asciitilde, caron ] };
+ key <AB08> { [ comma, semicolon, cedilla, ogonek ] };
+ key <AB09> { [ period, colon, periodcentered, abovedot ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
+};
+
+partial
+xkb_symbols "type3_nodeadkeys" {
+
+ include "latin(nodeadkeys)"
+};
+
+partial
+xkb_symbols "type4_nodeadkeys" {
+
+ include "latin(nodeadkeys)"
+
+ key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
+};
+
+// Added 2008.03.05 by Marcin Woliński
+// See http://marcinwolinski.pl/keyboard/ for a description.
+// Used by pl(intl)
+//
+// ┌─────┐
+// │ 2 4 │ 2 = Shift, 4 = Level3 + Shift
+// │ 1 3 │ 1 = Normal, 3 = Level3
+// └─────┘
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
+// │ ~ ~ │ ! ' │ @ " │ # ˝ │ $ ¸ │ % ˇ │ ^ ^ │ & ˘ │ * ̇ │ ( ̣ │ ) ° │ _ ¯ │ + ˛ ┃ ⌫ Back- ┃
+// │ ` ` │ 1 ¡ │ 2 © │ 3 • │ 4 § │ 5 € │ 6 ¢ │ 7 − │ 8 × │ 9 ÷ │ 0 ° │ - – │ = — ┃ space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
+// ┃ ┃ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ { « │ } » ┃ Enter ┃
+// ┃Tab ↹ ┃ q │ w │ e │ r │ t │ y │ u │ i │ o │ p │ [ ‹ │ ] › ┃ ⏎ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃ ┃ A │ S │ D │ F │ G │ H │ J │ K │ L │ : “ │ " ” │ | ¶ ┃ ┃
+// ┃Caps ⇬ ┃ a │ s │ d │ f │ g │ h │ j │ k │ l │ ; ‘ │ ' ’ │ \ ┃ ┃
+// ┣━━━━━━━━┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
+// ┃ │ Z │ X │ C │ V │ B │ N │ M │ < „ │ > · │ ? ¿ ┃ ┃
+// ┃Shift ⇧ │ z │ x │ c │ v │ b │ n │ m │ , ‚ │ . … │ / ⁄ ┃Shift ⇧ ┃
+// ┣━━━━━━━┳━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
+// ┃ ┃ ┃ ┃ ␣ ⍽ ┃ ┃ ┃ ┃
+// ┃Ctrl ┃Meta ┃Alt ┃ ␣ Space ⍽ ┃AltGr ⇮┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
+
+partial
+xkb_symbols "intl" {
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key <AE01> { [ 1, exclam, exclamdown, dead_acute ] };
+ key <AE02> { [ 2, at, copyright, dead_diaeresis ] };
+ key <AE03> { [ 3, numbersign, U2022, dead_doubleacute ] }; // U+2022 is bullet (the name bullet does not work)
+ key <AE04> { [ 4, dollar, section, dead_cedilla ] };
+ key <AE05> { [ 5, percent, EuroSign, dead_caron ] };
+ key <AE06> { [ 6, asciicircum, cent, dead_circumflex ] };
+ key <AE07> { [ 7, ampersand, U2212, dead_breve ] }; // U+2212 is MINUS SIGN
+ key <AE08> { [ 8, asterisk, multiply, dead_abovedot ] };
+ key <AE09> { [ 9, parenleft, division, dead_belowdot ] };
+ key <AE10> { [ 0, parenright, degree, dead_abovering ] };
+ key <AE11> { [ minus, underscore, endash, dead_macron ] };
+ key <AE12> { [ equal, plus, emdash, dead_ogonek ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E ] };
+ key <AD04> { [ r, R ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ y, Y ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I ] };
+ key <AD09> { [ o, O ] };
+ key <AD10> { [ p, P ] };
+ key <AD11> { [bracketleft, braceleft, U2039, guillemotleft ] };
+ key <AD12> { [bracketright, braceright, U203A, guillemotright ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ d, D ] };
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ j, J ] };
+ key <AC08> { [ k, K ] };
+ key <AC09> { [ l, L ] };
+ key <AC10> { [ semicolon, colon, leftsinglequotemark, leftdoublequotemark ] };
+ key <AC11> { [apostrophe, quotedbl, rightsinglequotemark, rightdoublequotemark ] };
+
+ key <BKSL> { [ backslash, bar, NoSymbol, paragraph ] };
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ comma, less, singlelowquotemark, doublelowquotemark ] };
+ key <AB09> { [ period, greater, ellipsis, periodcentered ] };
+ key <AB10> { [ slash, question, U2044, questiondown ] }; // U+2044 is FRACTION SLASH
+
+};
diff --git a/test/data/symbols/level3 b/test/data/symbols/level3
new file mode 100644
index 0000000..1aef970
--- /dev/null
+++ b/test/data/symbols/level3
@@ -0,0 +1,211 @@
+// These partial variants assign ISO_Level3_Shift to various XKB keycodes
+// so that the third shift level can be reached.
+
+// The default behaviour:
+// the right Alt key (AltGr) chooses the third symbol engraved on a key.
+default partial modifier_keys
+xkb_symbols "ralt_switch" {
+ key <RALT> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// Ensure a mapping to a real modifier for LevelThree.
+partial modifier_keys
+xkb_symbols "modifier_mapping" {
+ replace key <LVL3> {
+ type[Group1] = "ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift ]
+ };
+ modifier_map Mod5 { <LVL3> };
+};
+
+// The right Alt key never chooses the third level.
+// This option attempts to undo the effect of a layout's inclusion of
+// 'ralt_switch'. You may want to also select another level3 option
+// to map the level3 shift to some other key.
+partial modifier_keys
+xkb_symbols "ralt_alt" {
+ key <RALT> {
+ type[Group1]="TWO_LEVEL",
+ type[Group2]="TWO_LEVEL",
+ type[Group3]="TWO_LEVEL",
+ type[Group4]="TWO_LEVEL",
+ symbols[Group1] = [ Alt_R, Meta_R ],
+ symbols[Group2] = [ Alt_R, Meta_R ],
+ symbols[Group3] = [ Alt_R, Meta_R ],
+ symbols[Group4] = [ Alt_R, Meta_R ]
+ };
+ modifier_map Mod1 { <RALT> };
+};
+
+// The right Alt key (while pressed) chooses the third shift level,
+// and Compose is mapped to its second level.
+partial modifier_keys
+xkb_symbols "ralt_switch_multikey" {
+ key <RALT> {
+ type[Group1]="TWO_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift, Multi_key ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// A special case of the right-Alt switch -- for use with grp:alts_toggle.
+hidden partial modifier_keys
+xkb_symbols "ralt_switch_for_alts_toggle" {
+ virtual_modifiers LAlt, AltGr;
+ key <LALT> {
+ type[Group1]="PC_RALT_LEVEL2",
+ symbols[Group1] = [ Alt_L, ISO_Prev_Group, ISO_Prev_Group ],
+ virtualMods= LAlt
+ };
+ key <RALT> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1] = [ ISO_Level3_Shift, ISO_Next_Group ],
+ virtualMods= AltGr
+ };
+ include "level3(modifier_mapping)"
+};
+
+// Either Alt key (while pressed) chooses the third shift level.
+// (To be used mostly to imitate Mac OS functionality.)
+partial modifier_keys
+xkb_symbols "alt_switch" {
+ include "level3(lalt_switch)"
+ include "level3(ralt_switch)"
+};
+
+// The left Alt key (while pressed) chooses the third shift level.
+partial modifier_keys
+xkb_symbols "lalt_switch" {
+ key <LALT> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// The right Ctrl key (while pressed) chooses the third shift level.
+partial modifier_keys
+xkb_symbols "switch" {
+ key <RCTL> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// The Menu key (while pressed) chooses the third shift level.
+partial modifier_keys
+xkb_symbols "menu_switch" {
+ key <MENU> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// Either Win key (while pressed) chooses the third shift level.
+partial modifier_keys
+xkb_symbols "win_switch" {
+ include "level3(lwin_switch)"
+ include "level3(rwin_switch)"
+};
+
+// The left Win key (while pressed) chooses the third shift level.
+partial modifier_keys
+xkb_symbols "lwin_switch" {
+ key <LWIN> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// The right Win key (while pressed) chooses the third shift level.
+// (When using this map, you should set your keyboard as pc101 or pc102
+// instead of pc104 or pc105.)
+partial modifier_keys
+xkb_symbols "rwin_switch" {
+ key <RWIN> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// The Enter key on the kepypad (while pressed) chooses the third shift level.
+// (This is especially useful for Mac laptops which miss the right Alt key.)
+partial modifier_keys
+xkb_symbols "enter_switch" {
+ key <KPEN> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// The CapsLock key (while pressed) chooses the third shift level.
+partial modifier_keys
+xkb_symbols "caps_switch" {
+ key <CAPS> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// The Backslash key (while pressed) chooses the third shift level.
+partial modifier_keys
+xkb_symbols "bksl_switch" {
+ key <BKSL> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// The Less/Greater key (while pressed) chooses the third shift level.
+partial modifier_keys
+xkb_symbols "lsgt_switch" {
+ key <LSGT> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// The CapsLock key (while pressed) chooses the third shift level,
+// and latches when pressed together with another third-level chooser.
+partial modifier_keys
+xkb_symbols "caps_switch_latch" {
+ key <CAPS> {
+ type[Group1]="THREE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// The Backslash key (while pressed) chooses the third shift level,
+// and latches when pressed together with another third-level chooser.
+partial modifier_keys
+xkb_symbols "bksl_switch_latch" {
+ key <BKSL> {
+ type[Group1]="THREE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ]
+ };
+ include "level3(modifier_mapping)"
+};
+
+// The Less/Greater key (while pressed) chooses the third shift level,
+// and latches when pressed together with another third-level chooser.
+partial modifier_keys
+xkb_symbols "lsgt_switch_latch" {
+ key <LSGT> {
+ type[Group1]="THREE_LEVEL",
+ symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ]
+ };
+ include "level3(modifier_mapping)"
+};
diff --git a/test/data/symbols/level5 b/test/data/symbols/level5
new file mode 100644
index 0000000..ec8c9a9
--- /dev/null
+++ b/test/data/symbols/level5
@@ -0,0 +1,152 @@
+// These partial variants assign ISO_Level5_Shift to various XKB keycodes
+// so that the fifth shift level can be reached.
+
+// The right Ctrl key (while pressed) chooses the fifth shift level.
+partial modifier_keys
+xkb_symbols "rctrl_switch" {
+ key <RCTL> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level5_Shift ]
+ };
+ include "level5(modifier_mapping)"
+};
+
+// The Less/Greater key (while pressed) chooses the fifth shift level.
+partial modifier_keys
+xkb_symbols "lsgt_switch" {
+ key <LSGT> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level5_Shift ]
+ };
+ include "level5(modifier_mapping)"
+};
+
+// The right Alt key (while pressed) chooses the fifth shift level.
+partial modifier_keys
+xkb_symbols "ralt_switch" {
+ key <RALT> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level5_Shift ]
+ };
+ include "level5(modifier_mapping)"
+};
+
+// The CapsLock key (while pressed) chooses the fifth shift level.
+partial modifier_keys
+xkb_symbols "caps_switch" {
+ key <CAPS> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level5_Shift ]
+ };
+ include "level5(modifier_mapping)"
+};
+
+// Ensure a mapping to a real modifier for LevelFive.
+partial modifier_keys
+xkb_symbols "modifier_mapping" {
+ replace key <MDSW> {
+ type[Group1] = "ONE_LEVEL",
+ symbols[Group1] = [ ISO_Level5_Shift ]
+ };
+ modifier_map Mod3 { <MDSW> };
+};
+
+
+// This adds the definitions needed to create a level5-lock behaviour, using
+// the real modifier NumLock as a lock indicator.
+// See also: types/level5 : EIGHT_LEVEL_LEVEL_FIVE_LOCK
+// See also: compat/level5(level5_lock)
+partial modifier_keys
+xkb_symbols "lock" {
+ key.type[Group1] = "ONE_LEVEL";
+ include "level5(modifier_mapping)"
+ replace key <HYPR> {
+ vmods = NumLock,
+ symbols[Group1] = [ NoSymbol ],
+ actions[Group1] = [ SetMods(modifiers=NumLock) ]
+ };
+ modifier_map Mod2 { <HYPR> };
+};
+
+// The following modifier keys are used to switch to the third shift level
+// and to set a corresponding lock, implemented as NumLock.
+
+partial modifier_keys
+xkb_symbols "lsgt_switch_lock" {
+ include "level5(lock)"
+ key <LSGT> {
+ type[Group1] = "EIGHT_LEVEL",
+ symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift,
+ ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "lwin_switch_lock" {
+ include "level5(lock)"
+ key <LWIN> {
+ type[Group1] = "EIGHT_LEVEL",
+ symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift,
+ ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "ralt_switch_lock" {
+ include "level5(lock)"
+ key <RALT> {
+ type[Group1] = "EIGHT_LEVEL",
+ symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift,
+ ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "rwin_switch_lock" {
+ include "level5(lock)"
+ key <RWIN> {
+ type[Group1] = "EIGHT_LEVEL",
+ symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift,
+ ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "lsgt_switch_lock_cancel" {
+ include "level5(lock)"
+ key <LSGT> {
+ type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK",
+ symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift,
+ ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "lwin_switch_lock_cancel" {
+ include "level5(lock)"
+ key <LWIN> {
+ type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK",
+ symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift,
+ ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "ralt_switch_lock_cancel" {
+ include "level5(lock)"
+ key <RALT> {
+ type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK",
+ symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift,
+ ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ]
+ };
+};
+
+partial modifier_keys
+xkb_symbols "rwin_switch_lock_cancel" {
+ include "level5(lock)"
+ key <RWIN> {
+ type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK",
+ symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift,
+ ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ]
+ };
+};
diff --git a/test/data/symbols/macintosh_vndr/apple b/test/data/symbols/macintosh_vndr/apple
new file mode 100644
index 0000000..53d260c
--- /dev/null
+++ b/test/data/symbols/macintosh_vndr/apple
@@ -0,0 +1,141 @@
+//
+// Keyboard modification for Apple keyboards
+//
+
+partial default modifier_keys
+xkb_symbols "extended" {
+
+ key <KPEQ> { [ KP_Equal ] };
+
+// The key in the PC's Insert position is sometimes engraved Help (at least
+// in Switzerland and Great Britain), with Insert sometimes above. But in the
+// US and Canada, it remains Insert. So this should probably be an XkbOption,
+// but I have to do more research.
+// Perhaps Help should be the primary symbol with Insert in the 1st shift-level
+// key <INS> { [ Help, Insert ] };
+// The keys next to F12, labeled F13, F14, & F15 generate codes that XFree86
+// claims not to generate. I think they should be equivalent to the PC keys
+// Print Screen / SysRq, Scroll Lock, and Pause. Linux kernel bug?
+// key <PRSC> { [ F13 ] }; // should be keycode 93 or
+// key <FK13> { [ F13 ] }; // should be keycode 118
+// key <SCLK> { [ F14 ] }; // should be keycode 123 or
+// key <FK14> { [ F14 ] }; // should be keycode 119
+// key <PAUS> { [ F15 ] }; // should be keycode 127 or
+// key <FK15> { [ F15 ] }; // should be keycode 120
+};
+
+partial modifier_keys
+xkb_symbols "laptop" {
+
+ include "macintosh_vndr/apple(extended)"
+
+ // The real numlock key on the iBook (shared with F5) works internally to
+ // the keyboard. It illuminates the Num_Lock led and locks the fn-key to
+ // type only the keypad keys on the letter keys (U=4, I=5, O=6, P=*, etc.).
+ // The key in the Num_lock position is engraved with Clear.
+ override key <NMLK> { [ Clear ] };
+ // The key engraved Delete sends BKSP. To get Delete, use Shift-Delete
+ override key <BKSP> { [ BackSpace, Delete ] };
+ // These keyboards only generate a <RALT> when pressing fn+Alt. This makes
+ // it impossible to get to the third shift level on keys that are on
+ // the fn-keypad, so use the Enter key (right of <SPC>) for Mode_switch,
+ // and use fn+Enter (Apple's code for Menu) for KP_Enter.
+ replace key <KPEN> { [ ISO_Level3_Shift ] };
+ modifier_map Mod5 { ISO_Level3_Shift };
+ // Linux kernel bug with Menu on macs means this does not work yet
+// replace key <MENU> { [ KP_Enter ] }; // should be keycode 117
+};
+
+partial modifier_keys
+xkb_symbols "laptop_bad_switch" {
+ // Kept for backward compatibility
+ include "macintosh_vndr/apple(laptop)"
+};
+
+// Long Aluminium Keyboards
+partial function_keys
+xkb_symbols "alukbd" {
+ // The base is a inet PC keyboard
+ include "pc"
+
+ // Additional Fxx keys
+ key <FK13> { [ F13 ] };
+ key <FK14> { [ F14 ] };
+ key <FK15> { [ F15 ] };
+ key <FK16> { [ F16 ] };
+ key <FK17> { [ F17 ] };
+ key <FK18> { [ F18 ] };
+ key <FK19> { [ F19 ] };
+
+ // On aluminium keyboards, Num_Lock is replace by Clear
+ replace key <NMLK> { [ Clear ] };
+ // CAPS key is always Caps_Lock, even for JIS keyboards
+ replace key <CAPS> { [ Caps_Lock ] };
+
+ // F1..F12 are multimedia keys when used with the 'Fn' key
+ // Make those multimedia actions available via ISO_Level3_Shift too,
+ // it is useful when the Fn key is remapped to something else (e.g. Insert)
+ key <FK01> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, XF86KbdBrightnessDown, NoSymbol, XF86_Switch_VT_1 ]
+ };
+ key <FK02> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, XF86KbdBrightnessUp, NoSymbol, XF86_Switch_VT_2 ]
+ };
+ key <FK03> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, NoSymbol, NoSymbol, XF86_Switch_VT_3 ]
+ };
+ key <FK04> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, NoSymbol, NoSymbol, XF86_Switch_VT_4 ]
+ };
+ key <FK05> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, NoSymbol, NoSymbol, XF86_Switch_VT_5 ]
+ };
+ key <FK06> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, NoSymbol, NoSymbol, XF86_Switch_VT_6 ]
+ };
+ key <FK07> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, XF86AudioPrev, NoSymbol, XF86_Switch_VT_7 ]
+ };
+ key <FK08> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, XF86AudioPlay, NoSymbol, XF86_Switch_VT_8 ]
+ };
+ key <FK09> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, XF86AudioNext, NoSymbol, XF86_Switch_VT_9 ]
+ };
+ key <FK10> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, XF86AudioMute, NoSymbol, XF86_Switch_VT_10 ]
+ };
+ key <FK11> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, XF86AudioLowerVolume, NoSymbol, XF86_Switch_VT_11 ]
+ };
+ key <FK12> {
+ type= "FOUR_LEVEL_X",
+ symbols[Group1]= [ NoSymbol, XF86AudioRaiseVolume, NoSymbol, XF86_Switch_VT_12 ]
+ };
+};
+
+// Aluminium Keyboard: make F13, F14, F15 PC-ish (Print, Scroll_Lock, Pause)
+partial function_keys keypad_keys
+xkb_symbols "alupckeys" {
+ key <FK13> {
+ type= "PC_ALT_LEVEL2",
+ symbols[Group1]= [ Print, Sys_Req ]
+ };
+ key <FK14> { [ Scroll_Lock ] };
+ key <FK15> {
+ type= "PC_CONTROL_LEVEL2",
+ symbols[Group1]= [ Pause, Break ]
+ };
+ override key <NMLK> { [ Num_Lock, Pointer_EnableKeys ] };
+};
diff --git a/test/data/symbols/macintosh_vndr/us b/test/data/symbols/macintosh_vndr/us
new file mode 100644
index 0000000..58bfee5
--- /dev/null
+++ b/test/data/symbols/macintosh_vndr/us
@@ -0,0 +1,145 @@
+// symbols definition for a Macintosh "Extended" keyboard
+
+default xkb_symbols "extended" {
+
+ name[Group1]= "USA";
+ key <ESC> { [ Escape ] };
+
+ key <TLDE> { [ grave, asciitilde ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, asciicircum ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E ] };
+ key <AD04> { [ r, R ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ y, Y ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I ] };
+ key <AD09> { [ o, O ] };
+ key <AD10> { [ p, P ] };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+ key <BKSL> { [ backslash, bar ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ d, D ] };
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ j, J ] };
+ key <AC08> { [ k, K ] };
+ key <AC09> { [ l, L ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+
+ key <SPCE> { [ space ] };
+
+ include "eurosign(e)"
+ include "keypad(overlay)"
+
+ key <KPEQ> { [ equal ] };
+};
+
+hidden
+xkb_symbols "oldmac" {
+
+ include "macintosh_vndr/us(extended)"
+
+ // Begin "Function" section
+ key <FK01> { [ F1 ] };
+ key <FK02> { [ F2 ] };
+ key <FK03> { [ F3 ] };
+ key <FK04> { [ F4 ] };
+ key <FK05> { [ F5 ] };
+ key <FK06> { [ F6 ] };
+ key <FK07> { [ F7 ] };
+ key <FK08> { [ F8 ] };
+ key <FK09> { [ F9 ] };
+ key <FK10> { [ F10 ] };
+ key <FK11> { [ F11 ] };
+ key <FK12> { [ F12 ] };
+ key <FK13> { [ Print ] };
+ key <FK14> { [ Scroll_Lock ] };
+ key <FK15> { [ Pause ] };
+ // End "Function" section
+
+ // Begin "Editing" section
+ key <INS> { [ Insert ] };
+ key <HOME> { [ Home ] };
+ key <PGUP> { [ Prior ] };
+ key <DELE> { [ Delete ] };
+ key <END> { [ End ] };
+ key <PGDN> { [ Next ] };
+
+ key <UP> { [ Up ] };
+ key <LEFT> { [ Left ] };
+ key <DOWN> { [ Down ] };
+ key <RGHT> { [ Right ] };
+ // End "Editing" section
+
+ key <BKSP> { [ BackSpace ] };
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <RTRN> { [ Return ] };
+ key <CAPS> { [ Caps_Lock ] };
+ key <NMLK> { [ Num_Lock, Pointer_EnableKeys ] };
+
+ // Begin "Modifier" section
+ key <LFSH> { [ Shift_L ] };
+ key <RTSH> { [ Shift_R ] };
+ key <LCTL> { [ Control_L ] };
+ key <RCTL> { [ Control_R ] };
+ key <LALT> { [ Alt_L, Meta_L ] };
+ key <RALT> { [ Alt_R, Meta_R ] };
+ key <LWIN> { [ Super_L ] };
+ key <RWIN> { [ Super_R ] };
+ // End "Modifier" section
+
+ // begin modifier mappings
+ modifier_map Shift { Shift_L, Shift_R };
+ modifier_map Lock { Caps_Lock };
+ modifier_map Control{ Control_L, Control_R };
+ modifier_map Mod2 { Num_Lock };
+
+ // Fake keys for virtual<->real modifiers mapping
+ key <LVL3> { [ ISO_Level3_Shift ] };
+ key <MDSW> { [ Mode_switch ] };
+ modifier_map Mod5 { <LVL3>, <MDSW> };
+
+ key <ALT> { [ NoSymbol, Alt_L ] };
+ modifier_map Mod1 { <ALT>, <LALT> };
+
+ key <META> { [ NoSymbol, Meta_L ] };
+ modifier_map Mod1 { <META> };
+
+ key <SUPR> { [ NoSymbol, Super_L ] };
+ modifier_map Mod4 { <SUPR> };
+
+ key <HYPR> { [ NoSymbol, Hyper_L ] };
+ modifier_map Mod4 { <HYPR> };
+ // end modifier mappings
+
+};
diff --git a/test/data/symbols/nbsp b/test/data/symbols/nbsp
new file mode 100644
index 0000000..77b40df
--- /dev/null
+++ b/test/data/symbols/nbsp
@@ -0,0 +1,204 @@
+// Let Space key provide No-Break Space (NBSP), Narrow No-Break Space (NNBSP),
+// Zero-Width Non-Joiner (ZWNJ), and Zero-Width Joiner (ZWJ) for the desired
+// levels.
+
+
+////////////////////////////////////////
+// Only Space
+
+partial
+xkb_symbols "none" {
+ key <SPCE> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1]= [ space ]
+ };
+};
+
+
+////////////////////////////////////////
+// No-Break Space
+
+partial
+xkb_symbols "level2" {
+ key <SPCE> {
+ type[Group1]="TWO_LEVEL",
+ symbols[Group1]= [ space, nobreakspace ]
+ };
+};
+
+
+// level3 & level3ns provide no-breaking spaces starting from level3
+// This is good for typographers but experience shows many users accidently
+// type no-breaking spaces on the CLI (resulting in errors)
+// Used by fr(latin9) and lt(std)
+partial
+xkb_symbols "level3" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, space, nobreakspace ]
+ };
+};
+
+// level3s kills fourth level
+// Used by ca(multix)
+partial
+xkb_symbols "level3s" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, space, nobreakspace, NoSymbol ]
+ };
+};
+
+// for this reason pushing no-breaking spaces to level4 is the safe default nowadays
+partial
+xkb_symbols "level4" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, space, space, nobreakspace ]
+ };
+};
+
+
+////////////////////////////////////////
+// Narrow No-Break Space
+
+// level3n provides narrow no-breaking space in addition to the normal one
+partial
+xkb_symbols "level3n" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, space, nobreakspace, 0x100202F ]
+ };
+};
+
+// level4n provides narrow no-breaking space in addition to the normal one
+partial
+xkb_symbols "level4n" {
+ key <SPCE> {
+ type[Group1]="EIGHT_LEVEL",
+ symbols[Group1]= [ space, space, space, nobreakspace, space, 0x100202F, NoSymbol, NoSymbol ]
+ };
+};
+
+// level4nl provides narrow no-breaking space in addition to the normal one
+// without forcing the use of level5 for mostly four-level layouts
+// Used by fr(oss), be(oss)…
+partial
+xkb_symbols "level4nl" {
+ key <SPCE> {
+ type[Group1]="LOCAL_EIGHT_LEVEL",
+ symbols[Group1]= [ space, space, space, nobreakspace, space, 0x100202F, NoSymbol, NoSymbol ]
+ };
+};
+
+
+////////////////////////////////////////
+// Zero-Width Non-Joiner & Zero-Width Joiner
+// Author: Behnam Esfahbod <behnam@esfahbod.info>
+
+// ZWNJ and ZWJ are widely used in Persian, Kurdinsh, Pashto, Uzbek and other
+// languages that use PersoArabic script.
+
+
+// ZWNJ on level 2
+partial
+xkb_symbols "zwnj2" {
+ key <SPCE> {
+ type[Group1]="TWO_LEVEL",
+ symbols[Group1]= [ space, 0x100200c ]
+ };
+};
+
+
+// ZWNJ on level 2
+// ZWJ on level 3
+partial
+xkb_symbols "zwnj2zwj3" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, 0x100200d ]
+ };
+};
+
+
+// ZWNJ on level 2
+// ZWJ on level 3
+// NBSP on level 4
+partial
+xkb_symbols "zwnj2zwj3nb4" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, 0x100200d, nobreakspace ]
+ };
+};
+
+// ZWNJ on level 2
+// NBSP on level 3
+// Used by ir(ku_ara), af(basic), af(ps), af(uz), af(olpc-fa), af(olpc-ps), af(olpc-uz)
+partial
+xkb_symbols "zwnj2nb3" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, nobreakspace ]
+ };
+};
+
+
+// ZWNJ on level 2
+// NBSP on level 3
+partial
+xkb_symbols "zwnj2nb3s" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, nobreakspace, NoSymbol ]
+ };
+};
+
+
+// ZWNJ on level 2
+// NBSP on level 3
+// ZWJ on level 4
+partial
+xkb_symbols "zwnj2nb3zwj4" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, nobreakspace, 0x100200d ]
+ };
+};
+
+
+// ZWNJ on level 2
+// NBSP on level 3
+// NNBSP on level 4
+// Used by ir(pes)
+partial
+xkb_symbols "zwnj2nb3nnb4" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, nobreakspace, 0x100202F ]
+ };
+};
+
+
+// ZWNJ on level 3
+// ZWJ on level 4
+// Used by in(deva), in(olpc)
+partial
+xkb_symbols "zwnj3zwj4" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, space, 0x100200c, 0x100200d ]
+ };
+};
+
+
+// NBSP on level 2
+// ZWNJ on level 3
+// Used by lk(sin_phonetic)
+partial
+xkb_symbols "nb2zwnj3s" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, nobreakspace, 0x100200c, NoSymbol ]
+ };
+};
diff --git a/test/data/symbols/pc b/test/data/symbols/pc
new file mode 100644
index 0000000..0199713
--- /dev/null
+++ b/test/data/symbols/pc
@@ -0,0 +1,87 @@
+default partial alphanumeric_keys modifier_keys
+xkb_symbols "pc105" {
+
+ key <ESC> { [ Escape ] };
+
+ // The extra key on many European keyboards:
+ key <LSGT> { [ less, greater, bar, brokenbar ] };
+
+ // The following keys are common to all layouts.
+ key <BKSL> { [ backslash, bar ] };
+ key <SPCE> { [ space ] };
+
+ include "srvr_ctrl(fkey2vt)"
+ include "pc(editing)"
+ include "keypad(x11)"
+
+ key <BKSP> { [ BackSpace, BackSpace ] };
+
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <RTRN> { [ Return ] };
+
+ key <CAPS> { [ Caps_Lock ] };
+ key <NMLK> { [ Num_Lock ] };
+
+ key <LFSH> { [ Shift_L ] };
+ key <LCTL> { [ Control_L ] };
+ key <LWIN> { [ Super_L ] };
+
+ key <RTSH> { [ Shift_R ] };
+ key <RCTL> { [ Control_R ] };
+ key <RWIN> { [ Super_R ] };
+ key <MENU> { [ Menu ] };
+
+ // Beginning of modifier mappings.
+ modifier_map Shift { Shift_L, Shift_R };
+ modifier_map Lock { Caps_Lock };
+ modifier_map Control{ Control_L, Control_R };
+ modifier_map Mod2 { Num_Lock };
+ modifier_map Mod4 { Super_L, Super_R };
+
+ // Fake keys for virtual<->real modifiers mapping:
+ key <LVL3> { [ ISO_Level3_Shift ] };
+ key <MDSW> { [ Mode_switch ] };
+ modifier_map Mod5 { <LVL3>, <MDSW> };
+
+ key <ALT> { [ NoSymbol, Alt_L ] };
+ include "altwin(meta_alt)"
+
+ key <META> { [ NoSymbol, Meta_L ] };
+ modifier_map Mod1 { <META> };
+
+ key <SUPR> { [ NoSymbol, Super_L ] };
+ modifier_map Mod4 { <SUPR> };
+
+ key <HYPR> { [ NoSymbol, Hyper_L ] };
+ modifier_map Mod4 { <HYPR> };
+ // End of modifier mappings.
+
+ key <OUTP> { [ XF86Display ] };
+ key <KITG> { [ XF86KbdLightOnOff ] };
+ key <KIDN> { [ XF86KbdBrightnessDown ] };
+ key <KIUP> { [ XF86KbdBrightnessUp ] };
+};
+
+hidden partial alphanumeric_keys
+xkb_symbols "editing" {
+ key <PRSC> {
+ type= "PC_ALT_LEVEL2",
+ symbols[Group1]= [ Print, Sys_Req ]
+ };
+ key <SCLK> { [ Scroll_Lock ] };
+ key <PAUS> {
+ type= "PC_CONTROL_LEVEL2",
+ symbols[Group1]= [ Pause, Break ]
+ };
+ key <INS> { [ Insert ] };
+ key <HOME> { [ Home ] };
+ key <PGUP> { [ Prior ] };
+ key <DELE> { [ Delete ] };
+ key <END> { [ End ] };
+ key <PGDN> { [ Next ] };
+
+ key <UP> { [ Up ] };
+ key <LEFT> { [ Left ] };
+ key <DOWN> { [ Down ] };
+ key <RGHT> { [ Right ] };
+};
diff --git a/test/data/symbols/ru b/test/data/symbols/ru
new file mode 100644
index 0000000..964705c
--- /dev/null
+++ b/test/data/symbols/ru
@@ -0,0 +1,961 @@
+// Keyboard layouts for Russia.
+// AEN <aen@logic.ru>
+// 2001/12/23 by Leon Kanter <leon@blackcatlinux.com>
+// 2005/12/09 Valery Inozemtsev <shrek@altlinux.ru>
+
+// Windows layout
+default partial alphanumeric_keys
+xkb_symbols "winkeys" {
+
+ include "ru(common)"
+ name[Group1]= "Russian";
+
+ key <AE03> { [ 3, numerosign ] };
+ key <AE04> { [ 4, semicolon ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, colon ] };
+ key <AE07> { [ 7, question ] };
+ key <AE08> { [ 8, asterisk, U20BD ] };
+
+ key <AB10> { [ period, comma ] };
+ key <BKSL> { [ backslash, slash ] };
+};
+
+hidden partial alphanumeric_keys
+xkb_symbols "common" {
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, quotedbl ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, asterisk ] };
+ key <AE05> { [ 5, colon ] };
+ key <AE06> { [ 6, comma ] };
+ key <AE07> { [ 7, period ] };
+ key <AE08> { [ 8, semicolon ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSL> { [ backslash, bar ] };
+
+ key <AB10> { [ slash, question ] };
+ key <LSGT> { [ slash, bar ] };
+
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
+
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
+
+ include "kpdl(comma)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "legacy" {
+
+ include "ru(common)"
+ name[Group1]= "Russian (legacy)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+ include "ru(common)"
+
+ key <TLDE> { [ 0x01000451, 0x01000401, grave ] }; // Ñ‘, Ð
+ key <AE03> { [ 3, numbersign, 0x01002116 ] }; // â„–
+ key <AE04> { [ 4, dollar, semicolon ] };
+ key <AE06> { [ 6, asciicircum, colon ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE09> { [ 9, parenleft, acute ] };
+ key <AC12> { [ backslash, bar, slash ] };
+
+ include "group(olpc)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "typewriter" {
+
+ include "ru(common)"
+ name[Group1]= "Russian (typewriter)";
+
+ key <TLDE> { [ bar, plus ] };
+ key <AE01> { [ numerosign, 1 ] };
+ key <AE02> { [ minus, 2 ] };
+ key <AE03> { [ slash, 3 ] };
+ key <AE04> { [ quotedbl, 4 ] };
+ key <AE05> { [ colon, 5 ] };
+ key <AE06> { [ comma, 6 ] };
+ key <AE07> { [ period, 7 ] };
+ key <AE08> { [ underscore, 8 ] };
+ key <AE09> { [ question, 9 ] };
+ key <AE10> { [ percent, 0 ] };
+ key <AE11> { [ exclam, equal ] };
+ key <AE12> { [ semicolon, backslash ] };
+
+ key <BKSL> { [ parenright, parenleft ] };
+
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "typewriter-legacy" {
+
+ include "ru(common)"
+ name[Group1]= "Russian (typewriter, legacy)";
+
+ key <TLDE> { [ apostrophe, quotedbl ] };
+ key <AE01> { [ exclam, 1 ] };
+ key <AE02> { [ numerosign, 2 ] };
+ key <AE03> { [ slash, 3 ] };
+ key <AE04> { [ semicolon, 4 ] };
+ key <AE05> { [ colon, 5 ] };
+ key <AE06> { [ comma, 6 ] };
+ key <AE07> { [ period, 7 ] };
+ key <AE08> { [ underscore, 8 ] };
+ key <AE09> { [ question, 9 ] };
+ key <AE10> { [ percent, 0 ] };
+
+ key <BKSL> { [ parenleft, parenright ] };
+
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "phonetic" {
+
+ name[Group1]= "Russian (phonetic)";
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, Cyrillic_io ] };
+ key <AE04> { [ 4, Cyrillic_IO ] };
+ key <AE05> { [ 5, Cyrillic_hardsign ] };
+ key <AE06> { [ 6, Cyrillic_HARDSIGN ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+ key <AB08> { [ comma, less ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+ key <LSGT> { [ bar, brokenbar ] };
+
+ key <TLDE> { [ Cyrillic_yu, Cyrillic_YU ] };
+ key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
+ key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <LatX> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <LatV> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AE12> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <BKSL> { [ Cyrillic_e, Cyrillic_E ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "phonetic_winkeys" {
+
+ include "ru(phonetic)"
+ name[Group1]= "Russian (phonetic, with Win keys)";
+
+ key <LatX> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatH> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AE12> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "tt" {
+
+ include "ru(winkeys)"
+ name[Group1]= "Tatar";
+
+ key.type[group1]="FOUR_LEVEL";
+
+ key <TLDE> { [ 0x010004bb, 0x010004ba, Cyrillic_io, Cyrillic_IO ] };
+ key <AD02> { [ 0x010004e9, 0x010004e8, Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD09> { [ 0x010004d9, 0x010004d8, Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AD12> { [ 0x010004af, 0x010004ae, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <AC10> { [ 0x010004a3, 0x010004a2, Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AB07> { [ 0x01000497, 0x01000496, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "os_legacy" {
+
+ include "ru(common)"
+ name[Group1]= "Ossetian (legacy)";
+
+ key <TLDE> { [ Cyrillic_e, Cyrillic_E ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O, Cyrillic_io, Cyrillic_IO ] };
+ key <AC11> { [ 0x010004D5, 0x010004D4 ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "os_winkeys" {
+
+ include "ru(winkeys)"
+ name[Group1]= "Ossetian (Win keys)";
+
+ key <TLDE> { [ Cyrillic_e, Cyrillic_E ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O, Cyrillic_io, Cyrillic_IO ] };
+ key <AC11> { [ 0x010004D5, 0x010004D4 ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "cv" {
+
+ include "ru(winkeys)"
+ name[Group1]= "Chuvash";
+
+ key.type[group1]="FOUR_LEVEL";
+
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, 0x010004f3, 0x010004f2 ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, 0x010004d7, 0x010004d6 ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A, 0x010004d1, 0x010004d0 ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES, 0x010004ab, 0x010004aa ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "udm" {
+
+ include "ru(winkeys)"
+ name[Group1]= "Udmurt";
+
+ key.type[group1]="FOUR_LEVEL";
+
+ key <AE01> { [ question, exclam, 1, 1 ] };
+ key <AE02> { [ parenleft, quotedbl, 2, 2 ] };
+ key <AE03> { [ parenright, numerosign, 3, 3 ] };
+ key <AE04> { [ colon, semicolon, 4, 4 ] };
+ key <AE05> { [ asterisk, percent, 5, 5 ] };
+ key <AE06> { [ 0x010004dd, 0x010004dc, 6, 6 ] };
+ key <AE07> { [ 0x010004e7, 0x010004e6, 7, 7 ] };
+ key <AE08> { [ 0x010004f5, 0x010004f4, 8, 8 ] };
+ key <AE09> { [ 0x010004e5, 0x010004e4, 9, 9 ] };
+ key <AE10> { [ 0x010004df, 0x010004de, 0, 0 ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "cv_latin" {
+
+ include "us(alt-intl)"
+ name[Group1]= "Chuvash (Latin)";
+
+ key.type[group1]="FOUR_LEVEL";
+
+ key <AD01> { [ q, Q, 0x01000161, 0x01000160 ] };
+ key <AD02> { [ w, W, udiaeresis, Udiaeresis ] };
+ key <AD03> { [ e, E, 0x01000115, 0x01000114 ] };
+ key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AD08> { [ i, I, 0x0100012d, 0x0100012c ] };
+ key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
+ key <AC01> { [ a, A, abreve, Abreve ] };
+ key <AC02> { [ s, S, scedilla, Scedilla ] };
+ key <AC05> { [ g, G, gbreve, Gbreve ] };
+ key <AC07> { [ j, J, 0x01000131, 0x01000130 ] };
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Komi language layout
+// Vlad Shakhov <lumpen.intellectual@gmail.com>
+// last changes 2007/10/23
+partial alphanumeric_keys
+xkb_symbols "kom" {
+
+ include "ru(winkeys)"
+ name[Group1]= "Komi";
+
+ key.type[group1]="FOUR_LEVEL_ALPHABETIC";
+
+ // cyrilllic o with diaeresis
+ key <AC07> { [ Cyrillic_o, Cyrillic_O, U04E7, U04E6 ] };
+
+ // hard I as additional key for soft Cyrillic_I
+ key <AB05> { [ Cyrillic_i, Cyrillic_I, Ukrainian_i, Ukrainian_I ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Yakut language layout
+// 2008/04/23 Yakov Aleksandrov <bertjickty@yandex.ru>
+// 2008/04/23 Anatoliy Zhozhikov <jav@sitc.ru>
+// 2008/04/23 Aleksandr Varlamov
+partial alphanumeric_keys
+xkb_symbols "sah" {
+
+ include "ru(winkeys)"
+ name[Group1]= "Yakut";
+
+ key.type[group1]="FOUR_LEVEL_ALPHABETIC";
+
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO, U04EB, U04EA ] };
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI, U048B, U048A ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, Cyrillic_u_straight, Cyrillic_U_straight ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, U04C4, U04C3 ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN, U04A5, U04A4 ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, U0495, U0494 ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, U04E1, U04E0 ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_shha, Cyrillic_SHHA ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O, Cyrillic_o_bar, Cyrillic_O_bar ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE, U0461, U0460 ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE, Cyrillic_u_macron, Cyrillic_U_macron ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM, U04C8, U04C7 ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I, Cyrillic_i_macron, Cyrillic_I_macron ] };
+
+ include "level3(ralt_switch)"
+};
+
+
+//Kalmyk language layout
+//based on the Kalmyk language layout: http://soft.oyrat.org/
+//Nikolay Korneev <halmg@oyrat.org>
+//Toli Miron <mirontoli@gmail.com>
+partial alphanumeric_keys
+xkb_symbols "xal" {
+
+ include "ru(winkeys)"
+ name[Group1]= "Kalmyk";
+
+ key.type[group1]="FOUR_LEVEL";
+
+ key <AE01> { [ question, exclam, 1 ] };
+ key <AE02> { [ numerosign, quotedbl, 2 ] };
+ key <AE03> { [ Cyrillic_u_straight, Cyrillic_U_straight, 3 ] };
+ key <AE04> { [ Cyrillic_schwa, Cyrillic_SCHWA, 4 ] };
+ key <AE05> { [ asterisk, percent, 5 ] };
+ key <AE06> { [ Cyrillic_en_descender, Cyrillic_EN_descender, 6 ] };
+ key <AE07> { [ Cyrillic_o_bar, Cyrillic_O_bar, 7 ] };
+ key <AE08> { [ Cyrillic_shha, Cyrillic_SHHA, 8 ] };
+ key <AE09> { [ Cyrillic_zhe_descender, Cyrillic_ZHE_descender, 9 ] };
+ key <AE10> { [ semicolon, colon, 0 ] };
+
+ key <TLDE> { [ parenleft, parenright, Cyrillic_io, Cyrillic_IO ] };
+
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, dollar ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, EuroSign ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, registered ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, trademark ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA, bracketleft ] };
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, bracketright ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E, apostrophe ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES, copyright ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE, less ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU, greater ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "dos" {
+
+ include "ru(common)"
+ name[Group1]= "Russian (DOS)";
+
+ key <TLDE> { [ parenright, parenleft ] };
+ key <AE04> { [ 4, currency ] };
+ key <AE09> { [ 9, question ] };
+ key <AE10> { [ 0, percent ] };
+
+ key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "bak" {
+
+ include "ru(winkeys)"
+ name[Group1]= "Bashkirian";
+
+ key.type[group1]="FOUR_LEVEL";
+
+ key <TLDE> { [ 0x010004d9, 0x010004d8, Cyrillic_io, Cyrillic_IO ] };
+ key <AE01> { [ exclam, quotedbl, 1, 1 ] };
+ key <AE02> { [ 0x010004e9, 0x010004e8, 2, 2 ] };
+ key <AE03> { [ 0x010004a1, 0x010004a0, 3, 3 ] };
+ key <AE04> { [ 0x01000493, 0x01000492, 4, 4 ] };
+ key <AE05> { [ 0x010004ab, 0x010004aa, 5, 5 ] };
+ key <AE06> { [ colon, semicolon, 6, 6 ] };
+ key <AE07> { [ 0x01000499, 0x01000498, 7, 7 ] };
+ key <AE08> { [ 0x010004bb, 0x010004ba, 8, 8 ] };
+ key <AE09> { [ question, parenleft, 9, 9 ] };
+ key <AE10> { [ numerosign, parenright, 0, 0 ] };
+ key <AE11> { [ minus, percent, minus, underscore ] };
+ key <AE12> { [ 0x010004af, 0x010004ae, equal, plus ] };
+ key <BKSL> { [ 0x010004a3, 0x010004a2, backslash, slash ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Serbian characters are added as third-level symbols to Russian keyboard layout.
+partial alphanumeric_keys
+xkb_symbols "srp" {
+
+ include "ru(common)"
+ name[Group1]= "Serbian (Russia)";
+
+ key <AE03> { [ 3, numerosign ] };
+ key <AE04> { [ 4, semicolon ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, colon ] };
+ key <AE07> { [ 7, question ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AB10> { [ period, comma ] };
+ key <BKSL> { [ backslash, slash ] };
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI, U458, U408 ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN, U45A, U40A ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL, U459, U409 ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE, U45F, U40F ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE, U452, U402 ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE, U45B, U40B ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Mari language layout
+// http://www.marlamuter.com/
+// Last edit by Viatcheslav Kileev (slavakileev@yandex.ru)
+partial alphanumeric_keys
+xkb_symbols "chm" {
+
+ include "ru(winkeys)"
+ name[Group1]= "Mari";
+
+ key.type[group1]="FOUR_LEVEL_ALPHABETIC";
+
+ key <AC04> { [ Cyrillic_a, Cyrillic_A, U04D3, U04D2 ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, U04F1, U04F0 ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU, U04F9, U04F8 ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN, U04A5, U04A4 ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O, U04E7, U04E6 ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "phonetic_azerty" {
+
+ include "level3(ralt_switch)"
+
+ name[Group1]= "Russian (phonetic, AZERTY)";
+
+ key <AE01> { [ ampersand, 1, onesuperior, exclamdown ] };
+ key <AE02> { [ eacute, 2, asciitilde, oneeighth ] };
+ key <AE03> { [ quotedbl, 3, numbersign, sterling ] };
+ key <AE04> { [apostrophe, 4, braceleft, dollar ] };
+ key <AE05> { [ parenleft, 5, bracketleft, threeeighths ] };
+ key <AE06> { [ minus, 6, bar, fiveeighths ] };
+ key <AE07> { [ egrave, 7, grave, seveneighths ] };
+ key <AE08> { [underscore, 8, backslash, trademark ] };
+ key <AE09> { [ ccedilla, 9, asciicircum, plusminus ] };
+ key <AE10> { [ agrave, 0, at, degree ] };
+ key <AE11> { [parenright, degree, bracketright, questiondown ] };
+ key <AE12> { [ equal, plus, braceright, dead_ogonek ] };
+
+ key <AB07> { [ comma, question, acute, doubleacute ] };
+ key <AB08> { [ semicolon, period, horizconnector, multiply ] };
+ key <AB09> { [ colon, slash, periodcentered, division ] };
+ key <AB10> { [ exclam, section, dead_belowdot, dead_abovedot ] };
+
+ key <AC11> { [ ugrave, percent, asciicircum, caron ] };
+ key <LSGT> { [ bar, brokenbar ] };
+
+ key <TLDE> { [ Cyrillic_yu, Cyrillic_YU ] };
+ key <AC01> { [ Cyrillic_ya, Cyrillic_YA ] }; // Q
+ key <AD02> { [ Cyrillic_ze, Cyrillic_ZE ] }; // Z
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AD01> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AB01> { [ Cyrillic_ve, Cyrillic_VE ] }; // W
+ key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <LatX> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <LatV> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC10> { [ Cyrillic_em, Cyrillic_EM ] }; // M
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AE12> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <BKSL> { [ Cyrillic_e, Cyrillic_E ] };
+};
+
+// Russian dvorak phonetic layout
+// Oleg Zalizniak <ramaloke at gmail.com>
+partial alphanumeric_keys
+xkb_symbols "phonetic_dvorak" {
+ include "level3(ralt_switch)"
+
+ name[Group1]= "Russian (phonetic, Dvorak)";
+
+ key <TLDE> { [ Cyrillic_yu, Cyrillic_YU ] };
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, Cyrillic_io ] };
+ key <AE04> { [ 4, Cyrillic_IO ] };
+ key <AE05> { [ 5, Cyrillic_hardsign ] };
+ key <AE06> { [ 6, Cyrillic_HARDSIGN ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AE12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <BKSL> { [ Cyrillic_e, Cyrillic_E ] };
+
+ key <AD01> { [ apostrophe, quotedbl, dead_acute, dead_diaeresis ] };
+ key <AD02> { [ comma, less, dead_cedilla, dead_caron ] };
+ key <AD03> { [ period, greater, dead_abovedot, periodcentered ] };
+ key <AD04> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AD05> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AD06> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AD08> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD09> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <AD10> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AD11> { [ slash, question ] };
+ key <AD12> { [ Cyrillic_che, Cyrillic_CHE ] };
+
+ key <AC01> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AC02> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AC03> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <AC04> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AC05> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AC06> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AC07> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AC08> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <AC09> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AC10> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AC11> { [ minus, underscore ] };
+
+ key <AB01> { [ semicolon, colon, dead_ogonek, dead_doubleacute ] };
+ key <AB02> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AB03> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <AB04> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <AB05> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
+ key <AB06> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AB07> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB08> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AB09> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AB10> { [ Cyrillic_ze, Cyrillic_ZE ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "phonetic_fr" {
+
+ include "fr"
+ include "ru(phonetic_azerty)"
+
+ name[Group1]= "Russian (phonetic, French)";
+};
+
+// Rulemak, Colemak based Russian phonetic layout
+// contact: Geert Hendrickx <geert@hendrickx.be>
+// http://forum.colemak.com/viewtopic.php?id=519
+
+partial alphanumeric_keys
+xkb_symbols "rulemak" {
+ include "us(basic)"
+
+ name[Group1]= "Russian (Rulemak, phonetic Colemak)";
+
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO, U0300, asciitilde ] };
+ key <AE01> { [ 1, exclam, U0301 ] };
+ key <AE02> { [ 2, at, U030B ] };
+ key <AE03> { [ 3, numerosign, numbersign ] };
+ key <AE04> { [ 4, dollar, cent ] };
+ key <AE05> { [ 5, percent, EuroSign ] };
+ key <AE06> { [ 6, asciicircum, U0306 ] };
+ key <AE07> { [ 7, ampersand, U0307 ] };
+ key <AE08> { [ 8, asterisk, U20BD ] };
+ key <AE09> { [ 9, parenleft, bracketleft ] };
+ key <AE10> { [ 0, parenright, bracketright ] };
+ key <AE11> { [ minus, underscore, endash, emdash ] };
+ key <AE12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, equal, plus ] };
+
+ key <AD01> { [ Cyrillic_ya, Cyrillic_YA, q, Q ] };
+ key <AD02> { [ Cyrillic_zhe, Cyrillic_ZHE, w, W ] };
+ key <AD03> { [ Cyrillic_ef, Cyrillic_EF, f, F ] };
+ key <AD04> { [ Cyrillic_pe, Cyrillic_PE, p, P ] };
+ key <AD05> { [ Cyrillic_ghe, Cyrillic_GHE, g, G ] };
+ key <AD06> { [ Cyrillic_shorti, Cyrillic_SHORTI, j, J ] };
+ key <AD07> { [ Cyrillic_el, Cyrillic_EL, l, L ] };
+ key <AD08> { [ Cyrillic_u, Cyrillic_U, u, U ] };
+ key <AD09> { [ Cyrillic_yeru, Cyrillic_YERU, y, Y ] };
+ key <AD10> { [ Cyrillic_yu, Cyrillic_YU, semicolon, colon ] };
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA, guillemotleft, braceleft ] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA, guillemotright, braceright ] };
+ key <BKSL> { [ Cyrillic_e, Cyrillic_E, backslash, bar ] };
+
+ key <AC01> { [ Cyrillic_a, Cyrillic_A, a, A ] };
+ key <AC02> { [ Cyrillic_er, Cyrillic_ER, r, R ] };
+ key <AC03> { [ Cyrillic_es, Cyrillic_ES, s, S ] };
+ key <AC04> { [ Cyrillic_te, Cyrillic_TE, t, T ] };
+ key <AC05> { [ Cyrillic_de, Cyrillic_DE, d, D ] };
+ key <AC06> { [ Cyrillic_che, Cyrillic_CHE, h, H ] };
+ key <AC07> { [ Cyrillic_en, Cyrillic_EN, n, N ] };
+ key <AC08> { [ Cyrillic_ie, Cyrillic_IE, e, E ] };
+ key <AC09> { [ Cyrillic_i, Cyrillic_I, i, I ] };
+ key <AC10> { [ Cyrillic_o, Cyrillic_O, o, O ] };
+ key <AC11> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, apostrophe, quotedbl ] };
+
+ key <AB01> { [ Cyrillic_ze, Cyrillic_ZE, z, Z ] };
+ key <AB02> { [ Cyrillic_ha, Cyrillic_HA, x, X ] };
+ key <AB03> { [ Cyrillic_tse, Cyrillic_TSE, c, C ] };
+ key <AB04> { [ Cyrillic_ve, Cyrillic_VE, v, V ] };
+ key <AB05> { [ Cyrillic_be, Cyrillic_BE, b, B ] };
+ key <AB06> { [ Cyrillic_ka, Cyrillic_KA, k, K ] };
+ key <AB07> { [ Cyrillic_em, Cyrillic_EM, m, M ] };
+ key <AB08> { [ comma, semicolon, less ] };
+ key <AB09> { [ period, colon, greater ] };
+ key <AB10> { [ slash, question ] };
+
+ key <CAPS> { [ BackSpace, BackSpace, BackSpace, BackSpace ] };
+ key <LSGT> { [ U0301, asciitilde, grave ] };
+ key <SPCE> { [ space, space, space, nobreakspace ] };
+ key <MENU> { [ Mode_switch, Multi_key ] };
+
+ include "level3(ralt_switch)"
+};
+
+// EXTRAS:
+
+// Church Slavonic language layout
+// based on the Russian standard keyboard
+// by Aleksandr Andreev and Yuri Shardt
+// last changes 2010/08/01; contact <aleksandr.andreev@gmail.com>
+partial alphanumeric_keys
+xkb_symbols "chu" {
+
+ name[Group1]= "Church Slavonic";
+
+ key <TLDE> { [ U0457, U0407, U0482, U20DD ] }; // ї Ї ҂ e.g: а⃝ where the last is a combining ten thousands sign
+ key <AE01> { [ U0461, U0460, U047D, U047C ] }; // ѡ Ѡ ѽ Ѽ
+ key <AE02> { [ U0454, U0404, U0465, U0464 ] }; // є Є ѥ Ѥ
+ key <AE03> { [ U046F, U046E, U0469, U0468 ] }; // ѯ Ѯ ѩ Ѩ
+ key <AE04> { [ U0471, U0470, U046D, U046C ] }; // ѱ Ѱ ѭ Ѭ
+ key <AE05> { [ U0473, U0472, UA657, UA656 ] }; // ѳ Ѳ iotified A
+ key <AE06> { [ U0475, U0474, U0477, U0476 ] }; // ѵ Ѵ ѷ Ѷ
+ key <AE07> { [ U047B, U047A, UA64D, UA64C ] }; // ѻ Ѻ ꙍ Ꙍ
+ key <AE08> { [ U047F, U047E, U046B, U046A ] }; // ѿ Ѿ ѫ Ѫ
+ key <AE09> { [ U0455, U0405,parenleft,U002A ] }; // ѕ Ѕ ( *
+ key <AE10> { [Cyrillic_u,Cyrillic_U,parenright,U0488]}; // у У ) NB: for digraph Ouk, use Cyrillic_o + Cyrillic_u
+ key <AE11> { [ U0483, U0486, U0487, U005F ] }; // а҃ а҆ а҇, _ (titlo, psili, pokrytie, underscore)
+ key <AE12> { [ U0301, U0300, U0484, UA67E ] }; // а̀ а́ а҄ ꙾ (oxia, varia, kamora, kavyka)
+
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI, U0456 ] };
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, U2DF0 ] };
+ key <AD03> { [ UA64B, UA64A, U2DF9 ] }; // Cyrillic monograph Uk (not U)!
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, U2DE6 ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, U2DF7 ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN, U2DE9 ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, U2DE2 ] };
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA, U2DF2 ] };
+ key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA, U2DF3 ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, U2DE5 ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA, U2DEF ] };
+ key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN, UA67D ] }; // Payerok
+ key <BKSL> { [ backslash, slash, colon, question ] }; // \ / : ? NB: for Slavonic question, use semicolon
+
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE, U2DE1 ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A, U2DF6 ] };
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE, U2DEB ] };
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER, U2DEC ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O, U2DEA ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL, U2DE7 ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE, U2DE3 ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE, U2DE4 ] };
+ key <AC11> { [ U0463, U0462, U2DFA ] }; // Yat
+
+ key <AB01> { [ U0467, U0466, U2DFD ] }; // Small Yus
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE, U2DF1 ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES, U2DED ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM, U2DE8 ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE, U2DEE ] };
+ key <AB07> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE, U2DE0 ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU, U2DFB ] };
+ key <AB10> { [ period, comma, semicolon, exclam ] };
+};
+
+
+// RUU (Russian-Ukrainian United keyboard layout).
+// This is a modified Russian standard keyboard, with the third level containing
+// Ukrainian and Belorusian alphabetic letters and commonly used Unicode symbols.
+// For a description see http://wiki.opennet.ru/RUU [in Russian].
+// Vasyĺ V. Vercynśkyj <fuckel@ukr.net>
+// last changes 2011/05/11
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
+// │ ' ~ │ ! ≈ │ " ∞ │ № ₴ │ ; € │ % ‰ │ : ≤ │ ? ≥ │ * × │ ( { │ ) } │ _ – │ + ± ┃ ⌫ ┃
+// │ ’ ́ │ 1 ÷ │ 2 ¤ │ 3 § │ 4 $ │ 5 ° │ 6 < │ 7 > │ 8 • │ 9 [ │ 0 ] │ - — │ = ≠ ┃Backspace┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
+// ┃ ┃ Й │ Ц │ У Ў │ К │ Е Ё │ Н │ Г Ґ │ Ш │ Щ │ З │ Х │ Ъ Ї ┃ Enter ┃
+// ┃ Tab ↹ ┃ й │ ц │ у ў │ к ® │ е ё │ н │ г ґ │ ш │ щ │ з │ х │ ъ ї ┃ ⏎ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃ Caps ┃ Ф │ Ы І │ В │ А │ П │ Р │ О │ Л │ Д │ Ж │ Э Є │ | ¦ ┃ ┃
+// ┃ Lock ⇬ ┃ ф │ ы і │ в │ а │ п │ р │ о │ л │ д │ ж │ э є │ / \ ┃ ┃
+// ┣━━━━━━━━┻━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┲━━━┷━━━━━┻━━━━━━┫
+// ┃ ┃ Я │ Ч │ С │ М │ И │ Т │ Ь │ Б „ │ Ю “ │ , … ┃ ┃
+// ┃ Shift ⇧ ┃ я │ ч │ с © │ м │ и │ т ™ │ ь µ │ б « │ ю » │ . / ┃ Shift ⇧ ┃
+// ┣━━━━━━━┳━━┻━━━━┳┷━━━━━┷┱────┴─────┴─────┴─────┴─────┴─────┴┲━━━━┷━━┳━━┻━━━━┳━━━━━━━┳━━━┛
+// ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
+// ┃ Ctrl ┃ Meta ┃ Alt ┃ Space ┃AltGr ⇮┃ Menu ┃ Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
+partial alphanumeric_keys
+xkb_symbols "ruu" {
+
+ include "ru(common)"
+ name[Group1]= "Russian (with Ukrainian-Belorussian layout)";
+
+ key <TLDE> { [ U2019, apostrophe, U0301, asciitilde ] }; // Apostrophe and Stress symbol
+ key <AE01> { [ 1, exclam, U00F7, U2248 ] }; // Division Sign and Almost Equal To
+ key <AE02> { [ 2, quotedbl, currency, infinity ] };
+ key <AE03> { [ 3, numerosign, U00A7, U20B4 ] }; // Paragraph and Hryvnia sign
+ key <AE04> { [ 4, semicolon, dollar, EuroSign ] };
+ key <AE05> { [ 5, percent, degree, U2030 ] }; // Per Mille Sign
+ key <AE06> { [ 6, colon, less, U2264 ] }; // Less-Than Or Equal To
+ key <AE07> { [ 7, question, greater, U2265 ] }; // Greater-Than Or Equal To
+ key <AE08> { [ 8, asterisk, enfilledcircbullet, U00D7 ] }; // Multiplication Sign
+ key <AE09> { [ 9, parenleft, bracketleft, braceleft ] };
+ key <AE10> { [ 0, parenright, bracketright, braceright ] };
+ key <AE11> { [ minus, underscore, emdash, endash ] };
+ key <AE12> { [ equal, plus, notequal, plusminus ] };
+
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, Byelorussian_shortu, Byelorussian_SHORTU ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, registered ] }; // Registered tm
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, U00B6 ] }; // Pilcrow Sign
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, Ukrainian_yi, Ukrainian_YI ] };
+
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU, Ukrainian_i, Ukrainian_I ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie, Ukrainian_IE ] };
+ key <BKSL> { [ slash, bar, backslash, U00A6 ] }; // Broken Bar
+
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES, copyright ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE, trademark ] };
+ key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, U00B5 ] }; // Micro Sign
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE, guillemotleft, doublelowquotemark ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU, guillemotright, leftdoublequotemark ] };
+ key <AB10> { [ period, comma, slash, ellipsis ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+ xkb_symbols "sun_type6" {
+ include "sun_vndr/ru(sun_type6)"
+};
+
+// Apple layout
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ include "ru(common)"
+ name[Group1]= "Russian (Macintosh)";
+
+ key <LSGT> { [ less, greater ] };
+ key <AE02> { [ 2, quotedbl ] };
+ key <AE03> { [ 3, numerosign ] };
+ key <AE04> { [ 4, percent ] };
+ key <AE05> { [ 5, colon ] };
+ key <AE06> { [ 6, comma ] };
+ key <AE07> { [ 7, period ] };
+ key <AE08> { [ 8, semicolon ] };
+ key <TLDE> { [ bracketright, bracketleft ] };
+ key <BKSL> { [ Cyrillic_io, Cyrillic_IO ] };
+
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER, U20BD ] };
+
+ include "level3(ralt_switch)"
+};
+
+// eng: Russian-based polyglot and reactionary keyboard layout
+// This keyboard layout covers Russian in Petrine 1708 and Bolshevik 1918 variant spelling, Ukrainian, Belorussian, Serbian in its modern and Slavenoserbian variants, and Bulgarian and Slavomacedonian in pre-1945 and post-1945 spelling,
+// in short all in any dominion prevailing Cyrillic orthographies of modern secular Slavic literary languages, even with dictionary accentuation marks,
+// but also the most-widespread Church Slavonic spellings, that is all Church-Slavonic in so far as variants can be replaced without loss of meaning – not to speak of Interslavic.
+// Furthermore, it suffices Romanian Cyrillic, Moldovan Cyrillic, Abkhazian excluding the more clumsy obsoleted forms unlikely to find devotees, Tajik, all Turkic and Mongolic Cyrillic alphabets
+// and virtually all overlooked languages in Cyrillic reigns at least by combining characters, taking advantage of eight key levels.
+// This is withal a pan-Cyrillic keyboard layout, or a comprehensive Cyrillic keyboard layout, an universal Cyrillic keyboard layout, a generic Cyrillic keyboard layout.
+//
+// rus: Многоязыковая и реакціонная клавіатурная разкладка основана на русскихъ
+// Сія разкладка покрываетъ русскій въ петровскомъ правописаніи 1708-го года и большевицкомъ 1918-го, украинскій, бѣлорусскій въ современномъ и славяносербскомъ видѣ, и булгарскій и славомацедонскій въ писаніи до и послѣ 1945-го года,
+// короче всѣ въ какомъ-либо державствѣ преобладающія правописанія, то есть весь церкославянскій, поскольку какъ разные виды буквъ можно возмѣщать безъ потери значенія — не говоря о междуславянскомъ.
+// Свѣрхъ этого, она подходитъ къ румынской кириллицѣ, къ молдавской кириллицѣ, къ абхазскому за изключеніемъ неуклюжихъ устарѣлыхъ образовъ, у которыхъ невѣроятно что они вообще найдутъ поклонниковъ, къ таджикскому, къ всѣмъ тюрксимъ и монголскимъ кириллицамъ,
+// и по сути дѣла всѣмъ упущеннымъ языкамъ въ кириллическихъ правленіяхъ хотя бы соединящими сѵмволами, извлѣкая выгоду изъ восьми уровней клавишъ.
+// Тѣмъ всѣмъ сё всекириллическая клавіатурная разкладка, или всеобъемлющая кириллическая разкладка, или универсальная кириллическая разкладка клавіатуры.
+//
+// srp: Многојезиков и реакционаран распоред тастера основан на рускима
+// Овај распоред покрива руски у петровском правопису 1708-е године и бољшевичком 1918-е године, украјински, белоруски, српски у сувременом и славеносрпском виду, те бугарски и славомакедонски у писању до и после 1945-е године,
+// укратко све у некој држави преовлађујуће правописе, то је читав црквенословенски, пошто је могуће разне видове слова замењивати без губитка значења — не говорећи о меџусловенском.
+// Поврх овог, он одговара к румунској ћирилици, к молдавској ћирилици, к абхаскоме с изузетком гломазних застарелих ликова, уз које није вероватно да они најђу поклонике, к таџичкоме, к свим туркијским и монголским ћирилицима,
+// те у спровођењу свим испуштеним језицима у ћириличким господарствима бар са спајајућим симболима, искориштавајући осам ступњева тастера.
+// Тиме свим ово је свећирилички тастатуран распоред, или свеобухватан ћирилички распоред тастера, или свеопшти ћирилички тастатуран распоред.
+partial alphanumeric_keys
+xkb_symbols "prxn" {
+
+ name[Group1]= "Russian (Polyglot and Reactionary)";
+
+ key.type[Group1]="EIGHT_LEVEL";
+ key <TLDE> { [ U2019, apostrophe, U0301, U0300, U2053, U2015, U02BC, asciitilde ] }; // Typographic Apostrophe, Apostrophe, Combining Acute, Combining Grave, Swung Dash, Quotation Dash, Modifier Letter Apostrophe, Tilde
+ key <AE01> { [ 1, exclam, U0304, U0306, U0308, U0311, U0307, U0313 ] }; // 1, !, Combining Macron, Combining Breve, Combining Diaresis, Combining Inverted Breve, Combining Dot Above, Combining Comma Above
+ key <AE02> { [ 2,quotedbl,numerosign, U20BF, U20B8, U20AE, U00A3, U20B9 ] }; // 2 " № ₿ ₸ ₮ £ ₹
+ key <AE03> { [ 3, U00A7, U20B4, currency, U20BD, U20AA, U20BC, U20BE ] }; // 3 § ₴ ¤ ₽ ₪ ₼ ₾
+ key <AE04> { [ 4, semicolon, dollar, EuroSign, U0482, U20DD, U0488, U0489 ] }; // 4 ; $ € Thousands Sign, Combining Enclosing Circle, Combining Hundred Thousands, Combining Millions
+ key <AE05> { [ 5, percent, degree, U2030, UA670, UA671, UA672, UA66F ] }; // 5, %, °, ‰, Combinining Ten Millions, Combining Hundred Millions, Combining Thousand Millions, Combining Vzmet
+ key <AE06> { [ 6, colon, U0335, U0336, U0483, U0487, UFE2E, UFE2F ] }; // 6, :, Combining Short Stroke Overlay, Combining Long Stroke Overlay, Combining Titlo, Combining Pokrytie, Combining Titlo Left Half, Combining Titlo Right Half
+ key <AE07> { [ 7, question, U030B, U030F, U030C, U0303, U032C, U0360 ] }; // 7, ?, Combining Double Acute, Combining Double Grave, Combining Caron/Háček, Combining Tilde, Combining Caron/Háček Below, Combining Double Tilde
+ key <AE08> { [ 8, asterisk, U0331, U0332, U0333, U032F, U032D, U032E ] }; // 8, *, Combining Macron Below, Combining Low Line, Combining Double Low Line, Combining Inverted Breve Below, Combining Circumflex Accent, Combining Breve Below
+ key <AE09> { [ 9,parenleft, bracketleft, braceleft, U035F, U035D, U035E, U035C ] }; // 9 ( [ { Combining Double Macron Below, Combining Double Breve, Combining Double Macron, Combining Double Breve Below
+ key <AE10> { [ 0,parenright,bracketright, braceright, U27E8, U27E9, U04A7, U04A6 ] }; // 0 ) ] } ⟨⟩ ҧ Ҧ
+ key <AE11> { [ minus, underscore, emdash, endash, U2011, U00AD, U2010, U2212 ] }; // Hyphen-Minus, Underscore, Em Dash, En Dash, Non-Breaking-Hyphen, Soft Hyphen, Hyphen, Minus Sign
+ key <AE12> { [ equal, plus,notequal, U2248, U04FF, U04FE, U050D, U050C ] }; // = + ≠ ≈ ӿ Ӿ ԍ Ԍ
+
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI, Cyrillic_je, Cyrillic_JE, U04CF, U04C0, U030A, U0325 ] }; // й Й ј Ј ӏ Ӏ, Combining Ring Above and Below
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, U04B5, U04B4, Cyrillic_u_straight, Cyrillic_U_straight, U051B, U051A ] }; // ц Ц ҵ Ҵ ү Ү ԛ Ԛ
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, Byelorussian_shortu, Byelorussian_SHORTU, Cyrillic_u_straight_bar,Cyrillic_U_straight_bar, Byelorussian_shortu, Byelorussian_SHORTU ] }; // у У ў Ў ұ Ұ ў Ў
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, Cyrillic_ka_descender,Cyrillic_KA_descender, U049F, U049E, U046F, U046E ] }; // к К Қ қ ҟ Ҟ ѯ Ѯ
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO, U0463, U0462, UA653, UA652 ] }; // е Е ё Ё ѣ Ѣ ꙓ Ꙓ
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN, Cyrillic_nje, Cyrillic_NJE, Cyrillic_en_descender, Cyrillic_EN_descender, U04C8, U04C7 ] }; // н Н њ Њ ң Ң ӈ Ӈ
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, Ukrainian_ghe_with_upturn,Ukrainian_GHE_WITH_UPTURN, Cyrillic_ghe_bar, Cyrillic_GHE_bar, U04F7, U04F6 ] }; // г Г Ґ ґ ғ Ғ ӷ Ӷ
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA, U04A1, U04A0, U04AB, U04AA, UA67D, UA67F ] }; // ш Ш ҡ Ҡ ҫ Ҫ Combining Payerok Payerok
+ key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA, U0505, U0504, UA68D, UA68C, U050F, U050E ] }; // щ Щ ԅ Ԅ ꚍ Ꚍ ԏ Ԏ
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, U04E1, U04E0, U0499, U0498, U0507, U0506 ] }; // з З ӡ Ӡ ҙ Ҙ ԇ Ԇ
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_shha, Cyrillic_SHHA, Cyrillic_ha_descender, Cyrillic_HA_descender, U04FD, U04FC ] }; // х Х һ Һ ҳ Ҳ ӽ Ӽ
+ key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN, Ukrainian_yi, Ukrainian_YI, Macedonia_dse, Macedonia_DSE, U033E, U2E2F ] }; // ъ Ъ ї Ї ѕ Ѕ, Combining Yerok, Yerok
+
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF, U0473, U0472, U04C4, U04C3, U04FB, U04FA ] }; // ф Ф ѳ Ѳ ӄ Ӄ ӻ Ӻ
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU, Ukrainian_i, Ukrainian_I, U04D5, U04D4, U04A9, U04A8 ] }; // ы Ы і І ӕ Ӕ ҩ Ҩ
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE, U051D, U051C, U0529, U0528, U0527, U0526 ] }; // в В ԝ Ԝ ԩ Ԩ ԧ Ԧ
+ key <AC04> { [ Cyrillic_a, Cyrillic_A, U04D9, U04D8, UA657, UA656, UA655, UA654 ] }; // а А ә Ә ꙗ Ꙗ ꙕ Ꙕ
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE, U0525, U0524, U0471, U0470, UA65F, UA65E ] }; // п П ԥ Ԥ ѱ Ѱ ꙟ Ꙟ
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER, U0481, U0480, U048F, U048E, U0521, U0520 ] }; // р Р ҁ Ҁ ҏ Ҏ ԡ Ԡ
+ key <AC07> { [ Cyrillic_o, Cyrillic_O, Cyrillic_o_bar, Cyrillic_O_bar, U047B, U047A, U0461, U0460 ] }; // о О ө Ө ѻ Ѻ ѡ Ѡ
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL, Cyrillic_lje, Cyrillic_LJE, U04C6, U04C5, U052F, U052E ] }; // л Л љ Љ ӆ Ӆ ԯ Ԯ
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE, Cyrillic_dzhe, Cyrillic_DZHE, U04BD, U04BC, U04BF, U04BE ] }; // д Д џ Џ ҽ Ҽ ҿ Ҿ
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE, Serbian_dje, Serbian_DJE, Cyrillic_zhe_descender, Cyrillic_ZHE_descender, U04C2, U04C1 ] }; // ж Ж ђ Ђ Җ җ ӂ Ӂ
+ key <AC11> { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie, Ukrainian_IE, U0465, U0464, U04CA, U04C9 ] }; // э Э є Є ѥ Ѥ ӊ Ӊ
+ key <BKSL> { [ slash, bar, backslash, U260E, UA65B, UA65A, U0513, U0512 ] }; // / | \ ☎ ꙛ Ꙛ ԓ Ԓ
+
+ key <LSGT> { [ U0495, U0494, U0501, U0500, U0503, U0502, U0509, U0508 ] }; // ҕ Ҕ ԁ Ԁ ԃ Ԃ ԉ Ԉ
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA, U0469, U0468, U0467, U0466, UA657, UA656 ] }; // я Я ѩ Ѩ ѧ Ѧ ꙗ Ꙗ
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE, Serbian_tshe, Serbian_TSHE, U04B7, U04B6, U2016, U00A6 ] }; // ч Ч ћ Ћ ҷ Ҷ ‖ ¦
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES, U046D, U046C, U046B, U046A, U04F7, U04F6 ] }; // с С ѭ Ѭ ѫ Ѫ ӷ Ӷ
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM, multiply, U00F7, U22C5, U2219, U04CE, U04CD ] }; // м М × ÷ ⋅ ∙ ӎ Ӎ
+ key <AB05> { [ Cyrillic_i, Cyrillic_I, U0475, U0474, U048B, U048A, periodcentered, U261B ] }; // и И ѵ Ѵ ҋ Ҋ · ☛
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE, U04AD, U04AC, U051F, U051E, Cyrillic_che_vertstroke,Cyrillic_CHE_vertstroke]}; // т Т ҭ Ҭ ԟ Ԟ ҹ Ҹ
+ key <AB07> { [Cyrillic_softsign,Cyrillic_SOFTSIGN, U04A5, U04A4, UA64F, UA64E, U048D, U048C ] }; // ь Ь ҥ Ҥ ꙏ Ꙏ ҍ Ҍ
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE, guillemotleft, doublelowquotemark, singlelowquotemark, U2039, U0523, U0522 ] }; // б Б « „ ‚ ‹ ԣ Ԣ
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU, guillemotright, leftdoublequotemark, leftsinglequotemark, U203A, rightdoublequotemark, rightsinglequotemark]}; // ю Ю » “ ‘ › ” ’
+ key <AB10> { [ period, comma, ellipsis, enfilledcircbullet, U04CC, U04CB, UA649, UA648 ] }; // . , … • ӌ Ӌ ꙉ Ꙉ
+
+// eng: Maps Right Alt for reaching the third level
+// rus: Составляетъ правую Alt для достиженія третьяго уровня
+// srp: Саставља десни Alt за достизање трећег ступња
+ include "level3(ralt_switch)"
+
+// eng: Maps <CAPS> for reaching the fifth level
+// rus: Составляетъ <CAPS> для достиженія пятаго уровня
+// srp: Саставља <CAPS> за достизање петег ступња
+
+ include "level5(caps_switch)"
+
+// eng: Offers pressing both shift keys for capslock
+// rus: Предоставляетъ нажатие обѣихъ клавишъ Shift для защелкиванія прописности буквъ
+// srp: Ставља на располагање притискивање обију тастера Shift за учвршћивање верзала
+ include "shift(both_shiftlock)"
+
+// eng: Makes <KPDL> return comma instead of dot, as the comma is decimal separator in Cyrillic written languages
+// rus: Дѣлаетъ что <KPDL> отдаетъ запятую вмѣсто точки, такъ какъ запятая десятичный раздѣлитель въ языкахъ пишемыхъ кириллицей
+// srp: Ради да <KPDL> враћа зарез уместо точке, будући да зарез је десетни разделитељ у језицима који се пишу ћирилицом
+ include "kpdl(comma)"
+
+// eng: Bug notice: One has to set lv5:rwin_switch_lock or one of the other level 5 locks for the caps switch to work!
+// rus: Приходится ставить lv5:rwin_switch_lock либо одинъ изъ другихъ затворовъ пятаго уровня, чтобы работалъ переключатель Caps!
+// srp: Потребно да се ставља lv5:rwin_switch_lock или једна из других брава петег ступња, да би шљакао пребацивач Caps!
+// https://bugs.freedesktop.org/show_bug.cgi?id=102189
+};
diff --git a/test/data/symbols/rupeesign b/test/data/symbols/rupeesign
new file mode 100644
index 0000000..efde69c
--- /dev/null
+++ b/test/data/symbols/rupeesign
@@ -0,0 +1,5 @@
+// keyboards having the RupeeSign on the 4 key
+partial
+xkb_symbols "4" {
+ key <AE04> { [ NoSymbol, NoSymbol, U20B9 ] };
+};
diff --git a/test/data/symbols/shift b/test/data/symbols/shift
new file mode 100644
index 0000000..8f90223
--- /dev/null
+++ b/test/data/symbols/shift
@@ -0,0 +1,87 @@
+// Cancel CapsLock when a Shift key is pressed.
+partial modifier_keys
+xkb_symbols "breaks_caps" {
+ key <LFSH> {
+ type = "ALPHABETIC",
+ actions [Group1] = [
+ SetMods(modifiers=Shift),
+ SetMods(modifiers=Shift+Lock,clearLocks)
+ ]
+ };
+ key <RTSH> {
+ type = "ALPHABETIC",
+ actions [Group1] = [
+ SetMods(modifiers=Shift),
+ SetMods(modifiers=Shift+Lock,clearLocks)
+ ]
+ };
+};
+
+
+// Toggle CapsLock when pressed together with the other Shift key.
+partial modifier_keys
+xkb_symbols "lshift_both_capslock" {
+ key <LFSH> {
+ type[Group1]="TWO_LEVEL",
+ symbols[Group1] = [ Shift_L, Caps_Lock ]
+ };
+};
+// Toggle CapsLock when pressed together with the other Shift key.
+partial modifier_keys
+xkb_symbols "rshift_both_capslock" {
+ key <RTSH> {
+ type[Group1]="TWO_LEVEL",
+ symbols[Group1] = [ Shift_R, Caps_Lock ]
+ };
+};
+partial modifier_keys
+xkb_symbols "both_capslock" {
+ include "shift(lshift_both_capslock)"
+ include "shift(rshift_both_capslock)"
+};
+
+
+// Set CapsLock when pressed with the other Shift key, release it when pressed alone.
+partial modifier_keys
+xkb_symbols "lshift_both_capslock_cancel" {
+ key <LFSH> {
+ type[Group1]="ALPHABETIC",
+ symbols[Group1] = [ Shift_L, Caps_Lock ]
+ };
+};
+// Set CapsLock when pressed with the other Shift key, release it when pressed alone.
+partial modifier_keys
+xkb_symbols "rshift_both_capslock_cancel" {
+ key <RTSH> {
+ type[Group1]="ALPHABETIC",
+ symbols[Group1] = [ Shift_R, Caps_Lock ]
+ };
+};
+partial modifier_keys
+xkb_symbols "both_capslock_cancel" {
+ include "shift(lshift_both_capslock_cancel)"
+ include "shift(rshift_both_capslock_cancel)"
+};
+
+
+// Toggle ShiftLock when pressed together with the other Shift key.
+partial modifier_keys
+xkb_symbols "lshift_both_shiftlock" {
+ key <LFSH> {
+ type[Group1]="TWO_LEVEL",
+ symbols[Group1] = [ Shift_L, Shift_Lock ]
+ };
+};
+// Toggle ShiftLock when pressed together with the other Shift key.
+partial modifier_keys
+xkb_symbols "rshift_both_shiftlock" {
+ key <RTSH> {
+ type[Group1]="TWO_LEVEL",
+ symbols[Group1] = [ Shift_R, Shift_Lock ]
+ };
+};
+partial modifier_keys
+xkb_symbols "both_shiftlock" {
+ include "shift(lshift_both_shiftlock)"
+ include "shift(rshift_both_shiftlock)"
+};
diff --git a/test/data/symbols/srvr_ctrl b/test/data/symbols/srvr_ctrl
new file mode 100644
index 0000000..902c51c
--- /dev/null
+++ b/test/data/symbols/srvr_ctrl
@@ -0,0 +1,110 @@
+// Actions which control the server's behavior.
+
+partial keypad_keys function_keys
+xkb_symbols "xfree86" {
+ include "keypad(operators)"
+ include "srvr_ctrl(fkey2vt)"
+};
+
+partial function_keys
+xkb_symbols "fkey2vt" {
+
+ key <FK01> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F1, F1, F1, F1, XF86_Switch_VT_1 ]
+ };
+
+ key <FK02> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F2, F2, F2, F2, XF86_Switch_VT_2 ]
+ };
+
+ key <FK03> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F3, F3, F3, F3, XF86_Switch_VT_3 ]
+ };
+
+ key <FK04> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F4, F4, F4, F4, XF86_Switch_VT_4 ]
+ };
+
+ key <FK05> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F5, F5, F5, F5, XF86_Switch_VT_5 ]
+ };
+
+ key <FK06> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F6, F6, F6, F6, XF86_Switch_VT_6 ]
+ };
+
+ key <FK07> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F7, F7, F7, F7, XF86_Switch_VT_7 ]
+ };
+
+ key <FK08> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F8, F8, F8, F8, XF86_Switch_VT_8 ]
+ };
+
+ key <FK09> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F9, F9, F9, F9, XF86_Switch_VT_9 ]
+ };
+
+ key <FK10> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F10, F10, F10, F10, XF86_Switch_VT_10 ]
+ };
+
+ key <FK11> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F11, F11, F11, F11, XF86_Switch_VT_11 ]
+ };
+
+ key <FK12> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F12, F12, F12, F12, XF86_Switch_VT_12 ]
+ };
+};
+
+partial function_keys keypad_keys
+xkb_symbols "no_srvr_keys" {
+
+ key.type="TWO_LEVEL";
+
+ key <FK01> { [ F1, F1 ] };
+ key <FK02> { [ F2, F2 ] };
+ key <FK03> { [ F3, F3 ] };
+ key <FK04> { [ F4, F4 ] };
+ key <FK05> { [ F5, F5 ] };
+ key <FK06> { [ F6, F6 ] };
+ key <FK07> { [ F7, F7 ] };
+ key <FK08> { [ F8, F8 ] };
+ key <FK09> { [ F9, F9 ] };
+ key <FK10> { [ F10, F10 ] };
+ key <FK11> { [ F11, F11 ] };
+ key <FK12> { [ F12, F12 ] };
+
+ key <KPDV> { [ KP_Divide, KP_Divide ] };
+ key <KPMU> { [ KP_Multiply, KP_Multiply ] };
+ key <KPSU> { [ KP_Subtract, KP_Subtract ] };
+ key <KPAD> { [ KP_Add, KP_Add ] };
+};
+
+partial function_keys
+xkb_symbols "grab_debug" {
+
+ key <FK11> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F11, F11, F11, F11, XF86LogGrabInfo ]
+ };
+
+ key <FK12> {
+ type="CTRL+ALT",
+ symbols[Group1]= [ F12, F12, F12, F12, XF86LogWindowTree ]
+ };
+
+};
diff --git a/test/data/symbols/terminate b/test/data/symbols/terminate
new file mode 100644
index 0000000..a43f2b9
--- /dev/null
+++ b/test/data/symbols/terminate
@@ -0,0 +1,7 @@
+default partial modifier_keys
+xkb_symbols "ctrl_alt_bksp" {
+ key <BKSP> {
+ type="CTRL+ALT",
+ symbols[Group1] = [ NoSymbol, NoSymbol, NoSymbol, NoSymbol, Terminate_Server ]
+ };
+};
diff --git a/test/data/symbols/us b/test/data/symbols/us
new file mode 100644
index 0000000..9cc056d
--- /dev/null
+++ b/test/data/symbols/us
@@ -0,0 +1,1789 @@
+default partial alphanumeric_keys modifier_keys
+xkb_symbols "basic" {
+
+ name[Group1]= "English (US)";
+
+ key <TLDE> { [ grave, asciitilde ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ { H, E, L, L, O }, asciicircum ] };
+ key <AE07> { [ { Y, E, S, space, T, H, I, S, space, I, S, space, D, O, G }, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E ] };
+ key <AD04> { [ r, R ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ y, Y ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I ] };
+ key <AD09> { [ o, O ] };
+ key <AD10> { [ p, P ] };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ d, D ] };
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ j, J ] };
+ key <AC08> { [ k, K ] };
+ key <AC09> { [ l, L ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+
+ key <BKSL> { [ backslash, bar ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "euro" {
+
+ include "us(basic)"
+ name[Group1]= "English (US, euro on 5)";
+
+ include "eurosign(5)"
+
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "ibm238l" {
+
+ include "us(basic)"
+ name[Group1]= "English (US, IBM Arabic 238_L)";
+
+ key <AB08> { [ comma, comma ] };
+ key <AB09> { [ period, period ] };
+ key <BKSL> { [ quoteleft, asciitilde ] };
+ key <LSGT> { [ backslash, bar ] };
+ key <TLDE> { [ leftcaret, rightcaret ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "intl" {
+
+ include "us(basic)"
+ name[Group1]= "English (US, intl., with dead keys)";
+
+ key <TLDE> { [dead_grave, dead_tilde, grave, asciitilde ] };
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, at, twosuperior, dead_doubleacute ] };
+ key <AE03> { [ 3, numbersign, threesuperior, dead_macron ] };
+ key <AE04> { [ 4, dollar, currency, sterling ] };
+ key <AE05> { [ 5, percent, EuroSign, dead_cedilla ] };
+ key <AE06> { [ 6, dead_circumflex, onequarter, asciicircum ] };
+ key <AE07> { [ 7, ampersand, onehalf, dead_horn ] };
+ key <AE08> { [ 8, asterisk, threequarters, dead_ogonek ] };
+ key <AE09> { [ 9, parenleft, leftsinglequotemark, dead_breve ] };
+ key <AE10> { [ 0, parenright, rightsinglequotemark, dead_abovering ] };
+ key <AE11> { [ minus, underscore, yen, dead_belowdot ] };
+ key <AE12> { [ equal, plus, multiply, division ] };
+
+ key <AD01> { [ q, Q, adiaeresis, Adiaeresis ] };
+ key <AD02> { [ w, W, aring, Aring ] };
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD04> { [ r, R, registered, registered ] };
+ key <AD05> { [ t, T, thorn, THORN ] };
+ key <AD06> { [ y, Y, udiaeresis, Udiaeresis ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ key <AD10> { [ p, P, odiaeresis, Odiaeresis ] };
+ key <AD11> { [ bracketleft, braceleft, guillemotleft, leftdoublequotemark ] };
+ key <AD12> { [bracketright, braceright, guillemotright, rightdoublequotemark ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC02> { [ s, S, ssharp, section ] };
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, f, F ] };
+ key <AC05> { [ g, G, g, G ] };
+ key <AC06> { [ h, H, h, H ] };
+ key <AC07> { [ j, J, j, J ] };
+ key <AC08> { [ k, K, oe, OE ] };
+
+ key <AC09> { [ l, L, oslash, Ooblique ] };
+ key <AC10> { [ semicolon, colon, paragraph, degree ] };
+ key <AC11> { [dead_acute, dead_diaeresis, apostrophe, quotedbl ] };
+
+ key <AB01> { [ z, Z, ae, AE ] };
+ key <AB02> { [ x, X, x, X ] };
+ key <AB03> { [ c, C, copyright, cent ] };
+ key <AB04> { [ v, V, v, V ] };
+ key <AB05> { [ b, B, b, B ] };
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+ key <AB07> { [ m, M, mu, mu ] };
+ key <AB08> { [ comma, less, ccedilla, Ccedilla ] };
+ key <AB09> { [ period, greater, dead_abovedot, dead_caron ] };
+ key <AB10> { [ slash, question, questiondown, dead_hook ] };
+ key <BKSL> { [ backslash, bar, notsign, brokenbar ] };
+
+ key <LSGT> { [ backslash, bar, backslash, bar ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Based on symbols/us_intl keyboard map:
+// Dead-keys definition for a very simple US/ASCII layout.
+// by Conectiva (http://www.conectiva.com.br)
+// modified by Ricardo Y. Igarashi (iga@that.com.br)
+
+// Added the following deadkeys, to make it truly international:
+//
+// dead_macron: on AltGr-minus
+// dead_breve: on AltGr-parenleft
+// dead_abovedot: on AltGr-period
+// dead_abovering: on AltGr-0
+// dead_doubleacute: on AltGr-equal (as quotedbl is already used)
+// dead_caron: on AltGr-less (AltGr-shift-comma)
+// dead_cedilla: on AltGr-comma
+// dead_ogonek: on AltGr-semicolon
+// dead_belowdot: on AltGr-underscore (AltGr-shift-minus)
+// dead_hook: on AltGr-question
+// dead_horn: on AltGr-plus (AltGr-shift-equal)
+// dead_diaeresis: on AltGr-colon (Alt-shift-semicolon)
+//
+// those were already there:
+// dead_grave
+// dead_acute
+// dead_circumflex
+// dead_tilde
+// dead_diaeresis
+
+partial alphanumeric_keys
+xkb_symbols "alt-intl" {
+
+ include "us"
+ name[Group1]= "English (US, alt. intl.)";
+
+ key <TLDE> { [ dead_grave, dead_tilde, grave, asciitilde ] };
+ key <AE05> { [ 5, percent, EuroSign ] };
+ key <AE06> { [ 6, dead_circumflex, asciicircum, asciicircum ] };
+ key <AE09> { [ 9, parenleft, leftsinglequotemark, dead_breve ] };
+ key <AE10> { [ 0, parenright, rightsinglequotemark, dead_abovering ] };
+ key <AE11> { [ minus, underscore, dead_macron, dead_belowdot ] };
+ key <AE12> { [ equal, plus, dead_doubleacute, dead_horn ] };
+
+ key <AD03> { [ e, E, EuroSign, cent ] };
+
+ key <AC10> { [ semicolon, colon, dead_ogonek, dead_diaeresis ] };
+ key <AC11> { [ dead_acute, dead_diaeresis, apostrophe, quotedbl ] };
+
+ key <AB08> { [ comma, less, dead_cedilla, dead_caron ] };
+ key <AB09> { [ period, greater, dead_abovedot, dead_circumflex ] };
+ key <AB10> { [ slash, question, dead_hook, dead_hook ] };
+
+ key <LSGT> { [ backslash, bar, backslash, bar ] };
+
+ include "level3(ralt_switch)"
+};
+
+// based on a keyboard map from an 'xkb/symbols/dk' file
+
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+
+ name[Group1]= "English (Dvorak)";
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft, dead_grave] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ bracketleft, braceleft ] };
+ key <AE12> { [ bracketright, braceright, dead_tilde] };
+
+ key <AD01> { [ apostrophe, quotedbl, dead_acute, dead_diaeresis ] };
+ key <AD02> { [ comma, less, dead_cedilla, dead_caron ] };
+ key <AD03> { [ period, greater, dead_abovedot, periodcentered ] };
+ key <AD04> { [ p, P ] };
+ key <AD05> { [ y, Y ] };
+ key <AD06> { [ f, F ] };
+ key <AD07> { [ g, G ] };
+ key <AD08> { [ c, C ] };
+ key <AD09> { [ r, R ] };
+ key <AD10> { [ l, L ] };
+ key <AD11> { [ slash, question ] };
+ key <AD12> { [ equal, plus ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ o, O ] };
+ key <AC03> { [ e, E ] };
+ key <AC04> { [ u, U ] };
+ key <AC05> { [ i, I ] };
+ key <AC06> { [ d, D ] };
+ key <AC07> { [ h, H ] };
+ key <AC08> { [ t, T ] };
+ key <AC09> { [ n, N ] };
+ key <AC10> { [ s, S ] };
+ key <AC11> { [ minus, underscore ] };
+
+ key <AB01> { [ semicolon, colon, dead_ogonek, dead_doubleacute ] };
+ key <AB02> { [ q, Q ] };
+ key <AB03> { [ j, J ] };
+ key <AB04> { [ k, K ] };
+ key <AB05> { [ x, X ] };
+ key <AB06> { [ b, B ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ w, W ] };
+ key <AB09> { [ v, V ] };
+ key <AB10> { [ z, Z ] };
+
+ key <BKSL> { [ backslash, bar ] };
+};
+
+// Dvorak intl., with dead keys
+// Olivier Mehani (shtrom-xorg@ssji.net)
+// Reproduce the per-key mapping of us(intl) for the dvorak layout
+// aka "I just swapped my keys over"
+partial alphanumeric_keys
+xkb_symbols "dvorak-intl" {
+
+ include "us(dvorak)"
+ name[Group1]= "English (Dvorak, intl., with dead keys)";
+
+ key <TLDE> { [dead_grave, dead_tilde, grave, asciitilde ] };
+
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, at, twosuperior, dead_doubleacute ] };
+ key <AE03> { [ 3, numbersign, threesuperior, dead_macron ] };
+ key <AE04> { [ 4, dollar, currency, sterling ] };
+ key <AE05> { [ 5, percent, EuroSign, dead_cedilla ] };
+ key <AE06> { [ 6, dead_circumflex, onequarter, asciicircum ] };
+ key <AE07> { [ 7, ampersand, onehalf, dead_horn ] };
+ key <AE08> { [ 8, asterisk, threequarters, dead_ogonek ] };
+ key <AE09> { [ 9, parenleft, leftsinglequotemark, dead_breve ] };
+ key <AE10> { [ 0, parenright, rightsinglequotemark, dead_abovering ] };
+ key <AE11> { [ bracketleft, braceleft, guillemotleft, leftdoublequotemark ] };
+ key <AE12> { [bracketright, braceright, guillemotright, rightdoublequotemark ] };
+
+ key <AD01> { [dead_acute, dead_diaeresis, apostrophe, quotedbl ] };
+ key <AD02> { [ comma, less, ccedilla, Ccedilla ] };
+ key <AD03> { [ period, greater, dead_abovedot, dead_caron ] };
+ key <AD04> { [ p, P, odiaeresis, Odiaeresis ] };
+ key <AD05> { [ y, Y, udiaeresis, Udiaeresis ] };
+ // key <AD06> { [ f, F ] };
+ // key <AD07> { [ g, G ] };
+ key <AD08> { [ c, C, copyright, cent ] };
+ key <AD09> { [ r, R, registered, registered ] };
+ key <AD10> { [ l, L, oslash, Ooblique ] };
+ key <AD11> { [ slash, question, questiondown, dead_hook ] };
+ // key <AD12> { [ equal, plus, multiply, division ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC02> { [ o, O, oacute, Oacute ] };
+ key <AC03> { [ e, E, eacute, Eacute ] };
+ key <AC04> { [ u, U, uacute, Uacute ] };
+ key <AC05> { [ i, I, iacute, Iacute ] };
+ key <AC06> { [ d, D, eth, ETH ] };
+ // key <AC07> { [ h, H ] };
+ key <AC08> { [ t, T, thorn, THORN ] };
+ key <AC09> { [ n, N, ntilde, Ntilde ] };
+ key <AC10> { [ s, S, ssharp, section ] };
+ // key <AC11> { [ minus, underscore, yen, dead_belowdot ] };
+
+ key <AB01> { [ semicolon, colon, paragraph, degree ] };
+ key <AB02> { [ q, Q, adiaeresis, Adiaeresis ] };
+ // key <AB03> { [ j, J ] };
+ key <AB04> { [ k, K, oe, OE ] };
+ // key <AB05> { [ x, X ] };
+ // key <AB06> { [ b, B ] };
+ key <AB07> { [ m, M, mu, mu ] };
+ key <AB08> { [ w, W, aring, Aring ] };
+ // key <AB09> { [ v, V ] };
+ key <AB10> { [ z, Z, ae, AE ] };
+
+ key <BKSL> { [ backslash, bar, notsign, brokenbar ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Dvorak international without dead keys
+// Stephane Magnenat (stephane at magnenat dot net, http://stephane.magnenat.net)
+// Based on information from http://www.poupinou.org/dvorak/index.html
+//
+// ` 1 2 3 4 5 6 7 8 9 0 [ ] \
+// €
+//
+// ' , . p y f g c r l / =
+// ä ê ë ü ç
+//
+// a o e u i d h t n s -
+// à ô é û î ß
+//
+// ; q j k x b m w v z
+// â ö è ù ï
+
+partial alphanumeric_keys
+xkb_symbols "dvorak-alt-intl" {
+
+ include "us(dvorak)"
+ name[Group1]= "English (Dvorak, alt. intl.)";
+
+ key <AE04> { [ 4, dollar, EuroSign ] };
+
+ key <AD02> { [ comma, less, adiaeresis, dead_caron ] };
+ key <AD03> { [ period, greater, ecircumflex, periodcentered ] };
+ key <AD04> { [ p, P, ediaeresis, dead_cedilla ] };
+ key <AD05> { [ y, Y, udiaeresis ] };
+ key <AD08> { [ c, C, ccedilla, dead_abovedot ] };
+
+ key <AC01> { [ a, A, agrave ] };
+ key <AC02> { [ o, O, ocircumflex ] };
+ key <AC03> { [ e, E, eacute ] };
+ key <AC04> { [ u, U, ucircumflex ] };
+ key <AC05> { [ i, I, icircumflex ] };
+ key <AC10> { [ s, S, ssharp ] };
+
+ key <AB01> { [ semicolon, colon, acircumflex ] };
+ key <AB02> { [ q, Q, odiaeresis, dead_ogonek ] };
+ key <AB03> { [ j, J, egrave, dead_doubleacute ] };
+ key <AB04> { [ k, K, ugrave ] };
+ key <AB05> { [ x, X, idiaeresis ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Left and right handed dvorak layouts
+// by sqweek <sqweek@gmail.com> 2006-01-30
+// Based on the corresponding layouts in the console-tools package.
+partial alphanumeric_keys
+xkb_symbols "dvorak-l" {
+
+ include "us(dvorak)"
+ name[Group1]= "English (Dvorak, left-handed)";
+
+ key <AE01> { [ bracketleft, braceleft ] };
+ key <AE02> { [ bracketright, braceright ] };
+ key <AE03> { [ slash, question ] };
+ key <AE04> { [ p, P ] };
+ key <AE05> { [ f, F ] };
+ key <AE06> { [ m, M ] };
+ key <AE07> { [ l, L ] };
+ key <AE08> { [ j, J ] };
+ key <AE09> { [ 4, dollar ] };
+ key <AE10> { [ 3, numbersign ] };
+ key <AE11> { [ 2, at ] };
+ key <AE12> { [ 1, exclam ] };
+
+ key <AD01> { [ semicolon, colon ] };
+ key <AD02> { [ q, Q ] };
+ key <AD03> { [ b, B ] };
+ key <AD04> { [ y, Y ] };
+ key <AD05> { [ u, U ] };
+ key <AD06> { [ r, R ] };
+ key <AD07> { [ s, S ] };
+ key <AD08> { [ o, O ] };
+ key <AD09> { [ period, greater ] };
+ key <AD10> { [ 6, asciicircum ] };
+ key <AD11> { [ 5, percent ] };
+ key <AD12> { [ equal, plus ] };
+
+ key <AC01> { [ minus, underscore ] };
+ key <AC02> { [ k, K ] };
+ key <AC03> { [ c, C ] };
+ key <AC04> { [ d, D ] };
+ key <AC05> { [ t, T ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ e, E ] };
+ key <AC08> { [ a, A ] };
+ key <AC09> { [ z, Z ] };
+ key <AC10> { [ 8, asterisk ] };
+ key <AC11> { [ 7, ampersand ] };
+
+ key <AB01> { [ apostrophe, quotedbl ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ g, G ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ w, W ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ i, I ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ 0, parenright ] };
+ key <AB10> { [ 9, parenleft ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "dvorak-r" {
+
+ include "us(dvorak)"
+ name[Group1]= "English (Dvorak, right-handed)";
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ j, J ] };
+ key <AE06> { [ l, L ] };
+ key <AE07> { [ m, M ] };
+ key <AE08> { [ f, F ] };
+ key <AE09> { [ p, P ] };
+ key <AE10> { [ slash, question ] };
+ key <AE11> { [ bracketleft, braceleft ] };
+ key <AE12> { [ bracketright, braceright ] };
+
+ key <AD01> { [ 5, percent ] };
+ key <AD02> { [ 6, asciicircum ] };
+ key <AD03> { [ q, Q ] };
+ key <AD04> { [ period, greater ] };
+ key <AD05> { [ o, O ] };
+ key <AD06> { [ r, R ] };
+ key <AD07> { [ s, S ] };
+ key <AD08> { [ u, U ] };
+ key <AD09> { [ y, Y ] };
+ key <AD10> { [ b, B ] };
+ key <AD11> { [ semicolon, colon ] };
+ key <AD12> { [ equal, plus ] };
+
+ key <AC01> { [ 7, ampersand ] };
+ key <AC02> { [ 8, asterisk ] };
+ key <AC03> { [ z, Z ] };
+ key <AC04> { [ a, A ] };
+ key <AC05> { [ e, E ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ t, T ] };
+ key <AC08> { [ d, D ] };
+ key <AC09> { [ c, C ] };
+ key <AC10> { [ k, K ] };
+ key <AC11> { [ minus, underscore ] };
+
+ key <AB01> { [ 9, parenleft ] };
+ key <AB02> { [ 0, parenright ] };
+ key <AB03> { [ x, X ] };
+ key <AB04> { [ comma, less ] };
+ key <AB05> { [ i, I ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ w, W ] };
+ key <AB08> { [ v, V ] };
+ key <AB09> { [ g, G ] };
+ key <AB10> { [ apostrophe, quotedbl ] };
+};
+
+// Classic dvorak layout
+// by Piter Punk <piterpk@terra.com.br> - 2006-07-06
+// Based on dvorak layout and e-mail from Russel L. Harris rlharris@oplink.net
+// on xorg list.
+partial alphanumeric_keys
+xkb_symbols "dvorak-classic" {
+
+ name[Group1]= "English (classic Dvorak)";
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+
+ key <AE01> { [ bracketleft, braceleft ] };
+ key <AE02> { [ 7, ampersand ] };
+ key <AE03> { [ 5, percent ] };
+ key <AE04> { [ 3, numbersign ] };
+ key <AE05> { [ 1, exclam ] };
+ key <AE06> { [ 9, parenleft, dead_grave] };
+ key <AE07> { [ 0, parenright ] };
+ key <AE08> { [ 2, at ] };
+ key <AE09> { [ 4, dollar ] };
+ key <AE10> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
+ key <AE11> { [ 8, asterisk ] };
+ key <AE12> { [ bracketright, braceright, dead_tilde] };
+
+ key <AD01> { [ slash, question ] };
+ key <AD02> { [ comma, less, dead_cedilla, dead_caron ] };
+ key <AD03> { [ period, greater, dead_abovedot, periodcentered ] };
+ key <AD04> { [ p, P ] };
+ key <AD05> { [ y, Y ] };
+ key <AD06> { [ f, F ] };
+ key <AD07> { [ g, G ] };
+ key <AD08> { [ c, C ] };
+ key <AD09> { [ r, R ] };
+ key <AD10> { [ l, L ] };
+ key <AD11> { [ apostrophe, quotedbl, dead_acute, dead_diaeresis ] };
+ key <AD12> { [ equal, plus ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ o, O ] };
+ key <AC03> { [ e, E ] };
+ key <AC04> { [ u, U ] };
+ key <AC05> { [ i, I ] };
+ key <AC06> { [ d, D ] };
+ key <AC07> { [ h, H ] };
+ key <AC08> { [ t, T ] };
+ key <AC09> { [ n, N ] };
+ key <AC10> { [ s, S ] };
+ key <AC11> { [ minus, underscore ] };
+
+ key <AB01> { [ semicolon, colon, dead_ogonek, dead_doubleacute ] };
+ key <AB02> { [ q, Q ] };
+ key <AB03> { [ j, J ] };
+ key <AB04> { [ k, K ] };
+ key <AB05> { [ x, X ] };
+ key <AB06> { [ b, B ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ w, W ] };
+ key <AB09> { [ v, V ] };
+ key <AB10> { [ z, Z ] };
+ key <BKSL> { [ backslash, bar ] };
+};
+
+// programmer Dvorak, by Roland Kaufmann <rlndkfmn at gmail dot com>
+// License: BSD, available at <http://www.kaufmann.no/roland/dvorak/license.html>
+// Main features: Numbers are in shift position (like French), symbols have been
+// placed in locations that give good hand-alternation and finger rolling with
+// symbols that usually follows, accented characters are possible for I18N.
+// Patch suggestions should be sent upstream.
+partial alphanumeric_keys
+xkb_symbols "dvp" {
+
+ include "us(dvorak)"
+ name[Group1] = "English (programmer Dvorak)";
+
+ // Unmodified Shift AltGr Shift+AltGr
+ // symbols row, left side
+ key <TLDE> { [ dollar, asciitilde, dead_tilde ] };
+ key <AE01> { [ ampersand, percent ] };
+ key <AE02> { [ bracketleft, 7, currency ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE03> { [ braceleft, 5, cent ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE04> { [ braceright, 3, yen ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE05> { [ parenleft, 1, EuroSign ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE06> { [ equal, 9, sterling ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+
+ // symbols row, right side
+ key <AE07> { [ asterisk, 0 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE08> { [ parenright, 2, onehalf ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE09> { [ plus, 4 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE10> { [ bracketright, 6 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE11> { [ exclam, 8, exclamdown, U2E18 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; // reversed interrobang
+ key <AE12> { [ numbersign, grave, dead_grave ] };
+ key <BKSP> { [ BackSpace, BackSpace ] };
+
+ // upper row, left side
+ key <AD01> { [ semicolon, colon, dead_diaeresis ] };
+ key <AD02> { [ comma, less, guillemotleft, U201C ] };
+ key <AD03> { [ period, greater, guillemotright, U201D ] };
+ key <AD04> { [ p, P, paragraph, section ] };
+ key <AD05> { [ y, Y, udiaeresis, Udiaeresis ] };
+
+ // upper row, right side
+ key <AD08> { [ c, C, ccedilla, Ccedilla ] };
+ key <AD09> { [ r, R, registered, trademark ] };
+ key <AD11> { [ slash, question, questiondown, U203D ] }; // interrobang
+ key <AD12> { [ at, asciicircum, dead_circumflex, dead_caron ] };
+
+ // home row, left side
+ key <AC01> { [ a, A, aring, Aring ] };
+ key <AC02> { [ o, O, oslash, Ooblique ] };
+ key <AC03> { [ e, E, ae, AE ] };
+ key <AC04> { [ u, U, eacute, Eacute ] };
+
+ // home row, right side
+ key <AC06> { [ d, D, eth, ETH ] };
+ key <AC07> { [ h, H, dead_acute ] };
+ key <AC08> { [ t, T, thorn, THORN ] };
+ key <AC09> { [ n, N, ntilde, Ntilde ] };
+ key <AC10> { [ s, S, ssharp ] };
+ key <AC11> { [ minus, underscore, hyphen, endash ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <BKSL> { [ backslash, bar ] };
+
+ // lower row, left side
+ key <AB01> { [ apostrophe, quotedbl, dead_acute ] };
+
+ // do NOT hardcode this switch; use lv3:ralt_switch option instead!
+ //include "level3(ralt_switch)"
+};
+
+// phonetic layout for Russian letters on an US keyboard
+// by Ivan Popov <pin@konvalo.org> 2005-07-17
+
+// level3 modifier is a shortcut to the "us" meaning of the keys where
+// we place cyrillic letters, handy for accessing the corresponding
+// punctuation marks.
+// It is important to have access to punctuation marks, and the rest of
+// alphabetical keys are added for being consequent so that the users
+// can expect the level3 modifier to give what the key label shows.
+
+partial alphanumeric_keys
+xkb_symbols "rus" {
+
+ include "us(basic)"
+ name[Group1]= "Russian (US, phonetic)";
+
+key.type[group1]="FOUR_LEVEL_ALPHABETIC";
+
+ key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO, grave, asciitilde ] };
+ key <LatV> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AC10> { [ Cyrillic_che, Cyrillic_CHE, semicolon, colon ] };
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA, bracketleft, braceleft] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA, bracketright, braceright ] };
+ key <AE12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, equal, plus ] };
+ key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <LatX> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <BKSL> { [ Cyrillic_e, Cyrillic_E, backslash, bar ] };
+ key <AC11> { [ Cyrillic_yu, Cyrillic_YU, apostrophe, quotedbl ] };
+ key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ include "us(basic)"
+ name[Group1]= "English (Macintosh)";
+ key.type[group1]="FOUR_LEVEL";
+
+ // Slightly improvised from http://homepage.mac.com/thgewecke/kblayout.jpg
+ key <LSGT> { [ section, plusminus, section, plusminus ] };
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_horn ] };
+ key <AE01> { [ 1, exclam, exclamdown, U2044 ] };
+ key <AE02> { [ 2, at, trademark, EuroSign ] };
+ key <AE03> { [ 3, numbersign, sterling, U2039 ] };
+ key <AE04> { [ 4, dollar, cent, U203A ] };
+ key <AE05> { [ 5, percent, infinity, UFB01 ] };
+ key <AE06> { [ 6,asciicircum, section, UFB02 ] };
+ key <AE07> { [ 7, ampersand, paragraph, doubledagger ] };
+ key <AE08> { [ 8, asterisk, enfilledcircbullet, degree ] };
+ key <AE09> { [ 9, parenleft, ordfeminine, periodcentered ] };
+ key <AE10> { [ 0, parenright, masculine,singlelowquotemark] };
+ key <AE11> { [ minus, underscore, endash, emdash ] };
+ key <AE12> { [ equal, plus, notequal, plusminus ] };
+
+ key <AD01> { [ q, Q, oe, OE ] };
+ key <AD02> { [ w, W, U2211,doublelowquotemark] };
+ key <AD03> { [ e, E, dead_acute, acute ] };
+ key <AD04> { [ r, R, registered, U2030 ] };
+ key <AD05> { [ t, T, dagger, dead_caron ] };
+ key <AD06> { [ y, Y, yen, onequarter ] };
+ key <AD07> { [ u, U, dead_diaeresis, diaeresis ] };
+ key <AD08> { [ i, I, dead_circumflex, U02C6 ] };
+ key <AD09> { [ o, O, oslash, Ooblique ] };
+ key <AD10> { [ p, P, Greek_pi, U220F ] };
+ key <AD11> { [ bracketleft, braceleft, leftdoublequotemark, rightdoublequotemark ] };
+ key <AD12> { [bracketright, braceright, leftsinglequotemark, rightsinglequotemark ] };
+ key <BKSL> { [ backslash, bar, guillemotleft, guillemotright ] };
+
+ key <AC01> { [ a, A, aring, Aring ] };
+ key <AC02> { [ s, S, ssharp, dead_stroke ] };
+ key <AC03> { [ d, D, partialderivative, eth ] };
+ key <AC04> { [ f, F, function, dead_hook ] };
+ key <AC05> { [ g, G, copyright, dead_doubleacute ] };
+ key <AC06> { [ h, H, dead_abovedot, dead_belowdot ] };
+ key <AC07> { [ j, J, U2206, onehalf ] };
+ key <AC08> { [ k, K,dead_abovering, UF8FF ] };
+
+ key <AC09> { [ l, L, notsign, THORN ] };
+ key <AC10> { [ semicolon, colon, U2026, thorn ] };
+ key <AC11> { [apostrophe, quotedbl, ae, AE ] };
+
+ key <AB01> { [ z, Z, Greek_OMEGA, dead_cedilla ] };
+ key <AB02> { [ x, X, U2248, dead_ogonek ] };
+ // unclear whether "approxeq" is 2248 or 2245
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB04> { [ v, V, squareroot, U25CA ] };
+ key <AB05> { [ b, B, integral, idotless ] };
+ key <AB06> { [ n, N, dead_tilde, U02DC ] };
+ key <AB07> { [ m, M, mu, threequarters ] };
+ key <AB08> { [ comma, less, lessthanequal, dead_macron ] };
+ key <AB09> { [ period, greater, greaterthanequal, dead_breve ] };
+ key <AB10> { [ slash, question, division, questiondown ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Colemak symbols for xkb on X.Org Server 7.x
+// 2006-01-01 Shai Coleman, http://colemak.com/
+
+partial alphanumeric_keys
+xkb_symbols "colemak" {
+
+ include "us"
+ name[Group1]= "English (Colemak)";
+
+ key <TLDE> { [ grave, asciitilde, dead_tilde, asciitilde ] };
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, at, masculine, twosuperior ] };
+ key <AE03> { [ 3, numbersign, ordfeminine, threesuperior ] };
+ key <AE04> { [ 4, dollar, cent, sterling ] };
+ key <AE05> { [ 5, percent, EuroSign, yen ] };
+ key <AE06> { [ 6, asciicircum, hstroke, Hstroke ] };
+ key <AE07> { [ 7, ampersand, eth, ETH ] };
+ key <AE08> { [ 8, asterisk, thorn, THORN ] };
+ key <AE09> { [ 9, parenleft, leftsinglequotemark, leftdoublequotemark ] };
+ key <AE10> { [ 0, parenright, rightsinglequotemark, rightdoublequotemark ] };
+ key <AE11> { [ minus, underscore, endash, emdash ] };
+ key <AE12> { [ equal, plus, multiply, division ] };
+
+ key <AD01> { [ q, Q, adiaeresis, Adiaeresis ] };
+ key <AD02> { [ w, W, aring, Aring ] };
+ key <AD03> { [ f, F, atilde, Atilde ] };
+ key <AD04> { [ p, P, oslash, Ooblique ] };
+ key <AD05> { [ g, G, dead_ogonek, asciitilde ] };
+ key <AD06> { [ j, J, dstroke, Dstroke ] };
+ key <AD07> { [ l, L, lstroke, Lstroke ] };
+ key <AD08> { [ u, U, uacute, Uacute ] };
+ key <AD09> { [ y, Y, udiaeresis, Udiaeresis ] };
+ key <AD10> { [ semicolon, colon, odiaeresis, Odiaeresis ] };
+ key <AD11> { [ bracketleft, braceleft, guillemotleft, 0x1002039 ] };
+ key <AD12> { [ bracketright, braceright, guillemotright, 0x100203a ] };
+ key <BKSL> { [ backslash, bar, asciitilde, asciitilde ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC02> { [ r, R, dead_grave, asciitilde ] };
+ key <AC03> { [ s, S, ssharp, asciitilde ] };
+ key <AC04> { [ t, T, dead_acute, dead_doubleacute ] };
+ key <AC05> { [ d, D, dead_diaeresis, asciitilde ] };
+ key <AC06> { [ h, H, dead_caron, asciitilde ] };
+ key <AC07> { [ n, N, ntilde, Ntilde ] };
+ key <AC08> { [ e, E, eacute, Eacute ] };
+ key <AC09> { [ i, I, iacute, Iacute ] };
+ key <AC10> { [ o, O, oacute, Oacute ] };
+ key <AC11> { [ apostrophe, quotedbl, otilde, Otilde ] };
+
+ key <AB01> { [ z, Z, ae, AE ] };
+ key <AB02> { [ x, X, dead_circumflex, asciitilde ] };
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB04> { [ v, V, oe, OE ] };
+ key <AB05> { [ b, B, dead_breve, asciitilde ] };
+ key <AB06> { [ k, K, dead_abovering, asciitilde ] };
+ key <AB07> { [ m, M, dead_macron, asciitilde ] };
+ key <AB08> { [ comma, less, dead_cedilla, asciitilde ] };
+ key <AB09> { [ period, greater, dead_abovedot, asciitilde ] };
+ key <AB10> { [ slash, question, questiondown, asciitilde ] };
+
+ key <CAPS> { [ BackSpace, BackSpace, BackSpace, BackSpace ] };
+ key <LSGT> { [ minus, underscore, endash, emdash ] };
+ key <SPCE> { [ space, space, space, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+};
+
+// I do NOT like dead-keys - the International keyboard as defined by Microsoft
+// does not fit my needs. Why use two keystrokes for all simple characters (eg '
+// and <space> generates a single ') just to have an é (eacute) in two strokes
+// as well? I type ' more often than é (eacute).
+//
+// This file works just like a regular keyboard, BUT has all dead-keys
+// accessible at level3 (through AltGr). An ë (ediaeresis) is now: AltGr+"
+// followed by an e. In other words, this keyboard is not international as long
+// as you leave the right Alt key alone.
+//
+// The original MS International keyboard was intended for Latin1 (iso8859-1).
+// With the introduction of iso8859-15, the (important) ligature oe (and OE)
+// became available. I added them next to ae. Because I write ediaeresis more
+// often than registered, I moved registered to be next to copyright and added
+// ediaeresis and idiaeresis. - Adriaan
+
+partial alphanumeric_keys
+xkb_symbols "altgr-intl" {
+
+ include "us(intl)"
+ name[Group1]= "English (intl., with AltGr dead keys)";
+
+// five dead keys moved into level3:
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key <AC11> { [apostrophe,quotedbl, dead_acute, dead_diaeresis ] };
+
+// diversions from the MS Intl keyboard:
+
+ key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
+ key <AD04> { [ r, R, ediaeresis, Ediaeresis ] };
+ key <AC07> { [ j, J, idiaeresis, Idiaeresis ] };
+ key <AB02> { [ x, X, oe, OE ] };
+ key <AB04> { [ v, V, registered, registered ] };
+
+// onequarter etc (not in iso8859-15) moved to get three unshifted deadkeys:
+
+ key <AE06> { [ 6, asciicircum, dead_circumflex, onequarter ] };
+ key <AE07> { [ 7, ampersand, dead_horn, onehalf ] };
+ key <AE08> { [ 8, asterisk, dead_ogonek, threequarters ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Intel ClassmatePC Keyboard Layout
+// by Piter PUNK <piterpk@terra.com.br>
+//
+// The keyboard layouts below maps the us(basic), us(intl) and us(alt-intl)
+// to ClassmatePC keyboard. All layouts uses RCTL as level3(switch) since
+// the keyboard does not have AltGr key. The EuroSign is engraved at 5 key.
+
+// classmate - us(basic)
+partial alphanumeric_keys
+xkb_symbols "classmate" {
+ include "us(basic)"
+ name[Group1]= "English (US)";
+
+ key <LSGT> { [ backslash, bar, backslash, bar ] };
+
+ include "eurosign(5)"
+ include "level3(switch)"
+};
+
+// classmate-intl - us(intl)
+// RCTL is generated by Fn+Alt, because that, when trying to access
+// the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got
+// the keypad keycodes. The keypad is changed to make Fn+Alt+<KP_key>
+// generate the same symbol as the original key.
+partial alphanumeric_keys
+xkb_symbols "classmate-intl" {
+ include "us(intl)"
+ name[Group1]= "USA - ClassmatePC (International)";
+ key.type[Group1]="FOUR_LEVEL";
+
+ key <LSGT> { [ backslash, bar, backslash, bar ] };
+
+ key <KP7> { [ KP_Home, KP_7,
+ onehalf, dead_horn ] };
+ key <KP8> { [ KP_Up, KP_8,
+ threequarters, dead_ogonek ] };
+ key <KP9> { [ KP_Prior, KP_9,
+ leftsinglequotemark, dead_breve ] };
+ key <KPMU> { [ KP_Multiply, KP_Multiply,
+ rightsinglequotemark, dead_abovering ] };
+
+ key <KP4> { [ KP_Left, KP_4,
+ uacute, Uacute ] };
+ key <KP5> { [ KP_Begin, KP_5,
+ iacute, Iacute ] };
+ key <KP6> { [ KP_Right, KP_6,
+ oacute, Oacute ] };
+ key <KPSU> { [ KP_Subtract, KP_Subtract,
+ odiaeresis, Odiaeresis ] };
+
+ key <KP2> { [ KP_Down, KP_2,
+ oe, OE ] };
+ key <KP3> { [ KP_Next, KP_3,
+ oslash, Ooblique ] };
+ key <KPAD> { [ KP_Add, KP_Add,
+ paragraph, degree ] };
+
+ key <KP0> { [ KP_Insert, KP_0,
+ mu, mu ] };
+ key <KPDL> { [ KP_Delete, KP_Decimal,
+ dead_abovedot, dead_caron ] };
+ key <KPDV> { [ KP_Divide, KP_Divide,
+ questiondown, dead_hook ] };
+
+ include "level3(switch)"
+};
+
+// classmate-alt-intl - us(alt-intl)
+// RCTL is generated by Fn+Alt, because that, when trying to access
+// the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got
+// the keypad keycodes. The keypad is changed to make Fn+Alt+<KP_key>
+// generate the same symbol as the original key.
+partial alphanumeric_keys
+xkb_symbols "classmate-alt-intl" {
+ include "us(alt-intl)"
+ name[Group1]= "USA - ClassmatePC (Alternative international)";
+ key.type[Group1]="FOUR_LEVEL";
+
+ key <LSGT> { [ backslash, bar, backslash, bar ] };
+
+ key <KPSU> { [ KP_Subtract, KP_Subtract ] };
+
+ key <KP9> { [ KP_Prior, KP_9,
+ leftsinglequotemark, dead_breve ] };
+ key <KPMU> { [ KP_Multiply, KP_Multiply,
+ rightsinglequotemark, dead_abovering ] };
+
+ key <KPAD> { [ KP_Add, KP_Add,
+ dead_ogonek, dead_diaeresis ] };
+
+ key <KPDL> { [ KP_Delete, KP_Decimal,
+ dead_abovedot, dead_circumflex ] };
+ key <KPDV> { [ KP_Divide, KP_Divide,
+ dead_hook, dead_hook ] };
+
+ include "level3(switch)"
+};
+
+// classmate-altgr-intl - us(altgr-intl)
+// RCTL is generated by Fn+Alt, because that, when trying to access
+// the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got
+// the keypad keycodes. The keypad is changed to make Fn+Alt+<KP_key>
+// generate the same symbol as the original key.
+partial alphanumeric_keys
+xkb_symbols "classmate-altgr-intl" {
+ include "us(altgr-intl)"
+ name[Group1]= "USA - ClassmatePC (International Fn+Alt dead-keys)";
+ key.type[Group1]="FOUR_LEVEL";
+
+ key <LSGT> { [ backslash, bar, backslash, bar ] };
+
+ key <KP7> { [ KP_Home, KP_7,
+ dead_horn, dead_horn ] };
+ key <KP8> { [ KP_Up, KP_8,
+ dead_ogonek, dead_ogonek ] };
+ key <KP9> { [ KP_Prior, KP_9,
+ leftsinglequotemark, dead_breve ] };
+ key <KPMU> { [ KP_Multiply, KP_Multiply,
+ rightsinglequotemark, dead_abovering ] };
+
+ key <KP4> { [ KP_Left, KP_4,
+ uacute, Uacute ] };
+ key <KP5> { [ KP_Begin, KP_5,
+ iacute, Iacute ] };
+ key <KP6> { [ KP_Right, KP_6,
+ oacute, Oacute ] };
+ key <KPSU> { [ KP_Subtract, KP_Subtract,
+ odiaeresis, Odiaeresis ] };
+
+ key <KP1> { [ KP_End, KP_1,
+ idiaeresis, Idiaeresis ] };
+ key <KP2> { [ KP_Down, KP_2,
+ oe, OE ] };
+ key <KP3> { [ KP_Next, KP_3,
+ oslash, Ooblique ] };
+ key <KPAD> { [ KP_Add, KP_Add,
+ paragraph, degree ] };
+
+ key <KP0> { [ KP_Insert, KP_0,
+ mu, mu ] };
+ key <KPDL> { [ KP_Delete, KP_Decimal,
+ dead_abovedot, dead_caron ] };
+ key <KPDV> { [ KP_Divide, KP_Divide,
+ questiondown, dead_hook ] };
+
+ include "level3(switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+ include "us(basic)"
+ name[Group1]= "English (US)";
+
+ // OLPC international US English keyboard layout.
+ // It's a little different from the usual international layout.
+ // See: http://wiki.laptop.org/go/Image:Keyboard_english.png
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key <AE01> { [ 1, exclam, exclamdown, exclamdown ] };
+ key <AE02> { [ 2, at, notsign, notsign ] };
+ key <AE03> { [ 3, numbersign, 0x1000300, 0x1000300 ] }; // combining grave
+ key <AE04> { [ 4, dollar, 0x1000301, 0x1000301 ] }; // combining acute
+ key <AE05> { [ 5, percent, 0x1000306, 0x1000306 ] }; // combining breve above
+ key <AE06> { [ 6,asciicircum, 0x100030A, 0x100030A ] }; // combining ring above
+ key <AE07> { [ 7, ampersand, 0x1000302, 0x1000302 ] }; // combining circumflex above
+ key <AE08> { [ 8, asterisk, 0x100030C, 0x100030C ] }; // combining caron above
+ key <AE09> { [ 9, parenleft, 0x1000307, 0x1000307 ] }; // combining dot above
+ key <AE10> { [ 0, parenright, 0x1000308, 0x1000308 ] }; // combining diaeresis above
+ key <AE11> { [ minus, underscore, 0x1000304, 0x1000304 ] }; // combining macron above
+ key <AE12> { [ equal, plus, 0x1000303, 0x1000303 ] }; // combining tilde above
+
+ key <AD01> { [ q, Q, Greek_omega, Greek_OMEGA ] };
+ key <AD02> { [ w, W, oslash, Oslash ] };
+ key <AD03> { [ e, E, oe, OE ] };
+ key <AD04> { [ r, R, 0x1000327, 0x1000327 ] }; // combining cedilla
+ key <AD05> { [ t, T, 0x100032E, 0x100032E ] }; // combining breve below
+ key <AD06> { [ y, Y, 0x1000325, 0x1000325 ] }; // combining ring below
+ key <AD07> { [ u, U, 0x100032D, 0x100032D ] }; // combining circumflex below
+ key <AD08> { [ i, I, 0x100032C, 0x100032C ] }; // combining caron below
+ key <AD09> { [ o, O, 0x1000323, 0x1000323 ] }; // combining dot below
+ key <AD10> { [ p, P, 0x1000324, 0x1000324 ] }; // combining diaeresis below
+ key <AD11> { [ bracketleft, braceleft, 0x1000331, 0x1000331 ] }; // combining macron below
+ key <AD12> { [bracketright, braceright, 0x1000330, 0x1000330 ] }; // combining tilde below
+
+ key <AC01> { [ a, A, ae, AE ] };
+ key <AC02> { [ s, S, ssharp, 0x1001E9C ] }; // uppercase S sharp
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, thorn, THORN ] };
+ key <AC06> { [ h, H, sterling, sterling ] };
+ key <AC07> { [ j, J, EuroSign, EuroSign ] };
+ key <AC10> { [ semicolon, colon, masculine, ordfeminine ] };
+ key <AC11> { [ apostrophe, quotedbl, currency, currency ] };
+ key <AC12> { [ backslash, bar, section, section ] };
+
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+ key <AB07> { [ m, M, mu, mu ] };
+ key <AB08> { [ comma, less, guillemotleft, guillemotleft ] };
+ key <AB09> { [ period, greater, guillemotright, guillemotright ] };
+ key <AB10> { [ slash, question, questiondown, questiondown ] };
+
+ key <I219> { [ multiply, division, ISO_Next_Group, ISO_Prev_Group ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc2" {
+ include "us(olpc)"
+ name[Group1]= "English (the divide/multiply keys toggle the layout)";
+ include "group(olpc)"
+};
+
+xkb_symbols "olpcm" {
+
+ include "us(basic)"
+ name[Group1]= "English (US)";
+
+ // Mechanical (non-membrane) OLPC int'l US English keyboard layout.
+ // See: http://wiki.laptop.org/go/OLPC_English_Non-membrane_Keyboard
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key <AE01> { [ 1, exclam, exclamdown, exclamdown ] };
+ key <AE02> { [ 2, at, notsign, notsign ] };
+ key <AE03> { [ 3, numbersign, 0x1000300, 0x1000300 ] }; // combining grave
+ key <AE04> { [ 4, dollar, 0x1000301, 0x1000301 ] }; // combining acute
+ key <AE05> { [ 5, percent, 0x1000306, 0x1000306 ] }; // combining breve above
+ key <AE06> { [ 6,asciicircum, 0x100030A, 0x100030A ] }; // combining ring above
+ key <AE07> { [ 7, ampersand, 0x1000302, 0x1000302 ] }; // combining circumflex above
+ key <AE08> { [ 8, asterisk, 0x100030C, 0x100030C ] }; // combining caron above
+ key <AE09> { [ 9, parenleft, 0x1000307, 0x1000307 ] }; // combining dot above
+ key <AE10> { [ 0, parenright, 0x1000308, 0x1000308 ] }; // combining diaeresis above
+ key <AE11> { [ minus, underscore, 0x1000304, 0x1000304 ] }; // combining macron above
+
+ key <AD01> { [ q, Q, Greek_omega, Greek_OMEGA ] };
+ key <AD02> { [ w, W, oslash, Oslash ] };
+ key <AD03> { [ e, E, oe, OE ] };
+ key <AD04> { [ r, R, 0x1000327, 0x1000327 ] }; // combining cedilla
+ key <AD05> { [ t, T, 0x100032E, 0x100032E ] }; // combining breve below
+ key <AD06> { [ y, Y, 0x1000325, 0x1000325 ] }; // combining ring below
+ key <AD07> { [ u, U, 0x100032D, 0x100032D ] }; // combining circumflex below
+ key <AD08> { [ i, I, 0x100032C, 0x100032C ] }; // combining caron below
+ key <AD09> { [ o, O, 0x1000323, 0x1000323 ] }; // combining dot below
+ key <AD10> { [ p, P, 0x1000324, 0x1000324 ] }; // combining diaeresis below
+ key <AD11> { [ bracketleft, braceleft, 0x1000331, 0x1000331 ] }; // combining macron below
+ key <AD12> { [bracketright, braceright, 0x1000330, 0x1000330 ] }; // combining tilde below
+
+ key <AC01> { [ a, A, ae, AE ] };
+ key <AC02> { [ s, S, ssharp, 0x1001E9C ] }; // uppercase S sharp
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, thorn, THORN ] };
+ key <AC06> { [ h, H, sterling, sterling ] };
+ key <AC07> { [ j, J, EuroSign, EuroSign ] };
+ key <AC10> { [ semicolon, colon, masculine, ordfeminine ] };
+ // no AC11 or AC12 on olpcm
+
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+ key <AB07> { [ m, M, mu, mu ] };
+ key <AB08> { [ comma, less, guillemotleft, guillemotleft ] };
+ key <AB09> { [ period, greater, guillemotright, guillemotright ] };
+ key <AB10> { [ slash, question, questiondown, questiondown ] };
+
+ key <AA02> { [ backslash, bar, section, section ] };
+ key <AA06> { [ equal, plus, 0x1000303, 0x1000303 ] };
+ key <AA07> { [ apostrophe, quotedbl, currency, currency ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Based on Cherokee Nation Official Layout
+// http://www.cherokee.org/extras/downloads/font/Keyboard.htm
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "chr" {
+
+ name[Group1]= "Cherokee";
+ key.type[group1]="ALPHABETIC";
+
+ key <TLDE> { [ grave, U13CA ] };
+ key <AE01> { [ 1, U13B1 ] };
+ key <AE02> { [ 2, U13C7 ] };
+ key <AE03> { [ 3, U13E7 ] };
+ key <AE04> { [ U13D9, U13B0 ] };
+ key <AE05> { [ U13E6, U13B9 ] };
+ key <AE06> { [ U13DC, U13DD ] };
+ key <AE07> { [ U13CB, U13E1 ] };
+ key <AE08> { [ U13D6, U13BA ] };
+ key <AE09> { [ U13D2, parenleft ] };
+ key <AE10> { [ U13C4, parenright ] };
+ key <AE11> { [ U13BF, U13BC ] };
+ key <AE12> { [ U13F3, U13BD ] };
+
+ key <AD01> { [ U13AA, U13C6 ] };
+ key <AD02> { [ U13B3, U13EB ] };
+ key <AD03> { [ U13A1, U13E3 ] };
+ key <AD04> { [ U13DB, U13CF ] };
+ key <AD05> { [ U13D4, U13D8 ] };
+ key <AD06> { [ U13EF, U13F2 ] };
+ key <AD07> { [ U13A4, U13AD ] };
+ key <AD08> { [ U13A2, U13F1 ] };
+ key <AD09> { [ U13A3, U13EC ] };
+ key <AD10> { [ U13C1, U13EA ] };
+ key <AD11> { [ U13D5, U13D1 ] };
+ key <AD12> { [ U13B6, U13E4 ] };
+ key <BKSL> { [ U13E9, U13EE ] };
+
+ key <AC01> { [ U13A0, U13CC ] };
+ key <AC02> { [ U13CD, U13CE ] };
+ key <AC03> { [ U13D7, U13D0 ] };
+ key <AC04> { [ U13A9, U13C8 ] };
+ key <AC05> { [ U13A6, U13E5 ] };
+ key <AC06> { [ U13AF, U13B2 ] };
+ key <AC07> { [ U13DA, U13AB ] };
+ key <AC08> { [ U13B8, U13A7 ] };
+ key <AC09> { [ U13B5, U13AE ] };
+ key <AC10> { [ U13E8, U13E0 ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ U13AC, U13C3 ] };
+ key <AB02> { [ U13F4, U13ED ] };
+ key <AB03> { [ U13D3, U13DF ] };
+ key <AB04> { [ U13A5, U13DE ] };
+ key <AB05> { [ U13A8, U13F0 ] };
+ key <AB06> { [ U13BE, U13BB ] };
+ key <AB07> { [ U13C5, U13B7 ] };
+ key <AB08> { [ comma, U13E2 ] };
+ key <AB09> { [ period, U13B4 ] };
+ key <AB10> { [ U13C2, U13C9 ] };
+};
+
+// Serbian charecters added as third level symbols to US keyboard layout.
+
+partial alphanumeric_keys
+xkb_symbols "hbs" {
+
+ include "us"
+ name[Group1]= "Serbo-Croatian (US)";
+
+ key <TLDE> { [ grave, asciitilde ] };
+ key <AE06> { [ 6, dead_caron, asciicircum, asciicircum ] };
+ key <AE08> { [ 8, asterisk, multiply, division ] };
+ key <AE11> { [ minus, underscore, endash, emdash ] };
+ key <AC09> { [ l, L, U1C9, U1C8 ] };
+ key <AB06> { [ n, N, U1CC, U1CB ] };
+ key <AB01> { [ z, Z, U1C6, U1C5 ] };
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AC03> { [ d, D, dstroke, Dstroke ] };
+ key <AC11> { [ dead_acute, quotedbl, apostrophe, apostrophe ] };
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
+ key <AB08> { [ comma, less, U3003, guillemotright ] };
+ key <AB09> { [ period, greater, ellipsis, guillemotleft ] };
+
+ include "level3(ralt_switch)"
+};
+
+//based on http://upload.wikimedia.org/wikipedia/commons/1/18/T-Mobile_G1_launch_event_2.jpg
+partial alphanumeric_keys
+xkb_symbols "htcdream" {
+ include "inet(htcdream)"
+ name[Group1]= "English (US)";
+
+ //second row
+ key <AD01> { [ q, Q, Tab, Tab ] };
+ key <AD02> { [ w, W, grave, grave ] };
+ key <AD03> { [ e, E, underscore, underscore ] };
+ key <AD04> { [ r, R, sterling, sterling ] };
+ key <AD05> { [ t, T, EuroSign, EuroSign ] };
+ key <AD06> { [ y, Y, division, division ] };
+ key <AD07> { [ u, U, multiply, multiply ] };
+ key <AD08> { [ i, I, minus, minus ] };
+ key <AD09> { [ o, O, plus, plus ] };
+ key <AD10> { [ p, P, equal, equal ] };
+
+ //third row
+ key <AC01> { [ a, A, NoSymbol, NoSymbol ] };
+ key <AC02> { [ s, S, bar, bar ] };
+ key <AC03> { [ d ,D, backslash, backslash ] };
+ key <AC04> { [ f, F, braceleft, braceleft ] };
+ key <AC05> { [ g, G, braceright, braceright ] };
+ key <AC06> { [ h, H, colon, colon ] };
+ key <AC07> { [ j, J, semicolon, semicolon ] };
+ key <AC08> { [ k, K, quotedbl, quotedbl ] };
+ key <AC09> { [ l, L, apostrophe, apostrophe ] };
+
+ //forth row
+ key <AB01> { [ z, Z, NoSymbol, NoSymbol ] };
+ key <AB02> { [ x, X, NoSymbol, NoSymbol ] };
+ key <AB03> { [ c, C, NoSymbol, NoSymbol ] };
+ key <AB04> { [ v, V, bracketleft, bracketleft ] };
+ key <AB05> { [ b, B, bracketright, bracketright ] };
+ key <AB06> { [ n, N, less, less ] };
+ key <AB07> { [ m, M, greater, greater ] };
+ key <AB08> { [ comma, comma, question, question ] };
+
+ //fifth row
+ key <FK15> { [ at, at, asciitilde, asciitilde ] };
+
+ include "level3(alt_switch)"
+};
+
+// Workman Keyboard Layout symbols for xkb on X.Org Server 7.x
+// 09-06-2010 OJ Bucao. http://www.workmanlayout.com
+
+partial alphanumeric_keys
+xkb_symbols "workman" {
+
+ include "us(basic)"
+ name[Group1]= "English (Workman)";
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ d, D ] };
+ key <AD03> { [ r, R ] };
+ key <AD04> { [ w, W ] };
+ key <AD05> { [ b, B ] };
+ key <AD06> { [ j, J ] };
+ key <AD07> { [ f, F ] };
+ key <AD08> { [ u, U ] };
+ key <AD09> { [ p, P ] };
+ key <AD10> { [ semicolon, colon ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ h, H ] };
+ key <AC04> { [ t, T ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ y, Y ] };
+ key <AC07> { [ n, N ] };
+ key <AC08> { [ e, E ] };
+ key <AC09> { [ o, O ] };
+ key <AC10> { [ i, I ] };
+
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ m, M ] };
+ key <AB04> { [ c, C ] };
+ key <AB05> { [ v, V ] };
+ key <AB06> { [ k, K ] };
+ key <AB07> { [ l, L ] };
+
+ key <CAPS> { [ BackSpace, Escape, BackSpace, BackSpace ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "workman-intl" {
+
+ include "us(intl)"
+ name[Group1]= "English (Workman, intl., with dead keys)";
+
+ key <AD01> { [ q, Q, adiaeresis, Adiaeresis ] };
+ key <AD02> { [ d, D, eth, ETH ] };
+ key <AD03> { [ r, R, registered, registered ] };
+ key <AD04> { [ w, W, aring, Aring ] };
+ key <AD05> { [ b, B, b, B ] };
+ key <AD06> { [ j, J, j, J ] };
+ key <AD07> { [ f, F, f, F ] };
+ key <AD08> { [ u, U, uacute, Uacute ] };
+ key <AD09> { [ p, P, odiaeresis, Odiaeresis ] };
+ key <AD10> { [ semicolon, colon, paragraph, degree ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC02> { [ s, S, ssharp, section ] };
+ key <AC03> { [ h, H, h, H ] };
+ key <AC04> { [ t, T, thorn, THORN ] };
+ key <AC05> { [ g, G, g, G ] };
+ key <AC06> { [ y, Y, udiaeresis, Udiaeresis ] };
+ key <AC07> { [ n, N, ntilde, Ntilde ] };
+ key <AC08> { [ e, E, eacute, Eacute ] };
+ key <AC09> { [ o, O, oacute, Oacute ] };
+ key <AC10> { [ i, I, iacute, Iacute ] };
+
+ key <AB01> { [ z, Z, ae, AE ] };
+ key <AB02> { [ x, X, x, X ] };
+ key <AB03> { [ m, M, mu, mu ] };
+ key <AB04> { [ c, C, copyright, cent ] };
+ key <AB05> { [ v, V, v, V ] };
+ key <AB06> { [ k, K, oe, OE ] };
+ key <AB07> { [ l, L, oslash, Ooblique ] };
+
+ key <CAPS> { [ BackSpace, Escape, BackSpace, BackSpace ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Norman keyboard layout symbols for xkb on X.Org Server 7.x
+// Written 11/23/2012, revised 3/7/2013 by David Norman http://normanlayout.info
+// To the extent possible under law, the author(s) have dedicated all
+// copyright and related and neighboring rights to this software to the
+// public domain worldwide. This software is distributed without any warranty.
+
+partial alphanumeric_keys
+xkb_symbols "norman" {
+
+ include "us(basic)"
+ name[Group1]= "English (Norman)";
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ d, D ] };
+ key <AD04> { [ f, F ] };
+ key <AD05> { [ k, K ] };
+ key <AD06> { [ j, J ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ r, R ] };
+ key <AD09> { [ l, L ] };
+ key <AD10> { [ semicolon, colon ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ e, E ] };
+ key <AC04> { [ t, T ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ y, Y ] };
+ key <AC07> { [ n, N ] };
+ key <AC08> { [ i, I ] };
+ key <AC09> { [ o, O ] };
+ key <AC10> { [ h, H ] };
+
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ p, P ] };
+ key <AB07> { [ m, M ] };
+
+ key <CAPS> { [ BackSpace ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Carpalx layout created by Martin Krzywinski
+// http://mkweb.bcgsc.ca/carpalx/
+
+partial alphanumeric_keys
+xkb_symbols "carpalx" {
+
+ name[Group1]= "English (Carpalx)";
+
+ key <TLDE> { [ grave, asciitilde ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, asciicircum ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ g, G ] };
+ key <AD03> { [ m, M ] };
+ key <AD04> { [ l, L ] };
+ key <AD05> { [ w, W ] };
+ key <AD06> { [ y, Y ] };
+ key <AD07> { [ f, F ] };
+ key <AD08> { [ u, U ] };
+ key <AD09> { [ b, B ] };
+ key <AD10> { [ semicolon, colon ] };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+
+ key <AC01> { [ d, D ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ t, T ] };
+ key <AC04> { [ n, N ] };
+ key <AC05> { [ r, R ] };
+ key <AC06> { [ i, I ] };
+ key <AC07> { [ a, A ] };
+ key <AC08> { [ e, E ] };
+ key <AC09> { [ o, O ] };
+ key <AC10> { [ h, H ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ j, J ] };
+ key <AB06> { [ k, K ] };
+ key <AB07> { [ p, P ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+
+ key <BKSL> { [ backslash, bar ] };
+};
+
+// Carpalx layout created by Martin Krzywinski
+// http://mkweb.bcgsc.ca/carpalx/
+// Merged with us(intl) and modified to move
+// accented vowels closer to the plain vowels
+
+partial alphanumeric_keys
+xkb_symbols "carpalx-intl" {
+
+ include "us(carpalx)"
+ name[Group1]= "English (Carpalx, intl., with dead keys)";
+
+ key <TLDE> { [dead_grave, dead_tilde, grave, asciitilde ] };
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, at, twosuperior, dead_doubleacute ] };
+ key <AE03> { [ 3, numbersign, threesuperior, dead_macron ] };
+ key <AE04> { [ 4, dollar, currency, sterling ] };
+ key <AE05> { [ 5, percent, EuroSign, dead_cedilla ] };
+ key <AE06> { [ 6, dead_circumflex, onequarter, asciicircum ] };
+ key <AE07> { [ 7, ampersand, onehalf, dead_horn ] };
+ key <AE08> { [ 8, asterisk, threequarters, dead_ogonek ] };
+ key <AE09> { [ 9, parenleft, leftsinglequotemark, dead_breve ] };
+ key <AE10> { [ 0, parenright, rightsinglequotemark, dead_abovering ] };
+ key <AE11> { [ minus, underscore, yen, dead_belowdot ] };
+ key <AE12> { [ equal, plus, multiply, division ] };
+
+ key <AD01> { [ q, Q, degree, paragraph ] };
+ key <AD02> { [ g, G, U011F, U011E ] };
+ key <AD03> { [ m, M, mu, mu ] };
+ key <AD04> { [ l, L, copyright, cent ] };
+ key <AD05> { [ w, W, w, W ] };
+ key <AD06> { [ y, Y, idiaeresis, Idiaeresis ] };
+ key <AD07> { [ f, F, adiaeresis, Adiaeresis ] };
+ key <AD08> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AD09> { [ b, B, odiaeresis, Odiaeresis ] };
+ key <AD10> { [ semicolon, colon, oslash, Ooblique ] };
+ key <AD11> { [ bracketleft, braceleft, guillemotleft, leftdoublequotemark ] };
+ key <AD12> { [bracketright, braceright, guillemotright, rightdoublequotemark ] };
+
+ key <AC01> { [ d, D, eth, ETH ] };
+ key <AC02> { [ s, S, ssharp, section ] };
+ key <AC03> { [ t, T, thorn, THORN ] };
+ key <AC04> { [ n, N, ntilde, Ntilde ] };
+ key <AC05> { [ r, R, registered, registered ] };
+ key <AC06> { [ i, I, iacute, Iacute ] };
+ key <AC07> { [ a, A, aacute, Aacute ] };
+ key <AC08> { [ e, E, eacute, Eacute ] };
+ key <AC09> { [ o, O, oacute, Oacute ] };
+ key <AC10> { [ h, H, uacute, Uacute ] };
+ key <AC11> { [dead_acute, dead_diaeresis, apostrophe, quotedbl ] };
+
+ key <AB01> { [ z, Z, z, Z ] };
+ key <AB02> { [ x, X, U015F, U015E ] };
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB04> { [ v, V, ae, AE ] };
+ key <AB05> { [ j, J, oe, OE ] };
+ key <AB06> { [ k, K, U0131, U0130 ] };
+ key <AB07> { [ p, P, aring, Aring ] };
+ key <AB08> { [ comma, less, ediaeresis, Ediaeresis ] };
+ key <AB09> { [ period, greater, dead_abovedot, dead_caron ] };
+ key <AB10> { [ slash, question, questiondown, dead_hook ] };
+ key <BKSL> { [ backslash, bar, notsign, brokenbar ] };
+
+ key <LSGT> { [ backslash, bar, backslash, bar ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Carpalx layout created by Martin Krzywinski
+// http://mkweb.bcgsc.ca/carpalx/
+// Merged with us(intl) and us(altgr-intl) and modified to move
+// accented vowels closer to the plain vowels
+
+partial alphanumeric_keys
+xkb_symbols "carpalx-altgr-intl" {
+
+ include "us(carpalx-intl)"
+ name[Group1]= "English (Carpalx, intl., with AltGr dead keys)";
+
+// five dead keys moved into level3:
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key <AC11> { [apostrophe,quotedbl, dead_acute, dead_diaeresis ] };
+
+// diversions from the MS Intl keyboard:
+
+ key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
+
+// onequarter etc (not in iso8859-15) moved to get three unshifted deadkeys:
+
+ key <AE06> { [ 6, asciicircum, dead_circumflex, onequarter ] };
+ key <AE07> { [ 7, ampersand, dead_horn, onehalf ] };
+ key <AE08> { [ 8, asterisk, dead_ogonek, threequarters ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Carpalx layout created by Martin Krzywinski
+// Full optimization variant without fixed QWERTY-like ZXCV keys
+// http://mkweb.bcgsc.ca/carpalx/
+
+partial alphanumeric_keys
+xkb_symbols "carpalx-full" {
+
+ include "us(carpalx)"
+ name[Group1]= "English (Carpalx, full optimization)";
+
+ key <AD06> { [ b, B ] };
+ key <AD07> { [ y, Y ] };
+ key <AD09> { [ v, V ] };
+
+ key <AB04> { [ f, F ] };
+};
+
+// Carpalx layout created by Martin Krzywinski
+// Full optimization variant without fixed QWERTY-like ZXCV keys
+// http://mkweb.bcgsc.ca/carpalx/
+// Merged with us(intl) and modified to move
+// accented vowels closer to the plain vowels
+
+partial alphanumeric_keys
+xkb_symbols "carpalx-full-intl" {
+
+ include "us(carpalx-intl)"
+ name[Group1]= "English (Carpalx, full optimization, intl., with dead keys)";
+
+ key <AD06> { [ b, B, idiaeresis, Idiaeresis ] };
+ key <AD07> { [ y, Y, adiaeresis, Adiaeresis ] };
+ key <AD09> { [ v, V, odiaeresis, Odiaeresis ] };
+
+ key <AB04> { [ f, F, ae, AE ] };
+};
+
+// Carpalx layout created by Martin Krzywinski
+// Full optimization variant without fixed QWERTY-like ZXCV keys
+// http://mkweb.bcgsc.ca/carpalx/
+// Merged with us(intl) and us(altgr-intl) and modified to move
+// accented vowels closer to the plain vowels
+
+partial alphanumeric_keys
+xkb_symbols "carpalx-full-altgr-intl" {
+
+ include "us(carpalx-altgr-intl)"
+ name[Group1]= "English (Carpalx, full optimization, intl., with AltGr dead keys)";
+
+ key <AD06> { [ b, B, idiaeresis, Idiaeresis ] };
+ key <AD07> { [ y, Y, adiaeresis, Adiaeresis ] };
+ key <AD09> { [ v, V, odiaeresis, Odiaeresis ] };
+
+ key <AB04> { [ f, F, ae, AE ] };
+};
+
+// EXTRAS:
+
+// Czech, Slovak and German charecters added as third level symbols to US keyboard layout.
+partial alphanumeric_keys
+xkb_symbols "cz_sk_de" {
+
+ include "us"
+ name[Group1]="Czech Slovak and German (US)";
+
+ key <TLDE> { [grave, asciitilde, uring, Uring ] };
+ key <AE01> { [ 1, exclam, uacute, Uacute ] };
+ key <AE02> { [ 2, at, ecaron, Ecaron ] };
+ key <AE03> { [ 3, numbersign, scaron, Scaron ] };
+ key <AE04> { [ 4, dollar, ccaron, Ccaron ] };
+ key <AE05> { [ 5, percent, rcaron, Rcaron ] };
+ key <AE06> { [ 6, asciicircum, zcaron, Zcaron ] };
+ key <AE07> { [ 7, ampersand, yacute, Yacute ] };
+ key <AE08> { [ 8, asterisk, aacute, Aacute ] };
+ key <AE09> { [ 9, parenleft, iacute, Iacute ] };
+ key <AE10> { [ 0, parenright, eacute, Eacute ] };
+ key <AE11> { [minus, underscore, ssharp, 0x1001E9E ] };
+ key <AE12> { [equal, plus, dead_acute, dead_caron ] };
+
+ key <AD03> { [ e, E, EuroSign, Eacute ] };
+
+ key <AD11> { [bracketleft, braceleft, udiaeresis, Udiaeresis ] };
+ key <AC10> { [ semicolon, colon, odiaeresis, Odiaeresis ] };
+ key <AC11> { [apostrophe, quotedbl,adiaeresis, Adiaeresis ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ key <AD06> { [ y, Y, yacute, Yacute ] };
+ key <AD07> { [ u, U, uring, Uring ] };
+
+ key <AC02> { [ s, S, scaron, Scaron ] };
+ key <AB01> { [ z, Z, zcaron, Zcaron ] };
+ key <AB03> { [ c, C, ccaron, Ccaron ] };
+ key <AD04> { [ r, R, rcaron, Rcaron ] };
+ key <AD05> { [ t, T, tcaron, Tcaron ] };
+ key <AC03> { [ d, D, dcaron, Dcaron ] };
+ key <AB06> { [ n, N, ncaron, Ncaron ] };
+ key <AC09> { [ l, L, lcaron, Lcaron ] };
+ key <AD10> { [ p, P,ocircumflex, Ocircumflex ] };
+
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace] };
+
+ include "level3(ralt_switch)"
+};
+
+// XCompose is out! Unicode combining is in! For those of us who live
+// on the edge: A keymap using Unicode combining characters instead of
+// deadkeys. This variation does not deviate from the lame MS-style
+// US-intl layout; but it uses AltGr for combining, like altgr-intl.
+//
+// This might break your font layout layout systems (because they
+// suck), caveat emptor. Also, most of today's software will count
+// individual combining marks for selection, deletion, character
+// counting &c., and won't be smart enough to do canonical equivalence
+// when searching, &c.
+//
+// With Unicode combining you use "handwriting order", not
+// "typewriting order" as with deadkeys. That is, you first type the
+// base character, then the diacritics/accents/modifiers. This has
+// the advantage of avoiding hidden states --- each keypress changes
+// something on screen.
+//
+// TODO: as of now, this duplicates all us(intl) functionality with
+// combining. With care, perhaps we could add more combining marks
+// not present in intl, and support all major languages.
+partial alphanumeric_keys
+xkb_symbols "intl-unicode" {
+
+ name[Group1]= "English (US, international AltGr Unicode combining)";
+
+ include "us(intl)"
+ include "level3(ralt_switch)"
+
+ // grave, tilde
+ key <TLDE> { [grave, asciitilde, U0300, U0303 ] };
+ // double acute
+ key <AE02> { [ 2, at, twosuperior, U030B ] };
+ // macron
+ key <AE03> { [ 3, numbersign, threesuperior, U0304 ] };
+ // circumflex
+ key <AE06> { [ 6, asciicircum, onequarter, U0302 ] };
+ // horn
+ key <AE07> { [ 7, ampersand, onehalf, U031B ] };
+ // ogonek
+ key <AE08> { [ 8, asterisk, threequarters, U0328 ] };
+ // breve
+ key <AE09> { [ 9, parenleft, leftsinglequotemark, U0306 ] };
+ // abovering
+ key <AE10> { [ 0, parenright, rightsinglequotemark, U030A ] };
+
+ // belowdot
+ key <AE11> { [ minus, underscore, yen, U0323 ] };
+ // acute, diaeresis
+ key <AC11> { [apostrophe, quotedbl, U0301, U0308 ] };
+ // abovedot, caron
+ key <AB09> { [ period, greater, U0307, U030C ] };
+ // hook
+ key <AB10> { [ slash, question, questiondown, U0309 ] };
+
+ // alt-intl compatibility
+ // cedilla, caron
+ key <AB08> { [ comma, less, U0327, U030C ] };
+ // ogonek, diaeresis
+ key <AC10> { [ semicolon, colon, U0328, U0308 ] };
+ // doubleacute, horn
+ key <AE12> { [ equal, plus, U030B, U031B ] };
+
+ // we don't do combining latin letters and combining enclosures
+ // because support for those is very rare.
+};
+
+// XCompose is out! Unicode combining is in! For those of us who live
+// on the edge: A keymap using Unicode combining characters instead of
+// deadkeys. This variation does break compatibility with us-intl,
+// whenever I thought it would be more mnemonic or Unicodeish.
+partial alphanumeric_keys
+xkb_symbols "alt-intl-unicode" {
+
+ name[Group1]= "English (US, international AltGr Unicode combining, alternative)";
+
+ include "us(intl-unicode)"
+
+ // easier macron; em-dash.
+ // em-dash is available via compose, but I added here since it's such
+ // an important typographic character.
+ key <AE11> { [ minus, underscore, U0304, U2014 ] };
+
+ // belowdot, abovedot (caron at coma/less key, per above)
+ key <AB09> { [ period, greater, U0323, U0307 ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "ats" {
+
+ include "us"
+ name[Group1]= "Atsina";
+
+ //Using Dead key to get COMBINING COMMA ABOVE for ejectives on
+ //q, l, t, s, m, g, k, p, w, y, r
+ //XCompose key is used for the other accute and grave.
+
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ key <AD11> { [ bracketleft, braceleft, U03B8 ] };
+ key <AD12> { [ bracketright, braceright, U010D, U010C ] };
+ //U+010C (uppercase Č) and U+010D (lowercase č).
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+
+ //Small letter Open use compose to key get acute accent
+ key <AB03> { [ c, C, U0254, U0186 ] };
+ key <AB08> { [ comma, less, U0313 ] };
+ key <AB10> { [ slash, question, U0294 ] };
+
+ include "level3(ralt_switch)"
+ include "compose(rctrl)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "crd" {
+
+ include "us"
+ name[Group1]= "Coeur d'Alene Salish";
+
+ key <AD02> { [ w, W, U02B7, U02B7 ] };
+ key <AE07> { [ 7, ampersand, U0294 ] };
+ key <AD01> { [ q, Q, U221A ] };
+ key <AB04> { [ v, V, U0259 ] };
+ key <BKSL> { [ backslash, bar, U026B ] };
+ key <AD03> { [ e, E, U025B ] };
+ key <AD08> { [ i, I, U026A ] };
+ key <AC07> { [ j, J, U01F0 ] };
+ key <AE06> { [ 6, asciicircum, U0295 ] };
+ key <AC02> { [ s, S, U0161 ] };
+ key <AB03> { [ c, C, U010D ] };
+ key <AD09> { [ o, O, U0254 ] };
+ key <AB09> { [ period, greater, U0323 ] };
+
+ include "level3(ralt_switch)"
+ include "compose(rctrl)"
+};
+
+
+partial alphanumeric_keys
+ xkb_symbols "sun_type6" {
+ include "sun_vndr/us(sun_type6)"
+};
diff --git a/test/data/sync.sh b/test/data/sync.sh
new file mode 100755
index 0000000..10001bc
--- /dev/null
+++ b/test/data/sync.sh
@@ -0,0 +1,69 @@
+#/bin/sh
+
+XKBCONFIGROOT='/usr/share/X11/xkb'
+
+if [ ! -d test/data ]; then
+ echo "Run this from the top source dir"
+ exit 1
+fi
+
+for file in \
+ symbols/terminate \
+ symbols/in \
+ symbols/keypad \
+ symbols/altwin \
+ symbols/ctrl \
+ symbols/eurosign \
+ symbols/inet \
+ symbols/shift \
+ symbols/pc \
+ symbols/ca \
+ symbols/cz \
+ symbols/srvr_ctrl \
+ symbols/capslock \
+ symbols/latin \
+ symbols/level5 \
+ symbols/macintosh_vndr/apple \
+ symbols/macintosh_vndr/us \
+ symbols/us \
+ symbols/nbsp \
+ symbols/il \
+ symbols/group \
+ symbols/compose \
+ symbols/level3 \
+ symbols/ru \
+ symbols/rupeesign \
+ symbols/kpdl \
+ symbols/de \
+ symbols/ch \
+ symbols/empty \
+ keycodes/xfree86 \
+ keycodes/aliases \
+ keycodes/evdev \
+ keycodes/empty \
+ types/complete \
+ types/pc \
+ types/basic \
+ types/iso9995 \
+ types/level5 \
+ types/numpad \
+ types/extra \
+ types/mousekeys \
+ compat/complete \
+ compat/lednum \
+ compat/pc \
+ compat/ledscroll \
+ compat/basic \
+ compat/misc \
+ compat/iso9995 \
+ compat/accessx \
+ compat/xfree86 \
+ compat/level5 \
+ compat/caps \
+ compat/ledcaps \
+ compat/mousekeys \
+ rules/base \
+ rules/evdev \
+; do
+ cp "$XKBCONFIGROOT/$file" "test/data/$file"
+done
diff --git a/test/data/types/basic b/test/data/types/basic
new file mode 100644
index 0000000..fff06be
--- /dev/null
+++ b/test/data/types/basic
@@ -0,0 +1,30 @@
+default xkb_types "basic" {
+
+ // Fairly standard definitions for
+ // three of the four required key types.
+ // The fourth type "KEYPAD" is defined in the "numpad" file.
+
+ virtual_modifiers NumLock;
+
+ type "ONE_LEVEL" {
+ modifiers = None;
+ map[None] = Level1;
+ level_name[Level1]= "Any";
+ };
+
+ type "TWO_LEVEL" {
+ modifiers = Shift;
+ map[Shift] = Level2;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ };
+
+ type "ALPHABETIC" {
+ modifiers = Shift+Lock;
+ map[Shift] = Level2;
+ map[Lock] = Level2;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Caps";
+ };
+
+};
diff --git a/test/data/types/complete b/test/data/types/complete
new file mode 100644
index 0000000..3b59ca2
--- /dev/null
+++ b/test/data/types/complete
@@ -0,0 +1,9 @@
+default xkb_types "complete" {
+ include "basic"
+ include "mousekeys"
+ include "pc"
+ include "iso9995"
+ include "level5"
+ include "extra"
+ include "numpad"
+};
diff --git a/test/data/types/extra b/test/data/types/extra
new file mode 100644
index 0000000..e7529f4
--- /dev/null
+++ b/test/data/types/extra
@@ -0,0 +1,158 @@
+partial default xkb_types "default" {
+
+ // Defines a type with a four-level shift, similar to the three-level
+ // type used for iso9995, but it lets the Shift key behave "normally".
+
+ virtual_modifiers LevelThree;
+
+ type "FOUR_LEVEL" {
+ modifiers = Shift+LevelThree;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Shift Alt";
+ };
+
+ type "FOUR_LEVEL_ALPHABETIC" {
+ modifiers = Shift+Lock+LevelThree;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[Lock] = Level2;
+ map[LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ map[Lock+LevelThree] = Level4;
+ map[Lock+Shift+LevelThree] = Level3;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Shift Alt";
+ };
+
+ type "FOUR_LEVEL_SEMIALPHABETIC" {
+ modifiers = Shift+Lock+LevelThree;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[Lock] = Level2;
+ map[LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ map[Lock+LevelThree] = Level3;
+ map[Lock+Shift+LevelThree] = Level4;
+ preserve[Lock+LevelThree] = Lock;
+ preserve[Lock+Shift+LevelThree] = Lock;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Shift Alt";
+ };
+
+ // A four-level keypad variant. The first two levels are controlled by
+ // NumLock (with active shifting like in KEYPAD). LevelThree overrides
+ // this mode, with two additional shifted levels.
+ type "FOUR_LEVEL_MIXED_KEYPAD" {
+ modifiers = Shift+NumLock+LevelThree;
+ map[None] = Level1;
+ map[Shift+NumLock] = Level1;
+ map[NumLock] = Level2;
+ map[Shift] = Level2;
+ map[LevelThree] = Level3;
+ map[NumLock+LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ map[Shift+NumLock+LevelThree] = Level4;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Number";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Shift Alt";
+ };
+
+ // Base level, two shifted LevelThree levels, one Ctrl+Alt command level.
+ type "FOUR_LEVEL_X" {
+ modifiers = Shift+LevelThree+Control+Alt;
+ map[None] = Level1;
+ map[LevelThree] = Level2;
+ map[Shift+LevelThree] = Level3;
+ map[Control+Alt] = Level4;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Alt Base";
+ level_name[Level3] = "Shift Alt";
+ level_name[Level4] = "Ctrl+Alt";
+ };
+
+// A special type for keys used in the Serbian Latin Unicode keymap.
+// It makes it possible to use all three forms of latin letters
+// present in Unicode that are made up of two separate letters
+// (forms like LJ, Lj, and lj; NJ, Nj, and nj; etcetera).
+
+ type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" {
+ modifiers = Shift+Lock+LevelThree;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[Lock] = Level4;
+ map[LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ map[Lock+LevelThree] = Level3;
+ map[Lock+Shift+LevelThree] = Level3;
+ preserve[Lock]= Lock;
+ preserve[Lock+LevelThree]= Lock;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "AltGr Base";
+ level_name[Level4] = "Shift AltGr";
+ };
+
+// A key type for the German ssharp (for example), which is capitalized as SS.
+// CHARACTERISTICS:
+// It is FOUR_LEVEL with the exception that the fifth level is mapped to the
+// Lock modifier. If other modifiers are used, the Lock state is ignored.
+// DETAILS ABOUT GERMAN:
+// The capital form of ssharp (called sharp s) only exists for completely
+// capitalized text, not for words at the beginning of sentences nor for
+// nouns (nouns in German normally start with a captial letter).
+// The ssharp key, to the right of the zero key, takes this into account
+// and has a questionmark mapped to Shift-ssharp since normally no capital
+// version is needed.
+// When typing with active CapsLock, this key type is needed to
+// output two capital letters S because this is the only German key
+// whose capital letter is not the same as the one typed with Shift.
+
+ type "FOUR_LEVEL_PLUS_LOCK" {
+ modifiers = Shift+Lock+LevelThree;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ map[Lock] = Level5;
+ map[Lock+Shift] = Level2;
+ map[Lock+LevelThree] = Level3;
+ map[Lock+Shift+LevelThree] = Level4;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Shift Alt";
+ level_name[Level5] = "Lock";
+ };
+};
+
+// This enables the four-level shifting also for the keypad.
+partial xkb_types "keypad" {
+ virtual_modifiers LevelThree;
+
+ type "FOUR_LEVEL_KEYPAD" {
+ modifiers = Shift+NumLock+LevelThree;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[NumLock] = Level2;
+ map[Shift+NumLock] = Level1;
+ map[LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ map[NumLock+LevelThree] = Level4;
+ map[Shift+NumLock+LevelThree] = Level3;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Number";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Alt Number";
+ };
+};
diff --git a/test/data/types/iso9995 b/test/data/types/iso9995
new file mode 100644
index 0000000..d3c4e0b
--- /dev/null
+++ b/test/data/types/iso9995
@@ -0,0 +1,18 @@
+partial default xkb_types "default" {
+
+ // A key type which can be used to implement
+ // an ISO9995-style level-three shift.
+
+ virtual_modifiers LevelThree;
+
+ type "THREE_LEVEL" {
+ modifiers = Shift+LevelThree;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[LevelThree] = Level3;
+ map[Shift+LevelThree] = Level3;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Level3";
+ };
+};
diff --git a/test/data/types/level5 b/test/data/types/level5
new file mode 100644
index 0000000..0570725
--- /dev/null
+++ b/test/data/types/level5
@@ -0,0 +1,214 @@
+partial default xkb_types "default" {
+
+ // Defines a type with an eight-level shift, similar to the three-level
+ // type used for iso9995, but it lets the Shift key behave "normally".
+
+ virtual_modifiers LevelThree,ScrollLock,LevelFive;
+
+ type "EIGHT_LEVEL" {
+ modifiers = Shift+LevelThree+LevelFive;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ map[LevelFive] = Level5;
+ map[Shift+LevelFive] = Level6;
+ map[LevelThree+LevelFive] = Level7;
+ map[Shift+LevelThree+LevelFive] = Level8;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Shift Alt";
+ level_name[Level5] = "X";
+ level_name[Level6] = "X Shift";
+ level_name[Level7] = "X Alt Base";
+ level_name[Level8] = "X Shift Alt";
+ };
+
+ type "EIGHT_LEVEL_ALPHABETIC" {
+ modifiers = Shift+Lock+LevelThree+LevelFive;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[Lock] = Level2;
+ map[LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ map[Lock+LevelThree] = Level4;
+ map[Lock+Shift+LevelThree] = Level3;
+
+ map[LevelFive] = Level5;
+ map[Shift+LevelFive] = Level6;
+ map[Lock+LevelFive] = Level6;
+ map[LevelThree+LevelFive] = Level7;
+ map[Shift+LevelThree+LevelFive] = Level8;
+ map[Lock+LevelThree+LevelFive] = Level8;
+ map[Lock+Shift+LevelThree+LevelFive] = Level7;
+
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Shift Alt";
+ level_name[Level5] = "X";
+ level_name[Level6] = "X Shift";
+ level_name[Level7] = "X Alt Base";
+ level_name[Level8] = "X Shift Alt";
+ };
+
+ type "EIGHT_LEVEL_LEVEL_FIVE_LOCK" {
+ // Level5-Lock is implemented by using NumLock, because a real modifier
+ // is required.
+
+ modifiers = Shift + Lock + LevelThree + NumLock + LevelFive;
+
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[LevelThree] = Level3;
+ map[LevelThree+Shift] = Level4;
+
+ map[LevelFive] = Level5;
+ map[LevelFive+Shift] = Level6;
+ map[LevelFive+LevelThree] = Level7;
+ map[LevelFive+LevelThree+Shift] = Level8;
+
+ map[NumLock] = Level5;
+ map[NumLock+Shift] = Level6;
+ map[NumLock+LevelThree] = Level7;
+ map[NumLock+LevelThree+Shift] = Level8;
+
+ map[NumLock+LevelFive] = Level1;
+ map[NumLock+LevelFive+Shift] = Level2;
+ map[NumLock+LevelFive+LevelThree] = Level3;
+ map[NumLock+LevelFive+LevelThree+Shift] = Level4;
+
+ // Lock has no effect
+ map[Lock] = Level1;
+ map[Lock+Shift] = Level2;
+ map[Lock+LevelThree] = Level3;
+ map[Lock+LevelThree+Shift] = Level4;
+
+ map[Lock+LevelFive] = Level5;
+ map[Lock+LevelFive+Shift] = Level6;
+ map[Lock+LevelFive+LevelThree] = Level7;
+ map[Lock+LevelFive+LevelThree+Shift] = Level8;
+
+ map[Lock+NumLock] = Level5;
+ map[Lock+NumLock+Shift] = Level6;
+ map[Lock+NumLock+LevelThree] = Level7;
+ map[Lock+NumLock+LevelThree+Shift] = Level8;
+
+ map[Lock+NumLock+LevelFive] = Level1;
+ map[Lock+NumLock+LevelFive+Shift] = Level2;
+ map[Lock+NumLock+LevelFive+LevelThree] = Level3;
+ map[Lock+NumLock+LevelFive+LevelThree+Shift] = Level4;
+
+ preserve[LevelFive+Shift] = Shift;
+ preserve[NumLock+Shift] = Shift;
+ preserve[Lock+LevelFive+Shift] = Shift;
+ preserve[Lock+NumLock+Shift] = Shift;
+
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Shift Alt";
+ level_name[Level5] = "X";
+ level_name[Level6] = "X Shift";
+ level_name[Level7] = "X Alt Base";
+ level_name[Level8] = "X Shift Alt";
+ };
+
+ type "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK" {
+ // Level5-Lock is implemented by using NumLock, because a real modifier
+ // is required.
+
+ modifiers = Shift + Lock + LevelThree + NumLock + LevelFive;
+
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[LevelThree] = Level3;
+ map[LevelThree+Shift] = Level4;
+
+ map[LevelFive] = Level5;
+ map[LevelFive+Shift] = Level6;
+ map[LevelFive+LevelThree] = Level7;
+ map[LevelFive+LevelThree+Shift] = Level8;
+
+ map[NumLock] = Level5;
+ map[NumLock+Shift] = Level6;
+ map[NumLock+LevelThree] = Level7;
+ map[NumLock+LevelThree+Shift] = Level8;
+
+ map[NumLock+LevelFive] = Level1;
+ map[NumLock+LevelFive+Shift] = Level2;
+ map[NumLock+LevelFive+LevelThree] = Level3;
+ map[NumLock+LevelFive+LevelThree+Shift] = Level4;
+
+ // Lock interchanges Level1 and Level2
+ map[Lock] = Level2;
+ map[Lock+Shift] = Level1;
+ map[Lock+LevelThree] = Level3;
+ map[Lock+LevelThree+Shift] = Level4;
+
+ map[Lock+LevelFive] = Level5;
+ map[Lock+LevelFive+Shift] = Level6;
+ map[Lock+LevelFive+LevelThree] = Level7;
+ map[Lock+LevelFive+LevelThree+Shift] = Level8;
+
+ map[Lock+NumLock] = Level5;
+ map[Lock+NumLock+Shift] = Level6;
+ map[Lock+NumLock+LevelThree] = Level7;
+ map[Lock+NumLock+LevelThree+Shift] = Level8;
+
+ map[Lock+NumLock+LevelFive] = Level2;
+ map[Lock+NumLock+LevelFive+Shift] = Level1;
+ map[Lock+NumLock+LevelFive+LevelThree] = Level4;
+ map[Lock+NumLock+LevelFive+LevelThree+Shift] = Level3;
+
+ preserve[LevelFive+Shift] = Shift;
+ preserve[NumLock+Shift] = Shift;
+
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Shift Alt";
+ level_name[Level5] = "X";
+ level_name[Level6] = "X Shift";
+ level_name[Level7] = "X Alt Base";
+ level_name[Level8] = "X Shift Alt";
+ };
+
+ type "EIGHT_LEVEL_SEMIALPHABETIC" {
+ modifiers = Shift+Lock+LevelThree+LevelFive;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[Lock] = Level2;
+ map[LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ map[Lock+LevelThree] = Level3;
+ map[Lock+Shift+LevelThree] = Level4;
+
+ map[LevelFive] = Level5;
+ map[Shift+LevelFive] = Level6;
+ map[Lock+LevelFive] = Level6;
+ map[Lock+Shift+LevelFive] = Level6;
+ map[LevelThree+LevelFive] = Level7;
+ map[Shift+LevelThree+LevelFive] = Level8;
+ map[Lock+LevelThree+LevelFive] = Level7;
+ map[Lock+Shift+LevelThree+LevelFive] = Level8;
+
+ preserve[Lock+LevelThree] = Lock;
+ preserve[Lock+Shift+LevelThree] = Lock;
+ preserve[Lock+LevelFive] = Lock;
+ preserve[Lock+Shift+LevelFive] = Lock;
+ preserve[Lock+LevelThree+LevelFive] = Lock;
+ preserve[Lock+Shift+LevelThree+LevelFive] = Lock;
+
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Shift Alt";
+ level_name[Level5] = "X";
+ level_name[Level6] = "X Shift";
+ level_name[Level7] = "X Alt Base";
+ level_name[Level8] = "X Shift Alt";
+ };
+
+};
diff --git a/test/data/types/mousekeys b/test/data/types/mousekeys
new file mode 100644
index 0000000..901848a
--- /dev/null
+++ b/test/data/types/mousekeys
@@ -0,0 +1,10 @@
+partial default xkb_types "default" {
+ virtual_modifiers Alt;
+
+ type "SHIFT+ALT" {
+ modifiers = Shift+Alt;
+ map[Shift+Alt] = Level2;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift+Alt";
+ };
+};
diff --git a/test/data/types/numpad b/test/data/types/numpad
new file mode 100644
index 0000000..5861f11
--- /dev/null
+++ b/test/data/types/numpad
@@ -0,0 +1,67 @@
+partial default xkb_types "pc" {
+ type "KEYPAD" {
+ modifiers = Shift+NumLock;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[NumLock] = Level2;
+ map[Shift+NumLock] = Level1;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Number";
+ };
+ include "extra(keypad)"
+};
+
+// On Mac keypads, level 1 and 2 are swapped.
+partial xkb_types "mac" {
+ type "KEYPAD" {
+ modifiers = None;
+ map[None] = Level2;
+ level_name[Level2] = "Number";
+ };
+ include "extra(keypad)"
+};
+
+partial xkb_types "microsoft" {
+ type "KEYPAD" {
+ modifiers = Shift+NumLock;
+ map[None] = Level1;
+ preserve[Shift] = Shift;
+ map[NumLock] = Level2;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Number";
+ };
+ include "extra(keypad)"
+};
+
+// Swiss-German style numeric keypad: Shift and NumLock operate as
+// two independent modifiers; however, since we want shift state for
+// the cursor keys, only three levels are used from the key mappings.
+// Closest type is actually FOUR_LEVEL_X, but most numpad layouts use
+// FOUR_LEVEL_MIXED_KEYPAD, so that's the one we are going to override.
+partial xkb_types "shift3" {
+ type "FOUR_LEVEL_MIXED_KEYPAD" {
+ modifiers = Shift+NumLock+Control+Alt;
+
+ // NumLock Off => navigate using cursor keys
+ map[None] = Level1;
+
+ // NumLock Off + Shift pressed => select using cursor keys
+ preserve[Shift] = Shift;
+
+ // NumLock On => decimal digits
+ map[NumLock] = Level2;
+
+ // NumLock On + Shift pressed => auxiliary symbols,
+ // e.g. hexadecimal digits
+ map[Shift+NumLock] = Level3;
+
+ // Ctrl + Alt, regardless of NumLock and Shift => command keys
+ map[Control+Alt] = Level4;
+
+ // reverse map from levels to modifiers
+ level_name[Level1] = "Base";
+ level_name[Level2] = "NumLock";
+ level_name[Level3] = "Shift+NumLock";
+ level_name[Level4] = "Ctrl+Alt";
+ };
+};
diff --git a/test/data/types/pc b/test/data/types/pc
new file mode 100644
index 0000000..404e3c9
--- /dev/null
+++ b/test/data/types/pc
@@ -0,0 +1,126 @@
+partial default xkb_types "default" {
+
+ // Some types that are necessary
+ // for a full implementation of
+ // a PC-compatible keyboard.
+
+ virtual_modifiers Alt;
+ virtual_modifiers LevelThree;
+ virtual_modifiers LAlt;
+ virtual_modifiers RAlt;
+ virtual_modifiers RControl;
+ virtual_modifiers LControl;
+
+ type "PC_SUPER_LEVEL2" {
+ modifiers = Mod4;
+ map[None] = Level1;
+ map[Mod4] = Level2;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Super";
+ };
+
+ type "PC_CONTROL_LEVEL2" {
+ modifiers = Control;
+ map[None] = Level1;
+ map[Control] = Level2;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Control";
+ };
+
+ type "PC_LCONTROL_LEVEL2" {
+ modifiers = LControl;
+ map[None] = Level1;
+ map[LControl] = Level2;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "LControl";
+ };
+
+ type "PC_RCONTROL_LEVEL2" {
+ modifiers = RControl;
+ map[None] = Level1;
+ map[RControl] = Level2;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "RControl";
+ };
+
+ type "PC_ALT_LEVEL2" {
+ modifiers = Alt;
+ map[None] = Level1;
+ map[Alt] = Level2;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Alt";
+ };
+
+ type "PC_LALT_LEVEL2" {
+ modifiers = LAlt;
+ map[None] = Level1;
+ map[LAlt] = Level2;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "LAlt";
+ };
+
+ type "PC_RALT_LEVEL2" {
+ modifiers = RAlt;
+ map[None] = Level1;
+ map[RAlt] = Level2;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "RAlt";
+ };
+
+ type "CTRL+ALT" {
+ modifiers = Control+Alt+Shift+LevelThree;
+ map[None] = Level1;
+ map[Shift] = Level2;
+ map[LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ map[Control+Alt] = Level5;
+ preserve[Shift] = Shift;
+ preserve[Shift+LevelThree] = Shift;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Alt Base";
+ level_name[Level4] = "Shift Alt";
+ level_name[Level5] = "Ctrl+Alt";
+ };
+
+ // Local eight level.
+ // Needed when you want part of your layout eight-level but cannot use
+ // LevelFive as modifier, as this will take over the right Ctrl by default
+ // for the whole layout and is too invasive for the average four-level user.
+ // Needed to fix bug #9529.
+ // FIXME: Should really use RControl but it seems not to be enabled by
+ // default and touching this requires a lot of testing.
+ type "LOCAL_EIGHT_LEVEL" {
+ modifiers = Shift+Lock+LevelThree+Control;
+
+ map[None] = Level1;
+ map[Lock+Shift] = Level1;
+ map[Shift] = Level2;
+ map[Lock] = Level2;
+
+ map[LevelThree] = Level3;
+ map[Lock+Shift+LevelThree] = Level3;
+ map[Shift+LevelThree] = Level4;
+ map[Lock+LevelThree] = Level4;
+
+ map[Control] = Level5;
+ map[Lock+Shift+Control] = Level5;
+ map[Shift+Control] = Level6;
+ map[Lock+Control] = Level6;
+
+ map[LevelThree+Control] = Level7;
+ map[Lock+Shift+LevelThree+Control] = Level7;
+ map[Shift+LevelThree+Control] = Level8;
+ map[Lock+LevelThree+Control] = Level8;
+
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Shift";
+ level_name[Level3] = "Level3";
+ level_name[Level4] = "Shift Level3";
+ level_name[Level5] = "Ctrl";
+ level_name[Level6] = "Shift Ctrl";
+ level_name[Level7] = "Level3 Ctrl";
+ level_name[Level8] = "Shift Level3 Ctrl";
+ };
+
+};
diff --git a/test/evdev-scancodes.h b/test/evdev-scancodes.h
new file mode 100644
index 0000000..0e05cb1
--- /dev/null
+++ b/test/evdev-scancodes.h
@@ -0,0 +1,587 @@
+/*
+ * Copyright (c) 1999-2002 Vojtech Pavlik
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+#ifndef _INPUT_H
+#define _INPUT_H
+
+/*
+ * Copied from /usr/include/linux/input.h from Linux 3.16, for use
+ * in libxkbcommon. Modified to only contain scancode definitions.
+ */
+
+/*
+ * Keys and buttons
+ *
+ * Most of the keys/buttons are modeled after USB HUT 1.12
+ * (see http://www.usb.org/developers/hidpage).
+ * Abbreviations in the comments:
+ * AC - Application Control
+ * AL - Application Launch Button
+ * SC - System Control
+ */
+
+#define KEY_RESERVED 0
+#define KEY_ESC 1
+#define KEY_1 2
+#define KEY_2 3
+#define KEY_3 4
+#define KEY_4 5
+#define KEY_5 6
+#define KEY_6 7
+#define KEY_7 8
+#define KEY_8 9
+#define KEY_9 10
+#define KEY_0 11
+#define KEY_MINUS 12
+#define KEY_EQUAL 13
+#define KEY_BACKSPACE 14
+#define KEY_TAB 15
+#define KEY_Q 16
+#define KEY_W 17
+#define KEY_E 18
+#define KEY_R 19
+#define KEY_T 20
+#define KEY_Y 21
+#define KEY_U 22
+#define KEY_I 23
+#define KEY_O 24
+#define KEY_P 25
+#define KEY_LEFTBRACE 26
+#define KEY_RIGHTBRACE 27
+#define KEY_ENTER 28
+#define KEY_LEFTCTRL 29
+#define KEY_A 30
+#define KEY_S 31
+#define KEY_D 32
+#define KEY_F 33
+#define KEY_G 34
+#define KEY_H 35
+#define KEY_J 36
+#define KEY_K 37
+#define KEY_L 38
+#define KEY_SEMICOLON 39
+#define KEY_APOSTROPHE 40
+#define KEY_GRAVE 41
+#define KEY_LEFTSHIFT 42
+#define KEY_BACKSLASH 43
+#define KEY_Z 44
+#define KEY_X 45
+#define KEY_C 46
+#define KEY_V 47
+#define KEY_B 48
+#define KEY_N 49
+#define KEY_M 50
+#define KEY_COMMA 51
+#define KEY_DOT 52
+#define KEY_SLASH 53
+#define KEY_RIGHTSHIFT 54
+#define KEY_KPASTERISK 55
+#define KEY_LEFTALT 56
+#define KEY_SPACE 57
+#define KEY_CAPSLOCK 58
+#define KEY_F1 59
+#define KEY_F2 60
+#define KEY_F3 61
+#define KEY_F4 62
+#define KEY_F5 63
+#define KEY_F6 64
+#define KEY_F7 65
+#define KEY_F8 66
+#define KEY_F9 67
+#define KEY_F10 68
+#define KEY_NUMLOCK 69
+#define KEY_SCROLLLOCK 70
+#define KEY_KP7 71
+#define KEY_KP8 72
+#define KEY_KP9 73
+#define KEY_KPMINUS 74
+#define KEY_KP4 75
+#define KEY_KP5 76
+#define KEY_KP6 77
+#define KEY_KPPLUS 78
+#define KEY_KP1 79
+#define KEY_KP2 80
+#define KEY_KP3 81
+#define KEY_KP0 82
+#define KEY_KPDOT 83
+
+#define KEY_ZENKAKUHANKAKU 85
+#define KEY_102ND 86
+#define KEY_F11 87
+#define KEY_F12 88
+#define KEY_RO 89
+#define KEY_KATAKANA 90
+#define KEY_HIRAGANA 91
+#define KEY_HENKAN 92
+#define KEY_KATAKANAHIRAGANA 93
+#define KEY_MUHENKAN 94
+#define KEY_KPJPCOMMA 95
+#define KEY_KPENTER 96
+#define KEY_RIGHTCTRL 97
+#define KEY_KPSLASH 98
+#define KEY_SYSRQ 99
+#define KEY_RIGHTALT 100
+#define KEY_LINEFEED 101
+#define KEY_HOME 102
+#define KEY_UP 103
+#define KEY_PAGEUP 104
+#define KEY_LEFT 105
+#define KEY_RIGHT 106
+#define KEY_END 107
+#define KEY_DOWN 108
+#define KEY_PAGEDOWN 109
+#define KEY_INSERT 110
+#define KEY_DELETE 111
+#define KEY_MACRO 112
+#define KEY_MUTE 113
+#define KEY_VOLUMEDOWN 114
+#define KEY_VOLUMEUP 115
+#define KEY_POWER 116 /* SC System Power Down */
+#define KEY_KPEQUAL 117
+#define KEY_KPPLUSMINUS 118
+#define KEY_PAUSE 119
+#define KEY_SCALE 120 /* AL Compiz Scale (Expose) */
+
+#define KEY_KPCOMMA 121
+#define KEY_HANGEUL 122
+#define KEY_HANGUEL KEY_HANGEUL
+#define KEY_HANJA 123
+#define KEY_YEN 124
+#define KEY_LEFTMETA 125
+#define KEY_RIGHTMETA 126
+#define KEY_COMPOSE 127
+
+#define KEY_STOP 128 /* AC Stop */
+#define KEY_AGAIN 129
+#define KEY_PROPS 130 /* AC Properties */
+#define KEY_UNDO 131 /* AC Undo */
+#define KEY_FRONT 132
+#define KEY_COPY 133 /* AC Copy */
+#define KEY_OPEN 134 /* AC Open */
+#define KEY_PASTE 135 /* AC Paste */
+#define KEY_FIND 136 /* AC Search */
+#define KEY_CUT 137 /* AC Cut */
+#define KEY_HELP 138 /* AL Integrated Help Center */
+#define KEY_MENU 139 /* Menu (show menu) */
+#define KEY_CALC 140 /* AL Calculator */
+#define KEY_SETUP 141
+#define KEY_SLEEP 142 /* SC System Sleep */
+#define KEY_WAKEUP 143 /* System Wake Up */
+#define KEY_FILE 144 /* AL Local Machine Browser */
+#define KEY_SENDFILE 145
+#define KEY_DELETEFILE 146
+#define KEY_XFER 147
+#define KEY_PROG1 148
+#define KEY_PROG2 149
+#define KEY_WWW 150 /* AL Internet Browser */
+#define KEY_MSDOS 151
+#define KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */
+#define KEY_SCREENLOCK KEY_COFFEE
+#define KEY_DIRECTION 153
+#define KEY_CYCLEWINDOWS 154
+#define KEY_MAIL 155
+#define KEY_BOOKMARKS 156 /* AC Bookmarks */
+#define KEY_COMPUTER 157
+#define KEY_BACK 158 /* AC Back */
+#define KEY_FORWARD 159 /* AC Forward */
+#define KEY_CLOSECD 160
+#define KEY_EJECTCD 161
+#define KEY_EJECTCLOSECD 162
+#define KEY_NEXTSONG 163
+#define KEY_PLAYPAUSE 164
+#define KEY_PREVIOUSSONG 165
+#define KEY_STOPCD 166
+#define KEY_RECORD 167
+#define KEY_REWIND 168
+#define KEY_PHONE 169 /* Media Select Telephone */
+#define KEY_ISO 170
+#define KEY_CONFIG 171 /* AL Consumer Control Configuration */
+#define KEY_HOMEPAGE 172 /* AC Home */
+#define KEY_REFRESH 173 /* AC Refresh */
+#define KEY_EXIT 174 /* AC Exit */
+#define KEY_MOVE 175
+#define KEY_EDIT 176
+#define KEY_SCROLLUP 177
+#define KEY_SCROLLDOWN 178
+#define KEY_KPLEFTPAREN 179
+#define KEY_KPRIGHTPAREN 180
+#define KEY_NEW 181 /* AC New */
+#define KEY_REDO 182 /* AC Redo/Repeat */
+
+#define KEY_F13 183
+#define KEY_F14 184
+#define KEY_F15 185
+#define KEY_F16 186
+#define KEY_F17 187
+#define KEY_F18 188
+#define KEY_F19 189
+#define KEY_F20 190
+#define KEY_F21 191
+#define KEY_F22 192
+#define KEY_F23 193
+#define KEY_F24 194
+
+#define KEY_PLAYCD 200
+#define KEY_PAUSECD 201
+#define KEY_PROG3 202
+#define KEY_PROG4 203
+#define KEY_DASHBOARD 204 /* AL Dashboard */
+#define KEY_SUSPEND 205
+#define KEY_CLOSE 206 /* AC Close */
+#define KEY_PLAY 207
+#define KEY_FASTFORWARD 208
+#define KEY_BASSBOOST 209
+#define KEY_PRINT 210 /* AC Print */
+#define KEY_HP 211
+#define KEY_CAMERA 212
+#define KEY_SOUND 213
+#define KEY_QUESTION 214
+#define KEY_EMAIL 215
+#define KEY_CHAT 216
+#define KEY_SEARCH 217
+#define KEY_CONNECT 218
+#define KEY_FINANCE 219 /* AL Checkbook/Finance */
+#define KEY_SPORT 220
+#define KEY_SHOP 221
+#define KEY_ALTERASE 222
+#define KEY_CANCEL 223 /* AC Cancel */
+#define KEY_BRIGHTNESSDOWN 224
+#define KEY_BRIGHTNESSUP 225
+#define KEY_MEDIA 226
+
+#define KEY_SWITCHVIDEOMODE 227 /* Cycle between available video
+ outputs (Monitor/LCD/TV-out/etc) */
+#define KEY_KBDILLUMTOGGLE 228
+#define KEY_KBDILLUMDOWN 229
+#define KEY_KBDILLUMUP 230
+
+#define KEY_SEND 231 /* AC Send */
+#define KEY_REPLY 232 /* AC Reply */
+#define KEY_FORWARDMAIL 233 /* AC Forward Msg */
+#define KEY_SAVE 234 /* AC Save */
+#define KEY_DOCUMENTS 235
+
+#define KEY_BATTERY 236
+
+#define KEY_BLUETOOTH 237
+#define KEY_WLAN 238
+#define KEY_UWB 239
+
+#define KEY_UNKNOWN 240
+
+#define KEY_VIDEO_NEXT 241 /* drive next video source */
+#define KEY_VIDEO_PREV 242 /* drive previous video source */
+#define KEY_BRIGHTNESS_CYCLE 243 /* brightness up, after max is min */
+#define KEY_BRIGHTNESS_ZERO 244 /* brightness off, use ambient */
+#define KEY_DISPLAY_OFF 245 /* display device to off state */
+
+#define KEY_WWAN 246 /* Wireless WAN (LTE, UMTS, GSM, etc.) */
+#define KEY_WIMAX KEY_WWAN
+#define KEY_RFKILL 247 /* Key that controls all radios */
+
+#define KEY_MICMUTE 248 /* Mute / unmute the microphone */
+
+/* Code 255 is reserved for special needs of AT keyboard driver */
+
+#define BTN_MISC 0x100
+#define BTN_0 0x100
+#define BTN_1 0x101
+#define BTN_2 0x102
+#define BTN_3 0x103
+#define BTN_4 0x104
+#define BTN_5 0x105
+#define BTN_6 0x106
+#define BTN_7 0x107
+#define BTN_8 0x108
+#define BTN_9 0x109
+
+#define BTN_MOUSE 0x110
+#define BTN_LEFT 0x110
+#define BTN_RIGHT 0x111
+#define BTN_MIDDLE 0x112
+#define BTN_SIDE 0x113
+#define BTN_EXTRA 0x114
+#define BTN_FORWARD 0x115
+#define BTN_BACK 0x116
+#define BTN_TASK 0x117
+
+#define BTN_JOYSTICK 0x120
+#define BTN_TRIGGER 0x120
+#define BTN_THUMB 0x121
+#define BTN_THUMB2 0x122
+#define BTN_TOP 0x123
+#define BTN_TOP2 0x124
+#define BTN_PINKIE 0x125
+#define BTN_BASE 0x126
+#define BTN_BASE2 0x127
+#define BTN_BASE3 0x128
+#define BTN_BASE4 0x129
+#define BTN_BASE5 0x12a
+#define BTN_BASE6 0x12b
+#define BTN_DEAD 0x12f
+
+#define BTN_GAMEPAD 0x130
+#define BTN_SOUTH 0x130
+#define BTN_A BTN_SOUTH
+#define BTN_EAST 0x131
+#define BTN_B BTN_EAST
+#define BTN_C 0x132
+#define BTN_NORTH 0x133
+#define BTN_X BTN_NORTH
+#define BTN_WEST 0x134
+#define BTN_Y BTN_WEST
+#define BTN_Z 0x135
+#define BTN_TL 0x136
+#define BTN_TR 0x137
+#define BTN_TL2 0x138
+#define BTN_TR2 0x139
+#define BTN_SELECT 0x13a
+#define BTN_START 0x13b
+#define BTN_MODE 0x13c
+#define BTN_THUMBL 0x13d
+#define BTN_THUMBR 0x13e
+
+#define BTN_DIGI 0x140
+#define BTN_TOOL_PEN 0x140
+#define BTN_TOOL_RUBBER 0x141
+#define BTN_TOOL_BRUSH 0x142
+#define BTN_TOOL_PENCIL 0x143
+#define BTN_TOOL_AIRBRUSH 0x144
+#define BTN_TOOL_FINGER 0x145
+#define BTN_TOOL_MOUSE 0x146
+#define BTN_TOOL_LENS 0x147
+#define BTN_TOOL_QUINTTAP 0x148 /* Five fingers on trackpad */
+#define BTN_TOUCH 0x14a
+#define BTN_STYLUS 0x14b
+#define BTN_STYLUS2 0x14c
+#define BTN_TOOL_DOUBLETAP 0x14d
+#define BTN_TOOL_TRIPLETAP 0x14e
+#define BTN_TOOL_QUADTAP 0x14f /* Four fingers on trackpad */
+
+#define BTN_WHEEL 0x150
+#define BTN_GEAR_DOWN 0x150
+#define BTN_GEAR_UP 0x151
+
+#define KEY_OK 0x160
+#define KEY_SELECT 0x161
+#define KEY_GOTO 0x162
+#define KEY_CLEAR 0x163
+#define KEY_POWER2 0x164
+#define KEY_OPTION 0x165
+#define KEY_INFO 0x166 /* AL OEM Features/Tips/Tutorial */
+#define KEY_TIME 0x167
+#define KEY_VENDOR 0x168
+#define KEY_ARCHIVE 0x169
+#define KEY_PROGRAM 0x16a /* Media Select Program Guide */
+#define KEY_CHANNEL 0x16b
+#define KEY_FAVORITES 0x16c
+#define KEY_EPG 0x16d
+#define KEY_PVR 0x16e /* Media Select Home */
+#define KEY_MHP 0x16f
+#define KEY_LANGUAGE 0x170
+#define KEY_TITLE 0x171
+#define KEY_SUBTITLE 0x172
+#define KEY_ANGLE 0x173
+#define KEY_ZOOM 0x174
+#define KEY_MODE 0x175
+#define KEY_KEYBOARD 0x176
+#define KEY_SCREEN 0x177
+#define KEY_PC 0x178 /* Media Select Computer */
+#define KEY_TV 0x179 /* Media Select TV */
+#define KEY_TV2 0x17a /* Media Select Cable */
+#define KEY_VCR 0x17b /* Media Select VCR */
+#define KEY_VCR2 0x17c /* VCR Plus */
+#define KEY_SAT 0x17d /* Media Select Satellite */
+#define KEY_SAT2 0x17e
+#define KEY_CD 0x17f /* Media Select CD */
+#define KEY_TAPE 0x180 /* Media Select Tape */
+#define KEY_RADIO 0x181
+#define KEY_TUNER 0x182 /* Media Select Tuner */
+#define KEY_PLAYER 0x183
+#define KEY_TEXT 0x184
+#define KEY_DVD 0x185 /* Media Select DVD */
+#define KEY_AUX 0x186
+#define KEY_MP3 0x187
+#define KEY_AUDIO 0x188 /* AL Audio Browser */
+#define KEY_VIDEO 0x189 /* AL Movie Browser */
+#define KEY_DIRECTORY 0x18a
+#define KEY_LIST 0x18b
+#define KEY_MEMO 0x18c /* Media Select Messages */
+#define KEY_CALENDAR 0x18d
+#define KEY_RED 0x18e
+#define KEY_GREEN 0x18f
+#define KEY_YELLOW 0x190
+#define KEY_BLUE 0x191
+#define KEY_CHANNELUP 0x192 /* Channel Increment */
+#define KEY_CHANNELDOWN 0x193 /* Channel Decrement */
+#define KEY_FIRST 0x194
+#define KEY_LAST 0x195 /* Recall Last */
+#define KEY_AB 0x196
+#define KEY_NEXT 0x197
+#define KEY_RESTART 0x198
+#define KEY_SLOW 0x199
+#define KEY_SHUFFLE 0x19a
+#define KEY_BREAK 0x19b
+#define KEY_PREVIOUS 0x19c
+#define KEY_DIGITS 0x19d
+#define KEY_TEEN 0x19e
+#define KEY_TWEN 0x19f
+#define KEY_VIDEOPHONE 0x1a0 /* Media Select Video Phone */
+#define KEY_GAMES 0x1a1 /* Media Select Games */
+#define KEY_ZOOMIN 0x1a2 /* AC Zoom In */
+#define KEY_ZOOMOUT 0x1a3 /* AC Zoom Out */
+#define KEY_ZOOMRESET 0x1a4 /* AC Zoom */
+#define KEY_WORDPROCESSOR 0x1a5 /* AL Word Processor */
+#define KEY_EDITOR 0x1a6 /* AL Text Editor */
+#define KEY_SPREADSHEET 0x1a7 /* AL Spreadsheet */
+#define KEY_GRAPHICSEDITOR 0x1a8 /* AL Graphics Editor */
+#define KEY_PRESENTATION 0x1a9 /* AL Presentation App */
+#define KEY_DATABASE 0x1aa /* AL Database App */
+#define KEY_NEWS 0x1ab /* AL Newsreader */
+#define KEY_VOICEMAIL 0x1ac /* AL Voicemail */
+#define KEY_ADDRESSBOOK 0x1ad /* AL Contacts/Address Book */
+#define KEY_MESSENGER 0x1ae /* AL Instant Messaging */
+#define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */
+#define KEY_SPELLCHECK 0x1b0 /* AL Spell Check */
+#define KEY_LOGOFF 0x1b1 /* AL Logoff */
+
+#define KEY_DOLLAR 0x1b2
+#define KEY_EURO 0x1b3
+
+#define KEY_FRAMEBACK 0x1b4 /* Consumer - transport controls */
+#define KEY_FRAMEFORWARD 0x1b5
+#define KEY_CONTEXT_MENU 0x1b6 /* GenDesc - system context menu */
+#define KEY_MEDIA_REPEAT 0x1b7 /* Consumer - transport control */
+#define KEY_10CHANNELSUP 0x1b8 /* 10 channels up (10+) */
+#define KEY_10CHANNELSDOWN 0x1b9 /* 10 channels down (10-) */
+#define KEY_IMAGES 0x1ba /* AL Image Browser */
+
+#define KEY_DEL_EOL 0x1c0
+#define KEY_DEL_EOS 0x1c1
+#define KEY_INS_LINE 0x1c2
+#define KEY_DEL_LINE 0x1c3
+
+#define KEY_FN 0x1d0
+#define KEY_FN_ESC 0x1d1
+#define KEY_FN_F1 0x1d2
+#define KEY_FN_F2 0x1d3
+#define KEY_FN_F3 0x1d4
+#define KEY_FN_F4 0x1d5
+#define KEY_FN_F5 0x1d6
+#define KEY_FN_F6 0x1d7
+#define KEY_FN_F7 0x1d8
+#define KEY_FN_F8 0x1d9
+#define KEY_FN_F9 0x1da
+#define KEY_FN_F10 0x1db
+#define KEY_FN_F11 0x1dc
+#define KEY_FN_F12 0x1dd
+#define KEY_FN_1 0x1de
+#define KEY_FN_2 0x1df
+#define KEY_FN_D 0x1e0
+#define KEY_FN_E 0x1e1
+#define KEY_FN_F 0x1e2
+#define KEY_FN_S 0x1e3
+#define KEY_FN_B 0x1e4
+
+#define KEY_BRL_DOT1 0x1f1
+#define KEY_BRL_DOT2 0x1f2
+#define KEY_BRL_DOT3 0x1f3
+#define KEY_BRL_DOT4 0x1f4
+#define KEY_BRL_DOT5 0x1f5
+#define KEY_BRL_DOT6 0x1f6
+#define KEY_BRL_DOT7 0x1f7
+#define KEY_BRL_DOT8 0x1f8
+#define KEY_BRL_DOT9 0x1f9
+#define KEY_BRL_DOT10 0x1fa
+
+#define KEY_NUMERIC_0 0x200 /* used by phones, remote controls, */
+#define KEY_NUMERIC_1 0x201 /* and other keypads */
+#define KEY_NUMERIC_2 0x202
+#define KEY_NUMERIC_3 0x203
+#define KEY_NUMERIC_4 0x204
+#define KEY_NUMERIC_5 0x205
+#define KEY_NUMERIC_6 0x206
+#define KEY_NUMERIC_7 0x207
+#define KEY_NUMERIC_8 0x208
+#define KEY_NUMERIC_9 0x209
+#define KEY_NUMERIC_STAR 0x20a
+#define KEY_NUMERIC_POUND 0x20b
+
+#define KEY_CAMERA_FOCUS 0x210
+#define KEY_WPS_BUTTON 0x211 /* WiFi Protected Setup key */
+
+#define KEY_TOUCHPAD_TOGGLE 0x212 /* Request switch touchpad on or off */
+#define KEY_TOUCHPAD_ON 0x213
+#define KEY_TOUCHPAD_OFF 0x214
+
+#define KEY_CAMERA_ZOOMIN 0x215
+#define KEY_CAMERA_ZOOMOUT 0x216
+#define KEY_CAMERA_UP 0x217
+#define KEY_CAMERA_DOWN 0x218
+#define KEY_CAMERA_LEFT 0x219
+#define KEY_CAMERA_RIGHT 0x21a
+
+#define KEY_ATTENDANT_ON 0x21b
+#define KEY_ATTENDANT_OFF 0x21c
+#define KEY_ATTENDANT_TOGGLE 0x21d /* Attendant call on or off */
+#define KEY_LIGHTS_TOGGLE 0x21e /* Reading light on or off */
+
+#define BTN_DPAD_UP 0x220
+#define BTN_DPAD_DOWN 0x221
+#define BTN_DPAD_LEFT 0x222
+#define BTN_DPAD_RIGHT 0x223
+
+#define KEY_ALS_TOGGLE 0x230 /* Ambient light sensor */
+
+#define BTN_TRIGGER_HAPPY 0x2c0
+#define BTN_TRIGGER_HAPPY1 0x2c0
+#define BTN_TRIGGER_HAPPY2 0x2c1
+#define BTN_TRIGGER_HAPPY3 0x2c2
+#define BTN_TRIGGER_HAPPY4 0x2c3
+#define BTN_TRIGGER_HAPPY5 0x2c4
+#define BTN_TRIGGER_HAPPY6 0x2c5
+#define BTN_TRIGGER_HAPPY7 0x2c6
+#define BTN_TRIGGER_HAPPY8 0x2c7
+#define BTN_TRIGGER_HAPPY9 0x2c8
+#define BTN_TRIGGER_HAPPY10 0x2c9
+#define BTN_TRIGGER_HAPPY11 0x2ca
+#define BTN_TRIGGER_HAPPY12 0x2cb
+#define BTN_TRIGGER_HAPPY13 0x2cc
+#define BTN_TRIGGER_HAPPY14 0x2cd
+#define BTN_TRIGGER_HAPPY15 0x2ce
+#define BTN_TRIGGER_HAPPY16 0x2cf
+#define BTN_TRIGGER_HAPPY17 0x2d0
+#define BTN_TRIGGER_HAPPY18 0x2d1
+#define BTN_TRIGGER_HAPPY19 0x2d2
+#define BTN_TRIGGER_HAPPY20 0x2d3
+#define BTN_TRIGGER_HAPPY21 0x2d4
+#define BTN_TRIGGER_HAPPY22 0x2d5
+#define BTN_TRIGGER_HAPPY23 0x2d6
+#define BTN_TRIGGER_HAPPY24 0x2d7
+#define BTN_TRIGGER_HAPPY25 0x2d8
+#define BTN_TRIGGER_HAPPY26 0x2d9
+#define BTN_TRIGGER_HAPPY27 0x2da
+#define BTN_TRIGGER_HAPPY28 0x2db
+#define BTN_TRIGGER_HAPPY29 0x2dc
+#define BTN_TRIGGER_HAPPY30 0x2dd
+#define BTN_TRIGGER_HAPPY31 0x2de
+#define BTN_TRIGGER_HAPPY32 0x2df
+#define BTN_TRIGGER_HAPPY33 0x2e0
+#define BTN_TRIGGER_HAPPY34 0x2e1
+#define BTN_TRIGGER_HAPPY35 0x2e2
+#define BTN_TRIGGER_HAPPY36 0x2e3
+#define BTN_TRIGGER_HAPPY37 0x2e4
+#define BTN_TRIGGER_HAPPY38 0x2e5
+#define BTN_TRIGGER_HAPPY39 0x2e6
+#define BTN_TRIGGER_HAPPY40 0x2e7
+
+/* We avoid low common keys in module aliases so they don't get huge. */
+#define KEY_MIN_INTERESTING KEY_MUTE
+#define KEY_MAX 0x2ff
+#define KEY_CNT (KEY_MAX+1)
+
+#endif /* _INPUT_H */
diff --git a/test/filecomp.c b/test/filecomp.c
new file mode 100644
index 0000000..827a19c
--- /dev/null
+++ b/test/filecomp.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright © 2009 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 (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 "test.h"
+
+static int
+test_file(struct xkb_context *ctx, const char *path_rel)
+{
+ struct xkb_keymap *keymap = test_compile_file(ctx, path_rel);
+
+ if (!keymap)
+ return 0;
+
+ xkb_keymap_unref(keymap);
+ return 1;
+}
+
+int
+main(void)
+{
+ struct xkb_context *ctx = test_get_context(0);
+
+ assert(test_file(ctx, "keymaps/basic.xkb"));
+ assert(test_file(ctx, "keymaps/comprehensive-plus-geom.xkb"));
+ assert(test_file(ctx, "keymaps/no-types.xkb"));
+ assert(test_file(ctx, "keymaps/quartz.xkb"));
+ assert(test_file(ctx, "keymaps/no-aliases.xkb"));
+
+ assert(!test_file(ctx, "keymaps/divide-by-zero.xkb"));
+ assert(!test_file(ctx, "keymaps/bad.xkb"));
+ assert(!test_file(ctx, "keymaps/syntax-error.xkb"));
+ assert(!test_file(ctx, "keymaps/syntax-error2.xkb"));
+ assert(!test_file(ctx, "does not exist"));
+
+ /* Test response to invalid flags and formats. */
+ fclose(stdin);
+ assert(!xkb_keymap_new_from_file(ctx, NULL, XKB_KEYMAP_FORMAT_TEXT_V1, 0));
+ assert(!xkb_keymap_new_from_file(ctx, stdin, 0, 0));
+ assert(!xkb_keymap_new_from_file(ctx, stdin, XKB_KEYMAP_USE_ORIGINAL_FORMAT, 0));
+ assert(!xkb_keymap_new_from_file(ctx, stdin, 1234, 0));
+ assert(!xkb_keymap_new_from_file(ctx, stdin, XKB_KEYMAP_FORMAT_TEXT_V1, -1));
+ assert(!xkb_keymap_new_from_file(ctx, stdin, XKB_KEYMAP_FORMAT_TEXT_V1, 1234));
+
+ xkb_context_unref(ctx);
+
+ return 0;
+}
diff --git a/test/keymap.c b/test/keymap.c
new file mode 100644
index 0000000..a6bade8
--- /dev/null
+++ b/test/keymap.c
@@ -0,0 +1,107 @@
+/*
+ * Copyright © 2016 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: Mike Blumenkrantz <zmike@osg.samsung.com>
+ */
+
+#include "config.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "test.h"
+
+int
+main(void)
+{
+ struct xkb_context *context = test_get_context(0);
+ struct xkb_keymap *keymap;
+ xkb_keycode_t kc;
+ const char *keyname;
+ xkb_mod_mask_t masks_out[4] = { 0, 0, 0, 0 };
+ size_t mask_count;
+ xkb_mod_mask_t shift_mask;
+ xkb_mod_mask_t lock_mask;
+ xkb_mod_mask_t mod2_mask;
+
+ assert(context);
+
+ keymap = test_compile_rules(context, "evdev", "pc104", "us,ru", NULL, "grp:menu_toggle");
+ assert(keymap);
+
+ kc = xkb_keymap_key_by_name(keymap, "AE09");
+ assert(kc != XKB_KEYCODE_INVALID);
+ keyname = xkb_keymap_key_get_name(keymap, kc);
+ assert(streq(keyname, "AE09"));
+
+ kc = xkb_keymap_key_by_name(keymap, "COMP");
+ assert(kc != XKB_KEYCODE_INVALID);
+ keyname = xkb_keymap_key_get_name(keymap, kc);
+ assert(streq(keyname, "COMP"));
+
+ kc = xkb_keymap_key_by_name(keymap, "MENU");
+ assert(kc != XKB_KEYCODE_INVALID);
+ keyname = xkb_keymap_key_get_name(keymap, kc);
+ assert(streq(keyname, "COMP"));
+
+ kc = xkb_keymap_key_by_name(keymap, "AC01");
+ assert(kc != XKB_KEYCODE_INVALID);
+
+ // AC01 level 0 ('a') requires no modifiers on us-pc104
+ mask_count = xkb_keymap_key_get_mods_for_level(keymap, kc, 0, 0, masks_out, 4);
+ assert(mask_count == 1);
+ assert(masks_out[0] == 0);
+
+ shift_mask = 1 << xkb_keymap_mod_get_index(keymap, "Shift");
+ lock_mask = 1 << xkb_keymap_mod_get_index(keymap, "Lock");
+ mod2_mask = 1 << xkb_keymap_mod_get_index(keymap, "Mod2");
+
+ // AC01 level 1 ('A') requires either Shift or Lock modifiers on us-pc104
+ mask_count = xkb_keymap_key_get_mods_for_level(keymap, kc, 0, 1, masks_out, 4);
+ assert(mask_count == 2);
+ assert(masks_out[0] == shift_mask);
+ assert(masks_out[1] == lock_mask);
+
+ kc = xkb_keymap_key_by_name(keymap, "KP1");
+
+ // KP1 level 0 ('End') requires no modifiers or Shift+Mod2 on us-pc104
+ mask_count = xkb_keymap_key_get_mods_for_level(keymap, kc, 0, 0, masks_out, 4);
+ assert(mask_count == 2);
+ assert(masks_out[0] == 0);
+ assert(masks_out[1] == (shift_mask | mod2_mask));
+
+ // KP1 level 1 ('1') requires either Shift or Mod2 modifiers on us-pc104
+ mask_count = xkb_keymap_key_get_mods_for_level(keymap, kc, 0, 1, masks_out, 4);
+ assert(mask_count == 2);
+ assert(masks_out[0] == shift_mask);
+ assert(masks_out[1] == mod2_mask);
+
+ // Return key is not affected by modifiers on us-pc104
+ kc = xkb_keymap_key_by_name(keymap, "RTRN");
+ mask_count = xkb_keymap_key_get_mods_for_level(keymap, kc, 0, 0, masks_out, 4);
+ assert(mask_count == 1);
+ assert(masks_out[0] == 0);
+
+ xkb_keymap_unref(keymap);
+ xkb_context_unref(context);
+}
diff --git a/test/keyseq.c b/test/keyseq.c
new file mode 100644
index 0000000..adf4de3
--- /dev/null
+++ b/test/keyseq.c
@@ -0,0 +1,489 @@
+/*
+ * Copyright © 2012 Ran Benita <ran234@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "config.h"
+
+#include "evdev-scancodes.h"
+#include "test.h"
+
+int
+main(void)
+{
+ struct xkb_context *ctx = test_get_context(0);
+ struct xkb_keymap *keymap;
+
+ assert(ctx);
+ keymap = test_compile_rules(ctx, "evdev", "evdev",
+ "us,il,ru,de", ",,phonetic,neo",
+ "grp:alt_shift_toggle,grp:menu_toggle");
+ assert(keymap);
+
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_E, BOTH, XKB_KEY_e, NEXT,
+ KEY_L, BOTH, XKB_KEY_l, NEXT,
+ KEY_L, BOTH, XKB_KEY_l, NEXT,
+ KEY_O, BOTH, XKB_KEY_o, FINISH));
+
+ /* Simple shifted level. */
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_E, BOTH, XKB_KEY_E, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT,
+ KEY_L, BOTH, XKB_KEY_l, NEXT,
+ KEY_O, BOTH, XKB_KEY_o, FINISH));
+
+ /* Key repeat shifted and unshifted in the middle. */
+ assert(test_key_seq(keymap,
+ KEY_H, DOWN, XKB_KEY_h, NEXT,
+ KEY_H, REPEAT, XKB_KEY_h, NEXT,
+ KEY_H, REPEAT, XKB_KEY_h, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_H, REPEAT, XKB_KEY_H, NEXT,
+ KEY_H, REPEAT, XKB_KEY_H, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT,
+ KEY_H, REPEAT, XKB_KEY_h, NEXT,
+ KEY_H, REPEAT, XKB_KEY_h, NEXT,
+ KEY_H, UP, XKB_KEY_h, NEXT,
+ KEY_H, BOTH, XKB_KEY_h, FINISH));
+
+ /* Base modifier cleared on key release... */
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_E, BOTH, XKB_KEY_E, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_O, BOTH, XKB_KEY_O, FINISH));
+
+ /* ... But only by the keycode that set it. */
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_E, BOTH, XKB_KEY_E, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_RIGHTSHIFT, UP, XKB_KEY_Shift_R, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_O, BOTH, XKB_KEY_O, FINISH));
+
+ /*
+ * A base modifier should only be cleared when no other key affecting
+ * the modifier is down.
+ */
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_E, BOTH, XKB_KEY_E, NEXT,
+ KEY_RIGHTSHIFT, DOWN, XKB_KEY_Shift_R, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_RIGHTSHIFT, UP, XKB_KEY_Shift_R, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT,
+ KEY_O, BOTH, XKB_KEY_o, FINISH));
+
+ /*
+ * Two key presses from the same key (e.g. if two keyboards use the
+ * same xkb_state) should only be released after two releases.
+ */
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_H, BOTH, XKB_KEY_H, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_H, BOTH, XKB_KEY_H, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT,
+ KEY_H, BOTH, XKB_KEY_H, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT,
+ KEY_H, BOTH, XKB_KEY_h, FINISH));
+
+ /* Same as above with locked modifiers. */
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_CAPSLOCK, DOWN, XKB_KEY_Caps_Lock, NEXT,
+ KEY_H, BOTH, XKB_KEY_H, NEXT,
+ KEY_CAPSLOCK, DOWN, XKB_KEY_Caps_Lock, NEXT,
+ KEY_H, BOTH, XKB_KEY_H, NEXT,
+ KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT,
+ KEY_H, BOTH, XKB_KEY_H, NEXT,
+ KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT,
+ KEY_H, BOTH, XKB_KEY_H, NEXT,
+ KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT,
+ KEY_H, BOTH, XKB_KEY_h, FINISH));
+
+ /* Group switching / locking. */
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_E, BOTH, XKB_KEY_e, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_K, BOTH, XKB_KEY_hebrew_lamed, NEXT,
+ KEY_F, BOTH, XKB_KEY_hebrew_kaph, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_O, BOTH, XKB_KEY_o, FINISH));
+
+ assert(test_key_seq(keymap,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_LEFTALT, DOWN, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, FINISH));
+
+ assert(test_key_seq(keymap,
+ KEY_LEFTALT, DOWN, XKB_KEY_Alt_L, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_Alt_L, FINISH));
+
+ /* Locked modifiers. */
+ assert(test_key_seq(keymap,
+ KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT,
+ KEY_H, BOTH, XKB_KEY_H, NEXT,
+ KEY_E, BOTH, XKB_KEY_E, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_O, BOTH, XKB_KEY_O, FINISH));
+
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_E, BOTH, XKB_KEY_e, NEXT,
+ KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT,
+ KEY_O, BOTH, XKB_KEY_o, FINISH));
+
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_CAPSLOCK, DOWN, XKB_KEY_Caps_Lock, NEXT,
+ KEY_E, BOTH, XKB_KEY_E, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_L, BOTH, XKB_KEY_L, NEXT,
+ KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT,
+ KEY_O, BOTH, XKB_KEY_O, FINISH));
+
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_E, BOTH, XKB_KEY_e, NEXT,
+ KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT,
+ KEY_L, BOTH, XKB_KEY_l, NEXT,
+ KEY_L, BOTH, XKB_KEY_l, NEXT,
+ KEY_O, BOTH, XKB_KEY_o, FINISH));
+
+ /*
+ * A key release affecting a locked modifier should clear it
+ * regardless of the key press.
+ */
+ /* assert(test_key_seq(keymap, */
+ /* KEY_H, BOTH, XKB_KEY_h, NEXT, */
+ /* KEY_CAPSLOCK, DOWN, XKB_KEY_Caps_Lock, NEXT, */
+ /* KEY_E, BOTH, XKB_KEY_E, NEXT, */
+ /* KEY_L, BOTH, XKB_KEY_L, NEXT, */
+ /* KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT, */
+ /* KEY_L, BOTH, XKB_KEY_L, NEXT, */
+ /* KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT, */
+ /* KEY_O, BOTH, XKB_KEY_o, FINISH)); */
+
+ /* Simple Num Lock sanity check. */
+ assert(test_key_seq(keymap,
+ KEY_KP1, BOTH, XKB_KEY_KP_End, NEXT,
+ KEY_NUMLOCK, BOTH, XKB_KEY_Num_Lock, NEXT,
+ KEY_KP1, BOTH, XKB_KEY_KP_1, NEXT,
+ KEY_KP2, BOTH, XKB_KEY_KP_2, NEXT,
+ KEY_NUMLOCK, BOTH, XKB_KEY_Num_Lock, NEXT,
+ KEY_KP2, BOTH, XKB_KEY_KP_Down, FINISH));
+
+ /* Test that the aliases in the ru(phonetic) symbols map work. */
+ assert(test_key_seq(keymap,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_1, BOTH, XKB_KEY_1, NEXT,
+ KEY_Q, BOTH, XKB_KEY_Cyrillic_ya, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_1, BOTH, XKB_KEY_exclam, NEXT,
+ KEY_Q, BOTH, XKB_KEY_Cyrillic_YA, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT,
+ KEY_V, BOTH, XKB_KEY_Cyrillic_zhe, NEXT,
+ KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT,
+ KEY_1, BOTH, XKB_KEY_1, NEXT,
+ KEY_V, BOTH, XKB_KEY_Cyrillic_ZHE, NEXT,
+ KEY_RIGHTSHIFT, DOWN, XKB_KEY_Shift_R, NEXT,
+ KEY_V, BOTH, XKB_KEY_Cyrillic_zhe, NEXT,
+ KEY_RIGHTSHIFT, UP, XKB_KEY_Shift_R, NEXT,
+ KEY_V, BOTH, XKB_KEY_Cyrillic_ZHE, FINISH));
+
+#define KS(name) xkb_keysym_from_name(name, 0)
+
+ /* Test that levels (1-5) in de(neo) symbols map work. */
+ assert(test_key_seq(keymap,
+ /* Switch to the group. */
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+
+ /* Level 1. */
+ KEY_1, BOTH, XKB_KEY_1, NEXT,
+ KEY_Q, BOTH, XKB_KEY_x, NEXT,
+ KEY_KP7, BOTH, XKB_KEY_KP_7, NEXT,
+ KEY_ESC, BOTH, XKB_KEY_Escape, NEXT,
+
+ /* Level 2 with Shift. */
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_1, BOTH, XKB_KEY_degree, NEXT,
+ KEY_Q, BOTH, XKB_KEY_X, NEXT,
+ KEY_KP7, BOTH, KS("U2714"), NEXT,
+ KEY_ESC, BOTH, XKB_KEY_Escape, NEXT,
+ /*
+ * XXX: de(neo) uses shift(both_capslock) which causes
+ * the interesting result in the next line. Since it's
+ * a key release, it doesn't actually lock the modifier,
+ * and applications by-and-large ignore the keysym on
+ * release(?). Is this a problem?
+ */
+ KEY_LEFTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT,
+
+ /* Level 2 with the Lock modifier. */
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_RIGHTSHIFT, BOTH, XKB_KEY_Caps_Lock, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT,
+ KEY_6, BOTH, XKB_KEY_6, NEXT,
+ KEY_H, BOTH, XKB_KEY_S, NEXT,
+ KEY_KP3, BOTH, XKB_KEY_KP_3, NEXT,
+ KEY_ESC, BOTH, XKB_KEY_Escape, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_RIGHTSHIFT, BOTH, XKB_KEY_Caps_Lock, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT,
+
+ /* Level 3. */
+ KEY_CAPSLOCK, DOWN, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_6, BOTH, XKB_KEY_cent, NEXT,
+ KEY_Q, BOTH, XKB_KEY_ellipsis, NEXT,
+ KEY_KP7, BOTH, KS("U2195"), NEXT,
+ KEY_ESC, BOTH, XKB_KEY_Escape, NEXT,
+ KEY_CAPSLOCK, UP, XKB_KEY_ISO_Level3_Shift, NEXT,
+
+ /* Level 4. */
+ KEY_CAPSLOCK, DOWN, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_5, BOTH, XKB_KEY_malesymbol, NEXT,
+ KEY_E, BOTH, XKB_KEY_Greek_lambda, NEXT,
+ KEY_SPACE, BOTH, XKB_KEY_nobreakspace, NEXT,
+ KEY_KP8, BOTH, XKB_KEY_intersection, NEXT,
+ KEY_ESC, BOTH, XKB_KEY_Escape, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT,
+ KEY_CAPSLOCK, UP, XKB_KEY_ISO_Level3_Shift, NEXT,
+
+ /* Level 5. */
+ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level5_Shift, NEXT,
+ /* XXX: xkeyboard-config is borked when de(neo) is
+ * not the first group - not our fault. We test
+ * Level5 seprately below with only de(neo). */
+ /* KEY_5, BOTH, XKB_KEY_periodcentered, NEXT, */
+ /* KEY_E, BOTH, XKB_KEY_Up, NEXT, */
+ /* KEY_SPACE, BOTH, XKB_KEY_KP_0, NEXT, */
+ /* KEY_KP8, BOTH, XKB_KEY_KP_Up, NEXT, */
+ KEY_ESC, BOTH, XKB_KEY_Escape, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level5_Shift, NEXT,
+
+ KEY_V, BOTH, XKB_KEY_p, FINISH));
+
+ xkb_keymap_unref(keymap);
+ keymap = test_compile_rules(ctx, "evdev", "", "de", "neo", "");
+ assert(keymap);
+ assert(test_key_seq(keymap,
+ /* Level 5. */
+ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level5_Shift, NEXT,
+ KEY_5, BOTH, XKB_KEY_periodcentered, NEXT,
+ KEY_E, BOTH, XKB_KEY_Up, NEXT,
+ KEY_SPACE, BOTH, XKB_KEY_KP_0, NEXT,
+ KEY_KP8, BOTH, XKB_KEY_KP_Up, NEXT,
+ KEY_ESC, BOTH, XKB_KEY_Escape, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level5_Lock, NEXT,
+
+ /* Level 6. */
+ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level5_Shift, NEXT,
+ KEY_RIGHTSHIFT, DOWN, XKB_KEY_Shift_R, NEXT,
+ KEY_5, BOTH, XKB_KEY_NoSymbol, NEXT,
+ KEY_8, BOTH, XKB_KEY_ISO_Left_Tab, NEXT,
+ KEY_E, BOTH, XKB_KEY_Up, NEXT,
+ KEY_SPACE, BOTH, XKB_KEY_KP_0, NEXT,
+ KEY_KP8, BOTH, XKB_KEY_KP_Up, NEXT,
+ KEY_ESC, BOTH, XKB_KEY_Escape, NEXT,
+ KEY_RIGHTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level5_Lock, NEXT,
+
+ /* Level 7. */
+ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level5_Shift, NEXT,
+ KEY_CAPSLOCK, DOWN, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_5, BOTH, KS("U2221"), NEXT,
+ KEY_E, BOTH, XKB_KEY_Greek_LAMBDA, NEXT,
+ KEY_SPACE, BOTH, KS("U202F"), NEXT,
+ KEY_KP8, BOTH, KS("U22C2"), NEXT,
+ KEY_ESC, BOTH, XKB_KEY_Escape, NEXT,
+ KEY_CAPSLOCK, UP, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level5_Lock, NEXT,
+
+ /* Level 8. */
+ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level5_Shift, NEXT,
+ KEY_CAPSLOCK, DOWN, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_RIGHTSHIFT, DOWN, XKB_KEY_Shift_R, NEXT,
+ KEY_TAB, BOTH, XKB_KEY_ISO_Level5_Lock, NEXT,
+ KEY_V, BOTH, XKB_KEY_Greek_pi, NEXT,
+ KEY_RIGHTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT,
+ KEY_V, BOTH, XKB_KEY_asciitilde, NEXT,
+ KEY_CAPSLOCK, UP, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_V, BOTH, XKB_KEY_p, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level5_Lock, NEXT,
+ /* Locks Level 5. */
+
+ KEY_V, BOTH, XKB_KEY_Return, FINISH));
+
+
+ xkb_keymap_unref(keymap);
+ keymap = test_compile_rules(ctx, "evdev", "", "us,il,ru", "",
+ "grp:alt_shift_toggle_bidir,grp:menu_toggle");
+ assert(keymap);
+
+ assert(test_key_seq(keymap,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_LEFTALT, DOWN, XKB_KEY_ISO_Prev_Group, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_ISO_Prev_Group, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, FINISH));
+
+ assert(test_key_seq(keymap,
+ KEY_LEFTALT, DOWN, XKB_KEY_Alt_L, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_ISO_Prev_Group, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_ISO_Prev_Group, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_Alt_L, FINISH));
+
+ /* Check backwards (negative) group switching and wrapping. */
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_H, BOTH, XKB_KEY_Cyrillic_er, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_LEFTALT, BOTH, XKB_KEY_ISO_Prev_Group, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT,
+ KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_LEFTALT, BOTH, XKB_KEY_ISO_Prev_Group, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_LEFTALT, BOTH, XKB_KEY_ISO_Prev_Group, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT,
+ KEY_H, BOTH, XKB_KEY_Cyrillic_er, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_H, BOTH, XKB_KEY_h, FINISH));
+
+ xkb_keymap_unref(keymap);
+ keymap = test_compile_rules(ctx, "evdev", "", "us,il,ru", "",
+ "grp:switch,grp:lswitch,grp:menu_toggle");
+ assert(keymap);
+
+ /* Test depressed group works (Mode_switch). */
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_RIGHTALT, DOWN, XKB_KEY_Mode_switch, NEXT,
+ KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_RIGHTALT, DOWN, XKB_KEY_Mode_switch, NEXT,
+ KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_H, BOTH, XKB_KEY_h, FINISH));
+
+ /* Test locked+depressed group works, with wrapping and accumulation. */
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_LEFTALT, DOWN, XKB_KEY_Mode_switch, NEXT,
+ KEY_H, BOTH, XKB_KEY_Cyrillic_er, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_Mode_switch, NEXT,
+ KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_LEFTALT, DOWN, XKB_KEY_Mode_switch, NEXT,
+ /* Should wrap back to first group. */
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_Mode_switch, NEXT,
+ KEY_H, BOTH, XKB_KEY_Cyrillic_er, NEXT,
+ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ /* Two SetGroup(+1)'s should add up. */
+ KEY_RIGHTALT, DOWN, XKB_KEY_Mode_switch, NEXT,
+ KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT,
+ KEY_LEFTALT, DOWN, XKB_KEY_Mode_switch, NEXT,
+ KEY_H, BOTH, XKB_KEY_Cyrillic_er, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_Mode_switch, NEXT,
+ KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_H, BOTH, XKB_KEY_h, FINISH));
+
+ xkb_keymap_unref(keymap);
+ keymap = test_compile_rules(ctx, "evdev", "", "us", "euro", "");
+ assert(keymap);
+
+ assert(test_key_seq(keymap,
+ KEY_5, BOTH, XKB_KEY_5, NEXT,
+ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_5, BOTH, XKB_KEY_EuroSign, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, FINISH));
+
+ xkb_keymap_unref(keymap);
+ keymap = test_compile_file(ctx, "keymaps/unbound-vmod.xkb");
+ assert(keymap);
+
+ assert(test_key_seq(keymap,
+ KEY_H, BOTH, XKB_KEY_h, NEXT,
+ KEY_Z, BOTH, XKB_KEY_y, NEXT,
+ KEY_MINUS, BOTH, XKB_KEY_ssharp, NEXT,
+ KEY_Z, BOTH, XKB_KEY_y, FINISH));
+
+ xkb_keymap_unref(keymap);
+ keymap = test_compile_rules(ctx, "evdev", "applealu_ansi", "us", "",
+ "terminate:ctrl_alt_bksp");
+ assert(keymap);
+
+ assert(test_key_seq(keymap,
+ KEY_5, BOTH, XKB_KEY_5, NEXT,
+ KEY_KP1, BOTH, XKB_KEY_KP_1, NEXT,
+ KEY_NUMLOCK, BOTH, XKB_KEY_Clear, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_KP1, BOTH, XKB_KEY_KP_1, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT,
+ KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT,
+ KEY_KP1, BOTH, XKB_KEY_KP_1, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_KP1, BOTH, XKB_KEY_KP_1, NEXT,
+ KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT,
+ KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT,
+ KEY_A, BOTH, XKB_KEY_a, FINISH));
+
+ xkb_keymap_unref(keymap);
+ xkb_context_unref(ctx);
+ return 0;
+}
diff --git a/test/keysym.c b/test/keysym.c
new file mode 100644
index 0000000..bb2ec28
--- /dev/null
+++ b/test/keysym.c
@@ -0,0 +1,295 @@
+/*
+ * Copyright © 2009 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 (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 <locale.h>
+
+#include "test.h"
+#include "keysym.h" /* For unexported is_lower/upper/keypad() */
+
+static int
+test_string(const char *string, xkb_keysym_t expected)
+{
+ xkb_keysym_t keysym;
+
+ keysym = xkb_keysym_from_name(string, 0);
+
+ fprintf(stderr, "Expected string %s -> %x\n", string, expected);
+ fprintf(stderr, "Received string %s -> %x\n\n", string, keysym);
+
+ return keysym == expected;
+}
+
+static int
+test_casestring(const char *string, xkb_keysym_t expected)
+{
+ xkb_keysym_t keysym;
+
+ keysym = xkb_keysym_from_name(string, XKB_KEYSYM_CASE_INSENSITIVE);
+
+ fprintf(stderr, "Expected casestring %s -> %x\n", string, expected);
+ fprintf(stderr, "Received casestring %s -> %x\n\n", string, keysym);
+
+ return keysym == expected;
+}
+
+static int
+test_keysym(xkb_keysym_t keysym, const char *expected)
+{
+ char s[16];
+
+ xkb_keysym_get_name(keysym, s, sizeof(s));
+
+ fprintf(stderr, "Expected keysym %#x -> %s\n", keysym, expected);
+ fprintf(stderr, "Received keysym %#x -> %s\n\n", keysym, s);
+
+ return streq(s, expected);
+}
+
+static int
+test_utf8(xkb_keysym_t keysym, const char *expected)
+{
+ char s[8];
+ int ret;
+
+ ret = xkb_keysym_to_utf8(keysym, s, sizeof(s));
+ if (ret <= 0)
+ return ret;
+
+ 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);
+}
+
+static void
+test_github_issue_42(void)
+{
+ // Verify we are not dependent on locale, Turkish-i problem in particular.
+ if (setlocale(LC_CTYPE, "tr_TR.UTF-8") == NULL) {
+ // The locale is not available, probably; skip.
+ return;
+ }
+
+ assert(test_string("i", XKB_KEY_i));
+ assert(test_string("I", XKB_KEY_I));
+ assert(test_casestring("i", XKB_KEY_i));
+ assert(test_casestring("I", XKB_KEY_i));
+ assert(xkb_keysym_to_upper(XKB_KEY_i) == XKB_KEY_I);
+ assert(xkb_keysym_to_lower(XKB_KEY_I) == XKB_KEY_i);
+
+ setlocale(LC_CTYPE, "C");
+}
+
+static void
+get_keysym_name(xkb_keysym_t keysym, char *buffer, size_t size)
+{
+ int name_length = xkb_keysym_get_name(keysym, buffer, size);
+ if (name_length < 0) {
+ snprintf(buffer, size, "(unknown: 0x%lx)", (unsigned long)keysym);
+ }
+}
+
+static int
+test_utf32_to_keysym(uint32_t ucs, xkb_keysym_t expected)
+{
+ char expected_name[64];
+ char actual_name[64];
+ xkb_keysym_t actual = xkb_utf32_to_keysym(ucs);
+ get_keysym_name(expected, expected_name, 64);
+ get_keysym_name(actual, actual_name, 64);
+
+ fprintf(stderr, "Code point 0x%lx: expected keysym: %s, actual: %s\n\n",
+ (unsigned long)ucs, expected_name, actual_name);
+ return expected == actual;
+}
+
+int
+main(void)
+{
+ assert(test_string("Undo", 0xFF65));
+ assert(test_string("ThisKeyShouldNotExist", XKB_KEY_NoSymbol));
+ assert(test_string("XF86_Switch_VT_5", 0x1008FE05));
+ assert(test_string("VoidSymbol", 0xFFFFFF));
+ assert(test_string("U4567", 0x1004567));
+ assert(test_string("0x10203040", 0x10203040));
+ assert(test_string("a", 0x61));
+ assert(test_string("A", 0x41));
+ assert(test_string("ch", 0xfea0));
+ assert(test_string("Ch", 0xfea1));
+ assert(test_string("CH", 0xfea2));
+ assert(test_string("THORN", 0x00de));
+ assert(test_string("Thorn", 0x00de));
+ assert(test_string("thorn", 0x00fe));
+
+ assert(test_keysym(0x1008FF56, "XF86Close"));
+ assert(test_keysym(0x0, "NoSymbol"));
+ assert(test_keysym(0x1008FE20, "XF86Ungrab"));
+ assert(test_keysym(0x01001234, "U1234"));
+ /* 16-bit unicode padded to width 4. */
+ assert(test_keysym(0x010002DE, "U02DE"));
+ /* 32-bit unicode padded to width 8. */
+ assert(test_keysym(0x0101F4A9, "U0001F4A9"));
+
+ assert(test_casestring("Undo", 0xFF65));
+ assert(test_casestring("UNDO", 0xFF65));
+ assert(test_casestring("A", 0x61));
+ assert(test_casestring("a", 0x61));
+ assert(test_casestring("ThisKeyShouldNotExist", XKB_KEY_NoSymbol));
+ assert(test_casestring("XF86_Switch_vT_5", 0x1008FE05));
+ assert(test_casestring("xF86_SwitcH_VT_5", 0x1008FE05));
+ assert(test_casestring("xF86SwiTch_VT_5", 0x1008FE05));
+ assert(test_casestring("xF86Switch_vt_5", 0x1008FE05));
+ assert(test_casestring("VoidSymbol", 0xFFFFFF));
+ assert(test_casestring("vOIDsymBol", 0xFFFFFF));
+ assert(test_casestring("U4567", 0x1004567));
+ assert(test_casestring("u4567", 0x1004567));
+ assert(test_casestring("0x10203040", 0x10203040));
+ assert(test_casestring("0X10203040", 0x10203040));
+ assert(test_casestring("THORN", 0x00fe));
+ assert(test_casestring("Thorn", 0x00fe));
+ assert(test_casestring("thorn", 0x00fe));
+
+ assert(test_utf8(XKB_KEY_y, "y"));
+ assert(test_utf8(XKB_KEY_u, "u"));
+ assert(test_utf8(XKB_KEY_m, "m"));
+ assert(test_utf8(XKB_KEY_Cyrillic_em, "м"));
+ assert(test_utf8(XKB_KEY_Cyrillic_u, "у"));
+ assert(test_utf8(XKB_KEY_exclam, "!"));
+ assert(test_utf8(XKB_KEY_oslash, "ø"));
+ assert(test_utf8(XKB_KEY_hebrew_aleph, "א"));
+ assert(test_utf8(XKB_KEY_Arabic_sheen, "ش"));
+
+ assert(test_utf8(XKB_KEY_space, " "));
+ assert(test_utf8(XKB_KEY_KP_Space, " "));
+ assert(test_utf8(XKB_KEY_BackSpace, "\b"));
+ assert(test_utf8(XKB_KEY_Escape, "\033"));
+ assert(test_utf8(XKB_KEY_KP_Separator, ","));
+ assert(test_utf8(XKB_KEY_KP_Decimal, "."));
+ assert(test_utf8(XKB_KEY_Tab, "\t"));
+ assert(test_utf8(XKB_KEY_KP_Tab, "\t"));
+ assert(test_utf8(XKB_KEY_hyphen, "­"));
+ assert(test_utf8(XKB_KEY_Linefeed, "\n"));
+ assert(test_utf8(XKB_KEY_Return, "\r"));
+ assert(test_utf8(XKB_KEY_KP_Enter, "\r"));
+ assert(test_utf8(XKB_KEY_KP_Equal, "="));
+ assert(test_utf8(XKB_KEY_9, "9"));
+ assert(test_utf8(XKB_KEY_KP_9, "9"));
+ assert(test_utf8(XKB_KEY_KP_Multiply, "*"));
+ assert(test_utf8(XKB_KEY_KP_Subtract, "-"));
+
+ assert(test_utf8(0x10005d0, "א"));
+ assert(test_utf8(0x110ffff, "\xf4\x8f\xbf\xbf"));
+ assert(test_utf8(0x1110000, NULL) == 0);
+
+ assert(test_utf32_to_keysym('y', XKB_KEY_y));
+ assert(test_utf32_to_keysym('u', XKB_KEY_u));
+ assert(test_utf32_to_keysym('m', XKB_KEY_m));
+ assert(test_utf32_to_keysym(0x43c, XKB_KEY_Cyrillic_em));
+ assert(test_utf32_to_keysym(0x443, XKB_KEY_Cyrillic_u));
+ assert(test_utf32_to_keysym('!', XKB_KEY_exclam));
+ assert(test_utf32_to_keysym(0xF8, XKB_KEY_oslash));
+ assert(test_utf32_to_keysym(0x5D0, XKB_KEY_hebrew_aleph));
+ assert(test_utf32_to_keysym(0x634, XKB_KEY_Arabic_sheen));
+ assert(test_utf32_to_keysym(0x1F609, 0x0101F609)); // ;) emoji
+
+ assert(test_utf32_to_keysym('\b', XKB_KEY_BackSpace));
+ assert(test_utf32_to_keysym('\t', XKB_KEY_Tab));
+ assert(test_utf32_to_keysym('\n', XKB_KEY_Linefeed));
+ assert(test_utf32_to_keysym(0x0b, XKB_KEY_Clear));
+ assert(test_utf32_to_keysym('\r', XKB_KEY_Return));
+ assert(test_utf32_to_keysym(0x1b, XKB_KEY_Escape));
+ assert(test_utf32_to_keysym(0x7f, XKB_KEY_Delete));
+
+ assert(test_utf32_to_keysym(' ', XKB_KEY_space));
+ assert(test_utf32_to_keysym(',', XKB_KEY_comma));
+ assert(test_utf32_to_keysym('.', XKB_KEY_period));
+ assert(test_utf32_to_keysym('=', XKB_KEY_equal));
+ assert(test_utf32_to_keysym('9', XKB_KEY_9));
+ assert(test_utf32_to_keysym('*', XKB_KEY_asterisk));
+ assert(test_utf32_to_keysym(0xd7, XKB_KEY_multiply));
+ assert(test_utf32_to_keysym('-', XKB_KEY_minus));
+ assert(test_utf32_to_keysym(0x10fffd, 0x110fffd));
+
+ // Unicode non-characters
+ assert(test_utf32_to_keysym(0xfdd0, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xfdef, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xfffe, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xffff, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0x7fffe, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0x7ffff, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xafffe, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xaffff, XKB_KEY_NoSymbol));
+
+ // Codepoints outside the Unicode planes
+ assert(test_utf32_to_keysym(0x110000, XKB_KEY_NoSymbol));
+ assert(test_utf32_to_keysym(0xdeadbeef, XKB_KEY_NoSymbol));
+
+ assert(xkb_keysym_is_lower(XKB_KEY_a));
+ assert(xkb_keysym_is_lower(XKB_KEY_Greek_lambda));
+ assert(xkb_keysym_is_lower(xkb_keysym_from_name("U03b1", 0))); /* GREEK SMALL LETTER ALPHA */
+ assert(xkb_keysym_is_lower(xkb_keysym_from_name("U03af", 0))); /* GREEK SMALL LETTER IOTA WITH TONOS */
+
+ assert(xkb_keysym_is_upper(XKB_KEY_A));
+ assert(xkb_keysym_is_upper(XKB_KEY_Greek_LAMBDA));
+ assert(xkb_keysym_is_upper(xkb_keysym_from_name("U0391", 0))); /* GREEK CAPITAL LETTER ALPHA */
+ assert(xkb_keysym_is_upper(xkb_keysym_from_name("U0388", 0))); /* GREEK CAPITAL LETTER EPSILON WITH TONOS */
+
+ assert(!xkb_keysym_is_upper(XKB_KEY_a));
+ assert(!xkb_keysym_is_lower(XKB_KEY_A));
+ assert(!xkb_keysym_is_lower(XKB_KEY_Return));
+ assert(!xkb_keysym_is_upper(XKB_KEY_Return));
+ assert(!xkb_keysym_is_lower(XKB_KEY_hebrew_aleph));
+ assert(!xkb_keysym_is_upper(XKB_KEY_hebrew_aleph));
+ assert(!xkb_keysym_is_upper(xkb_keysym_from_name("U05D0", 0))); /* HEBREW LETTER ALEF */
+ assert(!xkb_keysym_is_lower(xkb_keysym_from_name("U05D0", 0))); /* HEBREW LETTER ALEF */
+ assert(!xkb_keysym_is_lower(XKB_KEY_8));
+ assert(!xkb_keysym_is_upper(XKB_KEY_8));
+
+ assert(xkb_keysym_is_keypad(XKB_KEY_KP_Enter));
+ assert(xkb_keysym_is_keypad(XKB_KEY_KP_6));
+ assert(xkb_keysym_is_keypad(XKB_KEY_KP_Add));
+ assert(!xkb_keysym_is_keypad(XKB_KEY_Num_Lock));
+ assert(!xkb_keysym_is_keypad(XKB_KEY_1));
+ assert(!xkb_keysym_is_keypad(XKB_KEY_Return));
+
+ assert(xkb_keysym_to_upper(XKB_KEY_a) == XKB_KEY_A);
+ assert(xkb_keysym_to_upper(XKB_KEY_A) == XKB_KEY_A);
+ assert(xkb_keysym_to_lower(XKB_KEY_a) == XKB_KEY_a);
+ assert(xkb_keysym_to_lower(XKB_KEY_A) == XKB_KEY_a);
+ assert(xkb_keysym_to_upper(XKB_KEY_Return) == XKB_KEY_Return);
+ assert(xkb_keysym_to_lower(XKB_KEY_Return) == XKB_KEY_Return);
+ assert(xkb_keysym_to_upper(XKB_KEY_Greek_lambda) == XKB_KEY_Greek_LAMBDA);
+ assert(xkb_keysym_to_upper(XKB_KEY_Greek_LAMBDA) == XKB_KEY_Greek_LAMBDA);
+ assert(xkb_keysym_to_lower(XKB_KEY_Greek_lambda) == XKB_KEY_Greek_lambda);
+ assert(xkb_keysym_to_lower(XKB_KEY_Greek_LAMBDA) == XKB_KEY_Greek_lambda);
+ assert(xkb_keysym_to_upper(XKB_KEY_eacute) == XKB_KEY_Eacute);
+ assert(xkb_keysym_to_lower(XKB_KEY_Eacute) == XKB_KEY_eacute);
+
+ test_github_issue_42();
+
+ return 0;
+}
diff --git a/test/log.c b/test/log.c
new file mode 100644
index 0000000..384fabc
--- /dev/null
+++ b/test/log.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright © 2012 Ran Benita <ran234@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "config.h"
+
+#include "test.h"
+#include "context.h"
+
+#ifdef __GNUC__
+#pragma GCC diagnostic ignored "-Wmissing-format-attribute"
+#endif
+
+static const char *
+log_level_to_string(enum xkb_log_level level)
+{
+ switch (level) {
+ case XKB_LOG_LEVEL_CRITICAL:
+ return "critical";
+ case XKB_LOG_LEVEL_ERROR:
+ return "error";
+ case XKB_LOG_LEVEL_WARNING:
+ return "warning";
+ case XKB_LOG_LEVEL_INFO:
+ return "info";
+ case XKB_LOG_LEVEL_DEBUG:
+ return "debug";
+ }
+
+ return "unknown";
+}
+
+ATTR_PRINTF(3, 0) static void
+log_fn(struct xkb_context *ctx, enum xkb_log_level level,
+ const char *fmt, va_list args)
+{
+ char *s;
+ int size;
+ darray_char *ls = xkb_context_get_user_data(ctx);
+ assert(ls);
+
+ size = vasprintf(&s, fmt, args);
+ assert(size != -1);
+
+ darray_append_string(*ls, log_level_to_string(level));
+ darray_append_lit(*ls, ": ");
+ darray_append_string(*ls, s);
+ free(s);
+}
+
+int
+main(void)
+{
+ darray_char log_string;
+ struct xkb_context *ctx;
+ int ret;
+
+ ret = setenv("XKB_LOG_LEVEL", "warn", 1);
+ assert(ret == 0);
+ ret = setenv("XKB_LOG_VERBOSITY", "5", 1);
+ assert(ret == 0);
+ ctx = test_get_context(0);
+ assert(ctx);
+
+ darray_init(log_string);
+ xkb_context_set_user_data(ctx, &log_string);
+ xkb_context_set_log_fn(ctx, log_fn);
+
+ log_warn(ctx, "first warning: %d\n", 87);
+ log_info(ctx, "first info\n");
+ log_dbg(ctx, "first debug: %s\n", "hello");
+ log_err(ctx, "first error: %lu\n", 115415UL);
+ log_vrb(ctx, 5, "first verbose 5\n");
+
+ xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_DEBUG);
+ log_warn(ctx, "second warning: %d\n", 87);
+ log_dbg(ctx, "second debug: %s %s\n", "hello", "world");
+ log_info(ctx, "second info\n");
+ log_err(ctx, "second error: %lu\n", 115415UL);
+ log_vrb(ctx, 6, "second verbose 6\n");
+
+ xkb_context_set_log_verbosity(ctx, 0);
+ xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_CRITICAL);
+ log_warn(ctx, "third warning: %d\n", 87);
+ log_dbg(ctx, "third debug: %s %s\n", "hello", "world");
+ log_info(ctx, "third info\n");
+ log_err(ctx, "third error: %lu\n", 115415UL);
+ log_vrb(ctx, 0, "third verbose 0\n");
+
+ printf("%s", log_string.item);
+
+ assert(streq(log_string.item,
+ "warning: first warning: 87\n"
+ "error: first error: 115415\n"
+ "warning: first verbose 5\n"
+ "warning: second warning: 87\n"
+ "debug: second debug: hello world\n"
+ "info: second info\n"
+ "error: second error: 115415\n"));
+
+ xkb_context_unref(ctx);
+ darray_free(log_string);
+ return 0;
+}
diff --git a/test/registry.c b/test/registry.c
new file mode 100644
index 0000000..fc5f6da
--- /dev/null
+++ b/test/registry.c
@@ -0,0 +1,843 @@
+/*
+ * 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.
+ */
+
+#include "config.h"
+
+#include <assert.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "xkbcommon/xkbregistry.h"
+
+#include "utils.h"
+
+#define NO_VARIANT NULL
+
+enum {
+ MODEL = 78,
+ LAYOUT,
+ VARIANT,
+ OPTION,
+};
+
+struct test_model {
+ const char *name; /* required */
+ const char *vendor;
+ const char *description;
+};
+
+struct test_layout {
+ const char *name; /* required */
+ const char *variant;
+ const char *brief;
+ const char *description;
+};
+
+struct test_option {
+ const char *name;
+ const char *description;
+};
+
+struct test_option_group {
+ const char *name;
+ const char *description;
+ bool allow_multiple_selection;
+
+ struct test_option options[10];
+};
+
+static void
+fprint_config_item(FILE *fp,
+ const char *name,
+ const char *vendor,
+ const char *brief,
+ const char *description)
+{
+ fprintf(fp, " <configItem>\n"
+ " <name>%s</name>\n", name);
+ if (brief)
+ fprintf(fp, " <shortDescription>%s</shortDescription>\n", brief);
+ if (description)
+ fprintf(fp, " <description>%s</description>\n", description);
+ if (vendor)
+ fprintf(fp, " <vendor>%s</vendor>\n", vendor);
+ fprintf(fp, " </configItem>\n");
+}
+
+/**
+ * Create a directory populated with a rules/<ruleset>.xml that contains the
+ * given items.
+ *
+ * @return the XKB base directory
+ */
+static char *
+test_create_rules(const char *ruleset,
+ const struct test_model *test_models,
+ const struct test_layout *test_layouts,
+ const struct test_option_group *test_groups)
+{
+ static int iteration;
+ char *tmpdir;
+ char buf[PATH_MAX];
+ int rc;
+ FILE *fp;
+
+ tmpdir = asprintf_safe("/tmp/%s.%d.XXXXXX", ruleset, iteration++);
+ assert(tmpdir);
+ assert(mkdtemp(tmpdir) == tmpdir);
+
+ rc = snprintf_safe(buf, sizeof(buf), "%s/rules", tmpdir);
+ assert(rc);
+ rc = mkdir(buf, 0777);
+ assert(rc == 0);
+ rc = snprintf_safe(buf, sizeof(buf), "%s/rules/%s.xml", tmpdir, ruleset);
+ assert(rc);
+
+ fp = fopen(buf, "w");
+ assert(fp);
+
+ fprintf(fp,
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<!DOCTYPE xkbConfigRegistry SYSTEM \"xkb.dtd\">\n"
+ "<xkbConfigRegistry version=\"1.1\">\n");
+
+ if (test_models) {
+ fprintf(fp, "<modelList>\n");
+
+ for (const struct test_model *m = test_models; m->name; m++) {
+ fprintf(fp, "<model>\n");
+ fprint_config_item(fp, m->name, m->vendor, NULL, m->description);
+ fprintf(fp, "</model>\n");
+ }
+ fprintf(fp, "</modelList>\n");
+ }
+
+ if (test_layouts) {
+ const struct test_layout *l, *next;
+
+ fprintf(fp, "<layoutList>\n");
+
+ l = test_layouts;
+ next = l + 1;
+
+ assert(l->variant == NULL);
+
+ while (l->name) {
+ fprintf(fp, "<layout>\n");
+ fprint_config_item(fp, l->name, NULL, l->brief, l->description);
+
+ if (next->name && streq(next->name, l->name)) {
+ fprintf(fp, "<variantList>\n");
+ do {
+ fprintf(fp, "<variant>\n");
+ fprint_config_item(fp, next->variant, NULL, next->brief,
+ next->description);
+ fprintf(fp, "</variant>\n");
+ l = next;
+ next++;
+ } while (next->name && streq(next->name, l->name));
+ fprintf(fp, "</variantList>\n");
+ }
+ fprintf(fp, "</layout>\n");
+ l++;
+ }
+ fprintf(fp, "</layoutList>\n");
+ }
+
+ if (test_groups) {
+ fprintf(fp, "<optionList>\n");
+
+ for (const struct test_option_group *g = test_groups; g->name; g++) {
+ fprintf(fp, "<group allowMultipleSelection=\"%s\">\n",
+ g->allow_multiple_selection ? "true" : "false");
+ fprint_config_item(fp, g->name, NULL, NULL, g->description);
+ for (const struct test_option *o = g->options; o->name; o++) {
+ fprintf(fp, " <option>\n");
+ fprint_config_item(fp, o->name, NULL, NULL, o->description);
+ fprintf(fp, "</option>\n");
+ }
+ fprintf(fp, "</group>\n");
+ }
+ fprintf(fp, "</optionList>\n");
+ }
+
+ fprintf(fp, "</xkbConfigRegistry>\n");
+ fclose(fp);
+
+ return tmpdir;
+}
+
+static void
+test_remove_rules(char *basedir, const char *ruleset)
+{
+ char path[PATH_MAX];
+ int rc;
+
+ rc = snprintf_safe(path, sizeof(path), "%s/rules/%s.xml", basedir,
+ ruleset);
+ assert(rc);
+ unlink(path);
+ rc = snprintf_safe(path, sizeof(path), "%s/xkb/rules", basedir);
+ assert(rc);
+ rmdir(path);
+ rmdir(basedir);
+ free(basedir);
+}
+
+static struct rxkb_context *
+test_setup_context_for(const char *ruleset,
+ struct test_model *system_models,
+ struct test_model *user_models,
+ struct test_layout *system_layouts,
+ struct test_layout *user_layouts,
+ struct test_option_group *system_groups,
+ struct test_option_group *user_groups)
+{
+ char *sysdir = NULL, *userdir = NULL;
+ struct rxkb_context *ctx;
+
+ sysdir = test_create_rules(ruleset, system_models, system_layouts,
+ system_groups);
+ if (user_models || user_layouts || user_groups)
+ userdir = test_create_rules(ruleset, user_models, user_layouts,
+ user_groups);
+
+ ctx = rxkb_context_new(RXKB_CONTEXT_NO_DEFAULT_INCLUDES);
+ assert(ctx);
+ if (userdir)
+ assert(rxkb_context_include_path_append(ctx, userdir));
+ assert(rxkb_context_include_path_append(ctx, sysdir));
+ assert(rxkb_context_parse(ctx, ruleset));
+
+ test_remove_rules(sysdir, ruleset);
+ if (userdir)
+ test_remove_rules(userdir, ruleset);
+
+ return ctx;
+}
+
+static struct rxkb_context *
+test_setup_context(struct test_model *system_models,
+ struct test_model *user_models,
+ struct test_layout *system_layouts,
+ struct test_layout *user_layouts,
+ struct test_option_group *system_groups,
+ struct test_option_group *user_groups)
+{
+ const char *ruleset = "xkbtests";
+ return test_setup_context_for(ruleset, system_models,
+ user_models, system_layouts,
+ user_layouts, system_groups,
+ user_groups);
+}
+
+static struct rxkb_model *
+fetch_model(struct rxkb_context *ctx, const char *model)
+{
+ struct rxkb_model *m = rxkb_model_first(ctx);
+ while (m) {
+ if (streq(rxkb_model_get_name(m), model))
+ return rxkb_model_ref(m);
+ m = rxkb_model_next(m);
+ }
+ return NULL;
+}
+
+static bool
+find_model(struct rxkb_context *ctx, const char *model)
+{
+ struct rxkb_model *m = fetch_model(ctx, model);
+ rxkb_model_unref(m);
+ return m != NULL;
+}
+
+static bool
+find_models(struct rxkb_context *ctx, ...)
+{
+ va_list args;
+ const char *name;
+ int idx = 0;
+
+ va_start(args, ctx);
+ name = va_arg(args, const char *);
+ while(name) {
+ assert(++idx < 20); /* safety guard */
+ if (!find_model(ctx, name))
+ return false;
+ name = va_arg(args, const char *);
+ };
+
+ va_end(args);
+ return true;
+}
+
+static struct rxkb_layout *
+fetch_layout(struct rxkb_context *ctx, const char *layout, const char *variant)
+{
+ struct rxkb_layout *l = rxkb_layout_first(ctx);
+ while (l) {
+ const char *v = rxkb_layout_get_variant(l);
+
+ if (streq(rxkb_layout_get_name(l), layout) &&
+ ((v == NULL && variant == NULL) ||
+ (v != NULL && variant != NULL && streq(v, variant))))
+ return rxkb_layout_ref(l);
+ l = rxkb_layout_next(l);
+ }
+ return NULL;
+}
+
+static bool
+find_layout(struct rxkb_context *ctx, const char *layout, const char *variant)
+{
+ struct rxkb_layout *l = fetch_layout(ctx, layout, variant);
+ rxkb_layout_unref(l);
+ return l != NULL;
+}
+
+static bool
+find_layouts(struct rxkb_context *ctx, ...)
+{
+ va_list args;
+ const char *name, *variant;
+ int idx = 0;
+
+ va_start(args, ctx);
+ name = va_arg(args, const char *);
+ variant = va_arg(args, const char *);
+ while(name) {
+ assert(++idx < 20); /* safety guard */
+ if (!find_layout(ctx, name, variant))
+ return false;
+ name = va_arg(args, const char *);
+ if (name)
+ variant = va_arg(args, const char *);
+ };
+
+ va_end(args);
+ return true;
+}
+
+static struct rxkb_option_group *
+fetch_option_group(struct rxkb_context *ctx, const char *grp)
+{
+ struct rxkb_option_group *g = rxkb_option_group_first(ctx);
+ while (g) {
+ if (streq(grp, rxkb_option_group_get_name(g)))
+ return rxkb_option_group_ref(g);
+ g = rxkb_option_group_next(g);
+ }
+ return NULL;
+}
+
+static inline bool
+find_option_group(struct rxkb_context *ctx, const char *grp)
+{
+ struct rxkb_option_group *g = fetch_option_group(ctx, grp);
+ rxkb_option_group_unref(g);
+ return g != NULL;
+}
+
+static struct rxkb_option *
+fetch_option(struct rxkb_context *ctx, const char *grp, const char *opt)
+{
+ struct rxkb_option_group *g = rxkb_option_group_first(ctx);
+ while (g) {
+ if (streq(grp, rxkb_option_group_get_name(g))) {
+ struct rxkb_option *o = rxkb_option_first(g);
+
+ while (o) {
+ if (streq(opt, rxkb_option_get_name(o)))
+ return rxkb_option_ref(o);
+ o = rxkb_option_next(o);
+ }
+ }
+ g = rxkb_option_group_next(g);
+ }
+ return NULL;
+}
+
+static bool
+find_option(struct rxkb_context *ctx, const char *grp, const char *opt)
+{
+ struct rxkb_option *o = fetch_option(ctx, grp, opt);
+ rxkb_option_unref(o);
+ return o != NULL;
+}
+
+static bool
+find_options(struct rxkb_context *ctx, ...)
+{
+ va_list args;
+ const char *grp, *opt;
+ int idx = 0;
+
+ va_start(args, ctx);
+ grp = va_arg(args, const char *);
+ opt = va_arg(args, const char *);
+ while(grp) {
+ assert(++idx < 20); /* safety guard */
+ if (!find_option(ctx, grp, opt))
+ return false;
+ grp = va_arg(args, const char *);
+ if (grp)
+ opt = va_arg(args, const char *);
+ };
+
+ va_end(args);
+ return true;
+}
+
+static bool
+cmp_models(struct test_model *tm, struct rxkb_model *m)
+{
+ if (!tm || !m)
+ return false;
+
+ if (!streq(tm->name, rxkb_model_get_name(m)))
+ return false;
+
+ if (!streq_null(tm->vendor, rxkb_model_get_vendor(m)))
+ return false;
+
+ if (!streq_null(tm->description, rxkb_model_get_description(m)))
+ return false;
+
+ return true;
+}
+
+static bool
+cmp_layouts(struct test_layout *tl, struct rxkb_layout *l)
+{
+ if (!tl || !l)
+ return false;
+
+ if (!streq(tl->name, rxkb_layout_get_name(l)))
+ return false;
+
+ if (!streq_null(tl->variant, rxkb_layout_get_variant(l)))
+ return false;
+
+ if (!streq_null(tl->brief, rxkb_layout_get_brief(l)))
+ return false;
+
+ if (!streq_null(tl->description, rxkb_layout_get_description(l)))
+ return false;
+
+ return true;
+}
+
+static bool
+cmp_options(struct test_option *to, struct rxkb_option *o)
+{
+ if (!to || !o)
+ return false;
+
+ if (!streq(to->name, rxkb_option_get_name(o)))
+ return false;
+
+ if (!streq_null(to->description, rxkb_option_get_description(o)))
+ return false;
+
+ return true;
+}
+
+enum cmp_type {
+ CMP_EXACT,
+ CMP_MATCHING_ONLY,
+};
+
+static bool
+cmp_option_groups(struct test_option_group *tg, struct rxkb_option_group *g,
+ enum cmp_type cmp)
+{
+ struct rxkb_option *o;
+ struct test_option *to;
+
+ if (!tg || !g)
+ return false;
+
+ if (!streq(tg->name, rxkb_option_group_get_name(g)))
+ return false;
+
+ if (!streq_null(tg->description, rxkb_option_group_get_description(g)))
+ return false;
+
+ if (tg->allow_multiple_selection != rxkb_option_group_allows_multiple(g))
+ return false;
+
+ to = tg->options;
+ o = rxkb_option_first(g);
+
+ while (o && to->name) {
+ if (!cmp_options(to, o))
+ return false;
+ to++;
+ o = rxkb_option_next(o);
+ }
+
+ if (cmp == CMP_EXACT && (o || to->name))
+ return false;
+
+ return true;
+}
+
+static void
+test_load_basic(void)
+{
+ struct test_model system_models[] = {
+ {"m1"},
+ {"m2"},
+ {NULL},
+ };
+ struct test_layout system_layouts[] = {
+ {"l1"},
+ {"l1", "v1"},
+ {NULL},
+ };
+ struct test_option_group system_groups[] = {
+ {"grp1", NULL, true,
+ { {"grp1:1"}, {"grp1:2"} } },
+ {"grp2", NULL, false,
+ { {"grp2:1"}, {"grp2:2"} } },
+ { NULL },
+ };
+ struct rxkb_context *ctx;
+
+ ctx = test_setup_context(system_models, NULL,
+ system_layouts, NULL,
+ system_groups, NULL);
+
+ assert(find_models(ctx, "m1", "m2", NULL));
+ assert(find_layouts(ctx, "l1", NO_VARIANT,
+ "l1", "v1", NULL));
+ assert(find_options(ctx, "grp1", "grp1:1",
+ "grp1", "grp1:2",
+ "grp2", "grp2:1",
+ "grp2", "grp2:2", NULL));
+ rxkb_context_unref(ctx);
+}
+
+static void
+test_load_full(void)
+{
+ struct test_model system_models[] = {
+ {"m1", "vendor1", "desc1"},
+ {"m2", "vendor2", "desc2"},
+ {NULL},
+ };
+ struct test_layout system_layouts[] = {
+ {"l1", NO_VARIANT, "lbrief1", "ldesc1"},
+ {"l1", "v1", "vbrief1", "vdesc1"},
+ {NULL},
+ };
+ struct test_option_group system_groups[] = {
+ {"grp1", "gdesc1", true,
+ { {"grp1:1", "odesc11"}, {"grp1:2", "odesc12"} } },
+ {"grp2", "gdesc2", false,
+ { {"grp2:1", "odesc21"}, {"grp2:2", "odesc22"} } },
+ { NULL },
+ };
+ struct rxkb_context *ctx;
+ struct rxkb_model *m;
+ struct rxkb_layout *l;
+ struct rxkb_option_group *g;
+
+ ctx = test_setup_context(system_models, NULL,
+ system_layouts, NULL,
+ system_groups, NULL);
+
+ m = fetch_model(ctx, "m1");
+ assert(cmp_models(&system_models[0], m));
+ rxkb_model_unref(m);
+
+ m = fetch_model(ctx, "m2");
+ assert(cmp_models(&system_models[1], m));
+ rxkb_model_unref(m);
+
+ 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);
+
+ g = fetch_option_group(ctx, "grp1");
+ assert(cmp_option_groups(&system_groups[0], g, CMP_EXACT));
+ rxkb_option_group_unref(g);
+
+ g = fetch_option_group(ctx, "grp2");
+ assert(cmp_option_groups(&system_groups[1], g, CMP_EXACT));
+ rxkb_option_group_unref(g);
+
+ rxkb_context_unref(ctx);
+}
+
+static void
+test_popularity(void)
+{
+ struct test_layout system_layouts[] = {
+ {"l1", NO_VARIANT },
+ {"l1", "v1" },
+ {NULL},
+ };
+ struct rxkb_context *ctx;
+ struct rxkb_layout *l;
+ const char *ruleset = "xkbtests.extras";
+ char *dir = NULL;
+
+ dir = test_create_rules(ruleset, NULL, system_layouts, NULL);
+ ctx = rxkb_context_new(RXKB_CONTEXT_NO_DEFAULT_INCLUDES |
+ RXKB_CONTEXT_LOAD_EXOTIC_RULES);
+ assert(ctx);
+ assert(rxkb_context_include_path_append(ctx, dir));
+ /* Hack: rulest above generates xkbtests.extras.xml, loading "xkbtests"
+ * means the extras file counts as exotic */
+ assert(rxkb_context_parse(ctx, "xkbtests"));
+
+ l = fetch_layout(ctx, "l1", NO_VARIANT);
+ assert(rxkb_layout_get_popularity(l) == RXKB_POPULARITY_EXOTIC);
+ rxkb_layout_unref(l);
+
+ l = fetch_layout(ctx, "l1", "v1");
+ assert(rxkb_layout_get_popularity(l) == RXKB_POPULARITY_EXOTIC);
+ rxkb_layout_unref(l);
+
+ test_remove_rules(dir, ruleset);
+ rxkb_context_unref(ctx);
+}
+
+
+static void
+test_load_merge(void)
+{
+ struct test_model system_models[] = {
+ {"m1", "vendor1", "desc1"},
+ {"m2", "vendor2", "desc2"},
+ {NULL},
+ };
+ struct test_model user_models[] = {
+ {"m3", "vendor3", "desc3"},
+ {"m4", "vendor4", "desc4"},
+ {NULL},
+ };
+ struct test_layout system_layouts[] = {
+ {"l1", NO_VARIANT, "lbrief1", "ldesc1"},
+ {"l1", "v1", "vbrief1", "vdesc1"},
+ {NULL},
+ };
+ struct test_layout user_layouts[] = {
+ {"l2", NO_VARIANT, "lbrief2", "ldesc2"},
+ {"l2", "v2", "vbrief2", "vdesc2"},
+ {NULL},
+ };
+ struct test_option_group system_groups[] = {
+ {"grp1", NULL, true,
+ { {"grp1:1"}, {"grp1:2"} } },
+ {"grp2", NULL, false,
+ { {"grp2:1"}, {"grp2:2"} } },
+ { NULL },
+ };
+ struct test_option_group user_groups[] = {
+ {"grp3", NULL, true,
+ { {"grp3:1"}, {"grp3:2"} } },
+ {"grp4", NULL, false,
+ { {"grp4:1"}, {"grp4:2"} } },
+ { NULL },
+ };
+ struct rxkb_context *ctx;
+ struct rxkb_model *m;
+ struct rxkb_layout *l;
+ struct rxkb_option_group *g;
+
+ ctx = test_setup_context(system_models, user_models,
+ system_layouts, user_layouts,
+ system_groups, user_groups);
+
+ assert(find_models(ctx, "m1", "m2", "m3", "m4", NULL));
+ assert(find_layouts(ctx, "l1", NO_VARIANT,
+ "l1", "v1",
+ "l2", NO_VARIANT,
+ "l2", "v2", NULL));
+
+ m = fetch_model(ctx, "m1");
+ assert(cmp_models(&system_models[0], m));
+ rxkb_model_unref(m);
+
+ m = fetch_model(ctx, "m2");
+ assert(cmp_models(&system_models[1], m));
+ rxkb_model_unref(m);
+
+ m = fetch_model(ctx, "m3");
+ assert(cmp_models(&user_models[0], m));
+ rxkb_model_unref(m);
+
+ m = fetch_model(ctx, "m4");
+ assert(cmp_models(&user_models[1], m));
+ rxkb_model_unref(m);
+
+ 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", NO_VARIANT);
+ assert(cmp_layouts(&user_layouts[0], l));
+ rxkb_layout_unref(l);
+
+ l = fetch_layout(ctx, "l2", "v2");
+ assert(cmp_layouts(&user_layouts[1], 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);
+
+ g = fetch_option_group(ctx, "grp2");
+ assert(cmp_option_groups(&system_groups[1], g, CMP_EXACT));
+ rxkb_option_group_unref(g);
+
+ g = fetch_option_group(ctx, "grp3");
+ assert(cmp_option_groups(&user_groups[0], g, CMP_EXACT));
+ rxkb_option_group_unref(g);
+
+ g = fetch_option_group(ctx, "grp4");
+ assert(cmp_option_groups(&user_groups[1], g, CMP_EXACT));
+ rxkb_option_group_unref(g);
+
+ rxkb_context_unref(ctx);
+}
+
+static void
+test_load_merge_no_overwrite(void)
+{
+ struct test_model system_models[] = {
+ {"m1", "vendor1", "desc1"},
+ {"m2", "vendor2", "desc2"},
+ {NULL},
+ };
+ struct test_model user_models[] = {
+ {"m1", "vendor3", "desc3"}, /* must not overwrite */
+ {"m4", "vendor4", "desc4"},
+ {NULL},
+ };
+ struct test_layout system_layouts[] = {
+ {"l1", NO_VARIANT, "lbrief1", "ldesc1"},
+ {"l1", "v1", "vbrief1", "vdesc1"},
+ {NULL},
+ };
+ struct test_layout user_layouts[] = {
+ {"l2", NO_VARIANT, "lbrief2", "ldesc2"},
+ {"l2", "v2", "vbrief2", "vdesc2"},
+ {"l1", NO_VARIANT, "lbrief3", "ldesc3"}, /* must not overwrite */
+ {"l1", "v2", "vbrief3", "vdesc3"}, /* must not overwrite */
+ {NULL},
+ };
+ struct test_option_group system_groups[] = {
+ {"grp1", "gdesc1", true,
+ { {"grp1:1", "odesc11"}, {"grp1:2", "odesc12"} } },
+ {"grp2", "gdesc2", false,
+ { {"grp2:1", "odesc21"}, {"grp2:2", "odesc22"} } },
+ { NULL },
+ };
+ struct test_option_group user_groups[] = {
+ {"grp1", "XXXXX", false, /* must not overwrite */
+ { {"grp1:1", "YYYYYYY"}, /* must not overwrite */
+ {"grp1:3", "ZZZZZZ"} } }, /* append */
+ {"grp4", "gdesc4", false,
+ { {"grp4:1", "odesc41"}, {"grp4:2", "odesc42"} } },
+ { NULL },
+ };
+ struct rxkb_context *ctx;
+ struct rxkb_model *m;
+ struct rxkb_layout *l;
+ struct rxkb_option_group *g;
+
+ ctx = test_setup_context(system_models, user_models,
+ system_layouts, user_layouts,
+ system_groups, user_groups);
+
+ m = fetch_model(ctx, "m1");
+ assert(cmp_models(&system_models[0], m));
+ rxkb_model_unref(m);
+
+ 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);
+
+ assert(find_option(ctx, "grp1", "grp1:3"));
+ g = fetch_option_group(ctx, "grp1");
+ assert(cmp_option_groups(&system_groups[0], g, CMP_MATCHING_ONLY));
+ rxkb_option_group_unref(g);
+
+ rxkb_context_unref(ctx);
+}
+
+static void
+test_no_include_paths(void)
+{
+ struct rxkb_context *ctx;
+
+ ctx = rxkb_context_new(RXKB_CONTEXT_NO_DEFAULT_INCLUDES);
+ assert(ctx);
+ assert(!rxkb_context_parse_default_ruleset(ctx));
+
+ rxkb_context_unref(ctx);
+}
+
+static void
+test_invalid_include(void)
+{
+ struct rxkb_context *ctx;
+
+ ctx = rxkb_context_new(RXKB_CONTEXT_NO_DEFAULT_INCLUDES);
+ assert(ctx);
+ assert(!rxkb_context_include_path_append(ctx, "/foo/bar/baz/bat"));
+ assert(!rxkb_context_parse_default_ruleset(ctx));
+
+ rxkb_context_unref(ctx);
+}
+
+int
+main(void)
+{
+ test_no_include_paths();
+ test_invalid_include();
+ test_load_basic();
+ test_load_full();
+ test_load_merge();
+ test_load_merge_no_overwrite();
+ test_popularity();
+
+ return 0;
+}
diff --git a/test/rules-file-includes.c b/test/rules-file-includes.c
new file mode 100644
index 0000000..006449c
--- /dev/null
+++ b/test/rules-file-includes.c
@@ -0,0 +1,164 @@
+/*
+ * Copyright © 2012 Ran Benita <ran234@gmail.com>
+ * Copyright © 2019 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.
+ */
+
+#include "config.h"
+#include "test-config.h"
+
+#include "test.h"
+#include "xkbcomp/xkbcomp-priv.h"
+#include "xkbcomp/rules.h"
+
+struct test_data {
+ /* Rules file */
+ const char *rules;
+
+ /* Input */
+ const char *model;
+ const char *layout;
+ const char *variant;
+ const char *options;
+
+ /* Expected output */
+ const char *keycodes;
+ const char *types;
+ const char *compat;
+ const char *symbols;
+
+ /* Or set this if xkb_components_from_rules() should fail. */
+ bool should_fail;
+};
+
+static bool
+test_rules(struct xkb_context *ctx, struct test_data *data)
+{
+ bool passed;
+ const struct xkb_rule_names rmlvo = {
+ data->rules, data->model, data->layout, data->variant, data->options
+ };
+ struct xkb_component_names kccgst;
+
+ fprintf(stderr, "\n\nChecking : %s\t%s\t%s\t%s\t%s\n", data->rules,
+ data->model, data->layout, data->variant, data->options);
+
+ if (data->should_fail)
+ fprintf(stderr, "Expecting: FAILURE\n");
+ else
+ fprintf(stderr, "Expecting: %s\t%s\t%s\t%s\n",
+ data->keycodes, data->types, data->compat, data->symbols);
+
+ if (!xkb_components_from_rules(ctx, &rmlvo, &kccgst)) {
+ fprintf(stderr, "Received : FAILURE\n");
+ return data->should_fail;
+ }
+
+ fprintf(stderr, "Received : %s\t%s\t%s\t%s\n",
+ kccgst.keycodes, kccgst.types, kccgst.compat, kccgst.symbols);
+
+ passed = streq(kccgst.keycodes, data->keycodes) &&
+ streq(kccgst.types, data->types) &&
+ streq(kccgst.compat, data->compat) &&
+ streq(kccgst.symbols, data->symbols);
+
+ free(kccgst.keycodes);
+ free(kccgst.types);
+ free(kccgst.compat);
+ free(kccgst.symbols);
+
+ return passed;
+}
+
+int
+main(int argc, char *argv[])
+{
+ struct xkb_context *ctx;
+
+ setenv("XKB_CONFIG_ROOT", TEST_XKB_CONFIG_ROOT, 1);
+
+ ctx = test_get_context(0);
+ assert(ctx);
+
+ struct test_data test1 = {
+ .rules = "inc-src-simple",
+
+ .model = "my_model", .layout = "my_layout", .variant = "", .options = "",
+
+ .keycodes = "my_keycodes", .types = "default_types",
+ .compat = "default_compat", .symbols = "my_symbols",
+ };
+ assert(test_rules(ctx, &test1));
+
+ struct test_data test2 = {
+ .rules = "inc-src-nested",
+
+ .model = "my_model", .layout = "my_layout", .variant = "", .options = "",
+
+ .keycodes = "my_keycodes", .types = "default_types",
+ .compat = "default_compat", .symbols = "my_symbols",
+ };
+ assert(test_rules(ctx, &test2));
+
+ struct test_data test3 = {
+ .rules = "inc-src-looped",
+
+ .model = "my_model", .layout = "my_layout", .variant = "", .options = "",
+
+ .should_fail = true,
+ };
+ assert(test_rules(ctx, &test3));
+
+ struct test_data test4 = {
+ .rules = "inc-src-before-after",
+
+ .model = "before_model", .layout = "my_layout", .variant = "", .options = "",
+
+ .keycodes = "my_keycodes", .types = "default_types",
+ .compat = "default_compat", .symbols = "default_symbols",
+ };
+ assert(test_rules(ctx, &test4));
+
+ struct test_data test5 = {
+ .rules = "inc-src-options",
+
+ .model = "my_model", .layout = "my_layout", .variant = "my_variant",
+ .options = "option11,my_option,colon:opt,option111",
+
+ .keycodes = "my_keycodes", .types = "default_types",
+ .compat = "default_compat+substring+group(bla)|some:compat",
+ .symbols = "my_symbols+extra_variant+altwin(menu)",
+ };
+ assert(test_rules(ctx, &test5));
+
+ struct test_data test6 = {
+ .rules = "inc-src-loop-twice",
+
+ .model = "my_model", .layout = "my_layout", .variant = "", .options = "",
+
+ .keycodes = "my_keycodes", .types = "default_types",
+ .compat = "default_compat", .symbols = "my_symbols",
+ };
+ assert(test_rules(ctx, &test6));
+
+ xkb_context_unref(ctx);
+ return 0;
+}
diff --git a/test/rules-file.c b/test/rules-file.c
new file mode 100644
index 0000000..d217ba9
--- /dev/null
+++ b/test/rules-file.c
@@ -0,0 +1,175 @@
+/*
+ * Copyright © 2012 Ran Benita <ran234@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "config.h"
+
+#include "test.h"
+#include "xkbcomp/xkbcomp-priv.h"
+#include "xkbcomp/rules.h"
+
+struct test_data {
+ /* Rules file */
+ const char *rules;
+
+ /* Input */
+ const char *model;
+ const char *layout;
+ const char *variant;
+ const char *options;
+
+ /* Expected output */
+ const char *keycodes;
+ const char *types;
+ const char *compat;
+ const char *symbols;
+
+ /* Or set this if xkb_components_from_rules() should fail. */
+ bool should_fail;
+};
+
+static bool
+test_rules(struct xkb_context *ctx, struct test_data *data)
+{
+ bool passed;
+ const struct xkb_rule_names rmlvo = {
+ data->rules, data->model, data->layout, data->variant, data->options
+ };
+ struct xkb_component_names kccgst;
+
+ fprintf(stderr, "\n\nChecking : %s\t%s\t%s\t%s\t%s\n", data->rules,
+ data->model, data->layout, data->variant, data->options);
+
+ if (data->should_fail)
+ fprintf(stderr, "Expecting: FAILURE\n");
+ else
+ fprintf(stderr, "Expecting: %s\t%s\t%s\t%s\n",
+ data->keycodes, data->types, data->compat, data->symbols);
+
+ if (!xkb_components_from_rules(ctx, &rmlvo, &kccgst)) {
+ fprintf(stderr, "Received : FAILURE\n");
+ return data->should_fail;
+ }
+
+ fprintf(stderr, "Received : %s\t%s\t%s\t%s\n",
+ kccgst.keycodes, kccgst.types, kccgst.compat, kccgst.symbols);
+
+ passed = streq(kccgst.keycodes, data->keycodes) &&
+ streq(kccgst.types, data->types) &&
+ streq(kccgst.compat, data->compat) &&
+ streq(kccgst.symbols, data->symbols);
+
+ free(kccgst.keycodes);
+ free(kccgst.types);
+ free(kccgst.compat);
+ free(kccgst.symbols);
+
+ return passed;
+}
+
+int
+main(int argc, char *argv[])
+{
+ struct xkb_context *ctx;
+
+ ctx = test_get_context(0);
+ assert(ctx);
+
+ struct test_data test1 = {
+ .rules = "simple",
+
+ .model = "my_model", .layout = "my_layout", .variant = "my_variant",
+ .options = "my_option",
+
+ .keycodes = "my_keycodes", .types = "my_types",
+ .compat = "my_compat|some:compat",
+ .symbols = "my_symbols+extra_variant",
+ };
+ assert(test_rules(ctx, &test1));
+
+ struct test_data test2 = {
+ .rules = "simple",
+
+ .model = "", .layout = "", .variant = "", .options = "",
+
+ .keycodes = "default_keycodes", .types = "default_types",
+ .compat = "default_compat", .symbols = "default_symbols",
+ };
+ assert(test_rules(ctx, &test2));
+
+ struct test_data test3 = {
+ .rules = "groups",
+
+ .model = "pc104", .layout = "foo", .variant = "", .options = "",
+
+ .keycodes = "something(pc104)", .types = "default_types",
+ .compat = "default_compat", .symbols = "default_symbols",
+ };
+ assert(test_rules(ctx, &test3));
+
+ struct test_data test4 = {
+ .rules = "groups",
+
+ .model = "foo", .layout = "ar", .variant = "bar", .options = "",
+
+ .keycodes = "default_keycodes", .types = "default_types",
+ .compat = "default_compat", .symbols = "my_symbols+(bar)",
+ };
+ assert(test_rules(ctx, &test4));
+
+ struct test_data test5 = {
+ .rules = "simple",
+
+ .model = NULL, .layout = "my_layout,second_layout", .variant = "my_variant",
+ .options = "my_option",
+
+ .should_fail = true
+ };
+ assert(test_rules(ctx, &test5));
+
+ struct test_data test6 = {
+ .rules = "index",
+
+ .model = "", .layout = "br,al,cn,az", .variant = "",
+ .options = "some:opt",
+
+ .keycodes = "default_keycodes", .types = "default_types",
+ .compat = "default_compat",
+ .symbols = "default_symbols+extra:1+extra:2+extra:3+extra:4",
+ };
+ assert(test_rules(ctx, &test6));
+
+ struct test_data test7 = {
+ .rules = "multiple-options",
+
+ .model = "my_model", .layout = "my_layout", .variant = "my_variant",
+ .options = "option3,option1,colon:opt,option11",
+
+ .keycodes = "my_keycodes", .types = "my_types",
+ .compat = "my_compat+some:compat+group(bla)",
+ .symbols = "my_symbols+extra_variant+compose(foo)+keypad(bar)+altwin(menu)",
+ };
+ assert(test_rules(ctx, &test7));
+
+ xkb_context_unref(ctx);
+ return 0;
+}
diff --git a/test/rulescomp.c b/test/rulescomp.c
new file mode 100644
index 0000000..eddf306
--- /dev/null
+++ b/test/rulescomp.c
@@ -0,0 +1,205 @@
+/*
+ * Copyright © 2009 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 (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 "evdev-scancodes.h"
+#include "test.h"
+
+static int
+test_rmlvo_va(struct xkb_context *context, const char *rules,
+ const char *model, const char *layout,
+ const char *variant, const char *options, va_list ap)
+{
+ struct xkb_keymap *keymap;
+ int ret;
+
+ keymap = test_compile_rules(context, rules, model, layout, variant,
+ options);
+ if (!keymap)
+ return 0;
+
+ fprintf(stderr, "Compiled '%s' '%s' '%s' '%s' '%s'\n",
+ strnull(rules), strnull(model), strnull(layout),
+ strnull(variant), strnull(options));
+
+ ret = test_key_seq_va(keymap, ap);
+
+ xkb_keymap_unref(keymap);
+
+ return ret;
+}
+
+static int
+test_rmlvo(struct xkb_context *context, const char *rules,
+ const char *model, const char *layout, const char *variant,
+ const char *options, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start(ap, options);
+ ret = test_rmlvo_va(context, rules, model, layout, variant, options, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+static int
+test_rmlvo_env(struct xkb_context *ctx, const char *rules, const char *model,
+ const char *layout, const char *variant, const char *options,
+ ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start (ap, options);
+
+ if (!isempty(rules))
+ setenv("XKB_DEFAULT_RULES", rules, 1);
+ else
+ unsetenv("XKB_DEFAULT_RULES");
+
+ if (!isempty(model))
+ setenv("XKB_DEFAULT_MODEL", model, 1);
+ else
+ unsetenv("XKB_DEFAULT_MODEL");
+
+ if (!isempty(layout))
+ setenv("XKB_DEFAULT_LAYOUT", layout, 1);
+ else
+ unsetenv("XKB_DEFAULT_LAYOUT");
+
+ if (!isempty(variant))
+ setenv("XKB_DEFAULT_VARIANT", variant, 1);
+ else
+ unsetenv("XKB_DEFAULT_VARIANT");
+
+ if (!isempty(options))
+ setenv("XKB_DEFAULT_OPTIONS", options, 1);
+ else
+ unsetenv("XKB_DEFAULT_OPTIONS");
+
+ ret = test_rmlvo_va(ctx, NULL, NULL, NULL, NULL, NULL, ap);
+
+ va_end(ap);
+
+ return ret;
+}
+
+int
+main(int argc, char *argv[])
+{
+ struct xkb_context *ctx = test_get_context(CONTEXT_ALLOW_ENVIRONMENT_NAMES);
+
+ assert(ctx);
+
+#define KS(name) xkb_keysym_from_name(name, 0)
+
+ assert(test_rmlvo(ctx, "evdev", "pc105", "us,il,ru,ca", ",,,multix", "grp:alts_toggle,ctrl:nocaps,compose:rwin",
+ KEY_Q, BOTH, XKB_KEY_q, NEXT,
+ KEY_LEFTALT, DOWN, XKB_KEY_Alt_L, NEXT,
+ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_Alt_L, NEXT,
+ KEY_Q, BOTH, XKB_KEY_slash, NEXT,
+ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT,
+ KEY_Q, BOTH, XKB_KEY_Q, NEXT,
+ KEY_RIGHTMETA, BOTH, XKB_KEY_Multi_key, FINISH));
+ assert(test_rmlvo(ctx, "evdev", "pc105", "us,in", "", "grp:alts_toggle",
+ KEY_A, BOTH, XKB_KEY_a, NEXT,
+ KEY_LEFTALT, DOWN, XKB_KEY_Alt_L, NEXT,
+ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_Alt_L, NEXT,
+ KEY_A, BOTH, KS("U094b"), FINISH));
+ assert(test_rmlvo(ctx, "evdev", "pc105", "us", "intl", "",
+ KEY_GRAVE, BOTH, XKB_KEY_dead_grave, FINISH));
+ assert(test_rmlvo(ctx, "evdev", "evdev", "us", "intl", "grp:alts_toggle",
+ KEY_GRAVE, BOTH, XKB_KEY_dead_grave, FINISH));
+
+ /* 20 is not a legal group; make sure this is handled gracefully. */
+ assert(test_rmlvo(ctx, "evdev", "", "us:20", "", "",
+ KEY_A, BOTH, XKB_KEY_a, FINISH));
+
+ /* Don't choke on missing values in RMLVO. Should just skip them.
+ Currently generates us,us,ca. */
+ assert(test_rmlvo(ctx, "evdev", "", "us,,ca", "", "grp:alts_toggle",
+ KEY_A, BOTH, XKB_KEY_a, NEXT,
+ KEY_LEFTALT, DOWN, XKB_KEY_Alt_L, NEXT,
+ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_Alt_L, NEXT,
+ KEY_LEFTALT, DOWN, XKB_KEY_Alt_L, NEXT,
+ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_Alt_L, NEXT,
+ KEY_APOSTROPHE, BOTH, XKB_KEY_dead_grave, FINISH));
+
+ assert(test_rmlvo(ctx, "", "", "", "", "",
+ KEY_A, BOTH, XKB_KEY_a, FINISH));
+
+ assert(!test_rmlvo(ctx, "does-not-exist", "", "", "", "",
+ KEY_A, BOTH, XKB_KEY_a, FINISH));
+
+ assert(test_rmlvo_env(ctx, "evdev", "", "us", "", "",
+ KEY_A, BOTH, XKB_KEY_a, FINISH));
+ assert(test_rmlvo_env(ctx, "evdev", "", "us", "", "ctrl:nocaps",
+ KEY_CAPSLOCK, BOTH, XKB_KEY_Control_L, FINISH));
+
+ /* Ignores multix and generates us,ca. */
+ assert(test_rmlvo_env(ctx, "evdev", "", "us,ca", ",,,multix", "grp:alts_toggle",
+ KEY_A, BOTH, XKB_KEY_a, NEXT,
+ KEY_LEFTALT, DOWN, XKB_KEY_Alt_L, NEXT,
+ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Next_Group, NEXT,
+ KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, NEXT,
+ KEY_LEFTALT, UP, XKB_KEY_Alt_L, NEXT,
+ KEY_GRAVE, UP, XKB_KEY_numbersign, FINISH));
+
+ assert(!test_rmlvo_env(ctx, "broken", "what-on-earth", "invalid", "", "",
+ KEY_A, BOTH, XKB_KEY_a, FINISH));
+
+ /* Ensure a keymap with an empty xkb_keycodes compiles fine. */
+ assert(test_rmlvo_env(ctx, "base", "empty", "empty", "", "",
+ KEY_A, BOTH, XKB_KEY_NoSymbol, FINISH));
+
+ /* Has an illegal escape sequence, but shouldn't fail. */
+ assert(test_rmlvo_env(ctx, "evdev", "", "cz", "bksl", "",
+ KEY_A, BOTH, XKB_KEY_a, FINISH));
+
+ xkb_context_unref(ctx);
+
+ ctx = test_get_context(0);
+ assert(test_rmlvo_env(ctx, "broken", "but", "ignored", "per", "ctx flags",
+ KEY_A, BOTH, XKB_KEY_a, FINISH));
+
+ /* Test response to invalid flags. */
+ {
+ struct xkb_rule_names rmlvo = { NULL };
+ assert(!xkb_keymap_new_from_names(ctx, &rmlvo, -1));
+ assert(!xkb_keymap_new_from_names(ctx, &rmlvo, 5453));
+ }
+
+ xkb_context_unref(ctx);
+ return 0;
+}
diff --git a/test/state.c b/test/state.c
new file mode 100644
index 0000000..3ec7c66
--- /dev/null
+++ b/test/state.c
@@ -0,0 +1,745 @@
+/*
+ * 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 <daniel@fooishbar.org>
+ */
+
+#include "config.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "evdev-scancodes.h"
+#include "test.h"
+
+/* Offset between evdev keycodes (where KEY_ESCAPE is 1), and the evdev XKB
+ * keycode set (where ESC is 9). */
+#define EVDEV_OFFSET 8
+
+static void
+print_state(struct xkb_state *state)
+{
+ struct xkb_keymap *keymap;
+ xkb_layout_index_t group;
+ xkb_mod_index_t mod;
+ xkb_led_index_t led;
+
+ group = xkb_state_serialize_layout(state, XKB_STATE_LAYOUT_EFFECTIVE);
+ mod = xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE);
+ /* led = xkb_state_serialize_leds(state, XKB_STATE_LEDS); */
+ if (!group && !mod /* && !led */) {
+ fprintf(stderr, "\tno state\n");
+ return;
+ }
+
+ keymap = xkb_state_get_keymap(state);
+
+ for (group = 0; group < xkb_keymap_num_layouts(keymap); group++) {
+ if (xkb_state_layout_index_is_active(state, group,
+ XKB_STATE_LAYOUT_EFFECTIVE |
+ XKB_STATE_LAYOUT_DEPRESSED |
+ XKB_STATE_LAYOUT_LATCHED |
+ XKB_STATE_LAYOUT_LOCKED) <= 0)
+ continue;
+ fprintf(stderr, "\tgroup %s (%d): %s%s%s%s\n",
+ xkb_keymap_layout_get_name(keymap, group),
+ group,
+ xkb_state_layout_index_is_active(state, group, XKB_STATE_LAYOUT_EFFECTIVE) > 0 ?
+ "effective " : "",
+ xkb_state_layout_index_is_active(state, group, XKB_STATE_LAYOUT_DEPRESSED) > 0 ?
+ "depressed " : "",
+ xkb_state_layout_index_is_active(state, group, XKB_STATE_LAYOUT_LATCHED) > 0 ?
+ "latched " : "",
+ xkb_state_layout_index_is_active(state, group, XKB_STATE_LAYOUT_LOCKED) > 0 ?
+ "locked " : "");
+ }
+
+ for (mod = 0; mod < xkb_keymap_num_mods(keymap); mod++) {
+ if (xkb_state_mod_index_is_active(state, mod,
+ XKB_STATE_MODS_EFFECTIVE |
+ XKB_STATE_MODS_DEPRESSED |
+ XKB_STATE_MODS_LATCHED |
+ XKB_STATE_MODS_LOCKED) <= 0)
+ continue;
+ fprintf(stderr, "\tmod %s (%d): %s%s%s%s\n",
+ xkb_keymap_mod_get_name(keymap, mod),
+ mod,
+ xkb_state_mod_index_is_active(state, mod, XKB_STATE_MODS_EFFECTIVE) > 0 ?
+ "effective " : "",
+ xkb_state_mod_index_is_active(state, mod, XKB_STATE_MODS_DEPRESSED) > 0 ?
+ "depressed " : "",
+ xkb_state_mod_index_is_active(state, mod, XKB_STATE_MODS_LATCHED) > 0 ?
+ "latched " : "",
+ xkb_state_mod_index_is_active(state, mod, XKB_STATE_MODS_LOCKED) > 0 ?
+ "locked " : "");
+ }
+
+ for (led = 0; led < xkb_keymap_num_leds(keymap); led++) {
+ if (xkb_state_led_index_is_active(state, led) <= 0)
+ continue;
+ fprintf(stderr, "\tled %s (%d): active\n",
+ xkb_keymap_led_get_name(keymap, led),
+ led);
+ }
+}
+
+static void
+test_update_key(struct xkb_keymap *keymap)
+{
+ struct xkb_state *state = xkb_state_new(keymap);
+ const xkb_keysym_t *syms;
+ xkb_keysym_t one_sym;
+ int num_syms;
+
+ assert(state);
+
+ /* LCtrl down */
+ xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_DOWN);
+ fprintf(stderr, "dumping state for LCtrl down:\n");
+ print_state(state);
+ assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CTRL,
+ XKB_STATE_MODS_DEPRESSED) > 0);
+
+ /* LCtrl + RAlt down */
+ xkb_state_update_key(state, KEY_RIGHTALT + EVDEV_OFFSET, XKB_KEY_DOWN);
+ fprintf(stderr, "dumping state for LCtrl + RAlt down:\n");
+ print_state(state);
+ assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CTRL,
+ XKB_STATE_MODS_DEPRESSED) > 0);
+ assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_ALT,
+ XKB_STATE_MODS_DEPRESSED) > 0);
+ assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_DEPRESSED,
+ XKB_STATE_MATCH_ALL,
+ XKB_MOD_NAME_CTRL,
+ XKB_MOD_NAME_ALT,
+ NULL) > 0);
+ assert(xkb_state_mod_indices_are_active(state, XKB_STATE_MODS_DEPRESSED,
+ XKB_STATE_MATCH_ALL,
+ xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CTRL),
+ xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_ALT),
+ XKB_MOD_INVALID) > 0);
+ assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_DEPRESSED,
+ XKB_STATE_MATCH_ALL,
+ XKB_MOD_NAME_ALT,
+ NULL) == 0);
+ assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_DEPRESSED,
+ XKB_STATE_MATCH_ALL |
+ XKB_STATE_MATCH_NON_EXCLUSIVE,
+ XKB_MOD_NAME_ALT,
+ NULL) > 0);
+ assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_DEPRESSED,
+ (XKB_STATE_MATCH_ANY |
+ XKB_STATE_MATCH_NON_EXCLUSIVE),
+ XKB_MOD_NAME_ALT,
+ NULL) > 0);
+
+ /* RAlt down */
+ xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_UP);
+ fprintf(stderr, "dumping state for RAlt down:\n");
+ print_state(state);
+ assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CTRL,
+ XKB_STATE_MODS_EFFECTIVE) == 0);
+ assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_ALT,
+ XKB_STATE_MODS_DEPRESSED) > 0);
+ assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_DEPRESSED,
+ XKB_STATE_MATCH_ANY,
+ XKB_MOD_NAME_CTRL,
+ XKB_MOD_NAME_ALT,
+ NULL) > 0);
+ assert(xkb_state_mod_names_are_active(state, XKB_STATE_MODS_LATCHED,
+ XKB_STATE_MATCH_ANY,
+ XKB_MOD_NAME_CTRL,
+ XKB_MOD_NAME_ALT,
+ NULL) == 0);
+
+ /* none down */
+ xkb_state_update_key(state, KEY_RIGHTALT + EVDEV_OFFSET, XKB_KEY_UP);
+ assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_ALT,
+ XKB_STATE_MODS_EFFECTIVE) == 0);
+
+ /* Caps locked */
+ xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
+ assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS,
+ XKB_STATE_MODS_DEPRESSED) > 0);
+ xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP);
+ fprintf(stderr, "dumping state for Caps Lock:\n");
+ print_state(state);
+ assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS,
+ XKB_STATE_MODS_DEPRESSED) == 0);
+ assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS,
+ XKB_STATE_MODS_LOCKED) > 0);
+ assert(xkb_state_led_name_is_active(state, XKB_LED_NAME_CAPS) > 0);
+ num_syms = xkb_state_key_get_syms(state, KEY_Q + EVDEV_OFFSET, &syms);
+ assert(num_syms == 1 && syms[0] == XKB_KEY_Q);
+
+ /* Num Lock locked */
+ xkb_state_update_key(state, KEY_NUMLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_NUMLOCK + EVDEV_OFFSET, XKB_KEY_UP);
+ fprintf(stderr, "dumping state for Caps Lock + Num Lock:\n");
+ print_state(state);
+ assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS,
+ XKB_STATE_MODS_LOCKED) > 0);
+ assert(xkb_state_mod_name_is_active(state, "Mod2",
+ XKB_STATE_MODS_LOCKED) > 0);
+ num_syms = xkb_state_key_get_syms(state, KEY_KP1 + EVDEV_OFFSET, &syms);
+ assert(num_syms == 1 && syms[0] == XKB_KEY_KP_1);
+ assert(xkb_state_led_name_is_active(state, XKB_LED_NAME_NUM) > 0);
+
+ /* Num Lock unlocked */
+ xkb_state_update_key(state, KEY_NUMLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_NUMLOCK + EVDEV_OFFSET, XKB_KEY_UP);
+
+ /* Switch to group 2 */
+ xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_UP);
+ assert(xkb_state_led_name_is_active(state, "Group 2") > 0);
+ assert(xkb_state_led_name_is_active(state, XKB_LED_NAME_NUM) == 0);
+
+ /* Switch back to group 1. */
+ xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_UP);
+
+ /* Caps unlocked */
+ xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP);
+ assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS,
+ XKB_STATE_MODS_EFFECTIVE) == 0);
+ assert(xkb_state_led_name_is_active(state, XKB_LED_NAME_CAPS) == 0);
+ num_syms = xkb_state_key_get_syms(state, KEY_Q + EVDEV_OFFSET, &syms);
+ assert(num_syms == 1 && syms[0] == XKB_KEY_q);
+
+ /* Multiple symbols */
+ num_syms = xkb_state_key_get_syms(state, KEY_6 + EVDEV_OFFSET, &syms);
+ assert(num_syms == 5 &&
+ syms[0] == XKB_KEY_H && syms[1] == XKB_KEY_E &&
+ syms[2] == XKB_KEY_L && syms[3] == XKB_KEY_L &&
+ syms[4] == XKB_KEY_O);
+ one_sym = xkb_state_key_get_one_sym(state, KEY_6 + EVDEV_OFFSET);
+ assert(one_sym == XKB_KEY_NoSymbol);
+ xkb_state_update_key(state, KEY_6 + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_6 + EVDEV_OFFSET, XKB_KEY_UP);
+
+ one_sym = xkb_state_key_get_one_sym(state, KEY_5 + EVDEV_OFFSET);
+ assert(one_sym == XKB_KEY_5);
+
+ xkb_state_unref(state);
+}
+
+static void
+test_serialisation(struct xkb_keymap *keymap)
+{
+ struct xkb_state *state = xkb_state_new(keymap);
+ xkb_mod_mask_t base_mods;
+ xkb_mod_mask_t latched_mods;
+ xkb_mod_mask_t locked_mods;
+ xkb_mod_mask_t effective_mods;
+ xkb_mod_index_t caps, shift, ctrl;
+ xkb_layout_index_t base_group = 0;
+ xkb_layout_index_t latched_group = 0;
+ xkb_layout_index_t locked_group = 0;
+
+ assert(state);
+
+ caps = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
+ assert(caps != XKB_MOD_INVALID);
+ shift = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
+ assert(shift != XKB_MOD_INVALID);
+ ctrl = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CTRL);
+ assert(ctrl != XKB_MOD_INVALID);
+
+ xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP);
+ base_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED);
+ assert(base_mods == 0);
+ latched_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LATCHED);
+ assert(latched_mods == 0);
+ locked_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LOCKED);
+ assert(locked_mods == (1U << caps));
+ effective_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE);
+ assert(effective_mods == locked_mods);
+
+ xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN);
+ base_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED);
+ assert(base_mods == (1U << shift));
+ latched_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LATCHED);
+ assert(latched_mods == 0);
+ locked_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LOCKED);
+ assert(locked_mods == (1U << caps));
+ effective_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE);
+ assert(effective_mods == (base_mods | locked_mods));
+
+ base_mods |= (1U << ctrl);
+ xkb_state_update_mask(state, base_mods, latched_mods, locked_mods,
+ base_group, latched_group, locked_group);
+
+ assert(xkb_state_mod_index_is_active(state, ctrl, XKB_STATE_MODS_DEPRESSED) > 0);
+ assert(xkb_state_mod_index_is_active(state, ctrl, XKB_STATE_MODS_EFFECTIVE) > 0);
+
+ xkb_state_unref(state);
+}
+
+static void
+test_update_mask_mods(struct xkb_keymap *keymap)
+{
+ struct xkb_state *state = xkb_state_new(keymap);
+ xkb_mod_index_t caps, shift, num, alt, mod1, mod2;
+ enum xkb_state_component changed;
+
+ assert(state);
+
+ caps = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
+ assert(caps != XKB_MOD_INVALID);
+ shift = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
+ assert(shift != XKB_MOD_INVALID);
+ num = xkb_keymap_mod_get_index(keymap, "NumLock");
+ assert(num != XKB_MOD_INVALID);
+ alt = xkb_keymap_mod_get_index(keymap, "Alt");
+ assert(alt != XKB_MOD_INVALID);
+ mod1 = xkb_keymap_mod_get_index(keymap, "Mod1");
+ assert(mod1 != XKB_MOD_INVALID);
+ mod2 = xkb_keymap_mod_get_index(keymap, "Mod2");
+ assert(mod2 != XKB_MOD_INVALID);
+
+ changed = xkb_state_update_mask(state, 1 << caps, 0, 0, 0, 0, 0);
+ assert(changed == (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_EFFECTIVE));
+ assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) ==
+ (1u << caps));
+
+ changed = xkb_state_update_mask(state, (1 << caps), 0, (1 << shift), 0, 0, 0);
+ assert(changed == (XKB_STATE_MODS_LOCKED | XKB_STATE_MODS_EFFECTIVE |
+ XKB_STATE_LEDS));
+ assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) ==
+ ((1u << caps) | (1u << shift)));
+ assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED) ==
+ (1u << caps));
+ assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_LATCHED) == 0);
+ assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_LOCKED) ==
+ (1u << shift));
+
+ changed = xkb_state_update_mask(state, 0, 0, 0, 0, 0, 0);
+ assert(changed == (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LOCKED |
+ XKB_STATE_MODS_EFFECTIVE | XKB_STATE_LEDS));
+ assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) == 0);
+
+ changed = xkb_state_update_mask(state, (1 << alt), 0, 0, 0, 0, 0);
+ assert(changed == (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_EFFECTIVE));
+ assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) ==
+ ((1u << alt) | (1u << mod1)));
+
+ changed = xkb_state_update_mask(state, 0, 0, (1 << num), 0, 0, 0);
+ assert(changed == (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LOCKED |
+ XKB_STATE_MODS_EFFECTIVE | XKB_STATE_LEDS));
+ assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) ==
+ ((1u << num) | (1u << mod2)));
+
+ xkb_state_update_mask(state, 0, 0, 0, 0, 0, 0);
+
+ changed = xkb_state_update_mask(state, (1 << mod2), 0, (1 << num), 0, 0, 0);
+ assert(changed == (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LOCKED |
+ XKB_STATE_MODS_EFFECTIVE | XKB_STATE_LEDS));
+ assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE) ==
+ ((1u << mod2) | (1u << num)));
+ assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED) ==
+ (1u << mod2));
+ assert(xkb_state_serialize_mods(state, XKB_STATE_MODS_LOCKED) ==
+ ((1u << num) | (1u << mod2)));
+
+ xkb_state_unref(state);
+}
+
+static void
+test_repeat(struct xkb_keymap *keymap)
+{
+ assert(!xkb_keymap_key_repeats(keymap, KEY_LEFTSHIFT + 8));
+ assert(xkb_keymap_key_repeats(keymap, KEY_A + 8));
+ assert(xkb_keymap_key_repeats(keymap, KEY_8 + 8));
+ assert(xkb_keymap_key_repeats(keymap, KEY_DOWN + 8));
+ assert(xkb_keymap_key_repeats(keymap, KEY_KBDILLUMDOWN + 8));
+}
+
+static void
+test_consume(struct xkb_keymap *keymap)
+{
+ struct xkb_state *state;
+ xkb_mod_index_t alt, shift, caps, ctrl, mod5;
+ xkb_mod_mask_t mask;
+
+ state = xkb_state_new(keymap);
+ assert(state);
+
+ alt = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_ALT);
+ assert(alt != XKB_MOD_INVALID);
+ shift = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
+ assert(shift != XKB_MOD_INVALID);
+ caps = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
+ assert(caps != XKB_MOD_INVALID);
+ ctrl = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CTRL);
+ assert(ctrl != XKB_MOD_INVALID);
+ mod5 = xkb_keymap_mod_get_index(keymap, "Mod5");
+ assert(mod5 != XKB_MOD_INVALID);
+
+ /* Test remove_consumed() */
+ xkb_state_update_key(state, KEY_LEFTALT + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_EQUAL + EVDEV_OFFSET, XKB_KEY_DOWN);
+
+ fprintf(stderr, "dumping state for Alt-Shift-+\n");
+ print_state(state);
+
+ mask = xkb_state_serialize_mods(state, XKB_STATE_MODS_EFFECTIVE);
+ assert(mask == ((1U << alt) | (1U << shift)));
+ mask = xkb_state_mod_mask_remove_consumed(state, KEY_EQUAL + EVDEV_OFFSET,
+ mask);
+ assert(mask == (1U << alt));
+
+ /* Test get_consumed_mods() */
+ mask = xkb_state_key_get_consumed_mods(state, KEY_EQUAL + EVDEV_OFFSET);
+ assert(mask == (1U << shift));
+
+ mask = xkb_state_key_get_consumed_mods(state, KEY_ESC + EVDEV_OFFSET);
+ assert(mask == 0);
+
+ xkb_state_unref(state);
+
+ /* Test is_consumed() - simple ALPHABETIC type. */
+ state = xkb_state_new(keymap);
+ assert(state);
+
+ mask = xkb_state_key_get_consumed_mods(state, KEY_A + EVDEV_OFFSET);
+ assert(mask == ((1U << shift) | (1U << caps)));
+
+ assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, caps) > 0);
+ assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, shift) > 0);
+ xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP);
+ assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, caps) > 0);
+ assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, shift) > 0);
+ xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN);
+ assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, caps) > 0);
+ assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, shift) > 0);
+ xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_UP);
+ xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP);
+ assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, caps) > 0);
+ assert(xkb_state_mod_index_is_consumed(state, KEY_A + EVDEV_OFFSET, shift) > 0);
+
+ xkb_state_unref(state);
+
+ /* More complicated - CTRL+ALT */
+ state = xkb_state_new(keymap);
+ assert(state);
+
+ mask = xkb_state_key_get_consumed_mods(state, KEY_F1 + EVDEV_OFFSET);
+ assert(mask == ((1U << shift) | (1U << alt) | (1U << ctrl) | (1U << mod5)));
+
+ /* Shift is preserved. */
+ xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN);
+ mask = xkb_state_key_get_consumed_mods(state, KEY_F1 + EVDEV_OFFSET);
+ assert(mask == ((1U << alt) | (1U << ctrl) | (1U << mod5)));
+ xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_UP);
+
+ mask = xkb_state_key_get_consumed_mods(state, KEY_F1 + EVDEV_OFFSET);
+ assert(mask == ((1U << shift) | (1U << alt) | (1U << ctrl) | (1U << mod5)));
+
+ xkb_state_unref(state);
+
+ /* Test XKB_CONSUMED_MODE_GTK, CTRL+ALT */
+ state = xkb_state_new(keymap);
+ assert(state);
+
+ mask = xkb_state_key_get_consumed_mods2(state, KEY_F1 + EVDEV_OFFSET,
+ XKB_CONSUMED_MODE_GTK);
+ assert(mask == 0);
+
+ xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_DOWN);
+ mask = xkb_state_key_get_consumed_mods2(state, KEY_F1 + EVDEV_OFFSET,
+ XKB_CONSUMED_MODE_GTK);
+ assert(mask == 0);
+
+ xkb_state_update_key(state, KEY_LEFTALT + EVDEV_OFFSET, XKB_KEY_DOWN);
+ mask = xkb_state_key_get_consumed_mods2(state, KEY_F1 + EVDEV_OFFSET,
+ XKB_CONSUMED_MODE_GTK);
+ assert(mask == ((1U << alt) | (1U << ctrl)));
+
+ xkb_state_unref(state);
+
+ /* Test XKB_CONSUMED_MODE_GTK, Simple Shift */
+ state = xkb_state_new(keymap);
+ assert(state);
+
+ mask = xkb_state_key_get_consumed_mods2(state, KEY_A + EVDEV_OFFSET,
+ XKB_CONSUMED_MODE_GTK);
+ assert(mask == ((1U << shift) | (1U << caps)));
+
+ xkb_state_update_key(state, KEY_LEFTALT + EVDEV_OFFSET, XKB_KEY_DOWN);
+ mask = xkb_state_key_get_consumed_mods2(state, KEY_A + EVDEV_OFFSET,
+ XKB_CONSUMED_MODE_GTK);
+ assert(mask == ((1U << shift) | (1U << caps)));
+
+ xkb_state_unref(state);
+}
+
+static void
+key_iter(struct xkb_keymap *keymap, xkb_keycode_t key, void *data)
+{
+ xkb_keycode_t *counter = data;
+
+ assert(*counter == key);
+ (*counter)++;
+}
+
+static void
+test_range(struct xkb_keymap *keymap)
+{
+ xkb_keycode_t counter;
+
+ assert(xkb_keymap_min_keycode(keymap) == 9);
+ assert(xkb_keymap_max_keycode(keymap) == 253);
+
+ counter = xkb_keymap_min_keycode(keymap);
+ xkb_keymap_key_for_each(keymap, key_iter, &counter);
+ assert(counter == xkb_keymap_max_keycode(keymap) + 1);
+}
+
+static void
+test_caps_keysym_transformation(struct xkb_keymap *keymap)
+{
+ struct xkb_state *state = xkb_state_new(keymap);
+ xkb_mod_index_t caps, shift;
+ int nsyms;
+ xkb_keysym_t sym;
+ const xkb_keysym_t *syms;
+
+ assert(state);
+
+ /* See xkb_state_key_get_one_sym() for what's this all about. */
+
+ caps = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
+ shift = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
+ assert(caps != XKB_MOD_INVALID && shift != XKB_MOD_INVALID);
+
+ assert(xkb_state_key_get_layout(state, KEY_A + 8) == 0);
+ assert(xkb_state_key_get_layout(state, KEY_SEMICOLON + 8) == 0);
+
+ /* Without caps, no transformation. */
+ assert(xkb_state_mod_index_is_active(state, caps, XKB_STATE_MODS_EFFECTIVE) == 0);
+ assert(xkb_state_mod_index_is_active(state, shift, XKB_STATE_MODS_EFFECTIVE) == 0);
+ assert(xkb_state_key_get_level(state, KEY_A + 8, 0) == 0);
+ sym = xkb_state_key_get_one_sym(state, KEY_A + 8);
+ assert(sym == XKB_KEY_a);
+ assert(xkb_state_key_get_level(state, KEY_SEMICOLON + 8, 0) == 0);
+ sym = xkb_state_key_get_one_sym(state, KEY_SEMICOLON + 8);
+ assert(sym == XKB_KEY_eacute);
+ nsyms = xkb_state_key_get_syms(state, KEY_SEMICOLON + 8, &syms);
+ assert(nsyms == 1 && syms[0] == XKB_KEY_eacute);
+
+ /* With shift, no transformation (only different level). */
+ xkb_state_update_key(state, KEY_LEFTSHIFT + 8, XKB_KEY_DOWN);
+ assert(xkb_state_mod_index_is_active(state, caps, XKB_STATE_MODS_EFFECTIVE) == 0);
+ assert(xkb_state_mod_index_is_active(state, shift, XKB_STATE_MODS_EFFECTIVE) > 0);
+ assert(xkb_state_key_get_level(state, KEY_A + 8, 0) == 1);
+ sym = xkb_state_key_get_one_sym(state, KEY_A + 8);
+ assert(sym == XKB_KEY_A);
+ sym = xkb_state_key_get_one_sym(state, KEY_SEMICOLON + 8);
+ assert(sym == XKB_KEY_odiaeresis);
+ nsyms = xkb_state_key_get_syms(state, KEY_SEMICOLON + 8, &syms);
+ assert(nsyms == 1 && syms[0] == XKB_KEY_odiaeresis);
+ xkb_state_update_key(state, KEY_LEFTSHIFT + 8, XKB_KEY_UP);
+ assert(xkb_state_mod_index_is_active(state, shift, XKB_STATE_MODS_EFFECTIVE) == 0);
+
+ /* With caps, transform in same level, only with _get_one_sym(). */
+ xkb_state_update_key(state, KEY_CAPSLOCK + 8, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_CAPSLOCK + 8, XKB_KEY_UP);
+ assert(xkb_state_mod_index_is_active(state, caps, XKB_STATE_MODS_EFFECTIVE) > 0);
+ assert(xkb_state_mod_index_is_active(state, shift, XKB_STATE_MODS_EFFECTIVE) == 0);
+ assert(xkb_state_key_get_level(state, KEY_A + 8, 0) == 1);
+ sym = xkb_state_key_get_one_sym(state, KEY_A + 8);
+ assert(sym == XKB_KEY_A);
+ assert(xkb_state_key_get_level(state, KEY_SEMICOLON + 8, 0) == 0);
+ sym = xkb_state_key_get_one_sym(state, KEY_SEMICOLON + 8);
+ assert(sym == XKB_KEY_Eacute);
+ nsyms = xkb_state_key_get_syms(state, KEY_SEMICOLON + 8, &syms);
+ assert(nsyms == 1 && syms[0] == XKB_KEY_eacute);
+ xkb_state_update_key(state, KEY_LEFTSHIFT + 8, XKB_KEY_UP);
+ assert(xkb_state_mod_index_is_active(state, shift, XKB_STATE_MODS_EFFECTIVE) == 0);
+ xkb_state_update_key(state, KEY_CAPSLOCK + 8, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_CAPSLOCK + 8, XKB_KEY_UP);
+
+ xkb_state_unref(state);
+}
+
+static void
+test_get_utf8_utf32(struct xkb_keymap *keymap)
+{
+ char buf[256];
+ struct xkb_state *state = xkb_state_new(keymap);
+ assert(state);
+
+#define TEST_KEY(key, expected_utf8, expected_utf32) do { \
+ assert(xkb_state_key_get_utf8(state, key + 8, NULL, 0) == strlen(expected_utf8)); \
+ assert(xkb_state_key_get_utf8(state, key + 8, buf, sizeof(buf)) == strlen(expected_utf8)); \
+ assert(memcmp(buf, expected_utf8, sizeof(expected_utf8)) == 0); \
+ assert(xkb_state_key_get_utf32(state, key + 8) == expected_utf32); \
+} while (0)
+
+ /* Simple ASCII. */
+ TEST_KEY(KEY_A, "a", 0x61);
+ TEST_KEY(KEY_ESC, "\x1B", 0x1B);
+ TEST_KEY(KEY_1, "1", 0x31);
+
+ /* Invalid. */
+ TEST_KEY(XKB_KEYCODE_INVALID - 8, "", 0);
+ TEST_KEY(300, "", 0);
+
+ /* No string. */
+ TEST_KEY(KEY_LEFTCTRL, "", 0);
+ TEST_KEY(KEY_NUMLOCK, "", 0);
+
+ /* Multiple keysyms. */
+ TEST_KEY(KEY_6, "HELLO", 0);
+ TEST_KEY(KEY_7, "YES THIS IS DOG", 0);
+
+ /* Check truncation. */
+ memset(buf, 'X', sizeof(buf));
+ assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 0) == strlen("HELLO"));
+ assert(memcmp(buf, "X", 1) == 0);
+ assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 1) == strlen("HELLO"));
+ assert(memcmp(buf, "", 1) == 0);
+ assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 2) == strlen("HELLO"));
+ assert(memcmp(buf, "H", 2) == 0);
+ assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 3) == strlen("HELLO"));
+ assert(memcmp(buf, "HE", 3) == 0);
+ assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 5) == strlen("HELLO"));
+ assert(memcmp(buf, "HELL", 5) == 0);
+ assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 6) == strlen("HELLO"));
+ assert(memcmp(buf, "HELLO", 6) == 0);
+ assert(xkb_state_key_get_utf8(state, KEY_6 + 8, buf, 7) == strlen("HELLO"));
+ assert(memcmp(buf, "HELLO\0X", 7) == 0);
+
+ /* Switch to ru layout */
+ xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_UP);
+ assert(xkb_state_key_get_layout(state, KEY_A + 8) == 1);
+
+ /* Non ASCII. */
+ TEST_KEY(KEY_ESC, "\x1B", 0x1B);
+ TEST_KEY(KEY_A, "ф", 0x0444);
+ TEST_KEY(KEY_Z, "я", 0x044F);
+
+ /* Switch back to us layout */
+ xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_UP);
+ assert(xkb_state_key_get_layout(state, KEY_A + 8) == 0);
+
+ xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN);
+ TEST_KEY(KEY_A, "A", 0x41);
+ TEST_KEY(KEY_ESC, "\x1B", 0x1B);
+ TEST_KEY(KEY_1, "!", 0x21);
+ xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_UP);
+
+ TEST_KEY(KEY_6, "HELLO", 0);
+ TEST_KEY(KEY_7, "YES THIS IS DOG", 0);
+
+ xkb_state_unref(state);
+}
+
+static void
+test_ctrl_string_transformation(struct xkb_keymap *keymap)
+{
+ char buf[256];
+ struct xkb_state *state = xkb_state_new(keymap);
+ xkb_mod_index_t ctrl;
+
+ assert(state);
+
+ /* See xkb_state_key_get_utf8() for what's this all about. */
+
+ ctrl = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CTRL);
+ assert(ctrl != XKB_MOD_INVALID);
+
+ /* First without. */
+ TEST_KEY(KEY_A, "a", 0x61);
+ TEST_KEY(KEY_B, "b", 0x62);
+ TEST_KEY(KEY_C, "c", 0x63);
+ TEST_KEY(KEY_ESC, "\x1B", 0x1B);
+ TEST_KEY(KEY_1, "1", 0x31);
+
+ /* And with. */
+ xkb_state_update_key(state, KEY_RIGHTCTRL + EVDEV_OFFSET, XKB_KEY_DOWN);
+ assert(xkb_state_mod_index_is_active(state, ctrl, XKB_STATE_MODS_EFFECTIVE) > 0);
+ TEST_KEY(KEY_A, "\x01", 0x01);
+ TEST_KEY(KEY_B, "\x02", 0x02);
+ TEST_KEY(KEY_C, "\x03", 0x03);
+ TEST_KEY(KEY_ESC, "\x1B", 0x1B);
+ TEST_KEY(KEY_1, "1", 0x31);
+ xkb_state_update_key(state, KEY_RIGHTCTRL + EVDEV_OFFSET, XKB_KEY_UP);
+
+ /* Switch to ru layout */
+ xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_DOWN);
+ xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_UP);
+ assert(xkb_state_key_get_layout(state, KEY_A + 8) == 1);
+
+ /* Non ASCII. */
+ xkb_state_update_key(state, KEY_RIGHTCTRL + EVDEV_OFFSET, XKB_KEY_DOWN);
+ assert(xkb_state_mod_index_is_active(state, ctrl, XKB_STATE_MODS_EFFECTIVE) > 0);
+ TEST_KEY(KEY_A, "\x01", 0x01);
+ TEST_KEY(KEY_B, "\x02", 0x02);
+ xkb_state_update_key(state, KEY_RIGHTCTRL + EVDEV_OFFSET, XKB_KEY_UP);
+
+ xkb_state_unref(state);
+}
+
+int
+main(void)
+{
+ struct xkb_context *context = test_get_context(0);
+ struct xkb_keymap *keymap;
+
+ assert(context);
+
+ /* Make sure these are allowed. */
+ xkb_context_unref(NULL);
+ xkb_keymap_unref(NULL);
+ xkb_state_unref(NULL);
+
+ keymap = test_compile_rules(context, "evdev", "pc104", "us,ru", NULL, "grp:menu_toggle");
+ assert(keymap);
+
+ test_update_key(keymap);
+ test_serialisation(keymap);
+ test_update_mask_mods(keymap);
+ test_repeat(keymap);
+ test_consume(keymap);
+ test_range(keymap);
+ test_get_utf8_utf32(keymap);
+ test_ctrl_string_transformation(keymap);
+
+ xkb_keymap_unref(keymap);
+ keymap = test_compile_rules(context, "evdev", NULL, "ch", "fr", NULL);
+ assert(keymap);
+
+ test_caps_keysym_transformation(keymap);
+
+ xkb_keymap_unref(keymap);
+ xkb_context_unref(context);
+}
diff --git a/test/stringcomp.c b/test/stringcomp.c
new file mode 100644
index 0000000..0388404
--- /dev/null
+++ b/test/stringcomp.c
@@ -0,0 +1,107 @@
+/*
+ * Copyright © 2009 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 (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 <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "test.h"
+
+#define DATA_PATH "keymaps/stringcomp.data"
+
+int
+main(int argc, char *argv[])
+{
+ struct xkb_context *ctx = test_get_context(0);
+ struct xkb_keymap *keymap;
+ char *original, *dump, *dump2;
+
+ assert(ctx);
+
+ /* Load in a prebuilt keymap, make sure we can compile it from a string,
+ * then compare it to make sure we get the same result when dumping it
+ * to a string. */
+ original = test_read_file(DATA_PATH);
+ assert(original);
+
+ keymap = test_compile_string(ctx, original);
+ assert(keymap);
+
+ dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_USE_ORIGINAL_FORMAT);
+ assert(dump);
+
+ if (!streq(original, dump)) {
+ fprintf(stderr,
+ "round-trip test failed: dumped map differs from original\n");
+ fprintf(stderr, "path to original file: %s\n",
+ test_get_path(DATA_PATH));
+ fprintf(stderr, "length: dumped %lu, original %lu\n",
+ (unsigned long) strlen(dump),
+ (unsigned long) strlen(original));
+ fprintf(stderr, "dumped map:\n");
+ fprintf(stderr, "%s\n", dump);
+ fflush(stderr);
+ assert(0);
+ }
+
+ free(original);
+ free(dump);
+ xkb_keymap_unref(keymap);
+
+ /* Make sure we can't (falsely claim to) compile an empty string. */
+ keymap = test_compile_string(ctx, "");
+ assert(!keymap);
+
+ /* Make sure we can recompile our output for a normal keymap from rules. */
+ keymap = test_compile_rules(ctx, NULL, NULL,
+ "ru,ca,de,us", ",multix,neo,intl", NULL);
+ assert(keymap);
+ dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_USE_ORIGINAL_FORMAT);
+ assert(dump);
+ xkb_keymap_unref(keymap);
+ keymap = test_compile_string(ctx, dump);
+ assert(keymap);
+ /* Now test that the dump of the dump is equal to the dump! */
+ dump2 = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_USE_ORIGINAL_FORMAT);
+ assert(dump2);
+ assert(streq(dump, dump2));
+
+ /* Test response to invalid formats and flags. */
+ assert(!xkb_keymap_new_from_string(ctx, dump, 0, 0));
+ assert(!xkb_keymap_new_from_string(ctx, dump, -1, 0));
+ assert(!xkb_keymap_new_from_string(ctx, dump, XKB_KEYMAP_FORMAT_TEXT_V1+1, 0));
+ assert(!xkb_keymap_new_from_string(ctx, dump, XKB_KEYMAP_FORMAT_TEXT_V1, -1));
+ assert(!xkb_keymap_new_from_string(ctx, dump, XKB_KEYMAP_FORMAT_TEXT_V1, 1414));
+ assert(!xkb_keymap_get_as_string(keymap, 0));
+ assert(!xkb_keymap_get_as_string(keymap, 4893));
+
+ xkb_keymap_unref(keymap);
+ free(dump);
+ free(dump2);
+
+ xkb_context_unref(ctx);
+
+ return 0;
+}
diff --git a/test/symbols-leak-test.py b/test/symbols-leak-test.py
new file mode 100755
index 0000000..a395079
--- /dev/null
+++ b/test/symbols-leak-test.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python3
+"""Check that all exported symbols are specified in the symbol version scripts.
+
+If this fails, please update the appropriate .map file (adding new version
+nodes as needed).
+"""
+import os
+import pathlib
+import re
+import sys
+
+
+top_srcdir = pathlib.Path(os.environ['top_srcdir'])
+
+
+def symbols_from_map(path):
+ return re.findall(r'^\s+(xkb_.*);', path.read_text('utf-8'), re.MULTILINE)
+
+
+def symbols_from_src(path):
+ return re.findall(r'XKB_EXPORT.*\n(xkb_.*)\(', path.read_text('utf-8'))
+
+
+def diff(map_path, src_paths):
+ map_symbols = set(symbols_from_map(map_path))
+ src_symbols = set.union(set(), *(symbols_from_src(path) for path in src_paths))
+ return sorted(map_symbols - src_symbols), sorted(src_symbols - map_symbols)
+
+
+exit = 0
+
+# xkbcommon symbols
+left, right = diff(
+ top_srcdir/'xkbcommon.map',
+ [
+ *(top_srcdir/'src').glob('*.c'),
+ *(top_srcdir/'src'/'xkbcomp').glob('*.c'),
+ *(top_srcdir/'src'/'compose').glob('*.c'),
+ ],
+)
+if left:
+ print('xkbcommon map has extra symbols:', ' '.join(left))
+ exit = 1
+if right:
+ print('xkbcommon src has extra symbols:', ' '.join(right))
+ exit = 1
+
+# xkbcommon-x11 symbols
+left, right = diff(
+ top_srcdir/'xkbcommon-x11.map',
+ [
+ *(top_srcdir/'src'/'x11').glob('*.c'),
+ ],
+)
+if left:
+ print('xkbcommon-x11 map has extra symbols:', ' '.join(left))
+ exit = 1
+if right:
+ print('xkbcommon-x11 src has extra symbols:', ' '.join(right))
+ exit = 1
+
+sys.exit(exit)
diff --git a/test/test.h b/test/test.h
new file mode 100644
index 0000000..81ba49b
--- /dev/null
+++ b/test/test.h
@@ -0,0 +1,88 @@
+/*
+ * 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 <daniel@fooishbar.org>
+ */
+
+#include <assert.h>
+
+/* Don't use compat names in internal code. */
+#define _XKBCOMMON_COMPAT_H
+#include "xkbcommon/xkbcommon.h"
+#include "xkbcommon/xkbcommon-compose.h"
+#include "utils.h"
+
+/* Automake test exit code to signify SKIP (à la PASS, FAIL, etc). */
+#define SKIP_TEST 77
+
+/* The offset between KEY_* numbering, and keycodes in the XKB evdev
+ * dataset. */
+#define EVDEV_OFFSET 8
+
+enum key_seq_state {
+ DOWN,
+ REPEAT,
+ UP,
+ BOTH,
+ NEXT,
+ FINISH,
+};
+
+int
+test_key_seq(struct xkb_keymap *keymap, ...);
+
+int
+test_key_seq_va(struct xkb_keymap *keymap, va_list args);
+
+char *
+test_get_path(const char *path_rel);
+
+char *
+test_read_file(const char *path_rel);
+
+enum test_context_flags {
+ CONTEXT_NO_FLAG = 0,
+ CONTEXT_ALLOW_ENVIRONMENT_NAMES = (1 << 0),
+};
+
+struct xkb_context *
+test_get_context(enum test_context_flags flags);
+
+struct xkb_keymap *
+test_compile_file(struct xkb_context *context, const char *path_rel);
+
+struct xkb_keymap *
+test_compile_string(struct xkb_context *context, const char *string);
+
+struct xkb_keymap *
+test_compile_buffer(struct xkb_context *context, const char *buf, size_t len);
+
+struct xkb_keymap *
+test_compile_rules(struct xkb_context *context, const char *rules,
+ const char *model, const char *layout, const char *variant,
+ const char *options);
+
+
+#ifdef _MSC_VER
+#define setenv(varname, value, overwrite) _putenv_s((varname), (value))
+#define unsetenv(varname) _putenv_s(varname, "")
+#endif
diff --git a/test/tool-option-parsing.py b/test/tool-option-parsing.py
new file mode 100755
index 0000000..de638d1
--- /dev/null
+++ b/test/tool-option-parsing.py
@@ -0,0 +1,312 @@
+#!/usr/bin/env python3
+#
+# 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.
+
+import itertools
+import os
+import resource
+import sys
+import subprocess
+import logging
+import tempfile
+
+try:
+ import pytest
+except ImportError:
+ print('Failed to import pytest. Skipping.', file=sys.stderr)
+ sys.exit(77)
+
+
+top_builddir = os.environ['top_builddir']
+
+logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('test')
+logger.setLevel(logging.DEBUG)
+
+# Permutation of RMLVO that we use in multiple tests
+rmlvos = [list(x) for x in itertools.permutations(
+ ['--rules=evdev', '--model=pc104',
+ '--layout=fr', '--options=eurosign:5']
+)]
+
+
+def _disable_coredump():
+ resource.setrlimit(resource.RLIMIT_CORE, (0, 0))
+
+
+def run_command(args):
+ logger.debug('run command: {}'.format(' '.join(args)))
+
+ try:
+ p = subprocess.run(args, preexec_fn=_disable_coredump,
+ capture_output=True, text=True,
+ timeout=0.7)
+ return p.returncode, p.stdout, p.stderr
+ except subprocess.TimeoutExpired as e:
+ return 0, e.stdout, e.stderr
+
+
+class XkbcliTool:
+ xkbcli_tool = 'xkbcli'
+ subtool = None
+
+ def __init__(self, subtool=None):
+ self.tool_path = top_builddir
+ self.subtool = subtool
+
+ def run_command(self, args):
+ if self.subtool is not None:
+ tool = '{}-{}'.format(self.xkbcli_tool, self.subtool)
+ else:
+ tool = self.xkbcli_tool
+ args = [os.path.join(self.tool_path, tool)] + args
+
+ return run_command(args)
+
+ def run_command_success(self, args):
+ rc, stdout, stderr = self.run_command(args)
+ assert rc == 0, (stdout, stderr)
+ return stdout, stderr
+
+ def run_command_invalid(self, args):
+ rc, stdout, stderr = self.run_command(args)
+ assert rc == 2, (rc, stdout, stderr)
+ return rc, stdout, stderr
+
+ def run_command_unrecognized_option(self, args):
+ rc, stdout, stderr = self.run_command(args)
+ assert rc == 2, (rc, stdout, stderr)
+ assert stdout.startswith('Usage') or stdout == ''
+ assert 'unrecognized option' in stderr
+
+ def run_command_missing_arg(self, args):
+ rc, stdout, stderr = self.run_command(args)
+ assert rc == 2, (rc, stdout, stderr)
+ assert stdout.startswith('Usage') or stdout == ''
+ assert 'requires an argument' in stderr
+
+
+def get_tool(subtool=None):
+ return XkbcliTool(subtool)
+
+
+def get_all_tools():
+ return [get_tool(x) for x in [None, 'list',
+ 'compile-keymap',
+ 'how-to-type',
+ 'interactive-evdev',
+ 'interactive-wayland',
+ 'interactive-x11']]
+
+
+@pytest.fixture
+def xkbcli():
+ return get_tool()
+
+
+@pytest.fixture
+def xkbcli_list():
+ return get_tool('list')
+
+
+@pytest.fixture
+def xkbcli_how_to_type():
+ return get_tool('how-to-type')
+
+
+@pytest.fixture
+def xkbcli_compile_keymap():
+ return get_tool('compile-keymap')
+
+
+@pytest.fixture
+def xkbcli_interactive_evdev():
+ return get_tool('interactive-evdev')
+
+
+@pytest.fixture
+def xkbcli_interactive_x11():
+ return get_tool('interactive-x11')
+
+
+@pytest.fixture
+def xkbcli_interactive_wayland():
+ return get_tool('interactive-wayland')
+
+
+# --help is supported by all tools
+@pytest.mark.parametrize('tool', get_all_tools())
+def test_help(tool):
+ stdout, stderr = tool.run_command_success(['--help'])
+ assert stdout.startswith('Usage:')
+ assert stderr == ''
+
+
+# --foobar generates "Usage:" for all tools
+@pytest.mark.parametrize('tool', get_all_tools())
+def test_invalid_option(tool):
+ tool.run_command_unrecognized_option(['--foobar'])
+
+
+# xkbcli --version
+def test_xkbcli_version(xkbcli):
+ stdout, stderr = xkbcli.run_command_success(['--version'])
+ assert stdout.startswith('0')
+ assert stderr == ''
+
+
+def test_xkbcli_too_many_args(xkbcli):
+ xkbcli.run_command_invalid(['a'] * 64)
+
+
+@pytest.mark.parametrize('args', [['--verbose'],
+ ['--rmlvo'],
+ # ['--kccgst'],
+ ['--verbose', '--rmlvo'],
+ # ['--verbose', '--kccgst'],
+ ])
+def test_compile_keymap_args(xkbcli_compile_keymap, args):
+ xkbcli_compile_keymap.run_command_success(args)
+
+
+@pytest.mark.parametrize('rmlvos', rmlvos)
+def test_compile_keymap_rmlvo(xkbcli_compile_keymap, rmlvos):
+ xkbcli_compile_keymap.run_command_success(rmlvos)
+
+
+@pytest.mark.parametrize('args', [['--include', '.', '--include-defaults'],
+ ['--include', '/tmp', '--include-defaults'],
+ ])
+def test_compile_keymap_include(xkbcli_compile_keymap, args):
+ # Succeeds thanks to include-defaults
+ xkbcli_compile_keymap.run_command_success(args)
+
+
+def test_compile_keymap_include_invalid(xkbcli_compile_keymap):
+ # A non-directory is rejected by default
+ args = ['--include', '/proc/version']
+ rc, stdout, stderr = xkbcli_compile_keymap.run_command(args)
+ assert rc == 1, (stdout, stderr)
+ assert "There are no include paths to search" in stderr
+
+ # A non-existing directory is rejected by default
+ args = ['--include', '/tmp/does/not/exist']
+ rc, stdout, stderr = xkbcli_compile_keymap.run_command(args)
+ assert rc == 1, (stdout, stderr)
+ assert "There are no include paths to search" in stderr
+
+ # Valid dir, but missing files
+ args = ['--include', '/tmp']
+ rc, stdout, stderr = xkbcli_compile_keymap.run_command(args)
+ assert rc == 1, (stdout, stderr)
+ assert "Couldn't look up rules" in stderr
+
+
+# Unicode codepoint conversions, we support whatever strtol does
+@pytest.mark.parametrize('args', [['123'], ['0x123'], ['0123']])
+def test_how_to_type(xkbcli_how_to_type, args):
+ xkbcli_how_to_type.run_command_success(args)
+
+
+@pytest.mark.parametrize('rmlvos', rmlvos)
+def test_how_to_type_rmlvo(xkbcli_how_to_type, rmlvos):
+ args = rmlvos + ['0x1234']
+ xkbcli_how_to_type.run_command_success(args)
+
+
+@pytest.mark.parametrize('args', [['--verbose'],
+ ['-v'],
+ ['--verbose', '--load-exotic'],
+ ['--load-exotic'],
+ ['--ruleset=evdev'],
+ ['--ruleset=base'],
+ ])
+def test_list_rmlvo(xkbcli_list, args):
+ xkbcli_list.run_command_success(args)
+
+
+def test_list_rmlvo_includes(xkbcli_list):
+ args = ['/tmp/']
+ xkbcli_list.run_command_success(args)
+
+
+def test_list_rmlvo_includes_invalid(xkbcli_list):
+ args = ['/proc/version']
+ rc, stdout, stderr = xkbcli_list.run_command(args)
+ assert rc == 1
+ assert "Failed to append include path" in stderr
+
+
+def test_list_rmlvo_includes_no_defaults(xkbcli_list):
+ args = ['--skip-default-paths', '/tmp']
+ rc, stdout, stderr = xkbcli_list.run_command(args)
+ assert rc == 1
+ assert "Failed to parse XKB description" in stderr
+
+
+@pytest.mark.skipif(not os.path.exists('/dev/input/event0'), reason='event node required')
+@pytest.mark.skipif(not os.access('/dev/input/event0', os.R_OK), reason='insufficient permissions')
+@pytest.mark.parametrize('rmlvos', rmlvos)
+def test_interactive_evdev_rmlvo(xkbcli_interactive_evdev, rmlvos):
+ return
+ xkbcli_interactive_evdev.run_command_success(rmlvos)
+
+
+@pytest.mark.skipif(not os.path.exists('/dev/input/event0'),
+ reason='event node required')
+@pytest.mark.skipif(not os.access('/dev/input/event0', os.R_OK),
+ reason='insufficient permissions')
+@pytest.mark.parametrize('args', [['--report-state-changes'],
+ ['--enable-compose'],
+ ['--consumed-mode=xkb'],
+ ['--consumed-mode=gtk'],
+ ['--without-x11-offset'],
+ ])
+def test_interactive_evdev(xkbcli_interactive_evdev, args):
+ # Note: --enable-compose fails if $prefix doesn't have the compose tables
+ # installed
+ xkbcli_interactive_evdev.run_command_success(args)
+
+
+@pytest.mark.skipif(not os.getenv('DISPLAY'), reason='DISPLAY not set')
+def test_interactive_x11(xkbcli_interactive_x11):
+ # To be filled in if we handle something other than --help
+ pass
+
+
+@pytest.mark.skipif(not os.getenv('WAYLAND_DISPLAY'),
+ reason='WAYLAND_DISPLAY not set')
+def test_interactive_wayland(xkbcli_interactive_wayland):
+ # To be filled in if we handle something other than --help
+ pass
+
+
+if __name__ == '__main__':
+ with tempfile.TemporaryDirectory() as tmpdir:
+ # 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.
+ os.environ['XDG_CONFIG_HOME'] = tmpdir
+ # This needs to be separated if we do specific extra path testing
+ os.environ['XKB_CONFIG_EXTRA_PATH'] = tmpdir
+
+ sys.exit(pytest.main(args=[__file__]))
diff --git a/test/utf8.c b/test/utf8.c
new file mode 100644
index 0000000..214e356
--- /dev/null
+++ b/test/utf8.c
@@ -0,0 +1,185 @@
+/*
+ * Copyright © 2014 Ran Benita <ran234@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "config.h"
+
+#include <assert.h>
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <string.h>
+
+#include "utf8.h"
+#include "utils.h"
+
+#define VALID(lit) assert(is_valid_utf8(lit, sizeof(lit)-1))
+#define INVALID(lit) assert(!is_valid_utf8(lit, sizeof(lit)-1))
+
+static void
+test_is_valid_utf8(void)
+{
+ /*
+ * Mostly taken from:
+ * https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
+ */
+
+ VALID("ascii");
+ VALID("\xCE\xBA\xE1\xBD\xB9\xCF\x83\xCE\xBC\xCE\xB5");
+
+ VALID("");
+ VALID("\x00");
+ VALID("\x00\x00");
+
+ VALID("\x50");
+ VALID("\xC2\x80");
+ VALID("\xE0\xA0\x80");
+ VALID("\xF0\x90\x80\x80");
+
+ /* 5/6-byte continuations aren't allowed (unlike UTF-8-test). */
+ INVALID("\xF8\x88\x80\x80\x80");
+ INVALID("\xFC\x84\x80\x80\x80\x80");
+
+ VALID("\x7F");
+ VALID("\xDF\xBF");
+ VALID("\xEF\xBF\xBF");
+ /* VALID("\xF7\xBF\xBF\xBF"); */
+
+ /* 5/6-byte continuations aren't allowed (unlike UTF-8-test). */
+ INVALID("\xFB\xBF\xBF\xBF\xBF");
+ INVALID("\xFD\xBFxBF\xBF\xBF");
+
+ VALID("\xED\x9F\xBF");
+ VALID("\xEE\x80\x80");
+ VALID("\xEF\xBF\xBD");
+ VALID("\xF4\x8F\xBF\xBF");
+ /* VALID("\xF4\x90\x80\x80"); */
+
+ INVALID("\x80");
+ INVALID("\xBF");
+ INVALID("\x80\xBF");
+ INVALID("\x80\xBF\x80");
+ INVALID("\x80\xBF\x80\xBF");
+ INVALID("\x80\xBF\x80\xBF\x80");
+ INVALID("\x80\xBF\x80\xBF\x80\xBF");
+ INVALID("\x80\xBF\x80\xBF\x80\xBF\x80");
+ INVALID("\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F"
+ "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F"
+ "\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF"
+ "\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF");
+
+ INVALID("\xC0 \xC1 \xC2 \xC3 \xC4 \xC5 \xC6 \xC7 \xC8 \xC9 \xCA \xCB \xCC "
+ "\xCD \xCE \xCF "
+ "\xD0 \xD1 \xD2 \xD3 \xD4 \xD5 \xD6 \xD7 \xD8 \xD9 \xDA \xDB \xDD "
+ "\xDD \xDE \xDF ");
+ INVALID("\xF0 \xF1 \xF2 \xF3 \xF4 \xF5 \xF6 \xF7 ");
+ INVALID("\xF8 \xF9 \xFA \xFB ");
+ INVALID("\xFC \xFD ");
+
+ INVALID("\xC0");
+ INVALID("\xE0\x80");
+ INVALID("\xF0\x80\x80");
+ INVALID("\xF8\x80\x80\x80");
+ INVALID("\xFC\x80\x80\x80\x80");
+ INVALID("\xDF");
+ INVALID("\xEF\xBF");
+ INVALID("\xF7\xBF\xBF");
+ INVALID("\xFB\xBF\xBF\xBF");
+ INVALID("\xFD\xBF\xBF\xBF\xBF");
+
+ INVALID("\xC0\xE0\x80\xF0\x80\x80\xF8\x80\x80\x80\xFC\x80\x80\x80\x80"
+ "\xDF\xEF\xBF\xF7\xBF\xBF\xFB\xBF\xBF\xBF\xFD\xBF\xBF\xBF\xBF");
+
+ INVALID("\xFE");
+ INVALID("\xFF");
+ INVALID("\xFE\xFE\xFF\xFF");
+
+ INVALID("\xC0\xAF");
+ INVALID("\xE0\x80\xAF");
+ INVALID("\xF0\x80\x80\xAF");
+ INVALID("\xF8\x80\x80\x80\xAF");
+ INVALID("\xFC\x80\x80\x80\x80\xAF");
+
+ INVALID("\xC1\xBF");
+ INVALID("\xE0\x9F\xBF");
+ INVALID("\xF0\x8F\xBF\xBF");
+ INVALID("\xF8\x87\xBF\xBF\xBF");
+ INVALID("\xFC\x83\xBF\xBF\xBF\xBF");
+
+ INVALID("\xC0\x80");
+ INVALID("\xE0\x80\x80");
+ INVALID("\xF0\x80\x80\x80");
+ INVALID("\xF8\x80\x80\x80\x80");
+ INVALID("\xFC\x80\x80\x80\x80\x80");
+
+ INVALID("\xED\xA0\x80");
+ INVALID("\xED\xAD\xBF");
+ INVALID("\xED\xAE\x80");
+ INVALID("\xED\xAF\xBF");
+ INVALID("\xED\xB0\x80");
+ INVALID("\xED\xBE\x80");
+ INVALID("\xED\xBF\xBF");
+
+ INVALID("\xED\xA0\x80\xED\xB0\x80");
+ INVALID("\xED\xA0\x80\xED\xBF\xBF");
+ INVALID("\xED\xAD\xBF\xED\xB0\x80");
+ INVALID("\xED\xAD\xBF\xED\xBF\xBF");
+ INVALID("\xED\xAE\x80\xED\xB0\x80");
+ INVALID("\xED\xAE\x80\xED\xBF\xBF");
+ INVALID("\xED\xAF\xBF\xED\xB0\x80");
+ INVALID("\xED\xAF\xBF\xED\xBF\xBF");
+
+ /* INVALID("\xEF\xBF\xBE"); */
+ /* INVALID("\xEF\xBF\xBF"); */
+}
+
+static void
+check_utf32_to_utf8(uint32_t unichar, int expected_length, const char *expected) {
+ char buffer[7];
+ int length;
+
+ length = utf32_to_utf8(unichar, buffer);
+
+ assert(length == expected_length);
+ assert(streq(buffer, expected));
+}
+
+static void
+test_utf32_to_utf8(void)
+{
+ check_utf32_to_utf8(0x0, 2, "");
+ check_utf32_to_utf8(0x40, 2, "\x40");
+ check_utf32_to_utf8(0xA1, 3, "\xc2\xa1");
+ check_utf32_to_utf8(0x2701, 4, "\xe2\x9c\x81");
+ check_utf32_to_utf8(0x1f004, 5, "\xf0\x9f\x80\x84");
+ check_utf32_to_utf8(0x110000, 0, "");
+ check_utf32_to_utf8(0xffffffff, 0, "");
+}
+
+int
+main(void)
+{
+ test_is_valid_utf8();
+ test_utf32_to_utf8();
+
+ return 0;
+}
diff --git a/test/utils.c b/test/utils.c
new file mode 100644
index 0000000..052289e
--- /dev/null
+++ b/test/utils.c
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2019 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.
+ */
+
+#include "config.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "test.h"
+#include "utils.h"
+
+int
+main(void)
+{
+ char buffer[10];
+
+ assert(!snprintf_safe(buffer, 0, "foo"));
+ assert(!snprintf_safe(buffer, 1, "foo"));
+ assert(!snprintf_safe(buffer, 3, "foo"));
+
+ assert(snprintf_safe(buffer, 10, "foo"));
+ assert(streq(buffer, "foo"));
+
+ assert(!snprintf_safe(buffer, 10, "%s", "1234567890"));
+ assert(snprintf_safe(buffer, 10, "%s", "123456789"));
+
+ assert(streq_null("foo", "foo"));
+ assert(!streq_null("foobar", "foo"));
+ assert(!streq_null("foobar", NULL));
+ assert(!streq_null(NULL, "foobar"));
+ assert(streq_null(NULL, NULL));
+
+ return 0;
+}
diff --git a/test/x11.c b/test/x11.c
new file mode 100644
index 0000000..00f3a96
--- /dev/null
+++ b/test/x11.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright © 2013 Ran Benita <ran234@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "config.h"
+
+#include "test.h"
+#include "xkbcommon/xkbcommon-x11.h"
+
+int
+main(void)
+{
+ struct xkb_context *ctx = test_get_context(0);
+ xcb_connection_t *conn;
+ int ret;
+ int32_t device_id;
+ struct xkb_keymap *keymap;
+ struct xkb_state *state;
+ char *dump;
+ int exit_code = 0;
+
+ /*
+ * The next two steps depend on a running X server with XKB support.
+ * If it fails, it's not necessarily an actual problem with the code.
+ * So we don't want a FAIL here.
+ */
+ conn = xcb_connect(NULL, NULL);
+ if (!conn || xcb_connection_has_error(conn)) {
+ exit_code = SKIP_TEST;
+ goto err_conn;
+ }
+
+ ret = xkb_x11_setup_xkb_extension(conn,
+ XKB_X11_MIN_MAJOR_XKB_VERSION,
+ XKB_X11_MIN_MINOR_XKB_VERSION,
+ XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS,
+ NULL, NULL, NULL, NULL);
+ if (!ret) {
+ exit_code = SKIP_TEST;
+ goto err_conn;
+ }
+
+ device_id = xkb_x11_get_core_keyboard_device_id(conn);
+ assert(device_id != -1);
+
+ keymap = xkb_x11_keymap_new_from_device(ctx, conn, device_id,
+ XKB_KEYMAP_COMPILE_NO_FLAGS);
+ assert(keymap);
+
+ state = xkb_x11_state_new_from_device(keymap, conn, device_id);
+ assert(state);
+
+ dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_USE_ORIGINAL_FORMAT);
+ assert(dump);
+ fputs(dump, stdout);
+
+ /* TODO: Write some X11-specific tests. */
+
+ free(dump);
+ xkb_state_unref(state);
+ xkb_keymap_unref(keymap);
+err_conn:
+ xcb_disconnect(conn);
+ xkb_context_unref(ctx);
+
+ return exit_code;
+}
diff --git a/test/x11comp.c b/test/x11comp.c
new file mode 100644
index 0000000..5fd064b
--- /dev/null
+++ b/test/x11comp.c
@@ -0,0 +1,170 @@
+/*
+ * Copyright © 2014 Ran Benita <ran234@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <spawn.h>
+#include <unistd.h>
+#include <assert.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "test.h"
+#include "xkbcommon/xkbcommon-x11.h"
+
+int
+main(void)
+{
+ struct xkb_context *ctx = test_get_context(0);
+ struct xkb_keymap *keymap;
+ xcb_connection_t *conn;
+ int32_t device_id;
+ int ret, status;
+ char display[512];
+ char *xkb_path;
+ char *original, *dump;
+ char *envp[] = { NULL };
+ char *xvfb_argv[] = {
+ (char *) "Xvfb", display, NULL
+ };
+ pid_t xvfb_pid = 0;
+ char *xkbcomp_argv[] = {
+ (char *) "xkbcomp", (char *) "-I", NULL /* xkb_path */, display, NULL
+ };
+ pid_t xkbcomp_pid;
+
+ char *xhost = NULL;
+ int xdpy_current;
+ int xdpy_candidate;
+
+ /*
+ * What all of this mess does is:
+ * 1. Launch Xvfb on available DISPLAY.
+ * 2. Make an xcb connection to this display.
+ * 3. Launch xkbcomp to change the keymap of the new display (doing
+ * this programmatically is major work [which we may yet do some
+ * day for xkbcommon-x11] so we use xkbcomp for now).
+ * 4. Download the keymap back from the display using xkbcommon-x11.
+ * 5. Compare received keymap to the uploaded keymap.
+ * 6. Kill the server & clean up.
+ */
+
+ ret = xcb_parse_display(NULL, &xhost, &xdpy_current, NULL);
+ assert(ret != 0);
+ /*
+ * IANA assigns TCP port numbers from 6000 through 6063 to X11
+ * clients. In addition, the current XCB implementaion shows
+ * that, when an X11 client tries to establish a TCP connetion,
+ * the port number needed is specified by adding 6000 to a given
+ * display number. So, one of reasonable ranges of xdpy_candidate
+ * is [0, 63].
+ */
+ for (xdpy_candidate = 63; xdpy_candidate >= 0; xdpy_candidate--) {
+ if (xdpy_candidate == xdpy_current) {
+ continue;
+ }
+ snprintf(display, sizeof(display), "%s:%d", xhost, xdpy_candidate);
+ ret = posix_spawnp(&xvfb_pid, "Xvfb", NULL, NULL, xvfb_argv, envp);
+ if (ret == 0) {
+ break;
+ }
+ }
+ free(xhost);
+ if (ret != 0) {
+ ret = SKIP_TEST;
+ goto err_ctx;
+ }
+
+ /* Wait for Xvfb fully waking up to accept a connection from a client. */
+ sleep(1);
+
+ conn = xcb_connect(display, NULL);
+ if (xcb_connection_has_error(conn)) {
+ ret = SKIP_TEST;
+ goto err_xvfd;
+ }
+ ret = xkb_x11_setup_xkb_extension(conn,
+ XKB_X11_MIN_MAJOR_XKB_VERSION,
+ XKB_X11_MIN_MINOR_XKB_VERSION,
+ XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS,
+ NULL, NULL, NULL, NULL);
+ if (!ret) {
+ ret = SKIP_TEST;
+ goto err_xcb;
+ }
+ device_id = xkb_x11_get_core_keyboard_device_id(conn);
+ assert(device_id != -1);
+
+ xkb_path = test_get_path("keymaps/host.xkb");
+ assert(ret >= 0);
+ xkbcomp_argv[2] = xkb_path;
+ ret = posix_spawnp(&xkbcomp_pid, "xkbcomp", NULL, NULL, xkbcomp_argv, envp);
+ free(xkb_path);
+ if (ret != 0) {
+ ret = SKIP_TEST;
+ goto err_xcb;
+ }
+ ret = waitpid(xkbcomp_pid, &status, 0);
+ if (ret < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) {
+ ret = SKIP_TEST;
+ goto err_xcb;
+ }
+
+ keymap = xkb_x11_keymap_new_from_device(ctx, conn, device_id,
+ XKB_KEYMAP_COMPILE_NO_FLAGS);
+ assert(keymap);
+
+ original = test_read_file("keymaps/host.xkb");
+ assert(original);
+
+ dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_USE_ORIGINAL_FORMAT);
+ assert(dump);
+
+ if (!streq(original, dump)) {
+ fprintf(stderr,
+ "round-trip test failed: dumped map differs from original\n");
+ fprintf(stderr, "length: dumped %lu, original %lu\n",
+ (unsigned long) strlen(dump),
+ (unsigned long) strlen(original));
+ fprintf(stderr, "dumped map:\n");
+ fprintf(stderr, "%s\n", dump);
+ ret = 1;
+ goto err_dump;
+ }
+
+ ret = 0;
+err_dump:
+ free(original);
+ free(dump);
+ xkb_keymap_unref(keymap);
+err_xcb:
+ xcb_disconnect(conn);
+err_xvfd:
+ if (xvfb_pid > 0)
+ kill(xvfb_pid, SIGTERM);
+err_ctx:
+ xkb_context_unref(ctx);
+ return ret;
+}
diff --git a/test/xkeyboard-config-test.py.in b/test/xkeyboard-config-test.py.in
new file mode 100755
index 0000000..ed37d7e
--- /dev/null
+++ b/test/xkeyboard-config-test.py.in
@@ -0,0 +1,199 @@
+#!/usr/bin/env python3
+import argparse
+import sys
+import subprocess
+import os
+import io
+import xml.etree.ElementTree as ET
+from multiprocessing import Pool
+
+
+verbose = True
+
+DEFAULT_RULES_XML = '@XKB_CONFIG_ROOT@/rules/evdev.xml'
+
+# Meson needs to fill this in so we can call the tool in the buildir.
+EXTRA_PATH = '@MESON_BUILD_ROOT@'
+os.environ['PATH'] = ':'.join([EXTRA_PATH, os.getenv('PATH')])
+
+
+def noop_progress_bar(x, total):
+ return x
+
+
+# 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
+
+ verbose = False
+ except ImportError:
+ pass
+
+
+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)
+ args = [
+ 'xkbcli-compile-keymap', # this is run in the builddir
+ '--rules', r,
+ '--model', m,
+ '--layout', l,
+ ]
+ if v is not None:
+ args += ['--variant', v]
+ if o is not None:
+ args += ['--options', o]
+
+ success = True
+ out = io.StringIO()
+ if verbose:
+ print(':: {}'.format(' '.join(args)), file=out)
+
+ try:
+ output = subprocess.check_output(args, stderr=subprocess.STDOUT,
+ universal_newlines=True)
+ if verbose:
+ print(output, file=out)
+ 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()
+ except KeyboardInterrupt:
+ pass
+
+
+def xkbcomp(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)
+ 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()
+ except KeyboardInterrupt:
+ pass
+
+
+def parse(path):
+ root = ET.fromstring(open(path).read())
+ layouts = root.findall('layoutList/layout')
+
+ options = [
+ e.text
+ for e in root.findall('optionList/group/option/configItem/name')
+ ]
+
+ combos = []
+ for l in layouts:
+ layout = l.find('configItem/name').text
+ combos.append({'l': layout})
+
+ variants = l.findall('variantList/variant')
+ for v in variants:
+ variant = v.find('configItem/name').text
+
+ combos.append({'l': layout, 'v': variant})
+ for option in options:
+ combos.append({'l': layout, 'v': variant, 'o': option})
+
+ return combos
+
+
+def run(combos, tool, njobs):
+ failed = False
+ with Pool(njobs) as p:
+ results = p.imap_unordered(tool, combos)
+ for success, output in progress_bar(results, total=len(combos)):
+ if not success:
+ failed = True
+ if output:
+ print(output, file=sys.stdout if success else sys.stderr)
+ return failed
+
+
+def main(args):
+ tools = {
+ 'libxkbcommon': xkbcommontool,
+ 'xkbcomp': xkbcomp,
+ }
+
+ parser = argparse.ArgumentParser(
+ description='Tool to test all layout/variant/option combinations.'
+ )
+ parser.add_argument('path', metavar='/path/to/evdev.xml',
+ nargs='?', type=str,
+ default=DEFAULT_RULES_XML,
+ help='Path to xkeyboard-config\'s evdev.xml')
+ parser.add_argument('--tool', choices=tools.keys(),
+ type=str, default='libxkbcommon',
+ help='parsing tool to use')
+ parser.add_argument('--jobs', '-j', type=int,
+ default=os.cpu_count() * 4,
+ help='number of processes to use')
+ args = parser.parse_args()
+
+ tool = tools[args.tool]
+
+ combos = parse(args.path)
+ failed = run(combos, tool, args.jobs)
+ sys.exit(failed)
+
+
+if __name__ == '__main__':
+ try:
+ main(sys.argv)
+ except KeyboardInterrupt:
+ print('Exiting after Ctrl+C')