././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381982.0719762 libxkbcommon-0.10.0/0000755000175000017500000000000000000000000013637 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.8786561 libxkbcommon-0.10.0/.azure-pipelines/0000755000175000017500000000000000000000000017031 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9153223 libxkbcommon-0.10.0/.azure-pipelines/steps/0000755000175000017500000000000000000000000020167 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.8919892 libxkbcommon-0.10.0/.azure-pipelines/steps/dependencies-linux.yml0000644000175000017500000000052100000000000024473 0ustar00ranran00000000000000--- steps: - bash: | set -euo pipefail python -m pip install --upgrade pip meson sudo apt update -y sudo env DEBIAN_FRONTEND=noninteractive apt install -y \ doxygen libxcb-xkb-dev valgrind ninja-build \ libwayland-dev wayland-protocols bison graphviz displayName: 'Dependencies (GNU/Linux)' ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9086556 libxkbcommon-0.10.0/.azure-pipelines/steps/dependencies-macos.yml0000644000175000017500000000035300000000000024441 0ustar00ranran00000000000000--- steps: - bash: | set -euo pipefail brew install meson doxygen bison brew link bison --force displayName: 'Dependencies (macOS)' env: HOMEBREW_NO_AUTO_UPDATE: 1 HOMEBREW_NO_INSTALL_CLEANUP: 1 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9153223 libxkbcommon-0.10.0/.azure-pipelines/steps/dependencies-python.yml0000644000175000017500000000015700000000000024662 0ustar00ranran00000000000000--- steps: - task: UsePythonVersion@0 inputs: versionSpec: '3.7' displayName: 'Use Python 3.7' ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9153223 libxkbcommon-0.10.0/.azure-pipelines/steps/dependencies-windows.yml0000644000175000017500000000033200000000000025026 0ustar00ranran00000000000000--- steps: - bash: | set -euo pipefail choco install ninja winflexbison3 -y --no-progress --stop-on-first-failure python -m pip install --upgrade pip meson displayName: 'Dependencies (Windows)' ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9153223 libxkbcommon-0.10.0/.azure-pipelines/steps/meson.yml0000644000175000017500000000147500000000000022042 0ustar00ranran00000000000000--- parameters: compiler: "cc" options: "" wrapper: "" prepare: "" steps: - script: | ${{ parameters.prepare }} meson setup ${{ parameters.options }} build displayName: 'Setup' env: CC: ${{ parameters.compiler }} - script: | ${{ parameters.prepare }} ninja -C build displayName: 'Build' env: TERM: dumb - bash: | set -euo pipefail meson test -C build --print-errorlogs --wrapper="${{ parameters.wrapper }}" python scripts/meson-junit-report.py --project-name=xkbcommon \ --job-id='$(Build.BuildId)' --branch='$(Build.SourceBranch)' \ --output=testlog.xml build/meson-logs/testlog*.json displayName: 'Test' - task: PublishTestResults@2 inputs: testResultsFiles: 'testlog.xml' failTaskOnFailedTests: true ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9486554 libxkbcommon-0.10.0/.uncrustify.cfg0000644000175000017500000001264000000000000016614 0ustar00ranran00000000000000tok_split_gte=false utf8_byte=true utf8_force=true indent_cmt_with_tabs=false indent_align_string=false indent_braces=false indent_braces_no_func=false indent_braces_no_class=false indent_braces_no_struct=false indent_brace_parent=false indent_namespace=false indent_extern=false indent_class=false indent_class_colon=false indent_else_if=false indent_var_def_cont=false indent_func_call_param=false indent_func_def_param=false indent_func_proto_param=false indent_func_class_param=false indent_func_ctor_var_param=false indent_template_param=false indent_func_param_double=false indent_relative_single_line_comments=false indent_col1_comment=false indent_access_spec_body=false indent_paren_nl=false indent_comma_paren=false indent_bool_paren=false indent_first_bool_expr=false indent_square_nl=false indent_preserve_sql=false indent_align_assign=true sp_balance_nested_parens=false align_keep_tabs=false align_with_tabs=false align_on_tabstop=false align_number_left=false align_func_params=false align_same_func_call_params=false align_var_def_colon=true align_var_def_attribute=true align_var_def_inline=true align_right_cmt_mix=false align_on_operator=false align_mix_var_proto=false align_single_line_func=false align_single_line_brace=false align_nl_cont=false align_left_shift=true align_oc_decl_colon=true nl_collapse_empty_body=true nl_assign_leave_one_liners=true nl_class_leave_one_liners=true nl_enum_leave_one_liners=true nl_getset_leave_one_liners=true nl_func_leave_one_liners=true nl_if_leave_one_liners=true nl_multi_line_cond=false nl_multi_line_define=false nl_before_case=true nl_after_case=true nl_after_return=false nl_after_semicolon=true nl_after_brace_open=true nl_after_brace_open_cmt=false nl_after_vbrace_open=false nl_after_vbrace_open_empty=false nl_after_brace_close=false nl_after_vbrace_close=false nl_define_macro=false nl_squeeze_ifdef=false nl_ds_struct_enum_cmt=false nl_ds_struct_enum_close_brace=false nl_create_if_one_liner=false nl_create_for_one_liner=false nl_create_while_one_liner=false ls_for_split_full=false ls_func_split_full=false nl_after_multiline_comment=false eat_blanks_after_open_brace=false eat_blanks_before_close_brace=false mod_full_brace_if_chain=false mod_pawn_semicolon=false mod_full_paren_if_bool=false mod_remove_extra_semicolon=false mod_sort_import=false mod_sort_using=false mod_sort_include=false mod_move_case_break=false mod_remove_empty_return=false cmt_indent_multi=true cmt_c_group=false cmt_c_nl_start=false cmt_c_nl_end=false cmt_cpp_group=false cmt_cpp_nl_start=false cmt_cpp_nl_end=false cmt_cpp_to_c=true cmt_star_cont=true cmt_multi_check_last=true cmt_insert_before_preproc=false pp_indent_at_level=false pp_region_indent_code=false pp_if_indent_code=false pp_define_at_level=false indent_columns=4 indent_brace=0 indent_switch_case=0 align_struct_init_span=2 align_pp_define_gap=0 align_pp_define_span=2 align_oc_msg_colon_span=16 nl_end_of_file_min=1 nl_func_var_def_blk=0 code_width=78 nl_max=2 newlines=auto indent_with_tabs=0 sp_arith=force sp_assign=force sp_assign_default=force sp_before_assign=force sp_after_assign=force sp_enum_assign=force sp_enum_before_assign=force sp_enum_after_assign=force sp_pp_stringify=add sp_bool=force sp_compare=force sp_inside_paren=remove sp_paren_paren=remove sp_paren_brace=force sp_before_ptr_star=ignore sp_before_unnamed_ptr_star=force sp_before_byref=force sp_before_unnamed_byref=force sp_after_byref=remove sp_after_type=force sp_before_sparen=force sp_inside_sparen=remove sp_inside_sparen_close=remove sp_after_sparen=force sp_sparen_brace=force sp_special_semi=force sp_before_semi=remove sp_after_semi=force sp_after_semi_for=force sp_after_semi_for_empty=force sp_before_square=remove sp_inside_square=remove sp_after_comma=force sp_before_comma=remove sp_paren_comma=force sp_before_ellipsis=force sp_after_class_colon=force sp_before_class_colon=force sp_before_case_colon=remove sp_after_cast=force sp_inside_paren_cast=remove sp_sizeof_paren=remove sp_inside_braces_enum=force sp_inside_braces_struct=force sp_inside_braces=force sp_inside_braces_empty=force sp_func_proto_paren=remove sp_func_def_paren=remove sp_inside_fparens=remove sp_inside_fparen=remove sp_square_fparen=remove sp_fparen_brace=force sp_func_call_paren=remove sp_func_call_paren_empty=remove sp_return_paren=force sp_attribute_paren=remove sp_defined_paren=remove sp_macro=force sp_macro_func=force sp_else_brace=force sp_brace_else=force sp_brace_typedef=force sp_not=remove sp_inv=remove nl_start_of_file=remove nl_end_of_file=force nl_assign_square=remove nl_after_square_assign=remove nl_fcall_brace=remove nl_enum_brace=remove nl_struct_brace=remove nl_union_brace=remove nl_if_brace=remove nl_brace_else=force nl_elseif_brace=remove nl_else_brace=remove nl_else_if=remove nl_for_brace=remove nl_do_brace=remove nl_brace_while=remove nl_switch_brace=remove nl_case_colon_brace=force nl_func_type_name=force nl_func_type_name_class=force nl_func_proto_type_name=force nl_func_paren=remove nl_func_def_paren=remove nl_func_decl_start=remove nl_func_def_start=remove nl_func_decl_args=remove nl_func_decl_end=remove nl_func_def_end=remove nl_func_decl_end_single=remove nl_func_def_end_single=remove nl_func_decl_empty=remove nl_func_def_empty=remove nl_fdef_brace=force nl_return_expr=remove nl_before_if=ignore nl_after_if=ignore nl_before_for=ignore nl_after_for=ignore nl_before_while=ignore nl_after_while=ignore nl_before_switch=ignore nl_after_switch=ignore nl_before_do=ignore nl_after_do=ignore pp_space=remove ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9519887 libxkbcommon-0.10.0/LICENSE0000644000175000017500000002363600000000000014656 0ustar00ranran00000000000000The 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 Copyright © 2010, 2012 Intel Corporation Copyright © 2008, 2009 Dan Nicholson Copyright © 2010 Francisco Jerez 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 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 , 2003-2004 Copyright (C) 2004, Gregory Mokhin 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. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9519887 libxkbcommon-0.10.0/NEWS0000644000175000017500000004134200000000000014342 0ustar00ranran00000000000000libxkbcommon 0.10.0 - 2020-01-18 =================== - (security) Fix quadratic complexity in the XKB file parser. See commit message 7c42945e04a2107827a057245298dedc0475cc88 for details. - Add $XDG_CONFIG_HOME/xkb to the default search path. If $XDG_CONFIG_HOME is not set, $HOME/.config/xkb is used. If $HOME is not set, the path is not added. The XDG path is looked up before the existing default search path $HOME/.xkb. Contributed by Peter Hutterer <@who-t.net>. - Add support for include statements in XKB rules files. This is a step towards making local XKB customizations more tenable and convenient, without modifying system files. You can now include other rules files like this: ! include %S/evdev Two directives are supported, %H to $HOME and %S for the system-installed rules directory (usually /usr/share/X11/xkb/rules). See commit message ca033a29d2ca910fd17b1ae287cb420205bdddc8 and doc/rules-format.txt in the xkbcommon source code for more information. Contributed by Peter Hutterer <@who-t.net>. - Downgrade "Symbol added to modifier map for multiple modifiers" log to a warning. This error message was too annoying to be shown by default. When working on keymaps, set `XKB_LOG_LEVEL=debug XKB_LOG_VERBOSITY=10` to see all possible messages. - Support building on Windows using the meson MSVC backend. Contributed by Adrian Perez de Castro <@igalia.com>. - Fix bug where the merge mode only applied to the first vmod in a `virtual_modifiers` statement. Given augment virtual_modifiers NumLock,Alt,LevelThree Previously it was incorrectly treated as augment virtual_modifiers NumLock; virtual_modifiers Alt; virtual_modifiers LevelThree; Now it is treated as augment virtual_modifiers NumLock; augment virtual_modifiers Alt; augment virtual_modifiers LevelThree; - Reject interpret modifier predicate with more than one value. Given interpret ISO_Level3_Shift+AnyOf(all,extraneous) { ... }; Previously, extraneous (and further) was ignored. Now it's rejected. - Correctly handle capitalization of the ssharp keysym. - Speed up and improve the internal `xkeyboard-config` tool. This tool compiles all layout/variant combinations in the xkeyboard-config dataset and reports any issues it finds. Contributed by Peter Hutterer <@who-t.net>. - Speed up "atoms" (string interning). This code goes back at least to X11R1 (released 1987). libxkbcommon 0.9.1 - 2019-10-19 ================== - Fix context creation failing when run in privileged processes as defined by `secure_getenv(3)`, e.g. GDM. libxkbcommon 0.9.0 - 2019-10-19 ================== - Move ~/.xkb to before XKB_CONFIG_ROOT (the system XKB path, usually /usr/share/X11/xkb) in the default include path. This enables the user to have full control of the keymap definitions, instead of only augmenting them. - Remove the Autotools build system. Use the meson build system instead. - Fix invalid names used for levels above 8 when dumping keymaps. Previously, e.g. "Level20" was dumped, but only up to "Level8" is accepted by the parser. Now "20" is dumped. - Change level references to always be dumped as e.g. "5" instead of "Level5". Change group references to always be dumped capitalized e.g. "Group3" instead of "group3". Previously it was inconsistent. These changes affect the output of xkb_keymap_get_as_string(). - Fix several build issues on macOS/Darwin, Solaris, NetBSD, cross compilation. - Port the interactive-wayland test program to the stable version of xdg-shell. libxkbcommon 0.8.4 - 2019-02-22 ================== - Fix build of xkbcommon-x11 static library with meson. - Fix building using meson from the tarball generated by autotools. libxkbcommon 0.8.3 - 2019-02-08 ================== - Fix build of static libraries with meson. (Future note: xkbcommon-x11 was *not* fixed in this release.) - New API: XKB_KEY_XF86MonBrightnessCycle XKB_KEY_XF86RotationLockToggle 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-=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. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9653218 libxkbcommon-0.10.0/PACKAGING0000644000175000017500000000343200000000000015050 0ustar00ranran00000000000000libxkbcommon consists of two shared libraries, libxkbcommon (the main library) and libxkbcommon-x11 (an addon library for XCB clients). The files for libxkbcommon-x11 are: libxkbcommon-x11.a libxkbcommon-x11.so* xkbcommon/xkbcommon-x11.h xkbcommon-x11.map xkbcommon-x11.pc libxkbcommon-x11 can be disabled with -Denable-x11=false (see `meson configure build` for other options/variables). Dependencies for libxkbcommon: - C compiler, meson, pkg-config, libc, bash, grep, sed. - (build) bison (preferred), win_bison or byacc>=20141006. byacc must be configured with --enable-btyacc. - (build optional, runtime) xkeyboard-config. During build, for automatically detecting the value of -Dxkb-config-root instead of guessing (/usr/share/X11/xkb). During runtime, not strictly needed, but most users of the library would need it. - (runtime) libX11. Contains the dataset for Compose support (/usr/share/X11/locale). Please don't depend on it explicitly. - (build optional) doxygen. For generating the HTML documentation. To disable, use -Denable-docs=false. - (build optional) gperf. Output included in git and tarball. To regenerate, use `./scripts/update-keywords`. Dependencies for libxkbcommon-x11: - libxkbcommon. - libxcb>=1.10 with libxcb-xkb. Dependencies for libxkbcommon-x11 tests: - xkbcomp, Xvfb. If they are not available, the relevant tests are skipped. Dependencies for Wayland tests: - wayland-client>=1.2.0, wayland-scanner, wayland-protocols>=1.0. To disable, use -Denable-wayland=false. Unless libxcb is always available as part of the system, it is preferred that libxkbcommon and libxkbcommon-x11 be split into separate packages, such that the main library does not depend on libxcb. This avoids a transitive dependency of Wayland clients on X libraries. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9753218 libxkbcommon-0.10.0/README.md0000644000175000017500000000422200000000000015116 0ustar00ranran00000000000000# 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 or or in a [GitHub](https://github.com/xkbcommon/libxkbcommon) pull request. Bug reports (and usage questions) are also welcome, and may be filed at [GitHub](https://github.com/xkbcommon/libxkbcommon/issues). The maintainers are - Daniel Stone - Ran Benita ## Credits Many thanks are due to Dan Nicholson for his heroic work in getting xkbcommon off the ground initially. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9753218 libxkbcommon-0.10.0/azure-pipelines.yml0000644000175000017500000000273600000000000017506 0ustar00ranran00000000000000--- jobs: - job: 'Linux' dependsOn: [] strategy: matrix: Clang: compiler: clang GCC: compiler: gcc pool: vmImage: 'ubuntu-16.04' steps: - template: .azure-pipelines/steps/dependencies-python.yml - template: .azure-pipelines/steps/dependencies-linux.yml - template: .azure-pipelines/steps/meson.yml parameters: compiler: $(compiler) options: -Denable-wayland=false wrapper: valgrind --leak-check=full --track-origins=yes --error-exitcode=99 - job: 'macOS' dependsOn: [] pool: vmImage: 'macos-10.13' steps: - template: .azure-pipelines/steps/dependencies-python.yml - template: .azure-pipelines/steps/dependencies-macos.yml - template: .azure-pipelines/steps/meson.yml parameters: options: -Denable-wayland=false -Denable-x11=false prepare: 'export PATH="/usr/local/opt/bison/bin:${PATH}"' - job: 'Windows' dependsOn: [] pool: vmImage: 'vs2017-win2016' steps: - template: .azure-pipelines/steps/dependencies-python.yml - template: .azure-pipelines/steps/dependencies-windows.yml - template: .azure-pipelines/steps/meson.yml parameters: compiler: cl options: -Denable-wayland=false -Denable-x11=false -Denable-docs=false prepare: 'call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64' ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.025321 libxkbcommon-0.10.0/bench/0000755000175000017500000000000000000000000014716 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9753218 libxkbcommon-0.10.0/bench/.gitignore0000644000175000017500000000004100000000000016701 0ustar00ranran00000000000000key-proc rules rulescomp compose ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9753218 libxkbcommon-0.10.0/bench/bench.c0000644000175000017500000000574100000000000016150 0ustar00ranran00000000000000/* * Copyright © 2015 Kazunobu Kuriyama * Ran Benita * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include #include "bench.h" #include "../src/utils.h" #ifndef _MSC_VER #include #else #include #include struct timeval { long tv_sec, tv_usec; }; static int gettimeofday(struct timeval *tv, void *unused) { static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL); SYSTEMTIME system_time; FILETIME file_time; uint64_t t; GetSystemTime(&system_time); SystemTimeToFileTime(&system_time, &file_time); t = (uint64_t) file_time.dwLowDateTime; t += ((uint64_t) file_time.dwHighDateTime) << 32; tv->tv_sec = (long) ((t - EPOCH) / 10000000L); tv->tv_usec = (long) (system_time.wMilliseconds * 1000); return 0; } #endif void bench_start(struct bench *bench) { struct timeval val; (void) gettimeofday(&val, NULL); bench->start = (struct bench_time) { .seconds = val.tv_sec, .microseconds = val.tv_usec, }; } void bench_stop(struct bench *bench) { struct timeval val; (void) gettimeofday(&val, NULL); bench->stop = (struct bench_time) { .seconds = val.tv_sec, .microseconds = val.tv_usec, }; } void bench_elapsed(const struct bench *bench, struct bench_time *result) { result->seconds = bench->stop.seconds - bench->start.seconds; result->microseconds = bench->stop.microseconds - bench->start.microseconds; if (result->microseconds < 0) { result->microseconds += 1000000; result->seconds--; } } char * bench_elapsed_str(const struct bench *bench) { struct bench_time elapsed; char *buf; int ret; bench_elapsed(bench, &elapsed); ret = asprintf(&buf, "%ld.%06ld", elapsed.seconds, elapsed.microseconds); assert(ret >= 0); return buf; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381980.9853215 libxkbcommon-0.10.0/bench/bench.h0000644000175000017500000000331500000000000016150 0ustar00ranran00000000000000/* * Copyright © 2015 Kazunobu Kuriyama * Ran Benita * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef LIBXKBCOMMON_BENCH_H #define LIBXKBCOMMON_BENCH_H struct bench_time { long seconds; long microseconds; }; struct bench { struct bench_time start; struct bench_time stop; }; void bench_start(struct bench *bench); void bench_stop(struct bench *bench); void bench_elapsed(const struct bench *bench, struct bench_time *result); /* The caller is responsibile to free() the returned string. */ char * bench_elapsed_str(const struct bench *bench); #endif /* LIBXKBCOMMON_BENCH_H */ ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.001988 libxkbcommon-0.10.0/bench/compose.c0000644000175000017500000000473400000000000016537 0ustar00ranran00000000000000/* * Copyright © 2014 Ran Benita * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include "xkbcommon/xkbcommon-compose.h" #include "../test/test.h" #include "bench.h" #define BENCHMARK_ITERATIONS 1000 int main(void) { struct xkb_context *ctx; char *path; FILE *file; struct xkb_compose_table *table; struct bench bench; char *elapsed; ctx = test_get_context(CONTEXT_NO_FLAG); assert(ctx); path = test_get_path("compose/en_US.UTF-8/Compose"); file = fopen(path, "rb"); if (file == NULL) { perror(path); free(path); xkb_context_unref(ctx); return -1; } xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_CRITICAL); xkb_context_set_log_verbosity(ctx, 0); bench_start(&bench); for (int i = 0; i < BENCHMARK_ITERATIONS; i++) { rewind(file); table = xkb_compose_table_new_from_file(ctx, file, "", XKB_COMPOSE_FORMAT_TEXT_V1, XKB_COMPOSE_COMPILE_NO_FLAGS); assert(table); xkb_compose_table_unref(table); } bench_stop(&bench); fclose(file); free(path); elapsed = bench_elapsed_str(&bench); fprintf(stderr, "compiled %d compose tables in %ss\n", BENCHMARK_ITERATIONS, elapsed); free(elapsed); xkb_context_unref(ctx); return 0; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.0086546 libxkbcommon-0.10.0/bench/key-proc.c0000644000175000017500000000533400000000000016620 0ustar00ranran00000000000000/* * 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. */ #include "config.h" #include #include #include "../test/test.h" #include "bench.h" #define BENCHMARK_ITERATIONS 20000000 static void bench_key_proc(struct xkb_state *state) { int8_t keys[256] = { 0 }; xkb_keycode_t keycode; xkb_keysym_t keysym; int i; for (i = 0; i < BENCHMARK_ITERATIONS; i++) { keycode = (rand() % (255 - 9)) + 9; if (keys[keycode]) { xkb_state_update_key(state, keycode, XKB_KEY_UP); keys[keycode] = 0; keysym = xkb_state_key_get_one_sym(state, keycode); (void) keysym; } else { xkb_state_update_key(state, keycode, XKB_KEY_DOWN); keys[keycode] = 1; } } } int main(void) { struct xkb_context *ctx; struct xkb_keymap *keymap; struct xkb_state *state; struct bench bench; char *elapsed; ctx = test_get_context(0); assert(ctx); keymap = test_compile_rules(ctx, "evdev", "pc104", "us,ru,il,de", ",,,neo", "grp:menu_toggle"); assert(keymap); state = xkb_state_new(keymap); assert(state); xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_CRITICAL); xkb_context_set_log_verbosity(ctx, 0); srand((unsigned) time(NULL)); bench_start(&bench); bench_key_proc(state); bench_stop(&bench); elapsed = bench_elapsed_str(&bench); fprintf(stderr, "ran %d iterations in %ss\n", BENCHMARK_ITERATIONS, elapsed); free(elapsed); xkb_state_unref(state); xkb_keymap_unref(keymap); xkb_context_unref(ctx); return 0; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.025321 libxkbcommon-0.10.0/bench/rules.c0000644000175000017500000000433600000000000016222 0ustar00ranran00000000000000/* * 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. */ #include "config.h" #include #include "../test/test.h" #include "xkbcomp/xkbcomp-priv.h" #include "xkbcomp/rules.h" #include "bench.h" #define BENCHMARK_ITERATIONS 20000 int main(int argc, char *argv[]) { struct xkb_context *ctx; int i; struct xkb_rule_names rmlvo = { "evdev", "pc105", "us,il", ",", "ctrl:nocaps,grp:menu_toggle", }; struct xkb_component_names kccgst; struct bench bench; char *elapsed; ctx = test_get_context(0); assert(ctx); xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_CRITICAL); xkb_context_set_log_verbosity(ctx, 0); bench_start(&bench); for (i = 0; i < BENCHMARK_ITERATIONS; i++) { assert(xkb_components_from_rules(ctx, &rmlvo, &kccgst)); free(kccgst.keycodes); free(kccgst.types); free(kccgst.compat); free(kccgst.symbols); } bench_stop(&bench); elapsed = bench_elapsed_str(&bench); fprintf(stderr, "processed %d rule files in %ss\n", BENCHMARK_ITERATIONS, elapsed); free(elapsed); xkb_context_unref(ctx); return 0; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.0386543 libxkbcommon-0.10.0/bench/rulescomp.c0000644000175000017500000000373700000000000017105 0ustar00ranran00000000000000/* * Copyright © 2009 Dan Nicholson * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include "../test/test.h" #include "bench.h" #define BENCHMARK_ITERATIONS 2500 int main(int argc, char *argv[]) { struct xkb_context *ctx; struct xkb_keymap *keymap; struct bench bench; char *elapsed; int i; ctx = test_get_context(0); assert(ctx); xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_CRITICAL); xkb_context_set_log_verbosity(ctx, 0); bench_start(&bench); for (i = 0; i < BENCHMARK_ITERATIONS; i++) { keymap = test_compile_rules(ctx, "evdev", "evdev", "us", "", ""); assert(keymap); xkb_keymap_unref(keymap); } bench_stop(&bench); elapsed = bench_elapsed_str(&bench); fprintf(stderr, "compiled %d keymaps in %ss\n", BENCHMARK_ITERATIONS, elapsed); free(elapsed); xkb_context_unref(ctx); return 0; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.101987 libxkbcommon-0.10.0/doc/0000755000175000017500000000000000000000000014404 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.0519874 libxkbcommon-0.10.0/doc/.gitignore0000644000175000017500000000001700000000000016372 0ustar00ranran00000000000000Doxyfile html/ ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.0619874 libxkbcommon-0.10.0/doc/Doxyfile.in0000644000175000017500000000143100000000000016516 0ustar00ranran00000000000000PROJECT_NAME = @PACKAGE_NAME@ PROJECT_NUMBER = @PACKAGE_VERSION@ OUTPUT_DIRECTORY = @OUTPUT_DIRECTORY@ BRIEF_MEMBER_DESC = NO JAVADOC_AUTOBRIEF = YES OPTIMIZE_OUTPUT_FOR_C = YES EXTENSION_MAPPING = no_extension=md SORT_MEMBER_DOCS = NO QUIET = YES WARN_IF_UNDOCUMENTED = NO INPUT = @INPUT@ FILE_PATTERNS = *.c \ *.h RECURSIVE = YES USE_MDFILE_AS_MAINPAGE = README.md VERBATIM_HEADERS = NO ALPHABETICAL_INDEX = NO IGNORE_PREFIX = xkb_ \ XKB_ HTML_EXTRA_STYLESHEET = doc/doxygen-extra.css HTML_TIMESTAMP = NO ENUM_VALUES_PER_LINE = 1 SEARCHENGINE = NO GENERATE_LATEX = NO ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.0753205 libxkbcommon-0.10.0/doc/compat.md0000644000175000017500000000431300000000000016212 0ustar00ranran00000000000000# Compatibility Relative to the XKB 1.0 specification implemented in current X servers, xkbcommon has removed support for some parts of the specification which introduced unnecessary complications. Many of these removals were in fact not implemented, or half-implemented at best, as well as being totally unused in the standard dataset. Notable removals: - geometry support + there were very few geometry definitions available, and while xkbcommon was responsible for parsing this insanely complex format, it never actually did anything with it + hopefully someone will develop a companion library which supports keyboard geometries in a more useful format - KcCGST (keycodes/compat/geometry/symbols/types) API + use RMLVO instead; KcCGST is now an implementation detail + including pre-defined keymap files - XKM support + may come in an optional X11 support/compatibility library - around half of the interpret actions + pointer device, message and redirect actions in particular - non-virtual modifiers + core and virtual modifiers have been collapsed into the same namespace, with a 'significant' flag that largely parallels the core/virtual split - radio groups + completely unused in current keymaps, never fully implemented - overlays + almost completely unused in current keymaps - key behaviors + used to implement radio groups and overlays, and to deal with things like keys that physically lock; unused in current keymaps - indicator behaviours such as LED-controls-key + the only supported LED behaviour is key-controls-LED; again this was never really used in current keymaps On the other hand, some features and extensions were added. Notable additions: - 32-bit keycodes - extended number of modifiers (planned) - extended number of groups (planned) - multiple keysyms per level + such levels are ignored by x11/xkbcomp. - key names (e.g. ``) can be longer than 4 characters. ## Compose support Relative to the standard implementation in libX11 (described in the Compose(5) man-page), some features are not supported: - the (! MODIFIER) syntax + parsed correctly but ignored. - using modifier keysyms in Compose sequences - several interactions with Braille keysyms ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.0753205 libxkbcommon-0.10.0/doc/doxygen-extra.css0000644000175000017500000000022700000000000017715 0ustar00ranran00000000000000div#top, div.header, div.contents { margin-left: auto; margin-right: auto; width: 960px; } .footer { display: none; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.0853205 libxkbcommon-0.10.0/doc/keymap-format-text-v1.md0000644000175000017500000002721200000000000021014 0ustar00ranran00000000000000# The XKB keymap text format, V1 This document describes the `XKB_KEYMAP_FORMAT_TEXT_V1` keymap format, as implemented by libxkbcommon. A keymap consists of a single top-level `xkb_keymap` block, underwhich are nested the following sections. ## The `xkb_keycodes` section This is the simplest section type, and is the first one to be compiled. The purpose of this is mostly to map between the hardware/evdev scancodes and xkb keycodes. Each key is given a name by which it can be referred to later, e.g. in the symbols section. ### Keycode statements Statements of the form: = 49; = 10; The above would let 49 and 10 be valid keycodes in the keymap, and assign them the names `TLDE` and `AE01` respectively. The format `` is always used to refer to a key by name. [The naming convention `` just denotes the position of the key in the main alphanumric section of a standard QWERTY keyboard, with the two letters specifying the row and the two digits specifying the column, from the bottom left.] In the common case this just maps to the evdev scancodes from `/usr/include/linux/input.h`, e.g. the following definitions: #define KEY_GRAVE 41 #define KEY_1 2 correspond to the ones above. Similar definitions appear in the xf86-input-keyboard driver. Note that in all current keymaps there's a constant offset of 8 (for historical reasons). If there's a conflict, like the same name given to different keycodes, or same keycode given different names, it is resolved according to the merge mode which applies to the definitions. ### Alias statements Statements of the form: alias = ; Allows to refer to a previously defined key (here ``) by another name (here ``). Conflicts are handled similarly to keycode statements. ### LED name statements Statements of the form: indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; indicator 3 = "Scroll Lock"; Assigns a name to the keyboard LED (AKA indicator) with the given index. The LED may be referred by this name later in the compat section and by the user. ## The `xkb_types` section This section is the second to be processesed, after `xkb_keycodes`. However, it is completely independent and could have been the first to be processed (it does not refer to specific keys as specified in the `xkb_keycodes` section). This section defines key types, which, given a key and a keyboard state (i.e. modifier state and group), determine the shift level to be used in translating the key to keysyms. These types are assigned to each group in each key, in the `xkb_symbols` section. Key types are called this way because, in a way, they really describe the "type" of the key (or more correctly, a specific group of the key). For example, an ordinary keymap will provide a type called `KEYPAD`, which consists of two levels, with the second level being chosen according to the state of the Num Lock (or Shift) modifiers. Another example is a type called `ONE_LEVEL`, which is usually assigned to keys such as Escape; these have just one level and are not affected by the modifier state. Yet more common examples are `TWO_LEVEL` (with Shift choosing the second level), `ALPHABETIC` (where Caps Lock may also choose the second level), etc. ### Type definitions Statements of the form: type "FOUR_LEVEL" { ... } The above would create a new type named `FOUR_LEVEL`. The body of the definition may include statements of the following forms: #### `level_name` statements level_name[Level1] = "Base"; Mandatory for each level in the type. Gives each level in this type a descriptive name. It isn't used for anything. Note: A level may be specified as Level[1-8] or just a number (can be more than 8). #### `modifiers` statement modifiers = Shift+Lock+LevelThree; Mandatory, should be specified only once. A mask of real and virtual modifiers. These are the only modifiers being considered when matching the modifier state against the type. The other modifiers, whether active or not, are masked out in the calculation. #### `map` entry statements map[Shift+LevelThree] = Level4; Should have at least as many mappings as there are levels in the type. If the active modifiers, masked with the type's modifiers (as stated above), match (i.e. equal) the modifiers inside the `map[]` statement, then the level in the right hand side is chosen. For example, in the above, if in the current keyboard state the `Shift` and `LevelThree` modifiers are active, while the `Lock` modifier is not, then the keysym(s) in the 4th level of the group will be returned to the user. #### `preserve` statements map[Shift+Lock+LevelThree] = Level5; preserve[Shift+Lock+LevelThree] = Lock; When a key type is used for keysym translation, its modifiers are said to be "consumed". For example, in a simple US keymap, the "g" "g" key is assigned an ordinary `ALPHABETIC` key type, whose modifiers are Shift and Lock; then for the "g" key, these two modifiers are consumed by the translation. This information is relevant for applications which further process the modifiers, since by then the consumed modifiers have already "done their part" and should be masked out. However, sometimes even if a modifier had already affected the key translation through the type, it should *not* be reported as consumed, for various reasons. In this case, a `preserve[]` statement can be used to augment the map entry. The modifiers inside the square brackets should match one of the map[] statements in the type (if there is no matching map entry, one mapping to Level1 is implicitly added). The right hand side should consists of modifiers from the type's modifiers; these modifiers are then "preserved" and not reported as consumed. ## The `xkb_compat` section This section is the third to be processed, after `xkb_keycodes` and `xkb_types`. ### Interpret statements Statements of the form: interpret Num_Lock+Any { ... } interpret Shift_Lock+AnyOf(Shift+Lock) { ... } The `xkb_symbols` section (see below) allows the keymap author to perform, among other things, the following things for each key: - Bind an action, like SetMods or LockGroup, to the key. Actions, like symbols, are specified for each level of each group in the key separately. - Add a virtual modifier to the key's virtual modifier mapping (vmodmap). - Specify whether the key should repeat or not. However, doing this for each key (or level) is tedious and inflexible. Interpret's are a mechanism to apply these settings to a bunch of keys/levels at once. Each interpret specifies a condition by which it attaches to certain levels. The condition consists of two parts: - A keysym. If the level has a different (or more than one) keysym, the match fails. Leaving out the keysym is equivalent to using the `NoSymbol` keysym, which always matches successfully. - A modifier predicate. The predicate consists of a matching operation and a mask of (real) modifiers. The modifiers are matched against the key's modifier map (modmap). The matching operation can be one of the following: * `AnyOfOrNone` - The modmap must either be empty or include at least one of the specified modifiers. * `AnyOf` - The modmap must include at least one of the specified modifiers. * `NoneOf` - The modmap must not include any of the specified modifiers. * `AllOf` - The modmap must include all of the specified modifiers (but may include others as well). * `Exactly` - The modmap must be exactly the same as the specified modifiers. Leaving out the predicate is equivalent to using `AnyOfOrNone` while specifying all modifiers. Leaving out just the matching condition is equivalent to using `Exactly`. An interpret may also include `useModMapMods = level1;` - see below. If a level fulfils the conditions of several interprets, only the most specific one is used: - A specific keysym will always match before a generic `NoSymbol` condition. - If the keysyms are the same, the interpret with the more specific matching operation is used. The above list is sorted from least to most specific. - If both the keysyms and the matching operations are the same (but the modifiers are different), the first interpret is used. As described above, once an interpret "attaches" to a level, it can bind an action to that level, add one virtual modifier to the key's vmodmap, or set the key's repeat setting. You should note the following: - The key repeat is a property of the entire key; it is not level-specific. In order to avoid confusion, it is only inspected for the first level of the first group; the interpret's repeat setting is ignored when applied to other levels. - If one of the above fields was set directly for a key in `xkb_symbols`, the explicit setting takes precedence over the interpret. The body of the statement may include statements of the following forms (all of which are optional): #### `useModMapMods` statement useModMapMods = level1; When set to `level1`, the interpret will only match levels which are the first level of the first group of the keys. This can be useful in conjunction with e.g. a `virtualModifier` statement. #### `action` statement action = LockMods(modifiers=NumLock); Bind this action to the matching levels. #### `virtualModifier` statement virtualModifier = NumLock; Add this virtual modifier to the key's vmodmap. The given virtual modifier must be declared at the top level of the file with a `virtual_modifiers` statement, e.g.: virtual_modifiers NumLock; #### `repeat` statement repeat = True; Set whether the key should repeat or not. Must be a boolean value. ### LED map statements Statements of the form: indicator "Shift Lock" { ... } This statement specifies the behavior and binding of the LED (AKA indicator) with the given name ("Shift Lock" above). The name should have been declared previously in the `xkb_keycodes` section (see LED name statement), and given an index there. If it wasn't, it is created with the next free index. The body of the statement describes the conditions of the keyboard state which will cause the LED to be lit. It may include the following statements: #### `modifiers` statement modifiers = ScrollLock; If the given modifiers are in the required state (see below), the LED is lit. #### `whichModState` statment whichModState = Latched+Locked; Can be any combination of: * `base`, `latched`, `locked`, `effective` * `any` (i.e. all of the above) * `none` (i.e. none of the above) * `compat` (legacy value, treated as effective) This will cause the respective portion of the modifier state (see `struct xkb_state`) to be matched against the modifiers given in the `modifiers` statement. Here's a simple example: indicator "Num Lock" { modifiers = NumLock; whichModState = Locked; }; Whenever the NumLock modifier is locked, the Num Lock LED will light up. #### `groups` statement groups = All - group1; If the given groups are in the required state (see below), the LED is lit. #### `whichGroupState` statement whichGroupState = Effective; Can be any combination of: * `base`, `latched`, `locked`, `effective` * `any` (i.e. all of the above) * `none` (i.e. none of the above) This will cause the respective portion of the group state (see `struct xkb_state`) to be matched against the groups given in the `groups` statement. Note: the above conditions are disjunctive, i.e. if any of them are satisfied the LED is lit. ## The `xkb_symbols` section This section is the fourth to be processed, after `xkb_keycodes`, `xkb_types` and `xkb_compat`. TODO ## Virtual modifier statements Statements of the form: virtual_modifiers LControl; Can appear in the `xkb_types`, `xkb_compat`, `xkb_symbols` sections. TODO ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.101987 libxkbcommon-0.10.0/doc/quick-guide.md0000644000175000017500000001576700000000000017155 0ustar00ranran00000000000000# Quick Guide ## Introduction This document contains a quick walk-through of the often-used parts of the library. We will employ a few use-cases to lead the examples: 1. An evdev client. "evdev" is the Linux kernel's input subsystem; it only reports to the client which keys are pressed and released. 2. An X11 client, using the XCB library to communicate with the X server and the xcb-xkb library for using the XKB protocol. 3. A Wayland client, using the standard protocol. The snippets are not complete, and some support code is omitted. You can find complete and more complex examples in the source directory: 1. test/interactive-evdev.c contains an interactive evdev client. 2. test/interactive-x11.c contains an interactive X11 client. 3. test/interactive-wayland.c contains an interactive Wayland client. Also, the library contains many more functions for examining and using the library context, the keymap and the keyboard state. See the hyper-linked reference documentation or go through the header files in xkbcommon/ for more details. ## Code Before we can do anything interesting, we need a library context: ~~~{.c} #include struct xkb_context *ctx; ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); if (!ctx) ~~~ The `xkb_context` contains the keymap include paths, the log level and functions, and other general customizable administrativia. Next we need to create a keymap, `xkb_keymap`. This is an immutable object which contains all of the information about the keys, layouts, etc. There are different ways to do this. If we are an evdev client, we have nothing to go by, so we need to ask the user for his/her keymap preferences (for example, an Icelandic keyboard with a Dvorak layout). The configuration format is commonly called RMLVO (Rules+Model+Layout+Variant+Options), the same format used by the X server. With it, we can fill a struct called `xkb_rule_names`; passing `NULL` chooses the system's default. ~~~{.c} struct xkb_keymap *keymap; /* Example RMLVO for Icelandic Dvorak. */ struct xkb_rule_names names = { .rules = NULL, .model = "pc105", .layout = "is", .variant = "dvorak", .options = "terminate:ctrl_alt_bksp" }; keymap = xkb_keymap_new_from_names(ctx, &names, XKB_KEYMAP_COMPILE_NO_FLAGS); if (!keymap) ~~~ If we are a Wayland client, the compositor gives us a string complete with a keymap. In this case, we can create the keymap object like this: ~~~{.c} /* From the wl_keyboard::keymap event. */ const char *keymap_string = <...>; struct xkb_keymap *keymap; keymap = xkb_keymap_new_from_string(ctx, keymap_string, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS); if (!keymap) ~~~ If we are an X11 client, we are better off getting the keymap from the X server directly. For this we need to choose the XInput device; here we will use the core keyboard device: ~~~{.c} #include xcb_connection_t *conn = <...>; int32_t device_id; device_id = xkb_x11_get_core_keyboard_device_id(conn); if (device_id == -1) keymap = xkb_x11_keymap_new_from_device(ctx, conn, device_id, XKB_KEYMAP_COMPILE_NO_FLAGS); if (!keymap) ~~~ Now that we have the keymap, we are ready to handle the keyboard devices. For each device, we create an `xkb_state`, which remembers things like which keyboard modifiers and LEDs are active: ~~~{.c} struct xkb_state *state; state = xkb_state_new(keymap); if (!state) ~~~ For X11/XCB clients, this is better: ~~~{.c} state = xkb_x11_state_new_from_device(keymap, conn, device_id); if (!state) ~~~ When we have an `xkb_state` for a device, we can start handling key events from it. Given a keycode for a key, we can get its keysym: ~~~{.c} event; xkb_keycode_t keycode; xkb_keysym_t keysym; keycode = event->keycode; keysym = xkb_state_key_get_one_sym(state, keycode); ~~~ We can see which keysym we got, and get its name: ~~~{.c} char keysym_name[64]; if (keysym == XKB_KEY_Space) xkb_keysym_get_name(keysym, keysym_name, sizeof(keysym_name)); ~~~ libxkbcommon also supports an extension to the classic XKB, whereby a single event can result in multiple keysyms. Here's how to use it: ~~~{.c} const xkb_keysym_t *keysyms; int num_keysyms; num_keysyms = xkb_state_key_get_syms(state, keycode, &keysyms); ~~~ We can also get a UTF-8 string representation for this key: ~~~{.c} char *buffer; int size; // First find the needed size; return value is the same as snprintf(3). size = xkb_state_key_get_utf8(state, keycode, NULL, 0) + 1; if (size <= 1) buffer = xkb_state_key_get_utf8(state, keycode, buffer, size); ~~~ Of course, we also need to keep the `xkb_state` up-to-date with the keyboard device, if we want to get the correct keysyms in the future. If we are an evdev client, we must let the library know whether a key is pressed or released at any given time: ~~~{.c} enum xkb_state_component changed; if () changed = xkb_state_update_key(state, keycode, XKB_KEY_DOWN); else if () changed = xkb_state_update_key(state, keycode, XKB_KEY_UP); ~~~ The `changed` return value tells us exactly which parts of the state have changed. If it is a key-repeat event, we can ask the keymap what to do with it: ~~~{.c} if ( && !xkb_keymap_key_repeats(keymap, keycode)) ~~~ On the other hand, if we are an X or Wayland client, the server already does the hard work for us. It notifies us when the device's state changes, and we can simply use what it tells us (the necessary information usually comes in a form of some "state changed" event): ~~~{.c} changed = xkb_state_update_mask(state, event->depressed_mods, event->latched_mods, event->locked_mods, event->depressed_layout, event->latched_layout, event->locked_layout); ~~~ Now that we have an always-up-to-date `xkb_state`, we can examine it. For example, we can check whether the Control modifier is active, or whether the Num Lock LED is active: ~~~{.c} if (xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CTRL, XKB_STATE_MODS_EFFECTIVE) > 0) if (xkb_state_led_name_is_active(state, XKB_LED_NAME_NUM) > 0) ~~~ And that's it! Eventually, we should free the objects we've created: ~~~{.c} xkb_state_unref(state); xkb_keymap_unref(keymap); xkb_context_unref(ctx); ~~~ ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.101987 libxkbcommon-0.10.0/doc/rules-format.txt0000644000175000017500000000706700000000000017577 0ustar00ranran00000000000000The rules file ============== The purpose of the rules file is to map between configuration values that are easy for a user to specify and understand, and the configuration values xkbcomp uses and understands. xkbcomp uses the xkb_component_names struct, which maps directly to include statements of the appropriate sections, called for short KcCGST (see doc/keymap-format-text-v1.txt; 'G' stands for "geometry", which is not supported). These are not really intuitive or straight- forward for the uninitiated. Instead, the user passes in a xkb_rule_names struct, which consists of the name of a rules file (in Linux this is usually "evdev"), a keyboard model (e.g. "pc105"), a set of layouts (which will end up in different groups, e.g. "us,fr"), variants (used to alter/augment the respective layout, e.g. "intl,dvorak"), and a set of options (used to tweak some general behavior of the keyboard, e.g. "ctrl:nocaps,compose:menu" to make the Caps Lock key act like Ctrl and the Menu key like Compose). We call these RMLVO. Format of the file ------------------ The file consists of rule sets, each consisting of rules (one per line), which match the MLVO values on the left hand side, and, if the values match to the values the user passed in, results in the values on the right hand side being added to the resulting KcCGST. Since some values are related and repeated often, it is possible to group them together and refer to them by a group name in the rules. Along with matching values by simple string equality, and for membership in a group defined previously, rules may also contain "wildcard" values - "*" - which always match. These usually appear near the end. Grammar ------- (It might be helpful to look at a file like rules/evdev along with this grammer. Comments, whitespace, etc. are not shown.) File ::= { "!" (Include | Group | RuleSet) } Include ::= "include" Group ::= GroupName "=" { GroupElement } "\n" GroupName ::= "$" GroupElement ::= RuleSet ::= Mapping { Rule } Mapping ::= { Mlvo } "=" { Kccgst } "\n" Mlvo ::= "model" | "option" | ("layout" | "variant") [ Index ] Index ::= "[" 1..XKB_NUM_GROUPS "]" Kccgst ::= "keycodes" | "symbols" | "types" | "compat" | "geometry" Rule ::= { MlvoValue } "=" { KccgstValue } "\n" MlvoValue ::= "*" | GroupName | KccgstValue ::= Notes: - Include processes the rules in the file path specified in the ident, in order. %-expanasion is performed, as follows: %%: A literal %. %H: The value of the HOME environment variable. %S: The system-installed rules directory (usually /usr/share/X11/xkb/rules). - The order of values in a Rule must be the same as the Mapping it follows. The mapping line determines the meaning of the values in the rules which follow in the RuleSet. - If a Rule is matched, %-expansion is performed on the KccgstValue, as follows: %m, %l, %v: The model, layout or variant, if only one was given (e.g. %l for "us,il" is invalid). %l[1], %v[1]: Layout or variant for the specified group Index, if more than one was given (e.g. %l[1] for "us" is invalid). %+m, %+l, %+v, %+l[1], %+v[1] As above, but prefixed with '+'. Similarly, '|', '-', '_' may be used instead of '+'. %(m), %(l), %(l[1]), %(v), %(v[1]): As above, but prefixed by '(' and suffixed by ')'. In case the expansion is invalid, as described above, it is skipped (the rest of the string is still processed); this includes the prefix and suffix (that's why you shouldn't use e.g. "(%v[1])"). ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.1419864 libxkbcommon-0.10.0/fuzz/0000755000175000017500000000000000000000000014635 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.1153202 libxkbcommon-0.10.0/fuzz/.gitignore0000644000175000017500000000001200000000000016616 0ustar00ranran00000000000000findings/ ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.1186533 libxkbcommon-0.10.0/fuzz/compose/0000755000175000017500000000000000000000000016302 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.1186533 libxkbcommon-0.10.0/fuzz/compose/dict0000644000175000017500000000007100000000000017146 0ustar00ranran00000000000000"Ctrl" "Lock" "Caps" "Shift" "Alt" "Meta" "None" "acute" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.1186533 libxkbcommon-0.10.0/fuzz/compose/target.c0000644000175000017500000000220300000000000017731 0ustar00ranran00000000000000/* * A target program for fuzzing the Compose text format. * * Currently, just parses an input file, and hopefully doesn't crash or hang. */ #include "config.h" #include #include "xkbcommon/xkbcommon.h" #include "xkbcommon/xkbcommon-compose.h" int main(int argc, char *argv[]) { struct xkb_context *ctx; FILE *file; struct xkb_compose_table *table; if (argc != 2) { fprintf(stderr, "usage: %s \n", argv[0]); return 1; } ctx = xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES | XKB_CONTEXT_NO_ENVIRONMENT_NAMES); assert(ctx); #ifdef __AFL_HAVE_MANUAL_CONTROL __AFL_INIT(); while (__AFL_LOOP(1000)) #endif { file = fopen(argv[1], "rb"); assert(file); table = xkb_compose_table_new_from_file(ctx, file, "en_US.UTF-8", XKB_COMPOSE_FORMAT_TEXT_V1, XKB_COMPOSE_COMPILE_NO_FLAGS); xkb_compose_table_unref(table); fclose(file); } puts(table ? "OK" : "FAIL"); xkb_context_unref(ctx); } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.1186533 libxkbcommon-0.10.0/fuzz/compose/testcases/0000755000175000017500000000000000000000000020300 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.1286533 libxkbcommon-0.10.0/fuzz/compose/testcases/Compose0000644000175000017500000000017700000000000021635 0ustar00ranran00000000000000 : "~" asciitilde # X Meta !Alt ~Shift : "\"\'\x43\123abc" acute # Y ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.1419864 libxkbcommon-0.10.0/fuzz/fuzz.sh0000755000175000017500000000056700000000000016202 0ustar00ranran00000000000000#!/bin/sh set -e case "$1" in keymap|compose) ;; *) echo "usage: $0 keymap|compose" 1>&2 exit 1 ;; esac export CC=afl-clang-fast export AFL_HARDEN=1 test -d fuzz/build || meson setup -Db_lto=true fuzz/build ninja -C fuzz/build afl-fuzz -i fuzz/$1/testcases -x fuzz/$1/dict -o fuzz/$1/findings -t 200 -m 10 -- ./fuzz/build/fuzz-$1 @@ ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.148653 libxkbcommon-0.10.0/fuzz/keymap/0000755000175000017500000000000000000000000016123 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.148653 libxkbcommon-0.10.0/fuzz/keymap/dict0000644000175000017500000000230700000000000016773 0ustar00ranran00000000000000"Control" "Group1" "Group5" "Lock" "Mod1" "Mod9" "Shift" "U1" "0x1" "Up" "accel" "action" "actions" "affect" "alias" "all" "allowexplicit" "allownone" "alphanumeric_keys" "alternate" "alternate_group" "any" "augment" "both" "button" "clearLocks" "clearmods" "controls" "count" "ctrls" "data" "default" "dev" "device" "dfltbtn" "driveskbd" "false" "foo" "function_keys" "genKeyEvent" "group" "groupname" "groups" "groupsclamp" "groupsredirect" "groupswrap" "hidden" "include" "increment" "index" "indicator" "indicatordriveskbd" "interpret" "kc" "key" "keycode" "keypad_keys" "keys" "latchToLock" "leddriveskbd" "levelname" "lock" "locking" "logo" "map" "mod_map" "modifier_keys" "modifier_map" "modifiers" "modmap" "modmapmods" "mods" "name" "neither" "no" "none" "nosymbol" "off" "on" "outline" "overlay" "override" "partial" "preserve" "radiogroup" "repeat" "replace" "report" "row" "same" "sameServer" "screen" "section" "shape" "solid" "symbols" "text" "true" "type" "unlock" "usemodmap" "value" "virtual" "virtual_modifiers" "virtualmod" "vmods" "voidsymbol" "whichgroupstate" "whichmodstate" "x" "xkb_compat" "xkb_geometry" "xkb_keycodes" "xkb_keymap" "xkb_layout" "xkb_semantics" "xkb_symbols" "xkb_types" "y" "yes" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.148653 libxkbcommon-0.10.0/fuzz/keymap/target.c0000644000175000017500000000177700000000000017571 0ustar00ranran00000000000000/* * A target program for fuzzing the XKB keymap text format. * * Currently, just parses an input file, and hopefully doesn't crash or hang. */ #include "config.h" #include #include "xkbcommon/xkbcommon.h" int main(int argc, char *argv[]) { struct xkb_context *ctx; FILE *file; struct xkb_keymap *keymap; if (argc != 2) { fprintf(stderr, "usage: %s \n", argv[0]); return 1; } ctx = xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES | XKB_CONTEXT_NO_ENVIRONMENT_NAMES); assert(ctx); #ifdef __AFL_HAVE_MANUAL_CONTROL __AFL_INIT(); while (__AFL_LOOP(1000)) #endif { file = fopen(argv[1], "rb"); assert(file); keymap = xkb_keymap_new_from_file(ctx, file, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS); xkb_keymap_unref(keymap); fclose(file); } puts(keymap ? "OK" : "FAIL"); xkb_context_unref(ctx); } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.148653 libxkbcommon-0.10.0/fuzz/keymap/testcases/0000755000175000017500000000000000000000000020121 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.158653 libxkbcommon-0.10.0/fuzz/keymap/testcases/input.xkb0000644000175000017500000000245300000000000021772 0ustar00ranran00000000000000xkb_keymap{ xkb_keycodes"0"{ minimum=0; maximum=500; =0; indicator 1="X"; alias=; }; xkb_types"X"{ virtual_modifiers NumLock; type"X"{ modifiers=Shift; map[Shift]=Level2; level_name[Level1]="X"; preserve[Shift]=Shift; }; }; partial xkb_compat{ virtual_modifiers Alt; interpret.useModMapMods=AnyLevel; interpret.repeat=False; interpret.locking=False; interpret ISO_Level2_Latch+Exactly(Shift){ repeat=True; virtualModifier=NumLock; useModMapMods=level1; action=LatchMods(modifiers=Shift,clearLocks,latchToLock); action=MovePtr(x=+0,y=-0); action=SwitchScreen(screen=00,!same); action=Private(type=0x80,data[0]=0x00); }; indicator"X"{whichModState=locked;modifiers=Lock;}; }; xkb_symbols{ name[group1]="X"; key{type[group2]="X",symbols[Group1]=[0,exclam],symbols[Group2]=[0xff,U00],symbols[Group3]=[z]}; modifier_map Control{}; }; default xkb_geometry"X"{ description="X"; width=470; shape.cornerRadius=1; shape"NORM"{cornerRadius=0,{[0.0,0]},{[0,0],[0,0.0]}}; solid"X"{shape="X";top=00;left=00;color="X";}; indicator.onColor="X"; indicator.top=00.0; indicator.shape="X"; indicator"X"{left=0;}; text.top=00; text.color="X"; text"X"{left=0;text="X";}; section.left=00; row.left=0; key.shape="X"; key.gap=1; section"X"{top=22;row{top=1;keys{{,color="X"},{,00.0},,,};};}; alias=; }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.158653 libxkbcommon-0.10.0/meson.build0000644000175000017500000004262500000000000016012 0ustar00ranran00000000000000project( 'libxkbcommon', 'c', version: '0.10.0', default_options: [ 'c_std=c99', 'warning_level=2', 'b_lundef=true', ], meson_version : '>= 0.41.0', ) pkgconfig = import('pkgconfig') cc = meson.get_compiler('c') # Compiler flags. foreach cflag: [ '-fvisibility=hidden', '-fno-strict-aliasing', '-fsanitize-undefined-trap-on-error', '-Wextra', '-Wno-unused-parameter', '-Wno-missing-field-initializers', '-Wpointer-arith', '-Wmissing-declarations', '-Wformat=2', '-Wstrict-prototypes', '-Wmissing-prototypes', '-Wnested-externs', '-Wbad-function-cast', '-Wshadow', '-Wlogical-op', '-Wdate-time', '-Wwrite-strings', '-Wno-documentation-deprecated-sync', ] if cc.has_argument(cflag) add_project_arguments(cflag, language: 'c') endif endforeach # The XKB config root. XKBCONFIGROOT = get_option('xkb-config-root') if XKBCONFIGROOT == '' xkeyboard_config_dep = dependency('xkeyboard-config', required: false) if xkeyboard_config_dep.found() XKBCONFIGROOT = xkeyboard_config_dep.get_pkgconfig_variable('xkb_base') else XKBCONFIGROOT = join_paths(get_option('prefix'), get_option('datadir'), 'X11', 'xkb') endif endif # The X locale directory for compose. XLOCALEDIR = get_option('x-locale-root') if XLOCALEDIR == '' XLOCALEDIR = join_paths(get_option('prefix'), get_option('datadir'), 'X11', 'locale') endif # config.h. configh_data = configuration_data() # Like AC_USE_SYSTEM_EXTENSIONS, what #define to use to get extensions # beyond the base POSIX function set. if host_machine.system() == 'sunos' system_extensions = '__EXTENSIONS__' else system_extensions = '_GNU_SOURCE' endif configh_data.set(system_extensions, 1) system_ext_define = '#define ' + system_extensions configh_data.set_quoted('DFLT_XKB_CONFIG_ROOT', XKBCONFIGROOT) configh_data.set_quoted('XLOCALEDIR', XLOCALEDIR) configh_data.set_quoted('DEFAULT_XKB_RULES', get_option('default-rules')) configh_data.set_quoted('DEFAULT_XKB_MODEL', get_option('default-model')) configh_data.set_quoted('DEFAULT_XKB_LAYOUT', get_option('default-layout')) if get_option('default-variant') != '' configh_data.set_quoted('DEFAULT_XKB_VARIANT', get_option('default-variant')) endif if get_option('default-options') != '' configh_data.set_quoted('DEFAULT_XKB_OPTIONS', get_option('default-options')) endif if cc.links('int main(){if(__builtin_expect(1<0,0)){}}', name: '__builtin_expect') configh_data.set('HAVE___BUILTIN_EXPECT', 1) endif if cc.has_header_symbol('unistd.h', 'eaccess', prefix: system_ext_define) configh_data.set('HAVE_EACCESS', 1) endif if cc.has_header_symbol('unistd.h', 'euidaccess', prefix: system_ext_define) configh_data.set('HAVE_EUIDACCESS', 1) endif if cc.has_header_symbol('sys/mman.h', 'mmap') configh_data.set('HAVE_MMAP', 1) endif if cc.has_header_symbol('stdlib.h', 'mkostemp', prefix: system_ext_define) configh_data.set('HAVE_MKOSTEMP', 1) endif if cc.has_header_symbol('fcntl.h', 'posix_fallocate', prefix: system_ext_define) configh_data.set('HAVE_POSIX_FALLOCATE', 1) endif if cc.has_header_symbol('string.h', 'strndup', prefix: system_ext_define) configh_data.set('HAVE_STRNDUP', 1) endif if cc.has_header_symbol('stdio.h', 'asprintf', prefix: system_ext_define) configh_data.set('HAVE_ASPRINTF', 1) elif cc.has_header_symbol('stdio.h', 'vasprintf', prefix: system_ext_define) configh_data.set('HAVE_VASPRINTF', 1) endif if cc.has_header_symbol('stdlib.h', 'secure_getenv', prefix: system_ext_define) configh_data.set('HAVE_SECURE_GETENV', 1) elif cc.has_header_symbol('stdlib.h', '__secure_getenv', prefix: system_ext_define) configh_data.set('HAVE___SECURE_GETENV', 1) else message('C library does not support secure_getenv, using getenv instead') endif # Silence some security & deprecation warnings on MSVC # for some unix/C functions we use. # https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4996?view=vs-2019 configh_data.set('_CRT_SECURE_NO_WARNINGS', 1) configh_data.set('_CRT_NONSTDC_NO_WARNINGS', 1) configh_data.set('_CRT_NONSTDC_NO_DEPRECATE', 1) # Reduce unnecessary includes on MSVC. configh_data.set('WIN32_LEAN_AND_MEAN', 1) configure_file(output: 'config.h', configuration: configh_data) # Supports -Wl,--version-script? have_version_script = cc.links( 'int main(){}', args: '-Wl,--version-script=' + join_paths(meson.source_root(), 'xkbcommon.map'), name: '-Wl,--version-script', ) # libxkbcommon. # Note: we use some yacc extensions, which work with either GNU bison # (preferred) or byacc. Other yacc's may or may not work. yacc = find_program('bison', 'win_bison', 'byacc') yacc_gen = generator( yacc, output: ['@BASENAME@.c', '@BASENAME@.h'], arguments: ['@INPUT@', '--defines=@OUTPUT1@', '--output=@OUTPUT0@', '-p _xkbcommon_'], ) libxkbcommon_sources = [ 'src/compose/parser.c', 'src/compose/parser.h', 'src/compose/paths.c', 'src/compose/paths.h', 'src/compose/state.c', 'src/compose/table.c', 'src/compose/table.h', 'src/xkbcomp/action.c', 'src/xkbcomp/action.h', 'src/xkbcomp/ast.h', 'src/xkbcomp/ast-build.c', 'src/xkbcomp/ast-build.h', 'src/xkbcomp/compat.c', 'src/xkbcomp/expr.c', 'src/xkbcomp/expr.h', 'src/xkbcomp/include.c', 'src/xkbcomp/include.h', 'src/xkbcomp/keycodes.c', 'src/xkbcomp/keymap.c', 'src/xkbcomp/keymap-dump.c', 'src/xkbcomp/keywords.c', yacc_gen.process('src/xkbcomp/parser.y'), 'src/xkbcomp/parser-priv.h', 'src/xkbcomp/rules.c', 'src/xkbcomp/rules.h', 'src/xkbcomp/scanner.c', 'src/xkbcomp/symbols.c', 'src/xkbcomp/types.c', 'src/xkbcomp/vmod.c', 'src/xkbcomp/vmod.h', 'src/xkbcomp/xkbcomp.c', 'src/xkbcomp/xkbcomp-priv.h', 'src/atom.c', 'src/atom.h', 'src/context.c', 'src/context.h', 'src/context-priv.c', 'src/darray.h', 'src/keysym.c', 'src/keysym.h', 'src/keysym-utf.c', 'src/ks_tables.h', 'src/keymap.c', 'src/keymap.h', 'src/keymap-priv.c', 'src/scanner-utils.h', 'src/state.c', 'src/text.c', 'src/text.h', 'src/utf8.c', 'src/utf8.h', 'src/utils.c', 'src/utils.h', ] libxkbcommon_link_args = [] if have_version_script libxkbcommon_link_args += '-Wl,--version-script=' + join_paths(meson.source_root(), 'xkbcommon.map') endif libxkbcommon = library( 'xkbcommon', 'xkbcommon/xkbcommon.h', libxkbcommon_sources, link_args: libxkbcommon_link_args, link_depends: 'xkbcommon.map', version: '0.0.0', install: true, include_directories: include_directories('src'), ) install_headers( 'xkbcommon/xkbcommon.h', 'xkbcommon/xkbcommon-compat.h', 'xkbcommon/xkbcommon-compose.h', 'xkbcommon/xkbcommon-keysyms.h', 'xkbcommon/xkbcommon-names.h', subdir: 'xkbcommon', ) pkgconfig.generate( name: 'xkbcommon', filebase: 'xkbcommon', libraries: libxkbcommon, version: meson.project_version(), description: 'XKB API common to servers and clients', ) # libxkbcommon-x11. if get_option('enable-x11') xcb_dep = dependency('xcb', version: '>=1.10', required: false) xcb_xkb_dep = dependency('xcb-xkb', version: '>=1.10', required: false) if not xcb_dep.found() or not xcb_xkb_dep.found() error('''X11 support requires xcb-xkb >= 1.10 which was not found. You can disable X11 support with -Denable-x11=false.''') endif libxkbcommon_x11_sources = [ 'src/x11/keymap.c', 'src/x11/state.c', 'src/x11/util.c', 'src/x11/x11-priv.h', 'src/context.h', 'src/context-priv.c', 'src/keymap.h', 'src/keymap-priv.c', 'src/atom.h', 'src/atom.c', ] libxkbcommon_x11_internal = static_library( 'xkbcommon-x11-internal', libxkbcommon_x11_sources, include_directories: include_directories('src'), link_with: libxkbcommon, dependencies: [ xcb_dep, xcb_xkb_dep, ], ) libxkbcommon_x11_link_args = [] if have_version_script libxkbcommon_x11_link_args += '-Wl,--version-script=' + join_paths(meson.source_root(), 'xkbcommon-x11.map') endif libxkbcommon_x11 = library( 'xkbcommon-x11', 'xkbcommon/xkbcommon-x11.h', libxkbcommon_x11_sources, link_args: libxkbcommon_x11_link_args, link_depends: 'xkbcommon-x11.map', version: '0.0.0', install: true, include_directories: include_directories('src'), link_with: libxkbcommon, dependencies: [ xcb_dep, xcb_xkb_dep, ], ) install_headers( 'xkbcommon/xkbcommon-x11.h', subdir: 'xkbcommon', ) pkgconfig.generate( name: 'xkbcommon-x11', filebase: 'xkbcommon-x11', libraries: libxkbcommon_x11, version: meson.project_version(), description: 'XKB API common to servers and clients - X11 support', requires: ['xkbcommon'], requires_private: ['xcb>=1.10', 'xcb-xkb>=1.10'], ) endif # Tests test_env = environment() test_env.set('XKB_LOG_LEVEL', 'debug') test_env.set('XKB_LOG_VERBOSITY', '10') test_env.set('top_srcdir', meson.source_root()) test_env.set('top_builddir', meson.build_root()) test_configh_data = configuration_data() test_configh_data.set_quoted('TEST_XKB_CONFIG_ROOT', join_paths(meson.source_root(), 'test', 'data')) configure_file(output: 'test-config.h', configuration: test_configh_data) # Some tests need to use unexported symbols, so we link them against # an internal copy of libxkbcommon with all symbols exposed. libxkbcommon_test_internal = static_library( 'xkbcommon-test-internal', 'test/common.c', 'test/test.h', 'test/evdev-scancodes.h', libxkbcommon_sources, include_directories: include_directories('src'), ) test_dep = declare_dependency( include_directories: include_directories('src'), link_with: libxkbcommon_test_internal, ) if get_option('enable-x11') x11_test_dep = declare_dependency( link_with: libxkbcommon_x11_internal, dependencies: [ test_dep, xcb_dep, xcb_xkb_dep, ], ) endif test( 'keysym', executable('test-keysym', 'test/keysym.c', dependencies: test_dep), env: test_env, ) test( 'keymap', executable('test-keymap', 'test/keymap.c', dependencies: test_dep), env: test_env, ) test( 'filecomp', executable('test-filecomp', 'test/filecomp.c', dependencies: test_dep), env: test_env, ) # TODO: This test currently uses some functions that don't exist on Windows. if cc.get_id() != 'msvc' test( 'context', executable('test-context', 'test/context.c', dependencies: test_dep), env: test_env, ) endif test( 'rules-file', executable('test-rules-file', 'test/rules-file.c', dependencies: test_dep), env: test_env, ) test( 'rules-file-includes', executable('test-rules-file-includes', 'test/rules-file-includes.c', dependencies: test_dep), env: test_env, ) test( 'stringcomp', executable('test-stringcomp', 'test/stringcomp.c', dependencies: test_dep), env: test_env, ) test( 'buffercomp', executable('test-buffercomp', 'test/buffercomp.c', dependencies: test_dep), env: test_env, ) test( 'log', executable('test-log', 'test/log.c', dependencies: test_dep), env: test_env, ) test( 'atom', executable('test-atom', 'test/atom.c', dependencies: test_dep), env: test_env, ) test( 'utf8', executable('test-utf8', 'test/utf8.c', dependencies: test_dep), env: test_env, ) test( 'state', executable('test-state', 'test/state.c', dependencies: test_dep), env: test_env, ) test( 'keyseq', executable('test-keyseq', 'test/keyseq.c', dependencies: test_dep), env: test_env, ) test( 'rulescomp', executable('test-rulescomp', 'test/rulescomp.c', dependencies: test_dep), env: test_env, ) test( 'compose', executable('test-compose', 'test/compose.c', dependencies: test_dep), env: test_env, ) test( 'symbols-leak-test', find_program('test/symbols-leak-test.bash'), env: test_env, ) if get_option('enable-x11') test( 'x11', executable('test-x11', 'test/x11.c', dependencies: x11_test_dep), env: test_env, ) # test/x11comp is meant to be run, but it is (temporarily?) disabled. # See: https://github.com/xkbcommon/libxkbcommon/issues/30 executable('test-x11comp', 'test/x11comp.c', dependencies: x11_test_dep) endif # Fuzzing target programs. executable('fuzz-keymap', 'fuzz/keymap/target.c', dependencies: test_dep) executable('fuzz-compose', 'fuzz/compose/target.c', dependencies: test_dep) # Demo programs. if cc.has_header_symbol('getopt.h', 'getopt_long', prefix: '#define _GNU_SOURCE') executable('rmlvo-to-kccgst', 'test/rmlvo-to-kccgst.c', dependencies: test_dep) executable('rmlvo-to-keymap', 'test/rmlvo-to-keymap.c', dependencies: test_dep) executable('print-compiled-keymap', 'test/print-compiled-keymap.c', dependencies: test_dep) endif if cc.has_header('linux/input.h') executable('interactive-evdev', 'test/interactive-evdev.c', dependencies: test_dep) endif if get_option('enable-x11') executable('interactive-x11', 'test/interactive-x11.c', dependencies: x11_test_dep) endif if get_option('enable-wayland') wayland_client_dep = dependency('wayland-client', version: '>=1.2.0', required: false) wayland_protocols_dep = dependency('wayland-protocols', version: '>=1.12', required: false) wayland_scanner_dep = dependency('wayland-scanner', required: false, native: true) if not wayland_client_dep.found() or not wayland_protocols_dep.found() or not wayland_scanner_dep.found() error('''The Wayland demo programs require wayland-client >= 1.2.0, wayland-protocols >= 1.7 which were not found. You can disable the Wayland demo programs with -Denable-wayland=false.''') endif wayland_scanner = find_program(wayland_scanner_dep.get_pkgconfig_variable('wayland_scanner')) wayland_scanner_code_gen = generator( wayland_scanner, output: '@BASENAME@-protocol.c', arguments: ['code', '@INPUT@', '@OUTPUT@'], ) wayland_scanner_client_header_gen = generator( wayland_scanner, output: '@BASENAME@-client-protocol.h', arguments: ['client-header', '@INPUT@', '@OUTPUT@'], ) wayland_protocols_datadir = wayland_protocols_dep.get_pkgconfig_variable('pkgdatadir') xdg_shell_xml = join_paths(wayland_protocols_datadir, 'stable/xdg-shell/xdg-shell.xml') xdg_shell_sources = [ wayland_scanner_code_gen.process(xdg_shell_xml), wayland_scanner_client_header_gen.process(xdg_shell_xml), ] executable('interactive-wayland', 'test/interactive-wayland.c', xdg_shell_sources, dependencies: [test_dep, wayland_client_dep]) endif # xkeyboard-config "verifier" xkct_config = configuration_data() xkct_config.set('MESON_BUILD_ROOT', meson.build_root()) xkct_config.set('XKB_CONFIG_ROOT', XKBCONFIGROOT) configure_file(input: 'test/xkeyboard-config-test.py.in', output: 'xkeyboard-config-test', configuration: xkct_config, install: false) # Benchmarks. libxkbcommon_bench_internal = static_library( 'xkbcommon-bench-internal', 'bench/bench.c', 'bench/bench.h', link_with: libxkbcommon_test_internal, ) bench_dep = declare_dependency( include_directories: include_directories('src'), link_with: libxkbcommon_bench_internal, ) bench_env = environment() bench_env.set('top_srcdir', meson.source_root()) benchmark( 'key-proc', executable('bench-key-proc', 'bench/key-proc.c', dependencies: bench_dep), env: bench_env, ) benchmark( 'rules', executable('bench-rules', 'bench/rules.c', dependencies: bench_dep), env: bench_env, ) benchmark( 'rulescomp', executable('bench-rulescomp', 'bench/rulescomp.c', dependencies: bench_dep), env: bench_env, ) benchmark( 'compose', executable('bench-compose', 'bench/compose.c', dependencies: bench_dep), env: bench_env, ) # Documentation. if get_option('enable-docs') doxygen = find_program('doxygen', required: false) if not doxygen.found() error('''Documentation requires doxygen which was not found. You can disable the documentation with -Denable-docs=false.''') endif doxygen_wrapper = find_program('scripts/doxygen-wrapper') doxygen_input = [ 'README.md', 'doc/doxygen-extra.css', 'doc/quick-guide.md', 'doc/compat.md', 'xkbcommon/xkbcommon.h', 'xkbcommon/xkbcommon-names.h', 'xkbcommon/xkbcommon-x11.h', 'xkbcommon/xkbcommon-compose.h', ] doxygen_data = configuration_data() doxygen_data.set('PACKAGE_NAME', meson.project_name()) doxygen_data.set('PACKAGE_VERSION', meson.project_version()) doxygen_data.set('INPUT', ' '.join(doxygen_input)) doxygen_data.set('OUTPUT_DIRECTORY', meson.build_root()) doxyfile = configure_file( input: 'doc/Doxyfile.in', output: 'Doxyfile', configuration: doxygen_data, ) # TODO: Meson should provide this. docdir = join_paths(get_option('datadir'), 'doc', meson.project_name()) custom_target( 'doc', input: [doxyfile] + doxygen_input, output: 'html', command: [doxygen_wrapper, doxygen.path(), join_paths(meson.build_root(), 'Doxyfile'), meson.source_root()], install: true, install_dir: docdir, build_by_default: true, ) endif ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.171986 libxkbcommon-0.10.0/meson_options.txt0000644000175000017500000000223300000000000017274 0ustar00ranran00000000000000option( 'xkb-config-root', type: 'string', description: 'The XKB config root [default=xkeyboard-config install path]', ) option( 'x-locale-root', type: 'string', description: 'The X locale root [default=$datadir/X11/locale]', ) option( 'default-rules', type: 'string', value: 'evdev', description: 'Default XKB ruleset', ) option( 'default-model', type: 'string', value: 'pc105', description: 'Default XKB model', ) option( 'default-layout', type: 'string', value: 'us', description: 'Default XKB layout', ) option( 'default-variant', type: 'string', value: '', description: 'Default XKB variant', ) option( 'default-options', type: 'string', value: '', description: 'Default XKB options', ) option( 'enable-x11', type: 'boolean', value: true, description: 'Enable building the xkbcommon-x11 library', ) option( 'enable-docs', type: 'boolean', value: true, description: 'Enable building the documentation', ) option( 'enable-wayland', type: 'boolean', value: true, description: 'Enable support for Wayland utility programs', ) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2319856 libxkbcommon-0.10.0/scripts/0000755000175000017500000000000000000000000015326 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.1919858 libxkbcommon-0.10.0/scripts/doxygen-wrapper0000755000175000017500000000042300000000000020406 0ustar00ranran00000000000000#!/bin/sh # Run doxygen such that the working directory is the source root. # This is needed for various reasons (e.g. relative references in md files). # Do not use directly. DOXYGEN="$1" DOXYFILE="$2" ABS_TOP_SRCDIR="$3" cd "$ABS_TOP_SRCDIR" && exec "$DOXYGEN" "$DOXYFILE" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2019858 libxkbcommon-0.10.0/scripts/makeheader0000755000175000017500000000226300000000000017345 0ustar00ranran00000000000000#!/usr/bin/env python from __future__ import print_function import re import os prefix = os.environ.get('X11_HEADERS_PREFIX', '/usr') HEADERS = [ prefix + '/include/X11/keysymdef.h', prefix + '/include/X11/XF86keysym.h', prefix + '/include/X11/Sunkeysym.h', prefix + '/include/X11/DECkeysym.h', prefix + '/include/X11/HPkeysym.h', ] print('''#ifndef _XKBCOMMON_KEYSYMS_H #define _XKBCOMMON_KEYSYMS_H /* This file is autogenerated; please do not commit directly. */ #define XKB_KEY_NoSymbol 0x000000 /* Special KeySym */ ''') for path in HEADERS: with open(path) as header: for line in header: if '#ifdef' in line or '#ifndef' in line or '#endif' in line: continue # Remove #define _OSF_Keysyms and such. if '#define _' in line: continue # Handle a duplicate definition in HPkeysyms.h which kicks in if # it's not already defined. if 'XK_Ydiaeresis' in line and '0x100000ee' in line: continue line = re.sub(r'#define\s*(\w*)XK_', r'#define XKB_KEY_\1', line) print(line, end='') print('\n\n#endif') ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2119856 libxkbcommon-0.10.0/scripts/makekeys0000755000175000017500000000304700000000000017071 0ustar00ranran00000000000000#!/usr/bin/env python import re, sys, itertools pattern = re.compile(r'^#define\s+XKB_KEY_(?P\w+)\s+(?P0x[0-9a-fA-F]+)\s') matches = [pattern.match(line) for line in open(sys.argv[1])] entries = [(m.group("name"), int(m.group("value"), 16)) for m in matches if m] print(''' /** * 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 */ ''') entry_offsets = {} print(''' #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Woverlength-strings" #endif static const char *keysym_names = '''.strip()) offs = 0 for (name, _) in sorted(entries, key=lambda e: e[0].lower()): entry_offsets[name] = offs print(' "{name}\\0"'.format(name=name)) offs += len(name) + 1 print(''' ; #ifdef __GNUC__ #pragma GCC diagnostic pop #endif '''.strip()) print(''' struct name_keysym { xkb_keysym_t keysym; uint32_t offset; };\n''') def print_entries(x): for (name, value) in x: print(' {{ 0x{value:08x}, {offs} }}, /* {name} */'.format(offs=entry_offsets[name], value=value, name=name)) print('static const struct name_keysym name_to_keysym[] = {') print_entries(sorted(entries, key=lambda e: e[0].lower())) print('};\n') # *.sort() is stable so we always get the first keysym for duplicate print('static const struct name_keysym keysym_to_name[] = {') print_entries(next(g[1]) for g in itertools.groupby(sorted(entries, key=lambda e: e[1]), key=lambda e: e[1])) print('};') ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2186522 libxkbcommon-0.10.0/scripts/meson-junit-report.py0000644000175000017500000000622400000000000021465 0ustar00ranran00000000000000#!/usr/bin/env python3 import argparse import json import sys import unicodedata import xml.etree.ElementTree as ET from datetime import datetime aparser = argparse.ArgumentParser( description='Convert Meson test log into JUnit report') aparser.add_argument('--project-name', metavar='NAME', help='The project name', default='unknown') aparser.add_argument('--job-id', metavar='ID', help='The job ID for the report', default='Unknown') aparser.add_argument('--branch', metavar='NAME', help='Branch of the project being tested', default='master') aparser.add_argument('--output', metavar='FILE', help='The output file, stdout by default', type=argparse.FileType('w', encoding='UTF-8'), default=sys.stdout) aparser.add_argument('infile', metavar='FILE', help='The input testlog.json, stdin by default', type=argparse.FileType('r', encoding='UTF-8'), default=sys.stdin) args = aparser.parse_args() outfile = args.output testsuites = ET.Element('testsuites') testsuites.set('id', '{}/{}'.format(args.job_id, args.branch)) testsuites.set('package', args.project_name) testsuites.set('timestamp', datetime.utcnow().isoformat(timespec='minutes')) testsuite = ET.SubElement(testsuites, 'testsuite') testsuite.set('name', args.project_name) successes = 0 failures = 0 skips = 0 def escape_control_chars(text): return "".join(c if unicodedata.category(c)[0] != "C" else "<{:02x}>".format(ord(c)) for c in text) for line in args.infile: unit = json.loads(line) testcase = ET.SubElement(testsuite, 'testcase') testcase.set('classname', '{}/{}'.format(args.project_name, unit['name'])) testcase.set('name', unit['name']) testcase.set('time', str(unit['duration'])) stdout = escape_control_chars(unit.get('stdout', '')) stderr = escape_control_chars(unit.get('stderr', '')) if stdout: ET.SubElement(testcase, 'system-out').text = stdout if stderr: ET.SubElement(testcase, 'system-out').text = stderr result = unit['result'].lower() if result == 'skip': skips += 1 ET.SubElement(testcase, 'skipped') elif result == 'fail': failures += 1 failure = ET.SubElement(testcase, 'failure') failure.set('message', "{} failed".format(unit['name'])) failure.text = "### stdout\n{}\n### stderr\n{}\n".format(stdout, stderr) else: successes += 1 assert unit['returncode'] == 0 testsuite.set('tests', str(successes + failures + skips)) testsuite.set('skipped', str(skips)) testsuite.set('errors', str(failures)) testsuite.set('failures', str(failures)) print('{}: {} pass, {} fail, {} skip'.format(args.project_name, successes, failures, skips)) output = ET.tostring(testsuites, encoding='unicode') outfile.write(output) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2319856 libxkbcommon-0.10.0/scripts/update-keysyms0000755000175000017500000000042100000000000020235 0ustar00ranran00000000000000#!/bin/sh # Run this to regenerate xkbcommon-keysyms.h from the X11 headers # defining the keysyms and update the name <-> keysym mapping. export LC_CTYPE=C scripts/makeheader > xkbcommon/xkbcommon-keysyms.h scripts/makekeys xkbcommon/xkbcommon-keysyms.h > src/ks_tables.h ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.248652 libxkbcommon-0.10.0/scripts/update-keywords0000755000175000017500000000026600000000000020407 0ustar00ranran00000000000000#!/bin/sh # Run this if you add/remove a new keyword to the xkbcomp scanner, # or just want to regenerate the gperf file. gperf < src/xkbcomp/keywords.gperf > src/xkbcomp/keywords.c ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4886494 libxkbcommon-0.10.0/src/0000755000175000017500000000000000000000000014426 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2586517 libxkbcommon-0.10.0/src/atom.c0000644000175000017500000001545000000000000015537 0ustar00ranran00000000000000/*********************************************************** * 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 "config.h" #include "utils.h" #include "atom.h" /* FNV-1a (http://www.isthe.com/chongo/tech/comp/fnv/). */ static inline uint32_t hash_buf(const char *string, size_t len) { uint32_t hash = 2166136261u; for (size_t i = 0; i < (len + 1) / 2; i++) { hash ^= (uint8_t) string[i]; hash *= 0x01000193; hash ^= (uint8_t) string[len - 1 - i]; hash *= 0x01000193; } return hash; } /* * The atom table is a insert-only unbalanced binary search tree * mapping strings to atoms. * * The tree nodes are kept contiguously in the `table` array. * * The atom value is the index of the tree node in the array. * * As an optimization, strings are not compared by value directly, * s1 < s2 * instead, they are compared by fingerprint (hash) and the value * is only used to resolve collisions: * (fingerprint(s1), s1) < (fingerprint(s2), s2) * Fingerprint are pre-calculated and saved in the tree nodes. * * Why is this not just a hash table? Who knows! */ struct atom_node { xkb_atom_t left, right; uint32_t fingerprint; char *string; }; struct atom_table { xkb_atom_t root; darray(struct atom_node) table; }; struct atom_table * atom_table_new(void) { struct atom_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) { if (!table) return; struct atom_node *node; 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) { assert(atom < darray_size(table->table)); return darray_item(table->table, atom).string; } xkb_atom_t atom_intern(struct atom_table *table, const char *string, size_t len, bool add) { uint32_t fingerprint = hash_buf(string, len); xkb_atom_t *atomp = &table->root; while (*atomp != XKB_ATOM_NONE) { struct atom_node *node = &darray_item(table->table, *atomp); if (fingerprint > node->fingerprint) { atomp = &node->right; } else if (fingerprint < node->fingerprint) { atomp = &node->left; } else { /* Now start testing the strings. */ const int cmp = strncmp(string, node->string, len); if (likely(cmp == 0 && node->string[len] == '\0')) { return *atomp; } else if (cmp > 0) { atomp = &node->right; } else { atomp = &node->left; } } } if (!add) return XKB_ATOM_NONE; struct atom_node node; node.string = strndup(string, len); assert(node.string != NULL); node.left = node.right = XKB_ATOM_NONE; node.fingerprint = fingerprint; xkb_atom_t atom = darray_size(table->table); /* Do this before the append, as it may realloc and change the offsets. */ *atomp = atom; darray_append(table->table, node); return atom; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2686517 libxkbcommon-0.10.0/src/atom.h0000644000175000017500000000277400000000000015551 0ustar00ranran00000000000000/* * 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_intern(struct atom_table *table, const char *string, size_t len, bool add); const char * atom_text(struct atom_table *table, xkb_atom_t atom); #endif /* ATOM_H */ ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.3086512 libxkbcommon-0.10.0/src/compose/0000755000175000017500000000000000000000000016073 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2753184 libxkbcommon-0.10.0/src/compose/parser.c0000644000175000017500000005374100000000000017545 0ustar00ranran00000000000000/* * 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. */ /****************************************************************** 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 "config.h" #include #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 ::= "#" {} * 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//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, "rb"); 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; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2753184 libxkbcommon-0.10.0/src/compose/parser.h0000644000175000017500000000266200000000000017546 0ustar00ranran00000000000000/* * Copyright © 2013 Ran Benita * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef 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 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2819848 libxkbcommon-0.10.0/src/compose/paths.c0000644000175000017500000001253300000000000017362 0ustar00ranran00000000000000/* * Copyright © 2014 Ran Benita * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "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, "rb"); 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; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2919848 libxkbcommon-0.10.0/src/compose/paths.h0000644000175000017500000000266200000000000017371 0ustar00ranran00000000000000/* * Copyright © 2014 Ran Benita * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef 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 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.2986515 libxkbcommon-0.10.0/src/compose/state.c0000644000175000017500000001322200000000000017357 0ustar00ranran00000000000000/* * 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 "config.h" #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 (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; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.3086512 libxkbcommon-0.10.0/src/compose/table.c0000644000175000017500000001403600000000000017332 0ustar00ranran00000000000000/* * 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 "config.h" #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, "rb"); if (file) goto found_path; } cpath = path = get_home_xcompose_file_path(); if (path) { file = fopen(path, "rb"); if (file) goto found_path; } free(path); path = NULL; cpath = path = get_locale_compose_file_path(table->locale); if (path) { file = fopen(path, "rb"); 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; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.3086512 libxkbcommon-0.10.0/src/compose/table.h0000644000175000017500000000660700000000000017344 0ustar00ranran00000000000000/* * Copyright © 2013 Ran Benita * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef 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: * * : "first" dead_a * : "second" dead_b * : "third" dead_c * * the trie would look like: * * [root] ---> [] -----------------> [] -# * | | | * # v v * [] ---> [] -# [] -# * | | - * # v # * [] -# * | * # * where: * - [root] is a special empty root node. * - [] is a node for a sequence keysym . * - right arrows are `next` pointers. * - down arrows are `successor` pointers. * - # 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 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.3086512 libxkbcommon-0.10.0/src/context-priv.c0000644000175000017500000001201200000000000017230 0ustar00ranran00000000000000/* * 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 */ #include "config.h" #include #include #include #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_intern(ctx->atom_table, string, strlen(string), false); } xkb_atom_t xkb_atom_intern(struct xkb_context *ctx, const char *string, size_t len) { return atom_intern(ctx->atom_table, string, len, 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); } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.3086512 libxkbcommon-0.10.0/src/context.c0000644000175000017500000002150700000000000016263 0ustar00ranran00000000000000/* * 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 */ #include "config.h" #include #include #include #ifdef _MSC_VER # include # include # ifndef S_ISDIR # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) # endif #else # include #endif #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; } const char * xkb_context_include_path_get_system_path(struct xkb_context *ctx) { const char *root = secure_getenv("XKB_CONFIG_ROOT"); return root ? root : DFLT_XKB_CONFIG_ROOT; } /** * Append the default include directories to the context. */ XKB_EXPORT int xkb_context_include_path_append_default(struct xkb_context *ctx) { const char *home, *xdg, *root; char *user_path; int err; int ret = 0; home = secure_getenv("HOME"); xdg = secure_getenv("XDG_CONFIG_HOME"); if (xdg != NULL) { err = asprintf(&user_path, "%s/xkb", xdg); if (err >= 0) { ret |= xkb_context_include_path_append(ctx, user_path); free(user_path); } } else if (home != NULL) { /* XDG_CONFIG_HOME fallback is $HOME/.config/ */ err = asprintf(&user_path, "%s/.config/xkb", home); if (err >= 0) { ret |= xkb_context_include_path_append(ctx, user_path); free(user_path); } } if (home != NULL) { err = asprintf(&user_path, "%s/.xkb", home); if (err >= 0) { ret |= xkb_context_include_path_append(ctx, user_path); free(user_path); } } root = xkb_context_include_path_get_system_path(ctx); ret |= xkb_context_include_path_append(ctx, root); 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; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.3219845 libxkbcommon-0.10.0/src/context.h0000644000175000017500000001037100000000000016265 0ustar00ranran00000000000000/* * Copyright © 2012 Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * * Author: Daniel Stone */ #ifndef 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); const char * xkb_context_include_path_get_system_path(struct xkb_context *ctx); /* * 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 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.3253179 libxkbcommon-0.10.0/src/darray.h0000644000175000017500000001520300000000000016062 0ustar00ranran00000000000000/* * Copyright (C) 2011 Joseph Adams * * 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 #include #include #include #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 */ ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.3353176 libxkbcommon-0.10.0/src/keymap-priv.c0000644000175000017500000001050400000000000017036 0ustar00ranran00000000000000/** * 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 */ #include "config.h" #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; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.3519843 libxkbcommon-0.10.0/src/keymap.c0000644000175000017500000003434700000000000016073 0ustar00ranran00000000000000/** * 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 */ /************************************************************ * 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 "config.h" #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; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.3586507 libxkbcommon-0.10.0/src/keymap.h0000644000175000017500000003471000000000000016072 0ustar00ranran00000000000000/* * 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 * Dan Nicholson */ #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 ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.371984 libxkbcommon-0.10.0/src/keysym-utf.c0000644000175000017500000021537400000000000016723 0ustar00ranran00000000000000/* 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 , * University of Cambridge, April 2001 * * Special thanks to Richard Verhoeven for preparing * an initial draft of the mapping table. * * This software is in the public domain. Share and enjoy! * */ #include "config.h" #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 */ 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); } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.3819838 libxkbcommon-0.10.0/src/keysym.c0000644000175000017500000007274700000000000016134 0ustar00ranran00000000000000/* * 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 "config.h" #include #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 && istrncmp(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; else if (code == 0x00df) /* ssharp */ *upper = 0x1e9e; 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; else if (code == 0x1e9e) *lower = 0x00df; /* ssharp */ } /* 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; } } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.395317 libxkbcommon-0.10.0/src/keysym.h0000644000175000017500000000531000000000000016117 0ustar00ranran00000000000000/* * 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 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4119835 libxkbcommon-0.10.0/src/ks_tables.h0000644000175000017500000077324300000000000016566 0ustar00ranran00000000000000 /** * 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 */ #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Woverlength-strings" #endif 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" "XF86MonBrightnessCycle\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" "XF86RotationLockToggle\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" ; #ifdef __GNUC__ #pragma GCC diagnostic pop #endif 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 */ { 0x1008ff07, 27895 }, /* XF86MonBrightnessCycle */ { 0x1008ff03, 27918 }, /* XF86MonBrightnessDown */ { 0x1008ff02, 27940 }, /* XF86MonBrightnessUp */ { 0x1008ff92, 27960 }, /* XF86Music */ { 0x1008ff33, 27970 }, /* XF86MyComputer */ { 0x1008ff67, 27985 }, /* XF86MySites */ { 0x1008ff68, 27997 }, /* XF86New */ { 0x1008ff69, 28005 }, /* XF86News */ { 0x1008fe22, 28014 }, /* XF86Next_VMode */ { 0x1008ff6a, 28029 }, /* XF86OfficeHome */ { 0x1008ff6b, 28044 }, /* XF86Open */ { 0x1008ff38, 28053 }, /* XF86OpenURL */ { 0x1008ff6c, 28065 }, /* XF86Option */ { 0x1008ff6d, 28076 }, /* XF86Paste */ { 0x1008ff6e, 28086 }, /* XF86Phone */ { 0x1008ff91, 28096 }, /* XF86Pictures */ { 0x1008ff21, 28109 }, /* XF86PowerDown */ { 0x1008ff2a, 28123 }, /* XF86PowerOff */ { 0x1008fe23, 28136 }, /* XF86Prev_VMode */ { 0x1008ff70, 28151 }, /* XF86Q */ { 0x1008ffa3, 28157 }, /* XF86Red */ { 0x1008ff29, 28165 }, /* XF86Refresh */ { 0x1008ff73, 28177 }, /* XF86Reload */ { 0x1008ff72, 28188 }, /* XF86Reply */ { 0x1008ffb5, 28198 }, /* XF86RFKill */ { 0x1008ff24, 28209 }, /* XF86RockerDown */ { 0x1008ff25, 28224 }, /* XF86RockerEnter */ { 0x1008ff23, 28240 }, /* XF86RockerUp */ { 0x1008ff74, 28253 }, /* XF86RotateWindows */ { 0x1008ff76, 28271 }, /* XF86RotationKB */ { 0x1008ffb7, 28286 }, /* XF86RotationLockToggle */ { 0x1008ff75, 28309 }, /* XF86RotationPB */ { 0x1008ff77, 28324 }, /* XF86Save */ { 0x1008ff2d, 28333 }, /* XF86ScreenSaver */ { 0x1008ff7a, 28349 }, /* XF86ScrollClick */ { 0x1008ff79, 28365 }, /* XF86ScrollDown */ { 0x1008ff78, 28380 }, /* XF86ScrollUp */ { 0x1008ff1b, 28393 }, /* XF86Search */ { 0x1008ffa0, 28404 }, /* XF86Select */ { 0x1008ff7b, 28415 }, /* XF86Send */ { 0x1008ff36, 28424 }, /* XF86Shop */ { 0x1008ff2f, 28433 }, /* XF86Sleep */ { 0x1008ff7c, 28443 }, /* XF86Spell */ { 0x1008ff7d, 28453 }, /* XF86SplitScreen */ { 0x1008ff10, 28469 }, /* XF86Standby */ { 0x1008ff1a, 28481 }, /* XF86Start */ { 0x1008ff28, 28491 }, /* XF86Stop */ { 0x1008ff9a, 28500 }, /* XF86Subtitle */ { 0x1008ff7e, 28513 }, /* XF86Support */ { 0x1008ffa7, 28525 }, /* XF86Suspend */ { 0x1008fe01, 28537 }, /* XF86Switch_VT_1 */ { 0x1008fe0a, 28553 }, /* XF86Switch_VT_10 */ { 0x1008fe0b, 28570 }, /* XF86Switch_VT_11 */ { 0x1008fe0c, 28587 }, /* XF86Switch_VT_12 */ { 0x1008fe02, 28604 }, /* XF86Switch_VT_2 */ { 0x1008fe03, 28620 }, /* XF86Switch_VT_3 */ { 0x1008fe04, 28636 }, /* XF86Switch_VT_4 */ { 0x1008fe05, 28652 }, /* XF86Switch_VT_5 */ { 0x1008fe06, 28668 }, /* XF86Switch_VT_6 */ { 0x1008fe07, 28684 }, /* XF86Switch_VT_7 */ { 0x1008fe08, 28700 }, /* XF86Switch_VT_8 */ { 0x1008fe09, 28716 }, /* XF86Switch_VT_9 */ { 0x1008ff7f, 28732 }, /* XF86TaskPane */ { 0x1008ff80, 28745 }, /* XF86Terminal */ { 0x1008ff9f, 28758 }, /* XF86Time */ { 0x1008ff1f, 28767 }, /* XF86ToDoList */ { 0x1008ff81, 28780 }, /* XF86Tools */ { 0x1008ffa2, 28790 }, /* XF86TopMenu */ { 0x1008ffb1, 28802 }, /* XF86TouchpadOff */ { 0x1008ffb0, 28818 }, /* XF86TouchpadOn */ { 0x1008ffa9, 28833 }, /* XF86TouchpadToggle */ { 0x1008ff82, 28852 }, /* XF86Travel */ { 0x1008fe20, 28863 }, /* XF86Ungrab */ { 0x1008ff85, 28874 }, /* XF86User1KB */ { 0x1008ff86, 28886 }, /* XF86User2KB */ { 0x1008ff84, 28898 }, /* XF86UserPB */ { 0x1008ff96, 28909 }, /* XF86UWB */ { 0x1008ff34, 28917 }, /* XF86VendorHome */ { 0x1008ff87, 28932 }, /* XF86Video */ { 0x1008ffa1, 28942 }, /* XF86View */ { 0x1008ff2b, 28951 }, /* XF86WakeUp */ { 0x1008ff8f, 28962 }, /* XF86WebCam */ { 0x1008ff88, 28973 }, /* XF86WheelButton */ { 0x1008ff95, 28989 }, /* XF86WLAN */ { 0x1008ff89, 28998 }, /* XF86Word */ { 0x1008ffb4, 29007 }, /* XF86WWAN */ { 0x1008ff2e, 29016 }, /* XF86WWW */ { 0x1008ff8a, 29024 }, /* XF86Xfer */ { 0x1008ffa5, 29033 }, /* XF86Yellow */ { 0x1008ff8b, 29044 }, /* XF86ZoomIn */ { 0x1008ff8c, 29055 }, /* XF86ZoomOut */ { 0x00000059, 29067 }, /* Y */ { 0x00000079, 29069 }, /* y */ { 0x000000dd, 29071 }, /* Yacute */ { 0x000000fd, 29078 }, /* yacute */ { 0x01001ef4, 29085 }, /* Ybelowdot */ { 0x01001ef5, 29095 }, /* ybelowdot */ { 0x01000176, 29105 }, /* Ycircumflex */ { 0x01000177, 29117 }, /* ycircumflex */ { 0x000000ff, 29129 }, /* ydiaeresis */ { 0x000013be, 29140 }, /* Ydiaeresis */ { 0x000000a5, 29151 }, /* yen */ { 0x01001ef2, 29155 }, /* Ygrave */ { 0x01001ef3, 29162 }, /* ygrave */ { 0x01001ef6, 29169 }, /* Yhook */ { 0x01001ef7, 29175 }, /* yhook */ { 0x01001ef8, 29181 }, /* Ytilde */ { 0x01001ef9, 29188 }, /* ytilde */ { 0x0000005a, 29195 }, /* Z */ { 0x0000007a, 29197 }, /* z */ { 0x000001af, 29199 }, /* Zabovedot */ { 0x000001bf, 29209 }, /* zabovedot */ { 0x000001ac, 29219 }, /* Zacute */ { 0x000001bc, 29226 }, /* zacute */ { 0x000001ae, 29233 }, /* Zcaron */ { 0x000001be, 29240 }, /* zcaron */ { 0x0000ff3d, 29247 }, /* Zen_Koho */ { 0x0000ff28, 29256 }, /* Zenkaku */ { 0x0000ff2a, 29264 }, /* Zenkaku_Hankaku */ { 0x01002080, 29280 }, /* zerosubscript */ { 0x01002070, 29294 }, /* zerosuperior */ { 0x010001b5, 29307 }, /* Zstroke */ { 0x010001b6, 29315 }, /* 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, 29067 }, /* Y */ { 0x0000005a, 29195 }, /* 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, 29069 }, /* y */ { 0x0000007a, 29197 }, /* 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, 29151 }, /* 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, 29071 }, /* 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, 29078 }, /* yacute */ { 0x000000fe, 25511 }, /* thorn */ { 0x000000ff, 29129 }, /* 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, 29219 }, /* Zacute */ { 0x000001ae, 29233 }, /* Zcaron */ { 0x000001af, 29199 }, /* 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, 29226 }, /* zacute */ { 0x000001bd, 11283 }, /* doubleacute */ { 0x000001be, 29240 }, /* zcaron */ { 0x000001bf, 29209 }, /* 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, 29140 }, /* 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, 29256 }, /* Zenkaku */ { 0x0000ff29, 16048 }, /* Hankaku */ { 0x0000ff2a, 29264 }, /* 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, 29105 }, /* Ycircumflex */ { 0x01000177, 29117 }, /* ycircumflex */ { 0x0100018f, 22649 }, /* SCHWA */ { 0x0100019f, 20218 }, /* Obarred */ { 0x010001a0, 20553 }, /* Ohorn */ { 0x010001a1, 20559 }, /* ohorn */ { 0x010001af, 25997 }, /* Uhorn */ { 0x010001b0, 26003 }, /* uhorn */ { 0x010001b5, 29307 }, /* Zstroke */ { 0x010001b6, 29315 }, /* 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, 29155 }, /* Ygrave */ { 0x01001ef3, 29162 }, /* ygrave */ { 0x01001ef4, 29085 }, /* Ybelowdot */ { 0x01001ef5, 29095 }, /* ybelowdot */ { 0x01001ef6, 29169 }, /* Yhook */ { 0x01001ef7, 29175 }, /* yhook */ { 0x01001ef8, 29181 }, /* Ytilde */ { 0x01001ef9, 29188 }, /* ytilde */ { 0x01002070, 29294 }, /* zerosuperior */ { 0x01002074, 12632 }, /* foursuperior */ { 0x01002075, 12594 }, /* fivesuperior */ { 0x01002076, 23756 }, /* sixsuperior */ { 0x01002077, 22932 }, /* sevensuperior */ { 0x01002078, 11765 }, /* eightsuperior */ { 0x01002079, 20062 }, /* ninesuperior */ { 0x01002080, 29280 }, /* 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, 28537 }, /* XF86Switch_VT_1 */ { 0x1008fe02, 28604 }, /* XF86Switch_VT_2 */ { 0x1008fe03, 28620 }, /* XF86Switch_VT_3 */ { 0x1008fe04, 28636 }, /* XF86Switch_VT_4 */ { 0x1008fe05, 28652 }, /* XF86Switch_VT_5 */ { 0x1008fe06, 28668 }, /* XF86Switch_VT_6 */ { 0x1008fe07, 28684 }, /* XF86Switch_VT_7 */ { 0x1008fe08, 28700 }, /* XF86Switch_VT_8 */ { 0x1008fe09, 28716 }, /* XF86Switch_VT_9 */ { 0x1008fe0a, 28553 }, /* XF86Switch_VT_10 */ { 0x1008fe0b, 28570 }, /* XF86Switch_VT_11 */ { 0x1008fe0c, 28587 }, /* XF86Switch_VT_12 */ { 0x1008fe20, 28863 }, /* XF86Ungrab */ { 0x1008fe21, 27151 }, /* XF86ClearGrab */ { 0x1008fe22, 28014 }, /* XF86Next_VMode */ { 0x1008fe23, 28136 }, /* XF86Prev_VMode */ { 0x1008fe24, 27771 }, /* XF86LogWindowTree */ { 0x1008fe25, 27744 }, /* XF86LogGrabInfo */ { 0x1008ff01, 27882 }, /* XF86ModeLock */ { 0x1008ff02, 27940 }, /* XF86MonBrightnessUp */ { 0x1008ff03, 27918 }, /* XF86MonBrightnessDown */ { 0x1008ff04, 27507 }, /* XF86KbdLightOnOff */ { 0x1008ff05, 27487 }, /* XF86KbdBrightnessUp */ { 0x1008ff06, 27465 }, /* XF86KbdBrightnessDown */ { 0x1008ff07, 27895 }, /* XF86MonBrightnessCycle */ { 0x1008ff10, 28469 }, /* 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, 28481 }, /* XF86Start */ { 0x1008ff1b, 28393 }, /* XF86Search */ { 0x1008ff1c, 26930 }, /* XF86AudioRecord */ { 0x1008ff1d, 27106 }, /* XF86Calculator */ { 0x1008ff1e, 27837 }, /* XF86Memo */ { 0x1008ff1f, 28767 }, /* XF86ToDoList */ { 0x1008ff20, 27121 }, /* XF86Calendar */ { 0x1008ff21, 28109 }, /* XF86PowerDown */ { 0x1008ff22, 27189 }, /* XF86ContrastAdjust */ { 0x1008ff23, 28240 }, /* XF86RockerUp */ { 0x1008ff24, 28209 }, /* XF86RockerDown */ { 0x1008ff25, 28224 }, /* XF86RockerEnter */ { 0x1008ff26, 27001 }, /* XF86Back */ { 0x1008ff27, 27333 }, /* XF86Forward */ { 0x1008ff28, 28491 }, /* XF86Stop */ { 0x1008ff29, 28165 }, /* XF86Refresh */ { 0x1008ff2a, 28123 }, /* XF86PowerOff */ { 0x1008ff2b, 28951 }, /* XF86WakeUp */ { 0x1008ff2c, 27274 }, /* XF86Eject */ { 0x1008ff2d, 28333 }, /* XF86ScreenSaver */ { 0x1008ff2e, 29016 }, /* XF86WWW */ { 0x1008ff2f, 28433 }, /* XF86Sleep */ { 0x1008ff30, 27307 }, /* XF86Favorites */ { 0x1008ff31, 26830 }, /* XF86AudioPause */ { 0x1008ff32, 26770 }, /* XF86AudioMedia */ { 0x1008ff33, 27970 }, /* XF86MyComputer */ { 0x1008ff34, 28917 }, /* XF86VendorHome */ { 0x1008ff35, 27730 }, /* XF86LightBulb */ { 0x1008ff36, 28424 }, /* XF86Shop */ { 0x1008ff37, 27416 }, /* XF86History */ { 0x1008ff38, 28053 }, /* 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, 27985 }, /* XF86MySites */ { 0x1008ff68, 27997 }, /* XF86New */ { 0x1008ff69, 28005 }, /* XF86News */ { 0x1008ff6a, 28029 }, /* XF86OfficeHome */ { 0x1008ff6b, 28044 }, /* XF86Open */ { 0x1008ff6c, 28065 }, /* XF86Option */ { 0x1008ff6d, 28076 }, /* XF86Paste */ { 0x1008ff6e, 28086 }, /* XF86Phone */ { 0x1008ff70, 28151 }, /* XF86Q */ { 0x1008ff72, 28188 }, /* XF86Reply */ { 0x1008ff73, 28177 }, /* XF86Reload */ { 0x1008ff74, 28253 }, /* XF86RotateWindows */ { 0x1008ff75, 28309 }, /* XF86RotationPB */ { 0x1008ff76, 28271 }, /* XF86RotationKB */ { 0x1008ff77, 28324 }, /* XF86Save */ { 0x1008ff78, 28380 }, /* XF86ScrollUp */ { 0x1008ff79, 28365 }, /* XF86ScrollDown */ { 0x1008ff7a, 28349 }, /* XF86ScrollClick */ { 0x1008ff7b, 28415 }, /* XF86Send */ { 0x1008ff7c, 28443 }, /* XF86Spell */ { 0x1008ff7d, 28453 }, /* XF86SplitScreen */ { 0x1008ff7e, 28513 }, /* XF86Support */ { 0x1008ff7f, 28732 }, /* XF86TaskPane */ { 0x1008ff80, 28745 }, /* XF86Terminal */ { 0x1008ff81, 28780 }, /* XF86Tools */ { 0x1008ff82, 28852 }, /* XF86Travel */ { 0x1008ff84, 28898 }, /* XF86UserPB */ { 0x1008ff85, 28874 }, /* XF86User1KB */ { 0x1008ff86, 28886 }, /* XF86User2KB */ { 0x1008ff87, 28932 }, /* XF86Video */ { 0x1008ff88, 28973 }, /* XF86WheelButton */ { 0x1008ff89, 28998 }, /* XF86Word */ { 0x1008ff8a, 29024 }, /* XF86Xfer */ { 0x1008ff8b, 29044 }, /* XF86ZoomIn */ { 0x1008ff8c, 29055 }, /* XF86ZoomOut */ { 0x1008ff8d, 26992 }, /* XF86Away */ { 0x1008ff8e, 27868 }, /* XF86Messenger */ { 0x1008ff8f, 28962 }, /* XF86WebCam */ { 0x1008ff90, 27798 }, /* XF86MailForward */ { 0x1008ff91, 28096 }, /* XF86Pictures */ { 0x1008ff92, 27960 }, /* XF86Music */ { 0x1008ff93, 27026 }, /* XF86Battery */ { 0x1008ff94, 27047 }, /* XF86Bluetooth */ { 0x1008ff95, 28989 }, /* XF86WLAN */ { 0x1008ff96, 28909 }, /* XF86UWB */ { 0x1008ff97, 26732 }, /* XF86AudioForward */ { 0x1008ff98, 26946 }, /* XF86AudioRepeat */ { 0x1008ff99, 26910 }, /* XF86AudioRandomPlay */ { 0x1008ff9a, 28500 }, /* XF86Subtitle */ { 0x1008ff9b, 26712 }, /* XF86AudioCycleTrack */ { 0x1008ff9c, 27225 }, /* XF86CycleAngle */ { 0x1008ff9d, 27345 }, /* XF86FrameBack */ { 0x1008ff9e, 27359 }, /* XF86FrameForward */ { 0x1008ff9f, 28758 }, /* XF86Time */ { 0x1008ffa0, 28404 }, /* XF86Select */ { 0x1008ffa1, 28942 }, /* XF86View */ { 0x1008ffa2, 28790 }, /* XF86TopMenu */ { 0x1008ffa3, 28157 }, /* XF86Red */ { 0x1008ffa4, 27392 }, /* XF86Green */ { 0x1008ffa5, 29033 }, /* XF86Yellow */ { 0x1008ffa6, 27038 }, /* XF86Blue */ { 0x1008ffa7, 28525 }, /* XF86Suspend */ { 0x1008ffa8, 27402 }, /* XF86Hibernate */ { 0x1008ffa9, 28833 }, /* XF86TouchpadToggle */ { 0x1008ffb0, 28818 }, /* XF86TouchpadOn */ { 0x1008ffb1, 28802 }, /* XF86TouchpadOff */ { 0x1008ffb2, 26785 }, /* XF86AudioMicMute */ { 0x1008ffb3, 27525 }, /* XF86Keyboard */ { 0x1008ffb4, 29007 }, /* XF86WWAN */ { 0x1008ffb5, 28198 }, /* XF86RFKill */ { 0x1008ffb6, 26859 }, /* XF86AudioPreset */ { 0x1008ffb7, 28286 }, /* XF86RotationLockToggle */ }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4219835 libxkbcommon-0.10.0/src/scanner-utils.h0000644000175000017500000001173600000000000017376 0ustar00ranran00000000000000/* * 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. */ #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; size_t line, column; /* The line/column of the start of the current token. */ size_t 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:%zu:%zu: " 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 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4319832 libxkbcommon-0.10.0/src/state.c0000644000175000017500000013017300000000000015717 0ustar00ranran00000000000000/************************************************************ * 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 * * 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 */ /* * 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 "config.h" #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 || one_bit_set(entry->mods.mask)) 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); } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4319832 libxkbcommon-0.10.0/src/text.c0000644000175000017500000002271600000000000015566 0ustar00ranran00000000000000/************************************************************ * 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 "config.h" #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); } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4419832 libxkbcommon-0.10.0/src/text.h0000644000175000017500000000502100000000000015561 0ustar00ranran00000000000000/* * 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 */ ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4419832 libxkbcommon-0.10.0/src/utf8.c0000644000175000017500000000747000000000000015470 0ustar00ranran00000000000000/* * Copyright © 2012 Intel Corporation * Copyright © 2014 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: Rob Bradford */ #include "config.h" #include #include #include #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; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4419832 libxkbcommon-0.10.0/src/utf8.h0000644000175000017500000000261000000000000015464 0ustar00ranran00000000000000/* * Copyright © 2012 Intel Corporation * Copyright © 2014 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: Rob Bradford */ #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 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4419832 libxkbcommon-0.10.0/src/utils.c0000644000175000017500000001276400000000000015744 0ustar00ranran00000000000000/* * 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 "config.h" #include "utils.h" #ifdef HAVE_MMAP #include #include #include #include #include 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; } #if !(defined(HAVE_ASPRINTF) && HAVE_ASPRINTF) int asprintf(char **strp, const char *fmt, ...) { int ret; va_list ap; va_start(ap, fmt); ret = vasprintf(strp, fmt, ap); va_end(ap); return ret; } # if !(defined(HAVE_VASPRINTF) && HAVE_VASPRINTF) int vasprintf(char **strp, const char *fmt, va_list ap) { int ret; char *buf; va_list ap_copy; /* * The value of the va_list parameter is undefined after the call to * vsnprintf() returns: pass a copy to make sure "ap" remains valid. */ va_copy(ap_copy, ap); ret = vsnprintf(NULL, 0, fmt, ap_copy); va_end(ap_copy); if (ret < 0) return ret; if (!(buf = malloc(ret + 1))) return -1; if ((ret = vsnprintf(buf, ret + 1, fmt, ap)) < 0) { free(buf); return ret; } *strp = buf; return ret; } # endif /* !HAVE_VASPRINTF */ #endif /* !HAVE_ASPRINTF */ ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4586496 libxkbcommon-0.10.0/src/utils.h0000644000175000017500000001411000000000000015734 0ustar00ranran00000000000000/* * 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. */ #ifndef UTILS_H #define UTILS_H 1 #include #include #include #include #include #include "darray.h" #define STATIC_ASSERT(expr, message) do { \ switch (0) { case 0: case (expr): ; } \ } while (0) #define ARRAY_SIZE(arr) ((sizeof(arr) / sizeof(*(arr)))) #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) /* Round up @a so it's divisible by @b. */ #define ROUNDUP(a, b) (((a) + (b) - 1) / (b) * (b)) 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; } #if !(defined(HAVE_STRNDUP) && HAVE_STRNDUP) static inline char * strndup(const char *s, size_t n) { size_t slen = strlen(s); size_t len = MIN(slen, n); char *p = malloc(len + 1); if (!p) return NULL; memcpy(p, s, len); p[len] = '\0'; return p; } #endif /* 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; } static inline int one_bit_set(uint32_t x) { return x && (x & (x - 1)) == 0; } bool map_file(FILE *file, char **string_out, size_t *size_out); void unmap_file(char *string, size_t size); #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 #if !(defined(HAVE_ASPRINTF) && HAVE_ASPRINTF) int asprintf(char **strp, const char *fmt, ...) ATTR_PRINTF(2, 3); # if !(defined(HAVE_VASPRINTF) && HAVE_VASPRINTF) # include int vasprintf(char **strp, const char *fmt, va_list ap); # endif /* !HAVE_VASPRINTF */ #endif /* !HAVE_ASPRINTF */ #endif /* UTILS_H */ ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4886494 libxkbcommon-0.10.0/src/x11/0000755000175000017500000000000000000000000015037 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4653163 libxkbcommon-0.10.0/src/x11/keymap.c0000644000175000017500000012203100000000000016470 0ustar00ranran00000000000000/* * 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 "config.h" #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: * /src/xkb/XKBGetMap.c (and friends) * X server XKB protocol handling: * /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->lockptrbtn.button; if (wire->lockptrbtn.flags & XCB_XKB_SA_ISO_LOCK_FLAG_NO_LOCK) action->btn.flags |= ACTION_LOCK_NO_LOCK; if (wire->lockptrbtn.flags & XCB_XKB_SA_ISO_LOCK_FLAG_NO_UNLOCK) action->btn.flags |= ACTION_LOCK_NO_UNLOCK; break; case XCB_XKB_SA_TYPE_SET_PTR_DFLT: action->type = ACTION_TYPE_PTR_DEFAULT; action->dflt.value = wire->setptrdflt.value; if (wire->setptrdflt.flags & XCB_XKB_SA_SET_PTR_DFLT_FLAG_DFLT_BTN_ABSOLUTE) action->dflt.flags |= ACTION_ABSOLUTE_SWITCH; break; case XCB_XKB_SA_TYPE_TERMINATE: action->type = ACTION_TYPE_TERMINATE; break; case XCB_XKB_SA_TYPE_SWITCH_SCREEN: action->type = ACTION_TYPE_SWITCH_VT; action->screen.screen = wire->switchscreen.newScreen; if (!(wire->switchscreen.flags & XCB_XKB_SWITCH_SCREEN_FLAG_APPLICATION)) action->screen.flags |= ACTION_SAME_SCREEN; if (wire->switchscreen.flags & XCB_XKB_SWITCH_SCREEN_FLAG_ABSOLUTE) action->screen.flags |= ACTION_ABSOLUTE_SWITCH; break; case XCB_XKB_SA_TYPE_SET_CONTROLS: action->type = ACTION_TYPE_CTRL_SET; { const uint16_t mask = (wire->setcontrols.boolCtrlsLow | (wire->setcontrols.boolCtrlsHigh << 8)); action->ctrls.ctrls = translate_controls_mask(mask); } break; case XCB_XKB_SA_TYPE_LOCK_CONTROLS: action->type = ACTION_TYPE_CTRL_LOCK; { const uint16_t mask = (wire->lockcontrols.boolCtrlsLow | (wire->lockcontrols.boolCtrlsHigh << 8)); action->ctrls.ctrls = translate_controls_mask(mask); } break; case XCB_XKB_SA_TYPE_NO_ACTION: /* We don't support these. */ case XCB_XKB_SA_TYPE_ISO_LOCK: case XCB_XKB_SA_TYPE_REDIRECT_KEY: case XCB_XKB_SA_TYPE_ACTION_MESSAGE: case XCB_XKB_SA_TYPE_DEVICE_BTN: case XCB_XKB_SA_TYPE_LOCK_DEVICE_BTN: case XCB_XKB_SA_TYPE_DEVICE_VALUATOR: action->type = ACTION_TYPE_NONE; break; default: if (wire->type < ACTION_TYPE_PRIVATE) { action->type = ACTION_TYPE_NONE; break; } /* Treat high unknown actions as Private actions. */ action->priv.type = wire->noaction.type; STATIC_ASSERT(sizeof(action->priv.data) == 7 && sizeof(wire->noaction.pad0) == 7, "The private action data must be 7 bytes long!"); memcpy(action->priv.data, wire->noaction.pad0, 7); break; } } static bool get_types(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_map_reply_t *reply, xcb_xkb_get_map_map_t *map) { int types_length = xcb_xkb_get_map_map_types_rtrn_length(reply, map); xcb_xkb_key_type_iterator_t types_iter = xcb_xkb_get_map_map_types_rtrn_iterator(reply, map); FAIL_UNLESS(reply->firstType == 0); keymap->num_types = reply->nTypes; ALLOC_OR_FAIL(keymap->types, keymap->num_types); for (int i = 0; i < types_length; i++) { xcb_xkb_key_type_t *wire_type = types_iter.data; struct xkb_key_type *type = &keymap->types[i]; FAIL_UNLESS(wire_type->numLevels > 0); type->mods.mods = translate_mods(wire_type->mods_mods, wire_type->mods_vmods, 0); type->mods.mask = translate_mods(wire_type->mods_mask, 0, 0); type->num_levels = wire_type->numLevels; { int entries_length = xcb_xkb_key_type_map_length(wire_type); xcb_xkb_kt_map_entry_iterator_t entries_iter = xcb_xkb_key_type_map_iterator(wire_type); type->num_entries = wire_type->nMapEntries; ALLOC_OR_FAIL(type->entries, type->num_entries); for (int j = 0; j < entries_length; j++) { xcb_xkb_kt_map_entry_t *wire_entry = entries_iter.data; struct xkb_key_type_entry *entry = &type->entries[j]; FAIL_UNLESS(wire_entry->level < type->num_levels); entry->level = wire_entry->level; entry->mods.mods = translate_mods(wire_entry->mods_mods, wire_entry->mods_vmods, 0); entry->mods.mask = translate_mods(wire_entry->mods_mask, 0, 0); xcb_xkb_kt_map_entry_next(&entries_iter); } } { int preserves_length = xcb_xkb_key_type_preserve_length(wire_type); xcb_xkb_mod_def_iterator_t preserves_iter = xcb_xkb_key_type_preserve_iterator(wire_type); FAIL_UNLESS((unsigned) preserves_length <= type->num_entries); for (int j = 0; j < preserves_length; j++) { xcb_xkb_mod_def_t *wire_preserve = preserves_iter.data; struct xkb_key_type_entry *entry = &type->entries[j]; entry->preserve.mods = translate_mods(wire_preserve->realMods, wire_preserve->vmods, 0); entry->preserve.mask = translate_mods(wire_preserve->mask, 0, 0); xcb_xkb_mod_def_next(&preserves_iter); } } xcb_xkb_key_type_next(&types_iter); } return true; fail: return false; } static bool get_sym_maps(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_map_reply_t *reply, xcb_xkb_get_map_map_t *map) { int sym_maps_length = xcb_xkb_get_map_map_syms_rtrn_length(reply, map); xcb_xkb_key_sym_map_iterator_t sym_maps_iter = xcb_xkb_get_map_map_syms_rtrn_iterator(reply, map); FAIL_UNLESS(reply->minKeyCode <= reply->maxKeyCode); FAIL_UNLESS(reply->firstKeySym >= reply->minKeyCode); FAIL_UNLESS(reply->firstKeySym + reply->nKeySyms <= reply->maxKeyCode + 1); keymap->min_key_code = reply->minKeyCode; keymap->max_key_code = reply->maxKeyCode; ALLOC_OR_FAIL(keymap->keys, keymap->max_key_code + 1); for (xkb_keycode_t kc = keymap->min_key_code; kc <= keymap->max_key_code; kc++) keymap->keys[kc].keycode = kc; for (int i = 0; i < sym_maps_length; i++) { xcb_xkb_key_sym_map_t *wire_sym_map = sym_maps_iter.data; struct xkb_key *key = &keymap->keys[reply->firstKeySym + i]; key->num_groups = wire_sym_map->groupInfo & 0x0f; FAIL_UNLESS(key->num_groups <= ARRAY_SIZE(wire_sym_map->kt_index)); ALLOC_OR_FAIL(key->groups, key->num_groups); for (unsigned j = 0; j < key->num_groups; j++) { FAIL_UNLESS(wire_sym_map->kt_index[j] < keymap->num_types); key->groups[j].type = &keymap->types[wire_sym_map->kt_index[j]]; ALLOC_OR_FAIL(key->groups[j].levels, key->groups[j].type->num_levels); } key->out_of_range_group_number = (wire_sym_map->groupInfo & 0x30) >> 4; FAIL_UNLESS(key->out_of_range_group_number <= key->num_groups); if (wire_sym_map->groupInfo & XCB_XKB_GROUPS_WRAP_CLAMP_INTO_RANGE) key->out_of_range_group_action = RANGE_SATURATE; else if (wire_sym_map->groupInfo & XCB_XKB_GROUPS_WRAP_REDIRECT_INTO_RANGE) key->out_of_range_group_action = RANGE_REDIRECT; else key->out_of_range_group_action = RANGE_WRAP; { int syms_length = xcb_xkb_key_sym_map_syms_length(wire_sym_map); xcb_keysym_t *syms_iter = xcb_xkb_key_sym_map_syms(wire_sym_map); FAIL_UNLESS((unsigned) syms_length == wire_sym_map->width * key->num_groups); for (int j = 0; j < syms_length; j++) { xcb_keysym_t wire_keysym = *syms_iter; const xkb_layout_index_t group = j / wire_sym_map->width; const xkb_level_index_t level = j % wire_sym_map->width; assert(key->groups[group].type != NULL); if (level < key->groups[group].type->num_levels && wire_keysym != XKB_KEY_NoSymbol) { key->groups[group].levels[level].num_syms = 1; key->groups[group].levels[level].u.sym = wire_keysym; } syms_iter++; } } xcb_xkb_key_sym_map_next(&sym_maps_iter); } return true; fail: return false; } static bool get_actions(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_map_reply_t *reply, xcb_xkb_get_map_map_t *map) { int acts_count_length = xcb_xkb_get_map_map_acts_rtrn_count_length(reply, map); uint8_t *acts_count_iter = xcb_xkb_get_map_map_acts_rtrn_count(map); xcb_xkb_action_iterator_t acts_iter = xcb_xkb_get_map_map_acts_rtrn_acts_iterator(reply, map); xcb_xkb_key_sym_map_iterator_t sym_maps_iter = xcb_xkb_get_map_map_syms_rtrn_iterator(reply, map); FAIL_UNLESS(reply->firstKeyAction == keymap->min_key_code); FAIL_UNLESS(reply->firstKeyAction + reply->nKeyActions == keymap->max_key_code + 1); for (int i = 0; i < acts_count_length; i++) { xcb_xkb_key_sym_map_t *wire_sym_map = sym_maps_iter.data; int syms_length = xcb_xkb_key_sym_map_syms_length(wire_sym_map); uint8_t wire_count = *acts_count_iter; struct xkb_key *key = &keymap->keys[reply->firstKeyAction + i]; FAIL_UNLESS(wire_count == 0 || wire_count == syms_length); for (int j = 0; j < wire_count; j++) { xcb_xkb_action_t *wire_action = acts_iter.data; const xkb_layout_index_t group = j / wire_sym_map->width; const xkb_level_index_t level = j % wire_sym_map->width; if (level < key->groups[group].type->num_levels) { union xkb_action *action = &key->groups[group].levels[level].action; translate_action(action, wire_action); } xcb_xkb_action_next(&acts_iter); } acts_count_iter++; xcb_xkb_key_sym_map_next(&sym_maps_iter); } return true; fail: return false; } static bool get_vmods(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_map_reply_t *reply, xcb_xkb_get_map_map_t *map) { uint8_t *iter = xcb_xkb_get_map_map_vmods_rtrn(map); keymap->mods.num_mods = NUM_REAL_MODS + MIN(msb_pos(reply->virtualMods), NUM_VMODS); for (unsigned i = 0; i < NUM_VMODS; i++) { if (reply->virtualMods & (1u << i)) { uint8_t wire = *iter; struct xkb_mod *mod = &keymap->mods.mods[NUM_REAL_MODS + i]; mod->type = MOD_VIRT; mod->mapping = translate_mods(wire, 0, 0); iter++; } } return true; } static bool get_explicits(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_map_reply_t *reply, xcb_xkb_get_map_map_t *map) { int length = xcb_xkb_get_map_map_explicit_rtrn_length(reply, map); xcb_xkb_set_explicit_iterator_t iter = xcb_xkb_get_map_map_explicit_rtrn_iterator(reply, map); for (int i = 0; i < length; i++) { xcb_xkb_set_explicit_t *wire = iter.data; struct xkb_key *key; FAIL_UNLESS(wire->keycode >= keymap->min_key_code && wire->keycode <= keymap->max_key_code); key = &keymap->keys[wire->keycode]; if ((wire->explicit & XCB_XKB_EXPLICIT_KEY_TYPE_1) && key->num_groups > 0) key->groups[0].explicit_type = true; if ((wire->explicit & XCB_XKB_EXPLICIT_KEY_TYPE_2) && key->num_groups > 1) key->groups[1].explicit_type = true; if ((wire->explicit & XCB_XKB_EXPLICIT_KEY_TYPE_3) && key->num_groups > 2) key->groups[2].explicit_type = true; if ((wire->explicit & XCB_XKB_EXPLICIT_KEY_TYPE_4) && key->num_groups > 3) key->groups[3].explicit_type = true; if (wire->explicit & XCB_XKB_EXPLICIT_INTERPRET) key->explicit |= EXPLICIT_INTERP; if (wire->explicit & XCB_XKB_EXPLICIT_AUTO_REPEAT) key->explicit |= EXPLICIT_REPEAT; if (wire->explicit & XCB_XKB_EXPLICIT_V_MOD_MAP) key->explicit |= EXPLICIT_VMODMAP; xcb_xkb_set_explicit_next(&iter); } return true; fail: return false; } static bool get_modmaps(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_map_reply_t *reply, xcb_xkb_get_map_map_t *map) { int length = xcb_xkb_get_map_map_modmap_rtrn_length(reply, map); xcb_xkb_key_mod_map_iterator_t iter = xcb_xkb_get_map_map_modmap_rtrn_iterator(reply, map); for (int i = 0; i < length; i++) { xcb_xkb_key_mod_map_t *wire = iter.data; struct xkb_key *key; FAIL_UNLESS(wire->keycode >= keymap->min_key_code && wire->keycode <= keymap->max_key_code); key = &keymap->keys[wire->keycode]; key->modmap = wire->mods; xcb_xkb_key_mod_map_next(&iter); } return true; fail: return false; } static bool get_vmodmaps(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_map_reply_t *reply, xcb_xkb_get_map_map_t *map) { int length = xcb_xkb_get_map_map_vmodmap_rtrn_length(reply, map); xcb_xkb_key_v_mod_map_iterator_t iter = xcb_xkb_get_map_map_vmodmap_rtrn_iterator(reply, map); for (int i = 0; i < length; i++) { xcb_xkb_key_v_mod_map_t *wire = iter.data; struct xkb_key *key; FAIL_UNLESS(wire->keycode >= keymap->min_key_code && wire->keycode <= keymap->max_key_code); key = &keymap->keys[wire->keycode]; key->vmodmap = translate_mods(0, wire->vmods, 0); xcb_xkb_key_v_mod_map_next(&iter); } return true; fail: return false; } static bool get_map(struct xkb_keymap *keymap, xcb_connection_t *conn, uint16_t device_id) { static const xcb_xkb_map_part_t required_components = (XCB_XKB_MAP_PART_KEY_TYPES | XCB_XKB_MAP_PART_KEY_SYMS | XCB_XKB_MAP_PART_MODIFIER_MAP | XCB_XKB_MAP_PART_EXPLICIT_COMPONENTS | XCB_XKB_MAP_PART_KEY_ACTIONS | XCB_XKB_MAP_PART_VIRTUAL_MODS | XCB_XKB_MAP_PART_VIRTUAL_MOD_MAP); xcb_xkb_get_map_cookie_t cookie = xcb_xkb_get_map(conn, device_id, required_components, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); xcb_xkb_get_map_reply_t *reply = xcb_xkb_get_map_reply(conn, cookie, NULL); xcb_xkb_get_map_map_t map; FAIL_IF_BAD_REPLY(reply, "XkbGetMap"); if ((reply->present & required_components) != required_components) goto fail; xcb_xkb_get_map_map_unpack(xcb_xkb_get_map_map(reply), reply->nTypes, reply->nKeySyms, reply->nKeyActions, reply->totalActions, reply->totalKeyBehaviors, reply->virtualMods, reply->totalKeyExplicit, reply->totalModMapKeys, reply->totalVModMapKeys, reply->present, &map); if (!get_types(keymap, conn, reply, &map) || !get_sym_maps(keymap, conn, reply, &map) || !get_actions(keymap, conn, reply, &map) || !get_vmods(keymap, conn, reply, &map) || !get_explicits(keymap, conn, reply, &map) || !get_modmaps(keymap, conn, reply, &map) || !get_vmodmaps(keymap, conn, reply, &map)) goto fail; free(reply); return true; fail: free(reply); return false; } static bool get_indicators(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_indicator_map_reply_t *reply) { xcb_xkb_indicator_map_iterator_t iter = xcb_xkb_get_indicator_map_maps_iterator(reply); keymap->num_leds = msb_pos(reply->which); for (unsigned i = 0; i < NUM_INDICATORS; i++) { if (reply->which & (1u << i)) { xcb_xkb_indicator_map_t *wire = iter.data; struct xkb_led *led = &keymap->leds[i]; if (wire->whichGroups & XCB_XKB_IM_GROUPS_WHICH_USE_BASE) led->which_groups |= XKB_STATE_LAYOUT_DEPRESSED; if (wire->whichGroups & XCB_XKB_IM_GROUPS_WHICH_USE_LATCHED) led->which_groups |= XKB_STATE_LAYOUT_LATCHED; if (wire->whichGroups & XCB_XKB_IM_GROUPS_WHICH_USE_LOCKED) led->which_groups |= XKB_STATE_LAYOUT_LOCKED; if (wire->whichGroups & XCB_XKB_IM_GROUPS_WHICH_USE_EFFECTIVE) led->which_groups |= XKB_STATE_LAYOUT_EFFECTIVE; if (wire->whichGroups & XCB_XKB_IM_GROUPS_WHICH_USE_COMPAT) led->which_groups |= XKB_STATE_LAYOUT_EFFECTIVE; led->groups = wire->groups; if (wire->whichMods & XCB_XKB_IM_MODS_WHICH_USE_BASE) led->which_mods |= XKB_STATE_MODS_DEPRESSED; if (wire->whichMods & XCB_XKB_IM_MODS_WHICH_USE_LATCHED) led->which_mods |= XKB_STATE_MODS_LATCHED; if (wire->whichMods & XCB_XKB_IM_MODS_WHICH_USE_LOCKED) led->which_mods |= XKB_STATE_MODS_LOCKED; if (wire->whichMods & XCB_XKB_IM_MODS_WHICH_USE_EFFECTIVE) led->which_mods |= XKB_STATE_MODS_EFFECTIVE; if (wire->whichMods & XCB_XKB_IM_MODS_WHICH_USE_COMPAT) led->which_mods |= XKB_STATE_MODS_EFFECTIVE; led->mods.mods = translate_mods(wire->realMods, wire->vmods, 0); led->mods.mask = translate_mods(wire->mods, 0, 0); led->ctrls = translate_controls_mask(wire->ctrls); xcb_xkb_indicator_map_next(&iter); } } return true; } static bool get_indicator_map(struct xkb_keymap *keymap, xcb_connection_t *conn, uint16_t device_id) { xcb_xkb_get_indicator_map_cookie_t cookie = xcb_xkb_get_indicator_map(conn, device_id, ALL_INDICATORS_MASK); xcb_xkb_get_indicator_map_reply_t *reply = xcb_xkb_get_indicator_map_reply(conn, cookie, NULL); FAIL_IF_BAD_REPLY(reply, "XkbGetIndicatorMap"); if (!get_indicators(keymap, conn, reply)) goto fail; free(reply); return true; fail: free(reply); return false; } static bool get_sym_interprets(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_compat_map_reply_t *reply) { int length = xcb_xkb_get_compat_map_si_rtrn_length(reply); xcb_xkb_sym_interpret_iterator_t iter = xcb_xkb_get_compat_map_si_rtrn_iterator(reply); FAIL_UNLESS(reply->firstSIRtrn == 0); FAIL_UNLESS(reply->nSIRtrn == reply->nTotalSI); keymap->num_sym_interprets = reply->nSIRtrn; ALLOC_OR_FAIL(keymap->sym_interprets, keymap->num_sym_interprets); for (int i = 0; i < length; i++) { xcb_xkb_sym_interpret_t *wire = iter.data; struct xkb_sym_interpret *sym_interpret = &keymap->sym_interprets[i]; sym_interpret->sym = wire->sym; switch (wire->match & XCB_XKB_SYM_INTERP_MATCH_OP_MASK) { case XCB_XKB_SYM_INTERPRET_MATCH_NONE_OF: sym_interpret->match = MATCH_NONE; break; case XCB_XKB_SYM_INTERPRET_MATCH_ANY_OF_OR_NONE: sym_interpret->match = MATCH_ANY_OR_NONE; break; case XCB_XKB_SYM_INTERPRET_MATCH_ANY_OF: sym_interpret->match = MATCH_ANY; break; case XCB_XKB_SYM_INTERPRET_MATCH_ALL_OF: sym_interpret->match = MATCH_ALL; break; case XCB_XKB_SYM_INTERPRET_MATCH_EXACTLY: sym_interpret->match = MATCH_EXACTLY; break; } sym_interpret->level_one_only = (wire->match & XCB_XKB_SYM_INTERP_MATCH_LEVEL_ONE_ONLY); sym_interpret->mods = wire->mods; if (wire->virtualMod == NO_MODIFIER) sym_interpret->virtual_mod = XKB_MOD_INVALID; else sym_interpret->virtual_mod = NUM_REAL_MODS + wire->virtualMod; sym_interpret->repeat = (wire->flags & 0x01); translate_action(&sym_interpret->action, (xcb_xkb_action_t *) &wire->action); xcb_xkb_sym_interpret_next(&iter); } return true; fail: return false; } static bool get_compat_map(struct xkb_keymap *keymap, xcb_connection_t *conn, uint16_t device_id) { xcb_xkb_get_compat_map_cookie_t cookie = xcb_xkb_get_compat_map(conn, device_id, 0, true, 0, 0); xcb_xkb_get_compat_map_reply_t *reply = xcb_xkb_get_compat_map_reply(conn, cookie, NULL); FAIL_IF_BAD_REPLY(reply, "XkbGetCompatMap"); if (!get_sym_interprets(keymap, conn, reply)) goto fail; free(reply); return true; fail: free(reply); return false; } static bool get_type_names(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_names_reply_t *reply, xcb_xkb_get_names_value_list_t *list) { int key_type_names_length = xcb_xkb_get_names_value_list_type_names_length(reply, list); xcb_atom_t *key_type_names_iter = xcb_xkb_get_names_value_list_type_names(list); int n_levels_per_type_length = xcb_xkb_get_names_value_list_n_levels_per_type_length(reply, list); uint8_t *n_levels_per_type_iter = xcb_xkb_get_names_value_list_n_levels_per_type(list); xcb_atom_t *kt_level_names_iter = xcb_xkb_get_names_value_list_kt_level_names(list); FAIL_UNLESS(reply->nTypes == keymap->num_types); FAIL_UNLESS(key_type_names_length == n_levels_per_type_length); for (int i = 0; i < key_type_names_length; i++) { xcb_atom_t wire_type_name = *key_type_names_iter; uint8_t wire_num_levels = *n_levels_per_type_iter; struct xkb_key_type *type = &keymap->types[i]; /* Levels must have names. */ FAIL_UNLESS(type->num_levels == wire_num_levels); ALLOC_OR_FAIL(type->level_names, type->num_levels); if (!adopt_atom(keymap->ctx, conn, wire_type_name, &type->name)) goto fail; if (!adopt_atoms(keymap->ctx, conn, kt_level_names_iter, type->level_names, wire_num_levels)) goto fail; kt_level_names_iter += wire_num_levels; key_type_names_iter++; n_levels_per_type_iter++; } return true; fail: return false; } static bool get_indicator_names(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_names_reply_t *reply, xcb_xkb_get_names_value_list_t *list) { xcb_atom_t *iter = xcb_xkb_get_names_value_list_indicator_names(list); FAIL_UNLESS(msb_pos(reply->indicators) <= keymap->num_leds); for (unsigned i = 0; i < NUM_INDICATORS; i++) { if (reply->indicators & (1u << i)) { xcb_atom_t wire = *iter; struct xkb_led *led = &keymap->leds[i]; if (!adopt_atom(keymap->ctx, conn, wire, &led->name)) return false; iter++; } } return true; fail: return false; } static bool get_vmod_names(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_names_reply_t *reply, xcb_xkb_get_names_value_list_t *list) { xcb_atom_t *iter = xcb_xkb_get_names_value_list_virtual_mod_names(list); /* * GetMap's reply->virtualMods is always 0xffff. This one really * tells us which vmods exist (a vmod must have a name), so we fix * up the size here. */ keymap->mods.num_mods = NUM_REAL_MODS + MIN(msb_pos(reply->virtualMods), NUM_VMODS); for (unsigned i = 0; i < NUM_VMODS; i++) { if (reply->virtualMods & (1u << i)) { xcb_atom_t wire = *iter; struct xkb_mod *mod = &keymap->mods.mods[NUM_REAL_MODS + i]; if (!adopt_atom(keymap->ctx, conn, wire, &mod->name)) return false; iter++; } } return true; } static bool get_group_names(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_names_reply_t *reply, xcb_xkb_get_names_value_list_t *list) { int length = xcb_xkb_get_names_value_list_groups_length(reply, list); xcb_atom_t *iter = xcb_xkb_get_names_value_list_groups(list); keymap->num_group_names = msb_pos(reply->groupNames); ALLOC_OR_FAIL(keymap->group_names, keymap->num_group_names); if (!adopt_atoms(keymap->ctx, conn, iter, keymap->group_names, length)) goto fail; return true; fail: return false; } static bool get_key_names(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_names_reply_t *reply, xcb_xkb_get_names_value_list_t *list) { int length = xcb_xkb_get_names_value_list_key_names_length(reply, list); xcb_xkb_key_name_iterator_t iter = xcb_xkb_get_names_value_list_key_names_iterator(reply, list); FAIL_UNLESS(reply->minKeyCode == keymap->min_key_code); FAIL_UNLESS(reply->maxKeyCode == keymap->max_key_code); FAIL_UNLESS(reply->firstKey == keymap->min_key_code); FAIL_UNLESS(reply->firstKey + reply->nKeys - 1U == keymap->max_key_code); for (int i = 0; i < length; i++) { xcb_xkb_key_name_t *wire = iter.data; xkb_atom_t *key_name = &keymap->keys[reply->firstKey + i].name; if (wire->name[0] == '\0') { *key_name = XKB_ATOM_NONE; } else { *key_name = xkb_atom_intern(keymap->ctx, wire->name, strnlen(wire->name, XCB_XKB_CONST_KEY_NAME_LENGTH)); if (!*key_name) return false; } xcb_xkb_key_name_next(&iter); } return true; fail: return false; } static bool get_aliases(struct xkb_keymap *keymap, xcb_connection_t *conn, xcb_xkb_get_names_reply_t *reply, xcb_xkb_get_names_value_list_t *list) { int length = xcb_xkb_get_names_value_list_key_aliases_length(reply, list); xcb_xkb_key_alias_iterator_t iter = xcb_xkb_get_names_value_list_key_aliases_iterator(reply, list); keymap->num_key_aliases = reply->nKeyAliases; ALLOC_OR_FAIL(keymap->key_aliases, keymap->num_key_aliases); for (int i = 0; i < length; i++) { xcb_xkb_key_alias_t *wire = iter.data; struct xkb_key_alias *alias = &keymap->key_aliases[i]; alias->real = xkb_atom_intern(keymap->ctx, wire->real, strnlen(wire->real, XCB_XKB_CONST_KEY_NAME_LENGTH)); alias->alias = xkb_atom_intern(keymap->ctx, wire->alias, strnlen(wire->alias, XCB_XKB_CONST_KEY_NAME_LENGTH)); if (!alias->real || !alias->alias) goto fail; xcb_xkb_key_alias_next(&iter); } return true; fail: return false; } static bool get_names(struct xkb_keymap *keymap, xcb_connection_t *conn, uint16_t device_id) { static const xcb_xkb_name_detail_t wanted = (XCB_XKB_NAME_DETAIL_KEYCODES | XCB_XKB_NAME_DETAIL_SYMBOLS | XCB_XKB_NAME_DETAIL_TYPES | XCB_XKB_NAME_DETAIL_COMPAT | XCB_XKB_NAME_DETAIL_KEY_TYPE_NAMES | XCB_XKB_NAME_DETAIL_KT_LEVEL_NAMES | XCB_XKB_NAME_DETAIL_INDICATOR_NAMES | XCB_XKB_NAME_DETAIL_KEY_NAMES | XCB_XKB_NAME_DETAIL_KEY_ALIASES | XCB_XKB_NAME_DETAIL_VIRTUAL_MOD_NAMES | XCB_XKB_NAME_DETAIL_GROUP_NAMES); static const xcb_xkb_name_detail_t required = (XCB_XKB_NAME_DETAIL_KEY_TYPE_NAMES | XCB_XKB_NAME_DETAIL_KT_LEVEL_NAMES | XCB_XKB_NAME_DETAIL_KEY_NAMES | XCB_XKB_NAME_DETAIL_VIRTUAL_MOD_NAMES); xcb_xkb_get_names_cookie_t cookie = xcb_xkb_get_names(conn, device_id, wanted); xcb_xkb_get_names_reply_t *reply = xcb_xkb_get_names_reply(conn, cookie, NULL); xcb_xkb_get_names_value_list_t list; FAIL_IF_BAD_REPLY(reply, "XkbGetNames"); FAIL_UNLESS((reply->which & required) == required); xcb_xkb_get_names_value_list_unpack(xcb_xkb_get_names_value_list(reply), reply->nTypes, reply->indicators, reply->virtualMods, reply->groupNames, reply->nKeys, reply->nKeyAliases, reply->nRadioGroups, reply->which, &list); if (!get_atom_name(conn, list.keycodesName, &keymap->keycodes_section_name) || !get_atom_name(conn, list.symbolsName, &keymap->symbols_section_name) || !get_atom_name(conn, list.typesName, &keymap->types_section_name) || !get_atom_name(conn, list.compatName, &keymap->compat_section_name) || !get_type_names(keymap, conn, reply, &list) || !get_indicator_names(keymap, conn, reply, &list) || !get_vmod_names(keymap, conn, reply, &list) || !get_group_names(keymap, conn, reply, &list) || !get_key_names(keymap, conn, reply, &list) || !get_aliases(keymap, conn, reply, &list)) goto fail; XkbEscapeMapName(keymap->keycodes_section_name); XkbEscapeMapName(keymap->symbols_section_name); XkbEscapeMapName(keymap->types_section_name); XkbEscapeMapName(keymap->compat_section_name); free(reply); return true; fail: free(reply); return false; } static bool get_controls(struct xkb_keymap *keymap, xcb_connection_t *conn, uint16_t device_id) { xcb_xkb_get_controls_cookie_t cookie = xcb_xkb_get_controls(conn, device_id); xcb_xkb_get_controls_reply_t *reply = xcb_xkb_get_controls_reply(conn, cookie, NULL); FAIL_IF_BAD_REPLY(reply, "XkbGetControls"); FAIL_UNLESS(reply->numGroups > 0 && reply->numGroups <= 4); keymap->enabled_ctrls = translate_controls_mask(reply->enabledControls); keymap->num_groups = reply->numGroups; FAIL_UNLESS(keymap->max_key_code < XCB_XKB_CONST_PER_KEY_BIT_ARRAY_SIZE * 8); for (xkb_keycode_t i = keymap->min_key_code; i <= keymap->max_key_code; i++) keymap->keys[i].repeats = (reply->perKeyRepeat[i / 8] & (1 << (i % 8))); free(reply); return true; fail: free(reply); return false; } XKB_EXPORT struct xkb_keymap * xkb_x11_keymap_new_from_device(struct xkb_context *ctx, xcb_connection_t *conn, int32_t device_id, enum xkb_keymap_compile_flags flags) { struct xkb_keymap *keymap; const enum xkb_keymap_format format = XKB_KEYMAP_FORMAT_TEXT_V1; if (flags & ~(XKB_KEYMAP_COMPILE_NO_FLAGS)) { log_err_func(ctx, "unrecognized flags: %#x\n", flags); return NULL; } if (device_id < 0 || device_id > 127) { log_err_func(ctx, "illegal device ID: %d\n", device_id); return NULL; } keymap = xkb_keymap_new(ctx, format, flags); if (!keymap) return NULL; if (!get_map(keymap, conn, device_id) || !get_indicator_map(keymap, conn, device_id) || !get_compat_map(keymap, conn, device_id) || !get_names(keymap, conn, device_id) || !get_controls(keymap, conn, device_id)) { xkb_keymap_unref(keymap); return NULL; } return keymap; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4786494 libxkbcommon-0.10.0/src/x11/state.c0000644000175000017500000000456700000000000016337 0ustar00ranran00000000000000/* * 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 "config.h" #include "x11-priv.h" static bool update_initial_state(struct xkb_state *state, xcb_connection_t *conn, uint16_t device_id) { xcb_xkb_get_state_cookie_t cookie = xcb_xkb_get_state(conn, device_id); xcb_xkb_get_state_reply_t *reply = xcb_xkb_get_state_reply(conn, cookie, NULL); if (!reply) return false; xkb_state_update_mask(state, reply->baseMods, reply->latchedMods, reply->lockedMods, reply->baseGroup, reply->latchedGroup, reply->lockedGroup); free(reply); return true; } XKB_EXPORT struct xkb_state * xkb_x11_state_new_from_device(struct xkb_keymap *keymap, xcb_connection_t *conn, int32_t device_id) { struct xkb_state *state; if (device_id < 0 || device_id > 255) { log_err_func(keymap->ctx, "illegal device ID: %d", device_id); return NULL; } state = xkb_state_new(keymap); if (!state) return NULL; if (!update_initial_state(state, conn, device_id)) { xkb_state_unref(state); return NULL; } return state; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4886494 libxkbcommon-0.10.0/src/x11/util.c0000644000175000017500000001531700000000000016167 0ustar00ranran00000000000000/* * 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 "config.h" #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); } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4886494 libxkbcommon-0.10.0/src/x11/x11-priv.h0000644000175000017500000000376700000000000016614 0ustar00ranran00000000000000/* * Copyright © 2013 Ran Benita * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _XKBCOMMON_X11_PRIV_H #define _XKBCOMMON_X11_PRIV_H #include #include "keymap.h" #include "xkbcommon/xkbcommon-x11.h" /* Get a strdup'd name of an X atom. */ bool get_atom_name(xcb_connection_t *conn, xcb_atom_t atom, char **out); /* * Make a xkb_atom_t's from X atoms (prefer to send as many as possible * at once, to avoid many roundtrips). * * TODO: We can make this more flexible, such that @to doesn't have to * be sequential. Then we can convert most adopt_atom() calls to * adopt_atoms(). * Atom caching would also likely be useful for avoiding quite a * few requests. */ bool adopt_atoms(struct xkb_context *ctx, xcb_connection_t *conn, const xcb_atom_t *from, xkb_atom_t *to, size_t count); bool adopt_atom(struct xkb_context *ctx, xcb_connection_t *conn, xcb_atom_t atom, xkb_atom_t *out); #endif ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6253145 libxkbcommon-0.10.0/src/xkbcomp/0000755000175000017500000000000000000000000016071 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4886494 libxkbcommon-0.10.0/src/xkbcomp/.gitignore0000644000175000017500000000002200000000000020053 0ustar00ranran00000000000000parser.c parser.h ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4986491 libxkbcommon-0.10.0/src/xkbcomp/action.c0000644000175000017500000007231300000000000017520 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ /* * 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 * Ran Benita */ #include "config.h" #include "xkbcomp-priv.h" #include "text.h" #include "expr.h" #include "action.h" static const ExprBoolean constTrue = { .expr = { .common = { .type = STMT_EXPR, .next = NULL }, .op = EXPR_VALUE, .value_type = EXPR_TYPE_BOOLEAN, }, .set = true, }; static const ExprBoolean constFalse = { .expr = { .common = { .type = STMT_EXPR, .next = NULL }, .op = EXPR_VALUE, .value_type = EXPR_TYPE_BOOLEAN, }, .set = false, }; enum action_field { ACTION_FIELD_CLEAR_LOCKS, ACTION_FIELD_LATCH_TO_LOCK, ACTION_FIELD_GEN_KEY_EVENT, ACTION_FIELD_REPORT, ACTION_FIELD_DEFAULT, ACTION_FIELD_AFFECT, ACTION_FIELD_INCREMENT, ACTION_FIELD_MODIFIERS, ACTION_FIELD_GROUP, ACTION_FIELD_X, ACTION_FIELD_Y, ACTION_FIELD_ACCEL, ACTION_FIELD_BUTTON, ACTION_FIELD_VALUE, ACTION_FIELD_CONTROLS, ACTION_FIELD_TYPE, ACTION_FIELD_COUNT, ACTION_FIELD_SCREEN, ACTION_FIELD_SAME, ACTION_FIELD_DATA, ACTION_FIELD_DEVICE, ACTION_FIELD_KEYCODE, ACTION_FIELD_MODS_TO_CLEAR, }; ActionsInfo * NewActionsInfo(void) { enum xkb_action_type type; ActionsInfo *info; info = calloc(1, sizeof(*info)); if (!info) return NULL; for (type = 0; type < _ACTION_TYPE_NUM_ENTRIES; type++) info->actions[type].type = type; /* Apply some "factory defaults". */ /* Increment default button. */ info->actions[ACTION_TYPE_PTR_DEFAULT].dflt.flags = 0; info->actions[ACTION_TYPE_PTR_DEFAULT].dflt.value = 1; info->actions[ACTION_TYPE_PTR_MOVE].ptr.flags = ACTION_ACCEL; info->actions[ACTION_TYPE_SWITCH_VT].screen.flags = ACTION_SAME_SCREEN; return info; } void FreeActionsInfo(ActionsInfo *info) { free(info); } static const LookupEntry fieldStrings[] = { { "clearLocks", ACTION_FIELD_CLEAR_LOCKS }, { "latchToLock", ACTION_FIELD_LATCH_TO_LOCK }, { "genKeyEvent", ACTION_FIELD_GEN_KEY_EVENT }, { "generateKeyEvent", ACTION_FIELD_GEN_KEY_EVENT }, { "report", ACTION_FIELD_REPORT }, { "default", ACTION_FIELD_DEFAULT }, { "affect", ACTION_FIELD_AFFECT }, { "increment", ACTION_FIELD_INCREMENT }, { "modifiers", ACTION_FIELD_MODIFIERS }, { "mods", ACTION_FIELD_MODIFIERS }, { "group", ACTION_FIELD_GROUP }, { "x", ACTION_FIELD_X }, { "y", ACTION_FIELD_Y }, { "accel", ACTION_FIELD_ACCEL }, { "accelerate", ACTION_FIELD_ACCEL }, { "repeat", ACTION_FIELD_ACCEL }, { "button", ACTION_FIELD_BUTTON }, { "value", ACTION_FIELD_VALUE }, { "controls", ACTION_FIELD_CONTROLS }, { "ctrls", ACTION_FIELD_CONTROLS }, { "type", ACTION_FIELD_TYPE }, { "count", ACTION_FIELD_COUNT }, { "screen", ACTION_FIELD_SCREEN }, { "same", ACTION_FIELD_SAME }, { "sameServer", ACTION_FIELD_SAME }, { "data", ACTION_FIELD_DATA }, { "device", ACTION_FIELD_DEVICE }, { "dev", ACTION_FIELD_DEVICE }, { "key", ACTION_FIELD_KEYCODE }, { "keycode", ACTION_FIELD_KEYCODE }, { "kc", ACTION_FIELD_KEYCODE }, { "clearmods", ACTION_FIELD_MODS_TO_CLEAR }, { "clearmodifiers", ACTION_FIELD_MODS_TO_CLEAR }, { NULL, 0 } }; static bool stringToAction(const char *str, enum xkb_action_type *type_rtrn) { return LookupString(actionTypeNames, str, type_rtrn); } static bool stringToField(const char *str, enum action_field *field_rtrn) { return LookupString(fieldStrings, str, field_rtrn); } static const char * fieldText(enum action_field field) { return LookupValue(fieldStrings, field); } /***====================================================================***/ static inline bool ReportMismatch(struct xkb_context *ctx, enum xkb_action_type action, enum action_field field, const char *type) { log_err(ctx, "Value of %s field must be of type %s; " "Action %s definition ignored\n", fieldText(field), type, ActionTypeText(action)); return false; } static inline bool ReportIllegal(struct xkb_context *ctx, enum xkb_action_type action, enum action_field field) { log_err(ctx, "Field %s is not defined for an action of type %s; " "Action definition ignored\n", fieldText(field), ActionTypeText(action)); return false; } static inline bool ReportActionNotArray(struct xkb_context *ctx, enum xkb_action_type action, enum action_field field) { log_err(ctx, "The %s field in the %s action is not an array; " "Action definition ignored\n", fieldText(field), ActionTypeText(action)); return false; } static bool HandleNoAction(struct xkb_context *ctx, const struct xkb_mod_set *mods, union xkb_action *action, enum action_field field, const ExprDef *array_ndx, const ExprDef *value) { return true; } static bool CheckBooleanFlag(struct xkb_context *ctx, enum xkb_action_type action, enum action_field field, enum xkb_action_flags flag, const ExprDef *array_ndx, const ExprDef *value, enum xkb_action_flags *flags_inout) { bool set; if (array_ndx) return ReportActionNotArray(ctx, action, field); if (!ExprResolveBoolean(ctx, value, &set)) return ReportMismatch(ctx, action, field, "boolean"); if (set) *flags_inout |= flag; else *flags_inout &= ~flag; return true; } static bool CheckModifierField(struct xkb_context *ctx, const struct xkb_mod_set *mods, enum xkb_action_type action, const ExprDef *array_ndx, const ExprDef *value, enum xkb_action_flags *flags_inout, xkb_mod_mask_t *mods_rtrn) { if (array_ndx) return ReportActionNotArray(ctx, action, ACTION_FIELD_MODIFIERS); if (value->expr.op == EXPR_IDENT) { const char *valStr; valStr = xkb_atom_text(ctx, value->ident.ident); if (valStr && (istreq(valStr, "usemodmapmods") || istreq(valStr, "modmapmods"))) { *mods_rtrn = 0; *flags_inout |= ACTION_MODS_LOOKUP_MODMAP; return true; } } if (!ExprResolveModMask(ctx, value, MOD_BOTH, mods, mods_rtrn)) return ReportMismatch(ctx, action, ACTION_FIELD_MODIFIERS, "modifier mask"); *flags_inout &= ~ACTION_MODS_LOOKUP_MODMAP; return true; } static const LookupEntry lockWhich[] = { { "both", 0 }, { "lock", ACTION_LOCK_NO_UNLOCK }, { "neither", (ACTION_LOCK_NO_LOCK | ACTION_LOCK_NO_UNLOCK) }, { "unlock", ACTION_LOCK_NO_LOCK }, { NULL, 0 } }; static bool CheckAffectField(struct xkb_context *ctx, enum xkb_action_type action, const ExprDef *array_ndx, const ExprDef *value, enum xkb_action_flags *flags_inout) { enum xkb_action_flags flags; if (array_ndx) return ReportActionNotArray(ctx, action, ACTION_FIELD_AFFECT); if (!ExprResolveEnum(ctx, value, &flags, lockWhich)) return ReportMismatch(ctx, action, ACTION_FIELD_AFFECT, "lock, unlock, both, neither"); *flags_inout &= ~(ACTION_LOCK_NO_LOCK | ACTION_LOCK_NO_UNLOCK); *flags_inout |= flags; return true; } static bool HandleSetLatchLockMods(struct xkb_context *ctx, const struct xkb_mod_set *mods, union xkb_action *action, enum action_field field, const ExprDef *array_ndx, const ExprDef *value) { struct xkb_mod_action *act = &action->mods; const enum xkb_action_type type = action->type; if (field == ACTION_FIELD_MODIFIERS) return CheckModifierField(ctx, mods, action->type, array_ndx, value, &act->flags, &act->mods.mods); if ((type == ACTION_TYPE_MOD_SET || type == ACTION_TYPE_MOD_LATCH) && field == ACTION_FIELD_CLEAR_LOCKS) return CheckBooleanFlag(ctx, action->type, field, ACTION_LOCK_CLEAR, array_ndx, value, &act->flags); if (type == ACTION_TYPE_MOD_LATCH && field == ACTION_FIELD_LATCH_TO_LOCK) return CheckBooleanFlag(ctx, action->type, field, ACTION_LATCH_TO_LOCK, array_ndx, value, &act->flags); if (type == ACTION_TYPE_MOD_LOCK && field == ACTION_FIELD_AFFECT) return CheckAffectField(ctx, action->type, array_ndx, value, &act->flags); return ReportIllegal(ctx, action->type, field); } static bool CheckGroupField(struct xkb_context *ctx, enum xkb_action_type action, const ExprDef *array_ndx, const ExprDef *value, enum xkb_action_flags *flags_inout, int32_t *group_rtrn) { const ExprDef *spec; xkb_layout_index_t idx; enum xkb_action_flags flags = *flags_inout; if (array_ndx) return ReportActionNotArray(ctx, action, ACTION_FIELD_GROUP); if (value->expr.op == EXPR_NEGATE || value->expr.op == EXPR_UNARY_PLUS) { flags &= ~ACTION_ABSOLUTE_SWITCH; spec = value->unary.child; } else { flags |= ACTION_ABSOLUTE_SWITCH; spec = value; } if (!ExprResolveGroup(ctx, spec, &idx)) return ReportMismatch(ctx, action, ACTION_FIELD_GROUP, "integer (range 1..8)"); /* +n, -n are relative, n is absolute. */ if (value->expr.op == EXPR_NEGATE || value->expr.op == EXPR_UNARY_PLUS) { *group_rtrn = (int32_t) idx; if (value->expr.op == EXPR_NEGATE) *group_rtrn = -*group_rtrn; } else { *group_rtrn = (int32_t) (idx - 1); } *flags_inout = flags; return true; } static bool HandleSetLatchLockGroup(struct xkb_context *ctx, const struct xkb_mod_set *mods, union xkb_action *action, enum action_field field, const ExprDef *array_ndx, const ExprDef *value) { struct xkb_group_action *act = &action->group; const enum xkb_action_type type = action->type; if (field == ACTION_FIELD_GROUP) return CheckGroupField(ctx, action->type, array_ndx, value, &act->flags, &act->group); if ((type == ACTION_TYPE_GROUP_SET || type == ACTION_TYPE_GROUP_LATCH) && field == ACTION_FIELD_CLEAR_LOCKS) return CheckBooleanFlag(ctx, action->type, field, ACTION_LOCK_CLEAR, array_ndx, value, &act->flags); if (type == ACTION_TYPE_GROUP_LATCH && field == ACTION_FIELD_LATCH_TO_LOCK) return CheckBooleanFlag(ctx, action->type, field, ACTION_LATCH_TO_LOCK, array_ndx, value, &act->flags); return ReportIllegal(ctx, action->type, field); } static bool HandleMovePtr(struct xkb_context *ctx, const struct xkb_mod_set *mods, union xkb_action *action, enum action_field field, const ExprDef *array_ndx, const ExprDef *value) { struct xkb_pointer_action *act = &action->ptr; if (field == ACTION_FIELD_X || field == ACTION_FIELD_Y) { int val; const bool absolute = (value->expr.op != EXPR_NEGATE && value->expr.op != EXPR_UNARY_PLUS); if (array_ndx) return ReportActionNotArray(ctx, action->type, field); if (!ExprResolveInteger(ctx, value, &val)) return ReportMismatch(ctx, action->type, field, "integer"); if (val < INT16_MIN || val > INT16_MAX) { log_err(ctx, "The %s field in the %s action must be in range %d..%d; " "Action definition ignored\n", fieldText(field), ActionTypeText(action->type), INT16_MIN, INT16_MAX); return false; } if (field == ACTION_FIELD_X) { if (absolute) act->flags |= ACTION_ABSOLUTE_X; act->x = (int16_t) val; } else { if (absolute) act->flags |= ACTION_ABSOLUTE_Y; act->y = (int16_t) val; } return true; } else if (field == ACTION_FIELD_ACCEL) { return CheckBooleanFlag(ctx, action->type, field, ACTION_ACCEL, array_ndx, value, &act->flags); } return ReportIllegal(ctx, action->type, field); } static bool HandlePtrBtn(struct xkb_context *ctx, const struct xkb_mod_set *mods, union xkb_action *action, enum action_field field, const ExprDef *array_ndx, const ExprDef *value) { struct xkb_pointer_button_action *act = &action->btn; if (field == ACTION_FIELD_BUTTON) { int btn; if (array_ndx) return ReportActionNotArray(ctx, action->type, field); if (!ExprResolveButton(ctx, value, &btn)) return ReportMismatch(ctx, action->type, field, "integer (range 1..5)"); if (btn < 0 || btn > 5) { log_err(ctx, "Button must specify default or be in the range 1..5; " "Illegal button value %d ignored\n", btn); return false; } act->button = btn; return true; } else if (action->type == ACTION_TYPE_PTR_LOCK && field == ACTION_FIELD_AFFECT) { return CheckAffectField(ctx, action->type, array_ndx, value, &act->flags); } else if (field == ACTION_FIELD_COUNT) { int val; if (array_ndx) return ReportActionNotArray(ctx, action->type, field); if (!ExprResolveInteger(ctx, value, &val)) return ReportMismatch(ctx, action->type, field, "integer"); if (val < 0 || val > 255) { log_err(ctx, "The count field must have a value in the range 0..255; " "Illegal count %d ignored\n", val); return false; } act->count = (uint8_t) val; return true; } return ReportIllegal(ctx, action->type, field); } static const LookupEntry ptrDflts[] = { { "dfltbtn", 1 }, { "defaultbutton", 1 }, { "button", 1 }, { NULL, 0 } }; static bool HandleSetPtrDflt(struct xkb_context *ctx, const struct xkb_mod_set *mods, union xkb_action *action, enum action_field field, const ExprDef *array_ndx, const ExprDef *value) { struct xkb_pointer_default_action *act = &action->dflt; if (field == ACTION_FIELD_AFFECT) { unsigned int val; if (array_ndx) return ReportActionNotArray(ctx, action->type, field); if (!ExprResolveEnum(ctx, value, &val, ptrDflts)) return ReportMismatch(ctx, action->type, field, "pointer component"); return true; } else if (field == ACTION_FIELD_BUTTON || field == ACTION_FIELD_VALUE) { const ExprDef *button; int btn; if (array_ndx) return ReportActionNotArray(ctx, action->type, field); if (value->expr.op == EXPR_NEGATE || value->expr.op == EXPR_UNARY_PLUS) { act->flags &= ~ACTION_ABSOLUTE_SWITCH; button = value->unary.child; } else { act->flags |= ACTION_ABSOLUTE_SWITCH; button = value; } if (!ExprResolveButton(ctx, button, &btn)) return ReportMismatch(ctx, action->type, field, "integer (range 1..5)"); if (btn < 0 || btn > 5) { log_err(ctx, "New default button value must be in the range 1..5; " "Illegal default button value %d ignored\n", btn); return false; } if (btn == 0) { log_err(ctx, "Cannot set default pointer button to \"default\"; " "Illegal default button setting ignored\n"); return false; } act->value = (value->expr.op == EXPR_NEGATE ? -btn: btn); return true; } return ReportIllegal(ctx, action->type, field); } static bool HandleSwitchScreen(struct xkb_context *ctx, const struct xkb_mod_set *mods, union xkb_action *action, enum action_field field, const ExprDef *array_ndx, const ExprDef *value) { struct xkb_switch_screen_action *act = &action->screen; if (field == ACTION_FIELD_SCREEN) { const ExprDef *scrn; int val; if (array_ndx) return ReportActionNotArray(ctx, action->type, field); if (value->expr.op == EXPR_NEGATE || value->expr.op == EXPR_UNARY_PLUS) { act->flags &= ~ACTION_ABSOLUTE_SWITCH; scrn = value->unary.child; } else { act->flags |= ACTION_ABSOLUTE_SWITCH; scrn = value; } if (!ExprResolveInteger(ctx, scrn, &val)) return ReportMismatch(ctx, action->type, field, "integer (0..255)"); if (val < 0 || val > 255) { log_err(ctx, "Screen index must be in the range 1..255; " "Illegal screen value %d ignored\n", val); return false; } act->screen = (value->expr.op == EXPR_NEGATE ? -val : val); return true; } else if (field == ACTION_FIELD_SAME) { return CheckBooleanFlag(ctx, action->type, field, ACTION_SAME_SCREEN, array_ndx, value, &act->flags); } return ReportIllegal(ctx, action->type, field); } static bool HandleSetLockControls(struct xkb_context *ctx, const struct xkb_mod_set *mods, union xkb_action *action, enum action_field field, const ExprDef *array_ndx, const ExprDef *value) { struct xkb_controls_action *act = &action->ctrls; if (field == ACTION_FIELD_CONTROLS) { enum xkb_action_controls mask; if (array_ndx) return ReportActionNotArray(ctx, action->type, field); if (!ExprResolveMask(ctx, value, &mask, ctrlMaskNames)) return ReportMismatch(ctx, action->type, field, "controls mask"); act->ctrls = mask; return true; } else if (field == ACTION_FIELD_AFFECT) { return CheckAffectField(ctx, action->type, array_ndx, value, &act->flags); } return ReportIllegal(ctx, action->type, field); } static bool HandlePrivate(struct xkb_context *ctx, const struct xkb_mod_set *mods, union xkb_action *action, enum action_field field, const ExprDef *array_ndx, const ExprDef *value) { struct xkb_private_action *act = &action->priv; if (field == ACTION_FIELD_TYPE) { int type; if (array_ndx) return ReportActionNotArray(ctx, action->type, field); if (!ExprResolveInteger(ctx, value, &type)) return ReportMismatch(ctx, ACTION_TYPE_PRIVATE, field, "integer"); if (type < 0 || type > 255) { log_err(ctx, "Private action type must be in the range 0..255; " "Illegal type %d ignored\n", type); return false; } /* * It's possible for someone to write something like this: * actions = [ Private(type=3,data[0]=1,data[1]=3,data[2]=3) ] * where the type refers to some existing action type, e.g. LockMods. * This assumes that this action's struct is laid out in memory * exactly as described in the XKB specification and libraries. * We, however, have changed these structs in various ways, so this * assumption is no longer true. Since this is a lousy "feature", we * make actions like these no-ops for now. */ if (type < ACTION_TYPE_PRIVATE) { log_info(ctx, "Private actions of type %s are not supported; Ignored\n", ActionTypeText(type)); act->type = ACTION_TYPE_NONE; } else { act->type = (enum xkb_action_type) type; } return true; } else if (field == ACTION_FIELD_DATA) { if (array_ndx == NULL) { xkb_atom_t val; const char *str; size_t len; if (!ExprResolveString(ctx, value, &val)) return ReportMismatch(ctx, action->type, field, "string"); str = xkb_atom_text(ctx, val); len = strlen(str); if (len < 1 || len > 7) { log_warn(ctx, "A private action has 7 data bytes; " "Illegal data ignored\n"); return false; } /* act->data may not be null-terminated, this is intentional */ strncpy((char *) act->data, str, sizeof(act->data)); return true; } else { int ndx, datum; if (!ExprResolveInteger(ctx, array_ndx, &ndx)) { log_err(ctx, "Array subscript must be integer; " "Illegal subscript ignored\n"); return false; } if (ndx < 0 || (size_t) ndx >= sizeof(act->data)) { log_err(ctx, "The data for a private action is %lu bytes long; " "Attempt to use data[%d] ignored\n", (unsigned long) sizeof(act->data), ndx); return false; } if (!ExprResolveInteger(ctx, value, &datum)) return ReportMismatch(ctx, act->type, field, "integer"); if (datum < 0 || datum > 255) { log_err(ctx, "All data for a private action must be 0..255; " "Illegal datum %d ignored\n", datum); return false; } act->data[ndx] = (uint8_t) datum; return true; } } return ReportIllegal(ctx, ACTION_TYPE_NONE, field); } typedef bool (*actionHandler)(struct xkb_context *ctx, const struct xkb_mod_set *mods, union xkb_action *action, enum action_field field, const ExprDef *array_ndx, const ExprDef *value); static const actionHandler handleAction[_ACTION_TYPE_NUM_ENTRIES] = { [ACTION_TYPE_NONE] = HandleNoAction, [ACTION_TYPE_MOD_SET] = HandleSetLatchLockMods, [ACTION_TYPE_MOD_LATCH] = HandleSetLatchLockMods, [ACTION_TYPE_MOD_LOCK] = HandleSetLatchLockMods, [ACTION_TYPE_GROUP_SET] = HandleSetLatchLockGroup, [ACTION_TYPE_GROUP_LATCH] = HandleSetLatchLockGroup, [ACTION_TYPE_GROUP_LOCK] = HandleSetLatchLockGroup, [ACTION_TYPE_PTR_MOVE] = HandleMovePtr, [ACTION_TYPE_PTR_BUTTON] = HandlePtrBtn, [ACTION_TYPE_PTR_LOCK] = HandlePtrBtn, [ACTION_TYPE_PTR_DEFAULT] = HandleSetPtrDflt, [ACTION_TYPE_TERMINATE] = HandleNoAction, [ACTION_TYPE_SWITCH_VT] = HandleSwitchScreen, [ACTION_TYPE_CTRL_SET] = HandleSetLockControls, [ACTION_TYPE_CTRL_LOCK] = HandleSetLockControls, [ACTION_TYPE_PRIVATE] = HandlePrivate, }; /***====================================================================***/ bool HandleActionDef(struct xkb_context *ctx, ActionsInfo *info, const struct xkb_mod_set *mods, ExprDef *def, union xkb_action *action) { ExprDef *arg; const char *str; enum xkb_action_type handler_type; if (def->expr.op != EXPR_ACTION_DECL) { log_err(ctx, "Expected an action definition, found %s\n", expr_op_type_to_string(def->expr.op)); return false; } str = xkb_atom_text(ctx, def->action.name); if (!stringToAction(str, &handler_type)) { log_err(ctx, "Unknown action %s\n", str); return false; } /* * Get the default values for this action type, as modified by * statements such as: * latchMods.clearLocks = True; */ *action = info->actions[handler_type]; /* * Now change the action properties as specified for this * particular instance, e.g. "modifiers" and "clearLocks" in: * SetMods(modifiers=Alt,clearLocks); */ for (arg = def->action.args; arg != NULL; arg = (ExprDef *) arg->common.next) { const ExprDef *value; ExprDef *field, *arrayRtrn; const char *elemRtrn, *fieldRtrn; enum action_field fieldNdx; if (arg->expr.op == EXPR_ASSIGN) { field = arg->binary.left; value = arg->binary.right; } else if (arg->expr.op == EXPR_NOT || arg->expr.op == EXPR_INVERT) { field = arg->unary.child; value = (const ExprDef *) &constFalse; } else { field = arg; value = (const ExprDef *) &constTrue; } if (!ExprResolveLhs(ctx, field, &elemRtrn, &fieldRtrn, &arrayRtrn)) return false; if (elemRtrn) { log_err(ctx, "Cannot change defaults in an action definition; " "Ignoring attempt to change %s.%s\n", elemRtrn, fieldRtrn); return false; } if (!stringToField(fieldRtrn, &fieldNdx)) { log_err(ctx, "Unknown field name %s\n", fieldRtrn); return false; } if (!handleAction[handler_type](ctx, mods, action, fieldNdx, arrayRtrn, value)) return false; } return true; } bool SetActionField(struct xkb_context *ctx, ActionsInfo *info, struct xkb_mod_set *mods, const char *elem, const char *field, ExprDef *array_ndx, ExprDef *value) { enum xkb_action_type action; enum action_field action_field; if (!stringToAction(elem, &action)) return false; if (!stringToField(field, &action_field)) { log_err(ctx, "\"%s\" is not a legal field name\n", field); return false; } return handleAction[action](ctx, mods, &info->actions[action], action_field, array_ndx, value); } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.4986491 libxkbcommon-0.10.0/src/xkbcomp/action.h0000644000175000017500000000413600000000000017523 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ #ifndef XKBCOMP_ACTION_H #define XKBCOMP_ACTION_H /* * This struct contains the default values which every new action * (e.g. in an interpret statement) starts off with. It can be * modified within the files (see calls to SetActionField). */ typedef struct { union xkb_action actions[_ACTION_TYPE_NUM_ENTRIES]; } ActionsInfo; ActionsInfo * NewActionsInfo(void); void FreeActionsInfo(ActionsInfo *info); bool HandleActionDef(struct xkb_context *ctx, ActionsInfo *info, const struct xkb_mod_set *mods, ExprDef *def, union xkb_action *action); bool SetActionField(struct xkb_context *ctx, ActionsInfo *info, struct xkb_mod_set *mods, const char *elem, const char *field, ExprDef *array_ndx, ExprDef *value); #endif ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.5019825 libxkbcommon-0.10.0/src/xkbcomp/ast-build.c0000644000175000017500000005106500000000000020130 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ /* * 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 * Ran Benita */ #include "config.h" #include "xkbcomp-priv.h" #include "ast-build.h" #include "include.h" static ExprDef * ExprCreate(enum expr_op_type op, enum expr_value_type type, size_t size) { ExprDef *expr = malloc(size); if (!expr) return NULL; expr->common.type = STMT_EXPR; expr->common.next = NULL; expr->expr.op = op; expr->expr.value_type = type; return expr; } ExprDef * ExprCreateString(xkb_atom_t str) { ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_STRING, sizeof(ExprString)); if (!expr) return NULL; expr->string.str = str; return expr; } ExprDef * ExprCreateInteger(int ival) { ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_INT, sizeof(ExprInteger)); if (!expr) return NULL; expr->integer.ival = ival; return expr; } ExprDef * ExprCreateFloat(void) { ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_FLOAT, sizeof(ExprFloat)); if (!expr) return NULL; return expr; } ExprDef * ExprCreateBoolean(bool set) { ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_BOOLEAN, sizeof(ExprBoolean)); if (!expr) return NULL; expr->boolean.set = set; return expr; } ExprDef * ExprCreateKeyName(xkb_atom_t key_name) { ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_KEYNAME, sizeof(ExprKeyName)); if (!expr) return NULL; expr->key_name.key_name = key_name; return expr; } ExprDef * ExprCreateIdent(xkb_atom_t ident) { ExprDef *expr = ExprCreate(EXPR_IDENT, EXPR_TYPE_UNKNOWN, sizeof(ExprIdent)); if (!expr) return NULL; expr->ident.ident = ident; return expr; } ExprDef * ExprCreateUnary(enum expr_op_type op, enum expr_value_type type, ExprDef *child) { ExprDef *expr = ExprCreate(op, type, sizeof(ExprUnary)); if (!expr) return NULL; expr->unary.child = child; return expr; } ExprDef * ExprCreateBinary(enum expr_op_type op, ExprDef *left, ExprDef *right) { ExprDef *expr = ExprCreate(op, EXPR_TYPE_UNKNOWN, sizeof(ExprBinary)); if (!expr) return NULL; if (op == EXPR_ASSIGN || left->expr.value_type == EXPR_TYPE_UNKNOWN) expr->expr.value_type = right->expr.value_type; else if (left->expr.value_type == right->expr.value_type || right->expr.value_type == EXPR_TYPE_UNKNOWN) expr->expr.value_type = left->expr.value_type; expr->binary.left = left; expr->binary.right = right; return expr; } ExprDef * ExprCreateFieldRef(xkb_atom_t element, xkb_atom_t field) { ExprDef *expr = ExprCreate(EXPR_FIELD_REF, EXPR_TYPE_UNKNOWN, sizeof(ExprFieldRef)); if (!expr) return NULL; expr->field_ref.element = element; expr->field_ref.field = field; return expr; } ExprDef * ExprCreateArrayRef(xkb_atom_t element, xkb_atom_t field, ExprDef *entry) { ExprDef *expr = ExprCreate(EXPR_ARRAY_REF, EXPR_TYPE_UNKNOWN, sizeof(ExprArrayRef)); if (!expr) return NULL; expr->array_ref.element = element; expr->array_ref.field = field; expr->array_ref.entry = entry; return expr; } ExprDef * ExprCreateAction(xkb_atom_t name, ExprDef *args) { ExprDef *expr = ExprCreate(EXPR_ACTION_DECL, EXPR_TYPE_UNKNOWN, sizeof(ExprAction)); if (!expr) return NULL; expr->action.name = name; expr->action.args = args; return expr; } ExprDef * ExprCreateActionList(ExprDef *actions) { ExprDef *expr = ExprCreate(EXPR_ACTION_LIST, EXPR_TYPE_ACTIONS, sizeof(ExprActionList)); if (!expr) return NULL; expr->actions.actions = actions; return expr; } ExprDef * ExprCreateKeysymList(xkb_keysym_t sym) { ExprDef *expr = ExprCreate(EXPR_KEYSYM_LIST, EXPR_TYPE_SYMBOLS, sizeof(ExprKeysymList)); if (!expr) return NULL; darray_init(expr->keysym_list.syms); darray_init(expr->keysym_list.symsMapIndex); darray_init(expr->keysym_list.symsNumEntries); darray_append(expr->keysym_list.syms, sym); darray_append(expr->keysym_list.symsMapIndex, 0); darray_append(expr->keysym_list.symsNumEntries, 1); return expr; } ExprDef * ExprCreateMultiKeysymList(ExprDef *expr) { unsigned nLevels = darray_size(expr->keysym_list.symsMapIndex); darray_resize(expr->keysym_list.symsMapIndex, 1); darray_resize(expr->keysym_list.symsNumEntries, 1); darray_item(expr->keysym_list.symsMapIndex, 0) = 0; darray_item(expr->keysym_list.symsNumEntries, 0) = nLevels; return expr; } ExprDef * ExprAppendKeysymList(ExprDef *expr, xkb_keysym_t sym) { unsigned nSyms = darray_size(expr->keysym_list.syms); darray_append(expr->keysym_list.symsMapIndex, nSyms); darray_append(expr->keysym_list.symsNumEntries, 1); darray_append(expr->keysym_list.syms, sym); return expr; } ExprDef * ExprAppendMultiKeysymList(ExprDef *expr, ExprDef *append) { unsigned nSyms = darray_size(expr->keysym_list.syms); unsigned numEntries = darray_size(append->keysym_list.syms); darray_append(expr->keysym_list.symsMapIndex, nSyms); darray_append(expr->keysym_list.symsNumEntries, numEntries); darray_concat(expr->keysym_list.syms, append->keysym_list.syms); FreeStmt((ParseCommon *) append); return expr; } KeycodeDef * KeycodeCreate(xkb_atom_t name, int64_t value) { KeycodeDef *def = malloc(sizeof(*def)); if (!def) return NULL; def->common.type = STMT_KEYCODE; def->common.next = NULL; def->name = name; def->value = value; return def; } KeyAliasDef * KeyAliasCreate(xkb_atom_t alias, xkb_atom_t real) { KeyAliasDef *def = malloc(sizeof(*def)); if (!def) return NULL; def->common.type = STMT_ALIAS; def->common.next = NULL; def->alias = alias; def->real = real; return def; } VModDef * VModCreate(xkb_atom_t name, ExprDef *value) { VModDef *def = malloc(sizeof(*def)); if (!def) return NULL; def->common.type = STMT_VMOD; def->common.next = NULL; def->name = name; def->value = value; return def; } VarDef * VarCreate(ExprDef *name, ExprDef *value) { VarDef *def = malloc(sizeof(*def)); if (!def) return NULL; def->common.type = STMT_VAR; def->common.next = NULL; def->name = name; def->value = value; return def; } VarDef * BoolVarCreate(xkb_atom_t ident, bool set) { ExprDef *name, *value; VarDef *def; if (!(name = ExprCreateIdent(ident))) { return NULL; } if (!(value = ExprCreateBoolean(set))) { FreeStmt((ParseCommon *) name); return NULL; } if (!(def = VarCreate(name, value))) { FreeStmt((ParseCommon *) name); FreeStmt((ParseCommon *) value); return NULL; } return def; } InterpDef * InterpCreate(xkb_keysym_t sym, ExprDef *match) { InterpDef *def = malloc(sizeof(*def)); if (!def) return NULL; def->common.type = STMT_INTERP; def->common.next = NULL; def->sym = sym; def->match = match; def->def = NULL; return def; } KeyTypeDef * KeyTypeCreate(xkb_atom_t name, VarDef *body) { KeyTypeDef *def = malloc(sizeof(*def)); if (!def) return NULL; def->common.type = STMT_TYPE; def->common.next = NULL; def->merge = MERGE_DEFAULT; def->name = name; def->body = body; return def; } SymbolsDef * SymbolsCreate(xkb_atom_t keyName, VarDef *symbols) { SymbolsDef *def = malloc(sizeof(*def)); if (!def) return NULL; def->common.type = STMT_SYMBOLS; def->common.next = NULL; def->merge = MERGE_DEFAULT; def->keyName = keyName; def->symbols = symbols; return def; } GroupCompatDef * GroupCompatCreate(unsigned group, ExprDef *val) { GroupCompatDef *def = malloc(sizeof(*def)); if (!def) return NULL; def->common.type = STMT_GROUP_COMPAT; def->common.next = NULL; def->merge = MERGE_DEFAULT; def->group = group; def->def = val; return def; } ModMapDef * ModMapCreate(xkb_atom_t modifier, ExprDef *keys) { ModMapDef *def = malloc(sizeof(*def)); if (!def) return NULL; def->common.type = STMT_MODMAP; def->common.next = NULL; def->merge = MERGE_DEFAULT; def->modifier = modifier; def->keys = keys; return def; } LedMapDef * LedMapCreate(xkb_atom_t name, VarDef *body) { LedMapDef *def = malloc(sizeof(*def)); if (!def) return NULL; def->common.type = STMT_LED_MAP; def->common.next = NULL; def->merge = MERGE_DEFAULT; def->name = name; def->body = body; return def; } LedNameDef * LedNameCreate(unsigned ndx, ExprDef *name, bool virtual) { LedNameDef *def = malloc(sizeof(*def)); if (!def) return NULL; def->common.type = STMT_LED_NAME; def->common.next = NULL; def->merge = MERGE_DEFAULT; def->ndx = ndx; def->name = name; def->virtual = virtual; return def; } static void FreeInclude(IncludeStmt *incl); IncludeStmt * IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge) { IncludeStmt *incl, *first; char *file, *map, *stmt, *tmp, *extra_data; char nextop; incl = first = NULL; file = map = NULL; tmp = str; stmt = strdup_safe(str); while (tmp && *tmp) { if (!ParseIncludeMap(&tmp, &file, &map, &nextop, &extra_data)) goto err; /* * Given an RMLVO (here layout) like 'us,,fr', the rules parser * will give out something like 'pc+us+:2+fr:3+inet(evdev)'. * We should just skip the ':2' in this case and leave it to the * appropriate section to deal with the empty group. */ if (isempty(file)) { free(file); free(map); free(extra_data); continue; } if (first == NULL) { first = incl = malloc(sizeof(*first)); } else { incl->next_incl = malloc(sizeof(*first)); incl = incl->next_incl; } if (!incl) break; incl->common.type = STMT_INCLUDE; incl->common.next = NULL; incl->merge = merge; incl->stmt = NULL; incl->file = file; incl->map = map; incl->modifier = extra_data; incl->next_incl = NULL; if (nextop == '|') merge = MERGE_AUGMENT; else merge = MERGE_OVERRIDE; } if (first) first->stmt = stmt; else free(stmt); return first; err: log_err(ctx, "Illegal include statement \"%s\"; Ignored\n", stmt); FreeInclude(first); free(stmt); return NULL; } XkbFile * XkbFileCreate(enum xkb_file_type type, char *name, ParseCommon *defs, enum xkb_map_flags flags) { XkbFile *file; file = calloc(1, sizeof(*file)); if (!file) return NULL; XkbEscapeMapName(name); file->file_type = type; file->name = name ? name : strdup("(unnamed)"); file->defs = defs; file->flags = flags; return file; } XkbFile * XkbFileFromComponents(struct xkb_context *ctx, const struct xkb_component_names *kkctgs) { char *const components[] = { kkctgs->keycodes, kkctgs->types, kkctgs->compat, kkctgs->symbols, }; enum xkb_file_type type; IncludeStmt *include = NULL; XkbFile *file = NULL; ParseCommon *defs = NULL, *defsLast = NULL; for (type = FIRST_KEYMAP_FILE_TYPE; type <= LAST_KEYMAP_FILE_TYPE; type++) { include = IncludeCreate(ctx, components[type], MERGE_DEFAULT); if (!include) goto err; file = XkbFileCreate(type, NULL, (ParseCommon *) include, 0); if (!file) { FreeInclude(include); goto err; } if (!defs) defsLast = defs = &file->common; else defsLast = defsLast->next = &file->common; } file = XkbFileCreate(FILE_TYPE_KEYMAP, NULL, defs, 0); if (!file) goto err; return file; err: FreeXkbFile((XkbFile *) defs); return NULL; } static void FreeExpr(ExprDef *expr) { if (!expr) return; switch (expr->expr.op) { case EXPR_NEGATE: case EXPR_UNARY_PLUS: case EXPR_NOT: case EXPR_INVERT: FreeStmt((ParseCommon *) expr->unary.child); break; case EXPR_DIVIDE: case EXPR_ADD: case EXPR_SUBTRACT: case EXPR_MULTIPLY: case EXPR_ASSIGN: FreeStmt((ParseCommon *) expr->binary.left); FreeStmt((ParseCommon *) expr->binary.right); break; case EXPR_ACTION_DECL: FreeStmt((ParseCommon *) expr->action.args); break; case EXPR_ACTION_LIST: FreeStmt((ParseCommon *) expr->actions.actions); break; case EXPR_ARRAY_REF: FreeStmt((ParseCommon *) expr->array_ref.entry); break; case EXPR_KEYSYM_LIST: darray_free(expr->keysym_list.syms); darray_free(expr->keysym_list.symsMapIndex); darray_free(expr->keysym_list.symsNumEntries); break; default: break; } } static void FreeInclude(IncludeStmt *incl) { IncludeStmt *next; while (incl) { next = incl->next_incl; free(incl->file); free(incl->map); free(incl->modifier); free(incl->stmt); free(incl); incl = next; } } void FreeStmt(ParseCommon *stmt) { ParseCommon *next; while (stmt) { next = stmt->next; switch (stmt->type) { case STMT_INCLUDE: FreeInclude((IncludeStmt *) stmt); /* stmt is already free'd here. */ stmt = NULL; break; case STMT_EXPR: FreeExpr((ExprDef *) stmt); break; case STMT_VAR: FreeStmt((ParseCommon *) ((VarDef *) stmt)->name); FreeStmt((ParseCommon *) ((VarDef *) stmt)->value); break; case STMT_TYPE: FreeStmt((ParseCommon *) ((KeyTypeDef *) stmt)->body); break; case STMT_INTERP: FreeStmt((ParseCommon *) ((InterpDef *) stmt)->match); FreeStmt((ParseCommon *) ((InterpDef *) stmt)->def); break; case STMT_VMOD: FreeStmt((ParseCommon *) ((VModDef *) stmt)->value); break; case STMT_SYMBOLS: FreeStmt((ParseCommon *) ((SymbolsDef *) stmt)->symbols); break; case STMT_MODMAP: FreeStmt((ParseCommon *) ((ModMapDef *) stmt)->keys); break; case STMT_GROUP_COMPAT: FreeStmt((ParseCommon *) ((GroupCompatDef *) stmt)->def); break; case STMT_LED_MAP: FreeStmt((ParseCommon *) ((LedMapDef *) stmt)->body); break; case STMT_LED_NAME: FreeStmt((ParseCommon *) ((LedNameDef *) stmt)->name); break; default: break; } free(stmt); stmt = next; } } void FreeXkbFile(XkbFile *file) { XkbFile *next; while (file) { next = (XkbFile *) file->common.next; switch (file->file_type) { case FILE_TYPE_KEYMAP: FreeXkbFile((XkbFile *) file->defs); break; case FILE_TYPE_TYPES: case FILE_TYPE_COMPAT: case FILE_TYPE_SYMBOLS: case FILE_TYPE_KEYCODES: case FILE_TYPE_GEOMETRY: FreeStmt(file->defs); break; default: break; } free(file->name); free(file); file = next; } } static const char *xkb_file_type_strings[_FILE_TYPE_NUM_ENTRIES] = { [FILE_TYPE_KEYCODES] = "xkb_keycodes", [FILE_TYPE_TYPES] = "xkb_types", [FILE_TYPE_COMPAT] = "xkb_compatibility", [FILE_TYPE_SYMBOLS] = "xkb_symbols", [FILE_TYPE_GEOMETRY] = "xkb_geometry", [FILE_TYPE_KEYMAP] = "xkb_keymap", [FILE_TYPE_RULES] = "rules", }; const char * xkb_file_type_to_string(enum xkb_file_type type) { if (type >= _FILE_TYPE_NUM_ENTRIES) return "unknown"; return xkb_file_type_strings[type]; } static const char *stmt_type_strings[_STMT_NUM_VALUES] = { [STMT_UNKNOWN] = "unknown statement", [STMT_INCLUDE] = "include statement", [STMT_KEYCODE] = "key name definition", [STMT_ALIAS] = "key alias definition", [STMT_EXPR] = "expression", [STMT_VAR] = "variable definition", [STMT_TYPE] = "key type definition", [STMT_INTERP] = "symbol interpretation definition", [STMT_VMOD] = "virtual modifiers definition", [STMT_SYMBOLS] = "key symbols definition", [STMT_MODMAP] = "modifier map declaration", [STMT_GROUP_COMPAT] = "group declaration", [STMT_LED_MAP] = "indicator map declaration", [STMT_LED_NAME] = "indicator name declaration", }; const char * stmt_type_to_string(enum stmt_type type) { if (type >= _STMT_NUM_VALUES) return NULL; return stmt_type_strings[type]; } static const char *expr_op_type_strings[_EXPR_NUM_VALUES] = { [EXPR_VALUE] = "literal", [EXPR_IDENT] = "identifier", [EXPR_ACTION_DECL] = "action declaration", [EXPR_FIELD_REF] = "field reference", [EXPR_ARRAY_REF] = "array reference", [EXPR_KEYSYM_LIST] = "list of keysyms", [EXPR_ACTION_LIST] = "list of actions", [EXPR_ADD] = "addition", [EXPR_SUBTRACT] = "subtraction", [EXPR_MULTIPLY] = "multiplication", [EXPR_DIVIDE] = "division", [EXPR_ASSIGN] = "assignment", [EXPR_NOT] = "logical negation", [EXPR_NEGATE] = "arithmetic negation", [EXPR_INVERT] = "bitwise inversion", [EXPR_UNARY_PLUS] = "unary plus", }; const char * expr_op_type_to_string(enum expr_op_type type) { if (type >= _EXPR_NUM_VALUES) return NULL; return expr_op_type_strings[type]; } static const char *expr_value_type_strings[_EXPR_TYPE_NUM_VALUES] = { [EXPR_TYPE_UNKNOWN] = "unknown", [EXPR_TYPE_BOOLEAN] = "boolean", [EXPR_TYPE_INT] = "int", [EXPR_TYPE_FLOAT] = "float", [EXPR_TYPE_STRING] = "string", [EXPR_TYPE_ACTION] = "action", [EXPR_TYPE_ACTIONS] = "actions", [EXPR_TYPE_KEYNAME] = "keyname", [EXPR_TYPE_SYMBOLS] = "symbols", }; const char * expr_value_type_to_string(enum expr_value_type type) { if (type >= _EXPR_TYPE_NUM_VALUES) return NULL; return expr_value_type_strings[type]; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.5019825 libxkbcommon-0.10.0/src/xkbcomp/ast-build.h0000644000175000017500000000642700000000000020137 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ #ifndef XKBCOMP_AST_BUILD_H #define XKBCOMP_AST_BUILD_H ExprDef * ExprCreateString(xkb_atom_t str); ExprDef * ExprCreateInteger(int ival); ExprDef * ExprCreateFloat(void); ExprDef * ExprCreateBoolean(bool set); ExprDef * ExprCreateKeyName(xkb_atom_t key_name); ExprDef * ExprCreateIdent(xkb_atom_t ident); ExprDef * ExprCreateUnary(enum expr_op_type op, enum expr_value_type type, ExprDef *child); ExprDef * ExprCreateBinary(enum expr_op_type op, ExprDef *left, ExprDef *right); ExprDef * ExprCreateFieldRef(xkb_atom_t element, xkb_atom_t field); ExprDef * ExprCreateArrayRef(xkb_atom_t element, xkb_atom_t field, ExprDef *entry); ExprDef * ExprCreateAction(xkb_atom_t name, ExprDef *args); ExprDef * ExprCreateActionList(ExprDef *actions); ExprDef * ExprCreateMultiKeysymList(ExprDef *list); ExprDef * ExprCreateKeysymList(xkb_keysym_t sym); ExprDef * ExprAppendMultiKeysymList(ExprDef *list, ExprDef *append); ExprDef * ExprAppendKeysymList(ExprDef *list, xkb_keysym_t sym); KeycodeDef * KeycodeCreate(xkb_atom_t name, int64_t value); KeyAliasDef * KeyAliasCreate(xkb_atom_t alias, xkb_atom_t real); VModDef * VModCreate(xkb_atom_t name, ExprDef *value); VarDef * VarCreate(ExprDef *name, ExprDef *value); VarDef * BoolVarCreate(xkb_atom_t ident, bool set); InterpDef * InterpCreate(xkb_keysym_t sym, ExprDef *match); KeyTypeDef * KeyTypeCreate(xkb_atom_t name, VarDef *body); SymbolsDef * SymbolsCreate(xkb_atom_t keyName, VarDef *symbols); GroupCompatDef * GroupCompatCreate(unsigned group, ExprDef *def); ModMapDef * ModMapCreate(xkb_atom_t modifier, ExprDef *keys); LedMapDef * LedMapCreate(xkb_atom_t name, VarDef *body); LedNameDef * LedNameCreate(unsigned ndx, ExprDef *name, bool virtual); IncludeStmt * IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge); XkbFile * XkbFileCreate(enum xkb_file_type type, char *name, ParseCommon *defs, enum xkb_map_flags flags); void FreeStmt(ParseCommon *stmt); #endif ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.5186489 libxkbcommon-0.10.0/src/xkbcomp/ast.h0000644000175000017500000002032600000000000017034 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ /* * 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. */ #ifndef XKBCOMP_AST_H #define XKBCOMP_AST_H enum xkb_file_type { /* Component files, by order of compilation. */ FILE_TYPE_KEYCODES = 0, FILE_TYPE_TYPES = 1, FILE_TYPE_COMPAT = 2, FILE_TYPE_SYMBOLS = 3, /* Geometry is not compiled any more. */ FILE_TYPE_GEOMETRY = 4, /* A top level file which includes the above files. */ FILE_TYPE_KEYMAP, /* File types which must be found in a keymap file. */ #define FIRST_KEYMAP_FILE_TYPE FILE_TYPE_KEYCODES #define LAST_KEYMAP_FILE_TYPE FILE_TYPE_SYMBOLS /* This one doesn't mix with the others, but useful here as well. */ FILE_TYPE_RULES, _FILE_TYPE_NUM_ENTRIES }; enum stmt_type { STMT_UNKNOWN = 0, STMT_INCLUDE, STMT_KEYCODE, STMT_ALIAS, STMT_EXPR, STMT_VAR, STMT_TYPE, STMT_INTERP, STMT_VMOD, STMT_SYMBOLS, STMT_MODMAP, STMT_GROUP_COMPAT, STMT_LED_MAP, STMT_LED_NAME, _STMT_NUM_VALUES }; enum expr_value_type { EXPR_TYPE_UNKNOWN = 0, EXPR_TYPE_BOOLEAN, EXPR_TYPE_INT, EXPR_TYPE_FLOAT, EXPR_TYPE_STRING, EXPR_TYPE_ACTION, EXPR_TYPE_ACTIONS, EXPR_TYPE_KEYNAME, EXPR_TYPE_SYMBOLS, _EXPR_TYPE_NUM_VALUES }; enum expr_op_type { EXPR_VALUE, EXPR_IDENT, EXPR_ACTION_DECL, EXPR_FIELD_REF, EXPR_ARRAY_REF, EXPR_KEYSYM_LIST, EXPR_ACTION_LIST, EXPR_ADD, EXPR_SUBTRACT, EXPR_MULTIPLY, EXPR_DIVIDE, EXPR_ASSIGN, EXPR_NOT, EXPR_NEGATE, EXPR_INVERT, EXPR_UNARY_PLUS, _EXPR_NUM_VALUES }; enum merge_mode { MERGE_DEFAULT, MERGE_AUGMENT, MERGE_OVERRIDE, MERGE_REPLACE, }; const char * xkb_file_type_to_string(enum xkb_file_type type); const char * stmt_type_to_string(enum stmt_type type); const char * expr_op_type_to_string(enum expr_op_type type); const char * expr_value_type_to_string(enum expr_value_type type); typedef struct _ParseCommon { struct _ParseCommon *next; enum stmt_type type; } ParseCommon; typedef struct _IncludeStmt { ParseCommon common; enum merge_mode merge; char *stmt; char *file; char *map; char *modifier; struct _IncludeStmt *next_incl; } IncludeStmt; typedef struct { ParseCommon common; enum expr_op_type op; enum expr_value_type value_type; } ExprCommon; typedef union ExprDef ExprDef; typedef struct { ExprCommon expr; xkb_atom_t ident; } ExprIdent; typedef struct { ExprCommon expr; xkb_atom_t str; } ExprString; typedef struct { ExprCommon expr; bool set; } ExprBoolean; typedef struct { ExprCommon expr; int ival; } ExprInteger; typedef struct { ExprCommon expr; /* We don't support floats, but we still represnt them in the AST, in * order to provide proper error messages. */ } ExprFloat; typedef struct { ExprCommon expr; xkb_atom_t key_name; } ExprKeyName; typedef struct { ExprCommon expr; ExprDef *left; ExprDef *right; } ExprBinary; typedef struct { ExprCommon expr; ExprDef *child; } ExprUnary; typedef struct { ExprCommon expr; xkb_atom_t element; xkb_atom_t field; } ExprFieldRef; typedef struct { ExprCommon expr; xkb_atom_t element; xkb_atom_t field; ExprDef *entry; } ExprArrayRef; typedef struct { ExprCommon expr; xkb_atom_t name; ExprDef *args; } ExprAction; typedef struct { ExprCommon expr; ExprDef *actions; } ExprActionList; typedef struct { ExprCommon expr; darray(xkb_keysym_t) syms; darray(unsigned int) symsMapIndex; darray(unsigned int) symsNumEntries; } ExprKeysymList; union ExprDef { ParseCommon common; /* Maybe someday we can use C11 anonymous struct for ExprCommon here. */ ExprCommon expr; ExprIdent ident; ExprString string; ExprBoolean boolean; ExprInteger integer; ExprKeyName key_name; ExprBinary binary; ExprUnary unary; ExprFieldRef field_ref; ExprArrayRef array_ref; ExprAction action; ExprActionList actions; ExprKeysymList keysym_list; }; typedef struct { ParseCommon common; enum merge_mode merge; ExprDef *name; ExprDef *value; } VarDef; typedef struct { ParseCommon common; enum merge_mode merge; xkb_atom_t name; ExprDef *value; } VModDef; typedef struct { ParseCommon common; enum merge_mode merge; xkb_atom_t name; int64_t value; } KeycodeDef; typedef struct { ParseCommon common; enum merge_mode merge; xkb_atom_t alias; xkb_atom_t real; } KeyAliasDef; typedef struct { ParseCommon common; enum merge_mode merge; xkb_atom_t name; VarDef *body; } KeyTypeDef; typedef struct { ParseCommon common; enum merge_mode merge; xkb_atom_t keyName; VarDef *symbols; } SymbolsDef; typedef struct { ParseCommon common; enum merge_mode merge; xkb_atom_t modifier; ExprDef *keys; } ModMapDef; typedef struct { ParseCommon common; enum merge_mode merge; unsigned group; ExprDef *def; } GroupCompatDef; typedef struct { ParseCommon common; enum merge_mode merge; xkb_keysym_t sym; ExprDef *match; VarDef *def; } InterpDef; typedef struct { ParseCommon common; enum merge_mode merge; unsigned ndx; ExprDef *name; bool virtual; } LedNameDef; typedef struct { ParseCommon common; enum merge_mode merge; xkb_atom_t name; VarDef *body; } LedMapDef; enum xkb_map_flags { MAP_IS_DEFAULT = (1 << 0), MAP_IS_PARTIAL = (1 << 1), MAP_IS_HIDDEN = (1 << 2), MAP_HAS_ALPHANUMERIC = (1 << 3), MAP_HAS_MODIFIER = (1 << 4), MAP_HAS_KEYPAD = (1 << 5), MAP_HAS_FN = (1 << 6), MAP_IS_ALTGR = (1 << 7), }; typedef struct { ParseCommon common; enum xkb_file_type file_type; char *name; ParseCommon *defs; enum xkb_map_flags flags; } XkbFile; #endif ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.5219822 libxkbcommon-0.10.0/src/xkbcomp/compat.c0000644000175000017500000007046300000000000017532 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ /* * 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. */ #include "config.h" #include "xkbcomp-priv.h" #include "text.h" #include "expr.h" #include "action.h" #include "vmod.h" #include "include.h" enum si_field { SI_FIELD_VIRTUAL_MOD = (1 << 0), SI_FIELD_ACTION = (1 << 1), SI_FIELD_AUTO_REPEAT = (1 << 2), SI_FIELD_LEVEL_ONE_ONLY = (1 << 3), }; typedef struct { enum si_field defined; enum merge_mode merge; struct xkb_sym_interpret interp; } SymInterpInfo; enum led_field { LED_FIELD_MODS = (1 << 0), LED_FIELD_GROUPS = (1 << 1), LED_FIELD_CTRLS = (1 << 2), }; typedef struct { enum led_field defined; enum merge_mode merge; struct xkb_led led; } LedInfo; typedef struct { char *name; int errorCount; SymInterpInfo default_interp; darray(SymInterpInfo) interps; LedInfo default_led; LedInfo leds[XKB_MAX_LEDS]; unsigned int num_leds; ActionsInfo *actions; struct xkb_mod_set mods; struct xkb_context *ctx; } CompatInfo; static const char * siText(SymInterpInfo *si, CompatInfo *info) { char *buf = xkb_context_get_buffer(info->ctx, 128); if (si == &info->default_interp) return "default"; snprintf(buf, 128, "%s+%s(%s)", KeysymText(info->ctx, si->interp.sym), SIMatchText(si->interp.match), ModMaskText(info->ctx, &info->mods, si->interp.mods)); return buf; } static inline bool ReportSINotArray(CompatInfo *info, SymInterpInfo *si, const char *field) { return ReportNotArray(info->ctx, "symbol interpretation", field, siText(si, info)); } static inline bool ReportSIBadType(CompatInfo *info, SymInterpInfo *si, const char *field, const char *wanted) { return ReportBadType(info->ctx, "symbol interpretation", field, siText(si, info), wanted); } static inline bool ReportLedBadType(CompatInfo *info, LedInfo *ledi, const char *field, const char *wanted) { return ReportBadType(info->ctx, "indicator map", field, xkb_atom_text(info->ctx, ledi->led.name), wanted); } static inline bool ReportLedNotArray(CompatInfo *info, LedInfo *ledi, const char *field) { return ReportNotArray(info->ctx, "indicator map", field, xkb_atom_text(info->ctx, ledi->led.name)); } static void InitCompatInfo(CompatInfo *info, struct xkb_context *ctx, ActionsInfo *actions, const struct xkb_mod_set *mods) { memset(info, 0, sizeof(*info)); info->ctx = ctx; info->actions = actions; info->mods = *mods; info->default_interp.merge = MERGE_OVERRIDE; info->default_interp.interp.virtual_mod = XKB_MOD_INVALID; info->default_led.merge = MERGE_OVERRIDE; } static void ClearCompatInfo(CompatInfo *info) { free(info->name); darray_free(info->interps); } static SymInterpInfo * FindMatchingInterp(CompatInfo *info, SymInterpInfo *new) { SymInterpInfo *old; darray_foreach(old, info->interps) if (old->interp.sym == new->interp.sym && old->interp.mods == new->interp.mods && old->interp.match == new->interp.match) return old; return NULL; } static bool UseNewInterpField(enum si_field field, SymInterpInfo *old, SymInterpInfo *new, bool report, enum si_field *collide) { if (!(old->defined & field)) return true; if (new->defined & field) { if (report) *collide |= field; if (new->merge != MERGE_AUGMENT) return true; } return false; } static bool AddInterp(CompatInfo *info, SymInterpInfo *new, bool same_file) { SymInterpInfo *old = FindMatchingInterp(info, new); if (old) { const int verbosity = xkb_context_get_log_verbosity(info->ctx); const bool report = (same_file && verbosity > 0) || verbosity > 9; enum si_field collide = 0; if (new->merge == MERGE_REPLACE) { if (report) log_warn(info->ctx, "Multiple definitions for \"%s\"; " "Earlier interpretation ignored\n", siText(new, info)); *old = *new; return true; } if (UseNewInterpField(SI_FIELD_VIRTUAL_MOD, old, new, report, &collide)) { old->interp.virtual_mod = new->interp.virtual_mod; old->defined |= SI_FIELD_VIRTUAL_MOD; } if (UseNewInterpField(SI_FIELD_ACTION, old, new, report, &collide)) { old->interp.action = new->interp.action; old->defined |= SI_FIELD_ACTION; } if (UseNewInterpField(SI_FIELD_AUTO_REPEAT, old, new, report, &collide)) { old->interp.repeat = new->interp.repeat; old->defined |= SI_FIELD_AUTO_REPEAT; } if (UseNewInterpField(SI_FIELD_LEVEL_ONE_ONLY, old, new, report, &collide)) { old->interp.level_one_only = new->interp.level_one_only; old->defined |= SI_FIELD_LEVEL_ONE_ONLY; } if (collide) { log_warn(info->ctx, "Multiple interpretations of \"%s\"; " "Using %s definition for duplicate fields\n", siText(new, info), (new->merge != MERGE_AUGMENT ? "last" : "first")); } return true; } darray_append(info->interps, *new); return true; } /***====================================================================***/ static bool ResolveStateAndPredicate(ExprDef *expr, enum xkb_match_operation *pred_rtrn, xkb_mod_mask_t *mods_rtrn, CompatInfo *info) { if (expr == NULL) { *pred_rtrn = MATCH_ANY_OR_NONE; *mods_rtrn = MOD_REAL_MASK_ALL; return true; } *pred_rtrn = MATCH_EXACTLY; if (expr->expr.op == EXPR_ACTION_DECL) { const char *pred_txt = xkb_atom_text(info->ctx, expr->action.name); if (!LookupString(symInterpretMatchMaskNames, pred_txt, pred_rtrn) || !expr->action.args || expr->action.args->common.next) { log_err(info->ctx, "Illegal modifier predicate \"%s\"; Ignored\n", pred_txt); return false; } expr = expr->action.args; } else if (expr->expr.op == EXPR_IDENT) { const char *pred_txt = xkb_atom_text(info->ctx, expr->ident.ident); if (pred_txt && istreq(pred_txt, "any")) { *pred_rtrn = MATCH_ANY; *mods_rtrn = MOD_REAL_MASK_ALL; return true; } } return ExprResolveModMask(info->ctx, expr, MOD_REAL, &info->mods, mods_rtrn); } /***====================================================================***/ static bool UseNewLEDField(enum led_field field, LedInfo *old, LedInfo *new, bool report, enum led_field *collide) { if (!(old->defined & field)) return true; if (new->defined & field) { if (report) *collide |= field; if (new->merge != MERGE_AUGMENT) return true; } return false; } static bool AddLedMap(CompatInfo *info, LedInfo *new, bool same_file) { enum led_field collide; const int verbosity = xkb_context_get_log_verbosity(info->ctx); const bool report = (same_file && verbosity > 0) || verbosity > 9; for (xkb_led_index_t i = 0; i < info->num_leds; i++) { LedInfo *old = &info->leds[i]; if (old->led.name != new->led.name) continue; if (old->led.mods.mods == new->led.mods.mods && old->led.groups == new->led.groups && old->led.ctrls == new->led.ctrls && old->led.which_mods == new->led.which_mods && old->led.which_groups == new->led.which_groups) { old->defined |= new->defined; return true; } if (new->merge == MERGE_REPLACE) { if (report) log_warn(info->ctx, "Map for indicator %s redefined; " "Earlier definition ignored\n", xkb_atom_text(info->ctx, old->led.name)); *old = *new; return true; } collide = 0; if (UseNewLEDField(LED_FIELD_MODS, old, new, report, &collide)) { old->led.which_mods = new->led.which_mods; old->led.mods = new->led.mods; old->defined |= LED_FIELD_MODS; } if (UseNewLEDField(LED_FIELD_GROUPS, old, new, report, &collide)) { old->led.which_groups = new->led.which_groups; old->led.groups = new->led.groups; old->defined |= LED_FIELD_GROUPS; } if (UseNewLEDField(LED_FIELD_CTRLS, old, new, report, &collide)) { old->led.ctrls = new->led.ctrls; old->defined |= LED_FIELD_CTRLS; } if (collide) { log_warn(info->ctx, "Map for indicator %s redefined; " "Using %s definition for duplicate fields\n", xkb_atom_text(info->ctx, old->led.name), (new->merge == MERGE_AUGMENT ? "first" : "last")); } return true; } if (info->num_leds >= XKB_MAX_LEDS) { log_err(info->ctx, "Too many LEDs defined (maximum %d)\n", XKB_MAX_LEDS); return false; } info->leds[info->num_leds++] = *new; return true; } static void MergeIncludedCompatMaps(CompatInfo *into, CompatInfo *from, enum merge_mode merge) { if (from->errorCount > 0) { into->errorCount += from->errorCount; return; } into->mods = from->mods; if (into->name == NULL) { into->name = from->name; from->name = NULL; } if (darray_empty(into->interps)) { into->interps = from->interps; darray_init(from->interps); } else { SymInterpInfo *si; darray_foreach(si, from->interps) { si->merge = (merge == MERGE_DEFAULT ? si->merge : merge); if (!AddInterp(into, si, false)) into->errorCount++; } } if (into->num_leds == 0) { memcpy(into->leds, from->leds, sizeof(*from->leds) * from->num_leds); into->num_leds = from->num_leds; from->num_leds = 0; } else { for (xkb_led_index_t i = 0; i < from->num_leds; i++) { LedInfo *ledi = &from->leds[i]; ledi->merge = (merge == MERGE_DEFAULT ? ledi->merge : merge); if (!AddLedMap(into, ledi, false)) into->errorCount++; } } } static void HandleCompatMapFile(CompatInfo *info, XkbFile *file, enum merge_mode merge); static bool HandleIncludeCompatMap(CompatInfo *info, IncludeStmt *include) { CompatInfo included; InitCompatInfo(&included, info->ctx, info->actions, &info->mods); included.name = include->stmt; include->stmt = NULL; for (IncludeStmt *stmt = include; stmt; stmt = stmt->next_incl) { CompatInfo next_incl; XkbFile *file; file = ProcessIncludeFile(info->ctx, stmt, FILE_TYPE_COMPAT); if (!file) { info->errorCount += 10; ClearCompatInfo(&included); return false; } InitCompatInfo(&next_incl, info->ctx, info->actions, &included.mods); next_incl.default_interp = info->default_interp; next_incl.default_interp.merge = stmt->merge; next_incl.default_led = info->default_led; next_incl.default_led.merge = stmt->merge; HandleCompatMapFile(&next_incl, file, MERGE_OVERRIDE); MergeIncludedCompatMaps(&included, &next_incl, stmt->merge); ClearCompatInfo(&next_incl); FreeXkbFile(file); } MergeIncludedCompatMaps(info, &included, include->merge); ClearCompatInfo(&included); return (info->errorCount == 0); } static bool SetInterpField(CompatInfo *info, SymInterpInfo *si, const char *field, ExprDef *arrayNdx, ExprDef *value) { xkb_mod_index_t ndx; if (istreq(field, "action")) { if (arrayNdx) return ReportSINotArray(info, si, field); if (!HandleActionDef(info->ctx, info->actions, &info->mods, value, &si->interp.action)) return false; si->defined |= SI_FIELD_ACTION; } else if (istreq(field, "virtualmodifier") || istreq(field, "virtualmod")) { if (arrayNdx) return ReportSINotArray(info, si, field); if (!ExprResolveMod(info->ctx, value, MOD_VIRT, &info->mods, &ndx)) return ReportSIBadType(info, si, field, "virtual modifier"); si->interp.virtual_mod = ndx; si->defined |= SI_FIELD_VIRTUAL_MOD; } else if (istreq(field, "repeat")) { bool set; if (arrayNdx) return ReportSINotArray(info, si, field); if (!ExprResolveBoolean(info->ctx, value, &set)) return ReportSIBadType(info, si, field, "boolean"); si->interp.repeat = set; si->defined |= SI_FIELD_AUTO_REPEAT; } else if (istreq(field, "locking")) { log_dbg(info->ctx, "The \"locking\" field in symbol interpretation is unsupported; " "Ignored\n"); } else if (istreq(field, "usemodmap") || istreq(field, "usemodmapmods")) { unsigned int val; if (arrayNdx) return ReportSINotArray(info, si, field); if (!ExprResolveEnum(info->ctx, value, &val, useModMapValueNames)) return ReportSIBadType(info, si, field, "level specification"); si->interp.level_one_only = val; si->defined |= SI_FIELD_LEVEL_ONE_ONLY; } else { return ReportBadField(info->ctx, "symbol interpretation", field, siText(si, info)); } return true; } static bool SetLedMapField(CompatInfo *info, LedInfo *ledi, const char *field, ExprDef *arrayNdx, ExprDef *value) { bool ok = true; if (istreq(field, "modifiers") || istreq(field, "mods")) { if (arrayNdx) return ReportLedNotArray(info, ledi, field); if (!ExprResolveModMask(info->ctx, value, MOD_BOTH, &info->mods, &ledi->led.mods.mods)) return ReportLedBadType(info, ledi, field, "modifier mask"); ledi->defined |= LED_FIELD_MODS; } else if (istreq(field, "groups")) { unsigned int mask; if (arrayNdx) return ReportLedNotArray(info, ledi, field); if (!ExprResolveMask(info->ctx, value, &mask, groupMaskNames)) return ReportLedBadType(info, ledi, field, "group mask"); ledi->led.groups = mask; ledi->defined |= LED_FIELD_GROUPS; } else if (istreq(field, "controls") || istreq(field, "ctrls")) { unsigned int mask; if (arrayNdx) return ReportLedNotArray(info, ledi, field); if (!ExprResolveMask(info->ctx, value, &mask, ctrlMaskNames)) return ReportLedBadType(info, ledi, field, "controls mask"); ledi->led.ctrls = mask; ledi->defined |= LED_FIELD_CTRLS; } else if (istreq(field, "allowexplicit")) { log_dbg(info->ctx, "The \"allowExplicit\" field in indicator statements is unsupported; " "Ignored\n"); } else if (istreq(field, "whichmodstate") || istreq(field, "whichmodifierstate")) { unsigned int mask; if (arrayNdx) return ReportLedNotArray(info, ledi, field); if (!ExprResolveMask(info->ctx, value, &mask, modComponentMaskNames)) return ReportLedBadType(info, ledi, field, "mask of modifier state components"); ledi->led.which_mods = mask; } else if (istreq(field, "whichgroupstate")) { unsigned mask; if (arrayNdx) return ReportLedNotArray(info, ledi, field); if (!ExprResolveMask(info->ctx, value, &mask, groupComponentMaskNames)) return ReportLedBadType(info, ledi, field, "mask of group state components"); ledi->led.which_groups = mask; } else if (istreq(field, "driveskbd") || istreq(field, "driveskeyboard") || istreq(field, "leddriveskbd") || istreq(field, "leddriveskeyboard") || istreq(field, "indicatordriveskbd") || istreq(field, "indicatordriveskeyboard")) { log_dbg(info->ctx, "The \"%s\" field in indicator statements is unsupported; " "Ignored\n", field); } else if (istreq(field, "index")) { /* Users should see this, it might cause unexpected behavior. */ log_err(info->ctx, "The \"index\" field in indicator statements is unsupported; " "Ignored\n"); } else { log_err(info->ctx, "Unknown field %s in map for %s indicator; " "Definition ignored\n", field, xkb_atom_text(info->ctx, ledi->led.name)); ok = false; } return ok; } static bool HandleGlobalVar(CompatInfo *info, VarDef *stmt) { const char *elem, *field; ExprDef *ndx; bool ret; if (!ExprResolveLhs(info->ctx, stmt->name, &elem, &field, &ndx)) ret = false; else if (elem && istreq(elem, "interpret")) ret = SetInterpField(info, &info->default_interp, field, ndx, stmt->value); else if (elem && istreq(elem, "indicator")) ret = SetLedMapField(info, &info->default_led, field, ndx, stmt->value); else ret = SetActionField(info->ctx, info->actions, &info->mods, elem, field, ndx, stmt->value); return ret; } static bool HandleInterpBody(CompatInfo *info, VarDef *def, SymInterpInfo *si) { bool ok = true; const char *elem, *field; ExprDef *arrayNdx; for (; def; def = (VarDef *) def->common.next) { if (def->name && def->name->expr.op == EXPR_FIELD_REF) { log_err(info->ctx, "Cannot set a global default value from within an interpret statement; " "Move statements to the global file scope\n"); ok = false; continue; } ok = ExprResolveLhs(info->ctx, def->name, &elem, &field, &arrayNdx); if (!ok) continue; ok = SetInterpField(info, si, field, arrayNdx, def->value); } return ok; } static bool HandleInterpDef(CompatInfo *info, InterpDef *def, enum merge_mode merge) { enum xkb_match_operation pred; xkb_mod_mask_t mods; SymInterpInfo si; if (!ResolveStateAndPredicate(def->match, &pred, &mods, info)) { log_err(info->ctx, "Couldn't determine matching modifiers; " "Symbol interpretation ignored\n"); return false; } si = info->default_interp; si.merge = merge = (def->merge == MERGE_DEFAULT ? merge : def->merge); si.interp.sym = def->sym; si.interp.match = pred; si.interp.mods = mods; if (!HandleInterpBody(info, def->def, &si)) { info->errorCount++; return false; } if (!AddInterp(info, &si, true)) { info->errorCount++; return false; } return true; } static bool HandleLedMapDef(CompatInfo *info, LedMapDef *def, enum merge_mode merge) { LedInfo ledi; VarDef *var; bool ok; if (def->merge != MERGE_DEFAULT) merge = def->merge; ledi = info->default_led; ledi.merge = merge; ledi.led.name = def->name; ok = true; for (var = def->body; var != NULL; var = (VarDef *) var->common.next) { const char *elem, *field; ExprDef *arrayNdx; if (!ExprResolveLhs(info->ctx, var->name, &elem, &field, &arrayNdx)) { ok = false; continue; } if (elem) { log_err(info->ctx, "Cannot set defaults for \"%s\" element in indicator map; " "Assignment to %s.%s ignored\n", elem, elem, field); ok = false; } else { ok = SetLedMapField(info, &ledi, field, arrayNdx, var->value) && ok; } } if (ok) return AddLedMap(info, &ledi, true); return false; } static void HandleCompatMapFile(CompatInfo *info, XkbFile *file, enum merge_mode merge) { bool ok; merge = (merge == MERGE_DEFAULT ? MERGE_AUGMENT : merge); free(info->name); info->name = strdup_safe(file->name); for (ParseCommon *stmt = file->defs; stmt; stmt = stmt->next) { switch (stmt->type) { case STMT_INCLUDE: ok = HandleIncludeCompatMap(info, (IncludeStmt *) stmt); break; case STMT_INTERP: ok = HandleInterpDef(info, (InterpDef *) stmt, merge); break; case STMT_GROUP_COMPAT: log_dbg(info->ctx, "The \"group\" statement in compat is unsupported; " "Ignored\n"); ok = true; break; case STMT_LED_MAP: ok = HandleLedMapDef(info, (LedMapDef *) stmt, merge); break; case STMT_VAR: ok = HandleGlobalVar(info, (VarDef *) stmt); break; case STMT_VMOD: ok = HandleVModDef(info->ctx, &info->mods, (VModDef *) stmt, merge); break; default: log_err(info->ctx, "Compat files may not include other types; " "Ignoring %s\n", stmt_type_to_string(stmt->type)); ok = false; break; } if (!ok) info->errorCount++; if (info->errorCount > 10) { log_err(info->ctx, "Abandoning compatibility map \"%s\"\n", file->name); break; } } } /* Temporary struct for CopyInterps. */ struct collect { darray(struct xkb_sym_interpret) sym_interprets; }; static void CopyInterps(CompatInfo *info, bool needSymbol, enum xkb_match_operation pred, struct collect *collect) { SymInterpInfo *si; darray_foreach(si, info->interps) if (si->interp.match == pred && (si->interp.sym != XKB_KEY_NoSymbol) == needSymbol) darray_append(collect->sym_interprets, si->interp); } static void CopyLedMapDefsToKeymap(struct xkb_keymap *keymap, CompatInfo *info) { for (xkb_led_index_t idx = 0; idx < info->num_leds; idx++) { LedInfo *ledi = &info->leds[idx]; xkb_led_index_t i; struct xkb_led *led; /* * Find the LED with the given name, if it was already declared * in keycodes. */ xkb_leds_enumerate(i, led, keymap) if (led->name == ledi->led.name) break; /* Not previously declared; create it with next free index. */ if (i >= keymap->num_leds) { log_dbg(keymap->ctx, "Indicator name \"%s\" was not declared in the keycodes section; " "Adding new indicator\n", xkb_atom_text(keymap->ctx, ledi->led.name)); xkb_leds_enumerate(i, led, keymap) if (led->name == XKB_ATOM_NONE) break; if (i >= keymap->num_leds) { /* Not place to put it; ignore. */ if (i >= XKB_MAX_LEDS) { log_err(keymap->ctx, "Too many indicators (maximum is %d); " "Indicator name \"%s\" ignored\n", XKB_MAX_LEDS, xkb_atom_text(keymap->ctx, ledi->led.name)); continue; } /* Add a new LED. */ led = &keymap->leds[keymap->num_leds++]; } } *led = ledi->led; if (led->groups != 0 && led->which_groups == 0) led->which_groups = XKB_STATE_LAYOUT_EFFECTIVE; if (led->mods.mods != 0 && led->which_mods == 0) led->which_mods = XKB_STATE_MODS_EFFECTIVE; } } static bool CopyCompatToKeymap(struct xkb_keymap *keymap, CompatInfo *info) { keymap->compat_section_name = strdup_safe(info->name); XkbEscapeMapName(keymap->compat_section_name); keymap->mods = info->mods; if (!darray_empty(info->interps)) { struct collect collect; darray_init(collect.sym_interprets); /* Most specific to least specific. */ CopyInterps(info, true, MATCH_EXACTLY, &collect); CopyInterps(info, true, MATCH_ALL, &collect); CopyInterps(info, true, MATCH_NONE, &collect); CopyInterps(info, true, MATCH_ANY, &collect); CopyInterps(info, true, MATCH_ANY_OR_NONE, &collect); CopyInterps(info, false, MATCH_EXACTLY, &collect); CopyInterps(info, false, MATCH_ALL, &collect); CopyInterps(info, false, MATCH_NONE, &collect); CopyInterps(info, false, MATCH_ANY, &collect); CopyInterps(info, false, MATCH_ANY_OR_NONE, &collect); darray_steal(collect.sym_interprets, &keymap->sym_interprets, &keymap->num_sym_interprets); } CopyLedMapDefsToKeymap(keymap, info); return true; } bool CompileCompatMap(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge) { CompatInfo info; ActionsInfo *actions; actions = NewActionsInfo(); if (!actions) return false; InitCompatInfo(&info, keymap->ctx, actions, &keymap->mods); info.default_interp.merge = merge; info.default_led.merge = merge; HandleCompatMapFile(&info, file, merge); if (info.errorCount != 0) goto err_info; if (!CopyCompatToKeymap(keymap, &info)) goto err_info; ClearCompatInfo(&info); FreeActionsInfo(actions); return true; err_info: ClearCompatInfo(&info); FreeActionsInfo(actions); return false; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.5286489 libxkbcommon-0.10.0/src/xkbcomp/expr.c0000644000175000017500000004767200000000000017233 0ustar00ranran00000000000000/************************************************************ * 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 "config.h" #include "xkbcomp-priv.h" #include "text.h" #include "expr.h" typedef bool (*IdentLookupFunc)(struct xkb_context *ctx, const void *priv, xkb_atom_t field, enum expr_value_type type, unsigned int *val_rtrn); bool ExprResolveLhs(struct xkb_context *ctx, const ExprDef *expr, const char **elem_rtrn, const char **field_rtrn, ExprDef **index_rtrn) { switch (expr->expr.op) { case EXPR_IDENT: *elem_rtrn = NULL; *field_rtrn = xkb_atom_text(ctx, expr->ident.ident); *index_rtrn = NULL; return (*field_rtrn != NULL); case EXPR_FIELD_REF: *elem_rtrn = xkb_atom_text(ctx, expr->field_ref.element); *field_rtrn = xkb_atom_text(ctx, expr->field_ref.field); *index_rtrn = NULL; return (*elem_rtrn != NULL && *field_rtrn != NULL); case EXPR_ARRAY_REF: *elem_rtrn = xkb_atom_text(ctx, expr->array_ref.element); *field_rtrn = xkb_atom_text(ctx, expr->array_ref.field); *index_rtrn = expr->array_ref.entry; if (expr->array_ref.element != XKB_ATOM_NONE && *elem_rtrn == NULL) return false; if (*field_rtrn == NULL) return false; return true; default: break; } log_wsgo(ctx, "Unexpected operator %d in ResolveLhs\n", expr->expr.op); return false; } static bool SimpleLookup(struct xkb_context *ctx, const void *priv, xkb_atom_t field, enum expr_value_type type, unsigned int *val_rtrn) { const LookupEntry *entry; const char *str; if (!priv || field == XKB_ATOM_NONE || type != EXPR_TYPE_INT) return false; str = xkb_atom_text(ctx, field); for (entry = priv; entry && entry->name; entry++) { if (istreq(str, entry->name)) { *val_rtrn = entry->value; return true; } } return false; } /* Data passed in the *priv argument for LookupModMask. */ typedef struct { const struct xkb_mod_set *mods; enum mod_type mod_type; } LookupModMaskPriv; static bool LookupModMask(struct xkb_context *ctx, const void *priv, xkb_atom_t field, enum expr_value_type type, xkb_mod_mask_t *val_rtrn) { const char *str; xkb_mod_index_t ndx; const LookupModMaskPriv *arg = priv; const struct xkb_mod_set *mods = arg->mods; enum mod_type mod_type = arg->mod_type; if (type != EXPR_TYPE_INT) return false; str = xkb_atom_text(ctx, field); if (!str) return false; if (istreq(str, "all")) { *val_rtrn = MOD_REAL_MASK_ALL; return true; } if (istreq(str, "none")) { *val_rtrn = 0; return true; } ndx = XkbModNameToIndex(mods, field, mod_type); if (ndx == XKB_MOD_INVALID) return false; *val_rtrn = (1u << ndx); return true; } bool ExprResolveBoolean(struct xkb_context *ctx, const ExprDef *expr, bool *set_rtrn) { bool ok = false; const char *ident; switch (expr->expr.op) { case EXPR_VALUE: if (expr->expr.value_type != EXPR_TYPE_BOOLEAN) { log_err(ctx, "Found constant of type %s where boolean was expected\n", expr_value_type_to_string(expr->expr.value_type)); return false; } *set_rtrn = expr->boolean.set; return true; case EXPR_IDENT: ident = xkb_atom_text(ctx, expr->ident.ident); if (ident) { if (istreq(ident, "true") || istreq(ident, "yes") || istreq(ident, "on")) { *set_rtrn = true; return true; } else if (istreq(ident, "false") || istreq(ident, "no") || istreq(ident, "off")) { *set_rtrn = false; return true; } } log_err(ctx, "Identifier \"%s\" of type boolean is unknown\n", ident); return false; case EXPR_FIELD_REF: log_err(ctx, "Default \"%s.%s\" of type boolean is unknown\n", xkb_atom_text(ctx, expr->field_ref.element), xkb_atom_text(ctx, expr->field_ref.field)); return false; case EXPR_INVERT: case EXPR_NOT: ok = ExprResolveBoolean(ctx, expr->unary.child, set_rtrn); if (ok) *set_rtrn = !*set_rtrn; return ok; case EXPR_ADD: case EXPR_SUBTRACT: case EXPR_MULTIPLY: case EXPR_DIVIDE: case EXPR_ASSIGN: case EXPR_NEGATE: case EXPR_UNARY_PLUS: case EXPR_ACTION_DECL: case EXPR_ACTION_LIST: case EXPR_KEYSYM_LIST: log_err(ctx, "%s of boolean values not permitted\n", expr_op_type_to_string(expr->expr.op)); break; default: log_wsgo(ctx, "Unknown operator %d in ResolveBoolean\n", expr->expr.op); break; } return false; } bool ExprResolveKeyCode(struct xkb_context *ctx, const ExprDef *expr, xkb_keycode_t *kc) { xkb_keycode_t leftRtrn, rightRtrn; switch (expr->expr.op) { case EXPR_VALUE: if (expr->expr.value_type != EXPR_TYPE_INT) { log_err(ctx, "Found constant of type %s where an int was expected\n", expr_value_type_to_string(expr->expr.value_type)); return false; } *kc = (xkb_keycode_t) expr->integer.ival; return true; case EXPR_ADD: case EXPR_SUBTRACT: case EXPR_MULTIPLY: case EXPR_DIVIDE: if (!ExprResolveKeyCode(ctx, expr->binary.left, &leftRtrn) || !ExprResolveKeyCode(ctx, expr->binary.right, &rightRtrn)) return false; switch (expr->expr.op) { case EXPR_ADD: *kc = leftRtrn + rightRtrn; break; case EXPR_SUBTRACT: *kc = leftRtrn - rightRtrn; break; case EXPR_MULTIPLY: *kc = leftRtrn * rightRtrn; break; case EXPR_DIVIDE: if (rightRtrn == 0) { log_err(ctx, "Cannot divide by zero: %d / %d\n", leftRtrn, rightRtrn); return false; } *kc = leftRtrn / rightRtrn; break; default: break; } return true; case EXPR_NEGATE: if (!ExprResolveKeyCode(ctx, expr->unary.child, &leftRtrn)) return false; *kc = ~leftRtrn; return true; case EXPR_UNARY_PLUS: return ExprResolveKeyCode(ctx, expr->unary.child, kc); default: log_wsgo(ctx, "Unknown operator %d in ResolveKeyCode\n", expr->expr.op); break; } return false; } /** * This function returns ... something. It's a bit of a guess, really. * * If an integer is given in value ctx, it will be returned in ival. * If an ident or field reference is given, the lookup function (if given) * will be called. At the moment, only SimpleLookup use this, and they both * return the results in uval. And don't support field references. * * Cool. */ static bool ExprResolveIntegerLookup(struct xkb_context *ctx, const ExprDef *expr, int *val_rtrn, IdentLookupFunc lookup, const void *lookupPriv) { bool ok = false; int l, r; unsigned u; ExprDef *left, *right; switch (expr->expr.op) { case EXPR_VALUE: if (expr->expr.value_type != EXPR_TYPE_INT) { log_err(ctx, "Found constant of type %s where an int was expected\n", expr_value_type_to_string(expr->expr.value_type)); return false; } *val_rtrn = expr->integer.ival; return true; case EXPR_IDENT: if (lookup) ok = lookup(ctx, lookupPriv, expr->ident.ident, EXPR_TYPE_INT, &u); if (!ok) log_err(ctx, "Identifier \"%s\" of type int is unknown\n", xkb_atom_text(ctx, expr->ident.ident)); else *val_rtrn = (int) u; return ok; case EXPR_FIELD_REF: log_err(ctx, "Default \"%s.%s\" of type int is unknown\n", xkb_atom_text(ctx, expr->field_ref.element), xkb_atom_text(ctx, expr->field_ref.field)); return false; case EXPR_ADD: case EXPR_SUBTRACT: case EXPR_MULTIPLY: case EXPR_DIVIDE: left = expr->binary.left; right = expr->binary.right; if (!ExprResolveIntegerLookup(ctx, left, &l, lookup, lookupPriv) || !ExprResolveIntegerLookup(ctx, right, &r, lookup, lookupPriv)) return false; switch (expr->expr.op) { case EXPR_ADD: *val_rtrn = l + r; break; case EXPR_SUBTRACT: *val_rtrn = l - r; break; case EXPR_MULTIPLY: *val_rtrn = l * r; break; case EXPR_DIVIDE: if (r == 0) { log_err(ctx, "Cannot divide by zero: %d / %d\n", l, r); return false; } *val_rtrn = l / r; break; default: log_err(ctx, "%s of integers not permitted\n", expr_op_type_to_string(expr->expr.op)); return false; } return true; case EXPR_ASSIGN: log_wsgo(ctx, "Assignment operator not implemented yet\n"); break; case EXPR_NOT: log_err(ctx, "The ! operator cannot be applied to an integer\n"); return false; case EXPR_INVERT: case EXPR_NEGATE: left = expr->unary.child; if (!ExprResolveIntegerLookup(ctx, left, &l, lookup, lookupPriv)) return false; *val_rtrn = (expr->expr.op == EXPR_NEGATE ? -l : ~l); return true; case EXPR_UNARY_PLUS: left = expr->unary.child; return ExprResolveIntegerLookup(ctx, left, val_rtrn, lookup, lookupPriv); default: log_wsgo(ctx, "Unknown operator %d in ResolveInteger\n", expr->expr.op); break; } return false; } bool ExprResolveInteger(struct xkb_context *ctx, const ExprDef *expr, int *val_rtrn) { return ExprResolveIntegerLookup(ctx, expr, val_rtrn, NULL, NULL); } bool ExprResolveGroup(struct xkb_context *ctx, const ExprDef *expr, xkb_layout_index_t *group_rtrn) { bool ok; int result; ok = ExprResolveIntegerLookup(ctx, expr, &result, SimpleLookup, groupNames); if (!ok) return false; if (result <= 0 || result > XKB_MAX_GROUPS) { log_err(ctx, "Group index %u is out of range (1..%d)\n", result, XKB_MAX_GROUPS); return false; } *group_rtrn = (xkb_layout_index_t) result; return true; } bool ExprResolveLevel(struct xkb_context *ctx, const ExprDef *expr, xkb_level_index_t *level_rtrn) { bool ok; int result; ok = ExprResolveIntegerLookup(ctx, expr, &result, SimpleLookup, levelNames); if (!ok) return false; if (result < 1) { log_err(ctx, "Shift level %d is out of range\n", result); return false; } /* Level is zero-indexed from now on. */ *level_rtrn = (unsigned int) (result - 1); return true; } bool ExprResolveButton(struct xkb_context *ctx, const ExprDef *expr, int *btn_rtrn) { return ExprResolveIntegerLookup(ctx, expr, btn_rtrn, SimpleLookup, buttonNames); } bool ExprResolveString(struct xkb_context *ctx, const ExprDef *expr, xkb_atom_t *val_rtrn) { switch (expr->expr.op) { case EXPR_VALUE: if (expr->expr.value_type != EXPR_TYPE_STRING) { log_err(ctx, "Found constant of type %s, expected a string\n", expr_value_type_to_string(expr->expr.value_type)); return false; } *val_rtrn = expr->string.str; return true; case EXPR_IDENT: log_err(ctx, "Identifier \"%s\" of type string not found\n", xkb_atom_text(ctx, expr->ident.ident)); return false; case EXPR_FIELD_REF: log_err(ctx, "Default \"%s.%s\" of type string not found\n", xkb_atom_text(ctx, expr->field_ref.element), xkb_atom_text(ctx, expr->field_ref.field)); return false; case EXPR_ADD: case EXPR_SUBTRACT: case EXPR_MULTIPLY: case EXPR_DIVIDE: case EXPR_ASSIGN: case EXPR_NEGATE: case EXPR_INVERT: case EXPR_NOT: case EXPR_UNARY_PLUS: case EXPR_ACTION_DECL: case EXPR_ACTION_LIST: case EXPR_KEYSYM_LIST: log_err(ctx, "%s of strings not permitted\n", expr_op_type_to_string(expr->expr.op)); return false; default: log_wsgo(ctx, "Unknown operator %d in ResolveString\n", expr->expr.op); break; } return false; } bool ExprResolveEnum(struct xkb_context *ctx, const ExprDef *expr, unsigned int *val_rtrn, const LookupEntry *values) { if (expr->expr.op != EXPR_IDENT) { log_err(ctx, "Found a %s where an enumerated value was expected\n", expr_op_type_to_string(expr->expr.op)); return false; } if (!SimpleLookup(ctx, values, expr->ident.ident, EXPR_TYPE_INT, val_rtrn)) { log_err(ctx, "Illegal identifier %s; expected one of:\n", xkb_atom_text(ctx, expr->ident.ident)); while (values && values->name) { log_err(ctx, "\t%s\n", values->name); values++; } return false; } return true; } static bool ExprResolveMaskLookup(struct xkb_context *ctx, const ExprDef *expr, unsigned int *val_rtrn, IdentLookupFunc lookup, const void *lookupPriv) { bool ok = false; unsigned int l = 0, r = 0; int v; ExprDef *left, *right; const char *bogus = NULL; switch (expr->expr.op) { case EXPR_VALUE: if (expr->expr.value_type != EXPR_TYPE_INT) { log_err(ctx, "Found constant of type %s where a mask was expected\n", expr_value_type_to_string(expr->expr.value_type)); return false; } *val_rtrn = (unsigned int) expr->integer.ival; return true; case EXPR_IDENT: ok = lookup(ctx, lookupPriv, expr->ident.ident, EXPR_TYPE_INT, val_rtrn); if (!ok) log_err(ctx, "Identifier \"%s\" of type int is unknown\n", xkb_atom_text(ctx, expr->ident.ident)); return ok; case EXPR_FIELD_REF: log_err(ctx, "Default \"%s.%s\" of type int is unknown\n", xkb_atom_text(ctx, expr->field_ref.element), xkb_atom_text(ctx, expr->field_ref.field)); return false; case EXPR_ARRAY_REF: bogus = "array reference"; /* fallthrough */ case EXPR_ACTION_DECL: if (bogus == NULL) bogus = "function use"; log_err(ctx, "Unexpected %s in mask expression; Expression Ignored\n", bogus); return false; case EXPR_ADD: case EXPR_SUBTRACT: case EXPR_MULTIPLY: case EXPR_DIVIDE: left = expr->binary.left; right = expr->binary.right; if (!ExprResolveMaskLookup(ctx, left, &l, lookup, lookupPriv) || !ExprResolveMaskLookup(ctx, right, &r, lookup, lookupPriv)) return false; switch (expr->expr.op) { case EXPR_ADD: *val_rtrn = l | r; break; case EXPR_SUBTRACT: *val_rtrn = l & (~r); break; case EXPR_MULTIPLY: case EXPR_DIVIDE: log_err(ctx, "Cannot %s masks; Illegal operation ignored\n", (expr->expr.op == EXPR_DIVIDE ? "divide" : "multiply")); return false; default: break; } return true; case EXPR_ASSIGN: log_wsgo(ctx, "Assignment operator not implemented yet\n"); break; case EXPR_INVERT: left = expr->unary.child; if (!ExprResolveIntegerLookup(ctx, left, &v, lookup, lookupPriv)) return false; *val_rtrn = ~v; return true; case EXPR_UNARY_PLUS: case EXPR_NEGATE: case EXPR_NOT: left = expr->unary.child; if (!ExprResolveIntegerLookup(ctx, left, &v, lookup, lookupPriv)) log_err(ctx, "The %s operator cannot be used with a mask\n", (expr->expr.op == EXPR_NEGATE ? "-" : "!")); return false; default: log_wsgo(ctx, "Unknown operator %d in ResolveMask\n", expr->expr.op); break; } return false; } bool ExprResolveMask(struct xkb_context *ctx, const ExprDef *expr, unsigned int *mask_rtrn, const LookupEntry *values) { return ExprResolveMaskLookup(ctx, expr, mask_rtrn, SimpleLookup, values); } bool ExprResolveModMask(struct xkb_context *ctx, const ExprDef *expr, enum mod_type mod_type, const struct xkb_mod_set *mods, xkb_mod_mask_t *mask_rtrn) { LookupModMaskPriv priv = { .mods = mods, .mod_type = mod_type }; return ExprResolveMaskLookup(ctx, expr, mask_rtrn, LookupModMask, &priv); } bool ExprResolveKeySym(struct xkb_context *ctx, const ExprDef *expr, xkb_keysym_t *sym_rtrn) { int val; if (expr->expr.op == EXPR_IDENT) { const char *str = xkb_atom_text(ctx, expr->ident.ident); *sym_rtrn = xkb_keysym_from_name(str, 0); if (*sym_rtrn != XKB_KEY_NoSymbol) return true; } if (!ExprResolveInteger(ctx, expr, &val)) return false; if (val < 0 || val >= 10) return false; *sym_rtrn = XKB_KEY_0 + (xkb_keysym_t) val; return true; } bool ExprResolveMod(struct xkb_context *ctx, const ExprDef *def, enum mod_type mod_type, const struct xkb_mod_set *mods, xkb_mod_index_t *ndx_rtrn) { xkb_mod_index_t ndx; xkb_atom_t name; if (def->expr.op != EXPR_IDENT) { log_err(ctx, "Cannot resolve virtual modifier: " "found %s where a virtual modifier name was expected\n", expr_op_type_to_string(def->expr.op)); return false; } name = def->ident.ident; ndx = XkbModNameToIndex(mods, name, mod_type); if (ndx == XKB_MOD_INVALID) { log_err(ctx, "Cannot resolve virtual modifier: " "\"%s\" was not previously declared\n", xkb_atom_text(ctx, name)); return false; } *ndx_rtrn = ndx; return true; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.5286489 libxkbcommon-0.10.0/src/xkbcomp/expr.h0000644000175000017500000000604600000000000017226 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ #ifndef XKBCOMP_EXPR_H #define XKBCOMP_EXPR_H bool ExprResolveLhs(struct xkb_context *ctx, const ExprDef *expr, const char **elem_rtrn, const char **field_rtrn, ExprDef **index_rtrn); bool ExprResolveModMask(struct xkb_context *ctx, const ExprDef *expr, enum mod_type mod_type, const struct xkb_mod_set *mods, xkb_mod_mask_t *mask_rtrn); bool ExprResolveMod(struct xkb_context *ctx, const ExprDef *def, enum mod_type mod_type, const struct xkb_mod_set *mods, xkb_mod_index_t *ndx_rtrn); bool ExprResolveBoolean(struct xkb_context *ctx, const ExprDef *expr, bool *set_rtrn); bool ExprResolveKeyCode(struct xkb_context *ctx, const ExprDef *expr, xkb_keycode_t *kc); bool ExprResolveInteger(struct xkb_context *ctx, const ExprDef *expr, int *val_rtrn); bool ExprResolveLevel(struct xkb_context *ctx, const ExprDef *expr, xkb_level_index_t *level_rtrn); bool ExprResolveGroup(struct xkb_context *ctx, const ExprDef *expr, xkb_layout_index_t *group_rtrn); bool ExprResolveButton(struct xkb_context *ctx, const ExprDef *expr, int *btn_rtrn); bool ExprResolveString(struct xkb_context *ctx, const ExprDef *expr, xkb_atom_t *val_rtrn); bool ExprResolveEnum(struct xkb_context *ctx, const ExprDef *expr, unsigned int *val_rtrn, const LookupEntry *values); bool ExprResolveMask(struct xkb_context *ctx, const ExprDef *expr, unsigned int *mask_rtrn, const LookupEntry *values); bool ExprResolveKeySym(struct xkb_context *ctx, const ExprDef *expr, xkb_keysym_t *sym_rtrn); #endif ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.541982 libxkbcommon-0.10.0/src/xkbcomp/include.c0000644000175000017500000002433100000000000017663 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ /* * 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. */ #include "config.h" #include #include #include #include "xkbcomp-priv.h" #include "include.h" /** * Parse an include statement. Each call returns a file name, along with * (possibly) a specific map in the file, an explicit group designator, and * the separator from the next file, used to determine the merge mode. * * @param str_inout Input statement, modified in-place. Should be passed in * repeatedly. If str_inout is NULL, the parsing has completed. * * @param file_rtrn Set to the name of the include file to be used. Combined * with an enum xkb_file_type, this determines which file to look for in the * include path. * * @param map_rtrn Set to the string between '(' and ')', if any. This will * result in the compilation of a specific named map within the file (e.g. * xkb_symbols "basic" { ... }) , as opposed to the default map of the file. * * @param nextop_rtrn Set to the next operation in the complete statement, * which is '\0' if it's the last file or '+' or '|' if there are more. * Separating the files with '+' sets the merge mode to MERGE_MODE_OVERRIDE, * while '|' sets the merge mode to MERGE_MODE_AUGMENT. * * @param extra_data Set to the string after ':', if any. Currently the * extra data is only used for setting an explicit group index for a symbols * file. * * @return true if parsing was successful, false for an illegal string. * * Example: "evdev+aliases(qwerty):2" * str_inout = "aliases(qwerty):2" * file_rtrn = "evdev" * map_rtrn = NULL * nextop_retrn = "+" * extra_data = NULL * * 2nd run with "aliases(qwerty):2" * str_inout = NULL * file_rtrn = "aliases" * map_rtrn = "qwerty" * nextop_retrn = "" * extra_data = "2" * */ bool ParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, char *nextop_rtrn, char **extra_data) { char *tmp, *str, *next; str = *str_inout; /* * Find the position in the string where the next file is included, * if there is more than one left in the statement. */ next = strpbrk(str, "|+"); if (next) { /* Got more files, this function will be called again. */ *nextop_rtrn = *next; /* Separate the string, for strchr etc. to work on this file only. */ *next++ = '\0'; } else { /* This is the last file in this statement, won't be called again. */ *nextop_rtrn = '\0'; next = NULL; } /* * Search for the explicit group designator, if any. If it's there, * it goes after the file name and map. */ tmp = strchr(str, ':'); if (tmp != NULL) { *tmp++ = '\0'; *extra_data = strdup(tmp); } else { *extra_data = NULL; } /* Look for a map, if any. */ tmp = strchr(str, '('); if (tmp == NULL) { /* No map. */ *file_rtrn = strdup(str); *map_rtrn = NULL; } else if (str[0] == '(') { /* Map without file - invalid. */ free(*extra_data); return false; } else { /* Got a map; separate the file and the map for the strdup's. */ *tmp++ = '\0'; *file_rtrn = strdup(str); str = tmp; tmp = strchr(str, ')'); if (tmp == NULL || tmp[1] != '\0') { free(*file_rtrn); free(*extra_data); return false; } *tmp++ = '\0'; *map_rtrn = strdup(str); } /* Set up the next file for the next call, if any. */ if (*nextop_rtrn == '\0') *str_inout = NULL; else if (*nextop_rtrn == '|' || *nextop_rtrn == '+') *str_inout = next; else return false; return true; } static const char *xkb_file_type_include_dirs[_FILE_TYPE_NUM_ENTRIES] = { [FILE_TYPE_KEYCODES] = "keycodes", [FILE_TYPE_TYPES] = "types", [FILE_TYPE_COMPAT] = "compat", [FILE_TYPE_SYMBOLS] = "symbols", [FILE_TYPE_GEOMETRY] = "geometry", [FILE_TYPE_KEYMAP] = "keymap", [FILE_TYPE_RULES] = "rules", }; /** * Return the xkb directory based on the type. */ static const char * DirectoryForInclude(enum xkb_file_type type) { if (type >= _FILE_TYPE_NUM_ENTRIES) return ""; return xkb_file_type_include_dirs[type]; } FILE * FindFileInXkbPath(struct xkb_context *ctx, const char *name, enum xkb_file_type type, char **pathRtrn) { unsigned int i; FILE *file = NULL; char *buf = NULL; const char *typeDir; size_t buf_size = 0, typeDirLen, name_len; typeDir = DirectoryForInclude(type); typeDirLen = strlen(typeDir); name_len = strlen(name); for (i = 0; i < xkb_context_num_include_paths(ctx); i++) { size_t new_buf_size = strlen(xkb_context_include_path_get(ctx, i)) + typeDirLen + name_len + 3; int ret; if (new_buf_size > buf_size) { void *buf_new = realloc(buf, new_buf_size); if (buf_new) { buf_size = new_buf_size; buf = buf_new; } else { log_err(ctx, "Cannot realloc for name (%s/%s/%s)\n", xkb_context_include_path_get(ctx, i), typeDir, name); continue; } } ret = snprintf(buf, buf_size, "%s/%s/%s", xkb_context_include_path_get(ctx, i), typeDir, name); if (ret < 0) { log_err(ctx, "snprintf error (%s/%s/%s)\n", xkb_context_include_path_get(ctx, i), typeDir, name); continue; } file = fopen(buf, "rb"); if (file) break; } if (!file) { log_err(ctx, "Couldn't find file \"%s/%s\" in include paths\n", typeDir, name); if (xkb_context_num_include_paths(ctx) > 0) { log_err(ctx, "%d include paths searched:\n", xkb_context_num_include_paths(ctx)); for (i = 0; i < xkb_context_num_include_paths(ctx); i++) log_err(ctx, "\t%s\n", xkb_context_include_path_get(ctx, i)); } else { log_err(ctx, "There are no include paths to search\n"); } if (xkb_context_num_failed_include_paths(ctx) > 0) { log_err(ctx, "%d include paths could not be added:\n", xkb_context_num_failed_include_paths(ctx)); for (i = 0; i < xkb_context_num_failed_include_paths(ctx); i++) log_err(ctx, "\t%s\n", xkb_context_failed_include_path_get(ctx, i)); } free(buf); return NULL; } if (pathRtrn) *pathRtrn = buf; else free(buf); return file; } XkbFile * ProcessIncludeFile(struct xkb_context *ctx, IncludeStmt *stmt, enum xkb_file_type file_type) { FILE *file; XkbFile *xkb_file; file = FindFileInXkbPath(ctx, stmt->file, file_type, NULL); if (!file) return false; xkb_file = XkbParseFile(ctx, file, stmt->file, stmt->map); fclose(file); if (!xkb_file) { if (stmt->map) log_err(ctx, "Couldn't process include statement for '%s(%s)'\n", stmt->file, stmt->map); else log_err(ctx, "Couldn't process include statement for '%s'\n", stmt->file); return NULL; } if (xkb_file->file_type != file_type) { log_err(ctx, "Include file of wrong type (expected %s, got %s); " "Include file \"%s\" ignored\n", xkb_file_type_to_string(file_type), xkb_file_type_to_string(xkb_file->file_type), stmt->file); FreeXkbFile(xkb_file); return NULL; } /* FIXME: we have to check recursive includes here (or somewhere) */ return xkb_file; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.541982 libxkbcommon-0.10.0/src/xkbcomp/include.h0000644000175000017500000000340500000000000017667 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ #ifndef XKBCOMP_INCLUDE_H #define XKBCOMP_INCLUDE_H bool ParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, char *nextop_rtrn, char **extra_data); FILE * FindFileInXkbPath(struct xkb_context *ctx, const char *name, enum xkb_file_type type, char **pathRtrn); XkbFile * ProcessIncludeFile(struct xkb_context *ctx, IncludeStmt *stmt, enum xkb_file_type file_type); #endif ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.551982 libxkbcommon-0.10.0/src/xkbcomp/keycodes.c0000644000175000017500000004716100000000000020054 0ustar00ranran00000000000000/************************************************************ * 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 "config.h" #include "xkbcomp-priv.h" #include "text.h" #include "expr.h" #include "include.h" typedef struct { enum merge_mode merge; xkb_atom_t alias; xkb_atom_t real; } AliasInfo; typedef struct { enum merge_mode merge; xkb_atom_t name; } LedNameInfo; typedef struct { char *name; int errorCount; xkb_keycode_t min_key_code; xkb_keycode_t max_key_code; darray(xkb_atom_t) key_names; LedNameInfo led_names[XKB_MAX_LEDS]; unsigned int num_led_names; darray(AliasInfo) aliases; struct xkb_context *ctx; } KeyNamesInfo; /***====================================================================***/ static void InitAliasInfo(AliasInfo *info, enum merge_mode merge, xkb_atom_t alias, xkb_atom_t real) { memset(info, 0, sizeof(*info)); info->merge = merge; info->alias = alias; info->real = real; } static LedNameInfo * FindLedByName(KeyNamesInfo *info, xkb_atom_t name, xkb_led_index_t *idx_out) { for (xkb_led_index_t idx = 0; idx < info->num_led_names; idx++) { LedNameInfo *ledi = &info->led_names[idx]; if (ledi->name == name) { *idx_out = idx; return ledi; } } return NULL; } static bool AddLedName(KeyNamesInfo *info, enum merge_mode merge, bool same_file, LedNameInfo *new, xkb_led_index_t new_idx) { xkb_led_index_t old_idx; LedNameInfo *old; const int verbosity = xkb_context_get_log_verbosity(info->ctx); const bool report = (same_file && verbosity > 0) || verbosity > 9; const bool replace = (merge == MERGE_REPLACE || merge == MERGE_OVERRIDE); /* LED with the same name already exists. */ old = FindLedByName(info, new->name, &old_idx); if (old) { if (old_idx == new_idx) { log_warn(info->ctx, "Multiple indicators named \"%s\"; " "Identical definitions ignored\n", xkb_atom_text(info->ctx, new->name)); return true; } if (report) { xkb_led_index_t use = (replace ? new_idx + 1 : old_idx + 1); xkb_led_index_t ignore = (replace ? old_idx + 1 : new_idx + 1); log_warn(info->ctx, "Multiple indicators named %s; Using %d, ignoring %d\n", xkb_atom_text(info->ctx, new->name), use, ignore); } if (replace) *old = *new; return true; } if (new_idx >= info->num_led_names) info->num_led_names = new_idx + 1; /* LED with the same index already exists. */ old = &info->led_names[new_idx]; if (old->name != XKB_ATOM_NONE) { if (report) { const xkb_atom_t use = (replace ? new->name : old->name); const xkb_atom_t ignore = (replace ? old->name : new->name); log_warn(info->ctx, "Multiple names for indicator %d; " "Using %s, ignoring %s\n", new_idx + 1, xkb_atom_text(info->ctx, use), xkb_atom_text(info->ctx, ignore)); } if (replace) *old = *new; return true; } *old = *new; return true; } static void ClearKeyNamesInfo(KeyNamesInfo *info) { free(info->name); darray_free(info->key_names); darray_free(info->aliases); } static void InitKeyNamesInfo(KeyNamesInfo *info, struct xkb_context *ctx) { memset(info, 0, sizeof(*info)); info->ctx = ctx; info->min_key_code = XKB_KEYCODE_INVALID; #if XKB_KEYCODE_INVALID < XKB_KEYCODE_MAX #error "Hey, you can't be changing stuff like that." #endif } static xkb_keycode_t FindKeyByName(KeyNamesInfo *info, xkb_atom_t name) { xkb_keycode_t i; for (i = info->min_key_code; i <= info->max_key_code; i++) if (darray_item(info->key_names, i) == name) return i; return XKB_KEYCODE_INVALID; } static bool AddKeyName(KeyNamesInfo *info, xkb_keycode_t kc, xkb_atom_t name, enum merge_mode merge, bool same_file, bool report) { xkb_atom_t old_name; xkb_keycode_t old_kc; const int verbosity = xkb_context_get_log_verbosity(info->ctx); report = report && ((same_file && verbosity > 0) || verbosity > 7); if (kc >= darray_size(info->key_names)) darray_resize0(info->key_names, kc + 1); info->min_key_code = MIN(info->min_key_code, kc); info->max_key_code = MAX(info->max_key_code, kc); /* There's already a key with this keycode. */ old_name = darray_item(info->key_names, kc); if (old_name != XKB_ATOM_NONE) { const char *lname = KeyNameText(info->ctx, old_name); const char *kname = KeyNameText(info->ctx, name); if (old_name == name) { if (report) log_warn(info->ctx, "Multiple identical key name definitions; " "Later occurrences of \"%s = %d\" ignored\n", lname, kc); return true; } else if (merge == MERGE_AUGMENT) { if (report) log_warn(info->ctx, "Multiple names for keycode %d; " "Using %s, ignoring %s\n", kc, lname, kname); return true; } else { if (report) log_warn(info->ctx, "Multiple names for keycode %d; " "Using %s, ignoring %s\n", kc, kname, lname); darray_item(info->key_names, kc) = XKB_ATOM_NONE; } } /* There's already a key with this name. */ old_kc = FindKeyByName(info, name); if (old_kc != XKB_KEYCODE_INVALID && old_kc != kc) { const char *kname = KeyNameText(info->ctx, name); if (merge == MERGE_OVERRIDE) { darray_item(info->key_names, old_kc) = XKB_ATOM_NONE; if (report) log_warn(info->ctx, "Key name %s assigned to multiple keys; " "Using %d, ignoring %d\n", kname, kc, old_kc); } else { if (report) log_vrb(info->ctx, 3, "Key name %s assigned to multiple keys; " "Using %d, ignoring %d\n", kname, old_kc, kc); return true; } } darray_item(info->key_names, kc) = name; return true; } /***====================================================================***/ static bool HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge); static void MergeIncludedKeycodes(KeyNamesInfo *into, KeyNamesInfo *from, enum merge_mode merge) { if (from->errorCount > 0) { into->errorCount += from->errorCount; return; } if (into->name == NULL) { into->name = from->name; from->name = NULL; } /* Merge key names. */ if (darray_empty(into->key_names)) { into->key_names = from->key_names; darray_init(from->key_names); into->min_key_code = from->min_key_code; into->max_key_code = from->max_key_code; } else { if (darray_size(into->key_names) < darray_size(from->key_names)) darray_resize0(into->key_names, darray_size(from->key_names)); for (unsigned i = from->min_key_code; i <= from->max_key_code; i++) { xkb_atom_t name = darray_item(from->key_names, i); if (name == XKB_ATOM_NONE) continue; if (!AddKeyName(into, i, name, merge, true, false)) into->errorCount++; } } /* Merge key aliases. */ if (darray_empty(into->aliases)) { into->aliases = from->aliases; darray_init(from->aliases); } else { AliasInfo *alias; darray_foreach(alias, from->aliases) { KeyAliasDef def; def.merge = (merge == MERGE_DEFAULT ? alias->merge : merge); def.alias = alias->alias; def.real = alias->real; if (!HandleAliasDef(into, &def, def.merge)) into->errorCount++; } } /* Merge LED names. */ if (into->num_led_names == 0) { memcpy(into->led_names, from->led_names, sizeof(*from->led_names) * from->num_led_names); into->num_led_names = from->num_led_names; from->num_led_names = 0; } else { for (xkb_led_index_t idx = 0; idx < from->num_led_names; idx++) { LedNameInfo *ledi = &from->led_names[idx]; if (ledi->name == XKB_ATOM_NONE) continue; ledi->merge = (merge == MERGE_DEFAULT ? ledi->merge : merge); if (!AddLedName(into, ledi->merge, false, ledi, idx)) into->errorCount++; } } } static void HandleKeycodesFile(KeyNamesInfo *info, XkbFile *file, enum merge_mode merge); static bool HandleIncludeKeycodes(KeyNamesInfo *info, IncludeStmt *include) { KeyNamesInfo included; InitKeyNamesInfo(&included, info->ctx); included.name = include->stmt; include->stmt = NULL; for (IncludeStmt *stmt = include; stmt; stmt = stmt->next_incl) { KeyNamesInfo next_incl; XkbFile *file; file = ProcessIncludeFile(info->ctx, stmt, FILE_TYPE_KEYCODES); if (!file) { info->errorCount += 10; ClearKeyNamesInfo(&included); return false; } InitKeyNamesInfo(&next_incl, info->ctx); HandleKeycodesFile(&next_incl, file, MERGE_OVERRIDE); MergeIncludedKeycodes(&included, &next_incl, stmt->merge); ClearKeyNamesInfo(&next_incl); FreeXkbFile(file); } MergeIncludedKeycodes(info, &included, include->merge); ClearKeyNamesInfo(&included); return (info->errorCount == 0); } static bool HandleKeycodeDef(KeyNamesInfo *info, KeycodeDef *stmt, enum merge_mode merge) { if (stmt->merge != MERGE_DEFAULT) { if (stmt->merge == MERGE_REPLACE) merge = MERGE_OVERRIDE; else merge = stmt->merge; } if (stmt->value < 0 || stmt->value > XKB_KEYCODE_MAX) { log_err(info->ctx, "Illegal keycode %lld: must be between 0..%u; " "Key ignored\n", (long long) stmt->value, XKB_KEYCODE_MAX); return false; } return AddKeyName(info, (xkb_keycode_t) stmt->value, stmt->name, merge, false, true); } static bool HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge) { AliasInfo *old, new; darray_foreach(old, info->aliases) { if (old->alias == def->alias) { if (def->real == old->real) { log_vrb(info->ctx, 1, "Alias of %s for %s declared more than once; " "First definition ignored\n", KeyNameText(info->ctx, def->alias), KeyNameText(info->ctx, def->real)); } else { xkb_atom_t use, ignore; use = (merge == MERGE_AUGMENT ? old->real : def->real); ignore = (merge == MERGE_AUGMENT ? def->real : old->real); log_warn(info->ctx, "Multiple definitions for alias %s; " "Using %s, ignoring %s\n", KeyNameText(info->ctx, old->alias), KeyNameText(info->ctx, use), KeyNameText(info->ctx, ignore)); old->real = use; } old->merge = merge; return true; } } InitAliasInfo(&new, merge, def->alias, def->real); darray_append(info->aliases, new); return true; } static bool HandleKeyNameVar(KeyNamesInfo *info, VarDef *stmt) { const char *elem, *field; ExprDef *arrayNdx; if (!ExprResolveLhs(info->ctx, stmt->name, &elem, &field, &arrayNdx)) return false; if (elem) { log_err(info->ctx, "Unknown element %s encountered; " "Default for field %s ignored\n", elem, field); return false; } if (!istreq(field, "minimum") && !istreq(field, "maximum")) { log_err(info->ctx, "Unknown field encountered; " "Assignment to field %s ignored\n", field); return false; } /* We ignore explicit min/max statements, we always use computed. */ return true; } static bool HandleLedNameDef(KeyNamesInfo *info, LedNameDef *def, enum merge_mode merge) { LedNameInfo ledi; xkb_atom_t name; if (def->ndx < 1 || def->ndx > XKB_MAX_LEDS) { info->errorCount++; log_err(info->ctx, "Illegal indicator index (%d) specified; must be between 1 .. %d; " "Ignored\n", def->ndx, XKB_MAX_LEDS); return false; } if (!ExprResolveString(info->ctx, def->name, &name)) { char buf[20]; snprintf(buf, sizeof(buf), "%u", def->ndx); info->errorCount++; return ReportBadType(info->ctx, "indicator", "name", buf, "string"); } ledi.merge = merge; ledi.name = name; return AddLedName(info, merge, true, &ledi, def->ndx - 1); } static void HandleKeycodesFile(KeyNamesInfo *info, XkbFile *file, enum merge_mode merge) { bool ok; free(info->name); info->name = strdup_safe(file->name); for (ParseCommon *stmt = file->defs; stmt; stmt = stmt->next) { switch (stmt->type) { case STMT_INCLUDE: ok = HandleIncludeKeycodes(info, (IncludeStmt *) stmt); break; case STMT_KEYCODE: ok = HandleKeycodeDef(info, (KeycodeDef *) stmt, merge); break; case STMT_ALIAS: ok = HandleAliasDef(info, (KeyAliasDef *) stmt, merge); break; case STMT_VAR: ok = HandleKeyNameVar(info, (VarDef *) stmt); break; case STMT_LED_NAME: ok = HandleLedNameDef(info, (LedNameDef *) stmt, merge); break; default: log_err(info->ctx, "Keycode files may define key and indicator names only; " "Ignoring %s\n", stmt_type_to_string(stmt->type)); ok = false; break; } if (!ok) info->errorCount++; if (info->errorCount > 10) { log_err(info->ctx, "Abandoning keycodes file \"%s\"\n", file->name); break; } } } /***====================================================================***/ static bool CopyKeyNamesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) { struct xkb_key *keys; xkb_keycode_t min_key_code, max_key_code, kc; min_key_code = info->min_key_code; max_key_code = info->max_key_code; /* If the keymap has no keys, let's just use the safest pair we know. */ if (min_key_code == XKB_KEYCODE_INVALID) { min_key_code = 8; max_key_code = 255; } keys = calloc(max_key_code + 1, sizeof(*keys)); if (!keys) return false; for (kc = min_key_code; kc <= max_key_code; kc++) keys[kc].keycode = kc; for (kc = info->min_key_code; kc <= info->max_key_code; kc++) keys[kc].name = darray_item(info->key_names, kc); keymap->min_key_code = min_key_code; keymap->max_key_code = max_key_code; keymap->keys = keys; return true; } static bool CopyKeyAliasesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) { AliasInfo *alias; unsigned i, num_key_aliases; struct xkb_key_alias *key_aliases; /* * Do some sanity checking on the aliases. We can't do it before * because keys and their aliases may be added out-of-order. */ num_key_aliases = 0; darray_foreach(alias, info->aliases) { /* Check that ->real is a key. */ if (!XkbKeyByName(keymap, alias->real, false)) { log_vrb(info->ctx, 5, "Attempt to alias %s to non-existent key %s; Ignored\n", KeyNameText(info->ctx, alias->alias), KeyNameText(info->ctx, alias->real)); alias->real = XKB_ATOM_NONE; continue; } /* Check that ->alias is not a key. */ if (XkbKeyByName(keymap, alias->alias, false)) { log_vrb(info->ctx, 5, "Attempt to create alias with the name of a real key; " "Alias \"%s = %s\" ignored\n", KeyNameText(info->ctx, alias->alias), KeyNameText(info->ctx, alias->real)); alias->real = XKB_ATOM_NONE; continue; } num_key_aliases++; } /* Copy key aliases. */ key_aliases = NULL; if (num_key_aliases > 0) { key_aliases = calloc(num_key_aliases, sizeof(*key_aliases)); if (!key_aliases) return false; i = 0; darray_foreach(alias, info->aliases) { if (alias->real != XKB_ATOM_NONE) { key_aliases[i].alias = alias->alias; key_aliases[i].real = alias->real; i++; } } } keymap->num_key_aliases = num_key_aliases; keymap->key_aliases = key_aliases; return true; } static bool CopyLedNamesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) { keymap->num_leds = info->num_led_names; for (xkb_led_index_t idx = 0; idx < info->num_led_names; idx++) { LedNameInfo *ledi = &info->led_names[idx]; if (ledi->name == XKB_ATOM_NONE) continue; keymap->leds[idx].name = ledi->name; } return true; } static bool CopyKeyNamesInfoToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) { /* This function trashes keymap on error, but that's OK. */ if (!CopyKeyNamesToKeymap(keymap, info) || !CopyKeyAliasesToKeymap(keymap, info) || !CopyLedNamesToKeymap(keymap, info)) return false; keymap->keycodes_section_name = strdup_safe(info->name); XkbEscapeMapName(keymap->keycodes_section_name); return true; } /***====================================================================***/ bool CompileKeycodes(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge) { KeyNamesInfo info; InitKeyNamesInfo(&info, keymap->ctx); HandleKeycodesFile(&info, file, merge); if (info.errorCount != 0) goto err_info; if (!CopyKeyNamesInfoToKeymap(keymap, &info)) goto err_info; ClearKeyNamesInfo(&info); return true; err_info: ClearKeyNamesInfo(&info); return false; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.561982 libxkbcommon-0.10.0/src/xkbcomp/keymap-dump.c0000644000175000017500000005225600000000000020500 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ /* * 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 */ #include "config.h" #include "xkbcomp-priv.h" #include "text.h" #define BUF_CHUNK_SIZE 4096 struct buf { char *buf; size_t size; size_t alloc; }; static bool do_realloc(struct buf *buf, size_t at_least) { char *new; buf->alloc += BUF_CHUNK_SIZE; if (at_least >= BUF_CHUNK_SIZE) buf->alloc += at_least; new = realloc(buf->buf, buf->alloc); if (!new) return false; buf->buf = new; return true; } ATTR_PRINTF(2, 3) static bool check_write_buf(struct buf *buf, const char *fmt, ...) { va_list args; int printed; size_t available; available = buf->alloc - buf->size; va_start(args, fmt); printed = vsnprintf(buf->buf + buf->size, available, fmt, args); va_end(args); if (printed < 0) goto err; if ((size_t) printed >= available) if (!do_realloc(buf, printed)) goto err; /* The buffer has enough space now. */ available = buf->alloc - buf->size; va_start(args, fmt); printed = vsnprintf(buf->buf + buf->size, available, fmt, args); va_end(args); if (printed < 0 || (size_t) printed >= available) goto err; buf->size += printed; return true; err: free(buf->buf); buf->buf = NULL; return false; } #define write_buf(buf, ...) do { \ if (!check_write_buf(buf, __VA_ARGS__)) \ return false; \ } while (0) static bool write_vmods(struct xkb_keymap *keymap, struct buf *buf) { const struct xkb_mod *mod; xkb_mod_index_t num_vmods = 0; xkb_mods_foreach(mod, &keymap->mods) { if (mod->type != MOD_VIRT) continue; if (num_vmods == 0) write_buf(buf, "\tvirtual_modifiers "); else write_buf(buf, ","); write_buf(buf, "%s", xkb_atom_text(keymap->ctx, mod->name)); num_vmods++; } if (num_vmods > 0) write_buf(buf, ";\n\n"); return true; } static bool write_keycodes(struct xkb_keymap *keymap, struct buf *buf) { const struct xkb_key *key; xkb_led_index_t idx; const struct xkb_led *led; if (keymap->keycodes_section_name) write_buf(buf, "xkb_keycodes \"%s\" {\n", keymap->keycodes_section_name); else write_buf(buf, "xkb_keycodes {\n"); /* xkbcomp and X11 really want to see keymaps with a minimum of 8, and * a maximum of at least 255, else XWayland really starts hating life. * If this is a problem and people really need strictly bounded keymaps, * we should probably control this with a flag. */ write_buf(buf, "\tminimum = %u;\n", MIN(keymap->min_key_code, 8)); write_buf(buf, "\tmaximum = %u;\n", MAX(keymap->max_key_code, 255)); xkb_keys_foreach(key, keymap) { if (key->name == XKB_ATOM_NONE) continue; write_buf(buf, "\t%-20s = %u;\n", KeyNameText(keymap->ctx, key->name), key->keycode); } xkb_leds_enumerate(idx, led, keymap) if (led->name != XKB_ATOM_NONE) write_buf(buf, "\tindicator %u = \"%s\";\n", idx + 1, xkb_atom_text(keymap->ctx, led->name)); for (unsigned i = 0; i < keymap->num_key_aliases; i++) write_buf(buf, "\talias %-14s = %s;\n", KeyNameText(keymap->ctx, keymap->key_aliases[i].alias), KeyNameText(keymap->ctx, keymap->key_aliases[i].real)); write_buf(buf, "};\n\n"); return true; } static bool write_types(struct xkb_keymap *keymap, struct buf *buf) { if (keymap->types_section_name) write_buf(buf, "xkb_types \"%s\" {\n", keymap->types_section_name); else write_buf(buf, "xkb_types {\n"); write_vmods(keymap, buf); for (unsigned i = 0; i < keymap->num_types; i++) { const struct xkb_key_type *type = &keymap->types[i]; write_buf(buf, "\ttype \"%s\" {\n", xkb_atom_text(keymap->ctx, type->name)); write_buf(buf, "\t\tmodifiers= %s;\n", ModMaskText(keymap->ctx, &keymap->mods, type->mods.mods)); for (unsigned j = 0; j < type->num_entries; j++) { const char *str; const struct xkb_key_type_entry *entry = &type->entries[j]; /* * Printing level 1 entries is redundant, it's the default, * unless there's preserve info. */ if (entry->level == 0 && entry->preserve.mods == 0) continue; str = ModMaskText(keymap->ctx, &keymap->mods, entry->mods.mods); write_buf(buf, "\t\tmap[%s]= %u;\n", str, entry->level + 1); if (entry->preserve.mods) write_buf(buf, "\t\tpreserve[%s]= %s;\n", str, ModMaskText(keymap->ctx, &keymap->mods, entry->preserve.mods)); } for (xkb_level_index_t n = 0; n < type->num_level_names; n++) if (type->level_names[n]) write_buf(buf, "\t\tlevel_name[%u]= \"%s\";\n", n + 1, xkb_atom_text(keymap->ctx, type->level_names[n])); write_buf(buf, "\t};\n"); } write_buf(buf, "};\n\n"); return true; } static bool write_led_map(struct xkb_keymap *keymap, struct buf *buf, const struct xkb_led *led) { write_buf(buf, "\tindicator \"%s\" {\n", xkb_atom_text(keymap->ctx, led->name)); if (led->which_groups) { if (led->which_groups != XKB_STATE_LAYOUT_EFFECTIVE) { write_buf(buf, "\t\twhichGroupState= %s;\n", LedStateMaskText(keymap->ctx, led->which_groups)); } write_buf(buf, "\t\tgroups= 0x%02x;\n", led->groups); } if (led->which_mods) { if (led->which_mods != XKB_STATE_MODS_EFFECTIVE) { write_buf(buf, "\t\twhichModState= %s;\n", LedStateMaskText(keymap->ctx, led->which_mods)); } write_buf(buf, "\t\tmodifiers= %s;\n", ModMaskText(keymap->ctx, &keymap->mods, led->mods.mods)); } if (led->ctrls) { write_buf(buf, "\t\tcontrols= %s;\n", ControlMaskText(keymap->ctx, led->ctrls)); } write_buf(buf, "\t};\n"); return true; } static const char * affect_lock_text(enum xkb_action_flags flags) { switch (flags & (ACTION_LOCK_NO_LOCK | ACTION_LOCK_NO_UNLOCK)) { case ACTION_LOCK_NO_UNLOCK: return ",affect=lock"; case ACTION_LOCK_NO_LOCK: return ",affect=unlock"; case ACTION_LOCK_NO_LOCK | ACTION_LOCK_NO_UNLOCK: return ",affect=neither"; } return ""; } static bool write_action(struct xkb_keymap *keymap, struct buf *buf, const union xkb_action *action, const char *prefix, const char *suffix) { const char *type; const char *args = NULL; if (!prefix) prefix = ""; if (!suffix) suffix = ""; type = ActionTypeText(action->type); switch (action->type) { case ACTION_TYPE_MOD_SET: case ACTION_TYPE_MOD_LATCH: case ACTION_TYPE_MOD_LOCK: if (action->mods.flags & ACTION_MODS_LOOKUP_MODMAP) args = "modMapMods"; else args = ModMaskText(keymap->ctx, &keymap->mods, action->mods.mods.mods); write_buf(buf, "%s%s(modifiers=%s%s%s%s)%s", prefix, type, args, (action->type != ACTION_TYPE_MOD_LOCK && (action->mods.flags & ACTION_LOCK_CLEAR)) ? ",clearLocks" : "", (action->type != ACTION_TYPE_MOD_LOCK && (action->mods.flags & ACTION_LATCH_TO_LOCK)) ? ",latchToLock" : "", (action->type == ACTION_TYPE_MOD_LOCK) ? affect_lock_text(action->mods.flags) : "", suffix); break; case ACTION_TYPE_GROUP_SET: case ACTION_TYPE_GROUP_LATCH: case ACTION_TYPE_GROUP_LOCK: write_buf(buf, "%s%s(group=%s%d%s%s)%s", prefix, type, (!(action->group.flags & ACTION_ABSOLUTE_SWITCH) && action->group.group > 0) ? "+" : "", (action->group.flags & ACTION_ABSOLUTE_SWITCH) ? action->group.group + 1 : action->group.group, (action->type != ACTION_TYPE_GROUP_LOCK && (action->group.flags & ACTION_LOCK_CLEAR)) ? ",clearLocks" : "", (action->type != ACTION_TYPE_GROUP_LOCK && (action->group.flags & ACTION_LATCH_TO_LOCK)) ? ",latchToLock" : "", suffix); break; case ACTION_TYPE_TERMINATE: write_buf(buf, "%s%s()%s", prefix, type, suffix); break; case ACTION_TYPE_PTR_MOVE: write_buf(buf, "%s%s(x=%s%d,y=%s%d%s)%s", prefix, type, (!(action->ptr.flags & ACTION_ABSOLUTE_X) && action->ptr.x >= 0) ? "+" : "", action->ptr.x, (!(action->ptr.flags & ACTION_ABSOLUTE_Y) && action->ptr.y >= 0) ? "+" : "", action->ptr.y, (action->ptr.flags & ACTION_ACCEL) ? "" : ",!accel", suffix); break; case ACTION_TYPE_PTR_LOCK: args = affect_lock_text(action->btn.flags); /* fallthrough */ case ACTION_TYPE_PTR_BUTTON: write_buf(buf, "%s%s(button=", prefix, type); if (action->btn.button > 0 && action->btn.button <= 5) write_buf(buf, "%d", action->btn.button); else write_buf(buf, "default"); if (action->btn.count) write_buf(buf, ",count=%d", action->btn.count); if (args) write_buf(buf, "%s", args); write_buf(buf, ")%s", suffix); break; case ACTION_TYPE_PTR_DEFAULT: write_buf(buf, "%s%s(", prefix, type); write_buf(buf, "affect=button,button=%s%d", (!(action->dflt.flags & ACTION_ABSOLUTE_SWITCH) && action->dflt.value >= 0) ? "+" : "", action->dflt.value); write_buf(buf, ")%s", suffix); break; case ACTION_TYPE_SWITCH_VT: write_buf(buf, "%s%s(screen=%s%d,%ssame)%s", prefix, type, (!(action->screen.flags & ACTION_ABSOLUTE_SWITCH) && action->screen.screen >= 0) ? "+" : "", action->screen.screen, (action->screen.flags & ACTION_SAME_SCREEN) ? "" : "!", suffix); break; case ACTION_TYPE_CTRL_SET: case ACTION_TYPE_CTRL_LOCK: write_buf(buf, "%s%s(controls=%s%s)%s", prefix, type, ControlMaskText(keymap->ctx, action->ctrls.ctrls), (action->type == ACTION_TYPE_CTRL_LOCK) ? affect_lock_text(action->ctrls.flags) : "", suffix); break; case ACTION_TYPE_NONE: write_buf(buf, "%sNoAction()%s", prefix, suffix); break; default: write_buf(buf, "%s%s(type=0x%02x,data[0]=0x%02x,data[1]=0x%02x,data[2]=0x%02x,data[3]=0x%02x,data[4]=0x%02x,data[5]=0x%02x,data[6]=0x%02x)%s", prefix, type, action->type, action->priv.data[0], action->priv.data[1], action->priv.data[2], action->priv.data[3], action->priv.data[4], action->priv.data[5], action->priv.data[6], suffix); break; } return true; } static bool write_compat(struct xkb_keymap *keymap, struct buf *buf) { const struct xkb_led *led; if (keymap->compat_section_name) write_buf(buf, "xkb_compatibility \"%s\" {\n", keymap->compat_section_name); else write_buf(buf, "xkb_compatibility {\n"); write_vmods(keymap, buf); write_buf(buf, "\tinterpret.useModMapMods= AnyLevel;\n"); write_buf(buf, "\tinterpret.repeat= False;\n"); for (unsigned i = 0; i < keymap->num_sym_interprets; i++) { const struct xkb_sym_interpret *si = &keymap->sym_interprets[i]; write_buf(buf, "\tinterpret %s+%s(%s) {\n", si->sym ? KeysymText(keymap->ctx, si->sym) : "Any", SIMatchText(si->match), ModMaskText(keymap->ctx, &keymap->mods, si->mods)); if (si->virtual_mod != XKB_MOD_INVALID) write_buf(buf, "\t\tvirtualModifier= %s;\n", ModIndexText(keymap->ctx, &keymap->mods, si->virtual_mod)); if (si->level_one_only) write_buf(buf, "\t\tuseModMapMods=level1;\n"); if (si->repeat) write_buf(buf, "\t\trepeat= True;\n"); write_action(keymap, buf, &si->action, "\t\taction= ", ";\n"); write_buf(buf, "\t};\n"); } xkb_leds_foreach(led, keymap) if (led->which_groups || led->groups || led->which_mods || led->mods.mods || led->ctrls) write_led_map(keymap, buf, led); write_buf(buf, "};\n\n"); return true; } static bool write_keysyms(struct xkb_keymap *keymap, struct buf *buf, const struct xkb_key *key, xkb_layout_index_t group) { for (xkb_level_index_t level = 0; level < XkbKeyNumLevels(key, group); level++) { const xkb_keysym_t *syms; int num_syms; if (level != 0) write_buf(buf, ", "); num_syms = xkb_keymap_key_get_syms_by_level(keymap, key->keycode, group, level, &syms); if (num_syms == 0) { write_buf(buf, "%15s", "NoSymbol"); } else if (num_syms == 1) { write_buf(buf, "%15s", KeysymText(keymap->ctx, syms[0])); } else { write_buf(buf, "{ "); for (int s = 0; s < num_syms; s++) { if (s != 0) write_buf(buf, ", "); write_buf(buf, "%s", KeysymText(keymap->ctx, syms[s])); } write_buf(buf, " }"); } } return true; } static bool write_key(struct xkb_keymap *keymap, struct buf *buf, const struct xkb_key *key) { xkb_layout_index_t group; bool simple = true; bool explicit_types = false; bool multi_type = false; bool show_actions; write_buf(buf, "\tkey %-20s {", KeyNameText(keymap->ctx, key->name)); for (group = 0; group < key->num_groups; group++) { if (key->groups[group].explicit_type) explicit_types = true; if (group != 0 && key->groups[group].type != key->groups[0].type) multi_type = true; } if (explicit_types) { const struct xkb_key_type *type; simple = false; if (multi_type) { for (group = 0; group < key->num_groups; group++) { if (!key->groups[group].explicit_type) continue; type = key->groups[group].type; write_buf(buf, "\n\t\ttype[Group%u]= \"%s\",", group + 1, xkb_atom_text(keymap->ctx, type->name)); } } else { type = key->groups[0].type; write_buf(buf, "\n\t\ttype= \"%s\",", xkb_atom_text(keymap->ctx, type->name)); } } if (key->explicit & EXPLICIT_REPEAT) { if (key->repeats) write_buf(buf, "\n\t\trepeat= Yes,"); else write_buf(buf, "\n\t\trepeat= No,"); simple = false; } if (key->vmodmap && (key->explicit & EXPLICIT_VMODMAP)) write_buf(buf, "\n\t\tvirtualMods= %s,", ModMaskText(keymap->ctx, &keymap->mods, key->vmodmap)); switch (key->out_of_range_group_action) { case RANGE_SATURATE: write_buf(buf, "\n\t\tgroupsClamp,"); break; case RANGE_REDIRECT: write_buf(buf, "\n\t\tgroupsRedirect= Group%u,", key->out_of_range_group_number + 1); break; default: break; } show_actions = (key->explicit & EXPLICIT_INTERP); if (key->num_groups > 1 || show_actions) simple = false; if (simple) { write_buf(buf, "\t[ "); if (!write_keysyms(keymap, buf, key, 0)) return false; write_buf(buf, " ] };\n"); } else { xkb_level_index_t level; for (group = 0; group < key->num_groups; group++) { if (group != 0) write_buf(buf, ","); write_buf(buf, "\n\t\tsymbols[Group%u]= [ ", group + 1); if (!write_keysyms(keymap, buf, key, group)) return false; write_buf(buf, " ]"); if (show_actions) { write_buf(buf, ",\n\t\tactions[Group%u]= [ ", group + 1); for (level = 0; level < XkbKeyNumLevels(key, group); level++) { if (level != 0) write_buf(buf, ", "); write_action(keymap, buf, &key->groups[group].levels[level].action, NULL, NULL); } write_buf(buf, " ]"); } } write_buf(buf, "\n\t};\n"); } return true; } static bool write_symbols(struct xkb_keymap *keymap, struct buf *buf) { const struct xkb_key *key; xkb_layout_index_t group; xkb_mod_index_t i; const struct xkb_mod *mod; if (keymap->symbols_section_name) write_buf(buf, "xkb_symbols \"%s\" {\n", keymap->symbols_section_name); else write_buf(buf, "xkb_symbols {\n"); for (group = 0; group < keymap->num_group_names; group++) if (keymap->group_names[group]) write_buf(buf, "\tname[Group%u]=\"%s\";\n", group + 1, xkb_atom_text(keymap->ctx, keymap->group_names[group])); if (group > 0) write_buf(buf, "\n"); xkb_keys_foreach(key, keymap) if (key->num_groups > 0) write_key(keymap, buf, key); xkb_mods_enumerate(i, mod, &keymap->mods) { bool had_any = false; xkb_keys_foreach(key, keymap) { if (key->modmap & (1u << i)) { if (!had_any) write_buf(buf, "\tmodifier_map %s { ", xkb_atom_text(keymap->ctx, mod->name)); write_buf(buf, "%s%s", had_any ? ", " : "", KeyNameText(keymap->ctx, key->name)); had_any = true; } } if (had_any) write_buf(buf, " };\n"); } write_buf(buf, "};\n\n"); return true; } static bool write_keymap(struct xkb_keymap *keymap, struct buf *buf) { return (check_write_buf(buf, "xkb_keymap {\n") && write_keycodes(keymap, buf) && write_types(keymap, buf) && write_compat(keymap, buf) && write_symbols(keymap, buf) && check_write_buf(buf, "};\n")); } char * text_v1_keymap_get_as_string(struct xkb_keymap *keymap) { struct buf buf = { NULL, 0, 0 }; if (!write_keymap(keymap, &buf)) { free(buf.buf); return NULL; } return buf.buf; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.565315 libxkbcommon-0.10.0/src/xkbcomp/keymap.c0000644000175000017500000002342500000000000017531 0ustar00ranran00000000000000/* * 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: Dan Nicholson * Daniel Stone * Ran Benita */ #include "config.h" #include "xkbcomp-priv.h" static void ComputeEffectiveMask(struct xkb_keymap *keymap, struct xkb_mods *mods) { mods->mask = mod_mask_get_effective(keymap, mods->mods); } static void UpdateActionMods(struct xkb_keymap *keymap, union xkb_action *act, xkb_mod_mask_t modmap) { switch (act->type) { case ACTION_TYPE_MOD_SET: case ACTION_TYPE_MOD_LATCH: case ACTION_TYPE_MOD_LOCK: if (act->mods.flags & ACTION_MODS_LOOKUP_MODMAP) act->mods.mods.mods = modmap; ComputeEffectiveMask(keymap, &act->mods.mods); break; default: break; } } static const struct xkb_sym_interpret default_interpret = { .sym = XKB_KEY_NoSymbol, .repeat = true, .match = MATCH_ANY_OR_NONE, .mods = 0, .virtual_mod = XKB_MOD_INVALID, .action = { .type = ACTION_TYPE_NONE }, }; /** * Find an interpretation which applies to this particular level, either by * finding an exact match for the symbol and modifier combination, or a * generic XKB_KEY_NoSymbol match. */ static const struct xkb_sym_interpret * FindInterpForKey(struct xkb_keymap *keymap, const struct xkb_key *key, xkb_layout_index_t group, xkb_level_index_t level) { const xkb_keysym_t *syms; int num_syms; num_syms = xkb_keymap_key_get_syms_by_level(keymap, key->keycode, group, level, &syms); if (num_syms == 0) return NULL; /* * There may be multiple matchings interprets; we should always return * the most specific. Here we rely on compat.c to set up the * sym_interprets array from the most specific to the least specific, * such that when we find a match we return immediately. */ for (unsigned i = 0; i < keymap->num_sym_interprets; i++) { const struct xkb_sym_interpret *interp = &keymap->sym_interprets[i]; xkb_mod_mask_t mods; bool found = false; if ((num_syms > 1 || interp->sym != syms[0]) && interp->sym != XKB_KEY_NoSymbol) continue; if (interp->level_one_only && level != 0) mods = 0; else mods = key->modmap; switch (interp->match) { case MATCH_NONE: found = !(interp->mods & mods); break; case MATCH_ANY_OR_NONE: found = (!mods || (interp->mods & mods)); break; case MATCH_ANY: found = (interp->mods & mods); break; case MATCH_ALL: found = ((interp->mods & mods) == interp->mods); break; case MATCH_EXACTLY: found = (interp->mods == mods); break; } if (found) return interp; } return &default_interpret; } static bool ApplyInterpsToKey(struct xkb_keymap *keymap, struct xkb_key *key) { xkb_mod_mask_t vmodmap = 0; xkb_layout_index_t group; xkb_level_index_t level; /* If we've been told not to bind interps to this key, then don't. */ if (key->explicit & EXPLICIT_INTERP) return true; for (group = 0; group < key->num_groups; group++) { for (level = 0; level < XkbKeyNumLevels(key, group); level++) { const struct xkb_sym_interpret *interp; interp = FindInterpForKey(keymap, key, group, level); if (!interp) continue; /* Infer default key behaviours from the base level. */ if (group == 0 && level == 0) if (!(key->explicit & EXPLICIT_REPEAT) && interp->repeat) key->repeats = true; if ((group == 0 && level == 0) || !interp->level_one_only) if (interp->virtual_mod != XKB_MOD_INVALID) vmodmap |= (1u << interp->virtual_mod); if (interp->action.type != ACTION_TYPE_NONE) key->groups[group].levels[level].action = interp->action; } } if (!(key->explicit & EXPLICIT_VMODMAP)) key->vmodmap = vmodmap; return true; } /** * This collects a bunch of disparate functions which was done in the server * at various points that really should've been done within xkbcomp. Turns out * your actions and types are a lot more useful when any of your modifiers * other than Shift actually do something ... */ static bool UpdateDerivedKeymapFields(struct xkb_keymap *keymap) { struct xkb_key *key; struct xkb_mod *mod; struct xkb_led *led; unsigned int i, j; /* Find all the interprets for the key and bind them to actions, * which will also update the vmodmap. */ xkb_keys_foreach(key, keymap) if (!ApplyInterpsToKey(keymap, key)) return false; /* Update keymap->mods, the virtual -> real mod mapping. */ xkb_keys_foreach(key, keymap) xkb_mods_enumerate(i, mod, &keymap->mods) if (key->vmodmap & (1u << i)) mod->mapping |= key->modmap; /* Now update the level masks for all the types to reflect the vmods. */ for (i = 0; i < keymap->num_types; i++) { ComputeEffectiveMask(keymap, &keymap->types[i].mods); for (j = 0; j < keymap->types[i].num_entries; j++) { ComputeEffectiveMask(keymap, &keymap->types[i].entries[j].mods); ComputeEffectiveMask(keymap, &keymap->types[i].entries[j].preserve); } } /* Update action modifiers. */ xkb_keys_foreach(key, keymap) for (i = 0; i < key->num_groups; i++) for (j = 0; j < XkbKeyNumLevels(key, i); j++) UpdateActionMods(keymap, &key->groups[i].levels[j].action, key->modmap); /* Update vmod -> led maps. */ xkb_leds_foreach(led, keymap) ComputeEffectiveMask(keymap, &led->mods); /* Find maximum number of groups out of all keys in the keymap. */ xkb_keys_foreach(key, keymap) keymap->num_groups = MAX(keymap->num_groups, key->num_groups); return true; } typedef bool (*compile_file_fn)(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge); static const compile_file_fn compile_file_fns[LAST_KEYMAP_FILE_TYPE + 1] = { [FILE_TYPE_KEYCODES] = CompileKeycodes, [FILE_TYPE_TYPES] = CompileKeyTypes, [FILE_TYPE_COMPAT] = CompileCompatMap, [FILE_TYPE_SYMBOLS] = CompileSymbols, }; bool CompileKeymap(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge) { bool ok; XkbFile *files[LAST_KEYMAP_FILE_TYPE + 1] = { NULL }; enum xkb_file_type type; struct xkb_context *ctx = keymap->ctx; /* Collect section files and check for duplicates. */ for (file = (XkbFile *) file->defs; file; file = (XkbFile *) file->common.next) { if (file->file_type < FIRST_KEYMAP_FILE_TYPE || file->file_type > LAST_KEYMAP_FILE_TYPE) { if (file->file_type == FILE_TYPE_GEOMETRY) { log_vrb(ctx, 1, "Geometry sections are not supported; ignoring\n"); } else { log_err(ctx, "Cannot define %s in a keymap file\n", xkb_file_type_to_string(file->file_type)); } continue; } if (files[file->file_type]) { log_err(ctx, "More than one %s section in keymap file; " "All sections after the first ignored\n", xkb_file_type_to_string(file->file_type)); continue; } files[file->file_type] = file; } /* * Check that all required section were provided. * Report everything before failing. */ ok = true; for (type = FIRST_KEYMAP_FILE_TYPE; type <= LAST_KEYMAP_FILE_TYPE; type++) { if (files[type] == NULL) { log_err(ctx, "Required section %s missing from keymap\n", xkb_file_type_to_string(type)); ok = false; } } if (!ok) return false; /* Compile sections. */ for (type = FIRST_KEYMAP_FILE_TYPE; type <= LAST_KEYMAP_FILE_TYPE; type++) { log_dbg(ctx, "Compiling %s \"%s\"\n", xkb_file_type_to_string(type), files[type]->name); ok = compile_file_fns[type](files[type], keymap, merge); if (!ok) { log_err(ctx, "Failed to compile %s\n", xkb_file_type_to_string(type)); return false; } } return UpdateDerivedKeymapFields(keymap); } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.575315 libxkbcommon-0.10.0/src/xkbcomp/keywords.c0000644000175000017500000003727100000000000020116 0ustar00ranran00000000000000/* ANSI-C code produced by gperf version 3.1 */ /* Command-line: gperf src/xkbcomp/keywords.gperf */ /* Computed positions: -k'1-2,5' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #line 1 "src/xkbcomp/keywords.gperf" #include "config.h" #include "xkbcomp-priv.h" #include "parser-priv.h" static const struct keyword_tok * keyword_gperf_lookup (register const char *str, register size_t len); #line 11 "src/xkbcomp/keywords.gperf" struct keyword_tok { int name; int tok; }; #include /* maximum key range = 70, duplicates = 0 */ #ifndef GPERF_DOWNCASE #define GPERF_DOWNCASE 1 static unsigned char gperf_downcase[256] = { 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 }; #endif #ifndef GPERF_CASE_STRCMP #define GPERF_CASE_STRCMP 1 static int gperf_case_strcmp (register const char *s1, register const char *s2) { for (;;) { unsigned char c1 = gperf_downcase[(unsigned char)*s1++]; unsigned char c2 = gperf_downcase[(unsigned char)*s2++]; if (c1 != 0 && c1 == c2) continue; return (int)c1 - (int)c2; } } #endif #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int keyword_gperf_hash (register const char *str, register size_t len) { static const unsigned char asso_values[] = { 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 0, 73, 5, 36, 0, 10, 1, 15, 15, 73, 0, 10, 20, 35, 20, 50, 73, 10, 10, 5, 0, 15, 73, 0, 15, 73, 73, 73, 73, 73, 73, 73, 0, 73, 5, 36, 0, 10, 1, 15, 15, 73, 0, 10, 20, 35, 20, 50, 73, 10, 10, 5, 0, 15, 73, 0, 15, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73 }; register unsigned int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[4]]; /*FALLTHROUGH*/ case 4: case 3: case 2: hval += asso_values[(unsigned char)str[1]]; /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval; } struct stringpool_t { char stringpool_str3[sizeof("key")]; char stringpool_str4[sizeof("keys")]; char stringpool_str7[sizeof("augment")]; char stringpool_str9[sizeof("text")]; char stringpool_str10[sizeof("xkb_keymap")]; char stringpool_str11[sizeof("keypad_keys")]; char stringpool_str12[sizeof("xkb_keycodes")]; char stringpool_str13[sizeof("xkb_geometry")]; char stringpool_str14[sizeof("xkb_types")]; char stringpool_str15[sizeof("xkb_compat")]; char stringpool_str17[sizeof("replace")]; char stringpool_str19[sizeof("xkb_compat_map")]; char stringpool_str20[sizeof("xkb_layout")]; char stringpool_str21[sizeof("xkb_symbols")]; char stringpool_str22[sizeof("xkb_compatibility")]; char stringpool_str23[sizeof("xkb_semantics")]; char stringpool_str24[sizeof("type")]; char stringpool_str25[sizeof("alias")]; char stringpool_str26[sizeof("xkb_compatibility_map")]; char stringpool_str27[sizeof("alphanumeric_keys")]; char stringpool_str28[sizeof("function_keys")]; char stringpool_str29[sizeof("alternate")]; char stringpool_str30[sizeof("shape")]; char stringpool_str31[sizeof("action")]; char stringpool_str32[sizeof("section")]; char stringpool_str33[sizeof("row")]; char stringpool_str34[sizeof("logo")]; char stringpool_str35[sizeof("alternate_group")]; char stringpool_str36[sizeof("hidden")]; char stringpool_str37[sizeof("virtual")]; char stringpool_str42[sizeof("outline")]; char stringpool_str43[sizeof("default")]; char stringpool_str46[sizeof("modmap")]; char stringpool_str47[sizeof("virtual_modifiers")]; char stringpool_str52[sizeof("overlay")]; char stringpool_str53[sizeof("override")]; char stringpool_str57[sizeof("include")]; char stringpool_str62[sizeof("modifier_map")]; char stringpool_str63[sizeof("modifier_keys")]; char stringpool_str64[sizeof("indicator")]; char stringpool_str66[sizeof("group")]; char stringpool_str67[sizeof("mod_map")]; char stringpool_str69[sizeof("interpret")]; char stringpool_str71[sizeof("solid")]; char stringpool_str72[sizeof("partial")]; }; static const struct stringpool_t stringpool_contents = { "key", "keys", "augment", "text", "xkb_keymap", "keypad_keys", "xkb_keycodes", "xkb_geometry", "xkb_types", "xkb_compat", "replace", "xkb_compat_map", "xkb_layout", "xkb_symbols", "xkb_compatibility", "xkb_semantics", "type", "alias", "xkb_compatibility_map", "alphanumeric_keys", "function_keys", "alternate", "shape", "action", "section", "row", "logo", "alternate_group", "hidden", "virtual", "outline", "default", "modmap", "virtual_modifiers", "overlay", "override", "include", "modifier_map", "modifier_keys", "indicator", "group", "mod_map", "interpret", "solid", "partial" }; #define stringpool ((const char *) &stringpool_contents) const struct keyword_tok * keyword_gperf_lookup (register const char *str, register size_t len) { enum { TOTAL_KEYWORDS = 45, MIN_WORD_LENGTH = 3, MAX_WORD_LENGTH = 21, MIN_HASH_VALUE = 3, MAX_HASH_VALUE = 72 }; static const struct keyword_tok wordlist[] = { {-1}, {-1}, {-1}, #line 37 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str3, KEY}, #line 38 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str4, KEYS}, {-1}, {-1}, #line 28 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str7, AUGMENT}, {-1}, #line 53 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str9, TEXT}, #line 63 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str10, XKB_KEYMAP}, #line 36 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str11, KEYPAD_KEYS}, #line 62 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str12, XKB_KEYCODES}, #line 61 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str13, XKB_GEOMETRY}, #line 67 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str14, XKB_TYPES}, #line 60 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str15, XKB_COMPATMAP}, {-1}, #line 48 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str17, REPLACE}, {-1}, #line 59 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str19, XKB_COMPATMAP}, #line 64 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str20, XKB_LAYOUT}, #line 66 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str21, XKB_SYMBOLS}, #line 58 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str22, XKB_COMPATMAP}, #line 65 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str23, XKB_SEMANTICS}, #line 54 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str24, TYPE}, #line 24 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str25, ALIAS}, #line 57 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str26, XKB_COMPATMAP}, #line 25 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str27, ALPHANUMERIC_KEYS}, #line 30 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str28, FUNCTION_KEYS}, #line 27 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str29, ALTERNATE}, #line 51 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str30, SHAPE}, #line 23 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str31, ACTION_TOK}, #line 50 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str32, SECTION}, #line 49 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str33, ROW}, #line 39 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str34, LOGO}, #line 26 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str35, ALTERNATE_GROUP}, #line 32 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str36, HIDDEN}, #line 56 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str37, VIRTUAL}, {-1}, {-1}, {-1}, {-1}, #line 44 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str42, OUTLINE}, #line 29 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str43, DEFAULT}, {-1}, {-1}, #line 43 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str46, MODIFIER_MAP}, #line 55 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str47, VIRTUAL_MODS}, {-1}, {-1}, {-1}, {-1}, #line 45 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str52, OVERLAY}, #line 46 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str53, OVERRIDE}, {-1}, {-1}, {-1}, #line 33 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str57, INCLUDE}, {-1}, {-1}, {-1}, {-1}, #line 41 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str62, MODIFIER_MAP}, #line 40 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str63, MODIFIER_KEYS}, #line 34 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str64, INDICATOR}, {-1}, #line 31 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str66, GROUP}, #line 42 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str67, MODIFIER_MAP}, {-1}, #line 35 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str69, INTERPRET}, {-1}, #line 52 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str71, SOLID}, #line 47 "src/xkbcomp/keywords.gperf" {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str72, PARTIAL} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = keyword_gperf_hash (str, len); if (key <= MAX_HASH_VALUE) { register int o = wordlist[key].name; if (o >= 0) { register const char *s = o + stringpool; if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strcmp (str, s)) return &wordlist[key]; } } } return 0; } #line 68 "src/xkbcomp/keywords.gperf" int keyword_to_token(const char *string, size_t len) { const struct keyword_tok *kt = keyword_gperf_lookup(string, len); if (!kt) return -1; return kt->tok; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.588648 libxkbcommon-0.10.0/src/xkbcomp/keywords.gperf0000644000175000017500000000410600000000000020766 0ustar00ranran00000000000000%{ #include "config.h" #include "xkbcomp-priv.h" #include "parser-priv.h" static const struct keyword_tok * keyword_gperf_lookup (register const char *str, register size_t len); %} struct keyword_tok { int name; int tok; }; %language=ANSI-C %define hash-function-name keyword_gperf_hash %define lookup-function-name keyword_gperf_lookup %readonly-tables %enum %includes %struct-type %pic %ignore-case %% action, ACTION_TOK alias, ALIAS alphanumeric_keys, ALPHANUMERIC_KEYS alternate_group, ALTERNATE_GROUP alternate, ALTERNATE augment, AUGMENT default, DEFAULT function_keys, FUNCTION_KEYS group, GROUP hidden, HIDDEN include, INCLUDE indicator, INDICATOR interpret, INTERPRET keypad_keys, KEYPAD_KEYS key, KEY keys, KEYS logo, LOGO modifier_keys, MODIFIER_KEYS modifier_map, MODIFIER_MAP mod_map, MODIFIER_MAP modmap, MODIFIER_MAP outline, OUTLINE overlay, OVERLAY override, OVERRIDE partial, PARTIAL replace, REPLACE row, ROW section, SECTION shape, SHAPE solid, SOLID text, TEXT type, TYPE virtual_modifiers, VIRTUAL_MODS virtual, VIRTUAL xkb_compatibility_map, XKB_COMPATMAP xkb_compatibility, XKB_COMPATMAP xkb_compat_map, XKB_COMPATMAP xkb_compat, XKB_COMPATMAP xkb_geometry, XKB_GEOMETRY xkb_keycodes, XKB_KEYCODES xkb_keymap, XKB_KEYMAP xkb_layout, XKB_LAYOUT xkb_semantics, XKB_SEMANTICS xkb_symbols, XKB_SYMBOLS xkb_types, XKB_TYPES %% int keyword_to_token(const char *string, size_t len) { const struct keyword_tok *kt = keyword_gperf_lookup(string, len); if (!kt) return -1; return kt->tok; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.5919814 libxkbcommon-0.10.0/src/xkbcomp/parser-priv.h0000644000175000017500000000322300000000000020514 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ #ifndef XKBCOMP_PARSER_PRIV_H #define XKBCOMP_PARSER_PRIV_H struct parser_param; struct scanner; #include "parser.h" int _xkbcommon_lex(YYSTYPE *yylval, struct scanner *scanner); XkbFile * parse(struct xkb_context *ctx, struct scanner *scanner, const char *map); int keyword_to_token(const char *string, size_t len); #endif ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.5919814 libxkbcommon-0.10.0/src/xkbcomp/parser.y0000644000175000017500000007503300000000000017567 0ustar00ranran00000000000000/************************************************************ 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. ********************************************************/ /* * The parser should work with reasonably recent versions of either * bison or byacc. So if you make changes, try to make sure it works * in both! */ %{ #include "config.h" #include "xkbcomp/xkbcomp-priv.h" #include "xkbcomp/ast-build.h" #include "xkbcomp/parser-priv.h" #include "scanner-utils.h" struct parser_param { struct xkb_context *ctx; struct scanner *scanner; XkbFile *rtrn; bool more_maps; }; #define parser_err(param, fmt, ...) \ scanner_err((param)->scanner, fmt, ##__VA_ARGS__) #define parser_warn(param, fmt, ...) \ scanner_warn((param)->scanner, fmt, ##__VA_ARGS__) static void _xkbcommon_error(struct parser_param *param, const char *msg) { parser_err(param, "%s", msg); } static bool resolve_keysym(const char *name, xkb_keysym_t *sym_rtrn) { xkb_keysym_t sym; if (!name || istreq(name, "any") || istreq(name, "nosymbol")) { *sym_rtrn = XKB_KEY_NoSymbol; return true; } if (istreq(name, "none") || istreq(name, "voidsymbol")) { *sym_rtrn = XKB_KEY_VoidSymbol; return true; } sym = xkb_keysym_from_name(name, XKB_KEYSYM_NO_FLAGS); if (sym != XKB_KEY_NoSymbol) { *sym_rtrn = sym; return true; } return false; } #define param_scanner param->scanner %} %pure-parser %lex-param { struct scanner *param_scanner } %parse-param { struct parser_param *param } %token END_OF_FILE 0 ERROR_TOK 255 XKB_KEYMAP 1 XKB_KEYCODES 2 XKB_TYPES 3 XKB_SYMBOLS 4 XKB_COMPATMAP 5 XKB_GEOMETRY 6 XKB_SEMANTICS 7 XKB_LAYOUT 8 INCLUDE 10 OVERRIDE 11 AUGMENT 12 REPLACE 13 ALTERNATE 14 VIRTUAL_MODS 20 TYPE 21 INTERPRET 22 ACTION_TOK 23 KEY 24 ALIAS 25 GROUP 26 MODIFIER_MAP 27 INDICATOR 28 SHAPE 29 KEYS 30 ROW 31 SECTION 32 OVERLAY 33 TEXT 34 OUTLINE 35 SOLID 36 LOGO 37 VIRTUAL 38 EQUALS 40 PLUS 41 MINUS 42 DIVIDE 43 TIMES 44 OBRACE 45 CBRACE 46 OPAREN 47 CPAREN 48 OBRACKET 49 CBRACKET 50 DOT 51 COMMA 52 SEMI 53 EXCLAM 54 INVERT 55 STRING 60 INTEGER 61 FLOAT 62 IDENT 63 KEYNAME 64 PARTIAL 70 DEFAULT 71 HIDDEN 72 ALPHANUMERIC_KEYS 73 MODIFIER_KEYS 74 KEYPAD_KEYS 75 FUNCTION_KEYS 76 ALTERNATE_GROUP 77 %right EQUALS %left PLUS MINUS %left TIMES DIVIDE %left EXCLAM INVERT %left OPAREN %start XkbFile %union { int64_t num; enum xkb_file_type file_type; char *str; xkb_atom_t atom; enum merge_mode merge; enum xkb_map_flags mapFlags; xkb_keysym_t keysym; ParseCommon *any; struct { ParseCommon *head; ParseCommon *last; } anyList; ExprDef *expr; struct { ExprDef *head; ExprDef *last; } exprList; VarDef *var; struct { VarDef *head; VarDef *last; } varList; VModDef *vmod; struct { VModDef *head; VModDef *last; } vmodList; InterpDef *interp; KeyTypeDef *keyType; SymbolsDef *syms; ModMapDef *modMask; GroupCompatDef *groupCompat; LedMapDef *ledMap; LedNameDef *ledName; KeycodeDef *keyCode; KeyAliasDef *keyAlias; void *geom; XkbFile *file; struct { XkbFile *head; XkbFile *last; } fileList; } %type INTEGER FLOAT %type IDENT STRING %type KEYNAME %type KeyCode Number Integer Float SignedNumber DoodadType %type MergeMode OptMergeMode %type XkbCompositeType FileType %type Flag Flags OptFlags %type MapName OptMapName %type FieldSpec Ident Element String %type KeySym %type Decl %type DeclList %type Expr Term Lhs Terminal ArrayInit KeySyms %type OptKeySymList KeySymList Action Coord CoordList %type OptExprList ExprList ActionList %type VarDecl SymbolsVarDecl %type VarDeclList SymbolsBody %type VModDef %type VModDefList VModDecl %type InterpretDecl InterpretMatch %type KeyTypeDecl %type SymbolsDecl %type ModMapDecl %type GroupCompatDecl %type LedMapDecl %type LedNameDecl %type KeyNameDecl %type KeyAliasDecl %type ShapeDecl SectionDecl SectionBody SectionBodyItem RowBody RowBodyItem %type Keys Key OverlayDecl OverlayKeyList OverlayKey OutlineList OutlineInList %type DoodadDecl %type XkbFile XkbMapConfig %type XkbMapConfigList %type XkbCompositeMap %destructor { FreeStmt((ParseCommon *) $$); } %destructor { FreeStmt((ParseCommon *) $$.head); } /* The destructor also runs on the start symbol when the parser *succeeds*. * The `if` here catches this case. */ %destructor { if (!param->rtrn) FreeXkbFile($$); } %destructor { FreeXkbFile($$.head); } %destructor { free($$); } %% /* * An actual file may contain more than one map. However, if we do things * in the normal yacc way, i.e. aggregate all of the maps into a list and * let the caller find the map it wants, we end up scanning and parsing a * lot of unneeded maps (in the end we always just need one). * Instead of doing that, we make yyparse return one map at a time, and * then call it repeatedly until we find the map we need. Once we find it, * we don't need to parse everything that follows in the file. * This does mean that if we e.g. always use the first map, the file may * contain complete garbage after that. But it's worth it. */ XkbFile : XkbCompositeMap { $$ = param->rtrn = $1; param->more_maps = !!param->rtrn; } | XkbMapConfig { $$ = param->rtrn = $1; param->more_maps = !!param->rtrn; YYACCEPT; } | END_OF_FILE { $$ = param->rtrn = NULL; param->more_maps = false; } ; XkbCompositeMap : OptFlags XkbCompositeType OptMapName OBRACE XkbMapConfigList CBRACE SEMI { $$ = XkbFileCreate($2, $3, (ParseCommon *) $5.head, $1); } ; XkbCompositeType: XKB_KEYMAP { $$ = FILE_TYPE_KEYMAP; } | XKB_SEMANTICS { $$ = FILE_TYPE_KEYMAP; } | XKB_LAYOUT { $$ = FILE_TYPE_KEYMAP; } ; XkbMapConfigList : XkbMapConfigList XkbMapConfig { $$.head = $1.head; $$.last->common.next = &$2->common; $$.last = $2; } | XkbMapConfig { $$.head = $$.last = $1; } ; XkbMapConfig : OptFlags FileType OptMapName OBRACE DeclList CBRACE SEMI { $$ = XkbFileCreate($2, $3, $5.head, $1); } ; FileType : XKB_KEYCODES { $$ = FILE_TYPE_KEYCODES; } | XKB_TYPES { $$ = FILE_TYPE_TYPES; } | XKB_COMPATMAP { $$ = FILE_TYPE_COMPAT; } | XKB_SYMBOLS { $$ = FILE_TYPE_SYMBOLS; } | XKB_GEOMETRY { $$ = FILE_TYPE_GEOMETRY; } ; OptFlags : Flags { $$ = $1; } | { $$ = 0; } ; Flags : Flags Flag { $$ = ($1 | $2); } | Flag { $$ = $1; } ; Flag : PARTIAL { $$ = MAP_IS_PARTIAL; } | DEFAULT { $$ = MAP_IS_DEFAULT; } | HIDDEN { $$ = MAP_IS_HIDDEN; } | ALPHANUMERIC_KEYS { $$ = MAP_HAS_ALPHANUMERIC; } | MODIFIER_KEYS { $$ = MAP_HAS_MODIFIER; } | KEYPAD_KEYS { $$ = MAP_HAS_KEYPAD; } | FUNCTION_KEYS { $$ = MAP_HAS_FN; } | ALTERNATE_GROUP { $$ = MAP_IS_ALTGR; } ; DeclList : DeclList Decl { if ($2) { if ($1.head) { $$.head = $1.head; $1.last->next = $2; $$.last = $2; } else { $$.head = $$.last = $2; } } } /* * VModDecl is "inlined" directly into DeclList, i.e. * each VModDef in the VModDecl is a separate Decl in * the File. */ | DeclList OptMergeMode VModDecl { for (VModDef *vmod = $3.head; vmod; vmod = (VModDef *) vmod->common.next) vmod->merge = $2; if ($1.head) { $$.head = $1.head; $1.last->next = &$3.head->common; $$.last = &$3.last->common; } else { $$.head = &$3.head->common; $$.last = &$3.last->common; } } | { $$.head = $$.last = NULL; } ; Decl : OptMergeMode VarDecl { $2->merge = $1; $$ = (ParseCommon *) $2; } /* OptMergeMode VModDecl - see above. */ | OptMergeMode InterpretDecl { $2->merge = $1; $$ = (ParseCommon *) $2; } | OptMergeMode KeyNameDecl { $2->merge = $1; $$ = (ParseCommon *) $2; } | OptMergeMode KeyAliasDecl { $2->merge = $1; $$ = (ParseCommon *) $2; } | OptMergeMode KeyTypeDecl { $2->merge = $1; $$ = (ParseCommon *) $2; } | OptMergeMode SymbolsDecl { $2->merge = $1; $$ = (ParseCommon *) $2; } | OptMergeMode ModMapDecl { $2->merge = $1; $$ = (ParseCommon *) $2; } | OptMergeMode GroupCompatDecl { $2->merge = $1; $$ = (ParseCommon *) $2; } | OptMergeMode LedMapDecl { $2->merge = $1; $$ = (ParseCommon *) $2; } | OptMergeMode LedNameDecl { $2->merge = $1; $$ = (ParseCommon *) $2; } | OptMergeMode ShapeDecl { $$ = NULL; } | OptMergeMode SectionDecl { $$ = NULL; } | OptMergeMode DoodadDecl { $$ = NULL; } | MergeMode STRING { $$ = (ParseCommon *) IncludeCreate(param->ctx, $2, $1); free($2); } ; VarDecl : Lhs EQUALS Expr SEMI { $$ = VarCreate($1, $3); } | Ident SEMI { $$ = BoolVarCreate($1, true); } | EXCLAM Ident SEMI { $$ = BoolVarCreate($2, false); } ; KeyNameDecl : KEYNAME EQUALS KeyCode SEMI { $$ = KeycodeCreate($1, $3); } ; KeyAliasDecl : ALIAS KEYNAME EQUALS KEYNAME SEMI { $$ = KeyAliasCreate($2, $4); } ; VModDecl : VIRTUAL_MODS VModDefList SEMI { $$ = $2; } ; VModDefList : VModDefList COMMA VModDef { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; } | VModDef { $$.head = $$.last = $1; } ; VModDef : Ident { $$ = VModCreate($1, NULL); } | Ident EQUALS Expr { $$ = VModCreate($1, $3); } ; InterpretDecl : INTERPRET InterpretMatch OBRACE VarDeclList CBRACE SEMI { $2->def = $4.head; $$ = $2; } ; InterpretMatch : KeySym PLUS Expr { $$ = InterpCreate($1, $3); } | KeySym { $$ = InterpCreate($1, NULL); } ; VarDeclList : VarDeclList VarDecl { $$.head = $1.head; $$.last->common.next = &$2->common; $$.last = $2; } | VarDecl { $$.head = $$.last = $1; } ; KeyTypeDecl : TYPE String OBRACE VarDeclList CBRACE SEMI { $$ = KeyTypeCreate($2, $4.head); } ; SymbolsDecl : KEY KEYNAME OBRACE SymbolsBody CBRACE SEMI { $$ = SymbolsCreate($2, $4.head); } ; SymbolsBody : SymbolsBody COMMA SymbolsVarDecl { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; } | SymbolsVarDecl { $$.head = $$.last = $1; } | { $$.head = $$.last = NULL; } ; SymbolsVarDecl : Lhs EQUALS Expr { $$ = VarCreate($1, $3); } | Lhs EQUALS ArrayInit { $$ = VarCreate($1, $3); } | Ident { $$ = BoolVarCreate($1, true); } | EXCLAM Ident { $$ = BoolVarCreate($2, false); } | ArrayInit { $$ = VarCreate(NULL, $1); } ; ArrayInit : OBRACKET OptKeySymList CBRACKET { $$ = $2; } | OBRACKET ActionList CBRACKET { $$ = ExprCreateActionList($2.head); } ; GroupCompatDecl : GROUP Integer EQUALS Expr SEMI { $$ = GroupCompatCreate($2, $4); } ; ModMapDecl : MODIFIER_MAP Ident OBRACE ExprList CBRACE SEMI { $$ = ModMapCreate($2, $4.head); } ; LedMapDecl: INDICATOR String OBRACE VarDeclList CBRACE SEMI { $$ = LedMapCreate($2, $4.head); } ; LedNameDecl: INDICATOR Integer EQUALS Expr SEMI { $$ = LedNameCreate($2, $4, false); } | VIRTUAL INDICATOR Integer EQUALS Expr SEMI { $$ = LedNameCreate($3, $5, true); } ; ShapeDecl : SHAPE String OBRACE OutlineList CBRACE SEMI { $$ = NULL; } | SHAPE String OBRACE CoordList CBRACE SEMI { (void) $4; $$ = NULL; } ; SectionDecl : SECTION String OBRACE SectionBody CBRACE SEMI { $$ = NULL; } ; SectionBody : SectionBody SectionBodyItem { $$ = NULL;} | SectionBodyItem { $$ = NULL; } ; SectionBodyItem : ROW OBRACE RowBody CBRACE SEMI { $$ = NULL; } | VarDecl { FreeStmt((ParseCommon *) $1); $$ = NULL; } | DoodadDecl { $$ = NULL; } | LedMapDecl { FreeStmt((ParseCommon *) $1); $$ = NULL; } | OverlayDecl { $$ = NULL; } ; RowBody : RowBody RowBodyItem { $$ = NULL;} | RowBodyItem { $$ = NULL; } ; RowBodyItem : KEYS OBRACE Keys CBRACE SEMI { $$ = NULL; } | VarDecl { FreeStmt((ParseCommon *) $1); $$ = NULL; } ; Keys : Keys COMMA Key { $$ = NULL; } | Key { $$ = NULL; } ; Key : KEYNAME { $$ = NULL; } | OBRACE ExprList CBRACE { FreeStmt((ParseCommon *) $2.head); $$ = NULL; } ; OverlayDecl : OVERLAY String OBRACE OverlayKeyList CBRACE SEMI { $$ = NULL; } ; OverlayKeyList : OverlayKeyList COMMA OverlayKey { $$ = NULL; } | OverlayKey { $$ = NULL; } ; OverlayKey : KEYNAME EQUALS KEYNAME { $$ = NULL; } ; OutlineList : OutlineList COMMA OutlineInList { $$ = NULL;} | OutlineInList { $$ = NULL; } ; OutlineInList : OBRACE CoordList CBRACE { (void) $2; $$ = NULL; } | Ident EQUALS OBRACE CoordList CBRACE { (void) $4; $$ = NULL; } | Ident EQUALS Expr { FreeStmt((ParseCommon *) $3); $$ = NULL; } ; CoordList : CoordList COMMA Coord { (void) $1; (void) $3; $$ = NULL; } | Coord { (void) $1; $$ = NULL; } ; Coord : OBRACKET SignedNumber COMMA SignedNumber CBRACKET { $$ = NULL; } ; DoodadDecl : DoodadType String OBRACE VarDeclList CBRACE SEMI { FreeStmt((ParseCommon *) $4.head); $$ = NULL; } ; DoodadType : TEXT { $$ = 0; } | OUTLINE { $$ = 0; } | SOLID { $$ = 0; } | LOGO { $$ = 0; } ; FieldSpec : Ident { $$ = $1; } | Element { $$ = $1; } ; Element : ACTION_TOK { $$ = xkb_atom_intern_literal(param->ctx, "action"); } | INTERPRET { $$ = xkb_atom_intern_literal(param->ctx, "interpret"); } | TYPE { $$ = xkb_atom_intern_literal(param->ctx, "type"); } | KEY { $$ = xkb_atom_intern_literal(param->ctx, "key"); } | GROUP { $$ = xkb_atom_intern_literal(param->ctx, "group"); } | MODIFIER_MAP {$$ = xkb_atom_intern_literal(param->ctx, "modifier_map");} | INDICATOR { $$ = xkb_atom_intern_literal(param->ctx, "indicator"); } | SHAPE { $$ = xkb_atom_intern_literal(param->ctx, "shape"); } | ROW { $$ = xkb_atom_intern_literal(param->ctx, "row"); } | SECTION { $$ = xkb_atom_intern_literal(param->ctx, "section"); } | TEXT { $$ = xkb_atom_intern_literal(param->ctx, "text"); } ; OptMergeMode : MergeMode { $$ = $1; } | { $$ = MERGE_DEFAULT; } ; MergeMode : INCLUDE { $$ = MERGE_DEFAULT; } | AUGMENT { $$ = MERGE_AUGMENT; } | OVERRIDE { $$ = MERGE_OVERRIDE; } | REPLACE { $$ = MERGE_REPLACE; } | ALTERNATE { /* * This used to be MERGE_ALT_FORM. This functionality was * unused and has been removed. */ $$ = MERGE_DEFAULT; } ; OptExprList : ExprList { $$ = $1; } | { $$.head = $$.last = NULL; } ; ExprList : ExprList COMMA Expr { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; } | Expr { $$.head = $$.last = $1; } ; Expr : Expr DIVIDE Expr { $$ = ExprCreateBinary(EXPR_DIVIDE, $1, $3); } | Expr PLUS Expr { $$ = ExprCreateBinary(EXPR_ADD, $1, $3); } | Expr MINUS Expr { $$ = ExprCreateBinary(EXPR_SUBTRACT, $1, $3); } | Expr TIMES Expr { $$ = ExprCreateBinary(EXPR_MULTIPLY, $1, $3); } | Lhs EQUALS Expr { $$ = ExprCreateBinary(EXPR_ASSIGN, $1, $3); } | Term { $$ = $1; } ; Term : MINUS Term { $$ = ExprCreateUnary(EXPR_NEGATE, $2->expr.value_type, $2); } | PLUS Term { $$ = ExprCreateUnary(EXPR_UNARY_PLUS, $2->expr.value_type, $2); } | EXCLAM Term { $$ = ExprCreateUnary(EXPR_NOT, EXPR_TYPE_BOOLEAN, $2); } | INVERT Term { $$ = ExprCreateUnary(EXPR_INVERT, $2->expr.value_type, $2); } | Lhs { $$ = $1; } | FieldSpec OPAREN OptExprList CPAREN %prec OPAREN { $$ = ExprCreateAction($1, $3.head); } | Terminal { $$ = $1; } | OPAREN Expr CPAREN { $$ = $2; } ; ActionList : ActionList COMMA Action { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; } | Action { $$.head = $$.last = $1; } ; Action : FieldSpec OPAREN OptExprList CPAREN { $$ = ExprCreateAction($1, $3.head); } ; Lhs : FieldSpec { $$ = ExprCreateIdent($1); } | FieldSpec DOT FieldSpec { $$ = ExprCreateFieldRef($1, $3); } | FieldSpec OBRACKET Expr CBRACKET { $$ = ExprCreateArrayRef(XKB_ATOM_NONE, $1, $3); } | FieldSpec DOT FieldSpec OBRACKET Expr CBRACKET { $$ = ExprCreateArrayRef($1, $3, $5); } ; Terminal : String { $$ = ExprCreateString($1); } | Integer { $$ = ExprCreateInteger($1); } | Float { $$ = ExprCreateFloat(/* Discard $1 */); } | KEYNAME { $$ = ExprCreateKeyName($1); } ; OptKeySymList : KeySymList { $$ = $1; } | { $$ = NULL; } ; KeySymList : KeySymList COMMA KeySym { $$ = ExprAppendKeysymList($1, $3); } | KeySymList COMMA KeySyms { $$ = ExprAppendMultiKeysymList($1, $3); } | KeySym { $$ = ExprCreateKeysymList($1); } | KeySyms { $$ = ExprCreateMultiKeysymList($1); } ; KeySyms : OBRACE KeySymList CBRACE { $$ = $2; } ; KeySym : IDENT { if (!resolve_keysym($1, &$$)) parser_warn(param, "unrecognized keysym \"%s\"", $1); free($1); } | SECTION { $$ = XKB_KEY_section; } | Integer { if ($1 < 0) { parser_warn(param, "unrecognized keysym \"%ld\"", $1); $$ = XKB_KEY_NoSymbol; } else if ($1 < 10) { /* XKB_KEY_0 .. XKB_KEY_9 */ $$ = XKB_KEY_0 + (xkb_keysym_t) $1; } else { char buf[32]; snprintf(buf, sizeof(buf), "0x%"PRIx64, $1); if (!resolve_keysym(buf, &$$)) { parser_warn(param, "unrecognized keysym \"%s\"", buf); $$ = XKB_KEY_NoSymbol; } } } ; SignedNumber : MINUS Number { $$ = -$2; } | Number { $$ = $1; } ; Number : FLOAT { $$ = $1; } | INTEGER { $$ = $1; } ; Float : FLOAT { $$ = 0; } ; Integer : INTEGER { $$ = $1; } ; KeyCode : INTEGER { $$ = $1; } ; Ident : IDENT { $$ = xkb_atom_intern(param->ctx, $1, strlen($1)); free($1); } | DEFAULT { $$ = xkb_atom_intern_literal(param->ctx, "default"); } ; String : STRING { $$ = xkb_atom_intern(param->ctx, $1, strlen($1)); free($1); } ; OptMapName : MapName { $$ = $1; } | { $$ = NULL; } ; MapName : STRING { $$ = $1; } ; %% XkbFile * parse(struct xkb_context *ctx, struct scanner *scanner, const char *map) { int ret; XkbFile *first = NULL; struct parser_param param = { .scanner = scanner, .ctx = ctx, .rtrn = NULL, .more_maps = false, }; /* * If we got a specific map, we look for it exclusively and return * immediately upon finding it. Otherwise, we need to get the * default map. If we find a map marked as default, we return it * immediately. If there are no maps marked as default, we return * the first map in the file. */ while ((ret = yyparse(¶m)) == 0 && param.more_maps) { if (map) { if (streq_not_null(map, param.rtrn->name)) return param.rtrn; else FreeXkbFile(param.rtrn); } else { if (param.rtrn->flags & MAP_IS_DEFAULT) { FreeXkbFile(first); return param.rtrn; } else if (!first) { first = param.rtrn; } else { FreeXkbFile(param.rtrn); } } param.rtrn = NULL; } if (ret != 0) { FreeXkbFile(first); return NULL; } if (first) log_vrb(ctx, 5, "No map in include statement, but \"%s\" contains several; " "Using first defined map, \"%s\"\n", scanner->file_name, first->name); return first; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.5919814 libxkbcommon-0.10.0/src/xkbcomp/rules.c0000644000175000017500000010304300000000000017370 0ustar00ranran00000000000000/************************************************************ * Copyright (c) 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 © 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. */ #include "config.h" #include "xkbcomp-priv.h" #include "rules.h" #include "include.h" #include "scanner-utils.h" #define MAX_INCLUDE_DEPTH 5 /* Scanner / Lexer */ /* Values returned with some tokens, like yylval. */ union lvalue { struct sval string; }; enum rules_token { TOK_END_OF_FILE = 0, TOK_END_OF_LINE, TOK_IDENTIFIER, TOK_GROUP_NAME, TOK_BANG, TOK_EQUALS, TOK_STAR, TOK_INCLUDE, TOK_ERROR }; static inline bool is_ident(char ch) { return is_graph(ch) && ch != '\\'; } static enum rules_token lex(struct scanner *s, union lvalue *val) { skip_more_whitespace_and_comments: /* Skip spaces. */ while (chr(s, ' ') || chr(s, '\t') || chr(s, '\r')); /* Skip comments. */ if (lit(s, "//")) { skip_to_eol(s); } /* New line. */ if (eol(s)) { while (eol(s)) next(s); return TOK_END_OF_LINE; } /* Escaped line continuation. */ if (chr(s, '\\')) { /* Optional \r. */ chr(s, '\r'); if (!eol(s)) { scanner_err(s, "illegal new line escape; must appear at end of line"); return TOK_ERROR; } next(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; /* Operators and punctuation. */ if (chr(s, '!')) return TOK_BANG; if (chr(s, '=')) return TOK_EQUALS; if (chr(s, '*')) return TOK_STAR; /* Group name. */ if (chr(s, '$')) { val->string.start = s->s + s->pos; val->string.len = 0; while (is_ident(peek(s))) { next(s); val->string.len++; } if (val->string.len == 0) { scanner_err(s, "unexpected character after \'$\'; expected name"); return TOK_ERROR; } return TOK_GROUP_NAME; } /* Include statement. */ if (lit(s, "include")) return TOK_INCLUDE; /* Identifier. */ if (is_ident(peek(s))) { val->string.start = s->s + s->pos; val->string.len = 0; while (is_ident(peek(s))) { next(s); val->string.len++; } return TOK_IDENTIFIER; } scanner_err(s, "unrecognized token"); return TOK_ERROR; } /***====================================================================***/ enum rules_mlvo { MLVO_MODEL, MLVO_LAYOUT, MLVO_VARIANT, MLVO_OPTION, _MLVO_NUM_ENTRIES }; #define SVAL_LIT(literal) { literal, sizeof(literal) - 1 } static const struct sval rules_mlvo_svals[_MLVO_NUM_ENTRIES] = { [MLVO_MODEL] = SVAL_LIT("model"), [MLVO_LAYOUT] = SVAL_LIT("layout"), [MLVO_VARIANT] = SVAL_LIT("variant"), [MLVO_OPTION] = SVAL_LIT("option"), }; enum rules_kccgst { KCCGST_KEYCODES, KCCGST_TYPES, KCCGST_COMPAT, KCCGST_SYMBOLS, KCCGST_GEOMETRY, _KCCGST_NUM_ENTRIES }; static const struct sval rules_kccgst_svals[_KCCGST_NUM_ENTRIES] = { [KCCGST_KEYCODES] = SVAL_LIT("keycodes"), [KCCGST_TYPES] = SVAL_LIT("types"), [KCCGST_COMPAT] = SVAL_LIT("compat"), [KCCGST_SYMBOLS] = SVAL_LIT("symbols"), [KCCGST_GEOMETRY] = SVAL_LIT("geometry"), }; /* We use this to keep score whether an mlvo was matched or not; if not, * we warn the user that his preference was ignored. */ struct matched_sval { struct sval sval; bool matched; }; typedef darray(struct matched_sval) darray_matched_sval; /* * A broken-down version of xkb_rule_names (without the rules, * obviously). */ struct rule_names { struct matched_sval model; darray_matched_sval layouts; darray_matched_sval variants; darray_matched_sval options; }; struct group { struct sval name; darray_sval elements; }; struct mapping { int mlvo_at_pos[_MLVO_NUM_ENTRIES]; unsigned int num_mlvo; unsigned int defined_mlvo_mask; xkb_layout_index_t layout_idx, variant_idx; int kccgst_at_pos[_KCCGST_NUM_ENTRIES]; unsigned int num_kccgst; unsigned int defined_kccgst_mask; bool skip; }; enum mlvo_match_type { MLVO_MATCH_NORMAL = 0, MLVO_MATCH_WILDCARD, MLVO_MATCH_GROUP, }; struct rule { struct sval mlvo_value_at_pos[_MLVO_NUM_ENTRIES]; enum mlvo_match_type match_type_at_pos[_MLVO_NUM_ENTRIES]; unsigned int num_mlvo_values; struct sval kccgst_value_at_pos[_KCCGST_NUM_ENTRIES]; unsigned int num_kccgst_values; bool skip; }; /* * This is the main object used to match a given RMLVO against a rules * file and aggragate the results in a KcCGST. It goes through a simple * matching state machine, with tokens as transitions (see * matcher_match()). */ struct matcher { struct xkb_context *ctx; /* Input.*/ struct rule_names rmlvo; union lvalue val; darray(struct group) groups; /* Current mapping. */ struct mapping mapping; /* Current rule. */ struct rule rule; /* Output. */ darray_char kccgst[_KCCGST_NUM_ENTRIES]; }; static struct sval strip_spaces(struct sval v) { while (v.len > 0 && is_space(v.start[0])) { v.len--; v.start++; } while (v.len > 0 && is_space(v.start[v.len - 1])) v.len--; return v; } static darray_matched_sval split_comma_separated_mlvo(const char *s) { darray_matched_sval arr = darray_new(); /* * Make sure the array returned by this function always includes at * least one value, e.g. "" -> { "" } and "," -> { "", "" }. */ if (!s) { struct matched_sval val = { .sval = { NULL, 0 } }; darray_append(arr, val); return arr; } while (true) { struct matched_sval val = { .sval = { s, 0 } }; while (*s != '\0' && *s != ',') { s++; val.sval.len++; } val.sval = strip_spaces(val.sval); darray_append(arr, val); if (*s == '\0') break; if (*s == ',') s++; } return arr; } static struct matcher * matcher_new(struct xkb_context *ctx, const struct xkb_rule_names *rmlvo) { struct matcher *m = calloc(1, sizeof(*m)); if (!m) return NULL; m->ctx = ctx; m->rmlvo.model.sval.start = rmlvo->model; m->rmlvo.model.sval.len = strlen_safe(rmlvo->model); m->rmlvo.layouts = split_comma_separated_mlvo(rmlvo->layout); m->rmlvo.variants = split_comma_separated_mlvo(rmlvo->variant); m->rmlvo.options = split_comma_separated_mlvo(rmlvo->options); return m; } static void matcher_free(struct matcher *m) { struct group *group; if (!m) return; darray_free(m->rmlvo.layouts); darray_free(m->rmlvo.variants); darray_free(m->rmlvo.options); darray_foreach(group, m->groups) darray_free(group->elements); for (int i = 0; i < _KCCGST_NUM_ENTRIES; i++) darray_free(m->kccgst[i]); darray_free(m->groups); free(m); } static void matcher_group_start_new(struct matcher *m, struct sval name) { struct group group = { .name = name, .elements = darray_new() }; darray_append(m->groups, group); } static void matcher_group_add_element(struct matcher *m, struct scanner *s, struct sval element) { darray_append(darray_item(m->groups, darray_size(m->groups) - 1).elements, element); } static bool read_rules_file(struct xkb_context *ctx, struct matcher *matcher, unsigned include_depth, FILE *file, const char *path); static void matcher_include(struct matcher *m, struct scanner *parent_scanner, unsigned include_depth, struct sval inc) { struct scanner s; /* parses the !include value */ FILE *file; scanner_init(&s, m->ctx, inc.start, inc.len, parent_scanner->file_name, NULL); s.token_line = parent_scanner->token_line; s.token_column = parent_scanner->token_column; s.buf_pos = 0; if (include_depth >= MAX_INCLUDE_DEPTH) { scanner_err(&s, "maximum include depth (%d) exceeded; maybe there is an include loop?", MAX_INCLUDE_DEPTH); return; } while (!eof(&s) && !eol(&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; } if (!buf_appends(&s, home)) { scanner_err(&s, "include path after expanding %%H is too long"); return; } } else if (chr(&s, 'S')) { const char *default_root = xkb_context_include_path_get_system_path(m->ctx); if (!buf_appends(&s, default_root) || !buf_appends(&s, "/rules")) { scanner_err(&s, "include path after expanding %%S is too long"); return; } } else { scanner_err(&s, "unknown %% format (%c) in include statement", peek(&s)); return; } } else { buf_append(&s, next(&s)); } } if (!buf_append(&s, '\0')) { scanner_err(&s, "include path is too long"); return; } file = fopen(s.buf, "rb"); if (file) { bool ret = read_rules_file(m->ctx, m, include_depth + 1, file, s.buf); if (!ret) log_err(m->ctx, "No components returned from included XKB rules \"%s\"\n", s.buf); fclose(file); } else { log_err(m->ctx, "Failed to open included XKB rules \"%s\"\n", s.buf); } } static void matcher_mapping_start_new(struct matcher *m) { for (unsigned i = 0; i < _MLVO_NUM_ENTRIES; i++) m->mapping.mlvo_at_pos[i] = -1; for (unsigned i = 0; i < _KCCGST_NUM_ENTRIES; i++) m->mapping.kccgst_at_pos[i] = -1; m->mapping.layout_idx = m->mapping.variant_idx = XKB_LAYOUT_INVALID; m->mapping.num_mlvo = m->mapping.num_kccgst = 0; m->mapping.defined_mlvo_mask = 0; m->mapping.defined_kccgst_mask = 0; m->mapping.skip = false; } static int extract_layout_index(const char *s, size_t max_len, xkb_layout_index_t *out) { /* This function is pretty stupid, but works for now. */ *out = XKB_LAYOUT_INVALID; if (max_len < 3) return -1; if (s[0] != '[' || !is_digit(s[1]) || s[2] != ']') return -1; if (s[1] - '0' < 1 || s[1] - '0' > XKB_MAX_GROUPS) return -1; /* To zero-based index. */ *out = s[1] - '0' - 1; return 3; } static void matcher_mapping_set_mlvo(struct matcher *m, struct scanner *s, struct sval ident) { enum rules_mlvo mlvo; struct sval mlvo_sval; for (mlvo = 0; mlvo < _MLVO_NUM_ENTRIES; mlvo++) { mlvo_sval = rules_mlvo_svals[mlvo]; if (svaleq_prefix(mlvo_sval, ident)) break; } /* Not found. */ if (mlvo >= _MLVO_NUM_ENTRIES) { scanner_err(s, "invalid mapping: %.*s is not a valid value here; ignoring rule set", ident.len, ident.start); m->mapping.skip = true; return; } if (m->mapping.defined_mlvo_mask & (1u << mlvo)) { scanner_err(s, "invalid mapping: %.*s appears twice on the same line; ignoring rule set", mlvo_sval.len, mlvo_sval.start); m->mapping.skip = true; return; } /* If there are leftovers still, it must be an index. */ if (mlvo_sval.len < ident.len) { xkb_layout_index_t idx; int consumed = extract_layout_index(ident.start + mlvo_sval.len, ident.len - mlvo_sval.len, &idx); if ((int) (ident.len - mlvo_sval.len) != consumed) { scanner_err(s, "invalid mapping: \"%.*s\" may only be followed by a valid group index; ignoring rule set", mlvo_sval.len, mlvo_sval.start); m->mapping.skip = true; return; } if (mlvo == MLVO_LAYOUT) { m->mapping.layout_idx = idx; } else if (mlvo == MLVO_VARIANT) { m->mapping.variant_idx = idx; } else { scanner_err(s, "invalid mapping: \"%.*s\" cannot be followed by a group index; ignoring rule set", mlvo_sval.len, mlvo_sval.start); m->mapping.skip = true; return; } } m->mapping.mlvo_at_pos[m->mapping.num_mlvo] = mlvo; m->mapping.defined_mlvo_mask |= 1u << mlvo; m->mapping.num_mlvo++; } static void matcher_mapping_set_kccgst(struct matcher *m, struct scanner *s, struct sval ident) { enum rules_kccgst kccgst; struct sval kccgst_sval; for (kccgst = 0; kccgst < _KCCGST_NUM_ENTRIES; kccgst++) { kccgst_sval = rules_kccgst_svals[kccgst]; if (svaleq(rules_kccgst_svals[kccgst], ident)) break; } /* Not found. */ if (kccgst >= _KCCGST_NUM_ENTRIES) { scanner_err(s, "invalid mapping: %.*s is not a valid value here; ignoring rule set", ident.len, ident.start); m->mapping.skip = true; return; } if (m->mapping.defined_kccgst_mask & (1u << kccgst)) { scanner_err(s, "invalid mapping: %.*s appears twice on the same line; ignoring rule set", kccgst_sval.len, kccgst_sval.start); m->mapping.skip = true; return; } m->mapping.kccgst_at_pos[m->mapping.num_kccgst] = kccgst; m->mapping.defined_kccgst_mask |= 1u << kccgst; m->mapping.num_kccgst++; } static void matcher_mapping_verify(struct matcher *m, struct scanner *s) { if (m->mapping.num_mlvo == 0) { scanner_err(s, "invalid mapping: must have at least one value on the left hand side; ignoring rule set"); goto skip; } if (m->mapping.num_kccgst == 0) { scanner_err(s, "invalid mapping: must have at least one value on the right hand side; ignoring rule set"); goto skip; } /* * This following is very stupid, but this is how it works. * See the "Notes" section in the overview above. */ if (m->mapping.defined_mlvo_mask & (1u << MLVO_LAYOUT)) { if (m->mapping.layout_idx == XKB_LAYOUT_INVALID) { if (darray_size(m->rmlvo.layouts) > 1) goto skip; } else { if (darray_size(m->rmlvo.layouts) == 1 || m->mapping.layout_idx >= darray_size(m->rmlvo.layouts)) goto skip; } } if (m->mapping.defined_mlvo_mask & (1u << MLVO_VARIANT)) { if (m->mapping.variant_idx == XKB_LAYOUT_INVALID) { if (darray_size(m->rmlvo.variants) > 1) goto skip; } else { if (darray_size(m->rmlvo.variants) == 1 || m->mapping.variant_idx >= darray_size(m->rmlvo.variants)) goto skip; } } return; skip: m->mapping.skip = true; } static void matcher_rule_start_new(struct matcher *m) { memset(&m->rule, 0, sizeof(m->rule)); m->rule.skip = m->mapping.skip; } static void matcher_rule_set_mlvo_common(struct matcher *m, struct scanner *s, struct sval ident, enum mlvo_match_type match_type) { if (m->rule.num_mlvo_values + 1 > m->mapping.num_mlvo) { scanner_err(s, "invalid rule: has more values than the mapping line; ignoring rule"); m->rule.skip = true; return; } m->rule.match_type_at_pos[m->rule.num_mlvo_values] = match_type; m->rule.mlvo_value_at_pos[m->rule.num_mlvo_values] = ident; m->rule.num_mlvo_values++; } static void matcher_rule_set_mlvo_wildcard(struct matcher *m, struct scanner *s) { struct sval dummy = { NULL, 0 }; matcher_rule_set_mlvo_common(m, s, dummy, MLVO_MATCH_WILDCARD); } static void matcher_rule_set_mlvo_group(struct matcher *m, struct scanner *s, struct sval ident) { matcher_rule_set_mlvo_common(m, s, ident, MLVO_MATCH_GROUP); } static void matcher_rule_set_mlvo(struct matcher *m, struct scanner *s, struct sval ident) { matcher_rule_set_mlvo_common(m, s, ident, MLVO_MATCH_NORMAL); } static void matcher_rule_set_kccgst(struct matcher *m, struct scanner *s, struct sval ident) { if (m->rule.num_kccgst_values + 1 > m->mapping.num_kccgst) { scanner_err(s, "invalid rule: has more values than the mapping line; ignoring rule"); m->rule.skip = true; return; } m->rule.kccgst_value_at_pos[m->rule.num_kccgst_values] = ident; m->rule.num_kccgst_values++; } static bool match_group(struct matcher *m, struct sval group_name, struct sval to) { struct group *group; struct sval *element; bool found = false; darray_foreach(group, m->groups) { if (svaleq(group->name, group_name)) { found = true; break; } } if (!found) { /* * rules/evdev intentionally uses some undeclared group names * in rules (e.g. commented group definitions which may be * uncommented if needed). So we continue silently. */ return false; } darray_foreach(element, group->elements) if (svaleq(to, *element)) return true; return false; } static bool match_value(struct matcher *m, struct sval val, struct sval to, enum mlvo_match_type match_type) { if (match_type == MLVO_MATCH_WILDCARD) return true; if (match_type == MLVO_MATCH_GROUP) return match_group(m, val, to); return svaleq(val, to); } static bool match_value_and_mark(struct matcher *m, struct sval val, struct matched_sval *to, enum mlvo_match_type match_type) { bool matched = match_value(m, val, to->sval, match_type); if (matched) to->matched = true; return matched; } /* * This function performs %-expansion on @value (see overview above), * and appends the result to @to. */ static bool append_expanded_kccgst_value(struct matcher *m, struct scanner *s, darray_char *to, struct sval value) { const char *str = value.start; darray_char expanded = darray_new(); char ch; bool expanded_plus, to_plus; /* * Some ugly hand-lexing here, but going through the scanner is more * trouble than it's worth, and the format is ugly on its own merit. */ for (unsigned i = 0; i < value.len; ) { enum rules_mlvo mlv; xkb_layout_index_t idx; char pfx, sfx; struct matched_sval *expanded_value; /* Check if that's a start of an expansion. */ if (str[i] != '%') { /* Just a normal character. */ darray_appends_nullterminate(expanded, &str[i++], 1); continue; } if (++i >= value.len) goto error; pfx = sfx = 0; /* Check for prefix. */ if (str[i] == '(' || str[i] == '+' || str[i] == '|' || str[i] == '_' || str[i] == '-') { pfx = str[i]; if (str[i] == '(') sfx = ')'; if (++i >= value.len) goto error; } /* Mandatory model/layout/variant specifier. */ switch (str[i++]) { case 'm': mlv = MLVO_MODEL; break; case 'l': mlv = MLVO_LAYOUT; break; case 'v': mlv = MLVO_VARIANT; break; default: goto error; } /* Check for index. */ idx = XKB_LAYOUT_INVALID; if (i < value.len && str[i] == '[') { int consumed; if (mlv != MLVO_LAYOUT && mlv != MLVO_VARIANT) { scanner_err(s, "invalid index in %%-expansion; may only index layout or variant"); goto error; } consumed = extract_layout_index(str + i, value.len - i, &idx); if (consumed == -1) goto error; i += consumed; } /* Check for suffix, if there supposed to be one. */ if (sfx != 0) { if (i >= value.len) goto error; if (str[i++] != sfx) goto error; } /* Get the expanded value. */ expanded_value = NULL; if (mlv == MLVO_LAYOUT) { if (idx != XKB_LAYOUT_INVALID && idx < darray_size(m->rmlvo.layouts) && darray_size(m->rmlvo.layouts) > 1) expanded_value = &darray_item(m->rmlvo.layouts, idx); else if (idx == XKB_LAYOUT_INVALID && darray_size(m->rmlvo.layouts) == 1) expanded_value = &darray_item(m->rmlvo.layouts, 0); } else if (mlv == MLVO_VARIANT) { if (idx != XKB_LAYOUT_INVALID && idx < darray_size(m->rmlvo.variants) && darray_size(m->rmlvo.variants) > 1) expanded_value = &darray_item(m->rmlvo.variants, idx); else if (idx == XKB_LAYOUT_INVALID && darray_size(m->rmlvo.variants) == 1) expanded_value = &darray_item(m->rmlvo.variants, 0); } else if (mlv == MLVO_MODEL) { expanded_value = &m->rmlvo.model; } /* If we didn't get one, skip silently. */ if (!expanded_value || expanded_value->sval.len == 0) continue; if (pfx != 0) darray_appends_nullterminate(expanded, &pfx, 1); darray_appends_nullterminate(expanded, expanded_value->sval.start, expanded_value->sval.len); if (sfx != 0) darray_appends_nullterminate(expanded, &sfx, 1); expanded_value->matched = true; } /* * Appending bar to foo -> foo (not an error if this happens) * Appending +bar to foo -> foo+bar * Appending bar to +foo -> bar+foo * Appending +bar to +foo -> +foo+bar */ ch = (darray_empty(expanded) ? '\0' : darray_item(expanded, 0)); expanded_plus = (ch == '+' || ch == '|'); ch = (darray_empty(*to) ? '\0' : darray_item(*to, 0)); to_plus = (ch == '+' || ch == '|'); if (expanded_plus || darray_empty(*to)) darray_appends_nullterminate(*to, expanded.item, expanded.size); else if (to_plus) darray_prepends_nullterminate(*to, expanded.item, expanded.size); darray_free(expanded); return true; error: darray_free(expanded); scanner_err(s, "invalid %%-expansion in value; not used"); return false; } static void matcher_rule_verify(struct matcher *m, struct scanner *s) { if (m->rule.num_mlvo_values != m->mapping.num_mlvo || m->rule.num_kccgst_values != m->mapping.num_kccgst) { scanner_err(s, "invalid rule: must have same number of values as mapping line; ignoring rule"); m->rule.skip = true; } } static void matcher_rule_apply_if_matches(struct matcher *m, struct scanner *s) { for (unsigned i = 0; i < m->mapping.num_mlvo; i++) { enum rules_mlvo mlvo = m->mapping.mlvo_at_pos[i]; struct sval value = m->rule.mlvo_value_at_pos[i]; enum mlvo_match_type match_type = m->rule.match_type_at_pos[i]; struct matched_sval *to; bool matched = false; if (mlvo == MLVO_MODEL) { to = &m->rmlvo.model; matched = match_value_and_mark(m, value, to, match_type); } else if (mlvo == MLVO_LAYOUT) { xkb_layout_index_t idx = m->mapping.layout_idx; idx = (idx == XKB_LAYOUT_INVALID ? 0 : idx); to = &darray_item(m->rmlvo.layouts, idx); matched = match_value_and_mark(m, value, to, match_type); } else if (mlvo == MLVO_VARIANT) { xkb_layout_index_t idx = m->mapping.layout_idx; idx = (idx == XKB_LAYOUT_INVALID ? 0 : idx); to = &darray_item(m->rmlvo.variants, idx); matched = match_value_and_mark(m, value, to, match_type); } else if (mlvo == MLVO_OPTION) { darray_foreach(to, m->rmlvo.options) { matched = match_value_and_mark(m, value, to, match_type); if (matched) break; } } if (!matched) return; } for (unsigned i = 0; i < m->mapping.num_kccgst; i++) { enum rules_kccgst kccgst = m->mapping.kccgst_at_pos[i]; struct sval value = m->rule.kccgst_value_at_pos[i]; append_expanded_kccgst_value(m, s, &m->kccgst[kccgst], value); } /* * If a rule matches in a rule set, the rest of the set should be * skipped. However, rule sets matching against options may contain * several legitimate rules, so they are processed entirely. */ if (!(m->mapping.defined_mlvo_mask & (1 << MLVO_OPTION))) m->mapping.skip = true; } static enum rules_token gettok(struct matcher *m, struct scanner *s) { return lex(s, &m->val); } static bool matcher_match(struct matcher *m, struct scanner *s, unsigned include_depth, const char *string, size_t len, const char *file_name) { enum rules_token tok; if (!m) return false; initial: switch (tok = gettok(m, s)) { case TOK_BANG: goto bang; case TOK_END_OF_LINE: goto initial; case TOK_END_OF_FILE: goto finish; default: goto unexpected; } bang: switch (tok = gettok(m, s)) { case TOK_GROUP_NAME: matcher_group_start_new(m, m->val.string); goto group_name; case TOK_INCLUDE: goto include_statement; case TOK_IDENTIFIER: matcher_mapping_start_new(m); matcher_mapping_set_mlvo(m, s, m->val.string); goto mapping_mlvo; default: goto unexpected; } group_name: switch (tok = gettok(m, s)) { case TOK_EQUALS: goto group_element; default: goto unexpected; } group_element: switch (tok = gettok(m, s)) { case TOK_IDENTIFIER: matcher_group_add_element(m, s, m->val.string); goto group_element; case TOK_END_OF_LINE: goto initial; default: goto unexpected; } include_statement: switch (tok = gettok(m, s)) { case TOK_IDENTIFIER: matcher_include(m, s, include_depth, m->val.string); goto initial; default: goto unexpected; } mapping_mlvo: switch (tok = gettok(m, s)) { case TOK_IDENTIFIER: if (!m->mapping.skip) matcher_mapping_set_mlvo(m, s, m->val.string); goto mapping_mlvo; case TOK_EQUALS: goto mapping_kccgst; default: goto unexpected; } mapping_kccgst: switch (tok = gettok(m, s)) { case TOK_IDENTIFIER: if (!m->mapping.skip) matcher_mapping_set_kccgst(m, s, m->val.string); goto mapping_kccgst; case TOK_END_OF_LINE: if (!m->mapping.skip) matcher_mapping_verify(m, s); goto rule_mlvo_first; default: goto unexpected; } rule_mlvo_first: switch (tok = gettok(m, s)) { case TOK_BANG: goto bang; case TOK_END_OF_LINE: goto rule_mlvo_first; case TOK_END_OF_FILE: goto finish; default: matcher_rule_start_new(m); goto rule_mlvo_no_tok; } rule_mlvo: tok = gettok(m, s); rule_mlvo_no_tok: switch (tok) { case TOK_IDENTIFIER: if (!m->rule.skip) matcher_rule_set_mlvo(m, s, m->val.string); goto rule_mlvo; case TOK_STAR: if (!m->rule.skip) matcher_rule_set_mlvo_wildcard(m, s); goto rule_mlvo; case TOK_GROUP_NAME: if (!m->rule.skip) matcher_rule_set_mlvo_group(m, s, m->val.string); goto rule_mlvo; case TOK_EQUALS: goto rule_kccgst; default: goto unexpected; } rule_kccgst: switch (tok = gettok(m, s)) { case TOK_IDENTIFIER: if (!m->rule.skip) matcher_rule_set_kccgst(m, s, m->val.string); goto rule_kccgst; case TOK_END_OF_LINE: if (!m->rule.skip) matcher_rule_verify(m, s); if (!m->rule.skip) matcher_rule_apply_if_matches(m, s); goto rule_mlvo_first; default: goto unexpected; } unexpected: switch (tok) { case TOK_ERROR: goto error; default: goto state_error; } finish: return true; state_error: scanner_err(s, "unexpected token"); error: return false; } static bool read_rules_file(struct xkb_context *ctx, struct matcher *matcher, unsigned include_depth, FILE *file, const char *path) { bool ret = false; char *string; size_t size; struct scanner scanner; ret = map_file(file, &string, &size); if (!ret) { log_err(ctx, "Couldn't read rules file \"%s\": %s\n", path, strerror(errno)); goto out; } scanner_init(&scanner, matcher->ctx, string, size, path, NULL); ret = matcher_match(matcher, &scanner, include_depth, string, size, path); unmap_file(string, size); out: return ret; } bool xkb_components_from_rules(struct xkb_context *ctx, const struct xkb_rule_names *rmlvo, struct xkb_component_names *out) { bool ret = false; FILE *file; char *path = NULL; struct matcher *matcher = NULL; struct matched_sval *mval; file = FindFileInXkbPath(ctx, rmlvo->rules, FILE_TYPE_RULES, &path); if (!file) goto err_out; matcher = matcher_new(ctx, rmlvo); ret = read_rules_file(ctx, matcher, 0, file, path); if (!ret || darray_empty(matcher->kccgst[KCCGST_KEYCODES]) || darray_empty(matcher->kccgst[KCCGST_TYPES]) || darray_empty(matcher->kccgst[KCCGST_COMPAT]) || /* darray_empty(matcher->kccgst[KCCGST_GEOMETRY]) || */ darray_empty(matcher->kccgst[KCCGST_SYMBOLS])) { log_err(ctx, "No components returned from XKB rules \"%s\"\n", path); ret = false; goto err_out; } darray_steal(matcher->kccgst[KCCGST_KEYCODES], &out->keycodes, NULL); darray_steal(matcher->kccgst[KCCGST_TYPES], &out->types, NULL); darray_steal(matcher->kccgst[KCCGST_COMPAT], &out->compat, NULL); darray_steal(matcher->kccgst[KCCGST_SYMBOLS], &out->symbols, NULL); darray_free(matcher->kccgst[KCCGST_GEOMETRY]); mval = &matcher->rmlvo.model; if (!mval->matched && mval->sval.len > 0) log_err(matcher->ctx, "Unrecognized RMLVO model \"%.*s\" was ignored\n", mval->sval.len, mval->sval.start); darray_foreach(mval, matcher->rmlvo.layouts) if (!mval->matched && mval->sval.len > 0) log_err(matcher->ctx, "Unrecognized RMLVO layout \"%.*s\" was ignored\n", mval->sval.len, mval->sval.start); darray_foreach(mval, matcher->rmlvo.variants) if (!mval->matched && mval->sval.len > 0) log_err(matcher->ctx, "Unrecognized RMLVO variant \"%.*s\" was ignored\n", mval->sval.len, mval->sval.start); darray_foreach(mval, matcher->rmlvo.options) if (!mval->matched && mval->sval.len > 0) log_err(matcher->ctx, "Unrecognized RMLVO option \"%.*s\" was ignored\n", mval->sval.len, mval->sval.start); err_out: if (file) fclose(file); matcher_free(matcher); free(path); return ret; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.5919814 libxkbcommon-0.10.0/src/xkbcomp/rules.h0000644000175000017500000000255400000000000017402 0ustar00ranran00000000000000/* * 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 XKBCOMP_RULES_H #define XKBCOMP_RULES_H bool xkb_components_from_rules(struct xkb_context *ctx, const struct xkb_rule_names *rmlvo, struct xkb_component_names *out); #endif ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6053147 libxkbcommon-0.10.0/src/xkbcomp/scanner.c0000644000175000017500000001464500000000000017700 0ustar00ranran00000000000000/* * 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. */ #include "config.h" #include "xkbcomp-priv.h" #include "parser-priv.h" #include "scanner-utils.h" static bool number(struct scanner *s, int64_t *out, int *out_tok) { bool is_float = false, is_hex = false; const char *start = s->s + s->pos; char *end; if (lit(s, "0x")) { while (is_xdigit(peek(s))) next(s); is_hex = true; } else { while (is_digit(peek(s))) next(s); is_float = chr(s, '.'); while (is_digit(peek(s))) next(s); } if (s->s + s->pos == start) return false; errno = 0; if (is_hex) *out = strtoul(start, &end, 16); else if (is_float) /* The parser currently just ignores floats, so the cast is * fine - the value doesn't matter. */ *out = strtod(start, &end); else *out = strtoul(start, &end, 10); if (errno != 0 || s->s + s->pos != end) *out_tok = ERROR_TOK; else *out_tok = (is_float ? FLOAT : INTEGER); return true; } int _xkbcommon_lex(YYSTYPE *yylval, struct scanner *s) { int tok; skip_more_whitespace_and_comments: /* Skip spaces. */ while (is_space(peek(s))) next(s); /* Skip comments. */ if (lit(s, "//") || chr(s, '#')) { skip_to_eol(s); goto skip_more_whitespace_and_comments; } /* See if we're done. */ if (eof(s)) return END_OF_FILE; /* New token. */ s->token_line = s->line; s->token_column = s->column; s->buf_pos = 0; /* 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, 'n')) buf_append(s, '\n'); else if (chr(s, 't')) buf_append(s, '\t'); else if (chr(s, 'r')) buf_append(s, '\r'); else if (chr(s, 'b')) buf_append(s, '\b'); else if (chr(s, 'f')) buf_append(s, '\f'); else if (chr(s, 'v')) buf_append(s, '\v'); else if (chr(s, 'e')) buf_append(s, '\033'); else if (oct(s, &o)) buf_append(s, (char) o); else { scanner_warn(s, "unknown escape sequence in string literal"); /* Ignore. */ } } else { buf_append(s, next(s)); } } if (!buf_append(s, '\0') || !chr(s, '\"')) { scanner_err(s, "unterminated string literal"); return ERROR_TOK; } yylval->str = strdup(s->buf); if (!yylval->str) return ERROR_TOK; return STRING; } /* Key name literal. */ if (chr(s, '<')) { while (is_graph(peek(s)) && peek(s) != '>') buf_append(s, next(s)); if (!buf_append(s, '\0') || !chr(s, '>')) { scanner_err(s, "unterminated key name literal"); return ERROR_TOK; } /* Empty key name literals are allowed. */ yylval->atom = xkb_atom_intern(s->ctx, s->buf, s->buf_pos - 1); return KEYNAME; } /* Operators and punctuation. */ if (chr(s, ';')) return SEMI; if (chr(s, '{')) return OBRACE; if (chr(s, '}')) return CBRACE; if (chr(s, '=')) return EQUALS; if (chr(s, '[')) return OBRACKET; if (chr(s, ']')) return CBRACKET; if (chr(s, '(')) return OPAREN; if (chr(s, ')')) return CPAREN; if (chr(s, '.')) return DOT; if (chr(s, ',')) return COMMA; if (chr(s, '+')) return PLUS; if (chr(s, '-')) return MINUS; if (chr(s, '*')) return TIMES; if (chr(s, '/')) return DIVIDE; if (chr(s, '!')) return EXCLAM; if (chr(s, '~')) return INVERT; /* Identifier. */ 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 too long"); return ERROR_TOK; } /* Keyword. */ tok = keyword_to_token(s->buf, s->buf_pos - 1); if (tok != -1) return tok; yylval->str = strdup(s->buf); if (!yylval->str) return ERROR_TOK; return IDENT; } /* Number literal (hexadecimal / decimal / float). */ if (number(s, &yylval->num, &tok)) { if (tok == ERROR_TOK) { scanner_err(s, "malformed number literal"); return ERROR_TOK; } return tok; } scanner_err(s, "unrecognized token"); return ERROR_TOK; } XkbFile * XkbParseString(struct xkb_context *ctx, const char *string, size_t len, const char *file_name, const char *map) { struct scanner scanner; scanner_init(&scanner, ctx, string, len, file_name, NULL); return parse(ctx, &scanner, map); } XkbFile * XkbParseFile(struct xkb_context *ctx, FILE *file, const char *file_name, const char *map) { bool ok; XkbFile *xkb_file; char *string; size_t size; ok = map_file(file, &string, &size); if (!ok) { log_err(ctx, "Couldn't read XKB file %s: %s\n", file_name, strerror(errno)); return NULL; } xkb_file = XkbParseString(ctx, string, size, file_name, map); unmap_file(string, size); return xkb_file; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6053147 libxkbcommon-0.10.0/src/xkbcomp/symbols.c0000644000175000017500000014167100000000000017737 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ /* * 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 * Ran Benita */ #include "config.h" #include "xkbcomp-priv.h" #include "text.h" #include "expr.h" #include "action.h" #include "vmod.h" #include "include.h" #include "keysym.h" enum key_repeat { KEY_REPEAT_UNDEFINED = 0, KEY_REPEAT_YES = 1, KEY_REPEAT_NO = 2, }; enum group_field { GROUP_FIELD_SYMS = (1 << 0), GROUP_FIELD_ACTS = (1 << 1), GROUP_FIELD_TYPE = (1 << 2), }; enum key_field { KEY_FIELD_REPEAT = (1 << 0), KEY_FIELD_DEFAULT_TYPE = (1 << 1), KEY_FIELD_GROUPINFO = (1 << 2), KEY_FIELD_VMODMAP = (1 << 3), }; typedef struct { enum group_field defined; darray(struct xkb_level) levels; xkb_atom_t type; } GroupInfo; typedef struct { enum key_field defined; enum merge_mode merge; xkb_atom_t name; darray(GroupInfo) groups; enum key_repeat repeat; xkb_mod_mask_t vmodmap; xkb_atom_t default_type; enum xkb_range_exceed_type out_of_range_group_action; xkb_layout_index_t out_of_range_group_number; } KeyInfo; static void ClearLevelInfo(struct xkb_level *leveli) { if (leveli->num_syms > 1) free(leveli->u.syms); } static void InitGroupInfo(GroupInfo *groupi) { memset(groupi, 0, sizeof(*groupi)); } static void ClearGroupInfo(GroupInfo *groupi) { struct xkb_level *leveli; darray_foreach(leveli, groupi->levels) ClearLevelInfo(leveli); darray_free(groupi->levels); } static void CopyGroupInfo(GroupInfo *to, const GroupInfo *from) { to->defined = from->defined; to->type = from->type; darray_init(to->levels); darray_copy(to->levels, from->levels); for (xkb_level_index_t j = 0; j < darray_size(to->levels); j++) if (darray_item(from->levels, j).num_syms > 1) darray_item(to->levels, j).u.syms = memdup(darray_item(from->levels, j).u.syms, darray_item(from->levels, j).num_syms, sizeof(xkb_keysym_t)); } static void InitKeyInfo(struct xkb_context *ctx, KeyInfo *keyi) { memset(keyi, 0, sizeof(*keyi)); keyi->merge = MERGE_OVERRIDE; keyi->name = xkb_atom_intern_literal(ctx, "*"); keyi->out_of_range_group_action = RANGE_WRAP; } static void ClearKeyInfo(KeyInfo *keyi) { GroupInfo *groupi; darray_foreach(groupi, keyi->groups) ClearGroupInfo(groupi); darray_free(keyi->groups); } /***====================================================================***/ typedef struct { enum merge_mode merge; bool haveSymbol; xkb_mod_index_t modifier; union { xkb_atom_t keyName; xkb_keysym_t keySym; } u; } ModMapEntry; typedef struct { char *name; /* e.g. pc+us+inet(evdev) */ int errorCount; enum merge_mode merge; xkb_layout_index_t explicit_group; darray(KeyInfo) keys; KeyInfo default_key; ActionsInfo *actions; darray(xkb_atom_t) group_names; darray(ModMapEntry) modmaps; struct xkb_mod_set mods; struct xkb_context *ctx; /* Needed for AddKeySymbols. */ const struct xkb_keymap *keymap; } SymbolsInfo; static void InitSymbolsInfo(SymbolsInfo *info, const struct xkb_keymap *keymap, ActionsInfo *actions, const struct xkb_mod_set *mods) { memset(info, 0, sizeof(*info)); info->ctx = keymap->ctx; info->keymap = keymap; info->merge = MERGE_OVERRIDE; InitKeyInfo(keymap->ctx, &info->default_key); info->actions = actions; info->mods = *mods; info->explicit_group = XKB_LAYOUT_INVALID; } static void ClearSymbolsInfo(SymbolsInfo *info) { KeyInfo *keyi; free(info->name); darray_foreach(keyi, info->keys) ClearKeyInfo(keyi); darray_free(info->keys); darray_free(info->group_names); darray_free(info->modmaps); ClearKeyInfo(&info->default_key); } static const char * KeyInfoText(SymbolsInfo *info, KeyInfo *keyi) { return KeyNameText(info->ctx, keyi->name); } static bool MergeGroups(SymbolsInfo *info, GroupInfo *into, GroupInfo *from, bool clobber, bool report, xkb_layout_index_t group, xkb_atom_t key_name) { xkb_level_index_t i, levels_in_both; struct xkb_level *level; /* First find the type of the merged group. */ if (into->type != from->type) { if (from->type == XKB_ATOM_NONE) { /* it's empty for consistency with other comparisons */ } else if (into->type == XKB_ATOM_NONE) { into->type = from->type; } else { xkb_atom_t use = (clobber ? from->type : into->type); xkb_atom_t ignore = (clobber ? into->type : from->type); if (report) log_warn(info->ctx, "Multiple definitions for group %d type of key %s; " "Using %s, ignoring %s\n", group + 1, KeyNameText(info->ctx, key_name), xkb_atom_text(info->ctx, use), xkb_atom_text(info->ctx, ignore)); into->type = use; } } into->defined |= (from->defined & GROUP_FIELD_TYPE); /* Now look at the levels. */ if (darray_empty(from->levels)) { InitGroupInfo(from); return true; } if (darray_empty(into->levels)) { from->type = into->type; *into = *from; InitGroupInfo(from); return true; } /* Merge the actions and syms. */ levels_in_both = MIN(darray_size(into->levels), darray_size(from->levels)); for (i = 0; i < levels_in_both; i++) { struct xkb_level *intoLevel = &darray_item(into->levels, i); struct xkb_level *fromLevel = &darray_item(from->levels, i); if (fromLevel->action.type == ACTION_TYPE_NONE) { /* it's empty for consistency with other comparisons */ } else if (intoLevel->action.type == ACTION_TYPE_NONE) { intoLevel->action = fromLevel->action; } else { union xkb_action *use, *ignore; use = (clobber ? &fromLevel->action : &intoLevel->action); ignore = (clobber ? &intoLevel->action : &fromLevel->action); if (report) log_warn(info->ctx, "Multiple actions for level %d/group %u on key %s; " "Using %s, ignoring %s\n", i + 1, group + 1, KeyNameText(info->ctx, key_name), ActionTypeText(use->type), ActionTypeText(ignore->type)); intoLevel->action = *use; } if (fromLevel->num_syms == 0) { /* it's empty for consistency with other comparisons */ } else if (intoLevel->num_syms == 0) { intoLevel->num_syms = fromLevel->num_syms; if (fromLevel->num_syms > 1) intoLevel->u.syms = fromLevel->u.syms; else intoLevel->u.sym = fromLevel->u.sym; fromLevel->num_syms = 0; } else if (!XkbLevelsSameSyms(fromLevel, intoLevel)) { if (report) log_warn(info->ctx, "Multiple symbols for level %d/group %u on key %s; " "Using %s, ignoring %s\n", i + 1, group + 1, KeyNameText(info->ctx, key_name), (clobber ? "from" : "to"), (clobber ? "to" : "from")); if (clobber) { ClearLevelInfo(intoLevel); intoLevel->num_syms = fromLevel->num_syms; if (fromLevel->num_syms > 1) intoLevel->u.syms = fromLevel->u.syms; else intoLevel->u.sym = fromLevel->u.sym; fromLevel->num_syms = 0; } } } /* If @from has extra levels, get them as well. */ darray_foreach_from(level, from->levels, levels_in_both) { darray_append(into->levels, *level); level->num_syms = 0; } into->defined |= (from->defined & GROUP_FIELD_ACTS); into->defined |= (from->defined & GROUP_FIELD_SYMS); return true; } static bool UseNewKeyField(enum key_field field, enum key_field old, enum key_field new, bool clobber, bool report, enum key_field *collide) { if (!(old & field)) return (new & field); if (new & field) { if (report) *collide |= field; if (clobber) return true; } return false; } static bool MergeKeys(SymbolsInfo *info, KeyInfo *into, KeyInfo *from, bool same_file) { xkb_layout_index_t i; xkb_layout_index_t groups_in_both; enum key_field collide = 0; const int verbosity = xkb_context_get_log_verbosity(info->ctx); const bool clobber = (from->merge != MERGE_AUGMENT); const bool report = (same_file && verbosity > 0) || verbosity > 9; if (from->merge == MERGE_REPLACE) { ClearKeyInfo(into); *into = *from; InitKeyInfo(info->ctx, from); return true; } groups_in_both = MIN(darray_size(into->groups), darray_size(from->groups)); for (i = 0; i < groups_in_both; i++) MergeGroups(info, &darray_item(into->groups, i), &darray_item(from->groups, i), clobber, report, i, into->name); /* If @from has extra groups, just move them to @into. */ for (i = groups_in_both; i < darray_size(from->groups); i++) { darray_append(into->groups, darray_item(from->groups, i)); InitGroupInfo(&darray_item(from->groups, i)); } if (UseNewKeyField(KEY_FIELD_VMODMAP, into->defined, from->defined, clobber, report, &collide)) { into->vmodmap = from->vmodmap; into->defined |= KEY_FIELD_VMODMAP; } if (UseNewKeyField(KEY_FIELD_REPEAT, into->defined, from->defined, clobber, report, &collide)) { into->repeat = from->repeat; into->defined |= KEY_FIELD_REPEAT; } if (UseNewKeyField(KEY_FIELD_DEFAULT_TYPE, into->defined, from->defined, clobber, report, &collide)) { into->default_type = from->default_type; into->defined |= KEY_FIELD_DEFAULT_TYPE; } if (UseNewKeyField(KEY_FIELD_GROUPINFO, into->defined, from->defined, clobber, report, &collide)) { into->out_of_range_group_action = from->out_of_range_group_action; into->out_of_range_group_number = from->out_of_range_group_number; into->defined |= KEY_FIELD_GROUPINFO; } if (collide) log_warn(info->ctx, "Symbol map for key %s redefined; " "Using %s definition for conflicting fields\n", KeyNameText(info->ctx, into->name), (clobber ? "first" : "last")); ClearKeyInfo(from); InitKeyInfo(info->ctx, from); return true; } /* TODO: Make it so this function doesn't need the entire keymap. */ static bool AddKeySymbols(SymbolsInfo *info, KeyInfo *keyi, bool same_file) { xkb_atom_t real_name; KeyInfo *iter; /* * Don't keep aliases in the keys array; this guarantees that * searching for keys to merge with by straight comparison (see the * following loop) is enough, and we won't get multiple KeyInfo's * for the same key because of aliases. */ real_name = XkbResolveKeyAlias(info->keymap, keyi->name); if (real_name != XKB_ATOM_NONE) keyi->name = real_name; darray_foreach(iter, info->keys) if (iter->name == keyi->name) return MergeKeys(info, iter, keyi, same_file); darray_append(info->keys, *keyi); InitKeyInfo(info->ctx, keyi); return true; } static bool AddModMapEntry(SymbolsInfo *info, ModMapEntry *new) { ModMapEntry *old; bool clobber = (new->merge != MERGE_AUGMENT); darray_foreach(old, info->modmaps) { xkb_mod_index_t use, ignore; if ((new->haveSymbol != old->haveSymbol) || (new->haveSymbol && new->u.keySym != old->u.keySym) || (!new->haveSymbol && new->u.keyName != old->u.keyName)) continue; if (new->modifier == old->modifier) return true; use = (clobber ? new->modifier : old->modifier); ignore = (clobber ? old->modifier : new->modifier); if (new->haveSymbol) log_warn(info->ctx, "Symbol \"%s\" added to modifier map for multiple modifiers; " "Using %s, ignoring %s\n", KeysymText(info->ctx, new->u.keySym), ModIndexText(info->ctx, &info->mods, use), ModIndexText(info->ctx, &info->mods, ignore)); else log_warn(info->ctx, "Key \"%s\" added to modifier map for multiple modifiers; " "Using %s, ignoring %s\n", KeyNameText(info->ctx, new->u.keyName), ModIndexText(info->ctx, &info->mods, use), ModIndexText(info->ctx, &info->mods, ignore)); old->modifier = use; return true; } darray_append(info->modmaps, *new); return true; } /***====================================================================***/ static void MergeIncludedSymbols(SymbolsInfo *into, SymbolsInfo *from, enum merge_mode merge) { xkb_atom_t *group_name; xkb_layout_index_t group_names_in_both; if (from->errorCount > 0) { into->errorCount += from->errorCount; return; } into->mods = from->mods; if (into->name == NULL) { into->name = from->name; from->name = NULL; } group_names_in_both = MIN(darray_size(into->group_names), darray_size(from->group_names)); for (xkb_layout_index_t i = 0; i < group_names_in_both; i++) { if (!darray_item(from->group_names, i)) continue; if (merge == MERGE_AUGMENT && darray_item(into->group_names, i)) continue; darray_item(into->group_names, i) = darray_item(from->group_names, i); } /* If @from has more, get them as well. */ darray_foreach_from(group_name, from->group_names, group_names_in_both) darray_append(into->group_names, *group_name); if (darray_empty(into->keys)) { into->keys = from->keys; darray_init(from->keys); } else { KeyInfo *keyi; darray_foreach(keyi, from->keys) { keyi->merge = (merge == MERGE_DEFAULT ? keyi->merge : merge); if (!AddKeySymbols(into, keyi, false)) into->errorCount++; } } if (darray_empty(into->modmaps)) { into->modmaps = from->modmaps; darray_init(from->modmaps); } else { ModMapEntry *mm; darray_foreach(mm, from->modmaps) { mm->merge = (merge == MERGE_DEFAULT ? mm->merge : merge); if (!AddModMapEntry(into, mm)) into->errorCount++; } } } static void HandleSymbolsFile(SymbolsInfo *info, XkbFile *file, enum merge_mode merge); static bool HandleIncludeSymbols(SymbolsInfo *info, IncludeStmt *include) { SymbolsInfo included; InitSymbolsInfo(&included, info->keymap, info->actions, &info->mods); included.name = include->stmt; include->stmt = NULL; for (IncludeStmt *stmt = include; stmt; stmt = stmt->next_incl) { SymbolsInfo next_incl; XkbFile *file; file = ProcessIncludeFile(info->ctx, stmt, FILE_TYPE_SYMBOLS); if (!file) { info->errorCount += 10; ClearSymbolsInfo(&included); return false; } InitSymbolsInfo(&next_incl, info->keymap, info->actions, &included.mods); if (stmt->modifier) { next_incl.explicit_group = atoi(stmt->modifier) - 1; if (next_incl.explicit_group >= XKB_MAX_GROUPS) { log_err(info->ctx, "Cannot set explicit group to %d - must be between 1..%d; " "Ignoring group number\n", next_incl.explicit_group + 1, XKB_MAX_GROUPS); next_incl.explicit_group = info->explicit_group; } } else { next_incl.explicit_group = info->explicit_group; } HandleSymbolsFile(&next_incl, file, MERGE_OVERRIDE); MergeIncludedSymbols(&included, &next_incl, stmt->merge); ClearSymbolsInfo(&next_incl); FreeXkbFile(file); } MergeIncludedSymbols(info, &included, include->merge); ClearSymbolsInfo(&included); return (info->errorCount == 0); } #define SYMBOLS 1 #define ACTIONS 2 static bool GetGroupIndex(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, unsigned what, xkb_layout_index_t *ndx_rtrn) { const char *name = (what == SYMBOLS ? "symbols" : "actions"); if (arrayNdx == NULL) { xkb_layout_index_t i; GroupInfo *groupi; enum group_field field = (what == SYMBOLS ? GROUP_FIELD_SYMS : GROUP_FIELD_ACTS); darray_enumerate(i, groupi, keyi->groups) { if (!(groupi->defined & field)) { *ndx_rtrn = i; return true; } } if (i >= XKB_MAX_GROUPS) { log_err(info->ctx, "Too many groups of %s for key %s (max %u); " "Ignoring %s defined for extra groups\n", name, KeyInfoText(info, keyi), XKB_MAX_GROUPS, name); return false; } darray_resize0(keyi->groups, darray_size(keyi->groups) + 1); *ndx_rtrn = darray_size(keyi->groups) - 1; return true; } if (!ExprResolveGroup(info->ctx, arrayNdx, ndx_rtrn)) { log_err(info->ctx, "Illegal group index for %s of key %s\n" "Definition with non-integer array index ignored\n", name, KeyInfoText(info, keyi)); return false; } (*ndx_rtrn)--; if (*ndx_rtrn >= darray_size(keyi->groups)) darray_resize0(keyi->groups, *ndx_rtrn + 1); return true; } static bool AddSymbolsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, ExprDef *value) { xkb_layout_index_t ndx; GroupInfo *groupi; xkb_level_index_t nLevels; if (!GetGroupIndex(info, keyi, arrayNdx, SYMBOLS, &ndx)) return false; groupi = &darray_item(keyi->groups, ndx); if (value == NULL) { groupi->defined |= GROUP_FIELD_SYMS; return true; } if (value->expr.op != EXPR_KEYSYM_LIST) { log_err(info->ctx, "Expected a list of symbols, found %s; " "Ignoring symbols for group %u of %s\n", expr_op_type_to_string(value->expr.op), ndx + 1, KeyInfoText(info, keyi)); return false; } if (groupi->defined & GROUP_FIELD_SYMS) { log_err(info->ctx, "Symbols for key %s, group %u already defined; " "Ignoring duplicate definition\n", KeyInfoText(info, keyi), ndx + 1); return false; } nLevels = darray_size(value->keysym_list.symsMapIndex); if (darray_size(groupi->levels) < nLevels) darray_resize0(groupi->levels, nLevels); groupi->defined |= GROUP_FIELD_SYMS; for (xkb_level_index_t i = 0; i < nLevels; i++) { unsigned int sym_index; struct xkb_level *leveli = &darray_item(groupi->levels, i); sym_index = darray_item(value->keysym_list.symsMapIndex, i); leveli->num_syms = darray_item(value->keysym_list.symsNumEntries, i); if (leveli->num_syms > 1) leveli->u.syms = calloc(leveli->num_syms, sizeof(*leveli->u.syms)); for (unsigned j = 0; j < leveli->num_syms; j++) { xkb_keysym_t keysym = darray_item(value->keysym_list.syms, sym_index + j); if (leveli->num_syms == 1) { if (keysym == XKB_KEY_NoSymbol) leveli->num_syms = 0; else leveli->u.sym = keysym; } else if (leveli->num_syms > 1) { leveli->u.syms[j] = keysym; } } } return true; } static bool AddActionsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, ExprDef *value) { xkb_layout_index_t ndx; GroupInfo *groupi; unsigned int nActs; ExprDef *act; if (!GetGroupIndex(info, keyi, arrayNdx, ACTIONS, &ndx)) return false; groupi = &darray_item(keyi->groups, ndx); if (value == NULL) { groupi->defined |= GROUP_FIELD_ACTS; return true; } if (value->expr.op != EXPR_ACTION_LIST) { log_wsgo(info->ctx, "Bad expression type (%d) for action list value; " "Ignoring actions for group %u of %s\n", value->expr.op, ndx, KeyInfoText(info, keyi)); return false; } if (groupi->defined & GROUP_FIELD_ACTS) { log_wsgo(info->ctx, "Actions for key %s, group %u already defined\n", KeyInfoText(info, keyi), ndx); return false; } nActs = 0; for (act = value->actions.actions; act; act = (ExprDef *) act->common.next) nActs++; if (darray_size(groupi->levels) < nActs) darray_resize0(groupi->levels, nActs); groupi->defined |= GROUP_FIELD_ACTS; act = value->actions.actions; for (unsigned i = 0; i < nActs; i++) { union xkb_action *toAct = &darray_item(groupi->levels, i).action; if (!HandleActionDef(info->ctx, info->actions, &info->mods, act, toAct)) log_err(info->ctx, "Illegal action definition for %s; " "Action for group %u/level %u ignored\n", KeyInfoText(info, keyi), ndx + 1, i + 1); act = (ExprDef *) act->common.next; } return true; } static const LookupEntry repeatEntries[] = { { "true", KEY_REPEAT_YES }, { "yes", KEY_REPEAT_YES }, { "on", KEY_REPEAT_YES }, { "false", KEY_REPEAT_NO }, { "no", KEY_REPEAT_NO }, { "off", KEY_REPEAT_NO }, { "default", KEY_REPEAT_UNDEFINED }, { NULL, 0 } }; static bool SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, ExprDef *arrayNdx, ExprDef *value) { if (istreq(field, "type")) { xkb_layout_index_t ndx; xkb_atom_t val; if (!ExprResolveString(info->ctx, value, &val)) { log_err(info->ctx, "The type field of a key symbol map must be a string; " "Ignoring illegal type definition\n"); return false; } if (!arrayNdx) { keyi->default_type = val; keyi->defined |= KEY_FIELD_DEFAULT_TYPE; } else if (!ExprResolveGroup(info->ctx, arrayNdx, &ndx)) { log_err(info->ctx, "Illegal group index for type of key %s; " "Definition with non-integer array index ignored\n", KeyInfoText(info, keyi)); return false; } else { ndx--; if (ndx >= darray_size(keyi->groups)) darray_resize0(keyi->groups, ndx + 1); darray_item(keyi->groups, ndx).type = val; darray_item(keyi->groups, ndx).defined |= GROUP_FIELD_TYPE; } } else if (istreq(field, "symbols")) { return AddSymbolsToKey(info, keyi, arrayNdx, value); } else if (istreq(field, "actions")) { return AddActionsToKey(info, keyi, arrayNdx, value); } else if (istreq(field, "vmods") || istreq(field, "virtualmods") || istreq(field, "virtualmodifiers")) { xkb_mod_mask_t mask; if (!ExprResolveModMask(info->ctx, value, MOD_VIRT, &info->mods, &mask)) { log_err(info->ctx, "Expected a virtual modifier mask, found %s; " "Ignoring virtual modifiers definition for key %s\n", expr_op_type_to_string(value->expr.op), KeyInfoText(info, keyi)); return false; } keyi->vmodmap = mask; keyi->defined |= KEY_FIELD_VMODMAP; } else if (istreq(field, "locking") || istreq(field, "lock") || istreq(field, "locks")) { log_vrb(info->ctx, 1, "Key behaviors not supported; " "Ignoring locking specification for key %s\n", KeyInfoText(info, keyi)); } else if (istreq(field, "radiogroup") || istreq(field, "permanentradiogroup") || istreq(field, "allownone")) { log_vrb(info->ctx, 1, "Radio groups not supported; " "Ignoring radio group specification for key %s\n", KeyInfoText(info, keyi)); } else if (istreq_prefix("overlay", field) || istreq_prefix("permanentoverlay", field)) { log_vrb(info->ctx, 1, "Overlays not supported; " "Ignoring overlay specification for key %s\n", KeyInfoText(info, keyi)); } else if (istreq(field, "repeating") || istreq(field, "repeats") || istreq(field, "repeat")) { unsigned int val; if (!ExprResolveEnum(info->ctx, value, &val, repeatEntries)) { log_err(info->ctx, "Illegal repeat setting for %s; " "Non-boolean repeat setting ignored\n", KeyInfoText(info, keyi)); return false; } keyi->repeat = val; keyi->defined |= KEY_FIELD_REPEAT; } else if (istreq(field, "groupswrap") || istreq(field, "wrapgroups")) { bool set; if (!ExprResolveBoolean(info->ctx, value, &set)) { log_err(info->ctx, "Illegal groupsWrap setting for %s; " "Non-boolean value ignored\n", KeyInfoText(info, keyi)); return false; } keyi->out_of_range_group_action = (set ? RANGE_WRAP : RANGE_SATURATE); keyi->defined |= KEY_FIELD_GROUPINFO; } else if (istreq(field, "groupsclamp") || istreq(field, "clampgroups")) { bool set; if (!ExprResolveBoolean(info->ctx, value, &set)) { log_err(info->ctx, "Illegal groupsClamp setting for %s; " "Non-boolean value ignored\n", KeyInfoText(info, keyi)); return false; } keyi->out_of_range_group_action = (set ? RANGE_SATURATE : RANGE_WRAP); keyi->defined |= KEY_FIELD_GROUPINFO; } else if (istreq(field, "groupsredirect") || istreq(field, "redirectgroups")) { xkb_layout_index_t grp; if (!ExprResolveGroup(info->ctx, value, &grp)) { log_err(info->ctx, "Illegal group index for redirect of key %s; " "Definition with non-integer group ignored\n", KeyInfoText(info, keyi)); return false; } keyi->out_of_range_group_action = RANGE_REDIRECT; keyi->out_of_range_group_number = grp - 1; keyi->defined |= KEY_FIELD_GROUPINFO; } else { log_err(info->ctx, "Unknown field %s in a symbol interpretation; " "Definition ignored\n", field); return false; } return true; } static bool SetGroupName(SymbolsInfo *info, ExprDef *arrayNdx, ExprDef *value) { xkb_layout_index_t group, group_to_use; xkb_atom_t name; if (!arrayNdx) { log_vrb(info->ctx, 1, "You must specify an index when specifying a group name; " "Group name definition without array subscript ignored\n"); return false; } if (!ExprResolveGroup(info->ctx, arrayNdx, &group)) { log_err(info->ctx, "Illegal index in group name definition; " "Definition with non-integer array index ignored\n"); return false; } if (!ExprResolveString(info->ctx, value, &name)) { log_err(info->ctx, "Group name must be a string; " "Illegal name for group %d ignored\n", group); return false; } if (info->explicit_group == XKB_LAYOUT_INVALID) { group_to_use = group - 1; } else if (group - 1 == 0) { group_to_use = info->explicit_group; } else { log_warn(info->ctx, "An explicit group was specified for the '%s' map, " "but it provides a name for a group other than Group1 (%d); " "Ignoring group name '%s'\n", info->name, group, xkb_atom_text(info->ctx, name)); return false; } if (group_to_use >= darray_size(info->group_names)) darray_resize0(info->group_names, group_to_use + 1); darray_item(info->group_names, group_to_use) = name; return true; } static bool HandleGlobalVar(SymbolsInfo *info, VarDef *stmt) { const char *elem, *field; ExprDef *arrayNdx; bool ret; if (!ExprResolveLhs(info->ctx, stmt->name, &elem, &field, &arrayNdx)) return false; if (elem && istreq(elem, "key")) { ret = SetSymbolsField(info, &info->default_key, field, arrayNdx, stmt->value); } else if (!elem && (istreq(field, "name") || istreq(field, "groupname"))) { ret = SetGroupName(info, arrayNdx, stmt->value); } else if (!elem && (istreq(field, "groupswrap") || istreq(field, "wrapgroups"))) { log_err(info->ctx, "Global \"groupswrap\" not supported; Ignored\n"); ret = true; } else if (!elem && (istreq(field, "groupsclamp") || istreq(field, "clampgroups"))) { log_err(info->ctx, "Global \"groupsclamp\" not supported; Ignored\n"); ret = true; } else if (!elem && (istreq(field, "groupsredirect") || istreq(field, "redirectgroups"))) { log_err(info->ctx, "Global \"groupsredirect\" not supported; Ignored\n"); ret = true; } else if (!elem && istreq(field, "allownone")) { log_err(info->ctx, "Radio groups not supported; " "Ignoring \"allownone\" specification\n"); ret = true; } else { ret = SetActionField(info->ctx, info->actions, &info->mods, elem, field, arrayNdx, stmt->value); } return ret; } static bool HandleSymbolsBody(SymbolsInfo *info, VarDef *def, KeyInfo *keyi) { bool ok = true; const char *elem, *field; ExprDef *arrayNdx; for (; def; def = (VarDef *) def->common.next) { if (def->name && def->name->expr.op == EXPR_FIELD_REF) { log_err(info->ctx, "Cannot set a global default value from within a key statement; " "Move statements to the global file scope\n"); continue; } if (!def->name) { if (!def->value || def->value->expr.op == EXPR_KEYSYM_LIST) field = "symbols"; else field = "actions"; arrayNdx = NULL; } else { ok = ExprResolveLhs(info->ctx, def->name, &elem, &field, &arrayNdx); } if (ok) ok = SetSymbolsField(info, keyi, field, arrayNdx, def->value); } return ok; } static bool SetExplicitGroup(SymbolsInfo *info, KeyInfo *keyi) { xkb_layout_index_t i; GroupInfo *groupi; bool warn = false; if (info->explicit_group == XKB_LAYOUT_INVALID) return true; darray_enumerate_from(i, groupi, keyi->groups, 1) { if (groupi->defined) { warn = true; ClearGroupInfo(groupi); InitGroupInfo(groupi); } } if (warn) log_warn(info->ctx, "For the map %s an explicit group specified, " "but key %s has more than one group defined; " "All groups except first one will be ignored\n", info->name, KeyInfoText(info, keyi)); darray_resize0(keyi->groups, info->explicit_group + 1); if (info->explicit_group > 0) { darray_item(keyi->groups, info->explicit_group) = darray_item(keyi->groups, 0); InitGroupInfo(&darray_item(keyi->groups, 0)); } return true; } static bool HandleSymbolsDef(SymbolsInfo *info, SymbolsDef *stmt) { KeyInfo keyi; keyi = info->default_key; darray_init(keyi.groups); darray_copy(keyi.groups, info->default_key.groups); for (xkb_layout_index_t i = 0; i < darray_size(keyi.groups); i++) CopyGroupInfo(&darray_item(keyi.groups, i), &darray_item(info->default_key.groups, i)); keyi.merge = stmt->merge; keyi.name = stmt->keyName; if (!HandleSymbolsBody(info, stmt->symbols, &keyi)) { info->errorCount++; return false; } if (!SetExplicitGroup(info, &keyi)) { info->errorCount++; return false; } if (!AddKeySymbols(info, &keyi, true)) { info->errorCount++; return false; } return true; } static bool HandleModMapDef(SymbolsInfo *info, ModMapDef *def) { ModMapEntry tmp; xkb_mod_index_t ndx; bool ok; struct xkb_context *ctx = info->ctx; ndx = XkbModNameToIndex(&info->mods, def->modifier, MOD_REAL); if (ndx == XKB_MOD_INVALID) { log_err(info->ctx, "Illegal modifier map definition; " "Ignoring map for non-modifier \"%s\"\n", xkb_atom_text(ctx, def->modifier)); return false; } ok = true; tmp.modifier = ndx; tmp.merge = def->merge; for (ExprDef *key = def->keys; key; key = (ExprDef *) key->common.next) { xkb_keysym_t sym; if (key->expr.op == EXPR_VALUE && key->expr.value_type == EXPR_TYPE_KEYNAME) { tmp.haveSymbol = false; tmp.u.keyName = key->key_name.key_name; } else if (ExprResolveKeySym(ctx, key, &sym)) { tmp.haveSymbol = true; tmp.u.keySym = sym; } else { log_err(info->ctx, "Modmap entries may contain only key names or keysyms; " "Illegal definition for %s modifier ignored\n", ModIndexText(info->ctx, &info->mods, tmp.modifier)); continue; } ok = AddModMapEntry(info, &tmp) && ok; } return ok; } static void HandleSymbolsFile(SymbolsInfo *info, XkbFile *file, enum merge_mode merge) { bool ok; free(info->name); info->name = strdup_safe(file->name); for (ParseCommon *stmt = file->defs; stmt; stmt = stmt->next) { switch (stmt->type) { case STMT_INCLUDE: ok = HandleIncludeSymbols(info, (IncludeStmt *) stmt); break; case STMT_SYMBOLS: ok = HandleSymbolsDef(info, (SymbolsDef *) stmt); break; case STMT_VAR: ok = HandleGlobalVar(info, (VarDef *) stmt); break; case STMT_VMOD: ok = HandleVModDef(info->ctx, &info->mods, (VModDef *) stmt, merge); break; case STMT_MODMAP: ok = HandleModMapDef(info, (ModMapDef *) stmt); break; default: log_err(info->ctx, "Symbols files may not include other types; " "Ignoring %s\n", stmt_type_to_string(stmt->type)); ok = false; break; } if (!ok) info->errorCount++; if (info->errorCount > 10) { log_err(info->ctx, "Abandoning symbols file \"%s\"\n", file->name); break; } } } /** * Given a keysym @sym, return a key which generates it, or NULL. * This is used for example in a modifier map definition, such as: * modifier_map Lock { Caps_Lock }; * where we want to add the Lock modifier to the modmap of the key * which matches the keysym Caps_Lock. * Since there can be many keys which generates the keysym, the key * is chosen first by lowest group in which the keysym appears, than * by lowest level and than by lowest key code. */ static struct xkb_key * FindKeyForSymbol(struct xkb_keymap *keymap, xkb_keysym_t sym) { struct xkb_key *key; xkb_layout_index_t group; bool got_one_group, got_one_level; group = 0; do { xkb_level_index_t level = 0; got_one_group = false; do { got_one_level = false; xkb_keys_foreach(key, keymap) { if (group < key->num_groups && level < XkbKeyNumLevels(key, group)) { got_one_group = got_one_level = true; if (key->groups[group].levels[level].num_syms == 1 && key->groups[group].levels[level].u.sym == sym) return key; } } level++; } while (got_one_level); group++; } while (got_one_group); return NULL; } /* * Find an appropriate type for a group and return its name. * * Simple recipe: * - ONE_LEVEL for width 0/1 * - ALPHABETIC for 2 shift levels, with lower/upercase keysyms * - KEYPAD for keypad keys. * - TWO_LEVEL for other 2 shift level keys. * and the same for four level keys. * * FIXME: Decide how to handle multiple-syms-per-level, and do it. */ static xkb_atom_t FindAutomaticType(struct xkb_context *ctx, GroupInfo *groupi) { xkb_keysym_t sym0, sym1; const xkb_level_index_t width = darray_size(groupi->levels); #define GET_SYM(level) \ (darray_item(groupi->levels, level).num_syms == 0 ? \ XKB_KEY_NoSymbol : \ darray_item(groupi->levels, level).num_syms == 1 ? \ darray_item(groupi->levels, level).u.sym : \ /* num_syms > 1 */ \ darray_item(groupi->levels, level).u.syms[0]) if (width == 1 || width <= 0) return xkb_atom_intern_literal(ctx, "ONE_LEVEL"); sym0 = GET_SYM(0); sym1 = GET_SYM(1); if (width == 2) { if (xkb_keysym_is_lower(sym0) && xkb_keysym_is_upper(sym1)) return xkb_atom_intern_literal(ctx, "ALPHABETIC"); if (xkb_keysym_is_keypad(sym0) || xkb_keysym_is_keypad(sym1)) return xkb_atom_intern_literal(ctx, "KEYPAD"); return xkb_atom_intern_literal(ctx, "TWO_LEVEL"); } if (width <= 4) { if (xkb_keysym_is_lower(sym0) && xkb_keysym_is_upper(sym1)) { xkb_keysym_t sym2, sym3; sym2 = GET_SYM(2); sym3 = (width == 4 ? GET_SYM(3) : XKB_KEY_NoSymbol); if (xkb_keysym_is_lower(sym2) && xkb_keysym_is_upper(sym3)) return xkb_atom_intern_literal(ctx, "FOUR_LEVEL_ALPHABETIC"); return xkb_atom_intern_literal(ctx, "FOUR_LEVEL_SEMIALPHABETIC"); } if (xkb_keysym_is_keypad(sym0) || xkb_keysym_is_keypad(sym1)) return xkb_atom_intern_literal(ctx, "FOUR_LEVEL_KEYPAD"); return xkb_atom_intern_literal(ctx, "FOUR_LEVEL"); } return XKB_ATOM_NONE; #undef GET_SYM } static const struct xkb_key_type * FindTypeForGroup(struct xkb_keymap *keymap, KeyInfo *keyi, xkb_layout_index_t group, bool *explicit_type) { unsigned int i; GroupInfo *groupi = &darray_item(keyi->groups, group); xkb_atom_t type_name = groupi->type; *explicit_type = true; if (type_name == XKB_ATOM_NONE) { if (keyi->default_type != XKB_ATOM_NONE) { type_name = keyi->default_type; } else { type_name = FindAutomaticType(keymap->ctx, groupi); if (type_name != XKB_ATOM_NONE) *explicit_type = false; } } if (type_name == XKB_ATOM_NONE) { log_warn(keymap->ctx, "Couldn't find an automatic type for key '%s' group %d with %lu levels; " "Using the default type\n", KeyNameText(keymap->ctx, keyi->name), group + 1, (unsigned long) darray_size(groupi->levels)); goto use_default; } for (i = 0; i < keymap->num_types; i++) if (keymap->types[i].name == type_name) break; if (i >= keymap->num_types) { log_warn(keymap->ctx, "The type \"%s\" for key '%s' group %d was not previously defined; " "Using the default type\n", xkb_atom_text(keymap->ctx, type_name), KeyNameText(keymap->ctx, keyi->name), group + 1); goto use_default; } return &keymap->types[i]; use_default: /* * Index 0 is guaranteed to contain something, usually * ONE_LEVEL or at least some default one-level type. */ return &keymap->types[0]; } static bool CopySymbolsDefToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info, KeyInfo *keyi) { struct xkb_key *key; GroupInfo *groupi; const GroupInfo *group0; xkb_layout_index_t i; /* * The name is guaranteed to be real and not an alias (see * AddKeySymbols), so 'false' is safe here. */ key = XkbKeyByName(keymap, keyi->name, false); if (!key) { log_vrb(info->ctx, 5, "Key %s not found in keycodes; Symbols ignored\n", KeyInfoText(info, keyi)); return false; } /* Find the range of groups we need. */ key->num_groups = 0; darray_enumerate(i, groupi, keyi->groups) if (groupi->defined) key->num_groups = i + 1; if (key->num_groups <= 0) return false; /* WSGO */ darray_resize(keyi->groups, key->num_groups); /* * If there are empty groups between non-empty ones, fill them with data * from the first group. * We can make a wrong assumption here. But leaving gaps is worse. */ group0 = &darray_item(keyi->groups, 0); darray_foreach_from(groupi, keyi->groups, 1) { if (groupi->defined) continue; CopyGroupInfo(groupi, group0); } key->groups = calloc(key->num_groups, sizeof(*key->groups)); /* Find and assign the groups' types in the keymap. */ darray_enumerate(i, groupi, keyi->groups) { const struct xkb_key_type *type; bool explicit_type; type = FindTypeForGroup(keymap, keyi, i, &explicit_type); /* Always have as many levels as the type specifies. */ if (type->num_levels < darray_size(groupi->levels)) { struct xkb_level *leveli; log_vrb(info->ctx, 1, "Type \"%s\" has %d levels, but %s has %d levels; " "Ignoring extra symbols\n", xkb_atom_text(keymap->ctx, type->name), type->num_levels, KeyInfoText(info, keyi), (int) darray_size(groupi->levels)); darray_foreach_from(leveli, groupi->levels, type->num_levels) ClearLevelInfo(leveli); } darray_resize0(groupi->levels, type->num_levels); key->groups[i].explicit_type = explicit_type; key->groups[i].type = type; } /* Copy levels. */ darray_enumerate(i, groupi, keyi->groups) darray_steal(groupi->levels, &key->groups[i].levels, NULL); key->out_of_range_group_number = keyi->out_of_range_group_number; key->out_of_range_group_action = keyi->out_of_range_group_action; if (keyi->defined & KEY_FIELD_VMODMAP) { key->vmodmap = keyi->vmodmap; key->explicit |= EXPLICIT_VMODMAP; } if (keyi->repeat != KEY_REPEAT_UNDEFINED) { key->repeats = (keyi->repeat == KEY_REPEAT_YES); key->explicit |= EXPLICIT_REPEAT; } darray_foreach(groupi, keyi->groups) { if (groupi->defined & GROUP_FIELD_ACTS) { key->explicit |= EXPLICIT_INTERP; break; } } return true; } static bool CopyModMapDefToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info, ModMapEntry *entry) { struct xkb_key *key; if (!entry->haveSymbol) { key = XkbKeyByName(keymap, entry->u.keyName, true); if (!key) { log_vrb(info->ctx, 5, "Key %s not found in keycodes; " "Modifier map entry for %s not updated\n", KeyNameText(info->ctx, entry->u.keyName), ModIndexText(info->ctx, &info->mods, entry->modifier)); return false; } } else { key = FindKeyForSymbol(keymap, entry->u.keySym); if (!key) { log_vrb(info->ctx, 5, "Key \"%s\" not found in symbol map; " "Modifier map entry for %s not updated\n", KeysymText(info->ctx, entry->u.keySym), ModIndexText(info->ctx, &info->mods, entry->modifier)); return false; } } key->modmap |= (1u << entry->modifier); return true; } static bool CopySymbolsToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info) { KeyInfo *keyi; ModMapEntry *mm; keymap->symbols_section_name = strdup_safe(info->name); XkbEscapeMapName(keymap->symbols_section_name); keymap->mods = info->mods; darray_steal(info->group_names, &keymap->group_names, &keymap->num_group_names); darray_foreach(keyi, info->keys) if (!CopySymbolsDefToKeymap(keymap, info, keyi)) info->errorCount++; if (xkb_context_get_log_verbosity(keymap->ctx) > 3) { struct xkb_key *key; xkb_keys_foreach(key, keymap) { if (key->name == XKB_ATOM_NONE) continue; if (key->num_groups < 1) log_info(info->ctx, "No symbols defined for %s\n", KeyNameText(info->ctx, key->name)); } } darray_foreach(mm, info->modmaps) if (!CopyModMapDefToKeymap(keymap, info, mm)) info->errorCount++; /* XXX: If we don't ignore errorCount, things break. */ return true; } bool CompileSymbols(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge) { SymbolsInfo info; ActionsInfo *actions; actions = NewActionsInfo(); if (!actions) return false; InitSymbolsInfo(&info, keymap, actions, &keymap->mods); info.default_key.merge = merge; HandleSymbolsFile(&info, file, merge); if (info.errorCount != 0) goto err_info; if (!CopySymbolsToKeymap(keymap, &info)) goto err_info; ClearSymbolsInfo(&info); FreeActionsInfo(actions); return true; err_info: FreeActionsInfo(actions); ClearSymbolsInfo(&info); return false; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.608648 libxkbcommon-0.10.0/src/xkbcomp/types.c0000644000175000017500000005314300000000000017407 0ustar00ranran00000000000000/************************************************************ * 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 "config.h" #include "xkbcomp-priv.h" #include "text.h" #include "vmod.h" #include "expr.h" #include "include.h" enum type_field { TYPE_FIELD_MASK = (1 << 0), TYPE_FIELD_MAP = (1 << 1), TYPE_FIELD_PRESERVE = (1 << 2), TYPE_FIELD_LEVEL_NAME = (1 << 3), }; typedef struct { enum type_field defined; enum merge_mode merge; xkb_atom_t name; xkb_mod_mask_t mods; xkb_level_index_t num_levels; darray(struct xkb_key_type_entry) entries; darray(xkb_atom_t) level_names; } KeyTypeInfo; typedef struct { char *name; int errorCount; darray(KeyTypeInfo) types; struct xkb_mod_set mods; struct xkb_context *ctx; } KeyTypesInfo; /***====================================================================***/ static inline const char * MapEntryTxt(KeyTypesInfo *info, struct xkb_key_type_entry *entry) { return ModMaskText(info->ctx, &info->mods, entry->mods.mods); } static inline const char * TypeTxt(KeyTypesInfo *info, KeyTypeInfo *type) { return xkb_atom_text(info->ctx, type->name); } static inline const char * TypeMaskTxt(KeyTypesInfo *info, KeyTypeInfo *type) { return ModMaskText(info->ctx, &info->mods, type->mods); } static inline bool ReportTypeShouldBeArray(KeyTypesInfo *info, KeyTypeInfo *type, const char *field) { return ReportShouldBeArray(info->ctx, "key type", field, TypeTxt(info, type)); } static inline bool ReportTypeBadType(KeyTypesInfo *info, KeyTypeInfo *type, const char *field, const char *wanted) { return ReportBadType(info->ctx, "key type", field, TypeTxt(info, type), wanted); } /***====================================================================***/ static void InitKeyTypesInfo(KeyTypesInfo *info, struct xkb_context *ctx, const struct xkb_mod_set *mods) { memset(info, 0, sizeof(*info)); info->ctx = ctx; info->mods = *mods; } static void ClearKeyTypeInfo(KeyTypeInfo *type) { darray_free(type->entries); darray_free(type->level_names); } static void ClearKeyTypesInfo(KeyTypesInfo *info) { free(info->name); darray_free(info->types); } static KeyTypeInfo * FindMatchingKeyType(KeyTypesInfo *info, xkb_atom_t name) { KeyTypeInfo *old; darray_foreach(old, info->types) if (old->name == name) return old; return NULL; } static bool AddKeyType(KeyTypesInfo *info, KeyTypeInfo *new, bool same_file) { KeyTypeInfo *old; const int verbosity = xkb_context_get_log_verbosity(info->ctx); old = FindMatchingKeyType(info, new->name); if (old) { if (new->merge == MERGE_REPLACE || new->merge == MERGE_OVERRIDE) { if ((same_file && verbosity > 0) || verbosity > 9) { log_warn(info->ctx, "Multiple definitions of the %s key type; " "Earlier definition ignored\n", xkb_atom_text(info->ctx, new->name)); } ClearKeyTypeInfo(old); *old = *new; darray_init(new->entries); darray_init(new->level_names); return true; } if (same_file) log_vrb(info->ctx, 4, "Multiple definitions of the %s key type; " "Later definition ignored\n", xkb_atom_text(info->ctx, new->name)); ClearKeyTypeInfo(new); return true; } darray_append(info->types, *new); return true; } /***====================================================================***/ static void MergeIncludedKeyTypes(KeyTypesInfo *into, KeyTypesInfo *from, enum merge_mode merge) { if (from->errorCount > 0) { into->errorCount += from->errorCount; return; } into->mods = from->mods; if (into->name == NULL) { into->name = from->name; from->name = NULL; } if (darray_empty(into->types)) { into->types = from->types; darray_init(from->types); } else { KeyTypeInfo *type; darray_foreach(type, from->types) { type->merge = (merge == MERGE_DEFAULT ? type->merge : merge); if (!AddKeyType(into, type, false)) into->errorCount++; } } } static void HandleKeyTypesFile(KeyTypesInfo *info, XkbFile *file, enum merge_mode merge); static bool HandleIncludeKeyTypes(KeyTypesInfo *info, IncludeStmt *include) { KeyTypesInfo included; InitKeyTypesInfo(&included, info->ctx, &info->mods); included.name = include->stmt; include->stmt = NULL; for (IncludeStmt *stmt = include; stmt; stmt = stmt->next_incl) { KeyTypesInfo next_incl; XkbFile *file; file = ProcessIncludeFile(info->ctx, stmt, FILE_TYPE_TYPES); if (!file) { info->errorCount += 10; ClearKeyTypesInfo(&included); return false; } InitKeyTypesInfo(&next_incl, info->ctx, &included.mods); HandleKeyTypesFile(&next_incl, file, stmt->merge); MergeIncludedKeyTypes(&included, &next_incl, stmt->merge); ClearKeyTypesInfo(&next_incl); FreeXkbFile(file); } MergeIncludedKeyTypes(info, &included, include->merge); ClearKeyTypesInfo(&included); return (info->errorCount == 0); } /***====================================================================***/ static bool SetModifiers(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, ExprDef *value) { xkb_mod_mask_t mods; if (arrayNdx) log_warn(info->ctx, "The modifiers field of a key type is not an array; " "Illegal array subscript ignored\n"); if (!ExprResolveModMask(info->ctx, value, MOD_BOTH, &info->mods, &mods)) { log_err(info->ctx, "Key type mask field must be a modifier mask; " "Key type definition ignored\n"); return false; } if (type->defined & TYPE_FIELD_MASK) { log_warn(info->ctx, "Multiple modifier mask definitions for key type %s; " "Using %s, ignoring %s\n", xkb_atom_text(info->ctx, type->name), TypeMaskTxt(info, type), ModMaskText(info->ctx, &info->mods, mods)); return false; } type->mods = mods; return true; } /***====================================================================***/ static struct xkb_key_type_entry * FindMatchingMapEntry(KeyTypeInfo *type, xkb_mod_mask_t mods) { struct xkb_key_type_entry *entry; darray_foreach(entry, type->entries) if (entry->mods.mods == mods) return entry; return NULL; } static bool AddMapEntry(KeyTypesInfo *info, KeyTypeInfo *type, struct xkb_key_type_entry *new, bool clobber, bool report) { struct xkb_key_type_entry *old; old = FindMatchingMapEntry(type, new->mods.mods); if (old) { if (report && old->level != new->level) { log_warn(info->ctx, "Multiple map entries for %s in %s; " "Using %d, ignoring %d\n", MapEntryTxt(info, new), TypeTxt(info, type), (clobber ? new->level : old->level) + 1, (clobber ? old->level : new->level) + 1); } else { log_vrb(info->ctx, 10, "Multiple occurrences of map[%s]= %d in %s; Ignored\n", MapEntryTxt(info, new), new->level + 1, TypeTxt(info, type)); return true; } if (clobber) { if (new->level >= type->num_levels) type->num_levels = new->level + 1; old->level = new->level; } return true; } if (new->level >= type->num_levels) type->num_levels = new->level + 1; darray_append(type->entries, *new); return true; } static bool SetMapEntry(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, ExprDef *value) { struct xkb_key_type_entry entry; if (arrayNdx == NULL) return ReportTypeShouldBeArray(info, type, "map entry"); if (!ExprResolveModMask(info->ctx, arrayNdx, MOD_BOTH, &info->mods, &entry.mods.mods)) return ReportTypeBadType(info, type, "map entry", "modifier mask"); if (entry.mods.mods & (~type->mods)) { log_vrb(info->ctx, 1, "Map entry for unused modifiers in %s; " "Using %s instead of %s\n", TypeTxt(info, type), ModMaskText(info->ctx, &info->mods, entry.mods.mods & type->mods), MapEntryTxt(info, &entry)); entry.mods.mods &= type->mods; } if (!ExprResolveLevel(info->ctx, value, &entry.level)) { log_err(info->ctx, "Level specifications in a key type must be integer; " "Ignoring malformed level specification\n"); return false; } entry.preserve.mods = 0; return AddMapEntry(info, type, &entry, true, true); } /***====================================================================***/ static bool AddPreserve(KeyTypesInfo *info, KeyTypeInfo *type, xkb_mod_mask_t mods, xkb_mod_mask_t preserve_mods) { struct xkb_key_type_entry *entry; struct xkb_key_type_entry new; darray_foreach(entry, type->entries) { if (entry->mods.mods != mods) continue; /* Map exists without previous preserve (or "None"); override. */ if (entry->preserve.mods == 0) { entry->preserve.mods = preserve_mods; return true; } /* Map exists with same preserve; do nothing. */ if (entry->preserve.mods == preserve_mods) { log_vrb(info->ctx, 10, "Identical definitions for preserve[%s] in %s; " "Ignored\n", ModMaskText(info->ctx, &info->mods, mods), TypeTxt(info, type)); return true; } /* Map exists with different preserve; latter wins. */ log_vrb(info->ctx, 1, "Multiple definitions for preserve[%s] in %s; " "Using %s, ignoring %s\n", ModMaskText(info->ctx, &info->mods, mods), TypeTxt(info, type), ModMaskText(info->ctx, &info->mods, preserve_mods), ModMaskText(info->ctx, &info->mods, entry->preserve.mods)); entry->preserve.mods = preserve_mods; return true; } /* * Map does not exist, i.e. preserve[] came before map[]. * Create a map with the specified mask mapping to Level1. The level * may be overridden later with an explicit map[] statement. */ new.level = 0; new.mods.mods = mods; new.preserve.mods = preserve_mods; darray_append(type->entries, new); return true; } static bool SetPreserve(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, ExprDef *value) { xkb_mod_mask_t mods, preserve_mods; if (arrayNdx == NULL) return ReportTypeShouldBeArray(info, type, "preserve entry"); if (!ExprResolveModMask(info->ctx, arrayNdx, MOD_BOTH, &info->mods, &mods)) return ReportTypeBadType(info, type, "preserve entry", "modifier mask"); if (mods & ~type->mods) { const char *before, *after; before = ModMaskText(info->ctx, &info->mods, mods); mods &= type->mods; after = ModMaskText(info->ctx, &info->mods, mods); log_vrb(info->ctx, 1, "Preserve for modifiers not used by the %s type; " "Index %s converted to %s\n", TypeTxt(info, type), before, after); } if (!ExprResolveModMask(info->ctx, value, MOD_BOTH, &info->mods, &preserve_mods)) { log_err(info->ctx, "Preserve value in a key type is not a modifier mask; " "Ignoring preserve[%s] in type %s\n", ModMaskText(info->ctx, &info->mods, mods), TypeTxt(info, type)); return false; } if (preserve_mods & ~mods) { const char *before, *after; before = ModMaskText(info->ctx, &info->mods, preserve_mods); preserve_mods &= mods; after = ModMaskText(info->ctx, &info->mods, preserve_mods); log_vrb(info->ctx, 1, "Illegal value for preserve[%s] in type %s; " "Converted %s to %s\n", ModMaskText(info->ctx, &info->mods, mods), TypeTxt(info, type), before, after); } return AddPreserve(info, type, mods, preserve_mods); } /***====================================================================***/ static bool AddLevelName(KeyTypesInfo *info, KeyTypeInfo *type, xkb_level_index_t level, xkb_atom_t name, bool clobber) { /* New name. */ if (level >= darray_size(type->level_names)) { darray_resize0(type->level_names, level + 1); goto finish; } /* Same level, same name. */ if (darray_item(type->level_names, level) == name) { log_vrb(info->ctx, 10, "Duplicate names for level %d of key type %s; Ignored\n", level + 1, TypeTxt(info, type)); return true; } /* Same level, different name. */ if (darray_item(type->level_names, level) != XKB_ATOM_NONE) { const char *old, *new; old = xkb_atom_text(info->ctx, darray_item(type->level_names, level)); new = xkb_atom_text(info->ctx, name); log_vrb(info->ctx, 1, "Multiple names for level %d of key type %s; " "Using %s, ignoring %s\n", level + 1, TypeTxt(info, type), (clobber ? new : old), (clobber ? old : new)); if (!clobber) return true; } /* XXX: What about different level, same name? */ finish: darray_item(type->level_names, level) = name; return true; } static bool SetLevelName(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, ExprDef *value) { xkb_level_index_t level; xkb_atom_t level_name; if (arrayNdx == NULL) return ReportTypeShouldBeArray(info, type, "level name"); if (!ExprResolveLevel(info->ctx, arrayNdx, &level)) return ReportTypeBadType(info, type, "level name", "integer"); if (!ExprResolveString(info->ctx, value, &level_name)) { log_err(info->ctx, "Non-string name for level %d in key type %s; " "Ignoring illegal level name definition\n", level + 1, xkb_atom_text(info->ctx, type->name)); return false; } return AddLevelName(info, type, level, level_name, true); } /***====================================================================***/ static bool SetKeyTypeField(KeyTypesInfo *info, KeyTypeInfo *type, const char *field, ExprDef *arrayNdx, ExprDef *value) { bool ok = false; enum type_field type_field = 0; if (istreq(field, "modifiers")) { type_field = TYPE_FIELD_MASK; ok = SetModifiers(info, type, arrayNdx, value); } else if (istreq(field, "map")) { type_field = TYPE_FIELD_MAP; ok = SetMapEntry(info, type, arrayNdx, value); } else if (istreq(field, "preserve")) { type_field = TYPE_FIELD_PRESERVE; ok = SetPreserve(info, type, arrayNdx, value); } else if (istreq(field, "levelname") || istreq(field, "level_name")) { type_field = TYPE_FIELD_LEVEL_NAME; ok = SetLevelName(info, type, arrayNdx, value); } else { log_err(info->ctx, "Unknown field %s in key type %s; Definition ignored\n", field, TypeTxt(info, type)); } type->defined |= type_field; return ok; } static bool HandleKeyTypeBody(KeyTypesInfo *info, VarDef *def, KeyTypeInfo *type) { bool ok = true; const char *elem, *field; ExprDef *arrayNdx; for (; def; def = (VarDef *) def->common.next) { ok = ExprResolveLhs(info->ctx, def->name, &elem, &field, &arrayNdx); if (!ok) continue; if (elem && istreq(elem, "type")) { log_err(info->ctx, "Support for changing the default type has been removed; " "Statement ignored\n"); continue; } ok = SetKeyTypeField(info, type, field, arrayNdx, def->value); } return ok; } static bool HandleKeyTypeDef(KeyTypesInfo *info, KeyTypeDef *def, enum merge_mode merge) { KeyTypeInfo type = { .defined = 0, .merge = (def->merge == MERGE_DEFAULT ? merge : def->merge), .name = def->name, .mods = 0, .num_levels = 1, .entries = darray_new(), .level_names = darray_new(), }; if (!HandleKeyTypeBody(info, def->body, &type)) { info->errorCount++; return false; } if (!AddKeyType(info, &type, true)) { info->errorCount++; return false; } return true; } static void HandleKeyTypesFile(KeyTypesInfo *info, XkbFile *file, enum merge_mode merge) { bool ok; free(info->name); info->name = strdup_safe(file->name); for (ParseCommon *stmt = file->defs; stmt; stmt = stmt->next) { switch (stmt->type) { case STMT_INCLUDE: ok = HandleIncludeKeyTypes(info, (IncludeStmt *) stmt); break; case STMT_TYPE: ok = HandleKeyTypeDef(info, (KeyTypeDef *) stmt, merge); break; case STMT_VAR: log_err(info->ctx, "Support for changing the default type has been removed; " "Statement ignored\n"); ok = true; break; case STMT_VMOD: ok = HandleVModDef(info->ctx, &info->mods, (VModDef *) stmt, merge); break; default: log_err(info->ctx, "Key type files may not include other declarations; " "Ignoring %s\n", stmt_type_to_string(stmt->type)); ok = false; break; } if (!ok) info->errorCount++; if (info->errorCount > 10) { log_err(info->ctx, "Abandoning keytypes file \"%s\"\n", file->name); break; } } } /***====================================================================***/ static bool CopyKeyTypesToKeymap(struct xkb_keymap *keymap, KeyTypesInfo *info) { unsigned num_types; struct xkb_key_type *types; num_types = darray_empty(info->types) ? 1 : darray_size(info->types); types = calloc(num_types, sizeof(*types)); if (!types) return false; /* * If no types were specified, a default unnamed one-level type is * used for all keys. */ if (darray_empty(info->types)) { struct xkb_key_type *type = &types[0]; type->mods.mods = 0; type->num_levels = 1; type->entries = NULL; type->num_entries = 0; type->name = xkb_atom_intern_literal(keymap->ctx, "default"); type->level_names = NULL; type->num_level_names = 0; } else { for (unsigned i = 0; i < num_types; i++) { KeyTypeInfo *def = &darray_item(info->types, i); struct xkb_key_type *type = &types[i]; type->name = def->name; type->mods.mods = def->mods; type->num_levels = def->num_levels; darray_steal(def->level_names, &type->level_names, &type->num_level_names); darray_steal(def->entries, &type->entries, &type->num_entries); } } keymap->types_section_name = strdup_safe(info->name); XkbEscapeMapName(keymap->types_section_name); keymap->num_types = num_types; keymap->types = types; keymap->mods = info->mods; return true; } /***====================================================================***/ bool CompileKeyTypes(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge) { KeyTypesInfo info; InitKeyTypesInfo(&info, keymap->ctx, &keymap->mods); HandleKeyTypesFile(&info, file, merge); if (info.errorCount != 0) goto err_info; if (!CopyKeyTypesToKeymap(keymap, &info)) goto err_info; ClearKeyTypesInfo(&info); return true; err_info: ClearKeyTypesInfo(&info); return false; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6119812 libxkbcommon-0.10.0/src/xkbcomp/vmod.c0000644000175000017500000000731300000000000017206 0ustar00ranran00000000000000/************************************************************ * 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 "config.h" #include "xkbcomp-priv.h" #include "text.h" #include "expr.h" #include "vmod.h" bool HandleVModDef(struct xkb_context *ctx, struct xkb_mod_set *mods, VModDef *stmt, enum merge_mode merge) { xkb_mod_index_t i; struct xkb_mod *mod; xkb_mod_mask_t mapping; merge = (merge == MERGE_DEFAULT ? stmt->merge : merge); if (stmt->value) { /* * This is a statement such as 'virtualModifiers NumLock = Mod1'; * it sets the vmod-to-real-mod[s] mapping directly instead of going * through modifier_map or some such. */ if (!ExprResolveModMask(ctx, stmt->value, MOD_REAL, mods, &mapping)) { log_err(ctx, "Declaration of %s ignored\n", xkb_atom_text(ctx, stmt->name)); return false; } } else { mapping = 0; } xkb_mods_enumerate(i, mod, mods) { if (mod->name == stmt->name) { if (mod->type != MOD_VIRT) { log_err(ctx, "Can't add a virtual modifier named \"%s\"; " "there is already a non-virtual modifier with this name! Ignored\n", xkb_atom_text(ctx, mod->name)); return false; } if (mod->mapping == mapping) return true; if (mod->mapping != 0) { xkb_mod_mask_t use, ignore; use = (merge == MERGE_OVERRIDE ? mapping : mod->mapping); ignore = (merge == MERGE_OVERRIDE ? mod->mapping : mapping); log_warn(ctx, "Virtual modifier %s defined multiple times; " "Using %s, ignoring %s\n", xkb_atom_text(ctx, stmt->name), ModMaskText(ctx, mods, use), ModMaskText(ctx, mods, ignore)); mapping = use; } mod->mapping = mapping; return true; } } if (mods->num_mods >= XKB_MAX_MODS) { log_err(ctx, "Too many modifiers defined (maximum %d)\n", XKB_MAX_MODS); return false; } mods->mods[mods->num_mods].name = stmt->name; mods->mods[mods->num_mods].type = MOD_VIRT; mods->mods[mods->num_mods].mapping = mapping; mods->num_mods++; return true; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6119812 libxkbcommon-0.10.0/src/xkbcomp/vmod.h0000644000175000017500000000277300000000000017220 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ #ifndef XKBCOMP_VMOD_H #define XKBCOMP_VMOD_H bool HandleVModDef(struct xkb_context *ctx, struct xkb_mod_set *mods, VModDef *stmt, enum merge_mode merge); #endif ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6253145 libxkbcommon-0.10.0/src/xkbcomp/xkbcomp-priv.h0000644000175000017500000000742700000000000020675 0ustar00ranran00000000000000/************************************************************ * 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. * ********************************************************/ #ifndef XKBCOMP_PRIV_H #define XKBCOMP_PRIV_H #include "keymap.h" #include "ast.h" struct xkb_component_names { char *keycodes; char *types; char *compat; char *symbols; }; char * text_v1_keymap_get_as_string(struct xkb_keymap *keymap); XkbFile * XkbParseFile(struct xkb_context *ctx, FILE *file, const char *file_name, const char *map); XkbFile * XkbParseString(struct xkb_context *ctx, const char *string, size_t len, const char *file_name, const char *map); void FreeXkbFile(XkbFile *file); XkbFile * XkbFileFromComponents(struct xkb_context *ctx, const struct xkb_component_names *kkctgs); bool CompileKeycodes(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge); bool CompileKeyTypes(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge); bool CompileCompatMap(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge); bool CompileSymbols(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge); bool CompileKeymap(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge); /***====================================================================***/ static inline bool ReportNotArray(struct xkb_context *ctx, const char *type, const char *field, const char *name) { log_err(ctx, "The %s %s field is not an array; " "Ignoring illegal assignment in %s\n", type, field, name); return false; } static inline bool ReportShouldBeArray(struct xkb_context *ctx, const char *type, const char *field, const char *name) { log_err(ctx, "Missing subscript for %s %s; " "Ignoring illegal assignment in %s\n", type, field, name); return false; } static inline bool ReportBadType(struct xkb_context *ctx, const char *type, const char *field, const char *name, const char *wanted) { log_err(ctx, "The %s %s field must be a %s; " "Ignoring illegal assignment in %s\n", type, field, wanted, name); return false; } static inline bool ReportBadField(struct xkb_context *ctx, const char *type, const char *field, const char *name) { log_err(ctx, "Unknown %s field %s in %s; " "Ignoring assignment to unknown field in %s\n", type, field, name, name); return false; } #endif ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6353142 libxkbcommon-0.10.0/src/xkbcomp/xkbcomp.c0000644000175000017500000001066200000000000017705 0ustar00ranran00000000000000/* * 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. * * Authors: Dan Nicholson * Ran Benita * Daniel Stone */ #include "config.h" #include "xkbcomp-priv.h" #include "rules.h" static bool compile_keymap_file(struct xkb_keymap *keymap, XkbFile *file) { if (file->file_type != FILE_TYPE_KEYMAP) { log_err(keymap->ctx, "Cannot compile a %s file alone into a keymap\n", xkb_file_type_to_string(file->file_type)); return false; } if (!CompileKeymap(file, keymap, MERGE_OVERRIDE)) { log_err(keymap->ctx, "Failed to compile keymap\n"); return false; } return true; } static bool text_v1_keymap_new_from_names(struct xkb_keymap *keymap, const struct xkb_rule_names *rmlvo) { bool ok; struct xkb_component_names kccgst; XkbFile *file; log_dbg(keymap->ctx, "Compiling from RMLVO: rules '%s', model '%s', layout '%s', " "variant '%s', options '%s'\n", rmlvo->rules, rmlvo->model, rmlvo->layout, rmlvo->variant, rmlvo->options); ok = xkb_components_from_rules(keymap->ctx, rmlvo, &kccgst); if (!ok) { log_err(keymap->ctx, "Couldn't look up rules '%s', model '%s', layout '%s', " "variant '%s', options '%s'\n", rmlvo->rules, rmlvo->model, rmlvo->layout, rmlvo->variant, rmlvo->options); return false; } log_dbg(keymap->ctx, "Compiling from KcCGST: keycodes '%s', types '%s', " "compat '%s', symbols '%s'\n", kccgst.keycodes, kccgst.types, kccgst.compat, kccgst.symbols); file = XkbFileFromComponents(keymap->ctx, &kccgst); free(kccgst.keycodes); free(kccgst.types); free(kccgst.compat); free(kccgst.symbols); if (!file) { log_err(keymap->ctx, "Failed to generate parsed XKB file from components\n"); return false; } ok = compile_keymap_file(keymap, file); FreeXkbFile(file); return ok; } static bool text_v1_keymap_new_from_string(struct xkb_keymap *keymap, const char *string, size_t len) { bool ok; XkbFile *xkb_file; xkb_file = XkbParseString(keymap->ctx, string, len, "(input string)", NULL); if (!xkb_file) { log_err(keymap->ctx, "Failed to parse input xkb string\n"); return false; } ok = compile_keymap_file(keymap, xkb_file); FreeXkbFile(xkb_file); return ok; } static bool text_v1_keymap_new_from_file(struct xkb_keymap *keymap, FILE *file) { bool ok; XkbFile *xkb_file; xkb_file = XkbParseFile(keymap->ctx, file, "(unknown file)", NULL); if (!xkb_file) { log_err(keymap->ctx, "Failed to parse input xkb file\n"); return false; } ok = compile_keymap_file(keymap, xkb_file); FreeXkbFile(xkb_file); return ok; } const struct xkb_keymap_format_ops text_v1_keymap_format_ops = { .keymap_new_from_names = text_v1_keymap_new_from_names, .keymap_new_from_string = text_v1_keymap_new_from_string, .keymap_new_from_file = text_v1_keymap_new_from_file, .keymap_get_as_string = text_v1_keymap_get_as_string, }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381982.0119767 libxkbcommon-0.10.0/test/0000755000175000017500000000000000000000000014616 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6486475 libxkbcommon-0.10.0/test/.gitignore0000644000175000017500000000036100000000000016606 0ustar00ranran00000000000000*.log *.trs filecomp rulescomp keymap keysym state context rules-file stringcomp buffercomp keyseq log interactive-evdev rmlvo-to-kccgst rmlvo-to-keymap print-compiled-keymap atom x11 interactive-x11 interactive-wayland utf8 x11comp compose ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6553142 libxkbcommon-0.10.0/test/atom.c0000644000175000017500000001335300000000000015727 0ustar00ranran00000000000000/* * 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. */ #include "config.h" #include #include "test.h" #include "atom.h" #define INTERN_LITERAL(table, literal) \ atom_intern(table, literal, sizeof(literal) - 1, true) #define LOOKUP_LITERAL(table, literal) \ atom_intern(table, literal, sizeof(literal) - 1, false) static void random_string(char **str_out, size_t *len_out) { /* Keep this small, so collisions might happen. */ static const char random_chars[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }; size_t len; char *str; len = rand() % 15; str = malloc(len + 1); assert(str); for (size_t i = 0; i < len; i++) str[i] = random_chars[rand() % ARRAY_SIZE(random_chars)]; /* Don't always terminate it; should work without. */ if (rand() % 2 == 0) str[len] = '\0'; *str_out = str; *len_out = len; } static void test_random_strings(void) { struct atom_string { xkb_atom_t atom; char *string; size_t len; }; struct atom_table *table; struct atom_string *arr; int N; xkb_atom_t atom; const char *string; table = atom_table_new(); assert(table); unsigned seed = (unsigned) clock(); srand(seed); N = 1 + rand() % 100000; arr = calloc(N, sizeof(*arr)); assert(arr); for (int i = 0; i < N; i++) { random_string(&arr[i].string, &arr[i].len); atom = atom_intern(table, arr[i].string, arr[i].len, false); if (atom != XKB_ATOM_NONE) { string = atom_text(table, atom); assert(string); if (arr[i].len != strlen(string) || strncmp(string, arr[i].string, arr[i].len) != 0) { fprintf(stderr, "got a collision, but strings don't match!\n"); fprintf(stderr, "existing length %zu, string %s\n", strlen(string), string); fprintf(stderr, "new length %zu, string %.*s\n", arr[i].len, (int) arr[i].len, arr[i].string); fprintf(stderr, "seed: %u\n", seed); assert(false); } /* OK, got a real collision. */ free(arr[i].string); i--; continue; } arr[i].atom = atom_intern(table, arr[i].string, arr[i].len, true); if (arr[i].atom == XKB_ATOM_NONE) { fprintf(stderr, "failed to intern! len: %zu, string: %.*s\n", arr[i].len, (int) arr[i].len, arr[i].string); fprintf(stderr, "seed: %u\n", seed); assert(false); } } for (int i = 0; i < N; i++) { string = atom_text(table, arr[i].atom); assert(string); if (arr[i].len != strlen(string) || strncmp(string, arr[i].string, arr[i].len) != 0) { fprintf(stderr, "looked-up string doesn't match!\n"); fprintf(stderr, "found length %zu, string %s\n", strlen(string), string); fprintf(stderr, "expected length %zu, string %.*s\n", arr[i].len, (int) arr[i].len, arr[i].string); /* Since this is random, we need to dump the failing data, * so we might have some chance to reproduce. */ fprintf(stderr, "START dump of arr, N=%d\n", N); for (int j = 0; j < N; j++) { fprintf(stderr, "%u\t\t%zu\t\t%.*s\n", arr[i].atom, arr[i].len, (int) arr[i].len, arr[i].string); } fprintf(stderr, "END\n"); fprintf(stderr, "seed: %u\n", seed); assert(false); } } for (int i = 0; i < N; i++) free(arr[i].string); free(arr); atom_table_free(table); } int main(void) { struct atom_table *table; xkb_atom_t atom1, atom2, atom3; table = atom_table_new(); assert(table); assert(atom_text(table, XKB_ATOM_NONE) == NULL); assert(atom_intern(table, NULL, 0, false) == XKB_ATOM_NONE); atom1 = INTERN_LITERAL(table, "hello"); assert(atom1 != XKB_ATOM_NONE); assert(atom1 == LOOKUP_LITERAL(table, "hello")); assert(streq(atom_text(table, atom1), "hello")); atom2 = atom_intern(table, "hello", 3, true); assert(atom2 != XKB_ATOM_NONE); assert(atom1 != atom2); assert(streq(atom_text(table, atom2), "hel")); assert(LOOKUP_LITERAL(table, "hel") == atom2); assert(LOOKUP_LITERAL(table, "hell") == XKB_ATOM_NONE); assert(LOOKUP_LITERAL(table, "hello") == atom1); atom3 = atom_intern(table, "", 0, true); assert(atom3 != XKB_ATOM_NONE); assert(LOOKUP_LITERAL(table, "") == atom3); atom_table_free(table); test_random_strings(); return 0; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.665314 libxkbcommon-0.10.0/test/buffercomp.c0000644000175000017500000000607700000000000017124 0ustar00ranran00000000000000/* * Copyright © 2009 Dan Nicholson * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include #include #include "test.h" #define DATA_PATH "keymaps/stringcomp.data" int main(int argc, char *argv[]) { struct xkb_context *ctx = test_get_context(0); struct xkb_keymap *keymap; char *original, *dump; assert(ctx); /* Load in a prebuilt keymap, make sure we can compile it from memory, * then compare it to make sure we get the same result when dumping it * to a string. */ original = test_read_file(DATA_PATH); assert(original); keymap = test_compile_buffer(ctx, original, strlen(original)); assert(keymap); dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_USE_ORIGINAL_FORMAT); assert(dump); if (!streq(original, dump)) { fprintf(stderr, "round-trip test failed: dumped map differs from original\n"); fprintf(stderr, "path to original file: %s\n", test_get_path(DATA_PATH)); fprintf(stderr, "length: dumped %lu, original %lu\n", (unsigned long) strlen(dump), (unsigned long) strlen(original)); fprintf(stderr, "dumped map:\n"); fprintf(stderr, "%s\n", dump); fflush(stderr); assert(0); } free(original); free(dump); xkb_keymap_unref(keymap); /* Make sure we can't (falsely claim to) compile an empty string. */ keymap = test_compile_buffer(ctx, "", 0); assert(!keymap); /* Make sure we can recompile our output for a normal keymap from rules. */ keymap = test_compile_rules(ctx, NULL, NULL, "ru,ca,de,us", ",multix,neo,intl", NULL); assert(keymap); dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_USE_ORIGINAL_FORMAT); assert(dump); xkb_keymap_unref(keymap); keymap = test_compile_buffer(ctx, dump, strlen(dump)); assert(keymap); xkb_keymap_unref(keymap); free(dump); xkb_context_unref(ctx); return 0; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.665314 libxkbcommon-0.10.0/test/common.c0000644000175000017500000003311100000000000016251 0ustar00ranran00000000000000/* * 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 shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the names of the authors or their * institutions shall not be used in advertising or otherwise to promote the * sale, use or other dealings in this Software without prior written * authorization from the authors. * * Author: Dan Nicholson * Daniel Stone * Ran Benita */ #include "config.h" #include #include #include #include #ifdef _MSC_VER #include #include #else #include #include #endif #include "test.h" #include "utils.h" /* * Test a sequence of keysyms, resulting from a sequence of key presses, * against the keysyms they're supposed to generate. * * - Each test runs with a clean state. * - Each line in the test is made up of: * + A keycode, given as a KEY_* from linux/input.h. * + A direction - DOWN for press, UP for release, BOTH for * immediate press + release, REPEAT to just get the syms. * + A sequence of keysyms that should result from this keypress. * * The vararg format is: * * * See below for examples. */ int test_key_seq_va(struct xkb_keymap *keymap, va_list ap) { struct xkb_state *state; xkb_keycode_t kc; int op; xkb_keysym_t keysym; const xkb_keysym_t *syms; xkb_keysym_t sym; unsigned int nsyms, i; char ksbuf[64]; fprintf(stderr, "----\n"); state = xkb_state_new(keymap); assert(state); for (;;) { kc = va_arg(ap, int) + EVDEV_OFFSET; op = va_arg(ap, int); nsyms = xkb_state_key_get_syms(state, kc, &syms); if (nsyms == 1) { sym = xkb_state_key_get_one_sym(state, kc); syms = &sym; } fprintf(stderr, "got %u syms for keycode %u: [", nsyms, kc); if (op == DOWN || op == BOTH) xkb_state_update_key(state, kc, XKB_KEY_DOWN); if (op == UP || op == BOTH) xkb_state_update_key(state, kc, XKB_KEY_UP); for (i = 0; i < nsyms; i++) { keysym = va_arg(ap, int); xkb_keysym_get_name(syms[i], ksbuf, sizeof(ksbuf)); fprintf(stderr, "%s%s", (i != 0) ? ", " : "", ksbuf); if (keysym == FINISH || keysym == NEXT) { xkb_keysym_get_name(syms[i], ksbuf, sizeof(ksbuf)); fprintf(stderr, "Did not expect keysym: %s.\n", ksbuf); goto fail; } if (keysym != syms[i]) { xkb_keysym_get_name(keysym, ksbuf, sizeof(ksbuf)); fprintf(stderr, "Expected keysym: %s. ", ksbuf);; xkb_keysym_get_name(syms[i], ksbuf, sizeof(ksbuf)); fprintf(stderr, "Got keysym: %s.\n", ksbuf);; goto fail; } } if (nsyms == 0) { keysym = va_arg(ap, int); if (keysym != XKB_KEY_NoSymbol) { xkb_keysym_get_name(keysym, ksbuf, sizeof(ksbuf)); fprintf(stderr, "Expected %s, but got no keysyms.\n", ksbuf); goto fail; } } fprintf(stderr, "]\n"); keysym = va_arg(ap, int); if (keysym == NEXT) continue; if (keysym == FINISH) break; xkb_keysym_get_name(keysym, ksbuf, sizeof(ksbuf)); fprintf(stderr, "Expected keysym: %s. Didn't get it.\n", ksbuf); goto fail; } xkb_state_unref(state); return 1; fail: xkb_state_unref(state); return 0; } int test_key_seq(struct xkb_keymap *keymap, ...) { va_list ap; int ret; va_start(ap, keymap); ret = test_key_seq_va(keymap, ap); va_end(ap); return ret; } char * test_get_path(const char *path_rel) { int ret; char *path; const char *srcdir; srcdir = getenv("top_srcdir"); if (!srcdir) srcdir = "."; if (path_rel[0] == '/') return strdup(path_rel); ret = asprintf(&path, "%s/test/data%s%s", srcdir, path_rel[0] ? "/" : "", path_rel); if (ret < 0) { fprintf(stderr, "Failed to allocate path for %s\n", path_rel); return NULL; } return path; } char * test_read_file(const char *path_rel) { struct stat info; char *ret, *tmp, *path; int fd, count, remaining; path = test_get_path(path_rel); if (!path) return NULL; fd = open(path, O_RDONLY); free(path); if (fd < 0) return NULL; if (fstat(fd, &info) != 0) { close(fd); return NULL; } ret = malloc(info.st_size + 1); if (!ret) { close(fd); return NULL; } remaining = info.st_size; tmp = ret; while ((count = read(fd, tmp, remaining))) { remaining -= count; tmp += count; } ret[info.st_size] = '\0'; close(fd); if (remaining != 0) { free(ret); return NULL; } return ret; } struct xkb_context * test_get_context(enum test_context_flags test_flags) { enum xkb_context_flags ctx_flags; struct xkb_context *ctx; char *path; ctx_flags = XKB_CONTEXT_NO_DEFAULT_INCLUDES; if (test_flags & CONTEXT_ALLOW_ENVIRONMENT_NAMES) { unsetenv("XKB_DEFAULT_RULES"); unsetenv("XKB_DEFAULT_MODEL"); unsetenv("XKB_DEFAULT_LAYOUT"); unsetenv("XKB_DEFAULT_VARIANT"); unsetenv("XKB_DEFAULT_OPTIONS"); } else { ctx_flags |= XKB_CONTEXT_NO_ENVIRONMENT_NAMES; } ctx = xkb_context_new(ctx_flags); if (!ctx) return NULL; path = test_get_path(""); if (!path) { xkb_context_unref(ctx); return NULL; } xkb_context_include_path_append(ctx, path); free(path); return ctx; } struct xkb_keymap * test_compile_file(struct xkb_context *context, const char *path_rel) { struct xkb_keymap *keymap; FILE *file; char *path; path = test_get_path(path_rel); if (!path) return NULL; file = fopen(path, "rb"); if (!file) { fprintf(stderr, "Failed to open path: %s\n", path); free(path); return NULL; } assert(file != NULL); keymap = xkb_keymap_new_from_file(context, file, XKB_KEYMAP_FORMAT_TEXT_V1, 0); fclose(file); if (!keymap) { fprintf(stderr, "Failed to compile path: %s\n", path); free(path); return NULL; } fprintf(stderr, "Successfully compiled path: %s\n", path); free(path); return keymap; } struct xkb_keymap * test_compile_string(struct xkb_context *context, const char *string) { struct xkb_keymap *keymap; keymap = xkb_keymap_new_from_string(context, string, XKB_KEYMAP_FORMAT_TEXT_V1, 0); if (!keymap) { fprintf(stderr, "Failed to compile string\n"); return NULL; } return keymap; } struct xkb_keymap * test_compile_buffer(struct xkb_context *context, const char *buf, size_t len) { struct xkb_keymap *keymap; keymap = xkb_keymap_new_from_buffer(context, buf, len, XKB_KEYMAP_FORMAT_TEXT_V1, 0); if (!keymap) { fprintf(stderr, "Failed to compile keymap from memory buffer\n"); return NULL; } return keymap; } struct xkb_keymap * test_compile_rules(struct xkb_context *context, const char *rules, const char *model, const char *layout, const char *variant, const char *options) { struct xkb_keymap *keymap; struct xkb_rule_names rmlvo = { .rules = isempty(rules) ? NULL : rules, .model = isempty(model) ? NULL : model, .layout = isempty(layout) ? NULL : layout, .variant = isempty(variant) ? NULL : variant, .options = isempty(options) ? NULL : options }; if (!rules && !model && !layout && !variant && !options) keymap = xkb_keymap_new_from_names(context, NULL, 0); else keymap = xkb_keymap_new_from_names(context, &rmlvo, 0); if (!keymap) { fprintf(stderr, "Failed to compile RMLVO: '%s', '%s', '%s', '%s', '%s'\n", rules, model, layout, variant, options); return NULL; } return keymap; } void test_print_keycode_state(struct xkb_state *state, struct xkb_compose_state *compose_state, xkb_keycode_t keycode, enum xkb_consumed_mode consumed_mode) { struct xkb_keymap *keymap; xkb_keysym_t sym; const xkb_keysym_t *syms; int nsyms; char s[16]; xkb_layout_index_t layout; enum xkb_compose_status status; keymap = xkb_state_get_keymap(state); nsyms = xkb_state_key_get_syms(state, keycode, &syms); if (nsyms <= 0) return; status = XKB_COMPOSE_NOTHING; if (compose_state) status = xkb_compose_state_get_status(compose_state); if (status == XKB_COMPOSE_COMPOSING || status == XKB_COMPOSE_CANCELLED) return; if (status == XKB_COMPOSE_COMPOSED) { sym = xkb_compose_state_get_one_sym(compose_state); syms = &sym; nsyms = 1; } else if (nsyms == 1) { sym = xkb_state_key_get_one_sym(state, keycode); syms = &sym; } printf("keysyms [ "); for (int i = 0; i < nsyms; i++) { xkb_keysym_get_name(syms[i], s, sizeof(s)); printf("%-*s ", (int) sizeof(s), s); } printf("] "); if (status == XKB_COMPOSE_COMPOSED) xkb_compose_state_get_utf8(compose_state, s, sizeof(s)); else xkb_state_key_get_utf8(state, keycode, s, sizeof(s)); printf("unicode [ %s ] ", s); layout = xkb_state_key_get_layout(state, keycode); printf("layout [ %s (%d) ] ", xkb_keymap_layout_get_name(keymap, layout), layout); printf("level [ %d ] ", xkb_state_key_get_level(state, keycode, layout)); printf("mods [ "); for (xkb_mod_index_t mod = 0; mod < xkb_keymap_num_mods(keymap); mod++) { if (xkb_state_mod_index_is_active(state, mod, XKB_STATE_MODS_EFFECTIVE) <= 0) continue; if (xkb_state_mod_index_is_consumed2(state, keycode, mod, consumed_mode)) printf("-%s ", xkb_keymap_mod_get_name(keymap, mod)); else printf("%s ", xkb_keymap_mod_get_name(keymap, mod)); } printf("] "); printf("leds [ "); for (xkb_led_index_t led = 0; led < xkb_keymap_num_leds(keymap); led++) { if (xkb_state_led_index_is_active(state, led) <= 0) continue; printf("%s ", xkb_keymap_led_get_name(keymap, led)); } printf("] "); printf("\n"); } void test_print_state_changes(enum xkb_state_component changed) { if (changed == 0) return; printf("changed [ "); if (changed & XKB_STATE_LAYOUT_EFFECTIVE) printf("effective-layout "); if (changed & XKB_STATE_LAYOUT_DEPRESSED) printf("depressed-layout "); if (changed & XKB_STATE_LAYOUT_LATCHED) printf("latched-layout "); if (changed & XKB_STATE_LAYOUT_LOCKED) printf("locked-layout "); if (changed & XKB_STATE_MODS_EFFECTIVE) printf("effective-mods "); if (changed & XKB_STATE_MODS_DEPRESSED) printf("depressed-mods "); if (changed & XKB_STATE_MODS_LATCHED) printf("latched-mods "); if (changed & XKB_STATE_MODS_LOCKED) printf("locked-mods "); if (changed & XKB_STATE_LEDS) printf("leds "); printf("]\n"); } #ifdef _MSC_VER void test_disable_stdin_echo(void) { HANDLE stdin_handle = GetStdHandle(STD_INPUT_HANDLE); DWORD mode = 0; GetConsoleMode(stdin_handle, &mode); SetConsoleMode(stdin_handle, mode & ~ENABLE_ECHO_INPUT); } void test_enable_stdin_echo(void) { HANDLE stdin_handle = GetStdHandle(STD_INPUT_HANDLE); DWORD mode = 0; GetConsoleMode(stdin_handle, &mode); SetConsoleMode(stdin_handle, mode | ENABLE_ECHO_INPUT); } #else void test_disable_stdin_echo(void) { /* Same as `stty -echo`. */ struct termios termios; if (tcgetattr(STDIN_FILENO, &termios) == 0) { termios.c_lflag &= ~ECHO; (void) tcsetattr(STDIN_FILENO, TCSADRAIN, &termios); } } void test_enable_stdin_echo(void) { /* Same as `stty echo`. */ struct termios termios; if (tcgetattr(STDIN_FILENO, &termios) == 0) { termios.c_lflag |= ECHO; (void) tcsetattr(STDIN_FILENO, TCSADRAIN, &termios); } } #endif ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6719806 libxkbcommon-0.10.0/test/compose.c0000644000175000017500000005421100000000000016432 0ustar00ranran00000000000000/* * Copyright © 2014 Ran Benita * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "xkbcommon/xkbcommon-compose.h" #include "test.h" static const char * compose_status_string(enum xkb_compose_status status) { switch (status) { case XKB_COMPOSE_NOTHING: return "nothing"; case XKB_COMPOSE_COMPOSING: return "composing"; case XKB_COMPOSE_COMPOSED: return "composed"; case XKB_COMPOSE_CANCELLED: return "cancelled"; } return ""; } static const char * feed_result_string(enum xkb_compose_feed_result result) { switch (result) { case XKB_COMPOSE_FEED_IGNORED: return "ignored"; case XKB_COMPOSE_FEED_ACCEPTED: return "accepted"; } return ""; } /* * Feed a sequence of keysyms to a fresh compose state and test the outcome. * * The varargs consists of lines in the following format: * * Terminated by a line consisting only of XKB_KEY_NoSymbol. */ static bool test_compose_seq_va(struct xkb_compose_table *table, va_list ap) { int ret; struct xkb_compose_state *state; char buffer[64]; state = xkb_compose_state_new(table, XKB_COMPOSE_STATE_NO_FLAGS); assert(state); for (int i = 1; ; i++) { xkb_keysym_t input_keysym; enum xkb_compose_feed_result result, expected_result; enum xkb_compose_status status, expected_status; const char *expected_string; xkb_keysym_t keysym, expected_keysym; input_keysym = va_arg(ap, xkb_keysym_t); if (input_keysym == XKB_KEY_NoSymbol) break; expected_result = va_arg(ap, enum xkb_compose_feed_result); expected_status = va_arg(ap, enum xkb_compose_status); expected_string = va_arg(ap, const char *); expected_keysym = va_arg(ap, xkb_keysym_t); result = xkb_compose_state_feed(state, input_keysym); if (result != expected_result) { fprintf(stderr, "after feeding %d keysyms:\n", i); fprintf(stderr, "expected feed result: %s\n", feed_result_string(expected_result)); fprintf(stderr, "got feed result: %s\n", feed_result_string(result)); goto fail; } status = xkb_compose_state_get_status(state); if (status != expected_status) { fprintf(stderr, "after feeding %d keysyms:\n", i); fprintf(stderr, "expected status: %s\n", compose_status_string(expected_status)); fprintf(stderr, "got status: %s\n", compose_status_string(status)); goto fail; } ret = xkb_compose_state_get_utf8(state, buffer, sizeof(buffer)); if (ret < 0 || (size_t) ret >= sizeof(buffer)) { fprintf(stderr, "after feeding %d keysyms:\n", i); fprintf(stderr, "expected string: %s\n", expected_string); fprintf(stderr, "got error: %d\n", ret); goto fail; } if (!streq(buffer, expected_string)) { fprintf(stderr, "after feeding %d keysyms:\n", i); fprintf(stderr, "expected string: %s\n", strempty(expected_string)); fprintf(stderr, "got string: %s\n", buffer); goto fail; } keysym = xkb_compose_state_get_one_sym(state); if (keysym != expected_keysym) { fprintf(stderr, "after feeding %d keysyms:\n", i); xkb_keysym_get_name(expected_keysym, buffer, sizeof(buffer)); fprintf(stderr, "expected keysym: %s\n", buffer); xkb_keysym_get_name(keysym, buffer, sizeof(buffer)); fprintf(stderr, "got keysym (%#x): %s\n", keysym, buffer); goto fail; } } xkb_compose_state_unref(state); return true; fail: xkb_compose_state_unref(state); return false; } static bool test_compose_seq(struct xkb_compose_table *table, ...) { va_list ap; bool ok; va_start(ap, table); ok = test_compose_seq_va(table, ap); va_end(ap); return ok; } static bool test_compose_seq_buffer(struct xkb_context *ctx, const char *buffer, ...) { va_list ap; bool ok; struct xkb_compose_table *table; table = xkb_compose_table_new_from_buffer(ctx, buffer, strlen(buffer), "", XKB_COMPOSE_FORMAT_TEXT_V1, XKB_COMPOSE_COMPILE_NO_FLAGS); assert(table); va_start(ap, buffer); ok = test_compose_seq_va(table, ap); va_end(ap); xkb_compose_table_unref(table); return ok; } static void test_seqs(struct xkb_context *ctx) { struct xkb_compose_table *table; char *path; FILE *file; path = test_get_path("compose/en_US.UTF-8/Compose"); file = fopen(path, "rb"); assert(file); free(path); table = xkb_compose_table_new_from_file(ctx, file, "", XKB_COMPOSE_FORMAT_TEXT_V1, XKB_COMPOSE_COMPILE_NO_FLAGS); assert(table); fclose(file); assert(test_compose_seq(table, XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_space, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "~", XKB_KEY_asciitilde, XKB_KEY_NoSymbol)); assert(test_compose_seq(table, XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_space, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "~", XKB_KEY_asciitilde, XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_space, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "~", XKB_KEY_asciitilde, XKB_KEY_NoSymbol)); assert(test_compose_seq(table, XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "~", XKB_KEY_asciitilde, XKB_KEY_NoSymbol)); assert(test_compose_seq(table, XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_space, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "'", XKB_KEY_apostrophe, XKB_KEY_Caps_Lock, XKB_COMPOSE_FEED_IGNORED, XKB_COMPOSE_COMPOSED, "'", XKB_KEY_apostrophe, XKB_KEY_NoSymbol)); assert(test_compose_seq(table, XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "´", XKB_KEY_acute, XKB_KEY_NoSymbol)); assert(test_compose_seq(table, XKB_KEY_Multi_key, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_Shift_L, XKB_COMPOSE_FEED_IGNORED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_Caps_Lock, XKB_COMPOSE_FEED_IGNORED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_Control_L, XKB_COMPOSE_FEED_IGNORED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_T, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "@", XKB_KEY_at, XKB_KEY_NoSymbol)); assert(test_compose_seq(table, XKB_KEY_7, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_a, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_b, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_NoSymbol)); assert(test_compose_seq(table, XKB_KEY_Multi_key, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_apostrophe, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_7, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_CANCELLED, "", XKB_KEY_NoSymbol, XKB_KEY_7, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_Caps_Lock, XKB_COMPOSE_FEED_IGNORED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_NoSymbol)); xkb_compose_table_unref(table); /* Make sure one-keysym sequences work. */ assert(test_compose_seq_buffer(ctx, " : \"foo\" X \n" " : \"baz\" Y \n", XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "foo", XKB_KEY_X, XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "foo", XKB_KEY_X, XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "baz", XKB_KEY_Y, XKB_KEY_NoSymbol)); /* No sequences at all. */ assert(test_compose_seq_buffer(ctx, "", XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_Multi_key, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_NoSymbol)); /* Only keysym - string derived from keysym. */ assert(test_compose_seq_buffer(ctx, " : X \n" " : dollar \n" " : dead_acute \n", XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "X", XKB_KEY_X, XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "$", XKB_KEY_dollar, XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "", XKB_KEY_dead_acute, XKB_KEY_NoSymbol)); /* Make sure a cancelling keysym doesn't start a new sequence. */ assert(test_compose_seq_buffer(ctx, " : X \n" " : Y \n", XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_CANCELLED, "", XKB_KEY_NoSymbol, XKB_KEY_D, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_CANCELLED, "", XKB_KEY_NoSymbol, XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_D, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "Y", XKB_KEY_Y, XKB_KEY_NoSymbol)); } static void test_conflicting(struct xkb_context *ctx) { // new is prefix of old assert(test_compose_seq_buffer(ctx, " : \"foo\" A \n" " : \"bar\" B \n", XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "foo", XKB_KEY_A, XKB_KEY_NoSymbol)); // old is a prefix of new assert(test_compose_seq_buffer(ctx, " : \"bar\" B \n" " : \"foo\" A \n", XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "foo", XKB_KEY_A, XKB_KEY_NoSymbol)); // new duplicate of old assert(test_compose_seq_buffer(ctx, " : \"bar\" B \n" " : \"bar\" B \n", XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "bar", XKB_KEY_B, XKB_KEY_C, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_NOTHING, "", XKB_KEY_NoSymbol, XKB_KEY_NoSymbol)); // new same length as old #1 assert(test_compose_seq_buffer(ctx, " : \"foo\" A \n" " : \"bar\" B \n", XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "bar", XKB_KEY_B, XKB_KEY_NoSymbol)); // new same length as old #2 assert(test_compose_seq_buffer(ctx, " : \"foo\" A \n" " : \"foo\" B \n", XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "foo", XKB_KEY_B, XKB_KEY_NoSymbol)); // new same length as old #3 assert(test_compose_seq_buffer(ctx, " : \"foo\" A \n" " : \"bar\" A \n", XKB_KEY_A, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_B, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "bar", XKB_KEY_A, XKB_KEY_NoSymbol)); } static void test_state(struct xkb_context *ctx) { struct xkb_compose_table *table; struct xkb_compose_state *state; char *path; FILE *file; path = test_get_path("compose/en_US.UTF-8/Compose"); file = fopen(path, "rb"); assert(file); free(path); table = xkb_compose_table_new_from_file(ctx, file, "", XKB_COMPOSE_FORMAT_TEXT_V1, XKB_COMPOSE_COMPILE_NO_FLAGS); assert(table); fclose(file); state = xkb_compose_state_new(table, XKB_COMPOSE_STATE_NO_FLAGS); assert(state); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING); xkb_compose_state_reset(state); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING); xkb_compose_state_feed(state, XKB_KEY_NoSymbol); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING); xkb_compose_state_feed(state, XKB_KEY_Multi_key); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSING); xkb_compose_state_reset(state); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING); xkb_compose_state_feed(state, XKB_KEY_Multi_key); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSING); xkb_compose_state_feed(state, XKB_KEY_Multi_key); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_CANCELLED); xkb_compose_state_feed(state, XKB_KEY_Multi_key); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSING); xkb_compose_state_feed(state, XKB_KEY_Multi_key); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_CANCELLED); xkb_compose_state_reset(state); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING); xkb_compose_state_feed(state, XKB_KEY_dead_acute); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSING); xkb_compose_state_feed(state, XKB_KEY_A); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSED); xkb_compose_state_reset(state); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING); xkb_compose_state_feed(state, XKB_KEY_dead_acute); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSING); xkb_compose_state_feed(state, XKB_KEY_A); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_COMPOSED); xkb_compose_state_reset(state); xkb_compose_state_feed(state, XKB_KEY_NoSymbol); assert(xkb_compose_state_get_status(state) == XKB_COMPOSE_NOTHING); xkb_compose_state_unref(state); xkb_compose_table_unref(table); } static void test_XCOMPOSEFILE(struct xkb_context *ctx) { struct xkb_compose_table *table; char *path; path = test_get_path("compose/en_US.UTF-8/Compose"); setenv("XCOMPOSEFILE", path, 1); free(path); table = xkb_compose_table_new_from_locale(ctx, "blabla", XKB_COMPOSE_COMPILE_NO_FLAGS); assert(table); assert(test_compose_seq(table, XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_space, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "~", XKB_KEY_asciitilde, XKB_KEY_NoSymbol)); xkb_compose_table_unref(table); } static void test_modifier_syntax(struct xkb_context *ctx) { const char *table_string; /* We don't do anything with the modifiers, but make sure we can parse * them. */ assert(test_compose_seq_buffer(ctx, "None : X \n" "Shift : Y \n" "Ctrl : Y \n" "Alt : Y \n" "Caps : Y \n" "Lock : Y \n" "Shift Ctrl : Y \n" "~Shift : Y \n" "~Shift Ctrl : Y \n" "Shift ~Ctrl : Y \n" "Shift ~Ctrl ~Alt : Y \n" "! Shift : Y \n" "! Ctrl : Y \n" "! Alt : Y \n" "! Caps : Y \n" "! Lock : Y \n" "! Shift Ctrl : Y \n" "! ~Shift : Y \n" "! ~Shift Ctrl : Y \n" "! Shift ~Ctrl : Y \n" "! Shift ~Ctrl ~Alt : Y \n" " ! Shift : Y \n" "None ! Shift : Y \n" "None

: "¶" paragraph # PILCROW SIGN

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

: "₧" PesetaSign # PESETA SIGN

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

: "Π" U03A0 # GREEK CAPITAL LETTER PI

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

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

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

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

: "ᵽ" U1D7D # LATIN SMALL LETTER P WITH STROKE : "Ɍ" U024C # LATIN CAPITAL LETTER R WITH STROKE : "ɍ" U024D # LATIN SMALL LETTER R WITH STROKE : "Ʉ" U0244 # LATIN CAPITAL LETTER U BAR : "ʉ" U0289 # LATIN SMALL LETTER U BAR : "Ɏ" U024E # LATIN CAPITAL LETTER Y WITH STROKE : "ɏ" U024F # LATIN SMALL LETTER Y WITH STROKE : "/" slash # SOLIDUS : "̸" U0338 # COMBINING LONG SOLIDUS OVERLAY : "/" slash # SOLIDUS : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE : "≃" similarequal # ASYMPTOTICALLY EQUAL TO : "≲" U2272 # LESS-THAN OR EQUIVALENT TO : "≳" U2273 # GREATER-THAN OR EQUIVALENT TO : "̃" U0303 # COMBINING TILDE : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON : "ɟ" U025F # LATIN SMALL LETTER DOTLESS J WITH STROKE : "ɟ" U025F # LATIN SMALL LETTER DOTLESS J WITH STROKE : "Ắ" Abreveacute # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE : "ắ" abreveacute # LATIN SMALL LETTER A WITH BREVE AND ACUTE : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE : "Ấ" Acircumflexacute # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE : "ấ" acircumflexacute # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE : "Ế" Ecircumflexacute # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE : "ế" ecircumflexacute # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE : "Ố" Ocircumflexacute # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE : "ố" ocircumflexacute # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE : "Ớ" Ohornacute # LATIN CAPITAL LETTER O WITH HORN AND ACUTE : "ớ" ohornacute # LATIN SMALL LETTER O WITH HORN AND ACUTE : "Ứ" Uhornacute # LATIN CAPITAL LETTER U WITH HORN AND ACUTE : "ứ" uhornacute # LATIN SMALL LETTER U WITH HORN AND ACUTE : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE : "Ặ" Abrevebelowdot # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW : "ặ" abrevebelowdot # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW : "Ậ" Acircumflexbelowdot # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW : "ậ" acircumflexbelowdot # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW : "Ệ" Ecircumflexbelowdot # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW : "ệ" ecircumflexbelowdot # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW : "Ộ" Ocircumflexbelowdot # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW : "ộ" ocircumflexbelowdot # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW : "Ợ" Ohornbelowdot # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW : "ợ" ohornbelowdot # LATIN SMALL LETTER O WITH HORN AND DOT BELOW : "Ự" Uhornbelowdot # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW : "ự" uhornbelowdot # LATIN SMALL LETTER U WITH HORN AND DOT BELOW : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE : "Ằ" Abrevegrave # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE : "ằ" abrevegrave # LATIN SMALL LETTER A WITH BREVE AND GRAVE : "Ẳ" Abrevehook # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE : "ẳ" abrevehook # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE : "Ẵ" Abrevetilde # LATIN CAPITAL LETTER A WITH BREVE AND TILDE : "ẵ" abrevetilde # LATIN SMALL LETTER A WITH BREVE AND TILDE : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON : "₵" U20B5 # CEDI SIGN : "₵" U20B5 # CEDI SIGN : "₵" U20B5 # CEDI SIGN : "₵" U20B5 # CEDI SIGN : "Ầ" Acircumflexgrave # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE : "ầ" acircumflexgrave # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE : "Ề" Ecircumflexgrave # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE : "ề" ecircumflexgrave # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE : "Ồ" Ocircumflexgrave # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE : "ồ" ocircumflexgrave # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE : "Ẩ" Acircumflexhook # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE : "ẩ" acircumflexhook # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE : "Ể" Ecircumflexhook # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE : "ể" ecircumflexhook # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE : "Ổ" Ocircumflexhook # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE : "ổ" ocircumflexhook # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE : "Ẫ" Acircumflextilde # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE : "ẫ" acircumflextilde # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE : "Ễ" Ecircumflextilde # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE : "ễ" ecircumflextilde # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE : "Ỗ" Ocircumflextilde # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE : "ỗ" ocircumflextilde # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS : "Ờ" Ohorngrave # LATIN CAPITAL LETTER O WITH HORN AND GRAVE : "ờ" ohorngrave # LATIN SMALL LETTER O WITH HORN AND GRAVE : "Ừ" Uhorngrave # LATIN CAPITAL LETTER U WITH HORN AND GRAVE : "ừ" uhorngrave # LATIN SMALL LETTER U WITH HORN AND GRAVE : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE : "Ở" Ohornhook # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE : "ở" ohornhook # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE : "Ử" Uhornhook # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE : "ử" uhornhook # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE : "Ỡ" Ohorntilde # LATIN CAPITAL LETTER O WITH HORN AND TILDE : "ỡ" ohorntilde # LATIN SMALL LETTER O WITH HORN AND TILDE : "Ữ" Uhorntilde # LATIN CAPITAL LETTER U WITH HORN AND TILDE : "ữ" uhorntilde # LATIN SMALL LETTER U WITH HORN AND TILDE : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON : "ϒ" U03D2 # GREEK UPSILON WITH HOOK SYMBOL : "ϒ" U03D2 # GREEK UPSILON WITH HOOK SYMBOL : "Ᾱ" U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON : "Ᾱ" U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON : "ᾱ" U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON : "ᾱ" U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON : "Ῑ" U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON : "Ῑ" U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON : "ῑ" U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON : "ῑ" U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON : "Ῡ" U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON : "Ῡ" U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON : "ῡ" U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON : "ῡ" U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON : "ϼ" U03FC # GREEK RHO WITH STROKE SYMBOL : "ϼ" U03FC # GREEK RHO WITH STROKE SYMBOL # # Cyrillic NFDs # : "а̏" # CYRILLIC SMALL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT : "а̏" # CYRILLIC SMALL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT : "а̑" # CYRILLIC SMALL LETTER A WITH COMBINING INVERTED BREVE : "а̀" # CYRILLIC SMALL LETTER A WITH COMBINING GRAVE ACCENT : "а̀" # CYRILLIC SMALL LETTER A WITH COMBINING GRAVE ACCENT : "а́" # CYRILLIC SMALL LETTER A WITH COMBINING ACUTE ACCENT : "а́" # CYRILLIC SMALL LETTER A WITH COMBINING ACUTE ACCENT : "а́" # CYRILLIC SMALL LETTER A WITH COMBINING ACUTE ACCENT : "а̄" # CYRILLIC SMALL LETTER A WITH COMBINING MACRON : "а̄" # CYRILLIC SMALL LETTER A WITH COMBINING MACRON : "а̄" # CYRILLIC SMALL LETTER A WITH COMBINING MACRON : "а̂" # CYRILLIC SMALL LETTER A WITH COMBINING CIRCUMFLEX ACCENT : "а̂" # CYRILLIC SMALL LETTER A WITH COMBINING CIRCUMFLEX ACCENT : "А̏" # CYRILLIC CAPITAL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT : "А̏" # CYRILLIC CAPITAL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT : "А̑" # CYRILLIC CAPITAL LETTER A WITH COMBINING INVERTED BREVE : "А̀" # CYRILLIC CAPITAL LETTER A WITH COMBINING GRAVE ACCENT : "А̀" # CYRILLIC CAPITAL LETTER A WITH COMBINING GRAVE ACCENT : "А́" # CYRILLIC CAPITAL LETTER A WITH COMBINING ACUTE ACCENT : "А́" # CYRILLIC CAPITAL LETTER A WITH COMBINING ACUTE ACCENT : "А́" # CYRILLIC CAPITAL LETTER A WITH COMBINING ACUTE ACCENT : "А̄" # CYRILLIC CAPITAL LETTER A WITH COMBINING MACRON : "А̄" # CYRILLIC CAPITAL LETTER A WITH COMBINING MACRON : "А̄" # CYRILLIC CAPITAL LETTER A WITH COMBINING MACRON : "А̂" # CYRILLIC CAPITAL LETTER A WITH COMBINING CIRCUMFLEX ACCENT : "А̂" # CYRILLIC CAPITAL LETTER A WITH COMBINING CIRCUMFLEX ACCENT : "е̏" # CYRILLIC SMALL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT : "е̏" # CYRILLIC SMALL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT : "е̑" # CYRILLIC SMALL LETTER IE WITH COMBINING INVERTED BREVE : "е́" # CYRILLIC SMALL LETTER IE WITH COMBINING ACUTE ACCENT : "е́" # CYRILLIC SMALL LETTER IE WITH COMBINING ACUTE ACCENT : "е́" # CYRILLIC SMALL LETTER IE WITH COMBINING ACUTE ACCENT : "е̄" # CYRILLIC SMALL LETTER IE WITH COMBINING MACRON : "е̄" # CYRILLIC SMALL LETTER IE WITH COMBINING MACRON : "е̄" # CYRILLIC SMALL LETTER IE WITH COMBINING MACRON : "е̂" # CYRILLIC SMALL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT : "е̂" # CYRILLIC SMALL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT : "Е̏" # CYRILLIC CAPITAL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT : "Е̏" # CYRILLIC CAPITAL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT : "Е̑" # CYRILLIC CAPITAL LETTER IE WITH COMBINING INVERTED BREVE : "Е́" # CYRILLIC CAPITAL LETTER IE WITH COMBINING ACUTE ACCENT : "Е́" # CYRILLIC CAPITAL LETTER IE WITH COMBINING ACUTE ACCENT : "Е́" # CYRILLIC CAPITAL LETTER IE WITH COMBINING ACUTE ACCENT : "Е̄" # CYRILLIC CAPITAL LETTER IE WITH COMBINING MACRON : "Е̄" # CYRILLIC CAPITAL LETTER IE WITH COMBINING MACRON : "Е̄" # CYRILLIC CAPITAL LETTER IE WITH COMBINING MACRON : "Е̂" # CYRILLIC CAPITAL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT : "Е̂" # CYRILLIC CAPITAL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT : "и̏" # CYRILLIC SMALL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT : "и̏" # CYRILLIC SMALL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT : "и̑" # CYRILLIC SMALL LETTER I WITH COMBINING INVERTED BREVE : "и́" # CYRILLIC SMALL LETTER I WITH COMBINING ACUTE ACCENT : "и́" # CYRILLIC SMALL LETTER I WITH COMBINING ACUTE ACCENT : "и́" # CYRILLIC SMALL LETTER I WITH COMBINING ACUTE ACCENT : "и̂" # CYRILLIC SMALL LETTER I WITH COMBINING CIRCUMFLEX ACCENT : "и̂" # CYRILLIC SMALL LETTER I WITH COMBINING CIRCUMFLEX ACCENT : "И̏" # CYRILLIC CAPITAL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT : "И̏" # CYRILLIC CAPITAL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT : "И̑" # CYRILLIC CAPITAL LETTER I WITH COMBINING INVERTED BREVE : "И́" # CYRILLIC CAPITAL LETTER I WITH COMBINING ACUTE ACCENT : "И́" # CYRILLIC CAPITAL LETTER I WITH COMBINING ACUTE ACCENT : "И́" # CYRILLIC CAPITAL LETTER I WITH COMBINING ACUTE ACCENT : "И̂" # CYRILLIC CAPITAL LETTER I WITH COMBINING CIRCUMFLEX ACCENT : "И̂" # CYRILLIC CAPITAL LETTER I WITH COMBINING CIRCUMFLEX ACCENT : "о̏" # CYRILLIC SMALL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT : "о̏" # CYRILLIC SMALL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT : "о̑" # CYRILLIC SMALL LETTER O WITH COMBINING INVERTED BREVE : "о̀" # CYRILLIC SMALL LETTER O WITH COMBINING GRAVE ACCENT : "о̀" # CYRILLIC SMALL LETTER O WITH COMBINING GRAVE ACCENT : "о́" # CYRILLIC SMALL LETTER O WITH COMBINING ACUTE ACCENT : "о́" # CYRILLIC SMALL LETTER O WITH COMBINING ACUTE ACCENT : "о́" # CYRILLIC SMALL LETTER O WITH COMBINING ACUTE ACCENT : "о̄" # CYRILLIC SMALL LETTER O WITH COMBINING MACRON : "о̄" # CYRILLIC SMALL LETTER O WITH COMBINING MACRON : "о̄" # CYRILLIC SMALL LETTER O WITH COMBINING MACRON : "о̂" # CYRILLIC SMALL LETTER O WITH COMBINING CIRCUMFLEX ACCENT : "о̂" # CYRILLIC SMALL LETTER O WITH COMBINING CIRCUMFLEX ACCENT : "О̏" # CYRILLIC CAPITAL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT : "О̏" # CYRILLIC CAPITAL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT : "О̑" # CYRILLIC CAPITAL LETTER O WITH COMBINING INVERTED BREVE : "О̀" # CYRILLIC CAPITAL LETTER O WITH COMBINING GRAVE ACCENT : "О̀" # CYRILLIC CAPITAL LETTER O WITH COMBINING GRAVE ACCENT : "О́" # CYRILLIC CAPITAL LETTER O WITH COMBINING ACUTE ACCENT : "О́" # CYRILLIC CAPITAL LETTER O WITH COMBINING ACUTE ACCENT : "О́" # CYRILLIC CAPITAL LETTER O WITH COMBINING ACUTE ACCENT : "О̄" # CYRILLIC CAPITAL LETTER O WITH COMBINING MACRON : "О̄" # CYRILLIC CAPITAL LETTER O WITH COMBINING MACRON : "О̄" # CYRILLIC CAPITAL LETTER O WITH COMBINING MACRON : "О̂" # CYRILLIC CAPITAL LETTER O WITH COMBINING CIRCUMFLEX ACCENT : "О̂" # CYRILLIC CAPITAL LETTER O WITH COMBINING CIRCUMFLEX ACCENT : "у̏" # CYRILLIC SMALL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT : "у̏" # CYRILLIC SMALL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT : "у̑" # CYRILLIC SMALL LETTER U WITH COMBINING INVERTED BREVE : "у̀" # CYRILLIC SMALL LETTER U WITH COMBINING GRAVE ACCENT : "у̀" # CYRILLIC SMALL LETTER U WITH COMBINING GRAVE ACCENT : "у́" # CYRILLIC SMALL LETTER U WITH COMBINING ACUTE ACCENT : "у́" # CYRILLIC SMALL LETTER U WITH COMBINING ACUTE ACCENT : "у́" # CYRILLIC SMALL LETTER U WITH COMBINING ACUTE ACCENT : "у̂" # CYRILLIC SMALL LETTER U WITH COMBINING CIRCUMFLEX ACCENT : "у̂" # CYRILLIC SMALL LETTER U WITH COMBINING CIRCUMFLEX ACCENT : "У̏" # CYRILLIC CAPITAL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT : "У̏" # CYRILLIC CAPITAL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT : "У̑" # CYRILLIC CAPITAL LETTER U WITH COMBINING INVERTED BREVE : "У̀" # CYRILLIC CAPITAL LETTER U WITH COMBINING GRAVE ACCENT : "У̀" # CYRILLIC CAPITAL LETTER U WITH COMBINING GRAVE ACCENT : "У́" # CYRILLIC CAPITAL LETTER U WITH COMBINING ACUTE ACCENT : "У́" # CYRILLIC CAPITAL LETTER U WITH COMBINING ACUTE ACCENT : "У́" # CYRILLIC CAPITAL LETTER U WITH COMBINING ACUTE ACCENT : "У̂" # CYRILLIC CAPITAL LETTER U WITH COMBINING CIRCUMFLEX ACCENT : "У̂" # CYRILLIC CAPITAL LETTER U WITH COMBINING CIRCUMFLEX ACCENT : "р̏" # CYRILLIC SMALL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT : "р̏" # CYRILLIC SMALL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT : "р̑" # CYRILLIC SMALL LETTER ER WITH COMBINING INVERTED BREVE : "р̀" # CYRILLIC SMALL LETTER ER WITH COMBINING GRAVE ACCENT : "р̀" # CYRILLIC SMALL LETTER ER WITH COMBINING GRAVE ACCENT : "р́" # CYRILLIC SMALL LETTER ER WITH COMBINING ACUTE ACCENT : "р́" # CYRILLIC SMALL LETTER ER WITH COMBINING ACUTE ACCENT : "р́" # CYRILLIC SMALL LETTER ER WITH COMBINING ACUTE ACCENT : "р̄" # CYRILLIC SMALL LETTER ER WITH COMBINING MACRON : "р̄" # CYRILLIC SMALL LETTER ER WITH COMBINING MACRON : "р̄" # CYRILLIC SMALL LETTER ER WITH COMBINING MACRON : "р̂" # CYRILLIC SMALL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT : "р̂" # CYRILLIC SMALL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT : "Р̏" # CYRILLIC CAPITAL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT : "Р̏" # CYRILLIC CAPITAL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT : "Р̑" # CYRILLIC CAPITAL LETTER ER WITH COMBINING INVERTED BREVE : "Р̀" # CYRILLIC CAPITAL LETTER ER WITH COMBINING GRAVE ACCENT : "Р̀" # CYRILLIC CAPITAL LETTER ER WITH COMBINING GRAVE ACCENT : "Р́" # CYRILLIC CAPITAL LETTER ER WITH COMBINING ACUTE ACCENT : "Р́" # CYRILLIC CAPITAL LETTER ER WITH COMBINING ACUTE ACCENT : "Р́" # CYRILLIC CAPITAL LETTER ER WITH COMBINING ACUTE ACCENT : "Р̄" # CYRILLIC CAPITAL LETTER ER WITH COMBINING MACRON : "Р̄" # CYRILLIC CAPITAL LETTER ER WITH COMBINING MACRON : "Р̄" # CYRILLIC CAPITAL LETTER ER WITH COMBINING MACRON : "Р̂" # CYRILLIC CAPITAL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT : "Р̂" # CYRILLIC CAPITAL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT : "🙌" # PERSON RAISING BOTH HANDS IN CELEBRATION # APL support Geoff Streeter 2012-01-04 # APL was initially an overstruck language. The original APL terminal was an IBM golfball # with a specially designed golfball. This meant that characters could be overstruck to # produce other characters. This gave APL a richness of primitives which is still powerful # today. Overstrikes were always independent of order. # APLs have extended this into a number of dialects. Let us try to support lots of them. # Together with some that have not been used yet. Some traditional ones are not included. # Characters from "Mathematical Operators" : "√" U221a # v / SQUARE ROOT : "√" U221a # / v SQUARE ROOT <8> <8> : "∞" U221e # 8 8 INFINITY : "≡" U2261 # = _ IDENTICAL TO : "≢" U2262 # _ ≠ NOT IDENTICAL TO : "≢" U2262 # ≠ _ NOT IDENTICAL TO : "≤" U2264 # < _ LESS-THAN OR EQUAL TO : "≤" U2264 # _ < LESS-THAN OR EQUAL TO : "≥" U2265 # > _ GREATER-THAN OR EQUAL TO : "≥" U2265 # _ > GREATER-THAN OR EQUAL TO : "⊆" U2286 # _ ⊂ SUBSET OF OR EQUAL TO : "⊆" U2286 # ⊂ _ SUBSET OF OR EQUAL TO : "⊇" U2287 # _ ⊃ SUPERSET OF OR EQUAL TO : "⊇" U2287 # ⊃ _ SUPERSET OF OR EQUAL TO : "⊖" U2296 # ○ - CIRCLED MINUS : "⊖" U2296 # - ○ CIRCLED MINUS : "⊙" U2299 # ○ - CIRCLED DOT : "⊙" U2299 # - ○ CIRCLED DOT : "⋄" U22c4 # < > DIAMOND OPERATOR : "⋄" U22c4 # > < DIAMOND OPERATOR : "⋄" U22c4 # ∧ ∨ DIAMOND OPERATOR : "⋄" U22c4 # ∨ ∧ DIAMOND OPERATOR : "∴" therefore # THEREFORE : "∵" because # BECAUSE # Characters from "Miscellaneous Technical" : "⌶" U2336 # ⊥ ⊤ APL FUNCTIONAL SYMBOL I-BEAM : "⌶" U2336 # ⊥ ⊤ APL FUNCTIONAL SYMBOL I-BEAM : "⌷" U2337 # [ ] APL FUNCTIONAL SYMBOL SQUISH QUAD : "⌷" U2337 # ] [ APL FUNCTIONAL SYMBOL SQUISH QUAD : "⌸" U2338 # ⎕ = APL FUNCTIONAL SYMBOL QUAD EQUAL : "⌸" U2338 # = ⎕ APL FUNCTIONAL SYMBOL QUAD EQUAL : "⌹" U2339 # ⎕ ÷ APL FUNCTIONAL SYMBOL QUAD DIVIDE : "⌹" U2339 # ÷ ⎕ APL FUNCTIONAL SYMBOL QUAD DIVIDE : "⌺" U233a # ⎕ ⋄ APL FUNCTIONAL SYMBOL QUAD DIAMOND : "⌺" U233a # ⋄ ⎕ APL FUNCTIONAL SYMBOL QUAD DIAMOND : "⌻" U233b # ⎕ ∘ APL FUNCTIONAL SYMBOL QUAD JOT : "⌻" U233b # ∘ ⎕ APL FUNCTIONAL SYMBOL QUAD JOT : "⌼" U233c # ⎕ ○ APL FUNCTIONAL SYMBOL QUAD CIRCLE : "⌼" U233c # ○ ⎕ APL FUNCTIONAL SYMBOL QUAD CIRCLE : "⌽" U233d # ○ | APL FUNCTIONAL SYMBOL CIRCLE STILE : "⌽" U233d # | ○ APL FUNCTIONAL SYMBOL CIRCLE STILE : "⌾" U233e # ○ ∘ APL FUNCTIONAL SYMBOL CIRCLE JOT : "⌾" U233e # ∘ ○ APL FUNCTIONAL SYMBOL CIRCLE JOT : "⌿" U233f # / - APL FUNCTIONAL SYMBOL SLASH BAR : "⌿" U233f # - / APL FUNCTIONAL SYMBOL SLASH BAR : "⍀" U2340 # \ - APL FUNCTIONAL SYMBOL BACKSLASH BAR : "⍀" U2340 # - \ APL FUNCTIONAL SYMBOL BACKSLASH BAR : "⍁" U2341 # / ⎕ APL FUNCTIONAL SYMBOL QUAD SLASH : "⍁" U2341 # ⎕ / APL FUNCTIONAL SYMBOL QUAD SLASH : "⍂" U2342 # \ ⎕ APL FUNCTIONAL SYMBOL QUAD BACKSLASH : "⍂" U2342 # ⎕ \ APL FUNCTIONAL SYMBOL QUAD BACKSLASH : "⍃" U2343 # < ⎕ APL FUNCTIONAL SYMBOL QUAD LESS-THAN : "⍃" U2343 # ⎕ < APL FUNCTIONAL SYMBOL QUAD LESS-THAN : "⍄" U2344 # > ⎕ APL FUNCTIONAL SYMBOL QUAD GREATER-THAN : "⍄" U2344 # ⎕ > APL FUNCTIONAL SYMBOL QUAD GREATER-THAN : "⍅" U2345 # ← | APL FUNCTIONAL SYMBOL LEFTWARDS VANE : "⍅" U2345 # | ← APL FUNCTIONAL SYMBOL LEFTWARDS VANE : "⍆" U2346 # → | APL FUNCTIONAL SYMBOL RIGHTWARDS VANE : "⍆" U2346 # | → APL FUNCTIONAL SYMBOL RIGHTWARDS VANE : "⍇" U2347 # ← ⎕ APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW : "⍇" U2347 # ⎕ ← APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW : "⍈" U2348 # → ⎕ APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW : "⍈" U2348 # ⎕ → APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW : "⍉" U2349 # ○ \ APL FUNCTIONAL SYMBOL CIRCLE SLOPE : "⍉" U2349 # \ ○ APL FUNCTIONAL SYMBOL CIRCLE SLOPE : "⍊" U234a # _ ⊥ APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR : "⍊" U234a # ⊥ _ APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR : "⍋" U234b # ∆ | APL FUNCTIONAL SYMBOL DELTA STILE : "⍋" U234b # | ∆ APL FUNCTIONAL SYMBOL DELTA STILE : "⍌" U234c # ∨ ⎕ APL FUNCTIONAL SYMBOL QUAD DOWN CARET : "⍌" U234c # ⎕ ∨ APL FUNCTIONAL SYMBOL QUAD DOWN CARET : "⍍" U234d # ∆ ⎕ APL FUNCTIONAL SYMBOL QUAD DELTA : "⍍" U234d # ⎕ ∆ APL FUNCTIONAL SYMBOL QUAD DELTA : "⍎" U234e # ∘ ⊥ APL FUNCTIONAL SYMBOL DOWN TACK JOT : "⍎" U234e # ⊥ ∘ APL FUNCTIONAL SYMBOL DOWN TACK JOT : "⍏" U234f # ↑ - APL FUNCTIONAL SYMBOL UPWARDS VANE : "⍏" U234f # - ↑ APL FUNCTIONAL SYMBOL UPWARDS VANE : "⍐" U2350 # ↑ ⎕ APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW : "⍐" U2350 # ⎕ ↑ APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW # I cannot get anything to work with . Given that no extant APLs use ⍑ I will just leave the lines # in place. : "⍑" U2351 # ¯ ⊤ APL FUNCTIONAL SYMBOL UP TACK OVERBAR : "⍑" U2351 # ⊤ ¯ APL FUNCTIONAL SYMBOL UP TACK OVERBAR : "⍒" U2352 # ∇ | APL FUNCTIONAL SYMBOL DEL STILE : "⍒" U2352 # | ∇ APL FUNCTIONAL SYMBOL DEL STILE : "⍓" U2353 # ∧ ⎕ APL FUNCTIONAL SYMBOL QUAD UP CARET : "⍓" U2353 # ⎕ ∧ APL FUNCTIONAL SYMBOL QUAD UP CARET : "⍔" U2354 # ∇ ⎕ APL FUNCTIONAL SYMBOL QUAD DEL : "⍔" U2354 # ⎕ ∇ APL FUNCTIONAL SYMBOL QUAD DEL : "⍕" U2355 # ∘ ⊤ APL FUNCTIONAL SYMBOL UP TACK JOT : "⍕" U2355 # ⊤ ∘ APL FUNCTIONAL SYMBOL UP TACK JOT : "⍖" U2356 # ↓ - APL FUNCTIONAL SYMBOL DOWNWARDS VANE : "⍖" U2356 # - ↓ APL FUNCTIONAL SYMBOL DOWNWARDS VANE : "⍗" U2357 # ↓ ⎕ APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW : "⍗" U2357 # ⎕ ↓ APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW # This line clashes with the (and similar) that appear to be there to provide # a work around for the problems with . Or to cope with keyboards that do not have (more likely). # All APL keyboards have , it is used as the -ve sign for numbers. # I do not know of an extant APL using ⍘ : "⍘" U2358 # _ ' APL FUNCTIONAL SYMBOL QUOTE UNDERBAR : "⍙" U2359 # ∆ _ APL FUNCTIONAL SYMBOL DELTA UNDERBAR : "⍙" U2359 # _ ∆ APL FUNCTIONAL SYMBOL DELTA UNDERBAR : "⍚" U235a # ⋄ _ APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR : "⍚" U235a # _ ⋄ APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR : "⍛" U235b # ∘ _ APL FUNCTIONAL SYMBOL JOT UNDERBAR : "⍛" U235b # _ ∘ APL FUNCTIONAL SYMBOL JOT UNDERBAR : "⍜" U235c # ○ _ APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR : "⍜" U235c # _ ○ APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR : "⍝" U235d # ∘ ∩ APL FUNCTIONAL SYMBOL UP SHOE JOT : "⍝" U235d # ∩ ∘ APL FUNCTIONAL SYMBOL UP SHOE JOT : "⍞" U235e # * ¨ APL FUNCTIONAL SYMBOL QUOTE QUAD : "⍞" U235e # ¨ * APL FUNCTIONAL SYMBOL QUOTE QUAD : "⍟" U235f # ○ * APL FUNCTIONAL SYMBOL CIRCLE STAR : "⍟" U235f # * ○ APL FUNCTIONAL SYMBOL CIRCLE STAR : "⍠" U2360 # : ⎕ APL FUNCTIONAL SYMBOL QUAD COLON : "⍠" U2360 # ⎕ : APL FUNCTIONAL SYMBOL QUAD COLON : "⍡" U2361 # ¨ ⊤ APL FUNCTIONAL SYMBOL UP TACK DIAERESIS : "⍡" U2361 # ⊤ ¨ APL FUNCTIONAL SYMBOL UP TACK DIAERESIS : "⍢" U2362 # ¨ ∇ APL FUNCTIONAL SYMBOL DEL DIAERESIS : "⍢" U2362 # ∇ ¨ APL FUNCTIONAL SYMBOL DEL DIAERESIS : "⍣" U2363 # * ¨ APL FUNCTIONAL SYMBOL STAR DIAERESIS : "⍣" U2363 # ¨ * APL FUNCTIONAL SYMBOL STAR DIAERESIS : "⍤" U2364 # ∘ ¨ APL FUNCTIONAL SYMBOL JOT DIAERESIS : "⍤" U2364 # ¨ ∘ APL FUNCTIONAL SYMBOL JOT DIAERESIS : "⍥" U2365 # ○ ¨ APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS : "⍥" U2365 # ¨ ○ APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS : "⍦" U2366 # ∪ | APL FUNCTIONAL SYMBOL DOWN SHOE STILE : "⍦" U2366 # | ∪ APL FUNCTIONAL SYMBOL DOWN SHOE STILE : "⍧" U2367 # ⊂ | APL FUNCTIONAL SYMBOL LEFT SHOE STILE : "⍧" U2367 # | ⊂ APL FUNCTIONAL SYMBOL LEFT SHOE STILE : "⍨" U2368 # ~ ¨ APL FUNCTIONAL SYMBOL TILDE DIAERESIS : "⍩" U2369 # ¨ > APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS : "⍩" U2369 # > ¨ APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS : "⍫" U236b # ∇ ~ APL FUNCTIONAL SYMBOL DEL TILDE : "⍫" U236b # ~ ∇ APL FUNCTIONAL SYMBOL DEL TILDE <0> : "⍬" U236c # 0 ~ APL FUNCTIONAL SYMBOL ZILDE <0> : "⍬" U236c # ~ 0 APL FUNCTIONAL SYMBOL ZILDE : "⍭" U236d # | ~ APL FUNCTIONAL SYMBOL STILE TILDE : "⍭" U236d # ~ | APL FUNCTIONAL SYMBOL STILE TILDE # This line does not work. It clashes with # for Ǭ and # for ǭ. # Given that no extant APLs use ⍮ I will just leave the line in place. : "⍮" U236e # ; _ APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR : "⍯" U236f # ≠ ⎕ APL FUNCTIONAL SYMBOL QUAD NOT EQUAL : "⍯" U236f # ⎕ ≠ APL FUNCTIONAL SYMBOL QUAD NOT EQUAL : "⍰" U2370 # ? ⎕ APL FUNCTIONAL SYMBOL QUAD QUESTION : "⍰" U2370 # ⎕ ? APL FUNCTIONAL SYMBOL QUAD QUESTION : "⍱" U2371 # ∨ ~ APL FUNCTIONAL SYMBOL DOWN CARET TILDE : "⍱" U2371 # ~ ∨ APL FUNCTIONAL SYMBOL DOWN CARET TILDE : "⍲" U2372 # ∧ ~ APL FUNCTIONAL SYMBOL UP CARET TILDE : "⍲" U2372 # ~ ∧ APL FUNCTIONAL SYMBOL UP CARET TILDE : "⍶" U2376 # ⍺ _ APL FUNCTIONAL SYMBOL ALPHA UNDERBAR : "⍶" U2376 # _ ⍺ APL FUNCTIONAL SYMBOL ALPHA UNDERBAR : "⍷" U2377 # ∊ _ APL FUNCTIONAL SYMBOL EPSILON UNDERBAR : "⍷" U2377 # _ ∊ APL FUNCTIONAL SYMBOL EPSILON UNDERBAR : "⍸" U2378 # ⍳ _ APL FUNCTIONAL SYMBOL IOTA UNDERBAR : "⍸" U2378 # _ ⍳ APL FUNCTIONAL SYMBOL IOTA UNDERBAR : "⍹" U2379 # ⍵ _ APL FUNCTIONAL SYMBOL OMEGA UNDERBAR : "⍹" U2379 # _ ⍵ APL FUNCTIONAL SYMBOL OMEGA UNDERBAR ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6953137 libxkbcommon-0.10.0/test/data/keycodes/0000755000175000017500000000000000000000000017335 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6919804 libxkbcommon-0.10.0/test/data/keycodes/aliases0000644000175000017500000000420000000000000020675 0ustar00ranran00000000000000 // keycode aliases for phonetic keyboard maps default xkb_keycodes "qwerty" { alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; xkb_keycodes "azerty" { alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; xkb_keycodes "qwertz" { alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6953137 libxkbcommon-0.10.0/test/data/keycodes/aliases-xkbcommon0000644000175000017500000000363600000000000022704 0ustar00ranran00000000000000 // keycode aliases for phonetic keyboard maps default xkb_keycodes "qwerty" { alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias =

; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; xkb_keycodes "azerty" { alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias =

; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; xkb_keycodes "qwertz" { alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias =

; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6953137 libxkbcommon-0.10.0/test/data/keycodes/empty0000644000175000017500000000010400000000000020411 0ustar00ranran00000000000000default xkb_keycodes "empty" { minimum= 8; maximum= 255; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6953137 libxkbcommon-0.10.0/test/data/keycodes/evdev0000644000175000017500000002072000000000000020372 0ustar00ranran00000000000000// translation from evdev scancodes to something resembling xfree86 keycodes. default xkb_keycodes "evdev" { minimum = 8; maximum = 255; # Added for pc105 compatibility = 94; = 49; = 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; = 51; alias = ; = 36; = 66; = 38; = 39; = 40; = 41; = 42; = 43; = 44; = 45; = 46; = 47; = 48; = 50; = 52; = 53; = 54; = 55; = 56; = 57; = 58; = 59; = 60; = 61; = 62; = 64; = 37; = 65; = 105; = 108; // Microsoft keyboard extra keys = 133; = 134; = 135; alias

= ; = 9; = 67; = 68; = 69; = 70; = 71; = 72; = 73; = 74; = 75; = 76; = 95; = 96; = 107; // = 107; = 78; = 127; // = 419; = 118; = 110; = 112; = 119; = 115; = 117; = 111; = 113; = 116; = 114; = 77; = 106; = 63; = 82; = 79; = 80; = 81; = 86; = 83; = 84; = 85; = 87; = 88; = 89; = 104; = 90; = 91; = 125; = 191; = 192; = 193; = 194; = 195; = 196; = 197; = 198; = 199; = 200; = 201; = 202; // Keys that are generated on Japanese keyboards // = 93; // Hankaku/Zenkakau toggle - not actually used alias = ; = 101; // Hiragana/Katakana toggle = 97; // backslash/underscore = 100; // Henkan = 102; // Muhenkan = 132; // Yen = 98; // Katakana = 99; // Hiragana = 103; // KPJPComma // = 97; // Romaji // Keys that are generated on Korean keyboards = 130; // Hangul Latin toggle = 131; // Hangul to Hanja conversion // Solaris compatibility alias = ; alias = ; = 121; = 122; = 123; = 124; = 136; = 137; = 138; = 139; = 140; = 141; = 142; = 143; = 144; = 145; = 146; // Extended keys that may be generated on "Internet" keyboards. // evdev has standardize names for these. = 109; // #define KEY_LINEFEED 101 = 120; // #define KEY_MACRO 112 = 126; // #define KEY_KPPLUSMINUS 118 = 128; // #define KEY_SCALE 120 = 129; // #define KEY_KPCOMMA 121 = 147; // #define KEY_MENU 139 = 148; // #define KEY_CALC 140 = 149; // #define KEY_SETUP 141 = 150; // #define KEY_SLEEP 142 = 151; // #define KEY_WAKEUP 143 = 152; // #define KEY_FILE 144 = 153; // #define KEY_SENDFILE 145 = 154; // #define KEY_DELETEFILE 146 = 155; // #define KEY_XFER 147 = 156; // #define KEY_PROG1 148 = 157; // #define KEY_PROG2 149 = 158; // #define KEY_WWW 150 = 159; // #define KEY_MSDOS 151 = 160; // #define KEY_COFFEE 152 = 161; // #define KEY_DIRECTION 153 = 162; // #define KEY_CYCLEWINDOWS 154 = 163; // #define KEY_MAIL 155 = 164; // #define KEY_BOOKMARKS 156 = 165; // #define KEY_COMPUTER 157 = 166; // #define KEY_BACK 158 = 167; // #define KEY_FORWARD 159 = 168; // #define KEY_CLOSECD 160 = 169; // #define KEY_EJECTCD 161 = 170; // #define KEY_EJECTCLOSECD 162 = 171; // #define KEY_NEXTSONG 163 = 172; // #define KEY_PLAYPAUSE 164 = 173; // #define KEY_PREVIOUSSONG 165 = 174; // #define KEY_STOPCD 166 = 175; // #define KEY_RECORD 167 = 176; // #define KEY_REWIND 168 = 177; // #define KEY_PHONE 169 = 178; // #define KEY_ISO 170 = 179; // #define KEY_CONFIG 171 = 180; // #define KEY_HOMEPAGE 172 = 181; // #define KEY_REFRESH 173 = 182; // #define KEY_EXIT 174 = 183; // #define KEY_MOVE 175 = 184; // #define KEY_EDIT 176 = 185; // #define KEY_SCROLLUP 177 = 186; // #define KEY_SCROLLDOWN 178 = 187; // #define KEY_KPLEFTPAREN 179 = 188; // #define KEY_KPRIGHTPAREN 180 = 189; // #define KEY_NEW 181 = 190; // #define KEY_REDO 182 = 208; // #define KEY_PLAYCD 200 = 209; // #define KEY_PAUSECD 201 = 210; // #define KEY_PROG3 202 = 211; // #define KEY_PROG4 203 conflicts with AB11 = 212; // #define KEY_DASHBOARD 204 = 213; // #define KEY_SUSPEND 205 = 214; // #define KEY_CLOSE 206 = 215; // #define KEY_PLAY 207 = 216; // #define KEY_FASTFORWARD 208 = 217; // #define KEY_BASSBOOST 209 = 218; // #define KEY_PRINT 210 = 219; // #define KEY_HP 211 = 220; // #define KEY_CAMERA 212 = 221; // #define KEY_SOUND 213 = 222; // #define KEY_QUESTION 214 = 223; // #define KEY_EMAIL 215 = 224; // #define KEY_CHAT 216 = 225; // #define KEY_SEARCH 217 = 226; // #define KEY_CONNECT 218 = 227; // #define KEY_FINANCE 219 = 228; // #define KEY_SPORT 220 = 229; // #define KEY_SHOP 221 = 230; // #define KEY_ALTERASE 222 = 231; // #define KEY_CANCEL 223 = 232; // #define KEY_BRIGHTNESSDOWN 224 = 233; // #define KEY_BRIGHTNESSUP 225 = 234; // #define KEY_MEDIA 226 = 235; // #define KEY_SWITCHVIDEOMODE 227 = 236; // #define KEY_KBDILLUMTOGGLE 228 = 237; // #define KEY_KBDILLUMDOWN 229 = 238; // #define KEY_KBDILLUMUP 230 = 239; // #define KEY_SEND 231 = 240; // #define KEY_REPLY 232 = 241; // #define KEY_FORWARDMAIL 233 = 242; // #define KEY_SAVE 234 = 243; // #define KEY_DOCUMENTS 235 = 244; // #define KEY_BATTERY 236 = 245; // #define KEY_BLUETOOTH 237 = 246; // #define KEY_WLAN 238 = 247; // #define KEY_UWB 239 = 248; // #define KEY_UNKNOWN 240 = 249; // #define KEY_VIDEO_NEXT 241 = 250; // #define KEY_VIDEO_PREV 242 = 251; // #define KEY_BRIGHTNESS_CYCLE 243 = 252; // #define KEY_BRIGHTNESS_ZERO 244 = 253; // #define KEY_DISPLAY_OFF 245 // Fake keycodes for virtual keys = 92; = 203; = 204; = 205; = 206; = 207; indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; indicator 3 = "Scroll Lock"; indicator 4 = "Compose"; indicator 5 = "Kana"; indicator 6 = "Sleep"; indicator 7 = "Suspend"; indicator 8 = "Mute"; indicator 9 = "Misc"; indicator 10 = "Mail"; indicator 11 = "Charging"; alias = ; // For Brazilian ABNT2 alias = ; }; // PC98 xkb_keycodes "pc98" { include "evdev(evdev)" }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6953137 libxkbcommon-0.10.0/test/data/keycodes/evdev-xkbcommon0000644000175000017500000003463400000000000022376 0ustar00ranran00000000000000default xkb_keycodes "evdev" { = 0; = 1; <1> = 2; <2> = 3; <3> = 4; <4> = 5; <5> = 6; <6> = 7; <7> = 8; <8> = 9; <9> = 10; <0> = 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; = 65; = 66; = 67; = 68; = 69; = 70; = 71; = 72; = 73; = 74; = 75; = 76; = 77; = 78; = 79; = 80; = 81; = 82; = 83; = 85; <102ND> = 86; = 87; = 88; = 89; = 90; = 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; = 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; // Fake keycodes for virtual keys = 84; = 195; = 196; = 197; = 198; = 199; indicator 0x01 = "Num Lock"; // NUML indicator 0x02 = "Caps Lock"; // CAPSL indicator 0x03 = "Scroll Lock"; // SCROLLL indicator 0x04 = "Compose"; // COMPOSE indicator 0x05 = "Kana"; // KANA indicator 0x06 = "Sleep"; // SLEEP indicator 0x07 = "Suspend"; // SUSPEND indicator 0x08 = "Mute"; // MUTE indicator 0x09 = "Misc"; // MISC indicator 0x0a = "Mail"; // MAIL indicator 0x0b = "Charging"; // CHARGING alias = ; alias = <1>; alias = <2>; alias = <3>; alias = <4>; alias = <5>; alias = <6>; alias = <7>; alias = <8>; alias = <9>; alias = <0>; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; // For Brazilian ABNT2 alias = ; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6953137 libxkbcommon-0.10.0/test/data/keycodes/xfree860000644000175000017500000002067200000000000020556 0ustar00ranran00000000000000// "standard" XFree86 codes // It seems that the "default" must be the first entry in the file. default xkb_keycodes "xfree86" { include "xfree86(basic)" = 51; alias = ; = 94; }; xkb_keycodes "basic" { minimum= 8; maximum= 255; = 49; alias = ; // Some geometries use AE00 = 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; = 66; = 38; = 39; = 40; = 41; = 42; = 43; = 44; = 45; = 46; = 47; = 48; = 50; = 52; = 53; = 54; = 55; = 56; = 57; = 58; = 59; = 60; = 61; = 62; = 64; = 37; = 65; = 109; = 113; // Microsoft keyboard extra keys = 115; = 116; = 117; = 9; = 67; = 68; = 69; = 70; = 71; = 72; = 73; = 74; = 75; = 76; = 95; = 96; = 111; = 92; = 78; = 110; = 114; = 106; = 97; = 99; = 107; = 103; = 105; = 98; = 100; = 104; = 102; = 77; = 112; = 63; = 82; = 79; = 80; = 81; = 86; = 83; = 84; = 85; = 87; = 88; = 89; = 108; = 90; = 91; = 126; = 118; = 119; = 120; = 121; = 122; = 123; // Keys that are generated on Japanese keyboards alias = ; // Hankaku_Zenkaku toggle = 208; // Hiragana_Katakana toggle = 211; // backslash/underscore = 129; // Henkan = 131; // Muhenkan = 133; // Yen = 210; // Alphanumeric mode on macintosh = 209; // Kana mode on macintosh // Keys that are generated on Korean keyboards alias = ; // Hangul Latin toggle alias = ; // Hangul to Hanja conversion // Extended keys that may be generated on "Internet" keyboards. // These are not standardised, hence the meaningless names. // The entries commented out are never generated because the raw codes // in those positions are already used for well-defined keys. = 130; = 132; alias = ; = 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; alias = ; = 253; alias = ; = 254; = 255; // MacBooks generate 0x65 for the lower brightness key = 101; // Required for apple/logitech_g15 keyboard = 93; // Codes generated for scancodes 0x59-0x5f, 0x62-0x76 = 157; // = 170; // = 181; // alias = ; = 182; // = 183; // = 184; // = 189; // = 190; // = 191; // = 192; // = 193; // = 198; // = 199; // = 200; // = 201; // = 203; // = 204; // = 205; // = 206; // = 207; // alias = ; // alias = ; // alias = ; // alias = ; // = 219; // = 220; // = 221; // // Solaris compatibility alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; // Other codes never generated. The XFree86 ddx never generates // these codes. // Thus we can use them as fake keys = 8; = 124; // = 125; // = 156; // = 127; // = 128; // indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; indicator 3 = "Scroll Lock"; alias = ; // For Brazilian ABNT2 alias = ; }; // What keyboard is this? xkb_keycodes "102" { include "xfree86(xfree86)" // There will be warnings from xkbcomp because of multiple definitions. = 122; = 123; = 121; = 118; = 131; = 135; = 119; = 129; = 130; = 134; = 128; = 132; = 120; = 133; = 125; = 124; }; // IBM ThinkPad Z60m/Z60t/Z61m/Z61t xkb_keycodes "thinkpadz60" { include "xfree86(xfree86)" = 227; }; ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1579381981.71198 libxkbcommon-0.10.0/test/data/keymaps/0000755000175000017500000000000000000000000017200 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6953137 libxkbcommon-0.10.0/test/data/keymaps/bad.xkb0000644000175000017500000000021300000000000020430 0ustar00ranran00000000000000xkb_keymap { xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+us" }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6953137 libxkbcommon-0.10.0/test/data/keymaps/basic.xkb0000644000175000017500000000030200000000000020762 0ustar00ranran00000000000000xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+us" }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6953137 libxkbcommon-0.10.0/test/data/keymaps/comprehensive-plus-geom.xkb0000644000175000017500000016014100000000000024466 0ustar00ranran00000000000000xkb_keymap { xkb_keycodes "evdev+aliases(qwerty)" { minimum = 8; maximum = 255; = 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; = 65; = 66; = 67; = 68; = 69; = 70; = 71; = 72; = 73; = 74; = 75; = 76; = 77; = 78; = 79; = 80; = 81; = 82; = 83; = 84; = 85; = 86; = 87; = 88; = 89; = 90; = 91; = 92; = 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; indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; indicator 3 = "Scroll Lock"; indicator 4 = "Compose"; indicator 5 = "Kana"; indicator 6 = "Sleep"; indicator 7 = "Suspend"; indicator 8 = "Mute"; indicator 9 = "Misc"; indicator 10 = "Mail"; indicator 11 = "Charging"; virtual indicator 12 = "Shift Lock"; virtual indicator 13 = "Group 2"; virtual indicator 14 = "Mouse Keys"; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; xkb_types "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; type "ONE_LEVEL" { modifiers= none; level_name[Level1]= "Any"; }; type "TWO_LEVEL" { modifiers= Shift; map[Shift]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; }; type "ALPHABETIC" { modifiers= Shift+Lock; map[Shift]= Level2; map[Lock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Caps"; }; type "KEYPAD" { modifiers= Shift+NumLock; map[Shift]= Level2; map[NumLock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Number"; }; type "SHIFT+ALT" { modifiers= Shift+Alt; map[Shift+Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift+Alt"; }; type "PC_CONTROL_LEVEL2" { modifiers= Control; map[Control]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Control"; }; type "PC_LCONTROL_LEVEL2" { modifiers= LControl; map[LControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LControl"; }; type "PC_RCONTROL_LEVEL2" { modifiers= RControl; map[RControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RControl"; }; type "PC_ALT_LEVEL2" { modifiers= Alt; map[Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Alt"; }; type "PC_LALT_LEVEL2" { modifiers= LAlt; map[LAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LAlt"; }; type "PC_RALT_LEVEL2" { modifiers= RAlt; map[RAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RAlt"; }; type "CTRL+ALT" { modifiers= Shift+Control+Alt+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Control+Alt]= Level5; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Ctrl+Alt"; }; type "LOCAL_EIGHT_LEVEL" { modifiers= Shift+Lock+Control+LevelThree; map[Shift+Lock]= Level1; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Control]= Level5; map[Shift+Lock+Control]= Level5; map[Shift+Control]= Level6; map[Lock+Control]= Level6; map[Control+LevelThree]= Level7; map[Shift+Lock+Control+LevelThree]= Level7; map[Shift+Control+LevelThree]= Level8; map[Lock+Control+LevelThree]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; level_name[Level4]= "Shift Level3"; level_name[Level5]= "Ctrl"; level_name[Level6]= "Shift Ctrl"; level_name[Level7]= "Level3 Ctrl"; level_name[Level8]= "Shift Level3 Ctrl"; }; type "THREE_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; }; type "EIGHT_LEVEL" { modifiers= Shift+LevelThree+LevelFive; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level8; map[Shift+Lock+LevelThree+LevelFive]= Level7; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; preserve[Lock+LevelFive]= Lock; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level7; preserve[Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelThree+LevelFive]= Level8; preserve[Shift+Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelFive]= Level1; preserve[Shift+Lock+LevelFive]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "FOUR_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_MIXED_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift+NumLock]= Level1; map[NumLock]= Level2; map[Shift]= Level2; map[LevelThree]= Level3; map[NumLock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_X" { modifiers= Shift+Control+Alt+LevelThree; map[LevelThree]= Level2; map[Shift+LevelThree]= Level3; map[Control+Alt]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Alt Base"; level_name[Level3]= "Shift Alt"; level_name[Level4]= "Ctrl+Alt"; }; type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level4; preserve[Lock]= Lock; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "AltGr Base"; level_name[Level4]= "Shift AltGr"; }; type "FOUR_LEVEL_PLUS_LOCK" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock]= Level5; map[Shift+Lock]= Level2; map[Lock+LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Lock"; }; type "FOUR_LEVEL_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift]= Level2; map[NumLock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[NumLock+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Alt Number"; }; }; xkb_compatibility "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; interpret.useModMapMods= AnyLevel; interpret.repeat= False; interpret.locking= False; interpret ISO_Level2_Latch+Exactly(Shift) { useModMapMods=level1; action= LatchMods(modifiers=Shift,clearLocks,latchToLock); }; interpret Shift_Lock+AnyOf(Shift+Lock) { action= LockMods(modifiers=Shift); }; interpret Num_Lock+AnyOf(all) { virtualModifier= NumLock; action= LockMods(modifiers=NumLock); }; interpret ISO_Lock+AnyOf(all) { action= ISOLock(modifiers=modMapMods,affect=all); }; interpret ISO_Level3_Shift+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LockMods(modifiers=LevelThree); }; interpret Alt_L+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Alt_R+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_L+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_R+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_L+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_R+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_L+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_R+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Scroll_Lock+AnyOf(all) { virtualModifier= ScrollLock; action= LockMods(modifiers=modMapMods); }; interpret ISO_Level5_Shift+AnyOf(all) { virtualModifier= LevelFive; useModMapMods=level1; action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOf(all) { virtualModifier= LevelFive; action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOf(all) { virtualModifier= LevelFive; action= LockMods(modifiers=LevelFive); }; interpret Mode_switch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= SetGroup(group=+1); }; interpret ISO_Level3_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelThree); }; interpret ISO_Group_Latch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LatchGroup(group=2); }; interpret ISO_Next_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=+1); }; interpret ISO_Prev_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=-1); }; interpret ISO_First_Group+AnyOfOrNone(all) { action= LockGroup(group=1); }; interpret ISO_Last_Group+AnyOfOrNone(all) { action= LockGroup(group=2); }; interpret KP_1+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_End+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_2+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_Down+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_3+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_Next+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_4+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_Left+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_6+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_Right+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_7+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_Home+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_8+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_Up+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_9+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_Prior+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_5+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_Begin+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_F2+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_Divide+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_F3+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_Multiply+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_F4+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Subtract+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Separator+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_Add+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_0+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Insert+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Decimal+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret KP_Delete+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret F25+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret F26+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret F27+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret F29+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret F31+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret F33+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret F35+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret Pointer_Button_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default); }; interpret Pointer_Button1+AnyOfOrNone(all) { action= PtrBtn(button=1); }; interpret Pointer_Button2+AnyOfOrNone(all) { action= PtrBtn(button=2); }; interpret Pointer_Button3+AnyOfOrNone(all) { action= PtrBtn(button=3); }; interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default,count=2); }; interpret Pointer_DblClick1+AnyOfOrNone(all) { action= PtrBtn(button=1,count=2); }; interpret Pointer_DblClick2+AnyOfOrNone(all) { action= PtrBtn(button=2,count=2); }; interpret Pointer_DblClick3+AnyOfOrNone(all) { action= PtrBtn(button=3,count=2); }; interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { action= LockPtrBtn(button=default,affect=both); }; interpret Pointer_Drag1+AnyOfOrNone(all) { action= LockPtrBtn(button=1,affect=both); }; interpret Pointer_Drag2+AnyOfOrNone(all) { action= LockPtrBtn(button=2,affect=both); }; interpret Pointer_Drag3+AnyOfOrNone(all) { action= LockPtrBtn(button=3,affect=both); }; interpret Pointer_EnableKeys+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret Pointer_Accelerate+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=+1); }; interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=-1); }; interpret AccessX_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXKeys); }; interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXFeedback); }; interpret RepeatKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=RepeatKeys); }; interpret SlowKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=SlowKeys); }; interpret BounceKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=BounceKeys); }; interpret StickyKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=StickyKeys); }; interpret MouseKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Overlay1_Enable+AnyOfOrNone(all) { action= LockControls(controls=Overlay1); }; interpret Overlay2_Enable+AnyOfOrNone(all) { action= LockControls(controls=Overlay2); }; interpret AudibleBell_Enable+AnyOfOrNone(all) { action= LockControls(controls=AudibleBell); }; interpret Terminate_Server+AnyOfOrNone(all) { action= Terminate(); }; interpret Alt_L+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Alt_R+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Meta_L+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Meta_R+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Super_L+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Super_R+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Hyper_L+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Hyper_R+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Shift_L+AnyOfOrNone(all) { action= SetMods(modifiers=Shift,clearLocks); }; interpret XF86Switch_VT_1+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=1,!same); }; interpret XF86Switch_VT_2+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=2,!same); }; interpret XF86Switch_VT_3+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=3,!same); }; interpret XF86Switch_VT_4+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=4,!same); }; interpret XF86Switch_VT_5+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=5,!same); }; interpret XF86Switch_VT_6+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=6,!same); }; interpret XF86Switch_VT_7+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=7,!same); }; interpret XF86Switch_VT_8+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=8,!same); }; interpret XF86Switch_VT_9+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=9,!same); }; interpret XF86Switch_VT_10+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=10,!same); }; interpret XF86Switch_VT_11+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=11,!same); }; interpret XF86Switch_VT_12+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=12,!same); }; interpret XF86LogGrabInfo+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00); }; interpret XF86LogWindowTree+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00); }; interpret XF86Next_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret XF86Prev_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret ISO_Level5_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelFive); }; interpret Caps_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=Lock); }; interpret Any+Exactly(Lock) { action= LockMods(modifiers=Lock); }; interpret Any+AnyOf(all) { action= SetMods(modifiers=modMapMods,clearLocks); }; indicator "Caps Lock" { !allowExplicit; whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { !allowExplicit; whichModState= locked; modifiers= NumLock; }; indicator "Scroll Lock" { whichModState= locked; modifiers= ScrollLock; }; indicator "Shift Lock" { !allowExplicit; whichModState= locked; modifiers= Shift; }; indicator "Group 2" { !allowExplicit; groups= 0xfe; }; indicator "Mouse Keys" { indicatorDrivesKeyboard; controls= mouseKeys; }; }; xkb_symbols "pc+us+inet(evdev)+ctrl(nocaps)+compose(rwin)+terminate(ctrl_alt_bksp)" { name[group1]="English (US)"; key { [ Escape ] }; key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, numbersign ] }; key { [ 4, dollar ] }; key { [ 5, percent ] }; key { [ 6, asciicircum ] }; key { [ 7, ampersand ] }; key { [ 8, asterisk ] }; key { [ 9, parenleft ] }; key { [ 0, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { type= "CTRL+ALT", symbols[Group1]= [ BackSpace, BackSpace, NoSymbol, NoSymbol, Terminate_Server ] }; key { [ Tab, ISO_Left_Tab ] }; key { type= "ALPHABETIC", symbols[Group1]= [ q, Q ] }; key { type= "ALPHABETIC", symbols[Group1]= [ w, W ] }; key { type= "ALPHABETIC", symbols[Group1]= [ e, E ] }; key { type= "ALPHABETIC", symbols[Group1]= [ r, R ] }; key { type= "ALPHABETIC", symbols[Group1]= [ t, T ] }; key { type= "ALPHABETIC", symbols[Group1]= [ y, Y ] }; key { type= "ALPHABETIC", symbols[Group1]= [ u, U ] }; key { type= "ALPHABETIC", symbols[Group1]= [ i, I ] }; key { type= "ALPHABETIC", symbols[Group1]= [ o, O ] }; key { type= "ALPHABETIC", symbols[Group1]= [ p, P ] }; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; key { [ Return ] }; key { [ Control_L ] }; key { type= "ALPHABETIC", symbols[Group1]= [ a, A ] }; key { type= "ALPHABETIC", symbols[Group1]= [ s, S ] }; key { type= "ALPHABETIC", symbols[Group1]= [ d, D ] }; key { type= "ALPHABETIC", symbols[Group1]= [ f, F ] }; key { type= "ALPHABETIC", symbols[Group1]= [ g, G ] }; key { type= "ALPHABETIC", symbols[Group1]= [ h, H ] }; key { type= "ALPHABETIC", symbols[Group1]= [ j, J ] }; key { type= "ALPHABETIC", symbols[Group1]= [ k, K ] }; key { type= "ALPHABETIC", symbols[Group1]= [ l, L ] }; key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl ] }; key { [ grave, asciitilde ] }; key { [ Shift_L ] }; key { [ backslash, bar ] }; key { type= "ALPHABETIC", symbols[Group1]= [ z, Z ] }; key { type= "ALPHABETIC", symbols[Group1]= [ x, X ] }; key { type= "ALPHABETIC", symbols[Group1]= [ c, C ] }; key { type= "ALPHABETIC", symbols[Group1]= [ v, V ] }; key { type= "ALPHABETIC", symbols[Group1]= [ b, B ] }; key { type= "ALPHABETIC", symbols[Group1]= [ n, N ] }; key { type= "ALPHABETIC", symbols[Group1]= [ m, M ] }; key { [ comma, less ] }; key { [ period, greater ] }; key { [ slash, question ] }; key { [ Shift_R ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ] }; key { [ Alt_L, Meta_L ] }; key { [ space ] }; key { [ Control_L, Control_L ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ] }; key { [ Num_Lock ] }; key { [ Scroll_Lock ] }; key { [ KP_Home, KP_7 ] }; key { [ KP_Up, KP_8 ] }; key { [ KP_Prior, KP_9 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ] }; key { [ KP_Left, KP_4 ] }; key { [ KP_Begin, KP_5 ] }; key { [ KP_Right, KP_6 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ] }; key { [ KP_End, KP_1 ] }; key { [ KP_Down, KP_2 ] }; key { [ KP_Next, KP_3 ] }; key { [ KP_Insert, KP_0 ] }; key { [ KP_Delete, KP_Decimal ] }; key { [ ISO_Level3_Shift ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ less, greater, bar, brokenbar ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ] }; key { [ Katakana ] }; key { [ Hiragana ] }; key { [ Henkan_Mode ] }; key { [ Hiragana_Katakana ] }; key { [ Muhenkan ] }; key { [ KP_Enter ] }; key { [ Control_R ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ] }; key { type= "PC_ALT_LEVEL2", symbols[Group1]= [ Print, Sys_Req ] }; key { type= "TWO_LEVEL", symbols[Group1]= [ Alt_R, Meta_R ] }; key { [ Linefeed ] }; key { [ Home ] }; key { [ Up ] }; key { [ Prior ] }; key { [ Left ] }; key { [ Right ] }; key { [ End ] }; key { [ Down ] }; key { [ Next ] }; key { [ Insert ] }; key { [ Delete ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86PowerOff ] }; key { [ KP_Equal ] }; key { [ plusminus ] }; key { type= "PC_CONTROL_LEVEL2", symbols[Group1]= [ Pause, Break ] }; key { [ XF86LaunchA ] }; key { [ KP_Decimal, KP_Decimal ] }; key { [ Hangul ] }; key { [ Hangul_Hanja ] }; key { [ Super_L ] }; key { type= "TWO_LEVEL", symbols[Group1]= [ Multi_key, Multi_key ] }; key { [ Menu ] }; key { [ Cancel ] }; key { [ Redo ] }; key { [ SunProps ] }; key { [ Undo ] }; key { [ SunFront ] }; key { [ XF86Copy ] }; key { [ SunOpen ] }; key { [ XF86Paste ] }; key { [ Find ] }; key { [ XF86Cut ] }; key { [ Help ] }; key { [ XF86MenuKB ] }; key { [ XF86Calculator ] }; key { [ XF86Sleep ] }; key { [ XF86WakeUp ] }; key { [ XF86Explorer ] }; key { [ XF86Send ] }; key { [ XF86Xfer ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86WWW ] }; key { [ XF86DOS ] }; key { [ XF86ScreenSaver ] }; key { [ XF86RotateWindows ] }; key { [ XF86Mail ] }; key { [ XF86Favorites ] }; key { [ XF86MyComputer ] }; key { [ XF86Back ] }; key { [ XF86Forward ] }; key { [ XF86Eject ] }; key { [ XF86Eject, XF86Eject ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioStop, XF86Eject ] }; key { [ XF86AudioRecord ] }; key { [ XF86AudioRewind ] }; key { [ XF86Phone ] }; key { [ XF86Tools ] }; key { [ XF86HomePage ] }; key { [ XF86Reload ] }; key { [ XF86Close ] }; key { [ XF86ScrollUp ] }; key { [ XF86ScrollDown ] }; key { [ parenleft ] }; key { [ parenright ] }; key { [ XF86New ] }; key { [ Redo ] }; key { [ XF86Tools ] }; key { [ XF86Launch5 ] }; key { [ XF86Launch6 ] }; key { [ XF86Launch7 ] }; key { [ XF86Launch8 ] }; key { [ XF86Launch9 ] }; key { [ XF86TouchpadToggle ] }; key { [ XF86TouchpadOn ] }; key { [ XF86TouchpadOff ] }; key { [ Mode_switch ] }; key { [ NoSymbol, Alt_L ] }; key { [ NoSymbol, Meta_L ] }; key { [ NoSymbol, Super_L ] }; key { [ NoSymbol, Hyper_L ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioPause ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch4 ] }; key { [ XF86LaunchB ] }; key { [ XF86Suspend ] }; key { [ XF86Close ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioForward ] }; key { [ Print ] }; key { [ XF86WebCam ] }; key { [ XF86Mail ] }; key { [ XF86Messenger ] }; key { [ XF86Search ] }; key { [ XF86Go ] }; key { [ XF86Finance ] }; key { [ XF86Game ] }; key { [ XF86Shop ] }; key { [ Cancel ] }; key { [ XF86MonBrightnessDown ] }; key { [ XF86MonBrightnessUp ] }; key { [ XF86AudioMedia ] }; key { [ XF86Display ] }; key { [ XF86KbdLightOnOff ] }; key { [ XF86KbdBrightnessDown ] }; key { [ XF86KbdBrightnessUp ] }; key { [ XF86Send ] }; key { [ XF86Reply ] }; key { [ XF86MailForward ] }; key { [ XF86Save ] }; key { [ XF86Documents ] }; key { [ XF86Battery ] }; key { [ XF86Bluetooth ] }; key { [ XF86WLAN ] }; modifier_map Control { }; modifier_map Shift { }; modifier_map Shift { }; modifier_map Mod1 { }; modifier_map Control { }; modifier_map Mod2 { }; modifier_map Mod5 { }; modifier_map Control { }; modifier_map Mod1 { }; modifier_map Mod4 { }; modifier_map Mod5 { }; modifier_map Mod1 { }; modifier_map Mod4 { }; modifier_map Mod4 { }; }; xkb_geometry "pc(pc105)" { width= 470; height= 180; alias = ; alias = ; baseColor= "white"; labelColor= "black"; xfont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; description= "Generic 105"; shape "NORM" { corner= 1, { [ 18, 18 ] }, { [ 2, 1 ], [ 16, 16 ] } }; shape "BKSP" { corner= 1, { [ 38, 18 ] }, { [ 2, 1 ], [ 36, 16 ] } }; shape "TABK" { corner= 1, { [ 28, 18 ] }, { [ 2, 1 ], [ 26, 16 ] } }; shape "BKSL" { corner= 1, { [ 28, 18 ] }, { [ 2, 1 ], [ 26, 16 ] } }; shape "RTRN" { corner= 1, { [ 0, 0 ], [ 28, 0 ], [ 28, 37 ], [ 5, 37 ], [ 5, 18 ], [ 0, 18 ] }, { [ 2, 1 ], [ 26, 1 ], [ 26, 35 ], [ 7, 35 ], [ 7, 16 ], [ 2, 16 ] }, approx= { [ 5, 0 ], [ 28, 37 ] } }; shape "CAPS" { corner= 1, { [ 33, 18 ] }, { [ 2, 1 ], [ 31, 16 ] } }; shape "LFSH" { corner= 1, { [ 25, 18 ] }, { [ 2, 1 ], [ 23, 16 ] } }; shape "RTSH" { corner= 1, { [ 50, 18 ] }, { [ 2, 1 ], [ 48, 16 ] } }; shape "MODK" { corner= 1, { [ 27, 18 ] }, { [ 2, 1 ], [ 25, 16 ] } }; shape "SMOD" { corner= 1, { [ 23, 18 ] }, { [ 2, 1 ], [ 21, 16 ] } }; shape "SPCE" { corner= 1, { [ 113, 18 ] }, { [ 2, 1 ], [ 111, 16 ] } }; shape "KP0" { corner= 1, { [ 37, 18 ] }, { [ 2, 1 ], [ 35, 16 ] } }; shape "KPAD" { corner= 1, { [ 18, 37 ] }, { [ 2, 1 ], [ 16, 35 ] } }; shape "LEDS" { { [ 75, 20 ] } }; shape "LED" { { [ 5, 1 ] } }; section "Function" { key.color= "grey20"; priority= 7; top= 22; left= 19; width= 351; height= 19; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 20, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 11, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 11, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 8, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" } }; }; }; // End of "Function" section section "Alpha" { key.color= "white"; priority= 8; top= 61; left= 19; width= 287; height= 95; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "BKSP", 1, color="grey20" } }; }; row { top= 20; left= 1; keys { { , "TABK", 1, color="grey20" }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "RTRN", 1, color="grey20" } }; }; row { top= 39; left= 1; keys { { , "CAPS", 1, color="grey20" }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; row { top= 58; left= 1; keys { { , "LFSH", 1, color="grey20" }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "RTSH", 1, color="grey20" } }; }; row { top= 77; left= 1; keys { { , "MODK", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SPCE", 1 }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" } }; }; }; // End of "Alpha" section section "Editing" { key.color= "grey20"; priority= 9; top= 61; left= 312; width= 58; height= 95; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; row { top= 20; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; row { top= 58; left= 20; keys { { , "NORM", 1 } }; }; row { top= 77; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; }; // End of "Editing" section section "Keypad" { key.color= "grey20"; priority= 10; top= 61; left= 376; width= 77; height= 95; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; row { top= 20; left= 1; keys { { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "KPAD", 1 } }; }; row { top= 39; left= 1; keys { { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" } }; }; row { top= 58; left= 1; keys { { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "KPAD", 1 } }; }; row { top= 77; left= 1; keys { { , "KP0", 1, color="white" }, { , "NORM", 1, color="white" } }; }; }; // End of "Keypad" section solid "LedPanel" { top= 22; left= 377; priority= 0; color= "grey10"; shape= "LEDS"; }; indicator "Num Lock" { top= 37; left= 382; priority= 1; onColor= "green"; offColor= "green30"; shape= "LED"; }; indicator "Caps Lock" { top= 37; left= 407; priority= 2; onColor= "green"; offColor= "green30"; shape= "LED"; }; indicator "Scroll Lock" { top= 37; left= 433; priority= 3; onColor= "green"; offColor= "green30"; shape= "LED"; }; text "NumLockLabel" { top= 25; left= 378; priority= 4; width= 19.8; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Num\nLock"; }; text "CapsLockLabel" { top= 25; left= 403; priority= 5; width= 26.4; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Caps\nLock"; }; text "ScrollLockLabel" { top= 25; left= 428; priority= 6; width= 39.6; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Scroll\nLock"; }; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6953137 libxkbcommon-0.10.0/test/data/keymaps/divide-by-zero.xkb0000644000175000017500000000047700000000000022547 0ustar00ranran00000000000000xkb_keymap { xkb_keycodes { = 1; }; xkb_types { virtual_modifiers NumLock; }; xkb_compatibility { virtual_modifiers NumLock; interpret KP_1+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=(1/0),y=+1); }; }; xkb_symbols { key { [ NoSymbol, Hyper_L ] }; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7086468 libxkbcommon-0.10.0/test/data/keymaps/host.xkb0000644000175000017500000015660700000000000020702 0ustar00ranran00000000000000xkb_keymap { xkb_keycodes "evdev_aliases(qwerty)" { minimum = 8; maximum = 255; = 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; = 65; = 66; = 67; = 68; = 69; = 70; = 71; = 72; = 73; = 74; = 75; = 76; = 77; = 78; = 79; = 80; = 81; = 82; = 83; = 84; = 85; = 86; = 87; = 88; = 89; = 90; = 91; = 92; = 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; indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; indicator 3 = "Scroll Lock"; indicator 4 = "Compose"; indicator 5 = "Kana"; indicator 6 = "Sleep"; indicator 7 = "Suspend"; indicator 8 = "Mute"; indicator 9 = "Misc"; indicator 10 = "Mail"; indicator 11 = "Charging"; indicator 12 = "Shift Lock"; indicator 13 = "Group 2"; indicator 14 = "Mouse Keys"; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; xkb_types "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; type "ONE_LEVEL" { modifiers= none; level_name[Level1]= "Any"; }; type "TWO_LEVEL" { modifiers= Shift; map[Shift]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; }; type "ALPHABETIC" { modifiers= Shift+Lock; map[Shift]= Level2; map[Lock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Caps"; }; type "KEYPAD" { modifiers= Shift+NumLock; map[Shift]= Level2; map[NumLock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Number"; }; type "SHIFT+ALT" { modifiers= Shift+Alt; map[Shift+Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift+Alt"; }; type "PC_SUPER_LEVEL2" { modifiers= Mod4; map[Mod4]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Super"; }; type "PC_CONTROL_LEVEL2" { modifiers= Control; map[Control]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Control"; }; type "PC_LCONTROL_LEVEL2" { modifiers= LControl; map[LControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LControl"; }; type "PC_RCONTROL_LEVEL2" { modifiers= RControl; map[RControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RControl"; }; type "PC_ALT_LEVEL2" { modifiers= Alt; map[Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Alt"; }; type "PC_LALT_LEVEL2" { modifiers= LAlt; map[LAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LAlt"; }; type "PC_RALT_LEVEL2" { modifiers= RAlt; map[RAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RAlt"; }; type "CTRL+ALT" { modifiers= Shift+Control+Alt+LevelThree; map[Shift]= Level2; preserve[Shift]= Shift; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; preserve[Shift+LevelThree]= Shift; map[Control+Alt]= Level5; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Ctrl+Alt"; }; type "LOCAL_EIGHT_LEVEL" { modifiers= Shift+Lock+Control+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Control]= Level5; map[Shift+Lock+Control]= Level5; map[Shift+Control]= Level6; map[Lock+Control]= Level6; map[Control+LevelThree]= Level7; map[Shift+Lock+Control+LevelThree]= Level7; map[Shift+Control+LevelThree]= Level8; map[Lock+Control+LevelThree]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; level_name[Level4]= "Shift Level3"; level_name[Level5]= "Ctrl"; level_name[Level6]= "Shift Ctrl"; level_name[Level7]= "Level3 Ctrl"; level_name[Level8]= "Shift Level3 Ctrl"; }; type "THREE_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; }; type "EIGHT_LEVEL" { modifiers= Shift+LevelThree+LevelFive; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level8; map[Shift+Lock+LevelThree+LevelFive]= Level7; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; preserve[Lock+LevelFive]= Lock; map[Shift+Lock+LevelFive]= Level6; preserve[Shift+Lock+LevelFive]= Lock; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level7; preserve[Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelThree+LevelFive]= Level8; preserve[Shift+Lock+LevelThree+LevelFive]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "FOUR_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_MIXED_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[NumLock]= Level2; map[Shift]= Level2; map[LevelThree]= Level3; map[NumLock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_X" { modifiers= Shift+Control+Alt+LevelThree; map[LevelThree]= Level2; map[Shift+LevelThree]= Level3; map[Control+Alt]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Alt Base"; level_name[Level3]= "Shift Alt"; level_name[Level4]= "Ctrl+Alt"; }; type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level4; preserve[Lock]= Lock; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "AltGr Base"; level_name[Level4]= "Shift AltGr"; }; type "FOUR_LEVEL_PLUS_LOCK" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock]= Level5; map[Shift+Lock]= Level2; map[Lock+LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Lock"; }; type "FOUR_LEVEL_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift]= Level2; map[NumLock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[NumLock+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Alt Number"; }; }; xkb_compatibility "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; interpret.useModMapMods= AnyLevel; interpret.repeat= False; interpret ISO_Level2_Latch+Exactly(Shift) { useModMapMods=level1; action= LatchMods(modifiers=Shift,clearLocks,latchToLock); }; interpret Shift_Lock+AnyOf(Shift+Lock) { action= LockMods(modifiers=Shift); }; interpret Num_Lock+AnyOf(all) { virtualModifier= NumLock; action= LockMods(modifiers=NumLock); }; interpret ISO_Level3_Shift+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LockMods(modifiers=LevelThree); }; interpret Alt_L+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Alt_R+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_L+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_R+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_L+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_R+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_L+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_R+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Scroll_Lock+AnyOf(all) { virtualModifier= ScrollLock; action= LockMods(modifiers=modMapMods); }; interpret ISO_Level5_Shift+AnyOf(all) { virtualModifier= LevelFive; useModMapMods=level1; action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOf(all) { virtualModifier= LevelFive; useModMapMods=level1; action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOf(all) { virtualModifier= LevelFive; useModMapMods=level1; action= LockMods(modifiers=LevelFive); }; interpret Mode_switch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= SetGroup(group=+1); }; interpret ISO_Level3_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelThree); }; interpret ISO_Group_Latch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LatchGroup(group=2); }; interpret ISO_Next_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=+1); }; interpret ISO_Prev_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=-1); }; interpret ISO_First_Group+AnyOfOrNone(all) { action= LockGroup(group=1); }; interpret ISO_Last_Group+AnyOfOrNone(all) { action= LockGroup(group=2); }; interpret KP_1+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_End+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_2+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_Down+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_3+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_Next+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_4+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_Left+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_6+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_Right+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_7+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_Home+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_8+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_Up+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_9+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_Prior+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_5+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_Begin+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_F2+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_Divide+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_F3+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_Multiply+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_F4+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Subtract+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Separator+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_Add+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_0+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Insert+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Decimal+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret KP_Delete+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret F25+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret F26+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret F27+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret F29+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret F31+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret F33+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret F35+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret Pointer_Button_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default); }; interpret Pointer_Button1+AnyOfOrNone(all) { action= PtrBtn(button=1); }; interpret Pointer_Button2+AnyOfOrNone(all) { action= PtrBtn(button=2); }; interpret Pointer_Button3+AnyOfOrNone(all) { action= PtrBtn(button=3); }; interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default,count=2); }; interpret Pointer_DblClick1+AnyOfOrNone(all) { action= PtrBtn(button=1,count=2); }; interpret Pointer_DblClick2+AnyOfOrNone(all) { action= PtrBtn(button=2,count=2); }; interpret Pointer_DblClick3+AnyOfOrNone(all) { action= PtrBtn(button=3,count=2); }; interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { action= LockPtrBtn(button=default); }; interpret Pointer_Drag1+AnyOfOrNone(all) { action= LockPtrBtn(button=1); }; interpret Pointer_Drag2+AnyOfOrNone(all) { action= LockPtrBtn(button=2); }; interpret Pointer_Drag3+AnyOfOrNone(all) { action= LockPtrBtn(button=3); }; interpret Pointer_EnableKeys+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret Pointer_Accelerate+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=+1); }; interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=-1); }; interpret AccessX_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXKeys); }; interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXFeedback); }; interpret RepeatKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=RepeatKeys); }; interpret SlowKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=SlowKeys); }; interpret BounceKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=BounceKeys); }; interpret StickyKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=StickyKeys); }; interpret MouseKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Overlay1_Enable+AnyOfOrNone(all) { action= LockControls(controls=none); }; interpret Overlay2_Enable+AnyOfOrNone(all) { action= LockControls(controls=none); }; interpret AudibleBell_Enable+AnyOfOrNone(all) { action= LockControls(controls=AudibleBell); }; interpret Terminate_Server+AnyOfOrNone(all) { action= Terminate(); }; interpret Alt_L+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Alt_R+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Meta_L+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Meta_R+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Super_L+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Super_R+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Hyper_L+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Hyper_R+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Shift_L+AnyOfOrNone(all) { action= SetMods(modifiers=Shift,clearLocks); }; interpret XF86Switch_VT_1+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=1,!same); }; interpret XF86Switch_VT_2+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=2,!same); }; interpret XF86Switch_VT_3+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=3,!same); }; interpret XF86Switch_VT_4+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=4,!same); }; interpret XF86Switch_VT_5+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=5,!same); }; interpret XF86Switch_VT_6+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=6,!same); }; interpret XF86Switch_VT_7+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=7,!same); }; interpret XF86Switch_VT_8+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=8,!same); }; interpret XF86Switch_VT_9+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=9,!same); }; interpret XF86Switch_VT_10+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=10,!same); }; interpret XF86Switch_VT_11+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=11,!same); }; interpret XF86Switch_VT_12+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=12,!same); }; interpret XF86LogGrabInfo+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00); }; interpret XF86LogWindowTree+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00); }; interpret XF86Next_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret XF86Prev_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret ISO_Level5_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelFive); }; interpret Caps_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=Lock); }; interpret Any+Exactly(Lock) { action= LockMods(modifiers=Lock); }; interpret Any+AnyOf(all) { action= SetMods(modifiers=modMapMods,clearLocks); }; indicator "Caps Lock" { whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { whichModState= locked; modifiers= NumLock; }; indicator "Scroll Lock" { whichModState= locked; modifiers= ScrollLock; }; indicator "Shift Lock" { whichModState= locked; modifiers= Shift; }; indicator "Group 2" { groups= 0xfe; }; indicator "Mouse Keys" { controls= MouseKeys; }; }; xkb_symbols "pc_us_pt_2_us_3_inet(evdev)_group(shift_caps_toggle)_compose(ralt)" { name[group1]="English (US)"; name[group2]="Portuguese"; name[group3]="English (US)"; key { [ Escape ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ 1, exclam ], symbols[Group2]= [ 1, exclam, onesuperior, exclamdown ], symbols[Group3]= [ 1, exclam ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ 2, at ], symbols[Group2]= [ 2, quotedbl, at, oneeighth ], symbols[Group3]= [ 2, at ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ 3, numbersign ], symbols[Group2]= [ 3, numbersign, sterling, sterling ], symbols[Group3]= [ 3, numbersign ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ 4, dollar ], symbols[Group2]= [ 4, dollar, section, dollar ], symbols[Group3]= [ 4, dollar ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ 5, percent ], symbols[Group2]= [ 5, percent, onehalf, threeeighths ], symbols[Group3]= [ 5, percent ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ 6, asciicircum ], symbols[Group2]= [ 6, ampersand, notsign, fiveeighths ], symbols[Group3]= [ 6, asciicircum ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ 7, ampersand ], symbols[Group2]= [ 7, slash, braceleft, seveneighths ], symbols[Group3]= [ 7, ampersand ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ 8, asterisk ], symbols[Group2]= [ 8, parenleft, bracketleft, trademark ], symbols[Group3]= [ 8, asterisk ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ 9, parenleft ], symbols[Group2]= [ 9, parenright, bracketright, plusminus ], symbols[Group3]= [ 9, parenleft ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ 0, parenright ], symbols[Group2]= [ 0, equal, braceright, degree ], symbols[Group3]= [ 0, parenright ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ minus, underscore ], symbols[Group2]= [ apostrophe, question, backslash, questiondown ], symbols[Group3]= [ minus, underscore ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ equal, plus ], symbols[Group2]= [ guillemotleft, guillemotright, dead_cedilla, dead_ogonek ], symbols[Group3]= [ equal, plus ] }; key { [ BackSpace, BackSpace ] }; key { [ Tab, ISO_Left_Tab ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ q, Q ], symbols[Group2]= [ q, Q, at, Greek_OMEGA ], symbols[Group3]= [ q, Q ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_ALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ w, W ], symbols[Group2]= [ w, W, lstroke, Lstroke ], symbols[Group3]= [ w, W ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ e, E ], symbols[Group2]= [ e, E, EuroSign, cent ], symbols[Group3]= [ e, E ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ r, R ], symbols[Group2]= [ r, R, paragraph, registered ], symbols[Group3]= [ r, R ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_ALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ t, T ], symbols[Group2]= [ t, T, tslash, Tslash ], symbols[Group3]= [ t, T ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ y, Y ], symbols[Group2]= [ y, Y, leftarrow, yen ], symbols[Group3]= [ y, Y ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ u, U ], symbols[Group2]= [ u, U, downarrow, uparrow ], symbols[Group3]= [ u, U ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ i, I ], symbols[Group2]= [ i, I, rightarrow, idotless ], symbols[Group3]= [ i, I ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_ALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ o, O ], symbols[Group2]= [ o, O, oslash, Oslash ], symbols[Group3]= [ o, O ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_ALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ p, P ], symbols[Group2]= [ p, P, thorn, THORN ], symbols[Group3]= [ p, P ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ bracketleft, braceleft ], symbols[Group2]= [ plus, asterisk, dead_diaeresis, dead_abovering ], symbols[Group3]= [ bracketleft, braceleft ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ bracketright, braceright ], symbols[Group2]= [ dead_acute, dead_grave, dead_tilde, dead_macron ], symbols[Group3]= [ bracketright, braceright ] }; key { [ Return ] }; key { [ Control_L ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_ALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ a, A ], symbols[Group2]= [ a, A, ae, AE ], symbols[Group3]= [ a, A ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ s, S ], symbols[Group2]= [ s, S, ssharp, section ], symbols[Group3]= [ s, S ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_ALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ d, D ], symbols[Group2]= [ d, D, eth, ETH ], symbols[Group3]= [ d, D ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ f, F ], symbols[Group2]= [ f, F, dstroke, ordfeminine ], symbols[Group3]= [ f, F ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_ALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ g, G ], symbols[Group2]= [ g, G, eng, ENG ], symbols[Group3]= [ g, G ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_ALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ h, H ], symbols[Group2]= [ h, H, hstroke, Hstroke ], symbols[Group3]= [ h, H ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ j, J ], symbols[Group2]= [ j, J, dead_hook, dead_horn ], symbols[Group3]= [ j, J ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ k, K ], symbols[Group2]= [ k, K, kra, ampersand ], symbols[Group3]= [ k, K ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_ALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ l, L ], symbols[Group2]= [ l, L, lstroke, Lstroke ], symbols[Group3]= [ l, L ] }; key { type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ semicolon, colon ], symbols[Group2]= [ ccedilla, Ccedilla, dead_acute, dead_doubleacute ], symbols[Group3]= [ semicolon, colon ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ apostrophe, quotedbl ], symbols[Group2]= [ masculine, ordfeminine, dead_circumflex, dead_caron ], symbols[Group3]= [ apostrophe, quotedbl ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ grave, asciitilde ], symbols[Group2]= [ backslash, bar, notsign, notsign ], symbols[Group3]= [ grave, asciitilde ] }; key { [ Shift_L ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ backslash, bar ], symbols[Group2]= [ dead_tilde, dead_circumflex, dead_grave, dead_breve ], symbols[Group3]= [ backslash, bar ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ z, Z ], symbols[Group2]= [ z, Z, guillemotleft, less ], symbols[Group3]= [ z, Z ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ x, X ], symbols[Group2]= [ x, X, guillemotright, greater ], symbols[Group3]= [ x, X ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ c, C ], symbols[Group2]= [ c, C, cent, copyright ], symbols[Group3]= [ c, C ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ v, V ], symbols[Group2]= [ v, V, leftdoublequotemark, leftsinglequotemark ], symbols[Group3]= [ v, V ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ b, B ], symbols[Group2]= [ b, B, rightdoublequotemark, rightsinglequotemark ], symbols[Group3]= [ b, B ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_ALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ n, N ], symbols[Group2]= [ n, N, n, N ], symbols[Group3]= [ n, N ] }; key { type[group1]= "ALPHABETIC", type[group2]= "FOUR_LEVEL_SEMIALPHABETIC", type[group3]= "ALPHABETIC", symbols[Group1]= [ m, M ], symbols[Group2]= [ m, M, mu, masculine ], symbols[Group3]= [ m, M ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ comma, less ], symbols[Group2]= [ comma, semicolon, horizconnector, multiply ], symbols[Group3]= [ comma, less ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ period, greater ], symbols[Group2]= [ period, colon, periodcentered, division ], symbols[Group3]= [ period, greater ] }; key { type[group2]= "FOUR_LEVEL", symbols[Group1]= [ slash, question ], symbols[Group2]= [ minus, underscore, dead_belowdot, dead_abovedot ], symbols[Group3]= [ slash, question ] }; key { [ Shift_R ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ] }; key { [ Alt_L, Meta_L ] }; key { [ space ] }; key { [ Caps_Lock, ISO_Next_Group ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ] }; key { [ Num_Lock ] }; key { [ Scroll_Lock ] }; key { [ KP_Home, KP_7 ] }; key { [ KP_Up, KP_8 ] }; key { [ KP_Prior, KP_9 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ] }; key { [ KP_Left, KP_4 ] }; key { [ KP_Begin, KP_5 ] }; key { [ KP_Right, KP_6 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ] }; key { [ KP_End, KP_1 ] }; key { [ KP_Down, KP_2 ] }; key { [ KP_Next, KP_3 ] }; key { [ KP_Insert, KP_0 ] }; key { [ KP_Delete, KP_Decimal ] }; key { type= "ONE_LEVEL", symbols[Group1]= [ ISO_Level3_Shift ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ less, greater, bar, brokenbar ], symbols[Group2]= [ less, greater, backslash, backslash ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ] }; key { [ Katakana ] }; key { [ Hiragana ] }; key { [ Henkan_Mode ] }; key { [ Hiragana_Katakana ] }; key { [ Muhenkan ] }; key { [ KP_Enter ] }; key { [ Control_R ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ] }; key { type= "PC_ALT_LEVEL2", symbols[Group1]= [ Print, Sys_Req ] }; key { type[group1]= "TWO_LEVEL", type[group2]= "ONE_LEVEL", symbols[Group1]= [ Multi_key, Multi_key ], symbols[Group2]= [ ISO_Level3_Shift ] }; key { [ Linefeed ] }; key { [ Home ] }; key { [ Up ] }; key { [ Prior ] }; key { [ Left ] }; key { [ Right ] }; key { [ End ] }; key { [ Down ] }; key { [ Next ] }; key { [ Insert ] }; key { [ Delete ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86PowerOff ] }; key { [ KP_Equal ] }; key { [ plusminus ] }; key { type= "PC_CONTROL_LEVEL2", symbols[Group1]= [ Pause, Break ] }; key { [ XF86LaunchA ] }; key { [ KP_Decimal, KP_Decimal ] }; key { [ Hangul ] }; key { [ Hangul_Hanja ] }; key { [ Super_L ] }; key { [ Super_R ] }; key { [ Menu ] }; key { [ Cancel ] }; key { [ Redo ] }; key { [ SunProps ] }; key { [ Undo ] }; key { [ SunFront ] }; key { [ XF86Copy ] }; key { [ XF86Open ] }; key { [ XF86Paste ] }; key { [ Find ] }; key { [ XF86Cut ] }; key { [ Help ] }; key { [ XF86MenuKB ] }; key { [ XF86Calculator ] }; key { [ XF86Sleep ] }; key { [ XF86WakeUp ] }; key { [ XF86Explorer ] }; key { [ XF86Send ] }; key { [ XF86Xfer ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86WWW ] }; key { [ XF86DOS ] }; key { [ XF86ScreenSaver ] }; key { [ XF86RotateWindows ] }; key { [ XF86TaskPane ] }; key { [ XF86Mail ] }; key { [ XF86Favorites ] }; key { [ XF86MyComputer ] }; key { [ XF86Back ] }; key { [ XF86Forward ] }; key { [ XF86Eject ] }; key { [ XF86Eject, XF86Eject ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioStop, XF86Eject ] }; key { [ XF86AudioRecord ] }; key { [ XF86AudioRewind ] }; key { [ XF86Phone ] }; key { [ XF86Tools ] }; key { [ XF86HomePage ] }; key { [ XF86Reload ] }; key { [ XF86Close ] }; key { [ XF86ScrollUp ] }; key { [ XF86ScrollDown ] }; key { [ parenleft ] }; key { [ parenright ] }; key { [ XF86New ] }; key { [ Redo ] }; key { [ XF86Tools ] }; key { [ XF86Launch5 ] }; key { [ XF86Launch6 ] }; key { [ XF86Launch7 ] }; key { [ XF86Launch8 ] }; key { [ XF86Launch9 ] }; key { [ XF86AudioMicMute ] }; key { [ XF86TouchpadToggle ] }; key { [ XF86TouchpadOn ] }; key { [ XF86TouchpadOff ] }; key { [ Mode_switch ] }; key { [ NoSymbol, Alt_L ] }; key { [ NoSymbol, Meta_L ] }; key { [ NoSymbol, Super_L ] }; key { [ NoSymbol, Hyper_L ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioPause ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch4 ] }; key { [ XF86LaunchB ] }; key { [ XF86Suspend ] }; key { [ XF86Close ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioForward ] }; key { [ Print ] }; key { [ XF86WebCam ] }; key { [ XF86Mail ] }; key { [ XF86Messenger ] }; key { [ XF86Search ] }; key { [ XF86Go ] }; key { [ XF86Finance ] }; key { [ XF86Game ] }; key { [ XF86Shop ] }; key { [ Cancel ] }; key { [ XF86MonBrightnessDown ] }; key { [ XF86MonBrightnessUp ] }; key { [ XF86AudioMedia ] }; key { [ XF86Display ] }; key { [ XF86KbdLightOnOff ] }; key { [ XF86KbdBrightnessDown ] }; key { [ XF86KbdBrightnessUp ] }; key { [ XF86Send ] }; key { [ XF86Reply ] }; key { [ XF86MailForward ] }; key { [ XF86Save ] }; key { [ XF86Documents ] }; key { [ XF86Battery ] }; key { [ XF86Bluetooth ] }; key { [ XF86WLAN ] }; modifier_map Shift { , }; modifier_map Lock { }; modifier_map Control { , }; modifier_map Mod1 { , }; modifier_map Mod2 { }; modifier_map Mod4 { , , , }; modifier_map Mod5 { , }; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7086468 libxkbcommon-0.10.0/test/data/keymaps/no-aliases.xkb0000644000175000017500000012601100000000000021742 0ustar00ranran00000000000000xkb_keymap { xkb_keycodes "evdev_aliases(qwerty)" { minimum = 8; maximum = 255; = 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; = 65; = 66; = 67; = 68; = 69; = 70; = 71; = 72; = 73; = 74; = 75; = 76; = 77; = 78; = 79; = 80; = 81; = 82; = 83; = 84; = 85; = 86; = 87; = 88; = 89; = 90; = 91; = 92; = 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; indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; indicator 3 = "Scroll Lock"; indicator 4 = "Compose"; indicator 5 = "Kana"; indicator 6 = "Sleep"; indicator 7 = "Suspend"; indicator 8 = "Mute"; indicator 9 = "Misc"; indicator 10 = "Mail"; indicator 11 = "Charging"; indicator 12 = "Shift Lock"; indicator 13 = "Group 2"; indicator 14 = "Mouse Keys"; }; xkb_types "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; type "ONE_LEVEL" { modifiers= none; level_name[Level1]= "Any"; }; type "TWO_LEVEL" { modifiers= Shift; map[Shift]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; }; type "ALPHABETIC" { modifiers= Shift+Lock; map[Shift]= Level2; map[Lock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Caps"; }; type "SHIFT+ALT" { modifiers= Shift+Alt; map[Shift+Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift+Alt"; }; type "PC_CONTROL_LEVEL2" { modifiers= Control; map[Control]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Control"; }; type "PC_LCONTROL_LEVEL2" { modifiers= LControl; map[LControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LControl"; }; type "PC_RCONTROL_LEVEL2" { modifiers= RControl; map[RControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RControl"; }; type "PC_ALT_LEVEL2" { modifiers= Alt; map[Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Alt"; }; type "PC_LALT_LEVEL2" { modifiers= LAlt; map[LAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LAlt"; }; type "PC_RALT_LEVEL2" { modifiers= RAlt; map[RAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RAlt"; }; type "CTRL+ALT" { modifiers= Shift+Control+Alt+LevelThree; map[Shift]= Level2; preserve[Shift]= Shift; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; preserve[Shift+LevelThree]= Shift; map[Control+Alt]= Level5; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Ctrl+Alt"; }; type "LOCAL_EIGHT_LEVEL" { modifiers= Shift+Lock+Control+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Control]= Level5; map[Shift+Lock+Control]= Level5; map[Shift+Control]= Level6; map[Lock+Control]= Level6; map[Control+LevelThree]= Level7; map[Shift+Lock+Control+LevelThree]= Level7; map[Shift+Control+LevelThree]= Level8; map[Lock+Control+LevelThree]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; level_name[Level4]= "Shift Level3"; level_name[Level5]= "Ctrl"; level_name[Level6]= "Shift Ctrl"; level_name[Level7]= "Level3 Ctrl"; level_name[Level8]= "Shift Level3 Ctrl"; }; type "THREE_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; }; type "EIGHT_LEVEL" { modifiers= Shift+LevelThree+LevelFive; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level8; map[Shift+Lock+LevelThree+LevelFive]= Level7; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; preserve[Lock+LevelFive]= Lock; map[Shift+Lock+LevelFive]= Level6; preserve[Shift+Lock+LevelFive]= Lock; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level7; preserve[Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelThree+LevelFive]= Level8; preserve[Shift+Lock+LevelThree+LevelFive]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "FOUR_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_MIXED_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[NumLock]= Level2; map[Shift]= Level2; map[LevelThree]= Level3; map[NumLock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_X" { modifiers= Shift+Control+Alt+LevelThree; map[LevelThree]= Level2; map[Shift+LevelThree]= Level3; map[Control+Alt]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Alt Base"; level_name[Level3]= "Shift Alt"; level_name[Level4]= "Ctrl+Alt"; }; type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level4; preserve[Lock]= Lock; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "AltGr Base"; level_name[Level4]= "Shift AltGr"; }; type "FOUR_LEVEL_PLUS_LOCK" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock]= Level5; map[Shift+Lock]= Level2; map[Lock+LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Lock"; }; type "KEYPAD" { modifiers= Shift+NumLock; map[Shift]= Level2; map[NumLock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Number"; }; type "FOUR_LEVEL_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift]= Level2; map[NumLock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[NumLock+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Alt Number"; }; }; xkb_compatibility "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; interpret.useModMapMods= AnyLevel; interpret.repeat= False; interpret ISO_Level2_Latch+Exactly(Shift) { useModMapMods=level1; action= LatchMods(modifiers=Shift,clearLocks,latchToLock); }; interpret Shift_Lock+AnyOf(Shift+Lock) { action= LockMods(modifiers=Shift); }; interpret Num_Lock+AnyOf(all) { virtualModifier= NumLock; action= LockMods(modifiers=NumLock); }; interpret ISO_Level3_Shift+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LockMods(modifiers=LevelThree); }; interpret Alt_L+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Alt_R+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_L+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_R+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_L+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_R+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_L+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_R+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Scroll_Lock+AnyOf(all) { virtualModifier= ScrollLock; action= LockMods(modifiers=modMapMods); }; interpret ISO_Level5_Shift+AnyOf(all) { virtualModifier= LevelFive; useModMapMods=level1; action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOf(all) { virtualModifier= LevelFive; action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOf(all) { virtualModifier= LevelFive; action= LockMods(modifiers=LevelFive); }; interpret Mode_switch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= SetGroup(group=+1); }; interpret ISO_Level3_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelThree); }; interpret ISO_Group_Latch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LatchGroup(group=2); }; interpret ISO_Next_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=+1); }; interpret ISO_Prev_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=-1); }; interpret ISO_First_Group+AnyOfOrNone(all) { action= LockGroup(group=1); }; interpret ISO_Last_Group+AnyOfOrNone(all) { action= LockGroup(group=2); }; interpret KP_1+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_End+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_2+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_Down+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_3+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_Next+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_4+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_Left+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_6+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_Right+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_7+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_Home+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_8+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_Up+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_9+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_Prior+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_5+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_Begin+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_F2+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_Divide+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_F3+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_Multiply+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_F4+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Subtract+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Separator+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_Add+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_0+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Insert+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Decimal+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret KP_Delete+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret F25+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret F26+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret F27+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret F29+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret F31+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret F33+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret F35+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret Pointer_Button_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default); }; interpret Pointer_Button1+AnyOfOrNone(all) { action= PtrBtn(button=1); }; interpret Pointer_Button2+AnyOfOrNone(all) { action= PtrBtn(button=2); }; interpret Pointer_Button3+AnyOfOrNone(all) { action= PtrBtn(button=3); }; interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default,count=2); }; interpret Pointer_DblClick1+AnyOfOrNone(all) { action= PtrBtn(button=1,count=2); }; interpret Pointer_DblClick2+AnyOfOrNone(all) { action= PtrBtn(button=2,count=2); }; interpret Pointer_DblClick3+AnyOfOrNone(all) { action= PtrBtn(button=3,count=2); }; interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { action= LockPtrBtn(button=default); }; interpret Pointer_Drag1+AnyOfOrNone(all) { action= LockPtrBtn(button=1); }; interpret Pointer_Drag2+AnyOfOrNone(all) { action= LockPtrBtn(button=2); }; interpret Pointer_Drag3+AnyOfOrNone(all) { action= LockPtrBtn(button=3); }; interpret Pointer_EnableKeys+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret Pointer_Accelerate+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=+1); }; interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=-1); }; interpret AccessX_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXKeys); }; interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXFeedback); }; interpret RepeatKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=RepeatKeys); }; interpret SlowKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=SlowKeys); }; interpret BounceKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=BounceKeys); }; interpret StickyKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=StickyKeys); }; interpret MouseKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Overlay1_Enable+AnyOfOrNone(all) { action= LockControls(controls=none); }; interpret Overlay2_Enable+AnyOfOrNone(all) { action= LockControls(controls=none); }; interpret AudibleBell_Enable+AnyOfOrNone(all) { action= LockControls(controls=AudibleBell); }; interpret Terminate_Server+AnyOfOrNone(all) { action= Terminate(); }; interpret Alt_L+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Alt_R+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Meta_L+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Meta_R+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Super_L+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Super_R+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Hyper_L+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Hyper_R+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Shift_L+AnyOfOrNone(all) { action= SetMods(modifiers=Shift,clearLocks); }; interpret XF86Switch_VT_1+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=1,!same); }; interpret XF86Switch_VT_2+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=2,!same); }; interpret XF86Switch_VT_3+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=3,!same); }; interpret XF86Switch_VT_4+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=4,!same); }; interpret XF86Switch_VT_5+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=5,!same); }; interpret XF86Switch_VT_6+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=6,!same); }; interpret XF86Switch_VT_7+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=7,!same); }; interpret XF86Switch_VT_8+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=8,!same); }; interpret XF86Switch_VT_9+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=9,!same); }; interpret XF86Switch_VT_10+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=10,!same); }; interpret XF86Switch_VT_11+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=11,!same); }; interpret XF86Switch_VT_12+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=12,!same); }; interpret XF86LogGrabInfo+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00); }; interpret XF86LogWindowTree+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00); }; interpret XF86Next_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret XF86Prev_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret ISO_Level5_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelFive); }; interpret Caps_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=Lock); }; interpret Any+Exactly(Lock) { action= LockMods(modifiers=Lock); }; interpret Any+AnyOf(all) { action= SetMods(modifiers=modMapMods,clearLocks); }; indicator "Caps Lock" { whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { whichModState= locked; modifiers= NumLock; }; indicator "Scroll Lock" { whichModState= locked; modifiers= ScrollLock; }; indicator "Shift Lock" { whichModState= locked; modifiers= Shift; }; indicator "Group 2" { groups= 0xfe; }; indicator "Mouse Keys" { controls= MouseKeys; }; }; xkb_symbols "pc_us_inet(evdev)" { name[group1]="English (US)"; key { [ Escape ] }; key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, numbersign ] }; key { [ 4, dollar ] }; key { [ 5, percent ] }; key { [ { H, E, L, L, O }, asciicircum ] }; key { [ { Y, E, S, space, T, H, I, S, space, I, S, space, D, O, G }, ampersand ] }; key { [ 8, asterisk ] }; key { [ 9, parenleft ] }; key { [ 0, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ BackSpace, BackSpace ] }; key { [ Tab, ISO_Left_Tab ] }; key { [ q, Q ] }; key { [ w, W ] }; key { [ e, E ] }; key { [ r, R ] }; key { [ t, T ] }; key { [ y, Y ] }; key { [ u, U ] }; key { [ i, I ] }; key { [ o, O ] }; key { [ p, P ] }; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; key { [ Return ] }; key { [ Control_L ] }; key { [ a, A ] }; key { [ s, S ] }; key { [ d, D ] }; key { [ f, F ] }; key { [ g, G ] }; key { [ h, H ] }; key { [ j, J ] }; key { [ k, K ] }; key { [ l, L ] }; key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl ] }; key { [ grave, asciitilde ] }; key { [ Shift_L ] }; key { [ backslash, bar ] }; key { [ z, Z ] }; key { [ x, X ] }; key { [ c, C ] }; key { [ v, V ] }; key { [ b, B ] }; key { [ n, N ] }; key { [ m, M ] }; key { [ comma, less ] }; key { [ period, greater ] }; key { [ slash, question ] }; key { [ Shift_R ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ] }; key { [ Alt_L, Meta_L ] }; key { [ space ] }; key { [ Caps_Lock ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ] }; key { [ Num_Lock ] }; key { [ Scroll_Lock ] }; key { [ KP_Home, KP_7 ] }; key { [ KP_Up, KP_8 ] }; key { [ KP_Prior, KP_9 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ] }; key { [ KP_Left, KP_4 ] }; key { [ KP_Begin, KP_5 ] }; key { [ KP_Right, KP_6 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ] }; key { [ KP_End, KP_1 ] }; key { [ KP_Down, KP_2 ] }; key { [ KP_Next, KP_3 ] }; key { [ KP_Insert, KP_0 ] }; key { [ KP_Delete, KP_Decimal ] }; key { [ ISO_Level3_Shift ] }; key { [ less, greater, bar, brokenbar ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ] }; key { [ Katakana ] }; key { [ Hiragana ] }; key { [ Henkan_Mode ] }; key { [ Hiragana_Katakana ] }; key { [ Muhenkan ] }; key { [ KP_Enter ] }; key { [ Control_R ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ] }; key { type= "PC_ALT_LEVEL2", symbols[Group1]= [ Print, Sys_Req ] }; key { type= "TWO_LEVEL", symbols[Group1]= [ Alt_R, Meta_R ] }; key { [ Linefeed ] }; key { [ Home ] }; key { [ Up ] }; key { [ Prior ] }; key { [ Left ] }; key { [ Right ] }; key { [ End ] }; key { [ Down ] }; key { [ Next ] }; key { [ Insert ] }; key { [ Delete ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86PowerOff ] }; key { [ KP_Equal ] }; key { [ plusminus ] }; key { type= "PC_CONTROL_LEVEL2", symbols[Group1]= [ Pause, Break ] }; key { [ XF86LaunchA ] }; key { [ KP_Decimal, KP_Decimal ] }; key { [ Hangul ] }; key { [ Hangul_Hanja ] }; key { [ Super_L ] }; key { [ Super_R ] }; key { [ Menu ] }; key { [ Cancel ] }; key { [ Redo ] }; key { [ SunProps ] }; key { [ Undo ] }; key { [ SunFront ] }; key { [ XF86Copy ] }; key { [ XF86Open ] }; key { [ XF86Paste ] }; key { [ Find ] }; key { [ XF86Cut ] }; key { [ Help ] }; key { [ XF86MenuKB ] }; key { [ XF86Calculator ] }; key { [ XF86Sleep ] }; key { [ XF86WakeUp ] }; key { [ XF86Explorer ] }; key { [ XF86Send ] }; key { [ XF86Xfer ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86WWW ] }; key { [ XF86DOS ] }; key { [ XF86ScreenSaver ] }; key { [ XF86RotateWindows ] }; key { [ XF86Mail ] }; key { [ XF86Favorites ] }; key { [ XF86MyComputer ] }; key { [ XF86Back ] }; key { [ XF86Forward ] }; key { [ XF86Eject ] }; key { [ XF86Eject, XF86Eject ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioStop, XF86Eject ] }; key { [ XF86AudioRecord ] }; key { [ XF86AudioRewind ] }; key { [ XF86Phone ] }; key { [ XF86Tools ] }; key { [ XF86HomePage ] }; key { [ XF86Reload ] }; key { [ XF86Close ] }; key { [ XF86ScrollUp ] }; key { [ XF86ScrollDown ] }; key { [ parenleft ] }; key { [ parenright ] }; key { [ XF86New ] }; key { [ Redo ] }; key { [ XF86Tools ] }; key { [ XF86Launch5 ] }; key { [ XF86Launch6 ] }; key { [ XF86Launch7 ] }; key { [ XF86Launch8 ] }; key { [ XF86Launch9 ] }; key { [ XF86AudioMicMute ] }; key { [ XF86TouchpadToggle ] }; key { [ XF86TouchpadOn ] }; key { [ XF86TouchpadOff ] }; key { [ Mode_switch ] }; key { [ NoSymbol, Alt_L ] }; key { [ NoSymbol, Meta_L ] }; key { [ NoSymbol, Super_L ] }; key { [ NoSymbol, Hyper_L ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioPause ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch4 ] }; key { [ XF86LaunchB ] }; key { [ XF86Suspend ] }; key { [ XF86Close ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioForward ] }; key { [ Print ] }; key { [ XF86WebCam ] }; key { [ XF86Mail ] }; key { [ XF86Messenger ] }; key { [ XF86Search ] }; key { [ XF86Go ] }; key { [ XF86Finance ] }; key { [ XF86Game ] }; key { [ XF86Shop ] }; key { [ Cancel ] }; key { [ XF86MonBrightnessDown ] }; key { [ XF86MonBrightnessUp ] }; key { [ XF86AudioMedia ] }; key { [ XF86Display ] }; key { [ XF86KbdLightOnOff ] }; key { [ XF86KbdBrightnessDown ] }; key { [ XF86KbdBrightnessUp ] }; key { [ XF86Send ] }; key { [ XF86Reply ] }; key { [ XF86MailForward ] }; key { [ XF86Save ] }; key { [ XF86Documents ] }; key { [ XF86Battery ] }; key { [ XF86Bluetooth ] }; key { [ XF86WLAN ] }; modifier_map Control { }; modifier_map Shift { }; modifier_map Shift { }; modifier_map Mod1 { }; modifier_map Lock { }; modifier_map Mod2 { }; modifier_map Mod5 { }; modifier_map Control { }; modifier_map Mod1 { }; modifier_map Mod4 { }; modifier_map Mod4 { }; modifier_map Mod5 { }; modifier_map Mod1 { }; modifier_map Mod4 { }; modifier_map Mod4 { }; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7086468 libxkbcommon-0.10.0/test/data/keymaps/no-types.xkb0000644000175000017500000006647600000000000021507 0ustar00ranran00000000000000xkb_keymap { xkb_keycodes { minimum = 8; maximum = 255; = 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; = 65; = 66; = 67; = 68; = 69; = 70; = 71; = 72; = 73; = 74; = 75; = 76; = 77; = 78; = 79; = 80; = 81; = 82; = 83; = 84; = 85; = 86; = 87; = 88; = 89; = 90; = 91; = 92; = 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; indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; indicator 3 = "Scroll Lock"; indicator 4 = "Compose"; indicator 5 = "Kana"; indicator 6 = "Sleep"; indicator 7 = "Suspend"; indicator 8 = "Mute"; indicator 9 = "Misc"; indicator 10 = "Mail"; indicator 11 = "Charging"; indicator 12 = "Shift Lock"; indicator 13 = "Group 2"; indicator 14 = "Mouse Keys"; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; xkb_types { }; xkb_compatibility { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; interpret.useModMapMods= AnyLevel; interpret.repeat= false; interpret.locking= false; interpret ISO_Level2_Latch+Exactly(Shift) { useModMapMods=level1; action= LatchMods(modifiers=Shift,clearLocks,latchToLock); }; interpret Shift_Lock+AnyOf(Shift+Lock) { action= LockMods(modifiers=Shift); }; interpret Num_Lock+AnyOf(all) { virtualModifier= NumLock; action= LockMods(modifiers=NumLock); }; interpret ISO_Lock+AnyOf(all) { action= NoAction(); }; interpret ISO_Level3_Shift+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LockMods(modifiers=LevelThree); }; interpret Alt_L+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Alt_R+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_L+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_R+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_L+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_R+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_L+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_R+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Scroll_Lock+AnyOf(all) { virtualModifier= ScrollLock; action= LockMods(modifiers=modMapMods); }; interpret ISO_Level5_Shift+AnyOf(all) { virtualModifier= LevelFive; useModMapMods=level1; action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOf(all) { virtualModifier= LevelFive; action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOf(all) { virtualModifier= LevelFive; action= LockMods(modifiers=LevelFive); }; interpret Mode_switch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= SetGroup(group=+1); }; interpret ISO_Level3_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelThree); }; interpret ISO_Group_Latch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LatchGroup(group=2); }; interpret ISO_Next_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=+1); }; interpret ISO_Prev_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=-1); }; interpret ISO_First_Group+AnyOfOrNone(all) { action= LockGroup(group=1); }; interpret ISO_Last_Group+AnyOfOrNone(all) { action= LockGroup(group=2); }; interpret KP_1+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=-1,y=+1); }; interpret KP_End+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=-1,y=+1); }; interpret KP_2+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+0,y=+1); }; interpret KP_Down+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+0,y=+1); }; interpret KP_3+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+1,y=+1); }; interpret KP_Next+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+1,y=+1); }; interpret KP_4+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=-1,y=+0); }; interpret KP_Left+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=-1,y=+0); }; interpret KP_6+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+1,y=+0); }; interpret KP_Right+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+1,y=+0); }; interpret KP_7+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=-1,y=-1); }; interpret KP_Home+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=-1,y=-1); }; interpret KP_8+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+0,y=-1); }; interpret KP_Up+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+0,y=-1); }; interpret KP_9+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+1,y=-1); }; interpret KP_Prior+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+1,y=-1); }; interpret KP_5+AnyOfOrNone(all) { repeat= true; action= PtrBtn(button=default); }; interpret KP_Begin+AnyOfOrNone(all) { repeat= true; action= PtrBtn(button=default); }; interpret KP_F2+AnyOfOrNone(all) { repeat= true; action= SetPtrDflt(affect=button,button=1); }; interpret KP_Divide+AnyOfOrNone(all) { repeat= true; action= SetPtrDflt(affect=button,button=1); }; interpret KP_F3+AnyOfOrNone(all) { repeat= true; action= SetPtrDflt(affect=button,button=2); }; interpret KP_Multiply+AnyOfOrNone(all) { repeat= true; action= SetPtrDflt(affect=button,button=2); }; interpret KP_F4+AnyOfOrNone(all) { repeat= true; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Subtract+AnyOfOrNone(all) { repeat= true; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Separator+AnyOfOrNone(all) { repeat= true; action= PtrBtn(button=default,count=2); }; interpret KP_Add+AnyOfOrNone(all) { repeat= true; action= PtrBtn(button=default,count=2); }; interpret KP_0+AnyOfOrNone(all) { repeat= true; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Insert+AnyOfOrNone(all) { repeat= true; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Decimal+AnyOfOrNone(all) { repeat= true; action= LockPtrBtn(button=default,affect=unlock); }; interpret KP_Delete+AnyOfOrNone(all) { repeat= true; action= LockPtrBtn(button=default,affect=unlock); }; interpret F25+AnyOfOrNone(all) { repeat= true; action= SetPtrDflt(affect=button,button=1); }; interpret F26+AnyOfOrNone(all) { repeat= true; action= SetPtrDflt(affect=button,button=2); }; interpret F27+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=-1,y=-1); }; interpret F29+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+1,y=-1); }; interpret F31+AnyOfOrNone(all) { repeat= true; action= PtrBtn(button=default); }; interpret F33+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=-1,y=+1); }; interpret F35+AnyOfOrNone(all) { repeat= true; action= MovePtr(x=+1,y=+1); }; interpret Pointer_Button_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default); }; interpret Pointer_Button1+AnyOfOrNone(all) { action= PtrBtn(button=1); }; interpret Pointer_Button2+AnyOfOrNone(all) { action= PtrBtn(button=2); }; interpret Pointer_Button3+AnyOfOrNone(all) { action= PtrBtn(button=3); }; interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default,count=2); }; interpret Pointer_DblClick1+AnyOfOrNone(all) { action= PtrBtn(button=1,count=2); }; interpret Pointer_DblClick2+AnyOfOrNone(all) { action= PtrBtn(button=2,count=2); }; interpret Pointer_DblClick3+AnyOfOrNone(all) { action= PtrBtn(button=3,count=2); }; interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { action= LockPtrBtn(button=default,affect=both); }; interpret Pointer_Drag1+AnyOfOrNone(all) { action= LockPtrBtn(button=1,affect=both); }; interpret Pointer_Drag2+AnyOfOrNone(all) { action= LockPtrBtn(button=2,affect=both); }; interpret Pointer_Drag3+AnyOfOrNone(all) { action= LockPtrBtn(button=3,affect=both); }; interpret Pointer_EnableKeys+AnyOfOrNone(all) { action= LockControls(controls=mouseKeys); }; interpret Pointer_Accelerate+AnyOfOrNone(all) { action= LockControls(controls=mouseKeysAccel); }; interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=+1); }; interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=-1); }; interpret AccessX_Enable+AnyOfOrNone(all) { action= LockControls(controls=accessXKeys); }; interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { action= LockControls(controls=accessXFeedback); }; interpret RepeatKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=repeatKeys); }; interpret SlowKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=slowKeys); }; interpret BounceKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=bounceKeys); }; interpret StickyKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=stickyKeys); }; interpret MouseKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=mouseKeys); }; interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { action= LockControls(controls=mouseKeysAccel); }; interpret Overlay1_Enable+AnyOfOrNone(all) { action= LockControls(controls=none); }; interpret Overlay2_Enable+AnyOfOrNone(all) { action= LockControls(controls=none); }; interpret AudibleBell_Enable+AnyOfOrNone(all) { action= LockControls(controls=audibleBell); }; interpret Terminate_Server+AnyOfOrNone(all) { action= Terminate(); }; interpret Alt_L+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Alt_R+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Meta_L+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Meta_R+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Super_L+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Super_R+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Hyper_L+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Hyper_R+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Shift_L+AnyOfOrNone(all) { action= SetMods(modifiers=Shift,clearLocks); }; interpret XF86Switch_VT_1+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=1,!same); }; interpret XF86Switch_VT_2+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=2,!same); }; interpret XF86Switch_VT_3+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=3,!same); }; interpret XF86Switch_VT_4+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=4,!same); }; interpret XF86Switch_VT_5+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=5,!same); }; interpret XF86Switch_VT_6+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=6,!same); }; interpret XF86Switch_VT_7+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=7,!same); }; interpret XF86Switch_VT_8+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=8,!same); }; interpret XF86Switch_VT_9+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=9,!same); }; interpret XF86Switch_VT_10+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=10,!same); }; interpret XF86Switch_VT_11+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=11,!same); }; interpret XF86Switch_VT_12+AnyOfOrNone(all) { repeat= true; action= SwitchScreen(screen=12,!same); }; interpret XF86LogGrabInfo+AnyOfOrNone(all) { repeat= true; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00); }; interpret XF86LogWindowTree+AnyOfOrNone(all) { repeat= true; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00); }; interpret XF86Next_VMode+AnyOfOrNone(all) { repeat= true; action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret XF86Prev_VMode+AnyOfOrNone(all) { repeat= true; action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret ISO_Level5_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelFive); }; interpret Caps_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=Lock); }; interpret Any+Exactly(Lock) { action= LockMods(modifiers=Lock); }; interpret Any+AnyOf(all) { action= SetMods(modifiers=modMapMods,clearLocks); }; group 2 = AltGr; group 3 = AltGr; group 4 = AltGr; indicator "Caps Lock" { whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { whichModState= locked; modifiers= NumLock; }; indicator "Scroll Lock" { whichModState= locked; modifiers= ScrollLock; }; indicator "Shift Lock" { whichModState= locked; modifiers= Shift; }; indicator "Group 2" { groups= 0xfe; }; indicator "Mouse Keys" { controls= mouseKeys; }; }; xkb_symbols { name[group1]="English (US)"; key { [ Escape ] }; key { [ 1 ] }; key { [ 2 ] }; key { [ 3 ] }; key { [ 4 ] }; key { [ 5 ] }; key { [ 6 ] }; key { [ 7 ] }; key { [ 8 ] }; key { [ 9 ] }; key { [ 0 ] }; key { [ minus ] }; key { [ equal ] }; key { [ BackSpace ] }; key { [ Tab ] }; key { [ q ] }; key { [ w ] }; key { [ e ] }; key { [ r ] }; key { [ t ] }; key { [ y ] }; key { [ u ] }; key { [ i ] }; key { [ o ] }; key { [ p ] }; key { [ bracketleft ] }; key { [ bracketright ] }; key { [ Return ] }; key { [ Control_L ] }; key { [ a ] }; key { [ s ] }; key { [ d ] }; key { [ f ] }; key { [ g ] }; key { [ h ] }; key { [ j ] }; key { [ k ] }; key { [ l ] }; key { [ semicolon ] }; key { [ apostrophe ] }; key { [ grave ] }; key { [ Shift_L ] }; key { [ NoSymbol ] }; key { [ z ] }; key { [ x ] }; key { [ c ] }; key { [ v ] }; key { [ b ] }; key { [ n ] }; key { [ m ] }; key { [ comma ] }; key { [ period ] }; key { [ slash ] }; key { [ Shift_R ] }; key { [ KP_Multiply ] }; key { [ Alt_L ] }; key { [ space ] }; key { [ Caps_Lock ] }; key { [ F1 ] }; key { [ F2 ] }; key { [ F3 ] }; key { [ F4 ] }; key { [ F5 ] }; key { [ F6 ] }; key { [ F7 ] }; key { [ F8 ] }; key { [ F9 ] }; key { [ F10 ] }; key { [ Num_Lock ] }; key { [ Scroll_Lock ] }; key { [ KP_Home ] }; key { [ KP_Up ] }; key { [ KP_Prior ] }; key { [ KP_Subtract ] }; key { [ KP_Left ] }; key { [ KP_Begin ] }; key { [ KP_Right ] }; key { [ KP_Add ] }; key { [ KP_End ] }; key { [ KP_Down ] }; key { [ KP_Next ] }; key { [ KP_Insert ] }; key { [ KP_Delete ] }; key { [ ISO_Level3_Shift ] }; key { [ less ] }; key { [ F11 ] }; key { [ F12 ] }; key { [ Katakana ] }; key { [ Hiragana ] }; key { [ Henkan_Mode ] }; key { [ Hiragana_Katakana ] }; key { [ Muhenkan ] }; key { [ KP_Enter ] }; key { [ Control_R ] }; key { [ KP_Divide ] }; key { [ Print ] }; key { [ Alt_R ] }; key { [ Linefeed ] }; key { [ Home ] }; key { [ Up ] }; key { [ Prior ] }; key { [ Left ] }; key { [ Right ] }; key { [ End ] }; key { [ Down ] }; key { [ Next ] }; key { [ Insert ] }; key { [ Delete ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86PowerOff ] }; key { [ KP_Equal ] }; key { [ plusminus ] }; key { [ Pause ] }; key { [ XF86LaunchA ] }; key { [ KP_Decimal] }; key { [ Hangul ] }; key { [ Hangul_Hanja ] }; key { [ Super_L ] }; key { [ Super_R ] }; key { [ Menu ] }; key { [ Cancel ] }; key { [ Redo ] }; key { [ SunProps ] }; key { [ Undo ] }; key { [ SunFront ] }; key { [ XF86Copy ] }; key { [ SunOpen ] }; key { [ XF86Paste ] }; key { [ Find ] }; key { [ XF86Cut ] }; key { [ Help ] }; key { [ XF86MenuKB ] }; key { [ XF86Calculator ] }; key { [ XF86Sleep ] }; key { [ XF86WakeUp ] }; key { [ XF86Explorer ] }; key { [ XF86Send ] }; key { [ XF86Xfer ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86WWW ] }; key { [ XF86DOS ] }; key { [ XF86ScreenSaver ] }; key { [ XF86RotateWindows ] }; key { [ XF86Mail ] }; key { [ XF86Favorites ] }; key { [ XF86MyComputer ] }; key { [ XF86Back ] }; key { [ XF86Forward ] }; key { [ XF86Eject ] }; key { [ XF86Eject ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioStop ] }; key { [ XF86AudioRecord ] }; key { [ XF86AudioRewind ] }; key { [ XF86Phone ] }; key { [ XF86Tools ] }; key { [ XF86HomePage ] }; key { [ XF86Reload ] }; key { [ XF86Close ] }; key { [ XF86ScrollUp ] }; key { [ XF86ScrollDown ] }; key { [ parenleft ] }; key { [ parenright ] }; key { [ XF86New ] }; key { [ Redo ] }; key { [ XF86Tools ] }; key { [ XF86Launch5 ] }; key { [ XF86Launch6 ] }; key { [ XF86Launch7 ] }; key { [ XF86Launch8 ] }; key { [ XF86Launch9 ] }; key { [ XF86TouchpadToggle ] }; key { [ XF86TouchpadOn ] }; key { [ XF86TouchpadOff ] }; key { [ Mode_switch ] }; key { [ NoSymbol ] }; key { [ NoSymbol ] }; key { [ NoSymbol ] }; key { [ NoSymbol ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioPause ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch4 ] }; key { [ XF86LaunchB ] }; key { [ XF86Suspend ] }; key { [ XF86Close ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioForward ] }; key { [ Print ] }; key { [ XF86WebCam ] }; key { [ XF86Mail ] }; key { [ XF86Messenger ] }; key { [ XF86Search ] }; key { [ XF86Go ] }; key { [ XF86Finance ] }; key { [ XF86Game ] }; key { [ XF86Shop ] }; key { [ Cancel ] }; key { [ XF86MonBrightnessDown ] }; key { [ XF86MonBrightnessUp ] }; key { [ XF86AudioMedia ] }; key { [ XF86Display ] }; key { [ XF86KbdLightOnOff ] }; key { [ XF86KbdBrightnessDown ] }; key { [ XF86KbdBrightnessUp ] }; key { [ XF86Send ] }; key { [ XF86Reply ] }; key { [ XF86MailForward ] }; key { [ XF86Save ] }; key { [ XF86Documents ] }; key { [ XF86Battery ] }; key { [ XF86Bluetooth ] }; key { [ XF86WLAN ] }; modifier_map Control { }; modifier_map Shift { }; modifier_map Shift { }; modifier_map Mod1 { }; modifier_map Lock { }; modifier_map Mod2 { }; modifier_map Mod5 { }; modifier_map Control { }; modifier_map Mod1 { }; modifier_map Mod4 { }; modifier_map Mod4 { }; modifier_map Mod5 { }; modifier_map Mod1 { }; modifier_map Mod4 { }; modifier_map Mod4 { }; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7086468 libxkbcommon-0.10.0/test/data/keymaps/quartz.xkb0000644000175000017500000010771200000000000021244 0ustar00ranran00000000000000xkb_keymap { xkb_keycodes "empty_aliases(qwerty)" { minimum = 8; maximum = 255; virtual indicator 1 = "Caps Lock"; virtual indicator 2 = "Num Lock"; virtual indicator 3 = "Shift Lock"; virtual indicator 4 = "Group 2"; virtual indicator 5 = "Mouse Keys"; virtual indicator 6 = "Scroll Lock"; }; xkb_types "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; type "ONE_LEVEL" { modifiers= none; level_name[Level1]= "Any"; }; type "TWO_LEVEL" { modifiers= Shift; map[Shift]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; }; type "ALPHABETIC" { modifiers= Shift+Lock; map[Shift]= Level2; map[Lock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Caps"; }; type "KEYPAD" { modifiers= Shift+NumLock; map[Shift]= Level2; map[NumLock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Number"; }; type "SHIFT+ALT" { modifiers= Shift+Alt; map[Shift+Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift+Alt"; }; type "PC_CONTROL_LEVEL2" { modifiers= Control; map[Control]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Control"; }; type "PC_LCONTROL_LEVEL2" { modifiers= LControl; map[LControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LControl"; }; type "PC_RCONTROL_LEVEL2" { modifiers= RControl; map[RControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RControl"; }; type "PC_ALT_LEVEL2" { modifiers= Alt; map[Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Alt"; }; type "PC_LALT_LEVEL2" { modifiers= LAlt; map[LAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LAlt"; }; type "PC_RALT_LEVEL2" { modifiers= RAlt; map[RAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RAlt"; }; type "CTRL+ALT" { modifiers= Control+Alt; map[Control+Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Ctrl+Alt"; }; type "LOCAL_EIGHT_LEVEL" { modifiers= Shift+Lock+Control+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Control]= Level5; map[Shift+Lock+Control]= Level5; map[Shift+Control]= Level6; map[Lock+Control]= Level6; map[Control+LevelThree]= Level7; map[Shift+Lock+Control+LevelThree]= Level7; map[Shift+Control+LevelThree]= Level8; map[Lock+Control+LevelThree]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; level_name[Level4]= "Shift Level3"; level_name[Level5]= "Ctrl"; level_name[Level6]= "Shift Ctrl"; level_name[Level7]= "Level3 Ctrl"; level_name[Level8]= "Shift Level3 Ctrl"; }; type "THREE_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; }; type "EIGHT_LEVEL" { modifiers= Shift+LevelThree+LevelFive; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level8; map[Shift+Lock+LevelThree+LevelFive]= Level7; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; preserve[Lock+LevelFive]= Lock; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level7; preserve[Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelThree+LevelFive]= Level8; preserve[Shift+Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelFive]= Level1; preserve[Shift+Lock+LevelFive]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "FOUR_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_MIXED_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[NumLock]= Level2; map[Shift]= Level2; map[LevelThree]= Level3; map[NumLock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_X" { modifiers= Shift+Control+Alt+LevelThree; map[LevelThree]= Level2; map[Shift+LevelThree]= Level3; map[Control+Alt]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Alt Base"; level_name[Level3]= "Shift Alt"; level_name[Level4]= "Ctrl+Alt"; }; type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level4; preserve[Lock]= Lock; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "AltGr Base"; level_name[Level4]= "Shift AltGr"; }; type "FOUR_LEVEL_PLUS_LOCK" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock]= Level5; map[Shift+Lock]= Level2; map[Lock+LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Lock"; }; type "FOUR_LEVEL_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift]= Level2; map[NumLock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[NumLock+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Alt Number"; }; }; xkb_compatibility "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; interpret.useModMapMods= AnyLevel; interpret.repeat= False; interpret.locking= False; interpret ISO_Level2_Latch+Exactly(Shift) { useModMapMods=level1; action= LatchMods(modifiers=Shift,clearLocks,latchToLock); }; interpret Shift_Lock+AnyOf(Shift+Lock) { action= LockMods(modifiers=Shift); }; interpret Num_Lock+AnyOf(all) { virtualModifier= NumLock; action= LockMods(modifiers=NumLock); }; interpret ISO_Lock+AnyOf(all) { action= ISOLock(modifiers=modMapMods,affect=all); }; interpret ISO_Level3_Shift+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LockMods(modifiers=LevelThree); }; interpret Alt_L+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Alt_R+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_L+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_R+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_L+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_R+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_L+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_R+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Scroll_Lock+AnyOf(all) { virtualModifier= ScrollLock; action= LockMods(modifiers=modMapMods); }; interpret ISO_Level5_Shift+AnyOf(all) { virtualModifier= LevelFive; useModMapMods=level1; action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOf(all) { virtualModifier= LevelFive; action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOf(all) { virtualModifier= LevelFive; action= LockMods(modifiers=LevelFive); }; interpret Mode_switch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= SetGroup(group=+1); }; interpret ISO_Level3_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelThree); }; interpret ISO_Group_Latch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LatchGroup(group=2); }; interpret ISO_Next_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=+1); }; interpret ISO_Prev_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=-1); }; interpret ISO_First_Group+AnyOfOrNone(all) { action= LockGroup(group=1); }; interpret ISO_Last_Group+AnyOfOrNone(all) { action= LockGroup(group=2); }; interpret KP_1+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_End+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_2+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_Down+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_3+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_Next+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_4+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_Left+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_6+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_Right+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_7+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_Home+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_8+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_Up+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_9+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_Prior+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_5+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_Begin+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_F2+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_Divide+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_F3+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_Multiply+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_F4+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Subtract+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Separator+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_Add+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_0+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Insert+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Decimal+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret KP_Delete+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret F25+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret F26+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret F27+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret F29+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret F31+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret F33+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret F35+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret Pointer_Button_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default); }; interpret Pointer_Button1+AnyOfOrNone(all) { action= PtrBtn(button=1); }; interpret Pointer_Button2+AnyOfOrNone(all) { action= PtrBtn(button=2); }; interpret Pointer_Button3+AnyOfOrNone(all) { action= PtrBtn(button=3); }; interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default,count=2); }; interpret Pointer_DblClick1+AnyOfOrNone(all) { action= PtrBtn(button=1,count=2); }; interpret Pointer_DblClick2+AnyOfOrNone(all) { action= PtrBtn(button=2,count=2); }; interpret Pointer_DblClick3+AnyOfOrNone(all) { action= PtrBtn(button=3,count=2); }; interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { action= LockPtrBtn(button=default,affect=both); }; interpret Pointer_Drag1+AnyOfOrNone(all) { action= LockPtrBtn(button=1,affect=both); }; interpret Pointer_Drag2+AnyOfOrNone(all) { action= LockPtrBtn(button=2,affect=both); }; interpret Pointer_Drag3+AnyOfOrNone(all) { action= LockPtrBtn(button=3,affect=both); }; interpret Pointer_EnableKeys+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret Pointer_Accelerate+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=+1); }; interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=-1); }; interpret AccessX_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXKeys); }; interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXFeedback); }; interpret RepeatKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=RepeatKeys); }; interpret SlowKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=SlowKeys); }; interpret BounceKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=BounceKeys); }; interpret StickyKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=StickyKeys); }; interpret MouseKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Overlay1_Enable+AnyOfOrNone(all) { action= LockControls(controls=Overlay1); }; interpret Overlay2_Enable+AnyOfOrNone(all) { action= LockControls(controls=Overlay2); }; interpret AudibleBell_Enable+AnyOfOrNone(all) { action= LockControls(controls=AudibleBell); }; interpret Terminate_Server+AnyOfOrNone(all) { action= Terminate(); }; interpret Alt_L+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Alt_R+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Meta_L+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Meta_R+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Super_L+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Super_R+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Hyper_L+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Hyper_R+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret XF86Switch_VT_1+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=1,!same); }; interpret XF86Switch_VT_2+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=2,!same); }; interpret XF86Switch_VT_3+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=3,!same); }; interpret XF86Switch_VT_4+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=4,!same); }; interpret XF86Switch_VT_5+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=5,!same); }; interpret XF86Switch_VT_6+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=6,!same); }; interpret XF86Switch_VT_7+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=7,!same); }; interpret XF86Switch_VT_8+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=8,!same); }; interpret XF86Switch_VT_9+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=9,!same); }; interpret XF86Switch_VT_10+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=10,!same); }; interpret XF86Switch_VT_11+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=11,!same); }; interpret XF86Switch_VT_12+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=12,!same); }; interpret XF86Ungrab+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x55,data[1]=0x6e,data[2]=0x67,data[3]=0x72,data[4]=0x61,data[5]=0x62,data[6]=0x00); }; interpret XF86ClearGrab+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x43,data[1]=0x6c,data[2]=0x73,data[3]=0x47,data[4]=0x72,data[5]=0x62,data[6]=0x00); }; interpret XF86Next_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret XF86Prev_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret ISO_Level5_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelFive); }; interpret Any+Exactly(Lock) { action= LockMods(modifiers=Lock); }; interpret Any+AnyOf(all) { action= SetMods(modifiers=modMapMods,clearLocks); }; group 2 = AltGr; group 3 = AltGr; group 4 = AltGr; indicator "Caps Lock" { !allowExplicit; whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { !allowExplicit; whichModState= locked; modifiers= NumLock; }; indicator "Shift Lock" { !allowExplicit; whichModState= locked; modifiers= Shift; }; indicator "Group 2" { !allowExplicit; groups= 0xfe; }; indicator "Mouse Keys" { indicatorDrivesKeyboard; controls= mouseKeys; }; indicator "Scroll Lock" { whichModState= locked; modifiers= ScrollLock; }; }; xkb_symbols "unknown" { key <> { type= "ALPHABETIC", symbols[Group1]= [ a, A ], symbols[Group2]= [ aring, Aring ] }; modifier_map Mod2 { <> }; }; xkb_geometry "pc(pc104)" { width= 470; height= 180; baseColor= "white"; labelColor= "black"; xfont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; description= "Generic 104"; shape "NORM" { corner= 1, { [ 18, 18 ] }, { [ 2, 1 ], [ 16, 16 ] } }; shape "BKSP" { corner= 1, { [ 38, 18 ] }, { [ 2, 1 ], [ 36, 16 ] } }; shape "TABK" { corner= 1, { [ 28, 18 ] }, { [ 2, 1 ], [ 26, 16 ] } }; shape "BKSL" { corner= 1, { [ 28, 18 ] }, { [ 2, 1 ], [ 26, 16 ] } }; shape "RTRN" { corner= 1, { [ 42, 18 ] }, { [ 2, 1 ], [ 40, 16 ] } }; shape "CAPS" { corner= 1, { [ 33, 18 ] }, { [ 2, 1 ], [ 31, 16 ] } }; shape "LFSH" { corner= 1, { [ 42, 18 ] }, { [ 2, 1 ], [ 40, 16 ] } }; shape "RTSH" { corner= 1, { [ 52, 18 ] }, { [ 2, 1 ], [ 50, 16 ] } }; shape "MODK" { corner= 1, { [ 27, 18 ] }, { [ 2, 1 ], [ 25, 16 ] } }; shape "SMOD" { corner= 1, { [ 23, 18 ] }, { [ 2, 1 ], [ 21, 16 ] } }; shape "SPCE" { corner= 1, { [ 113, 18 ] }, { [ 2, 1 ], [ 111, 16 ] } }; shape "KP0" { corner= 1, { [ 37, 18 ] }, { [ 2, 1 ], [ 35, 16 ] } }; shape "KPAD" { corner= 1, { [ 18, 37 ] }, { [ 2, 1 ], [ 16, 35 ] } }; shape "LEDS" { { [ 75, 20 ] } }; shape "LED" { { [ 5, 1 ] } }; section "Function" { key.color= "grey20"; priority= 7; top= 22; left= 19; width= 351; height= 19; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 20, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 11, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 11, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 8, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" } }; }; }; // End of "Function" section section "Alpha" { key.color= "white"; priority= 8; top= 61; left= 19; width= 287; height= 95; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "BKSP", 1, color="grey20" } }; }; row { top= 20; left= 1; keys { { , "TABK", 1, color="grey20" }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "BKSL", 1 } }; }; row { top= 39; left= 1; keys { { , "CAPS", 1, color="grey20" }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "RTRN", 1, color="grey20" } }; }; row { top= 58; left= 1; keys { { , "LFSH", 1, color="grey20" }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "RTSH", 1, color="grey20" } }; }; row { top= 77; left= 1; keys { { , "MODK", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SPCE", 1 }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" } }; }; }; // End of "Alpha" section section "Editing" { key.color= "grey20"; priority= 9; top= 61; left= 312; width= 58; height= 95; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; row { top= 20; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; row { top= 58; left= 20; keys { { , "NORM", 1 } }; }; row { top= 77; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; }; // End of "Editing" section section "Keypad" { key.color= "grey20"; priority= 10; top= 61; left= 376; width= 77; height= 95; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; row { top= 20; left= 1; keys { { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "KPAD", 1 } }; }; row { top= 39; left= 1; keys { { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" } }; }; row { top= 58; left= 1; keys { { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "KPAD", 1 } }; }; row { top= 77; left= 1; keys { { , "KP0", 1, color="white" }, { , "NORM", 1, color="white" } }; }; }; // End of "Keypad" section solid "LedPanel" { top= 22; left= 377; priority= 0; color= "grey10"; shape= "LEDS"; }; indicator "Num Lock" { top= 37; left= 382; priority= 1; onColor= "green"; offColor= "green30"; shape= "LED"; }; indicator "Caps Lock" { top= 37; left= 407; priority= 2; onColor= "green"; offColor= "green30"; shape= "LED"; }; indicator "Scroll Lock" { top= 37; left= 433; priority= 3; onColor= "green"; offColor= "green30"; shape= "LED"; }; text "NumLockLabel" { top= 25; left= 378; priority= 4; width= 19.8; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Num\nLock"; }; text "CapsLockLabel" { top= 25; left= 403; priority= 5; width= 26.4; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Caps\nLock"; }; text "ScrollLockLabel" { top= 25; left= 428; priority= 6; width= 39.6; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Scroll\nLock"; }; }; };././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1579381981.71198 libxkbcommon-0.10.0/test/data/keymaps/stringcomp.data0000644000175000017500000022537500000000000022236 0ustar00ranran00000000000000xkb_keymap { xkb_keycodes "evdev_aliases(qwerty)" { minimum = 8; maximum = 255; = 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; = 65; = 66; = 67; = 68; = 69; = 70; = 71; = 72; = 73; = 74; = 75; = 76; = 77; = 78; = 79; = 80; = 81; = 82; = 83; = 84; = 85; = 86; = 87; = 88; = 89; = 90; = 91; = 92; = 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; indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; indicator 3 = "Scroll Lock"; indicator 4 = "Compose"; indicator 5 = "Kana"; indicator 6 = "Sleep"; indicator 7 = "Suspend"; indicator 8 = "Mute"; indicator 9 = "Misc"; indicator 10 = "Mail"; indicator 11 = "Charging"; indicator 12 = "Shift Lock"; indicator 13 = "Group 2"; indicator 14 = "Mouse Keys"; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; xkb_types "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; type "ONE_LEVEL" { modifiers= none; level_name[1]= "Any"; }; type "TWO_LEVEL" { modifiers= Shift; map[Shift]= 2; level_name[1]= "Base"; level_name[2]= "Shift"; }; type "ALPHABETIC" { modifiers= Shift+Lock; map[Shift]= 2; map[Lock]= 2; level_name[1]= "Base"; level_name[2]= "Caps"; }; type "SHIFT+ALT" { modifiers= Shift+Alt; map[Shift+Alt]= 2; level_name[1]= "Base"; level_name[2]= "Shift+Alt"; }; type "PC_CONTROL_LEVEL2" { modifiers= Control; map[Control]= 2; level_name[1]= "Base"; level_name[2]= "Control"; }; type "PC_LCONTROL_LEVEL2" { modifiers= LControl; map[LControl]= 2; level_name[1]= "Base"; level_name[2]= "LControl"; }; type "PC_RCONTROL_LEVEL2" { modifiers= RControl; map[RControl]= 2; level_name[1]= "Base"; level_name[2]= "RControl"; }; type "PC_ALT_LEVEL2" { modifiers= Alt; map[Alt]= 2; level_name[1]= "Base"; level_name[2]= "Alt"; }; type "PC_LALT_LEVEL2" { modifiers= LAlt; map[LAlt]= 2; level_name[1]= "Base"; level_name[2]= "LAlt"; }; type "PC_RALT_LEVEL2" { modifiers= RAlt; map[RAlt]= 2; level_name[1]= "Base"; level_name[2]= "RAlt"; }; type "CTRL+ALT" { modifiers= Shift+Control+Alt+LevelThree; map[Shift]= 2; map[LevelThree]= 3; map[Shift+LevelThree]= 4; map[Control+Alt]= 5; level_name[1]= "Base"; level_name[2]= "Shift"; level_name[3]= "Alt Base"; level_name[4]= "Shift Alt"; level_name[5]= "Ctrl+Alt"; }; type "LOCAL_EIGHT_LEVEL" { modifiers= Shift+Lock+Control+LevelThree; map[Shift]= 2; map[Lock]= 2; map[LevelThree]= 3; map[Shift+Lock+LevelThree]= 3; map[Shift+LevelThree]= 4; map[Lock+LevelThree]= 4; map[Control]= 5; map[Shift+Lock+Control]= 5; map[Shift+Control]= 6; map[Lock+Control]= 6; map[Control+LevelThree]= 7; map[Shift+Lock+Control+LevelThree]= 7; map[Shift+Control+LevelThree]= 8; map[Lock+Control+LevelThree]= 8; level_name[1]= "Base"; level_name[2]= "Shift"; level_name[3]= "Level3"; level_name[4]= "Shift Level3"; level_name[5]= "Ctrl"; level_name[6]= "Shift Ctrl"; level_name[7]= "Level3 Ctrl"; level_name[8]= "Shift Level3 Ctrl"; }; type "THREE_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= 2; map[LevelThree]= 3; map[Shift+LevelThree]= 3; level_name[1]= "Base"; level_name[2]= "Shift"; level_name[3]= "Level3"; }; type "EIGHT_LEVEL" { modifiers= Shift+LevelThree+LevelFive; map[Shift]= 2; map[LevelThree]= 3; map[Shift+LevelThree]= 4; map[LevelFive]= 5; map[Shift+LevelFive]= 6; map[LevelThree+LevelFive]= 7; map[Shift+LevelThree+LevelFive]= 8; level_name[1]= "Base"; level_name[2]= "Shift"; level_name[3]= "Alt Base"; level_name[4]= "Shift Alt"; level_name[5]= "X"; level_name[6]= "X Shift"; level_name[7]= "X Alt Base"; level_name[8]= "X Shift Alt"; }; type "EIGHT_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= 2; map[Lock]= 2; map[LevelThree]= 3; map[Shift+LevelThree]= 4; map[Lock+LevelThree]= 4; map[Shift+Lock+LevelThree]= 3; map[LevelFive]= 5; map[Shift+LevelFive]= 6; map[Lock+LevelFive]= 6; map[LevelThree+LevelFive]= 7; map[Shift+LevelThree+LevelFive]= 8; map[Lock+LevelThree+LevelFive]= 8; map[Shift+Lock+LevelThree+LevelFive]= 7; level_name[1]= "Base"; level_name[2]= "Shift"; level_name[3]= "Alt Base"; level_name[4]= "Shift Alt"; level_name[5]= "X"; level_name[6]= "X Shift"; level_name[7]= "X Alt Base"; level_name[8]= "X Shift Alt"; }; type "EIGHT_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= 2; map[Lock]= 2; map[LevelThree]= 3; map[Shift+LevelThree]= 4; map[Lock+LevelThree]= 3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= 4; preserve[Shift+Lock+LevelThree]= Lock; map[LevelFive]= 5; map[Shift+LevelFive]= 6; map[Lock+LevelFive]= 6; preserve[Lock+LevelFive]= Lock; map[LevelThree+LevelFive]= 7; map[Shift+LevelThree+LevelFive]= 8; map[Lock+LevelThree+LevelFive]= 7; preserve[Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelThree+LevelFive]= 8; preserve[Shift+Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelFive]= 1; preserve[Shift+Lock+LevelFive]= Lock; level_name[1]= "Base"; level_name[2]= "Shift"; level_name[3]= "Alt Base"; level_name[4]= "Shift Alt"; level_name[5]= "X"; level_name[6]= "X Shift"; level_name[7]= "X Alt Base"; level_name[8]= "X Shift Alt"; }; type "FOUR_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= 2; map[LevelThree]= 3; map[Shift+LevelThree]= 4; level_name[1]= "Base"; level_name[2]= "Shift"; level_name[3]= "Alt Base"; level_name[4]= "Shift Alt"; }; type "FOUR_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= 2; map[Lock]= 2; map[LevelThree]= 3; map[Shift+LevelThree]= 4; map[Lock+LevelThree]= 4; map[Shift+Lock+LevelThree]= 3; level_name[1]= "Base"; level_name[2]= "Shift"; level_name[3]= "Alt Base"; level_name[4]= "Shift Alt"; }; type "FOUR_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= 2; map[Lock]= 2; map[LevelThree]= 3; map[Shift+LevelThree]= 4; map[Lock+LevelThree]= 3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= 4; preserve[Shift+Lock+LevelThree]= Lock; level_name[1]= "Base"; level_name[2]= "Shift"; level_name[3]= "Alt Base"; level_name[4]= "Shift Alt"; }; type "FOUR_LEVEL_MIXED_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[NumLock]= 2; map[Shift]= 2; map[LevelThree]= 3; map[NumLock+LevelThree]= 3; map[Shift+LevelThree]= 4; map[Shift+NumLock+LevelThree]= 4; level_name[1]= "Base"; level_name[2]= "Number"; level_name[3]= "Alt Base"; level_name[4]= "Shift Alt"; }; type "FOUR_LEVEL_X" { modifiers= Shift+Control+Alt+LevelThree; map[LevelThree]= 2; map[Shift+LevelThree]= 3; map[Control+Alt]= 4; level_name[1]= "Base"; level_name[2]= "Alt Base"; level_name[3]= "Shift Alt"; level_name[4]= "Ctrl+Alt"; }; type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= 2; map[Lock]= 4; preserve[Lock]= Lock; map[LevelThree]= 3; map[Shift+LevelThree]= 4; map[Lock+LevelThree]= 3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= 3; level_name[1]= "Base"; level_name[2]= "Shift"; level_name[3]= "AltGr Base"; level_name[4]= "Shift AltGr"; }; type "FOUR_LEVEL_PLUS_LOCK" { modifiers= Shift+Lock+LevelThree; map[Shift]= 2; map[LevelThree]= 3; map[Shift+LevelThree]= 4; map[Lock]= 5; map[Shift+Lock]= 2; map[Lock+LevelThree]= 3; map[Shift+Lock+LevelThree]= 4; level_name[1]= "Base"; level_name[2]= "Shift"; level_name[3]= "Alt Base"; level_name[4]= "Shift Alt"; level_name[5]= "Lock"; }; type "KEYPAD" { modifiers= Shift+NumLock; map[Shift]= 2; map[NumLock]= 2; level_name[1]= "Base"; level_name[2]= "Number"; }; type "FOUR_LEVEL_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift]= 2; map[NumLock]= 2; map[LevelThree]= 3; map[Shift+LevelThree]= 4; map[NumLock+LevelThree]= 4; map[Shift+NumLock+LevelThree]= 3; level_name[1]= "Base"; level_name[2]= "Number"; level_name[3]= "Alt Base"; level_name[4]= "Alt Number"; }; }; xkb_compatibility "complete_caps(caps_lock)_4_misc(assign_shift_left_action)_4_level5(level5_lock)_4" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; interpret.useModMapMods= AnyLevel; interpret.repeat= False; interpret ISO_Level2_Latch+Exactly(Shift) { useModMapMods=level1; action= LatchMods(modifiers=Shift,clearLocks,latchToLock); }; interpret Shift_Lock+AnyOf(Shift+Lock) { action= LockMods(modifiers=Shift); }; interpret Num_Lock+AnyOf(all) { virtualModifier= NumLock; action= LockMods(modifiers=NumLock); }; interpret ISO_Lock+AnyOf(all) { action= NoAction(); }; interpret ISO_Level3_Shift+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LockMods(modifiers=LevelThree); }; interpret Alt_L+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Alt_R+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_L+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_R+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_L+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_R+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_L+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_R+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Scroll_Lock+AnyOf(all) { virtualModifier= ScrollLock; action= LockMods(modifiers=modMapMods); }; interpret ISO_Level5_Shift+AnyOf(all) { virtualModifier= LevelFive; useModMapMods=level1; action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOf(all) { virtualModifier= LevelFive; action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOf(all) { virtualModifier= LevelFive; action= LockMods(modifiers=LevelFive); }; interpret Mode_switch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= SetGroup(group=+1); }; interpret ISO_Level3_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelThree); }; interpret ISO_Group_Latch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LatchGroup(group=2); }; interpret ISO_Next_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=+1); }; interpret ISO_Prev_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=-1); }; interpret ISO_First_Group+AnyOfOrNone(all) { action= LockGroup(group=1); }; interpret ISO_Last_Group+AnyOfOrNone(all) { action= LockGroup(group=2); }; interpret KP_1+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_End+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_2+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_Down+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_3+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_Next+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_4+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_Left+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_6+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_Right+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_7+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_Home+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_8+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_Up+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_9+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_Prior+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_5+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_Begin+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_F2+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_Divide+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_F3+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_Multiply+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_F4+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Subtract+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Separator+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_Add+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_0+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Insert+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Decimal+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret KP_Delete+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret F25+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret F26+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret F27+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret F29+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret F31+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret F33+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret F35+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret Pointer_Button_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default); }; interpret Pointer_Button1+AnyOfOrNone(all) { action= PtrBtn(button=1); }; interpret Pointer_Button2+AnyOfOrNone(all) { action= PtrBtn(button=2); }; interpret Pointer_Button3+AnyOfOrNone(all) { action= PtrBtn(button=3); }; interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default,count=2); }; interpret Pointer_DblClick1+AnyOfOrNone(all) { action= PtrBtn(button=1,count=2); }; interpret Pointer_DblClick2+AnyOfOrNone(all) { action= PtrBtn(button=2,count=2); }; interpret Pointer_DblClick3+AnyOfOrNone(all) { action= PtrBtn(button=3,count=2); }; interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { action= LockPtrBtn(button=default); }; interpret Pointer_Drag1+AnyOfOrNone(all) { action= LockPtrBtn(button=1); }; interpret Pointer_Drag2+AnyOfOrNone(all) { action= LockPtrBtn(button=2); }; interpret Pointer_Drag3+AnyOfOrNone(all) { action= LockPtrBtn(button=3); }; interpret Pointer_EnableKeys+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret Pointer_Accelerate+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=+1); }; interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=-1); }; interpret AccessX_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXKeys); }; interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXFeedback); }; interpret RepeatKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=RepeatKeys); }; interpret SlowKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=SlowKeys); }; interpret BounceKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=BounceKeys); }; interpret StickyKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=StickyKeys); }; interpret MouseKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Overlay1_Enable+AnyOfOrNone(all) { action= LockControls(controls=none); }; interpret Overlay2_Enable+AnyOfOrNone(all) { action= LockControls(controls=none); }; interpret AudibleBell_Enable+AnyOfOrNone(all) { action= LockControls(controls=AudibleBell); }; interpret Terminate_Server+AnyOfOrNone(all) { action= Terminate(); }; interpret Alt_L+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Alt_R+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Meta_L+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Meta_R+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Super_L+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Super_R+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Hyper_L+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Hyper_R+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Shift_L+AnyOfOrNone(all) { action= SetMods(modifiers=Shift); }; interpret XF86Switch_VT_1+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=1,!same); }; interpret XF86Switch_VT_2+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=2,!same); }; interpret XF86Switch_VT_3+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=3,!same); }; interpret XF86Switch_VT_4+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=4,!same); }; interpret XF86Switch_VT_5+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=5,!same); }; interpret XF86Switch_VT_6+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=6,!same); }; interpret XF86Switch_VT_7+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=7,!same); }; interpret XF86Switch_VT_8+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=8,!same); }; interpret XF86Switch_VT_9+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=9,!same); }; interpret XF86Switch_VT_10+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=10,!same); }; interpret XF86Switch_VT_11+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=11,!same); }; interpret XF86Switch_VT_12+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=12,!same); }; interpret XF86LogGrabInfo+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00); }; interpret XF86LogWindowTree+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00); }; interpret XF86Next_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret XF86Prev_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret ISO_Level5_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=NumLock); }; interpret Caps_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=Lock); }; interpret Any+Exactly(Lock) { action= LockMods(modifiers=Lock); }; interpret Any+AnyOf(all) { action= SetMods(modifiers=modMapMods,clearLocks); }; indicator "Caps Lock" { whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { whichModState= locked; modifiers= NumLock; }; indicator "Scroll Lock" { whichModState= locked; modifiers= ScrollLock; }; indicator "Shift Lock" { whichModState= locked; modifiers= Shift; }; indicator "Group 2" { groups= 0xfe; }; indicator "Mouse Keys" { controls= MouseKeys; }; }; xkb_symbols "pc_us_ru_2_ca(multix)_3_de(neo)_4_inet(evdev)" { name[Group1]="English (US)"; name[Group2]="Russian"; name[Group3]="Canadian Multilingual"; name[Group4]="German (Neo 2)"; key { [ Escape ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ 1, exclam ], symbols[Group2]= [ 1, exclam ], symbols[Group3]= [ 1, exclam, plusminus, NoSymbol, onesuperior, exclamdown, NoSymbol, NoSymbol ], symbols[Group4]= [ 1, degree, onesuperior, onesubscript, ordfeminine, NoSymbol, notsign, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ 2, at ], symbols[Group2]= [ 2, quotedbl ], symbols[Group3]= [ 2, at, at, NoSymbol, twosuperior, NoSymbol, NoSymbol, NoSymbol ], symbols[Group4]= [ 2, section, twosuperior, twosubscript, masculine, NoSymbol, logicalor, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ 3, numbersign ], symbols[Group2]= [ 3, numerosign ], symbols[Group3]= [ 3, numbersign, sterling, NoSymbol, threesuperior, sterling, NoSymbol, NoSymbol ], symbols[Group4]= [ 3, U2113, threesuperior, threesubscript, numerosign, NoSymbol, logicaland, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ 4, dollar ], symbols[Group2]= [ 4, semicolon ], symbols[Group3]= [ 4, dollar, cent, NoSymbol, onequarter, currency, NoSymbol, NoSymbol ], symbols[Group4]= [ 4, guillemotright, U203A, femalesymbol, NoSymbol, NoSymbol, U22A5, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ 5, percent ], symbols[Group2]= [ 5, percent ], symbols[Group3]= [ 5, percent, currency, NoSymbol, onehalf, threeeighths, NoSymbol, NoSymbol ], symbols[Group4]= [ 5, guillemotleft, U2039, malesymbol, periodcentered, NoSymbol, U2221, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ { H, E, L, L, O }, asciicircum ], symbols[Group2]= [ 6, colon ], symbols[Group3]= [ 6, question, notsign, NoSymbol, threequarters, fiveeighths, NoSymbol, NoSymbol ], symbols[Group4]= [ 6, dollar, cent, U26A5, sterling, NoSymbol, U2225, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ { Y, E, S, space, T, H, I, S, space, I, S, space, D, O, G }, ampersand ], symbols[Group2]= [ 7, question ], symbols[Group3]= [ 7, ampersand, braceleft, NoSymbol, NoSymbol, seveneighths, NoSymbol, NoSymbol ], symbols[Group4]= [ 7, EuroSign, yen, U03F0, currency, NoSymbol, rightarrow, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ 8, asterisk ], symbols[Group2]= [ 8, asterisk ], symbols[Group3]= [ 8, asterisk, braceright, NoSymbol, NoSymbol, trademark, NoSymbol, NoSymbol ], symbols[Group4]= [ 8, doublelowquotemark, singlelowquotemark, U27E8, Tab, ISO_Left_Tab, U221E, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ 9, parenleft ], symbols[Group2]= [ 9, parenleft ], symbols[Group3]= [ 9, parenleft, bracketleft, NoSymbol, NoSymbol, plusminus, NoSymbol, NoSymbol ], symbols[Group4]= [ 9, leftdoublequotemark, leftsinglequotemark, U27E9, KP_Divide, KP_Divide, variation, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ 0, parenright ], symbols[Group2]= [ 0, parenright ], symbols[Group3]= [ 0, parenright, bracketright, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ], symbols[Group4]= [ 0, rightdoublequotemark, rightsinglequotemark, zerosubscript, KP_Multiply, KP_Multiply, emptyset, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ minus, underscore ], symbols[Group2]= [ minus, underscore ], symbols[Group3]= [ minus, underscore, onehalf, NoSymbol, NoSymbol, questiondown, NoSymbol, NoSymbol ], symbols[Group4]= [ minus, emdash, NoSymbol, U2011, KP_Subtract, KP_Subtract, hyphen, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ equal, plus ], symbols[Group2]= [ equal, plus ], symbols[Group3]= [ equal, plus, notsign, NoSymbol, dead_cedilla, dead_ogonek, NoSymbol, NoSymbol ], symbols[Group4]= [ dead_grave, dead_cedilla, dead_abovering, dead_abovereversedcomma, dead_diaeresis, NoSymbol, dead_macron, NoSymbol ] }; key { [ BackSpace, BackSpace ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ Tab, ISO_Left_Tab ], symbols[Group2]= [ Tab, ISO_Left_Tab ], symbols[Group3]= [ Tab, ISO_Left_Tab ], symbols[Group4]= [ Tab, ISO_Left_Tab, Multi_key, ISO_Level5_Lock, NoSymbol, NoSymbol, NoSymbol, ISO_Level5_Lock ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ q, Q ], symbols[Group2]= [ Cyrillic_shorti, Cyrillic_SHORTI ], symbols[Group3]= [ q, Q, NoSymbol, NoSymbol, NoSymbol, Greek_OMEGA, NoSymbol, NoSymbol ], symbols[Group4]= [ x, X, ellipsis, Greek_xi, Prior, Prior, Greek_XI, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ w, W ], symbols[Group2]= [ Cyrillic_tse, Cyrillic_TSE ], symbols[Group3]= [ w, W, NoSymbol, NoSymbol, lstroke, Lstroke, NoSymbol, NoSymbol ], symbols[Group4]= [ v, V, underscore, NoSymbol, BackSpace, BackSpace, radical, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ e, E ], symbols[Group2]= [ Cyrillic_u, Cyrillic_U ], symbols[Group3]= [ e, E, NoSymbol, NoSymbol, oe, OE, NoSymbol, NoSymbol ], symbols[Group4]= [ l, L, bracketleft, Greek_lamda, Up, Up, Greek_LAMDA, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ r, R ], symbols[Group2]= [ Cyrillic_ka, Cyrillic_KA ], symbols[Group3]= [ r, R, NoSymbol, NoSymbol, paragraph, registered, NoSymbol, NoSymbol ], symbols[Group4]= [ c, C, bracketright, Greek_chi, Delete, Delete, U2102, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ t, T ], symbols[Group2]= [ Cyrillic_ie, Cyrillic_IE ], symbols[Group3]= [ t, T, NoSymbol, NoSymbol, tslash, Tslash, NoSymbol, NoSymbol ], symbols[Group4]= [ w, W, asciicircum, Greek_omega, Next, Next, Greek_OMEGA, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ y, Y ], symbols[Group2]= [ Cyrillic_en, Cyrillic_EN ], symbols[Group3]= [ y, Y, NoSymbol, NoSymbol, leftarrow, yen, NoSymbol, NoSymbol ], symbols[Group4]= [ k, K, exclam, Greek_kappa, exclamdown, NoSymbol, multiply, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ u, U ], symbols[Group2]= [ Cyrillic_ghe, Cyrillic_GHE ], symbols[Group3]= [ u, U, NoSymbol, NoSymbol, downarrow, uparrow, NoSymbol, NoSymbol ], symbols[Group4]= [ h, H, less, Greek_psi, KP_7, KP_7, Greek_PSI, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ i, I ], symbols[Group2]= [ Cyrillic_sha, Cyrillic_SHA ], symbols[Group3]= [ i, I, NoSymbol, NoSymbol, rightarrow, idotless, NoSymbol, NoSymbol ], symbols[Group4]= [ g, G, greater, Greek_gamma, KP_8, KP_8, Greek_GAMMA, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ o, O ], symbols[Group2]= [ Cyrillic_shcha, Cyrillic_SHCHA ], symbols[Group3]= [ o, O, section, NoSymbol, oslash, Oslash, NoSymbol, NoSymbol ], symbols[Group4]= [ f, F, equal, Greek_phi, KP_9, KP_9, Greek_PHI, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ p, P ], symbols[Group2]= [ Cyrillic_ze, Cyrillic_ZE ], symbols[Group3]= [ p, P, paragraph, NoSymbol, thorn, THORN, NoSymbol, NoSymbol ], symbols[Group4]= [ q, Q, ampersand, U03D5, KP_Add, KP_Add, U211A, NoSymbol ] }; key { type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ bracketleft, braceleft ], symbols[Group2]= [ Cyrillic_ha, Cyrillic_HA ], symbols[Group3]= [ dead_circumflex, dead_diaeresis, dead_grave, NoSymbol, NoSymbol, dead_abovering, NoSymbol, NoSymbol ], symbols[Group4]= [ ssharp, U1E9E, U017F, Greek_finalsmallsigma, U2212, NoSymbol, jot, NoSymbol ] }; key { type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ bracketright, braceright ], symbols[Group2]= [ Cyrillic_hardsign, Cyrillic_HARDSIGN ], symbols[Group3]= [ ccedilla, Ccedilla, asciitilde, NoSymbol, dead_tilde, dead_macron, NoSymbol, NoSymbol ], symbols[Group4]= [ dead_acute, dead_tilde, dead_stroke, dead_abovecomma, dead_doubleacute, NoSymbol, dead_breve, NoSymbol ] }; key { [ Return ] }; key { [ Control_L ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ a, A ], symbols[Group2]= [ Cyrillic_ef, Cyrillic_EF ], symbols[Group3]= [ a, A, NoSymbol, NoSymbol, ae, AE, NoSymbol, NoSymbol ], symbols[Group4]= [ u, U, backslash, NoSymbol, Home, Home, includedin, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ s, S ], symbols[Group2]= [ Cyrillic_yeru, Cyrillic_YERU ], symbols[Group3]= [ s, S, NoSymbol, NoSymbol, ssharp, section, NoSymbol, NoSymbol ], symbols[Group4]= [ i, I, slash, Greek_iota, Left, Left, integral, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ d, D ], symbols[Group2]= [ Cyrillic_ve, Cyrillic_VE ], symbols[Group3]= [ d, D, NoSymbol, NoSymbol, eth, ETH, NoSymbol, NoSymbol ], symbols[Group4]= [ a, A, braceleft, Greek_alpha, Down, Down, U2200, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ f, F ], symbols[Group2]= [ Cyrillic_a, Cyrillic_A ], symbols[Group3]= [ f, F, NoSymbol, NoSymbol, NoSymbol, ordfeminine, NoSymbol, NoSymbol ], symbols[Group4]= [ e, E, braceright, Greek_epsilon, Right, Right, U2203, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ g, G ], symbols[Group2]= [ Cyrillic_pe, Cyrillic_PE ], symbols[Group3]= [ g, G, NoSymbol, NoSymbol, eng, ENG, NoSymbol, NoSymbol ], symbols[Group4]= [ o, O, asterisk, Greek_omicron, End, End, elementof, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ h, H ], symbols[Group2]= [ Cyrillic_er, Cyrillic_ER ], symbols[Group3]= [ h, H, NoSymbol, NoSymbol, hstroke, Hstroke, NoSymbol, NoSymbol ], symbols[Group4]= [ s, S, question, Greek_sigma, questiondown, NoSymbol, Greek_SIGMA, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ j, J ], symbols[Group2]= [ Cyrillic_o, Cyrillic_O ], symbols[Group3]= [ j, J, NoSymbol, NoSymbol, U0133, U0132, NoSymbol, NoSymbol ], symbols[Group4]= [ n, N, parenleft, Greek_nu, KP_4, KP_4, U2115, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ k, K ], symbols[Group2]= [ Cyrillic_el, Cyrillic_EL ], symbols[Group3]= [ k, K, NoSymbol, NoSymbol, kra, NoSymbol, NoSymbol, NoSymbol ], symbols[Group4]= [ r, R, parenright, Greek_rho, KP_5, KP_5, U211D, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ l, L ], symbols[Group2]= [ Cyrillic_de, Cyrillic_DE ], symbols[Group3]= [ l, L, NoSymbol, NoSymbol, U0140, U013F, NoSymbol, NoSymbol ], symbols[Group4]= [ t, T, minus, Greek_tau, KP_6, KP_6, partialderivative, NoSymbol ] }; key { type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ semicolon, colon ], symbols[Group2]= [ Cyrillic_zhe, Cyrillic_ZHE ], symbols[Group3]= [ semicolon, colon, degree, NoSymbol, dead_acute, dead_doubleacute, NoSymbol, NoSymbol ], symbols[Group4]= [ d, D, colon, Greek_delta, KP_Separator, comma, Greek_DELTA, NoSymbol ] }; key { type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ apostrophe, quotedbl ], symbols[Group2]= [ Cyrillic_e, Cyrillic_E ], symbols[Group3]= [ egrave, Egrave, braceleft, NoSymbol, NoSymbol, dead_caron, NoSymbol, NoSymbol ], symbols[Group4]= [ y, Y, at, Greek_upsilon, period, KP_Decimal, nabla, NoSymbol ] }; key { type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ grave, asciitilde ], symbols[Group2]= [ Cyrillic_io, Cyrillic_IO ], symbols[Group3]= [ slash, backslash, bar, NoSymbol, NoSymbol, hyphen, NoSymbol, NoSymbol ], symbols[Group4]= [ dead_circumflex, dead_caron, U21BB, U02DE, dead_abovedot, Pointer_EnableKeys, dead_belowdot, NoSymbol ] }; key { type[Group4]= "TWO_LEVEL", symbols[Group1]= [ Shift_L ], symbols[Group2]= [ Shift_L ], symbols[Group3]= [ Shift_L ], symbols[Group4]= [ Shift_L, Caps_Lock ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "ONE_LEVEL", symbols[Group1]= [ backslash, bar ], symbols[Group2]= [ backslash, slash ], symbols[Group3]= [ agrave, Agrave, braceright, NoSymbol, NoSymbol, dead_breve, NoSymbol, NoSymbol ], symbols[Group4]= [ ISO_Level3_Shift ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "FOUR_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ z, Z ], symbols[Group2]= [ Cyrillic_ya, Cyrillic_YA ], symbols[Group3]= [ z, Z, guillemotleft, NoSymbol ], symbols[Group4]= [ udiaeresis, Udiaeresis, numbersign, NoSymbol, Escape, Escape, union, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "FOUR_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ x, X ], symbols[Group2]= [ Cyrillic_che, Cyrillic_CHE ], symbols[Group3]= [ x, X, guillemotright, NoSymbol ], symbols[Group4]= [ odiaeresis, Odiaeresis, dollar, U03F5, Tab, Tab, intersection, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ c, C ], symbols[Group2]= [ Cyrillic_es, Cyrillic_ES ], symbols[Group3]= [ c, C, NoSymbol, NoSymbol, cent, copyright, NoSymbol, NoSymbol ], symbols[Group4]= [ adiaeresis, Adiaeresis, bar, Greek_eta, Insert, Insert, U2135, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ v, V ], symbols[Group2]= [ Cyrillic_em, Cyrillic_EM ], symbols[Group3]= [ v, V, NoSymbol, NoSymbol, leftdoublequotemark, leftsinglequotemark, NoSymbol, NoSymbol ], symbols[Group4]= [ p, P, asciitilde, Greek_pi, Return, Return, Greek_PI, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ b, B ], symbols[Group2]= [ Cyrillic_i, Cyrillic_I ], symbols[Group3]= [ b, B, NoSymbol, NoSymbol, rightdoublequotemark, rightsinglequotemark, NoSymbol, NoSymbol ], symbols[Group4]= [ z, Z, grave, Greek_zeta, Undo, Undo, U2124, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ n, N ], symbols[Group2]= [ Cyrillic_te, Cyrillic_TE ], symbols[Group3]= [ n, N, NoSymbol, NoSymbol, U0149, U266A, NoSymbol, NoSymbol ], symbols[Group4]= [ b, B, plus, Greek_beta, colon, NoSymbol, U21D0, NoSymbol ] }; key { type[Group1]= "ALPHABETIC", type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ m, M ], symbols[Group2]= [ Cyrillic_softsign, Cyrillic_SOFTSIGN ], symbols[Group3]= [ m, M, mu, NoSymbol, mu, masculine, NoSymbol, NoSymbol ], symbols[Group4]= [ m, M, percent, Greek_mu, KP_1, KP_1, ifonlyif, NoSymbol ] }; key { type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ comma, less ], symbols[Group2]= [ Cyrillic_be, Cyrillic_BE ], symbols[Group3]= [ comma, apostrophe, less, NoSymbol, Greek_horizbar, multiply, NoSymbol, NoSymbol ], symbols[Group4]= [ comma, endash, quotedbl, U03F1, KP_2, KP_2, U21D2, NoSymbol ] }; key { type[Group2]= "ALPHABETIC", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ period, greater ], symbols[Group2]= [ Cyrillic_yu, Cyrillic_YU ], symbols[Group3]= [ period, quotedbl, greater, NoSymbol, periodcentered, division, NoSymbol, NoSymbol ], symbols[Group4]= [ period, enfilledcircbullet, apostrophe, U03D1, KP_3, KP_3, U21A6, NoSymbol ] }; key { type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "EIGHT_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ slash, question ], symbols[Group2]= [ period, comma ], symbols[Group3]= [ eacute, Eacute, dead_acute, NoSymbol, NoSymbol, dead_abovedot, NoSymbol, NoSymbol ], symbols[Group4]= [ j, J, semicolon, Greek_theta, semicolon, NoSymbol, Greek_THETA, NoSymbol ] }; key { type[Group4]= "TWO_LEVEL", symbols[Group1]= [ Shift_R ], symbols[Group2]= [ Shift_R ], symbols[Group3]= [ Shift_R ], symbols[Group4]= [ Shift_R, Caps_Lock ] }; key { type[Group1]= "CTRL+ALT", type[Group2]= "CTRL+ALT", type[Group3]= "CTRL+ALT", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ], symbols[Group2]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ], symbols[Group3]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ], symbols[Group4]= [ KP_Multiply, KP_Multiply, U2219, U2299, multiply, NoSymbol, U2297, NoSymbol ] }; key { [ Alt_L, Meta_L ] }; key { type[Group3]= "FOUR_LEVEL", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ space ], symbols[Group2]= [ space ], symbols[Group3]= [ space, space, nobreakspace, NoSymbol ], symbols[Group4]= [ space, space, space, nobreakspace, KP_0, KP_0, U202F, NoSymbol ] }; key { type= "ONE_LEVEL", symbols[Group1]= [ Caps_Lock ], symbols[Group2]= [ Caps_Lock ], symbols[Group3]= [ Caps_Lock ], symbols[Group4]= [ ISO_Level3_Shift ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ Num_Lock ], symbols[Group2]= [ Num_Lock ], symbols[Group3]= [ Num_Lock ], symbols[Group4]= [ Tab, ISO_Left_Tab, equal, approxeq, notequal, Pointer_EnableKeys, identical, NoSymbol ] }; key { [ Scroll_Lock ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Home, KP_7 ], symbols[Group2]= [ KP_Home, KP_7 ], symbols[Group3]= [ KP_Home, KP_7 ], symbols[Group4]= [ KP_7, U2714, U2195, U226A, KP_Home, KP_Home, upstile, NoSymbol ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Up, KP_8 ], symbols[Group2]= [ KP_Up, KP_8 ], symbols[Group3]= [ KP_Up, KP_8 ], symbols[Group4]= [ KP_8, U2718, uparrow, intersection, KP_Up, KP_Up, U22C2, NoSymbol ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Prior, KP_9 ], symbols[Group2]= [ KP_Prior, KP_9 ], symbols[Group3]= [ KP_Prior, KP_9 ], symbols[Group4]= [ KP_9, dagger, U20D7, U226B, KP_Prior, KP_Prior, U2309, NoSymbol ] }; key { type[Group1]= "CTRL+ALT", type[Group2]= "CTRL+ALT", type[Group3]= "CTRL+ALT", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ], symbols[Group2]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ], symbols[Group3]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ], symbols[Group4]= [ KP_Subtract, KP_Subtract, U2212, U2296, U2216, NoSymbol, U2238, NoSymbol ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Left, KP_4 ], symbols[Group2]= [ KP_Left, KP_4 ], symbols[Group3]= [ KP_Left, KP_4 ], symbols[Group4]= [ KP_4, club, leftarrow, includedin, KP_Left, KP_Left, U2286, NoSymbol ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Begin, KP_5 ], symbols[Group2]= [ KP_Begin, KP_5 ], symbols[Group3]= [ KP_Begin, KP_5 ], symbols[Group4]= [ KP_5, EuroSign, colon, U22B6, KP_Begin, KP_Begin, U22B7, NoSymbol ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Right, KP_6 ], symbols[Group2]= [ KP_Right, KP_6 ], symbols[Group3]= [ KP_Right, KP_6 ], symbols[Group4]= [ KP_6, U2023, rightarrow, includes, KP_Right, KP_Right, U2287, NoSymbol ] }; key { type[Group1]= "CTRL+ALT", type[Group2]= "CTRL+ALT", type[Group3]= "CTRL+ALT", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ], symbols[Group2]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ], symbols[Group3]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ], symbols[Group4]= [ KP_Add, KP_Add, plusminus, U2295, U2213, NoSymbol, U2214, NoSymbol ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_End, KP_1 ], symbols[Group2]= [ KP_End, KP_1 ], symbols[Group3]= [ KP_End, KP_1 ], symbols[Group4]= [ KP_1, diamond, U2194, lessthanequal, KP_End, KP_End, downstile, NoSymbol ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Down, KP_2 ], symbols[Group2]= [ KP_Down, KP_2 ], symbols[Group3]= [ KP_Down, KP_2 ], symbols[Group4]= [ KP_2, heart, downarrow, union, KP_Down, KP_Down, U22C3, NoSymbol ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Next, KP_3 ], symbols[Group2]= [ KP_Next, KP_3 ], symbols[Group3]= [ KP_Next, KP_3 ], symbols[Group4]= [ KP_3, U2660, U21CC, greaterthanequal, KP_Next, KP_Next, U230B, NoSymbol ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Insert, KP_0 ], symbols[Group2]= [ KP_Insert, KP_0 ], symbols[Group3]= [ KP_Insert, KP_0 ], symbols[Group4]= [ KP_0, U2423, percent, U2030, KP_Insert, KP_Insert, U25A1, NoSymbol ] }; key { type[Group2]= "KEYPAD", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Delete, KP_Decimal ], symbols[Group2]= [ KP_Delete, KP_Separator ], symbols[Group3]= [ KP_Delete, KP_Decimal ], symbols[Group4]= [ KP_Separator, period, comma, minutes, KP_Delete, KP_Delete, seconds, NoSymbol ] }; key { [ ISO_Level3_Shift ] }; key { type[Group1]= "FOUR_LEVEL", type[Group3]= "EIGHT_LEVEL_SEMIALPHABETIC", type[Group4]= "ONE_LEVEL", symbols[Group1]= [ less, greater, bar, brokenbar ], symbols[Group2]= [ slash, bar ], symbols[Group3]= [ ugrave, Ugrave, degree, NoSymbol, NoSymbol, brokenbar, NoSymbol, NoSymbol ], symbols[Group4]= [ ISO_Level5_Shift ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ] }; key { [ Katakana ] }; key { [ Hiragana ] }; key { [ Henkan_Mode ] }; key { [ Hiragana_Katakana ] }; key { [ Muhenkan ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Enter ], symbols[Group2]= [ KP_Enter ], symbols[Group3]= [ KP_Enter ], symbols[Group4]= [ KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, NoSymbol ] }; key { type= "ONE_LEVEL", symbols[Group1]= [ Control_R ], symbols[Group2]= [ Control_R ], symbols[Group3]= [ ISO_Level5_Shift ] }; key { type[Group1]= "CTRL+ALT", type[Group2]= "CTRL+ALT", type[Group3]= "CTRL+ALT", type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ], symbols[Group2]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ], symbols[Group3]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ], symbols[Group4]= [ KP_Divide, KP_Divide, division, U2300, U2215, NoSymbol, U2223, NoSymbol ] }; key { type= "PC_ALT_LEVEL2", symbols[Group1]= [ Print, Sys_Req ] }; key { type[Group1]= "TWO_LEVEL", type[Group2]= "TWO_LEVEL", type[Group3]= "ONE_LEVEL", type[Group4]= "ONE_LEVEL", symbols[Group1]= [ Alt_R, Meta_R ], symbols[Group2]= [ Alt_R, Meta_R ], symbols[Group3]= [ ISO_Level3_Shift ], symbols[Group4]= [ ISO_Level5_Shift ] }; key { [ Linefeed ] }; key { [ Home ] }; key { [ Up ] }; key { [ Prior ] }; key { [ Left ] }; key { [ Right ] }; key { [ End ] }; key { [ Down ] }; key { [ Next ] }; key { [ Insert ] }; key { [ Delete ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86PowerOff ] }; key { type[Group4]= "EIGHT_LEVEL", symbols[Group1]= [ KP_Equal ], symbols[Group2]= [ KP_Equal ], symbols[Group3]= [ KP_Equal ], symbols[Group4]= [ KP_Equal, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ] }; key { [ plusminus ] }; key { type= "PC_CONTROL_LEVEL2", symbols[Group1]= [ Pause, Break ] }; key { [ XF86LaunchA ] }; key { [ KP_Decimal, KP_Decimal ] }; key { [ Hangul ] }; key { [ Hangul_Hanja ] }; key { [ Super_L ] }; key { [ Super_R ] }; key { [ Menu ] }; key { [ Cancel ] }; key { [ Redo ] }; key { [ SunProps ] }; key { [ Undo ] }; key { [ SunFront ] }; key { [ XF86Copy ] }; key { [ SunOpen ] }; key { [ XF86Paste ] }; key { [ Find ] }; key { [ XF86Cut ] }; key { [ Help ] }; key { [ XF86MenuKB ] }; key { [ XF86Calculator ] }; key { [ XF86Sleep ] }; key { [ XF86WakeUp ] }; key { [ XF86Explorer ] }; key { [ XF86Send ] }; key { [ XF86Xfer ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86WWW ] }; key { [ XF86DOS ] }; key { [ XF86ScreenSaver ] }; key { [ XF86RotateWindows ] }; key { [ XF86Mail ] }; key { [ XF86Favorites ] }; key { [ XF86MyComputer ] }; key { [ XF86Back ] }; key { [ XF86Forward ] }; key { [ XF86Eject ] }; key { [ XF86Eject, XF86Eject ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioStop, XF86Eject ] }; key { [ XF86AudioRecord ] }; key { [ XF86AudioRewind ] }; key { [ XF86Phone ] }; key { [ XF86Tools ] }; key { [ XF86HomePage ] }; key { [ XF86Reload ] }; key { [ XF86Close ] }; key { [ XF86ScrollUp ] }; key { [ XF86ScrollDown ] }; key { [ parenleft ] }; key { [ parenright ] }; key { [ XF86New ] }; key { [ Redo ] }; key { [ XF86Tools ] }; key { [ XF86Launch5 ] }; key { [ XF86Launch6 ] }; key { [ XF86Launch7 ] }; key { [ XF86Launch8 ] }; key { [ XF86Launch9 ] }; key { [ XF86TouchpadToggle ] }; key { [ XF86TouchpadOn ] }; key { [ XF86TouchpadOff ] }; key { [ Mode_switch ] }; key { [ NoSymbol, Alt_L ] }; key { [ NoSymbol, Meta_L ] }; key { [ NoSymbol, Super_L ] }; key { [ NoSymbol, Hyper_L ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioPause ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch4 ] }; key { [ XF86LaunchB ] }; key { [ XF86Suspend ] }; key { [ XF86Close ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioForward ] }; key { [ Print ] }; key { [ XF86WebCam ] }; key { [ XF86Mail ] }; key { [ XF86Messenger ] }; key { [ XF86Search ] }; key { [ XF86Go ] }; key { [ XF86Finance ] }; key { [ XF86Game ] }; key { [ XF86Shop ] }; key { [ Cancel ] }; key { [ XF86MonBrightnessDown ] }; key { [ XF86MonBrightnessUp ] }; key { [ XF86AudioMedia ] }; key { [ XF86Display ] }; key { [ XF86KbdLightOnOff ] }; key { [ XF86KbdBrightnessDown ] }; key { [ XF86KbdBrightnessUp ] }; key { [ XF86Send ] }; key { [ XF86Reply ] }; key { [ XF86MailForward ] }; key { [ XF86Save ] }; key { [ XF86Documents ] }; key { [ XF86Battery ] }; key { [ XF86Bluetooth ] }; key { [ XF86WLAN ] }; modifier_map Shift { , }; modifier_map Lock { }; modifier_map Control { }; modifier_map Mod1 { , , }; modifier_map Mod2 { }; modifier_map Mod3 { }; modifier_map Mod4 { , , , }; modifier_map Mod5 { , }; }; }; ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1579381981.71198 libxkbcommon-0.10.0/test/data/keymaps/syntax-error.xkb0000644000175000017500000016016600000000000022375 0ustar00ranran00000000000000xkb_keymap { xkb_keycodes "evdev+aliases(qwerty)" { minimum = 8; maximum = 255; = 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; = 65; = 66; = 67; = 68; = 69; = 70; = 71; = 72; = 73; = 74; = 75; = 76; = 77; = 78; = 79; = 80; = 81; = 82; = 83; = 84; = 85; = 86; = 87; = 88; = 89; = 90; = 91; = 92; = 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; indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; indicator 3 = "Scroll Lock"; indicator 4 = "Compose"; indicator 5 = "Kana"; indicator 6 = "Sleep"; indicator 7 = "Suspend"; indicator 8 = "Mute"; indicator 9 = "Misc"; indicator 10 = "Mail"; indicator 11 = "Charging"; virtual indicator 12 = "Shift Lock"; virtual indicator 13 = "Group 2"; virtual indicator 14 = "Mouse Keys"; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; xkb_types "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; type "ONE_LEVEL" { modifiers= none; level_name[Level1]= "Any"; }; type "TWO_LEVEL" { modifiers= Shift; map[Shift]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; }; type "ALPHABETIC" { modifiers= Shift+Lock; map[Shift]= Level2; map[Lock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Caps"; }; type "KEYPAD" { modifiers= Shift+NumLock; map[Shift]= Level2; map[NumLock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Number"; }; type "SHIFT+ALT" { modifiers= Shift+Alt; map[Shift+Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift+Alt"; }; type "PC_CONTROL_LEVEL2" { modifiers= Control; map[Control]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Control"; }; type "PC_LCONTROL_LEVEL2" { modifiers= LControl; map[LControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LControl"; }; type "PC_RCONTROL_LEVEL2" { modifiers= RControl; map[RControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RControl"; }; type "PC_ALT_LEVEL2" { modifiers= Alt; map[Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Alt"; }; type "PC_LALT_LEVEL2" { modifiers= LAlt; map[LAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LAlt"; }; type "PC_RALT_LEVEL2" { modifiers= RAlt; map[RAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RAlt"; }; type "CTRL+ALT" { modifiers= Shift+Control+Alt+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Control+Alt]= Level5; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Ctrl+Alt"; }; type "LOCAL_EIGHT_LEVEL" { modifiers= Shift+Lock+Control+LevelThree; map[Shift+Lock]= Level1; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Control]= Level5; map[Shift+Lock+Control]= Level5; map[Shift+Control]= Level6; map[Lock+Control]= Level6; map[Control+LevelThree]= Level7; map[Shift+Lock+Control+LevelThree]= Level7; map[Shift+Control+LevelThree]= Level8; map[Lock+Control+LevelThree]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; level_name[Level4]= "Shift Level3"; level_name[Level5]= "Ctrl"; level_name[Level6]= "Shift Ctrl"; level_name[Level7]= "Level3 Ctrl"; level_name[Level8]= "Shift Level3 Ctrl"; }; type "THREE_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; }; type "EIGHT_LEVEL" { modifiers= Shift+LevelThree+LevelFive; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level8; map[Shift+Lock+LevelThree+LevelFive]= Level7; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; preserve[Lock+LevelFive]= Lock; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level7; preserve[Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelThree+LevelFive]= Level8; preserve[Shift+Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelFive]= Level1; preserve[Shift+Lock+LevelFive]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "FOUR_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_MIXED_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift+NumLock]= Level1; map[NumLock]= Level2; map[Shift]= Level2; map[LevelThree]= Level3; map[NumLock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_X" { modifiers= Shift+Control+Alt+LevelThree; map[LevelThree]= Level2; map[Shift+LevelThree]= Level3; map[Control+Alt]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Alt Base"; level_name[Level3]= "Shift Alt"; level_name[Level4]= "Ctrl+Alt"; }; type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level4; preserve[Lock]= Lock; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "AltGr Base"; level_name[Level4]= "Shift AltGr"; }; type "FOUR_LEVEL_PLUS_LOCK" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock]= Level5; map[Shift+Lock]= Level2; map[Lock+LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Lock"; }; type "FOUR_LEVEL_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift]= Level2; map[NumLock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[NumLock+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Alt Number"; }; }; xkb_compatibility "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; interpret.useModMapMods= AnyLevel; interpret.repeat= False; interpret.locking= False; interpret ISO_Level2_Latch+Exactly(Shift) { useModMapMods=level1; action= LatchMods(modifiers=Shift,clearLocks,latchToLock); }; interpret Shift_Lock+AnyOf(Shift+Lock) { action= LockMods(modifiers=Shift); }; interpret Num_Lock+AnyOf(all) { virtualModifier= NumLock; action= LockMods(modifiers=NumLock); }; interpret ISO_Lock+AnyOf(all) { action= ISOLock(modifiers=modMapMods,affect=all); }; interpret ISO_Level3_Shift+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LockMods(modifiers=LevelThree); }; interpret Alt_L+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Alt_R+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_L+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_R+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_L+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_R+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_L+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_R+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Scroll_Lock+AnyOf(all) { virtualModifier= ScrollLock; action= LockMods(modifiers=modMapMods); }; interpret ISO_Level5_Shift+AnyOf(all) { virtualModifier= LevelFive; useModMapMods=level1; action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOf(all) { virtualModifier= LevelFive; action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOf(all) { virtualModifier= LevelFive; action= LockMods(modifiers=LevelFive); }; interpret Mode_switch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= SetGroup(group=+1); }; interpret ISO_Level3_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelThree); }; interpret ISO_Group_Latch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LatchGroup(group=2); }; interpret ISO_Next_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=+1); }; interpret ISO_Prev_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=-1); }; interpret ISO_First_Group+AnyOfOrNone(all) { action= LockGroup(group=1); }; interpret ISO_Last_Group+AnyOfOrNone(all) { action= LockGroup(group=2); }; interpret KP_1+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_End+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_2+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_Down+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_3+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_Next+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_4+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_Left+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_6+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_Right+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_7+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_Home+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_8+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_Up+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_9+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_Prior+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_5+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_Begin+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_F2+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_Divide+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_F3+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_Multiply+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_F4+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Subtract+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Separator+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_Add+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_0+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Insert+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Decimal+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret KP_Delete+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret F25+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret F26+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret F27+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret F29+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret F31+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret F33+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret F35+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret Pointer_Button_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default); }; interpret Pointer_Button1+AnyOfOrNone(all) { action= PtrBtn(button=1); }; interpret Pointer_Button2+AnyOfOrNone(all) { action= PtrBtn(button=2); }; interpret Pointer_Button3+AnyOfOrNone(all) { action= PtrBtn(button=3); }; interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default,count=2); }; interpret Pointer_DblClick1+AnyOfOrNone(all) { action= PtrBtn(button=1,count=2); }; interpret Pointer_DblClick2+AnyOfOrNone(all) { action= PtrBtn(button=2,count=2); }; interpret Pointer_DblClick3+AnyOfOrNone(all) { action= PtrBtn(button=3,count=2); }; interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { action= LockPtrBtn(button=default,affect=both); }; interpret Pointer_Drag1+AnyOfOrNone(all) { action= LockPtrBtn(button=1,affect=both); }; interpret Pointer_Drag2+AnyOfOrNone(all) { action= LockPtrBtn(button=2,affect=both); }; interpret Pointer_Drag3+AnyOfOrNone(all) { action= LockPtrBtn(button=3,affect=both); }; interpret Pointer_EnableKeys+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret Pointer_Accelerate+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=+1); }; interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=-1); }; interpret AccessX_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXKeys); }; interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXFeedback); }; interpret RepeatKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=RepeatKeys); }; interpret SlowKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=SlowKeys); }; interpret BounceKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=BounceKeys); }; interpret StickyKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=StickyKeys); }; interpret MouseKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Overlay1_Enable+AnyOfOrNone(all) { action= LockControls(controls=Overlay1); }; interpret Overlay2_Enable+AnyOfOrNone(all) { action= LockControls(controls=Overlay2); }; interpret AudibleBell_Enable+AnyOfOrNone(all) { action= LockControls(controls=AudibleBell); }; interpret Terminate_Server+AnyOfOrNone(all) { action= Terminate(); }; interpret Alt_L+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Alt_R+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Meta_L+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Meta_R+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Super_L+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Super_R+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Hyper_L+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Hyper_R+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Shift_L+AnyOfOrNone(all) { action= SetMods(modifiers=Shift,clearLocks); }; interpret XF86Switch_VT_1+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=1,!same); }; interpret XF86Switch_VT_2+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=2,!same); }; interpret XF86Switch_VT_3+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=3,!same); }; interpret XF86Switch_VT_4+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=4,!same); }; interpret XF86Switch_VT_5+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=5,!same); }; interpret XF86Switch_VT_6+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=6,!same); }; interpret XF86Switch_VT_7+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=7,!same); }; interpret XF86Switch_VT_8+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=8,!same); }; interpret XF86Switch_VT_9+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=9,!same); }; interpret XF86Switch_VT_10+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=10,!same); }; interpret XF86Switch_VT_11+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=11,!same); }; interpret XF86Switch_VT_12+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=12,!same); }; interpret XF86LogGrabInfo+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00); }; interpret XF86LogWindowTree+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00); }; interpret XF86Next_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret XF86Prev_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret ISO_Level5_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelFive); }; interpret Caps_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=Lock); }; interpret Any+Exactly(Lock) { action= LockMods(modifiers=Lock); }; interpret Any+AnyOf(all) { action= SetMods(modifiers=modMapMods,clearLocks); }; indicator "Caps Lock" { !allowExplicit; whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { !allowExplicit; whichModState= locked; modifiers= NumLock; }; indicator "Scroll Lock" { whichModState= locked; modifiers= ScrollLock; }; indicator "Shift Lock" { !allowExplicit; whichModState= locked; modifiers= Shift; }; indicator "Group 2" { !allowExplicit; groups= 0xfe; }; indicator "Mouse Keys" { indicatorDrivesKeyboard; controls= mouseKeys; }; }; xkb_symbols "pc+us+inet(evdev)+ctrl(nocaps)+compose(rwin)+terminate(ctrl_alt_bksp)" { name[group1]="English (US)"; key { [ Escape ] }; key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, numbersign ] }; key { [ 4, dollar ] }; key { [ 5, percent ] }; key { [ 6, asciicircum ] }; key { [ 7, ampersand ] }; key { [ 8, asterisk ] }; key { [ 9, parenleft ] }; key { [ 0, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { type= "CTRL+ALT", symbols[Group1]= [ BackSpace, BackSpace, NoSymbol, NoSymbol, Terminate_Server ] SYNTAX ERROR }; key { [ Tab, ISO_Left_Tab ] }; key { type= "ALPHABETIC", symbols[Group1]= [ q, Q ] }; key { type= "ALPHABETIC", symbols[Group1]= [ w, W ] }; key { type= "ALPHABETIC", symbols[Group1]= [ e, E ] }; key { type= "ALPHABETIC", symbols[Group1]= [ r, R ] }; key { type= "ALPHABETIC", symbols[Group1]= [ t, T ] }; key { type= "ALPHABETIC", symbols[Group1]= [ y, Y ] }; key { type= "ALPHABETIC", symbols[Group1]= [ u, U ] }; key { type= "ALPHABETIC", symbols[Group1]= [ i, I ] }; key { type= "ALPHABETIC", symbols[Group1]= [ o, O ] }; key { type= "ALPHABETIC", symbols[Group1]= [ p, P ] }; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; key { [ Return ] }; key { [ Control_L ] }; key { type= "ALPHABETIC", symbols[Group1]= [ a, A ] }; key { type= "ALPHABETIC", symbols[Group1]= [ s, S ] }; key { type= "ALPHABETIC", symbols[Group1]= [ d, D ] }; key { type= "ALPHABETIC", symbols[Group1]= [ f, F ] }; key { type= "ALPHABETIC", symbols[Group1]= [ g, G ] }; key { type= "ALPHABETIC", symbols[Group1]= [ h, H ] }; key { type= "ALPHABETIC", symbols[Group1]= [ j, J ] }; key { type= "ALPHABETIC", symbols[Group1]= [ k, K ] }; key { type= "ALPHABETIC", symbols[Group1]= [ l, L ] }; key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl ] }; key { [ grave, asciitilde ] }; key { [ Shift_L ] }; key { [ backslash, bar ] }; key { type= "ALPHABETIC", symbols[Group1]= [ z, Z ] }; key { type= "ALPHABETIC", symbols[Group1]= [ x, X ] }; key { type= "ALPHABETIC", symbols[Group1]= [ c, C ] }; key { type= "ALPHABETIC", symbols[Group1]= [ v, V ] }; key { type= "ALPHABETIC", symbols[Group1]= [ b, B ] }; key { type= "ALPHABETIC", symbols[Group1]= [ n, N ] }; key { type= "ALPHABETIC", symbols[Group1]= [ m, M ] }; key { [ comma, less ] }; key { [ period, greater ] }; key { [ slash, question ] }; key { [ Shift_R ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ] }; key { [ Alt_L, Meta_L ] }; key { [ space ] }; key { [ Control_L, Control_L ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ] }; key { [ Num_Lock ] }; key { [ Scroll_Lock ] }; key { [ KP_Home, KP_7 ] }; key { [ KP_Up, KP_8 ] }; key { [ KP_Prior, KP_9 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ] }; key { [ KP_Left, KP_4 ] }; key { [ KP_Begin, KP_5 ] }; key { [ KP_Right, KP_6 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ] }; key { [ KP_End, KP_1 ] }; key { [ KP_Down, KP_2 ] }; key { [ KP_Next, KP_3 ] }; key { [ KP_Insert, KP_0 ] }; key { [ KP_Delete, KP_Decimal ] }; key { [ ISO_Level3_Shift ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ less, greater, bar, brokenbar ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ] }; key { [ Katakana ] }; key { [ Hiragana ] }; key { [ Henkan_Mode ] }; key { [ Hiragana_Katakana ] }; key { [ Muhenkan ] }; key { [ KP_Enter ] }; key { [ Control_R ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ] }; key { type= "PC_ALT_LEVEL2", symbols[Group1]= [ Print, Sys_Req ] }; key { type= "TWO_LEVEL", symbols[Group1]= [ Alt_R, Meta_R ] }; key { [ Linefeed ] }; key { [ Home ] }; key { [ Up ] }; key { [ Prior ] }; key { [ Left ] }; key { [ Right ] }; key { [ End ] }; key { [ Down ] }; key { [ Next ] }; key { [ Insert ] }; key { [ Delete ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86PowerOff ] }; key { [ KP_Equal ] }; key { [ plusminus ] }; key { type= "PC_CONTROL_LEVEL2", symbols[Group1]= [ Pause, Break ] }; key { [ XF86LaunchA ] }; key { [ KP_Decimal, KP_Decimal ] }; key { [ Hangul ] }; key { [ Hangul_Hanja ] }; key { [ Super_L ] }; key { type= "TWO_LEVEL", symbols[Group1]= [ Multi_key, Multi_key ] }; key { [ Menu ] }; key { [ Cancel ] }; key { [ Redo ] }; key { [ SunProps ] }; key { [ Undo ] }; key { [ SunFront ] }; key { [ XF86Copy ] }; key { [ SunOpen ] }; key { [ XF86Paste ] }; key { [ Find ] }; key { [ XF86Cut ] }; key { [ Help ] }; key { [ XF86MenuKB ] }; key { [ XF86Calculator ] }; key { [ XF86Sleep ] }; key { [ XF86WakeUp ] }; key { [ XF86Explorer ] }; key { [ XF86Send ] }; key { [ XF86Xfer ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86WWW ] }; key { [ XF86DOS ] }; key { [ XF86ScreenSaver ] }; key { [ XF86RotateWindows ] }; key { [ XF86Mail ] }; key { [ XF86Favorites ] }; key { [ XF86MyComputer ] }; key { [ XF86Back ] }; key { [ XF86Forward ] }; key { [ XF86Eject ] }; key { [ XF86Eject, XF86Eject ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioStop, XF86Eject ] }; key { [ XF86AudioRecord ] }; key { [ XF86AudioRewind ] }; key { [ XF86Phone ] }; key { [ XF86Tools ] }; key { [ XF86HomePage ] }; key { [ XF86Reload ] }; key { [ XF86Close ] }; key { [ XF86ScrollUp ] }; key { [ XF86ScrollDown ] }; key { [ parenleft ] }; key { [ parenright ] }; key { [ XF86New ] }; key { [ Redo ] }; key { [ XF86Tools ] }; key { [ XF86Launch5 ] }; key { [ XF86Launch6 ] }; key { [ XF86Launch7 ] }; key { [ XF86Launch8 ] }; key { [ XF86Launch9 ] }; key { [ XF86TouchpadToggle ] }; key { [ XF86TouchpadOn ] }; key { [ XF86TouchpadOff ] }; key { [ Mode_switch ] }; key { [ NoSymbol, Alt_L ] }; key { [ NoSymbol, Meta_L ] }; key { [ NoSymbol, Super_L ] }; key { [ NoSymbol, Hyper_L ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioPause ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch4 ] }; key { [ XF86LaunchB ] }; key { [ XF86Suspend ] }; key { [ XF86Close ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioForward ] }; key { [ Print ] }; key { [ XF86WebCam ] }; key { [ XF86Mail ] }; key { [ XF86Messenger ] }; key { [ XF86Search ] }; key { [ XF86Go ] }; key { [ XF86Finance ] }; key { [ XF86Game ] }; key { [ XF86Shop ] }; key { [ Cancel ] }; key { [ XF86MonBrightnessDown ] }; key { [ XF86MonBrightnessUp ] }; key { [ XF86AudioMedia ] }; key { [ XF86Display ] }; key { [ XF86KbdLightOnOff ] }; key { [ XF86KbdBrightnessDown ] }; key { [ XF86KbdBrightnessUp ] }; key { [ XF86Send ] }; key { [ XF86Reply ] }; key { [ XF86MailForward ] }; key { [ XF86Save ] }; key { [ XF86Documents ] }; key { [ XF86Battery ] }; key { [ XF86Bluetooth ] }; key { [ XF86WLAN ] }; modifier_map Control { }; modifier_map Shift { }; modifier_map Shift { }; modifier_map Mod1 { }; modifier_map Control { }; modifier_map Mod2 { }; modifier_map Mod5 { }; modifier_map Control { }; modifier_map Mod1 { }; modifier_map Mod4 { }; modifier_map Mod5 { }; modifier_map Mod1 { }; modifier_map Mod4 { }; modifier_map Mod4 { }; }; xkb_geometry "pc(pc105)" { width= 470; height= 180; alias = ; alias = ; baseColor= "white"; labelColor= "black"; xfont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; description= "Generic 105"; shape "NORM" { corner= 1, { [ 18, 18 ] }, { [ 2, 1 ], [ 16, 16 ] } }; shape "BKSP" { corner= 1, { [ 38, 18 ] }, { [ 2, 1 ], [ 36, 16 ] } }; shape "TABK" { corner= 1, { [ 28, 18 ] }, { [ 2, 1 ], [ 26, 16 ] } }; shape "BKSL" { corner= 1, { [ 28, 18 ] }, { [ 2, 1 ], [ 26, 16 ] } }; shape "RTRN" { corner= 1, { [ 0, 0 ], [ 28, 0 ], [ 28, 37 ], [ 5, 37 ], [ 5, 18 ], [ 0, 18 ] }, { [ 2, 1 ], [ 26, 1 ], [ 26, 35 ], [ 7, 35 ], [ 7, 16 ], [ 2, 16 ] }, approx= { [ 5, 0 ], [ 28, 37 ] } }; shape "CAPS" { corner= 1, { [ 33, 18 ] }, { [ 2, 1 ], [ 31, 16 ] } }; shape "LFSH" { corner= 1, { [ 25, 18 ] }, { [ 2, 1 ], [ 23, 16 ] } }; shape "RTSH" { corner= 1, { [ 50, 18 ] }, { [ 2, 1 ], [ 48, 16 ] } }; shape "MODK" { corner= 1, { [ 27, 18 ] }, { [ 2, 1 ], [ 25, 16 ] } }; shape "SMOD" { corner= 1, { [ 23, 18 ] }, { [ 2, 1 ], [ 21, 16 ] } }; shape "SPCE" { corner= 1, { [ 113, 18 ] }, { [ 2, 1 ], [ 111, 16 ] } }; shape "KP0" { corner= 1, { [ 37, 18 ] }, { [ 2, 1 ], [ 35, 16 ] } }; shape "KPAD" { corner= 1, { [ 18, 37 ] }, { [ 2, 1 ], [ 16, 35 ] } }; shape "LEDS" { { [ 75, 20 ] } }; shape "LED" { { [ 5, 1 ] } }; section "Function" { key.color= "grey20"; priority= 7; top= 22; left= 19; width= 351; height= 19; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 20, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 11, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 11, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 8, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" } }; }; }; // End of "Function" section section "Alpha" { key.color= "white"; priority= 8; top= 61; left= 19; width= 287; height= 95; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "BKSP", 1, color="grey20" } }; }; row { top= 20; left= 1; keys { { , "TABK", 1, color="grey20" }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "RTRN", 1, color="grey20" } }; }; row { top= 39; left= 1; keys { { , "CAPS", 1, color="grey20" }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; row { top= 58; left= 1; keys { { , "LFSH", 1, color="grey20" }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "RTSH", 1, color="grey20" } }; }; row { top= 77; left= 1; keys { { , "MODK", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SPCE", 1 }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" }, { , "SMOD", 1, color="grey20" } }; }; }; // End of "Alpha" section section "Editing" { key.color= "grey20"; priority= 9; top= 61; left= 312; width= 58; height= 95; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; row { top= 20; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; row { top= 58; left= 20; keys { { , "NORM", 1 } }; }; row { top= 77; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; }; // End of "Editing" section section "Keypad" { key.color= "grey20"; priority= 10; top= 61; left= 376; width= 77; height= 95; row { top= 1; left= 1; keys { { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 }, { , "NORM", 1 } }; }; row { top= 20; left= 1; keys { { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "KPAD", 1 } }; }; row { top= 39; left= 1; keys { { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" } }; }; row { top= 58; left= 1; keys { { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "NORM", 1, color="white" }, { , "KPAD", 1 } }; }; row { top= 77; left= 1; keys { { , "KP0", 1, color="white" }, { , "NORM", 1, color="white" } }; }; }; // End of "Keypad" section solid "LedPanel" { top= 22; left= 377; priority= 0; color= "grey10"; shape= "LEDS"; }; indicator "Num Lock" { top= 37; left= 382; priority= 1; onColor= "green"; offColor= "green30"; shape= "LED"; }; indicator "Caps Lock" { top= 37; left= 407; priority= 2; onColor= "green"; offColor= "green30"; shape= "LED"; }; indicator "Scroll Lock" { top= 37; left= 433; priority= 3; onColor= "green"; offColor= "green30"; shape= "LED"; }; text "NumLockLabel" { top= 25; left= 378; priority= 4; width= 19.8; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Num\nLock"; }; text "CapsLockLabel" { top= 25; left= 403; priority= 5; width= 26.4; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Caps\nLock"; }; text "ScrollLockLabel" { top= 25; left= 428; priority= 6; width= 39.6; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Scroll\nLock"; }; }; }; ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1579381981.71198 libxkbcommon-0.10.0/test/data/keymaps/syntax-error2.xkb0000644000175000017500000000025600000000000022450 0ustar00ranran00000000000000xkb_keymap { xkb_compatibility "complete" { interpret ISO_Level2_Latch+Exactly(Shift) { action == LatchMods(modifiers=Shift,clearLocks,latchToLock); }; }; }; ././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1579381981.71198 libxkbcommon-0.10.0/test/data/keymaps/unbound-vmod.xkb0000644000175000017500000014224700000000000022335 0ustar00ranran00000000000000xkb_keymap { xkb_keycodes "evdev+aliases(qwertz)" { minimum = 8; maximum = 255; = 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; = 65; = 66; = 67; = 68; = 69; = 70; = 71; = 72; = 73; = 74; = 75; = 76; = 77; = 78; = 79; = 80; = 81; = 82; = 83; = 84; = 85; = 86; = 87; = 88; = 89; = 90; = 91; = 92; = 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; indicator 1 = "Caps Lock"; indicator 2 = "Num Lock"; indicator 3 = "Scroll Lock"; indicator 4 = "Compose"; indicator 5 = "Kana"; indicator 6 = "Sleep"; indicator 7 = "Suspend"; indicator 8 = "Mute"; indicator 9 = "Misc"; indicator 10 = "Mail"; indicator 11 = "Charging"; virtual indicator 12 = "Shift Lock"; virtual indicator 13 = "Group 2"; virtual indicator 14 = "Mouse Keys"; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; }; xkb_types "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; type "ONE_LEVEL" { modifiers= none; level_name[Level1]= "Any"; }; type "TWO_LEVEL" { modifiers= Shift; map[Shift]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; }; type "ALPHABETIC" { modifiers= Shift+Lock; map[Shift]= Level2; map[Lock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Caps"; }; type "KEYPAD" { modifiers= Shift+NumLock; map[Shift]= Level2; map[NumLock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Number"; }; type "SHIFT+ALT" { modifiers= Shift+Alt; map[Shift+Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift+Alt"; }; type "PC_CONTROL_LEVEL2" { modifiers= Control; map[Control]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Control"; }; type "PC_LCONTROL_LEVEL2" { modifiers= LControl; map[LControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LControl"; }; type "PC_RCONTROL_LEVEL2" { modifiers= RControl; map[RControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RControl"; }; type "PC_ALT_LEVEL2" { modifiers= Alt; map[Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Alt"; }; type "PC_LALT_LEVEL2" { modifiers= LAlt; map[LAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LAlt"; }; type "PC_RALT_LEVEL2" { modifiers= RAlt; map[RAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RAlt"; }; type "CTRL+ALT" { modifiers= Shift+Control+Alt+LevelThree; map[Shift]= Level2; preserve[Shift]= Shift; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; preserve[Shift+LevelThree]= Shift; map[Control+Alt]= Level5; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Ctrl+Alt"; }; type "LOCAL_EIGHT_LEVEL" { modifiers= Shift+Lock+Control+LevelThree; map[Shift+Lock]= Level1; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Control]= Level5; map[Shift+Lock+Control]= Level5; map[Shift+Control]= Level6; map[Lock+Control]= Level6; map[Control+LevelThree]= Level7; map[Shift+Lock+Control+LevelThree]= Level7; map[Shift+Control+LevelThree]= Level8; map[Lock+Control+LevelThree]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; level_name[Level4]= "Shift Level3"; level_name[Level5]= "Ctrl"; level_name[Level6]= "Shift Ctrl"; level_name[Level7]= "Level3 Ctrl"; level_name[Level8]= "Shift Level3 Ctrl"; }; type "THREE_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; }; type "EIGHT_LEVEL" { modifiers= Shift+LevelThree+LevelFive; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level8; map[Shift+Lock+LevelThree+LevelFive]= Level7; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; preserve[Lock+LevelFive]= Lock; map[Shift+Lock+LevelFive]= Level6; preserve[Shift+Lock+LevelFive]= Lock; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level7; preserve[Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelThree+LevelFive]= Level8; preserve[Shift+Lock+LevelThree+LevelFive]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "FOUR_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_MIXED_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift+NumLock]= Level1; map[NumLock]= Level2; map[Shift]= Level2; map[LevelThree]= Level3; map[NumLock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_X" { modifiers= Shift+Control+Alt+LevelThree; map[LevelThree]= Level2; map[Shift+LevelThree]= Level3; map[Control+Alt]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Alt Base"; level_name[Level3]= "Shift Alt"; level_name[Level4]= "Ctrl+Alt"; }; type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level4; preserve[Lock]= Lock; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "AltGr Base"; level_name[Level4]= "Shift AltGr"; }; type "FOUR_LEVEL_PLUS_LOCK" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock]= Level5; map[Shift+Lock]= Level2; map[Lock+LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Lock"; }; type "FOUR_LEVEL_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift]= Level2; map[NumLock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[NumLock+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Alt Number"; }; }; xkb_compatibility "complete" { virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper; interpret.useModMapMods= AnyLevel; interpret.repeat= False; interpret.locking= False; interpret ISO_Level2_Latch+Exactly(Shift) { useModMapMods=level1; action= LatchMods(modifiers=Shift,clearLocks,latchToLock); }; interpret Shift_Lock+AnyOf(Shift+Lock) { action= LockMods(modifiers=Shift); }; interpret Num_Lock+AnyOf(all) { virtualModifier= NumLock; action= LockMods(modifiers=NumLock); }; interpret ISO_Level3_Shift+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LockMods(modifiers=LevelThree); }; interpret Alt_L+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Alt_R+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_L+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_R+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_L+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_R+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_L+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_R+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Scroll_Lock+AnyOf(all) { virtualModifier= ScrollLock; action= LockMods(modifiers=modMapMods); }; interpret ISO_Level5_Shift+AnyOf(all) { virtualModifier= LevelFive; useModMapMods=level1; action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOf(all) { virtualModifier= LevelFive; action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOf(all) { virtualModifier= LevelFive; action= LockMods(modifiers=LevelFive); }; interpret Mode_switch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= SetGroup(group=+1); }; interpret ISO_Level3_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelThree); }; interpret ISO_Group_Latch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LatchGroup(group=2); }; interpret ISO_Next_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=+1); }; interpret ISO_Prev_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=-1); }; interpret ISO_First_Group+AnyOfOrNone(all) { action= LockGroup(group=1); }; interpret ISO_Last_Group+AnyOfOrNone(all) { action= LockGroup(group=2); }; interpret KP_1+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_End+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_2+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_Down+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_3+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_Next+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_4+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_Left+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_6+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_Right+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_7+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_Home+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_8+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_Up+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_9+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_Prior+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_5+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_Begin+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_F2+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_Divide+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_F3+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_Multiply+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_F4+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Subtract+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Separator+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_Add+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_0+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Insert+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Decimal+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret KP_Delete+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret F25+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret F26+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret F27+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret F29+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret F31+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret F33+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret F35+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret Pointer_Button_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default); }; interpret Pointer_Button1+AnyOfOrNone(all) { action= PtrBtn(button=1); }; interpret Pointer_Button2+AnyOfOrNone(all) { action= PtrBtn(button=2); }; interpret Pointer_Button3+AnyOfOrNone(all) { action= PtrBtn(button=3); }; interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default,count=2); }; interpret Pointer_DblClick1+AnyOfOrNone(all) { action= PtrBtn(button=1,count=2); }; interpret Pointer_DblClick2+AnyOfOrNone(all) { action= PtrBtn(button=2,count=2); }; interpret Pointer_DblClick3+AnyOfOrNone(all) { action= PtrBtn(button=3,count=2); }; interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { action= LockPtrBtn(button=default,affect=both); }; interpret Pointer_Drag1+AnyOfOrNone(all) { action= LockPtrBtn(button=1,affect=both); }; interpret Pointer_Drag2+AnyOfOrNone(all) { action= LockPtrBtn(button=2,affect=both); }; interpret Pointer_Drag3+AnyOfOrNone(all) { action= LockPtrBtn(button=3,affect=both); }; interpret Pointer_EnableKeys+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret Pointer_Accelerate+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=+1); }; interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=-1); }; interpret AccessX_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXKeys); }; interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXFeedback); }; interpret RepeatKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=RepeatKeys); }; interpret SlowKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=SlowKeys); }; interpret BounceKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=BounceKeys); }; interpret StickyKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=StickyKeys); }; interpret MouseKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Overlay1_Enable+AnyOfOrNone(all) { action= LockControls(controls=Overlay1); }; interpret Overlay2_Enable+AnyOfOrNone(all) { action= LockControls(controls=Overlay2); }; interpret AudibleBell_Enable+AnyOfOrNone(all) { action= LockControls(controls=AudibleBell); }; interpret Terminate_Server+AnyOfOrNone(all) { action= Terminate(); }; interpret Alt_L+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Alt_R+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Meta_L+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Meta_R+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Super_L+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Super_R+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Hyper_L+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Hyper_R+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Shift_L+AnyOfOrNone(all) { action= SetMods(modifiers=Shift,clearLocks); }; interpret XF86Switch_VT_1+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=1,!same); }; interpret XF86Switch_VT_2+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=2,!same); }; interpret XF86Switch_VT_3+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=3,!same); }; interpret XF86Switch_VT_4+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=4,!same); }; interpret XF86Switch_VT_5+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=5,!same); }; interpret XF86Switch_VT_6+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=6,!same); }; interpret XF86Switch_VT_7+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=7,!same); }; interpret XF86Switch_VT_8+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=8,!same); }; interpret XF86Switch_VT_9+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=9,!same); }; interpret XF86Switch_VT_10+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=10,!same); }; interpret XF86Switch_VT_11+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=11,!same); }; interpret XF86Switch_VT_12+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=12,!same); }; interpret XF86LogGrabInfo+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00); }; interpret XF86LogWindowTree+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00); }; interpret XF86Next_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret XF86Prev_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret ISO_Level5_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelFive); }; interpret Caps_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=Lock); }; interpret Any+Exactly(Lock) { action= LockMods(modifiers=Lock); }; interpret Any+AnyOf(all) { action= SetMods(modifiers=modMapMods,clearLocks); }; group 2 = AltGr; group 3 = AltGr; group 4 = AltGr; indicator "Caps Lock" { !allowExplicit; whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { !allowExplicit; whichModState= locked; modifiers= NumLock; }; indicator "Scroll Lock" { whichModState= locked; modifiers= ScrollLock; }; indicator "Shift Lock" { !allowExplicit; whichModState= locked; modifiers= Shift; }; indicator "Group 2" { !allowExplicit; groups= 0xfe; }; indicator "Mouse Keys" { indicatorDrivesKeyboard; controls= mouseKeys; }; }; xkb_symbols "pc+de+inet(evdev)+group(menu_toggle)+ctrl(nocaps)" { name[group1]="German"; key { [ Escape ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ 1, exclam, onesuperior, exclamdown ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ 2, quotedbl, twosuperior, oneeighth ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ 3, section, threesuperior, sterling ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ 4, dollar, onequarter, currency ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ 5, percent, onehalf, threeeighths ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ 6, ampersand, notsign, fiveeighths ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ 7, slash, braceleft, seveneighths ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ 8, parenleft, bracketleft, trademark ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ 9, parenright, bracketright, plusminus ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ 0, equal, braceright, degree ] }; key { type= "FOUR_LEVEL_PLUS_LOCK", symbols[Group1]= [ ssharp, question, backslash, questiondown, U1E9E ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ dead_acute, dead_grave, dead_cedilla, dead_ogonek ] }; key { [ BackSpace, BackSpace ] }; key { [ Tab, ISO_Left_Tab ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ q, Q, at, Greek_OMEGA ] }; key { type= "FOUR_LEVEL_ALPHABETIC", symbols[Group1]= [ w, W, lstroke, Lstroke ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ e, E, EuroSign, EuroSign ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ r, R, paragraph, registered ] }; key { type= "FOUR_LEVEL_ALPHABETIC", symbols[Group1]= [ t, T, tslash, Tslash ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ z, Z, leftarrow, yen ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ u, U, downarrow, uparrow ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ i, I, rightarrow, idotless ] }; key { type= "FOUR_LEVEL_ALPHABETIC", symbols[Group1]= [ o, O, oslash, Oslash ] }; key { type= "FOUR_LEVEL_ALPHABETIC", symbols[Group1]= [ p, P, thorn, THORN ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ udiaeresis, Udiaeresis, dead_diaeresis, dead_abovering ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ plus, asterisk, asciitilde, macron ] }; key { [ Return ] }; key { [ Control_L ] }; key { type= "FOUR_LEVEL_ALPHABETIC", symbols[Group1]= [ a, A, ae, AE ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ s, S, U017F, U1E9E ] }; key { type= "FOUR_LEVEL_ALPHABETIC", symbols[Group1]= [ d, D, eth, ETH ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ f, F, dstroke, ordfeminine ] }; key { type= "FOUR_LEVEL_ALPHABETIC", symbols[Group1]= [ g, G, eng, ENG ] }; key { type= "FOUR_LEVEL_ALPHABETIC", symbols[Group1]= [ h, H, hstroke, Hstroke ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ j, J, dead_belowdot, dead_abovedot ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ k, K, kra, ampersand ] }; key { type= "FOUR_LEVEL_ALPHABETIC", symbols[Group1]= [ l, L, lstroke, Lstroke ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ odiaeresis, Odiaeresis, dead_doubleacute, dead_belowdot ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ adiaeresis, Adiaeresis, dead_circumflex, dead_caron ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ dead_circumflex, degree, U2032, U2033 ] }; key { [ Shift_L ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ numbersign, apostrophe, rightsinglequotemark, dead_breve ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ y, Y, guillemotright, U203A ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ x, X, guillemotleft, U2039 ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ c, C, cent, copyright ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ v, V, doublelowquotemark, singlelowquotemark ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ b, B, leftdoublequotemark, leftsinglequotemark ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ n, N, rightdoublequotemark, rightsinglequotemark ] }; key { type= "FOUR_LEVEL_SEMIALPHABETIC", symbols[Group1]= [ m, M, mu, masculine ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ comma, semicolon, periodcentered, multiply ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ period, colon, U2026, division ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ minus, underscore, endash, emdash ] }; key { [ Shift_R ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ] }; key { [ Alt_L, Meta_L ] }; key { [ space ] }; key { [ Control_L, Control_L ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ] }; key { [ Num_Lock ] }; key { [ Scroll_Lock ] }; key { [ KP_Home, KP_7 ] }; key { [ KP_Up, KP_8 ] }; key { [ KP_Prior, KP_9 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ] }; key { [ KP_Left, KP_4 ] }; key { [ KP_Begin, KP_5 ] }; key { [ KP_Right, KP_6 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ] }; key { [ KP_End, KP_1 ] }; key { [ KP_Down, KP_2 ] }; key { [ KP_Next, KP_3 ] }; key { [ KP_Insert, KP_0 ] }; key { type= "KEYPAD", symbols[Group1]= [ KP_Delete, KP_Separator ] }; key { type= "ONE_LEVEL", symbols[Group1]= [ ISO_Level3_Shift ], actions[Group1]= [ SetMods(modifiers=LevelThree) ] }; key { type= "FOUR_LEVEL", symbols[Group1]= [ less, greater, bar, brokenbar ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ] }; key { type= "CTRL+ALT", symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ] }; key { [ Katakana ] }; key { [ Hiragana ] }; key { [ Henkan_Mode ] }; key { [ Hiragana_Katakana ] }; key { [ Muhenkan ] }; key { [ KP_Enter ] }; key { [ Control_R ] }; key { type= "CTRL+ALT", symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ] }; key { type= "PC_ALT_LEVEL2", symbols[Group1]= [ Print, Sys_Req ] }; key { type= "ONE_LEVEL", symbols[Group1]= [ ISO_Level3_Shift ] }; key { [ Linefeed ] }; key { [ Home ] }; key { [ Up ] }; key { [ Prior ] }; key { [ Left ] }; key { [ Right ] }; key { [ End ] }; key { [ Down ] }; key { [ Next ] }; key { [ Insert ] }; key { [ Delete ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86PowerOff ] }; key { [ KP_Equal ] }; key { [ plusminus ] }; key { type= "PC_CONTROL_LEVEL2", symbols[Group1]= [ Pause, Break ] }; key { [ XF86LaunchA ] }; key { [ KP_Decimal, KP_Decimal ] }; key { [ Hangul ] }; key { [ Hangul_Hanja ] }; key { [ Super_L ] }; key { [ Super_R ] }; key { [ ISO_Next_Group, Menu ] }; key { [ Cancel ] }; key { [ Redo ] }; key { [ SunProps ] }; key { [ Undo ] }; key { [ SunFront ] }; key { [ XF86Copy ] }; key { [ XF86Open ] }; key { [ XF86Paste ] }; key { [ Find ] }; key { [ XF86Cut ] }; key { [ Help ] }; key { [ XF86MenuKB ] }; key { [ XF86Calculator ] }; key { [ XF86Sleep ] }; key { [ XF86WakeUp ] }; key { [ XF86Explorer ] }; key { [ XF86Send ] }; key { [ XF86Xfer ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86WWW ] }; key { [ XF86DOS ] }; key { [ XF86ScreenSaver ] }; key { [ XF86RotateWindows ] }; key { [ XF86Mail ] }; key { [ XF86Favorites ] }; key { [ XF86MyComputer ] }; key { [ XF86Back ] }; key { [ XF86Forward ] }; key { [ XF86Eject ] }; key { [ XF86Eject, XF86Eject ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioStop, XF86Eject ] }; key { [ XF86AudioRecord ] }; key { [ XF86AudioRewind ] }; key { [ XF86Phone ] }; key { [ XF86Tools ] }; key { [ XF86HomePage ] }; key { [ XF86Reload ] }; key { [ XF86Close ] }; key { [ XF86ScrollUp ] }; key { [ XF86ScrollDown ] }; key { [ parenleft ] }; key { [ parenright ] }; key { [ XF86New ] }; key { [ Redo ] }; key { [ XF86Tools ] }; key { [ XF86Launch5 ] }; key { [ XF86Launch6 ] }; key { [ XF86Launch7 ] }; key { [ XF86Launch8 ] }; key { [ XF86Launch9 ] }; key { [ XF86TouchpadToggle ] }; key { [ XF86TouchpadOn ] }; key { [ XF86TouchpadOff ] }; key { [ Mode_switch ] }; key { [ NoSymbol, Alt_L ] }; key { [ NoSymbol, Meta_L ] }; key { [ NoSymbol, Super_L ] }; key { [ NoSymbol, Hyper_L ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioPause ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch4 ] }; key { [ XF86LaunchB ] }; key { [ XF86Suspend ] }; key { [ XF86Close ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioForward ] }; key { [ Print ] }; key { [ XF86WebCam ] }; key { [ XF86Mail ] }; key { [ XF86Messenger ] }; key { [ XF86Search ] }; key { [ XF86Go ] }; key { [ XF86Finance ] }; key { [ XF86Game ] }; key { [ XF86Shop ] }; key { [ Cancel ] }; key { [ XF86MonBrightnessDown ] }; key { [ XF86MonBrightnessUp ] }; key { [ XF86AudioMedia ] }; key { [ XF86Display ] }; key { [ XF86KbdLightOnOff ] }; key { [ XF86KbdBrightnessDown ] }; key { [ XF86KbdBrightnessUp ] }; key { [ XF86Send ] }; key { [ XF86Reply ] }; key { [ XF86MailForward ] }; key { [ XF86Save ] }; key { [ XF86Documents ] }; key { [ XF86Battery ] }; key { [ XF86Bluetooth ] }; key { [ XF86WLAN ] }; modifier_map Control { }; modifier_map Shift { }; modifier_map Shift { }; modifier_map Mod1 { }; modifier_map Control { }; modifier_map Mod2 { }; modifier_map Mod5 { }; modifier_map Control { }; modifier_map Mod4 { }; modifier_map Mod4 { }; modifier_map Mod5 { }; modifier_map Mod1 { }; modifier_map Mod4 { }; modifier_map Mod4 { }; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7753127 libxkbcommon-0.10.0/test/data/rules/0000755000175000017500000000000000000000000016661 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003200000000000011450 xustar000000000000000026 mtime=1579381981.71198 libxkbcommon-0.10.0/test/data/rules/base0000644000175000017500000013556200000000000017532 0ustar00ranran00000000000000// DO NOT EDIT THIS FILE - IT WAS AUTOGENERATED BY merge.sh FROM rules/*.part // // Rules for resolving XKB components for use with XFree86 // Copyright 1996 by Joseph Moss // // 2002 Modifier: Ivan Pascal The XFree86 Project // // If you want non-latin layouts implicitly include the en_US layout // uncomment lines below //! $nonlatin = am ara ben bd bg bt by cs deva ge gh gr guj guru il \ // in ir iku jp kan kh kr la lao lk mk mm mn mv mal olck \ // ori pk ru scc sy syr tel th tj tam ua uz // PC models ! $pcmodels = pc101 pc102 pc104 pc105 // Jolla devices and keyboards ! $jollamodels = jollasbj // Microsoft models (using MS geometry) ! $msmodels = microsoft microsoft4000 microsoft7000 microsoftpro microsoftprousb microsoftprose // Nokia devices and keyboards ! $nokiamodels = nokiasu8w nokiarx44 nokiarx51 // PC geometries - they have special geometry but symbols are mostly pc105 ! $pcgeometries = latitude // TypeMatrix geometries ! $tmgeometries = tm2020 tm2030PS2 tm2030USB tm2030USB-102 tm2030USB-106 // Layouts that provide further specializations for the OLPC ! $olpclayouts = af am ara br ca es et fr it kh kz in mn np ru th tr us ! $macbooks = macbook78 macbook79 ! $maclaptop = ibook powerbook macbook78 macbook79 ! $applealu = applealu_ansi applealu_iso applealu_jis ! $macs = macintosh macintosh_old ibook powerbook macbook78 macbook79 ! $macvendorlayouts = ch de dk fi fr gb is it latam nl no pt se us ! $azerty = be fr ! $qwertz = al cz de hr hu ro si sk // all layouts with 3rd and 4th groups ! $threelevellayouts = al az \ be br bt \ ca ch cs cz \ de dk \ ee es \ fi fo fr \ gb gr \ hu \ ie ir is it \ latam \ lk lt \ mn mt \ nl no \ pl pt \ ro \ se sk \ tr \ us \ vn \ za ! $thinkpads = thinkpad thinkpad60 thinkpadz60 ! $sun = sun_type6_jp sun_type6_usb sun_type6_euro_usb \ sun_type6_jp_usb sun_type6_unix_usb sun_type7_jp_usb \ sun_type7_usb sun_type7_euro_usb sun_type7_unix_usb ! $sun_jp = sun_type6_jp sun_type6_jp_usb sun_type7_jp_usb // Sun Type_6_7 keyboards with custom layouts ! $sun_custom = ara be br ca ch cz de dk \ ee es fi fr gb gr it jp \ kr lt lv nl no pl pt ro \ ru se sk tr tw ua us ! $sun_var = sun_type6 sun_type6_suncompat sun_type6_de sun_type6_fr \ sun_type7 sun_type7_suncompat suncompat ! $sun_compat = sun_type6 sun_type6_suncompat sun_type7_suncompat suncompat ! $htcdreamlayouts = us it de ! $inetkbds = acer_c300 acer_ferrari4k acer_laptop \ airkey \ apple armada azonaRF2300 \ benqx brother \ btc5113rf btc9000 btc9000a btc9001ah btc5090 btc9019u \ cherryblue cherrybluea cherryblueb \ cherrycyboard cherrycmexpert \ chicony chicony0108 chicony0420 chicony9885 \ compalfl90 \ compaqeak8 compaqik7 compaqik13 compaqik18 \ creativedw7000 \ cymotionlinux \ dell dellm65 inspiron dellusbmm \ emachines ennyah_dkb1008 evdev \ genius geniuscomfy2 \ gyration honeywell_euroboard \ hp250x hp5xx hp500fa hpdv5 \ hpi6 hpxe3gc hpxe3gf hpxe4xxx hpxt1000 hpzt11xx htcdream \ ibm_spacesaver ipaq inspiron intel \ logiaccess logicda logicink \ logiex110 logiclx300 \ logiinkse logiinkseusb logiitc logiik \ logitech_base itouch logiultrax \ logitech_g15 \ logidinovo logidinovoedge \ microsoft4000 microsoft7000 microsoftinet microsoftprousb microsoftprooem microsoftprose \ microsoftoffice microsoftmult \ mx1998 mx2500 mx2750 \ oretec \ pc105 \ presario propeller \ qtronix \ rapidaccess rapidaccess2 thinkpad60 \ samsung4500 samsung4510 \ silvercrest \ sk1300 sk2500 sk6200 sk7100 \ sven sven303 symplon \ toshiba_s3000 trust trustda \ unitekkb1925 yahoo \ teck227 teck229 \ apex300 ! $inetmediakbds = acer_ferrari4k acer_laptop btc5090 btc9019u cherryblueb \ cherrybluea herrycyboard chicony042 compaqik13 compaqik18 \ armada presario dellm65 inspiron dellusbmm diamond \ ennyah_dkb1008 genius geniuscomfy2 hpi6 hpxe3gc hpxe3gf \ hpxt1000 hpzt11xx hpdv5 hpxe4xxx hp5xx thinkpad60 ogitech_base \ logidinovo logidinovoedge logitech_g15 mx1998 mx2500 mx2750 \ microsoft4000 microsoft7000 microsoftprooem microsoftmult \ propeller samsung4500 samsung4510 sk1300 sk2500 sk7100 \ toshiba_s3000 trust trustda cymotionlinux silvercrest \ emachines benqx unitekkb1925 creativedw7000 compalfl90 \ pc105 a4techKB21 a4techKBS8 a4_rfkb23 asus_laptop btc6301urf \ dexxa dtk2000 fscaa1667g geniuskb19e geniuscomfy latitude \ microsoftpro precision_m scorpius sp_inet targa_v811 thinkpad \ tm2030USB-102 tm2030USB-106 trust_slimline ! $dvoraklayouts = br ca de ee es fr gb no pl se us ! model = keycodes amiga = amiga(de) ataritt = ataritt(de) empty = empty $sun_jp = sun(type6_jp_usb) $sun = sun(type6_usb) pc98 = xfree98(pc98) $applealu = macintosh(alukbd) macintosh_hhk = macintosh(hhk) macintosh_old = macintosh(old) $macs = macintosh thinkpadz60 = xfree86(thinkpadz60) * = xfree86 ! layout[1] = keycodes $azerty = +aliases(azerty) $qwertz = +aliases(qwertz) * = +aliases(qwerty) ! layout = keycodes $azerty = +aliases(azerty) $qwertz = +aliases(qwertz) * = +aliases(qwerty) ! option = keycodes ! model layout = geometry thinkpad us = thinkpad(us) ! model = geometry microsoftelite = microsoft(elite) $msmodels = microsoft(natural) dell101 = dell(dell101) dellm65 = dell(dellm65) latitude = dell(latitude) flexpro = keytronic(FlexPro) hp6000 = hp(omnibook) hpmini110 = hp(mini110) hpdv5 = hp(dv5) omnikey101 = northgate(omnikey101) sanwaskbkg3 = sanwa(sanwaskbkg3) $pcmodels = pc(%m) $pcgeometries = pc(%m) everex = everex(STEPnote) thinkpad = thinkpad(intl) thinkpad60 = thinkpad(60) thinkpadz60 = thinkpad(60) apex300 = steelseries(apex300) $tmgeometries = typematrix(%m) winbook = winbook(XP5) pc98 = nec(pc98) $applealu = macintosh(%m) $macbooks = macintosh(%m) $macs = macintosh(macintosh) hhk = hhk(basic) kinesis = kinesis(model100) $nokiamodels = nokia(%m) sun_type6_jp = sun(type6jp) sun_type6_usb = sun(type6) sun_type6_euro_usb = sun(type6tuv) sun_type6_jp_usb = sun(type6jp) sun_type6_unix_usb = sun(type6unix) sun_type7_jp_usb = sun(type6jp) sun_type7_usb = sun(type7) sun_type7_euro_usb = sun(type7tuv) sun_type7_unix_usb = sun(type7unix) * = pc(pc104) ! model layout variant = symbols * ben basic = pc+in(ben) * ben probhat = pc+in(ben_probhat) * dev basic = pc+in(deva) * dvorak $dvoraklayouts = pc+%v(dvorak) * dvorak basic = pc+us(dvorak) * dvorak pl_basic = pc+pl(dvorak) * dvorak pl = pc+pl(dvorak_quotes) * dvorak pl_altquotes = pc+pl(dvorak_altquotes) * dzdwi basic = pc+bt(basic) * fi basic = pc+fi(classic) * ge azerty_tskapo = pc+fr(geo) * guj basic = pc+in(guj) * gur basic = pc+in(guru) * ie laptop = pc+ie(basic) * ie CloGaelachLaptop = pc+ie(CloGaelach) * in urd = pc+in(urd-phonetic) * iu basic = pc+ca(ike) * lo basic = pc+la(basic) * kan basic = pc+in(kan) * mal basic = pc+in(mal) * mal mlplusnum = pc+in(mal) * ogham basic = pc+ie(ogam) * ogham laptop = pc+ie(ogam) * ogham is434 = pc+ie(ogam_is434) * ogham is434laptop = pc+ie(ogam_is434) * ori basic = pc+in(ori) * ro de = pc+ro(winkeys) * ro us = pc+ro(std) * ro academic = pc+ro(std) * ro std_comma = pc+ro(std) * ro comma = pc+ro(basic) * ru os = pc+ru(os_legacy) * pk urd = pc+pk(urd-phonetic) * sapmi basic = pc+no(smi) * sapmi nodeadkeys = pc+no(smi_nodeadkeys) * sapmi sefi = pc+fi(smi) * sin phonetic-static = pc+in(sin_phonetic) * syr basic = pc+sy(syc) * syr phonetic = pc+sy(syc_phonetic) * tam INSCRIPT = pc+in(tam) * tam UNI = pc+in(tam_unicode) * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals) * tam TAB = pc+in(tam_TAB) * tam TSCII = pc+in(tam_TSCII) * tel basic = pc+in(tel) * yu basic = pc+srp(latin) * yu unicode = pc+srp(latinunicode) * yu yz = pc+srp(latinyz) * yu unicodeyz = pc+srp(latinunicodeyz) classmate us intl = pc+us(classmate-intl) classmate us alt-intl = pc+us(classmate-alt-intl) classmate us altgr-intl = pc+us(classmate-altgr-intl) nokiarx51 cz qwerty = nokia_vndr/rx-51(cz_qwerty) * $sun_custom $sun_var = pc+sun_vndr/%l%(v) ! model layout = symbols * ar = pc+ara * ben = pc+in(ben) * bs = pc+ba * cs = pc+rs * cz_qwerty = pc+cz(qwerty) * dev = pc+in(deva) * dvorak = pc+us(dvorak) * dzdwi = pc+bt * el = pc+gr * en_US = pc+latin * guj = pc+in(guj) * gur = pc+in(guru) * iu = pc+ca(ike) * lo = pc+la * kan = pc+in(kan) * mi = pc+mao * ogham = pc+ie(ogam) * ori = pc+ie(ori) * sapmi = pc+no(smi) * sr = pc+srp * syr = pc+sy(syc) * tel = pc+in(tel) * tml = pc+in(tam) * yu = pc+srp * fr-latin9 = pc+fr(latin9) * us_intl = pc+us(alt-intl) * ben(basic) = pc+in(ben) * ben(probhat) = pc+in(ben_probhat) * dev(basic) = pc+in(deva) * dvorak($dvoraklayouts) = pc+%v(dvorak) * dvorak(basic) = pc+us(dvorak) * dvorak(pl_basic) = pc+pl(dvorak) * dvorak(pl) = pc+pl(dvorak_quotes) * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes) * dzdwi(basic) = pc+bt(basic) * fi(basic) = pc+fi(classic) * ge(azerty_tskapo) = pc+fr(geo) * guj(basic) = pc+in(guj) * gur(basic) = pc+in(guru) * ie(laptop) = pc+ie(basic) * ie(CloGaelachLaptop) = pc+ie(CloGaelach) * in(urd) = pc+in(urd-phonetic) * iu(basic) = pc+ca(ike) * lo(basic) = pc+la(basic) * kan(basic) = pc+in(kan) * mal(basic) = pc+in(mal) * mal(mlplusnum) = pc+in(mal) * ogham(basic) = pc+ie(ogam) * ogham(laptop) = pc+ie(ogam) * ogham(is434) = pc+ie(ogam_is434) * ogham(is434laptop) = pc+ie(ogam_is434) * ori(basic) = pc+in(ori) * ro(de) = pc+ro(winkeys) * ro(us) = pc+ro(std) * ro(academic) = pc+ro(std) * ro(std_comma) = pc+ro(std) * ro(comma) = pc+ro(basic) * ru(os) = pc+ru(os_legacy) * pk(urd) = pc+pk(urd-phonetic) * sapmi(basic) = pc+no(smi) * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys) * sapmi(sefi) = pc+fi(smi) * sin(phonetic-static) = pc+in(sin_phonetic) * syr(basic) = pc+sy(syc) * syr(phonetic) = pc+sy(syc_phonetic) * tam(INSCRIPT) = pc+in(tam) * tam(UNI) = pc+in(tam_unicode) * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals) * tam(TAB) = pc+in(tam_TAB) * tam(TSCII) = pc+in(tam_TSCII) * tel(basic) = pc+in(tel) * yu(basic) = pc+srp(latin) * yu(unicode) = pc+srp(latinunicode) * yu(yz) = pc+srp(latinyz) * yu(unicodeyz) = pc+srp(latinunicodeyz) ataritt $nonlatin = xfree68_vndr/ataritt(us)+%l%(v):2 ataritt * = xfree68_vndr/ataritt(us)+%l%(v) amiga $nonlatin = xfree68_vndr/amiga(usa1)+%l%(v):2 amiga * = xfree68_vndr/amiga(usa1)+%l%(v) classmate us = pc+%l(classmate) empty * = empty(basic) * empty = empty(basic) jollasbj $nonlatin = jolla_vndr/sbj(common)+us+%l%(v):2 jollasbj * = jolla_vndr/sbj(common)+%l%(v) $sun $sun_custom = pc+sun_vndr/%l%(v) pc98 nec_vndr/jp = nec_vndr/jp(pc98) macintosh_old us = macintosh_vndr/us(oldmac) macintosh_old en_US = macintosh_vndr/us(oldmac) macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l%(v) macintosh_old $nonlatin = macintosh_vndr/us(oldmac)+%l%(v):2 macintosh_old * = macintosh_vndr/us(oldmac)+%l%(v) applealu_jis jp = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)+macintosh_vndr/jp(mac):2 applealu_jis * = macintosh_vndr/apple(alukbd)+%l%(v)+macintosh_vndr/jp(mac):2 $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l%(v) $applealu * = macintosh_vndr/apple(alukbd)+%l%(v) $macs en_US = pc+macintosh_vndr/us(extended) $macs $macvendorlayouts = pc+macintosh_vndr/%l%(v) nokiarx44 * = nokia_vndr/rx-44(%l) nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty) nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l%_v) nokiasu8w * = nokia_vndr/su-8w(%l) olpc $olpclayouts = olpc+%l%(m) olpc * = olpc+%l%(v) olpcm $olpclayouts = olpc+%l%(m) olpcm * = olpc+%l%(v) $thinkpads br = pc+br(thinkpad) sl-c3x00 * = pc+sharp_vndr/sl-c3x00(basic) ws003sh * = pc+sharp_vndr/ws003sh(basic) ws007sh * = pc+sharp_vndr/ws007sh(basic) ws011sh * = pc+sharp_vndr/ws011sh(basic) ws020sh * = pc+sharp_vndr/ws020sh(basic) htcdream $htcdreamlayouts = %l(htcdream) * $nonlatin = pc+us+%l%(v):2 * * = pc+%l%(v) ! model layout[1] = symbols * ar = pc+ara%(v[1]) * ben = pc+in(ben) * bs = pc+ba%(v[1]) * cs = pc+rs%(v[1]) * cz_qwerty = pc+cz(qwerty) * dev = pc+in(deva) * dvorak = pc+us(dvorak) * dzdwi = pc+bt%(v[1]) * el = pc+gr%(v[1]) * en_US = pc+latin%(v[1]) * guj = pc+in(guj) * gur = pc+in(guru) * iu = pc+ca(ike) * lo = pc+la%(v[1]) * kan = pc+in(kan) * mi = pc+mao%(v[1]) * ogham = pc+ie(ogam) * ori = pc+ie(ori) * sapmi = pc+no(smi) * sr = pc+srp%(v[1]) * syr = pc+sy(syc) * tel = pc+in(tel) * tml = pc+in(tam) * yu = pc+srp%(v[1]) * fr-latin9 = pc+fr(latin9) * us_intl = pc+us(alt-intl) * ben(basic) = pc+in(ben) * ben(probhat) = pc+in(ben_probhat) * dev(basic) = pc+in(deva) * dvorak($dvoraklayouts) = pc+%v(dvorak) * dvorak(basic) = pc+us(dvorak) * dvorak(pl_basic) = pc+pl(dvorak) * dvorak(pl) = pc+pl(dvorak_quotes) * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes) * dzdwi(basic) = pc+bt(basic) * fi(basic) = pc+fi(classic) * ge(azerty_tskapo) = pc+fr(geo) * guj(basic) = pc+in(guj) * gur(basic) = pc+in(guru) * ie(laptop) = pc+ie(basic) * ie(CloGaelachLaptop) = pc+ie(CloGaelach) * in(urd) = pc+in(urd-phonetic) * iu(basic) = pc+ca(ike) * lo(basic) = pc+la(basic) * kan(basic) = pc+in(kan) * mal(basic) = pc+in(mal) * mal(mlplusnum) = pc+in(mal) * ogham(basic) = pc+ie(ogam) * ogham(laptop) = pc+ie(ogam) * ogham(is434) = pc+ie(ogam_is434) * ogham(is434laptop) = pc+ie(ogam_is434) * ori(basic) = pc+in(ori) * ro(de) = pc+ro(winkeys) * ro(us) = pc+ro(std) * ro(academic) = pc+ro(std) * ro(std_comma) = pc+ro(std) * ro(comma) = pc+ro(basic) * ru(os) = pc+ru(os_legacy) * pk(urd) = pc+pk(urd-phonetic) * sapmi(basic) = pc+no(smi) * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys) * sapmi(sefi) = pc+fi(smi) * sin(phonetic-static) = pc+in(sin_phonetic) * syr(basic) = pc+sy(syc) * syr(phonetic) = pc+sy(syc_phonetic) * tam(INSCRIPT) = pc+in(tam) * tam(UNI) = pc+in(tam_unicode) * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals) * tam(TAB) = pc+in(tam_TAB) * tam(TSCII) = pc+in(tam_TSCII) * tel(basic) = pc+in(tel) * yu(basic) = pc+srp(latin) * yu(unicode) = pc+srp(latinunicode) * yu(yz) = pc+srp(latinyz) * yu(unicodeyz) = pc+srp(latinunicodeyz) ataritt * = xfree68_vndr/ataritt(us)+%l[1]%(v[1]) amiga * = xfree68_vndr/amiga(usa1)+%l[1]%(v[1]) jollasbj * = jolla_vndr/sbj(common)+%l[1]%(v[1]) $sun $sun_custom = pc+sun_vndr/%l[1]%(v[1]) macintosh_old us = macintosh_vndr/us(oldmac) macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l[1]%(v[1]) macintosh_old * = macintosh_vndr/us(oldmac)+%l[1]%(v[1]) applealu_jis us = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac) $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l[1]%(v[1]) $applealu * = macintosh_vndr/apple(alukbd)+%l[1]%(v[1]) $macs $macvendorlayouts = pc+macintosh_vndr/%l[1]%(v[1]) nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty) nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l[1]%_v[1]) $thinkpads br = pc+%l[1](thinkpad) * * = pc+%l[1]%(v[1]) ! model layout[1] variant[1] = symbols * ben basic = pc+in(ben) * ben probhat = pc+in(ben_probhat) * dev basic = pc+in(deva) * dvorak $dvoraklayouts = pc+%v(dvorak) * dvorak basic = pc+us(dvorak) * dvorak pl_basic = pc+pl(dvorak) * dvorak pl = pc+pl(dvorak_quotes) * dvorak pl_altquotes = pc+pl(dvorak_altquotes) * dzdwi basic = pc+bt(basic) * fi basic = pc+fi(classic) * ge azerty_tskapo = pc+fr(geo) * guj basic = pc+in(guj) * gur basic = pc+in(guru) * ie laptop = pc+ie(basic) * ie CloGaelachLaptop = pc+ie(CloGaelach) * in urd = pc+in(urd-phonetic) * iu basic = pc+ca(ike) * lo basic = pc+la(basic) * kan basic = pc+in(kan) * mal basic = pc+in(mal) * mal mlplusnum = pc+in(mal) * ogham basic = pc+ie(ogam) * ogham laptop = pc+ie(ogam) * ogham is434 = pc+ie(ogam_is434) * ogham is434laptop = pc+ie(ogam_is434) * ori basic = pc+in(ori) * ro de = pc+ro(winkeys) * ro us = pc+ro(std) * ro academic = pc+ro(std) * ro std_comma = pc+ro(std) * ro comma = pc+ro(basic) * ru os = pc+ru(os_legacy) * pk urd = pc+pk(urd-phonetic) * sapmi basic = pc+no(smi) * sapmi nodeadkeys = pc+no(smi_nodeadkeys) * sapmi sefi = pc+fi(smi) * sin phonetic-static = pc+in(sin_phonetic) * syr basic = pc+sy(syc) * syr phonetic = pc+sy(syc_phonetic) * tam INSCRIPT = pc+in(tam) * tam UNI = pc+in(tam_unicode) * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals) * tam TAB = pc+in(tam_TAB) * tam TSCII = pc+in(tam_TSCII) * tel basic = pc+in(tel) * yu basic = pc+srp(latin) * yu unicode = pc+srp(latinunicode) * yu yz = pc+srp(latinyz) * yu unicodeyz = pc+srp(latinunicodeyz) ! model layout[2] = symbols * ar = +ara%(v[2]):2 * ben = +in(ben):2 * bs = +ba%(v[2]):2 * cs = +rs%(v[2]):2 * cz_qwerty = +cz(qwerty):2 * dev = +in(deva):2 * dvorak = +us(dvorak):2 * dzdwi = +bt%(v[2]):2 * el = +gr%(v[2]):2 * en_US = +latin%(v[2]):2 * guj = +in(guj):2 * gur = +in(guru):2 * iu = +ca(ike):2 * lo = +la%(v[2]):2 * kan = +in(kan):2 * mi = +mao%(v[2]):2 * ogham = +ie(ogam):2 * ori = +ie(ori):2 * sapmi = +no(smi):2 * sr = +srp%(v[2]):2 * syr = +sy(syc):2 * tel = +in(tel):2 * tml = +in(tam):2 * yu = +srp%(v[2]):2 * fr-latin9 = +fr(latin9):2 * us_intl = +us(alt-intl):2 * ben(basic) = +in(ben):2 * ben(probhat) = +in(ben_probhat):2 * dev(basic) = +in(deva):2 * dvorak($dvoraklayouts) = +%v(dvorak):2 * dvorak(basic) = +us(dvorak):2 * dvorak(pl_basic) = +pl(dvorak):2 * dvorak(pl) = +pl(dvorak_quotes):2 * dvorak(pl_altquotes) = +pl(dvorak_altquotes):2 * dzdwi(basic) = +bt(basic):2 * fi(basic) = +fi(classic):2 * ge(azerty_tskapo) = +fr(geo):2 * guj(basic) = +in(guj):2 * gur(basic) = +in(guru):2 * ie(laptop) = +ie(basic):2 * ie(CloGaelachLaptop) = +ie(CloGaelach):2 * in(urd) = +in(urd-phonetic):2 * iu(basic) = +ca(ike):2 * lo(basic) = +la(basic):2 * kan(basic) = +in(kan):2 * mal(basic) = +in(mal):2 * mal(mlplusnum) = +in(mal):2 * ogham(basic) = +ie(ogam):2 * ogham(laptop) = +ie(ogam):2 * ogham(is434) = +ie(ogam_is434):2 * ogham(is434laptop) = +ie(ogam_is434):2 * ori(basic) = +in(ori):2 * ro(de) = +ro(winkeys):2 * ro(us) = +ro(std):2 * ro(academic) = +ro(std):2 * ro(std_comma) = +ro(std):2 * ro(comma) = +ro(basic):2 * ru(os) = +ru(os_legacy):2 * pk(urd) = +pk(urd-phonetic):2 * sapmi(basic) = +no(smi):2 * sapmi(nodeadkeys) = +no(smi_nodeadkeys):2 * sapmi(sefi) = +fi(smi):2 * sin(phonetic-static) = +in(sin_phonetic):2 * syr(basic) = +sy(syc):2 * syr(phonetic) = +sy(syc_phonetic):2 * tam(INSCRIPT) = +in(tam):2 * tam(UNI) = +in(tam_unicode):2 * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):2 * tam(TAB) = +in(tam_TAB):2 * tam(TSCII) = +in(tam_TSCII):2 * tel(basic) = +in(tel):2 * yu(basic) = +srp(latin):2 * yu(unicode) = +srp(latinunicode):2 * yu(yz) = +srp(latinyz):2 * yu(unicodeyz) = +srp(latinunicodeyz):2 nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):2 nokiarx51 * = +nokia_vndr/rx-51(%l[2]%_v[2]):2 $sun $sun_custom = +sun_vndr/%l[2]%(v[2]):2 * * = +%l[2]%(v[2]):2 ! model layout[3] = symbols * ar = +ara%(v[3]):3 * ben = +in(ben):3 * bs = +ba%(v[3]):3 * cs = +rs%(v[3]):3 * cz_qwerty = +cz(qwerty):3 * dev = +in(deva):3 * dvorak = +us(dvorak):3 * dzdwi = +bt%(v[3]):3 * el = +gr%(v[3]):3 * en_US = +latin%(v[3]):3 * guj = +in(guj):3 * gur = +in(guru):3 * iu = +ca(ike):3 * lo = +la%(v[3]):3 * kan = +in(kan):3 * mi = +mao%(v[3]):3 * ogham = +ie(ogam):3 * ori = +ie(ori):3 * sapmi = +no(smi):3 * sr = +srp%(v[3]):3 * syr = +sy(syc):3 * tel = +in(tel):3 * tml = +in(tam):3 * yu = +srp%(v[3]):3 * fr-latin9 = +fr(latin9):3 * us_intl = +us(alt-intl):3 * ben(basic) = +in(ben):3 * ben(probhat) = +in(ben_probhat):3 * dev(basic) = +in(deva):3 * dvorak($dvoraklayouts) = +%v(dvorak):3 * dvorak(basic) = +us(dvorak):3 * dvorak(pl_basic) = +pl(dvorak):3 * dvorak(pl) = +pl(dvorak_quotes):3 * dvorak(pl_altquotes) = +pl(dvorak_altquotes):3 * dzdwi(basic) = +bt(basic):3 * fi(basic) = +fi(classic):3 * ge(azerty_tskapo) = +fr(geo):3 * guj(basic) = +in(guj):3 * gur(basic) = +in(guru):3 * ie(laptop) = +ie(basic):3 * ie(CloGaelachLaptop) = +ie(CloGaelach):3 * in(urd) = +in(urd-phonetic):3 * iu(basic) = +ca(ike):3 * lo(basic) = +la(basic):3 * kan(basic) = +in(kan):3 * mal(basic) = +in(mal):3 * mal(mlplusnum) = +in(mal):3 * ogham(basic) = +ie(ogam):3 * ogham(laptop) = +ie(ogam):3 * ogham(is434) = +ie(ogam_is434):3 * ogham(is434laptop) = +ie(ogam_is434):3 * ori(basic) = +in(ori):3 * ro(de) = +ro(winkeys):3 * ro(us) = +ro(std):3 * ro(academic) = +ro(std):3 * ro(std_comma) = +ro(std):3 * ro(comma) = +ro(basic):3 * ru(os) = +ru(os_legacy):3 * pk(urd) = +pk(urd-phonetic):3 * sapmi(basic) = +no(smi):3 * sapmi(nodeadkeys) = +no(smi_nodeadkeys):3 * sapmi(sefi) = +fi(smi):3 * sin(phonetic-static) = +in(sin_phonetic):3 * syr(basic) = +sy(syc):3 * syr(phonetic) = +sy(syc_phonetic):3 * tam(INSCRIPT) = +in(tam):3 * tam(UNI) = +in(tam_unicode):3 * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):3 * tam(TAB) = +in(tam_TAB):3 * tam(TSCII) = +in(tam_TSCII):3 * tel(basic) = +in(tel):3 * yu(basic) = +srp(latin):3 * yu(unicode) = +srp(latinunicode):3 * yu(yz) = +srp(latinyz):3 * yu(unicodeyz) = +srp(latinunicodeyz):3 nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):3 nokiarx51 * = +nokia_vndr/rx-51(%l[3]%_v[3]):3 $sun $sun_custom = +sun_vndr/%l[3]%(v[3]):3 * * = +%l[3]%(v[3]):3 ! model layout[4] = symbols * ar = +ara%(v[4]):4 * ben = +in(ben):4 * bs = +ba%(v[4]):4 * cs = +rs%(v[4]):4 * cz_qwerty = +cz(qwerty):4 * dev = +in(deva):4 * dvorak = +us(dvorak):4 * dzdwi = +bt%(v[4]):4 * el = +gr%(v[4]):4 * en_US = +latin%(v[4]):4 * guj = +in(guj):4 * gur = +in(guru):4 * iu = +ca(ike):4 * lo = +la%(v[4]):4 * kan = +in(kan):4 * mi = +mao%(v[4]):4 * ogham = +ie(ogam):4 * ori = +ie(ori):4 * sapmi = +no(smi):4 * sr = +srp%(v[4]):4 * syr = +sy(syc):4 * tel = +in(tel):4 * tml = +in(tam):4 * yu = +srp%(v[4]):4 * fr-latin9 = +fr(latin9):4 * us_intl = +us(alt-intl):4 * ben(basic) = +in(ben):4 * ben(probhat) = +in(ben_probhat):4 * dev(basic) = +in(deva):4 * dvorak($dvoraklayouts) = +%v(dvorak):4 * dvorak(basic) = +us(dvorak):4 * dvorak(pl_basic) = +pl(dvorak):4 * dvorak(pl) = +pl(dvorak_quotes):4 * dvorak(pl_altquotes) = +pl(dvorak_altquotes):4 * dzdwi(basic) = +bt(basic):4 * fi(basic) = +fi(classic):4 * ge(azerty_tskapo) = +fr(geo):4 * guj(basic) = +in(guj):4 * gur(basic) = +in(guru):4 * ie(laptop) = +ie(basic):4 * ie(CloGaelachLaptop) = +ie(CloGaelach):4 * in(urd) = +in(urd-phonetic):4 * iu(basic) = +ca(ike):4 * lo(basic) = +la(basic):4 * kan(basic) = +in(kan):4 * mal(basic) = +in(mal):4 * mal(mlplusnum) = +in(mal):4 * ogham(basic) = +ie(ogam):4 * ogham(laptop) = +ie(ogam):4 * ogham(is434) = +ie(ogam_is434):4 * ogham(is434laptop) = +ie(ogam_is434):4 * ori(basic) = +in(ori):4 * ro(de) = +ro(winkeys):4 * ro(us) = +ro(std):4 * ro(academic) = +ro(std):4 * ro(std_comma) = +ro(std):4 * ro(comma) = +ro(basic):4 * ru(os) = +ru(os_legacy):4 * pk(urd) = +pk(urd-phonetic):4 * sapmi(basic) = +no(smi):4 * sapmi(nodeadkeys) = +no(smi_nodeadkeys):4 * sapmi(sefi) = +fi(smi):4 * sin(phonetic-static) = +in(sin_phonetic):4 * syr(basic) = +sy(syc):4 * syr(phonetic) = +sy(syc_phonetic):4 * tam(INSCRIPT) = +in(tam):4 * tam(UNI) = +in(tam_unicode):4 * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):4 * tam(TAB) = +in(tam_TAB):4 * tam(TSCII) = +in(tam_TSCII):4 * tel(basic) = +in(tel):4 * yu(basic) = +srp(latin):4 * yu(unicode) = +srp(latinunicode):4 * yu(yz) = +srp(latinyz):4 * yu(unicodeyz) = +srp(latinunicodeyz):4 nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):4 nokiarx51 * = +nokia_vndr/rx-51(%l[4]%_v[4]):4 $sun $sun_custom = +sun_vndr/%l[4]%(v[4]):4 * * = +%l[4]%(v[4]):4 ! model layout[2] variant[2] = symbols * ben basic = +in(ben):2 * ben probhat = +in(ben_probhat):2 * dev basic = +in(deva):2 * dvorak $dvoraklayouts = +%v(dvorak):2 * dvorak basic = +us(dvorak):2 * dvorak pl_basic = +pl(dvorak):2 * dvorak pl = +pl(dvorak_quotes):2 * dvorak pl_altquotes = +pl(dvorak_altquotes):2 * dzdwi basic = +bt(basic):2 * fi basic = +fi(classic):2 * ge azerty_tskapo = +fr(geo):2 * guj basic = +in(guj):2 * gur basic = +in(guru):2 * ie laptop = +ie(basic):2 * ie CloGaelachLaptop = +ie(CloGaelach):2 * in urd = +in(urd-phonetic):2 * iu basic = +ca(ike):2 * lo basic = +la(basic):2 * kan basic = +in(kan):2 * mal basic = +in(mal):2 * mal mlplusnum = +in(mal):2 * ogham basic = +ie(ogam):2 * ogham laptop = +ie(ogam):2 * ogham is434 = +ie(ogam_is434):2 * ogham is434laptop = +ie(ogam_is434):2 * ori basic = +in(ori):2 * ro de = +ro(winkeys):2 * ro us = +ro(std):2 * ro academic = +ro(std):2 * ro std_comma = +ro(std):2 * ro comma = +ro(basic):2 * ru os = +ru(os_legacy):2 * pk urd = +pk(urd-phonetic):2 * sapmi basic = +no(smi):2 * sapmi nodeadkeys = +no(smi_nodeadkeys):2 * sapmi sefi = +fi(smi):2 * sin phonetic-static = +in(sin_phonetic):2 * syr basic = +sy(syc):2 * syr phonetic = +sy(syc_phonetic):2 * tam INSCRIPT = +in(tam):2 * tam UNI = +in(tam_unicode):2 * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):2 * tam TAB = +in(tam_TAB):2 * tam TSCII = +in(tam_TSCII):2 * tel basic = +in(tel):2 * yu basic = +srp(latin):2 * yu unicode = +srp(latinunicode):2 * yu yz = +srp(latinyz):2 * yu unicodeyz = +srp(latinunicodeyz):2 ! model layout[3] variant[3] = symbols * ben basic = +in(ben):3 * ben probhat = +in(ben_probhat):3 * dev basic = +in(deva):3 * dvorak $dvoraklayouts = +%v(dvorak):3 * dvorak basic = +us(dvorak):3 * dvorak pl_basic = +pl(dvorak):3 * dvorak pl = +pl(dvorak_quotes):3 * dvorak pl_altquotes = +pl(dvorak_altquotes):3 * dzdwi basic = +bt(basic):3 * fi basic = +fi(classic):3 * ge azerty_tskapo = +fr(geo):3 * guj basic = +in(guj):3 * gur basic = +in(guru):3 * ie laptop = +ie(basic):3 * ie CloGaelachLaptop = +ie(CloGaelach):3 * in urd = +in(urd-phonetic):3 * iu basic = +ca(ike):3 * lo basic = +la(basic):3 * kan basic = +in(kan):3 * mal basic = +in(mal):3 * mal mlplusnum = +in(mal):3 * ogham basic = +ie(ogam):3 * ogham laptop = +ie(ogam):3 * ogham is434 = +ie(ogam_is434):3 * ogham is434laptop = +ie(ogam_is434):3 * ori basic = +in(ori):3 * ro de = +ro(winkeys):3 * ro us = +ro(std):3 * ro academic = +ro(std):3 * ro std_comma = +ro(std):3 * ro comma = +ro(basic):3 * ru os = +ru(os_legacy):3 * pk urd = +pk(urd-phonetic):3 * sapmi basic = +no(smi):3 * sapmi nodeadkeys = +no(smi_nodeadkeys):3 * sapmi sefi = +fi(smi):3 * sin phonetic-static = +in(sin_phonetic):3 * syr basic = +sy(syc):3 * syr phonetic = +sy(syc_phonetic):3 * tam INSCRIPT = +in(tam):3 * tam UNI = +in(tam_unicode):3 * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):3 * tam TAB = +in(tam_TAB):3 * tam TSCII = +in(tam_TSCII):3 * tel basic = +in(tel):3 * yu basic = +srp(latin):3 * yu unicode = +srp(latinunicode):3 * yu yz = +srp(latinyz):3 * yu unicodeyz = +srp(latinunicodeyz):3 ! model layout[4] variant[4] = symbols * ben basic = +in(ben):4 * ben probhat = +in(ben_probhat):4 * dev basic = +in(deva):4 * dvorak $dvoraklayouts = +%v(dvorak):4 * dvorak basic = +us(dvorak):4 * dvorak pl_basic = +pl(dvorak):4 * dvorak pl = +pl(dvorak_quotes):4 * dvorak pl_altquotes = +pl(dvorak_altquotes):4 * dzdwi basic = +bt(basic):4 * fi basic = +fi(classic):4 * ge azerty_tskapo = +fr(geo):4 * guj basic = +in(guj):4 * gur basic = +in(guru):4 * ie laptop = +ie(basic):4 * ie CloGaelachLaptop = +ie(CloGaelach):4 * in urd = +in(urd-phonetic):4 * iu basic = +ca(ike):4 * lo basic = +la(basic):4 * kan basic = +in(kan):4 * mal basic = +in(mal):4 * mal mlplusnum = +in(mal):4 * ogham basic = +ie(ogam):4 * ogham laptop = +ie(ogam):4 * ogham is434 = +ie(ogam_is434):4 * ogham is434laptop = +ie(ogam_is434):4 * ori basic = +in(ori):4 * ro de = +ro(winkeys):4 * ro us = +ro(std):4 * ro academic = +ro(std):4 * ro std_comma = +ro(std):4 * ro comma = +ro(basic):4 * ru os = +ru(os_legacy):4 * pk urd = +pk(urd-phonetic):4 * sapmi basic = +no(smi):4 * sapmi nodeadkeys = +no(smi_nodeadkeys):4 * sapmi sefi = +fi(smi):4 * sin phonetic-static = +in(sin_phonetic):4 * syr basic = +sy(syc):4 * syr phonetic = +sy(syc_phonetic):4 * tam INSCRIPT = +in(tam):4 * tam UNI = +in(tam_unicode):4 * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):4 * tam TAB = +in(tam_TAB):4 * tam TSCII = +in(tam_TSCII):4 * tel basic = +in(tel):4 * yu basic = +srp(latin):4 * yu unicode = +srp(latinunicode):4 * yu yz = +srp(latinyz):4 * yu unicodeyz = +srp(latinunicodeyz):4 ! model = symbols a4techKB21 = +inet(media_nav_common) a4techKBS8 = +inet(media_nav_acpi_common) a4_rfkb23 = +inet(media_nav_acpi_common) asus_laptop = +inet(media_common) acer_tm_800 = +inet(acer_laptop) benqx730 = +inet(benqx) benqx800 = +inet(benqx) btc5126t = +inet(nav_acpi_common) btc9116u = +inet(btc9019u) btc6301urf = +inet(media_nav_acpi_common) chromebook = +inet(chromebook) dellsk8125 = +inet(dell) dellsk8135 = +inet(dell) cherrybunlim = +inet(nav_common) dexxa = +inet(media_nav_common) dtk2000 = +inet(media_nav_acpi_common) fscaa1667g = +inet(media_nav_common) geniuskb19e = +inet(media_nav_acpi_common) geniuscomfy = +inet(media_nav_acpi_common) geniuskkb2050hs = +inet(dellusbmm) hpnx9020 = +inet(hpi6) latitude = +inet(media_common) logicd = +inet(logitech_base) logicd_it = +inet(logitech_base) logicd_nav = +inet(logitech_base) logicd_opt = +inet(logitech_base) logiultrax = +inet(logitech_base) logiclx300 = +inet(logiex110) logii350 = +inet(logiex110) logimel = +inet(logiex110) logicdit = +inet(logicd) logicdo = +inet(logicd) logicdp = +inet(logicd) logicdpa = +inet(logicda) logiciink = +inet(logicink) ltcd = +inet(logicda) microsoftccurve2k = +inet(microsoftprooem) microsoftpro = +inet(media_nav_acpi_common) precision_m = +inet(media_nav_common) scorpius = +inet(media_nav_acpi_common) sp_inet = +inet(media_nav_acpi_common) targa_v811 = +inet(media_nav_acpi_common) thinkpad = +inet(media_nav_common) thinkpadz60 = +inet(thinkpad60) tm2030USB-102 = +inet(media_nav_acpi_common) tm2030USB-106 = +inet(media_nav_acpi_common) trust_slimline = +inet(media_nav_acpi_common) vsonku306 = +inet(microsoftprooem) $inetkbds = +inet(%m) $maclaptop = +inet(apple)+level3(enter_switch) $applealu = +inet(apple) $macs = +inet(apple) sun_type7_jp_usb = +sun_vndr/solaris(defaults_type7jp) $sun = +sun_vndr/solaris(defaults) ! model layout = symbols $inetmediakbds jp = +jp(henkan) ! layout variant = compat de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de adnw = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de koy = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de bone = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de bone_eszett_home = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de neo_qwertz = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de neo_qwerty = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) jp $sun_compat = complete+japan(kana_lock) ! layout[1] variant[1] = compat de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de adnw = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de koy = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de bone = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de bone_eszett_home = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de neo_qwertz = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de neo_qwerty = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) jp $sun_compat = complete+japan(kana_lock) ! layout[2] variant[2] = compat de neo = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de adnw = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de koy = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de bone = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de bone_eszett_home = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de neo_qwertz = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de neo_qwerty = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 jp $sun_compat = +complete+japan(kana_lock):2 ! layout[3] variant[3] = compat de neo = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de adnw = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de koy = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de bone = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de bone_eszett_home = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de neo_qwertz = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de neo_qwerty = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 jp $sun_compat = +complete+japan(kana_lock):3 ! layout[4] variant[4] = compat de neo = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de adnw = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de koy = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de bone = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de bone_eszett_home = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de neo_qwertz = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de neo_qwerty = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 jp $sun_compat = +complete+japan(kana_lock):4 ! model layout = compat pc98 nec_vndr/jp = pc98(basic) * jp = complete+japan olpc * = olpc olpcm * = olpc * * = complete ! model layout[1] = compat * * = complete ! model = types $macs = complete+numpad(mac) $applealu = complete+numpad(mac) $nokiamodels = complete+nokia * = complete ! layout option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle) * misc:typo = +typo(base) ! layout[1] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):1 * misc:typo = +typo(base):1 ! layout[2] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):2 * misc:typo = +typo(base):2 ! layout[3] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):3 * misc:typo = +typo(base):3 ! layout[4] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):4 * misc:typo = +typo(base):4 ! option = symbols grp:shift_toggle = +group(shifts_toggle) altwin:menu = +altwin(menu) altwin:meta_alt = +altwin(meta_alt) altwin:alt_win = +altwin(alt_win) altwin:ctrl_win = +altwin(ctrl_win) altwin:ctrl_alt_win = +altwin(ctrl_alt_win) altwin:meta_win = +altwin(meta_win) altwin:left_meta_win = +altwin(left_meta_win) altwin:hyper_win = +altwin(hyper_win) altwin:alt_super_win = +altwin(alt_super_win) altwin:swap_lalt_lwin = +altwin(swap_lalt_lwin) altwin:swap_alt_win = +altwin(swap_alt_win) altwin:prtsc_rwin = +altwin(prtsc_rwin) grab:debug = +srvr_ctrl(grab_debug) grp:switch = +group(switch) grp:lswitch = +group(lswitch) grp:win_switch = +group(win_switch) grp:lwin_switch = +group(lwin_switch) grp:rwin_switch = +group(rwin_switch) grp:menu_switch = +group(menu_switch) grp:toggle = +group(toggle) grp:shifts_toggle = +group(shifts_toggle) grp:ctrls_toggle = +group(ctrls_toggle) grp:alts_toggle = +group(alts_toggle) grp:caps_toggle = +capslock(grouplock) grp:caps_switch = +capslock(groupshift) grp:shift_caps_toggle = +group(shift_caps_toggle) grp:shift_caps_switch = +group(shift_caps_switch) grp:win_space_toggle = +group(win_space_toggle) grp:win_menu_switch = +group(win_menu_switch) grp:alt_caps_toggle = +group(alt_caps_toggle) grp:alt_space_toggle = +group(alt_space_toggle) grp:menu_toggle = +group(menu_toggle) grp:lwin_toggle = +group(lwin_toggle) grp:rwin_toggle = +group(rwin_toggle) grp:lshift_toggle = +group(lshift_toggle) grp:rshift_toggle = +group(rshift_toggle) grp:rctrl_switch = +group(rctrl_switch) grp:lctrl_toggle = +group(lctrl_toggle) grp:rctrl_toggle = +group(rctrl_toggle) grp:lalt_toggle = +group(lalt_toggle) grp:sclk_toggle = +group(sclk_toggle) grp:lctrl_rctrl_switch = +group(lctrl_rctrl_switch) grp:lctrl_lwin_rctrl_menu = +group(lctrl_lwin_rctrl_menu) grp:lctrl_lalt_toggle = +group(lctrl_lalt_toggle) grp:rctrl_ralt_toggle = +group(rctrl_ralt_toggle) grp:ctrl_alt_toggle = +group(ctrl_alt_toggle) grp:ctrl_alt_toggle_bidir = +group(ctrl_alt_toggle_bidir) grp:lctrl_lshift_toggle = +group(lctrl_lshift_toggle) grp:rctrl_rshift_toggle = +group(rctrl_rshift_toggle) grp:ctrl_shift_toggle = +group(ctrl_shift_toggle) grp:ctrl_shift_toggle_bidir = +group(ctrl_shift_toggle_bidir) grp:lalt_lshift_toggle = +group(lalt_lshift_toggle) grp:ralt_rshift_toggle = +group(ralt_rshift_toggle) grp:alt_shift_toggle = +group(alt_shift_toggle) grp:alt_shift_toggle_bidir = +group(alt_shift_toggle_bidir) grp:lctrl_lwin_toggle = +group(lctrl_lwin_toggle) lv3:switch = +level3(switch) lv3:ralt_switch = +level3(ralt_switch) lv3:ralt_switch_multikey = +level3(ralt_switch_multikey) lv3:ralt_alt = +level3(ralt_alt) lv3:lalt_switch = +level3(lalt_switch) lv3:alt_switch = +level3(alt_switch) lv3:menu_switch = +level3(menu_switch) lv3:win_switch = +level3(win_switch) lv3:lwin_switch = +level3(lwin_switch) lv3:rwin_switch = +level3(rwin_switch) lv3:enter_switch = +level3(enter_switch) caps:capslock = +capslock(capslock) caps:numlock = +capslock(numlock) caps:shiftlock = +capslock(shiftlock) caps:swapescape = +capslock(swapescape) caps:escape = +capslock(escape) caps:backspace = +capslock(backspace) caps:super = +capslock(super) caps:hyper = +capslock(hyper) caps:menu = +capslock(menu) caps:none = +capslock(none) caps:ctrl_modifier = +capslock(ctrl_modifier) ctrl:nocaps = +ctrl(nocaps) ctrl:lctrl_meta = +ctrl(lctrl_meta) ctrl:swapcaps = +ctrl(swapcaps) ctrl:ac_ctrl = +ctrl(ac_ctrl) ctrl:aa_ctrl = +ctrl(aa_ctrl) ctrl:rctrl_ralt = +ctrl(rctrl_ralt) ctrl:menu_rctrl = +ctrl(menu_rctrl) ctrl:ralt_rctrl = +ctrl(ralt_rctrl) ctrl:swap_lalt_lctl = +ctrl(swap_lalt_lctl) ctrl:swap_lwin_lctl = +ctrl(swap_lwin_lctl) ctrl:swap_rwin_rctl = +ctrl(swap_rwin_rctl) ctrl:swap_lalt_lctl_lwin = +ctrl(swap_lalt_lctl_lwin) compose:ralt = +compose(ralt) compose:lwin = +compose(lwin) compose:lwin-altgr = +compose(lwin-altgr) compose:rwin = +compose(rwin) compose:rwin-altgr = +compose(rwin-altgr) compose:menu = +compose(menu) compose:menu-altgr = +compose(menu-altgr) compose:lctrl = +compose(lctrl) compose:lctrl-altgr = +compose(lctrl-altgr) compose:rctrl = +compose(rctrl) compose:rctrl-altgr = +compose(rctrl-altgr) compose:caps = +compose(caps) compose:caps-altgr = +compose(caps-altgr) compose:102 = +compose(102) compose:102-altgr = +compose(102-altgr) compose:paus = +compose(paus) compose:prsc = +compose(prsc) compose:sclk = +compose(sclk) srvrkeys:none = +srvr_ctrl(no_srvr_keys) eurosign:e = +eurosign(e) eurosign:2 = +eurosign(2) eurosign:4 = +eurosign(4) eurosign:5 = +eurosign(5) rupeesign:4 = +rupeesign(4) keypad:oss = +keypad(oss) keypad:legacy = +keypad(legacy) keypad:legacy_wang = +keypad(legacy_wang) keypad:oss_wang = +keypad(oss_wang) keypad:future = +keypad(future) keypad:future_wang = +keypad(future_wang) keypad:hex = +keypad(ops)+keypad(hex) keypad:atm = +keypad(ops)+keypad(hex)+keypad(atm) nbsp:none = +nbsp(none) nbsp:level2 = +nbsp(level2) nbsp:level3 = +nbsp(level3) nbsp:level3s = +nbsp(level3s) nbsp:level3n = +nbsp(level3n) nbsp:level4 = +nbsp(level4) nbsp:level4n = +nbsp(level4n) nbsp:level4nl = +nbsp(level4nl) japan:nicola_f_bs = +jp(nicola_f_bs) japan:hztg_escape = +jp(hztg_escape) korean:ralt_rctrl = +kr(ralt_hangul)+kr(rctrl_hanja) korean:rctrl_ralt = +kr(rctrl_hangul)+kr(ralt_hanja) kpdl:dot = +kpdl(dot) kpdl:comma = +kpdl(comma) kpdl:dotoss = +kpdl(dotoss) kpdl:dotoss_latin9 = +kpdl(dotoss_latin9) kpdl:commaoss = +kpdl(commaoss) kpdl:momayyezoss = +kpdl(momayyezoss) kpdl:kposs = +kpdl(kposs) kpdl:semi = +kpdl(semi) shift:breaks_caps = +shift(breaks_caps) esperanto:qwerty = +epo(qwerty) esperanto:dvorak = +epo(dvorak) esperanto:colemak = +epo(colemak) terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp) keypad:pointerkeys = +keypad(pointerkeys) apple:alupckeys = +macintosh_vndr/apple(alupckeys) shift:both_capslock = +shift(both_capslock) shift:lshift_both_capslock = +shift(lshift_both_capslock) shift:rshift_both_capslock = +shift(rshift_both_capslock) shift:both_capslock_cancel = +shift(both_capslock_cancel) shift:lshift_both_capslock_cancel = +shift(lshift_both_capslock_cancel) shift:rshift_both_capslock_cancel = +shift(rshift_both_capslock_cancel) shift:both_shiftlock = +shift(both_shiftlock) shift:lshift_both_shiftlock = +shift(lshift_both_shiftlock) shift:rshift_both_shiftlock = +shift(rshift_both_shiftlock) solaris:sun_compat = +sun_vndr/solaris(sun_compat) lv3:caps_switch = +level3(caps_switch) lv3:bksl_switch = +level3(bksl_switch) lv3:lsgt_switch = +level3(lsgt_switch) lv3:caps_switch_latch = +level3(caps_switch_latch) lv3:bksl_switch_latch = +level3(bksl_switch_latch) lv3:lsgt_switch_latch = +level3(lsgt_switch_latch) lv5:lsgt_switch_lock = +level5(lsgt_switch_lock) lv5:ralt_switch_lock = +level5(ralt_switch_lock) lv5:lwin_switch_lock = +level5(lwin_switch_lock) lv5:rwin_switch_lock = +level5(rwin_switch_lock) lv5:lsgt_switch_lock_cancel = +level5(lsgt_switch_lock_cancel) lv5:ralt_switch_lock_cancel = +level5(ralt_switch_lock_cancel) lv5:lwin_switch_lock_cancel = +level5(lwin_switch_lock_cancel) lv5:rwin_switch_lock_cancel = +level5(rwin_switch_lock_cancel) parens:swap_brackets = +parens(swap_brackets) ! option = compat grp_led:num = +lednum(group_lock) grp_led:caps = +ledcaps(group_lock) grp_led:scroll = +ledscroll(group_lock) japan:kana_lock = +japan(kana_lock) caps:shiftlock = +ledcaps(shift_lock) grab:break_actions = +xfree86(grab_break) ! option = types caps:internal = +caps(internal) caps:internal_nocancel = +caps(internal_nocancel) caps:shift = +caps(shift) caps:shift_nocancel = +caps(shift_nocancel) numpad:pc = +numpad(pc) numpad:mac = +numpad(mac) numpad:microsoft = +numpad(microsoft) numpad:shift3 = +numpad(shift3) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7253134 libxkbcommon-0.10.0/test/data/rules/evdev0000644000175000017500000012400600000000000017720 0ustar00ranran00000000000000// DO NOT EDIT THIS FILE - IT WAS AUTOGENERATED BY merge.sh FROM rules/*.part // // Rules for resolving XKB components for use with XFree86 // Copyright 1996 by Joseph Moss // // 2002 Modifier: Ivan Pascal The XFree86 Project // // If you want non-latin layouts implicitly include the en_US layout // uncomment lines below //! $nonlatin = am ara ben bd bg bt by cs deva ge gh gr guj guru il \ // in ir iku jp kan kh kr la lao lk mk mm mn mv mal olck \ // ori pk ru scc sy syr tel th tj tam ua uz // PC models ! $pcmodels = pc101 pc102 pc104 pc105 // Jolla devices and keyboards ! $jollamodels = jollasbj // Microsoft models (using MS geometry) ! $msmodels = microsoft microsoft4000 microsoft7000 microsoftpro microsoftprousb microsoftprose // Nokia devices and keyboards ! $nokiamodels = nokiasu8w nokiarx44 nokiarx51 // PC geometries - they have special geometry but symbols are mostly pc105 ! $pcgeometries = latitude // TypeMatrix geometries ! $tmgeometries = tm2020 tm2030PS2 tm2030USB tm2030USB-102 tm2030USB-106 // Layouts that provide further specializations for the OLPC ! $olpclayouts = af am ara br ca es et fr it kh kz in mn np ru th tr us ! $macbooks = macbook78 macbook79 ! $maclaptop = ibook powerbook macbook78 macbook79 ! $applealu = applealu_ansi applealu_iso applealu_jis ! $macs = macintosh macintosh_old ibook powerbook macbook78 macbook79 ! $macvendorlayouts = ch de dk fi fr gb is it latam nl no pt se us ! $azerty = be fr ! $qwertz = al cz de hr hu ro si sk // all layouts with 3rd and 4th groups ! $threelevellayouts = al az \ be br bt \ ca ch cs cz \ de dk \ ee es \ fi fo fr \ gb gr \ hu \ ie ir is it \ latam \ lk lt \ mn mt \ nl no \ pl pt \ ro \ se sk \ tr \ us \ vn \ za ! $thinkpads = thinkpad thinkpad60 thinkpadz60 ! $sun = sun_type6_jp sun_type6_usb sun_type6_euro_usb \ sun_type6_jp_usb sun_type6_unix_usb sun_type7_jp_usb \ sun_type7_usb sun_type7_euro_usb sun_type7_unix_usb ! $sun_jp = sun_type6_jp sun_type6_jp_usb sun_type7_jp_usb // Sun Type_6_7 keyboards with custom layouts ! $sun_custom = ara be br ca ch cz de dk \ ee es fi fr gb gr it jp \ kr lt lv nl no pl pt ro \ ru se sk tr tw ua us ! $sun_var = sun_type6 sun_type6_suncompat sun_type6_de sun_type6_fr \ sun_type7 sun_type7_suncompat suncompat ! $sun_compat = sun_type6 sun_type6_suncompat sun_type7_suncompat suncompat ! $htcdreamlayouts = us it de ! $evdevkbds = ibm_spacesaver ! $dvoraklayouts = br ca de ee es fr gb no pl se us ! model = keycodes pc98 = evdev(pc98) applealu_jis = evdev+macintosh(jisevdev) $jollamodels = evdev+jolla(jolla) olpc = evdev+olpc(olpc) olpcm = evdev+olpc(olpcm) * = evdev ! layout[1] = keycodes $azerty = +aliases(azerty) $qwertz = +aliases(qwertz) * = +aliases(qwerty) ! layout = keycodes $azerty = +aliases(azerty) $qwertz = +aliases(qwertz) * = +aliases(qwerty) ! option = keycodes ! model layout = geometry thinkpad us = thinkpad(us) ! model = geometry microsoftelite = microsoft(elite) $msmodels = microsoft(natural) dell101 = dell(dell101) dellm65 = dell(dellm65) latitude = dell(latitude) flexpro = keytronic(FlexPro) hp6000 = hp(omnibook) hpmini110 = hp(mini110) hpdv5 = hp(dv5) omnikey101 = northgate(omnikey101) sanwaskbkg3 = sanwa(sanwaskbkg3) $pcmodels = pc(%m) $pcgeometries = pc(%m) everex = everex(STEPnote) thinkpad = thinkpad(intl) thinkpad60 = thinkpad(60) thinkpadz60 = thinkpad(60) apex300 = steelseries(apex300) $tmgeometries = typematrix(%m) winbook = winbook(XP5) pc98 = nec(pc98) $applealu = macintosh(%m) $macbooks = macintosh(%m) $macs = macintosh(macintosh) hhk = hhk(basic) kinesis = kinesis(model100) $nokiamodels = nokia(%m) sun_type6_jp = sun(type6jp) sun_type6_usb = sun(type6) sun_type6_euro_usb = sun(type6tuv) sun_type6_jp_usb = sun(type6jp) sun_type6_unix_usb = sun(type6unix) sun_type7_jp_usb = sun(type6jp) sun_type7_usb = sun(type7) sun_type7_euro_usb = sun(type7tuv) sun_type7_unix_usb = sun(type7unix) * = pc(pc104) ! model layout variant = symbols * ben basic = pc+in(ben) * ben probhat = pc+in(ben_probhat) * dev basic = pc+in(deva) * dvorak $dvoraklayouts = pc+%v(dvorak) * dvorak basic = pc+us(dvorak) * dvorak pl_basic = pc+pl(dvorak) * dvorak pl = pc+pl(dvorak_quotes) * dvorak pl_altquotes = pc+pl(dvorak_altquotes) * dzdwi basic = pc+bt(basic) * fi basic = pc+fi(classic) * ge azerty_tskapo = pc+fr(geo) * guj basic = pc+in(guj) * gur basic = pc+in(guru) * ie laptop = pc+ie(basic) * ie CloGaelachLaptop = pc+ie(CloGaelach) * in urd = pc+in(urd-phonetic) * iu basic = pc+ca(ike) * lo basic = pc+la(basic) * kan basic = pc+in(kan) * mal basic = pc+in(mal) * mal mlplusnum = pc+in(mal) * ogham basic = pc+ie(ogam) * ogham laptop = pc+ie(ogam) * ogham is434 = pc+ie(ogam_is434) * ogham is434laptop = pc+ie(ogam_is434) * ori basic = pc+in(ori) * ro de = pc+ro(winkeys) * ro us = pc+ro(std) * ro academic = pc+ro(std) * ro std_comma = pc+ro(std) * ro comma = pc+ro(basic) * ru os = pc+ru(os_legacy) * pk urd = pc+pk(urd-phonetic) * sapmi basic = pc+no(smi) * sapmi nodeadkeys = pc+no(smi_nodeadkeys) * sapmi sefi = pc+fi(smi) * sin phonetic-static = pc+in(sin_phonetic) * syr basic = pc+sy(syc) * syr phonetic = pc+sy(syc_phonetic) * tam INSCRIPT = pc+in(tam) * tam UNI = pc+in(tam_unicode) * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals) * tam TAB = pc+in(tam_TAB) * tam TSCII = pc+in(tam_TSCII) * tel basic = pc+in(tel) * yu basic = pc+srp(latin) * yu unicode = pc+srp(latinunicode) * yu yz = pc+srp(latinyz) * yu unicodeyz = pc+srp(latinunicodeyz) classmate us intl = pc+us(classmate-intl) classmate us alt-intl = pc+us(classmate-alt-intl) classmate us altgr-intl = pc+us(classmate-altgr-intl) nokiarx51 cz qwerty = nokia_vndr/rx-51(cz_qwerty) * $sun_custom $sun_var = pc+sun_vndr/%l%(v) ! model layout = symbols * ar = pc+ara * ben = pc+in(ben) * bs = pc+ba * cs = pc+rs * cz_qwerty = pc+cz(qwerty) * dev = pc+in(deva) * dvorak = pc+us(dvorak) * dzdwi = pc+bt * el = pc+gr * en_US = pc+latin * guj = pc+in(guj) * gur = pc+in(guru) * iu = pc+ca(ike) * lo = pc+la * kan = pc+in(kan) * mi = pc+mao * ogham = pc+ie(ogam) * ori = pc+ie(ori) * sapmi = pc+no(smi) * sr = pc+srp * syr = pc+sy(syc) * tel = pc+in(tel) * tml = pc+in(tam) * yu = pc+srp * fr-latin9 = pc+fr(latin9) * us_intl = pc+us(alt-intl) * ben(basic) = pc+in(ben) * ben(probhat) = pc+in(ben_probhat) * dev(basic) = pc+in(deva) * dvorak($dvoraklayouts) = pc+%v(dvorak) * dvorak(basic) = pc+us(dvorak) * dvorak(pl_basic) = pc+pl(dvorak) * dvorak(pl) = pc+pl(dvorak_quotes) * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes) * dzdwi(basic) = pc+bt(basic) * fi(basic) = pc+fi(classic) * ge(azerty_tskapo) = pc+fr(geo) * guj(basic) = pc+in(guj) * gur(basic) = pc+in(guru) * ie(laptop) = pc+ie(basic) * ie(CloGaelachLaptop) = pc+ie(CloGaelach) * in(urd) = pc+in(urd-phonetic) * iu(basic) = pc+ca(ike) * lo(basic) = pc+la(basic) * kan(basic) = pc+in(kan) * mal(basic) = pc+in(mal) * mal(mlplusnum) = pc+in(mal) * ogham(basic) = pc+ie(ogam) * ogham(laptop) = pc+ie(ogam) * ogham(is434) = pc+ie(ogam_is434) * ogham(is434laptop) = pc+ie(ogam_is434) * ori(basic) = pc+in(ori) * ro(de) = pc+ro(winkeys) * ro(us) = pc+ro(std) * ro(academic) = pc+ro(std) * ro(std_comma) = pc+ro(std) * ro(comma) = pc+ro(basic) * ru(os) = pc+ru(os_legacy) * pk(urd) = pc+pk(urd-phonetic) * sapmi(basic) = pc+no(smi) * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys) * sapmi(sefi) = pc+fi(smi) * sin(phonetic-static) = pc+in(sin_phonetic) * syr(basic) = pc+sy(syc) * syr(phonetic) = pc+sy(syc_phonetic) * tam(INSCRIPT) = pc+in(tam) * tam(UNI) = pc+in(tam_unicode) * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals) * tam(TAB) = pc+in(tam_TAB) * tam(TSCII) = pc+in(tam_TSCII) * tel(basic) = pc+in(tel) * yu(basic) = pc+srp(latin) * yu(unicode) = pc+srp(latinunicode) * yu(yz) = pc+srp(latinyz) * yu(unicodeyz) = pc+srp(latinunicodeyz) ataritt $nonlatin = xfree68_vndr/ataritt(us)+%l%(v):2 ataritt * = xfree68_vndr/ataritt(us)+%l%(v) amiga $nonlatin = xfree68_vndr/amiga(usa1)+%l%(v):2 amiga * = xfree68_vndr/amiga(usa1)+%l%(v) classmate us = pc+%l(classmate) empty * = empty(basic) * empty = empty(basic) jollasbj $nonlatin = jolla_vndr/sbj(common)+us+%l%(v):2 jollasbj * = jolla_vndr/sbj(common)+%l%(v) $sun $sun_custom = pc+sun_vndr/%l%(v) pc98 nec_vndr/jp = nec_vndr/jp(pc98) macintosh_old us = macintosh_vndr/us(oldmac) macintosh_old en_US = macintosh_vndr/us(oldmac) macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l%(v) macintosh_old $nonlatin = macintosh_vndr/us(oldmac)+%l%(v):2 macintosh_old * = macintosh_vndr/us(oldmac)+%l%(v) applealu_jis jp = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)+macintosh_vndr/jp(mac):2 applealu_jis * = macintosh_vndr/apple(alukbd)+%l%(v)+macintosh_vndr/jp(mac):2 $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l%(v) $applealu * = macintosh_vndr/apple(alukbd)+%l%(v) $macs en_US = pc+macintosh_vndr/us(extended) $macs $macvendorlayouts = pc+macintosh_vndr/%l%(v) nokiarx44 * = nokia_vndr/rx-44(%l) nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty) nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l%_v) nokiasu8w * = nokia_vndr/su-8w(%l) olpc $olpclayouts = olpc+%l%(m) olpc * = olpc+%l%(v) olpcm $olpclayouts = olpc+%l%(m) olpcm * = olpc+%l%(v) $thinkpads br = pc+br(thinkpad) sl-c3x00 * = pc+sharp_vndr/sl-c3x00(basic) ws003sh * = pc+sharp_vndr/ws003sh(basic) ws007sh * = pc+sharp_vndr/ws007sh(basic) ws011sh * = pc+sharp_vndr/ws011sh(basic) ws020sh * = pc+sharp_vndr/ws020sh(basic) htcdream $htcdreamlayouts = %l(htcdream) * $nonlatin = pc+us+%l%(v):2 * * = pc+%l%(v) ! model layout[1] = symbols * ar = pc+ara%(v[1]) * ben = pc+in(ben) * bs = pc+ba%(v[1]) * cs = pc+rs%(v[1]) * cz_qwerty = pc+cz(qwerty) * dev = pc+in(deva) * dvorak = pc+us(dvorak) * dzdwi = pc+bt%(v[1]) * el = pc+gr%(v[1]) * en_US = pc+latin%(v[1]) * guj = pc+in(guj) * gur = pc+in(guru) * iu = pc+ca(ike) * lo = pc+la%(v[1]) * kan = pc+in(kan) * mi = pc+mao%(v[1]) * ogham = pc+ie(ogam) * ori = pc+ie(ori) * sapmi = pc+no(smi) * sr = pc+srp%(v[1]) * syr = pc+sy(syc) * tel = pc+in(tel) * tml = pc+in(tam) * yu = pc+srp%(v[1]) * fr-latin9 = pc+fr(latin9) * us_intl = pc+us(alt-intl) * ben(basic) = pc+in(ben) * ben(probhat) = pc+in(ben_probhat) * dev(basic) = pc+in(deva) * dvorak($dvoraklayouts) = pc+%v(dvorak) * dvorak(basic) = pc+us(dvorak) * dvorak(pl_basic) = pc+pl(dvorak) * dvorak(pl) = pc+pl(dvorak_quotes) * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes) * dzdwi(basic) = pc+bt(basic) * fi(basic) = pc+fi(classic) * ge(azerty_tskapo) = pc+fr(geo) * guj(basic) = pc+in(guj) * gur(basic) = pc+in(guru) * ie(laptop) = pc+ie(basic) * ie(CloGaelachLaptop) = pc+ie(CloGaelach) * in(urd) = pc+in(urd-phonetic) * iu(basic) = pc+ca(ike) * lo(basic) = pc+la(basic) * kan(basic) = pc+in(kan) * mal(basic) = pc+in(mal) * mal(mlplusnum) = pc+in(mal) * ogham(basic) = pc+ie(ogam) * ogham(laptop) = pc+ie(ogam) * ogham(is434) = pc+ie(ogam_is434) * ogham(is434laptop) = pc+ie(ogam_is434) * ori(basic) = pc+in(ori) * ro(de) = pc+ro(winkeys) * ro(us) = pc+ro(std) * ro(academic) = pc+ro(std) * ro(std_comma) = pc+ro(std) * ro(comma) = pc+ro(basic) * ru(os) = pc+ru(os_legacy) * pk(urd) = pc+pk(urd-phonetic) * sapmi(basic) = pc+no(smi) * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys) * sapmi(sefi) = pc+fi(smi) * sin(phonetic-static) = pc+in(sin_phonetic) * syr(basic) = pc+sy(syc) * syr(phonetic) = pc+sy(syc_phonetic) * tam(INSCRIPT) = pc+in(tam) * tam(UNI) = pc+in(tam_unicode) * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals) * tam(TAB) = pc+in(tam_TAB) * tam(TSCII) = pc+in(tam_TSCII) * tel(basic) = pc+in(tel) * yu(basic) = pc+srp(latin) * yu(unicode) = pc+srp(latinunicode) * yu(yz) = pc+srp(latinyz) * yu(unicodeyz) = pc+srp(latinunicodeyz) ataritt * = xfree68_vndr/ataritt(us)+%l[1]%(v[1]) amiga * = xfree68_vndr/amiga(usa1)+%l[1]%(v[1]) jollasbj * = jolla_vndr/sbj(common)+%l[1]%(v[1]) $sun $sun_custom = pc+sun_vndr/%l[1]%(v[1]) macintosh_old us = macintosh_vndr/us(oldmac) macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l[1]%(v[1]) macintosh_old * = macintosh_vndr/us(oldmac)+%l[1]%(v[1]) applealu_jis us = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac) $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l[1]%(v[1]) $applealu * = macintosh_vndr/apple(alukbd)+%l[1]%(v[1]) $macs $macvendorlayouts = pc+macintosh_vndr/%l[1]%(v[1]) nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty) nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l[1]%_v[1]) $thinkpads br = pc+%l[1](thinkpad) * * = pc+%l[1]%(v[1]) ! model layout[1] variant[1] = symbols * ben basic = pc+in(ben) * ben probhat = pc+in(ben_probhat) * dev basic = pc+in(deva) * dvorak $dvoraklayouts = pc+%v(dvorak) * dvorak basic = pc+us(dvorak) * dvorak pl_basic = pc+pl(dvorak) * dvorak pl = pc+pl(dvorak_quotes) * dvorak pl_altquotes = pc+pl(dvorak_altquotes) * dzdwi basic = pc+bt(basic) * fi basic = pc+fi(classic) * ge azerty_tskapo = pc+fr(geo) * guj basic = pc+in(guj) * gur basic = pc+in(guru) * ie laptop = pc+ie(basic) * ie CloGaelachLaptop = pc+ie(CloGaelach) * in urd = pc+in(urd-phonetic) * iu basic = pc+ca(ike) * lo basic = pc+la(basic) * kan basic = pc+in(kan) * mal basic = pc+in(mal) * mal mlplusnum = pc+in(mal) * ogham basic = pc+ie(ogam) * ogham laptop = pc+ie(ogam) * ogham is434 = pc+ie(ogam_is434) * ogham is434laptop = pc+ie(ogam_is434) * ori basic = pc+in(ori) * ro de = pc+ro(winkeys) * ro us = pc+ro(std) * ro academic = pc+ro(std) * ro std_comma = pc+ro(std) * ro comma = pc+ro(basic) * ru os = pc+ru(os_legacy) * pk urd = pc+pk(urd-phonetic) * sapmi basic = pc+no(smi) * sapmi nodeadkeys = pc+no(smi_nodeadkeys) * sapmi sefi = pc+fi(smi) * sin phonetic-static = pc+in(sin_phonetic) * syr basic = pc+sy(syc) * syr phonetic = pc+sy(syc_phonetic) * tam INSCRIPT = pc+in(tam) * tam UNI = pc+in(tam_unicode) * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals) * tam TAB = pc+in(tam_TAB) * tam TSCII = pc+in(tam_TSCII) * tel basic = pc+in(tel) * yu basic = pc+srp(latin) * yu unicode = pc+srp(latinunicode) * yu yz = pc+srp(latinyz) * yu unicodeyz = pc+srp(latinunicodeyz) ! model layout[2] = symbols * ar = +ara%(v[2]):2 * ben = +in(ben):2 * bs = +ba%(v[2]):2 * cs = +rs%(v[2]):2 * cz_qwerty = +cz(qwerty):2 * dev = +in(deva):2 * dvorak = +us(dvorak):2 * dzdwi = +bt%(v[2]):2 * el = +gr%(v[2]):2 * en_US = +latin%(v[2]):2 * guj = +in(guj):2 * gur = +in(guru):2 * iu = +ca(ike):2 * lo = +la%(v[2]):2 * kan = +in(kan):2 * mi = +mao%(v[2]):2 * ogham = +ie(ogam):2 * ori = +ie(ori):2 * sapmi = +no(smi):2 * sr = +srp%(v[2]):2 * syr = +sy(syc):2 * tel = +in(tel):2 * tml = +in(tam):2 * yu = +srp%(v[2]):2 * fr-latin9 = +fr(latin9):2 * us_intl = +us(alt-intl):2 * ben(basic) = +in(ben):2 * ben(probhat) = +in(ben_probhat):2 * dev(basic) = +in(deva):2 * dvorak($dvoraklayouts) = +%v(dvorak):2 * dvorak(basic) = +us(dvorak):2 * dvorak(pl_basic) = +pl(dvorak):2 * dvorak(pl) = +pl(dvorak_quotes):2 * dvorak(pl_altquotes) = +pl(dvorak_altquotes):2 * dzdwi(basic) = +bt(basic):2 * fi(basic) = +fi(classic):2 * ge(azerty_tskapo) = +fr(geo):2 * guj(basic) = +in(guj):2 * gur(basic) = +in(guru):2 * ie(laptop) = +ie(basic):2 * ie(CloGaelachLaptop) = +ie(CloGaelach):2 * in(urd) = +in(urd-phonetic):2 * iu(basic) = +ca(ike):2 * lo(basic) = +la(basic):2 * kan(basic) = +in(kan):2 * mal(basic) = +in(mal):2 * mal(mlplusnum) = +in(mal):2 * ogham(basic) = +ie(ogam):2 * ogham(laptop) = +ie(ogam):2 * ogham(is434) = +ie(ogam_is434):2 * ogham(is434laptop) = +ie(ogam_is434):2 * ori(basic) = +in(ori):2 * ro(de) = +ro(winkeys):2 * ro(us) = +ro(std):2 * ro(academic) = +ro(std):2 * ro(std_comma) = +ro(std):2 * ro(comma) = +ro(basic):2 * ru(os) = +ru(os_legacy):2 * pk(urd) = +pk(urd-phonetic):2 * sapmi(basic) = +no(smi):2 * sapmi(nodeadkeys) = +no(smi_nodeadkeys):2 * sapmi(sefi) = +fi(smi):2 * sin(phonetic-static) = +in(sin_phonetic):2 * syr(basic) = +sy(syc):2 * syr(phonetic) = +sy(syc_phonetic):2 * tam(INSCRIPT) = +in(tam):2 * tam(UNI) = +in(tam_unicode):2 * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):2 * tam(TAB) = +in(tam_TAB):2 * tam(TSCII) = +in(tam_TSCII):2 * tel(basic) = +in(tel):2 * yu(basic) = +srp(latin):2 * yu(unicode) = +srp(latinunicode):2 * yu(yz) = +srp(latinyz):2 * yu(unicodeyz) = +srp(latinunicodeyz):2 nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):2 nokiarx51 * = +nokia_vndr/rx-51(%l[2]%_v[2]):2 $sun $sun_custom = +sun_vndr/%l[2]%(v[2]):2 * * = +%l[2]%(v[2]):2 ! model layout[3] = symbols * ar = +ara%(v[3]):3 * ben = +in(ben):3 * bs = +ba%(v[3]):3 * cs = +rs%(v[3]):3 * cz_qwerty = +cz(qwerty):3 * dev = +in(deva):3 * dvorak = +us(dvorak):3 * dzdwi = +bt%(v[3]):3 * el = +gr%(v[3]):3 * en_US = +latin%(v[3]):3 * guj = +in(guj):3 * gur = +in(guru):3 * iu = +ca(ike):3 * lo = +la%(v[3]):3 * kan = +in(kan):3 * mi = +mao%(v[3]):3 * ogham = +ie(ogam):3 * ori = +ie(ori):3 * sapmi = +no(smi):3 * sr = +srp%(v[3]):3 * syr = +sy(syc):3 * tel = +in(tel):3 * tml = +in(tam):3 * yu = +srp%(v[3]):3 * fr-latin9 = +fr(latin9):3 * us_intl = +us(alt-intl):3 * ben(basic) = +in(ben):3 * ben(probhat) = +in(ben_probhat):3 * dev(basic) = +in(deva):3 * dvorak($dvoraklayouts) = +%v(dvorak):3 * dvorak(basic) = +us(dvorak):3 * dvorak(pl_basic) = +pl(dvorak):3 * dvorak(pl) = +pl(dvorak_quotes):3 * dvorak(pl_altquotes) = +pl(dvorak_altquotes):3 * dzdwi(basic) = +bt(basic):3 * fi(basic) = +fi(classic):3 * ge(azerty_tskapo) = +fr(geo):3 * guj(basic) = +in(guj):3 * gur(basic) = +in(guru):3 * ie(laptop) = +ie(basic):3 * ie(CloGaelachLaptop) = +ie(CloGaelach):3 * in(urd) = +in(urd-phonetic):3 * iu(basic) = +ca(ike):3 * lo(basic) = +la(basic):3 * kan(basic) = +in(kan):3 * mal(basic) = +in(mal):3 * mal(mlplusnum) = +in(mal):3 * ogham(basic) = +ie(ogam):3 * ogham(laptop) = +ie(ogam):3 * ogham(is434) = +ie(ogam_is434):3 * ogham(is434laptop) = +ie(ogam_is434):3 * ori(basic) = +in(ori):3 * ro(de) = +ro(winkeys):3 * ro(us) = +ro(std):3 * ro(academic) = +ro(std):3 * ro(std_comma) = +ro(std):3 * ro(comma) = +ro(basic):3 * ru(os) = +ru(os_legacy):3 * pk(urd) = +pk(urd-phonetic):3 * sapmi(basic) = +no(smi):3 * sapmi(nodeadkeys) = +no(smi_nodeadkeys):3 * sapmi(sefi) = +fi(smi):3 * sin(phonetic-static) = +in(sin_phonetic):3 * syr(basic) = +sy(syc):3 * syr(phonetic) = +sy(syc_phonetic):3 * tam(INSCRIPT) = +in(tam):3 * tam(UNI) = +in(tam_unicode):3 * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):3 * tam(TAB) = +in(tam_TAB):3 * tam(TSCII) = +in(tam_TSCII):3 * tel(basic) = +in(tel):3 * yu(basic) = +srp(latin):3 * yu(unicode) = +srp(latinunicode):3 * yu(yz) = +srp(latinyz):3 * yu(unicodeyz) = +srp(latinunicodeyz):3 nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):3 nokiarx51 * = +nokia_vndr/rx-51(%l[3]%_v[3]):3 $sun $sun_custom = +sun_vndr/%l[3]%(v[3]):3 * * = +%l[3]%(v[3]):3 ! model layout[4] = symbols * ar = +ara%(v[4]):4 * ben = +in(ben):4 * bs = +ba%(v[4]):4 * cs = +rs%(v[4]):4 * cz_qwerty = +cz(qwerty):4 * dev = +in(deva):4 * dvorak = +us(dvorak):4 * dzdwi = +bt%(v[4]):4 * el = +gr%(v[4]):4 * en_US = +latin%(v[4]):4 * guj = +in(guj):4 * gur = +in(guru):4 * iu = +ca(ike):4 * lo = +la%(v[4]):4 * kan = +in(kan):4 * mi = +mao%(v[4]):4 * ogham = +ie(ogam):4 * ori = +ie(ori):4 * sapmi = +no(smi):4 * sr = +srp%(v[4]):4 * syr = +sy(syc):4 * tel = +in(tel):4 * tml = +in(tam):4 * yu = +srp%(v[4]):4 * fr-latin9 = +fr(latin9):4 * us_intl = +us(alt-intl):4 * ben(basic) = +in(ben):4 * ben(probhat) = +in(ben_probhat):4 * dev(basic) = +in(deva):4 * dvorak($dvoraklayouts) = +%v(dvorak):4 * dvorak(basic) = +us(dvorak):4 * dvorak(pl_basic) = +pl(dvorak):4 * dvorak(pl) = +pl(dvorak_quotes):4 * dvorak(pl_altquotes) = +pl(dvorak_altquotes):4 * dzdwi(basic) = +bt(basic):4 * fi(basic) = +fi(classic):4 * ge(azerty_tskapo) = +fr(geo):4 * guj(basic) = +in(guj):4 * gur(basic) = +in(guru):4 * ie(laptop) = +ie(basic):4 * ie(CloGaelachLaptop) = +ie(CloGaelach):4 * in(urd) = +in(urd-phonetic):4 * iu(basic) = +ca(ike):4 * lo(basic) = +la(basic):4 * kan(basic) = +in(kan):4 * mal(basic) = +in(mal):4 * mal(mlplusnum) = +in(mal):4 * ogham(basic) = +ie(ogam):4 * ogham(laptop) = +ie(ogam):4 * ogham(is434) = +ie(ogam_is434):4 * ogham(is434laptop) = +ie(ogam_is434):4 * ori(basic) = +in(ori):4 * ro(de) = +ro(winkeys):4 * ro(us) = +ro(std):4 * ro(academic) = +ro(std):4 * ro(std_comma) = +ro(std):4 * ro(comma) = +ro(basic):4 * ru(os) = +ru(os_legacy):4 * pk(urd) = +pk(urd-phonetic):4 * sapmi(basic) = +no(smi):4 * sapmi(nodeadkeys) = +no(smi_nodeadkeys):4 * sapmi(sefi) = +fi(smi):4 * sin(phonetic-static) = +in(sin_phonetic):4 * syr(basic) = +sy(syc):4 * syr(phonetic) = +sy(syc_phonetic):4 * tam(INSCRIPT) = +in(tam):4 * tam(UNI) = +in(tam_unicode):4 * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):4 * tam(TAB) = +in(tam_TAB):4 * tam(TSCII) = +in(tam_TSCII):4 * tel(basic) = +in(tel):4 * yu(basic) = +srp(latin):4 * yu(unicode) = +srp(latinunicode):4 * yu(yz) = +srp(latinyz):4 * yu(unicodeyz) = +srp(latinunicodeyz):4 nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):4 nokiarx51 * = +nokia_vndr/rx-51(%l[4]%_v[4]):4 $sun $sun_custom = +sun_vndr/%l[4]%(v[4]):4 * * = +%l[4]%(v[4]):4 ! model layout[2] variant[2] = symbols * ben basic = +in(ben):2 * ben probhat = +in(ben_probhat):2 * dev basic = +in(deva):2 * dvorak $dvoraklayouts = +%v(dvorak):2 * dvorak basic = +us(dvorak):2 * dvorak pl_basic = +pl(dvorak):2 * dvorak pl = +pl(dvorak_quotes):2 * dvorak pl_altquotes = +pl(dvorak_altquotes):2 * dzdwi basic = +bt(basic):2 * fi basic = +fi(classic):2 * ge azerty_tskapo = +fr(geo):2 * guj basic = +in(guj):2 * gur basic = +in(guru):2 * ie laptop = +ie(basic):2 * ie CloGaelachLaptop = +ie(CloGaelach):2 * in urd = +in(urd-phonetic):2 * iu basic = +ca(ike):2 * lo basic = +la(basic):2 * kan basic = +in(kan):2 * mal basic = +in(mal):2 * mal mlplusnum = +in(mal):2 * ogham basic = +ie(ogam):2 * ogham laptop = +ie(ogam):2 * ogham is434 = +ie(ogam_is434):2 * ogham is434laptop = +ie(ogam_is434):2 * ori basic = +in(ori):2 * ro de = +ro(winkeys):2 * ro us = +ro(std):2 * ro academic = +ro(std):2 * ro std_comma = +ro(std):2 * ro comma = +ro(basic):2 * ru os = +ru(os_legacy):2 * pk urd = +pk(urd-phonetic):2 * sapmi basic = +no(smi):2 * sapmi nodeadkeys = +no(smi_nodeadkeys):2 * sapmi sefi = +fi(smi):2 * sin phonetic-static = +in(sin_phonetic):2 * syr basic = +sy(syc):2 * syr phonetic = +sy(syc_phonetic):2 * tam INSCRIPT = +in(tam):2 * tam UNI = +in(tam_unicode):2 * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):2 * tam TAB = +in(tam_TAB):2 * tam TSCII = +in(tam_TSCII):2 * tel basic = +in(tel):2 * yu basic = +srp(latin):2 * yu unicode = +srp(latinunicode):2 * yu yz = +srp(latinyz):2 * yu unicodeyz = +srp(latinunicodeyz):2 ! model layout[3] variant[3] = symbols * ben basic = +in(ben):3 * ben probhat = +in(ben_probhat):3 * dev basic = +in(deva):3 * dvorak $dvoraklayouts = +%v(dvorak):3 * dvorak basic = +us(dvorak):3 * dvorak pl_basic = +pl(dvorak):3 * dvorak pl = +pl(dvorak_quotes):3 * dvorak pl_altquotes = +pl(dvorak_altquotes):3 * dzdwi basic = +bt(basic):3 * fi basic = +fi(classic):3 * ge azerty_tskapo = +fr(geo):3 * guj basic = +in(guj):3 * gur basic = +in(guru):3 * ie laptop = +ie(basic):3 * ie CloGaelachLaptop = +ie(CloGaelach):3 * in urd = +in(urd-phonetic):3 * iu basic = +ca(ike):3 * lo basic = +la(basic):3 * kan basic = +in(kan):3 * mal basic = +in(mal):3 * mal mlplusnum = +in(mal):3 * ogham basic = +ie(ogam):3 * ogham laptop = +ie(ogam):3 * ogham is434 = +ie(ogam_is434):3 * ogham is434laptop = +ie(ogam_is434):3 * ori basic = +in(ori):3 * ro de = +ro(winkeys):3 * ro us = +ro(std):3 * ro academic = +ro(std):3 * ro std_comma = +ro(std):3 * ro comma = +ro(basic):3 * ru os = +ru(os_legacy):3 * pk urd = +pk(urd-phonetic):3 * sapmi basic = +no(smi):3 * sapmi nodeadkeys = +no(smi_nodeadkeys):3 * sapmi sefi = +fi(smi):3 * sin phonetic-static = +in(sin_phonetic):3 * syr basic = +sy(syc):3 * syr phonetic = +sy(syc_phonetic):3 * tam INSCRIPT = +in(tam):3 * tam UNI = +in(tam_unicode):3 * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):3 * tam TAB = +in(tam_TAB):3 * tam TSCII = +in(tam_TSCII):3 * tel basic = +in(tel):3 * yu basic = +srp(latin):3 * yu unicode = +srp(latinunicode):3 * yu yz = +srp(latinyz):3 * yu unicodeyz = +srp(latinunicodeyz):3 ! model layout[4] variant[4] = symbols * ben basic = +in(ben):4 * ben probhat = +in(ben_probhat):4 * dev basic = +in(deva):4 * dvorak $dvoraklayouts = +%v(dvorak):4 * dvorak basic = +us(dvorak):4 * dvorak pl_basic = +pl(dvorak):4 * dvorak pl = +pl(dvorak_quotes):4 * dvorak pl_altquotes = +pl(dvorak_altquotes):4 * dzdwi basic = +bt(basic):4 * fi basic = +fi(classic):4 * ge azerty_tskapo = +fr(geo):4 * guj basic = +in(guj):4 * gur basic = +in(guru):4 * ie laptop = +ie(basic):4 * ie CloGaelachLaptop = +ie(CloGaelach):4 * in urd = +in(urd-phonetic):4 * iu basic = +ca(ike):4 * lo basic = +la(basic):4 * kan basic = +in(kan):4 * mal basic = +in(mal):4 * mal mlplusnum = +in(mal):4 * ogham basic = +ie(ogam):4 * ogham laptop = +ie(ogam):4 * ogham is434 = +ie(ogam_is434):4 * ogham is434laptop = +ie(ogam_is434):4 * ori basic = +in(ori):4 * ro de = +ro(winkeys):4 * ro us = +ro(std):4 * ro academic = +ro(std):4 * ro std_comma = +ro(std):4 * ro comma = +ro(basic):4 * ru os = +ru(os_legacy):4 * pk urd = +pk(urd-phonetic):4 * sapmi basic = +no(smi):4 * sapmi nodeadkeys = +no(smi_nodeadkeys):4 * sapmi sefi = +fi(smi):4 * sin phonetic-static = +in(sin_phonetic):4 * syr basic = +sy(syc):4 * syr phonetic = +sy(syc_phonetic):4 * tam INSCRIPT = +in(tam):4 * tam UNI = +in(tam_unicode):4 * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):4 * tam TAB = +in(tam_TAB):4 * tam TSCII = +in(tam_TSCII):4 * tel basic = +in(tel):4 * yu basic = +srp(latin):4 * yu unicode = +srp(latinunicode):4 * yu yz = +srp(latinyz):4 * yu unicodeyz = +srp(latinunicodeyz):4 ! model = symbols $evdevkbds = +inet(evdev)+inet(%m) chromebook = +inet(evdev)+inet(chromebook) applealu_jis = +inet(evdev)+macintosh_vndr/jp(alujiskeys) * = +inet(evdev) ! model layout = symbols ! layout variant = compat de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de adnw = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de koy = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de bone = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de bone_eszett_home = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de neo_qwertz = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de neo_qwerty = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) jp $sun_compat = complete+japan(kana_lock) ! layout[1] variant[1] = compat de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de adnw = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de koy = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de bone = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de bone_eszett_home = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de neo_qwertz = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) de neo_qwerty = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) jp $sun_compat = complete+japan(kana_lock) ! layout[2] variant[2] = compat de neo = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de adnw = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de koy = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de bone = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de bone_eszett_home = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de neo_qwertz = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 de neo_qwerty = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 jp $sun_compat = +complete+japan(kana_lock):2 ! layout[3] variant[3] = compat de neo = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de adnw = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de koy = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de bone = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de bone_eszett_home = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de neo_qwertz = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 de neo_qwerty = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 jp $sun_compat = +complete+japan(kana_lock):3 ! layout[4] variant[4] = compat de neo = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de adnw = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de koy = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de bone = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de bone_eszett_home = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de neo_qwertz = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 de neo_qwerty = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 jp $sun_compat = +complete+japan(kana_lock):4 ! model layout = compat pc98 nec_vndr/jp = pc98(basic) * jp = complete+japan olpc * = olpc olpcm * = olpc * * = complete ! model layout[1] = compat * * = complete ! model = types $macs = complete+numpad(mac) $applealu = complete+numpad(mac) $nokiamodels = complete+nokia * = complete ! layout option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle) * misc:typo = +typo(base) ! layout[1] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):1 * misc:typo = +typo(base):1 ! layout[2] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):2 * misc:typo = +typo(base):2 ! layout[3] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):3 * misc:typo = +typo(base):3 ! layout[4] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):4 * misc:typo = +typo(base):4 ! option = symbols grp:shift_toggle = +group(shifts_toggle) altwin:menu = +altwin(menu) altwin:meta_alt = +altwin(meta_alt) altwin:alt_win = +altwin(alt_win) altwin:ctrl_win = +altwin(ctrl_win) altwin:ctrl_alt_win = +altwin(ctrl_alt_win) altwin:meta_win = +altwin(meta_win) altwin:left_meta_win = +altwin(left_meta_win) altwin:hyper_win = +altwin(hyper_win) altwin:alt_super_win = +altwin(alt_super_win) altwin:swap_lalt_lwin = +altwin(swap_lalt_lwin) altwin:swap_alt_win = +altwin(swap_alt_win) altwin:prtsc_rwin = +altwin(prtsc_rwin) grab:debug = +srvr_ctrl(grab_debug) grp:switch = +group(switch) grp:lswitch = +group(lswitch) grp:win_switch = +group(win_switch) grp:lwin_switch = +group(lwin_switch) grp:rwin_switch = +group(rwin_switch) grp:menu_switch = +group(menu_switch) grp:toggle = +group(toggle) grp:shifts_toggle = +group(shifts_toggle) grp:ctrls_toggle = +group(ctrls_toggle) grp:alts_toggle = +group(alts_toggle) grp:caps_toggle = +capslock(grouplock) grp:caps_switch = +capslock(groupshift) grp:shift_caps_toggle = +group(shift_caps_toggle) grp:shift_caps_switch = +group(shift_caps_switch) grp:win_space_toggle = +group(win_space_toggle) grp:win_menu_switch = +group(win_menu_switch) grp:alt_caps_toggle = +group(alt_caps_toggle) grp:alt_space_toggle = +group(alt_space_toggle) grp:menu_toggle = +group(menu_toggle) grp:lwin_toggle = +group(lwin_toggle) grp:rwin_toggle = +group(rwin_toggle) grp:lshift_toggle = +group(lshift_toggle) grp:rshift_toggle = +group(rshift_toggle) grp:rctrl_switch = +group(rctrl_switch) grp:lctrl_toggle = +group(lctrl_toggle) grp:rctrl_toggle = +group(rctrl_toggle) grp:lalt_toggle = +group(lalt_toggle) grp:sclk_toggle = +group(sclk_toggle) grp:lctrl_rctrl_switch = +group(lctrl_rctrl_switch) grp:lctrl_lwin_rctrl_menu = +group(lctrl_lwin_rctrl_menu) grp:lctrl_lalt_toggle = +group(lctrl_lalt_toggle) grp:rctrl_ralt_toggle = +group(rctrl_ralt_toggle) grp:ctrl_alt_toggle = +group(ctrl_alt_toggle) grp:ctrl_alt_toggle_bidir = +group(ctrl_alt_toggle_bidir) grp:lctrl_lshift_toggle = +group(lctrl_lshift_toggle) grp:rctrl_rshift_toggle = +group(rctrl_rshift_toggle) grp:ctrl_shift_toggle = +group(ctrl_shift_toggle) grp:ctrl_shift_toggle_bidir = +group(ctrl_shift_toggle_bidir) grp:lalt_lshift_toggle = +group(lalt_lshift_toggle) grp:ralt_rshift_toggle = +group(ralt_rshift_toggle) grp:alt_shift_toggle = +group(alt_shift_toggle) grp:alt_shift_toggle_bidir = +group(alt_shift_toggle_bidir) grp:lctrl_lwin_toggle = +group(lctrl_lwin_toggle) lv3:switch = +level3(switch) lv3:ralt_switch = +level3(ralt_switch) lv3:ralt_switch_multikey = +level3(ralt_switch_multikey) lv3:ralt_alt = +level3(ralt_alt) lv3:lalt_switch = +level3(lalt_switch) lv3:alt_switch = +level3(alt_switch) lv3:menu_switch = +level3(menu_switch) lv3:win_switch = +level3(win_switch) lv3:lwin_switch = +level3(lwin_switch) lv3:rwin_switch = +level3(rwin_switch) lv3:enter_switch = +level3(enter_switch) caps:capslock = +capslock(capslock) caps:numlock = +capslock(numlock) caps:shiftlock = +capslock(shiftlock) caps:swapescape = +capslock(swapescape) caps:escape = +capslock(escape) caps:backspace = +capslock(backspace) caps:super = +capslock(super) caps:hyper = +capslock(hyper) caps:menu = +capslock(menu) caps:none = +capslock(none) caps:ctrl_modifier = +capslock(ctrl_modifier) ctrl:nocaps = +ctrl(nocaps) ctrl:lctrl_meta = +ctrl(lctrl_meta) ctrl:swapcaps = +ctrl(swapcaps) ctrl:ac_ctrl = +ctrl(ac_ctrl) ctrl:aa_ctrl = +ctrl(aa_ctrl) ctrl:rctrl_ralt = +ctrl(rctrl_ralt) ctrl:menu_rctrl = +ctrl(menu_rctrl) ctrl:ralt_rctrl = +ctrl(ralt_rctrl) ctrl:swap_lalt_lctl = +ctrl(swap_lalt_lctl) ctrl:swap_lwin_lctl = +ctrl(swap_lwin_lctl) ctrl:swap_rwin_rctl = +ctrl(swap_rwin_rctl) ctrl:swap_lalt_lctl_lwin = +ctrl(swap_lalt_lctl_lwin) compose:ralt = +compose(ralt) compose:lwin = +compose(lwin) compose:lwin-altgr = +compose(lwin-altgr) compose:rwin = +compose(rwin) compose:rwin-altgr = +compose(rwin-altgr) compose:menu = +compose(menu) compose:menu-altgr = +compose(menu-altgr) compose:lctrl = +compose(lctrl) compose:lctrl-altgr = +compose(lctrl-altgr) compose:rctrl = +compose(rctrl) compose:rctrl-altgr = +compose(rctrl-altgr) compose:caps = +compose(caps) compose:caps-altgr = +compose(caps-altgr) compose:102 = +compose(102) compose:102-altgr = +compose(102-altgr) compose:paus = +compose(paus) compose:prsc = +compose(prsc) compose:sclk = +compose(sclk) srvrkeys:none = +srvr_ctrl(no_srvr_keys) eurosign:e = +eurosign(e) eurosign:2 = +eurosign(2) eurosign:4 = +eurosign(4) eurosign:5 = +eurosign(5) rupeesign:4 = +rupeesign(4) keypad:oss = +keypad(oss) keypad:legacy = +keypad(legacy) keypad:legacy_wang = +keypad(legacy_wang) keypad:oss_wang = +keypad(oss_wang) keypad:future = +keypad(future) keypad:future_wang = +keypad(future_wang) keypad:hex = +keypad(ops)+keypad(hex) keypad:atm = +keypad(ops)+keypad(hex)+keypad(atm) nbsp:none = +nbsp(none) nbsp:level2 = +nbsp(level2) nbsp:level3 = +nbsp(level3) nbsp:level3s = +nbsp(level3s) nbsp:level3n = +nbsp(level3n) nbsp:level4 = +nbsp(level4) nbsp:level4n = +nbsp(level4n) nbsp:level4nl = +nbsp(level4nl) japan:nicola_f_bs = +jp(nicola_f_bs) japan:hztg_escape = +jp(hztg_escape) korean:ralt_rctrl = +kr(ralt_hangul)+kr(rctrl_hanja) korean:rctrl_ralt = +kr(rctrl_hangul)+kr(ralt_hanja) kpdl:dot = +kpdl(dot) kpdl:comma = +kpdl(comma) kpdl:dotoss = +kpdl(dotoss) kpdl:dotoss_latin9 = +kpdl(dotoss_latin9) kpdl:commaoss = +kpdl(commaoss) kpdl:momayyezoss = +kpdl(momayyezoss) kpdl:kposs = +kpdl(kposs) kpdl:semi = +kpdl(semi) shift:breaks_caps = +shift(breaks_caps) esperanto:qwerty = +epo(qwerty) esperanto:dvorak = +epo(dvorak) esperanto:colemak = +epo(colemak) terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp) keypad:pointerkeys = +keypad(pointerkeys) apple:alupckeys = +macintosh_vndr/apple(alupckeys) shift:both_capslock = +shift(both_capslock) shift:lshift_both_capslock = +shift(lshift_both_capslock) shift:rshift_both_capslock = +shift(rshift_both_capslock) shift:both_capslock_cancel = +shift(both_capslock_cancel) shift:lshift_both_capslock_cancel = +shift(lshift_both_capslock_cancel) shift:rshift_both_capslock_cancel = +shift(rshift_both_capslock_cancel) shift:both_shiftlock = +shift(both_shiftlock) shift:lshift_both_shiftlock = +shift(lshift_both_shiftlock) shift:rshift_both_shiftlock = +shift(rshift_both_shiftlock) solaris:sun_compat = +sun_vndr/solaris(sun_compat) lv3:caps_switch = +level3(caps_switch) lv3:bksl_switch = +level3(bksl_switch) lv3:lsgt_switch = +level3(lsgt_switch) lv3:caps_switch_latch = +level3(caps_switch_latch) lv3:bksl_switch_latch = +level3(bksl_switch_latch) lv3:lsgt_switch_latch = +level3(lsgt_switch_latch) lv5:lsgt_switch_lock = +level5(lsgt_switch_lock) lv5:ralt_switch_lock = +level5(ralt_switch_lock) lv5:lwin_switch_lock = +level5(lwin_switch_lock) lv5:rwin_switch_lock = +level5(rwin_switch_lock) lv5:lsgt_switch_lock_cancel = +level5(lsgt_switch_lock_cancel) lv5:ralt_switch_lock_cancel = +level5(ralt_switch_lock_cancel) lv5:lwin_switch_lock_cancel = +level5(lwin_switch_lock_cancel) lv5:rwin_switch_lock_cancel = +level5(rwin_switch_lock_cancel) parens:swap_brackets = +parens(swap_brackets) ! option = compat grp_led:num = +lednum(group_lock) grp_led:caps = +ledcaps(group_lock) grp_led:scroll = +ledscroll(group_lock) japan:kana_lock = +japan(kana_lock) caps:shiftlock = +ledcaps(shift_lock) grab:break_actions = +xfree86(grab_break) ! option = types caps:internal = +caps(internal) caps:internal_nocancel = +caps(internal_nocancel) caps:shift = +caps(shift) caps:shift_nocancel = +caps(shift_nocancel) numpad:pc = +numpad(pc) numpad:mac = +numpad(mac) numpad:microsoft = +numpad(microsoft) numpad:shift3 = +numpad(shift3) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7253134 libxkbcommon-0.10.0/test/data/rules/evdev-xkbcommon0000644000175000017500000011433100000000000021713 0ustar00ranran00000000000000// DO NOT EDIT THIS FILE - IT WAS AUTOGENERATED BY merge.sh FROM rules/*.part // // Rules for resolving XKB components for use with XFree86 // Copyright 1996 by Joseph Moss // // 2002 Modifier: Ivan Pascal The XFree86 Project // // If you want non-latin layouts implicitly include the en_US layout // uncomment lines below //! $nonlatin = am ara ben bd bg bt by cs deva ge gh gr guj guru il \ // in ir iku jp kan kh kr la lao lk mk mm mn mv mal ori pk \ // ru scc sy syr tel th tj tam ua uz // PC models ! $pcmodels = pc101 pc102 pc104 pc105 // Microsoft models (using MS geometry) ! $msmodels = microsoft microsoft4000 microsoft7000 microsoftpro microsoftprousb microsoftprose // Nokia devices and keyboards ! $nokiamodels = nokiasu8w nokiarx44 nokiarx51 // PC geometries - they have special geometry but symbols are mostly pc105 ! $pcgeometries = latitude // TypeMatrix geometries ! $tmgeometries = tm2020 tm2030PS2 tm2030USB tm2030USB-102 tm2030USB-106 // Layouts that provide further specializations for the OLPC ! $olpclayouts = af am ara br ca es et fr it kh kz in mn np ru th tr us ! $macbooks = macbook78 macbook79 ! $maclaptop = ibook powerbook macbook78 macbook79 ! $applealu = applealu_ansi applealu_iso applealu_jis ! $macs = macintosh macintosh_old ibook powerbook macbook78 macbook79 ! $macvendorlayouts = ch de dk fi fr gb is it latam nl no pt se us ! $azerty = be fr ! $qwertz = al cz de hr hu ro si sk ! $inetkbds = acer_c300 acer_ferrari4k acer_laptop \ airkey \ apple armada azonaRF2300 \ benqx brother \ btc5113rf btc9000 btc9000a btc9001ah btc5090 btc9019u \ cherryblue cherrybluea cherryblueb \ cherrycyboard cherrycmexpert \ chicony chicony0108 chicony0420 chicony9885 \ compalfl90 \ compaqeak8 compaqik7 compaqik13 compaqik18 \ creativedw7000 \ cymotionlinux \ dell dellm65 inspiron dellusbmm \ emachines ennyah_dkb1008 evdev \ genius geniuscomfy2 \ gyration honeywell_euroboard \ hp250x hp5xx hp500fa hpdv5 \ hpi6 hpxe3gc hpxe3gf hpxe4xxx hpxt1000 hpzt11xx htcdream \ ibm_spacesaver ipaq inspiron intel \ logiaccess logicda logicink \ logiex110 logiclx300 \ logiinkse logiinkseusb logiitc logiik \ logitech_base itouch logiultrax \ logitech_g15 \ logidinovo logidinovoedge \ microsoft4000 microsoft7000 microsoftinet microsoftprousb microsoftprooem microsoftprose \ microsoftoffice microsoftmult \ mx1998 mx2500 mx2750 \ oretec \ pc105 \ presario propeller \ qtronix \ rapidaccess rapidaccess2 thinkpad60 \ samsung4500 samsung4510 \ silvercrest \ sk1300 sk2500 sk6200 sk7100 \ sven sven303 symplon \ toshiba_s3000 trust trustda \ unitekkb1925 yahoo // all layouts with 3rd and 4th groups ! $threelevellayouts = al az \ be br bt \ ca ch cs cz \ de dk \ ee es \ fi fo fr \ gb gr \ hu \ ie ir is it \ latam \ lk lt \ mn mt \ nl no \ pl pt \ ro \ se sk \ tr \ us \ vn \ za ! $evdevkbds = ibm_spacesaver ! $thinkpads = thinkpad thinkpad60 thinkpadz60 ! $sun_t6_custom = ara be br ca ch cz de dk \ ee es fi fr gb gr it kr \ lt lv nl no pl pt ro ru \ se sk tr tw ua ! $htcdreamlayouts = us it de ! $dvoraklayouts = br ca de ee es fr gb no pl se us ! model = keycodes * = evdev-xkbcommon ! layout[1] = keycodes $azerty = +aliases-xkbcommon(azerty) $qwertz = +aliases-xkbcommon(qwertz) * = +aliases-xkbcommon(qwerty) ! layout = keycodes $azerty = +aliases-xkbcommon(azerty) $qwertz = +aliases-xkbcommon(qwertz) * = +aliases-xkbcommon(qwerty) ! model layout = geometry thinkpad us = thinkpad(us) ! model = geometry microsoftelite = microsoft(elite) $msmodels = microsoft(natural) dell101 = dell(dell101) dellm65 = dell(dellm65) latitude = dell(latitude) flexpro = keytronic(FlexPro) hp6000 = hp(omnibook) hpmini110 = hp(mini110) hpdv5 = hp(dv5) omnikey101 = northgate(omnikey101) sanwaskbkg3 = sanwa(sanwaskbkg3) $pcmodels = pc(%m) $pcgeometries = pc(%m) everex = everex(STEPnote) thinkpad = thinkpad(intl) thinkpad60 = thinkpad(60) thinkpadz60 = thinkpad(60) $tmgeometries = typematrix(%m) winbook = winbook(XP5) pc98 = nec(pc98) $applealu = macintosh(%m) $macbooks = macintosh(%m) $macs = macintosh(macintosh) hhk = hhk(basic) kinesis = kinesis(model100) $nokiamodels = nokia(%m) * = pc(pc104) ! model layout variant = symbols * ben basic = pc+in(ben) * ben probhat = pc+in(ben_probhat) * dev basic = pc+in(deva) * dvorak $dvoraklayouts = pc+%v(dvorak) * dvorak basic = pc+us(dvorak) * dvorak pl_basic = pc+pl(dvorak) * dvorak pl = pc+pl(dvorak_quotes) * dvorak pl_altquotes = pc+pl(dvorak_altquotes) * dzdwi basic = pc+bt(basic) * fi basic = pc+fi(classic) * ge azerty_tskapo = pc+fr(geo) * guj basic = pc+in(guj) * gur basic = pc+in(guru) * ie laptop = pc+ie(basic) * ie CloGaelachLaptop = pc+ie(CloGaelach) * in urd = pc+in(urd-phonetic) * iu basic = pc+ca(ike) * lo basic = pc+la(basic) * kan basic = pc+in(kan) * mal basic = pc+in(mal) * mal mlplusnum = pc+in(mal) * ogham basic = pc+ie(ogam) * ogham laptop = pc+ie(ogam) * ogham is434 = pc+ie(ogam_is434) * ogham is434laptop = pc+ie(ogam_is434) * ori basic = pc+in(ori) * ro de = pc+ro(winkeys) * ro us = pc+ro(std) * ro academic = pc+ro(std) * ro std_comma = pc+ro(std) * ro comma = pc+ro(basic) * ru os = pc+ru(os_legacy) * pk urd = pc+pk(urd-phonetic) * sapmi basic = pc+no(smi) * sapmi nodeadkeys = pc+no(smi_nodeadkeys) * sapmi sefi = pc+fi(smi) * sin phonetic-static = pc+in(sin_phonetic) * syr basic = pc+sy(syc) * syr phonetic = pc+sy(syc_phonetic) * tam INSCRIPT = pc+in(tam) * tam UNI = pc+in(tam_unicode) * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals) * tam TAB = pc+in(tam_TAB) * tam TSCII = pc+in(tam_TSCII) * tel basic = pc+in(tel) * yu basic = pc+srp(latin) * yu unicode = pc+srp(latinunicode) * yu yz = pc+srp(latinyz) * yu unicodeyz = pc+srp(latinunicodeyz) classmate us intl = pc+us(classmate-intl) classmate us alt-intl = pc+us(classmate-alt-intl) classmate us altgr-intl = pc+us(classmate-altgr-intl) nokiarx51 cz qwerty = nokia_vndr/rx-51(cz_qwerty) ! model layout = symbols * ar = pc+ara * ben = pc+in(ben) * bs = pc+ba * cs = pc+rs * cz_qwerty = pc+cz(qwerty) * dev = pc+in(deva) * dvorak = pc+us(dvorak) * dzdwi = pc+bt * el = pc+gr * en_US = pc+latin * guj = pc+in(guj) * gur = pc+in(guru) * iu = pc+ca(ike) * lo = pc+la * kan = pc+in(kan) * mi = pc+mao * ml = pc+in(mal) * ogham = pc+ie(ogam) * ori = pc+ie(ori) * sapmi = pc+no(smi) * sr = pc+srp * syr = pc+sy(syc) * tel = pc+in(tel) * tml = pc+in(tam) * yu = pc+srp * fr-latin9 = pc+fr(latin9) * us_intl = pc+us(alt-intl) * ben(basic) = pc+in(ben) * ben(probhat) = pc+in(ben_probhat) * dev(basic) = pc+in(deva) * dvorak($dvoraklayouts) = pc+%v(dvorak) * dvorak(basic) = pc+us(dvorak) * dvorak(pl_basic) = pc+pl(dvorak) * dvorak(pl) = pc+pl(dvorak_quotes) * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes) * dzdwi(basic) = pc+bt(basic) * fi(basic) = pc+fi(classic) * ge(azerty_tskapo) = pc+fr(geo) * guj(basic) = pc+in(guj) * gur(basic) = pc+in(guru) * ie(laptop) = pc+ie(basic) * ie(CloGaelachLaptop) = pc+ie(CloGaelach) * in(urd) = pc+in(urd-phonetic) * iu(basic) = pc+ca(ike) * lo(basic) = pc+la(basic) * kan(basic) = pc+in(kan) * mal(basic) = pc+in(mal) * mal(mlplusnum) = pc+in(mal) * ogham(basic) = pc+ie(ogam) * ogham(laptop) = pc+ie(ogam) * ogham(is434) = pc+ie(ogam_is434) * ogham(is434laptop) = pc+ie(ogam_is434) * ori(basic) = pc+in(ori) * ro(de) = pc+ro(winkeys) * ro(us) = pc+ro(std) * ro(academic) = pc+ro(std) * ro(std_comma) = pc+ro(std) * ro(comma) = pc+ro(basic) * ru(os) = pc+ru(os_legacy) * pk(urd) = pc+pk(urd-phonetic) * sapmi(basic) = pc+no(smi) * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys) * sapmi(sefi) = pc+fi(smi) * sin(phonetic-static) = pc+in(sin_phonetic) * syr(basic) = pc+sy(syc) * syr(phonetic) = pc+sy(syc_phonetic) * tam(INSCRIPT) = pc+in(tam) * tam(UNI) = pc+in(tam_unicode) * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals) * tam(TAB) = pc+in(tam_TAB) * tam(TSCII) = pc+in(tam_TSCII) * tel(basic) = pc+in(tel) * yu(basic) = pc+srp(latin) * yu(unicode) = pc+srp(latinunicode) * yu(yz) = pc+srp(latinyz) * yu(unicodeyz) = pc+srp(latinunicodeyz) ataritt $nonlatin = xfree68_vndr/ataritt(us)+%l%(v):2 ataritt * = xfree68_vndr/ataritt(us)+%l%(v) amiga $nonlatin = xfree68_vndr/amiga(usa1)+%l%(v):2 amiga * = xfree68_vndr/amiga(usa1)+%l%(v) classmate us = pc+%l(classmate) empty * = empty(basic) * empty = empty(basic) sun4 $nonlatin = latin+sun_vndr/us(type4)+%l%(v):2 sun4 * = latin+sun_vndr/us(type4)+%l%(v) sun5 $nonlatin = latin+sun_vndr/us(type5)+%l%(v):2 sun5 * = latin+sun_vndr/us(type5)+%l%(v) sun6 us = pc+sun_vndr/us(type6) sun6 en_US = pc+sun_vndr/us(type6)+iso9995-3(basic) sun6 $sun_t6_custom = pc+sun_vndr/us(type6)+sun_vndr/%l%(v) sun6 * = pc+sun_vndr/us(type6)+%l%(v) sun6euro us = pc+sun_vndr/us(type6) sun6euro en_US = pc+sun_vndr/us(type6)+iso9995-3(basic) sun6euro $sun_t6_custom = pc+sun_vndr/us(type6)+sun_vndr/%l%(v) sun6euro * = pc+sun_vndr/us(type6)+%l%(v) pc98 nec_vndr/jp = nec_vndr/jp(pc98) macintosh_old us = macintosh_vndr/us(oldmac) macintosh_old en_US = macintosh_vndr/us(oldmac) macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l%(v) macintosh_old $nonlatin = macintosh_vndr/us(oldmac)+%l%(v):2 macintosh_old * = macintosh_vndr/us(oldmac)+%l%(v) applealu_jis jp = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)+macintosh_vndr/jp(mac):2 applealu_jis * = macintosh_vndr/apple(alukbd)+%l%(v)+macintosh_vndr/jp(mac):2 $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l%(v) $applealu * = macintosh_vndr/apple(alukbd)+%l%(v) $macs en_US = pc+macintosh_vndr/us(extended) $macs $macvendorlayouts = pc+macintosh_vndr/%l%(v) nokiarx44 * = nokia_vndr/rx-44(%l) nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty) nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l%_v) nokiasu8w * = nokia_vndr/su-8w(%l) olpc $olpclayouts = olpc+%l%(m) olpc * = olpc+%l%(v) $thinkpads br = pc+br(thinkpad) htcdream $htcdreamlayouts = %l(htcdream) * $nonlatin = pc+us+%l%(v):2 * * = pc+%l%(v) ! model layout[1] = symbols * ar = pc+ara%(v[1]) * ben = pc+in(ben) * bs = pc+ba%(v[1]) * cs = pc+rs%(v[1]) * cz_qwerty = pc+cz(qwerty) * dev = pc+in(deva) * dvorak = pc+us(dvorak) * dzdwi = pc+bt%(v[1]) * el = pc+gr%(v[1]) * en_US = pc+latin%(v[1]) * guj = pc+in(guj) * gur = pc+in(guru) * iu = pc+ca(ike) * lo = pc+la%(v[1]) * kan = pc+in(kan) * mi = pc+mao%(v[1]) * ml = pc+in(mal) * ogham = pc+ie(ogam) * ori = pc+ie(ori) * sapmi = pc+no(smi) * sr = pc+srp%(v[1]) * syr = pc+sy(syc) * tel = pc+in(tel) * tml = pc+in(tam) * yu = pc+srp%(v[1]) * fr-latin9 = pc+fr(latin9) * us_intl = pc+us(alt-intl) * ben(basic) = pc+in(ben) * ben(probhat) = pc+in(ben_probhat) * dev(basic) = pc+in(deva) * dvorak($dvoraklayouts) = pc+%v(dvorak) * dvorak(basic) = pc+us(dvorak) * dvorak(pl_basic) = pc+pl(dvorak) * dvorak(pl) = pc+pl(dvorak_quotes) * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes) * dzdwi(basic) = pc+bt(basic) * fi(basic) = pc+fi(classic) * ge(azerty_tskapo) = pc+fr(geo) * guj(basic) = pc+in(guj) * gur(basic) = pc+in(guru) * ie(laptop) = pc+ie(basic) * ie(CloGaelachLaptop) = pc+ie(CloGaelach) * in(urd) = pc+in(urd-phonetic) * iu(basic) = pc+ca(ike) * lo(basic) = pc+la(basic) * kan(basic) = pc+in(kan) * mal(basic) = pc+in(mal) * mal(mlplusnum) = pc+in(mal) * ogham(basic) = pc+ie(ogam) * ogham(laptop) = pc+ie(ogam) * ogham(is434) = pc+ie(ogam_is434) * ogham(is434laptop) = pc+ie(ogam_is434) * ori(basic) = pc+in(ori) * ro(de) = pc+ro(winkeys) * ro(us) = pc+ro(std) * ro(academic) = pc+ro(std) * ro(std_comma) = pc+ro(std) * ro(comma) = pc+ro(basic) * ru(os) = pc+ru(os_legacy) * pk(urd) = pc+pk(urd-phonetic) * sapmi(basic) = pc+no(smi) * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys) * sapmi(sefi) = pc+fi(smi) * sin(phonetic-static) = pc+in(sin_phonetic) * syr(basic) = pc+sy(syc) * syr(phonetic) = pc+sy(syc_phonetic) * tam(INSCRIPT) = pc+in(tam) * tam(UNI) = pc+in(tam_unicode) * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals) * tam(TAB) = pc+in(tam_TAB) * tam(TSCII) = pc+in(tam_TSCII) * tel(basic) = pc+in(tel) * yu(basic) = pc+srp(latin) * yu(unicode) = pc+srp(latinunicode) * yu(yz) = pc+srp(latinyz) * yu(unicodeyz) = pc+srp(latinunicodeyz) ataritt * = xfree68_vndr/ataritt(us)+%l[1]%(v[1]) amiga * = xfree68_vndr/amiga(usa1)+%l[1]%(v[1]) sun4 * = latin+sun_vndr/us(type4)+%l[1]%(v[1]) sun5 * = latin+sun_vndr/us(type5)+%l[1]%(v[1]) macintosh_old us = macintosh_vndr/us(oldmac) macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l[1]%(v[1]) macintosh_old * = macintosh_vndr/us(oldmac)+%l[1]%(v[1]) applealu_jis us = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac) $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l[1]%(v[1]) $applealu * = macintosh_vndr/apple(alukbd)+%l[1]%(v[1]) $macs $macvendorlayouts = pc+macintosh_vndr/%l[1]%(v[1]) nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty) nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l[1]%_v[1]) $thinkpads br = pc+%l[1](thinkpad) * * = pc+%l[1]%(v[1]) ! model layout[1] variant[1] = symbols * ben basic = pc+in(ben) * ben probhat = pc+in(ben_probhat) * dev basic = pc+in(deva) * dvorak $dvoraklayouts = pc+%v(dvorak) * dvorak basic = pc+us(dvorak) * dvorak pl_basic = pc+pl(dvorak) * dvorak pl = pc+pl(dvorak_quotes) * dvorak pl_altquotes = pc+pl(dvorak_altquotes) * dzdwi basic = pc+bt(basic) * fi basic = pc+fi(classic) * ge azerty_tskapo = pc+fr(geo) * guj basic = pc+in(guj) * gur basic = pc+in(guru) * ie laptop = pc+ie(basic) * ie CloGaelachLaptop = pc+ie(CloGaelach) * in urd = pc+in(urd-phonetic) * iu basic = pc+ca(ike) * lo basic = pc+la(basic) * kan basic = pc+in(kan) * mal basic = pc+in(mal) * mal mlplusnum = pc+in(mal) * ogham basic = pc+ie(ogam) * ogham laptop = pc+ie(ogam) * ogham is434 = pc+ie(ogam_is434) * ogham is434laptop = pc+ie(ogam_is434) * ori basic = pc+in(ori) * ro de = pc+ro(winkeys) * ro us = pc+ro(std) * ro academic = pc+ro(std) * ro std_comma = pc+ro(std) * ro comma = pc+ro(basic) * ru os = pc+ru(os_legacy) * pk urd = pc+pk(urd-phonetic) * sapmi basic = pc+no(smi) * sapmi nodeadkeys = pc+no(smi_nodeadkeys) * sapmi sefi = pc+fi(smi) * sin phonetic-static = pc+in(sin_phonetic) * syr basic = pc+sy(syc) * syr phonetic = pc+sy(syc_phonetic) * tam INSCRIPT = pc+in(tam) * tam UNI = pc+in(tam_unicode) * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals) * tam TAB = pc+in(tam_TAB) * tam TSCII = pc+in(tam_TSCII) * tel basic = pc+in(tel) * yu basic = pc+srp(latin) * yu unicode = pc+srp(latinunicode) * yu yz = pc+srp(latinyz) * yu unicodeyz = pc+srp(latinunicodeyz) ! model layout[2] = symbols * ar = +ara%(v[2]):2 * ben = +in(ben):2 * bs = +ba%(v[2]):2 * cs = +rs%(v[2]):2 * cz_qwerty = +cz(qwerty):2 * dev = +in(deva):2 * dvorak = +us(dvorak):2 * dzdwi = +bt%(v[2]):2 * el = +gr%(v[2]):2 * en_US = +latin%(v[2]):2 * guj = +in(guj):2 * gur = +in(guru):2 * iu = +ca(ike):2 * lo = +la%(v[2]):2 * kan = +in(kan):2 * mi = +mao%(v[2]):2 * ml = +in(mal):2 * ogham = +ie(ogam):2 * ori = +ie(ori):2 * sapmi = +no(smi):2 * sr = +srp%(v[2]):2 * syr = +sy(syc):2 * tel = +in(tel):2 * tml = +in(tam):2 * yu = +srp%(v[2]):2 * fr-latin9 = +fr(latin9):2 * us_intl = +us(alt-intl):2 * ben(basic) = +in(ben):2 * ben(probhat) = +in(ben_probhat):2 * dev(basic) = +in(deva):2 * dvorak($dvoraklayouts) = +%v(dvorak):2 * dvorak(basic) = +us(dvorak):2 * dvorak(pl_basic) = +pl(dvorak):2 * dvorak(pl) = +pl(dvorak_quotes):2 * dvorak(pl_altquotes) = +pl(dvorak_altquotes):2 * dzdwi(basic) = +bt(basic):2 * fi(basic) = +fi(classic):2 * ge(azerty_tskapo) = +fr(geo):2 * guj(basic) = +in(guj):2 * gur(basic) = +in(guru):2 * ie(laptop) = +ie(basic):2 * ie(CloGaelachLaptop) = +ie(CloGaelach):2 * in(urd) = +in(urd-phonetic):2 * iu(basic) = +ca(ike):2 * lo(basic) = +la(basic):2 * kan(basic) = +in(kan):2 * mal(basic) = +in(mal):2 * mal(mlplusnum) = +in(mal):2 * ogham(basic) = +ie(ogam):2 * ogham(laptop) = +ie(ogam):2 * ogham(is434) = +ie(ogam_is434):2 * ogham(is434laptop) = +ie(ogam_is434):2 * ori(basic) = +in(ori):2 * ro(de) = +ro(winkeys):2 * ro(us) = +ro(std):2 * ro(academic) = +ro(std):2 * ro(std_comma) = +ro(std):2 * ro(comma) = +ro(basic):2 * ru(os) = +ru(os_legacy):2 * pk(urd) = +pk(urd-phonetic):2 * sapmi(basic) = +no(smi):2 * sapmi(nodeadkeys) = +no(smi_nodeadkeys):2 * sapmi(sefi) = +fi(smi):2 * sin(phonetic-static) = +in(sin_phonetic):2 * syr(basic) = +sy(syc):2 * syr(phonetic) = +sy(syc_phonetic):2 * tam(INSCRIPT) = +in(tam):2 * tam(UNI) = +in(tam_unicode):2 * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):2 * tam(TAB) = +in(tam_TAB):2 * tam(TSCII) = +in(tam_TSCII):2 * tel(basic) = +in(tel):2 * yu(basic) = +srp(latin):2 * yu(unicode) = +srp(latinunicode):2 * yu(yz) = +srp(latinyz):2 * yu(unicodeyz) = +srp(latinunicodeyz):2 nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):2 nokiarx51 * = +nokia_vndr/rx-51(%l[2]%_v[2]):2 * * = +%l[2]%(v[2]):2 ! model layout[3] = symbols * ar = +ara%(v[3]):3 * ben = +in(ben):3 * bs = +ba%(v[3]):3 * cs = +rs%(v[3]):3 * cz_qwerty = +cz(qwerty):3 * dev = +in(deva):3 * dvorak = +us(dvorak):3 * dzdwi = +bt%(v[3]):3 * el = +gr%(v[3]):3 * en_US = +latin%(v[3]):3 * guj = +in(guj):3 * gur = +in(guru):3 * iu = +ca(ike):3 * lo = +la%(v[3]):3 * kan = +in(kan):3 * mi = +mao%(v[3]):3 * ml = +in(mal):3 * ogham = +ie(ogam):3 * ori = +ie(ori):3 * sapmi = +no(smi):3 * sr = +srp%(v[3]):3 * syr = +sy(syc):3 * tel = +in(tel):3 * tml = +in(tam):3 * yu = +srp%(v[3]):3 * fr-latin9 = +fr(latin9):3 * us_intl = +us(alt-intl):3 * ben(basic) = +in(ben):3 * ben(probhat) = +in(ben_probhat):3 * dev(basic) = +in(deva):3 * dvorak($dvoraklayouts) = +%v(dvorak):3 * dvorak(basic) = +us(dvorak):3 * dvorak(pl_basic) = +pl(dvorak):3 * dvorak(pl) = +pl(dvorak_quotes):3 * dvorak(pl_altquotes) = +pl(dvorak_altquotes):3 * dzdwi(basic) = +bt(basic):3 * fi(basic) = +fi(classic):3 * ge(azerty_tskapo) = +fr(geo):3 * guj(basic) = +in(guj):3 * gur(basic) = +in(guru):3 * ie(laptop) = +ie(basic):3 * ie(CloGaelachLaptop) = +ie(CloGaelach):3 * in(urd) = +in(urd-phonetic):3 * iu(basic) = +ca(ike):3 * lo(basic) = +la(basic):3 * kan(basic) = +in(kan):3 * mal(basic) = +in(mal):3 * mal(mlplusnum) = +in(mal):3 * ogham(basic) = +ie(ogam):3 * ogham(laptop) = +ie(ogam):3 * ogham(is434) = +ie(ogam_is434):3 * ogham(is434laptop) = +ie(ogam_is434):3 * ori(basic) = +in(ori):3 * ro(de) = +ro(winkeys):3 * ro(us) = +ro(std):3 * ro(academic) = +ro(std):3 * ro(std_comma) = +ro(std):3 * ro(comma) = +ro(basic):3 * ru(os) = +ru(os_legacy):3 * pk(urd) = +pk(urd-phonetic):3 * sapmi(basic) = +no(smi):3 * sapmi(nodeadkeys) = +no(smi_nodeadkeys):3 * sapmi(sefi) = +fi(smi):3 * sin(phonetic-static) = +in(sin_phonetic):3 * syr(basic) = +sy(syc):3 * syr(phonetic) = +sy(syc_phonetic):3 * tam(INSCRIPT) = +in(tam):3 * tam(UNI) = +in(tam_unicode):3 * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):3 * tam(TAB) = +in(tam_TAB):3 * tam(TSCII) = +in(tam_TSCII):3 * tel(basic) = +in(tel):3 * yu(basic) = +srp(latin):3 * yu(unicode) = +srp(latinunicode):3 * yu(yz) = +srp(latinyz):3 * yu(unicodeyz) = +srp(latinunicodeyz):3 nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):3 nokiarx51 * = +nokia_vndr/rx-51(%l[3]%_v[3]):3 * * = +%l[3]%(v[3]):3 ! model layout[4] = symbols * ar = +ara%(v[4]):4 * ben = +in(ben):4 * bs = +ba%(v[4]):4 * cs = +rs%(v[4]):4 * cz_qwerty = +cz(qwerty):4 * dev = +in(deva):4 * dvorak = +us(dvorak):4 * dzdwi = +bt%(v[4]):4 * el = +gr%(v[4]):4 * en_US = +latin%(v[4]):4 * guj = +in(guj):4 * gur = +in(guru):4 * iu = +ca(ike):4 * lo = +la%(v[4]):4 * kan = +in(kan):4 * mi = +mao%(v[4]):4 * ml = +in(mal):4 * ogham = +ie(ogam):4 * ori = +ie(ori):4 * sapmi = +no(smi):4 * sr = +srp%(v[4]):4 * syr = +sy(syc):4 * tel = +in(tel):4 * tml = +in(tam):4 * yu = +srp%(v[4]):4 * fr-latin9 = +fr(latin9):4 * us_intl = +us(alt-intl):4 * ben(basic) = +in(ben):4 * ben(probhat) = +in(ben_probhat):4 * dev(basic) = +in(deva):4 * dvorak($dvoraklayouts) = +%v(dvorak):4 * dvorak(basic) = +us(dvorak):4 * dvorak(pl_basic) = +pl(dvorak):4 * dvorak(pl) = +pl(dvorak_quotes):4 * dvorak(pl_altquotes) = +pl(dvorak_altquotes):4 * dzdwi(basic) = +bt(basic):4 * fi(basic) = +fi(classic):4 * ge(azerty_tskapo) = +fr(geo):4 * guj(basic) = +in(guj):4 * gur(basic) = +in(guru):4 * ie(laptop) = +ie(basic):4 * ie(CloGaelachLaptop) = +ie(CloGaelach):4 * in(urd) = +in(urd-phonetic):4 * iu(basic) = +ca(ike):4 * lo(basic) = +la(basic):4 * kan(basic) = +in(kan):4 * mal(basic) = +in(mal):4 * mal(mlplusnum) = +in(mal):4 * ogham(basic) = +ie(ogam):4 * ogham(laptop) = +ie(ogam):4 * ogham(is434) = +ie(ogam_is434):4 * ogham(is434laptop) = +ie(ogam_is434):4 * ori(basic) = +in(ori):4 * ro(de) = +ro(winkeys):4 * ro(us) = +ro(std):4 * ro(academic) = +ro(std):4 * ro(std_comma) = +ro(std):4 * ro(comma) = +ro(basic):4 * ru(os) = +ru(os_legacy):4 * pk(urd) = +pk(urd-phonetic):4 * sapmi(basic) = +no(smi):4 * sapmi(nodeadkeys) = +no(smi_nodeadkeys):4 * sapmi(sefi) = +fi(smi):4 * sin(phonetic-static) = +in(sin_phonetic):4 * syr(basic) = +sy(syc):4 * syr(phonetic) = +sy(syc_phonetic):4 * tam(INSCRIPT) = +in(tam):4 * tam(UNI) = +in(tam_unicode):4 * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):4 * tam(TAB) = +in(tam_TAB):4 * tam(TSCII) = +in(tam_TSCII):4 * tel(basic) = +in(tel):4 * yu(basic) = +srp(latin):4 * yu(unicode) = +srp(latinunicode):4 * yu(yz) = +srp(latinyz):4 * yu(unicodeyz) = +srp(latinunicodeyz):4 nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):4 nokiarx51 * = +nokia_vndr/rx-51(%l[4]%_v[4]):4 * * = +%l[4]%(v[4]):4 ! model layout[2] variant[2] = symbols * ben basic = +in(ben):2 * ben probhat = +in(ben_probhat):2 * dev basic = +in(deva):2 * dvorak $dvoraklayouts = +%v(dvorak):2 * dvorak basic = +us(dvorak):2 * dvorak pl_basic = +pl(dvorak):2 * dvorak pl = +pl(dvorak_quotes):2 * dvorak pl_altquotes = +pl(dvorak_altquotes):2 * dzdwi basic = +bt(basic):2 * fi basic = +fi(classic):2 * ge azerty_tskapo = +fr(geo):2 * guj basic = +in(guj):2 * gur basic = +in(guru):2 * ie laptop = +ie(basic):2 * ie CloGaelachLaptop = +ie(CloGaelach):2 * in urd = +in(urd-phonetic):2 * iu basic = +ca(ike):2 * lo basic = +la(basic):2 * kan basic = +in(kan):2 * mal basic = +in(mal):2 * mal mlplusnum = +in(mal):2 * ogham basic = +ie(ogam):2 * ogham laptop = +ie(ogam):2 * ogham is434 = +ie(ogam_is434):2 * ogham is434laptop = +ie(ogam_is434):2 * ori basic = +in(ori):2 * ro de = +ro(winkeys):2 * ro us = +ro(std):2 * ro academic = +ro(std):2 * ro std_comma = +ro(std):2 * ro comma = +ro(basic):2 * ru os = +ru(os_legacy):2 * pk urd = +pk(urd-phonetic):2 * sapmi basic = +no(smi):2 * sapmi nodeadkeys = +no(smi_nodeadkeys):2 * sapmi sefi = +fi(smi):2 * sin phonetic-static = +in(sin_phonetic):2 * syr basic = +sy(syc):2 * syr phonetic = +sy(syc_phonetic):2 * tam INSCRIPT = +in(tam):2 * tam UNI = +in(tam_unicode):2 * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):2 * tam TAB = +in(tam_TAB):2 * tam TSCII = +in(tam_TSCII):2 * tel basic = +in(tel):2 * yu basic = +srp(latin):2 * yu unicode = +srp(latinunicode):2 * yu yz = +srp(latinyz):2 * yu unicodeyz = +srp(latinunicodeyz):2 ! model layout[3] variant[3] = symbols * ben basic = +in(ben):3 * ben probhat = +in(ben_probhat):3 * dev basic = +in(deva):3 * dvorak $dvoraklayouts = +%v(dvorak):3 * dvorak basic = +us(dvorak):3 * dvorak pl_basic = +pl(dvorak):3 * dvorak pl = +pl(dvorak_quotes):3 * dvorak pl_altquotes = +pl(dvorak_altquotes):3 * dzdwi basic = +bt(basic):3 * fi basic = +fi(classic):3 * ge azerty_tskapo = +fr(geo):3 * guj basic = +in(guj):3 * gur basic = +in(guru):3 * ie laptop = +ie(basic):3 * ie CloGaelachLaptop = +ie(CloGaelach):3 * in urd = +in(urd-phonetic):3 * iu basic = +ca(ike):3 * lo basic = +la(basic):3 * kan basic = +in(kan):3 * mal basic = +in(mal):3 * mal mlplusnum = +in(mal):3 * ogham basic = +ie(ogam):3 * ogham laptop = +ie(ogam):3 * ogham is434 = +ie(ogam_is434):3 * ogham is434laptop = +ie(ogam_is434):3 * ori basic = +in(ori):3 * ro de = +ro(winkeys):3 * ro us = +ro(std):3 * ro academic = +ro(std):3 * ro std_comma = +ro(std):3 * ro comma = +ro(basic):3 * ru os = +ru(os_legacy):3 * pk urd = +pk(urd-phonetic):3 * sapmi basic = +no(smi):3 * sapmi nodeadkeys = +no(smi_nodeadkeys):3 * sapmi sefi = +fi(smi):3 * sin phonetic-static = +in(sin_phonetic):3 * syr basic = +sy(syc):3 * syr phonetic = +sy(syc_phonetic):3 * tam INSCRIPT = +in(tam):3 * tam UNI = +in(tam_unicode):3 * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):3 * tam TAB = +in(tam_TAB):3 * tam TSCII = +in(tam_TSCII):3 * tel basic = +in(tel):3 * yu basic = +srp(latin):3 * yu unicode = +srp(latinunicode):3 * yu yz = +srp(latinyz):3 * yu unicodeyz = +srp(latinunicodeyz):3 ! model layout[4] variant[4] = symbols * ben basic = +in(ben):4 * ben probhat = +in(ben_probhat):4 * dev basic = +in(deva):4 * dvorak $dvoraklayouts = +%v(dvorak):4 * dvorak basic = +us(dvorak):4 * dvorak pl_basic = +pl(dvorak):4 * dvorak pl = +pl(dvorak_quotes):4 * dvorak pl_altquotes = +pl(dvorak_altquotes):4 * dzdwi basic = +bt(basic):4 * fi basic = +fi(classic):4 * ge azerty_tskapo = +fr(geo):4 * guj basic = +in(guj):4 * gur basic = +in(guru):4 * ie laptop = +ie(basic):4 * ie CloGaelachLaptop = +ie(CloGaelach):4 * in urd = +in(urd-phonetic):4 * iu basic = +ca(ike):4 * lo basic = +la(basic):4 * kan basic = +in(kan):4 * mal basic = +in(mal):4 * mal mlplusnum = +in(mal):4 * ogham basic = +ie(ogam):4 * ogham laptop = +ie(ogam):4 * ogham is434 = +ie(ogam_is434):4 * ogham is434laptop = +ie(ogam_is434):4 * ori basic = +in(ori):4 * ro de = +ro(winkeys):4 * ro us = +ro(std):4 * ro academic = +ro(std):4 * ro std_comma = +ro(std):4 * ro comma = +ro(basic):4 * ru os = +ru(os_legacy):4 * pk urd = +pk(urd-phonetic):4 * sapmi basic = +no(smi):4 * sapmi nodeadkeys = +no(smi_nodeadkeys):4 * sapmi sefi = +fi(smi):4 * sin phonetic-static = +in(sin_phonetic):4 * syr basic = +sy(syc):4 * syr phonetic = +sy(syc_phonetic):4 * tam INSCRIPT = +in(tam):4 * tam UNI = +in(tam_unicode):4 * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):4 * tam TAB = +in(tam_TAB):4 * tam TSCII = +in(tam_TSCII):4 * tel basic = +in(tel):4 * yu basic = +srp(latin):4 * yu unicode = +srp(latinunicode):4 * yu yz = +srp(latinyz):4 * yu unicodeyz = +srp(latinunicodeyz):4 ! model = symbols $evdevkbds = +inet(evdev)+inet(%m) applealu_jis = +inet(evdev)+macintosh_vndr/jp(alujiskeys) * = +inet(evdev) ! layout variant = compat de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) ! layout[1] variant[1] = compat de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) ! layout[2] variant[2] = compat de neo = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 ! layout[3] variant[3] = compat de neo = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 ! layout[4] variant[4] = compat de neo = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 ! model layout = compat pc98 nec_vndr/jp = pc98(basic) * jp = complete+japan olpc * = olpc * * = complete ! model layout[1] = compat * * = complete ! model = types $macs = complete+numpad(mac) $applealu = complete+numpad(mac) $nokiamodels = complete+nokia * = complete ! layout option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle) * misc:typo = +typo(base) ! layout[1] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):1 * misc:typo = +typo(base):1 ! layout[2] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):2 * misc:typo = +typo(base):2 ! layout[3] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):3 * misc:typo = +typo(base):3 ! layout[4] option = symbols $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):4 * misc:typo = +typo(base):4 ! option = symbols grp:shift_toggle = +group(shifts_toggle) altwin:menu = +altwin(menu) altwin:meta_alt = +altwin(meta_alt) altwin:ctrl_win = +altwin(ctrl_win) altwin:ctrl_alt_win = +altwin(ctrl_alt_win) altwin:meta_win = +altwin(meta_win) altwin:left_meta_win = +altwin(left_meta_win) altwin:hyper_win = +altwin(hyper_win) altwin:alt_super_win = +altwin(alt_super_win) altwin:swap_lalt_lwin = +altwin(swap_lalt_lwin) grp:switch = +group(switch) grp:lswitch = +group(lswitch) grp:win_switch = +group(win_switch) grp:lwin_switch = +group(lwin_switch) grp:rwin_switch = +group(rwin_switch) grp:toggle = +group(toggle) grp:shifts_toggle = +group(shifts_toggle) grp:ctrls_toggle = +group(ctrls_toggle) grp:alts_toggle = +group(alts_toggle) grp:caps_toggle = +capslock(grouplock) grp:caps_switch = +capslock(groupshift) grp:shift_caps_toggle = +group(shift_caps_toggle) grp:shift_caps_switch = +group(shift_caps_switch) grp:win_menu_switch = +group(win_menu_switch) grp:alt_caps_toggle = +group(alt_caps_toggle) grp:alt_space_toggle = +group(alt_space_toggle) grp:menu_toggle = +group(menu_toggle) grp:lwin_toggle = +group(lwin_toggle) grp:rwin_toggle = +group(rwin_toggle) grp:lshift_toggle = +group(lshift_toggle) grp:rshift_toggle = +group(rshift_toggle) grp:rctrl_switch = +group(rctrl_switch) grp:lctrl_toggle = +group(lctrl_toggle) grp:rctrl_toggle = +group(rctrl_toggle) grp:lalt_toggle = +group(lalt_toggle) grp:sclk_toggle = +group(sclk_toggle) grp:lctrl_rctrl_switch = +group(lctrl_rctrl_switch) grp:lctrl_lwin_rctrl_menu = +group(lctrl_lwin_rctrl_menu) grp:lctrl_lalt_toggle = +group(lctrl_lalt_toggle) grp:rctrl_ralt_toggle = +group(rctrl_ralt_toggle) grp:ctrl_alt_toggle = +group(ctrl_alt_toggle) grp:ctrl_alt_toggle_bidir = +group(ctrl_alt_toggle_bidir) grp:lctrl_lshift_toggle = +group(lctrl_lshift_toggle) grp:rctrl_rshift_toggle = +group(rctrl_rshift_toggle) grp:ctrl_shift_toggle = +group(ctrl_shift_toggle) grp:ctrl_shift_toggle_bidir = +group(ctrl_shift_toggle_bidir) grp:lalt_lshift_toggle = +group(lalt_lshift_toggle) grp:ralt_rshift_toggle = +group(ralt_rshift_toggle) grp:alt_shift_toggle = +group(alt_shift_toggle) grp:alt_shift_toggle_bidir = +group(alt_shift_toggle_bidir) lv3:switch = +level3(switch) lv3:ralt_switch = +level3(ralt_switch) lv3:ralt_switch_multikey = +level3(ralt_switch_multikey) lv3:ralt_alt = +level3(ralt_alt) lv3:lalt_switch = +level3(lalt_switch) lv3:alt_switch = +level3(alt_switch) lv3:menu_switch = +level3(menu_switch) lv3:win_switch = +level3(win_switch) lv3:lwin_switch = +level3(lwin_switch) lv3:rwin_switch = +level3(rwin_switch) lv3:enter_switch = +level3(enter_switch) caps:capslock = +capslock(capslock) caps:numlock = +capslock(numlock) caps:shiftlock = +capslock(shiftlock) caps:swapescape = +capslock(swapescape) caps:escape = +capslock(escape) caps:backspace = +capslock(backspace) caps:super = +capslock(super) caps:hyper = +capslock(hyper) caps:none = +capslock(none) caps:ctrl_modifier = +capslock(ctrl_modifier) ctrl:nocaps = +ctrl(nocaps) ctrl:lctrl_meta = +ctrl(lctrl_meta) ctrl:swapcaps = +ctrl(swapcaps) ctrl:ac_ctrl = +ctrl(ac_ctrl) ctrl:aa_ctrl = +ctrl(aa_ctrl) ctrl:rctrl_ralt = +ctrl(rctrl_ralt) ctrl:menu_rctrl = +ctrl(menu_rctrl) ctrl:ralt_rctrl = +ctrl(ralt_rctrl) compose:ralt = +compose(ralt) compose:lwin = +compose(lwin) compose:rwin = +compose(rwin) compose:menu = +compose(menu) compose:lctrl = +compose(lctrl) compose:rctrl = +compose(rctrl) compose:caps = +compose(caps) compose:102 = +compose(102) compose:paus = +compose(paus) compose:prsc = +compose(prsc) compose:sclk = +compose(sclk) srvrkeys:none = +srvr_ctrl(no_srvr_keys) eurosign:e = +eurosign(e) eurosign:2 = +eurosign(2) eurosign:4 = +eurosign(4) eurosign:5 = +eurosign(5) rupeesign:4 = +rupeesign(4) keypad:oss = +keypad(oss) keypad:legacy = +keypad(legacy) keypad:legacy_wang = +keypad(legacy_wang) keypad:oss_wang = +keypad(oss_wang) keypad:future = +keypad(future) keypad:future_wang = +keypad(future_wang) keypad:hex = +keypad(ops)+keypad(hex) keypad:atm = +keypad(ops)+keypad(hex)+keypad(atm) nbsp:none = +nbsp(none) nbsp:level2 = +nbsp(level2) nbsp:level3 = +nbsp(level3) nbsp:level3s = +nbsp(level3s) nbsp:level3n = +nbsp(level3n) nbsp:level4 = +nbsp(level4) nbsp:level4n = +nbsp(level4n) nbsp:level4nl = +nbsp(level4nl) japan:nicola_f_bs = +jp(nicola_f_bs) japan:hztg_escape = +jp(hztg_escape) kpdl:dot = +kpdl(dot) kpdl:comma = +kpdl(comma) kpdl:dotoss = +kpdl(dotoss) kpdl:dotoss_latin9 = +kpdl(dotoss_latin9) kpdl:commaoss = +kpdl(commaoss) kpdl:momayyezoss = +kpdl(momayyezoss) kpdl:kposs = +kpdl(kposs) kpdl:semi = +kpdl(semi) shift:breaks_caps = +shift(breaks_caps) esperanto:qwerty = +epo(qwerty) esperanto:dvorak = +epo(dvorak) terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp) keypad:pointerkeys = +keypad(pointerkeys) apple:alupckeys = +macintosh_vndr/apple(alupckeys) shift:both_capslock = +shift(both_capslock) shift:lshift_both_capslock = +shift(lshift_both_capslock) shift:rshift_both_capslock = +shift(rshift_both_capslock) shift:both_capslock_cancel = +shift(both_capslock_cancel) shift:lshift_both_capslock_cancel = +shift(lshift_both_capslock_cancel) shift:rshift_both_capslock_cancel = +shift(rshift_both_capslock_cancel) shift:both_shiftlock = +shift(both_shiftlock) shift:lshift_both_shiftlock = +shift(lshift_both_shiftlock) shift:rshift_both_shiftlock = +shift(rshift_both_shiftlock) lv3:caps_switch = +level3(caps_switch) lv3:bksl_switch = +level3(bksl_switch) lv3:lsgt_switch = +level3(lsgt_switch) lv3:caps_switch_latch = +level3(caps_switch_latch) lv3:bksl_switch_latch = +level3(bksl_switch_latch) lv3:lsgt_switch_latch = +level3(lsgt_switch_latch) lv5:lsgt_switch_lock = +level5(lsgt_switch_lock) lv5:ralt_switch_lock = +level5(ralt_switch_lock) lv5:lwin_switch_lock = +level5(lwin_switch_lock) lv5:rwin_switch_lock = +level5(rwin_switch_lock) lv5:lsgt_switch_lock_cancel = +level5(lsgt_switch_lock_cancel) lv5:ralt_switch_lock_cancel = +level5(ralt_switch_lock_cancel) lv5:lwin_switch_lock_cancel = +level5(lwin_switch_lock_cancel) lv5:rwin_switch_lock_cancel = +level5(rwin_switch_lock_cancel) ! option = compat grp_led:num = +lednum(group_lock) grp_led:caps = +ledcaps(group_lock) grp_led:scroll = +ledscroll(group_lock) caps:shiftlock = +ledcaps(shift_lock) grab:break_actions = +xfree86(grab_break) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7253134 libxkbcommon-0.10.0/test/data/rules/groups0000644000175000017500000000076700000000000020135 0ustar00ranran00000000000000! $model_group = pc101 pc102 \ pc104\ pc105\ pc106 ! $layout_group = ar br cr us ! $variant_group = ! model = keycodes $model_group = something(%m) * = default_keycodes ! layout variant = symbols $layout_group * = my_symbols+%(v) * * = default_symbols ! model = types * = default_types ! model = compat * = default_compat ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7319798 libxkbcommon-0.10.0/test/data/rules/inc-dst-loop-twice0000644000175000017500000000070200000000000022224 0ustar00ranran00000000000000! model = keycodes * = default_keycodes ! layout variant = symbols my_layout my_variant = my_symbols+extra_variant ! layout = symbols my_layout = my_symbols * = default_symbols ! model = types * = default_types ! model = compat * = default_compat ! option = compat my_option = |some:compat ! include %S/inc-src-loop-twice ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7386465 libxkbcommon-0.10.0/test/data/rules/inc-dst-simple0000644000175000017500000000064200000000000021436 0ustar00ranran00000000000000! model = keycodes my_model = my_keycodes * = default_keycodes ! layout variant = symbols my_layout my_variant = my_symbols+extra_variant ! layout = symbols * = default_symbols ! model = types * = default_types ! model = compat * = default_compat ! option = compat my_option = |some:compat ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7386465 libxkbcommon-0.10.0/test/data/rules/inc-src-before-after0000644000175000017500000000021600000000000022500 0ustar00ranran00000000000000! model = keycodes before_model = my_keycodes ! include %S/inc-dst-simple ! layout = symbols after_layout = my_symbols ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7419798 libxkbcommon-0.10.0/test/data/rules/inc-src-loop-twice0000644000175000017500000000013200000000000022216 0ustar00ranran00000000000000! model = keycodes my_model = my_keycodes ! include %S/inc-dst-loop-twice ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7586462 libxkbcommon-0.10.0/test/data/rules/inc-src-looped0000644000175000017500000000003400000000000021417 0ustar00ranran00000000000000! include %S/inc-src-looped ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7586462 libxkbcommon-0.10.0/test/data/rules/inc-src-nested0000644000175000017500000000003400000000000021417 0ustar00ranran00000000000000! include %S/inc-src-simple ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.765313 libxkbcommon-0.10.0/test/data/rules/inc-src-options0000644000175000017500000000036700000000000021641 0ustar00ranran00000000000000! option = compat option111 = +substring option1 = +some:compat option11 = +group(bla) ! include %S/inc-dst-simple ! option = symbols option3 = +compose(foo)+keypad(bar) colon:opt = +altwin(menu) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7753127 libxkbcommon-0.10.0/test/data/rules/inc-src-simple0000644000175000017500000000012400000000000021426 0ustar00ranran00000000000000! layout = symbols my_layout = my_symbols ! include %S/inc-dst-simple ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7753127 libxkbcommon-0.10.0/test/data/rules/index0000644000175000017500000000136400000000000017717 0ustar00ranran00000000000000! $layouts = al az br cn us ! layout option = symbols $layouts some:opt = +extra ! layout[1] option = symbols $layouts some:opt = +extra:1 ! layout[2] option = symbols $layouts some:opt = +extra:2 ! layout[3] option = symbols $layouts some:opt = +extra:3 ! layout[4] option = symbols $layouts some:opt = +extra:4 ! model = symbols * = default_symbols ! model = keycodes * = default_keycodes ! model = types * = default_types ! model = compat * = default_compat ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7753127 libxkbcommon-0.10.0/test/data/rules/multiple-options0000644000175000017500000000123000000000000022124 0ustar00ranran00000000000000! model = keycodes my_model = my_keycodes * = default_keycodes ! layout variant = symbols my_layout my_variant = my_symbols+extra_variant ! layout = symbols my_layout = my_symbols * = default_symbols ! model = types my_model = my_types * = default_types ! model = compat my_model = my_compat * = default_compat ! option = compat option111 = +substring option1 = +some:compat option11 = +group(bla) ! option = symbols option3 = +compose(foo)+keypad(bar) colon:opt = +altwin(menu) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7753127 libxkbcommon-0.10.0/test/data/rules/simple0000644000175000017500000000076600000000000020106 0ustar00ranran00000000000000! model = keycodes my_model = my_keycodes * = default_keycodes ! layout variant = symbols my_layout my_variant = my_symbols+extra_variant ! layout = symbols my_layout = my_symbols * = default_symbols ! model = types my_model = my_types * = default_types ! model = compat my_model = my_compat * = default_compat ! option = compat my_option = |some:compat ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.888645 libxkbcommon-0.10.0/test/data/symbols/0000755000175000017500000000000000000000000017217 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.788646 libxkbcommon-0.10.0/test/data/symbols/altwin0000644000175000017500000000644300000000000020447 0ustar00ranran00000000000000// Meta is mapped to second level of Alt. partial modifier_keys xkb_symbols "meta_alt" { key { [ Alt_L, Meta_L ] }; key { type[Group1] = "TWO_LEVEL", symbols[Group1] = [ Alt_R, Meta_R ] }; modifier_map Mod1 { Alt_L, Alt_R, Meta_L, Meta_R }; // modifier_map Mod4 {}; }; // Alt is mapped to the Super and the usual Alt. partial modifier_keys xkb_symbols "alt_win" { key { [ Alt_L ] }; key { [ Alt_R ] }; modifier_map Mod1 { , }; }; // Ctrl is mapped to the Super and the usual Ctrl keys. partial modifier_keys xkb_symbols "ctrl_win" { key { [ Control_L ] }; key { [ Control_R ] }; modifier_map Control { , }; }; // Ctrl is mapped to the Alt, Alt to the Super, and Win to the Ctrl keys. partial modifier_keys xkb_symbols "ctrl_alt_win" { key { [ Control_L, Control_L ] }; key { type[Group1] = "TWO_LEVEL", symbols[Group1] = [ Control_R, Control_R ] }; key { [ Alt_L, Meta_L ] }; key { [ Alt_R, Meta_R ] }; key { [ Super_L ] }; key { [ Super_R ] }; modifier_map Control { , }; modifier_map Mod1 { , }; modifier_map Mod4 { , }; }; // Meta is mapped to the Super. partial modifier_keys xkb_symbols "meta_win" { key { [ Alt_L, Alt_L ] }; key { type[Group1] = "TWO_LEVEL", symbols[Group1] = [ Alt_R, Alt_R ] }; key { [ Meta_L ] }; key { [ Meta_R ] }; modifier_map Mod1 { Alt_L, Alt_R }; modifier_map Mod4 { , Meta_L, Meta_R }; }; // Meta is mapped to the left Win key. partial modifier_keys xkb_symbols "left_meta_win" { key { [ Alt_L, Alt_L ] }; key { [ Meta_L ] }; modifier_map Mod1 { Alt_L }; modifier_map Mod4 { , Meta_L }; }; // Hyper is mapped to the Super. partial modifier_keys xkb_symbols "hyper_win" { key { [ Hyper_L ] }; key { [ Hyper_R ] }; modifier_map Mod4 { Hyper_L, Hyper_R }; }; // Menu is mapped to the Menu key. partial modifier_keys xkb_symbols "menu" { key { [ Menu ] }; }; // Layout for Tux key caps with additional right Alt key partial modifier_keys xkb_symbols "alt_super_win" { key { [ Alt_L, Meta_L ] }; key { [ Alt_R, Meta_R ] }; key { [ Super_L ]}; key { [ Super_R ] }; modifier_map Mod1 { Alt_L, Alt_R, Meta_L, Meta_R }; modifier_map Mod4 { Super_L, Super_R }; }; // Swap the Alt and Super. partial modifier_keys xkb_symbols "swap_alt_win" { include "altwin(swap_lalt_lwin)" include "altwin(swap_ralt_rwin)" }; // Swap the left Alt and Super. partial modifier_keys xkb_symbols "swap_lalt_lwin" { key { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Super_L ] }; key { [ Alt_L, Meta_L ] }; }; // Swap the right Alt and Super. hidden partial modifier_keys xkb_symbols "swap_ralt_rwin" { key { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Super_R ] }; key { [ Alt_R, Meta_R ] }; }; // Win is mapped to the PrtSc key (and the usual Win key). partial modifier_keys xkb_symbols "prtsc_rwin" { replace key { [ Super_R, Super_R ] }; modifier_map Mod4 { , }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7919793 libxkbcommon-0.10.0/test/data/symbols/awesome0000644000175000017500000000167500000000000020613 0ustar00ranran00000000000000default alphanumeric_keys modifier_keys function_keys alternate_group xkb_symbols "awesome" { include "us" name[Group1]= "My Awesome Layout"; key { [ 2, at, Page_Up, Page_Up ] }; key { [ 3, numbersign, Page_Down, Page_Down ] }; key { [ q, Q, Escape, Escape ] }; key { [ w, W, Home, Home ] }; key { type="THREE_LEVEL", symbols=[ e, E, Up] }; key { [ r, R, End, End ] }; key { [ t, T, Tab, Tab ] }; key { [ a, A, Return, Return ] }; key { [ s, S, Left] }; key { [ d, D, Down] }; key { [ f, F, Righ] }; key { [ g, G, BackSpace, BackSpace ] }; key { [ b, B, Delete, Delete ] }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.7919793 libxkbcommon-0.10.0/test/data/symbols/ca0000644000175000017500000005202000000000000017524 0ustar00ranran00000000000000default partial xkb_symbols "fr" { name[Group1] = "French (Canada)"; key { [ numbersign, bar, backslash ] }; key { [ 1, exclam, plusminus ] }; key { [ 2, quotedbl, at ] }; key { [ 3, slash, sterling ] }; key { [ 4, dollar, cent ] }; key { [ 5, percent, currency ] }; key { [ 6, question, notsign ] }; key { [ 7, ampersand, brokenbar ] }; key { [ 8, asterisk, twosuperior ] }; key { [ 9, parenleft, threesuperior ] }; key { [ 0, parenright, onequarter ] }; key { [ minus, underscore, onehalf ] }; key { [ equal, plus, threequarters ] }; key { [ q, Q ] }; key { [ w, W ] }; key { [ e, E ] }; key { [ r, R ] }; key { [ t, T ] }; key { [ y, Y ] }; key { [ u, U ] }; key { [ i, I ] }; key { [ o, O, section ] }; key { [ p, P, paragraph ] }; key { [dead_circumflex, dead_circumflex, bracketleft ] }; key { [ dead_cedilla, dead_diaeresis, bracketright ] }; key { [ a, A ] }; key { [ s, S ] }; key { [ d, D ] }; key { [ f, F ] }; key { [ g, G ] }; key { [ h, H ] }; key { [ j, J ] }; key { [ k, K ] }; key { [ l, L ] }; key { [ semicolon, colon, asciitilde ] }; key { [dead_grave, dead_grave, braceleft ] }; key { [ less, greater, braceright ] }; key { [guillemotleft, guillemotright, degree] }; key { [ z, Z ] }; key { [ x, X ] }; key { [ c, C ] }; key { [ v, V ] }; key { [ b, B ] }; key { [ n, N ] }; key { [ m, M, mu ] }; key { [ comma, apostrophe, macron ] }; key { [ period, period, hyphen ] }; key { [ eacute, Eacute, dead_acute ] }; key { [ space, space, nobreakspace ] }; include "level3(ralt_switch)" }; xkb_symbols "fr-dvorak" { name[Group1] = "French (Canada, Dvorak)"; key { [ numbersign, bar, backslash ] }; key { [ 1, exclam, plusminus ] }; key { [ 2, quotedbl, at ] }; key { [ 3, slash, sterling ] }; key { [ 4, dollar, cent ] }; key { [ 5, percent, currency ] }; key { [ 6, question, notsign ] }; key { [ 7, ampersand, brokenbar ] }; key { [ 8, asterisk, twosuperior ] }; key { [ 9, parenleft, threesuperior ] }; key { [ 0, parenright, onequarter ] }; key { [dead_circumflex, dead_circumflex, bracketleft ] }; key { [ dead_cedilla, dead_diaeresis, bracketright ] }; key { [dead_grave, dead_grave, braceleft ] }; key { [ comma, apostrophe, macron ] }; key { [ period, period, hyphen ] }; key { [ p, P, paragraph ] }; key { [ y, Y ] }; key { [ f, F ] }; key { [ g, G ] }; key { [ c, C ] }; key { [ r, R ] }; key { [ l, L ] }; key { [ eacute, Eacute, dead_acute ] }; key { [ equal, plus, threequarters ] }; key { [ a, A ] }; key { [ o, O, section ] }; key { [ e, E ] }; key { [ u, U ] }; key { [ i, I ] }; key { [ d, D ] }; key { [ h, H ] }; key { [ t, T ] }; key { [ n, N ] }; key { [ s, S ] }; key { [ minus, underscore, onehalf ] }; key { [ less, greater, braceright ] }; key { [guillemotleft, guillemotright, degree] }; key { [ semicolon, colon, asciitilde ] }; key { [ q, Q ] }; key { [ j, J ] }; key { [ k, K ] }; key { [ x, X ] }; key { [ b, B ] }; key { [ m, M, mu ] }; key { [ w, W ] }; key { [ v, V ] }; key { [ z, Z ] }; key { [ space, space, nobreakspace ] }; include "level3(ralt_switch)" }; partial xkb_symbols "fr-legacy" { include "ca(fr)" name[Group1] = "French (Canada, legacy)"; key { [ degree, degree, notsign ] }; key { [ 1, exclam, onesuperior ] }; key { [ 3, numbersign, threesuperior ] }; key { [ 4, dollar, onequarter ] }; key { [ 5, percent, onehalf ] }; key { [ 6, question, threequarters ] }; key { [ 7, ampersand, braceleft ] }; key { [ 8, asterisk, bracketleft ] }; key { [ 9, parenleft, bracketright, plusminus ] }; key { [ 0, parenright, braceright ] }; key { [ minus, underscore, bar, questiondown] }; key { [ equal, plus, dead_cedilla ] }; key { [ r, R, paragraph, registered ] }; key { [ y, Y, yen ] }; key { [ o, O, oslash, Ooblique ] }; key { [ p, P, thorn, THORN ] }; key { [dead_circumflex, dead_circumflex, degree ] }; key { [ ccedilla, Ccedilla, dead_tilde, dead_diaeresis ] }; key { [ a, A, ae, AE ] }; key { [ s, S, ssharp, section ] }; key { [ d, D, eth, ETH ] }; key { [ f, F, ordfeminine ] }; key { [ semicolon, colon, dead_acute, dead_acute ] }; key { [ egrave, Egrave ] }; key { [ agrave, Agrave, dead_grave ] }; key { [ ugrave, Ugrave, backslash, bar ] }; key { [ z, Z, guillemotleft ] }; key { [ x, X, guillemotright ] }; key { [ c, C, cent, copyright ] }; key { [ m, M, mu, masculine ] }; key { [ comma, apostrophe, less ] }; key { [ period, period, greater ] }; key { [ eacute, Eacute, slash ] }; }; partial xkb_symbols "multi" { include "ca(fr)" name[Group1] = "Canadian Multilingual (1st part)"; key { [ slash, backslash, bar ] }; key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, numbersign ] }; key { [ 4, dollar ] }; key { [ 5, percent ] }; key { [ 6, question ] }; key { [ 7, ampersand, braceleft ] }; key { [ 8, asterisk, braceright ] }; key { [ 9, parenleft, bracketleft ] }; key { [ 0, parenright, bracketright ] }; key { [ minus, underscore ] }; key { [ equal, plus, notsign ] }; key { [ o, O ] }; key { [ p, P ] }; key { [dead_circumflex, dead_diaeresis, dead_grave ] }; key { [ ccedilla, Ccedilla, asciitilde ] }; key { [ semicolon, colon, degree ] }; key { [ egrave, Egrave ] }; key { [ agrave, Agrave ] }; key { [ ugrave, Ugrave ] }; key { [ z, Z, guillemotleft ] }; key { [ x, X, guillemotright ] }; key { [ comma, apostrophe, less ] }; key { [ period, quotedbl, greater ] }; key { [ eacute, Eacute ] }; }; partial xkb_symbols "multi-2gr" { name[Group1] = "Canadian Multilingual (2nd part)"; key { [ NoSymbol, hyphen ] }; key { [ onesuperior, exclamdown ] }; key { [ twosuperior, NoSymbol ] }; key { [ threesuperior, sterling ] }; key { [ onequarter, currency ] }; key { [ onehalf,threeeighths ] }; key { [ threequarters, fiveeighths ] }; key { [ NoSymbol,seveneighths ] }; key { [ NoSymbol, trademark ] }; key { [ NoSymbol, plusminus ] }; key { [ NoSymbol, questiondown] }; key { [ dead_cedilla, dead_ogonek ] }; key { [ NoSymbol, Greek_OMEGA ] }; key { [ lstroke, Lstroke ] }; key { [ oe, OE ] }; key { [ paragraph, registered ] }; key { [ tslash, Tslash ] }; key { [ leftarrow, yen ] }; key { [ downarrow, uparrow ] }; key { [ rightarrow, idotless ] }; key { [ oslash, Ooblique ] }; key { [ thorn, THORN ] }; key { [ NoSymbol, dead_abovering ] }; key { [ dead_tilde, dead_macron ] }; key { [ ae, AE ] }; key { [ ssharp, section ] }; key { [ eth, ETH ] }; key { [ NoSymbol, ordfeminine ] }; key { [ eng, ENG ] }; key { [ hstroke, Hstroke ] }; key { [ U0133, U0132 ] }; key { [ kra, NoSymbol ] }; key { [ U0140, U013F ] }; key { [ dead_acute, dead_doubleacute ] }; key { [ NoSymbol, dead_caron ] }; key { [ NoSymbol, dead_breve ] }; key { [ NoSymbol, brokenbar ] }; key { [ cent, copyright ] }; key { [ leftdoublequotemark, leftsinglequotemark ] }; key { [ rightdoublequotemark, rightsinglequotemark ] }; key { [ U0149, U266A ] }; key { [ mu, masculine ] }; key { [ Greek_horizbar, multiply ] }; key { [ periodcentered, division ] }; key { [ NoSymbol, dead_abovedot ] }; }; // based on // Inuktitut keyboard for X11 // written by Pablo Saratxaga alphanumeric_keys xkb_symbols "ike" { name[Group1]= "Inuktitut"; key { [ 0x01001595, 1 ] }; key { [ 0x01001449, 2 ] }; key { [ 0x01001550, 3 ] }; key { [ 0x01001483, 4 ] }; key { [ 0x01001466, 5 ] }; key { [ 0x01001585, 6 ] }; key { [ 0x010014bb, 7 ] }; key { [ 0x010014d0, 8 ] }; key { [ 0x010014ea, 9 ] }; key { [ 0x0100153e, 0 ] }; key { [ minus, underscore ] }; key { [ 0x0100155d, equal ] }; key { [ 0x0100158f, 0x0100148b ] }; key { [ 0x01001403, 0x01001431 ] }; key { [ 0x0100157f, 0x01001546 ] }; key { [ 0x0100146d, 0x01001596 ] }; key { [ 0x0100144e, 0x01001671 ] }; key { [ 0x010014ef, 0x01001673 ] }; key { [ 0x010014a5, 0x01001675 ] }; key { [ 0x010014c2, 0x010015a4 ] }; key { [ 0x010014d5, 0x010015a0 ] }; key { [ 0x01001528, 0x010015a6 ] }; key { [ 0x010014a1, 0x01001505 ] }; key { [ dead_abovedot, 0x0100141e] }; key { [ 0x01001591, 0x0100148d ] }; key { [ 0x01001405, 0x01001433 ] }; key { [ 0x01001581, 0x01001548 ] }; key { [ 0x0100146f, 0x01001555 ] }; key { [ 0x01001450, parenleft ] }; key { [ 0x010014f1, parenright ] }; key { [ 0x010014a7, 0x0100152a ] }; key { [ 0x010014c4, 0x01001557 ] }; key { [ 0x010014d7, 0x010015a2 ] }; key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl ] }; key { [ 0x01001593, 0x01001490 ] }; key { [ 0x0100140a, 0x01001438 ] }; key { [ 0x01001583, 0x0100154b ] }; key { [ 0x01001472, question ] }; key { [ 0x01001455, 0x0100157c ] }; key { [ 0x010014f4, 0x010014c7 ] }; key { [ 0x010014aa, 0x010014da ] }; key { [ comma, less ] }; key { [ period, greater ] }; key { [ 0x0100152d, 0x01001559 ] }; key { [ 0x0100157b, 0x01001575 ] }; key { [ 0x01001579, 0x01001577 ] }; key { [ backslash, bar ] }; }; partial xkb_symbols "multix" { name[Group1] = "Canadian Multilingual"; key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC"; key { [ slash, backslash, bar, NoSymbol, NoSymbol, hyphen ] }; key { [ 1, exclam, plusminus, NoSymbol, onesuperior, exclamdown ] }; key { [ 2, at, at, NoSymbol, twosuperior, NoSymbol ] }; key { [ 3, numbersign, sterling, NoSymbol, threesuperior, sterling ] }; key { [ 4, dollar, cent, NoSymbol, onequarter, currency ] }; key { [ 5, percent, currency, NoSymbol, onehalf, threeeighths ] }; key { [ 6, question, notsign, NoSymbol, threequarters, fiveeighths ] }; key { [ 7, ampersand, braceleft, NoSymbol, NoSymbol, seveneighths ] }; key { [ 8, asterisk, braceright, NoSymbol, NoSymbol, trademark ] }; key { [ 9, parenleft, bracketleft, NoSymbol, NoSymbol, plusminus ] }; key { [ 0, parenright, bracketright, NoSymbol ] }; key { [ minus, underscore, onehalf, NoSymbol, NoSymbol, questiondown] }; key { [ equal, plus, notsign, NoSymbol, dead_cedilla, dead_ogonek ] }; key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC"; key { [ q, Q, NoSymbol, NoSymbol, NoSymbol, Greek_OMEGA ] }; key { [ w, W, NoSymbol, NoSymbol, lstroke, Lstroke ] }; key { [ e, E, NoSymbol, NoSymbol, oe, OE ] }; key { [ r, R, NoSymbol, NoSymbol, paragraph, registered ] }; key { [ t, T, NoSymbol, NoSymbol, tslash, Tslash ] }; key { [ y, Y, NoSymbol, NoSymbol, leftarrow, yen ] }; key { [ u, U, NoSymbol, NoSymbol, downarrow, uparrow ] }; key { [ i, I, NoSymbol, NoSymbol, rightarrow, idotless ] }; key { [ o, O, section, NoSymbol, oslash, Ooblique ] }; key { [ p, P, paragraph, NoSymbol, thorn, THORN ] }; key.type[group1]="EIGHT_LEVEL"; key { [dead_circumflex, dead_diaeresis, dead_grave, NoSymbol, NoSymbol, dead_abovering ] }; key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC"; key { [ ccedilla, Ccedilla, asciitilde, NoSymbol, dead_tilde, dead_macron ] }; key { [ a, A, NoSymbol, NoSymbol, ae, AE ] }; key { [ s, S, NoSymbol, NoSymbol, ssharp, section ] }; key { [ d, D, NoSymbol, NoSymbol, eth, ETH ] }; key { [ f, F, NoSymbol, NoSymbol, NoSymbol, ordfeminine ] }; key { [ g, G, NoSymbol, NoSymbol, eng, ENG ] }; key { [ h, H, NoSymbol, NoSymbol, hstroke, Hstroke ] }; key { [ j, J, NoSymbol, NoSymbol, U0133, U0132 ] }; key { [ k, K, NoSymbol, NoSymbol, kra, NoSymbol ] }; key { [ l, L, NoSymbol, NoSymbol, U0140, U013F ] }; key.type[group1]="EIGHT_LEVEL"; key { [ semicolon, colon, degree, NoSymbol, dead_acute, dead_doubleacute ] }; key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC"; key { [ egrave, Egrave, braceleft, NoSymbol, NoSymbol, dead_caron ] }; key { [ agrave, Agrave, braceright, NoSymbol, NoSymbol, dead_breve ] }; key { [ ugrave, Ugrave, degree, NoSymbol, NoSymbol, brokenbar ] }; key.type[group1]="FOUR_LEVEL_SEMIALPHABETIC"; key { [ z, Z, guillemotleft, NoSymbol ] }; key { [ x, X, guillemotright, NoSymbol ] }; key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC"; key { [ c, C, NoSymbol, NoSymbol, cent, copyright ] }; key { [ v, V, NoSymbol, NoSymbol, leftdoublequotemark, leftsinglequotemark ] }; key { [ b, B, NoSymbol, NoSymbol, rightdoublequotemark, rightsinglequotemark ] }; key { [ n, N, NoSymbol, NoSymbol, U0149, U266A ] }; key { [ m, M, mu, NoSymbol, mu, masculine ] }; key { [ comma, apostrophe, less, NoSymbol, Greek_horizbar, multiply ] }; key { [ period, quotedbl, greater, NoSymbol, periodcentered, division ] }; key { [ eacute, Eacute, dead_acute, NoSymbol, NoSymbol, dead_abovedot ] }; include "nbsp(level3s)" modifier_map Control{ Control_L }; include "level3(ralt_switch)" include "level5(rctrl_switch)" }; // OLPC Section xkb_symbols "olpc" { include "ca(fr)" key { [ 2, quotedbl, ograve, Ograve ] }; key { [ 3, slash, at, VoidSymbol ] }; key { [ e, E, EuroSign, VoidSymbol] }; key { [ period, period, 0x1002010 ] }; key { [ guillemotleft, guillemotright, degree, VoidSymbol ] }; }; partial alphanumeric_keys xkb_symbols "eng" { include "us(basic)" name[Group1] = "English (Canada)"; key { [ backslash, bar, VoidSymbol, VoidSymbol ] }; }; // EXTRAS: partial alphanumeric_keys xkb_symbols "kut" { // Ejective U0313 and acute accents are taken from shs layout. include "ca(shs)" name[Group1]= "Kutenai"; // Alveolar Click key { [ t, T,U01C2 ,U01C2 ] }; //Cent sign key { [ c, C,U00A2,U00A2 ] }; //Mid dot key { [ period, greater,U00B7 ] }; //Glottal stop key { [ slash, question, U0294 ] }; //COMBINING COMMA ABOVE RIGHT key { [ apostrophe, quotedbl, U0315,U0315 ] }; //MODIFIER LETTER RIGHT HALF RING key { [ semicolon, colon,U02BE,U02BE ] }; }; // Secwepemctsin keyboard for X11 // written by Neskie Manuel partial alphanumeric_keys xkb_symbols "shs" { include "us" name[Group1]= "Secwepemctsin"; // Using a "dead key" to get a COMBINING COMMA ABOVE // for ejectives on q, l, t, s, m, g, k, p, w, y, r. // The Compose key is used for the other acutes and grave. key { [ comma, less, U0313 ] }; key { [ a, A, aacute, Aacute ] }; key { [ e, E, eacute, Eacute ] }; key { [ u, U, uacute, Uacute ] }; key { [ i, I, iacute, Iacute ] }; key { [ o, O, oacute, Oacute ] }; include "level3(ralt_switch)" include "compose(rctrl)" }; partial alphanumeric_keys xkb_symbols "sun_type6" { include "sun_vndr/ca(sun_type6)" }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.798646 libxkbcommon-0.10.0/test/data/symbols/capslock0000644000175000017500000000332500000000000020744 0ustar00ranran00000000000000default hidden partial modifier_keys xkb_symbols "capslock" { replace key { [ Caps_Lock ] }; modifier_map Lock { Caps_Lock }; }; hidden partial modifier_keys xkb_symbols "shiftlock" { replace key { [ Shift_Lock ] }; modifier_map Shift { Shift_Lock }; }; hidden partial modifier_keys xkb_symbols "grouplock" { replace key { [ ISO_Next_Group, Caps_Lock ] }; }; hidden partial modifier_keys xkb_symbols "groupshift" { key { type[Group1] = "PC_ALT_LEVEL2", [ Mode_switch, Caps_Lock ] }; }; hidden partial modifier_keys xkb_symbols "swapescape" { key { [ Escape ] }; key { [ Caps_Lock ] }; }; hidden partial modifier_keys xkb_symbols "escape" { key { [ Escape ] }; }; hidden partial modifier_keys xkb_symbols "backspace" { key { [ BackSpace ] }; }; hidden partial modifier_keys xkb_symbols "super" { key { [ Super_L ] }; modifier_map Mod4 { }; }; hidden partial modifier_keys xkb_symbols "hyper" { key { [ Hyper_L ] }; modifier_map Mod4 { }; }; hidden partial modifier_keys xkb_symbols "menu" { key { [ Menu ] }; }; hidden partial modifier_keys xkb_symbols "numlock" { key { [ Num_Lock ] }; }; // This changes the key to become a Control modifier, // but it will still produce the Caps_Lock keysym. hidden partial modifier_keys xkb_symbols "ctrl_modifier" { replace key { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Caps_Lock ], actions[Group1] = [ SetMods(modifiers=Control) ] }; modifier_map Control { }; }; hidden partial modifier_keys xkb_symbols "none" { key { [ VoidSymbol ] }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.798646 libxkbcommon-0.10.0/test/data/symbols/ch0000644000175000017500000002014500000000000017536 0ustar00ranran00000000000000default partial alphanumeric_keys xkb_symbols "basic" { include "latin" name[Group1]= "German (Switzerland)"; key { [ section, degree ] }; key { [ 1, plus, bar, exclamdown ] }; key { [ 2, quotedbl, at, oneeighth ] }; key { [ 3, asterisk, numbersign ] }; key { [ 4, ccedilla ] }; key { [ 5, percent ] }; key { [ 6, ampersand, notsign ] }; key { [ 7, slash, bar ] }; key { [ 8, parenleft, cent ] }; key { [ 9, parenright ] }; key { [ 0, equal ] }; key { [ apostrophe, question, dead_acute ] }; key { [ dead_circumflex, dead_grave, dead_tilde ] }; key { [ e, E, EuroSign ] }; key { [ z, Z ] }; key { [ o, O, oe, OE ] }; key { [ udiaeresis, egrave, bracketleft ] }; key { [ dead_diaeresis, exclam, bracketright ] }; key { [ odiaeresis, eacute ] }; key { [ adiaeresis, agrave, braceleft ] }; key { [ dollar, sterling, braceright ] }; key { [ less, greater, backslash, brokenbar ] }; key { [ y, Y ] }; key { [ comma, semicolon ] }; key { [ period, colon ] }; key { [ minus, underscore ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "legacy" { include "ch(basic)" name[Group1]= "German (Switzerland, legacy)"; key { [ 7, slash, brokenbar ] }; }; partial alphanumeric_keys xkb_symbols "de" { include "ch(basic)" }; partial alphanumeric_keys xkb_symbols "de_Sundeadkeys" { // modify the basic Swiss German layout to use Sun dead keys include "ch(basic)" key { [ apostrophe, question, dead_acute ] }; key { [ dead_circumflex, dead_grave, dead_tilde ] }; key { [ dead_diaeresis, exclam, bracketright ] }; }; partial alphanumeric_keys xkb_symbols "de_sundeadkeys" { include "ch(de_Sundeadkeys)" name[Group1]= "German (Switzerland, with Sun dead keys)"; }; partial alphanumeric_keys xkb_symbols "de_nodeadkeys" { // modify the basic Swiss German layout not to have any dead keys include "ch(basic)" name[Group1]= "German (Switzerland, no dead keys)"; key { [ apostrophe, question, acute ] }; key { [ asciicircum, grave, asciitilde ] }; key { [ diaeresis, exclam, bracketright ] }; }; partial alphanumeric_keys xkb_symbols "fr" { include "ch(basic)" name[Group1]= "French (Switzerland)"; override key { [ egrave, udiaeresis, bracketleft ] }; override key { [ eacute, odiaeresis ] }; override key { [ agrave, adiaeresis, braceleft ] }; }; partial alphanumeric_keys xkb_symbols "fr_Sundeadkeys" { // modify the basic Swiss French layout to use Sun dead keys include "ch(fr)" key { [ apostrophe, question, dead_acute ] }; key { [ dead_circumflex, dead_grave, dead_tilde ] }; key { [ dead_diaeresis, exclam, bracketright ] }; }; partial alphanumeric_keys xkb_symbols "fr_sundeadkeys" { include "ch(fr_Sundeadkeys)" name[Group1]= "French (Switzerland, with Sun dead keys)"; }; partial alphanumeric_keys xkb_symbols "fr_nodeadkeys" { // modify the basic Swiss French layout not to have any dead keys include "ch(fr)" name[Group1]= "French (Switzerland, no dead keys)"; key { [ apostrophe, question, acute ] }; key { [ asciicircum, grave, asciitilde ] }; key { [ diaeresis, exclam, bracketright ] }; }; // Copied from macintosh_vndr/ch // 03.01.2003 // Andreas Tobler // modified for Swiss German Apple Extended Keyboard II partial alphanumeric_keys xkb_symbols "de_mac" { name[Group1]= "German (Switzerland, Macintosh)"; key { [ 1, plus, plusminus, infinity ] }; key { [ 2, quotedbl, leftdoublequotemark, rightdoublequotemark ] }; key { [ 3, asterisk, numbersign, leftcaret ] }; // not displayed here key { [ 4, ccedilla, Ccedilla, slash ] }; key { [ 5, percent, bracketleft ] }; key { [ 6, ampersand, bracketright ] }; key { [ 7, slash, bar, backslash ] }; key { [ 8, parenleft, braceleft, Ograve ] }; key { [ 9, parenright, braceright, Ocircumflex ] }; key { [ 0, equal, notequal, Uacute ] }; key { [ apostrophe, question, questiondown, NoSymbol ] }; key { [ dead_circumflex,dead_grave, dead_acute, asciicircum ] }; key { [ q, Q, oe, OE ] }; key { [ w, W, Greek_SIGMA, Aacute ] }; key { [ e, E, EuroSign, Ediaeresis ] }; key { [ r, R, registered, Egrave ] }; key { [ t, T, dagger, Icircumflex ] }; key { [ z, Z, Greek_OMEGA, Iacute ] }; key { [ u, U, degree, Ugrave ] }; key { [ i, I, exclamdown, idotless ] }; key { [ o, O, oslash, Ooblique ] }; key { [ p, P, Greek_pi, Greek_PI ] }; key { [ udiaeresis, egrave, section, ydiaeresis ] }; key { [ dead_diaeresis, exclam, grave, apostrophe ] }; key { [ a, A, aring, Aring ] }; key { [ s, S, ssharp, NoSymbol ] }; // ligature fl key { [ d, D, Greek_sigma, NoSymbol ] }; // partialderivative is not available here att key { [ f, F, function, doubledagger ] }; key { [ g, G, at, comma ] }; key { [ h, H, ordfeminine, periodcentered ] }; key { [ j, J, masculine, eth ] }; key { [ k, K, Greek_DELTA, macron ] }; key { [ l, L, notsign, caret ] }; key { [ odiaeresis, eacute, cent, breve ] }; key { [ adiaeresis, agrave, ae, AE ] }; key { [ y, Y, yen, Ydiaeresis ] }; key { [ x, X, similarequal, trademark ] }; key { [ c, C, copyright, NoSymbol ] }; key { [ v, V, radical, diamond ] }; key { [ b, B, integral, NoSymbol ] }; key { [ n, N, dead_tilde, enopencircbullet ] }; // to be fixed att key { [ m, M, mu, dead_abovering ] }; // not sure att key { [ comma, semicolon, guillemotleft, guillemotright ] }; key { [ period, colon, ellipsis, division ] }; key { [ minus, underscore, hyphen, emdash ] }; key { [ section, degree, NoSymbol, NoSymbol ] }; // ligature fi // per mille key { [ space, nobreakspace, nobreakspace ] }; key { [ less, greater, lessthanequal, greaterthanequal ] }; key { [ dollar, sterling, paragraph, enfilledcircbullet ] }; include "kpdl(comma)" include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "fr_mac" { include "ch(de_mac)" name[Group1]= "French (Switzerland, Macintosh)"; override key { [ egrave, udiaeresis, bracketleft ] }; override key { [ eacute, odiaeresis ] }; override key { [ agrave, adiaeresis, braceleft ] }; }; // EXTRAS: partial alphanumeric_keys xkb_symbols "sun_type6_de" { include "sun_vndr/ch(sun_type6_de)" }; partial alphanumeric_keys xkb_symbols "sun_type6_fr" { include "sun_vndr/ch(sun_type6_fr)" }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.798646 libxkbcommon-0.10.0/test/data/symbols/compose0000644000175000017500000000437700000000000020622 0ustar00ranran00000000000000partial modifier_keys xkb_symbols "ralt" { key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "lwin" { key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "lwin-altgr" { key { type[Group1]="FOUR_LEVEL", [ Super_L, Super_L, Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "rwin" { key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "rwin-altgr" { key { type[Group1]="FOUR_LEVEL", [ Super_R, Super_R, Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "menu" { key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "menu-altgr" { key { type[Group1]="FOUR_LEVEL", [ Menu, Menu, Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "rctrl" { key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "rctrl-altgr" { key { type[Group1]="FOUR_LEVEL", [ Control_R, Control_R, Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "lctrl" { key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "lctrl-altgr" { key { type[Group1]="FOUR_LEVEL", [ Control_L, Control_L, Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "caps" { key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "caps-altgr" { key { type[Group1]="FOUR_LEVEL", [ Caps_Lock, Caps_Lock, Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "102" { key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "102-altgr" { key { type[Group1]="FOUR_LEVEL", [ less, greater, Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "paus" { key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "prsc" { key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; }; partial modifier_keys xkb_symbols "sclk" { key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8053124 libxkbcommon-0.10.0/test/data/symbols/ctrl0000644000175000017500000000643200000000000020113 0ustar00ranran00000000000000// Eliminate CapsLock, making it another Ctrl. partial modifier_keys xkb_symbols "nocaps" { replace key { [ Control_L, Control_L ] }; modifier_map Control { , }; }; // Make the left Ctrl key a left Meta. xkb_symbols "lctrl_meta" { replace key { [ Meta_L ] }; modifier_map Mod4 { }; }; // Swap the functions of the CapsLock key and the left Ctrl key. partial modifier_keys xkb_symbols "swapcaps" { replace key { [ Control_L ] }; replace key { [ Caps_Lock ] }; modifier_map Control { }; modifier_map Lock { }; }; // Move Ctrl to the leftmost key on the middle row and CapsLock to the // leftmost key on the bottom row. Only works if the geometry or keycodes // file has defined appropriate aliases for the keys in question. partial modifier_keys xkb_symbols "ac_ctrl" { replace key { [ Control_L ] }; replace key { [ Caps_Lock ] }; modifier_map Control { }; modifier_map Lock { }; }; // Move Ctrl to the leftmost key on the bottom row and CapsLock to the // leftmost key on the middle row. Only works if the geometry or keycodes // file has defined appropriate aliases for the keys in question. partial modifier_keys xkb_symbols "aa_ctrl" { replace key { [ Control_L ] }; replace key { [ Caps_Lock ] }; modifier_map Control { }; modifier_map Lock { }; }; // Right Ctrl functions as another right Alt. partial modifier_keys xkb_symbols "rctrl_ralt" { key { symbols[Group1]= [ Alt_R ] }; modifier_map Mod1{ }; }; // Menu key functions as another right Ctrl. partial modifier_keys xkb_symbols "menu_rctrl" { replace key { [ Control_R, Control_R ] }; modifier_map Control { Control_L, }; }; // Right Alt key functions as another right Ctrl. partial modifier_keys xkb_symbols "ralt_rctrl" { replace key { type[Group1] = "TWO_LEVEL", symbols[Group1] = [ Control_R, Control_R ] }; modifier_map Control { }; }; // Swap the functions of the left Alt key and the left Ctrl key. partial modifier_keys xkb_symbols "swap_lalt_lctl" { replace key { [ Control_L, Control_L ] }; replace key { [ Alt_L, Meta_L ] }; modifier_map Mod1 { }; modifier_map Control { }; }; // Swap the functions of the left Win key and the left Ctrl key. partial modifier_keys xkb_symbols "swap_lwin_lctl" { replace key { [ Control_L ] }; replace key { [ Super_L ] }; modifier_map Mod4 { }; modifier_map Control { }; }; // Swap the functions of the right Win key and the right Ctrl key. partial modifier_keys xkb_symbols "swap_rwin_rctl" { replace key { [ Control_R ] }; replace key { [ Super_R ] }; modifier_map Mod4 { }; modifier_map Control { }; }; // Map Ctrl to the left Alt key, Alt to the left Win key, // and Super to the left Ctrl key. partial modifier_keys xkb_symbols "swap_lalt_lctl_lwin" { replace key { [ Control_L, Control_L ] }; replace key { [ Alt_L, Meta_L ] }; replace key { [ Super_L ] }; modifier_map Mod1 { }; modifier_map Mod4 { }; modifier_map Control { }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8053124 libxkbcommon-0.10.0/test/data/symbols/cz0000644000175000017500000003025700000000000017565 0ustar00ranran00000000000000default partial alphanumeric_keys xkb_symbols "basic" { // This layout conforms to a new Czech compromise standard // designed to satisfy most Unix, Windows and Mac users. // 2001 by Kamil Toman include "latin" name[Group1]= "Czech"; key { [ semicolon, dead_abovering, grave, asciitilde ] }; key { [ plus, 1, exclam, dead_tilde ] }; key { [ ecaron, 2, at, dead_caron ] }; key { [ scaron, 3, numbersign, dead_circumflex ] }; key { [ ccaron, 4, dollar, dead_breve ] }; key { [ rcaron, 5, percent, dead_abovering]}; key { [ zcaron, 6, asciicircum, dead_ogonek ] }; key { [ yacute, 7, ampersand, dead_grave ] }; key { [ aacute, 8, asterisk, dead_abovedot] }; key { [ iacute, 9, braceleft, dead_acute ] }; key { [ eacute, 0, braceright, dead_doubleacute ] }; key { [ equal, percent, NoSymbol, dead_diaeresis]}; key { [dead_acute, dead_caron, dead_macron, dead_cedilla ] }; key { [ q, Q, backslash, NoSymbol ] }; key { [ w, W, bar, Nosymbol ] }; key { [ e, E, EuroSign, NoSymbol ] }; key { [ r, R, NoSymbol, NoSymbol ] }; key { [ t, T, NoSymbol, NoSymbol ] }; key { [ z, Z, NoSymbol, NoSymbol ] }; key { [ u, U, NoSymbol, NoSymbol ] }; key { [ i, I, NoSymbol, NoSymbol ] }; key { [ o, O, NoSymbol, NoSymbol ] }; key { [ p, P, NoSymbol, NoSymbol ] }; key { [ uacute, slash, bracketleft, division ] }; key { [parenright, parenleft, bracketright, multiply ] }; key { [ a, A, asciitilde, NoSymbol ] }; key { [ s, S, dstroke, NoSymbol ] }; key { [ d, D, Dstroke, NoSymbol ] }; key { [ f, F, bracketleft, NoSymbol ] }; key { [ g, G, bracketright, NoSymbol ] }; key { [ h, H, grave, NoSymbol ] }; key { [ j, J, apostrophe, NoSymbol ] }; key { [ k, K, lstroke, NoSymbol ] }; key { [ l, L, Lstroke, NoSymbol ] }; key { [ uring, quotedbl, dollar, NoSymbol ] }; key { [ section, exclam, apostrophe, ssharp ] }; key { [ EuroSign, dead_diaeresis, NoSymbol, NoSymbol ] }; key { [dead_diaeresis, apostrophe, backslash, bar ] }; key { [ backslash, bar, slash, NoSymbol ] }; key { [ y, Y, degree, NoSymbol ] }; key { [ x, X, numbersign, Nosymbol ] }; key { [ c, C, ampersand, NoSymbol ] }; key { [ v, V, at, NoSymbol ] }; key { [ b, B, braceleft, NoSymbol ] }; key { [ n, N, braceright, NoSymbol ] }; key { [ m, M, asciicircum, NoSymbol ] }; key { [ comma, question, less, NoSymbol ] }; key { [ period, colon, greater, NoSymbol ] }; key { [ minus, underscore, asterisk, NoSymbol ] }; key { [ space, space, space, space ] }; include "level3(ralt_switch)" }; xkb_symbols "bksl" { // Use instead of (useful for keyboards without key). include "cz(basic)" name[Group1]= "Czech (with <\|> key)"; key { [ backslash, bar, slash, NoSymbol ] }; }; partial alphanumeric_keys xkb_symbols "qwerty" { // This layout represents the actual Czech keyboards; // it complies with the symbols printed on the keys. // 2011 by Lukáš Mojžíš include "cz(basic)" name[Group1]= "Czech (QWERTY)"; key { [ z, Z, degree, NoSymbol ] }; key { [ uring, quotedbl, semicolon, colon ] }; key { [ section, exclam, apostrophe, ssharp ] }; key { [ y, Y, NoSymbol, NoSymbol ] }; key { [ uacute, slash, bracketleft, braceleft ] }; key { [parenright, parenleft, bracketright, braceright ] }; key { [ iacute, 9, parenleft, dead_acute ] }; key { [ eacute, 0, parenright, dead_doubleacute ] }; }; xkb_symbols "qwerty_bksl" { // Use instead of (useful for keyboards without key). include "cz(qwerty)" name[Group1]= "Czech (QWERTY, extended backslash)"; key { [ backslash, bar, slash, NoSymbol ] }; }; partial alphanumeric_keys alternate_group xkb_symbols "ucw" { // This layout is usually used as the second group, // it contains accented characters only, no 'latin' set. // 2008 by Milan Vancura name[Group1]= "Czech (UCW, only accented letters)"; key { [zcaron, Zcaron ] }; key { [ssharp ] }; key { [ccaron, Ccaron ] }; key { [ccedilla, Ccedilla ] }; key { [ntilde, Ntilde ] }; key { [ncaron, Ncaron ] }; key { [lacute, Lacute ] }; key { [aacute, Aacute ] }; key { [scaron, Scaron ] }; key { [dcaron, Dcaron ] }; key { [ediaeresis, Ediaeresis ] }; key { [racute, Racute ] }; key { [uacute, Uacute ] }; key { [udiaeresis, Udiaeresis ] }; key { [ocircumflex, Ocircumflex ] }; key { [lcaron, Lcaron ] }; key { [adiaeresis, Adiaeresis ] }; key { [ecaron, Ecaron ] }; key { [eacute, Eacute ] }; key { [rcaron, Rcaron ] }; key { [tcaron, Tcaron ] }; key { [yacute, Yacute ] }; key { [uring, Uring ] }; key { [iacute, Iacute ] }; key { [oacute, Oacute ] }; key { [odiaeresis, Odiaeresis ] }; }; partial alphanumeric_keys xkb_symbols "dvorak-ucw" { // US Dvorak layout extended with UCW, // AltGr produces accented characters. include "us(dvorak)" name[Group1]= "Czech (US, Dvorak, UCW support)"; key { [ j, J, eacute, Eacute ] }; key { [ k, K, uacute, Uacute ] }; key { [ z, Z, zcaron, Zcaron ] }; key { [ a, A, aacute, Aacute ] }; key { [ o, O, oacute, Oacute ] }; key { [ e, E, ecaron, Ecaron ] }; key { [ u, U, uring, Uring ] }; key { [ i, I, iacute, Iacute ] }; key { [ d, D, dcaron, Dcaron ] }; key { [ t, T, tcaron, Tcaron ] }; key { [ n, N, ncaron, Ncaron ] }; key { [ s, S, scaron, Scaron ] }; key { [ y, Y, yacute, Yacute ] }; key { [ c, C, ccaron, Ccaron ] }; key { [ r, R, rcaron, Rcaron ] }; include "level3(ralt_switch)" }; // phonetic layout for Russian letters on an CZ (QWERTY) keyboard // originaly created by Pavel Sorejs partial alphanumeric_keys xkb_symbols "rus" { include "cz(qwerty)" name[Group1]= "Russian (Czech, phonetic)"; key { [ plus, ampersand, 1 , 1 ] }; key { [ Cyrillic_hardsign, 2, 2 , 2 ] }; key { [ Cyrillic_sha, Cyrillic_SHA, 3 , 3 ] }; key { [ Cyrillic_che, Cyrillic_CHE, 4 , 4 ] }; key { [ Cyrillic_shcha, Cyrillic_SHCHA, 5 , 5 ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE, 6 , 6 ] }; key { [ quotedbl, 4, 7 , 7 ] }; key { [ section, 5, 8 , 8 ] }; key { [ dollar, 6, 9 , 9 ] }; key { [ equal, 7, 0 , 0 ] }; key { [ percent, 8 ] }; key { [ apostrophe, 9 ] }; key { [ comma, question ] }; key { [ period, exclam ] }; key { [ minus, slash ] }; key { [ semicolon, colon ] }; key { [ bar, brokenbar ] }; key { [ Cyrillic_io, Cyrillic_IO ] }; key { [ numerosign, 1, q, Q ] }; key { [ Cyrillic_yu, Cyrillic_YU, w, W ] }; key { [ Cyrillic_ie, Cyrillic_IE, e, E ] }; key { [ Cyrillic_er, Cyrillic_ER, r, R ] }; key { [ Cyrillic_te, Cyrillic_TE, t, T ] }; key { [ Cyrillic_yeru, Cyrillic_YERU, y, Y ] }; key { [ Cyrillic_u, Cyrillic_U, u, U ] }; key { [ Cyrillic_i, Cyrillic_I, i, I ] }; key { [ Cyrillic_o, Cyrillic_O, o, O ] }; key { [ Cyrillic_pe, Cyrillic_PE, p, P ] }; key { [ Cyrillic_e, Cyrillic_E, bracketleft, division ] }; key { [ parenright, parenleft, bracketright, multiply ] }; key { [ Cyrillic_a, Cyrillic_A, a, A ] }; key { [ Cyrillic_es, Cyrillic_ES, s, S ] }; key { [ Cyrillic_de, Cyrillic_DE, d, D ] }; key { [ Cyrillic_ef, Cyrillic_EF, f, F ] }; key { [ Cyrillic_ghe, Cyrillic_GHE, g, G ] }; key { [ Cyrillic_ha, Cyrillic_HA, h, H ] }; key { [ Cyrillic_shorti, Cyrillic_SHORTI, j, J ] }; key { [ Cyrillic_ka, Cyrillic_KA, k, K ] }; key { [ Cyrillic_el, Cyrillic_EL, l, L ] }; key { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, less, greater ] }; key { [ Cyrillic_ze, Cyrillic_ZE, z, Z ] }; key { [ Cyrillic_ya, Cyrillic_YA, x, X ] }; key { [ Cyrillic_tse, Cyrillic_TSE, c, C ] }; key { [ Cyrillic_ve, Cyrillic_VE, v, V ] }; key { [ Cyrillic_be, Cyrillic_BE, b, B ] }; key { [ Cyrillic_en, Cyrillic_EN, n, N ] }; key { [ Cyrillic_em, Cyrillic_EM, m, M ] }; key { [ backslash, brokenbar ] }; include "level3(ralt_switch)" }; // EXTRAS: partial alphanumeric_keys xkb_symbols "sun_type6" { include "sun_vndr/cz(sun_type6)" }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8186457 libxkbcommon-0.10.0/test/data/symbols/de0000644000175000017500000025376000000000000017547 0ustar00ranran00000000000000// based on a keyboard map from an 'xkb/symbols/de' file default xkb_symbols "basic" { include "latin(type4)" name[Group1]="German"; key { [ 2, quotedbl, twosuperior, oneeighth ] }; key { [ 3, section, threesuperior, sterling ] }; key { [ 4, dollar, onequarter, currency ] }; key {type[Group1]="FOUR_LEVEL_PLUS_LOCK", symbols[Group1]= [ssharp, question, backslash, questiondown, 0x1001E9E ]}; key { [dead_acute, dead_grave, dead_cedilla, dead_ogonek ] }; key { [ e, E, EuroSign, EuroSign ] }; key { [ z, Z, leftarrow, yen ] }; key { [udiaeresis, Udiaeresis, dead_diaeresis, dead_abovering ] }; key { [ plus, asterisk, asciitilde, macron ] }; key { [ s, S, U017F, U1E9E ] }; key { [ j, J, dead_belowdot, dead_abovedot ] }; key { [odiaeresis, Odiaeresis, dead_doubleacute, dead_belowdot ] }; key { [adiaeresis, Adiaeresis, dead_circumflex, dead_caron ] }; key { [dead_circumflex, degree, U2032, U2033 ] }; key { [numbersign, apostrophe, rightsinglequotemark, dead_breve ] }; key { [ y, Y, guillemotright, U203A ] }; key { [ x, X, guillemotleft, U2039 ] }; key { [ v, V, doublelowquotemark, singlelowquotemark ] }; key { [ b, B, leftdoublequotemark, leftsinglequotemark ] }; key { [ n, N, rightdoublequotemark, rightsinglequotemark ] }; key { [ comma, semicolon, periodcentered, multiply ] }; key { [ period, colon, U2026, division ] }; key { [ minus, underscore, endash, emdash ] }; key { [ less, greater, bar, dead_belowmacron ] }; include "kpdl(comma)" include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "deadtilde" { // previous standard German layout with tilde as dead key include "de(basic)" name[Group1]="German (dead tilde)"; key { [ plus, asterisk, dead_tilde, dead_macron ] }; }; partial alphanumeric_keys xkb_symbols "nodeadkeys" { // modify the basic German layout to not have any dead keys include "de(basic)" name[Group1]="German (no dead keys)"; key { [asciicircum, degree, notsign, notsign ] }; key { [ acute, grave, cedilla, cedilla ] }; key { [ udiaeresis, Udiaeresis, diaeresis, diaeresis ] }; key { [ plus, asterisk, asciitilde, macron ] }; key { [ odiaeresis, Odiaeresis, doubleacute, doubleacute ] }; key { [ adiaeresis, Adiaeresis, asciicircum, asciicircum ] }; key { [ numbersign, apostrophe, rightsinglequotemark, grave ] }; }; partial alphanumeric_keys xkb_symbols "deadgraveacute" { // modify the basic German layout to have only acute and grave // as dead keys (tilde and circumflex are needed as spacing characters // in many programming languages) include "de(basic)" name[Group1]="German (dead grave acute)"; key { [asciicircum, degree, notsign, notsign ] }; key { [ plus, asterisk, asciitilde, dead_macron ] }; key { [ numbersign, apostrophe, rightsinglequotemark, grave ] }; }; partial alphanumeric_keys xkb_symbols "deadacute" { // modify the basic German layout to have only acute as // dead keys (ASCII grave, tilde and circumflex are needed as // spacing characters in many programming languages and text formatters) include "de(deadgraveacute)" name[Group1]="German (dead acute)"; key { [dead_acute, grave, dead_cedilla, dead_ogonek ] }; key { [numbersign, apostrophe, rightsinglequotemark, dead_grave ] }; }; partial alphanumeric_keys xkb_symbols "T3" { name[Group1]="German (T3)"; key.type[Group1] = "EIGHT_LEVEL"; key { [ dead_circumflex, degree, multiply, NoSymbol, U204A, hyphen, bar, NoSymbol ] }; key { [ 1, exclam, rightsinglequotemark, NoSymbol, onesuperior, exclamdown, U02B9, NoSymbol ] }; key { [ 2, quotedbl, twosuperior, NoSymbol, twosuperior, currency, U02BA, NoSymbol ] }; key { [ 3, section, threesuperior, NoSymbol, threesuperior, sterling, U02BF, NoSymbol ] }; key { [ 4, dollar, emdash, NoSymbol, onequarter, 0x20AC, U02BE, NoSymbol ] }; key { [ 5, percent, exclamdown, NoSymbol, onehalf, uparrow, U02C1, NoSymbol ] }; key { [ 6, ampersand, questiondown, NoSymbol, threequarters, downarrow, U02C0, NoSymbol ] }; key { [ 7, slash, braceleft, NoSymbol, oneeighth, leftarrow, braceleft, NoSymbol ] }; key { [ 8, parenleft, bracketleft, NoSymbol, threeeighths, rightarrow, braceright, NoSymbol ] }; key { [ 9, parenright, bracketright, NoSymbol, fiveeighths, plusminus, bracketleft, NoSymbol ] }; key { [ 0, equal, braceright, NoSymbol, seveneighths, trademark, bracketright, NoSymbol ] }; key { [ ssharp, question, backslash, NoSymbol, backslash, questiondown, U02BB, NoSymbol ] }; key { [ dead_acute, dead_grave, dead_abovedot, NoSymbol, dead_cedilla, dead_ogonek, notsign, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC"; key { [ q, Q, at, NoSymbol, U0242, U0241, U030D, NoSymbol ] }; key { [ w, W, dead_caron, NoSymbol, U02B7, U2126, dead_abovedot, NoSymbol ] }; key { [ e, E, EuroSign, NoSymbol, oe, OE, dead_breve, NoSymbol ] }; key { [ r, R, dead_diaeresis, NoSymbol, paragraph, registered, dead_circumflex, NoSymbol ] }; key { [ t, T, dead_macron, NoSymbol, UA78C, UA78B, dead_diaeresis, NoSymbol ] }; key { [ z, Z, dead_doubleacute, NoSymbol, U027C, yen, dead_invertedbreve, NoSymbol ] }; key { [ u, U, dead_breve, NoSymbol, U0223, U0222, dead_caron, NoSymbol ] }; key { [ i, I, dead_tilde, NoSymbol, idotless, U214D, dead_abovecomma, NoSymbol ] }; key { [ o, O, dead_abovering, NoSymbol, oslash, Oslash, dead_horn, NoSymbol ] }; key { [ p, P, dead_hook, NoSymbol, thorn, THORN, dead_hook, NoSymbol ] }; key { [ udiaeresis, Udiaeresis, dead_horn, NoSymbol, U017F, dead_abovering, dead_grave, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL"; key { [ plus, asterisk, asciitilde, NoSymbol, dead_tilde, dead_macron, at, NoSymbol ] }; key.type[Group1] = "ONE_LEVEL"; key { [ Caps_Lock ] }; key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC"; key { [ a, A, lessthanequal, NoSymbol, ae, AE, U0329, NoSymbol ] }; key { [ s, S, greaterthanequal, NoSymbol, ssharp, section, dead_belowdot, NoSymbol ] }; key { [ d, D, U2300, NoSymbol, eth, ETH, dead_belowbreve, NoSymbol ] }; key { [ f, F, minutes, NoSymbol, U0294, ordfeminine, dead_belowcircumflex, NoSymbol ] }; key { [ g, G, seconds, NoSymbol, eng, ENG, dead_belowmacron, NoSymbol ] }; key { [ h, H, U1E9E, NoSymbol, U0272, U019D, U0332, NoSymbol ] }; key { [ j, J, dead_cedilla, NoSymbol, U0133, U0132, dead_belowring, NoSymbol ] }; key { [ k, K, dead_belowcomma, NoSymbol, kra, dead_belowcomma, dead_stroke, NoSymbol ] }; key { [ l, L, dead_ogonek, NoSymbol, lstroke, Lstroke, U0338, NoSymbol ] }; key { [ odiaeresis, Odiaeresis, dead_belowdot, NoSymbol, dead_acute, dead_doubleacute, degree, NoSymbol ] }; key { [ adiaeresis, Adiaeresis, dead_stroke, NoSymbol, U019B, U1E9E, minutes, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL"; key { [ numbersign, apostrophe, registered, NoSymbol, schwa, SCHWA, seconds, NoSymbol ] }; key { [ less, greater, bar, NoSymbol, U0149, brokenbar, U266A, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC"; key { [ y, Y, U203A, NoSymbol, U0292, U01B7, guillemotleft, NoSymbol ] }; key { [ x, X, guillemotright, NoSymbol, doublelowquotemark, singlelowquotemark, guillemotright, NoSymbol ] }; key { [ c, C, copyright, NoSymbol, cent, copyright, Greek_horizbar, NoSymbol ] }; key { [ v, V, guillemotleft, NoSymbol, leftdoublequotemark, leftsinglequotemark, U2039, NoSymbol ] }; key { [ b, B, U2039, NoSymbol, rightdoublequotemark, rightsinglequotemark, U203A, NoSymbol ] }; key { [ n, N, endash, NoSymbol, U019E, U0220, endash, NoSymbol ] }; key { [ m, M, Greek_mu, NoSymbol, mu, masculine, emdash, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL"; key { [ comma, semicolon, U02BB, NoSymbol, ellipsis, multiply, dollar, NoSymbol ] }; key { [ period, colon, U200C, NoSymbol, periodcentered, division, numbersign, NoSymbol ] }; key { [ minus, underscore, hyphen, NoSymbol, U0140, U013F, U2011, NoSymbol ] }; key { [ space, space, nobreakspace, NoSymbol, U202F, U200C, nobreakspace, NoSymbol ] }; include "kpdl(comma)" include "level5(modifier_mapping)" include "level3(modifier_mapping)" key.type[Group1] = "THREE_LEVEL"; key { [ Shift_L, Shift_L, ISO_Level5_Latch ] }; key { [ Shift_R, Shift_R, ISO_Level5_Latch ] }; key { [ ISO_Level3_Shift, ISO_Level5_Latch, ISO_Level5_Latch ] }; }; partial alphanumeric_keys xkb_symbols "ro" { // add romanian-specific letters to the basic German layout. // Romanian symbols are accessible with combination of and // 'a', 's', 't', 'i', 'ä (ä)' (+ for capital letters). // To view romanian-specific symbols, add "export LC_CTYPE=ro_RO" // or "export LC_CTYPE=de_DE.utf8" to your .profile. include "de(basic)" name[Group1]="Romanian (Germany)"; key { [ t, T, tcedilla, Tcedilla ] }; key { [ i, I, icircumflex, Icircumflex ] }; key { [ a, A, acircumflex, Acircumflex ] }; key { [ s, S, scedilla, Scedilla ] }; key { [ adiaeresis, Adiaeresis, abreve, Abreve ] }; }; partial alphanumeric_keys xkb_symbols "ro_nodeadkeys" { // add romanian-specific letters to the German nodeadkeys layout. // Read the comment for de_ro ! include "de(nodeadkeys)" name[Group1]="Romanian (Germany, no dead keys)"; key { [ t, T, tcedilla, Tcedilla ] }; key { [ i, I, icircumflex, Icircumflex ] }; key { [ a, A, acircumflex, Acircumflex ] }; key { [ s, S, scedilla, Scedilla ] }; key { [ adiaeresis, Adiaeresis, abreve, Abreve ] }; }; // German Dvorak keymap by Thorsten Staerk (www.staerk.de/thorsten) // Have acute and grave as dead keys, tilde and circumflex alive as they are needed // in many programming languages. // to use this keymap, use a 105-key-keyboard and the command setxkbmap -model pc105 -layout dvorak -variant de // source: http://www-lehre.informatik.uni-osnabrueck.de/~rfreund/dvorak.php partial alphanumeric_keys xkb_symbols "dvorak" { include "us(dvorak)" name[Group1]="German (Dvorak)"; key { [ asciicircum, degree ] }; key { [ 1, exclam, onesuperior ] }; key { [ 2, quotedbl, twosuperior ] }; key { [ 3, section, threesuperior ] }; key { [ 4, dollar, bar ] }; key { [ 5, percent, bar ] }; key { [ 6, ampersand, brokenbar ] }; key { [ 7, slash, braceleft ] }; key { [ 8, parenleft, bracketleft ] }; key { [ 9, parenright, bracketright ] }; key { [ 0, equal, braceright ] }; key { [ plus, asterisk, asciitilde ] }; key { [ less, greater, dead_grave ] }; key { [ udiaeresis, Udiaeresis, at ] }; key { [ comma, semicolon, dead_diaeresis ] }; key { [ period, colon ] }; key { [ c, C, copyright, Cacute ] }; key { [ t, T, trademark ] }; key { [ z, Z, zabovedot, Zabovedot ] }; key { [ question, ssharp ] }; key { [ slash, backslash, dead_acute ] }; key { [ a, A, at, aogonek ] }; key { [ o, O, oacute, Oacute ] }; key { [ e, E, EuroSign, eogonek ] }; key { [ i, I ] }; key { [ u, U ] }; key { [ h, H ] }; key { [ d, D ] }; key { [ r, R, registered ] }; key { [ n, N, nacute, Nacute ] }; key { [ s, S, sacute, Sacute] }; key { [ l, L, lstroke, Lstroke ] }; key { [ odiaeresis, Odiaeresis ] }; key { [ q, Q, at ] }; key { [ m, M, mu ] }; key { [ numbersign, apostrophe ] }; key { [ minus, underscore, hyphen, diaeresis] }; key { [ adiaeresis, Adiaeresis, bar ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "Sundeadkeys" { // For naming consistency include "de(basic)" }; partial alphanumeric_keys xkb_symbols "sundeadkeys" { // For naming consistency include "de(Sundeadkeys)" name[Group1]="German (with Sun dead keys)"; }; // German Neo-Layout Version 2 // adopted 2004 by Hanno Behrens // inspired by Dvorak/de-ergo http://www.goebel-consult.de/de-ergo/ // // Authors: // Stephan Hilb // // Benjamin Kellermann // Erik Streb // and many other contributors // // http://www.neo-layout.org // // $Revision$, $Date$ partial alphanumeric_keys modifier_keys keypad_keys xkb_symbols "neo_base" { // Levels in Neo jargon // -------------------------------------------------------------- // Ebene 1: normal // Ebene 2: Shift // Ebene 3: Mod3 // Ebene 4: Mod4 (for marking something use Shift + Mod4) // Ebene 5: Shift + Mod3 // Ebene 6: Mod3 + Mod4 // Compose (not a level): Mod3 + Tab // Feststelltaste (Capslock): Shift + Shift // Mod4-Lock: Mod4 + Mod4 // Mod4-Lock: Shift + Mod3 + Tab // Legend // =============== // Levels in Xkbmap jargon to be found here in the definitions. // These are the levels used, and Xorg's translations: // -------------------------------------------------------------- // Xorg: Level1 Level2 Level3 Level4 Level5 Level6 Level7 Level8 // Neo: Ebene1 Ebene2 Ebene3 Ebene5 Ebene4 Pseudo-Ebene Ebene6 ??? // Keys (Neo): None Shift Mod3 Mod3 + Shift Mod4 Mod4 + Shift Mod3 + Mod4 Mod3 + Mod4 + Shift // Alphanumeric-keys // =============== key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK"; // Tab as Multi_key (Compose) // -------------------------------------------------------------- key { [ Tab, ISO_Left_Tab, Multi_key, ISO_Level5_Lock, NoSymbol, NoSymbol, NoSymbol, ISO_Level5_Lock ] }; // Number row // -------------------------------------------------------------- key { [ dead_circumflex, dead_caron, U21BB, U02DE, dead_abovedot, Pointer_EnableKeys, dead_belowdot, NoSymbol ] }; key { [ 1, degree, onesuperior, onesubscript, ordfeminine, NoSymbol, notsign, NoSymbol ] }; key { [ 2, section, twosuperior, twosubscript, masculine, NoSymbol, logicalor, NoSymbol ] }; key { [ 3, U2113, threesuperior, threesubscript, numerosign, NoSymbol, logicaland, NoSymbol ] }; key { [ 4, guillemotright, U203A, femalesymbol, NoSymbol, NoSymbol, U22A5, NoSymbol ] }; key { [ 5, guillemotleft, U2039, malesymbol, periodcentered, NoSymbol, U2221, NoSymbol ] }; key { [ 6, dollar, cent, U26A5, sterling, NoSymbol, U2225, NoSymbol ] }; key { [ 7, EuroSign, yen, U03F0, currency, NoSymbol, rightarrow, NoSymbol ] }; key { [ 8, doublelowquotemark, singlelowquotemark, U27E8, Tab, ISO_Left_Tab, U221E, NoSymbol ] }; key { [ 9, leftdoublequotemark, leftsinglequotemark, U27E9, KP_Divide, KP_Divide, variation, NoSymbol ] }; key { [ 0, rightdoublequotemark, rightsinglequotemark, zerosubscript, KP_Multiply, KP_Multiply, emptyset, NoSymbol ] }; key { [ minus, emdash, NoSymbol, U2011, KP_Subtract, KP_Subtract, hyphen, NoSymbol ] }; key { [ dead_grave, dead_cedilla, dead_abovering, dead_dasia, dead_diaeresis, NoSymbol, dead_macron, NoSymbol ] }; // Top row // -------------------------------------------------------------- key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK"; key { [ x, X, ellipsis, Greek_xi, Prior, Prior, Greek_XI, NoSymbol ] }; key { [ v, V, underscore, NoSymbol, BackSpace, BackSpace, radical, NoSymbol ] }; key { [ l, L, bracketleft, Greek_lambda, Up, Up, Greek_LAMBDA, NoSymbol ] }; key { [ c, C, bracketright, Greek_chi, Delete, Delete, U2102, NoSymbol ] }; key { [ w, W, asciicircum, Greek_omega, Next, Next, Greek_OMEGA, NoSymbol ] }; key { [ k, K, exclam, Greek_kappa, exclamdown, NoSymbol, multiply, NoSymbol ] }; key { [ h, H, less, Greek_psi, KP_7, KP_7, Greek_PSI, NoSymbol ] }; key { [ g, G, greater, Greek_gamma, KP_8, KP_8, Greek_GAMMA, NoSymbol ] }; key { [ f, F, equal, Greek_phi, KP_9, KP_9, Greek_PHI, NoSymbol ] }; key { [ q, Q, ampersand, U03D5, KP_Add, KP_Add, U211A, NoSymbol ] }; key { [ ssharp, U1E9E, U017F, Greek_finalsmallsigma, U2212, NoSymbol, jot, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK"; key { [ dead_acute, dead_tilde, dead_stroke, dead_psili, dead_doubleacute, NoSymbol, dead_breve, NoSymbol ] }; // Middle row // -------------------------------------------------------------- key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK"; key { [ u, U, backslash, NoSymbol, Home, Home, includedin, NoSymbol ] }; key { [ i, I, slash, Greek_iota, Left, Left, integral, NoSymbol ] }; key { [ a, A, braceleft, Greek_alpha, Down, Down, U2200, NoSymbol ] }; key { [ e, E, braceright, Greek_epsilon, Right, Right, U2203, NoSymbol ] }; key { [ o, O, asterisk, Greek_omicron, End, End, elementof, NoSymbol ] }; key { [ s, S, question, Greek_sigma, questiondown, NoSymbol, Greek_SIGMA, NoSymbol ] }; key { [ n, N, parenleft, Greek_nu, KP_4, KP_4, U2115, NoSymbol ] }; key { [ r, R, parenright, Greek_rho, KP_5, KP_5, U211D, NoSymbol ] }; key { [ t, T, minus, Greek_tau, KP_6, KP_6, partialderivative, NoSymbol ] }; key { [ d, D, colon, Greek_delta, KP_Separator, comma, Greek_DELTA, NoSymbol ] }; key { [ y, Y, at, Greek_upsilon, period, KP_Decimal, nabla, NoSymbol ] }; // Bottom row // -------------------------------------------------------------- key { [ udiaeresis, Udiaeresis, numbersign, NoSymbol, Escape, Escape, union, NoSymbol ] }; key { [ odiaeresis, Odiaeresis, dollar, U03F5, Tab, Tab, intersection, NoSymbol ] }; key { [ adiaeresis, Adiaeresis, bar, Greek_eta, Insert, Insert, U2135, NoSymbol ] }; key { [ p, P, asciitilde, Greek_pi, Return, Return, Greek_PI, NoSymbol ] }; key { [ z, Z, grave, Greek_zeta, Undo, Redo, U2124, NoSymbol ] }; key { [ b, B, plus, Greek_beta, colon, NoSymbol, U21D0, NoSymbol ] }; key { [ m, M, percent, Greek_mu, KP_1, KP_1, ifonlyif, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK"; key { [ comma, endash, quotedbl, U03F1, KP_2, KP_2, U21D2, NoSymbol ] }; key { [ period, enfilledcircbullet, apostrophe, U03D1, KP_3, KP_3, U21A6, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK"; key { [ j, J, semicolon, Greek_theta, semicolon, NoSymbol, Greek_THETA, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK"; // Space key // -------------------------------------------------------------- key { [ space, space, space, nobreakspace, KP_0, KP_0, U202F, NoSymbol ] }; // Keypad-keys // =============== // The former Numlock key: key { [ Tab, ISO_Left_Tab, equal, approxeq, notequal, Pointer_EnableKeys, identical, NoSymbol ] }; // Topmost row // -------------------------------------------------------------- key { [ KP_Divide, KP_Divide, division, U2300, U2215, NoSymbol, U2223, NoSymbol ] }; key { [ KP_Multiply, KP_Multiply, U22C5, U2299, multiply, NoSymbol, U2297, NoSymbol ] }; key { [ KP_Subtract, KP_Subtract, U2212, U2296, U2216, NoSymbol, U2238, NoSymbol ] }; // Top row // -------------------------------------------------------------- key { [ KP_7, U2714, U2195, U226A, KP_Home, KP_Home, upstile, NoSymbol ] }; key { [ KP_8, U2718, uparrow, intersection, KP_Up, KP_Up, U22C2, NoSymbol ] }; key { [ KP_9, dagger, U20D7, U226B, KP_Prior, KP_Prior, U2309, NoSymbol ] }; key { [ KP_Add, KP_Add, plusminus, U2295, U2213, NoSymbol, U2214, NoSymbol ] }; // Middle row // -------------------------------------------------------------- key { [ KP_4, club, leftarrow, includedin, KP_Left, KP_Left, U2286, NoSymbol ] }; key { [ KP_5, EuroSign, colon, U22B6, KP_Begin, KP_Begin, U22B7, NoSymbol ] }; key { [ KP_6, U2023, rightarrow, includes, KP_Right, KP_Right, U2287, NoSymbol ] }; // Bottom row // -------------------------------------------------------------- key { [ KP_1, diamond, U2194, lessthanequal, KP_End, KP_End, downstile, NoSymbol ] }; key { [ KP_2, heart, downarrow, union, KP_Down, KP_Down, U22C3, NoSymbol ] }; key { [ KP_3, U2660, U21CC, greaterthanequal, KP_Next, KP_Next, U230B, NoSymbol ] }; key { [ KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, NoSymbol ] }; key { [ KP_Equal, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ] }; // Bottommost row // -------------------------------------------------------------- key { [ KP_0, U2423, percent, U2030, KP_Insert, KP_Insert, U25A1, NoSymbol ] }; key { [ KP_Separator, period, comma, minutes, KP_Delete, KP_Delete, seconds, NoSymbol ] }; }; partial alphanumeric_keys modifier_keys keypad_keys xkb_symbols "neo" { include "de(neo_base)" name[Group1]= "German (Neo 2)"; include "shift(both_capslock)" include "level3(caps_switch)" include "level3(bksl_switch)" include "level5(lsgt_switch_lock)" include "level5(ralt_switch_lock)" }; // Copied from macintosh_vndr/de // olh@suse.de very close to MacOS map partial alphanumeric_keys xkb_symbols "mac" { include "de" name[Group1]= "German (Macintosh)"; key { [ 1, exclam, exclamdown, at ] }; key { [ 5, percent, bracketleft ] }; key { [ 6, ampersand, bracketright ] }; key { [ 7, slash, bar, backslash ] }; key { [ 8, parenleft, braceleft, asciitilde ] }; key { [ 9, parenright, braceright ] }; key { [ q, Q, guillemotleft, guillemotright ] }; key { [ r, R, registered ] }; key { [ u, U, diaeresis, Aacute ] }; key { [ i, I, slash, Ucircumflex ] }; key { [ udiaeresis, Udiaeresis, periodcentered, degree ] }; key { [ plus, asterisk, asciitilde ] }; key { [ a, A, aring, Aring ] }; key { [ g, G, copyright ] }; key { [ h, H, ordfeminine ] }; key { [ l, L, at ] }; key { [ odiaeresis, Odiaeresis, dead_acute ] }; key { [ n, N, asciitilde ] }; }; partial alphanumeric_keys xkb_symbols "mac_nodeadkeys" { // modify the standard German mac layout to not have any dead keys include "de(mac)" name[Group1]= "German (Macintosh, no dead keys)"; key { [ asciicircum, degree, notsign ] }; key { [ 4, dollar, onequarter, currency ] }; key { [ acute, grave, cedilla ] }; key { [ udiaeresis, Udiaeresis, diaeresis ] }; key { [ plus, asterisk, asciitilde, macron ] }; key { [ odiaeresis, Odiaeresis, acute ] }; key { [ adiaeresis, Adiaeresis, asciicircum ] }; key { [ numbersign, apostrophe, rightsinglequotemark ] }; }; partial alphanumeric_keys xkb_symbols "dsb" { include "latin(basic)" name[Group1] = "Lower Sorbian"; key { [ z, Z, zcaron, Zcaron ] }; key { [ x, X, zacute, Zacute ] }; key { [ c, C, cacute, Cacute ] }; key { [ v, V, ccaron, Ccaron ] }; key { [ n, N, nacute, Nacute ] }; key { [ s, S, sacute, Sacute ] }; key { [ d, D, scaron, Scaron ] }; key { [ f, F ] }; key { [ q, Q ] }; key { [ w, W ] }; key { [ e, E, ecaron, Ecaron ] }; key { [ r, R, racute, Racute ] }; key { [ t, T, U20B5, EuroSign ] }; key { [ o, O, oacute, Oacute ] }; include "kpdl(comma)" include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "dsb_qwertz" { include "latin(basic)" name[Group1] = "Lower Sorbian (QWERTZ)"; key { [ y, Y ] }; key { [ x, X ] }; key { [ c, C, cacute, Cacute ] }; key { [ v, V, ccaron, Ccaron ] }; key { [ n, N, nacute, Nacute ] }; key { [ s, S, sacute, Sacute ] }; key { [ d, D, scaron, Scaron ] }; key { [ f, F ] }; key { [ q, Q ] }; key { [ w, W ] }; key { [ e, E, ecaron, Ecaron ] }; key { [ r, R, racute, Racute ] }; key { [ t, T, U20B5, EuroSign ] }; key { [ z, Z, zcaron, Zcaron ] }; key { [ u, U, zacute, Zacute ] }; key { [ o, O, oacute, Oacute ] }; include "kpdl(comma)" include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "qwerty" { // This layout should work exactly as a de with the exception // of 'Z' and 'Y' keys, which are in the qwerty style (ie. swapped). // 2008 by Matej Košík include "de(basic)" name[Group1] = "German (QWERTY)"; key { [ z, Z, leftarrow, yen ] }; key { [ y, Y, guillemotleft, less ] }; }; // layout for Russian letters on an german keyboard // based on US-RU layout by Ivan Popov 2005-07-17 // adopted for german layout by Alexey Fisher 2010-08-19 partial alphanumeric_keys xkb_symbols "ru" { include "de(basic)" name[Group1]= "Russian (Germany, phonetic)"; key { [ Cyrillic_a, Cyrillic_A ] }; key { [ Cyrillic_be, Cyrillic_BE ] }; key { [ Cyrillic_ve, Cyrillic_VE ] }; key { [ Cyrillic_ghe, Cyrillic_GHE ] }; key { [ Cyrillic_de, Cyrillic_DE ] }; key { [ Cyrillic_ie, Cyrillic_IE ] }; key { [ Cyrillic_io, Cyrillic_IO, asciitilde ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE ] }; key { [ Cyrillic_ze, Cyrillic_ZE ] }; key { [ Cyrillic_i, Cyrillic_I ] }; key { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; key { [ Cyrillic_ka, Cyrillic_KA ] }; key { [ Cyrillic_el, Cyrillic_EL ] }; key { [ Cyrillic_em, Cyrillic_EM ] }; key { [ Cyrillic_en, Cyrillic_EN ] }; key { [ Cyrillic_o, Cyrillic_O ] }; key { [ Cyrillic_pe, Cyrillic_PE ] }; key { [ Cyrillic_er, Cyrillic_ER ] }; key { [ Cyrillic_es, Cyrillic_ES ] }; key { [ Cyrillic_te, Cyrillic_TE ] }; key { [ Cyrillic_u, Cyrillic_U ] }; key { [ Cyrillic_ef, Cyrillic_EF ] }; key { [ Cyrillic_ha, Cyrillic_HA ] }; key { [ Cyrillic_tse, Cyrillic_TSE ] }; key { [ Cyrillic_che, Cyrillic_CHE ] }; key { [ Cyrillic_sha, Cyrillic_SHA ] }; key { [ Cyrillic_shcha, Cyrillic_SHCHA, plus, asterisk ] }; key { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] }; key { [ Cyrillic_yeru, Cyrillic_YERU ] }; key { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; key { [ Cyrillic_e, Cyrillic_E ] }; key { [ Cyrillic_yu, Cyrillic_YU, numbersign, apostrophe ] }; key { [ Cyrillic_ya, Cyrillic_YA ] }; include "level3(ralt_switch)" }; // layout for Russian (recommended) letters on a german keyboard // based on "Russisch für Deutsche, empfohlen" by B. Bendixen und H. Rothe http://russisch.urz.uni-leipzig.de/key2000.htm 2016-02-01 // adapted for Linux by Niko Krause 2016-06-09 partial alphanumeric_keys xkb_symbols "ru-recom" { include "de(basic)" name[Group1]= "Russian (Germany, recommended)"; key { [ Cyrillic_a, Cyrillic_A ] }; key { [ Cyrillic_be, Cyrillic_BE ] }; key { [ Cyrillic_ve, Cyrillic_VE ] }; key { [ Cyrillic_ghe, Cyrillic_GHE, Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] }; key { [ Cyrillic_de, Cyrillic_DE ] }; key { [ Cyrillic_ie, Cyrillic_IE ] }; key { [ Cyrillic_ya, Cyrillic_YA, asciicircum, degree ] }; key { [ Cyrillic_ha, Cyrillic_HA ] }; key { [ Cyrillic_tse, Cyrillic_TSE ] }; key { [ Cyrillic_i, Cyrillic_I, Ukrainian_i, Ukrainian_I ] }; key { [ Cyrillic_shorti, Cyrillic_SHORTI, Ukrainian_yi, Ukrainian_YI ] }; key { [ Cyrillic_ka, Cyrillic_KA ] }; key { [ Cyrillic_el, Cyrillic_EL ] }; key { [ Cyrillic_em, Cyrillic_EM ] }; key { [ Cyrillic_en, Cyrillic_EN ] }; key { [ Cyrillic_o, Cyrillic_O ] }; key { [ Cyrillic_pe, Cyrillic_PE ] }; key { [ Cyrillic_er, Cyrillic_ER ] }; key { [ Cyrillic_es, Cyrillic_ES, Cyrillic_ze, Cyrillic_ZE ] }; key { [ Cyrillic_te, Cyrillic_TE ] }; key { [ Cyrillic_u, Cyrillic_U ] }; key { [ Cyrillic_ef, Cyrillic_EF ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE ] }; key { [ Cyrillic_che, Cyrillic_CHE ] }; key { [ Cyrillic_io, Cyrillic_IO ] }; key { [ Cyrillic_yu, Cyrillic_YU ] }; key { [ Cyrillic_sha, Cyrillic_SHA, plus, asterisk ] }; key { [ Cyrillic_ze, Cyrillic_ZE ] }; key { [ Cyrillic_yeru, Cyrillic_YERU ] }; key { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; key { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie, Ukrainian_IE ] }; key { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, numbersign, apostrophe ] }; key { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; key { [ asciitilde, question, backslash, questiondown ] }; key { [ U0301, U0300, U0323, U0307 ] }; include "level3(ralt_switch)" }; // layout for Russian (transliteration) letters on a german keyboard // based on "Russisch für Deutsche, Transliteration" by B. Bendixen und H. Rothe http://russisch.urz.uni-leipzig.de/key2000.htm 2016-02-01 // adapted for Linux by Niko Krause 2016-06-09 partial alphanumeric_keys xkb_symbols "ru-translit" { include "de(basic)" name[Group1]= "Russian (Germany, transliteration)"; key { [ Cyrillic_a, Cyrillic_A ] }; key { [ Cyrillic_be, Cyrillic_BE ] }; key { [ Cyrillic_sha, Cyrillic_SHA ] }; key { [ Cyrillic_ghe, Cyrillic_GHE, Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] }; key { [ Cyrillic_de, Cyrillic_DE ] }; key { [ Cyrillic_ie, Cyrillic_IE ] }; key { [ Cyrillic_ya, Cyrillic_YA, asciicircum, degree ] }; key { [ Cyrillic_ha, Cyrillic_HA ] }; key { [ Cyrillic_ze, Cyrillic_ZE ] }; key { [ Cyrillic_i, Cyrillic_I, Ukrainian_i, Ukrainian_I ] }; key { [ Cyrillic_shorti, Cyrillic_SHORTI, Ukrainian_yi, Ukrainian_YI ] }; key { [ Cyrillic_ka, Cyrillic_KA ] }; key { [ Cyrillic_el, Cyrillic_EL ] }; key { [ Cyrillic_em, Cyrillic_EM ] }; key { [ Cyrillic_en, Cyrillic_EN ] }; key { [ Cyrillic_o, Cyrillic_O ] }; key { [ Cyrillic_pe, Cyrillic_PE ] }; key { [ Cyrillic_er, Cyrillic_ER ] }; key { [ Cyrillic_es, Cyrillic_ES, Cyrillic_che, Cyrillic_CHE ] }; key { [ Cyrillic_te, Cyrillic_TE ] }; key { [ Cyrillic_u, Cyrillic_U ] }; key { [ Cyrillic_ef, Cyrillic_EF ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE ] }; key { [ Cyrillic_tse, Cyrillic_TSE ] }; key { [ Cyrillic_io, Cyrillic_IO ] }; key { [ Cyrillic_yu, Cyrillic_YU ] }; key { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, plus, asterisk ] }; key { [ Cyrillic_che, Cyrillic_CHE ] }; key { [ Cyrillic_yeru, Cyrillic_YERU ] }; key { [ Cyrillic_ve, Cyrillic_VE ] }; key { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie, Ukrainian_IE ] }; key { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, numbersign, apostrophe ] }; key { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; key { [ asciitilde, question, backslash, questiondown ] }; key { [ U0301, U0300, U0323, U0307 ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "pl" { // Combined layout for entering both German and Polish symbols on a German physical // keyboard. Based on German (no dead keys) and Polish (basic). Polish diacritics // on AltGr+"acelnosxz". EuroSign moved to AE04 (AltGr+dollar key) to avoid conflict // with Polish eogonek. // // https://github.com/kontextify/xkeyboard-config include "latin(type4)" name[Group1]= "Polish (Germany, no dead keys)"; include "de(nodeadkeys)" key { [ 4, dollar, EuroSign, currency ] }; key { [ q, Q ] }; key { [ w, W ] }; key { [ e, E, eogonek, Eogonek ] }; key { [ o, O, oacute, Oacute ] }; key { [ a, A, aogonek, Aogonek ] }; key { [ s, S, sacute, Sacute ] }; key { [ f, F ] }; key { [ z, Z, zabovedot, Zabovedot ] }; key { [ x, X, zacute, Zacute ] }; key { [ c, C, cacute, Cacute ] }; key { [ n, N, nacute, Nacute ] }; include "kpdl(comma)" include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "htcdream" { include "inet(htcdream)" name[Group1]= "German"; //second row key { [ q, Q, Tab, Tab ] }; key { [ w, W, grave, grave ] }; key { [ e, E, EuroSign, EuroSign ] }; key { [ r, R, underscore, underscore ] }; key { [ t, T, sterling, sterling] }; key { [ z, Z, division, division ] }; key { [ u, U, udiaeresis, udiaeresis ] }; key { [ i, I, minus, minus ] }; key { [ o, O, odiaeresis, odiaeresis ] }; key { [ p, P, equal, equal ] }; //third row key { [ a, A, adiaeresis, adiaeresis ] }; key { [ s, S, ssharp, ssharp] }; key { [ d ,D, backslash, backslash ] }; key { [ f, F, braceleft, braceleft ] }; key { [ g, G, braceright, braceright ] }; key { [ h, H, multiply, multiply ] }; key { [ j, J, colon, colon ] }; key { [ k, K, plus, plus ] }; key { [ l, L, apostrophe, apostrophe ] }; //forth row key { [ y, Y, bar, bar ] }; key { [ x, X, bracketleft, bracketleft ] }; key { [ c, C, bracketright, bracketright ] }; key { [ v, V, less, less ] }; key { [ b, B, greater, greater ] }; key { [ n, N, semicolon, semicolon ] }; key { [ m, M, quotedbl, quotedbl ] }; key { [ comma, comma, question, question ] }; //fifth row key { [ at, at, asciitilde, asciitilde ] }; include "level3(alt_switch)" }; partial alphanumeric_keys xkb_symbols "tr" { // add turkish-specific letters to the basic German layout. // Turkish symbols are accessible with combination of and // 'i', 's', 'g', 'c'' (+ for capital letters). include "de(basic)" name[Group1]="Turkish (Germany)"; key { [ i, I, U0131, U0130 ] }; key { [ s, S, U015F, U015E ] }; key { [ g, G, U011F, U011E ] }; key { [ c, C, U0E7, U0C7 ] }; }; // EXTRAS: partial alphanumeric_keys xkb_symbols "us" { include "us" name[Group1]="German (US, with German letters)"; key { [ a, A, adiaeresis, Adiaeresis ] }; key { [ s, S, ssharp, ssharp ] }; key { [ semicolon, colon, odiaeresis, Odiaeresis ] }; key { [ apostrophe, quotedbl, adiaeresis, Adiaeresis ] }; key { [ e, E, EuroSign, EuroSign ] }; key { [ u, U, udiaeresis, Udiaeresis ] }; key { [ o, O, odiaeresis, Odiaeresis ] }; key { [ bracketleft, braceleft, udiaeresis, Udiaeresis ] }; key { [ 3, numbersign, section, section ] }; key { [ minus, underscore, ssharp, question ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "hu" { // modify the basic German layout to not have any dead keys and add Hungarian letters include "de(basic)" name[Group1]="German (with Hungarian letters and no dead keys)"; key { [ y, Y, guillemotleft, less ] }; key { [odiaeresis, Odiaeresis, eacute, Eacute ] }; key { [adiaeresis, Adiaeresis, aacute, Aacute] }; key { [ e, E, EuroSign, EuroSign ] }; key { [ z, Z, leftarrow, yen ] }; key { [ u, U, uacute, Uacute ] }; key { [ i, I, iacute, Iacute ] }; key { [ o, O, odoubleacute, Odoubleacute ] }; key { [udiaeresis, Udiaeresis, udoubleacute, Udoubleacute ] }; key { [ plus, asterisk, asciitilde, macron ] }; key { [ acute, grave, oacute, Oacute ] }; key { [numbersign, apostrophe, rightsinglequotemark, grave ] }; key { [asciicircum, degree, notsign, notsign ] }; }; partial alphanumeric_keys xkb_symbols "sun_type6" { include "sun_vndr/de(sun_type6)" }; partial alphanumeric_keys xkb_symbols "adnw_base" { include "de(neo_base)" key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK"; key { [ period, enfilledcircbullet, NoSymbol, U03D1, NoSymbol, NoSymbol, U21A6, NoSymbol ] }; key { [ comma, endash, NoSymbol, U03F1, NoSymbol, NoSymbol, U21D2, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK"; key { [ k, K, NoSymbol, Greek_kappa, NoSymbol, NoSymbol, multiply, NoSymbol ] }; key { [ u, U, NoSymbol, NoSymbol, NoSymbol, NoSymbol, includedin, NoSymbol ] }; key { [ udiaeresis, Udiaeresis, NoSymbol, NoSymbol, NoSymbol, NoSymbol, union, NoSymbol ] }; key { [ adiaeresis, Adiaeresis, NoSymbol, Greek_eta, NoSymbol, NoSymbol, U2135, NoSymbol ] }; key { [ v, V, NoSymbol, NoSymbol, NoSymbol, NoSymbol, radical, NoSymbol ] }; key { [ g, G, NoSymbol, Greek_gamma, NoSymbol, NoSymbol, Greek_GAMMA, NoSymbol ] }; key { [ c, C, NoSymbol, Greek_chi, NoSymbol, NoSymbol, U2102, NoSymbol ] }; key { [ l, L, NoSymbol, Greek_lambda, NoSymbol, NoSymbol, Greek_LAMBDA, NoSymbol ] }; key { [ j, J, NoSymbol, Greek_theta, NoSymbol, NoSymbol, Greek_THETA, NoSymbol ] }; key { [ f, F, NoSymbol, Greek_phi, NoSymbol, NoSymbol, Greek_PHI, NoSymbol ] }; key { [ h, H, NoSymbol, Greek_psi, NoSymbol, NoSymbol, Greek_PSI, NoSymbol ] }; key { [ i, I, NoSymbol, Greek_iota, NoSymbol, NoSymbol, integral, NoSymbol ] }; key { [ e, E, NoSymbol, Greek_epsilon, NoSymbol, NoSymbol, U2203, NoSymbol ] }; key { [ a, A, NoSymbol, Greek_alpha, NoSymbol, NoSymbol, U2200, NoSymbol ] }; key { [ o, O, NoSymbol, Greek_omicron, NoSymbol, NoSymbol, elementof, NoSymbol ] }; key { [ d, D, NoSymbol, Greek_delta, NoSymbol, NoSymbol, Greek_DELTA, NoSymbol ] }; key { [ t, T, NoSymbol, Greek_tau, NoSymbol, NoSymbol, partialderivative, NoSymbol ] }; key { [ r, R, NoSymbol, Greek_rho, NoSymbol, NoSymbol, U211D, NoSymbol ] }; key { [ n, N, NoSymbol, Greek_nu, NoSymbol, NoSymbol, U2115, NoSymbol ] }; key { [ s, S, NoSymbol, Greek_sigma, NoSymbol, NoSymbol, Greek_SIGMA, NoSymbol ] }; key { [ ssharp, U1E9E, NoSymbol, Greek_finalsmallsigma, NoSymbol, NoSymbol, jot, NoSymbol ] }; key { [ x, X, NoSymbol, Greek_xi, NoSymbol, NoSymbol, Greek_XI, NoSymbol ] }; key { [ y, Y, NoSymbol, Greek_upsilon, NoSymbol, NoSymbol, nabla, NoSymbol ] }; key { [ odiaeresis, Odiaeresis, NoSymbol, U03F5, NoSymbol, NoSymbol, intersection, NoSymbol ] }; key { [ q, Q, NoSymbol, U03D5, NoSymbol, NoSymbol, U211A, NoSymbol ] }; key { [ b, B, NoSymbol, Greek_beta, NoSymbol, NoSymbol, U21D0, NoSymbol ] }; key { [ p, P, NoSymbol, Greek_pi, NoSymbol, NoSymbol, Greek_PI, NoSymbol ] }; key { [ w, W, NoSymbol, Greek_omega, NoSymbol, NoSymbol, Greek_OMEGA, NoSymbol ] }; key { [ m, M, NoSymbol, Greek_mu, NoSymbol, NoSymbol, ifonlyif, NoSymbol ] }; key { [ z, Z, NoSymbol, Greek_zeta, NoSymbol, NoSymbol, U2124, NoSymbol ] }; }; partial alphanumeric_keys modifier_keys keypad_keys xkb_symbols "adnw" { include "de(adnw_base)" name[Group1]= "German (Aus der Neo-Welt)"; include "shift(both_capslock)" include "level3(caps_switch)" include "level3(bksl_switch)" include "level5(lsgt_switch_lock)" include "level5(ralt_switch_lock)" }; partial alphanumeric_keys xkb_symbols "koy_base" { include "de(neo_base)" key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK"; key { [ period, enfilledcircbullet, NoSymbol, U03D1, NoSymbol, NoSymbol, U21A6, NoSymbol ] }; key { [ comma, endash, NoSymbol, U03F1, NoSymbol, NoSymbol, U21D2, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK"; key { [ k, K, NoSymbol, Greek_kappa, NoSymbol, NoSymbol, multiply, NoSymbol ] }; key { [ o, O, NoSymbol, Greek_omicron, NoSymbol, NoSymbol, elementof, NoSymbol ] }; key { [ y, Y, NoSymbol, Greek_upsilon, NoSymbol, NoSymbol, nabla, NoSymbol ] }; key { [ v, V, NoSymbol, NoSymbol, NoSymbol, NoSymbol, radical, NoSymbol ] }; key { [ g, G, NoSymbol, Greek_gamma, NoSymbol, NoSymbol, Greek_GAMMA, NoSymbol ] }; key { [ c, C, NoSymbol, Greek_chi, NoSymbol, NoSymbol, U2102, NoSymbol ] }; key { [ l, L, NoSymbol, Greek_lambda, NoSymbol, NoSymbol, Greek_LAMBDA, NoSymbol ] }; key { [ ssharp, U1E9E, NoSymbol, Greek_finalsmallsigma, NoSymbol, NoSymbol, jot, NoSymbol ] }; key { [ z, Z, NoSymbol, Greek_zeta, NoSymbol, NoSymbol, U2124, NoSymbol ] }; key { [ h, H, NoSymbol, Greek_psi, NoSymbol, NoSymbol, Greek_PSI, NoSymbol ] }; key { [ a, A, NoSymbol, Greek_alpha, NoSymbol, NoSymbol, U2200, NoSymbol ] }; key { [ e, E, NoSymbol, Greek_epsilon, NoSymbol, NoSymbol, U2203, NoSymbol ] }; key { [ i, I, NoSymbol, Greek_iota, NoSymbol, NoSymbol, integral, NoSymbol ] }; key { [ u, U, NoSymbol, NoSymbol, NoSymbol, NoSymbol, includedin, NoSymbol ] }; key { [ d, D, NoSymbol, Greek_delta, NoSymbol, NoSymbol, Greek_DELTA, NoSymbol ] }; key { [ t, T, NoSymbol, Greek_tau, NoSymbol, NoSymbol, partialderivative, NoSymbol ] }; key { [ r, R, NoSymbol, Greek_rho, NoSymbol, NoSymbol, U211D, NoSymbol ] }; key { [ n, N, NoSymbol, Greek_nu, NoSymbol, NoSymbol, U2115, NoSymbol ] }; key { [ s, S, NoSymbol, Greek_sigma, NoSymbol, NoSymbol, Greek_SIGMA, NoSymbol ] }; key { [ f, F, NoSymbol, Greek_phi, NoSymbol, NoSymbol, Greek_PHI, NoSymbol ] }; key { [ x, X, NoSymbol, Greek_xi, NoSymbol, NoSymbol, Greek_XI, NoSymbol ] }; key { [ q, Q, NoSymbol, U03D5, NoSymbol, NoSymbol, U211A, NoSymbol ] }; key { [ adiaeresis, Adiaeresis, NoSymbol, Greek_eta, NoSymbol, NoSymbol, U2135, NoSymbol ] }; key { [ udiaeresis, Udiaeresis, NoSymbol, NoSymbol, NoSymbol, NoSymbol, union, NoSymbol ] }; key { [ odiaeresis, Odiaeresis, NoSymbol, U03F5, NoSymbol, NoSymbol, intersection, NoSymbol ] }; key { [ b, B, NoSymbol, Greek_beta, NoSymbol, NoSymbol, U21D0, NoSymbol ] }; key { [ p, P, NoSymbol, Greek_pi, NoSymbol, NoSymbol, Greek_PI, NoSymbol ] }; key { [ w, W, NoSymbol, Greek_omega, NoSymbol, NoSymbol, Greek_OMEGA, NoSymbol ] }; key { [ m, M, NoSymbol, Greek_mu, NoSymbol, NoSymbol, ifonlyif, NoSymbol ] }; key { [ j, J, NoSymbol, Greek_theta, NoSymbol, NoSymbol, Greek_THETA, NoSymbol ] }; }; partial alphanumeric_keys modifier_keys keypad_keys xkb_symbols "koy" { include "de(koy_base)" name[Group1]= "German (KOY)"; include "shift(both_capslock)" include "level3(caps_switch)" include "level3(bksl_switch)" include "level5(lsgt_switch_lock)" include "level5(ralt_switch_lock)" }; partial alphanumeric_keys xkb_symbols "bone_base" { include "de(neo_base)" key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK"; key { [ comma, endash, NoSymbol, U03F1, NoSymbol, NoSymbol, U21D2, NoSymbol ] }; key { [ period, enfilledcircbullet, NoSymbol, U03D1, NoSymbol, NoSymbol, U21A6, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK"; key { [ j, J, NoSymbol, Greek_theta, NoSymbol, NoSymbol, Greek_THETA, NoSymbol ] }; key { [ d, D, NoSymbol, Greek_delta, NoSymbol, NoSymbol, Greek_DELTA, NoSymbol ] }; key { [ u, U, NoSymbol, NoSymbol, NoSymbol, NoSymbol, includedin, NoSymbol ] }; key { [ a, A, NoSymbol, Greek_alpha, NoSymbol, NoSymbol, U2200, NoSymbol ] }; key { [ x, X, NoSymbol, Greek_xi, NoSymbol, NoSymbol, Greek_XI, NoSymbol ] }; key { [ p, P, NoSymbol, Greek_pi, NoSymbol, NoSymbol, Greek_PI, NoSymbol ] }; key { [ h, H, NoSymbol, Greek_psi, NoSymbol, NoSymbol, Greek_PSI, NoSymbol ] }; key { [ l, L, NoSymbol, Greek_lambda, NoSymbol, NoSymbol, Greek_LAMBDA, NoSymbol ] }; key { [ m, M, NoSymbol, Greek_mu, NoSymbol, NoSymbol, ifonlyif, NoSymbol ] }; key { [ w, W, NoSymbol, Greek_omega, NoSymbol, NoSymbol, Greek_OMEGA, NoSymbol ] }; key { [ ssharp, U1E9E, NoSymbol, Greek_finalsmallsigma, NoSymbol, NoSymbol, jot, NoSymbol ] }; key { [ c, C, NoSymbol, Greek_chi, NoSymbol, NoSymbol, U2102, NoSymbol ] }; key { [ t, T, NoSymbol, Greek_tau, NoSymbol, NoSymbol, partialderivative, NoSymbol ] }; key { [ i, I, NoSymbol, Greek_iota, NoSymbol, NoSymbol, integral, NoSymbol ] }; key { [ e, E, NoSymbol, Greek_epsilon, NoSymbol, NoSymbol, U2203, NoSymbol ] }; key { [ o, O, NoSymbol, Greek_omicron, NoSymbol, NoSymbol, elementof, NoSymbol ] }; key { [ b, B, NoSymbol, Greek_beta, NoSymbol, NoSymbol, U21D0, NoSymbol ] }; key { [ n, N, NoSymbol, Greek_nu, NoSymbol, NoSymbol, U2115, NoSymbol ] }; key { [ r, R, NoSymbol, Greek_rho, NoSymbol, NoSymbol, U211D, NoSymbol ] }; key { [ s, S, NoSymbol, Greek_sigma, NoSymbol, NoSymbol, Greek_SIGMA, NoSymbol ] }; key { [ g, G, NoSymbol, Greek_gamma, NoSymbol, NoSymbol, Greek_GAMMA, NoSymbol ] }; key { [ q, Q, NoSymbol, U03D5, NoSymbol, NoSymbol, U211A, NoSymbol ] }; key { [ f, F, NoSymbol, Greek_phi, NoSymbol, NoSymbol, Greek_PHI, NoSymbol ] }; key { [ v, V, NoSymbol, NoSymbol, NoSymbol, NoSymbol, radical, NoSymbol ] }; key { [ udiaeresis, Udiaeresis, NoSymbol, NoSymbol, NoSymbol, NoSymbol, union, NoSymbol ] }; key { [ adiaeresis, Adiaeresis, NoSymbol, Greek_eta, NoSymbol, NoSymbol, U2135, NoSymbol ] }; key { [ odiaeresis, Odiaeresis, NoSymbol, U03F5, NoSymbol, NoSymbol, intersection, NoSymbol ] }; key { [ y, Y, NoSymbol, Greek_upsilon, NoSymbol, NoSymbol, nabla, NoSymbol ] }; key { [ z, Z, NoSymbol, Greek_zeta, NoSymbol, NoSymbol, U2124, NoSymbol ] }; key { [ k, K, NoSymbol, Greek_kappa, NoSymbol, NoSymbol, multiply, NoSymbol ] }; }; partial alphanumeric_keys modifier_keys keypad_keys xkb_symbols "bone" { include "de(bone_base)" name[Group1]= "German (Bone)"; include "shift(both_capslock)" include "level3(caps_switch)" include "level3(bksl_switch)" include "level5(lsgt_switch_lock)" include "level5(ralt_switch_lock)" }; partial alphanumeric_keys xkb_symbols "bone_eszett_home_base" { include "de(bone_base)" key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK"; key { [ q, Q, NoSymbol, U03D5, NoSymbol, NoSymbol, U211A, NoSymbol ] }; key { [ ssharp, U1E9E, NoSymbol, Greek_finalsmallsigma, NoSymbol, NoSymbol, jot, NoSymbol ] }; }; partial alphanumeric_keys modifier_keys keypad_keys xkb_symbols "bone_eszett_home" { include "de(bone_eszett_home_base)" name[Group1]= "German (Bone, eszett home row)"; include "shift(both_capslock)" include "level3(caps_switch)" include "level3(bksl_switch)" include "level5(lsgt_switch_lock)" include "level5(ralt_switch_lock)" }; partial alphanumeric_keys xkb_symbols "neo_qwertz_base" { include "de(neo_base)" key.type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK"; key { [ comma, endash, NoSymbol, U03F1, NoSymbol, NoSymbol, U21D2, NoSymbol ] }; key { [ period, enfilledcircbullet, NoSymbol, U03D1, NoSymbol, NoSymbol, U21A6, NoSymbol ] }; key { [ minus, emdash, NoSymbol, U2011, NoSymbol, NoSymbol, hyphen, NoSymbol ] }; key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK"; key { [ ssharp, U1E9E, NoSymbol, Greek_finalsmallsigma, NoSymbol, NoSymbol, jot, NoSymbol ] }; key { [ q, Q, NoSymbol, U03D5, NoSymbol, NoSymbol, U211A, NoSymbol ] }; key { [ w, W, NoSymbol, Greek_omega, NoSymbol, NoSymbol, Greek_OMEGA, NoSymbol ] }; key { [ e, E, NoSymbol, Greek_epsilon, NoSymbol, NoSymbol, U2203, NoSymbol ] }; key { [ r, R, NoSymbol, Greek_rho, NoSymbol, NoSymbol, U211D, NoSymbol ] }; key { [ t, T, NoSymbol, Greek_tau, NoSymbol, NoSymbol, partialderivative, NoSymbol ] }; key { [ z, Z, NoSymbol, Greek_zeta, NoSymbol, NoSymbol, U2124, NoSymbol ] }; key { [ u, U, NoSymbol, NoSymbol, NoSymbol, NoSymbol, includedin, NoSymbol ] }; key { [ i, I, NoSymbol, Greek_iota, NoSymbol, NoSymbol, integral, NoSymbol ] }; key { [ o, O, NoSymbol, Greek_omicron, NoSymbol, NoSymbol, elementof, NoSymbol ] }; key { [ p, P, NoSymbol, Greek_pi, NoSymbol, NoSymbol, Greek_PI, NoSymbol ] }; key { [ udiaeresis, Udiaeresis, NoSymbol, NoSymbol, NoSymbol, NoSymbol, union, NoSymbol ] }; key { [ a, A, NoSymbol, Greek_alpha, NoSymbol, NoSymbol, U2200, NoSymbol ] }; key { [ s, S, NoSymbol, Greek_sigma, NoSymbol, NoSymbol, Greek_SIGMA, NoSymbol ] }; key { [ d, D, NoSymbol, Greek_delta, NoSymbol, NoSymbol, Greek_DELTA, NoSymbol ] }; key { [ f, F, NoSymbol, Greek_phi, NoSymbol, NoSymbol, Greek_PHI, NoSymbol ] }; key { [ g, G, NoSymbol, Greek_gamma, NoSymbol, NoSymbol, Greek_GAMMA, NoSymbol ] }; key { [ h, H, NoSymbol, Greek_psi, NoSymbol, NoSymbol, Greek_PSI, NoSymbol ] }; key { [ j, J, NoSymbol, Greek_theta, NoSymbol, NoSymbol, Greek_THETA, NoSymbol ] }; key { [ k, K, NoSymbol, Greek_kappa, NoSymbol, NoSymbol, multiply, NoSymbol ] }; key { [ l, L, NoSymbol, Greek_lambda, NoSymbol, NoSymbol, Greek_LAMBDA, NoSymbol ] }; key { [ odiaeresis, Odiaeresis, NoSymbol, U03F5, NoSymbol, NoSymbol, intersection, NoSymbol ] }; key { [ adiaeresis, Adiaeresis, NoSymbol, Greek_eta, NoSymbol, NoSymbol, U2135, NoSymbol ] }; key { [ y, Y, NoSymbol, Greek_upsilon, NoSymbol, NoSymbol, nabla, NoSymbol ] }; key { [ x, X, NoSymbol, Greek_xi, NoSymbol, NoSymbol, Greek_XI, NoSymbol ] }; key { [ c, C, NoSymbol, Greek_chi, NoSymbol, NoSymbol, U2102, NoSymbol ] }; key { [ v, V, NoSymbol, NoSymbol, NoSymbol, NoSymbol, radical, NoSymbol ] }; key { [ b, B, NoSymbol, Greek_beta, NoSymbol, NoSymbol, U21D0, NoSymbol ] }; key { [ n, N, NoSymbol, Greek_nu, NoSymbol, NoSymbol, U2115, NoSymbol ] }; key { [ m, M, NoSymbol, Greek_mu, NoSymbol, NoSymbol, ifonlyif, NoSymbol ] }; }; partial alphanumeric_keys modifier_keys keypad_keys xkb_symbols "neo_qwertz" { include "de(neo_qwertz_base)" name[Group1]= "German (Neo qwertz)"; include "shift(both_capslock)" include "level3(caps_switch)" include "level3(bksl_switch)" include "level5(lsgt_switch_lock)" include "level5(ralt_switch_lock)" }; partial alphanumeric_keys xkb_symbols "neo_qwerty_base" { include "de(neo_qwertz_base)" key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK"; key { [ y, Y, NoSymbol, Greek_upsilon, NoSymbol, NoSymbol, nabla, NoSymbol ] }; key { [ z, Z, NoSymbol, Greek_zeta, NoSymbol, NoSymbol, U2124, NoSymbol ] }; }; partial alphanumeric_keys modifier_keys keypad_keys xkb_symbols "neo_qwerty" { include "de(neo_qwerty_base)" name[Group1]= "German (Neo qwerty)"; include "shift(both_capslock)" include "level3(caps_switch)" include "level3(bksl_switch)" include "level5(lsgt_switch_lock)" include "level5(ralt_switch_lock)" }; partial alphanumeric_keys xkb_symbols "lld" { include "de(basic)" name[Group1] = "German Ladin"; key { [ p, P, ediaeresis, Ediaeresis ] }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8186457 libxkbcommon-0.10.0/test/data/symbols/empty0000644000175000017500000000014500000000000020300 0ustar00ranran00000000000000default partial alphanumeric_keys modifier_keys xkb_symbols "basic" { name[Group1]= "Empty"; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8186457 libxkbcommon-0.10.0/test/data/symbols/eurosign0000644000175000017500000000116500000000000021000 0ustar00ranran00000000000000// Most keyboards have the EuroSign engraved on the E key partial xkb_symbols "e" { key { [ NoSymbol, NoSymbol, EuroSign, NoSymbol ] }; }; // Many Apple keyboards have the EuroSign engraved on the 2 key partial xkb_symbols "2" { key { [ NoSymbol, NoSymbol, EuroSign, NoSymbol ] }; }; // Some keyboards have the EuroSign engraved on the 4 key partial xkb_symbols "4" { key { [ NoSymbol, NoSymbol, EuroSign, NoSymbol ] }; }; // Many keyboards have the EuroSign engraved on the 5 key partial xkb_symbols "5" { key { [ NoSymbol, NoSymbol, EuroSign, NoSymbol ] }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8286455 libxkbcommon-0.10.0/test/data/symbols/group0000644000175000017500000002731500000000000020306 0ustar00ranran00000000000000// The right Alt key (while pressed) chooses the second keyboard group. partial modifier_keys xkb_symbols "switch" { key { symbols[Group1] = [ Mode_switch, Multi_key ], virtualMods= AltGr }; }; // The left Alt key (while pressed) chooses the second keyboard group. partial modifier_keys xkb_symbols "lswitch" { key { symbols[Group1] = [ Mode_switch, Multi_key ], virtualMods= AltGr }; }; // Either Win key (while pressed) chooses the second keyboard group. partial modifier_keys xkb_symbols "win_switch" { include "group(lwin_switch)" include "group(rwin_switch)" }; // The left Win key (while pressed) chooses the second keyboard group. // (Using this map, you should declare your keyboard as pc101 or pc102 // instead of pc104 or pc105.) partial modifier_keys xkb_symbols "lwin_switch" { key { symbols[Group1] = [ Mode_switch, Multi_key ], virtualMods= AltGr }; }; // The right Win key (while pressed) chooses the second keyboard group. // (Using this map, you should declare your keyboard as pc101 or pc102 // instead of pc104 or pc105.) partial modifier_keys xkb_symbols "rwin_switch" { key { symbols[Group1] = [ Mode_switch, Multi_key ], virtualMods= AltGr }; }; // The right Menu key (while pressed) chooses the second keyboard group. // while Shift+Menu acts as Menu. partial modifier_keys xkb_symbols "menu_switch" { key { symbols[Group1] = [ Mode_switch, Menu ], virtualMods= AltGr }; }; // The right Ctrl key (while pressed) chooses the second keyboard group. // (Needed mainly for the Canadian keyboard.) partial modifier_keys xkb_symbols "rctrl_switch" { key { symbols[Group1] = [ Mode_switch ] }; }; // Pressing the right Alt key switches to the next group. partial modifier_keys xkb_symbols "toggle" { virtual_modifiers AltGr; key { symbols[Group1] = [ ISO_Next_Group ], virtualMods= AltGr }; }; // Pressing both Shift keys switches to the next or previous group // (depending on which Shift is pressed first). partial modifier_keys xkb_symbols "shifts_toggle" { key { [ Shift_L, ISO_Prev_Group ] }; key { [ Shift_R, ISO_Next_Group ] }; }; // Pressing Shift+Caps_Lock switches to the next group. partial modifier_keys xkb_symbols "shift_caps_toggle" { key { [ Caps_Lock, ISO_Next_Group ] }; }; // Pressing Caps_Lock selects the first group, // pressing Shift+Caps_Lock selects the last group. partial modifier_keys xkb_symbols "shift_caps_switch" { key { [ ISO_First_Group, ISO_Last_Group ] }; }; // toggle using win + space as combo partial modifier_keys xkb_symbols "win_space_toggle" { key { type="PC_SUPER_LEVEL2", symbols[Group1]= [ space, ISO_Next_Group ], symbols[Group2]= [ space, ISO_Next_Group ] }; }; // Pressing the left Win key selects the first group, // pressing the right Win or the Menu key selects the last group. partial modifier_keys xkb_symbols "win_menu_switch" { virtual_modifiers AltGr; key { virtualMods= AltGr, symbols[Group1] = [ ISO_First_Group ] }; key { virtualMods= AltGr, symbols[Group1] = [ ISO_Last_Group ] }; key { virtualMods= AltGr, symbols[Group1] = [ ISO_Last_Group ] }; }; // Pressing the left Ctrl key selects the first group, // pressing the right Ctrl key selects the last group. partial modifier_keys xkb_symbols "lctrl_rctrl_switch" { virtual_modifiers AltGr; key { virtualMods= AltGr, symbols[Group1] = [ ISO_First_Group ] }; key { virtualMods= AltGr, symbols[Group1] = [ ISO_Last_Group ] }; }; // // CTRL-SHIFT toggle section // partial modifier_keys xkb_symbols "lctrl_lshift_toggle" { key { type[Group1]="PC_CONTROL_LEVEL2", symbols[Group1] = [ Shift_L, ISO_Next_Group ] }; key { [ Control_L, ISO_Next_Group ] }; }; partial modifier_keys xkb_symbols "lctrl_lshift_toggle_rev" { key { type[Group1]="PC_CONTROL_LEVEL2", symbols[Group1] = [ Shift_L, ISO_Prev_Group ] }; key { [ Control_L, ISO_Prev_Group ] }; }; partial modifier_keys xkb_symbols "rctrl_rshift_toggle" { key { type[Group1]="PC_CONTROL_LEVEL2", symbols[Group1] = [ Shift_R, ISO_Next_Group ] }; key { [ Control_R, ISO_Next_Group ] }; }; partial modifier_keys xkb_symbols "ctrl_shift_toggle" { include "group(lctrl_lshift_toggle)" include "group(rctrl_rshift_toggle)" }; partial modifier_keys xkb_symbols "ctrl_shift_toggle_bidir" { include "group(lctrl_lshift_toggle_rev)" include "group(rctrl_rshift_toggle)" }; // // CTRL-ALT toggle section // partial modifier_keys xkb_symbols "lctrl_lalt_toggle" { virtual_modifiers Alt; key { type[Group1]="PC_CONTROL_LEVEL2", symbols[Group1] = [ NoSymbol, ISO_Next_Group ], virtualMods= Alt }; key { type[Group1]="PC_ALT_LEVEL2", symbols[Group1] = [ Control_L, ISO_Next_Group ] }; }; partial modifier_keys xkb_symbols "lctrl_lalt_toggle_rev" { virtual_modifiers Alt; key { type[Group1]="PC_CONTROL_LEVEL2", symbols[Group1] = [ NoSymbol, ISO_Prev_Group ], virtualMods= Alt }; key { type[Group1]="PC_ALT_LEVEL2", symbols[Group1] = [ Control_L, ISO_Prev_Group ] }; }; partial modifier_keys xkb_symbols "rctrl_ralt_toggle" { virtual_modifiers Alt; key { type[Group1]="PC_CONTROL_LEVEL2", symbols[Group1] = [ NoSymbol, ISO_Next_Group ], virtualMods= Alt }; key { type[Group1]="PC_ALT_LEVEL2", symbols[Group1] = [ Control_R, ISO_Next_Group ] }; }; partial modifier_keys xkb_symbols "ctrl_alt_toggle" { include "group(lctrl_lalt_toggle)" include "group(rctrl_ralt_toggle)" }; partial modifier_keys xkb_symbols "ctrl_alt_toggle_bidir" { include "group(lctrl_lalt_toggle_rev)" include "group(rctrl_ralt_toggle)" }; // // ALT-SHIFT toggle section // partial modifier_keys xkb_symbols "lalt_lshift_toggle" { virtual_modifiers Alt; key { symbols[Group1] = [ NoSymbol, ISO_Next_Group ], virtualMods= Alt }; key { type[Group1]="PC_ALT_LEVEL2", symbols[Group1] = [ Shift_L, ISO_Next_Group ] }; }; partial modifier_keys xkb_symbols "lalt_lshift_toggle_rev" { virtual_modifiers Alt; key { symbols[Group1] = [ NoSymbol, ISO_Prev_Group ], virtualMods= Alt }; key { type[Group1]="PC_ALT_LEVEL2", symbols[Group1] = [ Shift_L, ISO_Prev_Group ] }; }; partial modifier_keys xkb_symbols "ralt_rshift_toggle" { virtual_modifiers Alt; key { symbols[Group1] = [ NoSymbol, ISO_Next_Group ], virtualMods= Alt }; key { type[Group1]="PC_ALT_LEVEL2", symbols[Group1] = [ Shift_R, ISO_Next_Group ] }; }; partial modifier_keys xkb_symbols "alt_shift_toggle" { include "group(lalt_lshift_toggle)" include "group(ralt_rshift_toggle)" }; partial modifier_keys xkb_symbols "alt_shift_toggle_bidir" { include "group(lalt_lshift_toggle_rev)" include "group(ralt_rshift_toggle)" }; // Pressing the Menu key switches to the next group, // while Shift+Menu acts as Menu. partial modifier_keys xkb_symbols "menu_toggle" { key { [ ISO_Next_Group, Menu ] }; }; // Pressing the left Win key switches to the next group. // (Using this map, you should declare your keyboard as // pc101 or pc102 instead of pc104 or pc105.) partial modifier_keys xkb_symbols "lwin_toggle" { virtual_modifiers AltGr; key { virtualMods= AltGr, symbols[Group1] = [ ISO_Next_Group ] }; }; // Pressing the right Win key switches to the next group. // (Using this map, you should declare your keyboard as // pc101 or pc102 instead of pc104 or pc105.) partial modifier_keys xkb_symbols "rwin_toggle" { virtual_modifiers AltGr; key { virtualMods= AltGr, symbols[Group1] = [ ISO_Next_Group ] }; }; // Pressing both Ctrl keys switches to the next or previous group // (depending on which Ctrl is pressed first). partial modifier_keys xkb_symbols "ctrls_toggle" { virtual_modifiers LControl, RControl; key { type[Group1]="PC_CONTROL_LEVEL2", symbols[Group1] = [ NoSymbol, ISO_Prev_Group ], virtualMods= LControl }; key { type[Group1]="PC_CONTROL_LEVEL2", symbols[Group1] = [ NoSymbol, ISO_Next_Group ], virtualMods= RControl }; }; // Pressing both Alt switches to the next or previous group // (depending on which Alt is pressed first). partial modifier_keys xkb_symbols "alts_toggle" { virtual_modifiers LAlt, RAlt; key { type[Group1]="PC_RALT_LEVEL2", symbols[Group1] = [ NoSymbol, ISO_Prev_Group ], virtualMods= LAlt }; key { type[Group1]="PC_LALT_LEVEL2", symbols[Group1] = [ NoSymbol, ISO_Next_Group ], virtualMods= RAlt }; }; // Pressing the left Shift key switches to the next group. partial modifier_keys xkb_symbols "lshift_toggle" { virtual_modifiers AltGr; key { symbols[Group1] = [ ISO_Next_Group ], virtualMods= AltGr }; }; // Pressing the right Shift key switches to the next group. partial modifier_keys xkb_symbols "rshift_toggle" { virtual_modifiers AltGr; key { symbols[Group1] = [ ISO_Next_Group ], virtualMods= AltGr }; }; // Pressing the left Alt key switches to the next group. partial modifier_keys xkb_symbols "lalt_toggle" { virtual_modifiers AltGr; key { symbols[Group1] = [ ISO_Next_Group ], virtualMods= AltGr }; }; // Pressing the left Ctrl key switches to the next group. partial modifier_keys xkb_symbols "lctrl_toggle" { virtual_modifiers AltGr; key { symbols[Group1] = [ ISO_Next_Group ], virtualMods= AltGr }; }; // Pressing the right Ctrl key switches to the next group. partial modifier_keys xkb_symbols "rctrl_toggle" { virtual_modifiers AltGr; key { symbols[Group1] = [ ISO_Next_Group ], virtualMods= AltGr }; }; // Pressing Alt+Caps_Lock switches to the next group, // pressing Caps_Lock toggles CapsLock. partial modifier_keys xkb_symbols "alt_caps_toggle" { key { type="PC_ALT_LEVEL2", symbols[Group1] = [ Caps_Lock, ISO_Next_Group ] }; }; hidden partial modifier_keys xkb_symbols "olpc" { key { [ ISO_Next_Group, ISO_Prev_Group ] }; }; partial modifier_keys xkb_symbols "alt_space_toggle" { key { type[Group1]="PC_ALT_LEVEL2", symbols[Group1] = [ space, ISO_Next_Group ] }; }; // Pressing the Scroll Lock key switches to the next group, partial modifier_keys xkb_symbols "sclk_toggle" { virtual_modifiers AltGr; key { virtualMods= AltGr, symbols[Group1] = [ ISO_Next_Group ] }; }; // Control_L+Win_L selects the first group (presumably Lat), // Control_R+Menu selects the second group (presumably Rus). partial modifier_keys xkb_symbols "lctrl_lwin_rctrl_menu" { key { type[Group1] = "PC_CONTROL_LEVEL2", symbols[Group1] = [ Super_L, ISO_First_Group ] }; key { type[Group1] = "PC_CONTROL_LEVEL2", symbols[Group1] = [ Menu, ISO_Last_Group ] }; }; // Control_L+Win_L toggles groups. partial modifier_keys xkb_symbols "lctrl_lwin_toggle" { key { type[ Group1 ] = "PC_CONTROL_LEVEL2", symbols[ Group1 ] = [ Super_L, ISO_Next_Group ] }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8319788 libxkbcommon-0.10.0/test/data/symbols/il0000644000175000017500000003760000000000000017554 0ustar00ranran00000000000000// based on a keyboard map from an 'xkb/symbols/il' file // This is an implemetation of the Israeli standard SI-1452 (2013) // It does not implement changes to the English layout, as that part // of the standard is not normative nor really useful in the context // of xkb. // This implementation extends the standard with Yiddish digraphs // (a common extension) and Nun Hafukha (a fun character). default partial alphanumeric_keys xkb_symbols "basic" { // uses the kbd layout in use in Israel. name[Group1]= "Hebrew"; key.type[Group1] = "FOUR_LEVEL_SEMIALPHABETIC"; key { [ hebrew_zain, Z ] }; key { [ hebrew_samech, X, U05B6 ] }; // Segol key { [ hebrew_bet, C, U05B1 ] }; // Hataf Segol key { [ hebrew_he, V ] }; key { [ hebrew_nun, B, NoSymbol, U05C6 ]}; // Nun Hafukha key { [ hebrew_mem, N ] }; key { [ hebrew_zade, M, U05B5 ] }; // Tsere key { [ hebrew_taw, greater, rightsinglequotemark ]}; // greater Mirrored key { [ hebrew_finalzade, less, singlelowquotemark ]}; // less Mirrored key { [ hebrew_shin, A, U05B0 ] }; // Shva key { [ hebrew_dalet,S, U05BC ] }; // Dagesh key { [ hebrew_gimel,D ] }; key { [ hebrew_kaph, F ] }; key { [ hebrew_ayin, G, U05F1 ] }; // Yiddish Vav Yod key { [ hebrew_yod, H, U05F2 ] }; // Yiddish Double Yod key { [ hebrew_chet, J, U05B4 ] }; // Hiriq key { [ hebrew_lamed, K ] }; key { [ hebrew_finalkaph, L, rightdoublequotemark ]}; key { [ hebrew_finalpe, colon, doublelowquotemark ]}; key { [ slash, Q, U05C2 ] }; // Sin Dot key { [ apostrophe, W, U05C1 ] }; // Shin Dot key { [ hebrew_qoph, E, U05B8 ] }; // Qamats key { [ hebrew_resh, R, U05B3 ] }; // Hataf Qamats key { [ hebrew_aleph,T ] }; key { [ hebrew_tet, Y, U05F0 ] }; // Yiddish Double Vav key { [ hebrew_waw, U, U05B9 ] }; // Holam key { [ hebrew_finalnun, I ] }; key { [ hebrew_finalmem, O ] }; key { [ hebrew_pe, P, U05B7 ] }; // Patah key.type[Group1] = "FOUR_LEVEL"; // Non-alphanumeric keys key { [ period, question, division ]}; key { [ comma, quotedbl, U05F4] }; // Gershayim key { [ bracketright, braceright, U05B2 ]}; // Mirrored; Hataf Patah key { [ bracketleft, braceleft, U05BF ]}; // Mirrored; Rafe key { [ backslash, bar, U05BB ] }; // Qubuts // Top (digits) row key { [ semicolon, asciitilde, U05F3 ]}; // Geresh key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, numbersign, EuroSign ]}; key { [ 4, dollar, NewSheqelSign ]}; key { [ 5, percent, degree ]}; key { [ 6, asciicircum, U05AB ]}; // Hebrew Accent Ole key { [ 7, ampersand, U05BD ]}; // Meteg key { [ 8, asterisk, multiply]}; key { [ 9, parenright, U200E ]}; // LRM; Paren Mirrored key { [ 0, parenleft, U200F ]}; // RLM; Paren Mirrored key { [ minus, underscore, U05BE ]}; // Maqaf key { [ equal, plus, endash ]}; include "level3(ralt_switch)" }; // nikud patter based on Dekel Tsur's Hebrew mapping for LyX partial alphanumeric_keys xkb_symbols "lyx" { name[Group1]= "Hebrew (lyx)"; key { [ semicolon, asciitilde ] }; // On some key (e.g. AD01, right below) there is not yet mapping for the // second shift level. Since I could not figure a simple way to map this // to "emit nothing", it is currently mapped to the same letter of the // first shift level (avoiding mapping may risk it be used by a character // from a different group). key { [ slash, slash ] }; key { [ apostrophe, apostrophe ] }; key { [ hebrew_qoph, 0x10005b8 ] }; // Qamats key { [ hebrew_resh, 0x10005bc ] }; // Dagesh/Shuruq key { [ hebrew_aleph, 0x100200e ] }; // LRM key { [ hebrew_tet, 0x100200f ] }; // RLM key { [ hebrew_waw, 0x10005b9 ] }; // Holam key { [ hebrew_finalnun,hebrew_finalnun] }; key { [ hebrew_finalmem,hebrew_finalmem] }; key { [ hebrew_pe, 0x10005b7 ] }; // Patah key { [ hebrew_shin, 0x10005b0 ] }; // Sheva key { [ hebrew_dalet, 0x10005bc ] }; // Dagesh/Shuruq key { [ hebrew_gimel, hebrew_gimel ] }; key { [ hebrew_kaph, hebrew_kaph ] }; key { [ hebrew_ayin, 0x10005c2 ] }; // Sin dot key { [ hebrew_yod, 0x10005c1 ] }; // Shin dot key { [ hebrew_chet, 0x10005b4 ] }; // Hiriq key { [ hebrew_lamed, 0x10020aa ] }; // NIS key { [ hebrew_finalkaph,hebrew_finalkaph] }; key { [ hebrew_finalpe, colon ] }; key { [ comma, quotedbl ] }; key { [ hebrew_zain, hebrew_zain ] }; key { [ hebrew_samech,0x10005b6 ] }; // Segol key { [ hebrew_bet, 0x10005bb ] }; // Qubuts key { [ hebrew_he, 0x10005b1 ] }; // H. Segol key { [ hebrew_nun, 0x10005b2 ] }; // H. Patah key { [ hebrew_mem, 0x10005b3 ] }; // H. Qamats key { [ hebrew_zade, 0x10005b5 ] }; // Tsere key { [ hebrew_taw, greater ] }; key { [ hebrew_finalzade, less ] }; key { [ period, question ] }; // Note the parens mirroring below: key { [ bracketright, braceright ] }; key { [ bracketleft, braceleft ] }; key { [ 1, exclam ]}; key { [ 2, at ]}; key { [ 3, numbersign ]}; key { [ 4, dollar ]}; key { [ 5, percent ]}; key { [ 6, asciicircum ]}; key { [ 7, ampersand ]}; key { [ 8, asterisk ]}; key { [ 9, parenright ]}; key { [ 0, parenleft ]}; key { [ minus , 0x10005be ] }; // H. Hiphen key { [ equal , plus ] }; }; partial alphanumeric_keys xkb_symbols "phonetic" { // uses the phonetic layout from old Slackware 'il.map' file name[Group1]= "Hebrew (phonetic)"; key { [ equal, plus, hebrew_doublelowline, hebrew_doublelowline ]}; key { [ hebrew_qoph, hebrew_qoph ] }; key { [ hebrew_waw, hebrew_waw ] }; key { [ hebrew_aleph, hebrew_aleph ] }; key { [ hebrew_resh, hebrew_resh ] }; key { [ hebrew_taw, hebrew_tet ] }; key { [ hebrew_ayin, hebrew_ayin ] }; key { [ hebrew_waw, hebrew_waw ] }; key { [ hebrew_yod, hebrew_yod ] }; key { [ hebrew_samech, hebrew_samech ] }; key { [ hebrew_pe, hebrew_finalpe ] }; key { [ hebrew_aleph, hebrew_aleph ] }; key { [ hebrew_shin, hebrew_shin ] }; key { [ hebrew_dalet, hebrew_dalet ] }; key { [ hebrew_pe, hebrew_finalpe ] }; key { [ hebrew_gimel, hebrew_gimel ] }; key { [ hebrew_he, hebrew_he ] }; key { [ hebrew_yod, hebrew_yod ] }; key { [ hebrew_kaph, hebrew_finalkaph ] }; key { [ hebrew_lamed, hebrew_lamed ] }; key { [ hebrew_zain, hebrew_zain ] }; key { [ hebrew_chet, hebrew_chet ] }; key { [ hebrew_zade, hebrew_finalzade ] }; key { [ hebrew_waw, hebrew_waw ] }; key { [ hebrew_bet, hebrew_bet ] }; key { [ hebrew_nun, hebrew_finalnun ] }; key { [ hebrew_mem, hebrew_finalmem ] }; }; // The 'Biblical Hebrew' keyboard layout as defined by Tiro for use with the // 'SBL Hebrew' font was added 2006.11.13 by Sebastian J. Bronner // . Its primary features (as compared to the lyx layout) // are that the consonants are in the Israeli standard positions, that a great // multitude of glyphs can be input directly from the keyboard, and that it is // the closest thing to a standard layout a theologian can hope for. // Documentation (including printable keyboard tables), SBL Hebrew font, and // keyboard layout for Windows are available at // http://www.sbl-site.org/Resources/Resources_BiblicalFonts.aspx. // // It is of interest that the 'basic' layout defined first in this file (as // ships with x.org disagrees in the non-consonant characters that the Tiro- // layout claims to be the Israeli standard. Tiros apparent diligence in the // PDF-documentation accompanying the keyboard-layout-files lead me to put // greater stock in their claim than in this file. Therefore, the 'biblical' // layout below does not include 'il(basic)' but redoes the _whole_ thing from // scratch. partial alphanumeric_keys xkb_symbols "biblical" { name[Group1]= "Hebrew (Biblical, Tiro)"; key.type = "FOUR_LEVEL_SEMIALPHABETIC"; key { [ U05C3, U05AE, semicolon, asciitilde ] }; key { [ 1, U05A9, VoidSymbol, exclam ] }; key { [ 2, U0599, VoidSymbol, at ] }; key { [ 3, U0592, VoidSymbol, numbersign ] }; key { [ 4, U05AF, NewSheqelSign, dollar ] }; key { [ 5, U05BA, U200D, percent ] }; key { [ 6, U05B9, U200C, asciicircum ] }; key { [ 7, U05BF, U034F, ampersand ] }; key { [ 8, U05C2, U200E, asterisk ] }; key { [ 9, U05C1, U200F, parenright ] }; key { [ 0, U059D, U25CC, parenleft ] }; key { [ U05BE, U05A0, minus, underscore ] }; key { [ equal, U05BC, VoidSymbol, plus ] }; key { [ U0307, U05C4, U0308, slash ] }; key { [ U05F3, U05AC, U05F4, apostrophe ] }; key { [ hebrew_qoph, U05AB, U20AC ] }; key { [ hebrew_resh, U059F ] }; key { [ hebrew_aleph, U0593 ] }; key { [ hebrew_tet, U059E ] }; key { [ hebrew_waw, U059C, U05F0 ] }; key { [ hebrew_finalnun, U05A1 ] }; key { [ hebrew_finalmem, U0595 ] }; key { [ hebrew_pe, U0594 ] }; key { [ bracketright, U0597, VoidSymbol, braceright ] }; key { [ bracketleft, U0598, VoidSymbol, braceleft ] }; key { [ U05C0, U05A8, backslash, bar ] }; key { [ hebrew_shin, U05BD ] }; key { [ hebrew_dalet, U05B0 ] }; key { [ hebrew_gimel, U05BB ] }; key { [ hebrew_kaph, U05B4 ] }; key { [ hebrew_ayin, U05B1 ] }; key { [ hebrew_yod, U05B6, U05F2 ] }; key { [ hebrew_chet, U05B5, U05F1 ] }; key { [ hebrew_lamed, U05B3 ] }; key { [ hebrew_finalkaph, U05B8, U05C7 ] }; key { [ hebrew_finalpe, U05B2, VoidSymbol, colon ] }; key { [ U059a, U05B7, comma, quotedbl ] }; key { [ hebrew_zain, U05C5 ] }; key { [ hebrew_samech, U05A4 ] }; key { [ hebrew_bet, U05AA, U05A2 ] }; key { [ hebrew_he, U05A6 ] }; key { [ hebrew_nun, U05A5, U05C6 ] }; key { [ hebrew_mem, U05A7 ] }; key { [ hebrew_zade, U059B ] }; key { [ hebrew_taw, U0591, VoidSymbol, greater ] }; key { [ hebrew_finalzade, U0596, VoidSymbol, less ] }; key { [ U05AD, U05A3, period, question ] }; key { [ space, space, thinspace, nobreakspace ] }; }; // EXTRAS // Biblical hebrew (SIL) US Standard layout version 1.5 // This map is based closely on v 1.5 of the standard. The only deviation being the replacement of the composite characters sin and shin // by their more recent Unicodev6 counterparts // this map contains all the characters found in Biblical annotation, masoretic and Dead Sea Scroll related work. // The layout corresponds phonetically to a US standard layout or similar (Qwerty). // If you are using an actual Hebrew keyboard, you are probably better off using a Tiro compliant scholarly layout // This linux port created and maintained by Dennis Meulensteen, dennis@meulensteen.nl partial alphanumeric_keys xkb_symbols "biblicalSIL" { name[Group1]= "Hebrew (Biblical, SIL phonetic)"; key.type = "FOUR_LEVEL_SEMIALPHABETIC"; key { [ U20AC, U20AA, U0024 ] }; //Euro, Shekel, Dollar - key { [ 1, U0021, U05BD, U0597 ] }; //1, exclamation meteg revia key { [ 2, U0598, U05A2, U05AE ] }; //2, zarqa atn. hafukh zinor key { [ 3, U05A8, U0596, U0599 ] }; //3, qadma tipeha pashta key { [ 4, U059C, U05A5, U05A0 ] }; //4, geresh merkha tel. gedola key { [ 5, U059E, U05A6, U05A9 ] }; //5, gershayim mer. kefula tel qetana key { [ 6, VoidSymbol, U05AD, U059F ] }; //6, - dehi qar. para key { [ 7, U05AC, U05A3, U05A1 ] }; //7, iluy munah pazer key { [ 8, U059D, U059B, U0595 ] }; //8, g. muqdam tevir zaq. gadol key { [ 9, U0029, U05A7, U0593 ] }; //9, parenth.R darqa shalshelet key { [ 0, U0028, U05AA, U05AF ] }; //0, paren.L yer. ben yomo masora c. key { [ U05BE, U2013, U2014, U05BF ] }; //Maqaf, en dash em dash rafe key { [ U05BC, VoidSymbol, U0591, U25CC ] }; //Dagesh - etnahta mark base key { [ hebrew_qoph, U0597 ] }; //Qof revia - - key { [ hebrew_waw] }; //waw - - - key { [ U05B6, U05B5, VoidSymbol, U05B1 ] }; //segol tsere - hat. segol key { [ hebrew_resh ] }; //resh - - - key { [ hebrew_taw ] }; //taw - - - key { [ hebrew_yod, U059F ] }; //jod qar. para - - key { [ U05BB] }; //quibuts - - - key { [ U05B4 ] }; //hiriq, - - - key { [ U05B9, U05BA, U05C7, U05B3 ] }; //holam, holam(wav) qam. qatan hat. Qamats key { [ hebrew_pe, hebrew_finalpe, VoidSymbol, U034F ] }; //pe final pe - c. grapheme joiner key { [ bracketright, braceright, VoidSymbol, U0594 ] }; //Bracket R brace R - zaq. qatan key { [ bracketleft, braceleft, U059A, U0592 ] }; //Brachket L brace L yetiv segolta key { [ U05C0, U05C0, U05A4, U05AB ] };//Paseq Paseq mahapakh ole key { [ U05B7, U05B8, U05C7, U05B2 ] }; //patah Qamats Qam. Qatan hat. patah key { [ hebrew_samech, U05E9 ] }; //Samech, shin no dot - - key { [ hebrew_dalet ] }; //dalet - - - key { [ UFB2B, hebrew_shin, U05C2 ] }; //UCSv6 Sin shin (nodot) sindot - key { [ hebrew_gimel, VoidSymbol, U25E6, U2022 ] }; //gimel - bullet(DSS) bulletfill (DSS) key { [ hebrew_he, VoidSymbol, U0336, U030A ] };//he - strikeout(DSS) Ring Above(DSS) key { [ UFB2A, hebrew_shin, U05C1] }; //UCSv6 Shin shin (nodot) shindot - key { [ hebrew_kaph, hebrew_finalkaph ] }; //kaph Final kaph - key { [ hebrew_lamed, VoidSymbol ] }; //lamed - - key { [ U05B0, U05F4, semicolon, U05C3 ] }; //sva gers. p semicolon sof pasuq key { [ U2019, U201D, U0323, U05C4 ] };//QuoteRight double R Quote punctum punctum Above key { [ hebrew_zain ] }; //Zayin - - key { [ hebrew_chet ] }; //chet - - key { [ hebrew_zade, U05E5 ] }; // tzade, final tzade - key { [ hebrew_tet ] }; //tet - - key { [ hebrew_bet ] }; //bet - - key { [ hebrew_nun, hebrew_finalnun ] }; //nun, final nun key { [ hebrew_mem, hebrew_finalmem, U200C, U200D ] }; //mem, final mem 0.wid.non.join. 0.wid.joiner key { [ U002C, U05E2, U00AB, U0307 ] }; //comma, ayin guillemetsR masora dot key { [ U0002E, U05D0, U00BB, U0308 ] }; //period, alef guillemetsL thousands key { [ slash, question, U05F3 ] }; //slash question geresh P key { [ space, space, thinspace, nobreakspace ] };//space space thin space, nbsp }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8353121 libxkbcommon-0.10.0/test/data/symbols/in0000644000175000017500000027073100000000000017562 0ustar00ranran00000000000000// This layout includes all Indian layouts, including: // - Devanagari (Hindi, Marathi, Sanskrit) // - Bangla // - Gujarati // - Kannada // - Malayalam // - Ol Chiki // - Oriya // - Tamil // - Telugu // - Urdu // Links: // - Indic INSCRIPT keyboard layout diagrams: // http://java.sun.com/products/jfc/tsc/articles/InputMethod/indiclayout.html // - Bangla Baishakhi (Bangla layouts): // - Bangla Baishakhi Inscript (Bangla layouts): // - Bangla Bornona (Bangla layouts): // - Uni Gitanjali (Bangla layouts): // http://nltr.org // - Ekusheyr Shadhinota (Bangla layouts): // http://ekushey.org/projects/shadhinota/index.html // - Microsoft Windows XP SP2: Indic Language Standards - an Introduction: // http://www.bhashaindia.com/MSProducts/XpSp2/Articles/IndicLanguageStandards.aspx // - Ol Chiki: // http://www.unicode.org/L2/L2005/05243r-n2984-ol-chiki.pdf (fig. 9) // based on a keyboard map from an 'xkb/symbols/dev' file // Devangari is the default. Kill me if I am wrong:) default partial alphanumeric_keys xkb_symbols "deva" { // March 2004 -- David Holl name[Group1]="Indian"; key.type="FOUR_LEVEL"; key { [ U094a, U0912, grave, asciitilde ] }; key { [ U0967, U090d, 1, exclam ] }; key { [ U0968, U0945, 2, at ] }; // Shift+AE0[3-8] really need to return a macro of keys defined by // INSCRIPT in place of the symbols that are here for now. But this // requires XKB to map 1 key into two to three other key presses. key { [ U0969, numbersign, 3, numbersign ] }; key { [ U096a, dollar, 4 ] }; key { [ U096b, percent, 5, percent ] }; key { [ U096c, asciicircum, 6, asciicircum ] }; key { [ U096d, ampersand, 7, ampersand ] }; key { [ U096e, asterisk, 8, asterisk ] }; key { [ U096f, parenleft, 9, parenleft ] }; key { [ U0966, parenright, 0, parenright ] }; key { [ minus, U0903, minus, underscore ] }; key { [ U0943, U090b, U0944, U0960 ] }; key { [ U094c, U0914 ] }; key { [ U0948, U0910 ] }; key { [ U093e, U0906 ] }; key { [ U0940, U0908, U0963, U0961 ] }; key { [ U0942, U090a ] }; key { [ U092c, U092d ] }; key { [ U0939, U0919 ] }; key { [ U0917, U0918, U095a ] }; key { [ U0926, U0927 ] }; key { [ U091c, U091d, U095b ] }; key { [ U0921, U0922, U095c, U095d ] }; key { [ U093c, U091e ] }; // I added \ / ? | for shell-convenience (file names and piping) key { [ U0949, U0911, U005C, U007C ] }; key { [ U094b, U0913 ] }; key { [ U0947, U090f ] }; key { [ U094d, U0905 ] }; key { [ U093f, U0907, U0962, U090c ] }; key { [ U0941, U0909 ] }; key { [ U092a, U092b, NoSymbol, U095e ] }; key { [ U0930, U0931 ] }; key { [ U0915, U0916, U0958, U0959 ] }; key { [ U0924, U0925 ] }; key { [ U091a, U091b, U0952 ] }; key { [ U091f, U0920, NoSymbol, U0951 ] }; key { [ U0946, U090e, U0953 ] }; key { [ U0902, U0901, NoSymbol, U0950 ] }; key { [ U092e, U0923, U0954 ] }; key { [ U0928, U0929 ] }; key { [ U0935, U0934 ] }; key { [ U0932, U0933 ] }; key { [ U0938, U0936 ] }; key { [ comma, U0937, U0970 ] }; key { [ period, U0964, U0965, U093d ] }; // I added \ / ? | for shell-convenience (file names and piping) key { [ U092f, U095f, slash, question ] }; // space, space, Zero-Width-Non-Joiner (ZWNJ), Zero-Width-Joiner (ZWJ): include "nbsp(zwnj3zwj4)" include "rupeesign(4)" include "level3(ralt_switch)" }; //Name : Bolnagri (Combined) //Description : A phonetic keyboard layout for Devnagari(Hindi) // http://www.indlinux.org/wiki/index.php/BolNagri //NOTE : This is a combined map of bolnagri_matras and bolnagri_vowels. //Inspired by "devrom" keymap by Steve Smith for the windows tool "keyman" //Original Author : Noah Levitt //Past Authors : Pramod.R and Ravikant //Current Main. : G Karunakar partial alphanumeric_keys xkb_symbols "bolnagri" { name[Group1] = "Hindi (Bolnagri)"; key.type="FOUR_LEVEL"; // Roman digits key { [ U0902, U0901, apostrophe, asciitilde ] }; // apostrophe: anusvara, candrabindu key { [ 1, exclam, U0967, exclam ] }; key { [ 2, at, U0968, at ] }; key { [ 3, numbersign, U0969, numbersign ] }; key { [ 4, dollar, U096A ] }; // Rupee symbol on AltGr+4 key { [ 5, percent, U096B, percent ] }; key { [ 6, asciicircum, U096C, asciicircum ] }; key { [ 7, ampersand, U096D, ampersand ] }; key { [ 8, asterisk, U096E, asterisk ] }; key { [ 9, parenleft, U096F, parenleft ] }; key { [ 0, parenright, U0966, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ U0964, U0965, U007C, U005C ] }; //pipe : danda, double danda //Q Row key { [ U200C, U200D ] }; // Q: ZWNJ, ZWJ key { [ U0935, U950 ] }; // W: wa, OM key { [ U0947, U0948, U090F, U0910 ] }; // E: e, ai matras key { [ U0930, U0943, U0931, U090B ] }; // R: ra, vocalic Ri key { [ U0924, U0925 ] }; // T: ta, tha key { [ U092f, U091E ] }; // Y: ya, nya key { [ U0941, U0942, U0909, U090A ] }; // U: u, uu matras key { [ U093F, U0940, U0907, U0908 ] }; // I: i, ii matras key { [ U094B, U094C, U0913, U0914 ] }; // O: o, au matras key { [ U092A, U092B ] }; // P: pa, pha key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; //A Row key { [ U093E, U0906, U0905, U0906 ] }; // A: aa, full A, AA key { [ U0938, U0937 ] }; // S: sa, ssa key { [ U0926, U0927 ] }; // D: da, dha key { [ U091F, U0920 ] }; // F: TA, THA key { [ U0917, U0918 ] }; // G: ga, gha key { [ U0939, U0903 ] }; // H: ha, visarg key { [ U091C, U091D ] }; // J: ja, jha key { [ U0915, U0916 ] }; // K: ka, kha key { [ U0932, U0933, U0962, U090C ] }; // L: la, vocalic L or lru matra key { [ semicolon, colon ] }; key { [apostrophe, quotedbl ] }; //Z Row key { [ U0936, U0945, U0936, U090D ] }; // Z: sha, akaar candra key { [ U094D, U0949, U094D, U0911 ] }; // X: halant, aakaar candra, chandra A key { [ U091A, U091B ] }; // C: ca, cha key { [ U0921, U0922 ] }; // V: da, dha key { [ U092C, U092D ] }; // B: ba, bha key { [ U0928, U0923 ] }; // N: na, nna key { [ U092E, U0919, U092E, U093D ] }; // M: ma, nga, avagraha key { [ comma, U0970 ] };// comma: comma, dev abbreviation sign key { [ period, U093C ] }; // period: period, nukta key { [ slash, question ] }; // modifier_map Shift { Shift_L }; // modifier_map Lock { Caps_Lock }; // modifier_map Control{ Control_L }; // modifier_map Mod3 { Mode_switch }; include "level3(ralt_switch)" include "rupeesign(4)" }; // based on a keyboard map from an 'xkb/symbols/ben' file partial alphanumeric_keys xkb_symbols "ben" { name[Group1]= "Bangla (India)"; // Mainly numbers. key { [ U09E7 ] }; key { [ U09E8 ] }; key { [ U09E9 ] }; key { [ U09EA ] }; key { [ U09EB ] }; key { [ U09EC ] }; key { [ U09ED ] }; key { [ U09EE ] }; key { [ U09EF, parenleft ] }; key { [ U09E6, parenright ] }; key { [ minus, U0983 ] }; key { [ U098B, U09C3 ] }; // Mainly long vowels key { [ U09CC, U0994 ] }; key { [ U09C8, U0990 ] }; key { [ U09BE, U0986 ] }; key { [ U09C0, U0988 ] }; key { [ U09C2, U098A ] }; // Mainly voiced consonants key { [ U09AC, U09AD ] }; key { [ U09B9, U0999 ] }; key { [ U0997, U0998 ] }; key { [ U09A6, U09A7 ] }; key { [ U099C, U099D ] }; key { [ U09A1, U09A2 ] }; key { [ U09BC, U099E ] }; // Mainly short vowels key { [ U09CB, U0993 ] }; key { [ U09C7, U098F ] }; key { [ U09CD, U0985 ] }; key { [ U09BF, U0987 ] }; key { [ U09C1, U0989 ] }; // Mainly unvoiced consonants key { [ U09AA, U09AB ] }; key { [ U09B0, U09DD ] }; key { [ U0995, U0996 ] }; key { [ U09A4, U09A5 ] }; key { [ U099A, U099B ] }; key { [ U099F, U09A0 ] }; key { [ U005C, U007C ] }; key { [ z, Z ] }; key { [ U0982, U0981 ] }; key { [ U09AE, U09A3 ] }; key { [ U09A8, U09A8 ] }; key { [ U09AC, U09AC ] }; key { [ U09B2, U09B2 ] }; key { [ U09B8, U09B6 ] }; key { [ comma, U09B7 ] }; key { [ period, U0964 ] }; key { [ U09DF, U09AF ] }; include "level3(ralt_switch)" include "rupeesign(4)" }; xkb_symbols "ben_probhat" { name[Group1]= "Bangla (India, Probhat)"; key { [ Escape ] }; // numbers key { [ U200D, asciitilde ] }; key { [ U09E7, exclam ] }; key { [ U09E8, at ] }; key { [ U09E9, numbersign ] }; key { [ U09EA, U09F3 ] }; key { [ U09EB, percent ] }; key { [ U09EC, asciicircum ] }; key { [ U09ED, U099E ] }; key { [ U09EE, U09CE ] }; key { [ U09EF, parenleft ] }; key { [ U09E6, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ BackSpace ] }; // tab, q to ] key { [ Tab, ISO_Left_Tab ] }; key { [ U09A6, U09A7 ] }; key { [ U09C2, U098A ] }; key { [ U09C0, U0988 ] }; key { [ U09B0, U09DC ] }; key { [ U099F, U09A0 ] }; key { [ U098F, U0990 ] }; key { [ U09C1, U0989 ] }; key { [ U09BF, U0987 ] }; key { [ U0993, U0994 ] }; key { [ U09AA, U09AB ] }; key { [ U09C7, U09C8 ] }; key { [ U09CB, U09CC ] }; key { [ Return ] }; // caps, a to ' // key { [ Caps_Lock ] }; key { [ U09BE, U0985 ] }; key { [ U09B8, U09B7 ] }; key { [ U09A1, U09A2 ] }; key { [ U09A4, U09A5 ] }; key { [ U0997, U0998 ] }; key { [ U09B9, U0983 ] }; key { [ U099C, U099D ] }; key { [ U0995, U0996 ] }; key { [ U09B2, U0982 ] }; key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl ] }; // shift, z to / // key { [ Shift_L ] }; key { [ U09DF, U09AF ] }; key { [ U09B6, U09DD ] }; key { [ U099A, U099B ] }; key { [ U0986, U098B ] }; key { [ U09AC, U09AD ] }; key { [ U09A8, U09A3 ] }; key { [ U09AE, U0999 ] }; key { [ comma, U09C3 ] }; key { [ U0964, U0981 ] }; key { [ U09CD, question ] }; key { [ U200C, U0965 ] }; // key { [ Control_L ] }; // key { [ space ] }; // modifier_map Shift { Shift_L }; // modifier_map Lock { Caps_Lock }; // modifier_map Control{ Control_L }; include "level3(ralt_switch)" include "rupeesign(4)" }; // Bangla Baishakhi, Bangla Baishakhi Inscript, Bangla Bornona, Uni Gitanjali Layouts are added by Promathesh Mandal xkb_symbols "ben_baishakhi" { name[Group1]= "Bangla (India, Baishakhi)"; key { [ Escape ] }; // numbers key { [ 0x100200D, 0x100200C ] }; key { [ 0x10009E7, exclam ] }; key { [ 0x10009E8, at ] }; key { [ 0x10009E9, numbersign ] }; key { [ 0x10009EA, dollar, 0x10009F2 ] }; key { [ 0x10009EB, percent ] }; key { [ 0x10009EC, asciicircum, 0x10009D7 ] }; key { [ 0x10009ED, ampersand ] }; key { [ 0x10009EE, asterisk,0x10009FA ] }; key { [ 0x10009EF, parenleft ] }; key { [ 0x10009E6, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ BackSpace ] }; // tab, q to ] key { [ Tab, ISO_Left_Tab ] }; key { [ 0x10009A1, 0x10009A2 ] }; key { [ 0x10009C0 , 0x10009C2 ] }; key { [ 0x10009C7, 0x100098F, 0x1000990 ] }; key { [ 0x10009B0 , 0x10009C3, 0x100098B ] }; key { [ 0x100099F, 0x10009A0 ] }; key { [ 0x10009AF, 0x10009DF ] }; key { [ 0x10009C1, 0x1000989, 0x100098A ] }; key { [ 0x10009BF, 0x1000987, 0x1000988 ] }; key { [ 0x10009CB, 0x1000993, 0x1000994 ] }; key { [ 0x10009AA, 0x10009AB ] }; key { [ bracketleft, braceleft] }; key { [ bracketright, braceright ] }; key { [ Return ] }; // caps, a to ' // key { [ Caps_Lock ] }; key { [ 0x10009BE, 0x1000985, 0x1000986 ] }; key { [ 0x10009B8, 0x10009B6, 0x10009B7 ] }; key { [ 0x10009A6, 0x10009A7 ] }; key { [ 0x10009A4, 0x10009A5, 0x10009CE ] }; key { [ 0x1000997, 0x1000998 ] }; key { [ 0x10009CD, 0x10009B9, 0x1000983 ] }; key { [ 0x100099C, 0x100099D ] }; key { [ 0x1000995, 0x1000996 ] }; key { [ 0x10009B2, 0x1000964, 0x100098C ] }; key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl ] }; // shift, z to / // key { [ Shift_L ] }; key { [ 0x10009C8, 0x10009CC ] }; key { [ 0x10009DC, 0x10009DD ] }; key { [ 0x100099A, 0x100099B ] }; key { [ 0x10009F1, 0x10009F0 ] }; key { [ 0x10009AC, 0x10009AD ] }; key { [ 0x10009A8, 0x10009A3, 0x100099E ] }; key { [ 0x10009AE, 0x1000999, 0x1000981 ] }; key { [ comma, less ] }; key { [ period, greater,0x10009BC ] }; key { [ slash, question, 0x1000982 ] }; key { [ backslash, bar ] }; // third level with right-alt include "level3(ralt_switch)" // key { [ Control_L ] }; // key { [ space ] }; // modifier_map Shift { Shift_L }; // modifier_map Lock { Caps_Lock }; // modifier_map Control{ Control_L }; }; xkb_symbols "ben_inscript" { name[Group1]= "Bangla (India, Baishakhi Inscript)"; // Mainly numbers. key { [ 0x100200D, 0x100200C ] }; key { [ 0x10009E7 ] }; key { [ 0x10009E8 ] }; key { [ 0x10009E9 ] }; key { [ 0x10009EA ] }; key { [ 0x10009EB ] }; key { [ 0x10009EC ] }; key { [ 0x10009ED ] }; key { [ 0x10009EE ] }; key { [ 0x10009EF, parenleft ] }; key { [ 0x10009E6, parenright ] }; key { [ minus, 0x1000983 ] }; key { [ 0x10009C3, 0x100098B ] }; // Mainly long vowels key { [ 0x10009CC, 0x1000994 ] }; key { [ 0x10009C8, 0x1000990 ] }; key { [ 0x10009BE, 0x1000986 ] }; key { [ 0x10009C0, 0x1000988 ] }; key { [ 0x10009C2, 0x100098A ] }; // Mainly voiced consonants key { [ 0x10009AC, 0x10009AD ] }; key { [ 0x10009B9, 0x1000999 ] }; key { [ 0x1000997, 0x1000998 ] }; key { [ 0x10009A6, 0x10009A7 ] }; key { [ 0x100099C, 0x100099D ] }; key { [ 0x10009A1, 0x10009A2 ] }; key { [ 0x10009BC, 0x100099E ] }; // Mainly short vowels key { [ 0x10009CB, 0x1000993 ] }; key { [ 0x10009C7, 0x100098F ] }; key { [ 0x10009CD, 0x1000985 ] }; key { [ 0x10009BF, 0x1000987 ] }; key { [ 0x10009C1, 0x1000989 ] }; // Mainly unvoiced consonants key { [ 0x10009AA, 0x10009AB ] }; key { [ 0x10009B0, 0x10009DD ] }; key { [ 0x1000995, 0x1000996 ] }; key { [ 0x10009A4, 0x10009A5 ] }; key { [ 0x100099A, 0x100099B ] }; key { [ 0x100099F, 0x10009A0 ] }; key { [ backslash, bar ] }; key { [ 0x10009CE ] }; key { [ 0x1000982, 0x1000981 ] }; key { [ 0x10009AE, 0x10009A3 ] }; key { [ 0x10009A8, 0x10009A8 ] }; key { [ 0x10009AC, 0x10009AC ] }; key { [ 0x10009B2, 0x10009B2 ] }; key { [ 0x10009B8, 0x10009B6 ] }; key { [ comma, 0x10009B7 ] }; key { [ period, 0x1000964 ] }; key { [ 0x10009DF, 0x10009AF ] }; }; xkb_symbols "ben_gitanjali" { name[Group1]= "Bangla (India, Uni Gitanjali)"; key { [ Escape ] }; // numbers key { [ colon, question ] }; key { [ 0x10009E7, 0x10009CE ] }; key { [ 0x10009E8, apostrophe ] }; key { [ 0x10009E9, numbersign ] }; key { [ 0x10009EA, 0x10009F3 ] }; key { [ 0x10009EB, slash ] }; key { [ 0x10009EC, period ] }; key { [ 0x10009ED, ampersand ] }; key { [ 0x10009EE, asterisk ] }; key { [ 0x10009EF, parenleft ] }; key { [ 0x10009E6, parenright ] }; key { [ minus, 0x1000983 ] }; key { [ 0x10009C3, 0x100098B ] }; key { [ BackSpace ] }; // tab, q to ] key { [ Tab, ISO_Left_Tab ] }; key { [ 0x10009D7, 0x1000994 ] }; key { [ 0x10009C8, 0x1000990 ] }; key { [ 0x10009BE, 0x1000985 ] }; key { [ 0x10009C0, 0x1000988 ] }; key { [ 0x10009C2, 0x100098A ] }; key { [ 0x10009AC, 0x10009AD ] }; key { [ 0x10009B9, 0x1000999 ] }; key { [ 0x1000997, 0x1000998 ] }; key { [ 0x10009A6, 0x10009A7 ] }; key { [ 0x100099C, 0x100099D ] }; key { [ 0x10009A1, 0x10009A2 ] }; key { [ 0x100200C, 0x100099E ] }; key { [ Return ] }; // caps, a to ' // key { [ Caps_Lock ] }; key { [ 0x100200D, 0x1000993 ] }; key { [ 0x10009C7, 0x100098F ] }; key { [ 0x10009CD ] }; key { [ 0x10009BF, 0x1000987 ] }; key { [ 0x10009C1, 0x1000989 ] }; key { [ 0x10009AA, 0x10009AB ] }; key { [ 0x10009B0, 0x10009F0 ] }; key { [ 0x1000995, 0x1000996 ] }; key { [ 0x10009A4, 0x10009A5 ] }; key { [ 0x100099A, 0x100099B ] }; key { [ 0x100099F, 0x10009A0 ] }; // shift, z to / // key { [ Shift_L ] }; key { [ 0x10009C7, 0x100098F ] }; key { [ 0x1000982, 0x1000981 ] }; key { [ 0x10009AE, 0x10009A3 ] }; key { [ 0x10009A8, 0x10009DC ] }; key { [ 0x10009F1, 0x10009DD ] }; key { [ 0x10009B2 ] }; key { [ 0x10009B8, 0x10009B6 ] }; key { [ comma, 0x10009B7 ] }; key { [ 0x1000964, 0x10009FA ] }; key { [ 0x10009AF, 0x10009DF ] }; key { [ backslash, bar ] }; // third level with right-win // include "level3(lwin_switch)" // key { [ Control_L ] }; // key { [ space ] }; // modifier_map Shift { Shift_L }; // modifier_map Lock { Caps_Lock }; // modifier_map Control{ Control_L }; }; xkb_symbols "ben_bornona" { name[Group1]= "Bangla (India, Bornona)"; key { [ Escape ] }; // numbers key { [ 0x100200D, 0x100200C ] }; key { [ 0x10009E7, exclam ] }; key { [ 0x10009E8, 0x1000981 ] }; key { [ 0x10009E9, numbersign ] }; key { [ 0x10009EA, 0x10009F3 ] }; key { [ 0x10009EB, percent ] }; key { [ 0x10009EC, 0x1000983 ] }; key { [ 0x10009ED, 0x10009CE ] }; key { [ 0x10009EE, asterisk ] }; key { [ 0x10009EF, parenleft ] }; key { [ 0x10009E6, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ BackSpace ] }; // tab, q to ] key { [ Tab, ISO_Left_Tab ] }; key { [ 0x1000982, 0x1000999, 0x10009D7 ] }; key { [ 0x10009A2, 0x10009A0, 0x100098A ] }; key { [ 0x10009C7, 0x10009C8, 0x1000988 ] }; key { [ 0x10009B0, 0x10009C3, 0x100098B ] }; key { [ 0x10009A4, 0x100099F ] }; key { [ 0x10009A7, 0x10009A5, 0x100098F ] }; key { [ 0x10009C1, 0x10009C2, 0x1000989 ] }; key { [ 0x10009BF, 0x10009C0, 0x1000987 ] }; key { [ 0x10009CB, 0x10009CC, 0x1000993 ] }; key { [ 0x10009AA, 0x1000990, 0x1000994 ] }; key { [ 0x100005B, 0x100007B, 0x10009DC ] }; key { [ 0x100005D, 0x100007D ] }; key { [ Return ] }; // caps, a to ' // key { [ Caps_Lock ] }; key { [ 0x10009BE, 0x1000985, 0x10009F4 ] }; key { [ 0x10009B8, 0x10009B6, 0x10009F5 ] }; key { [ 0x10009A6, 0x10009A1, 0x10009F8 ] }; key { [ 0x10009AB ] }; key { [ 0x1000997, 0x1000998 ] }; key { [ 0x10009CD, 0x10009B9 ] }; key { [ 0x100099C, 0x100099D ] }; key { [ 0x1000995, 0x1000996 ] }; key { [ 0x10009B2, 0x1000964 ] }; key { [ semicolon, 0x100003A ] }; key { [ apostrophe, quotedbl ] }; // shift, z to / // key { [ Shift_L ] }; key { [ 0x10009AF, 0x10009DC ] }; key { [ 0x10009B7, 0x10009DD, 0x10009FA ] }; key { [ 0x100099A, 0x100099B ] }; key { [ 0x10009AD ] }; key { [ 0x10009AC, 0x10009DF ] }; key { [ 0x10009A8, 0x10009A3 ] }; key { [ 0x10009AE, 0x100099E ] }; key { [ comma, 0x100003C ] }; key { [ 0x100002E, 0x100003E ] }; key { [ 0x100002F, question ] }; key { [ 0x10009F1, 0x10009F0 ] }; // key { [ Control_L ] }; // key { [ space ] }; // modifier_map Shift { Shift_L }; // modifier_map Lock { Caps_Lock }; // modifier_map Control{ Control_L }; // third level with right-alt include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "guj" { name[Group1]= "Gujarati"; // Mainly numbers. key { [ U0AE7, U0A8D ] }; key { [ U0AE8, U0AC5 ] }; key { [ U0AE9 ] }; key { [ U0AEA ] }; key { [ U0AEB ] }; key { [ U0AEC ] }; key { [ U0AED ] }; key { [ U0AEE ] }; key { [ U0AEF, parenleft ] }; key { [ U0AE6, parenright ] }; key { [ minus, U0A83 ] }; key { [ U0A8B, U0AC3 ] }; // Mainly long vowels key { [ U0ACC, U0A94 ] }; key { [ U0AC8, U0A90 ] }; key { [ U0ABE, U0A86 ] }; key { [ U0AC0, U0A88 ] }; key { [ U0AC2, U0A8A ] }; // Mainly voiced consonants key { [ U0AAC, U0AAD ] }; key { [ U0AB9, U0A99 ] }; key { [ U0A97, U0A98 ] }; key { [ U0AA6, U0AA7 ] }; key { [ U0A9C, U0A9D ] }; key { [ U0AA1, U0AA2 ] }; key { [ U0ABC, U0A9E ] }; // Mainly short vowels key { [ U0ACB, U0A93 ] }; key { [ U0AC7, U0A8F ] }; key { [ U0ACD, U0A85 ] }; key { [ U0ABF, U0A87 ] }; key { [ U0AC1, U0A89 ] }; // Mainly unvoiced consonants key { [ U0AAA, U0AAB ] }; key { [ U0AB0, U0AB0 ] }; key { [ U0A95, U0A96 ] }; key { [ U0AA4, U0AA5 ] }; key { [ U0A9A, U0A9B ] }; key { [ U0A9F, U0AA0 ] }; key { [ U0AC9, U0A91 ] }; key { [ z , Z ] }; key { [ U0A82, U0A81 ] }; key { [ U0AAE, U0AA3 ] }; key { [ U0AA8, U0AA8 ] }; key { [ U0AB5, U0AB5 ] }; key { [ U0AB2, U0AB3 ] }; key { [ U0AB8, U0AB6 ] }; key { [ comma, U0AB7 ] }; key { [ period, U0964 ] }; key { [ U0AAF, question ] }; include "rupeesign(4)" include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "kan" { // Inscript layout for Kannada // Author : G Karunakar // Date : Wed Nov 13 17:22:58 IST 2002 // Kannada digits mapped in basic only name[Group1]= "Kannada"; key { [ U0cca, U0c92 ] }; key { [ U0ce7 ] }; key { [ U0ce8 ] }; key { [ U0ce9 ] }; key { [ U0cea ] }; key { [ U0ceb ] }; key { [ U0cec ] }; key { [ U0ced ] }; key { [ U0cee ] }; key { [ U0cef ] }; key { [ U0ce6 ] }; key { [ U0c83 ] }; key { [ U0cc3, U0c8b ] }; key { [ U0ccc, U0c94 ] }; key { [ U0cc8, U0c90 ] }; key { [ U0cbe, U0c86 ] }; key { [ U0cc0, U0c88 ] }; key { [ U0cc2, U0c8a ] }; key { [ U0cac, U0cad ] }; key { [ U0cb9, U0c99 ] }; key { [ U0c97, U0c98 ] }; key { [ U0ca6, U0ca7 ] }; key { [ U0c9c, U0c9d ] }; key { [ U0ca1, U0ca2 ] }; key { [ U0cbc, U0c9e ] }; key { [ U0ccb, U0c93 ] }; key { [ U0cc7, U0c8f ] }; key { [ U0ccd, U0c85 ] }; key { [ U0cbf, U0c87 ] }; key { [ U0cc1, U0c89 ] }; key { [ U0caa, U0cab ] }; key { [ U0cb0, U0cb1 ] }; key { [ U0c95, U0c96 ] }; key { [ U0ca4, U0ca5 ] }; key { [ U0c9a, U0c9b ] }; key { [ U0c9f, U0ca0 ] }; key { [ U0cc6, U0c8e ] }; key { [ U0c82 ] }; key { [ U0cae, U0ca3 ] }; key { [ U0ca8 ] }; key { [ U0cb5, U0cb4 ] }; key { [ U0cb2, U0cb3 ] }; key { [ U0cb8, U0cb6 ] }; key { [ comma , U0cb7 ] }; key { [ period ] }; key { [ U0caf, U0040 ] }; key { symbols[Group1] = [ Mode_switch, Multi_key ], virtualMods = AltGr }; include "rupeesign(4)" include "level3(ralt_switch)" }; // Description : A keymap for Malayalam // Encoding : Unicode (http://www.unicode.org) // Author : Baiju M // Date : Sat Aug 17 21:10:48 IST 2002 // Mapping: partial alphanumeric_keys xkb_symbols "mal" { name[Group1] = "Malayalam"; //From grave to backslash (\) key { [ U0d4a , U0d12 ] }; // svu: // These lines were in former "mal" variant - // but the digits are replaced with the ones from 'mal_plusnum' - // for the integrity of all Indian layouts // // key { [1 , exclam ] }; // key { [2 , at ] }; // key { [3 , numbersign ] }; // key { [4 , dollar ] }; // key { [5 , percent ] }; // key { [6 ,asciicircum ] }; // key { [7 , ampersand ] }; // key { [8 , asterisk ] }; // key { [9 , parenleft ] }; // key { [0 , parenright ] }; key { [ U0d67 , exclam ] }; key { [ U0d68 , at ] }; key { [ U0d69 , numbersign ] }; key { [ U0d6a , dollar ] }; key { [ U0d6b , percent ] }; key { [ U0d6c , asciicircum ] }; key { [ U0d6d , ampersand ] }; key { [ U0d6e , asterisk ] }; key { [ U0d6f , parenleft ] }; key { [ U0d66 , parenright ] }; key { [ minus , U0d03 ] }; key { [ U0d43 , U0d0b ] }; key { [U0200c, U05C ]};//bksl: ZWNJ // From 'q' to right bracket (]) key { [ U0d4c , U0d14 ] }; key { [ U0d48 , U0d10 ] }; key { [ U0d3e , U0d06 ] }; key { [ U0d40 , U0d08 ] }; key { [ U0d42 , U0d0a ] }; key { [ U0d2c , U0d2d ] }; key { [ U0d39 , U0d19 ] }; key { [ U0d17 , U0d18 ] }; key { [ U0d26 , U0d27 ] }; key { [ U0d1c , U0d1d ] }; key { [ U0d21 , U0d22 ] }; key { [ U0200d , U0d1e ] }; // From 'a' to apostrophe (') key { [ U0d4b , U0d13 ] }; key { [ U0d47 , U0d0f ] }; key { [ U0d4d , U0d05 ] }; key { [ U0d3f , U0d07 ] }; key { [ U0d41 , U0d09 ] }; key { [ U0d2a , U0d2b ] }; key { [ U0d30 , U0d31 ] }; key { [ U0d15 , U0d16 ] }; key { [ U0d24 , U0d25 ] }; key { [ U0d1a , U0d1b ] }; key { [ U0d1f , U0d20 ] }; // From 'z' to slash (/) key { [ U0d46 , U0d0e ] }; key { [ U0d02 , U200b ] };//X:ZWSP key { [ U0d2e , U0d23 ] }; key { [ U0d28 ] }; key { [ U0d35 , U0d34 ] }; key { [ U0d32 , U0d33 ] }; key { [ U0d38 , U0d36 ] }; key { [ comma , U0d37 ] }; key { [ period , U0200d ] }; key { [ U0d2f , question ] }; include "rupeesign(4)" include "level3(ralt_switch)" }; //Name : Lalitha //Description : A transliteration keyboard layout for Malayalam //Original Author : Noah Levitt //Current Main : Jinesh K.J, Swathantra Malayalam Computing (SMC) partial alphanumeric_keys xkb_symbols "mal_lalitha" { name[Group1] = "Malayalam (Lalitha)"; key.type="FOUR_LEVEL"; // Roman digits key { [ U0D4D, U0D02, apostrophe, asciitilde ] }; // apostrophe: virama(chandrakala),anusvara key { [ 1, exclam, U0D67, exclam ] }; key { [ 2, at, U0D68, at ] }; key { [ 3, numbersign, U0D69, numbersign ] }; key { [ 4, dollar, U0D6A ] }; key { [ 5, percent, U0D6B, percent ] }; key { [ 6, asciicircum, U0D6C, asciicircum ] }; key { [ 7, ampersand, U0D6D, ampersand ] }; key { [ 8, asterisk, U0D6E, asterisk ] }; key { [ 9, parenleft, U0D6F, parenleft ] }; key { [ 0, parenright, U0D66, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ U005C, U007C, U200C ] };//backslash:pipe,backslash,ZWNJ //Q Row key { [ U0D48, U0D4C, U0D10, U0D14 ] }; // Q: ai and au matras key { [ U0D35 ] }; // W: wa, OM key { [ U0D46, U0D47, U0D0E, U0D0F ] }; // E: e,ee matras key { [ U0D30, U0D31, U0D43, U0D0B ] }; // R: ra,rra, vocalic Ri key { [ U0D24, U0D25, U0D1F, U0D20 ] }; // T: tha, ttha,ta,tta key { [ U0D2f ] }; // Y: ya key { [ U0D41, U0D42, U0D09, U0D0A ] }; // U: u, uu matras key { [ U0D3F, U0D40, U0D07, U0D08 ] }; // I: i, ii matras key { [ U0D4A, U0D4B, U0D12, U0D13 ] }; // O: o, oo matras key { [ U0D2A ] }; // P: pa key { [ bracketleft, braceleft ] };//braceleft: key { [ bracketright, braceright ] };//braceright: //A Row key { [ U0D3E, U0D05, U0D06, U0D05 ] }; // A: a,aa key { [ U0D38, U0D37 ] }; // S: sa, ssa key { [ U0D26, U0D27, U0D21, U0D22 ] }; // D: soft da,soft dda,hard da,hard dda, key { [ U0D2B ] }; // F: pha key { [ U0D17, U0D18 ] }; // G: ga, gha key { [ U0D39, U0D03 ] }; // H: ha, visarg key { [ U0D1C, U0D1D ] }; // J: ja, jha key { [ U0D15, U0D16 ] }; // K: ka, kha key { [ U0D32, U0D33 ] }; // L: la, vocalic L or lru matra` key { [ semicolon, colon ] }; key { [apostrophe, quotedbl ] }; //Z Row key { [ U0D34, U0D36 ] }; // Z: sha,zha key { [ U0D4D, U200B ] }; // X: chandrakala,ZWSP key { [ U0D1A, U0D1B ] }; // C: ca, cha key { [ U0D35, U200D ] }; // V: va,ZWJ key { [ U0D2C, U0D2D ] }; // B: ba, bha key { [ U0D28, U0D23, U0D19, U0D1E ] }; // N: na, hard na,nga,nha key { [ U0D2E, U0D02 ] }; // M: ma key { [ comma, U003C ] };// comma: comma key { [ period, U003E ] }; // period: period key { [ slash, question ] }; // modifier_map Shift { Shift_L }; // modifier_map Lock { Caps_Lock }; // modifier_map Control{ Control_L }; // modifier_map Mod3 { Mode_switch }; include "level3(ralt_switch)" include "rupeesign(4)" }; partial alphanumeric_keys xkb_symbols "olck" { // Layout for the Ol Chiki script. // http://www.unicode.org/L2/L2005/05243r-n2984-ol-chiki.pdf (figure 9) name[Group1]= "Ol Chiki"; key { [ grave, U1C7B ] }; key { [ U1C51, exclam ] }; key { [ U1C52, at ] }; key { [ U1C53, numbersign ] }; key { [ U1C54, dollar, U20B9 ] }; key { [ U1C55, percent ] }; key { [ U1C56, asciicircum ] }; key { [ U1C57, ampersand ] }; key { [ U1C58, asterisk ] }; key { [ U1C59, parenleft ] }; key { [ U1C50, parenright ] }; key { [ minus, U1C7C ] }; key { [ equal, plus ] }; key { [ U1C67 ] }; key { [ U1C63 ] }; key { [ U1C6E ] }; key { [ U1C68 ] }; key { [ U1C74, U1C5B ] }; key { [ U1C6D ] }; key { [ U1C69 ] }; key { [ U1C64 ] }; key { [ U1C5A, U1C73 ] }; key { [ U1C6F ] }; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; key { [ U1C7F, U1C7E ] }; key { [ U1C5F ] }; key { [ U1C65 ] }; key { [ U1C70, U1C6B ] }; key { [ U1C5D ] }; key { [ U1C5C ] }; key { [ U1C66, U1C77 ] }; key { [ U1C61 ] }; key { [ U1C60 ] }; key { [ U1C5E ] }; key { [ semicolon, U1C7A ] }; key { [ apostrophe, quotedbl ] }; key { [ U1C72 ] }; key { [ U1C7D ] }; key { [ U1C6A ] }; key { [ U1C76 ] }; key { [ U1C75 ] }; key { [ U1C71, U1C78 ] }; key { [ U1C62, U1C6C ] }; key { [ comma, less ] }; key { [ U1C79, greater ] }; key { [ slash, question ] }; key { symbols[Group1] = [ Mode_switch, Multi_key ], virtualMods = AltGr }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "ori" { // Inscript layout for Oriya // Author: G Karunakar // Date: Wed Nov 13 18:16:19 IST 2002 name[Group1]= "Oriya"; key { [ U0b67 ] }; key { [ U0b68 ] }; key { [ U0b69 ] }; key { [ U0b6a ] }; key { [ U0b6b ] }; key { [ U0b6c ] }; key { [ U0b6d ] }; key { [ U0b6e ] }; key { [ U0b6f ] }; key { [ U0b66 ] }; key { [ U0b03 ] }; key { [ U0b43, U0b0b ] }; key { [ U0b4c, U0b14 ] }; key { [ U0b48, U0b10 ] }; key { [ U0b3e, U0b06 ] }; key { [ U0b40, U0b08 ] }; key { [ U0b42, U0b0a ] }; key { [ U0b2c, U0b2d ] }; key { [ U0b39, U0b19 ] }; key { [ U0b17, U0b18 ] }; key { [ U0b26, U0b27 ] }; key { [ U0b1c, U0b1d ] }; key { [ U0b21, U0b22 ] }; key { [ U0b3c, U0b1e ] }; key { [ U0b4b, U0b13 ] }; key { [ U0b47, U0b0f ] }; key { [ U0b4d, U0b05 ] }; key { [ U0b3f, U0b07 ] }; key { [ U0b41, U0b09 ] }; key { [ U0b2a, U0b2b ] }; key { [ U0b30 ] }; key { [ U0b15, U0b16 ] }; key { [ U0b24, U0b25 ] }; key { [ U0b1a, U0b1b ] }; key { [ U0b1f, U0b20 ] }; key { [ U0b02, U0b01 ] }; key { [ U0b2e, U0b23 ] }; key { [ U0b28 ] }; key { [ U0b35 ] }; key { [ U0b32, U0b33 ] }; key { [ U0b38, U0b36 ] }; key { [ comma , U0b37 ] }; key { [ period ] }; key { [ U0b2f, U0040 ] }; key { symbols[Group1] = [ Mode_switch, Multi_key ], virtualMods = AltGr }; include "rupeesign(4)" include "level3(ralt_switch)" }; // based on a keyboard map from an 'xkb/symbols/tml' file // INSCRIPT partial alphanumeric_keys xkb_symbols "tam" { name[Group1]= "Tamil"; key { [ U0BCA, U0B92 ] }; // Mainly numbers. key { [ U0BE7 ] }; key { [ U0BE8 ] }; key { [ U0BE9 ] }; key { [ U0BEA ] }; key { [ U0BEB ] }; key { [ U0BEC ] }; key { [ U0BED ] }; key { [ U0BEE ] }; key { [ U0BEF, parenleft ] }; key { [ U0BF0, parenright ] }; key { [ U0BF1, U0B83 ] }; key { [ U0BF2, plus ] }; // Mainly long vowels key { [ U0BCC, U0B94 ] }; key { [ U0BC8, U0B90 ] }; key { [ U0BBE, U0B86 ] }; key { [ U0BC0, U0B88 ] }; key { [ U0BC2, U0B8A ] }; // Mainly voiced consonants key { [ U0BB9, U0B99 ] }; key { [ U0B9c ] }; key { [ U0B9E ] }; // Mainly short vowels key { [ U0BCB, U0B93 ] }; key { [ U0BC7, U0B8F ] }; key { [ U0BCD, U0B85 ] }; key { [ U0BBF, U0B87 ] }; key { [ U0BC1, U0B89 ] }; // Mainly unvoiced consonants key { [ U0BAA ] }; key { [ U0BB0, U0BB1 ] }; key { [ U0B95 ] }; key { [ U0BA4 ] }; key { [ U0B9A ] }; key { [ U0B9F ] }; key { [ U005C, U007C ] };//backslash-bar - Changed to Unicode key { [ U0BC6, U0B8E ] }; key { [ U0B82 ] }; key { [ U0BAE, U0BA3 ] }; key { [ U0BA8, U0BA9 ] }; key { [ U0BB5, U0BB4 ] }; key { [ U0BB2, U0BB3 ] }; key { [ U0BB8, U0BB6 ] }; key { [ comma, U0BB7 ] }; key { [ period, U0964 ] }; key { [ U0BAF, question ] }; include "level3(ralt_switch)" include "rupeesign(4)" }; partial alphanumeric_keys xkb_symbols "tam_unicode" { // Description: A keymap based on the TamilNet'99 typewriter keyboard // Encoding: Unicode (http://www.unicode.org) // Author: Thuraiappah Vaseeharan // Modifed by: Malathi S // Secondary contact: Sri Ramadoss M // Date : Fri Sep 4 11:32:00 CST 2009 // Mapping: name[Group1]= "Tamil (Unicode)"; // granthas key { [ apostrophe, asciitilde ] }; key { [ U0031, exclam ] } ; key { [ U0032, at ] } ; key { [ U0033, numbersign ] } ; key { [ U0034, U0BF9 ] } ; key { [ U0035, percent ] } ; key { [ U0036, asciicircum ] } ; key { [ U0037, ampersand ] } ; key { [ U0038, asterisk ] } ; key { [ U0039, parenleft ] } ; key { [ U0030, parenright ] } ; key { [ minus, underscore ] }; key { [ equal, plus ] }; // Qrow key { [ U0B9E, U0BB6 ] }; key { [ U0BB1, U0BB7 ] }; key { [ U0BA8, U0BB8 ] }; key { [ U0B9A, U0BB9 ] }; key { [ U0BB5, U0B9C ] }; key { [ U0BB2 ] }; key { [ U0BB0 ] }; key { [ U0BC8, U0B90 ] }; key { [ U0BCA, U0BCB ] }; key { [ U0BBF, U0BC0 ] }; key { [ U0BC1, U0BC2 ] }; // Arow key { [ U0BAF ] }; key { [ U0BB3 ] }; key { [ U0BA9 ] }; key { [ U0B95 ] }; key { [ U0BAA ] }; key { [ U0BBE, U0BB4 ] }; key { [ U0BA4 ] }; key { [ U0BAE ] }; key { [ U0B9F ] }; key { [ U0BCD, U0B83 ] }; key { [ U0B99 ] }; // Zrow key { [ U0BA3 ] }; key { [ U0B92, U0B93 ] }; key { [ U0B89, U0B8A ] }; key { [ U0B8E, U0B8F ] }; key { [ U0BC6, U0BC7 ] }; key { [ U0B94, U0BCC ] }; key { [ U0B85, U0B86 ] }; key { [ U0B87, U0B88 ] }; }; partial alphanumeric_keys xkb_symbols "tam_keyboard_with_numerals" { // Description: A keymap based on the TamilNet'99 typewriter keyboard // Encoding: Unicode (http://www.unicode.org) // Author: Malathi S // Secondary contact: Sri Ramadoss M // Date : Fri Sep 4 11:33:00 CST 2009 // Mapping: name[Group1]= "Tamil (keyboard with numerals)"; // Mainly numbers. key { [ apostrophe, asciitilde ] }; key { [ U0BE7, exclam ] }; key { [ U0BE8, at ] }; key { [ U0BE9, numbersign ] }; key { [ U0BEA, U0BF9 ] }; key { [ U0BEB, percent ] }; key { [ U0BEC, asciicircum ] }; key { [ U0BED, ampersand ] }; key { [ U0BEE, asterisk ] }; key { [ U0BEF, parenleft ] }; key { [ U0BE6, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; // Qrow key { [ U0B9E, U0BB6 ] }; key { [ U0BB1, U0BB7 ] }; key { [ U0BA8, U0BB8 ] }; key { [ U0B9a, U0BB9 ] }; key { [ U0BB5, U0B9c ] }; key { [ U0BB2 ] }; key { [ U0BB0 ] }; key { [ U0BC8, U0B90 ] }; key { [ U0BCA, U0BCB ] }; key { [ U0BBF, U0BC0 ] }; key { [ U0BC1, U0BC2 ] }; // Arow key { [ U0BAF ] }; key { [ U0BB3 ] }; key { [ U0BA9 ] }; key { [ U0B95 ] }; key { [ U0BAA ] }; key { [ U0BBE, U0BB4 ] }; key { [ U0BA4 ] }; key { [ U0BAE ] }; key { [ U0B9F ] }; key { [ U0BCD, U0B83 ] }; key { [ U0B99 ] }; // Zrow key { [ U0BA3 ] }; key { [ U0B92, U0B93 ] }; key { [ U0B89, U0B8A ] }; key { [ U0B8E, U0B8F ] }; key { [ U0BC6, U0BC7 ] }; key { [ U0B94, U0BCC ] }; key { [ U0B85, U0B86 ] }; key { [ U0B87, U0B88 ] }; }; partial alphanumeric_keys xkb_symbols "tam_TSCII" { // Description : A Tamil typewrite-style keymap // loosely based on TamilNet'99 reommendations // Encoding : TSCII (http://www.tscii.org) // Author : Thuraiappah Vaseeharan // Last Modified: Sat Jan 5 17:11:26 CST 2002 name[Group1]= "Tamil (TSCII typewriter)"; key { [ 0x10000b7, 0x10000a4 ] }; // aytham key { [ 0x1000082, 0x10000a5 ] }; // shri key { [ 0x1000083, 0x1000088 ] }; // ja key { [ 0x1000084, 0x1000089 ] }; // sha key { [ 0x1000085, 0x100008a ] }; // sa key { [ 0x1000086, 0x100008b ] }; // ha key { [ 0x1000087, 0x100008c ] }; // ksha // Qrow key { [ 0x10000bb, 0x100009a ] }; // nja key { [ 0x10000c8, 0x10000da ] }; // Ra key { [ 0x10000bf, 0x10000d1 ] }; // NNa key { [ 0x10000ba, 0x10000cd ] }; // ca key { [ 0x10000c5, 0x10000d7 ] }; // va key { [ 0x10000c4, 0x10000d6 ] }; // la key { [ 0x10000c3, 0x10000d5 ] }; // ra key { [ 0x10000a8, 0x10000b3 ] }; // sangili, ai key { [ 0x10000ca, 0x10000cb ] }; // di, dI key { [ 0x10000a2, 0x10000a3 ] }; // visiri key { [ dead_acute, 0x10000a3 ] }; // Ukaaram // Arow key { [ 0x10000c2, 0x10000d4 ] }; // ya key { [ 0x10000c7, 0x10000d9 ] }; // La key { [ 0x10000c9, 0x10000db ] }; // na key { [ 0x10000b8, 0x10000cc ] }; // ka key { [ 0x10000c0, 0x10000d2 ] }; // pa key { [ dead_grave,0x10000a1 ] }; // pulli,aravu key { [ 0x10000be, 0x10000d0 ] }; // tha key { [ 0x10000c1, 0x10000d3 ] }; // ma key { [ 0x10000bc, 0x10000ce ] }; // da key { [ 0x10000c6, 0x10000d8 ] }; // zha key { [ 0x10000b9, 0x1000099 ] }; // nga // Zrow key { [ 0x10000bd, 0x10000cf ] }; // Na key { [ 0x10000b4, 0x10000b5 ] }; // o, O key { [ 0x10000af, 0x10000b0 ] }; // u, U key { [ 0x10000b1, 0x10000b2 ] }; // e, E key { [ 0x10000a6, 0x10000a7 ] }; // kombus key { [ 0x10000b6, 0x10000aa ] }; // au key { [ 0x10000ab, 0x10000ac ] }; // a, A key { [ 0x10000fe, 0x10000ae ] }; // i, I }; partial alphanumeric_keys xkb_symbols "tam_TAB" { // Description: A keymap based on the TamilNet'99 typewriter keyboard // Encoding: TAB (http://www.tamilnet99.org) // Author: Thuraiappah Vaseeharan // Date : Sun Aug 12 02:23:00 CDT 2001 name[Group1]= "Tamil (TAB typewriter)"; // numeral row key { [ 0x10000e7, 0x10000a7 ] } ; key { [ 0x10000fa, 0x10000a8 ] } ; key { [ 0x10000fb ] } ; key { [ 0x10000fc ] } ; key { [ 0x10000fd ] } ; key { [ 0x10000fe ] } ; key { [ 0x10000ff ] } ; // q-row key { [ 0x10000eb, 0x10000b3 ] }; key { [ 0x10000f8, 0x10000c1 ] }; key { [ 0x10000ef, 0x10000b8 ] }; key { [ 0x10000ea, 0x10000b2 ] }; key { [ 0x10000f5, 0x10000be ] }; key { [ 0x10000f4, 0x10000bd ] }; key { [ 0x10000f3, 0x10000bc ] }; key { [ 0x10000ac, 0x10000e4 ] }; key { [ 0x10000ae, 0x10000af ] }; key { [ 0x10000a4, 0x10000a6 ] }; key { [ dead_circumflex, 0x10000a6 ] }; // Ukaaram // a-row key { [ 0x10000f2, 0x10000bb ] }; key { [ 0x10000f7, 0x10000c0 ] }; key { [ 0x10000f9, 0x10000c2 ] }; key { [ 0x10000e8, 0x10000b0 ] }; key { [ 0x10000f0, 0x10000b9 ] }; key { [ 0x10000a2, 0x10000a3 ] }; key { [ 0x10000ee, 0x10000b6 ] }; key { [ 0x10000f1, 0x10000ba ] }; key { [ 0x10000ec, 0x10000b4 ] }; key { [ 0x10000f6, 0x10000bf ] }; key { [ 0x10000e9, 0x10000b1 ] }; // z-row key { [ 0x10000ed, 0x10000b5 ] }; key { [ 0x10000e5, 0x10000e6 ] }; key { [ 0x10000e0, 0x10000e1 ] }; key { [ 0x10000e2, 0x10000e3 ] }; key { [ 0x10000aa, 0x10000ab ] }; key { [ 0x10000ac, 0x10000a3 ] }; key { [ 0x10000dc, 0x10000dd ] }; key { [ 0x10000de, 0x10000df ] }; }; partial alphanumeric_keys xkb_symbols "tel" { // Inscript layout for Telugu using Unicode // Author: G Karunakar // Date: // See layout at http://www.indlinux.org/keymap/telugu.php name[Group1]= "Telugu"; key { [ U0c4a, U0c12 ] }; key { [ U0c67 ] }; key { [ U0c68 ] }; key { [ U0c69, numbersign ] }; key { [ U0c6a, dollar ] }; key { [ U0c6b, percent ] }; key { [ U0c6c, asciicircum ] }; key { [ U0c6d, ampersand ] }; key { [ U0c6e, asterisk ] }; key { [ U0c6f, parenleft ] }; key { [ U0c66, parenright ] }; key { [ U0c03, underscore ] }; key { [ U0c43, U0c0b ] }; key { [ BackSpace ] }; key { [ U0c4c, U0c14 ] }; key { [ U0c48, U0c10 ] }; key { [ U0c3e, U0c06 ] }; key { [ U0c40, U0c08 ] }; key { [ U0c42, U0c0a ] }; key { [ U0c2c, U0c2d ] }; key { [ U0c39, U0c19 ] }; key { [ U0c17, U0c18 ] }; key { [ U0c26, U0c27 ] }; key { [ U0c1c, U0c1d ] }; key { [ U0c21, U0c22 ] }; key { [ U0c1e ] }; key { [ U0c4b, U0c13 ] }; key { [ U0c47, U0c0f ] }; key { [ U0c4d, U0c05 ] }; key { [ U0c3f, U0c07 ] }; key { [ U0c41, U0c09 ] }; key { [ U0c2a, U0c2b ] }; key { [ U0c30, U0c31 ] }; key { [ U0c15, U0c16 ] }; key { [ U0c24, U0c25 ] }; key { [ U0c1a, U0c1b ] }; key { [ U0c1f, U0c20 ] }; key { [ U0c46, U0c0e ] }; key { [ U0c02, U0c01 ] }; key { [ U0c2e, U0c23 ] }; key { [ U0c28 ] }; key { [ U0c35 ] }; key { [ U0c32, U0c33 ] }; key { [ U0c38, U0c36 ] }; key { [ comma , U0c37 ] }; key { [ period ] }; key { [ U0c2f, U0040 ] }; key { symbols[Group1] = [ Mode_switch, Multi_key ], virtualMods = AltGr }; include "rupeesign(4)" include "level3(ralt_switch)" }; //Name : Sarala //Description : This is an adaptation of the Sarala keyboard (http://www.medhajananam.org/sarala/) developed // by Krishna Dhullipalla. Because of the way keyboard shortcuts are laid out in KDE, the keyboard // modifiers had to be changed. The layout does not take any part of the original Sarala keyboard // code however. It has been developed from scratch, so the experience may differ. // // There is a ibus-m17n version of Sarala layout developed by Satya Pothamsetti on // http://www.medhajananam.org/. //Standard : Supports Unicode 9.0. //Help : This layout differs slightly from the layout on Medhajenanam. The layout has been depicted in the // pdf file attached to this post on Sarala google group. // (https://groups.google.com/forum/#!topic/sarala-keyboard/-gsa90dUFcs). // //Layout Developed by : Krishna Dhullipalla (http://www.medhajananam.org/) //Author : Venkat R Akkineni //Date : Apr 28 2017 partial alphanumeric_keys xkb_symbols "tel-sarala" { name[Group1] = "Telugu (Sarala)"; key.type="FOUR_LEVEL"; // sequence base, shift, alt, alt + shift key { [ U0C4A, U0C12 ] }; // ొ ఒ key { [ U0C42, U0C0A ] }; // ూ ఊ key { [ U0C21, U0C22 ] }; // డ ఢ key { [ U0C35, U0C39 ] }; // వ హ key { [ U0C2C, U0C2D ] }; // బ భ key { [ U0C28, U0C23 ] }; // న ణ key { [ U0C2E, U0C01 ] }; // మ ఁ key { [ U002C, U0C1E, leftcaret ] }; // , ఞ < key { [ U002E, U0C19, rightcaret ] }; // . ఙ > key { [ U0C36, question, KP_Divide ] }; // శ ? / key { [ U0C2F, U0C3D ] }; // య ఽ key { [ U0C02, U0C03 ] }; // ం ః key { [ U0C26, U0C27 ] }; // ద ధ key { [ U0C4D, U0C05 ] }; // ్ అ key { [ U0C17, U0C18 ] }; // గ ఘ key { [ U0C1A, U0C1B, U0C58, U0C59 ] }; // చ ఛ ౘ ౙ key { [ U0C3E, U0C06 ] }; // ా ఆ key { [ U0C15, U0C16, U0C62, U0C63 ] }; // క ఖ ౢ ౣ key { [ U0C32, U0C33, U0C0C, U0C61 ] }; // ల ళ ఌ ౡ key { [ U0C1F, U0C20, semicolon, colon ] }; // ట ఠ ; : key { [ quoteright, quotedbl ] }; // ' " key { [ U0C46, U0C0E, U0C44, U0C34 ] }; // ె ఎ ౄ ఴ key { [ U0C38, U0C37, U0C44 ] }; // స ష ౄ key { [ U0C47, U0C0F, U0C44 ] }; // ే ఏ ౄ key { [ U0C30, U0C31, U0C44, U0C60 ] }; // ర ఱ ౄ ౠ key { [ U0C24, U0C25 ] }; // త థ key { [ U0C40, U0C08 ] }; // ీ ఈ key { [ U0C41, U0C09 ] }; // ు ఉ key { [ U0C3F, U0C07 ] }; // ి ఇ key { [ U0C4B, U0C13 ] }; // ో ఓ key { [ U0C2A, U0C2B ] }; // ప ఫ key { [ U0C1C, U0C1D, bracketleft, braceleft ] }; // జ ఝ [ { key { [ U0C48, U0C10, bracketright, braceright ] }; // ై ఐ ] } key { [ KP_1, exclam, U0C67, U0C78 ] }; // 1 ! ౦ ౸ key { [ KP_2, at, U0C68, U0C79 ] }; // 2 @ ౨ ౹ key { [ KP_3, numbersign, U0C69, U0C7A ] }; // 3 # ౩ ౺ key { [ KP_4, dollar, U0C6A, U0C7B ] }; // 4 $ ౪ ౻ key { [ KP_5, percent, U0C6B, U0C7C ] }; // 5 % ౫ ౼ key { [ KP_6, asciicircum, U0C6C, U0C7D ] }; // 6 ^ ౬ ౽ key { [ KP_7, ampersand, U0C6D, U0C7E ] }; // 7 & ౭ ౾ key { [ KP_8, KP_Multiply, U0C6E, U0C7F ] }; // 8 * ౮ ౿ key { [ KP_9, U0028, U0C6F, U20B9 ] }; // 9 ( ౯ ₹ key { [ KP_0, U0029, U0C66, U0C55 ] }; // 0 ) ౦ ౕ key { [ KP_Subtract, underbar, NoSymbol, U0C56 ] }; // - _ ౖ key { [ KP_Equal, KP_Add ] }; // = + key { [ U0C4C, U0C14, U0964, U0965 ] }; // ౌ ఔ । ॥ key { [ U0C43, U0C0B, quoteleft, asciitilde ] }; // ృ ఋ ` ~ include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "urd-phonetic" { include "pk(urd-phonetic)" name[Group1]= "Urdu (phonetic)"; }; partial alphanumeric_keys xkb_symbols "urd-phonetic3" { include "pk(urd-crulp)" name[Group1]= "Urdu (alt. phonetic)"; }; partial alphanumeric_keys xkb_symbols "urd-winkeys" { include "pk(urd-nla)" name[Group1]= "Urdu (Win keys)"; }; // based on a keyboard map from an 'xkb/symbols/gur' file partial alphanumeric_keys xkb_symbols "guru" { name[Group1]= "Punjabi (Gurmukhi)"; // Mainly numbers. key { [ U0A67 ] }; key { [ U0A68 ] }; key { [ U0A69, U0A71 ] }; key { [ U0A6A, U0A74 ] }; key { [ U0A6B, U262C ] }; key { [ U0A6C ] }; key { [ U0A6D ] }; key { [ U0A6e ] }; key { [ U0A6F, parenleft ] }; key { [ U0A66, parenright ] }; key { [ U0A03 ] }; key { [ equal, plus ] }; // Mainly long vowels key { [ U0A4C, U0A14 ] }; key { [ U0A48, U0A10 ] }; key { [ U0A3E, U0A06 ] }; key { [ U0A40, U0A08 ] }; key { [ U0A42, U0A0A ] }; // Mainly voiced consonants key { [ U0A2C, U0A2D ] }; key { [ U0A39, U0A19 ] }; key { [ U0A17, U0A18 ] }; key { [ U0A26, U0A27 ] }; key { [ U0A1C, U0A1D ] }; key { [ U0A21, U0A22 ] }; key { [ U0A3C, U0A1E ] }; // Mainly short vowels key { [ U0A4B, U0A13 ] }; key { [ U0A47, U0A0F ] }; key { [ U0A4D, U0A05 ] }; key { [ U0A3F, U0A07 ] }; key { [ U0A41, U0A09 ] }; // Mainly unvoiced consonants key { [ U0A2A, U0A2B ] }; key { [ U0A30, U0A5C ] }; key { [ U0A15, U0A16 ] }; key { [ U0A24, U0A25 ] }; key { [ U0A1A, U0A1B ] }; key { [ U0A1F, U0A20 ] }; key { [ U005C, U007C ] }; key { [ z, U0A01 ] }; key { [ U0A02, U0A70, U0A71 ] }; key { [ U0A2E, U0A23 ] }; key { [ U0A28, U0A28 ] }; key { [ U0A35, U0A35 ] }; key { [ U0A32, U0A33 ] }; key { [ U0A38, U0A36 ] }; key { [ comma, less ] }; key { [ period, U0964 ] }; key { [ U0A2F, question ] }; include "rupeesign(4)" include "level3(ralt_switch)" }; //Name : Jhelum (Refind Inscript) //Description : A Jhelum keyboard layout for Gurmukhi (Punjabi) // http://www.satluj.org/Jhelum.html //Modified for Inscript to make //Original Author : Amanpreet Singh Alam { [ apostrophe, asciitilde, U0A02,U0A01 ] }; // apostrophe: anusvara, candrabindu key { [ 1,exclam, U0A67, exclam ] }; key { [ 2,at, U0A68, at ] }; key { [ 3,numbersign, U0A69, numbersign ] }; key { [ 4,dollar, U0A6A ] }; key { [ 5,percent,U0A6B, percent ] }; key { [ 6,U0A73, U0A6C,asciicircum ] }; key { [ 7,U0A72,U0A6D,ampersand ] }; key { [ 8,asterisk,U0A6E, asterisk ] }; key { [ 9,parenleft,U0A6F,parenleft ] }; key { [ 0,parenright,U0A66,parenright ] }; key { [ minus,underscore] }; key { [ equal,plus] }; key { [ U0964,U0965,U007C,U005C] }; //pipe : danda, double danda //Q Row key { [ U0A4C, U0A14 ] }; // Q: oo, ooh key { [ U0A48, U0A10 ] }; // W: ee, ae key { [ U0A3E, U0A06 ] }; // E: a, aa key { [ U0A40, U0A08, U20B9 ] }; // R: ee, ai, rupeesign key { [ U0A42, U0A0A ] }; // T: u, uu key { [ U0A30, U0A5C ] }; // Y: ra, raa key { [ U0A26, U0A27 ] }; // U: tha, thha key { [ U0A17, U0A18, U0A5A ] }; // I:ga, gha key { [ U0A24, U0A1F ] }; // O: ta, tha key { [ U0A2A, U0A5E, VoidSymbol,U0A5E ] }; // P: pa, pha key { [ U0A21, U0A22, bracketleft, braceleft ] }; key { [ U0A19, U0A1E, bracketright, braceright ] }; //A Row key { [ U0A4B, U0A13 ] }; // A: o, oo key { [ U0A47, U0A0F ] }; // S: e, ee key { [ U0A4D, U0A05 ] }; // D: halant, aa key { [ U0A3F, U0A07 ] }; // F: i, aa key { [ U0A41, U0A09 ] }; // G: u, uh key { [ U0A39, U0A20 ] }; // H: ha, thha key { [ U0A1C, U0A1D, U0A5B ] }; // J: ja, jha key { [ U0A15, U0A16,VoidSymbol ,U0A59 ] }; // K: ka, kha key { [ U0A32, U0A25, U0A33 ] }; // L: la, tha key { [ U0A38, colon, U0A36 ] }; //; sa key { [apostrophe, quotedbl ] }; //Z Row key { [ U0A71, U0A3C ] }; // Z: addak, par bindi key { [ U0A02, U0A70 ] }; // X: bindi, tippi key { [ U0A1A, U0A1B ] }; // C: ca, cha key { [ U0A35, U0A2F ] }; // V: va, ya key { [ U0A2C, U0A2D ] }; // B: ba, bha key { [ U0A28, U0A23 ] }; // N: na, nha key { [ U0A2E, U0A2E ] }; // M: ma key { [ comma, U262C ] };// comma: comma, dev abbreviation sign key { [ period, U0A74 ] }; // period: period, nukta key { [ slash, question ] }; // modifier_map Shift { Shift_L }; // modifier_map Lock { Caps_Lock }; // modifier_map Control{ Control_L }; // modifier_map Mod3 { Mode_switch }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "olpc" { // Contact: Walter Bender include "in(deva)" key { [ U094A, U0912 ] }; // DEVANAGARI VOWEL SIGN SHORT O; DEVANAGARI LETTER SHORT O key { [ U0967, U090D ] }; // DEVANAGARI DIGIT ONE; DEVANAGARI LETTER CANDRA E key { [ U0968, U0945 ] }; // DEVANAGARI DIGIT TWO; DEVANAGARI VOWEL SIGN CANDRA E key { [ U0969 ] }; // DEVANAGARI DIGIT THREE; key { [ U096A ] }; // DEVANAGARI DIGIT FOUR; key { [ U096B ] }; // DEVANAGARI DIGIT FIVE; key { [ U096C ] }; // DEVANAGARI DIGIT SIX; key { [ U096D ] }; // DEVANAGARI DIGIT SEVEN; key { [ U096E ] }; // DEVANAGARI DIGIT EIGHT; key { [ U096F, parenleft ] }; // DEVANAGARI DIGIT NINE; key { [ U0966, parenright ] }; // DEVANAGARI DIGIT ZERO; key { [ minus, U0903 ] }; // DEVANAGARI SIGN VISARGA; key { [ U0943, U090B ] }; // DEVANAGARI VOWEL SIGN VOCALIC R; DEVANAGARI LETTER VOCALIC R key { [ U094C, U0914 ] }; // DEVANAGARI VOWEL SIGN AU; DEVANAGARI LETTER AU key { [ U0948, U0910 ] }; // DEVANAGARI VOWEL SIGN AI; DEVANAGARI LETTER AI key { [ U093E, U0906 ] }; // DEVANAGARI VOWEL SIGN AA; DEVANAGARI LETTER AA key { [ U0940, U0908 ] }; // DEVANAGARI VOWEL SIGN II; DEVANAGARI LETTER II key { [ U0942, U090A ] }; // DEVANAGARI VOWEL SIGN UU; DEVANAGARI LETTER UU key { [ U092C, U092D ] }; // DEVANAGARI LETTER BA; DEVANAGARI LETTER BHA key { [ U0939, U0919 ] }; // DEVANAGARI LETTER HA; DEVANAGARI LETTER NGA key { [ U0917, U0918 ] }; // DEVANAGARI LETTER GA; DEVANAGARI LETTER GHA key { [ U0926, U0927 ] }; // DEVANAGARI LETTER DA; DEVANAGARI LETTER DHA key { [ U091C, U091D ] }; // DEVANAGARI LETTER JA; DEVANAGARI LETTER JHA key { [ U0921, U0922 ] }; // DEVANAGARI LETTER DDA; DEVANAGARI LETTER DDHA key { [ U093C, U091E ] }; // DEVANAGARI SIGN NUKTA; DEVANAGARI LETTER NYA key { [ U0949, U0911 ] }; // DEVANAGARI VOWEL SIGN CANDRA O; DEVANAGARI LETTER CANDRA O key { [ U094B, U0913 ] }; // DEVANAGARI VOWEL SIGN O; DEVANAGARI LETTER O key { [ U0947, U090F ] }; // DEVANAGARI VOWEL SIGN E; DEVANAGARI LETTER E key { [ U094D, U0905 ] }; // DEVANAGARI SIGN VIRAMA; DEVANAGARI LETTER A key { [ U093F, U0907 ] }; // DEVANAGARI VOWEL SIGN I; DEVANAGARI LETTER I key { [ U0941, U0909 ] }; // DEVANAGARI VOWEL SIGN U; DEVANAGARI LETTER U key { [ U092A, U092B ] }; // DEVANAGARI LETTER PA; DEVANAGARI LETTER PHA key { [ U0930, U0931 ] }; // DEVANAGARI LETTER RA; DEVANAGARI LETTER RRA key { [ U0915, U0916 ] }; // DEVANAGARI LETTER KA; DEVANAGARI LETTER KHA key { [ U0924, U0925 ] }; // DEVANAGARI LETTER TA; DEVANAGARI LETTER THA key { [ U091A, U091B ] }; // DEVANAGARI LETTER CA; DEVANAGARI LETTER CHA key { [ U091F, U0920 ] }; // DEVANAGARI LETTER TTA; DEVANAGARI LETTER TTHA key { [ U0946, U090E ] }; // DEVANAGARI VOWEL SIGN SHORT E; DEVANAGARI LETTER SHORT E key { [ U0902, U0901 ] }; // DEVANAGARI SIGN ANUSVARA; DEVANAGARI SIGN CANDRABINDU key { [ U092E, U0923 ] }; // DEVANAGARI LETTER MA; DEVANAGARI LETTER NNA key { [ U0928, U0929 ] }; // DEVANAGARI LETTER NA; DEVANAGARI LETTER NNNA key { [ U0935, U0934 ] }; // DEVANAGARI LETTER VA; DEVANAGARI LETTER LLLA key { [ U0932, U0933 ] }; // DEVANAGARI LETTER LA; DEVANAGARI LETTER LLA key { [ U0938, U0936 ] }; // DEVANAGARI LETTER SA; DEVANAGARI LETTER SHA key { [ comma, U0937 ] }; // DEVANAGARI LETTER SSA key { [ period, U0964 ] }; // DEVANAGARI DANDA key { [ U092F, U095F ] }; // DEVANAGARI LETTER YA; DEVANAGARI LETTER YYA // space, space, Zero-Width-Non-Joiner (ZWNJ), Zero-Width-Joiner (ZWJ): include "nbsp(zwnj3zwj4)" include "group(olpc)" include "rupeesign(4)" include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "hin-wx" { name[Group1]= "Hindi (Wx)"; key { [ grave, asciitilde, 2, 3 ] }; key { [ 0x1000967, exclam ] }; key { [ 0x1000968, at ] }; key { [ 0x1000969 , numbersign ] }; key { [ 0x100096A , dollar ] }; key { [ 0x100096B , percent ] }; key { [ 0x100096C , asciicircum ] }; key { [ 0x100096D , ampersand ] }; key { [ 0x100096e , asterisk ] }; key { [ 0x100096F, parenleft ] }; key { [ 0x1000966, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ 0x1000943, 0x1000944, 0x100090B, 0x1000960] }; key { [ 0x1000924, 0x1000925 ] }; key { [ 0x1000947, 0x1000948, 0x100090F, 0x1000910] }; key { [ 0x1000930, 0x1000937 ] }; key { [ 0x100091F, 0x1000920 ] }; key { [ 0x100092F ] }; key { [ 0x1000941, 0x1000942, 0x1000909, 0x100090A ] }; key { [ 0x100093F, 0x1000940, 0x1000907, 0x1000908 ] }; key { [ 0x100094B, 0x100094C, 0x1000913, 0x1000914] }; key { [ 0x100092A, 0x100092B ] }; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; key { [ backslash, bar, 0x1000964, 0x1000965 ] }; key { [ 0x100094D, 0x100093E, 0x1000905,0x1000906 ] }; key { [ 0x1000938, 0x1000936 ] }; key { [ 0x1000921, 0x1000922 ] }; key { [ 0x1000919, 0x100091E ] }; key { [ 0x1000917, 0x1000918 ] }; key { [ 0x1000939, 0x1000903 ] }; key { [ 0x100091C, 0x100091D ] }; key { [ 0x1000915, 0x1000916 ] }; key { [ 0x1000932, 0x1000962, 0x1000933, 0x100090C] }; key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl ] }; key { [ 0x1000901, 0x100093C, 0x100093D, 0x1000950] }; key { [ 0x1000926, 0x1000927 ] }; key { [ 0x100091A, 0x100091B ] }; key { [ 0x1000935 ] }; key { [ 0x100092C, 0x100092D ] }; key { [ 0x1000928, 0x1000923 ] }; key { [ 0x100092E, 0x1000902 ] }; key { [ comma, less ] }; key { [ period, greater ] }; key { [ slash, question ] }; include "level3(ralt_switch)" include "rupeesign(4)" }; partial alphanumeric_keys xkb_symbols "eng" { include "us(basic)" name[Group1]= "English (India, with rupee)"; include "rupeesign(4)" include "level3(ralt_switch)" }; // Description : Enhanced INSCRIPT keymap for Malayalam // Encoding : Unicode (http://www.unicode.org) // Author : Mahesh T Pai // Date : March, 2011 // Source : http://www.nongnu.org/smc/docs/images/ml_inscript_layout.jpg // Comment : Based on the Inscript Keyboard created by M Baiju // Mapping: partial alphanumeric_keys xkb_symbols "mal_enhanced" { name[Group1] = "Malayalam (enhanced Inscript, with rupee)"; //From grave to backslash (\) key { [ U0d4a , U0d12 ] }; key { [ U0d67 , exclam ] }; key { [ U0d68 , at ] }; key { [ U0d69 , numbersign ] }; key { [ U0d6a , dollar ] }; key { [ U0d6b , percent ] }; key { [ U0d6c , asciicircum ] }; key { [ U0d6d , ampersand ] }; key { [ U0d6e , U0d7e ] }; key { [ U0d6f , parenleft ] }; key { [ U0d66 , parenright ] }; key { [ minus , U0d03 ] }; key { [ U0d43 , U0d0b ] }; key { [ U0d7c , U05C ] }; //bksl: chillu RR // From 'q' to right bracket (]) key { [ U0d57 , U0d14 ] }; key { [ U0d48 , U0d10 ] }; key { [ U0d3e , U0d06 ] }; key { [ U0d40 , U0d08 ] }; key { [ U0d42 , U0d0a ] }; key { [ U0d2c , U0d2d ] }; key { [ U0d39 , U0d19 ] }; key { [ U0d17 , U0d18 ] }; key { [ U0d26 , U0d27 ] }; key { [ U0d1c , U0d1d ] }; key { [ U0d21 , U0d22 ] }; key { [ U0200d , U0d1e ] }; // From 'a' to apostrophe (') key { [ U0d4b , U0d13 ] }; key { [ U0d47 , U0d0f ] }; key { [ U0d4d , U0d05 ] }; key { [ U0d3f , U0d07 ] }; key { [ U0d41 , U0d09 ] }; key { [ U0d2a , U0d2b ] }; key { [ U0d30 , U0d31 ] }; key { [ U0d15 , U0d16 ] }; key { [ U0d24 , U0d25 ] }; key { [ U0d1a , U0d1b ] }; key { [ U0d1f , U0d20 ] }; // From 'z' to slash (/) key { [ U0d46 , U0d0e ] }; key { [ U0d02 , U0d7a ] }; key { [ U0d2e , U0d23 ] }; key { [ U0d28 , U0d7b ] }; key { [ U0d35 , U0d34 ] }; key { [ U0d32 , U0d33 ] }; key { [ U0d38 , U0d36 ] }; key { [ comma , U0d37 ] }; key { [ period , U0d7d ] }; //chillu l key { [ U0d2f , question ] }; include "rupeesign(4)" include "level3(ralt_switch)" }; // ---- BEGIN Hindi KaGaPa phonetic ---- // Name: KaGaPa phonetic // Brief: Devanagari layout (Hindi, Sanskrit, Nepali, Marathi, etc.) // Diagram: (Original)[http://baraha.com/help/Keyboards/dev_brhkbd.htm] // (This layout)[http://bdsatish.in/lang/dev-kagapa.png] // // Description: Based on KaGaPa layout (also called Baraha layout or Nudi layout) // which is a modified layout of the specification by Dr. K. P. Rao. // This is a phonetic layout with the following features: // [1] All letters are mapped to phonetically-similar English keys // as much as possible. // [2] The independent vowel (svara) and its dependent vowel (maatra) // use the same key (depending upon SHIFT, ALTGR or ALTGR + SHIFT). // [3] Consonant conjuncts are produced by explicitly invoking the // 'viraama' (key f). The 'short a' maatra is implicit in all // consonants. // [4] Zero width non-joiner and joiner are on keys 6 and 7 // respectively. These are absolutely essential for alternative // glyph renderings of consonant half-forms. // [5] Rigvedic accent marks, visarga variants. // // Author: Satish BD // partial alphanumeric_keys xkb_symbols "hin-kagapa" { name[Group1] = "Hindi (KaGaPa phonetic)"; key.type="FOUR_LEVEL"; // Roman digits key { [ apostrophe, asciitilde, U201C ] }; // U201C: left double quotation mark key { [ 1, exclam, U0967 ] }; key { [ 2, at, U0968, U20A8 ] }; // U20A8: generic rupee sign (Rs) key { [ 3, numbersign, U0969 ] }; key { [ 4, dollar, U096A, U20B9 ] }; // U20B9: new Indian rupee sign key { [ 5, percent, U096B ] }; key { [ 6, asciicircum, U096C, U200C ] }; // ZWNJ key { [ 7, ampersand, U096D, U200D ] }; // ZWJ key { [ 8, asterisk, U096E, U0901 ] }; // U0901: Devanagari candrabindu key { [ 9, parenleft, U096F ] }; key { [ 0, parenright, U0966, U0970 ] }; // U0970: Devanagari abbreviation sign key { [ minus, underscore, U0952 ] }; // U0952: Devanagari stress sign anudatta key { [ equal, plus ] }; key { [ U005C, U007C, U0964, U0965 ] }; // backslash, pipe, danda, double danda //Q Row key { [ U091F, U0920 ] }; // Q: retroflex Ta, Tha key { [ U0921, U0922, U095C, U095D ] }; // W: retroflex Da, Dha, Da-nukta, Dha-nukta key { [ U0946, U0947, U090E, U090F ] }; // E: matras, short E, long E key { [ U0930, U0943, U090B, U0931 ] }; // R: ra, vocalic R matra, vocalic R, ra-nukta key { [ U0924, U0925 ] }; // T: dental ta, tha key { [ U092F, U0948, U0910, U095F ] }; // Y: ya, ai matra, ai, ya-nukta key { [ U0941, U0942, U0909, U090A ] }; // U: matras, u, uu key { [ U093F, U0940, U0907, U0908 ] }; // I: matras, i, ii key { [ U094A, U094B, U0912, U0913 ] }; // O: matras, short o, long o key { [ U092A, U092B, U095E ] }; // P: pa, pha, pha-nukta key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; //A Row key { [ U093E, U0906, U0905, U0972 ] }; // A: aa matra, aa, short a, candra a key { [ U0938, U0936 ] }; // S: sa, sha key { [ U0926, U0927 ] }; // D: dental da, dha key { [ U094D, U0944, U0960 ] }; // F: virama, vocalic RR matra, vocalic RR key { [ U0917, U0918, U095A ] }; // G: ga, gha, ga-nukta key { [ U0939, U0903, U1CF5, U1CF6 ] }; // H: ha, visarga, jihvamuliya, upadhmaniya key { [ U091C, U091D, U095B ] }; // J: ja, jha, ja-nukta key { [ U0915, U0916, U0958, U0959 ] }; // K: ka, kha, ka-nukta, kha-nukta key { [ U0932, U0933, U0962, U090C ] }; // L: la, lla, vocalic L matra, vocalic L key { [ semicolon, colon, U1CF2, U1CF3 ] }; // U1CF2/3: ardhavisarga/rotated ardhavisarga key { [ apostrophe, quotedbl, U0951, U201D ] }; // U0951: Devanagari stress sign udatta // U201D: Right double quotation mark //Z Row key { [ U091E, U0919 ] }; // Z: nya, nga key { [ U0937, U093C, U0934 ] }; // X: ssa, nukta below, lla-nukta key { [ U091A, U091B ] }; // C: ca, cha key { [ U0935, U094C, U0914 ] }; // V: va, matra au, au key { [ U092C, U092D ] }; // B: ba, bha key { [ U0928, U0923, U0929 ] }; // N: na, nna, nnna key { [ U092E, U0902, U093D, U0950 ] }; // M: ma, anusvara, avagraha, Devanagari OM key { [ comma, U003C, U0945, U090D ] }; // comma: comma, less than, matra, candra e key { [ period, U003E, U0949, U0911 ] }; // period: period, greater than, matra, candra o key { [ slash, question ] }; include "level3(ralt_switch)" }; // ---- END Hindi KaGaPa ---- // Sanskrit uses Devanagari layout of Hindi partial alphanumeric_keys xkb_symbols "san-kagapa" { include "in(hin-kagapa)" name[Group1] = "Sanskrit (KaGaPa phonetic)"; }; // Marathi uses Devanagari layout of Hindi partial alphanumeric_keys xkb_symbols "mar-kagapa" { include "in(hin-kagapa)" name[Group1] = "Marathi (KaGaPa phonetic)"; }; // ---- BEGIN Kannada KaGaPa phonetic ---- // Name: Kannada KaGaPa phonetic // Diagram: (Original)[http://www.baraha.com/help/Keyboards/kan_brhkbd.htm] // (This layout)[http://bdsatish.in/lang/kan-kagapa.png] // // Description: Based on KaGaPa layout (also called Baraha layout or Nudi layout). // See the description to "hin-kagapa" above. // Certain punctuation characters from Devanagari block are // retained for compatibility. // // Author: Satish BD // partial alphanumeric_keys xkb_symbols "kan-kagapa" { name[Group1] = "Kannada (KaGaPa phonetic)"; key.type="FOUR_LEVEL"; // Roman digits key { [ apostrophe, asciitilde, U201C ] }; // U201C: left double quotation mark key { [ 1, exclam, U0CE7 ] }; key { [ 2, at, U0CE8, U20A8 ] }; // U20A8: generic rupee sign (Rs) key { [ 3, numbersign, U0CE9 ] }; key { [ 4, dollar, U0CEA, U20B9 ] }; // U20B9: new Indian rupee sign key { [ 5, percent, U0CEB ] }; key { [ 6, asciicircum, U0CEC, U200C ] }; // ZWNJ key { [ 7, ampersand, U0CED, U200D ] }; // ZWJ key { [ 8, asterisk, U0CEE, U0901 ] }; // U0901: Devanagari candrabindu key { [ 9, parenleft, U0CEF ] }; key { [ 0, parenright, U0CE6 ] }; key { [ minus, underscore, U0952 ] }; // U0952: Devanagari stress sign anudatta key { [ equal, plus ] }; key { [ U005C, U007C, U0964, U0965 ] }; // backslash, pipe, danda, double danda //Q Row key { [ U0C9F, U0CA0 ] }; // Q: retroflex Ta, Tha key { [ U0CA1, U0CA2 ] }; // W: retroflex Da, Dha key { [ U0CC6, U0CC7, U0C8E, U0C8F ] }; // E: matras, short E, long E key { [ U0CB0, U0CC3, U0C8B, U0CB1 ] }; // R: ra, vocalic R matra, vocalic R, RRA key { [ U0CA4, U0CA5 ] }; // T: dental ta, tha key { [ U0CAF, U0CC8, U0C90 ] }; // Y: ya, ai matra, ai key { [ U0CC1, U0CC2, U0C89, U0C8A ] }; // U: matras, u, uu key { [ U0CBF, U0CC0, U0C87, U0C88 ] }; // I: matras, i, ii key { [ U0CCA, U0CCB, U0C92, U0C93 ] }; // O: matras, short o, long o key { [ U0CAA, U0CAB ] }; // P: pa, pha key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; //A Row key { [ U0CBE, U0C86, U0C85 ] }; // A: aa matra, aa, short a key { [ U0CB8, U0CB6 ] }; // S: sa, sha key { [ U0CA6, U0CA7 ] }; // D: dental da, dha key { [ U0CCD, U0CC4, U0CE0 ] }; // F: virama, vocalic RR matra, vocalic RR key { [ U0C97, U0C98 ] }; // G: ga, gha key { [ U0CB9, U0C83, U0CF1, U0CF2 ] }; // H: ha, visarga, jihvanuliya, upadhmaniya key { [ U0C9C, U0C9D ] }; // J: ja, jha key { [ U0C95, U0C96 ] }; // K: ka, kha key { [ U0CB2, U0CB3, U0CE2, U0C8C ] }; // L: la, lla, vocalic L matra, vocalic L key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl, U0951, U201D ] }; // U0951: Devanagari stress sign udatta // U201D: Right double quotation mark //Z Row key { [ U0C9E, U0C99 ] }; // Z: nya, nga key { [ U0CB7, U0CBC, U0CDE ] }; // X: ssa, nukta below, LLLA key { [ U0C9A, U0C9B ] }; // C: ca, cha key { [ U0CB5, U0CCC, U0C94 ] }; // V: va, matra au, au key { [ U0CAC, U0CAD ] }; // B: ba, bha key { [ U0CA8, U0CA3 ] }; // N: na, nna key { [ U0CAE, U0C82, U0CBD, U0950 ] }; // M: ma, anusvara, avagraha, Devanagari OM key { [ comma, U003C, U0CB1 ] }; // comma: comma, less than, RRA key { [ period, U003E, U0CDE ] }; // period: period, greater than, LLLA key { [ slash, question ] }; include "level3(ralt_switch)" }; // ---- END Kannada KaGaPa ---- // ---- BEGIN Telugu KaGaPa phonetic ---- // Name: Telugu KaGaPa phonetic // Diagram: (Original)[http://www.baraha.com/help/Keyboards/tel_brhkbd.htm] // (This layout)[http://bdsatish.in/lang/tel-kagapa.png] // // Description: Based on KaGaPa layout (also called Baraha layout or Nudi layout). // See the description to "hin-kagapa" above. // Certain punctuation characters from Devanagari block are // retained for compatibility. // // Author: Satish BD // partial alphanumeric_keys xkb_symbols "tel-kagapa" { name[Group1] = "Telugu (KaGaPa phonetic)"; key.type="FOUR_LEVEL"; // Roman digits key { [ apostrophe, asciitilde, U201C ] }; // U201C: left double quotation mark key { [ 1, exclam, U0C67 ] }; key { [ 2, at, U0C68, U20A8 ] }; // U20A8: generic rupee sign (Rs) key { [ 3, numbersign, U0C69 ] }; key { [ 4, dollar, U0C6A, U20B9 ] }; // U20B9: new Indian rupee sign key { [ 5, percent, U0C6B ] }; key { [ 6, asciicircum, U0C6C, U200C ] }; // ZWNJ key { [ 7, ampersand, U0C6D, U200D ] }; // ZWJ key { [ 8, asterisk, U0C6E, U0C01 ] }; // U0C01: Telugu arasunna key { [ 9, parenleft, U0C6F ] }; key { [ 0, parenright, U0C66 ] }; key { [ minus, underscore, U0952 ] }; // U0952: Devanagari stress sign anudatta key { [ equal, plus ] }; key { [ U005C, U007C, U0964, U0965 ] }; // backslash, pipe, danda, double danda //Q Row key { [ U0C1F, U0C20 ] }; // Q: retroflex Ta, Tha key { [ U0C21, U0C22 ] }; // W: retroflex Da, Dha key { [ U0C46, U0C47, U0C0E, U0C0F ] }; // E: matras, short E, long E key { [ U0C30, U0C43, U0C0B, U0C31 ] }; // R: ra, vocalic R matra, vocalic R, RRA key { [ U0C24, U0C25 ] }; // T: dental ta, tha key { [ U0C2F, U0C48, U0C10 ] }; // Y: ya, ai matra, ai key { [ U0C41, U0C42, U0C09, U0C0A ] }; // U: matras, u, uu key { [ U0C3F, U0C40, U0C07, U0C08 ] }; // I: matras, i, ii key { [ U0C4A, U0C4B, U0C12, U0C13 ] }; // O: matras, short o, long o key { [ U0C2A, U0C2B ] }; // P: pa, pha key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; //A Row key { [ U0C3E, U0C06, U0C05 ] }; // A: aa matra, aa, short a key { [ U0C38, U0C36 ] }; // S: sa, sha key { [ U0C26, U0C27 ] }; // D: dental da, dha key { [ U0C4D, U0C44, U0C60 ] }; // F: virama, vocalic RR matra, vocalic RR key { [ U0C17, U0C18 ] }; // G: ga, gha key { [ U0C39, U0C03 ] }; // H: ha, visarga key { [ U0C1C, U0C1D ] }; // J: ja, jha key { [ U0C15, U0C16 ] }; // K: ka, kha key { [ U0C32, U0C33, U0C62, U0C0C ] }; // L: la, lla, vocalic L matra, vocalic L key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl, U0951, U201D ] }; // U0951: Devanagari stress sign udatta // U201D: Right double quotation mark //Z Row key { [ U0C1E, U0C19 ] }; // Z: nya, nga key { [ U0C37 ] }; // X: ssa key { [ U0C1A, U0C1B ] }; // C: ca, cha key { [ U0C35, U0C4C, U0C14 ] }; // V: va, matra au, au key { [ U0C2C, U0C2D ] }; // B: ba, bha key { [ U0C28, U0C23 ] }; // N: na, nna key { [ U0C2E, U0C02, U0C3D, U0950 ] }; // M: ma, anusvara, avagraha, Devanagari OM key { [ comma, U003C, U0C58 ] }; // comma: comma, less than, TSA key { [ period, U003E, U0C59 ] }; // period: period, greater than, DZA key { [ slash, question ] }; include "level3(ralt_switch)" }; // Description : Keymap for Manipuri language (Meetei mayek script) // Encoding : Unicode (http://www.unicode.org) // Author : Santosh Heigrujam // Date : December, 2013 // Source : // Comment : partial alphanumeric_keys modifier_keys xkb_symbols "eeyek" { name[Group1]= "Manipuri (Eeyek)"; key { [ grave, asciitilde ] }; key { [ Uabf1, exclam ] }; key { [ Uabf2, at ] }; key { [ Uabf3, numbersign ] }; key { [ Uabf4, dollar ] }; key { [ Uabf5, percent ] }; key { [ Uabf6, asciicircum ] }; key { [ Uabf7, ampersand ] }; key { [ Uabf8, asterisk ] }; key { [ Uabf9, parenleft ] }; key { [ Uabf0, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ Uabc8, Uabd8 ] }; key { [ Uabcb, Uabcb ] }; key { [ Uabcf, Uabe2 ] }; key { [ Uabd4, Uabd4 ] }; key { [ Uabc7, Uabe0 ] }; key { [ Uabcc, Uabe6 ] }; key { [ Uabce, Uabe8 ] }; key { [ Uabe4, Uabe9 ] }; key { [ Uabe3, Uabe7 ] }; key { [ Uabc4, Uabde ] }; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; key { [ Uabd1, Uabe5 ] }; key { [ Uabc1, Uabd3 ] }; key { [ Uabd7, Uabd9 ] }; key { [ Uabd0, Uabda ] }; key { [ Uabd2, Uabd8 ] }; key { [ Uabcd, Uabea ] }; key { [ Uabd6, Uabd3 ] }; key { [ Uabc0, Uabdb ] }; key { [ Uabc2, Uabdc ] }; key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl ] }; key { [ Uabc9, Uabe1 ] }; key { [ Uabca, Uabd9 ] }; key { [ Uabc6, Uabeb ] }; key { [ Uabda, Uabed ] }; key { [ Uabd5, Uabec ] }; key { [ Uabc5, Uabdf ] }; key { [ Uabc3, Uabdd ] }; key { [ comma, less ] }; key { [ period, greater ] }; key { [ slash, question ] }; key { [ backslash, bar ] }; include "level3(ralt_switch)" }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.845312 libxkbcommon-0.10.0/test/data/symbols/inet0000644000175000017500000017516300000000000020116 0ustar00ranran00000000000000// EAK (Easy Access keyboards: Internet, Multimedia, PDA) // Copyright (C) 2002 Stanislav Brabec // // Based on the LinEAK project. // LinEAK - Linux support for Easy Access and Internets // Copyright (C) 2001, 2002 Mark Smulders // Usage in XF86Config: // Option "XkbLayout" "my_kb_layout" // Option "XkbVariant" "my_kb_variant" // Option "XkbModel" "my_eak_type" // Option "XkbRules" "xfree86" // Simple command line usage: // setxkbmap 'my_kb_layout' -variant 'my_kb_variant' -model 'my_eak_type' // Very common set of media keys. hidden partial alphanumeric_keys xkb_symbols "media_common" { key { [ XF86AudioMedia ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioStop, XF86Eject ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86Eject ] }; key { [ XF86Eject ] }; }; // Popular web navigation keys. hidden partial alphanumeric_keys xkb_symbols "nav_common" { key { [ XF86Calculator ] }; key { [ XF86WWW ] }; key { [ XF86Search ] }; key { [ XF86Favorites ] }; key { [ XF86Reload ] }; key { [ XF86Stop ] }; key { [ XF86Forward ] }; key { [ XF86Back ] }; key { [ XF86MyComputer ] }; key { [ XF86Mail ] }; key { [ XF86AudioMedia ] }; }; // ACPI Standard hidden partial alphanumeric_keys xkb_symbols "acpi_common" { key { [ XF86PowerOff ] }; key { [ XF86Standby ] }; key { [ XF86WakeUp ] }; key { [ XF86Battery ] }; key { [ XF86WLAN ] }; key { [ XF86Sleep ] }; }; // Combined sections, for simplicity. hidden partial alphanumeric_keys xkb_symbols "media_nav_common" { include "inet(media_common)" include "inet(nav_common)" }; hidden partial alphanumeric_keys xkb_symbols "media_nav_acpi_common" { include "inet(media_common)" include "inet(nav_common)" include "inet(acpi_common)" }; hidden partial alphanumeric_keys xkb_symbols "nav_acpi_common" { include "inet(nav_common)" include "inet(acpi_common)" }; hidden partial alphanumeric_keys xkb_symbols "media_acpi_common" { include "inet(media_common)" include "inet(acpi_common)" }; // Evdev Standardized Keycodes partial alphanumeric_keys xkb_symbols "evdev" { key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86PowerOff ] }; key { [ Cancel ] }; key { [ Redo ] }; key { [ SunProps ] }; key { [ Undo ] }; key { [ SunFront ] }; key { [ XF86Copy ] }; key { [ XF86Open ] }; key { [ XF86Paste ] }; key { [ Find ] }; key { [ XF86Cut ] }; key { [ Help ] }; key { [ Linefeed ] }; // Commented out because HZTG has same keycode as TLDE // key { [ Zenkaku_Hankaku ] }; key { [ Hiragana_Katakana ] }; key { [ Henkan ] }; key { [ Muhenkan ] }; key { [ Katakana ] }; key { [ Hiragana ] }; key { [ Romaji ] }; key { [ Hangul ] }; key { [ Hangul_Hanja ] }; key { [ XF86TouchpadToggle ] }; key { [ XF86TouchpadOn ] }; key { [ XF86TouchpadOff ] }; key { [ XF86AudioMicMute ] }; // key { [ ] }; // KEY_MACRO key { [ plusminus ] }; key { [ XF86LaunchA ] }; key { [ XF86MenuKB ] }; key { [ XF86Calculator ] }; // key { [ ] }; // KEY_SETUP key { [ XF86Sleep ] }; key { [ XF86WakeUp ] }; key { [ XF86Explorer ] }; key { [ XF86Send ] }; // key { [ ] }; // KEY_DELETEFILE key { [ XF86Xfer ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86WWW ] }; key { [ XF86DOS ] }; key { [ XF86ScreenSaver ] }; key { [ XF86RotateWindows ] }; key { [ XF86TaskPane ] }; key { [ XF86Mail ] }; key { [ XF86Favorites ] }; key { [ XF86MyComputer ] }; key { [ XF86Back ] }; key { [ XF86Forward ] }; // key { [ ] }; // KEY_CLOSECD (opposite of eject) key { [ XF86Eject ] }; key { [ XF86Eject, XF86Eject ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioStop, XF86Eject ] }; key { [ XF86AudioRecord ] }; key { [ XF86AudioRewind ] }; key { [ XF86Phone ] }; // key { [ ] }; // KEY_ISO key { [ XF86Tools ] }; key { [ XF86HomePage ] }; key { [ XF86Reload ] }; key { [ XF86Close ] }; // key { [ ] }; // KEY_MOVE // key { [ ] }; // KEY_EDIT key { [ XF86ScrollUp ] }; key { [ XF86ScrollDown ] }; key { [ parenleft ] }; key { [ parenright ] }; key { [ XF86New ] }; key { [ Redo ] }; key { [ XF86LaunchA ] }; key { [ XF86LaunchC ] }; key { [ XF86LaunchD ] }; key { [ XF86LaunchE ] }; key { [ XF86LaunchF ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioPause ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch4 ] }; key { [ XF86LaunchB ] }; key { [ XF86Suspend ] }; key { [ XF86Close ] }; key { [ XF86AudioPlay ] }; key { [ XF86AudioForward ] }; // key { [ ] }; // KEY_BASSBOOST key { [ Print ] }; // key { [ ] }; // KEY_HP key { [ XF86WebCam ] }; // key { [ ] }; // KEY_SOUND // key { [ ] }; // KEY_QUESTION key { [ XF86Mail ] }; key { [ XF86Messenger ] }; // KEY_CHAT key { [ XF86Search ] }; key { [ XF86Go ] }; // KEY_CONNECT key { [ XF86Finance ] }; key { [ XF86Game ] }; // KEY_SPORT key { [ XF86Shop ] }; // key { [ ] }; // KEY_ALTERASE key { [ Cancel ] }; key { [ XF86MonBrightnessDown ] }; key { [ XF86MonBrightnessUp ] }; key { [ XF86AudioMedia ] }; key { [ XF86Display ] }; key { [ XF86KbdLightOnOff ] }; // KEY_KBDILLUMTOGGLE key { [ XF86KbdBrightnessDown ] }; // KEY_KBDILLUMDOWN key { [ XF86KbdBrightnessUp ] }; // KEY_KBDILLUMUP key { [ XF86Send ] }; key { [ XF86Reply ] }; key { [ XF86MailForward ] }; key { [ XF86Save ] }; key { [ XF86Documents ] }; key { [ XF86Battery ] }; key { [ XF86Bluetooth ] }; key { [ XF86WLAN ] }; // key { [ ] }; // KEY_VIDEO_NEXT -- drive next video source // key { [ ] }; // KEY_VIDEO_PREV -- drive previous video source // key { [ ] }; // KEY_BRIGHTNESS_CYCLE -- bright up, max++ == min // key { [ ] }; // KEY_BRIGHTNESS_ZERO -- brightness off // key { [ ] }; // KEY_DISPLAY_OFF -- turn off display // key { [ ] }; // KEY_WIMAX key { [ XF86Hibernate ] }; // KEY_HIBERNATE key { [ XF86Tools ] }; key { [ XF86Launch5 ] }; key { [ XF86Launch6 ] }; key { [ XF86Launch7 ] }; key { [ XF86Launch8 ] }; key { [ XF86Launch9 ] }; }; // Acer // Acer AirKey V partial alphanumeric_keys xkb_symbols "airkey" { include "inet(acpi_common)" key { [ XF86AudioNext ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86Mail ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioMute ] }; key { [ XF86WWW ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86Terminal ] }; key { [ XF86AudioStop, XF86Eject ] }; }; // Acer C300 laptop partial alphanumeric_keys xkb_symbols "acer_c300" { include "inet(nav_common)" key { [ F14 ] }; key { [ F13 ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86Launch2 ] }; key { [ Help ] }; key { [ XF86Launch1 ] }; }; // Acer Ferrari 4000 Keyboard // From Alex Dubov partial alphanumeric_keys xkb_symbols "acer_ferrari4k" { include "inet(media_nav_common)" key { [ dollar ] }; key { [ EuroSign ] }; key { [ XF86Display ] }; // Missing keycodes - set-up with setkeycodes key { [ Help ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch4 ] }; }; // Acer laptop (Generic layout for Acer laptops from 2004 onwards) // From Carlos Corbacho // Keys marked (HAL) require HAL 0.5.10 (or newer) to be set up correctly // (Your laptop must also be added to hal-info) // (Not all these keys will be available on every Acer laptop) partial alphanumeric_keys xkb_symbols "acer_laptop" { include "inet(media_nav_acpi_common)" key { [ XF86Launch2 ] }; // "P" or "P2" (HAL) key { [ XF86Launch1 ] }; // "e" or "P1" (HAL) // Hotkeys (Function) // Launch Keys // Device keys key { [ XF86Display ] }; // Fn+F5 (HAL) key { [ XF86Launch4 ] }; // Fn+F3 (HAL) key { [ XF86LaunchB ] }; // Bluetooth (HAL) key { [ XF86LaunchA ] }; // Wireless (HAL) key { [ Help ] }; // Fn+F1 (HAL) key { [ XF86Launch5 ] }; // Fn+F7 (HAL) key { [ XF86Launch3 ] }; // Fn+F2 (HAL) // Special Characters // To avoid setting a precedent/standard that will be broken in later // versions of HAL, these keys are commented out for now. When they are no // longer marked 'FIXME' and have saner keycodes, these two entries can be // fixed and permanently uncommented. In the meantime, just uncomment these // to make the keys work. // key { [ EuroSign ] }; // Euro (HAL) // key { [ dollar ] }; // Dollar (HAL) }; // Azona // Azona RF2300 wireless Internet partial alphanumeric_keys xkb_symbols "azonaRF2300" { // From Radics Laszlo include "inet(nav_acpi_common)" key { [ XF86HomePage ] }; key { [ XF86AudioStop ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioMute ] }; key { [ XF86Copy ] }; key { [ XF86Cut ] }; // key { [ XF86Paste ] }; }; // Brother // Brother Internet partial alphanumeric_keys xkb_symbols "brother" { include "inet(acpi_common)" key { [ XF86ScrollUp ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86ScrollDown ] }; key { [ XF86ZoomOut ] }; key { [ XF86AudioMute ] }; key { [ XF86WWW ] }; key { [ Menu ] }; key { [ XF86AudioStop ] }; key { [ XF86Calculator ] }; key { [ XF86Xfer ] }; key { [ XF86Mail ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86ZoomIn ] }; key { [ XF86AudioLowerVolume ] }; }; // BTC // BTC 5113RF Multimedia partial alphanumeric_keys xkb_symbols "btc5113rf" { include "inet(acpi_common)" key { [ XF86AudioStop ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86Favorites ] }; key { [ XF86Eject ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86Back ] }; key { [ XF86WWW ] }; key { [ XF86Search ] }; }; // BTC 9000 partial alphanumeric_keys xkb_symbols "btc9000" { include "inet(acpi_common)" key { [ XF86AudioStop ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86Favorites ] }; key { [ XF86AudioMedia ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86Reload ] }; key { [ XF86Mail ] }; key { [ XF86HomePage ] }; key { [ XF86Search ] }; }; // BTC 9000A partial alphanumeric_keys xkb_symbols "btc9000a" { include "inet(acpi_common)" key { [ XF86AudioStop ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86Favorites ] }; key { [ XF86Eject ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86HomePage ] }; key { [ Help ] }; key { [ XF86WWW ] }; key { [ XF86Search ] }; }; // BTC 9001AH xkb_symbols "btc9001ah" { include "inet(acpi_common)" key { [ XF86HomePage ] }; key { [ XF86AudioStop ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioMute ] }; key { [ XF86Mail ] }; key { [ XF86Eject ] }; }; // BTC 5090 partial alphanumeric_keys xkb_symbols "btc5090" { include "inet(media_nav_acpi_common)" key { [ XF86Start ] }; key { [ XF86Eject ] }; }; // BTC 9019U partial alphanumeric_keys xkb_symbols "btc9019u" { include "inet(media_nav_acpi_common)" key { [ XF86Search ] }; key { [ XF86HomePage ] }; }; // Cherry // Cherry Blue Line CyBo@rd partial alphanumeric_keys xkb_symbols "cherryblue" { include "inet(nav_common)" key { [ XF86Reload ] }; key { [ XF86HomePage ] }; key { [ XF86AudioStop ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioMute ] }; key { [ XF86Standby ] }; key { [ XF86Terminal ] }; key { [ XF86Go ] }; }; // Cherry CyMotion Master XPress partial alphanumeric_keys xkb_symbols "cherryblueb" { include "inet(media_nav_common)" key { [ XF86Reload ] }; key { [ XF86HomePage ] }; key { [ XF86Forward ] }; key { [ XF86Back ] }; key { [ XF86Copy ] }; key { [ XF86ScrollUp ] }; key { [ XF86ScrollDown ] }; key { [ XF86Cut ] }; key { [ XF86Paste ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioMute ] }; key { [ XF86Book ] }; key { [ XF86Finance ] }; key { [ XF86Standby ] }; key { [ XF86AudioRewind ] }; key { [ XF86Eject ] }; key { [ XF86Book ] }; key { [ XF86Book ] }; key { [ XF86Terminal ] }; key { [ XF86Go ] }; }; // Cherry Blue Line CyBo@rd (alt.) partial alphanumeric_keys xkb_symbols "cherrybluea" { include "inet(media_nav_acpi_common)" key { [ XF86Go ] }; }; // Cherry CyBo@rd USB-Hub partial alphanumeric_keys xkb_symbols "cherrycyboard" { include "inet(media_nav_acpi_common)" key { [ XF86Search ] }; key { [ XF86HomePage ] }; key { [ XF86Terminal ] }; key { [ XF86AudioMedia ] }; }; // Cherry CyMotion Expert partial alphanumeric_keys xkb_symbols "cherrycmexpert" { include "inet(cherryblueb)" include "inet(acpi_common)" key { [ XF86Mail ] }; }; // Chicony // Chicony Internet partial alphanumeric_keys xkb_symbols "chicony" { include "inet(acpi_common)" key { [ XF86AudioMute ] }; key { [ XF86Mail ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86Forward ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioStop ] }; key { [ XF86Back ] }; key { [ XF86LaunchB ] }; key { [ XF86LaunchC ] }; key { [ XF86LaunchA ] }; key { [ XF86WWW ] }; key { [ XF86ContrastAdjust ] }; key { [ XF86BrightnessAdjust ] }; }; // Chicony KU-0108 partial alphanumeric_keys xkb_symbols "chicony0108" { include "inet(cherrycyboard)" }; // Chicony KU-0420 AKA Targus Slim Internet Media USB Keyboard partial alphanumeric_keys xkb_symbols "chicony0420" { include "inet(media_nav_acpi_common)" key { [ XF86AudioMedia ] }; key { [ XF86MyComputer ] }; }; // Chicony KB-9885 partial alphanumeric_keys xkb_symbols "chicony9885" { include "inet(acpi_common)" key { [ XF86AudioMute ] }; key { [ XF86Mail ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86Forward ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioStop ] }; key { [ XF86Back ] }; key { [ XF86LaunchB ] }; key { [ XF86LaunchC ] }; key { [ XF86LaunchA ] }; key { [ XF86WWW ] }; }; // Compaq // Compaq Easy Access partial alphanumeric_keys xkb_symbols "compaqeak8" { key { [ XF86Community ] }; key { [ XF86Market ] }; key { [ XF86Meeting ] }; key { [ XF86Search ] }; key { [ XF86News ] }; key { [ XF86Mail ] }; key { [ XF86HomePage ] }; key { [ XF86WWW ] }; }; // Compaq Internet (7 keys) partial alphanumeric_keys xkb_symbols "compaqik7" { key { [ XF86LightBulb ] }; key { [ XF86Mail ] }; key { [ XF86Search ] }; key { [ Help ] }; key { [ XF86VendorHome ] }; key { [ XF86HomePage ] }; key { [ XF86Shop ] }; }; // Compaq Internet (13 keys) partial alphanumeric_keys xkb_symbols "compaqik13" { include "inet(media_acpi_common)" key { [ XF86Mail ] }; key { [ XF86Go ] }; key { [ XF86Search ] }; key { [ XF86WWW ] }; key { [ XF86Shop ] }; }; // Compaq Internet (18 keys) partial alphanumeric_keys xkb_symbols "compaqik18" { include "inet(media_acpi_common)" key { [ XF86LightBulb ] }; key { [ XF86Eject ] }; key { [ XF86Mail ] }; key { [ XF86Go ] }; key { [ XF86Search ] }; key { [ XF86WWW ] }; key { [ XF86VendorHome ] }; key { [ XF86Community ] }; key { [ XF86Shop ] }; key { [ Print ] }; }; // laptop/notebook Compaq (eg. Armada, Evo) laptop Keyboard partial alphanumeric_keys xkb_symbols "armada" { include "inet(media_acpi_common)" key { [ XF86Search ] }; key { [ XF86Mail ] }; key { [ XF86HomePage ] }; key { [ XF86WWW ] }; key { [ XF86Launch2 ] }; // Battery Monitor key { [ XF86AudioMedia ] }; key { [ XF86Launch0 ] }; // Info Center }; // Compaq Presario laptop partial alphanumeric_keys xkb_symbols "presario" { include "inet(media_acpi_common)" key { [ XF86Q ] }; key { [ XF86Launch2 ] }; key { [ XF86Mail ] }; key { [ XF86Launch1 ] }; key { [ XF86WWW ] }; key { [ XF86Shop ] }; key { [ XF86AudioMedia ] }; }; // Compaq iPaq partial alphanumeric_keys xkb_symbols "ipaq" { key { [ XF86Shop ] }; key { [ XF86Standby ] }; key { [ XF86Search ] }; key { [ XF86Travel ] }; key { [ XF86BackForward ] }; key { [ XF86Q ] }; key { [ XF86Mail ] }; }; // Dell partial alphanumeric_keys xkb_symbols "dell" { include "inet(acpi_common)" key { [ XF86Mail ] }; key { [ XF86Search ] }; key { [ XF86HomePage ] }; }; // Dell Precision M65 laptop partial alphanumeric_keys xkb_symbols "dellm65" { include "inet(media_common)" key { [ XF86PowerOff ] }; key { [ Super_L ] }; }; // laptop/notebook Dell Inspiron 8xxx partial alphanumeric_keys xkb_symbols "inspiron" { include "inet(media_common)" key { [ XF86AudioStop ] }; key { [ XF86AudioNext ] }; key { [ XF86Eject ] }; key { [ XF86Display ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; }; // DELL USB Multimedia (former 8135, generalized, superset of 8125) partial alphanumeric_keys xkb_symbols "dellusbmm" { // Describes the extra keys on a SK-8135 Multimedia keyboard // From Olivier Lahaye include "inet(media_nav_acpi_common)" key { [ XF86HomePage ] }; key { [ XF86MyComputer ] }; key { [ XF86AudioMedia ] }; }; // Diamond // Diamond 9801/9802 partial alphanumeric_keys xkb_symbols "diamond" { include "inet(media_nav_acpi_common)" key { [ XF86Go ] }; }; // Ennyah // Ennyah DKB-1008 partial alphanumeric_keys xkb_symbols "ennyah_dkb1008" { include "inet(media_nav_acpi_common)" key { [ XF86AudioMedia ] }; }; // Genius // Genius Comfy KB-16M/Multimedia KWD-910 partial alphanumeric_keys xkb_symbols "genius" { include "inet(media_acpi_common)" key { [ XF86AudioRaiseVolume ] }; key { [ XF86Calculator ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86Forward ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPrev ] }; key { [ XF86Back ] }; key { [ XF86ScreenSaver ] }; key { [ XF86Mail ] }; key { [ XF86Eject ] }; key { [ XF86WWW ] }; }; // Genius Comfy 21e partial alphanumeric_keys xkb_symbols "geniuscomfy2" { // Describes the extra keys on a Genius Comfy KB-21e-Scroll // From Radics Laszlo include "inet(media_nav_acpi_common)" key { [ Return ] }; }; // Gyration partial alphanumeric_keys xkb_symbols "gyration" { include "inet(nav_common)" key { [ XF86Reload ] }; key { [ XF86HomePage ] }; key { [ XF86AudioStop ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioMute ] }; }; // Hewlett-Packard // Hewlett-Packard Internet partial alphanumeric_keys xkb_symbols "hpi6" { include "inet(media_nav_acpi_common)" key { [ XF86HomePage ] }; key { [ XF86Search ] }; key { [ XF86VendorHome ] }; key { [ XF86Community ] }; key { [ XF86AudioMedia ] }; key { [ XF86Eject ] }; key { [ XF86Shop ] }; key { [ XF86Launch1 ] }; key { [ Help ] }; key { [ XF86Finance ] }; key { [ Print ] }; key { [ Help ] }; }; // Hewlett-Packard SK-2501, SK-2505 Multimedia partial alphanumeric_keys xkb_symbols "hp250x" { key { [ XF86Tools ] }; key { [ XF86Search ] }; key { [ XF86Eject ] }; key { [ XF86Mail ] }; key { [ XF86AudioMute ] }; key { [ XF86Launch5 ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch2 ] }; key { [ XF86Launch4 ] }; key { [ XF86Standby ] }; key { [ Help ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86WWW ] }; }; // Hewlett-Packard Omnibook XE3 GC, GD, GE and Pavilion N5xxx partial alphanumeric_keys xkb_symbols "hpxe3gc" { // Describes the OneTouch buttons on HP Omnibook XE3 GC and // HP Pavilion N52XX models. // See http://sourceforge.net/projects/omke for details on enabling // these keys include "inet(media_common)" key { [ Help ] }; key { [ XF86Launch1 ] }; key { [ XF86WWW ] }; key { [ XF86Mail ] }; }; // Hewlett-Packard Omnibook XE3 GF partial alphanumeric_keys xkb_symbols "hpxe3gf" { // Describes the OneTouch buttons on HP Omnibook XE3 GF models. // See http://sourceforge.net/projects/omke for details on enabling // these keys include "inet(media_nav_common)" key { [ Help ] }; key { [ XF86Launch1 ] }; }; // Hewlett-Packard Omnibook XT1000 partial alphanumeric_keys xkb_symbols "hpxt1000" { // Describes the OneTouch buttons on HP Omnibook XT1000 models. // See http://sourceforge.net/projects/omke for details on enabling // these keys include "inet(media_nav_common)" key { [ XF86Launch3 ] }; key { [ Help ] }; key { [ XF86Launch2 ] }; key { [ XF86Launch1 ] }; }; // Hewlett-Packard Pavilion ZT1100 partial alphanumeric_keys xkb_symbols "hpzt11xx" { // Describes the OneTouch buttons on HP Pavilion ZT11xx models. // See http://sourceforge.net/projects/omke for details on enabling // these keys include "inet(media_nav_common)" key { [ XF86Launch3 ] }; key { [ Help ] }; key { [ XF86Launch2 ] }; key { [ XF86Launch1 ] }; }; // Hewlett-Packard Pavilion dv5 partial alphanumeric_keys xkb_symbols "hpdv5" { // Describes the OneTouch buttons on HP Pavilion dv5 models. // See http://sourceforge.net/projects/omke for details on enabling // these keys include "inet(media_common)" key { [ XF86ScreenSaver ] }; key { [ XF86WWW ] }; key { [ Help ] }; key { [ XF86Launch1 ] }; }; // Hewlett-Packard Omnibook XE4xxx and ZE4xxx partial alphanumeric_keys xkb_symbols "hpxe4xxx" { // Describes the OneTouch buttons on HP Omnibook XE4xxx and ZE4xxx // models. // See http://sourceforge.net/projects/omke for details on enabling // these keys include "inet(media_nav_common)" key { [ Help ] }; key { [ XF86Launch2 ] }; key { [ XF86Launch1 ] }; }; // Hewlett-Packard Omnibook 500 FA partial alphanumeric_keys xkb_symbols "hp500fa" { // Describes the OneTouch buttons on HP Omnibook 500 FA models. // See http://sourceforge.net/projects/omke for details on enabling // these keys key { [ Help ] }; key { [ XF86Launch1 ] }; }; // Hewlett-Packard Omnibook 500 partial alphanumeric_keys xkb_symbols "hp5xx" { // Describes the OneTouch buttons on HP Omnibook 5xx models. // See http://sourceforge.net/projects/omke for details on enabling // these keys include "inet(media_common)" key { [ Help ] }; key { [ XF86Launch1 ] }; }; // Honeywell // Honeywell Euroboard partial alphanumeric_keys xkb_symbols "honeywell_euroboard" { // January 2002 // Scott Penrose // http://linux.dd.com.au/quest/linux/keyboard/honeywell/ key { [ XF86Game ] }; key { [ XF86AudioPrev ] }; key { [ XF86Eject ] }; key { [ XF86Launch2 ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86Launch1 ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioStop ] }; key { [ XF86Mail ] }; key { [ XF86ScreenSaver ] }; key { [ XF86Calculator ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86WWW ] }; }; // IBM // IBM Rapid Access partial alphanumeric_keys xkb_symbols "rapidaccess" { key { [ XF86AudioMute ] }; key { [ XF86Launch2 ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPause ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioStop ] }; key { [ XF86Standby ] }; key { [ Help ] }; key { [ XF86Launch4 ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch1 ] }; }; // IBM Rapid Access II partial alphanumeric_keys xkb_symbols "rapidaccess2" { include "inet(acpi_common)" key { [ XF86AudioNext ] }; key { [ XF86Favorites ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioStop ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioPrev ] }; key { [ XF86HomePage ] }; key { [ XF86Shop ] }; key { [ XF86Search ] }; key { [ XF86MyComputer ] }; key { [ XF86VendorHome ] }; }; // IBM ThinkPad 60 series partial alphanumeric_keys xkb_symbols "thinkpad60" { include "inet(media_nav_common)" key { [ XF86VendorHome ] }; }; // IBM Space Saver partial alphanumeric_keys xkb_symbols "ibm_spacesaver" { key { type="ONE_LEVEL", symbols[Group1]= [ Num_Lock ] }; }; // Logitech // Logitech common definitions hidden partial alphanumeric_keys xkb_symbols "logitech_base" { include "inet(media_nav_acpi_common)" key { [ XF86HomePage ] }; key { [ XF86Community ] }; key { [ XF86ScrollClick ] }; key { [ XF86VendorHome ] }; key { [ XF86New ] }; key { [ XF86Reply ] }; key { [ XF86MyComputer ] }; key { [ XF86Documents ] }; key { [ XF86Pictures ] }; key { [ XF86Music ] }; }; // Logitech second set of common keys hidden partial alphanumeric_keys xkb_symbols "logitech_set3" { key { [ XF86AudioStop ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioMute ] }; key { [ XF86New ] }; // F1 key { [ XF86Reply ] }; // F2 key { [ XF86Send ] }; // F4 key { [ Print ] }; // F7 key { [ XF86Save ] }; // F8 key { [ XF86Documents ] }; // F10 key { [ XF86Go ] }; key { [ XF86AudioMedia ] }; }; // Logitech Access partial alphanumeric_keys xkb_symbols "logiaccess" { include "inet(logitech_base)" key { [ XF86MailForward ] }; key { [ XF86Send ] }; key { [ XF86Messenger ] }; key { [ XF86WebCam ] }; }; // Logitech Cordless Desktop (alt.) partial alphanumeric_keys xkb_symbols "logicda" { include "inet(logitech_base)" include "inet(logitech_set3)" }; // Logitech Internet Navigator partial alphanumeric_keys xkb_symbols "logicink" { include "inet(logitech_base)" key { [ XF86Shop ] }; key { [ XF86VendorHome ] }; key { [ XF86Finance ] }; key { [ XF86Start ] }; }; // Logitech Cordless Desktop EX110 partial alphanumeric_keys xkb_symbols "logiex110" { include "inet(logitech_base)" key { [ XF86Close ] }; // Close // Extended function keys // In the Console before starting X // Using setkeycodes e03b 212 e03c 213 e03d 214 e03e 215 e03f 216 e040 217 // setkeycodes e041 218 e042 219 e043 220 e044 221 e057 222 e058 223 6d 206 // *=keys that are there but need different symbol names. key { [ Help ] }; // F1 key { [ XF86Word ] }; // F2 key { [ XF86Excel ] }; // F3 key { [ XF86Pictures ] }; // F4 key { [ Undo ] }; // F5 key { [ Redo ] }; // F6 * key { [ Print ] }; // F7 key { [ XF86Save ] }; // F8 key { [ XF86Launch1 ] }; // F9 * key { [ XF86Launch2 ] }; // F10 key { [ XF86Launch3 ] }; // F11 key { [ XF86Launch4 ] }; // F12 }; // Logitech iTouch Internet Navigator SE partial alphanumeric_keys xkb_symbols "logiinkse" { include "inet(logitech_base)" key { [ XF86MailForward ] }; // F3 key { [ XF86Send ] }; // F4 key { [ Undo ] }; // F5 key { [ Redo ] }; // F6 key { [ Print ] }; // F7 key { [ XF86Messenger ] }; key { [ XF86WebCam ] }; key { [ XF86VendorHome ] }; key { [ XF86Shop ] }; key { [ XF86Save ] }; // F8 }; // Logitech iTouch Internet Navigator SE USB partial alphanumeric_keys xkb_symbols "logiinkseusb" { include "inet(logitech_base)" include "inet(logitech_set3)" }; // Logitech iTouch Cordless Y-RB6 partial alphanumeric_keys xkb_symbols "logiitc" { include "inet(logitech_base)" key { [ XF86AudioRaiseVolume ] }; // Just to override RaiseVolume from logitech_base, // since no keysym can have two keycodes, see // https://bugs.freedesktop.org/show_bug.cgi?id=7095 key { [ XF86Launch1 ] }; }; // Logitech Internet partial alphanumeric_keys xkb_symbols "logiik" { include "inet(logitech_base)" key { [ Find ] }; key { [ Print ] }; key { [ XF86Favorites ] }; key { [ XF86Reload ] }; key { [ XF86Search ] }; key { [ XF86HotLinks ] }; key { [ XF86Forward ] }; key { [ XF86HomePage ] }; key { [ XF86Stop ] }; key { [ XF86OpenURL ] }; key { [ XF86AddFavorite ] }; key { [ XF86History ] }; key { [ XF86WWW ] }; }; // Logitech iTouch partial alphanumeric_keys xkb_symbols "itouch" { include "inet(logitech_base)" key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; }; // Logitech UltraX Cordless Media Desktop partial alphanumeric_keys xkb_symbols "logiultraxc" { key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioRaiseVolume ] }; }; partial alphanumeric_keys xkb_symbols "logidinovo" { include "inet(media_nav_common)" key { [ XF86HomePage ] }; key { [ XF86Standby ] }; key { [ XF86Search ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioMedia ] }; }; partial alphanumeric_keys xkb_symbols "logidinovoedge" { include "inet(media_acpi_common)" key { [ XF86HomePage ] }; key { [ XF86Mail ] }; key { [ XF86Search ] }; key { [ XF86AudioMedia ] }; }; partial alphanumeric_keys xkb_symbols "logitech_g15" { include "inet(media_nav_acpi_common)" key { [ XF86Messenger ] }; key { [ XF86Launch7 ] }; key { [ XF86Launch9 ] }; key { [ XF86Phone ] }; key { [ XF86LaunchD ] }; key { [ XF86Support ] }; key { [ XF86LaunchF ] }; key { [ XF86LogOff ] }; key { [ XF86Launch5 ] }; key { [ XF86Travel ] }; key { [ XF86Spell ] }; key { [ XF86Launch4 ] }; key { [ XF86Music ] }; key { [ XF86Forward ] }; key { [ XF86Send ] }; key { [ XF86Save ] }; key { [ XF86Pictures ] }; key { [ XF86LaunchA ] }; key { [ XF86iTouch ] }; key { [ XF86Launch3 ] }; key { [ XF86ToDoList ] }; key { [ XF86Calculator ] }; key { [ XF86VendorHome ] }; key { [ XF86Away ] }; key { [ XF86WebCam ] }; key { [ XF86Launch0 ] }; key { [ XF86Launch6 ] }; key { [ XF86Calendar ] }; key { [ XF86LaunchB ] }; key { [ XF86LaunchC ] }; key { [ XF86WWW ] }; key { [ XF86LaunchE ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86Launch8 ] }; }; // Memorex // Memorex MX1998 partial alphanumeric_keys xkb_symbols "mx1998" { include "inet(media_acpi_common)" key { [ XF86ScrollDown ] }; key { [ XF86AudioRewind ] }; key { [ XF86Close ] }; key { [ XF86Xfer ] }; key { [ XF86AudioRecord ] }; key { [ XF86Documents ] }; key { [ XF86Game ] }; key { [ XF86Calculator ] }; key { [ Menu ] }; key { [ XF86WWW ] }; key { [ XF86WakeUp ] }; key { [ XF86DOS ] }; key { [ XF86ScreenSaver ] }; key { [ XF86ScrollUp ] }; }; // Memorex MX2500 EZ-Access partial alphanumeric_keys xkb_symbols "mx2500" { include "inet(media_nav_acpi_common)" key { [ XF86Clear ] }; key { [ XF86Phone ] }; key { [ XF86DOS ] }; key { [ XF86Close ] }; key { [ XF86Xfer ] }; key { [ XF86Eject ] }; key { [ XF86Documents ] }; key { [ XF86News ] }; key { [ XF86WakeUp ] }; key { [ XF86RotateWindows ] }; }; // Memorex MX2750 partial alphanumeric_keys xkb_symbols "mx2750" { include "inet(media_nav_acpi_common)" key { [ XF86Launch0 ] }; }; // Microsoft // Microsoft Natural Ergonomic 4000 partial alphanumeric_keys xkb_symbols "microsoft4000" { include "inet(media_nav_common)" key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch4 ] }; key { [ XF86Launch5 ] }; // Missing because of lack of support from kbd driver: Zoom in and // slider. }; // Microsoft Natural Wireless Ergonomic 7000 partial alphanumeric_keys xkb_symbols "microsoft7000" { include "inet(media_nav_common)" key { [ Undo ] }; key { [ XF86New ] }; key { [ Redo ] }; key { [ XF86MailForward ] }; key { [ XF86Close ] }; key { [ Print ] }; key { [ XF86Save ] }; key { [ XF86Send ] }; key { [ Help ] }; key { [ XF86Reply ] }; key { [ parenleft ] }; key { [ parenright ] }; key { [ KP_Equal ] }; key { [ XF86Open ] }; // Missing because of lack of support from kbd driver: Spell, Launch, // and Zoom in and out buttons. }; // Microsoft Internet partial alphanumeric_keys xkb_symbols "microsoftinet" { include "inet(nav_acpi_common)" key { [ XF86AudioStop ] }; }; // Microsoft Natural Pro USB partial alphanumeric_keys xkb_symbols "microsoftprousb" { include "inet(nav_common)" key { [ XF86Reload ] }; key { [ XF86AudioMedia ] }; key { [ XF86HomePage ] }; key { [ XF86AudioStop ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioMute ] }; key { [ XF86Standby ] }; // Internet Section -- Left Side // Multimedia Section -- Right Side // My Computer Section -- Far Right // My computer maps to printscreen, so leaving commented out for now // key { [ XF86MyComputer ] }; }; // Microsoft Natural Pro OEM partial alphanumeric_keys xkb_symbols "microsoftprooem" { include "inet(media_nav_common)" key { [ XF86Search ] }; key { [ XF86HomePage ] }; key { [ XF86Standby ] }; key { [ XF86MyComputer ] }; // Internet Section -- Left Side // Multimedia Section -- Right Side // My Computer Section -- Far Right }; // Microsoft Internet Pro (Swedish) partial alphanumeric_keys xkb_symbols "microsoftprose" { include "inet(nav_common)" key { [ XF86Reload ] }; key { [ XF86HomePage ] }; key { [ XF86AudioStop ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioMute ] }; key { [ XF86Standby ] }; key { [ XF86AudioStop ] }; key { [ XF86MyComputer ] }; key { [ XF86AudioMedia ] }; }; // Microsoft Office Keyboard partial alphanumeric_keys xkb_symbols "microsoftoffice" { include "inet(nav_acpi_common)" key { [ XF86Calendar ] }; key { [ Undo ] }; key { [ XF86HomePage ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioMute ] }; key { [ XF86Cut ] }; key { [ XF86LogOff ] }; key { [ XF86ApplicationLeft ] }; key { [ XF86TaskPane ] }; key { [ XF86Spell ] }; key { [ XF86WWW ] }; key { [ XF86New ] }; key { [ XF86Open ] }; key { [ XF86Close ] }; key { [ Help ] }; key { [ XF86Save ] }; key { [ Print ] }; key { [ XF86OfficeHome ] }; key { [ Redo ] }; key { [ XF86Reply ] }; key { [ XF86MailForward ] }; key { [ XF86Send ] }; key { [ XF86Copy ] }; key { [ XF86ApplicationRight ] }; key { [ XF86Paste ] }; }; // Microsoft Wireless Multimedia 1.0A partial alphanumeric_keys xkb_symbols "microsoftmult" { include "inet(media_nav_acpi_common)" key { [ XF86Messenger ] }; key { [ XF86New ] }; key { [ XF86Open ] }; key { [ XF86Close ] }; key { [ XF86Reply ] }; key { [ Redo ] }; key { [ Undo ] }; key { [ XF86LogOff ] }; key { [ XF86Spell ] }; key { [ Help ] }; key { [ XF86Music ] }; key { [ XF86Forward ] }; key { [ XF86Send ] }; key { [ XF86Save ] }; key { [ Print ] }; key { [ XF86Pictures ] }; key { [ XF86Documents ] }; }; // Oretec // Oretec MCK-800 MM/Internet keyboard partial alphanumeric_keys xkb_symbols "oretec" { include "inet(acpi_common)" key { [ XF86ScrollUp ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86ScrollDown ] }; key { [ XF86ZoomOut ] }; key { [ XF86AudioMute ] }; key { [ XF86WWW ] }; key { [ Menu ] }; key { [ XF86AudioStop ] }; key { [ XF86Calculator ] }; key { [ XF86Xfer ] }; key { [ XF86Mail ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86ZoomIn ] }; key { [ XF86AudioLowerVolume ] }; }; // Propeller // Propeller Voyager KTEZ-1000 partial alphanumeric_keys xkb_symbols "propeller" { include "inet(media_common)" key { [ XF86AudioRewind ] }; key { [ XF86Close ] }; key { [ XF86Xfer ] }; key { [ XF86AudioRecord ] }; key { [ XF86Documents ] }; key { [ XF86Game ] }; key { [ XF86Calculator ] }; key { [ Menu ] }; key { [ XF86WWW ] }; key { [ XF86DOS ] }; key { [ XF86Standby ] }; }; // QTronix // QTronix Scorpius 98N+ partial alphanumeric_keys xkb_symbols "qtronix" { key { [ XF86ScrollDown ] }; key { [ XF86Forward ] }; key { [ XF86WakeUp ] }; key { [ XF86Search ] }; key { [ XF86Standby ] }; key { [ XF86ScrollUp ] }; key { [ XF86Back ] }; key { [ XF86Reload ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioStop ] }; key { [ XF86HomePage ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRecord ] }; key { [ XF86PowerOff ] }; key { [ XF86Stop ] }; key { [ XF86Calculator ] }; }; // Samsung // Samsung SDM 4500P partial alphanumeric_keys xkb_symbols "samsung4500" { include "inet(media_nav_acpi_common)" key { [ XF86Launch4 ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch3 ] }; key { [ XF86Launch5 ] }; key { [ XF86Close ] }; key { [ XF86Book ] }; key { [ XF86Eject ] }; key { [ Help ] }; key { [ XF86Explorer ] }; key { [ XF86Launch2 ] }; }; // Samsung SDM 4510P partial alphanumeric_keys xkb_symbols "samsung4510" { include "inet(media_acpi_common)" key { [ XF86Launch1 ] }; key { [ XF86Launch3 ] }; key { [ XF86Eject ] }; key { [ XF86Launch2 ] }; }; // SK // NEC SK-1300 partial alphanumeric_keys xkb_symbols "sk1300" { include "inet(media_common)" key { [ XF86Eject ] }; key { [ XF86Forward ] }; key { [ XF86WWW ] }; key { [ XF86Standby ] }; key { [ XF86Back ] }; key { [ XF86Stop ] }; }; // NEC SK-2500 partial alphanumeric_keys xkb_symbols "sk2500" { include "inet(media_nav_common)" key { [ XF86AudioRewind ] }; key { [ XF86Close ] }; key { [ XF86Eject ] }; key { [ XF86Eject ] }; key { [ XF86Forward ] }; key { [ XF86AudioRecord ] }; key { [ XF86Xfer ] }; key { [ XF86PowerOff ] }; key { [ Menu ] }; key { [ XF86ScreenSaver ] }; }; // NEC SK-6200 partial alphanumeric_keys xkb_symbols "sk6200" { include "inet(acpi_common)" key { [ XF86Favorites ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86Back ] }; key { [ XF86Forward ] }; key { [ XF86WWW ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioStop ] }; key { [ XF86Mail ] }; }; // NEC SK-7100 partial alphanumeric_keys xkb_symbols "sk7100" { include "inet(media_common)" key { [ XF86AudioPause ] }; key { [ XF86Close ] }; key { [ XF86Video ] }; key { [ XF86Eject ] }; key { [ XF86CD ] }; key { [ XF86Display ] }; key { [ XF86WWW ] }; }; // Sven // SVEN Ergonomic 2500 partial alphanumeric_keys xkb_symbols "sven" { include "inet(acpi_common)" key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86Forward ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86ZoomOut ] }; key { [ XF86AudioPrev ] }; key { [ XF86AudioStop ] }; key { [ XF86HomePage ] }; key { [ XF86Mail ] }; key { [ XF86ZoomIn ] }; key { [ XF86MyComputer ] }; key { [ XF86Stop ] }; key { [ XF86ScreenSaver ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioMute ] }; key { [ XF86Calculator ] }; key { [ XF86Reload ] }; key { [ XF86Search ] }; key { [ XF86Favorites ] }; key { [ XF86ScrollUp ] }; key { [ XF86ScrollDown ] }; key { [ XF86AudioNext ] }; key { [ XF86Back ] }; }; // SVEN Slim 303 partial alphanumeric_keys xkb_symbols "sven303" { key { [ XF86PowerOff ] }; key { [ XF86Sleep ] }; key { [ XF86WakeUp ] }; }; // Symplon // Symplon PaceBook tablet partial alphanumeric_keys xkb_symbols "symplon" { include "inet(nav_acpi_common)" key { [ XF86RotationPB ] }; key { [ XF86SplitScreen ] }; key { [ XF86Support ] }; key { [ XF86New ] }; key { [ XF86User2KB ] }; key { [ XF86RotationKB ] }; key { [ XF86MenuKB ] }; key { [ XF86User1KB ] }; key { [ XF86UserPB ] }; key { [ XF86MenuPB ] }; }; // Toshiba // Toshiba Satellite S3000 partial alphanumeric_keys xkb_symbols "toshiba_s3000" { include "inet(media_common)" // Describes the Special buttons on Toshiba Satellite 3000 models. // See http://sourceforge.net/projects/omke for details on enabling // these keys key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86WWW ] }; key { [ XF86Mail ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioLowerVolume ] }; }; // Trust // Trust Wireless Classic partial alphanumeric_keys xkb_symbols "trust" { include "inet(media_nav_acpi_common)" key { [ XF86ScreenSaver ] }; key { [ XF86Eject ] }; }; // Trust Direct Access partial alphanumeric_keys xkb_symbols "trustda" { include "inet(media_common)" key { [ XF86AudioRewind ] }; key { [ XF86Close ] }; key { [ XF86Eject ] }; key { [ XF86AudioRecord ] }; key { [ XF86Xfer ] }; key { [ XF86Standby ] }; key { [ Help ] }; key { [ XF86WWW ] }; key { [ XF86Away ] }; }; // YaHoo! // Yahoo! Internet partial alphanumeric_keys xkb_symbols "yahoo" { include "inet(acpi_common)" key { [ XF86AudioPrev ] }; key { [ XF86AudioPlay, XF86AudioPause ] }; key { [ XF86AudioStop ] }; key { [ XF86AudioNext ] }; key { [ XF86AudioRecord ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86AudioMute ] }; key { [ XF86Close ] }; key { [ XF86Calculator ] }; key { [ Help ] }; key { [ XF86Mail ] }; key { [ XF86WWW ] }; }; // Apple keyboards (macbooks, powerbooks, powermac G5, etc) partial alphanumeric_keys xkb_symbols "apple" { // Really brightness up/down key { [ XF86BrightnessAdjust ] }; key { [ XF86BrightnessAdjust ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ XF86RotateWindows ] }; // Really keyboard backlight off/up/down key { [ XF86Launch0 ] }; key { [ XF86Launch1 ] }; key { [ XF86Launch2 ] }; key { [ XF86PowerOff ] }; key { [ F13 ] }; key { [ F14 ] }; key { [ F15 ] }; key { [ XF86Eject ] }; key { [ F16 ] }; key { [ KP_Equal ] }; }; partial alphanumeric_keys xkb_symbols "cymotionlinux" { include "inet(media_nav_acpi_common)" key { [ Undo ] }; key { [ Redo ] }; key { [ XF86ScrollDown ] }; key { [ XF86Launch2 ] }; key { [ XF86Launch1 ] }; key { [ XF86MenuKB ] }; key { [ XF86Launch3 ] }; key { [ XF86Cut ] }; key { [ XF86Copy ] }; key { [ XF86Paste ] }; key { [ XF86ScrollUp ] }; key { [ XF86AudioMedia ] }; }; partial alphanumeric_keys xkb_symbols "silvercrest" { include "inet(media_nav_acpi_common)" key { [ XF86HomePage ] }; key { [ XF86Launch2 ] }; key { [ XF86Launch1 ] }; }; // eMachines partial alphanumeric_keys xkb_symbols "emachines" { include "inet(media_nav_acpi_common)" key { [ XF86iTouch ] }; key { [ KP_0 ] }; key { [ KP_1 ] }; key { [ KP_2 ] }; key { [ KP_3 ] }; key { [ KP_4 ] }; key { [ KP_5 ] }; key { [ KP_6 ] }; key { [ KP_7 ] }; key { [ KP_8 ] }; key { [ KP_9 ] }; key { [ KP_Add ] }; key { [ KP_Decimal ] }; key { [ KP_Divide ] }; key { [ KP_Multiply ] }; key { [ KP_Subtract ] }; }; // BenQ // BenQ X* (X730, X500, X800) // // To make the FN_LOCK and CONFIG key work on the BenQ X500 , use: // setkeycodes e074 130 # KEY_PROPS from /usr/include/linux/input.h // setkeycodes e075 171 # KEY_CONFIG from /usr/include/linux/input.h partial alphanumeric_keys xkb_symbols "benqx" { include "inet(media_nav_acpi_common)" key { [ XF86ModeLock ] }; key { [ XF86WWW ] }; key { [ XF86Go ] }; key { [ XF86Calendar ] }; }; // Intel // Intel Classmate partial alphanumeric_keys xkb_symbols "classmate" { key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; }; // Unitek partial alphanumeric_keys xkb_symbols "unitekkb1925" { include "inet(media_nav_common)" key { [ XF86AudioMute ] }; key { [ XF86PowerOff ] }; key { [ XF86Sleep ] }; key { [ XF86WakeUp ] }; key { [ XF86Search ] }; key { [ XF86Reload ] }; }; // Creative // Creative Desktop Wireless 7000 partial alphanumeric_keys xkb_symbols "creativedw7000" { include "inet(media_nav_acpi_common)" key { [ XF86Pictures ] }; }; // Compal // Compal FL90 partial alphanumeric_keys xkb_symbols "compalfl90" { include "inet(media_nav_acpi_common)" key { [ XF86MonBrightnessUp ] }; key { [ XF86MonBrightnessDown ] }; }; partial alphanumeric_keys xkb_symbols "pc105" { include "inet(media_nav_acpi_common)" }; // HTC Dream partial alphanumeric_keys xkb_symbols "htcdream" { key { [ BackSpace ] }; key { [ Return ] }; key { [ 1, 1, exclam, exclam ] }; key { [ 2, 2, at, at ] }; key { [ 3, 3, numbersign, numbersign ] }; key { [ 4, 4, dollar, dollar ] }; key { [ 5, 5, percent, percent ] }; key { [ 6, 6, dead_circumflex, dead_circumflex ] }; key { [ 7, 7, ampersand, ampersand ] }; key { [ 8, 8, asterisk, asterisk ] }; key { [ 9, 9, parenleft, parenleft ] }; key { [ 0, 0, parenright, parenright ] }; key { [ Shift_L ] }; key { [ space ] }; key { [ period, period, slash, slash ] }; key { [ Shift_R ] }; modifier_map Shift { , }; }; partial alphanumeric_keys xkb_symbols "chromebook" { include "level3(ralt_switch)" key { [ XF86Back ] }; key { [ XF86Forward ] }; key { [ XF86Reload ] }; key { [ F11 ] }; // key { [ F5, F5, F5, F5 ] }; // Overview key key { [ XF86MonBrightnessDown ] }; key { [ XF86MonBrightnessUp ] }; key { [ XF86AudioMute ] }; key { [ XF86AudioLowerVolume ] }; key { [ XF86AudioRaiseVolume ] }; key { [ BackSpace, BackSpace, Delete ] }; key { [ Up, Up, Prior, Up ] }; key { [ Down, Down, Next, Down ] }; key { [ Left, Left, Home, Left ] }; key { [ Right, Right, End, Right ] }; key { [ Super_L, Super_L, Caps_Lock, Super_L ] }; }; partial alphanumeric_keys xkb_symbols "teck227" { include "inet(media_nav_common)" key { [ Hiragana ] }; }; partial alphanumeric_keys xkb_symbols "teck229" { include "inet(teck227)" }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8586452 libxkbcommon-0.10.0/test/data/symbols/keypad0000644000175000017500000005631600000000000020432 0ustar00ranran00000000000000default hidden partial keypad_keys xkb_symbols "x11" { include "keypad(operators)" key { [ KP_Home, KP_7 ] }; key { [ KP_Up, KP_8 ] }; key { [ KP_Prior, KP_9 ] }; key { [ KP_Left, KP_4 ] }; key { [ KP_Begin, KP_5 ] }; key { [ KP_Right, KP_6 ] }; key { [ KP_End, KP_1 ] }; key { [ KP_Down, KP_2 ] }; key { [ KP_Next, KP_3 ] }; key { [ KP_Enter ] }; key { [ KP_Equal ] }; key { [ KP_Insert, KP_0 ] }; key { [ KP_Delete, KP_Decimal ] }; key { [ KP_Decimal, KP_Decimal ] }; }; hidden partial keypad_keys xkb_symbols "overlay" { include "keypad(overlay1)" }; hidden partial keypad_keys xkb_symbols "overlay1" { key { [ KP_Home ], overlay1= }; key { [ KP_Up ], overlay1= }; key { [ KP_Prior ], overlay1= }; key { [ KP_Left ], overlay1= }; key { [ KP_Begin ], overlay1= }; key { [ KP_Right ], overlay1= }; key { [ KP_End ], overlay1= }; key { [ KP_Down ], overlay1= }; key { [ KP_Next ], overlay1= }; key { [ KP_Insert ], overlay1= }; key { [ KP_Delete ], overlay1= }; key { [ KP_7 ] }; key { [ KP_8 ] }; key { [ KP_9 ] }; key { [ KP_4 ] }; key { [ KP_5 ] }; key { [ KP_6 ] }; key { [ KP_1 ] }; key { [ KP_2 ] }; key { [ KP_3 ] }; key { [ KP_0 ] }; key { [ KP_Decimal ] }; }; hidden partial keypad_keys xkb_symbols "overlay2" { key { [ KP_Home ], overlay2= }; key { [ KP_Up ], overlay2= }; key { [ KP_Prior ], overlay2= }; key { [ KP_Left ], overlay2= }; key { [ KP_Begin ], overlay2= }; key { [ KP_Right ], overlay2= }; key { [ KP_End ], overlay2= }; key { [ KP_Down ], overlay2= }; key { [ KP_Next ], overlay2= }; key { [ KP_Insert ], overlay2= }; key { [ KP_Delete ], overlay2= }; key { [ KP_7 ] }; key { [ KP_8 ] }; key { [ KP_9 ] }; key { [ KP_4 ] }; key { [ KP_5 ] }; key { [ KP_6 ] }; key { [ KP_1 ] }; key { [ KP_2 ] }; key { [ KP_3 ] }; key { [ KP_0 ] }; key { [ KP_Decimal ] }; }; hidden partial keypad_keys xkb_symbols "operators" { // Puts some commands to control the X server on // the fifth level of the keypad's operator keys. key { type="CTRL+ALT", // Ungrab cancels server/keyboard/pointer grabs symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86_Ungrab ] }; key { type="CTRL+ALT", // ClsGrb kills whichever client has a grab in effect symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86_ClearGrab ] }; key { type="CTRL+ALT", // -VMode switches to the previous video mode symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86_Prev_VMode ] }; key { type="CTRL+ALT", // +VMode switches to the next video mode symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86_Next_VMode ] }; }; // Legacy PC keypad definition // Copyright © 2006-2007 Nicolas Mailhot keypad_keys xkb_symbols "legacy" { include "keypad(core)" include "keypad(legacymath)" include "keypad(legacynumber)" include "kpdl(dot)" }; // Legacy Wang 725-3771-ae and 725-3771-uk keypad definition // Copyright © 2006-2007 Nicolas Mailhot keypad_keys xkb_symbols "legacy_wang" { include "keypad(core)" include "keypad(legacymath)" include "keypad(legacynumber_wang)" include "kpdl(dot)" }; // Complete new keypad definition // Copyright © 2006-2007 Nicolas Mailhot keypad_keys xkb_symbols "oss" { include "keypad(core)" include "keypad(ossmath)" include "keypad(ossnumber)" include "kpdl(dotoss)" }; // Latin9 restriction of new keypad definition // Copyright © 2006-2007 Nicolas Mailhot keypad_keys xkb_symbols "oss_latin9" { include "keypad(core)" include "keypad(ossmath_latin9)" include "keypad(legacynumber)" include "kpdl(dotoss_latin9)" }; // Wang 725-3771-ae and 725-3771-uk keypad variant of oss keypad // Copyright © 2006-2007 Nicolas Mailhot keypad_keys xkb_symbols "oss_wang" { include "keypad(core)" include "keypad(ossmath)" include "keypad(ossnumber_wang)" include "kpdl(dotoss)" }; // Forward-looking keypad definition // Won't work with applications that make ASCII assumptions // Copyright © 2007 Nicolas Mailhot keypad_keys xkb_symbols "future" { include "keypad(core)" include "keypad(futuremath)" include "keypad(ossnumber)" include "kpdl(commaoss)" }; // Forward-looking keypad definition // Won't work with applications that make ASCII assumptions // Copyright © 2007 Nicolas Mailhot keypad_keys xkb_symbols "future_wang" { include "keypad(core)" include "keypad(futuremath)" include "keypad(ossnumber_wang)" include "kpdl(commaoss)" }; // Keypad keys nobody changes // Copyright © 2006 Nicolas Mailhot partial keypad_keys xkb_symbols "core" { modifier_map Mod2 { Num_Lock }; key { [ Num_Lock ] }; key { [ KP_Enter ] }; key { [ KP_Equal ] }; }; // Legacy keypad math area // Copyright © 2006 Nicolas Mailhot // // ┏━━━━━┱─────┬─────┬─────┐ // ┃Num ┃ ₁ │ ₂ │ ₃ │ ₁ // ┃Lock⇭┃ / │ * │ - │ ₂ // ┡━━━━━╃─────┼─────┼─────┤ ₃ // │ ₄ │ ₄ // │ │ // ┤ │ 1 None // │ │ 2 Ctrl+Alt // │ + │ // ╆━━━━━┪ partial keypad_keys xkb_symbols "legacymath" { key.type[Group1]="CTRL+ALT" ; key { [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86_Ungrab ] }; // / key { [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86_ClearGrab ] }; // * key { [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86_Prev_VMode ] }; // - key { [ KP_Add, KP_Add, KP_Add, KP_Add, XF86_Next_VMode ] }; // + }; // Keypad math area with non-CS operators // Copyright © 2006 Nicolas Mailhot // // ┏━━━━━┱─────┬─────┬─────┐ // ┃Num ┃ ∕ ₁ │ . ₂ │ − ₃ │ ₁ // ┃Lock⇭┃ / ÷ │ * × │ - − │ ₂ // ┡━━━━━╃─────┼─────┼─────┤ ₃ // │ + ₄ │ ₄ // │ │ // ┤ │ 1 None // │ │ 2 Level3 ⇮ // │ + + │ 3 Shift+Level3 ⇧⇮ // ╆━━━━━┪ 4 Ctrl+Alt partial keypad_keys xkb_symbols "ossmath" { key.type[Group1]="CTRL+ALT" ; key { [ KP_Divide, 0x1002215, 0x10000F7, VoidSymbol, XF86_Ungrab ] }; // / ∕ ÷ key { [ KP_Multiply, 0x10022C5, 0x10000D7, VoidSymbol, XF86_ClearGrab ] }; // * ⋅ × key { [ KP_Subtract, 0x1002212, 0x1002212, VoidSymbol, XF86_Prev_VMode ] }; // - − − key { [ KP_Add, 0x100002B, 0x100002B, VoidSymbol, XF86_Next_VMode ] }; // + + + }; // Keypad math area with non-CS operators in first levels // As demanded by users not interested in legacy pre-unicode junk // Copyright © 2007 Nicolas Mailhot // // ┏━━━━━┱─────┬─────┬─────┐ // ┃Num ┃ / ₁ │ * ₂ │ - ₃ │ ₁ // ┃Lock⇭┃ ∕ ÷ │ . × │ − − │ ₂ // ┡━━━━━╃─────┼─────┼─────┤ ₃ // │ + ₄ │ ₄ // │ │ // ┤ │ 1 None // │ │ 2 Level3 ⇮ // │ + + │ 3 Shift+Level3 ⇧⇮ // ╆━━━━━┪ 4 Ctrl+Alt partial keypad_keys xkb_symbols "futuremath" { key.type[Group1]="FOUR_LEVEL_X" ; key { [ 0x1002215, KP_Divide, 0x10000F7, XF86_Ungrab ] }; // ∕ / ÷ key { [ 0x10022C5, KP_Multiply, 0x10000D7, XF86_ClearGrab ] }; // ⋅ * × key { [ 0x1002212, KP_Subtract, 0x1002212, XF86_Prev_VMode ] }; // − - − key { [ 0x100002B, KP_Add, 0x100002B, XF86_Next_VMode ] }; // + + + }; // Keypad math area with non-CS operators, restricted to latin9 // Copyright © 2006 Nicolas Mailhot // // ┏━━━━━┱─────┬─────┬─────┐ // ┃Num ┃ / ₁ │ · ₂ │ - ₃ │ ₁ // ┃Lock⇭┃ / ÷ │ * × │ - - │ ₂ // ┡━━━━━╃─────┼─────┼─────┤ ₃ // │ + ₄ │ ₄ // │ │ // ┤ │ 1 None // │ │ 2 Level3 ⇮ // │ + + │ 3 Shift+Level3 ⇧⇮ // ╆━━━━━┪ 4 Ctrl+Alt partial keypad_keys xkb_symbols "ossmath_latin9" { key.type[Group1]="FOUR_LEVEL_X"; key { [ KP_Divide, slash, division, XF86_Ungrab ] }; // / / ÷ key { [ KP_Multiply, periodcentered, multiply, XF86_ClearGrab ] }; // * · × key { [ KP_Subtract, minus, minus, XF86_Prev_VMode ] }; // - - - key { [ KP_Add, plus, plus, XF86_Next_VMode ] }; // + + + }; // Legacy keypad number area // Copyright © 2006 Nicolas Mailhot // // ┏━━━━━┱ // ┃Num ┃ ⇱ Home // ┃Lock⇭┃ ⇲ End // ┡━━━━━╃─────┼─────┼ ⇞ Page up // │ 7 │ 8 │ 9 │ ⇟ Page down // │ ⇱ │ ⇧ │ ⇞ │ ⎀ Insert // ├─────┼─────┼─────┤ ␥ Delete // │ 4 │ 5 │ 6 │ ⇦⇧⇨⇩ Directions // │ ⇦ │ │ ⇨ │ // ├─────┼─────┼─────╆ // │ 1 │ 2 │ 3 ┃ // │ ⇲ │ ⇩ │ ⇟ ┃ 1 None // ├─────┴─────┼─────┨ 2 Num Lock ⇭ // │ 0 │ // │ ⎀ │ // └───────────┴ partial keypad_keys xkb_symbols "legacynumber" { key.type[Group1]="KEYPAD" ; key { [ KP_Home, KP_7 ] }; // 7 key { [ KP_Up, KP_8 ] }; // 8 key { [ KP_Prior, KP_9 ] }; // 9 key { [ KP_Left, KP_4 ] }; // 4 key { [ KP_Begin, KP_5 ] }; // 5 key { [ KP_Right, KP_6 ] }; // 6 key { [ KP_End, KP_1 ] }; // 1 key { [ KP_Down, KP_2 ] }; // 2 key { [ KP_Next, KP_3 ] }; // 3 key { [ KP_Insert, KP_0 ] }; // 0 }; // Legacy Wang 725-3771-ae and 725-3771-uk keypad number area // Copyright © 2007 Nicolas Mailhot // This is actually a three-level keypad, declared as four-level // to avoid defining a new type // // ┏━━━━━┱ // ┃Num ┃ ⇱ Home // ┃Lock⇭┃ ⇲ End // ┡━━━━━╃─────┼─────┼ ⇞ Page up // │ 7 │ 8 │ 9 │ ⇟ Page down // │ ⇱ < │ ⇧ > │ ⇞ ^ │ ⎀ Insert // ├─────┼─────┼─────┤ ␥ Delete // │ 4 │ 5 │ 6 │ ⇦⇧⇨⇩ Directions // │ ⇦ [ │ ] │ ⇨ $ │ // ├─────┼─────┼─────╆ // │ 1 │ 2 │ 3 ┃ // │ ⇲ & │ ⇩ @ │ ⇟ # ┃ 1 None // ├─────┴─────┼─────┨ 2 Num Lock ⇭ // │ 0 │ 3 Level3 ⇮ // │ ⎀ │ // └───────────┴ partial keypad_keys xkb_symbols "legacynumber_wang" { key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ; key { [ KP_Home, KP_7, less ] }; // 7 < key { [ KP_Up, KP_8, greater ] }; // 8 > key { [ KP_Prior, KP_9, asciicircum ] }; // 9 ^ key { [ KP_Left, KP_4, bracketleft ] }; // 4 [ key { [ KP_Begin, KP_5, bracketright ] }; // 5 ] key { [ KP_Right, KP_6, dollar ] }; // 6 $ key { [ KP_End, KP_1, ampersand ] }; // 1 & key { [ KP_Down, KP_2, at ] }; // 2 @ key { [ KP_Next, KP_3, numbersign ] }; // 3 # key { [ KP_Insert, KP_0, apostrophe ] }; // 0 ' }; // Keypad number area with arrow symbols // Copyright © 2006 Nicolas Mailhot // // ┏━━━━━┱ // ┃Num ┃ ⇱ Home // ┃Lock⇭┃ ⇲ End // ┡━━━━━╃─────┼─────┼ ⇞ Page up // │ 7 ⇖ │ 8 ⇑ │ 9 ⇗ │ ⇟ Page down // │ ⇱ ↖ │ ⇧ ↑ │ ⇞ ↗ │ ⎀ Insert // ├─────┼─────┼─────┤ ␥ Delete // │ 4 ⇐ │ 5 ⇔ │ 6 ⇒ │ ⇦⇧⇨⇩ Directions // │ ⇦ ← │ ↔ │ ⇨ → │ ⍽ narrow no-break space // ├─────┼─────┼─────╆ // │ 1 ⇙ │ 2 ⇓ │ 3 ⇘ ┃ // │ ⇲ ↙ │ ⇩ ↓ │ ⇟ ↘ ┃ 1 None // ├─────┴─────┼─────┨ 2 Num Lock ⇭ // │ 0 ⇕ │ 3 Level3 ⇮ // │ ⎀ ↕ │ 4 Shift+Level3 ⇧⇮ // └───────────┴ partial keypad_keys xkb_symbols "ossnumber" { key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ; key { [ KP_Home, KP_7, 0x1002196, 0x10021D6 ] }; // 7 ↖ ⇖ key { [ KP_Up, KP_8, 0x1002191, 0x10021D1 ] }; // 8 ↑ ⇑ key { [ KP_Prior, KP_9, 0x1002197, 0x10021D7 ] }; // 9 ↗ ⇗ key { [ KP_Left, KP_4, 0x1002190, 0x10021D0 ] }; // 4 ← ⇐ key { [ KP_Begin, KP_5, 0x1002194, 0x10021D4 ] }; // 5 ↔ ⇔ key { [ KP_Right, KP_6, 0x1002192, 0x10021D2 ] }; // 6 → ⇒ key { [ KP_End, KP_1, 0x1002199, 0x10021D9 ] }; // 1 ↙ ⇙ key { [ KP_Down, KP_2, 0x1002193, 0x10021D3 ] }; // 2 ↓ ⇓ key { [ KP_Next, KP_3, 0x1002198, 0x10021D8 ] }; // 3 ↘ ⇘ key { [ KP_Insert, KP_0, 0x1002195, 0x10021D5 ] }; // 0 ↕ ⇕ }; // Wang 725-3771-ae and 725-3771-uk keypad number area with additional arrow symbols // Copyright © 2007 Nicolas Mailhot // // ┏━━━━━┱ // ┃Num ┃ ⇱ Home // ┃Lock⇭┃ ⇲ End // ┡━━━━━╃─────┼─────┼ ⇞ Page up // │ 7 ↖ │ 8 ↑ │ 9 ↗ │ ⇟ Page down // │ ⇱ < │ ⇧ > │ ⇞ ^ │ ⎀ Insert // ├─────┼─────┼─────┤ ␥ Delete // │ 4 ← │ 5 ↔ │ 6 → │ ⇦⇧⇨⇩ Directions // │ ⇦ [ │ ] │ ⇨ $ │ ⍽ narrow no-break space // ├─────┼─────┼─────╆ // │ 1 ↙ │ 2 ↓ │ 3 ↘ ┃ // │ ⇲ & │ ⇩ @ │ ⇟ # ┃ 1 None // ├─────┴─────┼─────┨ 2 Num Lock ⇭ // │ 0 ↕ │ 3 Level3 ⇮ // │ ⎀ ' │ 4 Shift+Level3 ⇧⇮ // └───────────┴ partial keypad_keys xkb_symbols "ossnumber_wang" { key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ; key { [ KP_Home, KP_7, less, 0x1002196 ] }; // 7 < ↖ key { [ KP_Up, KP_8, greater, 0x1002191 ] }; // 8 > ↑ key { [ KP_Prior, KP_9, asciicircum, 0x1002197 ] }; // 9 ^ ↗ key { [ KP_Left, KP_4, bracketleft, 0x1002190 ] }; // 4 [ ← key { [ KP_Begin, KP_5, bracketright, 0x1002194 ] }; // 5 ] ↔ key { [ KP_Right, KP_6, dollar, 0x1002192 ] }; // 6 $ → key { [ KP_End, KP_1, ampersand, 0x1002199 ] }; // 1 & ↙ key { [ KP_Down, KP_2, at, 0x1002193 ] }; // 2 @ ↓ key { [ KP_Next, KP_3, numbersign, 0x1002198 ] }; // 3 # ↘ key { [ KP_Insert, KP_0, apostrophe, 0x1002195 ] }; // 0 ' ↕ }; // Standard base "pc" layout only contains cursor keys, and then gets // augmented with the digits later. If you define your own layout for // the numpad you can inherit the cursors, but you'll have to define // the digits yourself. This module can be included in the rules to // define math operators; these are the variants used in computer // languages that are based on ASCII. NoSymbol does not mean that // nothing is bound to the key but that no assignment is done here. // srvr_ctrl(stdkeypad) and keypad(x11) declare the operator keys to // be of type CTRL+ALT in order to assign server control events to // them, but it uses the second level which is overwritten if we have // more than one definition (shift state) for the key. Instead, here // the commands are put at the 4th lever. partial keypad_keys xkb_symbols "ops" { key { [ NoSymbol, slash, NoSymbol, XF86_Ungrab ] }; key { [ NoSymbol, asterisk, NoSymbol, XF86_ClearGrab ] }; key { [ NoSymbol, minus, NoSymbol, XF86_Prev_VMode ] }; key { [ NoSymbol, plus, NoSymbol, XF86_Next_VMode ] }; key { [ NoSymbol, equal ] }; }; // Hexadecimal Numpad, by Roland Kaufmann // License: BSD (also covers variant with ATM digit order) // Third-level gives the letters used in hexadecimal numbers, or // columns in small spreadsheets. As a bonus, having 'e' available at // the center of the keyboard makes it easy to enter floating point // numbers in scientific notation. // Equal is added to start formulas (most numpads on PCs don't have // their own equal key), comma as a list separator (as most // programming languages wants period as a decimal separator) and // colon to enter times and ranges. Someone also may want to represent // multiplication and division in prose using x and colon. // Two first levels are specified as NoSymbol to not override any // previous specification. Combine this with another keypad specifier, // e.g. "legacy". partial keypad_keys xkb_symbols "hex" { key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ; // None NumLock AltGr // symbol row key { [ NoSymbol, NoSymbol, parenleft ] }; key { [ NoSymbol, NoSymbol, parenright ] }; key { [ NoSymbol, NoSymbol, dollar ] }; // upper row key { [ NoSymbol, NoSymbol, a ] }; key { [ NoSymbol, NoSymbol, b ] }; key { [ NoSymbol, NoSymbol, c ] }; // home row key { [ NoSymbol, NoSymbol, d ] }; key { [ NoSymbol, NoSymbol, e ] }; key { [ NoSymbol, NoSymbol, f ] }; key { [ NoSymbol, NoSymbol, comma ] }; // lower row key { [ NoSymbol, NoSymbol, equal ] }; key { [ NoSymbol, NoSymbol, x ] }; key { [ NoSymbol, NoSymbol, colon ] }; // decimal row key { [ NoSymbol, NoSymbol, backslash ] }; }; // Main numbers follows the traditions from ATMs and phones with // numbers increasing downwards to the right. (It is easier to // change the keyboard layout than to reprogram your local ATM; // also cell-phones are becoming more common while calculators are // becoming more rare). // First level is left unspecified, so it may be combined with another // layout, e.g. "legacy". partial keypad_keys xkb_symbols "atm" { // upper row key { [ NoSymbol, KP_1 ] }; key { [ NoSymbol, KP_2 ] }; key { [ NoSymbol, KP_3 ] }; // lower row key { [ NoSymbol, KP_7 ] }; key { [ NoSymbol, KP_8 ] }; key { [ NoSymbol, KP_9 ] }; }; partial modifier_keys xkb_symbols "pointerkeys" { key { [ Num_Lock, Pointer_EnableKeys ] }; }; // Only numbers, operators and decimal separator, // as seen on keypad overlay on Japanese keyboard. // ┌─┬─┬─┬─┐ // │7│8│9│*│ // ├─┼─┼─┼─┤ // │4│5│6│-│ // ├─┼─┼─┼─┤ // │1│2│3│+│ // ├─┼─┼─┼─┤ // │0│ │·│/│ // └─┴─┴─┴─┘ partial keypad_keys xkb_symbols "numoperdecsep" { key { [ KP_7 ] }; key { [ KP_8 ] }; key { [ KP_9 ] }; // ClsGrb kills whichever client has a grab in effect key { type="CTRL+ALT", symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86_ClearGrab ] }; key { [ KP_4 ] }; key { [ KP_5 ] }; key { [ KP_6 ] }; // -VMode switches to the previous video mode key { type="CTRL+ALT", symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86_Prev_VMode ] }; key { [ KP_1 ] }; key { [ KP_2 ] }; key { [ KP_3 ] }; // +VMode switches to the next video mode key { type="CTRL+ALT", symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86_Next_VMode ] }; key { [ KP_0 ] }; key { [ KP_Decimal ] }; // Ungrab cancels server/keyboard/pointer grabs key { type="CTRL+ALT", symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86_Ungrab ] }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8586452 libxkbcommon-0.10.0/test/data/symbols/kpdl0000644000175000017500000000650600000000000020103 0ustar00ranran00000000000000// The key is a mess. // It was probably originally meant to be a decimal separator. // Except since it was declared by USA people it didn't use the original // SI separator "," but a "." (since then the USA managed to f-up the SI // by making "." an accepted alternative, but standards still use "," as // default) // As a result users of SI-abiding countries expect either a "." or a "," // or a "decimal_separator" which may or may not be translated in one of the // above depending on applications. // It's not possible to define a default per-country since user expectations // depend on the conflicting choices of their most-used applications, // operating system, etc. Therefore it needs to be a configuration setting // Copyright © 2007 Nicolas Mailhot // Legacy #1 // This assumes KP_Decimal will be translated in a dot partial keypad_keys xkb_symbols "dot" { key.type[Group1]="KEYPAD" ; key { [ KP_Delete, KP_Decimal ] }; // }; // Legacy #2 // This assumes KP_Separator will be translated in a comma partial keypad_keys xkb_symbols "comma" { key.type[Group1]="KEYPAD" ; key { [ KP_Delete, KP_Separator ] }; // }; // Period , usual keyboard serigraphy in most countries partial keypad_keys xkb_symbols "dotoss" { key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ; key { [ KP_Delete, period, comma, 0x100202F ] }; // . , ⍽ (narrow no-break space) }; // Period , usual keyboard serigraphy in most countries, latin-9 restriction partial keypad_keys xkb_symbols "dotoss_latin9" { key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ; key { [ KP_Delete, period, comma, nobreakspace ] }; // . , ⍽ (no-break space) }; // Comma , what most non anglo-saxon people consider the real separator partial keypad_keys xkb_symbols "commaoss" { key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ; key { [ KP_Delete, comma, period, 0x100202F ] }; // , . ⍽ (narrow no-break space) }; // Momayyez : Bahrain, Iran, Iraq, Kuwait, Oman, Qatar, Saudi Arabia, Syria, UAE partial keypad_keys xkb_symbols "momayyezoss" { key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ; key { [ KP_Delete, 0x100066B, comma, 0x100202F ] }; // ? , ⍽ (narrow no-break space) }; // Abstracted , pray everything will work out (it usually does not) partial keypad_keys xkb_symbols "kposs" { key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ; key { [ KP_Delete, KP_Decimal, KP_Separator, 0x100202F ] }; // ? ? ⍽ (narrow no-break space) }; // Spreadsheets may be configured to use the dot as decimal // punctuation, comma as a thousands separator and then semi-colon as // the list separator. Of these, dot and semi-colon is most important // when entering data by the keyboard; the comma can then be inferred // and added to the presentation afterwards. Using semi-colon as a // general separator may in fact be preferred to avoid ambiguities // in data files. Most times a decimal separator is hard-coded, it // seems to be period, probably since this is the syntax used in // (most) programming languages. partial keypad_keys xkb_symbols "semi" { key.type[Group1]="FOUR_LEVEL_MIXED_KEYPAD" ; key { [ NoSymbol, NoSymbol, semicolon ] }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8619785 libxkbcommon-0.10.0/test/data/symbols/latin0000644000175000017500000003445500000000000020264 0ustar00ranran00000000000000// Common Latin alphabet layout default partial xkb_symbols "basic" { key { [ 1, exclam, onesuperior, exclamdown ] }; key { [ 2, at, twosuperior, oneeighth ] }; key { [ 3, numbersign, threesuperior, sterling ] }; key { [ 4, dollar, onequarter, dollar ] }; key { [ 5, percent, onehalf, threeeighths ] }; key { [ 6, asciicircum, threequarters, fiveeighths ] }; key { [ 7, ampersand, braceleft, seveneighths ] }; key { [ 8, asterisk, bracketleft, trademark ] }; key { [ 9, parenleft, bracketright, plusminus ] }; key { [ 0, parenright, braceright, degree ] }; key { [ minus, underscore, backslash, questiondown ] }; key { [ equal, plus, dead_cedilla, dead_ogonek ] }; key { [ q, Q, at, Greek_OMEGA ] }; key { [ w, W, lstroke, Lstroke ] }; key { [ e, E, e, E ] }; key { [ r, R, paragraph, registered ] }; key { [ t, T, tslash, Tslash ] }; key { [ y, Y, leftarrow, yen ] }; key { [ u, U, downarrow, uparrow ] }; key { [ i, I, rightarrow, idotless ] }; key { [ o, O, oslash, Ooblique ] }; key { [ p, P, thorn, THORN ] }; key { [bracketleft, braceleft, dead_diaeresis, dead_abovering ] }; key { [bracketright, braceright, dead_tilde, dead_macron ] }; key { [ a, A, ae, AE ] }; key { [ s, S, ssharp, section ] }; key { [ d, D, eth, ETH ] }; key { [ f, F, dstroke, ordfeminine ] }; key { [ g, G, eng, ENG ] }; key { [ h, H, hstroke, Hstroke ] }; key { [ j, J, dead_hook, dead_horn ] }; key { [ k, K, kra, ampersand ] }; key { [ l, L, lstroke, Lstroke ] }; key { [ semicolon, colon, dead_acute, dead_doubleacute ] }; key { [apostrophe, quotedbl, dead_circumflex, dead_caron ] }; key { [ grave, asciitilde, notsign, notsign ] }; key { [ backslash, bar, dead_grave, dead_breve ] }; key { [ z, Z, guillemotleft, less ] }; key { [ x, X, guillemotright, greater ] }; key { [ c, C, cent, copyright ] }; key { [ v, V, leftdoublequotemark, leftsinglequotemark ] }; key { [ b, B, rightdoublequotemark, rightsinglequotemark ] }; key { [ n, N, n, N ] }; key { [ m, M, mu, masculine ] }; key { [ comma, less, horizconnector, multiply ] }; key { [ period, greater, periodcentered, division ] }; key { [ slash, question, dead_belowdot, dead_abovedot ] }; }; // Northern Europe ( Danish, Finnish, Norwegian, Swedish) common layout partial xkb_symbols "type2" { include "latin" key { [ 1, exclam, exclamdown, onesuperior ] }; key { [ 2, quotedbl, at, twosuperior ] }; key { [ 3, numbersign, sterling, threesuperior] }; key { [ 4, currency, dollar, onequarter ] }; key { [ 5, percent, onehalf, cent ] }; key { [ 6, ampersand, yen, fiveeighths ] }; key { [ 7, slash, braceleft, division ] }; key { [ 8, parenleft, bracketleft, guillemotleft] }; key { [ 9, parenright, bracketright, guillemotright] }; key { [ 0, equal, braceright, degree ] }; key { [ e, E, EuroSign, cent ] }; key { [ r, R, registered, registered ] }; key { [ t, T, thorn, THORN ] }; key { [ o, O, oe, OE ] }; key { [ aring, Aring, dead_diaeresis, dead_abovering ] }; key { [dead_diaeresis, dead_circumflex, dead_tilde, dead_caron ] }; key { [ a, A, ordfeminine, masculine ] }; key { [ c, C, copyright, copyright ] }; key { [ comma, semicolon, dead_cedilla, dead_ogonek ] }; key { [ period, colon, periodcentered, dead_abovedot ] }; key { [ minus, underscore, dead_belowdot, dead_abovedot ] }; }; // Slavic Latin ( Albanian, Croatian, Polish, Slovene, Yugoslav) // common layout partial xkb_symbols "type3" { include "latin" key { [ q, Q, backslash, Greek_OMEGA ] }; key { [ w, W, bar, Lstroke ] }; key { [ z, Z, leftarrow, yen ] }; key { [ f, F, bracketleft, ordfeminine ] }; key { [ g, G, bracketright, ENG ] }; key { [ k, K, lstroke, ampersand ] }; key { [ y, Y, guillemotleft, less ] }; key { [ v, V, at, grave ] }; key { [ b, B, braceleft, apostrophe ] }; key { [ n, N, braceright, braceright ] }; key { [ m, M, section, masculine ] }; key { [ comma, semicolon, less, multiply ] }; key { [ period, colon, greater, division ] }; }; // Another common Latin layout // (German, Estonian, Spanish, Icelandic, Italian, Latin American, Portuguese) partial xkb_symbols "type4" { include "latin" key { [ 2, quotedbl, at, oneeighth ] }; key { [ 6, ampersand, notsign, fiveeighths ] }; key { [ 7, slash, braceleft, seveneighths ] }; key { [ 8, parenleft, bracketleft, trademark ] }; key { [ 9, parenright, bracketright, plusminus ] }; key { [ 0, equal, braceright, degree ] }; key { [ e, E, EuroSign, cent ] }; key { [ comma, semicolon, horizconnector, multiply ] }; key { [ period, colon, periodcentered, division ] }; key { [ minus, underscore, dead_belowdot, dead_abovedot ] }; }; partial xkb_symbols "nodeadkeys" { key { [ equal, plus, cedilla, ogonek ] }; key { [bracketleft, braceleft, diaeresis, degree ] }; key { [bracketright, braceright, asciitilde, macron ] }; key { [ semicolon, colon, acute, doubleacute ] }; key { [apostrophe, quotedbl, asciicircum, caron ] }; key { [ backslash, bar, grave, breve ] }; key { [ slash, question, dead_belowdot, abovedot ] }; }; partial xkb_symbols "type2_nodeadkeys" { include "latin(nodeadkeys)" key { [ aring, Aring, diaeresis, degree ] }; key { [ diaeresis, asciicircum, asciitilde, caron ] }; key { [ comma, semicolon, cedilla, ogonek ] }; key { [ period, colon, periodcentered, abovedot ] }; key { [ minus, underscore, dead_belowdot, abovedot ] }; }; partial xkb_symbols "type3_nodeadkeys" { include "latin(nodeadkeys)" }; partial xkb_symbols "type4_nodeadkeys" { include "latin(nodeadkeys)" key { [ minus, underscore, dead_belowdot, abovedot ] }; }; // Added 2008.03.05 by Marcin Woliński // See http://marcinwolinski.pl/keyboard/ for a description. // Used by pl(intl) // // ┌─────┐ // │ 2 4 │ 2 = Shift, 4 = Level3 + Shift // │ 1 3 │ 1 = Normal, 3 = Level3 // └─────┘ // ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓ // │ ~ ~ │ ! ' │ @ " │ # ˝ │ $ ¸ │ % ˇ │ ^ ^ │ & ˘ │ * ̇ │ ( ̣ │ ) ° │ _ ¯ │ + ˛ ┃ ⌫ Back- ┃ // │ ` ` │ 1 ¡ │ 2 © │ 3 • │ 4 § │ 5 € │ 6 ¢ │ 7 − │ 8 × │ 9 ÷ │ 0 ° │ - – │ = — ┃ space ┃ // ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫ // ┃ ┃ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ { « │ } » ┃ Enter ┃ // ┃Tab ↹ ┃ q │ w │ e │ r │ t │ y │ u │ i │ o │ p │ [ ‹ │ ] › ┃ ⏎ ┃ // ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃ // ┃ ┃ A │ S │ D │ F │ G │ H │ J │ K │ L │ : “ │ " ” │ | ¶ ┃ ┃ // ┃Caps ⇬ ┃ a │ s │ d │ f │ g │ h │ j │ k │ l │ ; ‘ │ ' ’ │ \ ┃ ┃ // ┣━━━━━━━━┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫ // ┃ │ Z │ X │ C │ V │ B │ N │ M │ < „ │ > · │ ? ¿ ┃ ┃ // ┃Shift ⇧ │ z │ x │ c │ v │ b │ n │ m │ , ‚ │ . … │ / ⁄ ┃Shift ⇧ ┃ // ┣━━━━━━━┳━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛ // ┃ ┃ ┃ ┃ ␣ ⍽ ┃ ┃ ┃ ┃ // ┃Ctrl ┃Meta ┃Alt ┃ ␣ Space ⍽ ┃AltGr ⇮┃Menu ┃Ctrl ┃ // ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛ partial xkb_symbols "intl" { key { [ grave, asciitilde, dead_grave, dead_tilde ] }; key { [ 1, exclam, exclamdown, dead_acute ] }; key { [ 2, at, copyright, dead_diaeresis ] }; key { [ 3, numbersign, U2022, dead_doubleacute ] }; // U+2022 is bullet (the name bullet does not work) key { [ 4, dollar, section, dead_cedilla ] }; key { [ 5, percent, EuroSign, dead_caron ] }; key { [ 6, asciicircum, cent, dead_circumflex ] }; key { [ 7, ampersand, U2212, dead_breve ] }; // U+2212 is MINUS SIGN key { [ 8, asterisk, multiply, dead_abovedot ] }; key { [ 9, parenleft, division, dead_belowdot ] }; key { [ 0, parenright, degree, dead_abovering ] }; key { [ minus, underscore, endash, dead_macron ] }; key { [ equal, plus, emdash, dead_ogonek ] }; key { [ q, Q ] }; key { [ w, W ] }; key { [ e, E ] }; key { [ r, R ] }; key { [ t, T ] }; key { [ y, Y ] }; key { [ u, U ] }; key { [ i, I ] }; key { [ o, O ] }; key { [ p, P ] }; key { [bracketleft, braceleft, U2039, guillemotleft ] }; key { [bracketright, braceright, U203A, guillemotright ] }; key { [ a, A ] }; key { [ s, S ] }; key { [ d, D ] }; key { [ f, F ] }; key { [ g, G ] }; key { [ h, H ] }; key { [ j, J ] }; key { [ k, K ] }; key { [ l, L ] }; key { [ semicolon, colon, leftsinglequotemark, leftdoublequotemark ] }; key { [apostrophe, quotedbl, rightsinglequotemark, rightdoublequotemark ] }; key { [ backslash, bar, NoSymbol, paragraph ] }; key { [ z, Z ] }; key { [ x, X ] }; key { [ c, C ] }; key { [ v, V ] }; key { [ b, B ] }; key { [ n, N ] }; key { [ m, M ] }; key { [ comma, less, singlelowquotemark, doublelowquotemark ] }; key { [ period, greater, ellipsis, periodcentered ] }; key { [ slash, question, U2044, questiondown ] }; // U+2044 is FRACTION SLASH }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8619785 libxkbcommon-0.10.0/test/data/symbols/level30000644000175000017500000001370000000000000020335 0ustar00ranran00000000000000// These partial variants assign ISO_Level3_Shift to various XKB keycodes // so that the third shift level can be reached. // The default behaviour: // the right Alt key (AltGr) chooses the third symbol engraved on a key. default partial modifier_keys xkb_symbols "ralt_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; include "level3(modifier_mapping)" }; // Ensure a mapping to a real modifier for LevelThree. partial modifier_keys xkb_symbols "modifier_mapping" { replace key { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; modifier_map Mod5 { }; }; // The right Alt key never chooses the third level. // This option attempts to undo the effect of a layout's inclusion of // 'ralt_switch'. You may want to also select another level3 option // to map the level3 shift to some other key. partial modifier_keys xkb_symbols "ralt_alt" { key { type[Group1]="TWO_LEVEL", type[Group2]="TWO_LEVEL", type[Group3]="TWO_LEVEL", type[Group4]="TWO_LEVEL", symbols[Group1] = [ Alt_R, Meta_R ], symbols[Group2] = [ Alt_R, Meta_R ], symbols[Group3] = [ Alt_R, Meta_R ], symbols[Group4] = [ Alt_R, Meta_R ] }; modifier_map Mod1 { }; }; // The right Alt key (while pressed) chooses the third shift level, // and Compose is mapped to its second level. partial modifier_keys xkb_symbols "ralt_switch_multikey" { key { type[Group1]="TWO_LEVEL", symbols[Group1] = [ ISO_Level3_Shift, Multi_key ] }; include "level3(modifier_mapping)" }; // A special case of the right-Alt switch -- for use with grp:alts_toggle. hidden partial modifier_keys xkb_symbols "ralt_switch_for_alts_toggle" { virtual_modifiers LAlt, AltGr; key { type[Group1]="PC_RALT_LEVEL2", symbols[Group1] = [ Alt_L, ISO_Prev_Group, ISO_Prev_Group ], virtualMods= LAlt }; key { type[Group1]="PC_ALT_LEVEL2", symbols[Group1] = [ ISO_Level3_Shift, ISO_Next_Group ], virtualMods= AltGr }; include "level3(modifier_mapping)" }; // Either Alt key (while pressed) chooses the third shift level. // (To be used mostly to imitate Mac OS functionality.) partial modifier_keys xkb_symbols "alt_switch" { include "level3(lalt_switch)" include "level3(ralt_switch)" }; // The left Alt key (while pressed) chooses the third shift level. partial modifier_keys xkb_symbols "lalt_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; include "level3(modifier_mapping)" }; // The right Ctrl key (while pressed) chooses the third shift level. partial modifier_keys xkb_symbols "switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; include "level3(modifier_mapping)" }; // The Menu key (while pressed) chooses the third shift level. partial modifier_keys xkb_symbols "menu_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; include "level3(modifier_mapping)" }; // Either Win key (while pressed) chooses the third shift level. partial modifier_keys xkb_symbols "win_switch" { include "level3(lwin_switch)" include "level3(rwin_switch)" }; // The left Win key (while pressed) chooses the third shift level. partial modifier_keys xkb_symbols "lwin_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; include "level3(modifier_mapping)" }; // The right Win key (while pressed) chooses the third shift level. // (When using this map, you should set your keyboard as pc101 or pc102 // instead of pc104 or pc105.) partial modifier_keys xkb_symbols "rwin_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; include "level3(modifier_mapping)" }; // The Enter key on the kepypad (while pressed) chooses the third shift level. // (This is especially useful for Mac laptops which miss the right Alt key.) partial modifier_keys xkb_symbols "enter_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; include "level3(modifier_mapping)" }; // The CapsLock key (while pressed) chooses the third shift level. partial modifier_keys xkb_symbols "caps_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; include "level3(modifier_mapping)" }; // The Backslash key (while pressed) chooses the third shift level. partial modifier_keys xkb_symbols "bksl_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; include "level3(modifier_mapping)" }; // The Less/Greater key (while pressed) chooses the third shift level. partial modifier_keys xkb_symbols "lsgt_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; include "level3(modifier_mapping)" }; // The CapsLock key (while pressed) chooses the third shift level, // and latches when pressed together with another third-level chooser. partial modifier_keys xkb_symbols "caps_switch_latch" { key { type[Group1]="THREE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ] }; include "level3(modifier_mapping)" }; // The Backslash key (while pressed) chooses the third shift level, // and latches when pressed together with another third-level chooser. partial modifier_keys xkb_symbols "bksl_switch_latch" { key { type[Group1]="THREE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ] }; include "level3(modifier_mapping)" }; // The Less/Greater key (while pressed) chooses the third shift level, // and latches when pressed together with another third-level chooser. partial modifier_keys xkb_symbols "lsgt_switch_latch" { key { type[Group1]="THREE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ] }; include "level3(modifier_mapping)" }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8619785 libxkbcommon-0.10.0/test/data/symbols/level50000644000175000017500000001120300000000000020333 0ustar00ranran00000000000000// These partial variants assign ISO_Level5_Shift to various XKB keycodes // so that the fifth shift level can be reached. // The right Ctrl key (while pressed) chooses the fifth shift level. partial modifier_keys xkb_symbols "rctrl_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level5_Shift ] }; include "level5(modifier_mapping)" }; // The Less/Greater key (while pressed) chooses the fifth shift level. partial modifier_keys xkb_symbols "lsgt_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level5_Shift ] }; include "level5(modifier_mapping)" }; // The right Alt key (while pressed) chooses the fifth shift level. partial modifier_keys xkb_symbols "ralt_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level5_Shift ] }; include "level5(modifier_mapping)" }; // The CapsLock key (while pressed) chooses the fifth shift level. partial modifier_keys xkb_symbols "caps_switch" { key { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level5_Shift ] }; include "level5(modifier_mapping)" }; // Ensure a mapping to a real modifier for LevelFive. partial modifier_keys xkb_symbols "modifier_mapping" { replace key { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ ISO_Level5_Shift ] }; modifier_map Mod3 { }; }; // This adds the definitions needed to create a level5-lock behaviour, using // the real modifier NumLock as a lock indicator. // See also: types/level5 : EIGHT_LEVEL_LEVEL_FIVE_LOCK // See also: compat/level5(level5_lock) partial modifier_keys xkb_symbols "lock" { key.type[Group1] = "ONE_LEVEL"; include "level5(modifier_mapping)" replace key { vmods = NumLock, symbols[Group1] = [ NoSymbol ], actions[Group1] = [ SetMods(modifiers=NumLock) ] }; modifier_map Mod2 { }; }; // The following modifier keys are used to switch to the third shift level // and to set a corresponding lock, implemented as NumLock. partial modifier_keys xkb_symbols "lsgt_switch_lock" { include "level5(lock)" key { type[Group1] = "EIGHT_LEVEL", symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ] }; }; partial modifier_keys xkb_symbols "lwin_switch_lock" { include "level5(lock)" key { type[Group1] = "EIGHT_LEVEL", symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ] }; }; partial modifier_keys xkb_symbols "ralt_switch_lock" { include "level5(lock)" key { type[Group1] = "EIGHT_LEVEL", symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ] }; }; partial modifier_keys xkb_symbols "rwin_switch_lock" { include "level5(lock)" key { type[Group1] = "EIGHT_LEVEL", symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ] }; }; partial modifier_keys xkb_symbols "lsgt_switch_lock_cancel" { include "level5(lock)" key { type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK", symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ] }; }; partial modifier_keys xkb_symbols "lwin_switch_lock_cancel" { include "level5(lock)" key { type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK", symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ] }; }; partial modifier_keys xkb_symbols "ralt_switch_lock_cancel" { include "level5(lock)" key { type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK", symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ] }; }; partial modifier_keys xkb_symbols "rwin_switch_lock_cancel" { include "level5(lock)" key { type[Group1] = "EIGHT_LEVEL_LEVEL_FIVE_LOCK", symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ] }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8719783 libxkbcommon-0.10.0/test/data/symbols/macintosh_vndr/0000755000175000017500000000000000000000000022235 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8719783 libxkbcommon-0.10.0/test/data/symbols/macintosh_vndr/apple0000644000175000017500000001176100000000000023267 0ustar00ranran00000000000000// // Keyboard modification for Apple keyboards // partial default modifier_keys xkb_symbols "extended" { key { [ KP_Equal ] }; // The key in the PC's Insert position is sometimes engraved Help (at least // in Switzerland and Great Britain), with Insert sometimes above. But in the // US and Canada, it remains Insert. So this should probably be an XkbOption, // but I have to do more research. // Perhaps Help should be the primary symbol with Insert in the 1st shift-level // key { [ Help, Insert ] }; // The keys next to F12, labeled F13, F14, & F15 generate codes that XFree86 // claims not to generate. I think they should be equivalent to the PC keys // Print Screen / SysRq, Scroll Lock, and Pause. Linux kernel bug? // key { [ F13 ] }; // should be keycode 93 or // key { [ F13 ] }; // should be keycode 118 // key { [ F14 ] }; // should be keycode 123 or // key { [ F14 ] }; // should be keycode 119 // key { [ F15 ] }; // should be keycode 127 or // key { [ F15 ] }; // should be keycode 120 }; partial modifier_keys xkb_symbols "laptop" { include "macintosh_vndr/apple(extended)" // The real numlock key on the iBook (shared with F5) works internally to // the keyboard. It illuminates the Num_Lock led and locks the fn-key to // type only the keypad keys on the letter keys (U=4, I=5, O=6, P=*, etc.). // The key in the Num_lock position is engraved with Clear. override key { [ Clear ] }; // The key engraved Delete sends BKSP. To get Delete, use Shift-Delete override key { [ BackSpace, Delete ] }; // These keyboards only generate a when pressing fn+Alt. This makes // it impossible to get to the third shift level on keys that are on // the fn-keypad, so use the Enter key (right of ) for Mode_switch, // and use fn+Enter (Apple's code for Menu) for KP_Enter. replace key { [ ISO_Level3_Shift ] }; modifier_map Mod5 { ISO_Level3_Shift }; // Linux kernel bug with Menu on macs means this does not work yet // replace key { [ KP_Enter ] }; // should be keycode 117 }; partial modifier_keys xkb_symbols "laptop_bad_switch" { // Kept for backward compatibility include "macintosh_vndr/apple(laptop)" }; // Long Aluminium Keyboards partial function_keys xkb_symbols "alukbd" { // The base is a inet PC keyboard include "pc" // Additional Fxx keys key { [ F13 ] }; key { [ F14 ] }; key { [ F15 ] }; key { [ F16 ] }; key { [ F17 ] }; key { [ F18 ] }; key { [ F19 ] }; // On aluminium keyboards, Num_Lock is replace by Clear replace key { [ Clear ] }; // CAPS key is always Caps_Lock, even for JIS keyboards replace key { [ Caps_Lock ] }; // F1..F12 are multimedia keys when used with the 'Fn' key // Make those multimedia actions available via ISO_Level3_Shift too, // it is useful when the Fn key is remapped to something else (e.g. Insert) key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, XF86KbdBrightnessDown, NoSymbol, XF86_Switch_VT_1 ] }; key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, XF86KbdBrightnessUp, NoSymbol, XF86_Switch_VT_2 ] }; key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, NoSymbol, NoSymbol, XF86_Switch_VT_3 ] }; key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, NoSymbol, NoSymbol, XF86_Switch_VT_4 ] }; key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, NoSymbol, NoSymbol, XF86_Switch_VT_5 ] }; key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, NoSymbol, NoSymbol, XF86_Switch_VT_6 ] }; key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, XF86AudioPrev, NoSymbol, XF86_Switch_VT_7 ] }; key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, XF86AudioPlay, NoSymbol, XF86_Switch_VT_8 ] }; key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, XF86AudioNext, NoSymbol, XF86_Switch_VT_9 ] }; key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, XF86AudioMute, NoSymbol, XF86_Switch_VT_10 ] }; key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, XF86AudioLowerVolume, NoSymbol, XF86_Switch_VT_11 ] }; key { type= "FOUR_LEVEL_X", symbols[Group1]= [ NoSymbol, XF86AudioRaiseVolume, NoSymbol, XF86_Switch_VT_12 ] }; }; // Aluminium Keyboard: make F13, F14, F15 PC-ish (Print, Scroll_Lock, Pause) partial function_keys keypad_keys xkb_symbols "alupckeys" { key { type= "PC_ALT_LEVEL2", symbols[Group1]= [ Print, Sys_Req ] }; key { [ Scroll_Lock ] }; key { type= "PC_CONTROL_LEVEL2", symbols[Group1]= [ Pause, Break ] }; override key { [ Num_Lock, Pointer_EnableKeys ] }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8719783 libxkbcommon-0.10.0/test/data/symbols/macintosh_vndr/us0000644000175000017500000001017400000000000022612 0ustar00ranran00000000000000// symbols definition for a Macintosh "Extended" keyboard default xkb_symbols "extended" { name[Group1]= "USA"; key { [ Escape ] }; key { [ grave, asciitilde ] }; key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, numbersign ] }; key { [ 4, dollar ] }; key { [ 5, percent ] }; key { [ 6, asciicircum ] }; key { [ 7, ampersand ] }; key { [ 8, asterisk ] }; key { [ 9, parenleft ] }; key { [ 0, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ q, Q ] }; key { [ w, W ] }; key { [ e, E ] }; key { [ r, R ] }; key { [ t, T ] }; key { [ y, Y ] }; key { [ u, U ] }; key { [ i, I ] }; key { [ o, O ] }; key { [ p, P ] }; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; key { [ backslash, bar ] }; key { [ a, A ] }; key { [ s, S ] }; key { [ d, D ] }; key { [ f, F ] }; key { [ g, G ] }; key { [ h, H ] }; key { [ j, J ] }; key { [ k, K ] }; key { [ l, L ] }; key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl ] }; key { [ z, Z ] }; key { [ x, X ] }; key { [ c, C ] }; key { [ v, V ] }; key { [ b, B ] }; key { [ n, N ] }; key { [ m, M ] }; key { [ comma, less ] }; key { [ period, greater ] }; key { [ slash, question ] }; key { [ space ] }; include "eurosign(e)" include "keypad(overlay)" key { [ equal ] }; }; hidden xkb_symbols "oldmac" { include "macintosh_vndr/us(extended)" // Begin "Function" section key { [ F1 ] }; key { [ F2 ] }; key { [ F3 ] }; key { [ F4 ] }; key { [ F5 ] }; key { [ F6 ] }; key { [ F7 ] }; key { [ F8 ] }; key { [ F9 ] }; key { [ F10 ] }; key { [ F11 ] }; key { [ F12 ] }; key { [ Print ] }; key { [ Scroll_Lock ] }; key { [ Pause ] }; // End "Function" section // Begin "Editing" section key { [ Insert ] }; key { [ Home ] }; key { [ Prior ] }; key { [ Delete ] }; key { [ End ] }; key { [ Next ] }; key { [ Up ] }; key { [ Left ] }; key { [ Down ] }; key { [ Right ] }; // End "Editing" section key { [ BackSpace ] }; key { [ Tab, ISO_Left_Tab ] }; key { [ Return ] }; key { [ Caps_Lock ] }; key { [ Num_Lock, Pointer_EnableKeys ] }; // Begin "Modifier" section key { [ Shift_L ] }; key { [ Shift_R ] }; key { [ Control_L ] }; key { [ Control_R ] }; key { [ Alt_L, Meta_L ] }; key { [ Alt_R, Meta_R ] }; key { [ Super_L ] }; key { [ Super_R ] }; // End "Modifier" section // begin modifier mappings modifier_map Shift { Shift_L, Shift_R }; modifier_map Lock { Caps_Lock }; modifier_map Control{ Control_L, Control_R }; modifier_map Mod2 { Num_Lock }; // Fake keys for virtual<->real modifiers mapping key { [ ISO_Level3_Shift ] }; key { [ Mode_switch ] }; modifier_map Mod5 { , }; key { [ NoSymbol, Alt_L ] }; modifier_map Mod1 { , }; key { [ NoSymbol, Meta_L ] }; modifier_map Mod1 { }; key { [ NoSymbol, Super_L ] }; modifier_map Mod4 { }; key { [ NoSymbol, Hyper_L ] }; modifier_map Mod4 { }; // end modifier mappings }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8753116 libxkbcommon-0.10.0/test/data/symbols/nbsp0000644000175000017500000001046600000000000020113 0ustar00ranran00000000000000// Let Space key provide No-Break Space (NBSP), Narrow No-Break Space (NNBSP), // Zero-Width Non-Joiner (ZWNJ), and Zero-Width Joiner (ZWJ) for the desired // levels. //////////////////////////////////////// // Only Space partial xkb_symbols "none" { key { type[Group1]="ONE_LEVEL", symbols[Group1]= [ space ] }; }; //////////////////////////////////////// // No-Break Space partial xkb_symbols "level2" { key { type[Group1]="TWO_LEVEL", symbols[Group1]= [ space, nobreakspace ] }; }; // level3 & level3ns provide no-breaking spaces starting from level3 // This is good for typographers but experience shows many users accidently // type no-breaking spaces on the CLI (resulting in errors) // Used by fr(latin9) and lt(std) partial xkb_symbols "level3" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, space, nobreakspace ] }; }; // level3s kills fourth level // Used by ca(multix) partial xkb_symbols "level3s" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, space, nobreakspace, NoSymbol ] }; }; // for this reason pushing no-breaking spaces to level4 is the safe default nowadays partial xkb_symbols "level4" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, space, space, nobreakspace ] }; }; //////////////////////////////////////// // Narrow No-Break Space // level3n provides narrow no-breaking space in addition to the normal one partial xkb_symbols "level3n" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, space, nobreakspace, 0x100202F ] }; }; // level4n provides narrow no-breaking space in addition to the normal one partial xkb_symbols "level4n" { key { type[Group1]="EIGHT_LEVEL", symbols[Group1]= [ space, space, space, nobreakspace, space, 0x100202F, NoSymbol, NoSymbol ] }; }; // level4nl provides narrow no-breaking space in addition to the normal one // without forcing the use of level5 for mostly four-level layouts // Used by fr(oss), be(oss)… partial xkb_symbols "level4nl" { key { type[Group1]="LOCAL_EIGHT_LEVEL", symbols[Group1]= [ space, space, space, nobreakspace, space, 0x100202F, NoSymbol, NoSymbol ] }; }; //////////////////////////////////////// // Zero-Width Non-Joiner & Zero-Width Joiner // Author: Behnam Esfahbod // ZWNJ and ZWJ are widely used in Persian, Kurdinsh, Pashto, Uzbek and other // languages that use PersoArabic script. // ZWNJ on level 2 partial xkb_symbols "zwnj2" { key { type[Group1]="TWO_LEVEL", symbols[Group1]= [ space, 0x100200c ] }; }; // ZWNJ on level 2 // ZWJ on level 3 partial xkb_symbols "zwnj2zwj3" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, 0x100200c, 0x100200d ] }; }; // ZWNJ on level 2 // ZWJ on level 3 // NBSP on level 4 partial xkb_symbols "zwnj2zwj3nb4" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, 0x100200c, 0x100200d, nobreakspace ] }; }; // ZWNJ on level 2 // NBSP on level 3 // Used by ir(ku_ara), af(basic), af(ps), af(uz), af(olpc-fa), af(olpc-ps), af(olpc-uz) partial xkb_symbols "zwnj2nb3" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, 0x100200c, nobreakspace ] }; }; // ZWNJ on level 2 // NBSP on level 3 partial xkb_symbols "zwnj2nb3s" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, 0x100200c, nobreakspace, NoSymbol ] }; }; // ZWNJ on level 2 // NBSP on level 3 // ZWJ on level 4 partial xkb_symbols "zwnj2nb3zwj4" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, 0x100200c, nobreakspace, 0x100200d ] }; }; // ZWNJ on level 2 // NBSP on level 3 // NNBSP on level 4 // Used by ir(pes) partial xkb_symbols "zwnj2nb3nnb4" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, 0x100200c, nobreakspace, 0x100202F ] }; }; // ZWNJ on level 3 // ZWJ on level 4 // Used by in(deva), in(olpc) partial xkb_symbols "zwnj3zwj4" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, space, 0x100200c, 0x100200d ] }; }; // NBSP on level 2 // ZWNJ on level 3 // Used by lk(sin_phonetic) partial xkb_symbols "nb2zwnj3s" { key { type[Group1]="FOUR_LEVEL", symbols[Group1]= [ space, nobreakspace, 0x100200c, NoSymbol ] }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8753116 libxkbcommon-0.10.0/test/data/symbols/pc0000644000175000017500000000452500000000000017552 0ustar00ranran00000000000000default partial alphanumeric_keys modifier_keys xkb_symbols "pc105" { key { [ Escape ] }; // The extra key on many European keyboards: key { [ less, greater, bar, brokenbar ] }; // The following keys are common to all layouts. key { [ backslash, bar ] }; key { [ space ] }; include "srvr_ctrl(fkey2vt)" include "pc(editing)" include "keypad(x11)" key { [ BackSpace, BackSpace ] }; key { [ Tab, ISO_Left_Tab ] }; key { [ Return ] }; key { [ Caps_Lock ] }; key { [ Num_Lock ] }; key { [ Shift_L ] }; key { [ Control_L ] }; key { [ Super_L ] }; key { [ Shift_R ] }; key { [ Control_R ] }; key { [ Super_R ] }; key { [ Menu ] }; // Beginning of modifier mappings. modifier_map Shift { Shift_L, Shift_R }; modifier_map Lock { Caps_Lock }; modifier_map Control{ Control_L, Control_R }; modifier_map Mod2 { Num_Lock }; modifier_map Mod4 { Super_L, Super_R }; // Fake keys for virtual<->real modifiers mapping: key { [ ISO_Level3_Shift ] }; key { [ Mode_switch ] }; modifier_map Mod5 { , }; key { [ NoSymbol, Alt_L ] }; include "altwin(meta_alt)" key { [ NoSymbol, Meta_L ] }; modifier_map Mod1 { }; key { [ NoSymbol, Super_L ] }; modifier_map Mod4 { }; key { [ NoSymbol, Hyper_L ] }; modifier_map Mod4 { }; // End of modifier mappings. key { [ XF86Display ] }; key { [ XF86KbdLightOnOff ] }; key { [ XF86KbdBrightnessDown ] }; key { [ XF86KbdBrightnessUp ] }; }; hidden partial alphanumeric_keys xkb_symbols "editing" { key { type= "PC_ALT_LEVEL2", symbols[Group1]= [ Print, Sys_Req ] }; key { [ Scroll_Lock ] }; key { type= "PC_CONTROL_LEVEL2", symbols[Group1]= [ Pause, Break ] }; key { [ Insert ] }; key { [ Home ] }; key { [ Prior ] }; key { [ Delete ] }; key { [ End ] }; key { [ Next ] }; key { [ Up ] }; key { [ Left ] }; key { [ Down ] }; key { [ Right ] }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.888645 libxkbcommon-0.10.0/test/data/symbols/ru0000644000175000017500000016657100000000000017610 0ustar00ranran00000000000000// Keyboard layouts for Russia. // AEN // 2001/12/23 by Leon Kanter // 2005/12/09 Valery Inozemtsev // Windows layout default partial alphanumeric_keys xkb_symbols "winkeys" { include "ru(common)" name[Group1]= "Russian"; key { [ 3, numerosign ] }; key { [ 4, semicolon ] }; key { [ 5, percent ] }; key { [ 6, colon ] }; key { [ 7, question ] }; key { [ 8, asterisk, U20BD ] }; key { [ period, comma ] }; key { [ backslash, slash ] }; }; hidden partial alphanumeric_keys xkb_symbols "common" { key { [ 1, exclam ] }; key { [ 2, quotedbl ] }; key { [ 3, numbersign ] }; key { [ 4, asterisk ] }; key { [ 5, colon ] }; key { [ 6, comma ] }; key { [ 7, period ] }; key { [ 8, semicolon ] }; key { [ 9, parenleft ] }; key { [ 0, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ backslash, bar ] }; key { [ slash, question ] }; key { [ slash, bar ] }; key { [ Cyrillic_io, Cyrillic_IO ] }; key { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; key { [ Cyrillic_tse, Cyrillic_TSE ] }; key { [ Cyrillic_u, Cyrillic_U ] }; key { [ Cyrillic_ka, Cyrillic_KA ] }; key { [ Cyrillic_ie, Cyrillic_IE ] }; key { [ Cyrillic_en, Cyrillic_EN ] }; key { [ Cyrillic_ghe, Cyrillic_GHE ] }; key { [ Cyrillic_sha, Cyrillic_SHA ] }; key { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; key { [ Cyrillic_ze, Cyrillic_ZE ] }; key { [ Cyrillic_ha, Cyrillic_HA ] }; key { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] }; key { [ Cyrillic_ef, Cyrillic_EF ] }; key { [ Cyrillic_yeru, Cyrillic_YERU ] }; key { [ Cyrillic_ve, Cyrillic_VE ] }; key { [ Cyrillic_a, Cyrillic_A ] }; key { [ Cyrillic_pe, Cyrillic_PE ] }; key { [ Cyrillic_er, Cyrillic_ER ] }; key { [ Cyrillic_o, Cyrillic_O ] }; key { [ Cyrillic_el, Cyrillic_EL ] }; key { [ Cyrillic_de, Cyrillic_DE ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE ] }; key { [ Cyrillic_e, Cyrillic_E ] }; key { [ Cyrillic_ya, Cyrillic_YA ] }; key { [ Cyrillic_che, Cyrillic_CHE ] }; key { [ Cyrillic_es, Cyrillic_ES ] }; key { [ Cyrillic_em, Cyrillic_EM ] }; key { [ Cyrillic_i, Cyrillic_I ] }; key { [ Cyrillic_te, Cyrillic_TE ] }; key { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; key { [ Cyrillic_be, Cyrillic_BE ] }; key { [ Cyrillic_yu, Cyrillic_YU ] }; include "kpdl(comma)" }; partial alphanumeric_keys xkb_symbols "legacy" { include "ru(common)" name[Group1]= "Russian (legacy)"; }; partial alphanumeric_keys xkb_symbols "olpc" { include "ru(common)" key { [ 0x01000451, 0x01000401, grave ] }; // Ñ‘, Ð key { [ 3, numbersign, 0x01002116 ] }; // â„– key { [ 4, dollar, semicolon ] }; key { [ 6, asciicircum, colon ] }; key { [ 7, ampersand ] }; key { [ 9, parenleft, acute ] }; key { [ backslash, bar, slash ] }; include "group(olpc)" }; partial alphanumeric_keys xkb_symbols "typewriter" { include "ru(common)" name[Group1]= "Russian (typewriter)"; key { [ bar, plus ] }; key { [ numerosign, 1 ] }; key { [ minus, 2 ] }; key { [ slash, 3 ] }; key { [ quotedbl, 4 ] }; key { [ colon, 5 ] }; key { [ comma, 6 ] }; key { [ period, 7 ] }; key { [ underscore, 8 ] }; key { [ question, 9 ] }; key { [ percent, 0 ] }; key { [ exclam, equal ] }; key { [ semicolon, backslash ] }; key { [ parenright, parenleft ] }; key { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] }; key { [ Cyrillic_io, Cyrillic_IO ] }; }; partial alphanumeric_keys xkb_symbols "typewriter-legacy" { include "ru(common)" name[Group1]= "Russian (typewriter, legacy)"; key { [ apostrophe, quotedbl ] }; key { [ exclam, 1 ] }; key { [ numerosign, 2 ] }; key { [ slash, 3 ] }; key { [ semicolon, 4 ] }; key { [ colon, 5 ] }; key { [ comma, 6 ] }; key { [ period, 7 ] }; key { [ underscore, 8 ] }; key { [ question, 9 ] }; key { [ percent, 0 ] }; key { [ parenleft, parenright ] }; key { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] }; key { [ Cyrillic_io, Cyrillic_IO ] }; }; partial alphanumeric_keys xkb_symbols "phonetic" { name[Group1]= "Russian (phonetic)"; key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, Cyrillic_io ] }; key { [ 4, Cyrillic_IO ] }; key { [ 5, Cyrillic_hardsign ] }; key { [ 6, Cyrillic_HARDSIGN ] }; key { [ 7, ampersand ] }; key { [ 8, asterisk ] }; key { [ 9, parenleft ] }; key { [ 0, parenright ] }; key { [ minus, underscore ] }; key { [ period, greater ] }; key { [ slash, question ] }; key { [ comma, less ] }; key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl ] }; key { [ bar, brokenbar ] }; key { [ Cyrillic_yu, Cyrillic_YU ] }; key { [ Cyrillic_ya, Cyrillic_YA ] }; key { [ Cyrillic_ze, Cyrillic_ZE ] }; key { [ Cyrillic_es, Cyrillic_ES ] }; key { [ Cyrillic_a, Cyrillic_A ] }; key { [ Cyrillic_ve, Cyrillic_VE ] }; key { [ Cyrillic_tse, Cyrillic_TSE ] }; key { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; key { [ Cyrillic_de, Cyrillic_DE ] }; key { [ Cyrillic_ie, Cyrillic_IE ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE ] }; key { [ Cyrillic_ef, Cyrillic_EF ] }; key { [ Cyrillic_te, Cyrillic_TE ] }; key { [ Cyrillic_er, Cyrillic_ER ] }; key { [ Cyrillic_en, Cyrillic_EN ] }; key { [ Cyrillic_be, Cyrillic_BE ] }; key { [ Cyrillic_ha, Cyrillic_HA ] }; key { [ Cyrillic_ghe, Cyrillic_GHE ] }; key { [ Cyrillic_yeru, Cyrillic_YERU ] }; key { [ Cyrillic_em, Cyrillic_EM ] }; key { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; key { [ Cyrillic_u, Cyrillic_U ] }; key { [ Cyrillic_ka, Cyrillic_KA ] }; key { [ Cyrillic_i, Cyrillic_I ] }; key { [ Cyrillic_o, Cyrillic_O ] }; key { [ Cyrillic_el, Cyrillic_EL ] }; key { [ Cyrillic_pe, Cyrillic_PE ] }; key { [ Cyrillic_sha, Cyrillic_SHA ] }; key { [ Cyrillic_che, Cyrillic_CHE ] }; key { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; key { [ Cyrillic_e, Cyrillic_E ] }; }; partial alphanumeric_keys xkb_symbols "phonetic_winkeys" { include "ru(phonetic)" name[Group1]= "Russian (phonetic, with Win keys)"; key { [ Cyrillic_ha, Cyrillic_HA ] }; key { [ Cyrillic_che, Cyrillic_CHE ] }; key { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; }; partial alphanumeric_keys xkb_symbols "tt" { include "ru(winkeys)" name[Group1]= "Tatar"; key.type[group1]="FOUR_LEVEL"; key { [ 0x010004bb, 0x010004ba, Cyrillic_io, Cyrillic_IO ] }; key { [ 0x010004e9, 0x010004e8, Cyrillic_tse, Cyrillic_TSE ] }; key { [ 0x010004d9, 0x010004d8, Cyrillic_shcha, Cyrillic_SHCHA ] }; key { [ 0x010004af, 0x010004ae, Cyrillic_hardsign, Cyrillic_HARDSIGN ] }; key { [ 0x010004a3, 0x010004a2, Cyrillic_zhe, Cyrillic_ZHE ] }; key { [ 0x01000497, 0x01000496, Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "os_legacy" { include "ru(common)" name[Group1]= "Ossetian (legacy)"; key { [ Cyrillic_e, Cyrillic_E ] }; key { [ Cyrillic_o, Cyrillic_O, Cyrillic_io, Cyrillic_IO ] }; key { [ 0x010004D5, 0x010004D4 ] }; }; partial alphanumeric_keys xkb_symbols "os_winkeys" { include "ru(winkeys)" name[Group1]= "Ossetian (Win keys)"; key { [ Cyrillic_e, Cyrillic_E ] }; key { [ Cyrillic_o, Cyrillic_O, Cyrillic_io, Cyrillic_IO ] }; key { [ 0x010004D5, 0x010004D4 ] }; }; partial alphanumeric_keys xkb_symbols "cv" { include "ru(winkeys)" name[Group1]= "Chuvash"; key.type[group1]="FOUR_LEVEL"; key { [ Cyrillic_u, Cyrillic_U, 0x010004f3, 0x010004f2 ] }; key { [ Cyrillic_ie, Cyrillic_IE, 0x010004d7, 0x010004d6 ] }; key { [ Cyrillic_a, Cyrillic_A, 0x010004d1, 0x010004d0 ] }; key { [ Cyrillic_es, Cyrillic_ES, 0x010004ab, 0x010004aa ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "udm" { include "ru(winkeys)" name[Group1]= "Udmurt"; key.type[group1]="FOUR_LEVEL"; key { [ question, exclam, 1, 1 ] }; key { [ parenleft, quotedbl, 2, 2 ] }; key { [ parenright, numerosign, 3, 3 ] }; key { [ colon, semicolon, 4, 4 ] }; key { [ asterisk, percent, 5, 5 ] }; key { [ 0x010004dd, 0x010004dc, 6, 6 ] }; key { [ 0x010004e7, 0x010004e6, 7, 7 ] }; key { [ 0x010004f5, 0x010004f4, 8, 8 ] }; key { [ 0x010004e5, 0x010004e4, 9, 9 ] }; key { [ 0x010004df, 0x010004de, 0, 0 ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "cv_latin" { include "us(alt-intl)" name[Group1]= "Chuvash (Latin)"; key.type[group1]="FOUR_LEVEL"; key { [ q, Q, 0x01000161, 0x01000160 ] }; key { [ w, W, udiaeresis, Udiaeresis ] }; key { [ e, E, 0x01000115, 0x01000114 ] }; key { [ u, U, udiaeresis, Udiaeresis ] }; key { [ i, I, 0x0100012d, 0x0100012c ] }; key { [ o, O, odiaeresis, Odiaeresis ] }; key { [ a, A, abreve, Abreve ] }; key { [ s, S, scedilla, Scedilla ] }; key { [ g, G, gbreve, Gbreve ] }; key { [ j, J, 0x01000131, 0x01000130 ] }; key { [ c, C, ccedilla, Ccedilla ] }; include "level3(ralt_switch)" }; // Komi language layout // Vlad Shakhov // last changes 2007/10/23 partial alphanumeric_keys xkb_symbols "kom" { include "ru(winkeys)" name[Group1]= "Komi"; key.type[group1]="FOUR_LEVEL_ALPHABETIC"; // cyrilllic o with diaeresis key { [ Cyrillic_o, Cyrillic_O, U04E7, U04E6 ] }; // hard I as additional key for soft Cyrillic_I key { [ Cyrillic_i, Cyrillic_I, Ukrainian_i, Ukrainian_I ] }; include "level3(ralt_switch)" }; // Yakut language layout // 2008/04/23 Yakov Aleksandrov // 2008/04/23 Anatoliy Zhozhikov // 2008/04/23 Aleksandr Varlamov partial alphanumeric_keys xkb_symbols "sah" { include "ru(winkeys)" name[Group1]= "Yakut"; key.type[group1]="FOUR_LEVEL_ALPHABETIC"; key { [ Cyrillic_io, Cyrillic_IO, U04EB, U04EA ] }; key { [ Cyrillic_shorti, Cyrillic_SHORTI, U048B, U048A ] }; key { [ Cyrillic_u, Cyrillic_U, Cyrillic_u_straight, Cyrillic_U_straight ] }; key { [ Cyrillic_ka, Cyrillic_KA, U04C4, U04C3 ] }; key { [ Cyrillic_en, Cyrillic_EN, U04A5, U04A4 ] }; key { [ Cyrillic_ghe, Cyrillic_GHE, U0495, U0494 ] }; key { [ Cyrillic_ze, Cyrillic_ZE, U04E1, U04E0 ] }; key { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_shha, Cyrillic_SHHA ] }; key { [ Cyrillic_o, Cyrillic_O, Cyrillic_o_bar, Cyrillic_O_bar ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE, U0461, U0460 ] }; key { [ Cyrillic_che, Cyrillic_CHE, Cyrillic_u_macron, Cyrillic_U_macron ] }; key { [ Cyrillic_em, Cyrillic_EM, U04C8, U04C7 ] }; key { [ Cyrillic_i, Cyrillic_I, Cyrillic_i_macron, Cyrillic_I_macron ] }; include "level3(ralt_switch)" }; //Kalmyk language layout //based on the Kalmyk language layout: http://soft.oyrat.org/ //Nikolay Korneev //Toli Miron partial alphanumeric_keys xkb_symbols "xal" { include "ru(winkeys)" name[Group1]= "Kalmyk"; key.type[group1]="FOUR_LEVEL"; key { [ question, exclam, 1 ] }; key { [ numerosign, quotedbl, 2 ] }; key { [ Cyrillic_u_straight, Cyrillic_U_straight, 3 ] }; key { [ Cyrillic_schwa, Cyrillic_SCHWA, 4 ] }; key { [ asterisk, percent, 5 ] }; key { [ Cyrillic_en_descender, Cyrillic_EN_descender, 6 ] }; key { [ Cyrillic_o_bar, Cyrillic_O_bar, 7 ] }; key { [ Cyrillic_shha, Cyrillic_SHHA, 8 ] }; key { [ Cyrillic_zhe_descender, Cyrillic_ZHE_descender, 9 ] }; key { [ semicolon, colon, 0 ] }; key { [ parenleft, parenright, Cyrillic_io, Cyrillic_IO ] }; key { [ Cyrillic_tse, Cyrillic_TSE, dollar ] }; key { [ Cyrillic_u, Cyrillic_U, EuroSign ] }; key { [ Cyrillic_ka, Cyrillic_KA, registered ] }; key { [ Cyrillic_ie, Cyrillic_IE, trademark ] }; key { [ Cyrillic_ha, Cyrillic_HA, bracketleft ] }; key { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, bracketright ] }; key { [ Cyrillic_e, Cyrillic_E, apostrophe ] }; key { [ Cyrillic_es, Cyrillic_ES, copyright ] }; key { [ Cyrillic_be, Cyrillic_BE, less ] }; key { [ Cyrillic_yu, Cyrillic_YU, greater ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "dos" { include "ru(common)" name[Group1]= "Russian (DOS)"; key { [ parenright, parenleft ] }; key { [ 4, currency ] }; key { [ 9, question ] }; key { [ 0, percent ] }; key { [ Cyrillic_io, Cyrillic_IO ] }; }; partial alphanumeric_keys xkb_symbols "bak" { include "ru(winkeys)" name[Group1]= "Bashkirian"; key.type[group1]="FOUR_LEVEL"; key { [ 0x010004d9, 0x010004d8, Cyrillic_io, Cyrillic_IO ] }; key { [ exclam, quotedbl, 1, 1 ] }; key { [ 0x010004e9, 0x010004e8, 2, 2 ] }; key { [ 0x010004a1, 0x010004a0, 3, 3 ] }; key { [ 0x01000493, 0x01000492, 4, 4 ] }; key { [ 0x010004ab, 0x010004aa, 5, 5 ] }; key { [ colon, semicolon, 6, 6 ] }; key { [ 0x01000499, 0x01000498, 7, 7 ] }; key { [ 0x010004bb, 0x010004ba, 8, 8 ] }; key { [ question, parenleft, 9, 9 ] }; key { [ numerosign, parenright, 0, 0 ] }; key { [ minus, percent, minus, underscore ] }; key { [ 0x010004af, 0x010004ae, equal, plus ] }; key { [ 0x010004a3, 0x010004a2, backslash, slash ] }; include "level3(ralt_switch)" }; // Serbian characters are added as third-level symbols to Russian keyboard layout. partial alphanumeric_keys xkb_symbols "srp" { include "ru(common)" name[Group1]= "Serbian (Russia)"; key { [ 3, numerosign ] }; key { [ 4, semicolon ] }; key { [ 5, percent ] }; key { [ 6, colon ] }; key { [ 7, question ] }; key { [ 8, asterisk ] }; key { [ period, comma ] }; key { [ backslash, slash ] }; key { [ Cyrillic_shorti, Cyrillic_SHORTI, U458, U408 ] }; key { [ Cyrillic_en, Cyrillic_EN, U45A, U40A ] }; key { [ Cyrillic_el, Cyrillic_EL, U459, U409 ] }; key { [ Cyrillic_de, Cyrillic_DE, U45F, U40F ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE, U452, U402 ] }; key { [ Cyrillic_che, Cyrillic_CHE, U45B, U40B ] }; include "level3(ralt_switch)" }; // Mari language layout // http://www.marlamuter.com/ // Last edit by Viatcheslav Kileev (slavakileev@yandex.ru) partial alphanumeric_keys xkb_symbols "chm" { include "ru(winkeys)" name[Group1]= "Mari"; key.type[group1]="FOUR_LEVEL_ALPHABETIC"; key { [ Cyrillic_a, Cyrillic_A, U04D3, U04D2 ] }; key { [ Cyrillic_u, Cyrillic_U, U04F1, U04F0 ] }; key { [ Cyrillic_yeru, Cyrillic_YERU, U04F9, U04F8 ] }; key { [ Cyrillic_en, Cyrillic_EN, U04A5, U04A4 ] }; key { [ Cyrillic_o, Cyrillic_O, U04E7, U04E6 ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "phonetic_azerty" { include "level3(ralt_switch)" name[Group1]= "Russian (phonetic, AZERTY)"; key { [ ampersand, 1, onesuperior, exclamdown ] }; key { [ eacute, 2, asciitilde, oneeighth ] }; key { [ quotedbl, 3, numbersign, sterling ] }; key { [apostrophe, 4, braceleft, dollar ] }; key { [ parenleft, 5, bracketleft, threeeighths ] }; key { [ minus, 6, bar, fiveeighths ] }; key { [ egrave, 7, grave, seveneighths ] }; key { [underscore, 8, backslash, trademark ] }; key { [ ccedilla, 9, asciicircum, plusminus ] }; key { [ agrave, 0, at, degree ] }; key { [parenright, degree, bracketright, questiondown ] }; key { [ equal, plus, braceright, dead_ogonek ] }; key { [ comma, question, acute, doubleacute ] }; key { [ semicolon, period, horizconnector, multiply ] }; key { [ colon, slash, periodcentered, division ] }; key { [ exclam, section, dead_belowdot, dead_abovedot ] }; key { [ ugrave, percent, asciicircum, caron ] }; key { [ bar, brokenbar ] }; key { [ Cyrillic_yu, Cyrillic_YU ] }; key { [ Cyrillic_ya, Cyrillic_YA ] }; // Q key { [ Cyrillic_ze, Cyrillic_ZE ] }; // Z key { [ Cyrillic_es, Cyrillic_ES ] }; key { [ Cyrillic_a, Cyrillic_A ] }; key { [ Cyrillic_ve, Cyrillic_VE ] }; // W key { [ Cyrillic_tse, Cyrillic_TSE ] }; key { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] }; key { [ Cyrillic_de, Cyrillic_DE ] }; key { [ Cyrillic_ie, Cyrillic_IE ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE ] }; key { [ Cyrillic_ef, Cyrillic_EF ] }; key { [ Cyrillic_te, Cyrillic_TE ] }; key { [ Cyrillic_er, Cyrillic_ER ] }; key { [ Cyrillic_en, Cyrillic_EN ] }; key { [ Cyrillic_be, Cyrillic_BE ] }; key { [ Cyrillic_ha, Cyrillic_HA ] }; key { [ Cyrillic_ghe, Cyrillic_GHE ] }; key { [ Cyrillic_yeru, Cyrillic_YERU ] }; key { [ Cyrillic_em, Cyrillic_EM ] }; // M key { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; key { [ Cyrillic_u, Cyrillic_U ] }; key { [ Cyrillic_ka, Cyrillic_KA ] }; key { [ Cyrillic_i, Cyrillic_I ] }; key { [ Cyrillic_o, Cyrillic_O ] }; key { [ Cyrillic_el, Cyrillic_EL ] }; key { [ Cyrillic_pe, Cyrillic_PE ] }; key { [ Cyrillic_sha, Cyrillic_SHA ] }; key { [ Cyrillic_che, Cyrillic_CHE ] }; key { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; key { [ Cyrillic_e, Cyrillic_E ] }; }; // Russian dvorak phonetic layout // Oleg Zalizniak partial alphanumeric_keys xkb_symbols "phonetic_dvorak" { include "level3(ralt_switch)" name[Group1]= "Russian (phonetic, Dvorak)"; key { [ Cyrillic_yu, Cyrillic_YU ] }; key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, Cyrillic_io ] }; key { [ 4, Cyrillic_IO ] }; key { [ 5, Cyrillic_hardsign ] }; key { [ 6, Cyrillic_HARDSIGN ] }; key { [ 7, ampersand ] }; key { [ 8, asterisk ] }; key { [ 9, parenleft ] }; key { [ 0, parenright ] }; key { [ Cyrillic_sha, Cyrillic_SHA ] }; key { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; key { [ Cyrillic_e, Cyrillic_E ] }; key { [ apostrophe, quotedbl, dead_acute, dead_diaeresis ] }; key { [ comma, less, dead_cedilla, dead_caron ] }; key { [ period, greater, dead_abovedot, periodcentered ] }; key { [ Cyrillic_pe, Cyrillic_PE ] }; key { [ Cyrillic_yeru, Cyrillic_YERU ] }; key { [ Cyrillic_ef, Cyrillic_EF ] }; key { [ Cyrillic_ghe, Cyrillic_GHE ] }; key { [ Cyrillic_tse, Cyrillic_TSE ] }; key { [ Cyrillic_er, Cyrillic_ER ] }; key { [ Cyrillic_el, Cyrillic_EL ] }; key { [ slash, question ] }; key { [ Cyrillic_che, Cyrillic_CHE ] }; key { [ Cyrillic_a, Cyrillic_A ] }; key { [ Cyrillic_o, Cyrillic_O ] }; key { [ Cyrillic_ie, Cyrillic_IE ] }; key { [ Cyrillic_u, Cyrillic_U ] }; key { [ Cyrillic_i, Cyrillic_I ] }; key { [ Cyrillic_de, Cyrillic_DE ] }; key { [ Cyrillic_ha, Cyrillic_HA ] }; key { [ Cyrillic_te, Cyrillic_TE ] }; key { [ Cyrillic_en, Cyrillic_EN ] }; key { [ Cyrillic_es, Cyrillic_ES ] }; key { [ minus, underscore ] }; key { [ semicolon, colon, dead_ogonek, dead_doubleacute ] }; key { [ Cyrillic_ya, Cyrillic_YA ] }; key { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; key { [ Cyrillic_ka, Cyrillic_KA ] }; key { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] }; key { [ Cyrillic_be, Cyrillic_BE ] }; key { [ Cyrillic_em, Cyrillic_EM ] }; key { [ Cyrillic_ve, Cyrillic_VE ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE ] }; key { [ Cyrillic_ze, Cyrillic_ZE ] }; }; partial alphanumeric_keys xkb_symbols "phonetic_fr" { include "fr" include "ru(phonetic_azerty)" name[Group1]= "Russian (phonetic, French)"; }; // Rulemak, Colemak based Russian phonetic layout // contact: Geert Hendrickx // http://forum.colemak.com/viewtopic.php?id=519 partial alphanumeric_keys xkb_symbols "rulemak" { include "us(basic)" name[Group1]= "Russian (Rulemak, phonetic Colemak)"; key { [ Cyrillic_io, Cyrillic_IO, U0300, asciitilde ] }; key { [ 1, exclam, U0301 ] }; key { [ 2, at, U030B ] }; key { [ 3, numerosign, numbersign ] }; key { [ 4, dollar, cent ] }; key { [ 5, percent, EuroSign ] }; key { [ 6, asciicircum, U0306 ] }; key { [ 7, ampersand, U0307 ] }; key { [ 8, asterisk, U20BD ] }; key { [ 9, parenleft, bracketleft ] }; key { [ 0, parenright, bracketright ] }; key { [ minus, underscore, endash, emdash ] }; key { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, equal, plus ] }; key { [ Cyrillic_ya, Cyrillic_YA, q, Q ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE, w, W ] }; key { [ Cyrillic_ef, Cyrillic_EF, f, F ] }; key { [ Cyrillic_pe, Cyrillic_PE, p, P ] }; key { [ Cyrillic_ghe, Cyrillic_GHE, g, G ] }; key { [ Cyrillic_shorti, Cyrillic_SHORTI, j, J ] }; key { [ Cyrillic_el, Cyrillic_EL, l, L ] }; key { [ Cyrillic_u, Cyrillic_U, u, U ] }; key { [ Cyrillic_yeru, Cyrillic_YERU, y, Y ] }; key { [ Cyrillic_yu, Cyrillic_YU, semicolon, colon ] }; key { [ Cyrillic_sha, Cyrillic_SHA, guillemotleft, braceleft ] }; key { [ Cyrillic_shcha, Cyrillic_SHCHA, guillemotright, braceright ] }; key { [ Cyrillic_e, Cyrillic_E, backslash, bar ] }; key { [ Cyrillic_a, Cyrillic_A, a, A ] }; key { [ Cyrillic_er, Cyrillic_ER, r, R ] }; key { [ Cyrillic_es, Cyrillic_ES, s, S ] }; key { [ Cyrillic_te, Cyrillic_TE, t, T ] }; key { [ Cyrillic_de, Cyrillic_DE, d, D ] }; key { [ Cyrillic_che, Cyrillic_CHE, h, H ] }; key { [ Cyrillic_en, Cyrillic_EN, n, N ] }; key { [ Cyrillic_ie, Cyrillic_IE, e, E ] }; key { [ Cyrillic_i, Cyrillic_I, i, I ] }; key { [ Cyrillic_o, Cyrillic_O, o, O ] }; key { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, apostrophe, quotedbl ] }; key { [ Cyrillic_ze, Cyrillic_ZE, z, Z ] }; key { [ Cyrillic_ha, Cyrillic_HA, x, X ] }; key { [ Cyrillic_tse, Cyrillic_TSE, c, C ] }; key { [ Cyrillic_ve, Cyrillic_VE, v, V ] }; key { [ Cyrillic_be, Cyrillic_BE, b, B ] }; key { [ Cyrillic_ka, Cyrillic_KA, k, K ] }; key { [ Cyrillic_em, Cyrillic_EM, m, M ] }; key { [ comma, semicolon, less ] }; key { [ period, colon, greater ] }; key { [ slash, question ] }; key { [ BackSpace, BackSpace, BackSpace, BackSpace ] }; key { [ U0301, asciitilde, grave ] }; key { [ space, space, space, nobreakspace ] }; key { [ Mode_switch, Multi_key ] }; include "level3(ralt_switch)" }; // EXTRAS: // Church Slavonic language layout // based on the Russian standard keyboard // by Aleksandr Andreev and Yuri Shardt // last changes 2010/08/01; contact partial alphanumeric_keys xkb_symbols "chu" { name[Group1]= "Church Slavonic"; key { [ U0457, U0407, U0482, U20DD ] }; // ї Ї ҂ e.g: а⃝ where the last is a combining ten thousands sign key { [ U0461, U0460, U047D, U047C ] }; // ѡ Ѡ ѽ Ѽ key { [ U0454, U0404, U0465, U0464 ] }; // є Є ѥ Ѥ key { [ U046F, U046E, U0469, U0468 ] }; // ѯ Ѯ ѩ Ѩ key { [ U0471, U0470, U046D, U046C ] }; // ѱ Ѱ ѭ Ѭ key { [ U0473, U0472, UA657, UA656 ] }; // ѳ Ѳ iotified A key { [ U0475, U0474, U0477, U0476 ] }; // ѵ Ѵ ѷ Ѷ key { [ U047B, U047A, UA64D, UA64C ] }; // ѻ Ѻ ꙍ Ꙍ key { [ U047F, U047E, U046B, U046A ] }; // ѿ Ѿ ѫ Ѫ key { [ U0455, U0405,parenleft,U002A ] }; // ѕ Ѕ ( * key { [Cyrillic_u,Cyrillic_U,parenright,U0488]}; // у У ) NB: for digraph Ouk, use Cyrillic_o + Cyrillic_u key { [ U0483, U0486, U0487, U005F ] }; // а҃ а҆ а҇, _ (titlo, psili, pokrytie, underscore) key { [ U0301, U0300, U0484, UA67E ] }; // а̀ а́ а҄ ꙾ (oxia, varia, kamora, kavyka) key { [ Cyrillic_shorti, Cyrillic_SHORTI, U0456 ] }; key { [ Cyrillic_tse, Cyrillic_TSE, U2DF0 ] }; key { [ UA64B, UA64A, U2DF9 ] }; // Cyrillic monograph Uk (not U)! key { [ Cyrillic_ka, Cyrillic_KA, U2DE6 ] }; key { [ Cyrillic_ie, Cyrillic_IE, U2DF7 ] }; key { [ Cyrillic_en, Cyrillic_EN, U2DE9 ] }; key { [ Cyrillic_ghe, Cyrillic_GHE, U2DE2 ] }; key { [ Cyrillic_sha, Cyrillic_SHA, U2DF2 ] }; key { [ Cyrillic_shcha, Cyrillic_SHCHA, U2DF3 ] }; key { [ Cyrillic_ze, Cyrillic_ZE, U2DE5 ] }; key { [ Cyrillic_ha, Cyrillic_HA, U2DEF ] }; key { [Cyrillic_hardsign,Cyrillic_HARDSIGN, UA67D ] }; // Payerok key { [ backslash, slash, colon, question ] }; // \ / : ? NB: for Slavonic question, use semicolon key { [ Cyrillic_ef, Cyrillic_EF ] }; key { [ Cyrillic_yeru, Cyrillic_YERU ] }; key { [ Cyrillic_ve, Cyrillic_VE, U2DE1 ] }; key { [ Cyrillic_a, Cyrillic_A, U2DF6 ] }; key { [ Cyrillic_pe, Cyrillic_PE, U2DEB ] }; key { [ Cyrillic_er, Cyrillic_ER, U2DEC ] }; key { [ Cyrillic_o, Cyrillic_O, U2DEA ] }; key { [ Cyrillic_el, Cyrillic_EL, U2DE7 ] }; key { [ Cyrillic_de, Cyrillic_DE, U2DE3 ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE, U2DE4 ] }; key { [ U0463, U0462, U2DFA ] }; // Yat key { [ U0467, U0466, U2DFD ] }; // Small Yus key { [ Cyrillic_che, Cyrillic_CHE, U2DF1 ] }; key { [ Cyrillic_es, Cyrillic_ES, U2DED ] }; key { [ Cyrillic_em, Cyrillic_EM, U2DE8 ] }; key { [ Cyrillic_i, Cyrillic_I ] }; key { [ Cyrillic_te, Cyrillic_TE, U2DEE ] }; key { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] }; key { [ Cyrillic_be, Cyrillic_BE, U2DE0 ] }; key { [ Cyrillic_yu, Cyrillic_YU, U2DFB ] }; key { [ period, comma, semicolon, exclam ] }; }; // RUU (Russian-Ukrainian United keyboard layout). // This is a modified Russian standard keyboard, with the third level containing // Ukrainian and Belorusian alphabetic letters and commonly used Unicode symbols. // For a description see http://wiki.opennet.ru/RUU [in Russian]. // Vasyĺ V. Vercynśkyj // last changes 2011/05/11 // // ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓ // │ ' ~ │ ! ≈ │ " ∞ │ № ₴ │ ; € │ % ‰ │ : ≤ │ ? ≥ │ * × │ ( { │ ) } │ _ – │ + ± ┃ ⌫ ┃ // │ ’ ́ │ 1 ÷ │ 2 ¤ │ 3 § │ 4 $ │ 5 ° │ 6 < │ 7 > │ 8 • │ 9 [ │ 0 ] │ - — │ = ≠ ┃Backspace┃ // ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫ // ┃ ┃ Й │ Ц │ У Ў │ К │ Е Ё │ Н │ Г Ґ │ Ш │ Щ │ З │ Х │ Ъ Ї ┃ Enter ┃ // ┃ Tab ↹ ┃ й │ ц │ у ў │ к ® │ е ё │ н │ г ґ │ ш │ щ │ з │ х │ ъ ї ┃ ⏎ ┃ // ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃ // ┃ Caps ┃ Ф │ Ы І │ В │ А │ П │ Р │ О │ Л │ Д │ Ж │ Э Є │ | ¦ ┃ ┃ // ┃ Lock ⇬ ┃ ф │ ы і │ в │ а │ п │ р │ о │ л │ д │ ж │ э є │ / \ ┃ ┃ // ┣━━━━━━━━┻━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┲━━━┷━━━━━┻━━━━━━┫ // ┃ ┃ Я │ Ч │ С │ М │ И │ Т │ Ь │ Б „ │ Ю “ │ , … ┃ ┃ // ┃ Shift ⇧ ┃ я │ ч │ с © │ м │ и │ т ™ │ ь µ │ б « │ ю » │ . / ┃ Shift ⇧ ┃ // ┣━━━━━━━┳━━┻━━━━┳┷━━━━━┷┱────┴─────┴─────┴─────┴─────┴─────┴┲━━━━┷━━┳━━┻━━━━┳━━━━━━━┳━━━┛ // ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ // ┃ Ctrl ┃ Meta ┃ Alt ┃ Space ┃AltGr ⇮┃ Menu ┃ Ctrl ┃ // ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛ partial alphanumeric_keys xkb_symbols "ruu" { include "ru(common)" name[Group1]= "Russian (with Ukrainian-Belorussian layout)"; key { [ U2019, apostrophe, U0301, asciitilde ] }; // Apostrophe and Stress symbol key { [ 1, exclam, U00F7, U2248 ] }; // Division Sign and Almost Equal To key { [ 2, quotedbl, currency, infinity ] }; key { [ 3, numerosign, U00A7, U20B4 ] }; // Paragraph and Hryvnia sign key { [ 4, semicolon, dollar, EuroSign ] }; key { [ 5, percent, degree, U2030 ] }; // Per Mille Sign key { [ 6, colon, less, U2264 ] }; // Less-Than Or Equal To key { [ 7, question, greater, U2265 ] }; // Greater-Than Or Equal To key { [ 8, asterisk, enfilledcircbullet, U00D7 ] }; // Multiplication Sign key { [ 9, parenleft, bracketleft, braceleft ] }; key { [ 0, parenright, bracketright, braceright ] }; key { [ minus, underscore, emdash, endash ] }; key { [ equal, plus, notequal, plusminus ] }; key { [ Cyrillic_u, Cyrillic_U, Byelorussian_shortu, Byelorussian_SHORTU ] }; key { [ Cyrillic_ka, Cyrillic_KA, registered ] }; // Registered tm key { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] }; key { [ Cyrillic_ghe, Cyrillic_GHE, Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] }; key { [ Cyrillic_ze, Cyrillic_ZE, U00B6 ] }; // Pilcrow Sign key { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, Ukrainian_yi, Ukrainian_YI ] }; key { [ Cyrillic_yeru, Cyrillic_YERU, Ukrainian_i, Ukrainian_I ] }; key { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie, Ukrainian_IE ] }; key { [ slash, bar, backslash, U00A6 ] }; // Broken Bar key { [ Cyrillic_es, Cyrillic_ES, copyright ] }; key { [ Cyrillic_te, Cyrillic_TE, trademark ] }; key { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, U00B5 ] }; // Micro Sign key { [ Cyrillic_be, Cyrillic_BE, guillemotleft, doublelowquotemark ] }; key { [ Cyrillic_yu, Cyrillic_YU, guillemotright, leftdoublequotemark ] }; key { [ period, comma, slash, ellipsis ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "sun_type6" { include "sun_vndr/ru(sun_type6)" }; // Apple layout partial alphanumeric_keys xkb_symbols "mac" { include "ru(common)" name[Group1]= "Russian (Macintosh)"; key { [ less, greater ] }; key { [ 2, quotedbl ] }; key { [ 3, numerosign ] }; key { [ 4, percent ] }; key { [ 5, colon ] }; key { [ 6, comma ] }; key { [ 7, period ] }; key { [ 8, semicolon ] }; key { [ bracketright, bracketleft ] }; key { [ Cyrillic_io, Cyrillic_IO ] }; key { [ Cyrillic_er, Cyrillic_ER, U20BD ] }; include "level3(ralt_switch)" }; // eng: Russian-based polyglot and reactionary keyboard layout // This keyboard layout covers Russian in Petrine 1708 and Bolshevik 1918 variant spelling, Ukrainian, Belorussian, Serbian in its modern and Slavenoserbian variants, and Bulgarian and Slavomacedonian in pre-1945 and post-1945 spelling, // in short all in any dominion prevailing Cyrillic orthographies of modern secular Slavic literary languages, even with dictionary accentuation marks, // but also the most-widespread Church Slavonic spellings, that is all Church-Slavonic in so far as variants can be replaced without loss of meaning – not to speak of Interslavic. // Furthermore, it suffices Romanian Cyrillic, Moldovan Cyrillic, Abkhazian excluding the more clumsy obsoleted forms unlikely to find devotees, Tajik, all Turkic and Mongolic Cyrillic alphabets // and virtually all overlooked languages in Cyrillic reigns at least by combining characters, taking advantage of eight key levels. // This is withal a pan-Cyrillic keyboard layout, or a comprehensive Cyrillic keyboard layout, an universal Cyrillic keyboard layout, a generic Cyrillic keyboard layout. // // rus: Многоязыковая и реакціонная клавіатурная разкладка основана на русскихъ // Сія разкладка покрываетъ русскій въ петровскомъ правописаніи 1708-го года и большевицкомъ 1918-го, украинскій, бѣлорусскій въ современномъ и славяносербскомъ видѣ, и булгарскій и славомацедонскій въ писаніи до и послѣ 1945-го года, // короче всѣ въ какомъ-либо державствѣ преобладающія правописанія, то есть весь церкославянскій, поскольку какъ разные виды буквъ можно возмѣщать безъ потери значенія — не говоря о междуславянскомъ. // Свѣрхъ этого, она подходитъ къ румынской кириллицѣ, къ молдавской кириллицѣ, къ абхазскому за изключеніемъ неуклюжихъ устарѣлыхъ образовъ, у которыхъ невѣроятно что они вообще найдутъ поклонниковъ, къ таджикскому, къ всѣмъ тюрксимъ и монголскимъ кириллицамъ, // и по сути дѣла всѣмъ упущеннымъ языкамъ въ кириллическихъ правленіяхъ хотя бы соединящими сѵмволами, извлѣкая выгоду изъ восьми уровней клавишъ. // Тѣмъ всѣмъ сё всекириллическая клавіатурная разкладка, или всеобъемлющая кириллическая разкладка, или универсальная кириллическая разкладка клавіатуры. // // srp: Многојезиков и реакционаран распоред тастера основан на рускима // Овај распоред покрива руски у петровском правопису 1708-е године и бољшевичком 1918-е године, украјински, белоруски, српски у сувременом и славеносрпском виду, те бугарски и славомакедонски у писању до и после 1945-е године, // укратко све у некој држави преовлађујуће правописе, то је читав црквенословенски, пошто је могуће разне видове слова замењивати без губитка значења — не говорећи о меџусловенском. // Поврх овог, он одговара к румунској ћирилици, к молдавској ћирилици, к абхаскоме с изузетком гломазних застарелих ликова, уз које није вероватно да они најђу поклонике, к таџичкоме, к свим туркијским и монголским ћирилицима, // те у спровођењу свим испуштеним језицима у ћириличким господарствима бар са спајајућим симболима, искориштавајући осам ступњева тастера. // Тиме свим ово је свећирилички тастатуран распоред, или свеобухватан ћирилички распоред тастера, или свеопшти ћирилички тастатуран распоред. partial alphanumeric_keys xkb_symbols "prxn" { name[Group1]= "Russian (Polyglot and Reactionary)"; key.type[Group1]="EIGHT_LEVEL"; key { [ U2019, apostrophe, U0301, U0300, U2053, U2015, U02BC, asciitilde ] }; // Typographic Apostrophe, Apostrophe, Combining Acute, Combining Grave, Swung Dash, Quotation Dash, Modifier Letter Apostrophe, Tilde key { [ 1, exclam, U0304, U0306, U0308, U0311, U0307, U0313 ] }; // 1, !, Combining Macron, Combining Breve, Combining Diaresis, Combining Inverted Breve, Combining Dot Above, Combining Comma Above key { [ 2,quotedbl,numerosign, U20BF, U20B8, U20AE, U00A3, U20B9 ] }; // 2 " № ₿ ₸ ₮ £ ₹ key { [ 3, U00A7, U20B4, currency, U20BD, U20AA, U20BC, U20BE ] }; // 3 § ₴ ¤ ₽ ₪ ₼ ₾ key { [ 4, semicolon, dollar, EuroSign, U0482, U20DD, U0488, U0489 ] }; // 4 ; $ € Thousands Sign, Combining Enclosing Circle, Combining Hundred Thousands, Combining Millions key { [ 5, percent, degree, U2030, UA670, UA671, UA672, UA66F ] }; // 5, %, °, ‰, Combinining Ten Millions, Combining Hundred Millions, Combining Thousand Millions, Combining Vzmet key { [ 6, colon, U0335, U0336, U0483, U0487, UFE2E, UFE2F ] }; // 6, :, Combining Short Stroke Overlay, Combining Long Stroke Overlay, Combining Titlo, Combining Pokrytie, Combining Titlo Left Half, Combining Titlo Right Half key { [ 7, question, U030B, U030F, U030C, U0303, U032C, U0360 ] }; // 7, ?, Combining Double Acute, Combining Double Grave, Combining Caron/Háček, Combining Tilde, Combining Caron/Háček Below, Combining Double Tilde key { [ 8, asterisk, U0331, U0332, U0333, U032F, U032D, U032E ] }; // 8, *, Combining Macron Below, Combining Low Line, Combining Double Low Line, Combining Inverted Breve Below, Combining Circumflex Accent, Combining Breve Below key { [ 9,parenleft, bracketleft, braceleft, U035F, U035D, U035E, U035C ] }; // 9 ( [ { Combining Double Macron Below, Combining Double Breve, Combining Double Macron, Combining Double Breve Below key { [ 0,parenright,bracketright, braceright, U27E8, U27E9, U04A7, U04A6 ] }; // 0 ) ] } ⟨⟩ ҧ Ҧ key { [ minus, underscore, emdash, endash, U2011, U00AD, U2010, U2212 ] }; // Hyphen-Minus, Underscore, Em Dash, En Dash, Non-Breaking-Hyphen, Soft Hyphen, Hyphen, Minus Sign key { [ equal, plus,notequal, U2248, U04FF, U04FE, U050D, U050C ] }; // = + ≠ ≈ ӿ Ӿ ԍ Ԍ key { [ Cyrillic_shorti, Cyrillic_SHORTI, Cyrillic_je, Cyrillic_JE, U04CF, U04C0, U030A, U0325 ] }; // й Й ј Ј ӏ Ӏ, Combining Ring Above and Below key { [ Cyrillic_tse, Cyrillic_TSE, U04B5, U04B4, Cyrillic_u_straight, Cyrillic_U_straight, U051B, U051A ] }; // ц Ц ҵ Ҵ ү Ү ԛ Ԛ key { [ Cyrillic_u, Cyrillic_U, Byelorussian_shortu, Byelorussian_SHORTU, Cyrillic_u_straight_bar,Cyrillic_U_straight_bar, Byelorussian_shortu, Byelorussian_SHORTU ] }; // у У ў Ў ұ Ұ ў Ў key { [ Cyrillic_ka, Cyrillic_KA, Cyrillic_ka_descender,Cyrillic_KA_descender, U049F, U049E, U046F, U046E ] }; // к К Қ қ ҟ Ҟ ѯ Ѯ key { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO, U0463, U0462, UA653, UA652 ] }; // е Е ё Ё ѣ Ѣ ꙓ Ꙓ key { [ Cyrillic_en, Cyrillic_EN, Cyrillic_nje, Cyrillic_NJE, Cyrillic_en_descender, Cyrillic_EN_descender, U04C8, U04C7 ] }; // н Н њ Њ ң Ң ӈ Ӈ key { [ Cyrillic_ghe, Cyrillic_GHE, Ukrainian_ghe_with_upturn,Ukrainian_GHE_WITH_UPTURN, Cyrillic_ghe_bar, Cyrillic_GHE_bar, U04F7, U04F6 ] }; // г Г Ґ ґ ғ Ғ ӷ Ӷ key { [ Cyrillic_sha, Cyrillic_SHA, U04A1, U04A0, U04AB, U04AA, UA67D, UA67F ] }; // ш Ш ҡ Ҡ ҫ Ҫ Combining Payerok Payerok key { [ Cyrillic_shcha, Cyrillic_SHCHA, U0505, U0504, UA68D, UA68C, U050F, U050E ] }; // щ Щ ԅ Ԅ ꚍ Ꚍ ԏ Ԏ key { [ Cyrillic_ze, Cyrillic_ZE, U04E1, U04E0, U0499, U0498, U0507, U0506 ] }; // з З ӡ Ӡ ҙ Ҙ ԇ Ԇ key { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_shha, Cyrillic_SHHA, Cyrillic_ha_descender, Cyrillic_HA_descender, U04FD, U04FC ] }; // х Х һ Һ ҳ Ҳ ӽ Ӽ key { [Cyrillic_hardsign,Cyrillic_HARDSIGN, Ukrainian_yi, Ukrainian_YI, Macedonia_dse, Macedonia_DSE, U033E, U2E2F ] }; // ъ Ъ ї Ї ѕ Ѕ, Combining Yerok, Yerok key { [ Cyrillic_ef, Cyrillic_EF, U0473, U0472, U04C4, U04C3, U04FB, U04FA ] }; // ф Ф ѳ Ѳ ӄ Ӄ ӻ Ӻ key { [ Cyrillic_yeru, Cyrillic_YERU, Ukrainian_i, Ukrainian_I, U04D5, U04D4, U04A9, U04A8 ] }; // ы Ы і І ӕ Ӕ ҩ Ҩ key { [ Cyrillic_ve, Cyrillic_VE, U051D, U051C, U0529, U0528, U0527, U0526 ] }; // в В ԝ Ԝ ԩ Ԩ ԧ Ԧ key { [ Cyrillic_a, Cyrillic_A, U04D9, U04D8, UA657, UA656, UA655, UA654 ] }; // а А ә Ә ꙗ Ꙗ ꙕ Ꙕ key { [ Cyrillic_pe, Cyrillic_PE, U0525, U0524, U0471, U0470, UA65F, UA65E ] }; // п П ԥ Ԥ ѱ Ѱ ꙟ Ꙟ key { [ Cyrillic_er, Cyrillic_ER, U0481, U0480, U048F, U048E, U0521, U0520 ] }; // р Р ҁ Ҁ ҏ Ҏ ԡ Ԡ key { [ Cyrillic_o, Cyrillic_O, Cyrillic_o_bar, Cyrillic_O_bar, U047B, U047A, U0461, U0460 ] }; // о О ө Ө ѻ Ѻ ѡ Ѡ key { [ Cyrillic_el, Cyrillic_EL, Cyrillic_lje, Cyrillic_LJE, U04C6, U04C5, U052F, U052E ] }; // л Л љ Љ ӆ Ӆ ԯ Ԯ key { [ Cyrillic_de, Cyrillic_DE, Cyrillic_dzhe, Cyrillic_DZHE, U04BD, U04BC, U04BF, U04BE ] }; // д Д џ Џ ҽ Ҽ ҿ Ҿ key { [ Cyrillic_zhe, Cyrillic_ZHE, Serbian_dje, Serbian_DJE, Cyrillic_zhe_descender, Cyrillic_ZHE_descender, U04C2, U04C1 ] }; // ж Ж ђ Ђ Җ җ ӂ Ӂ key { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie, Ukrainian_IE, U0465, U0464, U04CA, U04C9 ] }; // э Э є Є ѥ Ѥ ӊ Ӊ key { [ slash, bar, backslash, U260E, UA65B, UA65A, U0513, U0512 ] }; // / | \ ☎ ꙛ Ꙛ ԓ Ԓ key { [ U0495, U0494, U0501, U0500, U0503, U0502, U0509, U0508 ] }; // ҕ Ҕ ԁ Ԁ ԃ Ԃ ԉ Ԉ key { [ Cyrillic_ya, Cyrillic_YA, U0469, U0468, U0467, U0466, UA657, UA656 ] }; // я Я ѩ Ѩ ѧ Ѧ ꙗ Ꙗ key { [ Cyrillic_che, Cyrillic_CHE, Serbian_tshe, Serbian_TSHE, U04B7, U04B6, U2016, U00A6 ] }; // ч Ч ћ Ћ ҷ Ҷ ‖ ¦ key { [ Cyrillic_es, Cyrillic_ES, U046D, U046C, U046B, U046A, U04F7, U04F6 ] }; // с С ѭ Ѭ ѫ Ѫ ӷ Ӷ key { [ Cyrillic_em, Cyrillic_EM, multiply, U00F7, U22C5, U2219, U04CE, U04CD ] }; // м М × ÷ ⋅ ∙ ӎ Ӎ key { [ Cyrillic_i, Cyrillic_I, U0475, U0474, U048B, U048A, periodcentered, U261B ] }; // и И ѵ Ѵ ҋ Ҋ · ☛ key { [ Cyrillic_te, Cyrillic_TE, U04AD, U04AC, U051F, U051E, Cyrillic_che_vertstroke,Cyrillic_CHE_vertstroke]}; // т Т ҭ Ҭ ԟ Ԟ ҹ Ҹ key { [Cyrillic_softsign,Cyrillic_SOFTSIGN, U04A5, U04A4, UA64F, UA64E, U048D, U048C ] }; // ь Ь ҥ Ҥ ꙏ Ꙏ ҍ Ҍ key { [ Cyrillic_be, Cyrillic_BE, guillemotleft, doublelowquotemark, singlelowquotemark, U2039, U0523, U0522 ] }; // б Б « „ ‚ ‹ ԣ Ԣ key { [ Cyrillic_yu, Cyrillic_YU, guillemotright, leftdoublequotemark, leftsinglequotemark, U203A, rightdoublequotemark, rightsinglequotemark]}; // ю Ю » “ ‘ › ” ’ key { [ period, comma, ellipsis, enfilledcircbullet, U04CC, U04CB, UA649, UA648 ] }; // . , … • ӌ Ӌ ꙉ Ꙉ // eng: Maps Right Alt for reaching the third level // rus: Составляетъ правую Alt для достиженія третьяго уровня // srp: Саставља десни Alt за достизање трећег ступња include "level3(ralt_switch)" // eng: Maps for reaching the fifth level // rus: Составляетъ для достиженія пятаго уровня // srp: Саставља за достизање петег ступња include "level5(caps_switch)" // eng: Offers pressing both shift keys for capslock // rus: Предоставляетъ нажатие обѣихъ клавишъ Shift для защелкиванія прописности буквъ // srp: Ставља на располагање притискивање обију тастера Shift за учвршћивање верзала include "shift(both_shiftlock)" // eng: Makes return comma instead of dot, as the comma is decimal separator in Cyrillic written languages // rus: Дѣлаетъ что отдаетъ запятую вмѣсто точки, такъ какъ запятая десятичный раздѣлитель въ языкахъ пишемыхъ кириллицей // srp: Ради да враћа зарез уместо точке, будући да зарез је десетни разделитељ у језицима који се пишу ћирилицом include "kpdl(comma)" // eng: Bug notice: One has to set lv5:rwin_switch_lock or one of the other level 5 locks for the caps switch to work! // rus: Приходится ставить lv5:rwin_switch_lock либо одинъ изъ другихъ затворовъ пятаго уровня, чтобы работалъ переключатель Caps! // srp: Потребно да се ставља lv5:rwin_switch_lock или једна из других брава петег ступња, да би шљакао пребацивач Caps! // https://bugs.freedesktop.org/show_bug.cgi?id=102189 }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.888645 libxkbcommon-0.10.0/test/data/symbols/rupeesign0000644000175000017500000000020300000000000021136 0ustar00ranran00000000000000// keyboards having the RupeeSign on the 4 key partial xkb_symbols "4" { key { [ NoSymbol, NoSymbol, U20B9 ] }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.888645 libxkbcommon-0.10.0/test/data/symbols/shift0000644000175000017500000000430000000000000020254 0ustar00ranran00000000000000// Cancel CapsLock when a Shift key is pressed. partial modifier_keys xkb_symbols "breaks_caps" { key { type = "ALPHABETIC", actions [Group1] = [ SetMods(modifiers=Shift), SetMods(modifiers=Shift+Lock,clearLocks) ] }; key { type = "ALPHABETIC", actions [Group1] = [ SetMods(modifiers=Shift), SetMods(modifiers=Shift+Lock,clearLocks) ] }; }; // Toggle CapsLock when pressed together with the other Shift key. partial modifier_keys xkb_symbols "lshift_both_capslock" { key { type[Group1]="TWO_LEVEL", symbols[Group1] = [ Shift_L, Caps_Lock ] }; }; // Toggle CapsLock when pressed together with the other Shift key. partial modifier_keys xkb_symbols "rshift_both_capslock" { key { type[Group1]="TWO_LEVEL", symbols[Group1] = [ Shift_R, Caps_Lock ] }; }; partial modifier_keys xkb_symbols "both_capslock" { include "shift(lshift_both_capslock)" include "shift(rshift_both_capslock)" }; // Set CapsLock when pressed with the other Shift key, release it when pressed alone. partial modifier_keys xkb_symbols "lshift_both_capslock_cancel" { key { type[Group1]="ALPHABETIC", symbols[Group1] = [ Shift_L, Caps_Lock ] }; }; // Set CapsLock when pressed with the other Shift key, release it when pressed alone. partial modifier_keys xkb_symbols "rshift_both_capslock_cancel" { key { type[Group1]="ALPHABETIC", symbols[Group1] = [ Shift_R, Caps_Lock ] }; }; partial modifier_keys xkb_symbols "both_capslock_cancel" { include "shift(lshift_both_capslock_cancel)" include "shift(rshift_both_capslock_cancel)" }; // Toggle ShiftLock when pressed together with the other Shift key. partial modifier_keys xkb_symbols "lshift_both_shiftlock" { key { type[Group1]="TWO_LEVEL", symbols[Group1] = [ Shift_L, Shift_Lock ] }; }; // Toggle ShiftLock when pressed together with the other Shift key. partial modifier_keys xkb_symbols "rshift_both_shiftlock" { key { type[Group1]="TWO_LEVEL", symbols[Group1] = [ Shift_R, Shift_Lock ] }; }; partial modifier_keys xkb_symbols "both_shiftlock" { include "shift(lshift_both_shiftlock)" include "shift(rshift_both_shiftlock)" }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.888645 libxkbcommon-0.10.0/test/data/symbols/srvr_ctrl0000644000175000017500000000443300000000000021166 0ustar00ranran00000000000000// Actions which control the server's behavior. partial keypad_keys function_keys xkb_symbols "xfree86" { include "keypad(operators)" include "srvr_ctrl(fkey2vt)" }; partial function_keys xkb_symbols "fkey2vt" { key { type="CTRL+ALT", symbols[Group1]= [ F1, F1, F1, F1, XF86_Switch_VT_1 ] }; key { type="CTRL+ALT", symbols[Group1]= [ F2, F2, F2, F2, XF86_Switch_VT_2 ] }; key { type="CTRL+ALT", symbols[Group1]= [ F3, F3, F3, F3, XF86_Switch_VT_3 ] }; key { type="CTRL+ALT", symbols[Group1]= [ F4, F4, F4, F4, XF86_Switch_VT_4 ] }; key { type="CTRL+ALT", symbols[Group1]= [ F5, F5, F5, F5, XF86_Switch_VT_5 ] }; key { type="CTRL+ALT", symbols[Group1]= [ F6, F6, F6, F6, XF86_Switch_VT_6 ] }; key { type="CTRL+ALT", symbols[Group1]= [ F7, F7, F7, F7, XF86_Switch_VT_7 ] }; key { type="CTRL+ALT", symbols[Group1]= [ F8, F8, F8, F8, XF86_Switch_VT_8 ] }; key { type="CTRL+ALT", symbols[Group1]= [ F9, F9, F9, F9, XF86_Switch_VT_9 ] }; key { type="CTRL+ALT", symbols[Group1]= [ F10, F10, F10, F10, XF86_Switch_VT_10 ] }; key { type="CTRL+ALT", symbols[Group1]= [ F11, F11, F11, F11, XF86_Switch_VT_11 ] }; key { type="CTRL+ALT", symbols[Group1]= [ F12, F12, F12, F12, XF86_Switch_VT_12 ] }; }; partial function_keys keypad_keys xkb_symbols "no_srvr_keys" { key.type="TWO_LEVEL"; key { [ F1, F1 ] }; key { [ F2, F2 ] }; key { [ F3, F3 ] }; key { [ F4, F4 ] }; key { [ F5, F5 ] }; key { [ F6, F6 ] }; key { [ F7, F7 ] }; key { [ F8, F8 ] }; key { [ F9, F9 ] }; key { [ F10, F10 ] }; key { [ F11, F11 ] }; key { [ F12, F12 ] }; key { [ KP_Divide, KP_Divide ] }; key { [ KP_Multiply, KP_Multiply ] }; key { [ KP_Subtract, KP_Subtract ] }; key { [ KP_Add, KP_Add ] }; }; partial function_keys xkb_symbols "grab_debug" { key { type="CTRL+ALT", symbols[Group1]= [ F11, F11, F11, F11, XF86LogGrabInfo ] }; key { type="CTRL+ALT", symbols[Group1]= [ F12, F12, F12, F12, XF86LogWindowTree ] }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.888645 libxkbcommon-0.10.0/test/data/symbols/terminate0000644000175000017500000000031000000000000021124 0ustar00ranran00000000000000default partial modifier_keys xkb_symbols "ctrl_alt_bksp" { key { type="CTRL+ALT", symbols[Group1] = [ NoSymbol, NoSymbol, NoSymbol, NoSymbol, Terminate_Server ] }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8986447 libxkbcommon-0.10.0/test/data/symbols/us0000644000175000017500000023126600000000000017603 0ustar00ranran00000000000000default partial alphanumeric_keys modifier_keys xkb_symbols "basic" { name[Group1]= "English (US)"; key { [ grave, asciitilde ] }; key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, numbersign ] }; key { [ 4, dollar ] }; key { [ 5, percent ] }; key { [ { H, E, L, L, O }, asciicircum ] }; key { [ { Y, E, S, space, T, H, I, S, space, I, S, space, D, O, G }, ampersand ] }; key { [ 8, asterisk ] }; key { [ 9, parenleft ] }; key { [ 0, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ q, Q ] }; key { [ w, W ] }; key { [ e, E ] }; key { [ r, R ] }; key { [ t, T ] }; key { [ y, Y ] }; key { [ u, U ] }; key { [ i, I ] }; key { [ o, O ] }; key { [ p, P ] }; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; key { [ a, A ] }; key { [ s, S ] }; key { [ d, D ] }; key { [ f, F ] }; key { [ g, G ] }; key { [ h, H ] }; key { [ j, J ] }; key { [ k, K ] }; key { [ l, L ] }; key { [ semicolon, colon ] }; key { [ apostrophe, quotedbl ] }; key { [ z, Z ] }; key { [ x, X ] }; key { [ c, C ] }; key { [ v, V ] }; key { [ b, B ] }; key { [ n, N ] }; key { [ m, M ] }; key { [ comma, less ] }; key { [ period, greater ] }; key { [ slash, question ] }; key { [ backslash, bar ] }; }; partial alphanumeric_keys xkb_symbols "euro" { include "us(basic)" name[Group1]= "English (US, euro on 5)"; include "eurosign(5)" include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "ibm238l" { include "us(basic)" name[Group1]= "English (US, IBM Arabic 238_L)"; key { [ comma, comma ] }; key { [ period, period ] }; key { [ quoteleft, asciitilde ] }; key { [ backslash, bar ] }; key { [ leftcaret, rightcaret ] }; }; partial alphanumeric_keys xkb_symbols "intl" { include "us(basic)" name[Group1]= "English (US, intl., with dead keys)"; key { [dead_grave, dead_tilde, grave, asciitilde ] }; key { [ 1, exclam, exclamdown, onesuperior ] }; key { [ 2, at, twosuperior, dead_doubleacute ] }; key { [ 3, numbersign, threesuperior, dead_macron ] }; key { [ 4, dollar, currency, sterling ] }; key { [ 5, percent, EuroSign, dead_cedilla ] }; key { [ 6, dead_circumflex, onequarter, asciicircum ] }; key { [ 7, ampersand, onehalf, dead_horn ] }; key { [ 8, asterisk, threequarters, dead_ogonek ] }; key { [ 9, parenleft, leftsinglequotemark, dead_breve ] }; key { [ 0, parenright, rightsinglequotemark, dead_abovering ] }; key { [ minus, underscore, yen, dead_belowdot ] }; key { [ equal, plus, multiply, division ] }; key { [ q, Q, adiaeresis, Adiaeresis ] }; key { [ w, W, aring, Aring ] }; key { [ e, E, eacute, Eacute ] }; key { [ r, R, registered, registered ] }; key { [ t, T, thorn, THORN ] }; key { [ y, Y, udiaeresis, Udiaeresis ] }; key { [ u, U, uacute, Uacute ] }; key { [ i, I, iacute, Iacute ] }; key { [ o, O, oacute, Oacute ] }; key { [ p, P, odiaeresis, Odiaeresis ] }; key { [ bracketleft, braceleft, guillemotleft, leftdoublequotemark ] }; key { [bracketright, braceright, guillemotright, rightdoublequotemark ] }; key { [ a, A, aacute, Aacute ] }; key { [ s, S, ssharp, section ] }; key { [ d, D, eth, ETH ] }; key { [ f, F, f, F ] }; key { [ g, G, g, G ] }; key { [ h, H, h, H ] }; key { [ j, J, j, J ] }; key { [ k, K, oe, OE ] }; key { [ l, L, oslash, Ooblique ] }; key { [ semicolon, colon, paragraph, degree ] }; key { [dead_acute, dead_diaeresis, apostrophe, quotedbl ] }; key { [ z, Z, ae, AE ] }; key { [ x, X, x, X ] }; key { [ c, C, copyright, cent ] }; key { [ v, V, v, V ] }; key { [ b, B, b, B ] }; key { [ n, N, ntilde, Ntilde ] }; key { [ m, M, mu, mu ] }; key { [ comma, less, ccedilla, Ccedilla ] }; key { [ period, greater, dead_abovedot, dead_caron ] }; key { [ slash, question, questiondown, dead_hook ] }; key { [ backslash, bar, notsign, brokenbar ] }; key { [ backslash, bar, backslash, bar ] }; include "level3(ralt_switch)" }; // Based on symbols/us_intl keyboard map: // Dead-keys definition for a very simple US/ASCII layout. // by Conectiva (http://www.conectiva.com.br) // modified by Ricardo Y. Igarashi (iga@that.com.br) // Added the following deadkeys, to make it truly international: // // dead_macron: on AltGr-minus // dead_breve: on AltGr-parenleft // dead_abovedot: on AltGr-period // dead_abovering: on AltGr-0 // dead_doubleacute: on AltGr-equal (as quotedbl is already used) // dead_caron: on AltGr-less (AltGr-shift-comma) // dead_cedilla: on AltGr-comma // dead_ogonek: on AltGr-semicolon // dead_belowdot: on AltGr-underscore (AltGr-shift-minus) // dead_hook: on AltGr-question // dead_horn: on AltGr-plus (AltGr-shift-equal) // dead_diaeresis: on AltGr-colon (Alt-shift-semicolon) // // those were already there: // dead_grave // dead_acute // dead_circumflex // dead_tilde // dead_diaeresis partial alphanumeric_keys xkb_symbols "alt-intl" { include "us" name[Group1]= "English (US, alt. intl.)"; key { [ dead_grave, dead_tilde, grave, asciitilde ] }; key { [ 5, percent, EuroSign ] }; key { [ 6, dead_circumflex, asciicircum, asciicircum ] }; key { [ 9, parenleft, leftsinglequotemark, dead_breve ] }; key { [ 0, parenright, rightsinglequotemark, dead_abovering ] }; key { [ minus, underscore, dead_macron, dead_belowdot ] }; key { [ equal, plus, dead_doubleacute, dead_horn ] }; key { [ e, E, EuroSign, cent ] }; key { [ semicolon, colon, dead_ogonek, dead_diaeresis ] }; key { [ dead_acute, dead_diaeresis, apostrophe, quotedbl ] }; key { [ comma, less, dead_cedilla, dead_caron ] }; key { [ period, greater, dead_abovedot, dead_circumflex ] }; key { [ slash, question, dead_hook, dead_hook ] }; key { [ backslash, bar, backslash, bar ] }; include "level3(ralt_switch)" }; // based on a keyboard map from an 'xkb/symbols/dk' file partial alphanumeric_keys xkb_symbols "dvorak" { name[Group1]= "English (Dvorak)"; key { [ grave, asciitilde, dead_grave, dead_tilde ] }; key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, numbersign ] }; key { [ 4, dollar ] }; key { [ 5, percent ] }; key { [ 6, asciicircum, dead_circumflex, dead_circumflex ] }; key { [ 7, ampersand ] }; key { [ 8, asterisk ] }; key { [ 9, parenleft, dead_grave] }; key { [ 0, parenright ] }; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright, dead_tilde] }; key { [ apostrophe, quotedbl, dead_acute, dead_diaeresis ] }; key { [ comma, less, dead_cedilla, dead_caron ] }; key { [ period, greater, dead_abovedot, periodcentered ] }; key { [ p, P ] }; key { [ y, Y ] }; key { [ f, F ] }; key { [ g, G ] }; key { [ c, C ] }; key { [ r, R ] }; key { [ l, L ] }; key { [ slash, question ] }; key { [ equal, plus ] }; key { [ a, A ] }; key { [ o, O ] }; key { [ e, E ] }; key { [ u, U ] }; key { [ i, I ] }; key { [ d, D ] }; key { [ h, H ] }; key { [ t, T ] }; key { [ n, N ] }; key { [ s, S ] }; key { [ minus, underscore ] }; key { [ semicolon, colon, dead_ogonek, dead_doubleacute ] }; key { [ q, Q ] }; key { [ j, J ] }; key { [ k, K ] }; key { [ x, X ] }; key { [ b, B ] }; key { [ m, M ] }; key { [ w, W ] }; key { [ v, V ] }; key { [ z, Z ] }; key { [ backslash, bar ] }; }; // Dvorak intl., with dead keys // Olivier Mehani (shtrom-xorg@ssji.net) // Reproduce the per-key mapping of us(intl) for the dvorak layout // aka "I just swapped my keys over" partial alphanumeric_keys xkb_symbols "dvorak-intl" { include "us(dvorak)" name[Group1]= "English (Dvorak, intl., with dead keys)"; key { [dead_grave, dead_tilde, grave, asciitilde ] }; key { [ 1, exclam, exclamdown, onesuperior ] }; key { [ 2, at, twosuperior, dead_doubleacute ] }; key { [ 3, numbersign, threesuperior, dead_macron ] }; key { [ 4, dollar, currency, sterling ] }; key { [ 5, percent, EuroSign, dead_cedilla ] }; key { [ 6, dead_circumflex, onequarter, asciicircum ] }; key { [ 7, ampersand, onehalf, dead_horn ] }; key { [ 8, asterisk, threequarters, dead_ogonek ] }; key { [ 9, parenleft, leftsinglequotemark, dead_breve ] }; key { [ 0, parenright, rightsinglequotemark, dead_abovering ] }; key { [ bracketleft, braceleft, guillemotleft, leftdoublequotemark ] }; key { [bracketright, braceright, guillemotright, rightdoublequotemark ] }; key { [dead_acute, dead_diaeresis, apostrophe, quotedbl ] }; key { [ comma, less, ccedilla, Ccedilla ] }; key { [ period, greater, dead_abovedot, dead_caron ] }; key { [ p, P, odiaeresis, Odiaeresis ] }; key { [ y, Y, udiaeresis, Udiaeresis ] }; // key { [ f, F ] }; // key { [ g, G ] }; key { [ c, C, copyright, cent ] }; key { [ r, R, registered, registered ] }; key { [ l, L, oslash, Ooblique ] }; key { [ slash, question, questiondown, dead_hook ] }; // key { [ equal, plus, multiply, division ] }; key { [ a, A, aacute, Aacute ] }; key { [ o, O, oacute, Oacute ] }; key { [ e, E, eacute, Eacute ] }; key { [ u, U, uacute, Uacute ] }; key { [ i, I, iacute, Iacute ] }; key { [ d, D, eth, ETH ] }; // key { [ h, H ] }; key { [ t, T, thorn, THORN ] }; key { [ n, N, ntilde, Ntilde ] }; key { [ s, S, ssharp, section ] }; // key { [ minus, underscore, yen, dead_belowdot ] }; key { [ semicolon, colon, paragraph, degree ] }; key { [ q, Q, adiaeresis, Adiaeresis ] }; // key { [ j, J ] }; key { [ k, K, oe, OE ] }; // key { [ x, X ] }; // key { [ b, B ] }; key { [ m, M, mu, mu ] }; key { [ w, W, aring, Aring ] }; // key { [ v, V ] }; key { [ z, Z, ae, AE ] }; key { [ backslash, bar, notsign, brokenbar ] }; include "level3(ralt_switch)" }; // Dvorak international without dead keys // Stephane Magnenat (stephane at magnenat dot net, http://stephane.magnenat.net) // Based on information from http://www.poupinou.org/dvorak/index.html // // ` 1 2 3 4 5 6 7 8 9 0 [ ] \ // € // // ' , . p y f g c r l / = // ä ê ë ü ç // // a o e u i d h t n s - // à ô é û î ß // // ; q j k x b m w v z // â ö è ù ï partial alphanumeric_keys xkb_symbols "dvorak-alt-intl" { include "us(dvorak)" name[Group1]= "English (Dvorak, alt. intl.)"; key { [ 4, dollar, EuroSign ] }; key { [ comma, less, adiaeresis, dead_caron ] }; key { [ period, greater, ecircumflex, periodcentered ] }; key { [ p, P, ediaeresis, dead_cedilla ] }; key { [ y, Y, udiaeresis ] }; key { [ c, C, ccedilla, dead_abovedot ] }; key { [ a, A, agrave ] }; key { [ o, O, ocircumflex ] }; key { [ e, E, eacute ] }; key { [ u, U, ucircumflex ] }; key { [ i, I, icircumflex ] }; key { [ s, S, ssharp ] }; key { [ semicolon, colon, acircumflex ] }; key { [ q, Q, odiaeresis, dead_ogonek ] }; key { [ j, J, egrave, dead_doubleacute ] }; key { [ k, K, ugrave ] }; key { [ x, X, idiaeresis ] }; include "level3(ralt_switch)" }; // Left and right handed dvorak layouts // by sqweek 2006-01-30 // Based on the corresponding layouts in the console-tools package. partial alphanumeric_keys xkb_symbols "dvorak-l" { include "us(dvorak)" name[Group1]= "English (Dvorak, left-handed)"; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; key { [ slash, question ] }; key { [ p, P ] }; key { [ f, F ] }; key { [ m, M ] }; key { [ l, L ] }; key { [ j, J ] }; key { [ 4, dollar ] }; key { [ 3, numbersign ] }; key { [ 2, at ] }; key { [ 1, exclam ] }; key { [ semicolon, colon ] }; key { [ q, Q ] }; key { [ b, B ] }; key { [ y, Y ] }; key { [ u, U ] }; key { [ r, R ] }; key { [ s, S ] }; key { [ o, O ] }; key { [ period, greater ] }; key { [ 6, asciicircum ] }; key { [ 5, percent ] }; key { [ equal, plus ] }; key { [ minus, underscore ] }; key { [ k, K ] }; key { [ c, C ] }; key { [ d, D ] }; key { [ t, T ] }; key { [ h, H ] }; key { [ e, E ] }; key { [ a, A ] }; key { [ z, Z ] }; key { [ 8, asterisk ] }; key { [ 7, ampersand ] }; key { [ apostrophe, quotedbl ] }; key { [ x, X ] }; key { [ g, G ] }; key { [ v, V ] }; key { [ w, W ] }; key { [ n, N ] }; key { [ i, I ] }; key { [ comma, less ] }; key { [ 0, parenright ] }; key { [ 9, parenleft ] }; }; partial alphanumeric_keys xkb_symbols "dvorak-r" { include "us(dvorak)" name[Group1]= "English (Dvorak, right-handed)"; key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, numbersign ] }; key { [ 4, dollar ] }; key { [ j, J ] }; key { [ l, L ] }; key { [ m, M ] }; key { [ f, F ] }; key { [ p, P ] }; key { [ slash, question ] }; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; key { [ 5, percent ] }; key { [ 6, asciicircum ] }; key { [ q, Q ] }; key { [ period, greater ] }; key { [ o, O ] }; key { [ r, R ] }; key { [ s, S ] }; key { [ u, U ] }; key { [ y, Y ] }; key { [ b, B ] }; key { [ semicolon, colon ] }; key { [ equal, plus ] }; key { [ 7, ampersand ] }; key { [ 8, asterisk ] }; key { [ z, Z ] }; key { [ a, A ] }; key { [ e, E ] }; key { [ h, H ] }; key { [ t, T ] }; key { [ d, D ] }; key { [ c, C ] }; key { [ k, K ] }; key { [ minus, underscore ] }; key { [ 9, parenleft ] }; key { [ 0, parenright ] }; key { [ x, X ] }; key { [ comma, less ] }; key { [ i, I ] }; key { [ n, N ] }; key { [ w, W ] }; key { [ v, V ] }; key { [ g, G ] }; key { [ apostrophe, quotedbl ] }; }; // Classic dvorak layout // by Piter Punk - 2006-07-06 // Based on dvorak layout and e-mail from Russel L. Harris rlharris@oplink.net // on xorg list. partial alphanumeric_keys xkb_symbols "dvorak-classic" { name[Group1]= "English (classic Dvorak)"; key { [ grave, asciitilde, dead_grave, dead_tilde ] }; key { [ bracketleft, braceleft ] }; key { [ 7, ampersand ] }; key { [ 5, percent ] }; key { [ 3, numbersign ] }; key { [ 1, exclam ] }; key { [ 9, parenleft, dead_grave] }; key { [ 0, parenright ] }; key { [ 2, at ] }; key { [ 4, dollar ] }; key { [ 6, asciicircum, dead_circumflex, dead_circumflex ] }; key { [ 8, asterisk ] }; key { [ bracketright, braceright, dead_tilde] }; key { [ slash, question ] }; key { [ comma, less, dead_cedilla, dead_caron ] }; key { [ period, greater, dead_abovedot, periodcentered ] }; key { [ p, P ] }; key { [ y, Y ] }; key { [ f, F ] }; key { [ g, G ] }; key { [ c, C ] }; key { [ r, R ] }; key { [ l, L ] }; key { [ apostrophe, quotedbl, dead_acute, dead_diaeresis ] }; key { [ equal, plus ] }; key { [ a, A ] }; key { [ o, O ] }; key { [ e, E ] }; key { [ u, U ] }; key { [ i, I ] }; key { [ d, D ] }; key { [ h, H ] }; key { [ t, T ] }; key { [ n, N ] }; key { [ s, S ] }; key { [ minus, underscore ] }; key { [ semicolon, colon, dead_ogonek, dead_doubleacute ] }; key { [ q, Q ] }; key { [ j, J ] }; key { [ k, K ] }; key { [ x, X ] }; key { [ b, B ] }; key { [ m, M ] }; key { [ w, W ] }; key { [ v, V ] }; key { [ z, Z ] }; key { [ backslash, bar ] }; }; // programmer Dvorak, by Roland Kaufmann // License: BSD, available at // Main features: Numbers are in shift position (like French), symbols have been // placed in locations that give good hand-alternation and finger rolling with // symbols that usually follows, accented characters are possible for I18N. // Patch suggestions should be sent upstream. partial alphanumeric_keys xkb_symbols "dvp" { include "us(dvorak)" name[Group1] = "English (programmer Dvorak)"; // Unmodified Shift AltGr Shift+AltGr // symbols row, left side key { [ dollar, asciitilde, dead_tilde ] }; key { [ ampersand, percent ] }; key { [ bracketleft, 7, currency ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; key { [ braceleft, 5, cent ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; key { [ braceright, 3, yen ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; key { [ parenleft, 1, EuroSign ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; key { [ equal, 9, sterling ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; // symbols row, right side key { [ asterisk, 0 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; key { [ parenright, 2, onehalf ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; key { [ plus, 4 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; key { [ bracketright, 6 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; key { [ exclam, 8, exclamdown, U2E18 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; // reversed interrobang key { [ numbersign, grave, dead_grave ] }; key { [ BackSpace, BackSpace ] }; // upper row, left side key { [ semicolon, colon, dead_diaeresis ] }; key { [ comma, less, guillemotleft, U201C ] }; key { [ period, greater, guillemotright, U201D ] }; key { [ p, P, paragraph, section ] }; key { [ y, Y, udiaeresis, Udiaeresis ] }; // upper row, right side key { [ c, C, ccedilla, Ccedilla ] }; key { [ r, R, registered, trademark ] }; key { [ slash, question, questiondown, U203D ] }; // interrobang key { [ at, asciicircum, dead_circumflex, dead_caron ] }; // home row, left side key { [ a, A, aring, Aring ] }; key { [ o, O, oslash, Ooblique ] }; key { [ e, E, ae, AE ] }; key { [ u, U, eacute, Eacute ] }; // home row, right side key { [ d, D, eth, ETH ] }; key { [ h, H, dead_acute ] }; key { [ t, T, thorn, THORN ] }; key { [ n, N, ntilde, Ntilde ] }; key { [ s, S, ssharp ] }; key { [ minus, underscore, hyphen, endash ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; key { [ backslash, bar ] }; // lower row, left side key { [ apostrophe, quotedbl, dead_acute ] }; // do NOT hardcode this switch; use lv3:ralt_switch option instead! //include "level3(ralt_switch)" }; // phonetic layout for Russian letters on an US keyboard // by Ivan Popov 2005-07-17 // level3 modifier is a shortcut to the "us" meaning of the keys where // we place cyrillic letters, handy for accessing the corresponding // punctuation marks. // It is important to have access to punctuation marks, and the rest of // alphabetical keys are added for being consequent so that the users // can expect the level3 modifier to give what the key label shows. partial alphanumeric_keys xkb_symbols "rus" { include "us(basic)" name[Group1]= "Russian (US, phonetic)"; key.type[group1]="FOUR_LEVEL_ALPHABETIC"; key { [ Cyrillic_a, Cyrillic_A ] }; key { [ Cyrillic_be, Cyrillic_BE ] }; key { [ Cyrillic_ve, Cyrillic_VE ] }; key { [ Cyrillic_ghe, Cyrillic_GHE ] }; key { [ Cyrillic_de, Cyrillic_DE ] }; key { [ Cyrillic_ie, Cyrillic_IE ] }; key { [ Cyrillic_io, Cyrillic_IO, grave, asciitilde ] }; key { [ Cyrillic_zhe, Cyrillic_ZHE ] }; key { [ Cyrillic_ze, Cyrillic_ZE ] }; key { [ Cyrillic_i, Cyrillic_I ] }; key { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; key { [ Cyrillic_ka, Cyrillic_KA ] }; key { [ Cyrillic_el, Cyrillic_EL ] }; key { [ Cyrillic_em, Cyrillic_EM ] }; key { [ Cyrillic_en, Cyrillic_EN ] }; key { [ Cyrillic_o, Cyrillic_O ] }; key { [ Cyrillic_pe, Cyrillic_PE ] }; key { [ Cyrillic_er, Cyrillic_ER ] }; key { [ Cyrillic_es, Cyrillic_ES ] }; key { [ Cyrillic_te, Cyrillic_TE ] }; key { [ Cyrillic_u, Cyrillic_U ] }; key { [ Cyrillic_ef, Cyrillic_EF ] }; key { [ Cyrillic_ha, Cyrillic_HA ] }; key { [ Cyrillic_tse, Cyrillic_TSE ] }; key { [ Cyrillic_che, Cyrillic_CHE, semicolon, colon ] }; key { [ Cyrillic_sha, Cyrillic_SHA, bracketleft, braceleft] }; key { [ Cyrillic_shcha, Cyrillic_SHCHA, bracketright, braceright ] }; key { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, equal, plus ] }; key { [ Cyrillic_yeru, Cyrillic_YERU ] }; key { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; key { [ Cyrillic_e, Cyrillic_E, backslash, bar ] }; key { [ Cyrillic_yu, Cyrillic_YU, apostrophe, quotedbl ] }; key { [ Cyrillic_ya, Cyrillic_YA ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "mac" { include "us(basic)" name[Group1]= "English (Macintosh)"; key.type[group1]="FOUR_LEVEL"; // Slightly improvised from http://homepage.mac.com/thgewecke/kblayout.jpg key { [ section, plusminus, section, plusminus ] }; key { [ grave, asciitilde, dead_grave, dead_horn ] }; key { [ 1, exclam, exclamdown, U2044 ] }; key { [ 2, at, trademark, EuroSign ] }; key { [ 3, numbersign, sterling, U2039 ] }; key { [ 4, dollar, cent, U203A ] }; key { [ 5, percent, infinity, UFB01 ] }; key { [ 6,asciicircum, section, UFB02 ] }; key { [ 7, ampersand, paragraph, doubledagger ] }; key { [ 8, asterisk, enfilledcircbullet, degree ] }; key { [ 9, parenleft, ordfeminine, periodcentered ] }; key { [ 0, parenright, masculine,singlelowquotemark] }; key { [ minus, underscore, endash, emdash ] }; key { [ equal, plus, notequal, plusminus ] }; key { [ q, Q, oe, OE ] }; key { [ w, W, U2211,doublelowquotemark] }; key { [ e, E, dead_acute, acute ] }; key { [ r, R, registered, U2030 ] }; key { [ t, T, dagger, dead_caron ] }; key { [ y, Y, yen, onequarter ] }; key { [ u, U, dead_diaeresis, diaeresis ] }; key { [ i, I, dead_circumflex, U02C6 ] }; key { [ o, O, oslash, Ooblique ] }; key { [ p, P, Greek_pi, U220F ] }; key { [ bracketleft, braceleft, leftdoublequotemark, rightdoublequotemark ] }; key { [bracketright, braceright, leftsinglequotemark, rightsinglequotemark ] }; key { [ backslash, bar, guillemotleft, guillemotright ] }; key { [ a, A, aring, Aring ] }; key { [ s, S, ssharp, dead_stroke ] }; key { [ d, D, partialderivative, eth ] }; key { [ f, F, function, dead_hook ] }; key { [ g, G, copyright, dead_doubleacute ] }; key { [ h, H, dead_abovedot, dead_belowdot ] }; key { [ j, J, U2206, onehalf ] }; key { [ k, K,dead_abovering, UF8FF ] }; key { [ l, L, notsign, THORN ] }; key { [ semicolon, colon, U2026, thorn ] }; key { [apostrophe, quotedbl, ae, AE ] }; key { [ z, Z, Greek_OMEGA, dead_cedilla ] }; key { [ x, X, U2248, dead_ogonek ] }; // unclear whether "approxeq" is 2248 or 2245 key { [ c, C, ccedilla, Ccedilla ] }; key { [ v, V, squareroot, U25CA ] }; key { [ b, B, integral, idotless ] }; key { [ n, N, dead_tilde, U02DC ] }; key { [ m, M, mu, threequarters ] }; key { [ comma, less, lessthanequal, dead_macron ] }; key { [ period, greater, greaterthanequal, dead_breve ] }; key { [ slash, question, division, questiondown ] }; include "level3(ralt_switch)" }; // Colemak symbols for xkb on X.Org Server 7.x // 2006-01-01 Shai Coleman, http://colemak.com/ partial alphanumeric_keys xkb_symbols "colemak" { include "us" name[Group1]= "English (Colemak)"; key { [ grave, asciitilde, dead_tilde, asciitilde ] }; key { [ 1, exclam, exclamdown, onesuperior ] }; key { [ 2, at, masculine, twosuperior ] }; key { [ 3, numbersign, ordfeminine, threesuperior ] }; key { [ 4, dollar, cent, sterling ] }; key { [ 5, percent, EuroSign, yen ] }; key { [ 6, asciicircum, hstroke, Hstroke ] }; key { [ 7, ampersand, eth, ETH ] }; key { [ 8, asterisk, thorn, THORN ] }; key { [ 9, parenleft, leftsinglequotemark, leftdoublequotemark ] }; key { [ 0, parenright, rightsinglequotemark, rightdoublequotemark ] }; key { [ minus, underscore, endash, emdash ] }; key { [ equal, plus, multiply, division ] }; key { [ q, Q, adiaeresis, Adiaeresis ] }; key { [ w, W, aring, Aring ] }; key { [ f, F, atilde, Atilde ] }; key { [ p, P, oslash, Ooblique ] }; key { [ g, G, dead_ogonek, asciitilde ] }; key { [ j, J, dstroke, Dstroke ] }; key { [ l, L, lstroke, Lstroke ] }; key { [ u, U, uacute, Uacute ] }; key { [ y, Y, udiaeresis, Udiaeresis ] }; key { [ semicolon, colon, odiaeresis, Odiaeresis ] }; key { [ bracketleft, braceleft, guillemotleft, 0x1002039 ] }; key { [ bracketright, braceright, guillemotright, 0x100203a ] }; key { [ backslash, bar, asciitilde, asciitilde ] }; key { [ a, A, aacute, Aacute ] }; key { [ r, R, dead_grave, asciitilde ] }; key { [ s, S, ssharp, asciitilde ] }; key { [ t, T, dead_acute, dead_doubleacute ] }; key { [ d, D, dead_diaeresis, asciitilde ] }; key { [ h, H, dead_caron, asciitilde ] }; key { [ n, N, ntilde, Ntilde ] }; key { [ e, E, eacute, Eacute ] }; key { [ i, I, iacute, Iacute ] }; key { [ o, O, oacute, Oacute ] }; key { [ apostrophe, quotedbl, otilde, Otilde ] }; key { [ z, Z, ae, AE ] }; key { [ x, X, dead_circumflex, asciitilde ] }; key { [ c, C, ccedilla, Ccedilla ] }; key { [ v, V, oe, OE ] }; key { [ b, B, dead_breve, asciitilde ] }; key { [ k, K, dead_abovering, asciitilde ] }; key { [ m, M, dead_macron, asciitilde ] }; key { [ comma, less, dead_cedilla, asciitilde ] }; key { [ period, greater, dead_abovedot, asciitilde ] }; key { [ slash, question, questiondown, asciitilde ] }; key { [ BackSpace, BackSpace, BackSpace, BackSpace ] }; key { [ minus, underscore, endash, emdash ] }; key { [ space, space, space, nobreakspace ] }; include "level3(ralt_switch)" }; // I do NOT like dead-keys - the International keyboard as defined by Microsoft // does not fit my needs. Why use two keystrokes for all simple characters (eg ' // and generates a single ') just to have an é (eacute) in two strokes // as well? I type ' more often than é (eacute). // // This file works just like a regular keyboard, BUT has all dead-keys // accessible at level3 (through AltGr). An ë (ediaeresis) is now: AltGr+" // followed by an e. In other words, this keyboard is not international as long // as you leave the right Alt key alone. // // The original MS International keyboard was intended for Latin1 (iso8859-1). // With the introduction of iso8859-15, the (important) ligature oe (and OE) // became available. I added them next to ae. Because I write ediaeresis more // often than registered, I moved registered to be next to copyright and added // ediaeresis and idiaeresis. - Adriaan partial alphanumeric_keys xkb_symbols "altgr-intl" { include "us(intl)" name[Group1]= "English (intl., with AltGr dead keys)"; // five dead keys moved into level3: key { [ grave, asciitilde, dead_grave, dead_tilde ] }; key { [apostrophe,quotedbl, dead_acute, dead_diaeresis ] }; // diversions from the MS Intl keyboard: key { [ 1, exclam, onesuperior, exclamdown ] }; key { [ r, R, ediaeresis, Ediaeresis ] }; key { [ j, J, idiaeresis, Idiaeresis ] }; key { [ x, X, oe, OE ] }; key { [ v, V, registered, registered ] }; // onequarter etc (not in iso8859-15) moved to get three unshifted deadkeys: key { [ 6, asciicircum, dead_circumflex, onequarter ] }; key { [ 7, ampersand, dead_horn, onehalf ] }; key { [ 8, asterisk, dead_ogonek, threequarters ] }; include "level3(ralt_switch)" }; // Intel ClassmatePC Keyboard Layout // by Piter PUNK // // The keyboard layouts below maps the us(basic), us(intl) and us(alt-intl) // to ClassmatePC keyboard. All layouts uses RCTL as level3(switch) since // the keyboard does not have AltGr key. The EuroSign is engraved at 5 key. // classmate - us(basic) partial alphanumeric_keys xkb_symbols "classmate" { include "us(basic)" name[Group1]= "English (US)"; key { [ backslash, bar, backslash, bar ] }; include "eurosign(5)" include "level3(switch)" }; // classmate-intl - us(intl) // RCTL is generated by Fn+Alt, because that, when trying to access // the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got // the keypad keycodes. The keypad is changed to make Fn+Alt+ // generate the same symbol as the original key. partial alphanumeric_keys xkb_symbols "classmate-intl" { include "us(intl)" name[Group1]= "USA - ClassmatePC (International)"; key.type[Group1]="FOUR_LEVEL"; key { [ backslash, bar, backslash, bar ] }; key { [ KP_Home, KP_7, onehalf, dead_horn ] }; key { [ KP_Up, KP_8, threequarters, dead_ogonek ] }; key { [ KP_Prior, KP_9, leftsinglequotemark, dead_breve ] }; key { [ KP_Multiply, KP_Multiply, rightsinglequotemark, dead_abovering ] }; key { [ KP_Left, KP_4, uacute, Uacute ] }; key { [ KP_Begin, KP_5, iacute, Iacute ] }; key { [ KP_Right, KP_6, oacute, Oacute ] }; key { [ KP_Subtract, KP_Subtract, odiaeresis, Odiaeresis ] }; key { [ KP_Down, KP_2, oe, OE ] }; key { [ KP_Next, KP_3, oslash, Ooblique ] }; key { [ KP_Add, KP_Add, paragraph, degree ] }; key { [ KP_Insert, KP_0, mu, mu ] }; key { [ KP_Delete, KP_Decimal, dead_abovedot, dead_caron ] }; key { [ KP_Divide, KP_Divide, questiondown, dead_hook ] }; include "level3(switch)" }; // classmate-alt-intl - us(alt-intl) // RCTL is generated by Fn+Alt, because that, when trying to access // the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got // the keypad keycodes. The keypad is changed to make Fn+Alt+ // generate the same symbol as the original key. partial alphanumeric_keys xkb_symbols "classmate-alt-intl" { include "us(alt-intl)" name[Group1]= "USA - ClassmatePC (Alternative international)"; key.type[Group1]="FOUR_LEVEL"; key { [ backslash, bar, backslash, bar ] }; key { [ KP_Subtract, KP_Subtract ] }; key { [ KP_Prior, KP_9, leftsinglequotemark, dead_breve ] }; key { [ KP_Multiply, KP_Multiply, rightsinglequotemark, dead_abovering ] }; key { [ KP_Add, KP_Add, dead_ogonek, dead_diaeresis ] }; key { [ KP_Delete, KP_Decimal, dead_abovedot, dead_circumflex ] }; key { [ KP_Divide, KP_Divide, dead_hook, dead_hook ] }; include "level3(switch)" }; // classmate-altgr-intl - us(altgr-intl) // RCTL is generated by Fn+Alt, because that, when trying to access // the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got // the keypad keycodes. The keypad is changed to make Fn+Alt+ // generate the same symbol as the original key. partial alphanumeric_keys xkb_symbols "classmate-altgr-intl" { include "us(altgr-intl)" name[Group1]= "USA - ClassmatePC (International Fn+Alt dead-keys)"; key.type[Group1]="FOUR_LEVEL"; key { [ backslash, bar, backslash, bar ] }; key { [ KP_Home, KP_7, dead_horn, dead_horn ] }; key { [ KP_Up, KP_8, dead_ogonek, dead_ogonek ] }; key { [ KP_Prior, KP_9, leftsinglequotemark, dead_breve ] }; key { [ KP_Multiply, KP_Multiply, rightsinglequotemark, dead_abovering ] }; key { [ KP_Left, KP_4, uacute, Uacute ] }; key { [ KP_Begin, KP_5, iacute, Iacute ] }; key { [ KP_Right, KP_6, oacute, Oacute ] }; key { [ KP_Subtract, KP_Subtract, odiaeresis, Odiaeresis ] }; key { [ KP_End, KP_1, idiaeresis, Idiaeresis ] }; key { [ KP_Down, KP_2, oe, OE ] }; key { [ KP_Next, KP_3, oslash, Ooblique ] }; key { [ KP_Add, KP_Add, paragraph, degree ] }; key { [ KP_Insert, KP_0, mu, mu ] }; key { [ KP_Delete, KP_Decimal, dead_abovedot, dead_caron ] }; key { [ KP_Divide, KP_Divide, questiondown, dead_hook ] }; include "level3(switch)" }; partial alphanumeric_keys xkb_symbols "olpc" { include "us(basic)" name[Group1]= "English (US)"; // OLPC international US English keyboard layout. // It's a little different from the usual international layout. // See: http://wiki.laptop.org/go/Image:Keyboard_english.png key { [ grave, asciitilde, dead_grave, dead_tilde ] }; key { [ 1, exclam, exclamdown, exclamdown ] }; key { [ 2, at, notsign, notsign ] }; key { [ 3, numbersign, 0x1000300, 0x1000300 ] }; // combining grave key { [ 4, dollar, 0x1000301, 0x1000301 ] }; // combining acute key { [ 5, percent, 0x1000306, 0x1000306 ] }; // combining breve above key { [ 6,asciicircum, 0x100030A, 0x100030A ] }; // combining ring above key { [ 7, ampersand, 0x1000302, 0x1000302 ] }; // combining circumflex above key { [ 8, asterisk, 0x100030C, 0x100030C ] }; // combining caron above key { [ 9, parenleft, 0x1000307, 0x1000307 ] }; // combining dot above key { [ 0, parenright, 0x1000308, 0x1000308 ] }; // combining diaeresis above key { [ minus, underscore, 0x1000304, 0x1000304 ] }; // combining macron above key { [ equal, plus, 0x1000303, 0x1000303 ] }; // combining tilde above key { [ q, Q, Greek_omega, Greek_OMEGA ] }; key { [ w, W, oslash, Oslash ] }; key { [ e, E, oe, OE ] }; key { [ r, R, 0x1000327, 0x1000327 ] }; // combining cedilla key { [ t, T, 0x100032E, 0x100032E ] }; // combining breve below key { [ y, Y, 0x1000325, 0x1000325 ] }; // combining ring below key { [ u, U, 0x100032D, 0x100032D ] }; // combining circumflex below key { [ i, I, 0x100032C, 0x100032C ] }; // combining caron below key { [ o, O, 0x1000323, 0x1000323 ] }; // combining dot below key { [ p, P, 0x1000324, 0x1000324 ] }; // combining diaeresis below key { [ bracketleft, braceleft, 0x1000331, 0x1000331 ] }; // combining macron below key { [bracketright, braceright, 0x1000330, 0x1000330 ] }; // combining tilde below key { [ a, A, ae, AE ] }; key { [ s, S, ssharp, 0x1001E9C ] }; // uppercase S sharp key { [ d, D, eth, ETH ] }; key { [ f, F, thorn, THORN ] }; key { [ h, H, sterling, sterling ] }; key { [ j, J, EuroSign, EuroSign ] }; key { [ semicolon, colon, masculine, ordfeminine ] }; key { [ apostrophe, quotedbl, currency, currency ] }; key { [ backslash, bar, section, section ] }; key { [ c, C, ccedilla, Ccedilla ] }; key { [ n, N, ntilde, Ntilde ] }; key { [ m, M, mu, mu ] }; key { [ comma, less, guillemotleft, guillemotleft ] }; key { [ period, greater, guillemotright, guillemotright ] }; key { [ slash, question, questiondown, questiondown ] }; key { [ multiply, division, ISO_Next_Group, ISO_Prev_Group ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "olpc2" { include "us(olpc)" name[Group1]= "English (the divide/multiply keys toggle the layout)"; include "group(olpc)" }; xkb_symbols "olpcm" { include "us(basic)" name[Group1]= "English (US)"; // Mechanical (non-membrane) OLPC int'l US English keyboard layout. // See: http://wiki.laptop.org/go/OLPC_English_Non-membrane_Keyboard key { [ grave, asciitilde, dead_grave, dead_tilde ] }; key { [ 1, exclam, exclamdown, exclamdown ] }; key { [ 2, at, notsign, notsign ] }; key { [ 3, numbersign, 0x1000300, 0x1000300 ] }; // combining grave key { [ 4, dollar, 0x1000301, 0x1000301 ] }; // combining acute key { [ 5, percent, 0x1000306, 0x1000306 ] }; // combining breve above key { [ 6,asciicircum, 0x100030A, 0x100030A ] }; // combining ring above key { [ 7, ampersand, 0x1000302, 0x1000302 ] }; // combining circumflex above key { [ 8, asterisk, 0x100030C, 0x100030C ] }; // combining caron above key { [ 9, parenleft, 0x1000307, 0x1000307 ] }; // combining dot above key { [ 0, parenright, 0x1000308, 0x1000308 ] }; // combining diaeresis above key { [ minus, underscore, 0x1000304, 0x1000304 ] }; // combining macron above key { [ q, Q, Greek_omega, Greek_OMEGA ] }; key { [ w, W, oslash, Oslash ] }; key { [ e, E, oe, OE ] }; key { [ r, R, 0x1000327, 0x1000327 ] }; // combining cedilla key { [ t, T, 0x100032E, 0x100032E ] }; // combining breve below key { [ y, Y, 0x1000325, 0x1000325 ] }; // combining ring below key { [ u, U, 0x100032D, 0x100032D ] }; // combining circumflex below key { [ i, I, 0x100032C, 0x100032C ] }; // combining caron below key { [ o, O, 0x1000323, 0x1000323 ] }; // combining dot below key { [ p, P, 0x1000324, 0x1000324 ] }; // combining diaeresis below key { [ bracketleft, braceleft, 0x1000331, 0x1000331 ] }; // combining macron below key { [bracketright, braceright, 0x1000330, 0x1000330 ] }; // combining tilde below key { [ a, A, ae, AE ] }; key { [ s, S, ssharp, 0x1001E9C ] }; // uppercase S sharp key { [ d, D, eth, ETH ] }; key { [ f, F, thorn, THORN ] }; key { [ h, H, sterling, sterling ] }; key { [ j, J, EuroSign, EuroSign ] }; key { [ semicolon, colon, masculine, ordfeminine ] }; // no AC11 or AC12 on olpcm key { [ c, C, ccedilla, Ccedilla ] }; key { [ n, N, ntilde, Ntilde ] }; key { [ m, M, mu, mu ] }; key { [ comma, less, guillemotleft, guillemotleft ] }; key { [ period, greater, guillemotright, guillemotright ] }; key { [ slash, question, questiondown, questiondown ] }; key { [ backslash, bar, section, section ] }; key { [ equal, plus, 0x1000303, 0x1000303 ] }; key { [ apostrophe, quotedbl, currency, currency ] }; include "level3(ralt_switch)" }; // Based on Cherokee Nation Official Layout // http://www.cherokee.org/extras/downloads/font/Keyboard.htm partial alphanumeric_keys modifier_keys xkb_symbols "chr" { name[Group1]= "Cherokee"; key.type[group1]="ALPHABETIC"; key { [ grave, U13CA ] }; key { [ 1, U13B1 ] }; key { [ 2, U13C7 ] }; key { [ 3, U13E7 ] }; key { [ U13D9, U13B0 ] }; key { [ U13E6, U13B9 ] }; key { [ U13DC, U13DD ] }; key { [ U13CB, U13E1 ] }; key { [ U13D6, U13BA ] }; key { [ U13D2, parenleft ] }; key { [ U13C4, parenright ] }; key { [ U13BF, U13BC ] }; key { [ U13F3, U13BD ] }; key { [ U13AA, U13C6 ] }; key { [ U13B3, U13EB ] }; key { [ U13A1, U13E3 ] }; key { [ U13DB, U13CF ] }; key { [ U13D4, U13D8 ] }; key { [ U13EF, U13F2 ] }; key { [ U13A4, U13AD ] }; key { [ U13A2, U13F1 ] }; key { [ U13A3, U13EC ] }; key { [ U13C1, U13EA ] }; key { [ U13D5, U13D1 ] }; key { [ U13B6, U13E4 ] }; key { [ U13E9, U13EE ] }; key { [ U13A0, U13CC ] }; key { [ U13CD, U13CE ] }; key { [ U13D7, U13D0 ] }; key { [ U13A9, U13C8 ] }; key { [ U13A6, U13E5 ] }; key { [ U13AF, U13B2 ] }; key { [ U13DA, U13AB ] }; key { [ U13B8, U13A7 ] }; key { [ U13B5, U13AE ] }; key { [ U13E8, U13E0 ] }; key { [ apostrophe, quotedbl ] }; key { [ U13AC, U13C3 ] }; key { [ U13F4, U13ED ] }; key { [ U13D3, U13DF ] }; key { [ U13A5, U13DE ] }; key { [ U13A8, U13F0 ] }; key { [ U13BE, U13BB ] }; key { [ U13C5, U13B7 ] }; key { [ comma, U13E2 ] }; key { [ period, U13B4 ] }; key { [ U13C2, U13C9 ] }; }; // Serbian charecters added as third level symbols to US keyboard layout. partial alphanumeric_keys xkb_symbols "hbs" { include "us" name[Group1]= "Serbo-Croatian (US)"; key { [ grave, asciitilde ] }; key { [ 6, dead_caron, asciicircum, asciicircum ] }; key { [ 8, asterisk, multiply, division ] }; key { [ minus, underscore, endash, emdash ] }; key { [ l, L, U1C9, U1C8 ] }; key { [ n, N, U1CC, U1CB ] }; key { [ z, Z, U1C6, U1C5 ] }; key { [ e, E, EuroSign, cent ] }; key { [ d, D, dstroke, Dstroke ] }; key { [ dead_acute, quotedbl, apostrophe, apostrophe ] }; key { [ space, space, nobreakspace, nobreakspace ] }; key { [ comma, less, U3003, guillemotright ] }; key { [ period, greater, ellipsis, guillemotleft ] }; include "level3(ralt_switch)" }; //based on http://upload.wikimedia.org/wikipedia/commons/1/18/T-Mobile_G1_launch_event_2.jpg partial alphanumeric_keys xkb_symbols "htcdream" { include "inet(htcdream)" name[Group1]= "English (US)"; //second row key { [ q, Q, Tab, Tab ] }; key { [ w, W, grave, grave ] }; key { [ e, E, underscore, underscore ] }; key { [ r, R, sterling, sterling ] }; key { [ t, T, EuroSign, EuroSign ] }; key { [ y, Y, division, division ] }; key { [ u, U, multiply, multiply ] }; key { [ i, I, minus, minus ] }; key { [ o, O, plus, plus ] }; key { [ p, P, equal, equal ] }; //third row key { [ a, A, NoSymbol, NoSymbol ] }; key { [ s, S, bar, bar ] }; key { [ d ,D, backslash, backslash ] }; key { [ f, F, braceleft, braceleft ] }; key { [ g, G, braceright, braceright ] }; key { [ h, H, colon, colon ] }; key { [ j, J, semicolon, semicolon ] }; key { [ k, K, quotedbl, quotedbl ] }; key { [ l, L, apostrophe, apostrophe ] }; //forth row key { [ z, Z, NoSymbol, NoSymbol ] }; key { [ x, X, NoSymbol, NoSymbol ] }; key { [ c, C, NoSymbol, NoSymbol ] }; key { [ v, V, bracketleft, bracketleft ] }; key { [ b, B, bracketright, bracketright ] }; key { [ n, N, less, less ] }; key { [ m, M, greater, greater ] }; key { [ comma, comma, question, question ] }; //fifth row key { [ at, at, asciitilde, asciitilde ] }; include "level3(alt_switch)" }; // Workman Keyboard Layout symbols for xkb on X.Org Server 7.x // 09-06-2010 OJ Bucao. http://www.workmanlayout.com partial alphanumeric_keys xkb_symbols "workman" { include "us(basic)" name[Group1]= "English (Workman)"; key { [ q, Q ] }; key { [ d, D ] }; key { [ r, R ] }; key { [ w, W ] }; key { [ b, B ] }; key { [ j, J ] }; key { [ f, F ] }; key { [ u, U ] }; key { [ p, P ] }; key { [ semicolon, colon ] }; key { [ a, A ] }; key { [ s, S ] }; key { [ h, H ] }; key { [ t, T ] }; key { [ g, G ] }; key { [ y, Y ] }; key { [ n, N ] }; key { [ e, E ] }; key { [ o, O ] }; key { [ i, I ] }; key { [ z, Z ] }; key { [ x, X ] }; key { [ m, M ] }; key { [ c, C ] }; key { [ v, V ] }; key { [ k, K ] }; key { [ l, L ] }; key { [ BackSpace, Escape, BackSpace, BackSpace ] }; include "level3(ralt_switch)" }; partial alphanumeric_keys xkb_symbols "workman-intl" { include "us(intl)" name[Group1]= "English (Workman, intl., with dead keys)"; key { [ q, Q, adiaeresis, Adiaeresis ] }; key { [ d, D, eth, ETH ] }; key { [ r, R, registered, registered ] }; key { [ w, W, aring, Aring ] }; key { [ b, B, b, B ] }; key { [ j, J, j, J ] }; key { [ f, F, f, F ] }; key { [ u, U, uacute, Uacute ] }; key { [ p, P, odiaeresis, Odiaeresis ] }; key { [ semicolon, colon, paragraph, degree ] }; key { [ a, A, aacute, Aacute ] }; key { [ s, S, ssharp, section ] }; key { [ h, H, h, H ] }; key { [ t, T, thorn, THORN ] }; key { [ g, G, g, G ] }; key { [ y, Y, udiaeresis, Udiaeresis ] }; key { [ n, N, ntilde, Ntilde ] }; key { [ e, E, eacute, Eacute ] }; key { [ o, O, oacute, Oacute ] }; key { [ i, I, iacute, Iacute ] }; key { [ z, Z, ae, AE ] }; key { [ x, X, x, X ] }; key { [ m, M, mu, mu ] }; key { [ c, C, copyright, cent ] }; key { [ v, V, v, V ] }; key { [ k, K, oe, OE ] }; key { [ l, L, oslash, Ooblique ] }; key { [ BackSpace, Escape, BackSpace, BackSpace ] }; include "level3(ralt_switch)" }; // Norman keyboard layout symbols for xkb on X.Org Server 7.x // Written 11/23/2012, revised 3/7/2013 by David Norman http://normanlayout.info // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any warranty. partial alphanumeric_keys xkb_symbols "norman" { include "us(basic)" name[Group1]= "English (Norman)"; key { [ q, Q ] }; key { [ w, W ] }; key { [ d, D ] }; key { [ f, F ] }; key { [ k, K ] }; key { [ j, J ] }; key { [ u, U ] }; key { [ r, R ] }; key { [ l, L ] }; key { [ semicolon, colon ] }; key { [ a, A ] }; key { [ s, S ] }; key { [ e, E ] }; key { [ t, T ] }; key { [ g, G ] }; key { [ y, Y ] }; key { [ n, N ] }; key { [ i, I ] }; key { [ o, O ] }; key { [ h, H ] }; key { [ z, Z ] }; key { [ x, X ] }; key { [ c, C ] }; key { [ v, V ] }; key { [ b, B ] }; key { [ p, P ] }; key { [ m, M ] }; key { [ BackSpace ] }; include "level3(ralt_switch)" }; // Carpalx layout created by Martin Krzywinski // http://mkweb.bcgsc.ca/carpalx/ partial alphanumeric_keys xkb_symbols "carpalx" { name[Group1]= "English (Carpalx)"; key { [ grave, asciitilde ] }; key { [ 1, exclam ] }; key { [ 2, at ] }; key { [ 3, numbersign ] }; key { [ 4, dollar ] }; key { [ 5, percent ] }; key { [ 6, asciicircum ] }; key { [ 7, ampersand ] }; key { [ 8, asterisk ] }; key { [ 9, parenleft ] }; key { [ 0, parenright ] }; key { [ minus, underscore ] }; key { [ equal, plus ] }; key { [ q, Q ] }; key { [ g, G ] }; key { [ m, M ] }; key { [ l, L ] }; key { [ w, W ] }; key { [ y, Y ] }; key { [ f, F ] }; key { [ u, U ] }; key { [ b, B ] }; key { [ semicolon, colon ] }; key { [ bracketleft, braceleft ] }; key { [ bracketright, braceright ] }; key { [ d, D ] }; key { [ s, S ] }; key { [ t, T ] }; key { [ n, N ] }; key { [ r, R ] }; key { [ i, I ] }; key { [ a, A ] }; key { [ e, E ] }; key { [ o, O ] }; key { [ h, H ] }; key { [ apostrophe, quotedbl ] }; key { [ z, Z ] }; key { [ x, X ] }; key { [ c, C ] }; key { [ v, V ] }; key { [ j, J ] }; key { [ k, K ] }; key { [ p, P ] }; key { [ comma, less ] }; key { [ period, greater ] }; key { [ slash, question ] }; key { [ backslash, bar ] }; }; // Carpalx layout created by Martin Krzywinski // http://mkweb.bcgsc.ca/carpalx/ // Merged with us(intl) and modified to move // accented vowels closer to the plain vowels partial alphanumeric_keys xkb_symbols "carpalx-intl" { include "us(carpalx)" name[Group1]= "English (Carpalx, intl., with dead keys)"; key { [dead_grave, dead_tilde, grave, asciitilde ] }; key { [ 1, exclam, exclamdown, onesuperior ] }; key { [ 2, at, twosuperior, dead_doubleacute ] }; key { [ 3, numbersign, threesuperior, dead_macron ] }; key { [ 4, dollar, currency, sterling ] }; key { [ 5, percent, EuroSign, dead_cedilla ] }; key { [ 6, dead_circumflex, onequarter, asciicircum ] }; key { [ 7, ampersand, onehalf, dead_horn ] }; key { [ 8, asterisk, threequarters, dead_ogonek ] }; key { [ 9, parenleft, leftsinglequotemark, dead_breve ] }; key { [ 0, parenright, rightsinglequotemark, dead_abovering ] }; key { [ minus, underscore, yen, dead_belowdot ] }; key { [ equal, plus, multiply, division ] }; key { [ q, Q, degree, paragraph ] }; key { [ g, G, U011F, U011E ] }; key { [ m, M, mu, mu ] }; key { [ l, L, copyright, cent ] }; key { [ w, W, w, W ] }; key { [ y, Y, idiaeresis, Idiaeresis ] }; key { [ f, F, adiaeresis, Adiaeresis ] }; key { [ u, U, udiaeresis, Udiaeresis ] }; key { [ b, B, odiaeresis, Odiaeresis ] }; key { [ semicolon, colon, oslash, Ooblique ] }; key { [ bracketleft, braceleft, guillemotleft, leftdoublequotemark ] }; key { [bracketright, braceright, guillemotright, rightdoublequotemark ] }; key { [ d, D, eth, ETH ] }; key { [ s, S, ssharp, section ] }; key { [ t, T, thorn, THORN ] }; key { [ n, N, ntilde, Ntilde ] }; key { [ r, R, registered, registered ] }; key { [ i, I, iacute, Iacute ] }; key { [ a, A, aacute, Aacute ] }; key { [ e, E, eacute, Eacute ] }; key { [ o, O, oacute, Oacute ] }; key { [ h, H, uacute, Uacute ] }; key { [dead_acute, dead_diaeresis, apostrophe, quotedbl ] }; key { [ z, Z, z, Z ] }; key { [ x, X, U015F, U015E ] }; key { [ c, C, ccedilla, Ccedilla ] }; key { [ v, V, ae, AE ] }; key { [ j, J, oe, OE ] }; key { [ k, K, U0131, U0130 ] }; key { [ p, P, aring, Aring ] }; key { [ comma, less, ediaeresis, Ediaeresis ] }; key { [ period, greater, dead_abovedot, dead_caron ] }; key { [ slash, question, questiondown, dead_hook ] }; key { [ backslash, bar, notsign, brokenbar ] }; key { [ backslash, bar, backslash, bar ] }; include "level3(ralt_switch)" }; // Carpalx layout created by Martin Krzywinski // http://mkweb.bcgsc.ca/carpalx/ // Merged with us(intl) and us(altgr-intl) and modified to move // accented vowels closer to the plain vowels partial alphanumeric_keys xkb_symbols "carpalx-altgr-intl" { include "us(carpalx-intl)" name[Group1]= "English (Carpalx, intl., with AltGr dead keys)"; // five dead keys moved into level3: key { [ grave, asciitilde, dead_grave, dead_tilde ] }; key { [apostrophe,quotedbl, dead_acute, dead_diaeresis ] }; // diversions from the MS Intl keyboard: key { [ 1, exclam, onesuperior, exclamdown ] }; // onequarter etc (not in iso8859-15) moved to get three unshifted deadkeys: key { [ 6, asciicircum, dead_circumflex, onequarter ] }; key { [ 7, ampersand, dead_horn, onehalf ] }; key { [ 8, asterisk, dead_ogonek, threequarters ] }; include "level3(ralt_switch)" }; // Carpalx layout created by Martin Krzywinski // Full optimization variant without fixed QWERTY-like ZXCV keys // http://mkweb.bcgsc.ca/carpalx/ partial alphanumeric_keys xkb_symbols "carpalx-full" { include "us(carpalx)" name[Group1]= "English (Carpalx, full optimization)"; key { [ b, B ] }; key { [ y, Y ] }; key { [ v, V ] }; key { [ f, F ] }; }; // Carpalx layout created by Martin Krzywinski // Full optimization variant without fixed QWERTY-like ZXCV keys // http://mkweb.bcgsc.ca/carpalx/ // Merged with us(intl) and modified to move // accented vowels closer to the plain vowels partial alphanumeric_keys xkb_symbols "carpalx-full-intl" { include "us(carpalx-intl)" name[Group1]= "English (Carpalx, full optimization, intl., with dead keys)"; key { [ b, B, idiaeresis, Idiaeresis ] }; key { [ y, Y, adiaeresis, Adiaeresis ] }; key { [ v, V, odiaeresis, Odiaeresis ] }; key { [ f, F, ae, AE ] }; }; // Carpalx layout created by Martin Krzywinski // Full optimization variant without fixed QWERTY-like ZXCV keys // http://mkweb.bcgsc.ca/carpalx/ // Merged with us(intl) and us(altgr-intl) and modified to move // accented vowels closer to the plain vowels partial alphanumeric_keys xkb_symbols "carpalx-full-altgr-intl" { include "us(carpalx-altgr-intl)" name[Group1]= "English (Carpalx, full optimization, intl., with AltGr dead keys)"; key { [ b, B, idiaeresis, Idiaeresis ] }; key { [ y, Y, adiaeresis, Adiaeresis ] }; key { [ v, V, odiaeresis, Odiaeresis ] }; key { [ f, F, ae, AE ] }; }; // EXTRAS: // Czech, Slovak and German charecters added as third level symbols to US keyboard layout. partial alphanumeric_keys xkb_symbols "cz_sk_de" { include "us" name[Group1]="Czech Slovak and German (US)"; key { [grave, asciitilde, uring, Uring ] }; key { [ 1, exclam, uacute, Uacute ] }; key { [ 2, at, ecaron, Ecaron ] }; key { [ 3, numbersign, scaron, Scaron ] }; key { [ 4, dollar, ccaron, Ccaron ] }; key { [ 5, percent, rcaron, Rcaron ] }; key { [ 6, asciicircum, zcaron, Zcaron ] }; key { [ 7, ampersand, yacute, Yacute ] }; key { [ 8, asterisk, aacute, Aacute ] }; key { [ 9, parenleft, iacute, Iacute ] }; key { [ 0, parenright, eacute, Eacute ] }; key { [minus, underscore, ssharp, 0x1001E9E ] }; key { [equal, plus, dead_acute, dead_caron ] }; key { [ e, E, EuroSign, Eacute ] }; key { [bracketleft, braceleft, udiaeresis, Udiaeresis ] }; key { [ semicolon, colon, odiaeresis, Odiaeresis ] }; key { [apostrophe, quotedbl,adiaeresis, Adiaeresis ] }; key { [ a, A, aacute, Aacute ] }; key { [ i, I, iacute, Iacute ] }; key { [ o, O, oacute, Oacute ] }; key { [ y, Y, yacute, Yacute ] }; key { [ u, U, uring, Uring ] }; key { [ s, S, scaron, Scaron ] }; key { [ z, Z, zcaron, Zcaron ] }; key { [ c, C, ccaron, Ccaron ] }; key { [ r, R, rcaron, Rcaron ] }; key { [ t, T, tcaron, Tcaron ] }; key { [ d, D, dcaron, Dcaron ] }; key { [ n, N, ncaron, Ncaron ] }; key { [ l, L, lcaron, Lcaron ] }; key { [ p, P,ocircumflex, Ocircumflex ] }; key { [ space, space, nobreakspace, nobreakspace] }; include "level3(ralt_switch)" }; // XCompose is out! Unicode combining is in! For those of us who live // on the edge: A keymap using Unicode combining characters instead of // deadkeys. This variation does not deviate from the lame MS-style // US-intl layout; but it uses AltGr for combining, like altgr-intl. // // This might break your font layout layout systems (because they // suck), caveat emptor. Also, most of today's software will count // individual combining marks for selection, deletion, character // counting &c., and won't be smart enough to do canonical equivalence // when searching, &c. // // With Unicode combining you use "handwriting order", not // "typewriting order" as with deadkeys. That is, you first type the // base character, then the diacritics/accents/modifiers. This has // the advantage of avoiding hidden states --- each keypress changes // something on screen. // // TODO: as of now, this duplicates all us(intl) functionality with // combining. With care, perhaps we could add more combining marks // not present in intl, and support all major languages. partial alphanumeric_keys xkb_symbols "intl-unicode" { name[Group1]= "English (US, international AltGr Unicode combining)"; include "us(intl)" include "level3(ralt_switch)" // grave, tilde key { [grave, asciitilde, U0300, U0303 ] }; // double acute key { [ 2, at, twosuperior, U030B ] }; // macron key { [ 3, numbersign, threesuperior, U0304 ] }; // circumflex key { [ 6, asciicircum, onequarter, U0302 ] }; // horn key { [ 7, ampersand, onehalf, U031B ] }; // ogonek key { [ 8, asterisk, threequarters, U0328 ] }; // breve key { [ 9, parenleft, leftsinglequotemark, U0306 ] }; // abovering key { [ 0, parenright, rightsinglequotemark, U030A ] }; // belowdot key { [ minus, underscore, yen, U0323 ] }; // acute, diaeresis key { [apostrophe, quotedbl, U0301, U0308 ] }; // abovedot, caron key { [ period, greater, U0307, U030C ] }; // hook key { [ slash, question, questiondown, U0309 ] }; // alt-intl compatibility // cedilla, caron key { [ comma, less, U0327, U030C ] }; // ogonek, diaeresis key { [ semicolon, colon, U0328, U0308 ] }; // doubleacute, horn key { [ equal, plus, U030B, U031B ] }; // we don't do combining latin letters and combining enclosures // because support for those is very rare. }; // XCompose is out! Unicode combining is in! For those of us who live // on the edge: A keymap using Unicode combining characters instead of // deadkeys. This variation does break compatibility with us-intl, // whenever I thought it would be more mnemonic or Unicodeish. partial alphanumeric_keys xkb_symbols "alt-intl-unicode" { name[Group1]= "English (US, international AltGr Unicode combining, alternative)"; include "us(intl-unicode)" // easier macron; em-dash. // em-dash is available via compose, but I added here since it's such // an important typographic character. key { [ minus, underscore, U0304, U2014 ] }; // belowdot, abovedot (caron at coma/less key, per above) key { [ period, greater, U0323, U0307 ] }; }; partial alphanumeric_keys xkb_symbols "ats" { include "us" name[Group1]= "Atsina"; //Using Dead key to get COMBINING COMMA ABOVE for ejectives on //q, l, t, s, m, g, k, p, w, y, r //XCompose key is used for the other accute and grave. key { [ e, E, eacute, Eacute ] }; key { [ u, U, uacute, Uacute ] }; key { [ i, I, iacute, Iacute ] }; key { [ o, O, oacute, Oacute ] }; key { [ bracketleft, braceleft, U03B8 ] }; key { [ bracketright, braceright, U010D, U010C ] }; //U+010C (uppercase Č) and U+010D (lowercase č). key { [ a, A, aacute, Aacute ] }; //Small letter Open use compose to key get acute accent key { [ c, C, U0254, U0186 ] }; key { [ comma, less, U0313 ] }; key { [ slash, question, U0294 ] }; include "level3(ralt_switch)" include "compose(rctrl)" }; partial alphanumeric_keys xkb_symbols "crd" { include "us" name[Group1]= "Coeur d'Alene Salish"; key { [ w, W, U02B7, U02B7 ] }; key { [ 7, ampersand, U0294 ] }; key { [ q, Q, U221A ] }; key { [ v, V, U0259 ] }; key { [ backslash, bar, U026B ] }; key { [ e, E, U025B ] }; key { [ i, I, U026A ] }; key { [ j, J, U01F0 ] }; key { [ 6, asciicircum, U0295 ] }; key { [ s, S, U0161 ] }; key { [ c, C, U010D ] }; key { [ o, O, U0254 ] }; key { [ period, greater, U0323 ] }; include "level3(ralt_switch)" include "compose(rctrl)" }; partial alphanumeric_keys xkb_symbols "sun_type6" { include "sun_vndr/us(sun_type6)" }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8986447 libxkbcommon-0.10.0/test/data/sync.sh0000755000175000017500000000247700000000000017054 0ustar00ranran00000000000000#/bin/sh XKBCONFIGROOT='/usr/share/X11/xkb' if [ ! -d test/data ]; then echo "Run this from the top source dir" exit 1 fi for file in \ symbols/terminate \ symbols/in \ symbols/keypad \ symbols/altwin \ symbols/ctrl \ symbols/eurosign \ symbols/inet \ symbols/shift \ symbols/pc \ symbols/ca \ symbols/cz \ symbols/srvr_ctrl \ symbols/capslock \ symbols/latin \ symbols/level5 \ symbols/macintosh_vndr/apple \ symbols/macintosh_vndr/us \ symbols/us \ symbols/nbsp \ symbols/il \ symbols/group \ symbols/compose \ symbols/level3 \ symbols/ru \ symbols/rupeesign \ symbols/kpdl \ symbols/de \ symbols/ch \ symbols/empty \ keycodes/xfree86 \ keycodes/aliases \ keycodes/evdev \ keycodes/empty \ types/complete \ types/pc \ types/basic \ types/iso9995 \ types/level5 \ types/numpad \ types/extra \ types/mousekeys \ compat/complete \ compat/lednum \ compat/pc \ compat/ledscroll \ compat/basic \ compat/misc \ compat/iso9995 \ compat/accessx \ compat/xfree86 \ compat/level5 \ compat/caps \ compat/ledcaps \ compat/mousekeys \ rules/base \ rules/evdev \ ; do cp "$XKBCONFIGROOT/$file" "test/data/$file" done ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.901978 libxkbcommon-0.10.0/test/data/types/0000755000175000017500000000000000000000000016673 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8986447 libxkbcommon-0.10.0/test/data/types/basic0000644000175000017500000000113700000000000017701 0ustar00ranran00000000000000default xkb_types "basic" { // Fairly standard definitions for // three of the four required key types. // The fourth type "KEYPAD" is defined in the "numpad" file. virtual_modifiers NumLock; type "ONE_LEVEL" { modifiers = None; map[None] = Level1; level_name[Level1]= "Any"; }; type "TWO_LEVEL" { modifiers = Shift; map[Shift] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; }; type "ALPHABETIC" { modifiers = Shift+Lock; map[Shift] = Level2; map[Lock] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "Caps"; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8986447 libxkbcommon-0.10.0/test/data/types/complete0000644000175000017500000000026300000000000020427 0ustar00ranran00000000000000default xkb_types "complete" { include "basic" include "mousekeys" include "pc" include "iso9995" include "level5" include "extra" include "numpad" }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8986447 libxkbcommon-0.10.0/test/data/types/extra0000644000175000017500000001247500000000000017752 0ustar00ranran00000000000000partial default xkb_types "default" { // Defines a type with a four-level shift, similar to the three-level // type used for iso9995, but it lets the Shift key behave "normally". virtual_modifiers LevelThree; type "FOUR_LEVEL" { modifiers = Shift+LevelThree; map[None] = Level1; map[Shift] = Level2; map[LevelThree] = Level3; map[Shift+LevelThree] = Level4; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; }; type "FOUR_LEVEL_ALPHABETIC" { modifiers = Shift+Lock+LevelThree; map[None] = Level1; map[Shift] = Level2; map[Lock] = Level2; map[LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[Lock+LevelThree] = Level4; map[Lock+Shift+LevelThree] = Level3; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; }; type "FOUR_LEVEL_SEMIALPHABETIC" { modifiers = Shift+Lock+LevelThree; map[None] = Level1; map[Shift] = Level2; map[Lock] = Level2; map[LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[Lock+LevelThree] = Level3; map[Lock+Shift+LevelThree] = Level4; preserve[Lock+LevelThree] = Lock; preserve[Lock+Shift+LevelThree] = Lock; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; }; // A four-level keypad variant. The first two levels are controlled by // NumLock (with active shifting like in KEYPAD). LevelThree overrides // this mode, with two additional shifted levels. type "FOUR_LEVEL_MIXED_KEYPAD" { modifiers = Shift+NumLock+LevelThree; map[None] = Level1; map[Shift+NumLock] = Level1; map[NumLock] = Level2; map[Shift] = Level2; map[LevelThree] = Level3; map[NumLock+LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[Shift+NumLock+LevelThree] = Level4; level_name[Level1] = "Base"; level_name[Level2] = "Number"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; }; // Base level, two shifted LevelThree levels, one Ctrl+Alt command level. type "FOUR_LEVEL_X" { modifiers = Shift+LevelThree+Control+Alt; map[None] = Level1; map[LevelThree] = Level2; map[Shift+LevelThree] = Level3; map[Control+Alt] = Level4; level_name[Level1] = "Base"; level_name[Level2] = "Alt Base"; level_name[Level3] = "Shift Alt"; level_name[Level4] = "Ctrl+Alt"; }; // A special type for keys used in the Serbian Latin Unicode keymap. // It makes it possible to use all three forms of latin letters // present in Unicode that are made up of two separate letters // (forms like LJ, Lj, and lj; NJ, Nj, and nj; etcetera). type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" { modifiers = Shift+Lock+LevelThree; map[None] = Level1; map[Shift] = Level2; map[Lock] = Level4; map[LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[Lock+LevelThree] = Level3; map[Lock+Shift+LevelThree] = Level3; preserve[Lock]= Lock; preserve[Lock+LevelThree]= Lock; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "AltGr Base"; level_name[Level4] = "Shift AltGr"; }; // A key type for the German ssharp (for example), which is capitalized as SS. // CHARACTERISTICS: // It is FOUR_LEVEL with the exception that the fifth level is mapped to the // Lock modifier. If other modifiers are used, the Lock state is ignored. // DETAILS ABOUT GERMAN: // The capital form of ssharp (called sharp s) only exists for completely // capitalized text, not for words at the beginning of sentences nor for // nouns (nouns in German normally start with a captial letter). // The ssharp key, to the right of the zero key, takes this into account // and has a questionmark mapped to Shift-ssharp since normally no capital // version is needed. // When typing with active CapsLock, this key type is needed to // output two capital letters S because this is the only German key // whose capital letter is not the same as the one typed with Shift. type "FOUR_LEVEL_PLUS_LOCK" { modifiers = Shift+Lock+LevelThree; map[None] = Level1; map[Shift] = Level2; map[LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[Lock] = Level5; map[Lock+Shift] = Level2; map[Lock+LevelThree] = Level3; map[Lock+Shift+LevelThree] = Level4; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; level_name[Level5] = "Lock"; }; }; // This enables the four-level shifting also for the keypad. partial xkb_types "keypad" { virtual_modifiers LevelThree; type "FOUR_LEVEL_KEYPAD" { modifiers = Shift+NumLock+LevelThree; map[None] = Level1; map[Shift] = Level2; map[NumLock] = Level2; map[Shift+NumLock] = Level1; map[LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[NumLock+LevelThree] = Level4; map[Shift+NumLock+LevelThree] = Level3; level_name[Level1] = "Base"; level_name[Level2] = "Number"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Alt Number"; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8986447 libxkbcommon-0.10.0/test/data/types/iso99950000644000175000017500000000065500000000000017756 0ustar00ranran00000000000000partial default xkb_types "default" { // A key type which can be used to implement // an ISO9995-style level-three shift. virtual_modifiers LevelThree; type "THREE_LEVEL" { modifiers = Shift+LevelThree; map[None] = Level1; map[Shift] = Level2; map[LevelThree] = Level3; map[Shift+LevelThree] = Level3; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Level3"; }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.901978 libxkbcommon-0.10.0/test/data/types/level50000644000175000017500000002003300000000000020010 0ustar00ranran00000000000000partial default xkb_types "default" { // Defines a type with an eight-level shift, similar to the three-level // type used for iso9995, but it lets the Shift key behave "normally". virtual_modifiers LevelThree,ScrollLock,LevelFive; type "EIGHT_LEVEL" { modifiers = Shift+LevelThree+LevelFive; map[None] = Level1; map[Shift] = Level2; map[LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[LevelFive] = Level5; map[Shift+LevelFive] = Level6; map[LevelThree+LevelFive] = Level7; map[Shift+LevelThree+LevelFive] = Level8; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; level_name[Level5] = "X"; level_name[Level6] = "X Shift"; level_name[Level7] = "X Alt Base"; level_name[Level8] = "X Shift Alt"; }; type "EIGHT_LEVEL_ALPHABETIC" { modifiers = Shift+Lock+LevelThree+LevelFive; map[None] = Level1; map[Shift] = Level2; map[Lock] = Level2; map[LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[Lock+LevelThree] = Level4; map[Lock+Shift+LevelThree] = Level3; map[LevelFive] = Level5; map[Shift+LevelFive] = Level6; map[Lock+LevelFive] = Level6; map[LevelThree+LevelFive] = Level7; map[Shift+LevelThree+LevelFive] = Level8; map[Lock+LevelThree+LevelFive] = Level8; map[Lock+Shift+LevelThree+LevelFive] = Level7; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; level_name[Level5] = "X"; level_name[Level6] = "X Shift"; level_name[Level7] = "X Alt Base"; level_name[Level8] = "X Shift Alt"; }; type "EIGHT_LEVEL_LEVEL_FIVE_LOCK" { // Level5-Lock is implemented by using NumLock, because a real modifier // is required. modifiers = Shift + Lock + LevelThree + NumLock + LevelFive; map[None] = Level1; map[Shift] = Level2; map[LevelThree] = Level3; map[LevelThree+Shift] = Level4; map[LevelFive] = Level5; map[LevelFive+Shift] = Level6; map[LevelFive+LevelThree] = Level7; map[LevelFive+LevelThree+Shift] = Level8; map[NumLock] = Level5; map[NumLock+Shift] = Level6; map[NumLock+LevelThree] = Level7; map[NumLock+LevelThree+Shift] = Level8; map[NumLock+LevelFive] = Level1; map[NumLock+LevelFive+Shift] = Level2; map[NumLock+LevelFive+LevelThree] = Level3; map[NumLock+LevelFive+LevelThree+Shift] = Level4; // Lock has no effect map[Lock] = Level1; map[Lock+Shift] = Level2; map[Lock+LevelThree] = Level3; map[Lock+LevelThree+Shift] = Level4; map[Lock+LevelFive] = Level5; map[Lock+LevelFive+Shift] = Level6; map[Lock+LevelFive+LevelThree] = Level7; map[Lock+LevelFive+LevelThree+Shift] = Level8; map[Lock+NumLock] = Level5; map[Lock+NumLock+Shift] = Level6; map[Lock+NumLock+LevelThree] = Level7; map[Lock+NumLock+LevelThree+Shift] = Level8; map[Lock+NumLock+LevelFive] = Level1; map[Lock+NumLock+LevelFive+Shift] = Level2; map[Lock+NumLock+LevelFive+LevelThree] = Level3; map[Lock+NumLock+LevelFive+LevelThree+Shift] = Level4; preserve[LevelFive+Shift] = Shift; preserve[NumLock+Shift] = Shift; preserve[Lock+LevelFive+Shift] = Shift; preserve[Lock+NumLock+Shift] = Shift; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; level_name[Level5] = "X"; level_name[Level6] = "X Shift"; level_name[Level7] = "X Alt Base"; level_name[Level8] = "X Shift Alt"; }; type "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK" { // Level5-Lock is implemented by using NumLock, because a real modifier // is required. modifiers = Shift + Lock + LevelThree + NumLock + LevelFive; map[None] = Level1; map[Shift] = Level2; map[LevelThree] = Level3; map[LevelThree+Shift] = Level4; map[LevelFive] = Level5; map[LevelFive+Shift] = Level6; map[LevelFive+LevelThree] = Level7; map[LevelFive+LevelThree+Shift] = Level8; map[NumLock] = Level5; map[NumLock+Shift] = Level6; map[NumLock+LevelThree] = Level7; map[NumLock+LevelThree+Shift] = Level8; map[NumLock+LevelFive] = Level1; map[NumLock+LevelFive+Shift] = Level2; map[NumLock+LevelFive+LevelThree] = Level3; map[NumLock+LevelFive+LevelThree+Shift] = Level4; // Lock interchanges Level1 and Level2 map[Lock] = Level2; map[Lock+Shift] = Level1; map[Lock+LevelThree] = Level3; map[Lock+LevelThree+Shift] = Level4; map[Lock+LevelFive] = Level5; map[Lock+LevelFive+Shift] = Level6; map[Lock+LevelFive+LevelThree] = Level7; map[Lock+LevelFive+LevelThree+Shift] = Level8; map[Lock+NumLock] = Level5; map[Lock+NumLock+Shift] = Level6; map[Lock+NumLock+LevelThree] = Level7; map[Lock+NumLock+LevelThree+Shift] = Level8; map[Lock+NumLock+LevelFive] = Level2; map[Lock+NumLock+LevelFive+Shift] = Level1; map[Lock+NumLock+LevelFive+LevelThree] = Level4; map[Lock+NumLock+LevelFive+LevelThree+Shift] = Level3; preserve[LevelFive+Shift] = Shift; preserve[NumLock+Shift] = Shift; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; level_name[Level5] = "X"; level_name[Level6] = "X Shift"; level_name[Level7] = "X Alt Base"; level_name[Level8] = "X Shift Alt"; }; type "EIGHT_LEVEL_SEMIALPHABETIC" { modifiers = Shift+Lock+LevelThree+LevelFive; map[None] = Level1; map[Shift] = Level2; map[Lock] = Level2; map[LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[Lock+LevelThree] = Level3; map[Lock+Shift+LevelThree] = Level4; map[LevelFive] = Level5; map[Shift+LevelFive] = Level6; map[Lock+LevelFive] = Level6; map[Lock+Shift+LevelFive] = Level6; map[LevelThree+LevelFive] = Level7; map[Shift+LevelThree+LevelFive] = Level8; map[Lock+LevelThree+LevelFive] = Level7; map[Lock+Shift+LevelThree+LevelFive] = Level8; preserve[Lock+LevelThree] = Lock; preserve[Lock+Shift+LevelThree] = Lock; preserve[Lock+LevelFive] = Lock; preserve[Lock+Shift+LevelFive] = Lock; preserve[Lock+LevelThree+LevelFive] = Lock; preserve[Lock+Shift+LevelThree+LevelFive] = Lock; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; level_name[Level5] = "X"; level_name[Level6] = "X Shift"; level_name[Level7] = "X Alt Base"; level_name[Level8] = "X Shift Alt"; }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.901978 libxkbcommon-0.10.0/test/data/types/mousekeys0000644000175000017500000000032600000000000020643 0ustar00ranran00000000000000partial default xkb_types "default" { virtual_modifiers Alt; type "SHIFT+ALT" { modifiers = Shift+Alt; map[Shift+Alt] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "Shift+Alt"; }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.901978 libxkbcommon-0.10.0/test/data/types/numpad0000644000175000017500000000364300000000000020110 0ustar00ranran00000000000000partial default xkb_types "pc" { type "KEYPAD" { modifiers = Shift+NumLock; map[None] = Level1; map[Shift] = Level2; map[NumLock] = Level2; map[Shift+NumLock] = Level1; level_name[Level1] = "Base"; level_name[Level2] = "Number"; }; include "extra(keypad)" }; // On Mac keypads, level 1 and 2 are swapped. partial xkb_types "mac" { type "KEYPAD" { modifiers = None; map[None] = Level2; level_name[Level2] = "Number"; }; include "extra(keypad)" }; partial xkb_types "microsoft" { type "KEYPAD" { modifiers = Shift+NumLock; map[None] = Level1; preserve[Shift] = Shift; map[NumLock] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "Number"; }; include "extra(keypad)" }; // Swiss-German style numeric keypad: Shift and NumLock operate as // two independent modifiers; however, since we want shift state for // the cursor keys, only three levels are used from the key mappings. // Closest type is actually FOUR_LEVEL_X, but most numpad layouts use // FOUR_LEVEL_MIXED_KEYPAD, so that's the one we are going to override. partial xkb_types "shift3" { type "FOUR_LEVEL_MIXED_KEYPAD" { modifiers = Shift+NumLock+Control+Alt; // NumLock Off => navigate using cursor keys map[None] = Level1; // NumLock Off + Shift pressed => select using cursor keys preserve[Shift] = Shift; // NumLock On => decimal digits map[NumLock] = Level2; // NumLock On + Shift pressed => auxiliary symbols, // e.g. hexadecimal digits map[Shift+NumLock] = Level3; // Ctrl + Alt, regardless of NumLock and Shift => command keys map[Control+Alt] = Level4; // reverse map from levels to modifiers level_name[Level1] = "Base"; level_name[Level2] = "NumLock"; level_name[Level3] = "Shift+NumLock"; level_name[Level4] = "Ctrl+Alt"; }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.901978 libxkbcommon-0.10.0/test/data/types/pc0000644000175000017500000000643100000000000017224 0ustar00ranran00000000000000partial default xkb_types "default" { // Some types that are necessary // for a full implementation of // a PC-compatible keyboard. virtual_modifiers Alt; virtual_modifiers LevelThree; virtual_modifiers LAlt; virtual_modifiers RAlt; virtual_modifiers RControl; virtual_modifiers LControl; type "PC_SUPER_LEVEL2" { modifiers = Mod4; map[None] = Level1; map[Mod4] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "Super"; }; type "PC_CONTROL_LEVEL2" { modifiers = Control; map[None] = Level1; map[Control] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "Control"; }; type "PC_LCONTROL_LEVEL2" { modifiers = LControl; map[None] = Level1; map[LControl] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "LControl"; }; type "PC_RCONTROL_LEVEL2" { modifiers = RControl; map[None] = Level1; map[RControl] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "RControl"; }; type "PC_ALT_LEVEL2" { modifiers = Alt; map[None] = Level1; map[Alt] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "Alt"; }; type "PC_LALT_LEVEL2" { modifiers = LAlt; map[None] = Level1; map[LAlt] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "LAlt"; }; type "PC_RALT_LEVEL2" { modifiers = RAlt; map[None] = Level1; map[RAlt] = Level2; level_name[Level1] = "Base"; level_name[Level2] = "RAlt"; }; type "CTRL+ALT" { modifiers = Control+Alt+Shift+LevelThree; map[None] = Level1; map[Shift] = Level2; map[LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[Control+Alt] = Level5; preserve[Shift] = Shift; preserve[Shift+LevelThree] = Shift; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Alt Base"; level_name[Level4] = "Shift Alt"; level_name[Level5] = "Ctrl+Alt"; }; // Local eight level. // Needed when you want part of your layout eight-level but cannot use // LevelFive as modifier, as this will take over the right Ctrl by default // for the whole layout and is too invasive for the average four-level user. // Needed to fix bug #9529. // FIXME: Should really use RControl but it seems not to be enabled by // default and touching this requires a lot of testing. type "LOCAL_EIGHT_LEVEL" { modifiers = Shift+Lock+LevelThree+Control; map[None] = Level1; map[Lock+Shift] = Level1; map[Shift] = Level2; map[Lock] = Level2; map[LevelThree] = Level3; map[Lock+Shift+LevelThree] = Level3; map[Shift+LevelThree] = Level4; map[Lock+LevelThree] = Level4; map[Control] = Level5; map[Lock+Shift+Control] = Level5; map[Shift+Control] = Level6; map[Lock+Control] = Level6; map[LevelThree+Control] = Level7; map[Lock+Shift+LevelThree+Control] = Level7; map[Shift+LevelThree+Control] = Level8; map[Lock+LevelThree+Control] = Level8; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Level3"; level_name[Level4] = "Shift Level3"; level_name[Level5] = "Ctrl"; level_name[Level6] = "Shift Ctrl"; level_name[Level7] = "Level3 Ctrl"; level_name[Level8] = "Shift Level3 Ctrl"; }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.901978 libxkbcommon-0.10.0/test/evdev-scancodes.h0000644000175000017500000004052400000000000020045 0ustar00ranran00000000000000/* * Copyright (c) 1999-2002 Vojtech Pavlik * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published by * the Free Software Foundation. */ #ifndef _INPUT_H #define _INPUT_H /* * Copied from /usr/include/linux/input.h from Linux 3.16, for use * in libxkbcommon. Modified to only contain scancode definitions. */ /* * Keys and buttons * * Most of the keys/buttons are modeled after USB HUT 1.12 * (see http://www.usb.org/developers/hidpage). * Abbreviations in the comments: * AC - Application Control * AL - Application Launch Button * SC - System Control */ #define KEY_RESERVED 0 #define KEY_ESC 1 #define KEY_1 2 #define KEY_2 3 #define KEY_3 4 #define KEY_4 5 #define KEY_5 6 #define KEY_6 7 #define KEY_7 8 #define KEY_8 9 #define KEY_9 10 #define KEY_0 11 #define KEY_MINUS 12 #define KEY_EQUAL 13 #define KEY_BACKSPACE 14 #define KEY_TAB 15 #define KEY_Q 16 #define KEY_W 17 #define KEY_E 18 #define KEY_R 19 #define KEY_T 20 #define KEY_Y 21 #define KEY_U 22 #define KEY_I 23 #define KEY_O 24 #define KEY_P 25 #define KEY_LEFTBRACE 26 #define KEY_RIGHTBRACE 27 #define KEY_ENTER 28 #define KEY_LEFTCTRL 29 #define KEY_A 30 #define KEY_S 31 #define KEY_D 32 #define KEY_F 33 #define KEY_G 34 #define KEY_H 35 #define KEY_J 36 #define KEY_K 37 #define KEY_L 38 #define KEY_SEMICOLON 39 #define KEY_APOSTROPHE 40 #define KEY_GRAVE 41 #define KEY_LEFTSHIFT 42 #define KEY_BACKSLASH 43 #define KEY_Z 44 #define KEY_X 45 #define KEY_C 46 #define KEY_V 47 #define KEY_B 48 #define KEY_N 49 #define KEY_M 50 #define KEY_COMMA 51 #define KEY_DOT 52 #define KEY_SLASH 53 #define KEY_RIGHTSHIFT 54 #define KEY_KPASTERISK 55 #define KEY_LEFTALT 56 #define KEY_SPACE 57 #define KEY_CAPSLOCK 58 #define KEY_F1 59 #define KEY_F2 60 #define KEY_F3 61 #define KEY_F4 62 #define KEY_F5 63 #define KEY_F6 64 #define KEY_F7 65 #define KEY_F8 66 #define KEY_F9 67 #define KEY_F10 68 #define KEY_NUMLOCK 69 #define KEY_SCROLLLOCK 70 #define KEY_KP7 71 #define KEY_KP8 72 #define KEY_KP9 73 #define KEY_KPMINUS 74 #define KEY_KP4 75 #define KEY_KP5 76 #define KEY_KP6 77 #define KEY_KPPLUS 78 #define KEY_KP1 79 #define KEY_KP2 80 #define KEY_KP3 81 #define KEY_KP0 82 #define KEY_KPDOT 83 #define KEY_ZENKAKUHANKAKU 85 #define KEY_102ND 86 #define KEY_F11 87 #define KEY_F12 88 #define KEY_RO 89 #define KEY_KATAKANA 90 #define KEY_HIRAGANA 91 #define KEY_HENKAN 92 #define KEY_KATAKANAHIRAGANA 93 #define KEY_MUHENKAN 94 #define KEY_KPJPCOMMA 95 #define KEY_KPENTER 96 #define KEY_RIGHTCTRL 97 #define KEY_KPSLASH 98 #define KEY_SYSRQ 99 #define KEY_RIGHTALT 100 #define KEY_LINEFEED 101 #define KEY_HOME 102 #define KEY_UP 103 #define KEY_PAGEUP 104 #define KEY_LEFT 105 #define KEY_RIGHT 106 #define KEY_END 107 #define KEY_DOWN 108 #define KEY_PAGEDOWN 109 #define KEY_INSERT 110 #define KEY_DELETE 111 #define KEY_MACRO 112 #define KEY_MUTE 113 #define KEY_VOLUMEDOWN 114 #define KEY_VOLUMEUP 115 #define KEY_POWER 116 /* SC System Power Down */ #define KEY_KPEQUAL 117 #define KEY_KPPLUSMINUS 118 #define KEY_PAUSE 119 #define KEY_SCALE 120 /* AL Compiz Scale (Expose) */ #define KEY_KPCOMMA 121 #define KEY_HANGEUL 122 #define KEY_HANGUEL KEY_HANGEUL #define KEY_HANJA 123 #define KEY_YEN 124 #define KEY_LEFTMETA 125 #define KEY_RIGHTMETA 126 #define KEY_COMPOSE 127 #define KEY_STOP 128 /* AC Stop */ #define KEY_AGAIN 129 #define KEY_PROPS 130 /* AC Properties */ #define KEY_UNDO 131 /* AC Undo */ #define KEY_FRONT 132 #define KEY_COPY 133 /* AC Copy */ #define KEY_OPEN 134 /* AC Open */ #define KEY_PASTE 135 /* AC Paste */ #define KEY_FIND 136 /* AC Search */ #define KEY_CUT 137 /* AC Cut */ #define KEY_HELP 138 /* AL Integrated Help Center */ #define KEY_MENU 139 /* Menu (show menu) */ #define KEY_CALC 140 /* AL Calculator */ #define KEY_SETUP 141 #define KEY_SLEEP 142 /* SC System Sleep */ #define KEY_WAKEUP 143 /* System Wake Up */ #define KEY_FILE 144 /* AL Local Machine Browser */ #define KEY_SENDFILE 145 #define KEY_DELETEFILE 146 #define KEY_XFER 147 #define KEY_PROG1 148 #define KEY_PROG2 149 #define KEY_WWW 150 /* AL Internet Browser */ #define KEY_MSDOS 151 #define KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */ #define KEY_SCREENLOCK KEY_COFFEE #define KEY_DIRECTION 153 #define KEY_CYCLEWINDOWS 154 #define KEY_MAIL 155 #define KEY_BOOKMARKS 156 /* AC Bookmarks */ #define KEY_COMPUTER 157 #define KEY_BACK 158 /* AC Back */ #define KEY_FORWARD 159 /* AC Forward */ #define KEY_CLOSECD 160 #define KEY_EJECTCD 161 #define KEY_EJECTCLOSECD 162 #define KEY_NEXTSONG 163 #define KEY_PLAYPAUSE 164 #define KEY_PREVIOUSSONG 165 #define KEY_STOPCD 166 #define KEY_RECORD 167 #define KEY_REWIND 168 #define KEY_PHONE 169 /* Media Select Telephone */ #define KEY_ISO 170 #define KEY_CONFIG 171 /* AL Consumer Control Configuration */ #define KEY_HOMEPAGE 172 /* AC Home */ #define KEY_REFRESH 173 /* AC Refresh */ #define KEY_EXIT 174 /* AC Exit */ #define KEY_MOVE 175 #define KEY_EDIT 176 #define KEY_SCROLLUP 177 #define KEY_SCROLLDOWN 178 #define KEY_KPLEFTPAREN 179 #define KEY_KPRIGHTPAREN 180 #define KEY_NEW 181 /* AC New */ #define KEY_REDO 182 /* AC Redo/Repeat */ #define KEY_F13 183 #define KEY_F14 184 #define KEY_F15 185 #define KEY_F16 186 #define KEY_F17 187 #define KEY_F18 188 #define KEY_F19 189 #define KEY_F20 190 #define KEY_F21 191 #define KEY_F22 192 #define KEY_F23 193 #define KEY_F24 194 #define KEY_PLAYCD 200 #define KEY_PAUSECD 201 #define KEY_PROG3 202 #define KEY_PROG4 203 #define KEY_DASHBOARD 204 /* AL Dashboard */ #define KEY_SUSPEND 205 #define KEY_CLOSE 206 /* AC Close */ #define KEY_PLAY 207 #define KEY_FASTFORWARD 208 #define KEY_BASSBOOST 209 #define KEY_PRINT 210 /* AC Print */ #define KEY_HP 211 #define KEY_CAMERA 212 #define KEY_SOUND 213 #define KEY_QUESTION 214 #define KEY_EMAIL 215 #define KEY_CHAT 216 #define KEY_SEARCH 217 #define KEY_CONNECT 218 #define KEY_FINANCE 219 /* AL Checkbook/Finance */ #define KEY_SPORT 220 #define KEY_SHOP 221 #define KEY_ALTERASE 222 #define KEY_CANCEL 223 /* AC Cancel */ #define KEY_BRIGHTNESSDOWN 224 #define KEY_BRIGHTNESSUP 225 #define KEY_MEDIA 226 #define KEY_SWITCHVIDEOMODE 227 /* Cycle between available video outputs (Monitor/LCD/TV-out/etc) */ #define KEY_KBDILLUMTOGGLE 228 #define KEY_KBDILLUMDOWN 229 #define KEY_KBDILLUMUP 230 #define KEY_SEND 231 /* AC Send */ #define KEY_REPLY 232 /* AC Reply */ #define KEY_FORWARDMAIL 233 /* AC Forward Msg */ #define KEY_SAVE 234 /* AC Save */ #define KEY_DOCUMENTS 235 #define KEY_BATTERY 236 #define KEY_BLUETOOTH 237 #define KEY_WLAN 238 #define KEY_UWB 239 #define KEY_UNKNOWN 240 #define KEY_VIDEO_NEXT 241 /* drive next video source */ #define KEY_VIDEO_PREV 242 /* drive previous video source */ #define KEY_BRIGHTNESS_CYCLE 243 /* brightness up, after max is min */ #define KEY_BRIGHTNESS_ZERO 244 /* brightness off, use ambient */ #define KEY_DISPLAY_OFF 245 /* display device to off state */ #define KEY_WWAN 246 /* Wireless WAN (LTE, UMTS, GSM, etc.) */ #define KEY_WIMAX KEY_WWAN #define KEY_RFKILL 247 /* Key that controls all radios */ #define KEY_MICMUTE 248 /* Mute / unmute the microphone */ /* Code 255 is reserved for special needs of AT keyboard driver */ #define BTN_MISC 0x100 #define BTN_0 0x100 #define BTN_1 0x101 #define BTN_2 0x102 #define BTN_3 0x103 #define BTN_4 0x104 #define BTN_5 0x105 #define BTN_6 0x106 #define BTN_7 0x107 #define BTN_8 0x108 #define BTN_9 0x109 #define BTN_MOUSE 0x110 #define BTN_LEFT 0x110 #define BTN_RIGHT 0x111 #define BTN_MIDDLE 0x112 #define BTN_SIDE 0x113 #define BTN_EXTRA 0x114 #define BTN_FORWARD 0x115 #define BTN_BACK 0x116 #define BTN_TASK 0x117 #define BTN_JOYSTICK 0x120 #define BTN_TRIGGER 0x120 #define BTN_THUMB 0x121 #define BTN_THUMB2 0x122 #define BTN_TOP 0x123 #define BTN_TOP2 0x124 #define BTN_PINKIE 0x125 #define BTN_BASE 0x126 #define BTN_BASE2 0x127 #define BTN_BASE3 0x128 #define BTN_BASE4 0x129 #define BTN_BASE5 0x12a #define BTN_BASE6 0x12b #define BTN_DEAD 0x12f #define BTN_GAMEPAD 0x130 #define BTN_SOUTH 0x130 #define BTN_A BTN_SOUTH #define BTN_EAST 0x131 #define BTN_B BTN_EAST #define BTN_C 0x132 #define BTN_NORTH 0x133 #define BTN_X BTN_NORTH #define BTN_WEST 0x134 #define BTN_Y BTN_WEST #define BTN_Z 0x135 #define BTN_TL 0x136 #define BTN_TR 0x137 #define BTN_TL2 0x138 #define BTN_TR2 0x139 #define BTN_SELECT 0x13a #define BTN_START 0x13b #define BTN_MODE 0x13c #define BTN_THUMBL 0x13d #define BTN_THUMBR 0x13e #define BTN_DIGI 0x140 #define BTN_TOOL_PEN 0x140 #define BTN_TOOL_RUBBER 0x141 #define BTN_TOOL_BRUSH 0x142 #define BTN_TOOL_PENCIL 0x143 #define BTN_TOOL_AIRBRUSH 0x144 #define BTN_TOOL_FINGER 0x145 #define BTN_TOOL_MOUSE 0x146 #define BTN_TOOL_LENS 0x147 #define BTN_TOOL_QUINTTAP 0x148 /* Five fingers on trackpad */ #define BTN_TOUCH 0x14a #define BTN_STYLUS 0x14b #define BTN_STYLUS2 0x14c #define BTN_TOOL_DOUBLETAP 0x14d #define BTN_TOOL_TRIPLETAP 0x14e #define BTN_TOOL_QUADTAP 0x14f /* Four fingers on trackpad */ #define BTN_WHEEL 0x150 #define BTN_GEAR_DOWN 0x150 #define BTN_GEAR_UP 0x151 #define KEY_OK 0x160 #define KEY_SELECT 0x161 #define KEY_GOTO 0x162 #define KEY_CLEAR 0x163 #define KEY_POWER2 0x164 #define KEY_OPTION 0x165 #define KEY_INFO 0x166 /* AL OEM Features/Tips/Tutorial */ #define KEY_TIME 0x167 #define KEY_VENDOR 0x168 #define KEY_ARCHIVE 0x169 #define KEY_PROGRAM 0x16a /* Media Select Program Guide */ #define KEY_CHANNEL 0x16b #define KEY_FAVORITES 0x16c #define KEY_EPG 0x16d #define KEY_PVR 0x16e /* Media Select Home */ #define KEY_MHP 0x16f #define KEY_LANGUAGE 0x170 #define KEY_TITLE 0x171 #define KEY_SUBTITLE 0x172 #define KEY_ANGLE 0x173 #define KEY_ZOOM 0x174 #define KEY_MODE 0x175 #define KEY_KEYBOARD 0x176 #define KEY_SCREEN 0x177 #define KEY_PC 0x178 /* Media Select Computer */ #define KEY_TV 0x179 /* Media Select TV */ #define KEY_TV2 0x17a /* Media Select Cable */ #define KEY_VCR 0x17b /* Media Select VCR */ #define KEY_VCR2 0x17c /* VCR Plus */ #define KEY_SAT 0x17d /* Media Select Satellite */ #define KEY_SAT2 0x17e #define KEY_CD 0x17f /* Media Select CD */ #define KEY_TAPE 0x180 /* Media Select Tape */ #define KEY_RADIO 0x181 #define KEY_TUNER 0x182 /* Media Select Tuner */ #define KEY_PLAYER 0x183 #define KEY_TEXT 0x184 #define KEY_DVD 0x185 /* Media Select DVD */ #define KEY_AUX 0x186 #define KEY_MP3 0x187 #define KEY_AUDIO 0x188 /* AL Audio Browser */ #define KEY_VIDEO 0x189 /* AL Movie Browser */ #define KEY_DIRECTORY 0x18a #define KEY_LIST 0x18b #define KEY_MEMO 0x18c /* Media Select Messages */ #define KEY_CALENDAR 0x18d #define KEY_RED 0x18e #define KEY_GREEN 0x18f #define KEY_YELLOW 0x190 #define KEY_BLUE 0x191 #define KEY_CHANNELUP 0x192 /* Channel Increment */ #define KEY_CHANNELDOWN 0x193 /* Channel Decrement */ #define KEY_FIRST 0x194 #define KEY_LAST 0x195 /* Recall Last */ #define KEY_AB 0x196 #define KEY_NEXT 0x197 #define KEY_RESTART 0x198 #define KEY_SLOW 0x199 #define KEY_SHUFFLE 0x19a #define KEY_BREAK 0x19b #define KEY_PREVIOUS 0x19c #define KEY_DIGITS 0x19d #define KEY_TEEN 0x19e #define KEY_TWEN 0x19f #define KEY_VIDEOPHONE 0x1a0 /* Media Select Video Phone */ #define KEY_GAMES 0x1a1 /* Media Select Games */ #define KEY_ZOOMIN 0x1a2 /* AC Zoom In */ #define KEY_ZOOMOUT 0x1a3 /* AC Zoom Out */ #define KEY_ZOOMRESET 0x1a4 /* AC Zoom */ #define KEY_WORDPROCESSOR 0x1a5 /* AL Word Processor */ #define KEY_EDITOR 0x1a6 /* AL Text Editor */ #define KEY_SPREADSHEET 0x1a7 /* AL Spreadsheet */ #define KEY_GRAPHICSEDITOR 0x1a8 /* AL Graphics Editor */ #define KEY_PRESENTATION 0x1a9 /* AL Presentation App */ #define KEY_DATABASE 0x1aa /* AL Database App */ #define KEY_NEWS 0x1ab /* AL Newsreader */ #define KEY_VOICEMAIL 0x1ac /* AL Voicemail */ #define KEY_ADDRESSBOOK 0x1ad /* AL Contacts/Address Book */ #define KEY_MESSENGER 0x1ae /* AL Instant Messaging */ #define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */ #define KEY_SPELLCHECK 0x1b0 /* AL Spell Check */ #define KEY_LOGOFF 0x1b1 /* AL Logoff */ #define KEY_DOLLAR 0x1b2 #define KEY_EURO 0x1b3 #define KEY_FRAMEBACK 0x1b4 /* Consumer - transport controls */ #define KEY_FRAMEFORWARD 0x1b5 #define KEY_CONTEXT_MENU 0x1b6 /* GenDesc - system context menu */ #define KEY_MEDIA_REPEAT 0x1b7 /* Consumer - transport control */ #define KEY_10CHANNELSUP 0x1b8 /* 10 channels up (10+) */ #define KEY_10CHANNELSDOWN 0x1b9 /* 10 channels down (10-) */ #define KEY_IMAGES 0x1ba /* AL Image Browser */ #define KEY_DEL_EOL 0x1c0 #define KEY_DEL_EOS 0x1c1 #define KEY_INS_LINE 0x1c2 #define KEY_DEL_LINE 0x1c3 #define KEY_FN 0x1d0 #define KEY_FN_ESC 0x1d1 #define KEY_FN_F1 0x1d2 #define KEY_FN_F2 0x1d3 #define KEY_FN_F3 0x1d4 #define KEY_FN_F4 0x1d5 #define KEY_FN_F5 0x1d6 #define KEY_FN_F6 0x1d7 #define KEY_FN_F7 0x1d8 #define KEY_FN_F8 0x1d9 #define KEY_FN_F9 0x1da #define KEY_FN_F10 0x1db #define KEY_FN_F11 0x1dc #define KEY_FN_F12 0x1dd #define KEY_FN_1 0x1de #define KEY_FN_2 0x1df #define KEY_FN_D 0x1e0 #define KEY_FN_E 0x1e1 #define KEY_FN_F 0x1e2 #define KEY_FN_S 0x1e3 #define KEY_FN_B 0x1e4 #define KEY_BRL_DOT1 0x1f1 #define KEY_BRL_DOT2 0x1f2 #define KEY_BRL_DOT3 0x1f3 #define KEY_BRL_DOT4 0x1f4 #define KEY_BRL_DOT5 0x1f5 #define KEY_BRL_DOT6 0x1f6 #define KEY_BRL_DOT7 0x1f7 #define KEY_BRL_DOT8 0x1f8 #define KEY_BRL_DOT9 0x1f9 #define KEY_BRL_DOT10 0x1fa #define KEY_NUMERIC_0 0x200 /* used by phones, remote controls, */ #define KEY_NUMERIC_1 0x201 /* and other keypads */ #define KEY_NUMERIC_2 0x202 #define KEY_NUMERIC_3 0x203 #define KEY_NUMERIC_4 0x204 #define KEY_NUMERIC_5 0x205 #define KEY_NUMERIC_6 0x206 #define KEY_NUMERIC_7 0x207 #define KEY_NUMERIC_8 0x208 #define KEY_NUMERIC_9 0x209 #define KEY_NUMERIC_STAR 0x20a #define KEY_NUMERIC_POUND 0x20b #define KEY_CAMERA_FOCUS 0x210 #define KEY_WPS_BUTTON 0x211 /* WiFi Protected Setup key */ #define KEY_TOUCHPAD_TOGGLE 0x212 /* Request switch touchpad on or off */ #define KEY_TOUCHPAD_ON 0x213 #define KEY_TOUCHPAD_OFF 0x214 #define KEY_CAMERA_ZOOMIN 0x215 #define KEY_CAMERA_ZOOMOUT 0x216 #define KEY_CAMERA_UP 0x217 #define KEY_CAMERA_DOWN 0x218 #define KEY_CAMERA_LEFT 0x219 #define KEY_CAMERA_RIGHT 0x21a #define KEY_ATTENDANT_ON 0x21b #define KEY_ATTENDANT_OFF 0x21c #define KEY_ATTENDANT_TOGGLE 0x21d /* Attendant call on or off */ #define KEY_LIGHTS_TOGGLE 0x21e /* Reading light on or off */ #define BTN_DPAD_UP 0x220 #define BTN_DPAD_DOWN 0x221 #define BTN_DPAD_LEFT 0x222 #define BTN_DPAD_RIGHT 0x223 #define KEY_ALS_TOGGLE 0x230 /* Ambient light sensor */ #define BTN_TRIGGER_HAPPY 0x2c0 #define BTN_TRIGGER_HAPPY1 0x2c0 #define BTN_TRIGGER_HAPPY2 0x2c1 #define BTN_TRIGGER_HAPPY3 0x2c2 #define BTN_TRIGGER_HAPPY4 0x2c3 #define BTN_TRIGGER_HAPPY5 0x2c4 #define BTN_TRIGGER_HAPPY6 0x2c5 #define BTN_TRIGGER_HAPPY7 0x2c6 #define BTN_TRIGGER_HAPPY8 0x2c7 #define BTN_TRIGGER_HAPPY9 0x2c8 #define BTN_TRIGGER_HAPPY10 0x2c9 #define BTN_TRIGGER_HAPPY11 0x2ca #define BTN_TRIGGER_HAPPY12 0x2cb #define BTN_TRIGGER_HAPPY13 0x2cc #define BTN_TRIGGER_HAPPY14 0x2cd #define BTN_TRIGGER_HAPPY15 0x2ce #define BTN_TRIGGER_HAPPY16 0x2cf #define BTN_TRIGGER_HAPPY17 0x2d0 #define BTN_TRIGGER_HAPPY18 0x2d1 #define BTN_TRIGGER_HAPPY19 0x2d2 #define BTN_TRIGGER_HAPPY20 0x2d3 #define BTN_TRIGGER_HAPPY21 0x2d4 #define BTN_TRIGGER_HAPPY22 0x2d5 #define BTN_TRIGGER_HAPPY23 0x2d6 #define BTN_TRIGGER_HAPPY24 0x2d7 #define BTN_TRIGGER_HAPPY25 0x2d8 #define BTN_TRIGGER_HAPPY26 0x2d9 #define BTN_TRIGGER_HAPPY27 0x2da #define BTN_TRIGGER_HAPPY28 0x2db #define BTN_TRIGGER_HAPPY29 0x2dc #define BTN_TRIGGER_HAPPY30 0x2dd #define BTN_TRIGGER_HAPPY31 0x2de #define BTN_TRIGGER_HAPPY32 0x2df #define BTN_TRIGGER_HAPPY33 0x2e0 #define BTN_TRIGGER_HAPPY34 0x2e1 #define BTN_TRIGGER_HAPPY35 0x2e2 #define BTN_TRIGGER_HAPPY36 0x2e3 #define BTN_TRIGGER_HAPPY37 0x2e4 #define BTN_TRIGGER_HAPPY38 0x2e5 #define BTN_TRIGGER_HAPPY39 0x2e6 #define BTN_TRIGGER_HAPPY40 0x2e7 /* We avoid low common keys in module aliases so they don't get huge. */ #define KEY_MIN_INTERESTING KEY_MUTE #define KEY_MAX 0x2ff #define KEY_CNT (KEY_MAX+1) #endif /* _INPUT_H */ ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.9086447 libxkbcommon-0.10.0/test/filecomp.c0000644000175000017500000000504100000000000016560 0ustar00ranran00000000000000/* * Copyright © 2009 Dan Nicholson * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "test.h" static int test_file(struct xkb_context *ctx, const char *path_rel) { struct xkb_keymap *keymap = test_compile_file(ctx, path_rel); if (!keymap) return 0; xkb_keymap_unref(keymap); return 1; } int main(void) { struct xkb_context *ctx = test_get_context(0); assert(test_file(ctx, "keymaps/basic.xkb")); assert(test_file(ctx, "keymaps/comprehensive-plus-geom.xkb")); assert(test_file(ctx, "keymaps/no-types.xkb")); assert(test_file(ctx, "keymaps/quartz.xkb")); assert(test_file(ctx, "keymaps/no-aliases.xkb")); assert(!test_file(ctx, "keymaps/divide-by-zero.xkb")); assert(!test_file(ctx, "keymaps/bad.xkb")); assert(!test_file(ctx, "keymaps/syntax-error.xkb")); assert(!test_file(ctx, "keymaps/syntax-error2.xkb")); assert(!test_file(ctx, "does not exist")); /* Test response to invalid flags and formats. */ fclose(stdin); assert(!xkb_keymap_new_from_file(ctx, NULL, XKB_KEYMAP_FORMAT_TEXT_V1, 0)); assert(!xkb_keymap_new_from_file(ctx, stdin, 0, 0)); assert(!xkb_keymap_new_from_file(ctx, stdin, XKB_KEYMAP_USE_ORIGINAL_FORMAT, 0)); assert(!xkb_keymap_new_from_file(ctx, stdin, 1234, 0)); assert(!xkb_keymap_new_from_file(ctx, stdin, XKB_KEYMAP_FORMAT_TEXT_V1, -1)); assert(!xkb_keymap_new_from_file(ctx, stdin, XKB_KEYMAP_FORMAT_TEXT_V1, 1234)); xkb_context_unref(ctx); return 0; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.925311 libxkbcommon-0.10.0/test/interactive-evdev.c0000644000175000017500000003177500000000000020423 0ustar00ranran00000000000000/* * 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. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include "test.h" struct keyboard { char *path; int fd; struct xkb_state *state; struct xkb_compose_state *compose_state; struct keyboard *next; }; static bool terminate; static int evdev_offset = 8; static bool report_state_changes; static bool with_compose; static enum xkb_consumed_mode consumed_mode = XKB_CONSUMED_MODE_XKB; #define NLONGS(n) (((n) + LONG_BIT - 1) / LONG_BIT) static bool evdev_bit_is_set(const unsigned long *array, int bit) { return array[bit / LONG_BIT] & (1LL << (bit % LONG_BIT)); } /* Some heuristics to see if the device is a keyboard. */ static bool is_keyboard(int fd) { int i; unsigned long evbits[NLONGS(EV_CNT)] = { 0 }; unsigned long keybits[NLONGS(KEY_CNT)] = { 0 }; errno = 0; ioctl(fd, EVIOCGBIT(0, sizeof(evbits)), evbits); if (errno) return false; if (!evdev_bit_is_set(evbits, EV_KEY)) return false; errno = 0; ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits); if (errno) return false; for (i = KEY_RESERVED; i <= KEY_MIN_INTERESTING; i++) if (evdev_bit_is_set(keybits, i)) return true; return false; } static int keyboard_new(struct dirent *ent, struct xkb_keymap *keymap, struct xkb_compose_table *compose_table, struct keyboard **out) { int ret; char *path; int fd; struct xkb_state *state; struct xkb_compose_state *compose_state = NULL; struct keyboard *kbd; ret = asprintf(&path, "/dev/input/%s", ent->d_name); if (ret < 0) return -ENOMEM; fd = open(path, O_NONBLOCK | O_CLOEXEC | O_RDONLY); if (fd < 0) { ret = -errno; goto err_path; } if (!is_keyboard(fd)) { /* Dummy "skip this device" value. */ ret = -ENOTSUP; goto err_fd; } state = xkb_state_new(keymap); if (!state) { fprintf(stderr, "Couldn't create xkb state for %s\n", path); ret = -EFAULT; goto err_fd; } if (with_compose) { compose_state = xkb_compose_state_new(compose_table, XKB_COMPOSE_STATE_NO_FLAGS); if (!compose_state) { fprintf(stderr, "Couldn't create compose state for %s\n", path); ret = -EFAULT; goto err_state; } } kbd = calloc(1, sizeof(*kbd)); if (!kbd) { ret = -ENOMEM; goto err_compose_state; } kbd->path = path; kbd->fd = fd; kbd->state = state; kbd->compose_state = compose_state; *out = kbd; return 0; err_compose_state: xkb_compose_state_unref(compose_state); err_state: xkb_state_unref(state); err_fd: close(fd); err_path: free(path); return ret; } static void keyboard_free(struct keyboard *kbd) { if (!kbd) return; if (kbd->fd >= 0) close(kbd->fd); free(kbd->path); xkb_state_unref(kbd->state); xkb_compose_state_unref(kbd->compose_state); free(kbd); } static int filter_device_name(const struct dirent *ent) { return !fnmatch("event*", ent->d_name, 0); } static struct keyboard * get_keyboards(struct xkb_keymap *keymap, struct xkb_compose_table *compose_table) { int ret, i, nents; struct dirent **ents; struct keyboard *kbds = NULL, *kbd = NULL; nents = scandir("/dev/input", &ents, filter_device_name, alphasort); if (nents < 0) { fprintf(stderr, "Couldn't scan /dev/input: %s\n", strerror(errno)); return NULL; } for (i = 0; i < nents; i++) { ret = keyboard_new(ents[i], keymap, compose_table, &kbd); if (ret) { if (ret == -EACCES) { fprintf(stderr, "Couldn't open /dev/input/%s: %s. " "You probably need root to run this.\n", ents[i]->d_name, strerror(-ret)); break; } if (ret != -ENOTSUP) { fprintf(stderr, "Couldn't open /dev/input/%s: %s. Skipping.\n", ents[i]->d_name, strerror(-ret)); } continue; } assert(kbd != NULL); kbd->next = kbds; kbds = kbd; } if (!kbds) { fprintf(stderr, "Couldn't find any keyboards I can use! Quitting.\n"); goto err; } err: for (i = 0; i < nents; i++) free(ents[i]); free(ents); return kbds; } static void free_keyboards(struct keyboard *kbds) { struct keyboard *next; while (kbds) { next = kbds->next; keyboard_free(kbds); kbds = next; } } /* The meaning of the input_event 'value' field. */ enum { KEY_STATE_RELEASE = 0, KEY_STATE_PRESS = 1, KEY_STATE_REPEAT = 2, }; static void process_event(struct keyboard *kbd, uint16_t type, uint16_t code, int32_t value) { xkb_keycode_t keycode; struct xkb_keymap *keymap; enum xkb_state_component changed; enum xkb_compose_status status; if (type != EV_KEY) return; keycode = evdev_offset + code; keymap = xkb_state_get_keymap(kbd->state); if (value == KEY_STATE_REPEAT && !xkb_keymap_key_repeats(keymap, keycode)) return; if (with_compose && value != KEY_STATE_RELEASE) { xkb_keysym_t keysym = xkb_state_key_get_one_sym(kbd->state, keycode); xkb_compose_state_feed(kbd->compose_state, keysym); } if (value != KEY_STATE_RELEASE) test_print_keycode_state(kbd->state, kbd->compose_state, keycode, consumed_mode); if (with_compose) { status = xkb_compose_state_get_status(kbd->compose_state); if (status == XKB_COMPOSE_CANCELLED || status == XKB_COMPOSE_COMPOSED) xkb_compose_state_reset(kbd->compose_state); } if (value == KEY_STATE_RELEASE) changed = xkb_state_update_key(kbd->state, keycode, XKB_KEY_UP); else changed = xkb_state_update_key(kbd->state, keycode, XKB_KEY_DOWN); if (report_state_changes) test_print_state_changes(changed); } static int read_keyboard(struct keyboard *kbd) { ssize_t len; struct input_event evs[16]; /* No fancy error checking here. */ while ((len = read(kbd->fd, &evs, sizeof(evs))) > 0) { const size_t nevs = len / sizeof(struct input_event); for (size_t i = 0; i < nevs; i++) process_event(kbd, evs[i].type, evs[i].code, evs[i].value); } if (len < 0 && errno != EWOULDBLOCK) { fprintf(stderr, "Couldn't read %s: %s\n", kbd->path, strerror(errno)); return -errno; } return 0; } static int loop(struct keyboard *kbds) { int i, ret; int epfd; struct keyboard *kbd; struct epoll_event ev; struct epoll_event evs[16]; epfd = epoll_create1(0); if (epfd < 0) { fprintf(stderr, "Couldn't create epoll instance: %s\n", strerror(errno)); return -errno; } for (kbd = kbds; kbd; kbd = kbd->next) { memset(&ev, 0, sizeof(ev)); ev.events = EPOLLIN; ev.data.ptr = kbd; ret = epoll_ctl(epfd, EPOLL_CTL_ADD, kbd->fd, &ev); if (ret) { ret = -errno; fprintf(stderr, "Couldn't add %s to epoll: %s\n", kbd->path, strerror(errno)); goto err_epoll; } } while (!terminate) { ret = epoll_wait(epfd, evs, 16, -1); if (ret < 0) { if (errno == EINTR) continue; ret = -errno; fprintf(stderr, "Couldn't poll for events: %s\n", strerror(errno)); goto err_epoll; } for (i = 0; i < ret; i++) { kbd = evs[i].data.ptr; ret = read_keyboard(kbd); if (ret) { goto err_epoll; } } } close(epfd); return 0; err_epoll: close(epfd); return ret; } static void sigintr_handler(int signum) { terminate = true; } int main(int argc, char *argv[]) { int ret; int opt; struct keyboard *kbds; struct xkb_context *ctx; struct xkb_keymap *keymap; struct xkb_compose_table *compose_table = NULL; const char *rules = NULL; const char *model = NULL; const char *layout = NULL; const char *variant = NULL; const char *options = NULL; const char *keymap_path = NULL; const char *locale; struct sigaction act; setlocale(LC_ALL, ""); while ((opt = getopt(argc, argv, "r:m:l:v:o:k:n:cdg")) != -1) { switch (opt) { case 'r': rules = optarg; break; case 'm': model = optarg; break; case 'l': layout = optarg; break; case 'v': variant = optarg; break; case 'o': options = optarg; break; case 'k': keymap_path = optarg; break; case 'n': errno = 0; evdev_offset = strtol(optarg, NULL, 10); if (errno) { fprintf(stderr, "error: -n option expects a number\n"); exit(EXIT_FAILURE); } break; case 'c': report_state_changes = true; break; case 'd': with_compose = true; break; case 'g': consumed_mode = XKB_CONSUMED_MODE_GTK; break; case '?': fprintf(stderr, " Usage: %s [-r ] [-m ] " "[-l ] [-v ] [-o ]\n", argv[0]); fprintf(stderr, " or: %s -k \n", argv[0]); fprintf(stderr, "For both: -n \n" " -c (to report changes to the state)\n" " -d (to enable compose)\n" " -g (to use GTK consumed mode)\n"); exit(2); } } ctx = test_get_context(0); if (!ctx) { ret = -1; fprintf(stderr, "Couldn't create xkb context\n"); goto err_out; } if (keymap_path) { FILE *file = fopen(keymap_path, "rb"); if (!file) { ret = EXIT_FAILURE; fprintf(stderr, "Couldn't open '%s': %s\n", keymap_path, strerror(errno)); goto err_ctx; } keymap = xkb_keymap_new_from_file(ctx, file, XKB_KEYMAP_FORMAT_TEXT_V1, 0); fclose(file); } else { keymap = test_compile_rules(ctx, rules, model, layout, variant, options); } if (!keymap) { ret = -1; fprintf(stderr, "Couldn't create xkb keymap\n"); goto err_ctx; } if (with_compose) { locale = setlocale(LC_CTYPE, NULL); compose_table = xkb_compose_table_new_from_locale(ctx, locale, XKB_COMPOSE_COMPILE_NO_FLAGS); if (!compose_table) { ret = -1; fprintf(stderr, "Couldn't create compose from locale\n"); goto err_xkb; } } kbds = get_keyboards(keymap, compose_table); if (!kbds) { ret = -1; goto err_compose; } act.sa_handler = sigintr_handler; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGINT, &act, NULL); sigaction(SIGTERM, &act, NULL); test_disable_stdin_echo(); ret = loop(kbds); test_enable_stdin_echo(); free_keyboards(kbds); err_compose: xkb_compose_table_unref(compose_table); err_xkb: xkb_keymap_unref(keymap); err_ctx: xkb_context_unref(ctx); err_out: exit(ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE); } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.9319777 libxkbcommon-0.10.0/test/interactive-wayland.c0000644000175000017500000004520700000000000020744 0ustar00ranran00000000000000/* * Copyright © 2012 Collabora, Ltd. * Copyright © 2013 Ran Benita * Copyright © 2016 Daniel Stone * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include #include #include #include #include #include "xkbcommon/xkbcommon.h" #include "test.h" #include #include "xdg-shell-client-protocol.h" #include struct interactive_dpy { struct wl_display *dpy; struct wl_compositor *compositor; struct xdg_wm_base *shell; struct wl_shm *shm; uint32_t shm_format; struct xkb_context *ctx; struct wl_surface *wl_surf; struct xdg_surface *xdg_surf; struct xdg_toplevel *xdg_top; struct wl_list seats; }; struct interactive_seat { struct interactive_dpy *inter; struct wl_seat *wl_seat; struct wl_keyboard *wl_kbd; struct wl_pointer *wl_pointer; uint32_t version; /* ... of wl_seat */ uint32_t global_name; /* an ID of sorts */ char *name_str; /* a descriptor */ struct xkb_keymap *keymap; struct xkb_state *state; struct wl_list link; }; static bool terminate; #ifdef HAVE_MKOSTEMP static int create_tmpfile_cloexec(char *tmpname) { int fd = mkostemp(tmpname, O_CLOEXEC); if (fd >= 0) unlink(tmpname); return fd; } #else /* The following utility functions are taken from Weston's * shared/os-compatibility.c. */ static int os_fd_set_cloexec(int fd) { long flags; if (fd == -1) return -1; flags = fcntl(fd, F_GETFD); if (flags == -1) return -1; if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) return -1; return 0; } static int set_cloexec_or_close(int fd) { if (os_fd_set_cloexec(fd) != 0) { close(fd); return -1; } return fd; } static int create_tmpfile_cloexec(char *tmpname) { int fd = mkstemp(tmpname); if (fd >= 0) { fd = set_cloexec_or_close(fd); unlink(tmpname); } return fd; } #endif /* * Create a new, unique, anonymous file of the given size, and * return the file descriptor for it. The file descriptor is set * CLOEXEC. The file is immediately suitable for mmap()'ing * the given size at offset zero. * * The file should not have a permanent backing store like a disk, * but may have if XDG_RUNTIME_DIR is not properly implemented in OS. * * The file name is deleted from the file system. * * The file is suitable for buffer sharing between processes by * transmitting the file descriptor over Unix sockets using the * SCM_RIGHTS methods. * * If the C library implements posix_fallocate(), it is used to * guarantee that disk space is available for the file at the * given size. If disk space is insufficent, errno is set to ENOSPC. * If posix_fallocate() is not supported, program may receive * SIGBUS on accessing mmap()'ed file contents instead. */ static int os_create_anonymous_file(off_t size) { static const char template[] = "/weston-shared-XXXXXX"; const char *path; char *name; int fd; int ret; path = getenv("XDG_RUNTIME_DIR"); if (!path) { errno = ENOENT; return -1; } name = malloc(strlen(path) + sizeof(template)); if (!name) return -1; strcpy(name, path); strcat(name, template); fd = create_tmpfile_cloexec(name); free(name); if (fd < 0) return -1; #ifdef HAVE_POSIX_FALLOCATE ret = posix_fallocate(fd, 0, size); if (ret != 0) { close(fd); errno = ret; return -1; } #else ret = ftruncate(fd, size); if (ret < 0) { close(fd); return -1; } #endif return fd; } static void buffer_release(void *data, struct wl_buffer *buffer) { wl_buffer_destroy(buffer); } static const struct wl_buffer_listener buffer_listener = { buffer_release }; static void buffer_create(struct interactive_dpy *inter, uint32_t width, uint32_t height) { struct wl_shm_pool *pool; struct wl_buffer *buf; struct wl_region *opaque; uint32_t stride; size_t size; void *map; int fd; switch (inter->shm_format) { case WL_SHM_FORMAT_ARGB8888: case WL_SHM_FORMAT_XRGB8888: case WL_SHM_FORMAT_ABGR8888: case WL_SHM_FORMAT_XBGR8888: stride = width * 4; break; case WL_SHM_FORMAT_RGB565: case WL_SHM_FORMAT_BGR565: stride = width * 2; break; default: fprintf(stderr, "Unsupported SHM format %d\n", inter->shm_format); exit(1); } size = stride * height; fd = os_create_anonymous_file(size); if (fd < 0) { fprintf(stderr, "Couldn't create surface buffer\n"); exit(1); } map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (map == MAP_FAILED) { fprintf(stderr, "Couldn't mmap surface buffer\n"); exit(1); } memset(map, 0xff, size); munmap(map, size); pool = wl_shm_create_pool(inter->shm, fd, size); buf = wl_shm_pool_create_buffer(pool, 0, width, height, stride, inter->shm_format); wl_buffer_add_listener(buf, &buffer_listener, inter); wl_surface_attach(inter->wl_surf, buf, 0, 0); wl_surface_damage(inter->wl_surf, 0, 0, width, height); opaque = wl_compositor_create_region(inter->compositor); wl_region_add(opaque, 0, 0, width, height); wl_surface_set_opaque_region(inter->wl_surf, opaque); wl_region_destroy(opaque); wl_shm_pool_destroy(pool); close(fd); } static void surface_configure(void *data, struct xdg_surface *surface, uint32_t serial) { struct interactive_dpy *inter = data; xdg_surface_ack_configure(inter->xdg_surf, serial); wl_surface_commit(inter->wl_surf); } static const struct xdg_surface_listener surface_listener = { surface_configure, }; static void toplevel_configure(void *data, struct xdg_toplevel *toplevel, int32_t width, int32_t height, struct wl_array *states) { struct interactive_dpy *inter = data; if (width == 0) width = 200; if (height == 0) height = 200; buffer_create(inter, width, height); } static void toplevel_close(void *data, struct xdg_toplevel *toplevel) { terminate = true; } static const struct xdg_toplevel_listener toplevel_listener = { toplevel_configure, toplevel_close }; static void surface_create(struct interactive_dpy *inter) { inter->wl_surf = wl_compositor_create_surface(inter->compositor); inter->xdg_surf = xdg_wm_base_get_xdg_surface(inter->shell, inter->wl_surf); xdg_surface_add_listener(inter->xdg_surf, &surface_listener, inter); inter->xdg_top = xdg_surface_get_toplevel(inter->xdg_surf); xdg_toplevel_add_listener(inter->xdg_top, &toplevel_listener, inter); xdg_toplevel_set_title(inter->xdg_top, "xkbcommon event tester"); xdg_toplevel_set_app_id(inter->xdg_top, "org.xkbcommon.test.interactive-wayland"); wl_surface_commit(inter->wl_surf); } static void shell_ping(void *data, struct xdg_wm_base *shell, uint32_t serial) { xdg_wm_base_pong(shell, serial); } static const struct xdg_wm_base_listener shell_listener = { shell_ping }; static void kbd_keymap(void *data, struct wl_keyboard *wl_kbd, uint32_t format, int fd, uint32_t size) { struct interactive_seat *seat = data; void *buf; buf = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); if (buf == MAP_FAILED) { fprintf(stderr, "Failed to mmap keymap: %d\n", errno); close(fd); return; } seat->keymap = xkb_keymap_new_from_buffer(seat->inter->ctx, buf, size - 1, XKB_KEYMAP_FORMAT_TEXT_V1, 0); munmap(buf, size); close(fd); if (!seat->keymap) { fprintf(stderr, "Failed to compile keymap!\n"); return; } seat->state = xkb_state_new(seat->keymap); if (!seat->state) { fprintf(stderr, "Failed to create XKB state!\n"); return; } } static void kbd_enter(void *data, struct wl_keyboard *wl_kbd, uint32_t serial, struct wl_surface *surf, struct wl_array *keys) { } static void kbd_leave(void *data, struct wl_keyboard *wl_kbd, uint32_t serial, struct wl_surface *surf) { } static void kbd_key(void *data, struct wl_keyboard *wl_kbd, uint32_t serial, uint32_t time, uint32_t key, uint32_t state) { struct interactive_seat *seat = data; if (state != WL_KEYBOARD_KEY_STATE_PRESSED) return; printf("%s: ", seat->name_str); test_print_keycode_state(seat->state, NULL, key + 8, XKB_CONSUMED_MODE_XKB); /* Exit on ESC. */ if (xkb_state_key_get_one_sym(seat->state, key + 8) == XKB_KEY_Escape) terminate = true; } static void kbd_modifiers(void *data, struct wl_keyboard *wl_kbd, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group) { struct interactive_seat *seat = data; xkb_state_update_mask(seat->state, mods_depressed, mods_latched, mods_locked, 0, 0, group); } static void kbd_repeat_info(void *data, struct wl_keyboard *wl_kbd, int32_t rate, int32_t delay) { } static const struct wl_keyboard_listener kbd_listener = { kbd_keymap, kbd_enter, kbd_leave, kbd_key, kbd_modifiers, kbd_repeat_info }; static void pointer_enter(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surf, wl_fixed_t fsx, wl_fixed_t fsy) { } static void pointer_leave(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surf) { } static void pointer_motion(void *data, struct wl_pointer *wl_pointer, uint32_t time, wl_fixed_t fsx, wl_fixed_t fsy) { } static void pointer_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) { struct interactive_seat *seat = data; xdg_toplevel_move(seat->inter->xdg_top, seat->wl_seat, serial); } static void pointer_axis(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { } static void pointer_frame(void *data, struct wl_pointer *wl_pointer) { } static void pointer_axis_source(void *data, struct wl_pointer *wl_pointer, uint32_t source) { } static void pointer_axis_stop(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis) { } static void pointer_axis_discrete(void *data, struct wl_pointer *wl_pointer, uint32_t time, int32_t discrete) { } static const struct wl_pointer_listener pointer_listener = { pointer_enter, pointer_leave, pointer_motion, pointer_button, pointer_axis, pointer_frame, pointer_axis_source, pointer_axis_stop, pointer_axis_discrete }; static void seat_capabilities(void *data, struct wl_seat *wl_seat, uint32_t caps) { struct interactive_seat *seat = data; if (!seat->wl_kbd && (caps & WL_SEAT_CAPABILITY_KEYBOARD)) { seat->wl_kbd = wl_seat_get_keyboard(seat->wl_seat); wl_keyboard_add_listener(seat->wl_kbd, &kbd_listener, seat); } else if (seat->wl_kbd && !(caps & WL_SEAT_CAPABILITY_KEYBOARD)) { if (seat->version >= WL_SEAT_RELEASE_SINCE_VERSION) wl_keyboard_release(seat->wl_kbd); else wl_keyboard_destroy(seat->wl_kbd); xkb_state_unref(seat->state); xkb_keymap_unref(seat->keymap); seat->state = NULL; seat->keymap = NULL; seat->wl_kbd = NULL; } if (!seat->wl_pointer && (caps & WL_SEAT_CAPABILITY_POINTER)) { seat->wl_pointer = wl_seat_get_pointer(seat->wl_seat); wl_pointer_add_listener(seat->wl_pointer, &pointer_listener, seat); } else if (seat->wl_pointer && !(caps & WL_SEAT_CAPABILITY_POINTER)) { if (seat->version >= WL_SEAT_RELEASE_SINCE_VERSION) wl_pointer_release(seat->wl_pointer); else wl_pointer_destroy(seat->wl_pointer); seat->wl_pointer = NULL; } } static void seat_name(void *data, struct wl_seat *wl_seat, const char *name) { struct interactive_seat *seat = data; free(seat->name_str); seat->name_str = strdup(name); } static const struct wl_seat_listener seat_listener = { seat_capabilities, seat_name }; static void seat_create(struct interactive_dpy *inter, struct wl_registry *registry, uint32_t name, uint32_t version) { int ret; struct interactive_seat *seat = calloc(1, sizeof(*seat)); seat->global_name = name; seat->inter = inter; seat->wl_seat = wl_registry_bind(registry, name, &wl_seat_interface, MAX(version, 5)); wl_seat_add_listener(seat->wl_seat, &seat_listener, seat); ret = asprintf(&seat->name_str, "seat:%d", wl_proxy_get_id((struct wl_proxy *) seat->wl_seat)); assert(ret >= 0); wl_list_insert(&inter->seats, &seat->link); } static void seat_destroy(struct interactive_seat *seat) { if (seat->wl_kbd) { if (seat->version >= WL_SEAT_RELEASE_SINCE_VERSION) wl_keyboard_release(seat->wl_kbd); else wl_keyboard_destroy(seat->wl_kbd); xkb_state_unref(seat->state); xkb_keymap_unref(seat->keymap); } if (seat->wl_pointer) { if (seat->version >= WL_SEAT_RELEASE_SINCE_VERSION) wl_pointer_release(seat->wl_pointer); else wl_pointer_destroy(seat->wl_pointer); } if (seat->version >= WL_SEAT_RELEASE_SINCE_VERSION) wl_seat_release(seat->wl_seat); else wl_seat_destroy(seat->wl_seat); free(seat->name_str); wl_list_remove(&seat->link); free(seat); } static void registry_global(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) { struct interactive_dpy *inter = data; if (strcmp(interface, "wl_seat") == 0) { seat_create(inter, registry, name, version); } else if (strcmp(interface, "xdg_wm_base") == 0) { inter->shell = wl_registry_bind(registry, name, &xdg_wm_base_interface, MAX(version, 2)); xdg_wm_base_add_listener(inter->shell, &shell_listener, inter); } else if (strcmp(interface, "wl_compositor") == 0) { inter->compositor = wl_registry_bind(registry, name, &wl_compositor_interface, MAX(version, 1)); } else if (strcmp(interface, "wl_shm") == 0) { inter->shm = wl_registry_bind(registry, name, &wl_shm_interface, MAX(version, 1)); } } static void registry_delete(void *data, struct wl_registry *registry, uint32_t name) { struct interactive_dpy *inter = data; struct interactive_seat *seat, *tmp; wl_list_for_each_safe(seat, tmp, &inter->seats, link) { if (seat->global_name != name) continue; seat_destroy(seat); } } static const struct wl_registry_listener registry_listener = { registry_global, registry_delete }; static void dpy_disconnect(struct interactive_dpy *inter) { struct interactive_seat *seat, *tmp; wl_list_for_each_safe(seat, tmp, &inter->seats, link) seat_destroy(seat); if (inter->xdg_surf) xdg_surface_destroy(inter->xdg_surf); if (inter->xdg_top) xdg_toplevel_destroy(inter->xdg_top); if (inter->wl_surf) wl_surface_destroy(inter->wl_surf); if (inter->shell) xdg_wm_base_destroy(inter->shell); if (inter->compositor) wl_compositor_destroy(inter->compositor); if (inter->shm) wl_shm_destroy(inter->shm); /* Do one last roundtrip to try to destroy our wl_buffer. */ wl_display_roundtrip(inter->dpy); xkb_context_unref(inter->ctx); wl_display_disconnect(inter->dpy); } int main(int argc, char *argv[]) { int ret; struct interactive_dpy inter; struct wl_registry *registry; setlocale(LC_ALL, ""); memset(&inter, 0, sizeof(inter)); wl_list_init(&inter.seats); inter.dpy = wl_display_connect(NULL); if (!inter.dpy) { fprintf(stderr, "Couldn't connect to Wayland server\n"); ret = -1; goto err_out; } inter.ctx = test_get_context(0); if (!inter.ctx) { ret = -1; fprintf(stderr, "Couldn't create xkb context\n"); goto err_out; } registry = wl_display_get_registry(inter.dpy); wl_registry_add_listener(registry, ®istry_listener, &inter); /* The first roundtrip gets the list of advertised globals. */ wl_display_roundtrip(inter.dpy); /* The second roundtrip dispatches the events sent after binding, e.g. * after binding to wl_seat globals in the first roundtrip, we will get * the wl_seat::capabilities event in this roundtrip. */ wl_display_roundtrip(inter.dpy); if (!inter.shell || !inter.shm || !inter.compositor) { fprintf(stderr, "Required Wayland interfaces %s%s%s unsupported\n", (inter.shell) ? "" : "xdg_shell ", (inter.shm) ? "" : "wl_shm", (inter.compositor) ? "" : "wl_compositor"); ret = -1; goto err_conn; } surface_create(&inter); test_disable_stdin_echo(); do { ret = wl_display_dispatch(inter.dpy); } while (ret >= 0 && !terminate); test_enable_stdin_echo(); wl_registry_destroy(registry); err_conn: dpy_disconnect(&inter); err_out: exit(ret >= 0 ? EXIT_SUCCESS : EXIT_FAILURE); } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.935311 libxkbcommon-0.10.0/test/interactive-x11.c0000644000175000017500000002670000000000000017713 0ustar00ranran00000000000000/* * 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 "config.h" #include #include #include "xkbcommon/xkbcommon-x11.h" #include "test.h" /* * Note: This program only handles the core keyboard device for now. * It should be straigtforward to change struct keyboard to a list of * keyboards with device IDs, as in test/interactive-evdev.c. This would * require: * * - Initially listing the keyboard devices. * - Listening to device changes. * - Matching events to their devices. * * XKB itself knows about xinput1 devices, and most requests and events are * device-specific. * * In order to list the devices and react to changes, you need xinput1/2. * You also need xinput for the key press/release event, since the core * protocol key press event does not carry a device ID to match on. */ struct keyboard { xcb_connection_t *conn; uint8_t first_xkb_event; struct xkb_context *ctx; struct xkb_keymap *keymap; struct xkb_state *state; int32_t device_id; }; static bool terminate; static int select_xkb_events_for_device(xcb_connection_t *conn, int32_t device_id) { enum { required_events = (XCB_XKB_EVENT_TYPE_NEW_KEYBOARD_NOTIFY | XCB_XKB_EVENT_TYPE_MAP_NOTIFY | XCB_XKB_EVENT_TYPE_STATE_NOTIFY), required_nkn_details = (XCB_XKB_NKN_DETAIL_KEYCODES), required_map_parts = (XCB_XKB_MAP_PART_KEY_TYPES | XCB_XKB_MAP_PART_KEY_SYMS | XCB_XKB_MAP_PART_MODIFIER_MAP | XCB_XKB_MAP_PART_EXPLICIT_COMPONENTS | XCB_XKB_MAP_PART_KEY_ACTIONS | XCB_XKB_MAP_PART_VIRTUAL_MODS | XCB_XKB_MAP_PART_VIRTUAL_MOD_MAP), required_state_details = (XCB_XKB_STATE_PART_MODIFIER_BASE | XCB_XKB_STATE_PART_MODIFIER_LATCH | XCB_XKB_STATE_PART_MODIFIER_LOCK | XCB_XKB_STATE_PART_GROUP_BASE | XCB_XKB_STATE_PART_GROUP_LATCH | XCB_XKB_STATE_PART_GROUP_LOCK), }; static const xcb_xkb_select_events_details_t details = { .affectNewKeyboard = required_nkn_details, .newKeyboardDetails = required_nkn_details, .affectState = required_state_details, .stateDetails = required_state_details, }; xcb_void_cookie_t cookie = xcb_xkb_select_events_aux_checked(conn, device_id, required_events, /* affectWhich */ 0, /* clear */ 0, /* selectAll */ required_map_parts, /* affectMap */ required_map_parts, /* map */ &details); /* details */ xcb_generic_error_t *error = xcb_request_check(conn, cookie); if (error) { free(error); return -1; } return 0; } static int update_keymap(struct keyboard *kbd) { struct xkb_keymap *new_keymap; struct xkb_state *new_state; new_keymap = xkb_x11_keymap_new_from_device(kbd->ctx, kbd->conn, kbd->device_id, 0); if (!new_keymap) goto err_out; new_state = xkb_x11_state_new_from_device(new_keymap, kbd->conn, kbd->device_id); if (!new_state) goto err_keymap; if (kbd->keymap) printf("Keymap updated!\n"); xkb_state_unref(kbd->state); xkb_keymap_unref(kbd->keymap); kbd->keymap = new_keymap; kbd->state = new_state; return 0; err_keymap: xkb_keymap_unref(new_keymap); err_out: return -1; } static int init_kbd(struct keyboard *kbd, xcb_connection_t *conn, uint8_t first_xkb_event, int32_t device_id, struct xkb_context *ctx) { int ret; kbd->conn = conn; kbd->first_xkb_event = first_xkb_event; kbd->ctx = ctx; kbd->keymap = NULL; kbd->state = NULL; kbd->device_id = device_id; ret = update_keymap(kbd); if (ret) goto err_out; ret = select_xkb_events_for_device(conn, device_id); if (ret) goto err_state; return 0; err_state: xkb_state_unref(kbd->state); xkb_keymap_unref(kbd->keymap); err_out: return -1; } static void deinit_kbd(struct keyboard *kbd) { xkb_state_unref(kbd->state); xkb_keymap_unref(kbd->keymap); } static void process_xkb_event(xcb_generic_event_t *gevent, struct keyboard *kbd) { union xkb_event { struct { uint8_t response_type; uint8_t xkbType; uint16_t sequence; xcb_timestamp_t time; uint8_t deviceID; } any; xcb_xkb_new_keyboard_notify_event_t new_keyboard_notify; xcb_xkb_map_notify_event_t map_notify; xcb_xkb_state_notify_event_t state_notify; } *event = (union xkb_event *) gevent; if (event->any.deviceID != kbd->device_id) return; /* * XkbNewKkdNotify and XkbMapNotify together capture all sorts of keymap * updates (e.g. xmodmap, xkbcomp, setxkbmap), with minimal redundent * recompilations. */ switch (event->any.xkbType) { case XCB_XKB_NEW_KEYBOARD_NOTIFY: if (event->new_keyboard_notify.changed & XCB_XKB_NKN_DETAIL_KEYCODES) update_keymap(kbd); break; case XCB_XKB_MAP_NOTIFY: update_keymap(kbd); break; case XCB_XKB_STATE_NOTIFY: xkb_state_update_mask(kbd->state, event->state_notify.baseMods, event->state_notify.latchedMods, event->state_notify.lockedMods, event->state_notify.baseGroup, event->state_notify.latchedGroup, event->state_notify.lockedGroup); break; } } static void process_event(xcb_generic_event_t *gevent, struct keyboard *kbd) { switch (gevent->response_type) { case XCB_KEY_PRESS: { xcb_key_press_event_t *event = (xcb_key_press_event_t *) gevent; xkb_keycode_t keycode = event->detail; test_print_keycode_state(kbd->state, NULL, keycode, XKB_CONSUMED_MODE_XKB); /* Exit on ESC. */ if (keycode == 9) terminate = true; break; } default: if (gevent->response_type == kbd->first_xkb_event) process_xkb_event(gevent, kbd); break; } } static int loop(xcb_connection_t *conn, struct keyboard *kbd) { while (!terminate) { xcb_generic_event_t *event; switch (xcb_connection_has_error(conn)) { case 0: break; case XCB_CONN_ERROR: fprintf(stderr, "Closed connection to X server: connection error\n"); return -1; case XCB_CONN_CLOSED_EXT_NOTSUPPORTED: fprintf(stderr, "Closed connection to X server: extension not supported\n"); return -1; default: fprintf(stderr, "Closed connection to X server: error code %d\n", xcb_connection_has_error(conn)); return -1; } event = xcb_wait_for_event(conn); if (!event) { continue; } process_event(event, kbd); free(event); } return 0; } static int create_capture_window(xcb_connection_t *conn) { xcb_generic_error_t *error; xcb_void_cookie_t cookie; xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data; xcb_window_t window = xcb_generate_id(conn); uint32_t values[2] = { screen->white_pixel, XCB_EVENT_MASK_KEY_PRESS, }; cookie = xcb_create_window_checked(conn, XCB_COPY_FROM_PARENT, window, screen->root, 10, 10, 100, 100, 1, XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK, values); if ((error = xcb_request_check(conn, cookie)) != NULL) { free(error); return -1; } cookie = xcb_map_window_checked(conn, window); if ((error = xcb_request_check(conn, cookie)) != NULL) { free(error); return -1; } return 0; } int main(int argc, char *argv[]) { int ret; xcb_connection_t *conn; uint8_t first_xkb_event; int32_t core_kbd_device_id; struct xkb_context *ctx; struct keyboard core_kbd; setlocale(LC_ALL, ""); conn = xcb_connect(NULL, NULL); if (!conn || xcb_connection_has_error(conn)) { fprintf(stderr, "Couldn't connect to X server: error code %d\n", conn ? xcb_connection_has_error(conn) : -1); ret = -1; goto err_out; } ret = xkb_x11_setup_xkb_extension(conn, XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION, XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS, NULL, NULL, &first_xkb_event, NULL); if (!ret) { fprintf(stderr, "Couldn't setup XKB extension\n"); goto err_conn; } ctx = test_get_context(0); if (!ctx) { ret = -1; fprintf(stderr, "Couldn't create xkb context\n"); goto err_conn; } core_kbd_device_id = xkb_x11_get_core_keyboard_device_id(conn); if (core_kbd_device_id == -1) { ret = -1; fprintf(stderr, "Couldn't find core keyboard device\n"); goto err_ctx; } ret = init_kbd(&core_kbd, conn, first_xkb_event, core_kbd_device_id, ctx); if (ret) { fprintf(stderr, "Couldn't initialize core keyboard device\n"); goto err_ctx; } ret = create_capture_window(conn); if (ret) { fprintf(stderr, "Couldn't create a capture window\n"); goto err_core_kbd; } test_disable_stdin_echo(); ret = loop(conn, &core_kbd); test_enable_stdin_echo(); err_core_kbd: deinit_kbd(&core_kbd); err_ctx: xkb_context_unref(ctx); err_conn: xcb_disconnect(conn); err_out: exit(ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE); } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.935311 libxkbcommon-0.10.0/test/keymap.c0000644000175000017500000000422100000000000016247 0ustar00ranran00000000000000/* * Copyright © 2016 Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * * Author: Mike Blumenkrantz */ #include "config.h" #include #include #include #include "test.h" int main(void) { struct xkb_context *context = test_get_context(0); struct xkb_keymap *keymap; xkb_keycode_t kc; const char *keyname; assert(context); keymap = test_compile_rules(context, "evdev", "pc104", "us,ru", NULL, "grp:menu_toggle"); assert(keymap); kc = xkb_keymap_key_by_name(keymap, "AE09"); assert(kc != XKB_KEYCODE_INVALID); keyname = xkb_keymap_key_get_name(keymap, kc); assert(streq(keyname, "AE09")); kc = xkb_keymap_key_by_name(keymap, "COMP"); assert(kc != XKB_KEYCODE_INVALID); keyname = xkb_keymap_key_get_name(keymap, kc); assert(streq(keyname, "COMP")); kc = xkb_keymap_key_by_name(keymap, "MENU"); assert(kc != XKB_KEYCODE_INVALID); keyname = xkb_keymap_key_get_name(keymap, kc); assert(streq(keyname, "COMP")); xkb_keymap_unref(keymap); xkb_context_unref(context); } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.9486442 libxkbcommon-0.10.0/test/keyseq.c0000644000175000017500000007043300000000000016272 0ustar00ranran00000000000000/* * 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. */ #include "config.h" #include "evdev-scancodes.h" #include "test.h" int main(void) { struct xkb_context *ctx = test_get_context(0); struct xkb_keymap *keymap; assert(ctx); keymap = test_compile_rules(ctx, "evdev", "evdev", "us,il,ru,de", ",,phonetic,neo", "grp:alt_shift_toggle,grp:menu_toggle"); assert(keymap); assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_E, BOTH, XKB_KEY_e, NEXT, KEY_L, BOTH, XKB_KEY_l, NEXT, KEY_L, BOTH, XKB_KEY_l, NEXT, KEY_O, BOTH, XKB_KEY_o, FINISH)); /* Simple shifted level. */ assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_E, BOTH, XKB_KEY_E, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT, KEY_L, BOTH, XKB_KEY_l, NEXT, KEY_O, BOTH, XKB_KEY_o, FINISH)); /* Key repeat shifted and unshifted in the middle. */ assert(test_key_seq(keymap, KEY_H, DOWN, XKB_KEY_h, NEXT, KEY_H, REPEAT, XKB_KEY_h, NEXT, KEY_H, REPEAT, XKB_KEY_h, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_H, REPEAT, XKB_KEY_H, NEXT, KEY_H, REPEAT, XKB_KEY_H, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT, KEY_H, REPEAT, XKB_KEY_h, NEXT, KEY_H, REPEAT, XKB_KEY_h, NEXT, KEY_H, UP, XKB_KEY_h, NEXT, KEY_H, BOTH, XKB_KEY_h, FINISH)); /* Base modifier cleared on key release... */ assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_E, BOTH, XKB_KEY_E, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_O, BOTH, XKB_KEY_O, FINISH)); /* ... But only by the keycode that set it. */ assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_E, BOTH, XKB_KEY_E, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_RIGHTSHIFT, UP, XKB_KEY_Shift_R, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_O, BOTH, XKB_KEY_O, FINISH)); /* * A base modifier should only be cleared when no other key affecting * the modifier is down. */ assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_E, BOTH, XKB_KEY_E, NEXT, KEY_RIGHTSHIFT, DOWN, XKB_KEY_Shift_R, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_RIGHTSHIFT, UP, XKB_KEY_Shift_R, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT, KEY_O, BOTH, XKB_KEY_o, FINISH)); /* * Two key presses from the same key (e.g. if two keyboards use the * same xkb_state) should only be released after two releases. */ assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_H, BOTH, XKB_KEY_H, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_H, BOTH, XKB_KEY_H, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT, KEY_H, BOTH, XKB_KEY_H, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT, KEY_H, BOTH, XKB_KEY_h, FINISH)); /* Same as above with locked modifiers. */ assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_CAPSLOCK, DOWN, XKB_KEY_Caps_Lock, NEXT, KEY_H, BOTH, XKB_KEY_H, NEXT, KEY_CAPSLOCK, DOWN, XKB_KEY_Caps_Lock, NEXT, KEY_H, BOTH, XKB_KEY_H, NEXT, KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT, KEY_H, BOTH, XKB_KEY_H, NEXT, KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT, KEY_H, BOTH, XKB_KEY_H, NEXT, KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT, KEY_H, BOTH, XKB_KEY_h, FINISH)); /* Group switching / locking. */ assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_E, BOTH, XKB_KEY_e, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_K, BOTH, XKB_KEY_hebrew_lamed, NEXT, KEY_F, BOTH, XKB_KEY_hebrew_kaph, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_O, BOTH, XKB_KEY_o, FINISH)); assert(test_key_seq(keymap, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_LEFTALT, DOWN, XKB_KEY_ISO_Next_Group, NEXT, KEY_LEFTALT, UP, XKB_KEY_ISO_Next_Group, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, FINISH)); assert(test_key_seq(keymap, KEY_LEFTALT, DOWN, XKB_KEY_Alt_L, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_ISO_Next_Group, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_ISO_Next_Group, NEXT, KEY_LEFTALT, UP, XKB_KEY_Alt_L, FINISH)); /* Locked modifiers. */ assert(test_key_seq(keymap, KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT, KEY_H, BOTH, XKB_KEY_H, NEXT, KEY_E, BOTH, XKB_KEY_E, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_O, BOTH, XKB_KEY_O, FINISH)); assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_E, BOTH, XKB_KEY_e, NEXT, KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT, KEY_O, BOTH, XKB_KEY_o, FINISH)); assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_CAPSLOCK, DOWN, XKB_KEY_Caps_Lock, NEXT, KEY_E, BOTH, XKB_KEY_E, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_L, BOTH, XKB_KEY_L, NEXT, KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT, KEY_O, BOTH, XKB_KEY_O, FINISH)); assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_E, BOTH, XKB_KEY_e, NEXT, KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT, KEY_L, BOTH, XKB_KEY_l, NEXT, KEY_L, BOTH, XKB_KEY_l, NEXT, KEY_O, BOTH, XKB_KEY_o, FINISH)); /* * A key release affecting a locked modifier should clear it * regardless of the key press. */ /* assert(test_key_seq(keymap, */ /* KEY_H, BOTH, XKB_KEY_h, NEXT, */ /* KEY_CAPSLOCK, DOWN, XKB_KEY_Caps_Lock, NEXT, */ /* KEY_E, BOTH, XKB_KEY_E, NEXT, */ /* KEY_L, BOTH, XKB_KEY_L, NEXT, */ /* KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT, */ /* KEY_L, BOTH, XKB_KEY_L, NEXT, */ /* KEY_CAPSLOCK, UP, XKB_KEY_Caps_Lock, NEXT, */ /* KEY_O, BOTH, XKB_KEY_o, FINISH)); */ /* Simple Num Lock sanity check. */ assert(test_key_seq(keymap, KEY_KP1, BOTH, XKB_KEY_KP_End, NEXT, KEY_NUMLOCK, BOTH, XKB_KEY_Num_Lock, NEXT, KEY_KP1, BOTH, XKB_KEY_KP_1, NEXT, KEY_KP2, BOTH, XKB_KEY_KP_2, NEXT, KEY_NUMLOCK, BOTH, XKB_KEY_Num_Lock, NEXT, KEY_KP2, BOTH, XKB_KEY_KP_Down, FINISH)); /* Test that the aliases in the ru(phonetic) symbols map work. */ assert(test_key_seq(keymap, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_1, BOTH, XKB_KEY_1, NEXT, KEY_Q, BOTH, XKB_KEY_Cyrillic_ya, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_1, BOTH, XKB_KEY_exclam, NEXT, KEY_Q, BOTH, XKB_KEY_Cyrillic_YA, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT, KEY_V, BOTH, XKB_KEY_Cyrillic_zhe, NEXT, KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT, KEY_1, BOTH, XKB_KEY_1, NEXT, KEY_V, BOTH, XKB_KEY_Cyrillic_ZHE, NEXT, KEY_RIGHTSHIFT, DOWN, XKB_KEY_Shift_R, NEXT, KEY_V, BOTH, XKB_KEY_Cyrillic_zhe, NEXT, KEY_RIGHTSHIFT, UP, XKB_KEY_Shift_R, NEXT, KEY_V, BOTH, XKB_KEY_Cyrillic_ZHE, FINISH)); #define KS(name) xkb_keysym_from_name(name, 0) /* Test that levels (1-5) in de(neo) symbols map work. */ assert(test_key_seq(keymap, /* Switch to the group. */ KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, /* Level 1. */ KEY_1, BOTH, XKB_KEY_1, NEXT, KEY_Q, BOTH, XKB_KEY_x, NEXT, KEY_KP7, BOTH, XKB_KEY_KP_7, NEXT, KEY_ESC, BOTH, XKB_KEY_Escape, NEXT, /* Level 2 with Shift. */ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_1, BOTH, XKB_KEY_degree, NEXT, KEY_Q, BOTH, XKB_KEY_X, NEXT, KEY_KP7, BOTH, KS("U2714"), NEXT, KEY_ESC, BOTH, XKB_KEY_Escape, NEXT, /* * XXX: de(neo) uses shift(both_capslock) which causes * the interesting result in the next line. Since it's * a key release, it doesn't actually lock the modifier, * and applications by-and-large ignore the keysym on * release(?). Is this a problem? */ KEY_LEFTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT, /* Level 2 with the Lock modifier. */ KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_RIGHTSHIFT, BOTH, XKB_KEY_Caps_Lock, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT, KEY_6, BOTH, XKB_KEY_6, NEXT, KEY_H, BOTH, XKB_KEY_S, NEXT, KEY_KP3, BOTH, XKB_KEY_KP_3, NEXT, KEY_ESC, BOTH, XKB_KEY_Escape, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_RIGHTSHIFT, BOTH, XKB_KEY_Caps_Lock, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT, /* Level 3. */ KEY_CAPSLOCK, DOWN, XKB_KEY_ISO_Level3_Shift, NEXT, KEY_6, BOTH, XKB_KEY_cent, NEXT, KEY_Q, BOTH, XKB_KEY_ellipsis, NEXT, KEY_KP7, BOTH, KS("U2195"), NEXT, KEY_ESC, BOTH, XKB_KEY_Escape, NEXT, KEY_CAPSLOCK, UP, XKB_KEY_ISO_Level3_Shift, NEXT, /* Level 4. */ KEY_CAPSLOCK, DOWN, XKB_KEY_ISO_Level3_Shift, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_5, BOTH, XKB_KEY_malesymbol, NEXT, KEY_E, BOTH, XKB_KEY_Greek_lambda, NEXT, KEY_SPACE, BOTH, XKB_KEY_nobreakspace, NEXT, KEY_KP8, BOTH, XKB_KEY_intersection, NEXT, KEY_ESC, BOTH, XKB_KEY_Escape, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT, KEY_CAPSLOCK, UP, XKB_KEY_ISO_Level3_Shift, NEXT, /* Level 5. */ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level5_Shift, NEXT, /* XXX: xkeyboard-config is borked when de(neo) is * not the first group - not our fault. We test * Level5 seprately below with only de(neo). */ /* KEY_5, BOTH, XKB_KEY_periodcentered, NEXT, */ /* KEY_E, BOTH, XKB_KEY_Up, NEXT, */ /* KEY_SPACE, BOTH, XKB_KEY_KP_0, NEXT, */ /* KEY_KP8, BOTH, XKB_KEY_KP_Up, NEXT, */ KEY_ESC, BOTH, XKB_KEY_Escape, NEXT, KEY_RIGHTALT, UP, XKB_KEY_ISO_Level5_Shift, NEXT, KEY_V, BOTH, XKB_KEY_p, FINISH)); xkb_keymap_unref(keymap); keymap = test_compile_rules(ctx, "evdev", "", "de", "neo", ""); assert(keymap); assert(test_key_seq(keymap, /* Level 5. */ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level5_Shift, NEXT, KEY_5, BOTH, XKB_KEY_periodcentered, NEXT, KEY_E, BOTH, XKB_KEY_Up, NEXT, KEY_SPACE, BOTH, XKB_KEY_KP_0, NEXT, KEY_KP8, BOTH, XKB_KEY_KP_Up, NEXT, KEY_ESC, BOTH, XKB_KEY_Escape, NEXT, KEY_RIGHTALT, UP, XKB_KEY_ISO_Level5_Lock, NEXT, /* Level 6. */ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level5_Shift, NEXT, KEY_RIGHTSHIFT, DOWN, XKB_KEY_Shift_R, NEXT, KEY_5, BOTH, XKB_KEY_NoSymbol, NEXT, KEY_8, BOTH, XKB_KEY_ISO_Left_Tab, NEXT, KEY_E, BOTH, XKB_KEY_Up, NEXT, KEY_SPACE, BOTH, XKB_KEY_KP_0, NEXT, KEY_KP8, BOTH, XKB_KEY_KP_Up, NEXT, KEY_ESC, BOTH, XKB_KEY_Escape, NEXT, KEY_RIGHTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT, KEY_RIGHTALT, UP, XKB_KEY_ISO_Level5_Lock, NEXT, /* Level 7. */ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level5_Shift, NEXT, KEY_CAPSLOCK, DOWN, XKB_KEY_ISO_Level3_Shift, NEXT, KEY_5, BOTH, KS("U2221"), NEXT, KEY_E, BOTH, XKB_KEY_Greek_LAMBDA, NEXT, KEY_SPACE, BOTH, KS("U202F"), NEXT, KEY_KP8, BOTH, KS("U22C2"), NEXT, KEY_ESC, BOTH, XKB_KEY_Escape, NEXT, KEY_CAPSLOCK, UP, XKB_KEY_ISO_Level3_Shift, NEXT, KEY_RIGHTALT, UP, XKB_KEY_ISO_Level5_Lock, NEXT, /* Level 8. */ KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level5_Shift, NEXT, KEY_CAPSLOCK, DOWN, XKB_KEY_ISO_Level3_Shift, NEXT, KEY_RIGHTSHIFT, DOWN, XKB_KEY_Shift_R, NEXT, KEY_TAB, BOTH, XKB_KEY_ISO_Level5_Lock, NEXT, KEY_V, BOTH, XKB_KEY_Greek_pi, NEXT, KEY_RIGHTSHIFT, UP, XKB_KEY_Caps_Lock, NEXT, KEY_V, BOTH, XKB_KEY_asciitilde, NEXT, KEY_CAPSLOCK, UP, XKB_KEY_ISO_Level3_Shift, NEXT, KEY_V, BOTH, XKB_KEY_p, NEXT, KEY_RIGHTALT, UP, XKB_KEY_ISO_Level5_Lock, NEXT, /* Locks Level 5. */ KEY_V, BOTH, XKB_KEY_Return, FINISH)); xkb_keymap_unref(keymap); keymap = test_compile_rules(ctx, "evdev", "", "us,il,ru", "", "grp:alt_shift_toggle_bidir,grp:menu_toggle"); assert(keymap); assert(test_key_seq(keymap, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_LEFTALT, DOWN, XKB_KEY_ISO_Prev_Group, NEXT, KEY_LEFTALT, UP, XKB_KEY_ISO_Prev_Group, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, FINISH)); assert(test_key_seq(keymap, KEY_LEFTALT, DOWN, XKB_KEY_Alt_L, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_ISO_Prev_Group, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_ISO_Prev_Group, NEXT, KEY_LEFTALT, UP, XKB_KEY_Alt_L, FINISH)); /* Check backwards (negative) group switching and wrapping. */ assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_H, BOTH, XKB_KEY_Cyrillic_er, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_LEFTALT, BOTH, XKB_KEY_ISO_Prev_Group, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT, KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_LEFTALT, BOTH, XKB_KEY_ISO_Prev_Group, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_LEFTALT, BOTH, XKB_KEY_ISO_Prev_Group, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT, KEY_H, BOTH, XKB_KEY_Cyrillic_er, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_H, BOTH, XKB_KEY_h, FINISH)); xkb_keymap_unref(keymap); keymap = test_compile_rules(ctx, "evdev", "", "us,il,ru", "", "grp:switch,grp:lswitch,grp:menu_toggle"); assert(keymap); /* Test depressed group works (Mode_switch). */ assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_RIGHTALT, DOWN, XKB_KEY_Mode_switch, NEXT, KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT, KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, NEXT, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_RIGHTALT, DOWN, XKB_KEY_Mode_switch, NEXT, KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT, KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, NEXT, KEY_H, BOTH, XKB_KEY_h, FINISH)); /* Test locked+depressed group works, with wrapping and accumulation. */ assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_LEFTALT, DOWN, XKB_KEY_Mode_switch, NEXT, KEY_H, BOTH, XKB_KEY_Cyrillic_er, NEXT, KEY_LEFTALT, UP, XKB_KEY_Mode_switch, NEXT, KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_LEFTALT, DOWN, XKB_KEY_Mode_switch, NEXT, /* Should wrap back to first group. */ KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_LEFTALT, UP, XKB_KEY_Mode_switch, NEXT, KEY_H, BOTH, XKB_KEY_Cyrillic_er, NEXT, KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT, KEY_H, BOTH, XKB_KEY_h, NEXT, /* Two SetGroup(+1)'s should add up. */ KEY_RIGHTALT, DOWN, XKB_KEY_Mode_switch, NEXT, KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT, KEY_LEFTALT, DOWN, XKB_KEY_Mode_switch, NEXT, KEY_H, BOTH, XKB_KEY_Cyrillic_er, NEXT, KEY_LEFTALT, UP, XKB_KEY_Mode_switch, NEXT, KEY_H, BOTH, XKB_KEY_hebrew_yod, NEXT, KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, NEXT, KEY_H, BOTH, XKB_KEY_h, FINISH)); xkb_keymap_unref(keymap); keymap = test_compile_rules(ctx, "evdev", "", "us", "euro", ""); assert(keymap); assert(test_key_seq(keymap, KEY_5, BOTH, XKB_KEY_5, NEXT, KEY_RIGHTALT, DOWN, XKB_KEY_ISO_Level3_Shift, NEXT, KEY_5, BOTH, XKB_KEY_EuroSign, NEXT, KEY_RIGHTALT, UP, XKB_KEY_ISO_Level3_Shift, FINISH)); xkb_keymap_unref(keymap); keymap = test_compile_file(ctx, "keymaps/unbound-vmod.xkb"); assert(keymap); assert(test_key_seq(keymap, KEY_H, BOTH, XKB_KEY_h, NEXT, KEY_Z, BOTH, XKB_KEY_y, NEXT, KEY_MINUS, BOTH, XKB_KEY_ssharp, NEXT, KEY_Z, BOTH, XKB_KEY_y, FINISH)); xkb_keymap_unref(keymap); keymap = test_compile_rules(ctx, "evdev", "applealu_ansi", "us", "", "terminate:ctrl_alt_bksp"); assert(keymap); assert(test_key_seq(keymap, KEY_5, BOTH, XKB_KEY_5, NEXT, KEY_KP1, BOTH, XKB_KEY_KP_1, NEXT, KEY_NUMLOCK, BOTH, XKB_KEY_Clear, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_KP1, BOTH, XKB_KEY_KP_1, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT, KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT, KEY_KP1, BOTH, XKB_KEY_KP_1, NEXT, KEY_LEFTSHIFT, DOWN, XKB_KEY_Shift_L, NEXT, KEY_KP1, BOTH, XKB_KEY_KP_1, NEXT, KEY_LEFTSHIFT, UP, XKB_KEY_Shift_L, NEXT, KEY_CAPSLOCK, BOTH, XKB_KEY_Caps_Lock, NEXT, KEY_A, BOTH, XKB_KEY_a, FINISH)); xkb_keymap_unref(keymap); xkb_context_unref(ctx); return 0; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.9486442 libxkbcommon-0.10.0/test/keysym.c0000644000175000017500000002135600000000000016312 0ustar00ranran00000000000000/* * Copyright © 2009 Dan Nicholson * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include "test.h" #include "keysym.h" /* For unexported is_lower/upper/keypad() */ static int test_string(const char *string, xkb_keysym_t expected) { xkb_keysym_t keysym; keysym = xkb_keysym_from_name(string, 0); fprintf(stderr, "Expected string %s -> %x\n", string, expected); fprintf(stderr, "Received string %s -> %x\n\n", string, keysym); return keysym == expected; } static int test_casestring(const char *string, xkb_keysym_t expected) { xkb_keysym_t keysym; keysym = xkb_keysym_from_name(string, XKB_KEYSYM_CASE_INSENSITIVE); fprintf(stderr, "Expected casestring %s -> %x\n", string, expected); fprintf(stderr, "Received casestring %s -> %x\n\n", string, keysym); return keysym == expected; } static int test_keysym(xkb_keysym_t keysym, const char *expected) { char s[16]; xkb_keysym_get_name(keysym, s, sizeof(s)); fprintf(stderr, "Expected keysym %#x -> %s\n", keysym, expected); fprintf(stderr, "Received keysym %#x -> %s\n\n", keysym, s); return streq(s, expected); } static int test_utf8(xkb_keysym_t keysym, const char *expected) { char s[8]; int ret; ret = xkb_keysym_to_utf8(keysym, s, sizeof(s)); if (ret <= 0) return ret; fprintf(stderr, "Expected keysym %#x -> %s (%u bytes)\n", keysym, expected, (unsigned) strlen(expected)); fprintf(stderr, "Received keysym %#x -> %s (%u bytes)\n\n", keysym, s, (unsigned) strlen(s)); assert(expected != NULL); return streq(s, expected); } static void test_github_issue_42(void) { // Verify we are not dependent on locale, Turkish-i problem in particular. if (setlocale(LC_CTYPE, "tr_TR.UTF-8") == NULL) { // The locale is not available, probably; skip. return; } assert(test_string("i", XKB_KEY_i)); assert(test_string("I", XKB_KEY_I)); assert(test_casestring("i", XKB_KEY_i)); assert(test_casestring("I", XKB_KEY_i)); assert(xkb_keysym_to_upper(XKB_KEY_i) == XKB_KEY_I); assert(xkb_keysym_to_lower(XKB_KEY_I) == XKB_KEY_i); setlocale(LC_CTYPE, "C"); } int main(void) { assert(test_string("Undo", 0xFF65)); assert(test_string("ThisKeyShouldNotExist", XKB_KEY_NoSymbol)); assert(test_string("XF86_Switch_VT_5", 0x1008FE05)); assert(test_string("VoidSymbol", 0xFFFFFF)); assert(test_string("U4567", 0x1004567)); assert(test_string("0x10203040", 0x10203040)); assert(test_string("a", 0x61)); assert(test_string("A", 0x41)); assert(test_string("ch", 0xfea0)); assert(test_string("Ch", 0xfea1)); assert(test_string("CH", 0xfea2)); assert(test_string("THORN", 0x00de)); assert(test_string("Thorn", 0x00de)); assert(test_string("thorn", 0x00fe)); assert(test_keysym(0x1008FF56, "XF86Close")); assert(test_keysym(0x0, "NoSymbol")); assert(test_keysym(0x1008FE20, "XF86Ungrab")); assert(test_keysym(0x01001234, "U1234")); /* 16-bit unicode padded to width 4. */ assert(test_keysym(0x010002DE, "U02DE")); /* 32-bit unicode padded to width 8. */ assert(test_keysym(0x0101F4A9, "U0001F4A9")); assert(test_casestring("Undo", 0xFF65)); assert(test_casestring("UNDO", 0xFF65)); assert(test_casestring("A", 0x61)); assert(test_casestring("a", 0x61)); assert(test_casestring("ThisKeyShouldNotExist", XKB_KEY_NoSymbol)); assert(test_casestring("XF86_Switch_vT_5", 0x1008FE05)); assert(test_casestring("xF86_SwitcH_VT_5", 0x1008FE05)); assert(test_casestring("xF86SwiTch_VT_5", 0x1008FE05)); assert(test_casestring("xF86Switch_vt_5", 0x1008FE05)); assert(test_casestring("VoidSymbol", 0xFFFFFF)); assert(test_casestring("vOIDsymBol", 0xFFFFFF)); assert(test_casestring("U4567", 0x1004567)); assert(test_casestring("u4567", 0x1004567)); assert(test_casestring("0x10203040", 0x10203040)); assert(test_casestring("0X10203040", 0x10203040)); assert(test_casestring("THORN", 0x00fe)); assert(test_casestring("Thorn", 0x00fe)); assert(test_casestring("thorn", 0x00fe)); assert(test_utf8(XKB_KEY_y, "y")); assert(test_utf8(XKB_KEY_u, "u")); assert(test_utf8(XKB_KEY_m, "m")); assert(test_utf8(XKB_KEY_Cyrillic_em, "м")); assert(test_utf8(XKB_KEY_Cyrillic_u, "у")); assert(test_utf8(XKB_KEY_exclam, "!")); assert(test_utf8(XKB_KEY_oslash, "ø")); assert(test_utf8(XKB_KEY_hebrew_aleph, "א")); assert(test_utf8(XKB_KEY_Arabic_sheen, "ش")); assert(test_utf8(XKB_KEY_space, " ")); assert(test_utf8(XKB_KEY_KP_Space, " ")); assert(test_utf8(XKB_KEY_BackSpace, "\b")); assert(test_utf8(XKB_KEY_Escape, "\033")); assert(test_utf8(XKB_KEY_KP_Separator, ",")); assert(test_utf8(XKB_KEY_KP_Decimal, ".")); assert(test_utf8(XKB_KEY_Tab, "\t")); assert(test_utf8(XKB_KEY_KP_Tab, "\t")); assert(test_utf8(XKB_KEY_hyphen, "­")); assert(test_utf8(XKB_KEY_Linefeed, "\n")); assert(test_utf8(XKB_KEY_Return, "\r")); assert(test_utf8(XKB_KEY_KP_Enter, "\r")); assert(test_utf8(XKB_KEY_KP_Equal, "=")); assert(test_utf8(XKB_KEY_9, "9")); assert(test_utf8(XKB_KEY_KP_9, "9")); assert(test_utf8(XKB_KEY_KP_Multiply, "*")); assert(test_utf8(XKB_KEY_KP_Subtract, "-")); assert(test_utf8(0x10005d0, "א")); assert(test_utf8(0x110ffff, "\xf4\x8f\xbf\xbf")); assert(test_utf8(0x1110000, NULL) == 0); assert(xkb_keysym_is_lower(XKB_KEY_a)); assert(xkb_keysym_is_lower(XKB_KEY_Greek_lambda)); assert(xkb_keysym_is_lower(xkb_keysym_from_name("U03b1", 0))); /* GREEK SMALL LETTER ALPHA */ assert(xkb_keysym_is_lower(xkb_keysym_from_name("U03af", 0))); /* GREEK SMALL LETTER IOTA WITH TONOS */ assert(xkb_keysym_is_upper(XKB_KEY_A)); assert(xkb_keysym_is_upper(XKB_KEY_Greek_LAMBDA)); assert(xkb_keysym_is_upper(xkb_keysym_from_name("U0391", 0))); /* GREEK CAPITAL LETTER ALPHA */ assert(xkb_keysym_is_upper(xkb_keysym_from_name("U0388", 0))); /* GREEK CAPITAL LETTER EPSILON WITH TONOS */ assert(!xkb_keysym_is_upper(XKB_KEY_a)); assert(!xkb_keysym_is_lower(XKB_KEY_A)); assert(!xkb_keysym_is_lower(XKB_KEY_Return)); assert(!xkb_keysym_is_upper(XKB_KEY_Return)); assert(!xkb_keysym_is_lower(XKB_KEY_hebrew_aleph)); assert(!xkb_keysym_is_upper(XKB_KEY_hebrew_aleph)); assert(!xkb_keysym_is_upper(xkb_keysym_from_name("U05D0", 0))); /* HEBREW LETTER ALEF */ assert(!xkb_keysym_is_lower(xkb_keysym_from_name("U05D0", 0))); /* HEBREW LETTER ALEF */ assert(!xkb_keysym_is_lower(XKB_KEY_8)); assert(!xkb_keysym_is_upper(XKB_KEY_8)); assert(xkb_keysym_is_keypad(XKB_KEY_KP_Enter)); assert(xkb_keysym_is_keypad(XKB_KEY_KP_6)); assert(xkb_keysym_is_keypad(XKB_KEY_KP_Add)); assert(!xkb_keysym_is_keypad(XKB_KEY_Num_Lock)); assert(!xkb_keysym_is_keypad(XKB_KEY_1)); assert(!xkb_keysym_is_keypad(XKB_KEY_Return)); assert(xkb_keysym_to_upper(XKB_KEY_a) == XKB_KEY_A); assert(xkb_keysym_to_upper(XKB_KEY_A) == XKB_KEY_A); assert(xkb_keysym_to_lower(XKB_KEY_a) == XKB_KEY_a); assert(xkb_keysym_to_lower(XKB_KEY_A) == XKB_KEY_a); assert(xkb_keysym_to_upper(XKB_KEY_Return) == XKB_KEY_Return); assert(xkb_keysym_to_lower(XKB_KEY_Return) == XKB_KEY_Return); assert(xkb_keysym_to_upper(XKB_KEY_Greek_lambda) == XKB_KEY_Greek_LAMBDA); assert(xkb_keysym_to_upper(XKB_KEY_Greek_LAMBDA) == XKB_KEY_Greek_LAMBDA); assert(xkb_keysym_to_lower(XKB_KEY_Greek_lambda) == XKB_KEY_Greek_lambda); assert(xkb_keysym_to_lower(XKB_KEY_Greek_LAMBDA) == XKB_KEY_Greek_lambda); assert(xkb_keysym_to_upper(XKB_KEY_eacute) == XKB_KEY_Eacute); assert(xkb_keysym_to_lower(XKB_KEY_Eacute) == XKB_KEY_eacute); test_github_issue_42(); return 0; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.9586442 libxkbcommon-0.10.0/test/log.c0000644000175000017500000000744100000000000015551 0ustar00ranran00000000000000/* * 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. */ #include "config.h" #include "test.h" #include "context.h" #ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wmissing-format-attribute" #endif static const char * log_level_to_string(enum xkb_log_level level) { switch (level) { case XKB_LOG_LEVEL_CRITICAL: return "critical"; case XKB_LOG_LEVEL_ERROR: return "error"; case XKB_LOG_LEVEL_WARNING: return "warning"; case XKB_LOG_LEVEL_INFO: return "info"; case XKB_LOG_LEVEL_DEBUG: return "debug"; } return "unknown"; } ATTR_PRINTF(3, 0) static void log_fn(struct xkb_context *ctx, enum xkb_log_level level, const char *fmt, va_list args) { char *s; int size; darray_char *ls = xkb_context_get_user_data(ctx); assert(ls); size = vasprintf(&s, fmt, args); assert(size != -1); darray_append_string(*ls, log_level_to_string(level)); darray_append_lit(*ls, ": "); darray_append_string(*ls, s); free(s); } int main(void) { darray_char log_string; struct xkb_context *ctx; int ret; ret = setenv("XKB_LOG_LEVEL", "warn", 1); assert(ret == 0); ret = setenv("XKB_LOG_VERBOSITY", "5", 1); assert(ret == 0); ctx = test_get_context(0); assert(ctx); darray_init(log_string); xkb_context_set_user_data(ctx, &log_string); xkb_context_set_log_fn(ctx, log_fn); log_warn(ctx, "first warning: %d\n", 87); log_info(ctx, "first info\n"); log_dbg(ctx, "first debug: %s\n", "hello"); log_err(ctx, "first error: %lu\n", 115415UL); log_vrb(ctx, 5, "first verbose 5\n"); xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_DEBUG); log_warn(ctx, "second warning: %d\n", 87); log_dbg(ctx, "second debug: %s %s\n", "hello", "world"); log_info(ctx, "second info\n"); log_err(ctx, "second error: %lu\n", 115415UL); log_vrb(ctx, 6, "second verbose 6\n"); xkb_context_set_log_verbosity(ctx, 0); xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_CRITICAL); log_warn(ctx, "third warning: %d\n", 87); log_dbg(ctx, "third debug: %s %s\n", "hello", "world"); log_info(ctx, "third info\n"); log_err(ctx, "third error: %lu\n", 115415UL); log_vrb(ctx, 0, "third verbose 0\n"); printf("%s", log_string.item); assert(streq(log_string.item, "warning: first warning: 87\n" "error: first error: 115415\n" "warning: first verbose 5\n" "warning: second warning: 87\n" "debug: second debug: hello world\n" "info: second info\n" "error: second error: 115415\n")); xkb_context_unref(ctx); darray_free(log_string); return 0; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.968644 libxkbcommon-0.10.0/test/print-compiled-keymap.c0000644000175000017500000000462200000000000021200 0ustar00ranran00000000000000/* * 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. */ #include "config.h" #include #include "test.h" int main(int argc, char *argv[]) { int ret = EXIT_FAILURE; int opt; struct xkb_context *ctx; struct xkb_keymap *keymap; const char *keymap_path = NULL; char *dump; while ((opt = getopt(argc, argv, "h")) != -1) { switch (opt) { case 'h': case '?': fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } } if (optind >= argc) { fprintf(stderr, "Error: missing path to keymap file\n"); exit(EXIT_FAILURE); } keymap_path = argv[optind]; ctx = test_get_context(0); if (!ctx) { fprintf(stderr, "Couldn't create xkb context\n"); goto err_out; } keymap = test_compile_file(ctx, keymap_path); if (!keymap) { fprintf(stderr, "Couldn't create xkb keymap\n"); goto err_ctx; } dump = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1); if (!dump) { fprintf(stderr, "Couldn't get the keymap string\n"); goto err_map; } fputs(dump, stdout); ret = EXIT_SUCCESS; free(dump); err_map: xkb_keymap_unref(keymap); err_ctx: xkb_context_unref(ctx); err_out: return ret; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.968644 libxkbcommon-0.10.0/test/rmlvo-to-kccgst.c0000644000175000017500000000626200000000000020023 0ustar00ranran00000000000000/* * 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. */ #include "config.h" #include #include #include "test.h" #include "xkbcomp/xkbcomp-priv.h" #include "xkbcomp/rules.h" int main(int argc, char *argv[]) { struct xkb_rule_names rmlvo = { NULL }; struct xkb_context *ctx; struct xkb_component_names kccgst; static struct option opts[] = { {"help", no_argument, 0, 'h'}, {"rules", required_argument, 0, 'r'}, {"model", required_argument, 0, 'm'}, {"layout", required_argument, 0, 'l'}, {"variant", required_argument, 0, 'v'}, {"options", required_argument, 0, 'o'}, {0, 0, 0, 0}, }; while (1) { int c; int option_index = 0; c = getopt_long(argc, argv, "r:m:l:v:o:h", opts, &option_index); if (c == -1) break; switch (c) { case 'r': rmlvo.rules = optarg; break; case 'm': rmlvo.model = optarg; break; case 'l': rmlvo.layout = optarg; break; case 'v': rmlvo.variant = optarg; break; case 'o': rmlvo.options = optarg; break; case 'h': case '?': fprintf(stderr, "Usage: %s [-r ] [-m ] " "[-l ] [-v ] [-o ]\n", argv[0]); return 1; } } ctx = test_get_context(0); if (!ctx) { fprintf(stderr, "Failed to get xkb context\n"); return 1; } xkb_context_sanitize_rule_names(ctx, &rmlvo); if (!xkb_components_from_rules(ctx, &rmlvo, &kccgst)) return 1; printf("keycodes: %s\n", kccgst.keycodes); printf("types: %s\n", kccgst.types); printf("compat: %s\n", kccgst.compat); printf("symbols: %s\n", kccgst.symbols); free(kccgst.keycodes); free(kccgst.types); free(kccgst.compat); free(kccgst.symbols); xkb_context_unref(ctx); return 0; } ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.968644 libxkbcommon-0.10.0/test/rmlvo-to-keymap.c0000644000175000017500000000770600000000000020037 0ustar00ranran00000000000000/* * Copyright © 2018 Red Hat, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include #include #include #include #include #include #include "xkbcommon/xkbcommon.h" static bool print = false; static void usage(char **argv) { printf("Usage: %s [--print] [--rules ] [--layout ] [--variant ] [--options

; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias = ; alias

! Shift : Y \n", XKB_KEY_NoSymbol)); fprintf(stderr, "\n"); table_string = "! None : X \n" "! Foo : X \n" "None ! Shift : X \n" "! ! : X \n" "! ~ : X \n" "! ! : X \n" "! Ctrl ! Ctrl : X \n" " ! : X \n" " None : X \n" "None None : X \n" " : !Shift X \n"; assert(!xkb_compose_table_new_from_buffer(ctx, table_string, strlen(table_string), "C", XKB_COMPOSE_FORMAT_TEXT_V1, XKB_COMPOSE_COMPILE_NO_FLAGS)); fprintf(stderr, "\n"); } static void test_include(struct xkb_context *ctx) { char *path, *table_string; int ret; path = test_get_path("compose/en_US.UTF-8/Compose"); assert(path); /* We don't have a mechanism to change the include paths like we * have for keymaps. So we must include the full path. */ ret = asprintf(&table_string, " : \"foo\" X\n" "include \"%s\"\n" " : \"bar\" Y\n", path); assert(ret >= 0); assert(test_compose_seq_buffer(ctx, table_string, /* No conflict. */ XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_dead_acute, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "´", XKB_KEY_acute, /* Comes before - doesn't override. */ XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_space, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "~", XKB_KEY_asciitilde, /* Comes after - does override. */ XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSING, "", XKB_KEY_NoSymbol, XKB_KEY_dead_tilde, XKB_COMPOSE_FEED_ACCEPTED, XKB_COMPOSE_COMPOSED, "bar", XKB_KEY_Y, XKB_KEY_NoSymbol)); free(path); free(table_string); } int main(int argc, char *argv[]) { struct xkb_context *ctx; ctx = test_get_context(CONTEXT_NO_FLAG); assert(ctx); test_seqs(ctx); test_conflicting(ctx); test_XCOMPOSEFILE(ctx); test_state(ctx); test_modifier_syntax(ctx); test_include(ctx); xkb_context_unref(ctx); return 0; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6719806 libxkbcommon-0.10.0/test/context.c0000644000175000017500000002163100000000000016451 0ustar00ranran00000000000000/* * 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 */ #include "config.h" #include "test.h" #include "context.h" #include #include #ifdef _MSC_VER # include # include # ifndef S_ISDIR # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) # endif #else # include #endif /* keeps a cache of all makedir/maketmpdir directories so we can free and * rmdir them in one go, see unmakedirs() */ char *dirnames[64]; int ndirs; /* keeps a cache of all buffered env vars so we can restore * them in one go, see restore_env() */ struct env { char *key; char *value; } environment[64]; int nenviron; static void buffer_env(const char *key) { char *v = getenv(key); environment[nenviron].key = strdup(key); environment[nenviron].value = v ? strdup(v) : NULL; nenviron++; } static void restore_env(void) { for (int i = 0; i < nenviron; i++) { char *key = environment[i].key, *value = environment[i].value; if (value) setenv(key, value, 1); else unsetenv(key); free(key); free(value); } nenviron = 0; memset(environment, 0, sizeof(environment)); } static const char *makedir(const char *parent, const char *path) { char *dirname; int err; err = asprintf(&dirname, "%s/%s", parent, path); assert(err >= 0); err = mkdir(dirname, 0777); assert(err == 0); dirnames[ndirs++] = dirname; return dirname; } static const char *maketmpdir(void) { const char *template = "/tmp/xkbcommon-test.XXXXXX"; char *tmpdir = strdup(template); tmpdir = mkdtemp(tmpdir); assert(tmpdir != NULL); dirnames[ndirs++] = tmpdir; return tmpdir; } static void unmakedirs(void) { /* backwards order for rmdir to work */ for (int i = ndirs - 1; i >= 0; i--) { char *dir = dirnames[i]; if (!dir) break; rmdir(dir); free(dir); } ndirs = 0; memset(dirnames, 0, sizeof(dirnames)); } static void test_config_root_include_path(void) { struct xkb_context *ctx; const char *tmpdir; const char *context_path; int nincludes; buffer_env("XKB_CONFIG_ROOT"); buffer_env("HOME"); buffer_env("XDG_CONFIG_HOME"); tmpdir = maketmpdir(); setenv("XKB_CONFIG_ROOT", tmpdir, 1); unsetenv("HOME"); unsetenv("XDG_CONFIG_HOME"); /* built-in path is last */ ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); nincludes = xkb_context_num_include_paths(ctx); assert(nincludes >= 1); context_path = xkb_context_include_path_get(ctx, nincludes - 1); assert(strcmp(context_path, tmpdir) == 0); xkb_context_unref(ctx); unmakedirs(); restore_env(); } static void test_config_root_include_path_fallback(void) { struct xkb_context *ctx; const char *xkbdir = DFLT_XKB_CONFIG_ROOT; const char *context_path; int nincludes; /* quick and dirty check that the default directory exists. * It may not on a vanilla test box if we just run the test * suite, so where it's not there just skip this test. */ struct stat stat_buf; int err = stat(xkbdir, &stat_buf); if (err != 0) return; if (!S_ISDIR(stat_buf.st_mode)) return; buffer_env("XKB_CONFIG_ROOT"); buffer_env("HOME"); buffer_env("XDG_CONFIG_HOME"); unsetenv("XKB_CONFIG_ROOT"); unsetenv("HOME"); unsetenv("XDG_CONFIG_HOME"); /* built-in path is last */ ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); nincludes = xkb_context_num_include_paths(ctx); assert(nincludes >= 1); context_path = xkb_context_include_path_get(ctx, nincludes - 1); assert(strcmp(context_path, xkbdir) == 0); xkb_context_unref(ctx); unmakedirs(); restore_env(); } static void test_xkbdir_include_path(void) { struct xkb_context *ctx; const char *tmpdir; const char *xkb_path; const char *context_path; buffer_env("HOME"); buffer_env("XDG_CONFIG_HOME"); tmpdir = maketmpdir(); xkb_path = makedir(tmpdir, ".xkb"); setenv("HOME", tmpdir, 1); setenv("XDG_CONFIG_HOME", tmpdir, 1); /* No XDG directory in our tmpdir, so we expect * the $HOME/.xkb to be the first include path */ ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); assert(xkb_context_num_include_paths(ctx) >= 1); context_path = xkb_context_include_path_get(ctx, 0); assert(strcmp(context_path, xkb_path) == 0); xkb_context_unref(ctx); unmakedirs(); restore_env(); } static void test_xdg_include_path(void) { struct xkb_context *ctx; const char *tmpdir; const char *xdg_path; const char *context_path; buffer_env("XDG_CONFIG_HOME"); tmpdir = maketmpdir(); xdg_path = makedir(tmpdir, "xkb"); setenv("XDG_CONFIG_HOME", tmpdir, 1); /* XDG path is always first */ ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); assert(xkb_context_num_include_paths(ctx) >= 1); context_path = xkb_context_include_path_get(ctx, 0); assert(strcmp(context_path, xdg_path) == 0); xkb_context_unref(ctx); unmakedirs(); restore_env(); } static void test_xdg_include_path_fallback(void) { struct xkb_context *ctx; const char *tmpdir; const char *xdg_root, *xdg_path; const char *context_path; buffer_env("XDG_CONFIG_HOME"); buffer_env("HOME"); tmpdir = maketmpdir(); xdg_root = makedir(tmpdir, ".config"); xdg_path = makedir(xdg_root, "xkb"); setenv("HOME", tmpdir, 1); unsetenv("XDG_CONFIG_HOME"); /* XDG path is always first, even if fallback */ ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); assert(xkb_context_num_include_paths(ctx) >= 1); context_path = xkb_context_include_path_get(ctx, 0); assert(strcmp(context_path, xdg_path) == 0); xkb_context_unref(ctx); unmakedirs(); restore_env(); } static void test_include_order(void) { struct xkb_context *ctx; const char *tmpdir; const char *xdg_path; const char *xkb_home_path; const char *xkb_root_path; const char *context_path; buffer_env("XKB_CONFIG_ROOT"); buffer_env("XDG_CONFIG_HOME"); buffer_env("HOME"); tmpdir = maketmpdir(); xdg_path = makedir(tmpdir, "xkb"); xkb_home_path = makedir(tmpdir, ".xkb"); xkb_root_path = makedir(tmpdir, "xkbroot"); setenv("HOME", tmpdir, 1); setenv("XDG_CONFIG_HOME", tmpdir, 1); setenv("XKB_CONFIG_ROOT", xkb_root_path, 1); ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); assert(xkb_context_num_include_paths(ctx) >= 3); /* XDG is first */ context_path = xkb_context_include_path_get(ctx, 0); assert(strcmp(context_path, xdg_path) == 0); /* $HOME/.xkb is second */ context_path = xkb_context_include_path_get(ctx, 1); assert(strcmp(context_path, xkb_home_path) == 0); /* CONFIG_ROOT is last */ context_path = xkb_context_include_path_get(ctx, 2); assert(strcmp(context_path, xkb_root_path) == 0); xkb_context_unref(ctx); unmakedirs(); restore_env(); } int main(void) { struct xkb_context *context = test_get_context(0); xkb_atom_t atom; assert(context); assert(xkb_context_num_include_paths(context) == 1); assert(!xkb_context_include_path_append(context, "¡NONSENSE!")); assert(xkb_context_num_include_paths(context) == 1); atom = xkb_atom_intern(context, "HELLOjunkjunkjunk", 5); assert(atom != XKB_ATOM_NONE); assert(streq(xkb_atom_text(context, atom), "HELLO")); atom = xkb_atom_intern_literal(context, "HELLOjunkjunkjunk"); assert(atom != XKB_ATOM_NONE); assert(streq(xkb_atom_text(context, atom), "HELLOjunkjunkjunk")); xkb_context_unref(context); test_config_root_include_path(); test_config_root_include_path_fallback(); test_xkbdir_include_path(); test_xdg_include_path(); test_xdg_include_path_fallback(); test_include_order(); return 0; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.8986447 libxkbcommon-0.10.0/test/data/0000755000175000017500000000000000000000000015527 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/.gitattributes0000644000175000017500000000001100000000000020412 0ustar00ranran00000000000000* eol=lf ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.688647 libxkbcommon-0.10.0/test/data/compat/0000755000175000017500000000000000000000000017012 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/compat/accessx0000644000175000017500000000214100000000000020364 0ustar00ranran00000000000000default partial xkb_compatibility "basic" { interpret AccessX_Enable { action= LockControls(controls=AccessXKeys); }; }; partial xkb_compatibility "full" { interpret AccessX_Enable { action= LockControls(controls=AccessXKeys); }; interpret AccessX_Feedback_Enable { action= LockControls(controls=AccessXFeedback); }; interpret RepeatKeys_Enable { action= LockControls(controls=RepeatKeys); }; interpret SlowKeys_Enable { action= LockControls(controls=SlowKeys); }; interpret BounceKeys_Enable { action= LockControls(controls=BounceKeys); }; interpret StickyKeys_Enable { action= LockControls(controls=StickyKeys); }; interpret MouseKeys_Enable { action= LockControls(controls=MouseKeys); }; interpret MouseKeys_Accel_Enable { action= LockControls(controls=MouseKeysAccel); }; interpret Overlay1_Enable { action= LockControls(controls=Overlay1); }; interpret Overlay2_Enable { action= LockControls(controls=Overlay2); }; interpret AudibleBell_Enable { action= LockControls(controls=AudibleBell); }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/compat/basic0000644000175000017500000000203600000000000020017 0ustar00ranran00000000000000// Minimal set of symbol interpretations to provide // reasonable default behavior (Num lock, Shift lock, // Caps lock, and Mode switch) and set up the // automatic updating of common keyboard LEDs. default xkb_compatibility "basic" { virtual_modifiers NumLock,AltGr; interpret.repeat= False; setMods.clearLocks= True; latchMods.clearLocks= True; latchMods.latchToLock= True; interpret Shift_Lock+AnyOf(Shift+Lock) { action= LockMods(modifiers=Shift); }; interpret Any+Lock { action= LockMods(modifiers=Lock); }; interpret Num_Lock+Any { virtualModifier= NumLock; action= LockMods(modifiers=NumLock); }; interpret Mode_switch { useModMapMods= level1; virtualModifier= AltGr; action= SetGroup(group=+1); }; interpret Any + Any { action= SetMods(modifiers=modMapMods); }; group 2 = AltGr; group 3 = AltGr; group 4 = AltGr; include "ledcaps" include "lednum" indicator "Shift Lock" { !allowExplicit; whichModState= Locked; modifiers= Shift; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/compat/caps0000644000175000017500000000077300000000000017672 0ustar00ranran00000000000000partial xkb_compatibility "caps_lock" { // Keysym Caps_Lock locks the Lock modifier. // With this definition, the keysym Caps_Lock can be used without binding // the whole key to a real modifier. This is essential when you don't // want to use Caps_Lock on the first level. // This should not have any compatibility issues when used together with // other layouts which don't utilize this capability. interpret Caps_Lock { action = LockMods(modifiers = Lock); }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/compat/complete0000644000175000017500000000034400000000000020546 0ustar00ranran00000000000000default xkb_compatibility "complete" { include "basic" augment "iso9995" augment "mousekeys" augment "accessx(full)" augment "misc" augment "xfree86" augment "level5" augment "caps(caps_lock)" }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/compat/iso99950000644000175000017500000000315400000000000020072 0ustar00ranran00000000000000// Fairly complete set of symbol interpretations // to provide reasonable default behavior. default partial xkb_compatibility "default" { virtual_modifiers LevelThree,AltGr; interpret.repeat= False; setMods.clearLocks= True; latchMods.clearLocks= True; latchMods.latchToLock= True; interpret ISO_Level2_Latch+Shift { useModMapMods= level1; action= LatchMods(modifiers=Shift); }; interpret ISO_Level3_Shift+Any { useModMapMods= level1; virtualModifier= LevelThree; action= SetMods(modifiers=LevelThree); }; interpret ISO_Level3_Shift { action= SetMods(modifiers=LevelThree); }; interpret ISO_Level3_Latch+Any { useModMapMods= level1; virtualModifier= LevelThree; action= LatchMods(modifiers=LevelThree); }; interpret ISO_Level3_Latch { action= LatchMods(modifiers=LevelThree); }; interpret ISO_Level3_Lock+Any { useModMapMods= level1; virtualModifier= LevelThree; action= LockMods(modifiers=LevelThree); }; interpret ISO_Level3_Lock { action= LockMods(modifiers=LevelThree); }; interpret ISO_Group_Latch { useModMapMods= level1; virtualModifier= AltGr; action= LatchGroup(group=2); }; interpret ISO_Next_Group { useModMapMods= level1; virtualModifier= AltGr; action= LockGroup(group=+1); }; interpret ISO_Prev_Group { useModMapMods= level1; virtualModifier= AltGr; action= LockGroup(group=-1); }; interpret ISO_First_Group { action= LockGroup(group=1); }; interpret ISO_Last_Group { action= LockGroup(group=2); }; indicator "Group 2" { !allowExplicit; groups= All-Group1; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/compat/ledcaps0000644000175000017500000000072500000000000020354 0ustar00ranran00000000000000// Use the Caps Lock LED to show either // Caps Lock, Group, or Shift Lock state. default partial xkb_compatibility "caps_lock" { indicator "Caps Lock" { !allowExplicit; whichModState= Locked; modifiers= Lock; }; }; partial xkb_compatibility "group_lock" { indicator "Caps Lock" { modifiers= None; groups=All-group1; }; }; partial xkb_compatibility "shift_lock" { indicator "Caps Lock" { whichModState= Locked; modifiers= Shift; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/compat/lednum0000644000175000017500000000072200000000000020222 0ustar00ranran00000000000000// Use the Num Lock LED to show either // Num Lock, Group, or Shift Lock state. default partial xkb_compatibility "num_lock" { indicator "Num Lock" { !allowExplicit; whichModState= Locked; modifiers= NumLock; }; }; partial xkb_compatibility "group_lock" { indicator "Num Lock" { modifiers= None; groups=All-group1; }; }; partial xkb_compatibility "shift_lock" { indicator "Num Lock" { whichModState= Locked; modifiers= Shift; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/compat/ledscroll0000644000175000017500000000074600000000000020727 0ustar00ranran00000000000000// Use the Scroll Lock LED to show either // Scroll Lock, Group, or Shift Lock state. default partial xkb_compatibility "scroll_lock" { indicator "Scroll Lock" { allowExplicit; whichModState= Locked; modifiers= ScrollLock; }; }; partial xkb_compatibility "group_lock" { indicator "Scroll Lock" { modifiers= None; groups=All-group1; }; }; partial xkb_compatibility "shift_lock" { indicator "Scroll Lock" { whichModState= Locked; modifiers= Shift; }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/compat/level50000644000175000017500000000256400000000000020140 0ustar00ranran00000000000000// Fairly complete set of symbol interpretations // to provide reasonable default behavior. default partial xkb_compatibility "default" { virtual_modifiers LevelFive; interpret.repeat= False; setMods.clearLocks= True; latchMods.clearLocks= True; latchMods.latchToLock= True; interpret ISO_Level5_Shift+Any { useModMapMods= level1; virtualModifier= LevelFive; action= SetMods(modifiers=LevelFive); }; interpret ISO_Level5_Shift { action= SetMods(modifiers=LevelFive); }; interpret ISO_Level5_Latch+Any { useModMapMods= level1; virtualModifier= LevelFive; action= LatchMods(modifiers=LevelFive); }; interpret ISO_Level5_Latch { action= LatchMods(modifiers=LevelFive); }; interpret ISO_Level5_Lock+Any { useModMapMods= level1; virtualModifier= LevelFive; action= LockMods(modifiers=LevelFive); }; interpret ISO_Level5_Lock { action= LockMods(modifiers=LevelFive); }; }; partial xkb_compatibility "level5_lock" { // This defines a Level5-Lock using the NumLock real modifier // in order to create arbitrary level-behaviour, which would // not be possible with the virtual modifier. // See also: types/level5 : EIGHT_LEVEL_LEVEL_FIVE_LOCK // See also: symbols/level5(lock) virtual_modifiers NumLock; interpret ISO_Level5_Lock { action = LockMods(modifiers = NumLock); }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/compat/misc0000644000175000017500000000524400000000000017675 0ustar00ranran00000000000000default partial xkb_compatibility "misc" { virtual_modifiers Alt,Meta,Super,Hyper,ScrollLock; // Interpretations for some other useful keys. interpret Terminate_Server { action = Terminate(); }; setMods.clearLocks= True; // Sets the "Alt" virtual modifier. interpret Alt_L+Any { //useModMapMods= level1; virtualModifier= Alt; action = SetMods(modifiers=modMapMods); }; interpret Alt_L { action = SetMods(modifiers=Alt); }; interpret Alt_R+Any { //useModMapMods= level1; virtualModifier= Alt; action = SetMods(modifiers=modMapMods); }; interpret Alt_R { action = SetMods(modifiers=Alt); }; // Sets the "Meta" virtual modifier. interpret Meta_L+Any { //useModMapMods= level1; virtualModifier= Meta; action = SetMods(modifiers=modMapMods); }; interpret Meta_L { action = SetMods(modifiers=Meta); }; interpret Meta_R+Any { //useModMapMods= level1; virtualModifier= Meta; action = SetMods(modifiers=modMapMods); }; interpret Meta_R { action = SetMods(modifiers=Meta); }; // Sets the "Super" virtual modifier. interpret Super_L+Any { //useModMapMods= level1; virtualModifier= Super; action = SetMods(modifiers=modMapMods); }; interpret Super_L { action = SetMods(modifiers=Super); }; interpret Super_R+Any { //useModMapMods= level1; virtualModifier= Super; action = SetMods(modifiers=modMapMods); }; interpret Super_R { action = SetMods(modifiers=Super); }; // Sets the "Hyper" virtual modifier. interpret Hyper_L+Any { //useModMapMods= level1; virtualModifier= Hyper; action = SetMods(modifiers=modMapMods); }; interpret Hyper_L { action = SetMods(modifiers=Hyper); }; interpret Hyper_R+Any { //useModMapMods= level1; virtualModifier= Hyper; action = SetMods(modifiers=modMapMods); }; interpret Hyper_R { action = SetMods(modifiers=Hyper); }; // Sets the "ScrollLock" virtual modifier and // makes it actually lock when pressed. Sets // up a map for the scroll lock indicator. interpret Scroll_Lock+Any { virtualModifier= ScrollLock; action = LockMods(modifiers=modMapMods); }; include "ledscroll" include "misc(assign_shift_left_action)" }; partial xkb_compatibility "assign_shift_left_action" { // Because of the irrevertable modifier mapping in symbols/pc, // is getting bound to the Lock modifier when using // symbols/shift(both_capslock), creating unwanted behaviour. // This is a quirk, to circumvent the problem. interpret Shift_L { action = SetMods(modifiers = Shift); }; }; ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6853137 libxkbcommon-0.10.0/test/data/compat/mousekeys0000644000175000017500000001077400000000000020772 0ustar00ranran00000000000000// Interpretations for arrow keys and a bunch of // other common keysyms which make it possible to // bind "mouse" keys using xmodmap and activate or // deactivate them from the keyboard. default partial xkb_compatibility "mousekeys" { // Keypad actions. interpret.repeat= True; interpret KP_1 { action = MovePtr(x=-1,y= +1); }; interpret KP_End { action = MovePtr(x=-1,y= +1); }; interpret KP_2 { action = MovePtr(x=+0,y= +1); }; interpret KP_Down { action = MovePtr(x=+0,y= +1); }; interpret KP_3 { action = MovePtr(x=+1,y=+1); }; interpret KP_Next { action = MovePtr(x=+1,y=+1); }; interpret KP_4 { action = MovePtr(x=-1,y=+0); }; interpret KP_Left { action = MovePtr(x=-1,y=+0); }; interpret KP_6 { action = MovePtr(x=+1,y=+0); }; interpret KP_Right { action = MovePtr(x=+1,y=+0); }; interpret KP_7 { action = MovePtr(x=-1,y=-1); }; interpret KP_Home { action = MovePtr(x=-1,y=-1); }; interpret KP_8 { action = MovePtr(x=+0,y=-1); }; interpret KP_Up { action = MovePtr(x=+0,y=-1); }; interpret KP_9 { action = MovePtr(x=+1,y=-1); }; interpret KP_Prior { action = MovePtr(x=+1,y=-1); }; interpret KP_5 { action = PointerButton(button=default); }; interpret KP_Begin { action = PointerButton(button=default); }; interpret KP_F2 { action = SetPtrDflt(affect=defaultButton,button=1); }; interpret KP_Divide { action = SetPtrDflt(affect=defaultButton,button=1); }; interpret KP_F3 { action = SetPtrDflt(affect=defaultButton,button=2); }; interpret KP_Multiply { action = SetPtrDflt(affect=defaultButton,button=2); }; interpret KP_F4 { action = SetPtrDflt(affect=defaultButton,button=3); }; interpret KP_Subtract { action = SetPtrDflt(affect=defaultButton,button=3); }; interpret KP_Separator { action = PointerButton(button=default,count=2); }; interpret KP_Add { action = PointerButton(button=default,count=2); }; interpret KP_0 { action = LockPointerButton(button=default,affect=lock); }; interpret KP_Insert { action = LockPointerButton(button=default,affect=lock); }; interpret KP_Decimal { action = LockPointerButton(button=default,affect=unlock); }; interpret KP_Delete { action = LockPointerButton(button=default,affect=unlock); }; // Additional mappings for Solaris keypad compatibility. interpret F25 { // aka KP_Divide action = SetPtrDflt(affect=defaultButton,button=1); }; interpret F26 { // aka KP_Multiply action = SetPtrDflt(affect=defaultButton,button=2); }; interpret F27 { // aka KP_Home action = MovePtr(x=-1,y=-1); }; interpret F29 { // aka KP_Prior action = MovePtr(x=+1,y=-1); }; interpret F31 { // aka KP_Begin action = PointerButton(button=default); }; interpret F33 { // aka KP_End action = MovePtr(x=-1,y= +1); }; interpret F35 { // aka KP_Next action = MovePtr(x=+1,y=+1); }; interpret.repeat= False; // New keysym actions. interpret Pointer_Button_Dflt { action= PointerButton(button=default); }; interpret Pointer_Button1 { action= PointerButton(button=1); }; interpret Pointer_Button2 { action= PointerButton(button=2); }; interpret Pointer_Button3 { action= PointerButton(button=3); }; interpret Pointer_DblClick_Dflt { action= PointerButton(button=default,count=2); }; interpret Pointer_DblClick1 { action= PointerButton(button=1,count=2); }; interpret Pointer_DblClick2 { action= PointerButton(button=2,count=2); }; interpret Pointer_DblClick3 { action= PointerButton(button=3,count=2); }; interpret Pointer_Drag_Dflt { action= LockPointerButton(button=default); }; interpret Pointer_Drag1 { action= LockPointerButton(button=1); }; interpret Pointer_Drag2 { action= LockPointerButton(button=2); }; interpret Pointer_Drag3 { action= LockPointerButton(button=3); }; interpret Pointer_EnableKeys { action= LockControls(controls=MouseKeys); }; interpret Pointer_Accelerate { action= LockControls(controls=MouseKeysAccel); }; interpret Pointer_DfltBtnNext { action= SetPtrDflt(affect=defaultButton,button= +1); }; interpret Pointer_DfltBtnPrev { action= SetPtrDflt(affect=defaultButton,button= -1); }; // Allow an indicator for MouseKeys. indicator "Mouse Keys" { //!allowExplicit; indicatorDrivesKeyboard; controls= MouseKeys; }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.688647 libxkbcommon-0.10.0/test/data/compat/pc0000644000175000017500000000052400000000000017340 0ustar00ranran00000000000000default partial xkb_compatibility "pc" { // Sets the "Alt" virtual modifier. virtual_modifiers Alt; setMods.clearLocks= True; interpret Alt_L+Any { virtualModifier= Alt; action = SetMods(modifiers=modMapMods); }; interpret Alt_R+Any { virtualModifier= Alt; action = SetMods(modifiers=modMapMods); }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.688647 libxkbcommon-0.10.0/test/data/compat/xfree860000644000175000017500000000346200000000000020231 0ustar00ranran00000000000000// XFree86 special keysyms. default partial xkb_compatibility "basic" { interpret.repeat= True; interpret XF86_Switch_VT_1 { action = SwitchScreen(Screen=1, !SameServer); }; interpret XF86_Switch_VT_2 { action = SwitchScreen(Screen=2, !SameServer); }; interpret XF86_Switch_VT_3 { action = SwitchScreen(Screen=3, !SameServer); }; interpret XF86_Switch_VT_4 { action = SwitchScreen(Screen=4, !SameServer); }; interpret XF86_Switch_VT_5 { action = SwitchScreen(Screen=5, !SameServer); }; interpret XF86_Switch_VT_6 { action = SwitchScreen(Screen=6, !SameServer); }; interpret XF86_Switch_VT_7 { action = SwitchScreen(Screen=7, !SameServer); }; interpret XF86_Switch_VT_8 { action = SwitchScreen(Screen=8, !SameServer); }; interpret XF86_Switch_VT_9 { action = SwitchScreen(Screen=9, !SameServer); }; interpret XF86_Switch_VT_10 { action = SwitchScreen(Screen=10, !SameServer); }; interpret XF86_Switch_VT_11 { action = SwitchScreen(Screen=11, !SameServer); }; interpret XF86_Switch_VT_12 { action = SwitchScreen(Screen=12, !SameServer); }; interpret XF86LogGrabInfo { action = Private(type=0x86, data="PrGrbs"); }; interpret XF86LogWindowTree { action = Private(type=0x86, data="PrWins"); }; interpret XF86_Next_VMode { action = Private(type=0x86, data="+VMode"); }; interpret XF86_Prev_VMode { action = Private(type=0x86, data="-VMode"); }; }; partial xkb_compatibility "grab_break" { interpret XF86_Ungrab { action = Private(type=0x86, data="Ungrab"); }; interpret XF86_ClearGrab { action = Private(type=0x86, data="ClsGrb"); }; }; ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.688647 libxkbcommon-0.10.0/test/data/compose/0000755000175000017500000000000000000000000017174 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1579381981.688647 libxkbcommon-0.10.0/test/data/compose/en_US.UTF-8/0000755000175000017500000000000000000000000021007 5ustar00ranran00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1579381981.6919804 libxkbcommon-0.10.0/test/data/compose/en_US.UTF-8/Compose0000644000175000017500000210657400000000000022356 0ustar00ranran00000000000000 # UTF-8 (Unicode) compose sequence # David.Monniaux@ens.fr # # Part 1 - Manual definitions # Spacing versions of dead accents : "~" asciitilde # TILDE : "~" asciitilde # TILDE : "'" apostrophe # APOSTROPHE : "´" acute # ACUTE ACCENT : "´" acute # ACUTE ACCENT : "`" grave # GRAVE ACCENT : "`" grave # GRAVE ACCENT : "^" asciicircum # CIRCUMFLEX ACCENT : "^" asciicircum # CIRCUMFLEX ACCENT : "°" degree # DEGREE SIGN : "°" degree # DEGREE SIGN : "¯" macron # MACRON : "¯" macron # MACRON : "¯" macron # MACRON : "¯" macron # MACRON : "¯" macron # MACRON : "¯" macron # MACRON : "˘" breve # BREVE : "˘" breve # BREVE : "˘" breve # BREVE : "˘" breve # BREVE : "˙" abovedot # DOT ABOVE : "˙" abovedot # DOT ABOVE : "¨" diaeresis # DIAERESIS : "¨" diaeresis # DIAERESIS : "\"" quotedbl # REVERSE SOLIDUS : "˝" U2dd # DOUBLE ACUTE ACCENT : "˝" U2dd # DOUBLE ACUTE ACCENT : "ˇ" caron # CARON : "ˇ" caron # CARON : "ˇ" caron # CARON : "ˇ" caron # CARON : "¸" cedilla # CEDILLA : "¸" cedilla # CEDILLA : "˛" ogonek # OGONEK : "˛" ogonek # OGONEK : "ͺ" U37a # GREEK YPOGEGRAMMENI : "ͺ" U37a # GREEK YPOGEGRAMMENI : "­" U00ad # SOFT HYPHEN # ASCII characters that may be difficult to access # on some keyboards. : "#" numbersign # NUMBER SIGN : "'" apostrophe # APOSTROPHE : "'" apostrophe # APOSTROPHE : "@" at # COMMERCIAL AT : "[" bracketleft # LEFT SQUARE BRACKET : "\\" backslash # REVERSE SOLIDUS : "\\" backslash # REVERSE SOLIDUS : "\\" backslash # REVERSE SOLIDUS : "]" bracketright # RIGHT SQUARE BRACKET : "^" asciicircum # CIRCUMFLEX ACCENT : "^" asciicircum # CIRCUMFLEX ACCENT : "^" asciicircum # CIRCUMFLEX ACCENT : "^" asciicircum # CIRCUMFLEX ACCENT : "`" grave # GRAVE ACCENT : "`" grave # GRAVE ACCENT : "¸" cedilla # CEDILLA : "¸" cedilla # CEDILLA : "¸" cedilla # CEDILLA : "{" braceleft # LEFT CURLY BRACKET : "{" braceleft # LEFT CURLY BRACKET : "|" bar # VERTICAL LINE : "|" bar # VERTICAL LINE : "|" bar # VERTICAL LINE : "|" bar # VERTICAL LINE : "|" bar # VERTICAL LINE : "|" bar # VERTICAL LINE : "}" braceright # RIGHT CURLY BRACKET : "}" braceright # RIGHT CURLY BRACKET : "~" asciitilde # TILDE : "~" asciitilde # TILDE : "~" asciitilde # TILDE : "~" asciitilde # TILDE # Spaces : " " nobreakspace # NO-BREAK SPACE : " " U2008 # PUNCTUATION SPACE : "©" copyright # COPYRIGHT SIGN : "©" copyright # COPYRIGHT SIGN : "©" copyright # COPYRIGHT SIGN : "©" copyright # COPYRIGHT SIGN : "©" copyright # COPYRIGHT SIGN : "©" copyright # COPYRIGHT SIGN : "®" registered # REGISTERED SIGN : "®" registered # REGISTERED SIGN : "®" registered # REGISTERED SIGN : "®" registered # REGISTERED SIGN : "®" registered # REGISTERED SIGN : "›" U203a # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK : "‹" U2039 # SINGLE LEFT-POINTING ANGLE QUOTATION MARK : "…" ellipsis # HORIZONTAL ELLIPSIS : "·" periodcentered # MIDDLE DOT : "·" periodcentered # MIDDLE DOT : "·" periodcentered # MIDDLE DOT : "•" enfilledcircbullet # BULLET : "¦" brokenbar # BROKEN BAR : "¡" exclamdown # INVERTED EXCLAMATION MARK