From b001c910e21f9ce61400ce6f276f69d026b063ce Mon Sep 17 00:00:00 2001 From: Florian Fleissner Date: Mon, 11 Nov 2019 18:49:31 +0100 Subject: [PATCH] Implemented host_keymaps host_keymaps enable defining keymaps in a natural fashion. Instead of using Key constants like Key_A or LSHIFT(Key_A) it allows to conveniently write "a" or "A". The mappings between ascii and unicode characters to USB-HID keys works by reverse engineering the host keymaps of a linux system. The information of the provided keymap files allows for precisely figuring out the Kaleidoscope-Key that is needed to generate a specific utf8 character in a given keymap. For non-unicode keycodes, the linux XKB-keysym name is mapped to a Kaleidoscope-Key. The newly introduced host_keymap system is easily extensible and allows users to define their own non-english keymaps, if necessary by extending an existing keymap. Signed-off-by: Florian Fleissner --- doc/host-keymaps.md | 199 ++ examples/Keystrokes/HostKeymap/HostKeymap.ino | 123 ++ src/kaleidoscope/host_keymap/README | 1 + src/kaleidoscope/host_keymap/ascii.h | 96 + src/kaleidoscope/host_keymap/host_keymap.h | 280 +++ src/kaleidoscope/host_keymap/linux.h | 37 + .../host_keymap/linux/de/standard/keymap.h | 596 ++++++ .../host_keymap/linux/us/standard/keymap.h | 439 +++++ src/kaleidoscope/host_keymap/non_printable.h | 29 + .../host_keymap/test/host_keymap_test.h | 82 + src/kaleidoscope/host_keymap/unicode.h | 160 ++ .../xkbcommon_keysyms_non_printable.h | 846 +++++++++ .../host_keymap/xkbcommon_keysyms_printable.h | 1607 +++++++++++++++++ 13 files changed, 4495 insertions(+) create mode 100644 doc/host-keymaps.md create mode 100644 examples/Keystrokes/HostKeymap/HostKeymap.ino create mode 100644 src/kaleidoscope/host_keymap/README create mode 100644 src/kaleidoscope/host_keymap/ascii.h create mode 100644 src/kaleidoscope/host_keymap/host_keymap.h create mode 100644 src/kaleidoscope/host_keymap/linux.h create mode 100644 src/kaleidoscope/host_keymap/linux/de/standard/keymap.h create mode 100644 src/kaleidoscope/host_keymap/linux/us/standard/keymap.h create mode 100644 src/kaleidoscope/host_keymap/non_printable.h create mode 100644 src/kaleidoscope/host_keymap/test/host_keymap_test.h create mode 100644 src/kaleidoscope/host_keymap/unicode.h create mode 100644 src/kaleidoscope/host_keymap/xkbcommon_keysyms_non_printable.h create mode 100644 src/kaleidoscope/host_keymap/xkbcommon_keysyms_printable.h diff --git a/doc/host-keymaps.md b/doc/host-keymaps.md new file mode 100644 index 0000000000..2002360944 --- /dev/null +++ b/doc/host-keymaps.md @@ -0,0 +1,199 @@ +# Kaleidoscope's host keymap system + +The host_keymap system enables specifying keymaps in a natural fashion +by using characters or character strings instead of Kaleidoscope's C++ `Key_...` constants. Furthermore, it allows to select one or more host keymaps and automagically use their mappings from unicode keys to Kaleidoscope's key constants. + +## Usage + +To use host keymaps you must include on or more keymap specification +headers at the top of the firmware sketch, e.g. + +```cpp +#include "kaleidoscope/host_keymap/linux/us/standard/keymap.h" +``` + +Next, you must make the newly host keymap available at global scope, somewhere +before you specify the keymap. This is done by invoking macro `USE_HOST_KEYMAP`, e.g. as + +```cpp +USE_HOST_KEYMAP(linux, us, standard) +``` + +This declares the us standard keymap as the default host keymap. Any characters (unicode/ascii string literals) that you define in the +`KEYMAP` definition will be interpreted with respect to this +default host keymap. + +You can now use key characters like e.g. "a" instead of Key_A in you +keymap definitions. + +```cpp +KEYMAPS( +[0] = KEYMAP_STACKED +( +XXX, L"a", L"b", ... +) +) +``` + +## C++ char and wchar_t strings + +Please note the prefix L in the above KEYMAP definition in front of the letter strings. That prefix tells C++ that the character string literals +is to be interpreted as wide character string (possibly a unicode string). You can omit the prefix L for ASCII characters only. + +## Key mapping agnostic KEYMAP formulation + +The great advantage of host keymaps is that you do not have to consider +the question what Kaleidoscope Key to generate in order for a specific +keycode to be generated on the host. + +Let's look at the german standard keymap for an example why this is usefull. + +The german language has some special non-ascii characters, called +umlauts, those are ä, ö, ü and ß. Those are placed in different places +of the keymap, partially on keys where on the us english keymap there are +special characters. + +By using Kaleidoscope's Key constants, it is pretty difficult to +define a german keymap as one has first to find out, which Key constant +generates which of the Umlauts. But that's not all. Some of the +characters are in different places, compared to the us english standard layout. + +With Kaleidoscope's host keymaps, this is now a simple task. Just +include the german keymap and use the german characters (normal characters, umlauts and symbols) in your keymap. Under the hood +Kaleidoscope will take care to generate the appropriate keycodes +for the correct german characters to be generated when the german +keyboard layout is active on the host. + +## Specifying individual characters + +Individual characters can be directly specified in the keymap as "a", "+", ... + +## Case specific version of alphabetical characters + +For alphabetical characters the shift modifier +is automatcially added when upper case letters like "A" are used +in the KEYMAP. + +## Adding modifiers to keys + +To conveniently add modifiers, you can specify strings like "c+a" which +will be interpreted as ctrl+a and will generate LCTRL(Key_A). + +Similar to the c-modifier for the control key, there are several more +modifier keys, such as + +s: shift +c: control +a: alt +m: meta +g: gui + +You can add several modifiers at once. "s+c+a" is equal +to LSHIFT(LCTRL(Key_A)). + +## Left and right hand modifier versions + +For some modifiers there are left and right hand versions. By default, +the left hand version will be used. For those characters that support +a right hand version (e.g. alt), use the capital modifier character "A" +instead. + +## Special keys for non printable actions + +Every standard keyboard has special keys that triggers special characters, like line feed +being emitted or other actions that are represented by non-printable +characters (e.g. print screen). + +For some of these characters, Kaleidoscope supplies the unicode +symbols that are printed on common keyboards. Have a look in +header `kaleidoscope/host_keymap/unicode.h`. + +## Toggling hand keys + +Kaleidoscope does not only allow for modifiers to be added +to keys in the keymap like `LCTRL(Key_A)` but also to assign the +modifier key itself to a key in the keymap, like e.g. `Key_LeftShift`. + +In header `kaleidoscope/host_keymap/unicode.h` there are unicode +symbols for all modifiers defined, like e.g. '⌃' for control, '⇧' for shift, and so on. Those unicode symbols generated the left hand version +of each modifier. To generate a right hand version, just prefix the +modifier symbol with the character 'r' when used in the KEYMAP, e.g. +like L"r+⇧" to generate `Key_RightShift` instead. + +## Separator characters + +The characters " ", "\t" and "+" are considered as separators and are +ignored unless being the last character in a sequence (the key-character). The specifications "c + a", "ca" and "c a" are thus equal +and all generate `LCTRL(Key_A)`. + +## Modifier key symbols + +To make things a little more convenient, there are unicode versions of modifier keys as well + +⇧: shift +⌃: control +⌥: alt +⌘: meta +⌘: gui + +You can use them e.g. as L"⌥+a" to define a key that equals LALT(Key_A). + +Important: Always prefix with L if any non ASCII characters are involved. + +## Escaping separators + +If one of the separator keys (' ', '\t' and '+') is meant to be output, +it must be escaped by prefixing a "#". This means that "c+# " will generate LCTRL(Key_Spacebar). +The escape character "#" itself must also be escaped. "c+##" will +generate LCTRL(LSHIFT(Key_3)) (in case the us standard host keymap being +the default keymap). + +## Adding new keymaps + +Alternative keymaps can be easily defined by using the +HOST_KEYMAP_LINUX macro that is defined in +`kaleidoscope/host_keymap/linux.h`. +See the `keymap.h` headers in the subdirectories of `kaleidoscope/host_keymap/linux` for examples how this might look. + +## Using more than one host keymap in the same Kaleidoscope KEYMAP + +Use the macro MAP_WITH_HOST_KEYMAP to define convenience macros +that help to work with different keymaps in the same sketch, like e.g. + +```cpp +#include "kaleidoscope/host_keymap/linux/us/standard/keymap.h" +#include "kaleidoscope/host_keymap/linux/de/standard/keymap.h" + +// Important, only supply strings with normal double quotes to macros +// D and U. They will automatically treated as wide characters strings. +// +#define D(KEY_STRING) MAP_WITH_HOST_KEYMAP(linux, de, standard, L##KEY_STRING) +#define U(KEY_STRING) MAP_WITH_HOST_KEYMAP(linux, us, standard, L##KEY_STRING) + +// Note: Characters 'z' and 'y' are swapped on a german keyboard in comparison +// to an us standard keyboard. +// +static_assert(D("z") == U("y"), ""); +static_assert(D("y") == U("z"), ""); + +KEYMAPS( + [0] = KEYMAP_STACKED + ( + XXX, "1", "2", "3", "4", "5", XXX, + "`", "q", "w", "e", "r", "t", "\t", + L"⇞", "a", D("z"), U("d"), "f", "g", + L"⇟", "z", "x", "c", "v", "b", L"⎋", + + L"⌃", L"⌫", L"⌘", L"⇧", + XXX, + + XXX, "6", "7", "8", "9", "0", XXX, + L"⎆", "y", "u", "i", "o", "p", "=", + "h", "j", "k", "l", ";", "\"", + XXX, "n", "m", ",", ".", "/", "-", + + L"r⇧", L"r⌥", L"␣", L"r⌃", + XXX + ) +) +``` diff --git a/examples/Keystrokes/HostKeymap/HostKeymap.ino b/examples/Keystrokes/HostKeymap/HostKeymap.ino new file mode 100644 index 0000000000..4b5d11ce6e --- /dev/null +++ b/examples/Keystrokes/HostKeymap/HostKeymap.ino @@ -0,0 +1,123 @@ +/* -*- mode: c++ -*- + * Kaleidoscope-Unicode -- Unicode input helpers + * Copyright (C) 2016, 2017, 2018 Keyboard.io, Inc + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +// This example demonstrates how different host keymaps can conveniently be used +// in one firmware. The example assumes that the host system supports layout +// switching between US english standard layout and german standard layout. +// +// We define dedicated keymap layers for both host keymaps and define +// a key (defined as llg below) that locks the german keymap layer. +// +// Once the layers are changed on the keyboard, the host keymap must be +// changed as well for the changes to take effect. + +#include + +#include "kaleidoscope/host_keymap/linux/us/standard/keymap.h" +#include "kaleidoscope/host_keymap/linux/de/standard/keymap.h" + +// Define the us standard keymap as default. +// +USE_HOST_KEYMAP(linux, us, standard) + +// Note: All unicode character strings like e.g. L"⌫" or L"ß" require to +// be prefixed with an L to make C++ store them as wide characters. + +enum Layers { + US, + German +}; + +// *INDENT-OFF* + +constexpr Key llg = LockLayer(German); + +START_KEYMAPS + [US] = KEYMAP_STACKED + ( + XXX, "1", "2", "3", "4", "5", XXX, + "`", "q", "w", "e", "r", "t", "\t", + L"⇞", "a", "s", "d", "f", "g", + L"⇟", "z", "x", "c", "v", "b", L"⎋", + + L"⌃", L"⌫", L"⌘", L"⇧", + XXX, + + XXX, "6", "7", "8", "9", "0", XXX, + L"⎆", "y", "u", "i", "o", "p", "=", + "h", "j", "k", "l", ";", "\"", + XXX, "n", "m", ",", ".", "/", "-", + + llg, L"r⌥", L"␣", L"r⌃", + XXX + ), + + // Reset the standard keymap to german + // + #undef CONVERT_TO_KEY + #define CONVERT_TO_KEY(INPUT) MAP_WITH_HOST_KEYMAP(linux, de, standard, INPUT) + + [German] = KEYMAP_STACKED + ( + XXX, "1", "2", "3", "4", "5", XXX, + XXX, "q", "w", "e", "r", "t", "\t", // The backtick key does not exist on the german keyboard + L"⇞", "a", "s", "d", "f", "g", + L"⇟", "y", "x", "c", "v", "b", L"⎋", + + L"⌃", L"⌫", L"⌘", L"⇧", + XXX, + + XXX, "6", "7", "8", "9", "0", L"ß", + L"⎆", "z", "u", "i", "o", "p", L"ü", + "h", "j", "k", "l", L"ö", L"ä", + XXX, "n", "m", ",", ".", "-", XXX, + + ___, L"r⌥", L"␣", L"r⌃", + XXX + ) +END_KEYMAPS +// *INDENT-ON* + +void setup() { + Kaleidoscope.setup(); +} + +void loop() { + Kaleidoscope.loop(); +} + +// The following is just a test (not necessary to define a keymap). +// +// An auxiliary macro D is used to define keys of the german (de) +// keymap. +// +#define D(KEY_STRING) MAP_WITH_HOST_KEYMAP(linux, de, standard, L##KEY_STRING) + +// For testing purposes, we define an auxiliary macro for the US keymap as +// well. +// +#define U(KEY_STRING) MAP_WITH_HOST_KEYMAP(linux, us, standard, L##KEY_STRING) + +// The y and z keys of the german keymap exchange change positions with +// repect to the US keymap. +// +static_assert(D("y") == U("z"), "The letter y on the german keymap must " + "generate the same Kaleidoscope Key value as the letter z on the US " + "keymap"); +static_assert(D("z") == U("y"), "The letter z on the german keymap must " + "generate the same Kaleidoscope Key value as the letter y on the US " + "keymap"); diff --git a/src/kaleidoscope/host_keymap/README b/src/kaleidoscope/host_keymap/README new file mode 100644 index 0000000000..0a4efb4103 --- /dev/null +++ b/src/kaleidoscope/host_keymap/README @@ -0,0 +1 @@ +The linux keymaps were generated on an Ubuntu 19.04 system based on XKeyboardConfig 2.23. diff --git a/src/kaleidoscope/host_keymap/ascii.h b/src/kaleidoscope/host_keymap/ascii.h new file mode 100644 index 0000000000..b18af2a086 --- /dev/null +++ b/src/kaleidoscope/host_keymap/ascii.h @@ -0,0 +1,96 @@ +/* Kaleidoscope - Firmware for computer input devices + * Copyright (C) 2013-2018 Keyboard.io, Inc. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +#include "kaleidoscope/host_keymap/host_keymap.h" + +namespace kaleidoscope { +namespace host_keymap { +namespace ascii { + +struct CharProcessor { + static constexpr bool isEscapeChar(char c) { + return c == '#'; + } + + static constexpr bool isSeparator(char c) { + return (c == ' ') + || (c == '\t') + || (c == '+'); + } + + static constexpr bool isMirrorChar(char c) { + return c == 'r'; + } +}; + +#define _HOST_KEYMAP_CAST_ON_MODIFIERS_ASCII(OP) \ + OP('s', LSHIFT(k)) \ + OP('S', LSHIFT(k)) \ + OP('c', LCTRL(k)) \ + OP('C', LCTRL(k)) \ + OP('a', LALT(k)) \ + OP('A', RALT(k)) \ + OP('m', LGUI(k)) \ + OP('M', LGUI(k)) \ + OP('g', LGUI(k)) \ + OP('G', LGUI(k)) + +// Define a AsciiConverterBase template base class that any ascii keymap converters +// are derived from by means of invoking the HOST_KEYMAP_ASCII_LANGUAGE_CONVERTER +// function macro. +// +_HOST_KEYMAP_DEFINE_CHAR_CONVERTER( + ConverterBase, char, _HOST_KEYMAP_CAST_ON_MODIFIERS_ASCII) + +#undef _HOST_KEYMAP_CAST_ON_MODIFIERS_ASCII + +typedef _CharParsingStandardFallback CharParsingStandardFallback; + +} // namespace ascii +} // namespace host_keymap +} // namespace kaleidoscope + +#define HOST_KEYMAP_ASCII_CONVERTER(LANGUAGE_KEYMAP, CHAR_PARSING_FALLBACK) \ + struct AsciiConverter \ + : public ascii::ConverterBase \ + { \ + typedef ascii::ConverterBase Parent; \ + \ + using typename Parent::StringMemberType; \ + using typename Parent::CharType; \ + \ + static constexpr bool isKeyChar(char c) { \ + return LANGUAGE_KEYMAP(_HOST_KEYMAP_IS_KEY_CHAR) \ + CHAR_PARSING_FALLBACK::isKeyChar(c); \ + } \ + \ + static constexpr Key charToKey(char c) { \ + return LANGUAGE_KEYMAP( \ + _HOST_KEYMAP_MAP_KEY_CHAR_TO_KALEIDOSCOPE_KEY \ + ) \ + CHAR_PARSING_FALLBACK::charToKey(c); \ + } \ + }; \ + \ + constexpr Key convertToKey(char c) { \ + return AsciiConverter::convertToKey(c); \ + } \ + template \ + constexpr Key convertToKey(char const(&string) [_Size]) { \ + return AsciiConverter::convertToKey(string); \ + } diff --git a/src/kaleidoscope/host_keymap/host_keymap.h b/src/kaleidoscope/host_keymap/host_keymap.h new file mode 100644 index 0000000000..f0420b7fc8 --- /dev/null +++ b/src/kaleidoscope/host_keymap/host_keymap.h @@ -0,0 +1,280 @@ +/* Kaleidoscope - Firmware for computer input devices + * Copyright (C) 2013-2018 Keyboard.io, Inc. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +#include "kaleidoscope/key_defs.h" +#include "kaleidoscope/key_defs_keyboard.h" +#include "kaleidoscope/host_keymap/xkbcommon_keysyms_printable.h" +#include "kaleidoscope/host_keymap/xkbcommon_keysyms_non_printable.h" + +//############################################################################## + +// Use the USE_HOST_KEYMAP macro in you sketch to make a host_keymap available. +// +#define USE_HOST_KEYMAP(SYSTEM, LAYOUT, VARIANT) \ + namespace kaleidoscope { \ + \ + template \ + constexpr Key convertToKey(const _T &t) { \ + return kaleidoscope::host_keymap::SYSTEM::LAYOUT::VARIANT \ + ::convertToKey(t); \ + } \ + } \ + using namespace kaleidoscope::host_keymap::SYSTEM; + +// Use the following macro e.g. to define convenience macros that help +// to work with different keymaps in the same sketch. +// +#define MAP_WITH_HOST_KEYMAP(SYSTEM, LAYOUT, VARIANT, ...) \ + kaleidoscope::host_keymap::SYSTEM::LAYOUT::VARIANT \ + ::convertToKey(__VA_ARGS__) + +namespace kaleidoscope { +namespace host_keymap { + +// A helper class for compile time keymap string parsing. +// +template +class StringMember { + public: + + typedef _CharType CharType; + typedef _CharProcessor CharProcessor; + typedef StringMember<_CharType, _CharProcessor> ThisType; + + template< unsigned _Size > + constexpr StringMember(const _CharType(&string)[_Size], int pos = 0) + : string_{string}, + size_{_Size - 1}, + pos_{pos} { + static_assert(_Size >= 1, "Not a string literal"); + } + + constexpr StringMember(const _CharType * const string, int size, int pos) + : string_{string}, + size_{size}, + pos_{pos} + {} + + constexpr _CharType toChar() const { + return string_[pos_]; + } + constexpr bool isValid() const { + return pos_ < size_; + } + constexpr ThisType next() const { + return ThisType{string_, size_, pos_ + 1}; + } + constexpr bool is(_CharType c) { + return string_[pos_] == c; + } + constexpr int length() const { + return size_; + } + + constexpr bool isEscapeChar() const { + return CharProcessor::isEscapeChar(string_[pos_]); + } + + constexpr bool isSeparator() const { + return CharProcessor::isSeparator(string_[pos_]); + } + + constexpr bool isMirrorChar() const { + return CharProcessor::isMirrorChar(string_[pos_]); + } + + constexpr bool isPanultimate() const { + return (pos_ + 2) == size_; + } + constexpr bool onlySeparatorsFollow() const { + return this->isValid() + ? (this->isSeparator() && this->next().onlySeparatorsFollow()) + : true; + } + constexpr bool isLast() const { + return (pos_ + 1) == size_; + } + constexpr bool isLastNonSeparator() const { + return this->isValid() && this->next().onlySeparatorsFollow(); + } + + private: + + const _CharType *const string_; + int size_; + int pos_; +}; + +#define _IS_MOD(TYPE, HAND) (k.getKeyCode() == Key_##HAND##TYPE.getKeyCode()) +#define _IS_ANY_MOD(TYPE) (_IS_MOD(TYPE, Left) || (_IS_MOD(TYPE, Right))) + +// TODO: Move this to key_defs.h? +// +constexpr bool isModifierKey(Key k) { + return _IS_ANY_MOD(Shift) + || _IS_ANY_MOD(Control) + || _IS_ANY_MOD(Alt) + || _IS_ANY_MOD(Gui); +} + +#undef _IS_MOD +#undef _IS_ANY_MOD + +#define _MIRROR_MOD(NAME) \ + (k.getKeyCode() == Key_Left##NAME.getKeyCode()) \ + ? Key{Key_Right##NAME.getKeyCode(), k.getFlags()} \ + : (k.getKeyCode() == Key_Right##NAME.getKeyCode()) \ + ? Key{Key_Left##NAME.getKeyCode(), k.getFlags()} + +// TODO: Move this to key_defs.h? +// +constexpr Key mirrorModifier(Key k) { + return isModifierKey(k) + ? ( + _MIRROR_MOD(Shift) + : _MIRROR_MOD(Control) + : _MIRROR_MOD(Alt) + : _MIRROR_MOD(Gui) + : bad_keymap_key + ) + : bad_keymap_key; +} + +#undef MIRROR_MOD + +template +struct BaseConverter { + + typedef _CharType CharType; + typedef StringMember<_CharType, _CharProcessor> StringMemberType; + + template + static constexpr Key charToKey(_StringMember s) { + return _DerivedConverter::charToKey(s.toChar()); + } + + // This implements the parser logic that is used to parse keymap + // strings like "c+a". + // + template + static constexpr Key parseKeyDefinitionString(_StringMember s) { + + // C++11 constexpr functions do not allow using if/else clauses. + // Because of that, we use the ternary operator to express + // conditionals instead. + + return + (s.length() == 0) + ? bad_keymap_key + : (s.length() == 1) + ? charToKey(s) // Consider the only character as ascii key + : s.isEscapeChar() // Is this an escape character? + ? ( + s.next().isLastNonSeparator() + ? charToKey(s.next()) + : bad_keymap_key + ) + : s.isSeparator() + ? parseKeyDefinitionString(s.next()) // Ignore separator keys + : s.isLastNonSeparator() + ? charToKey(s) // The last key is treated as ASCII key + : s.isMirrorChar() + ? ( + !s.isLastNonSeparator() + ? mirrorModifier(parseKeyDefinitionString(s.next())) + : bad_keymap_key + ) + : _DerivedConverter::addModifier( // s must be a modifier key + parseKeyDefinitionString(s.next()), // Recurse (continue parsing the remaining string) + s // This character must be a modifier token + ); + } + + // This function allows to use character strings to define keys. + // + template + static constexpr Key convertToKey(_CharType const(&string) [_Size]) { + return _DerivedConverter + ::parseKeyDefinitionString(StringMemberType{string}); + } + + static constexpr Key convertToKey(_CharType c) { + return _DerivedConverter::charToKey(c); + } +}; + +template +struct _CharParsingStandardFallback { + static constexpr bool isKeyChar(_CharType c) { + return false; + } + static constexpr Key charToKey(_CharType c) { + return bad_keymap_key; + } +}; + +namespace linux { + +enum class XKBKeySym { +#define _HOST_KEYMAP_INIT_NON_PRINTABLE_SYMBOLS_ENUM(XKB_KEY_SYM, KEY_EVENT, DESC) \ + XKB_KEY_SYM, +#define _HOST_KEYMAP_INIT_PRINTABLE_SYMBOLS_ENUM(XKB_KEY_SYM, KEY_EVENT, UNICODE, DESC) \ + XKB_KEY_SYM, + + XKB_KEY_SYM_NAME__KEY_SYM__DESCRIPTION(_HOST_KEYMAP_INIT_NON_PRINTABLE_SYMBOLS_ENUM) + XKB_KEY_NAME__KEY_SYM__UNICODE__DESC(_HOST_KEYMAP_INIT_PRINTABLE_SYMBOLS_ENUM) + None +}; +} // namespace linux + +} // namespace host_keymap +} // namespace kaleidoscope + +#define _HOST_KEYMAP_CHECK_IF_MODIFIER(CHAR, OPERATION) s.is((CHAR)) ? true : +#define _HOST_KEYMAP_ADD_MODIFIER(CHAR, OPERATION) s.is((CHAR)) ? (OPERATION) : + +#define _HOST_KEYMAP_IS_KEY_CHAR(KI, KO) (c == (KI)) ? true : +#define _HOST_KEYMAP_MAP_KEY_CHAR_TO_KALEIDOSCOPE_KEY(KI, KO) (c == (KI)) ? (KO) : + +#define _HOST_KEYMAP_DEFINE_CHAR_CONVERTER(NAME, CHAR_TYPE, MODIFIER_MAP) \ + template \ + struct NAME \ + : public BaseConverter \ + { \ + typedef BaseConverter \ + Parent; \ + \ + using typename Parent::StringMemberType; \ + using typename Parent::CharType; \ + \ + static constexpr bool isModifierKey(StringMemberType s) { \ + return MODIFIER_MAP(_HOST_KEYMAP_CHECK_IF_MODIFIER) \ + false; \ + } \ + \ + static constexpr Key addModifier(Key k, StringMemberType s) { \ + return (k == bad_keymap_key) \ + ? bad_keymap_key /* If the input key is already */ \ + /* the bad_keymap_key we do not */ \ + /* touch it here. */ \ + : MODIFIER_MAP(_HOST_KEYMAP_ADD_MODIFIER) \ + bad_keymap_key; \ + } \ + }; diff --git a/src/kaleidoscope/host_keymap/linux.h b/src/kaleidoscope/host_keymap/linux.h new file mode 100644 index 0000000000..f22c58f584 --- /dev/null +++ b/src/kaleidoscope/host_keymap/linux.h @@ -0,0 +1,37 @@ +/* Kaleidoscope - Firmware for computer input devices + * Copyright (C) 2013-2018 Keyboard.io, Inc. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +#include "kaleidoscope/host_keymap/ascii.h" +#include "kaleidoscope/host_keymap/unicode.h" +#include "kaleidoscope/host_keymap/non_printable.h" + +#define HOST_KEYMAP_LINUX( ASCII_KEYMAP, \ + UNICODE_KEYMAP, \ + NON_PRINTABLE_KEYMAP) \ + HOST_KEYMAP_ASCII_CONVERTER( \ + ASCII_KEYMAP, \ + ascii::CharParsingStandardFallback \ + ) \ + HOST_KEYMAP_UNICODE_CONVERTER( \ + UNICODE_KEYMAP, \ + unicode::CharParsingStandardFallback \ + ) \ + HOST_KEYMAP_NON_PRINTABLE_CONVERTER( \ + NON_PRINTABLE_KEYMAP \ + ) \ + constexpr Key convertToKey(Key k) { return k; } diff --git a/src/kaleidoscope/host_keymap/linux/de/standard/keymap.h b/src/kaleidoscope/host_keymap/linux/de/standard/keymap.h new file mode 100644 index 0000000000..3d10fd547a --- /dev/null +++ b/src/kaleidoscope/host_keymap/linux/de/standard/keymap.h @@ -0,0 +1,596 @@ +/* Kaleidoscope - Firmware for computer input devices + * Copyright (C) 2013-2019 Keyboard.io, Inc. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +#include "kaleidoscope/host_keymap/linux.h" + +// This file was autogenerated by host_keymap. +// Its content is based on information provided by the XKB X11 system +// collected with the extraordinary libxkbcommon. + +// layout: de +// variant: standard + +#define _HOST_KEYMAP_ASCII(OP) \ + OP('\b', Key_Backspace) /* XKB_KEY_BackSpace, Back space, back char */ \ + OP('\t', Key_Tab) /* XKB_KEY_Tab */ \ + OP('\r', Key_Enter) /* XKB_KEY_Return, Return, enter */ \ + OP('\e', Key_Escape) /* XKB_KEY_Escape */ \ + OP(' ', Key_Spacebar) /* U+0020, XKB_KEY_space, SPACE */ \ + OP('!', LSHIFT(Key_1)) /* U+0021, XKB_KEY_exclam, EXCLAMATION MARK */ \ + OP('"', LSHIFT(Key_2)) /* U+0022, XKB_KEY_quotedbl, QUOTATION MARK */ \ + OP('#', Key_NonUsPound) /* U+0023, XKB_KEY_numbersign, NUMBER SIGN */ \ + OP('$', LSHIFT(Key_4)) /* U+0024, XKB_KEY_dollar, DOLLAR SIGN */ \ + OP('%', LSHIFT(Key_5)) /* U+0025, XKB_KEY_percent, PERCENT SIGN */ \ + OP('&', LSHIFT(Key_6)) /* U+0026, XKB_KEY_ampersand, AMPERSAND */ \ + OP('\'', LSHIFT(Key_NonUsPound)) /* U+0027, XKB_KEY_apostrophe, APOSTROPHE */ \ + OP('(', LSHIFT(Key_8)) /* U+0028, XKB_KEY_parenleft, LEFT PARENTHESIS */ \ + OP(')', LSHIFT(Key_9)) /* U+0029, XKB_KEY_parenright, RIGHT PARENTHESIS */ \ + OP('*', Key_KeypadMultiply) /* XKB_KEY_KP_Multiply */ \ + OP('+', Key_RightBracket) /* U+002b, XKB_KEY_plus, PLUS SIGN */ \ + OP(',', Key_Comma) /* U+002c, XKB_KEY_comma, COMMA */ \ + OP('-', Key_Slash) /* U+002d, XKB_KEY_minus, HYPHEN-MINUS */ \ + OP('.', Key_Period) /* U+002e, XKB_KEY_period, FULL STOP */ \ + OP('/', Key_KeypadDivide) /* XKB_KEY_KP_Divide */ \ + OP('0', Key_0) /* U+0030, XKB_KEY_0, DIGIT ZERO */ \ + OP('1', Key_1) /* U+0031, XKB_KEY_1, DIGIT ONE */ \ + OP('2', Key_2) /* U+0032, XKB_KEY_2, DIGIT TWO */ \ + OP('3', Key_3) /* U+0033, XKB_KEY_3, DIGIT THREE */ \ + OP('4', Key_4) /* U+0034, XKB_KEY_4, DIGIT FOUR */ \ + OP('5', Key_5) /* U+0035, XKB_KEY_5, DIGIT FIVE */ \ + OP('6', Key_6) /* U+0036, XKB_KEY_6, DIGIT SIX */ \ + OP('7', Key_7) /* U+0037, XKB_KEY_7, DIGIT SEVEN */ \ + OP('8', Key_8) /* U+0038, XKB_KEY_8, DIGIT EIGHT */ \ + OP('9', Key_9) /* U+0039, XKB_KEY_9, DIGIT NINE */ \ + OP(':', LSHIFT(Key_Period)) /* U+003a, XKB_KEY_colon, COLON */ \ + OP(';', LSHIFT(Key_Comma)) /* U+003b, XKB_KEY_semicolon, SEMICOLON */ \ + OP('<', Key_NonUsBackslashAndPipe) /* U+003c, XKB_KEY_less, LESS-THAN SIGN */ \ + OP('=', LSHIFT(Key_0)) /* U+003d, XKB_KEY_equal, EQUALS SIGN */ \ + OP('>', LSHIFT(Key_NonUsBackslashAndPipe)) /* U+003e, XKB_KEY_greater, GREATER-THAN SIGN */ \ + OP('?', LSHIFT(Key_Minus)) /* U+003f, XKB_KEY_question, QUESTION MARK */ \ + OP('@', RALT(Key_Q)) /* U+0040, XKB_KEY_at, COMMERCIAL AT */ \ + OP('A', LSHIFT(Key_A)) /* U+0041, XKB_KEY_A, LATIN CAPITAL LETTER A */ \ + OP('B', LSHIFT(Key_B)) /* U+0042, XKB_KEY_B, LATIN CAPITAL LETTER B */ \ + OP('C', LSHIFT(Key_C)) /* U+0043, XKB_KEY_C, LATIN CAPITAL LETTER C */ \ + OP('D', LSHIFT(Key_D)) /* U+0044, XKB_KEY_D, LATIN CAPITAL LETTER D */ \ + OP('E', LSHIFT(Key_E)) /* U+0045, XKB_KEY_E, LATIN CAPITAL LETTER E */ \ + OP('F', LSHIFT(Key_F)) /* U+0046, XKB_KEY_F, LATIN CAPITAL LETTER F */ \ + OP('G', LSHIFT(Key_G)) /* U+0047, XKB_KEY_G, LATIN CAPITAL LETTER G */ \ + OP('H', LSHIFT(Key_H)) /* U+0048, XKB_KEY_H, LATIN CAPITAL LETTER H */ \ + OP('I', LSHIFT(Key_I)) /* U+0049, XKB_KEY_I, LATIN CAPITAL LETTER I */ \ + OP('J', LSHIFT(Key_J)) /* U+004a, XKB_KEY_J, LATIN CAPITAL LETTER J */ \ + OP('K', LSHIFT(Key_K)) /* U+004b, XKB_KEY_K, LATIN CAPITAL LETTER K */ \ + OP('L', LSHIFT(Key_L)) /* U+004c, XKB_KEY_L, LATIN CAPITAL LETTER L */ \ + OP('M', LSHIFT(Key_M)) /* U+004d, XKB_KEY_M, LATIN CAPITAL LETTER M */ \ + OP('N', LSHIFT(Key_N)) /* U+004e, XKB_KEY_N, LATIN CAPITAL LETTER N */ \ + OP('O', LSHIFT(Key_O)) /* U+004f, XKB_KEY_O, LATIN CAPITAL LETTER O */ \ + OP('P', LSHIFT(Key_P)) /* U+0050, XKB_KEY_P, LATIN CAPITAL LETTER P */ \ + OP('Q', LSHIFT(Key_Q)) /* U+0051, XKB_KEY_Q, LATIN CAPITAL LETTER Q */ \ + OP('R', LSHIFT(Key_R)) /* U+0052, XKB_KEY_R, LATIN CAPITAL LETTER R */ \ + OP('S', LSHIFT(Key_S)) /* U+0053, XKB_KEY_S, LATIN CAPITAL LETTER S */ \ + OP('T', LSHIFT(Key_T)) /* U+0054, XKB_KEY_T, LATIN CAPITAL LETTER T */ \ + OP('U', LSHIFT(Key_U)) /* U+0055, XKB_KEY_U, LATIN CAPITAL LETTER U */ \ + OP('V', LSHIFT(Key_V)) /* U+0056, XKB_KEY_V, LATIN CAPITAL LETTER V */ \ + OP('W', LSHIFT(Key_W)) /* U+0057, XKB_KEY_W, LATIN CAPITAL LETTER W */ \ + OP('X', LSHIFT(Key_X)) /* U+0058, XKB_KEY_X, LATIN CAPITAL LETTER X */ \ + OP('Y', LSHIFT(Key_Z)) /* U+0059, XKB_KEY_Y, LATIN CAPITAL LETTER Y */ \ + OP('Z', LSHIFT(Key_Y)) /* U+005a, XKB_KEY_Z, LATIN CAPITAL LETTER Z */ \ + OP('[', RALT(Key_8)) /* U+005b, XKB_KEY_bracketleft, LEFT SQUARE BRACKET */ \ + OP('\\', RALT(Key_Minus)) /* U+005c, XKB_KEY_backslash, REVERSE SOLIDUS */ \ + OP(']', RALT(Key_9)) /* U+005d, XKB_KEY_bracketright, RIGHT SQUARE BRACKET */ \ + OP('_', LSHIFT(Key_Slash)) /* U+005f, XKB_KEY_underscore, LOW LINE */ \ + OP('a', Key_A) /* U+0061, XKB_KEY_a, LATIN SMALL LETTER A */ \ + OP('b', Key_B) /* U+0062, XKB_KEY_b, LATIN SMALL LETTER B */ \ + OP('c', Key_C) /* U+0063, XKB_KEY_c, LATIN SMALL LETTER C */ \ + OP('d', Key_D) /* U+0064, XKB_KEY_d, LATIN SMALL LETTER D */ \ + OP('e', Key_E) /* U+0065, XKB_KEY_e, LATIN SMALL LETTER E */ \ + OP('f', Key_F) /* U+0066, XKB_KEY_f, LATIN SMALL LETTER F */ \ + OP('g', Key_G) /* U+0067, XKB_KEY_g, LATIN SMALL LETTER G */ \ + OP('h', Key_H) /* U+0068, XKB_KEY_h, LATIN SMALL LETTER H */ \ + OP('i', Key_I) /* U+0069, XKB_KEY_i, LATIN SMALL LETTER I */ \ + OP('j', Key_J) /* U+006a, XKB_KEY_j, LATIN SMALL LETTER J */ \ + OP('k', Key_K) /* U+006b, XKB_KEY_k, LATIN SMALL LETTER K */ \ + OP('l', Key_L) /* U+006c, XKB_KEY_l, LATIN SMALL LETTER L */ \ + OP('m', Key_M) /* U+006d, XKB_KEY_m, LATIN SMALL LETTER M */ \ + OP('n', Key_N) /* U+006e, XKB_KEY_n, LATIN SMALL LETTER N */ \ + OP('o', Key_O) /* U+006f, XKB_KEY_o, LATIN SMALL LETTER O */ \ + OP('p', Key_P) /* U+0070, XKB_KEY_p, LATIN SMALL LETTER P */ \ + OP('q', Key_Q) /* U+0071, XKB_KEY_q, LATIN SMALL LETTER Q */ \ + OP('r', Key_R) /* U+0072, XKB_KEY_r, LATIN SMALL LETTER R */ \ + OP('s', Key_S) /* U+0073, XKB_KEY_s, LATIN SMALL LETTER S */ \ + OP('t', Key_T) /* U+0074, XKB_KEY_t, LATIN SMALL LETTER T */ \ + OP('u', Key_U) /* U+0075, XKB_KEY_u, LATIN SMALL LETTER U */ \ + OP('v', Key_V) /* U+0076, XKB_KEY_v, LATIN SMALL LETTER V */ \ + OP('w', Key_W) /* U+0077, XKB_KEY_w, LATIN SMALL LETTER W */ \ + OP('x', Key_X) /* U+0078, XKB_KEY_x, LATIN SMALL LETTER X */ \ + OP('y', Key_Z) /* U+0079, XKB_KEY_y, LATIN SMALL LETTER Y */ \ + OP('z', Key_Y) /* U+007a, XKB_KEY_z, LATIN SMALL LETTER Z */ \ + OP('{', RALT(Key_7)) /* U+007b, XKB_KEY_braceleft, LEFT CURLY BRACKET */ \ + OP('|', RALT(Key_NonUsBackslashAndPipe)) /* U+007c, XKB_KEY_bar, VERTICAL LINE */ \ + OP('}', RALT(Key_0)) /* U+007d, XKB_KEY_braceright, RIGHT CURLY BRACKET */ \ + OP('~', RALT(Key_RightBracket)) /* U+007e, XKB_KEY_asciitilde, TILDE */ \ + OP('', Key_Delete) /* XKB_KEY_Delete, Delete, rubout */ \ + +#define _HOST_KEYMAP_UNICODE(OP) \ + OP(L'\b', Key_Backspace) /* XKB_KEY_BackSpace, Back space, back char */ \ + OP(L'\t', Key_Tab) /* XKB_KEY_Tab */ \ + OP(L'\r', Key_Enter) /* XKB_KEY_Return, Return, enter */ \ + OP(L'\e', Key_Escape) /* XKB_KEY_Escape */ \ + OP(L' ', Key_Spacebar) /* U+0020, XKB_KEY_space, SPACE */ \ + OP(L'!', LSHIFT(Key_1)) /* U+0021, XKB_KEY_exclam, EXCLAMATION MARK */ \ + OP(L'"', LSHIFT(Key_2)) /* U+0022, XKB_KEY_quotedbl, QUOTATION MARK */ \ + OP(L'#', Key_NonUsPound) /* U+0023, XKB_KEY_numbersign, NUMBER SIGN */ \ + OP(L'$', LSHIFT(Key_4)) /* U+0024, XKB_KEY_dollar, DOLLAR SIGN */ \ + OP(L'%', LSHIFT(Key_5)) /* U+0025, XKB_KEY_percent, PERCENT SIGN */ \ + OP(L'&', LSHIFT(Key_6)) /* U+0026, XKB_KEY_ampersand, AMPERSAND */ \ + OP(L'\'', LSHIFT(Key_NonUsPound)) /* U+0027, XKB_KEY_apostrophe, APOSTROPHE */ \ + OP(L'(', LSHIFT(Key_8)) /* U+0028, XKB_KEY_parenleft, LEFT PARENTHESIS */ \ + OP(L')', LSHIFT(Key_9)) /* U+0029, XKB_KEY_parenright, RIGHT PARENTHESIS */ \ + OP(L'*', Key_KeypadMultiply) /* XKB_KEY_KP_Multiply */ \ + OP(L'+', Key_RightBracket) /* U+002b, XKB_KEY_plus, PLUS SIGN */ \ + OP(L',', Key_Comma) /* U+002c, XKB_KEY_comma, COMMA */ \ + OP(L'-', Key_Slash) /* U+002d, XKB_KEY_minus, HYPHEN-MINUS */ \ + OP(L'.', Key_Period) /* U+002e, XKB_KEY_period, FULL STOP */ \ + OP(L'/', Key_KeypadDivide) /* XKB_KEY_KP_Divide */ \ + OP(L'0', Key_0) /* U+0030, XKB_KEY_0, DIGIT ZERO */ \ + OP(L'1', Key_1) /* U+0031, XKB_KEY_1, DIGIT ONE */ \ + OP(L'2', Key_2) /* U+0032, XKB_KEY_2, DIGIT TWO */ \ + OP(L'3', Key_3) /* U+0033, XKB_KEY_3, DIGIT THREE */ \ + OP(L'4', Key_4) /* U+0034, XKB_KEY_4, DIGIT FOUR */ \ + OP(L'5', Key_5) /* U+0035, XKB_KEY_5, DIGIT FIVE */ \ + OP(L'6', Key_6) /* U+0036, XKB_KEY_6, DIGIT SIX */ \ + OP(L'7', Key_7) /* U+0037, XKB_KEY_7, DIGIT SEVEN */ \ + OP(L'8', Key_8) /* U+0038, XKB_KEY_8, DIGIT EIGHT */ \ + OP(L'9', Key_9) /* U+0039, XKB_KEY_9, DIGIT NINE */ \ + OP(L':', LSHIFT(Key_Period)) /* U+003a, XKB_KEY_colon, COLON */ \ + OP(L';', LSHIFT(Key_Comma)) /* U+003b, XKB_KEY_semicolon, SEMICOLON */ \ + OP(L'<', Key_NonUsBackslashAndPipe) /* U+003c, XKB_KEY_less, LESS-THAN SIGN */ \ + OP(L'=', LSHIFT(Key_0)) /* U+003d, XKB_KEY_equal, EQUALS SIGN */ \ + OP(L'>', LSHIFT(Key_NonUsBackslashAndPipe)) /* U+003e, XKB_KEY_greater, GREATER-THAN SIGN */ \ + OP(L'?', LSHIFT(Key_Minus)) /* U+003f, XKB_KEY_question, QUESTION MARK */ \ + OP(L'@', RALT(Key_Q)) /* U+0040, XKB_KEY_at, COMMERCIAL AT */ \ + OP(L'A', LSHIFT(Key_A)) /* U+0041, XKB_KEY_A, LATIN CAPITAL LETTER A */ \ + OP(L'B', LSHIFT(Key_B)) /* U+0042, XKB_KEY_B, LATIN CAPITAL LETTER B */ \ + OP(L'C', LSHIFT(Key_C)) /* U+0043, XKB_KEY_C, LATIN CAPITAL LETTER C */ \ + OP(L'D', LSHIFT(Key_D)) /* U+0044, XKB_KEY_D, LATIN CAPITAL LETTER D */ \ + OP(L'E', LSHIFT(Key_E)) /* U+0045, XKB_KEY_E, LATIN CAPITAL LETTER E */ \ + OP(L'F', LSHIFT(Key_F)) /* U+0046, XKB_KEY_F, LATIN CAPITAL LETTER F */ \ + OP(L'G', LSHIFT(Key_G)) /* U+0047, XKB_KEY_G, LATIN CAPITAL LETTER G */ \ + OP(L'H', LSHIFT(Key_H)) /* U+0048, XKB_KEY_H, LATIN CAPITAL LETTER H */ \ + OP(L'I', LSHIFT(Key_I)) /* U+0049, XKB_KEY_I, LATIN CAPITAL LETTER I */ \ + OP(L'J', LSHIFT(Key_J)) /* U+004a, XKB_KEY_J, LATIN CAPITAL LETTER J */ \ + OP(L'K', LSHIFT(Key_K)) /* U+004b, XKB_KEY_K, LATIN CAPITAL LETTER K */ \ + OP(L'L', LSHIFT(Key_L)) /* U+004c, XKB_KEY_L, LATIN CAPITAL LETTER L */ \ + OP(L'M', LSHIFT(Key_M)) /* U+004d, XKB_KEY_M, LATIN CAPITAL LETTER M */ \ + OP(L'N', LSHIFT(Key_N)) /* U+004e, XKB_KEY_N, LATIN CAPITAL LETTER N */ \ + OP(L'O', LSHIFT(Key_O)) /* U+004f, XKB_KEY_O, LATIN CAPITAL LETTER O */ \ + OP(L'P', LSHIFT(Key_P)) /* U+0050, XKB_KEY_P, LATIN CAPITAL LETTER P */ \ + OP(L'Q', LSHIFT(Key_Q)) /* U+0051, XKB_KEY_Q, LATIN CAPITAL LETTER Q */ \ + OP(L'R', LSHIFT(Key_R)) /* U+0052, XKB_KEY_R, LATIN CAPITAL LETTER R */ \ + OP(L'S', LSHIFT(Key_S)) /* U+0053, XKB_KEY_S, LATIN CAPITAL LETTER S */ \ + OP(L'T', LSHIFT(Key_T)) /* U+0054, XKB_KEY_T, LATIN CAPITAL LETTER T */ \ + OP(L'U', LSHIFT(Key_U)) /* U+0055, XKB_KEY_U, LATIN CAPITAL LETTER U */ \ + OP(L'V', LSHIFT(Key_V)) /* U+0056, XKB_KEY_V, LATIN CAPITAL LETTER V */ \ + OP(L'W', LSHIFT(Key_W)) /* U+0057, XKB_KEY_W, LATIN CAPITAL LETTER W */ \ + OP(L'X', LSHIFT(Key_X)) /* U+0058, XKB_KEY_X, LATIN CAPITAL LETTER X */ \ + OP(L'Y', LSHIFT(Key_Z)) /* U+0059, XKB_KEY_Y, LATIN CAPITAL LETTER Y */ \ + OP(L'Z', LSHIFT(Key_Y)) /* U+005a, XKB_KEY_Z, LATIN CAPITAL LETTER Z */ \ + OP(L'[', RALT(Key_8)) /* U+005b, XKB_KEY_bracketleft, LEFT SQUARE BRACKET */ \ + OP(L'\\', RALT(Key_Minus)) /* U+005c, XKB_KEY_backslash, REVERSE SOLIDUS */ \ + OP(L']', RALT(Key_9)) /* U+005d, XKB_KEY_bracketright, RIGHT SQUARE BRACKET */ \ + OP(L'_', LSHIFT(Key_Slash)) /* U+005f, XKB_KEY_underscore, LOW LINE */ \ + OP(L'a', Key_A) /* U+0061, XKB_KEY_a, LATIN SMALL LETTER A */ \ + OP(L'b', Key_B) /* U+0062, XKB_KEY_b, LATIN SMALL LETTER B */ \ + OP(L'c', Key_C) /* U+0063, XKB_KEY_c, LATIN SMALL LETTER C */ \ + OP(L'd', Key_D) /* U+0064, XKB_KEY_d, LATIN SMALL LETTER D */ \ + OP(L'e', Key_E) /* U+0065, XKB_KEY_e, LATIN SMALL LETTER E */ \ + OP(L'f', Key_F) /* U+0066, XKB_KEY_f, LATIN SMALL LETTER F */ \ + OP(L'g', Key_G) /* U+0067, XKB_KEY_g, LATIN SMALL LETTER G */ \ + OP(L'h', Key_H) /* U+0068, XKB_KEY_h, LATIN SMALL LETTER H */ \ + OP(L'i', Key_I) /* U+0069, XKB_KEY_i, LATIN SMALL LETTER I */ \ + OP(L'j', Key_J) /* U+006a, XKB_KEY_j, LATIN SMALL LETTER J */ \ + OP(L'k', Key_K) /* U+006b, XKB_KEY_k, LATIN SMALL LETTER K */ \ + OP(L'l', Key_L) /* U+006c, XKB_KEY_l, LATIN SMALL LETTER L */ \ + OP(L'm', Key_M) /* U+006d, XKB_KEY_m, LATIN SMALL LETTER M */ \ + OP(L'n', Key_N) /* U+006e, XKB_KEY_n, LATIN SMALL LETTER N */ \ + OP(L'o', Key_O) /* U+006f, XKB_KEY_o, LATIN SMALL LETTER O */ \ + OP(L'p', Key_P) /* U+0070, XKB_KEY_p, LATIN SMALL LETTER P */ \ + OP(L'q', Key_Q) /* U+0071, XKB_KEY_q, LATIN SMALL LETTER Q */ \ + OP(L'r', Key_R) /* U+0072, XKB_KEY_r, LATIN SMALL LETTER R */ \ + OP(L's', Key_S) /* U+0073, XKB_KEY_s, LATIN SMALL LETTER S */ \ + OP(L't', Key_T) /* U+0074, XKB_KEY_t, LATIN SMALL LETTER T */ \ + OP(L'u', Key_U) /* U+0075, XKB_KEY_u, LATIN SMALL LETTER U */ \ + OP(L'v', Key_V) /* U+0076, XKB_KEY_v, LATIN SMALL LETTER V */ \ + OP(L'w', Key_W) /* U+0077, XKB_KEY_w, LATIN SMALL LETTER W */ \ + OP(L'x', Key_X) /* U+0078, XKB_KEY_x, LATIN SMALL LETTER X */ \ + OP(L'y', Key_Z) /* U+0079, XKB_KEY_y, LATIN SMALL LETTER Y */ \ + OP(L'z', Key_Y) /* U+007a, XKB_KEY_z, LATIN SMALL LETTER Z */ \ + OP(L'{', RALT(Key_7)) /* U+007b, XKB_KEY_braceleft, LEFT CURLY BRACKET */ \ + OP(L'|', RALT(Key_NonUsBackslashAndPipe)) /* U+007c, XKB_KEY_bar, VERTICAL LINE */ \ + OP(L'}', RALT(Key_0)) /* U+007d, XKB_KEY_braceright, RIGHT CURLY BRACKET */ \ + OP(L'~', RALT(Key_RightBracket)) /* U+007e, XKB_KEY_asciitilde, TILDE */ \ + OP(L'', Key_Delete) /* XKB_KEY_Delete, Delete, rubout */ \ + OP(L'¡', RALT(LSHIFT(Key_1))) /* U+00a1, XKB_KEY_exclamdown, INVERTED EXCLAMATION MARK */ \ + OP(L'¢', RALT(Key_C)) /* U+00a2, XKB_KEY_cent, CENT SIGN */ \ + OP(L'£', RALT(LSHIFT(Key_3))) /* U+00a3, XKB_KEY_sterling, POUND SIGN */ \ + OP(L'¤', RALT(LSHIFT(Key_4))) /* U+00a4, XKB_KEY_currency, CURRENCY SIGN */ \ + OP(L'¥', RALT(LSHIFT(Key_Y))) /* U+00a5, XKB_KEY_yen, YEN SIGN */ \ + OP(L'§', LSHIFT(Key_3)) /* U+00a7, XKB_KEY_section, SECTION SIGN */ \ + OP(L'©', RALT(LSHIFT(Key_C))) /* U+00a9, XKB_KEY_copyright, COPYRIGHT SIGN */ \ + OP(L'ª', RALT(LSHIFT(Key_F))) /* U+00aa, XKB_KEY_ordfeminine, FEMININE ORDINAL INDICATOR */ \ + OP(L'«', RALT(Key_X)) /* U+00ab, XKB_KEY_guillemotleft, LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + OP(L'¬', RALT(Key_6)) /* U+00ac, XKB_KEY_notsign, NOT SIGN */ \ + OP(L'®', RALT(LSHIFT(Key_R))) /* U+00ae, XKB_KEY_registered, REGISTERED SIGN */ \ + OP(L'¯', RALT(LSHIFT(Key_RightBracket))) /* U+00af, XKB_KEY_macron, MACRON */ \ + OP(L'°', LSHIFT(Key_Backtick)) /* U+00b0, XKB_KEY_degree, DEGREE SIGN */ \ + OP(L'±', RALT(LSHIFT(Key_9))) /* U+00b1, XKB_KEY_plusminus, PLUS-MINUS SIGN */ \ + OP(L'²', RALT(Key_2)) /* U+00b2, XKB_KEY_twosuperior, SUPERSCRIPT TWO */ \ + OP(L'³', RALT(Key_3)) /* U+00b3, XKB_KEY_threesuperior, SUPERSCRIPT THREE */ \ + OP(L'µ', RALT(Key_M)) /* U+00b5, XKB_KEY_mu, MICRO SIGN */ \ + OP(L'¶', RALT(Key_R)) /* U+00b6, XKB_KEY_paragraph, PILCROW SIGN */ \ + OP(L'·', RALT(Key_Comma)) /* U+00b7, XKB_KEY_periodcentered, MIDDLE DOT */ \ + OP(L'¹', RALT(Key_1)) /* U+00b9, XKB_KEY_onesuperior, SUPERSCRIPT ONE */ \ + OP(L'º', RALT(LSHIFT(Key_M))) /* U+00ba, XKB_KEY_masculine, MASCULINE ORDINAL INDICATOR */ \ + OP(L'»', RALT(Key_Z)) /* U+00bb, XKB_KEY_guillemotright, RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + OP(L'¼', RALT(Key_4)) /* U+00bc, XKB_KEY_onequarter, VULGAR FRACTION ONE QUARTER */ \ + OP(L'½', RALT(Key_5)) /* U+00bd, XKB_KEY_onehalf, VULGAR FRACTION ONE HALF */ \ + OP(L'¿', RALT(LSHIFT(Key_Minus))) /* U+00bf, XKB_KEY_questiondown, INVERTED QUESTION MARK */ \ + OP(L'Ä', LSHIFT(Key_Quote)) /* U+00c4, XKB_KEY_Adiaeresis, LATIN CAPITAL LETTER A WITH DIAERESIS */ \ + OP(L'Æ', RALT(LSHIFT(Key_A))) /* U+00c6, XKB_KEY_AE, LATIN CAPITAL LETTER AE */ \ + OP(L'Ð', RALT(LSHIFT(Key_D))) /* U+00d0, XKB_KEY_ETH, LATIN CAPITAL LETTER ETH */ \ + OP(L'Ö', LSHIFT(Key_Semicolon)) /* U+00d6, XKB_KEY_Odiaeresis, LATIN CAPITAL LETTER O WITH DIAERESIS */ \ + OP(L'×', RALT(LSHIFT(Key_Comma))) /* U+00d7, XKB_KEY_multiply, MULTIPLICATION SIGN */ \ + OP(L'Ø', RALT(LSHIFT(Key_O))) /* U+00d8, XKB_KEY_Oslash, LATIN CAPITAL LETTER O WITH STROKE */ \ + OP(L'Ü', LSHIFT(Key_LeftBracket)) /* U+00dc, XKB_KEY_Udiaeresis, LATIN CAPITAL LETTER U WITH DIAERESIS */ \ + OP(L'Þ', RALT(LSHIFT(Key_P))) /* U+00de, XKB_KEY_THORN, LATIN CAPITAL LETTER THORN */ \ + OP(L'ß', Key_Minus) /* U+00df, XKB_KEY_ssharp, LATIN SMALL LETTER SHARP S */ \ + OP(L'ä', Key_Quote) /* U+00e4, XKB_KEY_adiaeresis, LATIN SMALL LETTER A WITH DIAERESIS */ \ + OP(L'æ', RALT(Key_A)) /* U+00e6, XKB_KEY_ae, LATIN SMALL LETTER AE */ \ + OP(L'ð', RALT(Key_D)) /* U+00f0, XKB_KEY_eth, LATIN SMALL LETTER ETH */ \ + OP(L'ö', Key_Semicolon) /* U+00f6, XKB_KEY_odiaeresis, LATIN SMALL LETTER O WITH DIAERESIS */ \ + OP(L'÷', RALT(LSHIFT(Key_Period))) /* U+00f7, XKB_KEY_division, DIVISION SIGN */ \ + OP(L'ø', RALT(Key_O)) /* U+00f8, XKB_KEY_oslash, LATIN SMALL LETTER O WITH STROKE */ \ + OP(L'ü', Key_LeftBracket) /* U+00fc, XKB_KEY_udiaeresis, LATIN SMALL LETTER U WITH DIAERESIS */ \ + OP(L'þ', RALT(Key_P)) /* U+00fe, XKB_KEY_thorn, LATIN SMALL LETTER THORN */ \ + OP(L'đ', RALT(Key_F)) /* U+0111, XKB_KEY_dstroke, LATIN SMALL LETTER D WITH STROKE */ \ + OP(L'Ħ', RALT(LSHIFT(Key_H))) /* U+0126, XKB_KEY_Hstroke, LATIN CAPITAL LETTER H WITH STROKE */ \ + OP(L'ħ', RALT(Key_H)) /* U+0127, XKB_KEY_hstroke, LATIN SMALL LETTER H WITH STROKE */ \ + OP(L'ı', RALT(LSHIFT(Key_I))) /* U+0131, XKB_KEY_idotless, LATIN SMALL LETTER DOTLESS I */ \ + OP(L'ĸ', RALT(Key_K)) /* U+0138, XKB_KEY_kra, LATIN SMALL LETTER KRA */ \ + OP(L'Ł', RALT(LSHIFT(Key_W))) /* U+0141, XKB_KEY_Lstroke, LATIN CAPITAL LETTER L WITH STROKE */ \ + OP(L'ł', RALT(Key_W)) /* U+0142, XKB_KEY_lstroke, LATIN SMALL LETTER L WITH STROKE */ \ + OP(L'Ŋ', RALT(LSHIFT(Key_G))) /* U+014a, XKB_KEY_ENG, LATIN CAPITAL LETTER ENG */ \ + OP(L'ŋ', RALT(Key_G)) /* U+014b, XKB_KEY_eng, LATIN SMALL LETTER ENG */ \ + OP(L'Ŧ', RALT(LSHIFT(Key_T))) /* U+0166, XKB_KEY_Tslash, LATIN CAPITAL LETTER T WITH STROKE */ \ + OP(L'ŧ', RALT(Key_T)) /* U+0167, XKB_KEY_tslash, LATIN SMALL LETTER T WITH STROKE */ \ + OP(L'ſ', RALT(Key_S)) \ + OP(L'Ω', RALT(LSHIFT(Key_Q))) /* U+03a9, XKB_KEY_Greek_OMEGA, GREEK CAPITAL LETTER OMEGA */ \ + OP(L'ẞ', RALT(LSHIFT(Key_S))) \ + OP(L'–', RALT(Key_Slash)) /* U+2013, XKB_KEY_endash, EN DASH */ \ + OP(L'—', RALT(LSHIFT(Key_Slash))) /* U+2014, XKB_KEY_emdash, EM DASH */ \ + OP(L'‘', RALT(LSHIFT(Key_B))) /* U+2018, XKB_KEY_leftsinglequotemark, LEFT SINGLE QUOTATION MARK */ \ + OP(L'’', RALT(Key_NonUsPound)) /* U+2019, XKB_KEY_rightsinglequotemark, RIGHT SINGLE QUOTATION MARK */ \ + OP(L'‚', RALT(LSHIFT(Key_V))) /* U+201a, XKB_KEY_singlelowquotemark, SINGLE LOW-9 QUOTATION MARK */ \ + OP(L'“', RALT(Key_B)) /* U+201c, XKB_KEY_leftdoublequotemark, LEFT DOUBLE QUOTATION MARK */ \ + OP(L'”', RALT(Key_N)) /* U+201d, XKB_KEY_rightdoublequotemark, RIGHT DOUBLE QUOTATION MARK */ \ + OP(L'„', RALT(Key_V)) /* U+201e, XKB_KEY_doublelowquotemark, DOUBLE LOW-9 QUOTATION MARK */ \ + OP(L'…', RALT(Key_Period)) \ + OP(L'′', RALT(Key_Backtick)) \ + OP(L'″', RALT(LSHIFT(Key_Backtick))) \ + OP(L'‹', RALT(LSHIFT(Key_X))) \ + OP(L'›', RALT(LSHIFT(Key_Z))) \ + OP(L'€', RALT(Key_E)) /* U+20ac, XKB_KEY_EuroSign, EURO SIGN */ \ + OP(L'™', RALT(LSHIFT(Key_8))) /* U+2122, XKB_KEY_trademark, TRADE MARK SIGN */ \ + OP(L'⅛', RALT(LSHIFT(Key_2))) /* U+215b, XKB_KEY_oneeighth, VULGAR FRACTION ONE EIGHTH */ \ + OP(L'⅜', RALT(LSHIFT(Key_5))) /* U+215c, XKB_KEY_threeeighths, VULGAR FRACTION THREE EIGHTHS */ \ + OP(L'⅝', RALT(LSHIFT(Key_6))) /* U+215d, XKB_KEY_fiveeighths, VULGAR FRACTION FIVE EIGHTHS */ \ + OP(L'⅞', RALT(LSHIFT(Key_7))) /* U+215e, XKB_KEY_seveneighths, VULGAR FRACTION SEVEN EIGHTHS */ \ + OP(L'←', RALT(Key_Y)) /* U+2190, XKB_KEY_leftarrow, LEFTWARDS ARROW */ \ + OP(L'↑', RALT(LSHIFT(Key_U))) /* U+2191, XKB_KEY_uparrow, UPWARDS ARROW */ \ + OP(L'→', RALT(Key_I)) /* U+2192, XKB_KEY_rightarrow, RIGHTWARDS ARROW */ \ + OP(L'↓', RALT(Key_U)) /* U+2193, XKB_KEY_downarrow, DOWNWARDS ARROW */ \ + +#define _HOST_KEYMAP_NON_PRINTABLE(OP) \ + OP(XKB_KEY_0, Key_0) \ + OP(XKB_KEY_1, Key_1) \ + OP(XKB_KEY_2, Key_2) \ + OP(XKB_KEY_3, Key_3) \ + OP(XKB_KEY_4, Key_4) \ + OP(XKB_KEY_5, Key_5) \ + OP(XKB_KEY_6, Key_6) \ + OP(XKB_KEY_7, Key_7) \ + OP(XKB_KEY_8, Key_8) \ + OP(XKB_KEY_9, Key_9) \ + OP(XKB_KEY_A, LSHIFT(Key_A)) \ + OP(XKB_KEY_AE, RALT(LSHIFT(Key_A))) \ + OP(XKB_KEY_Adiaeresis, LSHIFT(Key_Quote)) \ + OP(XKB_KEY_Alt_L, Key_LeftAlt) /* XKB_KEY_Alt_L, Left alt */ \ + OP(XKB_KEY_B, LSHIFT(Key_B)) \ + OP(XKB_KEY_BackSpace, Key_Backspace) /* XKB_KEY_BackSpace, Back space, back char */ \ + OP(XKB_KEY_Break, LCTRL(Key_Pause)) /* XKB_KEY_Break */ \ + OP(XKB_KEY_C, LSHIFT(Key_C)) \ + OP(XKB_KEY_Caps_Lock, Key_CapsLock) /* XKB_KEY_Caps_Lock, Caps lock */ \ + OP(XKB_KEY_Control_L, Key_LeftControl) /* XKB_KEY_Control_L, Left control */ \ + OP(XKB_KEY_Control_R, Key_RightControl) /* XKB_KEY_Control_R, Right control */ \ + OP(XKB_KEY_D, LSHIFT(Key_D)) \ + OP(XKB_KEY_Delete, Key_Delete) /* XKB_KEY_Delete, Delete, rubout */ \ + OP(XKB_KEY_Down, Key_DownArrow) /* XKB_KEY_Down, Move down, down arrow */ \ + OP(XKB_KEY_E, LSHIFT(Key_E)) \ + OP(XKB_KEY_ENG, RALT(LSHIFT(Key_G))) \ + OP(XKB_KEY_ETH, RALT(LSHIFT(Key_D))) /* XKB_KEY_Eth, deprecated */ \ + OP(XKB_KEY_End, Key_End) /* XKB_KEY_End, EOL */ \ + OP(XKB_KEY_Escape, Key_Escape) /* XKB_KEY_Escape */ \ + OP(XKB_KEY_EuroSign, RALT(Key_E)) \ + OP(XKB_KEY_F, LSHIFT(Key_F)) \ + OP(XKB_KEY_F1, Key_F1) /* XKB_KEY_F1 */ \ + OP(XKB_KEY_F10, Key_F10) /* XKB_KEY_F10 */ \ + OP(XKB_KEY_F11, Key_F11) /* XKB_KEY_F11 */ \ + OP(XKB_KEY_F12, Key_F12) /* XKB_KEY_F12 */ \ + OP(XKB_KEY_F2, Key_F2) /* XKB_KEY_F2 */ \ + OP(XKB_KEY_F3, Key_F3) /* XKB_KEY_F3 */ \ + OP(XKB_KEY_F4, Key_F4) /* XKB_KEY_F4 */ \ + OP(XKB_KEY_F5, Key_F5) /* XKB_KEY_F5 */ \ + OP(XKB_KEY_F6, Key_F6) /* XKB_KEY_F6 */ \ + OP(XKB_KEY_F7, Key_F7) /* XKB_KEY_F7 */ \ + OP(XKB_KEY_F8, Key_F8) /* XKB_KEY_F8 */ \ + OP(XKB_KEY_F9, Key_F9) /* XKB_KEY_F9 */ \ + OP(XKB_KEY_G, LSHIFT(Key_G)) \ + OP(XKB_KEY_Greek_OMEGA, RALT(LSHIFT(Key_Q))) \ + OP(XKB_KEY_H, LSHIFT(Key_H)) \ + OP(XKB_KEY_Home, Key_Home) /* XKB_KEY_Home */ \ + OP(XKB_KEY_Hstroke, RALT(LSHIFT(Key_H))) \ + OP(XKB_KEY_I, LSHIFT(Key_I)) \ + OP(XKB_KEY_ISO_Left_Tab, LSHIFT(Key_Tab)) /* XKB_KEY_ISO_Left_Tab */ \ + OP(XKB_KEY_ISO_Level3_Shift, Key_RightAlt) /* XKB_KEY_ISO_Level3_Shift */ \ + OP(XKB_KEY_Insert, Key_Insert) /* XKB_KEY_Insert, Insert, insert here */ \ + OP(XKB_KEY_J, LSHIFT(Key_J)) \ + OP(XKB_KEY_K, LSHIFT(Key_K)) \ + OP(XKB_KEY_KP_0, LSHIFT(Key_Keypad0)) /* XKB_KEY_KP_0 */ \ + OP(XKB_KEY_KP_1, LSHIFT(Key_Keypad1)) /* XKB_KEY_KP_1 */ \ + OP(XKB_KEY_KP_2, LSHIFT(Key_Keypad2)) /* XKB_KEY_KP_2 */ \ + OP(XKB_KEY_KP_3, LSHIFT(Key_Keypad3)) /* XKB_KEY_KP_3 */ \ + OP(XKB_KEY_KP_4, LSHIFT(Key_Keypad4)) /* XKB_KEY_KP_4 */ \ + OP(XKB_KEY_KP_5, LSHIFT(Key_Keypad5)) /* XKB_KEY_KP_5 */ \ + OP(XKB_KEY_KP_6, LSHIFT(Key_Keypad6)) /* XKB_KEY_KP_6 */ \ + OP(XKB_KEY_KP_7, LSHIFT(Key_Keypad7)) /* XKB_KEY_KP_7 */ \ + OP(XKB_KEY_KP_8, LSHIFT(Key_Keypad8)) /* XKB_KEY_KP_8 */ \ + OP(XKB_KEY_KP_9, LSHIFT(Key_Keypad9)) /* XKB_KEY_KP_9 */ \ + OP(XKB_KEY_KP_Add, Key_KeypadAdd) /* XKB_KEY_KP_Add */ \ + OP(XKB_KEY_KP_Begin, Key_Keypad5) /* XKB_KEY_KP_Begin */ \ + OP(XKB_KEY_KP_Delete, Key_KeypadDot) /* XKB_KEY_KP_Delete */ \ + OP(XKB_KEY_KP_Divide, Key_KeypadDivide) /* XKB_KEY_KP_Divide */ \ + OP(XKB_KEY_KP_Down, Key_Keypad2) /* XKB_KEY_KP_Down */ \ + OP(XKB_KEY_KP_End, Key_Keypad1) /* XKB_KEY_KP_End */ \ + OP(XKB_KEY_KP_Enter, Key_KeypadEnter) /* XKB_KEY_KP_Enter, Enter */ \ + OP(XKB_KEY_KP_Home, Key_Keypad7) /* XKB_KEY_KP_Home */ \ + OP(XKB_KEY_KP_Insert, Key_Keypad0) /* XKB_KEY_KP_Insert */ \ + OP(XKB_KEY_KP_Left, Key_Keypad4) /* XKB_KEY_KP_Left */ \ + OP(XKB_KEY_KP_Multiply, Key_KeypadMultiply) /* XKB_KEY_KP_Multiply */ \ + OP(XKB_KEY_KP_Next, Key_Keypad3) /* XKB_KEY_KP_Next */ \ + OP(XKB_KEY_KP_Prior, Key_Keypad9) /* XKB_KEY_KP_Prior */ \ + OP(XKB_KEY_KP_Right, Key_Keypad6) /* XKB_KEY_KP_Right */ \ + OP(XKB_KEY_KP_Separator, LSHIFT(Key_KeypadDot)) /* XKB_KEY_KP_Separator, Separator, often comma */ \ + OP(XKB_KEY_KP_Subtract, Key_KeypadSubtract) /* XKB_KEY_KP_Subtract */ \ + OP(XKB_KEY_KP_Up, Key_Keypad8) /* XKB_KEY_KP_Up */ \ + OP(XKB_KEY_L, LSHIFT(Key_L)) \ + OP(XKB_KEY_Left, Key_LeftArrow) /* XKB_KEY_Left, Move left, left arrow */ \ + OP(XKB_KEY_Lstroke, RALT(LSHIFT(Key_W))) \ + OP(XKB_KEY_M, LSHIFT(Key_M)) \ + OP(XKB_KEY_Menu, Key_PcApplication) /* XKB_KEY_Menu */ \ + OP(XKB_KEY_Meta_L, LSHIFT(Key_LeftAlt)) /* XKB_KEY_Meta_L, Left meta */ \ + OP(XKB_KEY_N, LSHIFT(Key_N)) \ + OP(XKB_KEY_Next, Key_PageDown) /* XKB_KEY_Next, Next */ \ + OP(XKB_KEY_Num_Lock, Key_KeypadNumLock) /* XKB_KEY_Num_Lock */ \ + OP(XKB_KEY_O, LSHIFT(Key_O)) \ + OP(XKB_KEY_Odiaeresis, LSHIFT(Key_Semicolon)) \ + OP(XKB_KEY_Oslash, RALT(LSHIFT(Key_O))) \ + OP(XKB_KEY_P, LSHIFT(Key_P)) \ + OP(XKB_KEY_Pause, Key_Pause) /* XKB_KEY_Pause, Pause, hold */ \ + OP(XKB_KEY_Print, Key_PrintScreen) /* XKB_KEY_Print */ \ + OP(XKB_KEY_Prior, Key_PageUp) /* XKB_KEY_Prior, Prior, previous */ \ + OP(XKB_KEY_Q, LSHIFT(Key_Q)) \ + OP(XKB_KEY_R, LSHIFT(Key_R)) \ + OP(XKB_KEY_Return, Key_Enter) /* XKB_KEY_Return, Return, enter */ \ + OP(XKB_KEY_Right, Key_RightArrow) /* XKB_KEY_Right, Move right, right arrow */ \ + OP(XKB_KEY_S, LSHIFT(Key_S)) \ + OP(XKB_KEY_Scroll_Lock, Key_ScrollLock) /* XKB_KEY_Scroll_Lock */ \ + OP(XKB_KEY_Shift_L, Key_LeftShift) /* XKB_KEY_Shift_L, Left shift */ \ + OP(XKB_KEY_Shift_R, Key_RightShift) /* XKB_KEY_Shift_R, Right shift */ \ + OP(XKB_KEY_Super_L, Key_LeftGui) /* XKB_KEY_Super_L, Left super */ \ + OP(XKB_KEY_Super_R, Key_RightGui) /* XKB_KEY_Super_R, Right super */ \ + OP(XKB_KEY_Sys_Req, LALT(Key_PrintScreen)) /* XKB_KEY_Sys_Req */ \ + OP(XKB_KEY_T, LSHIFT(Key_T)) \ + OP(XKB_KEY_THORN, RALT(LSHIFT(Key_P))) /* XKB_KEY_Thorn, deprecated */ \ + OP(XKB_KEY_Tab, Key_Tab) /* XKB_KEY_Tab */ \ + OP(XKB_KEY_Tslash, RALT(LSHIFT(Key_T))) \ + OP(XKB_KEY_U, LSHIFT(Key_U)) \ + OP(XKB_KEY_Udiaeresis, LSHIFT(Key_LeftBracket)) \ + OP(XKB_KEY_Up, Key_UpArrow) /* XKB_KEY_Up, Move up, up arrow */ \ + OP(XKB_KEY_V, LSHIFT(Key_V)) \ + OP(XKB_KEY_W, LSHIFT(Key_W)) \ + OP(XKB_KEY_X, LSHIFT(Key_X)) \ + OP(XKB_KEY_XF86ClearGrab, LCTRL(LALT(Key_KeypadMultiply))) /* XKB_KEY_XF86ClearGrab, kill application with grab */ \ + OP(XKB_KEY_XF86Next_VMode, LCTRL(LALT(Key_KeypadAdd))) /* XKB_KEY_XF86Next_VMode, next video mode available */ \ + OP(XKB_KEY_XF86Prev_VMode, LCTRL(LALT(Key_KeypadSubtract))) /* XKB_KEY_XF86Prev_VMode, prev. video mode available */ \ + OP(XKB_KEY_XF86Switch_VT_1, LCTRL(LALT(Key_F1))) /* XKB_KEY_XF86Switch_VT_1 */ \ + OP(XKB_KEY_XF86Switch_VT_10, LCTRL(LALT(Key_F10))) /* XKB_KEY_XF86Switch_VT_10 */ \ + OP(XKB_KEY_XF86Switch_VT_11, LCTRL(LALT(Key_F11))) /* XKB_KEY_XF86Switch_VT_11 */ \ + OP(XKB_KEY_XF86Switch_VT_12, LCTRL(LALT(Key_F12))) /* XKB_KEY_XF86Switch_VT_12 */ \ + OP(XKB_KEY_XF86Switch_VT_2, LCTRL(LALT(Key_F2))) /* XKB_KEY_XF86Switch_VT_2 */ \ + OP(XKB_KEY_XF86Switch_VT_3, LCTRL(LALT(Key_F3))) /* XKB_KEY_XF86Switch_VT_3 */ \ + OP(XKB_KEY_XF86Switch_VT_4, LCTRL(LALT(Key_F4))) /* XKB_KEY_XF86Switch_VT_4 */ \ + OP(XKB_KEY_XF86Switch_VT_5, LCTRL(LALT(Key_F5))) /* XKB_KEY_XF86Switch_VT_5 */ \ + OP(XKB_KEY_XF86Switch_VT_6, LCTRL(LALT(Key_F6))) /* XKB_KEY_XF86Switch_VT_6 */ \ + OP(XKB_KEY_XF86Switch_VT_7, LCTRL(LALT(Key_F7))) /* XKB_KEY_XF86Switch_VT_7 */ \ + OP(XKB_KEY_XF86Switch_VT_8, LCTRL(LALT(Key_F8))) /* XKB_KEY_XF86Switch_VT_8 */ \ + OP(XKB_KEY_XF86Switch_VT_9, LCTRL(LALT(Key_F9))) /* XKB_KEY_XF86Switch_VT_9 */ \ + OP(XKB_KEY_XF86Ungrab, LCTRL(LALT(Key_KeypadDivide))) /* XKB_KEY_XF86Ungrab, force ungrab */ \ + OP(XKB_KEY_Y, LSHIFT(Key_Z)) \ + OP(XKB_KEY_Z, LSHIFT(Key_Y)) \ + OP(XKB_KEY_a, Key_A) \ + OP(XKB_KEY_adiaeresis, Key_Quote) \ + OP(XKB_KEY_ae, RALT(Key_A)) \ + OP(XKB_KEY_ampersand, LSHIFT(Key_6)) \ + OP(XKB_KEY_apostrophe, LSHIFT(Key_NonUsPound)) /* XKB_KEY_quoteright, deprecated */ \ + OP(XKB_KEY_asciitilde, RALT(Key_RightBracket)) \ + OP(XKB_KEY_asterisk, LSHIFT(Key_RightBracket)) \ + OP(XKB_KEY_at, RALT(Key_Q)) \ + OP(XKB_KEY_b, Key_B) \ + OP(XKB_KEY_backslash, RALT(Key_Minus)) \ + OP(XKB_KEY_bar, RALT(Key_NonUsBackslashAndPipe)) \ + OP(XKB_KEY_braceleft, RALT(Key_7)) \ + OP(XKB_KEY_braceright, RALT(Key_0)) \ + OP(XKB_KEY_bracketleft, RALT(Key_8)) \ + OP(XKB_KEY_bracketright, RALT(Key_9)) \ + OP(XKB_KEY_c, Key_C) \ + OP(XKB_KEY_cent, RALT(Key_C)) \ + OP(XKB_KEY_colon, LSHIFT(Key_Period)) \ + OP(XKB_KEY_comma, Key_Comma) \ + OP(XKB_KEY_copyright, RALT(LSHIFT(Key_C))) \ + OP(XKB_KEY_currency, RALT(LSHIFT(Key_4))) \ + OP(XKB_KEY_d, Key_D) \ + OP(XKB_KEY_dead_abovedot, RALT(LSHIFT(Key_J))) /* XKB_KEY_dead_abovedot */ \ + OP(XKB_KEY_dead_abovering, RALT(LSHIFT(Key_LeftBracket))) /* XKB_KEY_dead_abovering */ \ + OP(XKB_KEY_dead_acute, Key_Equals) /* XKB_KEY_dead_acute */ \ + OP(XKB_KEY_dead_belowdot, RALT(Key_J)) /* XKB_KEY_dead_belowdot */ \ + OP(XKB_KEY_dead_belowmacron, RALT(LSHIFT(Key_NonUsBackslashAndPipe))) /* XKB_KEY_dead_belowmacron */ \ + OP(XKB_KEY_dead_breve, RALT(LSHIFT(Key_NonUsPound))) /* XKB_KEY_dead_breve */ \ + OP(XKB_KEY_dead_caron, RALT(LSHIFT(Key_Quote))) /* XKB_KEY_dead_caron */ \ + OP(XKB_KEY_dead_cedilla, RALT(Key_Equals)) /* XKB_KEY_dead_cedilla */ \ + OP(XKB_KEY_dead_circumflex, Key_Backtick) /* XKB_KEY_dead_circumflex */ \ + OP(XKB_KEY_dead_diaeresis, RALT(Key_LeftBracket)) /* XKB_KEY_dead_diaeresis */ \ + OP(XKB_KEY_dead_doubleacute, RALT(Key_Semicolon)) /* XKB_KEY_dead_doubleacute */ \ + OP(XKB_KEY_dead_grave, LSHIFT(Key_Equals)) /* XKB_KEY_dead_grave */ \ + OP(XKB_KEY_dead_ogonek, RALT(LSHIFT(Key_Equals))) /* XKB_KEY_dead_ogonek */ \ + OP(XKB_KEY_degree, LSHIFT(Key_Backtick)) \ + OP(XKB_KEY_division, RALT(LSHIFT(Key_Period))) \ + OP(XKB_KEY_dollar, LSHIFT(Key_4)) \ + OP(XKB_KEY_doublelowquotemark, RALT(Key_V)) \ + OP(XKB_KEY_downarrow, RALT(Key_U)) \ + OP(XKB_KEY_dstroke, RALT(Key_F)) \ + OP(XKB_KEY_e, Key_E) \ + OP(XKB_KEY_emdash, RALT(LSHIFT(Key_Slash))) \ + OP(XKB_KEY_endash, RALT(Key_Slash)) \ + OP(XKB_KEY_eng, RALT(Key_G)) \ + OP(XKB_KEY_equal, LSHIFT(Key_0)) \ + OP(XKB_KEY_eth, RALT(Key_D)) \ + OP(XKB_KEY_exclam, LSHIFT(Key_1)) \ + OP(XKB_KEY_exclamdown, RALT(LSHIFT(Key_1))) \ + OP(XKB_KEY_f, Key_F) \ + OP(XKB_KEY_fiveeighths, RALT(LSHIFT(Key_6))) \ + OP(XKB_KEY_g, Key_G) \ + OP(XKB_KEY_greater, LSHIFT(Key_NonUsBackslashAndPipe)) \ + OP(XKB_KEY_guillemotleft, RALT(Key_X)) \ + OP(XKB_KEY_guillemotright, RALT(Key_Z)) \ + OP(XKB_KEY_h, Key_H) \ + OP(XKB_KEY_hstroke, RALT(Key_H)) \ + OP(XKB_KEY_i, Key_I) \ + OP(XKB_KEY_idotless, RALT(LSHIFT(Key_I))) \ + OP(XKB_KEY_j, Key_J) \ + OP(XKB_KEY_k, Key_K) \ + OP(XKB_KEY_kra, RALT(Key_K)) /* XKB_KEY_kappa, deprecated */ \ + OP(XKB_KEY_l, Key_L) \ + OP(XKB_KEY_leftarrow, RALT(Key_Y)) \ + OP(XKB_KEY_leftdoublequotemark, RALT(Key_B)) \ + OP(XKB_KEY_leftsinglequotemark, RALT(LSHIFT(Key_B))) \ + OP(XKB_KEY_less, Key_NonUsBackslashAndPipe) \ + OP(XKB_KEY_lstroke, RALT(Key_W)) \ + OP(XKB_KEY_m, Key_M) \ + OP(XKB_KEY_macron, RALT(LSHIFT(Key_RightBracket))) \ + OP(XKB_KEY_masculine, RALT(LSHIFT(Key_M))) \ + OP(XKB_KEY_minus, Key_Slash) \ + OP(XKB_KEY_mu, RALT(Key_M)) \ + OP(XKB_KEY_multiply, RALT(LSHIFT(Key_Comma))) \ + OP(XKB_KEY_n, Key_N) \ + OP(XKB_KEY_notsign, RALT(Key_6)) \ + OP(XKB_KEY_numbersign, Key_NonUsPound) \ + OP(XKB_KEY_o, Key_O) \ + OP(XKB_KEY_odiaeresis, Key_Semicolon) \ + OP(XKB_KEY_oneeighth, RALT(LSHIFT(Key_2))) \ + OP(XKB_KEY_onehalf, RALT(Key_5)) \ + OP(XKB_KEY_onequarter, RALT(Key_4)) \ + OP(XKB_KEY_onesuperior, RALT(Key_1)) \ + OP(XKB_KEY_ordfeminine, RALT(LSHIFT(Key_F))) \ + OP(XKB_KEY_oslash, RALT(Key_O)) \ + OP(XKB_KEY_p, Key_P) \ + OP(XKB_KEY_paragraph, RALT(Key_R)) \ + OP(XKB_KEY_parenleft, LSHIFT(Key_8)) \ + OP(XKB_KEY_parenright, LSHIFT(Key_9)) \ + OP(XKB_KEY_percent, LSHIFT(Key_5)) \ + OP(XKB_KEY_period, Key_Period) \ + OP(XKB_KEY_periodcentered, RALT(Key_Comma)) \ + OP(XKB_KEY_plus, Key_RightBracket) \ + OP(XKB_KEY_plusminus, RALT(LSHIFT(Key_9))) \ + OP(XKB_KEY_q, Key_Q) \ + OP(XKB_KEY_question, LSHIFT(Key_Minus)) \ + OP(XKB_KEY_questiondown, RALT(LSHIFT(Key_Minus))) \ + OP(XKB_KEY_quotedbl, LSHIFT(Key_2)) \ + OP(XKB_KEY_r, Key_R) \ + OP(XKB_KEY_registered, RALT(LSHIFT(Key_R))) \ + OP(XKB_KEY_rightarrow, RALT(Key_I)) \ + OP(XKB_KEY_rightdoublequotemark, RALT(Key_N)) \ + OP(XKB_KEY_rightsinglequotemark, RALT(Key_NonUsPound)) \ + OP(XKB_KEY_s, Key_S) \ + OP(XKB_KEY_section, LSHIFT(Key_3)) \ + OP(XKB_KEY_semicolon, LSHIFT(Key_Comma)) \ + OP(XKB_KEY_seveneighths, RALT(LSHIFT(Key_7))) \ + OP(XKB_KEY_singlelowquotemark, RALT(LSHIFT(Key_V))) \ + OP(XKB_KEY_slash, LSHIFT(Key_7)) \ + OP(XKB_KEY_space, Key_Spacebar) \ + OP(XKB_KEY_ssharp, Key_Minus) \ + OP(XKB_KEY_sterling, RALT(LSHIFT(Key_3))) \ + OP(XKB_KEY_t, Key_T) \ + OP(XKB_KEY_thorn, RALT(Key_P)) \ + OP(XKB_KEY_threeeighths, RALT(LSHIFT(Key_5))) \ + OP(XKB_KEY_threesuperior, RALT(Key_3)) \ + OP(XKB_KEY_trademark, RALT(LSHIFT(Key_8))) \ + OP(XKB_KEY_tslash, RALT(Key_T)) \ + OP(XKB_KEY_twosuperior, RALT(Key_2)) \ + OP(XKB_KEY_u, Key_U) \ + OP(XKB_KEY_udiaeresis, Key_LeftBracket) \ + OP(XKB_KEY_underscore, LSHIFT(Key_Slash)) \ + OP(XKB_KEY_uparrow, RALT(LSHIFT(Key_U))) \ + OP(XKB_KEY_v, Key_V) \ + OP(XKB_KEY_w, Key_W) \ + OP(XKB_KEY_x, Key_X) \ + OP(XKB_KEY_y, Key_Z) \ + OP(XKB_KEY_yen, RALT(LSHIFT(Key_Y))) \ + OP(XKB_KEY_z, Key_Y) \ + + +namespace kaleidoscope { +namespace host_keymap { +namespace linux { +namespace de { +namespace standard { + +HOST_KEYMAP_LINUX( + _HOST_KEYMAP_ASCII, + _HOST_KEYMAP_UNICODE, + _HOST_KEYMAP_NON_PRINTABLE +) + +} // namespace standard +} // namespace de +} // namespace linux +} // namespace host_keymap +} // namespace kaleidoscope + +#undef _HOST_KEYMAP_ASCII +#undef _HOST_KEYMAP_UNICODE +#undef _HOST_KEYMAP_NON_PRINTABLE + diff --git a/src/kaleidoscope/host_keymap/linux/us/standard/keymap.h b/src/kaleidoscope/host_keymap/linux/us/standard/keymap.h new file mode 100644 index 0000000000..0298e9cc7a --- /dev/null +++ b/src/kaleidoscope/host_keymap/linux/us/standard/keymap.h @@ -0,0 +1,439 @@ +/* Kaleidoscope - Firmware for computer input devices + * Copyright (C) 2013-2019 Keyboard.io, Inc. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +#include "kaleidoscope/host_keymap/linux.h" + +// This file was autogenerated by host_keymap. +// Its content is based on information provided by the XKB X11 system +// collected with the extraordinary libxkbcommon. + +// layout: us +// variant: standard + +#define _HOST_KEYMAP_ASCII(OP) \ + OP('\b', Key_Backspace) /* XKB_KEY_BackSpace, Back space, back char */ \ + OP('\t', Key_Tab) /* XKB_KEY_Tab */ \ + OP('\r', Key_Enter) /* XKB_KEY_Return, Return, enter */ \ + OP('\e', Key_Escape) /* XKB_KEY_Escape */ \ + OP(' ', Key_Spacebar) /* U+0020, XKB_KEY_space, SPACE */ \ + OP('!', LSHIFT(Key_1)) /* U+0021, XKB_KEY_exclam, EXCLAMATION MARK */ \ + OP('"', LSHIFT(Key_Quote)) /* U+0022, XKB_KEY_quotedbl, QUOTATION MARK */ \ + OP('#', LSHIFT(Key_3)) /* U+0023, XKB_KEY_numbersign, NUMBER SIGN */ \ + OP('$', LSHIFT(Key_4)) /* U+0024, XKB_KEY_dollar, DOLLAR SIGN */ \ + OP('%', LSHIFT(Key_5)) /* U+0025, XKB_KEY_percent, PERCENT SIGN */ \ + OP('&', LSHIFT(Key_7)) /* U+0026, XKB_KEY_ampersand, AMPERSAND */ \ + OP('\'', Key_Quote) /* U+0027, XKB_KEY_apostrophe, APOSTROPHE */ \ + OP('(', LSHIFT(Key_9)) /* U+0028, XKB_KEY_parenleft, LEFT PARENTHESIS */ \ + OP(')', LSHIFT(Key_0)) /* U+0029, XKB_KEY_parenright, RIGHT PARENTHESIS */ \ + OP('*', Key_KeypadMultiply) /* XKB_KEY_KP_Multiply */ \ + OP('+', Key_KeypadAdd) /* XKB_KEY_KP_Add */ \ + OP(',', Key_Comma) /* U+002c, XKB_KEY_comma, COMMA */ \ + OP('-', Key_Minus) /* U+002d, XKB_KEY_minus, HYPHEN-MINUS */ \ + OP('.', Key_Period) /* U+002e, XKB_KEY_period, FULL STOP */ \ + OP('/', Key_Slash) /* U+002f, XKB_KEY_slash, SOLIDUS */ \ + OP('0', Key_0) /* U+0030, XKB_KEY_0, DIGIT ZERO */ \ + OP('1', Key_1) /* U+0031, XKB_KEY_1, DIGIT ONE */ \ + OP('2', Key_2) /* U+0032, XKB_KEY_2, DIGIT TWO */ \ + OP('3', Key_3) /* U+0033, XKB_KEY_3, DIGIT THREE */ \ + OP('4', Key_4) /* U+0034, XKB_KEY_4, DIGIT FOUR */ \ + OP('5', Key_5) /* U+0035, XKB_KEY_5, DIGIT FIVE */ \ + OP('6', Key_6) /* U+0036, XKB_KEY_6, DIGIT SIX */ \ + OP('7', Key_7) /* U+0037, XKB_KEY_7, DIGIT SEVEN */ \ + OP('8', Key_8) /* U+0038, XKB_KEY_8, DIGIT EIGHT */ \ + OP('9', Key_9) /* U+0039, XKB_KEY_9, DIGIT NINE */ \ + OP(':', LSHIFT(Key_Semicolon)) /* U+003a, XKB_KEY_colon, COLON */ \ + OP(';', Key_Semicolon) /* U+003b, XKB_KEY_semicolon, SEMICOLON */ \ + OP('<', Key_NonUsBackslashAndPipe) /* U+003c, XKB_KEY_less, LESS-THAN SIGN */ \ + OP('=', Key_Equals) /* U+003d, XKB_KEY_equal, EQUALS SIGN */ \ + OP('>', LSHIFT(Key_Period)) /* U+003e, XKB_KEY_greater, GREATER-THAN SIGN */ \ + OP('?', LSHIFT(Key_Slash)) /* U+003f, XKB_KEY_question, QUESTION MARK */ \ + OP('@', LSHIFT(Key_2)) /* U+0040, XKB_KEY_at, COMMERCIAL AT */ \ + OP('A', LSHIFT(Key_A)) /* U+0041, XKB_KEY_A, LATIN CAPITAL LETTER A */ \ + OP('B', LSHIFT(Key_B)) /* U+0042, XKB_KEY_B, LATIN CAPITAL LETTER B */ \ + OP('C', LSHIFT(Key_C)) /* U+0043, XKB_KEY_C, LATIN CAPITAL LETTER C */ \ + OP('D', LSHIFT(Key_D)) /* U+0044, XKB_KEY_D, LATIN CAPITAL LETTER D */ \ + OP('E', LSHIFT(Key_E)) /* U+0045, XKB_KEY_E, LATIN CAPITAL LETTER E */ \ + OP('F', LSHIFT(Key_F)) /* U+0046, XKB_KEY_F, LATIN CAPITAL LETTER F */ \ + OP('G', LSHIFT(Key_G)) /* U+0047, XKB_KEY_G, LATIN CAPITAL LETTER G */ \ + OP('H', LSHIFT(Key_H)) /* U+0048, XKB_KEY_H, LATIN CAPITAL LETTER H */ \ + OP('I', LSHIFT(Key_I)) /* U+0049, XKB_KEY_I, LATIN CAPITAL LETTER I */ \ + OP('J', LSHIFT(Key_J)) /* U+004a, XKB_KEY_J, LATIN CAPITAL LETTER J */ \ + OP('K', LSHIFT(Key_K)) /* U+004b, XKB_KEY_K, LATIN CAPITAL LETTER K */ \ + OP('L', LSHIFT(Key_L)) /* U+004c, XKB_KEY_L, LATIN CAPITAL LETTER L */ \ + OP('M', LSHIFT(Key_M)) /* U+004d, XKB_KEY_M, LATIN CAPITAL LETTER M */ \ + OP('N', LSHIFT(Key_N)) /* U+004e, XKB_KEY_N, LATIN CAPITAL LETTER N */ \ + OP('O', LSHIFT(Key_O)) /* U+004f, XKB_KEY_O, LATIN CAPITAL LETTER O */ \ + OP('P', LSHIFT(Key_P)) /* U+0050, XKB_KEY_P, LATIN CAPITAL LETTER P */ \ + OP('Q', LSHIFT(Key_Q)) /* U+0051, XKB_KEY_Q, LATIN CAPITAL LETTER Q */ \ + OP('R', LSHIFT(Key_R)) /* U+0052, XKB_KEY_R, LATIN CAPITAL LETTER R */ \ + OP('S', LSHIFT(Key_S)) /* U+0053, XKB_KEY_S, LATIN CAPITAL LETTER S */ \ + OP('T', LSHIFT(Key_T)) /* U+0054, XKB_KEY_T, LATIN CAPITAL LETTER T */ \ + OP('U', LSHIFT(Key_U)) /* U+0055, XKB_KEY_U, LATIN CAPITAL LETTER U */ \ + OP('V', LSHIFT(Key_V)) /* U+0056, XKB_KEY_V, LATIN CAPITAL LETTER V */ \ + OP('W', LSHIFT(Key_W)) /* U+0057, XKB_KEY_W, LATIN CAPITAL LETTER W */ \ + OP('X', LSHIFT(Key_X)) /* U+0058, XKB_KEY_X, LATIN CAPITAL LETTER X */ \ + OP('Y', LSHIFT(Key_Y)) /* U+0059, XKB_KEY_Y, LATIN CAPITAL LETTER Y */ \ + OP('Z', LSHIFT(Key_Z)) /* U+005a, XKB_KEY_Z, LATIN CAPITAL LETTER Z */ \ + OP('[', Key_LeftBracket) /* U+005b, XKB_KEY_bracketleft, LEFT SQUARE BRACKET */ \ + OP('\\', Key_NonUsPound) /* U+005c, XKB_KEY_backslash, REVERSE SOLIDUS */ \ + OP(']', Key_RightBracket) /* U+005d, XKB_KEY_bracketright, RIGHT SQUARE BRACKET */ \ + OP('^', LSHIFT(Key_6)) /* U+005e, XKB_KEY_asciicircum, CIRCUMFLEX ACCENT */ \ + OP('_', LSHIFT(Key_Minus)) /* U+005f, XKB_KEY_underscore, LOW LINE */ \ + OP('`', Key_Backtick) /* U+0060, XKB_KEY_grave, GRAVE ACCENT */ \ + OP('a', Key_A) /* U+0061, XKB_KEY_a, LATIN SMALL LETTER A */ \ + OP('b', Key_B) /* U+0062, XKB_KEY_b, LATIN SMALL LETTER B */ \ + OP('c', Key_C) /* U+0063, XKB_KEY_c, LATIN SMALL LETTER C */ \ + OP('d', Key_D) /* U+0064, XKB_KEY_d, LATIN SMALL LETTER D */ \ + OP('e', Key_E) /* U+0065, XKB_KEY_e, LATIN SMALL LETTER E */ \ + OP('f', Key_F) /* U+0066, XKB_KEY_f, LATIN SMALL LETTER F */ \ + OP('g', Key_G) /* U+0067, XKB_KEY_g, LATIN SMALL LETTER G */ \ + OP('h', Key_H) /* U+0068, XKB_KEY_h, LATIN SMALL LETTER H */ \ + OP('i', Key_I) /* U+0069, XKB_KEY_i, LATIN SMALL LETTER I */ \ + OP('j', Key_J) /* U+006a, XKB_KEY_j, LATIN SMALL LETTER J */ \ + OP('k', Key_K) /* U+006b, XKB_KEY_k, LATIN SMALL LETTER K */ \ + OP('l', Key_L) /* U+006c, XKB_KEY_l, LATIN SMALL LETTER L */ \ + OP('m', Key_M) /* U+006d, XKB_KEY_m, LATIN SMALL LETTER M */ \ + OP('n', Key_N) /* U+006e, XKB_KEY_n, LATIN SMALL LETTER N */ \ + OP('o', Key_O) /* U+006f, XKB_KEY_o, LATIN SMALL LETTER O */ \ + OP('p', Key_P) /* U+0070, XKB_KEY_p, LATIN SMALL LETTER P */ \ + OP('q', Key_Q) /* U+0071, XKB_KEY_q, LATIN SMALL LETTER Q */ \ + OP('r', Key_R) /* U+0072, XKB_KEY_r, LATIN SMALL LETTER R */ \ + OP('s', Key_S) /* U+0073, XKB_KEY_s, LATIN SMALL LETTER S */ \ + OP('t', Key_T) /* U+0074, XKB_KEY_t, LATIN SMALL LETTER T */ \ + OP('u', Key_U) /* U+0075, XKB_KEY_u, LATIN SMALL LETTER U */ \ + OP('v', Key_V) /* U+0076, XKB_KEY_v, LATIN SMALL LETTER V */ \ + OP('w', Key_W) /* U+0077, XKB_KEY_w, LATIN SMALL LETTER W */ \ + OP('x', Key_X) /* U+0078, XKB_KEY_x, LATIN SMALL LETTER X */ \ + OP('y', Key_Y) /* U+0079, XKB_KEY_y, LATIN SMALL LETTER Y */ \ + OP('z', Key_Z) /* U+007a, XKB_KEY_z, LATIN SMALL LETTER Z */ \ + OP('{', LSHIFT(Key_LeftBracket)) /* U+007b, XKB_KEY_braceleft, LEFT CURLY BRACKET */ \ + OP('|', LSHIFT(Key_NonUsPound)) /* U+007c, XKB_KEY_bar, VERTICAL LINE */ \ + OP('}', LSHIFT(Key_RightBracket)) /* U+007d, XKB_KEY_braceright, RIGHT CURLY BRACKET */ \ + OP('~', LSHIFT(Key_Backtick)) /* U+007e, XKB_KEY_asciitilde, TILDE */ \ + OP('', Key_Delete) /* XKB_KEY_Delete, Delete, rubout */ \ + +#define _HOST_KEYMAP_UNICODE(OP) \ + OP(L'\b', Key_Backspace) /* XKB_KEY_BackSpace, Back space, back char */ \ + OP(L'\t', Key_Tab) /* XKB_KEY_Tab */ \ + OP(L'\r', Key_Enter) /* XKB_KEY_Return, Return, enter */ \ + OP(L'\e', Key_Escape) /* XKB_KEY_Escape */ \ + OP(L' ', Key_Spacebar) /* U+0020, XKB_KEY_space, SPACE */ \ + OP(L'!', LSHIFT(Key_1)) /* U+0021, XKB_KEY_exclam, EXCLAMATION MARK */ \ + OP(L'"', LSHIFT(Key_Quote)) /* U+0022, XKB_KEY_quotedbl, QUOTATION MARK */ \ + OP(L'#', LSHIFT(Key_3)) /* U+0023, XKB_KEY_numbersign, NUMBER SIGN */ \ + OP(L'$', LSHIFT(Key_4)) /* U+0024, XKB_KEY_dollar, DOLLAR SIGN */ \ + OP(L'%', LSHIFT(Key_5)) /* U+0025, XKB_KEY_percent, PERCENT SIGN */ \ + OP(L'&', LSHIFT(Key_7)) /* U+0026, XKB_KEY_ampersand, AMPERSAND */ \ + OP(L'\'', Key_Quote) /* U+0027, XKB_KEY_apostrophe, APOSTROPHE */ \ + OP(L'(', LSHIFT(Key_9)) /* U+0028, XKB_KEY_parenleft, LEFT PARENTHESIS */ \ + OP(L')', LSHIFT(Key_0)) /* U+0029, XKB_KEY_parenright, RIGHT PARENTHESIS */ \ + OP(L'*', Key_KeypadMultiply) /* XKB_KEY_KP_Multiply */ \ + OP(L'+', Key_KeypadAdd) /* XKB_KEY_KP_Add */ \ + OP(L',', Key_Comma) /* U+002c, XKB_KEY_comma, COMMA */ \ + OP(L'-', Key_Minus) /* U+002d, XKB_KEY_minus, HYPHEN-MINUS */ \ + OP(L'.', Key_Period) /* U+002e, XKB_KEY_period, FULL STOP */ \ + OP(L'/', Key_Slash) /* U+002f, XKB_KEY_slash, SOLIDUS */ \ + OP(L'0', Key_0) /* U+0030, XKB_KEY_0, DIGIT ZERO */ \ + OP(L'1', Key_1) /* U+0031, XKB_KEY_1, DIGIT ONE */ \ + OP(L'2', Key_2) /* U+0032, XKB_KEY_2, DIGIT TWO */ \ + OP(L'3', Key_3) /* U+0033, XKB_KEY_3, DIGIT THREE */ \ + OP(L'4', Key_4) /* U+0034, XKB_KEY_4, DIGIT FOUR */ \ + OP(L'5', Key_5) /* U+0035, XKB_KEY_5, DIGIT FIVE */ \ + OP(L'6', Key_6) /* U+0036, XKB_KEY_6, DIGIT SIX */ \ + OP(L'7', Key_7) /* U+0037, XKB_KEY_7, DIGIT SEVEN */ \ + OP(L'8', Key_8) /* U+0038, XKB_KEY_8, DIGIT EIGHT */ \ + OP(L'9', Key_9) /* U+0039, XKB_KEY_9, DIGIT NINE */ \ + OP(L':', LSHIFT(Key_Semicolon)) /* U+003a, XKB_KEY_colon, COLON */ \ + OP(L';', Key_Semicolon) /* U+003b, XKB_KEY_semicolon, SEMICOLON */ \ + OP(L'<', Key_NonUsBackslashAndPipe) /* U+003c, XKB_KEY_less, LESS-THAN SIGN */ \ + OP(L'=', Key_Equals) /* U+003d, XKB_KEY_equal, EQUALS SIGN */ \ + OP(L'>', LSHIFT(Key_Period)) /* U+003e, XKB_KEY_greater, GREATER-THAN SIGN */ \ + OP(L'?', LSHIFT(Key_Slash)) /* U+003f, XKB_KEY_question, QUESTION MARK */ \ + OP(L'@', LSHIFT(Key_2)) /* U+0040, XKB_KEY_at, COMMERCIAL AT */ \ + OP(L'A', LSHIFT(Key_A)) /* U+0041, XKB_KEY_A, LATIN CAPITAL LETTER A */ \ + OP(L'B', LSHIFT(Key_B)) /* U+0042, XKB_KEY_B, LATIN CAPITAL LETTER B */ \ + OP(L'C', LSHIFT(Key_C)) /* U+0043, XKB_KEY_C, LATIN CAPITAL LETTER C */ \ + OP(L'D', LSHIFT(Key_D)) /* U+0044, XKB_KEY_D, LATIN CAPITAL LETTER D */ \ + OP(L'E', LSHIFT(Key_E)) /* U+0045, XKB_KEY_E, LATIN CAPITAL LETTER E */ \ + OP(L'F', LSHIFT(Key_F)) /* U+0046, XKB_KEY_F, LATIN CAPITAL LETTER F */ \ + OP(L'G', LSHIFT(Key_G)) /* U+0047, XKB_KEY_G, LATIN CAPITAL LETTER G */ \ + OP(L'H', LSHIFT(Key_H)) /* U+0048, XKB_KEY_H, LATIN CAPITAL LETTER H */ \ + OP(L'I', LSHIFT(Key_I)) /* U+0049, XKB_KEY_I, LATIN CAPITAL LETTER I */ \ + OP(L'J', LSHIFT(Key_J)) /* U+004a, XKB_KEY_J, LATIN CAPITAL LETTER J */ \ + OP(L'K', LSHIFT(Key_K)) /* U+004b, XKB_KEY_K, LATIN CAPITAL LETTER K */ \ + OP(L'L', LSHIFT(Key_L)) /* U+004c, XKB_KEY_L, LATIN CAPITAL LETTER L */ \ + OP(L'M', LSHIFT(Key_M)) /* U+004d, XKB_KEY_M, LATIN CAPITAL LETTER M */ \ + OP(L'N', LSHIFT(Key_N)) /* U+004e, XKB_KEY_N, LATIN CAPITAL LETTER N */ \ + OP(L'O', LSHIFT(Key_O)) /* U+004f, XKB_KEY_O, LATIN CAPITAL LETTER O */ \ + OP(L'P', LSHIFT(Key_P)) /* U+0050, XKB_KEY_P, LATIN CAPITAL LETTER P */ \ + OP(L'Q', LSHIFT(Key_Q)) /* U+0051, XKB_KEY_Q, LATIN CAPITAL LETTER Q */ \ + OP(L'R', LSHIFT(Key_R)) /* U+0052, XKB_KEY_R, LATIN CAPITAL LETTER R */ \ + OP(L'S', LSHIFT(Key_S)) /* U+0053, XKB_KEY_S, LATIN CAPITAL LETTER S */ \ + OP(L'T', LSHIFT(Key_T)) /* U+0054, XKB_KEY_T, LATIN CAPITAL LETTER T */ \ + OP(L'U', LSHIFT(Key_U)) /* U+0055, XKB_KEY_U, LATIN CAPITAL LETTER U */ \ + OP(L'V', LSHIFT(Key_V)) /* U+0056, XKB_KEY_V, LATIN CAPITAL LETTER V */ \ + OP(L'W', LSHIFT(Key_W)) /* U+0057, XKB_KEY_W, LATIN CAPITAL LETTER W */ \ + OP(L'X', LSHIFT(Key_X)) /* U+0058, XKB_KEY_X, LATIN CAPITAL LETTER X */ \ + OP(L'Y', LSHIFT(Key_Y)) /* U+0059, XKB_KEY_Y, LATIN CAPITAL LETTER Y */ \ + OP(L'Z', LSHIFT(Key_Z)) /* U+005a, XKB_KEY_Z, LATIN CAPITAL LETTER Z */ \ + OP(L'[', Key_LeftBracket) /* U+005b, XKB_KEY_bracketleft, LEFT SQUARE BRACKET */ \ + OP(L'\\', Key_NonUsPound) /* U+005c, XKB_KEY_backslash, REVERSE SOLIDUS */ \ + OP(L']', Key_RightBracket) /* U+005d, XKB_KEY_bracketright, RIGHT SQUARE BRACKET */ \ + OP(L'^', LSHIFT(Key_6)) /* U+005e, XKB_KEY_asciicircum, CIRCUMFLEX ACCENT */ \ + OP(L'_', LSHIFT(Key_Minus)) /* U+005f, XKB_KEY_underscore, LOW LINE */ \ + OP(L'`', Key_Backtick) /* U+0060, XKB_KEY_grave, GRAVE ACCENT */ \ + OP(L'a', Key_A) /* U+0061, XKB_KEY_a, LATIN SMALL LETTER A */ \ + OP(L'b', Key_B) /* U+0062, XKB_KEY_b, LATIN SMALL LETTER B */ \ + OP(L'c', Key_C) /* U+0063, XKB_KEY_c, LATIN SMALL LETTER C */ \ + OP(L'd', Key_D) /* U+0064, XKB_KEY_d, LATIN SMALL LETTER D */ \ + OP(L'e', Key_E) /* U+0065, XKB_KEY_e, LATIN SMALL LETTER E */ \ + OP(L'f', Key_F) /* U+0066, XKB_KEY_f, LATIN SMALL LETTER F */ \ + OP(L'g', Key_G) /* U+0067, XKB_KEY_g, LATIN SMALL LETTER G */ \ + OP(L'h', Key_H) /* U+0068, XKB_KEY_h, LATIN SMALL LETTER H */ \ + OP(L'i', Key_I) /* U+0069, XKB_KEY_i, LATIN SMALL LETTER I */ \ + OP(L'j', Key_J) /* U+006a, XKB_KEY_j, LATIN SMALL LETTER J */ \ + OP(L'k', Key_K) /* U+006b, XKB_KEY_k, LATIN SMALL LETTER K */ \ + OP(L'l', Key_L) /* U+006c, XKB_KEY_l, LATIN SMALL LETTER L */ \ + OP(L'm', Key_M) /* U+006d, XKB_KEY_m, LATIN SMALL LETTER M */ \ + OP(L'n', Key_N) /* U+006e, XKB_KEY_n, LATIN SMALL LETTER N */ \ + OP(L'o', Key_O) /* U+006f, XKB_KEY_o, LATIN SMALL LETTER O */ \ + OP(L'p', Key_P) /* U+0070, XKB_KEY_p, LATIN SMALL LETTER P */ \ + OP(L'q', Key_Q) /* U+0071, XKB_KEY_q, LATIN SMALL LETTER Q */ \ + OP(L'r', Key_R) /* U+0072, XKB_KEY_r, LATIN SMALL LETTER R */ \ + OP(L's', Key_S) /* U+0073, XKB_KEY_s, LATIN SMALL LETTER S */ \ + OP(L't', Key_T) /* U+0074, XKB_KEY_t, LATIN SMALL LETTER T */ \ + OP(L'u', Key_U) /* U+0075, XKB_KEY_u, LATIN SMALL LETTER U */ \ + OP(L'v', Key_V) /* U+0076, XKB_KEY_v, LATIN SMALL LETTER V */ \ + OP(L'w', Key_W) /* U+0077, XKB_KEY_w, LATIN SMALL LETTER W */ \ + OP(L'x', Key_X) /* U+0078, XKB_KEY_x, LATIN SMALL LETTER X */ \ + OP(L'y', Key_Y) /* U+0079, XKB_KEY_y, LATIN SMALL LETTER Y */ \ + OP(L'z', Key_Z) /* U+007a, XKB_KEY_z, LATIN SMALL LETTER Z */ \ + OP(L'{', LSHIFT(Key_LeftBracket)) /* U+007b, XKB_KEY_braceleft, LEFT CURLY BRACKET */ \ + OP(L'|', LSHIFT(Key_NonUsPound)) /* U+007c, XKB_KEY_bar, VERTICAL LINE */ \ + OP(L'}', LSHIFT(Key_RightBracket)) /* U+007d, XKB_KEY_braceright, RIGHT CURLY BRACKET */ \ + OP(L'~', LSHIFT(Key_Backtick)) /* U+007e, XKB_KEY_asciitilde, TILDE */ \ + OP(L'', Key_Delete) /* XKB_KEY_Delete, Delete, rubout */ \ + +#define _HOST_KEYMAP_NON_PRINTABLE(OP) \ + OP(XKB_KEY_0, Key_0) \ + OP(XKB_KEY_1, Key_1) \ + OP(XKB_KEY_2, Key_2) \ + OP(XKB_KEY_3, Key_3) \ + OP(XKB_KEY_4, Key_4) \ + OP(XKB_KEY_5, Key_5) \ + OP(XKB_KEY_6, Key_6) \ + OP(XKB_KEY_7, Key_7) \ + OP(XKB_KEY_8, Key_8) \ + OP(XKB_KEY_9, Key_9) \ + OP(XKB_KEY_A, LSHIFT(Key_A)) \ + OP(XKB_KEY_Alt_L, Key_LeftAlt) /* XKB_KEY_Alt_L, Left alt */ \ + OP(XKB_KEY_Alt_R, Key_RightAlt) /* XKB_KEY_Alt_R, Right alt */ \ + OP(XKB_KEY_B, LSHIFT(Key_B)) \ + OP(XKB_KEY_BackSpace, Key_Backspace) /* XKB_KEY_BackSpace, Back space, back char */ \ + OP(XKB_KEY_Break, LCTRL(Key_Pause)) /* XKB_KEY_Break */ \ + OP(XKB_KEY_C, LSHIFT(Key_C)) \ + OP(XKB_KEY_Caps_Lock, Key_CapsLock) /* XKB_KEY_Caps_Lock, Caps lock */ \ + OP(XKB_KEY_Control_L, Key_LeftControl) /* XKB_KEY_Control_L, Left control */ \ + OP(XKB_KEY_Control_R, Key_RightControl) /* XKB_KEY_Control_R, Right control */ \ + OP(XKB_KEY_D, LSHIFT(Key_D)) \ + OP(XKB_KEY_Delete, Key_Delete) /* XKB_KEY_Delete, Delete, rubout */ \ + OP(XKB_KEY_Down, Key_DownArrow) /* XKB_KEY_Down, Move down, down arrow */ \ + OP(XKB_KEY_E, LSHIFT(Key_E)) \ + OP(XKB_KEY_End, Key_End) /* XKB_KEY_End, EOL */ \ + OP(XKB_KEY_Escape, Key_Escape) /* XKB_KEY_Escape */ \ + OP(XKB_KEY_F, LSHIFT(Key_F)) \ + OP(XKB_KEY_F1, Key_F1) /* XKB_KEY_F1 */ \ + OP(XKB_KEY_F10, Key_F10) /* XKB_KEY_F10 */ \ + OP(XKB_KEY_F11, Key_F11) /* XKB_KEY_F11 */ \ + OP(XKB_KEY_F12, Key_F12) /* XKB_KEY_F12 */ \ + OP(XKB_KEY_F2, Key_F2) /* XKB_KEY_F2 */ \ + OP(XKB_KEY_F3, Key_F3) /* XKB_KEY_F3 */ \ + OP(XKB_KEY_F4, Key_F4) /* XKB_KEY_F4 */ \ + OP(XKB_KEY_F5, Key_F5) /* XKB_KEY_F5 */ \ + OP(XKB_KEY_F6, Key_F6) /* XKB_KEY_F6 */ \ + OP(XKB_KEY_F7, Key_F7) /* XKB_KEY_F7 */ \ + OP(XKB_KEY_F8, Key_F8) /* XKB_KEY_F8 */ \ + OP(XKB_KEY_F9, Key_F9) /* XKB_KEY_F9 */ \ + OP(XKB_KEY_G, LSHIFT(Key_G)) \ + OP(XKB_KEY_H, LSHIFT(Key_H)) \ + OP(XKB_KEY_Home, Key_Home) /* XKB_KEY_Home */ \ + OP(XKB_KEY_I, LSHIFT(Key_I)) \ + OP(XKB_KEY_ISO_Left_Tab, LSHIFT(Key_Tab)) /* XKB_KEY_ISO_Left_Tab */ \ + OP(XKB_KEY_Insert, Key_Insert) /* XKB_KEY_Insert, Insert, insert here */ \ + OP(XKB_KEY_J, LSHIFT(Key_J)) \ + OP(XKB_KEY_K, LSHIFT(Key_K)) \ + OP(XKB_KEY_KP_0, LSHIFT(Key_Keypad0)) /* XKB_KEY_KP_0 */ \ + OP(XKB_KEY_KP_1, LSHIFT(Key_Keypad1)) /* XKB_KEY_KP_1 */ \ + OP(XKB_KEY_KP_2, LSHIFT(Key_Keypad2)) /* XKB_KEY_KP_2 */ \ + OP(XKB_KEY_KP_3, LSHIFT(Key_Keypad3)) /* XKB_KEY_KP_3 */ \ + OP(XKB_KEY_KP_4, LSHIFT(Key_Keypad4)) /* XKB_KEY_KP_4 */ \ + OP(XKB_KEY_KP_5, LSHIFT(Key_Keypad5)) /* XKB_KEY_KP_5 */ \ + OP(XKB_KEY_KP_6, LSHIFT(Key_Keypad6)) /* XKB_KEY_KP_6 */ \ + OP(XKB_KEY_KP_7, LSHIFT(Key_Keypad7)) /* XKB_KEY_KP_7 */ \ + OP(XKB_KEY_KP_8, LSHIFT(Key_Keypad8)) /* XKB_KEY_KP_8 */ \ + OP(XKB_KEY_KP_9, LSHIFT(Key_Keypad9)) /* XKB_KEY_KP_9 */ \ + OP(XKB_KEY_KP_Add, Key_KeypadAdd) /* XKB_KEY_KP_Add */ \ + OP(XKB_KEY_KP_Begin, Key_Keypad5) /* XKB_KEY_KP_Begin */ \ + OP(XKB_KEY_KP_Decimal, LSHIFT(Key_KeypadDot)) /* XKB_KEY_KP_Decimal */ \ + OP(XKB_KEY_KP_Delete, Key_KeypadDot) /* XKB_KEY_KP_Delete */ \ + OP(XKB_KEY_KP_Divide, Key_KeypadDivide) /* XKB_KEY_KP_Divide */ \ + OP(XKB_KEY_KP_Down, Key_Keypad2) /* XKB_KEY_KP_Down */ \ + OP(XKB_KEY_KP_End, Key_Keypad1) /* XKB_KEY_KP_End */ \ + OP(XKB_KEY_KP_Enter, Key_KeypadEnter) /* XKB_KEY_KP_Enter, Enter */ \ + OP(XKB_KEY_KP_Home, Key_Keypad7) /* XKB_KEY_KP_Home */ \ + OP(XKB_KEY_KP_Insert, Key_Keypad0) /* XKB_KEY_KP_Insert */ \ + OP(XKB_KEY_KP_Left, Key_Keypad4) /* XKB_KEY_KP_Left */ \ + OP(XKB_KEY_KP_Multiply, Key_KeypadMultiply) /* XKB_KEY_KP_Multiply */ \ + OP(XKB_KEY_KP_Next, Key_Keypad3) /* XKB_KEY_KP_Next */ \ + OP(XKB_KEY_KP_Prior, Key_Keypad9) /* XKB_KEY_KP_Prior */ \ + OP(XKB_KEY_KP_Right, Key_Keypad6) /* XKB_KEY_KP_Right */ \ + OP(XKB_KEY_KP_Subtract, Key_KeypadSubtract) /* XKB_KEY_KP_Subtract */ \ + OP(XKB_KEY_KP_Up, Key_Keypad8) /* XKB_KEY_KP_Up */ \ + OP(XKB_KEY_L, LSHIFT(Key_L)) \ + OP(XKB_KEY_Left, Key_LeftArrow) /* XKB_KEY_Left, Move left, left arrow */ \ + OP(XKB_KEY_M, LSHIFT(Key_M)) \ + OP(XKB_KEY_Menu, Key_PcApplication) /* XKB_KEY_Menu */ \ + OP(XKB_KEY_Meta_L, LSHIFT(Key_LeftAlt)) /* XKB_KEY_Meta_L, Left meta */ \ + OP(XKB_KEY_Meta_R, LSHIFT(Key_RightAlt)) /* XKB_KEY_Meta_R, Right meta */ \ + OP(XKB_KEY_N, LSHIFT(Key_N)) \ + OP(XKB_KEY_Next, Key_PageDown) /* XKB_KEY_Next, Next */ \ + OP(XKB_KEY_Num_Lock, Key_KeypadNumLock) /* XKB_KEY_Num_Lock */ \ + OP(XKB_KEY_O, LSHIFT(Key_O)) \ + OP(XKB_KEY_P, LSHIFT(Key_P)) \ + OP(XKB_KEY_Pause, Key_Pause) /* XKB_KEY_Pause, Pause, hold */ \ + OP(XKB_KEY_Print, Key_PrintScreen) /* XKB_KEY_Print */ \ + OP(XKB_KEY_Prior, Key_PageUp) /* XKB_KEY_Prior, Prior, previous */ \ + OP(XKB_KEY_Q, LSHIFT(Key_Q)) \ + OP(XKB_KEY_R, LSHIFT(Key_R)) \ + OP(XKB_KEY_Return, Key_Enter) /* XKB_KEY_Return, Return, enter */ \ + OP(XKB_KEY_Right, Key_RightArrow) /* XKB_KEY_Right, Move right, right arrow */ \ + OP(XKB_KEY_S, LSHIFT(Key_S)) \ + OP(XKB_KEY_Scroll_Lock, Key_ScrollLock) /* XKB_KEY_Scroll_Lock */ \ + OP(XKB_KEY_Shift_L, Key_LeftShift) /* XKB_KEY_Shift_L, Left shift */ \ + OP(XKB_KEY_Shift_R, Key_RightShift) /* XKB_KEY_Shift_R, Right shift */ \ + OP(XKB_KEY_Super_L, Key_LeftGui) /* XKB_KEY_Super_L, Left super */ \ + OP(XKB_KEY_Super_R, Key_RightGui) /* XKB_KEY_Super_R, Right super */ \ + OP(XKB_KEY_Sys_Req, LALT(Key_PrintScreen)) /* XKB_KEY_Sys_Req */ \ + OP(XKB_KEY_T, LSHIFT(Key_T)) \ + OP(XKB_KEY_Tab, Key_Tab) /* XKB_KEY_Tab */ \ + OP(XKB_KEY_U, LSHIFT(Key_U)) \ + OP(XKB_KEY_Up, Key_UpArrow) /* XKB_KEY_Up, Move up, up arrow */ \ + OP(XKB_KEY_V, LSHIFT(Key_V)) \ + OP(XKB_KEY_W, LSHIFT(Key_W)) \ + OP(XKB_KEY_X, LSHIFT(Key_X)) \ + OP(XKB_KEY_XF86ClearGrab, LCTRL(LALT(Key_KeypadMultiply))) /* XKB_KEY_XF86ClearGrab, kill application with grab */ \ + OP(XKB_KEY_XF86Next_VMode, LCTRL(LALT(Key_KeypadAdd))) /* XKB_KEY_XF86Next_VMode, next video mode available */ \ + OP(XKB_KEY_XF86Prev_VMode, LCTRL(LALT(Key_KeypadSubtract))) /* XKB_KEY_XF86Prev_VMode, prev. video mode available */ \ + OP(XKB_KEY_XF86Switch_VT_1, LCTRL(LALT(Key_F1))) /* XKB_KEY_XF86Switch_VT_1 */ \ + OP(XKB_KEY_XF86Switch_VT_10, LCTRL(LALT(Key_F10))) /* XKB_KEY_XF86Switch_VT_10 */ \ + OP(XKB_KEY_XF86Switch_VT_11, LCTRL(LALT(Key_F11))) /* XKB_KEY_XF86Switch_VT_11 */ \ + OP(XKB_KEY_XF86Switch_VT_12, LCTRL(LALT(Key_F12))) /* XKB_KEY_XF86Switch_VT_12 */ \ + OP(XKB_KEY_XF86Switch_VT_2, LCTRL(LALT(Key_F2))) /* XKB_KEY_XF86Switch_VT_2 */ \ + OP(XKB_KEY_XF86Switch_VT_3, LCTRL(LALT(Key_F3))) /* XKB_KEY_XF86Switch_VT_3 */ \ + OP(XKB_KEY_XF86Switch_VT_4, LCTRL(LALT(Key_F4))) /* XKB_KEY_XF86Switch_VT_4 */ \ + OP(XKB_KEY_XF86Switch_VT_5, LCTRL(LALT(Key_F5))) /* XKB_KEY_XF86Switch_VT_5 */ \ + OP(XKB_KEY_XF86Switch_VT_6, LCTRL(LALT(Key_F6))) /* XKB_KEY_XF86Switch_VT_6 */ \ + OP(XKB_KEY_XF86Switch_VT_7, LCTRL(LALT(Key_F7))) /* XKB_KEY_XF86Switch_VT_7 */ \ + OP(XKB_KEY_XF86Switch_VT_8, LCTRL(LALT(Key_F8))) /* XKB_KEY_XF86Switch_VT_8 */ \ + OP(XKB_KEY_XF86Switch_VT_9, LCTRL(LALT(Key_F9))) /* XKB_KEY_XF86Switch_VT_9 */ \ + OP(XKB_KEY_XF86Ungrab, LCTRL(LALT(Key_KeypadDivide))) /* XKB_KEY_XF86Ungrab, force ungrab */ \ + OP(XKB_KEY_Y, LSHIFT(Key_Y)) \ + OP(XKB_KEY_Z, LSHIFT(Key_Z)) \ + OP(XKB_KEY_a, Key_A) \ + OP(XKB_KEY_ampersand, LSHIFT(Key_7)) \ + OP(XKB_KEY_apostrophe, Key_Quote) /* XKB_KEY_quoteright, deprecated */ \ + OP(XKB_KEY_asciicircum, LSHIFT(Key_6)) \ + OP(XKB_KEY_asciitilde, LSHIFT(Key_Backtick)) \ + OP(XKB_KEY_asterisk, LSHIFT(Key_8)) \ + OP(XKB_KEY_at, LSHIFT(Key_2)) \ + OP(XKB_KEY_b, Key_B) \ + OP(XKB_KEY_backslash, Key_NonUsPound) \ + OP(XKB_KEY_bar, LSHIFT(Key_NonUsPound)) \ + OP(XKB_KEY_braceleft, LSHIFT(Key_LeftBracket)) \ + OP(XKB_KEY_braceright, LSHIFT(Key_RightBracket)) \ + OP(XKB_KEY_bracketleft, Key_LeftBracket) \ + OP(XKB_KEY_bracketright, Key_RightBracket) \ + OP(XKB_KEY_c, Key_C) \ + OP(XKB_KEY_colon, LSHIFT(Key_Semicolon)) \ + OP(XKB_KEY_comma, Key_Comma) \ + OP(XKB_KEY_d, Key_D) \ + OP(XKB_KEY_dollar, LSHIFT(Key_4)) \ + OP(XKB_KEY_e, Key_E) \ + OP(XKB_KEY_equal, Key_Equals) \ + OP(XKB_KEY_exclam, LSHIFT(Key_1)) \ + OP(XKB_KEY_f, Key_F) \ + OP(XKB_KEY_g, Key_G) \ + OP(XKB_KEY_grave, Key_Backtick) /* XKB_KEY_quoteleft, deprecated */ \ + OP(XKB_KEY_greater, LSHIFT(Key_Period)) \ + OP(XKB_KEY_h, Key_H) \ + OP(XKB_KEY_i, Key_I) \ + OP(XKB_KEY_j, Key_J) \ + OP(XKB_KEY_k, Key_K) \ + OP(XKB_KEY_l, Key_L) \ + OP(XKB_KEY_less, Key_NonUsBackslashAndPipe) \ + OP(XKB_KEY_m, Key_M) \ + OP(XKB_KEY_minus, Key_Minus) \ + OP(XKB_KEY_n, Key_N) \ + OP(XKB_KEY_numbersign, LSHIFT(Key_3)) \ + OP(XKB_KEY_o, Key_O) \ + OP(XKB_KEY_p, Key_P) \ + OP(XKB_KEY_parenleft, LSHIFT(Key_9)) \ + OP(XKB_KEY_parenright, LSHIFT(Key_0)) \ + OP(XKB_KEY_percent, LSHIFT(Key_5)) \ + OP(XKB_KEY_period, Key_Period) \ + OP(XKB_KEY_plus, LSHIFT(Key_Equals)) \ + OP(XKB_KEY_q, Key_Q) \ + OP(XKB_KEY_question, LSHIFT(Key_Slash)) \ + OP(XKB_KEY_quotedbl, LSHIFT(Key_Quote)) \ + OP(XKB_KEY_r, Key_R) \ + OP(XKB_KEY_s, Key_S) \ + OP(XKB_KEY_semicolon, Key_Semicolon) \ + OP(XKB_KEY_slash, Key_Slash) \ + OP(XKB_KEY_space, Key_Spacebar) \ + OP(XKB_KEY_t, Key_T) \ + OP(XKB_KEY_u, Key_U) \ + OP(XKB_KEY_underscore, LSHIFT(Key_Minus)) \ + OP(XKB_KEY_v, Key_V) \ + OP(XKB_KEY_w, Key_W) \ + OP(XKB_KEY_x, Key_X) \ + OP(XKB_KEY_y, Key_Y) \ + OP(XKB_KEY_z, Key_Z) \ + + +namespace kaleidoscope { +namespace host_keymap { +namespace linux { +namespace us { +namespace standard { + +HOST_KEYMAP_LINUX( + _HOST_KEYMAP_ASCII, + _HOST_KEYMAP_UNICODE, + _HOST_KEYMAP_NON_PRINTABLE +) + +} // namespace standard +} // namespace us +} // namespace linux +} // namespace host_keymap +} // namespace kaleidoscope + +#undef _HOST_KEYMAP_ASCII +#undef _HOST_KEYMAP_UNICODE +#undef _HOST_KEYMAP_NON_PRINTABLE + diff --git a/src/kaleidoscope/host_keymap/non_printable.h b/src/kaleidoscope/host_keymap/non_printable.h new file mode 100644 index 0000000000..84295ee317 --- /dev/null +++ b/src/kaleidoscope/host_keymap/non_printable.h @@ -0,0 +1,29 @@ +/* Kaleidoscope - Firmware for computer input devices + * Copyright (C) 2013-2018 Keyboard.io, Inc. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +#include "kaleidoscope/host_keymap/host_keymap.h" + +#define _HOST_KEYMAP_CONVERT_NON_PRINTABLE_ENUM_CLASS(NAME, KEY) \ + (linux::XKBKeySym::NAME == np) ? (KEY) : + +#define HOST_KEYMAP_NON_PRINTABLE_CONVERTER(KEY_TRANSLATION) \ + \ + constexpr Key convertToKey(XKBKeySym np) { \ + return KEY_TRANSLATION(_HOST_KEYMAP_CONVERT_NON_PRINTABLE_ENUM_CLASS) \ + bad_keymap_key; \ + } diff --git a/src/kaleidoscope/host_keymap/test/host_keymap_test.h b/src/kaleidoscope/host_keymap/test/host_keymap_test.h new file mode 100644 index 0000000000..c88df9d9f0 --- /dev/null +++ b/src/kaleidoscope/host_keymap/test/host_keymap_test.h @@ -0,0 +1,82 @@ +/* Kaleidoscope - Firmware for computer input devices + * Copyright (C) 2013-2018 Keyboard.io, Inc. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +#include "Kaleidoscope.h" + +#include "kaleidoscope/host_keymap/ascii/us_en.h" +#include "kaleidoscope/host_keymap/unicode/us_en.h" + +USE_HOST_KEYMAP(ascii, us_en) +USE_HOST_KEYMAP(unicode, us_en) + +#define KEY_ASSERTION_(KEY_DEF, TEST_KEY, UC) \ + static_assert( \ + kaleidoscope::convertToKey(UC##KEY_DEF) == TEST_KEY, \ + "host_keymap assertion failed: " #UC #KEY_DEF " != " #TEST_KEY \ + ); + +#define KEY_ASSERTION(KEY_DEF, TEST_KEY) \ + KEY_ASSERTION_(KEY_DEF, TEST_KEY, ) /* ascii */ \ + KEY_ASSERTION_(KEY_DEF, TEST_KEY, L) /* unicode */ + +namespace kaleidoscope { +namespace host_keymap { + +// The following can be used to generate compile time errors that +// allow to determine the key_code/flags value of a key for debugging +// purposes. +// +// template +// struct _{ constexpr operator char() { return _value + 256; } }; //always overflow +// +// constexpr char key_code = _{}; +// constexpr char flags = _{}; + +KEY_ASSERTION('\\', Key_Backslash) +KEY_ASSERTION('#', LSHIFT(Key_3)) +KEY_ASSERTION('+', LSHIFT(Key_Equals)) +KEY_ASSERTION(' ', Key_Space) +KEY_ASSERTION('\t', Key_Tab) +KEY_ASSERTION('\n', Key_Enter) +KEY_ASSERTION('a', Key_A) +KEY_ASSERTION(" a", Key_A) +KEY_ASSERTION("a ", Key_A) +KEY_ASSERTION("ca", LCTRL(Key_A)) +KEY_ASSERTION("mca", LGUI(LCTRL(Key_A))) +KEY_ASSERTION("c+a", LCTRL(Key_A)) +KEY_ASSERTION(" c+a", LCTRL(Key_A)) +KEY_ASSERTION("c +a", LCTRL(Key_A)) +KEY_ASSERTION("c+ a", LCTRL(Key_A)) +KEY_ASSERTION("c+a ", LCTRL(Key_A)) + +KEY_ASSERTION("", bad_keymap_key) +KEY_ASSERTION("c+#", bad_keymap_key) +KEY_ASSERTION("# ", Key_Space) +KEY_ASSERTION("c+# ", LCTRL(Key_Space)) +KEY_ASSERTION("##", LSHIFT(Key_3)) +KEY_ASSERTION("c+##", LCTRL(LSHIFT(Key_3))) +KEY_ASSERTION("c+#+", LCTRL(LSHIFT(Key_Equals))) +KEY_ASSERTION("#", LSHIFT(Key_3)) // If only one key is specified, +// we accept the escape char as normal ascii char +KEY_ASSERTION_(L"⇧", Key_LeftShift,) +KEY_ASSERTION_(L'⇧', Key_LeftShift,) +KEY_ASSERTION_(L"r⇧", Key_RightShift,) +KEY_ASSERTION_(L"rr⇧", Key_LeftShift,) + +} // namespace host_keymap +} // namespace kaleidoscope diff --git a/src/kaleidoscope/host_keymap/unicode.h b/src/kaleidoscope/host_keymap/unicode.h new file mode 100644 index 0000000000..db7cb8d6ba --- /dev/null +++ b/src/kaleidoscope/host_keymap/unicode.h @@ -0,0 +1,160 @@ +/* Kaleidoscope - Firmware for computer input devices + * Copyright (C) 2013-2018 Keyboard.io, Inc. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +#include "kaleidoscope/host_keymap/host_keymap.h" + +namespace kaleidoscope { +namespace host_keymap { +namespace unicode { + +struct CharProcessor { + static constexpr bool isEscapeChar(wchar_t c) { + return c == L'#'; + } + + static constexpr bool isSeparator(wchar_t c) { + return (c == L' ') + || (c == L'\t') + || (c == L'+'); + } + + static constexpr bool isMirrorChar(wchar_t c) { + return c == L'r'; + } +}; + +#define _HOST_KEYMAP_CAST_ON_MODIFIERS_UNICODE(OP) \ + \ + OP(L's', LSHIFT(k)) \ + OP(L'S', LSHIFT(k)) \ + OP(L'⇧', LSHIFT(k)) \ + \ + OP(L'c', LCTRL(k)) \ + OP(L'C', LCTRL(k)) \ + OP(L'⌃', LCTRL(k)) \ + \ + OP(L'a', LALT(k)) \ + OP(L'A', RALT(k)) \ + OP(L'⌥', LALT(k)) \ + \ + OP(L'm', LGUI(k)) \ + OP(L'M', LGUI(k)) \ + OP(L'g', LGUI(k)) \ + OP(L'G', LGUI(k)) \ + OP(L'⌘', LGUI(k)) \ + +// Define a UnicodeConverterBase template base class that any unicode keymap converters +// are derived from by means of invoking the HOST_KEYMAP_UNICODE_LANGUAGE_CONVERTER +// function macro. +// +_HOST_KEYMAP_DEFINE_CHAR_CONVERTER( + UnicodeConverterBase, wchar_t, _HOST_KEYMAP_CAST_ON_MODIFIERS_UNICODE) + +#undef _HOST_KEYMAP_CAST_ON_MODIFIERS_UNICODE + +} // namespace unicode +} // namespace host_keymap +} // namespace kaleidoscope + +#define HOST_KEYMAP_UNICODE_CONVERTER(LANGUAGE_KEYMAP, \ + CHAR_PARSING_FALLBACK) \ + struct UnicodeConverter \ + : public unicode::UnicodeConverterBase \ + { \ + typedef unicode::UnicodeConverterBase Parent; \ + \ + using typename Parent::StringMemberType; \ + using typename Parent::CharType; \ + \ + static constexpr bool isKeyChar(wchar_t c) { \ + return LANGUAGE_KEYMAP(_HOST_KEYMAP_IS_KEY_CHAR) \ + CHAR_PARSING_FALLBACK::isKeyChar(c); \ + } \ + \ + static constexpr Key charToKey(wchar_t c) { \ + return LANGUAGE_KEYMAP( \ + _HOST_KEYMAP_MAP_KEY_CHAR_TO_KALEIDOSCOPE_KEY \ + ) \ + CHAR_PARSING_FALLBACK::charToKey(c); \ + } \ + }; \ + \ + constexpr Key convertToKey(wchar_t c) { \ + return UnicodeConverter::convertToKey(c); \ + } \ + template \ + constexpr Key convertToKey(wchar_t const(&string) [_Size]) { \ + return UnicodeConverter::convertToKey(string); \ + } + +namespace kaleidoscope { +namespace host_keymap { +namespace unicode { +namespace control_keys { + +#define _HOST_KEYMAP_UNICODE_CONTROL_KEYS(OP) \ + OP(L'⎋', Key_Escape) \ + OP(L'⌫', Key_Backspace) \ + OP(L'↹', Key_Tab) \ + OP(L'␣', Key_Spacebar) \ + OP(L'⇪', Key_CapsLock) \ + OP(L'↩', Key_Return) \ + OP(L'⎆', Key_Enter) \ + OP(L'⎙', Key_PrintScreen) \ + OP(L'⤓', Key_ScrollLock) \ + OP(L'⇳', Key_ScrollLock) \ + OP(L'⎉', Key_Pause) \ + OP(L'⎀', Key_Insert) \ + OP(L'↖', Key_Home) \ + OP(L'⇞', Key_PageUp) \ + OP(L'⌦', Key_Delete) \ + OP(L'↘', Key_End) \ + OP(L'⇟', Key_PageDown) \ + OP(L'→', Key_RightArrow) \ + OP(L'←', Key_LeftArrow) \ + OP(L'↓', Key_DownArrow) \ + OP(L'↑', Key_UpArrow) \ + OP(L'⇭', Key_KeypadNumLock) \ + OP(L'⌽', Key_Power) \ + OP(L'⌃', Key_LeftControl) \ + OP(L'⌘', Key_LeftGui) \ + OP(L'⇧', Key_LeftShift) \ + OP(L'⌥', Key_LeftAlt) + +HOST_KEYMAP_UNICODE_CONVERTER( + _HOST_KEYMAP_UNICODE_CONTROL_KEYS, + _CharParsingStandardFallback +) + +#undef _HOST_KEYMAP_UNICODE_CONTROL_KEYS + +} // namespace control_keys + +// If you do not want to use unicode control keys, define +// macro HOST_KEYMAP_NO_UNICODE_CONTROL_CHARS before including +// anything host_keymap related. +// +#ifndef HOST_KEYMAP_NO_UNICODE_CONTROL_CHARS +typedef control_keys::UnicodeConverter CharParsingStandardFallback; +#else +typedef _CharParsingStandardFallback CharParsingStandardFallback; +#endif + +} // namespace unicode +} // namespace host_keymap +} // namespace kaleidoscope diff --git a/src/kaleidoscope/host_keymap/xkbcommon_keysyms_non_printable.h b/src/kaleidoscope/host_keymap/xkbcommon_keysyms_non_printable.h new file mode 100644 index 0000000000..89b250953e --- /dev/null +++ b/src/kaleidoscope/host_keymap/xkbcommon_keysyms_non_printable.h @@ -0,0 +1,846 @@ +/* Kaleidoscope - Firmware for computer input devices + * Copyright (C) 2013-2018 Keyboard.io, Inc. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +// Information extracted from xkbcommon-keysyms.h + +// Function macro invoked with arguments +// KEY_SYM_NAME, KEY_SYM, DESC +// +#define XKB_KEY_SYM_NAME__KEY_SYM__DESCRIPTION(OP) \ + OP(XKB_KEY_VoidSymbol, 0xffffff, "Void symbol ") \ + OP(XKB_KEY_BackSpace, 0xff08, "Back space, back char ") \ + OP(XKB_KEY_Tab, 0xff09, "") \ + OP(XKB_KEY_Linefeed, 0xff0a, "Linefeed, LF ") \ + OP(XKB_KEY_Clear, 0xff0b, "") \ + OP(XKB_KEY_Return, 0xff0d, "Return, enter ") \ + OP(XKB_KEY_Pause, 0xff13, "Pause, hold ") \ + OP(XKB_KEY_Scroll_Lock, 0xff14, "") \ + OP(XKB_KEY_Sys_Req, 0xff15, "") \ + OP(XKB_KEY_Escape, 0xff1b, "") \ + OP(XKB_KEY_Delete, 0xffff, "Delete, rubout ") \ + OP(XKB_KEY_Multi_key, 0xff20, "Multi-key character compose ") \ + OP(XKB_KEY_Codeinput, 0xff37, "") \ + OP(XKB_KEY_SingleCandidate, 0xff3c, "") \ + OP(XKB_KEY_MultipleCandidate, 0xff3d, "") \ + OP(XKB_KEY_PreviousCandidate, 0xff3e, "") \ + OP(XKB_KEY_Kanji, 0xff21, "Kanji, Kanji convert ") \ + OP(XKB_KEY_Muhenkan, 0xff22, "Cancel Conversion ") \ + OP(XKB_KEY_Henkan_Mode, 0xff23, "Start/Stop Conversion ") \ + OP(XKB_KEY_Henkan, 0xff23, "Alias for Henkan_Mode ") \ + OP(XKB_KEY_Romaji, 0xff24, "to Romaji ") \ + OP(XKB_KEY_Hiragana, 0xff25, "to Hiragana ") \ + OP(XKB_KEY_Katakana, 0xff26, "to Katakana ") \ + OP(XKB_KEY_Hiragana_Katakana, 0xff27, "Hiragana/Katakana toggle ") \ + OP(XKB_KEY_Zenkaku, 0xff28, "to Zenkaku ") \ + OP(XKB_KEY_Hankaku, 0xff29, "to Hankaku ") \ + OP(XKB_KEY_Zenkaku_Hankaku, 0xff2a, "Zenkaku/Hankaku toggle ") \ + OP(XKB_KEY_Touroku, 0xff2b, "Add to Dictionary ") \ + OP(XKB_KEY_Massyo, 0xff2c, "Delete from Dictionary ") \ + OP(XKB_KEY_Kana_Lock, 0xff2d, "Kana Lock ") \ + OP(XKB_KEY_Kana_Shift, 0xff2e, "Kana Shift ") \ + OP(XKB_KEY_Eisu_Shift, 0xff2f, "Alphanumeric Shift ") \ + OP(XKB_KEY_Eisu_toggle, 0xff30, "Alphanumeric toggle ") \ + OP(XKB_KEY_Kanji_Bangou, 0xff37, "Codeinput ") \ + OP(XKB_KEY_Zen_Koho, 0xff3d, "Multiple/All Candidate(s) ") \ + OP(XKB_KEY_Mae_Koho, 0xff3e, "Previous Candidate ") \ + OP(XKB_KEY_Home, 0xff50, "") \ + OP(XKB_KEY_Left, 0xff51, "Move left, left arrow ") \ + OP(XKB_KEY_Up, 0xff52, "Move up, up arrow ") \ + OP(XKB_KEY_Right, 0xff53, "Move right, right arrow ") \ + OP(XKB_KEY_Down, 0xff54, "Move down, down arrow ") \ + OP(XKB_KEY_Prior, 0xff55, "Prior, previous ") \ + OP(XKB_KEY_Page_Up, 0xff55, "") \ + OP(XKB_KEY_Next, 0xff56, "Next ") \ + OP(XKB_KEY_Page_Down, 0xff56, "") \ + OP(XKB_KEY_End, 0xff57, "EOL ") \ + OP(XKB_KEY_Begin, 0xff58, "BOL ") \ + OP(XKB_KEY_Select, 0xff60, "Select, mark ") \ + OP(XKB_KEY_Print, 0xff61, "") \ + OP(XKB_KEY_Execute, 0xff62, "Execute, run, do ") \ + OP(XKB_KEY_Insert, 0xff63, "Insert, insert here ") \ + OP(XKB_KEY_Undo, 0xff65, "") \ + OP(XKB_KEY_Redo, 0xff66, "Redo, again ") \ + OP(XKB_KEY_Menu, 0xff67, "") \ + OP(XKB_KEY_Find, 0xff68, "Find, search ") \ + OP(XKB_KEY_Cancel, 0xff69, "Cancel, stop, abort, exit ") \ + OP(XKB_KEY_Help, 0xff6a, "Help ") \ + OP(XKB_KEY_Break, 0xff6b, "") \ + OP(XKB_KEY_Mode_switch, 0xff7e, "Character set switch ") \ + OP(XKB_KEY_script_switch, 0xff7e, "Alias for mode_switch ") \ + OP(XKB_KEY_Num_Lock, 0xff7f, "") \ + OP(XKB_KEY_KP_Space, 0xff80, "Space ") \ + OP(XKB_KEY_KP_Tab, 0xff89, "") \ + OP(XKB_KEY_KP_Enter, 0xff8d, "Enter ") \ + OP(XKB_KEY_KP_F1, 0xff91, "PF1, KP_A, ... ") \ + OP(XKB_KEY_KP_F2, 0xff92, "") \ + OP(XKB_KEY_KP_F3, 0xff93, "") \ + OP(XKB_KEY_KP_F4, 0xff94, "") \ + OP(XKB_KEY_KP_Home, 0xff95, "") \ + OP(XKB_KEY_KP_Left, 0xff96, "") \ + OP(XKB_KEY_KP_Up, 0xff97, "") \ + OP(XKB_KEY_KP_Right, 0xff98, "") \ + OP(XKB_KEY_KP_Down, 0xff99, "") \ + OP(XKB_KEY_KP_Prior, 0xff9a, "") \ + OP(XKB_KEY_KP_Page_Up, 0xff9a, "") \ + OP(XKB_KEY_KP_Next, 0xff9b, "") \ + OP(XKB_KEY_KP_Page_Down, 0xff9b, "") \ + OP(XKB_KEY_KP_End, 0xff9c, "") \ + OP(XKB_KEY_KP_Begin, 0xff9d, "") \ + OP(XKB_KEY_KP_Insert, 0xff9e, "") \ + OP(XKB_KEY_KP_Delete, 0xff9f, "") \ + OP(XKB_KEY_KP_Equal, 0xffbd, "Equals ") \ + OP(XKB_KEY_KP_Multiply, 0xffaa, "") \ + OP(XKB_KEY_KP_Add, 0xffab, "") \ + OP(XKB_KEY_KP_Separator, 0xffac, "Separator, often comma ") \ + OP(XKB_KEY_KP_Subtract, 0xffad, "") \ + OP(XKB_KEY_KP_Decimal, 0xffae, "") \ + OP(XKB_KEY_KP_Divide, 0xffaf, "") \ + OP(XKB_KEY_KP_0, 0xffb0, "") \ + OP(XKB_KEY_KP_1, 0xffb1, "") \ + OP(XKB_KEY_KP_2, 0xffb2, "") \ + OP(XKB_KEY_KP_3, 0xffb3, "") \ + OP(XKB_KEY_KP_4, 0xffb4, "") \ + OP(XKB_KEY_KP_5, 0xffb5, "") \ + OP(XKB_KEY_KP_6, 0xffb6, "") \ + OP(XKB_KEY_KP_7, 0xffb7, "") \ + OP(XKB_KEY_KP_8, 0xffb8, "") \ + OP(XKB_KEY_KP_9, 0xffb9, "") \ + OP(XKB_KEY_F1, 0xffbe, "") \ + OP(XKB_KEY_F2, 0xffbf, "") \ + OP(XKB_KEY_F3, 0xffc0, "") \ + OP(XKB_KEY_F4, 0xffc1, "") \ + OP(XKB_KEY_F5, 0xffc2, "") \ + OP(XKB_KEY_F6, 0xffc3, "") \ + OP(XKB_KEY_F7, 0xffc4, "") \ + OP(XKB_KEY_F8, 0xffc5, "") \ + OP(XKB_KEY_F9, 0xffc6, "") \ + OP(XKB_KEY_F10, 0xffc7, "") \ + OP(XKB_KEY_F11, 0xffc8, "") \ + OP(XKB_KEY_L1, 0xffc8, "") \ + OP(XKB_KEY_F12, 0xffc9, "") \ + OP(XKB_KEY_L2, 0xffc9, "") \ + OP(XKB_KEY_F13, 0xffca, "") \ + OP(XKB_KEY_L3, 0xffca, "") \ + OP(XKB_KEY_F14, 0xffcb, "") \ + OP(XKB_KEY_L4, 0xffcb, "") \ + OP(XKB_KEY_F15, 0xffcc, "") \ + OP(XKB_KEY_L5, 0xffcc, "") \ + OP(XKB_KEY_F16, 0xffcd, "") \ + OP(XKB_KEY_L6, 0xffcd, "") \ + OP(XKB_KEY_F17, 0xffce, "") \ + OP(XKB_KEY_L7, 0xffce, "") \ + OP(XKB_KEY_F18, 0xffcf, "") \ + OP(XKB_KEY_L8, 0xffcf, "") \ + OP(XKB_KEY_F19, 0xffd0, "") \ + OP(XKB_KEY_L9, 0xffd0, "") \ + OP(XKB_KEY_F20, 0xffd1, "") \ + OP(XKB_KEY_L10, 0xffd1, "") \ + OP(XKB_KEY_F21, 0xffd2, "") \ + OP(XKB_KEY_R1, 0xffd2, "") \ + OP(XKB_KEY_F22, 0xffd3, "") \ + OP(XKB_KEY_R2, 0xffd3, "") \ + OP(XKB_KEY_F23, 0xffd4, "") \ + OP(XKB_KEY_R3, 0xffd4, "") \ + OP(XKB_KEY_F24, 0xffd5, "") \ + OP(XKB_KEY_R4, 0xffd5, "") \ + OP(XKB_KEY_F25, 0xffd6, "") \ + OP(XKB_KEY_R5, 0xffd6, "") \ + OP(XKB_KEY_F26, 0xffd7, "") \ + OP(XKB_KEY_R6, 0xffd7, "") \ + OP(XKB_KEY_F27, 0xffd8, "") \ + OP(XKB_KEY_R7, 0xffd8, "") \ + OP(XKB_KEY_F28, 0xffd9, "") \ + OP(XKB_KEY_R8, 0xffd9, "") \ + OP(XKB_KEY_F29, 0xffda, "") \ + OP(XKB_KEY_R9, 0xffda, "") \ + OP(XKB_KEY_F30, 0xffdb, "") \ + OP(XKB_KEY_R10, 0xffdb, "") \ + OP(XKB_KEY_F31, 0xffdc, "") \ + OP(XKB_KEY_R11, 0xffdc, "") \ + OP(XKB_KEY_F32, 0xffdd, "") \ + OP(XKB_KEY_R12, 0xffdd, "") \ + OP(XKB_KEY_F33, 0xffde, "") \ + OP(XKB_KEY_R13, 0xffde, "") \ + OP(XKB_KEY_F34, 0xffdf, "") \ + OP(XKB_KEY_R14, 0xffdf, "") \ + OP(XKB_KEY_F35, 0xffe0, "") \ + OP(XKB_KEY_R15, 0xffe0, "") \ + OP(XKB_KEY_Shift_L, 0xffe1, "Left shift ") \ + OP(XKB_KEY_Shift_R, 0xffe2, "Right shift ") \ + OP(XKB_KEY_Control_L, 0xffe3, "Left control ") \ + OP(XKB_KEY_Control_R, 0xffe4, "Right control ") \ + OP(XKB_KEY_Caps_Lock, 0xffe5, "Caps lock ") \ + OP(XKB_KEY_Shift_Lock, 0xffe6, "Shift lock ") \ + OP(XKB_KEY_Meta_L, 0xffe7, "Left meta ") \ + OP(XKB_KEY_Meta_R, 0xffe8, "Right meta ") \ + OP(XKB_KEY_Alt_L, 0xffe9, "Left alt ") \ + OP(XKB_KEY_Alt_R, 0xffea, "Right alt ") \ + OP(XKB_KEY_Super_L, 0xffeb, "Left super ") \ + OP(XKB_KEY_Super_R, 0xffec, "Right super ") \ + OP(XKB_KEY_Hyper_L, 0xffed, "Left hyper ") \ + OP(XKB_KEY_Hyper_R, 0xffee, "Right hyper ") \ + OP(XKB_KEY_ISO_Lock, 0xfe01, "") \ + OP(XKB_KEY_ISO_Level2_Latch, 0xfe02, "") \ + OP(XKB_KEY_ISO_Level3_Shift, 0xfe03, "") \ + OP(XKB_KEY_ISO_Level3_Latch, 0xfe04, "") \ + OP(XKB_KEY_ISO_Level3_Lock, 0xfe05, "") \ + OP(XKB_KEY_ISO_Level5_Shift, 0xfe11, "") \ + OP(XKB_KEY_ISO_Level5_Latch, 0xfe12, "") \ + OP(XKB_KEY_ISO_Level5_Lock, 0xfe13, "") \ + OP(XKB_KEY_ISO_Group_Shift, 0xff7e, "Alias for mode_switch ") \ + OP(XKB_KEY_ISO_Group_Latch, 0xfe06, "") \ + OP(XKB_KEY_ISO_Group_Lock, 0xfe07, "") \ + OP(XKB_KEY_ISO_Next_Group, 0xfe08, "") \ + OP(XKB_KEY_ISO_Next_Group_Lock, 0xfe09, "") \ + OP(XKB_KEY_ISO_Prev_Group, 0xfe0a, "") \ + OP(XKB_KEY_ISO_Prev_Group_Lock, 0xfe0b, "") \ + OP(XKB_KEY_ISO_First_Group, 0xfe0c, "") \ + OP(XKB_KEY_ISO_First_Group_Lock, 0xfe0d, "") \ + OP(XKB_KEY_ISO_Last_Group, 0xfe0e, "") \ + OP(XKB_KEY_ISO_Last_Group_Lock, 0xfe0f, "") \ + OP(XKB_KEY_ISO_Left_Tab, 0xfe20, "") \ + OP(XKB_KEY_ISO_Move_Line_Up, 0xfe21, "") \ + OP(XKB_KEY_ISO_Move_Line_Down, 0xfe22, "") \ + OP(XKB_KEY_ISO_Partial_Line_Up, 0xfe23, "") \ + OP(XKB_KEY_ISO_Partial_Line_Down, 0xfe24, "") \ + OP(XKB_KEY_ISO_Partial_Space_Left, 0xfe25, "") \ + OP(XKB_KEY_ISO_Partial_Space_Right, 0xfe26, "") \ + OP(XKB_KEY_ISO_Set_Margin_Left, 0xfe27, "") \ + OP(XKB_KEY_ISO_Set_Margin_Right, 0xfe28, "") \ + OP(XKB_KEY_ISO_Release_Margin_Left, 0xfe29, "") \ + OP(XKB_KEY_ISO_Release_Margin_Right, 0xfe2a, "") \ + OP(XKB_KEY_ISO_Release_Both_Margins, 0xfe2b, "") \ + OP(XKB_KEY_ISO_Fast_Cursor_Left, 0xfe2c, "") \ + OP(XKB_KEY_ISO_Fast_Cursor_Right, 0xfe2d, "") \ + OP(XKB_KEY_ISO_Fast_Cursor_Up, 0xfe2e, "") \ + OP(XKB_KEY_ISO_Fast_Cursor_Down, 0xfe2f, "") \ + OP(XKB_KEY_ISO_Continuous_Underline, 0xfe30, "") \ + OP(XKB_KEY_ISO_Discontinuous_Underline, 0xfe31, "") \ + OP(XKB_KEY_ISO_Emphasize, 0xfe32, "") \ + OP(XKB_KEY_ISO_Center_Object, 0xfe33, "") \ + OP(XKB_KEY_ISO_Enter, 0xfe34, "") \ + OP(XKB_KEY_dead_grave, 0xfe50, "") \ + OP(XKB_KEY_dead_acute, 0xfe51, "") \ + OP(XKB_KEY_dead_circumflex, 0xfe52, "") \ + OP(XKB_KEY_dead_tilde, 0xfe53, "") \ + OP(XKB_KEY_dead_perispomeni, 0xfe53, "alias for dead_tilde ") \ + OP(XKB_KEY_dead_macron, 0xfe54, "") \ + OP(XKB_KEY_dead_breve, 0xfe55, "") \ + OP(XKB_KEY_dead_abovedot, 0xfe56, "") \ + OP(XKB_KEY_dead_diaeresis, 0xfe57, "") \ + OP(XKB_KEY_dead_abovering, 0xfe58, "") \ + OP(XKB_KEY_dead_doubleacute, 0xfe59, "") \ + OP(XKB_KEY_dead_caron, 0xfe5a, "") \ + OP(XKB_KEY_dead_cedilla, 0xfe5b, "") \ + OP(XKB_KEY_dead_ogonek, 0xfe5c, "") \ + OP(XKB_KEY_dead_iota, 0xfe5d, "") \ + OP(XKB_KEY_dead_voiced_sound, 0xfe5e, "") \ + OP(XKB_KEY_dead_semivoiced_sound, 0xfe5f, "") \ + OP(XKB_KEY_dead_belowdot, 0xfe60, "") \ + OP(XKB_KEY_dead_hook, 0xfe61, "") \ + OP(XKB_KEY_dead_horn, 0xfe62, "") \ + OP(XKB_KEY_dead_stroke, 0xfe63, "") \ + OP(XKB_KEY_dead_abovecomma, 0xfe64, "") \ + OP(XKB_KEY_dead_psili, 0xfe64, "alias for dead_abovecomma ") \ + OP(XKB_KEY_dead_abovereversedcomma, 0xfe65, "") \ + OP(XKB_KEY_dead_dasia, 0xfe65, "alias for dead_abovereversedcomma ") \ + OP(XKB_KEY_dead_doublegrave, 0xfe66, "") \ + OP(XKB_KEY_dead_belowring, 0xfe67, "") \ + OP(XKB_KEY_dead_belowmacron, 0xfe68, "") \ + OP(XKB_KEY_dead_belowcircumflex, 0xfe69, "") \ + OP(XKB_KEY_dead_belowtilde, 0xfe6a, "") \ + OP(XKB_KEY_dead_belowbreve, 0xfe6b, "") \ + OP(XKB_KEY_dead_belowdiaeresis, 0xfe6c, "") \ + OP(XKB_KEY_dead_invertedbreve, 0xfe6d, "") \ + OP(XKB_KEY_dead_belowcomma, 0xfe6e, "") \ + OP(XKB_KEY_dead_currency, 0xfe6f, "") \ + OP(XKB_KEY_dead_lowline, 0xfe90, "") \ + OP(XKB_KEY_dead_aboveverticalline, 0xfe91, "") \ + OP(XKB_KEY_dead_belowverticalline, 0xfe92, "") \ + OP(XKB_KEY_dead_longsolidusoverlay, 0xfe93, "") \ + OP(XKB_KEY_dead_a, 0xfe80, "") \ + OP(XKB_KEY_dead_A, 0xfe81, "") \ + OP(XKB_KEY_dead_e, 0xfe82, "") \ + OP(XKB_KEY_dead_E, 0xfe83, "") \ + OP(XKB_KEY_dead_i, 0xfe84, "") \ + OP(XKB_KEY_dead_I, 0xfe85, "") \ + OP(XKB_KEY_dead_o, 0xfe86, "") \ + OP(XKB_KEY_dead_O, 0xfe87, "") \ + OP(XKB_KEY_dead_u, 0xfe88, "") \ + OP(XKB_KEY_dead_U, 0xfe89, "") \ + OP(XKB_KEY_dead_small_schwa, 0xfe8a, "") \ + OP(XKB_KEY_dead_capital_schwa, 0xfe8b, "") \ + OP(XKB_KEY_dead_greek, 0xfe8c, "") \ + OP(XKB_KEY_First_Virtual_Screen, 0xfed0, "") \ + OP(XKB_KEY_Prev_Virtual_Screen, 0xfed1, "") \ + OP(XKB_KEY_Next_Virtual_Screen, 0xfed2, "") \ + OP(XKB_KEY_Last_Virtual_Screen, 0xfed4, "") \ + OP(XKB_KEY_Terminate_Server, 0xfed5, "") \ + OP(XKB_KEY_AccessX_Enable, 0xfe70, "") \ + OP(XKB_KEY_AccessX_Feedback_Enable, 0xfe71, "") \ + OP(XKB_KEY_RepeatKeys_Enable, 0xfe72, "") \ + OP(XKB_KEY_SlowKeys_Enable, 0xfe73, "") \ + OP(XKB_KEY_BounceKeys_Enable, 0xfe74, "") \ + OP(XKB_KEY_StickyKeys_Enable, 0xfe75, "") \ + OP(XKB_KEY_MouseKeys_Enable, 0xfe76, "") \ + OP(XKB_KEY_MouseKeys_Accel_Enable, 0xfe77, "") \ + OP(XKB_KEY_Overlay1_Enable, 0xfe78, "") \ + OP(XKB_KEY_Overlay2_Enable, 0xfe79, "") \ + OP(XKB_KEY_AudibleBell_Enable, 0xfe7a, "") \ + OP(XKB_KEY_Pointer_Left, 0xfee0, "") \ + OP(XKB_KEY_Pointer_Right, 0xfee1, "") \ + OP(XKB_KEY_Pointer_Up, 0xfee2, "") \ + OP(XKB_KEY_Pointer_Down, 0xfee3, "") \ + OP(XKB_KEY_Pointer_UpLeft, 0xfee4, "") \ + OP(XKB_KEY_Pointer_UpRight, 0xfee5, "") \ + OP(XKB_KEY_Pointer_DownLeft, 0xfee6, "") \ + OP(XKB_KEY_Pointer_DownRight, 0xfee7, "") \ + OP(XKB_KEY_Pointer_Button_Dflt, 0xfee8, "") \ + OP(XKB_KEY_Pointer_Button1, 0xfee9, "") \ + OP(XKB_KEY_Pointer_Button2, 0xfeea, "") \ + OP(XKB_KEY_Pointer_Button3, 0xfeeb, "") \ + OP(XKB_KEY_Pointer_Button4, 0xfeec, "") \ + OP(XKB_KEY_Pointer_Button5, 0xfeed, "") \ + OP(XKB_KEY_Pointer_DblClick_Dflt, 0xfeee, "") \ + OP(XKB_KEY_Pointer_DblClick1, 0xfeef, "") \ + OP(XKB_KEY_Pointer_DblClick2, 0xfef0, "") \ + OP(XKB_KEY_Pointer_DblClick3, 0xfef1, "") \ + OP(XKB_KEY_Pointer_DblClick4, 0xfef2, "") \ + OP(XKB_KEY_Pointer_DblClick5, 0xfef3, "") \ + OP(XKB_KEY_Pointer_Drag_Dflt, 0xfef4, "") \ + OP(XKB_KEY_Pointer_Drag1, 0xfef5, "") \ + OP(XKB_KEY_Pointer_Drag2, 0xfef6, "") \ + OP(XKB_KEY_Pointer_Drag3, 0xfef7, "") \ + OP(XKB_KEY_Pointer_Drag4, 0xfef8, "") \ + OP(XKB_KEY_Pointer_Drag5, 0xfefd, "") \ + OP(XKB_KEY_Pointer_EnableKeys, 0xfef9, "") \ + OP(XKB_KEY_Pointer_Accelerate, 0xfefa, "") \ + OP(XKB_KEY_Pointer_DfltBtnNext, 0xfefb, "") \ + OP(XKB_KEY_Pointer_DfltBtnPrev, 0xfefc, "") \ + OP(XKB_KEY_ch, 0xfea0, "") \ + OP(XKB_KEY_Ch, 0xfea1, "") \ + OP(XKB_KEY_CH, 0xfea2, "") \ + OP(XKB_KEY_c_h, 0xfea3, "") \ + OP(XKB_KEY_C_h, 0xfea4, "") \ + OP(XKB_KEY_C_H, 0xfea5, "") \ + OP(XKB_KEY_3270_Duplicate, 0xfd01, "") \ + OP(XKB_KEY_3270_FieldMark, 0xfd02, "") \ + OP(XKB_KEY_3270_Right2, 0xfd03, "") \ + OP(XKB_KEY_3270_Left2, 0xfd04, "") \ + OP(XKB_KEY_3270_BackTab, 0xfd05, "") \ + OP(XKB_KEY_3270_EraseEOF, 0xfd06, "") \ + OP(XKB_KEY_3270_EraseInput, 0xfd07, "") \ + OP(XKB_KEY_3270_Reset, 0xfd08, "") \ + OP(XKB_KEY_3270_Quit, 0xfd09, "") \ + OP(XKB_KEY_3270_PA1, 0xfd0a, "") \ + OP(XKB_KEY_3270_PA2, 0xfd0b, "") \ + OP(XKB_KEY_3270_PA3, 0xfd0c, "") \ + OP(XKB_KEY_3270_Test, 0xfd0d, "") \ + OP(XKB_KEY_3270_Attn, 0xfd0e, "") \ + OP(XKB_KEY_3270_CursorBlink, 0xfd0f, "") \ + OP(XKB_KEY_3270_AltCursor, 0xfd10, "") \ + OP(XKB_KEY_3270_KeyClick, 0xfd11, "") \ + OP(XKB_KEY_3270_Jump, 0xfd12, "") \ + OP(XKB_KEY_3270_Ident, 0xfd13, "") \ + OP(XKB_KEY_3270_Rule, 0xfd14, "") \ + OP(XKB_KEY_3270_Copy, 0xfd15, "") \ + OP(XKB_KEY_3270_Play, 0xfd16, "") \ + OP(XKB_KEY_3270_Setup, 0xfd17, "") \ + OP(XKB_KEY_3270_Record, 0xfd18, "") \ + OP(XKB_KEY_3270_ChangeScreen, 0xfd19, "") \ + OP(XKB_KEY_3270_DeleteWord, 0xfd1a, "") \ + OP(XKB_KEY_3270_ExSelect, 0xfd1b, "") \ + OP(XKB_KEY_3270_CursorSelect, 0xfd1c, "") \ + OP(XKB_KEY_3270_PrintScreen, 0xfd1d, "") \ + OP(XKB_KEY_3270_Enter, 0xfd1e, "") \ + OP(XKB_KEY_quoteright, 0x0027, "deprecated ") \ + OP(XKB_KEY_quoteleft, 0x0060, "deprecated ") \ + OP(XKB_KEY_Eth, 0x00d0, "deprecated ") \ + OP(XKB_KEY_Thorn, 0x00de, "deprecated ") \ + OP(XKB_KEY_kappa, 0x03a2, "deprecated ") \ + OP(XKB_KEY_kana_middledot, 0x04a5, "deprecated ") \ + OP(XKB_KEY_kana_tu, 0x04af, "deprecated ") \ + OP(XKB_KEY_kana_TI, 0x04c1, "deprecated ") \ + OP(XKB_KEY_kana_TU, 0x04c2, "deprecated ") \ + OP(XKB_KEY_kana_HU, 0x04cc, "deprecated ") \ + OP(XKB_KEY_kana_switch, 0xff7e, "Alias for mode_switch ") \ + OP(XKB_KEY_Arabic_heh, 0x05e7, "deprecated ") \ + OP(XKB_KEY_Arabic_switch, 0xff7e, "Alias for mode_switch ") \ + OP(XKB_KEY_Ukranian_je, 0x06a4, "deprecated ") \ + OP(XKB_KEY_Ukranian_i, 0x06a6, "deprecated ") \ + OP(XKB_KEY_Ukranian_yi, 0x06a7, "deprecated ") \ + OP(XKB_KEY_Serbian_je, 0x06a8, "deprecated ") \ + OP(XKB_KEY_Serbian_lje, 0x06a9, "deprecated ") \ + OP(XKB_KEY_Serbian_nje, 0x06aa, "deprecated ") \ + OP(XKB_KEY_Serbian_dze, 0x06af, "deprecated ") \ + OP(XKB_KEY_Ukranian_JE, 0x06b4, "deprecated ") \ + OP(XKB_KEY_Ukranian_I, 0x06b6, "deprecated ") \ + OP(XKB_KEY_Ukranian_YI, 0x06b7, "deprecated ") \ + OP(XKB_KEY_Serbian_JE, 0x06b8, "deprecated ") \ + OP(XKB_KEY_Serbian_LJE, 0x06b9, "deprecated ") \ + OP(XKB_KEY_Serbian_NJE, 0x06ba, "deprecated ") \ + OP(XKB_KEY_Serbian_DZE, 0x06bf, "deprecated ") \ + OP(XKB_KEY_Greek_IOTAdiaeresis, 0x07a5, "old typo ") \ + OP(XKB_KEY_Greek_switch, 0xff7e, "Alias for mode_switch ") \ + OP(XKB_KEY_topleftsummation, 0x08b1, "") \ + OP(XKB_KEY_botleftsummation, 0x08b2, "") \ + OP(XKB_KEY_topvertsummationconnector, 0x08b3, "") \ + OP(XKB_KEY_botvertsummationconnector, 0x08b4, "") \ + OP(XKB_KEY_toprightsummation, 0x08b5, "") \ + OP(XKB_KEY_botrightsummation, 0x08b6, "") \ + OP(XKB_KEY_rightmiddlesummation, 0x08b7, "") \ + OP(XKB_KEY_blank, 0x09df, "") \ + OP(XKB_KEY_marker, 0x0abf, "") \ + OP(XKB_KEY_trademarkincircle, 0x0acb, "") \ + OP(XKB_KEY_hexagram, 0x0ada, "") \ + OP(XKB_KEY_cursor, 0x0aff, "") \ + OP(XKB_KEY_hebrew_beth, 0x0ce1, "deprecated ") \ + OP(XKB_KEY_hebrew_gimmel, 0x0ce2, "deprecated ") \ + OP(XKB_KEY_hebrew_daleth, 0x0ce3, "deprecated ") \ + OP(XKB_KEY_hebrew_zayin, 0x0ce6, "deprecated ") \ + OP(XKB_KEY_hebrew_het, 0x0ce7, "deprecated ") \ + OP(XKB_KEY_hebrew_teth, 0x0ce8, "deprecated ") \ + OP(XKB_KEY_hebrew_samekh, 0x0cf1, "deprecated ") \ + OP(XKB_KEY_hebrew_finalzadi, 0x0cf5, "deprecated ") \ + OP(XKB_KEY_hebrew_zadi, 0x0cf6, "deprecated ") \ + OP(XKB_KEY_hebrew_kuf, 0x0cf7, "deprecated ") \ + OP(XKB_KEY_hebrew_taf, 0x0cfa, "deprecated ") \ + OP(XKB_KEY_Hebrew_switch, 0xff7e, "Alias for mode_switch ") \ + OP(XKB_KEY_Thai_maihanakat_maitho, 0x0dde, "") \ + OP(XKB_KEY_Hangul, 0xff31, "Hangul start/stop(toggle) ") \ + OP(XKB_KEY_Hangul_Start, 0xff32, "Hangul start ") \ + OP(XKB_KEY_Hangul_End, 0xff33, "Hangul end, English start ") \ + OP(XKB_KEY_Hangul_Hanja, 0xff34, "Start Hangul->Hanja Conversion ") \ + OP(XKB_KEY_Hangul_Jamo, 0xff35, "Hangul Jamo mode ") \ + OP(XKB_KEY_Hangul_Romaja, 0xff36, "Hangul Romaja mode ") \ + OP(XKB_KEY_Hangul_Codeinput, 0xff37, "Hangul code input mode ") \ + OP(XKB_KEY_Hangul_Jeonja, 0xff38, "Jeonja mode ") \ + OP(XKB_KEY_Hangul_Banja, 0xff39, "Banja mode ") \ + OP(XKB_KEY_Hangul_PreHanja, 0xff3a, "Pre Hanja conversion ") \ + OP(XKB_KEY_Hangul_PostHanja, 0xff3b, "Post Hanja conversion ") \ + OP(XKB_KEY_Hangul_SingleCandidate, 0xff3c, "Single candidate ") \ + OP(XKB_KEY_Hangul_MultipleCandidate, 0xff3d, "Multiple candidate ") \ + OP(XKB_KEY_Hangul_PreviousCandidate, 0xff3e, "Previous candidate ") \ + OP(XKB_KEY_Hangul_Special, 0xff3f, "Special symbols ") \ + OP(XKB_KEY_Hangul_switch, 0xff7e, "Alias for mode_switch ") \ + OP(XKB_KEY_Hangul_Kiyeog, 0x0ea1, "") \ + OP(XKB_KEY_Hangul_SsangKiyeog, 0x0ea2, "") \ + OP(XKB_KEY_Hangul_KiyeogSios, 0x0ea3, "") \ + OP(XKB_KEY_Hangul_Nieun, 0x0ea4, "") \ + OP(XKB_KEY_Hangul_NieunJieuj, 0x0ea5, "") \ + OP(XKB_KEY_Hangul_NieunHieuh, 0x0ea6, "") \ + OP(XKB_KEY_Hangul_Dikeud, 0x0ea7, "") \ + OP(XKB_KEY_Hangul_SsangDikeud, 0x0ea8, "") \ + OP(XKB_KEY_Hangul_Rieul, 0x0ea9, "") \ + OP(XKB_KEY_Hangul_RieulKiyeog, 0x0eaa, "") \ + OP(XKB_KEY_Hangul_RieulMieum, 0x0eab, "") \ + OP(XKB_KEY_Hangul_RieulPieub, 0x0eac, "") \ + OP(XKB_KEY_Hangul_RieulSios, 0x0ead, "") \ + OP(XKB_KEY_Hangul_RieulTieut, 0x0eae, "") \ + OP(XKB_KEY_Hangul_RieulPhieuf, 0x0eaf, "") \ + OP(XKB_KEY_Hangul_RieulHieuh, 0x0eb0, "") \ + OP(XKB_KEY_Hangul_Mieum, 0x0eb1, "") \ + OP(XKB_KEY_Hangul_Pieub, 0x0eb2, "") \ + OP(XKB_KEY_Hangul_SsangPieub, 0x0eb3, "") \ + OP(XKB_KEY_Hangul_PieubSios, 0x0eb4, "") \ + OP(XKB_KEY_Hangul_Sios, 0x0eb5, "") \ + OP(XKB_KEY_Hangul_SsangSios, 0x0eb6, "") \ + OP(XKB_KEY_Hangul_Ieung, 0x0eb7, "") \ + OP(XKB_KEY_Hangul_Jieuj, 0x0eb8, "") \ + OP(XKB_KEY_Hangul_SsangJieuj, 0x0eb9, "") \ + OP(XKB_KEY_Hangul_Cieuc, 0x0eba, "") \ + OP(XKB_KEY_Hangul_Khieuq, 0x0ebb, "") \ + OP(XKB_KEY_Hangul_Tieut, 0x0ebc, "") \ + OP(XKB_KEY_Hangul_Phieuf, 0x0ebd, "") \ + OP(XKB_KEY_Hangul_Hieuh, 0x0ebe, "") \ + OP(XKB_KEY_Hangul_A, 0x0ebf, "") \ + OP(XKB_KEY_Hangul_AE, 0x0ec0, "") \ + OP(XKB_KEY_Hangul_YA, 0x0ec1, "") \ + OP(XKB_KEY_Hangul_YAE, 0x0ec2, "") \ + OP(XKB_KEY_Hangul_EO, 0x0ec3, "") \ + OP(XKB_KEY_Hangul_E, 0x0ec4, "") \ + OP(XKB_KEY_Hangul_YEO, 0x0ec5, "") \ + OP(XKB_KEY_Hangul_YE, 0x0ec6, "") \ + OP(XKB_KEY_Hangul_O, 0x0ec7, "") \ + OP(XKB_KEY_Hangul_WA, 0x0ec8, "") \ + OP(XKB_KEY_Hangul_WAE, 0x0ec9, "") \ + OP(XKB_KEY_Hangul_OE, 0x0eca, "") \ + OP(XKB_KEY_Hangul_YO, 0x0ecb, "") \ + OP(XKB_KEY_Hangul_U, 0x0ecc, "") \ + OP(XKB_KEY_Hangul_WEO, 0x0ecd, "") \ + OP(XKB_KEY_Hangul_WE, 0x0ece, "") \ + OP(XKB_KEY_Hangul_WI, 0x0ecf, "") \ + OP(XKB_KEY_Hangul_YU, 0x0ed0, "") \ + OP(XKB_KEY_Hangul_EU, 0x0ed1, "") \ + OP(XKB_KEY_Hangul_YI, 0x0ed2, "") \ + OP(XKB_KEY_Hangul_I, 0x0ed3, "") \ + OP(XKB_KEY_Hangul_J_Kiyeog, 0x0ed4, "") \ + OP(XKB_KEY_Hangul_J_SsangKiyeog, 0x0ed5, "") \ + OP(XKB_KEY_Hangul_J_KiyeogSios, 0x0ed6, "") \ + OP(XKB_KEY_Hangul_J_Nieun, 0x0ed7, "") \ + OP(XKB_KEY_Hangul_J_NieunJieuj, 0x0ed8, "") \ + OP(XKB_KEY_Hangul_J_NieunHieuh, 0x0ed9, "") \ + OP(XKB_KEY_Hangul_J_Dikeud, 0x0eda, "") \ + OP(XKB_KEY_Hangul_J_Rieul, 0x0edb, "") \ + OP(XKB_KEY_Hangul_J_RieulKiyeog, 0x0edc, "") \ + OP(XKB_KEY_Hangul_J_RieulMieum, 0x0edd, "") \ + OP(XKB_KEY_Hangul_J_RieulPieub, 0x0ede, "") \ + OP(XKB_KEY_Hangul_J_RieulSios, 0x0edf, "") \ + OP(XKB_KEY_Hangul_J_RieulTieut, 0x0ee0, "") \ + OP(XKB_KEY_Hangul_J_RieulPhieuf, 0x0ee1, "") \ + OP(XKB_KEY_Hangul_J_RieulHieuh, 0x0ee2, "") \ + OP(XKB_KEY_Hangul_J_Mieum, 0x0ee3, "") \ + OP(XKB_KEY_Hangul_J_Pieub, 0x0ee4, "") \ + OP(XKB_KEY_Hangul_J_PieubSios, 0x0ee5, "") \ + OP(XKB_KEY_Hangul_J_Sios, 0x0ee6, "") \ + OP(XKB_KEY_Hangul_J_SsangSios, 0x0ee7, "") \ + OP(XKB_KEY_Hangul_J_Ieung, 0x0ee8, "") \ + OP(XKB_KEY_Hangul_J_Jieuj, 0x0ee9, "") \ + OP(XKB_KEY_Hangul_J_Cieuc, 0x0eea, "") \ + OP(XKB_KEY_Hangul_J_Khieuq, 0x0eeb, "") \ + OP(XKB_KEY_Hangul_J_Tieut, 0x0eec, "") \ + OP(XKB_KEY_Hangul_J_Phieuf, 0x0eed, "") \ + OP(XKB_KEY_Hangul_J_Hieuh, 0x0eee, "") \ + OP(XKB_KEY_Hangul_RieulYeorinHieuh, 0x0eef, "") \ + OP(XKB_KEY_Hangul_SunkyeongeumMieum, 0x0ef0, "") \ + OP(XKB_KEY_Hangul_SunkyeongeumPieub, 0x0ef1, "") \ + OP(XKB_KEY_Hangul_PanSios, 0x0ef2, "") \ + OP(XKB_KEY_Hangul_KkogjiDalrinIeung, 0x0ef3, "") \ + OP(XKB_KEY_Hangul_SunkyeongeumPhieuf, 0x0ef4, "") \ + OP(XKB_KEY_Hangul_YeorinHieuh, 0x0ef5, "") \ + OP(XKB_KEY_Hangul_AraeA, 0x0ef6, "") \ + OP(XKB_KEY_Hangul_AraeAE, 0x0ef7, "") \ + OP(XKB_KEY_Hangul_J_PanSios, 0x0ef8, "") \ + OP(XKB_KEY_Hangul_J_KkogjiDalrinIeung, 0x0ef9, "") \ + OP(XKB_KEY_Hangul_J_YeorinHieuh, 0x0efa, "") \ + OP(XKB_KEY_braille_dot_1, 0xfff1, "") \ + OP(XKB_KEY_braille_dot_2, 0xfff2, "") \ + OP(XKB_KEY_braille_dot_3, 0xfff3, "") \ + OP(XKB_KEY_braille_dot_4, 0xfff4, "") \ + OP(XKB_KEY_braille_dot_5, 0xfff5, "") \ + OP(XKB_KEY_braille_dot_6, 0xfff6, "") \ + OP(XKB_KEY_braille_dot_7, 0xfff7, "") \ + OP(XKB_KEY_braille_dot_8, 0xfff8, "") \ + OP(XKB_KEY_braille_dot_9, 0xfff9, "") \ + OP(XKB_KEY_braille_dot_10, 0xfffa, "") \ + OP(XKB_KEY_XF86ModeLock, 0x1008FF01, "Mode Switch Lock ") \ + OP(XKB_KEY_XF86MonBrightnessUp, 0x1008FF02, "Monitor/panel brightness ") \ + OP(XKB_KEY_XF86MonBrightnessDown, 0x1008FF03, "Monitor/panel brightness ") \ + OP(XKB_KEY_XF86KbdLightOnOff, 0x1008FF04, "Keyboards may be lit ") \ + OP(XKB_KEY_XF86KbdBrightnessUp, 0x1008FF05, "Keyboards may be lit ") \ + OP(XKB_KEY_XF86KbdBrightnessDown, 0x1008FF06, "Keyboards may be lit ") \ + OP(XKB_KEY_XF86Standby, 0x1008FF10, "System into standby mode ") \ + OP(XKB_KEY_XF86AudioLowerVolume, 0x1008FF11, "Volume control down ") \ + OP(XKB_KEY_XF86AudioMute, 0x1008FF12, "Mute sound from the system ") \ + OP(XKB_KEY_XF86AudioRaiseVolume, 0x1008FF13, "Volume control up ") \ + OP(XKB_KEY_XF86AudioPlay, 0x1008FF14, "Start playing of audio > ") \ + OP(XKB_KEY_XF86AudioStop, 0x1008FF15, "Stop playing audio ") \ + OP(XKB_KEY_XF86AudioPrev, 0x1008FF16, "Previous track ") \ + OP(XKB_KEY_XF86AudioNext, 0x1008FF17, "Next track ") \ + OP(XKB_KEY_XF86HomePage, 0x1008FF18, "Display user's home page ") \ + OP(XKB_KEY_XF86Mail, 0x1008FF19, "Invoke user's mail program ") \ + OP(XKB_KEY_XF86Start, 0x1008FF1A, "Start application ") \ + OP(XKB_KEY_XF86Search, 0x1008FF1B, "Search ") \ + OP(XKB_KEY_XF86AudioRecord, 0x1008FF1C, "Record audio application ") \ + OP(XKB_KEY_XF86Calculator, 0x1008FF1D, "Invoke calculator program ") \ + OP(XKB_KEY_XF86Memo, 0x1008FF1E, "Invoke Memo taking program ") \ + OP(XKB_KEY_XF86ToDoList, 0x1008FF1F, "Invoke To Do List program ") \ + OP(XKB_KEY_XF86Calendar, 0x1008FF20, "Invoke Calendar program ") \ + OP(XKB_KEY_XF86PowerDown, 0x1008FF21, "Deep sleep the system ") \ + OP(XKB_KEY_XF86ContrastAdjust, 0x1008FF22, "Adjust screen contrast ") \ + OP(XKB_KEY_XF86RockerUp, 0x1008FF23, "Rocker switches exist up ") \ + OP(XKB_KEY_XF86RockerDown, 0x1008FF24, "and down ") \ + OP(XKB_KEY_XF86RockerEnter, 0x1008FF25, "and let you press them ") \ + OP(XKB_KEY_XF86Back, 0x1008FF26, "Like back on a browser ") \ + OP(XKB_KEY_XF86Forward, 0x1008FF27, "Like forward on a browser ") \ + OP(XKB_KEY_XF86Stop, 0x1008FF28, "Stop current operation ") \ + OP(XKB_KEY_XF86Refresh, 0x1008FF29, "Refresh the page ") \ + OP(XKB_KEY_XF86PowerOff, 0x1008FF2A, "Power off system entirely ") \ + OP(XKB_KEY_XF86WakeUp, 0x1008FF2B, "Wake up system from sleep ") \ + OP(XKB_KEY_XF86Eject, 0x1008FF2C, "Eject device (e.g. DVD) ") \ + OP(XKB_KEY_XF86ScreenSaver, 0x1008FF2D, "Invoke screensaver ") \ + OP(XKB_KEY_XF86WWW, 0x1008FF2E, "Invoke web browser ") \ + OP(XKB_KEY_XF86Sleep, 0x1008FF2F, "Put system to sleep ") \ + OP(XKB_KEY_XF86Favorites, 0x1008FF30, "Show favorite locations ") \ + OP(XKB_KEY_XF86AudioPause, 0x1008FF31, "Pause audio playing ") \ + OP(XKB_KEY_XF86AudioMedia, 0x1008FF32, "Launch media collection app ") \ + OP(XKB_KEY_XF86MyComputer, 0x1008FF33, "Display \"My Computer\" window ") \ + OP(XKB_KEY_XF86VendorHome, 0x1008FF34, "Display vendor home web site ") \ + OP(XKB_KEY_XF86LightBulb, 0x1008FF35, "Light bulb keys exist ") \ + OP(XKB_KEY_XF86Shop, 0x1008FF36, "Display shopping web site ") \ + OP(XKB_KEY_XF86History, 0x1008FF37, "Show history of web surfing ") \ + OP(XKB_KEY_XF86OpenURL, 0x1008FF38, "Open selected URL ") \ + OP(XKB_KEY_XF86AddFavorite, 0x1008FF39, "Add URL to favorites list ") \ + OP(XKB_KEY_XF86HotLinks, 0x1008FF3A, "Show \"hot\" links ") \ + OP(XKB_KEY_XF86BrightnessAdjust, 0x1008FF3B, "Invoke brightness adj. UI ") \ + OP(XKB_KEY_XF86Finance, 0x1008FF3C, "Display financial site ") \ + OP(XKB_KEY_XF86Community, 0x1008FF3D, "Display user's community ") \ + OP(XKB_KEY_XF86AudioRewind, 0x1008FF3E, "\"rewind\" audio track ") \ + OP(XKB_KEY_XF86BackForward, 0x1008FF3F, "??? ") \ + OP(XKB_KEY_XF86Launch0, 0x1008FF40, "Launch Application ") \ + OP(XKB_KEY_XF86Launch1, 0x1008FF41, "Launch Application ") \ + OP(XKB_KEY_XF86Launch2, 0x1008FF42, "Launch Application ") \ + OP(XKB_KEY_XF86Launch3, 0x1008FF43, "Launch Application ") \ + OP(XKB_KEY_XF86Launch4, 0x1008FF44, "Launch Application ") \ + OP(XKB_KEY_XF86Launch5, 0x1008FF45, "Launch Application ") \ + OP(XKB_KEY_XF86Launch6, 0x1008FF46, "Launch Application ") \ + OP(XKB_KEY_XF86Launch7, 0x1008FF47, "Launch Application ") \ + OP(XKB_KEY_XF86Launch8, 0x1008FF48, "Launch Application ") \ + OP(XKB_KEY_XF86Launch9, 0x1008FF49, "Launch Application ") \ + OP(XKB_KEY_XF86LaunchA, 0x1008FF4A, "Launch Application ") \ + OP(XKB_KEY_XF86LaunchB, 0x1008FF4B, "Launch Application ") \ + OP(XKB_KEY_XF86LaunchC, 0x1008FF4C, "Launch Application ") \ + OP(XKB_KEY_XF86LaunchD, 0x1008FF4D, "Launch Application ") \ + OP(XKB_KEY_XF86LaunchE, 0x1008FF4E, "Launch Application ") \ + OP(XKB_KEY_XF86LaunchF, 0x1008FF4F, "Launch Application ") \ + OP(XKB_KEY_XF86ApplicationLeft, 0x1008FF50, "switch to application, left ") \ + OP(XKB_KEY_XF86ApplicationRight, 0x1008FF51, "switch to application, right") \ + OP(XKB_KEY_XF86Book, 0x1008FF52, "Launch bookreader ") \ + OP(XKB_KEY_XF86CD, 0x1008FF53, "Launch CD/DVD player ") \ + OP(XKB_KEY_XF86Calculater, 0x1008FF54, "Launch Calculater ") \ + OP(XKB_KEY_XF86Clear, 0x1008FF55, "Clear window, screen ") \ + OP(XKB_KEY_XF86Close, 0x1008FF56, "Close window ") \ + OP(XKB_KEY_XF86Copy, 0x1008FF57, "Copy selection ") \ + OP(XKB_KEY_XF86Cut, 0x1008FF58, "Cut selection ") \ + OP(XKB_KEY_XF86Display, 0x1008FF59, "Output switch key ") \ + OP(XKB_KEY_XF86DOS, 0x1008FF5A, "Launch DOS (emulation) ") \ + OP(XKB_KEY_XF86Documents, 0x1008FF5B, "Open documents window ") \ + OP(XKB_KEY_XF86Excel, 0x1008FF5C, "Launch spread sheet ") \ + OP(XKB_KEY_XF86Explorer, 0x1008FF5D, "Launch file explorer ") \ + OP(XKB_KEY_XF86Game, 0x1008FF5E, "Launch game ") \ + OP(XKB_KEY_XF86Go, 0x1008FF5F, "Go to URL ") \ + OP(XKB_KEY_XF86iTouch, 0x1008FF60, "Logitch iTouch- don't use ") \ + OP(XKB_KEY_XF86LogOff, 0x1008FF61, "Log off system ") \ + OP(XKB_KEY_XF86Market, 0x1008FF62, "?? ") \ + OP(XKB_KEY_XF86Meeting, 0x1008FF63, "enter meeting in calendar ") \ + OP(XKB_KEY_XF86MenuKB, 0x1008FF65, "distingush keyboard from PB ") \ + OP(XKB_KEY_XF86MenuPB, 0x1008FF66, "distinuish PB from keyboard ") \ + OP(XKB_KEY_XF86MySites, 0x1008FF67, "Favourites ") \ + OP(XKB_KEY_XF86New, 0x1008FF68, "New (folder, document... ") \ + OP(XKB_KEY_XF86News, 0x1008FF69, "News ") \ + OP(XKB_KEY_XF86OfficeHome, 0x1008FF6A, "Office home (old Staroffice)") \ + OP(XKB_KEY_XF86Open, 0x1008FF6B, "Open ") \ + OP(XKB_KEY_XF86Option, 0x1008FF6C, "?? ") \ + OP(XKB_KEY_XF86Paste, 0x1008FF6D, "Paste ") \ + OP(XKB_KEY_XF86Phone, 0x1008FF6E, "Launch phone; dial number ") \ + OP(XKB_KEY_XF86Q, 0x1008FF70, "Compaq's Q - don't use ") \ + OP(XKB_KEY_XF86Reply, 0x1008FF72, "Reply e.g., mail ") \ + OP(XKB_KEY_XF86Reload, 0x1008FF73, "Reload web page, file, etc. ") \ + OP(XKB_KEY_XF86RotateWindows, 0x1008FF74, "Rotate windows e.g. xrandr ") \ + OP(XKB_KEY_XF86RotationPB, 0x1008FF75, "don't use ") \ + OP(XKB_KEY_XF86RotationKB, 0x1008FF76, "don't use ") \ + OP(XKB_KEY_XF86Save, 0x1008FF77, "Save (file, document, state ") \ + OP(XKB_KEY_XF86ScrollUp, 0x1008FF78, "Scroll window/contents up ") \ + OP(XKB_KEY_XF86ScrollDown, 0x1008FF79, "Scrool window/contentd down ") \ + OP(XKB_KEY_XF86ScrollClick, 0x1008FF7A, "Use XKB mousekeys instead ") \ + OP(XKB_KEY_XF86Send, 0x1008FF7B, "Send mail, file, object ") \ + OP(XKB_KEY_XF86Spell, 0x1008FF7C, "Spell checker ") \ + OP(XKB_KEY_XF86SplitScreen, 0x1008FF7D, "Split window or screen ") \ + OP(XKB_KEY_XF86Support, 0x1008FF7E, "Get support (\?\?) ") \ + OP(XKB_KEY_XF86TaskPane, 0x1008FF7F, "Show tasks ") \ + OP(XKB_KEY_XF86Terminal, 0x1008FF80, "Launch terminal emulator ") \ + OP(XKB_KEY_XF86Tools, 0x1008FF81, "toolbox of desktop/app. ") \ + OP(XKB_KEY_XF86Travel, 0x1008FF82, "?? ") \ + OP(XKB_KEY_XF86UserPB, 0x1008FF84, "?? ") \ + OP(XKB_KEY_XF86User1KB, 0x1008FF85, "?? ") \ + OP(XKB_KEY_XF86User2KB, 0x1008FF86, "?? ") \ + OP(XKB_KEY_XF86Video, 0x1008FF87, "Launch video player ") \ + OP(XKB_KEY_XF86WheelButton, 0x1008FF88, "button from a mouse wheel ") \ + OP(XKB_KEY_XF86Word, 0x1008FF89, "Launch word processor ") \ + OP(XKB_KEY_XF86Xfer, 0x1008FF8A, "") \ + OP(XKB_KEY_XF86ZoomIn, 0x1008FF8B, "zoom in view, map, etc. ") \ + OP(XKB_KEY_XF86ZoomOut, 0x1008FF8C, "zoom out view, map, etc. ") \ + OP(XKB_KEY_XF86Away, 0x1008FF8D, "mark yourself as away ") \ + OP(XKB_KEY_XF86Messenger, 0x1008FF8E, "as in instant messaging ") \ + OP(XKB_KEY_XF86WebCam, 0x1008FF8F, "Launch web camera app. ") \ + OP(XKB_KEY_XF86MailForward, 0x1008FF90, "Forward in mail ") \ + OP(XKB_KEY_XF86Pictures, 0x1008FF91, "Show pictures ") \ + OP(XKB_KEY_XF86Music, 0x1008FF92, "Launch music application ") \ + OP(XKB_KEY_XF86Battery, 0x1008FF93, "Display battery information ") \ + OP(XKB_KEY_XF86Bluetooth, 0x1008FF94, "Enable/disable Bluetooth ") \ + OP(XKB_KEY_XF86WLAN, 0x1008FF95, "Enable/disable WLAN ") \ + OP(XKB_KEY_XF86UWB, 0x1008FF96, "Enable/disable UWB ") \ + OP(XKB_KEY_XF86AudioForward, 0x1008FF97, "fast-forward audio track ") \ + OP(XKB_KEY_XF86AudioRepeat, 0x1008FF98, "toggle repeat mode ") \ + OP(XKB_KEY_XF86AudioRandomPlay, 0x1008FF99, "toggle shuffle mode ") \ + OP(XKB_KEY_XF86Subtitle, 0x1008FF9A, "cycle through subtitle ") \ + OP(XKB_KEY_XF86AudioCycleTrack, 0x1008FF9B, "cycle through audio tracks ") \ + OP(XKB_KEY_XF86CycleAngle, 0x1008FF9C, "cycle through angles ") \ + OP(XKB_KEY_XF86FrameBack, 0x1008FF9D, "video: go one frame back ") \ + OP(XKB_KEY_XF86FrameForward, 0x1008FF9E, "video: go one frame forward ") \ + OP(XKB_KEY_XF86Time, 0x1008FF9F, "display, or shows an entry for time seeking ") \ + OP(XKB_KEY_XF86Select, 0x1008FFA0, "Select button on joypads and remotes ") \ + OP(XKB_KEY_XF86View, 0x1008FFA1, "Show a view options/properties ") \ + OP(XKB_KEY_XF86TopMenu, 0x1008FFA2, "Go to a top-level menu in a video ") \ + OP(XKB_KEY_XF86Red, 0x1008FFA3, "Red button ") \ + OP(XKB_KEY_XF86Green, 0x1008FFA4, "Green button ") \ + OP(XKB_KEY_XF86Yellow, 0x1008FFA5, "Yellow button ") \ + OP(XKB_KEY_XF86Blue, 0x1008FFA6, "Blue button ") \ + OP(XKB_KEY_XF86Suspend, 0x1008FFA7, "Sleep to RAM ") \ + OP(XKB_KEY_XF86Hibernate, 0x1008FFA8, "Sleep to disk ") \ + OP(XKB_KEY_XF86TouchpadToggle, 0x1008FFA9, "Toggle between touchpad/trackstick ") \ + OP(XKB_KEY_XF86TouchpadOn, 0x1008FFB0, "The touchpad got switched on ") \ + OP(XKB_KEY_XF86TouchpadOff, 0x1008FFB1, "The touchpad got switched off ") \ + OP(XKB_KEY_XF86AudioMicMute, 0x1008FFB2, "Mute the Mic from the system ") \ + OP(XKB_KEY_XF86Keyboard, 0x1008FFB3, "User defined keyboard related action ") \ + OP(XKB_KEY_XF86WWAN, 0x1008FFB4, "Toggle WWAN (LTE, UMTS, etc.) radio ") \ + OP(XKB_KEY_XF86RFKill, 0x1008FFB5, "Toggle radios on/off ") \ + OP(XKB_KEY_XF86AudioPreset, 0x1008FFB6, "Select equalizer preset, e.g. theatre-mode ") \ + OP(XKB_KEY_XF86Switch_VT_1, 0x1008FE01, "") \ + OP(XKB_KEY_XF86Switch_VT_2, 0x1008FE02, "") \ + OP(XKB_KEY_XF86Switch_VT_3, 0x1008FE03, "") \ + OP(XKB_KEY_XF86Switch_VT_4, 0x1008FE04, "") \ + OP(XKB_KEY_XF86Switch_VT_5, 0x1008FE05, "") \ + OP(XKB_KEY_XF86Switch_VT_6, 0x1008FE06, "") \ + OP(XKB_KEY_XF86Switch_VT_7, 0x1008FE07, "") \ + OP(XKB_KEY_XF86Switch_VT_8, 0x1008FE08, "") \ + OP(XKB_KEY_XF86Switch_VT_9, 0x1008FE09, "") \ + OP(XKB_KEY_XF86Switch_VT_10, 0x1008FE0A, "") \ + OP(XKB_KEY_XF86Switch_VT_11, 0x1008FE0B, "") \ + OP(XKB_KEY_XF86Switch_VT_12, 0x1008FE0C, "") \ + OP(XKB_KEY_XF86Ungrab, 0x1008FE20, "force ungrab ") \ + OP(XKB_KEY_XF86ClearGrab, 0x1008FE21, "kill application with grab ") \ + OP(XKB_KEY_XF86Next_VMode, 0x1008FE22, "next video mode available ") \ + OP(XKB_KEY_XF86Prev_VMode, 0x1008FE23, "prev. video mode available ") \ + OP(XKB_KEY_XF86LogWindowTree, 0x1008FE24, "print window tree to log ") \ + OP(XKB_KEY_XF86LogGrabInfo, 0x1008FE25, "print all active grabs to log ") \ + OP(XKB_KEY_SunFA_Grave, 0x1005FF00, "") \ + OP(XKB_KEY_SunFA_Circum, 0x1005FF01, "") \ + OP(XKB_KEY_SunFA_Tilde, 0x1005FF02, "") \ + OP(XKB_KEY_SunFA_Acute, 0x1005FF03, "") \ + OP(XKB_KEY_SunFA_Diaeresis, 0x1005FF04, "") \ + OP(XKB_KEY_SunFA_Cedilla, 0x1005FF05, "") \ + OP(XKB_KEY_SunF36, 0x1005FF10, "Labeled F11 ") \ + OP(XKB_KEY_SunF37, 0x1005FF11, "Labeled F12 ") \ + OP(XKB_KEY_SunSys_Req, 0x1005FF60, "") \ + OP(XKB_KEY_SunPrint_Screen, 0x0000FF61, "Same as XK_Print ") \ + OP(XKB_KEY_SunCompose, 0x0000FF20, "Same as XK_Multi_key ") \ + OP(XKB_KEY_SunAltGraph, 0x0000FF7E, "Same as XK_Mode_switch ") \ + OP(XKB_KEY_SunPageUp, 0x0000FF55, "Same as XK_Prior ") \ + OP(XKB_KEY_SunPageDown, 0x0000FF56, "Same as XK_Next ") \ + OP(XKB_KEY_SunUndo, 0x0000FF65, "Same as XK_Undo ") \ + OP(XKB_KEY_SunAgain, 0x0000FF66, "Same as XK_Redo ") \ + OP(XKB_KEY_SunFind, 0x0000FF68, "Same as XK_Find ") \ + OP(XKB_KEY_SunStop, 0x0000FF69, "Same as XK_Cancel ") \ + OP(XKB_KEY_SunProps, 0x1005FF70, "") \ + OP(XKB_KEY_SunFront, 0x1005FF71, "") \ + OP(XKB_KEY_SunCopy, 0x1005FF72, "") \ + OP(XKB_KEY_SunOpen, 0x1005FF73, "") \ + OP(XKB_KEY_SunPaste, 0x1005FF74, "") \ + OP(XKB_KEY_SunCut, 0x1005FF75, "") \ + OP(XKB_KEY_SunPowerSwitch, 0x1005FF76, "") \ + OP(XKB_KEY_SunAudioLowerVolume, 0x1005FF77, "") \ + OP(XKB_KEY_SunAudioMute, 0x1005FF78, "") \ + OP(XKB_KEY_SunAudioRaiseVolume, 0x1005FF79, "") \ + OP(XKB_KEY_SunVideoDegauss, 0x1005FF7A, "") \ + OP(XKB_KEY_SunVideoLowerBrightness, 0x1005FF7B, "") \ + OP(XKB_KEY_SunVideoRaiseBrightness, 0x1005FF7C, "") \ + OP(XKB_KEY_SunPowerSwitchShift, 0x1005FF7D, "") \ + OP(XKB_KEY_Dring_accent, 0x1000FEB0, "") \ + OP(XKB_KEY_Dcircumflex_accent, 0x1000FE5E, "") \ + OP(XKB_KEY_Dcedilla_accent, 0x1000FE2C, "") \ + OP(XKB_KEY_Dacute_accent, 0x1000FE27, "") \ + OP(XKB_KEY_Dgrave_accent, 0x1000FE60, "") \ + OP(XKB_KEY_Dtilde, 0x1000FE7E, "") \ + OP(XKB_KEY_Ddiaeresis, 0x1000FE22, "") \ + OP(XKB_KEY_DRemove, 0x1000FF00, "Remove ") \ + OP(XKB_KEY_hpClearLine, 0x1000FF6F, "") \ + OP(XKB_KEY_hpInsertLine, 0x1000FF70, "") \ + OP(XKB_KEY_hpDeleteLine, 0x1000FF71, "") \ + OP(XKB_KEY_hpInsertChar, 0x1000FF72, "") \ + OP(XKB_KEY_hpDeleteChar, 0x1000FF73, "") \ + OP(XKB_KEY_hpBackTab, 0x1000FF74, "") \ + OP(XKB_KEY_hpKP_BackTab, 0x1000FF75, "") \ + OP(XKB_KEY_hpModelock1, 0x1000FF48, "") \ + OP(XKB_KEY_hpModelock2, 0x1000FF49, "") \ + OP(XKB_KEY_hpReset, 0x1000FF6C, "") \ + OP(XKB_KEY_hpSystem, 0x1000FF6D, "") \ + OP(XKB_KEY_hpUser, 0x1000FF6E, "") \ + OP(XKB_KEY_hpmute_acute, 0x100000A8, "") \ + OP(XKB_KEY_hpmute_grave, 0x100000A9, "") \ + OP(XKB_KEY_hpmute_asciicircum, 0x100000AA, "") \ + OP(XKB_KEY_hpmute_diaeresis, 0x100000AB, "") \ + OP(XKB_KEY_hpmute_asciitilde, 0x100000AC, "") \ + OP(XKB_KEY_hplira, 0x100000AF, "") \ + OP(XKB_KEY_hpguilder, 0x100000BE, "") \ + OP(XKB_KEY_hpYdiaeresis, 0x100000EE, "") \ + OP(XKB_KEY_hpIO, 0x100000EE, "") \ + OP(XKB_KEY_hplongminus, 0x100000F6, "") \ + OP(XKB_KEY_hpblock, 0x100000FC, "") \ + OP(XKB_KEY_osfCopy, 0x1004FF02, "") \ + OP(XKB_KEY_osfCut, 0x1004FF03, "") \ + OP(XKB_KEY_osfPaste, 0x1004FF04, "") \ + OP(XKB_KEY_osfBackTab, 0x1004FF07, "") \ + OP(XKB_KEY_osfBackSpace, 0x1004FF08, "") \ + OP(XKB_KEY_osfClear, 0x1004FF0B, "") \ + OP(XKB_KEY_osfEscape, 0x1004FF1B, "") \ + OP(XKB_KEY_osfAddMode, 0x1004FF31, "") \ + OP(XKB_KEY_osfPrimaryPaste, 0x1004FF32, "") \ + OP(XKB_KEY_osfQuickPaste, 0x1004FF33, "") \ + OP(XKB_KEY_osfPageLeft, 0x1004FF40, "") \ + OP(XKB_KEY_osfPageUp, 0x1004FF41, "") \ + OP(XKB_KEY_osfPageDown, 0x1004FF42, "") \ + OP(XKB_KEY_osfPageRight, 0x1004FF43, "") \ + OP(XKB_KEY_osfActivate, 0x1004FF44, "") \ + OP(XKB_KEY_osfMenuBar, 0x1004FF45, "") \ + OP(XKB_KEY_osfLeft, 0x1004FF51, "") \ + OP(XKB_KEY_osfUp, 0x1004FF52, "") \ + OP(XKB_KEY_osfRight, 0x1004FF53, "") \ + OP(XKB_KEY_osfDown, 0x1004FF54, "") \ + OP(XKB_KEY_osfEndLine, 0x1004FF57, "") \ + OP(XKB_KEY_osfBeginLine, 0x1004FF58, "") \ + OP(XKB_KEY_osfEndData, 0x1004FF59, "") \ + OP(XKB_KEY_osfBeginData, 0x1004FF5A, "") \ + OP(XKB_KEY_osfPrevMenu, 0x1004FF5B, "") \ + OP(XKB_KEY_osfNextMenu, 0x1004FF5C, "") \ + OP(XKB_KEY_osfPrevField, 0x1004FF5D, "") \ + OP(XKB_KEY_osfNextField, 0x1004FF5E, "") \ + OP(XKB_KEY_osfSelect, 0x1004FF60, "") \ + OP(XKB_KEY_osfInsert, 0x1004FF63, "") \ + OP(XKB_KEY_osfUndo, 0x1004FF65, "") \ + OP(XKB_KEY_osfMenu, 0x1004FF67, "") \ + OP(XKB_KEY_osfCancel, 0x1004FF69, "") \ + OP(XKB_KEY_osfHelp, 0x1004FF6A, "") \ + OP(XKB_KEY_osfSelectAll, 0x1004FF71, "") \ + OP(XKB_KEY_osfDeselectAll, 0x1004FF72, "") \ + OP(XKB_KEY_osfReselect, 0x1004FF73, "") \ + OP(XKB_KEY_osfExtend, 0x1004FF74, "") \ + OP(XKB_KEY_osfRestore, 0x1004FF78, "") \ + OP(XKB_KEY_osfDelete, 0x1004FFFF, "") \ + OP(XKB_KEY_Reset, 0x1000FF6C, "") \ + OP(XKB_KEY_System, 0x1000FF6D, "") \ + OP(XKB_KEY_User, 0x1000FF6E, "") \ + OP(XKB_KEY_ClearLine, 0x1000FF6F, "") \ + OP(XKB_KEY_InsertLine, 0x1000FF70, "") \ + OP(XKB_KEY_DeleteLine, 0x1000FF71, "") \ + OP(XKB_KEY_InsertChar, 0x1000FF72, "") \ + OP(XKB_KEY_DeleteChar, 0x1000FF73, "") \ + OP(XKB_KEY_BackTab, 0x1000FF74, "") \ + OP(XKB_KEY_KP_BackTab, 0x1000FF75, "") \ + OP(XKB_KEY_Ext16bit_L, 0x1000FF76, "") \ + OP(XKB_KEY_Ext16bit_R, 0x1000FF77, "") \ + OP(XKB_KEY_mute_acute, 0x100000a8, "") \ + OP(XKB_KEY_mute_grave, 0x100000a9, "") \ + OP(XKB_KEY_mute_asciicircum, 0x100000aa, "") \ + OP(XKB_KEY_mute_diaeresis, 0x100000ab, "") \ + OP(XKB_KEY_mute_asciitilde, 0x100000ac, "") \ + OP(XKB_KEY_lira, 0x100000af, "") \ + OP(XKB_KEY_guilder, 0x100000be, "") \ + OP(XKB_KEY_IO, 0x100000ee, "") \ + OP(XKB_KEY_longminus, 0x100000f6, "") \ + OP(XKB_KEY_block, 0x100000fc, "") diff --git a/src/kaleidoscope/host_keymap/xkbcommon_keysyms_printable.h b/src/kaleidoscope/host_keymap/xkbcommon_keysyms_printable.h new file mode 100644 index 0000000000..43fb8ff4eb --- /dev/null +++ b/src/kaleidoscope/host_keymap/xkbcommon_keysyms_printable.h @@ -0,0 +1,1607 @@ +/* Kaleidoscope - Firmware for computer input devices + * Copyright (C) 2013-2018 Keyboard.io, Inc. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once + +// Information extracted from xkbcommon-keysyms.h + +// Function macro invoked with arguments +// KEY_SYM_NAME, KEY_SYM, UNICODE, DESC +// +#define XKB_KEY_NAME__KEY_SYM__UNICODE__DESC(OP) \ + OP(XKB_KEY_space, 0x0020, 0x0020, "SPACE") \ + OP(XKB_KEY_exclam, 0x0021, 0x0021, "EXCLAMATION MARK") \ + OP(XKB_KEY_quotedbl, 0x0022, 0x0022, "QUOTATION MARK") \ + OP(XKB_KEY_numbersign, 0x0023, 0x0023, "NUMBER SIGN") \ + OP(XKB_KEY_dollar, 0x0024, 0x0024, "DOLLAR SIGN") \ + OP(XKB_KEY_percent, 0x0025, 0x0025, "PERCENT SIGN") \ + OP(XKB_KEY_ampersand, 0x0026, 0x0026, "AMPERSAND") \ + OP(XKB_KEY_apostrophe, 0x0027, 0x0027, "APOSTROPHE") \ + OP(XKB_KEY_parenleft, 0x0028, 0x0028, "LEFT PARENTHESIS") \ + OP(XKB_KEY_parenright, 0x0029, 0x0029, "RIGHT PARENTHESIS") \ + OP(XKB_KEY_asterisk, 0x002a, 0x002A, "ASTERISK") \ + OP(XKB_KEY_plus, 0x002b, 0x002B, "PLUS SIGN") \ + OP(XKB_KEY_comma, 0x002c, 0x002C, "COMMA") \ + OP(XKB_KEY_minus, 0x002d, 0x002D, "HYPHEN-MINUS") \ + OP(XKB_KEY_period, 0x002e, 0x002E, "FULL STOP") \ + OP(XKB_KEY_slash, 0x002f, 0x002F, "SOLIDUS") \ + OP(XKB_KEY_0, 0x0030, 0x0030, "DIGIT ZERO") \ + OP(XKB_KEY_1, 0x0031, 0x0031, "DIGIT ONE") \ + OP(XKB_KEY_2, 0x0032, 0x0032, "DIGIT TWO") \ + OP(XKB_KEY_3, 0x0033, 0x0033, "DIGIT THREE") \ + OP(XKB_KEY_4, 0x0034, 0x0034, "DIGIT FOUR") \ + OP(XKB_KEY_5, 0x0035, 0x0035, "DIGIT FIVE") \ + OP(XKB_KEY_6, 0x0036, 0x0036, "DIGIT SIX") \ + OP(XKB_KEY_7, 0x0037, 0x0037, "DIGIT SEVEN") \ + OP(XKB_KEY_8, 0x0038, 0x0038, "DIGIT EIGHT") \ + OP(XKB_KEY_9, 0x0039, 0x0039, "DIGIT NINE") \ + OP(XKB_KEY_colon, 0x003a, 0x003A, "COLON") \ + OP(XKB_KEY_semicolon, 0x003b, 0x003B, "SEMICOLON") \ + OP(XKB_KEY_less, 0x003c, 0x003C, "LESS-THAN SIGN") \ + OP(XKB_KEY_equal, 0x003d, 0x003D, "EQUALS SIGN") \ + OP(XKB_KEY_greater, 0x003e, 0x003E, "GREATER-THAN SIGN") \ + OP(XKB_KEY_question, 0x003f, 0x003F, "QUESTION MARK") \ + OP(XKB_KEY_at, 0x0040, 0x0040, "COMMERCIAL AT") \ + OP(XKB_KEY_A, 0x0041, 0x0041, "LATIN CAPITAL LETTER A") \ + OP(XKB_KEY_B, 0x0042, 0x0042, "LATIN CAPITAL LETTER B") \ + OP(XKB_KEY_C, 0x0043, 0x0043, "LATIN CAPITAL LETTER C") \ + OP(XKB_KEY_D, 0x0044, 0x0044, "LATIN CAPITAL LETTER D") \ + OP(XKB_KEY_E, 0x0045, 0x0045, "LATIN CAPITAL LETTER E") \ + OP(XKB_KEY_F, 0x0046, 0x0046, "LATIN CAPITAL LETTER F") \ + OP(XKB_KEY_G, 0x0047, 0x0047, "LATIN CAPITAL LETTER G") \ + OP(XKB_KEY_H, 0x0048, 0x0048, "LATIN CAPITAL LETTER H") \ + OP(XKB_KEY_I, 0x0049, 0x0049, "LATIN CAPITAL LETTER I") \ + OP(XKB_KEY_J, 0x004a, 0x004A, "LATIN CAPITAL LETTER J") \ + OP(XKB_KEY_K, 0x004b, 0x004B, "LATIN CAPITAL LETTER K") \ + OP(XKB_KEY_L, 0x004c, 0x004C, "LATIN CAPITAL LETTER L") \ + OP(XKB_KEY_M, 0x004d, 0x004D, "LATIN CAPITAL LETTER M") \ + OP(XKB_KEY_N, 0x004e, 0x004E, "LATIN CAPITAL LETTER N") \ + OP(XKB_KEY_O, 0x004f, 0x004F, "LATIN CAPITAL LETTER O") \ + OP(XKB_KEY_P, 0x0050, 0x0050, "LATIN CAPITAL LETTER P") \ + OP(XKB_KEY_Q, 0x0051, 0x0051, "LATIN CAPITAL LETTER Q") \ + OP(XKB_KEY_R, 0x0052, 0x0052, "LATIN CAPITAL LETTER R") \ + OP(XKB_KEY_S, 0x0053, 0x0053, "LATIN CAPITAL LETTER S") \ + OP(XKB_KEY_T, 0x0054, 0x0054, "LATIN CAPITAL LETTER T") \ + OP(XKB_KEY_U, 0x0055, 0x0055, "LATIN CAPITAL LETTER U") \ + OP(XKB_KEY_V, 0x0056, 0x0056, "LATIN CAPITAL LETTER V") \ + OP(XKB_KEY_W, 0x0057, 0x0057, "LATIN CAPITAL LETTER W") \ + OP(XKB_KEY_X, 0x0058, 0x0058, "LATIN CAPITAL LETTER X") \ + OP(XKB_KEY_Y, 0x0059, 0x0059, "LATIN CAPITAL LETTER Y") \ + OP(XKB_KEY_Z, 0x005a, 0x005A, "LATIN CAPITAL LETTER Z") \ + OP(XKB_KEY_bracketleft, 0x005b, 0x005B, "LEFT SQUARE BRACKET") \ + OP(XKB_KEY_backslash, 0x005c, 0x005C, "REVERSE SOLIDUS") \ + OP(XKB_KEY_bracketright, 0x005d, 0x005D, "RIGHT SQUARE BRACKET") \ + OP(XKB_KEY_asciicircum, 0x005e, 0x005E, "CIRCUMFLEX ACCENT") \ + OP(XKB_KEY_underscore, 0x005f, 0x005F, "LOW LINE") \ + OP(XKB_KEY_grave, 0x0060, 0x0060, "GRAVE ACCENT") \ + OP(XKB_KEY_a, 0x0061, 0x0061, "LATIN SMALL LETTER A") \ + OP(XKB_KEY_b, 0x0062, 0x0062, "LATIN SMALL LETTER B") \ + OP(XKB_KEY_c, 0x0063, 0x0063, "LATIN SMALL LETTER C") \ + OP(XKB_KEY_d, 0x0064, 0x0064, "LATIN SMALL LETTER D") \ + OP(XKB_KEY_e, 0x0065, 0x0065, "LATIN SMALL LETTER E") \ + OP(XKB_KEY_f, 0x0066, 0x0066, "LATIN SMALL LETTER F") \ + OP(XKB_KEY_g, 0x0067, 0x0067, "LATIN SMALL LETTER G") \ + OP(XKB_KEY_h, 0x0068, 0x0068, "LATIN SMALL LETTER H") \ + OP(XKB_KEY_i, 0x0069, 0x0069, "LATIN SMALL LETTER I") \ + OP(XKB_KEY_j, 0x006a, 0x006A, "LATIN SMALL LETTER J") \ + OP(XKB_KEY_k, 0x006b, 0x006B, "LATIN SMALL LETTER K") \ + OP(XKB_KEY_l, 0x006c, 0x006C, "LATIN SMALL LETTER L") \ + OP(XKB_KEY_m, 0x006d, 0x006D, "LATIN SMALL LETTER M") \ + OP(XKB_KEY_n, 0x006e, 0x006E, "LATIN SMALL LETTER N") \ + OP(XKB_KEY_o, 0x006f, 0x006F, "LATIN SMALL LETTER O") \ + OP(XKB_KEY_p, 0x0070, 0x0070, "LATIN SMALL LETTER P") \ + OP(XKB_KEY_q, 0x0071, 0x0071, "LATIN SMALL LETTER Q") \ + OP(XKB_KEY_r, 0x0072, 0x0072, "LATIN SMALL LETTER R") \ + OP(XKB_KEY_s, 0x0073, 0x0073, "LATIN SMALL LETTER S") \ + OP(XKB_KEY_t, 0x0074, 0x0074, "LATIN SMALL LETTER T") \ + OP(XKB_KEY_u, 0x0075, 0x0075, "LATIN SMALL LETTER U") \ + OP(XKB_KEY_v, 0x0076, 0x0076, "LATIN SMALL LETTER V") \ + OP(XKB_KEY_w, 0x0077, 0x0077, "LATIN SMALL LETTER W") \ + OP(XKB_KEY_x, 0x0078, 0x0078, "LATIN SMALL LETTER X") \ + OP(XKB_KEY_y, 0x0079, 0x0079, "LATIN SMALL LETTER Y") \ + OP(XKB_KEY_z, 0x007a, 0x007A, "LATIN SMALL LETTER Z") \ + OP(XKB_KEY_braceleft, 0x007b, 0x007B, "LEFT CURLY BRACKET") \ + OP(XKB_KEY_bar, 0x007c, 0x007C, "VERTICAL LINE") \ + OP(XKB_KEY_braceright, 0x007d, 0x007D, "RIGHT CURLY BRACKET") \ + OP(XKB_KEY_asciitilde, 0x007e, 0x007E, "TILDE") \ + OP(XKB_KEY_nobreakspace, 0x00a0, 0x00A0, "NO-BREAK SPACE") \ + OP(XKB_KEY_exclamdown, 0x00a1, 0x00A1, "INVERTED EXCLAMATION MARK") \ + OP(XKB_KEY_cent, 0x00a2, 0x00A2, "CENT SIGN") \ + OP(XKB_KEY_sterling, 0x00a3, 0x00A3, "POUND SIGN") \ + OP(XKB_KEY_currency, 0x00a4, 0x00A4, "CURRENCY SIGN") \ + OP(XKB_KEY_yen, 0x00a5, 0x00A5, "YEN SIGN") \ + OP(XKB_KEY_brokenbar, 0x00a6, 0x00A6, "BROKEN BAR") \ + OP(XKB_KEY_section, 0x00a7, 0x00A7, "SECTION SIGN") \ + OP(XKB_KEY_diaeresis, 0x00a8, 0x00A8, "DIAERESIS") \ + OP(XKB_KEY_copyright, 0x00a9, 0x00A9, "COPYRIGHT SIGN") \ + OP(XKB_KEY_ordfeminine, 0x00aa, 0x00AA, "FEMININE ORDINAL INDICATOR") \ + OP(XKB_KEY_guillemotleft, 0x00ab, 0x00AB, "LEFT-POINTING DOUBLE ANGLE QUOTATION MARK") \ + OP(XKB_KEY_notsign, 0x00ac, 0x00AC, "NOT SIGN") \ + OP(XKB_KEY_hyphen, 0x00ad, 0x00AD, "SOFT HYPHEN") \ + OP(XKB_KEY_registered, 0x00ae, 0x00AE, "REGISTERED SIGN") \ + OP(XKB_KEY_macron, 0x00af, 0x00AF, "MACRON") \ + OP(XKB_KEY_degree, 0x00b0, 0x00B0, "DEGREE SIGN") \ + OP(XKB_KEY_plusminus, 0x00b1, 0x00B1, "PLUS-MINUS SIGN") \ + OP(XKB_KEY_twosuperior, 0x00b2, 0x00B2, "SUPERSCRIPT TWO") \ + OP(XKB_KEY_threesuperior, 0x00b3, 0x00B3, "SUPERSCRIPT THREE") \ + OP(XKB_KEY_acute, 0x00b4, 0x00B4, "ACUTE ACCENT") \ + OP(XKB_KEY_mu, 0x00b5, 0x00B5, "MICRO SIGN") \ + OP(XKB_KEY_paragraph, 0x00b6, 0x00B6, "PILCROW SIGN") \ + OP(XKB_KEY_periodcentered, 0x00b7, 0x00B7, "MIDDLE DOT") \ + OP(XKB_KEY_cedilla, 0x00b8, 0x00B8, "CEDILLA") \ + OP(XKB_KEY_onesuperior, 0x00b9, 0x00B9, "SUPERSCRIPT ONE") \ + OP(XKB_KEY_masculine, 0x00ba, 0x00BA, "MASCULINE ORDINAL INDICATOR") \ + OP(XKB_KEY_guillemotright, 0x00bb, 0x00BB, "RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK") \ + OP(XKB_KEY_onequarter, 0x00bc, 0x00BC, "VULGAR FRACTION ONE QUARTER") \ + OP(XKB_KEY_onehalf, 0x00bd, 0x00BD, "VULGAR FRACTION ONE HALF") \ + OP(XKB_KEY_threequarters, 0x00be, 0x00BE, "VULGAR FRACTION THREE QUARTERS") \ + OP(XKB_KEY_questiondown, 0x00bf, 0x00BF, "INVERTED QUESTION MARK") \ + OP(XKB_KEY_Agrave, 0x00c0, 0x00C0, "LATIN CAPITAL LETTER A WITH GRAVE") \ + OP(XKB_KEY_Aacute, 0x00c1, 0x00C1, "LATIN CAPITAL LETTER A WITH ACUTE") \ + OP(XKB_KEY_Acircumflex, 0x00c2, 0x00C2, "LATIN CAPITAL LETTER A WITH CIRCUMFLEX") \ + OP(XKB_KEY_Atilde, 0x00c3, 0x00C3, "LATIN CAPITAL LETTER A WITH TILDE") \ + OP(XKB_KEY_Adiaeresis, 0x00c4, 0x00C4, "LATIN CAPITAL LETTER A WITH DIAERESIS") \ + OP(XKB_KEY_Aring, 0x00c5, 0x00C5, "LATIN CAPITAL LETTER A WITH RING ABOVE") \ + OP(XKB_KEY_AE, 0x00c6, 0x00C6, "LATIN CAPITAL LETTER AE") \ + OP(XKB_KEY_Ccedilla, 0x00c7, 0x00C7, "LATIN CAPITAL LETTER C WITH CEDILLA") \ + OP(XKB_KEY_Egrave, 0x00c8, 0x00C8, "LATIN CAPITAL LETTER E WITH GRAVE") \ + OP(XKB_KEY_Eacute, 0x00c9, 0x00C9, "LATIN CAPITAL LETTER E WITH ACUTE") \ + OP(XKB_KEY_Ecircumflex, 0x00ca, 0x00CA, "LATIN CAPITAL LETTER E WITH CIRCUMFLEX") \ + OP(XKB_KEY_Ediaeresis, 0x00cb, 0x00CB, "LATIN CAPITAL LETTER E WITH DIAERESIS") \ + OP(XKB_KEY_Igrave, 0x00cc, 0x00CC, "LATIN CAPITAL LETTER I WITH GRAVE") \ + OP(XKB_KEY_Iacute, 0x00cd, 0x00CD, "LATIN CAPITAL LETTER I WITH ACUTE") \ + OP(XKB_KEY_Icircumflex, 0x00ce, 0x00CE, "LATIN CAPITAL LETTER I WITH CIRCUMFLEX") \ + OP(XKB_KEY_Idiaeresis, 0x00cf, 0x00CF, "LATIN CAPITAL LETTER I WITH DIAERESIS") \ + OP(XKB_KEY_ETH, 0x00d0, 0x00D0, "LATIN CAPITAL LETTER ETH") \ + OP(XKB_KEY_Ntilde, 0x00d1, 0x00D1, "LATIN CAPITAL LETTER N WITH TILDE") \ + OP(XKB_KEY_Ograve, 0x00d2, 0x00D2, "LATIN CAPITAL LETTER O WITH GRAVE") \ + OP(XKB_KEY_Oacute, 0x00d3, 0x00D3, "LATIN CAPITAL LETTER O WITH ACUTE") \ + OP(XKB_KEY_Ocircumflex, 0x00d4, 0x00D4, "LATIN CAPITAL LETTER O WITH CIRCUMFLEX") \ + OP(XKB_KEY_Otilde, 0x00d5, 0x00D5, "LATIN CAPITAL LETTER O WITH TILDE") \ + OP(XKB_KEY_Odiaeresis, 0x00d6, 0x00D6, "LATIN CAPITAL LETTER O WITH DIAERESIS") \ + OP(XKB_KEY_multiply, 0x00d7, 0x00D7, "MULTIPLICATION SIGN") \ + OP(XKB_KEY_Oslash, 0x00d8, 0x00D8, "LATIN CAPITAL LETTER O WITH STROKE") \ + OP(XKB_KEY_Ooblique, 0x00d8, 0x00D8, "LATIN CAPITAL LETTER O WITH STROKE") \ + OP(XKB_KEY_Ugrave, 0x00d9, 0x00D9, "LATIN CAPITAL LETTER U WITH GRAVE") \ + OP(XKB_KEY_Uacute, 0x00da, 0x00DA, "LATIN CAPITAL LETTER U WITH ACUTE") \ + OP(XKB_KEY_Ucircumflex, 0x00db, 0x00DB, "LATIN CAPITAL LETTER U WITH CIRCUMFLEX") \ + OP(XKB_KEY_Udiaeresis, 0x00dc, 0x00DC, "LATIN CAPITAL LETTER U WITH DIAERESIS") \ + OP(XKB_KEY_Yacute, 0x00dd, 0x00DD, "LATIN CAPITAL LETTER Y WITH ACUTE") \ + OP(XKB_KEY_THORN, 0x00de, 0x00DE, "LATIN CAPITAL LETTER THORN") \ + OP(XKB_KEY_ssharp, 0x00df, 0x00DF, "LATIN SMALL LETTER SHARP S") \ + OP(XKB_KEY_agrave, 0x00e0, 0x00E0, "LATIN SMALL LETTER A WITH GRAVE") \ + OP(XKB_KEY_aacute, 0x00e1, 0x00E1, "LATIN SMALL LETTER A WITH ACUTE") \ + OP(XKB_KEY_acircumflex, 0x00e2, 0x00E2, "LATIN SMALL LETTER A WITH CIRCUMFLEX") \ + OP(XKB_KEY_atilde, 0x00e3, 0x00E3, "LATIN SMALL LETTER A WITH TILDE") \ + OP(XKB_KEY_adiaeresis, 0x00e4, 0x00E4, "LATIN SMALL LETTER A WITH DIAERESIS") \ + OP(XKB_KEY_aring, 0x00e5, 0x00E5, "LATIN SMALL LETTER A WITH RING ABOVE") \ + OP(XKB_KEY_ae, 0x00e6, 0x00E6, "LATIN SMALL LETTER AE") \ + OP(XKB_KEY_ccedilla, 0x00e7, 0x00E7, "LATIN SMALL LETTER C WITH CEDILLA") \ + OP(XKB_KEY_egrave, 0x00e8, 0x00E8, "LATIN SMALL LETTER E WITH GRAVE") \ + OP(XKB_KEY_eacute, 0x00e9, 0x00E9, "LATIN SMALL LETTER E WITH ACUTE") \ + OP(XKB_KEY_ecircumflex, 0x00ea, 0x00EA, "LATIN SMALL LETTER E WITH CIRCUMFLEX") \ + OP(XKB_KEY_ediaeresis, 0x00eb, 0x00EB, "LATIN SMALL LETTER E WITH DIAERESIS") \ + OP(XKB_KEY_igrave, 0x00ec, 0x00EC, "LATIN SMALL LETTER I WITH GRAVE") \ + OP(XKB_KEY_iacute, 0x00ed, 0x00ED, "LATIN SMALL LETTER I WITH ACUTE") \ + OP(XKB_KEY_icircumflex, 0x00ee, 0x00EE, "LATIN SMALL LETTER I WITH CIRCUMFLEX") \ + OP(XKB_KEY_idiaeresis, 0x00ef, 0x00EF, "LATIN SMALL LETTER I WITH DIAERESIS") \ + OP(XKB_KEY_eth, 0x00f0, 0x00F0, "LATIN SMALL LETTER ETH") \ + OP(XKB_KEY_ntilde, 0x00f1, 0x00F1, "LATIN SMALL LETTER N WITH TILDE") \ + OP(XKB_KEY_ograve, 0x00f2, 0x00F2, "LATIN SMALL LETTER O WITH GRAVE") \ + OP(XKB_KEY_oacute, 0x00f3, 0x00F3, "LATIN SMALL LETTER O WITH ACUTE") \ + OP(XKB_KEY_ocircumflex, 0x00f4, 0x00F4, "LATIN SMALL LETTER O WITH CIRCUMFLEX") \ + OP(XKB_KEY_otilde, 0x00f5, 0x00F5, "LATIN SMALL LETTER O WITH TILDE") \ + OP(XKB_KEY_odiaeresis, 0x00f6, 0x00F6, "LATIN SMALL LETTER O WITH DIAERESIS") \ + OP(XKB_KEY_division, 0x00f7, 0x00F7, "DIVISION SIGN") \ + OP(XKB_KEY_oslash, 0x00f8, 0x00F8, "LATIN SMALL LETTER O WITH STROKE") \ + OP(XKB_KEY_ooblique, 0x00f8, 0x00F8, "LATIN SMALL LETTER O WITH STROKE") \ + OP(XKB_KEY_ugrave, 0x00f9, 0x00F9, "LATIN SMALL LETTER U WITH GRAVE") \ + OP(XKB_KEY_uacute, 0x00fa, 0x00FA, "LATIN SMALL LETTER U WITH ACUTE") \ + OP(XKB_KEY_ucircumflex, 0x00fb, 0x00FB, "LATIN SMALL LETTER U WITH CIRCUMFLEX") \ + OP(XKB_KEY_udiaeresis, 0x00fc, 0x00FC, "LATIN SMALL LETTER U WITH DIAERESIS") \ + OP(XKB_KEY_yacute, 0x00fd, 0x00FD, "LATIN SMALL LETTER Y WITH ACUTE") \ + OP(XKB_KEY_thorn, 0x00fe, 0x00FE, "LATIN SMALL LETTER THORN") \ + OP(XKB_KEY_ydiaeresis, 0x00ff, 0x00FF, "LATIN SMALL LETTER Y WITH DIAERESIS") \ + OP(XKB_KEY_Aogonek, 0x01a1, 0x0104, "LATIN CAPITAL LETTER A WITH OGONEK") \ + OP(XKB_KEY_breve, 0x01a2, 0x02D8, "BREVE") \ + OP(XKB_KEY_Lstroke, 0x01a3, 0x0141, "LATIN CAPITAL LETTER L WITH STROKE") \ + OP(XKB_KEY_Lcaron, 0x01a5, 0x013D, "LATIN CAPITAL LETTER L WITH CARON") \ + OP(XKB_KEY_Sacute, 0x01a6, 0x015A, "LATIN CAPITAL LETTER S WITH ACUTE") \ + OP(XKB_KEY_Scaron, 0x01a9, 0x0160, "LATIN CAPITAL LETTER S WITH CARON") \ + OP(XKB_KEY_Scedilla, 0x01aa, 0x015E, "LATIN CAPITAL LETTER S WITH CEDILLA") \ + OP(XKB_KEY_Tcaron, 0x01ab, 0x0164, "LATIN CAPITAL LETTER T WITH CARON") \ + OP(XKB_KEY_Zacute, 0x01ac, 0x0179, "LATIN CAPITAL LETTER Z WITH ACUTE") \ + OP(XKB_KEY_Zcaron, 0x01ae, 0x017D, "LATIN CAPITAL LETTER Z WITH CARON") \ + OP(XKB_KEY_Zabovedot, 0x01af, 0x017B, "LATIN CAPITAL LETTER Z WITH DOT ABOVE") \ + OP(XKB_KEY_aogonek, 0x01b1, 0x0105, "LATIN SMALL LETTER A WITH OGONEK") \ + OP(XKB_KEY_ogonek, 0x01b2, 0x02DB, "OGONEK") \ + OP(XKB_KEY_lstroke, 0x01b3, 0x0142, "LATIN SMALL LETTER L WITH STROKE") \ + OP(XKB_KEY_lcaron, 0x01b5, 0x013E, "LATIN SMALL LETTER L WITH CARON") \ + OP(XKB_KEY_sacute, 0x01b6, 0x015B, "LATIN SMALL LETTER S WITH ACUTE") \ + OP(XKB_KEY_caron, 0x01b7, 0x02C7, "CARON") \ + OP(XKB_KEY_scaron, 0x01b9, 0x0161, "LATIN SMALL LETTER S WITH CARON") \ + OP(XKB_KEY_scedilla, 0x01ba, 0x015F, "LATIN SMALL LETTER S WITH CEDILLA") \ + OP(XKB_KEY_tcaron, 0x01bb, 0x0165, "LATIN SMALL LETTER T WITH CARON") \ + OP(XKB_KEY_zacute, 0x01bc, 0x017A, "LATIN SMALL LETTER Z WITH ACUTE") \ + OP(XKB_KEY_doubleacute, 0x01bd, 0x02DD, "DOUBLE ACUTE ACCENT") \ + OP(XKB_KEY_zcaron, 0x01be, 0x017E, "LATIN SMALL LETTER Z WITH CARON") \ + OP(XKB_KEY_zabovedot, 0x01bf, 0x017C, "LATIN SMALL LETTER Z WITH DOT ABOVE") \ + OP(XKB_KEY_Racute, 0x01c0, 0x0154, "LATIN CAPITAL LETTER R WITH ACUTE") \ + OP(XKB_KEY_Abreve, 0x01c3, 0x0102, "LATIN CAPITAL LETTER A WITH BREVE") \ + OP(XKB_KEY_Lacute, 0x01c5, 0x0139, "LATIN CAPITAL LETTER L WITH ACUTE") \ + OP(XKB_KEY_Cacute, 0x01c6, 0x0106, "LATIN CAPITAL LETTER C WITH ACUTE") \ + OP(XKB_KEY_Ccaron, 0x01c8, 0x010C, "LATIN CAPITAL LETTER C WITH CARON") \ + OP(XKB_KEY_Eogonek, 0x01ca, 0x0118, "LATIN CAPITAL LETTER E WITH OGONEK") \ + OP(XKB_KEY_Ecaron, 0x01cc, 0x011A, "LATIN CAPITAL LETTER E WITH CARON") \ + OP(XKB_KEY_Dcaron, 0x01cf, 0x010E, "LATIN CAPITAL LETTER D WITH CARON") \ + OP(XKB_KEY_Dstroke, 0x01d0, 0x0110, "LATIN CAPITAL LETTER D WITH STROKE") \ + OP(XKB_KEY_Nacute, 0x01d1, 0x0143, "LATIN CAPITAL LETTER N WITH ACUTE") \ + OP(XKB_KEY_Ncaron, 0x01d2, 0x0147, "LATIN CAPITAL LETTER N WITH CARON") \ + OP(XKB_KEY_Odoubleacute, 0x01d5, 0x0150, "LATIN CAPITAL LETTER O WITH DOUBLE ACUTE") \ + OP(XKB_KEY_Rcaron, 0x01d8, 0x0158, "LATIN CAPITAL LETTER R WITH CARON") \ + OP(XKB_KEY_Uring, 0x01d9, 0x016E, "LATIN CAPITAL LETTER U WITH RING ABOVE") \ + OP(XKB_KEY_Udoubleacute, 0x01db, 0x0170, "LATIN CAPITAL LETTER U WITH DOUBLE ACUTE") \ + OP(XKB_KEY_Tcedilla, 0x01de, 0x0162, "LATIN CAPITAL LETTER T WITH CEDILLA") \ + OP(XKB_KEY_racute, 0x01e0, 0x0155, "LATIN SMALL LETTER R WITH ACUTE") \ + OP(XKB_KEY_abreve, 0x01e3, 0x0103, "LATIN SMALL LETTER A WITH BREVE") \ + OP(XKB_KEY_lacute, 0x01e5, 0x013A, "LATIN SMALL LETTER L WITH ACUTE") \ + OP(XKB_KEY_cacute, 0x01e6, 0x0107, "LATIN SMALL LETTER C WITH ACUTE") \ + OP(XKB_KEY_ccaron, 0x01e8, 0x010D, "LATIN SMALL LETTER C WITH CARON") \ + OP(XKB_KEY_eogonek, 0x01ea, 0x0119, "LATIN SMALL LETTER E WITH OGONEK") \ + OP(XKB_KEY_ecaron, 0x01ec, 0x011B, "LATIN SMALL LETTER E WITH CARON") \ + OP(XKB_KEY_dcaron, 0x01ef, 0x010F, "LATIN SMALL LETTER D WITH CARON") \ + OP(XKB_KEY_dstroke, 0x01f0, 0x0111, "LATIN SMALL LETTER D WITH STROKE") \ + OP(XKB_KEY_nacute, 0x01f1, 0x0144, "LATIN SMALL LETTER N WITH ACUTE") \ + OP(XKB_KEY_ncaron, 0x01f2, 0x0148, "LATIN SMALL LETTER N WITH CARON") \ + OP(XKB_KEY_odoubleacute, 0x01f5, 0x0151, "LATIN SMALL LETTER O WITH DOUBLE ACUTE") \ + OP(XKB_KEY_rcaron, 0x01f8, 0x0159, "LATIN SMALL LETTER R WITH CARON") \ + OP(XKB_KEY_uring, 0x01f9, 0x016F, "LATIN SMALL LETTER U WITH RING ABOVE") \ + OP(XKB_KEY_udoubleacute, 0x01fb, 0x0171, "LATIN SMALL LETTER U WITH DOUBLE ACUTE") \ + OP(XKB_KEY_tcedilla, 0x01fe, 0x0163, "LATIN SMALL LETTER T WITH CEDILLA") \ + OP(XKB_KEY_abovedot, 0x01ff, 0x02D9, "DOT ABOVE") \ + OP(XKB_KEY_Hstroke, 0x02a1, 0x0126, "LATIN CAPITAL LETTER H WITH STROKE") \ + OP(XKB_KEY_Hcircumflex, 0x02a6, 0x0124, "LATIN CAPITAL LETTER H WITH CIRCUMFLEX") \ + OP(XKB_KEY_Iabovedot, 0x02a9, 0x0130, "LATIN CAPITAL LETTER I WITH DOT ABOVE") \ + OP(XKB_KEY_Gbreve, 0x02ab, 0x011E, "LATIN CAPITAL LETTER G WITH BREVE") \ + OP(XKB_KEY_Jcircumflex, 0x02ac, 0x0134, "LATIN CAPITAL LETTER J WITH CIRCUMFLEX") \ + OP(XKB_KEY_hstroke, 0x02b1, 0x0127, "LATIN SMALL LETTER H WITH STROKE") \ + OP(XKB_KEY_hcircumflex, 0x02b6, 0x0125, "LATIN SMALL LETTER H WITH CIRCUMFLEX") \ + OP(XKB_KEY_idotless, 0x02b9, 0x0131, "LATIN SMALL LETTER DOTLESS I") \ + OP(XKB_KEY_gbreve, 0x02bb, 0x011F, "LATIN SMALL LETTER G WITH BREVE") \ + OP(XKB_KEY_jcircumflex, 0x02bc, 0x0135, "LATIN SMALL LETTER J WITH CIRCUMFLEX") \ + OP(XKB_KEY_Cabovedot, 0x02c5, 0x010A, "LATIN CAPITAL LETTER C WITH DOT ABOVE") \ + OP(XKB_KEY_Ccircumflex, 0x02c6, 0x0108, "LATIN CAPITAL LETTER C WITH CIRCUMFLEX") \ + OP(XKB_KEY_Gabovedot, 0x02d5, 0x0120, "LATIN CAPITAL LETTER G WITH DOT ABOVE") \ + OP(XKB_KEY_Gcircumflex, 0x02d8, 0x011C, "LATIN CAPITAL LETTER G WITH CIRCUMFLEX") \ + OP(XKB_KEY_Ubreve, 0x02dd, 0x016C, "LATIN CAPITAL LETTER U WITH BREVE") \ + OP(XKB_KEY_Scircumflex, 0x02de, 0x015C, "LATIN CAPITAL LETTER S WITH CIRCUMFLEX") \ + OP(XKB_KEY_cabovedot, 0x02e5, 0x010B, "LATIN SMALL LETTER C WITH DOT ABOVE") \ + OP(XKB_KEY_ccircumflex, 0x02e6, 0x0109, "LATIN SMALL LETTER C WITH CIRCUMFLEX") \ + OP(XKB_KEY_gabovedot, 0x02f5, 0x0121, "LATIN SMALL LETTER G WITH DOT ABOVE") \ + OP(XKB_KEY_gcircumflex, 0x02f8, 0x011D, "LATIN SMALL LETTER G WITH CIRCUMFLEX") \ + OP(XKB_KEY_ubreve, 0x02fd, 0x016D, "LATIN SMALL LETTER U WITH BREVE") \ + OP(XKB_KEY_scircumflex, 0x02fe, 0x015D, "LATIN SMALL LETTER S WITH CIRCUMFLEX") \ + OP(XKB_KEY_kra, 0x03a2, 0x0138, "LATIN SMALL LETTER KRA") \ + OP(XKB_KEY_Rcedilla, 0x03a3, 0x0156, "LATIN CAPITAL LETTER R WITH CEDILLA") \ + OP(XKB_KEY_Itilde, 0x03a5, 0x0128, "LATIN CAPITAL LETTER I WITH TILDE") \ + OP(XKB_KEY_Lcedilla, 0x03a6, 0x013B, "LATIN CAPITAL LETTER L WITH CEDILLA") \ + OP(XKB_KEY_Emacron, 0x03aa, 0x0112, "LATIN CAPITAL LETTER E WITH MACRON") \ + OP(XKB_KEY_Gcedilla, 0x03ab, 0x0122, "LATIN CAPITAL LETTER G WITH CEDILLA") \ + OP(XKB_KEY_Tslash, 0x03ac, 0x0166, "LATIN CAPITAL LETTER T WITH STROKE") \ + OP(XKB_KEY_rcedilla, 0x03b3, 0x0157, "LATIN SMALL LETTER R WITH CEDILLA") \ + OP(XKB_KEY_itilde, 0x03b5, 0x0129, "LATIN SMALL LETTER I WITH TILDE") \ + OP(XKB_KEY_lcedilla, 0x03b6, 0x013C, "LATIN SMALL LETTER L WITH CEDILLA") \ + OP(XKB_KEY_emacron, 0x03ba, 0x0113, "LATIN SMALL LETTER E WITH MACRON") \ + OP(XKB_KEY_gcedilla, 0x03bb, 0x0123, "LATIN SMALL LETTER G WITH CEDILLA") \ + OP(XKB_KEY_tslash, 0x03bc, 0x0167, "LATIN SMALL LETTER T WITH STROKE") \ + OP(XKB_KEY_ENG, 0x03bd, 0x014A, "LATIN CAPITAL LETTER ENG") \ + OP(XKB_KEY_eng, 0x03bf, 0x014B, "LATIN SMALL LETTER ENG") \ + OP(XKB_KEY_Amacron, 0x03c0, 0x0100, "LATIN CAPITAL LETTER A WITH MACRON") \ + OP(XKB_KEY_Iogonek, 0x03c7, 0x012E, "LATIN CAPITAL LETTER I WITH OGONEK") \ + OP(XKB_KEY_Eabovedot, 0x03cc, 0x0116, "LATIN CAPITAL LETTER E WITH DOT ABOVE") \ + OP(XKB_KEY_Imacron, 0x03cf, 0x012A, "LATIN CAPITAL LETTER I WITH MACRON") \ + OP(XKB_KEY_Ncedilla, 0x03d1, 0x0145, "LATIN CAPITAL LETTER N WITH CEDILLA") \ + OP(XKB_KEY_Omacron, 0x03d2, 0x014C, "LATIN CAPITAL LETTER O WITH MACRON") \ + OP(XKB_KEY_Kcedilla, 0x03d3, 0x0136, "LATIN CAPITAL LETTER K WITH CEDILLA") \ + OP(XKB_KEY_Uogonek, 0x03d9, 0x0172, "LATIN CAPITAL LETTER U WITH OGONEK") \ + OP(XKB_KEY_Utilde, 0x03dd, 0x0168, "LATIN CAPITAL LETTER U WITH TILDE") \ + OP(XKB_KEY_Umacron, 0x03de, 0x016A, "LATIN CAPITAL LETTER U WITH MACRON") \ + OP(XKB_KEY_amacron, 0x03e0, 0x0101, "LATIN SMALL LETTER A WITH MACRON") \ + OP(XKB_KEY_iogonek, 0x03e7, 0x012F, "LATIN SMALL LETTER I WITH OGONEK") \ + OP(XKB_KEY_eabovedot, 0x03ec, 0x0117, "LATIN SMALL LETTER E WITH DOT ABOVE") \ + OP(XKB_KEY_imacron, 0x03ef, 0x012B, "LATIN SMALL LETTER I WITH MACRON") \ + OP(XKB_KEY_ncedilla, 0x03f1, 0x0146, "LATIN SMALL LETTER N WITH CEDILLA") \ + OP(XKB_KEY_omacron, 0x03f2, 0x014D, "LATIN SMALL LETTER O WITH MACRON") \ + OP(XKB_KEY_kcedilla, 0x03f3, 0x0137, "LATIN SMALL LETTER K WITH CEDILLA") \ + OP(XKB_KEY_uogonek, 0x03f9, 0x0173, "LATIN SMALL LETTER U WITH OGONEK") \ + OP(XKB_KEY_utilde, 0x03fd, 0x0169, "LATIN SMALL LETTER U WITH TILDE") \ + OP(XKB_KEY_umacron, 0x03fe, 0x016B, "LATIN SMALL LETTER U WITH MACRON") \ + OP(XKB_KEY_Wcircumflex, 0x1000174, 0x0174, "LATIN CAPITAL LETTER W WITH CIRCUMFLEX") \ + OP(XKB_KEY_wcircumflex, 0x1000175, 0x0175, "LATIN SMALL LETTER W WITH CIRCUMFLEX") \ + OP(XKB_KEY_Ycircumflex, 0x1000176, 0x0176, "LATIN CAPITAL LETTER Y WITH CIRCUMFLEX") \ + OP(XKB_KEY_ycircumflex, 0x1000177, 0x0177, "LATIN SMALL LETTER Y WITH CIRCUMFLEX") \ + OP(XKB_KEY_Babovedot, 0x1001e02, 0x1E02, "LATIN CAPITAL LETTER B WITH DOT ABOVE") \ + OP(XKB_KEY_babovedot, 0x1001e03, 0x1E03, "LATIN SMALL LETTER B WITH DOT ABOVE") \ + OP(XKB_KEY_Dabovedot, 0x1001e0a, 0x1E0A, "LATIN CAPITAL LETTER D WITH DOT ABOVE") \ + OP(XKB_KEY_dabovedot, 0x1001e0b, 0x1E0B, "LATIN SMALL LETTER D WITH DOT ABOVE") \ + OP(XKB_KEY_Fabovedot, 0x1001e1e, 0x1E1E, "LATIN CAPITAL LETTER F WITH DOT ABOVE") \ + OP(XKB_KEY_fabovedot, 0x1001e1f, 0x1E1F, "LATIN SMALL LETTER F WITH DOT ABOVE") \ + OP(XKB_KEY_Mabovedot, 0x1001e40, 0x1E40, "LATIN CAPITAL LETTER M WITH DOT ABOVE") \ + OP(XKB_KEY_mabovedot, 0x1001e41, 0x1E41, "LATIN SMALL LETTER M WITH DOT ABOVE") \ + OP(XKB_KEY_Pabovedot, 0x1001e56, 0x1E56, "LATIN CAPITAL LETTER P WITH DOT ABOVE") \ + OP(XKB_KEY_pabovedot, 0x1001e57, 0x1E57, "LATIN SMALL LETTER P WITH DOT ABOVE") \ + OP(XKB_KEY_Sabovedot, 0x1001e60, 0x1E60, "LATIN CAPITAL LETTER S WITH DOT ABOVE") \ + OP(XKB_KEY_sabovedot, 0x1001e61, 0x1E61, "LATIN SMALL LETTER S WITH DOT ABOVE") \ + OP(XKB_KEY_Tabovedot, 0x1001e6a, 0x1E6A, "LATIN CAPITAL LETTER T WITH DOT ABOVE") \ + OP(XKB_KEY_tabovedot, 0x1001e6b, 0x1E6B, "LATIN SMALL LETTER T WITH DOT ABOVE") \ + OP(XKB_KEY_Wgrave, 0x1001e80, 0x1E80, "LATIN CAPITAL LETTER W WITH GRAVE") \ + OP(XKB_KEY_wgrave, 0x1001e81, 0x1E81, "LATIN SMALL LETTER W WITH GRAVE") \ + OP(XKB_KEY_Wacute, 0x1001e82, 0x1E82, "LATIN CAPITAL LETTER W WITH ACUTE") \ + OP(XKB_KEY_wacute, 0x1001e83, 0x1E83, "LATIN SMALL LETTER W WITH ACUTE") \ + OP(XKB_KEY_Wdiaeresis, 0x1001e84, 0x1E84, "LATIN CAPITAL LETTER W WITH DIAERESIS") \ + OP(XKB_KEY_wdiaeresis, 0x1001e85, 0x1E85, "LATIN SMALL LETTER W WITH DIAERESIS") \ + OP(XKB_KEY_Ygrave, 0x1001ef2, 0x1EF2, "LATIN CAPITAL LETTER Y WITH GRAVE") \ + OP(XKB_KEY_ygrave, 0x1001ef3, 0x1EF3, "LATIN SMALL LETTER Y WITH GRAVE") \ + OP(XKB_KEY_OE, 0x13bc, 0x0152, "LATIN CAPITAL LIGATURE OE") \ + OP(XKB_KEY_oe, 0x13bd, 0x0153, "LATIN SMALL LIGATURE OE") \ + OP(XKB_KEY_Ydiaeresis, 0x13be, 0x0178, "LATIN CAPITAL LETTER Y WITH DIAERESIS") \ + OP(XKB_KEY_overline, 0x047e, 0x203E, "OVERLINE") \ + OP(XKB_KEY_kana_fullstop, 0x04a1, 0x3002, "IDEOGRAPHIC FULL STOP") \ + OP(XKB_KEY_kana_openingbracket, 0x04a2, 0x300C, "LEFT CORNER BRACKET") \ + OP(XKB_KEY_kana_closingbracket, 0x04a3, 0x300D, "RIGHT CORNER BRACKET") \ + OP(XKB_KEY_kana_comma, 0x04a4, 0x3001, "IDEOGRAPHIC COMMA") \ + OP(XKB_KEY_kana_conjunctive, 0x04a5, 0x30FB, "KATAKANA MIDDLE DOT") \ + OP(XKB_KEY_kana_WO, 0x04a6, 0x30F2, "KATAKANA LETTER WO") \ + OP(XKB_KEY_kana_a, 0x04a7, 0x30A1, "KATAKANA LETTER SMALL A") \ + OP(XKB_KEY_kana_i, 0x04a8, 0x30A3, "KATAKANA LETTER SMALL I") \ + OP(XKB_KEY_kana_u, 0x04a9, 0x30A5, "KATAKANA LETTER SMALL U") \ + OP(XKB_KEY_kana_e, 0x04aa, 0x30A7, "KATAKANA LETTER SMALL E") \ + OP(XKB_KEY_kana_o, 0x04ab, 0x30A9, "KATAKANA LETTER SMALL O") \ + OP(XKB_KEY_kana_ya, 0x04ac, 0x30E3, "KATAKANA LETTER SMALL YA") \ + OP(XKB_KEY_kana_yu, 0x04ad, 0x30E5, "KATAKANA LETTER SMALL YU") \ + OP(XKB_KEY_kana_yo, 0x04ae, 0x30E7, "KATAKANA LETTER SMALL YO") \ + OP(XKB_KEY_kana_tsu, 0x04af, 0x30C3, "KATAKANA LETTER SMALL TU") \ + OP(XKB_KEY_prolongedsound, 0x04b0, 0x30FC, "KATAKANA-HIRAGANA PROLONGED SOUND MARK") \ + OP(XKB_KEY_kana_A, 0x04b1, 0x30A2, "KATAKANA LETTER A") \ + OP(XKB_KEY_kana_I, 0x04b2, 0x30A4, "KATAKANA LETTER I") \ + OP(XKB_KEY_kana_U, 0x04b3, 0x30A6, "KATAKANA LETTER U") \ + OP(XKB_KEY_kana_E, 0x04b4, 0x30A8, "KATAKANA LETTER E") \ + OP(XKB_KEY_kana_O, 0x04b5, 0x30AA, "KATAKANA LETTER O") \ + OP(XKB_KEY_kana_KA, 0x04b6, 0x30AB, "KATAKANA LETTER KA") \ + OP(XKB_KEY_kana_KI, 0x04b7, 0x30AD, "KATAKANA LETTER KI") \ + OP(XKB_KEY_kana_KU, 0x04b8, 0x30AF, "KATAKANA LETTER KU") \ + OP(XKB_KEY_kana_KE, 0x04b9, 0x30B1, "KATAKANA LETTER KE") \ + OP(XKB_KEY_kana_KO, 0x04ba, 0x30B3, "KATAKANA LETTER KO") \ + OP(XKB_KEY_kana_SA, 0x04bb, 0x30B5, "KATAKANA LETTER SA") \ + OP(XKB_KEY_kana_SHI, 0x04bc, 0x30B7, "KATAKANA LETTER SI") \ + OP(XKB_KEY_kana_SU, 0x04bd, 0x30B9, "KATAKANA LETTER SU") \ + OP(XKB_KEY_kana_SE, 0x04be, 0x30BB, "KATAKANA LETTER SE") \ + OP(XKB_KEY_kana_SO, 0x04bf, 0x30BD, "KATAKANA LETTER SO") \ + OP(XKB_KEY_kana_TA, 0x04c0, 0x30BF, "KATAKANA LETTER TA") \ + OP(XKB_KEY_kana_CHI, 0x04c1, 0x30C1, "KATAKANA LETTER TI") \ + OP(XKB_KEY_kana_TSU, 0x04c2, 0x30C4, "KATAKANA LETTER TU") \ + OP(XKB_KEY_kana_TE, 0x04c3, 0x30C6, "KATAKANA LETTER TE") \ + OP(XKB_KEY_kana_TO, 0x04c4, 0x30C8, "KATAKANA LETTER TO") \ + OP(XKB_KEY_kana_NA, 0x04c5, 0x30CA, "KATAKANA LETTER NA") \ + OP(XKB_KEY_kana_NI, 0x04c6, 0x30CB, "KATAKANA LETTER NI") \ + OP(XKB_KEY_kana_NU, 0x04c7, 0x30CC, "KATAKANA LETTER NU") \ + OP(XKB_KEY_kana_NE, 0x04c8, 0x30CD, "KATAKANA LETTER NE") \ + OP(XKB_KEY_kana_NO, 0x04c9, 0x30CE, "KATAKANA LETTER NO") \ + OP(XKB_KEY_kana_HA, 0x04ca, 0x30CF, "KATAKANA LETTER HA") \ + OP(XKB_KEY_kana_HI, 0x04cb, 0x30D2, "KATAKANA LETTER HI") \ + OP(XKB_KEY_kana_FU, 0x04cc, 0x30D5, "KATAKANA LETTER HU") \ + OP(XKB_KEY_kana_HE, 0x04cd, 0x30D8, "KATAKANA LETTER HE") \ + OP(XKB_KEY_kana_HO, 0x04ce, 0x30DB, "KATAKANA LETTER HO") \ + OP(XKB_KEY_kana_MA, 0x04cf, 0x30DE, "KATAKANA LETTER MA") \ + OP(XKB_KEY_kana_MI, 0x04d0, 0x30DF, "KATAKANA LETTER MI") \ + OP(XKB_KEY_kana_MU, 0x04d1, 0x30E0, "KATAKANA LETTER MU") \ + OP(XKB_KEY_kana_ME, 0x04d2, 0x30E1, "KATAKANA LETTER ME") \ + OP(XKB_KEY_kana_MO, 0x04d3, 0x30E2, "KATAKANA LETTER MO") \ + OP(XKB_KEY_kana_YA, 0x04d4, 0x30E4, "KATAKANA LETTER YA") \ + OP(XKB_KEY_kana_YU, 0x04d5, 0x30E6, "KATAKANA LETTER YU") \ + OP(XKB_KEY_kana_YO, 0x04d6, 0x30E8, "KATAKANA LETTER YO") \ + OP(XKB_KEY_kana_RA, 0x04d7, 0x30E9, "KATAKANA LETTER RA") \ + OP(XKB_KEY_kana_RI, 0x04d8, 0x30EA, "KATAKANA LETTER RI") \ + OP(XKB_KEY_kana_RU, 0x04d9, 0x30EB, "KATAKANA LETTER RU") \ + OP(XKB_KEY_kana_RE, 0x04da, 0x30EC, "KATAKANA LETTER RE") \ + OP(XKB_KEY_kana_RO, 0x04db, 0x30ED, "KATAKANA LETTER RO") \ + OP(XKB_KEY_kana_WA, 0x04dc, 0x30EF, "KATAKANA LETTER WA") \ + OP(XKB_KEY_kana_N, 0x04dd, 0x30F3, "KATAKANA LETTER N") \ + OP(XKB_KEY_voicedsound, 0x04de, 0x309B, "KATAKANA-HIRAGANA VOICED SOUND MARK") \ + OP(XKB_KEY_semivoicedsound, 0x04df, 0x309C, "KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK") \ + OP(XKB_KEY_Farsi_0, 0x10006f0, 0x06F0, "EXTENDED ARABIC-INDIC DIGIT ZERO") \ + OP(XKB_KEY_Farsi_1, 0x10006f1, 0x06F1, "EXTENDED ARABIC-INDIC DIGIT ONE") \ + OP(XKB_KEY_Farsi_2, 0x10006f2, 0x06F2, "EXTENDED ARABIC-INDIC DIGIT TWO") \ + OP(XKB_KEY_Farsi_3, 0x10006f3, 0x06F3, "EXTENDED ARABIC-INDIC DIGIT THREE") \ + OP(XKB_KEY_Farsi_4, 0x10006f4, 0x06F4, "EXTENDED ARABIC-INDIC DIGIT FOUR") \ + OP(XKB_KEY_Farsi_5, 0x10006f5, 0x06F5, "EXTENDED ARABIC-INDIC DIGIT FIVE") \ + OP(XKB_KEY_Farsi_6, 0x10006f6, 0x06F6, "EXTENDED ARABIC-INDIC DIGIT SIX") \ + OP(XKB_KEY_Farsi_7, 0x10006f7, 0x06F7, "EXTENDED ARABIC-INDIC DIGIT SEVEN") \ + OP(XKB_KEY_Farsi_8, 0x10006f8, 0x06F8, "EXTENDED ARABIC-INDIC DIGIT EIGHT") \ + OP(XKB_KEY_Farsi_9, 0x10006f9, 0x06F9, "EXTENDED ARABIC-INDIC DIGIT NINE") \ + OP(XKB_KEY_Arabic_percent, 0x100066a, 0x066A, "ARABIC PERCENT SIGN") \ + OP(XKB_KEY_Arabic_superscript_alef, 0x1000670, 0x0670, "ARABIC LETTER SUPERSCRIPT ALEF") \ + OP(XKB_KEY_Arabic_tteh, 0x1000679, 0x0679, "ARABIC LETTER TTEH") \ + OP(XKB_KEY_Arabic_peh, 0x100067e, 0x067E, "ARABIC LETTER PEH") \ + OP(XKB_KEY_Arabic_tcheh, 0x1000686, 0x0686, "ARABIC LETTER TCHEH") \ + OP(XKB_KEY_Arabic_ddal, 0x1000688, 0x0688, "ARABIC LETTER DDAL") \ + OP(XKB_KEY_Arabic_rreh, 0x1000691, 0x0691, "ARABIC LETTER RREH") \ + OP(XKB_KEY_Arabic_comma, 0x05ac, 0x060C, "ARABIC COMMA") \ + OP(XKB_KEY_Arabic_fullstop, 0x10006d4, 0x06D4, "ARABIC FULL STOP") \ + OP(XKB_KEY_Arabic_0, 0x1000660, 0x0660, "ARABIC-INDIC DIGIT ZERO") \ + OP(XKB_KEY_Arabic_1, 0x1000661, 0x0661, "ARABIC-INDIC DIGIT ONE") \ + OP(XKB_KEY_Arabic_2, 0x1000662, 0x0662, "ARABIC-INDIC DIGIT TWO") \ + OP(XKB_KEY_Arabic_3, 0x1000663, 0x0663, "ARABIC-INDIC DIGIT THREE") \ + OP(XKB_KEY_Arabic_4, 0x1000664, 0x0664, "ARABIC-INDIC DIGIT FOUR") \ + OP(XKB_KEY_Arabic_5, 0x1000665, 0x0665, "ARABIC-INDIC DIGIT FIVE") \ + OP(XKB_KEY_Arabic_6, 0x1000666, 0x0666, "ARABIC-INDIC DIGIT SIX") \ + OP(XKB_KEY_Arabic_7, 0x1000667, 0x0667, "ARABIC-INDIC DIGIT SEVEN") \ + OP(XKB_KEY_Arabic_8, 0x1000668, 0x0668, "ARABIC-INDIC DIGIT EIGHT") \ + OP(XKB_KEY_Arabic_9, 0x1000669, 0x0669, "ARABIC-INDIC DIGIT NINE") \ + OP(XKB_KEY_Arabic_semicolon, 0x05bb, 0x061B, "ARABIC SEMICOLON") \ + OP(XKB_KEY_Arabic_question_mark, 0x05bf, 0x061F, "ARABIC QUESTION MARK") \ + OP(XKB_KEY_Arabic_hamza, 0x05c1, 0x0621, "ARABIC LETTER HAMZA") \ + OP(XKB_KEY_Arabic_maddaonalef, 0x05c2, 0x0622, "ARABIC LETTER ALEF WITH MADDA ABOVE") \ + OP(XKB_KEY_Arabic_hamzaonalef, 0x05c3, 0x0623, "ARABIC LETTER ALEF WITH HAMZA ABOVE") \ + OP(XKB_KEY_Arabic_hamzaonwaw, 0x05c4, 0x0624, "ARABIC LETTER WAW WITH HAMZA ABOVE") \ + OP(XKB_KEY_Arabic_hamzaunderalef, 0x05c5, 0x0625, "ARABIC LETTER ALEF WITH HAMZA BELOW") \ + OP(XKB_KEY_Arabic_hamzaonyeh, 0x05c6, 0x0626, "ARABIC LETTER YEH WITH HAMZA ABOVE") \ + OP(XKB_KEY_Arabic_alef, 0x05c7, 0x0627, "ARABIC LETTER ALEF") \ + OP(XKB_KEY_Arabic_beh, 0x05c8, 0x0628, "ARABIC LETTER BEH") \ + OP(XKB_KEY_Arabic_tehmarbuta, 0x05c9, 0x0629, "ARABIC LETTER TEH MARBUTA") \ + OP(XKB_KEY_Arabic_teh, 0x05ca, 0x062A, "ARABIC LETTER TEH") \ + OP(XKB_KEY_Arabic_theh, 0x05cb, 0x062B, "ARABIC LETTER THEH") \ + OP(XKB_KEY_Arabic_jeem, 0x05cc, 0x062C, "ARABIC LETTER JEEM") \ + OP(XKB_KEY_Arabic_hah, 0x05cd, 0x062D, "ARABIC LETTER HAH") \ + OP(XKB_KEY_Arabic_khah, 0x05ce, 0x062E, "ARABIC LETTER KHAH") \ + OP(XKB_KEY_Arabic_dal, 0x05cf, 0x062F, "ARABIC LETTER DAL") \ + OP(XKB_KEY_Arabic_thal, 0x05d0, 0x0630, "ARABIC LETTER THAL") \ + OP(XKB_KEY_Arabic_ra, 0x05d1, 0x0631, "ARABIC LETTER REH") \ + OP(XKB_KEY_Arabic_zain, 0x05d2, 0x0632, "ARABIC LETTER ZAIN") \ + OP(XKB_KEY_Arabic_seen, 0x05d3, 0x0633, "ARABIC LETTER SEEN") \ + OP(XKB_KEY_Arabic_sheen, 0x05d4, 0x0634, "ARABIC LETTER SHEEN") \ + OP(XKB_KEY_Arabic_sad, 0x05d5, 0x0635, "ARABIC LETTER SAD") \ + OP(XKB_KEY_Arabic_dad, 0x05d6, 0x0636, "ARABIC LETTER DAD") \ + OP(XKB_KEY_Arabic_tah, 0x05d7, 0x0637, "ARABIC LETTER TAH") \ + OP(XKB_KEY_Arabic_zah, 0x05d8, 0x0638, "ARABIC LETTER ZAH") \ + OP(XKB_KEY_Arabic_ain, 0x05d9, 0x0639, "ARABIC LETTER AIN") \ + OP(XKB_KEY_Arabic_ghain, 0x05da, 0x063A, "ARABIC LETTER GHAIN") \ + OP(XKB_KEY_Arabic_tatweel, 0x05e0, 0x0640, "ARABIC TATWEEL") \ + OP(XKB_KEY_Arabic_feh, 0x05e1, 0x0641, "ARABIC LETTER FEH") \ + OP(XKB_KEY_Arabic_qaf, 0x05e2, 0x0642, "ARABIC LETTER QAF") \ + OP(XKB_KEY_Arabic_kaf, 0x05e3, 0x0643, "ARABIC LETTER KAF") \ + OP(XKB_KEY_Arabic_lam, 0x05e4, 0x0644, "ARABIC LETTER LAM") \ + OP(XKB_KEY_Arabic_meem, 0x05e5, 0x0645, "ARABIC LETTER MEEM") \ + OP(XKB_KEY_Arabic_noon, 0x05e6, 0x0646, "ARABIC LETTER NOON") \ + OP(XKB_KEY_Arabic_ha, 0x05e7, 0x0647, "ARABIC LETTER HEH") \ + OP(XKB_KEY_Arabic_waw, 0x05e8, 0x0648, "ARABIC LETTER WAW") \ + OP(XKB_KEY_Arabic_alefmaksura, 0x05e9, 0x0649, "ARABIC LETTER ALEF MAKSURA") \ + OP(XKB_KEY_Arabic_yeh, 0x05ea, 0x064A, "ARABIC LETTER YEH") \ + OP(XKB_KEY_Arabic_fathatan, 0x05eb, 0x064B, "ARABIC FATHATAN") \ + OP(XKB_KEY_Arabic_dammatan, 0x05ec, 0x064C, "ARABIC DAMMATAN") \ + OP(XKB_KEY_Arabic_kasratan, 0x05ed, 0x064D, "ARABIC KASRATAN") \ + OP(XKB_KEY_Arabic_fatha, 0x05ee, 0x064E, "ARABIC FATHA") \ + OP(XKB_KEY_Arabic_damma, 0x05ef, 0x064F, "ARABIC DAMMA") \ + OP(XKB_KEY_Arabic_kasra, 0x05f0, 0x0650, "ARABIC KASRA") \ + OP(XKB_KEY_Arabic_shadda, 0x05f1, 0x0651, "ARABIC SHADDA") \ + OP(XKB_KEY_Arabic_sukun, 0x05f2, 0x0652, "ARABIC SUKUN") \ + OP(XKB_KEY_Arabic_madda_above, 0x1000653, 0x0653, "ARABIC MADDAH ABOVE") \ + OP(XKB_KEY_Arabic_hamza_above, 0x1000654, 0x0654, "ARABIC HAMZA ABOVE") \ + OP(XKB_KEY_Arabic_hamza_below, 0x1000655, 0x0655, "ARABIC HAMZA BELOW") \ + OP(XKB_KEY_Arabic_jeh, 0x1000698, 0x0698, "ARABIC LETTER JEH") \ + OP(XKB_KEY_Arabic_veh, 0x10006a4, 0x06A4, "ARABIC LETTER VEH") \ + OP(XKB_KEY_Arabic_keheh, 0x10006a9, 0x06A9, "ARABIC LETTER KEHEH") \ + OP(XKB_KEY_Arabic_gaf, 0x10006af, 0x06AF, "ARABIC LETTER GAF") \ + OP(XKB_KEY_Arabic_noon_ghunna, 0x10006ba, 0x06BA, "ARABIC LETTER NOON GHUNNA") \ + OP(XKB_KEY_Arabic_heh_doachashmee, 0x10006be, 0x06BE, "ARABIC LETTER HEH DOACHASHMEE") \ + OP(XKB_KEY_Farsi_yeh, 0x10006cc, 0x06CC, "ARABIC LETTER FARSI YEH") \ + OP(XKB_KEY_Arabic_farsi_yeh, 0x10006cc, 0x06CC, "ARABIC LETTER FARSI YEH") \ + OP(XKB_KEY_Arabic_yeh_baree, 0x10006d2, 0x06D2, "ARABIC LETTER YEH BARREE") \ + OP(XKB_KEY_Arabic_heh_goal, 0x10006c1, 0x06C1, "ARABIC LETTER HEH GOAL") \ + OP(XKB_KEY_Cyrillic_GHE_bar, 0x1000492, 0x0492, "CYRILLIC CAPITAL LETTER GHE WITH STROKE") \ + OP(XKB_KEY_Cyrillic_ghe_bar, 0x1000493, 0x0493, "CYRILLIC SMALL LETTER GHE WITH STROKE") \ + OP(XKB_KEY_Cyrillic_ZHE_descender, 0x1000496, 0x0496, "CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER") \ + OP(XKB_KEY_Cyrillic_zhe_descender, 0x1000497, 0x0497, "CYRILLIC SMALL LETTER ZHE WITH DESCENDER") \ + OP(XKB_KEY_Cyrillic_KA_descender, 0x100049a, 0x049A, "CYRILLIC CAPITAL LETTER KA WITH DESCENDER") \ + OP(XKB_KEY_Cyrillic_ka_descender, 0x100049b, 0x049B, "CYRILLIC SMALL LETTER KA WITH DESCENDER") \ + OP(XKB_KEY_Cyrillic_KA_vertstroke, 0x100049c, 0x049C, "CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE") \ + OP(XKB_KEY_Cyrillic_ka_vertstroke, 0x100049d, 0x049D, "CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE") \ + OP(XKB_KEY_Cyrillic_EN_descender, 0x10004a2, 0x04A2, "CYRILLIC CAPITAL LETTER EN WITH DESCENDER") \ + OP(XKB_KEY_Cyrillic_en_descender, 0x10004a3, 0x04A3, "CYRILLIC SMALL LETTER EN WITH DESCENDER") \ + OP(XKB_KEY_Cyrillic_U_straight, 0x10004ae, 0x04AE, "CYRILLIC CAPITAL LETTER STRAIGHT U") \ + OP(XKB_KEY_Cyrillic_u_straight, 0x10004af, 0x04AF, "CYRILLIC SMALL LETTER STRAIGHT U") \ + OP(XKB_KEY_Cyrillic_U_straight_bar, 0x10004b0, 0x04B0, "CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE") \ + OP(XKB_KEY_Cyrillic_u_straight_bar, 0x10004b1, 0x04B1, "CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE") \ + OP(XKB_KEY_Cyrillic_HA_descender, 0x10004b2, 0x04B2, "CYRILLIC CAPITAL LETTER HA WITH DESCENDER") \ + OP(XKB_KEY_Cyrillic_ha_descender, 0x10004b3, 0x04B3, "CYRILLIC SMALL LETTER HA WITH DESCENDER") \ + OP(XKB_KEY_Cyrillic_CHE_descender, 0x10004b6, 0x04B6, "CYRILLIC CAPITAL LETTER CHE WITH DESCENDER") \ + OP(XKB_KEY_Cyrillic_che_descender, 0x10004b7, 0x04B7, "CYRILLIC SMALL LETTER CHE WITH DESCENDER") \ + OP(XKB_KEY_Cyrillic_CHE_vertstroke, 0x10004b8, 0x04B8, "CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE") \ + OP(XKB_KEY_Cyrillic_che_vertstroke, 0x10004b9, 0x04B9, "CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE") \ + OP(XKB_KEY_Cyrillic_SHHA, 0x10004ba, 0x04BA, "CYRILLIC CAPITAL LETTER SHHA") \ + OP(XKB_KEY_Cyrillic_shha, 0x10004bb, 0x04BB, "CYRILLIC SMALL LETTER SHHA") \ + OP(XKB_KEY_Cyrillic_SCHWA, 0x10004d8, 0x04D8, "CYRILLIC CAPITAL LETTER SCHWA") \ + OP(XKB_KEY_Cyrillic_schwa, 0x10004d9, 0x04D9, "CYRILLIC SMALL LETTER SCHWA") \ + OP(XKB_KEY_Cyrillic_I_macron, 0x10004e2, 0x04E2, "CYRILLIC CAPITAL LETTER I WITH MACRON") \ + OP(XKB_KEY_Cyrillic_i_macron, 0x10004e3, 0x04E3, "CYRILLIC SMALL LETTER I WITH MACRON") \ + OP(XKB_KEY_Cyrillic_O_bar, 0x10004e8, 0x04E8, "CYRILLIC CAPITAL LETTER BARRED O") \ + OP(XKB_KEY_Cyrillic_o_bar, 0x10004e9, 0x04E9, "CYRILLIC SMALL LETTER BARRED O") \ + OP(XKB_KEY_Cyrillic_U_macron, 0x10004ee, 0x04EE, "CYRILLIC CAPITAL LETTER U WITH MACRON") \ + OP(XKB_KEY_Cyrillic_u_macron, 0x10004ef, 0x04EF, "CYRILLIC SMALL LETTER U WITH MACRON") \ + OP(XKB_KEY_Serbian_dje, 0x06a1, 0x0452, "CYRILLIC SMALL LETTER DJE") \ + OP(XKB_KEY_Macedonia_gje, 0x06a2, 0x0453, "CYRILLIC SMALL LETTER GJE") \ + OP(XKB_KEY_Cyrillic_io, 0x06a3, 0x0451, "CYRILLIC SMALL LETTER IO") \ + OP(XKB_KEY_Ukrainian_ie, 0x06a4, 0x0454, "CYRILLIC SMALL LETTER UKRAINIAN IE") \ + OP(XKB_KEY_Macedonia_dse, 0x06a5, 0x0455, "CYRILLIC SMALL LETTER DZE") \ + OP(XKB_KEY_Ukrainian_i, 0x06a6, 0x0456, "CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I") \ + OP(XKB_KEY_Ukrainian_yi, 0x06a7, 0x0457, "CYRILLIC SMALL LETTER YI") \ + OP(XKB_KEY_Cyrillic_je, 0x06a8, 0x0458, "CYRILLIC SMALL LETTER JE") \ + OP(XKB_KEY_Cyrillic_lje, 0x06a9, 0x0459, "CYRILLIC SMALL LETTER LJE") \ + OP(XKB_KEY_Cyrillic_nje, 0x06aa, 0x045A, "CYRILLIC SMALL LETTER NJE") \ + OP(XKB_KEY_Serbian_tshe, 0x06ab, 0x045B, "CYRILLIC SMALL LETTER TSHE") \ + OP(XKB_KEY_Macedonia_kje, 0x06ac, 0x045C, "CYRILLIC SMALL LETTER KJE") \ + OP(XKB_KEY_Ukrainian_ghe_with_upturn, 0x06ad, 0x0491, "CYRILLIC SMALL LETTER GHE WITH UPTURN") \ + OP(XKB_KEY_Byelorussian_shortu, 0x06ae, 0x045E, "CYRILLIC SMALL LETTER SHORT U") \ + OP(XKB_KEY_Cyrillic_dzhe, 0x06af, 0x045F, "CYRILLIC SMALL LETTER DZHE") \ + OP(XKB_KEY_numerosign, 0x06b0, 0x2116, "NUMERO SIGN") \ + OP(XKB_KEY_Serbian_DJE, 0x06b1, 0x0402, "CYRILLIC CAPITAL LETTER DJE") \ + OP(XKB_KEY_Macedonia_GJE, 0x06b2, 0x0403, "CYRILLIC CAPITAL LETTER GJE") \ + OP(XKB_KEY_Cyrillic_IO, 0x06b3, 0x0401, "CYRILLIC CAPITAL LETTER IO") \ + OP(XKB_KEY_Ukrainian_IE, 0x06b4, 0x0404, "CYRILLIC CAPITAL LETTER UKRAINIAN IE") \ + OP(XKB_KEY_Macedonia_DSE, 0x06b5, 0x0405, "CYRILLIC CAPITAL LETTER DZE") \ + OP(XKB_KEY_Ukrainian_I, 0x06b6, 0x0406, "CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I") \ + OP(XKB_KEY_Ukrainian_YI, 0x06b7, 0x0407, "CYRILLIC CAPITAL LETTER YI") \ + OP(XKB_KEY_Cyrillic_JE, 0x06b8, 0x0408, "CYRILLIC CAPITAL LETTER JE") \ + OP(XKB_KEY_Cyrillic_LJE, 0x06b9, 0x0409, "CYRILLIC CAPITAL LETTER LJE") \ + OP(XKB_KEY_Cyrillic_NJE, 0x06ba, 0x040A, "CYRILLIC CAPITAL LETTER NJE") \ + OP(XKB_KEY_Serbian_TSHE, 0x06bb, 0x040B, "CYRILLIC CAPITAL LETTER TSHE") \ + OP(XKB_KEY_Macedonia_KJE, 0x06bc, 0x040C, "CYRILLIC CAPITAL LETTER KJE") \ + OP(XKB_KEY_Ukrainian_GHE_WITH_UPTURN, 0x06bd, 0x0490, "CYRILLIC CAPITAL LETTER GHE WITH UPTURN") \ + OP(XKB_KEY_Byelorussian_SHORTU, 0x06be, 0x040E, "CYRILLIC CAPITAL LETTER SHORT U") \ + OP(XKB_KEY_Cyrillic_DZHE, 0x06bf, 0x040F, "CYRILLIC CAPITAL LETTER DZHE") \ + OP(XKB_KEY_Cyrillic_yu, 0x06c0, 0x044E, "CYRILLIC SMALL LETTER YU") \ + OP(XKB_KEY_Cyrillic_a, 0x06c1, 0x0430, "CYRILLIC SMALL LETTER A") \ + OP(XKB_KEY_Cyrillic_be, 0x06c2, 0x0431, "CYRILLIC SMALL LETTER BE") \ + OP(XKB_KEY_Cyrillic_tse, 0x06c3, 0x0446, "CYRILLIC SMALL LETTER TSE") \ + OP(XKB_KEY_Cyrillic_de, 0x06c4, 0x0434, "CYRILLIC SMALL LETTER DE") \ + OP(XKB_KEY_Cyrillic_ie, 0x06c5, 0x0435, "CYRILLIC SMALL LETTER IE") \ + OP(XKB_KEY_Cyrillic_ef, 0x06c6, 0x0444, "CYRILLIC SMALL LETTER EF") \ + OP(XKB_KEY_Cyrillic_ghe, 0x06c7, 0x0433, "CYRILLIC SMALL LETTER GHE") \ + OP(XKB_KEY_Cyrillic_ha, 0x06c8, 0x0445, "CYRILLIC SMALL LETTER HA") \ + OP(XKB_KEY_Cyrillic_i, 0x06c9, 0x0438, "CYRILLIC SMALL LETTER I") \ + OP(XKB_KEY_Cyrillic_shorti, 0x06ca, 0x0439, "CYRILLIC SMALL LETTER SHORT I") \ + OP(XKB_KEY_Cyrillic_ka, 0x06cb, 0x043A, "CYRILLIC SMALL LETTER KA") \ + OP(XKB_KEY_Cyrillic_el, 0x06cc, 0x043B, "CYRILLIC SMALL LETTER EL") \ + OP(XKB_KEY_Cyrillic_em, 0x06cd, 0x043C, "CYRILLIC SMALL LETTER EM") \ + OP(XKB_KEY_Cyrillic_en, 0x06ce, 0x043D, "CYRILLIC SMALL LETTER EN") \ + OP(XKB_KEY_Cyrillic_o, 0x06cf, 0x043E, "CYRILLIC SMALL LETTER O") \ + OP(XKB_KEY_Cyrillic_pe, 0x06d0, 0x043F, "CYRILLIC SMALL LETTER PE") \ + OP(XKB_KEY_Cyrillic_ya, 0x06d1, 0x044F, "CYRILLIC SMALL LETTER YA") \ + OP(XKB_KEY_Cyrillic_er, 0x06d2, 0x0440, "CYRILLIC SMALL LETTER ER") \ + OP(XKB_KEY_Cyrillic_es, 0x06d3, 0x0441, "CYRILLIC SMALL LETTER ES") \ + OP(XKB_KEY_Cyrillic_te, 0x06d4, 0x0442, "CYRILLIC SMALL LETTER TE") \ + OP(XKB_KEY_Cyrillic_u, 0x06d5, 0x0443, "CYRILLIC SMALL LETTER U") \ + OP(XKB_KEY_Cyrillic_zhe, 0x06d6, 0x0436, "CYRILLIC SMALL LETTER ZHE") \ + OP(XKB_KEY_Cyrillic_ve, 0x06d7, 0x0432, "CYRILLIC SMALL LETTER VE") \ + OP(XKB_KEY_Cyrillic_softsign, 0x06d8, 0x044C, "CYRILLIC SMALL LETTER SOFT SIGN") \ + OP(XKB_KEY_Cyrillic_yeru, 0x06d9, 0x044B, "CYRILLIC SMALL LETTER YERU") \ + OP(XKB_KEY_Cyrillic_ze, 0x06da, 0x0437, "CYRILLIC SMALL LETTER ZE") \ + OP(XKB_KEY_Cyrillic_sha, 0x06db, 0x0448, "CYRILLIC SMALL LETTER SHA") \ + OP(XKB_KEY_Cyrillic_e, 0x06dc, 0x044D, "CYRILLIC SMALL LETTER E") \ + OP(XKB_KEY_Cyrillic_shcha, 0x06dd, 0x0449, "CYRILLIC SMALL LETTER SHCHA") \ + OP(XKB_KEY_Cyrillic_che, 0x06de, 0x0447, "CYRILLIC SMALL LETTER CHE") \ + OP(XKB_KEY_Cyrillic_hardsign, 0x06df, 0x044A, "CYRILLIC SMALL LETTER HARD SIGN") \ + OP(XKB_KEY_Cyrillic_YU, 0x06e0, 0x042E, "CYRILLIC CAPITAL LETTER YU") \ + OP(XKB_KEY_Cyrillic_A, 0x06e1, 0x0410, "CYRILLIC CAPITAL LETTER A") \ + OP(XKB_KEY_Cyrillic_BE, 0x06e2, 0x0411, "CYRILLIC CAPITAL LETTER BE") \ + OP(XKB_KEY_Cyrillic_TSE, 0x06e3, 0x0426, "CYRILLIC CAPITAL LETTER TSE") \ + OP(XKB_KEY_Cyrillic_DE, 0x06e4, 0x0414, "CYRILLIC CAPITAL LETTER DE") \ + OP(XKB_KEY_Cyrillic_IE, 0x06e5, 0x0415, "CYRILLIC CAPITAL LETTER IE") \ + OP(XKB_KEY_Cyrillic_EF, 0x06e6, 0x0424, "CYRILLIC CAPITAL LETTER EF") \ + OP(XKB_KEY_Cyrillic_GHE, 0x06e7, 0x0413, "CYRILLIC CAPITAL LETTER GHE") \ + OP(XKB_KEY_Cyrillic_HA, 0x06e8, 0x0425, "CYRILLIC CAPITAL LETTER HA") \ + OP(XKB_KEY_Cyrillic_I, 0x06e9, 0x0418, "CYRILLIC CAPITAL LETTER I") \ + OP(XKB_KEY_Cyrillic_SHORTI, 0x06ea, 0x0419, "CYRILLIC CAPITAL LETTER SHORT I") \ + OP(XKB_KEY_Cyrillic_KA, 0x06eb, 0x041A, "CYRILLIC CAPITAL LETTER KA") \ + OP(XKB_KEY_Cyrillic_EL, 0x06ec, 0x041B, "CYRILLIC CAPITAL LETTER EL") \ + OP(XKB_KEY_Cyrillic_EM, 0x06ed, 0x041C, "CYRILLIC CAPITAL LETTER EM") \ + OP(XKB_KEY_Cyrillic_EN, 0x06ee, 0x041D, "CYRILLIC CAPITAL LETTER EN") \ + OP(XKB_KEY_Cyrillic_O, 0x06ef, 0x041E, "CYRILLIC CAPITAL LETTER O") \ + OP(XKB_KEY_Cyrillic_PE, 0x06f0, 0x041F, "CYRILLIC CAPITAL LETTER PE") \ + OP(XKB_KEY_Cyrillic_YA, 0x06f1, 0x042F, "CYRILLIC CAPITAL LETTER YA") \ + OP(XKB_KEY_Cyrillic_ER, 0x06f2, 0x0420, "CYRILLIC CAPITAL LETTER ER") \ + OP(XKB_KEY_Cyrillic_ES, 0x06f3, 0x0421, "CYRILLIC CAPITAL LETTER ES") \ + OP(XKB_KEY_Cyrillic_TE, 0x06f4, 0x0422, "CYRILLIC CAPITAL LETTER TE") \ + OP(XKB_KEY_Cyrillic_U, 0x06f5, 0x0423, "CYRILLIC CAPITAL LETTER U") \ + OP(XKB_KEY_Cyrillic_ZHE, 0x06f6, 0x0416, "CYRILLIC CAPITAL LETTER ZHE") \ + OP(XKB_KEY_Cyrillic_VE, 0x06f7, 0x0412, "CYRILLIC CAPITAL LETTER VE") \ + OP(XKB_KEY_Cyrillic_SOFTSIGN, 0x06f8, 0x042C, "CYRILLIC CAPITAL LETTER SOFT SIGN") \ + OP(XKB_KEY_Cyrillic_YERU, 0x06f9, 0x042B, "CYRILLIC CAPITAL LETTER YERU") \ + OP(XKB_KEY_Cyrillic_ZE, 0x06fa, 0x0417, "CYRILLIC CAPITAL LETTER ZE") \ + OP(XKB_KEY_Cyrillic_SHA, 0x06fb, 0x0428, "CYRILLIC CAPITAL LETTER SHA") \ + OP(XKB_KEY_Cyrillic_E, 0x06fc, 0x042D, "CYRILLIC CAPITAL LETTER E") \ + OP(XKB_KEY_Cyrillic_SHCHA, 0x06fd, 0x0429, "CYRILLIC CAPITAL LETTER SHCHA") \ + OP(XKB_KEY_Cyrillic_CHE, 0x06fe, 0x0427, "CYRILLIC CAPITAL LETTER CHE") \ + OP(XKB_KEY_Cyrillic_HARDSIGN, 0x06ff, 0x042A, "CYRILLIC CAPITAL LETTER HARD SIGN") \ + OP(XKB_KEY_Greek_ALPHAaccent, 0x07a1, 0x0386, "GREEK CAPITAL LETTER ALPHA WITH TONOS") \ + OP(XKB_KEY_Greek_EPSILONaccent, 0x07a2, 0x0388, "GREEK CAPITAL LETTER EPSILON WITH TONOS") \ + OP(XKB_KEY_Greek_ETAaccent, 0x07a3, 0x0389, "GREEK CAPITAL LETTER ETA WITH TONOS") \ + OP(XKB_KEY_Greek_IOTAaccent, 0x07a4, 0x038A, "GREEK CAPITAL LETTER IOTA WITH TONOS") \ + OP(XKB_KEY_Greek_IOTAdieresis, 0x07a5, 0x03AA, "GREEK CAPITAL LETTER IOTA WITH DIALYTIKA") \ + OP(XKB_KEY_Greek_OMICRONaccent, 0x07a7, 0x038C, "GREEK CAPITAL LETTER OMICRON WITH TONOS") \ + OP(XKB_KEY_Greek_UPSILONaccent, 0x07a8, 0x038E, "GREEK CAPITAL LETTER UPSILON WITH TONOS") \ + OP(XKB_KEY_Greek_UPSILONdieresis, 0x07a9, 0x03AB, "GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA") \ + OP(XKB_KEY_Greek_OMEGAaccent, 0x07ab, 0x038F, "GREEK CAPITAL LETTER OMEGA WITH TONOS") \ + OP(XKB_KEY_Greek_accentdieresis, 0x07ae, 0x0385, "GREEK DIALYTIKA TONOS") \ + OP(XKB_KEY_Greek_horizbar, 0x07af, 0x2015, "HORIZONTAL BAR") \ + OP(XKB_KEY_Greek_alphaaccent, 0x07b1, 0x03AC, "GREEK SMALL LETTER ALPHA WITH TONOS") \ + OP(XKB_KEY_Greek_epsilonaccent, 0x07b2, 0x03AD, "GREEK SMALL LETTER EPSILON WITH TONOS") \ + OP(XKB_KEY_Greek_etaaccent, 0x07b3, 0x03AE, "GREEK SMALL LETTER ETA WITH TONOS") \ + OP(XKB_KEY_Greek_iotaaccent, 0x07b4, 0x03AF, "GREEK SMALL LETTER IOTA WITH TONOS") \ + OP(XKB_KEY_Greek_iotadieresis, 0x07b5, 0x03CA, "GREEK SMALL LETTER IOTA WITH DIALYTIKA") \ + OP(XKB_KEY_Greek_iotaaccentdieresis, 0x07b6, 0x0390, "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS") \ + OP(XKB_KEY_Greek_omicronaccent, 0x07b7, 0x03CC, "GREEK SMALL LETTER OMICRON WITH TONOS") \ + OP(XKB_KEY_Greek_upsilonaccent, 0x07b8, 0x03CD, "GREEK SMALL LETTER UPSILON WITH TONOS") \ + OP(XKB_KEY_Greek_upsilondieresis, 0x07b9, 0x03CB, "GREEK SMALL LETTER UPSILON WITH DIALYTIKA") \ + OP(XKB_KEY_Greek_upsilonaccentdieresis, 0x07ba, 0x03B0, "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS") \ + OP(XKB_KEY_Greek_omegaaccent, 0x07bb, 0x03CE, "GREEK SMALL LETTER OMEGA WITH TONOS") \ + OP(XKB_KEY_Greek_ALPHA, 0x07c1, 0x0391, "GREEK CAPITAL LETTER ALPHA") \ + OP(XKB_KEY_Greek_BETA, 0x07c2, 0x0392, "GREEK CAPITAL LETTER BETA") \ + OP(XKB_KEY_Greek_GAMMA, 0x07c3, 0x0393, "GREEK CAPITAL LETTER GAMMA") \ + OP(XKB_KEY_Greek_DELTA, 0x07c4, 0x0394, "GREEK CAPITAL LETTER DELTA") \ + OP(XKB_KEY_Greek_EPSILON, 0x07c5, 0x0395, "GREEK CAPITAL LETTER EPSILON") \ + OP(XKB_KEY_Greek_ZETA, 0x07c6, 0x0396, "GREEK CAPITAL LETTER ZETA") \ + OP(XKB_KEY_Greek_ETA, 0x07c7, 0x0397, "GREEK CAPITAL LETTER ETA") \ + OP(XKB_KEY_Greek_THETA, 0x07c8, 0x0398, "GREEK CAPITAL LETTER THETA") \ + OP(XKB_KEY_Greek_IOTA, 0x07c9, 0x0399, "GREEK CAPITAL LETTER IOTA") \ + OP(XKB_KEY_Greek_KAPPA, 0x07ca, 0x039A, "GREEK CAPITAL LETTER KAPPA") \ + OP(XKB_KEY_Greek_LAMDA, 0x07cb, 0x039B, "GREEK CAPITAL LETTER LAMDA") \ + OP(XKB_KEY_Greek_LAMBDA, 0x07cb, 0x039B, "GREEK CAPITAL LETTER LAMDA") \ + OP(XKB_KEY_Greek_MU, 0x07cc, 0x039C, "GREEK CAPITAL LETTER MU") \ + OP(XKB_KEY_Greek_NU, 0x07cd, 0x039D, "GREEK CAPITAL LETTER NU") \ + OP(XKB_KEY_Greek_XI, 0x07ce, 0x039E, "GREEK CAPITAL LETTER XI") \ + OP(XKB_KEY_Greek_OMICRON, 0x07cf, 0x039F, "GREEK CAPITAL LETTER OMICRON") \ + OP(XKB_KEY_Greek_PI, 0x07d0, 0x03A0, "GREEK CAPITAL LETTER PI") \ + OP(XKB_KEY_Greek_RHO, 0x07d1, 0x03A1, "GREEK CAPITAL LETTER RHO") \ + OP(XKB_KEY_Greek_SIGMA, 0x07d2, 0x03A3, "GREEK CAPITAL LETTER SIGMA") \ + OP(XKB_KEY_Greek_TAU, 0x07d4, 0x03A4, "GREEK CAPITAL LETTER TAU") \ + OP(XKB_KEY_Greek_UPSILON, 0x07d5, 0x03A5, "GREEK CAPITAL LETTER UPSILON") \ + OP(XKB_KEY_Greek_PHI, 0x07d6, 0x03A6, "GREEK CAPITAL LETTER PHI") \ + OP(XKB_KEY_Greek_CHI, 0x07d7, 0x03A7, "GREEK CAPITAL LETTER CHI") \ + OP(XKB_KEY_Greek_PSI, 0x07d8, 0x03A8, "GREEK CAPITAL LETTER PSI") \ + OP(XKB_KEY_Greek_OMEGA, 0x07d9, 0x03A9, "GREEK CAPITAL LETTER OMEGA") \ + OP(XKB_KEY_Greek_alpha, 0x07e1, 0x03B1, "GREEK SMALL LETTER ALPHA") \ + OP(XKB_KEY_Greek_beta, 0x07e2, 0x03B2, "GREEK SMALL LETTER BETA") \ + OP(XKB_KEY_Greek_gamma, 0x07e3, 0x03B3, "GREEK SMALL LETTER GAMMA") \ + OP(XKB_KEY_Greek_delta, 0x07e4, 0x03B4, "GREEK SMALL LETTER DELTA") \ + OP(XKB_KEY_Greek_epsilon, 0x07e5, 0x03B5, "GREEK SMALL LETTER EPSILON") \ + OP(XKB_KEY_Greek_zeta, 0x07e6, 0x03B6, "GREEK SMALL LETTER ZETA") \ + OP(XKB_KEY_Greek_eta, 0x07e7, 0x03B7, "GREEK SMALL LETTER ETA") \ + OP(XKB_KEY_Greek_theta, 0x07e8, 0x03B8, "GREEK SMALL LETTER THETA") \ + OP(XKB_KEY_Greek_iota, 0x07e9, 0x03B9, "GREEK SMALL LETTER IOTA") \ + OP(XKB_KEY_Greek_kappa, 0x07ea, 0x03BA, "GREEK SMALL LETTER KAPPA") \ + OP(XKB_KEY_Greek_lamda, 0x07eb, 0x03BB, "GREEK SMALL LETTER LAMDA") \ + OP(XKB_KEY_Greek_lambda, 0x07eb, 0x03BB, "GREEK SMALL LETTER LAMDA") \ + OP(XKB_KEY_Greek_mu, 0x07ec, 0x03BC, "GREEK SMALL LETTER MU") \ + OP(XKB_KEY_Greek_nu, 0x07ed, 0x03BD, "GREEK SMALL LETTER NU") \ + OP(XKB_KEY_Greek_xi, 0x07ee, 0x03BE, "GREEK SMALL LETTER XI") \ + OP(XKB_KEY_Greek_omicron, 0x07ef, 0x03BF, "GREEK SMALL LETTER OMICRON") \ + OP(XKB_KEY_Greek_pi, 0x07f0, 0x03C0, "GREEK SMALL LETTER PI") \ + OP(XKB_KEY_Greek_rho, 0x07f1, 0x03C1, "GREEK SMALL LETTER RHO") \ + OP(XKB_KEY_Greek_sigma, 0x07f2, 0x03C3, "GREEK SMALL LETTER SIGMA") \ + OP(XKB_KEY_Greek_finalsmallsigma, 0x07f3, 0x03C2, "GREEK SMALL LETTER FINAL SIGMA") \ + OP(XKB_KEY_Greek_tau, 0x07f4, 0x03C4, "GREEK SMALL LETTER TAU") \ + OP(XKB_KEY_Greek_upsilon, 0x07f5, 0x03C5, "GREEK SMALL LETTER UPSILON") \ + OP(XKB_KEY_Greek_phi, 0x07f6, 0x03C6, "GREEK SMALL LETTER PHI") \ + OP(XKB_KEY_Greek_chi, 0x07f7, 0x03C7, "GREEK SMALL LETTER CHI") \ + OP(XKB_KEY_Greek_psi, 0x07f8, 0x03C8, "GREEK SMALL LETTER PSI") \ + OP(XKB_KEY_Greek_omega, 0x07f9, 0x03C9, "GREEK SMALL LETTER OMEGA") \ + OP(XKB_KEY_leftradical, 0x08a1, 0x23B7, "RADICAL SYMBOL BOTTOM") \ + OP(XKB_KEY_topleftradical, 0x08a2, 0x250C, "BOX DRAWINGS LIGHT DOWN AND RIGHT") \ + OP(XKB_KEY_horizconnector, 0x08a3, 0x2500, "BOX DRAWINGS LIGHT HORIZONTAL") \ + OP(XKB_KEY_topintegral, 0x08a4, 0x2320, "TOP HALF INTEGRAL") \ + OP(XKB_KEY_botintegral, 0x08a5, 0x2321, "BOTTOM HALF INTEGRAL") \ + OP(XKB_KEY_vertconnector, 0x08a6, 0x2502, "BOX DRAWINGS LIGHT VERTICAL") \ + OP(XKB_KEY_topleftsqbracket, 0x08a7, 0x23A1, "LEFT SQUARE BRACKET UPPER CORNER") \ + OP(XKB_KEY_botleftsqbracket, 0x08a8, 0x23A3, "LEFT SQUARE BRACKET LOWER CORNER") \ + OP(XKB_KEY_toprightsqbracket, 0x08a9, 0x23A4, "RIGHT SQUARE BRACKET UPPER CORNER") \ + OP(XKB_KEY_botrightsqbracket, 0x08aa, 0x23A6, "RIGHT SQUARE BRACKET LOWER CORNER") \ + OP(XKB_KEY_topleftparens, 0x08ab, 0x239B, "LEFT PARENTHESIS UPPER HOOK") \ + OP(XKB_KEY_botleftparens, 0x08ac, 0x239D, "LEFT PARENTHESIS LOWER HOOK") \ + OP(XKB_KEY_toprightparens, 0x08ad, 0x239E, "RIGHT PARENTHESIS UPPER HOOK") \ + OP(XKB_KEY_botrightparens, 0x08ae, 0x23A0, "RIGHT PARENTHESIS LOWER HOOK") \ + OP(XKB_KEY_leftmiddlecurlybrace, 0x08af, 0x23A8, "LEFT CURLY BRACKET MIDDLE PIECE") \ + OP(XKB_KEY_rightmiddlecurlybrace, 0x08b0, 0x23AC, "RIGHT CURLY BRACKET MIDDLE PIECE") \ + OP(XKB_KEY_lessthanequal, 0x08bc, 0x2264, "LESS-THAN OR EQUAL TO") \ + OP(XKB_KEY_notequal, 0x08bd, 0x2260, "NOT EQUAL TO") \ + OP(XKB_KEY_greaterthanequal, 0x08be, 0x2265, "GREATER-THAN OR EQUAL TO") \ + OP(XKB_KEY_integral, 0x08bf, 0x222B, "INTEGRAL") \ + OP(XKB_KEY_therefore, 0x08c0, 0x2234, "THEREFORE") \ + OP(XKB_KEY_variation, 0x08c1, 0x221D, "PROPORTIONAL TO") \ + OP(XKB_KEY_infinity, 0x08c2, 0x221E, "INFINITY") \ + OP(XKB_KEY_nabla, 0x08c5, 0x2207, "NABLA") \ + OP(XKB_KEY_approximate, 0x08c8, 0x223C, "TILDE OPERATOR") \ + OP(XKB_KEY_similarequal, 0x08c9, 0x2243, "ASYMPTOTICALLY EQUAL TO") \ + OP(XKB_KEY_ifonlyif, 0x08cd, 0x21D4, "LEFT RIGHT DOUBLE ARROW") \ + OP(XKB_KEY_implies, 0x08ce, 0x21D2, "RIGHTWARDS DOUBLE ARROW") \ + OP(XKB_KEY_identical, 0x08cf, 0x2261, "IDENTICAL TO") \ + OP(XKB_KEY_radical, 0x08d6, 0x221A, "SQUARE ROOT") \ + OP(XKB_KEY_includedin, 0x08da, 0x2282, "SUBSET OF") \ + OP(XKB_KEY_includes, 0x08db, 0x2283, "SUPERSET OF") \ + OP(XKB_KEY_intersection, 0x08dc, 0x2229, "INTERSECTION") \ + OP(XKB_KEY_union, 0x08dd, 0x222A, "UNION") \ + OP(XKB_KEY_logicaland, 0x08de, 0x2227, "LOGICAL AND") \ + OP(XKB_KEY_logicalor, 0x08df, 0x2228, "LOGICAL OR") \ + OP(XKB_KEY_partialderivative, 0x08ef, 0x2202, "PARTIAL DIFFERENTIAL") \ + OP(XKB_KEY_function, 0x08f6, 0x0192, "LATIN SMALL LETTER F WITH HOOK") \ + OP(XKB_KEY_leftarrow, 0x08fb, 0x2190, "LEFTWARDS ARROW") \ + OP(XKB_KEY_uparrow, 0x08fc, 0x2191, "UPWARDS ARROW") \ + OP(XKB_KEY_rightarrow, 0x08fd, 0x2192, "RIGHTWARDS ARROW") \ + OP(XKB_KEY_downarrow, 0x08fe, 0x2193, "DOWNWARDS ARROW") \ + OP(XKB_KEY_soliddiamond, 0x09e0, 0x25C6, "BLACK DIAMOND") \ + OP(XKB_KEY_checkerboard, 0x09e1, 0x2592, "MEDIUM SHADE") \ + OP(XKB_KEY_ht, 0x09e2, 0x2409, "SYMBOL FOR HORIZONTAL TABULATION") \ + OP(XKB_KEY_ff, 0x09e3, 0x240C, "SYMBOL FOR FORM FEED") \ + OP(XKB_KEY_cr, 0x09e4, 0x240D, "SYMBOL FOR CARRIAGE RETURN") \ + OP(XKB_KEY_lf, 0x09e5, 0x240A, "SYMBOL FOR LINE FEED") \ + OP(XKB_KEY_nl, 0x09e8, 0x2424, "SYMBOL FOR NEWLINE") \ + OP(XKB_KEY_vt, 0x09e9, 0x240B, "SYMBOL FOR VERTICAL TABULATION") \ + OP(XKB_KEY_lowrightcorner, 0x09ea, 0x2518, "BOX DRAWINGS LIGHT UP AND LEFT") \ + OP(XKB_KEY_uprightcorner, 0x09eb, 0x2510, "BOX DRAWINGS LIGHT DOWN AND LEFT") \ + OP(XKB_KEY_upleftcorner, 0x09ec, 0x250C, "BOX DRAWINGS LIGHT DOWN AND RIGHT") \ + OP(XKB_KEY_lowleftcorner, 0x09ed, 0x2514, "BOX DRAWINGS LIGHT UP AND RIGHT") \ + OP(XKB_KEY_crossinglines, 0x09ee, 0x253C, "BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL") \ + OP(XKB_KEY_horizlinescan1, 0x09ef, 0x23BA, "HORIZONTAL SCAN LINE-1") \ + OP(XKB_KEY_horizlinescan3, 0x09f0, 0x23BB, "HORIZONTAL SCAN LINE-3") \ + OP(XKB_KEY_horizlinescan5, 0x09f1, 0x2500, "BOX DRAWINGS LIGHT HORIZONTAL") \ + OP(XKB_KEY_horizlinescan7, 0x09f2, 0x23BC, "HORIZONTAL SCAN LINE-7") \ + OP(XKB_KEY_horizlinescan9, 0x09f3, 0x23BD, "HORIZONTAL SCAN LINE-9") \ + OP(XKB_KEY_leftt, 0x09f4, 0x251C, "BOX DRAWINGS LIGHT VERTICAL AND RIGHT") \ + OP(XKB_KEY_rightt, 0x09f5, 0x2524, "BOX DRAWINGS LIGHT VERTICAL AND LEFT") \ + OP(XKB_KEY_bott, 0x09f6, 0x2534, "BOX DRAWINGS LIGHT UP AND HORIZONTAL") \ + OP(XKB_KEY_topt, 0x09f7, 0x252C, "BOX DRAWINGS LIGHT DOWN AND HORIZONTAL") \ + OP(XKB_KEY_vertbar, 0x09f8, 0x2502, "BOX DRAWINGS LIGHT VERTICAL") \ + OP(XKB_KEY_emspace, 0x0aa1, 0x2003, "EM SPACE") \ + OP(XKB_KEY_enspace, 0x0aa2, 0x2002, "EN SPACE") \ + OP(XKB_KEY_em3space, 0x0aa3, 0x2004, "THREE-PER-EM SPACE") \ + OP(XKB_KEY_em4space, 0x0aa4, 0x2005, "FOUR-PER-EM SPACE") \ + OP(XKB_KEY_digitspace, 0x0aa5, 0x2007, "FIGURE SPACE") \ + OP(XKB_KEY_punctspace, 0x0aa6, 0x2008, "PUNCTUATION SPACE") \ + OP(XKB_KEY_thinspace, 0x0aa7, 0x2009, "THIN SPACE") \ + OP(XKB_KEY_hairspace, 0x0aa8, 0x200A, "HAIR SPACE") \ + OP(XKB_KEY_emdash, 0x0aa9, 0x2014, "EM DASH") \ + OP(XKB_KEY_endash, 0x0aaa, 0x2013, "EN DASH") \ + OP(XKB_KEY_signifblank, 0x0aac, 0x2423, "OPEN BOX") \ + OP(XKB_KEY_ellipsis, 0x0aae, 0x2026, "HORIZONTAL ELLIPSIS") \ + OP(XKB_KEY_doubbaselinedot, 0x0aaf, 0x2025, "TWO DOT LEADER") \ + OP(XKB_KEY_onethird, 0x0ab0, 0x2153, "VULGAR FRACTION ONE THIRD") \ + OP(XKB_KEY_twothirds, 0x0ab1, 0x2154, "VULGAR FRACTION TWO THIRDS") \ + OP(XKB_KEY_onefifth, 0x0ab2, 0x2155, "VULGAR FRACTION ONE FIFTH") \ + OP(XKB_KEY_twofifths, 0x0ab3, 0x2156, "VULGAR FRACTION TWO FIFTHS") \ + OP(XKB_KEY_threefifths, 0x0ab4, 0x2157, "VULGAR FRACTION THREE FIFTHS") \ + OP(XKB_KEY_fourfifths, 0x0ab5, 0x2158, "VULGAR FRACTION FOUR FIFTHS") \ + OP(XKB_KEY_onesixth, 0x0ab6, 0x2159, "VULGAR FRACTION ONE SIXTH") \ + OP(XKB_KEY_fivesixths, 0x0ab7, 0x215A, "VULGAR FRACTION FIVE SIXTHS") \ + OP(XKB_KEY_careof, 0x0ab8, 0x2105, "CARE OF") \ + OP(XKB_KEY_figdash, 0x0abb, 0x2012, "FIGURE DASH") \ + OP(XKB_KEY_leftanglebracket, 0x0abc, 0x27E8, "MATHEMATICAL LEFT ANGLE BRACKET") \ + OP(XKB_KEY_decimalpoint, 0x0abd, 0x002E, "FULL STOP") \ + OP(XKB_KEY_rightanglebracket, 0x0abe, 0x27E9, "MATHEMATICAL RIGHT ANGLE BRACKET") \ + OP(XKB_KEY_oneeighth, 0x0ac3, 0x215B, "VULGAR FRACTION ONE EIGHTH") \ + OP(XKB_KEY_threeeighths, 0x0ac4, 0x215C, "VULGAR FRACTION THREE EIGHTHS") \ + OP(XKB_KEY_fiveeighths, 0x0ac5, 0x215D, "VULGAR FRACTION FIVE EIGHTHS") \ + OP(XKB_KEY_seveneighths, 0x0ac6, 0x215E, "VULGAR FRACTION SEVEN EIGHTHS") \ + OP(XKB_KEY_trademark, 0x0ac9, 0x2122, "TRADE MARK SIGN") \ + OP(XKB_KEY_signaturemark, 0x0aca, 0x2613, "SALTIRE") \ + OP(XKB_KEY_leftopentriangle, 0x0acc, 0x25C1, "WHITE LEFT-POINTING TRIANGLE") \ + OP(XKB_KEY_rightopentriangle, 0x0acd, 0x25B7, "WHITE RIGHT-POINTING TRIANGLE") \ + OP(XKB_KEY_emopencircle, 0x0ace, 0x25CB, "WHITE CIRCLE") \ + OP(XKB_KEY_emopenrectangle, 0x0acf, 0x25AF, "WHITE VERTICAL RECTANGLE") \ + OP(XKB_KEY_leftsinglequotemark, 0x0ad0, 0x2018, "LEFT SINGLE QUOTATION MARK") \ + OP(XKB_KEY_rightsinglequotemark, 0x0ad1, 0x2019, "RIGHT SINGLE QUOTATION MARK") \ + OP(XKB_KEY_leftdoublequotemark, 0x0ad2, 0x201C, "LEFT DOUBLE QUOTATION MARK") \ + OP(XKB_KEY_rightdoublequotemark, 0x0ad3, 0x201D, "RIGHT DOUBLE QUOTATION MARK") \ + OP(XKB_KEY_prescription, 0x0ad4, 0x211E, "PRESCRIPTION TAKE") \ + OP(XKB_KEY_permille, 0x0ad5, 0x2030, "PER MILLE SIGN") \ + OP(XKB_KEY_minutes, 0x0ad6, 0x2032, "PRIME") \ + OP(XKB_KEY_seconds, 0x0ad7, 0x2033, "DOUBLE PRIME") \ + OP(XKB_KEY_latincross, 0x0ad9, 0x271D, "LATIN CROSS") \ + OP(XKB_KEY_filledrectbullet, 0x0adb, 0x25AC, "BLACK RECTANGLE") \ + OP(XKB_KEY_filledlefttribullet, 0x0adc, 0x25C0, "BLACK LEFT-POINTING TRIANGLE") \ + OP(XKB_KEY_filledrighttribullet, 0x0add, 0x25B6, "BLACK RIGHT-POINTING TRIANGLE") \ + OP(XKB_KEY_emfilledcircle, 0x0ade, 0x25CF, "BLACK CIRCLE") \ + OP(XKB_KEY_emfilledrect, 0x0adf, 0x25AE, "BLACK VERTICAL RECTANGLE") \ + OP(XKB_KEY_enopencircbullet, 0x0ae0, 0x25E6, "WHITE BULLET") \ + OP(XKB_KEY_enopensquarebullet, 0x0ae1, 0x25AB, "WHITE SMALL SQUARE") \ + OP(XKB_KEY_openrectbullet, 0x0ae2, 0x25AD, "WHITE RECTANGLE") \ + OP(XKB_KEY_opentribulletup, 0x0ae3, 0x25B3, "WHITE UP-POINTING TRIANGLE") \ + OP(XKB_KEY_opentribulletdown, 0x0ae4, 0x25BD, "WHITE DOWN-POINTING TRIANGLE") \ + OP(XKB_KEY_openstar, 0x0ae5, 0x2606, "WHITE STAR") \ + OP(XKB_KEY_enfilledcircbullet, 0x0ae6, 0x2022, "BULLET") \ + OP(XKB_KEY_enfilledsqbullet, 0x0ae7, 0x25AA, "BLACK SMALL SQUARE") \ + OP(XKB_KEY_filledtribulletup, 0x0ae8, 0x25B2, "BLACK UP-POINTING TRIANGLE") \ + OP(XKB_KEY_filledtribulletdown, 0x0ae9, 0x25BC, "BLACK DOWN-POINTING TRIANGLE") \ + OP(XKB_KEY_leftpointer, 0x0aea, 0x261C, "WHITE LEFT POINTING INDEX") \ + OP(XKB_KEY_rightpointer, 0x0aeb, 0x261E, "WHITE RIGHT POINTING INDEX") \ + OP(XKB_KEY_club, 0x0aec, 0x2663, "BLACK CLUB SUIT") \ + OP(XKB_KEY_diamond, 0x0aed, 0x2666, "BLACK DIAMOND SUIT") \ + OP(XKB_KEY_heart, 0x0aee, 0x2665, "BLACK HEART SUIT") \ + OP(XKB_KEY_maltesecross, 0x0af0, 0x2720, "MALTESE CROSS") \ + OP(XKB_KEY_dagger, 0x0af1, 0x2020, "DAGGER") \ + OP(XKB_KEY_doubledagger, 0x0af2, 0x2021, "DOUBLE DAGGER") \ + OP(XKB_KEY_checkmark, 0x0af3, 0x2713, "CHECK MARK") \ + OP(XKB_KEY_ballotcross, 0x0af4, 0x2717, "BALLOT X") \ + OP(XKB_KEY_musicalsharp, 0x0af5, 0x266F, "MUSIC SHARP SIGN") \ + OP(XKB_KEY_musicalflat, 0x0af6, 0x266D, "MUSIC FLAT SIGN") \ + OP(XKB_KEY_malesymbol, 0x0af7, 0x2642, "MALE SIGN") \ + OP(XKB_KEY_femalesymbol, 0x0af8, 0x2640, "FEMALE SIGN") \ + OP(XKB_KEY_telephone, 0x0af9, 0x260E, "BLACK TELEPHONE") \ + OP(XKB_KEY_telephonerecorder, 0x0afa, 0x2315, "TELEPHONE RECORDER") \ + OP(XKB_KEY_phonographcopyright, 0x0afb, 0x2117, "SOUND RECORDING COPYRIGHT") \ + OP(XKB_KEY_caret, 0x0afc, 0x2038, "CARET") \ + OP(XKB_KEY_singlelowquotemark, 0x0afd, 0x201A, "SINGLE LOW-9 QUOTATION MARK") \ + OP(XKB_KEY_doublelowquotemark, 0x0afe, 0x201E, "DOUBLE LOW-9 QUOTATION MARK") \ + OP(XKB_KEY_leftcaret, 0x0ba3, 0x003C, "LESS-THAN SIGN") \ + OP(XKB_KEY_rightcaret, 0x0ba6, 0x003E, "GREATER-THAN SIGN") \ + OP(XKB_KEY_downcaret, 0x0ba8, 0x2228, "LOGICAL OR") \ + OP(XKB_KEY_upcaret, 0x0ba9, 0x2227, "LOGICAL AND") \ + OP(XKB_KEY_overbar, 0x0bc0, 0x00AF, "MACRON") \ + OP(XKB_KEY_downtack, 0x0bc2, 0x22A4, "DOWN TACK") \ + OP(XKB_KEY_upshoe, 0x0bc3, 0x2229, "INTERSECTION") \ + OP(XKB_KEY_downstile, 0x0bc4, 0x230A, "LEFT FLOOR") \ + OP(XKB_KEY_underbar, 0x0bc6, 0x005F, "LOW LINE") \ + OP(XKB_KEY_jot, 0x0bca, 0x2218, "RING OPERATOR") \ + OP(XKB_KEY_quad, 0x0bcc, 0x2395, "APL FUNCTIONAL SYMBOL QUAD") \ + OP(XKB_KEY_uptack, 0x0bce, 0x22A5, "UP TACK") \ + OP(XKB_KEY_circle, 0x0bcf, 0x25CB, "WHITE CIRCLE") \ + OP(XKB_KEY_upstile, 0x0bd3, 0x2308, "LEFT CEILING") \ + OP(XKB_KEY_downshoe, 0x0bd6, 0x222A, "UNION") \ + OP(XKB_KEY_rightshoe, 0x0bd8, 0x2283, "SUPERSET OF") \ + OP(XKB_KEY_leftshoe, 0x0bda, 0x2282, "SUBSET OF") \ + OP(XKB_KEY_lefttack, 0x0bdc, 0x22A3, "LEFT TACK") \ + OP(XKB_KEY_righttack, 0x0bfc, 0x22A2, "RIGHT TACK") \ + OP(XKB_KEY_hebrew_doublelowline, 0x0cdf, 0x2017, "DOUBLE LOW LINE") \ + OP(XKB_KEY_hebrew_aleph, 0x0ce0, 0x05D0, "HEBREW LETTER ALEF") \ + OP(XKB_KEY_hebrew_bet, 0x0ce1, 0x05D1, "HEBREW LETTER BET") \ + OP(XKB_KEY_hebrew_gimel, 0x0ce2, 0x05D2, "HEBREW LETTER GIMEL") \ + OP(XKB_KEY_hebrew_dalet, 0x0ce3, 0x05D3, "HEBREW LETTER DALET") \ + OP(XKB_KEY_hebrew_he, 0x0ce4, 0x05D4, "HEBREW LETTER HE") \ + OP(XKB_KEY_hebrew_waw, 0x0ce5, 0x05D5, "HEBREW LETTER VAV") \ + OP(XKB_KEY_hebrew_zain, 0x0ce6, 0x05D6, "HEBREW LETTER ZAYIN") \ + OP(XKB_KEY_hebrew_chet, 0x0ce7, 0x05D7, "HEBREW LETTER HET") \ + OP(XKB_KEY_hebrew_tet, 0x0ce8, 0x05D8, "HEBREW LETTER TET") \ + OP(XKB_KEY_hebrew_yod, 0x0ce9, 0x05D9, "HEBREW LETTER YOD") \ + OP(XKB_KEY_hebrew_finalkaph, 0x0cea, 0x05DA, "HEBREW LETTER FINAL KAF") \ + OP(XKB_KEY_hebrew_kaph, 0x0ceb, 0x05DB, "HEBREW LETTER KAF") \ + OP(XKB_KEY_hebrew_lamed, 0x0cec, 0x05DC, "HEBREW LETTER LAMED") \ + OP(XKB_KEY_hebrew_finalmem, 0x0ced, 0x05DD, "HEBREW LETTER FINAL MEM") \ + OP(XKB_KEY_hebrew_mem, 0x0cee, 0x05DE, "HEBREW LETTER MEM") \ + OP(XKB_KEY_hebrew_finalnun, 0x0cef, 0x05DF, "HEBREW LETTER FINAL NUN") \ + OP(XKB_KEY_hebrew_nun, 0x0cf0, 0x05E0, "HEBREW LETTER NUN") \ + OP(XKB_KEY_hebrew_samech, 0x0cf1, 0x05E1, "HEBREW LETTER SAMEKH") \ + OP(XKB_KEY_hebrew_ayin, 0x0cf2, 0x05E2, "HEBREW LETTER AYIN") \ + OP(XKB_KEY_hebrew_finalpe, 0x0cf3, 0x05E3, "HEBREW LETTER FINAL PE") \ + OP(XKB_KEY_hebrew_pe, 0x0cf4, 0x05E4, "HEBREW LETTER PE") \ + OP(XKB_KEY_hebrew_finalzade, 0x0cf5, 0x05E5, "HEBREW LETTER FINAL TSADI") \ + OP(XKB_KEY_hebrew_zade, 0x0cf6, 0x05E6, "HEBREW LETTER TSADI") \ + OP(XKB_KEY_hebrew_qoph, 0x0cf7, 0x05E7, "HEBREW LETTER QOF") \ + OP(XKB_KEY_hebrew_resh, 0x0cf8, 0x05E8, "HEBREW LETTER RESH") \ + OP(XKB_KEY_hebrew_shin, 0x0cf9, 0x05E9, "HEBREW LETTER SHIN") \ + OP(XKB_KEY_hebrew_taw, 0x0cfa, 0x05EA, "HEBREW LETTER TAV") \ + OP(XKB_KEY_Thai_kokai, 0x0da1, 0x0E01, "THAI CHARACTER KO KAI") \ + OP(XKB_KEY_Thai_khokhai, 0x0da2, 0x0E02, "THAI CHARACTER KHO KHAI") \ + OP(XKB_KEY_Thai_khokhuat, 0x0da3, 0x0E03, "THAI CHARACTER KHO KHUAT") \ + OP(XKB_KEY_Thai_khokhwai, 0x0da4, 0x0E04, "THAI CHARACTER KHO KHWAI") \ + OP(XKB_KEY_Thai_khokhon, 0x0da5, 0x0E05, "THAI CHARACTER KHO KHON") \ + OP(XKB_KEY_Thai_khorakhang, 0x0da6, 0x0E06, "THAI CHARACTER KHO RAKHANG") \ + OP(XKB_KEY_Thai_ngongu, 0x0da7, 0x0E07, "THAI CHARACTER NGO NGU") \ + OP(XKB_KEY_Thai_chochan, 0x0da8, 0x0E08, "THAI CHARACTER CHO CHAN") \ + OP(XKB_KEY_Thai_choching, 0x0da9, 0x0E09, "THAI CHARACTER CHO CHING") \ + OP(XKB_KEY_Thai_chochang, 0x0daa, 0x0E0A, "THAI CHARACTER CHO CHANG") \ + OP(XKB_KEY_Thai_soso, 0x0dab, 0x0E0B, "THAI CHARACTER SO SO") \ + OP(XKB_KEY_Thai_chochoe, 0x0dac, 0x0E0C, "THAI CHARACTER CHO CHOE") \ + OP(XKB_KEY_Thai_yoying, 0x0dad, 0x0E0D, "THAI CHARACTER YO YING") \ + OP(XKB_KEY_Thai_dochada, 0x0dae, 0x0E0E, "THAI CHARACTER DO CHADA") \ + OP(XKB_KEY_Thai_topatak, 0x0daf, 0x0E0F, "THAI CHARACTER TO PATAK") \ + OP(XKB_KEY_Thai_thothan, 0x0db0, 0x0E10, "THAI CHARACTER THO THAN") \ + OP(XKB_KEY_Thai_thonangmontho, 0x0db1, 0x0E11, "THAI CHARACTER THO NANGMONTHO") \ + OP(XKB_KEY_Thai_thophuthao, 0x0db2, 0x0E12, "THAI CHARACTER THO PHUTHAO") \ + OP(XKB_KEY_Thai_nonen, 0x0db3, 0x0E13, "THAI CHARACTER NO NEN") \ + OP(XKB_KEY_Thai_dodek, 0x0db4, 0x0E14, "THAI CHARACTER DO DEK") \ + OP(XKB_KEY_Thai_totao, 0x0db5, 0x0E15, "THAI CHARACTER TO TAO") \ + OP(XKB_KEY_Thai_thothung, 0x0db6, 0x0E16, "THAI CHARACTER THO THUNG") \ + OP(XKB_KEY_Thai_thothahan, 0x0db7, 0x0E17, "THAI CHARACTER THO THAHAN") \ + OP(XKB_KEY_Thai_thothong, 0x0db8, 0x0E18, "THAI CHARACTER THO THONG") \ + OP(XKB_KEY_Thai_nonu, 0x0db9, 0x0E19, "THAI CHARACTER NO NU") \ + OP(XKB_KEY_Thai_bobaimai, 0x0dba, 0x0E1A, "THAI CHARACTER BO BAIMAI") \ + OP(XKB_KEY_Thai_popla, 0x0dbb, 0x0E1B, "THAI CHARACTER PO PLA") \ + OP(XKB_KEY_Thai_phophung, 0x0dbc, 0x0E1C, "THAI CHARACTER PHO PHUNG") \ + OP(XKB_KEY_Thai_fofa, 0x0dbd, 0x0E1D, "THAI CHARACTER FO FA") \ + OP(XKB_KEY_Thai_phophan, 0x0dbe, 0x0E1E, "THAI CHARACTER PHO PHAN") \ + OP(XKB_KEY_Thai_fofan, 0x0dbf, 0x0E1F, "THAI CHARACTER FO FAN") \ + OP(XKB_KEY_Thai_phosamphao, 0x0dc0, 0x0E20, "THAI CHARACTER PHO SAMPHAO") \ + OP(XKB_KEY_Thai_moma, 0x0dc1, 0x0E21, "THAI CHARACTER MO MA") \ + OP(XKB_KEY_Thai_yoyak, 0x0dc2, 0x0E22, "THAI CHARACTER YO YAK") \ + OP(XKB_KEY_Thai_rorua, 0x0dc3, 0x0E23, "THAI CHARACTER RO RUA") \ + OP(XKB_KEY_Thai_ru, 0x0dc4, 0x0E24, "THAI CHARACTER RU") \ + OP(XKB_KEY_Thai_loling, 0x0dc5, 0x0E25, "THAI CHARACTER LO LING") \ + OP(XKB_KEY_Thai_lu, 0x0dc6, 0x0E26, "THAI CHARACTER LU") \ + OP(XKB_KEY_Thai_wowaen, 0x0dc7, 0x0E27, "THAI CHARACTER WO WAEN") \ + OP(XKB_KEY_Thai_sosala, 0x0dc8, 0x0E28, "THAI CHARACTER SO SALA") \ + OP(XKB_KEY_Thai_sorusi, 0x0dc9, 0x0E29, "THAI CHARACTER SO RUSI") \ + OP(XKB_KEY_Thai_sosua, 0x0dca, 0x0E2A, "THAI CHARACTER SO SUA") \ + OP(XKB_KEY_Thai_hohip, 0x0dcb, 0x0E2B, "THAI CHARACTER HO HIP") \ + OP(XKB_KEY_Thai_lochula, 0x0dcc, 0x0E2C, "THAI CHARACTER LO CHULA") \ + OP(XKB_KEY_Thai_oang, 0x0dcd, 0x0E2D, "THAI CHARACTER O ANG") \ + OP(XKB_KEY_Thai_honokhuk, 0x0dce, 0x0E2E, "THAI CHARACTER HO NOKHUK") \ + OP(XKB_KEY_Thai_paiyannoi, 0x0dcf, 0x0E2F, "THAI CHARACTER PAIYANNOI") \ + OP(XKB_KEY_Thai_saraa, 0x0dd0, 0x0E30, "THAI CHARACTER SARA A") \ + OP(XKB_KEY_Thai_maihanakat, 0x0dd1, 0x0E31, "THAI CHARACTER MAI HAN-AKAT") \ + OP(XKB_KEY_Thai_saraaa, 0x0dd2, 0x0E32, "THAI CHARACTER SARA AA") \ + OP(XKB_KEY_Thai_saraam, 0x0dd3, 0x0E33, "THAI CHARACTER SARA AM") \ + OP(XKB_KEY_Thai_sarai, 0x0dd4, 0x0E34, "THAI CHARACTER SARA I") \ + OP(XKB_KEY_Thai_saraii, 0x0dd5, 0x0E35, "THAI CHARACTER SARA II") \ + OP(XKB_KEY_Thai_saraue, 0x0dd6, 0x0E36, "THAI CHARACTER SARA UE") \ + OP(XKB_KEY_Thai_sarauee, 0x0dd7, 0x0E37, "THAI CHARACTER SARA UEE") \ + OP(XKB_KEY_Thai_sarau, 0x0dd8, 0x0E38, "THAI CHARACTER SARA U") \ + OP(XKB_KEY_Thai_sarauu, 0x0dd9, 0x0E39, "THAI CHARACTER SARA UU") \ + OP(XKB_KEY_Thai_phinthu, 0x0dda, 0x0E3A, "THAI CHARACTER PHINTHU") \ + OP(XKB_KEY_Thai_baht, 0x0ddf, 0x0E3F, "THAI CURRENCY SYMBOL BAHT") \ + OP(XKB_KEY_Thai_sarae, 0x0de0, 0x0E40, "THAI CHARACTER SARA E") \ + OP(XKB_KEY_Thai_saraae, 0x0de1, 0x0E41, "THAI CHARACTER SARA AE") \ + OP(XKB_KEY_Thai_sarao, 0x0de2, 0x0E42, "THAI CHARACTER SARA O") \ + OP(XKB_KEY_Thai_saraaimaimuan, 0x0de3, 0x0E43, "THAI CHARACTER SARA AI MAIMUAN") \ + OP(XKB_KEY_Thai_saraaimaimalai, 0x0de4, 0x0E44, "THAI CHARACTER SARA AI MAIMALAI") \ + OP(XKB_KEY_Thai_lakkhangyao, 0x0de5, 0x0E45, "THAI CHARACTER LAKKHANGYAO") \ + OP(XKB_KEY_Thai_maiyamok, 0x0de6, 0x0E46, "THAI CHARACTER MAIYAMOK") \ + OP(XKB_KEY_Thai_maitaikhu, 0x0de7, 0x0E47, "THAI CHARACTER MAITAIKHU") \ + OP(XKB_KEY_Thai_maiek, 0x0de8, 0x0E48, "THAI CHARACTER MAI EK") \ + OP(XKB_KEY_Thai_maitho, 0x0de9, 0x0E49, "THAI CHARACTER MAI THO") \ + OP(XKB_KEY_Thai_maitri, 0x0dea, 0x0E4A, "THAI CHARACTER MAI TRI") \ + OP(XKB_KEY_Thai_maichattawa, 0x0deb, 0x0E4B, "THAI CHARACTER MAI CHATTAWA") \ + OP(XKB_KEY_Thai_thanthakhat, 0x0dec, 0x0E4C, "THAI CHARACTER THANTHAKHAT") \ + OP(XKB_KEY_Thai_nikhahit, 0x0ded, 0x0E4D, "THAI CHARACTER NIKHAHIT") \ + OP(XKB_KEY_Thai_leksun, 0x0df0, 0x0E50, "THAI DIGIT ZERO") \ + OP(XKB_KEY_Thai_leknung, 0x0df1, 0x0E51, "THAI DIGIT ONE") \ + OP(XKB_KEY_Thai_leksong, 0x0df2, 0x0E52, "THAI DIGIT TWO") \ + OP(XKB_KEY_Thai_leksam, 0x0df3, 0x0E53, "THAI DIGIT THREE") \ + OP(XKB_KEY_Thai_leksi, 0x0df4, 0x0E54, "THAI DIGIT FOUR") \ + OP(XKB_KEY_Thai_lekha, 0x0df5, 0x0E55, "THAI DIGIT FIVE") \ + OP(XKB_KEY_Thai_lekhok, 0x0df6, 0x0E56, "THAI DIGIT SIX") \ + OP(XKB_KEY_Thai_lekchet, 0x0df7, 0x0E57, "THAI DIGIT SEVEN") \ + OP(XKB_KEY_Thai_lekpaet, 0x0df8, 0x0E58, "THAI DIGIT EIGHT") \ + OP(XKB_KEY_Thai_lekkao, 0x0df9, 0x0E59, "THAI DIGIT NINE") \ + OP(XKB_KEY_Korean_Won, 0x0eff, 0x20A9, "WON SIGN") \ + OP(XKB_KEY_Armenian_ligature_ew, 0x1000587, 0x0587, "ARMENIAN SMALL LIGATURE ECH YIWN") \ + OP(XKB_KEY_Armenian_full_stop, 0x1000589, 0x0589, "ARMENIAN FULL STOP") \ + OP(XKB_KEY_Armenian_verjaket, 0x1000589, 0x0589, "ARMENIAN FULL STOP") \ + OP(XKB_KEY_Armenian_separation_mark, 0x100055d, 0x055D, "ARMENIAN COMMA") \ + OP(XKB_KEY_Armenian_but, 0x100055d, 0x055D, "ARMENIAN COMMA") \ + OP(XKB_KEY_Armenian_hyphen, 0x100058a, 0x058A, "ARMENIAN HYPHEN") \ + OP(XKB_KEY_Armenian_yentamna, 0x100058a, 0x058A, "ARMENIAN HYPHEN") \ + OP(XKB_KEY_Armenian_exclam, 0x100055c, 0x055C, "ARMENIAN EXCLAMATION MARK") \ + OP(XKB_KEY_Armenian_amanak, 0x100055c, 0x055C, "ARMENIAN EXCLAMATION MARK") \ + OP(XKB_KEY_Armenian_accent, 0x100055b, 0x055B, "ARMENIAN EMPHASIS MARK") \ + OP(XKB_KEY_Armenian_shesht, 0x100055b, 0x055B, "ARMENIAN EMPHASIS MARK") \ + OP(XKB_KEY_Armenian_question, 0x100055e, 0x055E, "ARMENIAN QUESTION MARK") \ + OP(XKB_KEY_Armenian_paruyk, 0x100055e, 0x055E, "ARMENIAN QUESTION MARK") \ + OP(XKB_KEY_Armenian_AYB, 0x1000531, 0x0531, "ARMENIAN CAPITAL LETTER AYB") \ + OP(XKB_KEY_Armenian_ayb, 0x1000561, 0x0561, "ARMENIAN SMALL LETTER AYB") \ + OP(XKB_KEY_Armenian_BEN, 0x1000532, 0x0532, "ARMENIAN CAPITAL LETTER BEN") \ + OP(XKB_KEY_Armenian_ben, 0x1000562, 0x0562, "ARMENIAN SMALL LETTER BEN") \ + OP(XKB_KEY_Armenian_GIM, 0x1000533, 0x0533, "ARMENIAN CAPITAL LETTER GIM") \ + OP(XKB_KEY_Armenian_gim, 0x1000563, 0x0563, "ARMENIAN SMALL LETTER GIM") \ + OP(XKB_KEY_Armenian_DA, 0x1000534, 0x0534, "ARMENIAN CAPITAL LETTER DA") \ + OP(XKB_KEY_Armenian_da, 0x1000564, 0x0564, "ARMENIAN SMALL LETTER DA") \ + OP(XKB_KEY_Armenian_YECH, 0x1000535, 0x0535, "ARMENIAN CAPITAL LETTER ECH") \ + OP(XKB_KEY_Armenian_yech, 0x1000565, 0x0565, "ARMENIAN SMALL LETTER ECH") \ + OP(XKB_KEY_Armenian_ZA, 0x1000536, 0x0536, "ARMENIAN CAPITAL LETTER ZA") \ + OP(XKB_KEY_Armenian_za, 0x1000566, 0x0566, "ARMENIAN SMALL LETTER ZA") \ + OP(XKB_KEY_Armenian_E, 0x1000537, 0x0537, "ARMENIAN CAPITAL LETTER EH") \ + OP(XKB_KEY_Armenian_e, 0x1000567, 0x0567, "ARMENIAN SMALL LETTER EH") \ + OP(XKB_KEY_Armenian_AT, 0x1000538, 0x0538, "ARMENIAN CAPITAL LETTER ET") \ + OP(XKB_KEY_Armenian_at, 0x1000568, 0x0568, "ARMENIAN SMALL LETTER ET") \ + OP(XKB_KEY_Armenian_TO, 0x1000539, 0x0539, "ARMENIAN CAPITAL LETTER TO") \ + OP(XKB_KEY_Armenian_to, 0x1000569, 0x0569, "ARMENIAN SMALL LETTER TO") \ + OP(XKB_KEY_Armenian_ZHE, 0x100053a, 0x053A, "ARMENIAN CAPITAL LETTER ZHE") \ + OP(XKB_KEY_Armenian_zhe, 0x100056a, 0x056A, "ARMENIAN SMALL LETTER ZHE") \ + OP(XKB_KEY_Armenian_INI, 0x100053b, 0x053B, "ARMENIAN CAPITAL LETTER INI") \ + OP(XKB_KEY_Armenian_ini, 0x100056b, 0x056B, "ARMENIAN SMALL LETTER INI") \ + OP(XKB_KEY_Armenian_LYUN, 0x100053c, 0x053C, "ARMENIAN CAPITAL LETTER LIWN") \ + OP(XKB_KEY_Armenian_lyun, 0x100056c, 0x056C, "ARMENIAN SMALL LETTER LIWN") \ + OP(XKB_KEY_Armenian_KHE, 0x100053d, 0x053D, "ARMENIAN CAPITAL LETTER XEH") \ + OP(XKB_KEY_Armenian_khe, 0x100056d, 0x056D, "ARMENIAN SMALL LETTER XEH") \ + OP(XKB_KEY_Armenian_TSA, 0x100053e, 0x053E, "ARMENIAN CAPITAL LETTER CA") \ + OP(XKB_KEY_Armenian_tsa, 0x100056e, 0x056E, "ARMENIAN SMALL LETTER CA") \ + OP(XKB_KEY_Armenian_KEN, 0x100053f, 0x053F, "ARMENIAN CAPITAL LETTER KEN") \ + OP(XKB_KEY_Armenian_ken, 0x100056f, 0x056F, "ARMENIAN SMALL LETTER KEN") \ + OP(XKB_KEY_Armenian_HO, 0x1000540, 0x0540, "ARMENIAN CAPITAL LETTER HO") \ + OP(XKB_KEY_Armenian_ho, 0x1000570, 0x0570, "ARMENIAN SMALL LETTER HO") \ + OP(XKB_KEY_Armenian_DZA, 0x1000541, 0x0541, "ARMENIAN CAPITAL LETTER JA") \ + OP(XKB_KEY_Armenian_dza, 0x1000571, 0x0571, "ARMENIAN SMALL LETTER JA") \ + OP(XKB_KEY_Armenian_GHAT, 0x1000542, 0x0542, "ARMENIAN CAPITAL LETTER GHAD") \ + OP(XKB_KEY_Armenian_ghat, 0x1000572, 0x0572, "ARMENIAN SMALL LETTER GHAD") \ + OP(XKB_KEY_Armenian_TCHE, 0x1000543, 0x0543, "ARMENIAN CAPITAL LETTER CHEH") \ + OP(XKB_KEY_Armenian_tche, 0x1000573, 0x0573, "ARMENIAN SMALL LETTER CHEH") \ + OP(XKB_KEY_Armenian_MEN, 0x1000544, 0x0544, "ARMENIAN CAPITAL LETTER MEN") \ + OP(XKB_KEY_Armenian_men, 0x1000574, 0x0574, "ARMENIAN SMALL LETTER MEN") \ + OP(XKB_KEY_Armenian_HI, 0x1000545, 0x0545, "ARMENIAN CAPITAL LETTER YI") \ + OP(XKB_KEY_Armenian_hi, 0x1000575, 0x0575, "ARMENIAN SMALL LETTER YI") \ + OP(XKB_KEY_Armenian_NU, 0x1000546, 0x0546, "ARMENIAN CAPITAL LETTER NOW") \ + OP(XKB_KEY_Armenian_nu, 0x1000576, 0x0576, "ARMENIAN SMALL LETTER NOW") \ + OP(XKB_KEY_Armenian_SHA, 0x1000547, 0x0547, "ARMENIAN CAPITAL LETTER SHA") \ + OP(XKB_KEY_Armenian_sha, 0x1000577, 0x0577, "ARMENIAN SMALL LETTER SHA") \ + OP(XKB_KEY_Armenian_VO, 0x1000548, 0x0548, "ARMENIAN CAPITAL LETTER VO") \ + OP(XKB_KEY_Armenian_vo, 0x1000578, 0x0578, "ARMENIAN SMALL LETTER VO") \ + OP(XKB_KEY_Armenian_CHA, 0x1000549, 0x0549, "ARMENIAN CAPITAL LETTER CHA") \ + OP(XKB_KEY_Armenian_cha, 0x1000579, 0x0579, "ARMENIAN SMALL LETTER CHA") \ + OP(XKB_KEY_Armenian_PE, 0x100054a, 0x054A, "ARMENIAN CAPITAL LETTER PEH") \ + OP(XKB_KEY_Armenian_pe, 0x100057a, 0x057A, "ARMENIAN SMALL LETTER PEH") \ + OP(XKB_KEY_Armenian_JE, 0x100054b, 0x054B, "ARMENIAN CAPITAL LETTER JHEH") \ + OP(XKB_KEY_Armenian_je, 0x100057b, 0x057B, "ARMENIAN SMALL LETTER JHEH") \ + OP(XKB_KEY_Armenian_RA, 0x100054c, 0x054C, "ARMENIAN CAPITAL LETTER RA") \ + OP(XKB_KEY_Armenian_ra, 0x100057c, 0x057C, "ARMENIAN SMALL LETTER RA") \ + OP(XKB_KEY_Armenian_SE, 0x100054d, 0x054D, "ARMENIAN CAPITAL LETTER SEH") \ + OP(XKB_KEY_Armenian_se, 0x100057d, 0x057D, "ARMENIAN SMALL LETTER SEH") \ + OP(XKB_KEY_Armenian_VEV, 0x100054e, 0x054E, "ARMENIAN CAPITAL LETTER VEW") \ + OP(XKB_KEY_Armenian_vev, 0x100057e, 0x057E, "ARMENIAN SMALL LETTER VEW") \ + OP(XKB_KEY_Armenian_TYUN, 0x100054f, 0x054F, "ARMENIAN CAPITAL LETTER TIWN") \ + OP(XKB_KEY_Armenian_tyun, 0x100057f, 0x057F, "ARMENIAN SMALL LETTER TIWN") \ + OP(XKB_KEY_Armenian_RE, 0x1000550, 0x0550, "ARMENIAN CAPITAL LETTER REH") \ + OP(XKB_KEY_Armenian_re, 0x1000580, 0x0580, "ARMENIAN SMALL LETTER REH") \ + OP(XKB_KEY_Armenian_TSO, 0x1000551, 0x0551, "ARMENIAN CAPITAL LETTER CO") \ + OP(XKB_KEY_Armenian_tso, 0x1000581, 0x0581, "ARMENIAN SMALL LETTER CO") \ + OP(XKB_KEY_Armenian_VYUN, 0x1000552, 0x0552, "ARMENIAN CAPITAL LETTER YIWN") \ + OP(XKB_KEY_Armenian_vyun, 0x1000582, 0x0582, "ARMENIAN SMALL LETTER YIWN") \ + OP(XKB_KEY_Armenian_PYUR, 0x1000553, 0x0553, "ARMENIAN CAPITAL LETTER PIWR") \ + OP(XKB_KEY_Armenian_pyur, 0x1000583, 0x0583, "ARMENIAN SMALL LETTER PIWR") \ + OP(XKB_KEY_Armenian_KE, 0x1000554, 0x0554, "ARMENIAN CAPITAL LETTER KEH") \ + OP(XKB_KEY_Armenian_ke, 0x1000584, 0x0584, "ARMENIAN SMALL LETTER KEH") \ + OP(XKB_KEY_Armenian_O, 0x1000555, 0x0555, "ARMENIAN CAPITAL LETTER OH") \ + OP(XKB_KEY_Armenian_o, 0x1000585, 0x0585, "ARMENIAN SMALL LETTER OH") \ + OP(XKB_KEY_Armenian_FE, 0x1000556, 0x0556, "ARMENIAN CAPITAL LETTER FEH") \ + OP(XKB_KEY_Armenian_fe, 0x1000586, 0x0586, "ARMENIAN SMALL LETTER FEH") \ + OP(XKB_KEY_Armenian_apostrophe, 0x100055a, 0x055A, "ARMENIAN APOSTROPHE") \ + OP(XKB_KEY_Georgian_an, 0x10010d0, 0x10D0, "GEORGIAN LETTER AN") \ + OP(XKB_KEY_Georgian_ban, 0x10010d1, 0x10D1, "GEORGIAN LETTER BAN") \ + OP(XKB_KEY_Georgian_gan, 0x10010d2, 0x10D2, "GEORGIAN LETTER GAN") \ + OP(XKB_KEY_Georgian_don, 0x10010d3, 0x10D3, "GEORGIAN LETTER DON") \ + OP(XKB_KEY_Georgian_en, 0x10010d4, 0x10D4, "GEORGIAN LETTER EN") \ + OP(XKB_KEY_Georgian_vin, 0x10010d5, 0x10D5, "GEORGIAN LETTER VIN") \ + OP(XKB_KEY_Georgian_zen, 0x10010d6, 0x10D6, "GEORGIAN LETTER ZEN") \ + OP(XKB_KEY_Georgian_tan, 0x10010d7, 0x10D7, "GEORGIAN LETTER TAN") \ + OP(XKB_KEY_Georgian_in, 0x10010d8, 0x10D8, "GEORGIAN LETTER IN") \ + OP(XKB_KEY_Georgian_kan, 0x10010d9, 0x10D9, "GEORGIAN LETTER KAN") \ + OP(XKB_KEY_Georgian_las, 0x10010da, 0x10DA, "GEORGIAN LETTER LAS") \ + OP(XKB_KEY_Georgian_man, 0x10010db, 0x10DB, "GEORGIAN LETTER MAN") \ + OP(XKB_KEY_Georgian_nar, 0x10010dc, 0x10DC, "GEORGIAN LETTER NAR") \ + OP(XKB_KEY_Georgian_on, 0x10010dd, 0x10DD, "GEORGIAN LETTER ON") \ + OP(XKB_KEY_Georgian_par, 0x10010de, 0x10DE, "GEORGIAN LETTER PAR") \ + OP(XKB_KEY_Georgian_zhar, 0x10010df, 0x10DF, "GEORGIAN LETTER ZHAR") \ + OP(XKB_KEY_Georgian_rae, 0x10010e0, 0x10E0, "GEORGIAN LETTER RAE") \ + OP(XKB_KEY_Georgian_san, 0x10010e1, 0x10E1, "GEORGIAN LETTER SAN") \ + OP(XKB_KEY_Georgian_tar, 0x10010e2, 0x10E2, "GEORGIAN LETTER TAR") \ + OP(XKB_KEY_Georgian_un, 0x10010e3, 0x10E3, "GEORGIAN LETTER UN") \ + OP(XKB_KEY_Georgian_phar, 0x10010e4, 0x10E4, "GEORGIAN LETTER PHAR") \ + OP(XKB_KEY_Georgian_khar, 0x10010e5, 0x10E5, "GEORGIAN LETTER KHAR") \ + OP(XKB_KEY_Georgian_ghan, 0x10010e6, 0x10E6, "GEORGIAN LETTER GHAN") \ + OP(XKB_KEY_Georgian_qar, 0x10010e7, 0x10E7, "GEORGIAN LETTER QAR") \ + OP(XKB_KEY_Georgian_shin, 0x10010e8, 0x10E8, "GEORGIAN LETTER SHIN") \ + OP(XKB_KEY_Georgian_chin, 0x10010e9, 0x10E9, "GEORGIAN LETTER CHIN") \ + OP(XKB_KEY_Georgian_can, 0x10010ea, 0x10EA, "GEORGIAN LETTER CAN") \ + OP(XKB_KEY_Georgian_jil, 0x10010eb, 0x10EB, "GEORGIAN LETTER JIL") \ + OP(XKB_KEY_Georgian_cil, 0x10010ec, 0x10EC, "GEORGIAN LETTER CIL") \ + OP(XKB_KEY_Georgian_char, 0x10010ed, 0x10ED, "GEORGIAN LETTER CHAR") \ + OP(XKB_KEY_Georgian_xan, 0x10010ee, 0x10EE, "GEORGIAN LETTER XAN") \ + OP(XKB_KEY_Georgian_jhan, 0x10010ef, 0x10EF, "GEORGIAN LETTER JHAN") \ + OP(XKB_KEY_Georgian_hae, 0x10010f0, 0x10F0, "GEORGIAN LETTER HAE") \ + OP(XKB_KEY_Georgian_he, 0x10010f1, 0x10F1, "GEORGIAN LETTER HE") \ + OP(XKB_KEY_Georgian_hie, 0x10010f2, 0x10F2, "GEORGIAN LETTER HIE") \ + OP(XKB_KEY_Georgian_we, 0x10010f3, 0x10F3, "GEORGIAN LETTER WE") \ + OP(XKB_KEY_Georgian_har, 0x10010f4, 0x10F4, "GEORGIAN LETTER HAR") \ + OP(XKB_KEY_Georgian_hoe, 0x10010f5, 0x10F5, "GEORGIAN LETTER HOE") \ + OP(XKB_KEY_Georgian_fi, 0x10010f6, 0x10F6, "GEORGIAN LETTER FI") \ + OP(XKB_KEY_Xabovedot, 0x1001e8a, 0x1E8A, "LATIN CAPITAL LETTER X WITH DOT ABOVE") \ + OP(XKB_KEY_Ibreve, 0x100012c, 0x012C, "LATIN CAPITAL LETTER I WITH BREVE") \ + OP(XKB_KEY_Zstroke, 0x10001b5, 0x01B5, "LATIN CAPITAL LETTER Z WITH STROKE") \ + OP(XKB_KEY_Gcaron, 0x10001e6, 0x01E6, "LATIN CAPITAL LETTER G WITH CARON") \ + OP(XKB_KEY_Ocaron, 0x10001d1, 0x01D2, "LATIN CAPITAL LETTER O WITH CARON") \ + OP(XKB_KEY_Obarred, 0x100019f, 0x019F, "LATIN CAPITAL LETTER O WITH MIDDLE TILDE") \ + OP(XKB_KEY_xabovedot, 0x1001e8b, 0x1E8B, "LATIN SMALL LETTER X WITH DOT ABOVE") \ + OP(XKB_KEY_ibreve, 0x100012d, 0x012D, "LATIN SMALL LETTER I WITH BREVE") \ + OP(XKB_KEY_zstroke, 0x10001b6, 0x01B6, "LATIN SMALL LETTER Z WITH STROKE") \ + OP(XKB_KEY_gcaron, 0x10001e7, 0x01E7, "LATIN SMALL LETTER G WITH CARON") \ + OP(XKB_KEY_ocaron, 0x10001d2, 0x01D2, "LATIN SMALL LETTER O WITH CARON") \ + OP(XKB_KEY_obarred, 0x1000275, 0x0275, "LATIN SMALL LETTER BARRED O") \ + OP(XKB_KEY_SCHWA, 0x100018f, 0x018F, "LATIN CAPITAL LETTER SCHWA") \ + OP(XKB_KEY_schwa, 0x1000259, 0x0259, "LATIN SMALL LETTER SCHWA") \ + OP(XKB_KEY_EZH, 0x10001b7, 0x01B7, "LATIN CAPITAL LETTER EZH") \ + OP(XKB_KEY_ezh, 0x1000292, 0x0292, "LATIN SMALL LETTER EZH") \ + OP(XKB_KEY_Lbelowdot, 0x1001e36, 0x1E36, "LATIN CAPITAL LETTER L WITH DOT BELOW") \ + OP(XKB_KEY_lbelowdot, 0x1001e37, 0x1E37, "LATIN SMALL LETTER L WITH DOT BELOW") \ + OP(XKB_KEY_Abelowdot, 0x1001ea0, 0x1EA0, "LATIN CAPITAL LETTER A WITH DOT BELOW") \ + OP(XKB_KEY_abelowdot, 0x1001ea1, 0x1EA1, "LATIN SMALL LETTER A WITH DOT BELOW") \ + OP(XKB_KEY_Ahook, 0x1001ea2, 0x1EA2, "LATIN CAPITAL LETTER A WITH HOOK ABOVE") \ + OP(XKB_KEY_ahook, 0x1001ea3, 0x1EA3, "LATIN SMALL LETTER A WITH HOOK ABOVE") \ + OP(XKB_KEY_Acircumflexacute, 0x1001ea4, 0x1EA4, "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE") \ + OP(XKB_KEY_acircumflexacute, 0x1001ea5, 0x1EA5, "LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE") \ + OP(XKB_KEY_Acircumflexgrave, 0x1001ea6, 0x1EA6, "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE") \ + OP(XKB_KEY_acircumflexgrave, 0x1001ea7, 0x1EA7, "LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE") \ + OP(XKB_KEY_Acircumflexhook, 0x1001ea8, 0x1EA8, "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE") \ + OP(XKB_KEY_acircumflexhook, 0x1001ea9, 0x1EA9, "LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE") \ + OP(XKB_KEY_Acircumflextilde, 0x1001eaa, 0x1EAA, "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE") \ + OP(XKB_KEY_acircumflextilde, 0x1001eab, 0x1EAB, "LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE") \ + OP(XKB_KEY_Acircumflexbelowdot, 0x1001eac, 0x1EAC, "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW") \ + OP(XKB_KEY_acircumflexbelowdot, 0x1001ead, 0x1EAD, "LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW") \ + OP(XKB_KEY_Abreveacute, 0x1001eae, 0x1EAE, "LATIN CAPITAL LETTER A WITH BREVE AND ACUTE") \ + OP(XKB_KEY_abreveacute, 0x1001eaf, 0x1EAF, "LATIN SMALL LETTER A WITH BREVE AND ACUTE") \ + OP(XKB_KEY_Abrevegrave, 0x1001eb0, 0x1EB0, "LATIN CAPITAL LETTER A WITH BREVE AND GRAVE") \ + OP(XKB_KEY_abrevegrave, 0x1001eb1, 0x1EB1, "LATIN SMALL LETTER A WITH BREVE AND GRAVE") \ + OP(XKB_KEY_Abrevehook, 0x1001eb2, 0x1EB2, "LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE") \ + OP(XKB_KEY_abrevehook, 0x1001eb3, 0x1EB3, "LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE") \ + OP(XKB_KEY_Abrevetilde, 0x1001eb4, 0x1EB4, "LATIN CAPITAL LETTER A WITH BREVE AND TILDE") \ + OP(XKB_KEY_abrevetilde, 0x1001eb5, 0x1EB5, "LATIN SMALL LETTER A WITH BREVE AND TILDE") \ + OP(XKB_KEY_Abrevebelowdot, 0x1001eb6, 0x1EB6, "LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW") \ + OP(XKB_KEY_abrevebelowdot, 0x1001eb7, 0x1EB7, "LATIN SMALL LETTER A WITH BREVE AND DOT BELOW") \ + OP(XKB_KEY_Ebelowdot, 0x1001eb8, 0x1EB8, "LATIN CAPITAL LETTER E WITH DOT BELOW") \ + OP(XKB_KEY_ebelowdot, 0x1001eb9, 0x1EB9, "LATIN SMALL LETTER E WITH DOT BELOW") \ + OP(XKB_KEY_Ehook, 0x1001eba, 0x1EBA, "LATIN CAPITAL LETTER E WITH HOOK ABOVE") \ + OP(XKB_KEY_ehook, 0x1001ebb, 0x1EBB, "LATIN SMALL LETTER E WITH HOOK ABOVE") \ + OP(XKB_KEY_Etilde, 0x1001ebc, 0x1EBC, "LATIN CAPITAL LETTER E WITH TILDE") \ + OP(XKB_KEY_etilde, 0x1001ebd, 0x1EBD, "LATIN SMALL LETTER E WITH TILDE") \ + OP(XKB_KEY_Ecircumflexacute, 0x1001ebe, 0x1EBE, "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE") \ + OP(XKB_KEY_ecircumflexacute, 0x1001ebf, 0x1EBF, "LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE") \ + OP(XKB_KEY_Ecircumflexgrave, 0x1001ec0, 0x1EC0, "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE") \ + OP(XKB_KEY_ecircumflexgrave, 0x1001ec1, 0x1EC1, "LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE") \ + OP(XKB_KEY_Ecircumflexhook, 0x1001ec2, 0x1EC2, "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE") \ + OP(XKB_KEY_ecircumflexhook, 0x1001ec3, 0x1EC3, "LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE") \ + OP(XKB_KEY_Ecircumflextilde, 0x1001ec4, 0x1EC4, "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE") \ + OP(XKB_KEY_ecircumflextilde, 0x1001ec5, 0x1EC5, "LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE") \ + OP(XKB_KEY_Ecircumflexbelowdot, 0x1001ec6, 0x1EC6, "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW") \ + OP(XKB_KEY_ecircumflexbelowdot, 0x1001ec7, 0x1EC7, "LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW") \ + OP(XKB_KEY_Ihook, 0x1001ec8, 0x1EC8, "LATIN CAPITAL LETTER I WITH HOOK ABOVE") \ + OP(XKB_KEY_ihook, 0x1001ec9, 0x1EC9, "LATIN SMALL LETTER I WITH HOOK ABOVE") \ + OP(XKB_KEY_Ibelowdot, 0x1001eca, 0x1ECA, "LATIN CAPITAL LETTER I WITH DOT BELOW") \ + OP(XKB_KEY_ibelowdot, 0x1001ecb, 0x1ECB, "LATIN SMALL LETTER I WITH DOT BELOW") \ + OP(XKB_KEY_Obelowdot, 0x1001ecc, 0x1ECC, "LATIN CAPITAL LETTER O WITH DOT BELOW") \ + OP(XKB_KEY_obelowdot, 0x1001ecd, 0x1ECD, "LATIN SMALL LETTER O WITH DOT BELOW") \ + OP(XKB_KEY_Ohook, 0x1001ece, 0x1ECE, "LATIN CAPITAL LETTER O WITH HOOK ABOVE") \ + OP(XKB_KEY_ohook, 0x1001ecf, 0x1ECF, "LATIN SMALL LETTER O WITH HOOK ABOVE") \ + OP(XKB_KEY_Ocircumflexacute, 0x1001ed0, 0x1ED0, "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE") \ + OP(XKB_KEY_ocircumflexacute, 0x1001ed1, 0x1ED1, "LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE") \ + OP(XKB_KEY_Ocircumflexgrave, 0x1001ed2, 0x1ED2, "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE") \ + OP(XKB_KEY_ocircumflexgrave, 0x1001ed3, 0x1ED3, "LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE") \ + OP(XKB_KEY_Ocircumflexhook, 0x1001ed4, 0x1ED4, "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE") \ + OP(XKB_KEY_ocircumflexhook, 0x1001ed5, 0x1ED5, "LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE") \ + OP(XKB_KEY_Ocircumflextilde, 0x1001ed6, 0x1ED6, "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE") \ + OP(XKB_KEY_ocircumflextilde, 0x1001ed7, 0x1ED7, "LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE") \ + OP(XKB_KEY_Ocircumflexbelowdot, 0x1001ed8, 0x1ED8, "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW") \ + OP(XKB_KEY_ocircumflexbelowdot, 0x1001ed9, 0x1ED9, "LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW") \ + OP(XKB_KEY_Ohornacute, 0x1001eda, 0x1EDA, "LATIN CAPITAL LETTER O WITH HORN AND ACUTE") \ + OP(XKB_KEY_ohornacute, 0x1001edb, 0x1EDB, "LATIN SMALL LETTER O WITH HORN AND ACUTE") \ + OP(XKB_KEY_Ohorngrave, 0x1001edc, 0x1EDC, "LATIN CAPITAL LETTER O WITH HORN AND GRAVE") \ + OP(XKB_KEY_ohorngrave, 0x1001edd, 0x1EDD, "LATIN SMALL LETTER O WITH HORN AND GRAVE") \ + OP(XKB_KEY_Ohornhook, 0x1001ede, 0x1EDE, "LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE") \ + OP(XKB_KEY_ohornhook, 0x1001edf, 0x1EDF, "LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE") \ + OP(XKB_KEY_Ohorntilde, 0x1001ee0, 0x1EE0, "LATIN CAPITAL LETTER O WITH HORN AND TILDE") \ + OP(XKB_KEY_ohorntilde, 0x1001ee1, 0x1EE1, "LATIN SMALL LETTER O WITH HORN AND TILDE") \ + OP(XKB_KEY_Ohornbelowdot, 0x1001ee2, 0x1EE2, "LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW") \ + OP(XKB_KEY_ohornbelowdot, 0x1001ee3, 0x1EE3, "LATIN SMALL LETTER O WITH HORN AND DOT BELOW") \ + OP(XKB_KEY_Ubelowdot, 0x1001ee4, 0x1EE4, "LATIN CAPITAL LETTER U WITH DOT BELOW") \ + OP(XKB_KEY_ubelowdot, 0x1001ee5, 0x1EE5, "LATIN SMALL LETTER U WITH DOT BELOW") \ + OP(XKB_KEY_Uhook, 0x1001ee6, 0x1EE6, "LATIN CAPITAL LETTER U WITH HOOK ABOVE") \ + OP(XKB_KEY_uhook, 0x1001ee7, 0x1EE7, "LATIN SMALL LETTER U WITH HOOK ABOVE") \ + OP(XKB_KEY_Uhornacute, 0x1001ee8, 0x1EE8, "LATIN CAPITAL LETTER U WITH HORN AND ACUTE") \ + OP(XKB_KEY_uhornacute, 0x1001ee9, 0x1EE9, "LATIN SMALL LETTER U WITH HORN AND ACUTE") \ + OP(XKB_KEY_Uhorngrave, 0x1001eea, 0x1EEA, "LATIN CAPITAL LETTER U WITH HORN AND GRAVE") \ + OP(XKB_KEY_uhorngrave, 0x1001eeb, 0x1EEB, "LATIN SMALL LETTER U WITH HORN AND GRAVE") \ + OP(XKB_KEY_Uhornhook, 0x1001eec, 0x1EEC, "LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE") \ + OP(XKB_KEY_uhornhook, 0x1001eed, 0x1EED, "LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE") \ + OP(XKB_KEY_Uhorntilde, 0x1001eee, 0x1EEE, "LATIN CAPITAL LETTER U WITH HORN AND TILDE") \ + OP(XKB_KEY_uhorntilde, 0x1001eef, 0x1EEF, "LATIN SMALL LETTER U WITH HORN AND TILDE") \ + OP(XKB_KEY_Uhornbelowdot, 0x1001ef0, 0x1EF0, "LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW") \ + OP(XKB_KEY_uhornbelowdot, 0x1001ef1, 0x1EF1, "LATIN SMALL LETTER U WITH HORN AND DOT BELOW") \ + OP(XKB_KEY_Ybelowdot, 0x1001ef4, 0x1EF4, "LATIN CAPITAL LETTER Y WITH DOT BELOW") \ + OP(XKB_KEY_ybelowdot, 0x1001ef5, 0x1EF5, "LATIN SMALL LETTER Y WITH DOT BELOW") \ + OP(XKB_KEY_Yhook, 0x1001ef6, 0x1EF6, "LATIN CAPITAL LETTER Y WITH HOOK ABOVE") \ + OP(XKB_KEY_yhook, 0x1001ef7, 0x1EF7, "LATIN SMALL LETTER Y WITH HOOK ABOVE") \ + OP(XKB_KEY_Ytilde, 0x1001ef8, 0x1EF8, "LATIN CAPITAL LETTER Y WITH TILDE") \ + OP(XKB_KEY_ytilde, 0x1001ef9, 0x1EF9, "LATIN SMALL LETTER Y WITH TILDE") \ + OP(XKB_KEY_Ohorn, 0x10001a0, 0x01A0, "LATIN CAPITAL LETTER O WITH HORN") \ + OP(XKB_KEY_ohorn, 0x10001a1, 0x01A1, "LATIN SMALL LETTER O WITH HORN") \ + OP(XKB_KEY_Uhorn, 0x10001af, 0x01AF, "LATIN CAPITAL LETTER U WITH HORN") \ + OP(XKB_KEY_uhorn, 0x10001b0, 0x01B0, "LATIN SMALL LETTER U WITH HORN") \ + OP(XKB_KEY_EcuSign, 0x10020a0, 0x20A0, "EURO-CURRENCY SIGN") \ + OP(XKB_KEY_ColonSign, 0x10020a1, 0x20A1, "COLON SIGN") \ + OP(XKB_KEY_CruzeiroSign, 0x10020a2, 0x20A2, "CRUZEIRO SIGN") \ + OP(XKB_KEY_FFrancSign, 0x10020a3, 0x20A3, "FRENCH FRANC SIGN") \ + OP(XKB_KEY_LiraSign, 0x10020a4, 0x20A4, "LIRA SIGN") \ + OP(XKB_KEY_MillSign, 0x10020a5, 0x20A5, "MILL SIGN") \ + OP(XKB_KEY_NairaSign, 0x10020a6, 0x20A6, "NAIRA SIGN") \ + OP(XKB_KEY_PesetaSign, 0x10020a7, 0x20A7, "PESETA SIGN") \ + OP(XKB_KEY_RupeeSign, 0x10020a8, 0x20A8, "RUPEE SIGN") \ + OP(XKB_KEY_WonSign, 0x10020a9, 0x20A9, "WON SIGN") \ + OP(XKB_KEY_NewSheqelSign, 0x10020aa, 0x20AA, "NEW SHEQEL SIGN") \ + OP(XKB_KEY_DongSign, 0x10020ab, 0x20AB, "DONG SIGN") \ + OP(XKB_KEY_EuroSign, 0x20ac, 0x20AC, "EURO SIGN") \ + OP(XKB_KEY_zerosuperior, 0x1002070, 0x2070, "SUPERSCRIPT ZERO") \ + OP(XKB_KEY_foursuperior, 0x1002074, 0x2074, "SUPERSCRIPT FOUR") \ + OP(XKB_KEY_fivesuperior, 0x1002075, 0x2075, "SUPERSCRIPT FIVE") \ + OP(XKB_KEY_sixsuperior, 0x1002076, 0x2076, "SUPERSCRIPT SIX") \ + OP(XKB_KEY_sevensuperior, 0x1002077, 0x2077, "SUPERSCRIPT SEVEN") \ + OP(XKB_KEY_eightsuperior, 0x1002078, 0x2078, "SUPERSCRIPT EIGHT") \ + OP(XKB_KEY_ninesuperior, 0x1002079, 0x2079, "SUPERSCRIPT NINE") \ + OP(XKB_KEY_zerosubscript, 0x1002080, 0x2080, "SUBSCRIPT ZERO") \ + OP(XKB_KEY_onesubscript, 0x1002081, 0x2081, "SUBSCRIPT ONE") \ + OP(XKB_KEY_twosubscript, 0x1002082, 0x2082, "SUBSCRIPT TWO") \ + OP(XKB_KEY_threesubscript, 0x1002083, 0x2083, "SUBSCRIPT THREE") \ + OP(XKB_KEY_foursubscript, 0x1002084, 0x2084, "SUBSCRIPT FOUR") \ + OP(XKB_KEY_fivesubscript, 0x1002085, 0x2085, "SUBSCRIPT FIVE") \ + OP(XKB_KEY_sixsubscript, 0x1002086, 0x2086, "SUBSCRIPT SIX") \ + OP(XKB_KEY_sevensubscript, 0x1002087, 0x2087, "SUBSCRIPT SEVEN") \ + OP(XKB_KEY_eightsubscript, 0x1002088, 0x2088, "SUBSCRIPT EIGHT") \ + OP(XKB_KEY_ninesubscript, 0x1002089, 0x2089, "SUBSCRIPT NINE") \ + OP(XKB_KEY_partdifferential, 0x1002202, 0x2202, "PARTIAL DIFFERENTIAL") \ + OP(XKB_KEY_emptyset, 0x1002205, 0x2205, "NULL SET") \ + OP(XKB_KEY_elementof, 0x1002208, 0x2208, "ELEMENT OF") \ + OP(XKB_KEY_notelementof, 0x1002209, 0x2209, "NOT AN ELEMENT OF") \ + OP(XKB_KEY_containsas, 0x100220B, 0x220B, "CONTAINS AS MEMBER") \ + OP(XKB_KEY_squareroot, 0x100221A, 0x221A, "SQUARE ROOT") \ + OP(XKB_KEY_cuberoot, 0x100221B, 0x221B, "CUBE ROOT") \ + OP(XKB_KEY_fourthroot, 0x100221C, 0x221C, "FOURTH ROOT") \ + OP(XKB_KEY_dintegral, 0x100222C, 0x222C, "DOUBLE INTEGRAL") \ + OP(XKB_KEY_tintegral, 0x100222D, 0x222D, "TRIPLE INTEGRAL") \ + OP(XKB_KEY_because, 0x1002235, 0x2235, "BECAUSE") \ + OP(XKB_KEY_approxeq, 0x1002248, 0x2245, "ALMOST EQUAL TO") \ + OP(XKB_KEY_notapproxeq, 0x1002247, 0x2247, "NOT ALMOST EQUAL TO") \ + OP(XKB_KEY_notidentical, 0x1002262, 0x2262, "NOT IDENTICAL TO") \ + OP(XKB_KEY_stricteq, 0x1002263, 0x2263, "STRICTLY EQUIVALENT TO") \ + OP(XKB_KEY_braille_blank, 0x1002800, 0x2800, "BRAILLE PATTERN BLANK") \ + OP(XKB_KEY_braille_dots_1, 0x1002801, 0x2801, "BRAILLE PATTERN DOTS-1") \ + OP(XKB_KEY_braille_dots_2, 0x1002802, 0x2802, "BRAILLE PATTERN DOTS-2") \ + OP(XKB_KEY_braille_dots_12, 0x1002803, 0x2803, "BRAILLE PATTERN DOTS-12") \ + OP(XKB_KEY_braille_dots_3, 0x1002804, 0x2804, "BRAILLE PATTERN DOTS-3") \ + OP(XKB_KEY_braille_dots_13, 0x1002805, 0x2805, "BRAILLE PATTERN DOTS-13") \ + OP(XKB_KEY_braille_dots_23, 0x1002806, 0x2806, "BRAILLE PATTERN DOTS-23") \ + OP(XKB_KEY_braille_dots_123, 0x1002807, 0x2807, "BRAILLE PATTERN DOTS-123") \ + OP(XKB_KEY_braille_dots_4, 0x1002808, 0x2808, "BRAILLE PATTERN DOTS-4") \ + OP(XKB_KEY_braille_dots_14, 0x1002809, 0x2809, "BRAILLE PATTERN DOTS-14") \ + OP(XKB_KEY_braille_dots_24, 0x100280a, 0x280a, "BRAILLE PATTERN DOTS-24") \ + OP(XKB_KEY_braille_dots_124, 0x100280b, 0x280b, "BRAILLE PATTERN DOTS-124") \ + OP(XKB_KEY_braille_dots_34, 0x100280c, 0x280c, "BRAILLE PATTERN DOTS-34") \ + OP(XKB_KEY_braille_dots_134, 0x100280d, 0x280d, "BRAILLE PATTERN DOTS-134") \ + OP(XKB_KEY_braille_dots_234, 0x100280e, 0x280e, "BRAILLE PATTERN DOTS-234") \ + OP(XKB_KEY_braille_dots_1234, 0x100280f, 0x280f, "BRAILLE PATTERN DOTS-1234") \ + OP(XKB_KEY_braille_dots_5, 0x1002810, 0x2810, "BRAILLE PATTERN DOTS-5") \ + OP(XKB_KEY_braille_dots_15, 0x1002811, 0x2811, "BRAILLE PATTERN DOTS-15") \ + OP(XKB_KEY_braille_dots_25, 0x1002812, 0x2812, "BRAILLE PATTERN DOTS-25") \ + OP(XKB_KEY_braille_dots_125, 0x1002813, 0x2813, "BRAILLE PATTERN DOTS-125") \ + OP(XKB_KEY_braille_dots_35, 0x1002814, 0x2814, "BRAILLE PATTERN DOTS-35") \ + OP(XKB_KEY_braille_dots_135, 0x1002815, 0x2815, "BRAILLE PATTERN DOTS-135") \ + OP(XKB_KEY_braille_dots_235, 0x1002816, 0x2816, "BRAILLE PATTERN DOTS-235") \ + OP(XKB_KEY_braille_dots_1235, 0x1002817, 0x2817, "BRAILLE PATTERN DOTS-1235") \ + OP(XKB_KEY_braille_dots_45, 0x1002818, 0x2818, "BRAILLE PATTERN DOTS-45") \ + OP(XKB_KEY_braille_dots_145, 0x1002819, 0x2819, "BRAILLE PATTERN DOTS-145") \ + OP(XKB_KEY_braille_dots_245, 0x100281a, 0x281a, "BRAILLE PATTERN DOTS-245") \ + OP(XKB_KEY_braille_dots_1245, 0x100281b, 0x281b, "BRAILLE PATTERN DOTS-1245") \ + OP(XKB_KEY_braille_dots_345, 0x100281c, 0x281c, "BRAILLE PATTERN DOTS-345") \ + OP(XKB_KEY_braille_dots_1345, 0x100281d, 0x281d, "BRAILLE PATTERN DOTS-1345") \ + OP(XKB_KEY_braille_dots_2345, 0x100281e, 0x281e, "BRAILLE PATTERN DOTS-2345") \ + OP(XKB_KEY_braille_dots_12345, 0x100281f, 0x281f, "BRAILLE PATTERN DOTS-12345") \ + OP(XKB_KEY_braille_dots_6, 0x1002820, 0x2820, "BRAILLE PATTERN DOTS-6") \ + OP(XKB_KEY_braille_dots_16, 0x1002821, 0x2821, "BRAILLE PATTERN DOTS-16") \ + OP(XKB_KEY_braille_dots_26, 0x1002822, 0x2822, "BRAILLE PATTERN DOTS-26") \ + OP(XKB_KEY_braille_dots_126, 0x1002823, 0x2823, "BRAILLE PATTERN DOTS-126") \ + OP(XKB_KEY_braille_dots_36, 0x1002824, 0x2824, "BRAILLE PATTERN DOTS-36") \ + OP(XKB_KEY_braille_dots_136, 0x1002825, 0x2825, "BRAILLE PATTERN DOTS-136") \ + OP(XKB_KEY_braille_dots_236, 0x1002826, 0x2826, "BRAILLE PATTERN DOTS-236") \ + OP(XKB_KEY_braille_dots_1236, 0x1002827, 0x2827, "BRAILLE PATTERN DOTS-1236") \ + OP(XKB_KEY_braille_dots_46, 0x1002828, 0x2828, "BRAILLE PATTERN DOTS-46") \ + OP(XKB_KEY_braille_dots_146, 0x1002829, 0x2829, "BRAILLE PATTERN DOTS-146") \ + OP(XKB_KEY_braille_dots_246, 0x100282a, 0x282a, "BRAILLE PATTERN DOTS-246") \ + OP(XKB_KEY_braille_dots_1246, 0x100282b, 0x282b, "BRAILLE PATTERN DOTS-1246") \ + OP(XKB_KEY_braille_dots_346, 0x100282c, 0x282c, "BRAILLE PATTERN DOTS-346") \ + OP(XKB_KEY_braille_dots_1346, 0x100282d, 0x282d, "BRAILLE PATTERN DOTS-1346") \ + OP(XKB_KEY_braille_dots_2346, 0x100282e, 0x282e, "BRAILLE PATTERN DOTS-2346") \ + OP(XKB_KEY_braille_dots_12346, 0x100282f, 0x282f, "BRAILLE PATTERN DOTS-12346") \ + OP(XKB_KEY_braille_dots_56, 0x1002830, 0x2830, "BRAILLE PATTERN DOTS-56") \ + OP(XKB_KEY_braille_dots_156, 0x1002831, 0x2831, "BRAILLE PATTERN DOTS-156") \ + OP(XKB_KEY_braille_dots_256, 0x1002832, 0x2832, "BRAILLE PATTERN DOTS-256") \ + OP(XKB_KEY_braille_dots_1256, 0x1002833, 0x2833, "BRAILLE PATTERN DOTS-1256") \ + OP(XKB_KEY_braille_dots_356, 0x1002834, 0x2834, "BRAILLE PATTERN DOTS-356") \ + OP(XKB_KEY_braille_dots_1356, 0x1002835, 0x2835, "BRAILLE PATTERN DOTS-1356") \ + OP(XKB_KEY_braille_dots_2356, 0x1002836, 0x2836, "BRAILLE PATTERN DOTS-2356") \ + OP(XKB_KEY_braille_dots_12356, 0x1002837, 0x2837, "BRAILLE PATTERN DOTS-12356") \ + OP(XKB_KEY_braille_dots_456, 0x1002838, 0x2838, "BRAILLE PATTERN DOTS-456") \ + OP(XKB_KEY_braille_dots_1456, 0x1002839, 0x2839, "BRAILLE PATTERN DOTS-1456") \ + OP(XKB_KEY_braille_dots_2456, 0x100283a, 0x283a, "BRAILLE PATTERN DOTS-2456") \ + OP(XKB_KEY_braille_dots_12456, 0x100283b, 0x283b, "BRAILLE PATTERN DOTS-12456") \ + OP(XKB_KEY_braille_dots_3456, 0x100283c, 0x283c, "BRAILLE PATTERN DOTS-3456") \ + OP(XKB_KEY_braille_dots_13456, 0x100283d, 0x283d, "BRAILLE PATTERN DOTS-13456") \ + OP(XKB_KEY_braille_dots_23456, 0x100283e, 0x283e, "BRAILLE PATTERN DOTS-23456") \ + OP(XKB_KEY_braille_dots_123456, 0x100283f, 0x283f, "BRAILLE PATTERN DOTS-123456") \ + OP(XKB_KEY_braille_dots_7, 0x1002840, 0x2840, "BRAILLE PATTERN DOTS-7") \ + OP(XKB_KEY_braille_dots_17, 0x1002841, 0x2841, "BRAILLE PATTERN DOTS-17") \ + OP(XKB_KEY_braille_dots_27, 0x1002842, 0x2842, "BRAILLE PATTERN DOTS-27") \ + OP(XKB_KEY_braille_dots_127, 0x1002843, 0x2843, "BRAILLE PATTERN DOTS-127") \ + OP(XKB_KEY_braille_dots_37, 0x1002844, 0x2844, "BRAILLE PATTERN DOTS-37") \ + OP(XKB_KEY_braille_dots_137, 0x1002845, 0x2845, "BRAILLE PATTERN DOTS-137") \ + OP(XKB_KEY_braille_dots_237, 0x1002846, 0x2846, "BRAILLE PATTERN DOTS-237") \ + OP(XKB_KEY_braille_dots_1237, 0x1002847, 0x2847, "BRAILLE PATTERN DOTS-1237") \ + OP(XKB_KEY_braille_dots_47, 0x1002848, 0x2848, "BRAILLE PATTERN DOTS-47") \ + OP(XKB_KEY_braille_dots_147, 0x1002849, 0x2849, "BRAILLE PATTERN DOTS-147") \ + OP(XKB_KEY_braille_dots_247, 0x100284a, 0x284a, "BRAILLE PATTERN DOTS-247") \ + OP(XKB_KEY_braille_dots_1247, 0x100284b, 0x284b, "BRAILLE PATTERN DOTS-1247") \ + OP(XKB_KEY_braille_dots_347, 0x100284c, 0x284c, "BRAILLE PATTERN DOTS-347") \ + OP(XKB_KEY_braille_dots_1347, 0x100284d, 0x284d, "BRAILLE PATTERN DOTS-1347") \ + OP(XKB_KEY_braille_dots_2347, 0x100284e, 0x284e, "BRAILLE PATTERN DOTS-2347") \ + OP(XKB_KEY_braille_dots_12347, 0x100284f, 0x284f, "BRAILLE PATTERN DOTS-12347") \ + OP(XKB_KEY_braille_dots_57, 0x1002850, 0x2850, "BRAILLE PATTERN DOTS-57") \ + OP(XKB_KEY_braille_dots_157, 0x1002851, 0x2851, "BRAILLE PATTERN DOTS-157") \ + OP(XKB_KEY_braille_dots_257, 0x1002852, 0x2852, "BRAILLE PATTERN DOTS-257") \ + OP(XKB_KEY_braille_dots_1257, 0x1002853, 0x2853, "BRAILLE PATTERN DOTS-1257") \ + OP(XKB_KEY_braille_dots_357, 0x1002854, 0x2854, "BRAILLE PATTERN DOTS-357") \ + OP(XKB_KEY_braille_dots_1357, 0x1002855, 0x2855, "BRAILLE PATTERN DOTS-1357") \ + OP(XKB_KEY_braille_dots_2357, 0x1002856, 0x2856, "BRAILLE PATTERN DOTS-2357") \ + OP(XKB_KEY_braille_dots_12357, 0x1002857, 0x2857, "BRAILLE PATTERN DOTS-12357") \ + OP(XKB_KEY_braille_dots_457, 0x1002858, 0x2858, "BRAILLE PATTERN DOTS-457") \ + OP(XKB_KEY_braille_dots_1457, 0x1002859, 0x2859, "BRAILLE PATTERN DOTS-1457") \ + OP(XKB_KEY_braille_dots_2457, 0x100285a, 0x285a, "BRAILLE PATTERN DOTS-2457") \ + OP(XKB_KEY_braille_dots_12457, 0x100285b, 0x285b, "BRAILLE PATTERN DOTS-12457") \ + OP(XKB_KEY_braille_dots_3457, 0x100285c, 0x285c, "BRAILLE PATTERN DOTS-3457") \ + OP(XKB_KEY_braille_dots_13457, 0x100285d, 0x285d, "BRAILLE PATTERN DOTS-13457") \ + OP(XKB_KEY_braille_dots_23457, 0x100285e, 0x285e, "BRAILLE PATTERN DOTS-23457") \ + OP(XKB_KEY_braille_dots_123457, 0x100285f, 0x285f, "BRAILLE PATTERN DOTS-123457") \ + OP(XKB_KEY_braille_dots_67, 0x1002860, 0x2860, "BRAILLE PATTERN DOTS-67") \ + OP(XKB_KEY_braille_dots_167, 0x1002861, 0x2861, "BRAILLE PATTERN DOTS-167") \ + OP(XKB_KEY_braille_dots_267, 0x1002862, 0x2862, "BRAILLE PATTERN DOTS-267") \ + OP(XKB_KEY_braille_dots_1267, 0x1002863, 0x2863, "BRAILLE PATTERN DOTS-1267") \ + OP(XKB_KEY_braille_dots_367, 0x1002864, 0x2864, "BRAILLE PATTERN DOTS-367") \ + OP(XKB_KEY_braille_dots_1367, 0x1002865, 0x2865, "BRAILLE PATTERN DOTS-1367") \ + OP(XKB_KEY_braille_dots_2367, 0x1002866, 0x2866, "BRAILLE PATTERN DOTS-2367") \ + OP(XKB_KEY_braille_dots_12367, 0x1002867, 0x2867, "BRAILLE PATTERN DOTS-12367") \ + OP(XKB_KEY_braille_dots_467, 0x1002868, 0x2868, "BRAILLE PATTERN DOTS-467") \ + OP(XKB_KEY_braille_dots_1467, 0x1002869, 0x2869, "BRAILLE PATTERN DOTS-1467") \ + OP(XKB_KEY_braille_dots_2467, 0x100286a, 0x286a, "BRAILLE PATTERN DOTS-2467") \ + OP(XKB_KEY_braille_dots_12467, 0x100286b, 0x286b, "BRAILLE PATTERN DOTS-12467") \ + OP(XKB_KEY_braille_dots_3467, 0x100286c, 0x286c, "BRAILLE PATTERN DOTS-3467") \ + OP(XKB_KEY_braille_dots_13467, 0x100286d, 0x286d, "BRAILLE PATTERN DOTS-13467") \ + OP(XKB_KEY_braille_dots_23467, 0x100286e, 0x286e, "BRAILLE PATTERN DOTS-23467") \ + OP(XKB_KEY_braille_dots_123467, 0x100286f, 0x286f, "BRAILLE PATTERN DOTS-123467") \ + OP(XKB_KEY_braille_dots_567, 0x1002870, 0x2870, "BRAILLE PATTERN DOTS-567") \ + OP(XKB_KEY_braille_dots_1567, 0x1002871, 0x2871, "BRAILLE PATTERN DOTS-1567") \ + OP(XKB_KEY_braille_dots_2567, 0x1002872, 0x2872, "BRAILLE PATTERN DOTS-2567") \ + OP(XKB_KEY_braille_dots_12567, 0x1002873, 0x2873, "BRAILLE PATTERN DOTS-12567") \ + OP(XKB_KEY_braille_dots_3567, 0x1002874, 0x2874, "BRAILLE PATTERN DOTS-3567") \ + OP(XKB_KEY_braille_dots_13567, 0x1002875, 0x2875, "BRAILLE PATTERN DOTS-13567") \ + OP(XKB_KEY_braille_dots_23567, 0x1002876, 0x2876, "BRAILLE PATTERN DOTS-23567") \ + OP(XKB_KEY_braille_dots_123567, 0x1002877, 0x2877, "BRAILLE PATTERN DOTS-123567") \ + OP(XKB_KEY_braille_dots_4567, 0x1002878, 0x2878, "BRAILLE PATTERN DOTS-4567") \ + OP(XKB_KEY_braille_dots_14567, 0x1002879, 0x2879, "BRAILLE PATTERN DOTS-14567") \ + OP(XKB_KEY_braille_dots_24567, 0x100287a, 0x287a, "BRAILLE PATTERN DOTS-24567") \ + OP(XKB_KEY_braille_dots_124567, 0x100287b, 0x287b, "BRAILLE PATTERN DOTS-124567") \ + OP(XKB_KEY_braille_dots_34567, 0x100287c, 0x287c, "BRAILLE PATTERN DOTS-34567") \ + OP(XKB_KEY_braille_dots_134567, 0x100287d, 0x287d, "BRAILLE PATTERN DOTS-134567") \ + OP(XKB_KEY_braille_dots_234567, 0x100287e, 0x287e, "BRAILLE PATTERN DOTS-234567") \ + OP(XKB_KEY_braille_dots_1234567, 0x100287f, 0x287f, "BRAILLE PATTERN DOTS-1234567") \ + OP(XKB_KEY_braille_dots_8, 0x1002880, 0x2880, "BRAILLE PATTERN DOTS-8") \ + OP(XKB_KEY_braille_dots_18, 0x1002881, 0x2881, "BRAILLE PATTERN DOTS-18") \ + OP(XKB_KEY_braille_dots_28, 0x1002882, 0x2882, "BRAILLE PATTERN DOTS-28") \ + OP(XKB_KEY_braille_dots_128, 0x1002883, 0x2883, "BRAILLE PATTERN DOTS-128") \ + OP(XKB_KEY_braille_dots_38, 0x1002884, 0x2884, "BRAILLE PATTERN DOTS-38") \ + OP(XKB_KEY_braille_dots_138, 0x1002885, 0x2885, "BRAILLE PATTERN DOTS-138") \ + OP(XKB_KEY_braille_dots_238, 0x1002886, 0x2886, "BRAILLE PATTERN DOTS-238") \ + OP(XKB_KEY_braille_dots_1238, 0x1002887, 0x2887, "BRAILLE PATTERN DOTS-1238") \ + OP(XKB_KEY_braille_dots_48, 0x1002888, 0x2888, "BRAILLE PATTERN DOTS-48") \ + OP(XKB_KEY_braille_dots_148, 0x1002889, 0x2889, "BRAILLE PATTERN DOTS-148") \ + OP(XKB_KEY_braille_dots_248, 0x100288a, 0x288a, "BRAILLE PATTERN DOTS-248") \ + OP(XKB_KEY_braille_dots_1248, 0x100288b, 0x288b, "BRAILLE PATTERN DOTS-1248") \ + OP(XKB_KEY_braille_dots_348, 0x100288c, 0x288c, "BRAILLE PATTERN DOTS-348") \ + OP(XKB_KEY_braille_dots_1348, 0x100288d, 0x288d, "BRAILLE PATTERN DOTS-1348") \ + OP(XKB_KEY_braille_dots_2348, 0x100288e, 0x288e, "BRAILLE PATTERN DOTS-2348") \ + OP(XKB_KEY_braille_dots_12348, 0x100288f, 0x288f, "BRAILLE PATTERN DOTS-12348") \ + OP(XKB_KEY_braille_dots_58, 0x1002890, 0x2890, "BRAILLE PATTERN DOTS-58") \ + OP(XKB_KEY_braille_dots_158, 0x1002891, 0x2891, "BRAILLE PATTERN DOTS-158") \ + OP(XKB_KEY_braille_dots_258, 0x1002892, 0x2892, "BRAILLE PATTERN DOTS-258") \ + OP(XKB_KEY_braille_dots_1258, 0x1002893, 0x2893, "BRAILLE PATTERN DOTS-1258") \ + OP(XKB_KEY_braille_dots_358, 0x1002894, 0x2894, "BRAILLE PATTERN DOTS-358") \ + OP(XKB_KEY_braille_dots_1358, 0x1002895, 0x2895, "BRAILLE PATTERN DOTS-1358") \ + OP(XKB_KEY_braille_dots_2358, 0x1002896, 0x2896, "BRAILLE PATTERN DOTS-2358") \ + OP(XKB_KEY_braille_dots_12358, 0x1002897, 0x2897, "BRAILLE PATTERN DOTS-12358") \ + OP(XKB_KEY_braille_dots_458, 0x1002898, 0x2898, "BRAILLE PATTERN DOTS-458") \ + OP(XKB_KEY_braille_dots_1458, 0x1002899, 0x2899, "BRAILLE PATTERN DOTS-1458") \ + OP(XKB_KEY_braille_dots_2458, 0x100289a, 0x289a, "BRAILLE PATTERN DOTS-2458") \ + OP(XKB_KEY_braille_dots_12458, 0x100289b, 0x289b, "BRAILLE PATTERN DOTS-12458") \ + OP(XKB_KEY_braille_dots_3458, 0x100289c, 0x289c, "BRAILLE PATTERN DOTS-3458") \ + OP(XKB_KEY_braille_dots_13458, 0x100289d, 0x289d, "BRAILLE PATTERN DOTS-13458") \ + OP(XKB_KEY_braille_dots_23458, 0x100289e, 0x289e, "BRAILLE PATTERN DOTS-23458") \ + OP(XKB_KEY_braille_dots_123458, 0x100289f, 0x289f, "BRAILLE PATTERN DOTS-123458") \ + OP(XKB_KEY_braille_dots_68, 0x10028a0, 0x28a0, "BRAILLE PATTERN DOTS-68") \ + OP(XKB_KEY_braille_dots_168, 0x10028a1, 0x28a1, "BRAILLE PATTERN DOTS-168") \ + OP(XKB_KEY_braille_dots_268, 0x10028a2, 0x28a2, "BRAILLE PATTERN DOTS-268") \ + OP(XKB_KEY_braille_dots_1268, 0x10028a3, 0x28a3, "BRAILLE PATTERN DOTS-1268") \ + OP(XKB_KEY_braille_dots_368, 0x10028a4, 0x28a4, "BRAILLE PATTERN DOTS-368") \ + OP(XKB_KEY_braille_dots_1368, 0x10028a5, 0x28a5, "BRAILLE PATTERN DOTS-1368") \ + OP(XKB_KEY_braille_dots_2368, 0x10028a6, 0x28a6, "BRAILLE PATTERN DOTS-2368") \ + OP(XKB_KEY_braille_dots_12368, 0x10028a7, 0x28a7, "BRAILLE PATTERN DOTS-12368") \ + OP(XKB_KEY_braille_dots_468, 0x10028a8, 0x28a8, "BRAILLE PATTERN DOTS-468") \ + OP(XKB_KEY_braille_dots_1468, 0x10028a9, 0x28a9, "BRAILLE PATTERN DOTS-1468") \ + OP(XKB_KEY_braille_dots_2468, 0x10028aa, 0x28aa, "BRAILLE PATTERN DOTS-2468") \ + OP(XKB_KEY_braille_dots_12468, 0x10028ab, 0x28ab, "BRAILLE PATTERN DOTS-12468") \ + OP(XKB_KEY_braille_dots_3468, 0x10028ac, 0x28ac, "BRAILLE PATTERN DOTS-3468") \ + OP(XKB_KEY_braille_dots_13468, 0x10028ad, 0x28ad, "BRAILLE PATTERN DOTS-13468") \ + OP(XKB_KEY_braille_dots_23468, 0x10028ae, 0x28ae, "BRAILLE PATTERN DOTS-23468") \ + OP(XKB_KEY_braille_dots_123468, 0x10028af, 0x28af, "BRAILLE PATTERN DOTS-123468") \ + OP(XKB_KEY_braille_dots_568, 0x10028b0, 0x28b0, "BRAILLE PATTERN DOTS-568") \ + OP(XKB_KEY_braille_dots_1568, 0x10028b1, 0x28b1, "BRAILLE PATTERN DOTS-1568") \ + OP(XKB_KEY_braille_dots_2568, 0x10028b2, 0x28b2, "BRAILLE PATTERN DOTS-2568") \ + OP(XKB_KEY_braille_dots_12568, 0x10028b3, 0x28b3, "BRAILLE PATTERN DOTS-12568") \ + OP(XKB_KEY_braille_dots_3568, 0x10028b4, 0x28b4, "BRAILLE PATTERN DOTS-3568") \ + OP(XKB_KEY_braille_dots_13568, 0x10028b5, 0x28b5, "BRAILLE PATTERN DOTS-13568") \ + OP(XKB_KEY_braille_dots_23568, 0x10028b6, 0x28b6, "BRAILLE PATTERN DOTS-23568") \ + OP(XKB_KEY_braille_dots_123568, 0x10028b7, 0x28b7, "BRAILLE PATTERN DOTS-123568") \ + OP(XKB_KEY_braille_dots_4568, 0x10028b8, 0x28b8, "BRAILLE PATTERN DOTS-4568") \ + OP(XKB_KEY_braille_dots_14568, 0x10028b9, 0x28b9, "BRAILLE PATTERN DOTS-14568") \ + OP(XKB_KEY_braille_dots_24568, 0x10028ba, 0x28ba, "BRAILLE PATTERN DOTS-24568") \ + OP(XKB_KEY_braille_dots_124568, 0x10028bb, 0x28bb, "BRAILLE PATTERN DOTS-124568") \ + OP(XKB_KEY_braille_dots_34568, 0x10028bc, 0x28bc, "BRAILLE PATTERN DOTS-34568") \ + OP(XKB_KEY_braille_dots_134568, 0x10028bd, 0x28bd, "BRAILLE PATTERN DOTS-134568") \ + OP(XKB_KEY_braille_dots_234568, 0x10028be, 0x28be, "BRAILLE PATTERN DOTS-234568") \ + OP(XKB_KEY_braille_dots_1234568, 0x10028bf, 0x28bf, "BRAILLE PATTERN DOTS-1234568") \ + OP(XKB_KEY_braille_dots_78, 0x10028c0, 0x28c0, "BRAILLE PATTERN DOTS-78") \ + OP(XKB_KEY_braille_dots_178, 0x10028c1, 0x28c1, "BRAILLE PATTERN DOTS-178") \ + OP(XKB_KEY_braille_dots_278, 0x10028c2, 0x28c2, "BRAILLE PATTERN DOTS-278") \ + OP(XKB_KEY_braille_dots_1278, 0x10028c3, 0x28c3, "BRAILLE PATTERN DOTS-1278") \ + OP(XKB_KEY_braille_dots_378, 0x10028c4, 0x28c4, "BRAILLE PATTERN DOTS-378") \ + OP(XKB_KEY_braille_dots_1378, 0x10028c5, 0x28c5, "BRAILLE PATTERN DOTS-1378") \ + OP(XKB_KEY_braille_dots_2378, 0x10028c6, 0x28c6, "BRAILLE PATTERN DOTS-2378") \ + OP(XKB_KEY_braille_dots_12378, 0x10028c7, 0x28c7, "BRAILLE PATTERN DOTS-12378") \ + OP(XKB_KEY_braille_dots_478, 0x10028c8, 0x28c8, "BRAILLE PATTERN DOTS-478") \ + OP(XKB_KEY_braille_dots_1478, 0x10028c9, 0x28c9, "BRAILLE PATTERN DOTS-1478") \ + OP(XKB_KEY_braille_dots_2478, 0x10028ca, 0x28ca, "BRAILLE PATTERN DOTS-2478") \ + OP(XKB_KEY_braille_dots_12478, 0x10028cb, 0x28cb, "BRAILLE PATTERN DOTS-12478") \ + OP(XKB_KEY_braille_dots_3478, 0x10028cc, 0x28cc, "BRAILLE PATTERN DOTS-3478") \ + OP(XKB_KEY_braille_dots_13478, 0x10028cd, 0x28cd, "BRAILLE PATTERN DOTS-13478") \ + OP(XKB_KEY_braille_dots_23478, 0x10028ce, 0x28ce, "BRAILLE PATTERN DOTS-23478") \ + OP(XKB_KEY_braille_dots_123478, 0x10028cf, 0x28cf, "BRAILLE PATTERN DOTS-123478") \ + OP(XKB_KEY_braille_dots_578, 0x10028d0, 0x28d0, "BRAILLE PATTERN DOTS-578") \ + OP(XKB_KEY_braille_dots_1578, 0x10028d1, 0x28d1, "BRAILLE PATTERN DOTS-1578") \ + OP(XKB_KEY_braille_dots_2578, 0x10028d2, 0x28d2, "BRAILLE PATTERN DOTS-2578") \ + OP(XKB_KEY_braille_dots_12578, 0x10028d3, 0x28d3, "BRAILLE PATTERN DOTS-12578") \ + OP(XKB_KEY_braille_dots_3578, 0x10028d4, 0x28d4, "BRAILLE PATTERN DOTS-3578") \ + OP(XKB_KEY_braille_dots_13578, 0x10028d5, 0x28d5, "BRAILLE PATTERN DOTS-13578") \ + OP(XKB_KEY_braille_dots_23578, 0x10028d6, 0x28d6, "BRAILLE PATTERN DOTS-23578") \ + OP(XKB_KEY_braille_dots_123578, 0x10028d7, 0x28d7, "BRAILLE PATTERN DOTS-123578") \ + OP(XKB_KEY_braille_dots_4578, 0x10028d8, 0x28d8, "BRAILLE PATTERN DOTS-4578") \ + OP(XKB_KEY_braille_dots_14578, 0x10028d9, 0x28d9, "BRAILLE PATTERN DOTS-14578") \ + OP(XKB_KEY_braille_dots_24578, 0x10028da, 0x28da, "BRAILLE PATTERN DOTS-24578") \ + OP(XKB_KEY_braille_dots_124578, 0x10028db, 0x28db, "BRAILLE PATTERN DOTS-124578") \ + OP(XKB_KEY_braille_dots_34578, 0x10028dc, 0x28dc, "BRAILLE PATTERN DOTS-34578") \ + OP(XKB_KEY_braille_dots_134578, 0x10028dd, 0x28dd, "BRAILLE PATTERN DOTS-134578") \ + OP(XKB_KEY_braille_dots_234578, 0x10028de, 0x28de, "BRAILLE PATTERN DOTS-234578") \ + OP(XKB_KEY_braille_dots_1234578, 0x10028df, 0x28df, "BRAILLE PATTERN DOTS-1234578") \ + OP(XKB_KEY_braille_dots_678, 0x10028e0, 0x28e0, "BRAILLE PATTERN DOTS-678") \ + OP(XKB_KEY_braille_dots_1678, 0x10028e1, 0x28e1, "BRAILLE PATTERN DOTS-1678") \ + OP(XKB_KEY_braille_dots_2678, 0x10028e2, 0x28e2, "BRAILLE PATTERN DOTS-2678") \ + OP(XKB_KEY_braille_dots_12678, 0x10028e3, 0x28e3, "BRAILLE PATTERN DOTS-12678") \ + OP(XKB_KEY_braille_dots_3678, 0x10028e4, 0x28e4, "BRAILLE PATTERN DOTS-3678") \ + OP(XKB_KEY_braille_dots_13678, 0x10028e5, 0x28e5, "BRAILLE PATTERN DOTS-13678") \ + OP(XKB_KEY_braille_dots_23678, 0x10028e6, 0x28e6, "BRAILLE PATTERN DOTS-23678") \ + OP(XKB_KEY_braille_dots_123678, 0x10028e7, 0x28e7, "BRAILLE PATTERN DOTS-123678") \ + OP(XKB_KEY_braille_dots_4678, 0x10028e8, 0x28e8, "BRAILLE PATTERN DOTS-4678") \ + OP(XKB_KEY_braille_dots_14678, 0x10028e9, 0x28e9, "BRAILLE PATTERN DOTS-14678") \ + OP(XKB_KEY_braille_dots_24678, 0x10028ea, 0x28ea, "BRAILLE PATTERN DOTS-24678") \ + OP(XKB_KEY_braille_dots_124678, 0x10028eb, 0x28eb, "BRAILLE PATTERN DOTS-124678") \ + OP(XKB_KEY_braille_dots_34678, 0x10028ec, 0x28ec, "BRAILLE PATTERN DOTS-34678") \ + OP(XKB_KEY_braille_dots_134678, 0x10028ed, 0x28ed, "BRAILLE PATTERN DOTS-134678") \ + OP(XKB_KEY_braille_dots_234678, 0x10028ee, 0x28ee, "BRAILLE PATTERN DOTS-234678") \ + OP(XKB_KEY_braille_dots_1234678, 0x10028ef, 0x28ef, "BRAILLE PATTERN DOTS-1234678") \ + OP(XKB_KEY_braille_dots_5678, 0x10028f0, 0x28f0, "BRAILLE PATTERN DOTS-5678") \ + OP(XKB_KEY_braille_dots_15678, 0x10028f1, 0x28f1, "BRAILLE PATTERN DOTS-15678") \ + OP(XKB_KEY_braille_dots_25678, 0x10028f2, 0x28f2, "BRAILLE PATTERN DOTS-25678") \ + OP(XKB_KEY_braille_dots_125678, 0x10028f3, 0x28f3, "BRAILLE PATTERN DOTS-125678") \ + OP(XKB_KEY_braille_dots_35678, 0x10028f4, 0x28f4, "BRAILLE PATTERN DOTS-35678") \ + OP(XKB_KEY_braille_dots_135678, 0x10028f5, 0x28f5, "BRAILLE PATTERN DOTS-135678") \ + OP(XKB_KEY_braille_dots_235678, 0x10028f6, 0x28f6, "BRAILLE PATTERN DOTS-235678") \ + OP(XKB_KEY_braille_dots_1235678, 0x10028f7, 0x28f7, "BRAILLE PATTERN DOTS-1235678") \ + OP(XKB_KEY_braille_dots_45678, 0x10028f8, 0x28f8, "BRAILLE PATTERN DOTS-45678") \ + OP(XKB_KEY_braille_dots_145678, 0x10028f9, 0x28f9, "BRAILLE PATTERN DOTS-145678") \ + OP(XKB_KEY_braille_dots_245678, 0x10028fa, 0x28fa, "BRAILLE PATTERN DOTS-245678") \ + OP(XKB_KEY_braille_dots_1245678, 0x10028fb, 0x28fb, "BRAILLE PATTERN DOTS-1245678") \ + OP(XKB_KEY_braille_dots_345678, 0x10028fc, 0x28fc, "BRAILLE PATTERN DOTS-345678") \ + OP(XKB_KEY_braille_dots_1345678, 0x10028fd, 0x28fd, "BRAILLE PATTERN DOTS-1345678") \ + OP(XKB_KEY_braille_dots_2345678, 0x10028fe, 0x28fe, "BRAILLE PATTERN DOTS-2345678") \ + OP(XKB_KEY_braille_dots_12345678, 0x10028ff, 0x28ff, "BRAILLE PATTERN DOTS-12345678") \ + OP(XKB_KEY_Sinh_ng, 0x1000d82, 0x0D82, "SINHALA ANUSVARAYA") \ + OP(XKB_KEY_Sinh_h2, 0x1000d83, 0x0D83, "SINHALA VISARGAYA") \ + OP(XKB_KEY_Sinh_a, 0x1000d85, 0x0D85, "SINHALA AYANNA") \ + OP(XKB_KEY_Sinh_aa, 0x1000d86, 0x0D86, "SINHALA AAYANNA") \ + OP(XKB_KEY_Sinh_ae, 0x1000d87, 0x0D87, "SINHALA AEYANNA") \ + OP(XKB_KEY_Sinh_aee, 0x1000d88, 0x0D88, "SINHALA AEEYANNA") \ + OP(XKB_KEY_Sinh_i, 0x1000d89, 0x0D89, "SINHALA IYANNA") \ + OP(XKB_KEY_Sinh_ii, 0x1000d8a, 0x0D8A, "SINHALA IIYANNA") \ + OP(XKB_KEY_Sinh_u, 0x1000d8b, 0x0D8B, "SINHALA UYANNA") \ + OP(XKB_KEY_Sinh_uu, 0x1000d8c, 0x0D8C, "SINHALA UUYANNA") \ + OP(XKB_KEY_Sinh_ri, 0x1000d8d, 0x0D8D, "SINHALA IRUYANNA") \ + OP(XKB_KEY_Sinh_rii, 0x1000d8e, 0x0D8E, "SINHALA IRUUYANNA") \ + OP(XKB_KEY_Sinh_lu, 0x1000d8f, 0x0D8F, "SINHALA ILUYANNA") \ + OP(XKB_KEY_Sinh_luu, 0x1000d90, 0x0D90, "SINHALA ILUUYANNA") \ + OP(XKB_KEY_Sinh_e, 0x1000d91, 0x0D91, "SINHALA EYANNA") \ + OP(XKB_KEY_Sinh_ee, 0x1000d92, 0x0D92, "SINHALA EEYANNA") \ + OP(XKB_KEY_Sinh_ai, 0x1000d93, 0x0D93, "SINHALA AIYANNA") \ + OP(XKB_KEY_Sinh_o, 0x1000d94, 0x0D94, "SINHALA OYANNA") \ + OP(XKB_KEY_Sinh_oo, 0x1000d95, 0x0D95, "SINHALA OOYANNA") \ + OP(XKB_KEY_Sinh_au, 0x1000d96, 0x0D96, "SINHALA AUYANNA") \ + OP(XKB_KEY_Sinh_ka, 0x1000d9a, 0x0D9A, "SINHALA KAYANNA") \ + OP(XKB_KEY_Sinh_kha, 0x1000d9b, 0x0D9B, "SINHALA MAHA. KAYANNA") \ + OP(XKB_KEY_Sinh_ga, 0x1000d9c, 0x0D9C, "SINHALA GAYANNA") \ + OP(XKB_KEY_Sinh_gha, 0x1000d9d, 0x0D9D, "SINHALA MAHA. GAYANNA") \ + OP(XKB_KEY_Sinh_ng2, 0x1000d9e, 0x0D9E, "SINHALA KANTAJA NAASIKYAYA") \ + OP(XKB_KEY_Sinh_nga, 0x1000d9f, 0x0D9F, "SINHALA SANYAKA GAYANNA") \ + OP(XKB_KEY_Sinh_ca, 0x1000da0, 0x0DA0, "SINHALA CAYANNA") \ + OP(XKB_KEY_Sinh_cha, 0x1000da1, 0x0DA1, "SINHALA MAHA. CAYANNA") \ + OP(XKB_KEY_Sinh_ja, 0x1000da2, 0x0DA2, "SINHALA JAYANNA") \ + OP(XKB_KEY_Sinh_jha, 0x1000da3, 0x0DA3, "SINHALA MAHA. JAYANNA") \ + OP(XKB_KEY_Sinh_nya, 0x1000da4, 0x0DA4, "SINHALA TAALUJA NAASIKYAYA") \ + OP(XKB_KEY_Sinh_jnya, 0x1000da5, 0x0DA5, "SINHALA TAALUJA SANYOOGA NAASIKYAYA") \ + OP(XKB_KEY_Sinh_nja, 0x1000da6, 0x0DA6, "SINHALA SANYAKA JAYANNA") \ + OP(XKB_KEY_Sinh_tta, 0x1000da7, 0x0DA7, "SINHALA TTAYANNA") \ + OP(XKB_KEY_Sinh_ttha, 0x1000da8, 0x0DA8, "SINHALA MAHA. TTAYANNA") \ + OP(XKB_KEY_Sinh_dda, 0x1000da9, 0x0DA9, "SINHALA DDAYANNA") \ + OP(XKB_KEY_Sinh_ddha, 0x1000daa, 0x0DAA, "SINHALA MAHA. DDAYANNA") \ + OP(XKB_KEY_Sinh_nna, 0x1000dab, 0x0DAB, "SINHALA MUURDHAJA NAYANNA") \ + OP(XKB_KEY_Sinh_ndda, 0x1000dac, 0x0DAC, "SINHALA SANYAKA DDAYANNA") \ + OP(XKB_KEY_Sinh_tha, 0x1000dad, 0x0DAD, "SINHALA TAYANNA") \ + OP(XKB_KEY_Sinh_thha, 0x1000dae, 0x0DAE, "SINHALA MAHA. TAYANNA") \ + OP(XKB_KEY_Sinh_dha, 0x1000daf, 0x0DAF, "SINHALA DAYANNA") \ + OP(XKB_KEY_Sinh_dhha, 0x1000db0, 0x0DB0, "SINHALA MAHA. DAYANNA") \ + OP(XKB_KEY_Sinh_na, 0x1000db1, 0x0DB1, "SINHALA DANTAJA NAYANNA") \ + OP(XKB_KEY_Sinh_ndha, 0x1000db3, 0x0DB3, "SINHALA SANYAKA DAYANNA") \ + OP(XKB_KEY_Sinh_pa, 0x1000db4, 0x0DB4, "SINHALA PAYANNA") \ + OP(XKB_KEY_Sinh_pha, 0x1000db5, 0x0DB5, "SINHALA MAHA. PAYANNA") \ + OP(XKB_KEY_Sinh_ba, 0x1000db6, 0x0DB6, "SINHALA BAYANNA") \ + OP(XKB_KEY_Sinh_bha, 0x1000db7, 0x0DB7, "SINHALA MAHA. BAYANNA") \ + OP(XKB_KEY_Sinh_ma, 0x1000db8, 0x0DB8, "SINHALA MAYANNA") \ + OP(XKB_KEY_Sinh_mba, 0x1000db9, 0x0DB9, "SINHALA AMBA BAYANNA") \ + OP(XKB_KEY_Sinh_ya, 0x1000dba, 0x0DBA, "SINHALA YAYANNA") \ + OP(XKB_KEY_Sinh_ra, 0x1000dbb, 0x0DBB, "SINHALA RAYANNA") \ + OP(XKB_KEY_Sinh_la, 0x1000dbd, 0x0DBD, "SINHALA DANTAJA LAYANNA") \ + OP(XKB_KEY_Sinh_va, 0x1000dc0, 0x0DC0, "SINHALA VAYANNA") \ + OP(XKB_KEY_Sinh_sha, 0x1000dc1, 0x0DC1, "SINHALA TAALUJA SAYANNA") \ + OP(XKB_KEY_Sinh_ssha, 0x1000dc2, 0x0DC2, "SINHALA MUURDHAJA SAYANNA") \ + OP(XKB_KEY_Sinh_sa, 0x1000dc3, 0x0DC3, "SINHALA DANTAJA SAYANNA") \ + OP(XKB_KEY_Sinh_ha, 0x1000dc4, 0x0DC4, "SINHALA HAYANNA") \ + OP(XKB_KEY_Sinh_lla, 0x1000dc5, 0x0DC5, "SINHALA MUURDHAJA LAYANNA") \ + OP(XKB_KEY_Sinh_fa, 0x1000dc6, 0x0DC6, "SINHALA FAYANNA") \ + OP(XKB_KEY_Sinh_al, 0x1000dca, 0x0DCA, "SINHALA AL-LAKUNA") \ + OP(XKB_KEY_Sinh_aa2, 0x1000dcf, 0x0DCF, "SINHALA AELA-PILLA") \ + OP(XKB_KEY_Sinh_ae2, 0x1000dd0, 0x0DD0, "SINHALA AEDA-PILLA") \ + OP(XKB_KEY_Sinh_aee2, 0x1000dd1, 0x0DD1, "SINHALA DIGA AEDA-PILLA") \ + OP(XKB_KEY_Sinh_i2, 0x1000dd2, 0x0DD2, "SINHALA IS-PILLA") \ + OP(XKB_KEY_Sinh_ii2, 0x1000dd3, 0x0DD3, "SINHALA DIGA IS-PILLA") \ + OP(XKB_KEY_Sinh_u2, 0x1000dd4, 0x0DD4, "SINHALA PAA-PILLA") \ + OP(XKB_KEY_Sinh_uu2, 0x1000dd6, 0x0DD6, "SINHALA DIGA PAA-PILLA") \ + OP(XKB_KEY_Sinh_ru2, 0x1000dd8, 0x0DD8, "SINHALA GAETTA-PILLA") \ + OP(XKB_KEY_Sinh_e2, 0x1000dd9, 0x0DD9, "SINHALA KOMBUVA") \ + OP(XKB_KEY_Sinh_ee2, 0x1000dda, 0x0DDA, "SINHALA DIGA KOMBUVA") \ + OP(XKB_KEY_Sinh_ai2, 0x1000ddb, 0x0DDB, "SINHALA KOMBU DEKA") \ + OP(XKB_KEY_Sinh_o2, 0x1000ddc, 0x0DDC, "SINHALA KOMBUVA HAA AELA-PILLA") \ + OP(XKB_KEY_Sinh_oo2, 0x1000ddd, 0x0DDD, "SINHALA KOMBUVA HAA DIGA AELA-PILLA") \ + OP(XKB_KEY_Sinh_au2, 0x1000dde, 0x0DDE, "SINHALA KOMBUVA HAA GAYANUKITTA") \ + OP(XKB_KEY_Sinh_lu2, 0x1000ddf, 0x0DDF, "SINHALA GAYANUKITTA") \ + OP(XKB_KEY_Sinh_ruu2, 0x1000df2, 0x0DF2, "SINHALA DIGA GAETTA-PILLA") \ + OP(XKB_KEY_Sinh_luu2, 0x1000df3, 0x0DF3, "SINHALA DIGA GAYANUKITTA") \ + OP(XKB_KEY_Sinh_kunddaliya, 0x1000df4, 0x0DF4, "SINHALA KUNDDALIYA")