diff options
| author | Haibo Huang <hhb@google.com> | 2020-09-08 17:10:03 -0700 |
|---|---|---|
| committer | Haibo Huang <hhb@google.com> | 2020-09-10 22:20:42 +0000 |
| commit | bffa8499cb8ce3cc4366055be8fe62d501d6a8e5 (patch) | |
| tree | 648dfaada5799a6227dd5f1af43d89ed8d71d96d /test | |
| parent | e4e474780d90ed6166f7113a7464371baa275007 (diff) | |
| download | platform_external_libxkbcommon-master.tar.gz platform_external_libxkbcommon-master.tar.bz2 platform_external_libxkbcommon-master.zip | |
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')
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', 'ä (ä)' (+<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') |
