diff options
author | Gatis Paeglis <gatis.paeglis@qt.io> | 2018-11-16 17:07:33 +0100 |
---|---|---|
committer | Gatis Paeglis <gatis.paeglis@qt.io> | 2018-11-30 09:47:03 +0000 |
commit | c3a963da1f9e7b1d37e63eedded61da4fbdaaf9a (patch) | |
tree | abe3ac72e69cd6e85ec3a4cfb587405151076493 /src/3rdparty | |
parent | 1f1dc3fc4c2e5e2d94e86dfc7235a4b762da2e72 (diff) |
src/3rdparty: remove xkbcommon
The only reason why we bundled this library ~6 years ago was because
it was not available on distributions that we supported at the time,
but library was a hard dependency for XCB plugin. See:
2122e731abdb619249df89642c0800640b2fa428
Later more and more projects started to depend on it (compose input
context plugin, libinput, mir, wayland). The configuration had become
too complex, because some projects used bundled and some used the
version from the system.
Having libxkbcommon in 3rdparty sources is not necessary anymore, after
RHEL 6.6 was removed from the list of supported platforms for Qt 5.12.
Ubuntu 16.04 - 0.5.0
Ubuntu 18.04 - 0.8.0
openSUSE 42.3 - 0.6.1
RHEL-7.4 - 0.7.1
This will also simplify further development, e.g. QTBUG-42181
Bumped the minimal required version 0.4.1 -> 0.5.0.
The patch also contains a code marked with "TRANSITION HACK", which
is temporary needed so we can update the dependent wayland module.
[ChangeLog][Third-Party Code] Removed xkbcommon from bundled sources.
This library is present on all supported platforms. The minimal required
version now is 0.5.0.
Task-number: QTBUG-65503
Change-Id: Iec50829bb6f8fbb19f3c4e4ad62e332beb837de5
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Diffstat (limited to 'src/3rdparty')
70 files changed, 0 insertions, 37291 deletions
diff --git a/src/3rdparty/xkbcommon-x11.pri b/src/3rdparty/xkbcommon-x11.pri deleted file mode 100644 index 58e3a63b46..0000000000 --- a/src/3rdparty/xkbcommon-x11.pri +++ /dev/null @@ -1,14 +0,0 @@ -include(xkbcommon.pri) - -# Build xkbcommon-x11 support library, it depends on -lxcb and -lxcb-xkb, linking is done -# in xcb-plugin.pro (linked to system libraries or if Qt was configured with -qt-xcb then -# linked to -lxcb-static). -INCLUDEPATH += $$PWD/xkbcommon/src/x11 - -# Need to rename several files, qmake has problems processing a project when -# sub-directories contain files with an equal names. - -SOURCES += \ - $$PWD/xkbcommon/src/x11/util.c \ - $$PWD/xkbcommon/src/x11/x11-keymap.c \ # renamed: keymap.c -> x11-keymap.c - $$PWD/xkbcommon/src/x11/x11-state.c # renamed: state.c -> x11-state.c diff --git a/src/3rdparty/xkbcommon.pri b/src/3rdparty/xkbcommon.pri deleted file mode 100644 index 63c8e687ec..0000000000 --- a/src/3rdparty/xkbcommon.pri +++ /dev/null @@ -1,60 +0,0 @@ -# Requires GNU C extensions -CONFIG -= strict_c - -INCLUDEPATH += $$PWD/xkbcommon \ - $$PWD/xkbcommon/xkbcommon \ - $$PWD/xkbcommon/src \ - $$PWD/xkbcommon/src/xkbcomp - -include($$shadowed($$PWD/../gui/qtgui-config.pri)) - -# Unused (but needs to be set to something) - we don't use APIs that read xkb -# config files from file system. We use APIs that fetch the necessary keymap -# details directly from X server. -DEFINES += DFLT_XKB_CONFIG_ROOT='\\"/usr/share/X11/xkb\\"' -# Unused (but needs to be set to something) - After QTBUG-42181, this needs to -# be become a configure switch. -DEFINES += XLOCALEDIR='\\"/usr/share/X11/locale/\\"' - -### RMLVO names can be overwritten with environmental variables (see libxkbcommon documentation) -DEFINES += DEFAULT_XKB_RULES='\\"evdev\\"' -DEFINES += DEFAULT_XKB_MODEL='\\"pc105\\"' -DEFINES += DEFAULT_XKB_LAYOUT='\\"us\\"' - -# Need to rename several files, qmake has problems processing a project when -# sub-directories contain files with an equal names. - -SOURCES += \ - $$PWD/xkbcommon/src/keysym-utf.c \ - $$PWD/xkbcommon/src/keymap.c \ - $$PWD/xkbcommon/src/keymap-priv.c \ - $$PWD/xkbcommon/src/utils.c \ - $$PWD/xkbcommon/src/atom.c \ - $$PWD/xkbcommon/src/compose/paths.c \ - $$PWD/xkbcommon/src/compose/parser.c \ - $$PWD/xkbcommon/src/compose/compose-state.c \ # renamed: keymap.c -> compose-state.c - $$PWD/xkbcommon/src/compose/table.c \ - $$PWD/xkbcommon/src/xkbcomp/xkbcomp-keymap.c \ # renamed: keymap.c -> xkbcomp-keymap.c - $$PWD/xkbcommon/src/xkbcomp/xkbcomp.c \ - $$PWD/xkbcommon/src/xkbcomp/keymap-dump.c \ - $$PWD/xkbcommon/src/xkbcomp/rules.c \ - $$PWD/xkbcommon/src/xkbcomp/expr.c \ - $$PWD/xkbcommon/src/xkbcomp/action.c \ - $$PWD/xkbcommon/src/xkbcomp/compat.c \ - $$PWD/xkbcommon/src/xkbcomp/types.c \ - $$PWD/xkbcommon/src/xkbcomp/scanner.c \ - $$PWD/xkbcommon/src/xkbcomp/xkbcomp-parser.c \ # renamed: parser.c -> xkbcomp-parser.c - $$PWD/xkbcommon/src/xkbcomp/ast-build.c \ - $$PWD/xkbcommon/src/xkbcomp/keywords.c \ - $$PWD/xkbcommon/src/xkbcomp/keycodes.c \ - $$PWD/xkbcommon/src/xkbcomp/vmod.c \ - $$PWD/xkbcommon/src/xkbcomp/include.c \ - $$PWD/xkbcommon/src/xkbcomp/symbols.c \ - $$PWD/xkbcommon/src/context-priv.c \ - $$PWD/xkbcommon/src/text.c \ - $$PWD/xkbcommon/src/context.c \ - $$PWD/xkbcommon/src/keysym.c \ - $$PWD/xkbcommon/src/utf8.c \ - $$PWD/xkbcommon/src/state.c - -TR_EXCLUDE += $$PWD/* diff --git a/src/3rdparty/xkbcommon/LICENSE b/src/3rdparty/xkbcommon/LICENSE deleted file mode 100644 index 3dcd0391fc..0000000000 --- a/src/3rdparty/xkbcommon/LICENSE +++ /dev/null @@ -1,215 +0,0 @@ -The following is a list of all copyright notices and license statements which -appear in the xkbcommon source tree. - -If making new contributions, the first form (i.e. Daniel Stone, Ran Benita, -etc) is vastly preferred. - -All licenses are derivative of the MIT/X11 license, mostly identical other -than no-endorsement clauses (e.g. paragraph 4 of The Open Group's license). - -These statements are split into two sections: one for the code compiled and -distributed as part of the libxkbcommon shared library and the code -component of all tests (i.e. everything under src/ and xkbcommon/, plus the -.c and .h files under test/), and another for the test data under test/data, -which is distributed with the xkbcommon source tarball, but not installed to -the system. - - -BEGINNING OF SOFTWARE COPYRIGHT/LICENSE STATEMENTS: - - -------------------------------------------------------------------------------- - -Copyright © 2009-2012, 2016 Daniel Stone -Copyright © 2012 Ran Benita <ran234@gmail.com> -Copyright © 2010, 2012 Intel Corporation -Copyright © 2008, 2009 Dan Nicholson -Copyright © 2010 Francisco Jerez <currojerez@riseup.net> - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next -paragraph) shall be included in all copies or substantial portions of the -Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -------------------------------------------------------------------------------- - - -Copyright 1985, 1987, 1988, 1990, 1998 The Open Group - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the names of the authors or their -institutions shall not be used in advertising or otherwise to promote the -sale, use or other dealings in this Software without prior written -authorization from the authors. - - -------------------------------------------------------------------------------- - - -Copyright (c) 1993, 1994, 1995, 1996 by Silicon Graphics Computer Systems, Inc. - -Permission to use, copy, modify, and distribute this -software and its documentation for any purpose and without -fee is hereby granted, provided that the above copyright -notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting -documentation, and that the name of Silicon Graphics not be -used in advertising or publicity pertaining to distribution -of the software without specific prior written permission. -Silicon Graphics makes no representation about the suitability -of this software for any purpose. It is provided "as is" -without any express or implied warranty. - -SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON -GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH -THE USE OR PERFORMANCE OF THIS SOFTWARE. - - -------------------------------------------------------------------------------- - - -Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Digital not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - - -------------------------------------------------------------------------------- - - -Copyright (C) 2011 Joseph Adams <joeyadams3.14159@gmail.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -------------------------------------------------------------------------------- - - - -END OF SOFTWARE COPYRIGHT/LICENSE STATEMENTS - - -BEGINNING OF LICENSE STATEMENTS FOR UNDISTRIBUTED DATA FILES IN test/data, -derived from xkeyboard-config: - - - -------------------------------------------------------------------------------- - -Copyright 1996 by Joseph Moss -Copyright (C) 2002-2007 Free Software Foundation, Inc. -Copyright (C) Dmitry Golubev <lastguru@mail.ru>, 2003-2004 -Copyright (C) 2004, Gregory Mokhin <mokhin@bog.msu.ru> -Copyright (C) 2006 Erdal Ronahî - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation, and that the name of the copyright holder(s) not be used in -advertising or publicity pertaining to distribution of the software without -specific, written prior permission. The copyright holder(s) makes no -representations about the suitability of this software for any purpose. It -is provided "as is" without express or implied warranty. - -THE COPYRIGHT HOLDER(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO -EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - -------------------------------------------------------------------------------- - - Copyright 1992 by Oki Technosystems Laboratory, Inc. - Copyright 1992 by Fuji Xerox Co., Ltd. - -Permission to use, copy, modify, distribute, and sell this software -and its documentation for any purpose is hereby granted without fee, -provided that the above copyright notice appear in all copies and -that both that copyright notice and this permission notice appear -in supporting documentation, and that the name of Oki Technosystems -Laboratory and Fuji Xerox not be used in advertising or publicity -pertaining to distribution of the software without specific, written -prior permission. -Oki Technosystems Laboratory and Fuji Xerox make no representations -about the suitability of this software for any purpose. It is provided -"as is" without express or implied warranty. - -OKI TECHNOSYSTEMS LABORATORY AND FUJI XEROX DISCLAIM ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL OKI TECHNOSYSTEMS -LABORATORY AND FUJI XEROX BE LIABLE FOR ANY SPECIAL, INDIRECT OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE -OR PERFORMANCE OF THIS SOFTWARE. diff --git a/src/3rdparty/xkbcommon/NEWS b/src/3rdparty/xkbcommon/NEWS deleted file mode 100644 index 50b01a3b5f..0000000000 --- a/src/3rdparty/xkbcommon/NEWS +++ /dev/null @@ -1,404 +0,0 @@ -libxkbcommon 0.8.2 - 2018-08-05 -================== - -- Fix various problems found with fuzzing (see commit messages for - more details): - - - Fix a few NULL-dereferences, out-of-bounds access and undefined behavior - in the XKB text format parser. - - -libxkbcommon 0.8.1 - 2018-08-03 -================== - -- Fix various problems found in the meson build (see commit messages for more - details): - - - Fix compilation on Darwin. - - - Fix compilation of the x11 tests and demos when XCB is installed in a - non-standard location. - - - Fix xkbcommon-x11.pc missing the Requires specification. - -- Fix various problems found with fuzzing and Coverity (see commit messages for - more details): - - - Fix stack overflow in the XKB text format parser when evaluating boolean - negation. - - - Fix NULL-dereferences in the XKB text format parser when some unsupported - tokens appear (the tokens are still parsed for backward compatibility). - - - Fix NULL-dereference in the XKB text format parser when parsing an - xkb_geometry section. - - - Fix an infinite loop in the Compose text format parser on some inputs. - - - Fix an invalid free() when using multiple keysyms. - -- Replace the Unicode characters for the leftanglebracket and rightanglebracket - keysyms from the deprecated LEFT/RIGHT-POINTING ANGLE BRACKET to - MATHEMATICAL LEFT/RIGHT ANGLE BRACKET. - -- Reject out-of-range Unicode codepoints in xkb_keysym_to_utf8 and - xkb_keysym_to_utf32. - - -libxkbcommon 0.8.0 - 2017-12-15 -================== - -- Added xkb_keysym_to_{upper,lower} to perform case-conversion directly on - keysyms. This is useful in some odd cases, but working with the Unicode - representations should be preferred when possible. - -- Added Unicode conversion rules for the signifblank and permille keysyms. - -- Fixed a bug in the parsing of XKB key type definitions where the number - of levels were determined by the number of level *names*. Keymaps which - omit level names were hence miscompiled. - - This regressed in version 0.4.3. Keymaps from xkeyboard-config were not - affected since they don't omit level names. - -- New API: - xkb_keysym_to_upper() - xkb_keysym_to_lower() - - -libxkbcommon 0.7.2 - 2017-08-04 -================== - -- Added a Meson build system as an alternative to existing autotools build - system. - - The intent is to remove the autotools build in one of the next releases. - Please try to convert to it and report any problems. - - See http://mesonbuild.com/Quick-guide.html for basic usage, the - meson_options.txt for the project-specific configuration options, - and the PACKAGING file for more details. - - There are some noteworthy differences compared to the autotools build: - - - Feature auto-detection is not performed. By default, all features are - enabled (currently: docs, x11, wayland). The build fails if any of - the required dependencies are not available. To disable a feature, - pass -Denable-<feature>=false to meson. - - - The libraries are either installed as shared or static, as specified - by the -Ddefault_library=shared/static option. With autotools, both - versions are installed by default. - - - xorg-util-macros is not used. - - - A parser generator (bison/byacc) is always required - there is no - fallback to pre-generated output bundled in the tarball, as there is - in autotools. - -- Removed Android.mk support. - -- Removed the *-uninstalled.pc pkgconfig files. - -- Ported the interactive-wayland demo program to v6 of the xdg-shell - protocol. - -- Added new keysym definitions from xproto. - -- New API: - XKB_KEY_XF86Keyboard - XKB_KEY_XF86WWAN - XKB_KEY_XF86RFKill - XKB_KEY_XF86AudioPreset - - -libxkbcommon 0.7.1 - 2017-01-18 -================== - -- Fixed various reported problems when the current locale is tr_TR.UTF-8. - - The function xkb_keysym_from_name() used to perform case-insensitive - string comparisons in a locale-dependent way, but required it to to - work as in the C/ASCII locale (the so called "Turkish i problem"). - - The function is now no longer affected by the current locale. - -- Fixed compilation in NetBSD. - - -libxkbcommon 0.7.0 - 2016-11-11 -================== - -- Added support for different "modes" of calculating consumed modifiers. - The existing mode, based on the XKB standard, has proven to be - unintuitive in various shortcut implementations. - - A new mode, based on the calculation used by the GTK toolkit, is added. - This mode is less eager to declare a modifier as consumed. - -- Added a new interactive demo program using the Wayland protocol. - See the PACKAGING file for the new (optional) test dependencies. - -- Fixed a compilation error on GNU Hurd. - -- New API: - enum xkb_consumed_mode - XKB_CONSUMED_MODE_XKB - XKB_CONSUMED_MODE_GTK - xkb_state_key_get_consumed_mods2 - xkb_state_mod_index_is_consumed2 - - -libxkbcommon 0.6.1 - 2016-04-08 -================== - -- Added LICENSE to distributed files in tarball releases. - -- Minor typo fix in xkb_keymap_get_as_string() documentation. - - -libxkbcommon 0.6.0 - 2016-03-16 -================== - -- If the XKB_CONFIG_ROOT environment variable is set, it is used as the XKB - configuration root instead of the path determined at build time. - -- Tests and benchmarks now build correctly on OSX. - -- An XKB keymap provides a name for each key it defines. Traditionally, - these names are limited to at most 4 characters, and are thus somewhat - obscure, but might still be useful (xkbcommon lifts the 4 character limit). - - The new functions xkb_keymap_key_get_name() and xkb_keymap_key_by_name() - can be used to get the name of a key or find a key by name. Note that - a key may have aliases. - -- Documentation improvements. - -- New API: - xkb_keymap_key_by_name() - xkb_keymap_key_get_name() - - -libxkbcommon 0.5.0 - 2014-10-18 -================== - -- Added support for Compose/dead keys in a new module (included in - libxkbcommon). See the documentation or the - xkbcommon/xkbcommon-compose.h header file for more details. - -- Improved and reordered some sections of the documentation. - -- The doxygen HTML pages were made nicer to read. - -- Most tests now run also on non-linux platforms. - -- A warning is emitted by default about RMLVO values which are not used - during keymap compilation, which are most often a user misconfiguration. - For example, "terminate:ctrl_alt_backspace" instead of - "terminate:ctrl_alt_bksp". - -- Added symbol versioning for libxkbcommon and libxkbcommon-x11. - Note: binaries compiled against this and future versions will not be - able to link against the previous versions of the library. - -- Removed several compatablity symbols from the binary (the API isn't - affected). This affects binaries which - - 1. Were compiled against a pre-stable (<0.2.0) version of libxkbcommon, and - 2. Are linked against the this or later version of libxkbcommon. - - Such a scenario is likely to fail already. - -- If Xvfb is not available, the x11comp test is now correctly skipped - instead of hanging. - -- Benchmarks were moved to a separate bench/ directory. - -- Build fixes from OpenBSD. - -- Fixed a bug where key type entries such as "map[None] = Level2;" were - ignored. - -- New API: - XKB_COMPOSE_* - xkb_compose_* - - -libxkbcommon 0.4.3 - 2014-08-19 -================== - -- Fixed a bug which caused xkb_x11_keymap_new_from_device() to misrepresent - modifiers for some keymaps. - - https://github.com/xkbcommon/libxkbcommon/issues/9 - -- Fixed a bug which caused xkb_x11_keymap_new_from_device() to ignore XKB - PrivateAction's. - -- Modifiers are now always fully resolved after xkb_state_update_mask(). - Previously the given state components were used as-is, without - considering virtual modifier mappings. - Note: this only affects non-standard uses of xkb_state_update_mask(). - -- Added a test for xkbcommon-x11, "x11comp". The test uses the system's - Xvfb server and xkbcomp. If they do not exist or fail, the test is - skipped. - -- Fixed memory leaks after parse errors in the XKB yacc parser. - The fix required changes which are currently incompatible with byacc. - - -libxkbcommon 0.4.2 - 2014-05-15 -================== - -- Fixed a bug where explicitly passing "--enable-x11" to ./configure would - in fact disable it (regressed in 0.4.1). - -- Added @since version annotations to the API documentation for everything - introduced after the initial stable release (0.2.0). - -- Added a section to the documentation about keysym transformations, and - clarified which functions perform a given transformation. - -- XKB files which fail to compile during keymap construction can no longer - have any effect on the resulting keymap: changes are only applied when - the entire compilation succeeds. - Note: this was a minor correctness issue inherited from xkbcomp. - -- Fix an out-of-bounds array access in src/x11/util.c:adopt_atoms() - error-handling code. - Note: it seems impossible to trigger in the current code since the input - size cannot exceed the required size. - - -libxkbcommon 0.4.1 - 2014-03-27 -================== - -- Converted README to markdown and added a Quick Guide to the - documentation, which breezes through the most common parts of - xkbcommon. - -- Added two new functions, xkb_state_key_get_utf{8,32}(). They - combine the operations of xkb_state_key_get_syms() and - xkb_keysym_to_utf{8,32}(), and provide a nicer interface for it - (espcially for multiple-keysyms-per-level). - -- The xkb_state_key_get_utf{8,32}() functions now apply Control - transformation: when the Control modifier is active, the string - is converted to an appropriate control character. - This matches the behavior of libX11's XLookupString(3), and - required by the XKB specification: - https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Control_Modifier - - https://bugs.freedesktop.org/show_bug.cgi?id=75892 - -- The consumed modifiers for a key are now calculated similarly - to libX11. The previous behavior caused a bug where Shift would - not cancel an active Caps Lock. - -- Make xkbcommon-x11 work with the keymap reported by the XQuartz - X server. - - https://bugs.freedesktop.org/show_bug.cgi?id=75798 - -- Reduce memory usage during keymap compilation some more. - -- New API: - xkb_state_key_get_consumed_mods() - xkb_state_key_get_utf8() - xkb_state_key_get_utf32() - -- Deprecated API: - XKB_MAP_COMPILE_PLACEHOLDER, XKB_MAP_NO_FLAGS - use XKB_KEYMAP_NO_FLAGS instead. - -- Bug fixes. - - -libxkbcommon 0.4.0 - 2014-02-02 -================== - -- Add a new add-on library, xkbcommon-x11, to support creating keymaps - with the XKB X11 protocol, by querying the X server directly. - See the xkbcommon/xkbcommon-x11.h header file for more details. - This library requires libxcb-xkb >= 1.10, and is enabled by default. - It can be disabled with the --disable-x11 configure switch. - Distributions are encouraged to split the necessary files for this - library (libxkbcommon-x11.so, xkbcommon-x11.pc, xkbcommon/xkbcommon-x11.h) - to a separate package, such that the main package does not depend on - X11 libraries. - -- Fix the keysym <-> name lookup table to not require huge amounts of - relocations. - -- Fix a bug in the keysym <-> name lookup, whereby lookup might fail in - some rare cases. - -- Reduce memory usage during keymap compilation. - -- New API: - New keysyms from xproto 7.0.25 (German T3 layout keysyms). - XKB_MOD_NAME_NUM for the usual NumLock modifier. - xkb_x11_* types and functions, XKB_X11_* constants. - - -libxkbcommon 0.3.2 - 2013-11-22 -================== - -- Log messages from the library now look like "xkbcommon: ERROR" by - default, instead of xkbcomp-like "Error: ". - -- Apply capitalization transformation on keysyms in - xkb_keysym_get_one_sym(), to match the behavior specified in the XKB - specification: - https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Lock_Modifier - -- Support byacc for generating the parser, in addition to Bison. - -- New API: - XKB_KEY_XF86AudioMicMute keysym from xproto 7.0.24. - XKB_KEYSYM_NO_FLAGS - XKB_CONTEXT_NO_FLAGS - XKB_MAP_COMPILE_NO_FLAGS - -- Bug fixes. - - -libxkbcommon 0.3.1 - 2013-06-03 -================== - -- Replace the flex scanner with a hand-written one. flex is no longer - a build requirement. - -- New API: - xkb_keymap_min_keycode() - xkb_keymap_max_keycode() - xkb_keymap_key_for_each() - - -libxkbcommon 0.3.0 - 2013-04-01 -================== - -- Allow passing NULL to *_unref() functions; do nothing instead of - crashing. - -- The functions xkb_keymap_num_levels_for_key() and - xkb_keymap_get_syms_by_level() now allow out-of-range values for the - 'layout' parameter. The functions now wrap the value around the number - of layouts instead of failing. - -- The function xkb_keysym_get_name() now types unicode keysyms in - uppercase and 0-padding, to match the format used by XKeysymToString(). - -- Building Linux-specific tests is no longer attempted on non-Linux - environments. - -- The function xkb_keymap_new_from_names() now accepts a NULL value for - the 'names' parameter, instead of failing. This is equivalent to passing - a 'struct xkb_rule_names' with all fields set to NULL. - -- New API: - xkb_keymap_new_from_buffer() - -- Bug fixes. diff --git a/src/3rdparty/xkbcommon/README.md b/src/3rdparty/xkbcommon/README.md deleted file mode 100644 index b8ae50de77..0000000000 --- a/src/3rdparty/xkbcommon/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# libxkbcommon - -libxkbcommon is a keyboard keymap compiler and support library which -processes a reduced subset of keymaps as defined by the XKB (X Keyboard -Extension) specification. It also contains a module for handling Compose -and dead keys. - -## Quick Guide - -See [Quick Guide](doc/quick-guide.md). - -## Building - -libxkbcommon is built with [Meson](http://mesonbuild.com/): - - meson setup build - ninja -C build - -To build for use with Wayland, you can disable X11 support while still -using the X11 keyboard configuration resource files thusly: - - meson setup build \ - -Denable-x11=false \ - -Dxkb-config-root=/usr/share/X11/xkb \ - -Dx-locale-root=/usr/share/X11/locale - ninja -C build - -## API - -While libxkbcommon's API is somewhat derived from the classic XKB API as found -in X11/extensions/XKB.h and friends, it has been substantially reworked to -expose fewer internal details to clients. - -See the [API Documentation](https://xkbcommon.org/doc/current/modules.html). - -## Dataset - -libxkbcommon does not distribute a keymap dataset itself, other than for -testing purposes. The most common dataset is xkeyboard-config, which is used -by all current distributions for their X11 XKB data. More information on -xkeyboard-config is available here: - https://www.freedesktop.org/wiki/Software/XKeyboardConfig - -The dataset for Compose is distributed in libX11, as part of the X locale -data. - -## Relation to X11 - -See [Compatibility](doc/compat.md) notes. - -## Development - -An extremely rudimentary homepage can be found at - https://xkbcommon.org - -xkbcommon is maintained in git at - https://github.com/xkbcommon/libxkbcommon - -Patches are always welcome, and may be sent to either - <xorg-devel@lists.x.org> or <wayland-devel@lists.freedesktop.org> -or through github. - -Bug reports are also welcome, and may be filed either at - Bugzilla https://bugs.freedesktop.org/describecomponents.cgi?product=libxkbcommon -or - Github https://github.com/xkbcommon/libxkbcommon/issues - -The maintainers are -- Daniel Stone <daniel@fooishbar.org> -- Ran Benita <ran234@gmail.com> - -## Credits - -Many thanks are due to Dan Nicholson for his heroic work in getting xkbcommon -off the ground initially. diff --git a/src/3rdparty/xkbcommon/qt_attribution.json b/src/3rdparty/xkbcommon/qt_attribution.json deleted file mode 100644 index 215a4513f3..0000000000 --- a/src/3rdparty/xkbcommon/qt_attribution.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "Id": "xkbcommon", - "Name": "xkbcommon", - "QDocModule": "qtgui", - "QtUsage": "Used in xcb platform plugin. Configure with -system-xkbcommon-x11 to avoid.", - - "Description": "xkbcommon is a keymap compiler and support library which processes a reduced subset of keymaps as defined by the XKB specification.", - "Homepage": "http://xkbcommon.org/", - "Version": "0.8.2 + subsequent commits up to 31f1f355700870c6615399fbfa7934934b3a9a57", - "License": "MIT Licenses (with no-advertisement clause)", - "LicenseId": "MIT", - "LicenseFile": "LICENSE", - "Copyright": "Copyright 2009-2012, 2016 Daniel Stone -Copyright 2012 Ran Benita <ran234@gmail.com> -Copyright 2010, 2012 Intel Corporation -Copyright 2008, 2009 Dan Nicholson -Copyright 2010 Francisco Jerez <currojerez@riseup.net> -Copyright 1985, 1987, 1988, 1990, 1998 The Open Group -Copyright 1993, 1994, 1995, 1996 by Silicon Graphics Computer Systems, Inc. -Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. -Copyright 2011 Joseph Adams <joeyadams3.14159@gmail.com> -Copyright 1996 by Joseph Moss -Copyright 2002-2007 Free Software Foundation, Inc. -Copyright 2003-2004 Dmitry Golubev <lastguru@mail.ru> -Copyright 2004, Gregory Mokhin <mokhin@bog.msu.ru> -Copyright 2006 Erdal Ronahî -Copyright 1992 by Oki Technosystems Laboratory, Inc. -Copyright 1992 by Fuji Xerox Co., Ltd." -} diff --git a/src/3rdparty/xkbcommon/src/atom.c b/src/3rdparty/xkbcommon/src/atom.c deleted file mode 100644 index 044f56681a..0000000000 --- a/src/3rdparty/xkbcommon/src/atom.c +++ /dev/null @@ -1,225 +0,0 @@ -/*********************************************************** - * Copyright 1987, 1998 The Open Group - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Except as contained in this notice, the name of The Open Group shall not be - * used in advertising or otherwise to promote the sale, use or other dealings - * in this Software without prior written authorization from The Open Group. - * - * - * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. - * - * All Rights Reserved - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * provided that the above copyright notice appear in all copies and that - * both that copyright notice and this permission notice appear in - * supporting documentation, and that the name of Digital not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING - * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL - * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR - * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, - * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - ******************************************************************/ - -/************************************************************ - * Copyright 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#include "utils.h" -#include "atom.h" - -struct atom_node { - xkb_atom_t left, right; - xkb_atom_t atom; - unsigned int fingerprint; - char *string; -}; - -struct atom_table { - xkb_atom_t root; - darray(struct atom_node) table; -}; - -struct atom_table * -atom_table_new(void) -{ - struct atom_table *table; - - table = calloc(1, sizeof(*table)); - if (!table) - return NULL; - - darray_init(table->table); - /* The original throw-away root is here, at the illegal atom 0. */ - darray_resize0(table->table, 1); - - return table; -} - -void -atom_table_free(struct atom_table *table) -{ - struct atom_node *node; - - if (!table) - return; - - darray_foreach(node, table->table) - free(node->string); - darray_free(table->table); - free(table); -} - -const char * -atom_text(struct atom_table *table, xkb_atom_t atom) -{ - if (atom == XKB_ATOM_NONE || atom >= darray_size(table->table)) - return NULL; - - return darray_item(table->table, atom).string; -} - -static bool -find_atom_pointer(struct atom_table *table, const char *string, size_t len, - xkb_atom_t **atomp_out, unsigned int *fingerprint_out) -{ - xkb_atom_t *atomp = &table->root; - unsigned int fingerprint = 0; - bool found = false; - - for (size_t i = 0; i < (len + 1) / 2; i++) { - fingerprint = fingerprint * 27 + string[i]; - fingerprint = fingerprint * 27 + string[len - 1 - i]; - } - - while (*atomp != XKB_ATOM_NONE) { - struct atom_node *node = &darray_item(table->table, *atomp); - - if (fingerprint < node->fingerprint) { - atomp = &node->left; - } - else if (fingerprint > node->fingerprint) { - atomp = &node->right; - } - else { - /* Now start testing the strings. */ - const int cmp = strncmp(string, node->string, len); - if (cmp < 0 || (cmp == 0 && len < strlen(node->string))) { - atomp = &node->left; - } - else if (cmp > 0) { - atomp = &node->right; - } - else { - found = true; - break; - } - } - } - - if (fingerprint_out) - *fingerprint_out = fingerprint; - if (atomp_out) - *atomp_out = atomp; - return found; -} - -xkb_atom_t -atom_lookup(struct atom_table *table, const char *string, size_t len) -{ - xkb_atom_t *atomp; - - if (!string) - return XKB_ATOM_NONE; - - if (!find_atom_pointer(table, string, len, &atomp, NULL)) - return XKB_ATOM_NONE; - - return *atomp; -} - -/* - * If steal is true, we do not strdup @string; therefore it must be - * dynamically allocated, NUL-terminated, not be free'd by the caller - * and not be used afterwards. Use to avoid some redundant allocations. - */ -xkb_atom_t -atom_intern(struct atom_table *table, const char *string, size_t len, - bool steal) -{ - xkb_atom_t *atomp; - struct atom_node node; - unsigned int fingerprint; - - if (!string) - return XKB_ATOM_NONE; - - if (find_atom_pointer(table, string, len, &atomp, &fingerprint)) { - if (steal) - free(UNCONSTIFY(string)); - return *atomp; - } - - if (steal) { - node.string = UNCONSTIFY(string); - } - else { - node.string = strndup(string, len); - if (!node.string) - return XKB_ATOM_NONE; - } - - node.left = node.right = XKB_ATOM_NONE; - node.fingerprint = fingerprint; - node.atom = darray_size(table->table); - /* Do this before the append, as it may realloc and change the offsets. */ - *atomp = node.atom; - darray_append(table->table, node); - - return node.atom; -} diff --git a/src/3rdparty/xkbcommon/src/atom.h b/src/3rdparty/xkbcommon/src/atom.h deleted file mode 100644 index 1bf8e49b8e..0000000000 --- a/src/3rdparty/xkbcommon/src/atom.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright © 2009 Dan Nicholson - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef ATOM_H -#define ATOM_H - -typedef uint32_t xkb_atom_t; - -#define XKB_ATOM_NONE 0 - -struct atom_table; - -struct atom_table * -atom_table_new(void); - -void -atom_table_free(struct atom_table *table); - -xkb_atom_t -atom_lookup(struct atom_table *table, const char *string, size_t len); - -xkb_atom_t -atom_intern(struct atom_table *table, const char *string, size_t len, - bool steal); - -const char * -atom_text(struct atom_table *table, xkb_atom_t atom); - -#endif /* ATOM_H */ diff --git a/src/3rdparty/xkbcommon/src/compose/compose-state.c b/src/3rdparty/xkbcommon/src/compose/compose-state.c deleted file mode 100644 index 8657ff7e17..0000000000 --- a/src/3rdparty/xkbcommon/src/compose/compose-state.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright © 2013 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "table.h" -#include "utils.h" -#include "keysym.h" - -struct xkb_compose_state { - int refcnt; - enum xkb_compose_state_flags flags; - struct xkb_compose_table *table; - - /* - * Offsets into xkb_compose_table::nodes. - * - * They maintain the current and previous position in the trie; see - * xkb_compose_state_feed(). - * - * This is also sufficient for inferring the current status; see - * xkb_compose_state_get_status(). - */ - uint32_t prev_context; - uint32_t context; -}; - -XKB_EXPORT struct xkb_compose_state * -xkb_compose_state_new(struct xkb_compose_table *table, - enum xkb_compose_state_flags flags) -{ - struct xkb_compose_state *state; - - state = calloc(1, sizeof(*state)); - if (!state) - return NULL; - - state->refcnt = 1; - state->table = xkb_compose_table_ref(table); - - state->flags = flags; - state->prev_context = 0; - state->context = 0; - - return state; -} - -XKB_EXPORT struct xkb_compose_state * -xkb_compose_state_ref(struct xkb_compose_state *state) -{ - state->refcnt++; - return state; -} - -XKB_EXPORT void -xkb_compose_state_unref(struct xkb_compose_state *state) -{ - if (!state || --state->refcnt > 0) - return; - - xkb_compose_table_unref(state->table); - free(state); -} - -XKB_EXPORT struct xkb_compose_table * -xkb_compose_state_get_compose_table(struct xkb_compose_state *state) -{ - return state->table; -} - -XKB_EXPORT enum xkb_compose_feed_result -xkb_compose_state_feed(struct xkb_compose_state *state, xkb_keysym_t keysym) -{ - uint32_t context; - const struct compose_node *node; - - /* - * Modifiers do not affect the sequence directly. In particular, - * they do not cancel a sequence; otherwise it'd be impossible to - * have a sequence like <dead_acute><A> (needs Shift in the middle). - * - * The following test is not really accurate - in order to test if - * a key is "modifier key", we really need the keymap, but we don't - * have it here. However, this is (approximately) what libX11 does - * as well. - */ - if (xkb_keysym_is_modifier(keysym)) - return XKB_COMPOSE_FEED_IGNORED; - - node = &darray_item(state->table->nodes, state->context); - - context = (node->is_leaf ? 0 : node->u.successor); - node = &darray_item(state->table->nodes, context); - - while (node->keysym != keysym && node->next != 0) { - context = node->next; - node = &darray_item(state->table->nodes, context); - } - - if (node->keysym != keysym) - context = 0; - - state->prev_context = state->context; - state->context = context; - return XKB_COMPOSE_FEED_ACCEPTED; -} - -XKB_EXPORT void -xkb_compose_state_reset(struct xkb_compose_state *state) -{ - state->prev_context = 0; - state->context = 0; -} - -XKB_EXPORT enum xkb_compose_status -xkb_compose_state_get_status(struct xkb_compose_state *state) -{ - const struct compose_node *prev_node, *node; - - prev_node = &darray_item(state->table->nodes, state->prev_context); - node = &darray_item(state->table->nodes, state->context); - - if (state->context == 0 && !prev_node->is_leaf) - return XKB_COMPOSE_CANCELLED; - - if (state->context == 0) - return XKB_COMPOSE_NOTHING; - - if (!node->is_leaf) - return XKB_COMPOSE_COMPOSING; - - return XKB_COMPOSE_COMPOSED; -} - -XKB_EXPORT int -xkb_compose_state_get_utf8(struct xkb_compose_state *state, - char *buffer, size_t size) -{ - const struct compose_node *node = - &darray_item(state->table->nodes, state->context); - - if (!node->is_leaf) - goto fail; - - /* If there's no string specified, but only a keysym, try to do the - * most helpful thing. */ - if (node->u.leaf.utf8 == 0 && node->u.leaf.keysym != XKB_KEY_NoSymbol) { - char name[64]; - int ret; - - ret = xkb_keysym_to_utf8(node->u.leaf.keysym, name, sizeof(name)); - if (ret < 0 || ret == 0) { - /* ret < 0 is impossible. - * ret == 0 means the keysym has no string representation. */ - goto fail; - } - - return snprintf(buffer, size, "%s", name); - } - - return snprintf(buffer, size, "%s", - &darray_item(state->table->utf8, node->u.leaf.utf8)); - -fail: - if (size > 0) - buffer[0] = '\0'; - return 0; -} - -XKB_EXPORT xkb_keysym_t -xkb_compose_state_get_one_sym(struct xkb_compose_state *state) -{ - const struct compose_node *node = - &darray_item(state->table->nodes, state->context); - if (!node->is_leaf) - return XKB_KEY_NoSymbol; - return node->u.leaf.keysym; -} diff --git a/src/3rdparty/xkbcommon/src/compose/parser.c b/src/3rdparty/xkbcommon/src/compose/parser.c deleted file mode 100644 index 439d404f06..0000000000 --- a/src/3rdparty/xkbcommon/src/compose/parser.c +++ /dev/null @@ -1,737 +0,0 @@ -/* - * Copyright © 2013 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/****************************************************************** - - Copyright 1992 by Oki Technosystems Laboratory, Inc. - Copyright 1992 by Fuji Xerox Co., Ltd. - -Permission to use, copy, modify, distribute, and sell this software -and its documentation for any purpose is hereby granted without fee, -provided that the above copyright notice appear in all copies and -that both that copyright notice and this permission notice appear -in supporting documentation, and that the name of Oki Technosystems -Laboratory and Fuji Xerox not be used in advertising or publicity -pertaining to distribution of the software without specific, written -prior permission. -Oki Technosystems Laboratory and Fuji Xerox make no representations -about the suitability of this software for any purpose. It is provided -"as is" without express or implied warranty. - -OKI TECHNOSYSTEMS LABORATORY AND FUJI XEROX DISCLAIM ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL OKI TECHNOSYSTEMS -LABORATORY AND FUJI XEROX BE LIABLE FOR ANY SPECIAL, INDIRECT OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE -OR PERFORMANCE OF THIS SOFTWARE. - - Author: Yasuhiro Kawai Oki Technosystems Laboratory - Author: Kazunori Nishihara Fuji Xerox - -******************************************************************/ - -#include <errno.h> - -#include "utils.h" -#include "scanner-utils.h" -#include "table.h" -#include "paths.h" -#include "utf8.h" -#include "parser.h" - -#define MAX_LHS_LEN 10 -#define MAX_INCLUDE_DEPTH 5 - -/* - * Grammar adapted from libX11/modules/im/ximcp/imLcPrs.c. - * See also the XCompose(5) manpage. - * - * FILE ::= { [PRODUCTION] [COMMENT] "\n" | INCLUDE } - * INCLUDE ::= "include" '"' INCLUDE_STRING '"' - * PRODUCTION ::= LHS ":" RHS [ COMMENT ] - * COMMENT ::= "#" {<any character except null or newline>} - * LHS ::= EVENT { EVENT } - * EVENT ::= [MODIFIER_LIST] "<" keysym ">" - * MODIFIER_LIST ::= (["!"] {MODIFIER} ) | "None" - * MODIFIER ::= ["~"] MODIFIER_NAME - * MODIFIER_NAME ::= ("Ctrl"|"Lock"|"Caps"|"Shift"|"Alt"|"Meta") - * RHS ::= ( STRING | keysym | STRING keysym ) - * STRING ::= '"' { CHAR } '"' - * CHAR ::= GRAPHIC_CHAR | ESCAPED_CHAR - * GRAPHIC_CHAR ::= locale (codeset) dependent code - * ESCAPED_CHAR ::= ('\\' | '\"' | OCTAL | HEX ) - * OCTAL ::= '\' OCTAL_CHAR [OCTAL_CHAR [OCTAL_CHAR]] - * OCTAL_CHAR ::= (0|1|2|3|4|5|6|7) - * HEX ::= '\' (x|X) HEX_CHAR [HEX_CHAR]] - * HEX_CHAR ::= (0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|a|b|c|d|e|f) - * - * INCLUDE_STRING is a filesystem path, with the following %-expansions: - * %% - '%'. - * %H - The user's home directory (the $HOME environment variable). - * %L - The name of the locale specific Compose file (e.g., - * "/usr/share/X11/locale/<localename>/Compose"). - * %S - The name of the system directory for Compose files (e.g., - * "/usr/share/X11/locale"). - */ - -enum rules_token { - TOK_END_OF_FILE = 0, - TOK_END_OF_LINE, - TOK_INCLUDE, - TOK_INCLUDE_STRING, - TOK_LHS_KEYSYM, - TOK_COLON, - TOK_BANG, - TOK_TILDE, - TOK_STRING, - TOK_IDENT, - TOK_ERROR -}; - -/* Values returned with some tokens, like yylval. */ -union lvalue { - struct { - /* Still \0-terminated. */ - const char *str; - size_t len; - } string; -}; - -static enum rules_token -lex(struct scanner *s, union lvalue *val) -{ -skip_more_whitespace_and_comments: - /* Skip spaces. */ - while (is_space(peek(s))) - if (next(s) == '\n') - return TOK_END_OF_LINE; - - /* Skip comments. */ - if (chr(s, '#')) { - skip_to_eol(s); - goto skip_more_whitespace_and_comments; - } - - /* See if we're done. */ - if (eof(s)) return TOK_END_OF_FILE; - - /* New token. */ - s->token_line = s->line; - s->token_column = s->column; - s->buf_pos = 0; - - /* LHS Keysym. */ - if (chr(s, '<')) { - while (peek(s) != '>' && !eol(s) && !eof(s)) - buf_append(s, next(s)); - if (!chr(s, '>')) { - scanner_err(s, "unterminated keysym literal"); - return TOK_ERROR; - } - if (!buf_append(s, '\0')) { - scanner_err(s, "keysym literal is too long"); - return TOK_ERROR; - } - val->string.str = s->buf; - val->string.len = s->buf_pos; - return TOK_LHS_KEYSYM; - } - - /* Colon. */ - if (chr(s, ':')) - return TOK_COLON; - if (chr(s, '!')) - return TOK_BANG; - if (chr(s, '~')) - return TOK_TILDE; - - /* String literal. */ - if (chr(s, '\"')) { - while (!eof(s) && !eol(s) && peek(s) != '\"') { - if (chr(s, '\\')) { - uint8_t o; - if (chr(s, '\\')) { - buf_append(s, '\\'); - } - else if (chr(s, '"')) { - buf_append(s, '"'); - } - else if (chr(s, 'x') || chr(s, 'X')) { - if (hex(s, &o)) - buf_append(s, (char) o); - else - scanner_warn(s, "illegal hexadecimal escape sequence in string literal"); - } - else if (oct(s, &o)) { - buf_append(s, (char) o); - } - else { - scanner_warn(s, "unknown escape sequence (%c) in string literal", peek(s)); - /* Ignore. */ - } - } else { - buf_append(s, next(s)); - } - } - if (!chr(s, '\"')) { - scanner_err(s, "unterminated string literal"); - return TOK_ERROR; - } - if (!buf_append(s, '\0')) { - scanner_err(s, "string literal is too long"); - return TOK_ERROR; - } - if (!is_valid_utf8(s->buf, s->buf_pos - 1)) { - scanner_err(s, "string literal is not a valid UTF-8 string"); - return TOK_ERROR; - } - val->string.str = s->buf; - val->string.len = s->buf_pos; - return TOK_STRING; - } - - /* Identifier or include. */ - if (is_alpha(peek(s)) || peek(s) == '_') { - s->buf_pos = 0; - while (is_alnum(peek(s)) || peek(s) == '_') - buf_append(s, next(s)); - if (!buf_append(s, '\0')) { - scanner_err(s, "identifier is too long"); - return TOK_ERROR; - } - - if (streq(s->buf, "include")) - return TOK_INCLUDE; - - val->string.str = s->buf; - val->string.len = s->buf_pos; - return TOK_IDENT; - } - - /* Discard rest of line. */ - skip_to_eol(s); - - scanner_err(s, "unrecognized token"); - return TOK_ERROR; -} - -static enum rules_token -lex_include_string(struct scanner *s, struct xkb_compose_table *table, - union lvalue *val_out) -{ - while (is_space(peek(s))) - if (next(s) == '\n') - return TOK_END_OF_LINE; - - s->token_line = s->line; - s->token_column = s->column; - s->buf_pos = 0; - - if (!chr(s, '\"')) { - scanner_err(s, "include statement must be followed by a path"); - return TOK_ERROR; - } - - while (!eof(s) && !eol(s) && peek(s) != '\"') { - if (chr(s, '%')) { - if (chr(s, '%')) { - buf_append(s, '%'); - } - else if (chr(s, 'H')) { - const char *home = secure_getenv("HOME"); - if (!home) { - scanner_err(s, "%%H was used in an include statement, but the HOME environment variable is not set"); - return TOK_ERROR; - } - if (!buf_appends(s, home)) { - scanner_err(s, "include path after expanding %%H is too long"); - return TOK_ERROR; - } - } - else if (chr(s, 'L')) { - char *path = get_locale_compose_file_path(table->locale); - if (!path) { - scanner_err(s, "failed to expand %%L to the locale Compose file"); - return TOK_ERROR; - } - if (!buf_appends(s, path)) { - free(path); - scanner_err(s, "include path after expanding %%L is too long"); - return TOK_ERROR; - } - free(path); - } - else if (chr(s, 'S')) { - const char *xlocaledir = get_xlocaledir_path(); - if (!buf_appends(s, xlocaledir)) { - scanner_err(s, "include path after expanding %%S is too long"); - return TOK_ERROR; - } - } - else { - scanner_err(s, "unknown %% format (%c) in include statement", peek(s)); - return TOK_ERROR; - } - } else { - buf_append(s, next(s)); - } - } - if (!chr(s, '\"')) { - scanner_err(s, "unterminated include statement"); - return TOK_ERROR; - } - if (!buf_append(s, '\0')) { - scanner_err(s, "include path is too long"); - return TOK_ERROR; - } - val_out->string.str = s->buf; - val_out->string.len = s->buf_pos; - return TOK_INCLUDE_STRING; -} - -struct production { - xkb_keysym_t lhs[MAX_LHS_LEN]; - unsigned int len; - xkb_keysym_t keysym; - char string[256]; - /* At least one of these is true. */ - bool has_keysym; - bool has_string; - - /* The matching is as follows: (active_mods & modmask) == mods. */ - xkb_mod_mask_t modmask; - xkb_mod_mask_t mods; -}; - -static uint32_t -add_node(struct xkb_compose_table *table, xkb_keysym_t keysym) -{ - struct compose_node new = { - .keysym = keysym, - .next = 0, - .is_leaf = true, - }; - darray_append(table->nodes, new); - return darray_size(table->nodes) - 1; -} - -static void -add_production(struct xkb_compose_table *table, struct scanner *s, - const struct production *production) -{ - unsigned lhs_pos; - uint32_t curr; - struct compose_node *node; - - curr = 0; - node = &darray_item(table->nodes, curr); - - /* - * Insert the sequence to the trie, creating new nodes as needed. - * - * TODO: This can be sped up a bit by first trying the path that the - * previous production took, and only then doing the linear search - * through the trie levels. This will work because sequences in the - * Compose files are often clustered by a common prefix; especially - * in the 1st and 2nd keysyms, which is where the largest variation - * (thus, longest search) is. - */ - for (lhs_pos = 0; lhs_pos < production->len; lhs_pos++) { - while (production->lhs[lhs_pos] != node->keysym) { - if (node->next == 0) { - uint32_t next = add_node(table, production->lhs[lhs_pos]); - /* Refetch since add_node could have realloc()ed. */ - node = &darray_item(table->nodes, curr); - node->next = next; - } - - curr = node->next; - node = &darray_item(table->nodes, curr); - } - - if (lhs_pos + 1 == production->len) - break; - - if (node->is_leaf) { - if (node->u.leaf.utf8 != 0 || - node->u.leaf.keysym != XKB_KEY_NoSymbol) { - scanner_warn(s, "a sequence already exists which is a prefix of this sequence; overriding"); - node->u.leaf.utf8 = 0; - node->u.leaf.keysym = XKB_KEY_NoSymbol; - } - - { - uint32_t successor = add_node(table, production->lhs[lhs_pos + 1]); - /* Refetch since add_node could have realloc()ed. */ - node = &darray_item(table->nodes, curr); - node->is_leaf = false; - node->u.successor = successor; - } - } - - curr = node->u.successor; - node = &darray_item(table->nodes, curr); - } - - if (!node->is_leaf) { - scanner_warn(s, "this compose sequence is a prefix of another; skipping line"); - return; - } - - if (node->u.leaf.utf8 != 0 || node->u.leaf.keysym != XKB_KEY_NoSymbol) { - bool same_string = - (node->u.leaf.utf8 == 0 && !production->has_string) || - ( - node->u.leaf.utf8 != 0 && production->has_string && - streq(&darray_item(table->utf8, node->u.leaf.utf8), - production->string) - ); - bool same_keysym = - (node->u.leaf.keysym == XKB_KEY_NoSymbol && !production->has_keysym) || - ( - node->u.leaf.keysym != XKB_KEY_NoSymbol && production->has_keysym && - node->u.leaf.keysym == production->keysym - ); - if (same_string && same_keysym) { - scanner_warn(s, "this compose sequence is a duplicate of another; skipping line"); - return; - } - scanner_warn(s, "this compose sequence already exists; overriding"); - } - - if (production->has_string) { - node->u.leaf.utf8 = darray_size(table->utf8); - darray_append_items(table->utf8, production->string, - strlen(production->string) + 1); - } - if (production->has_keysym) { - node->u.leaf.keysym = production->keysym; - } -} - -/* Should match resolve_modifier(). */ -#define ALL_MODS_MASK ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3)) - -static xkb_mod_index_t -resolve_modifier(const char *name) -{ - static const struct { - const char *name; - xkb_mod_index_t mod; - } mods[] = { - { "Shift", 0 }, - { "Ctrl", 2 }, - { "Alt", 3 }, - { "Meta", 3 }, - { "Lock", 1 }, - { "Caps", 1 }, - }; - - for (unsigned i = 0; i < ARRAY_SIZE(mods); i++) - if (streq(name, mods[i].name)) - return mods[i].mod; - - return XKB_MOD_INVALID; -} - -static bool -parse(struct xkb_compose_table *table, struct scanner *s, - unsigned include_depth); - -static bool -do_include(struct xkb_compose_table *table, struct scanner *s, - const char *path, unsigned include_depth) -{ - FILE *file; - bool ok; - char *string; - size_t size; - struct scanner new_s; - - if (include_depth >= MAX_INCLUDE_DEPTH) { - scanner_err(s, "maximum include depth (%d) exceeded; maybe there is an include loop?", - MAX_INCLUDE_DEPTH); - return false; - } - - file = fopen(path, "r"); - if (!file) { - scanner_err(s, "failed to open included Compose file \"%s\": %s", - path, strerror(errno)); - return false; - } - - ok = map_file(file, &string, &size); - if (!ok) { - scanner_err(s, "failed to read included Compose file \"%s\": %s", - path, strerror(errno)); - goto err_file; - } - - scanner_init(&new_s, table->ctx, string, size, path, s->priv); - - ok = parse(table, &new_s, include_depth + 1); - if (!ok) - goto err_unmap; - -err_unmap: - unmap_file(string, size); -err_file: - fclose(file); - return ok; -} - -static bool -parse(struct xkb_compose_table *table, struct scanner *s, - unsigned include_depth) -{ - enum rules_token tok; - union lvalue val; - xkb_keysym_t keysym; - struct production production; - enum { MAX_ERRORS = 10 }; - int num_errors = 0; - -initial: - production.len = 0; - production.has_keysym = false; - production.has_string = false; - production.mods = 0; - production.modmask = 0; - - /* fallthrough */ - -initial_eol: - switch (tok = lex(s, &val)) { - case TOK_END_OF_LINE: - goto initial_eol; - case TOK_END_OF_FILE: - goto finished; - case TOK_INCLUDE: - goto include; - default: - goto lhs_tok; - } - -include: - switch (tok = lex_include_string(s, table, &val)) { - case TOK_INCLUDE_STRING: - goto include_eol; - default: - goto unexpected; - } - -include_eol: - switch (tok = lex(s, &val)) { - case TOK_END_OF_LINE: - if (!do_include(table, s, val.string.str, include_depth)) - goto fail; - goto initial; - default: - goto unexpected; - } - -lhs: - tok = lex(s, &val); -lhs_tok: - switch (tok) { - case TOK_COLON: - if (production.len <= 0) { - scanner_warn(s, "expected at least one keysym on left-hand side; skipping line"); - goto skip; - } - goto rhs; - case TOK_IDENT: - if (streq(val.string.str, "None")) { - production.mods = 0; - production.modmask = ALL_MODS_MASK; - goto lhs_keysym; - } - goto lhs_mod_list_tok; - case TOK_TILDE: - goto lhs_mod_list_tok; - case TOK_BANG: - production.modmask = ALL_MODS_MASK; - goto lhs_mod_list; - default: - goto lhs_keysym_tok; - } - -lhs_keysym: - tok = lex(s, &val); -lhs_keysym_tok: - switch (tok) { - case TOK_LHS_KEYSYM: - keysym = xkb_keysym_from_name(val.string.str, XKB_KEYSYM_NO_FLAGS); - if (keysym == XKB_KEY_NoSymbol) { - scanner_err(s, "unrecognized keysym \"%s\" on left-hand side", - val.string.str); - goto error; - } - if (production.len + 1 > MAX_LHS_LEN) { - scanner_warn(s, "too many keysyms (%d) on left-hand side; skipping line", - MAX_LHS_LEN + 1); - goto skip; - } - production.lhs[production.len++] = keysym; - production.mods = 0; - production.modmask = 0; - goto lhs; - default: - goto unexpected; - } - -lhs_mod_list: - tok = lex(s, &val); -lhs_mod_list_tok: { - bool tilde = false; - xkb_mod_index_t mod; - - if (tok != TOK_TILDE && tok != TOK_IDENT) - goto lhs_keysym_tok; - - if (tok == TOK_TILDE) { - tilde = true; - tok = lex(s, &val); - } - - if (tok != TOK_IDENT) - goto unexpected; - - mod = resolve_modifier(val.string.str); - if (mod == XKB_MOD_INVALID) { - scanner_err(s, "unrecognized modifier \"%s\"", - val.string.str); - goto error; - } - - production.modmask |= 1 << mod; - if (tilde) - production.mods &= ~(1 << mod); - else - production.mods |= 1 << mod; - - goto lhs_mod_list; - } - -rhs: - switch (tok = lex(s, &val)) { - case TOK_STRING: - if (production.has_string) { - scanner_warn(s, "right-hand side can have at most one string; skipping line"); - goto skip; - } - if (val.string.len <= 0) { - scanner_warn(s, "right-hand side string must not be empty; skipping line"); - goto skip; - } - if (val.string.len >= sizeof(production.string)) { - scanner_warn(s, "right-hand side string is too long; skipping line"); - goto skip; - } - strcpy(production.string, val.string.str); - production.has_string = true; - goto rhs; - case TOK_IDENT: - keysym = xkb_keysym_from_name(val.string.str, XKB_KEYSYM_NO_FLAGS); - if (keysym == XKB_KEY_NoSymbol) { - scanner_err(s, "unrecognized keysym \"%s\" on right-hand side", - val.string.str); - goto error; - } - if (production.has_keysym) { - scanner_warn(s, "right-hand side can have at most one keysym; skipping line"); - goto skip; - } - production.keysym = keysym; - production.has_keysym = true; - /* fallthrough */ - case TOK_END_OF_LINE: - if (!production.has_string && !production.has_keysym) { - scanner_warn(s, "right-hand side must have at least one of string or keysym; skipping line"); - goto skip; - } - add_production(table, s, &production); - goto initial; - default: - goto unexpected; - } - -unexpected: - if (tok != TOK_ERROR) - scanner_err(s, "unexpected token"); -error: - num_errors++; - if (num_errors <= MAX_ERRORS) - goto skip; - - scanner_err(s, "too many errors"); - goto fail; - -fail: - scanner_err(s, "failed to parse file"); - return false; - -skip: - while (tok != TOK_END_OF_LINE && tok != TOK_END_OF_FILE) - tok = lex(s, &val); - goto initial; - -finished: - return true; -} - -bool -parse_string(struct xkb_compose_table *table, const char *string, size_t len, - const char *file_name) -{ - struct scanner s; - scanner_init(&s, table->ctx, string, len, file_name, NULL); - if (!parse(table, &s, 0)) - return false; - /* Maybe the allocator can use the excess space. */ - darray_shrink(table->nodes); - darray_shrink(table->utf8); - return true; -} - -bool -parse_file(struct xkb_compose_table *table, FILE *file, const char *file_name) -{ - bool ok; - char *string; - size_t size; - - ok = map_file(file, &string, &size); - if (!ok) { - log_err(table->ctx, "Couldn't read Compose file %s: %s\n", - file_name, strerror(errno)); - return false; - } - - ok = parse_string(table, string, size, file_name); - unmap_file(string, size); - return ok; -} diff --git a/src/3rdparty/xkbcommon/src/compose/parser.h b/src/3rdparty/xkbcommon/src/compose/parser.h deleted file mode 100644 index 3f64a07402..0000000000 --- a/src/3rdparty/xkbcommon/src/compose/parser.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright © 2013 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef COMPOSE_PARSER_H -#define COMPOSE_PARSER_H - -bool -parse_string(struct xkb_compose_table *table, - const char *string, size_t len, - const char *file_name); - -bool -parse_file(struct xkb_compose_table *table, - FILE *file, const char *file_name); - -#endif diff --git a/src/3rdparty/xkbcommon/src/compose/paths.c b/src/3rdparty/xkbcommon/src/compose/paths.c deleted file mode 100644 index e9d43d7e44..0000000000 --- a/src/3rdparty/xkbcommon/src/compose/paths.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright © 2014 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "utils.h" -#include "paths.h" - -enum resolve_name_direction { - LEFT_TO_RIGHT, - RIGHT_TO_LEFT, -}; - -const char * -get_xlocaledir_path(void) -{ - const char *dir = secure_getenv("XLOCALEDIR"); - if (!dir) - dir = XLOCALEDIR; - return dir; -} - -/* - * Files like compose.dir have the format LEFT: RIGHT. Lookup @name in - * such a file and return its matching value, according to @direction. - * @filename is relative to the xlocaledir. - */ -static char * -resolve_name(const char *filename, enum resolve_name_direction direction, - const char *name) -{ - int ret; - bool ok; - const char *xlocaledir; - char path[512]; - FILE *file; - char *string; - size_t string_size; - const char *end; - const char *s, *left, *right; - char *match; - size_t left_len, right_len, name_len; - - xlocaledir = get_xlocaledir_path(); - - ret = snprintf(path, sizeof(path), "%s/%s", xlocaledir, filename); - if (ret < 0 || (size_t) ret >= sizeof(path)) - return false; - - file = fopen(path, "r"); - if (!file) - return false; - - ok = map_file(file, &string, &string_size); - fclose(file); - if (!ok) - return false; - - s = string; - end = string + string_size; - name_len = strlen(name); - match = NULL; - - while (s < end) { - /* Skip spaces. */ - while (s < end && is_space(*s)) - s++; - - /* Skip comments. */ - if (s < end && *s == '#') { - while (s < end && *s != '\n') - s++; - continue; - } - - /* Get the left value. */ - left = s; - while (s < end && !is_space(*s) && *s != ':') - s++; - left_len = s - left; - - /* There's an optional colon between left and right. */ - if (s < end && *s == ':') - s++; - - /* Skip spaces. */ - while (s < end && is_space(*s)) - s++; - - /* Get the right value. */ - right = s; - while (s < end && !is_space(*s)) - s++; - right_len = s - right; - - /* Discard rest of line. */ - while (s < end && *s != '\n') - s++; - - if (direction == LEFT_TO_RIGHT) { - if (left_len == name_len && memcmp(left, name, left_len) == 0) { - match = strndup(right, right_len); - break; - } - } - else if (direction == RIGHT_TO_LEFT) { - if (right_len == name_len && memcmp(right, name, right_len) == 0) { - match = strndup(left, left_len); - break; - } - } - } - - unmap_file(string, string_size); - return match; -} - -char * -resolve_locale(const char *locale) -{ - char *alias = resolve_name("locale.alias", LEFT_TO_RIGHT, locale); - return alias ? alias : strdup(locale); -} - -const char * -get_xcomposefile_path(void) -{ - return secure_getenv("XCOMPOSEFILE"); -} - -char * -get_home_xcompose_file_path(void) -{ - int ret; - const char *home; - char *path; - - home = secure_getenv("HOME"); - if (!home) - return NULL; - - ret = asprintf(&path, "%s/.XCompose", home); - if (ret <0) - return NULL; - - return path; -} - -char * -get_locale_compose_file_path(const char *locale) -{ - char *resolved; - char *path; - - /* - * WARNING: Random workaround ahead. - * - * We currently do not support non-UTF-8 Compose files. The C/POSIX - * locale is specified to be the default fallback locale with an - * ASCII charset. But for some reason the compose.dir points the C - * locale to the iso8859-1/Compose file, which is not ASCII but - * ISO8859-1. Since this is bound to happen a lot, and since our API - * is UTF-8 based, and since 99% of the time a C locale is really just - * a misconfiguration for UTF-8, let's do the most helpful thing. - */ - if (streq(locale, "C")) - locale = "en_US.UTF-8"; - - resolved = resolve_name("compose.dir", RIGHT_TO_LEFT, locale); - if (!resolved) - return NULL; - - if (resolved[0] == '/') { - path = resolved; - } - else { - const char *xlocaledir = get_xlocaledir_path(); - int ret = asprintf(&path, "%s/%s", xlocaledir, resolved); - free(resolved); - if (ret < 0) - return NULL; - } - - return path; -} diff --git a/src/3rdparty/xkbcommon/src/compose/paths.h b/src/3rdparty/xkbcommon/src/compose/paths.h deleted file mode 100644 index 1d719af1b9..0000000000 --- a/src/3rdparty/xkbcommon/src/compose/paths.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright © 2014 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef COMPOSE_RESOLVE_H -#define COMPOSE_RESOLVE_H - -char * -resolve_locale(const char *locale); - -const char * -get_xlocaledir_path(void); - -const char * -get_xcomposefile_path(void); - -char * -get_home_xcompose_file_path(void); - -char * -get_locale_compose_file_path(const char *locale); - -#endif diff --git a/src/3rdparty/xkbcommon/src/compose/table.c b/src/3rdparty/xkbcommon/src/compose/table.c deleted file mode 100644 index 5cd8415850..0000000000 --- a/src/3rdparty/xkbcommon/src/compose/table.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright © 2013 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "utils.h" -#include "table.h" -#include "parser.h" -#include "paths.h" - -static struct xkb_compose_table * -xkb_compose_table_new(struct xkb_context *ctx, - const char *locale, - enum xkb_compose_format format, - enum xkb_compose_compile_flags flags) -{ - char *resolved_locale; - struct xkb_compose_table *table; - struct compose_node root; - - resolved_locale = resolve_locale(locale); - if (!resolved_locale) - return NULL; - - table = calloc(1, sizeof(*table)); - if (!table) { - free(resolved_locale); - return NULL; - } - - table->refcnt = 1; - table->ctx = xkb_context_ref(ctx); - - table->locale = resolved_locale; - table->format = format; - table->flags = flags; - - darray_init(table->nodes); - darray_init(table->utf8); - - root.keysym = XKB_KEY_NoSymbol; - root.next = 0; - root.is_leaf = true; - root.u.leaf.utf8 = 0; - root.u.leaf.keysym = XKB_KEY_NoSymbol; - darray_append(table->nodes, root); - - darray_append(table->utf8, '\0'); - - return table; -} - -XKB_EXPORT struct xkb_compose_table * -xkb_compose_table_ref(struct xkb_compose_table *table) -{ - table->refcnt++; - return table; -} - -XKB_EXPORT void -xkb_compose_table_unref(struct xkb_compose_table *table) -{ - if (!table || --table->refcnt > 0) - return; - free(table->locale); - darray_free(table->nodes); - darray_free(table->utf8); - xkb_context_unref(table->ctx); - free(table); -} - -XKB_EXPORT struct xkb_compose_table * -xkb_compose_table_new_from_file(struct xkb_context *ctx, - FILE *file, - const char *locale, - enum xkb_compose_format format, - enum xkb_compose_compile_flags flags) -{ - struct xkb_compose_table *table; - bool ok; - - if (flags & ~(XKB_COMPOSE_COMPILE_NO_FLAGS)) { - log_err_func(ctx, "unrecognized flags: %#x\n", flags); - return NULL; - } - - if (format != XKB_COMPOSE_FORMAT_TEXT_V1) { - log_err_func(ctx, "unsupported compose format: %d\n", format); - return NULL; - } - - table = xkb_compose_table_new(ctx, locale, format, flags); - if (!table) - return NULL; - - ok = parse_file(table, file, "(unknown file)"); - if (!ok) { - xkb_compose_table_unref(table); - return NULL; - } - - return table; -} - -XKB_EXPORT struct xkb_compose_table * -xkb_compose_table_new_from_buffer(struct xkb_context *ctx, - const char *buffer, size_t length, - const char *locale, - enum xkb_compose_format format, - enum xkb_compose_compile_flags flags) -{ - struct xkb_compose_table *table; - bool ok; - - if (flags & ~(XKB_COMPOSE_COMPILE_NO_FLAGS)) { - log_err_func(ctx, "unrecognized flags: %#x\n", flags); - return NULL; - } - - if (format != XKB_COMPOSE_FORMAT_TEXT_V1) { - log_err_func(ctx, "unsupported compose format: %d\n", format); - return NULL; - } - - table = xkb_compose_table_new(ctx, locale, format, flags); - if (!table) - return NULL; - - ok = parse_string(table, buffer, length, "(input string)"); - if (!ok) { - xkb_compose_table_unref(table); - return NULL; - } - - return table; -} - -XKB_EXPORT struct xkb_compose_table * -xkb_compose_table_new_from_locale(struct xkb_context *ctx, - const char *locale, - enum xkb_compose_compile_flags flags) -{ - struct xkb_compose_table *table; - char *path = NULL; - const char *cpath; - FILE *file; - bool ok; - - if (flags & ~(XKB_COMPOSE_COMPILE_NO_FLAGS)) { - log_err_func(ctx, "unrecognized flags: %#x\n", flags); - return NULL; - } - - table = xkb_compose_table_new(ctx, locale, XKB_COMPOSE_FORMAT_TEXT_V1, - flags); - if (!table) - return NULL; - - cpath = get_xcomposefile_path(); - if (cpath) { - file = fopen(cpath, "r"); - if (file) - goto found_path; - } - - cpath = path = get_home_xcompose_file_path(); - if (path) { - file = fopen(path, "r"); - if (file) - goto found_path; - } - free(path); - path = NULL; - - cpath = path = get_locale_compose_file_path(table->locale); - if (path) { - file = fopen(path, "r"); - if (file) - goto found_path; - } - free(path); - path = NULL; - - log_err(ctx, "couldn't find a Compose file for locale \"%s\"\n", locale); - xkb_compose_table_unref(table); - return NULL; - -found_path: - ok = parse_file(table, file, cpath); - fclose(file); - if (!ok) { - xkb_compose_table_unref(table); - return NULL; - } - - log_dbg(ctx, "created compose table from locale %s with path %s\n", - table->locale, path); - - free(path); - return table; -} diff --git a/src/3rdparty/xkbcommon/src/compose/table.h b/src/3rdparty/xkbcommon/src/compose/table.h deleted file mode 100644 index 05a415ffa3..0000000000 --- a/src/3rdparty/xkbcommon/src/compose/table.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright © 2013 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef COMPOSE_COMPOSE_H -#define COMPOSE_COMPOSE_H - -#include "xkbcommon/xkbcommon-compose.h" -#include "utils.h" -#include "context.h" - -/* - * The compose table data structure is a simple trie. An example will - * help. Given these sequences: - * - * <A> <B> : "first" dead_a - * <A> <C> <D> : "second" dead_b - * <E> <F> : "third" dead_c - * - * the trie would look like: - * - * [root] ---> [<A>] -----------------> [<E>] -# - * | | | - * # v v - * [<B>] ---> [<C>] -# [<F>] -# - * | | - - * # v # - * [<D>] -# - * | - * # - * where: - * - [root] is a special empty root node. - * - [<X>] is a node for a sequence keysym <X>. - * - right arrows are `next` pointers. - * - down arrows are `successor` pointers. - * - # is a nil pointer. - * - * The nodes are all kept in a contiguous array. Pointers are represented - * as integer offsets into this array. A nil pointer is represented as 0 - * (which, helpfully, is the offset of the empty root node). - * - * Nodes without a successor are leaf nodes. Since a sequence cannot be a - * prefix of another, these are exactly the nodes which terminate the - * sequences (in a bijective manner). - * - * A leaf contains the result data of its sequence. The result keysym is - * contained in the node struct itself; the result UTF-8 string is a byte - * offset into an array of the form "\0first\0second\0third" (the initial - * \0 is so offset 0 points to an empty string). - */ - -struct compose_node { - xkb_keysym_t keysym; - /* Offset into xkb_compose_table::nodes. */ - unsigned int next:31; - bool is_leaf:1; - - union { - /* Offset into xkb_compose_table::nodes. */ - uint32_t successor; - struct { - /* Offset into xkb_compose_table::utf8. */ - uint32_t utf8; - xkb_keysym_t keysym; - } leaf; - } u; -}; - -struct xkb_compose_table { - int refcnt; - enum xkb_compose_format format; - enum xkb_compose_compile_flags flags; - struct xkb_context *ctx; - - char *locale; - - darray_char utf8; - darray(struct compose_node) nodes; -}; - -#endif diff --git a/src/3rdparty/xkbcommon/src/context-priv.c b/src/3rdparty/xkbcommon/src/context-priv.c deleted file mode 100644 index c934201685..0000000000 --- a/src/3rdparty/xkbcommon/src/context-priv.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone <daniel@fooishbar.org> - */ - -#include <sys/types.h> -#include <sys/stat.h> -#include <errno.h> -#include <unistd.h> - -#include "xkbcommon/xkbcommon.h" -#include "utils.h" -#include "context.h" - -unsigned int -xkb_context_num_failed_include_paths(struct xkb_context *ctx) -{ - return darray_size(ctx->failed_includes); -} - -const char * -xkb_context_failed_include_path_get(struct xkb_context *ctx, - unsigned int idx) -{ - if (idx >= xkb_context_num_failed_include_paths(ctx)) - return NULL; - - return darray_item(ctx->failed_includes, idx); -} - -xkb_atom_t -xkb_atom_lookup(struct xkb_context *ctx, const char *string) -{ - return atom_lookup(ctx->atom_table, string, strlen(string)); -} - -xkb_atom_t -xkb_atom_intern(struct xkb_context *ctx, const char *string, size_t len) -{ - return atom_intern(ctx->atom_table, string, len, false); -} - -xkb_atom_t -xkb_atom_steal(struct xkb_context *ctx, char *string) -{ - return atom_intern(ctx->atom_table, string, strlen(string), true); -} - -const char * -xkb_atom_text(struct xkb_context *ctx, xkb_atom_t atom) -{ - return atom_text(ctx->atom_table, atom); -} - -void -xkb_log(struct xkb_context *ctx, enum xkb_log_level level, int verbosity, - const char *fmt, ...) -{ - va_list args; - - if (ctx->log_level < level || ctx->log_verbosity < verbosity) - return; - - va_start(args, fmt); - ctx->log_fn(ctx, level, fmt, args); - va_end(args); -} - -char * -xkb_context_get_buffer(struct xkb_context *ctx, size_t size) -{ - char *rtrn; - - if (size >= sizeof(ctx->text_buffer)) - return NULL; - - if (sizeof(ctx->text_buffer) - ctx->text_next <= size) - ctx->text_next = 0; - - rtrn = &ctx->text_buffer[ctx->text_next]; - ctx->text_next += size; - - return rtrn; -} - -#ifndef DEFAULT_XKB_VARIANT -#define DEFAULT_XKB_VARIANT NULL -#endif - -#ifndef DEFAULT_XKB_OPTIONS -#define DEFAULT_XKB_OPTIONS NULL -#endif - -static const char * -xkb_context_get_default_rules(struct xkb_context *ctx) -{ - const char *env = NULL; - - if (ctx->use_environment_names) - env = secure_getenv("XKB_DEFAULT_RULES"); - - return env ? env : DEFAULT_XKB_RULES; -} - -static const char * -xkb_context_get_default_model(struct xkb_context *ctx) -{ - const char *env = NULL; - - if (ctx->use_environment_names) - env = secure_getenv("XKB_DEFAULT_MODEL"); - - return env ? env : DEFAULT_XKB_MODEL; -} - -static const char * -xkb_context_get_default_layout(struct xkb_context *ctx) -{ - const char *env = NULL; - - if (ctx->use_environment_names) - env = secure_getenv("XKB_DEFAULT_LAYOUT"); - - return env ? env : DEFAULT_XKB_LAYOUT; -} - -static const char * -xkb_context_get_default_variant(struct xkb_context *ctx) -{ - const char *env = NULL; - const char *layout = secure_getenv("XKB_DEFAULT_LAYOUT"); - - /* We don't want to inherit the variant if they haven't also set a - * layout, since they're so closely paired. */ - if (layout && ctx->use_environment_names) - env = secure_getenv("XKB_DEFAULT_VARIANT"); - - return env ? env : DEFAULT_XKB_VARIANT; -} - -static const char * -xkb_context_get_default_options(struct xkb_context *ctx) -{ - const char *env = NULL; - - if (ctx->use_environment_names) - env = secure_getenv("XKB_DEFAULT_OPTIONS"); - - return env ? env : DEFAULT_XKB_OPTIONS; -} - -void -xkb_context_sanitize_rule_names(struct xkb_context *ctx, - struct xkb_rule_names *rmlvo) -{ - if (isempty(rmlvo->rules)) - rmlvo->rules = xkb_context_get_default_rules(ctx); - if (isempty(rmlvo->model)) - rmlvo->model = xkb_context_get_default_model(ctx); - /* Layout and variant are tied together, so don't try to use one from - * the caller and one from the environment. */ - if (isempty(rmlvo->layout)) { - rmlvo->layout = xkb_context_get_default_layout(ctx); - rmlvo->variant = xkb_context_get_default_variant(ctx); - } - /* Options can be empty, so respect that if passed in. */ - if (rmlvo->options == NULL) - rmlvo->options = xkb_context_get_default_options(ctx); -} diff --git a/src/3rdparty/xkbcommon/src/context.c b/src/3rdparty/xkbcommon/src/context.c deleted file mode 100644 index 50993e108a..0000000000 --- a/src/3rdparty/xkbcommon/src/context.c +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone <daniel@fooishbar.org> - */ - -#include <sys/types.h> -#include <sys/stat.h> -#include <errno.h> -#include <unistd.h> - -#include "xkbcommon/xkbcommon.h" -#include "utils.h" -#include "context.h" - -/** - * Append one directory to the context's include path. - */ -XKB_EXPORT int -xkb_context_include_path_append(struct xkb_context *ctx, const char *path) -{ - struct stat stat_buf; - int err; - char *tmp; - - tmp = strdup(path); - if (!tmp) - goto err; - - err = stat(path, &stat_buf); - if (err != 0) - goto err; - if (!S_ISDIR(stat_buf.st_mode)) - goto err; - -#if defined(HAVE_EACCESS) - if (eaccess(path, R_OK | X_OK) != 0) - goto err; -#elif defined(HAVE_EUIDACCESS) - if (euidaccess(path, R_OK | X_OK) != 0) - goto err; -#endif - - darray_append(ctx->includes, tmp); - return 1; - -err: - darray_append(ctx->failed_includes, tmp); - return 0; -} - -/** - * Append the default include directories to the context. - */ -XKB_EXPORT int -xkb_context_include_path_append_default(struct xkb_context *ctx) -{ - const char *home, *root; - char *user_path; - int err; - int ret = 0; - - root = secure_getenv("XKB_CONFIG_ROOT"); - if (root != NULL) - ret |= xkb_context_include_path_append(ctx, root); - else - ret |= xkb_context_include_path_append(ctx, DFLT_XKB_CONFIG_ROOT); - - home = secure_getenv("HOME"); - if (!home) - return ret; - err = asprintf(&user_path, "%s/.xkb", home); - if (err <= 0) - return ret; - ret |= xkb_context_include_path_append(ctx, user_path); - free(user_path); - - return ret; -} - -/** - * Remove all entries in the context's include path. - */ -XKB_EXPORT void -xkb_context_include_path_clear(struct xkb_context *ctx) -{ - char **path; - - darray_foreach(path, ctx->includes) - free(*path); - darray_free(ctx->includes); - - darray_foreach(path, ctx->failed_includes) - free(*path); - darray_free(ctx->failed_includes); -} - -/** - * xkb_context_include_path_clear() + xkb_context_include_path_append_default() - */ -XKB_EXPORT int -xkb_context_include_path_reset_defaults(struct xkb_context *ctx) -{ - xkb_context_include_path_clear(ctx); - return xkb_context_include_path_append_default(ctx); -} - -/** - * Returns the number of entries in the context's include path. - */ -XKB_EXPORT unsigned int -xkb_context_num_include_paths(struct xkb_context *ctx) -{ - return darray_size(ctx->includes); -} - -/** - * Returns the given entry in the context's include path, or NULL if an - * invalid index is passed. - */ -XKB_EXPORT const char * -xkb_context_include_path_get(struct xkb_context *ctx, unsigned int idx) -{ - if (idx >= xkb_context_num_include_paths(ctx)) - return NULL; - - return darray_item(ctx->includes, idx); -} - -/** - * Take a new reference on the context. - */ -XKB_EXPORT struct xkb_context * -xkb_context_ref(struct xkb_context *ctx) -{ - ctx->refcnt++; - return ctx; -} - -/** - * Drop an existing reference on the context, and free it if the refcnt is - * now 0. - */ -XKB_EXPORT void -xkb_context_unref(struct xkb_context *ctx) -{ - if (!ctx || --ctx->refcnt > 0) - return; - - xkb_context_include_path_clear(ctx); - atom_table_free(ctx->atom_table); - free(ctx); -} - -static const char * -log_level_to_prefix(enum xkb_log_level level) -{ - switch (level) { - case XKB_LOG_LEVEL_DEBUG: - return "xkbcommon: DEBUG: "; - case XKB_LOG_LEVEL_INFO: - return "xkbcommon: INFO: "; - case XKB_LOG_LEVEL_WARNING: - return "xkbcommon: WARNING: "; - case XKB_LOG_LEVEL_ERROR: - return "xkbcommon: ERROR: "; - case XKB_LOG_LEVEL_CRITICAL: - return "xkbcommon: CRITICAL: "; - default: - return NULL; - } -} - -ATTR_PRINTF(3, 0) static void -default_log_fn(struct xkb_context *ctx, enum xkb_log_level level, - const char *fmt, va_list args) -{ - const char *prefix = log_level_to_prefix(level); - - if (prefix) - fprintf(stderr, "%s", prefix); - vfprintf(stderr, fmt, args); -} - -static enum xkb_log_level -log_level(const char *level) { - char *endptr; - enum xkb_log_level lvl; - - errno = 0; - lvl = strtol(level, &endptr, 10); - if (errno == 0 && (endptr[0] == '\0' || is_space(endptr[0]))) - return lvl; - if (istreq_prefix("crit", level)) - return XKB_LOG_LEVEL_CRITICAL; - if (istreq_prefix("err", level)) - return XKB_LOG_LEVEL_ERROR; - if (istreq_prefix("warn", level)) - return XKB_LOG_LEVEL_WARNING; - if (istreq_prefix("info", level)) - return XKB_LOG_LEVEL_INFO; - if (istreq_prefix("debug", level) || istreq_prefix("dbg", level)) - return XKB_LOG_LEVEL_DEBUG; - - return XKB_LOG_LEVEL_ERROR; -} - -static int -log_verbosity(const char *verbosity) { - char *endptr; - int v; - - errno = 0; - v = strtol(verbosity, &endptr, 10); - if (errno == 0) - return v; - - return 0; -} - -/** - * Create a new context. - */ -XKB_EXPORT struct xkb_context * -xkb_context_new(enum xkb_context_flags flags) -{ - const char *env; - struct xkb_context *ctx = calloc(1, sizeof(*ctx)); - - if (!ctx) - return NULL; - - ctx->refcnt = 1; - ctx->log_fn = default_log_fn; - ctx->log_level = XKB_LOG_LEVEL_ERROR; - ctx->log_verbosity = 0; - - /* Environment overwrites defaults. */ - env = secure_getenv("XKB_LOG_LEVEL"); - if (env) - xkb_context_set_log_level(ctx, log_level(env)); - - env = secure_getenv("XKB_LOG_VERBOSITY"); - if (env) - xkb_context_set_log_verbosity(ctx, log_verbosity(env)); - - if (!(flags & XKB_CONTEXT_NO_DEFAULT_INCLUDES) && - !xkb_context_include_path_append_default(ctx)) { - log_err(ctx, "failed to add default include path %s\n", - DFLT_XKB_CONFIG_ROOT); - xkb_context_unref(ctx); - return NULL; - } - - ctx->use_environment_names = !(flags & XKB_CONTEXT_NO_ENVIRONMENT_NAMES); - - ctx->atom_table = atom_table_new(); - if (!ctx->atom_table) { - xkb_context_unref(ctx); - return NULL; - } - - return ctx; -} - -XKB_EXPORT void -xkb_context_set_log_fn(struct xkb_context *ctx, - void (*log_fn)(struct xkb_context *ctx, - enum xkb_log_level level, - const char *fmt, va_list args)) -{ - ctx->log_fn = (log_fn ? log_fn : default_log_fn); -} - -XKB_EXPORT enum xkb_log_level -xkb_context_get_log_level(struct xkb_context *ctx) -{ - return ctx->log_level; -} - -XKB_EXPORT void -xkb_context_set_log_level(struct xkb_context *ctx, enum xkb_log_level level) -{ - ctx->log_level = level; -} - -XKB_EXPORT int -xkb_context_get_log_verbosity(struct xkb_context *ctx) -{ - return ctx->log_verbosity; -} - -XKB_EXPORT void -xkb_context_set_log_verbosity(struct xkb_context *ctx, int verbosity) -{ - ctx->log_verbosity = verbosity; -} - -XKB_EXPORT void * -xkb_context_get_user_data(struct xkb_context *ctx) -{ - if (ctx) - return ctx->user_data; - return NULL; -} - -XKB_EXPORT void -xkb_context_set_user_data(struct xkb_context *ctx, void *user_data) -{ - ctx->user_data = user_data; -} diff --git a/src/3rdparty/xkbcommon/src/context.h b/src/3rdparty/xkbcommon/src/context.h deleted file mode 100644 index 03e6d50abb..0000000000 --- a/src/3rdparty/xkbcommon/src/context.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone <daniel@fooishbar.org> - */ - -#ifndef CONTEXT_H -#define CONTEXT_H - -#include "atom.h" - -struct xkb_context { - int refcnt; - - ATTR_PRINTF(3, 0) void (*log_fn)(struct xkb_context *ctx, - enum xkb_log_level level, - const char *fmt, va_list args); - enum xkb_log_level log_level; - int log_verbosity; - void *user_data; - - struct xkb_rule_names names_dflt; - - darray(char *) includes; - darray(char *) failed_includes; - - struct atom_table *atom_table; - - /* Buffer for the *Text() functions. */ - char text_buffer[2048]; - size_t text_next; - - unsigned int use_environment_names : 1; -}; - -unsigned int -xkb_context_num_failed_include_paths(struct xkb_context *ctx); - -const char * -xkb_context_failed_include_path_get(struct xkb_context *ctx, - unsigned int idx); - -/* - * Returns XKB_ATOM_NONE if @string was not previously interned, - * otherwise returns the atom. - */ -xkb_atom_t -xkb_atom_lookup(struct xkb_context *ctx, const char *string); - -xkb_atom_t -xkb_atom_intern(struct xkb_context *ctx, const char *string, size_t len); - -#define xkb_atom_intern_literal(ctx, literal) \ - xkb_atom_intern((ctx), (literal), sizeof(literal) - 1) - -/** - * If @string is dynamically allocated, NUL-terminated, free'd immediately - * after being interned, and not used afterwards, use this function - * instead of xkb_atom_intern to avoid some unnecessary allocations. - * The caller should not use or free the passed in string afterwards. - */ -xkb_atom_t -xkb_atom_steal(struct xkb_context *ctx, char *string); - -const char * -xkb_atom_text(struct xkb_context *ctx, xkb_atom_t atom); - -char * -xkb_context_get_buffer(struct xkb_context *ctx, size_t size); - -ATTR_PRINTF(4, 5) void -xkb_log(struct xkb_context *ctx, enum xkb_log_level level, int verbosity, - const char *fmt, ...); - -void -xkb_context_sanitize_rule_names(struct xkb_context *ctx, - struct xkb_rule_names *rmlvo); - -/* - * The format is not part of the argument list in order to avoid the - * "ISO C99 requires rest arguments to be used" warning when only the - * format is supplied without arguments. Not supplying it would still - * result in an error, though. - */ -#define log_dbg(ctx, ...) \ - xkb_log((ctx), XKB_LOG_LEVEL_DEBUG, 0, __VA_ARGS__) -#define log_info(ctx, ...) \ - xkb_log((ctx), XKB_LOG_LEVEL_INFO, 0, __VA_ARGS__) -#define log_warn(ctx, ...) \ - xkb_log((ctx), XKB_LOG_LEVEL_WARNING, 0, __VA_ARGS__) -#define log_err(ctx, ...) \ - xkb_log((ctx), XKB_LOG_LEVEL_ERROR, 0, __VA_ARGS__) -#define log_wsgo(ctx, ...) \ - xkb_log((ctx), XKB_LOG_LEVEL_CRITICAL, 0, __VA_ARGS__) -#define log_vrb(ctx, vrb, ...) \ - xkb_log((ctx), XKB_LOG_LEVEL_WARNING, (vrb), __VA_ARGS__) - -/* - * Variants which are prefixed by the name of the function they're - * called from. - * Here we must have the silly 1 variant. - */ -#define log_err_func(ctx, fmt, ...) \ - log_err(ctx, "%s: " fmt, __func__, __VA_ARGS__) -#define log_err_func1(ctx, fmt) \ - log_err(ctx, "%s: " fmt, __func__) - -#endif diff --git a/src/3rdparty/xkbcommon/src/darray.h b/src/3rdparty/xkbcommon/src/darray.h deleted file mode 100644 index 8e87c942ee..0000000000 --- a/src/3rdparty/xkbcommon/src/darray.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (C) 2011 Joseph Adams <joeyadams3.14159@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef CCAN_DARRAY_H -#define CCAN_DARRAY_H - -/* Originally taken from: https://ccodearchive.net/info/darray.html - * But modified for libxkbcommon. */ - -#include <stdlib.h> -#include <string.h> -#include <assert.h> -#include <limits.h> - -#define darray(type) struct { type *item; unsigned size; unsigned alloc; } - -#define darray_new() { 0, 0, 0 } - -#define darray_init(arr) do { \ - (arr).item = 0; (arr).size = 0; (arr).alloc = 0; \ -} while (0) - -#define darray_free(arr) do { \ - free((arr).item); \ - darray_init(arr); \ -} while (0) - -#define darray_steal(arr, to, to_size) do { \ - *(to) = (arr).item; \ - if (to_size) \ - *(unsigned int *) (to_size) = (arr).size; \ - darray_init(arr); \ -} while (0) - -/* - * Typedefs for darrays of common types. These are useful - * when you want to pass a pointer to an darray(T) around. - * - * The following will produce an incompatible pointer warning: - * - * void foo(darray(int) *arr); - * darray(int) arr = darray_new(); - * foo(&arr); - * - * The workaround: - * - * void foo(darray_int *arr); - * darray_int arr = darray_new(); - * foo(&arr); - */ - -typedef darray (char) darray_char; -typedef darray (signed char) darray_schar; -typedef darray (unsigned char) darray_uchar; - -typedef darray (short) darray_short; -typedef darray (int) darray_int; -typedef darray (long) darray_long; - -typedef darray (unsigned short) darray_ushort; -typedef darray (unsigned int) darray_uint; -typedef darray (unsigned long) darray_ulong; - -/*** Access ***/ - -#define darray_item(arr, i) ((arr).item[i]) -#define darray_size(arr) ((arr).size) -#define darray_empty(arr) ((arr).size == 0) - -/*** Insertion (single item) ***/ - -#define darray_append(arr, ...) do { \ - darray_resize(arr, (arr).size + 1); \ - (arr).item[(arr).size - 1] = (__VA_ARGS__); \ -} while (0) - -/*** Insertion (multiple items) ***/ - -#define darray_append_items(arr, items, count) do { \ - unsigned __count = (count), __oldSize = (arr).size; \ - darray_resize(arr, __oldSize + __count); \ - memcpy((arr).item + __oldSize, items, __count * sizeof(*(arr).item)); \ -} while (0) - -#define darray_from_items(arr, items, count) do { \ - unsigned __count = (count); \ - darray_resize(arr, __count); \ - if (__count != 0) \ - memcpy((arr).item, items, __count * sizeof(*(arr).item)); \ -} while (0) - -#define darray_copy(arr_to, arr_from) \ - darray_from_items((arr_to), (arr_from).item, (arr_from).size) - -#define darray_concat(arr_to, arr_from) \ - darray_append_items((arr_to), (arr_from).item, (arr_from).size) - -/*** String buffer ***/ - -#define darray_append_string(arr, str) do { \ - const char *__str = (str); \ - darray_append_items(arr, __str, strlen(__str) + 1); \ - (arr).size--; \ -} while (0) - -#define darray_append_lit(arr, stringLiteral) do { \ - darray_append_items(arr, stringLiteral, sizeof(stringLiteral)); \ - (arr).size--; \ -} while (0) - -#define darray_appends_nullterminate(arr, items, count) do { \ - unsigned __count = (count), __oldSize = (arr).size; \ - darray_resize(arr, __oldSize + __count + 1); \ - memcpy((arr).item + __oldSize, items, __count * sizeof(*(arr).item)); \ - (arr).item[--(arr).size] = 0; \ -} while (0) - -#define darray_prepends_nullterminate(arr, items, count) do { \ - unsigned __count = (count), __oldSize = (arr).size; \ - darray_resize(arr, __count + __oldSize + 1); \ - memmove((arr).item + __count, (arr).item, \ - __oldSize * sizeof(*(arr).item)); \ - memcpy((arr).item, items, __count * sizeof(*(arr).item)); \ - (arr).item[--(arr).size] = 0; \ -} while (0) - -/*** Size management ***/ - -#define darray_resize(arr, newSize) \ - darray_growalloc(arr, (arr).size = (newSize)) - -#define darray_resize0(arr, newSize) do { \ - unsigned __oldSize = (arr).size, __newSize = (newSize); \ - (arr).size = __newSize; \ - if (__newSize > __oldSize) { \ - darray_growalloc(arr, __newSize); \ - memset(&(arr).item[__oldSize], 0, \ - (__newSize - __oldSize) * sizeof(*(arr).item)); \ - } \ -} while (0) - -#define darray_realloc(arr, newAlloc) do { \ - (arr).item = realloc((arr).item, \ - ((arr).alloc = (newAlloc)) * sizeof(*(arr).item)); \ -} while (0) - -#define darray_growalloc(arr, need) do { \ - unsigned __need = (need); \ - if (__need > (arr).alloc) \ - darray_realloc(arr, darray_next_alloc((arr).alloc, __need, \ - sizeof(*(arr).item))); \ -} while (0) - -#define darray_shrink(arr) do { \ - if ((arr).size > 0) \ - (arr).item = realloc((arr).item, \ - ((arr).alloc = (arr).size) * sizeof(*(arr).item)); \ -} while (0) - -static inline unsigned -darray_next_alloc(unsigned alloc, unsigned need, unsigned itemSize) -{ - assert(need < UINT_MAX / itemSize / 2); /* Overflow. */ - if (alloc == 0) - alloc = 4; - while (alloc < need) - alloc *= 2; - return alloc; -} - -/*** Traversal ***/ - -#define darray_foreach(i, arr) \ - for ((i) = &(arr).item[0]; (i) < &(arr).item[(arr).size]; (i)++) - -#define darray_foreach_from(i, arr, from) \ - for ((i) = &(arr).item[from]; (i) < &(arr).item[(arr).size]; (i)++) - -/* Iterate on index and value at the same time, like Python's enumerate. */ -#define darray_enumerate(idx, val, arr) \ - for ((idx) = 0, (val) = &(arr).item[0]; \ - (idx) < (arr).size; \ - (idx)++, (val)++) - -#define darray_enumerate_from(idx, val, arr, from) \ - for ((idx) = (from), (val) = &(arr).item[0]; \ - (idx) < (arr).size; \ - (idx)++, (val)++) - -#endif /* CCAN_DARRAY_H */ diff --git a/src/3rdparty/xkbcommon/src/keymap-priv.c b/src/3rdparty/xkbcommon/src/keymap-priv.c deleted file mode 100644 index fffb2fd30d..0000000000 --- a/src/3rdparty/xkbcommon/src/keymap-priv.c +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone <daniel@fooishbar.org> - */ - -#include "keymap.h" - -static void -update_builtin_keymap_fields(struct xkb_keymap *keymap) -{ - /* Predefined (AKA real, core, X11) modifiers. The order is important! */ - static const char *const builtin_mods[] = { - [0] = "Shift", - [1] = "Lock", - [2] = "Control", - [3] = "Mod1", - [4] = "Mod2", - [5] = "Mod3", - [6] = "Mod4", - [7] = "Mod5" - }; - - for (unsigned i = 0; i < ARRAY_SIZE(builtin_mods); i++) { - keymap->mods.mods[i].name = xkb_atom_intern(keymap->ctx, - builtin_mods[i], - strlen(builtin_mods[i])); - keymap->mods.mods[i].type = MOD_REAL; - } - keymap->mods.num_mods = ARRAY_SIZE(builtin_mods); -} - -struct xkb_keymap * -xkb_keymap_new(struct xkb_context *ctx, - enum xkb_keymap_format format, - enum xkb_keymap_compile_flags flags) -{ - struct xkb_keymap *keymap; - - keymap = calloc(1, sizeof(*keymap)); - if (!keymap) - return NULL; - - keymap->refcnt = 1; - keymap->ctx = xkb_context_ref(ctx); - - keymap->format = format; - keymap->flags = flags; - - update_builtin_keymap_fields(keymap); - - return keymap; -} - -struct xkb_key * -XkbKeyByName(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases) -{ - struct xkb_key *key; - - xkb_keys_foreach(key, keymap) - if (key->name == name) - return key; - - if (use_aliases) { - xkb_atom_t new_name = XkbResolveKeyAlias(keymap, name); - if (new_name != XKB_ATOM_NONE) - return XkbKeyByName(keymap, new_name, false); - } - - return NULL; -} - -xkb_atom_t -XkbResolveKeyAlias(const struct xkb_keymap *keymap, xkb_atom_t name) -{ - for (unsigned i = 0; i < keymap->num_key_aliases; i++) - if (keymap->key_aliases[i].alias == name) - return keymap->key_aliases[i].real; - - return XKB_ATOM_NONE; -} - -void -XkbEscapeMapName(char *name) -{ - /* - * All latin-1 alphanumerics, plus parens, slash, minus, underscore and - * wildcards. - */ - static const unsigned char legal[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0xff, 0x83, - 0xfe, 0xff, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff - }; - - if (!name) - return; - - while (*name) { - unsigned char c = *name; - if (!(legal[c / 8] & (1 << (c % 8)))) - *name = '_'; - name++; - } -} - -xkb_mod_index_t -XkbModNameToIndex(const struct xkb_mod_set *mods, xkb_atom_t name, - enum mod_type type) -{ - xkb_mod_index_t i; - const struct xkb_mod *mod; - - xkb_mods_enumerate(i, mod, mods) - if ((mod->type & type) && name == mod->name) - return i; - - return XKB_MOD_INVALID; -} - -bool -XkbLevelsSameSyms(const struct xkb_level *a, const struct xkb_level *b) -{ - if (a->num_syms != b->num_syms) - return false; - if (a->num_syms <= 1) - return a->u.sym == b->u.sym; - return memcmp(a->u.syms, b->u.syms, sizeof(*a->u.syms) * a->num_syms) == 0; -} diff --git a/src/3rdparty/xkbcommon/src/keymap.c b/src/3rdparty/xkbcommon/src/keymap.c deleted file mode 100644 index 859c64a556..0000000000 --- a/src/3rdparty/xkbcommon/src/keymap.c +++ /dev/null @@ -1,519 +0,0 @@ -/** - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone <daniel@fooishbar.org> - */ - -/************************************************************ - * Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * ********************************************************/ - -#include "keymap.h" -#include "text.h" - -XKB_EXPORT struct xkb_keymap * -xkb_keymap_ref(struct xkb_keymap *keymap) -{ - keymap->refcnt++; - return keymap; -} - -XKB_EXPORT void -xkb_keymap_unref(struct xkb_keymap *keymap) -{ - if (!keymap || --keymap->refcnt > 0) - return; - - if (keymap->keys) { - struct xkb_key *key; - xkb_keys_foreach(key, keymap) { - if (key->groups) { - for (unsigned i = 0; i < key->num_groups; i++) { - if (key->groups[i].levels) { - for (unsigned j = 0; j < XkbKeyNumLevels(key, i); j++) - if (key->groups[i].levels[j].num_syms > 1) - free(key->groups[i].levels[j].u.syms); - free(key->groups[i].levels); - } - } - free(key->groups); - } - } - free(keymap->keys); - } - if (keymap->types) { - for (unsigned i = 0; i < keymap->num_types; i++) { - free(keymap->types[i].entries); - free(keymap->types[i].level_names); - } - free(keymap->types); - } - free(keymap->sym_interprets); - free(keymap->key_aliases); - free(keymap->group_names); - free(keymap->keycodes_section_name); - free(keymap->symbols_section_name); - free(keymap->types_section_name); - free(keymap->compat_section_name); - xkb_context_unref(keymap->ctx); - free(keymap); -} - -static const struct xkb_keymap_format_ops * -get_keymap_format_ops(enum xkb_keymap_format format) -{ - static const struct xkb_keymap_format_ops *keymap_format_ops[] = { - [XKB_KEYMAP_FORMAT_TEXT_V1] = &text_v1_keymap_format_ops, - }; - - if ((int) format < 0 || (int) format >= (int) ARRAY_SIZE(keymap_format_ops)) - return NULL; - - return keymap_format_ops[(int) format]; -} - -XKB_EXPORT struct xkb_keymap * -xkb_keymap_new_from_names(struct xkb_context *ctx, - const struct xkb_rule_names *rmlvo_in, - enum xkb_keymap_compile_flags flags) -{ - struct xkb_keymap *keymap; - struct xkb_rule_names rmlvo; - const enum xkb_keymap_format format = XKB_KEYMAP_FORMAT_TEXT_V1; - const struct xkb_keymap_format_ops *ops; - - ops = get_keymap_format_ops(format); - if (!ops || !ops->keymap_new_from_names) { - log_err_func(ctx, "unsupported keymap format: %d\n", format); - return NULL; - } - - if (flags & ~(XKB_KEYMAP_COMPILE_NO_FLAGS)) { - log_err_func(ctx, "unrecognized flags: %#x\n", flags); - return NULL; - } - - keymap = xkb_keymap_new(ctx, format, flags); - if (!keymap) - return NULL; - - if (rmlvo_in) - rmlvo = *rmlvo_in; - else - memset(&rmlvo, 0, sizeof(rmlvo)); - xkb_context_sanitize_rule_names(ctx, &rmlvo); - - if (!ops->keymap_new_from_names(keymap, &rmlvo)) { - xkb_keymap_unref(keymap); - return NULL; - } - - return keymap; -} - -XKB_EXPORT struct xkb_keymap * -xkb_keymap_new_from_string(struct xkb_context *ctx, - const char *string, - enum xkb_keymap_format format, - enum xkb_keymap_compile_flags flags) -{ - return xkb_keymap_new_from_buffer(ctx, string, strlen(string), - format, flags); -} - -XKB_EXPORT struct xkb_keymap * -xkb_keymap_new_from_buffer(struct xkb_context *ctx, - const char *buffer, size_t length, - enum xkb_keymap_format format, - enum xkb_keymap_compile_flags flags) -{ - struct xkb_keymap *keymap; - const struct xkb_keymap_format_ops *ops; - - ops = get_keymap_format_ops(format); - if (!ops || !ops->keymap_new_from_string) { - log_err_func(ctx, "unsupported keymap format: %d\n", format); - return NULL; - } - - if (flags & ~(XKB_KEYMAP_COMPILE_NO_FLAGS)) { - log_err_func(ctx, "unrecognized flags: %#x\n", flags); - return NULL; - } - - if (!buffer) { - log_err_func1(ctx, "no buffer specified\n"); - return NULL; - } - - keymap = xkb_keymap_new(ctx, format, flags); - if (!keymap) - return NULL; - - if (!ops->keymap_new_from_string(keymap, buffer, length)) { - xkb_keymap_unref(keymap); - return NULL; - } - - return keymap; -} - -XKB_EXPORT struct xkb_keymap * -xkb_keymap_new_from_file(struct xkb_context *ctx, - FILE *file, - enum xkb_keymap_format format, - enum xkb_keymap_compile_flags flags) -{ - struct xkb_keymap *keymap; - const struct xkb_keymap_format_ops *ops; - - ops = get_keymap_format_ops(format); - if (!ops || !ops->keymap_new_from_file) { - log_err_func(ctx, "unsupported keymap format: %d\n", format); - return NULL; - } - - if (flags & ~(XKB_KEYMAP_COMPILE_NO_FLAGS)) { - log_err_func(ctx, "unrecognized flags: %#x\n", flags); - return NULL; - } - - if (!file) { - log_err_func1(ctx, "no file specified\n"); - return NULL; - } - - keymap = xkb_keymap_new(ctx, format, flags); - if (!keymap) - return NULL; - - if (!ops->keymap_new_from_file(keymap, file)) { - xkb_keymap_unref(keymap); - return NULL; - } - - return keymap; -} - -XKB_EXPORT char * -xkb_keymap_get_as_string(struct xkb_keymap *keymap, - enum xkb_keymap_format format) -{ - const struct xkb_keymap_format_ops *ops; - - if (format == XKB_KEYMAP_USE_ORIGINAL_FORMAT) - format = keymap->format; - - ops = get_keymap_format_ops(format); - if (!ops || !ops->keymap_get_as_string) { - log_err_func(keymap->ctx, "unsupported keymap format: %d\n", format); - return NULL; - } - - return ops->keymap_get_as_string(keymap); -} - -/** - * Returns the total number of modifiers active in the keymap. - */ -XKB_EXPORT xkb_mod_index_t -xkb_keymap_num_mods(struct xkb_keymap *keymap) -{ - return keymap->mods.num_mods; -} - -/** - * Return the name for a given modifier. - */ -XKB_EXPORT const char * -xkb_keymap_mod_get_name(struct xkb_keymap *keymap, xkb_mod_index_t idx) -{ - if (idx >= keymap->mods.num_mods) - return NULL; - - return xkb_atom_text(keymap->ctx, keymap->mods.mods[idx].name); -} - -/** - * Returns the index for a named modifier. - */ -XKB_EXPORT xkb_mod_index_t -xkb_keymap_mod_get_index(struct xkb_keymap *keymap, const char *name) -{ - xkb_atom_t atom; - - atom = xkb_atom_lookup(keymap->ctx, name); - if (atom == XKB_ATOM_NONE) - return XKB_MOD_INVALID; - - return XkbModNameToIndex(&keymap->mods, atom, MOD_BOTH); -} - -/** - * Return the total number of active groups in the keymap. - */ -XKB_EXPORT xkb_layout_index_t -xkb_keymap_num_layouts(struct xkb_keymap *keymap) -{ - return keymap->num_groups; -} - -/** - * Returns the name for a given group. - */ -XKB_EXPORT const char * -xkb_keymap_layout_get_name(struct xkb_keymap *keymap, xkb_layout_index_t idx) -{ - if (idx >= keymap->num_group_names) - return NULL; - - return xkb_atom_text(keymap->ctx, keymap->group_names[idx]); -} - -/** - * Returns the index for a named layout. - */ -XKB_EXPORT xkb_layout_index_t -xkb_keymap_layout_get_index(struct xkb_keymap *keymap, const char *name) -{ - xkb_atom_t atom = xkb_atom_lookup(keymap->ctx, name); - xkb_layout_index_t i; - - if (atom == XKB_ATOM_NONE) - return XKB_LAYOUT_INVALID; - - for (i = 0; i < keymap->num_group_names; i++) - if (keymap->group_names[i] == atom) - return i; - - return XKB_LAYOUT_INVALID; -} - -/** - * Returns the number of layouts active for a particular key. - */ -XKB_EXPORT xkb_layout_index_t -xkb_keymap_num_layouts_for_key(struct xkb_keymap *keymap, xkb_keycode_t kc) -{ - const struct xkb_key *key = XkbKey(keymap, kc); - - if (!key) - return 0; - - return key->num_groups; -} - -/** - * Returns the number of levels active for a particular key and layout. - */ -XKB_EXPORT xkb_level_index_t -xkb_keymap_num_levels_for_key(struct xkb_keymap *keymap, xkb_keycode_t kc, - xkb_layout_index_t layout) -{ - const struct xkb_key *key = XkbKey(keymap, kc); - - if (!key) - return 0; - - layout = XkbWrapGroupIntoRange(layout, key->num_groups, - key->out_of_range_group_action, - key->out_of_range_group_number); - if (layout == XKB_LAYOUT_INVALID) - return 0; - - return XkbKeyNumLevels(key, layout); -} - -/** - * Return the total number of LEDs in the keymap. - */ -XKB_EXPORT xkb_led_index_t -xkb_keymap_num_leds(struct xkb_keymap *keymap) -{ - return keymap->num_leds; -} - -/** - * Returns the name for a given LED. - */ -XKB_EXPORT const char * -xkb_keymap_led_get_name(struct xkb_keymap *keymap, xkb_led_index_t idx) -{ - if (idx >= keymap->num_leds) - return NULL; - - return xkb_atom_text(keymap->ctx, keymap->leds[idx].name); -} - -/** - * Returns the index for a named LED. - */ -XKB_EXPORT xkb_led_index_t -xkb_keymap_led_get_index(struct xkb_keymap *keymap, const char *name) -{ - xkb_atom_t atom = xkb_atom_lookup(keymap->ctx, name); - xkb_led_index_t i; - const struct xkb_led *led; - - if (atom == XKB_ATOM_NONE) - return XKB_LED_INVALID; - - xkb_leds_enumerate(i, led, keymap) - if (led->name == atom) - return i; - - return XKB_LED_INVALID; -} - -/** - * As below, but takes an explicit layout/level rather than state. - */ -XKB_EXPORT int -xkb_keymap_key_get_syms_by_level(struct xkb_keymap *keymap, - xkb_keycode_t kc, - xkb_layout_index_t layout, - xkb_level_index_t level, - const xkb_keysym_t **syms_out) -{ - const struct xkb_key *key = XkbKey(keymap, kc); - int num_syms; - - if (!key) - goto err; - - layout = XkbWrapGroupIntoRange(layout, key->num_groups, - key->out_of_range_group_action, - key->out_of_range_group_number); - if (layout == XKB_LAYOUT_INVALID) - goto err; - - if (level >= XkbKeyNumLevels(key, layout)) - goto err; - - num_syms = key->groups[layout].levels[level].num_syms; - if (num_syms == 0) - goto err; - - if (num_syms == 1) - *syms_out = &key->groups[layout].levels[level].u.sym; - else - *syms_out = key->groups[layout].levels[level].u.syms; - - return num_syms; - -err: - *syms_out = NULL; - return 0; -} - -XKB_EXPORT xkb_keycode_t -xkb_keymap_min_keycode(struct xkb_keymap *keymap) -{ - return keymap->min_key_code; -} - -XKB_EXPORT xkb_keycode_t -xkb_keymap_max_keycode(struct xkb_keymap *keymap) -{ - return keymap->max_key_code; -} - -XKB_EXPORT void -xkb_keymap_key_for_each(struct xkb_keymap *keymap, xkb_keymap_key_iter_t iter, - void *data) -{ - struct xkb_key *key; - - xkb_keys_foreach(key, keymap) - iter(keymap, key->keycode, data); -} - -XKB_EXPORT const char * -xkb_keymap_key_get_name(struct xkb_keymap *keymap, xkb_keycode_t kc) -{ - const struct xkb_key *key = XkbKey(keymap, kc); - - if (!key) - return NULL; - - return xkb_atom_text(keymap->ctx, key->name); -} - -XKB_EXPORT xkb_keycode_t -xkb_keymap_key_by_name(struct xkb_keymap *keymap, const char *name) -{ - struct xkb_key *key; - xkb_atom_t atom; - - atom = xkb_atom_lookup(keymap->ctx, name); - if (atom) { - xkb_atom_t ratom = XkbResolveKeyAlias(keymap, atom); - if (ratom) - atom = ratom; - } - if (!atom) - return XKB_KEYCODE_INVALID; - - xkb_keys_foreach(key, keymap) { - if (key->name == atom) - return key->keycode; - } - - return XKB_KEYCODE_INVALID; -} - -/** - * Simple boolean specifying whether or not the key should repeat. - */ -XKB_EXPORT int -xkb_keymap_key_repeats(struct xkb_keymap *keymap, xkb_keycode_t kc) -{ - const struct xkb_key *key = XkbKey(keymap, kc); - - if (!key) - return 0; - - return key->repeats; -} diff --git a/src/3rdparty/xkbcommon/src/keymap.h b/src/3rdparty/xkbcommon/src/keymap.h deleted file mode 100644 index c15052bc7f..0000000000 --- a/src/3rdparty/xkbcommon/src/keymap.h +++ /dev/null @@ -1,482 +0,0 @@ -/* - * Copyright 1985, 1987, 1990, 1998 The Open Group - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Except as contained in this notice, the names of the authors or their - * institutions shall not be used in advertising or otherwise to promote the - * sale, use or other dealings in this Software without prior written - * authorization from the authors. - */ - -/************************************************************ - * Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2009 Dan Nicholson - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone <daniel@fooishbar.org> - * Dan Nicholson <dbn.lists@gmail.com> - */ - -#ifndef KEYMAP_H -#define KEYMAP_H - - /* Don't use compat names in internal code. */ -#define _XKBCOMMON_COMPAT_H -#include "xkbcommon/xkbcommon.h" - -#include "utils.h" -#include "context.h" - -/* This limit is artificially enforced, we do not depend on it any where. - * The reason it's still here is that the rules file format does not - * support multiple groups very well, and the rules shipped with - * xkeyboard-config (see rules/evdev) depend on this limit extensively. - * So just lifting this limit would cause problems for people who will use - * more than 4 layouts. - * TODO: Fix the group index syntax in the rules format, preferably in a - * backwards compatible way. - * See e.g. https://bugs.freedesktop.org/show_bug.cgi?id=14372 - * Note: A limit on the number of groups we *do* depend on is imposed by - * the size of the xkb_layout_mask_t type (32). This is more than enough - * though. - */ -#define XKB_MAX_GROUPS 4 - -/* Don't allow more modifiers than we can hold in xkb_mod_mask_t. */ -#define XKB_MAX_MODS ((xkb_mod_index_t) (sizeof(xkb_mod_mask_t) * 8)) - -/* Don't allow more leds than we can hold in xkb_led_mask_t. */ -#define XKB_MAX_LEDS ((xkb_led_index_t) (sizeof(xkb_led_mask_t) * 8)) - -/* These should all go away. */ -enum mod_type { - MOD_REAL = (1 << 0), - MOD_VIRT = (1 << 1), - MOD_BOTH = (MOD_REAL | MOD_VIRT), -}; -#define MOD_REAL_MASK_ALL ((xkb_mod_mask_t) 0x000000ff) - -enum xkb_action_type { - ACTION_TYPE_NONE = 0, - ACTION_TYPE_MOD_SET, - ACTION_TYPE_MOD_LATCH, - ACTION_TYPE_MOD_LOCK, - ACTION_TYPE_GROUP_SET, - ACTION_TYPE_GROUP_LATCH, - ACTION_TYPE_GROUP_LOCK, - ACTION_TYPE_PTR_MOVE, - ACTION_TYPE_PTR_BUTTON, - ACTION_TYPE_PTR_LOCK, - ACTION_TYPE_PTR_DEFAULT, - ACTION_TYPE_TERMINATE, - ACTION_TYPE_SWITCH_VT, - ACTION_TYPE_CTRL_SET, - ACTION_TYPE_CTRL_LOCK, - ACTION_TYPE_PRIVATE, - _ACTION_TYPE_NUM_ENTRIES -}; - -enum xkb_action_flags { - ACTION_LOCK_CLEAR = (1 << 0), - ACTION_LATCH_TO_LOCK = (1 << 1), - ACTION_LOCK_NO_LOCK = (1 << 2), - ACTION_LOCK_NO_UNLOCK = (1 << 3), - ACTION_MODS_LOOKUP_MODMAP = (1 << 4), - ACTION_ABSOLUTE_SWITCH = (1 << 5), - ACTION_ABSOLUTE_X = (1 << 6), - ACTION_ABSOLUTE_Y = (1 << 7), - ACTION_ACCEL = (1 << 8), - ACTION_SAME_SCREEN = (1 << 9), -}; - -enum xkb_action_controls { - CONTROL_REPEAT = (1 << 0), - CONTROL_SLOW = (1 << 1), - CONTROL_DEBOUNCE = (1 << 2), - CONTROL_STICKY = (1 << 3), - CONTROL_MOUSEKEYS = (1 << 4), - CONTROL_MOUSEKEYS_ACCEL = (1 << 5), - CONTROL_AX = (1 << 6), - CONTROL_AX_TIMEOUT = (1 << 7), - CONTROL_AX_FEEDBACK = (1 << 8), - CONTROL_BELL = (1 << 9), - CONTROL_IGNORE_GROUP_LOCK = (1 << 10), - CONTROL_ALL = \ - (CONTROL_REPEAT | CONTROL_SLOW | CONTROL_DEBOUNCE | CONTROL_STICKY | \ - CONTROL_MOUSEKEYS | CONTROL_MOUSEKEYS_ACCEL | CONTROL_AX | \ - CONTROL_AX_TIMEOUT | CONTROL_AX_FEEDBACK | CONTROL_BELL | \ - CONTROL_IGNORE_GROUP_LOCK) -}; - -enum xkb_match_operation { - MATCH_NONE, - MATCH_ANY_OR_NONE, - MATCH_ANY, - MATCH_ALL, - MATCH_EXACTLY, -}; - -struct xkb_mods { - xkb_mod_mask_t mods; /* original real+virtual mods in definition */ - xkb_mod_mask_t mask; /* computed effective mask */ -}; - -struct xkb_mod_action { - enum xkb_action_type type; - enum xkb_action_flags flags; - struct xkb_mods mods; -}; - -struct xkb_group_action { - enum xkb_action_type type; - enum xkb_action_flags flags; - int32_t group; -}; - -struct xkb_controls_action { - enum xkb_action_type type; - enum xkb_action_flags flags; - enum xkb_action_controls ctrls; -}; - -struct xkb_pointer_default_action { - enum xkb_action_type type; - enum xkb_action_flags flags; - int8_t value; -}; - -struct xkb_switch_screen_action { - enum xkb_action_type type; - enum xkb_action_flags flags; - int8_t screen; -}; - -struct xkb_pointer_action { - enum xkb_action_type type; - enum xkb_action_flags flags; - int16_t x; - int16_t y; -}; - -struct xkb_pointer_button_action { - enum xkb_action_type type; - enum xkb_action_flags flags; - uint8_t count; - uint8_t button; -}; - -struct xkb_private_action { - enum xkb_action_type type; - uint8_t data[7]; -}; - -union xkb_action { - enum xkb_action_type type; - struct xkb_mod_action mods; - struct xkb_group_action group; - struct xkb_controls_action ctrls; - struct xkb_pointer_default_action dflt; - struct xkb_switch_screen_action screen; - struct xkb_pointer_action ptr; - struct xkb_pointer_button_action btn; - struct xkb_private_action priv; -}; - -struct xkb_key_type_entry { - xkb_level_index_t level; - struct xkb_mods mods; - struct xkb_mods preserve; -}; - -struct xkb_key_type { - xkb_atom_t name; - struct xkb_mods mods; - xkb_level_index_t num_levels; - unsigned int num_level_names; - xkb_atom_t *level_names; - unsigned int num_entries; - struct xkb_key_type_entry *entries; -}; - -struct xkb_sym_interpret { - xkb_keysym_t sym; - enum xkb_match_operation match; - xkb_mod_mask_t mods; - xkb_mod_index_t virtual_mod; - union xkb_action action; - bool level_one_only; - bool repeat; -}; - -struct xkb_led { - xkb_atom_t name; - enum xkb_state_component which_groups; - xkb_layout_mask_t groups; - enum xkb_state_component which_mods; - struct xkb_mods mods; - enum xkb_action_controls ctrls; -}; - -struct xkb_key_alias { - xkb_atom_t real; - xkb_atom_t alias; -}; - -struct xkb_controls { - unsigned char groups_wrap; - struct xkb_mods internal; - struct xkb_mods ignore_lock; - unsigned short repeat_delay; - unsigned short repeat_interval; - unsigned short slow_keys_delay; - unsigned short debounce_delay; - unsigned short ax_options; - unsigned short ax_timeout; - unsigned short axt_opts_mask; - unsigned short axt_opts_values; - unsigned int axt_ctrls_mask; - unsigned int axt_ctrls_values; -}; - -/* Such an awkward name. Oh well. */ -enum xkb_range_exceed_type { - RANGE_WRAP = 0, - RANGE_SATURATE, - RANGE_REDIRECT, -}; - -enum xkb_explicit_components { - EXPLICIT_INTERP = (1 << 0), - EXPLICIT_VMODMAP = (1 << 1), - EXPLICIT_REPEAT = (1 << 2), -}; - -struct xkb_level { - union xkb_action action; - unsigned int num_syms; - union { - xkb_keysym_t sym; /* num_syms == 1 */ - xkb_keysym_t *syms; /* num_syms > 1 */ - } u; -}; - -struct xkb_group { - bool explicit_type; - /* Points to a type in keymap->types. */ - const struct xkb_key_type *type; - /* Use XkbKeyNumLevels for the number of levels. */ - struct xkb_level *levels; -}; - -struct xkb_key { - xkb_keycode_t keycode; - xkb_atom_t name; - - enum xkb_explicit_components explicit; - - xkb_mod_mask_t modmap; - xkb_mod_mask_t vmodmap; - - bool repeats; - - enum xkb_range_exceed_type out_of_range_group_action; - xkb_layout_index_t out_of_range_group_number; - - xkb_layout_index_t num_groups; - struct xkb_group *groups; -}; - -struct xkb_mod { - xkb_atom_t name; - enum mod_type type; - xkb_mod_mask_t mapping; /* vmod -> real mod mapping */ -}; - -struct xkb_mod_set { - struct xkb_mod mods[XKB_MAX_MODS]; - unsigned int num_mods; -}; - -/* Common keyboard description structure */ -struct xkb_keymap { - struct xkb_context *ctx; - - int refcnt; - enum xkb_keymap_compile_flags flags; - enum xkb_keymap_format format; - - enum xkb_action_controls enabled_ctrls; - - xkb_keycode_t min_key_code; - xkb_keycode_t max_key_code; - struct xkb_key *keys; - - /* aliases in no particular order */ - unsigned int num_key_aliases; - struct xkb_key_alias *key_aliases; - - struct xkb_key_type *types; - unsigned int num_types; - - unsigned int num_sym_interprets; - struct xkb_sym_interpret *sym_interprets; - - struct xkb_mod_set mods; - - /* Number of groups in the key with the most groups. */ - xkb_layout_index_t num_groups; - /* Not all groups must have names. */ - xkb_layout_index_t num_group_names; - xkb_atom_t *group_names; - - struct xkb_led leds[XKB_MAX_LEDS]; - unsigned int num_leds; - - char *keycodes_section_name; - char *symbols_section_name; - char *types_section_name; - char *compat_section_name; -}; - -#define xkb_keys_foreach(iter, keymap) \ - for ((iter) = (keymap)->keys + (keymap)->min_key_code; \ - (iter) <= (keymap)->keys + (keymap)->max_key_code; \ - (iter)++) - -#define xkb_mods_foreach(iter, mods_) \ - for ((iter) = (mods_)->mods; \ - (iter) < (mods_)->mods + (mods_)->num_mods; \ - (iter)++) - -#define xkb_mods_enumerate(idx, iter, mods_) \ - for ((idx) = 0, (iter) = (mods_)->mods; \ - (idx) < (mods_)->num_mods; \ - (idx)++, (iter)++) - -#define xkb_leds_foreach(iter, keymap) \ - for ((iter) = (keymap)->leds; \ - (iter) < (keymap)->leds + (keymap)->num_leds; \ - (iter)++) - -#define xkb_leds_enumerate(idx, iter, keymap) \ - for ((idx) = 0, (iter) = (keymap)->leds; \ - (idx) < (keymap)->num_leds; \ - (idx)++, (iter)++) - -static inline const struct xkb_key * -XkbKey(struct xkb_keymap *keymap, xkb_keycode_t kc) -{ - if (kc < keymap->min_key_code || kc > keymap->max_key_code) - return NULL; - return &keymap->keys[kc]; -} - -static inline xkb_level_index_t -XkbKeyNumLevels(const struct xkb_key *key, xkb_layout_index_t layout) -{ - return key->groups[layout].type->num_levels; -} - -struct xkb_keymap * -xkb_keymap_new(struct xkb_context *ctx, - enum xkb_keymap_format format, - enum xkb_keymap_compile_flags flags); - -struct xkb_key * -XkbKeyByName(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases); - -xkb_atom_t -XkbResolveKeyAlias(const struct xkb_keymap *keymap, xkb_atom_t name); - -void -XkbEscapeMapName(char *name); - -xkb_mod_index_t -XkbModNameToIndex(const struct xkb_mod_set *mods, xkb_atom_t name, - enum mod_type type); - -bool -XkbLevelsSameSyms(const struct xkb_level *a, const struct xkb_level *b); - -xkb_layout_index_t -XkbWrapGroupIntoRange(int32_t group, - xkb_layout_index_t num_groups, - enum xkb_range_exceed_type out_of_range_group_action, - xkb_layout_index_t out_of_range_group_number); - -xkb_mod_mask_t -mod_mask_get_effective(struct xkb_keymap *keymap, xkb_mod_mask_t mods); - -struct xkb_keymap_format_ops { - bool (*keymap_new_from_names)(struct xkb_keymap *keymap, - const struct xkb_rule_names *names); - bool (*keymap_new_from_string)(struct xkb_keymap *keymap, - const char *string, size_t length); - bool (*keymap_new_from_file)(struct xkb_keymap *keymap, FILE *file); - char *(*keymap_get_as_string)(struct xkb_keymap *keymap); -}; - -extern const struct xkb_keymap_format_ops text_v1_keymap_format_ops; - -#endif diff --git a/src/3rdparty/xkbcommon/src/keysym-utf.c b/src/3rdparty/xkbcommon/src/keysym-utf.c deleted file mode 100644 index c0e76f54da..0000000000 --- a/src/3rdparty/xkbcommon/src/keysym-utf.c +++ /dev/null @@ -1,937 +0,0 @@ -/* The table and comments below along with the function xkb_keysym_to_ucs4 - * are under the public domain and are derived as described below. - */ -/* This module converts keysym values into the corresponding ISO 10646 - * (UCS, Unicode) values. - * - * The array keysymtab[] contains pairs of X11 keysym values for graphical - * characters and the corresponding Unicode value. The function - * keysym2ucs() maps a keysym onto a Unicode value using a binary search, - * therefore keysymtab[] must remain SORTED by keysym value. - * - * The keysym -> UTF-8 conversion will hopefully one day be provided - * by Xlib via XmbLookupString() and should ideally not have to be - * done in X applications. But we are not there yet. - * - * We allow to represent any UCS character in the range U-00000000 to - * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff. - * This admittedly does not cover the entire 31-bit space of UCS, but - * it does cover all of the characters up to U-10FFFF, which can be - * represented by UTF-16, and more, and it is very unlikely that higher - * UCS codes will ever be assigned by ISO. So to get Unicode character - * U+ABCD you can directly use keysym 0x0100abcd. - * - * NOTE: The comments in the table below contain the actual character - * encoded in UTF-8, so for viewing and editing best use an editor in - * UTF-8 mode. - * - * Author: Markus G. Kuhn <http://www.cl.cam.ac.uk/~mgk25/>, - * University of Cambridge, April 2001 - * - * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing - * an initial draft of the mapping table. - * - * This software is in the public domain. Share and enjoy! - * - */ - -#include "xkbcommon/xkbcommon.h" -#include "utils.h" -#include "utf8.h" - -/* We don't use the uint32_t types here, to save some space. */ -struct codepair { - uint16_t keysym; - uint16_t ucs; -}; - -static const struct codepair keysymtab[] = { - { 0x01a1, 0x0104 }, /* Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */ - { 0x01a2, 0x02d8 }, /* breve ˘ BREVE */ - { 0x01a3, 0x0141 }, /* Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */ - { 0x01a5, 0x013d }, /* Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */ - { 0x01a6, 0x015a }, /* Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */ - { 0x01a9, 0x0160 }, /* Scaron Š LATIN CAPITAL LETTER S WITH CARON */ - { 0x01aa, 0x015e }, /* Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */ - { 0x01ab, 0x0164 }, /* Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */ - { 0x01ac, 0x0179 }, /* Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */ - { 0x01ae, 0x017d }, /* Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */ - { 0x01af, 0x017b }, /* Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */ - { 0x01b1, 0x0105 }, /* aogonek ą LATIN SMALL LETTER A WITH OGONEK */ - { 0x01b2, 0x02db }, /* ogonek ˛ OGONEK */ - { 0x01b3, 0x0142 }, /* lstroke ł LATIN SMALL LETTER L WITH STROKE */ - { 0x01b5, 0x013e }, /* lcaron ľ LATIN SMALL LETTER L WITH CARON */ - { 0x01b6, 0x015b }, /* sacute ś LATIN SMALL LETTER S WITH ACUTE */ - { 0x01b7, 0x02c7 }, /* caron ˇ CARON */ - { 0x01b9, 0x0161 }, /* scaron š LATIN SMALL LETTER S WITH CARON */ - { 0x01ba, 0x015f }, /* scedilla ş LATIN SMALL LETTER S WITH CEDILLA */ - { 0x01bb, 0x0165 }, /* tcaron ť LATIN SMALL LETTER T WITH CARON */ - { 0x01bc, 0x017a }, /* zacute ź LATIN SMALL LETTER Z WITH ACUTE */ - { 0x01bd, 0x02dd }, /* doubleacute ˝ DOUBLE ACUTE ACCENT */ - { 0x01be, 0x017e }, /* zcaron ž LATIN SMALL LETTER Z WITH CARON */ - { 0x01bf, 0x017c }, /* zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */ - { 0x01c0, 0x0154 }, /* Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */ - { 0x01c3, 0x0102 }, /* Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */ - { 0x01c5, 0x0139 }, /* Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */ - { 0x01c6, 0x0106 }, /* Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */ - { 0x01c8, 0x010c }, /* Ccaron Č LATIN CAPITAL LETTER C WITH CARON */ - { 0x01ca, 0x0118 }, /* Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */ - { 0x01cc, 0x011a }, /* Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */ - { 0x01cf, 0x010e }, /* Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */ - { 0x01d0, 0x0110 }, /* Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */ - { 0x01d1, 0x0143 }, /* Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */ - { 0x01d2, 0x0147 }, /* Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */ - { 0x01d5, 0x0150 }, /* Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ - { 0x01d8, 0x0158 }, /* Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */ - { 0x01d9, 0x016e }, /* Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */ - { 0x01db, 0x0170 }, /* Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ - { 0x01de, 0x0162 }, /* Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */ - { 0x01e0, 0x0155 }, /* racute ŕ LATIN SMALL LETTER R WITH ACUTE */ - { 0x01e3, 0x0103 }, /* abreve ă LATIN SMALL LETTER A WITH BREVE */ - { 0x01e5, 0x013a }, /* lacute ĺ LATIN SMALL LETTER L WITH ACUTE */ - { 0x01e6, 0x0107 }, /* cacute ć LATIN SMALL LETTER C WITH ACUTE */ - { 0x01e8, 0x010d }, /* ccaron č LATIN SMALL LETTER C WITH CARON */ - { 0x01ea, 0x0119 }, /* eogonek ę LATIN SMALL LETTER E WITH OGONEK */ - { 0x01ec, 0x011b }, /* ecaron ě LATIN SMALL LETTER E WITH CARON */ - { 0x01ef, 0x010f }, /* dcaron ď LATIN SMALL LETTER D WITH CARON */ - { 0x01f0, 0x0111 }, /* dstroke đ LATIN SMALL LETTER D WITH STROKE */ - { 0x01f1, 0x0144 }, /* nacute ń LATIN SMALL LETTER N WITH ACUTE */ - { 0x01f2, 0x0148 }, /* ncaron ň LATIN SMALL LETTER N WITH CARON */ - { 0x01f5, 0x0151 }, /* odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */ - { 0x01f8, 0x0159 }, /* rcaron ř LATIN SMALL LETTER R WITH CARON */ - { 0x01f9, 0x016f }, /* uring ů LATIN SMALL LETTER U WITH RING ABOVE */ - { 0x01fb, 0x0171 }, /* udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */ - { 0x01fe, 0x0163 }, /* tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */ - { 0x01ff, 0x02d9 }, /* abovedot ˙ DOT ABOVE */ - { 0x02a1, 0x0126 }, /* Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */ - { 0x02a6, 0x0124 }, /* Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ - { 0x02a9, 0x0130 }, /* Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */ - { 0x02ab, 0x011e }, /* Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */ - { 0x02ac, 0x0134 }, /* Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ - { 0x02b1, 0x0127 }, /* hstroke ħ LATIN SMALL LETTER H WITH STROKE */ - { 0x02b6, 0x0125 }, /* hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */ - { 0x02b9, 0x0131 }, /* idotless ı LATIN SMALL LETTER DOTLESS I */ - { 0x02bb, 0x011f }, /* gbreve ğ LATIN SMALL LETTER G WITH BREVE */ - { 0x02bc, 0x0135 }, /* jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */ - { 0x02c5, 0x010a }, /* Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */ - { 0x02c6, 0x0108 }, /* Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ - { 0x02d5, 0x0120 }, /* Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */ - { 0x02d8, 0x011c }, /* Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ - { 0x02dd, 0x016c }, /* Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */ - { 0x02de, 0x015c }, /* Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ - { 0x02e5, 0x010b }, /* cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */ - { 0x02e6, 0x0109 }, /* ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */ - { 0x02f5, 0x0121 }, /* gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */ - { 0x02f8, 0x011d }, /* gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */ - { 0x02fd, 0x016d }, /* ubreve ŭ LATIN SMALL LETTER U WITH BREVE */ - { 0x02fe, 0x015d }, /* scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */ - { 0x03a2, 0x0138 }, /* kra ĸ LATIN SMALL LETTER KRA */ - { 0x03a3, 0x0156 }, /* Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */ - { 0x03a5, 0x0128 }, /* Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */ - { 0x03a6, 0x013b }, /* Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */ - { 0x03aa, 0x0112 }, /* Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */ - { 0x03ab, 0x0122 }, /* Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */ - { 0x03ac, 0x0166 }, /* Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */ - { 0x03b3, 0x0157 }, /* rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */ - { 0x03b5, 0x0129 }, /* itilde ĩ LATIN SMALL LETTER I WITH TILDE */ - { 0x03b6, 0x013c }, /* lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */ - { 0x03ba, 0x0113 }, /* emacron ē LATIN SMALL LETTER E WITH MACRON */ - { 0x03bb, 0x0123 }, /* gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */ - { 0x03bc, 0x0167 }, /* tslash ŧ LATIN SMALL LETTER T WITH STROKE */ - { 0x03bd, 0x014a }, /* ENG Ŋ LATIN CAPITAL LETTER ENG */ - { 0x03bf, 0x014b }, /* eng ŋ LATIN SMALL LETTER ENG */ - { 0x03c0, 0x0100 }, /* Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */ - { 0x03c7, 0x012e }, /* Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */ - { 0x03cc, 0x0116 }, /* Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */ - { 0x03cf, 0x012a }, /* Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */ - { 0x03d1, 0x0145 }, /* Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */ - { 0x03d2, 0x014c }, /* Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */ - { 0x03d3, 0x0136 }, /* Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */ - { 0x03d9, 0x0172 }, /* Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */ - { 0x03dd, 0x0168 }, /* Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */ - { 0x03de, 0x016a }, /* Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */ - { 0x03e0, 0x0101 }, /* amacron ā LATIN SMALL LETTER A WITH MACRON */ - { 0x03e7, 0x012f }, /* iogonek į LATIN SMALL LETTER I WITH OGONEK */ - { 0x03ec, 0x0117 }, /* eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */ - { 0x03ef, 0x012b }, /* imacron ī LATIN SMALL LETTER I WITH MACRON */ - { 0x03f1, 0x0146 }, /* ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */ - { 0x03f2, 0x014d }, /* omacron ō LATIN SMALL LETTER O WITH MACRON */ - { 0x03f3, 0x0137 }, /* kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */ - { 0x03f9, 0x0173 }, /* uogonek ų LATIN SMALL LETTER U WITH OGONEK */ - { 0x03fd, 0x0169 }, /* utilde ũ LATIN SMALL LETTER U WITH TILDE */ - { 0x03fe, 0x016b }, /* umacron ū LATIN SMALL LETTER U WITH MACRON */ - { 0x047e, 0x203e }, /* overline ‾ OVERLINE */ - { 0x04a1, 0x3002 }, /* kana_fullstop 。 IDEOGRAPHIC FULL STOP */ - { 0x04a2, 0x300c }, /* kana_openingbracket 「 LEFT CORNER BRACKET */ - { 0x04a3, 0x300d }, /* kana_closingbracket 」 RIGHT CORNER BRACKET */ - { 0x04a4, 0x3001 }, /* kana_comma 、 IDEOGRAPHIC COMMA */ - { 0x04a5, 0x30fb }, /* kana_conjunctive ・ KATAKANA MIDDLE DOT */ - { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */ - { 0x04a7, 0x30a1 }, /* kana_a ァ KATAKANA LETTER SMALL A */ - { 0x04a8, 0x30a3 }, /* kana_i ィ KATAKANA LETTER SMALL I */ - { 0x04a9, 0x30a5 }, /* kana_u ゥ KATAKANA LETTER SMALL U */ - { 0x04aa, 0x30a7 }, /* kana_e ェ KATAKANA LETTER SMALL E */ - { 0x04ab, 0x30a9 }, /* kana_o ォ KATAKANA LETTER SMALL O */ - { 0x04ac, 0x30e3 }, /* kana_ya ャ KATAKANA LETTER SMALL YA */ - { 0x04ad, 0x30e5 }, /* kana_yu ュ KATAKANA LETTER SMALL YU */ - { 0x04ae, 0x30e7 }, /* kana_yo ョ KATAKANA LETTER SMALL YO */ - { 0x04af, 0x30c3 }, /* kana_tsu ッ KATAKANA LETTER SMALL TU */ - { 0x04b0, 0x30fc }, /* prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */ - { 0x04b1, 0x30a2 }, /* kana_A ア KATAKANA LETTER A */ - { 0x04b2, 0x30a4 }, /* kana_I イ KATAKANA LETTER I */ - { 0x04b3, 0x30a6 }, /* kana_U ウ KATAKANA LETTER U */ - { 0x04b4, 0x30a8 }, /* kana_E エ KATAKANA LETTER E */ - { 0x04b5, 0x30aa }, /* kana_O オ KATAKANA LETTER O */ - { 0x04b6, 0x30ab }, /* kana_KA カ KATAKANA LETTER KA */ - { 0x04b7, 0x30ad }, /* kana_KI キ KATAKANA LETTER KI */ - { 0x04b8, 0x30af }, /* kana_KU ク KATAKANA LETTER KU */ - { 0x04b9, 0x30b1 }, /* kana_KE ケ KATAKANA LETTER KE */ - { 0x04ba, 0x30b3 }, /* kana_KO コ KATAKANA LETTER KO */ - { 0x04bb, 0x30b5 }, /* kana_SA サ KATAKANA LETTER SA */ - { 0x04bc, 0x30b7 }, /* kana_SHI シ KATAKANA LETTER SI */ - { 0x04bd, 0x30b9 }, /* kana_SU ス KATAKANA LETTER SU */ - { 0x04be, 0x30bb }, /* kana_SE セ KATAKANA LETTER SE */ - { 0x04bf, 0x30bd }, /* kana_SO ソ KATAKANA LETTER SO */ - { 0x04c0, 0x30bf }, /* kana_TA タ KATAKANA LETTER TA */ - { 0x04c1, 0x30c1 }, /* kana_CHI チ KATAKANA LETTER TI */ - { 0x04c2, 0x30c4 }, /* kana_TSU ツ KATAKANA LETTER TU */ - { 0x04c3, 0x30c6 }, /* kana_TE テ KATAKANA LETTER TE */ - { 0x04c4, 0x30c8 }, /* kana_TO ト KATAKANA LETTER TO */ - { 0x04c5, 0x30ca }, /* kana_NA ナ KATAKANA LETTER NA */ - { 0x04c6, 0x30cb }, /* kana_NI ニ KATAKANA LETTER NI */ - { 0x04c7, 0x30cc }, /* kana_NU ヌ KATAKANA LETTER NU */ - { 0x04c8, 0x30cd }, /* kana_NE ネ KATAKANA LETTER NE */ - { 0x04c9, 0x30ce }, /* kana_NO ノ KATAKANA LETTER NO */ - { 0x04ca, 0x30cf }, /* kana_HA ハ KATAKANA LETTER HA */ - { 0x04cb, 0x30d2 }, /* kana_HI ヒ KATAKANA LETTER HI */ - { 0x04cc, 0x30d5 }, /* kana_FU フ KATAKANA LETTER HU */ - { 0x04cd, 0x30d8 }, /* kana_HE ヘ KATAKANA LETTER HE */ - { 0x04ce, 0x30db }, /* kana_HO ホ KATAKANA LETTER HO */ - { 0x04cf, 0x30de }, /* kana_MA マ KATAKANA LETTER MA */ - { 0x04d0, 0x30df }, /* kana_MI ミ KATAKANA LETTER MI */ - { 0x04d1, 0x30e0 }, /* kana_MU ム KATAKANA LETTER MU */ - { 0x04d2, 0x30e1 }, /* kana_ME メ KATAKANA LETTER ME */ - { 0x04d3, 0x30e2 }, /* kana_MO モ KATAKANA LETTER MO */ - { 0x04d4, 0x30e4 }, /* kana_YA ヤ KATAKANA LETTER YA */ - { 0x04d5, 0x30e6 }, /* kana_YU ユ KATAKANA LETTER YU */ - { 0x04d6, 0x30e8 }, /* kana_YO ヨ KATAKANA LETTER YO */ - { 0x04d7, 0x30e9 }, /* kana_RA ラ KATAKANA LETTER RA */ - { 0x04d8, 0x30ea }, /* kana_RI リ KATAKANA LETTER RI */ - { 0x04d9, 0x30eb }, /* kana_RU ル KATAKANA LETTER RU */ - { 0x04da, 0x30ec }, /* kana_RE レ KATAKANA LETTER RE */ - { 0x04db, 0x30ed }, /* kana_RO ロ KATAKANA LETTER RO */ - { 0x04dc, 0x30ef }, /* kana_WA ワ KATAKANA LETTER WA */ - { 0x04dd, 0x30f3 }, /* kana_N ン KATAKANA LETTER N */ - { 0x04de, 0x309b }, /* voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */ - { 0x04df, 0x309c }, /* semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ - { 0x05ac, 0x060c }, /* Arabic_comma ، ARABIC COMMA */ - { 0x05bb, 0x061b }, /* Arabic_semicolon ؛ ARABIC SEMICOLON */ - { 0x05bf, 0x061f }, /* Arabic_question_mark ؟ ARABIC QUESTION MARK */ - { 0x05c1, 0x0621 }, /* Arabic_hamza ء ARABIC LETTER HAMZA */ - { 0x05c2, 0x0622 }, /* Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */ - { 0x05c3, 0x0623 }, /* Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */ - { 0x05c4, 0x0624 }, /* Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */ - { 0x05c5, 0x0625 }, /* Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */ - { 0x05c6, 0x0626 }, /* Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */ - { 0x05c7, 0x0627 }, /* Arabic_alef ا ARABIC LETTER ALEF */ - { 0x05c8, 0x0628 }, /* Arabic_beh ب ARABIC LETTER BEH */ - { 0x05c9, 0x0629 }, /* Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */ - { 0x05ca, 0x062a }, /* Arabic_teh ت ARABIC LETTER TEH */ - { 0x05cb, 0x062b }, /* Arabic_theh ث ARABIC LETTER THEH */ - { 0x05cc, 0x062c }, /* Arabic_jeem ج ARABIC LETTER JEEM */ - { 0x05cd, 0x062d }, /* Arabic_hah ح ARABIC LETTER HAH */ - { 0x05ce, 0x062e }, /* Arabic_khah خ ARABIC LETTER KHAH */ - { 0x05cf, 0x062f }, /* Arabic_dal د ARABIC LETTER DAL */ - { 0x05d0, 0x0630 }, /* Arabic_thal ذ ARABIC LETTER THAL */ - { 0x05d1, 0x0631 }, /* Arabic_ra ر ARABIC LETTER REH */ - { 0x05d2, 0x0632 }, /* Arabic_zain ز ARABIC LETTER ZAIN */ - { 0x05d3, 0x0633 }, /* Arabic_seen س ARABIC LETTER SEEN */ - { 0x05d4, 0x0634 }, /* Arabic_sheen ش ARABIC LETTER SHEEN */ - { 0x05d5, 0x0635 }, /* Arabic_sad ص ARABIC LETTER SAD */ - { 0x05d6, 0x0636 }, /* Arabic_dad ض ARABIC LETTER DAD */ - { 0x05d7, 0x0637 }, /* Arabic_tah ط ARABIC LETTER TAH */ - { 0x05d8, 0x0638 }, /* Arabic_zah ظ ARABIC LETTER ZAH */ - { 0x05d9, 0x0639 }, /* Arabic_ain ع ARABIC LETTER AIN */ - { 0x05da, 0x063a }, /* Arabic_ghain غ ARABIC LETTER GHAIN */ - { 0x05e0, 0x0640 }, /* Arabic_tatweel ـ ARABIC TATWEEL */ - { 0x05e1, 0x0641 }, /* Arabic_feh ف ARABIC LETTER FEH */ - { 0x05e2, 0x0642 }, /* Arabic_qaf ق ARABIC LETTER QAF */ - { 0x05e3, 0x0643 }, /* Arabic_kaf ك ARABIC LETTER KAF */ - { 0x05e4, 0x0644 }, /* Arabic_lam ل ARABIC LETTER LAM */ - { 0x05e5, 0x0645 }, /* Arabic_meem م ARABIC LETTER MEEM */ - { 0x05e6, 0x0646 }, /* Arabic_noon ن ARABIC LETTER NOON */ - { 0x05e7, 0x0647 }, /* Arabic_ha ه ARABIC LETTER HEH */ - { 0x05e8, 0x0648 }, /* Arabic_waw و ARABIC LETTER WAW */ - { 0x05e9, 0x0649 }, /* Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */ - { 0x05ea, 0x064a }, /* Arabic_yeh ي ARABIC LETTER YEH */ - { 0x05eb, 0x064b }, /* Arabic_fathatan ً ARABIC FATHATAN */ - { 0x05ec, 0x064c }, /* Arabic_dammatan ٌ ARABIC DAMMATAN */ - { 0x05ed, 0x064d }, /* Arabic_kasratan ٍ ARABIC KASRATAN */ - { 0x05ee, 0x064e }, /* Arabic_fatha َ ARABIC FATHA */ - { 0x05ef, 0x064f }, /* Arabic_damma ُ ARABIC DAMMA */ - { 0x05f0, 0x0650 }, /* Arabic_kasra ِ ARABIC KASRA */ - { 0x05f1, 0x0651 }, /* Arabic_shadda ّ ARABIC SHADDA */ - { 0x05f2, 0x0652 }, /* Arabic_sukun ْ ARABIC SUKUN */ - { 0x06a1, 0x0452 }, /* Serbian_dje ђ CYRILLIC SMALL LETTER DJE */ - { 0x06a2, 0x0453 }, /* Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */ - { 0x06a3, 0x0451 }, /* Cyrillic_io ё CYRILLIC SMALL LETTER IO */ - { 0x06a4, 0x0454 }, /* Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */ - { 0x06a5, 0x0455 }, /* Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */ - { 0x06a6, 0x0456 }, /* Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ - { 0x06a7, 0x0457 }, /* Ukrainian_yi ї CYRILLIC SMALL LETTER YI */ - { 0x06a8, 0x0458 }, /* Cyrillic_je ј CYRILLIC SMALL LETTER JE */ - { 0x06a9, 0x0459 }, /* Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */ - { 0x06aa, 0x045a }, /* Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */ - { 0x06ab, 0x045b }, /* Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */ - { 0x06ac, 0x045c }, /* Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */ - { 0x06ad, 0x0491 }, /* Ukrainian_ghe_with_upturn ґ CYRILLIC SMALL LETTER GHE WITH UPTURN */ - { 0x06ae, 0x045e }, /* Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */ - { 0x06af, 0x045f }, /* Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */ - { 0x06b0, 0x2116 }, /* numerosign № NUMERO SIGN */ - { 0x06b1, 0x0402 }, /* Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */ - { 0x06b2, 0x0403 }, /* Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */ - { 0x06b3, 0x0401 }, /* Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */ - { 0x06b4, 0x0404 }, /* Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */ - { 0x06b5, 0x0405 }, /* Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */ - { 0x06b6, 0x0406 }, /* Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ - { 0x06b7, 0x0407 }, /* Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */ - { 0x06b8, 0x0408 }, /* Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */ - { 0x06b9, 0x0409 }, /* Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */ - { 0x06ba, 0x040a }, /* Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */ - { 0x06bb, 0x040b }, /* Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */ - { 0x06bc, 0x040c }, /* Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */ - { 0x06bd, 0x0490 }, /* Ukrainian_GHE_WITH_UPTURN Ґ CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ - { 0x06be, 0x040e }, /* Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */ - { 0x06bf, 0x040f }, /* Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */ - { 0x06c0, 0x044e }, /* Cyrillic_yu ю CYRILLIC SMALL LETTER YU */ - { 0x06c1, 0x0430 }, /* Cyrillic_a а CYRILLIC SMALL LETTER A */ - { 0x06c2, 0x0431 }, /* Cyrillic_be б CYRILLIC SMALL LETTER BE */ - { 0x06c3, 0x0446 }, /* Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */ - { 0x06c4, 0x0434 }, /* Cyrillic_de д CYRILLIC SMALL LETTER DE */ - { 0x06c5, 0x0435 }, /* Cyrillic_ie е CYRILLIC SMALL LETTER IE */ - { 0x06c6, 0x0444 }, /* Cyrillic_ef ф CYRILLIC SMALL LETTER EF */ - { 0x06c7, 0x0433 }, /* Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */ - { 0x06c8, 0x0445 }, /* Cyrillic_ha х CYRILLIC SMALL LETTER HA */ - { 0x06c9, 0x0438 }, /* Cyrillic_i и CYRILLIC SMALL LETTER I */ - { 0x06ca, 0x0439 }, /* Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */ - { 0x06cb, 0x043a }, /* Cyrillic_ka к CYRILLIC SMALL LETTER KA */ - { 0x06cc, 0x043b }, /* Cyrillic_el л CYRILLIC SMALL LETTER EL */ - { 0x06cd, 0x043c }, /* Cyrillic_em м CYRILLIC SMALL LETTER EM */ - { 0x06ce, 0x043d }, /* Cyrillic_en н CYRILLIC SMALL LETTER EN */ - { 0x06cf, 0x043e }, /* Cyrillic_o о CYRILLIC SMALL LETTER O */ - { 0x06d0, 0x043f }, /* Cyrillic_pe п CYRILLIC SMALL LETTER PE */ - { 0x06d1, 0x044f }, /* Cyrillic_ya я CYRILLIC SMALL LETTER YA */ - { 0x06d2, 0x0440 }, /* Cyrillic_er р CYRILLIC SMALL LETTER ER */ - { 0x06d3, 0x0441 }, /* Cyrillic_es с CYRILLIC SMALL LETTER ES */ - { 0x06d4, 0x0442 }, /* Cyrillic_te т CYRILLIC SMALL LETTER TE */ - { 0x06d5, 0x0443 }, /* Cyrillic_u у CYRILLIC SMALL LETTER U */ - { 0x06d6, 0x0436 }, /* Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */ - { 0x06d7, 0x0432 }, /* Cyrillic_ve в CYRILLIC SMALL LETTER VE */ - { 0x06d8, 0x044c }, /* Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */ - { 0x06d9, 0x044b }, /* Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */ - { 0x06da, 0x0437 }, /* Cyrillic_ze з CYRILLIC SMALL LETTER ZE */ - { 0x06db, 0x0448 }, /* Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */ - { 0x06dc, 0x044d }, /* Cyrillic_e э CYRILLIC SMALL LETTER E */ - { 0x06dd, 0x0449 }, /* Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */ - { 0x06de, 0x0447 }, /* Cyrillic_che ч CYRILLIC SMALL LETTER CHE */ - { 0x06df, 0x044a }, /* Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */ - { 0x06e0, 0x042e }, /* Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */ - { 0x06e1, 0x0410 }, /* Cyrillic_A А CYRILLIC CAPITAL LETTER A */ - { 0x06e2, 0x0411 }, /* Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */ - { 0x06e3, 0x0426 }, /* Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */ - { 0x06e4, 0x0414 }, /* Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */ - { 0x06e5, 0x0415 }, /* Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */ - { 0x06e6, 0x0424 }, /* Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */ - { 0x06e7, 0x0413 }, /* Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */ - { 0x06e8, 0x0425 }, /* Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */ - { 0x06e9, 0x0418 }, /* Cyrillic_I И CYRILLIC CAPITAL LETTER I */ - { 0x06ea, 0x0419 }, /* Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */ - { 0x06eb, 0x041a }, /* Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */ - { 0x06ec, 0x041b }, /* Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */ - { 0x06ed, 0x041c }, /* Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */ - { 0x06ee, 0x041d }, /* Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */ - { 0x06ef, 0x041e }, /* Cyrillic_O О CYRILLIC CAPITAL LETTER O */ - { 0x06f0, 0x041f }, /* Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */ - { 0x06f1, 0x042f }, /* Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */ - { 0x06f2, 0x0420 }, /* Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */ - { 0x06f3, 0x0421 }, /* Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */ - { 0x06f4, 0x0422 }, /* Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */ - { 0x06f5, 0x0423 }, /* Cyrillic_U У CYRILLIC CAPITAL LETTER U */ - { 0x06f6, 0x0416 }, /* Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */ - { 0x06f7, 0x0412 }, /* Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */ - { 0x06f8, 0x042c }, /* Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */ - { 0x06f9, 0x042b }, /* Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */ - { 0x06fa, 0x0417 }, /* Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */ - { 0x06fb, 0x0428 }, /* Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */ - { 0x06fc, 0x042d }, /* Cyrillic_E Э CYRILLIC CAPITAL LETTER E */ - { 0x06fd, 0x0429 }, /* Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */ - { 0x06fe, 0x0427 }, /* Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */ - { 0x06ff, 0x042a }, /* Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */ - { 0x07a1, 0x0386 }, /* Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */ - { 0x07a2, 0x0388 }, /* Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */ - { 0x07a3, 0x0389 }, /* Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */ - { 0x07a4, 0x038a }, /* Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */ - { 0x07a5, 0x03aa }, /* Greek_IOTAdiaeresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ - { 0x07a7, 0x038c }, /* Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */ - { 0x07a8, 0x038e }, /* Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */ - { 0x07a9, 0x03ab }, /* Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ - { 0x07ab, 0x038f }, /* Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */ - { 0x07ae, 0x0385 }, /* Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */ - { 0x07af, 0x2015 }, /* Greek_horizbar ― HORIZONTAL BAR */ - { 0x07b1, 0x03ac }, /* Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */ - { 0x07b2, 0x03ad }, /* Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */ - { 0x07b3, 0x03ae }, /* Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */ - { 0x07b4, 0x03af }, /* Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */ - { 0x07b5, 0x03ca }, /* Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */ - { 0x07b6, 0x0390 }, /* Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ - { 0x07b7, 0x03cc }, /* Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */ - { 0x07b8, 0x03cd }, /* Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */ - { 0x07b9, 0x03cb }, /* Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ - { 0x07ba, 0x03b0 }, /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ - { 0x07bb, 0x03ce }, /* Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */ - { 0x07c1, 0x0391 }, /* Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */ - { 0x07c2, 0x0392 }, /* Greek_BETA Β GREEK CAPITAL LETTER BETA */ - { 0x07c3, 0x0393 }, /* Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */ - { 0x07c4, 0x0394 }, /* Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */ - { 0x07c5, 0x0395 }, /* Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */ - { 0x07c6, 0x0396 }, /* Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */ - { 0x07c7, 0x0397 }, /* Greek_ETA Η GREEK CAPITAL LETTER ETA */ - { 0x07c8, 0x0398 }, /* Greek_THETA Θ GREEK CAPITAL LETTER THETA */ - { 0x07c9, 0x0399 }, /* Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */ - { 0x07ca, 0x039a }, /* Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */ - { 0x07cb, 0x039b }, /* Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */ - { 0x07cc, 0x039c }, /* Greek_MU Μ GREEK CAPITAL LETTER MU */ - { 0x07cd, 0x039d }, /* Greek_NU Ν GREEK CAPITAL LETTER NU */ - { 0x07ce, 0x039e }, /* Greek_XI Ξ GREEK CAPITAL LETTER XI */ - { 0x07cf, 0x039f }, /* Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */ - { 0x07d0, 0x03a0 }, /* Greek_PI Π GREEK CAPITAL LETTER PI */ - { 0x07d1, 0x03a1 }, /* Greek_RHO Ρ GREEK CAPITAL LETTER RHO */ - { 0x07d2, 0x03a3 }, /* Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */ - { 0x07d4, 0x03a4 }, /* Greek_TAU Τ GREEK CAPITAL LETTER TAU */ - { 0x07d5, 0x03a5 }, /* Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */ - { 0x07d6, 0x03a6 }, /* Greek_PHI Φ GREEK CAPITAL LETTER PHI */ - { 0x07d7, 0x03a7 }, /* Greek_CHI Χ GREEK CAPITAL LETTER CHI */ - { 0x07d8, 0x03a8 }, /* Greek_PSI Ψ GREEK CAPITAL LETTER PSI */ - { 0x07d9, 0x03a9 }, /* Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */ - { 0x07e1, 0x03b1 }, /* Greek_alpha α GREEK SMALL LETTER ALPHA */ - { 0x07e2, 0x03b2 }, /* Greek_beta β GREEK SMALL LETTER BETA */ - { 0x07e3, 0x03b3 }, /* Greek_gamma γ GREEK SMALL LETTER GAMMA */ - { 0x07e4, 0x03b4 }, /* Greek_delta δ GREEK SMALL LETTER DELTA */ - { 0x07e5, 0x03b5 }, /* Greek_epsilon ε GREEK SMALL LETTER EPSILON */ - { 0x07e6, 0x03b6 }, /* Greek_zeta ζ GREEK SMALL LETTER ZETA */ - { 0x07e7, 0x03b7 }, /* Greek_eta η GREEK SMALL LETTER ETA */ - { 0x07e8, 0x03b8 }, /* Greek_theta θ GREEK SMALL LETTER THETA */ - { 0x07e9, 0x03b9 }, /* Greek_iota ι GREEK SMALL LETTER IOTA */ - { 0x07ea, 0x03ba }, /* Greek_kappa κ GREEK SMALL LETTER KAPPA */ - { 0x07eb, 0x03bb }, /* Greek_lambda λ GREEK SMALL LETTER LAMDA */ - { 0x07ec, 0x03bc }, /* Greek_mu μ GREEK SMALL LETTER MU */ - { 0x07ed, 0x03bd }, /* Greek_nu ν GREEK SMALL LETTER NU */ - { 0x07ee, 0x03be }, /* Greek_xi ξ GREEK SMALL LETTER XI */ - { 0x07ef, 0x03bf }, /* Greek_omicron ο GREEK SMALL LETTER OMICRON */ - { 0x07f0, 0x03c0 }, /* Greek_pi π GREEK SMALL LETTER PI */ - { 0x07f1, 0x03c1 }, /* Greek_rho ρ GREEK SMALL LETTER RHO */ - { 0x07f2, 0x03c3 }, /* Greek_sigma σ GREEK SMALL LETTER SIGMA */ - { 0x07f3, 0x03c2 }, /* Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */ - { 0x07f4, 0x03c4 }, /* Greek_tau τ GREEK SMALL LETTER TAU */ - { 0x07f5, 0x03c5 }, /* Greek_upsilon υ GREEK SMALL LETTER UPSILON */ - { 0x07f6, 0x03c6 }, /* Greek_phi φ GREEK SMALL LETTER PHI */ - { 0x07f7, 0x03c7 }, /* Greek_chi χ GREEK SMALL LETTER CHI */ - { 0x07f8, 0x03c8 }, /* Greek_psi ψ GREEK SMALL LETTER PSI */ - { 0x07f9, 0x03c9 }, /* Greek_omega ω GREEK SMALL LETTER OMEGA */ - { 0x08a1, 0x23b7 }, /* leftradical ⎷ ??? */ - { 0x08a2, 0x250c }, /* topleftradical ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ - { 0x08a3, 0x2500 }, /* horizconnector ─ BOX DRAWINGS LIGHT HORIZONTAL */ - { 0x08a4, 0x2320 }, /* topintegral ⌠ TOP HALF INTEGRAL */ - { 0x08a5, 0x2321 }, /* botintegral ⌡ BOTTOM HALF INTEGRAL */ - { 0x08a6, 0x2502 }, /* vertconnector │ BOX DRAWINGS LIGHT VERTICAL */ - { 0x08a7, 0x23a1 }, /* topleftsqbracket ⎡ ??? */ - { 0x08a8, 0x23a3 }, /* botleftsqbracket ⎣ ??? */ - { 0x08a9, 0x23a4 }, /* toprightsqbracket ⎤ ??? */ - { 0x08aa, 0x23a6 }, /* botrightsqbracket ⎦ ??? */ - { 0x08ab, 0x239b }, /* topleftparens ⎛ ??? */ - { 0x08ac, 0x239d }, /* botleftparens ⎝ ??? */ - { 0x08ad, 0x239e }, /* toprightparens ⎞ ??? */ - { 0x08ae, 0x23a0 }, /* botrightparens ⎠ ??? */ - { 0x08af, 0x23a8 }, /* leftmiddlecurlybrace ⎨ ??? */ - { 0x08b0, 0x23ac }, /* rightmiddlecurlybrace ⎬ ??? */ - /* 0x08b1 topleftsummation ? ??? */ - /* 0x08b2 botleftsummation ? ??? */ - /* 0x08b3 topvertsummationconnector ? ??? */ - /* 0x08b4 botvertsummationconnector ? ??? */ - /* 0x08b5 toprightsummation ? ??? */ - /* 0x08b6 botrightsummation ? ??? */ - /* 0x08b7 rightmiddlesummation ? ??? */ - { 0x08bc, 0x2264 }, /* lessthanequal ≤ LESS-THAN OR EQUAL TO */ - { 0x08bd, 0x2260 }, /* notequal ≠ NOT EQUAL TO */ - { 0x08be, 0x2265 }, /* greaterthanequal ≥ GREATER-THAN OR EQUAL TO */ - { 0x08bf, 0x222b }, /* integral ∫ INTEGRAL */ - { 0x08c0, 0x2234 }, /* therefore ∴ THEREFORE */ - { 0x08c1, 0x221d }, /* variation ∝ PROPORTIONAL TO */ - { 0x08c2, 0x221e }, /* infinity ∞ INFINITY */ - { 0x08c5, 0x2207 }, /* nabla ∇ NABLA */ - { 0x08c8, 0x223c }, /* approximate ∼ TILDE OPERATOR */ - { 0x08c9, 0x2243 }, /* similarequal ≃ ASYMPTOTICALLY EQUAL TO */ - { 0x08cd, 0x21d4 }, /* ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */ - { 0x08ce, 0x21d2 }, /* implies ⇒ RIGHTWARDS DOUBLE ARROW */ - { 0x08cf, 0x2261 }, /* identical ≡ IDENTICAL TO */ - { 0x08d6, 0x221a }, /* radical √ SQUARE ROOT */ - { 0x08da, 0x2282 }, /* includedin ⊂ SUBSET OF */ - { 0x08db, 0x2283 }, /* includes ⊃ SUPERSET OF */ - { 0x08dc, 0x2229 }, /* intersection ∩ INTERSECTION */ - { 0x08dd, 0x222a }, /* union ∪ UNION */ - { 0x08de, 0x2227 }, /* logicaland ∧ LOGICAL AND */ - { 0x08df, 0x2228 }, /* logicalor ∨ LOGICAL OR */ - { 0x08ef, 0x2202 }, /* partialderivative ∂ PARTIAL DIFFERENTIAL */ - { 0x08f6, 0x0192 }, /* function ƒ LATIN SMALL LETTER F WITH HOOK */ - { 0x08fb, 0x2190 }, /* leftarrow ← LEFTWARDS ARROW */ - { 0x08fc, 0x2191 }, /* uparrow ↑ UPWARDS ARROW */ - { 0x08fd, 0x2192 }, /* rightarrow → RIGHTWARDS ARROW */ - { 0x08fe, 0x2193 }, /* downarrow ↓ DOWNWARDS ARROW */ -/* 0x09df blank ? ??? */ - { 0x09e0, 0x25c6 }, /* soliddiamond ◆ BLACK DIAMOND */ - { 0x09e1, 0x2592 }, /* checkerboard ▒ MEDIUM SHADE */ - { 0x09e2, 0x2409 }, /* ht ␉ SYMBOL FOR HORIZONTAL TABULATION */ - { 0x09e3, 0x240c }, /* ff ␌ SYMBOL FOR FORM FEED */ - { 0x09e4, 0x240d }, /* cr ␍ SYMBOL FOR CARRIAGE RETURN */ - { 0x09e5, 0x240a }, /* lf ␊ SYMBOL FOR LINE FEED */ - { 0x09e8, 0x2424 }, /* nl  SYMBOL FOR NEWLINE */ - { 0x09e9, 0x240b }, /* vt ␋ SYMBOL FOR VERTICAL TABULATION */ - { 0x09ea, 0x2518 }, /* lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */ - { 0x09eb, 0x2510 }, /* uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */ - { 0x09ec, 0x250c }, /* upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ - { 0x09ed, 0x2514 }, /* lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */ - { 0x09ee, 0x253c }, /* crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ - { 0x09ef, 0x23ba }, /* horizlinescan1 ⎺ HORIZONTAL SCAN LINE-1 (Unicode 3.2 draft) */ - { 0x09f0, 0x23bb }, /* horizlinescan3 ⎻ HORIZONTAL SCAN LINE-3 (Unicode 3.2 draft) */ - { 0x09f1, 0x2500 }, /* horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */ - { 0x09f2, 0x23bc }, /* horizlinescan7 ⎼ HORIZONTAL SCAN LINE-7 (Unicode 3.2 draft) */ - { 0x09f3, 0x23bd }, /* horizlinescan9 ⎽ HORIZONTAL SCAN LINE-9 (Unicode 3.2 draft) */ - { 0x09f4, 0x251c }, /* leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ - { 0x09f5, 0x2524 }, /* rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */ - { 0x09f6, 0x2534 }, /* bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */ - { 0x09f7, 0x252c }, /* topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ - { 0x09f8, 0x2502 }, /* vertbar │ BOX DRAWINGS LIGHT VERTICAL */ - { 0x0aa1, 0x2003 }, /* emspace EM SPACE */ - { 0x0aa2, 0x2002 }, /* enspace EN SPACE */ - { 0x0aa3, 0x2004 }, /* em3space THREE-PER-EM SPACE */ - { 0x0aa4, 0x2005 }, /* em4space FOUR-PER-EM SPACE */ - { 0x0aa5, 0x2007 }, /* digitspace FIGURE SPACE */ - { 0x0aa6, 0x2008 }, /* punctspace PUNCTUATION SPACE */ - { 0x0aa7, 0x2009 }, /* thinspace THIN SPACE */ - { 0x0aa8, 0x200a }, /* hairspace HAIR SPACE */ - { 0x0aa9, 0x2014 }, /* emdash — EM DASH */ - { 0x0aaa, 0x2013 }, /* endash – EN DASH */ - { 0x0aac, 0x2423 }, /* signifblank ␣ OPEN BOX */ - { 0x0aae, 0x2026 }, /* ellipsis … HORIZONTAL ELLIPSIS */ - { 0x0aaf, 0x2025 }, /* doubbaselinedot ‥ TWO DOT LEADER */ - { 0x0ab0, 0x2153 }, /* onethird ⅓ VULGAR FRACTION ONE THIRD */ - { 0x0ab1, 0x2154 }, /* twothirds ⅔ VULGAR FRACTION TWO THIRDS */ - { 0x0ab2, 0x2155 }, /* onefifth ⅕ VULGAR FRACTION ONE FIFTH */ - { 0x0ab3, 0x2156 }, /* twofifths ⅖ VULGAR FRACTION TWO FIFTHS */ - { 0x0ab4, 0x2157 }, /* threefifths ⅗ VULGAR FRACTION THREE FIFTHS */ - { 0x0ab5, 0x2158 }, /* fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */ - { 0x0ab6, 0x2159 }, /* onesixth ⅙ VULGAR FRACTION ONE SIXTH */ - { 0x0ab7, 0x215a }, /* fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */ - { 0x0ab8, 0x2105 }, /* careof ℅ CARE OF */ - { 0x0abb, 0x2012 }, /* figdash ‒ FIGURE DASH */ - { 0x0abc, 0x27e8 }, /* leftanglebracket ⟨ MATHEMATICAL LEFT ANGLE BRACKET */ - { 0x0abd, 0x002e }, /* decimalpoint . FULL STOP */ - { 0x0abe, 0x27e9 }, /* rightanglebracket ⟩ MATHEMATICAL RIGHT ANGLE BRACKET */ - /* 0x0abf marker ? ??? */ - { 0x0ac3, 0x215b }, /* oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */ - { 0x0ac4, 0x215c }, /* threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */ - { 0x0ac5, 0x215d }, /* fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */ - { 0x0ac6, 0x215e }, /* seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */ - { 0x0ac9, 0x2122 }, /* trademark ™ TRADE MARK SIGN */ - { 0x0aca, 0x2613 }, /* signaturemark ☓ SALTIRE */ - /* 0x0acb trademarkincircle ? ??? */ - { 0x0acc, 0x25c1 }, /* leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */ - { 0x0acd, 0x25b7 }, /* rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */ - { 0x0ace, 0x25cb }, /* emopencircle ○ WHITE CIRCLE */ - { 0x0acf, 0x25af }, /* emopenrectangle ▯ WHITE VERTICAL RECTANGLE */ - { 0x0ad0, 0x2018 }, /* leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */ - { 0x0ad1, 0x2019 }, /* rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */ - { 0x0ad2, 0x201c }, /* leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */ - { 0x0ad3, 0x201d }, /* rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */ - { 0x0ad4, 0x211e }, /* prescription ℞ PRESCRIPTION TAKE */ - { 0x0ad5, 0x2030 }, /* permille ‰ PER MILLE SIGN */ - { 0x0ad6, 0x2032 }, /* minutes ′ PRIME */ - { 0x0ad7, 0x2033 }, /* seconds ″ DOUBLE PRIME */ - { 0x0ad9, 0x271d }, /* latincross ✝ LATIN CROSS */ - /* 0x0ada hexagram ? ??? */ - { 0x0adb, 0x25ac }, /* filledrectbullet ▬ BLACK RECTANGLE */ - { 0x0adc, 0x25c0 }, /* filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */ - { 0x0add, 0x25b6 }, /* filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */ - { 0x0ade, 0x25cf }, /* emfilledcircle ● BLACK CIRCLE */ - { 0x0adf, 0x25ae }, /* emfilledrect ▮ BLACK VERTICAL RECTANGLE */ - { 0x0ae0, 0x25e6 }, /* enopencircbullet ◦ WHITE BULLET */ - { 0x0ae1, 0x25ab }, /* enopensquarebullet ▫ WHITE SMALL SQUARE */ - { 0x0ae2, 0x25ad }, /* openrectbullet ▭ WHITE RECTANGLE */ - { 0x0ae3, 0x25b3 }, /* opentribulletup △ WHITE UP-POINTING TRIANGLE */ - { 0x0ae4, 0x25bd }, /* opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */ - { 0x0ae5, 0x2606 }, /* openstar ☆ WHITE STAR */ - { 0x0ae6, 0x2022 }, /* enfilledcircbullet • BULLET */ - { 0x0ae7, 0x25aa }, /* enfilledsqbullet ▪ BLACK SMALL SQUARE */ - { 0x0ae8, 0x25b2 }, /* filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */ - { 0x0ae9, 0x25bc }, /* filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */ - { 0x0aea, 0x261c }, /* leftpointer ☜ WHITE LEFT POINTING INDEX */ - { 0x0aeb, 0x261e }, /* rightpointer ☞ WHITE RIGHT POINTING INDEX */ - { 0x0aec, 0x2663 }, /* club ♣ BLACK CLUB SUIT */ - { 0x0aed, 0x2666 }, /* diamond ♦ BLACK DIAMOND SUIT */ - { 0x0aee, 0x2665 }, /* heart ♥ BLACK HEART SUIT */ - { 0x0af0, 0x2720 }, /* maltesecross ✠ MALTESE CROSS */ - { 0x0af1, 0x2020 }, /* dagger † DAGGER */ - { 0x0af2, 0x2021 }, /* doubledagger ‡ DOUBLE DAGGER */ - { 0x0af3, 0x2713 }, /* checkmark ✓ CHECK MARK */ - { 0x0af4, 0x2717 }, /* ballotcross ✗ BALLOT X */ - { 0x0af5, 0x266f }, /* musicalsharp ♯ MUSIC SHARP SIGN */ - { 0x0af6, 0x266d }, /* musicalflat ♭ MUSIC FLAT SIGN */ - { 0x0af7, 0x2642 }, /* malesymbol ♂ MALE SIGN */ - { 0x0af8, 0x2640 }, /* femalesymbol ♀ FEMALE SIGN */ - { 0x0af9, 0x260e }, /* telephone ☎ BLACK TELEPHONE */ - { 0x0afa, 0x2315 }, /* telephonerecorder ⌕ TELEPHONE RECORDER */ - { 0x0afb, 0x2117 }, /* phonographcopyright ℗ SOUND RECORDING COPYRIGHT */ - { 0x0afc, 0x2038 }, /* caret ‸ CARET */ - { 0x0afd, 0x201a }, /* singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */ - { 0x0afe, 0x201e }, /* doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */ - /* 0x0aff cursor ? ??? */ - { 0x0ba3, 0x003c }, /* leftcaret < LESS-THAN SIGN */ - { 0x0ba6, 0x003e }, /* rightcaret > GREATER-THAN SIGN */ - { 0x0ba8, 0x2228 }, /* downcaret ∨ LOGICAL OR */ - { 0x0ba9, 0x2227 }, /* upcaret ∧ LOGICAL AND */ - { 0x0bc0, 0x00af }, /* overbar ¯ MACRON */ - { 0x0bc2, 0x22a4 }, /* downtack ⊤ DOWN TACK */ - { 0x0bc3, 0x2229 }, /* upshoe ∩ INTERSECTION */ - { 0x0bc4, 0x230a }, /* downstile ⌊ LEFT FLOOR */ - { 0x0bc6, 0x005f }, /* underbar _ LOW LINE */ - { 0x0bca, 0x2218 }, /* jot ∘ RING OPERATOR */ - { 0x0bcc, 0x2395 }, /* quad ⎕ APL FUNCTIONAL SYMBOL QUAD (Unicode 3.0) */ - { 0x0bce, 0x22a5 }, /* uptack ⊥ UP TACK */ - { 0x0bcf, 0x25cb }, /* circle ○ WHITE CIRCLE */ - { 0x0bd3, 0x2308 }, /* upstile ⌈ LEFT CEILING */ - { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */ - { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */ - { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */ - { 0x0bdc, 0x22a2 }, /* lefttack ⊢ RIGHT TACK */ - { 0x0bfc, 0x22a3 }, /* righttack ⊣ LEFT TACK */ - { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */ - { 0x0ce0, 0x05d0 }, /* hebrew_aleph א HEBREW LETTER ALEF */ - { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */ - { 0x0ce2, 0x05d2 }, /* hebrew_gimel ג HEBREW LETTER GIMEL */ - { 0x0ce3, 0x05d3 }, /* hebrew_dalet ד HEBREW LETTER DALET */ - { 0x0ce4, 0x05d4 }, /* hebrew_he ה HEBREW LETTER HE */ - { 0x0ce5, 0x05d5 }, /* hebrew_waw ו HEBREW LETTER VAV */ - { 0x0ce6, 0x05d6 }, /* hebrew_zain ז HEBREW LETTER ZAYIN */ - { 0x0ce7, 0x05d7 }, /* hebrew_chet ח HEBREW LETTER HET */ - { 0x0ce8, 0x05d8 }, /* hebrew_tet ט HEBREW LETTER TET */ - { 0x0ce9, 0x05d9 }, /* hebrew_yod י HEBREW LETTER YOD */ - { 0x0cea, 0x05da }, /* hebrew_finalkaph ך HEBREW LETTER FINAL KAF */ - { 0x0ceb, 0x05db }, /* hebrew_kaph כ HEBREW LETTER KAF */ - { 0x0cec, 0x05dc }, /* hebrew_lamed ל HEBREW LETTER LAMED */ - { 0x0ced, 0x05dd }, /* hebrew_finalmem ם HEBREW LETTER FINAL MEM */ - { 0x0cee, 0x05de }, /* hebrew_mem מ HEBREW LETTER MEM */ - { 0x0cef, 0x05df }, /* hebrew_finalnun ן HEBREW LETTER FINAL NUN */ - { 0x0cf0, 0x05e0 }, /* hebrew_nun נ HEBREW LETTER NUN */ - { 0x0cf1, 0x05e1 }, /* hebrew_samech ס HEBREW LETTER SAMEKH */ - { 0x0cf2, 0x05e2 }, /* hebrew_ayin ע HEBREW LETTER AYIN */ - { 0x0cf3, 0x05e3 }, /* hebrew_finalpe ף HEBREW LETTER FINAL PE */ - { 0x0cf4, 0x05e4 }, /* hebrew_pe פ HEBREW LETTER PE */ - { 0x0cf5, 0x05e5 }, /* hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */ - { 0x0cf6, 0x05e6 }, /* hebrew_zade צ HEBREW LETTER TSADI */ - { 0x0cf7, 0x05e7 }, /* hebrew_qoph ק HEBREW LETTER QOF */ - { 0x0cf8, 0x05e8 }, /* hebrew_resh ר HEBREW LETTER RESH */ - { 0x0cf9, 0x05e9 }, /* hebrew_shin ש HEBREW LETTER SHIN */ - { 0x0cfa, 0x05ea }, /* hebrew_taw ת HEBREW LETTER TAV */ - { 0x0da1, 0x0e01 }, /* Thai_kokai ก THAI CHARACTER KO KAI */ - { 0x0da2, 0x0e02 }, /* Thai_khokhai ข THAI CHARACTER KHO KHAI */ - { 0x0da3, 0x0e03 }, /* Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */ - { 0x0da4, 0x0e04 }, /* Thai_khokhwai ค THAI CHARACTER KHO KHWAI */ - { 0x0da5, 0x0e05 }, /* Thai_khokhon ฅ THAI CHARACTER KHO KHON */ - { 0x0da6, 0x0e06 }, /* Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */ - { 0x0da7, 0x0e07 }, /* Thai_ngongu ง THAI CHARACTER NGO NGU */ - { 0x0da8, 0x0e08 }, /* Thai_chochan จ THAI CHARACTER CHO CHAN */ - { 0x0da9, 0x0e09 }, /* Thai_choching ฉ THAI CHARACTER CHO CHING */ - { 0x0daa, 0x0e0a }, /* Thai_chochang ช THAI CHARACTER CHO CHANG */ - { 0x0dab, 0x0e0b }, /* Thai_soso ซ THAI CHARACTER SO SO */ - { 0x0dac, 0x0e0c }, /* Thai_chochoe ฌ THAI CHARACTER CHO CHOE */ - { 0x0dad, 0x0e0d }, /* Thai_yoying ญ THAI CHARACTER YO YING */ - { 0x0dae, 0x0e0e }, /* Thai_dochada ฎ THAI CHARACTER DO CHADA */ - { 0x0daf, 0x0e0f }, /* Thai_topatak ฏ THAI CHARACTER TO PATAK */ - { 0x0db0, 0x0e10 }, /* Thai_thothan ฐ THAI CHARACTER THO THAN */ - { 0x0db1, 0x0e11 }, /* Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */ - { 0x0db2, 0x0e12 }, /* Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */ - { 0x0db3, 0x0e13 }, /* Thai_nonen ณ THAI CHARACTER NO NEN */ - { 0x0db4, 0x0e14 }, /* Thai_dodek ด THAI CHARACTER DO DEK */ - { 0x0db5, 0x0e15 }, /* Thai_totao ต THAI CHARACTER TO TAO */ - { 0x0db6, 0x0e16 }, /* Thai_thothung ถ THAI CHARACTER THO THUNG */ - { 0x0db7, 0x0e17 }, /* Thai_thothahan ท THAI CHARACTER THO THAHAN */ - { 0x0db8, 0x0e18 }, /* Thai_thothong ธ THAI CHARACTER THO THONG */ - { 0x0db9, 0x0e19 }, /* Thai_nonu น THAI CHARACTER NO NU */ - { 0x0dba, 0x0e1a }, /* Thai_bobaimai บ THAI CHARACTER BO BAIMAI */ - { 0x0dbb, 0x0e1b }, /* Thai_popla ป THAI CHARACTER PO PLA */ - { 0x0dbc, 0x0e1c }, /* Thai_phophung ผ THAI CHARACTER PHO PHUNG */ - { 0x0dbd, 0x0e1d }, /* Thai_fofa ฝ THAI CHARACTER FO FA */ - { 0x0dbe, 0x0e1e }, /* Thai_phophan พ THAI CHARACTER PHO PHAN */ - { 0x0dbf, 0x0e1f }, /* Thai_fofan ฟ THAI CHARACTER FO FAN */ - { 0x0dc0, 0x0e20 }, /* Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */ - { 0x0dc1, 0x0e21 }, /* Thai_moma ม THAI CHARACTER MO MA */ - { 0x0dc2, 0x0e22 }, /* Thai_yoyak ย THAI CHARACTER YO YAK */ - { 0x0dc3, 0x0e23 }, /* Thai_rorua ร THAI CHARACTER RO RUA */ - { 0x0dc4, 0x0e24 }, /* Thai_ru ฤ THAI CHARACTER RU */ - { 0x0dc5, 0x0e25 }, /* Thai_loling ล THAI CHARACTER LO LING */ - { 0x0dc6, 0x0e26 }, /* Thai_lu ฦ THAI CHARACTER LU */ - { 0x0dc7, 0x0e27 }, /* Thai_wowaen ว THAI CHARACTER WO WAEN */ - { 0x0dc8, 0x0e28 }, /* Thai_sosala ศ THAI CHARACTER SO SALA */ - { 0x0dc9, 0x0e29 }, /* Thai_sorusi ษ THAI CHARACTER SO RUSI */ - { 0x0dca, 0x0e2a }, /* Thai_sosua ส THAI CHARACTER SO SUA */ - { 0x0dcb, 0x0e2b }, /* Thai_hohip ห THAI CHARACTER HO HIP */ - { 0x0dcc, 0x0e2c }, /* Thai_lochula ฬ THAI CHARACTER LO CHULA */ - { 0x0dcd, 0x0e2d }, /* Thai_oang อ THAI CHARACTER O ANG */ - { 0x0dce, 0x0e2e }, /* Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */ - { 0x0dcf, 0x0e2f }, /* Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */ - { 0x0dd0, 0x0e30 }, /* Thai_saraa ะ THAI CHARACTER SARA A */ - { 0x0dd1, 0x0e31 }, /* Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */ - { 0x0dd2, 0x0e32 }, /* Thai_saraaa า THAI CHARACTER SARA AA */ - { 0x0dd3, 0x0e33 }, /* Thai_saraam ำ THAI CHARACTER SARA AM */ - { 0x0dd4, 0x0e34 }, /* Thai_sarai ิ THAI CHARACTER SARA I */ - { 0x0dd5, 0x0e35 }, /* Thai_saraii ี THAI CHARACTER SARA II */ - { 0x0dd6, 0x0e36 }, /* Thai_saraue ึ THAI CHARACTER SARA UE */ - { 0x0dd7, 0x0e37 }, /* Thai_sarauee ื THAI CHARACTER SARA UEE */ - { 0x0dd8, 0x0e38 }, /* Thai_sarau ุ THAI CHARACTER SARA U */ - { 0x0dd9, 0x0e39 }, /* Thai_sarauu ู THAI CHARACTER SARA UU */ - { 0x0dda, 0x0e3a }, /* Thai_phinthu ฺ THAI CHARACTER PHINTHU */ - { 0x0dde, 0x0e3e }, /* Thai_maihanakat_maitho ??? */ - { 0x0ddf, 0x0e3f }, /* Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */ - { 0x0de0, 0x0e40 }, /* Thai_sarae เ THAI CHARACTER SARA E */ - { 0x0de1, 0x0e41 }, /* Thai_saraae แ THAI CHARACTER SARA AE */ - { 0x0de2, 0x0e42 }, /* Thai_sarao โ THAI CHARACTER SARA O */ - { 0x0de3, 0x0e43 }, /* Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */ - { 0x0de4, 0x0e44 }, /* Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */ - { 0x0de5, 0x0e45 }, /* Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */ - { 0x0de6, 0x0e46 }, /* Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */ - { 0x0de7, 0x0e47 }, /* Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */ - { 0x0de8, 0x0e48 }, /* Thai_maiek ่ THAI CHARACTER MAI EK */ - { 0x0de9, 0x0e49 }, /* Thai_maitho ้ THAI CHARACTER MAI THO */ - { 0x0dea, 0x0e4a }, /* Thai_maitri ๊ THAI CHARACTER MAI TRI */ - { 0x0deb, 0x0e4b }, /* Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */ - { 0x0dec, 0x0e4c }, /* Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */ - { 0x0ded, 0x0e4d }, /* Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */ - { 0x0df0, 0x0e50 }, /* Thai_leksun ๐ THAI DIGIT ZERO */ - { 0x0df1, 0x0e51 }, /* Thai_leknung ๑ THAI DIGIT ONE */ - { 0x0df2, 0x0e52 }, /* Thai_leksong ๒ THAI DIGIT TWO */ - { 0x0df3, 0x0e53 }, /* Thai_leksam ๓ THAI DIGIT THREE */ - { 0x0df4, 0x0e54 }, /* Thai_leksi ๔ THAI DIGIT FOUR */ - { 0x0df5, 0x0e55 }, /* Thai_lekha ๕ THAI DIGIT FIVE */ - { 0x0df6, 0x0e56 }, /* Thai_lekhok ๖ THAI DIGIT SIX */ - { 0x0df7, 0x0e57 }, /* Thai_lekchet ๗ THAI DIGIT SEVEN */ - { 0x0df8, 0x0e58 }, /* Thai_lekpaet ๘ THAI DIGIT EIGHT */ - { 0x0df9, 0x0e59 }, /* Thai_lekkao ๙ THAI DIGIT NINE */ - { 0x0ea1, 0x3131 }, /* Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */ - { 0x0ea2, 0x3132 }, /* Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */ - { 0x0ea3, 0x3133 }, /* Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */ - { 0x0ea4, 0x3134 }, /* Hangul_Nieun ㄴ HANGUL LETTER NIEUN */ - { 0x0ea5, 0x3135 }, /* Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */ - { 0x0ea6, 0x3136 }, /* Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */ - { 0x0ea7, 0x3137 }, /* Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */ - { 0x0ea8, 0x3138 }, /* Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */ - { 0x0ea9, 0x3139 }, /* Hangul_Rieul ㄹ HANGUL LETTER RIEUL */ - { 0x0eaa, 0x313a }, /* Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */ - { 0x0eab, 0x313b }, /* Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */ - { 0x0eac, 0x313c }, /* Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */ - { 0x0ead, 0x313d }, /* Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */ - { 0x0eae, 0x313e }, /* Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */ - { 0x0eaf, 0x313f }, /* Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */ - { 0x0eb0, 0x3140 }, /* Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */ - { 0x0eb1, 0x3141 }, /* Hangul_Mieum ㅁ HANGUL LETTER MIEUM */ - { 0x0eb2, 0x3142 }, /* Hangul_Pieub ㅂ HANGUL LETTER PIEUP */ - { 0x0eb3, 0x3143 }, /* Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */ - { 0x0eb4, 0x3144 }, /* Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */ - { 0x0eb5, 0x3145 }, /* Hangul_Sios ㅅ HANGUL LETTER SIOS */ - { 0x0eb6, 0x3146 }, /* Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */ - { 0x0eb7, 0x3147 }, /* Hangul_Ieung ㅇ HANGUL LETTER IEUNG */ - { 0x0eb8, 0x3148 }, /* Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */ - { 0x0eb9, 0x3149 }, /* Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */ - { 0x0eba, 0x314a }, /* Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */ - { 0x0ebb, 0x314b }, /* Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */ - { 0x0ebc, 0x314c }, /* Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */ - { 0x0ebd, 0x314d }, /* Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */ - { 0x0ebe, 0x314e }, /* Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */ - { 0x0ebf, 0x314f }, /* Hangul_A ㅏ HANGUL LETTER A */ - { 0x0ec0, 0x3150 }, /* Hangul_AE ㅐ HANGUL LETTER AE */ - { 0x0ec1, 0x3151 }, /* Hangul_YA ㅑ HANGUL LETTER YA */ - { 0x0ec2, 0x3152 }, /* Hangul_YAE ㅒ HANGUL LETTER YAE */ - { 0x0ec3, 0x3153 }, /* Hangul_EO ㅓ HANGUL LETTER EO */ - { 0x0ec4, 0x3154 }, /* Hangul_E ㅔ HANGUL LETTER E */ - { 0x0ec5, 0x3155 }, /* Hangul_YEO ㅕ HANGUL LETTER YEO */ - { 0x0ec6, 0x3156 }, /* Hangul_YE ㅖ HANGUL LETTER YE */ - { 0x0ec7, 0x3157 }, /* Hangul_O ㅗ HANGUL LETTER O */ - { 0x0ec8, 0x3158 }, /* Hangul_WA ㅘ HANGUL LETTER WA */ - { 0x0ec9, 0x3159 }, /* Hangul_WAE ㅙ HANGUL LETTER WAE */ - { 0x0eca, 0x315a }, /* Hangul_OE ㅚ HANGUL LETTER OE */ - { 0x0ecb, 0x315b }, /* Hangul_YO ㅛ HANGUL LETTER YO */ - { 0x0ecc, 0x315c }, /* Hangul_U ㅜ HANGUL LETTER U */ - { 0x0ecd, 0x315d }, /* Hangul_WEO ㅝ HANGUL LETTER WEO */ - { 0x0ece, 0x315e }, /* Hangul_WE ㅞ HANGUL LETTER WE */ - { 0x0ecf, 0x315f }, /* Hangul_WI ㅟ HANGUL LETTER WI */ - { 0x0ed0, 0x3160 }, /* Hangul_YU ㅠ HANGUL LETTER YU */ - { 0x0ed1, 0x3161 }, /* Hangul_EU ㅡ HANGUL LETTER EU */ - { 0x0ed2, 0x3162 }, /* Hangul_YI ㅢ HANGUL LETTER YI */ - { 0x0ed3, 0x3163 }, /* Hangul_I ㅣ HANGUL LETTER I */ - { 0x0ed4, 0x11a8 }, /* Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */ - { 0x0ed5, 0x11a9 }, /* Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */ - { 0x0ed6, 0x11aa }, /* Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */ - { 0x0ed7, 0x11ab }, /* Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */ - { 0x0ed8, 0x11ac }, /* Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */ - { 0x0ed9, 0x11ad }, /* Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */ - { 0x0eda, 0x11ae }, /* Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */ - { 0x0edb, 0x11af }, /* Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */ - { 0x0edc, 0x11b0 }, /* Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */ - { 0x0edd, 0x11b1 }, /* Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */ - { 0x0ede, 0x11b2 }, /* Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */ - { 0x0edf, 0x11b3 }, /* Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */ - { 0x0ee0, 0x11b4 }, /* Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */ - { 0x0ee1, 0x11b5 }, /* Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */ - { 0x0ee2, 0x11b6 }, /* Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */ - { 0x0ee3, 0x11b7 }, /* Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */ - { 0x0ee4, 0x11b8 }, /* Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */ - { 0x0ee5, 0x11b9 }, /* Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */ - { 0x0ee6, 0x11ba }, /* Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */ - { 0x0ee7, 0x11bb }, /* Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */ - { 0x0ee8, 0x11bc }, /* Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */ - { 0x0ee9, 0x11bd }, /* Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */ - { 0x0eea, 0x11be }, /* Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */ - { 0x0eeb, 0x11bf }, /* Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */ - { 0x0eec, 0x11c0 }, /* Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */ - { 0x0eed, 0x11c1 }, /* Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */ - { 0x0eee, 0x11c2 }, /* Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */ - { 0x0eef, 0x316d }, /* Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */ - { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */ - { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */ - { 0x0ef2, 0x317f }, /* Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */ -/* 0x0ef3 Hangul_KkogjiDalrinIeung ? ??? */ - { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */ - { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */ - { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆍ HANGUL LETTER ARAEA */ - { 0x0ef7, 0x318e }, /* Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */ - { 0x0ef8, 0x11eb }, /* Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */ - { 0x0ef9, 0x11f0 }, /* Hangul_J_KkogjiDalrinIeung ᇰ HANGUL JONGSEONG YESIEUNG */ - { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */ - { 0x0eff, 0x20a9 }, /* Korean_Won ₩ WON SIGN */ - { 0x13a4, 0x20ac }, /* Euro € EURO SIGN */ - { 0x13bc, 0x0152 }, /* OE Œ LATIN CAPITAL LIGATURE OE */ - { 0x13bd, 0x0153 }, /* oe œ LATIN SMALL LIGATURE OE */ - { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */ - { 0x20a0, 0x20a0 }, /* EcuSign ₠ EURO-CURRENCY SIGN */ - { 0x20a1, 0x20a1 }, /* ColonSign ₡ COLON SIGN */ - { 0x20a2, 0x20a2 }, /* CruzeiroSign ₢ CRUZEIRO SIGN */ - { 0x20a3, 0x20a3 }, /* FFrancSign ₣ FRENCH FRANC SIGN */ - { 0x20a4, 0x20a4 }, /* LiraSign ₤ LIRA SIGN */ - { 0x20a5, 0x20a5 }, /* MillSign ₥ MILL SIGN */ - { 0x20a6, 0x20a6 }, /* NairaSign ₦ NAIRA SIGN */ - { 0x20a7, 0x20a7 }, /* PesetaSign ₧ PESETA SIGN */ - { 0x20a8, 0x20a8 }, /* RupeeSign ₨ RUPEE SIGN */ - { 0x20a9, 0x20a9 }, /* WonSign ₩ WON SIGN */ - { 0x20aa, 0x20aa }, /* NewSheqelSign ₪ NEW SHEQEL SIGN */ - { 0x20ab, 0x20ab }, /* DongSign ₫ DONG SIGN */ - { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ -}; - -/* binary search with range check */ -static uint32_t -bin_search(const struct codepair *table, size_t length, xkb_keysym_t keysym) -{ - size_t first = 0; - size_t last = length; - - if (keysym < table[0].keysym || keysym > table[length].keysym) - return 0; - - /* binary search in table */ - while (last >= first) { - size_t mid = (first + last) / 2; - if (table[mid].keysym < keysym) - first = mid + 1; - else if (table[mid].keysym > keysym) - last = mid - 1; - else /* found it */ - return table[mid].ucs; - } - - /* no matching Unicode value found in table */ - return 0; -} - -XKB_EXPORT uint32_t -xkb_keysym_to_utf32(xkb_keysym_t keysym) -{ - /* first check for Latin-1 characters (1:1 mapping) */ - if ((keysym >= 0x0020 && keysym <= 0x007e) || - (keysym >= 0x00a0 && keysym <= 0x00ff)) - return keysym; - - /* patch encoding botch */ - if (keysym == XKB_KEY_KP_Space) - return XKB_KEY_space & 0x7f; - - /* special keysyms */ - if ((keysym >= XKB_KEY_BackSpace && keysym <= XKB_KEY_Clear) || - (keysym >= XKB_KEY_KP_Multiply && keysym <= XKB_KEY_KP_9) || - keysym == XKB_KEY_Return || keysym == XKB_KEY_Escape || - keysym == XKB_KEY_Delete || keysym == XKB_KEY_KP_Tab || - keysym == XKB_KEY_KP_Enter || keysym == XKB_KEY_KP_Equal) - return keysym & 0x7f; - - /* also check for directly encoded Unicode codepoints */ - /* - * In theory, this is supposed to start from 0x100100, such that the ASCII - * range, which is already covered by 0x00-0xff, can't be encoded in two - * ways. However, changing this after a couple of decades probably won't - * go well, so it stays as it is. - */ - if (0x01000000 <= keysym && keysym <= 0x0110ffff) - return keysym - 0x01000000; - - /* search main table */ - return bin_search(keysymtab, ARRAY_SIZE(keysymtab) - 1, keysym); -} - -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Rob Bradford <rob@linux.intel.com> - */ - -XKB_EXPORT int -xkb_keysym_to_utf8(xkb_keysym_t keysym, char *buffer, size_t size) -{ - uint32_t codepoint; - - if (size < 7) - return -1; - - codepoint = xkb_keysym_to_utf32(keysym); - - if (codepoint == 0) - return 0; - - return utf32_to_utf8(codepoint, buffer); -} diff --git a/src/3rdparty/xkbcommon/src/keysym.c b/src/3rdparty/xkbcommon/src/keysym.c deleted file mode 100644 index 6d06de0bf0..0000000000 --- a/src/3rdparty/xkbcommon/src/keysym.c +++ /dev/null @@ -1,762 +0,0 @@ -/* - * Copyright 1985, 1987, 1990, 1998 The Open Group - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Except as contained in this notice, the names of the authors or their - * institutions shall not be used in advertising or otherwise to promote the - * sale, use or other dealings in this Software without prior written - * authorization from the authors. - */ - -/* - * Copyright © 2009 Dan Nicholson - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include <stdlib.h> -#include "xkbcommon/xkbcommon.h" -#include "utils.h" -#include "keysym.h" -#include "ks_tables.h" - -static inline const char * -get_name(const struct name_keysym *entry) -{ - return keysym_names + entry->offset; -} - -static int -compare_by_keysym(const void *a, const void *b) -{ - const xkb_keysym_t *key = a; - const struct name_keysym *entry = b; - if (*key < entry->keysym) - return -1; - if (*key > entry->keysym) - return 1; - return 0; -} - -static int -compare_by_name(const void *a, const void *b) -{ - const char *key = a; - const struct name_keysym *entry = b; - return istrcmp(key, get_name(entry)); -} - -XKB_EXPORT int -xkb_keysym_get_name(xkb_keysym_t ks, char *buffer, size_t size) -{ - const struct name_keysym *entry; - - if ((ks & ((unsigned long) ~0x1fffffff)) != 0) { - snprintf(buffer, size, "Invalid"); - return -1; - } - - entry = bsearch(&ks, keysym_to_name, - ARRAY_SIZE(keysym_to_name), - sizeof(*keysym_to_name), - compare_by_keysym); - if (entry) - return snprintf(buffer, size, "%s", get_name(entry)); - - /* Unnamed Unicode codepoint. */ - if (ks >= 0x01000100 && ks <= 0x0110ffff) { - const int width = (ks & 0xff0000UL) ? 8 : 4; - return snprintf(buffer, size, "U%0*lX", width, ks & 0xffffffUL); - } - - /* Unnamed, non-Unicode, symbol (shouldn't generally happen). */ - return snprintf(buffer, size, "0x%08x", ks); -} - -/* - * Find the correct keysym if one case-insensitive match is given. - * - * The name_to_keysym table is sorted by istrcmp(). So bsearch() may return - * _any_ of all possible case-insensitive duplicates. This function searches the - * returned entry @entry, all previous and all next entries that match by - * case-insensitive comparison and returns the exact match to @name. If @icase - * is true, then this returns the best case-insensitive match instead of a - * correct match. - * The "best" case-insensitive match is the lower-case keysym which we find with - * the help of xkb_keysym_is_lower(). - * The only keysyms that only differ by letter-case are keysyms that are - * available as lower-case and upper-case variant (like KEY_a and KEY_A). So - * returning the first lower-case match is enough in this case. - */ -static const struct name_keysym * -find_sym(const struct name_keysym *entry, const char *name, bool icase) -{ - const struct name_keysym *iter, *last; - size_t len = ARRAY_SIZE(name_to_keysym); - - if (!entry) - return NULL; - - if (!icase && strcmp(get_name(entry), name) == 0) - return entry; - if (icase && xkb_keysym_is_lower(entry->keysym)) - return entry; - - for (iter = entry - 1; iter >= name_to_keysym; --iter) { - if (!icase && strcmp(get_name(iter), name) == 0) - return iter; - if (istrcmp(get_name(iter), get_name(entry)) != 0) - break; - if (icase && xkb_keysym_is_lower(iter->keysym)) - return iter; - } - - last = name_to_keysym + len; - for (iter = entry + 1; iter < last; ++iter) { - if (!icase && strcmp(get_name(iter), name) == 0) - return iter; - if (istrcmp(get_name(iter), get_name(entry)) != 0) - break; - if (icase && xkb_keysym_is_lower(iter->keysym)) - return iter; - } - - if (icase) - return entry; - return NULL; -} - -XKB_EXPORT xkb_keysym_t -xkb_keysym_from_name(const char *s, enum xkb_keysym_flags flags) -{ - const struct name_keysym *entry; - char *tmp; - xkb_keysym_t val; - bool icase = (flags & XKB_KEYSYM_CASE_INSENSITIVE); - - if (flags & ~XKB_KEYSYM_CASE_INSENSITIVE) - return XKB_KEY_NoSymbol; - - entry = bsearch(s, name_to_keysym, - ARRAY_SIZE(name_to_keysym), - sizeof(*name_to_keysym), - compare_by_name); - entry = find_sym(entry, s, icase); - if (entry) - return entry->keysym; - - if (*s == 'U' || (icase && *s == 'u')) { - val = strtoul(&s[1], &tmp, 16); - if (tmp && *tmp != '\0') - return XKB_KEY_NoSymbol; - - if (val < 0x20 || (val > 0x7e && val < 0xa0)) - return XKB_KEY_NoSymbol; - if (val < 0x100) - return val; - if (val > 0x10ffff) - return XKB_KEY_NoSymbol; - return val | 0x01000000; - } - else if (s[0] == '0' && (s[1] == 'x' || (icase && s[1] == 'X'))) { - val = strtoul(&s[2], &tmp, 16); - if (tmp && *tmp != '\0') - return XKB_KEY_NoSymbol; - - return val; - } - - /* Stupid inconsistency between the headers and XKeysymDB: the former has - * no separating underscore, while some XF86* syms in the latter did. - * As a last ditch effort, try without. */ - if (strncmp(s, "XF86_", 5) == 0 || - (icase && strncasecmp(s, "XF86_", 5) == 0)) { - xkb_keysym_t ret; - tmp = strdup(s); - if (!tmp) - return XKB_KEY_NoSymbol; - memmove(&tmp[4], &tmp[5], strlen(s) - 5 + 1); - ret = xkb_keysym_from_name(tmp, flags); - free(tmp); - return ret; - } - - return XKB_KEY_NoSymbol; -} - -bool -xkb_keysym_is_keypad(xkb_keysym_t keysym) -{ - return keysym >= XKB_KEY_KP_Space && keysym <= XKB_KEY_KP_Equal; -} - - -bool -xkb_keysym_is_modifier(xkb_keysym_t keysym) -{ - return - (keysym >= XKB_KEY_Shift_L && keysym <= XKB_KEY_Hyper_R) || - /* libX11 only goes upto XKB_KEY_ISO_Level5_Lock. */ - (keysym >= XKB_KEY_ISO_Lock && keysym <= XKB_KEY_ISO_Last_Group_Lock) || - keysym == XKB_KEY_Mode_switch || - keysym == XKB_KEY_Num_Lock; -} - -static void -XConvertCase(xkb_keysym_t sym, xkb_keysym_t *lower, xkb_keysym_t *upper); - -bool -xkb_keysym_is_lower(xkb_keysym_t ks) -{ - xkb_keysym_t lower, upper; - - XConvertCase(ks, &lower, &upper); - - if (lower == upper) - return false; - - return (ks == lower ? true : false); -} - -bool -xkb_keysym_is_upper(xkb_keysym_t ks) -{ - xkb_keysym_t lower, upper; - - XConvertCase(ks, &lower, &upper); - - if (lower == upper) - return false; - - return (ks == upper ? true : false); -} - -XKB_EXPORT xkb_keysym_t -xkb_keysym_to_lower(xkb_keysym_t ks) -{ - xkb_keysym_t lower, upper; - - XConvertCase(ks, &lower, &upper); - - return lower; -} - -XKB_EXPORT xkb_keysym_t -xkb_keysym_to_upper(xkb_keysym_t ks) -{ - xkb_keysym_t lower, upper; - - XConvertCase(ks, &lower, &upper); - - return upper; -} - -/* - * The following is copied verbatim from libX11:src/KeyBind.c, commit - * d45b3fc19fbe95c41afc4e51d768df6d42332010, with the following changes: - * - unsigned -> uint32_t - * - unsigend short -> uint16_t - * - s/XK_/XKB_KEY_ - * - * XXX: If newlocale() and iswlower_l()/iswupper_l() interface ever - * become portable, we should use that in conjunction with - * xkb_keysym_to_utf32(), instead of all this stuff. We should - * be sure to give the same results as libX11, though, and be - * locale independent; this information is used by xkbcomp to - * find the automatic type to assign to key groups. - */ - -static void -UCSConvertCase(uint32_t code, xkb_keysym_t *lower, xkb_keysym_t *upper) -{ - /* Case conversion for UCS, as in Unicode Data version 4.0.0 */ - /* NB: Only converts simple one-to-one mappings. */ - - /* Tables are used where they take less space than */ - /* the code to work out the mappings. Zero values mean */ - /* undefined code points. */ - - static uint16_t const IPAExt_upper_mapping[] = { /* part only */ - 0x0181, 0x0186, 0x0255, 0x0189, 0x018A, - 0x0258, 0x018F, 0x025A, 0x0190, 0x025C, 0x025D, 0x025E, 0x025F, - 0x0193, 0x0261, 0x0262, 0x0194, 0x0264, 0x0265, 0x0266, 0x0267, - 0x0197, 0x0196, 0x026A, 0x026B, 0x026C, 0x026D, 0x026E, 0x019C, - 0x0270, 0x0271, 0x019D, 0x0273, 0x0274, 0x019F, 0x0276, 0x0277, - 0x0278, 0x0279, 0x027A, 0x027B, 0x027C, 0x027D, 0x027E, 0x027F, - 0x01A6, 0x0281, 0x0282, 0x01A9, 0x0284, 0x0285, 0x0286, 0x0287, - 0x01AE, 0x0289, 0x01B1, 0x01B2, 0x028C, 0x028D, 0x028E, 0x028F, - 0x0290, 0x0291, 0x01B7 - }; - - static uint16_t const LatinExtB_upper_mapping[] = { /* first part only */ - 0x0180, 0x0181, 0x0182, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187, - 0x0187, 0x0189, 0x018A, 0x018B, 0x018B, 0x018D, 0x018E, 0x018F, - 0x0190, 0x0191, 0x0191, 0x0193, 0x0194, 0x01F6, 0x0196, 0x0197, - 0x0198, 0x0198, 0x019A, 0x019B, 0x019C, 0x019D, 0x0220, 0x019F, - 0x01A0, 0x01A0, 0x01A2, 0x01A2, 0x01A4, 0x01A4, 0x01A6, 0x01A7, - 0x01A7, 0x01A9, 0x01AA, 0x01AB, 0x01AC, 0x01AC, 0x01AE, 0x01AF, - 0x01AF, 0x01B1, 0x01B2, 0x01B3, 0x01B3, 0x01B5, 0x01B5, 0x01B7, - 0x01B8, 0x01B8, 0x01BA, 0x01BB, 0x01BC, 0x01BC, 0x01BE, 0x01F7, - 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C4, 0x01C4, 0x01C4, 0x01C7, - 0x01C7, 0x01C7, 0x01CA, 0x01CA, 0x01CA - }; - - static uint16_t const LatinExtB_lower_mapping[] = { /* first part only */ - 0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188, - 0x0188, 0x0256, 0x0257, 0x018C, 0x018C, 0x018D, 0x01DD, 0x0259, - 0x025B, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268, - 0x0199, 0x0199, 0x019A, 0x019B, 0x026F, 0x0272, 0x019E, 0x0275, - 0x01A1, 0x01A1, 0x01A3, 0x01A3, 0x01A5, 0x01A5, 0x0280, 0x01A8, - 0x01A8, 0x0283, 0x01AA, 0x01AB, 0x01AD, 0x01AD, 0x0288, 0x01B0, - 0x01B0, 0x028A, 0x028B, 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x0292, - 0x01B9, 0x01B9, 0x01BA, 0x01BB, 0x01BD, 0x01BD, 0x01BE, 0x01BF, - 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C6, 0x01C6, 0x01C6, 0x01C9, - 0x01C9, 0x01C9, 0x01CC, 0x01CC, 0x01CC - }; - - static uint16_t const Greek_upper_mapping[] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0374, 0x0375, 0x0000, 0x0000, - 0x0000, 0x0000, 0x037A, 0x0000, 0x0000, 0x0000, 0x037E, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0384, 0x0385, 0x0386, 0x0387, - 0x0388, 0x0389, 0x038A, 0x0000, 0x038C, 0x0000, 0x038E, 0x038F, - 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, - 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, - 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x0386, 0x0388, 0x0389, 0x038A, - 0x03B0, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, - 0x03A0, 0x03A1, 0x03A3, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, - 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x038C, 0x038E, 0x038F, 0x0000, - 0x0392, 0x0398, 0x03D2, 0x03D3, 0x03D4, 0x03A6, 0x03A0, 0x03D7, - 0x03D8, 0x03D8, 0x03DA, 0x03DA, 0x03DC, 0x03DC, 0x03DE, 0x03DE, - 0x03E0, 0x03E0, 0x03E2, 0x03E2, 0x03E4, 0x03E4, 0x03E6, 0x03E6, - 0x03E8, 0x03E8, 0x03EA, 0x03EA, 0x03EC, 0x03EC, 0x03EE, 0x03EE, - 0x039A, 0x03A1, 0x03F9, 0x03F3, 0x03F4, 0x0395, 0x03F6, 0x03F7, - 0x03F7, 0x03F9, 0x03FA, 0x03FA, 0x0000, 0x0000, 0x0000, 0x0000 - }; - - static uint16_t const Greek_lower_mapping[] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0374, 0x0375, 0x0000, 0x0000, - 0x0000, 0x0000, 0x037A, 0x0000, 0x0000, 0x0000, 0x037E, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0384, 0x0385, 0x03AC, 0x0387, - 0x03AD, 0x03AE, 0x03AF, 0x0000, 0x03CC, 0x0000, 0x03CD, 0x03CE, - 0x0390, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, - 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, - 0x03C0, 0x03C1, 0x0000, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, - 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, - 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, - 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, - 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, - 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000, - 0x03D0, 0x03D1, 0x03D2, 0x03D3, 0x03D4, 0x03D5, 0x03D6, 0x03D7, - 0x03D9, 0x03D9, 0x03DB, 0x03DB, 0x03DD, 0x03DD, 0x03DF, 0x03DF, - 0x03E1, 0x03E1, 0x03E3, 0x03E3, 0x03E5, 0x03E5, 0x03E7, 0x03E7, - 0x03E9, 0x03E9, 0x03EB, 0x03EB, 0x03ED, 0x03ED, 0x03EF, 0x03EF, - 0x03F0, 0x03F1, 0x03F2, 0x03F3, 0x03B8, 0x03F5, 0x03F6, 0x03F8, - 0x03F8, 0x03F2, 0x03FB, 0x03FB, 0x0000, 0x0000, 0x0000, 0x0000 - }; - - static uint16_t const GreekExt_lower_mapping[] = { - 0x1F00, 0x1F01, 0x1F02, 0x1F03, 0x1F04, 0x1F05, 0x1F06, 0x1F07, - 0x1F00, 0x1F01, 0x1F02, 0x1F03, 0x1F04, 0x1F05, 0x1F06, 0x1F07, - 0x1F10, 0x1F11, 0x1F12, 0x1F13, 0x1F14, 0x1F15, 0x0000, 0x0000, - 0x1F10, 0x1F11, 0x1F12, 0x1F13, 0x1F14, 0x1F15, 0x0000, 0x0000, - 0x1F20, 0x1F21, 0x1F22, 0x1F23, 0x1F24, 0x1F25, 0x1F26, 0x1F27, - 0x1F20, 0x1F21, 0x1F22, 0x1F23, 0x1F24, 0x1F25, 0x1F26, 0x1F27, - 0x1F30, 0x1F31, 0x1F32, 0x1F33, 0x1F34, 0x1F35, 0x1F36, 0x1F37, - 0x1F30, 0x1F31, 0x1F32, 0x1F33, 0x1F34, 0x1F35, 0x1F36, 0x1F37, - 0x1F40, 0x1F41, 0x1F42, 0x1F43, 0x1F44, 0x1F45, 0x0000, 0x0000, - 0x1F40, 0x1F41, 0x1F42, 0x1F43, 0x1F44, 0x1F45, 0x0000, 0x0000, - 0x1F50, 0x1F51, 0x1F52, 0x1F53, 0x1F54, 0x1F55, 0x1F56, 0x1F57, - 0x0000, 0x1F51, 0x0000, 0x1F53, 0x0000, 0x1F55, 0x0000, 0x1F57, - 0x1F60, 0x1F61, 0x1F62, 0x1F63, 0x1F64, 0x1F65, 0x1F66, 0x1F67, - 0x1F60, 0x1F61, 0x1F62, 0x1F63, 0x1F64, 0x1F65, 0x1F66, 0x1F67, - 0x1F70, 0x1F71, 0x1F72, 0x1F73, 0x1F74, 0x1F75, 0x1F76, 0x1F77, - 0x1F78, 0x1F79, 0x1F7A, 0x1F7B, 0x1F7C, 0x1F7D, 0x0000, 0x0000, - 0x1F80, 0x1F81, 0x1F82, 0x1F83, 0x1F84, 0x1F85, 0x1F86, 0x1F87, - 0x1F80, 0x1F81, 0x1F82, 0x1F83, 0x1F84, 0x1F85, 0x1F86, 0x1F87, - 0x1F90, 0x1F91, 0x1F92, 0x1F93, 0x1F94, 0x1F95, 0x1F96, 0x1F97, - 0x1F90, 0x1F91, 0x1F92, 0x1F93, 0x1F94, 0x1F95, 0x1F96, 0x1F97, - 0x1FA0, 0x1FA1, 0x1FA2, 0x1FA3, 0x1FA4, 0x1FA5, 0x1FA6, 0x1FA7, - 0x1FA0, 0x1FA1, 0x1FA2, 0x1FA3, 0x1FA4, 0x1FA5, 0x1FA6, 0x1FA7, - 0x1FB0, 0x1FB1, 0x1FB2, 0x1FB3, 0x1FB4, 0x0000, 0x1FB6, 0x1FB7, - 0x1FB0, 0x1FB1, 0x1F70, 0x1F71, 0x1FB3, 0x1FBD, 0x1FBE, 0x1FBF, - 0x1FC0, 0x1FC1, 0x1FC2, 0x1FC3, 0x1FC4, 0x0000, 0x1FC6, 0x1FC7, - 0x1F72, 0x1F73, 0x1F74, 0x1F75, 0x1FC3, 0x1FCD, 0x1FCE, 0x1FCF, - 0x1FD0, 0x1FD1, 0x1FD2, 0x1FD3, 0x0000, 0x0000, 0x1FD6, 0x1FD7, - 0x1FD0, 0x1FD1, 0x1F76, 0x1F77, 0x0000, 0x1FDD, 0x1FDE, 0x1FDF, - 0x1FE0, 0x1FE1, 0x1FE2, 0x1FE3, 0x1FE4, 0x1FE5, 0x1FE6, 0x1FE7, - 0x1FE0, 0x1FE1, 0x1F7A, 0x1F7B, 0x1FE5, 0x1FED, 0x1FEE, 0x1FEF, - 0x0000, 0x0000, 0x1FF2, 0x1FF3, 0x1FF4, 0x0000, 0x1FF6, 0x1FF7, - 0x1F78, 0x1F79, 0x1F7C, 0x1F7D, 0x1FF3, 0x1FFD, 0x1FFE, 0x0000 - }; - - static uint16_t const GreekExt_upper_mapping[] = { - 0x1F08, 0x1F09, 0x1F0A, 0x1F0B, 0x1F0C, 0x1F0D, 0x1F0E, 0x1F0F, - 0x1F08, 0x1F09, 0x1F0A, 0x1F0B, 0x1F0C, 0x1F0D, 0x1F0E, 0x1F0F, - 0x1F18, 0x1F19, 0x1F1A, 0x1F1B, 0x1F1C, 0x1F1D, 0x0000, 0x0000, - 0x1F18, 0x1F19, 0x1F1A, 0x1F1B, 0x1F1C, 0x1F1D, 0x0000, 0x0000, - 0x1F28, 0x1F29, 0x1F2A, 0x1F2B, 0x1F2C, 0x1F2D, 0x1F2E, 0x1F2F, - 0x1F28, 0x1F29, 0x1F2A, 0x1F2B, 0x1F2C, 0x1F2D, 0x1F2E, 0x1F2F, - 0x1F38, 0x1F39, 0x1F3A, 0x1F3B, 0x1F3C, 0x1F3D, 0x1F3E, 0x1F3F, - 0x1F38, 0x1F39, 0x1F3A, 0x1F3B, 0x1F3C, 0x1F3D, 0x1F3E, 0x1F3F, - 0x1F48, 0x1F49, 0x1F4A, 0x1F4B, 0x1F4C, 0x1F4D, 0x0000, 0x0000, - 0x1F48, 0x1F49, 0x1F4A, 0x1F4B, 0x1F4C, 0x1F4D, 0x0000, 0x0000, - 0x1F50, 0x1F59, 0x1F52, 0x1F5B, 0x1F54, 0x1F5D, 0x1F56, 0x1F5F, - 0x0000, 0x1F59, 0x0000, 0x1F5B, 0x0000, 0x1F5D, 0x0000, 0x1F5F, - 0x1F68, 0x1F69, 0x1F6A, 0x1F6B, 0x1F6C, 0x1F6D, 0x1F6E, 0x1F6F, - 0x1F68, 0x1F69, 0x1F6A, 0x1F6B, 0x1F6C, 0x1F6D, 0x1F6E, 0x1F6F, - 0x1FBA, 0x1FBB, 0x1FC8, 0x1FC9, 0x1FCA, 0x1FCB, 0x1FDA, 0x1FDB, - 0x1FF8, 0x1FF9, 0x1FEA, 0x1FEB, 0x1FFA, 0x1FFB, 0x0000, 0x0000, - 0x1F88, 0x1F89, 0x1F8A, 0x1F8B, 0x1F8C, 0x1F8D, 0x1F8E, 0x1F8F, - 0x1F88, 0x1F89, 0x1F8A, 0x1F8B, 0x1F8C, 0x1F8D, 0x1F8E, 0x1F8F, - 0x1F98, 0x1F99, 0x1F9A, 0x1F9B, 0x1F9C, 0x1F9D, 0x1F9E, 0x1F9F, - 0x1F98, 0x1F99, 0x1F9A, 0x1F9B, 0x1F9C, 0x1F9D, 0x1F9E, 0x1F9F, - 0x1FA8, 0x1FA9, 0x1FAA, 0x1FAB, 0x1FAC, 0x1FAD, 0x1FAE, 0x1FAF, - 0x1FA8, 0x1FA9, 0x1FAA, 0x1FAB, 0x1FAC, 0x1FAD, 0x1FAE, 0x1FAF, - 0x1FB8, 0x1FB9, 0x1FB2, 0x1FBC, 0x1FB4, 0x0000, 0x1FB6, 0x1FB7, - 0x1FB8, 0x1FB9, 0x1FBA, 0x1FBB, 0x1FBC, 0x1FBD, 0x0399, 0x1FBF, - 0x1FC0, 0x1FC1, 0x1FC2, 0x1FCC, 0x1FC4, 0x0000, 0x1FC6, 0x1FC7, - 0x1FC8, 0x1FC9, 0x1FCA, 0x1FCB, 0x1FCC, 0x1FCD, 0x1FCE, 0x1FCF, - 0x1FD8, 0x1FD9, 0x1FD2, 0x1FD3, 0x0000, 0x0000, 0x1FD6, 0x1FD7, - 0x1FD8, 0x1FD9, 0x1FDA, 0x1FDB, 0x0000, 0x1FDD, 0x1FDE, 0x1FDF, - 0x1FE8, 0x1FE9, 0x1FE2, 0x1FE3, 0x1FE4, 0x1FEC, 0x1FE6, 0x1FE7, - 0x1FE8, 0x1FE9, 0x1FEA, 0x1FEB, 0x1FEC, 0x1FED, 0x1FEE, 0x1FEF, - 0x0000, 0x0000, 0x1FF2, 0x1FFC, 0x1FF4, 0x0000, 0x1FF6, 0x1FF7, - 0x1FF8, 0x1FF9, 0x1FFA, 0x1FFB, 0x1FFC, 0x1FFD, 0x1FFE, 0x0000 - }; - - *lower = code; - *upper = code; - - /* Basic Latin and Latin-1 Supplement, U+0000 to U+00FF */ - if (code <= 0x00ff) { - if (code >= 0x0041 && code <= 0x005a) /* A-Z */ - *lower += 0x20; - else if (code >= 0x0061 && code <= 0x007a) /* a-z */ - *upper -= 0x20; - else if ( (code >= 0x00c0 && code <= 0x00d6) || - (code >= 0x00d8 && code <= 0x00de) ) - *lower += 0x20; - else if ( (code >= 0x00e0 && code <= 0x00f6) || - (code >= 0x00f8 && code <= 0x00fe) ) - *upper -= 0x20; - else if (code == 0x00ff) /* y with diaeresis */ - *upper = 0x0178; - else if (code == 0x00b5) /* micro sign */ - *upper = 0x039c; - return; - } - - /* Latin Extended-A, U+0100 to U+017F */ - if (code >= 0x0100 && code <= 0x017f) { - if ( (code >= 0x0100 && code <= 0x012f) || - (code >= 0x0132 && code <= 0x0137) || - (code >= 0x014a && code <= 0x0177) ) { - *upper = code & ~1; - *lower = code | 1; - } - else if ( (code >= 0x0139 && code <= 0x0148) || - (code >= 0x0179 && code <= 0x017e) ) { - if (code & 1) - *lower += 1; - else - *upper -= 1; - } - else if (code == 0x0130) - *lower = 0x0069; - else if (code == 0x0131) - *upper = 0x0049; - else if (code == 0x0178) - *lower = 0x00ff; - else if (code == 0x017f) - *upper = 0x0053; - return; - } - - /* Latin Extended-B, U+0180 to U+024F */ - if (code >= 0x0180 && code <= 0x024f) { - if (code >= 0x01cd && code <= 0x01dc) { - if (code & 1) - *lower += 1; - else - *upper -= 1; - } - else if ( (code >= 0x01de && code <= 0x01ef) || - (code >= 0x01f4 && code <= 0x01f5) || - (code >= 0x01f8 && code <= 0x021f) || - (code >= 0x0222 && code <= 0x0233) ) { - *lower |= 1; - *upper &= ~1; - } - else if (code >= 0x0180 && code <= 0x01cc) { - *lower = LatinExtB_lower_mapping[code - 0x0180]; - *upper = LatinExtB_upper_mapping[code - 0x0180]; - } - else if (code == 0x01dd) - *upper = 0x018e; - else if (code == 0x01f1 || code == 0x01f2) { - *lower = 0x01f3; - *upper = 0x01f1; - } - else if (code == 0x01f3) - *upper = 0x01f1; - else if (code == 0x01f6) - *lower = 0x0195; - else if (code == 0x01f7) - *lower = 0x01bf; - else if (code == 0x0220) - *lower = 0x019e; - return; - } - - /* IPA Extensions, U+0250 to U+02AF */ - if (code >= 0x0253 && code <= 0x0292) { - *upper = IPAExt_upper_mapping[code - 0x0253]; - } - - /* Combining Diacritical Marks, U+0300 to U+036F */ - if (code == 0x0345) { - *upper = 0x0399; - } - - /* Greek and Coptic, U+0370 to U+03FF */ - if (code >= 0x0370 && code <= 0x03ff) { - *lower = Greek_lower_mapping[code - 0x0370]; - *upper = Greek_upper_mapping[code - 0x0370]; - if (*upper == 0) - *upper = code; - if (*lower == 0) - *lower = code; - } - - /* Cyrillic and Cyrillic Supplementary, U+0400 to U+052F */ - if ( (code >= 0x0400 && code <= 0x04ff) || - (code >= 0x0500 && code <= 0x052f) ) { - if (code >= 0x0400 && code <= 0x040f) - *lower += 0x50; - else if (code >= 0x0410 && code <= 0x042f) - *lower += 0x20; - else if (code >= 0x0430 && code <= 0x044f) - *upper -= 0x20; - else if (code >= 0x0450 && code <= 0x045f) - *upper -= 0x50; - else if ( (code >= 0x0460 && code <= 0x0481) || - (code >= 0x048a && code <= 0x04bf) || - (code >= 0x04d0 && code <= 0x04f5) || - (code >= 0x04f8 && code <= 0x04f9) || - (code >= 0x0500 && code <= 0x050f) ) { - *upper &= ~1; - *lower |= 1; - } - else if (code >= 0x04c1 && code <= 0x04ce) { - if (code & 1) - *lower += 1; - else - *upper -= 1; - } - } - - /* Armenian, U+0530 to U+058F */ - if (code >= 0x0530 && code <= 0x058f) { - if (code >= 0x0531 && code <= 0x0556) - *lower += 0x30; - else if (code >=0x0561 && code <= 0x0586) - *upper -= 0x30; - } - - /* Latin Extended Additional, U+1E00 to U+1EFF */ - if (code >= 0x1e00 && code <= 0x1eff) { - if ( (code >= 0x1e00 && code <= 0x1e95) || - (code >= 0x1ea0 && code <= 0x1ef9) ) { - *upper &= ~1; - *lower |= 1; - } - else if (code == 0x1e9b) - *upper = 0x1e60; - } - - /* Greek Extended, U+1F00 to U+1FFF */ - if (code >= 0x1f00 && code <= 0x1fff) { - *lower = GreekExt_lower_mapping[code - 0x1f00]; - *upper = GreekExt_upper_mapping[code - 0x1f00]; - if (*upper == 0) - *upper = code; - if (*lower == 0) - *lower = code; - } - - /* Letterlike Symbols, U+2100 to U+214F */ - if (code >= 0x2100 && code <= 0x214f) { - switch (code) { - case 0x2126: *lower = 0x03c9; break; - case 0x212a: *lower = 0x006b; break; - case 0x212b: *lower = 0x00e5; break; - } - } - /* Number Forms, U+2150 to U+218F */ - else if (code >= 0x2160 && code <= 0x216f) - *lower += 0x10; - else if (code >= 0x2170 && code <= 0x217f) - *upper -= 0x10; - /* Enclosed Alphanumerics, U+2460 to U+24FF */ - else if (code >= 0x24b6 && code <= 0x24cf) - *lower += 0x1a; - else if (code >= 0x24d0 && code <= 0x24e9) - *upper -= 0x1a; - /* Halfwidth and Fullwidth Forms, U+FF00 to U+FFEF */ - else if (code >= 0xff21 && code <= 0xff3a) - *lower += 0x20; - else if (code >= 0xff41 && code <= 0xff5a) - *upper -= 0x20; - /* Deseret, U+10400 to U+104FF */ - else if (code >= 0x10400 && code <= 0x10427) - *lower += 0x28; - else if (code >= 0x10428 && code <= 0x1044f) - *upper -= 0x28; -} - -static void -XConvertCase(xkb_keysym_t sym, xkb_keysym_t *lower, xkb_keysym_t *upper) -{ - /* Latin 1 keysym */ - if (sym < 0x100) { - UCSConvertCase(sym, lower, upper); - return; - } - - /* Unicode keysym */ - if ((sym & 0xff000000) == 0x01000000) { - UCSConvertCase((sym & 0x00ffffff), lower, upper); - *upper |= 0x01000000; - *lower |= 0x01000000; - return; - } - - /* Legacy keysym */ - - *lower = sym; - *upper = sym; - - switch(sym >> 8) { - case 1: /* Latin 2 */ - /* Assume the KeySym is a legal value (ignore discontinuities) */ - if (sym == XKB_KEY_Aogonek) - *lower = XKB_KEY_aogonek; - else if (sym >= XKB_KEY_Lstroke && sym <= XKB_KEY_Sacute) - *lower += (XKB_KEY_lstroke - XKB_KEY_Lstroke); - else if (sym >= XKB_KEY_Scaron && sym <= XKB_KEY_Zacute) - *lower += (XKB_KEY_scaron - XKB_KEY_Scaron); - else if (sym >= XKB_KEY_Zcaron && sym <= XKB_KEY_Zabovedot) - *lower += (XKB_KEY_zcaron - XKB_KEY_Zcaron); - else if (sym == XKB_KEY_aogonek) - *upper = XKB_KEY_Aogonek; - else if (sym >= XKB_KEY_lstroke && sym <= XKB_KEY_sacute) - *upper -= (XKB_KEY_lstroke - XKB_KEY_Lstroke); - else if (sym >= XKB_KEY_scaron && sym <= XKB_KEY_zacute) - *upper -= (XKB_KEY_scaron - XKB_KEY_Scaron); - else if (sym >= XKB_KEY_zcaron && sym <= XKB_KEY_zabovedot) - *upper -= (XKB_KEY_zcaron - XKB_KEY_Zcaron); - else if (sym >= XKB_KEY_Racute && sym <= XKB_KEY_Tcedilla) - *lower += (XKB_KEY_racute - XKB_KEY_Racute); - else if (sym >= XKB_KEY_racute && sym <= XKB_KEY_tcedilla) - *upper -= (XKB_KEY_racute - XKB_KEY_Racute); - break; - case 2: /* Latin 3 */ - /* Assume the KeySym is a legal value (ignore discontinuities) */ - if (sym >= XKB_KEY_Hstroke && sym <= XKB_KEY_Hcircumflex) - *lower += (XKB_KEY_hstroke - XKB_KEY_Hstroke); - else if (sym >= XKB_KEY_Gbreve && sym <= XKB_KEY_Jcircumflex) - *lower += (XKB_KEY_gbreve - XKB_KEY_Gbreve); - else if (sym >= XKB_KEY_hstroke && sym <= XKB_KEY_hcircumflex) - *upper -= (XKB_KEY_hstroke - XKB_KEY_Hstroke); - else if (sym >= XKB_KEY_gbreve && sym <= XKB_KEY_jcircumflex) - *upper -= (XKB_KEY_gbreve - XKB_KEY_Gbreve); - else if (sym >= XKB_KEY_Cabovedot && sym <= XKB_KEY_Scircumflex) - *lower += (XKB_KEY_cabovedot - XKB_KEY_Cabovedot); - else if (sym >= XKB_KEY_cabovedot && sym <= XKB_KEY_scircumflex) - *upper -= (XKB_KEY_cabovedot - XKB_KEY_Cabovedot); - break; - case 3: /* Latin 4 */ - /* Assume the KeySym is a legal value (ignore discontinuities) */ - if (sym >= XKB_KEY_Rcedilla && sym <= XKB_KEY_Tslash) - *lower += (XKB_KEY_rcedilla - XKB_KEY_Rcedilla); - else if (sym >= XKB_KEY_rcedilla && sym <= XKB_KEY_tslash) - *upper -= (XKB_KEY_rcedilla - XKB_KEY_Rcedilla); - else if (sym == XKB_KEY_ENG) - *lower = XKB_KEY_eng; - else if (sym == XKB_KEY_eng) - *upper = XKB_KEY_ENG; - else if (sym >= XKB_KEY_Amacron && sym <= XKB_KEY_Umacron) - *lower += (XKB_KEY_amacron - XKB_KEY_Amacron); - else if (sym >= XKB_KEY_amacron && sym <= XKB_KEY_umacron) - *upper -= (XKB_KEY_amacron - XKB_KEY_Amacron); - break; - case 6: /* Cyrillic */ - /* Assume the KeySym is a legal value (ignore discontinuities) */ - if (sym >= XKB_KEY_Serbian_DJE && sym <= XKB_KEY_Serbian_DZE) - *lower -= (XKB_KEY_Serbian_DJE - XKB_KEY_Serbian_dje); - else if (sym >= XKB_KEY_Serbian_dje && sym <= XKB_KEY_Serbian_dze) - *upper += (XKB_KEY_Serbian_DJE - XKB_KEY_Serbian_dje); - else if (sym >= XKB_KEY_Cyrillic_YU && sym <= XKB_KEY_Cyrillic_HARDSIGN) - *lower -= (XKB_KEY_Cyrillic_YU - XKB_KEY_Cyrillic_yu); - else if (sym >= XKB_KEY_Cyrillic_yu && sym <= XKB_KEY_Cyrillic_hardsign) - *upper += (XKB_KEY_Cyrillic_YU - XKB_KEY_Cyrillic_yu); - break; - case 7: /* Greek */ - /* Assume the KeySym is a legal value (ignore discontinuities) */ - if (sym >= XKB_KEY_Greek_ALPHAaccent && sym <= XKB_KEY_Greek_OMEGAaccent) - *lower += (XKB_KEY_Greek_alphaaccent - XKB_KEY_Greek_ALPHAaccent); - else if (sym >= XKB_KEY_Greek_alphaaccent && sym <= XKB_KEY_Greek_omegaaccent && - sym != XKB_KEY_Greek_iotaaccentdieresis && - sym != XKB_KEY_Greek_upsilonaccentdieresis) - *upper -= (XKB_KEY_Greek_alphaaccent - XKB_KEY_Greek_ALPHAaccent); - else if (sym >= XKB_KEY_Greek_ALPHA && sym <= XKB_KEY_Greek_OMEGA) - *lower += (XKB_KEY_Greek_alpha - XKB_KEY_Greek_ALPHA); - else if (sym >= XKB_KEY_Greek_alpha && sym <= XKB_KEY_Greek_omega && - sym != XKB_KEY_Greek_finalsmallsigma) - *upper -= (XKB_KEY_Greek_alpha - XKB_KEY_Greek_ALPHA); - break; - case 0x13: /* Latin 9 */ - if (sym == XKB_KEY_OE) - *lower = XKB_KEY_oe; - else if (sym == XKB_KEY_oe) - *upper = XKB_KEY_OE; - else if (sym == XKB_KEY_Ydiaeresis) - *lower = XKB_KEY_ydiaeresis; - break; - } -} diff --git a/src/3rdparty/xkbcommon/src/keysym.h b/src/3rdparty/xkbcommon/src/keysym.h deleted file mode 100644 index 26339632ee..0000000000 --- a/src/3rdparty/xkbcommon/src/keysym.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 1985, 1987, 1990, 1998 The Open Group - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Except as contained in this notice, the names of the authors or their - * institutions shall not be used in advertising or otherwise to promote the - * sale, use or other dealings in this Software without prior written - * authorization from the authors. - */ - -/* - * Copyright © 2009 Dan Nicholson - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef KEYSYM_H -#define KEYSYM_H - -bool -xkb_keysym_is_lower(xkb_keysym_t keysym); - -bool -xkb_keysym_is_upper(xkb_keysym_t keysym); - -bool -xkb_keysym_is_keypad(xkb_keysym_t keysym); - -bool -xkb_keysym_is_modifier(xkb_keysym_t keysym); - -#endif diff --git a/src/3rdparty/xkbcommon/src/ks_tables.h b/src/3rdparty/xkbcommon/src/ks_tables.h deleted file mode 100644 index aa55fc1df0..0000000000 --- a/src/3rdparty/xkbcommon/src/ks_tables.h +++ /dev/null @@ -1,7116 +0,0 @@ - -/** - * This file comes from libxkbcommon and was generated by makekeys.py - * You can always fetch the latest version from: - * https://raw.github.com/xkbcommon/libxkbcommon/master/src/ks_tables.h - */ - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Woverlength-strings" -static const char *keysym_names = - "0\0" - "1\0" - "2\0" - "3\0" - "3270_AltCursor\0" - "3270_Attn\0" - "3270_BackTab\0" - "3270_ChangeScreen\0" - "3270_Copy\0" - "3270_CursorBlink\0" - "3270_CursorSelect\0" - "3270_DeleteWord\0" - "3270_Duplicate\0" - "3270_Enter\0" - "3270_EraseEOF\0" - "3270_EraseInput\0" - "3270_ExSelect\0" - "3270_FieldMark\0" - "3270_Ident\0" - "3270_Jump\0" - "3270_KeyClick\0" - "3270_Left2\0" - "3270_PA1\0" - "3270_PA2\0" - "3270_PA3\0" - "3270_Play\0" - "3270_PrintScreen\0" - "3270_Quit\0" - "3270_Record\0" - "3270_Reset\0" - "3270_Right2\0" - "3270_Rule\0" - "3270_Setup\0" - "3270_Test\0" - "4\0" - "5\0" - "6\0" - "7\0" - "8\0" - "9\0" - "A\0" - "a\0" - "Aacute\0" - "aacute\0" - "Abelowdot\0" - "abelowdot\0" - "abovedot\0" - "Abreve\0" - "abreve\0" - "Abreveacute\0" - "abreveacute\0" - "Abrevebelowdot\0" - "abrevebelowdot\0" - "Abrevegrave\0" - "abrevegrave\0" - "Abrevehook\0" - "abrevehook\0" - "Abrevetilde\0" - "abrevetilde\0" - "AccessX_Enable\0" - "AccessX_Feedback_Enable\0" - "Acircumflex\0" - "acircumflex\0" - "Acircumflexacute\0" - "acircumflexacute\0" - "Acircumflexbelowdot\0" - "acircumflexbelowdot\0" - "Acircumflexgrave\0" - "acircumflexgrave\0" - "Acircumflexhook\0" - "acircumflexhook\0" - "Acircumflextilde\0" - "acircumflextilde\0" - "acute\0" - "Adiaeresis\0" - "adiaeresis\0" - "AE\0" - "ae\0" - "Agrave\0" - "agrave\0" - "Ahook\0" - "ahook\0" - "Alt_L\0" - "Alt_R\0" - "Amacron\0" - "amacron\0" - "ampersand\0" - "Aogonek\0" - "aogonek\0" - "apostrophe\0" - "approxeq\0" - "approximate\0" - "Arabic_0\0" - "Arabic_1\0" - "Arabic_2\0" - "Arabic_3\0" - "Arabic_4\0" - "Arabic_5\0" - "Arabic_6\0" - "Arabic_7\0" - "Arabic_8\0" - "Arabic_9\0" - "Arabic_ain\0" - "Arabic_alef\0" - "Arabic_alefmaksura\0" - "Arabic_beh\0" - "Arabic_comma\0" - "Arabic_dad\0" - "Arabic_dal\0" - "Arabic_damma\0" - "Arabic_dammatan\0" - "Arabic_ddal\0" - "Arabic_farsi_yeh\0" - "Arabic_fatha\0" - "Arabic_fathatan\0" - "Arabic_feh\0" - "Arabic_fullstop\0" - "Arabic_gaf\0" - "Arabic_ghain\0" - "Arabic_ha\0" - "Arabic_hah\0" - "Arabic_hamza\0" - "Arabic_hamza_above\0" - "Arabic_hamza_below\0" - "Arabic_hamzaonalef\0" - "Arabic_hamzaonwaw\0" - "Arabic_hamzaonyeh\0" - "Arabic_hamzaunderalef\0" - "Arabic_heh\0" - "Arabic_heh_doachashmee\0" - "Arabic_heh_goal\0" - "Arabic_jeem\0" - "Arabic_jeh\0" - "Arabic_kaf\0" - "Arabic_kasra\0" - "Arabic_kasratan\0" - "Arabic_keheh\0" - "Arabic_khah\0" - "Arabic_lam\0" - "Arabic_madda_above\0" - "Arabic_maddaonalef\0" - "Arabic_meem\0" - "Arabic_noon\0" - "Arabic_noon_ghunna\0" - "Arabic_peh\0" - "Arabic_percent\0" - "Arabic_qaf\0" - "Arabic_question_mark\0" - "Arabic_ra\0" - "Arabic_rreh\0" - "Arabic_sad\0" - "Arabic_seen\0" - "Arabic_semicolon\0" - "Arabic_shadda\0" - "Arabic_sheen\0" - "Arabic_sukun\0" - "Arabic_superscript_alef\0" - "Arabic_switch\0" - "Arabic_tah\0" - "Arabic_tatweel\0" - "Arabic_tcheh\0" - "Arabic_teh\0" - "Arabic_tehmarbuta\0" - "Arabic_thal\0" - "Arabic_theh\0" - "Arabic_tteh\0" - "Arabic_veh\0" - "Arabic_waw\0" - "Arabic_yeh\0" - "Arabic_yeh_baree\0" - "Arabic_zah\0" - "Arabic_zain\0" - "Aring\0" - "aring\0" - "Armenian_accent\0" - "Armenian_amanak\0" - "Armenian_apostrophe\0" - "Armenian_AT\0" - "Armenian_at\0" - "Armenian_AYB\0" - "Armenian_ayb\0" - "Armenian_BEN\0" - "Armenian_ben\0" - "Armenian_but\0" - "Armenian_CHA\0" - "Armenian_cha\0" - "Armenian_DA\0" - "Armenian_da\0" - "Armenian_DZA\0" - "Armenian_dza\0" - "Armenian_E\0" - "Armenian_e\0" - "Armenian_exclam\0" - "Armenian_FE\0" - "Armenian_fe\0" - "Armenian_full_stop\0" - "Armenian_GHAT\0" - "Armenian_ghat\0" - "Armenian_GIM\0" - "Armenian_gim\0" - "Armenian_HI\0" - "Armenian_hi\0" - "Armenian_HO\0" - "Armenian_ho\0" - "Armenian_hyphen\0" - "Armenian_INI\0" - "Armenian_ini\0" - "Armenian_JE\0" - "Armenian_je\0" - "Armenian_KE\0" - "Armenian_ke\0" - "Armenian_KEN\0" - "Armenian_ken\0" - "Armenian_KHE\0" - "Armenian_khe\0" - "Armenian_ligature_ew\0" - "Armenian_LYUN\0" - "Armenian_lyun\0" - "Armenian_MEN\0" - "Armenian_men\0" - "Armenian_NU\0" - "Armenian_nu\0" - "Armenian_O\0" - "Armenian_o\0" - "Armenian_paruyk\0" - "Armenian_PE\0" - "Armenian_pe\0" - "Armenian_PYUR\0" - "Armenian_pyur\0" - "Armenian_question\0" - "Armenian_RA\0" - "Armenian_ra\0" - "Armenian_RE\0" - "Armenian_re\0" - "Armenian_SE\0" - "Armenian_se\0" - "Armenian_separation_mark\0" - "Armenian_SHA\0" - "Armenian_sha\0" - "Armenian_shesht\0" - "Armenian_TCHE\0" - "Armenian_tche\0" - "Armenian_TO\0" - "Armenian_to\0" - "Armenian_TSA\0" - "Armenian_tsa\0" - "Armenian_TSO\0" - "Armenian_tso\0" - "Armenian_TYUN\0" - "Armenian_tyun\0" - "Armenian_verjaket\0" - "Armenian_VEV\0" - "Armenian_vev\0" - "Armenian_VO\0" - "Armenian_vo\0" - "Armenian_VYUN\0" - "Armenian_vyun\0" - "Armenian_YECH\0" - "Armenian_yech\0" - "Armenian_yentamna\0" - "Armenian_ZA\0" - "Armenian_za\0" - "Armenian_ZHE\0" - "Armenian_zhe\0" - "asciicircum\0" - "asciitilde\0" - "asterisk\0" - "at\0" - "Atilde\0" - "atilde\0" - "AudibleBell_Enable\0" - "B\0" - "b\0" - "Babovedot\0" - "babovedot\0" - "backslash\0" - "BackSpace\0" - "BackTab\0" - "ballotcross\0" - "bar\0" - "because\0" - "Begin\0" - "blank\0" - "block\0" - "botintegral\0" - "botleftparens\0" - "botleftsqbracket\0" - "botleftsummation\0" - "botrightparens\0" - "botrightsqbracket\0" - "botrightsummation\0" - "bott\0" - "botvertsummationconnector\0" - "BounceKeys_Enable\0" - "braceleft\0" - "braceright\0" - "bracketleft\0" - "bracketright\0" - "braille_blank\0" - "braille_dot_1\0" - "braille_dot_10\0" - "braille_dot_2\0" - "braille_dot_3\0" - "braille_dot_4\0" - "braille_dot_5\0" - "braille_dot_6\0" - "braille_dot_7\0" - "braille_dot_8\0" - "braille_dot_9\0" - "braille_dots_1\0" - "braille_dots_12\0" - "braille_dots_123\0" - "braille_dots_1234\0" - "braille_dots_12345\0" - "braille_dots_123456\0" - "braille_dots_1234567\0" - "braille_dots_12345678\0" - "braille_dots_1234568\0" - "braille_dots_123457\0" - "braille_dots_1234578\0" - "braille_dots_123458\0" - "braille_dots_12346\0" - "braille_dots_123467\0" - "braille_dots_1234678\0" - "braille_dots_123468\0" - "braille_dots_12347\0" - "braille_dots_123478\0" - "braille_dots_12348\0" - "braille_dots_1235\0" - "braille_dots_12356\0" - "braille_dots_123567\0" - "braille_dots_1235678\0" - "braille_dots_123568\0" - "braille_dots_12357\0" - "braille_dots_123578\0" - "braille_dots_12358\0" - "braille_dots_1236\0" - "braille_dots_12367\0" - "braille_dots_123678\0" - "braille_dots_12368\0" - "braille_dots_1237\0" - "braille_dots_12378\0" - "braille_dots_1238\0" - "braille_dots_124\0" - "braille_dots_1245\0" - "braille_dots_12456\0" - "braille_dots_124567\0" - "braille_dots_1245678\0" - "braille_dots_124568\0" - "braille_dots_12457\0" - "braille_dots_124578\0" - "braille_dots_12458\0" - "braille_dots_1246\0" - "braille_dots_12467\0" - "braille_dots_124678\0" - "braille_dots_12468\0" - "braille_dots_1247\0" - "braille_dots_12478\0" - "braille_dots_1248\0" - "braille_dots_125\0" - "braille_dots_1256\0" - "braille_dots_12567\0" - "braille_dots_125678\0" - "braille_dots_12568\0" - "braille_dots_1257\0" - "braille_dots_12578\0" - "braille_dots_1258\0" - "braille_dots_126\0" - "braille_dots_1267\0" - "braille_dots_12678\0" - "braille_dots_1268\0" - "braille_dots_127\0" - "braille_dots_1278\0" - "braille_dots_128\0" - "braille_dots_13\0" - "braille_dots_134\0" - "braille_dots_1345\0" - "braille_dots_13456\0" - "braille_dots_134567\0" - "braille_dots_1345678\0" - "braille_dots_134568\0" - "braille_dots_13457\0" - "braille_dots_134578\0" - "braille_dots_13458\0" - "braille_dots_1346\0" - "braille_dots_13467\0" - "braille_dots_134678\0" - "braille_dots_13468\0" - "braille_dots_1347\0" - "braille_dots_13478\0" - "braille_dots_1348\0" - "braille_dots_135\0" - "braille_dots_1356\0" - "braille_dots_13567\0" - "braille_dots_135678\0" - "braille_dots_13568\0" - "braille_dots_1357\0" - "braille_dots_13578\0" - "braille_dots_1358\0" - "braille_dots_136\0" - "braille_dots_1367\0" - "braille_dots_13678\0" - "braille_dots_1368\0" - "braille_dots_137\0" - "braille_dots_1378\0" - "braille_dots_138\0" - "braille_dots_14\0" - "braille_dots_145\0" - "braille_dots_1456\0" - "braille_dots_14567\0" - "braille_dots_145678\0" - "braille_dots_14568\0" - "braille_dots_1457\0" - "braille_dots_14578\0" - "braille_dots_1458\0" - "braille_dots_146\0" - "braille_dots_1467\0" - "braille_dots_14678\0" - "braille_dots_1468\0" - "braille_dots_147\0" - "braille_dots_1478\0" - "braille_dots_148\0" - "braille_dots_15\0" - "braille_dots_156\0" - "braille_dots_1567\0" - "braille_dots_15678\0" - "braille_dots_1568\0" - "braille_dots_157\0" - "braille_dots_1578\0" - "braille_dots_158\0" - "braille_dots_16\0" - "braille_dots_167\0" - "braille_dots_1678\0" - "braille_dots_168\0" - "braille_dots_17\0" - "braille_dots_178\0" - "braille_dots_18\0" - "braille_dots_2\0" - "braille_dots_23\0" - "braille_dots_234\0" - "braille_dots_2345\0" - "braille_dots_23456\0" - "braille_dots_234567\0" - "braille_dots_2345678\0" - "braille_dots_234568\0" - "braille_dots_23457\0" - "braille_dots_234578\0" - "braille_dots_23458\0" - "braille_dots_2346\0" - "braille_dots_23467\0" - "braille_dots_234678\0" - "braille_dots_23468\0" - "braille_dots_2347\0" - "braille_dots_23478\0" - "braille_dots_2348\0" - "braille_dots_235\0" - "braille_dots_2356\0" - "braille_dots_23567\0" - "braille_dots_235678\0" - "braille_dots_23568\0" - "braille_dots_2357\0" - "braille_dots_23578\0" - "braille_dots_2358\0" - "braille_dots_236\0" - "braille_dots_2367\0" - "braille_dots_23678\0" - "braille_dots_2368\0" - "braille_dots_237\0" - "braille_dots_2378\0" - "braille_dots_238\0" - "braille_dots_24\0" - "braille_dots_245\0" - "braille_dots_2456\0" - "braille_dots_24567\0" - "braille_dots_245678\0" - "braille_dots_24568\0" - "braille_dots_2457\0" - "braille_dots_24578\0" - "braille_dots_2458\0" - "braille_dots_246\0" - "braille_dots_2467\0" - "braille_dots_24678\0" - "braille_dots_2468\0" - "braille_dots_247\0" - "braille_dots_2478\0" - "braille_dots_248\0" - "braille_dots_25\0" - "braille_dots_256\0" - "braille_dots_2567\0" - "braille_dots_25678\0" - "braille_dots_2568\0" - "braille_dots_257\0" - "braille_dots_2578\0" - "braille_dots_258\0" - "braille_dots_26\0" - "braille_dots_267\0" - "braille_dots_2678\0" - "braille_dots_268\0" - "braille_dots_27\0" - "braille_dots_278\0" - "braille_dots_28\0" - "braille_dots_3\0" - "braille_dots_34\0" - "braille_dots_345\0" - "braille_dots_3456\0" - "braille_dots_34567\0" - "braille_dots_345678\0" - "braille_dots_34568\0" - "braille_dots_3457\0" - "braille_dots_34578\0" - "braille_dots_3458\0" - "braille_dots_346\0" - "braille_dots_3467\0" - "braille_dots_34678\0" - "braille_dots_3468\0" - "braille_dots_347\0" - "braille_dots_3478\0" - "braille_dots_348\0" - "braille_dots_35\0" - "braille_dots_356\0" - "braille_dots_3567\0" - "braille_dots_35678\0" - "braille_dots_3568\0" - "braille_dots_357\0" - "braille_dots_3578\0" - "braille_dots_358\0" - "braille_dots_36\0" - "braille_dots_367\0" - "braille_dots_3678\0" - "braille_dots_368\0" - "braille_dots_37\0" - "braille_dots_378\0" - "braille_dots_38\0" - "braille_dots_4\0" - "braille_dots_45\0" - "braille_dots_456\0" - "braille_dots_4567\0" - "braille_dots_45678\0" - "braille_dots_4568\0" - "braille_dots_457\0" - "braille_dots_4578\0" - "braille_dots_458\0" - "braille_dots_46\0" - "braille_dots_467\0" - "braille_dots_4678\0" - "braille_dots_468\0" - "braille_dots_47\0" - "braille_dots_478\0" - "braille_dots_48\0" - "braille_dots_5\0" - "braille_dots_56\0" - "braille_dots_567\0" - "braille_dots_5678\0" - "braille_dots_568\0" - "braille_dots_57\0" - "braille_dots_578\0" - "braille_dots_58\0" - "braille_dots_6\0" - "braille_dots_67\0" - "braille_dots_678\0" - "braille_dots_68\0" - "braille_dots_7\0" - "braille_dots_78\0" - "braille_dots_8\0" - "Break\0" - "breve\0" - "brokenbar\0" - "Byelorussian_shortu\0" - "Byelorussian_SHORTU\0" - "C\0" - "c\0" - "c_h\0" - "C_h\0" - "C_H\0" - "Cabovedot\0" - "cabovedot\0" - "Cacute\0" - "cacute\0" - "Cancel\0" - "Caps_Lock\0" - "careof\0" - "caret\0" - "caron\0" - "Ccaron\0" - "ccaron\0" - "Ccedilla\0" - "ccedilla\0" - "Ccircumflex\0" - "ccircumflex\0" - "cedilla\0" - "cent\0" - "ch\0" - "Ch\0" - "CH\0" - "checkerboard\0" - "checkmark\0" - "circle\0" - "Clear\0" - "ClearLine\0" - "club\0" - "Codeinput\0" - "colon\0" - "ColonSign\0" - "comma\0" - "containsas\0" - "Control_L\0" - "Control_R\0" - "copyright\0" - "cr\0" - "crossinglines\0" - "CruzeiroSign\0" - "cuberoot\0" - "currency\0" - "cursor\0" - "Cyrillic_a\0" - "Cyrillic_A\0" - "Cyrillic_be\0" - "Cyrillic_BE\0" - "Cyrillic_che\0" - "Cyrillic_CHE\0" - "Cyrillic_CHE_descender\0" - "Cyrillic_che_descender\0" - "Cyrillic_CHE_vertstroke\0" - "Cyrillic_che_vertstroke\0" - "Cyrillic_de\0" - "Cyrillic_DE\0" - "Cyrillic_dzhe\0" - "Cyrillic_DZHE\0" - "Cyrillic_e\0" - "Cyrillic_E\0" - "Cyrillic_ef\0" - "Cyrillic_EF\0" - "Cyrillic_el\0" - "Cyrillic_EL\0" - "Cyrillic_em\0" - "Cyrillic_EM\0" - "Cyrillic_en\0" - "Cyrillic_EN\0" - "Cyrillic_EN_descender\0" - "Cyrillic_en_descender\0" - "Cyrillic_er\0" - "Cyrillic_ER\0" - "Cyrillic_es\0" - "Cyrillic_ES\0" - "Cyrillic_ghe\0" - "Cyrillic_GHE\0" - "Cyrillic_GHE_bar\0" - "Cyrillic_ghe_bar\0" - "Cyrillic_ha\0" - "Cyrillic_HA\0" - "Cyrillic_HA_descender\0" - "Cyrillic_ha_descender\0" - "Cyrillic_hardsign\0" - "Cyrillic_HARDSIGN\0" - "Cyrillic_i\0" - "Cyrillic_I\0" - "Cyrillic_I_macron\0" - "Cyrillic_i_macron\0" - "Cyrillic_ie\0" - "Cyrillic_IE\0" - "Cyrillic_io\0" - "Cyrillic_IO\0" - "Cyrillic_je\0" - "Cyrillic_JE\0" - "Cyrillic_ka\0" - "Cyrillic_KA\0" - "Cyrillic_KA_descender\0" - "Cyrillic_ka_descender\0" - "Cyrillic_KA_vertstroke\0" - "Cyrillic_ka_vertstroke\0" - "Cyrillic_lje\0" - "Cyrillic_LJE\0" - "Cyrillic_nje\0" - "Cyrillic_NJE\0" - "Cyrillic_o\0" - "Cyrillic_O\0" - "Cyrillic_O_bar\0" - "Cyrillic_o_bar\0" - "Cyrillic_pe\0" - "Cyrillic_PE\0" - "Cyrillic_SCHWA\0" - "Cyrillic_schwa\0" - "Cyrillic_sha\0" - "Cyrillic_SHA\0" - "Cyrillic_shcha\0" - "Cyrillic_SHCHA\0" - "Cyrillic_SHHA\0" - "Cyrillic_shha\0" - "Cyrillic_shorti\0" - "Cyrillic_SHORTI\0" - "Cyrillic_softsign\0" - "Cyrillic_SOFTSIGN\0" - "Cyrillic_te\0" - "Cyrillic_TE\0" - "Cyrillic_tse\0" - "Cyrillic_TSE\0" - "Cyrillic_u\0" - "Cyrillic_U\0" - "Cyrillic_U_macron\0" - "Cyrillic_u_macron\0" - "Cyrillic_U_straight\0" - "Cyrillic_u_straight\0" - "Cyrillic_U_straight_bar\0" - "Cyrillic_u_straight_bar\0" - "Cyrillic_ve\0" - "Cyrillic_VE\0" - "Cyrillic_ya\0" - "Cyrillic_YA\0" - "Cyrillic_yeru\0" - "Cyrillic_YERU\0" - "Cyrillic_yu\0" - "Cyrillic_YU\0" - "Cyrillic_ze\0" - "Cyrillic_ZE\0" - "Cyrillic_zhe\0" - "Cyrillic_ZHE\0" - "Cyrillic_ZHE_descender\0" - "Cyrillic_zhe_descender\0" - "D\0" - "d\0" - "Dabovedot\0" - "dabovedot\0" - "Dacute_accent\0" - "dagger\0" - "Dcaron\0" - "dcaron\0" - "Dcedilla_accent\0" - "Dcircumflex_accent\0" - "Ddiaeresis\0" - "dead_a\0" - "dead_A\0" - "dead_abovecomma\0" - "dead_abovedot\0" - "dead_abovereversedcomma\0" - "dead_abovering\0" - "dead_aboveverticalline\0" - "dead_acute\0" - "dead_belowbreve\0" - "dead_belowcircumflex\0" - "dead_belowcomma\0" - "dead_belowdiaeresis\0" - "dead_belowdot\0" - "dead_belowmacron\0" - "dead_belowring\0" - "dead_belowtilde\0" - "dead_belowverticalline\0" - "dead_breve\0" - "dead_capital_schwa\0" - "dead_caron\0" - "dead_cedilla\0" - "dead_circumflex\0" - "dead_currency\0" - "dead_dasia\0" - "dead_diaeresis\0" - "dead_doubleacute\0" - "dead_doublegrave\0" - "dead_e\0" - "dead_E\0" - "dead_grave\0" - "dead_greek\0" - "dead_hook\0" - "dead_horn\0" - "dead_i\0" - "dead_I\0" - "dead_invertedbreve\0" - "dead_iota\0" - "dead_longsolidusoverlay\0" - "dead_lowline\0" - "dead_macron\0" - "dead_o\0" - "dead_O\0" - "dead_ogonek\0" - "dead_perispomeni\0" - "dead_psili\0" - "dead_semivoiced_sound\0" - "dead_small_schwa\0" - "dead_stroke\0" - "dead_tilde\0" - "dead_u\0" - "dead_U\0" - "dead_voiced_sound\0" - "decimalpoint\0" - "degree\0" - "Delete\0" - "DeleteChar\0" - "DeleteLine\0" - "Dgrave_accent\0" - "diaeresis\0" - "diamond\0" - "digitspace\0" - "dintegral\0" - "division\0" - "dollar\0" - "DongSign\0" - "doubbaselinedot\0" - "doubleacute\0" - "doubledagger\0" - "doublelowquotemark\0" - "Down\0" - "downarrow\0" - "downcaret\0" - "downshoe\0" - "downstile\0" - "downtack\0" - "DRemove\0" - "Dring_accent\0" - "Dstroke\0" - "dstroke\0" - "Dtilde\0" - "E\0" - "e\0" - "Eabovedot\0" - "eabovedot\0" - "Eacute\0" - "eacute\0" - "Ebelowdot\0" - "ebelowdot\0" - "Ecaron\0" - "ecaron\0" - "Ecircumflex\0" - "ecircumflex\0" - "Ecircumflexacute\0" - "ecircumflexacute\0" - "Ecircumflexbelowdot\0" - "ecircumflexbelowdot\0" - "Ecircumflexgrave\0" - "ecircumflexgrave\0" - "Ecircumflexhook\0" - "ecircumflexhook\0" - "Ecircumflextilde\0" - "ecircumflextilde\0" - "EcuSign\0" - "Ediaeresis\0" - "ediaeresis\0" - "Egrave\0" - "egrave\0" - "Ehook\0" - "ehook\0" - "eightsubscript\0" - "eightsuperior\0" - "Eisu_Shift\0" - "Eisu_toggle\0" - "elementof\0" - "ellipsis\0" - "em3space\0" - "em4space\0" - "Emacron\0" - "emacron\0" - "emdash\0" - "emfilledcircle\0" - "emfilledrect\0" - "emopencircle\0" - "emopenrectangle\0" - "emptyset\0" - "emspace\0" - "End\0" - "endash\0" - "enfilledcircbullet\0" - "enfilledsqbullet\0" - "ENG\0" - "eng\0" - "enopencircbullet\0" - "enopensquarebullet\0" - "enspace\0" - "Eogonek\0" - "eogonek\0" - "equal\0" - "Escape\0" - "ETH\0" - "Eth\0" - "eth\0" - "Etilde\0" - "etilde\0" - "EuroSign\0" - "exclam\0" - "exclamdown\0" - "Execute\0" - "Ext16bit_L\0" - "Ext16bit_R\0" - "EZH\0" - "ezh\0" - "F\0" - "f\0" - "F1\0" - "F10\0" - "F11\0" - "F12\0" - "F13\0" - "F14\0" - "F15\0" - "F16\0" - "F17\0" - "F18\0" - "F19\0" - "F2\0" - "F20\0" - "F21\0" - "F22\0" - "F23\0" - "F24\0" - "F25\0" - "F26\0" - "F27\0" - "F28\0" - "F29\0" - "F3\0" - "F30\0" - "F31\0" - "F32\0" - "F33\0" - "F34\0" - "F35\0" - "F4\0" - "F5\0" - "F6\0" - "F7\0" - "F8\0" - "F9\0" - "Fabovedot\0" - "fabovedot\0" - "Farsi_0\0" - "Farsi_1\0" - "Farsi_2\0" - "Farsi_3\0" - "Farsi_4\0" - "Farsi_5\0" - "Farsi_6\0" - "Farsi_7\0" - "Farsi_8\0" - "Farsi_9\0" - "Farsi_yeh\0" - "femalesymbol\0" - "ff\0" - "FFrancSign\0" - "figdash\0" - "filledlefttribullet\0" - "filledrectbullet\0" - "filledrighttribullet\0" - "filledtribulletdown\0" - "filledtribulletup\0" - "Find\0" - "First_Virtual_Screen\0" - "fiveeighths\0" - "fivesixths\0" - "fivesubscript\0" - "fivesuperior\0" - "fourfifths\0" - "foursubscript\0" - "foursuperior\0" - "fourthroot\0" - "function\0" - "G\0" - "g\0" - "Gabovedot\0" - "gabovedot\0" - "Gbreve\0" - "gbreve\0" - "Gcaron\0" - "gcaron\0" - "Gcedilla\0" - "gcedilla\0" - "Gcircumflex\0" - "gcircumflex\0" - "Georgian_an\0" - "Georgian_ban\0" - "Georgian_can\0" - "Georgian_char\0" - "Georgian_chin\0" - "Georgian_cil\0" - "Georgian_don\0" - "Georgian_en\0" - "Georgian_fi\0" - "Georgian_gan\0" - "Georgian_ghan\0" - "Georgian_hae\0" - "Georgian_har\0" - "Georgian_he\0" - "Georgian_hie\0" - "Georgian_hoe\0" - "Georgian_in\0" - "Georgian_jhan\0" - "Georgian_jil\0" - "Georgian_kan\0" - "Georgian_khar\0" - "Georgian_las\0" - "Georgian_man\0" - "Georgian_nar\0" - "Georgian_on\0" - "Georgian_par\0" - "Georgian_phar\0" - "Georgian_qar\0" - "Georgian_rae\0" - "Georgian_san\0" - "Georgian_shin\0" - "Georgian_tan\0" - "Georgian_tar\0" - "Georgian_un\0" - "Georgian_vin\0" - "Georgian_we\0" - "Georgian_xan\0" - "Georgian_zen\0" - "Georgian_zhar\0" - "grave\0" - "greater\0" - "greaterthanequal\0" - "Greek_accentdieresis\0" - "Greek_ALPHA\0" - "Greek_alpha\0" - "Greek_ALPHAaccent\0" - "Greek_alphaaccent\0" - "Greek_BETA\0" - "Greek_beta\0" - "Greek_CHI\0" - "Greek_chi\0" - "Greek_DELTA\0" - "Greek_delta\0" - "Greek_EPSILON\0" - "Greek_epsilon\0" - "Greek_EPSILONaccent\0" - "Greek_epsilonaccent\0" - "Greek_ETA\0" - "Greek_eta\0" - "Greek_ETAaccent\0" - "Greek_etaaccent\0" - "Greek_finalsmallsigma\0" - "Greek_GAMMA\0" - "Greek_gamma\0" - "Greek_horizbar\0" - "Greek_IOTA\0" - "Greek_iota\0" - "Greek_IOTAaccent\0" - "Greek_iotaaccent\0" - "Greek_iotaaccentdieresis\0" - "Greek_IOTAdiaeresis\0" - "Greek_IOTAdieresis\0" - "Greek_iotadieresis\0" - "Greek_KAPPA\0" - "Greek_kappa\0" - "Greek_LAMBDA\0" - "Greek_lambda\0" - "Greek_LAMDA\0" - "Greek_lamda\0" - "Greek_MU\0" - "Greek_mu\0" - "Greek_NU\0" - "Greek_nu\0" - "Greek_OMEGA\0" - "Greek_omega\0" - "Greek_OMEGAaccent\0" - "Greek_omegaaccent\0" - "Greek_OMICRON\0" - "Greek_omicron\0" - "Greek_OMICRONaccent\0" - "Greek_omicronaccent\0" - "Greek_PHI\0" - "Greek_phi\0" - "Greek_PI\0" - "Greek_pi\0" - "Greek_PSI\0" - "Greek_psi\0" - "Greek_RHO\0" - "Greek_rho\0" - "Greek_SIGMA\0" - "Greek_sigma\0" - "Greek_switch\0" - "Greek_TAU\0" - "Greek_tau\0" - "Greek_THETA\0" - "Greek_theta\0" - "Greek_UPSILON\0" - "Greek_upsilon\0" - "Greek_UPSILONaccent\0" - "Greek_upsilonaccent\0" - "Greek_upsilonaccentdieresis\0" - "Greek_UPSILONdieresis\0" - "Greek_upsilondieresis\0" - "Greek_XI\0" - "Greek_xi\0" - "Greek_ZETA\0" - "Greek_zeta\0" - "guilder\0" - "guillemotleft\0" - "guillemotright\0" - "H\0" - "h\0" - "hairspace\0" - "Hangul\0" - "Hangul_A\0" - "Hangul_AE\0" - "Hangul_AraeA\0" - "Hangul_AraeAE\0" - "Hangul_Banja\0" - "Hangul_Cieuc\0" - "Hangul_Codeinput\0" - "Hangul_Dikeud\0" - "Hangul_E\0" - "Hangul_End\0" - "Hangul_EO\0" - "Hangul_EU\0" - "Hangul_Hanja\0" - "Hangul_Hieuh\0" - "Hangul_I\0" - "Hangul_Ieung\0" - "Hangul_J_Cieuc\0" - "Hangul_J_Dikeud\0" - "Hangul_J_Hieuh\0" - "Hangul_J_Ieung\0" - "Hangul_J_Jieuj\0" - "Hangul_J_Khieuq\0" - "Hangul_J_Kiyeog\0" - "Hangul_J_KiyeogSios\0" - "Hangul_J_KkogjiDalrinIeung\0" - "Hangul_J_Mieum\0" - "Hangul_J_Nieun\0" - "Hangul_J_NieunHieuh\0" - "Hangul_J_NieunJieuj\0" - "Hangul_J_PanSios\0" - "Hangul_J_Phieuf\0" - "Hangul_J_Pieub\0" - "Hangul_J_PieubSios\0" - "Hangul_J_Rieul\0" - "Hangul_J_RieulHieuh\0" - "Hangul_J_RieulKiyeog\0" - "Hangul_J_RieulMieum\0" - "Hangul_J_RieulPhieuf\0" - "Hangul_J_RieulPieub\0" - "Hangul_J_RieulSios\0" - "Hangul_J_RieulTieut\0" - "Hangul_J_Sios\0" - "Hangul_J_SsangKiyeog\0" - "Hangul_J_SsangSios\0" - "Hangul_J_Tieut\0" - "Hangul_J_YeorinHieuh\0" - "Hangul_Jamo\0" - "Hangul_Jeonja\0" - "Hangul_Jieuj\0" - "Hangul_Khieuq\0" - "Hangul_Kiyeog\0" - "Hangul_KiyeogSios\0" - "Hangul_KkogjiDalrinIeung\0" - "Hangul_Mieum\0" - "Hangul_MultipleCandidate\0" - "Hangul_Nieun\0" - "Hangul_NieunHieuh\0" - "Hangul_NieunJieuj\0" - "Hangul_O\0" - "Hangul_OE\0" - "Hangul_PanSios\0" - "Hangul_Phieuf\0" - "Hangul_Pieub\0" - "Hangul_PieubSios\0" - "Hangul_PostHanja\0" - "Hangul_PreHanja\0" - "Hangul_PreviousCandidate\0" - "Hangul_Rieul\0" - "Hangul_RieulHieuh\0" - "Hangul_RieulKiyeog\0" - "Hangul_RieulMieum\0" - "Hangul_RieulPhieuf\0" - "Hangul_RieulPieub\0" - "Hangul_RieulSios\0" - "Hangul_RieulTieut\0" - "Hangul_RieulYeorinHieuh\0" - "Hangul_Romaja\0" - "Hangul_SingleCandidate\0" - "Hangul_Sios\0" - "Hangul_Special\0" - "Hangul_SsangDikeud\0" - "Hangul_SsangJieuj\0" - "Hangul_SsangKiyeog\0" - "Hangul_SsangPieub\0" - "Hangul_SsangSios\0" - "Hangul_Start\0" - "Hangul_SunkyeongeumMieum\0" - "Hangul_SunkyeongeumPhieuf\0" - "Hangul_SunkyeongeumPieub\0" - "Hangul_switch\0" - "Hangul_Tieut\0" - "Hangul_U\0" - "Hangul_WA\0" - "Hangul_WAE\0" - "Hangul_WE\0" - "Hangul_WEO\0" - "Hangul_WI\0" - "Hangul_YA\0" - "Hangul_YAE\0" - "Hangul_YE\0" - "Hangul_YEO\0" - "Hangul_YeorinHieuh\0" - "Hangul_YI\0" - "Hangul_YO\0" - "Hangul_YU\0" - "Hankaku\0" - "Hcircumflex\0" - "hcircumflex\0" - "heart\0" - "hebrew_aleph\0" - "hebrew_ayin\0" - "hebrew_bet\0" - "hebrew_beth\0" - "hebrew_chet\0" - "hebrew_dalet\0" - "hebrew_daleth\0" - "hebrew_doublelowline\0" - "hebrew_finalkaph\0" - "hebrew_finalmem\0" - "hebrew_finalnun\0" - "hebrew_finalpe\0" - "hebrew_finalzade\0" - "hebrew_finalzadi\0" - "hebrew_gimel\0" - "hebrew_gimmel\0" - "hebrew_he\0" - "hebrew_het\0" - "hebrew_kaph\0" - "hebrew_kuf\0" - "hebrew_lamed\0" - "hebrew_mem\0" - "hebrew_nun\0" - "hebrew_pe\0" - "hebrew_qoph\0" - "hebrew_resh\0" - "hebrew_samech\0" - "hebrew_samekh\0" - "hebrew_shin\0" - "Hebrew_switch\0" - "hebrew_taf\0" - "hebrew_taw\0" - "hebrew_tet\0" - "hebrew_teth\0" - "hebrew_waw\0" - "hebrew_yod\0" - "hebrew_zade\0" - "hebrew_zadi\0" - "hebrew_zain\0" - "hebrew_zayin\0" - "Help\0" - "Henkan\0" - "Henkan_Mode\0" - "hexagram\0" - "Hiragana\0" - "Hiragana_Katakana\0" - "Home\0" - "horizconnector\0" - "horizlinescan1\0" - "horizlinescan3\0" - "horizlinescan5\0" - "horizlinescan7\0" - "horizlinescan9\0" - "hpBackTab\0" - "hpblock\0" - "hpClearLine\0" - "hpDeleteChar\0" - "hpDeleteLine\0" - "hpguilder\0" - "hpInsertChar\0" - "hpInsertLine\0" - "hpIO\0" - "hpKP_BackTab\0" - "hplira\0" - "hplongminus\0" - "hpModelock1\0" - "hpModelock2\0" - "hpmute_acute\0" - "hpmute_asciicircum\0" - "hpmute_asciitilde\0" - "hpmute_diaeresis\0" - "hpmute_grave\0" - "hpReset\0" - "hpSystem\0" - "hpUser\0" - "hpYdiaeresis\0" - "Hstroke\0" - "hstroke\0" - "ht\0" - "Hyper_L\0" - "Hyper_R\0" - "hyphen\0" - "I\0" - "i\0" - "Iabovedot\0" - "Iacute\0" - "iacute\0" - "Ibelowdot\0" - "ibelowdot\0" - "Ibreve\0" - "ibreve\0" - "Icircumflex\0" - "icircumflex\0" - "identical\0" - "Idiaeresis\0" - "idiaeresis\0" - "idotless\0" - "ifonlyif\0" - "Igrave\0" - "igrave\0" - "Ihook\0" - "ihook\0" - "Imacron\0" - "imacron\0" - "implies\0" - "includedin\0" - "includes\0" - "infinity\0" - "Insert\0" - "InsertChar\0" - "InsertLine\0" - "integral\0" - "intersection\0" - "IO\0" - "Iogonek\0" - "iogonek\0" - "ISO_Center_Object\0" - "ISO_Continuous_Underline\0" - "ISO_Discontinuous_Underline\0" - "ISO_Emphasize\0" - "ISO_Enter\0" - "ISO_Fast_Cursor_Down\0" - "ISO_Fast_Cursor_Left\0" - "ISO_Fast_Cursor_Right\0" - "ISO_Fast_Cursor_Up\0" - "ISO_First_Group\0" - "ISO_First_Group_Lock\0" - "ISO_Group_Latch\0" - "ISO_Group_Lock\0" - "ISO_Group_Shift\0" - "ISO_Last_Group\0" - "ISO_Last_Group_Lock\0" - "ISO_Left_Tab\0" - "ISO_Level2_Latch\0" - "ISO_Level3_Latch\0" - "ISO_Level3_Lock\0" - "ISO_Level3_Shift\0" - "ISO_Level5_Latch\0" - "ISO_Level5_Lock\0" - "ISO_Level5_Shift\0" - "ISO_Lock\0" - "ISO_Move_Line_Down\0" - "ISO_Move_Line_Up\0" - "ISO_Next_Group\0" - "ISO_Next_Group_Lock\0" - "ISO_Partial_Line_Down\0" - "ISO_Partial_Line_Up\0" - "ISO_Partial_Space_Left\0" - "ISO_Partial_Space_Right\0" - "ISO_Prev_Group\0" - "ISO_Prev_Group_Lock\0" - "ISO_Release_Both_Margins\0" - "ISO_Release_Margin_Left\0" - "ISO_Release_Margin_Right\0" - "ISO_Set_Margin_Left\0" - "ISO_Set_Margin_Right\0" - "Itilde\0" - "itilde\0" - "J\0" - "j\0" - "Jcircumflex\0" - "jcircumflex\0" - "jot\0" - "K\0" - "k\0" - "kana_a\0" - "kana_A\0" - "kana_CHI\0" - "kana_closingbracket\0" - "kana_comma\0" - "kana_conjunctive\0" - "kana_e\0" - "kana_E\0" - "kana_FU\0" - "kana_fullstop\0" - "kana_HA\0" - "kana_HE\0" - "kana_HI\0" - "kana_HO\0" - "kana_HU\0" - "kana_i\0" - "kana_I\0" - "kana_KA\0" - "kana_KE\0" - "kana_KI\0" - "kana_KO\0" - "kana_KU\0" - "Kana_Lock\0" - "kana_MA\0" - "kana_ME\0" - "kana_MI\0" - "kana_middledot\0" - "kana_MO\0" - "kana_MU\0" - "kana_N\0" - "kana_NA\0" - "kana_NE\0" - "kana_NI\0" - "kana_NO\0" - "kana_NU\0" - "kana_o\0" - "kana_O\0" - "kana_openingbracket\0" - "kana_RA\0" - "kana_RE\0" - "kana_RI\0" - "kana_RO\0" - "kana_RU\0" - "kana_SA\0" - "kana_SE\0" - "kana_SHI\0" - "Kana_Shift\0" - "kana_SO\0" - "kana_SU\0" - "kana_switch\0" - "kana_TA\0" - "kana_TE\0" - "kana_TI\0" - "kana_TO\0" - "kana_tsu\0" - "kana_TSU\0" - "kana_tu\0" - "kana_TU\0" - "kana_u\0" - "kana_U\0" - "kana_WA\0" - "kana_WO\0" - "kana_ya\0" - "kana_YA\0" - "kana_yo\0" - "kana_YO\0" - "kana_yu\0" - "kana_YU\0" - "Kanji\0" - "Kanji_Bangou\0" - "kappa\0" - "Katakana\0" - "Kcedilla\0" - "kcedilla\0" - "Korean_Won\0" - "KP_0\0" - "KP_1\0" - "KP_2\0" - "KP_3\0" - "KP_4\0" - "KP_5\0" - "KP_6\0" - "KP_7\0" - "KP_8\0" - "KP_9\0" - "KP_Add\0" - "KP_BackTab\0" - "KP_Begin\0" - "KP_Decimal\0" - "KP_Delete\0" - "KP_Divide\0" - "KP_Down\0" - "KP_End\0" - "KP_Enter\0" - "KP_Equal\0" - "KP_F1\0" - "KP_F2\0" - "KP_F3\0" - "KP_F4\0" - "KP_Home\0" - "KP_Insert\0" - "KP_Left\0" - "KP_Multiply\0" - "KP_Next\0" - "KP_Page_Down\0" - "KP_Page_Up\0" - "KP_Prior\0" - "KP_Right\0" - "KP_Separator\0" - "KP_Space\0" - "KP_Subtract\0" - "KP_Tab\0" - "KP_Up\0" - "kra\0" - "L\0" - "l\0" - "L1\0" - "L10\0" - "L2\0" - "L3\0" - "L4\0" - "L5\0" - "L6\0" - "L7\0" - "L8\0" - "L9\0" - "Lacute\0" - "lacute\0" - "Last_Virtual_Screen\0" - "latincross\0" - "Lbelowdot\0" - "lbelowdot\0" - "Lcaron\0" - "lcaron\0" - "Lcedilla\0" - "lcedilla\0" - "Left\0" - "leftanglebracket\0" - "leftarrow\0" - "leftcaret\0" - "leftdoublequotemark\0" - "leftmiddlecurlybrace\0" - "leftopentriangle\0" - "leftpointer\0" - "leftradical\0" - "leftshoe\0" - "leftsinglequotemark\0" - "leftt\0" - "lefttack\0" - "less\0" - "lessthanequal\0" - "lf\0" - "Linefeed\0" - "lira\0" - "LiraSign\0" - "logicaland\0" - "logicalor\0" - "longminus\0" - "lowleftcorner\0" - "lowrightcorner\0" - "Lstroke\0" - "lstroke\0" - "M\0" - "m\0" - "Mabovedot\0" - "mabovedot\0" - "Macedonia_dse\0" - "Macedonia_DSE\0" - "Macedonia_gje\0" - "Macedonia_GJE\0" - "Macedonia_kje\0" - "Macedonia_KJE\0" - "macron\0" - "Mae_Koho\0" - "malesymbol\0" - "maltesecross\0" - "marker\0" - "masculine\0" - "Massyo\0" - "Menu\0" - "Meta_L\0" - "Meta_R\0" - "MillSign\0" - "minus\0" - "minutes\0" - "Mode_switch\0" - "MouseKeys_Accel_Enable\0" - "MouseKeys_Enable\0" - "mu\0" - "Muhenkan\0" - "Multi_key\0" - "MultipleCandidate\0" - "multiply\0" - "musicalflat\0" - "musicalsharp\0" - "mute_acute\0" - "mute_asciicircum\0" - "mute_asciitilde\0" - "mute_diaeresis\0" - "mute_grave\0" - "N\0" - "n\0" - "nabla\0" - "Nacute\0" - "nacute\0" - "NairaSign\0" - "Ncaron\0" - "ncaron\0" - "Ncedilla\0" - "ncedilla\0" - "NewSheqelSign\0" - "Next\0" - "Next_Virtual_Screen\0" - "ninesubscript\0" - "ninesuperior\0" - "nl\0" - "nobreakspace\0" - "NoSymbol\0" - "notapproxeq\0" - "notelementof\0" - "notequal\0" - "notidentical\0" - "notsign\0" - "Ntilde\0" - "ntilde\0" - "Num_Lock\0" - "numbersign\0" - "numerosign\0" - "O\0" - "o\0" - "Oacute\0" - "oacute\0" - "Obarred\0" - "obarred\0" - "Obelowdot\0" - "obelowdot\0" - "Ocaron\0" - "ocaron\0" - "Ocircumflex\0" - "ocircumflex\0" - "Ocircumflexacute\0" - "ocircumflexacute\0" - "Ocircumflexbelowdot\0" - "ocircumflexbelowdot\0" - "Ocircumflexgrave\0" - "ocircumflexgrave\0" - "Ocircumflexhook\0" - "ocircumflexhook\0" - "Ocircumflextilde\0" - "ocircumflextilde\0" - "Odiaeresis\0" - "odiaeresis\0" - "Odoubleacute\0" - "odoubleacute\0" - "OE\0" - "oe\0" - "ogonek\0" - "Ograve\0" - "ograve\0" - "Ohook\0" - "ohook\0" - "Ohorn\0" - "ohorn\0" - "Ohornacute\0" - "ohornacute\0" - "Ohornbelowdot\0" - "ohornbelowdot\0" - "Ohorngrave\0" - "ohorngrave\0" - "Ohornhook\0" - "ohornhook\0" - "Ohorntilde\0" - "ohorntilde\0" - "Omacron\0" - "omacron\0" - "oneeighth\0" - "onefifth\0" - "onehalf\0" - "onequarter\0" - "onesixth\0" - "onesubscript\0" - "onesuperior\0" - "onethird\0" - "Ooblique\0" - "ooblique\0" - "openrectbullet\0" - "openstar\0" - "opentribulletdown\0" - "opentribulletup\0" - "ordfeminine\0" - "osfActivate\0" - "osfAddMode\0" - "osfBackSpace\0" - "osfBackTab\0" - "osfBeginData\0" - "osfBeginLine\0" - "osfCancel\0" - "osfClear\0" - "osfCopy\0" - "osfCut\0" - "osfDelete\0" - "osfDeselectAll\0" - "osfDown\0" - "osfEndData\0" - "osfEndLine\0" - "osfEscape\0" - "osfExtend\0" - "osfHelp\0" - "osfInsert\0" - "osfLeft\0" - "osfMenu\0" - "osfMenuBar\0" - "osfNextField\0" - "osfNextMenu\0" - "osfPageDown\0" - "osfPageLeft\0" - "osfPageRight\0" - "osfPageUp\0" - "osfPaste\0" - "osfPrevField\0" - "osfPrevMenu\0" - "osfPrimaryPaste\0" - "osfQuickPaste\0" - "osfReselect\0" - "osfRestore\0" - "osfRight\0" - "osfSelect\0" - "osfSelectAll\0" - "osfUndo\0" - "osfUp\0" - "Oslash\0" - "oslash\0" - "Otilde\0" - "otilde\0" - "overbar\0" - "Overlay1_Enable\0" - "Overlay2_Enable\0" - "overline\0" - "P\0" - "p\0" - "Pabovedot\0" - "pabovedot\0" - "Page_Down\0" - "Page_Up\0" - "paragraph\0" - "parenleft\0" - "parenright\0" - "partdifferential\0" - "partialderivative\0" - "Pause\0" - "percent\0" - "period\0" - "periodcentered\0" - "permille\0" - "PesetaSign\0" - "phonographcopyright\0" - "plus\0" - "plusminus\0" - "Pointer_Accelerate\0" - "Pointer_Button1\0" - "Pointer_Button2\0" - "Pointer_Button3\0" - "Pointer_Button4\0" - "Pointer_Button5\0" - "Pointer_Button_Dflt\0" - "Pointer_DblClick1\0" - "Pointer_DblClick2\0" - "Pointer_DblClick3\0" - "Pointer_DblClick4\0" - "Pointer_DblClick5\0" - "Pointer_DblClick_Dflt\0" - "Pointer_DfltBtnNext\0" - "Pointer_DfltBtnPrev\0" - "Pointer_Down\0" - "Pointer_DownLeft\0" - "Pointer_DownRight\0" - "Pointer_Drag1\0" - "Pointer_Drag2\0" - "Pointer_Drag3\0" - "Pointer_Drag4\0" - "Pointer_Drag5\0" - "Pointer_Drag_Dflt\0" - "Pointer_EnableKeys\0" - "Pointer_Left\0" - "Pointer_Right\0" - "Pointer_Up\0" - "Pointer_UpLeft\0" - "Pointer_UpRight\0" - "prescription\0" - "Prev_Virtual_Screen\0" - "PreviousCandidate\0" - "Print\0" - "Prior\0" - "prolongedsound\0" - "punctspace\0" - "Q\0" - "q\0" - "quad\0" - "question\0" - "questiondown\0" - "quotedbl\0" - "quoteleft\0" - "quoteright\0" - "R\0" - "r\0" - "R1\0" - "R10\0" - "R11\0" - "R12\0" - "R13\0" - "R14\0" - "R15\0" - "R2\0" - "R3\0" - "R4\0" - "R5\0" - "R6\0" - "R7\0" - "R8\0" - "R9\0" - "Racute\0" - "racute\0" - "radical\0" - "Rcaron\0" - "rcaron\0" - "Rcedilla\0" - "rcedilla\0" - "Redo\0" - "registered\0" - "RepeatKeys_Enable\0" - "Reset\0" - "Return\0" - "Right\0" - "rightanglebracket\0" - "rightarrow\0" - "rightcaret\0" - "rightdoublequotemark\0" - "rightmiddlecurlybrace\0" - "rightmiddlesummation\0" - "rightopentriangle\0" - "rightpointer\0" - "rightshoe\0" - "rightsinglequotemark\0" - "rightt\0" - "righttack\0" - "Romaji\0" - "RupeeSign\0" - "S\0" - "s\0" - "Sabovedot\0" - "sabovedot\0" - "Sacute\0" - "sacute\0" - "Scaron\0" - "scaron\0" - "Scedilla\0" - "scedilla\0" - "SCHWA\0" - "schwa\0" - "Scircumflex\0" - "scircumflex\0" - "script_switch\0" - "Scroll_Lock\0" - "seconds\0" - "section\0" - "Select\0" - "semicolon\0" - "semivoicedsound\0" - "Serbian_dje\0" - "Serbian_DJE\0" - "Serbian_dze\0" - "Serbian_DZE\0" - "Serbian_je\0" - "Serbian_JE\0" - "Serbian_lje\0" - "Serbian_LJE\0" - "Serbian_nje\0" - "Serbian_NJE\0" - "Serbian_tshe\0" - "Serbian_TSHE\0" - "seveneighths\0" - "sevensubscript\0" - "sevensuperior\0" - "Shift_L\0" - "Shift_Lock\0" - "Shift_R\0" - "signaturemark\0" - "signifblank\0" - "similarequal\0" - "SingleCandidate\0" - "singlelowquotemark\0" - "Sinh_a\0" - "Sinh_aa\0" - "Sinh_aa2\0" - "Sinh_ae\0" - "Sinh_ae2\0" - "Sinh_aee\0" - "Sinh_aee2\0" - "Sinh_ai\0" - "Sinh_ai2\0" - "Sinh_al\0" - "Sinh_au\0" - "Sinh_au2\0" - "Sinh_ba\0" - "Sinh_bha\0" - "Sinh_ca\0" - "Sinh_cha\0" - "Sinh_dda\0" - "Sinh_ddha\0" - "Sinh_dha\0" - "Sinh_dhha\0" - "Sinh_e\0" - "Sinh_e2\0" - "Sinh_ee\0" - "Sinh_ee2\0" - "Sinh_fa\0" - "Sinh_ga\0" - "Sinh_gha\0" - "Sinh_h2\0" - "Sinh_ha\0" - "Sinh_i\0" - "Sinh_i2\0" - "Sinh_ii\0" - "Sinh_ii2\0" - "Sinh_ja\0" - "Sinh_jha\0" - "Sinh_jnya\0" - "Sinh_ka\0" - "Sinh_kha\0" - "Sinh_kunddaliya\0" - "Sinh_la\0" - "Sinh_lla\0" - "Sinh_lu\0" - "Sinh_lu2\0" - "Sinh_luu\0" - "Sinh_luu2\0" - "Sinh_ma\0" - "Sinh_mba\0" - "Sinh_na\0" - "Sinh_ndda\0" - "Sinh_ndha\0" - "Sinh_ng\0" - "Sinh_ng2\0" - "Sinh_nga\0" - "Sinh_nja\0" - "Sinh_nna\0" - "Sinh_nya\0" - "Sinh_o\0" - "Sinh_o2\0" - "Sinh_oo\0" - "Sinh_oo2\0" - "Sinh_pa\0" - "Sinh_pha\0" - "Sinh_ra\0" - "Sinh_ri\0" - "Sinh_rii\0" - "Sinh_ru2\0" - "Sinh_ruu2\0" - "Sinh_sa\0" - "Sinh_sha\0" - "Sinh_ssha\0" - "Sinh_tha\0" - "Sinh_thha\0" - "Sinh_tta\0" - "Sinh_ttha\0" - "Sinh_u\0" - "Sinh_u2\0" - "Sinh_uu\0" - "Sinh_uu2\0" - "Sinh_va\0" - "Sinh_ya\0" - "sixsubscript\0" - "sixsuperior\0" - "slash\0" - "SlowKeys_Enable\0" - "soliddiamond\0" - "space\0" - "squareroot\0" - "ssharp\0" - "sterling\0" - "StickyKeys_Enable\0" - "stricteq\0" - "SunAgain\0" - "SunAltGraph\0" - "SunAudioLowerVolume\0" - "SunAudioMute\0" - "SunAudioRaiseVolume\0" - "SunCompose\0" - "SunCopy\0" - "SunCut\0" - "SunF36\0" - "SunF37\0" - "SunFA_Acute\0" - "SunFA_Cedilla\0" - "SunFA_Circum\0" - "SunFA_Diaeresis\0" - "SunFA_Grave\0" - "SunFA_Tilde\0" - "SunFind\0" - "SunFront\0" - "SunOpen\0" - "SunPageDown\0" - "SunPageUp\0" - "SunPaste\0" - "SunPowerSwitch\0" - "SunPowerSwitchShift\0" - "SunPrint_Screen\0" - "SunProps\0" - "SunStop\0" - "SunSys_Req\0" - "SunUndo\0" - "SunVideoDegauss\0" - "SunVideoLowerBrightness\0" - "SunVideoRaiseBrightness\0" - "Super_L\0" - "Super_R\0" - "Sys_Req\0" - "System\0" - "T\0" - "t\0" - "Tab\0" - "Tabovedot\0" - "tabovedot\0" - "Tcaron\0" - "tcaron\0" - "Tcedilla\0" - "tcedilla\0" - "telephone\0" - "telephonerecorder\0" - "Terminate_Server\0" - "Thai_baht\0" - "Thai_bobaimai\0" - "Thai_chochan\0" - "Thai_chochang\0" - "Thai_choching\0" - "Thai_chochoe\0" - "Thai_dochada\0" - "Thai_dodek\0" - "Thai_fofa\0" - "Thai_fofan\0" - "Thai_hohip\0" - "Thai_honokhuk\0" - "Thai_khokhai\0" - "Thai_khokhon\0" - "Thai_khokhuat\0" - "Thai_khokhwai\0" - "Thai_khorakhang\0" - "Thai_kokai\0" - "Thai_lakkhangyao\0" - "Thai_lekchet\0" - "Thai_lekha\0" - "Thai_lekhok\0" - "Thai_lekkao\0" - "Thai_leknung\0" - "Thai_lekpaet\0" - "Thai_leksam\0" - "Thai_leksi\0" - "Thai_leksong\0" - "Thai_leksun\0" - "Thai_lochula\0" - "Thai_loling\0" - "Thai_lu\0" - "Thai_maichattawa\0" - "Thai_maiek\0" - "Thai_maihanakat\0" - "Thai_maihanakat_maitho\0" - "Thai_maitaikhu\0" - "Thai_maitho\0" - "Thai_maitri\0" - "Thai_maiyamok\0" - "Thai_moma\0" - "Thai_ngongu\0" - "Thai_nikhahit\0" - "Thai_nonen\0" - "Thai_nonu\0" - "Thai_oang\0" - "Thai_paiyannoi\0" - "Thai_phinthu\0" - "Thai_phophan\0" - "Thai_phophung\0" - "Thai_phosamphao\0" - "Thai_popla\0" - "Thai_rorua\0" - "Thai_ru\0" - "Thai_saraa\0" - "Thai_saraaa\0" - "Thai_saraae\0" - "Thai_saraaimaimalai\0" - "Thai_saraaimaimuan\0" - "Thai_saraam\0" - "Thai_sarae\0" - "Thai_sarai\0" - "Thai_saraii\0" - "Thai_sarao\0" - "Thai_sarau\0" - "Thai_saraue\0" - "Thai_sarauee\0" - "Thai_sarauu\0" - "Thai_sorusi\0" - "Thai_sosala\0" - "Thai_soso\0" - "Thai_sosua\0" - "Thai_thanthakhat\0" - "Thai_thonangmontho\0" - "Thai_thophuthao\0" - "Thai_thothahan\0" - "Thai_thothan\0" - "Thai_thothong\0" - "Thai_thothung\0" - "Thai_topatak\0" - "Thai_totao\0" - "Thai_wowaen\0" - "Thai_yoyak\0" - "Thai_yoying\0" - "therefore\0" - "thinspace\0" - "THORN\0" - "Thorn\0" - "thorn\0" - "threeeighths\0" - "threefifths\0" - "threequarters\0" - "threesubscript\0" - "threesuperior\0" - "tintegral\0" - "topintegral\0" - "topleftparens\0" - "topleftradical\0" - "topleftsqbracket\0" - "topleftsummation\0" - "toprightparens\0" - "toprightsqbracket\0" - "toprightsummation\0" - "topt\0" - "topvertsummationconnector\0" - "Touroku\0" - "trademark\0" - "trademarkincircle\0" - "Tslash\0" - "tslash\0" - "twofifths\0" - "twosubscript\0" - "twosuperior\0" - "twothirds\0" - "U\0" - "u\0" - "Uacute\0" - "uacute\0" - "Ubelowdot\0" - "ubelowdot\0" - "Ubreve\0" - "ubreve\0" - "Ucircumflex\0" - "ucircumflex\0" - "Udiaeresis\0" - "udiaeresis\0" - "Udoubleacute\0" - "udoubleacute\0" - "Ugrave\0" - "ugrave\0" - "Uhook\0" - "uhook\0" - "Uhorn\0" - "uhorn\0" - "Uhornacute\0" - "uhornacute\0" - "Uhornbelowdot\0" - "uhornbelowdot\0" - "Uhorngrave\0" - "uhorngrave\0" - "Uhornhook\0" - "uhornhook\0" - "Uhorntilde\0" - "uhorntilde\0" - "Ukrainian_ghe_with_upturn\0" - "Ukrainian_GHE_WITH_UPTURN\0" - "Ukrainian_i\0" - "Ukrainian_I\0" - "Ukrainian_ie\0" - "Ukrainian_IE\0" - "Ukrainian_yi\0" - "Ukrainian_YI\0" - "Ukranian_i\0" - "Ukranian_I\0" - "Ukranian_je\0" - "Ukranian_JE\0" - "Ukranian_yi\0" - "Ukranian_YI\0" - "Umacron\0" - "umacron\0" - "underbar\0" - "underscore\0" - "Undo\0" - "union\0" - "Uogonek\0" - "uogonek\0" - "Up\0" - "uparrow\0" - "upcaret\0" - "upleftcorner\0" - "uprightcorner\0" - "upshoe\0" - "upstile\0" - "uptack\0" - "Uring\0" - "uring\0" - "User\0" - "Utilde\0" - "utilde\0" - "V\0" - "v\0" - "variation\0" - "vertbar\0" - "vertconnector\0" - "voicedsound\0" - "VoidSymbol\0" - "vt\0" - "W\0" - "w\0" - "Wacute\0" - "wacute\0" - "Wcircumflex\0" - "wcircumflex\0" - "Wdiaeresis\0" - "wdiaeresis\0" - "Wgrave\0" - "wgrave\0" - "WonSign\0" - "X\0" - "x\0" - "Xabovedot\0" - "xabovedot\0" - "XF86AddFavorite\0" - "XF86ApplicationLeft\0" - "XF86ApplicationRight\0" - "XF86AudioCycleTrack\0" - "XF86AudioForward\0" - "XF86AudioLowerVolume\0" - "XF86AudioMedia\0" - "XF86AudioMicMute\0" - "XF86AudioMute\0" - "XF86AudioNext\0" - "XF86AudioPause\0" - "XF86AudioPlay\0" - "XF86AudioPreset\0" - "XF86AudioPrev\0" - "XF86AudioRaiseVolume\0" - "XF86AudioRandomPlay\0" - "XF86AudioRecord\0" - "XF86AudioRepeat\0" - "XF86AudioRewind\0" - "XF86AudioStop\0" - "XF86Away\0" - "XF86Back\0" - "XF86BackForward\0" - "XF86Battery\0" - "XF86Blue\0" - "XF86Bluetooth\0" - "XF86Book\0" - "XF86BrightnessAdjust\0" - "XF86Calculater\0" - "XF86Calculator\0" - "XF86Calendar\0" - "XF86CD\0" - "XF86Clear\0" - "XF86ClearGrab\0" - "XF86Close\0" - "XF86Community\0" - "XF86ContrastAdjust\0" - "XF86Copy\0" - "XF86Cut\0" - "XF86CycleAngle\0" - "XF86Display\0" - "XF86Documents\0" - "XF86DOS\0" - "XF86Eject\0" - "XF86Excel\0" - "XF86Explorer\0" - "XF86Favorites\0" - "XF86Finance\0" - "XF86Forward\0" - "XF86FrameBack\0" - "XF86FrameForward\0" - "XF86Game\0" - "XF86Go\0" - "XF86Green\0" - "XF86Hibernate\0" - "XF86History\0" - "XF86HomePage\0" - "XF86HotLinks\0" - "XF86iTouch\0" - "XF86KbdBrightnessDown\0" - "XF86KbdBrightnessUp\0" - "XF86KbdLightOnOff\0" - "XF86Keyboard\0" - "XF86Launch0\0" - "XF86Launch1\0" - "XF86Launch2\0" - "XF86Launch3\0" - "XF86Launch4\0" - "XF86Launch5\0" - "XF86Launch6\0" - "XF86Launch7\0" - "XF86Launch8\0" - "XF86Launch9\0" - "XF86LaunchA\0" - "XF86LaunchB\0" - "XF86LaunchC\0" - "XF86LaunchD\0" - "XF86LaunchE\0" - "XF86LaunchF\0" - "XF86LightBulb\0" - "XF86LogGrabInfo\0" - "XF86LogOff\0" - "XF86LogWindowTree\0" - "XF86Mail\0" - "XF86MailForward\0" - "XF86Market\0" - "XF86Meeting\0" - "XF86Memo\0" - "XF86MenuKB\0" - "XF86MenuPB\0" - "XF86Messenger\0" - "XF86ModeLock\0" - "XF86MonBrightnessDown\0" - "XF86MonBrightnessUp\0" - "XF86Music\0" - "XF86MyComputer\0" - "XF86MySites\0" - "XF86New\0" - "XF86News\0" - "XF86Next_VMode\0" - "XF86OfficeHome\0" - "XF86Open\0" - "XF86OpenURL\0" - "XF86Option\0" - "XF86Paste\0" - "XF86Phone\0" - "XF86Pictures\0" - "XF86PowerDown\0" - "XF86PowerOff\0" - "XF86Prev_VMode\0" - "XF86Q\0" - "XF86Red\0" - "XF86Refresh\0" - "XF86Reload\0" - "XF86Reply\0" - "XF86RFKill\0" - "XF86RockerDown\0" - "XF86RockerEnter\0" - "XF86RockerUp\0" - "XF86RotateWindows\0" - "XF86RotationKB\0" - "XF86RotationPB\0" - "XF86Save\0" - "XF86ScreenSaver\0" - "XF86ScrollClick\0" - "XF86ScrollDown\0" - "XF86ScrollUp\0" - "XF86Search\0" - "XF86Select\0" - "XF86Send\0" - "XF86Shop\0" - "XF86Sleep\0" - "XF86Spell\0" - "XF86SplitScreen\0" - "XF86Standby\0" - "XF86Start\0" - "XF86Stop\0" - "XF86Subtitle\0" - "XF86Support\0" - "XF86Suspend\0" - "XF86Switch_VT_1\0" - "XF86Switch_VT_10\0" - "XF86Switch_VT_11\0" - "XF86Switch_VT_12\0" - "XF86Switch_VT_2\0" - "XF86Switch_VT_3\0" - "XF86Switch_VT_4\0" - "XF86Switch_VT_5\0" - "XF86Switch_VT_6\0" - "XF86Switch_VT_7\0" - "XF86Switch_VT_8\0" - "XF86Switch_VT_9\0" - "XF86TaskPane\0" - "XF86Terminal\0" - "XF86Time\0" - "XF86ToDoList\0" - "XF86Tools\0" - "XF86TopMenu\0" - "XF86TouchpadOff\0" - "XF86TouchpadOn\0" - "XF86TouchpadToggle\0" - "XF86Travel\0" - "XF86Ungrab\0" - "XF86User1KB\0" - "XF86User2KB\0" - "XF86UserPB\0" - "XF86UWB\0" - "XF86VendorHome\0" - "XF86Video\0" - "XF86View\0" - "XF86WakeUp\0" - "XF86WebCam\0" - "XF86WheelButton\0" - "XF86WLAN\0" - "XF86Word\0" - "XF86WWAN\0" - "XF86WWW\0" - "XF86Xfer\0" - "XF86Yellow\0" - "XF86ZoomIn\0" - "XF86ZoomOut\0" - "Y\0" - "y\0" - "Yacute\0" - "yacute\0" - "Ybelowdot\0" - "ybelowdot\0" - "Ycircumflex\0" - "ycircumflex\0" - "ydiaeresis\0" - "Ydiaeresis\0" - "yen\0" - "Ygrave\0" - "ygrave\0" - "Yhook\0" - "yhook\0" - "Ytilde\0" - "ytilde\0" - "Z\0" - "z\0" - "Zabovedot\0" - "zabovedot\0" - "Zacute\0" - "zacute\0" - "Zcaron\0" - "zcaron\0" - "Zen_Koho\0" - "Zenkaku\0" - "Zenkaku_Hankaku\0" - "zerosubscript\0" - "zerosuperior\0" - "Zstroke\0" - "zstroke\0" -; -#pragma GCC diagnostic pop - -struct name_keysym { - xkb_keysym_t keysym; - uint32_t offset; -}; - -static const struct name_keysym name_to_keysym[] = { - { 0x00000030, 0 }, /* 0 */ - { 0x00000031, 2 }, /* 1 */ - { 0x00000032, 4 }, /* 2 */ - { 0x00000033, 6 }, /* 3 */ - { 0x0000fd10, 8 }, /* 3270_AltCursor */ - { 0x0000fd0e, 23 }, /* 3270_Attn */ - { 0x0000fd05, 33 }, /* 3270_BackTab */ - { 0x0000fd19, 46 }, /* 3270_ChangeScreen */ - { 0x0000fd15, 64 }, /* 3270_Copy */ - { 0x0000fd0f, 74 }, /* 3270_CursorBlink */ - { 0x0000fd1c, 91 }, /* 3270_CursorSelect */ - { 0x0000fd1a, 109 }, /* 3270_DeleteWord */ - { 0x0000fd01, 125 }, /* 3270_Duplicate */ - { 0x0000fd1e, 140 }, /* 3270_Enter */ - { 0x0000fd06, 151 }, /* 3270_EraseEOF */ - { 0x0000fd07, 165 }, /* 3270_EraseInput */ - { 0x0000fd1b, 181 }, /* 3270_ExSelect */ - { 0x0000fd02, 195 }, /* 3270_FieldMark */ - { 0x0000fd13, 210 }, /* 3270_Ident */ - { 0x0000fd12, 221 }, /* 3270_Jump */ - { 0x0000fd11, 231 }, /* 3270_KeyClick */ - { 0x0000fd04, 245 }, /* 3270_Left2 */ - { 0x0000fd0a, 256 }, /* 3270_PA1 */ - { 0x0000fd0b, 265 }, /* 3270_PA2 */ - { 0x0000fd0c, 274 }, /* 3270_PA3 */ - { 0x0000fd16, 283 }, /* 3270_Play */ - { 0x0000fd1d, 293 }, /* 3270_PrintScreen */ - { 0x0000fd09, 310 }, /* 3270_Quit */ - { 0x0000fd18, 320 }, /* 3270_Record */ - { 0x0000fd08, 332 }, /* 3270_Reset */ - { 0x0000fd03, 343 }, /* 3270_Right2 */ - { 0x0000fd14, 355 }, /* 3270_Rule */ - { 0x0000fd17, 365 }, /* 3270_Setup */ - { 0x0000fd0d, 376 }, /* 3270_Test */ - { 0x00000034, 386 }, /* 4 */ - { 0x00000035, 388 }, /* 5 */ - { 0x00000036, 390 }, /* 6 */ - { 0x00000037, 392 }, /* 7 */ - { 0x00000038, 394 }, /* 8 */ - { 0x00000039, 396 }, /* 9 */ - { 0x00000041, 398 }, /* A */ - { 0x00000061, 400 }, /* a */ - { 0x000000c1, 402 }, /* Aacute */ - { 0x000000e1, 409 }, /* aacute */ - { 0x01001ea0, 416 }, /* Abelowdot */ - { 0x01001ea1, 426 }, /* abelowdot */ - { 0x000001ff, 436 }, /* abovedot */ - { 0x000001c3, 445 }, /* Abreve */ - { 0x000001e3, 452 }, /* abreve */ - { 0x01001eae, 459 }, /* Abreveacute */ - { 0x01001eaf, 471 }, /* abreveacute */ - { 0x01001eb6, 483 }, /* Abrevebelowdot */ - { 0x01001eb7, 498 }, /* abrevebelowdot */ - { 0x01001eb0, 513 }, /* Abrevegrave */ - { 0x01001eb1, 525 }, /* abrevegrave */ - { 0x01001eb2, 537 }, /* Abrevehook */ - { 0x01001eb3, 548 }, /* abrevehook */ - { 0x01001eb4, 559 }, /* Abrevetilde */ - { 0x01001eb5, 571 }, /* abrevetilde */ - { 0x0000fe70, 583 }, /* AccessX_Enable */ - { 0x0000fe71, 598 }, /* AccessX_Feedback_Enable */ - { 0x000000c2, 622 }, /* Acircumflex */ - { 0x000000e2, 634 }, /* acircumflex */ - { 0x01001ea4, 646 }, /* Acircumflexacute */ - { 0x01001ea5, 663 }, /* acircumflexacute */ - { 0x01001eac, 680 }, /* Acircumflexbelowdot */ - { 0x01001ead, 700 }, /* acircumflexbelowdot */ - { 0x01001ea6, 720 }, /* Acircumflexgrave */ - { 0x01001ea7, 737 }, /* acircumflexgrave */ - { 0x01001ea8, 754 }, /* Acircumflexhook */ - { 0x01001ea9, 770 }, /* acircumflexhook */ - { 0x01001eaa, 786 }, /* Acircumflextilde */ - { 0x01001eab, 803 }, /* acircumflextilde */ - { 0x000000b4, 820 }, /* acute */ - { 0x000000c4, 826 }, /* Adiaeresis */ - { 0x000000e4, 837 }, /* adiaeresis */ - { 0x000000c6, 848 }, /* AE */ - { 0x000000e6, 851 }, /* ae */ - { 0x000000c0, 854 }, /* Agrave */ - { 0x000000e0, 861 }, /* agrave */ - { 0x01001ea2, 868 }, /* Ahook */ - { 0x01001ea3, 874 }, /* ahook */ - { 0x0000ffe9, 880 }, /* Alt_L */ - { 0x0000ffea, 886 }, /* Alt_R */ - { 0x000003c0, 892 }, /* Amacron */ - { 0x000003e0, 900 }, /* amacron */ - { 0x00000026, 908 }, /* ampersand */ - { 0x000001a1, 918 }, /* Aogonek */ - { 0x000001b1, 926 }, /* aogonek */ - { 0x00000027, 934 }, /* apostrophe */ - { 0x01002248, 945 }, /* approxeq */ - { 0x000008c8, 954 }, /* approximate */ - { 0x01000660, 966 }, /* Arabic_0 */ - { 0x01000661, 975 }, /* Arabic_1 */ - { 0x01000662, 984 }, /* Arabic_2 */ - { 0x01000663, 993 }, /* Arabic_3 */ - { 0x01000664, 1002 }, /* Arabic_4 */ - { 0x01000665, 1011 }, /* Arabic_5 */ - { 0x01000666, 1020 }, /* Arabic_6 */ - { 0x01000667, 1029 }, /* Arabic_7 */ - { 0x01000668, 1038 }, /* Arabic_8 */ - { 0x01000669, 1047 }, /* Arabic_9 */ - { 0x000005d9, 1056 }, /* Arabic_ain */ - { 0x000005c7, 1067 }, /* Arabic_alef */ - { 0x000005e9, 1079 }, /* Arabic_alefmaksura */ - { 0x000005c8, 1098 }, /* Arabic_beh */ - { 0x000005ac, 1109 }, /* Arabic_comma */ - { 0x000005d6, 1122 }, /* Arabic_dad */ - { 0x000005cf, 1133 }, /* Arabic_dal */ - { 0x000005ef, 1144 }, /* Arabic_damma */ - { 0x000005ec, 1157 }, /* Arabic_dammatan */ - { 0x01000688, 1173 }, /* Arabic_ddal */ - { 0x010006cc, 1185 }, /* Arabic_farsi_yeh */ - { 0x000005ee, 1202 }, /* Arabic_fatha */ - { 0x000005eb, 1215 }, /* Arabic_fathatan */ - { 0x000005e1, 1231 }, /* Arabic_feh */ - { 0x010006d4, 1242 }, /* Arabic_fullstop */ - { 0x010006af, 1258 }, /* Arabic_gaf */ - { 0x000005da, 1269 }, /* Arabic_ghain */ - { 0x000005e7, 1282 }, /* Arabic_ha */ - { 0x000005cd, 1292 }, /* Arabic_hah */ - { 0x000005c1, 1303 }, /* Arabic_hamza */ - { 0x01000654, 1316 }, /* Arabic_hamza_above */ - { 0x01000655, 1335 }, /* Arabic_hamza_below */ - { 0x000005c3, 1354 }, /* Arabic_hamzaonalef */ - { 0x000005c4, 1373 }, /* Arabic_hamzaonwaw */ - { 0x000005c6, 1391 }, /* Arabic_hamzaonyeh */ - { 0x000005c5, 1409 }, /* Arabic_hamzaunderalef */ - { 0x000005e7, 1431 }, /* Arabic_heh */ - { 0x010006be, 1442 }, /* Arabic_heh_doachashmee */ - { 0x010006c1, 1465 }, /* Arabic_heh_goal */ - { 0x000005cc, 1481 }, /* Arabic_jeem */ - { 0x01000698, 1493 }, /* Arabic_jeh */ - { 0x000005e3, 1504 }, /* Arabic_kaf */ - { 0x000005f0, 1515 }, /* Arabic_kasra */ - { 0x000005ed, 1528 }, /* Arabic_kasratan */ - { 0x010006a9, 1544 }, /* Arabic_keheh */ - { 0x000005ce, 1557 }, /* Arabic_khah */ - { 0x000005e4, 1569 }, /* Arabic_lam */ - { 0x01000653, 1580 }, /* Arabic_madda_above */ - { 0x000005c2, 1599 }, /* Arabic_maddaonalef */ - { 0x000005e5, 1618 }, /* Arabic_meem */ - { 0x000005e6, 1630 }, /* Arabic_noon */ - { 0x010006ba, 1642 }, /* Arabic_noon_ghunna */ - { 0x0100067e, 1661 }, /* Arabic_peh */ - { 0x0100066a, 1672 }, /* Arabic_percent */ - { 0x000005e2, 1687 }, /* Arabic_qaf */ - { 0x000005bf, 1698 }, /* Arabic_question_mark */ - { 0x000005d1, 1719 }, /* Arabic_ra */ - { 0x01000691, 1729 }, /* Arabic_rreh */ - { 0x000005d5, 1741 }, /* Arabic_sad */ - { 0x000005d3, 1752 }, /* Arabic_seen */ - { 0x000005bb, 1764 }, /* Arabic_semicolon */ - { 0x000005f1, 1781 }, /* Arabic_shadda */ - { 0x000005d4, 1795 }, /* Arabic_sheen */ - { 0x000005f2, 1808 }, /* Arabic_sukun */ - { 0x01000670, 1821 }, /* Arabic_superscript_alef */ - { 0x0000ff7e, 1845 }, /* Arabic_switch */ - { 0x000005d7, 1859 }, /* Arabic_tah */ - { 0x000005e0, 1870 }, /* Arabic_tatweel */ - { 0x01000686, 1885 }, /* Arabic_tcheh */ - { 0x000005ca, 1898 }, /* Arabic_teh */ - { 0x000005c9, 1909 }, /* Arabic_tehmarbuta */ - { 0x000005d0, 1927 }, /* Arabic_thal */ - { 0x000005cb, 1939 }, /* Arabic_theh */ - { 0x01000679, 1951 }, /* Arabic_tteh */ - { 0x010006a4, 1963 }, /* Arabic_veh */ - { 0x000005e8, 1974 }, /* Arabic_waw */ - { 0x000005ea, 1985 }, /* Arabic_yeh */ - { 0x010006d2, 1996 }, /* Arabic_yeh_baree */ - { 0x000005d8, 2013 }, /* Arabic_zah */ - { 0x000005d2, 2024 }, /* Arabic_zain */ - { 0x000000c5, 2036 }, /* Aring */ - { 0x000000e5, 2042 }, /* aring */ - { 0x0100055b, 2048 }, /* Armenian_accent */ - { 0x0100055c, 2064 }, /* Armenian_amanak */ - { 0x0100055a, 2080 }, /* Armenian_apostrophe */ - { 0x01000538, 2100 }, /* Armenian_AT */ - { 0x01000568, 2112 }, /* Armenian_at */ - { 0x01000531, 2124 }, /* Armenian_AYB */ - { 0x01000561, 2137 }, /* Armenian_ayb */ - { 0x01000532, 2150 }, /* Armenian_BEN */ - { 0x01000562, 2163 }, /* Armenian_ben */ - { 0x0100055d, 2176 }, /* Armenian_but */ - { 0x01000549, 2189 }, /* Armenian_CHA */ - { 0x01000579, 2202 }, /* Armenian_cha */ - { 0x01000534, 2215 }, /* Armenian_DA */ - { 0x01000564, 2227 }, /* Armenian_da */ - { 0x01000541, 2239 }, /* Armenian_DZA */ - { 0x01000571, 2252 }, /* Armenian_dza */ - { 0x01000537, 2265 }, /* Armenian_E */ - { 0x01000567, 2276 }, /* Armenian_e */ - { 0x0100055c, 2287 }, /* Armenian_exclam */ - { 0x01000556, 2303 }, /* Armenian_FE */ - { 0x01000586, 2315 }, /* Armenian_fe */ - { 0x01000589, 2327 }, /* Armenian_full_stop */ - { 0x01000542, 2346 }, /* Armenian_GHAT */ - { 0x01000572, 2360 }, /* Armenian_ghat */ - { 0x01000533, 2374 }, /* Armenian_GIM */ - { 0x01000563, 2387 }, /* Armenian_gim */ - { 0x01000545, 2400 }, /* Armenian_HI */ - { 0x01000575, 2412 }, /* Armenian_hi */ - { 0x01000540, 2424 }, /* Armenian_HO */ - { 0x01000570, 2436 }, /* Armenian_ho */ - { 0x0100058a, 2448 }, /* Armenian_hyphen */ - { 0x0100053b, 2464 }, /* Armenian_INI */ - { 0x0100056b, 2477 }, /* Armenian_ini */ - { 0x0100054b, 2490 }, /* Armenian_JE */ - { 0x0100057b, 2502 }, /* Armenian_je */ - { 0x01000554, 2514 }, /* Armenian_KE */ - { 0x01000584, 2526 }, /* Armenian_ke */ - { 0x0100053f, 2538 }, /* Armenian_KEN */ - { 0x0100056f, 2551 }, /* Armenian_ken */ - { 0x0100053d, 2564 }, /* Armenian_KHE */ - { 0x0100056d, 2577 }, /* Armenian_khe */ - { 0x01000587, 2590 }, /* Armenian_ligature_ew */ - { 0x0100053c, 2611 }, /* Armenian_LYUN */ - { 0x0100056c, 2625 }, /* Armenian_lyun */ - { 0x01000544, 2639 }, /* Armenian_MEN */ - { 0x01000574, 2652 }, /* Armenian_men */ - { 0x01000546, 2665 }, /* Armenian_NU */ - { 0x01000576, 2677 }, /* Armenian_nu */ - { 0x01000555, 2689 }, /* Armenian_O */ - { 0x01000585, 2700 }, /* Armenian_o */ - { 0x0100055e, 2711 }, /* Armenian_paruyk */ - { 0x0100054a, 2727 }, /* Armenian_PE */ - { 0x0100057a, 2739 }, /* Armenian_pe */ - { 0x01000553, 2751 }, /* Armenian_PYUR */ - { 0x01000583, 2765 }, /* Armenian_pyur */ - { 0x0100055e, 2779 }, /* Armenian_question */ - { 0x0100054c, 2797 }, /* Armenian_RA */ - { 0x0100057c, 2809 }, /* Armenian_ra */ - { 0x01000550, 2821 }, /* Armenian_RE */ - { 0x01000580, 2833 }, /* Armenian_re */ - { 0x0100054d, 2845 }, /* Armenian_SE */ - { 0x0100057d, 2857 }, /* Armenian_se */ - { 0x0100055d, 2869 }, /* Armenian_separation_mark */ - { 0x01000547, 2894 }, /* Armenian_SHA */ - { 0x01000577, 2907 }, /* Armenian_sha */ - { 0x0100055b, 2920 }, /* Armenian_shesht */ - { 0x01000543, 2936 }, /* Armenian_TCHE */ - { 0x01000573, 2950 }, /* Armenian_tche */ - { 0x01000539, 2964 }, /* Armenian_TO */ - { 0x01000569, 2976 }, /* Armenian_to */ - { 0x0100053e, 2988 }, /* Armenian_TSA */ - { 0x0100056e, 3001 }, /* Armenian_tsa */ - { 0x01000551, 3014 }, /* Armenian_TSO */ - { 0x01000581, 3027 }, /* Armenian_tso */ - { 0x0100054f, 3040 }, /* Armenian_TYUN */ - { 0x0100057f, 3054 }, /* Armenian_tyun */ - { 0x01000589, 3068 }, /* Armenian_verjaket */ - { 0x0100054e, 3086 }, /* Armenian_VEV */ - { 0x0100057e, 3099 }, /* Armenian_vev */ - { 0x01000548, 3112 }, /* Armenian_VO */ - { 0x01000578, 3124 }, /* Armenian_vo */ - { 0x01000552, 3136 }, /* Armenian_VYUN */ - { 0x01000582, 3150 }, /* Armenian_vyun */ - { 0x01000535, 3164 }, /* Armenian_YECH */ - { 0x01000565, 3178 }, /* Armenian_yech */ - { 0x0100058a, 3192 }, /* Armenian_yentamna */ - { 0x01000536, 3210 }, /* Armenian_ZA */ - { 0x01000566, 3222 }, /* Armenian_za */ - { 0x0100053a, 3234 }, /* Armenian_ZHE */ - { 0x0100056a, 3247 }, /* Armenian_zhe */ - { 0x0000005e, 3260 }, /* asciicircum */ - { 0x0000007e, 3272 }, /* asciitilde */ - { 0x0000002a, 3283 }, /* asterisk */ - { 0x00000040, 3292 }, /* at */ - { 0x000000c3, 3295 }, /* Atilde */ - { 0x000000e3, 3302 }, /* atilde */ - { 0x0000fe7a, 3309 }, /* AudibleBell_Enable */ - { 0x00000042, 3328 }, /* B */ - { 0x00000062, 3330 }, /* b */ - { 0x01001e02, 3332 }, /* Babovedot */ - { 0x01001e03, 3342 }, /* babovedot */ - { 0x0000005c, 3352 }, /* backslash */ - { 0x0000ff08, 3362 }, /* BackSpace */ - { 0x1000ff74, 3372 }, /* BackTab */ - { 0x00000af4, 3380 }, /* ballotcross */ - { 0x0000007c, 3392 }, /* bar */ - { 0x01002235, 3396 }, /* because */ - { 0x0000ff58, 3404 }, /* Begin */ - { 0x000009df, 3410 }, /* blank */ - { 0x100000fc, 3416 }, /* block */ - { 0x000008a5, 3422 }, /* botintegral */ - { 0x000008ac, 3434 }, /* botleftparens */ - { 0x000008a8, 3448 }, /* botleftsqbracket */ - { 0x000008b2, 3465 }, /* botleftsummation */ - { 0x000008ae, 3482 }, /* botrightparens */ - { 0x000008aa, 3497 }, /* botrightsqbracket */ - { 0x000008b6, 3515 }, /* botrightsummation */ - { 0x000009f6, 3533 }, /* bott */ - { 0x000008b4, 3538 }, /* botvertsummationconnector */ - { 0x0000fe74, 3564 }, /* BounceKeys_Enable */ - { 0x0000007b, 3582 }, /* braceleft */ - { 0x0000007d, 3592 }, /* braceright */ - { 0x0000005b, 3603 }, /* bracketleft */ - { 0x0000005d, 3615 }, /* bracketright */ - { 0x01002800, 3628 }, /* braille_blank */ - { 0x0000fff1, 3642 }, /* braille_dot_1 */ - { 0x0000fffa, 3656 }, /* braille_dot_10 */ - { 0x0000fff2, 3671 }, /* braille_dot_2 */ - { 0x0000fff3, 3685 }, /* braille_dot_3 */ - { 0x0000fff4, 3699 }, /* braille_dot_4 */ - { 0x0000fff5, 3713 }, /* braille_dot_5 */ - { 0x0000fff6, 3727 }, /* braille_dot_6 */ - { 0x0000fff7, 3741 }, /* braille_dot_7 */ - { 0x0000fff8, 3755 }, /* braille_dot_8 */ - { 0x0000fff9, 3769 }, /* braille_dot_9 */ - { 0x01002801, 3783 }, /* braille_dots_1 */ - { 0x01002803, 3798 }, /* braille_dots_12 */ - { 0x01002807, 3814 }, /* braille_dots_123 */ - { 0x0100280f, 3831 }, /* braille_dots_1234 */ - { 0x0100281f, 3849 }, /* braille_dots_12345 */ - { 0x0100283f, 3868 }, /* braille_dots_123456 */ - { 0x0100287f, 3888 }, /* braille_dots_1234567 */ - { 0x010028ff, 3909 }, /* braille_dots_12345678 */ - { 0x010028bf, 3931 }, /* braille_dots_1234568 */ - { 0x0100285f, 3952 }, /* braille_dots_123457 */ - { 0x010028df, 3972 }, /* braille_dots_1234578 */ - { 0x0100289f, 3993 }, /* braille_dots_123458 */ - { 0x0100282f, 4013 }, /* braille_dots_12346 */ - { 0x0100286f, 4032 }, /* braille_dots_123467 */ - { 0x010028ef, 4052 }, /* braille_dots_1234678 */ - { 0x010028af, 4073 }, /* braille_dots_123468 */ - { 0x0100284f, 4093 }, /* braille_dots_12347 */ - { 0x010028cf, 4112 }, /* braille_dots_123478 */ - { 0x0100288f, 4132 }, /* braille_dots_12348 */ - { 0x01002817, 4151 }, /* braille_dots_1235 */ - { 0x01002837, 4169 }, /* braille_dots_12356 */ - { 0x01002877, 4188 }, /* braille_dots_123567 */ - { 0x010028f7, 4208 }, /* braille_dots_1235678 */ - { 0x010028b7, 4229 }, /* braille_dots_123568 */ - { 0x01002857, 4249 }, /* braille_dots_12357 */ - { 0x010028d7, 4268 }, /* braille_dots_123578 */ - { 0x01002897, 4288 }, /* braille_dots_12358 */ - { 0x01002827, 4307 }, /* braille_dots_1236 */ - { 0x01002867, 4325 }, /* braille_dots_12367 */ - { 0x010028e7, 4344 }, /* braille_dots_123678 */ - { 0x010028a7, 4364 }, /* braille_dots_12368 */ - { 0x01002847, 4383 }, /* braille_dots_1237 */ - { 0x010028c7, 4401 }, /* braille_dots_12378 */ - { 0x01002887, 4420 }, /* braille_dots_1238 */ - { 0x0100280b, 4438 }, /* braille_dots_124 */ - { 0x0100281b, 4455 }, /* braille_dots_1245 */ - { 0x0100283b, 4473 }, /* braille_dots_12456 */ - { 0x0100287b, 4492 }, /* braille_dots_124567 */ - { 0x010028fb, 4512 }, /* braille_dots_1245678 */ - { 0x010028bb, 4533 }, /* braille_dots_124568 */ - { 0x0100285b, 4553 }, /* braille_dots_12457 */ - { 0x010028db, 4572 }, /* braille_dots_124578 */ - { 0x0100289b, 4592 }, /* braille_dots_12458 */ - { 0x0100282b, 4611 }, /* braille_dots_1246 */ - { 0x0100286b, 4629 }, /* braille_dots_12467 */ - { 0x010028eb, 4648 }, /* braille_dots_124678 */ - { 0x010028ab, 4668 }, /* braille_dots_12468 */ - { 0x0100284b, 4687 }, /* braille_dots_1247 */ - { 0x010028cb, 4705 }, /* braille_dots_12478 */ - { 0x0100288b, 4724 }, /* braille_dots_1248 */ - { 0x01002813, 4742 }, /* braille_dots_125 */ - { 0x01002833, 4759 }, /* braille_dots_1256 */ - { 0x01002873, 4777 }, /* braille_dots_12567 */ - { 0x010028f3, 4796 }, /* braille_dots_125678 */ - { 0x010028b3, 4816 }, /* braille_dots_12568 */ - { 0x01002853, 4835 }, /* braille_dots_1257 */ - { 0x010028d3, 4853 }, /* braille_dots_12578 */ - { 0x01002893, 4872 }, /* braille_dots_1258 */ - { 0x01002823, 4890 }, /* braille_dots_126 */ - { 0x01002863, 4907 }, /* braille_dots_1267 */ - { 0x010028e3, 4925 }, /* braille_dots_12678 */ - { 0x010028a3, 4944 }, /* braille_dots_1268 */ - { 0x01002843, 4962 }, /* braille_dots_127 */ - { 0x010028c3, 4979 }, /* braille_dots_1278 */ - { 0x01002883, 4997 }, /* braille_dots_128 */ - { 0x01002805, 5014 }, /* braille_dots_13 */ - { 0x0100280d, 5030 }, /* braille_dots_134 */ - { 0x0100281d, 5047 }, /* braille_dots_1345 */ - { 0x0100283d, 5065 }, /* braille_dots_13456 */ - { 0x0100287d, 5084 }, /* braille_dots_134567 */ - { 0x010028fd, 5104 }, /* braille_dots_1345678 */ - { 0x010028bd, 5125 }, /* braille_dots_134568 */ - { 0x0100285d, 5145 }, /* braille_dots_13457 */ - { 0x010028dd, 5164 }, /* braille_dots_134578 */ - { 0x0100289d, 5184 }, /* braille_dots_13458 */ - { 0x0100282d, 5203 }, /* braille_dots_1346 */ - { 0x0100286d, 5221 }, /* braille_dots_13467 */ - { 0x010028ed, 5240 }, /* braille_dots_134678 */ - { 0x010028ad, 5260 }, /* braille_dots_13468 */ - { 0x0100284d, 5279 }, /* braille_dots_1347 */ - { 0x010028cd, 5297 }, /* braille_dots_13478 */ - { 0x0100288d, 5316 }, /* braille_dots_1348 */ - { 0x01002815, 5334 }, /* braille_dots_135 */ - { 0x01002835, 5351 }, /* braille_dots_1356 */ - { 0x01002875, 5369 }, /* braille_dots_13567 */ - { 0x010028f5, 5388 }, /* braille_dots_135678 */ - { 0x010028b5, 5408 }, /* braille_dots_13568 */ - { 0x01002855, 5427 }, /* braille_dots_1357 */ - { 0x010028d5, 5445 }, /* braille_dots_13578 */ - { 0x01002895, 5464 }, /* braille_dots_1358 */ - { 0x01002825, 5482 }, /* braille_dots_136 */ - { 0x01002865, 5499 }, /* braille_dots_1367 */ - { 0x010028e5, 5517 }, /* braille_dots_13678 */ - { 0x010028a5, 5536 }, /* braille_dots_1368 */ - { 0x01002845, 5554 }, /* braille_dots_137 */ - { 0x010028c5, 5571 }, /* braille_dots_1378 */ - { 0x01002885, 5589 }, /* braille_dots_138 */ - { 0x01002809, 5606 }, /* braille_dots_14 */ - { 0x01002819, 5622 }, /* braille_dots_145 */ - { 0x01002839, 5639 }, /* braille_dots_1456 */ - { 0x01002879, 5657 }, /* braille_dots_14567 */ - { 0x010028f9, 5676 }, /* braille_dots_145678 */ - { 0x010028b9, 5696 }, /* braille_dots_14568 */ - { 0x01002859, 5715 }, /* braille_dots_1457 */ - { 0x010028d9, 5733 }, /* braille_dots_14578 */ - { 0x01002899, 5752 }, /* braille_dots_1458 */ - { 0x01002829, 5770 }, /* braille_dots_146 */ - { 0x01002869, 5787 }, /* braille_dots_1467 */ - { 0x010028e9, 5805 }, /* braille_dots_14678 */ - { 0x010028a9, 5824 }, /* braille_dots_1468 */ - { 0x01002849, 5842 }, /* braille_dots_147 */ - { 0x010028c9, 5859 }, /* braille_dots_1478 */ - { 0x01002889, 5877 }, /* braille_dots_148 */ - { 0x01002811, 5894 }, /* braille_dots_15 */ - { 0x01002831, 5910 }, /* braille_dots_156 */ - { 0x01002871, 5927 }, /* braille_dots_1567 */ - { 0x010028f1, 5945 }, /* braille_dots_15678 */ - { 0x010028b1, 5964 }, /* braille_dots_1568 */ - { 0x01002851, 5982 }, /* braille_dots_157 */ - { 0x010028d1, 5999 }, /* braille_dots_1578 */ - { 0x01002891, 6017 }, /* braille_dots_158 */ - { 0x01002821, 6034 }, /* braille_dots_16 */ - { 0x01002861, 6050 }, /* braille_dots_167 */ - { 0x010028e1, 6067 }, /* braille_dots_1678 */ - { 0x010028a1, 6085 }, /* braille_dots_168 */ - { 0x01002841, 6102 }, /* braille_dots_17 */ - { 0x010028c1, 6118 }, /* braille_dots_178 */ - { 0x01002881, 6135 }, /* braille_dots_18 */ - { 0x01002802, 6151 }, /* braille_dots_2 */ - { 0x01002806, 6166 }, /* braille_dots_23 */ - { 0x0100280e, 6182 }, /* braille_dots_234 */ - { 0x0100281e, 6199 }, /* braille_dots_2345 */ - { 0x0100283e, 6217 }, /* braille_dots_23456 */ - { 0x0100287e, 6236 }, /* braille_dots_234567 */ - { 0x010028fe, 6256 }, /* braille_dots_2345678 */ - { 0x010028be, 6277 }, /* braille_dots_234568 */ - { 0x0100285e, 6297 }, /* braille_dots_23457 */ - { 0x010028de, 6316 }, /* braille_dots_234578 */ - { 0x0100289e, 6336 }, /* braille_dots_23458 */ - { 0x0100282e, 6355 }, /* braille_dots_2346 */ - { 0x0100286e, 6373 }, /* braille_dots_23467 */ - { 0x010028ee, 6392 }, /* braille_dots_234678 */ - { 0x010028ae, 6412 }, /* braille_dots_23468 */ - { 0x0100284e, 6431 }, /* braille_dots_2347 */ - { 0x010028ce, 6449 }, /* braille_dots_23478 */ - { 0x0100288e, 6468 }, /* braille_dots_2348 */ - { 0x01002816, 6486 }, /* braille_dots_235 */ - { 0x01002836, 6503 }, /* braille_dots_2356 */ - { 0x01002876, 6521 }, /* braille_dots_23567 */ - { 0x010028f6, 6540 }, /* braille_dots_235678 */ - { 0x010028b6, 6560 }, /* braille_dots_23568 */ - { 0x01002856, 6579 }, /* braille_dots_2357 */ - { 0x010028d6, 6597 }, /* braille_dots_23578 */ - { 0x01002896, 6616 }, /* braille_dots_2358 */ - { 0x01002826, 6634 }, /* braille_dots_236 */ - { 0x01002866, 6651 }, /* braille_dots_2367 */ - { 0x010028e6, 6669 }, /* braille_dots_23678 */ - { 0x010028a6, 6688 }, /* braille_dots_2368 */ - { 0x01002846, 6706 }, /* braille_dots_237 */ - { 0x010028c6, 6723 }, /* braille_dots_2378 */ - { 0x01002886, 6741 }, /* braille_dots_238 */ - { 0x0100280a, 6758 }, /* braille_dots_24 */ - { 0x0100281a, 6774 }, /* braille_dots_245 */ - { 0x0100283a, 6791 }, /* braille_dots_2456 */ - { 0x0100287a, 6809 }, /* braille_dots_24567 */ - { 0x010028fa, 6828 }, /* braille_dots_245678 */ - { 0x010028ba, 6848 }, /* braille_dots_24568 */ - { 0x0100285a, 6867 }, /* braille_dots_2457 */ - { 0x010028da, 6885 }, /* braille_dots_24578 */ - { 0x0100289a, 6904 }, /* braille_dots_2458 */ - { 0x0100282a, 6922 }, /* braille_dots_246 */ - { 0x0100286a, 6939 }, /* braille_dots_2467 */ - { 0x010028ea, 6957 }, /* braille_dots_24678 */ - { 0x010028aa, 6976 }, /* braille_dots_2468 */ - { 0x0100284a, 6994 }, /* braille_dots_247 */ - { 0x010028ca, 7011 }, /* braille_dots_2478 */ - { 0x0100288a, 7029 }, /* braille_dots_248 */ - { 0x01002812, 7046 }, /* braille_dots_25 */ - { 0x01002832, 7062 }, /* braille_dots_256 */ - { 0x01002872, 7079 }, /* braille_dots_2567 */ - { 0x010028f2, 7097 }, /* braille_dots_25678 */ - { 0x010028b2, 7116 }, /* braille_dots_2568 */ - { 0x01002852, 7134 }, /* braille_dots_257 */ - { 0x010028d2, 7151 }, /* braille_dots_2578 */ - { 0x01002892, 7169 }, /* braille_dots_258 */ - { 0x01002822, 7186 }, /* braille_dots_26 */ - { 0x01002862, 7202 }, /* braille_dots_267 */ - { 0x010028e2, 7219 }, /* braille_dots_2678 */ - { 0x010028a2, 7237 }, /* braille_dots_268 */ - { 0x01002842, 7254 }, /* braille_dots_27 */ - { 0x010028c2, 7270 }, /* braille_dots_278 */ - { 0x01002882, 7287 }, /* braille_dots_28 */ - { 0x01002804, 7303 }, /* braille_dots_3 */ - { 0x0100280c, 7318 }, /* braille_dots_34 */ - { 0x0100281c, 7334 }, /* braille_dots_345 */ - { 0x0100283c, 7351 }, /* braille_dots_3456 */ - { 0x0100287c, 7369 }, /* braille_dots_34567 */ - { 0x010028fc, 7388 }, /* braille_dots_345678 */ - { 0x010028bc, 7408 }, /* braille_dots_34568 */ - { 0x0100285c, 7427 }, /* braille_dots_3457 */ - { 0x010028dc, 7445 }, /* braille_dots_34578 */ - { 0x0100289c, 7464 }, /* braille_dots_3458 */ - { 0x0100282c, 7482 }, /* braille_dots_346 */ - { 0x0100286c, 7499 }, /* braille_dots_3467 */ - { 0x010028ec, 7517 }, /* braille_dots_34678 */ - { 0x010028ac, 7536 }, /* braille_dots_3468 */ - { 0x0100284c, 7554 }, /* braille_dots_347 */ - { 0x010028cc, 7571 }, /* braille_dots_3478 */ - { 0x0100288c, 7589 }, /* braille_dots_348 */ - { 0x01002814, 7606 }, /* braille_dots_35 */ - { 0x01002834, 7622 }, /* braille_dots_356 */ - { 0x01002874, 7639 }, /* braille_dots_3567 */ - { 0x010028f4, 7657 }, /* braille_dots_35678 */ - { 0x010028b4, 7676 }, /* braille_dots_3568 */ - { 0x01002854, 7694 }, /* braille_dots_357 */ - { 0x010028d4, 7711 }, /* braille_dots_3578 */ - { 0x01002894, 7729 }, /* braille_dots_358 */ - { 0x01002824, 7746 }, /* braille_dots_36 */ - { 0x01002864, 7762 }, /* braille_dots_367 */ - { 0x010028e4, 7779 }, /* braille_dots_3678 */ - { 0x010028a4, 7797 }, /* braille_dots_368 */ - { 0x01002844, 7814 }, /* braille_dots_37 */ - { 0x010028c4, 7830 }, /* braille_dots_378 */ - { 0x01002884, 7847 }, /* braille_dots_38 */ - { 0x01002808, 7863 }, /* braille_dots_4 */ - { 0x01002818, 7878 }, /* braille_dots_45 */ - { 0x01002838, 7894 }, /* braille_dots_456 */ - { 0x01002878, 7911 }, /* braille_dots_4567 */ - { 0x010028f8, 7929 }, /* braille_dots_45678 */ - { 0x010028b8, 7948 }, /* braille_dots_4568 */ - { 0x01002858, 7966 }, /* braille_dots_457 */ - { 0x010028d8, 7983 }, /* braille_dots_4578 */ - { 0x01002898, 8001 }, /* braille_dots_458 */ - { 0x01002828, 8018 }, /* braille_dots_46 */ - { 0x01002868, 8034 }, /* braille_dots_467 */ - { 0x010028e8, 8051 }, /* braille_dots_4678 */ - { 0x010028a8, 8069 }, /* braille_dots_468 */ - { 0x01002848, 8086 }, /* braille_dots_47 */ - { 0x010028c8, 8102 }, /* braille_dots_478 */ - { 0x01002888, 8119 }, /* braille_dots_48 */ - { 0x01002810, 8135 }, /* braille_dots_5 */ - { 0x01002830, 8150 }, /* braille_dots_56 */ - { 0x01002870, 8166 }, /* braille_dots_567 */ - { 0x010028f0, 8183 }, /* braille_dots_5678 */ - { 0x010028b0, 8201 }, /* braille_dots_568 */ - { 0x01002850, 8218 }, /* braille_dots_57 */ - { 0x010028d0, 8234 }, /* braille_dots_578 */ - { 0x01002890, 8251 }, /* braille_dots_58 */ - { 0x01002820, 8267 }, /* braille_dots_6 */ - { 0x01002860, 8282 }, /* braille_dots_67 */ - { 0x010028e0, 8298 }, /* braille_dots_678 */ - { 0x010028a0, 8315 }, /* braille_dots_68 */ - { 0x01002840, 8331 }, /* braille_dots_7 */ - { 0x010028c0, 8346 }, /* braille_dots_78 */ - { 0x01002880, 8362 }, /* braille_dots_8 */ - { 0x0000ff6b, 8377 }, /* Break */ - { 0x000001a2, 8383 }, /* breve */ - { 0x000000a6, 8389 }, /* brokenbar */ - { 0x000006ae, 8399 }, /* Byelorussian_shortu */ - { 0x000006be, 8419 }, /* Byelorussian_SHORTU */ - { 0x00000043, 8439 }, /* C */ - { 0x00000063, 8441 }, /* c */ - { 0x0000fea3, 8443 }, /* c_h */ - { 0x0000fea4, 8447 }, /* C_h */ - { 0x0000fea5, 8451 }, /* C_H */ - { 0x000002c5, 8455 }, /* Cabovedot */ - { 0x000002e5, 8465 }, /* cabovedot */ - { 0x000001c6, 8475 }, /* Cacute */ - { 0x000001e6, 8482 }, /* cacute */ - { 0x0000ff69, 8489 }, /* Cancel */ - { 0x0000ffe5, 8496 }, /* Caps_Lock */ - { 0x00000ab8, 8506 }, /* careof */ - { 0x00000afc, 8513 }, /* caret */ - { 0x000001b7, 8519 }, /* caron */ - { 0x000001c8, 8525 }, /* Ccaron */ - { 0x000001e8, 8532 }, /* ccaron */ - { 0x000000c7, 8539 }, /* Ccedilla */ - { 0x000000e7, 8548 }, /* ccedilla */ - { 0x000002c6, 8557 }, /* Ccircumflex */ - { 0x000002e6, 8569 }, /* ccircumflex */ - { 0x000000b8, 8581 }, /* cedilla */ - { 0x000000a2, 8589 }, /* cent */ - { 0x0000fea0, 8594 }, /* ch */ - { 0x0000fea1, 8597 }, /* Ch */ - { 0x0000fea2, 8600 }, /* CH */ - { 0x000009e1, 8603 }, /* checkerboard */ - { 0x00000af3, 8616 }, /* checkmark */ - { 0x00000bcf, 8626 }, /* circle */ - { 0x0000ff0b, 8633 }, /* Clear */ - { 0x1000ff6f, 8639 }, /* ClearLine */ - { 0x00000aec, 8649 }, /* club */ - { 0x0000ff37, 8654 }, /* Codeinput */ - { 0x0000003a, 8664 }, /* colon */ - { 0x010020a1, 8670 }, /* ColonSign */ - { 0x0000002c, 8680 }, /* comma */ - { 0x0100220b, 8686 }, /* containsas */ - { 0x0000ffe3, 8697 }, /* Control_L */ - { 0x0000ffe4, 8707 }, /* Control_R */ - { 0x000000a9, 8717 }, /* copyright */ - { 0x000009e4, 8727 }, /* cr */ - { 0x000009ee, 8730 }, /* crossinglines */ - { 0x010020a2, 8744 }, /* CruzeiroSign */ - { 0x0100221b, 8757 }, /* cuberoot */ - { 0x000000a4, 8766 }, /* currency */ - { 0x00000aff, 8775 }, /* cursor */ - { 0x000006c1, 8782 }, /* Cyrillic_a */ - { 0x000006e1, 8793 }, /* Cyrillic_A */ - { 0x000006c2, 8804 }, /* Cyrillic_be */ - { 0x000006e2, 8816 }, /* Cyrillic_BE */ - { 0x000006de, 8828 }, /* Cyrillic_che */ - { 0x000006fe, 8841 }, /* Cyrillic_CHE */ - { 0x010004b6, 8854 }, /* Cyrillic_CHE_descender */ - { 0x010004b7, 8877 }, /* Cyrillic_che_descender */ - { 0x010004b8, 8900 }, /* Cyrillic_CHE_vertstroke */ - { 0x010004b9, 8924 }, /* Cyrillic_che_vertstroke */ - { 0x000006c4, 8948 }, /* Cyrillic_de */ - { 0x000006e4, 8960 }, /* Cyrillic_DE */ - { 0x000006af, 8972 }, /* Cyrillic_dzhe */ - { 0x000006bf, 8986 }, /* Cyrillic_DZHE */ - { 0x000006dc, 9000 }, /* Cyrillic_e */ - { 0x000006fc, 9011 }, /* Cyrillic_E */ - { 0x000006c6, 9022 }, /* Cyrillic_ef */ - { 0x000006e6, 9034 }, /* Cyrillic_EF */ - { 0x000006cc, 9046 }, /* Cyrillic_el */ - { 0x000006ec, 9058 }, /* Cyrillic_EL */ - { 0x000006cd, 9070 }, /* Cyrillic_em */ - { 0x000006ed, 9082 }, /* Cyrillic_EM */ - { 0x000006ce, 9094 }, /* Cyrillic_en */ - { 0x000006ee, 9106 }, /* Cyrillic_EN */ - { 0x010004a2, 9118 }, /* Cyrillic_EN_descender */ - { 0x010004a3, 9140 }, /* Cyrillic_en_descender */ - { 0x000006d2, 9162 }, /* Cyrillic_er */ - { 0x000006f2, 9174 }, /* Cyrillic_ER */ - { 0x000006d3, 9186 }, /* Cyrillic_es */ - { 0x000006f3, 9198 }, /* Cyrillic_ES */ - { 0x000006c7, 9210 }, /* Cyrillic_ghe */ - { 0x000006e7, 9223 }, /* Cyrillic_GHE */ - { 0x01000492, 9236 }, /* Cyrillic_GHE_bar */ - { 0x01000493, 9253 }, /* Cyrillic_ghe_bar */ - { 0x000006c8, 9270 }, /* Cyrillic_ha */ - { 0x000006e8, 9282 }, /* Cyrillic_HA */ - { 0x010004b2, 9294 }, /* Cyrillic_HA_descender */ - { 0x010004b3, 9316 }, /* Cyrillic_ha_descender */ - { 0x000006df, 9338 }, /* Cyrillic_hardsign */ - { 0x000006ff, 9356 }, /* Cyrillic_HARDSIGN */ - { 0x000006c9, 9374 }, /* Cyrillic_i */ - { 0x000006e9, 9385 }, /* Cyrillic_I */ - { 0x010004e2, 9396 }, /* Cyrillic_I_macron */ - { 0x010004e3, 9414 }, /* Cyrillic_i_macron */ - { 0x000006c5, 9432 }, /* Cyrillic_ie */ - { 0x000006e5, 9444 }, /* Cyrillic_IE */ - { 0x000006a3, 9456 }, /* Cyrillic_io */ - { 0x000006b3, 9468 }, /* Cyrillic_IO */ - { 0x000006a8, 9480 }, /* Cyrillic_je */ - { 0x000006b8, 9492 }, /* Cyrillic_JE */ - { 0x000006cb, 9504 }, /* Cyrillic_ka */ - { 0x000006eb, 9516 }, /* Cyrillic_KA */ - { 0x0100049a, 9528 }, /* Cyrillic_KA_descender */ - { 0x0100049b, 9550 }, /* Cyrillic_ka_descender */ - { 0x0100049c, 9572 }, /* Cyrillic_KA_vertstroke */ - { 0x0100049d, 9595 }, /* Cyrillic_ka_vertstroke */ - { 0x000006a9, 9618 }, /* Cyrillic_lje */ - { 0x000006b9, 9631 }, /* Cyrillic_LJE */ - { 0x000006aa, 9644 }, /* Cyrillic_nje */ - { 0x000006ba, 9657 }, /* Cyrillic_NJE */ - { 0x000006cf, 9670 }, /* Cyrillic_o */ - { 0x000006ef, 9681 }, /* Cyrillic_O */ - { 0x010004e8, 9692 }, /* Cyrillic_O_bar */ - { 0x010004e9, 9707 }, /* Cyrillic_o_bar */ - { 0x000006d0, 9722 }, /* Cyrillic_pe */ - { 0x000006f0, 9734 }, /* Cyrillic_PE */ - { 0x010004d8, 9746 }, /* Cyrillic_SCHWA */ - { 0x010004d9, 9761 }, /* Cyrillic_schwa */ - { 0x000006db, 9776 }, /* Cyrillic_sha */ - { 0x000006fb, 9789 }, /* Cyrillic_SHA */ - { 0x000006dd, 9802 }, /* Cyrillic_shcha */ - { 0x000006fd, 9817 }, /* Cyrillic_SHCHA */ - { 0x010004ba, 9832 }, /* Cyrillic_SHHA */ - { 0x010004bb, 9846 }, /* Cyrillic_shha */ - { 0x000006ca, 9860 }, /* Cyrillic_shorti */ - { 0x000006ea, 9876 }, /* Cyrillic_SHORTI */ - { 0x000006d8, 9892 }, /* Cyrillic_softsign */ - { 0x000006f8, 9910 }, /* Cyrillic_SOFTSIGN */ - { 0x000006d4, 9928 }, /* Cyrillic_te */ - { 0x000006f4, 9940 }, /* Cyrillic_TE */ - { 0x000006c3, 9952 }, /* Cyrillic_tse */ - { 0x000006e3, 9965 }, /* Cyrillic_TSE */ - { 0x000006d5, 9978 }, /* Cyrillic_u */ - { 0x000006f5, 9989 }, /* Cyrillic_U */ - { 0x010004ee, 10000 }, /* Cyrillic_U_macron */ - { 0x010004ef, 10018 }, /* Cyrillic_u_macron */ - { 0x010004ae, 10036 }, /* Cyrillic_U_straight */ - { 0x010004af, 10056 }, /* Cyrillic_u_straight */ - { 0x010004b0, 10076 }, /* Cyrillic_U_straight_bar */ - { 0x010004b1, 10100 }, /* Cyrillic_u_straight_bar */ - { 0x000006d7, 10124 }, /* Cyrillic_ve */ - { 0x000006f7, 10136 }, /* Cyrillic_VE */ - { 0x000006d1, 10148 }, /* Cyrillic_ya */ - { 0x000006f1, 10160 }, /* Cyrillic_YA */ - { 0x000006d9, 10172 }, /* Cyrillic_yeru */ - { 0x000006f9, 10186 }, /* Cyrillic_YERU */ - { 0x000006c0, 10200 }, /* Cyrillic_yu */ - { 0x000006e0, 10212 }, /* Cyrillic_YU */ - { 0x000006da, 10224 }, /* Cyrillic_ze */ - { 0x000006fa, 10236 }, /* Cyrillic_ZE */ - { 0x000006d6, 10248 }, /* Cyrillic_zhe */ - { 0x000006f6, 10261 }, /* Cyrillic_ZHE */ - { 0x01000496, 10274 }, /* Cyrillic_ZHE_descender */ - { 0x01000497, 10297 }, /* Cyrillic_zhe_descender */ - { 0x00000044, 10320 }, /* D */ - { 0x00000064, 10322 }, /* d */ - { 0x01001e0a, 10324 }, /* Dabovedot */ - { 0x01001e0b, 10334 }, /* dabovedot */ - { 0x1000fe27, 10344 }, /* Dacute_accent */ - { 0x00000af1, 10358 }, /* dagger */ - { 0x000001cf, 10365 }, /* Dcaron */ - { 0x000001ef, 10372 }, /* dcaron */ - { 0x1000fe2c, 10379 }, /* Dcedilla_accent */ - { 0x1000fe5e, 10395 }, /* Dcircumflex_accent */ - { 0x1000fe22, 10414 }, /* Ddiaeresis */ - { 0x0000fe80, 10425 }, /* dead_a */ - { 0x0000fe81, 10432 }, /* dead_A */ - { 0x0000fe64, 10439 }, /* dead_abovecomma */ - { 0x0000fe56, 10455 }, /* dead_abovedot */ - { 0x0000fe65, 10469 }, /* dead_abovereversedcomma */ - { 0x0000fe58, 10493 }, /* dead_abovering */ - { 0x0000fe91, 10508 }, /* dead_aboveverticalline */ - { 0x0000fe51, 10531 }, /* dead_acute */ - { 0x0000fe6b, 10542 }, /* dead_belowbreve */ - { 0x0000fe69, 10558 }, /* dead_belowcircumflex */ - { 0x0000fe6e, 10579 }, /* dead_belowcomma */ - { 0x0000fe6c, 10595 }, /* dead_belowdiaeresis */ - { 0x0000fe60, 10615 }, /* dead_belowdot */ - { 0x0000fe68, 10629 }, /* dead_belowmacron */ - { 0x0000fe67, 10646 }, /* dead_belowring */ - { 0x0000fe6a, 10661 }, /* dead_belowtilde */ - { 0x0000fe92, 10677 }, /* dead_belowverticalline */ - { 0x0000fe55, 10700 }, /* dead_breve */ - { 0x0000fe8b, 10711 }, /* dead_capital_schwa */ - { 0x0000fe5a, 10730 }, /* dead_caron */ - { 0x0000fe5b, 10741 }, /* dead_cedilla */ - { 0x0000fe52, 10754 }, /* dead_circumflex */ - { 0x0000fe6f, 10770 }, /* dead_currency */ - { 0x0000fe65, 10784 }, /* dead_dasia */ - { 0x0000fe57, 10795 }, /* dead_diaeresis */ - { 0x0000fe59, 10810 }, /* dead_doubleacute */ - { 0x0000fe66, 10827 }, /* dead_doublegrave */ - { 0x0000fe82, 10844 }, /* dead_e */ - { 0x0000fe83, 10851 }, /* dead_E */ - { 0x0000fe50, 10858 }, /* dead_grave */ - { 0x0000fe8c, 10869 }, /* dead_greek */ - { 0x0000fe61, 10880 }, /* dead_hook */ - { 0x0000fe62, 10890 }, /* dead_horn */ - { 0x0000fe84, 10900 }, /* dead_i */ - { 0x0000fe85, 10907 }, /* dead_I */ - { 0x0000fe6d, 10914 }, /* dead_invertedbreve */ - { 0x0000fe5d, 10933 }, /* dead_iota */ - { 0x0000fe93, 10943 }, /* dead_longsolidusoverlay */ - { 0x0000fe90, 10967 }, /* dead_lowline */ - { 0x0000fe54, 10980 }, /* dead_macron */ - { 0x0000fe86, 10992 }, /* dead_o */ - { 0x0000fe87, 10999 }, /* dead_O */ - { 0x0000fe5c, 11006 }, /* dead_ogonek */ - { 0x0000fe53, 11018 }, /* dead_perispomeni */ - { 0x0000fe64, 11035 }, /* dead_psili */ - { 0x0000fe5f, 11046 }, /* dead_semivoiced_sound */ - { 0x0000fe8a, 11068 }, /* dead_small_schwa */ - { 0x0000fe63, 11085 }, /* dead_stroke */ - { 0x0000fe53, 11097 }, /* dead_tilde */ - { 0x0000fe88, 11108 }, /* dead_u */ - { 0x0000fe89, 11115 }, /* dead_U */ - { 0x0000fe5e, 11122 }, /* dead_voiced_sound */ - { 0x00000abd, 11140 }, /* decimalpoint */ - { 0x000000b0, 11153 }, /* degree */ - { 0x0000ffff, 11160 }, /* Delete */ - { 0x1000ff73, 11167 }, /* DeleteChar */ - { 0x1000ff71, 11178 }, /* DeleteLine */ - { 0x1000fe60, 11189 }, /* Dgrave_accent */ - { 0x000000a8, 11203 }, /* diaeresis */ - { 0x00000aed, 11213 }, /* diamond */ - { 0x00000aa5, 11221 }, /* digitspace */ - { 0x0100222c, 11232 }, /* dintegral */ - { 0x000000f7, 11242 }, /* division */ - { 0x00000024, 11251 }, /* dollar */ - { 0x010020ab, 11258 }, /* DongSign */ - { 0x00000aaf, 11267 }, /* doubbaselinedot */ - { 0x000001bd, 11283 }, /* doubleacute */ - { 0x00000af2, 11295 }, /* doubledagger */ - { 0x00000afe, 11308 }, /* doublelowquotemark */ - { 0x0000ff54, 11327 }, /* Down */ - { 0x000008fe, 11332 }, /* downarrow */ - { 0x00000ba8, 11342 }, /* downcaret */ - { 0x00000bd6, 11352 }, /* downshoe */ - { 0x00000bc4, 11361 }, /* downstile */ - { 0x00000bc2, 11371 }, /* downtack */ - { 0x1000ff00, 11380 }, /* DRemove */ - { 0x1000feb0, 11388 }, /* Dring_accent */ - { 0x000001d0, 11401 }, /* Dstroke */ - { 0x000001f0, 11409 }, /* dstroke */ - { 0x1000fe7e, 11417 }, /* Dtilde */ - { 0x00000045, 11424 }, /* E */ - { 0x00000065, 11426 }, /* e */ - { 0x000003cc, 11428 }, /* Eabovedot */ - { 0x000003ec, 11438 }, /* eabovedot */ - { 0x000000c9, 11448 }, /* Eacute */ - { 0x000000e9, 11455 }, /* eacute */ - { 0x01001eb8, 11462 }, /* Ebelowdot */ - { 0x01001eb9, 11472 }, /* ebelowdot */ - { 0x000001cc, 11482 }, /* Ecaron */ - { 0x000001ec, 11489 }, /* ecaron */ - { 0x000000ca, 11496 }, /* Ecircumflex */ - { 0x000000ea, 11508 }, /* ecircumflex */ - { 0x01001ebe, 11520 }, /* Ecircumflexacute */ - { 0x01001ebf, 11537 }, /* ecircumflexacute */ - { 0x01001ec6, 11554 }, /* Ecircumflexbelowdot */ - { 0x01001ec7, 11574 }, /* ecircumflexbelowdot */ - { 0x01001ec0, 11594 }, /* Ecircumflexgrave */ - { 0x01001ec1, 11611 }, /* ecircumflexgrave */ - { 0x01001ec2, 11628 }, /* Ecircumflexhook */ - { 0x01001ec3, 11644 }, /* ecircumflexhook */ - { 0x01001ec4, 11660 }, /* Ecircumflextilde */ - { 0x01001ec5, 11677 }, /* ecircumflextilde */ - { 0x010020a0, 11694 }, /* EcuSign */ - { 0x000000cb, 11702 }, /* Ediaeresis */ - { 0x000000eb, 11713 }, /* ediaeresis */ - { 0x000000c8, 11724 }, /* Egrave */ - { 0x000000e8, 11731 }, /* egrave */ - { 0x01001eba, 11738 }, /* Ehook */ - { 0x01001ebb, 11744 }, /* ehook */ - { 0x01002088, 11750 }, /* eightsubscript */ - { 0x01002078, 11765 }, /* eightsuperior */ - { 0x0000ff2f, 11779 }, /* Eisu_Shift */ - { 0x0000ff30, 11790 }, /* Eisu_toggle */ - { 0x01002208, 11802 }, /* elementof */ - { 0x00000aae, 11812 }, /* ellipsis */ - { 0x00000aa3, 11821 }, /* em3space */ - { 0x00000aa4, 11830 }, /* em4space */ - { 0x000003aa, 11839 }, /* Emacron */ - { 0x000003ba, 11847 }, /* emacron */ - { 0x00000aa9, 11855 }, /* emdash */ - { 0x00000ade, 11862 }, /* emfilledcircle */ - { 0x00000adf, 11877 }, /* emfilledrect */ - { 0x00000ace, 11890 }, /* emopencircle */ - { 0x00000acf, 11903 }, /* emopenrectangle */ - { 0x01002205, 11919 }, /* emptyset */ - { 0x00000aa1, 11928 }, /* emspace */ - { 0x0000ff57, 11936 }, /* End */ - { 0x00000aaa, 11940 }, /* endash */ - { 0x00000ae6, 11947 }, /* enfilledcircbullet */ - { 0x00000ae7, 11966 }, /* enfilledsqbullet */ - { 0x000003bd, 11983 }, /* ENG */ - { 0x000003bf, 11987 }, /* eng */ - { 0x00000ae0, 11991 }, /* enopencircbullet */ - { 0x00000ae1, 12008 }, /* enopensquarebullet */ - { 0x00000aa2, 12027 }, /* enspace */ - { 0x000001ca, 12035 }, /* Eogonek */ - { 0x000001ea, 12043 }, /* eogonek */ - { 0x0000003d, 12051 }, /* equal */ - { 0x0000ff1b, 12057 }, /* Escape */ - { 0x000000d0, 12064 }, /* ETH */ - { 0x000000d0, 12068 }, /* Eth */ - { 0x000000f0, 12072 }, /* eth */ - { 0x01001ebc, 12076 }, /* Etilde */ - { 0x01001ebd, 12083 }, /* etilde */ - { 0x000020ac, 12090 }, /* EuroSign */ - { 0x00000021, 12099 }, /* exclam */ - { 0x000000a1, 12106 }, /* exclamdown */ - { 0x0000ff62, 12117 }, /* Execute */ - { 0x1000ff76, 12125 }, /* Ext16bit_L */ - { 0x1000ff77, 12136 }, /* Ext16bit_R */ - { 0x010001b7, 12147 }, /* EZH */ - { 0x01000292, 12151 }, /* ezh */ - { 0x00000046, 12155 }, /* F */ - { 0x00000066, 12157 }, /* f */ - { 0x0000ffbe, 12159 }, /* F1 */ - { 0x0000ffc7, 12162 }, /* F10 */ - { 0x0000ffc8, 12166 }, /* F11 */ - { 0x0000ffc9, 12170 }, /* F12 */ - { 0x0000ffca, 12174 }, /* F13 */ - { 0x0000ffcb, 12178 }, /* F14 */ - { 0x0000ffcc, 12182 }, /* F15 */ - { 0x0000ffcd, 12186 }, /* F16 */ - { 0x0000ffce, 12190 }, /* F17 */ - { 0x0000ffcf, 12194 }, /* F18 */ - { 0x0000ffd0, 12198 }, /* F19 */ - { 0x0000ffbf, 12202 }, /* F2 */ - { 0x0000ffd1, 12205 }, /* F20 */ - { 0x0000ffd2, 12209 }, /* F21 */ - { 0x0000ffd3, 12213 }, /* F22 */ - { 0x0000ffd4, 12217 }, /* F23 */ - { 0x0000ffd5, 12221 }, /* F24 */ - { 0x0000ffd6, 12225 }, /* F25 */ - { 0x0000ffd7, 12229 }, /* F26 */ - { 0x0000ffd8, 12233 }, /* F27 */ - { 0x0000ffd9, 12237 }, /* F28 */ - { 0x0000ffda, 12241 }, /* F29 */ - { 0x0000ffc0, 12245 }, /* F3 */ - { 0x0000ffdb, 12248 }, /* F30 */ - { 0x0000ffdc, 12252 }, /* F31 */ - { 0x0000ffdd, 12256 }, /* F32 */ - { 0x0000ffde, 12260 }, /* F33 */ - { 0x0000ffdf, 12264 }, /* F34 */ - { 0x0000ffe0, 12268 }, /* F35 */ - { 0x0000ffc1, 12272 }, /* F4 */ - { 0x0000ffc2, 12275 }, /* F5 */ - { 0x0000ffc3, 12278 }, /* F6 */ - { 0x0000ffc4, 12281 }, /* F7 */ - { 0x0000ffc5, 12284 }, /* F8 */ - { 0x0000ffc6, 12287 }, /* F9 */ - { 0x01001e1e, 12290 }, /* Fabovedot */ - { 0x01001e1f, 12300 }, /* fabovedot */ - { 0x010006f0, 12310 }, /* Farsi_0 */ - { 0x010006f1, 12318 }, /* Farsi_1 */ - { 0x010006f2, 12326 }, /* Farsi_2 */ - { 0x010006f3, 12334 }, /* Farsi_3 */ - { 0x010006f4, 12342 }, /* Farsi_4 */ - { 0x010006f5, 12350 }, /* Farsi_5 */ - { 0x010006f6, 12358 }, /* Farsi_6 */ - { 0x010006f7, 12366 }, /* Farsi_7 */ - { 0x010006f8, 12374 }, /* Farsi_8 */ - { 0x010006f9, 12382 }, /* Farsi_9 */ - { 0x010006cc, 12390 }, /* Farsi_yeh */ - { 0x00000af8, 12400 }, /* femalesymbol */ - { 0x000009e3, 12413 }, /* ff */ - { 0x010020a3, 12416 }, /* FFrancSign */ - { 0x00000abb, 12427 }, /* figdash */ - { 0x00000adc, 12435 }, /* filledlefttribullet */ - { 0x00000adb, 12455 }, /* filledrectbullet */ - { 0x00000add, 12472 }, /* filledrighttribullet */ - { 0x00000ae9, 12493 }, /* filledtribulletdown */ - { 0x00000ae8, 12513 }, /* filledtribulletup */ - { 0x0000ff68, 12531 }, /* Find */ - { 0x0000fed0, 12536 }, /* First_Virtual_Screen */ - { 0x00000ac5, 12557 }, /* fiveeighths */ - { 0x00000ab7, 12569 }, /* fivesixths */ - { 0x01002085, 12580 }, /* fivesubscript */ - { 0x01002075, 12594 }, /* fivesuperior */ - { 0x00000ab5, 12607 }, /* fourfifths */ - { 0x01002084, 12618 }, /* foursubscript */ - { 0x01002074, 12632 }, /* foursuperior */ - { 0x0100221c, 12645 }, /* fourthroot */ - { 0x000008f6, 12656 }, /* function */ - { 0x00000047, 12665 }, /* G */ - { 0x00000067, 12667 }, /* g */ - { 0x000002d5, 12669 }, /* Gabovedot */ - { 0x000002f5, 12679 }, /* gabovedot */ - { 0x000002ab, 12689 }, /* Gbreve */ - { 0x000002bb, 12696 }, /* gbreve */ - { 0x010001e6, 12703 }, /* Gcaron */ - { 0x010001e7, 12710 }, /* gcaron */ - { 0x000003ab, 12717 }, /* Gcedilla */ - { 0x000003bb, 12726 }, /* gcedilla */ - { 0x000002d8, 12735 }, /* Gcircumflex */ - { 0x000002f8, 12747 }, /* gcircumflex */ - { 0x010010d0, 12759 }, /* Georgian_an */ - { 0x010010d1, 12771 }, /* Georgian_ban */ - { 0x010010ea, 12784 }, /* Georgian_can */ - { 0x010010ed, 12797 }, /* Georgian_char */ - { 0x010010e9, 12811 }, /* Georgian_chin */ - { 0x010010ec, 12825 }, /* Georgian_cil */ - { 0x010010d3, 12838 }, /* Georgian_don */ - { 0x010010d4, 12851 }, /* Georgian_en */ - { 0x010010f6, 12863 }, /* Georgian_fi */ - { 0x010010d2, 12875 }, /* Georgian_gan */ - { 0x010010e6, 12888 }, /* Georgian_ghan */ - { 0x010010f0, 12902 }, /* Georgian_hae */ - { 0x010010f4, 12915 }, /* Georgian_har */ - { 0x010010f1, 12928 }, /* Georgian_he */ - { 0x010010f2, 12940 }, /* Georgian_hie */ - { 0x010010f5, 12953 }, /* Georgian_hoe */ - { 0x010010d8, 12966 }, /* Georgian_in */ - { 0x010010ef, 12978 }, /* Georgian_jhan */ - { 0x010010eb, 12992 }, /* Georgian_jil */ - { 0x010010d9, 13005 }, /* Georgian_kan */ - { 0x010010e5, 13018 }, /* Georgian_khar */ - { 0x010010da, 13032 }, /* Georgian_las */ - { 0x010010db, 13045 }, /* Georgian_man */ - { 0x010010dc, 13058 }, /* Georgian_nar */ - { 0x010010dd, 13071 }, /* Georgian_on */ - { 0x010010de, 13083 }, /* Georgian_par */ - { 0x010010e4, 13096 }, /* Georgian_phar */ - { 0x010010e7, 13110 }, /* Georgian_qar */ - { 0x010010e0, 13123 }, /* Georgian_rae */ - { 0x010010e1, 13136 }, /* Georgian_san */ - { 0x010010e8, 13149 }, /* Georgian_shin */ - { 0x010010d7, 13163 }, /* Georgian_tan */ - { 0x010010e2, 13176 }, /* Georgian_tar */ - { 0x010010e3, 13189 }, /* Georgian_un */ - { 0x010010d5, 13201 }, /* Georgian_vin */ - { 0x010010f3, 13214 }, /* Georgian_we */ - { 0x010010ee, 13226 }, /* Georgian_xan */ - { 0x010010d6, 13239 }, /* Georgian_zen */ - { 0x010010df, 13252 }, /* Georgian_zhar */ - { 0x00000060, 13266 }, /* grave */ - { 0x0000003e, 13272 }, /* greater */ - { 0x000008be, 13280 }, /* greaterthanequal */ - { 0x000007ae, 13297 }, /* Greek_accentdieresis */ - { 0x000007c1, 13318 }, /* Greek_ALPHA */ - { 0x000007e1, 13330 }, /* Greek_alpha */ - { 0x000007a1, 13342 }, /* Greek_ALPHAaccent */ - { 0x000007b1, 13360 }, /* Greek_alphaaccent */ - { 0x000007c2, 13378 }, /* Greek_BETA */ - { 0x000007e2, 13389 }, /* Greek_beta */ - { 0x000007d7, 13400 }, /* Greek_CHI */ - { 0x000007f7, 13410 }, /* Greek_chi */ - { 0x000007c4, 13420 }, /* Greek_DELTA */ - { 0x000007e4, 13432 }, /* Greek_delta */ - { 0x000007c5, 13444 }, /* Greek_EPSILON */ - { 0x000007e5, 13458 }, /* Greek_epsilon */ - { 0x000007a2, 13472 }, /* Greek_EPSILONaccent */ - { 0x000007b2, 13492 }, /* Greek_epsilonaccent */ - { 0x000007c7, 13512 }, /* Greek_ETA */ - { 0x000007e7, 13522 }, /* Greek_eta */ - { 0x000007a3, 13532 }, /* Greek_ETAaccent */ - { 0x000007b3, 13548 }, /* Greek_etaaccent */ - { 0x000007f3, 13564 }, /* Greek_finalsmallsigma */ - { 0x000007c3, 13586 }, /* Greek_GAMMA */ - { 0x000007e3, 13598 }, /* Greek_gamma */ - { 0x000007af, 13610 }, /* Greek_horizbar */ - { 0x000007c9, 13625 }, /* Greek_IOTA */ - { 0x000007e9, 13636 }, /* Greek_iota */ - { 0x000007a4, 13647 }, /* Greek_IOTAaccent */ - { 0x000007b4, 13664 }, /* Greek_iotaaccent */ - { 0x000007b6, 13681 }, /* Greek_iotaaccentdieresis */ - { 0x000007a5, 13706 }, /* Greek_IOTAdiaeresis */ - { 0x000007a5, 13726 }, /* Greek_IOTAdieresis */ - { 0x000007b5, 13745 }, /* Greek_iotadieresis */ - { 0x000007ca, 13764 }, /* Greek_KAPPA */ - { 0x000007ea, 13776 }, /* Greek_kappa */ - { 0x000007cb, 13788 }, /* Greek_LAMBDA */ - { 0x000007eb, 13801 }, /* Greek_lambda */ - { 0x000007cb, 13814 }, /* Greek_LAMDA */ - { 0x000007eb, 13826 }, /* Greek_lamda */ - { 0x000007cc, 13838 }, /* Greek_MU */ - { 0x000007ec, 13847 }, /* Greek_mu */ - { 0x000007cd, 13856 }, /* Greek_NU */ - { 0x000007ed, 13865 }, /* Greek_nu */ - { 0x000007d9, 13874 }, /* Greek_OMEGA */ - { 0x000007f9, 13886 }, /* Greek_omega */ - { 0x000007ab, 13898 }, /* Greek_OMEGAaccent */ - { 0x000007bb, 13916 }, /* Greek_omegaaccent */ - { 0x000007cf, 13934 }, /* Greek_OMICRON */ - { 0x000007ef, 13948 }, /* Greek_omicron */ - { 0x000007a7, 13962 }, /* Greek_OMICRONaccent */ - { 0x000007b7, 13982 }, /* Greek_omicronaccent */ - { 0x000007d6, 14002 }, /* Greek_PHI */ - { 0x000007f6, 14012 }, /* Greek_phi */ - { 0x000007d0, 14022 }, /* Greek_PI */ - { 0x000007f0, 14031 }, /* Greek_pi */ - { 0x000007d8, 14040 }, /* Greek_PSI */ - { 0x000007f8, 14050 }, /* Greek_psi */ - { 0x000007d1, 14060 }, /* Greek_RHO */ - { 0x000007f1, 14070 }, /* Greek_rho */ - { 0x000007d2, 14080 }, /* Greek_SIGMA */ - { 0x000007f2, 14092 }, /* Greek_sigma */ - { 0x0000ff7e, 14104 }, /* Greek_switch */ - { 0x000007d4, 14117 }, /* Greek_TAU */ - { 0x000007f4, 14127 }, /* Greek_tau */ - { 0x000007c8, 14137 }, /* Greek_THETA */ - { 0x000007e8, 14149 }, /* Greek_theta */ - { 0x000007d5, 14161 }, /* Greek_UPSILON */ - { 0x000007f5, 14175 }, /* Greek_upsilon */ - { 0x000007a8, 14189 }, /* Greek_UPSILONaccent */ - { 0x000007b8, 14209 }, /* Greek_upsilonaccent */ - { 0x000007ba, 14229 }, /* Greek_upsilonaccentdieresis */ - { 0x000007a9, 14257 }, /* Greek_UPSILONdieresis */ - { 0x000007b9, 14279 }, /* Greek_upsilondieresis */ - { 0x000007ce, 14301 }, /* Greek_XI */ - { 0x000007ee, 14310 }, /* Greek_xi */ - { 0x000007c6, 14319 }, /* Greek_ZETA */ - { 0x000007e6, 14330 }, /* Greek_zeta */ - { 0x100000be, 14341 }, /* guilder */ - { 0x000000ab, 14349 }, /* guillemotleft */ - { 0x000000bb, 14363 }, /* guillemotright */ - { 0x00000048, 14378 }, /* H */ - { 0x00000068, 14380 }, /* h */ - { 0x00000aa8, 14382 }, /* hairspace */ - { 0x0000ff31, 14392 }, /* Hangul */ - { 0x00000ebf, 14399 }, /* Hangul_A */ - { 0x00000ec0, 14408 }, /* Hangul_AE */ - { 0x00000ef6, 14418 }, /* Hangul_AraeA */ - { 0x00000ef7, 14431 }, /* Hangul_AraeAE */ - { 0x0000ff39, 14445 }, /* Hangul_Banja */ - { 0x00000eba, 14458 }, /* Hangul_Cieuc */ - { 0x0000ff37, 14471 }, /* Hangul_Codeinput */ - { 0x00000ea7, 14488 }, /* Hangul_Dikeud */ - { 0x00000ec4, 14502 }, /* Hangul_E */ - { 0x0000ff33, 14511 }, /* Hangul_End */ - { 0x00000ec3, 14522 }, /* Hangul_EO */ - { 0x00000ed1, 14532 }, /* Hangul_EU */ - { 0x0000ff34, 14542 }, /* Hangul_Hanja */ - { 0x00000ebe, 14555 }, /* Hangul_Hieuh */ - { 0x00000ed3, 14568 }, /* Hangul_I */ - { 0x00000eb7, 14577 }, /* Hangul_Ieung */ - { 0x00000eea, 14590 }, /* Hangul_J_Cieuc */ - { 0x00000eda, 14605 }, /* Hangul_J_Dikeud */ - { 0x00000eee, 14621 }, /* Hangul_J_Hieuh */ - { 0x00000ee8, 14636 }, /* Hangul_J_Ieung */ - { 0x00000ee9, 14651 }, /* Hangul_J_Jieuj */ - { 0x00000eeb, 14666 }, /* Hangul_J_Khieuq */ - { 0x00000ed4, 14682 }, /* Hangul_J_Kiyeog */ - { 0x00000ed6, 14698 }, /* Hangul_J_KiyeogSios */ - { 0x00000ef9, 14718 }, /* Hangul_J_KkogjiDalrinIeung */ - { 0x00000ee3, 14745 }, /* Hangul_J_Mieum */ - { 0x00000ed7, 14760 }, /* Hangul_J_Nieun */ - { 0x00000ed9, 14775 }, /* Hangul_J_NieunHieuh */ - { 0x00000ed8, 14795 }, /* Hangul_J_NieunJieuj */ - { 0x00000ef8, 14815 }, /* Hangul_J_PanSios */ - { 0x00000eed, 14832 }, /* Hangul_J_Phieuf */ - { 0x00000ee4, 14848 }, /* Hangul_J_Pieub */ - { 0x00000ee5, 14863 }, /* Hangul_J_PieubSios */ - { 0x00000edb, 14882 }, /* Hangul_J_Rieul */ - { 0x00000ee2, 14897 }, /* Hangul_J_RieulHieuh */ - { 0x00000edc, 14917 }, /* Hangul_J_RieulKiyeog */ - { 0x00000edd, 14938 }, /* Hangul_J_RieulMieum */ - { 0x00000ee1, 14958 }, /* Hangul_J_RieulPhieuf */ - { 0x00000ede, 14979 }, /* Hangul_J_RieulPieub */ - { 0x00000edf, 14999 }, /* Hangul_J_RieulSios */ - { 0x00000ee0, 15018 }, /* Hangul_J_RieulTieut */ - { 0x00000ee6, 15038 }, /* Hangul_J_Sios */ - { 0x00000ed5, 15052 }, /* Hangul_J_SsangKiyeog */ - { 0x00000ee7, 15073 }, /* Hangul_J_SsangSios */ - { 0x00000eec, 15092 }, /* Hangul_J_Tieut */ - { 0x00000efa, 15107 }, /* Hangul_J_YeorinHieuh */ - { 0x0000ff35, 15128 }, /* Hangul_Jamo */ - { 0x0000ff38, 15140 }, /* Hangul_Jeonja */ - { 0x00000eb8, 15154 }, /* Hangul_Jieuj */ - { 0x00000ebb, 15167 }, /* Hangul_Khieuq */ - { 0x00000ea1, 15181 }, /* Hangul_Kiyeog */ - { 0x00000ea3, 15195 }, /* Hangul_KiyeogSios */ - { 0x00000ef3, 15213 }, /* Hangul_KkogjiDalrinIeung */ - { 0x00000eb1, 15238 }, /* Hangul_Mieum */ - { 0x0000ff3d, 15251 }, /* Hangul_MultipleCandidate */ - { 0x00000ea4, 15276 }, /* Hangul_Nieun */ - { 0x00000ea6, 15289 }, /* Hangul_NieunHieuh */ - { 0x00000ea5, 15307 }, /* Hangul_NieunJieuj */ - { 0x00000ec7, 15325 }, /* Hangul_O */ - { 0x00000eca, 15334 }, /* Hangul_OE */ - { 0x00000ef2, 15344 }, /* Hangul_PanSios */ - { 0x00000ebd, 15359 }, /* Hangul_Phieuf */ - { 0x00000eb2, 15373 }, /* Hangul_Pieub */ - { 0x00000eb4, 15386 }, /* Hangul_PieubSios */ - { 0x0000ff3b, 15403 }, /* Hangul_PostHanja */ - { 0x0000ff3a, 15420 }, /* Hangul_PreHanja */ - { 0x0000ff3e, 15436 }, /* Hangul_PreviousCandidate */ - { 0x00000ea9, 15461 }, /* Hangul_Rieul */ - { 0x00000eb0, 15474 }, /* Hangul_RieulHieuh */ - { 0x00000eaa, 15492 }, /* Hangul_RieulKiyeog */ - { 0x00000eab, 15511 }, /* Hangul_RieulMieum */ - { 0x00000eaf, 15529 }, /* Hangul_RieulPhieuf */ - { 0x00000eac, 15548 }, /* Hangul_RieulPieub */ - { 0x00000ead, 15566 }, /* Hangul_RieulSios */ - { 0x00000eae, 15583 }, /* Hangul_RieulTieut */ - { 0x00000eef, 15601 }, /* Hangul_RieulYeorinHieuh */ - { 0x0000ff36, 15625 }, /* Hangul_Romaja */ - { 0x0000ff3c, 15639 }, /* Hangul_SingleCandidate */ - { 0x00000eb5, 15662 }, /* Hangul_Sios */ - { 0x0000ff3f, 15674 }, /* Hangul_Special */ - { 0x00000ea8, 15689 }, /* Hangul_SsangDikeud */ - { 0x00000eb9, 15708 }, /* Hangul_SsangJieuj */ - { 0x00000ea2, 15726 }, /* Hangul_SsangKiyeog */ - { 0x00000eb3, 15745 }, /* Hangul_SsangPieub */ - { 0x00000eb6, 15763 }, /* Hangul_SsangSios */ - { 0x0000ff32, 15780 }, /* Hangul_Start */ - { 0x00000ef0, 15793 }, /* Hangul_SunkyeongeumMieum */ - { 0x00000ef4, 15818 }, /* Hangul_SunkyeongeumPhieuf */ - { 0x00000ef1, 15844 }, /* Hangul_SunkyeongeumPieub */ - { 0x0000ff7e, 15869 }, /* Hangul_switch */ - { 0x00000ebc, 15883 }, /* Hangul_Tieut */ - { 0x00000ecc, 15896 }, /* Hangul_U */ - { 0x00000ec8, 15905 }, /* Hangul_WA */ - { 0x00000ec9, 15915 }, /* Hangul_WAE */ - { 0x00000ece, 15926 }, /* Hangul_WE */ - { 0x00000ecd, 15936 }, /* Hangul_WEO */ - { 0x00000ecf, 15947 }, /* Hangul_WI */ - { 0x00000ec1, 15957 }, /* Hangul_YA */ - { 0x00000ec2, 15967 }, /* Hangul_YAE */ - { 0x00000ec6, 15978 }, /* Hangul_YE */ - { 0x00000ec5, 15988 }, /* Hangul_YEO */ - { 0x00000ef5, 15999 }, /* Hangul_YeorinHieuh */ - { 0x00000ed2, 16018 }, /* Hangul_YI */ - { 0x00000ecb, 16028 }, /* Hangul_YO */ - { 0x00000ed0, 16038 }, /* Hangul_YU */ - { 0x0000ff29, 16048 }, /* Hankaku */ - { 0x000002a6, 16056 }, /* Hcircumflex */ - { 0x000002b6, 16068 }, /* hcircumflex */ - { 0x00000aee, 16080 }, /* heart */ - { 0x00000ce0, 16086 }, /* hebrew_aleph */ - { 0x00000cf2, 16099 }, /* hebrew_ayin */ - { 0x00000ce1, 16111 }, /* hebrew_bet */ - { 0x00000ce1, 16122 }, /* hebrew_beth */ - { 0x00000ce7, 16134 }, /* hebrew_chet */ - { 0x00000ce3, 16146 }, /* hebrew_dalet */ - { 0x00000ce3, 16159 }, /* hebrew_daleth */ - { 0x00000cdf, 16173 }, /* hebrew_doublelowline */ - { 0x00000cea, 16194 }, /* hebrew_finalkaph */ - { 0x00000ced, 16211 }, /* hebrew_finalmem */ - { 0x00000cef, 16227 }, /* hebrew_finalnun */ - { 0x00000cf3, 16243 }, /* hebrew_finalpe */ - { 0x00000cf5, 16258 }, /* hebrew_finalzade */ - { 0x00000cf5, 16275 }, /* hebrew_finalzadi */ - { 0x00000ce2, 16292 }, /* hebrew_gimel */ - { 0x00000ce2, 16305 }, /* hebrew_gimmel */ - { 0x00000ce4, 16319 }, /* hebrew_he */ - { 0x00000ce7, 16329 }, /* hebrew_het */ - { 0x00000ceb, 16340 }, /* hebrew_kaph */ - { 0x00000cf7, 16352 }, /* hebrew_kuf */ - { 0x00000cec, 16363 }, /* hebrew_lamed */ - { 0x00000cee, 16376 }, /* hebrew_mem */ - { 0x00000cf0, 16387 }, /* hebrew_nun */ - { 0x00000cf4, 16398 }, /* hebrew_pe */ - { 0x00000cf7, 16408 }, /* hebrew_qoph */ - { 0x00000cf8, 16420 }, /* hebrew_resh */ - { 0x00000cf1, 16432 }, /* hebrew_samech */ - { 0x00000cf1, 16446 }, /* hebrew_samekh */ - { 0x00000cf9, 16460 }, /* hebrew_shin */ - { 0x0000ff7e, 16472 }, /* Hebrew_switch */ - { 0x00000cfa, 16486 }, /* hebrew_taf */ - { 0x00000cfa, 16497 }, /* hebrew_taw */ - { 0x00000ce8, 16508 }, /* hebrew_tet */ - { 0x00000ce8, 16519 }, /* hebrew_teth */ - { 0x00000ce5, 16531 }, /* hebrew_waw */ - { 0x00000ce9, 16542 }, /* hebrew_yod */ - { 0x00000cf6, 16553 }, /* hebrew_zade */ - { 0x00000cf6, 16565 }, /* hebrew_zadi */ - { 0x00000ce6, 16577 }, /* hebrew_zain */ - { 0x00000ce6, 16589 }, /* hebrew_zayin */ - { 0x0000ff6a, 16602 }, /* Help */ - { 0x0000ff23, 16607 }, /* Henkan */ - { 0x0000ff23, 16614 }, /* Henkan_Mode */ - { 0x00000ada, 16626 }, /* hexagram */ - { 0x0000ff25, 16635 }, /* Hiragana */ - { 0x0000ff27, 16644 }, /* Hiragana_Katakana */ - { 0x0000ff50, 16662 }, /* Home */ - { 0x000008a3, 16667 }, /* horizconnector */ - { 0x000009ef, 16682 }, /* horizlinescan1 */ - { 0x000009f0, 16697 }, /* horizlinescan3 */ - { 0x000009f1, 16712 }, /* horizlinescan5 */ - { 0x000009f2, 16727 }, /* horizlinescan7 */ - { 0x000009f3, 16742 }, /* horizlinescan9 */ - { 0x1000ff74, 16757 }, /* hpBackTab */ - { 0x100000fc, 16767 }, /* hpblock */ - { 0x1000ff6f, 16775 }, /* hpClearLine */ - { 0x1000ff73, 16787 }, /* hpDeleteChar */ - { 0x1000ff71, 16800 }, /* hpDeleteLine */ - { 0x100000be, 16813 }, /* hpguilder */ - { 0x1000ff72, 16823 }, /* hpInsertChar */ - { 0x1000ff70, 16836 }, /* hpInsertLine */ - { 0x100000ee, 16849 }, /* hpIO */ - { 0x1000ff75, 16854 }, /* hpKP_BackTab */ - { 0x100000af, 16867 }, /* hplira */ - { 0x100000f6, 16874 }, /* hplongminus */ - { 0x1000ff48, 16886 }, /* hpModelock1 */ - { 0x1000ff49, 16898 }, /* hpModelock2 */ - { 0x100000a8, 16910 }, /* hpmute_acute */ - { 0x100000aa, 16923 }, /* hpmute_asciicircum */ - { 0x100000ac, 16942 }, /* hpmute_asciitilde */ - { 0x100000ab, 16960 }, /* hpmute_diaeresis */ - { 0x100000a9, 16977 }, /* hpmute_grave */ - { 0x1000ff6c, 16990 }, /* hpReset */ - { 0x1000ff6d, 16998 }, /* hpSystem */ - { 0x1000ff6e, 17007 }, /* hpUser */ - { 0x100000ee, 17014 }, /* hpYdiaeresis */ - { 0x000002a1, 17027 }, /* Hstroke */ - { 0x000002b1, 17035 }, /* hstroke */ - { 0x000009e2, 17043 }, /* ht */ - { 0x0000ffed, 17046 }, /* Hyper_L */ - { 0x0000ffee, 17054 }, /* Hyper_R */ - { 0x000000ad, 17062 }, /* hyphen */ - { 0x00000049, 17069 }, /* I */ - { 0x00000069, 17071 }, /* i */ - { 0x000002a9, 17073 }, /* Iabovedot */ - { 0x000000cd, 17083 }, /* Iacute */ - { 0x000000ed, 17090 }, /* iacute */ - { 0x01001eca, 17097 }, /* Ibelowdot */ - { 0x01001ecb, 17107 }, /* ibelowdot */ - { 0x0100012c, 17117 }, /* Ibreve */ - { 0x0100012d, 17124 }, /* ibreve */ - { 0x000000ce, 17131 }, /* Icircumflex */ - { 0x000000ee, 17143 }, /* icircumflex */ - { 0x000008cf, 17155 }, /* identical */ - { 0x000000cf, 17165 }, /* Idiaeresis */ - { 0x000000ef, 17176 }, /* idiaeresis */ - { 0x000002b9, 17187 }, /* idotless */ - { 0x000008cd, 17196 }, /* ifonlyif */ - { 0x000000cc, 17205 }, /* Igrave */ - { 0x000000ec, 17212 }, /* igrave */ - { 0x01001ec8, 17219 }, /* Ihook */ - { 0x01001ec9, 17225 }, /* ihook */ - { 0x000003cf, 17231 }, /* Imacron */ - { 0x000003ef, 17239 }, /* imacron */ - { 0x000008ce, 17247 }, /* implies */ - { 0x000008da, 17255 }, /* includedin */ - { 0x000008db, 17266 }, /* includes */ - { 0x000008c2, 17275 }, /* infinity */ - { 0x0000ff63, 17284 }, /* Insert */ - { 0x1000ff72, 17291 }, /* InsertChar */ - { 0x1000ff70, 17302 }, /* InsertLine */ - { 0x000008bf, 17313 }, /* integral */ - { 0x000008dc, 17322 }, /* intersection */ - { 0x100000ee, 17335 }, /* IO */ - { 0x000003c7, 17338 }, /* Iogonek */ - { 0x000003e7, 17346 }, /* iogonek */ - { 0x0000fe33, 17354 }, /* ISO_Center_Object */ - { 0x0000fe30, 17372 }, /* ISO_Continuous_Underline */ - { 0x0000fe31, 17397 }, /* ISO_Discontinuous_Underline */ - { 0x0000fe32, 17425 }, /* ISO_Emphasize */ - { 0x0000fe34, 17439 }, /* ISO_Enter */ - { 0x0000fe2f, 17449 }, /* ISO_Fast_Cursor_Down */ - { 0x0000fe2c, 17470 }, /* ISO_Fast_Cursor_Left */ - { 0x0000fe2d, 17491 }, /* ISO_Fast_Cursor_Right */ - { 0x0000fe2e, 17513 }, /* ISO_Fast_Cursor_Up */ - { 0x0000fe0c, 17532 }, /* ISO_First_Group */ - { 0x0000fe0d, 17548 }, /* ISO_First_Group_Lock */ - { 0x0000fe06, 17569 }, /* ISO_Group_Latch */ - { 0x0000fe07, 17585 }, /* ISO_Group_Lock */ - { 0x0000ff7e, 17600 }, /* ISO_Group_Shift */ - { 0x0000fe0e, 17616 }, /* ISO_Last_Group */ - { 0x0000fe0f, 17631 }, /* ISO_Last_Group_Lock */ - { 0x0000fe20, 17651 }, /* ISO_Left_Tab */ - { 0x0000fe02, 17664 }, /* ISO_Level2_Latch */ - { 0x0000fe04, 17681 }, /* ISO_Level3_Latch */ - { 0x0000fe05, 17698 }, /* ISO_Level3_Lock */ - { 0x0000fe03, 17714 }, /* ISO_Level3_Shift */ - { 0x0000fe12, 17731 }, /* ISO_Level5_Latch */ - { 0x0000fe13, 17748 }, /* ISO_Level5_Lock */ - { 0x0000fe11, 17764 }, /* ISO_Level5_Shift */ - { 0x0000fe01, 17781 }, /* ISO_Lock */ - { 0x0000fe22, 17790 }, /* ISO_Move_Line_Down */ - { 0x0000fe21, 17809 }, /* ISO_Move_Line_Up */ - { 0x0000fe08, 17826 }, /* ISO_Next_Group */ - { 0x0000fe09, 17841 }, /* ISO_Next_Group_Lock */ - { 0x0000fe24, 17861 }, /* ISO_Partial_Line_Down */ - { 0x0000fe23, 17883 }, /* ISO_Partial_Line_Up */ - { 0x0000fe25, 17903 }, /* ISO_Partial_Space_Left */ - { 0x0000fe26, 17926 }, /* ISO_Partial_Space_Right */ - { 0x0000fe0a, 17950 }, /* ISO_Prev_Group */ - { 0x0000fe0b, 17965 }, /* ISO_Prev_Group_Lock */ - { 0x0000fe2b, 17985 }, /* ISO_Release_Both_Margins */ - { 0x0000fe29, 18010 }, /* ISO_Release_Margin_Left */ - { 0x0000fe2a, 18034 }, /* ISO_Release_Margin_Right */ - { 0x0000fe27, 18059 }, /* ISO_Set_Margin_Left */ - { 0x0000fe28, 18079 }, /* ISO_Set_Margin_Right */ - { 0x000003a5, 18100 }, /* Itilde */ - { 0x000003b5, 18107 }, /* itilde */ - { 0x0000004a, 18114 }, /* J */ - { 0x0000006a, 18116 }, /* j */ - { 0x000002ac, 18118 }, /* Jcircumflex */ - { 0x000002bc, 18130 }, /* jcircumflex */ - { 0x00000bca, 18142 }, /* jot */ - { 0x0000004b, 18146 }, /* K */ - { 0x0000006b, 18148 }, /* k */ - { 0x000004a7, 18150 }, /* kana_a */ - { 0x000004b1, 18157 }, /* kana_A */ - { 0x000004c1, 18164 }, /* kana_CHI */ - { 0x000004a3, 18173 }, /* kana_closingbracket */ - { 0x000004a4, 18193 }, /* kana_comma */ - { 0x000004a5, 18204 }, /* kana_conjunctive */ - { 0x000004aa, 18221 }, /* kana_e */ - { 0x000004b4, 18228 }, /* kana_E */ - { 0x000004cc, 18235 }, /* kana_FU */ - { 0x000004a1, 18243 }, /* kana_fullstop */ - { 0x000004ca, 18257 }, /* kana_HA */ - { 0x000004cd, 18265 }, /* kana_HE */ - { 0x000004cb, 18273 }, /* kana_HI */ - { 0x000004ce, 18281 }, /* kana_HO */ - { 0x000004cc, 18289 }, /* kana_HU */ - { 0x000004a8, 18297 }, /* kana_i */ - { 0x000004b2, 18304 }, /* kana_I */ - { 0x000004b6, 18311 }, /* kana_KA */ - { 0x000004b9, 18319 }, /* kana_KE */ - { 0x000004b7, 18327 }, /* kana_KI */ - { 0x000004ba, 18335 }, /* kana_KO */ - { 0x000004b8, 18343 }, /* kana_KU */ - { 0x0000ff2d, 18351 }, /* Kana_Lock */ - { 0x000004cf, 18361 }, /* kana_MA */ - { 0x000004d2, 18369 }, /* kana_ME */ - { 0x000004d0, 18377 }, /* kana_MI */ - { 0x000004a5, 18385 }, /* kana_middledot */ - { 0x000004d3, 18400 }, /* kana_MO */ - { 0x000004d1, 18408 }, /* kana_MU */ - { 0x000004dd, 18416 }, /* kana_N */ - { 0x000004c5, 18423 }, /* kana_NA */ - { 0x000004c8, 18431 }, /* kana_NE */ - { 0x000004c6, 18439 }, /* kana_NI */ - { 0x000004c9, 18447 }, /* kana_NO */ - { 0x000004c7, 18455 }, /* kana_NU */ - { 0x000004ab, 18463 }, /* kana_o */ - { 0x000004b5, 18470 }, /* kana_O */ - { 0x000004a2, 18477 }, /* kana_openingbracket */ - { 0x000004d7, 18497 }, /* kana_RA */ - { 0x000004da, 18505 }, /* kana_RE */ - { 0x000004d8, 18513 }, /* kana_RI */ - { 0x000004db, 18521 }, /* kana_RO */ - { 0x000004d9, 18529 }, /* kana_RU */ - { 0x000004bb, 18537 }, /* kana_SA */ - { 0x000004be, 18545 }, /* kana_SE */ - { 0x000004bc, 18553 }, /* kana_SHI */ - { 0x0000ff2e, 18562 }, /* Kana_Shift */ - { 0x000004bf, 18573 }, /* kana_SO */ - { 0x000004bd, 18581 }, /* kana_SU */ - { 0x0000ff7e, 18589 }, /* kana_switch */ - { 0x000004c0, 18601 }, /* kana_TA */ - { 0x000004c3, 18609 }, /* kana_TE */ - { 0x000004c1, 18617 }, /* kana_TI */ - { 0x000004c4, 18625 }, /* kana_TO */ - { 0x000004af, 18633 }, /* kana_tsu */ - { 0x000004c2, 18642 }, /* kana_TSU */ - { 0x000004af, 18651 }, /* kana_tu */ - { 0x000004c2, 18659 }, /* kana_TU */ - { 0x000004a9, 18667 }, /* kana_u */ - { 0x000004b3, 18674 }, /* kana_U */ - { 0x000004dc, 18681 }, /* kana_WA */ - { 0x000004a6, 18689 }, /* kana_WO */ - { 0x000004ac, 18697 }, /* kana_ya */ - { 0x000004d4, 18705 }, /* kana_YA */ - { 0x000004ae, 18713 }, /* kana_yo */ - { 0x000004d6, 18721 }, /* kana_YO */ - { 0x000004ad, 18729 }, /* kana_yu */ - { 0x000004d5, 18737 }, /* kana_YU */ - { 0x0000ff21, 18745 }, /* Kanji */ - { 0x0000ff37, 18751 }, /* Kanji_Bangou */ - { 0x000003a2, 18764 }, /* kappa */ - { 0x0000ff26, 18770 }, /* Katakana */ - { 0x000003d3, 18779 }, /* Kcedilla */ - { 0x000003f3, 18788 }, /* kcedilla */ - { 0x00000eff, 18797 }, /* Korean_Won */ - { 0x0000ffb0, 18808 }, /* KP_0 */ - { 0x0000ffb1, 18813 }, /* KP_1 */ - { 0x0000ffb2, 18818 }, /* KP_2 */ - { 0x0000ffb3, 18823 }, /* KP_3 */ - { 0x0000ffb4, 18828 }, /* KP_4 */ - { 0x0000ffb5, 18833 }, /* KP_5 */ - { 0x0000ffb6, 18838 }, /* KP_6 */ - { 0x0000ffb7, 18843 }, /* KP_7 */ - { 0x0000ffb8, 18848 }, /* KP_8 */ - { 0x0000ffb9, 18853 }, /* KP_9 */ - { 0x0000ffab, 18858 }, /* KP_Add */ - { 0x1000ff75, 18865 }, /* KP_BackTab */ - { 0x0000ff9d, 18876 }, /* KP_Begin */ - { 0x0000ffae, 18885 }, /* KP_Decimal */ - { 0x0000ff9f, 18896 }, /* KP_Delete */ - { 0x0000ffaf, 18906 }, /* KP_Divide */ - { 0x0000ff99, 18916 }, /* KP_Down */ - { 0x0000ff9c, 18924 }, /* KP_End */ - { 0x0000ff8d, 18931 }, /* KP_Enter */ - { 0x0000ffbd, 18940 }, /* KP_Equal */ - { 0x0000ff91, 18949 }, /* KP_F1 */ - { 0x0000ff92, 18955 }, /* KP_F2 */ - { 0x0000ff93, 18961 }, /* KP_F3 */ - { 0x0000ff94, 18967 }, /* KP_F4 */ - { 0x0000ff95, 18973 }, /* KP_Home */ - { 0x0000ff9e, 18981 }, /* KP_Insert */ - { 0x0000ff96, 18991 }, /* KP_Left */ - { 0x0000ffaa, 18999 }, /* KP_Multiply */ - { 0x0000ff9b, 19011 }, /* KP_Next */ - { 0x0000ff9b, 19019 }, /* KP_Page_Down */ - { 0x0000ff9a, 19032 }, /* KP_Page_Up */ - { 0x0000ff9a, 19043 }, /* KP_Prior */ - { 0x0000ff98, 19052 }, /* KP_Right */ - { 0x0000ffac, 19061 }, /* KP_Separator */ - { 0x0000ff80, 19074 }, /* KP_Space */ - { 0x0000ffad, 19083 }, /* KP_Subtract */ - { 0x0000ff89, 19095 }, /* KP_Tab */ - { 0x0000ff97, 19102 }, /* KP_Up */ - { 0x000003a2, 19108 }, /* kra */ - { 0x0000004c, 19112 }, /* L */ - { 0x0000006c, 19114 }, /* l */ - { 0x0000ffc8, 19116 }, /* L1 */ - { 0x0000ffd1, 19119 }, /* L10 */ - { 0x0000ffc9, 19123 }, /* L2 */ - { 0x0000ffca, 19126 }, /* L3 */ - { 0x0000ffcb, 19129 }, /* L4 */ - { 0x0000ffcc, 19132 }, /* L5 */ - { 0x0000ffcd, 19135 }, /* L6 */ - { 0x0000ffce, 19138 }, /* L7 */ - { 0x0000ffcf, 19141 }, /* L8 */ - { 0x0000ffd0, 19144 }, /* L9 */ - { 0x000001c5, 19147 }, /* Lacute */ - { 0x000001e5, 19154 }, /* lacute */ - { 0x0000fed4, 19161 }, /* Last_Virtual_Screen */ - { 0x00000ad9, 19181 }, /* latincross */ - { 0x01001e36, 19192 }, /* Lbelowdot */ - { 0x01001e37, 19202 }, /* lbelowdot */ - { 0x000001a5, 19212 }, /* Lcaron */ - { 0x000001b5, 19219 }, /* lcaron */ - { 0x000003a6, 19226 }, /* Lcedilla */ - { 0x000003b6, 19235 }, /* lcedilla */ - { 0x0000ff51, 19244 }, /* Left */ - { 0x00000abc, 19249 }, /* leftanglebracket */ - { 0x000008fb, 19266 }, /* leftarrow */ - { 0x00000ba3, 19276 }, /* leftcaret */ - { 0x00000ad2, 19286 }, /* leftdoublequotemark */ - { 0x000008af, 19306 }, /* leftmiddlecurlybrace */ - { 0x00000acc, 19327 }, /* leftopentriangle */ - { 0x00000aea, 19344 }, /* leftpointer */ - { 0x000008a1, 19356 }, /* leftradical */ - { 0x00000bda, 19368 }, /* leftshoe */ - { 0x00000ad0, 19377 }, /* leftsinglequotemark */ - { 0x000009f4, 19397 }, /* leftt */ - { 0x00000bdc, 19403 }, /* lefttack */ - { 0x0000003c, 19412 }, /* less */ - { 0x000008bc, 19417 }, /* lessthanequal */ - { 0x000009e5, 19431 }, /* lf */ - { 0x0000ff0a, 19434 }, /* Linefeed */ - { 0x100000af, 19443 }, /* lira */ - { 0x010020a4, 19448 }, /* LiraSign */ - { 0x000008de, 19457 }, /* logicaland */ - { 0x000008df, 19468 }, /* logicalor */ - { 0x100000f6, 19478 }, /* longminus */ - { 0x000009ed, 19488 }, /* lowleftcorner */ - { 0x000009ea, 19502 }, /* lowrightcorner */ - { 0x000001a3, 19517 }, /* Lstroke */ - { 0x000001b3, 19525 }, /* lstroke */ - { 0x0000004d, 19533 }, /* M */ - { 0x0000006d, 19535 }, /* m */ - { 0x01001e40, 19537 }, /* Mabovedot */ - { 0x01001e41, 19547 }, /* mabovedot */ - { 0x000006a5, 19557 }, /* Macedonia_dse */ - { 0x000006b5, 19571 }, /* Macedonia_DSE */ - { 0x000006a2, 19585 }, /* Macedonia_gje */ - { 0x000006b2, 19599 }, /* Macedonia_GJE */ - { 0x000006ac, 19613 }, /* Macedonia_kje */ - { 0x000006bc, 19627 }, /* Macedonia_KJE */ - { 0x000000af, 19641 }, /* macron */ - { 0x0000ff3e, 19648 }, /* Mae_Koho */ - { 0x00000af7, 19657 }, /* malesymbol */ - { 0x00000af0, 19668 }, /* maltesecross */ - { 0x00000abf, 19681 }, /* marker */ - { 0x000000ba, 19688 }, /* masculine */ - { 0x0000ff2c, 19698 }, /* Massyo */ - { 0x0000ff67, 19705 }, /* Menu */ - { 0x0000ffe7, 19710 }, /* Meta_L */ - { 0x0000ffe8, 19717 }, /* Meta_R */ - { 0x010020a5, 19724 }, /* MillSign */ - { 0x0000002d, 19733 }, /* minus */ - { 0x00000ad6, 19739 }, /* minutes */ - { 0x0000ff7e, 19747 }, /* Mode_switch */ - { 0x0000fe77, 19759 }, /* MouseKeys_Accel_Enable */ - { 0x0000fe76, 19782 }, /* MouseKeys_Enable */ - { 0x000000b5, 19799 }, /* mu */ - { 0x0000ff22, 19802 }, /* Muhenkan */ - { 0x0000ff20, 19811 }, /* Multi_key */ - { 0x0000ff3d, 19821 }, /* MultipleCandidate */ - { 0x000000d7, 19839 }, /* multiply */ - { 0x00000af6, 19848 }, /* musicalflat */ - { 0x00000af5, 19860 }, /* musicalsharp */ - { 0x100000a8, 19873 }, /* mute_acute */ - { 0x100000aa, 19884 }, /* mute_asciicircum */ - { 0x100000ac, 19901 }, /* mute_asciitilde */ - { 0x100000ab, 19917 }, /* mute_diaeresis */ - { 0x100000a9, 19932 }, /* mute_grave */ - { 0x0000004e, 19943 }, /* N */ - { 0x0000006e, 19945 }, /* n */ - { 0x000008c5, 19947 }, /* nabla */ - { 0x000001d1, 19953 }, /* Nacute */ - { 0x000001f1, 19960 }, /* nacute */ - { 0x010020a6, 19967 }, /* NairaSign */ - { 0x000001d2, 19977 }, /* Ncaron */ - { 0x000001f2, 19984 }, /* ncaron */ - { 0x000003d1, 19991 }, /* Ncedilla */ - { 0x000003f1, 20000 }, /* ncedilla */ - { 0x010020aa, 20009 }, /* NewSheqelSign */ - { 0x0000ff56, 20023 }, /* Next */ - { 0x0000fed2, 20028 }, /* Next_Virtual_Screen */ - { 0x01002089, 20048 }, /* ninesubscript */ - { 0x01002079, 20062 }, /* ninesuperior */ - { 0x000009e8, 20075 }, /* nl */ - { 0x000000a0, 20078 }, /* nobreakspace */ - { 0x00000000, 20091 }, /* NoSymbol */ - { 0x01002247, 20100 }, /* notapproxeq */ - { 0x01002209, 20112 }, /* notelementof */ - { 0x000008bd, 20125 }, /* notequal */ - { 0x01002262, 20134 }, /* notidentical */ - { 0x000000ac, 20147 }, /* notsign */ - { 0x000000d1, 20155 }, /* Ntilde */ - { 0x000000f1, 20162 }, /* ntilde */ - { 0x0000ff7f, 20169 }, /* Num_Lock */ - { 0x00000023, 20178 }, /* numbersign */ - { 0x000006b0, 20189 }, /* numerosign */ - { 0x0000004f, 20200 }, /* O */ - { 0x0000006f, 20202 }, /* o */ - { 0x000000d3, 20204 }, /* Oacute */ - { 0x000000f3, 20211 }, /* oacute */ - { 0x0100019f, 20218 }, /* Obarred */ - { 0x01000275, 20226 }, /* obarred */ - { 0x01001ecc, 20234 }, /* Obelowdot */ - { 0x01001ecd, 20244 }, /* obelowdot */ - { 0x010001d1, 20254 }, /* Ocaron */ - { 0x010001d2, 20261 }, /* ocaron */ - { 0x000000d4, 20268 }, /* Ocircumflex */ - { 0x000000f4, 20280 }, /* ocircumflex */ - { 0x01001ed0, 20292 }, /* Ocircumflexacute */ - { 0x01001ed1, 20309 }, /* ocircumflexacute */ - { 0x01001ed8, 20326 }, /* Ocircumflexbelowdot */ - { 0x01001ed9, 20346 }, /* ocircumflexbelowdot */ - { 0x01001ed2, 20366 }, /* Ocircumflexgrave */ - { 0x01001ed3, 20383 }, /* ocircumflexgrave */ - { 0x01001ed4, 20400 }, /* Ocircumflexhook */ - { 0x01001ed5, 20416 }, /* ocircumflexhook */ - { 0x01001ed6, 20432 }, /* Ocircumflextilde */ - { 0x01001ed7, 20449 }, /* ocircumflextilde */ - { 0x000000d6, 20466 }, /* Odiaeresis */ - { 0x000000f6, 20477 }, /* odiaeresis */ - { 0x000001d5, 20488 }, /* Odoubleacute */ - { 0x000001f5, 20501 }, /* odoubleacute */ - { 0x000013bc, 20514 }, /* OE */ - { 0x000013bd, 20517 }, /* oe */ - { 0x000001b2, 20520 }, /* ogonek */ - { 0x000000d2, 20527 }, /* Ograve */ - { 0x000000f2, 20534 }, /* ograve */ - { 0x01001ece, 20541 }, /* Ohook */ - { 0x01001ecf, 20547 }, /* ohook */ - { 0x010001a0, 20553 }, /* Ohorn */ - { 0x010001a1, 20559 }, /* ohorn */ - { 0x01001eda, 20565 }, /* Ohornacute */ - { 0x01001edb, 20576 }, /* ohornacute */ - { 0x01001ee2, 20587 }, /* Ohornbelowdot */ - { 0x01001ee3, 20601 }, /* ohornbelowdot */ - { 0x01001edc, 20615 }, /* Ohorngrave */ - { 0x01001edd, 20626 }, /* ohorngrave */ - { 0x01001ede, 20637 }, /* Ohornhook */ - { 0x01001edf, 20647 }, /* ohornhook */ - { 0x01001ee0, 20657 }, /* Ohorntilde */ - { 0x01001ee1, 20668 }, /* ohorntilde */ - { 0x000003d2, 20679 }, /* Omacron */ - { 0x000003f2, 20687 }, /* omacron */ - { 0x00000ac3, 20695 }, /* oneeighth */ - { 0x00000ab2, 20705 }, /* onefifth */ - { 0x000000bd, 20714 }, /* onehalf */ - { 0x000000bc, 20722 }, /* onequarter */ - { 0x00000ab6, 20733 }, /* onesixth */ - { 0x01002081, 20742 }, /* onesubscript */ - { 0x000000b9, 20755 }, /* onesuperior */ - { 0x00000ab0, 20767 }, /* onethird */ - { 0x000000d8, 20776 }, /* Ooblique */ - { 0x000000f8, 20785 }, /* ooblique */ - { 0x00000ae2, 20794 }, /* openrectbullet */ - { 0x00000ae5, 20809 }, /* openstar */ - { 0x00000ae4, 20818 }, /* opentribulletdown */ - { 0x00000ae3, 20836 }, /* opentribulletup */ - { 0x000000aa, 20852 }, /* ordfeminine */ - { 0x1004ff44, 20864 }, /* osfActivate */ - { 0x1004ff31, 20876 }, /* osfAddMode */ - { 0x1004ff08, 20887 }, /* osfBackSpace */ - { 0x1004ff07, 20900 }, /* osfBackTab */ - { 0x1004ff5a, 20911 }, /* osfBeginData */ - { 0x1004ff58, 20924 }, /* osfBeginLine */ - { 0x1004ff69, 20937 }, /* osfCancel */ - { 0x1004ff0b, 20947 }, /* osfClear */ - { 0x1004ff02, 20956 }, /* osfCopy */ - { 0x1004ff03, 20964 }, /* osfCut */ - { 0x1004ffff, 20971 }, /* osfDelete */ - { 0x1004ff72, 20981 }, /* osfDeselectAll */ - { 0x1004ff54, 20996 }, /* osfDown */ - { 0x1004ff59, 21004 }, /* osfEndData */ - { 0x1004ff57, 21015 }, /* osfEndLine */ - { 0x1004ff1b, 21026 }, /* osfEscape */ - { 0x1004ff74, 21036 }, /* osfExtend */ - { 0x1004ff6a, 21046 }, /* osfHelp */ - { 0x1004ff63, 21054 }, /* osfInsert */ - { 0x1004ff51, 21064 }, /* osfLeft */ - { 0x1004ff67, 21072 }, /* osfMenu */ - { 0x1004ff45, 21080 }, /* osfMenuBar */ - { 0x1004ff5e, 21091 }, /* osfNextField */ - { 0x1004ff5c, 21104 }, /* osfNextMenu */ - { 0x1004ff42, 21116 }, /* osfPageDown */ - { 0x1004ff40, 21128 }, /* osfPageLeft */ - { 0x1004ff43, 21140 }, /* osfPageRight */ - { 0x1004ff41, 21153 }, /* osfPageUp */ - { 0x1004ff04, 21163 }, /* osfPaste */ - { 0x1004ff5d, 21172 }, /* osfPrevField */ - { 0x1004ff5b, 21185 }, /* osfPrevMenu */ - { 0x1004ff32, 21197 }, /* osfPrimaryPaste */ - { 0x1004ff33, 21213 }, /* osfQuickPaste */ - { 0x1004ff73, 21227 }, /* osfReselect */ - { 0x1004ff78, 21239 }, /* osfRestore */ - { 0x1004ff53, 21250 }, /* osfRight */ - { 0x1004ff60, 21259 }, /* osfSelect */ - { 0x1004ff71, 21269 }, /* osfSelectAll */ - { 0x1004ff65, 21282 }, /* osfUndo */ - { 0x1004ff52, 21290 }, /* osfUp */ - { 0x000000d8, 21296 }, /* Oslash */ - { 0x000000f8, 21303 }, /* oslash */ - { 0x000000d5, 21310 }, /* Otilde */ - { 0x000000f5, 21317 }, /* otilde */ - { 0x00000bc0, 21324 }, /* overbar */ - { 0x0000fe78, 21332 }, /* Overlay1_Enable */ - { 0x0000fe79, 21348 }, /* Overlay2_Enable */ - { 0x0000047e, 21364 }, /* overline */ - { 0x00000050, 21373 }, /* P */ - { 0x00000070, 21375 }, /* p */ - { 0x01001e56, 21377 }, /* Pabovedot */ - { 0x01001e57, 21387 }, /* pabovedot */ - { 0x0000ff56, 21397 }, /* Page_Down */ - { 0x0000ff55, 21407 }, /* Page_Up */ - { 0x000000b6, 21415 }, /* paragraph */ - { 0x00000028, 21425 }, /* parenleft */ - { 0x00000029, 21435 }, /* parenright */ - { 0x01002202, 21446 }, /* partdifferential */ - { 0x000008ef, 21463 }, /* partialderivative */ - { 0x0000ff13, 21481 }, /* Pause */ - { 0x00000025, 21487 }, /* percent */ - { 0x0000002e, 21495 }, /* period */ - { 0x000000b7, 21502 }, /* periodcentered */ - { 0x00000ad5, 21517 }, /* permille */ - { 0x010020a7, 21526 }, /* PesetaSign */ - { 0x00000afb, 21537 }, /* phonographcopyright */ - { 0x0000002b, 21557 }, /* plus */ - { 0x000000b1, 21562 }, /* plusminus */ - { 0x0000fefa, 21572 }, /* Pointer_Accelerate */ - { 0x0000fee9, 21591 }, /* Pointer_Button1 */ - { 0x0000feea, 21607 }, /* Pointer_Button2 */ - { 0x0000feeb, 21623 }, /* Pointer_Button3 */ - { 0x0000feec, 21639 }, /* Pointer_Button4 */ - { 0x0000feed, 21655 }, /* Pointer_Button5 */ - { 0x0000fee8, 21671 }, /* Pointer_Button_Dflt */ - { 0x0000feef, 21691 }, /* Pointer_DblClick1 */ - { 0x0000fef0, 21709 }, /* Pointer_DblClick2 */ - { 0x0000fef1, 21727 }, /* Pointer_DblClick3 */ - { 0x0000fef2, 21745 }, /* Pointer_DblClick4 */ - { 0x0000fef3, 21763 }, /* Pointer_DblClick5 */ - { 0x0000feee, 21781 }, /* Pointer_DblClick_Dflt */ - { 0x0000fefb, 21803 }, /* Pointer_DfltBtnNext */ - { 0x0000fefc, 21823 }, /* Pointer_DfltBtnPrev */ - { 0x0000fee3, 21843 }, /* Pointer_Down */ - { 0x0000fee6, 21856 }, /* Pointer_DownLeft */ - { 0x0000fee7, 21873 }, /* Pointer_DownRight */ - { 0x0000fef5, 21891 }, /* Pointer_Drag1 */ - { 0x0000fef6, 21905 }, /* Pointer_Drag2 */ - { 0x0000fef7, 21919 }, /* Pointer_Drag3 */ - { 0x0000fef8, 21933 }, /* Pointer_Drag4 */ - { 0x0000fefd, 21947 }, /* Pointer_Drag5 */ - { 0x0000fef4, 21961 }, /* Pointer_Drag_Dflt */ - { 0x0000fef9, 21979 }, /* Pointer_EnableKeys */ - { 0x0000fee0, 21998 }, /* Pointer_Left */ - { 0x0000fee1, 22011 }, /* Pointer_Right */ - { 0x0000fee2, 22025 }, /* Pointer_Up */ - { 0x0000fee4, 22036 }, /* Pointer_UpLeft */ - { 0x0000fee5, 22051 }, /* Pointer_UpRight */ - { 0x00000ad4, 22067 }, /* prescription */ - { 0x0000fed1, 22080 }, /* Prev_Virtual_Screen */ - { 0x0000ff3e, 22100 }, /* PreviousCandidate */ - { 0x0000ff61, 22118 }, /* Print */ - { 0x0000ff55, 22124 }, /* Prior */ - { 0x000004b0, 22130 }, /* prolongedsound */ - { 0x00000aa6, 22145 }, /* punctspace */ - { 0x00000051, 22156 }, /* Q */ - { 0x00000071, 22158 }, /* q */ - { 0x00000bcc, 22160 }, /* quad */ - { 0x0000003f, 22165 }, /* question */ - { 0x000000bf, 22174 }, /* questiondown */ - { 0x00000022, 22187 }, /* quotedbl */ - { 0x00000060, 22196 }, /* quoteleft */ - { 0x00000027, 22206 }, /* quoteright */ - { 0x00000052, 22217 }, /* R */ - { 0x00000072, 22219 }, /* r */ - { 0x0000ffd2, 22221 }, /* R1 */ - { 0x0000ffdb, 22224 }, /* R10 */ - { 0x0000ffdc, 22228 }, /* R11 */ - { 0x0000ffdd, 22232 }, /* R12 */ - { 0x0000ffde, 22236 }, /* R13 */ - { 0x0000ffdf, 22240 }, /* R14 */ - { 0x0000ffe0, 22244 }, /* R15 */ - { 0x0000ffd3, 22248 }, /* R2 */ - { 0x0000ffd4, 22251 }, /* R3 */ - { 0x0000ffd5, 22254 }, /* R4 */ - { 0x0000ffd6, 22257 }, /* R5 */ - { 0x0000ffd7, 22260 }, /* R6 */ - { 0x0000ffd8, 22263 }, /* R7 */ - { 0x0000ffd9, 22266 }, /* R8 */ - { 0x0000ffda, 22269 }, /* R9 */ - { 0x000001c0, 22272 }, /* Racute */ - { 0x000001e0, 22279 }, /* racute */ - { 0x000008d6, 22286 }, /* radical */ - { 0x000001d8, 22294 }, /* Rcaron */ - { 0x000001f8, 22301 }, /* rcaron */ - { 0x000003a3, 22308 }, /* Rcedilla */ - { 0x000003b3, 22317 }, /* rcedilla */ - { 0x0000ff66, 22326 }, /* Redo */ - { 0x000000ae, 22331 }, /* registered */ - { 0x0000fe72, 22342 }, /* RepeatKeys_Enable */ - { 0x1000ff6c, 22360 }, /* Reset */ - { 0x0000ff0d, 22366 }, /* Return */ - { 0x0000ff53, 22373 }, /* Right */ - { 0x00000abe, 22379 }, /* rightanglebracket */ - { 0x000008fd, 22397 }, /* rightarrow */ - { 0x00000ba6, 22408 }, /* rightcaret */ - { 0x00000ad3, 22419 }, /* rightdoublequotemark */ - { 0x000008b0, 22440 }, /* rightmiddlecurlybrace */ - { 0x000008b7, 22462 }, /* rightmiddlesummation */ - { 0x00000acd, 22483 }, /* rightopentriangle */ - { 0x00000aeb, 22501 }, /* rightpointer */ - { 0x00000bd8, 22514 }, /* rightshoe */ - { 0x00000ad1, 22524 }, /* rightsinglequotemark */ - { 0x000009f5, 22545 }, /* rightt */ - { 0x00000bfc, 22552 }, /* righttack */ - { 0x0000ff24, 22562 }, /* Romaji */ - { 0x010020a8, 22569 }, /* RupeeSign */ - { 0x00000053, 22579 }, /* S */ - { 0x00000073, 22581 }, /* s */ - { 0x01001e60, 22583 }, /* Sabovedot */ - { 0x01001e61, 22593 }, /* sabovedot */ - { 0x000001a6, 22603 }, /* Sacute */ - { 0x000001b6, 22610 }, /* sacute */ - { 0x000001a9, 22617 }, /* Scaron */ - { 0x000001b9, 22624 }, /* scaron */ - { 0x000001aa, 22631 }, /* Scedilla */ - { 0x000001ba, 22640 }, /* scedilla */ - { 0x0100018f, 22649 }, /* SCHWA */ - { 0x01000259, 22655 }, /* schwa */ - { 0x000002de, 22661 }, /* Scircumflex */ - { 0x000002fe, 22673 }, /* scircumflex */ - { 0x0000ff7e, 22685 }, /* script_switch */ - { 0x0000ff14, 22699 }, /* Scroll_Lock */ - { 0x00000ad7, 22711 }, /* seconds */ - { 0x000000a7, 22719 }, /* section */ - { 0x0000ff60, 22727 }, /* Select */ - { 0x0000003b, 22734 }, /* semicolon */ - { 0x000004df, 22744 }, /* semivoicedsound */ - { 0x000006a1, 22760 }, /* Serbian_dje */ - { 0x000006b1, 22772 }, /* Serbian_DJE */ - { 0x000006af, 22784 }, /* Serbian_dze */ - { 0x000006bf, 22796 }, /* Serbian_DZE */ - { 0x000006a8, 22808 }, /* Serbian_je */ - { 0x000006b8, 22819 }, /* Serbian_JE */ - { 0x000006a9, 22830 }, /* Serbian_lje */ - { 0x000006b9, 22842 }, /* Serbian_LJE */ - { 0x000006aa, 22854 }, /* Serbian_nje */ - { 0x000006ba, 22866 }, /* Serbian_NJE */ - { 0x000006ab, 22878 }, /* Serbian_tshe */ - { 0x000006bb, 22891 }, /* Serbian_TSHE */ - { 0x00000ac6, 22904 }, /* seveneighths */ - { 0x01002087, 22917 }, /* sevensubscript */ - { 0x01002077, 22932 }, /* sevensuperior */ - { 0x0000ffe1, 22946 }, /* Shift_L */ - { 0x0000ffe6, 22954 }, /* Shift_Lock */ - { 0x0000ffe2, 22965 }, /* Shift_R */ - { 0x00000aca, 22973 }, /* signaturemark */ - { 0x00000aac, 22987 }, /* signifblank */ - { 0x000008c9, 22999 }, /* similarequal */ - { 0x0000ff3c, 23012 }, /* SingleCandidate */ - { 0x00000afd, 23028 }, /* singlelowquotemark */ - { 0x01000d85, 23047 }, /* Sinh_a */ - { 0x01000d86, 23054 }, /* Sinh_aa */ - { 0x01000dcf, 23062 }, /* Sinh_aa2 */ - { 0x01000d87, 23071 }, /* Sinh_ae */ - { 0x01000dd0, 23079 }, /* Sinh_ae2 */ - { 0x01000d88, 23088 }, /* Sinh_aee */ - { 0x01000dd1, 23097 }, /* Sinh_aee2 */ - { 0x01000d93, 23107 }, /* Sinh_ai */ - { 0x01000ddb, 23115 }, /* Sinh_ai2 */ - { 0x01000dca, 23124 }, /* Sinh_al */ - { 0x01000d96, 23132 }, /* Sinh_au */ - { 0x01000dde, 23140 }, /* Sinh_au2 */ - { 0x01000db6, 23149 }, /* Sinh_ba */ - { 0x01000db7, 23157 }, /* Sinh_bha */ - { 0x01000da0, 23166 }, /* Sinh_ca */ - { 0x01000da1, 23174 }, /* Sinh_cha */ - { 0x01000da9, 23183 }, /* Sinh_dda */ - { 0x01000daa, 23192 }, /* Sinh_ddha */ - { 0x01000daf, 23202 }, /* Sinh_dha */ - { 0x01000db0, 23211 }, /* Sinh_dhha */ - { 0x01000d91, 23221 }, /* Sinh_e */ - { 0x01000dd9, 23228 }, /* Sinh_e2 */ - { 0x01000d92, 23236 }, /* Sinh_ee */ - { 0x01000dda, 23244 }, /* Sinh_ee2 */ - { 0x01000dc6, 23253 }, /* Sinh_fa */ - { 0x01000d9c, 23261 }, /* Sinh_ga */ - { 0x01000d9d, 23269 }, /* Sinh_gha */ - { 0x01000d83, 23278 }, /* Sinh_h2 */ - { 0x01000dc4, 23286 }, /* Sinh_ha */ - { 0x01000d89, 23294 }, /* Sinh_i */ - { 0x01000dd2, 23301 }, /* Sinh_i2 */ - { 0x01000d8a, 23309 }, /* Sinh_ii */ - { 0x01000dd3, 23317 }, /* Sinh_ii2 */ - { 0x01000da2, 23326 }, /* Sinh_ja */ - { 0x01000da3, 23334 }, /* Sinh_jha */ - { 0x01000da5, 23343 }, /* Sinh_jnya */ - { 0x01000d9a, 23353 }, /* Sinh_ka */ - { 0x01000d9b, 23361 }, /* Sinh_kha */ - { 0x01000df4, 23370 }, /* Sinh_kunddaliya */ - { 0x01000dbd, 23386 }, /* Sinh_la */ - { 0x01000dc5, 23394 }, /* Sinh_lla */ - { 0x01000d8f, 23403 }, /* Sinh_lu */ - { 0x01000ddf, 23411 }, /* Sinh_lu2 */ - { 0x01000d90, 23420 }, /* Sinh_luu */ - { 0x01000df3, 23429 }, /* Sinh_luu2 */ - { 0x01000db8, 23439 }, /* Sinh_ma */ - { 0x01000db9, 23447 }, /* Sinh_mba */ - { 0x01000db1, 23456 }, /* Sinh_na */ - { 0x01000dac, 23464 }, /* Sinh_ndda */ - { 0x01000db3, 23474 }, /* Sinh_ndha */ - { 0x01000d82, 23484 }, /* Sinh_ng */ - { 0x01000d9e, 23492 }, /* Sinh_ng2 */ - { 0x01000d9f, 23501 }, /* Sinh_nga */ - { 0x01000da6, 23510 }, /* Sinh_nja */ - { 0x01000dab, 23519 }, /* Sinh_nna */ - { 0x01000da4, 23528 }, /* Sinh_nya */ - { 0x01000d94, 23537 }, /* Sinh_o */ - { 0x01000ddc, 23544 }, /* Sinh_o2 */ - { 0x01000d95, 23552 }, /* Sinh_oo */ - { 0x01000ddd, 23560 }, /* Sinh_oo2 */ - { 0x01000db4, 23569 }, /* Sinh_pa */ - { 0x01000db5, 23577 }, /* Sinh_pha */ - { 0x01000dbb, 23586 }, /* Sinh_ra */ - { 0x01000d8d, 23594 }, /* Sinh_ri */ - { 0x01000d8e, 23602 }, /* Sinh_rii */ - { 0x01000dd8, 23611 }, /* Sinh_ru2 */ - { 0x01000df2, 23620 }, /* Sinh_ruu2 */ - { 0x01000dc3, 23630 }, /* Sinh_sa */ - { 0x01000dc1, 23638 }, /* Sinh_sha */ - { 0x01000dc2, 23647 }, /* Sinh_ssha */ - { 0x01000dad, 23657 }, /* Sinh_tha */ - { 0x01000dae, 23666 }, /* Sinh_thha */ - { 0x01000da7, 23676 }, /* Sinh_tta */ - { 0x01000da8, 23685 }, /* Sinh_ttha */ - { 0x01000d8b, 23695 }, /* Sinh_u */ - { 0x01000dd4, 23702 }, /* Sinh_u2 */ - { 0x01000d8c, 23710 }, /* Sinh_uu */ - { 0x01000dd6, 23718 }, /* Sinh_uu2 */ - { 0x01000dc0, 23727 }, /* Sinh_va */ - { 0x01000dba, 23735 }, /* Sinh_ya */ - { 0x01002086, 23743 }, /* sixsubscript */ - { 0x01002076, 23756 }, /* sixsuperior */ - { 0x0000002f, 23768 }, /* slash */ - { 0x0000fe73, 23774 }, /* SlowKeys_Enable */ - { 0x000009e0, 23790 }, /* soliddiamond */ - { 0x00000020, 23803 }, /* space */ - { 0x0100221a, 23809 }, /* squareroot */ - { 0x000000df, 23820 }, /* ssharp */ - { 0x000000a3, 23827 }, /* sterling */ - { 0x0000fe75, 23836 }, /* StickyKeys_Enable */ - { 0x01002263, 23854 }, /* stricteq */ - { 0x0000ff66, 23863 }, /* SunAgain */ - { 0x0000ff7e, 23872 }, /* SunAltGraph */ - { 0x1005ff77, 23884 }, /* SunAudioLowerVolume */ - { 0x1005ff78, 23904 }, /* SunAudioMute */ - { 0x1005ff79, 23917 }, /* SunAudioRaiseVolume */ - { 0x0000ff20, 23937 }, /* SunCompose */ - { 0x1005ff72, 23948 }, /* SunCopy */ - { 0x1005ff75, 23956 }, /* SunCut */ - { 0x1005ff10, 23963 }, /* SunF36 */ - { 0x1005ff11, 23970 }, /* SunF37 */ - { 0x1005ff03, 23977 }, /* SunFA_Acute */ - { 0x1005ff05, 23989 }, /* SunFA_Cedilla */ - { 0x1005ff01, 24003 }, /* SunFA_Circum */ - { 0x1005ff04, 24016 }, /* SunFA_Diaeresis */ - { 0x1005ff00, 24032 }, /* SunFA_Grave */ - { 0x1005ff02, 24044 }, /* SunFA_Tilde */ - { 0x0000ff68, 24056 }, /* SunFind */ - { 0x1005ff71, 24064 }, /* SunFront */ - { 0x1005ff73, 24073 }, /* SunOpen */ - { 0x0000ff56, 24081 }, /* SunPageDown */ - { 0x0000ff55, 24093 }, /* SunPageUp */ - { 0x1005ff74, 24103 }, /* SunPaste */ - { 0x1005ff76, 24112 }, /* SunPowerSwitch */ - { 0x1005ff7d, 24127 }, /* SunPowerSwitchShift */ - { 0x0000ff61, 24147 }, /* SunPrint_Screen */ - { 0x1005ff70, 24163 }, /* SunProps */ - { 0x0000ff69, 24172 }, /* SunStop */ - { 0x1005ff60, 24180 }, /* SunSys_Req */ - { 0x0000ff65, 24191 }, /* SunUndo */ - { 0x1005ff7a, 24199 }, /* SunVideoDegauss */ - { 0x1005ff7b, 24215 }, /* SunVideoLowerBrightness */ - { 0x1005ff7c, 24239 }, /* SunVideoRaiseBrightness */ - { 0x0000ffeb, 24263 }, /* Super_L */ - { 0x0000ffec, 24271 }, /* Super_R */ - { 0x0000ff15, 24279 }, /* Sys_Req */ - { 0x1000ff6d, 24287 }, /* System */ - { 0x00000054, 24294 }, /* T */ - { 0x00000074, 24296 }, /* t */ - { 0x0000ff09, 24298 }, /* Tab */ - { 0x01001e6a, 24302 }, /* Tabovedot */ - { 0x01001e6b, 24312 }, /* tabovedot */ - { 0x000001ab, 24322 }, /* Tcaron */ - { 0x000001bb, 24329 }, /* tcaron */ - { 0x000001de, 24336 }, /* Tcedilla */ - { 0x000001fe, 24345 }, /* tcedilla */ - { 0x00000af9, 24354 }, /* telephone */ - { 0x00000afa, 24364 }, /* telephonerecorder */ - { 0x0000fed5, 24382 }, /* Terminate_Server */ - { 0x00000ddf, 24399 }, /* Thai_baht */ - { 0x00000dba, 24409 }, /* Thai_bobaimai */ - { 0x00000da8, 24423 }, /* Thai_chochan */ - { 0x00000daa, 24436 }, /* Thai_chochang */ - { 0x00000da9, 24450 }, /* Thai_choching */ - { 0x00000dac, 24464 }, /* Thai_chochoe */ - { 0x00000dae, 24477 }, /* Thai_dochada */ - { 0x00000db4, 24490 }, /* Thai_dodek */ - { 0x00000dbd, 24501 }, /* Thai_fofa */ - { 0x00000dbf, 24511 }, /* Thai_fofan */ - { 0x00000dcb, 24522 }, /* Thai_hohip */ - { 0x00000dce, 24533 }, /* Thai_honokhuk */ - { 0x00000da2, 24547 }, /* Thai_khokhai */ - { 0x00000da5, 24560 }, /* Thai_khokhon */ - { 0x00000da3, 24573 }, /* Thai_khokhuat */ - { 0x00000da4, 24587 }, /* Thai_khokhwai */ - { 0x00000da6, 24601 }, /* Thai_khorakhang */ - { 0x00000da1, 24617 }, /* Thai_kokai */ - { 0x00000de5, 24628 }, /* Thai_lakkhangyao */ - { 0x00000df7, 24645 }, /* Thai_lekchet */ - { 0x00000df5, 24658 }, /* Thai_lekha */ - { 0x00000df6, 24669 }, /* Thai_lekhok */ - { 0x00000df9, 24681 }, /* Thai_lekkao */ - { 0x00000df1, 24693 }, /* Thai_leknung */ - { 0x00000df8, 24706 }, /* Thai_lekpaet */ - { 0x00000df3, 24719 }, /* Thai_leksam */ - { 0x00000df4, 24731 }, /* Thai_leksi */ - { 0x00000df2, 24742 }, /* Thai_leksong */ - { 0x00000df0, 24755 }, /* Thai_leksun */ - { 0x00000dcc, 24767 }, /* Thai_lochula */ - { 0x00000dc5, 24780 }, /* Thai_loling */ - { 0x00000dc6, 24792 }, /* Thai_lu */ - { 0x00000deb, 24800 }, /* Thai_maichattawa */ - { 0x00000de8, 24817 }, /* Thai_maiek */ - { 0x00000dd1, 24828 }, /* Thai_maihanakat */ - { 0x00000dde, 24844 }, /* Thai_maihanakat_maitho */ - { 0x00000de7, 24867 }, /* Thai_maitaikhu */ - { 0x00000de9, 24882 }, /* Thai_maitho */ - { 0x00000dea, 24894 }, /* Thai_maitri */ - { 0x00000de6, 24906 }, /* Thai_maiyamok */ - { 0x00000dc1, 24920 }, /* Thai_moma */ - { 0x00000da7, 24930 }, /* Thai_ngongu */ - { 0x00000ded, 24942 }, /* Thai_nikhahit */ - { 0x00000db3, 24956 }, /* Thai_nonen */ - { 0x00000db9, 24967 }, /* Thai_nonu */ - { 0x00000dcd, 24977 }, /* Thai_oang */ - { 0x00000dcf, 24987 }, /* Thai_paiyannoi */ - { 0x00000dda, 25002 }, /* Thai_phinthu */ - { 0x00000dbe, 25015 }, /* Thai_phophan */ - { 0x00000dbc, 25028 }, /* Thai_phophung */ - { 0x00000dc0, 25042 }, /* Thai_phosamphao */ - { 0x00000dbb, 25058 }, /* Thai_popla */ - { 0x00000dc3, 25069 }, /* Thai_rorua */ - { 0x00000dc4, 25080 }, /* Thai_ru */ - { 0x00000dd0, 25088 }, /* Thai_saraa */ - { 0x00000dd2, 25099 }, /* Thai_saraaa */ - { 0x00000de1, 25111 }, /* Thai_saraae */ - { 0x00000de4, 25123 }, /* Thai_saraaimaimalai */ - { 0x00000de3, 25143 }, /* Thai_saraaimaimuan */ - { 0x00000dd3, 25162 }, /* Thai_saraam */ - { 0x00000de0, 25174 }, /* Thai_sarae */ - { 0x00000dd4, 25185 }, /* Thai_sarai */ - { 0x00000dd5, 25196 }, /* Thai_saraii */ - { 0x00000de2, 25208 }, /* Thai_sarao */ - { 0x00000dd8, 25219 }, /* Thai_sarau */ - { 0x00000dd6, 25230 }, /* Thai_saraue */ - { 0x00000dd7, 25242 }, /* Thai_sarauee */ - { 0x00000dd9, 25255 }, /* Thai_sarauu */ - { 0x00000dc9, 25267 }, /* Thai_sorusi */ - { 0x00000dc8, 25279 }, /* Thai_sosala */ - { 0x00000dab, 25291 }, /* Thai_soso */ - { 0x00000dca, 25301 }, /* Thai_sosua */ - { 0x00000dec, 25312 }, /* Thai_thanthakhat */ - { 0x00000db1, 25329 }, /* Thai_thonangmontho */ - { 0x00000db2, 25348 }, /* Thai_thophuthao */ - { 0x00000db7, 25364 }, /* Thai_thothahan */ - { 0x00000db0, 25379 }, /* Thai_thothan */ - { 0x00000db8, 25392 }, /* Thai_thothong */ - { 0x00000db6, 25406 }, /* Thai_thothung */ - { 0x00000daf, 25420 }, /* Thai_topatak */ - { 0x00000db5, 25433 }, /* Thai_totao */ - { 0x00000dc7, 25444 }, /* Thai_wowaen */ - { 0x00000dc2, 25456 }, /* Thai_yoyak */ - { 0x00000dad, 25467 }, /* Thai_yoying */ - { 0x000008c0, 25479 }, /* therefore */ - { 0x00000aa7, 25489 }, /* thinspace */ - { 0x000000de, 25499 }, /* THORN */ - { 0x000000de, 25505 }, /* Thorn */ - { 0x000000fe, 25511 }, /* thorn */ - { 0x00000ac4, 25517 }, /* threeeighths */ - { 0x00000ab4, 25530 }, /* threefifths */ - { 0x000000be, 25542 }, /* threequarters */ - { 0x01002083, 25556 }, /* threesubscript */ - { 0x000000b3, 25571 }, /* threesuperior */ - { 0x0100222d, 25585 }, /* tintegral */ - { 0x000008a4, 25595 }, /* topintegral */ - { 0x000008ab, 25607 }, /* topleftparens */ - { 0x000008a2, 25621 }, /* topleftradical */ - { 0x000008a7, 25636 }, /* topleftsqbracket */ - { 0x000008b1, 25653 }, /* topleftsummation */ - { 0x000008ad, 25670 }, /* toprightparens */ - { 0x000008a9, 25685 }, /* toprightsqbracket */ - { 0x000008b5, 25703 }, /* toprightsummation */ - { 0x000009f7, 25721 }, /* topt */ - { 0x000008b3, 25726 }, /* topvertsummationconnector */ - { 0x0000ff2b, 25752 }, /* Touroku */ - { 0x00000ac9, 25760 }, /* trademark */ - { 0x00000acb, 25770 }, /* trademarkincircle */ - { 0x000003ac, 25788 }, /* Tslash */ - { 0x000003bc, 25795 }, /* tslash */ - { 0x00000ab3, 25802 }, /* twofifths */ - { 0x01002082, 25812 }, /* twosubscript */ - { 0x000000b2, 25825 }, /* twosuperior */ - { 0x00000ab1, 25837 }, /* twothirds */ - { 0x00000055, 25847 }, /* U */ - { 0x00000075, 25849 }, /* u */ - { 0x000000da, 25851 }, /* Uacute */ - { 0x000000fa, 25858 }, /* uacute */ - { 0x01001ee4, 25865 }, /* Ubelowdot */ - { 0x01001ee5, 25875 }, /* ubelowdot */ - { 0x000002dd, 25885 }, /* Ubreve */ - { 0x000002fd, 25892 }, /* ubreve */ - { 0x000000db, 25899 }, /* Ucircumflex */ - { 0x000000fb, 25911 }, /* ucircumflex */ - { 0x000000dc, 25923 }, /* Udiaeresis */ - { 0x000000fc, 25934 }, /* udiaeresis */ - { 0x000001db, 25945 }, /* Udoubleacute */ - { 0x000001fb, 25958 }, /* udoubleacute */ - { 0x000000d9, 25971 }, /* Ugrave */ - { 0x000000f9, 25978 }, /* ugrave */ - { 0x01001ee6, 25985 }, /* Uhook */ - { 0x01001ee7, 25991 }, /* uhook */ - { 0x010001af, 25997 }, /* Uhorn */ - { 0x010001b0, 26003 }, /* uhorn */ - { 0x01001ee8, 26009 }, /* Uhornacute */ - { 0x01001ee9, 26020 }, /* uhornacute */ - { 0x01001ef0, 26031 }, /* Uhornbelowdot */ - { 0x01001ef1, 26045 }, /* uhornbelowdot */ - { 0x01001eea, 26059 }, /* Uhorngrave */ - { 0x01001eeb, 26070 }, /* uhorngrave */ - { 0x01001eec, 26081 }, /* Uhornhook */ - { 0x01001eed, 26091 }, /* uhornhook */ - { 0x01001eee, 26101 }, /* Uhorntilde */ - { 0x01001eef, 26112 }, /* uhorntilde */ - { 0x000006ad, 26123 }, /* Ukrainian_ghe_with_upturn */ - { 0x000006bd, 26149 }, /* Ukrainian_GHE_WITH_UPTURN */ - { 0x000006a6, 26175 }, /* Ukrainian_i */ - { 0x000006b6, 26187 }, /* Ukrainian_I */ - { 0x000006a4, 26199 }, /* Ukrainian_ie */ - { 0x000006b4, 26212 }, /* Ukrainian_IE */ - { 0x000006a7, 26225 }, /* Ukrainian_yi */ - { 0x000006b7, 26238 }, /* Ukrainian_YI */ - { 0x000006a6, 26251 }, /* Ukranian_i */ - { 0x000006b6, 26262 }, /* Ukranian_I */ - { 0x000006a4, 26273 }, /* Ukranian_je */ - { 0x000006b4, 26285 }, /* Ukranian_JE */ - { 0x000006a7, 26297 }, /* Ukranian_yi */ - { 0x000006b7, 26309 }, /* Ukranian_YI */ - { 0x000003de, 26321 }, /* Umacron */ - { 0x000003fe, 26329 }, /* umacron */ - { 0x00000bc6, 26337 }, /* underbar */ - { 0x0000005f, 26346 }, /* underscore */ - { 0x0000ff65, 26357 }, /* Undo */ - { 0x000008dd, 26362 }, /* union */ - { 0x000003d9, 26368 }, /* Uogonek */ - { 0x000003f9, 26376 }, /* uogonek */ - { 0x0000ff52, 26384 }, /* Up */ - { 0x000008fc, 26387 }, /* uparrow */ - { 0x00000ba9, 26395 }, /* upcaret */ - { 0x000009ec, 26403 }, /* upleftcorner */ - { 0x000009eb, 26416 }, /* uprightcorner */ - { 0x00000bc3, 26430 }, /* upshoe */ - { 0x00000bd3, 26437 }, /* upstile */ - { 0x00000bce, 26445 }, /* uptack */ - { 0x000001d9, 26452 }, /* Uring */ - { 0x000001f9, 26458 }, /* uring */ - { 0x1000ff6e, 26464 }, /* User */ - { 0x000003dd, 26469 }, /* Utilde */ - { 0x000003fd, 26476 }, /* utilde */ - { 0x00000056, 26483 }, /* V */ - { 0x00000076, 26485 }, /* v */ - { 0x000008c1, 26487 }, /* variation */ - { 0x000009f8, 26497 }, /* vertbar */ - { 0x000008a6, 26505 }, /* vertconnector */ - { 0x000004de, 26519 }, /* voicedsound */ - { 0x00ffffff, 26531 }, /* VoidSymbol */ - { 0x000009e9, 26542 }, /* vt */ - { 0x00000057, 26545 }, /* W */ - { 0x00000077, 26547 }, /* w */ - { 0x01001e82, 26549 }, /* Wacute */ - { 0x01001e83, 26556 }, /* wacute */ - { 0x01000174, 26563 }, /* Wcircumflex */ - { 0x01000175, 26575 }, /* wcircumflex */ - { 0x01001e84, 26587 }, /* Wdiaeresis */ - { 0x01001e85, 26598 }, /* wdiaeresis */ - { 0x01001e80, 26609 }, /* Wgrave */ - { 0x01001e81, 26616 }, /* wgrave */ - { 0x010020a9, 26623 }, /* WonSign */ - { 0x00000058, 26631 }, /* X */ - { 0x00000078, 26633 }, /* x */ - { 0x01001e8a, 26635 }, /* Xabovedot */ - { 0x01001e8b, 26645 }, /* xabovedot */ - { 0x1008ff39, 26655 }, /* XF86AddFavorite */ - { 0x1008ff50, 26671 }, /* XF86ApplicationLeft */ - { 0x1008ff51, 26691 }, /* XF86ApplicationRight */ - { 0x1008ff9b, 26712 }, /* XF86AudioCycleTrack */ - { 0x1008ff97, 26732 }, /* XF86AudioForward */ - { 0x1008ff11, 26749 }, /* XF86AudioLowerVolume */ - { 0x1008ff32, 26770 }, /* XF86AudioMedia */ - { 0x1008ffb2, 26785 }, /* XF86AudioMicMute */ - { 0x1008ff12, 26802 }, /* XF86AudioMute */ - { 0x1008ff17, 26816 }, /* XF86AudioNext */ - { 0x1008ff31, 26830 }, /* XF86AudioPause */ - { 0x1008ff14, 26845 }, /* XF86AudioPlay */ - { 0x1008ffb6, 26859 }, /* XF86AudioPreset */ - { 0x1008ff16, 26875 }, /* XF86AudioPrev */ - { 0x1008ff13, 26889 }, /* XF86AudioRaiseVolume */ - { 0x1008ff99, 26910 }, /* XF86AudioRandomPlay */ - { 0x1008ff1c, 26930 }, /* XF86AudioRecord */ - { 0x1008ff98, 26946 }, /* XF86AudioRepeat */ - { 0x1008ff3e, 26962 }, /* XF86AudioRewind */ - { 0x1008ff15, 26978 }, /* XF86AudioStop */ - { 0x1008ff8d, 26992 }, /* XF86Away */ - { 0x1008ff26, 27001 }, /* XF86Back */ - { 0x1008ff3f, 27010 }, /* XF86BackForward */ - { 0x1008ff93, 27026 }, /* XF86Battery */ - { 0x1008ffa6, 27038 }, /* XF86Blue */ - { 0x1008ff94, 27047 }, /* XF86Bluetooth */ - { 0x1008ff52, 27061 }, /* XF86Book */ - { 0x1008ff3b, 27070 }, /* XF86BrightnessAdjust */ - { 0x1008ff54, 27091 }, /* XF86Calculater */ - { 0x1008ff1d, 27106 }, /* XF86Calculator */ - { 0x1008ff20, 27121 }, /* XF86Calendar */ - { 0x1008ff53, 27134 }, /* XF86CD */ - { 0x1008ff55, 27141 }, /* XF86Clear */ - { 0x1008fe21, 27151 }, /* XF86ClearGrab */ - { 0x1008ff56, 27165 }, /* XF86Close */ - { 0x1008ff3d, 27175 }, /* XF86Community */ - { 0x1008ff22, 27189 }, /* XF86ContrastAdjust */ - { 0x1008ff57, 27208 }, /* XF86Copy */ - { 0x1008ff58, 27217 }, /* XF86Cut */ - { 0x1008ff9c, 27225 }, /* XF86CycleAngle */ - { 0x1008ff59, 27240 }, /* XF86Display */ - { 0x1008ff5b, 27252 }, /* XF86Documents */ - { 0x1008ff5a, 27266 }, /* XF86DOS */ - { 0x1008ff2c, 27274 }, /* XF86Eject */ - { 0x1008ff5c, 27284 }, /* XF86Excel */ - { 0x1008ff5d, 27294 }, /* XF86Explorer */ - { 0x1008ff30, 27307 }, /* XF86Favorites */ - { 0x1008ff3c, 27321 }, /* XF86Finance */ - { 0x1008ff27, 27333 }, /* XF86Forward */ - { 0x1008ff9d, 27345 }, /* XF86FrameBack */ - { 0x1008ff9e, 27359 }, /* XF86FrameForward */ - { 0x1008ff5e, 27376 }, /* XF86Game */ - { 0x1008ff5f, 27385 }, /* XF86Go */ - { 0x1008ffa4, 27392 }, /* XF86Green */ - { 0x1008ffa8, 27402 }, /* XF86Hibernate */ - { 0x1008ff37, 27416 }, /* XF86History */ - { 0x1008ff18, 27428 }, /* XF86HomePage */ - { 0x1008ff3a, 27441 }, /* XF86HotLinks */ - { 0x1008ff60, 27454 }, /* XF86iTouch */ - { 0x1008ff06, 27465 }, /* XF86KbdBrightnessDown */ - { 0x1008ff05, 27487 }, /* XF86KbdBrightnessUp */ - { 0x1008ff04, 27507 }, /* XF86KbdLightOnOff */ - { 0x1008ffb3, 27525 }, /* XF86Keyboard */ - { 0x1008ff40, 27538 }, /* XF86Launch0 */ - { 0x1008ff41, 27550 }, /* XF86Launch1 */ - { 0x1008ff42, 27562 }, /* XF86Launch2 */ - { 0x1008ff43, 27574 }, /* XF86Launch3 */ - { 0x1008ff44, 27586 }, /* XF86Launch4 */ - { 0x1008ff45, 27598 }, /* XF86Launch5 */ - { 0x1008ff46, 27610 }, /* XF86Launch6 */ - { 0x1008ff47, 27622 }, /* XF86Launch7 */ - { 0x1008ff48, 27634 }, /* XF86Launch8 */ - { 0x1008ff49, 27646 }, /* XF86Launch9 */ - { 0x1008ff4a, 27658 }, /* XF86LaunchA */ - { 0x1008ff4b, 27670 }, /* XF86LaunchB */ - { 0x1008ff4c, 27682 }, /* XF86LaunchC */ - { 0x1008ff4d, 27694 }, /* XF86LaunchD */ - { 0x1008ff4e, 27706 }, /* XF86LaunchE */ - { 0x1008ff4f, 27718 }, /* XF86LaunchF */ - { 0x1008ff35, 27730 }, /* XF86LightBulb */ - { 0x1008fe25, 27744 }, /* XF86LogGrabInfo */ - { 0x1008ff61, 27760 }, /* XF86LogOff */ - { 0x1008fe24, 27771 }, /* XF86LogWindowTree */ - { 0x1008ff19, 27789 }, /* XF86Mail */ - { 0x1008ff90, 27798 }, /* XF86MailForward */ - { 0x1008ff62, 27814 }, /* XF86Market */ - { 0x1008ff63, 27825 }, /* XF86Meeting */ - { 0x1008ff1e, 27837 }, /* XF86Memo */ - { 0x1008ff65, 27846 }, /* XF86MenuKB */ - { 0x1008ff66, 27857 }, /* XF86MenuPB */ - { 0x1008ff8e, 27868 }, /* XF86Messenger */ - { 0x1008ff01, 27882 }, /* XF86ModeLock */ - { 0x1008ff03, 27895 }, /* XF86MonBrightnessDown */ - { 0x1008ff02, 27917 }, /* XF86MonBrightnessUp */ - { 0x1008ff92, 27937 }, /* XF86Music */ - { 0x1008ff33, 27947 }, /* XF86MyComputer */ - { 0x1008ff67, 27962 }, /* XF86MySites */ - { 0x1008ff68, 27974 }, /* XF86New */ - { 0x1008ff69, 27982 }, /* XF86News */ - { 0x1008fe22, 27991 }, /* XF86Next_VMode */ - { 0x1008ff6a, 28006 }, /* XF86OfficeHome */ - { 0x1008ff6b, 28021 }, /* XF86Open */ - { 0x1008ff38, 28030 }, /* XF86OpenURL */ - { 0x1008ff6c, 28042 }, /* XF86Option */ - { 0x1008ff6d, 28053 }, /* XF86Paste */ - { 0x1008ff6e, 28063 }, /* XF86Phone */ - { 0x1008ff91, 28073 }, /* XF86Pictures */ - { 0x1008ff21, 28086 }, /* XF86PowerDown */ - { 0x1008ff2a, 28100 }, /* XF86PowerOff */ - { 0x1008fe23, 28113 }, /* XF86Prev_VMode */ - { 0x1008ff70, 28128 }, /* XF86Q */ - { 0x1008ffa3, 28134 }, /* XF86Red */ - { 0x1008ff29, 28142 }, /* XF86Refresh */ - { 0x1008ff73, 28154 }, /* XF86Reload */ - { 0x1008ff72, 28165 }, /* XF86Reply */ - { 0x1008ffb5, 28175 }, /* XF86RFKill */ - { 0x1008ff24, 28186 }, /* XF86RockerDown */ - { 0x1008ff25, 28201 }, /* XF86RockerEnter */ - { 0x1008ff23, 28217 }, /* XF86RockerUp */ - { 0x1008ff74, 28230 }, /* XF86RotateWindows */ - { 0x1008ff76, 28248 }, /* XF86RotationKB */ - { 0x1008ff75, 28263 }, /* XF86RotationPB */ - { 0x1008ff77, 28278 }, /* XF86Save */ - { 0x1008ff2d, 28287 }, /* XF86ScreenSaver */ - { 0x1008ff7a, 28303 }, /* XF86ScrollClick */ - { 0x1008ff79, 28319 }, /* XF86ScrollDown */ - { 0x1008ff78, 28334 }, /* XF86ScrollUp */ - { 0x1008ff1b, 28347 }, /* XF86Search */ - { 0x1008ffa0, 28358 }, /* XF86Select */ - { 0x1008ff7b, 28369 }, /* XF86Send */ - { 0x1008ff36, 28378 }, /* XF86Shop */ - { 0x1008ff2f, 28387 }, /* XF86Sleep */ - { 0x1008ff7c, 28397 }, /* XF86Spell */ - { 0x1008ff7d, 28407 }, /* XF86SplitScreen */ - { 0x1008ff10, 28423 }, /* XF86Standby */ - { 0x1008ff1a, 28435 }, /* XF86Start */ - { 0x1008ff28, 28445 }, /* XF86Stop */ - { 0x1008ff9a, 28454 }, /* XF86Subtitle */ - { 0x1008ff7e, 28467 }, /* XF86Support */ - { 0x1008ffa7, 28479 }, /* XF86Suspend */ - { 0x1008fe01, 28491 }, /* XF86Switch_VT_1 */ - { 0x1008fe0a, 28507 }, /* XF86Switch_VT_10 */ - { 0x1008fe0b, 28524 }, /* XF86Switch_VT_11 */ - { 0x1008fe0c, 28541 }, /* XF86Switch_VT_12 */ - { 0x1008fe02, 28558 }, /* XF86Switch_VT_2 */ - { 0x1008fe03, 28574 }, /* XF86Switch_VT_3 */ - { 0x1008fe04, 28590 }, /* XF86Switch_VT_4 */ - { 0x1008fe05, 28606 }, /* XF86Switch_VT_5 */ - { 0x1008fe06, 28622 }, /* XF86Switch_VT_6 */ - { 0x1008fe07, 28638 }, /* XF86Switch_VT_7 */ - { 0x1008fe08, 28654 }, /* XF86Switch_VT_8 */ - { 0x1008fe09, 28670 }, /* XF86Switch_VT_9 */ - { 0x1008ff7f, 28686 }, /* XF86TaskPane */ - { 0x1008ff80, 28699 }, /* XF86Terminal */ - { 0x1008ff9f, 28712 }, /* XF86Time */ - { 0x1008ff1f, 28721 }, /* XF86ToDoList */ - { 0x1008ff81, 28734 }, /* XF86Tools */ - { 0x1008ffa2, 28744 }, /* XF86TopMenu */ - { 0x1008ffb1, 28756 }, /* XF86TouchpadOff */ - { 0x1008ffb0, 28772 }, /* XF86TouchpadOn */ - { 0x1008ffa9, 28787 }, /* XF86TouchpadToggle */ - { 0x1008ff82, 28806 }, /* XF86Travel */ - { 0x1008fe20, 28817 }, /* XF86Ungrab */ - { 0x1008ff85, 28828 }, /* XF86User1KB */ - { 0x1008ff86, 28840 }, /* XF86User2KB */ - { 0x1008ff84, 28852 }, /* XF86UserPB */ - { 0x1008ff96, 28863 }, /* XF86UWB */ - { 0x1008ff34, 28871 }, /* XF86VendorHome */ - { 0x1008ff87, 28886 }, /* XF86Video */ - { 0x1008ffa1, 28896 }, /* XF86View */ - { 0x1008ff2b, 28905 }, /* XF86WakeUp */ - { 0x1008ff8f, 28916 }, /* XF86WebCam */ - { 0x1008ff88, 28927 }, /* XF86WheelButton */ - { 0x1008ff95, 28943 }, /* XF86WLAN */ - { 0x1008ff89, 28952 }, /* XF86Word */ - { 0x1008ffb4, 28961 }, /* XF86WWAN */ - { 0x1008ff2e, 28970 }, /* XF86WWW */ - { 0x1008ff8a, 28978 }, /* XF86Xfer */ - { 0x1008ffa5, 28987 }, /* XF86Yellow */ - { 0x1008ff8b, 28998 }, /* XF86ZoomIn */ - { 0x1008ff8c, 29009 }, /* XF86ZoomOut */ - { 0x00000059, 29021 }, /* Y */ - { 0x00000079, 29023 }, /* y */ - { 0x000000dd, 29025 }, /* Yacute */ - { 0x000000fd, 29032 }, /* yacute */ - { 0x01001ef4, 29039 }, /* Ybelowdot */ - { 0x01001ef5, 29049 }, /* ybelowdot */ - { 0x01000176, 29059 }, /* Ycircumflex */ - { 0x01000177, 29071 }, /* ycircumflex */ - { 0x000000ff, 29083 }, /* ydiaeresis */ - { 0x000013be, 29094 }, /* Ydiaeresis */ - { 0x000000a5, 29105 }, /* yen */ - { 0x01001ef2, 29109 }, /* Ygrave */ - { 0x01001ef3, 29116 }, /* ygrave */ - { 0x01001ef6, 29123 }, /* Yhook */ - { 0x01001ef7, 29129 }, /* yhook */ - { 0x01001ef8, 29135 }, /* Ytilde */ - { 0x01001ef9, 29142 }, /* ytilde */ - { 0x0000005a, 29149 }, /* Z */ - { 0x0000007a, 29151 }, /* z */ - { 0x000001af, 29153 }, /* Zabovedot */ - { 0x000001bf, 29163 }, /* zabovedot */ - { 0x000001ac, 29173 }, /* Zacute */ - { 0x000001bc, 29180 }, /* zacute */ - { 0x000001ae, 29187 }, /* Zcaron */ - { 0x000001be, 29194 }, /* zcaron */ - { 0x0000ff3d, 29201 }, /* Zen_Koho */ - { 0x0000ff28, 29210 }, /* Zenkaku */ - { 0x0000ff2a, 29218 }, /* Zenkaku_Hankaku */ - { 0x01002080, 29234 }, /* zerosubscript */ - { 0x01002070, 29248 }, /* zerosuperior */ - { 0x010001b5, 29261 }, /* Zstroke */ - { 0x010001b6, 29269 }, /* zstroke */ -}; - -static const struct name_keysym keysym_to_name[] = { - { 0x00000000, 20091 }, /* NoSymbol */ - { 0x00000020, 23803 }, /* space */ - { 0x00000021, 12099 }, /* exclam */ - { 0x00000022, 22187 }, /* quotedbl */ - { 0x00000023, 20178 }, /* numbersign */ - { 0x00000024, 11251 }, /* dollar */ - { 0x00000025, 21487 }, /* percent */ - { 0x00000026, 908 }, /* ampersand */ - { 0x00000027, 934 }, /* apostrophe */ - { 0x00000028, 21425 }, /* parenleft */ - { 0x00000029, 21435 }, /* parenright */ - { 0x0000002a, 3283 }, /* asterisk */ - { 0x0000002b, 21557 }, /* plus */ - { 0x0000002c, 8680 }, /* comma */ - { 0x0000002d, 19733 }, /* minus */ - { 0x0000002e, 21495 }, /* period */ - { 0x0000002f, 23768 }, /* slash */ - { 0x00000030, 0 }, /* 0 */ - { 0x00000031, 2 }, /* 1 */ - { 0x00000032, 4 }, /* 2 */ - { 0x00000033, 6 }, /* 3 */ - { 0x00000034, 386 }, /* 4 */ - { 0x00000035, 388 }, /* 5 */ - { 0x00000036, 390 }, /* 6 */ - { 0x00000037, 392 }, /* 7 */ - { 0x00000038, 394 }, /* 8 */ - { 0x00000039, 396 }, /* 9 */ - { 0x0000003a, 8664 }, /* colon */ - { 0x0000003b, 22734 }, /* semicolon */ - { 0x0000003c, 19412 }, /* less */ - { 0x0000003d, 12051 }, /* equal */ - { 0x0000003e, 13272 }, /* greater */ - { 0x0000003f, 22165 }, /* question */ - { 0x00000040, 3292 }, /* at */ - { 0x00000041, 398 }, /* A */ - { 0x00000042, 3328 }, /* B */ - { 0x00000043, 8439 }, /* C */ - { 0x00000044, 10320 }, /* D */ - { 0x00000045, 11424 }, /* E */ - { 0x00000046, 12155 }, /* F */ - { 0x00000047, 12665 }, /* G */ - { 0x00000048, 14378 }, /* H */ - { 0x00000049, 17069 }, /* I */ - { 0x0000004a, 18114 }, /* J */ - { 0x0000004b, 18146 }, /* K */ - { 0x0000004c, 19112 }, /* L */ - { 0x0000004d, 19533 }, /* M */ - { 0x0000004e, 19943 }, /* N */ - { 0x0000004f, 20200 }, /* O */ - { 0x00000050, 21373 }, /* P */ - { 0x00000051, 22156 }, /* Q */ - { 0x00000052, 22217 }, /* R */ - { 0x00000053, 22579 }, /* S */ - { 0x00000054, 24294 }, /* T */ - { 0x00000055, 25847 }, /* U */ - { 0x00000056, 26483 }, /* V */ - { 0x00000057, 26545 }, /* W */ - { 0x00000058, 26631 }, /* X */ - { 0x00000059, 29021 }, /* Y */ - { 0x0000005a, 29149 }, /* Z */ - { 0x0000005b, 3603 }, /* bracketleft */ - { 0x0000005c, 3352 }, /* backslash */ - { 0x0000005d, 3615 }, /* bracketright */ - { 0x0000005e, 3260 }, /* asciicircum */ - { 0x0000005f, 26346 }, /* underscore */ - { 0x00000060, 13266 }, /* grave */ - { 0x00000061, 400 }, /* a */ - { 0x00000062, 3330 }, /* b */ - { 0x00000063, 8441 }, /* c */ - { 0x00000064, 10322 }, /* d */ - { 0x00000065, 11426 }, /* e */ - { 0x00000066, 12157 }, /* f */ - { 0x00000067, 12667 }, /* g */ - { 0x00000068, 14380 }, /* h */ - { 0x00000069, 17071 }, /* i */ - { 0x0000006a, 18116 }, /* j */ - { 0x0000006b, 18148 }, /* k */ - { 0x0000006c, 19114 }, /* l */ - { 0x0000006d, 19535 }, /* m */ - { 0x0000006e, 19945 }, /* n */ - { 0x0000006f, 20202 }, /* o */ - { 0x00000070, 21375 }, /* p */ - { 0x00000071, 22158 }, /* q */ - { 0x00000072, 22219 }, /* r */ - { 0x00000073, 22581 }, /* s */ - { 0x00000074, 24296 }, /* t */ - { 0x00000075, 25849 }, /* u */ - { 0x00000076, 26485 }, /* v */ - { 0x00000077, 26547 }, /* w */ - { 0x00000078, 26633 }, /* x */ - { 0x00000079, 29023 }, /* y */ - { 0x0000007a, 29151 }, /* z */ - { 0x0000007b, 3582 }, /* braceleft */ - { 0x0000007c, 3392 }, /* bar */ - { 0x0000007d, 3592 }, /* braceright */ - { 0x0000007e, 3272 }, /* asciitilde */ - { 0x000000a0, 20078 }, /* nobreakspace */ - { 0x000000a1, 12106 }, /* exclamdown */ - { 0x000000a2, 8589 }, /* cent */ - { 0x000000a3, 23827 }, /* sterling */ - { 0x000000a4, 8766 }, /* currency */ - { 0x000000a5, 29105 }, /* yen */ - { 0x000000a6, 8389 }, /* brokenbar */ - { 0x000000a7, 22719 }, /* section */ - { 0x000000a8, 11203 }, /* diaeresis */ - { 0x000000a9, 8717 }, /* copyright */ - { 0x000000aa, 20852 }, /* ordfeminine */ - { 0x000000ab, 14349 }, /* guillemotleft */ - { 0x000000ac, 20147 }, /* notsign */ - { 0x000000ad, 17062 }, /* hyphen */ - { 0x000000ae, 22331 }, /* registered */ - { 0x000000af, 19641 }, /* macron */ - { 0x000000b0, 11153 }, /* degree */ - { 0x000000b1, 21562 }, /* plusminus */ - { 0x000000b2, 25825 }, /* twosuperior */ - { 0x000000b3, 25571 }, /* threesuperior */ - { 0x000000b4, 820 }, /* acute */ - { 0x000000b5, 19799 }, /* mu */ - { 0x000000b6, 21415 }, /* paragraph */ - { 0x000000b7, 21502 }, /* periodcentered */ - { 0x000000b8, 8581 }, /* cedilla */ - { 0x000000b9, 20755 }, /* onesuperior */ - { 0x000000ba, 19688 }, /* masculine */ - { 0x000000bb, 14363 }, /* guillemotright */ - { 0x000000bc, 20722 }, /* onequarter */ - { 0x000000bd, 20714 }, /* onehalf */ - { 0x000000be, 25542 }, /* threequarters */ - { 0x000000bf, 22174 }, /* questiondown */ - { 0x000000c0, 854 }, /* Agrave */ - { 0x000000c1, 402 }, /* Aacute */ - { 0x000000c2, 622 }, /* Acircumflex */ - { 0x000000c3, 3295 }, /* Atilde */ - { 0x000000c4, 826 }, /* Adiaeresis */ - { 0x000000c5, 2036 }, /* Aring */ - { 0x000000c6, 848 }, /* AE */ - { 0x000000c7, 8539 }, /* Ccedilla */ - { 0x000000c8, 11724 }, /* Egrave */ - { 0x000000c9, 11448 }, /* Eacute */ - { 0x000000ca, 11496 }, /* Ecircumflex */ - { 0x000000cb, 11702 }, /* Ediaeresis */ - { 0x000000cc, 17205 }, /* Igrave */ - { 0x000000cd, 17083 }, /* Iacute */ - { 0x000000ce, 17131 }, /* Icircumflex */ - { 0x000000cf, 17165 }, /* Idiaeresis */ - { 0x000000d0, 12064 }, /* ETH */ - { 0x000000d1, 20155 }, /* Ntilde */ - { 0x000000d2, 20527 }, /* Ograve */ - { 0x000000d3, 20204 }, /* Oacute */ - { 0x000000d4, 20268 }, /* Ocircumflex */ - { 0x000000d5, 21310 }, /* Otilde */ - { 0x000000d6, 20466 }, /* Odiaeresis */ - { 0x000000d7, 19839 }, /* multiply */ - { 0x000000d8, 21296 }, /* Oslash */ - { 0x000000d9, 25971 }, /* Ugrave */ - { 0x000000da, 25851 }, /* Uacute */ - { 0x000000db, 25899 }, /* Ucircumflex */ - { 0x000000dc, 25923 }, /* Udiaeresis */ - { 0x000000dd, 29025 }, /* Yacute */ - { 0x000000de, 25499 }, /* THORN */ - { 0x000000df, 23820 }, /* ssharp */ - { 0x000000e0, 861 }, /* agrave */ - { 0x000000e1, 409 }, /* aacute */ - { 0x000000e2, 634 }, /* acircumflex */ - { 0x000000e3, 3302 }, /* atilde */ - { 0x000000e4, 837 }, /* adiaeresis */ - { 0x000000e5, 2042 }, /* aring */ - { 0x000000e6, 851 }, /* ae */ - { 0x000000e7, 8548 }, /* ccedilla */ - { 0x000000e8, 11731 }, /* egrave */ - { 0x000000e9, 11455 }, /* eacute */ - { 0x000000ea, 11508 }, /* ecircumflex */ - { 0x000000eb, 11713 }, /* ediaeresis */ - { 0x000000ec, 17212 }, /* igrave */ - { 0x000000ed, 17090 }, /* iacute */ - { 0x000000ee, 17143 }, /* icircumflex */ - { 0x000000ef, 17176 }, /* idiaeresis */ - { 0x000000f0, 12072 }, /* eth */ - { 0x000000f1, 20162 }, /* ntilde */ - { 0x000000f2, 20534 }, /* ograve */ - { 0x000000f3, 20211 }, /* oacute */ - { 0x000000f4, 20280 }, /* ocircumflex */ - { 0x000000f5, 21317 }, /* otilde */ - { 0x000000f6, 20477 }, /* odiaeresis */ - { 0x000000f7, 11242 }, /* division */ - { 0x000000f8, 21303 }, /* oslash */ - { 0x000000f9, 25978 }, /* ugrave */ - { 0x000000fa, 25858 }, /* uacute */ - { 0x000000fb, 25911 }, /* ucircumflex */ - { 0x000000fc, 25934 }, /* udiaeresis */ - { 0x000000fd, 29032 }, /* yacute */ - { 0x000000fe, 25511 }, /* thorn */ - { 0x000000ff, 29083 }, /* ydiaeresis */ - { 0x000001a1, 918 }, /* Aogonek */ - { 0x000001a2, 8383 }, /* breve */ - { 0x000001a3, 19517 }, /* Lstroke */ - { 0x000001a5, 19212 }, /* Lcaron */ - { 0x000001a6, 22603 }, /* Sacute */ - { 0x000001a9, 22617 }, /* Scaron */ - { 0x000001aa, 22631 }, /* Scedilla */ - { 0x000001ab, 24322 }, /* Tcaron */ - { 0x000001ac, 29173 }, /* Zacute */ - { 0x000001ae, 29187 }, /* Zcaron */ - { 0x000001af, 29153 }, /* Zabovedot */ - { 0x000001b1, 926 }, /* aogonek */ - { 0x000001b2, 20520 }, /* ogonek */ - { 0x000001b3, 19525 }, /* lstroke */ - { 0x000001b5, 19219 }, /* lcaron */ - { 0x000001b6, 22610 }, /* sacute */ - { 0x000001b7, 8519 }, /* caron */ - { 0x000001b9, 22624 }, /* scaron */ - { 0x000001ba, 22640 }, /* scedilla */ - { 0x000001bb, 24329 }, /* tcaron */ - { 0x000001bc, 29180 }, /* zacute */ - { 0x000001bd, 11283 }, /* doubleacute */ - { 0x000001be, 29194 }, /* zcaron */ - { 0x000001bf, 29163 }, /* zabovedot */ - { 0x000001c0, 22272 }, /* Racute */ - { 0x000001c3, 445 }, /* Abreve */ - { 0x000001c5, 19147 }, /* Lacute */ - { 0x000001c6, 8475 }, /* Cacute */ - { 0x000001c8, 8525 }, /* Ccaron */ - { 0x000001ca, 12035 }, /* Eogonek */ - { 0x000001cc, 11482 }, /* Ecaron */ - { 0x000001cf, 10365 }, /* Dcaron */ - { 0x000001d0, 11401 }, /* Dstroke */ - { 0x000001d1, 19953 }, /* Nacute */ - { 0x000001d2, 19977 }, /* Ncaron */ - { 0x000001d5, 20488 }, /* Odoubleacute */ - { 0x000001d8, 22294 }, /* Rcaron */ - { 0x000001d9, 26452 }, /* Uring */ - { 0x000001db, 25945 }, /* Udoubleacute */ - { 0x000001de, 24336 }, /* Tcedilla */ - { 0x000001e0, 22279 }, /* racute */ - { 0x000001e3, 452 }, /* abreve */ - { 0x000001e5, 19154 }, /* lacute */ - { 0x000001e6, 8482 }, /* cacute */ - { 0x000001e8, 8532 }, /* ccaron */ - { 0x000001ea, 12043 }, /* eogonek */ - { 0x000001ec, 11489 }, /* ecaron */ - { 0x000001ef, 10372 }, /* dcaron */ - { 0x000001f0, 11409 }, /* dstroke */ - { 0x000001f1, 19960 }, /* nacute */ - { 0x000001f2, 19984 }, /* ncaron */ - { 0x000001f5, 20501 }, /* odoubleacute */ - { 0x000001f8, 22301 }, /* rcaron */ - { 0x000001f9, 26458 }, /* uring */ - { 0x000001fb, 25958 }, /* udoubleacute */ - { 0x000001fe, 24345 }, /* tcedilla */ - { 0x000001ff, 436 }, /* abovedot */ - { 0x000002a1, 17027 }, /* Hstroke */ - { 0x000002a6, 16056 }, /* Hcircumflex */ - { 0x000002a9, 17073 }, /* Iabovedot */ - { 0x000002ab, 12689 }, /* Gbreve */ - { 0x000002ac, 18118 }, /* Jcircumflex */ - { 0x000002b1, 17035 }, /* hstroke */ - { 0x000002b6, 16068 }, /* hcircumflex */ - { 0x000002b9, 17187 }, /* idotless */ - { 0x000002bb, 12696 }, /* gbreve */ - { 0x000002bc, 18130 }, /* jcircumflex */ - { 0x000002c5, 8455 }, /* Cabovedot */ - { 0x000002c6, 8557 }, /* Ccircumflex */ - { 0x000002d5, 12669 }, /* Gabovedot */ - { 0x000002d8, 12735 }, /* Gcircumflex */ - { 0x000002dd, 25885 }, /* Ubreve */ - { 0x000002de, 22661 }, /* Scircumflex */ - { 0x000002e5, 8465 }, /* cabovedot */ - { 0x000002e6, 8569 }, /* ccircumflex */ - { 0x000002f5, 12679 }, /* gabovedot */ - { 0x000002f8, 12747 }, /* gcircumflex */ - { 0x000002fd, 25892 }, /* ubreve */ - { 0x000002fe, 22673 }, /* scircumflex */ - { 0x000003a2, 19108 }, /* kra */ - { 0x000003a3, 22308 }, /* Rcedilla */ - { 0x000003a5, 18100 }, /* Itilde */ - { 0x000003a6, 19226 }, /* Lcedilla */ - { 0x000003aa, 11839 }, /* Emacron */ - { 0x000003ab, 12717 }, /* Gcedilla */ - { 0x000003ac, 25788 }, /* Tslash */ - { 0x000003b3, 22317 }, /* rcedilla */ - { 0x000003b5, 18107 }, /* itilde */ - { 0x000003b6, 19235 }, /* lcedilla */ - { 0x000003ba, 11847 }, /* emacron */ - { 0x000003bb, 12726 }, /* gcedilla */ - { 0x000003bc, 25795 }, /* tslash */ - { 0x000003bd, 11983 }, /* ENG */ - { 0x000003bf, 11987 }, /* eng */ - { 0x000003c0, 892 }, /* Amacron */ - { 0x000003c7, 17338 }, /* Iogonek */ - { 0x000003cc, 11428 }, /* Eabovedot */ - { 0x000003cf, 17231 }, /* Imacron */ - { 0x000003d1, 19991 }, /* Ncedilla */ - { 0x000003d2, 20679 }, /* Omacron */ - { 0x000003d3, 18779 }, /* Kcedilla */ - { 0x000003d9, 26368 }, /* Uogonek */ - { 0x000003dd, 26469 }, /* Utilde */ - { 0x000003de, 26321 }, /* Umacron */ - { 0x000003e0, 900 }, /* amacron */ - { 0x000003e7, 17346 }, /* iogonek */ - { 0x000003ec, 11438 }, /* eabovedot */ - { 0x000003ef, 17239 }, /* imacron */ - { 0x000003f1, 20000 }, /* ncedilla */ - { 0x000003f2, 20687 }, /* omacron */ - { 0x000003f3, 18788 }, /* kcedilla */ - { 0x000003f9, 26376 }, /* uogonek */ - { 0x000003fd, 26476 }, /* utilde */ - { 0x000003fe, 26329 }, /* umacron */ - { 0x0000047e, 21364 }, /* overline */ - { 0x000004a1, 18243 }, /* kana_fullstop */ - { 0x000004a2, 18477 }, /* kana_openingbracket */ - { 0x000004a3, 18173 }, /* kana_closingbracket */ - { 0x000004a4, 18193 }, /* kana_comma */ - { 0x000004a5, 18204 }, /* kana_conjunctive */ - { 0x000004a6, 18689 }, /* kana_WO */ - { 0x000004a7, 18150 }, /* kana_a */ - { 0x000004a8, 18297 }, /* kana_i */ - { 0x000004a9, 18667 }, /* kana_u */ - { 0x000004aa, 18221 }, /* kana_e */ - { 0x000004ab, 18463 }, /* kana_o */ - { 0x000004ac, 18697 }, /* kana_ya */ - { 0x000004ad, 18729 }, /* kana_yu */ - { 0x000004ae, 18713 }, /* kana_yo */ - { 0x000004af, 18633 }, /* kana_tsu */ - { 0x000004b0, 22130 }, /* prolongedsound */ - { 0x000004b1, 18157 }, /* kana_A */ - { 0x000004b2, 18304 }, /* kana_I */ - { 0x000004b3, 18674 }, /* kana_U */ - { 0x000004b4, 18228 }, /* kana_E */ - { 0x000004b5, 18470 }, /* kana_O */ - { 0x000004b6, 18311 }, /* kana_KA */ - { 0x000004b7, 18327 }, /* kana_KI */ - { 0x000004b8, 18343 }, /* kana_KU */ - { 0x000004b9, 18319 }, /* kana_KE */ - { 0x000004ba, 18335 }, /* kana_KO */ - { 0x000004bb, 18537 }, /* kana_SA */ - { 0x000004bc, 18553 }, /* kana_SHI */ - { 0x000004bd, 18581 }, /* kana_SU */ - { 0x000004be, 18545 }, /* kana_SE */ - { 0x000004bf, 18573 }, /* kana_SO */ - { 0x000004c0, 18601 }, /* kana_TA */ - { 0x000004c1, 18164 }, /* kana_CHI */ - { 0x000004c2, 18642 }, /* kana_TSU */ - { 0x000004c3, 18609 }, /* kana_TE */ - { 0x000004c4, 18625 }, /* kana_TO */ - { 0x000004c5, 18423 }, /* kana_NA */ - { 0x000004c6, 18439 }, /* kana_NI */ - { 0x000004c7, 18455 }, /* kana_NU */ - { 0x000004c8, 18431 }, /* kana_NE */ - { 0x000004c9, 18447 }, /* kana_NO */ - { 0x000004ca, 18257 }, /* kana_HA */ - { 0x000004cb, 18273 }, /* kana_HI */ - { 0x000004cc, 18235 }, /* kana_FU */ - { 0x000004cd, 18265 }, /* kana_HE */ - { 0x000004ce, 18281 }, /* kana_HO */ - { 0x000004cf, 18361 }, /* kana_MA */ - { 0x000004d0, 18377 }, /* kana_MI */ - { 0x000004d1, 18408 }, /* kana_MU */ - { 0x000004d2, 18369 }, /* kana_ME */ - { 0x000004d3, 18400 }, /* kana_MO */ - { 0x000004d4, 18705 }, /* kana_YA */ - { 0x000004d5, 18737 }, /* kana_YU */ - { 0x000004d6, 18721 }, /* kana_YO */ - { 0x000004d7, 18497 }, /* kana_RA */ - { 0x000004d8, 18513 }, /* kana_RI */ - { 0x000004d9, 18529 }, /* kana_RU */ - { 0x000004da, 18505 }, /* kana_RE */ - { 0x000004db, 18521 }, /* kana_RO */ - { 0x000004dc, 18681 }, /* kana_WA */ - { 0x000004dd, 18416 }, /* kana_N */ - { 0x000004de, 26519 }, /* voicedsound */ - { 0x000004df, 22744 }, /* semivoicedsound */ - { 0x000005ac, 1109 }, /* Arabic_comma */ - { 0x000005bb, 1764 }, /* Arabic_semicolon */ - { 0x000005bf, 1698 }, /* Arabic_question_mark */ - { 0x000005c1, 1303 }, /* Arabic_hamza */ - { 0x000005c2, 1599 }, /* Arabic_maddaonalef */ - { 0x000005c3, 1354 }, /* Arabic_hamzaonalef */ - { 0x000005c4, 1373 }, /* Arabic_hamzaonwaw */ - { 0x000005c5, 1409 }, /* Arabic_hamzaunderalef */ - { 0x000005c6, 1391 }, /* Arabic_hamzaonyeh */ - { 0x000005c7, 1067 }, /* Arabic_alef */ - { 0x000005c8, 1098 }, /* Arabic_beh */ - { 0x000005c9, 1909 }, /* Arabic_tehmarbuta */ - { 0x000005ca, 1898 }, /* Arabic_teh */ - { 0x000005cb, 1939 }, /* Arabic_theh */ - { 0x000005cc, 1481 }, /* Arabic_jeem */ - { 0x000005cd, 1292 }, /* Arabic_hah */ - { 0x000005ce, 1557 }, /* Arabic_khah */ - { 0x000005cf, 1133 }, /* Arabic_dal */ - { 0x000005d0, 1927 }, /* Arabic_thal */ - { 0x000005d1, 1719 }, /* Arabic_ra */ - { 0x000005d2, 2024 }, /* Arabic_zain */ - { 0x000005d3, 1752 }, /* Arabic_seen */ - { 0x000005d4, 1795 }, /* Arabic_sheen */ - { 0x000005d5, 1741 }, /* Arabic_sad */ - { 0x000005d6, 1122 }, /* Arabic_dad */ - { 0x000005d7, 1859 }, /* Arabic_tah */ - { 0x000005d8, 2013 }, /* Arabic_zah */ - { 0x000005d9, 1056 }, /* Arabic_ain */ - { 0x000005da, 1269 }, /* Arabic_ghain */ - { 0x000005e0, 1870 }, /* Arabic_tatweel */ - { 0x000005e1, 1231 }, /* Arabic_feh */ - { 0x000005e2, 1687 }, /* Arabic_qaf */ - { 0x000005e3, 1504 }, /* Arabic_kaf */ - { 0x000005e4, 1569 }, /* Arabic_lam */ - { 0x000005e5, 1618 }, /* Arabic_meem */ - { 0x000005e6, 1630 }, /* Arabic_noon */ - { 0x000005e7, 1282 }, /* Arabic_ha */ - { 0x000005e8, 1974 }, /* Arabic_waw */ - { 0x000005e9, 1079 }, /* Arabic_alefmaksura */ - { 0x000005ea, 1985 }, /* Arabic_yeh */ - { 0x000005eb, 1215 }, /* Arabic_fathatan */ - { 0x000005ec, 1157 }, /* Arabic_dammatan */ - { 0x000005ed, 1528 }, /* Arabic_kasratan */ - { 0x000005ee, 1202 }, /* Arabic_fatha */ - { 0x000005ef, 1144 }, /* Arabic_damma */ - { 0x000005f0, 1515 }, /* Arabic_kasra */ - { 0x000005f1, 1781 }, /* Arabic_shadda */ - { 0x000005f2, 1808 }, /* Arabic_sukun */ - { 0x000006a1, 22760 }, /* Serbian_dje */ - { 0x000006a2, 19585 }, /* Macedonia_gje */ - { 0x000006a3, 9456 }, /* Cyrillic_io */ - { 0x000006a4, 26199 }, /* Ukrainian_ie */ - { 0x000006a5, 19557 }, /* Macedonia_dse */ - { 0x000006a6, 26175 }, /* Ukrainian_i */ - { 0x000006a7, 26225 }, /* Ukrainian_yi */ - { 0x000006a8, 9480 }, /* Cyrillic_je */ - { 0x000006a9, 9618 }, /* Cyrillic_lje */ - { 0x000006aa, 9644 }, /* Cyrillic_nje */ - { 0x000006ab, 22878 }, /* Serbian_tshe */ - { 0x000006ac, 19613 }, /* Macedonia_kje */ - { 0x000006ad, 26123 }, /* Ukrainian_ghe_with_upturn */ - { 0x000006ae, 8399 }, /* Byelorussian_shortu */ - { 0x000006af, 8972 }, /* Cyrillic_dzhe */ - { 0x000006b0, 20189 }, /* numerosign */ - { 0x000006b1, 22772 }, /* Serbian_DJE */ - { 0x000006b2, 19599 }, /* Macedonia_GJE */ - { 0x000006b3, 9468 }, /* Cyrillic_IO */ - { 0x000006b4, 26212 }, /* Ukrainian_IE */ - { 0x000006b5, 19571 }, /* Macedonia_DSE */ - { 0x000006b6, 26187 }, /* Ukrainian_I */ - { 0x000006b7, 26238 }, /* Ukrainian_YI */ - { 0x000006b8, 9492 }, /* Cyrillic_JE */ - { 0x000006b9, 9631 }, /* Cyrillic_LJE */ - { 0x000006ba, 9657 }, /* Cyrillic_NJE */ - { 0x000006bb, 22891 }, /* Serbian_TSHE */ - { 0x000006bc, 19627 }, /* Macedonia_KJE */ - { 0x000006bd, 26149 }, /* Ukrainian_GHE_WITH_UPTURN */ - { 0x000006be, 8419 }, /* Byelorussian_SHORTU */ - { 0x000006bf, 8986 }, /* Cyrillic_DZHE */ - { 0x000006c0, 10200 }, /* Cyrillic_yu */ - { 0x000006c1, 8782 }, /* Cyrillic_a */ - { 0x000006c2, 8804 }, /* Cyrillic_be */ - { 0x000006c3, 9952 }, /* Cyrillic_tse */ - { 0x000006c4, 8948 }, /* Cyrillic_de */ - { 0x000006c5, 9432 }, /* Cyrillic_ie */ - { 0x000006c6, 9022 }, /* Cyrillic_ef */ - { 0x000006c7, 9210 }, /* Cyrillic_ghe */ - { 0x000006c8, 9270 }, /* Cyrillic_ha */ - { 0x000006c9, 9374 }, /* Cyrillic_i */ - { 0x000006ca, 9860 }, /* Cyrillic_shorti */ - { 0x000006cb, 9504 }, /* Cyrillic_ka */ - { 0x000006cc, 9046 }, /* Cyrillic_el */ - { 0x000006cd, 9070 }, /* Cyrillic_em */ - { 0x000006ce, 9094 }, /* Cyrillic_en */ - { 0x000006cf, 9670 }, /* Cyrillic_o */ - { 0x000006d0, 9722 }, /* Cyrillic_pe */ - { 0x000006d1, 10148 }, /* Cyrillic_ya */ - { 0x000006d2, 9162 }, /* Cyrillic_er */ - { 0x000006d3, 9186 }, /* Cyrillic_es */ - { 0x000006d4, 9928 }, /* Cyrillic_te */ - { 0x000006d5, 9978 }, /* Cyrillic_u */ - { 0x000006d6, 10248 }, /* Cyrillic_zhe */ - { 0x000006d7, 10124 }, /* Cyrillic_ve */ - { 0x000006d8, 9892 }, /* Cyrillic_softsign */ - { 0x000006d9, 10172 }, /* Cyrillic_yeru */ - { 0x000006da, 10224 }, /* Cyrillic_ze */ - { 0x000006db, 9776 }, /* Cyrillic_sha */ - { 0x000006dc, 9000 }, /* Cyrillic_e */ - { 0x000006dd, 9802 }, /* Cyrillic_shcha */ - { 0x000006de, 8828 }, /* Cyrillic_che */ - { 0x000006df, 9338 }, /* Cyrillic_hardsign */ - { 0x000006e0, 10212 }, /* Cyrillic_YU */ - { 0x000006e1, 8793 }, /* Cyrillic_A */ - { 0x000006e2, 8816 }, /* Cyrillic_BE */ - { 0x000006e3, 9965 }, /* Cyrillic_TSE */ - { 0x000006e4, 8960 }, /* Cyrillic_DE */ - { 0x000006e5, 9444 }, /* Cyrillic_IE */ - { 0x000006e6, 9034 }, /* Cyrillic_EF */ - { 0x000006e7, 9223 }, /* Cyrillic_GHE */ - { 0x000006e8, 9282 }, /* Cyrillic_HA */ - { 0x000006e9, 9385 }, /* Cyrillic_I */ - { 0x000006ea, 9876 }, /* Cyrillic_SHORTI */ - { 0x000006eb, 9516 }, /* Cyrillic_KA */ - { 0x000006ec, 9058 }, /* Cyrillic_EL */ - { 0x000006ed, 9082 }, /* Cyrillic_EM */ - { 0x000006ee, 9106 }, /* Cyrillic_EN */ - { 0x000006ef, 9681 }, /* Cyrillic_O */ - { 0x000006f0, 9734 }, /* Cyrillic_PE */ - { 0x000006f1, 10160 }, /* Cyrillic_YA */ - { 0x000006f2, 9174 }, /* Cyrillic_ER */ - { 0x000006f3, 9198 }, /* Cyrillic_ES */ - { 0x000006f4, 9940 }, /* Cyrillic_TE */ - { 0x000006f5, 9989 }, /* Cyrillic_U */ - { 0x000006f6, 10261 }, /* Cyrillic_ZHE */ - { 0x000006f7, 10136 }, /* Cyrillic_VE */ - { 0x000006f8, 9910 }, /* Cyrillic_SOFTSIGN */ - { 0x000006f9, 10186 }, /* Cyrillic_YERU */ - { 0x000006fa, 10236 }, /* Cyrillic_ZE */ - { 0x000006fb, 9789 }, /* Cyrillic_SHA */ - { 0x000006fc, 9011 }, /* Cyrillic_E */ - { 0x000006fd, 9817 }, /* Cyrillic_SHCHA */ - { 0x000006fe, 8841 }, /* Cyrillic_CHE */ - { 0x000006ff, 9356 }, /* Cyrillic_HARDSIGN */ - { 0x000007a1, 13342 }, /* Greek_ALPHAaccent */ - { 0x000007a2, 13472 }, /* Greek_EPSILONaccent */ - { 0x000007a3, 13532 }, /* Greek_ETAaccent */ - { 0x000007a4, 13647 }, /* Greek_IOTAaccent */ - { 0x000007a5, 13726 }, /* Greek_IOTAdieresis */ - { 0x000007a7, 13962 }, /* Greek_OMICRONaccent */ - { 0x000007a8, 14189 }, /* Greek_UPSILONaccent */ - { 0x000007a9, 14257 }, /* Greek_UPSILONdieresis */ - { 0x000007ab, 13898 }, /* Greek_OMEGAaccent */ - { 0x000007ae, 13297 }, /* Greek_accentdieresis */ - { 0x000007af, 13610 }, /* Greek_horizbar */ - { 0x000007b1, 13360 }, /* Greek_alphaaccent */ - { 0x000007b2, 13492 }, /* Greek_epsilonaccent */ - { 0x000007b3, 13548 }, /* Greek_etaaccent */ - { 0x000007b4, 13664 }, /* Greek_iotaaccent */ - { 0x000007b5, 13745 }, /* Greek_iotadieresis */ - { 0x000007b6, 13681 }, /* Greek_iotaaccentdieresis */ - { 0x000007b7, 13982 }, /* Greek_omicronaccent */ - { 0x000007b8, 14209 }, /* Greek_upsilonaccent */ - { 0x000007b9, 14279 }, /* Greek_upsilondieresis */ - { 0x000007ba, 14229 }, /* Greek_upsilonaccentdieresis */ - { 0x000007bb, 13916 }, /* Greek_omegaaccent */ - { 0x000007c1, 13318 }, /* Greek_ALPHA */ - { 0x000007c2, 13378 }, /* Greek_BETA */ - { 0x000007c3, 13586 }, /* Greek_GAMMA */ - { 0x000007c4, 13420 }, /* Greek_DELTA */ - { 0x000007c5, 13444 }, /* Greek_EPSILON */ - { 0x000007c6, 14319 }, /* Greek_ZETA */ - { 0x000007c7, 13512 }, /* Greek_ETA */ - { 0x000007c8, 14137 }, /* Greek_THETA */ - { 0x000007c9, 13625 }, /* Greek_IOTA */ - { 0x000007ca, 13764 }, /* Greek_KAPPA */ - { 0x000007cb, 13814 }, /* Greek_LAMDA */ - { 0x000007cc, 13838 }, /* Greek_MU */ - { 0x000007cd, 13856 }, /* Greek_NU */ - { 0x000007ce, 14301 }, /* Greek_XI */ - { 0x000007cf, 13934 }, /* Greek_OMICRON */ - { 0x000007d0, 14022 }, /* Greek_PI */ - { 0x000007d1, 14060 }, /* Greek_RHO */ - { 0x000007d2, 14080 }, /* Greek_SIGMA */ - { 0x000007d4, 14117 }, /* Greek_TAU */ - { 0x000007d5, 14161 }, /* Greek_UPSILON */ - { 0x000007d6, 14002 }, /* Greek_PHI */ - { 0x000007d7, 13400 }, /* Greek_CHI */ - { 0x000007d8, 14040 }, /* Greek_PSI */ - { 0x000007d9, 13874 }, /* Greek_OMEGA */ - { 0x000007e1, 13330 }, /* Greek_alpha */ - { 0x000007e2, 13389 }, /* Greek_beta */ - { 0x000007e3, 13598 }, /* Greek_gamma */ - { 0x000007e4, 13432 }, /* Greek_delta */ - { 0x000007e5, 13458 }, /* Greek_epsilon */ - { 0x000007e6, 14330 }, /* Greek_zeta */ - { 0x000007e7, 13522 }, /* Greek_eta */ - { 0x000007e8, 14149 }, /* Greek_theta */ - { 0x000007e9, 13636 }, /* Greek_iota */ - { 0x000007ea, 13776 }, /* Greek_kappa */ - { 0x000007eb, 13826 }, /* Greek_lamda */ - { 0x000007ec, 13847 }, /* Greek_mu */ - { 0x000007ed, 13865 }, /* Greek_nu */ - { 0x000007ee, 14310 }, /* Greek_xi */ - { 0x000007ef, 13948 }, /* Greek_omicron */ - { 0x000007f0, 14031 }, /* Greek_pi */ - { 0x000007f1, 14070 }, /* Greek_rho */ - { 0x000007f2, 14092 }, /* Greek_sigma */ - { 0x000007f3, 13564 }, /* Greek_finalsmallsigma */ - { 0x000007f4, 14127 }, /* Greek_tau */ - { 0x000007f5, 14175 }, /* Greek_upsilon */ - { 0x000007f6, 14012 }, /* Greek_phi */ - { 0x000007f7, 13410 }, /* Greek_chi */ - { 0x000007f8, 14050 }, /* Greek_psi */ - { 0x000007f9, 13886 }, /* Greek_omega */ - { 0x000008a1, 19356 }, /* leftradical */ - { 0x000008a2, 25621 }, /* topleftradical */ - { 0x000008a3, 16667 }, /* horizconnector */ - { 0x000008a4, 25595 }, /* topintegral */ - { 0x000008a5, 3422 }, /* botintegral */ - { 0x000008a6, 26505 }, /* vertconnector */ - { 0x000008a7, 25636 }, /* topleftsqbracket */ - { 0x000008a8, 3448 }, /* botleftsqbracket */ - { 0x000008a9, 25685 }, /* toprightsqbracket */ - { 0x000008aa, 3497 }, /* botrightsqbracket */ - { 0x000008ab, 25607 }, /* topleftparens */ - { 0x000008ac, 3434 }, /* botleftparens */ - { 0x000008ad, 25670 }, /* toprightparens */ - { 0x000008ae, 3482 }, /* botrightparens */ - { 0x000008af, 19306 }, /* leftmiddlecurlybrace */ - { 0x000008b0, 22440 }, /* rightmiddlecurlybrace */ - { 0x000008b1, 25653 }, /* topleftsummation */ - { 0x000008b2, 3465 }, /* botleftsummation */ - { 0x000008b3, 25726 }, /* topvertsummationconnector */ - { 0x000008b4, 3538 }, /* botvertsummationconnector */ - { 0x000008b5, 25703 }, /* toprightsummation */ - { 0x000008b6, 3515 }, /* botrightsummation */ - { 0x000008b7, 22462 }, /* rightmiddlesummation */ - { 0x000008bc, 19417 }, /* lessthanequal */ - { 0x000008bd, 20125 }, /* notequal */ - { 0x000008be, 13280 }, /* greaterthanequal */ - { 0x000008bf, 17313 }, /* integral */ - { 0x000008c0, 25479 }, /* therefore */ - { 0x000008c1, 26487 }, /* variation */ - { 0x000008c2, 17275 }, /* infinity */ - { 0x000008c5, 19947 }, /* nabla */ - { 0x000008c8, 954 }, /* approximate */ - { 0x000008c9, 22999 }, /* similarequal */ - { 0x000008cd, 17196 }, /* ifonlyif */ - { 0x000008ce, 17247 }, /* implies */ - { 0x000008cf, 17155 }, /* identical */ - { 0x000008d6, 22286 }, /* radical */ - { 0x000008da, 17255 }, /* includedin */ - { 0x000008db, 17266 }, /* includes */ - { 0x000008dc, 17322 }, /* intersection */ - { 0x000008dd, 26362 }, /* union */ - { 0x000008de, 19457 }, /* logicaland */ - { 0x000008df, 19468 }, /* logicalor */ - { 0x000008ef, 21463 }, /* partialderivative */ - { 0x000008f6, 12656 }, /* function */ - { 0x000008fb, 19266 }, /* leftarrow */ - { 0x000008fc, 26387 }, /* uparrow */ - { 0x000008fd, 22397 }, /* rightarrow */ - { 0x000008fe, 11332 }, /* downarrow */ - { 0x000009df, 3410 }, /* blank */ - { 0x000009e0, 23790 }, /* soliddiamond */ - { 0x000009e1, 8603 }, /* checkerboard */ - { 0x000009e2, 17043 }, /* ht */ - { 0x000009e3, 12413 }, /* ff */ - { 0x000009e4, 8727 }, /* cr */ - { 0x000009e5, 19431 }, /* lf */ - { 0x000009e8, 20075 }, /* nl */ - { 0x000009e9, 26542 }, /* vt */ - { 0x000009ea, 19502 }, /* lowrightcorner */ - { 0x000009eb, 26416 }, /* uprightcorner */ - { 0x000009ec, 26403 }, /* upleftcorner */ - { 0x000009ed, 19488 }, /* lowleftcorner */ - { 0x000009ee, 8730 }, /* crossinglines */ - { 0x000009ef, 16682 }, /* horizlinescan1 */ - { 0x000009f0, 16697 }, /* horizlinescan3 */ - { 0x000009f1, 16712 }, /* horizlinescan5 */ - { 0x000009f2, 16727 }, /* horizlinescan7 */ - { 0x000009f3, 16742 }, /* horizlinescan9 */ - { 0x000009f4, 19397 }, /* leftt */ - { 0x000009f5, 22545 }, /* rightt */ - { 0x000009f6, 3533 }, /* bott */ - { 0x000009f7, 25721 }, /* topt */ - { 0x000009f8, 26497 }, /* vertbar */ - { 0x00000aa1, 11928 }, /* emspace */ - { 0x00000aa2, 12027 }, /* enspace */ - { 0x00000aa3, 11821 }, /* em3space */ - { 0x00000aa4, 11830 }, /* em4space */ - { 0x00000aa5, 11221 }, /* digitspace */ - { 0x00000aa6, 22145 }, /* punctspace */ - { 0x00000aa7, 25489 }, /* thinspace */ - { 0x00000aa8, 14382 }, /* hairspace */ - { 0x00000aa9, 11855 }, /* emdash */ - { 0x00000aaa, 11940 }, /* endash */ - { 0x00000aac, 22987 }, /* signifblank */ - { 0x00000aae, 11812 }, /* ellipsis */ - { 0x00000aaf, 11267 }, /* doubbaselinedot */ - { 0x00000ab0, 20767 }, /* onethird */ - { 0x00000ab1, 25837 }, /* twothirds */ - { 0x00000ab2, 20705 }, /* onefifth */ - { 0x00000ab3, 25802 }, /* twofifths */ - { 0x00000ab4, 25530 }, /* threefifths */ - { 0x00000ab5, 12607 }, /* fourfifths */ - { 0x00000ab6, 20733 }, /* onesixth */ - { 0x00000ab7, 12569 }, /* fivesixths */ - { 0x00000ab8, 8506 }, /* careof */ - { 0x00000abb, 12427 }, /* figdash */ - { 0x00000abc, 19249 }, /* leftanglebracket */ - { 0x00000abd, 11140 }, /* decimalpoint */ - { 0x00000abe, 22379 }, /* rightanglebracket */ - { 0x00000abf, 19681 }, /* marker */ - { 0x00000ac3, 20695 }, /* oneeighth */ - { 0x00000ac4, 25517 }, /* threeeighths */ - { 0x00000ac5, 12557 }, /* fiveeighths */ - { 0x00000ac6, 22904 }, /* seveneighths */ - { 0x00000ac9, 25760 }, /* trademark */ - { 0x00000aca, 22973 }, /* signaturemark */ - { 0x00000acb, 25770 }, /* trademarkincircle */ - { 0x00000acc, 19327 }, /* leftopentriangle */ - { 0x00000acd, 22483 }, /* rightopentriangle */ - { 0x00000ace, 11890 }, /* emopencircle */ - { 0x00000acf, 11903 }, /* emopenrectangle */ - { 0x00000ad0, 19377 }, /* leftsinglequotemark */ - { 0x00000ad1, 22524 }, /* rightsinglequotemark */ - { 0x00000ad2, 19286 }, /* leftdoublequotemark */ - { 0x00000ad3, 22419 }, /* rightdoublequotemark */ - { 0x00000ad4, 22067 }, /* prescription */ - { 0x00000ad5, 21517 }, /* permille */ - { 0x00000ad6, 19739 }, /* minutes */ - { 0x00000ad7, 22711 }, /* seconds */ - { 0x00000ad9, 19181 }, /* latincross */ - { 0x00000ada, 16626 }, /* hexagram */ - { 0x00000adb, 12455 }, /* filledrectbullet */ - { 0x00000adc, 12435 }, /* filledlefttribullet */ - { 0x00000add, 12472 }, /* filledrighttribullet */ - { 0x00000ade, 11862 }, /* emfilledcircle */ - { 0x00000adf, 11877 }, /* emfilledrect */ - { 0x00000ae0, 11991 }, /* enopencircbullet */ - { 0x00000ae1, 12008 }, /* enopensquarebullet */ - { 0x00000ae2, 20794 }, /* openrectbullet */ - { 0x00000ae3, 20836 }, /* opentribulletup */ - { 0x00000ae4, 20818 }, /* opentribulletdown */ - { 0x00000ae5, 20809 }, /* openstar */ - { 0x00000ae6, 11947 }, /* enfilledcircbullet */ - { 0x00000ae7, 11966 }, /* enfilledsqbullet */ - { 0x00000ae8, 12513 }, /* filledtribulletup */ - { 0x00000ae9, 12493 }, /* filledtribulletdown */ - { 0x00000aea, 19344 }, /* leftpointer */ - { 0x00000aeb, 22501 }, /* rightpointer */ - { 0x00000aec, 8649 }, /* club */ - { 0x00000aed, 11213 }, /* diamond */ - { 0x00000aee, 16080 }, /* heart */ - { 0x00000af0, 19668 }, /* maltesecross */ - { 0x00000af1, 10358 }, /* dagger */ - { 0x00000af2, 11295 }, /* doubledagger */ - { 0x00000af3, 8616 }, /* checkmark */ - { 0x00000af4, 3380 }, /* ballotcross */ - { 0x00000af5, 19860 }, /* musicalsharp */ - { 0x00000af6, 19848 }, /* musicalflat */ - { 0x00000af7, 19657 }, /* malesymbol */ - { 0x00000af8, 12400 }, /* femalesymbol */ - { 0x00000af9, 24354 }, /* telephone */ - { 0x00000afa, 24364 }, /* telephonerecorder */ - { 0x00000afb, 21537 }, /* phonographcopyright */ - { 0x00000afc, 8513 }, /* caret */ - { 0x00000afd, 23028 }, /* singlelowquotemark */ - { 0x00000afe, 11308 }, /* doublelowquotemark */ - { 0x00000aff, 8775 }, /* cursor */ - { 0x00000ba3, 19276 }, /* leftcaret */ - { 0x00000ba6, 22408 }, /* rightcaret */ - { 0x00000ba8, 11342 }, /* downcaret */ - { 0x00000ba9, 26395 }, /* upcaret */ - { 0x00000bc0, 21324 }, /* overbar */ - { 0x00000bc2, 11371 }, /* downtack */ - { 0x00000bc3, 26430 }, /* upshoe */ - { 0x00000bc4, 11361 }, /* downstile */ - { 0x00000bc6, 26337 }, /* underbar */ - { 0x00000bca, 18142 }, /* jot */ - { 0x00000bcc, 22160 }, /* quad */ - { 0x00000bce, 26445 }, /* uptack */ - { 0x00000bcf, 8626 }, /* circle */ - { 0x00000bd3, 26437 }, /* upstile */ - { 0x00000bd6, 11352 }, /* downshoe */ - { 0x00000bd8, 22514 }, /* rightshoe */ - { 0x00000bda, 19368 }, /* leftshoe */ - { 0x00000bdc, 19403 }, /* lefttack */ - { 0x00000bfc, 22552 }, /* righttack */ - { 0x00000cdf, 16173 }, /* hebrew_doublelowline */ - { 0x00000ce0, 16086 }, /* hebrew_aleph */ - { 0x00000ce1, 16111 }, /* hebrew_bet */ - { 0x00000ce2, 16292 }, /* hebrew_gimel */ - { 0x00000ce3, 16146 }, /* hebrew_dalet */ - { 0x00000ce4, 16319 }, /* hebrew_he */ - { 0x00000ce5, 16531 }, /* hebrew_waw */ - { 0x00000ce6, 16577 }, /* hebrew_zain */ - { 0x00000ce7, 16134 }, /* hebrew_chet */ - { 0x00000ce8, 16508 }, /* hebrew_tet */ - { 0x00000ce9, 16542 }, /* hebrew_yod */ - { 0x00000cea, 16194 }, /* hebrew_finalkaph */ - { 0x00000ceb, 16340 }, /* hebrew_kaph */ - { 0x00000cec, 16363 }, /* hebrew_lamed */ - { 0x00000ced, 16211 }, /* hebrew_finalmem */ - { 0x00000cee, 16376 }, /* hebrew_mem */ - { 0x00000cef, 16227 }, /* hebrew_finalnun */ - { 0x00000cf0, 16387 }, /* hebrew_nun */ - { 0x00000cf1, 16432 }, /* hebrew_samech */ - { 0x00000cf2, 16099 }, /* hebrew_ayin */ - { 0x00000cf3, 16243 }, /* hebrew_finalpe */ - { 0x00000cf4, 16398 }, /* hebrew_pe */ - { 0x00000cf5, 16258 }, /* hebrew_finalzade */ - { 0x00000cf6, 16553 }, /* hebrew_zade */ - { 0x00000cf7, 16408 }, /* hebrew_qoph */ - { 0x00000cf8, 16420 }, /* hebrew_resh */ - { 0x00000cf9, 16460 }, /* hebrew_shin */ - { 0x00000cfa, 16497 }, /* hebrew_taw */ - { 0x00000da1, 24617 }, /* Thai_kokai */ - { 0x00000da2, 24547 }, /* Thai_khokhai */ - { 0x00000da3, 24573 }, /* Thai_khokhuat */ - { 0x00000da4, 24587 }, /* Thai_khokhwai */ - { 0x00000da5, 24560 }, /* Thai_khokhon */ - { 0x00000da6, 24601 }, /* Thai_khorakhang */ - { 0x00000da7, 24930 }, /* Thai_ngongu */ - { 0x00000da8, 24423 }, /* Thai_chochan */ - { 0x00000da9, 24450 }, /* Thai_choching */ - { 0x00000daa, 24436 }, /* Thai_chochang */ - { 0x00000dab, 25291 }, /* Thai_soso */ - { 0x00000dac, 24464 }, /* Thai_chochoe */ - { 0x00000dad, 25467 }, /* Thai_yoying */ - { 0x00000dae, 24477 }, /* Thai_dochada */ - { 0x00000daf, 25420 }, /* Thai_topatak */ - { 0x00000db0, 25379 }, /* Thai_thothan */ - { 0x00000db1, 25329 }, /* Thai_thonangmontho */ - { 0x00000db2, 25348 }, /* Thai_thophuthao */ - { 0x00000db3, 24956 }, /* Thai_nonen */ - { 0x00000db4, 24490 }, /* Thai_dodek */ - { 0x00000db5, 25433 }, /* Thai_totao */ - { 0x00000db6, 25406 }, /* Thai_thothung */ - { 0x00000db7, 25364 }, /* Thai_thothahan */ - { 0x00000db8, 25392 }, /* Thai_thothong */ - { 0x00000db9, 24967 }, /* Thai_nonu */ - { 0x00000dba, 24409 }, /* Thai_bobaimai */ - { 0x00000dbb, 25058 }, /* Thai_popla */ - { 0x00000dbc, 25028 }, /* Thai_phophung */ - { 0x00000dbd, 24501 }, /* Thai_fofa */ - { 0x00000dbe, 25015 }, /* Thai_phophan */ - { 0x00000dbf, 24511 }, /* Thai_fofan */ - { 0x00000dc0, 25042 }, /* Thai_phosamphao */ - { 0x00000dc1, 24920 }, /* Thai_moma */ - { 0x00000dc2, 25456 }, /* Thai_yoyak */ - { 0x00000dc3, 25069 }, /* Thai_rorua */ - { 0x00000dc4, 25080 }, /* Thai_ru */ - { 0x00000dc5, 24780 }, /* Thai_loling */ - { 0x00000dc6, 24792 }, /* Thai_lu */ - { 0x00000dc7, 25444 }, /* Thai_wowaen */ - { 0x00000dc8, 25279 }, /* Thai_sosala */ - { 0x00000dc9, 25267 }, /* Thai_sorusi */ - { 0x00000dca, 25301 }, /* Thai_sosua */ - { 0x00000dcb, 24522 }, /* Thai_hohip */ - { 0x00000dcc, 24767 }, /* Thai_lochula */ - { 0x00000dcd, 24977 }, /* Thai_oang */ - { 0x00000dce, 24533 }, /* Thai_honokhuk */ - { 0x00000dcf, 24987 }, /* Thai_paiyannoi */ - { 0x00000dd0, 25088 }, /* Thai_saraa */ - { 0x00000dd1, 24828 }, /* Thai_maihanakat */ - { 0x00000dd2, 25099 }, /* Thai_saraaa */ - { 0x00000dd3, 25162 }, /* Thai_saraam */ - { 0x00000dd4, 25185 }, /* Thai_sarai */ - { 0x00000dd5, 25196 }, /* Thai_saraii */ - { 0x00000dd6, 25230 }, /* Thai_saraue */ - { 0x00000dd7, 25242 }, /* Thai_sarauee */ - { 0x00000dd8, 25219 }, /* Thai_sarau */ - { 0x00000dd9, 25255 }, /* Thai_sarauu */ - { 0x00000dda, 25002 }, /* Thai_phinthu */ - { 0x00000dde, 24844 }, /* Thai_maihanakat_maitho */ - { 0x00000ddf, 24399 }, /* Thai_baht */ - { 0x00000de0, 25174 }, /* Thai_sarae */ - { 0x00000de1, 25111 }, /* Thai_saraae */ - { 0x00000de2, 25208 }, /* Thai_sarao */ - { 0x00000de3, 25143 }, /* Thai_saraaimaimuan */ - { 0x00000de4, 25123 }, /* Thai_saraaimaimalai */ - { 0x00000de5, 24628 }, /* Thai_lakkhangyao */ - { 0x00000de6, 24906 }, /* Thai_maiyamok */ - { 0x00000de7, 24867 }, /* Thai_maitaikhu */ - { 0x00000de8, 24817 }, /* Thai_maiek */ - { 0x00000de9, 24882 }, /* Thai_maitho */ - { 0x00000dea, 24894 }, /* Thai_maitri */ - { 0x00000deb, 24800 }, /* Thai_maichattawa */ - { 0x00000dec, 25312 }, /* Thai_thanthakhat */ - { 0x00000ded, 24942 }, /* Thai_nikhahit */ - { 0x00000df0, 24755 }, /* Thai_leksun */ - { 0x00000df1, 24693 }, /* Thai_leknung */ - { 0x00000df2, 24742 }, /* Thai_leksong */ - { 0x00000df3, 24719 }, /* Thai_leksam */ - { 0x00000df4, 24731 }, /* Thai_leksi */ - { 0x00000df5, 24658 }, /* Thai_lekha */ - { 0x00000df6, 24669 }, /* Thai_lekhok */ - { 0x00000df7, 24645 }, /* Thai_lekchet */ - { 0x00000df8, 24706 }, /* Thai_lekpaet */ - { 0x00000df9, 24681 }, /* Thai_lekkao */ - { 0x00000ea1, 15181 }, /* Hangul_Kiyeog */ - { 0x00000ea2, 15726 }, /* Hangul_SsangKiyeog */ - { 0x00000ea3, 15195 }, /* Hangul_KiyeogSios */ - { 0x00000ea4, 15276 }, /* Hangul_Nieun */ - { 0x00000ea5, 15307 }, /* Hangul_NieunJieuj */ - { 0x00000ea6, 15289 }, /* Hangul_NieunHieuh */ - { 0x00000ea7, 14488 }, /* Hangul_Dikeud */ - { 0x00000ea8, 15689 }, /* Hangul_SsangDikeud */ - { 0x00000ea9, 15461 }, /* Hangul_Rieul */ - { 0x00000eaa, 15492 }, /* Hangul_RieulKiyeog */ - { 0x00000eab, 15511 }, /* Hangul_RieulMieum */ - { 0x00000eac, 15548 }, /* Hangul_RieulPieub */ - { 0x00000ead, 15566 }, /* Hangul_RieulSios */ - { 0x00000eae, 15583 }, /* Hangul_RieulTieut */ - { 0x00000eaf, 15529 }, /* Hangul_RieulPhieuf */ - { 0x00000eb0, 15474 }, /* Hangul_RieulHieuh */ - { 0x00000eb1, 15238 }, /* Hangul_Mieum */ - { 0x00000eb2, 15373 }, /* Hangul_Pieub */ - { 0x00000eb3, 15745 }, /* Hangul_SsangPieub */ - { 0x00000eb4, 15386 }, /* Hangul_PieubSios */ - { 0x00000eb5, 15662 }, /* Hangul_Sios */ - { 0x00000eb6, 15763 }, /* Hangul_SsangSios */ - { 0x00000eb7, 14577 }, /* Hangul_Ieung */ - { 0x00000eb8, 15154 }, /* Hangul_Jieuj */ - { 0x00000eb9, 15708 }, /* Hangul_SsangJieuj */ - { 0x00000eba, 14458 }, /* Hangul_Cieuc */ - { 0x00000ebb, 15167 }, /* Hangul_Khieuq */ - { 0x00000ebc, 15883 }, /* Hangul_Tieut */ - { 0x00000ebd, 15359 }, /* Hangul_Phieuf */ - { 0x00000ebe, 14555 }, /* Hangul_Hieuh */ - { 0x00000ebf, 14399 }, /* Hangul_A */ - { 0x00000ec0, 14408 }, /* Hangul_AE */ - { 0x00000ec1, 15957 }, /* Hangul_YA */ - { 0x00000ec2, 15967 }, /* Hangul_YAE */ - { 0x00000ec3, 14522 }, /* Hangul_EO */ - { 0x00000ec4, 14502 }, /* Hangul_E */ - { 0x00000ec5, 15988 }, /* Hangul_YEO */ - { 0x00000ec6, 15978 }, /* Hangul_YE */ - { 0x00000ec7, 15325 }, /* Hangul_O */ - { 0x00000ec8, 15905 }, /* Hangul_WA */ - { 0x00000ec9, 15915 }, /* Hangul_WAE */ - { 0x00000eca, 15334 }, /* Hangul_OE */ - { 0x00000ecb, 16028 }, /* Hangul_YO */ - { 0x00000ecc, 15896 }, /* Hangul_U */ - { 0x00000ecd, 15936 }, /* Hangul_WEO */ - { 0x00000ece, 15926 }, /* Hangul_WE */ - { 0x00000ecf, 15947 }, /* Hangul_WI */ - { 0x00000ed0, 16038 }, /* Hangul_YU */ - { 0x00000ed1, 14532 }, /* Hangul_EU */ - { 0x00000ed2, 16018 }, /* Hangul_YI */ - { 0x00000ed3, 14568 }, /* Hangul_I */ - { 0x00000ed4, 14682 }, /* Hangul_J_Kiyeog */ - { 0x00000ed5, 15052 }, /* Hangul_J_SsangKiyeog */ - { 0x00000ed6, 14698 }, /* Hangul_J_KiyeogSios */ - { 0x00000ed7, 14760 }, /* Hangul_J_Nieun */ - { 0x00000ed8, 14795 }, /* Hangul_J_NieunJieuj */ - { 0x00000ed9, 14775 }, /* Hangul_J_NieunHieuh */ - { 0x00000eda, 14605 }, /* Hangul_J_Dikeud */ - { 0x00000edb, 14882 }, /* Hangul_J_Rieul */ - { 0x00000edc, 14917 }, /* Hangul_J_RieulKiyeog */ - { 0x00000edd, 14938 }, /* Hangul_J_RieulMieum */ - { 0x00000ede, 14979 }, /* Hangul_J_RieulPieub */ - { 0x00000edf, 14999 }, /* Hangul_J_RieulSios */ - { 0x00000ee0, 15018 }, /* Hangul_J_RieulTieut */ - { 0x00000ee1, 14958 }, /* Hangul_J_RieulPhieuf */ - { 0x00000ee2, 14897 }, /* Hangul_J_RieulHieuh */ - { 0x00000ee3, 14745 }, /* Hangul_J_Mieum */ - { 0x00000ee4, 14848 }, /* Hangul_J_Pieub */ - { 0x00000ee5, 14863 }, /* Hangul_J_PieubSios */ - { 0x00000ee6, 15038 }, /* Hangul_J_Sios */ - { 0x00000ee7, 15073 }, /* Hangul_J_SsangSios */ - { 0x00000ee8, 14636 }, /* Hangul_J_Ieung */ - { 0x00000ee9, 14651 }, /* Hangul_J_Jieuj */ - { 0x00000eea, 14590 }, /* Hangul_J_Cieuc */ - { 0x00000eeb, 14666 }, /* Hangul_J_Khieuq */ - { 0x00000eec, 15092 }, /* Hangul_J_Tieut */ - { 0x00000eed, 14832 }, /* Hangul_J_Phieuf */ - { 0x00000eee, 14621 }, /* Hangul_J_Hieuh */ - { 0x00000eef, 15601 }, /* Hangul_RieulYeorinHieuh */ - { 0x00000ef0, 15793 }, /* Hangul_SunkyeongeumMieum */ - { 0x00000ef1, 15844 }, /* Hangul_SunkyeongeumPieub */ - { 0x00000ef2, 15344 }, /* Hangul_PanSios */ - { 0x00000ef3, 15213 }, /* Hangul_KkogjiDalrinIeung */ - { 0x00000ef4, 15818 }, /* Hangul_SunkyeongeumPhieuf */ - { 0x00000ef5, 15999 }, /* Hangul_YeorinHieuh */ - { 0x00000ef6, 14418 }, /* Hangul_AraeA */ - { 0x00000ef7, 14431 }, /* Hangul_AraeAE */ - { 0x00000ef8, 14815 }, /* Hangul_J_PanSios */ - { 0x00000ef9, 14718 }, /* Hangul_J_KkogjiDalrinIeung */ - { 0x00000efa, 15107 }, /* Hangul_J_YeorinHieuh */ - { 0x00000eff, 18797 }, /* Korean_Won */ - { 0x000013bc, 20514 }, /* OE */ - { 0x000013bd, 20517 }, /* oe */ - { 0x000013be, 29094 }, /* Ydiaeresis */ - { 0x000020ac, 12090 }, /* EuroSign */ - { 0x0000fd01, 125 }, /* 3270_Duplicate */ - { 0x0000fd02, 195 }, /* 3270_FieldMark */ - { 0x0000fd03, 343 }, /* 3270_Right2 */ - { 0x0000fd04, 245 }, /* 3270_Left2 */ - { 0x0000fd05, 33 }, /* 3270_BackTab */ - { 0x0000fd06, 151 }, /* 3270_EraseEOF */ - { 0x0000fd07, 165 }, /* 3270_EraseInput */ - { 0x0000fd08, 332 }, /* 3270_Reset */ - { 0x0000fd09, 310 }, /* 3270_Quit */ - { 0x0000fd0a, 256 }, /* 3270_PA1 */ - { 0x0000fd0b, 265 }, /* 3270_PA2 */ - { 0x0000fd0c, 274 }, /* 3270_PA3 */ - { 0x0000fd0d, 376 }, /* 3270_Test */ - { 0x0000fd0e, 23 }, /* 3270_Attn */ - { 0x0000fd0f, 74 }, /* 3270_CursorBlink */ - { 0x0000fd10, 8 }, /* 3270_AltCursor */ - { 0x0000fd11, 231 }, /* 3270_KeyClick */ - { 0x0000fd12, 221 }, /* 3270_Jump */ - { 0x0000fd13, 210 }, /* 3270_Ident */ - { 0x0000fd14, 355 }, /* 3270_Rule */ - { 0x0000fd15, 64 }, /* 3270_Copy */ - { 0x0000fd16, 283 }, /* 3270_Play */ - { 0x0000fd17, 365 }, /* 3270_Setup */ - { 0x0000fd18, 320 }, /* 3270_Record */ - { 0x0000fd19, 46 }, /* 3270_ChangeScreen */ - { 0x0000fd1a, 109 }, /* 3270_DeleteWord */ - { 0x0000fd1b, 181 }, /* 3270_ExSelect */ - { 0x0000fd1c, 91 }, /* 3270_CursorSelect */ - { 0x0000fd1d, 293 }, /* 3270_PrintScreen */ - { 0x0000fd1e, 140 }, /* 3270_Enter */ - { 0x0000fe01, 17781 }, /* ISO_Lock */ - { 0x0000fe02, 17664 }, /* ISO_Level2_Latch */ - { 0x0000fe03, 17714 }, /* ISO_Level3_Shift */ - { 0x0000fe04, 17681 }, /* ISO_Level3_Latch */ - { 0x0000fe05, 17698 }, /* ISO_Level3_Lock */ - { 0x0000fe06, 17569 }, /* ISO_Group_Latch */ - { 0x0000fe07, 17585 }, /* ISO_Group_Lock */ - { 0x0000fe08, 17826 }, /* ISO_Next_Group */ - { 0x0000fe09, 17841 }, /* ISO_Next_Group_Lock */ - { 0x0000fe0a, 17950 }, /* ISO_Prev_Group */ - { 0x0000fe0b, 17965 }, /* ISO_Prev_Group_Lock */ - { 0x0000fe0c, 17532 }, /* ISO_First_Group */ - { 0x0000fe0d, 17548 }, /* ISO_First_Group_Lock */ - { 0x0000fe0e, 17616 }, /* ISO_Last_Group */ - { 0x0000fe0f, 17631 }, /* ISO_Last_Group_Lock */ - { 0x0000fe11, 17764 }, /* ISO_Level5_Shift */ - { 0x0000fe12, 17731 }, /* ISO_Level5_Latch */ - { 0x0000fe13, 17748 }, /* ISO_Level5_Lock */ - { 0x0000fe20, 17651 }, /* ISO_Left_Tab */ - { 0x0000fe21, 17809 }, /* ISO_Move_Line_Up */ - { 0x0000fe22, 17790 }, /* ISO_Move_Line_Down */ - { 0x0000fe23, 17883 }, /* ISO_Partial_Line_Up */ - { 0x0000fe24, 17861 }, /* ISO_Partial_Line_Down */ - { 0x0000fe25, 17903 }, /* ISO_Partial_Space_Left */ - { 0x0000fe26, 17926 }, /* ISO_Partial_Space_Right */ - { 0x0000fe27, 18059 }, /* ISO_Set_Margin_Left */ - { 0x0000fe28, 18079 }, /* ISO_Set_Margin_Right */ - { 0x0000fe29, 18010 }, /* ISO_Release_Margin_Left */ - { 0x0000fe2a, 18034 }, /* ISO_Release_Margin_Right */ - { 0x0000fe2b, 17985 }, /* ISO_Release_Both_Margins */ - { 0x0000fe2c, 17470 }, /* ISO_Fast_Cursor_Left */ - { 0x0000fe2d, 17491 }, /* ISO_Fast_Cursor_Right */ - { 0x0000fe2e, 17513 }, /* ISO_Fast_Cursor_Up */ - { 0x0000fe2f, 17449 }, /* ISO_Fast_Cursor_Down */ - { 0x0000fe30, 17372 }, /* ISO_Continuous_Underline */ - { 0x0000fe31, 17397 }, /* ISO_Discontinuous_Underline */ - { 0x0000fe32, 17425 }, /* ISO_Emphasize */ - { 0x0000fe33, 17354 }, /* ISO_Center_Object */ - { 0x0000fe34, 17439 }, /* ISO_Enter */ - { 0x0000fe50, 10858 }, /* dead_grave */ - { 0x0000fe51, 10531 }, /* dead_acute */ - { 0x0000fe52, 10754 }, /* dead_circumflex */ - { 0x0000fe53, 11097 }, /* dead_tilde */ - { 0x0000fe54, 10980 }, /* dead_macron */ - { 0x0000fe55, 10700 }, /* dead_breve */ - { 0x0000fe56, 10455 }, /* dead_abovedot */ - { 0x0000fe57, 10795 }, /* dead_diaeresis */ - { 0x0000fe58, 10493 }, /* dead_abovering */ - { 0x0000fe59, 10810 }, /* dead_doubleacute */ - { 0x0000fe5a, 10730 }, /* dead_caron */ - { 0x0000fe5b, 10741 }, /* dead_cedilla */ - { 0x0000fe5c, 11006 }, /* dead_ogonek */ - { 0x0000fe5d, 10933 }, /* dead_iota */ - { 0x0000fe5e, 11122 }, /* dead_voiced_sound */ - { 0x0000fe5f, 11046 }, /* dead_semivoiced_sound */ - { 0x0000fe60, 10615 }, /* dead_belowdot */ - { 0x0000fe61, 10880 }, /* dead_hook */ - { 0x0000fe62, 10890 }, /* dead_horn */ - { 0x0000fe63, 11085 }, /* dead_stroke */ - { 0x0000fe64, 10439 }, /* dead_abovecomma */ - { 0x0000fe65, 10469 }, /* dead_abovereversedcomma */ - { 0x0000fe66, 10827 }, /* dead_doublegrave */ - { 0x0000fe67, 10646 }, /* dead_belowring */ - { 0x0000fe68, 10629 }, /* dead_belowmacron */ - { 0x0000fe69, 10558 }, /* dead_belowcircumflex */ - { 0x0000fe6a, 10661 }, /* dead_belowtilde */ - { 0x0000fe6b, 10542 }, /* dead_belowbreve */ - { 0x0000fe6c, 10595 }, /* dead_belowdiaeresis */ - { 0x0000fe6d, 10914 }, /* dead_invertedbreve */ - { 0x0000fe6e, 10579 }, /* dead_belowcomma */ - { 0x0000fe6f, 10770 }, /* dead_currency */ - { 0x0000fe70, 583 }, /* AccessX_Enable */ - { 0x0000fe71, 598 }, /* AccessX_Feedback_Enable */ - { 0x0000fe72, 22342 }, /* RepeatKeys_Enable */ - { 0x0000fe73, 23774 }, /* SlowKeys_Enable */ - { 0x0000fe74, 3564 }, /* BounceKeys_Enable */ - { 0x0000fe75, 23836 }, /* StickyKeys_Enable */ - { 0x0000fe76, 19782 }, /* MouseKeys_Enable */ - { 0x0000fe77, 19759 }, /* MouseKeys_Accel_Enable */ - { 0x0000fe78, 21332 }, /* Overlay1_Enable */ - { 0x0000fe79, 21348 }, /* Overlay2_Enable */ - { 0x0000fe7a, 3309 }, /* AudibleBell_Enable */ - { 0x0000fe80, 10425 }, /* dead_a */ - { 0x0000fe81, 10432 }, /* dead_A */ - { 0x0000fe82, 10844 }, /* dead_e */ - { 0x0000fe83, 10851 }, /* dead_E */ - { 0x0000fe84, 10900 }, /* dead_i */ - { 0x0000fe85, 10907 }, /* dead_I */ - { 0x0000fe86, 10992 }, /* dead_o */ - { 0x0000fe87, 10999 }, /* dead_O */ - { 0x0000fe88, 11108 }, /* dead_u */ - { 0x0000fe89, 11115 }, /* dead_U */ - { 0x0000fe8a, 11068 }, /* dead_small_schwa */ - { 0x0000fe8b, 10711 }, /* dead_capital_schwa */ - { 0x0000fe8c, 10869 }, /* dead_greek */ - { 0x0000fe90, 10967 }, /* dead_lowline */ - { 0x0000fe91, 10508 }, /* dead_aboveverticalline */ - { 0x0000fe92, 10677 }, /* dead_belowverticalline */ - { 0x0000fe93, 10943 }, /* dead_longsolidusoverlay */ - { 0x0000fea0, 8594 }, /* ch */ - { 0x0000fea1, 8597 }, /* Ch */ - { 0x0000fea2, 8600 }, /* CH */ - { 0x0000fea3, 8443 }, /* c_h */ - { 0x0000fea4, 8447 }, /* C_h */ - { 0x0000fea5, 8451 }, /* C_H */ - { 0x0000fed0, 12536 }, /* First_Virtual_Screen */ - { 0x0000fed1, 22080 }, /* Prev_Virtual_Screen */ - { 0x0000fed2, 20028 }, /* Next_Virtual_Screen */ - { 0x0000fed4, 19161 }, /* Last_Virtual_Screen */ - { 0x0000fed5, 24382 }, /* Terminate_Server */ - { 0x0000fee0, 21998 }, /* Pointer_Left */ - { 0x0000fee1, 22011 }, /* Pointer_Right */ - { 0x0000fee2, 22025 }, /* Pointer_Up */ - { 0x0000fee3, 21843 }, /* Pointer_Down */ - { 0x0000fee4, 22036 }, /* Pointer_UpLeft */ - { 0x0000fee5, 22051 }, /* Pointer_UpRight */ - { 0x0000fee6, 21856 }, /* Pointer_DownLeft */ - { 0x0000fee7, 21873 }, /* Pointer_DownRight */ - { 0x0000fee8, 21671 }, /* Pointer_Button_Dflt */ - { 0x0000fee9, 21591 }, /* Pointer_Button1 */ - { 0x0000feea, 21607 }, /* Pointer_Button2 */ - { 0x0000feeb, 21623 }, /* Pointer_Button3 */ - { 0x0000feec, 21639 }, /* Pointer_Button4 */ - { 0x0000feed, 21655 }, /* Pointer_Button5 */ - { 0x0000feee, 21781 }, /* Pointer_DblClick_Dflt */ - { 0x0000feef, 21691 }, /* Pointer_DblClick1 */ - { 0x0000fef0, 21709 }, /* Pointer_DblClick2 */ - { 0x0000fef1, 21727 }, /* Pointer_DblClick3 */ - { 0x0000fef2, 21745 }, /* Pointer_DblClick4 */ - { 0x0000fef3, 21763 }, /* Pointer_DblClick5 */ - { 0x0000fef4, 21961 }, /* Pointer_Drag_Dflt */ - { 0x0000fef5, 21891 }, /* Pointer_Drag1 */ - { 0x0000fef6, 21905 }, /* Pointer_Drag2 */ - { 0x0000fef7, 21919 }, /* Pointer_Drag3 */ - { 0x0000fef8, 21933 }, /* Pointer_Drag4 */ - { 0x0000fef9, 21979 }, /* Pointer_EnableKeys */ - { 0x0000fefa, 21572 }, /* Pointer_Accelerate */ - { 0x0000fefb, 21803 }, /* Pointer_DfltBtnNext */ - { 0x0000fefc, 21823 }, /* Pointer_DfltBtnPrev */ - { 0x0000fefd, 21947 }, /* Pointer_Drag5 */ - { 0x0000ff08, 3362 }, /* BackSpace */ - { 0x0000ff09, 24298 }, /* Tab */ - { 0x0000ff0a, 19434 }, /* Linefeed */ - { 0x0000ff0b, 8633 }, /* Clear */ - { 0x0000ff0d, 22366 }, /* Return */ - { 0x0000ff13, 21481 }, /* Pause */ - { 0x0000ff14, 22699 }, /* Scroll_Lock */ - { 0x0000ff15, 24279 }, /* Sys_Req */ - { 0x0000ff1b, 12057 }, /* Escape */ - { 0x0000ff20, 19811 }, /* Multi_key */ - { 0x0000ff21, 18745 }, /* Kanji */ - { 0x0000ff22, 19802 }, /* Muhenkan */ - { 0x0000ff23, 16614 }, /* Henkan_Mode */ - { 0x0000ff24, 22562 }, /* Romaji */ - { 0x0000ff25, 16635 }, /* Hiragana */ - { 0x0000ff26, 18770 }, /* Katakana */ - { 0x0000ff27, 16644 }, /* Hiragana_Katakana */ - { 0x0000ff28, 29210 }, /* Zenkaku */ - { 0x0000ff29, 16048 }, /* Hankaku */ - { 0x0000ff2a, 29218 }, /* Zenkaku_Hankaku */ - { 0x0000ff2b, 25752 }, /* Touroku */ - { 0x0000ff2c, 19698 }, /* Massyo */ - { 0x0000ff2d, 18351 }, /* Kana_Lock */ - { 0x0000ff2e, 18562 }, /* Kana_Shift */ - { 0x0000ff2f, 11779 }, /* Eisu_Shift */ - { 0x0000ff30, 11790 }, /* Eisu_toggle */ - { 0x0000ff31, 14392 }, /* Hangul */ - { 0x0000ff32, 15780 }, /* Hangul_Start */ - { 0x0000ff33, 14511 }, /* Hangul_End */ - { 0x0000ff34, 14542 }, /* Hangul_Hanja */ - { 0x0000ff35, 15128 }, /* Hangul_Jamo */ - { 0x0000ff36, 15625 }, /* Hangul_Romaja */ - { 0x0000ff37, 8654 }, /* Codeinput */ - { 0x0000ff38, 15140 }, /* Hangul_Jeonja */ - { 0x0000ff39, 14445 }, /* Hangul_Banja */ - { 0x0000ff3a, 15420 }, /* Hangul_PreHanja */ - { 0x0000ff3b, 15403 }, /* Hangul_PostHanja */ - { 0x0000ff3c, 23012 }, /* SingleCandidate */ - { 0x0000ff3d, 19821 }, /* MultipleCandidate */ - { 0x0000ff3e, 22100 }, /* PreviousCandidate */ - { 0x0000ff3f, 15674 }, /* Hangul_Special */ - { 0x0000ff50, 16662 }, /* Home */ - { 0x0000ff51, 19244 }, /* Left */ - { 0x0000ff52, 26384 }, /* Up */ - { 0x0000ff53, 22373 }, /* Right */ - { 0x0000ff54, 11327 }, /* Down */ - { 0x0000ff55, 22124 }, /* Prior */ - { 0x0000ff56, 20023 }, /* Next */ - { 0x0000ff57, 11936 }, /* End */ - { 0x0000ff58, 3404 }, /* Begin */ - { 0x0000ff60, 22727 }, /* Select */ - { 0x0000ff61, 22118 }, /* Print */ - { 0x0000ff62, 12117 }, /* Execute */ - { 0x0000ff63, 17284 }, /* Insert */ - { 0x0000ff65, 26357 }, /* Undo */ - { 0x0000ff66, 22326 }, /* Redo */ - { 0x0000ff67, 19705 }, /* Menu */ - { 0x0000ff68, 12531 }, /* Find */ - { 0x0000ff69, 8489 }, /* Cancel */ - { 0x0000ff6a, 16602 }, /* Help */ - { 0x0000ff6b, 8377 }, /* Break */ - { 0x0000ff7e, 19747 }, /* Mode_switch */ - { 0x0000ff7f, 20169 }, /* Num_Lock */ - { 0x0000ff80, 19074 }, /* KP_Space */ - { 0x0000ff89, 19095 }, /* KP_Tab */ - { 0x0000ff8d, 18931 }, /* KP_Enter */ - { 0x0000ff91, 18949 }, /* KP_F1 */ - { 0x0000ff92, 18955 }, /* KP_F2 */ - { 0x0000ff93, 18961 }, /* KP_F3 */ - { 0x0000ff94, 18967 }, /* KP_F4 */ - { 0x0000ff95, 18973 }, /* KP_Home */ - { 0x0000ff96, 18991 }, /* KP_Left */ - { 0x0000ff97, 19102 }, /* KP_Up */ - { 0x0000ff98, 19052 }, /* KP_Right */ - { 0x0000ff99, 18916 }, /* KP_Down */ - { 0x0000ff9a, 19043 }, /* KP_Prior */ - { 0x0000ff9b, 19011 }, /* KP_Next */ - { 0x0000ff9c, 18924 }, /* KP_End */ - { 0x0000ff9d, 18876 }, /* KP_Begin */ - { 0x0000ff9e, 18981 }, /* KP_Insert */ - { 0x0000ff9f, 18896 }, /* KP_Delete */ - { 0x0000ffaa, 18999 }, /* KP_Multiply */ - { 0x0000ffab, 18858 }, /* KP_Add */ - { 0x0000ffac, 19061 }, /* KP_Separator */ - { 0x0000ffad, 19083 }, /* KP_Subtract */ - { 0x0000ffae, 18885 }, /* KP_Decimal */ - { 0x0000ffaf, 18906 }, /* KP_Divide */ - { 0x0000ffb0, 18808 }, /* KP_0 */ - { 0x0000ffb1, 18813 }, /* KP_1 */ - { 0x0000ffb2, 18818 }, /* KP_2 */ - { 0x0000ffb3, 18823 }, /* KP_3 */ - { 0x0000ffb4, 18828 }, /* KP_4 */ - { 0x0000ffb5, 18833 }, /* KP_5 */ - { 0x0000ffb6, 18838 }, /* KP_6 */ - { 0x0000ffb7, 18843 }, /* KP_7 */ - { 0x0000ffb8, 18848 }, /* KP_8 */ - { 0x0000ffb9, 18853 }, /* KP_9 */ - { 0x0000ffbd, 18940 }, /* KP_Equal */ - { 0x0000ffbe, 12159 }, /* F1 */ - { 0x0000ffbf, 12202 }, /* F2 */ - { 0x0000ffc0, 12245 }, /* F3 */ - { 0x0000ffc1, 12272 }, /* F4 */ - { 0x0000ffc2, 12275 }, /* F5 */ - { 0x0000ffc3, 12278 }, /* F6 */ - { 0x0000ffc4, 12281 }, /* F7 */ - { 0x0000ffc5, 12284 }, /* F8 */ - { 0x0000ffc6, 12287 }, /* F9 */ - { 0x0000ffc7, 12162 }, /* F10 */ - { 0x0000ffc8, 12166 }, /* F11 */ - { 0x0000ffc9, 12170 }, /* F12 */ - { 0x0000ffca, 12174 }, /* F13 */ - { 0x0000ffcb, 12178 }, /* F14 */ - { 0x0000ffcc, 12182 }, /* F15 */ - { 0x0000ffcd, 12186 }, /* F16 */ - { 0x0000ffce, 12190 }, /* F17 */ - { 0x0000ffcf, 12194 }, /* F18 */ - { 0x0000ffd0, 12198 }, /* F19 */ - { 0x0000ffd1, 12205 }, /* F20 */ - { 0x0000ffd2, 12209 }, /* F21 */ - { 0x0000ffd3, 12213 }, /* F22 */ - { 0x0000ffd4, 12217 }, /* F23 */ - { 0x0000ffd5, 12221 }, /* F24 */ - { 0x0000ffd6, 12225 }, /* F25 */ - { 0x0000ffd7, 12229 }, /* F26 */ - { 0x0000ffd8, 12233 }, /* F27 */ - { 0x0000ffd9, 12237 }, /* F28 */ - { 0x0000ffda, 12241 }, /* F29 */ - { 0x0000ffdb, 12248 }, /* F30 */ - { 0x0000ffdc, 12252 }, /* F31 */ - { 0x0000ffdd, 12256 }, /* F32 */ - { 0x0000ffde, 12260 }, /* F33 */ - { 0x0000ffdf, 12264 }, /* F34 */ - { 0x0000ffe0, 12268 }, /* F35 */ - { 0x0000ffe1, 22946 }, /* Shift_L */ - { 0x0000ffe2, 22965 }, /* Shift_R */ - { 0x0000ffe3, 8697 }, /* Control_L */ - { 0x0000ffe4, 8707 }, /* Control_R */ - { 0x0000ffe5, 8496 }, /* Caps_Lock */ - { 0x0000ffe6, 22954 }, /* Shift_Lock */ - { 0x0000ffe7, 19710 }, /* Meta_L */ - { 0x0000ffe8, 19717 }, /* Meta_R */ - { 0x0000ffe9, 880 }, /* Alt_L */ - { 0x0000ffea, 886 }, /* Alt_R */ - { 0x0000ffeb, 24263 }, /* Super_L */ - { 0x0000ffec, 24271 }, /* Super_R */ - { 0x0000ffed, 17046 }, /* Hyper_L */ - { 0x0000ffee, 17054 }, /* Hyper_R */ - { 0x0000fff1, 3642 }, /* braille_dot_1 */ - { 0x0000fff2, 3671 }, /* braille_dot_2 */ - { 0x0000fff3, 3685 }, /* braille_dot_3 */ - { 0x0000fff4, 3699 }, /* braille_dot_4 */ - { 0x0000fff5, 3713 }, /* braille_dot_5 */ - { 0x0000fff6, 3727 }, /* braille_dot_6 */ - { 0x0000fff7, 3741 }, /* braille_dot_7 */ - { 0x0000fff8, 3755 }, /* braille_dot_8 */ - { 0x0000fff9, 3769 }, /* braille_dot_9 */ - { 0x0000fffa, 3656 }, /* braille_dot_10 */ - { 0x0000ffff, 11160 }, /* Delete */ - { 0x00ffffff, 26531 }, /* VoidSymbol */ - { 0x0100012c, 17117 }, /* Ibreve */ - { 0x0100012d, 17124 }, /* ibreve */ - { 0x01000174, 26563 }, /* Wcircumflex */ - { 0x01000175, 26575 }, /* wcircumflex */ - { 0x01000176, 29059 }, /* Ycircumflex */ - { 0x01000177, 29071 }, /* ycircumflex */ - { 0x0100018f, 22649 }, /* SCHWA */ - { 0x0100019f, 20218 }, /* Obarred */ - { 0x010001a0, 20553 }, /* Ohorn */ - { 0x010001a1, 20559 }, /* ohorn */ - { 0x010001af, 25997 }, /* Uhorn */ - { 0x010001b0, 26003 }, /* uhorn */ - { 0x010001b5, 29261 }, /* Zstroke */ - { 0x010001b6, 29269 }, /* zstroke */ - { 0x010001b7, 12147 }, /* EZH */ - { 0x010001d1, 20254 }, /* Ocaron */ - { 0x010001d2, 20261 }, /* ocaron */ - { 0x010001e6, 12703 }, /* Gcaron */ - { 0x010001e7, 12710 }, /* gcaron */ - { 0x01000259, 22655 }, /* schwa */ - { 0x01000275, 20226 }, /* obarred */ - { 0x01000292, 12151 }, /* ezh */ - { 0x01000492, 9236 }, /* Cyrillic_GHE_bar */ - { 0x01000493, 9253 }, /* Cyrillic_ghe_bar */ - { 0x01000496, 10274 }, /* Cyrillic_ZHE_descender */ - { 0x01000497, 10297 }, /* Cyrillic_zhe_descender */ - { 0x0100049a, 9528 }, /* Cyrillic_KA_descender */ - { 0x0100049b, 9550 }, /* Cyrillic_ka_descender */ - { 0x0100049c, 9572 }, /* Cyrillic_KA_vertstroke */ - { 0x0100049d, 9595 }, /* Cyrillic_ka_vertstroke */ - { 0x010004a2, 9118 }, /* Cyrillic_EN_descender */ - { 0x010004a3, 9140 }, /* Cyrillic_en_descender */ - { 0x010004ae, 10036 }, /* Cyrillic_U_straight */ - { 0x010004af, 10056 }, /* Cyrillic_u_straight */ - { 0x010004b0, 10076 }, /* Cyrillic_U_straight_bar */ - { 0x010004b1, 10100 }, /* Cyrillic_u_straight_bar */ - { 0x010004b2, 9294 }, /* Cyrillic_HA_descender */ - { 0x010004b3, 9316 }, /* Cyrillic_ha_descender */ - { 0x010004b6, 8854 }, /* Cyrillic_CHE_descender */ - { 0x010004b7, 8877 }, /* Cyrillic_che_descender */ - { 0x010004b8, 8900 }, /* Cyrillic_CHE_vertstroke */ - { 0x010004b9, 8924 }, /* Cyrillic_che_vertstroke */ - { 0x010004ba, 9832 }, /* Cyrillic_SHHA */ - { 0x010004bb, 9846 }, /* Cyrillic_shha */ - { 0x010004d8, 9746 }, /* Cyrillic_SCHWA */ - { 0x010004d9, 9761 }, /* Cyrillic_schwa */ - { 0x010004e2, 9396 }, /* Cyrillic_I_macron */ - { 0x010004e3, 9414 }, /* Cyrillic_i_macron */ - { 0x010004e8, 9692 }, /* Cyrillic_O_bar */ - { 0x010004e9, 9707 }, /* Cyrillic_o_bar */ - { 0x010004ee, 10000 }, /* Cyrillic_U_macron */ - { 0x010004ef, 10018 }, /* Cyrillic_u_macron */ - { 0x01000531, 2124 }, /* Armenian_AYB */ - { 0x01000532, 2150 }, /* Armenian_BEN */ - { 0x01000533, 2374 }, /* Armenian_GIM */ - { 0x01000534, 2215 }, /* Armenian_DA */ - { 0x01000535, 3164 }, /* Armenian_YECH */ - { 0x01000536, 3210 }, /* Armenian_ZA */ - { 0x01000537, 2265 }, /* Armenian_E */ - { 0x01000538, 2100 }, /* Armenian_AT */ - { 0x01000539, 2964 }, /* Armenian_TO */ - { 0x0100053a, 3234 }, /* Armenian_ZHE */ - { 0x0100053b, 2464 }, /* Armenian_INI */ - { 0x0100053c, 2611 }, /* Armenian_LYUN */ - { 0x0100053d, 2564 }, /* Armenian_KHE */ - { 0x0100053e, 2988 }, /* Armenian_TSA */ - { 0x0100053f, 2538 }, /* Armenian_KEN */ - { 0x01000540, 2424 }, /* Armenian_HO */ - { 0x01000541, 2239 }, /* Armenian_DZA */ - { 0x01000542, 2346 }, /* Armenian_GHAT */ - { 0x01000543, 2936 }, /* Armenian_TCHE */ - { 0x01000544, 2639 }, /* Armenian_MEN */ - { 0x01000545, 2400 }, /* Armenian_HI */ - { 0x01000546, 2665 }, /* Armenian_NU */ - { 0x01000547, 2894 }, /* Armenian_SHA */ - { 0x01000548, 3112 }, /* Armenian_VO */ - { 0x01000549, 2189 }, /* Armenian_CHA */ - { 0x0100054a, 2727 }, /* Armenian_PE */ - { 0x0100054b, 2490 }, /* Armenian_JE */ - { 0x0100054c, 2797 }, /* Armenian_RA */ - { 0x0100054d, 2845 }, /* Armenian_SE */ - { 0x0100054e, 3086 }, /* Armenian_VEV */ - { 0x0100054f, 3040 }, /* Armenian_TYUN */ - { 0x01000550, 2821 }, /* Armenian_RE */ - { 0x01000551, 3014 }, /* Armenian_TSO */ - { 0x01000552, 3136 }, /* Armenian_VYUN */ - { 0x01000553, 2751 }, /* Armenian_PYUR */ - { 0x01000554, 2514 }, /* Armenian_KE */ - { 0x01000555, 2689 }, /* Armenian_O */ - { 0x01000556, 2303 }, /* Armenian_FE */ - { 0x0100055a, 2080 }, /* Armenian_apostrophe */ - { 0x0100055b, 2048 }, /* Armenian_accent */ - { 0x0100055c, 2287 }, /* Armenian_exclam */ - { 0x0100055d, 2869 }, /* Armenian_separation_mark */ - { 0x0100055e, 2779 }, /* Armenian_question */ - { 0x01000561, 2137 }, /* Armenian_ayb */ - { 0x01000562, 2163 }, /* Armenian_ben */ - { 0x01000563, 2387 }, /* Armenian_gim */ - { 0x01000564, 2227 }, /* Armenian_da */ - { 0x01000565, 3178 }, /* Armenian_yech */ - { 0x01000566, 3222 }, /* Armenian_za */ - { 0x01000567, 2276 }, /* Armenian_e */ - { 0x01000568, 2112 }, /* Armenian_at */ - { 0x01000569, 2976 }, /* Armenian_to */ - { 0x0100056a, 3247 }, /* Armenian_zhe */ - { 0x0100056b, 2477 }, /* Armenian_ini */ - { 0x0100056c, 2625 }, /* Armenian_lyun */ - { 0x0100056d, 2577 }, /* Armenian_khe */ - { 0x0100056e, 3001 }, /* Armenian_tsa */ - { 0x0100056f, 2551 }, /* Armenian_ken */ - { 0x01000570, 2436 }, /* Armenian_ho */ - { 0x01000571, 2252 }, /* Armenian_dza */ - { 0x01000572, 2360 }, /* Armenian_ghat */ - { 0x01000573, 2950 }, /* Armenian_tche */ - { 0x01000574, 2652 }, /* Armenian_men */ - { 0x01000575, 2412 }, /* Armenian_hi */ - { 0x01000576, 2677 }, /* Armenian_nu */ - { 0x01000577, 2907 }, /* Armenian_sha */ - { 0x01000578, 3124 }, /* Armenian_vo */ - { 0x01000579, 2202 }, /* Armenian_cha */ - { 0x0100057a, 2739 }, /* Armenian_pe */ - { 0x0100057b, 2502 }, /* Armenian_je */ - { 0x0100057c, 2809 }, /* Armenian_ra */ - { 0x0100057d, 2857 }, /* Armenian_se */ - { 0x0100057e, 3099 }, /* Armenian_vev */ - { 0x0100057f, 3054 }, /* Armenian_tyun */ - { 0x01000580, 2833 }, /* Armenian_re */ - { 0x01000581, 3027 }, /* Armenian_tso */ - { 0x01000582, 3150 }, /* Armenian_vyun */ - { 0x01000583, 2765 }, /* Armenian_pyur */ - { 0x01000584, 2526 }, /* Armenian_ke */ - { 0x01000585, 2700 }, /* Armenian_o */ - { 0x01000586, 2315 }, /* Armenian_fe */ - { 0x01000587, 2590 }, /* Armenian_ligature_ew */ - { 0x01000589, 2327 }, /* Armenian_full_stop */ - { 0x0100058a, 2448 }, /* Armenian_hyphen */ - { 0x01000653, 1580 }, /* Arabic_madda_above */ - { 0x01000654, 1316 }, /* Arabic_hamza_above */ - { 0x01000655, 1335 }, /* Arabic_hamza_below */ - { 0x01000660, 966 }, /* Arabic_0 */ - { 0x01000661, 975 }, /* Arabic_1 */ - { 0x01000662, 984 }, /* Arabic_2 */ - { 0x01000663, 993 }, /* Arabic_3 */ - { 0x01000664, 1002 }, /* Arabic_4 */ - { 0x01000665, 1011 }, /* Arabic_5 */ - { 0x01000666, 1020 }, /* Arabic_6 */ - { 0x01000667, 1029 }, /* Arabic_7 */ - { 0x01000668, 1038 }, /* Arabic_8 */ - { 0x01000669, 1047 }, /* Arabic_9 */ - { 0x0100066a, 1672 }, /* Arabic_percent */ - { 0x01000670, 1821 }, /* Arabic_superscript_alef */ - { 0x01000679, 1951 }, /* Arabic_tteh */ - { 0x0100067e, 1661 }, /* Arabic_peh */ - { 0x01000686, 1885 }, /* Arabic_tcheh */ - { 0x01000688, 1173 }, /* Arabic_ddal */ - { 0x01000691, 1729 }, /* Arabic_rreh */ - { 0x01000698, 1493 }, /* Arabic_jeh */ - { 0x010006a4, 1963 }, /* Arabic_veh */ - { 0x010006a9, 1544 }, /* Arabic_keheh */ - { 0x010006af, 1258 }, /* Arabic_gaf */ - { 0x010006ba, 1642 }, /* Arabic_noon_ghunna */ - { 0x010006be, 1442 }, /* Arabic_heh_doachashmee */ - { 0x010006c1, 1465 }, /* Arabic_heh_goal */ - { 0x010006cc, 12390 }, /* Farsi_yeh */ - { 0x010006d2, 1996 }, /* Arabic_yeh_baree */ - { 0x010006d4, 1242 }, /* Arabic_fullstop */ - { 0x010006f0, 12310 }, /* Farsi_0 */ - { 0x010006f1, 12318 }, /* Farsi_1 */ - { 0x010006f2, 12326 }, /* Farsi_2 */ - { 0x010006f3, 12334 }, /* Farsi_3 */ - { 0x010006f4, 12342 }, /* Farsi_4 */ - { 0x010006f5, 12350 }, /* Farsi_5 */ - { 0x010006f6, 12358 }, /* Farsi_6 */ - { 0x010006f7, 12366 }, /* Farsi_7 */ - { 0x010006f8, 12374 }, /* Farsi_8 */ - { 0x010006f9, 12382 }, /* Farsi_9 */ - { 0x01000d82, 23484 }, /* Sinh_ng */ - { 0x01000d83, 23278 }, /* Sinh_h2 */ - { 0x01000d85, 23047 }, /* Sinh_a */ - { 0x01000d86, 23054 }, /* Sinh_aa */ - { 0x01000d87, 23071 }, /* Sinh_ae */ - { 0x01000d88, 23088 }, /* Sinh_aee */ - { 0x01000d89, 23294 }, /* Sinh_i */ - { 0x01000d8a, 23309 }, /* Sinh_ii */ - { 0x01000d8b, 23695 }, /* Sinh_u */ - { 0x01000d8c, 23710 }, /* Sinh_uu */ - { 0x01000d8d, 23594 }, /* Sinh_ri */ - { 0x01000d8e, 23602 }, /* Sinh_rii */ - { 0x01000d8f, 23403 }, /* Sinh_lu */ - { 0x01000d90, 23420 }, /* Sinh_luu */ - { 0x01000d91, 23221 }, /* Sinh_e */ - { 0x01000d92, 23236 }, /* Sinh_ee */ - { 0x01000d93, 23107 }, /* Sinh_ai */ - { 0x01000d94, 23537 }, /* Sinh_o */ - { 0x01000d95, 23552 }, /* Sinh_oo */ - { 0x01000d96, 23132 }, /* Sinh_au */ - { 0x01000d9a, 23353 }, /* Sinh_ka */ - { 0x01000d9b, 23361 }, /* Sinh_kha */ - { 0x01000d9c, 23261 }, /* Sinh_ga */ - { 0x01000d9d, 23269 }, /* Sinh_gha */ - { 0x01000d9e, 23492 }, /* Sinh_ng2 */ - { 0x01000d9f, 23501 }, /* Sinh_nga */ - { 0x01000da0, 23166 }, /* Sinh_ca */ - { 0x01000da1, 23174 }, /* Sinh_cha */ - { 0x01000da2, 23326 }, /* Sinh_ja */ - { 0x01000da3, 23334 }, /* Sinh_jha */ - { 0x01000da4, 23528 }, /* Sinh_nya */ - { 0x01000da5, 23343 }, /* Sinh_jnya */ - { 0x01000da6, 23510 }, /* Sinh_nja */ - { 0x01000da7, 23676 }, /* Sinh_tta */ - { 0x01000da8, 23685 }, /* Sinh_ttha */ - { 0x01000da9, 23183 }, /* Sinh_dda */ - { 0x01000daa, 23192 }, /* Sinh_ddha */ - { 0x01000dab, 23519 }, /* Sinh_nna */ - { 0x01000dac, 23464 }, /* Sinh_ndda */ - { 0x01000dad, 23657 }, /* Sinh_tha */ - { 0x01000dae, 23666 }, /* Sinh_thha */ - { 0x01000daf, 23202 }, /* Sinh_dha */ - { 0x01000db0, 23211 }, /* Sinh_dhha */ - { 0x01000db1, 23456 }, /* Sinh_na */ - { 0x01000db3, 23474 }, /* Sinh_ndha */ - { 0x01000db4, 23569 }, /* Sinh_pa */ - { 0x01000db5, 23577 }, /* Sinh_pha */ - { 0x01000db6, 23149 }, /* Sinh_ba */ - { 0x01000db7, 23157 }, /* Sinh_bha */ - { 0x01000db8, 23439 }, /* Sinh_ma */ - { 0x01000db9, 23447 }, /* Sinh_mba */ - { 0x01000dba, 23735 }, /* Sinh_ya */ - { 0x01000dbb, 23586 }, /* Sinh_ra */ - { 0x01000dbd, 23386 }, /* Sinh_la */ - { 0x01000dc0, 23727 }, /* Sinh_va */ - { 0x01000dc1, 23638 }, /* Sinh_sha */ - { 0x01000dc2, 23647 }, /* Sinh_ssha */ - { 0x01000dc3, 23630 }, /* Sinh_sa */ - { 0x01000dc4, 23286 }, /* Sinh_ha */ - { 0x01000dc5, 23394 }, /* Sinh_lla */ - { 0x01000dc6, 23253 }, /* Sinh_fa */ - { 0x01000dca, 23124 }, /* Sinh_al */ - { 0x01000dcf, 23062 }, /* Sinh_aa2 */ - { 0x01000dd0, 23079 }, /* Sinh_ae2 */ - { 0x01000dd1, 23097 }, /* Sinh_aee2 */ - { 0x01000dd2, 23301 }, /* Sinh_i2 */ - { 0x01000dd3, 23317 }, /* Sinh_ii2 */ - { 0x01000dd4, 23702 }, /* Sinh_u2 */ - { 0x01000dd6, 23718 }, /* Sinh_uu2 */ - { 0x01000dd8, 23611 }, /* Sinh_ru2 */ - { 0x01000dd9, 23228 }, /* Sinh_e2 */ - { 0x01000dda, 23244 }, /* Sinh_ee2 */ - { 0x01000ddb, 23115 }, /* Sinh_ai2 */ - { 0x01000ddc, 23544 }, /* Sinh_o2 */ - { 0x01000ddd, 23560 }, /* Sinh_oo2 */ - { 0x01000dde, 23140 }, /* Sinh_au2 */ - { 0x01000ddf, 23411 }, /* Sinh_lu2 */ - { 0x01000df2, 23620 }, /* Sinh_ruu2 */ - { 0x01000df3, 23429 }, /* Sinh_luu2 */ - { 0x01000df4, 23370 }, /* Sinh_kunddaliya */ - { 0x010010d0, 12759 }, /* Georgian_an */ - { 0x010010d1, 12771 }, /* Georgian_ban */ - { 0x010010d2, 12875 }, /* Georgian_gan */ - { 0x010010d3, 12838 }, /* Georgian_don */ - { 0x010010d4, 12851 }, /* Georgian_en */ - { 0x010010d5, 13201 }, /* Georgian_vin */ - { 0x010010d6, 13239 }, /* Georgian_zen */ - { 0x010010d7, 13163 }, /* Georgian_tan */ - { 0x010010d8, 12966 }, /* Georgian_in */ - { 0x010010d9, 13005 }, /* Georgian_kan */ - { 0x010010da, 13032 }, /* Georgian_las */ - { 0x010010db, 13045 }, /* Georgian_man */ - { 0x010010dc, 13058 }, /* Georgian_nar */ - { 0x010010dd, 13071 }, /* Georgian_on */ - { 0x010010de, 13083 }, /* Georgian_par */ - { 0x010010df, 13252 }, /* Georgian_zhar */ - { 0x010010e0, 13123 }, /* Georgian_rae */ - { 0x010010e1, 13136 }, /* Georgian_san */ - { 0x010010e2, 13176 }, /* Georgian_tar */ - { 0x010010e3, 13189 }, /* Georgian_un */ - { 0x010010e4, 13096 }, /* Georgian_phar */ - { 0x010010e5, 13018 }, /* Georgian_khar */ - { 0x010010e6, 12888 }, /* Georgian_ghan */ - { 0x010010e7, 13110 }, /* Georgian_qar */ - { 0x010010e8, 13149 }, /* Georgian_shin */ - { 0x010010e9, 12811 }, /* Georgian_chin */ - { 0x010010ea, 12784 }, /* Georgian_can */ - { 0x010010eb, 12992 }, /* Georgian_jil */ - { 0x010010ec, 12825 }, /* Georgian_cil */ - { 0x010010ed, 12797 }, /* Georgian_char */ - { 0x010010ee, 13226 }, /* Georgian_xan */ - { 0x010010ef, 12978 }, /* Georgian_jhan */ - { 0x010010f0, 12902 }, /* Georgian_hae */ - { 0x010010f1, 12928 }, /* Georgian_he */ - { 0x010010f2, 12940 }, /* Georgian_hie */ - { 0x010010f3, 13214 }, /* Georgian_we */ - { 0x010010f4, 12915 }, /* Georgian_har */ - { 0x010010f5, 12953 }, /* Georgian_hoe */ - { 0x010010f6, 12863 }, /* Georgian_fi */ - { 0x01001e02, 3332 }, /* Babovedot */ - { 0x01001e03, 3342 }, /* babovedot */ - { 0x01001e0a, 10324 }, /* Dabovedot */ - { 0x01001e0b, 10334 }, /* dabovedot */ - { 0x01001e1e, 12290 }, /* Fabovedot */ - { 0x01001e1f, 12300 }, /* fabovedot */ - { 0x01001e36, 19192 }, /* Lbelowdot */ - { 0x01001e37, 19202 }, /* lbelowdot */ - { 0x01001e40, 19537 }, /* Mabovedot */ - { 0x01001e41, 19547 }, /* mabovedot */ - { 0x01001e56, 21377 }, /* Pabovedot */ - { 0x01001e57, 21387 }, /* pabovedot */ - { 0x01001e60, 22583 }, /* Sabovedot */ - { 0x01001e61, 22593 }, /* sabovedot */ - { 0x01001e6a, 24302 }, /* Tabovedot */ - { 0x01001e6b, 24312 }, /* tabovedot */ - { 0x01001e80, 26609 }, /* Wgrave */ - { 0x01001e81, 26616 }, /* wgrave */ - { 0x01001e82, 26549 }, /* Wacute */ - { 0x01001e83, 26556 }, /* wacute */ - { 0x01001e84, 26587 }, /* Wdiaeresis */ - { 0x01001e85, 26598 }, /* wdiaeresis */ - { 0x01001e8a, 26635 }, /* Xabovedot */ - { 0x01001e8b, 26645 }, /* xabovedot */ - { 0x01001ea0, 416 }, /* Abelowdot */ - { 0x01001ea1, 426 }, /* abelowdot */ - { 0x01001ea2, 868 }, /* Ahook */ - { 0x01001ea3, 874 }, /* ahook */ - { 0x01001ea4, 646 }, /* Acircumflexacute */ - { 0x01001ea5, 663 }, /* acircumflexacute */ - { 0x01001ea6, 720 }, /* Acircumflexgrave */ - { 0x01001ea7, 737 }, /* acircumflexgrave */ - { 0x01001ea8, 754 }, /* Acircumflexhook */ - { 0x01001ea9, 770 }, /* acircumflexhook */ - { 0x01001eaa, 786 }, /* Acircumflextilde */ - { 0x01001eab, 803 }, /* acircumflextilde */ - { 0x01001eac, 680 }, /* Acircumflexbelowdot */ - { 0x01001ead, 700 }, /* acircumflexbelowdot */ - { 0x01001eae, 459 }, /* Abreveacute */ - { 0x01001eaf, 471 }, /* abreveacute */ - { 0x01001eb0, 513 }, /* Abrevegrave */ - { 0x01001eb1, 525 }, /* abrevegrave */ - { 0x01001eb2, 537 }, /* Abrevehook */ - { 0x01001eb3, 548 }, /* abrevehook */ - { 0x01001eb4, 559 }, /* Abrevetilde */ - { 0x01001eb5, 571 }, /* abrevetilde */ - { 0x01001eb6, 483 }, /* Abrevebelowdot */ - { 0x01001eb7, 498 }, /* abrevebelowdot */ - { 0x01001eb8, 11462 }, /* Ebelowdot */ - { 0x01001eb9, 11472 }, /* ebelowdot */ - { 0x01001eba, 11738 }, /* Ehook */ - { 0x01001ebb, 11744 }, /* ehook */ - { 0x01001ebc, 12076 }, /* Etilde */ - { 0x01001ebd, 12083 }, /* etilde */ - { 0x01001ebe, 11520 }, /* Ecircumflexacute */ - { 0x01001ebf, 11537 }, /* ecircumflexacute */ - { 0x01001ec0, 11594 }, /* Ecircumflexgrave */ - { 0x01001ec1, 11611 }, /* ecircumflexgrave */ - { 0x01001ec2, 11628 }, /* Ecircumflexhook */ - { 0x01001ec3, 11644 }, /* ecircumflexhook */ - { 0x01001ec4, 11660 }, /* Ecircumflextilde */ - { 0x01001ec5, 11677 }, /* ecircumflextilde */ - { 0x01001ec6, 11554 }, /* Ecircumflexbelowdot */ - { 0x01001ec7, 11574 }, /* ecircumflexbelowdot */ - { 0x01001ec8, 17219 }, /* Ihook */ - { 0x01001ec9, 17225 }, /* ihook */ - { 0x01001eca, 17097 }, /* Ibelowdot */ - { 0x01001ecb, 17107 }, /* ibelowdot */ - { 0x01001ecc, 20234 }, /* Obelowdot */ - { 0x01001ecd, 20244 }, /* obelowdot */ - { 0x01001ece, 20541 }, /* Ohook */ - { 0x01001ecf, 20547 }, /* ohook */ - { 0x01001ed0, 20292 }, /* Ocircumflexacute */ - { 0x01001ed1, 20309 }, /* ocircumflexacute */ - { 0x01001ed2, 20366 }, /* Ocircumflexgrave */ - { 0x01001ed3, 20383 }, /* ocircumflexgrave */ - { 0x01001ed4, 20400 }, /* Ocircumflexhook */ - { 0x01001ed5, 20416 }, /* ocircumflexhook */ - { 0x01001ed6, 20432 }, /* Ocircumflextilde */ - { 0x01001ed7, 20449 }, /* ocircumflextilde */ - { 0x01001ed8, 20326 }, /* Ocircumflexbelowdot */ - { 0x01001ed9, 20346 }, /* ocircumflexbelowdot */ - { 0x01001eda, 20565 }, /* Ohornacute */ - { 0x01001edb, 20576 }, /* ohornacute */ - { 0x01001edc, 20615 }, /* Ohorngrave */ - { 0x01001edd, 20626 }, /* ohorngrave */ - { 0x01001ede, 20637 }, /* Ohornhook */ - { 0x01001edf, 20647 }, /* ohornhook */ - { 0x01001ee0, 20657 }, /* Ohorntilde */ - { 0x01001ee1, 20668 }, /* ohorntilde */ - { 0x01001ee2, 20587 }, /* Ohornbelowdot */ - { 0x01001ee3, 20601 }, /* ohornbelowdot */ - { 0x01001ee4, 25865 }, /* Ubelowdot */ - { 0x01001ee5, 25875 }, /* ubelowdot */ - { 0x01001ee6, 25985 }, /* Uhook */ - { 0x01001ee7, 25991 }, /* uhook */ - { 0x01001ee8, 26009 }, /* Uhornacute */ - { 0x01001ee9, 26020 }, /* uhornacute */ - { 0x01001eea, 26059 }, /* Uhorngrave */ - { 0x01001eeb, 26070 }, /* uhorngrave */ - { 0x01001eec, 26081 }, /* Uhornhook */ - { 0x01001eed, 26091 }, /* uhornhook */ - { 0x01001eee, 26101 }, /* Uhorntilde */ - { 0x01001eef, 26112 }, /* uhorntilde */ - { 0x01001ef0, 26031 }, /* Uhornbelowdot */ - { 0x01001ef1, 26045 }, /* uhornbelowdot */ - { 0x01001ef2, 29109 }, /* Ygrave */ - { 0x01001ef3, 29116 }, /* ygrave */ - { 0x01001ef4, 29039 }, /* Ybelowdot */ - { 0x01001ef5, 29049 }, /* ybelowdot */ - { 0x01001ef6, 29123 }, /* Yhook */ - { 0x01001ef7, 29129 }, /* yhook */ - { 0x01001ef8, 29135 }, /* Ytilde */ - { 0x01001ef9, 29142 }, /* ytilde */ - { 0x01002070, 29248 }, /* zerosuperior */ - { 0x01002074, 12632 }, /* foursuperior */ - { 0x01002075, 12594 }, /* fivesuperior */ - { 0x01002076, 23756 }, /* sixsuperior */ - { 0x01002077, 22932 }, /* sevensuperior */ - { 0x01002078, 11765 }, /* eightsuperior */ - { 0x01002079, 20062 }, /* ninesuperior */ - { 0x01002080, 29234 }, /* zerosubscript */ - { 0x01002081, 20742 }, /* onesubscript */ - { 0x01002082, 25812 }, /* twosubscript */ - { 0x01002083, 25556 }, /* threesubscript */ - { 0x01002084, 12618 }, /* foursubscript */ - { 0x01002085, 12580 }, /* fivesubscript */ - { 0x01002086, 23743 }, /* sixsubscript */ - { 0x01002087, 22917 }, /* sevensubscript */ - { 0x01002088, 11750 }, /* eightsubscript */ - { 0x01002089, 20048 }, /* ninesubscript */ - { 0x010020a0, 11694 }, /* EcuSign */ - { 0x010020a1, 8670 }, /* ColonSign */ - { 0x010020a2, 8744 }, /* CruzeiroSign */ - { 0x010020a3, 12416 }, /* FFrancSign */ - { 0x010020a4, 19448 }, /* LiraSign */ - { 0x010020a5, 19724 }, /* MillSign */ - { 0x010020a6, 19967 }, /* NairaSign */ - { 0x010020a7, 21526 }, /* PesetaSign */ - { 0x010020a8, 22569 }, /* RupeeSign */ - { 0x010020a9, 26623 }, /* WonSign */ - { 0x010020aa, 20009 }, /* NewSheqelSign */ - { 0x010020ab, 11258 }, /* DongSign */ - { 0x01002202, 21446 }, /* partdifferential */ - { 0x01002205, 11919 }, /* emptyset */ - { 0x01002208, 11802 }, /* elementof */ - { 0x01002209, 20112 }, /* notelementof */ - { 0x0100220b, 8686 }, /* containsas */ - { 0x0100221a, 23809 }, /* squareroot */ - { 0x0100221b, 8757 }, /* cuberoot */ - { 0x0100221c, 12645 }, /* fourthroot */ - { 0x0100222c, 11232 }, /* dintegral */ - { 0x0100222d, 25585 }, /* tintegral */ - { 0x01002235, 3396 }, /* because */ - { 0x01002247, 20100 }, /* notapproxeq */ - { 0x01002248, 945 }, /* approxeq */ - { 0x01002262, 20134 }, /* notidentical */ - { 0x01002263, 23854 }, /* stricteq */ - { 0x01002800, 3628 }, /* braille_blank */ - { 0x01002801, 3783 }, /* braille_dots_1 */ - { 0x01002802, 6151 }, /* braille_dots_2 */ - { 0x01002803, 3798 }, /* braille_dots_12 */ - { 0x01002804, 7303 }, /* braille_dots_3 */ - { 0x01002805, 5014 }, /* braille_dots_13 */ - { 0x01002806, 6166 }, /* braille_dots_23 */ - { 0x01002807, 3814 }, /* braille_dots_123 */ - { 0x01002808, 7863 }, /* braille_dots_4 */ - { 0x01002809, 5606 }, /* braille_dots_14 */ - { 0x0100280a, 6758 }, /* braille_dots_24 */ - { 0x0100280b, 4438 }, /* braille_dots_124 */ - { 0x0100280c, 7318 }, /* braille_dots_34 */ - { 0x0100280d, 5030 }, /* braille_dots_134 */ - { 0x0100280e, 6182 }, /* braille_dots_234 */ - { 0x0100280f, 3831 }, /* braille_dots_1234 */ - { 0x01002810, 8135 }, /* braille_dots_5 */ - { 0x01002811, 5894 }, /* braille_dots_15 */ - { 0x01002812, 7046 }, /* braille_dots_25 */ - { 0x01002813, 4742 }, /* braille_dots_125 */ - { 0x01002814, 7606 }, /* braille_dots_35 */ - { 0x01002815, 5334 }, /* braille_dots_135 */ - { 0x01002816, 6486 }, /* braille_dots_235 */ - { 0x01002817, 4151 }, /* braille_dots_1235 */ - { 0x01002818, 7878 }, /* braille_dots_45 */ - { 0x01002819, 5622 }, /* braille_dots_145 */ - { 0x0100281a, 6774 }, /* braille_dots_245 */ - { 0x0100281b, 4455 }, /* braille_dots_1245 */ - { 0x0100281c, 7334 }, /* braille_dots_345 */ - { 0x0100281d, 5047 }, /* braille_dots_1345 */ - { 0x0100281e, 6199 }, /* braille_dots_2345 */ - { 0x0100281f, 3849 }, /* braille_dots_12345 */ - { 0x01002820, 8267 }, /* braille_dots_6 */ - { 0x01002821, 6034 }, /* braille_dots_16 */ - { 0x01002822, 7186 }, /* braille_dots_26 */ - { 0x01002823, 4890 }, /* braille_dots_126 */ - { 0x01002824, 7746 }, /* braille_dots_36 */ - { 0x01002825, 5482 }, /* braille_dots_136 */ - { 0x01002826, 6634 }, /* braille_dots_236 */ - { 0x01002827, 4307 }, /* braille_dots_1236 */ - { 0x01002828, 8018 }, /* braille_dots_46 */ - { 0x01002829, 5770 }, /* braille_dots_146 */ - { 0x0100282a, 6922 }, /* braille_dots_246 */ - { 0x0100282b, 4611 }, /* braille_dots_1246 */ - { 0x0100282c, 7482 }, /* braille_dots_346 */ - { 0x0100282d, 5203 }, /* braille_dots_1346 */ - { 0x0100282e, 6355 }, /* braille_dots_2346 */ - { 0x0100282f, 4013 }, /* braille_dots_12346 */ - { 0x01002830, 8150 }, /* braille_dots_56 */ - { 0x01002831, 5910 }, /* braille_dots_156 */ - { 0x01002832, 7062 }, /* braille_dots_256 */ - { 0x01002833, 4759 }, /* braille_dots_1256 */ - { 0x01002834, 7622 }, /* braille_dots_356 */ - { 0x01002835, 5351 }, /* braille_dots_1356 */ - { 0x01002836, 6503 }, /* braille_dots_2356 */ - { 0x01002837, 4169 }, /* braille_dots_12356 */ - { 0x01002838, 7894 }, /* braille_dots_456 */ - { 0x01002839, 5639 }, /* braille_dots_1456 */ - { 0x0100283a, 6791 }, /* braille_dots_2456 */ - { 0x0100283b, 4473 }, /* braille_dots_12456 */ - { 0x0100283c, 7351 }, /* braille_dots_3456 */ - { 0x0100283d, 5065 }, /* braille_dots_13456 */ - { 0x0100283e, 6217 }, /* braille_dots_23456 */ - { 0x0100283f, 3868 }, /* braille_dots_123456 */ - { 0x01002840, 8331 }, /* braille_dots_7 */ - { 0x01002841, 6102 }, /* braille_dots_17 */ - { 0x01002842, 7254 }, /* braille_dots_27 */ - { 0x01002843, 4962 }, /* braille_dots_127 */ - { 0x01002844, 7814 }, /* braille_dots_37 */ - { 0x01002845, 5554 }, /* braille_dots_137 */ - { 0x01002846, 6706 }, /* braille_dots_237 */ - { 0x01002847, 4383 }, /* braille_dots_1237 */ - { 0x01002848, 8086 }, /* braille_dots_47 */ - { 0x01002849, 5842 }, /* braille_dots_147 */ - { 0x0100284a, 6994 }, /* braille_dots_247 */ - { 0x0100284b, 4687 }, /* braille_dots_1247 */ - { 0x0100284c, 7554 }, /* braille_dots_347 */ - { 0x0100284d, 5279 }, /* braille_dots_1347 */ - { 0x0100284e, 6431 }, /* braille_dots_2347 */ - { 0x0100284f, 4093 }, /* braille_dots_12347 */ - { 0x01002850, 8218 }, /* braille_dots_57 */ - { 0x01002851, 5982 }, /* braille_dots_157 */ - { 0x01002852, 7134 }, /* braille_dots_257 */ - { 0x01002853, 4835 }, /* braille_dots_1257 */ - { 0x01002854, 7694 }, /* braille_dots_357 */ - { 0x01002855, 5427 }, /* braille_dots_1357 */ - { 0x01002856, 6579 }, /* braille_dots_2357 */ - { 0x01002857, 4249 }, /* braille_dots_12357 */ - { 0x01002858, 7966 }, /* braille_dots_457 */ - { 0x01002859, 5715 }, /* braille_dots_1457 */ - { 0x0100285a, 6867 }, /* braille_dots_2457 */ - { 0x0100285b, 4553 }, /* braille_dots_12457 */ - { 0x0100285c, 7427 }, /* braille_dots_3457 */ - { 0x0100285d, 5145 }, /* braille_dots_13457 */ - { 0x0100285e, 6297 }, /* braille_dots_23457 */ - { 0x0100285f, 3952 }, /* braille_dots_123457 */ - { 0x01002860, 8282 }, /* braille_dots_67 */ - { 0x01002861, 6050 }, /* braille_dots_167 */ - { 0x01002862, 7202 }, /* braille_dots_267 */ - { 0x01002863, 4907 }, /* braille_dots_1267 */ - { 0x01002864, 7762 }, /* braille_dots_367 */ - { 0x01002865, 5499 }, /* braille_dots_1367 */ - { 0x01002866, 6651 }, /* braille_dots_2367 */ - { 0x01002867, 4325 }, /* braille_dots_12367 */ - { 0x01002868, 8034 }, /* braille_dots_467 */ - { 0x01002869, 5787 }, /* braille_dots_1467 */ - { 0x0100286a, 6939 }, /* braille_dots_2467 */ - { 0x0100286b, 4629 }, /* braille_dots_12467 */ - { 0x0100286c, 7499 }, /* braille_dots_3467 */ - { 0x0100286d, 5221 }, /* braille_dots_13467 */ - { 0x0100286e, 6373 }, /* braille_dots_23467 */ - { 0x0100286f, 4032 }, /* braille_dots_123467 */ - { 0x01002870, 8166 }, /* braille_dots_567 */ - { 0x01002871, 5927 }, /* braille_dots_1567 */ - { 0x01002872, 7079 }, /* braille_dots_2567 */ - { 0x01002873, 4777 }, /* braille_dots_12567 */ - { 0x01002874, 7639 }, /* braille_dots_3567 */ - { 0x01002875, 5369 }, /* braille_dots_13567 */ - { 0x01002876, 6521 }, /* braille_dots_23567 */ - { 0x01002877, 4188 }, /* braille_dots_123567 */ - { 0x01002878, 7911 }, /* braille_dots_4567 */ - { 0x01002879, 5657 }, /* braille_dots_14567 */ - { 0x0100287a, 6809 }, /* braille_dots_24567 */ - { 0x0100287b, 4492 }, /* braille_dots_124567 */ - { 0x0100287c, 7369 }, /* braille_dots_34567 */ - { 0x0100287d, 5084 }, /* braille_dots_134567 */ - { 0x0100287e, 6236 }, /* braille_dots_234567 */ - { 0x0100287f, 3888 }, /* braille_dots_1234567 */ - { 0x01002880, 8362 }, /* braille_dots_8 */ - { 0x01002881, 6135 }, /* braille_dots_18 */ - { 0x01002882, 7287 }, /* braille_dots_28 */ - { 0x01002883, 4997 }, /* braille_dots_128 */ - { 0x01002884, 7847 }, /* braille_dots_38 */ - { 0x01002885, 5589 }, /* braille_dots_138 */ - { 0x01002886, 6741 }, /* braille_dots_238 */ - { 0x01002887, 4420 }, /* braille_dots_1238 */ - { 0x01002888, 8119 }, /* braille_dots_48 */ - { 0x01002889, 5877 }, /* braille_dots_148 */ - { 0x0100288a, 7029 }, /* braille_dots_248 */ - { 0x0100288b, 4724 }, /* braille_dots_1248 */ - { 0x0100288c, 7589 }, /* braille_dots_348 */ - { 0x0100288d, 5316 }, /* braille_dots_1348 */ - { 0x0100288e, 6468 }, /* braille_dots_2348 */ - { 0x0100288f, 4132 }, /* braille_dots_12348 */ - { 0x01002890, 8251 }, /* braille_dots_58 */ - { 0x01002891, 6017 }, /* braille_dots_158 */ - { 0x01002892, 7169 }, /* braille_dots_258 */ - { 0x01002893, 4872 }, /* braille_dots_1258 */ - { 0x01002894, 7729 }, /* braille_dots_358 */ - { 0x01002895, 5464 }, /* braille_dots_1358 */ - { 0x01002896, 6616 }, /* braille_dots_2358 */ - { 0x01002897, 4288 }, /* braille_dots_12358 */ - { 0x01002898, 8001 }, /* braille_dots_458 */ - { 0x01002899, 5752 }, /* braille_dots_1458 */ - { 0x0100289a, 6904 }, /* braille_dots_2458 */ - { 0x0100289b, 4592 }, /* braille_dots_12458 */ - { 0x0100289c, 7464 }, /* braille_dots_3458 */ - { 0x0100289d, 5184 }, /* braille_dots_13458 */ - { 0x0100289e, 6336 }, /* braille_dots_23458 */ - { 0x0100289f, 3993 }, /* braille_dots_123458 */ - { 0x010028a0, 8315 }, /* braille_dots_68 */ - { 0x010028a1, 6085 }, /* braille_dots_168 */ - { 0x010028a2, 7237 }, /* braille_dots_268 */ - { 0x010028a3, 4944 }, /* braille_dots_1268 */ - { 0x010028a4, 7797 }, /* braille_dots_368 */ - { 0x010028a5, 5536 }, /* braille_dots_1368 */ - { 0x010028a6, 6688 }, /* braille_dots_2368 */ - { 0x010028a7, 4364 }, /* braille_dots_12368 */ - { 0x010028a8, 8069 }, /* braille_dots_468 */ - { 0x010028a9, 5824 }, /* braille_dots_1468 */ - { 0x010028aa, 6976 }, /* braille_dots_2468 */ - { 0x010028ab, 4668 }, /* braille_dots_12468 */ - { 0x010028ac, 7536 }, /* braille_dots_3468 */ - { 0x010028ad, 5260 }, /* braille_dots_13468 */ - { 0x010028ae, 6412 }, /* braille_dots_23468 */ - { 0x010028af, 4073 }, /* braille_dots_123468 */ - { 0x010028b0, 8201 }, /* braille_dots_568 */ - { 0x010028b1, 5964 }, /* braille_dots_1568 */ - { 0x010028b2, 7116 }, /* braille_dots_2568 */ - { 0x010028b3, 4816 }, /* braille_dots_12568 */ - { 0x010028b4, 7676 }, /* braille_dots_3568 */ - { 0x010028b5, 5408 }, /* braille_dots_13568 */ - { 0x010028b6, 6560 }, /* braille_dots_23568 */ - { 0x010028b7, 4229 }, /* braille_dots_123568 */ - { 0x010028b8, 7948 }, /* braille_dots_4568 */ - { 0x010028b9, 5696 }, /* braille_dots_14568 */ - { 0x010028ba, 6848 }, /* braille_dots_24568 */ - { 0x010028bb, 4533 }, /* braille_dots_124568 */ - { 0x010028bc, 7408 }, /* braille_dots_34568 */ - { 0x010028bd, 5125 }, /* braille_dots_134568 */ - { 0x010028be, 6277 }, /* braille_dots_234568 */ - { 0x010028bf, 3931 }, /* braille_dots_1234568 */ - { 0x010028c0, 8346 }, /* braille_dots_78 */ - { 0x010028c1, 6118 }, /* braille_dots_178 */ - { 0x010028c2, 7270 }, /* braille_dots_278 */ - { 0x010028c3, 4979 }, /* braille_dots_1278 */ - { 0x010028c4, 7830 }, /* braille_dots_378 */ - { 0x010028c5, 5571 }, /* braille_dots_1378 */ - { 0x010028c6, 6723 }, /* braille_dots_2378 */ - { 0x010028c7, 4401 }, /* braille_dots_12378 */ - { 0x010028c8, 8102 }, /* braille_dots_478 */ - { 0x010028c9, 5859 }, /* braille_dots_1478 */ - { 0x010028ca, 7011 }, /* braille_dots_2478 */ - { 0x010028cb, 4705 }, /* braille_dots_12478 */ - { 0x010028cc, 7571 }, /* braille_dots_3478 */ - { 0x010028cd, 5297 }, /* braille_dots_13478 */ - { 0x010028ce, 6449 }, /* braille_dots_23478 */ - { 0x010028cf, 4112 }, /* braille_dots_123478 */ - { 0x010028d0, 8234 }, /* braille_dots_578 */ - { 0x010028d1, 5999 }, /* braille_dots_1578 */ - { 0x010028d2, 7151 }, /* braille_dots_2578 */ - { 0x010028d3, 4853 }, /* braille_dots_12578 */ - { 0x010028d4, 7711 }, /* braille_dots_3578 */ - { 0x010028d5, 5445 }, /* braille_dots_13578 */ - { 0x010028d6, 6597 }, /* braille_dots_23578 */ - { 0x010028d7, 4268 }, /* braille_dots_123578 */ - { 0x010028d8, 7983 }, /* braille_dots_4578 */ - { 0x010028d9, 5733 }, /* braille_dots_14578 */ - { 0x010028da, 6885 }, /* braille_dots_24578 */ - { 0x010028db, 4572 }, /* braille_dots_124578 */ - { 0x010028dc, 7445 }, /* braille_dots_34578 */ - { 0x010028dd, 5164 }, /* braille_dots_134578 */ - { 0x010028de, 6316 }, /* braille_dots_234578 */ - { 0x010028df, 3972 }, /* braille_dots_1234578 */ - { 0x010028e0, 8298 }, /* braille_dots_678 */ - { 0x010028e1, 6067 }, /* braille_dots_1678 */ - { 0x010028e2, 7219 }, /* braille_dots_2678 */ - { 0x010028e3, 4925 }, /* braille_dots_12678 */ - { 0x010028e4, 7779 }, /* braille_dots_3678 */ - { 0x010028e5, 5517 }, /* braille_dots_13678 */ - { 0x010028e6, 6669 }, /* braille_dots_23678 */ - { 0x010028e7, 4344 }, /* braille_dots_123678 */ - { 0x010028e8, 8051 }, /* braille_dots_4678 */ - { 0x010028e9, 5805 }, /* braille_dots_14678 */ - { 0x010028ea, 6957 }, /* braille_dots_24678 */ - { 0x010028eb, 4648 }, /* braille_dots_124678 */ - { 0x010028ec, 7517 }, /* braille_dots_34678 */ - { 0x010028ed, 5240 }, /* braille_dots_134678 */ - { 0x010028ee, 6392 }, /* braille_dots_234678 */ - { 0x010028ef, 4052 }, /* braille_dots_1234678 */ - { 0x010028f0, 8183 }, /* braille_dots_5678 */ - { 0x010028f1, 5945 }, /* braille_dots_15678 */ - { 0x010028f2, 7097 }, /* braille_dots_25678 */ - { 0x010028f3, 4796 }, /* braille_dots_125678 */ - { 0x010028f4, 7657 }, /* braille_dots_35678 */ - { 0x010028f5, 5388 }, /* braille_dots_135678 */ - { 0x010028f6, 6540 }, /* braille_dots_235678 */ - { 0x010028f7, 4208 }, /* braille_dots_1235678 */ - { 0x010028f8, 7929 }, /* braille_dots_45678 */ - { 0x010028f9, 5676 }, /* braille_dots_145678 */ - { 0x010028fa, 6828 }, /* braille_dots_245678 */ - { 0x010028fb, 4512 }, /* braille_dots_1245678 */ - { 0x010028fc, 7388 }, /* braille_dots_345678 */ - { 0x010028fd, 5104 }, /* braille_dots_1345678 */ - { 0x010028fe, 6256 }, /* braille_dots_2345678 */ - { 0x010028ff, 3909 }, /* braille_dots_12345678 */ - { 0x100000a8, 16910 }, /* hpmute_acute */ - { 0x100000a9, 16977 }, /* hpmute_grave */ - { 0x100000aa, 16923 }, /* hpmute_asciicircum */ - { 0x100000ab, 16960 }, /* hpmute_diaeresis */ - { 0x100000ac, 16942 }, /* hpmute_asciitilde */ - { 0x100000af, 16867 }, /* hplira */ - { 0x100000be, 16813 }, /* hpguilder */ - { 0x100000ee, 17014 }, /* hpYdiaeresis */ - { 0x100000f6, 16874 }, /* hplongminus */ - { 0x100000fc, 16767 }, /* hpblock */ - { 0x1000fe22, 10414 }, /* Ddiaeresis */ - { 0x1000fe27, 10344 }, /* Dacute_accent */ - { 0x1000fe2c, 10379 }, /* Dcedilla_accent */ - { 0x1000fe5e, 10395 }, /* Dcircumflex_accent */ - { 0x1000fe60, 11189 }, /* Dgrave_accent */ - { 0x1000fe7e, 11417 }, /* Dtilde */ - { 0x1000feb0, 11388 }, /* Dring_accent */ - { 0x1000ff00, 11380 }, /* DRemove */ - { 0x1000ff48, 16886 }, /* hpModelock1 */ - { 0x1000ff49, 16898 }, /* hpModelock2 */ - { 0x1000ff6c, 16990 }, /* hpReset */ - { 0x1000ff6d, 16998 }, /* hpSystem */ - { 0x1000ff6e, 17007 }, /* hpUser */ - { 0x1000ff6f, 16775 }, /* hpClearLine */ - { 0x1000ff70, 16836 }, /* hpInsertLine */ - { 0x1000ff71, 16800 }, /* hpDeleteLine */ - { 0x1000ff72, 16823 }, /* hpInsertChar */ - { 0x1000ff73, 16787 }, /* hpDeleteChar */ - { 0x1000ff74, 16757 }, /* hpBackTab */ - { 0x1000ff75, 16854 }, /* hpKP_BackTab */ - { 0x1000ff76, 12125 }, /* Ext16bit_L */ - { 0x1000ff77, 12136 }, /* Ext16bit_R */ - { 0x1004ff02, 20956 }, /* osfCopy */ - { 0x1004ff03, 20964 }, /* osfCut */ - { 0x1004ff04, 21163 }, /* osfPaste */ - { 0x1004ff07, 20900 }, /* osfBackTab */ - { 0x1004ff08, 20887 }, /* osfBackSpace */ - { 0x1004ff0b, 20947 }, /* osfClear */ - { 0x1004ff1b, 21026 }, /* osfEscape */ - { 0x1004ff31, 20876 }, /* osfAddMode */ - { 0x1004ff32, 21197 }, /* osfPrimaryPaste */ - { 0x1004ff33, 21213 }, /* osfQuickPaste */ - { 0x1004ff40, 21128 }, /* osfPageLeft */ - { 0x1004ff41, 21153 }, /* osfPageUp */ - { 0x1004ff42, 21116 }, /* osfPageDown */ - { 0x1004ff43, 21140 }, /* osfPageRight */ - { 0x1004ff44, 20864 }, /* osfActivate */ - { 0x1004ff45, 21080 }, /* osfMenuBar */ - { 0x1004ff51, 21064 }, /* osfLeft */ - { 0x1004ff52, 21290 }, /* osfUp */ - { 0x1004ff53, 21250 }, /* osfRight */ - { 0x1004ff54, 20996 }, /* osfDown */ - { 0x1004ff57, 21015 }, /* osfEndLine */ - { 0x1004ff58, 20924 }, /* osfBeginLine */ - { 0x1004ff59, 21004 }, /* osfEndData */ - { 0x1004ff5a, 20911 }, /* osfBeginData */ - { 0x1004ff5b, 21185 }, /* osfPrevMenu */ - { 0x1004ff5c, 21104 }, /* osfNextMenu */ - { 0x1004ff5d, 21172 }, /* osfPrevField */ - { 0x1004ff5e, 21091 }, /* osfNextField */ - { 0x1004ff60, 21259 }, /* osfSelect */ - { 0x1004ff63, 21054 }, /* osfInsert */ - { 0x1004ff65, 21282 }, /* osfUndo */ - { 0x1004ff67, 21072 }, /* osfMenu */ - { 0x1004ff69, 20937 }, /* osfCancel */ - { 0x1004ff6a, 21046 }, /* osfHelp */ - { 0x1004ff71, 21269 }, /* osfSelectAll */ - { 0x1004ff72, 20981 }, /* osfDeselectAll */ - { 0x1004ff73, 21227 }, /* osfReselect */ - { 0x1004ff74, 21036 }, /* osfExtend */ - { 0x1004ff78, 21239 }, /* osfRestore */ - { 0x1004ffff, 20971 }, /* osfDelete */ - { 0x1005ff00, 24032 }, /* SunFA_Grave */ - { 0x1005ff01, 24003 }, /* SunFA_Circum */ - { 0x1005ff02, 24044 }, /* SunFA_Tilde */ - { 0x1005ff03, 23977 }, /* SunFA_Acute */ - { 0x1005ff04, 24016 }, /* SunFA_Diaeresis */ - { 0x1005ff05, 23989 }, /* SunFA_Cedilla */ - { 0x1005ff10, 23963 }, /* SunF36 */ - { 0x1005ff11, 23970 }, /* SunF37 */ - { 0x1005ff60, 24180 }, /* SunSys_Req */ - { 0x1005ff70, 24163 }, /* SunProps */ - { 0x1005ff71, 24064 }, /* SunFront */ - { 0x1005ff72, 23948 }, /* SunCopy */ - { 0x1005ff73, 24073 }, /* SunOpen */ - { 0x1005ff74, 24103 }, /* SunPaste */ - { 0x1005ff75, 23956 }, /* SunCut */ - { 0x1005ff76, 24112 }, /* SunPowerSwitch */ - { 0x1005ff77, 23884 }, /* SunAudioLowerVolume */ - { 0x1005ff78, 23904 }, /* SunAudioMute */ - { 0x1005ff79, 23917 }, /* SunAudioRaiseVolume */ - { 0x1005ff7a, 24199 }, /* SunVideoDegauss */ - { 0x1005ff7b, 24215 }, /* SunVideoLowerBrightness */ - { 0x1005ff7c, 24239 }, /* SunVideoRaiseBrightness */ - { 0x1005ff7d, 24127 }, /* SunPowerSwitchShift */ - { 0x1008fe01, 28491 }, /* XF86Switch_VT_1 */ - { 0x1008fe02, 28558 }, /* XF86Switch_VT_2 */ - { 0x1008fe03, 28574 }, /* XF86Switch_VT_3 */ - { 0x1008fe04, 28590 }, /* XF86Switch_VT_4 */ - { 0x1008fe05, 28606 }, /* XF86Switch_VT_5 */ - { 0x1008fe06, 28622 }, /* XF86Switch_VT_6 */ - { 0x1008fe07, 28638 }, /* XF86Switch_VT_7 */ - { 0x1008fe08, 28654 }, /* XF86Switch_VT_8 */ - { 0x1008fe09, 28670 }, /* XF86Switch_VT_9 */ - { 0x1008fe0a, 28507 }, /* XF86Switch_VT_10 */ - { 0x1008fe0b, 28524 }, /* XF86Switch_VT_11 */ - { 0x1008fe0c, 28541 }, /* XF86Switch_VT_12 */ - { 0x1008fe20, 28817 }, /* XF86Ungrab */ - { 0x1008fe21, 27151 }, /* XF86ClearGrab */ - { 0x1008fe22, 27991 }, /* XF86Next_VMode */ - { 0x1008fe23, 28113 }, /* XF86Prev_VMode */ - { 0x1008fe24, 27771 }, /* XF86LogWindowTree */ - { 0x1008fe25, 27744 }, /* XF86LogGrabInfo */ - { 0x1008ff01, 27882 }, /* XF86ModeLock */ - { 0x1008ff02, 27917 }, /* XF86MonBrightnessUp */ - { 0x1008ff03, 27895 }, /* XF86MonBrightnessDown */ - { 0x1008ff04, 27507 }, /* XF86KbdLightOnOff */ - { 0x1008ff05, 27487 }, /* XF86KbdBrightnessUp */ - { 0x1008ff06, 27465 }, /* XF86KbdBrightnessDown */ - { 0x1008ff10, 28423 }, /* XF86Standby */ - { 0x1008ff11, 26749 }, /* XF86AudioLowerVolume */ - { 0x1008ff12, 26802 }, /* XF86AudioMute */ - { 0x1008ff13, 26889 }, /* XF86AudioRaiseVolume */ - { 0x1008ff14, 26845 }, /* XF86AudioPlay */ - { 0x1008ff15, 26978 }, /* XF86AudioStop */ - { 0x1008ff16, 26875 }, /* XF86AudioPrev */ - { 0x1008ff17, 26816 }, /* XF86AudioNext */ - { 0x1008ff18, 27428 }, /* XF86HomePage */ - { 0x1008ff19, 27789 }, /* XF86Mail */ - { 0x1008ff1a, 28435 }, /* XF86Start */ - { 0x1008ff1b, 28347 }, /* XF86Search */ - { 0x1008ff1c, 26930 }, /* XF86AudioRecord */ - { 0x1008ff1d, 27106 }, /* XF86Calculator */ - { 0x1008ff1e, 27837 }, /* XF86Memo */ - { 0x1008ff1f, 28721 }, /* XF86ToDoList */ - { 0x1008ff20, 27121 }, /* XF86Calendar */ - { 0x1008ff21, 28086 }, /* XF86PowerDown */ - { 0x1008ff22, 27189 }, /* XF86ContrastAdjust */ - { 0x1008ff23, 28217 }, /* XF86RockerUp */ - { 0x1008ff24, 28186 }, /* XF86RockerDown */ - { 0x1008ff25, 28201 }, /* XF86RockerEnter */ - { 0x1008ff26, 27001 }, /* XF86Back */ - { 0x1008ff27, 27333 }, /* XF86Forward */ - { 0x1008ff28, 28445 }, /* XF86Stop */ - { 0x1008ff29, 28142 }, /* XF86Refresh */ - { 0x1008ff2a, 28100 }, /* XF86PowerOff */ - { 0x1008ff2b, 28905 }, /* XF86WakeUp */ - { 0x1008ff2c, 27274 }, /* XF86Eject */ - { 0x1008ff2d, 28287 }, /* XF86ScreenSaver */ - { 0x1008ff2e, 28970 }, /* XF86WWW */ - { 0x1008ff2f, 28387 }, /* XF86Sleep */ - { 0x1008ff30, 27307 }, /* XF86Favorites */ - { 0x1008ff31, 26830 }, /* XF86AudioPause */ - { 0x1008ff32, 26770 }, /* XF86AudioMedia */ - { 0x1008ff33, 27947 }, /* XF86MyComputer */ - { 0x1008ff34, 28871 }, /* XF86VendorHome */ - { 0x1008ff35, 27730 }, /* XF86LightBulb */ - { 0x1008ff36, 28378 }, /* XF86Shop */ - { 0x1008ff37, 27416 }, /* XF86History */ - { 0x1008ff38, 28030 }, /* XF86OpenURL */ - { 0x1008ff39, 26655 }, /* XF86AddFavorite */ - { 0x1008ff3a, 27441 }, /* XF86HotLinks */ - { 0x1008ff3b, 27070 }, /* XF86BrightnessAdjust */ - { 0x1008ff3c, 27321 }, /* XF86Finance */ - { 0x1008ff3d, 27175 }, /* XF86Community */ - { 0x1008ff3e, 26962 }, /* XF86AudioRewind */ - { 0x1008ff3f, 27010 }, /* XF86BackForward */ - { 0x1008ff40, 27538 }, /* XF86Launch0 */ - { 0x1008ff41, 27550 }, /* XF86Launch1 */ - { 0x1008ff42, 27562 }, /* XF86Launch2 */ - { 0x1008ff43, 27574 }, /* XF86Launch3 */ - { 0x1008ff44, 27586 }, /* XF86Launch4 */ - { 0x1008ff45, 27598 }, /* XF86Launch5 */ - { 0x1008ff46, 27610 }, /* XF86Launch6 */ - { 0x1008ff47, 27622 }, /* XF86Launch7 */ - { 0x1008ff48, 27634 }, /* XF86Launch8 */ - { 0x1008ff49, 27646 }, /* XF86Launch9 */ - { 0x1008ff4a, 27658 }, /* XF86LaunchA */ - { 0x1008ff4b, 27670 }, /* XF86LaunchB */ - { 0x1008ff4c, 27682 }, /* XF86LaunchC */ - { 0x1008ff4d, 27694 }, /* XF86LaunchD */ - { 0x1008ff4e, 27706 }, /* XF86LaunchE */ - { 0x1008ff4f, 27718 }, /* XF86LaunchF */ - { 0x1008ff50, 26671 }, /* XF86ApplicationLeft */ - { 0x1008ff51, 26691 }, /* XF86ApplicationRight */ - { 0x1008ff52, 27061 }, /* XF86Book */ - { 0x1008ff53, 27134 }, /* XF86CD */ - { 0x1008ff54, 27091 }, /* XF86Calculater */ - { 0x1008ff55, 27141 }, /* XF86Clear */ - { 0x1008ff56, 27165 }, /* XF86Close */ - { 0x1008ff57, 27208 }, /* XF86Copy */ - { 0x1008ff58, 27217 }, /* XF86Cut */ - { 0x1008ff59, 27240 }, /* XF86Display */ - { 0x1008ff5a, 27266 }, /* XF86DOS */ - { 0x1008ff5b, 27252 }, /* XF86Documents */ - { 0x1008ff5c, 27284 }, /* XF86Excel */ - { 0x1008ff5d, 27294 }, /* XF86Explorer */ - { 0x1008ff5e, 27376 }, /* XF86Game */ - { 0x1008ff5f, 27385 }, /* XF86Go */ - { 0x1008ff60, 27454 }, /* XF86iTouch */ - { 0x1008ff61, 27760 }, /* XF86LogOff */ - { 0x1008ff62, 27814 }, /* XF86Market */ - { 0x1008ff63, 27825 }, /* XF86Meeting */ - { 0x1008ff65, 27846 }, /* XF86MenuKB */ - { 0x1008ff66, 27857 }, /* XF86MenuPB */ - { 0x1008ff67, 27962 }, /* XF86MySites */ - { 0x1008ff68, 27974 }, /* XF86New */ - { 0x1008ff69, 27982 }, /* XF86News */ - { 0x1008ff6a, 28006 }, /* XF86OfficeHome */ - { 0x1008ff6b, 28021 }, /* XF86Open */ - { 0x1008ff6c, 28042 }, /* XF86Option */ - { 0x1008ff6d, 28053 }, /* XF86Paste */ - { 0x1008ff6e, 28063 }, /* XF86Phone */ - { 0x1008ff70, 28128 }, /* XF86Q */ - { 0x1008ff72, 28165 }, /* XF86Reply */ - { 0x1008ff73, 28154 }, /* XF86Reload */ - { 0x1008ff74, 28230 }, /* XF86RotateWindows */ - { 0x1008ff75, 28263 }, /* XF86RotationPB */ - { 0x1008ff76, 28248 }, /* XF86RotationKB */ - { 0x1008ff77, 28278 }, /* XF86Save */ - { 0x1008ff78, 28334 }, /* XF86ScrollUp */ - { 0x1008ff79, 28319 }, /* XF86ScrollDown */ - { 0x1008ff7a, 28303 }, /* XF86ScrollClick */ - { 0x1008ff7b, 28369 }, /* XF86Send */ - { 0x1008ff7c, 28397 }, /* XF86Spell */ - { 0x1008ff7d, 28407 }, /* XF86SplitScreen */ - { 0x1008ff7e, 28467 }, /* XF86Support */ - { 0x1008ff7f, 28686 }, /* XF86TaskPane */ - { 0x1008ff80, 28699 }, /* XF86Terminal */ - { 0x1008ff81, 28734 }, /* XF86Tools */ - { 0x1008ff82, 28806 }, /* XF86Travel */ - { 0x1008ff84, 28852 }, /* XF86UserPB */ - { 0x1008ff85, 28828 }, /* XF86User1KB */ - { 0x1008ff86, 28840 }, /* XF86User2KB */ - { 0x1008ff87, 28886 }, /* XF86Video */ - { 0x1008ff88, 28927 }, /* XF86WheelButton */ - { 0x1008ff89, 28952 }, /* XF86Word */ - { 0x1008ff8a, 28978 }, /* XF86Xfer */ - { 0x1008ff8b, 28998 }, /* XF86ZoomIn */ - { 0x1008ff8c, 29009 }, /* XF86ZoomOut */ - { 0x1008ff8d, 26992 }, /* XF86Away */ - { 0x1008ff8e, 27868 }, /* XF86Messenger */ - { 0x1008ff8f, 28916 }, /* XF86WebCam */ - { 0x1008ff90, 27798 }, /* XF86MailForward */ - { 0x1008ff91, 28073 }, /* XF86Pictures */ - { 0x1008ff92, 27937 }, /* XF86Music */ - { 0x1008ff93, 27026 }, /* XF86Battery */ - { 0x1008ff94, 27047 }, /* XF86Bluetooth */ - { 0x1008ff95, 28943 }, /* XF86WLAN */ - { 0x1008ff96, 28863 }, /* XF86UWB */ - { 0x1008ff97, 26732 }, /* XF86AudioForward */ - { 0x1008ff98, 26946 }, /* XF86AudioRepeat */ - { 0x1008ff99, 26910 }, /* XF86AudioRandomPlay */ - { 0x1008ff9a, 28454 }, /* XF86Subtitle */ - { 0x1008ff9b, 26712 }, /* XF86AudioCycleTrack */ - { 0x1008ff9c, 27225 }, /* XF86CycleAngle */ - { 0x1008ff9d, 27345 }, /* XF86FrameBack */ - { 0x1008ff9e, 27359 }, /* XF86FrameForward */ - { 0x1008ff9f, 28712 }, /* XF86Time */ - { 0x1008ffa0, 28358 }, /* XF86Select */ - { 0x1008ffa1, 28896 }, /* XF86View */ - { 0x1008ffa2, 28744 }, /* XF86TopMenu */ - { 0x1008ffa3, 28134 }, /* XF86Red */ - { 0x1008ffa4, 27392 }, /* XF86Green */ - { 0x1008ffa5, 28987 }, /* XF86Yellow */ - { 0x1008ffa6, 27038 }, /* XF86Blue */ - { 0x1008ffa7, 28479 }, /* XF86Suspend */ - { 0x1008ffa8, 27402 }, /* XF86Hibernate */ - { 0x1008ffa9, 28787 }, /* XF86TouchpadToggle */ - { 0x1008ffb0, 28772 }, /* XF86TouchpadOn */ - { 0x1008ffb1, 28756 }, /* XF86TouchpadOff */ - { 0x1008ffb2, 26785 }, /* XF86AudioMicMute */ - { 0x1008ffb3, 27525 }, /* XF86Keyboard */ - { 0x1008ffb4, 28961 }, /* XF86WWAN */ - { 0x1008ffb5, 28175 }, /* XF86RFKill */ - { 0x1008ffb6, 26859 }, /* XF86AudioPreset */ -}; diff --git a/src/3rdparty/xkbcommon/src/scanner-utils.h b/src/3rdparty/xkbcommon/src/scanner-utils.h deleted file mode 100644 index 5fdb22ae9a..0000000000 --- a/src/3rdparty/xkbcommon/src/scanner-utils.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef XKBCOMP_SCANNER_UTILS_H -#define XKBCOMP_SCANNER_UTILS_H - -/* Point to some substring in the file; used to avoid copying. */ -struct sval { - const char *start; - unsigned int len; -}; -typedef darray(struct sval) darray_sval; - -static inline bool -svaleq(struct sval s1, struct sval s2) -{ - return s1.len == s2.len && memcmp(s1.start, s2.start, s1.len) == 0; -} - -static inline bool -svaleq_prefix(struct sval s1, struct sval s2) -{ - return s1.len <= s2.len && memcmp(s1.start, s2.start, s1.len) == 0; -} - -struct scanner { - const char *s; - size_t pos; - size_t len; - char buf[1024]; - size_t buf_pos; - unsigned line, column; - /* The line/column of the start of the current token. */ - unsigned token_line, token_column; - const char *file_name; - struct xkb_context *ctx; - void *priv; -}; - -#define scanner_log(scanner, level, fmt, ...) \ - xkb_log((scanner)->ctx, (level), 0, \ - "%s:%u:%u: " fmt "\n", \ - (scanner)->file_name, \ - (scanner)->token_line, (scanner)->token_column, ##__VA_ARGS__) - -#define scanner_err(scanner, fmt, ...) \ - scanner_log(scanner, XKB_LOG_LEVEL_ERROR, fmt, ##__VA_ARGS__) - -#define scanner_warn(scanner, fmt, ...) \ - scanner_log(scanner, XKB_LOG_LEVEL_WARNING, fmt, ##__VA_ARGS__) - -static inline void -scanner_init(struct scanner *s, struct xkb_context *ctx, - const char *string, size_t len, const char *file_name, - void *priv) -{ - s->s = string; - s->len = len; - s->pos = 0; - s->line = s->column = 1; - s->token_line = s->token_column = 1; - s->file_name = file_name; - s->ctx = ctx; - s->priv = priv; -} - -static inline char -peek(struct scanner *s) -{ - if (unlikely(s->pos >= s->len)) - return '\0'; - return s->s[s->pos]; -} - -static inline bool -eof(struct scanner *s) -{ - return s->pos >= s->len; -} - -static inline bool -eol(struct scanner *s) -{ - return peek(s) == '\n'; -} - -static inline void -skip_to_eol(struct scanner *s) -{ - const char *nl = memchr(s->s + s->pos, '\n', s->len - s->pos); - const size_t new_pos = nl ? (size_t) (nl - s->s) : s->len; - s->column += new_pos - s->pos; - s->pos = new_pos; -} - -static inline char -next(struct scanner *s) -{ - if (unlikely(eof(s))) - return '\0'; - if (unlikely(eol(s))) { - s->line++; - s->column = 1; - } - else { - s->column++; - } - return s->s[s->pos++]; -} - -static inline bool -chr(struct scanner *s, char ch) -{ - if (likely(peek(s) != ch)) - return false; - s->pos++; s->column++; - return true; -} - -static inline bool -str(struct scanner *s, const char *string, size_t len) -{ - if (s->len - s->pos < len) - return false; - if (memcmp(s->s + s->pos, string, len) != 0) - return false; - s->pos += len; s->column += len; - return true; -} - -#define lit(s, literal) str(s, literal, sizeof(literal) - 1) - -static inline bool -buf_append(struct scanner *s, char ch) -{ - if (s->buf_pos + 1 >= sizeof(s->buf)) - return false; - s->buf[s->buf_pos++] = ch; - return true; -} - -static inline bool -buf_appends(struct scanner *s, const char *str) -{ - int ret; - ret = snprintf(s->buf + s->buf_pos, sizeof(s->buf) - s->buf_pos, "%s", str); - if (ret < 0 || (size_t) ret >= sizeof(s->buf) - s->buf_pos) - return false; - s->buf_pos += ret; - return true; -} - -static inline bool -oct(struct scanner *s, uint8_t *out) -{ - int i; - for (i = 0, *out = 0; peek(s) >= '0' && peek(s) <= '7' && i < 3; i++) - *out = *out * 8 + next(s) - '0'; - return i > 0; -} - -static inline bool -hex(struct scanner *s, uint8_t *out) -{ - int i; - for (i = 0, *out = 0; is_xdigit(peek(s)) && i < 2; i++) { - const char c = next(s); - const char offset = (c >= '0' && c <= '9' ? '0' : - c >= 'a' && c <= 'f' ? 'a' - 10 : 'A' - 10); - *out = *out * 16 + c - offset; - } - return i > 0; -} - -#endif diff --git a/src/3rdparty/xkbcommon/src/state.c b/src/3rdparty/xkbcommon/src/state.c deleted file mode 100644 index 16a4caa23d..0000000000 --- a/src/3rdparty/xkbcommon/src/state.c +++ /dev/null @@ -1,1446 +0,0 @@ -/************************************************************ - * Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone <daniel@fooishbar.org> - */ - -/* - * This is a bastardised version of xkbActions.c from the X server which - * does not support, for the moment: - * - AccessX sticky/debounce/etc (will come later) - * - pointer keys (may come later) - * - key redirects (unlikely) - * - messages (very unlikely) - */ - -#include "keymap.h" -#include "keysym.h" -#include "utf8.h" - -struct xkb_filter { - union xkb_action action; - const struct xkb_key *key; - uint32_t priv; - bool (*func)(struct xkb_state *state, - struct xkb_filter *filter, - const struct xkb_key *key, - enum xkb_key_direction direction); - int refcnt; -}; - -struct state_components { - /* These may be negative, because of -1 group actions. */ - int32_t base_group; /**< depressed */ - int32_t latched_group; - int32_t locked_group; - xkb_layout_index_t group; /**< effective */ - - xkb_mod_mask_t base_mods; /**< depressed */ - xkb_mod_mask_t latched_mods; - xkb_mod_mask_t locked_mods; - xkb_mod_mask_t mods; /**< effective */ - - xkb_led_mask_t leds; -}; - -struct xkb_state { - /* - * Before updating the state, we keep a copy of just this struct. This - * allows us to report which components of the state have changed. - */ - struct state_components components; - - /* - * At each event, we accumulate all the needed modifications to the base - * modifiers, and apply them at the end. These keep track of this state. - */ - xkb_mod_mask_t set_mods; - xkb_mod_mask_t clear_mods; - - /* - * We mustn't clear a base modifier if there's another depressed key - * which affects it, e.g. given this sequence - * < Left Shift down, Right Shift down, Left Shift Up > - * the modifier should still be set. This keeps the count. - */ - int16_t mod_key_count[XKB_MAX_MODS]; - - int refcnt; - darray(struct xkb_filter) filters; - struct xkb_keymap *keymap; -}; - -/* - * If the virtual modifiers are not bound to anything, the entry - * is not active and should be skipped. xserver does this with - * cached entry->active field. - */ -static bool -entry_is_active(const struct xkb_key_type_entry *entry) -{ - return entry->mods.mods == 0 || entry->mods.mask != 0; -} - -static const struct xkb_key_type_entry * -get_entry_for_mods(const struct xkb_key_type *type, xkb_mod_mask_t mods) -{ - for (unsigned i = 0; i < type->num_entries; i++) - if (entry_is_active(&type->entries[i]) && - type->entries[i].mods.mask == mods) - return &type->entries[i]; - return NULL; -} - -static const struct xkb_key_type_entry * -get_entry_for_key_state(struct xkb_state *state, const struct xkb_key *key, - xkb_layout_index_t group) -{ - const struct xkb_key_type *type = key->groups[group].type; - xkb_mod_mask_t active_mods = state->components.mods & type->mods.mask; - return get_entry_for_mods(type, active_mods); -} - -/** - * Returns the level to use for the given key and state, or - * XKB_LEVEL_INVALID. - */ -XKB_EXPORT xkb_level_index_t -xkb_state_key_get_level(struct xkb_state *state, xkb_keycode_t kc, - xkb_layout_index_t layout) -{ - const struct xkb_key *key = XkbKey(state->keymap, kc); - const struct xkb_key_type_entry *entry; - - if (!key || layout >= key->num_groups) - return XKB_LEVEL_INVALID; - - /* If we don't find an explicit match the default is 0. */ - entry = get_entry_for_key_state(state, key, layout); - if (!entry) - return 0; - - return entry->level; -} - -xkb_layout_index_t -XkbWrapGroupIntoRange(int32_t group, - xkb_layout_index_t num_groups, - enum xkb_range_exceed_type out_of_range_group_action, - xkb_layout_index_t out_of_range_group_number) -{ - if (num_groups == 0) - return XKB_LAYOUT_INVALID; - - if (group >= 0 && (xkb_layout_index_t) group < num_groups) - return group; - - switch (out_of_range_group_action) { - case RANGE_REDIRECT: - if (out_of_range_group_number >= num_groups) - return 0; - return out_of_range_group_number; - - case RANGE_SATURATE: - if (group < 0) - return 0; - else - return num_groups - 1; - - case RANGE_WRAP: - default: - /* - * C99 says a negative dividend in a modulo operation always - * gives a negative result. - */ - if (group < 0) - return ((int) num_groups + (group % (int) num_groups)); - else - return group % num_groups; - } -} - -/** - * Returns the layout to use for the given key and state, taking - * wrapping/clamping/etc into account, or XKB_LAYOUT_INVALID. - */ -XKB_EXPORT xkb_layout_index_t -xkb_state_key_get_layout(struct xkb_state *state, xkb_keycode_t kc) -{ - const struct xkb_key *key = XkbKey(state->keymap, kc); - - if (!key) - return XKB_LAYOUT_INVALID; - - return XkbWrapGroupIntoRange(state->components.group, key->num_groups, - key->out_of_range_group_action, - key->out_of_range_group_number); -} - -static const union xkb_action * -xkb_key_get_action(struct xkb_state *state, const struct xkb_key *key) -{ - static const union xkb_action dummy = { .type = ACTION_TYPE_NONE }; - - xkb_layout_index_t layout; - xkb_level_index_t level; - - layout = xkb_state_key_get_layout(state, key->keycode); - if (layout == XKB_LAYOUT_INVALID) - return &dummy; - - level = xkb_state_key_get_level(state, key->keycode, layout); - if (level == XKB_LEVEL_INVALID) - return &dummy; - - return &key->groups[layout].levels[level].action; -} - -static struct xkb_filter * -xkb_filter_new(struct xkb_state *state) -{ - struct xkb_filter *filter = NULL, *iter; - - darray_foreach(iter, state->filters) { - if (iter->func) - continue; - filter = iter; - break; - } - - if (!filter) { - darray_resize0(state->filters, darray_size(state->filters) + 1); - filter = &darray_item(state->filters, darray_size(state->filters) -1); - } - - filter->refcnt = 1; - return filter; -} - -/***====================================================================***/ - -enum xkb_filter_result { - /* - * The event is consumed by the filters. - * - * An event is always processed by all filters, but any filter can - * prevent it from being processed further by consuming it. - */ - XKB_FILTER_CONSUME, - /* - * The event may continue to be processed as far as this filter is - * concerned. - */ - XKB_FILTER_CONTINUE, -}; - -static void -xkb_filter_group_set_new(struct xkb_state *state, struct xkb_filter *filter) -{ - filter->priv = state->components.base_group; - if (filter->action.group.flags & ACTION_ABSOLUTE_SWITCH) - state->components.base_group = filter->action.group.group; - else - state->components.base_group += filter->action.group.group; -} - -static bool -xkb_filter_group_set_func(struct xkb_state *state, - struct xkb_filter *filter, - const struct xkb_key *key, - enum xkb_key_direction direction) -{ - if (key != filter->key) { - filter->action.group.flags &= ~ACTION_LOCK_CLEAR; - return XKB_FILTER_CONTINUE; - } - - if (direction == XKB_KEY_DOWN) { - filter->refcnt++; - return XKB_FILTER_CONSUME; - } - else if (--filter->refcnt > 0) { - return XKB_FILTER_CONSUME; - } - - state->components.base_group = filter->priv; - - if (filter->action.group.flags & ACTION_LOCK_CLEAR) - state->components.locked_group = 0; - - filter->func = NULL; - return XKB_FILTER_CONTINUE; -} - -static void -xkb_filter_group_lock_new(struct xkb_state *state, struct xkb_filter *filter) -{ - if (filter->action.group.flags & ACTION_ABSOLUTE_SWITCH) - state->components.locked_group = filter->action.group.group; - else - state->components.locked_group += filter->action.group.group; -} - -static bool -xkb_filter_group_lock_func(struct xkb_state *state, - struct xkb_filter *filter, - const struct xkb_key *key, - enum xkb_key_direction direction) -{ - if (key != filter->key) - return XKB_FILTER_CONTINUE; - - if (direction == XKB_KEY_DOWN) { - filter->refcnt++; - return XKB_FILTER_CONSUME; - } - if (--filter->refcnt > 0) - return XKB_FILTER_CONSUME; - - filter->func = NULL; - return XKB_FILTER_CONTINUE; -} - -static void -xkb_filter_mod_set_new(struct xkb_state *state, struct xkb_filter *filter) -{ - state->set_mods = filter->action.mods.mods.mask; -} - -static bool -xkb_filter_mod_set_func(struct xkb_state *state, - struct xkb_filter *filter, - const struct xkb_key *key, - enum xkb_key_direction direction) -{ - if (key != filter->key) { - filter->action.mods.flags &= ~ACTION_LOCK_CLEAR; - return XKB_FILTER_CONTINUE; - } - - if (direction == XKB_KEY_DOWN) { - filter->refcnt++; - return XKB_FILTER_CONSUME; - } - else if (--filter->refcnt > 0) { - return XKB_FILTER_CONSUME; - } - - state->clear_mods = filter->action.mods.mods.mask; - if (filter->action.mods.flags & ACTION_LOCK_CLEAR) - state->components.locked_mods &= ~filter->action.mods.mods.mask; - - filter->func = NULL; - return XKB_FILTER_CONTINUE; -} - -static void -xkb_filter_mod_lock_new(struct xkb_state *state, struct xkb_filter *filter) -{ - filter->priv = (state->components.locked_mods & - filter->action.mods.mods.mask); - state->set_mods |= filter->action.mods.mods.mask; - if (!(filter->action.mods.flags & ACTION_LOCK_NO_LOCK)) - state->components.locked_mods |= filter->action.mods.mods.mask; -} - -static bool -xkb_filter_mod_lock_func(struct xkb_state *state, - struct xkb_filter *filter, - const struct xkb_key *key, - enum xkb_key_direction direction) -{ - if (key != filter->key) - return XKB_FILTER_CONTINUE; - - if (direction == XKB_KEY_DOWN) { - filter->refcnt++; - return XKB_FILTER_CONSUME; - } - if (--filter->refcnt > 0) - return XKB_FILTER_CONSUME; - - state->clear_mods |= filter->action.mods.mods.mask; - if (!(filter->action.mods.flags & ACTION_LOCK_NO_UNLOCK)) - state->components.locked_mods &= ~filter->priv; - - filter->func = NULL; - return XKB_FILTER_CONTINUE; -} - -enum xkb_key_latch_state { - NO_LATCH, - LATCH_KEY_DOWN, - LATCH_PENDING, -}; - -static bool -xkb_action_breaks_latch(const union xkb_action *action) -{ - switch (action->type) { - case ACTION_TYPE_NONE: - case ACTION_TYPE_PTR_BUTTON: - case ACTION_TYPE_PTR_LOCK: - case ACTION_TYPE_CTRL_SET: - case ACTION_TYPE_CTRL_LOCK: - case ACTION_TYPE_SWITCH_VT: - case ACTION_TYPE_TERMINATE: - return true; - default: - return false; - } -} - -static void -xkb_filter_mod_latch_new(struct xkb_state *state, struct xkb_filter *filter) -{ - filter->priv = LATCH_KEY_DOWN; - state->set_mods = filter->action.mods.mods.mask; -} - -static bool -xkb_filter_mod_latch_func(struct xkb_state *state, - struct xkb_filter *filter, - const struct xkb_key *key, - enum xkb_key_direction direction) -{ - enum xkb_key_latch_state latch = filter->priv; - - if (direction == XKB_KEY_DOWN && latch == LATCH_PENDING) { - /* If this is a new keypress and we're awaiting our single latched - * keypress, then either break the latch if any random key is pressed, - * or promote it to a lock or plain base set if it's the same - * modifier. */ - const union xkb_action *action = xkb_key_get_action(state, key); - if (action->type == ACTION_TYPE_MOD_LATCH && - action->mods.flags == filter->action.mods.flags && - action->mods.mods.mask == filter->action.mods.mods.mask) { - filter->action = *action; - if (filter->action.mods.flags & ACTION_LATCH_TO_LOCK) { - filter->action.type = ACTION_TYPE_MOD_LOCK; - filter->func = xkb_filter_mod_lock_func; - state->components.locked_mods |= filter->action.mods.mods.mask; - } - else { - filter->action.type = ACTION_TYPE_MOD_SET; - filter->func = xkb_filter_mod_set_func; - state->set_mods = filter->action.mods.mods.mask; - } - filter->key = key; - state->components.latched_mods &= ~filter->action.mods.mods.mask; - /* XXX beep beep! */ - return XKB_FILTER_CONSUME; - } - else if (xkb_action_breaks_latch(action)) { - /* XXX: This may be totally broken, we might need to break the - * latch in the next run after this press? */ - state->components.latched_mods &= ~filter->action.mods.mods.mask; - filter->func = NULL; - return XKB_FILTER_CONTINUE; - } - } - else if (direction == XKB_KEY_UP && key == filter->key) { - /* Our key got released. If we've set it to clear locks, and we - * currently have the same modifiers locked, then release them and - * don't actually latch. Else we've actually hit the latching - * stage, so set PENDING and move our modifier from base to - * latched. */ - if (latch == NO_LATCH || - ((filter->action.mods.flags & ACTION_LOCK_CLEAR) && - (state->components.locked_mods & filter->action.mods.mods.mask) == - filter->action.mods.mods.mask)) { - /* XXX: We might be a bit overenthusiastic about clearing - * mods other filters have set here? */ - if (latch == LATCH_PENDING) - state->components.latched_mods &= - ~filter->action.mods.mods.mask; - else - state->clear_mods = filter->action.mods.mods.mask; - state->components.locked_mods &= ~filter->action.mods.mods.mask; - filter->func = NULL; - } - else { - latch = LATCH_PENDING; - state->clear_mods = filter->action.mods.mods.mask; - state->components.latched_mods |= filter->action.mods.mods.mask; - /* XXX beep beep! */ - } - } - else if (direction == XKB_KEY_DOWN && latch == LATCH_KEY_DOWN) { - /* Someone's pressed another key while we've still got the latching - * key held down, so keep the base modifier state active (from - * xkb_filter_mod_latch_new), but don't trip the latch, just clear - * it as soon as the modifier gets released. */ - latch = NO_LATCH; - } - - filter->priv = latch; - - return XKB_FILTER_CONTINUE; -} - -static const struct { - void (*new)(struct xkb_state *state, struct xkb_filter *filter); - bool (*func)(struct xkb_state *state, struct xkb_filter *filter, - const struct xkb_key *key, enum xkb_key_direction direction); -} filter_action_funcs[_ACTION_TYPE_NUM_ENTRIES] = { - [ACTION_TYPE_MOD_SET] = { xkb_filter_mod_set_new, - xkb_filter_mod_set_func }, - [ACTION_TYPE_MOD_LATCH] = { xkb_filter_mod_latch_new, - xkb_filter_mod_latch_func }, - [ACTION_TYPE_MOD_LOCK] = { xkb_filter_mod_lock_new, - xkb_filter_mod_lock_func }, - [ACTION_TYPE_GROUP_SET] = { xkb_filter_group_set_new, - xkb_filter_group_set_func }, - [ACTION_TYPE_GROUP_LOCK] = { xkb_filter_group_lock_new, - xkb_filter_group_lock_func }, -}; - -/** - * Applies any relevant filters to the key, first from the list of filters - * that are currently active, then if no filter has claimed the key, possibly - * apply a new filter from the key action. - */ -static void -xkb_filter_apply_all(struct xkb_state *state, - const struct xkb_key *key, - enum xkb_key_direction direction) -{ - struct xkb_filter *filter; - const union xkb_action *action; - bool consumed; - - /* First run through all the currently active filters and see if any of - * them have consumed this event. */ - consumed = false; - darray_foreach(filter, state->filters) { - if (!filter->func) - continue; - - if (filter->func(state, filter, key, direction) == XKB_FILTER_CONSUME) - consumed = true; - } - if (consumed || direction == XKB_KEY_UP) - return; - - action = xkb_key_get_action(state, key); - - /* - * It's possible for the keymap to set action->type explicitly, like so: - * interpret XF86_Next_VMode { - * action = Private(type=0x86, data="+VMode"); - * }; - * We don't handle those. - */ - if (action->type >= _ACTION_TYPE_NUM_ENTRIES) - return; - - if (!filter_action_funcs[action->type].new) - return; - - filter = xkb_filter_new(state); - filter->key = key; - filter->func = filter_action_funcs[action->type].func; - filter->action = *action; - filter_action_funcs[action->type].new(state, filter); -} - -XKB_EXPORT struct xkb_state * -xkb_state_new(struct xkb_keymap *keymap) -{ - struct xkb_state *ret; - - ret = calloc(sizeof(*ret), 1); - if (!ret) - return NULL; - - ret->refcnt = 1; - ret->keymap = xkb_keymap_ref(keymap); - - return ret; -} - -XKB_EXPORT struct xkb_state * -xkb_state_ref(struct xkb_state *state) -{ - state->refcnt++; - return state; -} - -XKB_EXPORT void -xkb_state_unref(struct xkb_state *state) -{ - if (!state || --state->refcnt > 0) - return; - - xkb_keymap_unref(state->keymap); - darray_free(state->filters); - free(state); -} - -XKB_EXPORT struct xkb_keymap * -xkb_state_get_keymap(struct xkb_state *state) -{ - return state->keymap; -} - -/** - * Update the LED state to match the rest of the xkb_state. - */ -static void -xkb_state_led_update_all(struct xkb_state *state) -{ - xkb_led_index_t idx; - const struct xkb_led *led; - - state->components.leds = 0; - - xkb_leds_enumerate(idx, led, state->keymap) { - xkb_mod_mask_t mod_mask = 0; - xkb_layout_mask_t group_mask = 0; - - if (led->which_mods != 0 && led->mods.mask != 0) { - if (led->which_mods & XKB_STATE_MODS_EFFECTIVE) - mod_mask |= state->components.mods; - if (led->which_mods & XKB_STATE_MODS_DEPRESSED) - mod_mask |= state->components.base_mods; - if (led->which_mods & XKB_STATE_MODS_LATCHED) - mod_mask |= state->components.latched_mods; - if (led->which_mods & XKB_STATE_MODS_LOCKED) - mod_mask |= state->components.locked_mods; - - if (led->mods.mask & mod_mask) { - state->components.leds |= (1u << idx); - continue; - } - } - - if (led->which_groups != 0 && led->groups != 0) { - if (led->which_groups & XKB_STATE_LAYOUT_EFFECTIVE) - group_mask |= (1u << state->components.group); - if (led->which_groups & XKB_STATE_LAYOUT_DEPRESSED) - group_mask |= (1u << state->components.base_group); - if (led->which_groups & XKB_STATE_LAYOUT_LATCHED) - group_mask |= (1u << state->components.latched_group); - if (led->which_groups & XKB_STATE_LAYOUT_LOCKED) - group_mask |= (1u << state->components.locked_group); - - if (led->groups & group_mask) { - state->components.leds |= (1u << idx); - continue; - } - } - - if (led->ctrls & state->keymap->enabled_ctrls) { - state->components.leds |= (1u << idx); - continue; - } - } -} - -/** - * Calculates the derived state (effective mods/group and LEDs) from an - * up-to-date xkb_state. - */ -static void -xkb_state_update_derived(struct xkb_state *state) -{ - xkb_layout_index_t wrapped; - - state->components.mods = (state->components.base_mods | - state->components.latched_mods | - state->components.locked_mods); - - /* TODO: Use groups_wrap control instead of always RANGE_WRAP. */ - - wrapped = XkbWrapGroupIntoRange(state->components.locked_group, - state->keymap->num_groups, - RANGE_WRAP, 0); - state->components.locked_group = - (wrapped == XKB_LAYOUT_INVALID ? 0 : wrapped); - - wrapped = XkbWrapGroupIntoRange(state->components.base_group + - state->components.latched_group + - state->components.locked_group, - state->keymap->num_groups, - RANGE_WRAP, 0); - state->components.group = - (wrapped == XKB_LAYOUT_INVALID ? 0 : wrapped); - - xkb_state_led_update_all(state); -} - -static enum xkb_state_component -get_state_component_changes(const struct state_components *a, - const struct state_components *b) -{ - xkb_mod_mask_t mask = 0; - - if (a->group != b->group) - mask |= XKB_STATE_LAYOUT_EFFECTIVE; - if (a->base_group != b->base_group) - mask |= XKB_STATE_LAYOUT_DEPRESSED; - if (a->latched_group != b->latched_group) - mask |= XKB_STATE_LAYOUT_LATCHED; - if (a->locked_group != b->locked_group) - mask |= XKB_STATE_LAYOUT_LOCKED; - if (a->mods != b->mods) - mask |= XKB_STATE_MODS_EFFECTIVE; - if (a->base_mods != b->base_mods) - mask |= XKB_STATE_MODS_DEPRESSED; - if (a->latched_mods != b->latched_mods) - mask |= XKB_STATE_MODS_LATCHED; - if (a->locked_mods != b->locked_mods) - mask |= XKB_STATE_MODS_LOCKED; - if (a->leds != b->leds) - mask |= XKB_STATE_LEDS; - - return mask; -} - -/** - * Given a particular key event, updates the state structure to reflect the - * new modifiers. - */ -XKB_EXPORT enum xkb_state_component -xkb_state_update_key(struct xkb_state *state, xkb_keycode_t kc, - enum xkb_key_direction direction) -{ - xkb_mod_index_t i; - xkb_mod_mask_t bit; - struct state_components prev_components; - const struct xkb_key *key = XkbKey(state->keymap, kc); - - if (!key) - return 0; - - prev_components = state->components; - - state->set_mods = 0; - state->clear_mods = 0; - - xkb_filter_apply_all(state, key, direction); - - for (i = 0, bit = 1; state->set_mods; i++, bit <<= 1) { - if (state->set_mods & bit) { - state->mod_key_count[i]++; - state->components.base_mods |= bit; - state->set_mods &= ~bit; - } - } - - for (i = 0, bit = 1; state->clear_mods; i++, bit <<= 1) { - if (state->clear_mods & bit) { - state->mod_key_count[i]--; - if (state->mod_key_count[i] <= 0) { - state->components.base_mods &= ~bit; - state->mod_key_count[i] = 0; - } - state->clear_mods &= ~bit; - } - } - - xkb_state_update_derived(state); - - return get_state_component_changes(&prev_components, &state->components); -} - -/** - * Updates the state from a set of explicit masks as gained from - * xkb_state_serialize_mods and xkb_state_serialize_groups. As noted in the - * documentation for these functions in xkbcommon.h, this round-trip is - * lossy, and should only be used to update a slave state mirroring the - * master, e.g. in a client/server window system. - */ -XKB_EXPORT enum xkb_state_component -xkb_state_update_mask(struct xkb_state *state, - xkb_mod_mask_t base_mods, - xkb_mod_mask_t latched_mods, - xkb_mod_mask_t locked_mods, - xkb_layout_index_t base_group, - xkb_layout_index_t latched_group, - xkb_layout_index_t locked_group) -{ - struct state_components prev_components; - xkb_mod_mask_t mask; - - prev_components = state->components; - - /* Only include modifiers which exist in the keymap. */ - mask = (xkb_mod_mask_t) ((1ull << xkb_keymap_num_mods(state->keymap)) - 1u); - - state->components.base_mods = base_mods & mask; - state->components.latched_mods = latched_mods & mask; - state->components.locked_mods = locked_mods & mask; - - /* Make sure the mods are fully resolved - since we get arbitrary - * input, they might not be. - * - * It might seem more reasonable to do this only for components.mods - * in xkb_state_update_derived(), rather than for each component - * seperately. That would allow to distinguish between "really" - * depressed mods (would be in MODS_DEPRESSED) and indirectly - * depressed to to a mapping (would only be in MODS_EFFECTIVE). - * However, the traditional behavior of xkb_state_update_key() is that - * if a vmod is depressed, its mappings are depressed with it; so we're - * expected to do the same here. Also, LEDs (usually) look if a real - * mod is locked, not just effective; otherwise it won't be lit. - * - * We OR here because mod_mask_get_effective() drops vmods. */ - state->components.base_mods |= - mod_mask_get_effective(state->keymap, state->components.base_mods); - state->components.latched_mods |= - mod_mask_get_effective(state->keymap, state->components.latched_mods); - state->components.locked_mods |= - mod_mask_get_effective(state->keymap, state->components.locked_mods); - - state->components.base_group = base_group; - state->components.latched_group = latched_group; - state->components.locked_group = locked_group; - - xkb_state_update_derived(state); - - return get_state_component_changes(&prev_components, &state->components); -} - -/** - * Provides the symbols to use for the given key and state. Returns the - * number of symbols pointed to in syms_out. - */ -XKB_EXPORT int -xkb_state_key_get_syms(struct xkb_state *state, xkb_keycode_t kc, - const xkb_keysym_t **syms_out) -{ - xkb_layout_index_t layout; - xkb_level_index_t level; - - layout = xkb_state_key_get_layout(state, kc); - if (layout == XKB_LAYOUT_INVALID) - goto err; - - level = xkb_state_key_get_level(state, kc, layout); - if (level == XKB_LEVEL_INVALID) - goto err; - - return xkb_keymap_key_get_syms_by_level(state->keymap, kc, layout, level, - syms_out); - -err: - *syms_out = NULL; - return 0; -} - -/* - * https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Lock_Modifier - */ -static bool -should_do_caps_transformation(struct xkb_state *state, xkb_keycode_t kc) -{ - xkb_mod_index_t caps = - xkb_keymap_mod_get_index(state->keymap, XKB_MOD_NAME_CAPS); - - return - xkb_state_mod_index_is_active(state, caps, XKB_STATE_MODS_EFFECTIVE) > 0 && - xkb_state_mod_index_is_consumed(state, kc, caps) == 0; -} - -/* - * https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Control_Modifier - */ -static bool -should_do_ctrl_transformation(struct xkb_state *state, xkb_keycode_t kc) -{ - xkb_mod_index_t ctrl = - xkb_keymap_mod_get_index(state->keymap, XKB_MOD_NAME_CTRL); - - return - xkb_state_mod_index_is_active(state, ctrl, XKB_STATE_MODS_EFFECTIVE) > 0 && - xkb_state_mod_index_is_consumed(state, kc, ctrl) == 0; -} - -/* Verbatim from libX11:src/xkb/XKBBind.c */ -static char -XkbToControl(char ch) -{ - char c = ch; - - if ((c >= '@' && c < '\177') || c == ' ') - c &= 0x1F; - else if (c == '2') - c = '\000'; - else if (c >= '3' && c <= '7') - c -= ('3' - '\033'); - else if (c == '8') - c = '\177'; - else if (c == '/') - c = '_' & 0x1F; - return c; -} - -/** - * Provides either exactly one symbol, or XKB_KEY_NoSymbol. - */ -XKB_EXPORT xkb_keysym_t -xkb_state_key_get_one_sym(struct xkb_state *state, xkb_keycode_t kc) -{ - const xkb_keysym_t *syms; - xkb_keysym_t sym; - int num_syms; - - num_syms = xkb_state_key_get_syms(state, kc, &syms); - if (num_syms != 1) - return XKB_KEY_NoSymbol; - - sym = syms[0]; - - if (should_do_caps_transformation(state, kc)) - sym = xkb_keysym_to_upper(sym); - - return sym; -} - -/* - * The caps and ctrl transformations require some special handling, - * so we cannot simply use xkb_state_get_one_sym() for them. - * In particular, if Control is set, we must try very hard to find - * some layout in which the keysym is ASCII and thus can be (maybe) - * converted to a control character. libX11 allows to disable this - * behavior with the XkbLC_ControlFallback (see XkbSetXlibControls(3)), - * but it is enabled by default, yippee. - */ -static xkb_keysym_t -get_one_sym_for_string(struct xkb_state *state, xkb_keycode_t kc) -{ - xkb_level_index_t level; - xkb_layout_index_t layout, num_layouts; - const xkb_keysym_t *syms; - int nsyms; - xkb_keysym_t sym; - - layout = xkb_state_key_get_layout(state, kc); - num_layouts = xkb_keymap_num_layouts_for_key(state->keymap, kc); - level = xkb_state_key_get_level(state, kc, layout); - if (layout == XKB_LAYOUT_INVALID || num_layouts == 0 || - level == XKB_LEVEL_INVALID) - return XKB_KEY_NoSymbol; - - nsyms = xkb_keymap_key_get_syms_by_level(state->keymap, kc, - layout, level, &syms); - if (nsyms != 1) - return XKB_KEY_NoSymbol; - sym = syms[0]; - - if (should_do_ctrl_transformation(state, kc) && sym > 127u) { - for (xkb_layout_index_t i = 0; i < num_layouts; i++) { - level = xkb_state_key_get_level(state, kc, i); - if (level == XKB_LEVEL_INVALID) - continue; - - nsyms = xkb_keymap_key_get_syms_by_level(state->keymap, kc, - i, level, &syms); - if (nsyms == 1 && syms[0] <= 127u) { - sym = syms[0]; - break; - } - } - } - - if (should_do_caps_transformation(state, kc)) { - sym = xkb_keysym_to_upper(sym); - } - - return sym; -} - -XKB_EXPORT int -xkb_state_key_get_utf8(struct xkb_state *state, xkb_keycode_t kc, - char *buffer, size_t size) -{ - xkb_keysym_t sym; - const xkb_keysym_t *syms; - int nsyms; - int offset; - char tmp[7]; - - sym = get_one_sym_for_string(state, kc); - if (sym != XKB_KEY_NoSymbol) { - nsyms = 1; syms = &sym; - } - else { - nsyms = xkb_state_key_get_syms(state, kc, &syms); - } - - /* Make sure not to truncate in the middle of a UTF-8 sequence. */ - offset = 0; - for (int i = 0; i < nsyms; i++) { - int ret = xkb_keysym_to_utf8(syms[i], tmp, sizeof(tmp)); - if (ret <= 0) - goto err_bad; - - ret--; - if ((size_t) (offset + ret) <= size) - memcpy(buffer + offset, tmp, ret); - offset += ret; - } - - if ((size_t) offset >= size) - goto err_trunc; - buffer[offset] = '\0'; - - if (!is_valid_utf8(buffer, offset)) - goto err_bad; - - if (offset == 1 && (unsigned int) buffer[0] <= 127u && - should_do_ctrl_transformation(state, kc)) - buffer[0] = XkbToControl(buffer[0]); - - return offset; - -err_trunc: - if (size > 0) - buffer[size - 1] = '\0'; - return offset; - -err_bad: - if (size > 0) - buffer[0] = '\0'; - return 0; -} - -XKB_EXPORT uint32_t -xkb_state_key_get_utf32(struct xkb_state *state, xkb_keycode_t kc) -{ - xkb_keysym_t sym; - uint32_t cp; - - sym = get_one_sym_for_string(state, kc); - cp = xkb_keysym_to_utf32(sym); - - if (cp <= 127u && should_do_ctrl_transformation(state, kc)) - cp = (uint32_t) XkbToControl((char) cp); - - return cp; -} - -/** - * Serialises the requested modifier state into an xkb_mod_mask_t, with all - * the same disclaimers as in xkb_state_update_mask. - */ -XKB_EXPORT xkb_mod_mask_t -xkb_state_serialize_mods(struct xkb_state *state, - enum xkb_state_component type) -{ - xkb_mod_mask_t ret = 0; - - if (type & XKB_STATE_MODS_EFFECTIVE) - return state->components.mods; - - if (type & XKB_STATE_MODS_DEPRESSED) - ret |= state->components.base_mods; - if (type & XKB_STATE_MODS_LATCHED) - ret |= state->components.latched_mods; - if (type & XKB_STATE_MODS_LOCKED) - ret |= state->components.locked_mods; - - return ret; -} - -/** - * Serialises the requested group state, with all the same disclaimers as - * in xkb_state_update_mask. - */ -XKB_EXPORT xkb_layout_index_t -xkb_state_serialize_layout(struct xkb_state *state, - enum xkb_state_component type) -{ - xkb_layout_index_t ret = 0; - - if (type & XKB_STATE_LAYOUT_EFFECTIVE) - return state->components.group; - - if (type & XKB_STATE_LAYOUT_DEPRESSED) - ret += state->components.base_group; - if (type & XKB_STATE_LAYOUT_LATCHED) - ret += state->components.latched_group; - if (type & XKB_STATE_LAYOUT_LOCKED) - ret += state->components.locked_group; - - return ret; -} - -/** - * Gets a modifier mask and returns the resolved effective mask; this - * is needed because some modifiers can also map to other modifiers, e.g. - * the "NumLock" modifier usually also sets the "Mod2" modifier. - */ -xkb_mod_mask_t -mod_mask_get_effective(struct xkb_keymap *keymap, xkb_mod_mask_t mods) -{ - const struct xkb_mod *mod; - xkb_mod_index_t i; - xkb_mod_mask_t mask; - - /* The effective mask is only real mods for now. */ - mask = mods & MOD_REAL_MASK_ALL; - - xkb_mods_enumerate(i, mod, &keymap->mods) - if (mods & (1u << i)) - mask |= mod->mapping; - - return mask; -} - -/** - * Returns 1 if the given modifier is active with the specified type(s), 0 if - * not, or -1 if the modifier is invalid. - */ -XKB_EXPORT int -xkb_state_mod_index_is_active(struct xkb_state *state, - xkb_mod_index_t idx, - enum xkb_state_component type) -{ - if (idx >= xkb_keymap_num_mods(state->keymap)) - return -1; - - return !!(xkb_state_serialize_mods(state, type) & (1u << idx)); -} - -/** - * Helper function for xkb_state_mod_indices_are_active and - * xkb_state_mod_names_are_active. - */ -static bool -match_mod_masks(struct xkb_state *state, - enum xkb_state_component type, - enum xkb_state_match match, - xkb_mod_mask_t wanted) -{ - xkb_mod_mask_t active = xkb_state_serialize_mods(state, type); - - if (!(match & XKB_STATE_MATCH_NON_EXCLUSIVE) && (active & ~wanted)) - return false; - - if (match & XKB_STATE_MATCH_ANY) - return active & wanted; - - return (active & wanted) == wanted; -} - -/** - * Returns 1 if the modifiers are active with the specified type(s), 0 if - * not, or -1 if any of the modifiers are invalid. - */ -XKB_EXPORT int -xkb_state_mod_indices_are_active(struct xkb_state *state, - enum xkb_state_component type, - enum xkb_state_match match, - ...) -{ - va_list ap; - xkb_mod_mask_t wanted = 0; - int ret = 0; - xkb_mod_index_t num_mods = xkb_keymap_num_mods(state->keymap); - - va_start(ap, match); - while (1) { - xkb_mod_index_t idx = va_arg(ap, xkb_mod_index_t); - if (idx == XKB_MOD_INVALID) - break; - if (idx >= num_mods) { - ret = -1; - break; - } - wanted |= (1u << idx); - } - va_end(ap); - - if (ret == -1) - return ret; - - return match_mod_masks(state, type, match, wanted); -} - -/** - * Returns 1 if the given modifier is active with the specified type(s), 0 if - * not, or -1 if the modifier is invalid. - */ -XKB_EXPORT int -xkb_state_mod_name_is_active(struct xkb_state *state, const char *name, - enum xkb_state_component type) -{ - xkb_mod_index_t idx = xkb_keymap_mod_get_index(state->keymap, name); - - if (idx == XKB_MOD_INVALID) - return -1; - - return xkb_state_mod_index_is_active(state, idx, type); -} - -/** - * Returns 1 if the modifiers are active with the specified type(s), 0 if - * not, or -1 if any of the modifiers are invalid. - */ -XKB_EXPORT ATTR_NULL_SENTINEL int -xkb_state_mod_names_are_active(struct xkb_state *state, - enum xkb_state_component type, - enum xkb_state_match match, - ...) -{ - va_list ap; - xkb_mod_mask_t wanted = 0; - int ret = 0; - - va_start(ap, match); - while (1) { - xkb_mod_index_t idx; - const char *str = va_arg(ap, const char *); - if (str == NULL) - break; - idx = xkb_keymap_mod_get_index(state->keymap, str); - if (idx == XKB_MOD_INVALID) { - ret = -1; - break; - } - wanted |= (1u << idx); - } - va_end(ap); - - if (ret == -1) - return ret; - - return match_mod_masks(state, type, match, wanted); -} - -/** - * Returns 1 if the given group is active with the specified type(s), 0 if - * not, or -1 if the group is invalid. - */ -XKB_EXPORT int -xkb_state_layout_index_is_active(struct xkb_state *state, - xkb_layout_index_t idx, - enum xkb_state_component type) -{ - int ret = 0; - - if (idx >= state->keymap->num_groups) - return -1; - - if (type & XKB_STATE_LAYOUT_EFFECTIVE) - ret |= (state->components.group == idx); - if (type & XKB_STATE_LAYOUT_DEPRESSED) - ret |= (state->components.base_group == (int32_t) idx); - if (type & XKB_STATE_LAYOUT_LATCHED) - ret |= (state->components.latched_group == (int32_t) idx); - if (type & XKB_STATE_LAYOUT_LOCKED) - ret |= (state->components.locked_group == (int32_t) idx); - - return ret; -} - -/** - * Returns 1 if the given modifier is active with the specified type(s), 0 if - * not, or -1 if the modifier is invalid. - */ -XKB_EXPORT int -xkb_state_layout_name_is_active(struct xkb_state *state, const char *name, - enum xkb_state_component type) -{ - xkb_layout_index_t idx = xkb_keymap_layout_get_index(state->keymap, name); - - if (idx == XKB_LAYOUT_INVALID) - return -1; - - return xkb_state_layout_index_is_active(state, idx, type); -} - -/** - * Returns 1 if the given LED is active, 0 if not, or -1 if the LED is invalid. - */ -XKB_EXPORT int -xkb_state_led_index_is_active(struct xkb_state *state, xkb_led_index_t idx) -{ - if (idx >= state->keymap->num_leds || - state->keymap->leds[idx].name == XKB_ATOM_NONE) - return -1; - - return !!(state->components.leds & (1u << idx)); -} - -/** - * Returns 1 if the given LED is active, 0 if not, or -1 if the LED is invalid. - */ -XKB_EXPORT int -xkb_state_led_name_is_active(struct xkb_state *state, const char *name) -{ - xkb_led_index_t idx = xkb_keymap_led_get_index(state->keymap, name); - - if (idx == XKB_LED_INVALID) - return -1; - - return xkb_state_led_index_is_active(state, idx); -} - -/** - * See: - * - XkbTranslateKeyCode(3), mod_rtrn return value, from libX11. - * - MyEnhancedXkbTranslateKeyCode(), a modification of the above, from GTK+. - */ -static xkb_mod_mask_t -key_get_consumed(struct xkb_state *state, const struct xkb_key *key, - enum xkb_consumed_mode mode) -{ - const struct xkb_key_type *type; - const struct xkb_key_type_entry *matching_entry; - xkb_mod_mask_t preserve = 0; - xkb_layout_index_t group; - xkb_mod_mask_t consumed = 0; - - group = xkb_state_key_get_layout(state, key->keycode); - if (group == XKB_LAYOUT_INVALID) - return 0; - - type = key->groups[group].type; - - matching_entry = get_entry_for_key_state(state, key, group); - if (matching_entry) - preserve = matching_entry->preserve.mask; - - switch (mode) { - case XKB_CONSUMED_MODE_XKB: - consumed = type->mods.mask; - break; - - case XKB_CONSUMED_MODE_GTK: { - const struct xkb_key_type_entry *no_mods_entry; - xkb_level_index_t no_mods_leveli; - const struct xkb_level *no_mods_level, *level; - - no_mods_entry = get_entry_for_mods(type, 0); - no_mods_leveli = no_mods_entry ? no_mods_entry->level : 0; - no_mods_level = &key->groups[group].levels[no_mods_leveli]; - - for (unsigned i = 0; i < type->num_entries; i++) { - const struct xkb_key_type_entry *entry = &type->entries[i]; - if (!entry_is_active(entry)) - continue; - - level = &key->groups[group].levels[entry->level]; - if (XkbLevelsSameSyms(level, no_mods_level)) - continue; - - if (entry == matching_entry || my_popcount(entry->mods.mask) == 1) - consumed |= entry->mods.mask & ~entry->preserve.mask; - } - break; - } - } - - return consumed & ~preserve; -} - -XKB_EXPORT int -xkb_state_mod_index_is_consumed2(struct xkb_state *state, xkb_keycode_t kc, - xkb_mod_index_t idx, - enum xkb_consumed_mode mode) -{ - const struct xkb_key *key = XkbKey(state->keymap, kc); - - if (!key || idx >= xkb_keymap_num_mods(state->keymap)) - return -1; - - return !!((1u << idx) & key_get_consumed(state, key, mode)); -} - -XKB_EXPORT int -xkb_state_mod_index_is_consumed(struct xkb_state *state, xkb_keycode_t kc, - xkb_mod_index_t idx) -{ - return xkb_state_mod_index_is_consumed2(state, kc, idx, - XKB_CONSUMED_MODE_XKB); -} - -XKB_EXPORT xkb_mod_mask_t -xkb_state_mod_mask_remove_consumed(struct xkb_state *state, xkb_keycode_t kc, - xkb_mod_mask_t mask) -{ - const struct xkb_key *key = XkbKey(state->keymap, kc); - - if (!key) - return 0; - - return mask & ~key_get_consumed(state, key, XKB_CONSUMED_MODE_XKB); -} - -XKB_EXPORT xkb_mod_mask_t -xkb_state_key_get_consumed_mods2(struct xkb_state *state, xkb_keycode_t kc, - enum xkb_consumed_mode mode) -{ - const struct xkb_key *key; - - switch (mode) { - case XKB_CONSUMED_MODE_XKB: - case XKB_CONSUMED_MODE_GTK: - break; - default: - log_err_func(state->keymap->ctx, - "unrecognized consumed modifiers mode: %d\n", mode); - return 0; - } - - key = XkbKey(state->keymap, kc); - if (!key) - return 0; - - return key_get_consumed(state, key, mode); -} - -XKB_EXPORT xkb_mod_mask_t -xkb_state_key_get_consumed_mods(struct xkb_state *state, xkb_keycode_t kc) -{ - return xkb_state_key_get_consumed_mods2(state, kc, XKB_CONSUMED_MODE_XKB); -} diff --git a/src/3rdparty/xkbcommon/src/text.c b/src/3rdparty/xkbcommon/src/text.c deleted file mode 100644 index 1a44de47b4..0000000000 --- a/src/3rdparty/xkbcommon/src/text.c +++ /dev/null @@ -1,346 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#include "keymap.h" -#include "text.h" - -bool -LookupString(const LookupEntry tab[], const char *string, - unsigned int *value_rtrn) -{ - if (!string) - return false; - - for (const LookupEntry *entry = tab; entry->name; entry++) { - if (istreq(entry->name, string)) { - *value_rtrn = entry->value; - return true; - } - } - - return false; -} - -const char * -LookupValue(const LookupEntry tab[], unsigned int value) -{ - for (const LookupEntry *entry = tab; entry->name; entry++) - if (entry->value == value) - return entry->name; - - return NULL; -} - -const LookupEntry ctrlMaskNames[] = { - { "RepeatKeys", CONTROL_REPEAT }, - { "Repeat", CONTROL_REPEAT }, - { "AutoRepeat", CONTROL_REPEAT }, - { "SlowKeys", CONTROL_SLOW }, - { "BounceKeys", CONTROL_DEBOUNCE }, - { "StickyKeys", CONTROL_STICKY }, - { "MouseKeys", CONTROL_MOUSEKEYS }, - { "MouseKeysAccel", CONTROL_MOUSEKEYS_ACCEL }, - { "AccessXKeys", CONTROL_AX }, - { "AccessXTimeout", CONTROL_AX_TIMEOUT }, - { "AccessXFeedback", CONTROL_AX_FEEDBACK }, - { "AudibleBell", CONTROL_BELL }, - { "IgnoreGroupLock", CONTROL_IGNORE_GROUP_LOCK }, - { "all", CONTROL_ALL }, - { "none", 0 }, - { "Overlay1", 0 }, - { "Overlay2", 0 }, - { NULL, 0 } -}; - -const LookupEntry modComponentMaskNames[] = { - { "base", XKB_STATE_MODS_DEPRESSED }, - { "latched", XKB_STATE_MODS_LATCHED }, - { "locked", XKB_STATE_MODS_LOCKED }, - { "effective", XKB_STATE_MODS_EFFECTIVE }, - { "compat", XKB_STATE_MODS_EFFECTIVE }, - { "any", XKB_STATE_MODS_EFFECTIVE }, - { "none", 0 }, - { NULL, 0 } -}; - -const LookupEntry groupComponentMaskNames[] = { - { "base", XKB_STATE_LAYOUT_DEPRESSED }, - { "latched", XKB_STATE_LAYOUT_LATCHED }, - { "locked", XKB_STATE_LAYOUT_LOCKED }, - { "effective", XKB_STATE_LAYOUT_EFFECTIVE }, - { "any", XKB_STATE_LAYOUT_EFFECTIVE }, - { "none", 0 }, - { NULL, 0 } -}; - -const LookupEntry groupMaskNames[] = { - { "Group1", 0x01 }, - { "Group2", 0x02 }, - { "Group3", 0x04 }, - { "Group4", 0x08 }, - { "Group5", 0x10 }, - { "Group6", 0x20 }, - { "Group7", 0x40 }, - { "Group8", 0x80 }, - { "none", 0x00 }, - { "all", 0xff }, - { NULL, 0 } -}; - -const LookupEntry groupNames[] = { - { "Group1", 1 }, - { "Group2", 2 }, - { "Group3", 3 }, - { "Group4", 4 }, - { "Group5", 5 }, - { "Group6", 6 }, - { "Group7", 7 }, - { "Group8", 8 }, - { NULL, 0 } -}; - -const LookupEntry levelNames[] = { - { "Level1", 1 }, - { "Level2", 2 }, - { "Level3", 3 }, - { "Level4", 4 }, - { "Level5", 5 }, - { "Level6", 6 }, - { "Level7", 7 }, - { "Level8", 8 }, - { NULL, 0 } -}; - -const LookupEntry buttonNames[] = { - { "Button1", 1 }, - { "Button2", 2 }, - { "Button3", 3 }, - { "Button4", 4 }, - { "Button5", 5 }, - { "default", 0 }, - { NULL, 0 } -}; - -const LookupEntry useModMapValueNames[] = { - { "LevelOne", 1 }, - { "Level1", 1 }, - { "AnyLevel", 0 }, - { "any", 0 }, - { NULL, 0 } -}; - -const LookupEntry actionTypeNames[] = { - { "NoAction", ACTION_TYPE_NONE }, - { "SetMods", ACTION_TYPE_MOD_SET }, - { "LatchMods", ACTION_TYPE_MOD_LATCH }, - { "LockMods", ACTION_TYPE_MOD_LOCK }, - { "SetGroup", ACTION_TYPE_GROUP_SET }, - { "LatchGroup", ACTION_TYPE_GROUP_LATCH }, - { "LockGroup", ACTION_TYPE_GROUP_LOCK }, - { "MovePtr", ACTION_TYPE_PTR_MOVE }, - { "MovePointer", ACTION_TYPE_PTR_MOVE }, - { "PtrBtn", ACTION_TYPE_PTR_BUTTON }, - { "PointerButton", ACTION_TYPE_PTR_BUTTON }, - { "LockPtrBtn", ACTION_TYPE_PTR_LOCK }, - { "LockPtrButton", ACTION_TYPE_PTR_LOCK }, - { "LockPointerButton", ACTION_TYPE_PTR_LOCK }, - { "LockPointerBtn", ACTION_TYPE_PTR_LOCK }, - { "SetPtrDflt", ACTION_TYPE_PTR_DEFAULT }, - { "SetPointerDefault", ACTION_TYPE_PTR_DEFAULT }, - { "Terminate", ACTION_TYPE_TERMINATE }, - { "TerminateServer", ACTION_TYPE_TERMINATE }, - { "SwitchScreen", ACTION_TYPE_SWITCH_VT }, - { "SetControls", ACTION_TYPE_CTRL_SET }, - { "LockControls", ACTION_TYPE_CTRL_LOCK }, - { "Private", ACTION_TYPE_PRIVATE }, - /* deprecated actions below here - unused */ - { "RedirectKey", ACTION_TYPE_NONE }, - { "Redirect", ACTION_TYPE_NONE }, - { "ISOLock", ACTION_TYPE_NONE }, - { "ActionMessage", ACTION_TYPE_NONE }, - { "MessageAction", ACTION_TYPE_NONE }, - { "Message", ACTION_TYPE_NONE }, - { "DeviceBtn", ACTION_TYPE_NONE }, - { "DevBtn", ACTION_TYPE_NONE }, - { "DevButton", ACTION_TYPE_NONE }, - { "DeviceButton", ACTION_TYPE_NONE }, - { "LockDeviceBtn", ACTION_TYPE_NONE }, - { "LockDevBtn", ACTION_TYPE_NONE }, - { "LockDevButton", ACTION_TYPE_NONE }, - { "LockDeviceButton", ACTION_TYPE_NONE }, - { "DeviceValuator", ACTION_TYPE_NONE }, - { "DevVal", ACTION_TYPE_NONE }, - { "DeviceVal", ACTION_TYPE_NONE }, - { "DevValuator", ACTION_TYPE_NONE }, - { NULL, 0 }, -}; - -const LookupEntry symInterpretMatchMaskNames[] = { - { "NoneOf", MATCH_NONE }, - { "AnyOfOrNone", MATCH_ANY_OR_NONE }, - { "AnyOf", MATCH_ANY }, - { "AllOf", MATCH_ALL }, - { "Exactly", MATCH_EXACTLY }, - { NULL, 0 }, -}; - -const char * -ModIndexText(struct xkb_context *ctx, const struct xkb_mod_set *mods, - xkb_mod_index_t ndx) -{ - if (ndx == XKB_MOD_INVALID) - return "none"; - - if (ndx >= mods->num_mods) - return NULL; - - return xkb_atom_text(ctx, mods->mods[ndx].name); -} - -const char * -ActionTypeText(enum xkb_action_type type) -{ - const char *name = LookupValue(actionTypeNames, type); - return name ? name : "Private"; -} - -const char * -KeysymText(struct xkb_context *ctx, xkb_keysym_t sym) -{ - char *buffer = xkb_context_get_buffer(ctx, 64); - xkb_keysym_get_name(sym, buffer, 64); - return buffer; -} - -const char * -KeyNameText(struct xkb_context *ctx, xkb_atom_t name) -{ - const char *sname = xkb_atom_text(ctx, name); - size_t len = strlen_safe(sname) + 3; - char *buf = xkb_context_get_buffer(ctx, len); - snprintf(buf, len, "<%s>", strempty(sname)); - return buf; -} - -const char * -SIMatchText(enum xkb_match_operation type) -{ - return LookupValue(symInterpretMatchMaskNames, type); -} - -const char * -ModMaskText(struct xkb_context *ctx, const struct xkb_mod_set *mods, - xkb_mod_mask_t mask) -{ - char buf[1024] = {0}; - size_t pos = 0; - xkb_mod_index_t i; - const struct xkb_mod *mod; - - if (mask == 0) - return "none"; - - if (mask == MOD_REAL_MASK_ALL) - return "all"; - - xkb_mods_enumerate(i, mod, mods) { - int ret; - - if (!(mask & (1u << i))) - continue; - - ret = snprintf(buf + pos, sizeof(buf) - pos, "%s%s", - pos == 0 ? "" : "+", - xkb_atom_text(ctx, mod->name)); - if (ret <= 0 || pos + ret >= sizeof(buf)) - break; - else - pos += ret; - } - - return strcpy(xkb_context_get_buffer(ctx, pos + 1), buf); -} - -const char * -LedStateMaskText(struct xkb_context *ctx, enum xkb_state_component mask) -{ - char buf[1024]; - size_t pos = 0; - - if (mask == 0) - return "0"; - - for (unsigned i = 0; mask; i++) { - int ret; - - if (!(mask & (1u << i))) - continue; - - mask &= ~(1u << i); - - ret = snprintf(buf + pos, sizeof(buf) - pos, "%s%s", - pos == 0 ? "" : "+", - LookupValue(modComponentMaskNames, 1u << i)); - if (ret <= 0 || pos + ret >= sizeof(buf)) - break; - else - pos += ret; - } - - return strcpy(xkb_context_get_buffer(ctx, pos + 1), buf); -} - -const char * -ControlMaskText(struct xkb_context *ctx, enum xkb_action_controls mask) -{ - char buf[1024]; - size_t pos = 0; - - if (mask == 0) - return "none"; - - if (mask == CONTROL_ALL) - return "all"; - - for (unsigned i = 0; mask; i++) { - int ret; - - if (!(mask & (1u << i))) - continue; - - mask &= ~(1u << i); - - ret = snprintf(buf + pos, sizeof(buf) - pos, "%s%s", - pos == 0 ? "" : "+", - LookupValue(ctrlMaskNames, 1u << i)); - if (ret <= 0 || pos + ret >= sizeof(buf)) - break; - else - pos += ret; - } - - return strcpy(xkb_context_get_buffer(ctx, pos + 1), buf); -} diff --git a/src/3rdparty/xkbcommon/src/text.h b/src/3rdparty/xkbcommon/src/text.h deleted file mode 100644 index 584dea62d7..0000000000 --- a/src/3rdparty/xkbcommon/src/text.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright © 2009 Dan Nicholson - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef TEXT_H -#define TEXT_H - -typedef struct { - const char *name; - unsigned int value; -} LookupEntry; - -bool -LookupString(const LookupEntry tab[], const char *string, - unsigned int *value_rtrn); - -const char * -LookupValue(const LookupEntry tab[], unsigned int value); - -extern const LookupEntry ctrlMaskNames[]; -extern const LookupEntry modComponentMaskNames[]; -extern const LookupEntry groupComponentMaskNames[]; -extern const LookupEntry groupMaskNames[]; -extern const LookupEntry groupNames[]; -extern const LookupEntry levelNames[]; -extern const LookupEntry buttonNames[]; -extern const LookupEntry useModMapValueNames[]; -extern const LookupEntry actionTypeNames[]; -extern const LookupEntry symInterpretMatchMaskNames[]; - -const char * -ModMaskText(struct xkb_context *ctx, const struct xkb_mod_set *mods, - xkb_mod_mask_t mask); - -const char * -ModIndexText(struct xkb_context *ctx, const struct xkb_mod_set *mods, - xkb_mod_index_t ndx); - -const char * -ActionTypeText(enum xkb_action_type type); - -const char * -KeysymText(struct xkb_context *ctx, xkb_keysym_t sym); - -const char * -KeyNameText(struct xkb_context *ctx, xkb_atom_t name); - -const char * -SIMatchText(enum xkb_match_operation type); - -const char * -LedStateMaskText(struct xkb_context *ctx, enum xkb_state_component mask); - -const char * -ControlMaskText(struct xkb_context *ctx, enum xkb_action_controls mask); - -#endif /* TEXT_H */ diff --git a/src/3rdparty/xkbcommon/src/utf8.c b/src/3rdparty/xkbcommon/src/utf8.c deleted file mode 100644 index a76b001bab..0000000000 --- a/src/3rdparty/xkbcommon/src/utf8.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * Copyright © 2014 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Rob Bradford <rob@linux.intel.com> - */ - -#include <stddef.h> -#include <stdbool.h> -#include <inttypes.h> - -#include "utf8.h" - -int -utf32_to_utf8(uint32_t unichar, char *buffer) -{ - int count, shift, length; - uint8_t head; - - if (unichar <= 0x007f) { - buffer[0] = unichar; - buffer[1] = '\0'; - return 2; - } - else if (unichar <= 0x07FF) { - length = 2; - head = 0xc0; - } - else if (unichar <= 0xffff) { - length = 3; - head = 0xe0; - } - else if (unichar <= 0x10ffff) { - length = 4; - head = 0xf0; - } - else { - buffer[0] = '\0'; - return 0; - } - - for (count = length - 1, shift = 0; count > 0; count--, shift += 6) - buffer[count] = 0x80 | ((unichar >> shift) & 0x3f); - - buffer[0] = head | ((unichar >> shift) & 0x3f); - buffer[length] = '\0'; - - return length + 1; -} - -bool -is_valid_utf8(const char *ss, size_t len) -{ - size_t i = 0; - size_t tail_bytes = 0; - const uint8_t *s = (const uint8_t *) ss; - - /* This beauty is from: - * The Unicode Standard Version 6.2 - Core Specification, Table 3.7 - * https://www.unicode.org/versions/Unicode6.2.0/ch03.pdf#G7404 - * We can optimize if needed. */ - while (i < len) - { - if (s[i] <= 0x7F) { - tail_bytes = 0; - } - else if (s[i] >= 0xC2 && s[i] <= 0xDF) { - tail_bytes = 1; - } - else if (s[i] == 0xE0) { - i++; - if (i >= len || !(s[i] >= 0xA0 && s[i] <= 0xBF)) - return false; - tail_bytes = 1; - } - else if (s[i] >= 0xE1 && s[i] <= 0xEC) { - tail_bytes = 2; - } - else if (s[i] == 0xED) { - i++; - if (i >= len || !(s[i] >= 0x80 && s[i] <= 0x9F)) - return false; - tail_bytes = 1; - } - else if (s[i] >= 0xEE && s[i] <= 0xEF) { - tail_bytes = 2; - } - else if (s[i] == 0xF0) { - i++; - if (i >= len || !(s[i] >= 0x90 && s[i] <= 0xBF)) - return false; - tail_bytes = 2; - } - else if (s[i] >= 0xF1 && s[i] <= 0xF3) { - tail_bytes = 3; - } - else if (s[i] == 0xF4) { - i++; - if (i >= len || !(s[i] >= 0x80 && s[i] <= 0x8F)) - return false; - tail_bytes = 2; - } - else { - return false; - } - - i++; - - while (i < len && tail_bytes > 0 && s[i] >= 0x80 && s[i] <= 0xBF) { - i++; - tail_bytes--; - } - - if (tail_bytes != 0) - return false; - } - - return true; -} diff --git a/src/3rdparty/xkbcommon/src/utf8.h b/src/3rdparty/xkbcommon/src/utf8.h deleted file mode 100644 index 6371cb5596..0000000000 --- a/src/3rdparty/xkbcommon/src/utf8.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * Copyright © 2014 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Rob Bradford <rob@linux.intel.com> - */ - -#ifndef XKBCOMMON_UTF8_H -#define XKBCOMMON_UTF8_H - -int -utf32_to_utf8(uint32_t unichar, char *buffer); - -bool -is_valid_utf8(const char *ss, size_t len); - -#endif diff --git a/src/3rdparty/xkbcommon/src/utils.c b/src/3rdparty/xkbcommon/src/utils.c deleted file mode 100644 index a71b570b34..0000000000 --- a/src/3rdparty/xkbcommon/src/utils.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright © 2013 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "utils.h" - -#ifdef HAVE_MMAP - -#include <fcntl.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/stat.h> -#include <sys/types.h> - -bool -map_file(FILE *file, char **string_out, size_t *size_out) -{ - struct stat stat_buf; - int fd; - char *string; - - /* Make sure to keep the errno on failure! */ - fd = fileno(file); - if (fd < 0) - return false; - - if (fstat(fd, &stat_buf) != 0) - return false; - - string = mmap(NULL, stat_buf.st_size, PROT_READ, MAP_SHARED, fd, 0); - if (string == MAP_FAILED) - return false; - - *string_out = string; - *size_out = stat_buf.st_size; - return true; -} - -void -unmap_file(char *str, size_t size) -{ - munmap(str, size); -} - -#else - -bool -map_file(FILE *file, char **string_out, size_t *size_out) -{ - long ret; - size_t ret_s; - char *string; - size_t size; - - /* Make sure to keep the errno on failure! */ - - ret = fseek(file, 0, SEEK_END); - if (ret != 0) - return false; - - ret = ftell(file); - if (ret < 0) - return false; - size = (size_t) ret; - - ret = fseek(file, 0, SEEK_SET); - if (ret < 0) - return false; - - string = malloc(size); - if (!string) - return false; - - ret_s = fread(string, 1, size, file); - if (ret_s < size) { - free(string); - return false; - } - - *string_out = string; - *size_out = size; - return true; -} - -void -unmap_file(char *str, size_t size) -{ - free(str); -} - -#endif - -// ASCII lower-case map. -static const unsigned char lower_map[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 -}; - -// ASCII tolower (to avoid locale issues). -char -to_lower(char c) -{ - return (char) lower_map[(unsigned char) c]; -} - -// ASCII strcasecmp (to avoid locale issues). -int -istrcmp(const char *a, const char *b) -{ - for (size_t i = 0; ; i++) { - if (to_lower(a[i]) != to_lower(b[i])) - return (int) to_lower(a[i]) - (int) to_lower(b[i]); - if (!a[i]) - break; - } - return 0; -} - -// ASCII strncasecmp (to avoid locale issues). -int -istrncmp(const char *a, const char *b, size_t n) -{ - for (size_t i = 0; i < n; i++) { - if (to_lower(a[i]) != to_lower(b[i])) - return (int) to_lower(a[i]) - (int) to_lower(b[i]); - if (!a[i]) - break; - } - return 0; -} diff --git a/src/3rdparty/xkbcommon/src/utils.h b/src/3rdparty/xkbcommon/src/utils.h deleted file mode 100644 index cb98e8e11a..0000000000 --- a/src/3rdparty/xkbcommon/src/utils.h +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef UTILS_H -#define UTILS_H 1 - -#include <errno.h> -#include <inttypes.h> -#include <stdbool.h> -#include <stdio.h> -#include <string.h> - -#include "darray.h" - -/* - * We sometimes malloc strings and then expose them as const char*'s. This - * macro is used when we free these strings in order to avoid -Wcast-qual - * errors. - */ -#define UNCONSTIFY(const_ptr) ((void *) (uintptr_t) (const_ptr)) - -#define STATIC_ASSERT(expr, message) do { \ - switch (0) { case 0: case (expr): ; } \ -} while (0) - -char -to_lower(char c); - -int -istrcmp(const char *a, const char *b); - -int -istrncmp(const char *a, const char *b, size_t n); - -static inline bool -streq(const char *s1, const char *s2) -{ - return strcmp(s1, s2) == 0; -} - -static inline bool -streq_not_null(const char *s1, const char *s2) -{ - if (!s1 || !s2) - return false; - return streq(s1, s2); -} - -static inline bool -istreq(const char *s1, const char *s2) -{ - return istrcmp(s1, s2) == 0; -} - -static inline bool -istreq_prefix(const char *s1, const char *s2) -{ - return istrncmp(s1, s2, strlen(s1)) == 0; -} - -static inline char * -strdup_safe(const char *s) -{ - return s ? strdup(s) : NULL; -} - -static inline size_t -strlen_safe(const char *s) -{ - return s ? strlen(s) : 0; -} - -static inline bool -isempty(const char *s) -{ - return s == NULL || s[0] == '\0'; -} - -static inline const char * -strnull(const char *s) -{ - return s ? s : "(null)"; -} - -static inline const char * -strempty(const char *s) -{ - return s ? s : ""; -} - -static inline void * -memdup(const void *mem, size_t nmemb, size_t size) -{ - void *p = calloc(nmemb, size); - if (p) - memcpy(p, mem, nmemb * size); - return p; -} - -static inline int -min(int misc, int other) -{ - return (misc < other) ? misc : other; -} - -static inline int -max(int misc, int other) -{ - return (misc > other) ? misc : other; -} - -/* ctype.h is locale-dependent and has other oddities. */ -static inline bool -is_space(char ch) -{ - return ch == ' ' || (ch >= '\t' && ch <= '\r'); -} - -static inline bool -is_alpha(char ch) -{ - return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'); -} - -static inline bool -is_digit(char ch) -{ - return ch >= '0' && ch <= '9'; -} - -static inline bool -is_alnum(char ch) -{ - return is_alpha(ch) || is_digit(ch); -} - -static inline bool -is_xdigit(char ch) -{ - return - (ch >= '0' && ch <= '9') || - (ch >= 'a' && ch <= 'f') || - (ch >= 'A' && ch <= 'F'); -} - -static inline bool -is_graph(char ch) -{ - /* See table in ascii(7). */ - return ch >= '!' && ch <= '~'; -} - -/* - * Return the bit position of the most significant bit. - * Note: this is 1-based! It's more useful this way, and returns 0 when - * mask is all 0s. - */ -static inline unsigned -msb_pos(uint32_t mask) -{ - unsigned pos = 0; - while (mask) { - pos++; - mask >>= 1u; - } - return pos; -} - -// Avoid conflict with other popcount()s. -static inline int -my_popcount(uint32_t x) -{ - int count; -#if defined(HAVE___BUILTIN_POPCOUNT) - count = __builtin_popcount(x); -#else - for (count = 0; x; count++) - x &= x - 1; -#endif - return count; -} - -bool -map_file(FILE *file, char **string_out, size_t *size_out); - -void -unmap_file(char *string, size_t size); - -#define ARRAY_SIZE(arr) ((sizeof(arr) / sizeof(*(arr)))) - -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define MIN3(a, b, c) MIN(MIN((a), (b)), (c)) -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MAX3(a, b, c) MAX(MAX((a), (b)), (c)) - -/* Round up @a so it's divisible by @b. */ -#define ROUNDUP(a, b) (((a) + (b) - 1) / (b) * (b)) - -#if defined(HAVE_SECURE_GETENV) -# define secure_getenv secure_getenv -#elif defined(HAVE___SECURE_GETENV) -# define secure_getenv __secure_getenv -#else -# define secure_getenv getenv -#endif - -#if defined(HAVE___BUILTIN_EXPECT) -# define likely(x) __builtin_expect(!!(x), 1) -# define unlikely(x) __builtin_expect(!!(x), 0) -#else -# define likely(x) (x) -# define unlikely(x) (x) -#endif - -/* Compiler Attributes */ - -#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__CYGWIN__) -# define XKB_EXPORT __attribute__((visibility("default"))) -#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) -# define XKB_EXPORT __global -#else /* not gcc >= 4 and not Sun Studio >= 8 */ -# define XKB_EXPORT -#endif - -#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 203) -# define ATTR_PRINTF(x,y) __attribute__((__format__(__printf__, x, y))) -#else /* not gcc >= 2.3 */ -# define ATTR_PRINTF(x,y) -#endif - -#if (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205)) \ - || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) -# define ATTR_NORETURN __attribute__((__noreturn__)) -#else -# define ATTR_NORETURN -#endif /* GNUC */ - -#if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 296) -#define ATTR_MALLOC __attribute__((__malloc__)) -#else -#define ATTR_MALLOC -#endif - -#if defined(__GNUC__) && (__GNUC__ >= 4) -# define ATTR_NULL_SENTINEL __attribute__((__sentinel__)) -#else -# define ATTR_NULL_SENTINEL -#endif /* GNUC >= 4 */ - -#if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 295) -#define ATTR_PACKED __attribute__((__packed__)) -#else -#define ATTR_PACKED -#endif - -#endif /* UTILS_H */ diff --git a/src/3rdparty/xkbcommon/src/x11/util.c b/src/3rdparty/xkbcommon/src/x11/util.c deleted file mode 100644 index c41f1d6cd9..0000000000 --- a/src/3rdparty/xkbcommon/src/x11/util.c +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright © 2013 Ran Benita - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "x11-priv.h" - -XKB_EXPORT int -xkb_x11_setup_xkb_extension(xcb_connection_t *conn, - uint16_t major_xkb_version, - uint16_t minor_xkb_version, - enum xkb_x11_setup_xkb_extension_flags flags, - uint16_t *major_xkb_version_out, - uint16_t *minor_xkb_version_out, - uint8_t *base_event_out, - uint8_t *base_error_out) -{ - uint8_t base_event, base_error; - uint16_t server_major, server_minor; - - if (flags & ~(XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS)) { - /* log_err_func(ctx, "unrecognized flags: %#x\n", flags); */ - return 0; - } - - { - const xcb_query_extension_reply_t *reply = - xcb_get_extension_data(conn, &xcb_xkb_id); - if (!reply) { - /* log_err_func(ctx, "failed to query for XKB extension\n"); */ - return 0; - } - - if (!reply->present) { - /* log_err_func(ctx, "failed to start using XKB extension: not available in server\n"); */ - return 0; - } - - base_event = reply->first_event; - base_error = reply->first_error; - } - - { - xcb_generic_error_t *error = NULL; - xcb_xkb_use_extension_cookie_t cookie = - xcb_xkb_use_extension(conn, major_xkb_version, minor_xkb_version); - xcb_xkb_use_extension_reply_t *reply = - xcb_xkb_use_extension_reply(conn, cookie, &error); - - if (!reply) { - /* log_err_func(ctx, */ - /* "failed to start using XKB extension: error code %d\n", */ - /* error ? error->error_code : -1); */ - free(error); - return 0; - } - - if (!reply->supported) { - /* log_err_func(ctx, */ - /* "failed to start using XKB extension: server doesn't support version %d.%d\n", */ - /* major_xkb_version, minor_xkb_version); */ - free(reply); - return 0; - } - - server_major = reply->serverMajor; - server_minor = reply->serverMinor; - - free(reply); - } - - /* - * The XkbUseExtension() in libX11 has a *bunch* of legacy stuff, but - * it doesn't seem like any of it is useful to us. - */ - - if (major_xkb_version_out) - *major_xkb_version_out = server_major; - if (minor_xkb_version_out) - *minor_xkb_version_out = server_minor; - if (base_event_out) - *base_event_out = base_event; - if (base_error_out) - *base_error_out = base_error; - - return 1; -} - -XKB_EXPORT int32_t -xkb_x11_get_core_keyboard_device_id(xcb_connection_t *conn) -{ - int32_t device_id; - xcb_xkb_get_device_info_cookie_t cookie = - xcb_xkb_get_device_info(conn, XCB_XKB_ID_USE_CORE_KBD, - 0, 0, 0, 0, 0, 0); - xcb_xkb_get_device_info_reply_t *reply = - xcb_xkb_get_device_info_reply(conn, cookie, NULL); - - if (!reply) - return -1; - - device_id = reply->deviceID; - free(reply); - return device_id; -} - -bool -get_atom_name(xcb_connection_t *conn, xcb_atom_t atom, char **out) -{ - xcb_get_atom_name_cookie_t cookie; - xcb_get_atom_name_reply_t *reply; - int length; - char *name; - - if (atom == 0) { - *out = NULL; - return true; - } - - cookie = xcb_get_atom_name(conn, atom); - reply = xcb_get_atom_name_reply(conn, cookie, NULL); - if (!reply) - return false; - - length = xcb_get_atom_name_name_length(reply); - name = xcb_get_atom_name_name(reply); - - *out = strndup(name, length); - if (!*out) { - free(reply); - return false; - } - - free(reply); - return true; -} - -bool -adopt_atoms(struct xkb_context *ctx, xcb_connection_t *conn, - const xcb_atom_t *from, xkb_atom_t *to, const size_t count) -{ - enum { SIZE = 128 }; - xcb_get_atom_name_cookie_t cookies[SIZE]; - const size_t num_batches = ROUNDUP(count, SIZE) / SIZE; - - /* Send and collect the atoms in batches of reasonable SIZE. */ - for (size_t batch = 0; batch < num_batches; batch++) { - const size_t start = batch * SIZE; - const size_t stop = min((batch + 1) * SIZE, count); - - /* Send. */ - for (size_t i = start; i < stop; i++) - if (from[i] != XCB_ATOM_NONE) - cookies[i % SIZE] = xcb_get_atom_name(conn, from[i]); - - /* Collect. */ - for (size_t i = start; i < stop; i++) { - xcb_get_atom_name_reply_t *reply; - - if (from[i] == XCB_ATOM_NONE) { - to[i] = XKB_ATOM_NONE; - continue; - } - - reply = xcb_get_atom_name_reply(conn, cookies[i % SIZE], NULL); - if (!reply) - goto err_discard; - - to[i] = xkb_atom_intern(ctx, - xcb_get_atom_name_name(reply), - xcb_get_atom_name_name_length(reply)); - free(reply); - - if (to[i] == XKB_ATOM_NONE) - goto err_discard; - - continue; - - /* - * If we don't discard the uncollected replies, they just - * sit in the XCB queue waiting forever. Sad. - */ -err_discard: - for (size_t j = i + 1; j < stop; j++) - if (from[j] != XCB_ATOM_NONE) - xcb_discard_reply(conn, cookies[j % SIZE].sequence); - return false; - } - } - - return true; -} - -bool -adopt_atom(struct xkb_context *ctx, xcb_connection_t *conn, xcb_atom_t atom, - xkb_atom_t *out) -{ - return adopt_atoms(ctx, conn, &atom, out, 1); -} diff --git a/src/3rdparty/xkbcommon/src/x11/x11-keymap.c b/src/3rdparty/xkbcommon/src/x11/x11-keymap.c deleted file mode 100644 index 701b614b2f..0000000000 --- a/src/3rdparty/xkbcommon/src/x11/x11-keymap.c +++ /dev/null @@ -1,1177 +0,0 @@ -/* - * Copyright © 2013 Ran Benita - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "x11-priv.h" - -/* - * References for the lonesome traveler: - * Xkb protocol specification: - * https://www.x.org/releases/current/doc/kbproto/xkbproto.html - * The XCB xkb XML protocol file: - * /user/share/xcb/xkb.xml - * The XCB xkb header file: - * /usr/include/xcb/xkb.h - * The old kbproto header files: - * /usr/include/X11/extensions/XKB{,proto,str}.h - * Xlib XKB source code: - * <libX11>/src/xkb/XKBGetMap.c (and friends) - * X server XKB protocol handling: - * <xserver>/xkb/xkb.c - * Man pages: - * XkbGetMap(3), XkbGetCompatMap(3), etc. - */ - -/* Constants from /usr/include/X11/extensions/XKB.h */ -/* XkbNumModifiers. */ -#define NUM_REAL_MODS 8u -/* XkbNumVirtualMods. */ -#define NUM_VMODS 16u -/* XkbNoModifier. */ -#define NO_MODIFIER 0xff -/* XkbNumIndicators. */ -#define NUM_INDICATORS 32u -/* XkbAllIndicatorsMask. */ -#define ALL_INDICATORS_MASK 0xffffffff - -/* Some macros. Not very nice but it'd be worse without them. */ - -/* - * We try not to trust the server too much and be paranoid. If we get - * something which we definitely shouldn't, we fail. - */ -#define STRINGIFY(expr) #expr -#define FAIL_UNLESS(expr) do { \ - if (!(expr)) { \ - log_err(keymap->ctx, \ - "x11: failed to get keymap from X server: unmet condition in %s(): %s\n", \ - __func__, STRINGIFY(expr)); \ - goto fail; \ - } \ -} while (0) - -#define FAIL_IF_BAD_REPLY(reply, request_name) do { \ - if (!reply) { \ - log_err(keymap->ctx, \ - "x11: failed to get keymap from X server: %s request failed\n", \ - (request_name)); \ - goto fail; \ - } \ -} while (0) - -#define ALLOC_OR_FAIL(arr, nmemb) do { \ - if ((nmemb) > 0) { \ - (arr) = calloc((nmemb), sizeof(*(arr))); \ - if (!(arr)) \ - goto fail; \ - } \ -} while (0) - - -static xkb_mod_mask_t -translate_mods(uint8_t rmods, uint16_t vmods_low, uint16_t vmods_high) -{ - /* We represent mod masks in a single uint32_t value, with real mods - * first and vmods after (though we don't make these distinctions). */ - return - ((xkb_mod_mask_t) rmods) | - ((xkb_mod_mask_t) vmods_low << 8) | - ((xkb_mod_mask_t) vmods_high << 16); -} - -static enum xkb_action_controls -translate_controls_mask(uint32_t wire) -{ - enum xkb_action_controls ret = 0; - if (wire & XCB_XKB_BOOL_CTRL_REPEAT_KEYS) - ret |= CONTROL_REPEAT; - if (wire & XCB_XKB_BOOL_CTRL_SLOW_KEYS) - ret |= CONTROL_SLOW; - if (wire & XCB_XKB_BOOL_CTRL_BOUNCE_KEYS) - ret |= CONTROL_DEBOUNCE; - if (wire & XCB_XKB_BOOL_CTRL_STICKY_KEYS) - ret |= CONTROL_STICKY; - if (wire & XCB_XKB_BOOL_CTRL_MOUSE_KEYS) - ret |= CONTROL_MOUSEKEYS; - if (wire & XCB_XKB_BOOL_CTRL_MOUSE_KEYS_ACCEL) - ret |= CONTROL_MOUSEKEYS_ACCEL; - if (wire & XCB_XKB_BOOL_CTRL_ACCESS_X_KEYS) - ret |= CONTROL_AX; - if (wire & XCB_XKB_BOOL_CTRL_ACCESS_X_TIMEOUT_MASK) - ret |= CONTROL_AX_TIMEOUT; - if (wire & XCB_XKB_BOOL_CTRL_ACCESS_X_FEEDBACK_MASK) - ret |= CONTROL_AX_FEEDBACK; - if (wire & XCB_XKB_BOOL_CTRL_AUDIBLE_BELL_MASK) - ret |= CONTROL_BELL; - if (wire & XCB_XKB_BOOL_CTRL_IGNORE_GROUP_LOCK_MASK) - ret |= CONTROL_IGNORE_GROUP_LOCK; - /* Some controls are not supported and don't appear here. */ - return ret; -} - -static void -translate_action(union xkb_action *action, const xcb_xkb_action_t *wire) -{ - switch (wire->type) { - case XCB_XKB_SA_TYPE_SET_MODS: - action->type = ACTION_TYPE_MOD_SET; - - action->mods.mods.mods = translate_mods(wire->setmods.realMods, - wire->setmods.vmodsLow, - wire->setmods.vmodsHigh); - action->mods.mods.mask = translate_mods(wire->setmods.mask, 0, 0); - - if (wire->setmods.flags & XCB_XKB_SA_CLEAR_LOCKS) - action->mods.flags |= ACTION_LOCK_CLEAR; - if (wire->setmods.flags & XCB_XKB_SA_LATCH_TO_LOCK) - action->mods.flags |= ACTION_LATCH_TO_LOCK; - if (wire->setmods.flags & XCB_XKB_SA_USE_MOD_MAP_MODS) - action->mods.flags |= ACTION_MODS_LOOKUP_MODMAP; - - break; - case XCB_XKB_SA_TYPE_LATCH_MODS: - action->type = ACTION_TYPE_MOD_LATCH; - - action->mods.mods.mods = translate_mods(wire->latchmods.realMods, - wire->latchmods.vmodsLow, - wire->latchmods.vmodsHigh); - action->mods.mods.mask = translate_mods(wire->latchmods.mask, 0, 0); - - if (wire->latchmods.flags & XCB_XKB_SA_CLEAR_LOCKS) - action->mods.flags |= ACTION_LOCK_CLEAR; - if (wire->latchmods.flags & XCB_XKB_SA_LATCH_TO_LOCK) - action->mods.flags |= ACTION_LATCH_TO_LOCK; - if (wire->latchmods.flags & XCB_XKB_SA_USE_MOD_MAP_MODS) - action->mods.flags |= ACTION_MODS_LOOKUP_MODMAP; - - break; - case XCB_XKB_SA_TYPE_LOCK_MODS: - action->type = ACTION_TYPE_MOD_LOCK; - - action->mods.mods.mods = translate_mods(wire->lockmods.realMods, - wire->lockmods.vmodsLow, - wire->lockmods.vmodsHigh); - action->mods.mods.mask = translate_mods(wire->lockmods.mask, 0, 0); - - if (wire->lockmods.flags & XCB_XKB_SA_ISO_LOCK_FLAG_NO_LOCK) - action->mods.flags |= ACTION_LOCK_NO_LOCK; - if (wire->lockmods.flags & XCB_XKB_SA_ISO_LOCK_FLAG_NO_UNLOCK) - action->mods.flags |= ACTION_LOCK_NO_UNLOCK; - if (wire->lockmods.flags & XCB_XKB_SA_USE_MOD_MAP_MODS) - action->mods.flags |= ACTION_MODS_LOOKUP_MODMAP; - - break; - case XCB_XKB_SA_TYPE_SET_GROUP: - action->type = ACTION_TYPE_GROUP_SET; - - action->group.group = wire->setgroup.group; - - if (wire->setmods.flags & XCB_XKB_SA_CLEAR_LOCKS) - action->group.flags |= ACTION_LOCK_CLEAR; - if (wire->setmods.flags & XCB_XKB_SA_LATCH_TO_LOCK) - action->group.flags |= ACTION_LATCH_TO_LOCK; - if (wire->setmods.flags & XCB_XKB_SA_ISO_LOCK_FLAG_GROUP_ABSOLUTE) - action->group.flags |= ACTION_ABSOLUTE_SWITCH; - - break; - case XCB_XKB_SA_TYPE_LATCH_GROUP: - action->type = ACTION_TYPE_GROUP_LATCH; - - action->group.group = wire->latchgroup.group; - - if (wire->latchmods.flags & XCB_XKB_SA_CLEAR_LOCKS) - action->group.flags |= ACTION_LOCK_CLEAR; - if (wire->latchmods.flags & XCB_XKB_SA_LATCH_TO_LOCK) - action->group.flags |= ACTION_LATCH_TO_LOCK; - if (wire->latchmods.flags & XCB_XKB_SA_ISO_LOCK_FLAG_GROUP_ABSOLUTE) - action->group.flags |= ACTION_ABSOLUTE_SWITCH; - - break; - case XCB_XKB_SA_TYPE_LOCK_GROUP: - action->type = ACTION_TYPE_GROUP_LOCK; - - action->group.group = wire->lockgroup.group; - - if (wire->lockgroup.flags & XCB_XKB_SA_ISO_LOCK_FLAG_GROUP_ABSOLUTE) - action->group.flags |= ACTION_ABSOLUTE_SWITCH; - - break; - case XCB_XKB_SA_TYPE_MOVE_PTR: - action->type = ACTION_TYPE_PTR_MOVE; - - action->ptr.x = (int16_t) (wire->moveptr.xLow | ((uint16_t) wire->moveptr.xHigh << 8)); - action->ptr.y = (int16_t) (wire->moveptr.yLow | ((uint16_t) wire->moveptr.yHigh << 8)); - - if (!(wire->moveptr.flags & XCB_XKB_SA_MOVE_PTR_FLAG_NO_ACCELERATION)) - action->ptr.flags |= ACTION_ACCEL; - if (wire->moveptr.flags & XCB_XKB_SA_MOVE_PTR_FLAG_MOVE_ABSOLUTE_X) - action->ptr.flags |= ACTION_ABSOLUTE_X; - if (wire->moveptr.flags & XCB_XKB_SA_MOVE_PTR_FLAG_MOVE_ABSOLUTE_Y) - action->ptr.flags |= ACTION_ABSOLUTE_Y; - - break; - case XCB_XKB_SA_TYPE_PTR_BTN: - action->type = ACTION_TYPE_PTR_BUTTON; - - action->btn.count = wire->ptrbtn.count; - action->btn.button = wire->ptrbtn.button; - action->btn.flags = 0; - - break; - case XCB_XKB_SA_TYPE_LOCK_PTR_BTN: - action->type = ACTION_TYPE_PTR_LOCK; - - action->btn.button = wire->lockptrbt |