diff -Nru libxkbcommon-0.1.0~1/.gitignore libxkbcommon-0.1.0~2/.gitignore --- libxkbcommon-0.1.0~1/.gitignore 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/.gitignore 2012-08-11 16:17:00.000000000 +0000 @@ -76,3 +76,8 @@ # Edit the following section as needed # For example, !report.pc overrides *.pc. See 'man gitignore' # + +.dirstamp +cscope.out +test-suite.log +test-driver diff -Nru libxkbcommon-0.1.0~1/.uncrustify.cfg libxkbcommon-0.1.0~2/.uncrustify.cfg --- libxkbcommon-0.1.0~1/.uncrustify.cfg 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/.uncrustify.cfg 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,228 @@ +tok_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 diff -Nru libxkbcommon-0.1.0~1/Android.mk libxkbcommon-0.1.0~2/Android.mk --- libxkbcommon-0.1.0~1/Android.mk 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/Android.mk 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,45 @@ +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LIBXKBCOMMON_TOP := $(LOCAL_PATH) + +LIBXKBCOMMON_BUILT_MAKEFILES := \ + $(LIBXKBCOMMON_TOP)/Android_build.mk + +libxkbcommon-configure: + cd $(LIBXKBCOMMON_TOP) && autoreconf -fiv + cd $(LIBXKBCOMMON_TOP) && \ + CC="$(CONFIGURE_CC)" \ + CFLAGS="$(CONFIGURE_CFLAGS)" \ + LD=$(TARGET_LD) \ + LDFLAGS="$(CONFIGURE_LDFLAGS)" \ + CPP=$(CONFIGURE_CPP) \ + CPPFLAGS="$(CONFIGURE_CPPFLAGS)" \ + PKG_CONFIG_LIBDIR=$(CONFIGURE_PKG_CONFIG_LIBDIR) \ + PKG_CONFIG_TOP_BUILD_DIR=$(PKG_CONFIG_TOP_BUILD_DIR) \ + ./configure --host=arm-linux-androideabi \ + --prefix /system \ + --with-xkb-config-root=/system/usr/share/xkb + rm -f $(LIBXKBCOMMON_BUILT_MAKEFILES) + @for file in $(LIBXKBCOMMON_BUILT_MAKEFILES); do \ + echo "make -C $$(dirname $$file) $$(basename $$file)" ; \ + make -C $$(dirname $$file) $$(basename $$file) ; \ + done + +libxkbcommon-reset: + cd $(LIBXKBCOMMON_TOP) && \ + git clean -qdxf && \ + git reset --hard HEAD + +libxkbcommon-clean: + +.PHONY: libxkbcommon-configure libxkbcommon-clean libxkbcommon-reset + +CONFIGURE_TARGETS += libxkbcommon-configure +CONFIGURE_RESET_TARGETS += libxkbcommon-reset +AGGREGATE_CLEAN_TARGETS += libxkbcommon-clean +CONFIGURE_PKG_CONFIG_LIBDIR := $(CONFIGURE_PKG_CONFIG_LIBDIR):$(LIBXKBCOMMON_TOP) + +-include $(LIBXKBCOMMON_BUILT_MAKEFILES) + diff -Nru libxkbcommon-0.1.0~1/Makefile.am libxkbcommon-0.1.0~2/Makefile.am --- libxkbcommon-0.1.0~1/Makefile.am 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/Makefile.am 2012-08-11 16:17:00.000000000 +0000 @@ -1,5 +1,6 @@ -# Order: makekeys before src -SUBDIRS = include makekeys src test +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = makekeys pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = xkbcommon.pc @@ -15,3 +16,153 @@ $(CHANGELOG_CMD) dist-hook: ChangeLog INSTALL + +AM_CPPFLAGS = \ + -DDFLT_XKB_CONFIG_ROOT='"$(XKBCONFIGROOT)"' \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/src/xkbcomp \ + -I$(top_builddir)/src/xkbcomp \ + -include $(top_builddir)/src/config.h + +AM_CFLAGS = \ + $(BASE_CFLAGS) \ + $(XMALLOC_ZERO_CFLAGS) + +AM_YFLAGS = -d + +xkbcommonincludedir = $(includedir)/xkbcommon +xkbcommoninclude_HEADERS = \ + xkbcommon/xkbcommon.h \ + xkbcommon/xkbcommon-names.h \ + xkbcommon/xkbcommon-keysyms.h + +lib_LTLIBRARIES = libxkbcommon.la +libxkbcommon_la_LDFLAGS = -no-undefined +libxkbcommon_la_SOURCES = \ + src/xkbcomp/action.c \ + src/xkbcomp/action.h \ + src/xkbcomp/compat.c \ + src/xkbcomp/expr.c \ + src/xkbcomp/expr.h \ + src/xkbcomp/keycodes.c \ + src/xkbcomp/keytypes.c \ + src/xkbcomp/parser.y \ + src/xkbcomp/parseutils.c \ + src/xkbcomp/parseutils.h \ + src/xkbcomp/path.c \ + src/xkbcomp/path.h \ + src/xkbcomp/rules.c \ + src/xkbcomp/rules.h \ + src/xkbcomp/scanner.l \ + src/xkbcomp/symbols.c \ + src/xkbcomp/vmod.c \ + src/xkbcomp/vmod.h \ + src/xkbcomp/xkbcomp.c \ + src/xkbcomp/xkbcomp.h \ + src/xkbcomp/xkbcomp-priv.h \ + src/atom.c \ + src/atom.h \ + src/context.c \ + src/darray.h \ + src/keymap-dump.c \ + src/keysym.c \ + src/keysym-utf.c \ + src/list.h \ + src/map.c \ + src/state.c \ + src/text.c \ + src/text.h \ + src/utils.h \ + src/xkb-priv.h + +BUILT_SOURCES = \ + src/xkbcomp/parser.c \ + src/xkbcomp/parser.h \ + src/xkbcomp/scanner.c \ + src/ks_tables.h +CLEANFILES = $(BUILT_SOURCES) + +src/xkbcomp/parser.c: $(top_builddir)/src/$(am__dirstamp) $(top_builddir)/src/xkbcomp/$(am__dirstamp) +src/xkbcomp/parser.h: $(top_builddir)/src/$(am__dirstamp) $(top_builddir)/src/xkbcomp/$(am__dirstamp) +src/xkbcomp/scanner.c: $(top_builddir)/src/$(am__dirstamp) $(top_builddir)/src/xkbcomp/$(am__dirstamp) + +src/ks_tables.h: $(top_builddir)/makekeys/makekeys$(EXEEXT) + $(AM_V_GEN)$(top_builddir)/makekeys/makekeys $(top_srcdir)/xkbcommon/xkbcommon-keysyms.h > $@ + +$(top_builddir)/makekeys/makekeys$(EXEEXT): $(top_srcdir)/makekeys/makekeys.c + $(MAKE) -C makekeys + +# Tests + +# Some tests need to use unexported symbols, so we link them against +# a private copy of libxkbcommon with all symbols exposed. +noinst_LTLIBRARIES = libtest.la +libtest_la_LDFLAGS = $(libxkbcommon_la_LDFLAGS) +libtest_la_SOURCES = \ + $(libxkbcommon_la_SOURCES) \ + test/common.c + +TESTS_ENVIRONMENT = + +TESTS = \ + test/keysym \ + test/filecomp \ + test/rulescomp \ + test/state \ + test/context \ + test/rules-file \ + test/stringcomp \ + test/keyseq \ + test/log +TESTS_LDADD = libtest.la + +test_keysym_LDADD = $(TESTS_LDADD) +test_filecomp_LDADD = $(TESTS_LDADD) +test_rulescomp_LDADD = $(TESTS_LDADD) -lrt +test_state_LDADD = $(TESTS_LDADD) +test_context_LDADD = $(TESTS_LDADD) +test_rules_file_CFLAGS = $(AM_CFLAGS) -Wno-declaration-after-statement +test_rules_file_LDADD = $(TESTS_LDADD) +test_stringcomp_LDADD = $(TESTS_LDADD) +test_keyseq_LDADD = $(TESTS_LDADD) +test_log_LDADD = $(TESTS_LDADD) +test_interactive_LDADD = $(TESTS_LDADD) + +check_PROGRAMS = \ + $(TESTS) \ + test/interactive + +EXTRA_DIST = \ + test/data \ + test/test.h + +# This sed script strips out lines that start with '#define _' which +# removes #define _OSF_Keysyms and such. The XK_Ydiaeresis case is to +# handle a duplicate definition in HPkeysyms.h which kicks in if it's +# not already defined. + +X11_INCLUDEDIR = /usr/include/X11 +KEYSYMDEFS = \ + $(X11_INCLUDEDIR)/keysymdef.h \ + $(X11_INCLUDEDIR)/XF86keysym.h \ + $(X11_INCLUDEDIR)/Sunkeysym.h \ + $(X11_INCLUDEDIR)/DECkeysym.h \ + $(X11_INCLUDEDIR)/HPkeysym.h +update-keysyms: + sed -e '/XK_Ydiaeresis\s*0x100000ee/d; /#define _/d; s/#define\s*\(\w*\)XK_/#define XKB_KEY_\1/; /\(#ifdef\|#ifndef\|#endif\)/d' $(KEYSYMDEFS) > xkbcommon/xkbcommon-keysyms.h + +# Android stuff + +Android_build.mk: Makefile $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libxkbcommon \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + \ + -:STATIC libxkbcommon \ + -:TAGS eng debug \ + -:SOURCES $(filter-out %.l %.y,$(libxkbcommon_la_SOURCES)) $(BUILT_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(AM_CPPFLAGS) $(AM_CFLAGS) \ + -:LDFLAGS $(libxkbcommon_la_LDFLAGS) \ + \ + -:PASSTHROUGH 'libxkbcommon-clean: clean-libxkbcommon' \ + > $@ diff -Nru libxkbcommon-0.1.0~1/README libxkbcommon-0.1.0~2/README --- libxkbcommon-0.1.0~1/README 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/README 2012-08-11 16:17:00.000000000 +0000 @@ -1,23 +1,116 @@ -All questions regarding this software should be directed at the -Xorg mailing list: +xkbcommon +========= - http://lists.freedesktop.org/mailman/listinfo/xorg +libxkbcommon is a keymap compiler and support library which processes a +reduced subset of keymaps as defined by the XKB specification. Primarily, +a keymap is created from a set of Rules/Model/Layout/Variant/Options names, +processed through an XKB ruleset, and compiled into a struct xkb_keymap, +which is the base type for all xkbcommon operations. + +From an xkb_keymap, an xkb_state object is created which holds the current +state of all modifiers, groups, LEDs, etc, relating to that keymap. All +key events must be fed into the xkb_state object using xkb_state_update_key. +Once this is done, the xkb_state object will be properly updated, and the +keysyms to use can be obtained with xkb_key_get_syms. + +libxkbcommon does not distribute a dataset itself, other than for testing +purposes. The most common dataset is xkeyboard-config, as used by all +current distributions for their X11 XKB data. More information on +xkeyboard-config is available here: + http://www.freedesktop.org/wiki/Software/XKeyboardConfig + + +API +=== + +While xkbcommon's API is somewhat derived from the classic XKB API as found +in and friends, it has been substantially reworked to +expose fewer internal details to clients. The only supported API is available +in . Any definition not in this header (including +accessing internal structures through the old macros previously available) +should be regarded as an implementation detail and is liable to change at any +time. + +During its early development, xkbcommon does not promise API or ABI stability. +Regardless, we will attempt to not break ABI during a minor release series, +so applications written against 0.1.0 should be completely compatible with +0.1.3, but not necessarily with 0.2.0. However, new symbols may be introduced +in any release. Thus, anyone packaging xkbcommon should make sure any package +depending on it depends on a release greater than or equal to the version it +was built against (or earlier, if it doesn't use any newly-introduced +symbols), but less than the next major release. + +xkbcommon 1.x will offer full API and ABI stability for its lifetime, with a +soname of libxkbcommon.so.1. Any ABI breaks will wait until xkbcommon 2.0, +which will be libxkbcommon.so.2. + +The xkbcomp command-line tool has also been removed, although this will +likely reappear in a later release. + + +Relation to X11 +=============== + +Relative to the XKB 1.1 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 + +Notable additions: + - 32-bit keycodes + - extended number of modifiers + - extended number of groups + - multiple keysyms per level + + this requires incompatible dataset changes, such that X11 would + not be able to parse these + + +Development +=========== + +xkbcommon is maintained in git at freedesktop.org: + git://anongit.freedesktop.org/git/xorg/lib/libxkbcommon + +Patches are always welcome, and may be sent to either xorg-devel@lists.x.org, +or wayland-devel@lists.freedesktop.org. Bugs are tracked in Bugzilla at: + http://bugs.freedesktop.org + +The primary author and maintainer is Daniel Stone, who can be reached at: + -Please submit bug reports to the Xorg bugzilla: - https://bugs.freedesktop.org/enter_bug.cgi?product=xorg - -The master development code repository can be found at: - - git://anongit.freedesktop.org/git/xorg/lib/libxkbcommon - - http://cgit.freedesktop.org/xorg/lib/libxkbcommon - -For patch submission instructions, see: - - http://www.x.org/wiki/Development/Documentation/SubmittingPatches - -For more information on the git code manager, see: - - http://wiki.x.org/wiki/GitPage +Credits +======= +Many thanks are due to Dan Nicholson for his heroic work in getting xkbcommon +off the ground initially, as well as to Ran Benita for subsequent development. diff -Nru libxkbcommon-0.1.0~1/autogen.sh libxkbcommon-0.1.0~2/autogen.sh --- libxkbcommon-0.1.0~1/autogen.sh 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/autogen.sh 2012-08-11 16:17:00.000000000 +0000 @@ -6,7 +6,7 @@ ORIGDIR=`pwd` cd "$srcdir" -autoreconf -v --install || exit 1 +autoreconf --verbose --install --symlink --warnings=all || exit 1 cd "$ORIGDIR" || exit $? exec "$srcdir/configure" --enable-maintainer-mode "$@" diff -Nru libxkbcommon-0.1.0~1/configure.ac libxkbcommon-0.1.0~2/configure.ac --- libxkbcommon-0.1.0~1/configure.ac 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/configure.ac 2012-08-11 16:17:00.000000000 +0000 @@ -29,11 +29,14 @@ AC_CONFIG_MACRO_DIR([m4]) # Initialize Automake -AM_INIT_AUTOMAKE([foreign dist-bzip2]) +AM_INIT_AUTOMAKE([foreign dist-bzip2 subdir-objects color-tests parallel-tests]) AM_MAINTAINER_MODE +# Get _GNU_SOURCE and friends +AC_USE_SYSTEM_EXTENSIONS + # Initialize libtool -AC_PROG_LIBTOOL +LT_INIT # Require xorg-macros minimum of 1.8 for AM_SILENT_RULES m4_ifndef([XORG_MACROS_VERSION], @@ -42,18 +45,28 @@ XORG_DEFAULT_OPTIONS XORG_CHECK_MALLOC_ZERO +# Check for compiler features +AC_C_INLINE +AC_C_TYPEOF + # Check for programs AC_PROG_LEX AC_PROG_YACC AC_PATH_PROG([YACC_INST], $YACC) -if test ! -f "src/xkbcomp/xkbparse.c"; then +if test ! -f "src/xkbcomp/parser.c"; then if test -z "$YACC_INST"; then - AC_MSG_ERROR([yacc not found - unable to compile src/xkbcomp/xkbparse.y]) + AC_MSG_ERROR([yacc not found - unable to compile src/xkbcomp/parser.y]) fi fi # Checks for library functions. -AC_CHECK_FUNCS([strcasecmp]) +AC_CHECK_FUNCS([strcasecmp strncasecmp]) +if test "x$ac_cv_func_strcasecmp" = xno || \ + test "x$ac_cv_func_strncasecmp" = xno; then + AC_MSG_ERROR([C library does not support strcasecmp/strncasecmp]) +fi + +AC_CHECK_FUNCS([eaccess euidaccess]) # Build native compiler needed for makekeys AC_ARG_VAR([CC_FOR_BUILD], [Build native C compiler program]) @@ -65,47 +78,52 @@ fi fi -if test "x$GCC" = xyes ; then - CFLAGS="$CFLAGS -fvisibility=hidden" +if test "x$GCC" = xyes ; then + CFLAGS="$CFLAGS -fvisibility=hidden" fi # Obtain protocols headers include directives -PKG_CHECK_MODULES([X11], [xproto kbproto >= 1.0.4]) - -# Obtain the path to the X Window System Core Protocol -AC_MSG_CHECKING([for X11 includedir]) -includex11dir="`$PKG_CONFIG --variable=includex11dir xproto`" -AC_MSG_RESULT([$includex11dir]) - -# Obtain full path for keysymdef header file -AC_MSG_CHECKING([for keysymdef.h]) -KEYSYMDEF_H="$includex11dir/keysymdef.h" -test -f "$KEYSYMDEF_H" || AC_MSG_ERROR([can't locate keysymdef.h in $includex11dir]) -AC_MSG_RESULT([$KEYSYMDEF_H]) -AC_SUBST([KEYSYMDEF_H]) - -# Obtain full path for XF86keysym header file -AC_MSG_CHECKING([for XF86keysym.h]) -XF86KEYSYM_H="$includex11dir/XF86keysym.h" -test -f "$XF86KEYSYM_H" || AC_MSG_ERROR([can't locate XF86keysym.h in $includex11dir]) -AC_MSG_RESULT([$XF86KEYSYM_H]) -AC_SUBST([XF86KEYSYM_H]) +PKG_CHECK_MODULES([X11], [kbproto >= 1.0.4]) # Define a configuration option for the XKB config root xkb_base=`$PKG_CONFIG --variable=xkb_base xkeyboard-config` +if test "x$xkb_base" = x; then + xkb_base=$datadir/X11/xkb +fi AC_ARG_WITH([xkb_config_root], - [AS_HELP_STRING([--with-xkb-config-root=], - [Set default XKB config root (default: ${datadir}/X11/xkb)])], + [AS_HELP_STRING([--with-xkb-config-root=], + [Set default XKB config root (default: xkeyboard-config install path)])], [XKBCONFIGROOT="$withval"], [XKBCONFIGROOT="$xkb_base"]) AC_SUBST([XKBCONFIGROOT]) +AC_ARG_WITH([default_rules], + [AS_HELP_STRING([--with-default-rules=], + [Default XKB ruleset (default: evdev)])], + [DEFAULT_XKB_RULES="$withval"], + [DEFAULT_XKB_RULES="evdev"]) +AC_DEFINE_UNQUOTED([DEFAULT_XKB_RULES], ["$DEFAULT_XKB_RULES"], + [Default XKB ruleset]) + +AC_ARG_WITH([default_model], + [AS_HELP_STRING([--with-default-model=], + [Default XKB model (default: pc105)])], + [DEFAULT_XKB_MODEL="$withval"], + [DEFAULT_XKB_MODEL="pc105"]) +AC_DEFINE_UNQUOTED([DEFAULT_XKB_MODEL], ["$DEFAULT_XKB_MODEL"], + [Default XKB model]) + +AC_ARG_WITH([default_layout], + [AS_HELP_STRING([--with-default-layout=], + [Default XKB layout (default: us)])], + [DEFAULT_XKB_LAYOUT="$withval"], + [DEFAULT_XKB_LAYOUT="us"]) +AC_DEFINE_UNQUOTED([DEFAULT_XKB_LAYOUT], ["$DEFAULT_XKB_LAYOUT"], + [Default XKB layout]) + AC_CONFIG_FILES([ - Makefile - xkbcommon.pc - include/Makefile - makekeys/Makefile - src/Makefile - src/xkbcomp/Makefile - test/Makefile]) + Makefile + makekeys/Makefile + xkbcommon-uninstalled.pc + xkbcommon.pc]) AC_OUTPUT diff -Nru libxkbcommon-0.1.0~1/debian/changelog libxkbcommon-0.1.0~2/debian/changelog --- libxkbcommon-0.1.0~1/debian/changelog 2012-09-17 06:12:14.000000000 +0000 +++ libxkbcommon-0.1.0~2/debian/changelog 2012-09-17 06:12:14.000000000 +0000 @@ -1,11 +1,21 @@ -libxkbcommon (0.1.0~1-0ubuntu1) precise; urgency=low +libxkbcommon (0.1.0~2-0ubuntu1) precise; urgency=low - * Merge from Debian git. Remaining Ubuntu changes: - - Make explicit that this is an experimental package + * precise rebuild + * Merge from unreleased debian git, remaining changes: + - Make explicit that this is an experimental package. + * Timo Aaltonen Thu, 16 Aug 2012 21:41:13 +0300 - -- Timo Aaltonen Tue, 03 Jan 2012 21:43:00 +0200 + -- Xavier Boudet Fri, 14 Sep 2012 18:52:05 +0200 -libxkbcommon (0.1.0~1-1) UNRELEASED; urgency=low +libxkbcommon (0.1.0~2-1) UNRELEASED; urgency=low + + * Merge master up to f491285a5f. + * libxkbcommon-dev.install: Add new headers, rename existing. + * control: Update Standards-Version, no changes. + + -- Timo Aaltonen Thu, 16 Aug 2012 21:37:51 +0300 + +libxkbcommon (0.1.0~1-1) experimental; urgency=low [ Cyril Brulebois ] * Fix short description for libxkbcommon-dev. @@ -13,14 +23,7 @@ [ Timo Aaltonen ] * Merge master up to c19661b965. - -- Cyril Brulebois Fri, 17 Jun 2011 16:21:08 +0200 - -libxkbcommon (0.1.0~0-1ubuntu1) natty; urgency=low - - * Merge with Debian. Remaining Ubuntu changes: - - Make explicit that this is an experimental package - - -- Bryce Harrington Mon, 21 Feb 2011 18:01:00 -0800 + -- Cyril Brulebois Fri, 10 Feb 2012 22:12:02 +0100 libxkbcommon (0.1.0~0-1) experimental; urgency=low @@ -42,68 +45,3 @@ * Use xkb-data build-dep since it's needed for the test suite. -- Cyril Brulebois Mon, 31 Jan 2011 05:07:13 +0100 - -libxkbcommon (0.1~git20101026.f94a64cc-0ubuntu11) natty; urgency=low - - * Set up shlibs control file and make package name match sonames - (lp: #690122) - * Make explicit that this is an experimental package, does not have a - stable API, and should not have bug reports filed against it. - - -- Bryce Harrington Mon, 24 Jan 2011 18:17:05 -0800 - -libxkbcommon (0.1~git20101026.f94a64cc-0ubuntu10) natty; urgency=low - - * debian/libxkbcommon-dev.install, rules: Exclude *.la files - - -- Bryce Harrington Tue, 23 Nov 2010 10:26:00 -0800 - -libxkbcommon (0.1~git20101026.f94a64cc-0ubuntu9) maverick; urgency=low - - * debian/control: Add libxkbcommon-dev package. - - -- Bryce Harrington Sat, 06 Nov 2010 22:44:35 -0700 - -libxkbcommon (0.1~git20101026.f94a64cc-0ubuntu8) maverick; urgency=low - - * debian/rules: fix name of debug package - - -- Bryce Harrington Sat, 06 Nov 2010 15:14:58 -0700 - -libxkbcommon (0.1~git20101026.f94a64cc-0ubuntu7) maverick; urgency=low - - * debian/*.install: Install the .so and .la files - - -- Bryce Harrington Sat, 06 Nov 2010 14:40:52 -0700 - -libxkbcommon (0.1~git20101026.f94a64cc-0ubuntu6) maverick; urgency=low - - * debian/rules: Disable packaging of the (non-existant) changelog - - -- Bryce Harrington Sat, 06 Nov 2010 02:46:16 -0700 - -libxkbcommon (0.1~git20101026.f94a64cc-0ubuntu5) maverick; urgency=low - - * debian/control: flex of course is required as well. - - -- Bryce Harrington Sat, 06 Nov 2010 02:03:23 -0700 - -libxkbcommon (0.1~git20101026.f94a64cc-0ubuntu4) maverick; urgency=low - - * debian/control: bison is required for yacc support. - - -- Bryce Harrington Sat, 06 Nov 2010 01:38:28 -0700 - -libxkbcommon (0.1~git20101026.f94a64cc-0ubuntu2) maverick; urgency=low - - * debian/control: - + Include dependency on xutils-dev which provides required xorg-macros.m4 - - -- Bryce Harrington Sat, 06 Nov 2010 01:22:08 -0700 - -libxkbcommon (0.1~git20101026.f94a64cc-0ubuntu1) maverick; urgency=low - - * Git snapshot from 2010-10-26 (up to commit f94a64cc) - - -- Bryce Harrington Fri, 05 Nov 2010 17:50:05 -0700 - diff -Nru libxkbcommon-0.1.0~1/debian/control libxkbcommon-0.1.0~2/debian/control --- libxkbcommon-0.1.0~1/debian/control 2012-09-17 06:12:14.000000000 +0000 +++ libxkbcommon-0.1.0~2/debian/control 2012-09-17 06:12:14.000000000 +0000 @@ -15,7 +15,7 @@ x11proto-core-dev, x11proto-kb-dev (>= 1.0.5), xkb-data, -Standards-Version: 3.9.1 +Standards-Version: 3.9.3 Vcs-Git: git://git.debian.org/git/pkg-xorg/lib/libxkbcommon Vcs-Browser: http://git.debian.org/?p=pkg-xorg/lib/libxkbcommon.git diff -Nru libxkbcommon-0.1.0~1/debian/libxkbcommon-dev.install libxkbcommon-0.1.0~2/debian/libxkbcommon-dev.install --- libxkbcommon-0.1.0~1/debian/libxkbcommon-dev.install 2012-09-17 06:12:14.000000000 +0000 +++ libxkbcommon-0.1.0~2/debian/libxkbcommon-dev.install 2012-09-17 06:12:14.000000000 +0000 @@ -1,5 +1,7 @@ # Use no wildcards to ensure we spot any update: -usr/include/X11/extensions/XKBcommon.h +usr/include/xkbcommon/xkbcommon.h +usr/include/xkbcommon/xkbcommon-keysyms.h +usr/include/xkbcommon/xkbcommon-names.h usr/lib/libxkbcommon.a usr/lib/libxkbcommon.so usr/lib/pkgconfig/xkbcommon.pc diff -Nru libxkbcommon-0.1.0~1/include/Makefile.am libxkbcommon-0.1.0~2/include/Makefile.am --- libxkbcommon-0.1.0~1/include/Makefile.am 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/include/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -nobase_include_HEADERS = X11/extensions/XKBcommon.h diff -Nru libxkbcommon-0.1.0~1/include/X11/extensions/XKBcommon.h libxkbcommon-0.1.0~2/include/X11/extensions/XKBcommon.h --- libxkbcommon-0.1.0~1/include/X11/extensions/XKBcommon.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/include/X11/extensions/XKBcommon.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,841 +0,0 @@ -/* -Copyright 1985, 1987, 1990, 1998 The Open Group -Copyright 2008 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 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. - -********************************************************/ - - -#ifndef _XKBCOMMON_H_ -#define _XKBCOMMON_H_ - -#include -#include -#include -#include - -#ifndef X_PROTOCOL -typedef unsigned char KeyCode; -#endif - -/* Duplicate the modifier mask defines so libxkcommon can be used - * without X.h */ -#define XKB_COMMON_SHIFT_MASK (1<<0) -#define XKB_COMMON_LOCK_MASK (1<<1) -#define XKB_COMMON_CONTROL_MASK (1<<2) -#define XKB_COMMON_MOD1_MASK (1<<3) -#define XKB_COMMON_MOD2_MASK (1<<4) -#define XKB_COMMON_MOD3_MASK (1<<5) -#define XKB_COMMON_MOD4_MASK (1<<6) -#define XKB_COMMON_MOD5_MASK (1<<7) - - -struct xkb_rule_names { - const char * rules; - const char * model; - const char * layout; - const char * variant; - const char * options; -}; - -struct xkb_any_action { - uint8_t type; - uint8_t data[7]; -}; - -struct xkb_mod_action { - uint8_t type; - uint8_t flags; - uint8_t mask; - uint8_t real_mods; - uint16_t vmods; -}; - -struct xkb_group_action { - uint8_t type; - uint8_t flags; - int16_t group; -}; - -struct xkb_iso_action { - uint8_t type; - uint8_t flags; - uint8_t mask; - uint8_t real_mods; - uint8_t group; - uint8_t affect; - uint16_t vmods; -}; - -struct xkb_controls_action { - uint8_t type; - uint8_t flags; - uint32_t ctrls; -}; - -struct xkb_device_button_action { - uint8_t type; - uint8_t flags; - uint8_t count; - uint8_t button; - uint8_t device; -}; - -struct xkb_device_valuator_action { - uint8_t type; - uint8_t device; - uint8_t v1_what; - uint8_t v1_index; - uint8_t v1_value; - uint8_t v2_what; - uint8_t v2_index; - uint8_t v2_value; -}; - -struct xkb_pointer_default_action { - uint8_t type; - uint8_t flags; - uint8_t affect; - uint8_t value; -}; - -struct xkb_switch_screen_action { - uint8_t type; - uint8_t flags; - uint8_t screen; -}; - -struct xkb_redirect_key_action { - uint8_t type; - uint8_t new_key; - uint8_t mods_mask; - uint8_t mods; - uint16_t vmods_mask; - uint16_t vmods; -}; - -struct xkb_pointer_action { - uint8_t type; - uint8_t flags; - uint16_t x; - uint16_t y; -}; - -struct xkb_message_action { - uint8_t type; - uint8_t flags; - uint8_t message[6]; -}; - -struct xkb_pointer_button_action { - uint8_t type; - uint8_t flags; - uint8_t count; - uint8_t button; -}; - -union xkb_action { - struct xkb_any_action any; - struct xkb_mod_action mods; - struct xkb_group_action group; - struct xkb_iso_action iso; - struct xkb_controls_action ctrls; - struct xkb_device_button_action devbtn; - struct xkb_device_valuator_action devval; - struct xkb_pointer_default_action dflt; - struct xkb_switch_screen_action screen; - struct xkb_redirect_key_action redirect; /* XXX wholly unnecessary? */ - struct xkb_pointer_action ptr; /* XXX delete for DeviceValuator */ - struct xkb_pointer_button_action btn; /* XXX delete for DeviceBtn */ - struct xkb_message_action msg; /* XXX just delete */ - unsigned char type; -}; - -struct xkb_mods { - uint32_t mask; /* effective mods */ - uint32_t vmods; - uint8_t real_mods; -}; - -struct xkb_kt_map_entry { - int active; - uint16_t level; - struct xkb_mods mods; -}; - -struct xkb_key_type { - struct xkb_mods mods; - uint16_t num_levels; - unsigned char map_count; - struct xkb_kt_map_entry * map; - struct xkb_mods * preserve; - uint32_t name; - uint32_t *level_names; -}; - -struct xkb_sym_interpret { - uint32_t sym; - unsigned char flags; - unsigned char match; - uint8_t mods; /* XXX real or virt? */ - uint32_t virtual_mod; - struct xkb_any_action act; -}; - -struct xkb_compat_map { - struct xkb_sym_interpret * sym_interpret; - struct xkb_mods groups[XkbNumKbdGroups]; - unsigned short num_si; - unsigned short size_si; -}; - -struct xkb_sym_map { - unsigned char kt_index[XkbNumKbdGroups]; - unsigned char group_info; - unsigned char width; - unsigned short offset; -}; - -#define XkbNumGroups(g) ((g)&0x0f) -#define XkbOutOfRangeGroupInfo(g) ((g)&0xf0) -#define XkbOutOfRangeGroupAction(g) ((g)&0xc0) -#define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4) -#define XkbSetGroupInfo(g,w,n) (((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f)) -#define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f)) - -struct xkb_client_map { - unsigned char size_types; - unsigned char num_types; - struct xkb_key_type * types; - - unsigned short size_syms; - unsigned short num_syms; - uint32_t *syms; - struct xkb_sym_map * key_sym_map; - - unsigned char *modmap; -}; - -#define XkbCMKeyGroupInfo(m,k) ((m)->key_sym_map[k].group_info) -#define XkbCMKeyNumGroups(m,k) (XkbNumGroups((m)->key_sym_map[k].group_info)) -#define XkbCMKeyGroupWidth(m,k,g) (XkbCMKeyType(m,k,g)->num_levels) -#define XkbCMKeyGroupsWidth(m,k) ((m)->key_sym_map[k].width) -#define XkbCMKeyTypeIndex(m,k,g) ((m)->key_sym_map[k].kt_index[g&0x3]) -#define XkbCMKeyType(m,k,g) (&(m)->types[XkbCMKeyTypeIndex(m,k,g)]) -#define XkbCMKeyNumSyms(m,k) (XkbCMKeyGroupsWidth(m,k)*XkbCMKeyNumGroups(m,k)) -#define XkbCMKeySymsOffset(m,k) ((m)->key_sym_map[k].offset) -#define XkbCMKeySymsPtr(m,k) (&(m)->syms[XkbCMKeySymsOffset(m,k)]) - -struct xkb_behavior { - unsigned char type; - unsigned char data; -}; - -struct xkb_server_map { - unsigned short num_acts; - unsigned short size_acts; - -#if defined(__cplusplus) || defined(c_plusplus) - /* explicit is a C++ reserved word */ - unsigned char * c_explicit; -#else - unsigned char * explicit; -#endif - - union xkb_action *acts; - struct xkb_behavior *behaviors; - unsigned short *key_acts; - unsigned char *explicits; - uint32_t vmods[XkbNumVirtualMods]; - uint32_t *vmodmap; -}; - -#define XkbSMKeyActionsPtr(m,k) (&(m)->acts[(m)->key_acts[k]]) - -struct xkb_indicator_map { - unsigned char flags; - unsigned char which_groups; - unsigned char groups; - unsigned char which_mods; - struct xkb_mods mods; - unsigned int ctrls; -}; - -struct xkb_indicator { - unsigned long phys_indicators; - struct xkb_indicator_map maps[XkbNumIndicators]; -}; - -struct xkb_key_name { - char name[XkbKeyNameLength]; -}; - -struct xkb_key_alias { - char real[XkbKeyNameLength]; - char alias[XkbKeyNameLength]; -}; - -struct xkb_names { - uint32_t keycodes; - uint32_t geometry; - uint32_t symbols; - uint32_t types; - uint32_t compat; - uint32_t vmods[XkbNumVirtualMods]; - uint32_t indicators[XkbNumIndicators]; - uint32_t groups[XkbNumKbdGroups]; - struct xkb_key_name * keys; - struct xkb_key_alias * key_aliases; - uint32_t *radio_groups; - uint32_t phys_symbols; - - unsigned char num_keys; - unsigned char num_key_aliases; - unsigned short num_rg; -}; - -struct xkb_property { - char *name; - char *value; -}; - -struct xkb_color { - unsigned int pixel; - char * spec; -}; - -struct xkb_point { - short x; - short y; -}; - -struct xkb_bounds { - short x1,y1; - short x2,y2; -}; - -struct xkb_outline { - unsigned short num_points; - unsigned short sz_points; - unsigned short corner_radius; - struct xkb_point * points; -}; - -struct xkb_shape { - uint32_t name; - unsigned short num_outlines; - unsigned short sz_outlines; - struct xkb_outline * outlines; - struct xkb_outline * approx; - struct xkb_outline * primary; - struct xkb_bounds bounds; -}; - -struct xkb_shape_doodad { - uint32_t name; - unsigned char type; - unsigned char priority; - short top; - short left; - short angle; - unsigned short color_ndx; - unsigned short shape_ndx; -}; -#define XkbShapeDoodadColor(g,d) (&(g)->colors[(d)->color_ndx]) -#define XkbShapeDoodadShape(g,d) (&(g)->shapes[(d)->shape_ndx]) -#define XkbSetShapeDoodadColor(g,d,c) ((d)->color_ndx= (c)-&(g)->colors[0]) -#define XkbSetShapeDoodadShape(g,d,s) ((d)->shape_ndx= (s)-&(g)->shapes[0]) - -struct xkb_text_doodad { - uint32_t name; - unsigned char type; - unsigned char priority; - short top; - short left; - short angle; - short width; - short height; - unsigned short color_ndx; - char * text; - char * font; -}; -#define XkbTextDoodadColor(g,d) (&(g)->colors[(d)->color_ndx]) -#define XkbSetTextDoodadColor(g,d,c) ((d)->color_ndx= (c)-&(g)->colors[0]) - -struct xkb_indicator_doodad { - uint32_t name; - unsigned char type; - unsigned char priority; - short top; - short left; - short angle; - unsigned short shape_ndx; - unsigned short on_color_ndx; - unsigned short off_color_ndx; -}; -#define XkbIndicatorDoodadShape(g,d) (&(g)->shapes[(d)->shape_ndx]) -#define XkbIndicatorDoodadOnColor(g,d) (&(g)->colors[(d)->on_color_ndx]) -#define XkbIndicatorDoodadOffColor(g,d) (&(g)->colors[(d)->off_color_ndx]) -#define XkbSetIndicatorDoodadOnColor(g,d,c) \ - ((d)->on_color_ndx= (c)-&(g)->colors[0]) -#define XkbSetIndicatorDoodadOffColor(g,d,c) \ - ((d)->off_color_ndx= (c)-&(g)->colors[0]) -#define XkbSetIndicatorDoodadShape(g,d,s) \ - ((d)->shape_ndx= (s)-&(g)->shapes[0]) - -struct xkb_logo_doodad { - uint32_t name; - unsigned char type; - unsigned char priority; - short top; - short left; - short angle; - unsigned short color_ndx; - unsigned short shape_ndx; - char * logo_name; -}; -#define XkbLogoDoodadColor(g,d) (&(g)->colors[(d)->color_ndx]) -#define XkbLogoDoodadShape(g,d) (&(g)->shapes[(d)->shape_ndx]) -#define XkbSetLogoDoodadColor(g,d,c) ((d)->color_ndx= (c)-&(g)->colors[0]) -#define XkbSetLogoDoodadShape(g,d,s) ((d)->shape_ndx= (s)-&(g)->shapes[0]) - -struct xkb_any_doodad { - uint32_t name; - unsigned char type; - unsigned char priority; - short top; - short left; - short angle; -}; - -union xkb_doodad { - struct xkb_any_doodad any; - struct xkb_shape_doodad shape; - struct xkb_text_doodad text; - struct xkb_indicator_doodad indicator; - struct xkb_logo_doodad logo; -}; - -#define XkbUnknownDoodad 0 -#define XkbOutlineDoodad 1 -#define XkbSolidDoodad 2 -#define XkbTextDoodad 3 -#define XkbIndicatorDoodad 4 -#define XkbLogoDoodad 5 - -struct xkb_key { - struct xkb_key_name name; - short gap; - unsigned char shape_ndx; - unsigned char color_ndx; -}; -#define XkbKeyShape(g,k) (&(g)->shapes[(k)->shape_ndx]) -#define XkbKeyColor(g,k) (&(g)->colors[(k)->color_ndx]) -#define XkbSetKeyShape(g,k,s) ((k)->shape_ndx= (s)-&(g)->shapes[0]) -#define XkbSetKeyColor(g,k,c) ((k)->color_ndx= (c)-&(g)->colors[0]) - -struct xkb_row { - short top; - short left; - unsigned short num_keys; - unsigned short sz_keys; - int vertical; - struct xkb_key * keys; - struct xkb_bounds bounds; -}; - -struct xkb_section { - uint32_t name; - unsigned char priority; - short top; - short left; - unsigned short width; - unsigned short height; - short angle; - unsigned short num_rows; - unsigned short num_doodads; - unsigned short num_overlays; - unsigned short sz_rows; - unsigned short sz_doodads; - unsigned short sz_overlays; - struct xkb_row * rows; - union xkb_doodad * doodads; - struct xkb_bounds bounds; - struct xkb_overlay *overlays; -}; - -struct xkb_overlay_key { - struct xkb_key_name over; - struct xkb_key_name under; -}; - -struct xkb_overlay_row { - unsigned short row_under; - unsigned short num_keys; - unsigned short sz_keys; - struct xkb_overlay_key * keys; -}; - -struct xkb_overlay { - uint32_t name; - struct xkb_section * section_under; - unsigned short num_rows; - unsigned short sz_rows; - struct xkb_overlay_row * rows; - struct xkb_bounds * bounds; -}; - -struct xkb_geometry { - uint32_t name; - unsigned short width_mm; - unsigned short height_mm; - char * label_font; - struct xkb_color * label_color; - struct xkb_color * base_color; - unsigned short sz_properties; - unsigned short sz_colors; - unsigned short sz_shapes; - unsigned short sz_sections; - unsigned short sz_doodads; - unsigned short sz_key_aliases; - unsigned short num_properties; - unsigned short num_colors; - unsigned short num_shapes; - unsigned short num_sections; - unsigned short num_doodads; - unsigned short num_key_aliases; - struct xkb_property * properties; - struct xkb_color * colors; - struct xkb_shape * shapes; - struct xkb_section * sections; - union xkb_doodad * doodads; - struct xkb_key_alias * key_aliases; -}; -#define XkbGeomColorIndex(g,c) ((int)((c)-&(g)->colors[0])) - -#define XkbGeomPropertiesMask (1<<0) -#define XkbGeomColorsMask (1<<1) -#define XkbGeomShapesMask (1<<2) -#define XkbGeomSectionsMask (1<<3) -#define XkbGeomDoodadsMask (1<<4) -#define XkbGeomKeyAliasesMask (1<<5) -#define XkbGeomAllMask (0x3f) - -struct xkb_geometry_sizes { - unsigned int which; - unsigned short num_properties; - unsigned short num_colors; - unsigned short num_shapes; - unsigned short num_sections; - unsigned short num_doodads; - unsigned short num_key_aliases; -}; - -struct xkb_controls { - unsigned char mk_dflt_btn; - unsigned char num_groups; - unsigned char groups_wrap; - struct xkb_mods internal; - struct xkb_mods ignore_lock; - unsigned int enabled_ctrls; - unsigned short repeat_delay; - unsigned short repeat_interval; - unsigned short slow_keys_delay; - unsigned short debounce_delay; - unsigned short mk_delay; - unsigned short mk_interval; - unsigned short mk_time_to_max; - unsigned short mk_max_speed; - short mk_curve; - 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; - unsigned char per_key_repeat[XkbPerKeyBitArraySize]; -}; - -/* Common keyboard description structure */ -struct xkb_desc { - unsigned int defined; - unsigned short flags; - unsigned short device_spec; - KeyCode min_key_code; - KeyCode max_key_code; - - struct xkb_controls * ctrls; - struct xkb_server_map * server; - struct xkb_client_map * map; - struct xkb_indicator * indicators; - struct xkb_names * names; - struct xkb_compat_map * compat; - struct xkb_geometry * geom; -}; - -#define XkbKeyKeyTypeIndex(d,k,g) (XkbCMKeyTypeIndex((d)->map,k,g)) -#define XkbKeyKeyType(d,k,g) (XkbCMKeyType((d)->map,k,g)) -#define XkbKeyGroupWidth(d,k,g) (XkbCMKeyGroupWidth((d)->map,k,g)) -#define XkbKeyGroupsWidth(d,k) (XkbCMKeyGroupsWidth((d)->map,k)) -#define XkbKeyGroupInfo(d,k) (XkbCMKeyGroupInfo((d)->map,(k))) -#define XkbKeyNumGroups(d,k) (XkbCMKeyNumGroups((d)->map,(k))) -#define XkbKeyNumSyms(d,k) (XkbCMKeyNumSyms((d)->map,(k))) -#define XkbKeySymsPtr(d,k) (XkbCMKeySymsPtr((d)->map,(k))) -#define XkbKeySym(d,k,n) (XkbKeySymsPtr(d,k)[n]) -#define XkbKeySymEntry(d,k,sl,g) \ - (XkbKeySym(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl)))) -#define XkbKeyAction(d,k,n) \ - (XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL) -#define XkbKeyActionEntry(d,k,sl,g) \ - (XkbKeyHasActions(d,k)?\ - XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL) - -#define XkbKeyHasActions(d,k) ((d)->server->key_acts[k]!=0) -#define XkbKeyNumActions(d,k) (XkbKeyHasActions(d,k)?XkbKeyNumSyms(d,k):1) -#define XkbKeyActionsPtr(d,k) (XkbSMKeyActionsPtr((d)->server,k)) -#define XkbKeycodeInRange(d,k) (((k)>=(d)->min_key_code)&&\ - ((k)<=(d)->max_key_code)) -#define XkbNumKeys(d) ((d)->max_key_code-(d)->min_key_code+1) - -struct xkb_map_changes { - unsigned short changed; - KeyCode min_key_code; - KeyCode max_key_code; - unsigned char first_type; - unsigned char num_types; - KeyCode first_key_sym; - unsigned char num_key_syms; - KeyCode first_key_act; - unsigned char num_key_acts; - KeyCode first_key_behavior; - unsigned char num_key_behaviors; - KeyCode first_key_explicit; - unsigned char num_key_explicit; - KeyCode first_modmap_key; - unsigned char num_modmap_keys; - KeyCode first_vmodmap_key; - unsigned char num_vmodmap_keys; - unsigned char pad; - unsigned short vmods; -}; - -struct xkb_controls_changes { - unsigned int changed_ctrls; - unsigned int enabled_ctrls_changes; - int num_groups_changed; -}; - -struct xkb_indicator_changes { - unsigned int state_changes; - unsigned int map_changes; -}; - -struct xkb_name_changes { - unsigned int changed; - unsigned char first_type; - unsigned char num_types; - unsigned char first_lvl; - unsigned char num_lvls; - unsigned char num_aliases; - unsigned char num_rg; - unsigned char first_key; - unsigned char num_keys; - unsigned short changed_vmods; - unsigned long changed_indicators; - unsigned char changed_groups; -}; - -struct xkb_compat_changes { - unsigned char changed_groups; - unsigned short first_si; - unsigned short num_si; -}; - -struct xkb_changes { - unsigned short device_spec; - unsigned short state_changes; - struct xkb_map_changes map; - struct xkb_controls_changes ctrls; - struct xkb_indicator_changes indicators; - struct xkb_name_changes names; - struct xkb_compat_changes compat; -}; - -struct xkb_component_names { - char * keymap; - char * keycodes; - char * types; - char * compat; - char * symbols; - char * geometry; -}; - -struct xkb_component_name { - unsigned short flags; - char * name; -}; - -struct xkb_component_list { - int num_keymaps; - int num_keycodes; - int num_types; - int num_compat; - int num_symbols; - int num_geometry; - struct xkb_component_name * keymaps; - struct xkb_component_name * keycodes; - struct xkb_component_name * types; - struct xkb_component_name * compat; - struct xkb_component_name * symbols; - struct xkb_component_name * geometry; -}; - -struct xkb_state { - unsigned char group; /* base + latched + locked */ - /* FIXME: Why are base + latched short and not char?? */ - unsigned short base_group; /* physically ... down? */ - unsigned short latched_group; - unsigned char locked_group; - - unsigned char mods; /* base + latched + locked */ - unsigned char base_mods; /* physically down */ - unsigned char latched_mods; - unsigned char locked_mods; - - unsigned char compat_state; /* mods + group for core state */ - - /* grab mods = all depressed and latched mods, _not_ locked mods */ - unsigned char grab_mods; /* grab mods minus internal mods */ - unsigned char compat_grab_mods; /* grab mods + group for core state, - but not locked groups if - IgnoreGroupLocks set */ - - /* effective mods = all mods (depressed, latched, locked) */ - unsigned char lookup_mods; /* effective mods minus internal mods */ - unsigned char compat_lookup_mods; /* effective mods + group */ - - unsigned short ptr_buttons; /* core pointer buttons */ -}; - -#define XkbStateFieldFromRec(s) XkbBuildCoreState((s)->lookup_mods,(s)->group) -#define XkbGrabStateFromRec(s) XkbBuildCoreState((s)->grab_mods,(s)->group) - -#define XkbNumGroups(g) ((g)&0x0f) -#define XkbOutOfRangeGroupInfo(g) ((g)&0xf0) -#define XkbOutOfRangeGroupAction(g) ((g)&0xc0) -#define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4) -#define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f)) - -_XFUNCPROTOBEGIN - -typedef uint32_t (*InternAtomFuncPtr)(const char *val); -typedef const char *(*GetAtomValueFuncPtr)(uint32_t atom); - -_X_EXPORT extern void -xkb_init_atoms(InternAtomFuncPtr intern, GetAtomValueFuncPtr get_atom_value); - -_X_EXPORT extern uint32_t -xkb_intern_atom(const char *name); - -_X_EXPORT extern struct xkb_desc * -xkb_compile_keymap_from_rules(const struct xkb_rule_names *rules); - -_X_EXPORT extern struct xkb_desc * -xkb_compile_keymap_from_components(const struct xkb_component_names * ktcsg); - -_X_EXPORT extern struct xkb_desc * -xkb_compile_keymap_from_file(FILE *inputFile, const char *mapName); - -_X_EXPORT extern struct xkb_desc * -xkb_compile_keymap_from_string(const char *string, const char *mapName); - -_X_EXPORT extern void -xkb_free_keymap(struct xkb_desc *xkb); - -_X_EXPORT extern struct xkb_component_list * -xkb_list_components(struct xkb_component_names * ptrns, int *maxMatch); - -/* - * Canonicalises component names by prepending the relevant component from - * 'old' to the one in 'names' when the latter has a leading '+' or '|', and - * by replacing a '%' with the relevant component, e.g.: - * - * names old output - * ------------------------------------------ - * +bar foo foo+bar - * |quux baz baz|quux - * foo+%|baz bar foo+bar|baz - * - * If a component in names needs to be modified, the existing value will be - * free()d, and a new one allocated with malloc(). - */ -_X_EXPORT extern void -xkb_canonicalise_components(struct xkb_component_names * names, - const struct xkb_component_names * old); - -/* - * Converts a keysym to a string; will return unknown Unicode codepoints - * as "Ua1b2", and other unknown keysyms as "0xabcd1234". - * - * This is uint32_t rather than KeySym, as KeySym changes size between - * client and server (no, really). - */ -_X_EXPORT extern void -xkb_keysym_to_string(uint32_t ks, char *buffer, size_t size); - -/* - * See xkb_keysym_to_string comments: this function will accept any string - * from that function. - */ -_X_EXPORT extern uint32_t -xkb_string_to_keysym(const char *s); - -_XFUNCPROTOEND - -#endif /* _XKBCOMMON_H_ */ diff -Nru libxkbcommon-0.1.0~1/makekeys/Makefile.am libxkbcommon-0.1.0~2/makekeys/Makefile.am --- libxkbcommon-0.1.0~1/makekeys/Makefile.am 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/makekeys/Makefile.am 2012-08-11 16:17:00.000000000 +0000 @@ -1,5 +1,10 @@ -AM_CFLAGS = $(X11_CFLAGS) $(CWARNFLAGS) +AM_CFLAGS = $(BASE_CFLAGS) -I$(top_srcdir) # need to use build-native compiler + CC = $(CC_FOR_BUILD) +CPPFLAGS = $(CPPFLAGS_FOR_BUILD) +CFLAGS = $(CFLAGS_FOR_BUILD) +LDFLAGS = $(LDFLAGS_FOR_BUILD) noinst_PROGRAMS = makekeys + diff -Nru libxkbcommon-0.1.0~1/makekeys/makekeys.c libxkbcommon-0.1.0~2/makekeys/makekeys.c --- libxkbcommon-0.1.0~1/makekeys/makekeys.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/makekeys/makekeys.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,235 +1,137 @@ /* + * + * Copyright 1990, 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. + * + */ + +/* + * Constructs hash tables for xkb_keysym_to_string and + * xkb_string_from_keysym. + */ -Copyright 1990, 1998 The Open Group +#include "xkbcommon/xkbcommon.h" -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. - -*/ - -/* Constructs hash tables for XStringToKeysym and XKeysymToString. */ - -#include -#include -#include +#include #include #include -#if defined(macII) && !defined(__STDC__) /* stdlib.h fails to define these */ -char *malloc(); -#endif /* macII */ +#include -typedef unsigned long Signature; +typedef uint32_t Signature; #define KTNUM 4000 static struct info { char *name; - KeySym val; + xkb_keysym_t val; } info[KTNUM]; #define MIN_REHASH 15 -#define MATCHES 10 +#define MATCHES 10 static char tab[KTNUM]; static unsigned short offsets[KTNUM]; static unsigned short indexes[KTNUM]; -static KeySym values[KTNUM]; -static char buf[1024]; - -/* - * XFree86 special action keys - for some reason, these have an - * underscore after the XF86 prefix. - */ -static const char *xf86_special_keys[] = { - "Switch_VT_1", - "Switch_VT_2", - "Switch_VT_3", - "Switch_VT_4", - "Switch_VT_5", - "Switch_VT_6", - "Switch_VT_7", - "Switch_VT_8", - "Switch_VT_9", - "Switch_VT_10", - "Switch_VT_11", - "Switch_VT_12", - "Ungrab", - "ClearGrab", - "Next_VMode", - "Prev_VMode", - NULL -}; +static xkb_keysym_t values[KTNUM]; +static int ksnum = 0; static int -is_xf86_special(const char *key) -{ - char **s = (char **)xf86_special_keys; - while (*s) { - if (strcmp(key, *s) == 0) - return 1; - s++; - } - return 0; -} - -static int -get_keysym(const char *buf, char *key, int index) -{ - if (sscanf(buf, "#define XK_%127s 0x%lx", key, &info[index].val) != 2) - return 0; - return 1; -} - -static int -get_keysym_alias(const char *buf, char *key, int index) +parse_line(const char *buf, char *key, xkb_keysym_t *val, char *prefix) { int i; char alias[128]; - if (sscanf(buf, "#define XK_%127s XK_%127s", key, alias) != 2) - return 0; - - for (i = index - 1; i >= 0; i--) { - if (strcmp(info[i].name, alias) == 0) { - info[index].val = info[i].val; - return 1; - } - } - - /* Didn't find a match */ - fprintf(stderr, "can't find matching definition %s for keysym %s\n", - alias, key); - return -1; -} - -static int -get_xf86_keysym(const char *buf, char *key, size_t len, int index) -{ - char tmp[128]; - - if (sscanf(buf, "#define XF86XK_%127s 0x%lx", tmp, &info[index].val) != 2) - return 0; - - /* Prepend XF86 or XF86_ to the key */ - snprintf(key, len, "XF86%s%s", is_xf86_special(tmp) ? "_" : "", tmp); - - return 1; -} - -static int -get_xf86_keysym_alias(const char *buf, char *key, size_t len, int index) -{ - int i; - char alias[128], ktmp[128], atmp[128]; - - /* Try to handle both XF86XK and XK aliases */ - if (sscanf(buf, "#define XF86XK_%127s XF86XK_%127s", ktmp, atmp) == 2) { - /* Prepend XF86 to the key and alias */ - snprintf(key, len, "XF86%s%s", is_xf86_special(ktmp) ? "_" : "", - ktmp); - snprintf(alias, sizeof(alias), "XF86%s%s", - is_xf86_special(atmp) ? "_" : "", atmp); - } else { - if (sscanf(buf, "#define XF86XK_%127s XK_%127s", ktmp, alias) != 2) - return 0; - /* Prepend XF86 to the key */ - snprintf(key, len, "XF86%s%s", is_xf86_special(ktmp) ? "_" : "", - ktmp); + /* See if we can catch a straight XK_foo 0x1234-style definition first; + * the trickery around tmp is to account for prefices. */ + i = sscanf(buf, "#define %127s 0x%" SCNx32, key, val); + if (i == 2 && strncmp(key, "XKB_KEY_", 8) == 0) { + prefix[0] = '\0'; + memmove(key, key + 8, strlen(key + 8) + 1); + return 1; } - for (i = index - 1; i >= 0; i--) { - if (strcmp(info[i].name, alias) == 0) { - info[index].val = info[i].val; - return 1; - } - } + i = sscanf(buf, "#define %127s %127s", key, alias); + if (i == 2) + fprintf(stderr, "can't parse keysym definition: %s", buf); - /* Didn't find a match */ - fprintf(stderr, "can't find matching definition %s for keysym %s\n", - alias, key); - return -1; + return 0; } int main(int argc, char *argv[]) { - int ksnum = 0; + FILE *fptr; int max_rehash; Signature sig; - register int i, j, k, z; - register char *name; - register char c; + int i, j, k, l, z; + char *name; + char c; int first; int best_max_rehash; int best_z = 0; int num_found; - KeySym val; - char key[128]; - - - while (fgets(buf, sizeof(buf), stdin)) { - int ret; + xkb_keysym_t val; + char key[128], prefix[128]; + char buf[1024]; + + for (l = 1; l < argc; l++) { + fptr = fopen(argv[l], "r"); + if (!fptr) { + fprintf(stderr, "couldn't open %s\n", argv[l]); + continue; + } - /* Manage keysyms from keysymdef.h */ - ret = get_keysym(buf, key, ksnum); - if (!ret) { - ret = get_keysym_alias(buf, key, ksnum); - if (ret == -1) + while (fgets(buf, sizeof(buf), fptr)) { + if (!parse_line(buf, key, &val, prefix)) continue; - } - /* Manage keysyms from XF86keysym.h */ - if (!ret) - ret = get_xf86_keysym(buf, key, sizeof(key), ksnum); - if (!ret) { - ret = get_xf86_keysym_alias(buf, key, sizeof(key), ksnum); - if (ret < 1) + if (val == XKB_KEY_VoidSymbol) + val = 0; + if (val > 0x1fffffff) { + fprintf(stderr, "ignoring illegal keysym (%s, %" PRIx32 ")\n", + key, + val); continue; - } + } - if (info[ksnum].val > 0x1fffffff) { - fprintf(stderr, - "ignoring illegal keysym (%s), remove it from .h file!\n", - key); - continue; - } - name = malloc((unsigned)strlen(key) + 1); - if (!name) { - fprintf(stderr, "makekeys: out of memory!\n"); - exit(1); - } - (void)strcpy(name, key); - info[ksnum].name = name; - ksnum++; - if (ksnum == KTNUM) { - fprintf(stderr, "makekeys: too many keysyms!\n"); - exit(1); + name = malloc(strlen(prefix) + strlen(key) + 1); + if (!name) { + fprintf(stderr, "makekeys: out of memory!\n"); + exit(1); + } + sprintf(name, "%s%s", prefix, key); + info[ksnum].name = name; + info[ksnum].val = val; + ksnum++; + if (ksnum == KTNUM) { + fprintf(stderr, "makekeys: too many keysyms!\n"); + exit(1); + } } - } - /* Special case NoSymbol. */ - info[ksnum].name = strdup("NoSymbol"); - info[ksnum].val = 0L; - ksnum++; + fclose(fptr); + } printf("/* This file is generated from keysymdef.h. */\n"); printf("/* Do not edit. */\n"); @@ -239,7 +141,7 @@ num_found = 0; for (z = ksnum; z < KTNUM; z++) { max_rehash = 0; - for (name = tab, i = z; --i >= 0;) + for (name = tab, i = z; --i >= 0; ) *name++ = 0; for (i = 0; i < ksnum; i++) { name = info[i].name; @@ -267,13 +169,18 @@ if (num_found >= MATCHES) break; } -next1: ; +next1:; } z = best_z; printf("#ifndef KS_TABLES_H\n"); printf("#define KS_TABLES_H\n\n"); printf("static const unsigned char _XkeyTable[] = {\n"); + if (z == 0) { + fprintf(stderr, "makekeys: failed to find small enough hash!\n" + "Try increasing KTNUM in makekeys.c\n"); + exit(1); + } printf("0,\n"); k = 1; for (i = 0; i < ksnum; i++) { @@ -290,13 +197,13 @@ offsets[j] = k; indexes[i] = k; val = info[i].val; - printf("0x%.2lx, 0x%.2lx, 0x%.2lx, 0x%.2lx, 0x%.2lx, 0x%.2lx, ", - (sig >> 8) & 0xff, sig & 0xff, - (val >> 24) & 0xff, (val >> 16) & 0xff, - (val >> 8) & 0xff, val & 0xff); + printf("0x%.2" PRIx32 ", 0x%.2" PRIx32 ", 0x%.2" PRIx32 ", " + "0x%.2" PRIx32 ", 0x%.2" PRIx32 ", 0x%.2" PRIx32 ", ", + (sig >> 8) & 0xff, sig & 0xff, (val >> 24) & 0xff, + (val >> 16) & 0xff, (val >> 8) & 0xff, val & 0xff); for (name = info[i].name, k += 7; (c = *name++); k++) printf("'%c',", c); - printf((i == (ksnum-1)) ? "0\n" : "0,\n"); + printf((i == (ksnum - 1)) ? "0\n" : "0,\n"); } printf("};\n"); printf("\n"); @@ -304,7 +211,7 @@ printf("#define KMAXHASH %d\n", best_max_rehash + 1); printf("\n"); printf("static const unsigned short hashString[KTABLESIZE] = {\n"); - for (i = 0; i < z;) { + for (i = 0; i < z; ) { printf("0x%.4x", offsets[i]); i++; if (i == z) @@ -318,7 +225,7 @@ num_found = 0; for (z = ksnum; z < KTNUM; z++) { max_rehash = 0; - for (name = tab, i = z; --i >= 0;) + for (name = tab, i = z; --i >= 0; ) *name++ = 0; for (i = 0; i < ksnum; i++) { val = info[i].val; @@ -336,7 +243,7 @@ values[j] = val; if (k > max_rehash) max_rehash = k; -skip1: ; +skip1:; } if (max_rehash < MIN_REHASH) { if (max_rehash < best_max_rehash) { @@ -347,11 +254,16 @@ if (num_found >= MATCHES) break; } -next2: ; +next2:; } z = best_z; - for (i = z; --i >= 0;) + if (z == 0) { + fprintf(stderr, "makekeys: failed to find small enough hash!\n" + "Try increasing KTNUM in makekeys.c\n"); + exit(1); + } + for (i = z; --i >= 0; ) offsets[i] = 0; for (i = 0; i < ksnum; i++) { val = info[i].val; @@ -365,14 +277,14 @@ } offsets[j] = indexes[i] + 2; values[j] = val; -skip2: ; +skip2:; } printf("\n"); printf("#define VTABLESIZE %d\n", z); printf("#define VMAXHASH %d\n", best_max_rehash + 1); printf("\n"); printf("static const unsigned short hashKeysym[VTABLESIZE] = {\n"); - for (i = 0; i < z;) { + for (i = 0; i < z; ) { printf("0x%.4x", offsets[i]); i++; if (i == z) @@ -383,5 +295,8 @@ printf("};\n"); printf("\n#endif /* KS_TABLES_H */\n"); + for (i = 0; i < ksnum; i++) + free(info[i].name); + exit(0); } diff -Nru libxkbcommon-0.1.0~1/src/Makefile.am libxkbcommon-0.1.0~2/src/Makefile.am --- libxkbcommon-0.1.0~1/src/Makefile.am 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -SUBDIRS = xkbcomp - -AM_CPPFLAGS = -I$(top_srcdir)/include -AM_CFLAGS = $(X11_CFLAGS) $(CWARNFLAGS) $(XMALLOC_ZERO_CFLAGS) - -lib_LTLIBRARIES = libxkbcommon.la -libxkbcommon_la_LIBADD = xkbcomp/libxkbcomp.la -libxkbcommon_la_LDFLAGS = -no-undefined -libxkbcommon_la_SOURCES = \ - XKBcommonint.h \ - alloc.c \ - atom.c \ - galloc.c \ - geom.c \ - keysym.c \ - malloc.c \ - maprules.c \ - misc.c \ - text.c \ - xkb.c \ - xkballoc.h \ - xkbgeom.h \ - xkbmisc.h \ - xkbrules.h - -BUILT_SOURCES = ks_tables.h -CLEANFILES = $(BUILT_SOURCES) - -ks_tables.h: $(top_builddir)/makekeys/makekeys$(EXEEXT) $(KEYSYMDEF_H) $(XF86KEYSYM_H) - $(AM_V_GEN)cat $(KEYSYMDEF_H) $(XF86KEYSYM_H) | $(top_builddir)/makekeys/makekeys$(EXEEXT) > $@ diff -Nru libxkbcommon-0.1.0~1/src/XKBcommonint.h libxkbcommon-0.1.0~2/src/XKBcommonint.h --- libxkbcommon-0.1.0~1/src/XKBcommonint.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/XKBcommonint.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -/* -Copyright 2008 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 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. -*/ - -#ifndef _XKBCOMMONINT_H_ -#define _XKBCOMMONINT_H_ - -#include -#include - -#ifndef True -#define True 1 -#define False 0 -#endif - -#define _XkbTypedAlloc(t) ((t *)malloc(sizeof(t))) -#define _XkbTypedCalloc(n,t) ((t *)calloc((n),sizeof(t))) -#define _XkbTypedRealloc(o,n,t) \ - ((o)?(t *)realloc((o),(n)*sizeof(t)):_XkbTypedCalloc(n,t)) -#define _XkbClearElems(a,f,l,t) bzero(&(a)[f],((l)-(f)+1)*sizeof(t)) - -#define _XkbDupString(s) ((s) ? strdup(s) : NULL) -#define _XkbStrCaseCmp strcasecmp - -/* From XKM.h */ -#define XkmFileVersion 15 - -#define XkmIllegalFile -1 -#define XkmSemanticsFile 20 -#define XkmLayoutFile 21 -#define XkmKeymapFile 22 -#define XkmGeometryFile 23 -#define XkmRulesFile 24 - -#define XkmTypesIndex 0 -#define XkmCompatMapIndex 1 -#define XkmSymbolsIndex 2 -#define XkmIndicatorsIndex 3 -#define XkmKeyNamesIndex 4 -#define XkmGeometryIndex 5 -#define XkmVirtualModsIndex 6 -#define XkmLastIndex XkmVirtualModsIndex - -#define XkmTypesMask (1<<0) -#define XkmCompatMapMask (1<<1) -#define XkmSymbolsMask (1<<2) -#define XkmIndicatorsMask (1<<3) -#define XkmKeyNamesMask (1<<4) -#define XkmGeometryMask (1<<5) -#define XkmVirtualModsMask (1<<6) -#define XkmLegalIndexMask (0x7f) -#define XkmAllIndicesMask (0x7f) - -#define XkmSemanticsRequired (XkmCompatMapMask) -#define XkmSemanticsOptional (XkmTypesMask|XkmVirtualModsMask|XkmIndicatorsMask) -#define XkmSemanticsLegal (XkmSemanticsRequired|XkmSemanticsOptional) -#define XkmLayoutRequired (XkmKeyNamesMask|XkmSymbolsMask|XkmTypesMask) -#define XkmLayoutOptional (XkmVirtualModsMask|XkmGeometryMask) -#define XkmLayoutLegal (XkmLayoutRequired|XkmLayoutOptional) -#define XkmKeymapRequired (XkmSemanticsRequired|XkmLayoutRequired) -#define XkmKeymapOptional ((XkmSemanticsOptional|XkmLayoutOptional)&(~XkmKeymapRequired)) -#define XkmKeymapLegal (XkmKeymapRequired|XkmKeymapOptional) - -#define XkmLegalSection(m) (((m)&(~XkmKeymapLegal))==0) -#define XkmSingleSection(m) (XkmLegalSection(m)&&(((m)&(~(m)+1))==(m))) - -#endif /* _XKBCOMMONINT_H_ */ diff -Nru libxkbcommon-0.1.0~1/src/alloc.c libxkbcommon-0.1.0~2/src/alloc.c --- libxkbcommon-0.1.0~1/src/alloc.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/alloc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,342 +0,0 @@ -/* -Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - -Permission to use, copy, modify, and distribute this -software and its documentation for any purpose and without -fee is hereby granted, provided that the above copyright -notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting -documentation, and that the name of Silicon Graphics not be -used in advertising or publicity pertaining to distribution -of the software without specific prior written permission. -Silicon Graphics makes no representation about the suitability -of this software for any purpose. It is provided "as is" -without any express or implied warranty. - -SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON -GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH -THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include "xkballoc.h" -#include "xkbgeom.h" -#include "X11/extensions/XKBcommon.h" -#include "XKBcommonint.h" -#include - -int -XkbcAllocCompatMap(struct xkb_desc * xkb, unsigned which, unsigned nSI) -{ - struct xkb_compat_map * compat; - struct xkb_sym_interpret *prev_interpret; - - if (!xkb) - return BadMatch; - - if (xkb->compat) { - if (xkb->compat->size_si >= nSI) - return Success; - - compat = xkb->compat; - compat->size_si = nSI; - if (!compat->sym_interpret) - compat->num_si = 0; - - prev_interpret = compat->sym_interpret; - compat->sym_interpret = _XkbTypedRealloc(compat->sym_interpret, - nSI, struct xkb_sym_interpret); - if (!compat->sym_interpret) { - free(prev_interpret); - compat->size_si = compat->num_si = 0; - return BadAlloc; - } - - if (compat->num_si != 0) - _XkbClearElems(compat->sym_interpret, compat->num_si, - compat->size_si - 1, struct xkb_sym_interpret); - - return Success; - } - - compat = _XkbTypedCalloc(1, struct xkb_compat_map); - if (!compat) - return BadAlloc; - - if (nSI > 0) { - compat->sym_interpret = _XkbTypedCalloc(nSI, struct xkb_sym_interpret); - if (!compat->sym_interpret) { - free(compat); - return BadAlloc; - } - } - compat->size_si = nSI; - compat->num_si = 0; - bzero(&compat->groups[0], XkbNumKbdGroups * sizeof(struct xkb_mods)); - xkb->compat = compat; - - return Success; -} - - -static void -XkbcFreeCompatMap(struct xkb_desc * xkb, unsigned which, Bool freeMap) -{ - struct xkb_compat_map * compat; - - if (!xkb || !xkb->compat) - return; - - compat = xkb->compat; - if (freeMap) - which = XkbAllCompatMask; - - if (which & XkbGroupCompatMask) - bzero(&compat->groups[0], XkbNumKbdGroups * sizeof(struct xkb_mods)); - - if (which & XkbSymInterpMask) { - if (compat->sym_interpret && (compat->size_si > 0)) - free(compat->sym_interpret); - compat->size_si = compat->num_si = 0; - compat->sym_interpret = NULL; - } - - if (freeMap) { - free(compat); - xkb->compat = NULL; - } -} - -int -XkbcAllocNames(struct xkb_desc * xkb, unsigned which, int nTotalRG, int nTotalAliases) -{ - struct xkb_names * names; - - if (!xkb) - return BadMatch; - - if (!xkb->names) { - xkb->names = _XkbTypedCalloc(1, struct xkb_names); - if (!xkb->names) - return BadAlloc; - } - names = xkb->names; - - if ((which & XkbKTLevelNamesMask) && xkb->map && xkb->map->types) { - int i; - struct xkb_key_type * type; - - type = xkb->map->types; - for (i = 0; i < xkb->map->num_types; i++, type++) { - if (!type->level_names) { - type->level_names = _XkbTypedCalloc(type->num_levels, uint32_t); - if (!type->level_names) - return BadAlloc; - } - } - } - - if ((which & XkbKeyNamesMask) && !names->keys) { - if ((!XkbIsLegalKeycode(xkb->min_key_code)) || - (!XkbIsLegalKeycode(xkb->max_key_code)) || - (xkb->max_key_code < xkb->min_key_code)) - return BadValue; - - names->keys = _XkbTypedCalloc(xkb->max_key_code + 1, struct xkb_key_name); - if (!names->keys) - return BadAlloc; - } - - if ((which & XkbKeyAliasesMask) && (nTotalAliases > 0)) { - if (!names->key_aliases) - names->key_aliases = _XkbTypedCalloc(nTotalAliases, - struct xkb_key_alias); - else if (nTotalAliases > names->num_key_aliases) { - struct xkb_key_alias *prev_aliases = names->key_aliases; - - names->key_aliases = _XkbTypedRealloc(names->key_aliases, - nTotalAliases, - struct xkb_key_alias); - if (names->key_aliases) - _XkbClearElems(names->key_aliases, names->num_key_aliases, - nTotalAliases - 1, struct xkb_key_alias); - else - free(prev_aliases); - } - - if (!names->key_aliases) { - names->num_key_aliases = 0; - return BadAlloc; - } - - names->num_key_aliases = nTotalAliases; - } - - if ((which & XkbRGNamesMask) && (nTotalRG > 0)) { - if (!names->radio_groups) - names->radio_groups = _XkbTypedCalloc(nTotalRG, uint32_t); - else if (nTotalRG > names->num_rg) { - uint32_t *prev_radio_groups = names->radio_groups; - - names->radio_groups = _XkbTypedRealloc(names->radio_groups, - nTotalRG, uint32_t); - if (names->radio_groups) - _XkbClearElems(names->radio_groups, names->num_rg, - nTotalRG - 1, uint32_t); - else - free(prev_radio_groups); - } - - if (!names->radio_groups) - return BadAlloc; - - names->num_rg = nTotalRG; - } - - return Success; -} - -static void -XkbcFreeNames(struct xkb_desc * xkb, unsigned which, Bool freeMap) -{ - struct xkb_names * names; - - if (!xkb || !xkb->names) - return; - - names = xkb->names; - if (freeMap) - which = XkbAllNamesMask; - - if (which & XkbKTLevelNamesMask) { - struct xkb_client_map * map = xkb->map; - - if (map && map->types) { - int i; - struct xkb_key_type * type = map->types; - - for (i = 0; i < map->num_types; i++, type++) { - if (type->level_names) { - free(type->level_names); - type->level_names = NULL; - } - } - } - } - - if ((which & XkbKeyNamesMask) && names->keys) { - free(names->keys); - names->keys = NULL; - names->num_keys = 0; - } - - if ((which & XkbKeyAliasesMask) && names->key_aliases) { - free(names->key_aliases); - names->key_aliases = NULL; - names->num_key_aliases = 0; - } - - if ((which & XkbRGNamesMask) && names->radio_groups) { - free(names->radio_groups); - names->radio_groups = NULL; - names->num_rg = 0; - } - - if (freeMap) { - free(names); - xkb->names = NULL; - } -} - -int -XkbcAllocControls(struct xkb_desc * xkb, unsigned which) -{ - if (!xkb) - return BadMatch; - - if (!xkb->ctrls) { - xkb->ctrls = _XkbTypedCalloc(1, struct xkb_controls); - if (!xkb->ctrls) - return BadAlloc; - } - - return Success; -} - -static void -XkbcFreeControls(struct xkb_desc * xkb, unsigned which, Bool freeMap) -{ - if (freeMap && xkb && xkb->ctrls) { - free(xkb->ctrls); - xkb->ctrls = NULL; - } -} - -int -XkbcAllocIndicatorMaps(struct xkb_desc * xkb) -{ - if (!xkb) - return BadMatch; - - if (!xkb->indicators) { - xkb->indicators = _XkbTypedCalloc(1, struct xkb_indicator); - if (!xkb->indicators) - return BadAlloc; - } - - return Success; -} - -static void -XkbcFreeIndicatorMaps(struct xkb_desc * xkb) -{ - if (xkb && xkb->indicators) { - free(xkb->indicators); - xkb->indicators = NULL; - } -} - -struct xkb_desc * -XkbcAllocKeyboard(void) -{ - struct xkb_desc *xkb; - - xkb = _XkbTypedCalloc(1, struct xkb_desc); - if (xkb) - xkb->device_spec = XkbUseCoreKbd; - return xkb; -} - -void -XkbcFreeKeyboard(struct xkb_desc * xkb, unsigned which, Bool freeAll) -{ - if (!xkb) - return; - - if (freeAll) - which = XkbAllComponentsMask; - - if (which & XkbClientMapMask) - XkbcFreeClientMap(xkb, XkbAllClientInfoMask, True); - if (which & XkbServerMapMask) - XkbcFreeServerMap(xkb, XkbAllServerInfoMask, True); - if (which & XkbCompatMapMask) - XkbcFreeCompatMap(xkb, XkbAllCompatMask, True); - if (which & XkbIndicatorMapMask) - XkbcFreeIndicatorMaps(xkb); - if (which & XkbNamesMask) - XkbcFreeNames(xkb, XkbAllNamesMask, True); - if ((which & XkbGeometryMask) && xkb->geom) - XkbcFreeGeometry(xkb->geom, XkbGeomAllMask, True); - if (which & XkbControlsMask) - XkbcFreeControls(xkb, XkbAllControlsMask, True); - if (freeAll) - free(xkb); -} diff -Nru libxkbcommon-0.1.0~1/src/atom.c libxkbcommon-0.1.0~2/src/atom.c --- libxkbcommon-0.1.0~1/src/atom.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/atom.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,218 +1,212 @@ /*********************************************************** -Copyright 1987, 1998 The Open Group + * 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. + * + ******************************************************************/ -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 "atom.h" -/************************************************************ - Copyright 1994 by Silicon Graphics Computer Systems, Inc. +struct atom_node { + struct atom_node *left, *right; + uint32_t a; + unsigned int fingerprint; + char *string; +}; + +struct atom_table { + struct atom_node *root; + darray(struct atom_node *) table; +}; - 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. +struct atom_table * +atom_table_new(void) +{ + struct atom_table *table; - ********************************************************/ + table = calloc(1, sizeof(*table)); + if (!table) + return NULL; -#ifdef HAVE_CONFIG_H -#include -#endif -#include "xkbmisc.h" -#include "X11/extensions/XKBcommon.h" -#include "XKBcommonint.h" - -#define InitialTableSize 100 - -typedef struct _Node { - struct _Node *left, *right; - uint32_t a; - unsigned int fingerPrint; - char *string; -} NodeRec, *NodePtr; - -#define BAD_RESOURCE 0xe0000000 - -static uint32_t lastAtom = None; -static NodePtr atomRoot = NULL; -static unsigned long tableLength; -static NodePtr *nodeTable = NULL; -static InternAtomFuncPtr do_intern_atom = NULL; -static GetAtomValueFuncPtr do_get_atom_value = NULL; + darray_init(table->table); + darray_growalloc(table->table, 100); + darray_append(table->table, NULL); -void -xkb_init_atoms(InternAtomFuncPtr intern, GetAtomValueFuncPtr get_atom_value) + return table; +} + +static void +free_atom(struct atom_node *patom) { - if (intern && get_atom_value) { - if (do_intern_atom && do_get_atom_value) - return; - do_intern_atom = intern; - do_get_atom_value = get_atom_value; + if (!patom) return; - } + + free_atom(patom->left); + free_atom(patom->right); + free(patom->string); + free(patom); } -const char * -XkbcAtomText(uint32_t atom) +void +atom_table_free(struct atom_table *table) { - NodePtr node; + if (!table) + return; - if (do_get_atom_value) - return do_get_atom_value(atom); + free_atom(table->root); + darray_free(table->table); + free(table); +} - if ((atom == None) || (atom > lastAtom)) - return NULL; - if (!(node = nodeTable[atom])) +const char * +atom_text(struct atom_table *table, xkb_atom_t atom) +{ + if (atom >= darray_size(table->table) || + darray_item(table->table, atom) == NULL) return NULL; - return node->string; + + return darray_item(table->table, atom)->string; } char * -XkbcAtomGetString(uint32_t atom) +atom_strdup(struct atom_table *table, xkb_atom_t atom) { - const char *ret = XkbcAtomText(atom); - return ret ? strdup(ret) : NULL; + return strdup_safe(atom_text(table, atom)); } -uint32_t -xkb_intern_atom(const char *string) +/* + * If steal is true, we do not strdup @string; therefore it must be + * dynamically allocated, not be free'd by the caller and not be used + * afterwards. Use to avoid some redundant allocations. + */ +xkb_atom_t +atom_intern(struct atom_table *table, const char *string, + bool steal) { - NodePtr *np; + struct atom_node **np; + struct atom_node *nd; unsigned i; int comp; unsigned int fp = 0; - unsigned len; - int makeit = True; + size_t len; if (!string) - return None; - if (do_intern_atom) - return do_intern_atom(string); + return XKB_ATOM_NONE; len = strlen(string); - np = &atomRoot; + np = &table->root; for (i = 0; i < (len + 1) / 2; i++) { fp = fp * 27 + string[i]; fp = fp * 27 + string[len - 1 - i]; } while (*np) { - if (fp < (*np)->fingerPrint) + if (fp < (*np)->fingerprint) np = &((*np)->left); - else if (fp > (*np)->fingerPrint) + else if (fp > (*np)->fingerprint) np = &((*np)->right); else { /* now start testing the strings */ - comp = strncmp(string, (*np)->string, (int)len); - if ((comp < 0) || ((comp == 0) && (len < strlen((*np)->string)))) + comp = strncmp(string, (*np)->string, len); + if (comp < 0 || (comp == 0 && len < strlen((*np)->string))) { np = &((*np)->left); - else if (comp > 0) + } + else if (comp > 0) { np = &((*np)->right); - else - return(*np)->a; } + else { + if (steal) + free(UNCONSTIFY(string)); + return (*np)->a; + } + } } - if (makeit) { - NodePtr nd; - - nd = (NodePtr)malloc(sizeof(NodeRec)); - if (!nd) - return BAD_RESOURCE; + nd = malloc(sizeof(*nd)); + if (!nd) + return XKB_ATOM_NONE; - nd->string = (char *)malloc(len + 1); + if (steal) { + nd->string = UNCONSTIFY(string); + } + else { + nd->string = strdup(string); if (!nd->string) { free(nd); - return BAD_RESOURCE; - } - strncpy(nd->string, string, (int)len); - nd->string[len] = 0; - - if ((lastAtom + 1) >= tableLength) { - NodePtr *table; - int newLength; - - if (tableLength == 0) - newLength = InitialTableSize; - else - newLength = tableLength * 2; - - table = realloc(nodeTable, newLength * sizeof(NodePtr)); - if (!table) { - if (nd->string != string) - free(nd->string); - free(nd); - return BAD_RESOURCE; - } - tableLength = newLength; - table[None] = NULL; - - nodeTable = table; + return XKB_ATOM_NONE; } + } - *np = nd; - nd->left = nd->right = NULL; - nd->fingerPrint = fp; - nd->a = (++lastAtom); - *(nodeTable + lastAtom) = nd; + *np = nd; + nd->left = nd->right = NULL; + nd->fingerprint = fp; + nd->a = darray_size(table->table); + darray_append(table->table, nd); - return nd->a; - } - else - return None; + return nd->a; } diff -Nru libxkbcommon-0.1.0~1/src/atom.h libxkbcommon-0.1.0~2/src/atom.h --- libxkbcommon-0.1.0~1/src/atom.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/atom.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,50 @@ +/* + * 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 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. + */ + +#ifndef ATOM_H +#define ATOM_H + +#include "xkb-priv.h" + +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, + bool steal); + +char * +atom_strdup(struct atom_table *table, xkb_atom_t atom); + +const char * +atom_text(struct atom_table *table, xkb_atom_t atom); + +#endif /* ATOM_H */ diff -Nru libxkbcommon-0.1.0~1/src/context.c libxkbcommon-0.1.0~2/src/context.c --- libxkbcommon-0.1.0~1/src/context.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/context.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,363 @@ +/* + * 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 +#include +#include +#include +#include +#include +#include + +#include "xkb-priv.h" +#include "atom.h" + +/** + * Append one directory to the context's include path. + */ +XKB_EXPORT int +xkb_context_include_path_append(struct xkb_context *ctx, const char *path) +{ + struct stat stat_buf; + int err; + char *tmp; + + tmp = strdup(path); + if (!tmp) + goto err; + + err = stat(path, &stat_buf); + if (err != 0) + goto err; + if (!S_ISDIR(stat_buf.st_mode)) + goto err; + +#if defined(HAVE_EACCESS) + if (eaccess(path, R_OK | X_OK) != 0) + goto err; +#elif defined(HAVE_EUIDACCESS) + if (euidaccess(path, R_OK | X_OK) != 0) + goto err; +#endif + + darray_append(ctx->includes, tmp); + return 1; + +err: + darray_append(ctx->failed_includes, tmp); + return 0; +} + +/** + * Append the default include directories to the context. + */ +XKB_EXPORT int +xkb_context_include_path_append_default(struct xkb_context *ctx) +{ + const char *home; + char *user_path; + int err; + int ret = 0; + + ret |= xkb_context_include_path_append(ctx, DFLT_XKB_CONFIG_ROOT); + + home = getenv("HOME"); + if (!home) + return ret; + err = asprintf(&user_path, "%s/.xkb", home); + if (err <= 0) + return ret; + ret |= xkb_context_include_path_append(ctx, user_path); + free(user_path); + + return ret; +} + +/** + * Remove all entries in the context's include path. + */ +XKB_EXPORT void +xkb_context_include_path_clear(struct xkb_context *ctx) +{ + char **path; + + darray_foreach(path, ctx->includes) + free(*path); + darray_free(ctx->includes); + + darray_foreach(path, ctx->failed_includes) + free(*path); + darray_free(ctx->failed_includes); +} + +/** + * xkb_context_include_path_clear() + xkb_context_include_path_append_default() + */ +XKB_EXPORT int +xkb_context_include_path_reset_defaults(struct xkb_context *ctx) +{ + xkb_context_include_path_clear(ctx); + return xkb_context_include_path_append_default(ctx); +} + +/** + * Returns the number of entries in the context's include path. + */ +XKB_EXPORT unsigned int +xkb_context_num_include_paths(struct xkb_context *ctx) +{ + return darray_size(ctx->includes); +} + +/** + * Returns the given entry in the context's include path, or NULL if an + * invalid index is passed. + */ +XKB_EXPORT const char * +xkb_context_include_path_get(struct xkb_context *ctx, unsigned int idx) +{ + if (idx >= xkb_context_num_include_paths(ctx)) + return NULL; + + return darray_item(ctx->includes, idx); +} + +unsigned +xkb_context_take_file_id(struct xkb_context *ctx) +{ + return ctx->file_id++; +} + +/** + * 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->refcnt > 0) + return; + + xkb_context_include_path_clear(ctx); + atom_table_free(ctx->atom_table); + free(ctx); +} + +static const char * +priority_to_prefix(int priority) +{ + switch (priority) { + case XKB_LOG_LEVEL_DEBUG: + return "Debug:"; + case XKB_LOG_LEVEL_INFO: + return "Info:"; + case XKB_LOG_LEVEL_WARNING: + return "Warning:"; + case XKB_LOG_LEVEL_ERROR: + return "Error:"; + case XKB_LOG_LEVEL_CRITICAL: + return "Internal error (critical):"; + default: + return NULL; + } +} + +ATTR_PRINTF(3, 0) static void +default_log_fn(struct xkb_context *ctx, int priority, + const char *fmt, va_list args) +{ + const char *prefix = priority_to_prefix(priority); + + if (prefix) + fprintf(stderr, "%-15s", prefix); + vfprintf(stderr, fmt, args); +} + +static int +log_priority(const char *priority) { + char *endptr; + int prio; + + errno = 0; + prio = strtol(priority, &endptr, 10); + if (errno == 0 && (endptr[0] == '\0' || isspace(endptr[0]))) + return prio; + if (strncasecmp(priority, "err", 3) == 0) + return XKB_LOG_LEVEL_ERROR; + if (strncasecmp(priority, "warn", 4) == 0) + return XKB_LOG_LEVEL_WARNING; + if (strncasecmp(priority, "info", 4) == 0) + return XKB_LOG_LEVEL_INFO; + if (strncasecmp(priority, "debug", 5) == 0) + 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_priority = XKB_LOG_LEVEL_ERROR; + ctx->log_verbosity = 0; + + /* Environment overwrites defaults. */ + env = getenv("XKB_LOG"); + if (env) + xkb_set_log_priority(ctx, log_priority(env)); + + env = getenv("XKB_VERBOSITY"); + if (env) + xkb_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->atom_table = atom_table_new(); + if (!ctx->atom_table) { + xkb_context_unref(ctx); + return NULL; + } + + return ctx; +} + +xkb_atom_t +xkb_atom_intern(struct xkb_context *ctx, const char *string) +{ + return atom_intern(ctx->atom_table, string, false); +} + +xkb_atom_t +xkb_atom_steal(struct xkb_context *ctx, char *string) +{ + return atom_intern(ctx->atom_table, string, true); +} + +char * +xkb_atom_strdup(struct xkb_context *ctx, xkb_atom_t atom) +{ + return atom_strdup(ctx->atom_table, atom); +} + +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, int priority, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + ctx->log_fn(ctx, priority, fmt, args); + va_end(args); +} + +XKB_EXPORT void +xkb_set_log_fn(struct xkb_context *ctx, + void (*log_fn)(struct xkb_context *ctx, int priority, + const char *fmt, va_list args)) +{ + ctx->log_fn = (log_fn ? log_fn : default_log_fn); +} + +XKB_EXPORT enum xkb_log_level +xkb_get_log_priority(struct xkb_context *ctx) +{ + return ctx->log_priority; +} + +XKB_EXPORT void +xkb_set_log_priority(struct xkb_context *ctx, enum xkb_log_level priority) +{ + ctx->log_priority = priority; +} + +XKB_EXPORT int +xkb_get_log_verbosity(struct xkb_context *ctx) +{ + return ctx->log_verbosity; +} + +XKB_EXPORT void +xkb_set_log_verbosity(struct xkb_context *ctx, int verbosity) +{ + ctx->log_verbosity = verbosity; +} + +XKB_EXPORT void * +xkb_get_user_data(struct xkb_context *ctx) +{ + if (ctx) + return ctx->user_data; + return NULL; +} + +XKB_EXPORT void +xkb_set_user_data(struct xkb_context *ctx, void *user_data) +{ + ctx->user_data = user_data; +} diff -Nru libxkbcommon-0.1.0~1/src/darray.h libxkbcommon-0.1.0~2/src/darray.h --- libxkbcommon-0.1.0~1/src/darray.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/darray.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,383 @@ +/* + * 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 + +#include +#include + +/* + * SYNOPSIS + * + * Life cycle of a darray (dynamically-allocated array): + * + * darray(int) a = darray_new(); + * darray_free(a); + * + * struct {darray(int) a;} foo; + * darray_init(foo.a); + * darray_free(foo.a); + * + * Typedefs for darrays of common types: + * + * darray_char, darray_schar, darray_uchar + * darray_short, darray_int, darray_long + * darray_ushort, darray_uint, darray_ulong + * + * Access: + * + * T darray_item(darray(T) arr, size_t index); + * size_t darray_size(darray(T) arr); + * size_t darray_alloc(darray(T) arr); + * bool darray_empty(darray(T) arr); + * + * // Access raw memory, starting from the item in offset. + * // Not safe, be careful, etc. + * T* darray_mem(darray(T) arr, size_t offset); + * + * Insertion (single item): + * + * void darray_append(darray(T) arr, T item); + * void darray_prepend(darray(T) arr, T item); + * void darray_push(darray(T) arr, T item); // same as darray_append + * + * Insertion (multiple items): + * + * void darray_append_items(darray(T) arr, T *items, size_t count); + * void darray_prepend_items(darray(T) arr, T *items, size_t count); + * + * void darray_appends(darray(T) arr, [T item, [...]]); + * void darray_prepends(darray(T) arr, [T item, [...]]); + * + * Removal: + * + * T darray_pop(darray(T) arr | darray_size(arr) != 0); + * T* darray_pop_check(darray(T*) arr); + * + * Replacement: + * + * void darray_from_items(darray(T) arr, T *items, size_t count); + * void darray_from_c(darray(T) arr, T c_array[N]); + * + * String buffer: + * + * void darray_append_string(darray(char) arr, const char *str); + * void darray_append_lit(darray(char) arr, char stringLiteral[N+1]); + * + * void darray_prepend_string(darray(char) arr, const char *str); + * void darray_prepend_lit(darray(char) arr, char stringLiteral[N+1]); + * + * void darray_from_string(darray(T) arr, const char *str); + * void darray_from_lit(darray(char) arr, char stringLiteral[N+1]); + * + * Size management: + * + * void darray_resize(darray(T) arr, size_t newSize); + * void darray_resize0(darray(T) arr, size_t newSize); + * + * void darray_realloc(darray(T) arr, size_t newAlloc); + * void darray_growalloc(darray(T) arr, size_t newAlloc); + * + * Traversal: + * + * darray_foreach(T *&i, darray(T) arr) {...} + * darray_foreach_reverse(T *&i, darray(T) arr) {...} + * + * Except for darray_foreach and darray_foreach_reverse, + * all macros evaluate their non-darray arguments only once. + */ + +/*** Life cycle ***/ + +#define darray(type) struct { type *item; size_t size; size_t 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) + +/* + * 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_alloc(arr) ((arr).alloc) +#define darray_empty(arr) ((arr).size == 0) + +#define darray_mem(arr, offset) ((arr).item + (offset)) +#define darray_same(arr1, arr2) ((arr1).item == (arr2).item) + +/*** Insertion (single item) ***/ + +#define darray_append(arr, ...) do { \ + darray_resize(arr, (arr).size + 1); \ + (arr).item[(arr).size - 1] = (__VA_ARGS__); \ +} while (0) + +#define darray_prepend(arr, ...) do { \ + darray_resize(arr, (arr).size + 1); \ + memmove((arr).item + 1, (arr).item, \ + ((arr).size - 1) * sizeof(*(arr).item)); \ + (arr).item[0] = (__VA_ARGS__); \ +} while (0) + +#define darray_push(arr, ...) darray_append(arr, __VA_ARGS__) + +/*** Insertion (multiple items) ***/ + +#define darray_append_items(arr, items, count) do { \ + size_t __count = (count), __oldSize = (arr).size; \ + darray_resize(arr, __oldSize + __count); \ + memcpy((arr).item + __oldSize, items, __count * sizeof(*(arr).item)); \ +} while (0) + +#define darray_prepend_items(arr, items, count) do { \ + size_t __count = (count), __oldSize = (arr).size; \ + darray_resize(arr, __count + __oldSize); \ + memmove((arr).item + __count, (arr).item, \ + __oldSize * sizeof(*(arr).item)); \ + memcpy((arr).item, items, __count * sizeof(*(arr).item)); \ +} while (0) + +#define darray_append_items_nullterminate(arr, items, count) do { \ + size_t __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_prepend_items_nullterminate(arr, items, count) do { \ + size_t __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) + +#define darray_appends_t(arr, type, ...) do { \ + type __src[] = { __VA_ARGS__ }; \ + darray_append_items(arr, __src, sizeof(__src) / sizeof(*__src)); \ +} while (0) + +#define darray_prepends_t(arr, type, ...) do { \ + type __src[] = { __VA_ARGS__ }; \ + darray_prepend_items(arr, __src, sizeof(__src) / sizeof(*__src)); \ +} while (0) + +#define darray_appends(arr, ...) \ + darray_appends_t(arr, typeof((*(arr).item)), __VA_ARGS__) + +#define darray_prepends(arr, ...) \ + darray_prepends_t(arr, typeof((*(arr).item)), __VA_ARGS__) + +/*** Removal ***/ + +/* Warning: Do not call darray_pop on an empty darray. */ +#define darray_pop(arr) ((arr).item[--(arr).size]) +#define darray_pop_check(arr) ((arr).size ? darray_pop(arr) : NULL) + +/*** Replacement ***/ + +#define darray_from_items(arr, items, count) do { \ + size_t __count = (count); \ + darray_resize(arr, __count); \ + memcpy((arr).item, items, __count * sizeof(*(arr).item)); \ +} while (0) + +#define darray_from_c(arr, c_array) \ + darray_from_items(arr, c_array, sizeof(c_array) / sizeof(*(c_array))) + +#define darray_copy(arr_to, arr_from) \ + darray_from_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_prepend_string(arr, str) do { \ + const char *__str = (str); \ + darray_prepend_items_nullterminate(arr, __str, strlen(__str)); \ +} while (0) + +#define darray_prepend_lit(arr, stringLiteral) \ + darray_prepend_items_nullterminate(arr, stringLiteral, \ + sizeof(stringLiteral) - 1) + +#define darray_from_string(arr, str) do { \ + const char *__str = (str); \ + darray_from_items(arr, __str, strlen(__str) + 1); \ + (arr).size--; \ +} while (0) + +#define darray_from_lit(arr, stringLiteral) do { \ + darray_from_items(arr, stringLiteral, sizeof(stringLiteral)); \ + (arr).size--; \ +} while (0) + +/*** Size management ***/ + +#define darray_resize(arr, newSize) \ + darray_growalloc(arr, (arr).size = (newSize)) + +#define darray_resize0(arr, newSize) do { \ + size_t __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 { \ + size_t __need = (need); \ + if (__need > (arr).alloc) \ + darray_realloc(arr, darray_next_alloc((arr).alloc, __need)); \ +} while (0) + +static inline size_t +darray_next_alloc(size_t alloc, size_t need) +{ + if (alloc == 0) + alloc = 4; + while (alloc < need) + alloc *= 2; + return alloc; +} + +/*** Traversal ***/ + +/* + * darray_foreach(T *&i, darray(T) arr) {...} + * + * Traverse a darray. `i` must be declared in advance as a pointer to an item. + */ +#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)++) + +/* + * darray_foreach_reverse(T *&i, darray(T) arr) {...} + * + * Like darray_foreach, but traverse in reverse order. + */ +#define darray_foreach_reverse(i, arr) \ + for ((i) = &(arr).item[(arr).size]; (i)-- > &(arr).item[0]; ) + +#endif /* CCAN_DARRAY_H */ + +/* + * + * darray_growalloc(arr, newAlloc) sees if the darray can currently hold newAlloc items; + * if not, it increases the alloc to satisfy this requirement, allocating slack + * space to avoid having to reallocate for every size increment. + * + * darray_from_string(arr, str) copies a string to an darray_char. + * + * darray_push(arr, item) pushes an item to the end of the darray. + * darray_pop(arr) pops it back out. Be sure there is at least one item in the darray before calling. + * darray_pop_check(arr) does the same as darray_pop, but returns NULL if there are no more items left in the darray. + * + * darray_make_room(arr, room) ensures there's 'room' elements of space after the end of the darray, and it returns a pointer to this space. + * Currently requires HAVE_STATEMENT_EXPR, but I plan to remove this dependency by creating an inline function. + * + * The following require HAVE_TYPEOF==1 : + * + * darray_appends(arr, item0, item1...) appends a collection of comma-delimited items to the darray. + * darray_prepends(arr, item0, item1...) prepends a collection of comma-delimited items to the darray.\ + * + * + * Examples: + * + * darray(int) arr; + * int *i; + * + * darray_appends(arr, 0,1,2,3,4); + * darray_appends(arr, -5,-4,-3,-2,-1); + * darray_foreach(i, arr) + * printf("%d ", *i); + * printf("\n"); + * + * darray_free(arr); + * + * + * typedef struct {int n,d;} Fraction; + * darray(Fraction) fractions; + * Fraction *i; + * + * darray_appends(fractions, {3,4}, {3,5}, {2,1}); + * darray_foreach(i, fractions) + * printf("%d/%d\n", i->n, i->d); + * + * darray_free(fractions); + */ diff -Nru libxkbcommon-0.1.0~1/src/galloc.c libxkbcommon-0.1.0~2/src/galloc.c --- libxkbcommon-0.1.0~1/src/galloc.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/galloc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,755 +0,0 @@ -/* -Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - -Permission to use, copy, modify, and distribute this -software and its documentation for any purpose and without -fee is hereby granted, provided that the above copyright -notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting -documentation, and that the name of Silicon Graphics not be -used in advertising or publicity pertaining to distribution -of the software without specific prior written permission. -Silicon Graphics makes no representation about the suitability -of this software for any purpose. It is provided "as is" -without any express or implied warranty. - -SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON -GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH -THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include "xkbgeom.h" -#include "X11/extensions/XKBcommon.h" -#include "XKBcommonint.h" -#include - -static void -_XkbFreeGeomLeafElems(Bool freeAll, int first, int count, - unsigned short *num_inout, unsigned short *sz_inout, - char **elems, unsigned int elem_sz) -{ - if (freeAll || !(*elems)) { - *num_inout = *sz_inout = 0; - if (*elems) { - free(*elems); - *elems = NULL; - } - return; - } - - if ((first >= (*num_inout)) || (first < 0) || (count < 1)) - return; - - if (first + count >= (*num_inout)) - /* truncating the array is easy */ - (*num_inout) = first; - else { - char *ptr = *elems; - int extra = ((*num_inout) - first + count) * elem_sz; - - if (extra > 0) - memmove(&ptr[first * elem_sz], &ptr[(first + count) * elem_sz], - extra); - - (*num_inout) -= count; - } -} - -typedef void (*ContentsClearFunc)(char *priv); - -static void -_XkbFreeGeomNonLeafElems(Bool freeAll, int first, int count, - unsigned short *num_inout, unsigned short *sz_inout, - char **elems, unsigned int elem_sz, - ContentsClearFunc freeFunc) -{ - int i; - char *ptr; - - if (freeAll) { - first = 0; - count = *num_inout; - } - else if ((first >= (*num_inout)) || (first < 0) || (count < 1)) - return; - else if (first + count > (*num_inout)) - count = (*num_inout) - first; - - if (!(*elems)) - return; - - if (freeFunc) { - ptr = *elems; - ptr += first * elem_sz; - for (i = 0; i < count; i++) { - (*freeFunc)(ptr); - ptr += elem_sz; - } - } - - if (freeAll) { - *num_inout = *sz_inout = 0; - if (*elems) { - free(*elems); - *elems = NULL; - } - } - else if (first + count >= (*num_inout)) - *num_inout = first; - else { - i = ((*num_inout) - first + count) * elem_sz; - ptr = *elems; - memmove(&ptr[first * elem_sz], &ptr[(first + count) * elem_sz], i); - (*num_inout) -= count; - } -} - -static void -_XkbClearProperty(char *prop_in) -{ - struct xkb_property * prop = (struct xkb_property *)prop_in; - - if (prop->name) { - free(prop->name); - prop->name = NULL; - } - if (prop->value) { - free(prop->value); - prop->value = NULL; - } -} - -static void -XkbcFreeGeomProperties(struct xkb_geometry * geom, int first, int count, Bool freeAll) -{ - _XkbFreeGeomNonLeafElems(freeAll, first, count, - &geom->num_properties, &geom->sz_properties, - (char **)&geom->properties, - sizeof(struct xkb_property), - _XkbClearProperty); -} - -static void -XkbcFreeGeomKeyAliases(struct xkb_geometry * geom, int first, int count, Bool freeAll) -{ - _XkbFreeGeomLeafElems(freeAll, first, count, - &geom->num_key_aliases, &geom->sz_key_aliases, - (char **)&geom->key_aliases, - sizeof(struct xkb_key_alias)); -} - -static void -_XkbClearColor(char *color_in) -{ - struct xkb_color * color = (struct xkb_color *)color_in; - - if (color->spec) - free(color->spec); -} - -static void -XkbcFreeGeomColors(struct xkb_geometry * geom, int first, int count, Bool freeAll) -{ - _XkbFreeGeomNonLeafElems(freeAll, first, count, - &geom->num_colors, &geom->sz_colors, - (char **)&geom->colors, sizeof(struct xkb_color), - _XkbClearColor); -} - -static void -XkbcFreeGeomPoints(struct xkb_outline * outline, int first, int count, Bool freeAll) -{ - _XkbFreeGeomLeafElems(freeAll, first, count, - &outline->num_points, &outline->sz_points, - (char **)&outline->points, sizeof(struct xkb_point)); -} - -static void -_XkbClearOutline(char *outline_in) -{ - struct xkb_outline * outline = (struct xkb_outline *)outline_in; - - if (outline->points) - XkbcFreeGeomPoints(outline, 0, outline->num_points, True); -} - -static void -XkbcFreeGeomOutlines(struct xkb_shape * shape, int first, int count, Bool freeAll) -{ - _XkbFreeGeomNonLeafElems(freeAll, first, count, - &shape->num_outlines, &shape->sz_outlines, - (char **)&shape->outlines, sizeof(struct xkb_outline), - _XkbClearOutline); -} - -static void -_XkbClearShape(char *shape_in) -{ - struct xkb_shape * shape = (struct xkb_shape *)shape_in; - - if (shape->outlines) - XkbcFreeGeomOutlines(shape, 0, shape->num_outlines, True); -} - -static void -XkbcFreeGeomShapes(struct xkb_geometry * geom, int first, int count, Bool freeAll) -{ - _XkbFreeGeomNonLeafElems(freeAll, first, count, - &geom->num_shapes, &geom->sz_shapes, - (char **)&geom->shapes, sizeof(struct xkb_shape), - _XkbClearShape); -} - -static void -XkbcFreeGeomKeys(struct xkb_row * row, int first, int count, Bool freeAll) -{ - _XkbFreeGeomLeafElems(freeAll, first, count, - &row->num_keys, &row->sz_keys, - (char **)&row->keys, sizeof(struct xkb_key)); -} - -static void -_XkbClearRow(char *row_in) -{ - struct xkb_row * row = (struct xkb_row *)row_in; - - if (row->keys) - XkbcFreeGeomKeys(row, 0, row->num_keys, True); -} - -static void -XkbcFreeGeomRows(struct xkb_section * section, int first, int count, Bool freeAll) -{ - _XkbFreeGeomNonLeafElems(freeAll, first, count, - §ion->num_rows, §ion->sz_rows, - (char **)§ion->rows, sizeof(struct xkb_row), - _XkbClearRow); -} - - - -static void -_XkbClearDoodad(char *doodad_in) -{ - union xkb_doodad * doodad = (union xkb_doodad *)doodad_in; - - switch (doodad->any.type) { - case XkbTextDoodad: - if (doodad->text.text) { - free(doodad->text.text); - doodad->text.text = NULL; - } - if (doodad->text.font) { - free(doodad->text.font); - doodad->text.font = NULL; - } - break; - - case XkbLogoDoodad: - if (doodad->logo.logo_name) { - free(doodad->logo.logo_name); - doodad->logo.logo_name = NULL; - } - break; - } -} - -static void -XkbcFreeGeomDoodads(union xkb_doodad * doodads, int nDoodads, Bool freeAll) -{ - int i; - union xkb_doodad * doodad; - - if (doodads) { - for (i = 0, doodad = doodads; i < nDoodads; i++, doodad++) - _XkbClearDoodad((char *)doodad); - if (freeAll) - free(doodads); - } -} - -static void -_XkbClearSection(char *section_in) -{ - struct xkb_section * section = (struct xkb_section *)section_in; - - if (section->rows) - XkbcFreeGeomRows(section, 0, section->num_rows, True); - if (section->doodads) { - XkbcFreeGeomDoodads(section->doodads, section->num_doodads, True); - section->doodads = NULL; - } -} - -static void -XkbcFreeGeomSections(struct xkb_geometry * geom, int first, int count, Bool freeAll) -{ - _XkbFreeGeomNonLeafElems(freeAll, first, count, - &geom->num_sections, &geom->sz_sections, - (char **)&geom->sections, sizeof(struct xkb_section), - _XkbClearSection); -} - -void -XkbcFreeGeometry(struct xkb_geometry * geom, unsigned which, Bool freeMap) -{ - if (!geom) - return; - - if (freeMap) - which = XkbGeomAllMask; - - if ((which & XkbGeomPropertiesMask) && geom->properties) - XkbcFreeGeomProperties(geom, 0, geom->num_properties, True); - - if ((which & XkbGeomColorsMask) && geom->colors) - XkbcFreeGeomColors(geom, 0, geom->num_colors, True); - - if ((which & XkbGeomShapesMask) && geom->shapes) - XkbcFreeGeomShapes(geom, 0, geom->num_shapes, True); - - if ((which & XkbGeomSectionsMask) && geom->sections) - XkbcFreeGeomSections(geom, 0, geom->num_sections, True); - - if ((which & XkbGeomDoodadsMask) && geom->doodads) { - XkbcFreeGeomDoodads(geom->doodads, geom->num_doodads, True); - geom->doodads = NULL; - geom->num_doodads = geom->sz_doodads = 0; - } - - if ((which & XkbGeomKeyAliasesMask) && geom->key_aliases) - XkbcFreeGeomKeyAliases(geom, 0, geom->num_key_aliases, True); - - if (freeMap) { - if (geom->label_font) { - free(geom->label_font); - geom->label_font = NULL; - } - free(geom); - } -} - -static int -_XkbGeomAlloc(char **old, unsigned short *num, unsigned short *total, - int num_new, size_t sz_elem) -{ - if (num_new < 1) - return Success; - - if (!(*old)) - *num = *total = 0; - - if ((*num) + num_new <= (*total)) - return Success; - - *total = (*num) + num_new; - - if (*old) - *old = (char *)realloc(*old, (*total) * sz_elem); - else - *old = (char *)calloc(*total, sz_elem); - if (!(*old)) { - *total = *num = 0; - return BadAlloc; - } - - if (*num > 0) { - char *tmp = *old; - bzero(&tmp[sz_elem * (*num)], num_new * sz_elem); - } - - return Success; -} - -#define _XkbAllocProps(g, n) _XkbGeomAlloc((char **)&(g)->properties, \ - &(g)->num_properties, \ - &(g)->sz_properties, \ - (n), sizeof(struct xkb_property)) -#define _XkbAllocColors(g, n) _XkbGeomAlloc((char **)&(g)->colors, \ - &(g)->num_colors, \ - &(g)->sz_colors, \ - (n), sizeof(struct xkb_color)) -#define _XkbAllocShapes(g, n) _XkbGeomAlloc((char **)&(g)->shapes, \ - &(g)->num_shapes, \ - &(g)->sz_shapes, \ - (n), sizeof(struct xkb_shape)) -#define _XkbAllocSections(g, n) _XkbGeomAlloc((char **)&(g)->sections, \ - &(g)->num_sections, \ - &(g)->sz_sections, \ - (n), sizeof(struct xkb_section)) -#define _XkbAllocDoodads(g, n) _XkbGeomAlloc((char **)&(g)->doodads, \ - &(g)->num_doodads, \ - &(g)->sz_doodads, \ - (n), sizeof(union xkb_doodad)) -#define _XkbAllocKeyAliases(g, n) _XkbGeomAlloc((char **)&(g)->key_aliases, \ - &(g)->num_key_aliases, \ - &(g)->sz_key_aliases, \ - (n), sizeof(struct xkb_key_alias)) - -#define _XkbAllocOutlines(s, n) _XkbGeomAlloc((char **)&(s)->outlines, \ - &(s)->num_outlines, \ - &(s)->sz_outlines, \ - (n), sizeof(struct xkb_outline)) -#define _XkbAllocRows(s, n) _XkbGeomAlloc((char **)&(s)->rows, \ - &(s)->num_rows, \ - &(s)->sz_rows, \ - (n), sizeof(struct xkb_row)) -#define _XkbAllocPoints(o, n) _XkbGeomAlloc((char **)&(o)->points, \ - &(o)->num_points, \ - &(o)->sz_points, \ - (n), sizeof(struct xkb_point)) -#define _XkbAllocKeys(r, n) _XkbGeomAlloc((char **)&(r)->keys, \ - &(r)->num_keys, \ - &(r)->sz_keys, \ - (n), sizeof(struct xkb_key)) -#define _XkbAllocOverlays(s, n) _XkbGeomAlloc((char **)&(s)->overlays, \ - &(s)->num_overlays, \ - &(s)->sz_overlays, \ - (n), sizeof(struct xkb_overlay)) -#define _XkbAllocOverlayRows(o, n) _XkbGeomAlloc((char **)&(o)->rows, \ - &(o)->num_rows, \ - &(o)->sz_rows, \ - (n), sizeof(struct xkb_overlay_row)) -#define _XkbAllocOverlayKeys(r, n) _XkbGeomAlloc((char **)&(r)->keys, \ - &(r)->num_keys, \ - &(r)->sz_keys, \ - (n), sizeof(struct xkb_overlay_key)) - -int -XkbcAllocGeomKeyAliases(struct xkb_geometry * geom, int nKeyAliases) -{ - return _XkbAllocKeyAliases(geom, nKeyAliases); -} - -int -XkbcAllocGeometry(struct xkb_desc * xkb, struct xkb_geometry_sizes * sizes) -{ - struct xkb_geometry * geom; - int rtrn; - - if (!xkb->geom) { - xkb->geom = _XkbTypedCalloc(1, struct xkb_geometry); - if (!xkb->geom) - return BadAlloc; - } - geom = xkb->geom; - - if ((sizes->which & XkbGeomPropertiesMask) && - ((rtrn = _XkbAllocProps(geom, sizes->num_properties)) != Success)) - goto bail; - - if ((sizes->which & XkbGeomColorsMask) && - ((rtrn = _XkbAllocColors(geom, sizes->num_colors)) != Success)) - goto bail; - - if ((sizes->which & XkbGeomShapesMask) && - ((rtrn = _XkbAllocShapes(geom, sizes->num_shapes)) != Success)) - goto bail; - - if ((sizes->which & XkbGeomSectionsMask) && - ((rtrn = _XkbAllocSections(geom, sizes->num_sections)) != Success)) - goto bail; - - if ((sizes->which & XkbGeomDoodadsMask) && - ((rtrn = _XkbAllocDoodads(geom, sizes->num_doodads)) != Success)) - goto bail; - - if ((sizes->which & XkbGeomKeyAliasesMask) && - ((rtrn = _XkbAllocKeyAliases(geom, sizes->num_key_aliases)) != Success)) - goto bail; - - return Success; -bail: - XkbcFreeGeometry(geom, XkbGeomAllMask, True); - xkb->geom = NULL; - return rtrn; -} - -struct xkb_property * -XkbcAddGeomProperty(struct xkb_geometry * geom,const char *name,const char *value) -{ -register int i; -register struct xkb_property * prop; - - if ((!geom)||(!name)||(!value)) - return NULL; - for (i=0,prop=geom->properties;inum_properties;i++,prop++) { - if ((prop->name)&&(strcmp(name,prop->name)==0)) { - if (prop->value) - free(prop->value); - prop->value= (char *)malloc(strlen(value)+1); - if (prop->value) - strcpy(prop->value,value); - return prop; - } - } - if ((geom->num_properties>=geom->sz_properties)&& - (_XkbAllocProps(geom,1)!=Success)) { - return NULL; - } - prop= &geom->properties[geom->num_properties]; - prop->name= (char *)malloc(strlen(name)+1); - if (!name) - return NULL; - strcpy(prop->name,name); - prop->value= (char *)malloc(strlen(value)+1); - if (!value) { - free(prop->name); - prop->name= NULL; - return NULL; - } - strcpy(prop->value,value); - geom->num_properties++; - return prop; -} - -struct xkb_color * -XkbcAddGeomColor(struct xkb_geometry * geom,const char *spec,unsigned int pixel) -{ -register int i; -register struct xkb_color * color; - - if ((!geom)||(!spec)) - return NULL; - for (i=0,color=geom->colors;inum_colors;i++,color++) { - if ((color->spec)&&(strcmp(color->spec,spec)==0)) { - color->pixel= pixel; - return color; - } - } - if ((geom->num_colors>=geom->sz_colors)&& - (_XkbAllocColors(geom,1)!=Success)) { - return NULL; - } - color= &geom->colors[geom->num_colors]; - color->pixel= pixel; - color->spec= (char *)malloc(strlen(spec)+1); - if (!color->spec) - return NULL; - strcpy(color->spec,spec); - geom->num_colors++; - return color; -} - -struct xkb_outline * -XkbcAddGeomOutline(struct xkb_shape * shape,int sz_points) -{ -struct xkb_outline * outline; - - if ((!shape)||(sz_points<0)) - return NULL; - if ((shape->num_outlines>=shape->sz_outlines)&& - (_XkbAllocOutlines(shape,1)!=Success)) { - return NULL; - } - outline= &shape->outlines[shape->num_outlines]; - bzero(outline,sizeof(struct xkb_outline)); - if ((sz_points>0)&&(_XkbAllocPoints(outline,sz_points)!=Success)) - return NULL; - shape->num_outlines++; - return outline; -} - -struct xkb_shape * -XkbcAddGeomShape(struct xkb_geometry * geom,uint32_t name,int sz_outlines) -{ -struct xkb_shape * shape; -register int i; - - if ((!geom)||(!name)||(sz_outlines<0)) - return NULL; - if (geom->num_shapes>0) { - for (shape=geom->shapes,i=0;inum_shapes;i++,shape++) { - if (name==shape->name) - return shape; - } - } - if ((geom->num_shapes>=geom->sz_shapes)&& - (_XkbAllocShapes(geom,1)!=Success)) - return NULL; - shape= &geom->shapes[geom->num_shapes]; - bzero(shape,sizeof(struct xkb_shape)); - if ((sz_outlines>0)&&(_XkbAllocOutlines(shape,sz_outlines)!=Success)) - return NULL; - shape->name= name; - shape->primary= shape->approx= NULL; - geom->num_shapes++; - return shape; -} - -struct xkb_key * -XkbcAddGeomKey(struct xkb_row * row) -{ -struct xkb_key * key; - if (!row) - return NULL; - if ((row->num_keys>=row->sz_keys)&&(_XkbAllocKeys(row,1)!=Success)) - return NULL; - key= &row->keys[row->num_keys++]; - bzero(key,sizeof(struct xkb_key)); - return key; -} - -struct xkb_row * -XkbcAddGeomRow(struct xkb_section * section,int sz_keys) -{ -struct xkb_row * row; - - if ((!section)||(sz_keys<0)) - return NULL; - if ((section->num_rows>=section->sz_rows)&& - (_XkbAllocRows(section,1)!=Success)) - return NULL; - row= §ion->rows[section->num_rows]; - bzero(row,sizeof(struct xkb_row)); - if ((sz_keys>0)&&(_XkbAllocKeys(row,sz_keys)!=Success)) - return NULL; - section->num_rows++; - return row; -} - -struct xkb_section * -XkbcAddGeomSection( struct xkb_geometry * geom, - uint32_t name, - int sz_rows, - int sz_doodads, - int sz_over) -{ -register int i; -struct xkb_section * section; - - if ((!geom)||(name==None)||(sz_rows<0)) - return NULL; - for (i=0,section=geom->sections;inum_sections;i++,section++) { - if (section->name!=name) - continue; - if (((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success))|| - ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success))|| - ((sz_over>0)&&(_XkbAllocOverlays(section,sz_over)!=Success))) - return NULL; - return section; - } - if ((geom->num_sections>=geom->sz_sections)&& - (_XkbAllocSections(geom,1)!=Success)) - return NULL; - section= &geom->sections[geom->num_sections]; - if ((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success)) - return NULL; - if ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success)) { - if (section->rows) { - free(section->rows); - section->rows= NULL; - section->sz_rows= section->num_rows= 0; - } - return NULL; - } - section->name= name; - geom->num_sections++; - return section; -} - -union xkb_doodad * -XkbcAddGeomDoodad(struct xkb_geometry * geom,struct xkb_section * section,uint32_t name) -{ -union xkb_doodad *old, *doodad; -register int i,nDoodads; - - if ((!geom)||(name==None)) - return NULL; - if ((section!=NULL)&&(section->num_doodads>0)) { - old= section->doodads; - nDoodads= section->num_doodads; - } - else { - old= geom->doodads; - nDoodads= geom->num_doodads; - } - for (i=0,doodad=old;iany.name==name) - return doodad; - } - if (section) { - if ((section->num_doodads>=geom->sz_doodads)&& - (_XkbAllocDoodads(section,1)!=Success)) { - return NULL; - } - doodad= §ion->doodads[section->num_doodads++]; - } - else { - if ((geom->num_doodads>=geom->sz_doodads)&& - (_XkbAllocDoodads(geom,1)!=Success)) - return NULL; - doodad= &geom->doodads[geom->num_doodads++]; - } - bzero(doodad,sizeof(union xkb_doodad)); - doodad->any.name= name; - return doodad; -} - -struct xkb_overlay_row * -XkbcAddGeomOverlayRow(struct xkb_overlay * overlay,int row_under,int sz_keys) -{ -register int i; -struct xkb_overlay_row * row; - - if ((!overlay)||(sz_keys<0)) - return NULL; - if (row_under>=overlay->section_under->num_rows) - return NULL; - for (i=0;inum_rows;i++) { - if (overlay->rows[i].row_under==row_under) { - row= &overlay->rows[i]; - if ((row->sz_keysrows[i]; - } - } - if ((overlay->num_rows>=overlay->sz_rows)&& - (_XkbAllocOverlayRows(overlay,1)!=Success)) - return NULL; - row= &overlay->rows[overlay->num_rows]; - bzero(row,sizeof(struct xkb_overlay_row)); - if ((sz_keys>0)&&(_XkbAllocOverlayKeys(row,sz_keys)!=Success)) - return NULL; - row->row_under= row_under; - overlay->num_rows++; - return row; -} - -struct xkb_overlay * -XkbcAddGeomOverlay(struct xkb_section * section,uint32_t name,int sz_rows) -{ -register int i; -struct xkb_overlay * overlay; - - if ((!section)||(name==None)||(sz_rows==0)) - return NULL; - - for (i=0,overlay=section->overlays;inum_overlays;i++,overlay++) { - if (overlay->name==name) { - if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success)) - return NULL; - return overlay; - } - } - if ((section->num_overlays>=section->sz_overlays)&& - (_XkbAllocOverlays(section,1)!=Success)) - return NULL; - overlay= §ion->overlays[section->num_overlays]; - if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success)) - return NULL; - overlay->name= name; - overlay->section_under= section; - section->num_overlays++; - return overlay; -} diff -Nru libxkbcommon-0.1.0~1/src/geom.c libxkbcommon-0.1.0~2/src/geom.c --- libxkbcommon-0.1.0~1/src/geom.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/geom.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,182 +0,0 @@ -/************************************************************ -Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - -Permission to use, copy, modify, and distribute this -software and its documentation for any purpose and without -fee is hereby granted, provided that the above copyright -notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting -documentation, and that the name of Silicon Graphics not be -used in advertising or publicity pertaining to distribution -of the software without specific prior written permission. -Silicon Graphics makes no representation about the suitability -of this software for any purpose. It is provided "as is" -without any express or implied warranty. - -SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON -GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH -THE USE OR PERFORMANCE OF THIS SOFTWARE. - -********************************************************/ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "xkbgeom.h" -#include "X11/extensions/XKBcommon.h" -#include "XKBcommonint.h" - -#ifndef MINSHORT -#define MINSHORT -32768 -#endif -#ifndef MAXSHORT -#define MAXSHORT 32767 -#endif - -static void -_XkbCheckBounds(struct xkb_bounds * bounds, int x, int y) -{ - if (x < bounds->x1) - bounds->x1 = x; - if (x > bounds->x2) - bounds->x2 = x; - if (y < bounds->y1) - bounds->y1 = y; - if (y > bounds->y2) - bounds->y2 = y; -} - -Bool -XkbcComputeShapeBounds(struct xkb_shape * shape) -{ - int o, p; - struct xkb_outline * outline; - struct xkb_point * pt; - - if ((!shape) || (shape->num_outlines < 1)) - return False; - - shape->bounds.x1 = shape->bounds.y1 = MAXSHORT; - shape->bounds.x2 = shape->bounds.y2 = MINSHORT; - - for (outline = shape->outlines, o = 0; o < shape->num_outlines; - o++, outline++) - { - for (pt = outline->points, p = 0; p < outline->num_points; p++, pt++) - _XkbCheckBounds(&shape->bounds, pt->x, pt->y); - if (outline->num_points < 2) - _XkbCheckBounds(&shape->bounds, 0, 0); - } - return True; -} - -static Bool -XkbcComputeRowBounds(struct xkb_geometry * geom, struct xkb_section * section, struct xkb_row * row) -{ - int k, pos; - struct xkb_key * key; - struct xkb_bounds *bounds, *sbounds; - - if (!geom || !section || !row) - return False; - - pos = 0; - bounds = &row->bounds; - bzero(bounds, sizeof(struct xkb_bounds)); - - for (key = row->keys, pos = k = 0; k < row->num_keys; k++, key++) { - sbounds = &XkbKeyShape(geom, key)->bounds; - _XkbCheckBounds(bounds, pos, 0); - - if (!row->vertical) { - if (key->gap != 0) { - pos += key->gap; - _XkbCheckBounds(bounds, pos, 0); - } - _XkbCheckBounds(bounds, pos + sbounds->x1, sbounds->y1); - _XkbCheckBounds(bounds, pos + sbounds->x2, sbounds->y2); - pos += sbounds->x2; - } - else { - if (key->gap != 0) { - pos += key->gap; - _XkbCheckBounds(bounds, 0, pos); - } - _XkbCheckBounds(bounds,pos + sbounds->x1, sbounds->y1); - _XkbCheckBounds(bounds,pos + sbounds->x2, sbounds->y2); - pos += sbounds->y2; - } - } - - return True; -} - -Bool -XkbcComputeSectionBounds(struct xkb_geometry * geom, struct xkb_section * section) -{ - int i; - struct xkb_shape * shape; - struct xkb_row * row; - union xkb_doodad * doodad; - struct xkb_bounds * bounds, *rbounds = NULL; - - if (!geom || !section) - return False; - - bounds = §ion->bounds; - bzero(bounds, sizeof(struct xkb_bounds)); - - for (i = 0, row = section->rows; i < section->num_rows; i++, row++) { - if (!XkbcComputeRowBounds(geom, section, row)) - return False; - rbounds = &row->bounds; - _XkbCheckBounds(bounds, row->left + rbounds->x1, - row->top + rbounds->y1); - _XkbCheckBounds(bounds, row->left + rbounds->x2, - row->top + rbounds->y2); - } - - for (i = 0, doodad = section->doodads; i < section->num_doodads; - i++, doodad++) - { - static struct xkb_bounds tbounds; - - switch (doodad->any.type) { - case XkbOutlineDoodad: - case XkbSolidDoodad: - shape = XkbShapeDoodadShape(geom, &doodad->shape); - rbounds = &shape->bounds; - break; - case XkbTextDoodad: - tbounds.x1 = doodad->text.left; - tbounds.y1 = doodad->text.top; - tbounds.x2 = tbounds.x1 + doodad->text.width; - tbounds.y2 = tbounds.y1 + doodad->text.height; - rbounds = &tbounds; - break; - case XkbIndicatorDoodad: - shape = XkbIndicatorDoodadShape(geom, &doodad->indicator); - rbounds = &shape->bounds; - break; - case XkbLogoDoodad: - shape = XkbLogoDoodadShape(geom, &doodad->logo); - rbounds = &shape->bounds; - break; - default: - tbounds.x1 = tbounds.x2 = doodad->any.left; - tbounds.y1 = tbounds.y2 = doodad->any.top; - break; - } - - _XkbCheckBounds(bounds, rbounds->x1, rbounds->y1); - _XkbCheckBounds(bounds, rbounds->x2, rbounds->y2); - } - - return True; -} diff -Nru libxkbcommon-0.1.0~1/src/keymap-dump.c libxkbcommon-0.1.0~2/src/keymap-dump.c --- libxkbcommon-0.1.0~1/src/keymap-dump.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/keymap-dump.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,808 @@ +/************************************************************ + * 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 +#include +#include +#include + +#include "xkb-priv.h" +#include "text.h" + +#define VMOD_HIDE_VALUE 0 +#define VMOD_SHOW_VALUE 1 +#define VMOD_COMMENT_VALUE 2 + +#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 (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 >= available || printed < 0) + 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) +{ + int num_vmods = 0; + int i; + + for (i = 0; i < XkbNumVirtualMods; i++) { + if (!keymap->vmod_names[i]) + continue; + if (num_vmods == 0) + write_buf(buf, "\t\tvirtual_modifiers "); + else + write_buf(buf, ","); + write_buf(buf, "%s", keymap->vmod_names[i]); + num_vmods++; + } + + if (num_vmods > 0) + write_buf(buf, ";\n\n"); + + return true; +} + +#define GET_TEXT_BUF_SIZE 512 + +#define append_get_text(...) do { \ + int _size = snprintf(ret, GET_TEXT_BUF_SIZE, __VA_ARGS__); \ + if (_size >= GET_TEXT_BUF_SIZE) \ + return NULL; \ +} while (0) + +static char * +get_indicator_state_text(uint8_t which) +{ + int i; + static char ret[GET_TEXT_BUF_SIZE]; + /* FIXME: Merge with ... something ... in xkbcomp? */ + static const char *state_names[] = { + "base", + "latched", + "locked", + "effective", + "compat" + }; + + memset(ret, 0, GET_TEXT_BUF_SIZE); + + which &= XkbIM_UseAnyMods; + + if (which == 0) { + strcpy(ret, "0"); + return NULL; + } + + for (i = 0; which != 0; i++) { + if (!(which & (1 << i))) + continue; + which &= ~(1 << i); + + if (ret[0] != '\0') + append_get_text("%s+%s", ret, state_names[i]); + else + append_get_text("%s", state_names[i]); + } + + return ret; +} + +static char * +get_control_mask_text(uint32_t control_mask) +{ + int i; + static char ret[GET_TEXT_BUF_SIZE]; + /* FIXME: Merge with ... something ... in xkbcomp. */ + static const char *ctrl_names[] = { + "RepeatKeys", + "SlowKeys", + "BounceKeys", + "StickyKeys", + "MouseKeys", + "MouseKeysAccel", + "AccessXKeys", + "AccessXTimeout", + "AccessXFeedback", + "AudibleBell", + "Overlay1", + "Overlay2", + "IgnoreGroupLock" + }; + + memset(ret, 0, GET_TEXT_BUF_SIZE); + + control_mask &= XkbAllBooleanCtrlsMask; + + if (control_mask == 0) { + strcpy(ret, "none"); + return ret; + } + else if (control_mask == XkbAllBooleanCtrlsMask) { + strcpy(ret, "all"); + return ret; + } + + for (i = 0; control_mask; i++) { + if (!(control_mask & (1 << i))) + continue; + control_mask &= ~(1 << i); + + if (ret[0] != '\0') + append_get_text("%s+%s", ret, ctrl_names[i]); + else + append_get_text("%s", ctrl_names[i]); + } + + return ret; +} + +static bool +write_keycodes(struct xkb_keymap *keymap, struct buf *buf) +{ + struct xkb_key *key; + struct xkb_key_alias *alias; + int i; + + if (keymap->keycodes_section_name) + write_buf(buf, "\txkb_keycodes \"%s\" {\n", + keymap->keycodes_section_name); + else + write_buf(buf, "\txkb_keycodes {\n"); + + write_buf(buf, "\t\tminimum = %d;\n", + keymap->min_key_code); + write_buf(buf, "\t\tmaximum = %d;\n", + keymap->max_key_code); + + xkb_foreach_key(key, keymap) { + if (key->name[0] == '\0') + continue; + + write_buf(buf, "\t\t%6s = %d;\n", + KeyNameText(key->name), XkbKeyGetKeycode(keymap, key)); + } + + for (i = 0; i < XkbNumIndicators; i++) { + if (!keymap->indicator_names[i]) + continue; + write_buf(buf, "\t\tindicator %d = \"%s\";\n", + i + 1, keymap->indicator_names[i]); + } + + + darray_foreach(alias, keymap->key_aliases) + write_buf(buf, "\t\talias %6s = %6s;\n", + KeyNameText(alias->alias), + KeyNameText(alias->real)); + + write_buf(buf, "\t};\n\n"); + return true; +} + +static bool +write_types(struct xkb_keymap *keymap, struct buf *buf) +{ + unsigned int i, j; + xkb_level_index_t n; + struct xkb_key_type *type; + struct xkb_kt_map_entry *entry; + + if (keymap->types_section_name) + write_buf(buf, "\txkb_types \"%s\" {\n\n", + keymap->types_section_name); + else + write_buf(buf, "\txkb_types {\n\n"); + + write_vmods(keymap, buf); + + for (i = 0; i < keymap->num_types; i++) { + type = &keymap->types[i]; + + write_buf(buf, "\t\ttype \"%s\" {\n", + xkb_atom_text(keymap->ctx, type->name)); + write_buf(buf, "\t\t\tmodifiers= %s;\n", + VModMaskText(keymap, type->mods.mods)); + + for (j = 0; j < type->num_entries; j++) { + const char *str; + entry = &type->map[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 = VModMaskText(keymap, entry->mods.mods); + write_buf(buf, "\t\t\tmap[%s]= Level%d;\n", + str, entry->level + 1); + + if (entry->preserve.mods == 0) + continue; + + write_buf(buf, "\t\t\tpreserve[%s]= ", str); + write_buf(buf, "%s;\n", VModMaskText(keymap, entry->preserve.mods)); + } + + if (type->level_names) { + for (n = 0; n < type->num_levels; n++) { + if (!type->level_names[n]) + continue; + write_buf(buf, "\t\t\tlevel_name[Level%d]= \"%s\";\n", n + 1, + xkb_atom_text(keymap->ctx, type->level_names[n])); + } + } + write_buf(buf, "\t\t};\n"); + } + + write_buf(buf, "\t};\n\n"); + return true; +} + +static bool +write_indicator_map(struct xkb_keymap *keymap, struct buf *buf, int num) +{ + struct xkb_indicator_map *led = &keymap->indicators[num]; + + write_buf(buf, "\t\tindicator \"%s\" {\n", + keymap->indicator_names[num]); + + if (led->which_groups) { + if (led->which_groups != XkbIM_UseEffective) { + write_buf(buf, "\t\t\twhichGroupState= %s;\n", + get_indicator_state_text(led->which_groups)); + } + write_buf(buf, "\t\t\tgroups= 0x%02x;\n", + led->groups); + } + + if (led->which_mods) { + if (led->which_mods != XkbIM_UseEffective) { + write_buf(buf, "\t\t\twhichModState= %s;\n", + get_indicator_state_text(led->which_mods)); + } + write_buf(buf, "\t\t\tmodifiers= %s;\n", + VModMaskText(keymap, led->mods.mods)); + } + + if (led->ctrls) { + write_buf(buf, "\t\t\tcontrols= %s;\n", + get_control_mask_text(led->ctrls)); + } + + write_buf(buf, "\t\t};\n"); + return true; +} + +static bool +write_action(struct xkb_keymap *keymap, struct buf *buf, + 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 XkbSA_SetMods: + case XkbSA_LatchMods: + case XkbSA_LockMods: + if (action->mods.flags & XkbSA_UseModMapMods) + args = "modMapMods"; + else + args = VModMaskText(keymap, action->mods.mods.mods); + write_buf(buf, "%s%s(modifiers=%s%s%s)%s", prefix, type, args, + (action->type != XkbSA_LockGroup && + (action->mods.flags & XkbSA_ClearLocks)) ? + ",clearLocks" : "", + (action->type != XkbSA_LockGroup && + (action->mods.flags & XkbSA_LatchToLock)) ? + ",latchToLock" : "", + suffix); + break; + + case XkbSA_SetGroup: + case XkbSA_LatchGroup: + case XkbSA_LockGroup: + write_buf(buf, "%s%s(group=%s%d%s%s)%s", prefix, type, + (!(action->group.flags & XkbSA_GroupAbsolute) && + action->group.group > 0) ? "+" : "", + (action->group.flags & XkbSA_GroupAbsolute) ? + action->group.group + 1 : action->group.group, + (action->type != XkbSA_LockGroup && + (action->group.flags & XkbSA_ClearLocks)) ? + ",clearLocks" : "", + (action->type != XkbSA_LockGroup && + (action->group.flags & XkbSA_LatchToLock)) ? + ",latchToLock" : "", + suffix); + break; + + case XkbSA_Terminate: + write_buf(buf, "%s%s()%s", prefix, type, suffix); + break; + + case XkbSA_MovePtr: + write_buf(buf, "%s%s(x=%s%d,y=%s%d%s)%s", prefix, type, + (!(action->ptr.flags & XkbSA_MoveAbsoluteX) && + action->ptr.x >= 0) ? "+" : "", + action->ptr.x, + (!(action->ptr.flags & XkbSA_MoveAbsoluteY) && + action->ptr.y >= 0) ? "+" : "", + action->ptr.y, + (action->ptr.flags & XkbSA_NoAcceleration) ? ",!accel" : "", + suffix); + break; + + case XkbSA_LockPtrBtn: + switch (action->btn.flags & (XkbSA_LockNoUnlock | XkbSA_LockNoLock)) { + case XkbSA_LockNoUnlock: + args = ",affect=lock"; + break; + + case XkbSA_LockNoLock: + args = ",affect=unlock"; + break; + + case XkbSA_LockNoLock | XkbSA_LockNoUnlock: + args = ",affect=neither"; + break; + + default: + args = ",affect=both"; + break; + } + case XkbSA_PtrBtn: + 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 XkbSA_SetPtrDflt: + write_buf(buf, "%s%s(", prefix, type); + if (action->dflt.affect == XkbSA_AffectDfltBtn) + write_buf(buf, "affect=button,button=%s%d", + (!(action->dflt.flags & XkbSA_DfltBtnAbsolute) && + action->dflt.value >= 0) ? "+" : "", + action->dflt.value); + write_buf(buf, ")%s", suffix); + break; + + case XkbSA_SwitchScreen: + write_buf(buf, "%s%s(screen=%s%d,%ssame)%s", prefix, type, + (!(action->screen.flags & XkbSA_SwitchAbsolute) && + action->screen.screen >= 0) ? "+" : "", + action->screen.screen, + (action->screen.flags & XkbSA_SwitchApplication) ? "!" : "", + suffix); + break; + + /* Deprecated actions below here */ + case XkbSA_SetControls: + case XkbSA_LockControls: + write_buf(buf, "%s%s(controls=%s)%s", prefix, type, + get_control_mask_text(action->ctrls.ctrls), suffix); + break; + + case XkbSA_ISOLock: + case XkbSA_ActionMessage: + case XkbSA_RedirectKey: + case XkbSA_DeviceBtn: + case XkbSA_LockDeviceBtn: + case XkbSA_NoAction: + /* XXX TODO */ + write_buf(buf, "%sNoAction()%s", prefix, suffix); + break; + + case XkbSA_XFree86Private: + 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) +{ + int i; + struct xkb_sym_interpret *interp; + + if (keymap->compat_section_name) + write_buf(buf, "\txkb_compatibility \"%s\" {\n\n", + keymap->compat_section_name); + else + write_buf(buf, "\txkb_compatibility {\n\n"); + + write_vmods(keymap, buf); + + write_buf(buf, "\t\tinterpret.useModMapMods= AnyLevel;\n"); + write_buf(buf, "\t\tinterpret.repeat= False;\n"); + write_buf(buf, "\t\tinterpret.locking= False;\n"); + + darray_foreach(interp, keymap->sym_interpret) { + char keysym_name[64]; + + if (interp->sym == XKB_KEY_NoSymbol) + sprintf(keysym_name, "Any"); + else + xkb_keysym_get_name(interp->sym, keysym_name, sizeof(keysym_name)); + + write_buf(buf, "\t\tinterpret %s+%s(%s) {\n", + keysym_name, + SIMatchText(interp->match), + VModMaskText(keymap, interp->mods)); + + if (interp->virtual_mod != XkbNoModifier) { + write_buf(buf, "\t\t\tvirtualModifier= %s;\n", + keymap->vmod_names[interp->virtual_mod]); + } + + if (interp->match & XkbSI_LevelOneOnly) + write_buf(buf, + "\t\t\tuseModMapMods=level1;\n"); + if (interp->flags & XkbSI_LockingKey) + write_buf(buf, "\t\t\tlocking= True;\n"); + if (interp->flags & XkbSI_AutoRepeat) + write_buf(buf, "\t\t\trepeat= True;\n"); + + write_action(keymap, buf, &interp->act, "\t\t\taction= ", ";\n"); + write_buf(buf, "\t\t};\n"); + } + + for (i = 0; i < XkbNumKbdGroups; i++) { + struct xkb_mods *gc; + + gc = &keymap->groups[i]; + if (gc->mods == 0) + continue; + write_buf(buf, "\t\tgroup %d = %s;\n", i + 1, + VModMaskText(keymap, gc->mods)); + } + + for (i = 0; i < XkbNumIndicators; i++) { + struct xkb_indicator_map *map = &keymap->indicators[i]; + if (map->flags == 0 && map->which_groups == 0 && + map->groups == 0 && map->which_mods == 0 && + map->mods.mods == 0 && map->ctrls == 0) + continue; + write_indicator_map(keymap, buf, i); + } + + write_buf(buf, "\t};\n\n"); + + return true; +} + +static bool +write_keysyms(struct xkb_keymap *keymap, struct buf *buf, + struct xkb_key *key, xkb_group_index_t group) +{ + const xkb_keysym_t *syms; + int num_syms; + xkb_level_index_t level; +#define OUT_BUF_LEN 128 + char out_buf[OUT_BUF_LEN]; + + for (level = 0; level < XkbKeyGroupWidth(keymap, key, group); level++) { + if (level != 0) + write_buf(buf, ", "); + num_syms = xkb_key_get_syms_by_level(keymap, key, group, level, + &syms); + if (num_syms == 0) { + write_buf(buf, "%15s", "NoSymbol"); + } + else if (num_syms == 1) { + xkb_keysym_get_name(syms[0], out_buf, OUT_BUF_LEN); + write_buf(buf, "%15s", out_buf); + } + else { + int s; + write_buf(buf, "{ "); + for (s = 0; s < num_syms; s++) { + if (s != 0) + write_buf(buf, ", "); + xkb_keysym_get_name(syms[s], out_buf, OUT_BUF_LEN); + write_buf(buf, "%15s", out_buf); + } + write_buf(buf, " }"); + } + } +#undef OUT_BUF_LEN + + return true; +} + +static bool +write_symbols(struct xkb_keymap *keymap, struct buf *buf) +{ + struct xkb_key *key; + xkb_group_index_t group, tmp; + bool showActions; + + if (keymap->symbols_section_name) + write_buf(buf, "\txkb_symbols \"%s\" {\n\n", + keymap->symbols_section_name); + else + write_buf(buf, "\txkb_symbols {\n\n"); + + for (tmp = group = 0; group < XkbNumKbdGroups; group++) { + if (!keymap->group_names[group]) + continue; + write_buf(buf, + "\t\tname[group%d]=\"%s\";\n", group + 1, + keymap->group_names[group]); + tmp++; + } + if (tmp > 0) + write_buf(buf, "\n"); + + xkb_foreach_key(key, keymap) { + bool simple = true; + + if (key->num_groups == 0) + continue; + + write_buf(buf, "\t\tkey %6s {", KeyNameText(key->name)); + + if (key->explicit & XkbExplicitKeyTypesMask) { + bool multi_type = false; + struct xkb_key_type *type = XkbKeyType(keymap, key, 0); + + simple = false; + + for (group = 1; group < key->num_groups; group++) { + if (XkbKeyType(keymap, key, group) != type) { + multi_type = true; + break; + } + } + + if (multi_type) { + for (group = 0; group < key->num_groups; group++) { + if (!(key->explicit & (1 << group))) + continue; + type = XkbKeyType(keymap, key, group); + write_buf(buf, "\n\t\t\ttype[group%u]= \"%s\",", + group + 1, + xkb_atom_text(keymap->ctx, type->name)); + } + } + else { + write_buf(buf, "\n\t\t\ttype= \"%s\",", + xkb_atom_text(keymap->ctx, type->name)); + } + } + + if (key->explicit & XkbExplicitAutoRepeatMask) { + if (key->repeats) + write_buf(buf, "\n\t\t\trepeat= Yes,"); + else + write_buf(buf, "\n\t\t\trepeat= No,"); + simple = false; + } + + if (key->vmodmap && (key->explicit & XkbExplicitVModMapMask)) { + /* XXX: vmodmap cmask? */ + write_buf(buf, "\n\t\t\tvirtualMods= %s,", + VModMaskText(keymap, key->vmodmap << XkbNumModifiers)); + } + + switch (key->out_of_range_group_action) { + case XkbClampIntoRange: + write_buf(buf, "\n\t\t\tgroupsClamp,"); + break; + + case XkbRedirectIntoRange: + write_buf(buf, "\n\t\t\tgroupsRedirect= Group%u,", + key->out_of_range_group_number + 1); + break; + } + + if (key->explicit & XkbExplicitInterpretMask) + showActions = (key->actions != NULL); + else + showActions = false; + + if (key->num_groups > 1 || showActions) + 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\t\tsymbols[Group%u]= [ ", group + 1); + if (!write_keysyms(keymap, buf, key, group)) + return false; + write_buf(buf, " ]"); + if (showActions) { + write_buf(buf, ",\n\t\t\tactions[Group%u]= [ ", + group + 1); + for (level = 0; + level < XkbKeyGroupWidth(keymap, key, group); + level++) { + if (level != 0) + write_buf(buf, ", "); + write_action(keymap, buf, + XkbKeyActionEntry(key, group, level), + NULL, NULL); + } + write_buf(buf, " ]"); + } + } + write_buf(buf, "\n\t\t};\n"); + } + } + + xkb_foreach_key(key, keymap) { + int mod; + + if (key->modmap == 0) + continue; + + for (mod = 0; mod < XkbNumModifiers; mod++) { + if (!(key->modmap & (1 << mod))) + continue; + + write_buf(buf, "\t\tmodifier_map %s { %s };\n", + ModIndexToName(mod), KeyNameText(key->name)); + } + } + + write_buf(buf, "\t};\n\n"); + return true; +} + +XKB_EXPORT char * +xkb_map_get_as_string(struct xkb_keymap *keymap) +{ + bool ok; + struct buf buf = { NULL, 0, 0 }; + + ok = (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")); + + return (ok ? buf.buf : NULL); +} diff -Nru libxkbcommon-0.1.0~1/src/keysym-utf.c libxkbcommon-0.1.0~2/src/keysym-utf.c --- libxkbcommon-0.1.0~1/src/keysym-utf.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/keysym-utf.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,960 @@ +/* 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 +#include "xkbcommon/xkbcommon.h" +#include "utils.h" + +struct codepair { + xkb_keysym_t keysym; + uint16_t ucs; +} 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 signifblank ? ??? */ + { 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, 0x2329 }, /* leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */ + { 0x0abd, 0x002e }, /* decimalpoint . FULL STOP */ + { 0x0abe, 0x232a }, /* rightanglebracket 〉 RIGHT-POINTING 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 */ + { 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 */ + + { 0xff80, 0x0020 }, /* KP_Space SPACE */ + { 0xffaa, 0x002a }, /* KP_Multiply * ASTERISK */ + { 0xffab, 0x002b }, /* KP_Plus + PLUS SIGN */ + /* XXX: It's debatable what KP_Separator and KP_Decimal should represent, + * as well as locale-specific. So just enforce English colonial + * hegemony on the world for the time being. */ + { 0xffac, 0x002e }, /* KP_Separator . FULL STOP */ + { 0xffad, 0x002d }, /* KP_Subtract - HYPHEN-MINUS */ + { 0xffae, 0x002e }, /* KP_Decimal . FULL STOP */ + { 0xffaf, 0x002f }, /* KP_Divide / SOLIDUS */ + { 0xffbd, 0x003d }, /* KP_Equal = EQUAL SIGN */ +}; + +XKB_EXPORT uint32_t +xkb_keysym_to_utf32(xkb_keysym_t keysym) +{ + int min = 0; + int max = sizeof(keysymtab) / sizeof(struct codepair) - 1; + int mid; + + /* first check for Latin-1 characters (1:1 mapping) */ + if ((keysym >= 0x0020 && keysym <= 0x007e) || + (keysym >= 0x00a0 && keysym <= 0x00ff)) + return keysym; + + if (keysym >= 0xffb0 && keysym <= 0xffb9) + return keysym - (0xffb0 - 0x0030); + + /* also check for directly encoded 24-bit UCS characters */ + if ((keysym & 0xff000000) == 0x01000000) + return keysym & 0x00ffffff; + + /* binary search in table */ + while (max >= min) { + mid = (min + max) / 2; + if (keysymtab[mid].keysym < keysym) + min = mid + 1; + else if (keysymtab[mid].keysym > keysym) + max = mid - 1; + else /* found it */ + return keysymtab[mid].ucs; + } + + /* no matching Unicode value found */ + return 0; +} + +/* + * Copyright © 2012 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Author: Rob Bradford + */ + +static 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 <= 0x1fffff) { + length = 4; + head = 0xf0; + } + else if (unichar <= 0x3ffffff) { + length = 5; + head = 0xf8; + } + else { + length = 6; + head = 0xfc; + } + + 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; +} + +XKB_EXPORT int +xkb_keysym_to_utf8(xkb_keysym_t keysym, char *buffer, size_t size) +{ + uint32_t codepoint; + + if (size < 7) + return -1; + + codepoint = xkb_keysym_to_utf32(keysym); + + if (codepoint == 0) + return 0; + + return utf32_to_utf8(codepoint, buffer); +} diff -Nru libxkbcommon-0.1.0~1/src/keysym.c libxkbcommon-0.1.0~2/src/keysym.c --- libxkbcommon-0.1.0~1/src/keysym.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/keysym.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,44 +1,39 @@ /* -Copyright 1985, 1987, 1990, 1998 The Open Group -Copyright 2008 Dan Nicholson + * Copyright 1985, 1987, 1990, 1998 The Open Group + * Copyright 2008 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 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. + */ -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. -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include -#include -#include "xkbmisc.h" -#include "X11/extensions/XKBcommon.h" #include +#include #include +#include "xkb-priv.h" #include "ks_tables.h" -void -xkb_keysym_to_string(uint32_t ks, char *buffer, size_t size) +XKB_EXPORT void +xkb_keysym_get_name(xkb_keysym_t ks, char *buffer, size_t size) { int i, n, h, idx; const unsigned char *entry; @@ -49,12 +44,6 @@ return; } - /* Not listed in keysymdef.h for hysterical raisins. */ - if (ks == NoSymbol) { - snprintf(buffer, size, "NoSymbol"); - return; - } - /* Try to find it in our hash table. */ if (ks <= 0x1fffffff) { val1 = ks >> 24; @@ -70,9 +59,9 @@ if ((entry[0] == val1) && (entry[1] == val2) && (entry[2] == val3) && (entry[3] == val4)) { - snprintf(buffer, size, "%s", entry + 4); - return; - } + snprintf(buffer, size, "%s", entry + 4); + return; + } if (!--n) break; @@ -84,22 +73,23 @@ } if (ks >= 0x01000100 && ks <= 0x0110ffff) - /* Unnamed Unicode codepoint. */ + /* Unnamed Unicode codepoint. */ snprintf(buffer, size, "U%lx", ks & 0xffffffUL); else - /* Unnamed, non-Unicode, symbol (shouldn't generally happen). */ - snprintf(buffer, size, "0x%08x", ks); + /* Unnamed, non-Unicode, symbol (shouldn't generally happen). */ + snprintf(buffer, size, "0x%08x", ks); } -uint32_t -xkb_string_to_keysym(const char *s) +XKB_EXPORT xkb_keysym_t +xkb_keysym_from_name(const char *s) { int i, n, h, c, idx; - unsigned long sig = 0; + uint32_t sig = 0; const char *p = s; + char *tmp; const unsigned char *entry; unsigned char sig1, sig2; - uint32_t val; + xkb_keysym_t val; while ((c = *p++)) sig = (sig << 1) + c; @@ -114,12 +104,11 @@ entry = &_XkeyTable[idx]; if ((entry[0] == sig1) && (entry[1] == sig2) && - !strcmp(s, (char *)entry + 6)) - { + streq(s, (const char *) entry + 6)) { val = (entry[2] << 24) | (entry[3] << 16) | - (entry[4] << 8) | entry[5]; + (entry[4] << 8) | entry[5]; if (!val) - val = XK_VoidSymbol; + val = XKB_KEY_VoidSymbol; return val; } @@ -132,19 +121,168 @@ } if (*s == 'U') { - val = strtoul(&s[1], NULL, 16); + val = strtoul(&s[1], &tmp, 16); + if (tmp && *tmp != '\0') + return XKB_KEY_NoSymbol; if (val < 0x20 || (val > 0x7e && val < 0xa0)) - return NoSymbol; + return XKB_KEY_NoSymbol; if (val < 0x100) return val; if (val > 0x10ffff) - return NoSymbol; + return XKB_KEY_NoSymbol; return val | 0x01000000; } else if (s[0] == '0' && s[1] == 'x') { - return strtoul(&s[2], NULL, 16); + 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) { + 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); + free(tmp); + return ret; + } + + return XKB_KEY_NoSymbol; +} + +enum keysym_case { + NONE, + LOWERCASE, + UPPERCASE, +}; + +static enum keysym_case +keysym_get_case(xkb_keysym_t ks) +{ + unsigned set = (ks & (~0xff)) >> 8; + + switch (set) { + case 0: /* latin 1 */ + if ((ks >= XKB_KEY_A && ks <= XKB_KEY_Z) || + (ks >= XKB_KEY_Agrave && ks <= XKB_KEY_THORN && ks != + XKB_KEY_multiply)) + return UPPERCASE; + if ((ks >= XKB_KEY_a && ks <= XKB_KEY_z) || + (ks >= XKB_KEY_agrave && ks <= XKB_KEY_ydiaeresis)) + return LOWERCASE; + break; + + case 1: /* latin 2 */ + if ((ks >= XKB_KEY_Aogonek && ks <= XKB_KEY_Zabovedot && ks != + XKB_KEY_breve) || + (ks >= XKB_KEY_Racute && ks <= XKB_KEY_Tcedilla)) + return UPPERCASE; + if ((ks >= XKB_KEY_aogonek && ks <= XKB_KEY_zabovedot && ks != + XKB_KEY_caron) || + (ks >= XKB_KEY_racute && ks <= XKB_KEY_tcedilla)) + return LOWERCASE; + break; + + case 2: /* latin 3 */ + if ((ks >= XKB_KEY_Hstroke && ks <= XKB_KEY_Jcircumflex) || + (ks >= XKB_KEY_Cabovedot && ks <= XKB_KEY_Scircumflex)) + return UPPERCASE; + if ((ks >= XKB_KEY_hstroke && ks <= XKB_KEY_jcircumflex) || + (ks >= XKB_KEY_cabovedot && ks <= XKB_KEY_scircumflex)) + return LOWERCASE; + break; + + case 3: /* latin 4 */ + if ((ks >= XKB_KEY_Rcedilla && ks <= XKB_KEY_Tslash) || + (ks == XKB_KEY_ENG) || + (ks >= XKB_KEY_Amacron && ks <= XKB_KEY_Umacron)) + return UPPERCASE; + if ((ks >= XKB_KEY_rcedilla && ks <= XKB_KEY_tslash) || + (ks == XKB_KEY_eng) || + (ks >= XKB_KEY_amacron && ks <= XKB_KEY_umacron)) + return LOWERCASE; + break; + + case 6: /* Cyrillic */ + if ((ks >= XKB_KEY_Serbian_DJE && ks <= XKB_KEY_Serbian_DZE) || + (ks >= XKB_KEY_Cyrillic_YU && ks <= XKB_KEY_Cyrillic_HARDSIGN)) + return UPPERCASE; + if ((ks >= XKB_KEY_Serbian_dje && ks <= XKB_KEY_Serbian_dze) || + (ks >= XKB_KEY_Cyrillic_yu && ks <= XKB_KEY_Cyrillic_hardsign)) + return LOWERCASE; + break; + + case 7: /* Greek */ + if ((ks >= XKB_KEY_Greek_ALPHAaccent && + ks <= XKB_KEY_Greek_OMEGAaccent) || + (ks >= XKB_KEY_Greek_ALPHA && ks <= XKB_KEY_Greek_OMEGA)) + return UPPERCASE; + if ((ks >= XKB_KEY_Greek_alphaaccent && + ks <= XKB_KEY_Greek_omegaaccent) || + (ks >= XKB_KEY_Greek_alpha && ks <= XKB_KEY_Greek_OMEGA)) + return LOWERCASE; + break; + + case 18: /* latin 8 */ + if ((ks == XKB_KEY_Wcircumflex) || + (ks == XKB_KEY_Ycircumflex) || + (ks == XKB_KEY_Babovedot) || + (ks == XKB_KEY_Dabovedot) || + (ks == XKB_KEY_Fabovedot) || + (ks == XKB_KEY_Mabovedot) || + (ks == XKB_KEY_Pabovedot) || + (ks == XKB_KEY_Sabovedot) || + (ks == XKB_KEY_Tabovedot) || + (ks == XKB_KEY_Wdiaeresis) || + (ks == XKB_KEY_Ygrave)) + return UPPERCASE; + if ((ks == XKB_KEY_wcircumflex) || + (ks == XKB_KEY_ycircumflex) || + (ks == XKB_KEY_babovedot) || + (ks == XKB_KEY_dabovedot) || + (ks == XKB_KEY_fabovedot) || + (ks == XKB_KEY_mabovedot) || + (ks == XKB_KEY_pabovedot) || + (ks == XKB_KEY_sabovedot) || + (ks == XKB_KEY_tabovedot) || + (ks == XKB_KEY_wdiaeresis) || + (ks == XKB_KEY_ygrave)) + return LOWERCASE; + break; + + case 19: /* latin 9 */ + if (ks == XKB_KEY_OE || ks == XKB_KEY_Ydiaeresis) + return UPPERCASE; + if (ks == XKB_KEY_oe) + return LOWERCASE; + break; } - return NoSymbol; + return NONE; +} + +bool +xkb_keysym_is_lower(xkb_keysym_t keysym) +{ + return keysym_get_case(keysym) == LOWERCASE; +} + +bool +xkb_keysym_is_upper(xkb_keysym_t keysym) +{ + return keysym_get_case(keysym) == UPPERCASE; +} + +bool +xkb_keysym_is_keypad(xkb_keysym_t keysym) +{ + return keysym >= XKB_KEY_KP_Space && keysym <= XKB_KEY_KP_Equal; } diff -Nru libxkbcommon-0.1.0~1/src/list.h libxkbcommon-0.1.0~2/src/list.h --- libxkbcommon-0.1.0~1/src/list.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/list.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,489 @@ +/* + * Copyright © 2010 Intel Corporation + * 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. + * + */ + +#ifndef LIST_H +#define LIST_H + +/** + * @file Classic doubly-link circular list implementation. + * For real usage examples of the linked list, see the file test/list.c + * + * Example: + * We need to keep a list of struct foo in the parent struct bar, i.e. what + * we want is something like this. + * + * struct bar { + * ... + * struct foo *list_of_foos; -----> struct foo {}, struct foo {}, struct foo{} + * ... + * } + * + * We need one list head in bar and a list element in all list_of_foos (both are of + * data type 'struct list'). + * + * struct bar { + * ... + * struct list list_of_foos; + * ... + * } + * + * struct foo { + * ... + * struct list entry; + * ... + * } + * + * Now we initialize the list head: + * + * struct bar bar; + * ... + * list_init(&bar.list_of_foos); + * + * Then we create the first element and add it to this list: + * + * struct foo *foo = malloc(...); + * .... + * list_add(&foo->entry, &bar.list_of_foos); + * + * Repeat the above for each element you want to add to the list. Deleting + * works with the element itself. + * list_del(&foo->entry); + * free(foo); + * + * Note: calling list_del(&bar.list_of_foos) will set bar.list_of_foos to an empty + * list again. + * + * Looping through the list requires a 'struct foo' as iterator and the + * name of the field the subnodes use. + * + * struct foo *iterator; + * list_foreach(iterator, &bar.list_of_foos, entry) { + * if (iterator->something == ...) + * ... + * } + * + * Note: You must not call list_del() on the iterator if you continue the + * loop. You need to run the safe for-each loop instead: + * + * struct foo *iterator, *next; + * list_foreach_safe(iterator, next, &bar.list_of_foos, entry) { + * if (...) + * list_del(&iterator->entry); + * } + * + */ + +/** + * The linkage struct for list nodes. This struct must be part of your + * to-be-linked struct. struct list is required for both the head of the + * list and for each list node. + * + * Position and name of the struct list field is irrelevant. + * There are no requirements that elements of a list are of the same type. + * There are no requirements for a list head, any struct list can be a list + * head. + */ +struct list { + struct list *next, *prev; +}; + +/** + * Initialize the list as an empty list. + * + * Example: + * list_init(&bar->list_of_foos); + * + * @param The list to initialized. + */ +static void +list_init(struct list *list) +{ + list->next = list->prev = list; +} + +static inline void +__list_add(struct list *entry, + struct list *prev, struct list *next) +{ + next->prev = entry; + entry->next = next; + entry->prev = prev; + prev->next = entry; +} + +/** + * Insert a new element after the given list head. The new element does not + * need to be initialised as empty list. + * The list changes from: + * head → some element → ... + * to + * head → new element → older element → ... + * + * Example: + * struct foo *newfoo = malloc(...); + * list_add(&newfoo->entry, &bar->list_of_foos); + * + * @param entry The new element to prepend to the list. + * @param head The existing list. + */ +static inline void +list_add(struct list *entry, struct list *head) +{ + __list_add(entry, head, head->next); +} + +/** + * Append a new element to the end of the list given with this list head. + * + * The list changes from: + * head → some element → ... → lastelement + * to + * head → some element → ... → lastelement → new element + * + * Example: + * struct foo *newfoo = malloc(...); + * list_append(&newfoo->entry, &bar->list_of_foos); + * + * @param entry The new element to prepend to the list. + * @param head The existing list. + */ +static inline void +list_append(struct list *entry, struct list *head) +{ + __list_add(entry, head->prev, head); +} + +static inline void +__list_del(struct list *prev, struct list *next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * Remove the element from the list it is in. Using this function will reset + * the pointers to/from this element so it is removed from the list. It does + * NOT free the element itself or manipulate it otherwise. + * + * Using list_del on a pure list head (like in the example at the top of + * this file) will NOT remove the first element from + * the list but rather reset the list as empty list. + * + * Example: + * list_del(&foo->entry); + * + * @param entry The element to remove. + */ +static inline void +list_del(struct list *entry) +{ + __list_del(entry->prev, entry->next); + list_init(entry); +} + +/** + * Check if the list is empty. + * + * Example: + * list_empty(&bar->list_of_foos); + * + * @return True if the list contains one or more elements or False otherwise. + */ +static inline bool +list_empty(struct list *head) +{ + return head->next == head; +} + +/** + * Replace a list element by another one. This can also be used to replace + * the head of an existing list by another list head. + * + * Example: + * list_replace(&object_foo->entry, &object_bar->entry); + * list_replace(&from->list_head, &into->list_head); + * + * @param old The element being replaced. + * @param new The element to replace @old with. + */ +static inline void +list_replace(struct list *old, struct list *new) +{ + new->next = old->next; + new->next->prev = new; + new->prev = old->prev; + new->prev->next = new; +} + +/** + * Returns a pointer to the container of this list element. + * + * Example: + * struct foo* f; + * f = container_of(&foo->entry, struct foo, entry); + * assert(f == foo); + * + * @param ptr Pointer to the struct list. + * @param type Data type of the list element. + * @param member Member name of the struct list field in the list element. + * @return A pointer to the data struct containing the list head. + */ +#ifndef container_of +#define container_of(ptr, type, member) \ + (type *)((char *)(ptr) - (char *) &((type *)0)->member) +#endif + +/** + * Alias of container_of + */ +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +/** + * Retrieve the first list entry for the given list pointer. + * + * Example: + * struct foo *first; + * first = list_first_entry(&bar->list_of_foos, struct foo, list_of_foos); + * + * @param ptr The list head + * @param type Data type of the list element to retrieve + * @param member Member name of the struct list field in the list element. + * @return A pointer to the first list element. + */ +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + +/** + * Retrieve the last list entry for the given listpointer. + * + * Example: + * struct foo *first; + * first = list_last_entry(&bar->list_of_foos, struct foo, list_of_foos); + * + * @param ptr The list head + * @param type Data type of the list element to retrieve + * @param member Member name of the struct list field in the list element. + * @return A pointer to the last list element. + */ +#define list_last_entry(ptr, type, member) \ + list_entry((ptr)->prev, type, member) + +#define __container_of(ptr, sample, member) \ + (void *)((char *)(ptr) \ + - offsetof(__typeof(*sample), member)) +/** + * Loop through the list given by head and set pos to struct in the list. + * + * Example: + * struct foo *iterator; + * list_foreach(iterator, &bar->list_of_foos, entry) { + * [modify iterator] + * } + * + * This macro is not safe for node deletion. Use list_foreach_safe + * instead. + * + * @param pos Iterator variable of the type of the list elements. + * @param head List head + * @param member Member name of the struct list in the list elements. + * + */ +#define list_foreach(pos, head, member) \ + for (pos = __container_of((head)->next, pos, member); \ + &pos->member != (head); \ + pos = __container_of(pos->member.next, pos, member)) + +/** + * Loop through the list, keeping a backup pointer to the element. This + * macro allows for the deletion of a list element while looping through the + * list. + * + * See list_foreach for more details. + */ +#define list_foreach_safe(pos, tmp, head, member) \ + for (pos = __container_of((head)->next, pos, member), \ + tmp = __container_of(pos->member.next, pos, member); \ + &pos->member != (head); \ + pos = tmp, tmp = __container_of(pos->member.next, tmp, member)) + +/* NULL-Terminated List Interface + * + * The interface below does _not_ use the struct list as described above. + * It is mainly for legacy structures that cannot easily be switched to + * struct list. + * + * This interface is for structs like + * struct foo { + * [...] + * struct foo *next; + * [...] + * }; + * + * The position and field name of "next" are arbitrary. + */ + +/** + * Init the element as null-terminated list. + * + * Example: + * struct foo *list = malloc(); + * nt_list_init(list, next); + * + * @param list The list element that will be the start of the list + * @param member Member name of the field pointing to next struct + */ +#define nt_list_init(_list, _member) \ + (_list)->_member = NULL + +/** + * Returns the next element in the list or NULL on termination. + * + * Example: + * struct foo *element = list; + * while ((element = nt_list_next(element, next)) { } + * + * This macro is not safe for node deletion. Use list_foreach_safe + * instead. + * + * @param list The list or current element. + * @param member Member name of the field pointing to next struct. + */ +#define nt_list_next(_list, _member) \ + (_list)->_member + +/** + * Iterate through each element in the list. + * + * Example: + * struct foo *iterator; + * nt_list_foreach(iterator, list, next) { + * [modify iterator] + * } + * + * @param entry Assigned to the current list element + * @param list The list to iterate through. + * @param member Member name of the field pointing to next struct. + */ +#define nt_list_foreach(_entry, _list, _member) \ + for (_entry = _list; _entry; _entry = (_entry)->_member) + +/** + * Iterate through each element in the list, keeping a backup pointer to the + * element. This macro allows for the deletion of a list element while + * looping through the list. + * + * See nt_list_foreach for more details. + * + * @param entry Assigned to the current list element + * @param tmp The pointer to the next element + * @param list The list to iterate through. + * @param member Member name of the field pointing to next struct. + */ +#define nt_list_foreach_safe(_entry, _tmp, _list, _member) \ + for (_entry = _list, _tmp = (_entry) ? (_entry)->_member : NULL;\ + _entry; \ + _entry = _tmp, _tmp = (_tmp) ? (_tmp)->_member: NULL) + +/** + * Append the element to the end of the list. This macro may be used to + * merge two lists. + * + * Example: + * struct foo *elem = malloc(...); + * nt_list_init(elem, next) + * nt_list_append(elem, list, struct foo, next); + * + * Resulting list order: + * list_item_0 -> list_item_1 -> ... -> elem_item_0 -> elem_item_1 ... + * + * @param entry An entry (or list) to append to the list + * @param list The list to append to. This list must be a valid list, not + * NULL. + * @param type The list type + * @param member Member name of the field pointing to next struct + */ +#define nt_list_append(_entry, _list, _type, _member) \ + do { \ + _type *__iterator = _list; \ + while (__iterator->_member) { __iterator = __iterator->_member;}\ + __iterator->_member = _entry; \ + } while (0) + +/** + * Insert the element at the next position in the list. This macro may be + * used to insert a list into a list. + * + * struct foo *elem = malloc(...); + * nt_list_init(elem, next) + * nt_list_insert(elem, list, struct foo, next); + * + * Resulting list order: + * list_item_0 -> elem_item_0 -> elem_item_1 ... -> list_item_1 -> ... + * + * @param entry An entry (or list) to append to the list + * @param list The list to insert to. This list must be a valid list, not + * NULL. + * @param type The list type + * @param member Member name of the field pointing to next struct + */ +#define nt_list_insert(_entry, _list, _type, _member) \ + do { \ + nt_list_append((_list)->_member, _entry, _type, _member); \ + (_list)->_member = _entry; \ + } while (0) + +/** + * Delete the entry from the list by iterating through the list and + * removing any reference from the list to the entry. + * + * Example: + * struct foo *elem = + * nt_list_del(elem, list, struct foo, next); + * + * @param entry The entry to delete from the list. entry is always + * re-initialized as a null-terminated list. + * @param list The list containing the entry, set to the new list without + * the removed entry. + * @param type The list type + * @param member Member name of the field pointing to the next entry + */ +#define nt_list_del(_entry, _list, _type, _member) \ + do { \ + _type *__e = _entry; \ + if (__e == NULL || _list == NULL) break; \ + if ((_list) == __e) { \ + _list = __e->_member; \ + } else { \ + _type *__prev = _list; \ + while (__prev->_member && __prev->_member != __e) \ + __prev = nt_list_next(__prev, _member); \ + if (__prev->_member) \ + __prev->_member = __e->_member; \ + } \ + nt_list_init(__e, _member); \ + } while(0) + +#endif diff -Nru libxkbcommon-0.1.0~1/src/malloc.c libxkbcommon-0.1.0~2/src/malloc.c --- libxkbcommon-0.1.0~1/src/malloc.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/malloc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,511 +0,0 @@ -/************************************************************ -Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - -Permission to use, copy, modify, and distribute this -software and its documentation for any purpose and without -fee is hereby granted, provided that the above copyright -notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting -documentation, and that the name of Silicon Graphics not be -used in advertising or publicity pertaining to distribution -of the software without specific prior written permission. -Silicon Graphics makes no representation about the suitability -of this software for any purpose. It is provided "as is" -without any express or implied warranty. - -SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON -GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH -THE USE OR PERFORMANCE OF THIS SOFTWARE. - -********************************************************/ - -#include "xkballoc.h" -#include "X11/extensions/XKBcommon.h" -#include "XKBcommonint.h" - -int -XkbcAllocClientMap(struct xkb_desc * xkb, unsigned which, unsigned nTotalTypes) -{ - int i; - struct xkb_client_map * map; - - if (!xkb || ((nTotalTypes > 0) && (nTotalTypes < XkbNumRequiredTypes))) - return BadValue; - - if ((which & XkbKeySymsMask) && - ((!XkbIsLegalKeycode(xkb->min_key_code)) || - (!XkbIsLegalKeycode(xkb->max_key_code)) || - (xkb->max_key_code < xkb->min_key_code))) { -#ifdef DEBUG - fprintf(stderr, "bad keycode (%d,%d) in XkbAllocClientMap\n", - xkb->min_key_code, xkb->max_key_code); -#endif - return BadValue; - } - - if (!xkb->map) { - map = _XkbTypedCalloc(1, struct xkb_client_map); - if (!map) - return BadAlloc; - xkb->map = map; - } - else - map = xkb->map; - - if ((which & XkbKeyTypesMask) && (nTotalTypes > 0)) { - if (!map->types) { - map->types = _XkbTypedCalloc(nTotalTypes, struct xkb_key_type); - if (!map->types) - return BadAlloc; - - map->num_types = 0; - map->size_types = nTotalTypes; - } - else if (map->size_types < nTotalTypes) { - struct xkb_key_type *prev_types = map->types; - - map->types = _XkbTypedRealloc(map->types, nTotalTypes, - struct xkb_key_type); - if (!map->types) { - free(prev_types); - map->num_types = map->size_types = 0; - return BadAlloc; - } - - map->size_types = nTotalTypes; - bzero(&map->types[map->num_types], - (map->size_types - map->num_types) * sizeof(struct xkb_key_type)); - } - } - - if (which & XkbKeySymsMask) { - int nKeys = XkbNumKeys(xkb); - - if (!map->syms) { - map->size_syms = (nKeys * 15) / 10; - map->syms = _XkbTypedCalloc(map->size_syms, uint32_t); - if (!map->syms) { - map->size_syms = 0; - return BadAlloc; - } - map->num_syms = 1; - map->syms[0] = NoSymbol; - } - - if (!map->key_sym_map) { - i = xkb->max_key_code + 1; - map->key_sym_map = _XkbTypedCalloc(i, struct xkb_sym_map); - if (!map->key_sym_map) - return BadAlloc; - } - } - - if (which & XkbModifierMapMask) { - if ((!XkbIsLegalKeycode(xkb->min_key_code)) || - (!XkbIsLegalKeycode(xkb->max_key_code)) || - (xkb->max_key_code < xkb->min_key_code)) - return BadMatch; - - if (!map->modmap) { - i = xkb->max_key_code + 1; - map->modmap = _XkbTypedCalloc(i, unsigned char); - if (!map->modmap) - return BadAlloc; - } - } - - return Success; -} - -int -XkbcAllocServerMap(struct xkb_desc * xkb, unsigned which, unsigned nNewActions) -{ - int i; - struct xkb_server_map * map; - - if (!xkb) - return BadMatch; - - if (!xkb->server) { - map = _XkbTypedCalloc(1, struct xkb_server_map); - if (!map) - return BadAlloc; - - for (i = 0; i < XkbNumVirtualMods; i++) - map->vmods[i] = XkbNoModifierMask; - - xkb->server = map; - } - else - map = xkb->server; - - if (which & XkbExplicitComponentsMask) { - if ((!XkbIsLegalKeycode(xkb->min_key_code)) || - (!XkbIsLegalKeycode(xkb->max_key_code)) || - (xkb->max_key_code < xkb->min_key_code)) - return BadMatch; - - if (!map->explicit) { - i = xkb->max_key_code + 1; - map->explicit = _XkbTypedCalloc(i, unsigned char); - if (!map->explicit) - return BadAlloc; - } - } - - if (which&XkbKeyActionsMask) { - if ((!XkbIsLegalKeycode(xkb->min_key_code)) || - (!XkbIsLegalKeycode(xkb->max_key_code)) || - (xkb->max_key_code < xkb->min_key_code)) - return BadMatch; - - if (nNewActions < 1) - nNewActions = 1; - - if (!map->acts) { - map->acts = _XkbTypedCalloc(nNewActions + 1, union xkb_action); - if (!map->acts) - return BadAlloc; - map->num_acts = 1; - map->size_acts = nNewActions + 1; - } - else if ((map->size_acts - map->num_acts) < nNewActions) { - unsigned need; - union xkb_action *prev_acts = map->acts; - - need = map->num_acts + nNewActions; - map->acts = _XkbTypedRealloc(map->acts, need, union xkb_action); - if (!map->acts) { - free(prev_acts); - map->num_acts = map->size_acts = 0; - return BadAlloc; - } - - map->size_acts = need; - bzero(&map->acts[map->num_acts], - (map->size_acts - map->num_acts) * sizeof(union xkb_action)); - } - - if (!map->key_acts) { - i = xkb->max_key_code + 1; - map->key_acts = _XkbTypedCalloc(i, unsigned short); - if (!map->key_acts) - return BadAlloc; - } - } - - if (which & XkbKeyBehaviorsMask) { - if ((!XkbIsLegalKeycode(xkb->min_key_code)) || - (!XkbIsLegalKeycode(xkb->max_key_code)) || - (xkb->max_key_code < xkb->min_key_code)) - return BadMatch; - - if (!map->behaviors) { - i = xkb->max_key_code + 1; - map->behaviors = _XkbTypedCalloc(i, struct xkb_behavior); - if (!map->behaviors) - return BadAlloc; - } - } - - if (which & XkbVirtualModMapMask) { - if ((!XkbIsLegalKeycode(xkb->min_key_code)) || - (!XkbIsLegalKeycode(xkb->max_key_code)) || - (xkb->max_key_code < xkb->min_key_code)) - return BadMatch; - - if (!map->vmodmap) { - i = xkb->max_key_code + 1; - map->vmodmap = _XkbTypedCalloc(i, uint32_t); - if (!map->vmodmap) - return BadAlloc; - } - } - - return Success; -} - -int -XkbcCopyKeyType(struct xkb_key_type * from, struct xkb_key_type * into) -{ - if (!from || !into) - return BadMatch; - - if (into->map) { - free(into->map); - into->map = NULL; - } - if (into->preserve) { - free(into->preserve); - into->preserve= NULL; - } - if (into->level_names) { - free(into->level_names); - into->level_names = NULL; - } - - *into = *from; - - if (from->map && (into->map_count > 0)) { - into->map = _XkbTypedCalloc(into->map_count, struct xkb_kt_map_entry); - if (!into->map) - return BadAlloc; - memcpy(into->map, from->map, - into->map_count * sizeof(struct xkb_kt_map_entry)); - } - - if (from->preserve && (into->map_count > 0)) { - into->preserve = _XkbTypedCalloc(into->map_count, struct xkb_mods); - if (!into->preserve) - return BadAlloc; - memcpy(into->preserve, from->preserve, - into->map_count * sizeof(struct xkb_mods)); - } - - if (from->level_names && (into->num_levels > 0)) { - into->level_names = _XkbTypedCalloc(into->num_levels, uint32_t); - if (!into->level_names) - return BadAlloc; - memcpy(into->level_names, from->level_names, - into->num_levels * sizeof(uint32_t)); - } - - return Success; -} - -uint32_t * -XkbcResizeKeySyms(struct xkb_desc * xkb, int key, int needed) -{ - int i, nSyms, nKeySyms; - unsigned nOldSyms; - uint32_t *newSyms; - - if (needed == 0) { - xkb->map->key_sym_map[key].offset = 0; - return xkb->map->syms; - } - - nOldSyms = XkbKeyNumSyms(xkb, key); - if (nOldSyms >= (unsigned)needed) - return XkbKeySymsPtr(xkb, key); - - if (xkb->map->size_syms - xkb->map->num_syms >= (unsigned)needed) { - if (nOldSyms > 0) - memcpy(&xkb->map->syms[xkb->map->num_syms], - XkbKeySymsPtr(xkb, key), nOldSyms * sizeof(uint32_t)); - - if ((needed - nOldSyms) > 0) - bzero(&xkb->map->syms[xkb->map->num_syms + XkbKeyNumSyms(xkb, key)], - (needed - nOldSyms) * sizeof(uint32_t)); - - xkb->map->key_sym_map[key].offset = xkb->map->num_syms; - xkb->map->num_syms += needed; - - return &xkb->map->syms[xkb->map->key_sym_map[key].offset]; - } - - xkb->map->size_syms += (needed > 32 ? needed : 32); - newSyms = _XkbTypedCalloc(xkb->map->size_syms, uint32_t); - if (!newSyms) - return NULL; - - newSyms[0] = NoSymbol; - nSyms = 1; - for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) { - int nCopy; - - nCopy = nKeySyms = XkbKeyNumSyms(xkb, i); - if ((nKeySyms == 0) && (i != key)) - continue; - - if (i == key) - nKeySyms = needed; - if (nCopy != 0) - memcpy(&newSyms[nSyms], XkbKeySymsPtr(xkb, i), - nCopy * sizeof(uint32_t)); - if (nKeySyms > nCopy) - bzero(&newSyms[nSyms+nCopy], (nKeySyms - nCopy) * sizeof(uint32_t)); - - xkb->map->key_sym_map[i].offset = nSyms; - nSyms += nKeySyms; - } - - free(xkb->map->syms); - xkb->map->syms = newSyms; - xkb->map->num_syms = nSyms; - - return &xkb->map->syms[xkb->map->key_sym_map[key].offset]; -} - -union xkb_action * -XkbcResizeKeyActions(struct xkb_desc * xkb, int key, int needed) -{ - int i, nActs; - union xkb_action *newActs; - - if (needed == 0) { - xkb->server->key_acts[key] = 0; - return NULL; - } - - if (XkbKeyHasActions(xkb, key) && - (XkbKeyNumSyms(xkb, key) >= (unsigned)needed)) - return XkbKeyActionsPtr(xkb, key); - - if (xkb->server->size_acts - xkb->server->num_acts >= (unsigned)needed) { - xkb->server->key_acts[key] = xkb->server->num_acts; - xkb->server->num_acts += needed; - - return &xkb->server->acts[xkb->server->key_acts[key]]; - } - - xkb->server->size_acts = xkb->server->num_acts + needed + 8; - newActs = _XkbTypedCalloc(xkb->server->size_acts, union xkb_action); - if (!newActs) - return NULL; - newActs[0].type = XkbSA_NoAction; - nActs = 1; - - for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) { - int nKeyActs, nCopy; - - if ((xkb->server->key_acts[i] == 0) && (i != key)) - continue; - - nCopy = nKeyActs = XkbKeyNumActions(xkb, i); - if (i == key) { - nKeyActs= needed; - if (needed < nCopy) - nCopy = needed; - } - - if (nCopy > 0) - memcpy(&newActs[nActs], XkbKeyActionsPtr(xkb, i), - nCopy * sizeof(union xkb_action)); - if (nCopy < nKeyActs) - bzero(&newActs[nActs + nCopy], - (nKeyActs - nCopy) * sizeof(union xkb_action)); - - xkb->server->key_acts[i] = nActs; - nActs += nKeyActs; - } - - free(xkb->server->acts); - xkb->server->acts = newActs; - xkb->server->num_acts = nActs; - - return &xkb->server->acts[xkb->server->key_acts[key]]; -} - -void -XkbcFreeClientMap(struct xkb_desc * xkb, unsigned what, Bool freeMap) -{ - struct xkb_client_map * map; - - if (!xkb || !xkb->map) - return; - - if (freeMap) - what = XkbAllClientInfoMask; - map = xkb->map; - - if (what & XkbKeyTypesMask) { - if (map->types) { - if (map->num_types > 0) { - int i; - struct xkb_key_type * type; - - for (i = 0, type = map->types; i < map->num_types; i++, type++) { - if (type->map) { - free(type->map); - type->map = NULL; - } - if (type->preserve) { - free(type->preserve); - type->preserve = NULL; - } - type->map_count = 0; - if (type->level_names) { - free(type->level_names); - type->level_names = NULL; - } - } - } - free(map->types); - map->num_types = map->size_types = 0; - map->types = NULL; - } - } - - if (what & XkbKeySymsMask) { - if (map->key_sym_map) { - free(map->key_sym_map); - map->key_sym_map = NULL; - } - if (map->syms) { - free(map->syms); - map->size_syms = map->num_syms = 0; - map->syms = NULL; - } - } - - if ((what & XkbModifierMapMask) && map->modmap) { - free(map->modmap); - map->modmap = NULL; - } - - if (freeMap) { - free(xkb->map); - xkb->map = NULL; - } -} - -void -XkbcFreeServerMap(struct xkb_desc * xkb, unsigned what, Bool freeMap) -{ - struct xkb_server_map * map; - - if (!xkb || !xkb->server) - return; - - if (freeMap) - what = XkbAllServerInfoMask; - map = xkb->server; - - if ((what & XkbExplicitComponentsMask) && map->explicit) { - free(map->explicit); - map->explicit = NULL; - } - - if (what & XkbKeyActionsMask) { - if (map->key_acts) { - free(map->key_acts); - map->key_acts = NULL; - } - if (map->acts) { - free(map->acts); - map->num_acts = map->size_acts = 0; - map->acts = NULL; - } - } - - if ((what & XkbKeyBehaviorsMask) && map->behaviors) { - free(map->behaviors); - map->behaviors = NULL; - } - - if ((what & XkbVirtualModMapMask) && map->vmodmap) { - free(map->vmodmap); - map->vmodmap = NULL; - } - - if (freeMap) { - free(xkb->server); - xkb->server = NULL; - } -} diff -Nru libxkbcommon-0.1.0~1/src/map.c libxkbcommon-0.1.0~2/src/map.c --- libxkbcommon-0.1.0~1/src/map.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/map.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,422 @@ +/** + * 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 + */ + +/************************************************************ + * 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 "xkb-priv.h" +#include "text.h" + +/** + * Returns the total number of modifiers active in the keymap. + */ +XKB_EXPORT xkb_mod_index_t +xkb_map_num_mods(struct xkb_keymap *keymap) +{ + xkb_mod_index_t i; + + for (i = 0; i < XkbNumVirtualMods; i++) + if (!keymap->vmod_names[i]) + break; + + /* We always have all the core modifiers (for now), plus any virtual + * modifiers we may have defined. */ + return i + XkbNumModifiers; +} + +/** + * Return the name for a given modifier. + */ +XKB_EXPORT const char * +xkb_map_mod_get_name(struct xkb_keymap *keymap, xkb_mod_index_t idx) +{ + const char *name; + + if (idx >= xkb_map_num_mods(keymap)) + return NULL; + + /* First try to find a legacy modifier name. If that fails, try to + * find a virtual mod name. */ + name = ModIndexToName(idx); + if (!name) + name = keymap->vmod_names[idx - XkbNumModifiers]; + + return name; +} + +/** + * Returns the index for a named modifier. + */ +XKB_EXPORT xkb_mod_index_t +xkb_map_mod_get_index(struct xkb_keymap *keymap, const char *name) +{ + xkb_mod_index_t i; + + i = ModNameToIndex(name); + if (i != XKB_MOD_INVALID) + return i; + + for (i = 0; i < XkbNumVirtualMods && keymap->vmod_names[i]; i++) { + if (istreq(name, keymap->vmod_names[i])) + return i + XkbNumModifiers; + } + + return XKB_MOD_INVALID; +} + +/** + * Return the total number of active groups in the keymap. + */ +XKB_EXPORT xkb_group_index_t +xkb_map_num_groups(struct xkb_keymap *keymap) +{ + xkb_group_index_t ret = 0; + xkb_group_index_t i; + + for (i = 0; i < XkbNumKbdGroups; i++) + if (keymap->groups[i].mask) + ret++; + + return ret; +} + +/** + * Returns the name for a given group. + */ +XKB_EXPORT const char * +xkb_map_group_get_name(struct xkb_keymap *keymap, xkb_group_index_t idx) +{ + if (idx >= xkb_map_num_groups(keymap)) + return NULL; + + return keymap->group_names[idx]; +} + +/** + * Returns the index for a named group. + */ +XKB_EXPORT xkb_group_index_t +xkb_map_group_get_index(struct xkb_keymap *keymap, const char *name) +{ + xkb_group_index_t num_groups = xkb_map_num_groups(keymap); + xkb_group_index_t i; + + for (i = 0; i < num_groups; i++) + if (istreq(keymap->group_names[i], name)) + return i; + + return XKB_GROUP_INVALID; +} + +/** + * Returns the number of groups active for a particular key. + */ +XKB_EXPORT xkb_group_index_t +xkb_key_num_groups(struct xkb_keymap *keymap, xkb_keycode_t kc) +{ + if (XkbKeycodeInRange(keymap, kc)) + return XkbKey(keymap, kc)->num_groups; + return 0; +} + +/** + * Return the total number of active LEDs in the keymap. + */ +XKB_EXPORT xkb_led_index_t +xkb_map_num_leds(struct xkb_keymap *keymap) +{ + xkb_led_index_t ret = 0; + xkb_led_index_t i; + + for (i = 0; i < XkbNumIndicators; i++) + if (keymap->indicators[i].which_groups || + keymap->indicators[i].which_mods || + keymap->indicators[i].ctrls) + ret++; + + return ret; +} + +/** + * Returns the name for a given group. + */ +XKB_EXPORT const char * +xkb_map_led_get_name(struct xkb_keymap *keymap, xkb_led_index_t idx) +{ + if (idx >= xkb_map_num_leds(keymap)) + return NULL; + + return keymap->indicator_names[idx]; +} + +/** + * Returns the index for a named group. + */ +XKB_EXPORT xkb_group_index_t +xkb_map_led_get_index(struct xkb_keymap *keymap, const char *name) +{ + xkb_led_index_t num_leds = xkb_map_num_leds(keymap); + xkb_led_index_t i; + + for (i = 0; i < num_leds; i++) + if (istreq(keymap->indicator_names[i], name)) + return i; + + return XKB_LED_INVALID; +} + +static struct xkb_kt_map_entry * +get_entry_for_key_state(struct xkb_state *state, xkb_keycode_t kc) +{ + struct xkb_keymap *keymap = xkb_state_get_map(state); + xkb_group_index_t group; + struct xkb_key_type *type; + xkb_mod_mask_t active_mods; + unsigned int i; + + group = xkb_key_get_group(state, kc); + if (group == XKB_GROUP_INVALID) + return NULL; + + type = XkbKeyType(keymap, XkbKey(keymap, kc), group); + active_mods = xkb_state_serialize_mods(state, XKB_STATE_EFFECTIVE); + active_mods &= type->mods.mask; + + for (i = 0; i < type->num_entries; i++) + if (type->map[i].mods.mask == active_mods) + return &type->map[i]; + + return NULL; +} + +/** + * Returns the level to use for the given key and state, or + * XKB_LEVEL_INVALID. + */ +xkb_level_index_t +xkb_key_get_level(struct xkb_state *state, xkb_keycode_t kc, + xkb_group_index_t group) +{ + struct xkb_kt_map_entry *entry; + + if (!XkbKeycodeInRange(xkb_state_get_map(state), kc)) + return XKB_LEVEL_INVALID; + + entry = get_entry_for_key_state(state, kc); + + /* If we don't find an explicit match the default is 0. */ + if (!entry) + return 0; + + return entry->level; +} + +/** + * Returns the group to use for the given key and state, taking + * wrapping/clamping/etc into account, or XKB_GROUP_INVALID. + */ +xkb_group_index_t +xkb_key_get_group(struct xkb_state *state, xkb_keycode_t kc) +{ + struct xkb_keymap *keymap = xkb_state_get_map(state); + xkb_group_index_t ret = xkb_state_serialize_group(state, + XKB_STATE_EFFECTIVE); + struct xkb_key *key; + + if (!XkbKeycodeInRange(keymap, kc)) + return XKB_GROUP_INVALID; + + key = XkbKey(keymap, kc); + if (key->num_groups == 0) + return XKB_GROUP_INVALID; + + if (ret < key->num_groups) + return ret; + + switch (key->out_of_range_group_action) { + case XkbRedirectIntoRange: + ret = key->out_of_range_group_number; + if (ret >= key->num_groups) + ret = 0; + break; + + case XkbClampIntoRange: + ret = key->num_groups - 1; + break; + + case XkbWrapIntoRange: + default: + ret %= key->num_groups; + break; + } + + return ret; +} + +/** + * As below, but takes an explicit group/level rather than state. + */ +int +xkb_key_get_syms_by_level(struct xkb_keymap *keymap, struct xkb_key *key, + xkb_group_index_t group, xkb_level_index_t level, + const xkb_keysym_t **syms_out) +{ + int num_syms; + + if (group >= key->num_groups) + goto err; + if (level >= XkbKeyGroupWidth(keymap, key, group)) + goto err; + + num_syms = XkbKeyNumSyms(key, group, level); + if (num_syms == 0) + goto err; + + *syms_out = XkbKeySymEntry(key, group, level); + return num_syms; + +err: + *syms_out = NULL; + return 0; +} + +/** + * 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_key_get_syms(struct xkb_state *state, xkb_keycode_t kc, + const xkb_keysym_t **syms_out) +{ + struct xkb_keymap *keymap = xkb_state_get_map(state); + struct xkb_key *key; + xkb_group_index_t group; + xkb_level_index_t level; + + if (!state || !XkbKeycodeInRange(keymap, kc)) + return -1; + + key = XkbKey(keymap, kc); + + group = xkb_key_get_group(state, kc); + if (group == XKB_GROUP_INVALID) + goto err; + + level = xkb_key_get_level(state, kc, group); + if (level == XKB_LEVEL_INVALID) + goto err; + + return xkb_key_get_syms_by_level(keymap, key, group, level, syms_out); + +err: + *syms_out = NULL; + return 0; +} + +/** + * Simple boolean specifying whether or not the key should repeat. + */ +XKB_EXPORT int +xkb_key_repeats(struct xkb_keymap *keymap, xkb_keycode_t kc) +{ + if (!XkbKeycodeInRange(keymap, kc)) + return 0; + return XkbKey(keymap, kc)->repeats; +} + +static xkb_mod_mask_t +key_get_consumed(struct xkb_state *state, xkb_keycode_t kc) +{ + struct xkb_kt_map_entry *entry; + + entry = get_entry_for_key_state(state, kc); + if (!entry) + return 0; + + return entry->mods.mask & ~entry->preserve.mask; +} + +/** + * Tests to see if a modifier is used up by our translation of a + * keycode to keysyms, taking note of the current modifier state and + * the appropriate key type's preserve information, if any. This allows + * the user to mask out the modifier in later processing of the + * modifiers, e.g. when implementing hot keys or accelerators. + * + * See also, for example: + * - XkbTranslateKeyCode(3), mod_rtrn retrun value, from libX11. + * - gdk_keymap_translate_keyboard_state, consumed_modifiers return value, + * from gtk+. + */ +XKB_EXPORT int +xkb_key_mod_index_is_consumed(struct xkb_state *state, xkb_keycode_t kc, + xkb_mod_index_t idx) +{ + if (!XkbKeycodeInRange(xkb_state_get_map(state), kc)) + return 0; + + return !!((1 << idx) & key_get_consumed(state, kc)); +} + +/** + * Calculates which modifiers should be consumed during key processing, + * and returns the mask with all these modifiers removed. e.g. if + * given a state of Alt and Shift active for a two-level alphabetic + * key containing plus and equal on the first and second level + * respectively, will return a mask of only Alt, as Shift has been + * consumed by the type handling. + */ +XKB_EXPORT xkb_mod_mask_t +xkb_key_mod_mask_remove_consumed(struct xkb_state *state, xkb_keycode_t kc, + xkb_mod_mask_t mask) +{ + if (!XkbKeycodeInRange(xkb_state_get_map(state), kc)) + return mask; + + return mask & ~key_get_consumed(state, kc); +} diff -Nru libxkbcommon-0.1.0~1/src/maprules.c libxkbcommon-0.1.0~2/src/maprules.c --- libxkbcommon-0.1.0~1/src/maprules.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/maprules.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1041 +0,0 @@ -/************************************************************ - 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. - - ********************************************************/ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include "xkbrules.h" -#include "X11/extensions/XKBcommon.h" -#include "XKBcommonint.h" - -#ifdef HAVE_DIX_CONFIG_H -#include -#elif defined(HAVE_CONFIG_H) -#include -#endif - -#include -#include -#include - -#define X_INCLUDE_STRING_H -#define XOS_USE_NO_LOCKING -#include - -#include -#include -#include -#include - -#ifdef DEBUG -#define PR_DEBUG(s) fprintf(stderr,s) -#define PR_DEBUG1(s,a) fprintf(stderr,s,a) -#define PR_DEBUG2(s,a,b) fprintf(stderr,s,a,b) -#else -#define PR_DEBUG(s) -#define PR_DEBUG1(s,a) -#define PR_DEBUG2(s,a,b) -#endif - -/***====================================================================***/ - -#define DFLT_LINE_SIZE 128 - -typedef struct { - int line_num; - int sz_line; - int num_line; - char buf[DFLT_LINE_SIZE]; - char * line; -} InputLine; - -static void -InitInputLine(InputLine *line) -{ - line->line_num= 1; - line->num_line= 0; - line->sz_line= DFLT_LINE_SIZE; - line->line= line->buf; - return; -} - -static void -FreeInputLine(InputLine *line) -{ - if (line->line!=line->buf) - free(line->line); - line->line_num= 1; - line->num_line= 0; - line->sz_line= DFLT_LINE_SIZE; - line->line= line->buf; - return; -} - -static int -InputLineAddChar(InputLine *line,int ch) -{ - if (line->num_line>=line->sz_line) { - if (line->line==line->buf) { - line->line= (char *)malloc(line->sz_line*2); - memcpy(line->line,line->buf,line->sz_line); - } - else { - line->line=(char *)realloc((char *)line->line,line->sz_line*2); - } - line->sz_line*= 2; - } - line->line[line->num_line++]= ch; - return ch; -} - -#define ADD_CHAR(l,c) ((l)->num_line<(l)->sz_line?\ - (int)((l)->line[(l)->num_line++]= (c)):\ - InputLineAddChar(l,c)) - -static Bool -GetInputLine(FILE *file,InputLine *line,Bool checkbang) -{ -int ch; -Bool endOfFile,spacePending,slashPending,inComment; - - endOfFile= False; - while ((!endOfFile)&&(line->num_line==0)) { - spacePending= slashPending= inComment= False; - while (((ch=getc(file))!='\n')&&(ch!=EOF)) { - if (ch=='\\') { - if ((ch=getc(file))==EOF) - break; - if (ch=='\n') { - inComment= False; - ch= ' '; - line->line_num++; - } - } - if (inComment) - continue; - if (ch=='/') { - if (slashPending) { - inComment= True; - slashPending= False; - } - else { - slashPending= True; - } - continue; - } - else if (slashPending) { - if (spacePending) { - ADD_CHAR(line,' '); - spacePending= False; - } - ADD_CHAR(line,'/'); - slashPending= False; - } - if (isspace(ch)) { - while (isspace(ch)&&(ch!='\n')&&(ch!=EOF)) { - ch= getc(file); - } - if (ch==EOF) - break; - if ((ch!='\n')&&(line->num_line>0)) - spacePending= True; - ungetc(ch,file); - } - else { - if (spacePending) { - ADD_CHAR(line,' '); - spacePending= False; - } - if (checkbang && ch=='!') { - if (line->num_line!=0) { - PR_DEBUG("The '!' legal only at start of line\n"); - PR_DEBUG("Line containing '!' ignored\n"); - line->num_line= 0; - inComment= 0; - break; - } - - } - ADD_CHAR(line,ch); - } - } - if (ch==EOF) - endOfFile= True; -/* else line->num_line++;*/ - } - if ((line->num_line==0)&&(endOfFile)) - return False; - ADD_CHAR(line,'\0'); - return True; -} - -/***====================================================================***/ - -#define MODEL 0 -#define LAYOUT 1 -#define VARIANT 2 -#define OPTION 3 -#define KEYCODES 4 -#define SYMBOLS 5 -#define TYPES 6 -#define COMPAT 7 -#define GEOMETRY 8 -#define KEYMAP 9 -#define MAX_WORDS 10 - -#define PART_MASK 0x000F -#define COMPONENT_MASK 0x03F0 - -static char * cname[MAX_WORDS] = { - "model", "layout", "variant", "option", - "keycodes", "symbols", "types", "compat", "geometry", "keymap" -}; - -typedef struct _RemapSpec { - int number; - int num_remap; - struct { - int word; - int index; - } remap[MAX_WORDS]; -} RemapSpec; - -typedef struct _FileSpec { - char * name[MAX_WORDS]; - struct _FileSpec * pending; -} FileSpec; - -typedef struct { - char * model; - char * layout[XkbNumKbdGroups+1]; - char * variant[XkbNumKbdGroups+1]; - char * options; -} XkbRF_MultiDefsRec, *XkbRF_MultiDefsPtr; - -#define NDX_BUFF_SIZE 4 - -/***====================================================================***/ - -static char* -get_index(char *str, int *ndx) -{ - char ndx_buf[NDX_BUFF_SIZE]; - char *end; - - if (*str != '[') { - *ndx = 0; - return str; - } - str++; - end = strchr(str, ']'); - if (end == NULL) { - *ndx = -1; - return str - 1; - } - if ( (end - str) >= NDX_BUFF_SIZE) { - *ndx = -1; - return end + 1; - } - strncpy(ndx_buf, str, end - str); - ndx_buf[end - str] = '\0'; - *ndx = atoi(ndx_buf); - return end + 1; -} - -static void -SetUpRemap(InputLine *line,RemapSpec *remap) -{ -char * tok,*str; -unsigned present, l_ndx_present, v_ndx_present; -register int i; -int len, ndx; -_Xstrtokparams strtok_buf; -#ifdef DEBUG -Bool found; -#endif - - - l_ndx_present = v_ndx_present = present= 0; - str= &line->line[1]; - len = remap->number; - bzero((char *)remap,sizeof(RemapSpec)); - remap->number = len; - while ((tok=_XStrtok(str," ",strtok_buf))!=NULL) { -#ifdef DEBUG - found= False; -#endif - str= NULL; - if (strcmp(tok,"=")==0) - continue; - for (i=0;i len) { - char *end = get_index(tok+len, &ndx); - if ((i != LAYOUT && i != VARIANT) || - *end != '\0' || ndx == -1) - break; - if (ndx < 1 || ndx > XkbNumKbdGroups) { - PR_DEBUG2("Illegal %s index: %d\n", cname[i], ndx); - PR_DEBUG1("Index must be in range 1..%d\n", - XkbNumKbdGroups); - break; - } - } else { - ndx = 0; - } -#ifdef DEBUG - found= True; -#endif - if (present&(1<remap[remap->num_remap].word= i; - remap->remap[remap->num_remap++].index= ndx; - break; - } - } -#ifdef DEBUG - if (!found) { - fprintf(stderr,"Unknown component \"%s\" ignored\n",tok); - } -#endif - } - if ((present&PART_MASK)==0) { -#ifdef DEBUG - unsigned mask= PART_MASK; - fprintf(stderr,"Mapping needs at least one of "); - for (i=0; (inum_remap= 0; - return; - } - if ((present&COMPONENT_MASK)==0) { - PR_DEBUG("Mapping needs at least one component\n"); - PR_DEBUG("Illegal mapping ignored\n"); - remap->num_remap= 0; - return; - } - if (((present&COMPONENT_MASK)&(1<num_remap= 0; - return; - } - remap->number++; - return; -} - -static Bool -MatchOneOf(char *wanted,char *vals_defined) -{ -char *str,*next; -int want_len= strlen(wanted); - - for (str=vals_defined,next=NULL;str!=NULL;str=next) { - int len; - next= strchr(str,','); - if (next) { - len= next-str; - next++; - } - else { - len= strlen(str); - } - if ((len==want_len)&&(strncmp(wanted,str,len)==0)) - return True; - } - return False; -} - -/***====================================================================***/ - -static Bool -CheckLine( InputLine * line, - RemapSpec * remap, - XkbRF_RulePtr rule, - XkbRF_GroupPtr group) -{ -char * str,*tok; -register int nread, i; -FileSpec tmp; -_Xstrtokparams strtok_buf; -Bool append = False; - - if (line->line[0]=='!') { - if (line->line[1] == '$' || - (line->line[1] == ' ' && line->line[2] == '$')) { - char *gname = strchr(line->line, '$'); - char *words = strchr(gname, ' '); - if(!words) - return False; - *words++ = '\0'; - for (; *words; words++) { - if (*words != '=' && *words != ' ') - break; - } - if (*words == '\0') - return False; - group->name = _XkbDupString(gname); - group->words = _XkbDupString(words); - for (i = 1, words = group->words; *words; words++) { - if ( *words == ' ') { - *words++ = '\0'; - i++; - } - } - group->number = i; - return True; - } else { - SetUpRemap(line,remap); - return False; - } - } - - if (remap->num_remap==0) { - PR_DEBUG("Must have a mapping before first line of data\n"); - PR_DEBUG("Illegal line of data ignored\n"); - return False; - } - bzero((char *)&tmp,sizeof(FileSpec)); - str= line->line; - for (nread= 0;(tok=_XStrtok(str," ",strtok_buf))!=NULL;nread++) { - str= NULL; - if (strcmp(tok,"=")==0) { - nread--; - continue; - } - if (nread>remap->num_remap) { - PR_DEBUG("Too many words on a line\n"); - PR_DEBUG1("Extra word \"%s\" ignored\n",tok); - continue; - } - tmp.name[remap->remap[nread].word]= tok; - if (*tok == '+' || *tok == '|') - append = True; - } - if (nreadnum_remap) { - PR_DEBUG1("Too few words on a line: %s\n", line->line); - PR_DEBUG("line ignored\n"); - return False; - } - - rule->flags= 0; - rule->number = remap->number; - if (tmp.name[OPTION]) - rule->flags|= XkbRF_Option; - else if (append) - rule->flags|= XkbRF_Append; - else - rule->flags|= XkbRF_Normal; - rule->model= _XkbDupString(tmp.name[MODEL]); - rule->layout= _XkbDupString(tmp.name[LAYOUT]); - rule->variant= _XkbDupString(tmp.name[VARIANT]); - rule->option= _XkbDupString(tmp.name[OPTION]); - - rule->keycodes= _XkbDupString(tmp.name[KEYCODES]); - rule->symbols= _XkbDupString(tmp.name[SYMBOLS]); - rule->types= _XkbDupString(tmp.name[TYPES]); - rule->compat= _XkbDupString(tmp.name[COMPAT]); - rule->geometry= _XkbDupString(tmp.name[GEOMETRY]); - rule->keymap= _XkbDupString(tmp.name[KEYMAP]); - - rule->layout_num = rule->variant_num = 0; - for (i = 0; i < nread; i++) { - if (remap->remap[i].index) { - if (remap->remap[i].word == LAYOUT) - rule->layout_num = remap->remap[i].index; - if (remap->remap[i].word == VARIANT) - rule->variant_num = remap->remap[i].index; - } - } - return True; -} - -static char * -_Concat(char *str1,char *str2) -{ -int len; - - if ((!str1)||(!str2)) - return str1; - len= strlen(str1)+strlen(str2)+1; - str1= _XkbTypedRealloc(str1,len,char); - if (str1) - strcat(str1,str2); - return str1; -} - -static void -squeeze_spaces(char *p1) -{ - char *p2; - for (p2 = p1; *p2; p2++) { - *p1 = *p2; - if (*p1 != ' ') p1++; - } - *p1 = '\0'; -} - -static Bool -MakeMultiDefs(XkbRF_MultiDefsPtr mdefs, XkbRF_VarDefsPtr defs) -{ - - bzero((char *)mdefs,sizeof(XkbRF_MultiDefsRec)); - mdefs->model = defs->model; - mdefs->options = _XkbDupString(defs->options); - if (mdefs->options) squeeze_spaces(mdefs->options); - - if (defs->layout) { - if (!strchr(defs->layout, ',')) { - mdefs->layout[0] = defs->layout; - } else { - char *p; - int i; - mdefs->layout[1] = _XkbDupString(defs->layout); - if (mdefs->layout[1] == NULL) - return False; - squeeze_spaces(mdefs->layout[1]); - p = mdefs->layout[1]; - for (i = 2; i <= XkbNumKbdGroups; i++) { - if ((p = strchr(p, ','))) { - *p++ = '\0'; - mdefs->layout[i] = p; - } else { - break; - } - } - if (p && (p = strchr(p, ','))) - *p = '\0'; - } - } - - if (defs->variant) { - if (!strchr(defs->variant, ',')) { - mdefs->variant[0] = defs->variant; - } else { - char *p; - int i; - mdefs->variant[1] = _XkbDupString(defs->variant); - if (mdefs->variant[1] == NULL) - return False; - squeeze_spaces(mdefs->variant[1]); - p = mdefs->variant[1]; - for (i = 2; i <= XkbNumKbdGroups; i++) { - if ((p = strchr(p, ','))) { - *p++ = '\0'; - mdefs->variant[i] = p; - } else { - break; - } - } - if (p && (p = strchr(p, ','))) - *p = '\0'; - } - } - return True; -} - -static void -FreeMultiDefs(XkbRF_MultiDefsPtr defs) -{ - if (defs->options) free(defs->options); - if (defs->layout[1]) free(defs->layout[1]); - if (defs->variant[1]) free(defs->variant[1]); -} - -static void -Apply(char *src, char **dst) -{ - if (src) { - if (*src == '+' || *src == '!') { - *dst= _Concat(*dst, src); - } else { - if (*dst == NULL) - *dst= _XkbDupString(src); - } - } -} - -static void -XkbRF_ApplyRule( XkbRF_RulePtr rule, - struct xkb_component_names * names) -{ - rule->flags&= ~XkbRF_PendingMatch; /* clear the flag because it's applied */ - - Apply(rule->keycodes, &names->keycodes); - Apply(rule->symbols, &names->symbols); - Apply(rule->types, &names->types); - Apply(rule->compat, &names->compat); - Apply(rule->geometry, &names->geometry); - Apply(rule->keymap, &names->keymap); -} - -static Bool -CheckGroup( XkbRF_RulesPtr rules, - char * group_name, - char * name) -{ - int i; - char *p; - XkbRF_GroupPtr group; - - for (i = 0, group = rules->groups; i < rules->num_groups; i++, group++) { - if (! strcmp(group->name, group_name)) { - break; - } - } - if (i == rules->num_groups) - return False; - for (i = 0, p = group->words; i < group->number; i++, p += strlen(p)+1) { - if (! strcmp(p, name)) { - return True; - } - } - return False; -} - -static int -XkbRF_CheckApplyRule( XkbRF_RulePtr rule, - XkbRF_MultiDefsPtr mdefs, - struct xkb_component_names * names, - XkbRF_RulesPtr rules) -{ - Bool pending = False; - - if (rule->model != NULL) { - if(mdefs->model == NULL) - return 0; - if (strcmp(rule->model, "*") == 0) { - pending = True; - } else { - if (rule->model[0] == '$') { - if (!CheckGroup(rules, rule->model, mdefs->model)) - return 0; - } else { - if (strcmp(rule->model, mdefs->model) != 0) - return 0; - } - } - } - if (rule->option != NULL) { - if (mdefs->options == NULL) - return 0; - if ((!MatchOneOf(rule->option,mdefs->options))) - return 0; - } - - if (rule->layout != NULL) { - if(mdefs->layout[rule->layout_num] == NULL || - *mdefs->layout[rule->layout_num] == '\0') - return 0; - if (strcmp(rule->layout, "*") == 0) { - pending = True; - } else { - if (rule->layout[0] == '$') { - if (!CheckGroup(rules, rule->layout, - mdefs->layout[rule->layout_num])) - return 0; - } else { - if (strcmp(rule->layout, mdefs->layout[rule->layout_num]) != 0) - return 0; - } - } - } - if (rule->variant != NULL) { - if (mdefs->variant[rule->variant_num] == NULL || - *mdefs->variant[rule->variant_num] == '\0') - return 0; - if (strcmp(rule->variant, "*") == 0) { - pending = True; - } else { - if (rule->variant[0] == '$') { - if (!CheckGroup(rules, rule->variant, - mdefs->variant[rule->variant_num])) - return 0; - } else { - if (strcmp(rule->variant, - mdefs->variant[rule->variant_num]) != 0) - return 0; - } - } - } - if (pending) { - rule->flags|= XkbRF_PendingMatch; - return rule->number; - } - /* exact match, apply it now */ - XkbRF_ApplyRule(rule,names); - return rule->number; -} - -static void -XkbRF_ClearPartialMatches(XkbRF_RulesPtr rules) -{ -register int i; -XkbRF_RulePtr rule; - - for (i=0,rule=rules->rules;inum_rules;i++,rule++) { - rule->flags&= ~XkbRF_PendingMatch; - } -} - -static void -XkbRF_ApplyPartialMatches(XkbRF_RulesPtr rules,struct xkb_component_names * names) -{ -int i; -XkbRF_RulePtr rule; - - for (rule = rules->rules, i = 0; i < rules->num_rules; i++, rule++) { - if ((rule->flags&XkbRF_PendingMatch)==0) - continue; - XkbRF_ApplyRule(rule,names); - } -} - -static void -XkbRF_CheckApplyRules( XkbRF_RulesPtr rules, - XkbRF_MultiDefsPtr mdefs, - struct xkb_component_names * names, - int flags) -{ -int i; -XkbRF_RulePtr rule; -int skip; - - for (rule = rules->rules, i=0; i < rules->num_rules; rule++, i++) { - if ((rule->flags & flags) != flags) - continue; - skip = XkbRF_CheckApplyRule(rule, mdefs, names, rules); - if (skip && !(flags & XkbRF_Option)) { - for ( ;(i < rules->num_rules) && (rule->number == skip); - rule++, i++); - rule--; i--; - } - } -} - -/***====================================================================***/ - -static char * -XkbRF_SubstituteVars(char *name, XkbRF_MultiDefsPtr mdefs) -{ -char *str, *outstr, *orig, *var; -int len, ndx; - - orig= name; - str= index(name,'%'); - if (str==NULL) - return name; - len= strlen(name); - while (str!=NULL) { - char pfx= str[1]; - int extra_len= 0; - if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) { - extra_len= 1; - str++; - } - else if (pfx=='(') { - extra_len= 2; - str++; - } - var = str + 1; - str = get_index(var + 1, &ndx); - if (ndx == -1) { - str = index(str,'%'); - continue; - } - if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx]) - len+= strlen(mdefs->layout[ndx])+extra_len; - else if ((*var=='m')&&mdefs->model) - len+= strlen(mdefs->model)+extra_len; - else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx]) - len+= strlen(mdefs->variant[ndx])+extra_len; - if ((pfx=='(')&&(*str==')')) { - str++; - } - str= index(&str[0],'%'); - } - name= (char *)malloc(len+1); - str= orig; - outstr= name; - while (*str!='\0') { - if (str[0]=='%') { - char pfx,sfx; - str++; - pfx= str[0]; - sfx= '\0'; - if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) { - str++; - } - else if (pfx=='(') { - sfx= ')'; - str++; - } - else pfx= '\0'; - - var = str; - str = get_index(var + 1, &ndx); - if (ndx == -1) { - continue; - } - if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx]) { - if (pfx) *outstr++= pfx; - strcpy(outstr,mdefs->layout[ndx]); - outstr+= strlen(mdefs->layout[ndx]); - if (sfx) *outstr++= sfx; - } - else if ((*var=='m')&&(mdefs->model)) { - if (pfx) *outstr++= pfx; - strcpy(outstr,mdefs->model); - outstr+= strlen(mdefs->model); - if (sfx) *outstr++= sfx; - } - else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx]) { - if (pfx) *outstr++= pfx; - strcpy(outstr,mdefs->variant[ndx]); - outstr+= strlen(mdefs->variant[ndx]); - if (sfx) *outstr++= sfx; - } - if ((pfx=='(')&&(*str==')')) - str++; - } - else { - *outstr++= *str++; - } - } - *outstr++= '\0'; - if (orig!=name) - free(orig); - return name; -} - -/***====================================================================***/ - -Bool -XkbcRF_GetComponents( XkbRF_RulesPtr rules, - XkbRF_VarDefsPtr defs, - struct xkb_component_names * names) -{ - XkbRF_MultiDefsRec mdefs; - - MakeMultiDefs(&mdefs, defs); - - bzero((char *)names,sizeof(struct xkb_component_names)); - XkbRF_ClearPartialMatches(rules); - XkbRF_CheckApplyRules(rules, &mdefs, names, XkbRF_Normal); - XkbRF_ApplyPartialMatches(rules, names); - XkbRF_CheckApplyRules(rules, &mdefs, names, XkbRF_Append); - XkbRF_ApplyPartialMatches(rules, names); - XkbRF_CheckApplyRules(rules, &mdefs, names, XkbRF_Option); - XkbRF_ApplyPartialMatches(rules, names); - - if (names->keycodes) - names->keycodes= XkbRF_SubstituteVars(names->keycodes, &mdefs); - if (names->symbols) - names->symbols= XkbRF_SubstituteVars(names->symbols, &mdefs); - if (names->types) - names->types= XkbRF_SubstituteVars(names->types, &mdefs); - if (names->compat) - names->compat= XkbRF_SubstituteVars(names->compat, &mdefs); - if (names->geometry) - names->geometry= XkbRF_SubstituteVars(names->geometry, &mdefs); - if (names->keymap) - names->keymap= XkbRF_SubstituteVars(names->keymap, &mdefs); - - FreeMultiDefs(&mdefs); - return (names->keycodes && names->symbols && names->types && - names->compat && names->geometry ) || names->keymap; -} - -static XkbRF_RulePtr -XkbcRF_AddRule(XkbRF_RulesPtr rules) -{ - if (rules->sz_rules<1) { - rules->sz_rules= 16; - rules->num_rules= 0; - rules->rules= _XkbTypedCalloc(rules->sz_rules,XkbRF_RuleRec); - } - else if (rules->num_rules>=rules->sz_rules) { - rules->sz_rules*= 2; - rules->rules= _XkbTypedRealloc(rules->rules,rules->sz_rules, - XkbRF_RuleRec); - } - if (!rules->rules) { - rules->sz_rules= rules->num_rules= 0; -#ifdef DEBUG - fprintf(stderr,"Allocation failure in XkbcRF_AddRule\n"); -#endif - return NULL; - } - bzero((char *)&rules->rules[rules->num_rules],sizeof(XkbRF_RuleRec)); - return &rules->rules[rules->num_rules++]; -} - -static XkbRF_GroupPtr -XkbcRF_AddGroup(XkbRF_RulesPtr rules) -{ - if (rules->sz_groups<1) { - rules->sz_groups= 16; - rules->num_groups= 0; - rules->groups= _XkbTypedCalloc(rules->sz_groups,XkbRF_GroupRec); - } - else if (rules->num_groups >= rules->sz_groups) { - rules->sz_groups *= 2; - rules->groups= _XkbTypedRealloc(rules->groups,rules->sz_groups, - XkbRF_GroupRec); - } - if (!rules->groups) { - rules->sz_groups= rules->num_groups= 0; - return NULL; - } - - bzero((char *)&rules->groups[rules->num_groups],sizeof(XkbRF_GroupRec)); - return &rules->groups[rules->num_groups++]; -} - -Bool -XkbcRF_LoadRules(FILE *file, XkbRF_RulesPtr rules) -{ -InputLine line; -RemapSpec remap; -XkbRF_RuleRec trule,*rule; -XkbRF_GroupRec tgroup,*group; - - if (!(rules && file)) - return False; - bzero((char *)&remap,sizeof(RemapSpec)); - bzero((char *)&tgroup,sizeof(XkbRF_GroupRec)); - InitInputLine(&line); - while (GetInputLine(file,&line,True)) { - if (CheckLine(&line,&remap,&trule,&tgroup)) { - if (tgroup.number) { - if ((group= XkbcRF_AddGroup(rules))!=NULL) { - *group= tgroup; - bzero((char *)&tgroup,sizeof(XkbRF_GroupRec)); - } - } else { - if ((rule= XkbcRF_AddRule(rules))!=NULL) { - *rule= trule; - bzero((char *)&trule,sizeof(XkbRF_RuleRec)); - } - } - } - line.num_line= 0; - } - FreeInputLine(&line); - return True; -} - -static void -XkbRF_ClearVarDescriptions(XkbRF_DescribeVarsPtr var) -{ -register int i; - - for (i=0;inum_desc;i++) { - if (var->desc[i].name) - free(var->desc[i].name); - if (var->desc[i].desc) - free(var->desc[i].desc); - var->desc[i].name= var->desc[i].desc= NULL; - } - if (var->desc) - free(var->desc); - var->desc= NULL; - return; -} - -void -XkbcRF_Free(XkbRF_RulesPtr rules,Bool freeRules) -{ -int i; -XkbRF_RulePtr rule; -XkbRF_GroupPtr group; - - if (!rules) - return; - XkbRF_ClearVarDescriptions(&rules->models); - XkbRF_ClearVarDescriptions(&rules->layouts); - XkbRF_ClearVarDescriptions(&rules->variants); - XkbRF_ClearVarDescriptions(&rules->options); - if (rules->extra) { - for (i = 0; i < rules->num_extra; i++) { - XkbRF_ClearVarDescriptions(&rules->extra[i]); - } - free(rules->extra); - rules->num_extra= rules->sz_extra= 0; - rules->extra= NULL; - } - if (rules->rules) { - for (i=0,rule=rules->rules;inum_rules;i++,rule++) { - if (rule->model) free(rule->model); - if (rule->layout) free(rule->layout); - if (rule->variant) free(rule->variant); - if (rule->option) free(rule->option); - if (rule->keycodes) free(rule->keycodes); - if (rule->symbols) free(rule->symbols); - if (rule->types) free(rule->types); - if (rule->compat) free(rule->compat); - if (rule->geometry) free(rule->geometry); - if (rule->keymap) free(rule->keymap); - bzero((char *)rule,sizeof(XkbRF_RuleRec)); - } - free(rules->rules); - rules->num_rules= rules->sz_rules= 0; - rules->rules= NULL; - } - - if (rules->groups) { - for (i=0, group=rules->groups;inum_groups;i++,group++) { - if (group->name) free(group->name); - if (group->words) free(group->words); - } - free(rules->groups); - rules->num_groups= 0; - rules->groups= NULL; - } - if (freeRules) - free(rules); - return; -} diff -Nru libxkbcommon-0.1.0~1/src/misc.c libxkbcommon-0.1.0~2/src/misc.c --- libxkbcommon-0.1.0~1/src/misc.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/misc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,295 +0,0 @@ -/************************************************************ -Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - -Permission to use, copy, modify, and distribute this -software and its documentation for any purpose and without -fee is hereby granted, provided that the above copyright -notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting -documentation, and that the name of Silicon Graphics not be -used in advertising or publicity pertaining to distribution -of the software without specific prior written permission. -Silicon Graphics makes no representation about the suitability -of this software for any purpose. It is provided "as is" -without any express or implied warranty. - -SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON -GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH -THE USE OR PERFORMANCE OF THIS SOFTWARE. - -********************************************************/ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "xkballoc.h" -#include "xkbmisc.h" -#include "X11/extensions/XKBcommon.h" -#include "XKBcommonint.h" -#include - -#define mapSize(m) (sizeof(m) / sizeof(struct xkb_kt_map_entry)) -static struct xkb_kt_map_entry map2Level[]= { - { True, ShiftMask, {1, ShiftMask, 0} } -}; - -static struct xkb_kt_map_entry mapAlpha[]= { - { True, ShiftMask, { 1, ShiftMask, 0 } }, - { True, LockMask, { 0, LockMask, 0 } } -}; - -static struct xkb_mods preAlpha[]= { - { 0, 0, 0 }, - { LockMask, LockMask, 0 } -}; - -#define NL_VMOD_MASK 0 -static struct xkb_kt_map_entry mapKeypad[]= { - { True, ShiftMask, { 1, ShiftMask, 0 } }, - { False, 0, { 1, 0, NL_VMOD_MASK } } -}; - -static struct xkb_key_type canonicalTypes[XkbNumRequiredTypes] = { - { { 0, 0, 0 }, - 1, /* num_levels */ - 0, /* map_count */ - NULL, NULL, - None, NULL - }, - { { ShiftMask, ShiftMask, 0 }, - 2, /* num_levels */ - mapSize(map2Level), /* map_count */ - map2Level, NULL, - None, NULL - }, - { { ShiftMask|LockMask, ShiftMask|LockMask, 0 }, - 2, /* num_levels */ - mapSize(mapAlpha), /* map_count */ - mapAlpha, preAlpha, - None, NULL - }, - { { ShiftMask, ShiftMask, NL_VMOD_MASK }, - 2, /* num_levels */ - mapSize(mapKeypad), /* map_count */ - mapKeypad, NULL, - None, NULL - } -}; - -int -XkbcInitCanonicalKeyTypes(struct xkb_desc * xkb, unsigned which, int keypadVMod) -{ - struct xkb_client_map * map; - struct xkb_key_type *from, *to; - int rtrn; - - if (!xkb) - return BadMatch; - - rtrn= XkbcAllocClientMap(xkb, XkbKeyTypesMask, XkbNumRequiredTypes); - if (rtrn != Success) - return rtrn; - - map= xkb->map; - if ((which & XkbAllRequiredTypes) == 0) - return Success; - - rtrn = Success; - from = canonicalTypes; - to = map->types; - - if (which & XkbOneLevelMask) - rtrn = XkbcCopyKeyType(&from[XkbOneLevelIndex], &to[XkbOneLevelIndex]); - - if ((which & XkbTwoLevelMask) && (rtrn == Success)) - rtrn = XkbcCopyKeyType(&from[XkbTwoLevelIndex], &to[XkbTwoLevelIndex]); - - if ((which & XkbAlphabeticMask) && (rtrn == Success)) - rtrn = XkbcCopyKeyType(&from[XkbAlphabeticIndex], - &to[XkbAlphabeticIndex]); - - if ((which & XkbKeypadMask) && (rtrn == Success)) { - struct xkb_key_type * type; - - rtrn = XkbcCopyKeyType(&from[XkbKeypadIndex], &to[XkbKeypadIndex]); - type = &to[XkbKeypadIndex]; - - if ((keypadVMod >= 0) && (keypadVMod < XkbNumVirtualMods) && - (rtrn == Success)) { - type->mods.vmods = (1 << keypadVMod); - type->map[0].active = True; - type->map[0].mods.mask = ShiftMask; - type->map[0].mods.real_mods = ShiftMask; - type->map[0].mods.vmods = 0; - type->map[0].level = 1; - type->map[1].active = False; - type->map[1].mods.mask = 0; - type->map[1].mods.real_mods = 0; - type->map[1].mods.vmods = (1 << keypadVMod); - type->map[1].level = 1; - } - } - - return Success; -} - -Bool -XkbcVirtualModsToReal(struct xkb_desc * xkb, unsigned virtual_mask, - unsigned *mask_rtrn) -{ - int i, bit; - unsigned mask; - - if (!xkb) - return False; - if (virtual_mask == 0) { - *mask_rtrn = 0; - return True; - } - if (!xkb->server) - return False; - - for (i = mask = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) { - if (virtual_mask & bit) - mask |= xkb->server->vmods[i]; - } - - *mask_rtrn = mask; - return True; -} - -/* - * All latin-1 alphanumerics, plus parens, slash, minus, underscore and - * wildcards. - */ -static unsigned char componentSpecLegal[] = { - 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 -}; - -void -XkbcEnsureSafeMapName(char *name) -{ - if (!name) - return; - - while (*name!='\0') { - if ((componentSpecLegal[(*name) / 8] & (1 << ((*name) % 8))) == 0) - *name= '_'; - name++; - } -} - -unsigned -_XkbcKSCheckCase(uint32_t ks) -{ - unsigned set = (ks & (~0xff)) >> 8; - unsigned rtrn = 0; - - switch (set) { - case 0: /* latin 1 */ - if ((ks >= XK_A && ks <= XK_Z) || - (ks >= XK_Agrave && ks <= XK_THORN && ks != XK_multiply)) - rtrn |= _XkbKSUpper; - if ((ks >= XK_a && ks <= XK_z) || - (ks >= XK_agrave && ks <= XK_ydiaeresis)) - rtrn |= _XkbKSLower; - break; - case 1: /* latin 2 */ - if ((ks >= XK_Aogonek && ks <= XK_Zabovedot && ks != XK_breve) || - (ks >= XK_Racute && ks<=XK_Tcedilla)) - rtrn |= _XkbKSUpper; - if ((ks >= XK_aogonek && ks <= XK_zabovedot && ks != XK_caron) || - (ks >= XK_racute && ks <= XK_tcedilla)) - rtrn |= _XkbKSLower; - break; - case 2: /* latin 3 */ - if ((ks >= XK_Hstroke && ks <= XK_Jcircumflex) || - (ks >= XK_Cabovedot && ks <= XK_Scircumflex)) - rtrn |= _XkbKSUpper; - if ((ks >= XK_hstroke && ks <= XK_jcircumflex) || - (ks >= XK_cabovedot && ks <= XK_scircumflex)) - rtrn |= _XkbKSLower; - break; - case 3: /* latin 4 */ - if ((ks >= XK_Rcedilla && ks <= XK_Tslash) || - (ks == XK_ENG) || - (ks >= XK_Amacron && ks <= XK_Umacron)) - rtrn |= _XkbKSUpper; - if ((ks >= XK_rcedilla && ks <= XK_tslash) || - (ks == XK_eng) || - (ks >= XK_amacron && ks <= XK_umacron)) - rtrn |= _XkbKSLower; - break; - case 18: /* latin 8 */ - if ((ks == XK_Babovedot) || - (ks >= XK_Dabovedot && ks <= XK_Wacute) || - (ks >= XK_Ygrave && ks <= XK_Fabovedot) || - (ks == XK_Mabovedot) || - (ks == XK_Pabovedot) || - (ks == XK_Sabovedot) || - (ks == XK_Wdiaeresis) || - (ks >= XK_Wcircumflex && ks <= XK_Ycircumflex)) - rtrn |= _XkbKSUpper; - if ((ks == XK_babovedot) || - (ks == XK_dabovedot) || - (ks == XK_fabovedot) || - (ks == XK_mabovedot) || - (ks >= XK_wgrave && ks <= XK_wacute) || - (ks == XK_ygrave) || - (ks >= XK_wdiaeresis && ks <= XK_ycircumflex)) - rtrn |= _XkbKSLower; - break; - case 19: /* latin 9 */ - if (ks == XK_OE || ks == XK_Ydiaeresis) - rtrn |= _XkbKSUpper; - if (ks == XK_oe) - rtrn |= _XkbKSLower; - break; - } - - return rtrn; -} - -#define UNMATCHABLE(c) ((c) == '(' || (c) == ')' || (c) == '/') - -Bool -XkbcNameMatchesPattern(char *name, char *ptrn) -{ - while (ptrn[0] != '\0') { - if (name[0] == '\0') { - if (ptrn[0] == '*') { - ptrn++; - continue; - } - return False; - } - - if (ptrn[0] == '?') { - if (UNMATCHABLE(name[0])) - return False; - } - else if (ptrn[0] == '*') { - if (!UNMATCHABLE(name[0]) && - XkbcNameMatchesPattern(name + 1, ptrn)) - return True; - return XkbcNameMatchesPattern(name, ptrn + 1); - } - else if (ptrn[0] != name[0]) - return False; - - name++; - ptrn++; - } - - /* if we get here, the pattern is exhausted (-:just like me:-) */ - return (name[0] == '\0'); -} diff -Nru libxkbcommon-0.1.0~1/src/state.c libxkbcommon-0.1.0~2/src/state.c --- libxkbcommon-0.1.0~1/src/state.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/state.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,911 @@ +/************************************************************ + * 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 + * + * 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 +#include + +#include "xkb-priv.h" + +struct xkb_filter { + struct xkb_state *state; + union xkb_action action; + xkb_keycode_t kc; + uint32_t priv; + int (*func)(struct xkb_filter *filter, xkb_keycode_t kc, + enum xkb_key_direction direction); + int refcnt; + struct xkb_filter *next; +}; + +struct xkb_state { + xkb_group_index_t base_group; /**< depressed */ + xkb_group_index_t latched_group; + xkb_group_index_t locked_group; + xkb_group_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 */ + + /* + * 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[sizeof(xkb_mod_mask_t) * 8]; + + uint32_t leds; + + int refcnt; + darray(struct xkb_filter) filters; + struct xkb_keymap *keymap; +}; + +static const union xkb_action fake = { .type = XkbSA_NoAction }; + +static const union xkb_action * +xkb_key_get_action(struct xkb_state *state, xkb_keycode_t kc) +{ + xkb_group_index_t group; + xkb_level_index_t level; + struct xkb_key *key = NULL; + + if (XkbKeycodeInRange(state->keymap, kc)) + key = XkbKey(state->keymap, kc); + + if (!key || !key->actions) + return &fake; + + group = xkb_key_get_group(state, kc); + if (group == XKB_GROUP_INVALID) + return &fake; + + level = xkb_key_get_level(state, kc, group); + if (level == XKB_LEVEL_INVALID) + return &fake; + + return XkbKeyActionEntry(key, group, level); +} + +static struct xkb_filter * +xkb_filter_new(struct xkb_state *state) +{ + int old_size = darray_size(state->filters); + 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, old_size); + } + + filter->state = state; + filter->refcnt = 1; + return filter; +} + +/***====================================================================***/ + +static int +xkb_filter_group_set_func(struct xkb_filter *filter, xkb_keycode_t kc, + enum xkb_key_direction direction) +{ + if (kc != filter->kc) { + filter->action.group.flags &= ~XkbSA_ClearLocks; + return 1; + } + + if (direction == XKB_KEY_DOWN) { + filter->refcnt++; + return 0; + } + else if (--filter->refcnt > 0) { + return 0; + } + + if (filter->action.group.flags & XkbSA_GroupAbsolute) + filter->state->base_group = filter->action.group.group; + else + filter->state->base_group = -filter->action.group.group; + if (filter->action.group.flags & XkbSA_ClearLocks) + filter->state->locked_group = 0; + + filter->func = NULL; + + return 1; +} + +static int +xkb_filter_group_set_new(struct xkb_state *state, xkb_keycode_t kc, + const union xkb_action *action) +{ + struct xkb_filter *filter = xkb_filter_new(state); + + if (!filter) /* WSGO */ + return -1; + filter->kc = kc; + filter->func = xkb_filter_group_set_func; + filter->action = *action; + + if (action->group.flags & XkbSA_GroupAbsolute) { + filter->action.group.group = filter->state->base_group; + filter->state->base_group = action->group.group; + } + else { + filter->state->base_group += action->group.group; + } + + return 1; +} + +static int +xkb_filter_group_lock_func(struct xkb_filter *filter, xkb_keycode_t kc, + enum xkb_key_direction direction) +{ + if (kc != filter->kc) + return 1; + + if (direction == XKB_KEY_DOWN) { + filter->refcnt++; + return 0; + } + if (--filter->refcnt > 0) + return 0; + + filter->func = NULL; + return 1; +} + +static int +xkb_filter_group_lock_new(struct xkb_state *state, xkb_keycode_t kc, + const union xkb_action *action) +{ + struct xkb_filter *filter = xkb_filter_new(state); + + if (!filter) + return 0; + + filter->kc = kc; + filter->func = xkb_filter_group_lock_func; + filter->action = *action; + + if (action->group.flags & XkbSA_GroupAbsolute) + filter->state->locked_group = action->group.group; + else + filter->state->locked_group += action->group.group; + + return 1; +} + +static int +xkb_filter_mod_set_func(struct xkb_filter *filter, xkb_keycode_t kc, + enum xkb_key_direction direction) +{ + if (kc != filter->kc) { + filter->action.mods.flags &= ~XkbSA_ClearLocks; + return 1; + } + + if (direction == XKB_KEY_DOWN) { + filter->refcnt++; + return 0; + } + else if (--filter->refcnt > 0) { + return 0; + } + + filter->state->clear_mods = filter->action.mods.mods.mask; + if (filter->action.mods.flags & XkbSA_ClearLocks) + filter->state->locked_mods &= ~filter->action.mods.mods.mask; + + filter->func = NULL; + + return 1; +} + +static int +xkb_filter_mod_set_new(struct xkb_state *state, xkb_keycode_t kc, + const union xkb_action *action) +{ + struct xkb_filter *filter = xkb_filter_new(state); + + if (!filter) /* WSGO */ + return -1; + filter->kc = kc; + filter->func = xkb_filter_mod_set_func; + filter->action = *action; + + filter->state->set_mods = action->mods.mods.mask; + + return 1; +} + +static int +xkb_filter_mod_lock_func(struct xkb_filter *filter, xkb_keycode_t kc, + enum xkb_key_direction direction) +{ + if (kc != filter->kc) + return 1; + + if (direction == XKB_KEY_DOWN) { + filter->refcnt++; + return 0; + } + if (--filter->refcnt > 0) + return 0; + + filter->state->locked_mods &= ~filter->priv; + filter->func = NULL; + return 1; +} + +static int +xkb_filter_mod_lock_new(struct xkb_state *state, xkb_keycode_t kc, + const union xkb_action *action) +{ + struct xkb_filter *filter = xkb_filter_new(state); + + if (!filter) /* WSGO */ + return 0; + + filter->kc = kc; + filter->func = xkb_filter_mod_lock_func; + filter->action = *action; + filter->priv = state->locked_mods & action->mods.mods.mask; + state->locked_mods |= action->mods.mods.mask; + + return 1; +} + +enum xkb_key_latch_state { + NO_LATCH, + LATCH_KEY_DOWN, + LATCH_PENDING, +}; + +static int +xkb_filter_mod_latch_func(struct xkb_filter *filter, xkb_keycode_t kc, + 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(filter->state, kc); + if (action->type == XkbSA_LatchMods && + action->mods.flags == filter->action.mods.flags && + action->mods.mods.mask == filter->action.mods.mods.mask) { + filter->action = *action; + if (filter->action.mods.flags & XkbSA_LatchToLock) { + filter->action.type = XkbSA_LockMods; + filter->func = xkb_filter_mod_lock_func; + filter->state->locked_mods |= filter->action.mods.mods.mask; + } + else { + filter->action.type = XkbSA_SetMods; + filter->func = xkb_filter_mod_set_func; + filter->state->set_mods = filter->action.mods.mods.mask; + } + filter->kc = kc; + filter->state->latched_mods &= ~filter->action.mods.mods.mask; + /* XXX beep beep! */ + return 0; + } + else if (((1 << action->type) & XkbSA_BreakLatch)) { + /* XXX: This may be totally broken, we might need to break the + * latch in the next run after this press? */ + filter->state->latched_mods &= ~filter->action.mods.mods.mask; + filter->func = NULL; + return 1; + } + } + else if (direction == XKB_KEY_UP && kc == filter->kc) { + /* 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 & XkbSA_ClearLocks) && + (filter->state->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) + filter->state->latched_mods &= ~filter->action.mods.mods.mask; + else + filter->state->clear_mods = filter->action.mods.mods.mask; + filter->state->locked_mods &= ~filter->action.mods.mods.mask; + filter->func = NULL; + } + else { + latch = LATCH_PENDING; + filter->state->clear_mods = filter->action.mods.mods.mask; + filter->state->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 1; +} + +static int +xkb_filter_mod_latch_new(struct xkb_state *state, xkb_keycode_t kc, + const union xkb_action *action) +{ + struct xkb_filter *filter = xkb_filter_new(state); + enum xkb_key_latch_state latch = LATCH_KEY_DOWN; + + if (!filter) /* WSGO */ + return -1; + filter->kc = kc; + filter->priv = latch; + filter->func = xkb_filter_mod_latch_func; + filter->action = *action; + + filter->state->set_mods = action->mods.mods.mask; + + return 1; +} + +/** + * 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, xkb_keycode_t kc, + enum xkb_key_direction direction) +{ + struct xkb_filter *filter; + const union xkb_action *act = NULL; + int send = 1; + + /* First run through all the currently active filters and see if any of + * them have claimed this event. */ + darray_foreach(filter, state->filters) { + if (!filter->func) + continue; + send &= filter->func(filter, kc, direction); + } + + if (!send || direction == XKB_KEY_UP) + return; + + act = xkb_key_get_action(state, kc); + switch (act->type) { + case XkbSA_SetMods: + send = xkb_filter_mod_set_new(state, kc, act); + break; + case XkbSA_LatchMods: + send = xkb_filter_mod_latch_new(state, kc, act); + break; + case XkbSA_LockMods: + send = xkb_filter_mod_lock_new(state, kc, act); + break; + case XkbSA_SetGroup: + send = xkb_filter_group_set_new(state, kc, act); + break; +#if 0 + case XkbSA_LatchGroup: + send = xkb_filter_mod_latch_new(state, key, act); + break; +#endif + case XkbSA_LockGroup: + send = xkb_filter_group_lock_new(state, kc, act); + break; + } + + return; +} + +XKB_EXPORT struct xkb_state * +xkb_state_new(struct xkb_keymap *keymap) +{ + struct xkb_state *ret; + + if (!keymap) + return NULL; + + ret = calloc(sizeof(*ret), 1); + if (!ret) + return NULL; + + ret->refcnt = 1; + ret->keymap = xkb_map_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) +{ + state->refcnt--; + assert(state->refcnt >= 0); + if (state->refcnt > 0) + return; + + xkb_map_unref(state->keymap); + darray_free(state->filters); + free(state); +} + +XKB_EXPORT struct xkb_keymap * +xkb_state_get_map(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 led; + + state->leds = 0; + + for (led = 0; led < XkbNumIndicators; led++) { + struct xkb_indicator_map *map = &state->keymap->indicators[led]; + uint32_t mod_mask = 0; + uint32_t group_mask = 0; + + if (!map->which_mods && !map->which_groups && !map->ctrls) + continue; + + if (map->which_mods) { + if (map->which_mods & XkbIM_UseBase) + mod_mask |= state->base_mods; + if (map->which_mods & XkbIM_UseLatched) + mod_mask |= state->latched_mods; + if (map->which_mods & XkbIM_UseLocked) + mod_mask |= state->locked_mods; + if (map->which_mods & XkbIM_UseEffective) + mod_mask |= state->mods; + if ((map->mods.mask & mod_mask)) + state->leds |= (1 << led); + } + else if (map->which_groups) { + if (map->which_mods & XkbIM_UseBase) + group_mask |= (1 << state->base_group); + if (map->which_mods & XkbIM_UseLatched) + group_mask |= (1 << state->latched_group); + if (map->which_mods & XkbIM_UseLocked) + group_mask |= (1 << state->locked_group); + if (map->which_mods & XkbIM_UseEffective) + group_mask |= (1 << state->group); + if ((map->groups & group_mask)) + state->leds |= (1 << led); + } + else if (map->ctrls) { + if ((map->ctrls & state->keymap->enabled_ctrls)) + state->leds |= (1 << led); + } + } +} + +/** + * 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) +{ + state->mods = + (state->base_mods | state->latched_mods | state->locked_mods); + /* FIXME: Clamp/wrap locked_group */ + state->group = state->locked_group + state->base_group + + state->latched_group; + /* FIXME: Clamp/wrap effective group */ + + xkb_state_led_update_all(state); +} + +/** + * Given a particular key event, updates the state structure to reflect the + * new modifiers. + */ +XKB_EXPORT void +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; + + state->set_mods = 0; + state->clear_mods = 0; + + xkb_filter_apply_all(state, kc, direction); + + for (i = 0, bit = 1; state->set_mods; i++, bit <<= 1) { + if (state->set_mods & bit) { + state->mod_key_count[i]++; + state->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->base_mods &= ~bit; + state->mod_key_count[i] = 0; + } + state->clear_mods &= ~bit; + } + } + + xkb_state_update_derived(state); +} + +/** + * 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 void +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_group_index_t base_group, + xkb_group_index_t latched_group, + xkb_group_index_t locked_group) +{ + xkb_mod_mask_t mod; + + state->base_mods = 0; + state->latched_mods = 0; + state->locked_mods = 0; + for (mod = 0; mod < xkb_map_num_mods(state->keymap); mod++) { + xkb_mod_mask_t idx = (1 << mod); + if (base_mods & idx) + state->base_mods |= idx; + if (latched_mods & idx) + state->latched_mods |= idx; + if (locked_mods & idx) + state->locked_mods |= idx; + } + + state->base_group = base_group; + state->latched_group = latched_group; + state->locked_group = locked_group; + + xkb_state_update_derived(state); +} + +/** + * 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_EFFECTIVE) + return state->mods; + + if (type & XKB_STATE_DEPRESSED) + ret |= state->base_mods; + if (type & XKB_STATE_LATCHED) + ret |= state->latched_mods; + if (type & XKB_STATE_LOCKED) + ret |= state->locked_mods; + + return ret; +} + +/** + * Serialises the requested group state, with all the same disclaimers as + * in xkb_state_update_mask. + */ +XKB_EXPORT xkb_group_index_t +xkb_state_serialize_group(struct xkb_state *state, + enum xkb_state_component type) +{ + xkb_group_index_t ret = 0; + + if (type == XKB_STATE_EFFECTIVE) + return state->group; + + if (type & XKB_STATE_DEPRESSED) + ret += state->base_group; + if (type & XKB_STATE_LATCHED) + ret += state->latched_group; + if (type & XKB_STATE_LOCKED) + ret += state->locked_group; + + 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_mod_index_is_active(struct xkb_state *state, + xkb_mod_index_t idx, + enum xkb_state_component type) +{ + int ret = 0; + + if (idx >= xkb_map_num_mods(state->keymap)) + return -1; + + if (type & XKB_STATE_DEPRESSED) + ret |= (state->base_mods & (1 << idx)); + if (type & XKB_STATE_LATCHED) + ret |= (state->latched_mods & (1 << idx)); + if (type & XKB_STATE_LOCKED) + ret |= (state->locked_mods & (1 << idx)); + + return ret; +} + +/** + * Helper function for xkb_state_mod_indices_are_active and + * xkb_state_mod_names_are_active. + */ +static int +match_mod_masks(struct xkb_state *state, enum xkb_state_match match, + uint32_t wanted) +{ + uint32_t active = xkb_state_serialize_mods(state, XKB_STATE_EFFECTIVE); + + if (!(match & XKB_STATE_MATCH_NON_EXCLUSIVE) && (active & ~wanted)) + return 0; + + if (match & XKB_STATE_MATCH_ANY) + return !!(active & wanted); + else + return (active & wanted) == wanted; + + return 0; +} + +/** + * 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_index_t idx = 0; + uint32_t wanted = 0; + int ret = 0; + + va_start(ap, match); + while (1) { + idx = va_arg(ap, xkb_mod_index_t); + if (idx == XKB_MOD_INVALID || + idx >= xkb_map_num_mods(state->keymap)) { + ret = -1; + break; + } + wanted |= (1 << idx); + } + va_end(ap); + + if (ret == -1) + return ret; + + return match_mod_masks(state, 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_map_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 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_index_t idx = 0; + const char *str; + uint32_t wanted = 0; + int ret = 0; + + va_start(ap, match); + while (1) { + str = va_arg(ap, const char *); + if (str == NULL) + break; + idx = xkb_map_mod_get_index(state->keymap, str); + if (idx == XKB_MOD_INVALID) { + ret = -1; + break; + } + wanted |= (1 << idx); + } + va_end(ap); + + if (ret == -1) + return ret; + + return match_mod_masks(state, 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_group_index_is_active(struct xkb_state *state, + xkb_group_index_t idx, + enum xkb_state_component type) +{ + int ret = 0; + + if (idx >= xkb_map_num_groups(state->keymap)) + return -1; + + if (type & XKB_STATE_DEPRESSED) + ret |= (state->base_group == idx); + if (type & XKB_STATE_LATCHED) + ret |= (state->latched_group == idx); + if (type & XKB_STATE_LOCKED) + ret |= (state->locked_group == 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_group_name_is_active(struct xkb_state *state, const char *name, + enum xkb_state_component type) +{ + xkb_group_index_t idx = xkb_map_group_get_index(state->keymap, name); + + if (idx == XKB_GROUP_INVALID) + return -1; + + return xkb_state_group_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 >= xkb_map_num_leds(state->keymap)) + return -1; + + return !!(state->leds & (1 << 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_map_led_get_index(state->keymap, name); + + if (idx == XKB_LED_INVALID) + return -1; + + return xkb_state_led_index_is_active(state, idx); +} diff -Nru libxkbcommon-0.1.0~1/src/text.c libxkbcommon-0.1.0~2/src/text.c --- libxkbcommon-0.1.0~1/src/text.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/text.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,120 +1,118 @@ /************************************************************ - 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 (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. + * ********************************************************/ -#ifdef HAVE_CONFIG_H -#include -#endif -#include "xkbmisc.h" -#include "X11/extensions/XKBcommon.h" -#include "XKBcommonint.h" -#include -#include -#include +#include "text.h" #define BUFFER_SIZE 1024 -static char textBuffer[BUFFER_SIZE]; -static int tbNext = 0; static char * -tbGetBuffer(unsigned int size) +GetBuffer(size_t size) { + static char buffer[BUFFER_SIZE]; + static size_t next; char *rtrn; if (size >= BUFFER_SIZE) return NULL; - if ((BUFFER_SIZE - tbNext) <= size) - tbNext = 0; + if (BUFFER_SIZE - next <= size) + next = 0; - rtrn = &textBuffer[tbNext]; - tbNext += size; + rtrn = &buffer[next]; + next += size; return rtrn; } -static char * -XkbcVModIndexText(struct xkb_desc * xkb, unsigned ndx) +/* + * Get a vmod name's text, where the vmod index is zero based + * (0..XkbNumVirtualMods-1). + */ +static const char * +VModIndexText(struct xkb_keymap *keymap, xkb_mod_index_t ndx) { int len; - uint32_t *vmodNames; - char *rtrn, *tmp = NULL; - - if (xkb && xkb->names) - vmodNames = xkb->names->vmods; - else - vmodNames = NULL; + char *rtrn; + const char *tmp = NULL; + char buf[20]; if (ndx >= XkbNumVirtualMods) - tmp = strdup("illegal"); - else if (vmodNames && (vmodNames[ndx] != None)) - tmp = XkbcAtomGetString(vmodNames[ndx]); + tmp = "illegal"; + else + tmp = keymap->vmod_names[ndx]; if (!tmp) { - tmp = malloc(20 * sizeof(char)); - snprintf(tmp, 20, "%d", ndx); + snprintf(buf, sizeof(buf) - 1, "%d", ndx); + tmp = buf; } len = strlen(tmp) + 1; if (len >= BUFFER_SIZE) len = BUFFER_SIZE - 1; - rtrn = tbGetBuffer(len); + rtrn = GetBuffer(len); strncpy(rtrn, tmp, len); - free(tmp); - return rtrn; } -char * -XkbcVModMaskText(struct xkb_desc * xkb, unsigned modMask, unsigned mask) -{ - int i, bit, len, rem; - char *mm = NULL, *rtrn, *str; +/* Get a mod mask's text, where the mask is in rmods+vmods format. */ +const char * +VModMaskText(struct xkb_keymap *keymap, xkb_mod_mask_t cmask) +{ + xkb_mod_index_t i; + xkb_mod_mask_t bit; + xkb_mod_mask_t rmask, vmask; + int len, rem; + const char *mm = NULL; + char *rtrn, *str; char buf[BUFFER_SIZE]; - if ((modMask == 0) && (mask == 0)) + rmask = cmask & 0xff; + vmask = cmask >> XkbNumModifiers; + + if (rmask == 0 && vmask == 0) return "none"; - if (modMask != 0) - mm = XkbcModMaskText(modMask, False); + if (rmask != 0) + mm = ModMaskText(rmask); str = buf; - buf[0]= '\0'; + buf[0] = '\0'; rem = BUFFER_SIZE; - if (mask) { - for (i = 0, bit = 1; i < XkbNumVirtualMods && rem > 1; i++, bit <<= 1) - { - if (!(mask & bit)) + if (vmask != 0) { + for (i = 0, bit = 1; i < XkbNumVirtualMods && rem > 1; i++, bit <<= + 1) { + if (!(vmask & bit)) continue; len = snprintf(str, rem, "%s%s", (str != buf) ? "+" : "", - XkbcVModIndexText(xkb, i)); + VModIndexText(keymap, i)); rem -= len; str += len; } @@ -124,21 +122,28 @@ else str = NULL; - len = ((str) ? strlen(str) : 0) + ((mm) ? strlen(mm) : 0) + - ((str && mm) ? 1 : 0); + len = (str ? strlen(str) : 0) + (mm ? strlen(mm) : 0) + + (str && mm ? 1 : 0); if (len >= BUFFER_SIZE) len = BUFFER_SIZE - 1; - rtrn = tbGetBuffer(len + 1); + rtrn = GetBuffer(len + 1); rtrn[0] = '\0'; - snprintf(rtrn, len + 1, "%s%s%s", (mm) ? mm : "", - (mm && str) ? "+" : "", (str) ? str : ""); + snprintf(rtrn, len + 1, "%s%s%s", (mm ? mm : ""), + (mm && str ? "+" : ""), (str ? str : "")); return rtrn; } -static char *modNames[XkbNumModifiers] = { +/* + * IMPORTATNT + * The indices used for the legacy core modifiers is derived from + * the order of the names in this table. It matches the values + * ShiftMapIndex, LockMapIndex, etc. from X11/X.h. Take note before + * changing. + */ +static const char *modNames[XkbNumModifiers] = { "Shift", "Lock", "Control", @@ -146,39 +151,64 @@ "Mod2", "Mod3", "Mod4", - "Mod5" + "Mod5", }; -char * -XkbcModIndexText(unsigned ndx) +xkb_mod_index_t +ModNameToIndex(const char *name) { - char *buf; + xkb_mod_index_t i; + for (i = 0; i < XkbNumModifiers; i++) + if (istreq(name, modNames[i])) + return i; + + return XKB_MOD_INVALID; +} + +const char * +ModIndexToName(xkb_mod_index_t ndx) +{ if (ndx < XkbNumModifiers) return modNames[ndx]; - else if (ndx == XkbNoModifier) + return NULL; +} + +const char * +ModIndexText(xkb_mod_index_t ndx) +{ + const char *name; + char *buf; + + name = ModIndexToName(ndx); + if (name) + return name; + + if (ndx == XkbNoModifier) return "none"; - buf = tbGetBuffer(32); + buf = GetBuffer(32); snprintf(buf, 32, "ILLEGAL_%02x", ndx); return buf; } -char * -XkbcModMaskText(unsigned mask, Bool cFormat) +/* Gets the text for the real modifiers only. */ +const char * +ModMaskText(xkb_mod_mask_t mask) { - int i, rem, bit; + int i, rem; + xkb_mod_index_t bit; char *str, *buf; if ((mask & 0xff) == 0xff) - return (cFormat ? "0xff" : "all"); + return "all"; if ((mask & 0xff) == 0) - return (cFormat ? "0" : "none"); + return "none"; rem = 64; - buf = tbGetBuffer(rem); + buf = GetBuffer(rem); str = buf; buf[0] = '\0'; for (i = 0, bit = 1; i < XkbNumModifiers && rem > 1; i++, bit <<= 1) { @@ -187,10 +217,8 @@ if (!(mask & bit)) continue; - len = snprintf(str, rem, "%s%s%s", - (str != buf) ? (cFormat ? "|" : "+") : "", - modNames[i], - cFormat ? "Mask" : ""); + len = snprintf(str, rem, "%s%s", + (str != buf ? "+" : ""), modNames[i]); rem -= len; str += len; } @@ -198,103 +226,76 @@ return buf; } -char * -XkbcConfigText(unsigned config) +const char * +FileTypeText(enum xkb_file_type type) { - switch (config) { - case XkmSemanticsFile: - return "Semantics"; - case XkmLayoutFile: - return "Layout"; - case XkmKeymapFile: - return "Keymap"; - case XkmGeometryFile: - case XkmGeometryIndex: - return "Geometry"; - case XkmTypesIndex: - return "Types"; - case XkmCompatMapIndex: - return "CompatMap"; - case XkmSymbolsIndex: - return "Symbols"; - case XkmIndicatorsIndex: - return "Indicators"; - case XkmKeyNamesIndex: - return "KeyNames"; - case XkmVirtualModsIndex: - return "VirtualMods"; + switch (type) { + case FILE_TYPE_KEYMAP: + return "xkb_keymap"; + case FILE_TYPE_TYPES: + return "xkb_types"; + case FILE_TYPE_COMPAT: + return "xkb_compatability"; + case FILE_TYPE_SYMBOLS: + return "xkb_symbols"; + case FILE_TYPE_KEYCODES: + return "xkb_keycodes"; + case FILE_TYPE_RULES: + return "rules"; default: return "unknown"; } } -char * -XkbcGeomFPText(int val) -{ - char *buf; - int whole, frac; - - buf = tbGetBuffer(12); - whole = val / XkbGeomPtsPerMM; - frac = val % XkbGeomPtsPerMM; - - if (frac != 0) - snprintf(buf, 12, "%d.%d", whole, frac); - else - snprintf(buf, 12, "%d", whole); - - return buf; -} - -static char *actionTypeNames[XkbSA_NumActions]= { - "NoAction", /* XkbSA_NoAction */ - "SetMods", /* XkbSA_SetMods */ - "LatchMods", /* XkbSA_LatchMods */ - "LockMods", /* XkbSA_LockMods */ - "SetGroup", /* XkbSA_SetGroup */ - "LatchGroup", /* XkbSA_LatchGroup */ - "LockGroup", /* XkbSA_LockGroup */ - "MovePtr", /* XkbSA_MovePtr */ - "PtrBtn", /* XkbSA_PtrBtn */ - "LockPtrBtn", /* XkbSA_LockPtrBtn */ - "SetPtrDflt", /* XkbSA_SetPtrDflt */ - "ISOLock", /* XkbSA_ISOLock */ - "Terminate", /* XkbSA_Terminate */ - "SwitchScreen", /* XkbSA_SwitchScreen */ - "SetControls", /* XkbSA_SetControls */ - "LockControls", /* XkbSA_LockControls */ - "ActionMessage", /* XkbSA_ActionMessage */ - "RedirectKey", /* XkbSA_RedirectKey */ - "DeviceBtn", /* XkbSA_DeviceBtn */ - "LockDeviceBtn", /* XkbSA_LockDeviceBtn */ - "DeviceValuator" /* XkbSA_DeviceValuator */ +static const char *actionTypeNames[XkbSA_NumActions] = { + [XkbSA_NoAction] = "NoAction", + [XkbSA_SetMods] = "SetMods", + [XkbSA_LatchMods] = "LatchMods", + [XkbSA_LockMods] = "LockMods", + [XkbSA_SetGroup] = "SetGroup", + [XkbSA_LatchGroup] = "LatchGroup", + [XkbSA_LockGroup] = "LockGroup", + [XkbSA_MovePtr] = "MovePtr", + [XkbSA_PtrBtn] = "PtrBtn", + [XkbSA_LockPtrBtn] = "LockPtrBtn", + [XkbSA_SetPtrDflt] = "SetPtrDflt", + [XkbSA_ISOLock] = "ISOLock", + [XkbSA_Terminate] = "Terminate", + [XkbSA_SwitchScreen] = "SwitchScreen", + [XkbSA_SetControls] = "SetControls", + [XkbSA_LockControls] = "LockControls", + [XkbSA_ActionMessage] = "ActionMessage", + [XkbSA_RedirectKey] = "RedirectKey", + [XkbSA_DeviceBtn] = "DeviceBtn", + [XkbSA_LockDeviceBtn] = "LockDeviceBtn", + [XkbSA_DeviceValuator] = "DeviceValuator" }; -char * -XkbcActionTypeText(unsigned type) +const char * +ActionTypeText(unsigned type) { if (type <= XkbSA_LastAction) return actionTypeNames[type]; return "Private"; } -char * -XkbcKeysymText(uint32_t sym) +const char * +KeysymText(xkb_keysym_t sym) { - static char buffer[16]; + static char buffer[64]; - xkb_keysym_to_string(sym, buffer, sizeof buffer); + xkb_keysym_get_name(sym, buffer, sizeof buffer); return buffer; } -char * -XkbcKeyNameText(char *name) +const char * +KeyNameText(const char name[XkbKeyNameLength]) { char *buf; int len; - buf = tbGetBuffer(7); + buf = GetBuffer(7); buf[0] = '<'; strncpy(&buf[1], name, 4); buf[5] = '\0'; @@ -305,7 +306,7 @@ return buf; } -static char *siMatchText[5] = { +static const char *siMatchText[5] = { "NoneOf", /* XkbSI_NoneOf */ "AnyOfOrNone", /* XkbSI_AnyOfOrNone */ "AnyOf", /* XkbSI_AnyOf */ @@ -313,8 +314,8 @@ "Exactly" /* XkbSI_Exactly */ }; -char * -XkbcSIMatchText(unsigned type) +const char * +SIMatchText(unsigned type) { char *buf; @@ -330,7 +331,7 @@ case XkbSI_Exactly: return siMatchText[4]; default: - buf = tbGetBuffer(40); + buf = GetBuffer(40); snprintf(buf, 40, "0x%x", type & XkbSI_OpMask); return buf; } diff -Nru libxkbcommon-0.1.0~1/src/text.h libxkbcommon-0.1.0~2/src/text.h --- libxkbcommon-0.1.0~1/src/text.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/text.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,62 @@ +/* + * 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 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. + */ + +#ifndef TEXT_H +#define TEXT_H + +#include "xkb-priv.h" + +const char * +VModMaskText(struct xkb_keymap *keymap, xkb_mod_mask_t cmask); + +xkb_mod_index_t +ModNameToIndex(const char *name); + +const char * +ModIndexToName(xkb_mod_index_t ndx); + +const char * +ModIndexText(xkb_mod_index_t ndx); + +const char * +ModMaskText(xkb_mod_mask_t mask); + +const char * +FileTypeText(enum xkb_file_type type); + +const char * +ActionTypeText(unsigned type); + +const char * +KeysymText(xkb_keysym_t sym); + +const char * +KeyNameText(const char name[XkbKeyNameLength]); + +const char * +SIMatchText(unsigned type); + +#endif /* TEXT_H */ diff -Nru libxkbcommon-0.1.0~1/src/utils.h libxkbcommon-0.1.0~2/src/utils.h --- libxkbcommon-0.1.0~1/src/utils.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/utils.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,93 @@ +#ifndef UTILS_H +#define UTILS_H 1 + +/*\ + * + * COPYRIGHT 1990 + * DIGITAL EQUIPMENT CORPORATION + * MAYNARD, MASSACHUSETTS + * ALL RIGHTS RESERVED. + * + * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND + * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. + * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE + * FOR ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED + * WARRANTY. + * + * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT + * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN + * ADDITION TO THAT SET FORTH ABOVE. + * + * 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 Equipment Corporation not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + \*/ + +#include +#include + +/* + * We sometimes malloc strings and then expose them as const char*'s. This + * macro is used when we free these strings in order to avoid -Wcast-qual + * errors. + */ +#define UNCONSTIFY(const_ptr) ((void *) (uintptr_t) (const_ptr)) + +static inline bool +streq(const char *s1, const char *s2) +{ + return strcmp(s1, s2) == 0; +} + +static inline bool +istreq(const char *s1, const char *s2) +{ + return strcasecmp(s1, s2) == 0; +} + +static inline bool +istreq_prefix(const char *s1, const char *s2) +{ + return strncasecmp(s1, s2, strlen(s1)) == 0; +} + +static inline char * +strdup_safe(const char *s) +{ + return s ? strdup(s) : NULL; +} + +/* 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 + +#endif /* UTILS_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkb-priv.h libxkbcommon-0.1.0~2/src/xkb-priv.h --- libxkbcommon-0.1.0~1/src/xkb-priv.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkb-priv.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,517 @@ +/* + * Copyright 1985, 1987, 1990, 1998 The Open Group + * Copyright 2008 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 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 © 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 XKB_PRIV_H +#define XKB_PRIV_H + +#include +#include +#include +#include + +#include "xkbcommon/xkbcommon.h" +#include "utils.h" +#include "darray.h" +#include "list.h" + +typedef uint32_t xkb_level_index_t; +typedef uint32_t xkb_atom_t; + +#define XKB_ATOM_NONE 0 +#define XKB_LEVEL_INVALID 0xffffffff + +enum xkb_file_type { + /* The top level file which includes the other component files. */ + FILE_TYPE_KEYMAP = (1 << 0), + + /* Component files. */ + FILE_TYPE_TYPES = (1 << 1), + FILE_TYPE_COMPAT = (1 << 2), + FILE_TYPE_SYMBOLS = (1 << 3), + FILE_TYPE_KEYCODES = (1 << 4), + FILE_TYPE_GEOMETRY = (1 << 5), + + /* This one doesn't mix with the others, but useful here as well. */ + FILE_TYPE_RULES = (1 << 6), +}; + +struct xkb_context { + int refcnt; + + ATTR_PRINTF(3, 0) void (*log_fn)(struct xkb_context *ctx, int priority, + const char *fmt, va_list args); + enum xkb_log_level log_priority; + int log_verbosity; + void *user_data; + + darray(char *) includes; + darray(char *) failed_includes; + + /* xkbcomp needs to assign sequential IDs to XkbFile's it creates. */ + unsigned file_id; + + struct atom_table *atom_table; +}; + +/* Files needed for a complete keymap. */ +#define REQUIRED_FILE_TYPES (FILE_TYPE_TYPES | FILE_TYPE_COMPAT | \ + FILE_TYPE_SYMBOLS | FILE_TYPE_KEYCODES) +#define LEGAL_FILE_TYPES REQUIRED_FILE_TYPES + +/** + * Legacy names for the components of an XKB keymap, also known as KcCGST. + */ +struct xkb_component_names { + char *keycodes; + char *types; + char *compat; + char *symbols; +}; + +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 { + uint8_t type; + uint8_t flags; + struct xkb_mods mods; +}; + +struct xkb_group_action { + uint8_t type; + uint8_t flags; + int32_t group; +}; + +struct xkb_iso_action { + uint8_t type; + uint8_t flags; + struct xkb_mods mods; + int32_t group; + uint8_t affect; +}; + +struct xkb_controls_action { + uint8_t type; + uint8_t flags; + uint32_t ctrls; +}; + +struct xkb_device_button_action { + uint8_t type; + uint8_t flags; + uint8_t count; + uint8_t button; + uint8_t device; +}; + +struct xkb_device_valuator_action { + uint8_t type; + uint8_t device; + uint8_t v1_what; + uint8_t v1_index; + int8_t v1_value; + uint8_t v2_what; + uint8_t v2_index; + int8_t v2_value; +}; + +struct xkb_pointer_default_action { + uint8_t type; + uint8_t flags; + uint8_t affect; + int8_t value; +}; + +struct xkb_switch_screen_action { + uint8_t type; + uint8_t flags; + int8_t screen; +}; + +struct xkb_redirect_key_action { + uint8_t type; + xkb_keycode_t new_kc; + uint8_t mods_mask; + uint8_t mods; + uint16_t vmods_mask; + uint16_t vmods; +}; + +struct xkb_pointer_action { + uint8_t type; + uint8_t flags; + int16_t x; + int16_t y; +}; + +struct xkb_message_action { + uint8_t type; + uint8_t flags; + uint8_t message[6]; +}; + +struct xkb_pointer_button_action { + uint8_t type; + uint8_t flags; + uint8_t count; + int8_t button; +}; + +struct xkb_private_action { + uint8_t type; + uint8_t data[7]; +}; + +union xkb_action { + struct xkb_mod_action mods; + struct xkb_group_action group; + struct xkb_iso_action iso; + struct xkb_controls_action ctrls; + struct xkb_device_button_action devbtn; + struct xkb_device_valuator_action devval; + struct xkb_pointer_default_action dflt; + struct xkb_switch_screen_action screen; + struct xkb_redirect_key_action redirect; /* XXX wholly unnecessary? */ + struct xkb_pointer_action ptr; /* XXX delete for DeviceValuator */ + struct xkb_pointer_button_action btn; /* XXX delete for DeviceBtn */ + struct xkb_message_action msg; /* XXX just delete */ + struct xkb_private_action priv; + unsigned char type; +}; + +struct xkb_kt_map_entry { + xkb_level_index_t level; + struct xkb_mods mods; + struct xkb_mods preserve; +}; + +struct xkb_key_type { + struct xkb_mods mods; + xkb_level_index_t num_levels; + struct xkb_kt_map_entry *map; + unsigned int num_entries; + xkb_atom_t name; + xkb_atom_t *level_names; +}; + +struct xkb_sym_interpret { + xkb_keysym_t sym; + unsigned char flags; + unsigned char match; + uint8_t mods; + xkb_mod_index_t virtual_mod; + union xkb_action act; +}; + +struct xkb_indicator_map { + unsigned char flags; + unsigned char which_groups; + uint32_t groups; + unsigned char which_mods; + struct xkb_mods mods; + unsigned int ctrls; +}; + +struct xkb_key_alias { + char real[XkbKeyNameLength]; + char alias[XkbKeyNameLength]; +}; + +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; +}; + +struct xkb_key { + char name[XkbKeyNameLength]; + + unsigned char explicit; + + unsigned char modmap; + xkb_mod_mask_t vmodmap; + + bool repeats; + + union xkb_action *actions; + + unsigned kt_index[XkbNumKbdGroups]; + + xkb_group_index_t num_groups; + /* How many levels the largest group has. */ + xkb_level_index_t width; + + uint8_t out_of_range_group_action; + xkb_group_index_t out_of_range_group_number; + + /* per level/group index into 'syms' */ + int *sym_index; + /* per level/group */ + unsigned int *num_syms; + darray(xkb_keysym_t) syms; +}; + +/* Common keyboard description structure */ +struct xkb_keymap { + struct xkb_context *ctx; + + int refcnt; + enum xkb_map_compile_flags flags; + + unsigned int enabled_ctrls; + + xkb_keycode_t min_key_code; + xkb_keycode_t max_key_code; + + darray(struct xkb_key) keys; + + /* aliases in no particular order */ + darray(struct xkb_key_alias) key_aliases; + + struct xkb_key_type *types; + unsigned int num_types; + + darray(struct xkb_sym_interpret) sym_interpret; + + /* vmod -> mod mapping */ + xkb_mod_mask_t vmods[XkbNumVirtualMods]; + const char *vmod_names[XkbNumVirtualMods]; + + struct xkb_mods groups[XkbNumKbdGroups]; + const char *group_names[XkbNumKbdGroups]; + + struct xkb_indicator_map indicators[XkbNumIndicators]; + const char *indicator_names[XkbNumIndicators]; + + char *keycodes_section_name; + char *symbols_section_name; + char *types_section_name; + char *compat_section_name; +}; + +static inline struct xkb_key * +XkbKey(struct xkb_keymap *keymap, xkb_keycode_t kc) +{ + return &darray_item(keymap->keys, kc); +} + +static inline xkb_keycode_t +XkbKeyGetKeycode(struct xkb_keymap *keymap, struct xkb_key *key) +{ + /* Hack to avoid having to keep the keycode inside the xkb_key. */ + return (xkb_keycode_t)(key - keymap->keys.item); +} + +#define xkb_foreach_key_from(iter, keymap, from) \ + darray_foreach_from(iter, keymap->keys, from) + +#define xkb_foreach_key(iter, keymap) \ + xkb_foreach_key_from(iter, keymap, keymap->min_key_code) + +static inline struct xkb_key_type * +XkbKeyType(struct xkb_keymap *keymap, struct xkb_key *key, + xkb_group_index_t group) +{ + return &keymap->types[key->kt_index[group]]; +} + +static inline xkb_level_index_t +XkbKeyGroupWidth(struct xkb_keymap *keymap, struct xkb_key *key, + xkb_group_index_t group) +{ + return XkbKeyType(keymap, key, group)->num_levels; +} + +static inline unsigned int +XkbKeyNumSyms(struct xkb_key *key, xkb_group_index_t group, + xkb_level_index_t level) +{ + return key->num_syms[group * key->width + level]; +} + +static inline xkb_keysym_t * +XkbKeySymEntry(struct xkb_key *key, xkb_group_index_t group, + xkb_level_index_t level) +{ + return &darray_item(key->syms, + key->sym_index[group * key->width + level]); +} + +static inline union xkb_action * +XkbKeyActionEntry(struct xkb_key *key, xkb_group_index_t group, + xkb_level_index_t level) +{ + return &key->actions[key->width * group + level]; +} + +static inline bool +XkbKeycodeInRange(struct xkb_keymap *keymap, xkb_keycode_t kc) +{ + return kc >= keymap->min_key_code && kc <= keymap->max_key_code; +} + +xkb_atom_t +xkb_atom_intern(struct xkb_context *ctx, const char *string); + +/** + * If @string is dynamically allocated, 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); + +char * +xkb_atom_strdup(struct xkb_context *ctx, xkb_atom_t atom); + +const char * +xkb_atom_text(struct xkb_context *ctx, xkb_atom_t atom); + +xkb_group_index_t +xkb_key_get_group(struct xkb_state *state, xkb_keycode_t kc); + +xkb_level_index_t +xkb_key_get_level(struct xkb_state *state, xkb_keycode_t kc, + xkb_group_index_t group); + +extern int +xkb_key_get_syms_by_level(struct xkb_keymap *keymap, struct xkb_key *key, + xkb_group_index_t group, xkb_level_index_t level, + const xkb_keysym_t **syms_out); + +extern unsigned +xkb_context_take_file_id(struct xkb_context *ctx); + +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); + +ATTR_PRINTF(3, 4) void +xkb_log(struct xkb_context *ctx, int priority, const char *fmt, ...); + +#define xkb_log_cond(ctx, prio, ...) \ + do { \ + if (xkb_get_log_priority(ctx) >= (prio)) \ + xkb_log((ctx), (prio), __VA_ARGS__); \ + } while (0) + +#define xkb_log_cond_lvl(ctx, prio, lvl, ...) \ + do { \ + if (xkb_get_log_verbosity(ctx) >= (lvl)) \ + xkb_log_cond((ctx), (prio), __VA_ARGS__); \ + } while (0) + +/* + * 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_cond((ctx), XKB_LOG_LEVEL_DEBUG, __VA_ARGS__) +#define log_info(ctx, ...) \ + xkb_log_cond((ctx), XKB_LOG_LEVEL_INFO, __VA_ARGS__) +#define log_warn(ctx, ...) \ + xkb_log_cond((ctx), XKB_LOG_LEVEL_WARNING, __VA_ARGS__) +#define log_err(ctx, ...) \ + xkb_log_cond((ctx), XKB_LOG_LEVEL_ERROR, __VA_ARGS__) +#define log_wsgo(ctx, ...) \ + xkb_log_cond((ctx), XKB_LOG_LEVEL_CRITICAL, __VA_ARGS__) +#define log_lvl(ctx, lvl, ...) \ + xkb_log_cond_lvl((ctx), XKB_LOG_LEVEL_WARNING, (lvl), __VA_ARGS__) + +#endif /* XKB_PRIV_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkb.c libxkbcommon-0.1.0~2/src/xkb.c --- libxkbcommon-0.1.0~1/src/xkb.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkb.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,143 +0,0 @@ -/************************************************************ -Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - -Permission to use, copy, modify, and distribute this -software and its documentation for any purpose and without -fee is hereby granted, provided that the above copyright -notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting -documentation, and that the name of Silicon Graphics not be -used in advertising or publicity pertaining to distribution -of the software without specific prior written permission. -Silicon Graphics makes no representation about the suitability -of this software for any purpose. It is provided "as is" -without any express or implied warranty. - -SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON -GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH -THE USE OR PERFORMANCE OF THIS SOFTWARE. - -********************************************************/ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include "xkbmisc.h" -#include "X11/extensions/XKBcommon.h" -#include "XKBcommonint.h" - -static char * -XkbcCanonicaliseComponent(char *name, const char *old) -{ - char *tmp; - int i; - - if (!name) - return NULL; - - /* Treachery. */ - if (old && strchr(old, '%')) - return NULL; - - if (name[0] == '+' || name[0] == '|') { - if (old) { - tmp = malloc(strlen(name) + strlen(old) + 1); - if (!tmp) - return NULL; - sprintf(tmp, "%s%s", old, name); - free(name); - name = tmp; - } - else { - memmove(name, &name[1], strlen(&name[1]) + 1); - } - } - - for (i = 0; name[i]; i++) { - if (name[i] == '%') { - if (old) { - tmp = malloc(strlen(name) + strlen(old)); - if (!tmp) - return NULL; - strncpy(tmp, name, i); - strcat(tmp + i, old); - strcat(tmp + i + strlen(old), &name[i + 1]); - free(name); - name = tmp; - i--; - } - else { - memmove(&name[i - 1], &name[i + 1], strlen(&name[i + 1]) + 1); - i -= 2; - } - } - } - - return name; -} - -void -xkb_canonicalise_components(struct xkb_component_names * names, - const struct xkb_component_names * old) -{ - names->keycodes = XkbcCanonicaliseComponent(names->keycodes, - old ? old->keycodes : NULL); - names->compat = XkbcCanonicaliseComponent(names->compat, - old ? old->compat : NULL); - names->geometry = XkbcCanonicaliseComponent(names->geometry, - old ? old->geometry : NULL); - names->symbols = XkbcCanonicaliseComponent(names->symbols, - old ? old->symbols : NULL); - names->types = XkbcCanonicaliseComponent(names->types, - old ? old->types : NULL); -} - -Bool -XkbcComputeEffectiveMap(struct xkb_desc * xkb, struct xkb_key_type * type, - unsigned char *map_rtrn) -{ - int i; - unsigned tmp; - struct xkb_kt_map_entry * entry = NULL; - - if (!xkb || !type || !xkb->server) - return False; - - if (type->mods.vmods != 0) { - if (!XkbcVirtualModsToReal(xkb, type->mods.vmods, &tmp)) - return False; - - type->mods.mask = tmp | type->mods.real_mods; - entry = type->map; - for (i = 0; i < type->map_count; i++, entry++) { - tmp = 0; - if (entry->mods.vmods != 0) { - if (!XkbcVirtualModsToReal(xkb, entry->mods.vmods, &tmp)) - return False; - if (tmp == 0) { - entry->active = False; - continue; - } - } - entry->active = True; - entry->mods.mask = (entry->mods.real_mods | tmp) & type->mods.mask; - } - } - else - type->mods.mask = type->mods.real_mods; - - if (map_rtrn) { - bzero(map_rtrn, type->mods.mask + 1); - for (i = 0; i < type->map_count; i++) { - if (entry->active) - map_rtrn[type->map[i].mods.mask] = type->map[i].level; - } - } - - return True; -} diff -Nru libxkbcommon-0.1.0~1/src/xkballoc.h libxkbcommon-0.1.0~2/src/xkballoc.h --- libxkbcommon-0.1.0~1/src/xkballoc.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkballoc.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -/* -Copyright 2009 Dan Nicholson - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice 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. -*/ - -#ifndef _XKBALLOC_H_ -#define _XKBALLOC_H_ - -#include -#include -#include "X11/extensions/XKBcommon.h" - -extern int -XkbcAllocCompatMap(struct xkb_desc * xkb, unsigned which, unsigned nSI); - -extern int -XkbcAllocNames(struct xkb_desc * xkb, unsigned which, int nTotalRG, - int nTotalAliases); - -extern int -XkbcAllocControls(struct xkb_desc * xkb, unsigned which); - -extern int -XkbcAllocIndicatorMaps(struct xkb_desc * xkb); - -extern struct xkb_desc * -XkbcAllocKeyboard(void); - -extern void -XkbcFreeKeyboard(struct xkb_desc * xkb, unsigned which, Bool freeAll); - -/***====================================================================***/ - -extern int -XkbcAllocClientMap(struct xkb_desc * xkb, unsigned which, unsigned nTotalTypes); - -extern int -XkbcAllocServerMap(struct xkb_desc * xkb, unsigned which, unsigned nNewActions); - -extern int -XkbcCopyKeyType(struct xkb_key_type * from, struct xkb_key_type *into); - -extern uint32_t * -XkbcResizeKeySyms(struct xkb_desc * xkb, int key, int needed); - -extern union xkb_action * -XkbcResizeKeyActions(struct xkb_desc * xkb, int key, int needed); - -extern void -XkbcFreeClientMap(struct xkb_desc * xkb, unsigned what, Bool freeMap); - -extern void -XkbcFreeServerMap(struct xkb_desc * xkb, unsigned what, Bool freeMap); - -#endif /* _XKBALLOC_H_ */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/.gitignore libxkbcommon-0.1.0~2/src/xkbcomp/.gitignore --- libxkbcommon-0.1.0~1/src/xkbcomp/.gitignore 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/.gitignore 2012-08-11 16:17:00.000000000 +0000 @@ -1,2 +1,3 @@ -xkbparse.c -xkbscan.c +parser.c +parser.h +scanner.c diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/Makefile.am libxkbcommon-0.1.0~2/src/xkbcomp/Makefile.am --- libxkbcommon-0.1.0~1/src/xkbcomp/Makefile.am 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src -AM_CFLAGS = $(X11_CFLAGS) $(CWARNFLAGS) \ - -DDFLT_XKB_CONFIG_ROOT='"$(XKBCONFIGROOT)"' - -noinst_LTLIBRARIES = libxkbcomp.la -libxkbcomp_la_SOURCES = \ - action.c \ - action.h \ - alias.c \ - alias.h \ - compat.c \ - compat.h \ - expr.c \ - expr.h \ - geometry.c \ - indicators.c \ - indicators.h \ - keycodes.c \ - keycodes.h \ - keymap.c \ - keytypes.c \ - listing.c \ - misc.c \ - misc.h \ - parseutils.c \ - parseutils.h \ - symbols.c \ - tokens.h \ - utils.c \ - utils.h \ - vmod.c \ - vmod.h \ - xkbcomp.c \ - xkbcomp.h \ - xkbparse.y \ - xkbpath.c \ - xkbpath.h \ - xkbscan.l diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/action.c libxkbcommon-0.1.0~2/src/xkbcomp/action.c --- libxkbcommon-0.1.0~1/src/xkbcomp/action.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/action.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,1271 +1,1141 @@ /************************************************************ - 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 (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 "xkbcomp.h" -#include "xkbmisc.h" -#include "tokens.h" -#include "expr.h" - -#include "keycodes.h" -#include "vmod.h" -#include "misc.h" #include "action.h" -#include "misc.h" -static Bool actionsInitialized; -static ExprDef constTrue; -static ExprDef constFalse; +static const ExprDef constTrue = { + .common = { .type = STMT_EXPR, .next = NULL }, + .op = EXPR_VALUE, + .value_type = EXPR_TYPE_BOOLEAN, + .value = { .ival = 1 }, +}; + +static const ExprDef constFalse = { + .common = { .type = STMT_EXPR, .next = NULL }, + .op = EXPR_VALUE, + .value_type = EXPR_TYPE_BOOLEAN, + .value = { .ival = 0 }, +}; /***====================================================================***/ -static Bool -stringToAction(const char *str, unsigned *type_rtrn) +static const LookupEntry actionStrings[] = { + { "noaction", XkbSA_NoAction }, + { "setmods", XkbSA_SetMods }, + { "latchmods", XkbSA_LatchMods }, + { "lockmods", XkbSA_LockMods }, + { "setgroup", XkbSA_SetGroup }, + { "latchgroup", XkbSA_LatchGroup }, + { "lockgroup", XkbSA_LockGroup }, + { "moveptr", XkbSA_MovePtr }, + { "movepointer", XkbSA_MovePtr }, + { "ptrbtn", XkbSA_PtrBtn }, + { "pointerbutton", XkbSA_PtrBtn }, + { "lockptrbtn", XkbSA_LockPtrBtn }, + { "lockpointerbutton", XkbSA_LockPtrBtn }, + { "lockptrbutton", XkbSA_LockPtrBtn }, + { "lockpointerbtn", XkbSA_LockPtrBtn }, + { "setptrdflt", XkbSA_SetPtrDflt }, + { "setpointerdefault", XkbSA_SetPtrDflt }, + { "isolock", XkbSA_ISOLock }, + { "terminate", XkbSA_Terminate }, + { "terminateserver", XkbSA_Terminate }, + { "switchscreen", XkbSA_SwitchScreen }, + { "setcontrols", XkbSA_SetControls }, + { "lockcontrols", XkbSA_LockControls }, + { "actionmessage", XkbSA_ActionMessage }, + { "messageaction", XkbSA_ActionMessage }, + { "message", XkbSA_ActionMessage }, + { "redirect", XkbSA_RedirectKey }, + { "redirectkey", XkbSA_RedirectKey }, + { "devbtn", XkbSA_DeviceBtn }, + { "devicebtn", XkbSA_DeviceBtn }, + { "devbutton", XkbSA_DeviceBtn }, + { "devicebutton", XkbSA_DeviceBtn }, + { "lockdevbtn", XkbSA_DeviceBtn }, + { "lockdevicebtn", XkbSA_LockDeviceBtn }, + { "lockdevbutton", XkbSA_LockDeviceBtn }, + { "lockdevicebutton", XkbSA_LockDeviceBtn }, + { "devval", XkbSA_DeviceValuator }, + { "deviceval", XkbSA_DeviceValuator }, + { "devvaluator", XkbSA_DeviceValuator }, + { "devicevaluator", XkbSA_DeviceValuator }, + { "private", PrivateAction }, + { NULL, 0 } +}; + +static const LookupEntry fieldStrings[] = { + { "clearLocks", F_ClearLocks }, + { "latchToLock", F_LatchToLock }, + { "genKeyEvent", F_GenKeyEvent }, + { "generateKeyEvent", F_GenKeyEvent }, + { "report", F_Report }, + { "default", F_Default }, + { "affect", F_Affect }, + { "increment", F_Increment }, + { "modifiers", F_Modifiers }, + { "mods", F_Modifiers }, + { "group", F_Group }, + { "x", F_X }, + { "y", F_Y }, + { "accel", F_Accel }, + { "accelerate", F_Accel }, + { "repeat", F_Accel }, + { "button", F_Button }, + { "value", F_Value }, + { "controls", F_Controls }, + { "ctrls", F_Controls }, + { "type", F_Type }, + { "count", F_Count }, + { "screen", F_Screen }, + { "same", F_Same }, + { "sameServer", F_Same }, + { "data", F_Data }, + { "device", F_Device }, + { "dev", F_Device }, + { "key", F_Keycode }, + { "keycode", F_Keycode }, + { "kc", F_Keycode }, + { "clearmods", F_ModsToClear }, + { "clearmodifiers", F_ModsToClear }, + { NULL, 0 } +}; + +static bool +stringToValue(const LookupEntry tab[], const char *string, + unsigned int *value_rtrn) { - if (str == NULL) - return False; + const LookupEntry *entry; - if (uStrCaseCmp(str, "noaction") == 0) - *type_rtrn = XkbSA_NoAction; - else if (uStrCaseCmp(str, "setmods") == 0) - *type_rtrn = XkbSA_SetMods; - else if (uStrCaseCmp(str, "latchmods") == 0) - *type_rtrn = XkbSA_LatchMods; - else if (uStrCaseCmp(str, "lockmods") == 0) - *type_rtrn = XkbSA_LockMods; - else if (uStrCaseCmp(str, "setgroup") == 0) - *type_rtrn = XkbSA_SetGroup; - else if (uStrCaseCmp(str, "latchgroup") == 0) - *type_rtrn = XkbSA_LatchGroup; - else if (uStrCaseCmp(str, "lockgroup") == 0) - *type_rtrn = XkbSA_LockGroup; - else if (uStrCaseCmp(str, "moveptr") == 0) - *type_rtrn = XkbSA_MovePtr; - else if (uStrCaseCmp(str, "movepointer") == 0) - *type_rtrn = XkbSA_MovePtr; - else if (uStrCaseCmp(str, "ptrbtn") == 0) - *type_rtrn = XkbSA_PtrBtn; - else if (uStrCaseCmp(str, "pointerbutton") == 0) - *type_rtrn = XkbSA_PtrBtn; - else if (uStrCaseCmp(str, "lockptrbtn") == 0) - *type_rtrn = XkbSA_LockPtrBtn; - else if (uStrCaseCmp(str, "lockpointerbutton") == 0) - *type_rtrn = XkbSA_LockPtrBtn; - else if (uStrCaseCmp(str, "lockptrbutton") == 0) - *type_rtrn = XkbSA_LockPtrBtn; - else if (uStrCaseCmp(str, "lockpointerbtn") == 0) - *type_rtrn = XkbSA_LockPtrBtn; - else if (uStrCaseCmp(str, "setptrdflt") == 0) - *type_rtrn = XkbSA_SetPtrDflt; - else if (uStrCaseCmp(str, "setpointerdefault") == 0) - *type_rtrn = XkbSA_SetPtrDflt; - else if (uStrCaseCmp(str, "isolock") == 0) - *type_rtrn = XkbSA_ISOLock; - else if (uStrCaseCmp(str, "terminate") == 0) - *type_rtrn = XkbSA_Terminate; - else if (uStrCaseCmp(str, "terminateserver") == 0) - *type_rtrn = XkbSA_Terminate; - else if (uStrCaseCmp(str, "switchscreen") == 0) - *type_rtrn = XkbSA_SwitchScreen; - else if (uStrCaseCmp(str, "setcontrols") == 0) - *type_rtrn = XkbSA_SetControls; - else if (uStrCaseCmp(str, "lockcontrols") == 0) - *type_rtrn = XkbSA_LockControls; - else if (uStrCaseCmp(str, "actionmessage") == 0) - *type_rtrn = XkbSA_ActionMessage; - else if (uStrCaseCmp(str, "messageaction") == 0) - *type_rtrn = XkbSA_ActionMessage; - else if (uStrCaseCmp(str, "message") == 0) - *type_rtrn = XkbSA_ActionMessage; - else if (uStrCaseCmp(str, "redirect") == 0) - *type_rtrn = XkbSA_RedirectKey; - else if (uStrCaseCmp(str, "redirectkey") == 0) - *type_rtrn = XkbSA_RedirectKey; - else if (uStrCaseCmp(str, "devbtn") == 0) - *type_rtrn = XkbSA_DeviceBtn; - else if (uStrCaseCmp(str, "devicebtn") == 0) - *type_rtrn = XkbSA_DeviceBtn; - else if (uStrCaseCmp(str, "devbutton") == 0) - *type_rtrn = XkbSA_DeviceBtn; - else if (uStrCaseCmp(str, "devicebutton") == 0) - *type_rtrn = XkbSA_DeviceBtn; - else if (uStrCaseCmp(str, "lockdevbtn") == 0) - *type_rtrn = XkbSA_DeviceBtn; - else if (uStrCaseCmp(str, "lockdevicebtn") == 0) - *type_rtrn = XkbSA_LockDeviceBtn; - else if (uStrCaseCmp(str, "lockdevbutton") == 0) - *type_rtrn = XkbSA_LockDeviceBtn; - else if (uStrCaseCmp(str, "lockdevicebutton") == 0) - *type_rtrn = XkbSA_LockDeviceBtn; - else if (uStrCaseCmp(str, "devval") == 0) - *type_rtrn = XkbSA_DeviceValuator; - else if (uStrCaseCmp(str, "deviceval") == 0) - *type_rtrn = XkbSA_DeviceValuator; - else if (uStrCaseCmp(str, "devvaluator") == 0) - *type_rtrn = XkbSA_DeviceValuator; - else if (uStrCaseCmp(str, "devicevaluator") == 0) - *type_rtrn = XkbSA_DeviceValuator; - else if (uStrCaseCmp(str, "private") == 0) - *type_rtrn = PrivateAction; - else - return False; - return True; + if (!string) + return false; + + for (entry = tab; entry->name; entry++) { + if (istreq(entry->name, string)) { + *value_rtrn = entry->value; + return true; + } + } + + return false; } -static Bool -stringToField(char *str, unsigned *field_rtrn) +static const char * +valueToString(const LookupEntry tab[], unsigned int value) { + const LookupEntry *entry; - if (str == NULL) - return False; - - if (uStrCaseCmp(str, "clearlocks") == 0) - *field_rtrn = F_ClearLocks; - else if (uStrCaseCmp(str, "latchtolock") == 0) - *field_rtrn = F_LatchToLock; - else if (uStrCaseCmp(str, "genkeyevent") == 0) - *field_rtrn = F_GenKeyEvent; - else if (uStrCaseCmp(str, "generatekeyevent") == 0) - *field_rtrn = F_GenKeyEvent; - else if (uStrCaseCmp(str, "report") == 0) - *field_rtrn = F_Report; - else if (uStrCaseCmp(str, "default") == 0) - *field_rtrn = F_Default; - else if (uStrCaseCmp(str, "affect") == 0) - *field_rtrn = F_Affect; - else if (uStrCaseCmp(str, "increment") == 0) - *field_rtrn = F_Increment; - else if (uStrCaseCmp(str, "mods") == 0) - *field_rtrn = F_Modifiers; - else if (uStrCaseCmp(str, "modifiers") == 0) - *field_rtrn = F_Modifiers; - else if (uStrCaseCmp(str, "group") == 0) - *field_rtrn = F_Group; - else if (uStrCaseCmp(str, "x") == 0) - *field_rtrn = F_X; - else if (uStrCaseCmp(str, "y") == 0) - *field_rtrn = F_Y; - else if (uStrCaseCmp(str, "accel") == 0) - *field_rtrn = F_Accel; - else if (uStrCaseCmp(str, "accelerate") == 0) - *field_rtrn = F_Accel; - else if (uStrCaseCmp(str, "repeat") == 0) - *field_rtrn = F_Accel; - else if (uStrCaseCmp(str, "button") == 0) - *field_rtrn = F_Button; - else if (uStrCaseCmp(str, "value") == 0) - *field_rtrn = F_Value; - else if (uStrCaseCmp(str, "controls") == 0) - *field_rtrn = F_Controls; - else if (uStrCaseCmp(str, "ctrls") == 0) - *field_rtrn = F_Controls; - else if (uStrCaseCmp(str, "type") == 0) - *field_rtrn = F_Type; - else if (uStrCaseCmp(str, "count") == 0) - *field_rtrn = F_Count; - else if (uStrCaseCmp(str, "screen") == 0) - *field_rtrn = F_Screen; - else if (uStrCaseCmp(str, "same") == 0) - *field_rtrn = F_Same; - else if (uStrCaseCmp(str, "sameserver") == 0) - *field_rtrn = F_Same; - else if (uStrCaseCmp(str, "data") == 0) - *field_rtrn = F_Data; - else if (uStrCaseCmp(str, "device") == 0) - *field_rtrn = F_Device; - else if (uStrCaseCmp(str, "dev") == 0) - *field_rtrn = F_Device; - else if (uStrCaseCmp(str, "key") == 0) - *field_rtrn = F_Keycode; - else if (uStrCaseCmp(str, "keycode") == 0) - *field_rtrn = F_Keycode; - else if (uStrCaseCmp(str, "kc") == 0) - *field_rtrn = F_Keycode; - else if (uStrCaseCmp(str, "clearmods") == 0) - *field_rtrn = F_ModsToClear; - else if (uStrCaseCmp(str, "clearmodifiers") == 0) - *field_rtrn = F_ModsToClear; - else - return False; - return True; + for (entry = tab; entry->name; entry++) + if (entry->value == value) + return entry->name; + + return "unknown"; } -static char * -fieldText(unsigned field) +static bool +stringToAction(const char *str, unsigned *type_rtrn) { - static char buf[32]; + return stringToValue(actionStrings, str, type_rtrn); +} - switch (field) - { - case F_ClearLocks: - strcpy(buf, "clearLocks"); - break; - case F_LatchToLock: - strcpy(buf, "latchToLock"); - break; - case F_GenKeyEvent: - strcpy(buf, "genKeyEvent"); - break; - case F_Report: - strcpy(buf, "report"); - break; - case F_Default: - strcpy(buf, "default"); - break; - case F_Affect: - strcpy(buf, "affect"); - break; - case F_Increment: - strcpy(buf, "increment"); - break; - case F_Modifiers: - strcpy(buf, "modifiers"); - break; - case F_Group: - strcpy(buf, "group"); - break; - case F_X: - strcpy(buf, "x"); - break; - case F_Y: - strcpy(buf, "y"); - break; - case F_Accel: - strcpy(buf, "accel"); - break; - case F_Button: - strcpy(buf, "button"); - break; - case F_Value: - strcpy(buf, "value"); - break; - case F_Controls: - strcpy(buf, "controls"); - break; - case F_Type: - strcpy(buf, "type"); - break; - case F_Count: - strcpy(buf, "count"); - break; - case F_Screen: - strcpy(buf, "screen"); - break; - case F_Same: - strcpy(buf, "sameServer"); - break; - case F_Data: - strcpy(buf, "data"); - break; - case F_Device: - strcpy(buf, "device"); - break; - case F_Keycode: - strcpy(buf, "keycode"); - break; - case F_ModsToClear: - strcpy(buf, "clearmods"); - break; - default: - strcpy(buf, "unknown"); - break; - } - return buf; +static bool +stringToField(const char *str, unsigned *field_rtrn) +{ + return stringToValue(fieldStrings, str, field_rtrn); +} + +static const char * +fieldText(unsigned field) +{ + return valueToString(fieldStrings, field); } /***====================================================================***/ -static Bool -ReportMismatch(unsigned action, unsigned field, const char *type) +static inline bool +ReportMismatch(struct xkb_keymap *keymap, unsigned action, unsigned field, + const char *type) { - ERROR("Value of %s field must be of type %s\n", fieldText(field), type); - ACTION("Action %s definition ignored\n", XkbcActionTypeText(action)); - return False; + log_err(keymap->ctx, + "Value of %s field must be of type %s; " + "Action %s definition ignored\n", + fieldText(field), type, ActionTypeText(action)); + return false; } -static Bool -ReportIllegal(unsigned action, unsigned field) +static inline bool +ReportIllegal(struct xkb_keymap *keymap, unsigned action, unsigned field) { - ERROR("Field %s is not defined for an action of type %s\n", - fieldText(field), XkbcActionTypeText(action)); - ACTION("Action definition ignored\n"); - return False; + log_err(keymap->ctx, + "Field %s is not defined for an action of type %s; " + "Action definition ignored\n", + fieldText(field), ActionTypeText(action)); + return false; } -static Bool -ReportActionNotArray(unsigned action, unsigned field) +static inline bool +ReportActionNotArray(struct xkb_keymap *keymap, unsigned action, + unsigned field) { - ERROR("The %s field in the %s action is not an array\n", - fieldText(field), XkbcActionTypeText(action)); - ACTION("Action definition ignored\n"); - return False; + log_err(keymap->ctx, + "The %s field in the %s action is not an array; " + "Action definition ignored\n", + fieldText(field), ActionTypeText(action)); + return false; } -static Bool -ReportNotFound(unsigned action, unsigned field, const char *what, char *bad) +static inline bool +ReportNotFound(struct xkb_keymap *keymap, unsigned action, unsigned field, + const char *what, const char *bad) { - ERROR("%s named %s not found\n", what, bad); - ACTION("Ignoring the %s field of an %s action\n", fieldText(field), - XkbcActionTypeText(action)); - return False; + log_err(keymap->ctx, + "%s named %s not found; " + "Ignoring the %s field of an %s action\n", + what, bad, fieldText(field), ActionTypeText(action)); + return false; } -static Bool -HandleNoAction(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) +static bool +HandleNoAction(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, const ExprDef *value) + { - return ReportIllegal(action->type, field); + return ReportIllegal(keymap, action->type, field); } -static Bool -CheckLatchLockFlags(unsigned action, - unsigned field, ExprDef * value, unsigned *flags_inout) +static bool +CheckLatchLockFlags(struct xkb_keymap *keymap, unsigned action, + unsigned field, const ExprDef * value, + unsigned *flags_inout) { unsigned tmp; - ExprResult result; + bool result; if (field == F_ClearLocks) tmp = XkbSA_ClearLocks; else if (field == F_LatchToLock) tmp = XkbSA_LatchToLock; else - return False; /* WSGO! */ - if (!ExprResolveBoolean(value, &result, NULL, NULL)) - return ReportMismatch(action, field, "boolean"); - if (result.uval) + return false; /* WSGO! */ + + if (!ExprResolveBoolean(keymap->ctx, value, &result)) + return ReportMismatch(keymap, action, field, "boolean"); + + if (result) *flags_inout |= tmp; else *flags_inout &= ~tmp; - return True; + + return true; } -static Bool -CheckModifierField(struct xkb_desc * xkb, - unsigned action, - ExprDef * value, - unsigned *flags_inout, unsigned *mods_rtrn) +static bool +CheckModifierField(struct xkb_keymap *keymap, unsigned action, + const ExprDef *value, unsigned *flags_inout, + xkb_mod_mask_t *mods_rtrn) { - ExprResult rtrn; - - if (value->op == ExprIdent) - { + if (value->op == EXPR_IDENT) { const char *valStr; - valStr = XkbcAtomText(value->value.str); - if (valStr && ((uStrCaseCmp(valStr, "usemodmapmods") == 0) || - (uStrCaseCmp(valStr, "modmapmods") == 0))) - { + valStr = xkb_atom_text(keymap->ctx, value->value.str); + if (valStr && (istreq(valStr, "usemodmapmods") || + istreq(valStr, "modmapmods"))) { *mods_rtrn = 0; *flags_inout |= XkbSA_UseModMapMods; - return True; + return true; } } - if (!ExprResolveModMask(value, &rtrn, LookupVModMask, (char *) xkb)) - return ReportMismatch(action, F_Modifiers, "modifier mask"); - *mods_rtrn = rtrn.uval; + + if (!ExprResolveVModMask(keymap, value, mods_rtrn)) + return ReportMismatch(keymap, action, F_Modifiers, "modifier mask"); + *flags_inout &= ~XkbSA_UseModMapMods; - return True; + return true; } -static Bool -HandleSetLatchMods(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) +static bool +HandleSetLatchMods(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, + const ExprDef *value) { - struct xkb_mod_action *act; + struct xkb_mod_action *act = &action->mods; unsigned rtrn; - unsigned t1, t2; + unsigned t1; + xkb_mod_mask_t t2; - act = (struct xkb_mod_action *) action; - if (array_ndx != NULL) - { - switch (field) - { + if (array_ndx != NULL) { + switch (field) { case F_ClearLocks: case F_LatchToLock: case F_Modifiers: - return ReportActionNotArray(action->type, field); + return ReportActionNotArray(keymap, action->type, field); } } - switch (field) - { + switch (field) { case F_ClearLocks: case F_LatchToLock: rtrn = act->flags; - if (CheckLatchLockFlags(action->type, field, value, &rtrn)) - { + if (CheckLatchLockFlags(keymap, action->type, field, value, &rtrn)) { act->flags = rtrn; - return True; + return true; } - return False; + return false; + case F_Modifiers: t1 = act->flags; - if (CheckModifierField(xkb, action->type, value, &t1, &t2)) - { + if (CheckModifierField(keymap, action->type, value, &t1, &t2)) { act->flags = t1; - act->real_mods = act->mask = (t2 & 0xff); - act->vmods = (t2 >> 8) & 0xffff; - return True; + act->mods.mods = t2; + return true; } - return False; + return false; } - return ReportIllegal(action->type, field); + return ReportIllegal(keymap, action->type, field); } -static Bool -HandleLockMods(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) +static bool +HandleLockMods(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, const ExprDef *value) { - struct xkb_mod_action *act; - unsigned t1, t2; + struct xkb_mod_action *act = &action->mods; + unsigned t1; + xkb_mod_mask_t t2; - act = (struct xkb_mod_action *) action; if ((array_ndx != NULL) && (field == F_Modifiers)) - return ReportActionNotArray(action->type, field); - switch (field) - { + return ReportActionNotArray(keymap, action->type, field); + switch (field) { case F_Modifiers: t1 = act->flags; - if (CheckModifierField(xkb, action->type, value, &t1, &t2)) - { + if (CheckModifierField(keymap, action->type, value, &t1, &t2)) { act->flags = t1; - act->real_mods = act->mask = (t2 & 0xff); - act->vmods = (t2 >> 8) & 0xffff; - return True; - } - return False; - } - return ReportIllegal(action->type, field); -} - -static LookupEntry groupNames[] = { - {"group1", 1}, - {"group2", 2}, - {"group3", 3}, - {"group4", 4}, - {"group5", 5}, - {"group6", 6}, - {"group7", 7}, - {"group8", 8}, - {NULL, 0}, -}; + act->mods.mods = t2; + return true; + } + return false; + } + return ReportIllegal(keymap, action->type, field); +} -static Bool -CheckGroupField(unsigned action, - ExprDef * value, unsigned *flags_inout, int *grp_rtrn) +static bool +CheckGroupField(struct xkb_keymap *keymap, unsigned action, + const ExprDef *value, unsigned *flags_inout, + xkb_group_index_t *grp_rtrn) { - ExprDef *spec; - ExprResult rtrn; + const ExprDef *spec; - if ((value->op == OpNegate) || (value->op == OpUnaryPlus)) - { + if (value->op == EXPR_NEGATE || value->op == EXPR_UNARY_PLUS) { *flags_inout &= ~XkbSA_GroupAbsolute; spec = value->value.child; } - else - { + else { *flags_inout |= XkbSA_GroupAbsolute; spec = value; } - if (!ExprResolveInteger(spec, &rtrn, SimpleLookup, (char *) groupNames)) - return ReportMismatch(action, F_Group, "integer (range 1..8)"); - if ((rtrn.ival < 1) || (rtrn.ival > XkbNumKbdGroups)) - { - ERROR("Illegal group %d (must be in the range 1..%d)\n", rtrn.ival, - XkbNumKbdGroups); - ACTION("Action %s definition ignored\n", XkbcActionTypeText(action)); - return False; - } - if (value->op == OpNegate) - *grp_rtrn = -rtrn.ival; - else if (value->op == OpUnaryPlus) - *grp_rtrn = rtrn.ival; - else - *grp_rtrn = rtrn.ival - 1; - return True; + if (!ExprResolveGroup(keymap->ctx, spec, grp_rtrn)) + return ReportMismatch(keymap, action, F_Group, + "integer (range 1..8)"); + + if (value->op == EXPR_NEGATE) + *grp_rtrn = -*grp_rtrn; + else if (value->op != EXPR_UNARY_PLUS) + (*grp_rtrn)--; + + return true; } -static Bool -HandleSetLatchGroup(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) +static bool +HandleSetLatchGroup(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, + const ExprDef *value) { - struct xkb_group_action *act; + struct xkb_group_action *act = &action->group; unsigned rtrn; unsigned t1; - int t2; + xkb_group_index_t t2; - act = (struct xkb_group_action *) action; - if (array_ndx != NULL) - { - switch (field) - { + if (array_ndx != NULL) { + switch (field) { case F_ClearLocks: case F_LatchToLock: case F_Group: - return ReportActionNotArray(action->type, field); + return ReportActionNotArray(keymap, action->type, field); } } - switch (field) - { + switch (field) { case F_ClearLocks: case F_LatchToLock: rtrn = act->flags; - if (CheckLatchLockFlags(action->type, field, value, &rtrn)) - { + if (CheckLatchLockFlags(keymap, action->type, field, value, &rtrn)) { act->flags = rtrn; - return True; + return true; } - return False; + return false; + case F_Group: t1 = act->flags; - if (CheckGroupField(action->type, value, &t1, &t2)) - { + if (CheckGroupField(keymap, action->type, value, &t1, &t2)) { act->flags = t1; - act->group = t2; - return True; + act->group = t2; + return true; } - return False; + return false; } - return ReportIllegal(action->type, field); + return ReportIllegal(keymap, action->type, field); } -static Bool -HandleLockGroup(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) +static bool +HandleLockGroup(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, + const ExprDef *value) { - struct xkb_group_action *act; + struct xkb_group_action *act = &action->group; unsigned t1; - int t2; + xkb_group_index_t t2; - act = (struct xkb_group_action *) action; if ((array_ndx != NULL) && (field == F_Group)) - return ReportActionNotArray(action->type, field); - if (field == F_Group) - { + return ReportActionNotArray(keymap, action->type, field); + if (field == F_Group) { t1 = act->flags; - if (CheckGroupField(action->type, value, &t1, &t2)) - { + if (CheckGroupField(keymap, action->type, value, &t1, &t2)) { act->flags = t1; - act->group = t2; - return True; + act->group = t2; + return true; } - return False; + return false; } - return ReportIllegal(action->type, field); + return ReportIllegal(keymap, action->type, field); } -static Bool -HandleMovePtr(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) +static bool +HandleMovePtr(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, const ExprDef *value) { - ExprResult rtrn; - struct xkb_pointer_action *act; - Bool absolute; + struct xkb_pointer_action *act = &action->ptr; + bool absolute; - act = (struct xkb_pointer_action *) action; if ((array_ndx != NULL) && ((field == F_X) || (field == F_Y))) - return ReportActionNotArray(action->type, field); + return ReportActionNotArray(keymap, action->type, field); + + if (field == F_X || field == F_Y) { + int val; - if ((field == F_X) || (field == F_Y)) - { - if ((value->op == OpNegate) || (value->op == OpUnaryPlus)) - absolute = False; + if (value->op == EXPR_NEGATE || value->op == EXPR_UNARY_PLUS) + absolute = false; else - absolute = True; - if (!ExprResolveInteger(value, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, "integer"); - if (field == F_X) - { + absolute = true; + + if (!ExprResolveInteger(keymap->ctx, value, &val)) + return ReportMismatch(keymap, action->type, field, "integer"); + + if (field == F_X) { if (absolute) act->flags |= XkbSA_MoveAbsoluteX; - act->x = rtrn.ival; + act->x = val; } - else - { + else { if (absolute) act->flags |= XkbSA_MoveAbsoluteY; - act->y = rtrn.ival; + act->y = val; } - return True; + + return true; } - else if (field == F_Accel) - { - if (!ExprResolveBoolean(value, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, "boolean"); - if (rtrn.uval) + else if (field == F_Accel) { + bool set; + + if (!ExprResolveBoolean(keymap->ctx, value, &set)) + return ReportMismatch(keymap, action->type, field, "boolean"); + + if (set) act->flags &= ~XkbSA_NoAcceleration; else act->flags |= XkbSA_NoAcceleration; } - return ReportIllegal(action->type, field); + + return ReportIllegal(keymap, action->type, field); } -static LookupEntry btnNames[] = { - {"button1", 1}, - {"button2", 2}, - {"button3", 3}, - {"button4", 4}, - {"button5", 5}, - {"default", 0}, - {NULL, 0} +static const LookupEntry lockWhich[] = { + { "both", 0 }, + { "lock", XkbSA_LockNoUnlock }, + { "neither", (XkbSA_LockNoLock | XkbSA_LockNoUnlock) }, + { "unlock", XkbSA_LockNoLock }, + { NULL, 0 } }; -static LookupEntry lockWhich[] = { - {"both", 0}, - {"lock", XkbSA_LockNoUnlock}, - {"neither", (XkbSA_LockNoLock | XkbSA_LockNoUnlock)}, - {"unlock", XkbSA_LockNoLock}, - {NULL, 0} -}; +static bool +HandlePtrBtn(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, const ExprDef *value) +{ + struct xkb_pointer_button_action *act = &action->btn; + + if (field == F_Button) { + int btn; -static Bool -HandlePtrBtn(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) -{ - ExprResult rtrn; - struct xkb_pointer_button_action *act; - - act = (struct xkb_pointer_button_action *) action; - if (field == F_Button) - { - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveInteger - (value, &rtrn, SimpleLookup, (char *) btnNames)) - return ReportMismatch(action->type, field, + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (!ExprResolveButton(keymap->ctx, value, &btn)) + return ReportMismatch(keymap, action->type, field, "integer (range 1..5)"); - if ((rtrn.ival < 0) || (rtrn.ival > 5)) - { - ERROR("Button must specify default or be in the range 1..5\n"); - ACTION("Illegal button value %d ignored\n", rtrn.ival); - return False; - } - act->button = rtrn.ival; - return True; - } - else if ((action->type == XkbSA_LockPtrBtn) && (field == F_Affect)) - { - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveEnum(value, &rtrn, lockWhich)) - return ReportMismatch(action->type, field, "lock or unlock"); + + if (btn < 0 || btn > 5) { + log_err(keymap->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 == XkbSA_LockPtrBtn) && (field == F_Affect)) { + unsigned int val; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (!ExprResolveEnum(keymap->ctx, value, &val, lockWhich)) + return ReportMismatch(keymap, action->type, field, + "lock or unlock"); + act->flags &= ~(XkbSA_LockNoLock | XkbSA_LockNoUnlock); - act->flags |= rtrn.ival; - return True; + act->flags |= val; + return true; } - else if (field == F_Count) - { - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveInteger - (value, &rtrn, SimpleLookup, (char *) btnNames)) - return ReportMismatch(action->type, field, "integer"); - if ((rtrn.ival < 0) || (rtrn.ival > 255)) - { - ERROR("The count field must have a value in the range 0..255\n"); - ACTION("Illegal count %d ignored\n", rtrn.ival); - return False; + else if (field == F_Count) { + int btn; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + /* XXX: Should this actually be ResolveButton? */ + if (!ExprResolveButton(keymap->ctx, value, &btn)) + return ReportMismatch(keymap, action->type, field, "integer"); + + if (btn < 0 || btn > 255) { + log_err(keymap->ctx, + "The count field must have a value in the range 0..255; " + "Illegal count %d ignored\n", btn); + return false; } - act->count = rtrn.ival; - return True; + + act->count = btn; + return true; } - return ReportIllegal(action->type, field); + return ReportIllegal(keymap, action->type, field); } -static LookupEntry ptrDflts[] = { - {"dfltbtn", XkbSA_AffectDfltBtn}, - {"defaultbutton", XkbSA_AffectDfltBtn}, - {"button", XkbSA_AffectDfltBtn}, - {NULL, 0} +static const LookupEntry ptrDflts[] = { + { "dfltbtn", XkbSA_AffectDfltBtn }, + { "defaultbutton", XkbSA_AffectDfltBtn }, + { "button", XkbSA_AffectDfltBtn }, + { NULL, 0 } }; -static Bool -HandleSetPtrDflt(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) -{ - ExprResult rtrn; - struct xkb_pointer_default_action *act; - - act = (struct xkb_pointer_default_action *) action; - if (field == F_Affect) - { - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveEnum(value, &rtrn, ptrDflts)) - return ReportMismatch(action->type, field, "pointer component"); - act->affect = rtrn.uval; - return True; - } - else if ((field == F_Button) || (field == F_Value)) - { - ExprDef *btn; - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if ((value->op == OpNegate) || (value->op == OpUnaryPlus)) - { +static bool +HandleSetPtrDflt(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, + const ExprDef *value) +{ + struct xkb_pointer_default_action *act = &action->dflt; + + if (field == F_Affect) { + unsigned int val; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (!ExprResolveEnum(keymap->ctx, value, &val, ptrDflts)) + return ReportMismatch(keymap, action->type, field, + "pointer component"); + act->affect = val; + return true; + } + else if ((field == F_Button) || (field == F_Value)) { + const ExprDef *button; + int btn; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (value->op == EXPR_NEGATE || value->op == EXPR_UNARY_PLUS) { act->flags &= ~XkbSA_DfltBtnAbsolute; - btn = value->value.child; + button = value->value.child; } - else - { + else { act->flags |= XkbSA_DfltBtnAbsolute; - btn = value; + button = value; } - if (!ExprResolveInteger - (btn, &rtrn, SimpleLookup, (char *) btnNames)) - return ReportMismatch(action->type, field, + if (!ExprResolveButton(keymap->ctx, button, &btn)) + return ReportMismatch(keymap, action->type, field, "integer (range 1..5)"); - if ((rtrn.ival < 0) || (rtrn.ival > 5)) - { - ERROR("New default button value must be in the range 1..5\n"); - ACTION("Illegal default button value %d ignored\n", rtrn.ival); - return False; - } - if (rtrn.ival == 0) - { - ERROR("Cannot set default pointer button to \"default\"\n"); - ACTION("Illegal default button setting ignored\n"); - return False; - } - if (value->op == OpNegate) - act->value = -rtrn.ival; - else - act->value = rtrn.ival; - return True; - } - return ReportIllegal(action->type, field); -} -static LookupEntry isoNames[] = { - {"mods", XkbSA_ISONoAffectMods}, - {"modifiers", XkbSA_ISONoAffectMods}, - {"group", XkbSA_ISONoAffectGroup}, - {"groups", XkbSA_ISONoAffectGroup}, - {"ptr", XkbSA_ISONoAffectPtr}, - {"pointer", XkbSA_ISONoAffectPtr}, - {"ctrls", XkbSA_ISONoAffectCtrls}, - {"controls", XkbSA_ISONoAffectCtrls}, - {"all", ~((unsigned) 0)}, - {"none", 0}, - {NULL, 0}, + if (btn < 0 || btn > 5) { + log_err(keymap->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(keymap->ctx, + "Cannot set default pointer button to \"default\"; " + "Illegal default button setting ignored\n"); + return false; + } + + act->value = (value->op == EXPR_NEGATE ? -btn: btn); + return true; + } + + return ReportIllegal(keymap, action->type, field); +} + +static const LookupEntry isoNames[] = { + { "mods", XkbSA_ISONoAffectMods }, + { "modifiers", XkbSA_ISONoAffectMods }, + { "group", XkbSA_ISONoAffectGroup }, + { "groups", XkbSA_ISONoAffectGroup }, + { "ptr", XkbSA_ISONoAffectPtr }, + { "pointer", XkbSA_ISONoAffectPtr }, + { "ctrls", XkbSA_ISONoAffectCtrls }, + { "controls", XkbSA_ISONoAffectCtrls }, + { "all", ~((unsigned) 0) }, + { "none", 0 }, + { NULL, 0 }, }; -static Bool -HandleISOLock(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) -{ - ExprResult rtrn; - struct xkb_iso_action *act; - unsigned flags, mods; - int group; - - act = (struct xkb_iso_action *) action; - switch (field) - { - case F_Modifiers: - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); +static bool +HandleISOLock(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, const ExprDef *value) +{ + struct xkb_iso_action *act = &action->iso; + + if (field == F_Modifiers) { + unsigned flags; + xkb_mod_mask_t mods; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + flags = act->flags; - if (CheckModifierField(xkb, action->type, value, &flags, &mods)) - { - act->flags = flags & (~XkbSA_ISODfltIsGroup); - act->real_mods = mods & 0xff; - act->vmods = (mods >> 8) & 0xff; - return True; - } - return False; - case F_Group: - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); + if (!CheckModifierField(keymap, action->type, value, &flags, &mods)) + return false; + + act->flags = flags & (~XkbSA_ISODfltIsGroup); + act->mods.mods = mods; + return true; + } + else if (field == F_Group) { + xkb_group_index_t group; + unsigned flags; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + flags = act->flags; - if (CheckGroupField(action->type, value, &flags, &group)) - { - act->flags = flags | XkbSA_ISODfltIsGroup; - act->group = group; - return True; - } - return False; - case F_Affect: - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveMask(value, &rtrn, SimpleLookup, (char *) isoNames)) - return ReportMismatch(action->type, field, "keyboard component"); - act->affect = (~rtrn.uval) & XkbSA_ISOAffectMask; - return True; - } - return ReportIllegal(action->type, field); -} - -static Bool -HandleSwitchScreen(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) -{ - ExprResult rtrn; - struct xkb_switch_screen_action *act; - - act = (struct xkb_switch_screen_action *) action; - if (field == F_Screen) - { - ExprDef *scrn; - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if ((value->op == OpNegate) || (value->op == OpUnaryPlus)) - { + if (!CheckGroupField(keymap, action->type, value, &flags, &group)) + return false; + + act->flags = flags | XkbSA_ISODfltIsGroup; + act->group = group; + return true; + } else if (F_Affect) { + xkb_mod_mask_t mask; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (!ExprResolveMask(keymap->ctx, value, &mask, isoNames)) + return ReportMismatch(keymap, action->type, field, + "keyboard component"); + + act->affect = (~mask) & XkbSA_ISOAffectMask; + return true; + } + + return ReportIllegal(keymap, action->type, field); +} + +static bool +HandleSwitchScreen(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, + const ExprDef *value) +{ + struct xkb_switch_screen_action *act = &action->screen; + + if (field == F_Screen) { + const ExprDef *scrn; + int val; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (value->op == EXPR_NEGATE || value->op == EXPR_UNARY_PLUS) { act->flags &= ~XkbSA_SwitchAbsolute; scrn = value->value.child; } - else - { + else { act->flags |= XkbSA_SwitchAbsolute; scrn = value; } - if (!ExprResolveInteger(scrn, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, "integer (0..255)"); - if ((rtrn.ival < 0) || (rtrn.ival > 255)) - { - ERROR("Screen index must be in the range 1..255\n"); - ACTION("Illegal screen value %d ignored\n", rtrn.ival); - return False; + if (!ExprResolveInteger(keymap->ctx, scrn, &val)) + return ReportMismatch(keymap, action->type, field, + "integer (0..255)"); + + if (val < 0 || val > 255) { + log_err(keymap->ctx, + "Screen index must be in the range 1..255; " + "Illegal screen value %d ignored\n", val); + return false; } - if (value->op == OpNegate) - act->screen = -rtrn.ival; - else - act->screen = rtrn.ival; - return True; + + act->screen = (value->op == EXPR_NEGATE ? -val : val); + return true; } - else if (field == F_Same) - { - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveBoolean(value, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, "boolean"); - if (rtrn.uval) + else if (field == F_Same) { + bool set; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (!ExprResolveBoolean(keymap->ctx, value, &set)) + return ReportMismatch(keymap, action->type, field, "boolean"); + + if (set) act->flags &= ~XkbSA_SwitchApplication; else act->flags |= XkbSA_SwitchApplication; - return True; + + return true; } - return ReportIllegal(action->type, field); + + return ReportIllegal(keymap, action->type, field); } -LookupEntry ctrlNames[] = { - {"repeatkeys", XkbRepeatKeysMask} - , - {"repeat", XkbRepeatKeysMask} - , - {"autorepeat", XkbRepeatKeysMask} - , - {"slowkeys", XkbSlowKeysMask} - , - {"bouncekeys", XkbBounceKeysMask} - , - {"stickykeys", XkbStickyKeysMask} - , - {"mousekeys", XkbMouseKeysMask} - , - {"mousekeysaccel", XkbMouseKeysAccelMask} - , - {"accessxkeys", XkbAccessXKeysMask} - , - {"accessxtimeout", XkbAccessXTimeoutMask} - , - {"accessxfeedback", XkbAccessXFeedbackMask} - , - {"audiblebell", XkbAudibleBellMask} - , - {"overlay1", XkbOverlay1Mask} - , - {"overlay2", XkbOverlay2Mask} - , - {"ignoregrouplock", XkbIgnoreGroupLockMask} - , - {"all", XkbAllBooleanCtrlsMask} - , - {"none", 0} - , - {NULL, 0} +const LookupEntry ctrlNames[] = { + { "repeatkeys", XkbRepeatKeysMask }, + { "repeat", XkbRepeatKeysMask }, + { "autorepeat", XkbRepeatKeysMask }, + { "slowkeys", XkbSlowKeysMask }, + { "bouncekeys", XkbBounceKeysMask }, + { "stickykeys", XkbStickyKeysMask }, + { "mousekeys", XkbMouseKeysMask }, + { "mousekeysaccel", XkbMouseKeysAccelMask }, + { "accessxkeys", XkbAccessXKeysMask }, + { "accessxtimeout", XkbAccessXTimeoutMask }, + { "accessxfeedback", XkbAccessXFeedbackMask }, + { "audiblebell", XkbAudibleBellMask }, + { "ignoregrouplock", XkbIgnoreGroupLockMask }, + { "all", XkbAllBooleanCtrlsMask }, + { "overlay1", 0 }, + { "overlay2", 0 }, + { "none", 0 }, + { NULL, 0 } }; -static Bool -HandleSetLockControls(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) -{ - ExprResult rtrn; - struct xkb_controls_action *act; - - act = (struct xkb_controls_action *) action; - if (field == F_Controls) - { - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveMask - (value, &rtrn, SimpleLookup, (char *) ctrlNames)) - return ReportMismatch(action->type, field, "controls mask"); - act->ctrls = rtrn.uval; - return True; - } - return ReportIllegal(action->type, field); -} - -static LookupEntry evNames[] = { - {"press", XkbSA_MessageOnPress}, - {"keypress", XkbSA_MessageOnPress}, - {"release", XkbSA_MessageOnRelease}, - {"keyrelease", XkbSA_MessageOnRelease}, - {"all", XkbSA_MessageOnPress | XkbSA_MessageOnRelease}, - {"none", 0}, - {NULL, 0} +static bool +HandleSetLockControls(struct xkb_keymap *keymap, + union xkb_action *action, + unsigned field, const ExprDef *array_ndx, + const ExprDef *value) +{ + struct xkb_controls_action *act = &action->ctrls; + + if (field == F_Controls) { + unsigned int mask; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (!ExprResolveMask(keymap->ctx, value, &mask, ctrlNames)) + return ReportMismatch(keymap, action->type, field, + "controls mask"); + + act->ctrls = mask; + return true; + } + + return ReportIllegal(keymap, action->type, field); +} + +static const LookupEntry evNames[] = { + { "press", XkbSA_MessageOnPress }, + { "keypress", XkbSA_MessageOnPress }, + { "release", XkbSA_MessageOnRelease }, + { "keyrelease", XkbSA_MessageOnRelease }, + { "all", XkbSA_MessageOnPress | XkbSA_MessageOnRelease }, + { "none", 0 }, + { NULL, 0 } }; -static Bool -HandleActionMessage(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) -{ - ExprResult rtrn; - struct xkb_message_action *act; - - act = (struct xkb_message_action *) action; - switch (field) - { - case F_Report: - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveMask(value, &rtrn, SimpleLookup, (char *) evNames)) - return ReportMismatch(action->type, field, "key event mask"); +static bool +HandleActionMessage(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, + const ExprDef *value) +{ + struct xkb_message_action *act = &action->msg; + + if (field == F_Report) { + unsigned int mask; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (!ExprResolveMask(keymap->ctx, value, &mask, evNames)) + return ReportMismatch(keymap, action->type, field, + "key event mask"); + + /* FIXME: Something seems wrong here... */ act->flags &= ~(XkbSA_MessageOnPress | XkbSA_MessageOnRelease); - act->flags = - rtrn.uval & (XkbSA_MessageOnPress | XkbSA_MessageOnRelease); - return True; - case F_GenKeyEvent: - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveBoolean(value, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, "boolean"); - if (rtrn.uval) + act->flags = mask & (XkbSA_MessageOnPress | XkbSA_MessageOnRelease); + return true; + } + else if (field == F_GenKeyEvent) { + bool set; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (!ExprResolveBoolean(keymap->ctx, value, &set)) + return ReportMismatch(keymap, action->type, field, "boolean"); + + if (set) act->flags |= XkbSA_MessageGenKeyEvent; else act->flags &= ~XkbSA_MessageGenKeyEvent; - return True; - case F_Data: - if (array_ndx == NULL) - { - if (!ExprResolveString(value, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, "string"); - else - { - int len = strlen(rtrn.str); - if ((len < 1) || (len > 6)) - { - WARN("An action message can hold only 6 bytes\n"); - ACTION("Extra %d bytes ignored\n", len - 6); - } - strncpy((char *) act->message, rtrn.str, 6); - } - return True; + + return true; + } + else if (field == F_Data && !array_ndx) { + const char *str; + int len; + + if (!ExprResolveString(keymap->ctx, value, &str)) + return ReportMismatch(keymap, action->type, field, "string"); + + len = strlen(str); + if (len < 1 || len > 6) { + log_warn(keymap->ctx, + "An action message can hold only 6 bytes; " + "Extra %d bytes ignored\n", len - 6); } - else - { - unsigned ndx; - if (!ExprResolveInteger(array_ndx, &rtrn, NULL, NULL)) - { - ERROR("Array subscript must be integer\n"); - ACTION("Illegal subscript ignored\n"); - return False; - } - ndx = rtrn.uval; - if (ndx > 5) - { - ERROR("An action message is at most 6 bytes long\n"); - ACTION("Attempt to use data[%d] ignored\n", ndx); - return False; - } - if (!ExprResolveInteger(value, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, "integer"); - if ((rtrn.ival < 0) || (rtrn.ival > 255)) - { - ERROR("Message data must be in the range 0..255\n"); - ACTION("Illegal datum %d ignored\n", rtrn.ival); - return False; - } - act->message[ndx] = rtrn.uval; + + strncpy((char *) act->message, str, 6); + return true; + } + else if (field == F_Data && array_ndx) { + int ndx, datum; + + if (!ExprResolveInteger(keymap->ctx, array_ndx, &ndx)) { + log_err(keymap->ctx, + "Array subscript must be integer; " + "Illegal subscript ignored\n"); + return false; + } + + if (ndx < 0 || ndx > 5) { + log_err(keymap->ctx, + "An action message is at most 6 bytes long; " + "Attempt to use data[%d] ignored\n", ndx); + return false; + } + + if (!ExprResolveInteger(keymap->ctx, value, &datum)) + return ReportMismatch(keymap, action->type, field, "integer"); + + if (datum < 0 || datum > 255) { + log_err(keymap->ctx, + "Message data must be in the range 0..255; " + "Illegal datum %d ignored\n", datum); + return false; } - return True; + + act->message[ndx] = (uint8_t) datum; + return true; } - return ReportIllegal(action->type, field); + + return ReportIllegal(keymap, action->type, field); } -static Bool -HandleRedirectKey(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) +static bool +HandleRedirectKey(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, + const ExprDef *value) { - ExprResult rtrn; - struct xkb_redirect_key_action *act; - unsigned t1, t2; + struct xkb_key *key; + struct xkb_redirect_key_action *act = &action->redirect; + unsigned t1; + xkb_mod_mask_t t2; unsigned long tmp; + char key_name[XkbKeyNameLength]; if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); + return ReportActionNotArray(keymap, action->type, field); - act = (struct xkb_redirect_key_action *) action; - switch (field) - { + switch (field) { case F_Keycode: - if (!ExprResolveKeyName(value, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, "key name"); - tmp = KeyNameToLong(rtrn.keyName.name); - if (!FindNamedKey(xkb, tmp, &t1, True, CreateKeyNames(xkb), 0)) - { - return ReportNotFound(action->type, field, "Key", - XkbcKeyNameText(rtrn.keyName.name)); - } - act->new_key = t1; - return True; + if (!ExprResolveKeyName(keymap->ctx, value, key_name)) + return ReportMismatch(keymap, action->type, field, "key name"); + + tmp = KeyNameToLong(key_name); + key = FindNamedKey(keymap, tmp, true, 0); + if (!key) + return ReportNotFound(keymap, action->type, field, "Key", + KeyNameText(key_name)); + act->new_kc = XkbKeyGetKeycode(keymap, key); + return true; + case F_ModsToClear: case F_Modifiers: t1 = 0; - if (CheckModifierField(xkb, action->type, value, &t1, &t2)) - { + if (CheckModifierField(keymap, action->type, value, &t1, &t2)) { act->mods_mask |= (t2 & 0xff); if (field == F_Modifiers) act->mods |= (t2 & 0xff); else act->mods &= ~(t2 & 0xff); - t2 = (t2 >> 8) & 0xffff; + t2 = (t2 >> XkbNumModifiers) & 0xffff; act->vmods_mask |= t2; if (field == F_Modifiers) act->vmods |= t2; else act->vmods &= ~t2; - return True; + return true; } - return True; + return true; } - return ReportIllegal(action->type, field); + return ReportIllegal(keymap, action->type, field); } -static Bool -HandleDeviceBtn(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) +static bool +HandleDeviceBtn(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, + const ExprDef *value) { - ExprResult rtrn; - struct xkb_device_button_action *act; + struct xkb_device_button_action *act = &action->devbtn; + + if (field == F_Button) { + int val; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); - act = (struct xkb_device_button_action *) action; - if (field == F_Button) - { - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveInteger(value, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, + if (!ExprResolveInteger(keymap->ctx, value, &val)) + return ReportMismatch(keymap, action->type, field, "integer (range 1..255)"); - if ((rtrn.ival < 0) || (rtrn.ival > 255)) - { - ERROR("Button must specify default or be in the range 1..255\n"); - ACTION("Illegal button value %d ignored\n", rtrn.ival); - return False; - } - act->button = rtrn.ival; - return True; - } - else if ((action->type == XkbSA_LockDeviceBtn) && (field == F_Affect)) - { - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveEnum(value, &rtrn, lockWhich)) - return ReportMismatch(action->type, field, "lock or unlock"); + + if (val < 0 || val > 255) { + log_err(keymap->ctx, + "Button must specify default or be in the range 1..255; " + "Illegal button value %d ignored\n", val); + return false; + } + + act->button = val; + return true; + } + else if (action->type == XkbSA_LockDeviceBtn && field == F_Affect) { + unsigned int val; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (!ExprResolveEnum(keymap->ctx, value, &val, lockWhich)) + return ReportMismatch(keymap, action->type, field, + "lock or unlock"); + act->flags &= ~(XkbSA_LockNoLock | XkbSA_LockNoUnlock); - act->flags |= rtrn.ival; - return True; + act->flags |= val; + return true; } - else if (field == F_Count) - { - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveInteger - (value, &rtrn, SimpleLookup, (char *) btnNames)) - return ReportMismatch(action->type, field, "integer"); - if ((rtrn.ival < 0) || (rtrn.ival > 255)) - { - ERROR("The count field must have a value in the range 0..255\n"); - ACTION("Illegal count %d ignored\n", rtrn.ival); - return False; - } - act->count = rtrn.ival; - return True; - } - else if (field == F_Device) - { - if (array_ndx != NULL) - return ReportActionNotArray(action->type, field); - if (!ExprResolveInteger(value, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, + else if (field == F_Count) { + int btn; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + /* XXX: Should this actually be ResolveButton? */ + if (!ExprResolveButton(keymap->ctx, value, &btn)) + return ReportMismatch(keymap, action->type, field, "integer"); + + if (btn < 0 || btn > 255) { + log_err(keymap->ctx, + "The count field must have a value in the range 0..255; " + "Illegal count %d ignored\n", btn); + return false; + } + + act->count = btn; + return true; + } + else if (field == F_Device) { + int val; + + if (array_ndx) + return ReportActionNotArray(keymap, action->type, field); + + if (!ExprResolveInteger(keymap->ctx, value, &val)) + return ReportMismatch(keymap, action->type, field, "integer (range 1..255)"); - if ((rtrn.ival < 0) || (rtrn.ival > 255)) - { - ERROR("Device must specify default or be in the range 1..255\n"); - ACTION("Illegal device value %d ignored\n", rtrn.ival); - return False; + + if (val < 0 || val > 255) { + log_err(keymap->ctx, + "Device must specify default or be in the range 1..255; " + "Illegal device value %d ignored\n", val); + return false; } - act->device = rtrn.ival; - return True; + + act->device = val; + return true; } - return ReportIllegal(action->type, field); + + return ReportIllegal(keymap, action->type, field); } -static Bool -HandleDeviceValuator(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) +static bool +HandleDeviceValuator(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, + const ExprDef *value) { -#if 0 - ExprResult rtrn; - struct xkb_device_valuator_action *act; + struct xkb_device_valuator_action *act = &action->devval; + (void) act; - act = (struct xkb_device_valuator_action *) action; /* XXX - Not yet implemented */ -#endif - return False; + return false; } -static Bool -HandlePrivate(struct xkb_desc * xkb, - struct xkb_any_action * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) -{ - ExprResult rtrn; - - switch (field) - { - case F_Type: - if (!ExprResolveInteger(value, &rtrn, NULL, NULL)) - return ReportMismatch(PrivateAction, field, "integer"); - if ((rtrn.ival < 0) || (rtrn.ival > 255)) - { - ERROR("Private action type must be in the range 0..255\n"); - ACTION("Illegal type %d ignored\n", rtrn.ival); - return False; - } - action->type = rtrn.uval; - return True; - case F_Data: - if (array_ndx == NULL) - { - if (!ExprResolveString(value, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, "string"); - else - { - int len = strlen(rtrn.str); - if ((len < 1) || (len > 7)) - { - WARN("A private action has 7 data bytes\n"); - ACTION("Extra %d bytes ignored\n", len - 6); - return False; - } - strncpy((char *) action->data, rtrn.str, sizeof action->data); +static bool +HandlePrivate(struct xkb_keymap *keymap, union xkb_action *action, + unsigned field, const ExprDef *array_ndx, const ExprDef *value) +{ + struct xkb_private_action *act = &action->priv; + + if (field == F_Type) { + int type; + + if (!ExprResolveInteger(keymap->ctx, value, &type)) + return ReportMismatch(keymap, PrivateAction, field, "integer"); + + if (type < 0 || type > 255) { + log_err(keymap->ctx, + "Private action type must be in the range 0..255; " + "Illegal type %d ignored\n", type); + return false; + } + + act->type = (uint8_t) type; + return true; + } + else if (field == F_Data) { + if (array_ndx == NULL) { + const char *str; + int len; + + if (!ExprResolveString(keymap->ctx, value, &str)) + return ReportMismatch(keymap, action->type, field, "string"); + + len = strlen(str); + if (len < 1 || len > 7) { + log_warn(keymap->ctx, + "A private action has 7 data bytes; " + "Extra %d bytes ignored\n", len - 6); + return false; } - free(rtrn.str); - return True; + + strncpy((char *) act->data, str, sizeof(act->data)); + return true; } - else - { - unsigned ndx; - if (!ExprResolveInteger(array_ndx, &rtrn, NULL, NULL)) - { - ERROR("Array subscript must be integer\n"); - ACTION("Illegal subscript ignored\n"); - return False; + else { + int ndx, datum; + + if (!ExprResolveInteger(keymap->ctx, array_ndx, &ndx)) { + log_err(keymap->ctx, + "Array subscript must be integer; " + "Illegal subscript ignored\n"); + return false; } - ndx = rtrn.uval; - if (ndx >= sizeof action->data) - { - ERROR("The data for a private action is 18 bytes long\n"); - ACTION("Attempt to use data[%d] ignored\n", ndx); - return False; + + if (ndx < 0 || ndx >= sizeof(act->data)) { + log_err(keymap->ctx, + "The data for a private action is %zu bytes long; " + "Attempt to use data[%d] ignored\n", + sizeof(act->data), ndx); + return false; } - if (!ExprResolveInteger(value, &rtrn, NULL, NULL)) - return ReportMismatch(action->type, field, "integer"); - if ((rtrn.ival < 0) || (rtrn.ival > 255)) - { - ERROR("All data for a private action must be 0..255\n"); - ACTION("Illegal datum %d ignored\n", rtrn.ival); - return False; + + if (!ExprResolveInteger(keymap->ctx, value, &datum)) + return ReportMismatch(keymap, act->type, field, "integer"); + + if (datum < 0 || datum > 255) { + log_err(keymap->ctx, + "All data for a private action must be 0..255; " + "Illegal datum %d ignored\n", datum); + return false; } - action->data[ndx] = rtrn.uval; - return True; + + act->data[ndx] = (uint8_t) datum; + return true; } } - return ReportIllegal(PrivateAction, field); + + return ReportIllegal(keymap, PrivateAction, field); } -typedef Bool(*actionHandler) (struct xkb_desc * /* xkb */ , - struct xkb_any_action * /* action */ , - unsigned /* field */ , - ExprDef * /* array_ndx */ , - ExprDef * /* value */ - ); - -static actionHandler handleAction[XkbSA_NumActions + 1] = { - HandleNoAction /* NoAction */ , - HandleSetLatchMods /* SetMods */ , - HandleSetLatchMods /* LatchMods */ , - HandleLockMods /* LockMods */ , - HandleSetLatchGroup /* SetGroup */ , - HandleSetLatchGroup /* LatchGroup */ , - HandleLockGroup /* LockGroup */ , - HandleMovePtr /* MovePtr */ , - HandlePtrBtn /* PtrBtn */ , - HandlePtrBtn /* LockPtrBtn */ , - HandleSetPtrDflt /* SetPtrDflt */ , - HandleISOLock /* ISOLock */ , - HandleNoAction /* Terminate */ , - HandleSwitchScreen /* SwitchScreen */ , - HandleSetLockControls /* SetControls */ , - HandleSetLockControls /* LockControls */ , - HandleActionMessage /* ActionMessage */ , - HandleRedirectKey /* RedirectKey */ , - HandleDeviceBtn /* DeviceBtn */ , - HandleDeviceBtn /* LockDeviceBtn */ , - HandleDeviceValuator /* DeviceValuatr */ , - HandlePrivate /* Private */ +typedef bool (*actionHandler)(struct xkb_keymap *keymap, + union xkb_action *action, unsigned field, + const ExprDef *array_ndx, const ExprDef *value); + +static const actionHandler handleAction[XkbSA_NumActions + 1] = { + [XkbSA_NoAction] = HandleNoAction, + [XkbSA_SetMods] = HandleSetLatchMods, + [XkbSA_LatchMods] = HandleSetLatchMods, + [XkbSA_LockMods] = HandleLockMods, + [XkbSA_SetGroup] = HandleSetLatchGroup, + [XkbSA_LatchGroup] = HandleSetLatchGroup, + [XkbSA_LockGroup] = HandleLockGroup, + [XkbSA_MovePtr] = HandleMovePtr, + [XkbSA_PtrBtn] = HandlePtrBtn, + [XkbSA_LockPtrBtn] = HandlePtrBtn, + [XkbSA_SetPtrDflt] = HandleSetPtrDflt, + [XkbSA_ISOLock] = HandleISOLock, + [XkbSA_Terminate] = HandleNoAction, + [XkbSA_SwitchScreen] = HandleSwitchScreen, + [XkbSA_SetControls] = HandleSetLockControls, + [XkbSA_LockControls] = HandleSetLockControls, + [XkbSA_ActionMessage] = HandleActionMessage, + [XkbSA_RedirectKey] = HandleRedirectKey, + [XkbSA_DeviceBtn] = HandleDeviceBtn, + [XkbSA_LockDeviceBtn] = HandleDeviceBtn, + [XkbSA_DeviceValuator] = HandleDeviceValuator, + [PrivateAction] = HandlePrivate, }; /***====================================================================***/ @@ -1273,167 +1143,132 @@ static void ApplyActionFactoryDefaults(union xkb_action * action) { - if (action->type == XkbSA_SetPtrDflt) - { /* increment default button */ + if (action->type == XkbSA_SetPtrDflt) { /* increment default button */ action->dflt.affect = XkbSA_AffectDfltBtn; action->dflt.flags = 0; action->dflt.value = 1; } - else if (action->type == XkbSA_ISOLock) - { - action->iso.real_mods = LockMask; + else if (action->type == XkbSA_ISOLock) { + action->iso.mods.mods = (1 << ModNameToIndex(XKB_MOD_NAME_CAPS)); } - return; } -static void -ActionsInit(void); - int HandleActionDef(ExprDef * def, - struct xkb_desc * xkb, - struct xkb_any_action * action, unsigned mergeMode, ActionInfo * info) + struct xkb_keymap *keymap, + union xkb_action *action, ActionInfo *info) { ExprDef *arg; const char *str; unsigned tmp, hndlrType; - if (!actionsInitialized) - ActionsInit(); - - if (def->op != ExprActionDecl) - { - ERROR("Expected an action definition, found %s\n", - exprOpText(def->op)); - return False; - } - str = XkbcAtomText(def->value.action.name); - if (!str) - { - WSGO("Missing name in action definition!!\n"); - return False; - } - if (!stringToAction(str, &tmp)) - { - ERROR("Unknown action %s\n", str); - return False; + if (def->op != EXPR_ACTION_DECL) { + log_err(keymap->ctx, "Expected an action definition, found %s\n", + exprOpText(def->op)); + return false; + } + str = xkb_atom_text(keymap->ctx, def->value.action.name); + if (!str) { + log_wsgo(keymap->ctx, "Missing name in action definition!!\n"); + return false; + } + if (!stringToAction(str, &tmp)) { + log_err(keymap->ctx, "Unknown action %s\n", str); + return false; } action->type = hndlrType = tmp; - if (action->type != XkbSA_NoAction) - { + if (action->type != XkbSA_NoAction) { ApplyActionFactoryDefaults((union xkb_action *) action); while (info) { if ((info->action == XkbSA_NoAction) - || (info->action == hndlrType)) - { - if (!(*handleAction[hndlrType]) (xkb, action, - info->field, - info->array_ndx, - info->value)) - { - return False; + || (info->action == hndlrType)) { + if (!(*handleAction[hndlrType])(keymap, action, + info->field, + info->array_ndx, + info->value)) { + return false; } } info = info->next; } } for (arg = def->value.action.args; arg != NULL; - arg = (ExprDef *) arg->common.next) - { - ExprDef *field, *value, *arrayRtrn; - ExprResult elemRtrn, fieldRtrn; + arg = (ExprDef *) arg->common.next) { + const ExprDef *value; + ExprDef *field, *arrayRtrn; + const char *elemRtrn, *fieldRtrn; unsigned fieldNdx; - if (arg->op == OpAssign) - { + if (arg->op == EXPR_ASSIGN) { field = arg->value.binary.left; value = arg->value.binary.right; } - else - { - if ((arg->op == OpNot) || (arg->op == OpInvert)) - { + else { + if (arg->op == EXPR_NOT || arg->op == EXPR_INVERT) { field = arg->value.child; value = &constFalse; } - else - { + else { field = arg; value = &constTrue; } } - if (!ExprResolveLhs(field, &elemRtrn, &fieldRtrn, &arrayRtrn)) - return False; /* internal error -- already reported */ - - if (elemRtrn.str != NULL) - { - ERROR("Cannot change defaults in an action definition\n"); - ACTION("Ignoring attempt to change %s.%s\n", elemRtrn.str, - fieldRtrn.str); - free(elemRtrn.str); - free(fieldRtrn.str); - return False; - } - if (!stringToField(fieldRtrn.str, &fieldNdx)) - { - ERROR("Unknown field name %s\n", uStringText(fieldRtrn.str)); - free(elemRtrn.str); - free(fieldRtrn.str); - return False; - } - free(elemRtrn.str); - free(fieldRtrn.str); - if (!(*handleAction[hndlrType]) - (xkb, action, fieldNdx, arrayRtrn, value)) - { - return False; - } + if (!ExprResolveLhs(keymap->ctx, field, &elemRtrn, &fieldRtrn, + &arrayRtrn)) + return false; /* internal error -- already reported */ + + if (elemRtrn != NULL) { + log_err(keymap->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(keymap->ctx, "Unknown field name %s\n", fieldRtrn); + return false; + } + if (!handleAction[hndlrType](keymap, action, fieldNdx, arrayRtrn, + value)) + return false; } - return True; + return true; } /***====================================================================***/ int -SetActionField(struct xkb_desc * xkb, - char *elem, - char *field, - ExprDef * array_ndx, ExprDef * value, ActionInfo ** info_rtrn) +SetActionField(struct xkb_keymap *keymap, const char *elem, const char *field, + ExprDef *array_ndx, ExprDef *value, ActionInfo **info_rtrn) { ActionInfo *new, *old; - if (!actionsInitialized) - ActionsInit(); - - new = uTypedAlloc(ActionInfo); - if (new == NULL) - { - WSGO("Couldn't allocate space for action default\n"); - return False; + new = malloc(sizeof(*new)); + if (!new) { + log_wsgo(keymap->ctx, "Couldn't allocate space for action default\n"); + return false; } - if (uStrCaseCmp(elem, "action") == 0) + + if (istreq(elem, "action")) new->action = XkbSA_NoAction; - else - { - if (!stringToAction(elem, &new->action)) - { + else { + if (!stringToAction(elem, &new->action)) { free(new); - return False; + return false; } - if (new->action == XkbSA_NoAction) - { - ERROR("\"%s\" is not a valid field in a NoAction action\n", - field); + if (new->action == XkbSA_NoAction) { + log_err(keymap->ctx, + "\"%s\" is not a valid field in a NoAction action\n", + field); free(new); - return False; + return false; } } - if (!stringToField(field, &new->field)) - { - ERROR("\"%s\" is not a legal field name\n", field); + if (!stringToField(field, &new->field)) { + log_err(keymap->ctx, "\"%s\" is not a legal field name\n", field); free(new); - return False; + return false; } new->array_ndx = array_ndx; new->value = value; @@ -1445,29 +1280,5 @@ *info_rtrn = new; else old->next = new; - return True; -} - -/***====================================================================***/ - -static void -ActionsInit(void) -{ - if (!actionsInitialized) - { - bzero((char *) &constTrue, sizeof(constTrue)); - bzero((char *) &constFalse, sizeof(constFalse)); - constTrue.common.stmtType = StmtExpr; - constTrue.common.next = NULL; - constTrue.op = ExprIdent; - constTrue.type = TypeBoolean; - constTrue.value.str = xkb_intern_atom("true"); - constFalse.common.stmtType = StmtExpr; - constFalse.common.next = NULL; - constFalse.op = ExprIdent; - constFalse.type = TypeBoolean; - constFalse.value.str = xkb_intern_atom("false"); - actionsInitialized = 1; - } - return; + return true; } diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/action.h libxkbcommon-0.1.0~2/src/xkbcomp/action.h --- libxkbcommon-0.1.0~1/src/xkbcomp/action.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/action.h 2012-08-11 16:17:00.000000000 +0000 @@ -1,62 +1,64 @@ /************************************************************ - 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 (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 ACTION_H #define ACTION_H 1 -#define F_ClearLocks 0 -#define F_LatchToLock 1 -#define F_GenKeyEvent 2 -#define F_Report 3 -#define F_Default 4 -#define F_Affect 5 -#define F_Increment 6 -#define F_Modifiers 7 -#define F_Group 8 -#define F_X 9 -#define F_Y 10 -#define F_Accel 11 -#define F_Button 12 -#define F_Value 13 -#define F_Controls 14 -#define F_Type 15 -#define F_Count 16 -#define F_Screen 17 -#define F_Same 18 -#define F_Data 19 -#define F_Device 20 -#define F_Keycode 21 -#define F_ModsToClear 22 -#define F_LastField F_ModsToClear -#define F_NumFields (F_LastField+1) +#include "xkbcomp-priv.h" +#include "expr.h" + +#define F_ClearLocks 0 +#define F_LatchToLock 1 +#define F_GenKeyEvent 2 +#define F_Report 3 +#define F_Default 4 +#define F_Affect 5 +#define F_Increment 6 +#define F_Modifiers 7 +#define F_Group 8 +#define F_X 9 +#define F_Y 10 +#define F_Accel 11 +#define F_Button 12 +#define F_Value 13 +#define F_Controls 14 +#define F_Type 15 +#define F_Count 16 +#define F_Screen 17 +#define F_Same 18 +#define F_Data 19 +#define F_Device 20 +#define F_Keycode 21 +#define F_ModsToClear 22 +#define F_LastField F_ModsToClear +#define F_NumFields (F_LastField + 1) -#define PrivateAction (XkbSA_LastAction+1) +#define PrivateAction (XkbSA_LastAction + 1) -typedef struct _ActionInfo -{ +typedef struct _ActionInfo { unsigned action; unsigned field; ExprDef *array_ndx; @@ -64,21 +66,16 @@ struct _ActionInfo *next; } ActionInfo; -extern int HandleActionDef(ExprDef * /* def */ , - struct xkb_desc * /* xkb */ , - struct xkb_any_action * /* action */ , - unsigned /* mergeMode */ , - ActionInfo * /* info */ - ); - -extern int SetActionField(struct xkb_desc * /* xkb */ , - char * /* elem */ , - char * /* field */ , - ExprDef * /* index */ , - ExprDef * /* value */ , - ActionInfo ** /* info_rtrn */ - ); +extern int +HandleActionDef(ExprDef *def, struct xkb_keymap *keymap, + union xkb_action *action, + ActionInfo *info); + +extern int +SetActionField(struct xkb_keymap *keymap, const char *elem, const char *field, + ExprDef *index, ExprDef *value, + ActionInfo **info_rtrn); -extern LookupEntry ctrlNames[]; +extern const LookupEntry ctrlNames[]; #endif /* ACTION_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/alias.c libxkbcommon-0.1.0~2/src/xkbcomp/alias.c --- libxkbcommon-0.1.0~1/src/xkbcomp/alias.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/alias.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,287 +0,0 @@ -/************************************************************ - Copyright (c) 1995 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 "xkbcomp.h" -#include "xkballoc.h" -#include "xkbgeom.h" -#include "xkbmisc.h" -#include "misc.h" -#include "alias.h" -#include "keycodes.h" - -static void -HandleCollision(AliasInfo * old, AliasInfo * new) -{ - if (strncmp(new->real, old->real, XkbKeyNameLength) == 0) - { - if (((new->def.fileID == old->def.fileID) && (warningLevel > 0)) || - (warningLevel > 9)) - { - WARN("Alias of %s for %s declared more than once\n", - XkbcKeyNameText(new->alias), XkbcKeyNameText(new->real)); - ACTION("First definition ignored\n"); - } - } - else - { - char *use, *ignore; - if (new->def.merge == MergeAugment) - { - use = old->real; - ignore = new->real; - } - else - { - use = new->real; - ignore = old->real; - } - if (((old->def.fileID == new->def.fileID) && (warningLevel > 0)) || - (warningLevel > 9)) - { - WARN("Multiple definitions for alias %s\n", - XkbcKeyNameText(old->alias)); - ACTION("Using %s, ignoring %s\n", - XkbcKeyNameText(use), XkbcKeyNameText(ignore)); - } - if (use != old->real) - memcpy(old->real, use, XkbKeyNameLength); - } - old->def.fileID = new->def.fileID; - old->def.merge = new->def.merge; - return; -} - -static void -InitAliasInfo(AliasInfo * info, - unsigned merge, unsigned file_id, char *alias, char *real) -{ - bzero(info, sizeof(AliasInfo)); - info->def.merge = merge; - info->def.fileID = file_id; - strncpy(info->alias, alias, XkbKeyNameLength); - strncpy(info->real, real, XkbKeyNameLength); - return; -} - -int -HandleAliasDef(KeyAliasDef * def, - unsigned merge, unsigned file_id, AliasInfo ** info_in) -{ - AliasInfo *info; - - for (info = *info_in; info != NULL; info = (AliasInfo *) info->def.next) - { - if (strncmp(info->alias, def->alias, XkbKeyNameLength) == 0) - { - AliasInfo new; - InitAliasInfo(&new, merge, file_id, def->alias, def->real); - HandleCollision(info, &new); - return True; - } - } - info = uTypedCalloc(1, AliasInfo); - if (info == NULL) - { - WSGO("Allocation failure in HandleAliasDef\n"); - return False; - } - info->def.fileID = file_id; - info->def.merge = merge; - info->def.next = (CommonInfo *) * info_in; - memcpy(info->alias, def->alias, XkbKeyNameLength); - memcpy(info->real, def->real, XkbKeyNameLength); - *info_in = (AliasInfo *) AddCommonInfo(&(*info_in)->def, &info->def); - return True; -} - -void -ClearAliases(AliasInfo ** info_in) -{ - if ((info_in) && (*info_in)) - ClearCommonInfo(&(*info_in)->def); - return; -} - -Bool -MergeAliases(AliasInfo ** into, AliasInfo ** merge, unsigned how_merge) -{ - AliasInfo *tmp; - KeyAliasDef def; - - if ((*merge) == NULL) - return True; - if ((*into) == NULL) - { - *into = *merge; - *merge = NULL; - return True; - } - bzero((char *) &def, sizeof(KeyAliasDef)); - for (tmp = *merge; tmp != NULL; tmp = (AliasInfo *) tmp->def.next) - { - if (how_merge == MergeDefault) - def.merge = tmp->def.merge; - else - def.merge = how_merge; - memcpy(def.alias, tmp->alias, XkbKeyNameLength); - memcpy(def.real, tmp->real, XkbKeyNameLength); - if (!HandleAliasDef(&def, def.merge, tmp->def.fileID, into)) - return False; - } - return True; -} - -int -ApplyAliases(struct xkb_desc * xkb, Bool toGeom, AliasInfo ** info_in) -{ - register int i; - struct xkb_key_alias *old, *a; - AliasInfo *info; - int nNew, nOld; - int status; - - if (*info_in == NULL) - return True; - if (toGeom) - { - nOld = (xkb->geom ? xkb->geom->num_key_aliases : 0); - old = (xkb->geom ? xkb->geom->key_aliases : NULL); - } - else - { - nOld = (xkb->names ? xkb->names->num_key_aliases : 0); - old = (xkb->names ? xkb->names->key_aliases : NULL); - } - for (nNew = 0, info = *info_in; info != NULL; - info = (AliasInfo *) info->def.next) - { - unsigned long lname; - unsigned int kc; - - lname = KeyNameToLong(info->real); - if (!FindNamedKey(xkb, lname, &kc, False, CreateKeyNames(xkb), 0)) - { - if (warningLevel > 4) - { - WARN("Attempt to alias %s to non-existent key %s\n", - XkbcKeyNameText(info->alias), XkbcKeyNameText(info->real)); - ACTION("Ignored\n"); - } - info->alias[0] = '\0'; - continue; - } - lname = KeyNameToLong(info->alias); - if (FindNamedKey(xkb, lname, &kc, False, False, 0)) - { - if (warningLevel > 4) - { - WARN("Attempt to create alias with the name of a real key\n"); - ACTION("Alias \"%s = %s\" ignored\n", - XkbcKeyNameText(info->alias), - XkbcKeyNameText(info->real)); - } - info->alias[0] = '\0'; - continue; - } - nNew++; - if (old) - { - for (i = 0, a = old; i < nOld; i++, a++) - { - if (strncmp(a->alias, info->alias, XkbKeyNameLength) == 0) - { - AliasInfo old; - InitAliasInfo(&old, MergeAugment, 0, a->alias, a->real); - HandleCollision(&old, info); - memcpy(old.real, a->real, XkbKeyNameLength); - info->alias[0] = '\0'; - nNew--; - break; - } - } - } - } - if (nNew == 0) - { - ClearCommonInfo(&(*info_in)->def); - *info_in = NULL; - return True; - } - status = Success; - if (toGeom) - { - if (!xkb->geom) - { - struct xkb_geometry_sizes sizes; - bzero((char *) &sizes, sizeof(struct xkb_geometry_sizes)); - sizes.which = XkbGeomKeyAliasesMask; - sizes.num_key_aliases = nOld + nNew; - status = XkbcAllocGeometry(xkb, &sizes); - } - else - { - status = XkbcAllocGeomKeyAliases(xkb->geom, nOld + nNew); - } - if (xkb->geom) - old = xkb->geom->key_aliases; - } - else - { - status = XkbcAllocNames(xkb, XkbKeyAliasesMask, 0, nOld + nNew); - if (xkb->names) - old = xkb->names->key_aliases; - } - if (status != Success) - { - WSGO("Allocation failure in ApplyAliases\n"); - return False; - } - if (toGeom) - a = &xkb->geom->key_aliases[nOld]; - else - a = &xkb->names->key_aliases[nOld]; - for (info = *info_in; info != NULL; info = (AliasInfo *) info->def.next) - { - if (info->alias[0] != '\0') - { - strncpy(a->alias, info->alias, XkbKeyNameLength); - strncpy(a->real, info->real, XkbKeyNameLength); - a++; - } - } -#ifdef DEBUG - if ((a - old) != (nOld + nNew)) - { - WSGO("Expected %d aliases total but created %d\n", nOld + nNew, - a - old); - } -#endif - if (toGeom) - xkb->geom->num_key_aliases += nNew; - ClearCommonInfo(&(*info_in)->def); - *info_in = NULL; - return True; -} diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/alias.h libxkbcommon-0.1.0~2/src/xkbcomp/alias.h --- libxkbcommon-0.1.0~1/src/xkbcomp/alias.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/alias.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -/************************************************************ - Copyright (c) 1995 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 ALIAS_H -#define ALIAS_H 1 - -typedef struct _AliasInfo -{ - CommonInfo def; - char alias[XkbKeyNameLength + 1]; - char real[XkbKeyNameLength + 1]; -} AliasInfo; - -extern int HandleAliasDef(KeyAliasDef * /* def */ , - unsigned /* merge */ , - unsigned /* file_id */ , - AliasInfo ** /* info */ - ); - -extern void ClearAliases(AliasInfo ** /* info */ - ); - -extern Bool MergeAliases(AliasInfo ** /* into */ , - AliasInfo ** /* merge */ , - unsigned /* how_merge */ - ); - -extern int ApplyAliases(struct xkb_desc * /* xkb */ , - Bool /* toGeom */ , - AliasInfo ** /* info */ - ); - -#endif /* ALIAS_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/compat.c libxkbcommon-0.1.0~2/src/xkbcomp/compat.c --- libxkbcommon-0.1.0~1/src/xkbcomp/compat.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/compat.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,165 +1,218 @@ /************************************************************ - 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 (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 -#include "xkbcomp.h" -#include "xkballoc.h" -#include "xkbmisc.h" -#include "tokens.h" -#include "expr.h" -#include "vmod.h" -#include "misc.h" -#include "indicators.h" -#include "action.h" -#include "compat.h" +#include "xkbcomp-priv.h" #include "parseutils.h" +#include "action.h" +#include "vmod.h" + +enum si_field { + SI_FIELD_VIRTUAL_MOD = (1 << 0), + SI_FIELD_ACTION = (1 << 1), + SI_FIELD_AUTO_REPEAT = (1 << 2), + SI_FIELD_LOCKING_KEY = (1 << 3), + SI_FIELD_LEVEL_ONE_ONLY = (1 << 4), +}; + +typedef struct _SymInterpInfo { + enum si_field defined; + unsigned file_id; + enum merge_mode merge; + struct list entry; -typedef struct _SymInterpInfo -{ - CommonInfo defs; struct xkb_sym_interpret interp; } SymInterpInfo; -#define _SI_VirtualMod (1<<0) -#define _SI_Action (1<<1) -#define _SI_AutoRepeat (1<<2) -#define _SI_LockingKey (1<<3) -#define _SI_LevelOneOnly (1<<4) - -typedef struct _GroupCompatInfo -{ - unsigned char fileID; - unsigned char merge; - unsigned char real_mods; - uint32_t vmods; +enum led_field { + LED_FIELD_INDEX = (1 << 0), + LED_FIELD_MODS = (1 << 1), + LED_FIELD_GROUPS = (1 << 2), + LED_FIELD_CTRLS = (1 << 3), + LED_FIELD_EXPLICIT = (1 << 4), + LED_FIELD_AUTOMATIC = (1 << 5), + LED_FIELD_DRIVES_KBD = (1 << 6), +}; + +typedef struct _LEDInfo { + enum led_field defined; + unsigned file_id; + enum merge_mode merge; + struct list entry; + + xkb_atom_t name; + xkb_led_index_t indicator; + unsigned char flags; + unsigned char which_mods; + xkb_mod_mask_t mods; + unsigned char which_groups; + uint32_t groups; + unsigned int ctrls; +} LEDInfo; + +typedef struct _GroupCompatInfo { + unsigned file_id; + enum merge_mode merge; + bool defined; + xkb_mod_mask_t mods; } GroupCompatInfo; -typedef struct _CompatInfo -{ +typedef struct _CompatInfo { char *name; - unsigned fileID; + unsigned file_id; int errorCount; int nInterps; - SymInterpInfo *interps; + struct list interps; SymInterpInfo dflt; LEDInfo ledDflt; GroupCompatInfo groupCompat[XkbNumKbdGroups]; - LEDInfo *leds; + struct list leds; VModInfo vmods; ActionInfo *act; - struct xkb_desc * xkb; + struct xkb_keymap *keymap; } CompatInfo; -/***====================================================================***/ - -#define ReportSINotArray(si,f,i) \ - ReportNotArray("symbol interpretation",(f),siText((si),(i))) -#define ReportSIBadType(si,f,w,i) \ - ReportBadType("symbol interpretation",(f),siText((si),(i)),(w)) - -/***====================================================================***/ - -static char * +static const char * siText(SymInterpInfo * si, CompatInfo * info) { static char buf[128]; - if (si == &info->dflt) - { + if (si == &info->dflt) { snprintf(buf, sizeof(buf), "default"); } - else - { + else { snprintf(buf, sizeof(buf), "%s+%s(%s)", - XkbcKeysymText(si->interp.sym), - XkbcSIMatchText(si->interp.match), - XkbcModMaskText(si->interp.mods, False)); + KeysymText(si->interp.sym), + SIMatchText(si->interp.match), + ModMaskText(si->interp.mods)); } return buf; } +static inline bool +ReportSINotArray(CompatInfo *info, SymInterpInfo *si, const char *field) +{ + return ReportNotArray(info->keymap, "symbol interpretation", field, + siText(si, info)); +} + +static inline bool +ReportSIBadType(CompatInfo *info, SymInterpInfo *si, const char *field, + const char *wanted) +{ + return ReportBadType(info->keymap->ctx, "symbol interpretation", field, + siText(si, info), wanted); +} + +static inline bool +ReportIndicatorBadType(CompatInfo *info, LEDInfo *led, + const char *field, const char *wanted) +{ + return ReportBadType(info->keymap->ctx, "indicator map", field, + xkb_atom_text(info->keymap->ctx, led->name), + wanted); +} + +static inline bool +ReportIndicatorNotArray(CompatInfo *info, LEDInfo *led, + const char *field) +{ + return ReportNotArray(info->keymap, "indicator map", field, + xkb_atom_text(info->keymap->ctx, led->name)); +} + static void -InitCompatInfo(CompatInfo * info, struct xkb_desc * xkb) +ClearIndicatorMapInfo(struct xkb_context *ctx, LEDInfo * info) { - register int i; + info->name = xkb_atom_intern(ctx, "default"); + info->indicator = XKB_LED_INVALID; + info->flags = 0; + info->which_mods = 0; + info->mods = 0; + info->which_groups = info->groups = 0; + info->ctrls = 0; +} - info->xkb = xkb; +static void +InitCompatInfo(CompatInfo *info, struct xkb_keymap *keymap, unsigned file_id) +{ + info->keymap = keymap; info->name = NULL; - info->fileID = 0; + info->file_id = file_id; info->errorCount = 0; info->nInterps = 0; - info->interps = NULL; + list_init(&info->interps); info->act = NULL; - info->dflt.defs.fileID = info->fileID; - info->dflt.defs.defined = 0; - info->dflt.defs.merge = MergeOverride; + info->dflt.file_id = file_id; + info->dflt.defined = 0; + info->dflt.merge = MERGE_OVERRIDE; info->dflt.interp.flags = 0; info->dflt.interp.virtual_mod = XkbNoModifier; + memset(&info->dflt.interp.act, 0, sizeof(info->dflt.interp.act)); info->dflt.interp.act.type = XkbSA_NoAction; - for (i = 0; i < sizeof info->dflt.interp.act.data; i++) - { - info->dflt.interp.act.data[i] = 0; - } - ClearIndicatorMapInfo(&info->ledDflt); - info->ledDflt.defs.fileID = info->fileID; - info->ledDflt.defs.defined = 0; - info->ledDflt.defs.merge = MergeOverride; - bzero((char *) &info->groupCompat[0], - XkbNumKbdGroups * sizeof(GroupCompatInfo)); - info->leds = NULL; - InitVModInfo(&info->vmods, xkb); - return; + ClearIndicatorMapInfo(keymap->ctx, &info->ledDflt); + info->ledDflt.file_id = file_id; + info->ledDflt.defined = 0; + info->ledDflt.merge = MERGE_OVERRIDE; + memset(&info->groupCompat[0], 0, + XkbNumKbdGroups * sizeof(GroupCompatInfo)); + list_init(&info->leds); + InitVModInfo(&info->vmods, keymap); } static void -ClearCompatInfo(CompatInfo * info, struct xkb_desc * xkb) +ClearCompatInfo(CompatInfo *info) { - register int i; + ActionInfo *next_act; + SymInterpInfo *si, *next_si; + LEDInfo *led, *next_led; + struct xkb_keymap *keymap = info->keymap; - if (info->name != NULL) - free(info->name); + free(info->name); info->name = NULL; - info->dflt.defs.defined = 0; - info->dflt.defs.merge = MergeAugment; + info->dflt.defined = 0; + info->dflt.merge = MERGE_AUGMENT; info->dflt.interp.flags = 0; info->dflt.interp.virtual_mod = XkbNoModifier; + memset(&info->dflt.interp.act, 0, sizeof(info->dflt.interp.act)); info->dflt.interp.act.type = XkbSA_NoAction; - for (i = 0; i < sizeof info->dflt.interp.act.data; i++) - { - info->dflt.interp.act.data[i] = 0; - } - ClearIndicatorMapInfo(&info->ledDflt); + ClearIndicatorMapInfo(keymap->ctx, &info->ledDflt); info->nInterps = 0; - info->interps = (SymInterpInfo *) ClearCommonInfo(&info->interps->defs); - bzero((char *) &info->groupCompat[0], - XkbNumKbdGroups * sizeof(GroupCompatInfo)); - info->leds = (LEDInfo *) ClearCommonInfo(&info->leds->defs); - /* 3/30/94 (ef) -- XXX! Should free action info here */ - ClearVModInfo(&info->vmods, xkb); - return; + list_foreach_safe(si, next_si, &info->interps, entry) + free(si); + memset(&info->groupCompat[0], 0, + XkbNumKbdGroups * sizeof(GroupCompatInfo)); + list_foreach_safe(led, next_led, &info->leds, entry) + free(led); + while (info->act) { + next_act = info->act->next; + free(info->act); + info->act = next_act; + } + info->keymap = NULL; + ClearVModInfo(&info->vmods, keymap); } static SymInterpInfo * @@ -167,15 +220,13 @@ { SymInterpInfo *si; - si = uTypedAlloc(SymInterpInfo); - if (si) - { - bzero((char *) si, sizeof(SymInterpInfo)); - info->interps = - (SymInterpInfo *) AddCommonInfo(&info->interps->defs, - (CommonInfo *) si); - info->nInterps++; - } + si = calloc(1, sizeof(*si)); + if (!si) + return NULL; + + list_append(&si->entry, &info->interps); + info->nInterps++; + return si; } @@ -184,704 +235,1277 @@ { SymInterpInfo *old; - for (old = info->interps; old != NULL; - old = (SymInterpInfo *) old->defs.next) - { - if ((old->interp.sym == new->interp.sym) && - (old->interp.mods == new->interp.mods) && - (old->interp.match == new->interp.match)) - { + list_foreach(old, &info->interps, entry) + 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 +static bool +UseNewInterpField(enum si_field field, SymInterpInfo *old, SymInterpInfo *new, + int verbosity, enum si_field *collide) +{ + if (!(old->defined & field)) + return true; + + if (new->defined & field) { + if ((old->file_id == new->file_id && verbosity > 0) || verbosity > 9) + *collide |= field; + + if (new->merge != MERGE_AUGMENT) + return true; + } + + return false; +} + +static bool AddInterp(CompatInfo * info, SymInterpInfo * new) { - unsigned collide; + enum si_field collide; SymInterpInfo *old; + struct list entry; + int verbosity = xkb_get_log_verbosity(info->keymap->ctx); collide = 0; old = FindMatchingInterp(info, new); - if (old != NULL) - { - if (new->defs.merge == MergeReplace) - { - SymInterpInfo *next = (SymInterpInfo *) old->defs.next; - if (((old->defs.fileID == new->defs.fileID) - && (warningLevel > 0)) || (warningLevel > 9)) - { - WARN("Multiple definitions for \"%s\"\n", siText(new, info)); - ACTION("Earlier interpretation ignored\n"); - } + if (old != NULL) { + if (new->merge == MERGE_REPLACE) { + entry = old->entry; + if ((old->file_id == new->file_id && verbosity > 0) || + verbosity > 9) + log_warn(info->keymap->ctx, + "Multiple definitions for \"%s\"; " + "Earlier interpretation ignored\n", + siText(new, info)); *old = *new; - old->defs.next = &next->defs; - return True; + old->entry = entry; + return true; } - if (UseNewField(_SI_VirtualMod, &old->defs, &new->defs, &collide)) - { + + if (UseNewInterpField(SI_FIELD_VIRTUAL_MOD, old, new, verbosity, + &collide)) { old->interp.virtual_mod = new->interp.virtual_mod; - old->defs.defined |= _SI_VirtualMod; + old->defined |= SI_FIELD_VIRTUAL_MOD; } - if (UseNewField(_SI_Action, &old->defs, &new->defs, &collide)) - { + if (UseNewInterpField(SI_FIELD_ACTION, old, new, verbosity, + &collide)) { old->interp.act = new->interp.act; - old->defs.defined |= _SI_Action; + old->defined |= SI_FIELD_ACTION; } - if (UseNewField(_SI_AutoRepeat, &old->defs, &new->defs, &collide)) - { + if (UseNewInterpField(SI_FIELD_AUTO_REPEAT, old, new, verbosity, + &collide)) { old->interp.flags &= ~XkbSI_AutoRepeat; old->interp.flags |= (new->interp.flags & XkbSI_AutoRepeat); - old->defs.defined |= _SI_AutoRepeat; + old->defined |= SI_FIELD_AUTO_REPEAT; } - if (UseNewField(_SI_LockingKey, &old->defs, &new->defs, &collide)) - { + if (UseNewInterpField(SI_FIELD_LOCKING_KEY, old, new, verbosity, + &collide)) { old->interp.flags &= ~XkbSI_LockingKey; old->interp.flags |= (new->interp.flags & XkbSI_LockingKey); - old->defs.defined |= _SI_LockingKey; + old->defined |= SI_FIELD_LOCKING_KEY; } - if (UseNewField(_SI_LevelOneOnly, &old->defs, &new->defs, &collide)) - { + if (UseNewInterpField(SI_FIELD_LEVEL_ONE_ONLY, old, new, verbosity, + &collide)) { old->interp.match &= ~XkbSI_LevelOneOnly; old->interp.match |= (new->interp.match & XkbSI_LevelOneOnly); - old->defs.defined |= _SI_LevelOneOnly; + old->defined |= SI_FIELD_LEVEL_ONE_ONLY; } - if (collide) - { - WARN("Multiple interpretations of \"%s\"\n", siText(new, info)); - ACTION("Using %s definition for duplicate fields\n", - (new->defs.merge != MergeAugment ? "last" : "first")); + + if (collide) { + log_warn(info->keymap->ctx, + "Multiple interpretations of \"%s\"; " + "Using %s definition for duplicate fields\n", + siText(new, info), + (new->merge != MERGE_AUGMENT ? "last" : "first")); } - return True; + + return true; } + old = new; if ((new = NextInterp(info)) == NULL) - return False; + return false; + entry = new->entry; *new = *old; - new->defs.next = NULL; - return True; + new->entry = entry; + return true; } -static Bool -AddGroupCompat(CompatInfo * info, unsigned group, GroupCompatInfo * newGC) +static bool +AddGroupCompat(CompatInfo *info, xkb_group_index_t group, GroupCompatInfo *new) { GroupCompatInfo *gc; - unsigned merge; + int verbosity = xkb_get_log_verbosity(info->keymap->ctx); - merge = newGC->merge; gc = &info->groupCompat[group]; - if (((gc->real_mods == newGC->real_mods) && (gc->vmods == newGC->vmods))) - { - return True; - } - if (((gc->fileID == newGC->fileID) && (warningLevel > 0)) - || (warningLevel > 9)) - { - WARN("Compat map for group %d redefined\n", group + 1); - ACTION("Using %s definition\n", - (merge == MergeAugment ? "old" : "new")); - } - if (merge != MergeAugment) - *gc = *newGC; - return True; + if (gc->mods == new->mods) + return true; + + if ((gc->file_id == new->file_id && verbosity > 0) || verbosity > 9) + log_warn(info->keymap->ctx, + "Compat map for group %u redefined; " + "Using %s definition\n", + group + 1, (new->merge == MERGE_AUGMENT ? "old" : "new")); + + if (new->defined && (new->merge != MERGE_AUGMENT || !gc->defined)) + *gc = *new; + + return true; } /***====================================================================***/ -static Bool +static bool ResolveStateAndPredicate(ExprDef * expr, unsigned *pred_rtrn, - unsigned *mods_rtrn, CompatInfo * info) + xkb_mod_mask_t *mods_rtrn, CompatInfo * info) { - ExprResult result; - - if (expr == NULL) - { + if (expr == NULL) { *pred_rtrn = XkbSI_AnyOfOrNone; *mods_rtrn = ~0; - return True; + return true; } *pred_rtrn = XkbSI_Exactly; - if (expr->op == ExprActionDecl) - { - const char *pred_txt = XkbcAtomText(expr->value.action.name); - if (uStrCaseCmp(pred_txt, "noneof") == 0) + if (expr->op == EXPR_ACTION_DECL) { + const char *pred_txt = xkb_atom_text(info->keymap->ctx, + expr->value.action.name); + if (istreq(pred_txt, "noneof")) *pred_rtrn = XkbSI_NoneOf; - else if (uStrCaseCmp(pred_txt, "anyofornone") == 0) + else if (istreq(pred_txt, "anyofornone")) *pred_rtrn = XkbSI_AnyOfOrNone; - else if (uStrCaseCmp(pred_txt, "anyof") == 0) + else if (istreq(pred_txt, "anyof")) *pred_rtrn = XkbSI_AnyOf; - else if (uStrCaseCmp(pred_txt, "allof") == 0) + else if (istreq(pred_txt, "allof")) *pred_rtrn = XkbSI_AllOf; - else if (uStrCaseCmp(pred_txt, "exactly") == 0) + else if (istreq(pred_txt, "exactly")) *pred_rtrn = XkbSI_Exactly; - else - { - ERROR("Illegal modifier predicate \"%s\"\n", pred_txt); - ACTION("Ignored\n"); - return False; + else { + log_err(info->keymap->ctx, + "Illegal modifier predicate \"%s\"; Ignored\n", pred_txt); + return false; } expr = expr->value.action.args; } - else if (expr->op == ExprIdent) - { - const char *pred_txt = XkbcAtomText(expr->value.str); - if ((pred_txt) && (uStrCaseCmp(pred_txt, "any") == 0)) - { + else if (expr->op == EXPR_IDENT) { + const char *pred_txt = xkb_atom_text(info->keymap->ctx, + expr->value.str); + if (pred_txt && istreq(pred_txt, "any")) { *pred_rtrn = XkbSI_AnyOf; *mods_rtrn = 0xff; - return True; + return true; } } - if (ExprResolveModMask(expr, &result, NULL, NULL)) - { - *mods_rtrn = result.uval; - return True; - } - return False; + return ExprResolveModMask(info->keymap->ctx, expr, mods_rtrn); } /***====================================================================***/ +static bool +UseNewLEDField(enum led_field field, LEDInfo *old, LEDInfo *new, + int verbosity, enum led_field *collide) +{ + if (!(old->defined & field)) + return true; + + if (new->defined & field) { + if ((old->file_id == new->file_id && verbosity > 0) || verbosity > 9) + *collide |= field; + + if (new->merge != MERGE_AUGMENT) + return true; + } + + return false; +} + +static bool +AddIndicatorMap(CompatInfo *info, LEDInfo *new) +{ + LEDInfo *old; + enum led_field collide; + struct xkb_context *ctx = info->keymap->ctx; + int verbosity = xkb_get_log_verbosity(ctx); + + list_foreach(old, &info->leds, entry) { + if (old->name == new->name) { + if ((old->mods == new->mods) && + (old->groups == new->groups) && + (old->ctrls == new->ctrls) && + (old->which_mods == new->which_mods) && + (old->which_groups == new->which_groups)) { + old->defined |= new->defined; + return true; + } + + if (new->merge == MERGE_REPLACE) { + struct list entry = old->entry; + if ((old->file_id == new->file_id && verbosity > 0) || + verbosity > 9) + log_warn(info->keymap->ctx, + "Map for indicator %s redefined; " + "Earlier definition ignored\n", + xkb_atom_text(ctx, old->name)); + *old = *new; + old->entry = entry; + return true; + } + + collide = 0; + if (UseNewLEDField(LED_FIELD_INDEX, old, new, verbosity, + &collide)) { + old->indicator = new->indicator; + old->defined |= LED_FIELD_INDEX; + } + if (UseNewLEDField(LED_FIELD_MODS, old, new, verbosity, + &collide)) { + old->which_mods = new->which_mods; + old->mods = new->mods; + old->defined |= LED_FIELD_MODS; + } + if (UseNewLEDField(LED_FIELD_GROUPS, old, new, verbosity, + &collide)) { + old->which_groups = new->which_groups; + old->groups = new->groups; + old->defined |= LED_FIELD_GROUPS; + } + if (UseNewLEDField(LED_FIELD_CTRLS, old, new, verbosity, + &collide)) { + old->ctrls = new->ctrls; + old->defined |= LED_FIELD_CTRLS; + } + if (UseNewLEDField(LED_FIELD_EXPLICIT, old, new, verbosity, + &collide)) { + old->flags &= ~XkbIM_NoExplicit; + old->flags |= (new->flags & XkbIM_NoExplicit); + old->defined |= LED_FIELD_EXPLICIT; + } + if (UseNewLEDField(LED_FIELD_AUTOMATIC, old, new, verbosity, + &collide)) { + old->flags &= ~XkbIM_NoAutomatic; + old->flags |= (new->flags & XkbIM_NoAutomatic); + old->defined |= LED_FIELD_AUTOMATIC; + } + if (UseNewLEDField(LED_FIELD_DRIVES_KBD, old, new, verbosity, + &collide)) { + old->flags &= ~XkbIM_LEDDrivesKB; + old->flags |= (new->flags & XkbIM_LEDDrivesKB); + old->defined |= LED_FIELD_DRIVES_KBD; + } + + if (collide) { + log_warn(info->keymap->ctx, + "Map for indicator %s redefined; " + "Using %s definition for duplicate fields\n", + xkb_atom_text(ctx, old->name), + (new->merge == MERGE_AUGMENT ? "first" : "last")); + } + + return true; + } + } + + /* new definition */ + old = malloc(sizeof(*old)); + if (!old) { + log_wsgo(info->keymap->ctx, + "Couldn't allocate indicator map; " + "Map for indicator %s not compiled\n", + xkb_atom_text(ctx, new->name)); + return false; + } + + *old = *new; + list_append(&old->entry, &info->leds); + + return true; +} + static void -MergeIncludedCompatMaps(CompatInfo * into, CompatInfo * from, unsigned merge) +MergeIncludedCompatMaps(CompatInfo * into, CompatInfo * from, + enum merge_mode merge) { SymInterpInfo *si; - LEDInfo *led, *rtrn, *next; + LEDInfo *led, *next_led; GroupCompatInfo *gcm; - register int i; + xkb_group_index_t i; - if (from->errorCount > 0) - { + if (from->errorCount > 0) { into->errorCount += from->errorCount; return; } - if (into->name == NULL) - { + if (into->name == NULL) { into->name = from->name; from->name = NULL; } - for (si = from->interps; si; si = (SymInterpInfo *) si->defs.next) - { - if (merge != MergeDefault) - si->defs.merge = merge; + + list_foreach(si, &from->interps, entry) { + if (merge != MERGE_DEFAULT) + si->merge = merge; if (!AddInterp(into, si)) into->errorCount++; } - for (i = 0, gcm = &from->groupCompat[0]; i < XkbNumKbdGroups; i++, gcm++) - { - if (merge != MergeDefault) + + for (i = 0, gcm = &from->groupCompat[0]; i < XkbNumKbdGroups; + i++, gcm++) { + if (merge != MERGE_DEFAULT) gcm->merge = merge; if (!AddGroupCompat(into, i, gcm)) into->errorCount++; } - for (led = from->leds; led != NULL; led = next) - { - next = (LEDInfo *) led->defs.next; - if (merge != MergeDefault) - led->defs.merge = merge; - rtrn = AddIndicatorMap(into->leds, led); - if (rtrn != NULL) - into->leds = rtrn; - else + + list_foreach_safe(led, next_led, &from->leds, entry) { + led->merge = (merge == MERGE_DEFAULT ? led->merge : merge); + if (!AddIndicatorMap(into, led)) into->errorCount++; } - return; } -typedef void (*FileHandler) (XkbFile * /* rtrn */ , - struct xkb_desc * /* xkb */ , - unsigned /* merge */ , - CompatInfo * /* info */ - ); +static void +HandleCompatMapFile(CompatInfo *info, XkbFile *file, enum merge_mode merge); -static Bool -HandleIncludeCompatMap(IncludeStmt * stmt, - struct xkb_desc * xkb, CompatInfo * info, FileHandler hndlr) +static bool +HandleIncludeCompatMap(CompatInfo *info, IncludeStmt *stmt) { - unsigned newMerge; + enum merge_mode merge = MERGE_DEFAULT; XkbFile *rtrn; - CompatInfo included; - Bool haveSelf; + CompatInfo included, next_incl; - haveSelf = False; - if ((stmt->file == NULL) && (stmt->map == NULL)) - { - haveSelf = True; - included = *info; - bzero(info, sizeof(CompatInfo)); - } - else if (ProcessIncludeFile(stmt, XkmCompatMapIndex, &rtrn, &newMerge)) - { - InitCompatInfo(&included, xkb); - included.fileID = rtrn->id; - included.dflt = info->dflt; - included.dflt.defs.fileID = rtrn->id; - included.dflt.defs.merge = newMerge; - included.ledDflt.defs.fileID = rtrn->id; - included.ledDflt.defs.merge = newMerge; - included.act = info->act; - (*hndlr) (rtrn, xkb, MergeOverride, &included); - if (stmt->stmt != NULL) - { - if (included.name != NULL) - free(included.name); - included.name = stmt->stmt; - stmt->stmt = NULL; - } + InitCompatInfo(&included, info->keymap, info->file_id); + if (stmt->stmt) { + free(included.name); + included.name = stmt->stmt; + stmt->stmt = NULL; } - else - { - info->errorCount += 10; - return False; - } - if ((stmt->next != NULL) && (included.errorCount < 1)) - { - IncludeStmt *next; - unsigned op; - CompatInfo next_incl; - - for (next = stmt->next; next != NULL; next = next->next) - { - if ((next->file == NULL) && (next->map == NULL)) - { - haveSelf = True; - MergeIncludedCompatMaps(&included, info, next->merge); - ClearCompatInfo(info, xkb); - } - else if (ProcessIncludeFile(next, XkmCompatMapIndex, &rtrn, &op)) - { - InitCompatInfo(&next_incl, xkb); - next_incl.fileID = rtrn->id; - next_incl.dflt = info->dflt; - next_incl.dflt.defs.fileID = rtrn->id; - next_incl.dflt.defs.merge = op; - next_incl.ledDflt.defs.fileID = rtrn->id; - next_incl.ledDflt.defs.merge = op; - next_incl.act = info->act; - (*hndlr) (rtrn, xkb, MergeOverride, &next_incl); - MergeIncludedCompatMaps(&included, &next_incl, op); - ClearCompatInfo(&next_incl, xkb); - } - else - { - info->errorCount += 10; - return False; - } + + for (; stmt; stmt = stmt->next_incl) { + if (!ProcessIncludeFile(info->keymap->ctx, stmt, FILE_TYPE_COMPAT, + &rtrn, &merge)) { + info->errorCount += 10; + ClearCompatInfo(&included); + return false; } + + InitCompatInfo(&next_incl, info->keymap, rtrn->id); + next_incl.file_id = rtrn->id; + next_incl.dflt = info->dflt; + next_incl.dflt.file_id = rtrn->id; + next_incl.dflt.merge = merge; + next_incl.ledDflt.file_id = rtrn->id; + next_incl.ledDflt.merge = merge; + next_incl.act = info->act; + + HandleCompatMapFile(&next_incl, rtrn, MERGE_OVERRIDE); + + MergeIncludedCompatMaps(&included, &next_incl, merge); + if (info->act) + next_incl.act = NULL; + + ClearCompatInfo(&next_incl); + FreeXKBFile(rtrn); } - if (haveSelf) - *info = included; - else - { - MergeIncludedCompatMaps(info, &included, newMerge); - ClearCompatInfo(&included, xkb); - } + + MergeIncludedCompatMaps(info, &included, merge); + ClearCompatInfo(&included); + return (info->errorCount == 0); } -static LookupEntry useModMapValues[] = { - {"levelone", 1}, - {"level1", 1}, - {"anylevel", 0}, - {"any", 0}, - {NULL, 0} +static const LookupEntry useModMapValues[] = { + { "levelone", 1 }, + { "level1", 1 }, + { "anylevel", 0 }, + { "any", 0 }, + { NULL, 0 } }; static int -SetInterpField(SymInterpInfo * si, - struct xkb_desc * xkb, - char *field, - ExprDef * arrayNdx, ExprDef * value, CompatInfo * info) +SetInterpField(CompatInfo *info, SymInterpInfo *si, const char *field, + ExprDef *arrayNdx, ExprDef *value) { - int ok = 1; - ExprResult tmp; + struct xkb_keymap *keymap = info->keymap; + xkb_mod_index_t ndx; - if (uStrCaseCmp(field, "action") == 0) - { - if (arrayNdx != NULL) - return ReportSINotArray(si, field, info); - ok = HandleActionDef(value, xkb, &si->interp.act, si->defs.merge, - info->act); - if (ok) - si->defs.defined |= _SI_Action; - } - else if ((uStrCaseCmp(field, "virtualmodifier") == 0) || - (uStrCaseCmp(field, "virtualmod") == 0)) - { - if (arrayNdx != NULL) - return ReportSINotArray(si, field, info); - ok = ResolveVirtualModifier(value, &tmp, &info->vmods); - if (ok) - { - si->interp.virtual_mod = tmp.uval; - si->defs.defined |= _SI_VirtualMod; - } - else - return ReportSIBadType(si, field, "virtual modifier", info); + if (istreq(field, "action")) { + if (arrayNdx) + return ReportSINotArray(info, si, field); + + if (!HandleActionDef(value, keymap, &si->interp.act, info->act)) + return false; + + si->defined |= SI_FIELD_ACTION; } - else if (uStrCaseCmp(field, "repeat") == 0) - { - if (arrayNdx != NULL) - return ReportSINotArray(si, field, info); - ok = ExprResolveBoolean(value, &tmp, NULL, NULL); - if (ok) - { - if (tmp.uval) - si->interp.flags |= XkbSI_AutoRepeat; - else - si->interp.flags &= ~XkbSI_AutoRepeat; - si->defs.defined |= _SI_AutoRepeat; - } + else if (istreq(field, "virtualmodifier") || + istreq(field, "virtualmod")) { + if (arrayNdx) + return ReportSINotArray(info, si, field); + + if (!ResolveVirtualModifier(value, keymap, &ndx, &info->vmods)) + 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(keymap->ctx, value, &set)) + return ReportSIBadType(info, si, field, "boolean"); + + if (set) + si->interp.flags |= XkbSI_AutoRepeat; else - return ReportSIBadType(si, field, "boolean", info); + si->interp.flags &= ~XkbSI_AutoRepeat; + + si->defined |= SI_FIELD_AUTO_REPEAT; } - else if (uStrCaseCmp(field, "locking") == 0) - { - if (arrayNdx != NULL) - return ReportSINotArray(si, field, info); - ok = ExprResolveBoolean(value, &tmp, NULL, NULL); - if (ok) - { - if (tmp.uval) - si->interp.flags |= XkbSI_LockingKey; - else - si->interp.flags &= ~XkbSI_LockingKey; - si->defs.defined |= _SI_LockingKey; - } + else if (istreq(field, "locking")) { + bool set; + + if (arrayNdx) + return ReportSINotArray(info, si, field); + + if (!ExprResolveBoolean(keymap->ctx, value, &set)) + return ReportSIBadType(info, si, field, "boolean"); + + if (set) + si->interp.flags |= XkbSI_LockingKey; else - return ReportSIBadType(si, field, "boolean", info); + si->interp.flags &= ~XkbSI_LockingKey; + + si->defined |= SI_FIELD_LOCKING_KEY; } - else if ((uStrCaseCmp(field, "usemodmap") == 0) || - (uStrCaseCmp(field, "usemodmapmods") == 0)) - { - if (arrayNdx != NULL) - return ReportSINotArray(si, field, info); - ok = ExprResolveEnum(value, &tmp, useModMapValues); - if (ok) - { - if (tmp.uval) - si->interp.match |= XkbSI_LevelOneOnly; - else - si->interp.match &= ~XkbSI_LevelOneOnly; - si->defs.defined |= _SI_LevelOneOnly; - } + else if (istreq(field, "usemodmap") || + istreq(field, "usemodmapmods")) { + unsigned int val; + + if (arrayNdx) + return ReportSINotArray(info, si, field); + + if (!ExprResolveEnum(keymap->ctx, value, &val, useModMapValues)) + return ReportSIBadType(info, si, field, "level specification"); + + if (val) + si->interp.match |= XkbSI_LevelOneOnly; else - return ReportSIBadType(si, field, "level specification", info); + si->interp.match &= ~XkbSI_LevelOneOnly; + + si->defined |= SI_FIELD_LEVEL_ONE_ONLY; } - else - { - ok = ReportBadField("symbol interpretation", field, siText(si, info)); + else { + return ReportBadField(keymap, "symbol interpretation", field, + siText(si, info)); } - return ok; + + return true; } -LookupEntry groupNames[] = { - {"group1", 0x01} - , - {"group2", 0x02} - , - {"group3", 0x04} - , - {"group4", 0x08} - , - {"group5", 0x10} - , - {"group6", 0x20} - , - {"group7", 0x40} - , - {"group8", 0x80} - , - {"none", 0x00} - , - {"all", 0xff} - , +static const LookupEntry modComponentNames[] = { + {"base", XkbIM_UseBase}, + {"latched", XkbIM_UseLatched}, + {"locked", XkbIM_UseLocked}, + {"effective", XkbIM_UseEffective}, + {"compat", XkbIM_UseCompat}, + {"any", XkbIM_UseAnyMods}, + {"none", 0}, + {NULL, 0} +}; +static const LookupEntry groupComponentNames[] = { + {"base", XkbIM_UseBase}, + {"latched", XkbIM_UseLatched}, + {"locked", XkbIM_UseLocked}, + {"effective", XkbIM_UseEffective}, + {"any", XkbIM_UseAnyGroup}, + {"none", 0}, + {NULL, 0} +}; + +static const LookupEntry groupNames[] = { + {"group1", 0x01}, + {"group2", 0x02}, + {"group3", 0x04}, + {"group4", 0x08}, + {"group5", 0x10}, + {"group6", 0x20}, + {"group7", 0x40}, + {"group8", 0x80}, + {"none", 0x00}, + {"all", 0xff}, {NULL, 0} }; static int -HandleInterpVar(VarDef * stmt, struct xkb_desc * xkb, CompatInfo * info) +SetIndicatorMapField(CompatInfo *info, LEDInfo *led, + const char *field, ExprDef *arrayNdx, ExprDef *value) { - ExprResult elem, field; + bool ok = true; + struct xkb_keymap *keymap = info->keymap; + + if (istreq(field, "modifiers") || istreq(field, "mods")) { + if (arrayNdx) + return ReportIndicatorNotArray(info, led, field); + + if (!ExprResolveVModMask(keymap, value, &led->mods)) + return ReportIndicatorBadType(info, led, field, "modifier mask"); + + led->defined |= LED_FIELD_MODS; + } + else if (istreq(field, "groups")) { + unsigned int mask; + + if (arrayNdx) + return ReportIndicatorNotArray(info, led, field); + + if (!ExprResolveMask(keymap->ctx, value, &mask, groupNames)) + return ReportIndicatorBadType(info, led, field, "group mask"); + + led->groups = mask; + led->defined |= LED_FIELD_GROUPS; + } + else if (istreq(field, "controls") || istreq(field, "ctrls")) { + unsigned int mask; + + if (arrayNdx) + return ReportIndicatorNotArray(info, led, field); + + if (!ExprResolveMask(keymap->ctx, value, &mask, ctrlNames)) + return ReportIndicatorBadType(info, led, field, + "controls mask"); + + led->ctrls = mask; + led->defined |= LED_FIELD_CTRLS; + } + else if (istreq(field, "allowexplicit")) { + bool set; + + if (arrayNdx) + return ReportIndicatorNotArray(info, led, field); + + if (!ExprResolveBoolean(keymap->ctx, value, &set)) + return ReportIndicatorBadType(info, led, field, "boolean"); + + if (set) + led->flags &= ~XkbIM_NoExplicit; + else + led->flags |= XkbIM_NoExplicit; + + led->defined |= LED_FIELD_EXPLICIT; + } + else if (istreq(field, "whichmodstate") || + istreq(field, "whichmodifierstate")) { + unsigned int mask; + + if (arrayNdx) + return ReportIndicatorNotArray(info, led, field); + + if (!ExprResolveMask(keymap->ctx, value, &mask, modComponentNames)) + return ReportIndicatorBadType(info, led, field, + "mask of modifier state components"); + + led->which_mods = mask; + } + else if (istreq(field, "whichgroupstate")) { + unsigned mask; + + if (arrayNdx) + return ReportIndicatorNotArray(info, led, field); + + if (!ExprResolveMask(keymap->ctx, value, &mask, groupComponentNames)) + return ReportIndicatorBadType(info, led, field, + "mask of group state components"); + + led->which_groups = mask; + } + else if (istreq(field, "driveskbd") || + istreq(field, "driveskeyboard") || + istreq(field, "leddriveskbd") || + istreq(field, "leddriveskeyboard") || + istreq(field, "indicatordriveskbd") || + istreq(field, "indicatordriveskeyboard")) { + bool set; + + if (arrayNdx) + return ReportIndicatorNotArray(info, led, field); + + if (!ExprResolveBoolean(keymap->ctx, value, &set)) + return ReportIndicatorBadType(info, led, field, "boolean"); + + if (set) + led->flags |= XkbIM_LEDDrivesKB; + else + led->flags &= ~XkbIM_LEDDrivesKB; + + led->defined |= LED_FIELD_DRIVES_KBD; + } + else if (istreq(field, "index")) { + int ndx; + + if (arrayNdx) + return ReportIndicatorNotArray(info, led, field); + + if (!ExprResolveInteger(keymap->ctx, value, &ndx)) + return ReportIndicatorBadType(info, led, field, + "indicator index"); + + if (ndx < 1 || ndx > 32) { + log_err(info->keymap->ctx, + "Illegal indicator index %d (range 1..%d); " + "Index definition for %s indicator ignored\n", + ndx, XkbNumIndicators, + xkb_atom_text(keymap->ctx, led->name)); + return false; + } + + led->indicator = (xkb_led_index_t) ndx; + led->defined |= LED_FIELD_INDEX; + } + else { + log_err(info->keymap->ctx, + "Unknown field %s in map for %s indicator; " + "Definition ignored\n", + field, xkb_atom_text(keymap->ctx, led->name)); + ok = false; + } + + return ok; +} + +static int +HandleInterpVar(CompatInfo *info, VarDef *stmt) +{ + const char *elem, *field; ExprDef *ndx; int ret; - if (ExprResolveLhs(stmt->name, &elem, &field, &ndx) == 0) + if (!ExprResolveLhs(info->keymap->ctx, stmt->name, &elem, &field, &ndx)) ret = 0; /* internal error, already reported */ - else if (elem.str && (uStrCaseCmp(elem.str, "interpret") == 0)) - ret = SetInterpField(&info->dflt, xkb, field.str, ndx, stmt->value, - info); - else if (elem.str && (uStrCaseCmp(elem.str, "indicator") == 0)) - ret = SetIndicatorMapField(&info->ledDflt, xkb, field.str, ndx, - stmt->value); + else if (elem && istreq(elem, "interpret")) + ret = SetInterpField(info, &info->dflt, field, ndx, stmt->value); + else if (elem && istreq(elem, "indicator")) + ret = SetIndicatorMapField(info, &info->ledDflt, field, ndx, + stmt->value); else - ret = SetActionField(xkb, elem.str, field.str, ndx, stmt->value, - &info->act); - free(elem.str); - free(field.str); + ret = SetActionField(info->keymap, elem, field, ndx, stmt->value, + &info->act); return ret; } static int -HandleInterpBody(VarDef * def, struct xkb_desc * xkb, SymInterpInfo * si, - CompatInfo * info) +HandleInterpBody(CompatInfo *info, VarDef *def, SymInterpInfo *si) { int ok = 1; - ExprResult tmp, field; + const char *elem, *field; ExprDef *arrayNdx; - for (; def != NULL; def = (VarDef *) def->common.next) - { - if ((def->name) && (def->name->type == ExprFieldRef)) - { - ok = HandleInterpVar(def, xkb, info); + for (; def != NULL; def = (VarDef *) def->common.next) { + if (def->name && def->name->op == EXPR_FIELD_REF) { + ok = HandleInterpVar(info, def); continue; } - ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx); - if (ok) - ok = SetInterpField(si, xkb, field.str, arrayNdx, def->value, - info); + ok = ExprResolveLhs(info->keymap->ctx, def->name, &elem, &field, + &arrayNdx); + if (ok) { + ok = SetInterpField(info, si, field, arrayNdx, def->value); + } } return ok; } static int -HandleInterpDef(InterpDef * def, struct xkb_desc * xkb, unsigned merge, - CompatInfo * info) +HandleInterpDef(CompatInfo *info, InterpDef *def, enum merge_mode merge) { unsigned pred, mods; SymInterpInfo si; - if (!ResolveStateAndPredicate(def->match, &pred, &mods, info)) - { - ERROR("Couldn't determine matching modifiers\n"); - ACTION("Symbol interpretation ignored\n"); - return False; + if (!ResolveStateAndPredicate(def->match, &pred, &mods, info)) { + log_err(info->keymap->ctx, + "Couldn't determine matching modifiers; " + "Symbol interpretation ignored\n"); + return false; } - if (def->merge != MergeDefault) + if (def->merge != MERGE_DEFAULT) merge = def->merge; si = info->dflt; - si.defs.merge = merge; - if (!LookupKeysym(def->sym, &si.interp.sym)) - { - WARN("Could not resolve keysym %s\n", def->sym); - info->errorCount++; - return False; + si.merge = merge; + if (!LookupKeysym(def->sym, &si.interp.sym)) { + log_err(info->keymap->ctx, + "Could not resolve keysym %s; " + "Symbol interpretation ignored\n", + def->sym); + return false; } si.interp.match = pred & XkbSI_OpMask; si.interp.mods = mods; - if (!HandleInterpBody(def->def, xkb, &si, info)) - { + if (!HandleInterpBody(info, def->def, &si)) { info->errorCount++; - return False; + return false; } - if (!AddInterp(info, &si)) - { + if (!AddInterp(info, &si)) { info->errorCount++; - return False; + return false; } - return True; + return true; } static int -HandleGroupCompatDef(GroupCompatDef * def, - struct xkb_desc * xkb, unsigned merge, CompatInfo * info) +HandleGroupCompatDef(CompatInfo *info, GroupCompatDef *def, + enum merge_mode merge) { - ExprResult val; GroupCompatInfo tmp; - if (def->merge != MergeDefault) - merge = def->merge; - if (!XkbIsLegalGroup(def->group - 1)) - { - ERROR("Keyboard group must be in the range 1..%d\n", - XkbNumKbdGroups + 1); - ACTION("Compatibility map for illegal group %d ignored\n", - def->group); - return False; + merge = (def->merge == MERGE_DEFAULT ? merge : def->merge); + + if (def->group < 1 || def->group > XkbNumKbdGroups) { + log_err(info->keymap->ctx, + "Keyboard group must be in the range 1..%u; " + "Compatibility map for illegal group %u ignored\n", + XkbNumKbdGroups, def->group); + return false; } - tmp.fileID = info->fileID; + + tmp.file_id = info->file_id; tmp.merge = merge; - if (!ExprResolveModMask(def->def, &val, LookupVModMask, (char *) xkb)) - { - ERROR("Expected a modifier mask in group compatibility definition\n"); - ACTION("Ignoring illegal compatibility map for group %d\n", + + if (!ExprResolveVModMask(info->keymap, def->def, &tmp.mods)) { + log_err(info->keymap->ctx, + "Expected a modifier mask in group compatibility definition; " + "Ignoring illegal compatibility map for group %u\n", def->group); - return False; + return false; } - tmp.real_mods = val.uval & 0xff; - tmp.vmods = (val.uval >> 8) & 0xffff; + + tmp.defined = true; return AddGroupCompat(info, def->group - 1, &tmp); } +static bool +HandleIndicatorMapDef(CompatInfo *info, IndicatorMapDef *def, + enum merge_mode merge) +{ + LEDInfo led; + VarDef *var; + bool ok; + + if (def->merge != MERGE_DEFAULT) + merge = def->merge; + + led = info->ledDflt; + led.merge = merge; + 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->keymap->ctx, var->name, &elem, &field, + &arrayNdx)) { + ok = false; + continue; + } + + if (elem) { + log_err(info->keymap->ctx, + "Cannot set defaults for \"%s\" element in indicator map; " + "Assignment to %s.%s ignored\n", elem, elem, field); + ok = false; + } + else { + ok = SetIndicatorMapField(info, &led, field, arrayNdx, + var->value) && ok; + } + } + + if (ok) + return AddIndicatorMap(info, &led); + + return false; +} + static void -HandleCompatMapFile(XkbFile * file, - struct xkb_desc * xkb, unsigned merge, CompatInfo * info) +HandleCompatMapFile(CompatInfo *info, XkbFile *file, enum merge_mode merge) { + bool ok; ParseCommon *stmt; - if (merge == MergeDefault) - merge = MergeAugment; - info->name = _XkbDupString(file->name); - stmt = file->defs; - while (stmt) - { - switch (stmt->stmtType) - { - case StmtInclude: - if (!HandleIncludeCompatMap((IncludeStmt *) stmt, xkb, info, - HandleCompatMapFile)) - info->errorCount++; - break; - case StmtInterpDef: - if (!HandleInterpDef((InterpDef *) stmt, xkb, merge, info)) - info->errorCount++; - break; - case StmtGroupCompatDef: - if (!HandleGroupCompatDef - ((GroupCompatDef *) stmt, xkb, merge, info)) - info->errorCount++; - break; - case StmtIndicatorMapDef: - { - LEDInfo *rtrn; - rtrn = HandleIndicatorMapDef((IndicatorMapDef *) stmt, xkb, - &info->ledDflt, info->leds, merge); - if (rtrn != NULL) - info->leds = rtrn; - else - info->errorCount++; - } - break; - case StmtVarDef: - if (!HandleInterpVar((VarDef *) stmt, xkb, info)) - info->errorCount++; - break; - case StmtVModDef: - if (!HandleVModDef((VModDef *) stmt, merge, &info->vmods)) - info->errorCount++; - break; - case StmtKeycodeDef: - ERROR("Interpretation files may not include other types\n"); - ACTION("Ignoring definition of key name\n"); - info->errorCount++; + merge = (merge == MERGE_DEFAULT ? MERGE_AUGMENT : merge); + + free(info->name); + info->name = strdup_safe(file->name); + + for (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: + ok = HandleGroupCompatDef(info, (GroupCompatDef *) stmt, merge); + break; + case STMT_INDICATOR_MAP: + ok = HandleIndicatorMapDef(info, (IndicatorMapDef *) stmt, merge); + break; + case STMT_VAR: + ok = HandleInterpVar(info, (VarDef *) stmt); + break; + case STMT_VMOD: + ok = HandleVModDef((VModDef *) stmt, info->keymap, merge, + &info->vmods); break; default: - WSGO("Unexpected statement type %d in HandleCompatMapFile\n", - stmt->stmtType); + log_err(info->keymap->ctx, + "Interpretation files may not include other types; " + "Ignoring %s\n", StmtTypeToString(stmt->type)); + ok = false; break; } - stmt = stmt->next; - if (info->errorCount > 10) - { -#ifdef NOISY - ERROR("Too many errors\n"); -#endif - ACTION("Abandoning compatibility map \"%s\"\n", file->topName); + + if (!ok) + info->errorCount++; + + if (info->errorCount > 10) { + log_err(info->keymap->ctx, + "Abandoning compatibility map \"%s\"\n", file->topName); break; } } - return; } static void -CopyInterps(CompatInfo * info, - struct xkb_compat_map * compat, Bool needSymbol, unsigned pred) +CopyInterps(CompatInfo *info, bool needSymbol, unsigned pred) { SymInterpInfo *si; - for (si = info->interps; si; si = (SymInterpInfo *) si->defs.next) - { + list_foreach(si, &info->interps, entry) { if (((si->interp.match & XkbSI_OpMask) != pred) || - (needSymbol && (si->interp.sym == NoSymbol)) || - ((!needSymbol) && (si->interp.sym != NoSymbol))) + (needSymbol && si->interp.sym == XKB_KEY_NoSymbol) || + (!needSymbol && si->interp.sym != XKB_KEY_NoSymbol)) + continue; + + darray_append(info->keymap->sym_interpret, si->interp); + } +} + +static void +BindIndicators(CompatInfo *info, struct list *unbound_leds) +{ + xkb_led_index_t i; + LEDInfo *led, *next_led; + struct xkb_indicator_map *map; + struct xkb_keymap *keymap = info->keymap; + + list_foreach(led, unbound_leds, entry) { + if (led->indicator == XKB_LED_INVALID) { + for (i = 0; i < XkbNumIndicators; i++) { + if (keymap->indicator_names[i] && + streq(keymap->indicator_names[i], + xkb_atom_text(keymap->ctx, led->name))) { + led->indicator = i + 1; + break; + } + } + } + } + + list_foreach(led, unbound_leds, entry) { + if (led->indicator == XKB_LED_INVALID) { + for (i = 0; i < XkbNumIndicators; i++) { + if (keymap->indicator_names[i] == NULL) { + keymap->indicator_names[i] = + xkb_atom_text(keymap->ctx, led->name); + led->indicator = i + 1; + break; + } + } + + if (led->indicator == XKB_LED_INVALID) { + log_err(info->keymap->ctx, + "No unnamed indicators found; " + "Virtual indicator map \"%s\" not bound\n", + xkb_atom_text(keymap->ctx, led->name)); + continue; + } + } + } + + list_foreach_safe(led, next_led, unbound_leds, entry) { + if (led->indicator == XKB_LED_INVALID) { + free(led); + continue; + } + + if (!streq(keymap->indicator_names[led->indicator - 1], + xkb_atom_text(keymap->ctx, led->name))) { + const char *old = keymap->indicator_names[led->indicator - 1]; + log_err(info->keymap->ctx, + "Multiple names bound to indicator %d; " + "Using %s, ignoring %s\n", + led->indicator, old, + xkb_atom_text(keymap->ctx, led->name)); + free(led); + continue; + } + + map = &keymap->indicators[led->indicator - 1]; + map->flags = led->flags; + map->which_groups = led->which_groups; + map->groups = led->groups; + map->which_mods = led->which_mods; + map->mods.mods = led->mods; + map->ctrls = led->ctrls; + free(led); + } + + list_init(unbound_leds); +} + +static bool +CopyIndicatorMapDefs(CompatInfo *info) +{ + LEDInfo *led, *next_led; + struct list unbound_leds; + struct xkb_indicator_map *im; + struct xkb_keymap *keymap = info->keymap; + + list_init(&unbound_leds); + + list_foreach_safe(led, next_led, &info->leds, entry) { + if (led->groups != 0 && led->which_groups == 0) + led->which_groups = XkbIM_UseEffective; + + if (led->which_mods == 0 && led->mods) + led->which_mods = XkbIM_UseEffective; + + if (led->indicator == XKB_LED_INVALID) { + list_append(&led->entry, &unbound_leds); continue; - if (compat->num_si >= compat->size_si) - { - WSGO("No room to merge symbol interpretations\n"); - ACTION("Symbol interpretations lost\n"); - return; } - compat->sym_interpret[compat->num_si++] = si->interp; + + im = &keymap->indicators[led->indicator - 1]; + im->flags = led->flags; + im->which_groups = led->which_groups; + im->groups = led->groups; + im->which_mods = led->which_mods; + im->mods.mods = led->mods; + im->ctrls = led->ctrls; + keymap->indicator_names[led->indicator - 1] = + xkb_atom_text(keymap->ctx, led->name); + free(led); } - return; + list_init(&info->leds); + + BindIndicators(info, &unbound_leds); + + return true; } -Bool -CompileCompatMap(XkbFile *file, struct xkb_desc * xkb, unsigned merge, - LEDInfoPtr *unboundLEDs) +bool +CompileCompatMap(XkbFile *file, struct xkb_keymap *keymap, + enum merge_mode merge) { - int i; + xkb_group_index_t i; CompatInfo info; GroupCompatInfo *gcm; - InitCompatInfo(&info, xkb); - info.dflt.defs.merge = merge; - info.ledDflt.defs.merge = merge; - HandleCompatMapFile(file, xkb, merge, &info); - - if (info.errorCount == 0) - { - int size; - if (XkbcAllocCompatMap(xkb, XkbAllCompatMask, info.nInterps) != - Success) - { - WSGO("Couldn't allocate compatibility map\n"); - return False; - } - if (info.name != NULL) - { - if (XkbcAllocNames(xkb, XkbCompatNameMask, 0, 0) == Success) - xkb->names->compat = - xkb_intern_atom(info.name); - else - { - WSGO("Couldn't allocate space for compat name\n"); - ACTION("Name \"%s\" (from %s) NOT assigned\n", - scanFile, info.name); - } - } - size = info.nInterps * sizeof(struct xkb_sym_interpret); - if (size > 0) - { - CopyInterps(&info, xkb->compat, True, XkbSI_Exactly); - CopyInterps(&info, xkb->compat, True, XkbSI_AllOf | XkbSI_NoneOf); - CopyInterps(&info, xkb->compat, True, XkbSI_AnyOf); - CopyInterps(&info, xkb->compat, True, XkbSI_AnyOfOrNone); - CopyInterps(&info, xkb->compat, False, XkbSI_Exactly); - CopyInterps(&info, xkb->compat, False, - XkbSI_AllOf | XkbSI_NoneOf); - CopyInterps(&info, xkb->compat, False, XkbSI_AnyOf); - CopyInterps(&info, xkb->compat, False, XkbSI_AnyOfOrNone); - } - for (i = 0, gcm = &info.groupCompat[0]; i < XkbNumKbdGroups; - i++, gcm++) - { - if ((gcm->fileID != 0) || (gcm->real_mods != 0) - || (gcm->vmods != 0)) - { - xkb->compat->groups[i].mask = gcm->real_mods; - xkb->compat->groups[i].real_mods = gcm->real_mods; - xkb->compat->groups[i].vmods = gcm->vmods; - } - } - if (info.leds != NULL) - { - if (!CopyIndicatorMapDefs(xkb, info.leds, unboundLEDs)) - info.errorCount++; - info.leds = NULL; - } - ClearCompatInfo(&info, xkb); - return True; - } - if (info.interps != NULL) - free(info.interps); - return False; + InitCompatInfo(&info, keymap, file->id); + info.dflt.merge = merge; + info.ledDflt.merge = merge; + + HandleCompatMapFile(&info, file, merge); + + if (info.errorCount != 0) + goto err_info; + + darray_init(keymap->sym_interpret); + darray_growalloc(keymap->sym_interpret, info.nInterps); + + if (info.name) + keymap->compat_section_name = strdup(info.name); + + if (info.nInterps > 0) { + CopyInterps(&info, true, XkbSI_Exactly); + CopyInterps(&info, true, XkbSI_AllOf | XkbSI_NoneOf); + CopyInterps(&info, true, XkbSI_AnyOf); + CopyInterps(&info, true, XkbSI_AnyOfOrNone); + CopyInterps(&info, false, XkbSI_Exactly); + CopyInterps(&info, false, XkbSI_AllOf | XkbSI_NoneOf); + CopyInterps(&info, false, XkbSI_AnyOf); + CopyInterps(&info, false, XkbSI_AnyOfOrNone); + } + + for (i = 0, gcm = &info.groupCompat[0]; i < XkbNumKbdGroups; + i++, gcm++) { + if (gcm->file_id != 0 || gcm->mods != 0) + keymap->groups[i].mods = gcm->mods; + } + + if (!CopyIndicatorMapDefs(&info)) + info.errorCount++; + + ClearCompatInfo(&info); + return true; + +err_info: + ClearCompatInfo(&info); + return false; +} + +static void +ComputeEffectiveMask(struct xkb_keymap *keymap, struct xkb_mods *mods) +{ + xkb_mod_index_t i; + xkb_mod_mask_t vmask = mods->mods >> XkbNumModifiers; + + /* The effective mask is only real mods for now. */ + mods->mask = mods->mods & 0xff; + + for (i = 0; i < XkbNumVirtualMods; i++) { + if (!(vmask & (1 << i))) + continue; + mods->mask |= keymap->vmods[i]; + } +} + +static void +UpdateActionMods(struct xkb_keymap *keymap, union xkb_action *act, + xkb_mod_mask_t rmodmask) +{ + unsigned int flags; + struct xkb_mods *mods; + + switch (act->type) { + case XkbSA_SetMods: + case XkbSA_LatchMods: + case XkbSA_LockMods: + flags = act->mods.flags; + mods = &act->mods.mods; + break; + + case XkbSA_ISOLock: + flags = act->iso.flags; + mods = &act->iso.mods; + break; + + default: + return; + } + + if (flags & XkbSA_UseModMapMods) { + /* XXX: what's that. */ + mods->mods &= 0xff; + mods->mods |= rmodmask; + } + ComputeEffectiveMask(keymap, mods); +} + +/** + * 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 struct xkb_sym_interpret * +FindInterpForKey(struct xkb_keymap *keymap, struct xkb_key *key, + xkb_group_index_t group, xkb_level_index_t level) +{ + struct xkb_sym_interpret *ret = NULL; + struct xkb_sym_interpret *interp; + const xkb_keysym_t *syms; + int num_syms; + + num_syms = xkb_key_get_syms_by_level(keymap, key, group, level, &syms); + if (num_syms == 0) + return NULL; + + darray_foreach(interp, keymap->sym_interpret) { + uint32_t mods; + bool found; + + if ((num_syms > 1 || interp->sym != syms[0]) && + interp->sym != XKB_KEY_NoSymbol) + continue; + + if (level == 0 || !(interp->match & XkbSI_LevelOneOnly)) + mods = key->modmap; + else + mods = 0; + + switch (interp->match & XkbSI_OpMask) { + case XkbSI_NoneOf: + found = !(interp->mods & mods); + break; + case XkbSI_AnyOfOrNone: + found = (!mods || (interp->mods & mods)); + break; + case XkbSI_AnyOf: + found = !!(interp->mods & mods); + break; + case XkbSI_AllOf: + found = ((interp->mods & mods) == interp->mods); + break; + case XkbSI_Exactly: + found = (interp->mods == mods); + break; + default: + found = false; + break; + } + + if (found && interp->sym != XKB_KEY_NoSymbol) + return interp; + else if (found && !ret) + ret = interp; + } + + return ret; +} + +/** + */ +static bool +ApplyInterpsToKey(struct xkb_keymap *keymap, struct xkb_key *key) +{ +#define INTERP_SIZE (8 * 4) + struct xkb_sym_interpret *interps[INTERP_SIZE]; + xkb_mod_mask_t vmodmask = 0; + int num_acts = 0; + xkb_group_index_t group; + xkb_level_index_t level; + unsigned int i; + + /* If we've been told not to bind interps to this key, then don't. */ + if (key->explicit & XkbExplicitInterpretMask) + return true; + + for (i = 0; i < INTERP_SIZE; i++) + interps[i] = NULL; + + for (group = 0; group < key->num_groups; group++) { + for (level = 0; level < XkbKeyGroupWidth(keymap, key, group); + level++) { + i = (group * key->width) + level; + if (i >= INTERP_SIZE) /* XXX FIXME */ + return false; + interps[i] = FindInterpForKey(keymap, key, group, level); + if (interps[i]) + num_acts++; + } + } + + if (num_acts && !key->actions) { + key->actions = calloc(key->num_groups * key->width, + sizeof(*key->actions)); + if (!key->actions) + return false; + } + + for (group = 0; group < key->num_groups; group++) { + for (level = 0; level < XkbKeyGroupWidth(keymap, key, group); + level++) { + struct xkb_sym_interpret *interp; + + i = (group * key->width) + level; + interp = interps[i]; + + /* Infer default key behaviours from the base level. */ + if (group == 0 && level == 0) { + if (!(key->explicit & XkbExplicitAutoRepeatMask) && + (!interp || (interp->flags & XkbSI_AutoRepeat))) + key->repeats = true; + } + + if (!interp) + continue; + + if ((group == 0 && level == 0) || + !(interp->match & XkbSI_LevelOneOnly)) { + if (interp->virtual_mod != XkbNoModifier) + vmodmask |= (1 << interp->virtual_mod); + } + + key->actions[i] = interp->act; + } + } + + if (!(key->explicit & XkbExplicitVModMapMask)) + key->vmodmap = vmodmask; + + return true; +#undef INTERP_SIZE +} + +/** + * 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 ... + */ +bool +UpdateModifiersFromCompat(struct xkb_keymap *keymap) +{ + xkb_mod_index_t vmod; + xkb_group_index_t grp; + xkb_led_index_t led; + unsigned int i, j; + struct xkb_key *key; + + /* Find all the interprets for the key and bind them to actions, + * which will also update the vmodmap. */ + xkb_foreach_key(key, keymap) + if (!ApplyInterpsToKey(keymap, key)) + return false; + + /* Update keymap->vmods, the virtual -> real mod mapping. */ + for (vmod = 0; vmod < XkbNumVirtualMods; vmod++) + keymap->vmods[vmod] = 0; + + xkb_foreach_key(key, keymap) { + if (!key->vmodmap) + continue; + + for (vmod = 0; vmod < XkbNumVirtualMods; vmod++) { + if (!(key->vmodmap & (1 << vmod))) + continue; + keymap->vmods[vmod] |= 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].map[j].mods); + ComputeEffectiveMask(keymap, &keymap->types[i].map[j].preserve); + } + } + + /* Update action modifiers. */ + xkb_foreach_key(key, keymap) { + if (!key->actions) + continue; + + for (i = 0; i < key->num_groups * key->width; i++) + UpdateActionMods(keymap, &key->actions[i], key->modmap); + } + + /* Update group modifiers. */ + for (grp = 0; grp < XkbNumKbdGroups; grp++) + ComputeEffectiveMask(keymap, &keymap->groups[grp]); + + /* Update vmod -> indicator maps. */ + for (led = 0; led < XkbNumIndicators; led++) + ComputeEffectiveMask(keymap, &keymap->indicators[led].mods); + + return true; } diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/compat.h libxkbcommon-0.1.0~2/src/xkbcomp/compat.h --- libxkbcommon-0.1.0~1/src/xkbcomp/compat.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/compat.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - -#ifndef COMPAT_H -#define COMPAT_H 1 - -extern LookupEntry groupNames[]; - -#endif /* COMPAT_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/expr.c libxkbcommon-0.1.0~2/src/xkbcomp/expr.c --- libxkbcommon-0.1.0~1/src/xkbcomp/expr.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/expr.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,123 +1,118 @@ /************************************************************ - 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 (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 "xkbcomp.h" -#include "xkbmisc.h" -#include "tokens.h" #include "expr.h" -#include +typedef bool (*IdentLookupFunc)(struct xkb_context *ctx, const void *priv, + xkb_atom_t field, enum expr_value_type type, + unsigned int *val_rtrn); -/***====================================================================***/ - -char * -exprOpText(unsigned type) +const char * +exprOpText(enum expr_op_type op) { static char buf[32]; - switch (type) - { - case ExprValue: + switch (op) { + case EXPR_VALUE: strcpy(buf, "literal"); break; - case ExprIdent: + case EXPR_IDENT: strcpy(buf, "identifier"); break; - case ExprActionDecl: + case EXPR_ACTION_DECL: strcpy(buf, "action declaration"); break; - case ExprFieldRef: + case EXPR_FIELD_REF: strcpy(buf, "field reference"); break; - case ExprArrayRef: + case EXPR_ARRAY_REF: strcpy(buf, "array reference"); break; - case ExprKeysymList: + case EXPR_KEYSYM_LIST: strcpy(buf, "list of keysyms"); break; - case ExprActionList: + case EXPR_ACTION_LIST: strcpy(buf, "list of actions"); break; - case OpAdd: + case EXPR_ADD: strcpy(buf, "addition"); break; - case OpSubtract: + case EXPR_SUBTRACT: strcpy(buf, "subtraction"); break; - case OpMultiply: + case EXPR_MULTIPLY: strcpy(buf, "multiplication"); break; - case OpDivide: + case EXPR_DIVIDE: strcpy(buf, "division"); break; - case OpAssign: + case EXPR_ASSIGN: strcpy(buf, "assignment"); break; - case OpNot: + case EXPR_NOT: strcpy(buf, "logical not"); break; - case OpNegate: + case EXPR_NEGATE: strcpy(buf, "arithmetic negation"); break; - case OpInvert: + case EXPR_INVERT: strcpy(buf, "bitwise inversion"); break; - case OpUnaryPlus: - strcpy(buf, "plus sign"); + case EXPR_UNARY_PLUS: + strcpy(buf, "unary plus"); break; default: - snprintf(buf, sizeof(buf), "illegal(%d)", type); + snprintf(buf, sizeof(buf), "illegal(%d)", op); break; } return buf; } -static char * -exprTypeText(unsigned type) +static const char * +exprValueTypeText(enum expr_value_type type) { static char buf[20]; - switch (type) - { - case TypeUnknown: + switch (type) { + case EXPR_TYPE_UNKNOWN: strcpy(buf, "unknown"); break; - case TypeBoolean: + case EXPR_TYPE_BOOLEAN: strcpy(buf, "boolean"); break; - case TypeInt: + case EXPR_TYPE_INT: strcpy(buf, "int"); break; - case TypeString: + case EXPR_TYPE_STRING: strcpy(buf, "string"); break; - case TypeAction: + case EXPR_TYPE_ACTION: strcpy(buf, "action"); break; - case TypeKeyName: + case EXPR_TYPE_KEYNAME: strcpy(buf, "keyname"); break; default: @@ -127,839 +122,708 @@ return buf; } -int -ExprResolveLhs(ExprDef * expr, - ExprResult * elem_rtrn, - ExprResult * field_rtrn, ExprDef ** index_rtrn) -{ - switch (expr->op) - { - case ExprIdent: - elem_rtrn->str = NULL; - field_rtrn->str = XkbcAtomGetString(expr->value.str); +bool +ExprResolveLhs(struct xkb_context *ctx, const ExprDef *expr, + const char **elem_rtrn, const char **field_rtrn, + ExprDef **index_rtrn) +{ + switch (expr->op) { + case EXPR_IDENT: + *elem_rtrn = NULL; + *field_rtrn = xkb_atom_text(ctx, expr->value.str); *index_rtrn = NULL; - return True; - case ExprFieldRef: - elem_rtrn->str = XkbcAtomGetString(expr->value.field.element); - field_rtrn->str = XkbcAtomGetString(expr->value.field.field); + return true; + case EXPR_FIELD_REF: + *elem_rtrn = xkb_atom_text(ctx, expr->value.field.element); + *field_rtrn = xkb_atom_text(ctx, expr->value.field.field); *index_rtrn = NULL; - return True; - case ExprArrayRef: - elem_rtrn->str = XkbcAtomGetString(expr->value.array.element); - field_rtrn->str = XkbcAtomGetString(expr->value.array.field); + return true; + case EXPR_ARRAY_REF: + *elem_rtrn = xkb_atom_text(ctx, expr->value.array.element); + *field_rtrn = xkb_atom_text(ctx, expr->value.array.field); *index_rtrn = expr->value.array.entry; - return True; + return true; + default: + break; } - WSGO("Unexpected operator %d in ResolveLhs\n", expr->op); - return False; + log_wsgo(ctx, "Unexpected operator %d in ResolveLhs\n", expr->op); + return false; } -Bool -SimpleLookup(char * priv, - uint32_t elem, uint32_t field, unsigned type, ExprResult * val_rtrn) +static bool +SimpleLookup(struct xkb_context *ctx, const void *priv, xkb_atom_t field, + enum expr_value_type type, unsigned int *val_rtrn) { - LookupEntry *entry; + const LookupEntry *entry; const char *str; - if ((priv == NULL) || - (field == None) || (elem != None) || - ((type != TypeInt) && (type != TypeFloat))) - { - return False; - } - str = XkbcAtomText(field); - for (entry = (LookupEntry *) priv; - (entry != NULL) && (entry->name != NULL); entry++) - { - if (uStrCaseCmp(str, entry->name) == 0) - { - val_rtrn->uval = entry->result; - if (type == TypeFloat) - val_rtrn->uval *= XkbGeomPtsPerMM; - return True; + 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; + + return false; } -Bool -RadioLookup(char * priv, - uint32_t elem, uint32_t field, unsigned type, ExprResult * val_rtrn) +bool +LookupModIndex(struct xkb_context *ctx, const void *priv, xkb_atom_t field, + enum expr_value_type type, xkb_mod_index_t *val_rtrn) { - const char *str; - int rg; + const char *name = xkb_atom_text(ctx, field); - if ((field == None) || (elem != None) || (type != TypeInt)) - return False; - str = XkbcAtomText(field); - if (str) - { - if (uStrCasePrefix("group", str)) - str += strlen("group"); - else if (uStrCasePrefix("radiogroup", str)) - str += strlen("radiogroup"); - else if (uStrCasePrefix("rg", str)) - str += strlen("rg"); - else if (!isdigit(str[0])) - str = NULL; - } - if ((!str) || (sscanf(str, "%i", &rg) < 1) || (rg < 1) - || (rg > XkbMaxRadioGroups)) - return False; - val_rtrn->uval = rg; - return True; -} - -static LookupEntry modIndexNames[] = { - {"shift", ShiftMapIndex}, - {"control", ControlMapIndex}, - {"lock", LockMapIndex}, - {"mod1", Mod1MapIndex}, - {"mod2", Mod2MapIndex}, - {"mod3", Mod3MapIndex}, - {"mod4", Mod4MapIndex}, - {"mod5", Mod5MapIndex}, - {"none", XkbNoModifier}, - {NULL, 0} -}; - -int -LookupModIndex(char * priv, - uint32_t elem, uint32_t field, unsigned type, ExprResult * val_rtrn) -{ - return SimpleLookup((char *) modIndexNames, elem, field, type, - val_rtrn); -} - -static int -LookupModMask(char * priv, - uint32_t elem, uint32_t field, unsigned type, ExprResult * val_rtrn) -{ - char *str; - Bool ret = True; - - if ((elem != None) || (type != TypeInt)) - return False; - str = XkbcAtomGetString(field); - if (str == NULL) - return False; - if (uStrCaseCmp(str, "all") == 0) - val_rtrn->uval = 0xff; - else if (uStrCaseCmp(str, "none") == 0) - val_rtrn->uval = 0; - else if (LookupModIndex(priv, elem, field, type, val_rtrn)) - val_rtrn->uval = (1 << val_rtrn->uval); - else if (priv != NULL) - { - LookupPriv *lpriv = (LookupPriv *) priv; - if ((lpriv->chain == NULL) || - (!(*lpriv->chain) (lpriv->chainPriv, elem, field, type, - val_rtrn))) - ret = False; + if (istreq(name, "none")) { + *val_rtrn = XkbNoModifier; + return true; } - else - ret = False; - free(str); - return ret; + + *val_rtrn = ModNameToIndex(name); + return (*val_rtrn != XKB_MOD_INVALID); } -int -ExprResolveModMask(ExprDef * expr, - ExprResult * val_rtrn, - IdentLookupFunc lookup, char * lookupPriv) +bool +LookupModMask(struct xkb_context *ctx, const void *priv, xkb_atom_t field, + enum expr_value_type type, xkb_mod_mask_t *val_rtrn) { - LookupPriv priv; + const char *str; + xkb_mod_index_t ndx; - priv.priv = NULL; - priv.chain = lookup; - priv.chainPriv = lookupPriv; - return ExprResolveMask(expr, val_rtrn, LookupModMask, (char *) & priv); -} + if (type != EXPR_TYPE_INT) + return false; -int -ExprResolveBoolean(ExprDef * expr, - ExprResult * val_rtrn, - IdentLookupFunc lookup, char * lookupPriv) -{ - int ok = 0; - const char *bogus = NULL; + str = xkb_atom_text(ctx, field); - switch (expr->op) - { - case ExprValue: - if (expr->type != TypeBoolean) - { - ERROR - ("Found constant of type %s where boolean was expected\n", - exprTypeText(expr->type)); - return False; - } - val_rtrn->ival = expr->value.ival; - return True; - case ExprIdent: - bogus = XkbcAtomText(expr->value.str); - if (bogus) - { - if ((uStrCaseCmp(bogus, "true") == 0) || - (uStrCaseCmp(bogus, "yes") == 0) || - (uStrCaseCmp(bogus, "on") == 0)) - { - val_rtrn->uval = 1; - return True; + if (istreq(str, "all")) + *val_rtrn = 0xff; + else if (istreq(str, "none")) + *val_rtrn = 0; + else if (LookupModIndex(ctx, priv, field, type, &ndx)) + *val_rtrn = (1 << ndx); + else + return false; + + return true; +} + +bool +ExprResolveBoolean(struct xkb_context *ctx, const ExprDef *expr, + bool *set_rtrn) +{ + bool ok = false; + const char *ident; + + switch (expr->op) { + case EXPR_VALUE: + if (expr->value_type != EXPR_TYPE_BOOLEAN) { + log_err(ctx, + "Found constant of type %s where boolean was expected\n", + exprValueTypeText(expr->value_type)); + return false; + } + *set_rtrn = !!expr->value.ival; + return true; + + case EXPR_IDENT: + ident = xkb_atom_text(ctx, expr->value.str); + if (ident) { + if (istreq(ident, "true") || + istreq(ident, "yes") || + istreq(ident, "on")) { + *set_rtrn = true; + return true; } - else if ((uStrCaseCmp(bogus, "false") == 0) || - (uStrCaseCmp(bogus, "no") == 0) || - (uStrCaseCmp(bogus, "off") == 0)) - { - val_rtrn->uval = 0; - return True; + else if (istreq(ident, "false") || + istreq(ident, "no") || + istreq(ident, "off")) { + *set_rtrn = false; + return true; } } - if (lookup) - { - ok = (*lookup) (lookupPriv, - None, expr->value.str, TypeBoolean, val_rtrn); - } - if (!ok) - ERROR("Identifier \"%s\" of type int is unknown\n", - XkbcAtomText(expr->value.str)); - return ok; - case ExprFieldRef: - if (lookup) - { - ok = (*lookup) (lookupPriv, - expr->value.field.element, - expr->value.field.field, TypeBoolean, val_rtrn); - } - if (!ok) - ERROR("Default \"%s.%s\" of type boolean is unknown\n", - XkbcAtomText(expr->value.field.element), - XkbcAtomText(expr->value.field.field)); - return ok; - case OpInvert: - case OpNot: - ok = ExprResolveBoolean(expr, val_rtrn, lookup, lookupPriv); + log_err(ctx, "Identifier \"%s\" of type boolean is unknown\n", + xkb_atom_text(ctx, expr->value.str)); + return false; + + case EXPR_FIELD_REF: + log_err(ctx, "Default \"%s.%s\" of type boolean is unknown\n", + xkb_atom_text(ctx, expr->value.field.element), + xkb_atom_text(ctx, expr->value.field.field)); + return false; + + case EXPR_INVERT: + case EXPR_NOT: + ok = ExprResolveBoolean(ctx, expr, set_rtrn); if (ok) - val_rtrn->uval = !val_rtrn->uval; + *set_rtrn = !*set_rtrn; return ok; - case OpAdd: - if (bogus == NULL) - bogus = "Addition"; - case OpSubtract: - if (bogus == NULL) - bogus = "Subtraction"; - case OpMultiply: - if (bogus == NULL) - bogus = "Multiplication"; - case OpDivide: - if (bogus == NULL) - bogus = "Division"; - case OpAssign: - if (bogus == NULL) - bogus = "Assignment"; - case OpNegate: - if (bogus == NULL) - bogus = "Negation"; - ERROR("%s of boolean values not permitted\n", bogus); - break; - case OpUnaryPlus: - ERROR("Unary \"+\" operator not permitted for boolean values\n"); + case EXPR_ADD: + case EXPR_SUBTRACT: + case EXPR_MULTIPLY: + case EXPR_DIVIDE: + case EXPR_ASSIGN: + case EXPR_NEGATE: + case EXPR_UNARY_PLUS: + log_err(ctx, "%s of boolean values not permitted\n", + exprOpText(expr->op)); break; + default: - WSGO("Unknown operator %d in ResolveBoolean\n", expr->op); + log_wsgo(ctx, "Unknown operator %d in ResolveBoolean\n", expr->op); break; } - return False; + + return false; } -int -ExprResolveFloat(ExprDef * expr, - ExprResult * val_rtrn, - IdentLookupFunc lookup, char * lookupPriv) +bool +ExprResolveKeyCode(struct xkb_context *ctx, const ExprDef *expr, + xkb_keycode_t *kc) { - int ok = 0; - ExprResult leftRtrn, rightRtrn; + xkb_keycode_t leftRtrn, rightRtrn; ExprDef *left, *right; - switch (expr->op) - { - case ExprValue: - if (expr->type == TypeString) - { - const char *str; - str = XkbcAtomText(expr->value.str); - if ((str != NULL) && (strlen(str) == 1)) - { - val_rtrn->uval = str[0] * XkbGeomPtsPerMM; - return True; - } - } - if ((expr->type != TypeInt) && (expr->type != TypeFloat)) - { - ERROR("Found constant of type %s, expected a number\n", - exprTypeText(expr->type)); - return False; - } - val_rtrn->ival = expr->value.ival; - if (expr->type == TypeInt) - val_rtrn->ival *= XkbGeomPtsPerMM; - return True; - case ExprIdent: - if (lookup) - { - ok = (*lookup) (lookupPriv, - None, expr->value.str, TypeFloat, val_rtrn); - } - if (!ok) - ERROR("Numeric identifier \"%s\" unknown\n", - XkbcAtomText(expr->value.str)); - return ok; - case ExprFieldRef: - if (lookup) - { - ok = (*lookup) (lookupPriv, - expr->value.field.element, - expr->value.field.field, TypeFloat, val_rtrn); - } - if (!ok) - ERROR("Numeric default \"%s.%s\" unknown\n", - XkbcAtomText(expr->value.field.element), - XkbcAtomText(expr->value.field.field)); - return ok; - case OpAdd: - case OpSubtract: - case OpMultiply: - case OpDivide: + switch (expr->op) { + case EXPR_VALUE: + if (expr->value_type != EXPR_TYPE_INT) { + log_err(ctx, + "Found constant of type %s where an int was expected\n", + exprValueTypeText(expr->value_type)); + return false; + } + + *kc = expr->value.uval; + return true; + + case EXPR_ADD: + case EXPR_SUBTRACT: + case EXPR_MULTIPLY: + case EXPR_DIVIDE: left = expr->value.binary.left; right = expr->value.binary.right; - if (ExprResolveFloat(left, &leftRtrn, lookup, lookupPriv) && - ExprResolveFloat(right, &rightRtrn, lookup, lookupPriv)) - { - switch (expr->op) - { - case OpAdd: - val_rtrn->ival = leftRtrn.ival + rightRtrn.ival; - break; - case OpSubtract: - val_rtrn->ival = leftRtrn.ival - rightRtrn.ival; - break; - case OpMultiply: - val_rtrn->ival = leftRtrn.ival * rightRtrn.ival; - break; - case OpDivide: - val_rtrn->ival = leftRtrn.ival / rightRtrn.ival; - break; + + if (!ExprResolveKeyCode(ctx, left, &leftRtrn) || + !ExprResolveKeyCode(ctx, right, &rightRtrn)) + return false; + + switch (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; } - return True; - } - return False; - case OpAssign: - WSGO("Assignment operator not implemented yet\n"); - break; - case OpNot: - left = expr->value.child; - if (ExprResolveFloat(left, &leftRtrn, lookup, lookupPriv)) - { - ERROR("The ! operator cannot be applied to a number\n"); + + *kc = leftRtrn / rightRtrn; + break; + default: + break; } - return False; - case OpInvert: - case OpNegate: + + return true; + + case EXPR_NEGATE: left = expr->value.child; - if (ExprResolveFloat(left, &leftRtrn, lookup, lookupPriv)) - { - if (expr->op == OpNegate) - val_rtrn->ival = -leftRtrn.ival; - else - val_rtrn->ival = ~leftRtrn.ival; - return True; - } - return False; - case OpUnaryPlus: + if (!ExprResolveKeyCode(ctx, left, &leftRtrn)) + return false; + + *kc = ~leftRtrn; + return true; + + case EXPR_UNARY_PLUS: left = expr->value.child; - return ExprResolveFloat(left, val_rtrn, lookup, lookupPriv); + return ExprResolveKeyCode(ctx, left, kc); + default: - WSGO("Unknown operator %d in ResolveFloat\n", expr->op); + log_wsgo(ctx, "Unknown operator %d in ResolveKeyCode\n", expr->op); break; } - return False; + + return false; } -int -ExprResolveInteger(ExprDef * expr, - ExprResult * val_rtrn, - IdentLookupFunc lookup, char * lookupPriv) -{ - int ok = 0; - ExprResult leftRtrn, rightRtrn; +/** + * 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->op) - { - case ExprValue: - if (expr->type == TypeString) - { - const char *str; - str = XkbcAtomText(expr->value.str); - if (str != NULL) - switch (strlen(str)) - { - case 0: - val_rtrn->uval = 0; - return True; - case 1: - val_rtrn->uval = str[0]; - return True; - default: - break; - } - } - if ((expr->type != TypeInt) && (expr->type != TypeFloat)) - { - ERROR - ("Found constant of type %s where an int was expected\n", - exprTypeText(expr->type)); - return False; - } - val_rtrn->ival = expr->value.ival; - if (expr->type == TypeFloat) - val_rtrn->ival /= XkbGeomPtsPerMM; - return True; - case ExprIdent: - if (lookup) - { - ok = (*lookup) (lookupPriv, - None, expr->value.str, TypeInt, val_rtrn); + switch (expr->op) { + case EXPR_VALUE: + if (expr->value_type != EXPR_TYPE_INT) { + log_err(ctx, + "Found constant of type %s where an int was expected\n", + exprValueTypeText(expr->value_type)); + return false; } - if (!ok) - ERROR("Identifier \"%s\" of type int is unknown\n", - XkbcAtomText(expr->value.str)); - return ok; - case ExprFieldRef: + + *val_rtrn = expr->value.ival; + return true; + + case EXPR_IDENT: if (lookup) - { - ok = (*lookup) (lookupPriv, - expr->value.field.element, - expr->value.field.field, TypeInt, val_rtrn); - } + ok = lookup(ctx, lookupPriv, expr->value.str, EXPR_TYPE_INT, &u); + if (!ok) - ERROR("Default \"%s.%s\" of type int is unknown\n", - XkbcAtomText(expr->value.field.element), - XkbcAtomText(expr->value.field.field)); + log_err(ctx, "Identifier \"%s\" of type int is unknown\n", + xkb_atom_text(ctx, expr->value.str)); + else + *val_rtrn = (int) u; + return ok; - case OpAdd: - case OpSubtract: - case OpMultiply: - case OpDivide: + + case EXPR_FIELD_REF: + log_err(ctx, "Default \"%s.%s\" of type int is unknown\n", + xkb_atom_text(ctx, expr->value.field.element), + xkb_atom_text(ctx, expr->value.field.field)); + return false; + + case EXPR_ADD: + case EXPR_SUBTRACT: + case EXPR_MULTIPLY: + case EXPR_DIVIDE: left = expr->value.binary.left; right = expr->value.binary.right; - if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv) && - ExprResolveInteger(right, &rightRtrn, lookup, lookupPriv)) - { - switch (expr->op) - { - case OpAdd: - val_rtrn->ival = leftRtrn.ival + rightRtrn.ival; - break; - case OpSubtract: - val_rtrn->ival = leftRtrn.ival - rightRtrn.ival; - break; - case OpMultiply: - val_rtrn->ival = leftRtrn.ival * rightRtrn.ival; - break; - case OpDivide: - val_rtrn->ival = leftRtrn.ival / rightRtrn.ival; - break; + if (!ExprResolveIntegerLookup(ctx, left, &l, lookup, lookupPriv) || + !ExprResolveIntegerLookup(ctx, right, &r, lookup, lookupPriv)) + return false; + + switch (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; } - return True; + *val_rtrn = l / r; + break; + default: + break; } - return False; - case OpAssign: - WSGO("Assignment operator not implemented yet\n"); + + return true; + + case EXPR_ASSIGN: + log_wsgo(ctx, "Assignment operator not implemented yet\n"); break; - case OpNot: - left = expr->value.child; - if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv)) - { - ERROR("The ! operator cannot be applied to an integer\n"); - } - return False; - case OpInvert: - case OpNegate: + + 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->value.child; - if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv)) - { - if (expr->op == OpNegate) - val_rtrn->ival = -leftRtrn.ival; - else - val_rtrn->ival = ~leftRtrn.ival; - return True; - } - return False; - case OpUnaryPlus: + if (!ExprResolveIntegerLookup(ctx, left, &l, lookup, lookupPriv)) + return false; + + *val_rtrn = (expr->op == EXPR_NEGATE ? -l : ~l); + return true; + + case EXPR_UNARY_PLUS: left = expr->value.child; - return ExprResolveInteger(left, val_rtrn, lookup, lookupPriv); + return ExprResolveIntegerLookup(ctx, left, val_rtrn, lookup, + lookupPriv); + default: - WSGO("Unknown operator %d in ResolveInteger\n", expr->op); + log_wsgo(ctx, "Unknown operator %d in ResolveInteger\n", expr->op); break; } - return False; + + return false; } -int -ExprResolveString(ExprDef * expr, - ExprResult * val_rtrn, - IdentLookupFunc lookup, char * lookupPriv) -{ - int ok = 0; - ExprResult leftRtrn, rightRtrn; - ExprDef *left; - ExprDef *right; - char *bogus = NULL; +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_group_index_t *group_rtrn) +{ + bool ok; + int result; + static const LookupEntry group_names[] = { + { "group1", 1 }, + { "group2", 2 }, + { "group3", 3 }, + { "group4", 4 }, + { "group5", 5 }, + { "group6", 6 }, + { "group7", 7 }, + { "group8", 8 }, + { NULL, 0 } + }; + + ok = ExprResolveIntegerLookup(ctx, expr, &result, SimpleLookup, + group_names); + if (!ok) + return false; + + if (result <= 0 || result > XkbNumKbdGroups) { + log_err(ctx, "Group index %u is out of range (1..%d)\n", + result, XkbNumKbdGroups); + return false; + } + + *group_rtrn = (xkb_group_index_t) result; + return true; +} + +bool +ExprResolveLevel(struct xkb_context *ctx, const ExprDef *expr, + xkb_level_index_t *level_rtrn) +{ + bool ok; + int result; + static const LookupEntry level_names[] = { + { "level1", 1 }, + { "level2", 2 }, + { "level3", 3 }, + { "level4", 4 }, + { "level5", 5 }, + { "level6", 6 }, + { "level7", 7 }, + { "level8", 8 }, + { NULL, 0 } + }; + + ok = ExprResolveIntegerLookup(ctx, expr, &result, SimpleLookup, + level_names); + if (!ok) + return false; + + if (result < 1 || result > XkbMaxShiftLevel) { + log_err(ctx, "Shift level %d is out of range (1..%d)\n", + result, XkbMaxShiftLevel); + 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) +{ + int result; + static const LookupEntry button_names[] = { + { "button1", 1 }, + { "button2", 2 }, + { "button3", 3 }, + { "button4", 4 }, + { "button5", 5 }, + { "default", 0 }, + { NULL, 0 } + }; + + if (!ExprResolveIntegerLookup(ctx, expr, &result, SimpleLookup, + button_names)) + return false; + + *btn_rtrn = result; + return true; +} + +bool +ExprResolveString(struct xkb_context *ctx, const ExprDef *expr, + const char **val_rtrn) +{ + switch (expr->op) { + case EXPR_VALUE: + if (expr->value_type != EXPR_TYPE_STRING) { + log_err(ctx, "Found constant of type %s, expected a string\n", + exprValueTypeText(expr->value_type)); + return false; + } + + *val_rtrn = xkb_atom_text(ctx, expr->value.str); + return true; + + case EXPR_IDENT: + log_err(ctx, "Identifier \"%s\" of type string not found\n", + xkb_atom_text(ctx, expr->value.str)); + return false; + + case EXPR_FIELD_REF: + log_err(ctx, "Default \"%s.%s\" of type string not found\n", + xkb_atom_text(ctx, expr->value.field.element), + xkb_atom_text(ctx, expr->value.field.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: + log_err(ctx, "%s of strings not permitted\n", exprOpText(expr->op)); + return false; - switch (expr->op) - { - case ExprValue: - if (expr->type != TypeString) - { - ERROR("Found constant of type %s, expected a string\n", - exprTypeText(expr->type)); - return False; - } - val_rtrn->str = XkbcAtomGetString(expr->value.str); - if (val_rtrn->str == NULL) - { - static char *empty = ""; - val_rtrn->str = empty; - } - return True; - case ExprIdent: - if (lookup) - { - ok = (*lookup) (lookupPriv, - None, expr->value.str, TypeString, val_rtrn); - } - if (!ok) - ERROR("Identifier \"%s\" of type string not found\n", - XkbcAtomText(expr->value.str)); - return ok; - case ExprFieldRef: - if (lookup) - { - ok = (*lookup) (lookupPriv, - expr->value.field.element, - expr->value.field.field, TypeString, val_rtrn); - } - if (!ok) - ERROR("Default \"%s.%s\" of type string not found\n", - XkbcAtomText(expr->value.field.element), - XkbcAtomText(expr->value.field.field)); - return ok; - case OpAdd: - left = expr->value.binary.left; - right = expr->value.binary.right; - if (ExprResolveString(left, &leftRtrn, lookup, lookupPriv) && - ExprResolveString(right, &rightRtrn, lookup, lookupPriv)) - { - int len; - char *new; - len = strlen(leftRtrn.str) + strlen(rightRtrn.str) + 1; - new = (char *) malloc(len); - if (new) - { - sprintf(new, "%s%s", leftRtrn.str, rightRtrn.str); - val_rtrn->str = new; - return True; - } - } - return False; - case OpSubtract: - if (bogus == NULL) - bogus = "Subtraction"; - case OpMultiply: - if (bogus == NULL) - bogus = "Multiplication"; - case OpDivide: - if (bogus == NULL) - bogus = "Division"; - case OpAssign: - if (bogus == NULL) - bogus = "Assignment"; - case OpNegate: - if (bogus == NULL) - bogus = "Negation"; - case OpInvert: - if (bogus == NULL) - bogus = "Bitwise complement"; - ERROR("%s of string values not permitted\n", bogus); - return False; - case OpNot: - left = expr->value.child; - if (ExprResolveString(left, &leftRtrn, lookup, lookupPriv)) - { - ERROR("The ! operator cannot be applied to a string\n"); - } - return False; - case OpUnaryPlus: - left = expr->value.child; - if (ExprResolveString(left, &leftRtrn, lookup, lookupPriv)) - { - ERROR("The + operator cannot be applied to a string\n"); - } - return False; default: - WSGO("Unknown operator %d in ResolveString\n", expr->op); + log_wsgo(ctx, "Unknown operator %d in ResolveString\n", expr->op); break; } - return False; + return false; } -int -ExprResolveKeyName(ExprDef * expr, - ExprResult * val_rtrn, - IdentLookupFunc lookup, char * lookupPriv) -{ - int ok = 0; - ExprDef *left; - ExprResult leftRtrn; - char *bogus = NULL; +bool +ExprResolveKeyName(struct xkb_context *ctx, const ExprDef *expr, + char name[XkbKeyNameLength]) +{ + switch (expr->op) { + case EXPR_VALUE: + if (expr->value_type != EXPR_TYPE_KEYNAME) { + log_err(ctx, "Found constant of type %s, expected a key name\n", + exprValueTypeText(expr->value_type)); + return false; + } + strncpy(name, expr->value.keyName, XkbKeyNameLength); + return true; + + case EXPR_IDENT: + log_err(ctx, "Identifier \"%s\" of type string not found\n", + xkb_atom_text(ctx, expr->value.str)); + return false; + + case EXPR_FIELD_REF: + log_err(ctx, "Default \"%s.%s\" of type key name not found\n", + xkb_atom_text(ctx, expr->value.field.element), + xkb_atom_text(ctx, expr->value.field.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: + log_err(ctx, "%s of key name values not permitted\n", + exprOpText(expr->op)); + return false; - switch (expr->op) - { - case ExprValue: - if (expr->type != TypeKeyName) - { - ERROR("Found constant of type %s, expected a key name\n", - exprTypeText(expr->type)); - return False; - } - memcpy(val_rtrn->keyName.name, expr->value.keyName, XkbKeyNameLength); - return True; - case ExprIdent: - if (lookup) - { - ok = (*lookup) (lookupPriv, - None, expr->value.str, TypeString, val_rtrn); - } - if (!ok) - ERROR("Identifier \"%s\" of type string not found\n", - XkbcAtomText(expr->value.str)); - return ok; - case ExprFieldRef: - if (lookup) - { - ok = (*lookup) (lookupPriv, - expr->value.field.element, - expr->value.field.field, TypeString, val_rtrn); - } - if (!ok) - ERROR("Default \"%s.%s\" of type key name not found\n", - XkbcAtomText(expr->value.field.element), - XkbcAtomText(expr->value.field.field)); - return ok; - case OpAdd: - if (bogus == NULL) - bogus = "Addition"; - case OpSubtract: - if (bogus == NULL) - bogus = "Subtraction"; - case OpMultiply: - if (bogus == NULL) - bogus = "Multiplication"; - case OpDivide: - if (bogus == NULL) - bogus = "Division"; - case OpAssign: - if (bogus == NULL) - bogus = "Assignment"; - case OpNegate: - if (bogus == NULL) - bogus = "Negation"; - case OpInvert: - if (bogus == NULL) - bogus = "Bitwise complement"; - ERROR("%s of key name values not permitted\n", bogus); - return False; - case OpNot: - left = expr->value.binary.left; - if (ExprResolveString(left, &leftRtrn, lookup, lookupPriv)) - { - ERROR("The ! operator cannot be applied to a key name\n"); - } - return False; - case OpUnaryPlus: - left = expr->value.binary.left; - if (ExprResolveString(left, &leftRtrn, lookup, lookupPriv)) - { - ERROR("The + operator cannot be applied to a key name\n"); - } - return False; default: - WSGO("Unknown operator %d in ResolveKeyName\n", expr->op); + log_wsgo(ctx, "Unknown operator %d in ResolveKeyName\n", expr->op); break; } - return False; + return false; } -/***====================================================================***/ - -int -ExprResolveEnum(ExprDef * expr, ExprResult * val_rtrn, LookupEntry * values) +bool +ExprResolveEnum(struct xkb_context *ctx, const ExprDef *expr, + unsigned int *val_rtrn, const LookupEntry *values) { - if (expr->op != ExprIdent) - { - ERROR("Found a %s where an enumerated value was expected\n", - exprOpText(expr->op)); - return False; + if (expr->op != EXPR_IDENT) { + log_err(ctx, "Found a %s where an enumerated value was expected\n", + exprOpText(expr->op)); + return false; } - if (!SimpleLookup((char *) values, (uint32_t) None, expr->value.str, - (unsigned) TypeInt, val_rtrn)) - { - int nOut = 0; - ERROR("Illegal identifier %s (expected one of: ", - XkbcAtomText(expr->value.str)); + + if (!SimpleLookup(ctx, values, expr->value.str, EXPR_TYPE_INT, + val_rtrn)) { + log_err(ctx, "Illegal identifier %s; expected one of:\n", + xkb_atom_text(ctx, expr->value.str)); while (values && values->name) { - if (nOut != 0) - INFO(", %s", values->name); - else - INFO("%s", values->name); + log_err(ctx, "\t%s\n", values->name); values++; - nOut++; } - INFO(")\n"); - return False; + return false; } - return True; + + return true; } -int -ExprResolveMask(ExprDef * expr, - ExprResult * val_rtrn, - IdentLookupFunc lookup, char * lookupPriv) +static bool +ExprResolveMaskLookup(struct xkb_context *ctx, const ExprDef *expr, + unsigned int *val_rtrn, IdentLookupFunc lookup, + const void *lookupPriv) { - int ok = 0; - ExprResult leftRtrn, rightRtrn; + bool ok = 0; + unsigned int l, r; + int v; ExprDef *left, *right; - char *bogus = NULL; + const char *bogus = NULL; - switch (expr->op) - { - case ExprValue: - if (expr->type != TypeInt) - { - ERROR - ("Found constant of type %s where a mask was expected\n", - exprTypeText(expr->type)); - return False; - } - val_rtrn->ival = expr->value.ival; - return True; - case ExprIdent: - if (lookup) - { - ok = (*lookup) (lookupPriv, - None, expr->value.str, TypeInt, val_rtrn); - } - if (!ok) - ERROR("Identifier \"%s\" of type int is unknown\n", - XkbcAtomText(expr->value.str)); - return ok; - case ExprFieldRef: - if (lookup) - { - ok = (*lookup) (lookupPriv, - expr->value.field.element, - expr->value.field.field, TypeInt, val_rtrn); - } - if (!ok) - ERROR("Default \"%s.%s\" of type int is unknown\n", - XkbcAtomText(expr->value.field.element), - XkbcAtomText(expr->value.field.field)); - return ok; - case ExprArrayRef: + switch (expr->op) { + case EXPR_VALUE: + if (expr->value_type != EXPR_TYPE_INT) { + log_err(ctx, + "Found constant of type %s where a mask was expected\n", + exprValueTypeText(expr->value_type)); + return false; + } + *val_rtrn = (unsigned int) expr->value.ival; + return true; + + case EXPR_IDENT: + ok = lookup(ctx, lookupPriv, expr->value.str, EXPR_TYPE_INT, + val_rtrn); + if (!ok) + log_err(ctx, "Identifier \"%s\" of type int is unknown\n", + xkb_atom_text(ctx, expr->value.str)); + return ok; + + case EXPR_FIELD_REF: + log_err(ctx, "Default \"%s.%s\" of type int is unknown\n", + xkb_atom_text(ctx, expr->value.field.element), + xkb_atom_text(ctx, expr->value.field.field)); + return false; + + case EXPR_ARRAY_REF: bogus = "array reference"; - case ExprActionDecl: + + case EXPR_ACTION_DECL: if (bogus == NULL) bogus = "function use"; - ERROR("Unexpected %s in mask expression\n", bogus); - ACTION("Expression ignored\n"); - return False; - case OpAdd: - case OpSubtract: - case OpMultiply: - case OpDivide: + 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->value.binary.left; right = expr->value.binary.right; - if (ExprResolveMask(left, &leftRtrn, lookup, lookupPriv) && - ExprResolveMask(right, &rightRtrn, lookup, lookupPriv)) - { - switch (expr->op) - { - case OpAdd: - val_rtrn->ival = leftRtrn.ival | rightRtrn.ival; - break; - case OpSubtract: - val_rtrn->ival = leftRtrn.ival & (~rightRtrn.ival); - break; - case OpMultiply: - case OpDivide: - ERROR("Cannot %s masks\n", - expr->op == OpDivide ? "divide" : "multiply"); - ACTION("Illegal operation ignored\n"); - return False; - } - return True; + if (!ExprResolveMaskLookup(ctx, left, &l, lookup, lookupPriv) || + !ExprResolveMaskLookup(ctx, right, &r, lookup, lookupPriv)) + return false; + + switch (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->op == EXPR_DIVIDE ? "divide" : "multiply")); + return false; + default: + break; } - return False; - case OpAssign: - WSGO("Assignment operator not implemented yet\n"); + + return true; + + case EXPR_ASSIGN: + log_wsgo(ctx, "Assignment operator not implemented yet\n"); break; - case OpInvert: + + case EXPR_INVERT: left = expr->value.child; - if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv)) - { - val_rtrn->ival = ~leftRtrn.ival; - return True; - } - return False; - case OpUnaryPlus: - case OpNegate: - case OpNot: + 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->value.child; - if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv)) - { - ERROR("The %s operator cannot be used with a mask\n", - (expr->op == OpNegate ? "-" : "!")); - } - return False; + if (!ExprResolveIntegerLookup(ctx, left, &v, lookup, lookupPriv)) + log_err(ctx, "The %s operator cannot be used with a mask\n", + (expr->op == EXPR_NEGATE ? "-" : "!")); + return false; + default: - WSGO("Unknown operator %d in ResolveMask\n", expr->op); + log_wsgo(ctx, "Unknown operator %d in ResolveMask\n", expr->op); break; } - return False; + + return false; } -int -ExprResolveKeySym(ExprDef * expr, - ExprResult * val_rtrn, - IdentLookupFunc lookup, char * lookupPriv) +bool +ExprResolveMask(struct xkb_context *ctx, const ExprDef *expr, + unsigned int *mask_rtrn, const LookupEntry *values) { - int ok = 0; - uint32_t sym; + return ExprResolveMaskLookup(ctx, expr, mask_rtrn, SimpleLookup, values); +} - if (expr->op == ExprIdent) - { +bool +ExprResolveModMask(struct xkb_context *ctx, const ExprDef *expr, + xkb_mod_mask_t *mask_rtrn) +{ + return ExprResolveMaskLookup(ctx, expr, mask_rtrn, LookupModMask, NULL); +} + +bool +ExprResolveVModMask(struct xkb_keymap *keymap, const ExprDef *expr, + xkb_mod_mask_t *mask_rtrn) +{ + return ExprResolveMaskLookup(keymap->ctx, expr, mask_rtrn, LookupVModMask, + keymap); +} + +bool +ExprResolveKeySym(struct xkb_context *ctx, const ExprDef *expr, + xkb_keysym_t *sym_rtrn) +{ + int val; + + if (expr->op == EXPR_IDENT) { const char *str; - str = XkbcAtomText(expr->value.str); - if ((str != NULL) && ((sym = xkb_string_to_keysym(str)) != NoSymbol)) - { - val_rtrn->uval = sym; - return True; - } + str = xkb_atom_text(ctx, expr->value.str); + *sym_rtrn = xkb_keysym_from_name(str); + if (*sym_rtrn != XKB_KEY_NoSymbol) + return true; } - ok = ExprResolveInteger(expr, val_rtrn, lookup, lookupPriv); - if ((ok) && (val_rtrn->uval < 10)) - val_rtrn->uval += '0'; - return ok; + + if (!ExprResolveInteger(ctx, expr, &val)) + return false; + + if (val < 0 || val >= 10) + return false; + + *sym_rtrn = ((xkb_keysym_t) val) + '0'; + return true; } diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/expr.h libxkbcommon-0.1.0~2/src/xkbcomp/expr.h --- libxkbcommon-0.1.0~1/src/xkbcomp/expr.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/expr.h 2012-08-11 16:17:00.000000000 +0000 @@ -1,149 +1,109 @@ /************************************************************ - 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 (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 EXPR_H #define EXPR_H 1 -typedef union _ExprResult -{ - char *str; - int ival; - unsigned uval; - struct xkb_key_name keyName; -} ExprResult; - -typedef Bool(*IdentLookupFunc) (char * /* priv */ , - uint32_t /* elem */ , - uint32_t /* field */ , - unsigned /* type */ , - ExprResult * /* val_rtrn */ - ); - -extern int ExprResolveLhs(ExprDef * /* expr */ , - ExprResult * /* elem_rtrn */ , - ExprResult * /* field_rtrn */ , - ExprDef ** /* index_rtrn */ - ); - -typedef struct _LookupPriv -{ - char * priv; - IdentLookupFunc chain; - char * chainPriv; -} LookupPriv; +#include "xkbcomp-priv.h" -typedef struct _LookupEntry -{ +typedef struct _LookupEntry { const char *name; - unsigned result; + unsigned int value; } LookupEntry; -typedef struct _LookupTable -{ - char *element; - LookupEntry *entries; - struct _LookupTable *nextElement; -} LookupTable; - - -extern char *exprOpText(unsigned /* type */ - ); - -extern int RadioLookup(char * /* priv */ , - uint32_t /* elem */ , - uint32_t /* field */ , - unsigned /* type */ , - ExprResult * /* val_rtrn */ - ); - -extern int SimpleLookup(char * /* priv */ , - uint32_t /* elem */ , - uint32_t /* field */ , - unsigned /* type */ , - ExprResult * /* val_rtrn */ - ); - -extern int LookupModIndex(char * /* priv */ , - uint32_t /* elem */ , - uint32_t /* field */ , - unsigned /* type */ , - ExprResult * /* val_rtrn */ - ); - -extern int ExprResolveModMask(ExprDef * /* expr */ , - ExprResult * /* val_rtrn */ , - IdentLookupFunc /* lookup */ , - char * /* priv */ - ); - -extern int ExprResolveBoolean(ExprDef * /* expr */ , - ExprResult * /* val_rtrn */ , - IdentLookupFunc /* lookup */ , - char * /* lookupPriv */ - ); - -extern int ExprResolveInteger(ExprDef * /* expr */ , - ExprResult * /* val_rtrn */ , - IdentLookupFunc /* lookup */ , - char * /* lookupPriv */ - ); - -extern int ExprResolveFloat(ExprDef * /* expr */ , - ExprResult * /* val_rtrn */ , - IdentLookupFunc /* lookup */ , - char * /* lookupPriv */ - ); - -extern int ExprResolveString(ExprDef * /* expr */ , - ExprResult * /* val_rtrn */ , - IdentLookupFunc /* lookup */ , - char * /* lookupPriv */ - ); - -extern int ExprResolveKeyName(ExprDef * /* expr */ , - ExprResult * /* val_rtrn */ , - IdentLookupFunc /* lookup */ , - char * /* lookupPriv */ - ); - -extern int ExprResolveEnum(ExprDef * /* expr */ , - ExprResult * /* val_rtrn */ , - LookupEntry * /* values */ - ); - -extern int ExprResolveMask(ExprDef * /* expr */ , - ExprResult * /* val_rtrn */ , - IdentLookupFunc /* lookup */ , - char * /* lookupPriv */ - ); - -extern int ExprResolveKeySym(ExprDef * /* expr */ , - ExprResult * /* val_rtrn */ , - IdentLookupFunc /* lookup */ , - char * /* lookupPriv */ - ); +extern const char * +exprOpText(enum expr_op_type op); + +bool +ExprResolveLhs(struct xkb_context *ctx, const ExprDef *expr, + const char **elem_rtrn, const char **field_rtrn, + ExprDef **index_rtrn); + +bool +LookupModMask(struct xkb_context *ctx, const void *priv, xkb_atom_t field, + enum expr_value_type type, xkb_mod_mask_t *val_rtrn); + +bool +LookupVModMask(struct xkb_context *ctx, const void *priv, xkb_atom_t field, + enum expr_value_type type, xkb_mod_mask_t *val_rtrn); + +bool +LookupModIndex(struct xkb_context *ctx, const void *priv, xkb_atom_t field, + enum expr_value_type type, xkb_mod_index_t *val_rtrn); + +bool +ExprResolveModMask(struct xkb_context *ctx, const ExprDef *expr, + xkb_mod_mask_t *mask_rtrn); + +bool +ExprResolveVModMask(struct xkb_keymap *keymap, const ExprDef *expr, + xkb_mod_mask_t *mask_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_group_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, + const char **val_rtrn); + +bool +ExprResolveKeyName(struct xkb_context *ctx, const ExprDef *expr, + char name[XkbKeyNameLength]); + +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 /* EXPR_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/geometry.c libxkbcommon-0.1.0~2/src/xkbcomp/geometry.c --- libxkbcommon-0.1.0~1/src/xkbcomp/geometry.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/geometry.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,3730 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ - -#include "xkbcomp.h" -#include "xkballoc.h" -#include "xkbgeom.h" -#include "xkbmisc.h" -#include "tokens.h" -#include "expr.h" -#include "vmod.h" -#include "misc.h" -#include "indicators.h" -#include "action.h" -#include "keycodes.h" -#include "alias.h" - -#define DFLT_FONT "helvetica" -#define DFLT_SLANT "r" -#define DFLT_WEIGHT "medium" -#define DFLT_SET_WIDTH "normal" -#define DFLT_VARIANT "" -#define DFLT_ENCODING "iso8859-1" -#define DFLT_SIZE 120 - -typedef struct _PropertyInfo -{ - CommonInfo defs; - char *name; - char *value; -} PropertyInfo; - -#define _GSh_Outlines (1<<1) -#define _GSh_Approx (1<<2) -#define _GSh_Primary (1<<3) -typedef struct _ShapeInfo -{ - CommonInfo defs; - uint32_t name; - short index; - unsigned short nOutlines; - unsigned short szOutlines; - struct xkb_outline * outlines; - struct xkb_outline * approx; - struct xkb_outline * primary; - int dfltCornerRadius; -} ShapeInfo; - -#define shText(s) \ - ((s) ? XkbcAtomText((s)->name) : "default shape") - -#define _GD_Priority (1<<0) -#define _GD_Top (1<<1) -#define _GD_Left (1<<2) -#define _GD_Angle (1<<3) -#define _GD_Shape (1<<4) -#define _GD_FontVariant (1<<4) /* CHEATING */ -#define _GD_Corner (1<<5) -#define _GD_Width (1<<5) /* CHEATING */ -#define _GD_Color (1<<6) -#define _GD_OffColor (1<<7) -#define _GD_Height (1<<7) /* CHEATING */ -#define _GD_Text (1<<8) -#define _GD_Font (1<<9) -#define _GD_FontSlant (1<<10) -#define _GD_FontWeight (1<<11) -#define _GD_FontSetWidth (1<<12) -#define _GD_FontSize (1<<13) -#define _GD_FontEncoding (1<<14) -#define _GD_FontSpec (1<<15) - - -#define _GD_FontParts (_GD_Font|_GD_FontSlant|_GD_FontWeight|_GD_FontSetWidth|_GD_FontSize|_GD_FontEncoding|_GD_FontVariant) - -typedef struct _DoodadInfo -{ - CommonInfo defs; - uint32_t name; - unsigned char type; - unsigned char priority; - short top; - short left; - short angle; - unsigned short corner; - unsigned short width; - unsigned short height; - uint32_t shape; - uint32_t color; - uint32_t offColor; - uint32_t text; - uint32_t font; - uint32_t fontSlant; - uint32_t fontWeight; - uint32_t fontSetWidth; - uint32_t fontVariant; - unsigned short fontSize; - uint32_t fontEncoding; - uint32_t fontSpec; - char *logoName; - struct _SectionInfo *section; -} DoodadInfo; - -#define Yes 1 -#define No 0 -#define Undefined -1 - -#define _GK_Default (1<<0) -#define _GK_Name (1<<1) -#define _GK_Gap (1<<2) -#define _GK_Shape (1<<3) -#define _GK_Color (1<<4) -typedef struct _KeyInfo -{ - CommonInfo defs; - char name[8]; - short gap; - short index; - uint32_t shape; - uint32_t color; - struct _RowInfo *row; -} KeyInfo; -#define keyText(k) ((k)&&(k)->name[0]?(k)->name:"default") - -#define _GR_Default (1<<0) -#define _GR_Vertical (1<<1) -#define _GR_Top (1<<2) -#define _GR_Left (1<<3) -typedef struct _RowInfo -{ - CommonInfo defs; - unsigned short top; - unsigned short left; - short index; - Bool vertical; - unsigned short nKeys; - KeyInfo *keys; - KeyInfo dfltKey; - struct _SectionInfo *section; -} RowInfo; -#define rowText(r) \ - ((r) ? XkbcAtomText((r)->section->name) : "default") - -#define _GOK_UnknownRow -1 -typedef struct _OverlayKeyInfo -{ - CommonInfo defs; - short sectionRow; - short overlayRow; - char over[XkbKeyNameLength + 1]; - char under[XkbKeyNameLength + 1]; -} OverlayKeyInfo; - -typedef struct _OverlayInfo -{ - CommonInfo defs; - uint32_t name; - unsigned short nRows; - unsigned short nKeys; - OverlayKeyInfo *keys; -} OverlayInfo; -#define oiText(o) \ - ((o) ? XkbcAtomText((o)->name) : "default") - - -#define _GS_Default (1<<0) -#define _GS_Name (1<<1) -#define _GS_Top (1<<2) -#define _GS_Left (1<<3) -#define _GS_Width (1<<4) -#define _GS_Height (1<<5) -#define _GS_Angle (1<<6) -#define _GS_Priority (1<<7) -typedef struct _SectionInfo -{ - CommonInfo defs; - uint32_t name; - unsigned short top; - unsigned short left; - unsigned short width; - unsigned short height; - unsigned short angle; - unsigned short nRows; - unsigned short nDoodads; - unsigned short nOverlays; - unsigned char priority; - unsigned char nextDoodadPriority; - RowInfo *rows; - DoodadInfo *doodads; - RowInfo dfltRow; - DoodadInfo *dfltDoodads; - OverlayInfo *overlays; - struct _GeometryInfo *geometry; -} SectionInfo; -#define scText(s) \ - ((s) ? XkbcAtomText((s)->name) : "default") - -typedef struct _GeometryInfo -{ - char *name; - unsigned fileID; - unsigned merge; - int errorCount; - unsigned nextPriority; - int nProps; - int nShapes; - int nSections; - int nDoodads; - PropertyInfo *props; - ShapeInfo *shapes; - SectionInfo *sections; - DoodadInfo *doodads; - int widthMM; - int heightMM; - uint32_t font; - uint32_t fontSlant; - uint32_t fontWeight; - uint32_t fontSetWidth; - uint32_t fontVariant; - unsigned fontSize; - uint32_t fontEncoding; - uint32_t fontSpec; - uint32_t baseColor; - uint32_t labelColor; - int dfltCornerRadius; - SectionInfo dfltSection; - DoodadInfo *dfltDoodads; - AliasInfo *aliases; -} GeometryInfo; - -static const char * -ddText(DoodadInfo * di) -{ - static char buf[64]; - - if (di == NULL) - { - strcpy(buf, "default"); - return buf; - } - if (di->section) - { - sprintf(buf, "%s in section %s", - XkbcAtomText(di->name), scText(di->section)); - return buf; - } - return XkbcAtomText(di->name); -} - -/***====================================================================***/ - -static void -InitPropertyInfo(PropertyInfo * pi, GeometryInfo * info) -{ - pi->defs.defined = 0; - pi->defs.fileID = info->fileID; - pi->defs.merge = info->merge; - pi->name = pi->value = NULL; - return; -} - -static void -FreeProperties(PropertyInfo * pi, GeometryInfo * info) -{ - PropertyInfo *tmp; - PropertyInfo *next; - - if (info->props == pi) - { - info->props = NULL; - info->nProps = 0; - } - for (tmp = pi; tmp != NULL; tmp = next) - { - if (tmp->name) - free(tmp->name); - if (tmp->value) - free(tmp->value); - tmp->name = tmp->value = NULL; - next = (PropertyInfo *) tmp->defs.next; - free(tmp); - } - return; -} - -static void -InitKeyInfo(KeyInfo * key, RowInfo * row, GeometryInfo * info) -{ - - if (key != &row->dfltKey) - { - *key = row->dfltKey; - strcpy(key->name, "unknown"); - key->defs.defined &= ~_GK_Default; - } - else - { - bzero(key, sizeof(KeyInfo)); - strcpy(key->name, "default"); - key->defs.defined = _GK_Default; - key->defs.fileID = info->fileID; - key->defs.merge = info->merge; - key->defs.next = NULL; - key->row = row; - } - return; -} - -static void -ClearKeyInfo(KeyInfo * key) -{ - key->defs.defined &= ~_GK_Default; - strcpy(key->name, "default"); - key->gap = 0; - key->shape = None; - key->color = None; - return; -} - -static void -FreeKeys(KeyInfo * key, RowInfo * row, GeometryInfo * info) -{ - KeyInfo *tmp; - KeyInfo *next; - - if (row->keys == key) - { - row->nKeys = 0; - row->keys = NULL; - } - for (tmp = key; tmp != NULL; tmp = next) - { - ClearKeyInfo(tmp); - next = (KeyInfo *) tmp->defs.next; - free(tmp); - } - return; -} - -static void -InitRowInfo(RowInfo * row, SectionInfo * section, GeometryInfo * info) -{ - if (row != §ion->dfltRow) - { - *row = section->dfltRow; - row->defs.defined &= ~_GR_Default; - } - else - { - bzero(row, sizeof(RowInfo *)); - row->defs.defined = _GR_Default; - row->defs.fileID = info->fileID; - row->defs.merge = info->merge; - row->defs.next = NULL; - row->section = section; - row->nKeys = 0; - row->keys = NULL; - InitKeyInfo(&row->dfltKey, row, info); - } - return; -} - -static void -ClearRowInfo(RowInfo * row, GeometryInfo * info) -{ - row->defs.defined &= ~_GR_Default; - row->top = row->left = 0; - row->vertical = False; - row->nKeys = 0; - if (row->keys) - FreeKeys(row->keys, row, info); - ClearKeyInfo(&row->dfltKey); - row->dfltKey.defs.defined |= _GK_Default; - return; -} - -static void -FreeRows(RowInfo * row, SectionInfo * section, GeometryInfo * info) -{ - RowInfo *next; - RowInfo *tmp; - - if (row == section->rows) - { - section->nRows = 0; - section->rows = NULL; - } - for (tmp = row; tmp != NULL; tmp = next) - { - ClearRowInfo(tmp, info); - next = (RowInfo *) tmp->defs.next; - free(tmp); - } - return; -} - -static DoodadInfo * -FindDoodadByType(DoodadInfo * di, unsigned type) -{ - while (di) - { - if (di->type == type) - return di; - di = (DoodadInfo *) di->defs.next; - } - return NULL; -} - -static DoodadInfo * -FindDoodadByName(DoodadInfo * di, uint32_t name) -{ - while (di) - { - if (di->name == name) - return di; - di = (DoodadInfo *) di->defs.next; - } - return NULL; -} - -static void -InitDoodadInfo(DoodadInfo * di, unsigned type, SectionInfo * si, - GeometryInfo * info) -{ - DoodadInfo *dflt; - - dflt = NULL; - if (si && si->dfltDoodads) - dflt = FindDoodadByType(si->dfltDoodads, type); - if ((dflt == NULL) && (info->dfltDoodads)) - dflt = FindDoodadByType(info->dfltDoodads, type); - if (dflt != NULL) - { - *di = *dflt; - di->defs.next = NULL; - } - else - { - bzero(di, sizeof(DoodadInfo)); - di->defs.fileID = info->fileID; - di->type = type; - } - di->section = si; - if (si != NULL) - { - di->priority = si->nextDoodadPriority++; -#if XkbGeomMaxPriority < 255 - if (si->nextDoodadPriority > XkbGeomMaxPriority) - si->nextDoodadPriority = XkbGeomMaxPriority; -#endif - } - else - { - di->priority = info->nextPriority++; - if (info->nextPriority > XkbGeomMaxPriority) - info->nextPriority = XkbGeomMaxPriority; - } - return; -} - -static void -ClearDoodadInfo(DoodadInfo * di) -{ - CommonInfo defs; - - defs = di->defs; - bzero(di, sizeof(DoodadInfo)); - di->defs = defs; - di->defs.defined = 0; - return; -} - -static void -ClearOverlayInfo(OverlayInfo * ol) -{ - if (ol && ol->keys) - { - ol->keys = (OverlayKeyInfo *) ClearCommonInfo(&ol->keys->defs); - ol->nKeys = 0; - } - return; -} - -static void -FreeDoodads(DoodadInfo * di, SectionInfo * si, GeometryInfo * info) -{ - DoodadInfo *tmp; - DoodadInfo *next; - - if (si) - { - if (si->doodads == di) - { - si->doodads = NULL; - si->nDoodads = 0; - } - if (si->dfltDoodads == di) - si->dfltDoodads = NULL; - } - if (info->doodads == di) - { - info->doodads = NULL; - info->nDoodads = 0; - } - if (info->dfltDoodads == di) - info->dfltDoodads = NULL; - for (tmp = di; tmp != NULL; tmp = next) - { - next = (DoodadInfo *) tmp->defs.next; - ClearDoodadInfo(tmp); - free(tmp); - } - return; -} - -static void -InitSectionInfo(SectionInfo * si, GeometryInfo * info) -{ - if (si != &info->dfltSection) - { - *si = info->dfltSection; - si->defs.defined &= ~_GS_Default; - si->name = xkb_intern_atom("unknown"); - si->priority = info->nextPriority++; - if (info->nextPriority > XkbGeomMaxPriority) - info->nextPriority = XkbGeomMaxPriority; - } - else - { - bzero(si, sizeof(SectionInfo)); - si->defs.fileID = info->fileID; - si->defs.merge = info->merge; - si->defs.next = NULL; - si->geometry = info; - si->name = xkb_intern_atom("default"); - InitRowInfo(&si->dfltRow, si, info); - } - return; -} - -static void -DupSectionInfo(SectionInfo * into, SectionInfo * from, GeometryInfo * info) -{ - CommonInfo defs; - - defs = into->defs; - *into = *from; - into->defs.fileID = defs.fileID; - into->defs.merge = defs.merge; - into->defs.next = NULL; - into->dfltRow.defs.fileID = defs.fileID; - into->dfltRow.defs.merge = defs.merge; - into->dfltRow.defs.next = NULL; - into->dfltRow.section = into; - into->dfltRow.dfltKey.defs.fileID = defs.fileID; - into->dfltRow.dfltKey.defs.merge = defs.merge; - into->dfltRow.dfltKey.defs.next = NULL; - into->dfltRow.dfltKey.row = &into->dfltRow; - return; -} - -static void -ClearSectionInfo(SectionInfo * si, GeometryInfo * info) -{ - - si->defs.defined &= ~_GS_Default; - si->name = xkb_intern_atom("default"); - si->top = si->left = 0; - si->width = si->height = 0; - si->angle = 0; - if (si->rows) - { - FreeRows(si->rows, si, info); - si->rows = NULL; - } - ClearRowInfo(&si->dfltRow, info); - if (si->doodads) - { - FreeDoodads(si->doodads, si, info); - si->doodads = NULL; - } - si->dfltRow.defs.defined = _GR_Default; - return; -} - -static void -FreeSections(SectionInfo * si, GeometryInfo * info) -{ - SectionInfo *tmp; - SectionInfo *next; - - if (si == info->sections) - { - info->nSections = 0; - info->sections = NULL; - } - for (tmp = si; tmp != NULL; tmp = next) - { - ClearSectionInfo(tmp, info); - next = (SectionInfo *) tmp->defs.next; - free(tmp); - } - return; -} - -static void -FreeShapes(ShapeInfo * si, GeometryInfo * info) -{ - ShapeInfo *tmp; - ShapeInfo *next; - - if (si == info->shapes) - { - info->nShapes = 0; - info->shapes = NULL; - } - for (tmp = si; tmp != NULL; tmp = next) - { - if (tmp->outlines) - { - register int i; - for (i = 0; i < tmp->nOutlines; i++) - { - if (tmp->outlines[i].points != NULL) - { - free(tmp->outlines[i].points); - tmp->outlines[i].num_points = 0; - tmp->outlines[i].points = NULL; - } - } - free(tmp->outlines); - tmp->szOutlines = 0; - tmp->nOutlines = 0; - tmp->outlines = NULL; - tmp->primary = tmp->approx = NULL; - } - next = (ShapeInfo *) tmp->defs.next; - free(tmp); - } - return; -} - -/***====================================================================***/ - -static void -InitGeometryInfo(GeometryInfo * info, unsigned fileID, unsigned merge) -{ - bzero(info, sizeof(GeometryInfo)); - info->fileID = fileID; - info->merge = merge; - InitSectionInfo(&info->dfltSection, info); - info->dfltSection.defs.defined = _GS_Default; - return; -} - -static void -ClearGeometryInfo(GeometryInfo * info) -{ - if (info->name) - free(info->name); - info->name = NULL; - if (info->props) - FreeProperties(info->props, info); - if (info->shapes) - FreeShapes(info->shapes, info); - if (info->sections) - FreeSections(info->sections, info); - info->widthMM = 0; - info->heightMM = 0; - info->dfltCornerRadius = 0; - ClearSectionInfo(&info->dfltSection, info); - info->dfltSection.defs.defined = _GS_Default; - if (info->aliases) - ClearAliases(&info->aliases); - return; -} - -/***====================================================================***/ - -static PropertyInfo * -NextProperty(GeometryInfo * info) -{ - PropertyInfo *pi; - - pi = uTypedAlloc(PropertyInfo); - if (pi) - { - bzero((char *) pi, sizeof(PropertyInfo)); - info->props = (PropertyInfo *) AddCommonInfo(&info->props->defs, - (CommonInfo *) pi); - info->nProps++; - } - return pi; -} - -static PropertyInfo * -FindProperty(GeometryInfo * info, char *name) -{ - PropertyInfo *old; - - if (!name) - return NULL; - for (old = info->props; old != NULL; - old = (PropertyInfo *) old->defs.next) - { - if ((old->name) && (uStringEqual(name, old->name))) - return old; - } - return NULL; -} - -static Bool -AddProperty(GeometryInfo * info, PropertyInfo * new) -{ - PropertyInfo *old; - - if ((!new) || (!new->value) || (!new->name)) - return False; - old = FindProperty(info, new->name); - if (old != NULL) - { - if ((new->defs.merge == MergeReplace) - || (new->defs.merge == MergeOverride)) - { - if (((old->defs.fileID == new->defs.fileID) - && (warningLevel > 0)) || (warningLevel > 9)) - { - WARN("Multiple definitions for the \"%s\" property\n", - new->name); - ACTION("Ignoring \"%s\", using \"%s\"\n", old->value, - new->value); - } - if (old->value) - free(old->value); - old->value = _XkbDupString(new->value); - return True; - } - if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0)) - || (warningLevel > 9)) - { - WARN("Multiple definitions for \"%s\" property\n", new->name); - ACTION("Using \"%s\", ignoring \"%s\" \n", old->value, - new->value); - } - return True; - } - old = new; - if ((new = NextProperty(info)) == NULL) - return False; - new->defs.next = NULL; - new->name = _XkbDupString(old->name); - new->value = _XkbDupString(old->value); - return True; -} - -/***====================================================================***/ - -static ShapeInfo * -NextShape(GeometryInfo * info) -{ - ShapeInfo *si; - - si = uTypedAlloc(ShapeInfo); - if (si) - { - bzero((char *) si, sizeof(ShapeInfo)); - info->shapes = (ShapeInfo *) AddCommonInfo(&info->shapes->defs, - (CommonInfo *) si); - info->nShapes++; - si->dfltCornerRadius = info->dfltCornerRadius; - } - return si; -} - -static ShapeInfo * -FindShape(GeometryInfo * info, uint32_t name, const char *type, const char *which) -{ - ShapeInfo *old; - - for (old = info->shapes; old != NULL; old = (ShapeInfo *) old->defs.next) - { - if (name == old->name) - return old; - } - if (type != NULL) - { - old = info->shapes; - WARN("Unknown shape \"%s\" for %s %s\n", - XkbcAtomText(name), type, which); - if (old) - { - ACTION("Using default shape %s instead\n", shText(old)); - return old; - } - ACTION("No default shape; definition ignored\n"); - return NULL; - } - return NULL; -} - -static Bool -AddShape(GeometryInfo * info, ShapeInfo * new) -{ - ShapeInfo *old; - - old = FindShape(info, new->name, NULL, NULL); - if (old != NULL) - { - if ((new->defs.merge == MergeReplace) - || (new->defs.merge == MergeOverride)) - { - ShapeInfo *next = (ShapeInfo *) old->defs.next; - if (((old->defs.fileID == new->defs.fileID) - && (warningLevel > 0)) || (warningLevel > 9)) - { - WARN("Duplicate shape name \"%s\"\n", shText(old)); - ACTION("Using last definition\n"); - } - *old = *new; - old->defs.next = &next->defs; - return True; - } - if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0)) - || (warningLevel > 9)) - { - WARN("Multiple shapes named \"%s\"\n", shText(old)); - ACTION("Using first definition\n"); - } - return True; - } - old = new; - if ((new = NextShape(info)) == NULL) - return False; - *new = *old; - new->defs.next = NULL; - old->szOutlines = old->nOutlines = 0; - old->outlines = NULL; - old->approx = NULL; - old->primary = NULL; - return True; -} - -/***====================================================================***/ - -static void -ReplaceDoodad(DoodadInfo * into, DoodadInfo * from) -{ - CommonInfo *next; - - next = into->defs.next; - ClearDoodadInfo(into); - *into = *from; - into->defs.next = next; - next = from->defs.next; - ClearDoodadInfo(from); - from->defs.next = next; - return; -} - -static DoodadInfo * -NextDfltDoodad(SectionInfo * si, GeometryInfo * info) -{ - DoodadInfo *di; - - di = uTypedCalloc(1, DoodadInfo); - if (!di) - return NULL; - if (si) - { - si->dfltDoodads = - (DoodadInfo *) AddCommonInfo(&si->dfltDoodads->defs, - (CommonInfo *) di); - } - else - { - info->dfltDoodads = - (DoodadInfo *) AddCommonInfo(&info->dfltDoodads->defs, - (CommonInfo *) di); - } - return di; -} - -static DoodadInfo * -NextDoodad(SectionInfo * si, GeometryInfo * info) -{ - DoodadInfo *di; - - di = uTypedCalloc(1, DoodadInfo); - if (di) - { - if (si) - { - si->doodads = (DoodadInfo *) AddCommonInfo(&si->doodads->defs, - (CommonInfo *) di); - si->nDoodads++; - } - else - { - info->doodads = - (DoodadInfo *) AddCommonInfo(&info->doodads->defs, - (CommonInfo *) di); - info->nDoodads++; - } - } - return di; -} - -static Bool -AddDoodad(SectionInfo * si, GeometryInfo * info, DoodadInfo * new) -{ - DoodadInfo *old; - - old = FindDoodadByName((si ? si->doodads : info->doodads), new->name); - if (old != NULL) - { - if ((new->defs.merge == MergeReplace) - || (new->defs.merge == MergeOverride)) - { - if (((old->defs.fileID == new->defs.fileID) - && (warningLevel > 0)) || (warningLevel > 9)) - { - WARN("Multiple doodads named \"%s\"\n", - XkbcAtomText(old->name)); - ACTION("Using last definition\n"); - } - ReplaceDoodad(old, new); - old->section = si; - return True; - } - if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0)) - || (warningLevel > 9)) - { - WARN("Multiple doodads named \"%s\"\n", - XkbcAtomText(old->name)); - ACTION("Using first definition\n"); - } - return True; - } - old = new; - if ((new = NextDoodad(si, info)) == NULL) - return False; - ReplaceDoodad(new, old); - new->section = si; - new->defs.next = NULL; - return True; -} - -static DoodadInfo * -FindDfltDoodadByTypeName(char *name, SectionInfo * si, GeometryInfo * info) -{ - DoodadInfo *dflt = NULL; - unsigned type; - - if (uStrCaseCmp(name, "outline") == 0) - type = XkbOutlineDoodad; - else if (uStrCaseCmp(name, "solid") == 0) - type = XkbSolidDoodad; - else if (uStrCaseCmp(name, "text") == 0) - type = XkbTextDoodad; - else if (uStrCaseCmp(name, "indicator") == 0) - type = XkbIndicatorDoodad; - else if (uStrCaseCmp(name, "logo") == 0) - type = XkbLogoDoodad; - else - return NULL; - if ((si) && (si->dfltDoodads)) - dflt = FindDoodadByType(si->dfltDoodads, type); - if ((!dflt) && (info->dfltDoodads)) - dflt = FindDoodadByType(info->dfltDoodads, type); - if (dflt == NULL) - { - dflt = NextDfltDoodad(si, info); - if (dflt != NULL) - { - dflt->name = None; - dflt->type = type; - } - } - return dflt; -} - -/***====================================================================***/ - -static Bool -AddOverlay(SectionInfo * si, GeometryInfo * info, OverlayInfo * new) -{ - OverlayInfo *old; - - for (old = si->overlays; old != NULL; - old = (OverlayInfo *) old->defs.next) - { - if (old->name == new->name) - break; - } - if (old != NULL) - { - if ((new->defs.merge == MergeReplace) - || (new->defs.merge == MergeOverride)) - { - if (((old->defs.fileID == new->defs.fileID) - && (warningLevel > 0)) || (warningLevel > 9)) - { - WARN - ("Multiple overlays named \"%s\" for section \"%s\"\n", - XkbcAtomText(old->name), XkbcAtomText(si->name)); - ACTION("Using last definition\n"); - } - ClearOverlayInfo(old); - old->nKeys = new->nKeys; - old->keys = new->keys; - new->nKeys = 0; - new->keys = NULL; - return True; - } - if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0)) - || (warningLevel > 9)) - { - WARN("Multiple doodads named \"%s\" in section \"%s\"\n", - XkbcAtomText(old->name), XkbcAtomText(si->name)); - ACTION("Using first definition\n"); - } - return True; - } - old = new; - new = uTypedCalloc(1, OverlayInfo); - if (!new) - { - if (warningLevel > 0) - { - WSGO("Couldn't allocate a new OverlayInfo\n"); - ACTION - ("Overlay \"%s\" in section \"%s\" will be incomplete\n", - XkbcAtomText(old->name), XkbcAtomText(si->name)); - } - return False; - } - *new = *old; - old->nKeys = 0; - old->keys = NULL; - si->overlays = (OverlayInfo *) AddCommonInfo(&si->overlays->defs, - (CommonInfo *) new); - si->nOverlays++; - return True; -} - -/***====================================================================***/ - -static SectionInfo * -NextSection(GeometryInfo * info) -{ - SectionInfo *si; - - si = uTypedAlloc(SectionInfo); - if (si) - { - *si = info->dfltSection; - si->defs.defined &= ~_GS_Default; - si->defs.next = NULL; - si->nRows = 0; - si->rows = NULL; - info->sections = - (SectionInfo *) AddCommonInfo(&info->sections->defs, - (CommonInfo *) si); - info->nSections++; - } - return si; -} - -static SectionInfo * -FindMatchingSection(GeometryInfo * info, SectionInfo * new) -{ - SectionInfo *old; - - for (old = info->sections; old != NULL; - old = (SectionInfo *) old->defs.next) - { - if (new->name == old->name) - return old; - } - return NULL; -} - -static Bool -AddSection(GeometryInfo * info, SectionInfo * new) -{ - SectionInfo *old; - - old = FindMatchingSection(info, new); - if (old != NULL) - { -#ifdef NOTDEF - if ((new->defs.merge == MergeReplace) - || (new->defs.merge == MergeOverride)) - { - SectionInfo *next = (SectionInfo *) old->defs.next; - if (((old->defs.fileID == new->defs.fileID) - && (warningLevel > 0)) || (warningLevel > 9)) - { - WARN("Duplicate shape name \"%s\"\n", shText(old)); - ACTION("Using last definition\n"); - } - *old = *new; - old->defs.next = &next->defs; - return True; - } - if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0)) - || (warningLevel > 9)) - { - WARN("Multiple shapes named \"%s\"\n", shText(old)); - ACTION("Using first definition\n"); - } - return True; -#else - WARN("Don't know how to merge sections yet\n"); -#endif - } - old = new; - if ((new = NextSection(info)) == NULL) - return False; - *new = *old; - new->defs.next = NULL; - old->nRows = old->nDoodads = old->nOverlays = 0; - old->rows = NULL; - old->doodads = NULL; - old->overlays = NULL; - if (new->doodads) - { - DoodadInfo *di; - for (di = new->doodads; di; di = (DoodadInfo *) di->defs.next) - { - di->section = new; - } - } - return True; -} - -/***====================================================================***/ - -static RowInfo * -NextRow(SectionInfo * si) -{ - RowInfo *row; - - row = uTypedAlloc(RowInfo); - if (row) - { - *row = si->dfltRow; - row->defs.defined &= ~_GR_Default; - row->defs.next = NULL; - row->nKeys = 0; - row->keys = NULL; - si->rows = - (RowInfo *) AddCommonInfo(&si->rows->defs, (CommonInfo *) row); - row->index = si->nRows++; - } - return row; -} - -static Bool -AddRow(SectionInfo * si, RowInfo * new) -{ - RowInfo *old; - - old = new; - if ((new = NextRow(si)) == NULL) - return False; - *new = *old; - new->defs.next = NULL; - old->nKeys = 0; - old->keys = NULL; - return True; -} - -/***====================================================================***/ - -static KeyInfo * -NextKey(RowInfo * row) -{ - KeyInfo *key; - - key = uTypedAlloc(KeyInfo); - if (key) - { - *key = row->dfltKey; - key->defs.defined &= ~_GK_Default; - key->defs.next = NULL; - key->index = row->nKeys++; - } - return key; -} - -static Bool -AddKey(RowInfo * row, KeyInfo * new) -{ - KeyInfo *old; - - old = new; - if ((new = NextKey(row)) == NULL) - return False; - *new = *old; - new->defs.next = NULL; - row->keys = - (KeyInfo *) AddCommonInfo(&row->keys->defs, (CommonInfo *) new); - return True; -} - -/***====================================================================***/ - -static void -MergeIncludedGeometry(GeometryInfo * into, GeometryInfo * from, - unsigned merge) -{ - Bool clobber; - - if (from->errorCount > 0) - { - into->errorCount += from->errorCount; - return; - } - clobber = (merge == MergeOverride) || (merge == MergeReplace); - if (into->name == NULL) - { - into->name = from->name; - from->name = NULL; - } - if ((into->widthMM == 0) || ((from->widthMM != 0) && clobber)) - into->widthMM = from->widthMM; - if ((into->heightMM == 0) || ((from->heightMM != 0) && clobber)) - into->heightMM = from->heightMM; - if ((into->font == None) || ((from->font != None) && clobber)) - into->font = from->font; - if ((into->fontSlant == None) || ((from->fontSlant != None) && clobber)) - into->fontSlant = from->fontSlant; - if ((into->fontWeight == None) || ((from->fontWeight != None) && clobber)) - into->fontWeight = from->fontWeight; - if ((into->fontSetWidth == None) - || ((from->fontSetWidth != None) && clobber)) - into->fontSetWidth = from->fontSetWidth; - if ((into->fontVariant == None) - || ((from->fontVariant != None) && clobber)) - into->fontVariant = from->fontVariant; - if ((into->fontSize == 0) || ((from->fontSize != 0) && clobber)) - into->fontSize = from->fontSize; - if ((into->fontEncoding == None) - || ((from->fontEncoding != None) && clobber)) - into->fontEncoding = from->fontEncoding; - if ((into->fontSpec == None) || ((from->fontSpec != None) && clobber)) - into->fontSpec = from->fontSpec; - if ((into->baseColor == None) || ((from->baseColor != None) && clobber)) - into->baseColor = from->baseColor; - if ((into->labelColor == None) || ((from->labelColor != None) && clobber)) - into->labelColor = from->labelColor; - into->nextPriority = from->nextPriority; - if (from->props != NULL) - { - PropertyInfo *pi; - for (pi = from->props; pi; pi = (PropertyInfo *) pi->defs.next) - { - if (!AddProperty(into, pi)) - into->errorCount++; - } - } - if (from->shapes != NULL) - { - ShapeInfo *si; - - for (si = from->shapes; si; si = (ShapeInfo *) si->defs.next) - { - if (!AddShape(into, si)) - into->errorCount++; - } - } - if (from->sections != NULL) - { - SectionInfo *si; - - for (si = from->sections; si; si = (SectionInfo *) si->defs.next) - { - if (!AddSection(into, si)) - into->errorCount++; - } - } - if (from->doodads != NULL) - { - DoodadInfo *di; - - for (di = from->doodads; di; di = (DoodadInfo *) di->defs.next) - { - if (!AddDoodad(NULL, into, di)) - into->errorCount++; - } - } - if (!MergeAliases(&into->aliases, &from->aliases, merge)) - into->errorCount++; - return; -} - -typedef void (*FileHandler) (XkbFile * /* file */ , - struct xkb_desc * /* xkb */ , - unsigned /* merge */ , - GeometryInfo * /* info */ - ); - -static Bool -HandleIncludeGeometry(IncludeStmt * stmt, struct xkb_desc * xkb, GeometryInfo * info, - FileHandler hndlr) -{ - unsigned newMerge; - XkbFile *rtrn; - GeometryInfo included; - Bool haveSelf; - - haveSelf = False; - if ((stmt->file == NULL) && (stmt->map == NULL)) - { - haveSelf = True; - included = *info; - bzero(info, sizeof(GeometryInfo)); - } - else if (ProcessIncludeFile(stmt, XkmGeometryIndex, &rtrn, &newMerge)) - { - InitGeometryInfo(&included, rtrn->id, newMerge); - included.nextPriority = info->nextPriority; - included.dfltCornerRadius = info->dfltCornerRadius; - DupSectionInfo(&included.dfltSection, &info->dfltSection, info); - (*hndlr) (rtrn, xkb, MergeOverride, &included); - if (stmt->stmt != NULL) - { - if (included.name != NULL) - free(included.name); - included.name = stmt->stmt; - stmt->stmt = NULL; - } - } - else - { - info->errorCount += 10; - return False; - } - if ((stmt->next != NULL) && (included.errorCount < 1)) - { - IncludeStmt *next; - unsigned op; - GeometryInfo next_incl; - - for (next = stmt->next; next != NULL; next = next->next) - { - if ((next->file == NULL) && (next->map == NULL)) - { - haveSelf = True; - MergeIncludedGeometry(&included, info, next->merge); - ClearGeometryInfo(info); - } - else if (ProcessIncludeFile(next, XkmGeometryIndex, &rtrn, &op)) - { - InitGeometryInfo(&next_incl, rtrn->id, op); - next_incl.nextPriority = included.nextPriority; - next_incl.dfltCornerRadius = included.dfltCornerRadius; - DupSectionInfo(&next_incl.dfltSection, - &included.dfltSection, &included); - (*hndlr) (rtrn, xkb, MergeOverride, &next_incl); - MergeIncludedGeometry(&included, &next_incl, op); - ClearGeometryInfo(&next_incl); - } - else - { - info->errorCount += 10; - return False; - } - } - } - if (haveSelf) - *info = included; - else - { - MergeIncludedGeometry(info, &included, newMerge); - ClearGeometryInfo(&included); - } - return (info->errorCount == 0); -} - -static int -SetShapeField(ShapeInfo * si, - const char *field, - ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info) -{ - ExprResult tmp; - - if ((uStrCaseCmp(field, "radius") == 0) - || (uStrCaseCmp(field, "corner") == 0) - || (uStrCaseCmp(field, "cornerradius") == 0)) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("key shape", field, shText(si)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("key shape", field, shText(si), "number"); - } - if (si) - si->dfltCornerRadius = tmp.ival; - else - info->dfltCornerRadius = tmp.ival; - return True; - } - info->errorCount++; - return ReportBadField("key shape", field, shText(si)); -} - -static int -SetShapeDoodadField(DoodadInfo * di, - char *field, - ExprDef * arrayNdx, - ExprDef * value, SectionInfo * si, GeometryInfo * info) -{ - ExprResult tmp; - const char *typeName; - - typeName = - (di->type == XkbSolidDoodad ? "solid doodad" : "outline doodad"); - if ((!uStrCaseCmp(field, "corner")) - || (!uStrCaseCmp(field, "cornerradius"))) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray(typeName, field, ddText(di)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType(typeName, field, ddText(di), "number"); - } - di->defs.defined |= _GD_Corner; - di->corner = tmp.ival; - return True; - } - else if (uStrCaseCmp(field, "angle") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray(typeName, field, ddText(di)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType(typeName, field, ddText(di), "number"); - } - di->defs.defined |= _GD_Angle; - di->angle = tmp.ival; - return True; - } - else if (uStrCaseCmp(field, "shape") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray(typeName, field, ddText(di)); - } - if (!ExprResolveString(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType(typeName, field, ddText(di), "string"); - } - di->shape = xkb_intern_atom(tmp.str); - di->defs.defined |= _GD_Shape; - return True; - } - return ReportBadField(typeName, field, ddText(di)); -} - -#define FIELD_STRING 0 -#define FIELD_SHORT 1 -#define FIELD_USHORT 2 - -static int -SetTextDoodadField(DoodadInfo * di, - char *field, - ExprDef * arrayNdx, - ExprDef * value, SectionInfo * si, GeometryInfo * info) -{ - ExprResult tmp; - unsigned def; - unsigned type; - char *typeName = "text doodad"; - union - { - uint32_t *str; - short *ival; - unsigned short *uval; - } pField; - - if (uStrCaseCmp(field, "angle") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray(typeName, field, ddText(di)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType(typeName, field, ddText(di), "number"); - } - di->defs.defined |= _GD_Angle; - di->angle = tmp.ival; - return True; - } - if (uStrCaseCmp(field, "width") == 0) - { - type = FIELD_USHORT; - pField.uval = &di->width; - def = _GD_Width; - } - else if (uStrCaseCmp(field, "height") == 0) - { - type = FIELD_USHORT; - pField.uval = &di->height; - def = _GD_Height; - } - else if (uStrCaseCmp(field, "text") == 0) - { - type = FIELD_STRING; - pField.str = &di->text; - def = _GD_Text; - } - else if (uStrCaseCmp(field, "font") == 0) - { - type = FIELD_STRING; - pField.str = &di->font; - def = _GD_Font; - } - else if ((uStrCaseCmp(field, "fontslant") == 0) || - (uStrCaseCmp(field, "slant") == 0)) - { - type = FIELD_STRING; - pField.str = &di->fontSlant; - def = _GD_FontSlant; - } - else if ((uStrCaseCmp(field, "fontweight") == 0) || - (uStrCaseCmp(field, "weight") == 0)) - { - type = FIELD_STRING; - pField.str = &di->fontWeight; - def = _GD_FontWeight; - } - else if ((uStrCaseCmp(field, "fontwidth") == 0) || - (uStrCaseCmp(field, "setwidth") == 0)) - { - type = FIELD_STRING; - pField.str = &di->fontSetWidth; - def = _GD_FontSetWidth; - } - else if ((uStrCaseCmp(field, "fontvariant") == 0) || - (uStrCaseCmp(field, "variant") == 0)) - { - type = FIELD_STRING; - pField.str = &di->fontVariant; - def = _GD_FontVariant; - } - else if ((uStrCaseCmp(field, "fontencoding") == 0) || - (uStrCaseCmp(field, "encoding") == 0)) - { - type = FIELD_STRING; - pField.str = &di->fontEncoding; - def = _GD_FontEncoding; - } - else if ((uStrCaseCmp(field, "xfont") == 0) || - (uStrCaseCmp(field, "xfontname") == 0)) - { - type = FIELD_STRING; - pField.str = &di->fontSpec; - def = _GD_FontSpec; - } - else if (uStrCaseCmp(field, "fontsize") == 0) - { - type = FIELD_USHORT; - pField.uval = &di->fontSize; - def = _GD_FontSize; - } - else - { - return ReportBadField(typeName, field, ddText(di)); - } - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray(typeName, field, ddText(di)); - } - if (type == FIELD_STRING) - { - if (!ExprResolveString(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType(typeName, field, ddText(di), "string"); - } - di->defs.defined |= def; - *pField.str = xkb_intern_atom(tmp.str); - } - else - { - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType(typeName, field, ddText(di), "number"); - } - if ((type == FIELD_USHORT) && (tmp.ival < 0)) - { - info->errorCount++; - return - ReportBadType(typeName, field, ddText(di), "unsigned"); - } - di->defs.defined |= def; - if (type == FIELD_USHORT) - *pField.uval = tmp.uval; - else - *pField.ival = tmp.ival; - } - return True; -} - -static int -SetIndicatorDoodadField(DoodadInfo * di, - char *field, - ExprDef * arrayNdx, - ExprDef * value, - SectionInfo * si, GeometryInfo * info) -{ - ExprResult tmp; - - if ((uStrCaseCmp(field, "oncolor") == 0) - || (uStrCaseCmp(field, "offcolor") == 0) - || (uStrCaseCmp(field, "shape") == 0)) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("indicator doodad", field, ddText(di)); - } - if (!ExprResolveString(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("indicator doodad", field, - ddText(di), "string"); - } - if (uStrCaseCmp(field, "oncolor") == 0) - { - di->defs.defined |= _GD_Color; - di->color = xkb_intern_atom(tmp.str); - } - else if (uStrCaseCmp(field, "offcolor") == 0) - { - di->defs.defined |= _GD_OffColor; - di->offColor = xkb_intern_atom(tmp.str); - } - else if (uStrCaseCmp(field, "shape") == 0) - { - di->defs.defined |= _GD_Shape; - di->shape = xkb_intern_atom(tmp.str); - } - return True; - } - return ReportBadField("indicator doodad", field, ddText(di)); -} - -static int -SetLogoDoodadField(DoodadInfo * di, - char *field, - ExprDef * arrayNdx, - ExprDef * value, SectionInfo * si, GeometryInfo * info) -{ - ExprResult tmp; - char *typeName = "logo doodad"; - - if ((!uStrCaseCmp(field, "corner")) - || (!uStrCaseCmp(field, "cornerradius"))) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray(typeName, field, ddText(di)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType(typeName, field, ddText(di), "number"); - } - di->defs.defined |= _GD_Corner; - di->corner = tmp.ival; - return True; - } - else if (uStrCaseCmp(field, "angle") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray(typeName, field, ddText(di)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType(typeName, field, ddText(di), "number"); - } - di->defs.defined |= _GD_Angle; - di->angle = tmp.ival; - return True; - } - else if (uStrCaseCmp(field, "shape") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray(typeName, field, ddText(di)); - } - if (!ExprResolveString(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType(typeName, field, ddText(di), "string"); - } - di->shape = xkb_intern_atom(tmp.str); - di->defs.defined |= _GD_Shape; - return True; - } - else if ((!uStrCaseCmp(field, "logoname")) - || (!uStrCaseCmp(field, "name"))) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray(typeName, field, ddText(di)); - } - if (!ExprResolveString(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType(typeName, field, ddText(di), - "string"); - } - di->logoName = _XkbDupString(tmp.str); - return True; - } - return ReportBadField(typeName, field, ddText(di)); -} - -static int -SetDoodadField(DoodadInfo * di, - char *field, - ExprDef * arrayNdx, - ExprDef * value, SectionInfo * si, GeometryInfo * info) -{ - ExprResult tmp; - - if (uStrCaseCmp(field, "priority") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("doodad", field, ddText(di)); - } - if (!ExprResolveInteger(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("doodad", field, ddText(di), "integer"); - } - if ((tmp.ival < 0) || (tmp.ival > XkbGeomMaxPriority)) - { - info->errorCount++; - ERROR("Doodad priority %d out of range (must be 0..%d)\n", - tmp.ival, XkbGeomMaxPriority); - ACTION("Priority for doodad %s not changed", ddText(di)); - return False; - } - di->defs.defined |= _GD_Priority; - di->priority = tmp.ival; - return True; - } - else if (uStrCaseCmp(field, "left") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("doodad", field, ddText(di)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("doodad", field, ddText(di), "number"); - } - di->defs.defined |= _GD_Left; - di->left = tmp.ival; - return True; - } - else if (uStrCaseCmp(field, "top") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("doodad", field, ddText(di)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("doodad", field, ddText(di), "number"); - } - di->defs.defined |= _GD_Top; - di->top = tmp.ival; - return True; - } - else if (uStrCaseCmp(field, "color") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("doodad", field, ddText(di)); - } - if (!ExprResolveString(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("doodad", field, ddText(di), "string"); - } - di->defs.defined |= _GD_Color; - di->color = xkb_intern_atom(tmp.str); - free(tmp.str); - return True; - } - switch (di->type) - { - case XkbOutlineDoodad: - case XkbSolidDoodad: - return SetShapeDoodadField(di, field, arrayNdx, value, si, info); - case XkbTextDoodad: - return SetTextDoodadField(di, field, arrayNdx, value, si, info); - case XkbIndicatorDoodad: - return SetIndicatorDoodadField(di, field, arrayNdx, value, si, info); - case XkbLogoDoodad: - return SetLogoDoodadField(di, field, arrayNdx, value, si, info); - } - WSGO("Unknown doodad type %d in SetDoodadField\n", - (unsigned int) di->type); - ACTION("Definition of %s in %s ignored\n", field, ddText(di)); - return False; -} - -static int -SetSectionField(SectionInfo * si, - char *field, - ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info) -{ - unsigned short *pField; - unsigned def; - ExprResult tmp; - - pField = NULL; - def = 0; - if (uStrCaseCmp(field, "priority") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("keyboard section", field, scText(si)); - } - if (!ExprResolveInteger(value, &tmp, NULL, NULL)) - { - info->errorCount++; - ReportBadType("keyboard section", field, scText(si), "integer"); - return False; - } - if ((tmp.ival < 0) || (tmp.ival > XkbGeomMaxPriority)) - { - info->errorCount++; - ERROR("Section priority %d out of range (must be 0..%d)\n", - tmp.ival, XkbGeomMaxPriority); - ACTION("Priority for section %s not changed", scText(si)); - return False; - } - si->priority = tmp.ival; - si->defs.defined |= _GS_Priority; - return True; - } - else if (uStrCaseCmp(field, "top") == 0) - { - pField = &si->top; - def = _GS_Top; - } - else if (uStrCaseCmp(field, "left") == 0) - { - pField = &si->left; - def = _GS_Left; - } - else if (uStrCaseCmp(field, "width") == 0) - { - pField = &si->width; - def = _GS_Width; - } - else if (uStrCaseCmp(field, "height") == 0) - { - pField = &si->height; - def = _GS_Height; - } - else if (uStrCaseCmp(field, "angle") == 0) - { - pField = &si->angle; - def = _GS_Angle; - } - else - { - info->errorCount++; - return ReportBadField("keyboard section", field, scText(si)); - } - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("keyboard section", field, scText(si)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - ReportBadType("keyboard section", field, scText(si), "number"); - return False; - } - si->defs.defined |= def; - *pField = tmp.uval; - return True; -} - -static int -SetRowField(RowInfo * row, - char *field, - ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info) -{ - ExprResult tmp; - - if (uStrCaseCmp(field, "top") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("keyboard row", field, rowText(row)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("keyboard row", field, rowText(row), - "number"); - } - row->defs.defined |= _GR_Top; - row->top = tmp.uval; - } - else if (uStrCaseCmp(field, "left") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("keyboard row", field, rowText(row)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("keyboard row", field, rowText(row), - "number"); - } - row->defs.defined |= _GR_Left; - row->left = tmp.uval; - } - else if (uStrCaseCmp(field, "vertical") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("keyboard row", field, rowText(row)); - } - if (!ExprResolveBoolean(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("keyboard row", field, rowText(row), - "boolean"); - } - row->defs.defined |= _GR_Vertical; - row->vertical = tmp.uval; - } - else - { - info->errorCount++; - return ReportBadField("keyboard row", field, rowText(row)); - } - return True; -} - -static int -SetKeyField(KeyInfo * key, - const char *field, - ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info) -{ - ExprResult tmp; - - if (uStrCaseCmp(field, "gap") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("key", field, keyText(key)); - } - if (!ExprResolveFloat(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("key", field, keyText(key), "number"); - } - key->defs.defined |= _GK_Gap; - key->gap = tmp.ival; - } - else if (uStrCaseCmp(field, "shape") == 0) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("key", field, keyText(key)); - } - if (!ExprResolveString(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("key", field, keyText(key), "string"); - } - key->defs.defined |= _GK_Shape; - key->shape = xkb_intern_atom(tmp.str); - free(tmp.str); - } - else if ((uStrCaseCmp(field, "color") == 0) || - (uStrCaseCmp(field, "keycolor") == 0)) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("key", field, keyText(key)); - } - if (!ExprResolveString(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("key", field, keyText(key), "string"); - } - key->defs.defined |= _GK_Color; - key->color = xkb_intern_atom(tmp.str); - free(tmp.str); - } - else if ((uStrCaseCmp(field, "name") == 0) - || (uStrCaseCmp(field, "keyname") == 0)) - { - if (arrayNdx != NULL) - { - info->errorCount++; - return ReportNotArray("key", field, keyText(key)); - } - if (!ExprResolveKeyName(value, &tmp, NULL, NULL)) - { - info->errorCount++; - return ReportBadType("key", field, keyText(key), "key name"); - } - key->defs.defined |= _GK_Name; - bzero(key->name, XkbKeyNameLength + 1); - strncpy(key->name, tmp.keyName.name, XkbKeyNameLength); - } - else - { - info->errorCount++; - return ReportBadField("key", field, keyText(key)); - } - return True; -} - -static int -SetGeometryProperty(GeometryInfo * info, char *property, ExprDef * value) -{ - PropertyInfo pi; - ExprResult result; - int ret; - - InitPropertyInfo(&pi, info); - pi.name = property; - if (!ExprResolveString(value, &result, NULL, NULL)) - { - info->errorCount++; - ERROR("Property values must be type string\n"); - ACTION("Ignoring illegal definition of \"%s\" property\n", property); - return False; - } - pi.value = result.str; - ret = AddProperty(info, &pi); - free(pi.value); - return ret; -} - -static int -HandleGeometryVar(VarDef * stmt, struct xkb_desc * xkb, GeometryInfo * info) -{ - ExprResult elem, field, tmp; - ExprDef *ndx; - DoodadInfo *di; - uint32_t *pField = NULL; - int ret; - - if (ExprResolveLhs(stmt->name, &elem, &field, &ndx) == 0) - return 0; /* internal error, already reported */ - - if (elem.str) { - if (uStrCaseCmp(elem.str, "shape") == 0) - ret = SetShapeField(NULL, field.str, ndx, stmt->value, info); - else if (uStrCaseCmp(elem.str, "key") == 0) - ret = SetKeyField(&info->dfltSection.dfltRow.dfltKey, - field.str, ndx, stmt->value, info); - else if (uStrCaseCmp(elem.str, "row") == 0) - ret = SetRowField(&info->dfltSection.dfltRow, field.str, ndx, - stmt->value, info); - else if (uStrCaseCmp(elem.str, "section") == 0) - ret = SetSectionField(&info->dfltSection, field.str, ndx, - stmt->value, info); - else if (uStrCaseCmp(elem.str, "property") == 0) - { - if (ndx != NULL) - { - info->errorCount++; - ERROR("The %s geometry property is not an array\n", field.str); - ACTION("Ignoring illegal property definition\n"); - ret = False; - } - else { - ret = SetGeometryProperty(info, field.str, stmt->value); - } - } - else if ((di = FindDfltDoodadByTypeName(elem.str, NULL, info)) != NULL) - ret = SetDoodadField(di, field.str, ndx, stmt->value, NULL, info); - else if (uStrCaseCmp(elem.str, "solid") == 0) - { - DoodadInfo *dflt; - dflt = FindDoodadByType(info->dfltDoodads, XkbSolidDoodad); - if (dflt == NULL) - dflt = NextDfltDoodad(NULL, info); - ret = SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info); - } - else if (uStrCaseCmp(elem.str, "outline") == 0) - { - DoodadInfo *dflt; - dflt = FindDoodadByType(info->dfltDoodads, XkbOutlineDoodad); - if (dflt == NULL) - dflt = NextDfltDoodad(NULL, info); - ret = SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info); - } - else if (uStrCaseCmp(elem.str, "text") == 0) - { - DoodadInfo *dflt; - dflt = FindDoodadByType(info->dfltDoodads, XkbTextDoodad); - if (dflt == NULL) - dflt = NextDfltDoodad(NULL, info); - ret = SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info); - } - else if (uStrCaseCmp(elem.str, "indicator") == 0) - { - DoodadInfo *dflt; - dflt = FindDoodadByType(info->dfltDoodads, XkbIndicatorDoodad); - if (dflt == NULL) - dflt = NextDfltDoodad(NULL, info); - ret = SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info); - } - else if (uStrCaseCmp(elem.str, "logo") == 0) - { - DoodadInfo *dflt; - dflt = FindDoodadByType(info->dfltDoodads, XkbLogoDoodad); - if (dflt == NULL) - dflt = NextDfltDoodad(NULL, info); - ret = SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info); - } - else - { - WARN("Assignment to field of unknown element\n"); - ACTION("No value assigned to %s.%s\n", elem.str, field.str); - ret = False; - } - free(elem.str); - free(field.str); - return ret; - } - - if ((uStrCaseCmp(field.str, "width") == 0) || - (uStrCaseCmp(field.str, "widthmm") == 0)) - { - if (ndx != NULL) - { - info->errorCount++; - ret = ReportNotArray("keyboard", field.str, "geometry"); - } - else if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL)) - { - info->errorCount++; - ret = ReportBadType("keyboard", field.str, "geometry", "number"); - } - else if (tmp.ival < 1) - { - WARN("Keyboard width must be positive\n"); - ACTION("Ignoring illegal keyboard width %s\n", - XkbcGeomFPText(tmp.ival)); - ret = True; - } - else { - if (info->widthMM != 0) - { - WARN("Keyboard width multiply defined\n"); - ACTION("Using last definition (%s),", XkbcGeomFPText(tmp.ival)); - INFO(" ignoring first (%s)\n", XkbcGeomFPText(info->widthMM)); - } - info->widthMM = tmp.ival; - ret = True; - } - free(field.str); - return ret; - } - else if ((uStrCaseCmp(field.str, "height") == 0) || - (uStrCaseCmp(field.str, "heightmm") == 0)) - { - if (ndx != NULL) - { - info->errorCount++; - ret = ReportNotArray("keyboard", field.str, "geometry"); - } - if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL)) - { - info->errorCount++; - ret = ReportBadType("keyboard", field.str, "geometry", "number"); - } - if (tmp.ival < 1) - { - WARN("Keyboard height must be positive\n"); - ACTION("Ignoring illegal keyboard height %s\n", - XkbcGeomFPText(tmp.ival)); - ret = True; - } - else { - if (info->heightMM != 0) - { - WARN("Keyboard height multiply defined\n"); - ACTION("Using last definition (%s),", XkbcGeomFPText(tmp.ival)); - INFO(" ignoring first (%s)\n", XkbcGeomFPText(info->heightMM)); - } - info->heightMM = tmp.ival; - ret = True; - } - free(field.str); - return ret; - } - else if (uStrCaseCmp(field.str, "fontsize") == 0) - { - if (ndx != NULL) - { - info->errorCount++; - ret = ReportNotArray("keyboard", field.str, "geometry"); - } - else if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL)) - { - info->errorCount++; - ret = ReportBadType("keyboard", field.str, "geometry", "number"); - } - else if ((tmp.ival < 40) || (tmp.ival > 2550)) - { - info->errorCount++; - ERROR("Illegal font size %d (must be 4..255)\n", tmp.ival); - ACTION("Ignoring font size in keyboard geometry\n"); - ret = False; - } - else { - info->fontSize = tmp.ival; - ret = True; - } - free(field.str); - return ret; - } - else if ((uStrCaseCmp(field.str, "color") == 0) || - (uStrCaseCmp(field.str, "basecolor") == 0)) - { - if (ndx != NULL) - { - info->errorCount++; - ret = ReportNotArray("keyboard", field.str, "geometry"); - } - if (!ExprResolveString(stmt->value, &tmp, NULL, NULL)) - { - info->errorCount++; - ret = ReportBadType("keyboard", field.str, "geometry", "string"); - } - else { - info->baseColor = xkb_intern_atom(tmp.str); - free(tmp.str); - ret = True; - } - free(field.str); - return ret; - } - else if (uStrCaseCmp(field.str, "labelcolor") == 0) - { - if (ndx != NULL) - { - info->errorCount++; - ret = ReportNotArray("keyboard", field.str, "geometry"); - } - if (!ExprResolveString(stmt->value, &tmp, NULL, NULL)) - { - info->errorCount++; - ret = ReportBadType("keyboard", field.str, "geometry", "string"); - } - else { - info->labelColor = xkb_intern_atom(tmp.str); - free(tmp.str); - ret = True; - } - free(field.str); - return ret; - } - else if (uStrCaseCmp(field.str, "font") == 0) - { - pField = &info->font; - } - else if ((uStrCaseCmp(field.str, "fontslant") == 0) || - (uStrCaseCmp(field.str, "slant") == 0)) - { - pField = &info->fontSlant; - } - else if ((uStrCaseCmp(field.str, "fontweight") == 0) || - (uStrCaseCmp(field.str, "weight") == 0)) - { - pField = &info->fontWeight; - } - else if ((uStrCaseCmp(field.str, "fontwidth") == 0) || - (uStrCaseCmp(field.str, "setwidth") == 0)) - { - pField = &info->fontWeight; - } - else if ((uStrCaseCmp(field.str, "fontencoding") == 0) || - (uStrCaseCmp(field.str, "encoding") == 0)) - { - pField = &info->fontEncoding; - } - else if ((uStrCaseCmp(field.str, "xfont") == 0) || - (uStrCaseCmp(field.str, "xfontname") == 0)) - { - pField = &info->fontSpec; - } - else - { - ret = SetGeometryProperty(info, field.str, stmt->value); - free(field.str); - return ret; - } - - /* fallthrough for the cases that set pField */ - if (ndx != NULL) - { - info->errorCount++; - ret = ReportNotArray("keyboard", field.str, "geometry"); - } - else if (!ExprResolveString(stmt->value, &tmp, NULL, NULL)) - { - info->errorCount++; - ret = ReportBadType("keyboard", field.str, "geometry", "string"); - } - else { - *pField = xkb_intern_atom(tmp.str); - free(tmp.str); - } - free(field.str); - return ret; -} - -/***====================================================================***/ - -static Bool -HandleShapeBody(ShapeDef * def, ShapeInfo * si, unsigned merge, - GeometryInfo * info) -{ - OutlineDef *ol; - int nOut, nPt; - struct xkb_outline * outline; - ExprDef *pt; - - if (def->nOutlines < 1) - { - WARN("Shape \"%s\" has no outlines\n", shText(si)); - ACTION("Definition ignored\n"); - return True; - } - si->nOutlines = def->nOutlines; - si->outlines = uTypedCalloc(def->nOutlines, struct xkb_outline); - if (!si->outlines) - { - ERROR("Couldn't allocate outlines for \"%s\"\n", shText(si)); - ACTION("Definition ignored\n"); - info->errorCount++; - return False; - } - for (nOut = 0, ol = def->outlines; ol != NULL; - ol = (OutlineDef *) ol->common.next) - { - if (ol->nPoints < 1) - { - SetShapeField(si, XkbcAtomText(ol->field), NULL, ol->points, info); - continue; - } - outline = NULL; - outline = &si->outlines[nOut++]; - outline->num_points = ol->nPoints; - outline->corner_radius = si->dfltCornerRadius; - outline->points = uTypedCalloc(ol->nPoints, struct xkb_point); - if (!outline->points) - { - ERROR("Can't allocate points for \"%s\"\n", shText(si)); - ACTION("Definition ignored\n"); - /* XXX leaks */ - info->errorCount++; - return False; - } - for (nPt = 0, pt = ol->points; pt != NULL; - pt = (ExprDef *) pt->common.next) - { - outline->points[nPt].x = pt->value.coord.x; - outline->points[nPt].y = pt->value.coord.y; - nPt++; - } - if (ol->field != None) - { - const char *str = XkbcAtomText(ol->field); - if ((uStrCaseCmp(str, "approximation") == 0) || - (uStrCaseCmp(str, "approx") == 0)) - { - if (si->approx == NULL) - si->approx = outline; - else - { - WARN("Multiple approximations for \"%s\"\n", - shText(si)); - ACTION("Treating all but the first as normal outlines\n"); - } - } - else if (uStrCaseCmp(str, "primary") == 0) - { - if (si->primary == NULL) - si->primary = outline; - else - { - WARN("Multiple primary outlines for \"%s\"\n", - shText(si)); - ACTION("Treating all but the first as normal outlines\n"); - } - } - else - { - WARN("Unknown outline type %s for \"%s\"\n", str, - shText(si)); - ACTION("Treated as a normal outline\n"); - } - } - } - if (nOut != si->nOutlines) - { - WSGO("Expected %d outlines, got %d\n", - (unsigned int) si->nOutlines, nOut); - si->nOutlines = nOut; - } - return True; -} - -static int -HandleShapeDef(ShapeDef * def, struct xkb_desc * xkb, unsigned merge, - GeometryInfo * info) -{ - ShapeInfo si; - - if (def->merge != MergeDefault) - merge = def->merge; - - bzero(&si, sizeof(ShapeInfo)); - si.defs.merge = merge; - si.name = def->name; - si.dfltCornerRadius = info->dfltCornerRadius; - if (!HandleShapeBody(def, &si, merge, info)) - return False; - if (!AddShape(info, &si)) - return False; - return True; -} - -/***====================================================================***/ - -static int -HandleDoodadDef(DoodadDef * def, - unsigned merge, SectionInfo * si, GeometryInfo * info) -{ - ExprResult elem, field; - ExprDef *ndx; - DoodadInfo new; - VarDef *var; - - if (def->common.stmtType == StmtIndicatorMapDef) - { - def->common.stmtType = StmtDoodadDef; - def->type = XkbIndicatorDoodad; - } - InitDoodadInfo(&new, def->type, si, info); - new.name = def->name; - for (var = def->body; var != NULL; var = (VarDef *) var->common.next) - { - if (ExprResolveLhs(var->name, &elem, &field, &ndx) == 0) - return 0; /* internal error, already reported */ - if (elem.str != NULL) - { - WARN("Assignment to field of unknown element in doodad %s\n", - ddText(&new)); - ACTION("No value assigned to %s.%s\n", elem.str, field.str); - free(elem.str); - } - else if (!SetDoodadField(&new, field.str, ndx, var->value, si, info)) { - free(field.str); - return False; - } - free(field.str); - } - if (!AddDoodad(si, info, &new)) - return False; - ClearDoodadInfo(&new); - return True; -} - -/***====================================================================***/ - -static int -HandleOverlayDef(OverlayDef * def, - unsigned merge, SectionInfo * si, GeometryInfo * info) -{ - OverlayKeyDef *keyDef; - OverlayKeyInfo *key; - OverlayInfo ol; - - if ((def->nKeys < 1) && (warningLevel > 3)) - { - WARN("Overlay \"%s\" in section \"%s\" has no keys\n", - XkbcAtomText(def->name), scText(si)); - ACTION("Overlay ignored\n"); - return True; - } - bzero(&ol, sizeof(OverlayInfo)); - ol.name = def->name; - for (keyDef = def->keys; keyDef; - keyDef = (OverlayKeyDef *) keyDef->common.next) - { - key = uTypedCalloc(1, OverlayKeyInfo); - if ((!key) && warningLevel > 0) - { - WSGO("Couldn't allocate OverlayKeyInfo\n"); - ACTION("Overlay %s for section %s will be incomplete\n", - XkbcAtomText(ol.name), scText(si)); - return False; - } - strncpy(key->over, keyDef->over, XkbKeyNameLength); - strncpy(key->under, keyDef->under, XkbKeyNameLength); - key->sectionRow = _GOK_UnknownRow; - key->overlayRow = _GOK_UnknownRow; - ol.keys = (OverlayKeyInfo *) AddCommonInfo(&ol.keys->defs, - (CommonInfo *) key); - ol.nKeys++; - } - if (!AddOverlay(si, info, &ol)) - return False; - ClearOverlayInfo(&ol); - return True; -} - -/***====================================================================***/ - -static Bool -HandleComplexKey(KeyDef * def, KeyInfo * key, GeometryInfo * info) -{ - RowInfo *row; - ExprDef *expr; - - row = key->row; - for (expr = def->expr; expr != NULL; expr = (ExprDef *) expr->common.next) - { - if (expr->op == OpAssign) - { - ExprResult elem, f; - ExprDef *ndx; - if (ExprResolveLhs(expr->value.binary.left, &elem, &f, &ndx) == 0) - return False; /* internal error, already reported */ - if ((elem.str == NULL) || (uStrCaseCmp(elem.str, "key") == 0)) - { - if (!SetKeyField - (key, f.str, ndx, expr->value.binary.right, info)) - return False; - } - else - { - ERROR("Illegal element used in a key definition\n"); - ACTION("Assignment to %s.%s ignored\n", elem.str, f.str); - return False; - } - } - else - { - switch (expr->type) - { - case TypeInt: - case TypeFloat: - if (!SetKeyField(key, "gap", NULL, expr, info)) - return False; - break; - case TypeString: - if (!SetKeyField(key, "shape", NULL, expr, info)) - return False; - break; - case TypeKeyName: - if (!SetKeyField(key, "name", NULL, expr, info)) - return False; - break; - default: - ERROR("Cannot determine field for unnamed expression\n"); - ACTION("Ignoring key %d in row %d of section %s\n", - row->nKeys + 1, row->section->nRows + 1, - rowText(row)); - return False; - } - } - } - return True; -} - -static Bool -HandleRowBody(RowDef * def, RowInfo * row, unsigned merge, - GeometryInfo * info) -{ - KeyDef *keyDef; - - if ((def->nKeys < 1) && (warningLevel > 3)) - { - ERROR("Row in section %s has no keys\n", rowText(row)); - ACTION("Section ignored\n"); - return True; - } - for (keyDef = def->keys; keyDef != NULL; - keyDef = (KeyDef *) keyDef->common.next) - { - if (keyDef->common.stmtType == StmtVarDef) - { - VarDef *var = (VarDef *) keyDef; - ExprResult elem, field; - ExprDef *ndx; - if (ExprResolveLhs(var->name, &elem, &field, &ndx) == 0) - return 0; /* internal error, already reported */ - if ((elem.str == NULL) || (uStrCaseCmp(elem.str, "row") == 0)) - { - if (!SetRowField(row, field.str, ndx, var->value, info)) - return False; - } - else if (uStrCaseCmp(elem.str, "key") == 0) - { - if (!SetKeyField - (&row->dfltKey, field.str, ndx, var->value, info)) - return False; - } - else - { - WARN("Assignment to field of unknown element in row\n"); - ACTION("No value assigned to %s.%s\n", elem.str, field.str); - } - } - else if (keyDef->common.stmtType == StmtKeyDef) - { - KeyInfo key; - InitKeyInfo(&key, row, info); - if (keyDef->name != NULL) - { - int len = strlen(keyDef->name); - if ((len < 1) || (len > XkbKeyNameLength)) - { - ERROR("Illegal name %s for key in section %s\n", - keyDef->name, rowText(row)); - ACTION("Section not compiled\n"); - return False; - } - bzero(key.name, XkbKeyNameLength + 1); - strncpy(key.name, keyDef->name, XkbKeyNameLength); - key.defs.defined |= _GK_Name; - } - else if (!HandleComplexKey(keyDef, &key, info)) - return False; - if (!AddKey(row, &key)) - return False; - } - else - { - WSGO("Unexpected statement (type %d) in row body\n", - keyDef->common.stmtType); - return False; - } - } - return True; -} - -static Bool -HandleSectionBody(SectionDef * def, - SectionInfo * si, unsigned merge, GeometryInfo * info) -{ - RowDef *rowDef; - DoodadInfo *di; - - for (rowDef = def->rows; rowDef != NULL; - rowDef = (RowDef *) rowDef->common.next) - { - if (rowDef->common.stmtType == StmtVarDef) - { - VarDef *var = (VarDef *) rowDef; - ExprResult elem, field; - ExprDef *ndx; - if (ExprResolveLhs(var->name, &elem, &field, &ndx) == 0) - return 0; /* internal error, already reported */ - if ((elem.str == NULL) || (uStrCaseCmp(elem.str, "section") == 0)) - { - if (!SetSectionField(si, field.str, ndx, var->value, info)) - { - free(field.str); - return False; - } - } - else if (uStrCaseCmp(elem.str, "row") == 0) - { - if (!SetRowField - (&si->dfltRow, field.str, ndx, var->value, info)) - { - free(field.str); - return False; - } - } - else if (uStrCaseCmp(elem.str, "key") == 0) - { - if (!SetKeyField(&si->dfltRow.dfltKey, field.str, ndx, - var->value, info)) - { - free(field.str); - return False; - } - } - else if ((di = - FindDfltDoodadByTypeName(elem.str, si, info)) != NULL) - { - if (!SetDoodadField(di, field.str, ndx, var->value, si, info)) - { - free(field.str); - return False; - } - } - else - { - WARN("Assignment to field of unknown element in section\n"); - ACTION("No value assigned to %s.%s\n", elem.str, field.str); - } - free(field.str); - free(elem.str); - } - else if (rowDef->common.stmtType == StmtRowDef) - { - RowInfo row; - InitRowInfo(&row, si, info); - if (!HandleRowBody(rowDef, &row, merge, info)) - return False; - if (!AddRow(si, &row)) - return False; -/* ClearRowInfo(&row,info);*/ - } - else if ((rowDef->common.stmtType == StmtDoodadDef) || - (rowDef->common.stmtType == StmtIndicatorMapDef)) - { - if (!HandleDoodadDef((DoodadDef *) rowDef, merge, si, info)) - return False; - } - else if (rowDef->common.stmtType == StmtOverlayDef) - { - if (!HandleOverlayDef((OverlayDef *) rowDef, merge, si, info)) - return False; - } - else - { - WSGO("Unexpected statement (type %d) in section body\n", - rowDef->common.stmtType); - return False; - } - } - if (si->nRows != def->nRows) - { - WSGO("Expected %d rows, found %d\n", (unsigned int) def->nRows, - (unsigned int) si->nRows); - ACTION("Definition of section %s might be incorrect\n", scText(si)); - } - return True; -} - -static int -HandleSectionDef(SectionDef * def, - struct xkb_desc * xkb, unsigned merge, GeometryInfo * info) -{ - SectionInfo si; - - if (def->merge != MergeDefault) - merge = def->merge; - InitSectionInfo(&si, info); - si.defs.merge = merge; - si.name = def->name; - if (!HandleSectionBody(def, &si, merge, info)) - return False; - if (!AddSection(info, &si)) - return False; - return True; -} - -/***====================================================================***/ - -static void -HandleGeometryFile(XkbFile * file, - struct xkb_desc * xkb, unsigned merge, GeometryInfo * info) -{ - ParseCommon *stmt; - char *failWhat; - - if (merge == MergeDefault) - merge = MergeAugment; - info->name = _XkbDupString(file->name); - stmt = file->defs; - while (stmt) - { - failWhat = NULL; - switch (stmt->stmtType) - { - case StmtInclude: - if (!HandleIncludeGeometry((IncludeStmt *) stmt, xkb, info, - HandleGeometryFile)) - info->errorCount++; - break; - case StmtKeyAliasDef: - if (!HandleAliasDef((KeyAliasDef *) stmt, - merge, info->fileID, &info->aliases)) - { - info->errorCount++; - } - break; - case StmtVarDef: - if (!HandleGeometryVar((VarDef *) stmt, xkb, info)) - info->errorCount++; - break; - case StmtShapeDef: - if (!HandleShapeDef((ShapeDef *) stmt, xkb, merge, info)) - info->errorCount++; - break; - case StmtSectionDef: - if (!HandleSectionDef((SectionDef *) stmt, xkb, merge, info)) - info->errorCount++; - break; - case StmtIndicatorMapDef: - case StmtDoodadDef: - if (!HandleDoodadDef((DoodadDef *) stmt, merge, NULL, info)) - info->errorCount++; - break; - case StmtVModDef: - if (!failWhat) - failWhat = "virtual modfier"; - case StmtInterpDef: - if (!failWhat) - failWhat = "symbol interpretation"; - case StmtGroupCompatDef: - if (!failWhat) - failWhat = "group compatibility map"; - case StmtKeycodeDef: - if (!failWhat) - failWhat = "key name"; - ERROR("Interpretation files may not include other types\n"); - ACTION("Ignoring %s definition.\n", failWhat); - info->errorCount++; - break; - default: - WSGO("Unexpected statement type %d in HandleGeometryFile\n", - stmt->stmtType); - break; - } - stmt = stmt->next; - if (info->errorCount > 10) - { -#ifdef NOISY - ERROR("Too many errors\n"); -#endif - ACTION("Abandoning geometry file \"%s\"\n", file->topName); - break; - } - } - return; -} - -/***====================================================================***/ - -static Bool -CopyShapeDef(struct xkb_geometry * geom, ShapeInfo * si) -{ - register int i, n; - struct xkb_shape * shape; - struct xkb_outline *old_outline, *outline; - uint32_t name; - - si->index = geom->num_shapes; - name = si->name; - shape = XkbcAddGeomShape(geom, name, si->nOutlines); - if (!shape) - { - WSGO("Couldn't allocate shape in geometry\n"); - ACTION("Shape %s not compiled\n", shText(si)); - return False; - } - old_outline = si->outlines; - for (i = 0; i < si->nOutlines; i++, old_outline++) - { - outline = XkbcAddGeomOutline(shape, old_outline->num_points); - if (!outline) - { - WSGO("Couldn't allocate outline in shape\n"); - ACTION("Shape %s is incomplete\n", shText(si)); - return False; - } - n = old_outline->num_points; - memcpy(outline->points, old_outline->points, n * sizeof(struct xkb_point)); - outline->num_points = old_outline->num_points; - outline->corner_radius = old_outline->corner_radius; - } - if (si->approx) - { - n = (si->approx - si->outlines); - shape->approx = &shape->outlines[n]; - } - if (si->primary) - { - n = (si->primary - si->outlines); - shape->primary = &shape->outlines[n]; - } - XkbcComputeShapeBounds(shape); - return True; -} - -static Bool -VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info) -{ - if ((di->defs.defined & (_GD_Top | _GD_Left)) != (_GD_Top | _GD_Left)) - { - if (warningLevel < 9) - { - ERROR("No position defined for doodad %s\n", - ddText(di)); - ACTION("Illegal doodad ignored\n"); - return False; - } - } - if ((di->defs.defined & _GD_Priority) == 0) - { - /* calculate priority -- should be just above previous doodad/row */ - } - switch (di->type) - { - case XkbOutlineDoodad: - case XkbSolidDoodad: - if ((di->defs.defined & _GD_Shape) == 0) - { - ERROR("No shape defined for %s doodad %s\n", - (di->type == XkbOutlineDoodad ? "outline" : "filled"), - ddText(di)); - ACTION("Incomplete definition ignored\n"); - return False; - } - else - { - ShapeInfo *si; - si = FindShape(info, di->shape, - (di->type == - XkbOutlineDoodad ? "outline doodad" : - "solid doodad"), ddText(di)); - if (si) - di->shape = si->name; - else - { - ERROR("No legal shape for %s\n", ddText(di)); - ACTION("Incomplete definition ignored\n"); - return False; - } - } - if ((di->defs.defined & _GD_Color) == 0) - { - if (warningLevel > 5) - { - WARN("No color for doodad %s\n", ddText(di)); - ACTION("Using black\n"); - } - di->color = xkb_intern_atom("black"); - } - break; - case XkbTextDoodad: - if ((di->defs.defined & _GD_Text) == 0) - { - ERROR("No text specified for text doodad %s\n", ddText(di)); - ACTION("Illegal doodad definition ignored\n"); - return False; - } - if ((di->defs.defined & _GD_Angle) == 0) - di->angle = 0; - if ((di->defs.defined & _GD_Color) == 0) - { - if (warningLevel > 5) - { - WARN("No color specified for doodad %s\n", ddText(di)); - ACTION("Using black\n"); - } - di->color = xkb_intern_atom("black"); - } - if ((di->defs.defined & _GD_FontSpec) != 0) - { - if ((di->defs.defined & _GD_FontParts) == 0) - return True; - if (warningLevel < 9) - { - WARN - ("Text doodad %s has full and partial font definition\n", - ddText(di)); - ACTION("Full specification ignored\n"); - } - di->defs.defined &= ~_GD_FontSpec; - di->fontSpec = None; - } - if ((di->defs.defined & _GD_Font) == 0) - { - if (warningLevel > 5) - { - WARN("No font specified for doodad %s\n", ddText(di)); - ACTION("Using \"%s\"\n", DFLT_FONT); - } - di->font = xkb_intern_atom(DFLT_FONT); - } - if ((di->defs.defined & _GD_FontSlant) == 0) - { - if (warningLevel > 7) - { - WARN("No font slant for text doodad %s\n", ddText(di)); - ACTION("Using \"%s\"\n", DFLT_SLANT); - } - di->fontSlant = xkb_intern_atom(DFLT_SLANT); - } - if ((di->defs.defined & _GD_FontWeight) == 0) - { - if (warningLevel > 7) - { - WARN("No font weight for text doodad %s\n", ddText(di)); - ACTION("Using \"%s\"\n", DFLT_WEIGHT); - } - di->fontWeight = xkb_intern_atom(DFLT_WEIGHT); - } - if ((di->defs.defined & _GD_FontSetWidth) == 0) - { - if (warningLevel > 9) - { - WARN("No font set width for text doodad %s\n", ddText(di)); - ACTION("Using \"%s\"\n", DFLT_SET_WIDTH); - } - di->fontSetWidth = xkb_intern_atom(DFLT_SET_WIDTH); - } - if ((di->defs.defined & _GD_FontVariant) == 0) - { - if (warningLevel > 9) - { - WARN("No font variant for text doodad %s\n", ddText(di)); - ACTION("Using \"%s\"\n", DFLT_VARIANT); - } - di->fontVariant = xkb_intern_atom(DFLT_VARIANT); - } - if ((di->defs.defined & _GD_FontEncoding) == 0) - { - if (warningLevel > 7) - { - WARN("No font encoding for doodad %s\n", ddText(di)); - ACTION("Using \"%s\"\n", DFLT_ENCODING); - } - di->fontEncoding = xkb_intern_atom(DFLT_ENCODING); - } - if ((di->defs.defined & _GD_FontSize) == 0) - { - if (warningLevel > 7) - { - WARN("No font size for text doodad %s\n", ddText(di)); - ACTION("Using %s point text\n", XkbcGeomFPText(DFLT_SIZE)); - } - di->fontSize = DFLT_SIZE; - } - if ((di->defs.defined & _GD_Height) == 0) - { - unsigned size, nLines; - const char *tmp; - size = (di->fontSize * 120) / 100; - size = (size * 254) / 720; /* convert to mm/10 */ - for (nLines = 1, tmp = XkbcAtomText(di->text); *tmp; tmp++) - { - if (*tmp == '\n') - nLines++; - } - size *= nLines; - if (warningLevel > 5) - { - WARN("No height for text doodad %s\n", ddText(di)); - ACTION("Using calculated height %s millimeters\n", - XkbcGeomFPText(size)); - } - di->height = size; - } - if ((di->defs.defined & _GD_Width) == 0) - { - unsigned width, tmp; - const char *str; - width = tmp = 0; - for (str = XkbcAtomText(di->text); *str; str++) - { - if (*str != '\n') - tmp++; - else - { - if (tmp > width) - width = tmp; - tmp = 1; - } - } - if (width == 0) - width = tmp; - width *= (di->height * 2) / 3; - if (warningLevel > 5) - { - WARN("No width for text doodad %s\n", ddText(di)); - ACTION("Using calculated width %s millimeters\n", - XkbcGeomFPText(width)); - } - di->width = width; - } - break; - case XkbIndicatorDoodad: - if ((di->defs.defined & _GD_Shape) == 0) - { - ERROR("No shape defined for indicator doodad %s\n", ddText(di)); - ACTION("Incomplete definition ignored\n"); - return False; - } - else - { - ShapeInfo *si; - si = FindShape(info, di->shape, "indicator doodad", ddText(di)); - if (si) - di->shape = si->name; - else - { - ERROR("No legal shape for doodad %s\n", ddText(di)); - ACTION("Incomplete definition ignored\n"); - return False; - } - } - if ((di->defs.defined & _GD_Color) == 0) - { - if (warningLevel > 5) - { - WARN("No \"on\" color for indicator doodad %s\n", - ddText(di)); - ACTION("Using green\n"); - } - di->color = xkb_intern_atom("green"); - } - if ((di->defs.defined & _GD_OffColor) == 0) - { - if (warningLevel > 5) - { - WARN("No \"off\" color for indicator doodad %s\n", - ddText(di)); - ACTION("Using black\n"); - } - di->offColor = xkb_intern_atom("black"); - } - break; - case XkbLogoDoodad: - if (di->logoName == NULL) - { - ERROR("No logo name defined for logo doodad %s\n", ddText(di)); - ACTION("Incomplete definition ignored\n"); - return False; - } - if ((di->defs.defined & _GD_Shape) == 0) - { - ERROR("No shape defined for logo doodad %s\n", ddText(di)); - ACTION("Incomplete definition ignored\n"); - return False; - } - else - { - ShapeInfo *si; - si = FindShape(info, di->shape, "logo doodad", - ddText(di)); - if (si) - di->shape = si->name; - else - { - ERROR("No legal shape for %s\n", ddText(di)); - ACTION("Incomplete definition ignored\n"); - return False; - } - } - if ((di->defs.defined & _GD_Color) == 0) - { - if (warningLevel > 5) - { - WARN("No color for doodad %s\n", ddText(di)); - ACTION("Using black\n"); - } - di->color = xkb_intern_atom("black"); - } - break; - default: - WSGO("Uknown doodad type %d in VerifyDoodad\n", - (unsigned int) di->type); - return False; - } - return True; -} - -#define FONT_TEMPLATE "-*-%s-%s-%s-%s-%s-*-%d-*-*-*-*-%s" - -static char * -FontFromParts(uint32_t fontTok, - uint32_t weightTok, - uint32_t slantTok, - uint32_t setWidthTok, uint32_t varTok, int size, uint32_t encodingTok) -{ - int totalSize; - const char *font, *weight, *slant, *setWidth, *variant, *encoding; - char *rtrn; - - font = (fontTok != None ? XkbcAtomText(fontTok) : DFLT_FONT); - weight = (weightTok != None ? XkbcAtomText(weightTok) : DFLT_WEIGHT); - slant = (slantTok != None ? XkbcAtomText(slantTok) : DFLT_SLANT); - setWidth = - (setWidthTok != None ? XkbcAtomText(setWidthTok) : DFLT_SET_WIDTH); - variant = (varTok != None ? XkbcAtomText(varTok) : DFLT_VARIANT); - encoding = - (encodingTok != None ? XkbcAtomText(encodingTok) : DFLT_ENCODING); - if (size == 0) - size = DFLT_SIZE; - totalSize = - strlen(FONT_TEMPLATE) + strlen(font) + strlen(weight) + strlen(slant); - totalSize += strlen(setWidth) + strlen(variant) + strlen(encoding); - rtrn = calloc(totalSize, 1); - if (rtrn) - sprintf(rtrn, FONT_TEMPLATE, font, weight, slant, setWidth, variant, - size, encoding); - return rtrn; -} - -static Bool -CopyDoodadDef(struct xkb_geometry * geom, - struct xkb_section * section, DoodadInfo * di, GeometryInfo * info) -{ - uint32_t name; - union xkb_doodad * doodad; - struct xkb_color * color; - struct xkb_shape * shape; - ShapeInfo *si; - - if (!VerifyDoodadInfo(di, info)) - return False; - name = di->name; - doodad = XkbcAddGeomDoodad(geom, section, name); - if (!doodad) - { - WSGO("Couldn't allocate doodad in %s\n", - (section ? "section" : "geometry")); - ACTION("Cannot copy doodad %s\n", ddText(di)); - return False; - } - doodad->any.type = di->type; - doodad->any.priority = di->priority; - doodad->any.top = di->top; - doodad->any.left = di->left; - switch (di->type) - { - case XkbOutlineDoodad: - case XkbSolidDoodad: - si = FindShape(info, di->shape, NULL, NULL); - if (!si) - return False; - doodad->shape.angle = di->angle; - color = XkbcAddGeomColor(geom, XkbcAtomText(di->color), - geom->num_colors); - shape = &geom->shapes[si->index]; - XkbSetShapeDoodadColor(geom, &doodad->shape, color); - XkbSetShapeDoodadShape(geom, &doodad->shape, shape); - break; - case XkbTextDoodad: - doodad->text.angle = di->angle; - doodad->text.width = di->width; - doodad->text.height = di->height; - if (di->fontSpec == None) - doodad->text.font = FontFromParts(di->font, di->fontWeight, - di->fontSlant, - di->fontSetWidth, - di->fontVariant, di->fontSize, - di->fontEncoding); - else - doodad->text.font = XkbcAtomGetString(di->fontSpec); - doodad->text.text = XkbcAtomGetString(di->text); - color = XkbcAddGeomColor(geom, XkbcAtomText(di->color), - geom->num_colors); - XkbSetTextDoodadColor(geom, &doodad->text, color); - break; - case XkbIndicatorDoodad: - si = FindShape(info, di->shape, NULL, NULL); - if (!si) - return False; - shape = &geom->shapes[si->index]; - color = XkbcAddGeomColor(geom, XkbcAtomText(di->color), - geom->num_colors); - XkbSetIndicatorDoodadShape(geom, &doodad->indicator, shape); - XkbSetIndicatorDoodadOnColor(geom, &doodad->indicator, color); - color = XkbcAddGeomColor(geom, XkbcAtomText(di->offColor), - geom->num_colors); - XkbSetIndicatorDoodadOffColor(geom, &doodad->indicator, color); - break; - case XkbLogoDoodad: - si = FindShape(info, di->shape, NULL, NULL); - if (!si) - return False; - doodad->logo.angle = di->angle; - color = XkbcAddGeomColor(geom, XkbcAtomText(di->color), - geom->num_colors); - shape = &geom->shapes[si->index]; - XkbSetLogoDoodadColor(geom, &doodad->logo, color); - XkbSetLogoDoodadShape(geom, &doodad->logo, shape); - doodad->logo.logo_name = di->logoName; - di->logoName = NULL; - break; - } - return True; -} - -/***====================================================================***/ - -static Bool -VerifyOverlayInfo(struct xkb_geometry * geom, - struct xkb_section * section, - OverlayInfo * oi, - GeometryInfo * info, short rowMap[256], short rowSize[256]) -{ - register OverlayKeyInfo *ki, *next; - unsigned long oKey, uKey, sKey; - struct xkb_row * row; - struct xkb_key * key; - int r, k; - - /* find out which row each key is in */ - for (ki = oi->keys; ki != NULL; ki = (OverlayKeyInfo *) ki->defs.next) - { - oKey = KeyNameToLong(ki->over); - uKey = KeyNameToLong(ki->under); - for (r = 0, row = section->rows; (r < section->num_rows) && oKey; - r++, row++) - { - for (k = 0, key = row->keys; (k < row->num_keys) && oKey; - k++, key++) - { - sKey = KeyNameToLong(key->name.name); - if (sKey == oKey) - { - if (warningLevel > 0) - { - WARN - ("Key %s in section \"%s\" and overlay \"%s\"\n", - XkbcKeyNameText(key->name.name), - XkbcAtomText(section->name), - XkbcAtomText(oi->name)); - ACTION("Overlay definition ignored\n"); - } - oKey = 0; - } - else if (sKey == uKey) - { - ki->sectionRow = r; - oKey = 0; - } - } - } - if ((ki->sectionRow == _GOK_UnknownRow) && (warningLevel > 0)) - { - WARN - ("Key %s not in \"%s\", but has an overlay key in \"%s\"\n", - XkbcKeyNameText(ki->under), - XkbcAtomText(section->name), - XkbcAtomText(oi->name)); - ACTION("Definition ignored\n"); - } - } - /* now prune out keys that aren't in the section */ - while ((oi->keys != NULL) && (oi->keys->sectionRow == _GOK_UnknownRow)) - { - next = (OverlayKeyInfo *) oi->keys->defs.next; - free(oi->keys); - oi->keys = next; - oi->nKeys--; - } - for (ki = oi->keys; (ki != NULL) && (ki->defs.next != NULL); ki = next) - { - next = (OverlayKeyInfo *) ki->defs.next; - if (next->sectionRow == _GOK_UnknownRow) - { - ki->defs.next = next->defs.next; - oi->nKeys--; - free(next); - next = (OverlayKeyInfo *) ki->defs.next; - } - } - if (oi->nKeys < 1) - { - ERROR("Overlay \"%s\" for section \"%s\" has no legal keys\n", - XkbcAtomText(oi->name), XkbcAtomText(section->name)); - ACTION("Overlay definition ignored\n"); - return False; - } - /* now figure out how many rows are defined for the overlay */ - bzero(rowSize, sizeof(short) * 256); - for (k = 0; k < 256; k++) - { - rowMap[k] = -1; - } - oi->nRows = 0; - for (ki = oi->keys; ki != NULL; ki = (OverlayKeyInfo *) ki->defs.next) - { - if (rowMap[ki->sectionRow] == -1) - rowMap[ki->sectionRow] = oi->nRows++; - ki->overlayRow = rowMap[ki->sectionRow]; - rowSize[ki->overlayRow]++; - } - return True; -} - -static Bool -CopyOverlayDef(struct xkb_geometry * geom, - struct xkb_section * section, OverlayInfo * oi, GeometryInfo * info) -{ - uint32_t name; - struct xkb_overlay * ol; - struct xkb_overlay_row * row; - struct xkb_overlay_key * key; - OverlayKeyInfo *ki; - short rowMap[256], rowSize[256]; - int i; - - if (!VerifyOverlayInfo(geom, section, oi, info, rowMap, rowSize)) - return False; - name = oi->name; - ol = XkbcAddGeomOverlay(section, name, oi->nRows); - if (!ol) - { - WSGO("Couldn't add overlay \"%s\" to section \"%s\"\n", - XkbcAtomText(name), XkbcAtomText(section->name)); - return False; - } - for (i = 0; i < oi->nRows; i++) - { - int tmp, row_under; - for (tmp = 0, row_under = -1; - (tmp < section->num_rows) && (row_under < 0); tmp++) - { - if (rowMap[tmp] == i) - row_under = tmp; - } - if (!XkbcAddGeomOverlayRow(ol, row_under, rowSize[i])) - { - WSGO - ("Can't add row %d to overlay \"%s\" of section \"%s\"\n", - i, XkbcAtomText(name), XkbcAtomText(section->name)); - return False; - } - } - for (ki = oi->keys; ki != NULL; ki = (OverlayKeyInfo *) ki->defs.next) - { - row = &ol->rows[ki->overlayRow]; - key = &row->keys[row->num_keys++]; - bzero(key, sizeof(struct xkb_overlay_key)); - strncpy(key->over.name, ki->over, XkbKeyNameLength); - strncpy(key->under.name, ki->under, XkbKeyNameLength); - } - return True; -} - -/***====================================================================***/ - -static Bool -CopySectionDef(struct xkb_geometry * geom, SectionInfo * si, GeometryInfo * info) -{ - struct xkb_section * section; - struct xkb_row * row; - struct xkb_key * key; - KeyInfo *ki; - RowInfo *ri; - - section = XkbcAddGeomSection(geom, si->name, si->nRows, si->nDoodads, - si->nOverlays); - if (section == NULL) - { - WSGO("Couldn't allocate section in geometry\n"); - ACTION("Section %s not compiled\n", scText(si)); - return False; - } - section->top = si->top; - section->left = si->left; - section->width = si->width; - section->height = si->height; - section->angle = si->angle; - section->priority = si->priority; - for (ri = si->rows; ri != NULL; ri = (RowInfo *) ri->defs.next) - { - row = XkbcAddGeomRow(section, ri->nKeys); - if (row == NULL) - { - WSGO("Couldn't allocate row in section\n"); - ACTION("Section %s is incomplete\n", scText(si)); - return False; - } - row->top = ri->top; - row->left = ri->left; - row->vertical = ri->vertical; - for (ki = ri->keys; ki != NULL; ki = (KeyInfo *) ki->defs.next) - { - struct xkb_color * color; - if ((ki->defs.defined & _GK_Name) == 0) - { - ERROR("Key %d of row %d in section %s has no name\n", - (int) ki->index, (int) ri->index, scText(si)); - ACTION("Section %s ignored\n", scText(si)); - return False; - } - key = XkbcAddGeomKey(row); - if (key == NULL) - { - WSGO("Couldn't allocate key in row\n"); - ACTION("Section %s is incomplete\n", scText(si)); - return False; - } - memcpy(key->name.name, ki->name, XkbKeyNameLength); - key->gap = ki->gap; - if (ki->shape == None) - key->shape_ndx = 0; - else - { - ShapeInfo *si; - si = FindShape(info, ki->shape, "key", keyText(ki)); - if (!si) - return False; - key->shape_ndx = si->index; - } - if (ki->color != None) - color = - XkbcAddGeomColor(geom, XkbcAtomText(ki->color), - geom->num_colors); - else - color = XkbcAddGeomColor(geom, "white", geom->num_colors); - XkbSetKeyColor(geom, key, color); - } - } - if (si->doodads != NULL) - { - DoodadInfo *di; - for (di = si->doodads; di != NULL; di = (DoodadInfo *) di->defs.next) - { - CopyDoodadDef(geom, section, di, info); - } - } - if (si->overlays != NULL) - { - OverlayInfo *oi; - for (oi = si->overlays; oi != NULL; - oi = (OverlayInfo *) oi->defs.next) - { - CopyOverlayDef(geom, section, oi, info); - } - } - if (XkbcComputeSectionBounds(geom, section)) - { - /* 7/6/94 (ef) -- check for negative origin and translate */ - if ((si->defs.defined & _GS_Width) == 0) - section->width = section->bounds.x2; - if ((si->defs.defined & _GS_Height) == 0) - section->height = section->bounds.y2; - } - return True; -} - -/***====================================================================***/ - -Bool -CompileGeometry(XkbFile *file, struct xkb_desc * xkb, unsigned merge) -{ - GeometryInfo info; - - InitGeometryInfo(&info, file->id, merge); - HandleGeometryFile(file, xkb, merge, &info); - - if (info.errorCount == 0) - { - struct xkb_geometry * geom; - struct xkb_geometry_sizes sizes; - bzero(&sizes, sizeof(sizes)); - sizes.which = XkbGeomAllMask; - sizes.num_properties = info.nProps; - sizes.num_colors = 8; - sizes.num_shapes = info.nShapes; - sizes.num_sections = info.nSections; - sizes.num_doodads = info.nDoodads; - if (XkbcAllocGeometry(xkb, &sizes) != Success) - { - WSGO("Couldn't allocate GeometryRec\n"); - ACTION("Geometry not compiled\n"); - return False; - } - geom = xkb->geom; - - geom->width_mm = info.widthMM; - geom->height_mm = info.heightMM; - if (info.name != NULL) - { - geom->name = xkb_intern_atom(info.name); - if (XkbcAllocNames(xkb, XkbGeometryNameMask, 0, 0) == Success) - xkb->names->geometry = geom->name; - } - if (info.fontSpec != None) - geom->label_font = XkbcAtomGetString(info.fontSpec); - else - geom->label_font = FontFromParts(info.font, info.fontWeight, - info.fontSlant, - info.fontSetWidth, - info.fontVariant, - info.fontSize, - info.fontEncoding); - XkbcAddGeomColor(geom, "black", geom->num_colors); - XkbcAddGeomColor(geom, "white", geom->num_colors); - - if (info.baseColor == None) - info.baseColor = xkb_intern_atom("white"); - if (info.labelColor == None) - info.labelColor = xkb_intern_atom("black"); - geom->base_color = - XkbcAddGeomColor(geom, XkbcAtomText(info.baseColor), - geom->num_colors); - geom->label_color = - XkbcAddGeomColor(geom, XkbcAtomText(info.labelColor), - geom->num_colors); - - if (info.props) - { - PropertyInfo *pi; - for (pi = info.props; pi != NULL; - pi = (PropertyInfo *) pi->defs.next) - { - if (!XkbcAddGeomProperty(geom, pi->name, pi->value)) - return False; - } - } - if (info.shapes) - { - ShapeInfo *si; - for (si = info.shapes; si != NULL; - si = (ShapeInfo *) si->defs.next) - { - if (!CopyShapeDef(geom, si)) - return False; - } - } - if (info.sections) - { - SectionInfo *si; - for (si = info.sections; si != NULL; - si = (SectionInfo *) si->defs.next) - { - if (!CopySectionDef(geom, si, &info)) - return False; - } - } - if (info.doodads) - { - DoodadInfo *di; - for (di = info.doodads; di != NULL; - di = (DoodadInfo *) di->defs.next) - { - if (!CopyDoodadDef(geom, NULL, di, &info)) - return False; - } - } - if (info.aliases) - ApplyAliases(xkb, True, &info.aliases); - ClearGeometryInfo(&info); - return True; - } - return False; -} diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/indicators.c libxkbcommon-0.1.0~2/src/xkbcomp/indicators.c --- libxkbcommon-0.1.0~1/src/xkbcomp/indicators.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/indicators.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,571 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ - -#include "xkbcomp.h" -#include "xkballoc.h" -#include "xkbmisc.h" -#include "misc.h" -#include "tokens.h" -#include "expr.h" -#include "vmod.h" -#include "indicators.h" -#include "action.h" -#include "compat.h" - -/***====================================================================***/ - -#define ReportIndicatorBadType(l, f, w) \ - ReportBadType("indicator map", (f), XkbcAtomText((l)->name), (w)) -#define ReportIndicatorNotArray(l, f) \ - ReportNotArray("indicator map", (f), XkbcAtomText((l)->name)) - -/***====================================================================***/ - -void -ClearIndicatorMapInfo(LEDInfo * info) -{ - info->name = xkb_intern_atom("default"); - info->indicator = _LED_NotBound; - info->flags = info->which_mods = info->real_mods = 0; - info->vmods = 0; - info->which_groups = info->groups = 0; - info->ctrls = 0; - return; -} - -LEDInfo * -AddIndicatorMap(LEDInfo * oldLEDs, LEDInfo * new) -{ - LEDInfo *old, *last; - unsigned collide; - - last = NULL; - for (old = oldLEDs; old != NULL; old = (LEDInfo *) old->defs.next) - { - if (old->name == new->name) - { - if ((old->real_mods == new->real_mods) && - (old->vmods == new->vmods) && - (old->groups == new->groups) && - (old->ctrls == new->ctrls) && - (old->which_mods == new->which_mods) && - (old->which_groups == new->which_groups)) - { - old->defs.defined |= new->defs.defined; - return oldLEDs; - } - if (new->defs.merge == MergeReplace) - { - CommonInfo *next = old->defs.next; - if (((old->defs.fileID == new->defs.fileID) - && (warningLevel > 0)) || (warningLevel > 9)) - { - WARN("Map for indicator %s redefined\n", - XkbcAtomText(old->name)); - ACTION("Earlier definition ignored\n"); - } - *old = *new; - old->defs.next = next; - return oldLEDs; - } - collide = 0; - if (UseNewField(_LED_Index, &old->defs, &new->defs, &collide)) - { - old->indicator = new->indicator; - old->defs.defined |= _LED_Index; - } - if (UseNewField(_LED_Mods, &old->defs, &new->defs, &collide)) - { - old->which_mods = new->which_mods; - old->real_mods = new->real_mods; - old->vmods = new->vmods; - old->defs.defined |= _LED_Mods; - } - if (UseNewField(_LED_Groups, &old->defs, &new->defs, &collide)) - { - old->which_groups = new->which_groups; - old->groups = new->groups; - old->defs.defined |= _LED_Groups; - } - if (UseNewField(_LED_Ctrls, &old->defs, &new->defs, &collide)) - { - old->ctrls = new->ctrls; - old->defs.defined |= _LED_Ctrls; - } - if (UseNewField(_LED_Explicit, &old->defs, &new->defs, &collide)) - { - old->flags &= ~XkbIM_NoExplicit; - old->flags |= (new->flags & XkbIM_NoExplicit); - old->defs.defined |= _LED_Explicit; - } - if (UseNewField(_LED_Automatic, &old->defs, &new->defs, &collide)) - { - old->flags &= ~XkbIM_NoAutomatic; - old->flags |= (new->flags & XkbIM_NoAutomatic); - old->defs.defined |= _LED_Automatic; - } - if (UseNewField(_LED_DrivesKbd, &old->defs, &new->defs, &collide)) - { - old->flags &= ~XkbIM_LEDDrivesKB; - old->flags |= (new->flags & XkbIM_LEDDrivesKB); - old->defs.defined |= _LED_DrivesKbd; - } - if (collide) - { - WARN("Map for indicator %s redefined\n", - XkbcAtomText(old->name)); - ACTION("Using %s definition for duplicate fields\n", - (new->defs.merge == MergeAugment ? "first" : "last")); - } - return oldLEDs; - } - if (old->defs.next == NULL) - last = old; - } - /* new definition */ - old = uTypedAlloc(LEDInfo); - if (!old) - { - WSGO("Couldn't allocate indicator map\n"); - ACTION("Map for indicator %s not compiled\n", - XkbcAtomText(new->name)); - return NULL; - } - *old = *new; - old->defs.next = NULL; - if (last) - { - last->defs.next = &old->defs; - return oldLEDs; - } - return old; -} - -static LookupEntry modComponentNames[] = { - {"base", XkbIM_UseBase} - , - {"latched", XkbIM_UseLatched} - , - {"locked", XkbIM_UseLocked} - , - {"effective", XkbIM_UseEffective} - , - {"compat", XkbIM_UseCompat} - , - {"any", XkbIM_UseAnyMods} - , - {"none", 0} - , - {NULL, 0} -}; -static LookupEntry groupComponentNames[] = { - {"base", XkbIM_UseBase} - , - {"latched", XkbIM_UseLatched} - , - {"locked", XkbIM_UseLocked} - , - {"effective", XkbIM_UseEffective} - , - {"any", XkbIM_UseAnyGroup} - , - {"none", 0} - , - {NULL, 0} -}; - -int -SetIndicatorMapField(LEDInfo * led, - struct xkb_desc * xkb, - char *field, ExprDef * arrayNdx, ExprDef * value) -{ - ExprResult rtrn; - Bool ok; - - ok = True; - if ((uStrCaseCmp(field, "modifiers") == 0) - || (uStrCaseCmp(field, "mods") == 0)) - { - if (arrayNdx != NULL) - return ReportIndicatorNotArray(led, field); - if (!ExprResolveModMask(value, &rtrn, LookupVModMask, (char *) xkb)) - return ReportIndicatorBadType(led, field, "modifier mask"); - led->real_mods = rtrn.uval & 0xff; - led->vmods = (rtrn.uval >> 8) & 0xff; - led->defs.defined |= _LED_Mods; - } - else if (uStrCaseCmp(field, "groups") == 0) - { - if (arrayNdx != NULL) - return ReportIndicatorNotArray(led, field); - if (!ExprResolveMask - (value, &rtrn, SimpleLookup, (char *) groupNames)) - return ReportIndicatorBadType(led, field, "group mask"); - led->groups = rtrn.uval; - led->defs.defined |= _LED_Groups; - } - else if ((uStrCaseCmp(field, "controls") == 0) || - (uStrCaseCmp(field, "ctrls") == 0)) - { - if (arrayNdx != NULL) - return ReportIndicatorNotArray(led, field); - if (!ExprResolveMask - (value, &rtrn, SimpleLookup, (char *) ctrlNames)) - return ReportIndicatorBadType(led, field, - "controls mask"); - led->ctrls = rtrn.uval; - led->defs.defined |= _LED_Ctrls; - } - else if (uStrCaseCmp(field, "allowexplicit") == 0) - { - if (arrayNdx != NULL) - return ReportIndicatorNotArray(led, field); - if (!ExprResolveBoolean(value, &rtrn, NULL, NULL)) - return ReportIndicatorBadType(led, field, "boolean"); - if (rtrn.uval) - led->flags &= ~XkbIM_NoExplicit; - else - led->flags |= XkbIM_NoExplicit; - led->defs.defined |= _LED_Explicit; - } - else if ((uStrCaseCmp(field, "whichmodstate") == 0) || - (uStrCaseCmp(field, "whichmodifierstate") == 0)) - { - if (arrayNdx != NULL) - return ReportIndicatorNotArray(led, field); - if (!ExprResolveMask(value, &rtrn, SimpleLookup, - (char *) modComponentNames)) - { - return ReportIndicatorBadType(led, field, - "mask of modifier state components"); - } - led->which_mods = rtrn.uval; - } - else if (uStrCaseCmp(field, "whichgroupstate") == 0) - { - if (arrayNdx != NULL) - return ReportIndicatorNotArray(led, field); - if (!ExprResolveMask(value, &rtrn, SimpleLookup, - (char *) groupComponentNames)) - { - return ReportIndicatorBadType(led, field, - "mask of group state components"); - } - led->which_groups = rtrn.uval; - } - else if ((uStrCaseCmp(field, "driveskbd") == 0) || - (uStrCaseCmp(field, "driveskeyboard") == 0) || - (uStrCaseCmp(field, "leddriveskbd") == 0) || - (uStrCaseCmp(field, "leddriveskeyboard") == 0) || - (uStrCaseCmp(field, "indicatordriveskbd") == 0) || - (uStrCaseCmp(field, "indicatordriveskeyboard") == 0)) - { - if (arrayNdx != NULL) - return ReportIndicatorNotArray(led, field); - if (!ExprResolveBoolean(value, &rtrn, NULL, NULL)) - return ReportIndicatorBadType(led, field, "boolean"); - if (rtrn.uval) - led->flags |= XkbIM_LEDDrivesKB; - else - led->flags &= ~XkbIM_LEDDrivesKB; - led->defs.defined |= _LED_DrivesKbd; - } - else if (uStrCaseCmp(field, "index") == 0) - { - if (arrayNdx != NULL) - return ReportIndicatorNotArray(led, field); - if (!ExprResolveInteger(value, &rtrn, NULL, NULL)) - return ReportIndicatorBadType(led, field, - "indicator index"); - if ((rtrn.uval < 1) || (rtrn.uval > 32)) - { - ERROR("Illegal indicator index %d (range 1..%d)\n", - rtrn.uval, XkbNumIndicators); - ACTION("Index definition for %s indicator ignored\n", - XkbcAtomText(led->name)); - return False; - } - led->indicator = rtrn.uval; - led->defs.defined |= _LED_Index; - } - else - { - ERROR("Unknown field %s in map for %s indicator\n", field, - XkbcAtomText(led->name)); - ACTION("Definition ignored\n"); - ok = False; - } - return ok; -} - -LEDInfo * -HandleIndicatorMapDef(IndicatorMapDef * def, - struct xkb_desc * xkb, - LEDInfo * dflt, LEDInfo * oldLEDs, unsigned merge) -{ - LEDInfo led, *rtrn; - VarDef *var; - Bool ok; - - if (def->merge != MergeDefault) - merge = def->merge; - - led = *dflt; - led.defs.merge = merge; - led.name = def->name; - - ok = True; - for (var = def->body; var != NULL; var = (VarDef *) var->common.next) - { - ExprResult elem, field; - ExprDef *arrayNdx; - if (!ExprResolveLhs(var->name, &elem, &field, &arrayNdx)) - { - ok = False; - continue; - } - if (elem.str != NULL) - { - ERROR - ("Cannot set defaults for \"%s\" element in indicator map\n", - elem.str); - ACTION("Assignment to %s.%s ignored\n", elem.str, field.str); - ok = False; - } - else - { - ok = SetIndicatorMapField(&led, xkb, field.str, arrayNdx, - var->value) && ok; - } - free(elem.str); - free(field.str); - } - if (ok) - { - rtrn = AddIndicatorMap(oldLEDs, &led); - return rtrn; - } - return NULL; -} - -Bool -CopyIndicatorMapDefs(struct xkb_desc * xkb, LEDInfo *leds, LEDInfo **unboundRtrn) -{ - LEDInfo *led, *next; - LEDInfo *unbound, *last; - - if (XkbcAllocNames(xkb, XkbIndicatorNamesMask, 0, 0) != Success) - { - WSGO("Couldn't allocate names\n"); - ACTION("Indicator names may be incorrect\n"); - } - if (XkbcAllocIndicatorMaps(xkb) != Success) - { - WSGO("Can't allocate indicator maps\n"); - ACTION("Indicator map definitions may be lost\n"); - return False; - } - last = unbound = (unboundRtrn ? *unboundRtrn : NULL); - while ((last != NULL) && (last->defs.next != NULL)) - { - last = (LEDInfo *) last->defs.next; - } - for (led = leds; led != NULL; led = next) - { - next = (LEDInfo *) led->defs.next; - if ((led->groups != 0) && (led->which_groups == 0)) - led->which_groups = XkbIM_UseEffective; - if ((led->which_mods == 0) && ((led->real_mods) || (led->vmods))) - led->which_mods = XkbIM_UseEffective; - if ((led->indicator == _LED_NotBound) || (!xkb->indicators)) - { - if (unboundRtrn != NULL) - { - led->defs.next = NULL; - if (last != NULL) - last->defs.next = (CommonInfo *) led; - else - unbound = led; - last = led; - } - else - free(led); - } - else - { - register struct xkb_indicator_map * im; - im = &xkb->indicators->maps[led->indicator - 1]; - im->flags = led->flags; - im->which_groups = led->which_groups; - im->groups = led->groups; - im->which_mods = led->which_mods; - im->mods.mask = led->real_mods; - im->mods.real_mods = led->real_mods; - im->mods.vmods = led->vmods; - im->ctrls = led->ctrls; - if (xkb->names != NULL) - xkb->names->indicators[led->indicator - 1] = led->name; - free(led); - } - } - if (unboundRtrn != NULL) - { - *unboundRtrn = unbound; - } - return True; -} - -Bool -BindIndicators(struct xkb_desc * xkb, Bool force, LEDInfo *unbound, - LEDInfo **unboundRtrn) -{ - register int i; - register LEDInfo *led, *next, *last; - - if (xkb->names != NULL) - { - for (led = unbound; led != NULL; led = (LEDInfo *) led->defs.next) - { - if (led->indicator == _LED_NotBound) - { - for (i = 0; i < XkbNumIndicators; i++) - { - if (xkb->names->indicators[i] == led->name) - { - led->indicator = i + 1; - break; - } - } - } - } - if (force) - { - for (led = unbound; led != NULL; led = (LEDInfo *) led->defs.next) - { - if (led->indicator == _LED_NotBound) - { - for (i = 0; i < XkbNumIndicators; i++) - { - if (xkb->names->indicators[i] == None) - { - xkb->names->indicators[i] = led->name; - led->indicator = i + 1; - xkb->indicators->phys_indicators &= ~(1 << i); - break; - } - } - if (led->indicator == _LED_NotBound) - { - ERROR("No unnamed indicators found\n"); - ACTION - ("Virtual indicator map \"%s\" not bound\n", - XkbcAtomText(led->name)); - continue; - } - } - } - } - } - for (last = NULL, led = unbound; led != NULL; led = next) - { - next = (LEDInfo *) led->defs.next; - if (led->indicator == _LED_NotBound) - { - if (force) - { - unbound = next; - free(led); - } - else - { - if (last) - last->defs.next = &led->defs; - else - unbound = led; - last = led; - } - } - else - { - if ((xkb->names != NULL) && - (xkb->names->indicators[led->indicator - 1] != led->name)) - { - uint32_t old = xkb->names->indicators[led->indicator - 1]; - ERROR("Multiple names bound to indicator %d\n", - (unsigned int) led->indicator); - ACTION("Using %s, ignoring %s\n", - XkbcAtomText(old), - XkbcAtomText(led->name)); - led->indicator = _LED_NotBound; - if (force) - { - free(led); - unbound = next; - } - else - { - if (last) - last->defs.next = &led->defs; - else - unbound = led; - last = led; - } - } - else - { - struct xkb_indicator_map * map; - map = &xkb->indicators->maps[led->indicator - 1]; - map->flags = led->flags; - map->which_groups = led->which_groups; - map->groups = led->groups; - map->which_mods = led->which_mods; - map->mods.mask = led->real_mods; - map->mods.real_mods = led->real_mods; - map->mods.vmods = led->vmods; - map->ctrls = led->ctrls; - if (last) - last->defs.next = &next->defs; - else - unbound = next; - led->defs.next = NULL; - free(led); - } - } - } - if (unboundRtrn) - { - *unboundRtrn = unbound; - } - else if (unbound) - { - for (led = unbound; led != NULL; led = next) - { - next = (LEDInfo *) led->defs.next; - free(led); - } - } - return True; -} diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/indicators.h libxkbcommon-0.1.0~2/src/xkbcomp/indicators.h --- libxkbcommon-0.1.0~1/src/xkbcomp/indicators.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/indicators.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ - -#ifndef INDICATORS_H -#define INDICATORS_H 1 - -#define _LED_Index (1<<0) -#define _LED_Mods (1<<1) -#define _LED_Groups (1<<2) -#define _LED_Ctrls (1<<3) -#define _LED_Explicit (1<<4) -#define _LED_Automatic (1<<5) -#define _LED_DrivesKbd (1<<6) - -#define _LED_NotBound 255 - -typedef struct _LEDInfo -{ - CommonInfo defs; - uint32_t name; - unsigned char indicator; - unsigned char flags; - unsigned char which_mods; - unsigned char real_mods; - unsigned short vmods; - unsigned char which_groups; - unsigned char groups; - unsigned int ctrls; -} LEDInfo; - -extern void ClearIndicatorMapInfo(LEDInfo * /* info */ - ); - - -extern LEDInfo *AddIndicatorMap(LEDInfo * /* oldLEDs */ , - LEDInfo * /* newLED */ - ); - -extern int SetIndicatorMapField(LEDInfo * /* led */ , - struct xkb_desc * /* xkb */ , - char * /* field */ , - ExprDef * /* arrayNdx */ , - ExprDef * /* value */ - ); - -extern LEDInfo *HandleIndicatorMapDef(IndicatorMapDef * /* stmt */ , - struct xkb_desc * /* xkb */ , - LEDInfo * /* dflt */ , - LEDInfo * /* oldLEDs */ , - unsigned /* mergeMode */ - ); - -extern Bool -CopyIndicatorMapDefs(struct xkb_desc * xkb, LEDInfo *leds, LEDInfo **unboundRtrn); - -extern Bool -BindIndicators(struct xkb_desc * xkb, Bool force, LEDInfo *unbound, - LEDInfo **unboundRtrn); - -#endif /* INDICATORS_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/keycodes.c libxkbcommon-0.1.0~2/src/xkbcomp/keycodes.c --- libxkbcommon-0.1.0~1/src/xkbcomp/keycodes.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/keycodes.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,115 +1,187 @@ /************************************************************ - 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 (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 "xkbcomp.h" -#include "xkballoc.h" -#include "xkbmisc.h" -#include "tokens.h" +#include "xkbcomp-priv.h" #include "expr.h" -#include "keycodes.h" -#include "misc.h" -#include "alias.h" - -char * -longText(unsigned long val) -{ - char buf[4]; - - LongToKeyName(val, buf); - return XkbcKeyNameText(buf); -} - -/***====================================================================***/ - -void -LongToKeyName(unsigned long val, char *name) -{ - name[0] = ((val >> 24) & 0xff); - name[1] = ((val >> 16) & 0xff); - name[2] = ((val >> 8) & 0xff); - name[3] = (val & 0xff); - return; -} +#include "parseutils.h" -/***====================================================================***/ +/* + * 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 + * of up to 4 letters, by which it can be referred to later, e.g. in the + * symbols section. + * + * Minimum/Maximum keycode + * ----------------------- + * Statements of the form: + * minimum = 8; + * maximum = 255; + * + * The file may explicitly declare the minimum and/or maximum keycode + * contained therein (traditionally 8-255, inherited from old xfree86 + * keycodes). If these are stated explicitly, they are enforced. If + * they are not stated, they are computed automatically. + * + * 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 denoted the position of the key + * in the main alphanumric section of the keyboard, with the top left key + * (usually "~") acting as origin. is the key in the first row + * second column (which is usually "1"). ] + * + * 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 + * 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. + * + * The reason for the 4 characters limit is that the name is sometimes + * converted to an unsigned long (in a direct mapping), instead of a char + * array (see KeyNameToLong, LongToKeyName). + * + * Alias statements + * ---------------- + * Statements of the form: + * alias = ; + * + * Allows to refer to a previously defined key (here ) by another + * name (here ). Conflicts are handled similarly. + * + * Indicator name statements + * ------------------------- + * Statements of the form: + * indicator 1 = "Caps Lock"; + * indicator 2 = "Num Lock"; + * indicator 3 = "Scroll Lock"; + * + * Assigns a name the indicator (i.e. keyboard LED) with the given index. + * The amount of possible indicators is predetermined (XkbNumIndicators). + * The indicator may be referred by this name later in the compat section + * and by the user. + * + * Effect on the keymap + * -------------------- + * After all of keycodes sections have been compiled, the following members + * of struct xkb_keymap are finalized: + * xkb_keycode_t min_key_code; + * xkb_keycode_t max_key_code; + * darray(struct xkb_key_alias) key_aliases; + * const char *indicator_names[XkbNumIndicators]; + * char *keycodes_section_name; + * Further, the array of keys: + * darray(struct xkb_key) keys; + * had been resized to its final size (i.e. all of the xkb_key objects are + * referable by their keycode). However the objects themselves do not + * contain any useful information besides the key name at this point. + */ -typedef struct _IndicatorNameInfo -{ - CommonInfo defs; - int ndx; - uint32_t name; - Bool virtual; +typedef struct _AliasInfo { + enum merge_mode merge; + unsigned file_id; + struct list entry; + + unsigned long alias; + unsigned long real; +} AliasInfo; + +typedef struct _IndicatorNameInfo { + enum merge_mode merge; + unsigned file_id; + struct list entry; + + xkb_led_index_t ndx; + xkb_atom_t name; + bool virtual; } IndicatorNameInfo; -typedef struct _KeyNamesInfo -{ +typedef struct _KeyNamesInfo { char *name; /* e.g. evdev+aliases(qwerty) */ int errorCount; - unsigned fileID; - unsigned merge; - int computedMin; /* lowest keycode stored */ - int computedMax; /* highest keycode stored */ - int explicitMin; - int explicitMax; - int effectiveMin; - int effectiveMax; - unsigned long names[XkbMaxLegalKeyCode + 1]; /* 4-letter name of key, keycode is the index */ - unsigned files[XkbMaxLegalKeyCode + 1]; - unsigned char has_alt_forms[XkbMaxLegalKeyCode + 1]; - IndicatorNameInfo *leds; - AliasInfo *aliases; + unsigned file_id; + enum merge_mode merge; + + xkb_keycode_t computedMin; /* lowest keycode stored */ + xkb_keycode_t computedMax; /* highest keycode stored */ + xkb_keycode_t explicitMin; + xkb_keycode_t explicitMax; + darray(unsigned long) names; + darray(unsigned int) files; + struct list leds; + struct list aliases; + + struct xkb_context *ctx; } KeyNamesInfo; -static void HandleKeycodesFile(XkbFile * file, - struct xkb_desc * xkb, - unsigned merge, - KeyNamesInfo * info); +static void +ResizeKeyNameArrays(KeyNamesInfo *info, int newMax) +{ + if (newMax < darray_size(info->names)) + return; + + darray_resize0(info->names, newMax + 1); + darray_resize0(info->files, newMax + 1); +} static void -InitIndicatorNameInfo(IndicatorNameInfo * ii, KeyNamesInfo * info) +InitAliasInfo(AliasInfo *info, enum merge_mode merge, unsigned file_id, + char alias[XkbKeyNameLength], char real[XkbKeyNameLength]) { - ii->defs.defined = 0; - ii->defs.merge = info->merge; - ii->defs.fileID = info->fileID; - ii->defs.next = NULL; - ii->ndx = 0; - ii->name = None; - ii->virtual = False; - return; + memset(info, 0, sizeof(*info)); + info->merge = merge; + info->file_id = file_id; + info->alias = KeyNameToLong(alias); + info->real = KeyNameToLong(real); } static void -ClearIndicatorNameInfo(IndicatorNameInfo * ii, KeyNamesInfo * info) +InitIndicatorNameInfo(IndicatorNameInfo * ii, KeyNamesInfo * info) { - if (ii == info->leds) - { - ClearCommonInfo(&ii->defs); - info->leds = NULL; - } - return; + ii->merge = info->merge; + ii->file_id = info->file_id; + ii->ndx = 0; + ii->name = XKB_ATOM_NONE; + ii->virtual = false; } static IndicatorNameInfo * @@ -117,117 +189,96 @@ { IndicatorNameInfo *ii; - ii = uTypedAlloc(IndicatorNameInfo); - if (ii) - { - InitIndicatorNameInfo(ii, info); - info->leds = (IndicatorNameInfo *) AddCommonInfo(&info->leds->defs, - (CommonInfo *) ii); - } + ii = malloc(sizeof(*ii)); + if (!ii) + return NULL; + + InitIndicatorNameInfo(ii, info); + list_append(&ii->entry, &info->leds); + return ii; } static IndicatorNameInfo * -FindIndicatorByIndex(KeyNamesInfo * info, int ndx) +FindIndicatorByIndex(KeyNamesInfo * info, xkb_led_index_t ndx) { IndicatorNameInfo *old; - for (old = info->leds; old != NULL; - old = (IndicatorNameInfo *) old->defs.next) - { + list_foreach(old, &info->leds, entry) if (old->ndx == ndx) return old; - } + return NULL; } static IndicatorNameInfo * -FindIndicatorByName(KeyNamesInfo * info, uint32_t name) +FindIndicatorByName(KeyNamesInfo * info, xkb_atom_t name) { IndicatorNameInfo *old; - for (old = info->leds; old != NULL; - old = (IndicatorNameInfo *) old->defs.next) - { + list_foreach(old, &info->leds, entry) if (old->name == name) return old; - } + return NULL; } -static Bool -AddIndicatorName(KeyNamesInfo * info, IndicatorNameInfo * new) +static bool +AddIndicatorName(KeyNamesInfo *info, enum merge_mode merge, + IndicatorNameInfo *new) { IndicatorNameInfo *old; - Bool replace; + bool replace; + int verbosity = xkb_get_log_verbosity(info->ctx); + + replace = (merge == MERGE_REPLACE) || (merge == MERGE_OVERRIDE); - replace = (new->defs.merge == MergeReplace) || - (new->defs.merge == MergeOverride); old = FindIndicatorByName(info, new->name); - if (old) - { - if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0)) - || (warningLevel > 9)) - { - WARN("Multiple indicators named %s\n", XkbcAtomText(new->name)); - if (old->ndx == new->ndx) - { - if (old->virtual != new->virtual) - { + if (old) { + if ((old->file_id == new->file_id && verbosity > 0) || + verbosity > 9) { + if (old->ndx == new->ndx) { + if (old->virtual != new->virtual) { if (replace) old->virtual = new->virtual; - ACTION("Using %s instead of %s\n", - (old->virtual ? "virtual" : "real"), - (old->virtual ? "real" : "virtual")); + log_warn(info->ctx, "Multiple indicators named %s; " + "Using %s instead of %s\n", + xkb_atom_text(info->ctx, new->name), + (old->virtual ? "virtual" : "real"), + (old->virtual ? "real" : "virtual")); } - else - { - ACTION("Identical definitions ignored\n"); + else { + log_warn(info->ctx, "Multiple indicators named %s; " + "Identical definitions ignored\n", + xkb_atom_text(info->ctx, new->name)); } - return True; + return true; } - else - { - if (replace) - ACTION("Ignoring %d, using %d\n", old->ndx, new->ndx); - else - ACTION("Using %d, ignoring %d\n", old->ndx, new->ndx); + else { + log_warn(info->ctx, "Multiple indicators named %s; " + "Using %d, ignoring %d\n", + xkb_atom_text(info->ctx, new->name), + (replace ? old->ndx : new->ndx), + (replace ? new->ndx : old->ndx)); } - if (replace) - { - if (info->leds == old) - info->leds = (IndicatorNameInfo *) old->defs.next; - else - { - IndicatorNameInfo *tmp; - tmp = info->leds; - for (; tmp != NULL; - tmp = (IndicatorNameInfo *) tmp->defs.next) - { - if (tmp->defs.next == (CommonInfo *) old) - { - tmp->defs.next = old->defs.next; - break; - } - } - } + + if (replace) { + list_del(&old->entry); free(old); } } } + old = FindIndicatorByIndex(info, new->ndx); - if (old) - { - if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0)) - || (warningLevel > 9)) - { - WARN("Multiple names for indicator %d\n", new->ndx); - if ((old->name == new->name) && (old->virtual == new->virtual)) - ACTION("Identical definitions ignored\n"); - else - { + if (old) { + if ((old->file_id == new->file_id && verbosity > 0) || + verbosity > 9) { + if (old->name == new->name && old->virtual == new->virtual) { + log_warn(info->ctx, "Multiple names for indicator %d; " + "Identical definitions ignored\n", new->ndx); + } else { const char *oldType, *newType; - uint32_t using, ignoring; + xkb_atom_t using, ignoring; if (old->virtual) oldType = "virtual indicator"; else @@ -236,83 +287,87 @@ newType = "virtual indicator"; else newType = "real indicator"; - if (replace) - { + if (replace) { using = new->name; ignoring = old->name; } - else - { + else { using = old->name; ignoring = new->name; } - ACTION("Using %s %s, ignoring %s %s\n", - oldType, XkbcAtomText(using), - newType, XkbcAtomText(ignoring)); + log_warn(info->ctx, "Multiple names for indicator %d; " + "Using %s %s, ignoring %s %s\n", + new->ndx, + oldType, xkb_atom_text(info->ctx, using), + newType, xkb_atom_text(info->ctx, ignoring)); } } - if (replace) - { + if (replace) { old->name = new->name; old->virtual = new->virtual; } - return True; + return true; } old = new; new = NextIndicatorName(info); - if (!new) - { - WSGO("Couldn't allocate name for indicator %d\n", new->ndx); - ACTION("Ignored\n"); - return False; + if (!new) { + log_wsgo(info->ctx, + "Couldn't allocate name for indicator %d; Ignored\n", + old->ndx); + return false; } new->name = old->name; new->ndx = old->ndx; new->virtual = old->virtual; - return True; + return true; } static void ClearKeyNamesInfo(KeyNamesInfo * info) { - if (info->name != NULL) - free(info->name); + AliasInfo *alias, *next_alias; + IndicatorNameInfo *ii, *next_ii; + + free(info->name); info->name = NULL; - info->computedMax = info->explicitMax = info->explicitMin = -1; - info->computedMin = 256; - info->effectiveMin = 8; - info->effectiveMax = 255; - bzero((char *) info->names, sizeof(info->names)); - bzero((char *) info->files, sizeof(info->files)); - bzero((char *) info->has_alt_forms, sizeof(info->has_alt_forms)); - if (info->leds) - ClearIndicatorNameInfo(info->leds, info); - if (info->aliases) - ClearAliases(&info->aliases); - return; + info->merge = MERGE_DEFAULT; + info->computedMax = info->explicitMax = info->explicitMin = 0; + info->computedMin = XKB_KEYCODE_MAX; + darray_free(info->names); + darray_free(info->files); + list_foreach_safe(ii, next_ii, &info->leds, entry) + free(ii); + list_init(&info->leds); + list_foreach_safe(alias, next_alias, &info->aliases, entry) + free(alias); + list_init(&info->aliases); } static void -InitKeyNamesInfo(KeyNamesInfo * info) +InitKeyNamesInfo(KeyNamesInfo *info, struct xkb_context *ctx, + unsigned file_id) { info->name = NULL; - info->leds = NULL; - info->aliases = NULL; + info->merge = MERGE_DEFAULT; + list_init(&info->leds); + list_init(&info->aliases); + info->file_id = file_id; + darray_init(info->names); + darray_init(info->files); ClearKeyNamesInfo(info); info->errorCount = 0; - return; + info->ctx = ctx; } static int FindKeyByLong(KeyNamesInfo * info, unsigned long name) { - register int i; + xkb_keycode_t i; - for (i = info->effectiveMin; i <= info->effectiveMax; i++) - { - if (info->names[i] == name) + for (i = info->computedMin; i <= info->computedMax; i++) + if (darray_item(info->names, i) == name) return i; - } + return 0; } @@ -321,254 +376,199 @@ * keycode. If the same keys is referred to twice, print a warning. * Note that the key's name is stored as a long, the keycode is the index. */ -static Bool -AddKeyName(KeyNamesInfo * info, - int kc, - char *name, unsigned merge, unsigned fileID, Bool reportCollisions) -{ - int old; - unsigned long lval; - - if ((kc < info->effectiveMin) || (kc > info->effectiveMax)) - { - ERROR("Illegal keycode %d for name <%s>\n", kc, name); - ACTION("Must be in the range %d-%d inclusive\n", - info->effectiveMin, info->effectiveMax); - return False; - } +static bool +AddKeyName(KeyNamesInfo *info, xkb_keycode_t kc, unsigned long name, + enum merge_mode merge, unsigned file_id, bool reportCollisions) +{ + xkb_keycode_t old; + int verbosity = xkb_get_log_verbosity(info->ctx); + + ResizeKeyNameArrays(info, kc); + if (kc < info->computedMin) info->computedMin = kc; if (kc > info->computedMax) info->computedMax = kc; - lval = KeyNameToLong(name); if (reportCollisions) - { - reportCollisions = ((warningLevel > 7) || - ((warningLevel > 0) - && (fileID == info->files[kc]))); - } - - if (info->names[kc] != 0) - { - char buf[6]; - - LongToKeyName(info->names[kc], buf); - buf[4] = '\0'; - if (info->names[kc] == lval) - { - if (info->has_alt_forms[kc] || (merge == MergeAltForm)) - { - info->has_alt_forms[kc] = True; - } - else if (reportCollisions) - { - WARN("Multiple identical key name definitions\n"); - ACTION("Later occurences of \"<%s> = %d\" ignored\n", - buf, kc); - } - return True; + reportCollisions = (verbosity > 7 || + (verbosity > 0 && + file_id == darray_item(info->files, kc))); + + if (darray_item(info->names, kc) != 0) { + const char *lname = LongKeyNameText(darray_item(info->names, kc)); + const char *kname = LongKeyNameText(name); + + if (darray_item(info->names, kc) == name && reportCollisions) { + log_warn(info->ctx, "Multiple identical key name definitions; " + "Later occurences of \"%s = %d\" ignored\n", lname, kc); + return true; } - if (merge == MergeAugment) - { + + if (merge == MERGE_AUGMENT) { if (reportCollisions) - { - WARN("Multiple names for keycode %d\n", kc); - ACTION("Using <%s>, ignoring <%s>\n", buf, name); - } - return True; + log_warn(info->ctx, "Multiple names for keycode %d; " + "Using %s, ignoring %s\n", kc, lname, kname); + return true; } - else - { + else { if (reportCollisions) - { - WARN("Multiple names for keycode %d\n", kc); - ACTION("Using <%s>, ignoring <%s>\n", name, buf); - } - info->names[kc] = 0; - info->files[kc] = 0; + log_warn(info->ctx, "Multiple names for keycode %d; " + "Using %s, ignoring %s\n", kc, kname, lname); + darray_item(info->names, kc) = 0; + darray_item(info->files, kc) = 0; } } - old = FindKeyByLong(info, lval); - if ((old != 0) && (old != kc)) - { - if (merge == MergeOverride) - { - info->names[old] = 0; - info->files[old] = 0; - info->has_alt_forms[old] = True; + + old = FindKeyByLong(info, name); + if (old != 0 && old != kc) { + const char *kname = LongKeyNameText(name); + + if (merge == MERGE_OVERRIDE) { + darray_item(info->names, old) = 0; + darray_item(info->files, old) = 0; if (reportCollisions) - { - WARN("Key name <%s> assigned to multiple keys\n", name); - ACTION("Using %d, ignoring %d\n", kc, old); - } + log_warn(info->ctx, "Key name %s assigned to multiple keys; " + "Using %d, ignoring %d\n", kname, kc, old); } - else if (merge != MergeAltForm) - { - if ((reportCollisions) && (warningLevel > 3)) - { - WARN("Key name <%s> assigned to multiple keys\n", name); - ACTION("Using %d, ignoring %d\n", old, kc); - ACTION - ("Use 'alternate' keyword to assign the same name to multiple keys\n"); - } - return True; - } - else - { - info->has_alt_forms[old] = True; + else { + if (reportCollisions && verbosity > 3) + log_warn(info->ctx, "Key name %s assigned to multiple keys; " + "Using %d, ignoring %d\n", kname, old, kc); + return true; } } - info->names[kc] = lval; - info->files[kc] = fileID; - info->has_alt_forms[kc] = (merge == MergeAltForm); - return True; + + darray_item(info->names, kc) = name; + darray_item(info->files, kc) = file_id; + return true; } /***====================================================================***/ +static int +HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge, + unsigned file_id); + +static bool +MergeAliases(KeyNamesInfo *into, KeyNamesInfo *from, enum merge_mode merge) +{ + AliasInfo *alias, *next; + KeyAliasDef def; + + if (list_empty(&from->aliases)) + return true; + + if (list_empty(&into->aliases)) { + list_replace(&from->aliases, &into->aliases); + list_init(&from->aliases); + return true; + } + + memset(&def, 0, sizeof(def)); + + list_foreach_safe(alias, next, &from->aliases, entry) { + def.merge = (merge == MERGE_DEFAULT) ? alias->merge : merge; + LongToKeyName(alias->alias, def.alias); + LongToKeyName(alias->real, def.real); + + if (!HandleAliasDef(into, &def, def.merge, alias->file_id)) + return false; + } + + return true; +} + static void -MergeIncludedKeycodes(KeyNamesInfo * into, KeyNamesInfo * from, - unsigned merge) +MergeIncludedKeycodes(KeyNamesInfo *into, KeyNamesInfo *from, + enum merge_mode merge) { - register int i; - char buf[5]; + xkb_keycode_t i; + IndicatorNameInfo *led; - if (from->errorCount > 0) - { + if (from->errorCount > 0) { into->errorCount += from->errorCount; return; } - if (into->name == NULL) - { + + if (into->name == NULL) { into->name = from->name; from->name = NULL; } - for (i = from->computedMin; i <= from->computedMax; i++) - { - unsigned thisMerge; - if (from->names[i] == 0) + + ResizeKeyNameArrays(into, from->computedMax); + + for (i = from->computedMin; i <= from->computedMax; i++) { + unsigned long name = darray_item(from->names, i); + if (name == 0) continue; - LongToKeyName(from->names[i], buf); - buf[4] = '\0'; - if (from->has_alt_forms[i]) - thisMerge = MergeAltForm; - else - thisMerge = merge; - if (!AddKeyName(into, i, buf, thisMerge, from->fileID, False)) + + if (!AddKeyName(into, i, name, merge, from->file_id, false)) into->errorCount++; } - if (from->leds) - { - IndicatorNameInfo *led, *next; - for (led = from->leds; led != NULL; led = next) - { - if (merge != MergeDefault) - led->defs.merge = merge; - if (!AddIndicatorName(into, led)) - into->errorCount++; - next = (IndicatorNameInfo *) led->defs.next; - } + + list_foreach(led, &from->leds, entry) { + led->merge = (merge == MERGE_DEFAULT ? led->merge : merge); + if (!AddIndicatorName(into, led->merge, led)) + into->errorCount++; } - if (!MergeAliases(&into->aliases, &from->aliases, merge)) + + if (!MergeAliases(into, from, merge)) into->errorCount++; - if (from->explicitMin > 0) - { - if ((into->explicitMin < 0) - || (into->explicitMin > from->explicitMin)) - into->effectiveMin = into->explicitMin = from->explicitMin; - } + + if (from->explicitMin != 0) + if (into->explicitMin == 0 || into->explicitMin > from->explicitMin) + into->explicitMin = from->explicitMin; + if (from->explicitMax > 0) - { - if ((into->explicitMax < 0) - || (into->explicitMax < from->explicitMax)) - into->effectiveMax = into->explicitMax = from->explicitMax; - } - return; + if (into->explicitMax == 0 || into->explicitMax < from->explicitMax) + into->explicitMax = from->explicitMax; } +static void +HandleKeycodesFile(KeyNamesInfo *info, XkbFile *file, enum merge_mode merge); + /** * Handle the given include statement (e.g. "include "evdev+aliases(qwerty)"). * - * @param stmt The include statement from the keymap file. - * @param xkb Unused for all but the xkb->flags. * @param info Struct to store the key info in. + * @param stmt The include statement from the keymap file. */ -static Bool -HandleIncludeKeycodes(IncludeStmt * stmt, struct xkb_desc * xkb, KeyNamesInfo * info) +static bool +HandleIncludeKeycodes(KeyNamesInfo *info, IncludeStmt *stmt) { - unsigned newMerge; + enum merge_mode merge = MERGE_DEFAULT; XkbFile *rtrn; - KeyNamesInfo included = {NULL}; - Bool haveSelf; + KeyNamesInfo included, next_incl; - haveSelf = False; - if ((stmt->file == NULL) && (stmt->map == NULL)) - { - haveSelf = True; - included = *info; - bzero(info, sizeof(KeyNamesInfo)); - } - else if (strcmp(stmt->file, "computed") == 0) - { - xkb->flags |= AutoKeyNames; - info->explicitMin = XkbMinLegalKeyCode; - info->explicitMax = XkbMaxLegalKeyCode; - return (info->errorCount == 0); - } /* parse file, store returned info in the xkb struct */ - else if (ProcessIncludeFile(stmt, XkmKeyNamesIndex, &rtrn, &newMerge)) - { - InitKeyNamesInfo(&included); - HandleKeycodesFile(rtrn, xkb, MergeOverride, &included); - if (stmt->stmt != NULL) - { - if (included.name != NULL) - free(included.name); - included.name = stmt->stmt; - stmt->stmt = NULL; - } + InitKeyNamesInfo(&included, info->ctx, info->file_id); + if (stmt->stmt) { + free(included.name); + included.name = stmt->stmt; + stmt->stmt = NULL; } - else - { - info->errorCount += 10; /* XXX: why 10?? */ - return False; - } - /* Do we have more than one include statement? */ - if ((stmt->next != NULL) && (included.errorCount < 1)) - { - IncludeStmt *next; - unsigned op; - KeyNamesInfo next_incl; - - for (next = stmt->next; next != NULL; next = next->next) - { - if ((next->file == NULL) && (next->map == NULL)) - { - haveSelf = True; - MergeIncludedKeycodes(&included, info, next->merge); - ClearKeyNamesInfo(info); - } - else if (ProcessIncludeFile(next, XkmKeyNamesIndex, &rtrn, &op)) - { - InitKeyNamesInfo(&next_incl); - HandleKeycodesFile(rtrn, xkb, MergeOverride, &next_incl); - MergeIncludedKeycodes(&included, &next_incl, op); - ClearKeyNamesInfo(&next_incl); - } - else - { - info->errorCount += 10; /* XXX: Why 10?? */ - return False; - } + + for (; stmt; stmt = stmt->next_incl) { + if (!ProcessIncludeFile(info->ctx, stmt, FILE_TYPE_KEYCODES, + &rtrn, &merge)) { + info->errorCount += 10; + ClearKeyNamesInfo(&included); + return false; } + + InitKeyNamesInfo(&next_incl, info->ctx, rtrn->id); + + HandleKeycodesFile(&next_incl, rtrn, MERGE_OVERRIDE); + + MergeIncludedKeycodes(&included, &next_incl, merge); + + ClearKeyNamesInfo(&next_incl); + FreeXKBFile(rtrn); } - if (haveSelf) - *info = included; - else - { - MergeIncludedKeycodes(info, &included, newMerge); - ClearKeyNamesInfo(&included); - } + + MergeIncludedKeycodes(info, &included, merge); + ClearKeyNamesInfo(&included); + return (info->errorCount == 0); } @@ -577,162 +577,226 @@ * e.g. = 9 */ static int -HandleKeycodeDef(KeycodeDef * stmt, unsigned merge, KeyNamesInfo * info) +HandleKeycodeDef(KeyNamesInfo *info, KeycodeDef *stmt, enum merge_mode merge) { - int code; - ExprResult result; - - if (!ExprResolveInteger(stmt->value, &result, NULL, NULL)) - { - ACTION("No value keycode assigned to name <%s>\n", stmt->name); - return 0; - } - code = result.ival; - if ((code < info->effectiveMin) || (code > info->effectiveMax)) - { - ERROR("Illegal keycode %d for name <%s>\n", code, stmt->name); - ACTION("Must be in the range %d-%d inclusive\n", - info->effectiveMin, info->effectiveMax); + if ((info->explicitMin != 0 && stmt->value < info->explicitMin) || + (info->explicitMax != 0 && stmt->value > info->explicitMax)) { + log_err(info->ctx, "Illegal keycode %lu for name %s; " + "Must be in the range %d-%d inclusive\n", + stmt->value, KeyNameText(stmt->name), info->explicitMin, + info->explicitMax ? info->explicitMax : XKB_KEYCODE_MAX); return 0; } - if (stmt->merge != MergeDefault) - { - if (stmt->merge == MergeReplace) - merge = MergeOverride; + + if (stmt->merge != MERGE_DEFAULT) { + if (stmt->merge == MERGE_REPLACE) + merge = MERGE_OVERRIDE; else merge = stmt->merge; } - return AddKeyName(info, code, stmt->name, merge, info->fileID, True); + + return AddKeyName(info, stmt->value, KeyNameToLong(stmt->name), merge, + info->file_id, true); } -#define MIN_KEYCODE_DEF 0 -#define MAX_KEYCODE_DEF 1 +static void +HandleAliasCollision(KeyNamesInfo *info, AliasInfo *old, AliasInfo *new) +{ + int verbosity = xkb_get_log_verbosity(info->ctx); + + if (new->real == old->real) { + if ((new->file_id == old->file_id && verbosity > 0) || verbosity > 9) + log_warn(info->ctx, "Alias of %s for %s declared more than once; " + "First definition ignored\n", + LongKeyNameText(new->alias), LongKeyNameText(new->real)); + } + else { + unsigned long use, ignore; + + if (new->merge == MERGE_AUGMENT) { + use = old->real; + ignore = new->real; + } + else { + use = new->real; + ignore = old->real; + } + + if ((old->file_id == new->file_id && verbosity > 0) || verbosity > 9) + log_warn(info->ctx, "Multiple definitions for alias %s; " + "Using %s, ignoring %s\n", + LongKeyNameText(old->alias), LongKeyNameText(use), + LongKeyNameText(ignore)); + + if (use != old->real) + old->real = use; + } + + old->file_id = new->file_id; + old->merge = new->merge; +} + +static int +HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge, + unsigned file_id) +{ + AliasInfo *alias; + + list_foreach(alias, &info->aliases, entry) { + if (alias->alias == KeyNameToLong(def->alias)) { + AliasInfo new; + InitAliasInfo(&new, merge, file_id, def->alias, def->real); + HandleAliasCollision(info, alias, &new); + return true; + } + } + + alias = calloc(1, sizeof(*alias)); + if (!alias) { + log_wsgo(info->ctx, "Allocation failure in HandleAliasDef\n"); + return false; + } + + alias->file_id = file_id; + alias->merge = merge; + alias->alias = KeyNameToLong(def->alias); + alias->real = KeyNameToLong(def->real); + list_append(&alias->entry, &info->aliases); + + return true; +} + +#define MIN_KEYCODE_DEF 0 +#define MAX_KEYCODE_DEF 1 /** * Handle the minimum/maximum statement of the xkb file. - * Sets explicitMin/Max and effectiveMin/Max of the info struct. + * Sets explicitMin/Max of the info struct. * * @return 1 on success, 0 otherwise. */ static int -HandleKeyNameVar(VarDef * stmt, KeyNamesInfo * info) +HandleKeyNameVar(KeyNamesInfo *info, VarDef *stmt) { - ExprResult tmp, field; + const char *elem, *field; + xkb_keycode_t kc; ExprDef *arrayNdx; int which; - if (ExprResolveLhs(stmt->name, &tmp, &field, &arrayNdx) == 0) - return 0; /* internal error, already reported */ + if (!ExprResolveLhs(info->ctx, stmt->name, &elem, &field, + &arrayNdx)) + return false; /* internal error, already reported */ - if (tmp.str != NULL) - { - ERROR("Unknown element %s encountered\n", tmp.str); - ACTION("Default for field %s ignored\n", field.str); - return 0; + if (elem) { + log_err(info->ctx, "Unknown element %s encountered; " + "Default for field %s ignored\n", elem, field); + return false; } - if (uStrCaseCmp(field.str, "minimum") == 0) + + if (istreq(field, "minimum")) { which = MIN_KEYCODE_DEF; - else if (uStrCaseCmp(field.str, "maximum") == 0) + } + else if (istreq(field, "maximum")) { which = MAX_KEYCODE_DEF; - else - { - ERROR("Unknown field encountered\n"); - ACTION("Assigment to field %s ignored\n", field.str); - return 0; } - if (arrayNdx != NULL) - { - ERROR("The %s setting is not an array\n", field.str); - ACTION("Illegal array reference ignored\n"); - return 0; + else { + log_err(info->ctx, "Unknown field encountered; " + "Assigment to field %s ignored\n", field); + return false; } - if (ExprResolveInteger(stmt->value, &tmp, NULL, NULL) == 0) - { - ACTION("Assignment to field %s ignored\n", field.str); - return 0; + if (arrayNdx != NULL) { + log_err(info->ctx, "The %s setting is not an array; " + "Illegal array reference ignored\n", field); + return false; } - if ((tmp.ival < XkbMinLegalKeyCode) || (tmp.ival > XkbMaxLegalKeyCode)) - { - ERROR - ("Illegal keycode %d (must be in the range %d-%d inclusive)\n", - tmp.ival, XkbMinLegalKeyCode, XkbMaxLegalKeyCode); - ACTION("Value of \"%s\" not changed\n", field.str); - return 0; + + if (!ExprResolveKeyCode(info->ctx, stmt->value, &kc)) { + log_err(info->ctx, "Illegal keycode encountered; " + "Assignment to field %s ignored\n", field); + return false; + } + + if (kc > XKB_KEYCODE_MAX) { + log_err(info->ctx, + "Illegal keycode %d (must be in the range %d-%d inclusive); " + "Value of \"%s\" not changed\n", + kc, 0, XKB_KEYCODE_MAX, field); + return false; } - if (which == MIN_KEYCODE_DEF) - { - if ((info->explicitMax > 0) && (info->explicitMax < tmp.ival)) - { - ERROR - ("Minimum key code (%d) must be <= maximum key code (%d)\n", - tmp.ival, info->explicitMax); - ACTION("Minimum key code value not changed\n"); - return 0; - } - if ((info->computedMax > 0) && (info->computedMin < tmp.ival)) - { - ERROR - ("Minimum key code (%d) must be <= lowest defined key (%d)\n", - tmp.ival, info->computedMin); - ACTION("Minimum key code value not changed\n"); - return 0; - } - info->explicitMin = tmp.ival; - info->effectiveMin = tmp.ival; - } - if (which == MAX_KEYCODE_DEF) - { - if ((info->explicitMin > 0) && (info->explicitMin > tmp.ival)) - { - ERROR("Maximum code (%d) must be >= minimum key code (%d)\n", - tmp.ival, info->explicitMin); - ACTION("Maximum code value not changed\n"); - return 0; - } - if ((info->computedMax > 0) && (info->computedMax > tmp.ival)) - { - ERROR - ("Maximum code (%d) must be >= highest defined key (%d)\n", - tmp.ival, info->computedMax); - ACTION("Maximum code value not changed\n"); - return 0; + + if (which == MIN_KEYCODE_DEF) { + if (info->explicitMax > 0 && info->explicitMax < kc) { + log_err(info->ctx, + "Minimum key code (%d) must be <= maximum key code (%d); " + "Minimum key code value not changed\n", + kc, info->explicitMax); + return false; + } + + if (info->computedMax > 0 && info->computedMin < kc) { + log_err(info->ctx, + "Minimum key code (%d) must be <= lowest defined key (%d); " + "Minimum key code value not changed\n", + kc, info->computedMin); + return false; } - info->explicitMax = tmp.ival; - info->effectiveMax = tmp.ival; + + info->explicitMin = kc; } - return 1; + else if (which == MAX_KEYCODE_DEF) { + if (info->explicitMin > 0 && info->explicitMin > kc) { + log_err(info->ctx, + "Maximum code (%d) must be >= minimum key code (%d); " + "Maximum code value not changed\n", + kc, info->explicitMin); + return false; + } + + if (info->computedMax > 0 && info->computedMax > kc) { + log_err(info->ctx, + "Maximum code (%d) must be >= highest defined key (%d); " + "Maximum code value not changed\n", + kc, info->computedMax); + return false; + } + + info->explicitMax = kc; + } + + return true; } static int -HandleIndicatorNameDef(IndicatorNameDef * def, - unsigned merge, KeyNamesInfo * info) +HandleIndicatorNameDef(KeyNamesInfo *info, IndicatorNameDef *def, + enum merge_mode merge) { IndicatorNameInfo ii; - ExprResult tmp; + const char *str; - if ((def->ndx < 1) || (def->ndx > XkbNumIndicators)) - { + if (def->ndx < 1 || def->ndx > XkbNumIndicators) { info->errorCount++; - ERROR("Name specified for illegal indicator index %d\n", def->ndx); - ACTION("Ignored\n"); - return False; + log_err(info->ctx, + "Name specified for illegal indicator index %d\n; Ignored\n", + def->ndx); + return false; } + InitIndicatorNameInfo(&ii, info); - ii.ndx = def->ndx; - if (!ExprResolveString(def->name, &tmp, NULL, NULL)) - { + + if (!ExprResolveString(info->ctx, def->name, &str)) { char buf[20]; snprintf(buf, sizeof(buf), "%d", def->ndx); info->errorCount++; - return ReportBadType("indicator", "name", buf, "string"); + return ReportBadType(info->ctx, "indicator", "name", buf, + "string"); } - ii.name = xkb_intern_atom(tmp.str); - free(tmp.str); + + ii.ndx = (xkb_led_index_t) def->ndx; + ii.name = xkb_atom_intern(info->ctx, str); ii.virtual = def->virtual; - if (!AddIndicatorName(info, &ii)) - return False; - return True; + + return AddIndicatorName(info, merge, &ii); } /** @@ -743,72 +807,130 @@ * semi-recursive (it calls HandleIncludeKeycodes, which may call * HandleKeycodesFile again). * - * @param file The input file (parsed xkb_keycodes section) - * @param xkb Necessary to pass down, may have flags changed. - * @param merge Merge strategy (MergeOverride, etc.) * @param info Struct to contain the fully parsed key information. + * @param file The input file (parsed xkb_keycodes section) + * @param merge Merge strategy (MERGE_OVERRIDE, etc.) */ static void -HandleKeycodesFile(XkbFile * file, - struct xkb_desc * xkb, unsigned merge, KeyNamesInfo * info) +HandleKeycodesFile(KeyNamesInfo *info, XkbFile *file, enum merge_mode merge) { ParseCommon *stmt; + bool ok; + + free(info->name); + info->name = strdup_safe(file->name); - info->name = _XkbDupString(file->name); - stmt = file->defs; - while (stmt) - { - switch (stmt->stmtType) - { - case StmtInclude: /* e.g. include "evdev+aliases(qwerty)" */ - if (!HandleIncludeKeycodes((IncludeStmt *) stmt, xkb, info)) - info->errorCount++; + for (stmt = file->defs; stmt; stmt = stmt->next) { + switch (stmt->type) { + case STMT_INCLUDE: /* e.g. include "evdev+aliases(qwerty)" */ + ok = HandleIncludeKeycodes(info, (IncludeStmt *) stmt); break; - case StmtKeycodeDef: /* e.g. = 9; */ - if (!HandleKeycodeDef((KeycodeDef *) stmt, merge, info)) - info->errorCount++; + case STMT_KEYCODE: /* e.g. = 9; */ + ok = HandleKeycodeDef(info, (KeycodeDef *) stmt, merge); break; - case StmtKeyAliasDef: /* e.g. alias = ; */ - if (!HandleAliasDef((KeyAliasDef *) stmt, - merge, info->fileID, &info->aliases)) - info->errorCount++; + case STMT_ALIAS: /* e.g. alias = ; */ + ok = HandleAliasDef(info, (KeyAliasDef *) stmt, merge, + info->file_id); break; - case StmtVarDef: /* e.g. minimum, maximum */ - if (!HandleKeyNameVar((VarDef *) stmt, info)) - info->errorCount++; + case STMT_VAR: /* e.g. minimum, maximum */ + ok = HandleKeyNameVar(info, (VarDef *) stmt); break; - case StmtIndicatorNameDef: /* e.g. indicator 1 = "Caps Lock"; */ - if (!HandleIndicatorNameDef((IndicatorNameDef *) stmt, - merge, info)) - { - info->errorCount++; - } - break; - case StmtInterpDef: - case StmtVModDef: - ERROR("Keycode files may define key and indicator names only\n"); - ACTION("Ignoring definition of %s\n", - ((stmt->stmtType == - StmtInterpDef) ? "a symbol interpretation" : - "virtual modifiers")); - info->errorCount++; + case STMT_INDICATOR_NAME: /* e.g. indicator 1 = "Caps Lock"; */ + ok = HandleIndicatorNameDef(info, (IndicatorNameDef *) stmt, + merge); break; default: - WSGO("Unexpected statement type %d in HandleKeycodesFile\n", - stmt->stmtType); + log_err(info->ctx, + "Keycode files may define key and indicator names only; " + "Ignoring %s\n", StmtTypeToString(stmt->type)); + ok = false; + break; + } + + if (!ok) + info->errorCount++; + + if (info->errorCount > 10) { + log_err(info->ctx, "Abandoning keycodes file \"%s\"\n", + file->topName); break; } - stmt = stmt->next; - if (info->errorCount > 10) - { -#ifdef NOISY - ERROR("Too many errors\n"); -#endif - ACTION("Abandoning keycodes file \"%s\"\n", file->topName); + } +} + +static int +ApplyAliases(KeyNamesInfo *info, struct xkb_keymap *keymap) +{ + int i; + struct xkb_key *key; + struct xkb_key_alias *old, *a; + AliasInfo *alias, *next; + int nNew = 0, nOld; + + nOld = darray_size(keymap->key_aliases); + old = &darray_item(keymap->key_aliases, 0); + + list_foreach(alias, &info->aliases, entry) { + key = FindNamedKey(keymap, alias->real, false, 0); + if (!key) { + log_lvl(info->ctx, 5, + "Attempt to alias %s to non-existent key %s; Ignored\n", + LongKeyNameText(alias->alias), + LongKeyNameText(alias->real)); + alias->alias = 0; + continue; + } + + key = FindNamedKey(keymap, alias->alias, false, 0); + if (key) { + log_lvl(info->ctx, 5, + "Attempt to create alias with the name of a real key; " + "Alias \"%s = %s\" ignored\n", + LongKeyNameText(alias->alias), + LongKeyNameText(alias->real)); + alias->alias = 0; + continue; + } + + nNew++; + + if (!old) + continue; + + for (i = 0, a = old; i < nOld; i++, a++) { + AliasInfo old_alias; + + if (KeyNameToLong(a->alias) == alias->alias) + continue; + + InitAliasInfo(&old_alias, MERGE_AUGMENT, 0, a->alias, a->real); + HandleAliasCollision(info, &old_alias, alias); + old_alias.real = KeyNameToLong(a->real); + alias->alias = 0; + nNew--; break; } } - return; + + if (nNew == 0) + goto out; + + darray_resize0(keymap->key_aliases, nOld + nNew); + + a = &darray_item(keymap->key_aliases, nOld); + list_foreach(alias, &info->aliases, entry) { + if (alias->alias != 0) { + LongToKeyName(alias->alias, a->alias); + LongToKeyName(alias->real, a->real); + a++; + } + } + +out: + list_foreach_safe(alias, next, &info->aliases, entry) + free(alias); + list_init(&info->aliases); + return true; } /** @@ -819,70 +941,104 @@ * @param result The effective keycodes, as gathered from the file. * @param merge Merge strategy. * - * @return True on success, False otherwise. + * @return true on success, false otherwise. */ -Bool -CompileKeycodes(XkbFile *file, struct xkb_desc * xkb, unsigned merge) +bool +CompileKeycodes(XkbFile *file, struct xkb_keymap *keymap, + enum merge_mode merge) { + xkb_keycode_t kc; KeyNamesInfo info; /* contains all the info after parsing */ + IndicatorNameInfo *ii; - InitKeyNamesInfo(&info); - HandleKeycodesFile(file, xkb, merge, &info); + InitKeyNamesInfo(&info, keymap->ctx, file->id); + + HandleKeycodesFile(&info, file, merge); /* all the keys are now stored in info */ - if (info.errorCount == 0) - { - if (info.explicitMin > 0) /* if "minimum" statement was present */ - xkb->min_key_code = info.effectiveMin; - else - xkb->min_key_code = info.computedMin; - if (info.explicitMax > 0) /* if "maximum" statement was present */ - xkb->max_key_code = info.effectiveMax; - else - xkb->max_key_code = info.computedMax; - if (XkbcAllocNames(xkb, XkbKeyNamesMask | XkbIndicatorNamesMask, 0, 0) - == Success) - { - register int i; - xkb->names->keycodes = xkb_intern_atom(info.name); - for (i = info.computedMin; i <= info.computedMax; i++) - { - LongToKeyName(info.names[i], xkb->names->keys[i].name); - } - } - else - { - WSGO("Cannot create struct xkb_names in CompileKeycodes\n"); - return False; - } - if (info.leds) - { - IndicatorNameInfo *ii; - if (XkbcAllocIndicatorMaps(xkb) != Success) - { - WSGO("Couldn't allocate IndicatorRec in CompileKeycodes\n"); - ACTION("Physical indicators not set\n"); - } - for (ii = info.leds; ii != NULL; - ii = (IndicatorNameInfo *) ii->defs.next) - { - xkb->names->indicators[ii->ndx - 1] = ii->name; - if (xkb->indicators != NULL) - { - register unsigned bit; - bit = 1 << (ii->ndx - 1); - if (ii->virtual) - xkb->indicators->phys_indicators &= ~bit; - else - xkb->indicators->phys_indicators |= bit; - } - } + if (info.errorCount != 0) + goto err_info; + + if (info.explicitMin > 0) /* if "minimum" statement was present */ + keymap->min_key_code = info.explicitMin; + else + keymap->min_key_code = info.computedMin; + + if (info.explicitMax > 0) /* if "maximum" statement was present */ + keymap->max_key_code = info.explicitMax; + else + keymap->max_key_code = info.computedMax; + + darray_resize0(keymap->keys, keymap->max_key_code + 1); + for (kc = info.computedMin; kc <= info.computedMax; kc++) + LongToKeyName(darray_item(info.names, kc), + XkbKey(keymap, kc)->name); + + keymap->keycodes_section_name = strdup_safe(info.name); + + list_foreach(ii, &info.leds, entry) + keymap->indicator_names[ii->ndx - 1] = + xkb_atom_text(keymap->ctx, ii->name); + + ApplyAliases(&info, keymap); + + ClearKeyNamesInfo(&info); + return true; + +err_info: + ClearKeyNamesInfo(&info); + return false; +} + +/** + * Find the key with the given name. + * + * @param keymap The keymap to search in. + * @param name The 4-letter name of the key as a long. + * @param use_aliases true if the key aliases should be searched too. + * @param start_from Keycode to start searching from. + * + * @return the key if it is found, NULL otherwise. + */ +struct xkb_key * +FindNamedKey(struct xkb_keymap *keymap, unsigned long name, + bool use_aliases, xkb_keycode_t start_from) +{ + struct xkb_key *key; + + if (start_from < keymap->min_key_code) + start_from = keymap->min_key_code; + else if (start_from > keymap->max_key_code) + return NULL; + + xkb_foreach_key_from(key, keymap, start_from) + if (KeyNameToLong(key->name) == name) + return key; + + if (use_aliases) { + unsigned long new_name; + if (FindKeyNameForAlias(keymap, name, &new_name)) + return FindNamedKey(keymap, new_name, false, 0); + } + + return NULL; +} + +bool +FindKeyNameForAlias(struct xkb_keymap *keymap, unsigned long lname, + unsigned long *real_name) +{ + char name[XkbKeyNameLength]; + struct xkb_key_alias *a; + + LongToKeyName(lname, name); + darray_foreach(a, keymap->key_aliases) { + if (strncmp(name, a->alias, XkbKeyNameLength) == 0) { + *real_name = KeyNameToLong(a->real); + return true; } - if (info.aliases) - ApplyAliases(xkb, False, &info.aliases); - return True; } - ClearKeyNamesInfo(&info); - return False; + + return false; } diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/keycodes.h libxkbcommon-0.1.0~2/src/xkbcomp/keycodes.h --- libxkbcommon-0.1.0~1/src/xkbcomp/keycodes.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/keycodes.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ - -#ifndef KEYCODES_H -#define KEYCODES_H 1 - -#define KeyNameToLong(n) ((((unsigned long)n[0])<<24)|(((unsigned long)n[1])<<16)|(((unsigned long)n[2])<<8)|n[3]) - -extern char *longText(unsigned long /* val */ - ); - -extern void LongToKeyName(unsigned long /* val */ , - char * /* name_rtrn */ - ); - -#endif /* KEYCODES_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/keymap.c libxkbcommon-0.1.0~2/src/xkbcomp/keymap.c --- libxkbcommon-0.1.0~1/src/xkbcomp/keymap.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/keymap.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,180 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ - -#include "xkbcomp.h" -#include "xkbmisc.h" -#include "tokens.h" -#include "expr.h" -#include "vmod.h" -#include "action.h" -#include "misc.h" -#include "indicators.h" - -#define KEYCODES 0 -#define GEOMETRY 1 -#define TYPES 2 -#define COMPAT 3 -#define SYMBOLS 4 -#define MAX_SECTIONS 5 - -static XkbFile *sections[MAX_SECTIONS]; - -/** - * Compile the given file and store the output in xkb. - * @param file A list of XkbFiles, each denoting one type (e.g. - * XkmKeyNamesIdx, etc.) - */ -Bool -CompileKeymap(XkbFile *file, struct xkb_desc * xkb, unsigned merge) -{ - unsigned have; - Bool ok; - unsigned required, legal; - unsigned mainType; - char *mainName; - LEDInfo *unbound = NULL; - - bzero(sections, MAX_SECTIONS * sizeof(XkbFile *)); - mainType = file->type; - mainName = file->name; - switch (mainType) - { - case XkmSemanticsFile: - required = XkmSemanticsRequired; - legal = XkmSemanticsLegal; - break; - case XkmLayoutFile: /* standard type if setxkbmap -print */ - required = XkmLayoutRequired; - legal = XkmKeymapLegal; - break; - case XkmKeymapFile: - required = XkmKeymapRequired; - legal = XkmKeymapLegal; - break; - default: - ERROR("Cannot compile %s alone into an XKM file\n", - XkbcConfigText(mainType)); - return False; - } - have = 0; - ok = 1; - file = (XkbFile *) file->defs; - /* Check for duplicate entries in the input file */ - while ((file) && (ok)) - { - file->topName = mainName; - if ((have & (1 << file->type)) != 0) - { - ERROR("More than one %s section in a %s file\n", - XkbcConfigText(file->type), XkbcConfigText(mainType)); - ACTION("All sections after the first ignored\n"); - ok = False; - } - else if ((1 << file->type) & (~legal)) - { - ERROR("Cannot define %s in a %s file\n", - XkbcConfigText(file->type), XkbcConfigText(mainType)); - ok = False; - } - else - switch (file->type) - { - case XkmSemanticsFile: - case XkmLayoutFile: - case XkmKeymapFile: - WSGO("Illegal %s configuration in a %s file\n", - XkbcConfigText(file->type), XkbcConfigText(mainType)); - ACTION("Ignored\n"); - ok = False; - break; - case XkmKeyNamesIndex: - sections[KEYCODES] = file; - break; - case XkmTypesIndex: - sections[TYPES] = file; - break; - case XkmSymbolsIndex: - sections[SYMBOLS] = file; - break; - case XkmCompatMapIndex: - sections[COMPAT] = file; - break; - case XkmGeometryIndex: - case XkmGeometryFile: - sections[GEOMETRY] = file; - break; - case XkmVirtualModsIndex: - case XkmIndicatorsIndex: - WSGO("Found an isolated %s section\n", - XkbcConfigText(file->type)); - break; - default: - WSGO("Unknown file type %d\n", file->type); - break; - } - if (ok) - have |= (1 << file->type); - file = (XkbFile *) file->common.next; - } - /* compile the sections we have in the file one-by-one, or fail. */ - if (ok) - { - if (ok && (sections[KEYCODES] != NULL)) - ok = CompileKeycodes(sections[KEYCODES], xkb, MergeOverride); - if (ok && (sections[GEOMETRY] != NULL)) - ok = CompileGeometry(sections[GEOMETRY], xkb, MergeOverride); - if (ok && (sections[TYPES] != NULL)) - ok = CompileKeyTypes(sections[TYPES], xkb, MergeOverride); - if (ok && (sections[COMPAT] != NULL)) - ok = CompileCompatMap(sections[COMPAT], xkb, MergeOverride, - &unbound); - if (ok && (sections[SYMBOLS] != NULL)) - ok = CompileSymbols(sections[SYMBOLS], xkb, MergeOverride); - } - if (!ok) - return False; - xkb->defined = have; - if (required & (~have)) - { - register int i, bit; - unsigned missing; - missing = required & (~have); - for (i = 0, bit = 1; missing != 0; i++, bit <<= 1) - { - if (missing & bit) - { - ERROR("Missing %s section in a %s file\n", - XkbcConfigText(i), XkbcConfigText(mainType)); - missing &= ~bit; - } - } - ACTION("Description of %s not compiled\n", - XkbcConfigText(mainType)); - ok = False; - } - ok = BindIndicators(xkb, True, unbound, NULL); - return ok; -} diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/keytypes.c libxkbcommon-0.1.0~2/src/xkbcomp/keytypes.c --- libxkbcommon-0.1.0~1/src/xkbcomp/keytypes.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/keytypes.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,220 +1,237 @@ /************************************************************ - 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 (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 "xkbcomp.h" -#include "xkballoc.h" -#include "xkbmisc.h" -#include "tokens.h" -#include "expr.h" +#include "xkbcomp-priv.h" +#include "parseutils.h" #include "vmod.h" -#include "action.h" -#include "misc.h" -typedef struct _PreserveInfo -{ - CommonInfo defs; - short matchingMapIndex; - unsigned char indexMods; - unsigned char preMods; - unsigned short indexVMods; - unsigned short preVMods; -} PreserveInfo; - -#define _KT_Name (1<<0) -#define _KT_Mask (1<<1) -#define _KT_Map (1<<2) -#define _KT_Preserve (1<<3) -#define _KT_LevelNames (1<<4) - -typedef struct _KeyTypeInfo -{ - CommonInfo defs; - uint32_t name; - int fileID; - unsigned mask; - unsigned vmask; - Bool groupInfo; - int numLevels; - int nEntries; - int szEntries; - struct xkb_kt_map_entry * entries; - PreserveInfo *preserve; - int szNames; - uint32_t *lvlNames; +/* + * 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 (mandatory for each level in the type): + * level_name[Level1] = "Base"; + * + * Gives each level in this type a descriptive name. It isn't used + * for any thing. + * Note: A level may be specified as Level[1-8] or just a number (can + * be more than 8). + * + * - modifiers statement (mandatory, should be specified only once): + * modifiers = Shift+Lock+LevelThree; + * + * 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 (should have at least as many mappings as there + * are levels in the type): + * map[Shift+LevelThree] = Level4; + * + * 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 map entry matches the active modifiers and the level it + * specified is chosen, then these modifiers are said to be "consumed"; + * for example, in a simple US keymap where the "g" key is assigned an + * ordinary ALPHABETIC key type, if the Lock (Caps Lock) modifier is + * active and the key is pressed, then a "G" keysym is produced (as + * opposed to lower-case "g"). This is because the type definition has + * a map entry like the following: + * map[Lock] = Level2; + * And as such the Lock modifier is consumed. 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 is actually used to choose + * the shift level (as Lock above), 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. The + * right hand side should consists of modifiers from the left hand + * side; these modifiers are then "preserved" and not reported as + * consumed. + * + * Virtual modifier statements + * --------------------------- + * Statements of the form: + * virtual_modifiers LControl; + * + * Can appear in the xkb_types, xkb_compat, xkb_symbols sections. + * TODO + */ + +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 _KeyTypeInfo { + enum type_field defined; + unsigned file_id; + enum merge_mode merge; + struct list entry; + + xkb_atom_t name; + xkb_mod_mask_t mods; + xkb_level_index_t num_levels; + darray(struct xkb_kt_map_entry) entries; + darray(xkb_atom_t) level_names; } KeyTypeInfo; -typedef struct _KeyTypesInfo -{ +typedef struct _KeyTypesInfo { char *name; int errorCount; - int fileID; - unsigned stdPresent; - int nTypes; - KeyTypeInfo *types; - KeyTypeInfo dflt; + unsigned file_id; + unsigned num_types; + struct list types; VModInfo vmods; + struct xkb_keymap *keymap; } KeyTypesInfo; -uint32_t tok_ONE_LEVEL; -uint32_t tok_TWO_LEVEL; -static uint32_t tok_ALPHABETIC; -uint32_t tok_KEYPAD; - /***====================================================================***/ -#define ReportTypeShouldBeArray(t, f) \ - ReportShouldBeArray("key type", (f), TypeTxt(t)) -#define ReportTypeBadType(t, f, w) \ - ReportBadType("key type", (f), TypeTxt(t), (w)) +static inline const char * +MapEntryTxt(KeyTypesInfo *info, struct xkb_kt_map_entry *entry) +{ + return VModMaskText(info->keymap, entry->mods.mods); +} -/***====================================================================***/ +static inline const char * +TypeTxt(KeyTypesInfo *info, KeyTypeInfo *type) +{ + return xkb_atom_text(info->keymap->ctx, type->name); +} + +static inline const char * +TypeMaskTxt(KeyTypesInfo *info, KeyTypeInfo *type) +{ + return VModMaskText(info->keymap, type->mods); +} -#define MapEntryTxt(x, e) \ - XkbcVModMaskText((x), (e)->mods.real_mods, (e)->mods.vmods) -#define PreserveIndexTxt(x, p) \ - XkbcVModMaskText((x), (p)->indexMods, (p)->indexVMods) -#define PreserveTxt(x, p) \ - XkbcVModMaskText((x), (p)->preMods, (p)->preVMods) -#define TypeTxt(t) \ - XkbcAtomText((t)->name) -#define TypeMaskTxt(t, x) \ - XkbcVModMaskText((x), (t)->mask, (t)->vmask) +static inline bool +ReportTypeShouldBeArray(KeyTypesInfo *info, KeyTypeInfo *type, + const char *field) +{ + return ReportShouldBeArray(info->keymap, "key type", field, + TypeTxt(info, type)); +} + +static inline bool +ReportTypeBadType(KeyTypesInfo *info, KeyTypeInfo *type, + const char *field, const char *wanted) +{ + return ReportBadType(info->keymap->ctx, "key type", field, + TypeTxt(info, type), wanted); +} + +static inline bool +ReportTypeBadWidth(KeyTypesInfo *info, const char *type, int has, int needs) +{ + log_err(info->keymap->ctx, + "Key type \"%s\" has %d levels, must have %d; " + "Illegal type definition ignored\n", + type, has, needs); + return false; +} /***====================================================================***/ static void -InitKeyTypesInfo(KeyTypesInfo * info, struct xkb_desc * xkb, KeyTypesInfo * from) +InitKeyTypesInfo(KeyTypesInfo *info, struct xkb_keymap *keymap, + unsigned file_id) { - tok_ONE_LEVEL = xkb_intern_atom("ONE_LEVEL"); - tok_TWO_LEVEL = xkb_intern_atom("TWO_LEVEL"); - tok_ALPHABETIC = xkb_intern_atom("ALPHABETIC"); - tok_KEYPAD = xkb_intern_atom("KEYPAD"); info->name = strdup("default"); info->errorCount = 0; - info->stdPresent = 0; - info->nTypes = 0; - info->types = NULL; - info->dflt.defs.defined = 0; - info->dflt.defs.fileID = 0; - info->dflt.defs.merge = MergeOverride; - info->dflt.defs.next = NULL; - info->dflt.name = None; - info->dflt.mask = 0; - info->dflt.vmask = 0; - info->dflt.groupInfo = False; - info->dflt.numLevels = 1; - info->dflt.nEntries = info->dflt.szEntries = 0; - info->dflt.entries = NULL; - info->dflt.szNames = 0; - info->dflt.lvlNames = NULL; - info->dflt.preserve = NULL; - InitVModInfo(&info->vmods, xkb); - if (from != NULL) - { - info->dflt = from->dflt; - if (from->dflt.entries) - { - info->dflt.entries = uTypedCalloc(from->dflt.szEntries, - struct xkb_kt_map_entry); - if (info->dflt.entries) - { - unsigned sz = from->dflt.nEntries * sizeof(struct xkb_kt_map_entry); - memcpy(info->dflt.entries, from->dflt.entries, sz); - } - } - if (from->dflt.lvlNames) - { - info->dflt.lvlNames = uTypedCalloc(from->dflt.szNames, uint32_t); - if (info->dflt.lvlNames) - { - register unsigned sz = from->dflt.szNames * sizeof(uint32_t); - memcpy(info->dflt.lvlNames, from->dflt.lvlNames, sz); - } - } - if (from->dflt.preserve) - { - PreserveInfo *old, *new, *last; - last = NULL; - old = from->dflt.preserve; - for (; old; old = (PreserveInfo *) old->defs.next) - { - new = uTypedAlloc(PreserveInfo); - if (!new) - return; - *new = *old; - new->defs.next = NULL; - if (last) - last->defs.next = (CommonInfo *) new; - else - info->dflt.preserve = new; - last = new; - } - } - } - return; + info->num_types = 0; + list_init(&info->types); + info->file_id = file_id; + InitVModInfo(&info->vmods, keymap); + info->keymap = keymap; } static void FreeKeyTypeInfo(KeyTypeInfo * type) { - if (type->entries != NULL) - { - free(type->entries); - type->entries = NULL; - } - if (type->lvlNames != NULL) - { - free(type->lvlNames); - type->lvlNames = NULL; - } - if (type->preserve != NULL) - { - ClearCommonInfo(&type->preserve->defs); - type->preserve = NULL; - } - return; + darray_free(type->entries); + darray_free(type->level_names); } static void FreeKeyTypesInfo(KeyTypesInfo * info) { - if (info->name) - free(info->name); + KeyTypeInfo *type, *next_type; + free(info->name); info->name = NULL; - if (info->types) - { - register KeyTypeInfo *type; - for (type = info->types; type; type = (KeyTypeInfo *) type->defs.next) - { - FreeKeyTypeInfo(type); - } - info->types = (KeyTypeInfo *) ClearCommonInfo(&info->types->defs); + list_foreach_safe(type, next_type, &info->types, entry) { + FreeKeyTypeInfo(type); + free(type); } - FreeKeyTypeInfo(&info->dflt); - return; } static KeyTypeInfo * @@ -222,365 +239,191 @@ { KeyTypeInfo *type; - type = uTypedAlloc(KeyTypeInfo); - if (type != NULL) - { - bzero(type, sizeof(KeyTypeInfo)); - type->defs.fileID = info->fileID; - info->types = (KeyTypeInfo *) AddCommonInfo(&info->types->defs, - (CommonInfo *) type); - info->nTypes++; - } + type = calloc(1, sizeof(*type)); + if (!type) + return NULL; + + type->file_id = info->file_id; + + list_append(&type->entry, &info->types); + info->num_types++; return type; } static KeyTypeInfo * -FindMatchingKeyType(KeyTypesInfo * info, KeyTypeInfo * new) +FindMatchingKeyType(KeyTypesInfo *info, xkb_atom_t name) { KeyTypeInfo *old; - for (old = info->types; old; old = (KeyTypeInfo *) old->defs.next) - { - if (old->name == new->name) + list_foreach(old, &info->types, entry) + if (old->name == name) return old; - } - return NULL; -} -static Bool -ReportTypeBadWidth(const char *type, int has, int needs) -{ - ERROR("Key type \"%s\" has %d levels, must have %d\n", type, has, needs); - ACTION("Illegal type definition ignored\n"); - return False; + return NULL; } -static Bool -AddKeyType(struct xkb_desc * xkb, KeyTypesInfo * info, KeyTypeInfo * new) +static bool +AddKeyType(KeyTypesInfo *info, KeyTypeInfo *new) { KeyTypeInfo *old; + struct list entry; + int verbosity = xkb_get_log_verbosity(info->keymap->ctx); - if (new->name == tok_ONE_LEVEL) - { - if (new->numLevels > 1) - return ReportTypeBadWidth("ONE_LEVEL", new->numLevels, 1); - info->stdPresent |= XkbOneLevelMask; - } - else if (new->name == tok_TWO_LEVEL) - { - if (new->numLevels > 2) - return ReportTypeBadWidth("TWO_LEVEL", new->numLevels, 2); - else if (new->numLevels < 2) - new->numLevels = 2; - info->stdPresent |= XkbTwoLevelMask; - } - else if (new->name == tok_ALPHABETIC) - { - if (new->numLevels > 2) - return ReportTypeBadWidth("ALPHABETIC", new->numLevels, 2); - else if (new->numLevels < 2) - new->numLevels = 2; - info->stdPresent |= XkbAlphabeticMask; - } - else if (new->name == tok_KEYPAD) - { - if (new->numLevels > 2) - return ReportTypeBadWidth("KEYPAD", new->numLevels, 2); - else if (new->numLevels < 2) - new->numLevels = 2; - info->stdPresent |= XkbKeypadMask; - } - - old = FindMatchingKeyType(info, new); - if (old != NULL) - { - Bool report; - if ((new->defs.merge == MergeReplace) - || (new->defs.merge == MergeOverride)) - { - KeyTypeInfo *next = (KeyTypeInfo *) old->defs.next; - if (((old->defs.fileID == new->defs.fileID) - && (warningLevel > 0)) || (warningLevel > 9)) - { - WARN("Multiple definitions of the %s key type\n", - XkbcAtomText(new->name)); - ACTION("Earlier definition ignored\n"); + old = FindMatchingKeyType(info, new->name); + if (old) { + if (new->merge == MERGE_REPLACE || new->merge == MERGE_OVERRIDE) { + if ((old->file_id == new->file_id && verbosity > 0) || + verbosity > 9) { + log_warn(info->keymap->ctx, + "Multiple definitions of the %s key type; " + "Earlier definition ignored\n", + xkb_atom_text(info->keymap->ctx, new->name)); } + + entry = old->entry; FreeKeyTypeInfo(old); *old = *new; - new->szEntries = new->nEntries = 0; - new->entries = NULL; - new->preserve = NULL; - new->lvlNames = NULL; - old->defs.next = &next->defs; - return True; - } - report = (old->defs.fileID == new->defs.fileID) && (warningLevel > 0); - if (report) - { - WARN("Multiple definitions of the %s key type\n", - XkbcAtomText(new->name)); - ACTION("Later definition ignored\n"); + old->entry = entry; + darray_init(new->entries); + darray_init(new->level_names); + return true; } + + if (old->file_id == new->file_id) + log_lvl(info->keymap->ctx, 4, + "Multiple definitions of the %s key type; " + "Later definition ignored\n", + xkb_atom_text(info->keymap->ctx, new->name)); + FreeKeyTypeInfo(new); - return True; + return true; } + old = NextKeyType(info); - if (old == NULL) - return False; + if (!old) + return false; + + entry = old->entry; *old = *new; - old->defs.next = NULL; - new->nEntries = new->szEntries = 0; - new->entries = NULL; - new->szNames = 0; - new->lvlNames = NULL; - new->preserve = NULL; - return True; + old->entry = entry; + darray_init(new->entries); + darray_init(new->level_names); + return true; } /***====================================================================***/ static void -MergeIncludedKeyTypes(KeyTypesInfo * into, - KeyTypesInfo * from, unsigned merge, struct xkb_desc * xkb) +MergeIncludedKeyTypes(KeyTypesInfo *into, KeyTypesInfo *from, + enum merge_mode merge) { - KeyTypeInfo *type; + KeyTypeInfo *type, *next_type; - if (from->errorCount > 0) - { + if (from->errorCount > 0) { into->errorCount += from->errorCount; return; } - if (into->name == NULL) - { + + if (into->name == NULL) { into->name = from->name; from->name = NULL; } - for (type = from->types; type; type = (KeyTypeInfo *) type->defs.next) - { - if (merge != MergeDefault) - type->defs.merge = merge; - if (!AddKeyType(xkb, into, type)) + + list_foreach_safe(type, next_type, &from->types, entry) { + type->merge = (merge == MERGE_DEFAULT ? type->merge : merge); + if (!AddKeyType(into, type)) into->errorCount++; } - into->stdPresent |= from->stdPresent; - return; } -typedef void (*FileHandler) (XkbFile * /* file */ , - struct xkb_desc * /* xkb */ , - unsigned /* merge */ , - KeyTypesInfo * /* included */ - ); +static void +HandleKeyTypesFile(KeyTypesInfo *info, XkbFile *file, enum merge_mode merge); -static Bool -HandleIncludeKeyTypes(IncludeStmt * stmt, - struct xkb_desc * xkb, KeyTypesInfo * info, FileHandler hndlr) +static bool +HandleIncludeKeyTypes(KeyTypesInfo *info, IncludeStmt *stmt) { - unsigned newMerge; + enum merge_mode merge = MERGE_DEFAULT; XkbFile *rtrn; - KeyTypesInfo included; - Bool haveSelf; + KeyTypesInfo included, next_incl; - haveSelf = False; - if ((stmt->file == NULL) && (stmt->map == NULL)) - { - haveSelf = True; - included = *info; - bzero(info, sizeof(KeyTypesInfo)); - } - else if (ProcessIncludeFile(stmt, XkmTypesIndex, &rtrn, &newMerge)) - { - InitKeyTypesInfo(&included, xkb, info); - included.fileID = included.dflt.defs.fileID = rtrn->id; - included.dflt.defs.merge = newMerge; - - (*hndlr) (rtrn, xkb, newMerge, &included); - if (stmt->stmt != NULL) - { - if (included.name != NULL) - free(included.name); - included.name = stmt->stmt; - stmt->stmt = NULL; - } + InitKeyTypesInfo(&included, info->keymap, info->file_id); + if (stmt->stmt) { + free(included.name); + included.name = stmt->stmt; + stmt->stmt = NULL; } - else - { - info->errorCount += 10; - return False; - } - if ((stmt->next != NULL) && (included.errorCount < 1)) - { - IncludeStmt *next; - unsigned op; - KeyTypesInfo next_incl; - - for (next = stmt->next; next != NULL; next = next->next) - { - if ((next->file == NULL) && (next->map == NULL)) - { - haveSelf = True; - MergeIncludedKeyTypes(&included, info, next->merge, xkb); - FreeKeyTypesInfo(info); - } - else if (ProcessIncludeFile(next, XkmTypesIndex, &rtrn, &op)) - { - InitKeyTypesInfo(&next_incl, xkb, &included); - next_incl.fileID = next_incl.dflt.defs.fileID = rtrn->id; - next_incl.dflt.defs.merge = op; - (*hndlr) (rtrn, xkb, op, &next_incl); - MergeIncludedKeyTypes(&included, &next_incl, op, xkb); - FreeKeyTypesInfo(&next_incl); - } - else - { - info->errorCount += 10; - return False; - } + + for (; stmt; stmt = stmt->next_incl) { + if (!ProcessIncludeFile(info->keymap->ctx, stmt, FILE_TYPE_TYPES, + &rtrn, &merge)) { + info->errorCount += 10; + FreeKeyTypesInfo(&included); + return false; } - } - if (haveSelf) - *info = included; - else - { - MergeIncludedKeyTypes(info, &included, newMerge, xkb); - FreeKeyTypesInfo(&included); - } - return (info->errorCount == 0); -} -/***====================================================================***/ + InitKeyTypesInfo(&next_incl, info->keymap, rtrn->id); -static struct xkb_kt_map_entry * -FindMatchingMapEntry(KeyTypeInfo * type, unsigned mask, unsigned vmask) -{ - register int i; - struct xkb_kt_map_entry * entry; + HandleKeyTypesFile(&next_incl, rtrn, merge); - for (i = 0, entry = type->entries; i < type->nEntries; i++, entry++) - { - if ((entry->mods.real_mods == mask) && (entry->mods.vmods == vmask)) - return entry; + MergeIncludedKeyTypes(&included, &next_incl, merge); + + FreeKeyTypesInfo(&next_incl); + FreeXKBFile(rtrn); } - return NULL; + + MergeIncludedKeyTypes(info, &included, merge); + FreeKeyTypesInfo(&included); + + return (info->errorCount == 0); } -static void -DeleteLevel1MapEntries(KeyTypeInfo * type) -{ - register int i, n; +/***====================================================================***/ - for (i = 0; i < type->nEntries; i++) - { - if (type->entries[i].level == 0) - { - for (n = i; n < type->nEntries - 1; n++) - { - type->entries[n] = type->entries[n + 1]; - } - type->nEntries--; - } +static bool +SetModifiers(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, + ExprDef *value) +{ + xkb_mod_mask_t mods; + + if (arrayNdx) + log_warn(info->keymap->ctx, + "The modifiers field of a key type is not an array; " + "Illegal array subscript ignored\n"); + + /* get modifier mask for current type */ + if (!ExprResolveVModMask(info->keymap, value, &mods)) { + log_err(info->keymap->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->keymap->ctx, + "Multiple modifier mask definitions for key type %s; " + "Using %s, ignoring %s\n", + xkb_atom_text(info->keymap->ctx, type->name), + TypeMaskTxt(info, type), + VModMaskText(info->keymap, mods)); + return false; } - return; + + type->mods = mods; + return true; } -/** - * Return a pointer to the next free XkbcKTMapEntry, reallocating space if - * necessary. - */ +/***====================================================================***/ + static struct xkb_kt_map_entry * -NextMapEntry(KeyTypeInfo * type) +FindMatchingMapEntry(KeyTypeInfo *type, xkb_mod_mask_t mods) { - if (type->entries == NULL) - { - type->entries = uTypedCalloc(2, struct xkb_kt_map_entry); - if (type->entries == NULL) - { - ERROR("Couldn't allocate map entries for %s\n", TypeTxt(type)); - ACTION("Map entries lost\n"); - return NULL; - } - type->szEntries = 2; - type->nEntries = 0; - } - else if (type->nEntries >= type->szEntries) - { - type->szEntries *= 2; - type->entries = uTypedRecalloc(type->entries, - type->nEntries, type->szEntries, - struct xkb_kt_map_entry); - if (type->entries == NULL) - { - ERROR("Couldn't reallocate map entries for %s\n", TypeTxt(type)); - ACTION("Map entries lost\n"); - return NULL; - } - } - return &type->entries[type->nEntries++]; -} + struct xkb_kt_map_entry *entry; -static Bool -AddPreserve(struct xkb_desc * xkb, - KeyTypeInfo * type, PreserveInfo * new, Bool clobber, Bool report) -{ - PreserveInfo *old; - - old = type->preserve; - while (old != NULL) - { - if ((old->indexMods != new->indexMods) || - (old->indexVMods != new->indexVMods)) - { - old = (PreserveInfo *) old->defs.next; - continue; - } - if ((old->preMods == new->preMods) - && (old->preVMods == new->preVMods)) - { - if (warningLevel > 9) - { - WARN("Identical definitions for preserve[%s] in %s\n", - PreserveIndexTxt(xkb, old), TypeTxt(type)); - ACTION("Ignored\n"); - } - return True; - } - if (report && (warningLevel > 0)) - { - char *str; - WARN("Multiple definitions for preserve[%s] in %s\n", - PreserveIndexTxt(xkb, old), TypeTxt(type)); - - if (clobber) - str = PreserveTxt(xkb, new); - else - str = PreserveTxt(xkb, old); - ACTION("Using %s, ", str); - if (clobber) - str = PreserveTxt(xkb, old); - else - str = PreserveTxt(xkb, new); - INFO("ignoring %s\n", str); - } - if (clobber) - { - old->preMods = new->preMods; - old->preVMods = new->preVMods; - } - return True; - } - old = uTypedAlloc(PreserveInfo); - if (!old) - { - WSGO("Couldn't allocate preserve in %s\n", TypeTxt(type)); - ACTION("Preserve[%s] lost\n", PreserveIndexTxt(xkb, old)); - return False; - } - *old = *new; - old->matchingMapIndex = -1; - type->preserve = - (PreserveInfo *) AddCommonInfo(&type->preserve->defs, &old->defs); - return True; + darray_foreach(entry, type->entries) + if (entry->mods.mods == mods) + return entry; + + return NULL; } /** @@ -589,259 +432,257 @@ * entry is created. * * @param clobber Overwrite existing entry. - * @param report True if a warning is to be printed on. + * @param report true if a warning is to be printed on. */ -static Bool -AddMapEntry(struct xkb_desc * xkb, - KeyTypeInfo * type, - struct xkb_kt_map_entry * new, Bool clobber, Bool report) +static bool +AddMapEntry(KeyTypesInfo *info, KeyTypeInfo *type, + struct xkb_kt_map_entry *new, bool clobber, bool report) { struct xkb_kt_map_entry * old; - if ((old = - FindMatchingMapEntry(type, new->mods.real_mods, new->mods.vmods))) - { - if (report && (old->level != new->level)) - { - unsigned use, ignore; - if (clobber) - { - use = new->level + 1; - ignore = old->level + 1; - } - else - { - use = old->level + 1; - ignore = new->level + 1; - } - WARN("Multiple map entries for %s in %s\n", - MapEntryTxt(xkb, new), TypeTxt(type)); - ACTION("Using %d, ignoring %d\n", use, ignore); - } - else if (warningLevel > 9) - { - WARN("Multiple occurences of map[%s]= %d in %s\n", - MapEntryTxt(xkb, new), new->level + 1, TypeTxt(type)); - ACTION("Ignored\n"); - return True; - } - if (clobber) + old = FindMatchingMapEntry(type, new->mods.mods); + if (old) { + if (report && old->level != new->level) { + log_warn(info->keymap->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_lvl(info->keymap->ctx, 10, + "Multiple occurences 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; + } + + return true; } - if ((old = NextMapEntry(type)) == NULL) - return False; /* allocation failure, already reported */ - if (new->level >= type->numLevels) - type->numLevels = new->level + 1; - if (new->mods.vmods == 0) - old->active = True; - else - old->active = False; - old->mods.mask = new->mods.real_mods; - old->mods.real_mods = new->mods.real_mods; - old->mods.vmods = new->mods.vmods; - old->level = new->level; - return True; -} - -static LookupEntry lnames[] = { - {"level1", 1}, - {"level2", 2}, - {"level3", 3}, - {"level4", 4}, - {"level5", 5}, - {"level6", 6}, - {"level7", 7}, - {"level8", 8}, - {NULL, 0} -}; -static Bool -SetMapEntry(KeyTypeInfo * type, - struct xkb_desc * xkb, ExprDef * arrayNdx, ExprDef * value) + 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) { - ExprResult rtrn; struct xkb_kt_map_entry entry; if (arrayNdx == NULL) - return ReportTypeShouldBeArray(type, "map entry"); - if (!ExprResolveModMask(arrayNdx, &rtrn, LookupVModMask, (char *) xkb)) - return ReportTypeBadType(type, "map entry", "modifier mask"); - entry.mods.real_mods = rtrn.uval & 0xff; /* modifiers < 512 */ - entry.mods.vmods = (rtrn.uval >> 8) & 0xffff; /* modifiers > 512 */ - if ((entry.mods.real_mods & (~type->mask)) || - ((entry.mods.vmods & (~type->vmask)) != 0)) - { - if (warningLevel > 0) - { - WARN("Map entry for unused modifiers in %s\n", TypeTxt(type)); - ACTION("Using %s instead of ", - XkbcVModMaskText(xkb, - entry.mods.real_mods & type->mask, - entry.mods.vmods & type->vmask)); - INFO("%s\n", MapEntryTxt(xkb, &entry)); - } - entry.mods.real_mods &= type->mask; - entry.mods.vmods &= type->vmask; + return ReportTypeShouldBeArray(info, type, "map entry"); + + if (!ExprResolveVModMask(info->keymap, arrayNdx, &entry.mods.mods)) + return ReportTypeBadType(info, type, "map entry", "modifier mask"); + + if (entry.mods.mods & (~type->mods)) { + log_lvl(info->keymap->ctx, 1, + "Map entry for unused modifiers in %s; " + "Using %s instead of %s\n", + TypeTxt(info, type), + VModMaskText(info->keymap, entry.mods.mods & type->mods), + MapEntryTxt(info, &entry)); + entry.mods.mods &= type->mods; } - if (!ExprResolveInteger(value, &rtrn, SimpleLookup, (char *) lnames)) - { - ERROR("Level specifications in a key type must be integer\n"); - ACTION("Ignoring malformed level specification\n"); - return False; - } - if ((rtrn.ival < 1) || (rtrn.ival > XkbMaxShiftLevel + 1)) - { - ERROR("Shift level %d out of range (1..%d) in key type %s\n", - XkbMaxShiftLevel + 1, rtrn.ival, TypeTxt(type)); - ACTION("Ignoring illegal definition of map[%s]\n", - MapEntryTxt(xkb, &entry)); - return False; - } - entry.level = rtrn.ival - 1; - return AddMapEntry(xkb, type, &entry, True, True); -} - -static Bool -SetPreserve(KeyTypeInfo * type, - struct xkb_desc * xkb, ExprDef * arrayNdx, ExprDef * value) -{ - ExprResult rtrn; - PreserveInfo new; - if (arrayNdx == NULL) - return ReportTypeShouldBeArray(type, "preserve entry"); - if (!ExprResolveModMask(arrayNdx, &rtrn, LookupVModMask, (char *) xkb)) - return ReportTypeBadType(type, "preserve entry", "modifier mask"); - new.defs = type->defs; - new.defs.next = NULL; - new.indexMods = rtrn.uval & 0xff; - new.indexVMods = (rtrn.uval >> 8) & 0xffff; - if ((new.indexMods & (~type->mask)) || (new.indexVMods & (~type->vmask))) - { - if (warningLevel > 0) - { - WARN("Preserve for modifiers not used by the %s type\n", - TypeTxt(type)); - ACTION("Index %s converted to ", PreserveIndexTxt(xkb, &new)); - } - new.indexMods &= type->mask; - new.indexVMods &= type->vmask; - if (warningLevel > 0) - INFO("%s\n", PreserveIndexTxt(xkb, &new)); - } - if (!ExprResolveModMask(value, &rtrn, LookupVModMask, (char *) xkb)) - { - ERROR("Preserve value in a key type is not a modifier mask\n"); - ACTION("Ignoring preserve[%s] in type %s\n", - PreserveIndexTxt(xkb, &new), TypeTxt(type)); - return False; - } - new.preMods = rtrn.uval & 0xff; - new.preVMods = (rtrn.uval >> 16) & 0xffff; - if ((new.preMods & (~new.indexMods)) - || (new.preVMods && (~new.indexVMods))) - { - if (warningLevel > 0) - { - WARN("Illegal value for preserve[%s] in type %s\n", - PreserveTxt(xkb, &new), TypeTxt(type)); - ACTION("Converted %s to ", PreserveIndexTxt(xkb, &new)); - } - new.preMods &= new.indexMods; - new.preVMods &= new.indexVMods; - if (warningLevel > 0) - { - INFO("%s\n", PreserveIndexTxt(xkb, &new)); - } + if (!ExprResolveLevel(info->keymap->ctx, value, &entry.level)) { + log_err(info->keymap->ctx, + "Level specifications in a key type must be integer; " + "Ignoring malformed level specification\n"); + return false; } - return AddPreserve(xkb, type, &new, True, True); + + entry.preserve.mods = 0; + + return AddMapEntry(info, type, &entry, true, true); } /***====================================================================***/ -static Bool -AddLevelName(KeyTypeInfo * type, - unsigned level, uint32_t name, Bool clobber, Bool report) -{ - if ((type->lvlNames == NULL) || (type->szNames <= level)) - { - type->lvlNames = - uTypedRecalloc(type->lvlNames, type->szNames, level + 1, uint32_t); - if (type->lvlNames == NULL) - { - ERROR("Couldn't allocate level names for type %s\n", - TypeTxt(type)); - ACTION("Level names lost\n"); - type->szNames = 0; - return False; - } - type->szNames = level + 1; +static bool +AddPreserve(KeyTypesInfo *info, KeyTypeInfo *type, + xkb_mod_mask_t mods, xkb_mod_mask_t preserve_mods) +{ + struct xkb_kt_map_entry *entry; + struct xkb_kt_map_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_lvl(info->keymap->ctx, 10, + "Identical definitions for preserve[%s] in %s; " + "Ignored\n", + VModMaskText(info->keymap, mods), + TypeTxt(info, type)); + return true; + } + + /* Map exists with different preserve; latter wins. */ + log_lvl(info->keymap->ctx, 1, + "Multiple definitions for preserve[%s] in %s; " + "Using %s, ignoring %s\n", + VModMaskText(info->keymap, mods), + TypeTxt(info, type), + VModMaskText(info->keymap, preserve_mods), + VModMaskText(info->keymap, 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 overriden 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 (!ExprResolveVModMask(info->keymap, arrayNdx, &mods)) + return ReportTypeBadType(info, type, "preserve entry", + "modifier mask"); + + if (mods & ~type->mods) { + const char *before, *after; + + before = VModMaskText(info->keymap, mods); + mods &= type->mods; + after = VModMaskText(info->keymap, mods); + + log_lvl(info->keymap->ctx, 1, + "Preserve for modifiers not used by the %s type; " + "Index %s converted to %s\n", + TypeTxt(info, type), before, after); } - else if (type->lvlNames[level] == name) - { - if (warningLevel > 9) - { - WARN("Duplicate names for level %d of key type %s\n", - level + 1, TypeTxt(type)); - ACTION("Ignored\n"); - } - return True; + + if (!ExprResolveVModMask(info->keymap, value, &preserve_mods)) { + log_err(info->keymap->ctx, + "Preserve value in a key type is not a modifier mask; " + "Ignoring preserve[%s] in type %s\n", + VModMaskText(info->keymap, mods), + TypeTxt(info, type)); + return false; } - else if (type->lvlNames[level] != None) - { - if (warningLevel > 0) - { - const char *old, *new; - old = XkbcAtomText(type->lvlNames[level]); - new = XkbcAtomText(name); - WARN("Multiple names for level %d of key type %s\n", - level + 1, TypeTxt(type)); - if (clobber) - ACTION("Using %s, ignoring %s\n", new, old); - else - ACTION("Using %s, ignoring %s\n", old, new); - } + + if (preserve_mods & ~mods) { + const char *before, *after; + + before = VModMaskText(info->keymap, preserve_mods); + preserve_mods &= mods; + after = VModMaskText(info->keymap, preserve_mods); + + log_lvl(info->keymap->ctx, 1, + "Illegal value for preserve[%s] in type %s; " + "Converted %s to %s\n", + VModMaskText(info->keymap, 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_lvl(info->keymap->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->keymap->ctx, + darray_item(type->level_names, level)); + new = xkb_atom_text(info->keymap->ctx, name); + log_lvl(info->keymap->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; + return true; } - if (level >= type->numLevels) - type->numLevels = level + 1; - type->lvlNames[level] = name; - return True; + + /* XXX: What about different level, same name? */ + +finish: + darray_item(type->level_names, level) = name; + return true; } -static Bool -SetLevelName(KeyTypeInfo * type, ExprDef * arrayNdx, ExprDef * value) +static bool +SetLevelName(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, + ExprDef *value) { - ExprResult rtrn; - unsigned level; - uint32_t level_name; + xkb_level_index_t level; + xkb_atom_t level_name; + struct xkb_context *ctx = info->keymap->ctx; + const char *str; if (arrayNdx == NULL) - return ReportTypeShouldBeArray(type, "level name"); - if (!ExprResolveInteger(arrayNdx, &rtrn, SimpleLookup, (char *) lnames)) - return ReportTypeBadType(type, "level name", "integer"); - if ((rtrn.ival < 1) || (rtrn.ival > XkbMaxShiftLevel + 1)) - { - ERROR("Level name %d out of range (1..%d) in key type %s\n", - rtrn.ival, - XkbMaxShiftLevel + 1, - XkbcAtomText(type->name)); - ACTION("Ignoring illegal level name definition\n"); - return False; - } - level = rtrn.ival - 1; - if (!ExprResolveString(value, &rtrn, NULL, NULL)) - { - ERROR("Non-string name for level %d in key type %s\n", level + 1, - XkbcAtomText(type->name)); - ACTION("Ignoring illegal level name definition\n"); - return False; - } - level_name = xkb_intern_atom(rtrn.str); - free(rtrn.str); - return AddLevelName(type, level, level_name, True, True); + return ReportTypeShouldBeArray(info, type, "level name"); + + if (!ExprResolveLevel(ctx, arrayNdx, &level)) + return ReportTypeBadType(info, type, "level name", "integer"); + + if (!ExprResolveString(ctx, value, &str)) { + log_err(info->keymap->ctx, + "Non-string name for level %d in key type %s; " + "Ignoring illegal level name definition\n", + level + 1, xkb_atom_text(ctx, type->name)); + return false; + } + + level_name = xkb_atom_intern(ctx, str); + + return AddLevelName(info, type, level, level_name, true); } /***====================================================================***/ @@ -851,110 +692,61 @@ * * @param field The field to parse (e.g. modifiers, map, level_name) */ -static Bool -SetKeyTypeField(KeyTypeInfo * type, - struct xkb_desc * xkb, - char *field, - ExprDef * arrayNdx, ExprDef * value, KeyTypesInfo * info) -{ - ExprResult tmp; - - if (uStrCaseCmp(field, "modifiers") == 0) - { - unsigned mods, vmods; - if (arrayNdx != NULL) - { - WARN("The modifiers field of a key type is not an array\n"); - ACTION("Illegal array subscript ignored\n"); - } - /* get modifier mask for current type */ - if (!ExprResolveModMask(value, &tmp, LookupVModMask, (char *) xkb)) - { - ERROR("Key type mask field must be a modifier mask\n"); - ACTION("Key type definition ignored\n"); - return False; - } - mods = tmp.uval & 0xff; /* core mods */ - vmods = (tmp.uval >> 8) & 0xffff; /* xkb virtual mods */ - if (type->defs.defined & _KT_Mask) - { - WARN("Multiple modifier mask definitions for key type %s\n", - XkbcAtomText(type->name)); - ACTION("Using %s, ", TypeMaskTxt(type, xkb)); - INFO("ignoring %s\n", XkbcVModMaskText(xkb, mods, vmods)); - return False; - } - type->mask = mods; - type->vmask = vmods; - type->defs.defined |= _KT_Mask; - return True; - } - else if (uStrCaseCmp(field, "map") == 0) - { - type->defs.defined |= _KT_Map; - return SetMapEntry(type, xkb, arrayNdx, value); - } - else if (uStrCaseCmp(field, "preserve") == 0) - { - type->defs.defined |= _KT_Preserve; - return SetPreserve(type, xkb, arrayNdx, value); - } - else if ((uStrCaseCmp(field, "levelname") == 0) || - (uStrCaseCmp(field, "level_name") == 0)) - { - type->defs.defined |= _KT_LevelNames; - return SetLevelName(type, arrayNdx, value); - } - ERROR("Unknown field %s in key type %s\n", field, TypeTxt(type)); - ACTION("Definition ignored\n"); - return False; +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->keymap->ctx, + "Unknown field %s in key type %s; Definition ignored\n", + field, TypeTxt(info, type)); + } + + type->defined |= type_field; + return ok; } -static Bool -HandleKeyTypeVar(VarDef * stmt, struct xkb_desc * xkb, KeyTypesInfo * info) +static bool +HandleKeyTypeBody(KeyTypesInfo *info, VarDef *def, KeyTypeInfo *type) { - ExprResult elem, field; + bool ok = true; + const char *elem, *field; ExprDef *arrayNdx; - if (!ExprResolveLhs(stmt->name, &elem, &field, &arrayNdx)) - return False; /* internal error, already reported */ - if (elem.str && (uStrCaseCmp(elem.str, "type") == 0)) - return SetKeyTypeField(&info->dflt, xkb, field.str, arrayNdx, - stmt->value, info); - if (elem.str != NULL) - { - ERROR("Default for unknown element %s\n", uStringText(elem.str)); - ACTION("Value for field %s ignored\n", uStringText(field.str)); - } - else if (field.str != NULL) - { - ERROR("Default defined for unknown field %s\n", - uStringText(field.str)); - ACTION("Ignored\n"); - } - return False; -} - -static int -HandleKeyTypeBody(VarDef * def, - struct xkb_desc * xkb, KeyTypeInfo * type, KeyTypesInfo * info) -{ - int ok = 1; - ExprResult tmp, field; - ExprDef *arrayNdx; + for (; def; def = (VarDef *) def->common.next) { + ok = ExprResolveLhs(info->keymap->ctx, def->name, &elem, &field, + &arrayNdx); + if (!ok) + continue; - for (; def != NULL; def = (VarDef *) def->common.next) - { - if ((def->name) && (def->name->type == ExprFieldRef)) - { - ok = HandleKeyTypeVar(def, xkb, info); + if (elem && istreq(elem, "type")) { + log_err(info->keymap->ctx, + "Support for changing the default type has been removed; " + "Statement ignored\n"); continue; } - ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx); - if (ok) - ok = SetKeyTypeField(type, xkb, field.str, arrayNdx, def->value, - info); + + ok = SetKeyTypeField(info, type, field, arrayNdx, def->value); } + return ok; } @@ -962,301 +754,155 @@ * Process a type "XYZ" { } specification in the xkb_types section. * */ -static int -HandleKeyTypeDef(KeyTypeDef * def, - struct xkb_desc * xkb, unsigned merge, KeyTypesInfo * info) -{ - register int i; - KeyTypeInfo type; - - if (def->merge != MergeDefault) - merge = def->merge; - - type.defs.defined = 0; - type.defs.fileID = info->fileID; - type.defs.merge = merge; - type.defs.next = NULL; - type.name = def->name; - type.mask = info->dflt.mask; - type.vmask = info->dflt.vmask; - type.groupInfo = info->dflt.groupInfo; - type.numLevels = 1; - type.nEntries = type.szEntries = 0; - type.entries = NULL; - type.szNames = 0; - type.lvlNames = NULL; - type.preserve = NULL; +static bool +HandleKeyTypeDef(KeyTypesInfo *info, KeyTypeDef *def, enum merge_mode merge) +{ + KeyTypeInfo type = { + .defined = 0, + .file_id = info->file_id, + .merge = (def->merge == MERGE_DEFAULT ? merge : def->merge), + .name = def->name, + .mods = 0, + .num_levels = 1, + .entries = darray_new(), + .level_names = darray_new(), + }; /* Parse the actual content. */ - if (!HandleKeyTypeBody(def->body, xkb, &type, info)) - { + if (!HandleKeyTypeBody(info, def->body, &type)) { info->errorCount++; - return False; + return false; } - /* now copy any appropriate map, preserve or level names from the */ - /* default type */ - for (i = 0; i < info->dflt.nEntries; i++) - { - struct xkb_kt_map_entry * dflt; - dflt = &info->dflt.entries[i]; - if (((dflt->mods.real_mods & type.mask) == dflt->mods.real_mods) && - ((dflt->mods.vmods & type.vmask) == dflt->mods.vmods)) - { - AddMapEntry(xkb, &type, dflt, False, False); - } - } - if (info->dflt.preserve) - { - PreserveInfo *dflt = info->dflt.preserve; - while (dflt) - { - if (((dflt->indexMods & type.mask) == dflt->indexMods) && - ((dflt->indexVMods & type.vmask) == dflt->indexVMods)) - { - AddPreserve(xkb, &type, dflt, False, False); - } - dflt = (PreserveInfo *) dflt->defs.next; - } - } - for (i = 0; i < info->dflt.szNames; i++) - { - if ((i < type.numLevels) && (info->dflt.lvlNames[i] != None)) - { - AddLevelName(&type, i, info->dflt.lvlNames[i], False, False); - } - } /* Now add the new keytype to the info struct */ - if (!AddKeyType(xkb, info, &type)) - { + if (!AddKeyType(info, &type)) { info->errorCount++; - return False; + return false; } - return True; + + return true; } /** * Process an xkb_types section. * * @param file The parsed xkb_types section. - * @param merge Merge Strategy (e.g. MergeOverride) + * @param merge Merge Strategy (e.g. MERGE_OVERRIDE) * @param info Pointer to memory where the outcome will be stored. */ static void -HandleKeyTypesFile(XkbFile * file, - struct xkb_desc * xkb, unsigned merge, KeyTypesInfo * info) +HandleKeyTypesFile(KeyTypesInfo *info, XkbFile *file, enum merge_mode merge) { + bool ok; ParseCommon *stmt; - info->name = _XkbDupString(file->name); - stmt = file->defs; - while (stmt) - { - switch (stmt->stmtType) - { - case StmtInclude: - if (!HandleIncludeKeyTypes((IncludeStmt *) stmt, xkb, info, - HandleKeyTypesFile)) - info->errorCount++; - break; - case StmtKeyTypeDef: /* e.g. type "ONE_LEVEL" */ - if (!HandleKeyTypeDef((KeyTypeDef *) stmt, xkb, merge, info)) - info->errorCount++; - break; - case StmtVarDef: - if (!HandleKeyTypeVar((VarDef *) stmt, xkb, info)) - info->errorCount++; - break; - case StmtVModDef: /* virtual_modifiers NumLock, ... */ - if (!HandleVModDef((VModDef *) stmt, merge, &info->vmods)) - info->errorCount++; + free(info->name); + info->name = strdup_safe(file->name); + + for (stmt = file->defs; stmt; stmt = stmt->next) { + switch (stmt->type) { + case STMT_INCLUDE: + ok = HandleIncludeKeyTypes(info, (IncludeStmt *) stmt); break; - case StmtKeyAliasDef: - ERROR("Key type files may not include other declarations\n"); - ACTION("Ignoring definition of key alias\n"); - info->errorCount++; + case STMT_TYPE: /* e.g. type "ONE_LEVEL" */ + ok = HandleKeyTypeDef(info, (KeyTypeDef *) stmt, merge); break; - case StmtKeycodeDef: - ERROR("Key type files may not include other declarations\n"); - ACTION("Ignoring definition of key name\n"); - info->errorCount++; + case STMT_VAR: + log_err(info->keymap->ctx, + "Support for changing the default type has been removed; " + "Statement ignored\n"); + ok = true; break; - case StmtInterpDef: - ERROR("Key type files may not include other declarations\n"); - ACTION("Ignoring definition of symbol interpretation\n"); - info->errorCount++; + case STMT_VMOD: /* virtual_modifiers NumLock, ... */ + ok = HandleVModDef((VModDef *) stmt, info->keymap, merge, + &info->vmods); break; default: - WSGO("Unexpected statement type %d in HandleKeyTypesFile\n", - stmt->stmtType); + log_err(info->keymap->ctx, + "Key type files may not include other declarations; " + "Ignoring %s\n", StmtTypeToString(stmt->type)); + ok = false; break; } - stmt = stmt->next; - if (info->errorCount > 10) - { -#ifdef NOISY - ERROR("Too many errors\n"); -#endif - ACTION("Abandoning keytypes file \"%s\"\n", file->topName); + + if (!ok) + info->errorCount++; + + if (info->errorCount > 10) { + log_err(info->keymap->ctx, + "Abandoning keytypes file \"%s\"\n", file->topName); break; } } - return; } -static Bool -CopyDefToKeyType(struct xkb_desc * xkb, struct xkb_key_type * type, KeyTypeInfo * def) +static bool +CopyDefToKeyType(KeyTypesInfo *info, KeyTypeInfo *def, + struct xkb_key_type *type) +{ + type->mods.mods = def->mods; + type->num_levels = def->num_levels; + type->map = darray_mem(def->entries, 0); + type->num_entries = darray_size(def->entries); + darray_init(def->entries); + type->name = def->name; + type->level_names = darray_mem(def->level_names, 0); + darray_init(def->level_names); + + return true; +} + +bool +CompileKeyTypes(XkbFile *file, struct xkb_keymap *keymap, + enum merge_mode merge) { - register int i; - PreserveInfo *pre; + unsigned int i; + unsigned int num_types; + KeyTypesInfo info; + KeyTypeInfo *def; - for (pre = def->preserve; pre != NULL; - pre = (PreserveInfo *) pre->defs.next) - { - struct xkb_kt_map_entry * match; - struct xkb_kt_map_entry tmp; - tmp.mods.real_mods = pre->indexMods; - tmp.mods.vmods = pre->indexVMods; - tmp.level = 0; - AddMapEntry(xkb, def, &tmp, False, False); - match = FindMatchingMapEntry(def, pre->indexMods, pre->indexVMods); - if (!match) - { - WSGO("Couldn't find matching entry for preserve\n"); - ACTION("Aborting\n"); - return False; - } - pre->matchingMapIndex = match - def->entries; - } - type->mods.real_mods = def->mask; - type->mods.vmods = def->vmask; - type->num_levels = def->numLevels; - type->map_count = def->nEntries; - type->map = def->entries; - if (def->preserve) - { - type->preserve = uTypedCalloc(type->map_count, struct xkb_mods); - if (!type->preserve) - { - WARN("Couldn't allocate preserve array in CopyDefToKeyType\n"); - ACTION("Preserve setting for type %s lost\n", - XkbcAtomText(def->name)); - } - else - { - pre = def->preserve; - for (; pre != NULL; pre = (PreserveInfo *) pre->defs.next) - { - int ndx = pre->matchingMapIndex; - type->preserve[ndx].mask = pre->preMods; - type->preserve[ndx].real_mods = pre->preMods; - type->preserve[ndx].vmods = pre->preVMods; - } - } - } - else - type->preserve = NULL; - type->name = (uint32_t) def->name; - if (def->szNames > 0) - { - type->level_names = uTypedCalloc(def->numLevels, uint32_t); - - /* assert def->szNames<=def->numLevels */ - for (i = 0; i < def->szNames; i++) - { - type->level_names[i] = (uint32_t) def->lvlNames[i]; - } - } - else - { - type->level_names = NULL; - } + InitKeyTypesInfo(&info, keymap, file->id); - def->nEntries = def->szEntries = 0; - def->entries = NULL; - return XkbcComputeEffectiveMap(xkb, type, NULL); -} + HandleKeyTypesFile(&info, file, merge); -Bool -CompileKeyTypes(XkbFile *file, struct xkb_desc * xkb, unsigned merge) -{ - KeyTypesInfo info; + if (info.errorCount != 0) + goto err_info; - InitKeyTypesInfo(&info, xkb, NULL); - info.fileID = file->id; - HandleKeyTypesFile(file, xkb, merge, &info); - - if (info.errorCount == 0) - { - register int i; - register KeyTypeInfo *def; - register struct xkb_key_type *type, *next; - - if (info.name != NULL) - { - if (XkbcAllocNames(xkb, XkbTypesNameMask, 0, 0) == Success) - xkb->names->types = xkb_intern_atom(info.name); - else - { - WSGO("Couldn't allocate space for types name\n"); - ACTION("Name \"%s\" (from %s) NOT assigned\n", - scanFile, info.name); - } - } - i = info.nTypes; - if ((info.stdPresent & XkbOneLevelMask) == 0) - i++; - if ((info.stdPresent & XkbTwoLevelMask) == 0) - i++; - if ((info.stdPresent & XkbKeypadMask) == 0) - i++; - if ((info.stdPresent & XkbAlphabeticMask) == 0) - i++; - if (XkbcAllocClientMap(xkb, XkbKeyTypesMask, i) != Success) - { - WSGO("Couldn't allocate client map\n"); - return False; - } - xkb->map->num_types = i; - if (XkbAllRequiredTypes & (~info.stdPresent)) - { - unsigned missing, keypadVMod; - - missing = XkbAllRequiredTypes & (~info.stdPresent); - keypadVMod = FindKeypadVMod(xkb); - if (XkbcInitCanonicalKeyTypes(xkb, missing, keypadVMod) != Success) - { - WSGO("Couldn't initialize canonical key types\n"); - return False; - } - if (missing & XkbOneLevelMask) - xkb->map->types[XkbOneLevelIndex].name = tok_ONE_LEVEL; - if (missing & XkbTwoLevelMask) - xkb->map->types[XkbTwoLevelIndex].name = tok_TWO_LEVEL; - if (missing & XkbAlphabeticMask) - xkb->map->types[XkbAlphabeticIndex].name = tok_ALPHABETIC; - if (missing & XkbKeypadMask) - xkb->map->types[XkbKeypadIndex].name = tok_KEYPAD; - } - next = &xkb->map->types[XkbLastRequiredType + 1]; - for (i = 0, def = info.types; i < info.nTypes; i++) - { - if (def->name == tok_ONE_LEVEL) - type = &xkb->map->types[XkbOneLevelIndex]; - else if (def->name == tok_TWO_LEVEL) - type = &xkb->map->types[XkbTwoLevelIndex]; - else if (def->name == tok_ALPHABETIC) - type = &xkb->map->types[XkbAlphabeticIndex]; - else if (def->name == tok_KEYPAD) - type = &xkb->map->types[XkbKeypadIndex]; - else - type = next++; - DeleteLevel1MapEntries(def); - if (!CopyDefToKeyType(xkb, type, def)) - return False; - def = (KeyTypeInfo *) def->defs.next; - } - return True; - } - return False; + if (info.name) + keymap->types_section_name = strdup(info.name); + + num_types = info.num_types ? info.num_types : 1; + keymap->types = calloc(num_types, sizeof(*keymap->types)); + if (!keymap->types) + goto err_info; + keymap->num_types = num_types; + + /* + * If no types were specified, a default unnamed one-level type is + * used for all keys. + */ + if (info.num_types == 0) { + KeyTypeInfo dflt = { + .name = xkb_atom_intern(keymap->ctx, "default"), + .mods = 0, + .num_levels = 1, + .entries = darray_new(), + .level_names = darray_new(), + }; + + if (!CopyDefToKeyType(&info, &dflt, &keymap->types[0])) + goto err_info; + } else { + i = 0; + list_foreach(def, &info.types, entry) + if (!CopyDefToKeyType(&info, def, &keymap->types[i++])) + goto err_info; + } + + FreeKeyTypesInfo(&info); + return true; + +err_info: + FreeKeyTypesInfo(&info); + return false; } diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/listing.c libxkbcommon-0.1.0~2/src/xkbcomp/listing.c --- libxkbcommon-0.1.0~1/src/xkbcomp/listing.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/listing.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,520 +0,0 @@ -/************************************************************ - Copyright 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 1988, 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 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. - -******************************************************************/ - -#include -#include -#include -#include -#include - -#if defined(sgi) -#include -#endif - -#include "xkbcomp.h" -#include - -#ifdef _POSIX_SOURCE -# include -#else -# define _POSIX_SOURCE -# include -# undef _POSIX_SOURCE -#endif - -#ifndef PATH_MAX -#ifdef WIN32 -#define PATH_MAX 512 -#else -#include -#endif -#ifndef PATH_MAX -#ifdef MAXPATHLEN -#define PATH_MAX MAXPATHLEN -#else -#define PATH_MAX 1024 -#endif -#endif -#endif - -#ifdef WIN32 -# include -# define FileName(file) file.cFileName -# undef TEXT -# undef ALTERNATE -#else -# include -# define FileName(file) file->d_name -#endif - -#include "xkbmisc.h" -#include "xkbpath.h" -#include "parseutils.h" -#include "misc.h" -#include "tokens.h" - -#ifndef DFLT_XKB_CONFIG_ROOT -#define DFLT_XKB_CONFIG_ROOT "/usr/share/X11/xkb" -#endif - -typedef struct _CompPair { - int num; - int sz; - - struct xkb_component_name * comp; -} CompPair; - -/***====================================================================***/ - -static Bool -AddComponent(CompPair *cp, char *fileName, XkbFile *map, unsigned dirsToStrip) -{ - if (!cp || !fileName || !map) - return False; - - if (cp->num >= cp->sz) { - int orig_sz = cp->sz; - struct xkb_component_name * orig_comp = cp->comp; - - if (cp->sz < 1) - cp->sz = 8; - else - cp->sz *= 2; - - cp->comp = realloc(cp->comp, - cp->sz * sizeof(struct xkb_component_name)); - if (!cp->comp) { - ERROR("Failed reallocating component name list\n"); - cp->sz = orig_sz; - cp->comp = orig_comp; - return False; - } - } - - /* Strip off leading directories of component */ - if (dirsToStrip > 0) { - char *tmp, *last; - int i; - - for (i = 0, tmp = last = fileName; (i <= dirsToStrip) && tmp; i++) { - last = tmp; - tmp = strchr(tmp, '/'); - if (tmp != NULL) - tmp++; - } - - fileName = (tmp ? tmp : last); - } - - if (map->name) { - size_t len = strlen(fileName) + strlen(map->name) + 3; - - cp->comp[cp->num].name = malloc(len * sizeof(char)); - if (!cp->comp[cp->num].name) { - ERROR("Could not allocate space for component name\n"); - return False; - } - sprintf(cp->comp[cp->num].name, "%s(%s)", fileName, map->name); - } - else { - cp->comp[cp->num].name = strdup(fileName); - if (!cp->comp[cp->num].name) { - ERROR("Could not duplicate component name\n"); - return False; - } - } - - cp->comp[cp->num].flags = map->flags; - cp->num++; - - return True; -} - -static Bool -MapMatches(char *mapToConsider, char *ptrn) -{ - return ptrn ? XkbcNameMatchesPattern(mapToConsider, ptrn) : True; -} - -static int -ParseComponents(CompPair *cp, char *path, char *map, int *max, unsigned strip) -{ - int extra = 0; - FILE *inputFile; - XkbFile *rtrn, *mapToUse; - unsigned oldWarningLevel; - - if (!cp || !path || !max) - return 0; - -#ifdef DEBUG - if (warningLevel > 9) - fprintf(stderr, "should list:\n"); -#endif - - oldWarningLevel = warningLevel; - warningLevel = 0; - -#ifdef DEBUG - if (oldWarningLevel > 9) - fprintf(stderr, "%s(%s)\n", path ? path : "*", map ? map : "*"); -#endif - - inputFile = fopen(path, "r"); - if (!inputFile) { - if (oldWarningLevel > 5) - WARN("Couldn't open \"%s\"\n", path); - return 0; - } - - setScanState(path, 1); - if (!XKBParseFile(inputFile, &rtrn) || !rtrn) { - if (oldWarningLevel > 5) - WARN("Couldn't parse file \"%s\"\n", path); - fclose(inputFile); - return 0; - } - - mapToUse = rtrn; - for (; mapToUse; mapToUse = (XkbFile *)mapToUse->common.next) { - if (!MapMatches(mapToUse->name, map)) - continue; - if (*max <= 0) { - extra++; - continue; - } - if (AddComponent(cp, path, mapToUse, strip)) - (*max)--; - } - - warningLevel = oldWarningLevel; - - if (extra) - *max = 0; - - return extra; -} - -/***====================================================================***/ - -static int -AddDirectory(CompPair *cp, char *head, char *ptrn, char *rest, char *map, - int *max, unsigned strip) -{ -#ifdef WIN32 - HANDLE dirh; - WIN32_FIND_DATA file; -#else - DIR *dirp; - struct dirent *file; -#endif - int nMatch; - size_t baselen; - char path[PATH_MAX]; - - if (!head) { - ERROR("Must specify directory name\n"); - return 0; - } - - strncpy(path, head, sizeof(path)); - path[PATH_MAX - 1] = '\0'; - baselen = strlen(path); - - if (!map) { - char *tmp = ptrn; - - if (!rest && ptrn && !strchr(ptrn, '/')) { - tmp = ptrn; - map = strchr(ptrn, '('); - } - else if (!rest && !ptrn && !strchr(head, '/')) { - tmp = head; - map = strchr(head, '('); - } - - if (map) { - tmp = strchr(tmp, ')'); - if (!tmp || tmp[1] != '\0') { - ERROR("File and map must have the format file(map)\n"); - return 0; - } - *map = '\0'; - map++; - *tmp = '\0'; - } - } - -#ifdef WIN32 - if ((dirh = FindFirstFile("*.*", &file)) == INVALID_HANDLE_VALUE) - return 0; -#else - if (!(dirp = opendir(head))) { - ERROR("Could not open directory \"%s\"\n", head ? head : "."); - return 0; - } -#endif - nMatch = 0; -#ifdef WIN32 - do -#else - while ((file = readdir(dirp)) != NULL) -#endif - { - char *filename; - struct stat sbuf; - - filename = FileName(file); - if (!filename || filename[0] == '.') - continue; - if (ptrn && (!XkbcNameMatchesPattern(filename, ptrn))) - continue; - - snprintf(&path[baselen], sizeof(path) - baselen, "/%s", filename); - if (stat(path, &sbuf) < 0) { - ERROR("Could not read file \"%s\"\n", path); - continue; - } - - if ((rest && !S_ISDIR(sbuf.st_mode)) || - (map && S_ISDIR(sbuf.st_mode))) - continue; - - if (S_ISDIR(sbuf.st_mode)) - nMatch += AddDirectory(cp, path, rest, NULL, map, max, strip); - else - nMatch += ParseComponents(cp, path, map, max, strip); - } -#ifdef WIN32 - while (FindNextFile(dirh, &file)); -#endif - return nMatch; -} - -/***====================================================================***/ - -static int -GenerateComponent(struct xkb_component_list * complist, unsigned type, char *head_in, - char *base, int *max) -{ - char *str, *head, *ptrn = NULL, *rest = NULL; - char buf[PATH_MAX]; - size_t len; - CompPair cp; - unsigned dirsToStrip; - int extra; - - if (!complist || !head_in || !max) - return 0; - - ptrn = NULL; - for (str = head_in; (*str != '\0') && (*str != '?') && (*str != '*'); - str++) - { - if ((str != head_in) && (*str == '/')) - ptrn = str; - } - - if (*str == '\0') { - /* no wildcards */ - head = head_in; - } - else if (!ptrn) { - /* no slash before the first wildcard */ - head = NULL; - ptrn = head_in; - } - else { - /* slash followed by wildcard */ - head = head_in; - *ptrn = '\0'; - ptrn++; - } - - if (ptrn) { - rest = strchr(ptrn, '/'); - if (rest) { - *rest = '\0'; - rest++; - } - } - - if ((rest && ptrn && (strchr(ptrn, '(') || strchr(ptrn, ')'))) || - (head && (strchr(head, '(') || strchr(head, ')')))) { - ERROR("Files/maps to list must have the form file(map)\n"); - return 0; - } - - /* Prepend XKB directory */ - snprintf(buf, sizeof(buf), "%s%s%s", base ? base : "", base ? "/" : "", - XkbDirectoryForInclude(type)); - len = strlen(buf); - - /* Figure out directory stripping */ - str = buf; - dirsToStrip = 0; - while ((str = strchr(str, '/')) != NULL) { - str++; - dirsToStrip++; - } - - if (head) - snprintf(&buf[len], PATH_MAX - len, "/%s", head); - head = buf; - - memset(&cp, 0, sizeof(CompPair)); - extra = AddDirectory(&cp, head, ptrn, rest, NULL, max, dirsToStrip); - - /* Trim excess component slots */ - if (cp.sz > 0 && cp.sz > cp.num) { - if (realloc(cp.comp, cp.num * sizeof(struct xkb_component_name))) - cp.sz = cp.num; - else - WARN("Could not reallocate component name list\n"); - } - - switch (type) { - case XkmKeymapFile: - complist->num_keymaps = cp.num; - complist->keymaps = cp.comp; - break; - case XkmKeyNamesIndex: - complist->num_keycodes = cp.num; - complist->keycodes = cp.comp; - break; - case XkmTypesIndex: - complist->num_types = cp.num; - complist->types = cp.comp; - break; - case XkmCompatMapIndex: - complist->num_compat = cp.num; - complist->compat = cp.comp; - break; - case XkmSymbolsIndex: - complist->num_symbols = cp.num; - complist->symbols = cp.comp; - break; - case XkmGeometryIndex: - complist->num_geometry = cp.num; - complist->geometry = cp.comp; - break; - } - - return extra; -} - -/***====================================================================***/ - -struct xkb_component_list * -xkb_list_components(struct xkb_component_names * ptrns, int *maxMatch) -{ - struct xkb_component_list * complist = NULL; - int extra = 0; - - complist = _XkbTypedCalloc(1, struct xkb_component_list); - if (!complist) { - ERROR("could not allocate space for listing\n"); - goto out; - } - - if (!maxMatch || *maxMatch <= 0) - goto out; - - if (ptrns->keymap && *ptrns->keymap != '\0') - extra += GenerateComponent(complist, XkmKeymapFile, ptrns->keycodes, - DFLT_XKB_CONFIG_ROOT, maxMatch); - - if (ptrns->keycodes && *ptrns->keycodes != '\0') - extra += GenerateComponent(complist, XkmKeyNamesIndex, ptrns->keycodes, - DFLT_XKB_CONFIG_ROOT, maxMatch); - - if (ptrns->types && *ptrns->types != '\0') - extra += GenerateComponent(complist, XkmTypesIndex, ptrns->types, - DFLT_XKB_CONFIG_ROOT, maxMatch); - - if (ptrns->compat && *ptrns->compat != '\0') - extra += GenerateComponent(complist, XkmCompatMapIndex, ptrns->compat, - DFLT_XKB_CONFIG_ROOT, maxMatch); - - if (ptrns->symbols && *ptrns->symbols != '\0') - extra += GenerateComponent(complist, XkmSymbolsIndex, ptrns->symbols, - DFLT_XKB_CONFIG_ROOT, maxMatch); - - if (ptrns->geometry && *ptrns->geometry != '\0') - extra += GenerateComponent(complist, XkmGeometryIndex, ptrns->geometry, - DFLT_XKB_CONFIG_ROOT, maxMatch); - -out: - if (maxMatch) - *maxMatch = extra; - return complist; -} diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/misc.c libxkbcommon-0.1.0~2/src/xkbcomp/misc.c --- libxkbcommon-0.1.0~1/src/xkbcomp/misc.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/misc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,355 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ - -#include "xkbcomp.h" -#include "xkballoc.h" -#include "xkbmisc.h" -#include "xkbpath.h" -#include "tokens.h" -#include "keycodes.h" -#include "misc.h" -#include -#include "parseutils.h" - -/***====================================================================***/ - -/** - * Open the file given in the include statement and parse it's content. - * If the statement defines a specific map to use, this map is returned in - * file_rtrn. Otherwise, the default map is returned. - * - * @param stmt The include statement, specifying the file name to look for. - * @param file_type Type of file (XkmKeyNamesIdx, etc.) - * @param file_rtrn Returns the key map to be used. - * @param merge_rtrn Always returns stmt->merge. - * - * @return True on success or False otherwise. - */ -Bool -ProcessIncludeFile(IncludeStmt * stmt, - unsigned file_type, - XkbFile ** file_rtrn, unsigned *merge_rtrn) -{ - FILE *file; - XkbFile *rtrn, *mapToUse; - char oldFile[1024] = {0}; - int oldLine = lineNum; - - rtrn = XkbFindFileInCache(stmt->file, file_type, &stmt->path); - if (rtrn == NULL) - { - /* file not in cache, open it, parse it and store it in cache for next - time. */ - file = XkbFindFileInPath(stmt->file, file_type, &stmt->path); - if (file == NULL) - { - ERROR("Can't find file \"%s\" for %s include\n", stmt->file, - XkbDirectoryForInclude(file_type)); - return False; - } - strcpy(oldFile, scanFile); - oldLine = lineNum; - setScanState(stmt->file, 1); - if (debugFlags & 2) - INFO("About to parse include file %s\n", stmt->file); - /* parse the file */ - if ((XKBParseFile(file, &rtrn) == 0) || (rtrn == NULL)) - { - setScanState(oldFile, oldLine); - ERROR("Error interpreting include file \"%s\"\n", stmt->file); - fclose(file); - return False; - } - fclose(file); - XkbAddFileToCache(stmt->file, file_type, stmt->path, rtrn); - } - mapToUse = rtrn; - if (stmt->map != NULL) - { - while ((mapToUse) && ((!uStringEqual(mapToUse->name, stmt->map)) || - (mapToUse->type != file_type))) - { - mapToUse = (XkbFile *) mapToUse->common.next; - } - if (!mapToUse) - { - ERROR("No %s named \"%s\" in the include file \"%s\"\n", - XkbcConfigText(file_type), stmt->map, stmt->file); - return False; - } - } - else if ((rtrn->common.next != NULL) && (warningLevel > 5)) - { - WARN("No map in include statement, but \"%s\" contains several\n", - stmt->file); - ACTION("Using first defined map, \"%s\"\n", rtrn->name); - } - setScanState(oldFile, oldLine); - if (mapToUse->type != file_type) - { - ERROR("Include file wrong type (expected %s, got %s)\n", - XkbcConfigText(file_type), XkbcConfigText(mapToUse->type)); - ACTION("Include file \"%s\" ignored\n", stmt->file); - return False; - } - /* FIXME: we have to check recursive includes here (or somewhere) */ - - mapToUse->compiled = True; - *file_rtrn = mapToUse; - *merge_rtrn = stmt->merge; - return True; -} - -/***====================================================================***/ - -int -ReportNotArray(const char *type, const char *field, const char *name) -{ - ERROR("The %s %s field is not an array\n", type, field); - ACTION("Ignoring illegal assignment in %s\n", name); - return False; -} - -int -ReportShouldBeArray(const char *type, const char *field, const char *name) -{ - ERROR("Missing subscript for %s %s\n", type, field); - ACTION("Ignoring illegal assignment in %s\n", name); - return False; -} - -int -ReportBadType(const char *type, const char *field, - const char *name, const char *wanted) -{ - ERROR("The %s %s field must be a %s\n", type, field, wanted); - ACTION("Ignoring illegal assignment in %s\n", name); - return False; -} - -int -ReportBadField(const char *type, const char *field, const char *name) -{ - ERROR("Unknown %s field %s in %s\n", type, field, name); - ACTION("Ignoring assignment to unknown field in %s\n", name); - return False; -} - -/***====================================================================***/ - -Bool -UseNewField(unsigned field, - CommonInfo * oldDefs, CommonInfo * newDefs, unsigned *pCollide) -{ - Bool useNew; - - useNew = False; - if (oldDefs->defined & field) - { - if (newDefs->defined & field) - { - if (((oldDefs->fileID == newDefs->fileID) - && (warningLevel > 0)) || (warningLevel > 9)) - { - *pCollide |= field; - } - if (newDefs->merge != MergeAugment) - useNew = True; - } - } - else if (newDefs->defined & field) - useNew = True; - return useNew; -} - -char * -ClearCommonInfo(CommonInfo * cmn) -{ - if (cmn != NULL) - { - CommonInfo *this, *next; - for (this = cmn; this != NULL; this = next) - { - next = this->next; - free(this); - } - } - return NULL; -} - -char * -AddCommonInfo(CommonInfo * old, CommonInfo * new) -{ - CommonInfo *first; - - first = old; - while (old && old->next) - { - old = old->next; - } - new->next = NULL; - if (old) - { - old->next = new; - return (char *) first; - } - return (char *) new; -} - -/***====================================================================***/ - -typedef struct _KeyNameDesc -{ - uint32_t level1; - uint32_t level2; - char name[5]; - Bool used; -} KeyNameDesc; - -/** - * Find the key with the given name and return its keycode in kc_rtrn. - * - * @param name The 4-letter name of the key as a long. - * @param kc_rtrn Set to the keycode if the key was found, otherwise 0. - * @param use_aliases True if the key aliases should be searched too. - * @param create If True and the key is not found, it is added to the - * xkb->names at the first free keycode. - * @param start_from Keycode to start searching from. - * - * @return True if found, False otherwise. - */ -Bool -FindNamedKey(struct xkb_desc * xkb, - unsigned long name, - unsigned int *kc_rtrn, - Bool use_aliases, Bool create, int start_from) -{ - register unsigned n; - - if (start_from < xkb->min_key_code) - { - start_from = xkb->min_key_code; - } - else if (start_from > xkb->max_key_code) - { - return False; - } - - *kc_rtrn = 0; /* some callers rely on this */ - if (xkb && xkb->names && xkb->names->keys) - { - for (n = start_from; n <= xkb->max_key_code; n++) - { - unsigned long tmp; - tmp = KeyNameToLong(xkb->names->keys[n].name); - if (tmp == name) - { - *kc_rtrn = n; - return True; - } - } - if (use_aliases) - { - unsigned long new_name; - if (FindKeyNameForAlias(xkb, name, &new_name)) - return FindNamedKey(xkb, new_name, kc_rtrn, False, create, 0); - } - } - if (create) - { - if ((!xkb->names) || (!xkb->names->keys)) - { - if (xkb->min_key_code < XkbMinLegalKeyCode) - { - xkb->min_key_code = XkbMinLegalKeyCode; - xkb->max_key_code = XkbMaxLegalKeyCode; - } - if (XkbcAllocNames(xkb, XkbKeyNamesMask, 0, 0) != Success) - { - if (warningLevel > 0) - { - WARN("Couldn't allocate key names in FindNamedKey\n"); - ACTION("Key \"%s\" not automatically created\n", - longText(name)); - } - return False; - } - } - /* Find first unused keycode and store our key here */ - for (n = xkb->min_key_code; n <= xkb->max_key_code; n++) - { - if (xkb->names->keys[n].name[0] == '\0') - { - char buf[XkbKeyNameLength + 1]; - LongToKeyName(name, buf); - memcpy(xkb->names->keys[n].name, buf, XkbKeyNameLength); - *kc_rtrn = n; - return True; - } - } - } - return False; -} - -Bool -FindKeyNameForAlias(struct xkb_desc * xkb, unsigned long lname, - unsigned long *real_name) -{ - register int i; - char name[XkbKeyNameLength + 1]; - - if (xkb && xkb->geom && xkb->geom->key_aliases) - { - struct xkb_key_alias * a; - a = xkb->geom->key_aliases; - LongToKeyName(lname, name); - name[XkbKeyNameLength] = '\0'; - for (i = 0; i < xkb->geom->num_key_aliases; i++, a++) - { - if (strncmp(name, a->alias, XkbKeyNameLength) == 0) - { - *real_name = KeyNameToLong(a->real); - return True; - } - } - } - if (xkb && xkb->names && xkb->names->key_aliases) - { - struct xkb_key_alias * a; - a = xkb->names->key_aliases; - LongToKeyName(lname, name); - name[XkbKeyNameLength] = '\0'; - for (i = 0; i < xkb->names->num_key_aliases; i++, a++) - { - if (strncmp(name, a->alias, XkbKeyNameLength) == 0) - { - *real_name = KeyNameToLong(a->real); - return True; - } - } - } - return False; -} diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/misc.h libxkbcommon-0.1.0~2/src/xkbcomp/misc.h --- libxkbcommon-0.1.0~1/src/xkbcomp/misc.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/misc.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ - -#ifndef MISC_H -#define MISC_H 1 - -typedef struct _CommonInfo -{ - unsigned short defined; - unsigned char fileID; - unsigned char merge; - struct _CommonInfo *next; -} CommonInfo; - -extern Bool UseNewField(unsigned /* field */ , - CommonInfo * /* oldDefs */ , - CommonInfo * /* newDefs */ , - unsigned * /* pCollide */ - ); - -extern char * ClearCommonInfo(CommonInfo * /* cmn */ - ); - -extern char * AddCommonInfo(CommonInfo * /* old */ , - CommonInfo * /* new */ - ); - -extern int ReportNotArray(const char * /* type */ , - const char * /* field */ , - const char * /* name */ - ); - -extern int ReportShouldBeArray(const char * /* type */ , - const char * /* field */ , - const char * /* name */ - ); - -extern int ReportBadType(const char * /* type */ , - const char * /* field */ , - const char * /* name */ , - const char * /* wanted */ - ); - -extern int ReportBadField(const char * /* type */ , - const char * /* field */ , - const char * /* name */ - ); - -extern Bool ProcessIncludeFile(IncludeStmt * /* stmt */ , - unsigned /* file_type */ , - XkbFile ** /* file_rtrn */ , - unsigned * /* merge_rtrn */ - ); - -extern Bool FindNamedKey(struct xkb_desc * /* xkb */ , - unsigned long /* name */ , - unsigned int * /* kc_rtrn */ , - Bool /* use_aliases */ , - Bool /* create */ , - int /* start_from */ - ); - -extern Bool FindKeyNameForAlias(struct xkb_desc * /* xkb */ , - unsigned long /* lname */ , - unsigned long * /* real_name */ - ); - -#endif /* MISC_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/parser.y libxkbcommon-0.1.0~2/src/xkbcomp/parser.y --- libxkbcommon-0.1.0~1/src/xkbcomp/parser.y 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/parser.y 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,759 @@ +/************************************************************ + 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 "xkbcomp-priv.h" +#include "parseutils.h" + +#pragma GCC diagnostic ignored "-Wredundant-decls" + +extern int yylex(union YYSTYPE *val, struct YYLTYPE *loc, void *scanner); + +static void +yyerror(struct YYLTYPE *loc, struct parser_param *param, const char *msg) +{ + scanner_error(loc, param->scanner, msg); +} + +#define scanner param->scanner +%} + +%define api.pure +%locations +%lex-param { void *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 { + int ival; + unsigned uval; + int64_t num; + enum xkb_file_type file_type; + char *str; + char keyName[XkbKeyNameLength]; + xkb_atom_t sval; + enum merge_mode merge; + ParseCommon *any; + ExprDef *expr; + VarDef *var; + VModDef *vmod; + InterpDef *interp; + KeyTypeDef *keyType; + SymbolsDef *syms; + ModMapDef *modMask; + GroupCompatDef *groupCompat; + IndicatorMapDef *ledMap; + IndicatorNameDef *ledName; + KeycodeDef *keyCode; + KeyAliasDef *keyAlias; + void *geom; + XkbFile *file; +} + +%type INTEGER FLOAT +%type IDENT STRING +%type KEYNAME KeyName +%type Number Integer Float SignedNumber +%type MergeMode OptMergeMode +%type XkbCompositeType FileType +%type DoodadType Flag Flags OptFlags KeyCode +%type MapName OptMapName KeySym +%type FieldSpec Ident Element String +%type DeclList Decl +%type OptExprList ExprList Expr Term Lhs Terminal ArrayInit KeySyms +%type OptKeySymList KeySymList Action ActionList Coord CoordList +%type VarDecl VarDeclList SymbolsBody SymbolsVarDecl +%type VModDecl VModDefList VModDef +%type InterpretDecl InterpretMatch +%type KeyTypeDecl +%type SymbolsDecl +%type ModMapDecl +%type GroupCompatDecl +%type IndicatorMapDecl +%type IndicatorNameDecl +%type KeyNameDecl +%type KeyAliasDecl +%type ShapeDecl SectionDecl SectionBody SectionBodyItem RowBody RowBodyItem +%type Keys Key OverlayDecl OverlayKeyList OverlayKey OutlineList OutlineInList +%type DoodadDecl +%type XkbFile XkbMapConfigList XkbMapConfig XkbConfig +%type XkbCompositeMap XkbCompMapList + +%% + +XkbFile : XkbCompMapList + { $$ = param->rtrn = $1; } + | XkbMapConfigList + { $$ = param->rtrn = $1; } + | XkbConfig + { $$ = param->rtrn = $1; } + ; + +XkbCompMapList : XkbCompMapList XkbCompositeMap + { $$ = (XkbFile *)AppendStmt(&$1->common, &$2->common); } + | XkbCompositeMap + { $$ = $1; } + ; + +XkbCompositeMap : OptFlags XkbCompositeType OptMapName OBRACE + XkbMapConfigList + CBRACE SEMI + { $$ = CreateXKBFile(param->ctx, $2, $3, &$5->common, $1); } + ; + +XkbCompositeType: XKB_KEYMAP { $$ = FILE_TYPE_KEYMAP; } + | XKB_SEMANTICS { $$ = FILE_TYPE_KEYMAP; } + | XKB_LAYOUT { $$ = FILE_TYPE_KEYMAP; } + ; + +XkbMapConfigList : XkbMapConfigList XkbMapConfig + { + if (!$2) + $$ = $1; + else + $$ = (XkbFile *)AppendStmt(&$1->common, &$2->common); + } + | XkbMapConfig + { $$ = $1; } + ; + +XkbMapConfig : OptFlags FileType OptMapName OBRACE + DeclList + CBRACE SEMI + { + if ($2 == FILE_TYPE_GEOMETRY) { + free($3); + FreeStmt($5); + $$ = NULL; + } + else { + $$ = CreateXKBFile(param->ctx, $2, $3, $5, $1); + } + } + ; + +XkbConfig : OptFlags FileType OptMapName DeclList + { + if ($2 == FILE_TYPE_GEOMETRY) { + free($3); + FreeStmt($4); + $$ = NULL; + } + else { + $$ = CreateXKBFile(param->ctx, $2, $3, $4, $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 { $$ = XkbLC_Partial; } + | DEFAULT { $$ = XkbLC_Default; } + | HIDDEN { $$ = XkbLC_Hidden; } + | ALPHANUMERIC_KEYS { $$ = XkbLC_AlphanumericKeys; } + | MODIFIER_KEYS { $$ = XkbLC_ModifierKeys; } + | KEYPAD_KEYS { $$ = XkbLC_KeypadKeys; } + | FUNCTION_KEYS { $$ = XkbLC_FunctionKeys; } + | ALTERNATE_GROUP { $$ = XkbLC_AlternateGroup; } + ; + +DeclList : DeclList Decl + { $$ = AppendStmt($1, $2); } + | { $$ = NULL; } + ; + +Decl : OptMergeMode VarDecl + { + $2->merge = $1; + $$ = &$2->common; + } + | OptMergeMode VModDecl + { + $2->merge = $1; + $$ = &$2->common; + } + | OptMergeMode InterpretDecl + { + $2->merge = $1; + $$ = &$2->common; + } + | OptMergeMode KeyNameDecl + { + $2->merge = $1; + $$ = &$2->common; + } + | OptMergeMode KeyAliasDecl + { + $2->merge = $1; + $$ = &$2->common; + } + | OptMergeMode KeyTypeDecl + { + $2->merge = $1; + $$ = &$2->common; + } + | OptMergeMode SymbolsDecl + { + $2->merge = $1; + $$ = &$2->common; + } + | OptMergeMode ModMapDecl + { + $2->merge = $1; + $$ = &$2->common; + } + | OptMergeMode GroupCompatDecl + { + $2->merge = $1; + $$ = &$2->common; + } + | OptMergeMode IndicatorMapDecl + { + $2->merge = $1; + $$ = &$2->common; + } + | OptMergeMode IndicatorNameDecl + { + $2->merge = $1; + $$ = &$2->common; + } + | OptMergeMode ShapeDecl { } + | OptMergeMode SectionDecl { } + | OptMergeMode DoodadDecl { } + | MergeMode STRING + { + $$ = &IncludeCreate(param->ctx, $2, $1)->common; + free($2); + } + ; + +VarDecl : Lhs EQUALS Expr SEMI + { $$ = VarCreate($1, $3); } + | Ident SEMI + { $$ = BoolVarCreate($1, 1); } + | EXCLAM Ident SEMI + { $$ = BoolVarCreate($2, 0); } + ; + +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 + { $$ = (VModDef *)AppendStmt(&$1->common, &$3->common); } + | VModDef + { $$ = $1; } + ; + +VModDef : Ident + { $$ = VModCreate($1, NULL); } + | Ident EQUALS Expr + { $$ = VModCreate($1, $3); } + ; + +InterpretDecl : INTERPRET InterpretMatch OBRACE + VarDeclList + CBRACE SEMI + { $2->def = $4; $$ = $2; } + ; + +InterpretMatch : KeySym PLUS Expr + { $$ = InterpCreate($1, $3); } + | KeySym + { $$ = InterpCreate($1, NULL); } + ; + +VarDeclList : VarDeclList VarDecl + { $$ = (VarDef *)AppendStmt(&$1->common, &$2->common); } + | VarDecl + { $$ = $1; } + ; + +KeyTypeDecl : TYPE String OBRACE + VarDeclList + CBRACE SEMI + { $$ = KeyTypeCreate($2, $4); } + ; + +SymbolsDecl : KEY KeyName OBRACE + SymbolsBody + CBRACE SEMI + { $$ = SymbolsCreate($2, (ExprDef *)$4); } + ; + +SymbolsBody : SymbolsBody COMMA SymbolsVarDecl + { $$ = (VarDef *)AppendStmt(&$1->common, &$3->common); } + | SymbolsVarDecl + { $$ = $1; } + | { $$ = NULL; } + ; + +SymbolsVarDecl : Lhs EQUALS Expr { $$ = VarCreate($1, $3); } + | Lhs EQUALS ArrayInit { $$ = VarCreate($1, $3); } + | Ident { $$ = BoolVarCreate($1, 1); } + | EXCLAM Ident { $$ = BoolVarCreate($2, 0); } + | ArrayInit { $$ = VarCreate(NULL, $1); } + ; + +ArrayInit : OBRACKET OptKeySymList CBRACKET + { $$ = $2; } + | OBRACKET ActionList CBRACKET + { $$ = ExprCreateUnary(EXPR_ACTION_LIST, EXPR_TYPE_ACTION, $2); } + ; + +GroupCompatDecl : GROUP Integer EQUALS Expr SEMI + { $$ = GroupCompatCreate($2, $4); } + ; + +ModMapDecl : MODIFIER_MAP Ident OBRACE ExprList CBRACE SEMI + { $$ = ModMapCreate($2, $4); } + ; + +IndicatorMapDecl: INDICATOR String OBRACE VarDeclList CBRACE SEMI + { $$ = IndicatorMapCreate($2, $4); } + ; + +IndicatorNameDecl: INDICATOR Integer EQUALS Expr SEMI + { $$ = IndicatorNameCreate($2, $4, false); } + | VIRTUAL INDICATOR Integer EQUALS Expr SEMI + { $$ = IndicatorNameCreate($3, $5, true); } + ; + +ShapeDecl : SHAPE String OBRACE OutlineList CBRACE SEMI + { $$ = NULL; } + | SHAPE String OBRACE CoordList CBRACE SEMI + { $$ = NULL; } + ; + +SectionDecl : SECTION String OBRACE SectionBody CBRACE SEMI + { $$ = NULL; } + ; + +SectionBody : SectionBody SectionBodyItem { $$ = NULL;} + | SectionBodyItem { $$ = NULL; } + ; + +SectionBodyItem : ROW OBRACE RowBody CBRACE SEMI + { $$ = NULL; } + | VarDecl + { FreeStmt(&$1->common); $$ = NULL; } + | DoodadDecl + { $$ = NULL; } + | IndicatorMapDecl + { FreeStmt(&$1->common); $$ = NULL; } + | OverlayDecl + { $$ = NULL; } + ; + +RowBody : RowBody RowBodyItem { $$ = NULL;} + | RowBodyItem { $$ = NULL; } + ; + +RowBodyItem : KEYS OBRACE Keys CBRACE SEMI { $$ = NULL; } + | VarDecl + { FreeStmt(&$1->common); $$ = NULL; } + ; + +Keys : Keys COMMA Key { $$ = NULL; } + | Key { $$ = NULL; } + ; + +Key : KeyName + { $$ = NULL; } + | OBRACE ExprList CBRACE + { FreeStmt(&$2->common); $$ = 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 + { $$ = NULL; } + | Ident EQUALS OBRACE CoordList CBRACE + { $$ = NULL; } + | Ident EQUALS Expr + { FreeStmt(&$3->common); $$ = NULL; } + ; + +CoordList : CoordList COMMA Coord + { $$ = NULL; } + | Coord + { $$ = NULL; } + ; + +Coord : OBRACKET SignedNumber COMMA SignedNumber CBRACKET + { $$ = NULL; } + ; + +DoodadDecl : DoodadType String OBRACE VarDeclList CBRACE SEMI + { FreeStmt(&$4->common); $$ = NULL; } + ; + +DoodadType : TEXT { $$ = 0; } + | OUTLINE { $$ = 0; } + | SOLID { $$ = 0; } + | LOGO { $$ = 0; } + ; + +FieldSpec : Ident { $$ = $1; } + | Element { $$ = $1; } + ; + +Element : ACTION_TOK + { $$ = xkb_atom_intern(param->ctx, "action"); } + | INTERPRET + { $$ = xkb_atom_intern(param->ctx, "interpret"); } + | TYPE + { $$ = xkb_atom_intern(param->ctx, "type"); } + | KEY + { $$ = xkb_atom_intern(param->ctx, "key"); } + | GROUP + { $$ = xkb_atom_intern(param->ctx, "group"); } + | MODIFIER_MAP + {$$ = xkb_atom_intern(param->ctx, "modifier_map");} + | INDICATOR + { $$ = xkb_atom_intern(param->ctx, "indicator"); } + | SHAPE + { $$ = xkb_atom_intern(param->ctx, "shape"); } + | ROW + { $$ = XKB_ATOM_NONE; } + | SECTION + { $$ = XKB_ATOM_NONE; } + | TEXT + { $$ = XKB_ATOM_NONE; } + ; + +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; } + | { $$ = NULL; } + ; + +ExprList : ExprList COMMA Expr + { $$ = (ExprDef *)AppendStmt(&$1->common, &$3->common); } + | Expr + { $$ = $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->value_type, $2); } + | PLUS Term + { $$ = ExprCreateUnary(EXPR_UNARY_PLUS, $2->value_type, $2); } + | EXCLAM Term + { $$ = ExprCreateUnary(EXPR_NOT, EXPR_TYPE_BOOLEAN, $2); } + | INVERT Term + { $$ = ExprCreateUnary(EXPR_INVERT, $2->value_type, $2); } + | Lhs + { $$ = $1; } + | FieldSpec OPAREN OptExprList CPAREN %prec OPAREN + { $$ = ActionCreate($1, $3); } + | Terminal + { $$ = $1; } + | OPAREN Expr CPAREN + { $$ = $2; } + ; + +ActionList : ActionList COMMA Action + { $$ = (ExprDef *)AppendStmt(&$1->common, &$3->common); } + | Action + { $$ = $1; } + ; + +Action : FieldSpec OPAREN OptExprList CPAREN + { $$ = ActionCreate($1, $3); } + ; + +Lhs : FieldSpec + { + ExprDef *expr; + expr = ExprCreate(EXPR_IDENT, EXPR_TYPE_UNKNOWN); + expr->value.str = $1; + $$ = expr; + } + | FieldSpec DOT FieldSpec + { + ExprDef *expr; + expr = ExprCreate(EXPR_FIELD_REF, EXPR_TYPE_UNKNOWN); + expr->value.field.element = $1; + expr->value.field.field = $3; + $$ = expr; + } + | FieldSpec OBRACKET Expr CBRACKET + { + ExprDef *expr; + expr = ExprCreate(EXPR_ARRAY_REF, EXPR_TYPE_UNKNOWN); + expr->value.array.element = XKB_ATOM_NONE; + expr->value.array.field = $1; + expr->value.array.entry = $3; + $$ = expr; + } + | FieldSpec DOT FieldSpec OBRACKET Expr CBRACKET + { + ExprDef *expr; + expr = ExprCreate(EXPR_ARRAY_REF, EXPR_TYPE_UNKNOWN); + expr->value.array.element = $1; + expr->value.array.field = $3; + expr->value.array.entry = $5; + $$ = expr; + } + ; + +Terminal : String + { + ExprDef *expr; + expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_STRING); + expr->value.str = $1; + $$ = expr; + } + | Integer + { + ExprDef *expr; + expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_INT); + expr->value.ival = $1; + $$ = expr; + } + | Float + { + $$ = NULL; + } + | KeyName + { + ExprDef *expr; + expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_KEYNAME); + strncpy(expr->value.keyName, $1, XkbKeyNameLength); + $$ = expr; + } + ; + +OptKeySymList : KeySymList { $$ = $1; } + | { $$ = NULL; } + ; + +KeySymList : KeySymList COMMA KeySym + { $$ = AppendKeysymList($1, $3); } + | KeySymList COMMA KeySyms + { $$ = AppendMultiKeysymList($1, $3); } + | KeySym + { $$ = CreateKeysymList($1); } + | KeySyms + { $$ = CreateMultiKeysymList($1); } + ; + +KeySyms : OBRACE KeySymList CBRACE + { $$ = $2; } + ; + +KeySym : IDENT { $$ = $1; } + | SECTION { $$ = strdup("section"); } + | Integer + { + if ($1 < 10) { /* XK_0 .. XK_9 */ + $$ = malloc(2); + $$[0] = $1 + '0'; + $$[1] = '\0'; + } + else { + $$ = malloc(17); + snprintf($$, 17, "0x%x", $1); + } + } + ; + +SignedNumber : MINUS Number { $$ = -$2; } + | Number { $$ = $1; } + ; + +Number : FLOAT { $$ = $1; } + | INTEGER { $$ = $1 * XkbGeomPtsPerMM; } + ; + +Float : FLOAT { $$ = 0; } + ; + +Integer : INTEGER { $$ = $1; } + ; + +KeyCode : INTEGER { $$ = $1; } + ; + +KeyName : KEYNAME { strncpy($$, $1, XkbKeyNameLength); } + ; + +Ident : IDENT { $$ = xkb_atom_steal(param->ctx, $1); } + | DEFAULT { $$ = xkb_atom_intern(param->ctx, "default"); } + ; + +String : STRING { $$ = xkb_atom_steal(param->ctx, $1); } + ; + +OptMapName : MapName { $$ = $1; } + | { $$ = NULL; } + ; + +MapName : STRING { $$ = $1; } + ; + +%% + +#undef scanner diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/parseutils.c libxkbcommon-0.1.0~2/src/xkbcomp/parseutils.c --- libxkbcommon-0.1.0~1/src/xkbcomp/parseutils.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/parseutils.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,36 +1,42 @@ /************************************************************ - 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 (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 "parseutils.h" -#include "xkbmisc.h" -#include "xkbpath.h" -#include -#include +#include "path.h" -XkbFile *rtrnValue; +ATTR_MALLOC static void * +malloc_or_die(size_t size) +{ + void *p = malloc(size); + if (!p) { + fprintf(stderr, "Out of memory\n"); + exit(1); + } + return p; +} ParseCommon * AppendStmt(ParseCommon * to, ParseCommon * append) @@ -43,8 +49,7 @@ { to = to->next; } - if (to) - { + if (to) { to->next = append; return start; } @@ -52,135 +57,95 @@ } ExprDef * -ExprCreate(unsigned op, unsigned type) +ExprCreate(enum expr_op_type op, enum expr_value_type type) { ExprDef *expr; - expr = uTypedAlloc(ExprDef); - if (expr) - { - expr->common.stmtType = StmtExpr; - expr->common.next = NULL; - expr->op = op; - expr->type = type; - } - else - { - FATAL("Couldn't allocate expression in parser\n"); - /* NOTREACHED */ - } + + expr = malloc_or_die(sizeof(*expr)); + + expr->common.type = STMT_EXPR; + expr->common.next = NULL; + expr->op = op; + expr->value_type = type; return expr; } ExprDef * -ExprCreateUnary(unsigned op, unsigned type, ExprDef * child) +ExprCreateUnary(enum expr_op_type op, enum expr_value_type type, + ExprDef *child) { ExprDef *expr; - expr = uTypedAlloc(ExprDef); - if (expr) - { - expr->common.stmtType = StmtExpr; - expr->common.next = NULL; - expr->op = op; - expr->type = type; - expr->value.child = child; - } - else - { - FATAL("Couldn't allocate expression in parser\n"); - /* NOTREACHED */ - } + expr = malloc_or_die(sizeof(*expr)); + + expr->common.type = STMT_EXPR; + expr->common.next = NULL; + expr->op = op; + expr->value_type = type; + expr->value.child = child; return expr; } ExprDef * -ExprCreateBinary(unsigned op, ExprDef * left, ExprDef * right) +ExprCreateBinary(enum expr_op_type op, ExprDef *left, ExprDef *right) { ExprDef *expr; - expr = uTypedAlloc(ExprDef); - if (expr) - { - expr->common.stmtType = StmtExpr; - expr->common.next = NULL; - expr->op = op; - if ((op == OpAssign) || (left->type == TypeUnknown)) - expr->type = right->type; - else if ((left->type == right->type) || (right->type == TypeUnknown)) - expr->type = left->type; - else - expr->type = TypeUnknown; - expr->value.binary.left = left; - expr->value.binary.right = right; - } - else - { - FATAL("Couldn't allocate expression in parser\n"); - /* NOTREACHED */ - } + + expr = malloc_or_die(sizeof(*expr)); + + expr->common.type = STMT_EXPR; + expr->common.next = NULL; + expr->op = op; + if (op == EXPR_ASSIGN || left->value_type == EXPR_TYPE_UNKNOWN) + expr->value_type = right->value_type; + else if (left->value_type == right->value_type || + right->value_type == EXPR_TYPE_UNKNOWN) + expr->value_type = left->value_type; + else + expr->value_type = EXPR_TYPE_UNKNOWN; + expr->value.binary.left = left; + expr->value.binary.right = right; return expr; } KeycodeDef * -KeycodeCreate(char *name, ExprDef * value) +KeycodeCreate(char keyName[XkbKeyNameLength], unsigned long value) { KeycodeDef *def; - def = uTypedAlloc(KeycodeDef); - if (def) - { - def->common.stmtType = StmtKeycodeDef; - def->common.next = NULL; - strncpy(def->name, name, XkbKeyNameLength); - def->name[XkbKeyNameLength] = '\0'; - def->value = value; - } - else - { - FATAL("Couldn't allocate key name definition in parser\n"); - /* NOTREACHED */ - } + def = malloc_or_die(sizeof(*def)); + + def->common.type = STMT_KEYCODE; + def->common.next = NULL; + strncpy(def->name, keyName, XkbKeyNameLength); + def->value = value; return def; } KeyAliasDef * -KeyAliasCreate(char *alias, char *real) +KeyAliasCreate(char alias[XkbKeyNameLength], char real[XkbKeyNameLength]) { KeyAliasDef *def; - def = uTypedAlloc(KeyAliasDef); - if (def) - { - def->common.stmtType = StmtKeyAliasDef; - def->common.next = NULL; - strncpy(def->alias, alias, XkbKeyNameLength); - def->alias[XkbKeyNameLength] = '\0'; - strncpy(def->real, real, XkbKeyNameLength); - def->real[XkbKeyNameLength] = '\0'; - } - else - { - FATAL("Couldn't allocate key alias definition in parser\n"); - /* NOTREACHED */ - } + def = malloc_or_die(sizeof(*def)); + + def->common.type = STMT_ALIAS; + def->common.next = NULL; + strncpy(def->alias, alias, XkbKeyNameLength); + strncpy(def->real, real, XkbKeyNameLength); return def; } VModDef * -VModCreate(uint32_t name, ExprDef * value) +VModCreate(xkb_atom_t name, ExprDef * value) { VModDef *def; - def = uTypedAlloc(VModDef); - if (def) - { - def->common.stmtType = StmtVModDef; - def->common.next = NULL; - def->name = name; - def->value = value; - } - else - { - FATAL("Couldn't allocate variable definition in parser\n"); - /* NOTREACHED */ - } + + def = malloc_or_die(sizeof(*def)); + + def->common.type = STMT_VMOD; + def->common.next = NULL; + def->name = name; + def->value = value; return def; } @@ -188,30 +153,23 @@ VarCreate(ExprDef * name, ExprDef * value) { VarDef *def; - def = uTypedAlloc(VarDef); - if (def) - { - def->common.stmtType = StmtVarDef; - def->common.next = NULL; - def->name = name; - def->value = value; - } - else - { - FATAL("Couldn't allocate variable definition in parser\n"); - /* NOTREACHED */ - } + def = malloc_or_die(sizeof(*def)); + + def->common.type = STMT_VAR; + def->common.next = NULL; + def->name = name; + def->value = value; return def; } VarDef * -BoolVarCreate(uint32_t nameToken, unsigned set) +BoolVarCreate(xkb_atom_t nameToken, unsigned set) { ExprDef *name, *value; - name = ExprCreate(ExprIdent, TypeUnknown); + name = ExprCreate(EXPR_IDENT, EXPR_TYPE_UNKNOWN); name->value.str = nameToken; - value = ExprCreate(ExprValue, TypeBoolean); + value = ExprCreate(EXPR_VALUE, EXPR_TYPE_BOOLEAN); value->value.uval = set; return VarCreate(name, value); } @@ -221,64 +179,42 @@ { InterpDef *def; - def = uTypedAlloc(InterpDef); - if (def) - { - def->common.stmtType = StmtInterpDef; - def->common.next = NULL; - def->sym = strdup(sym); - def->match = match; - } - else - { - FATAL("Couldn't allocate interp definition in parser\n"); - /* NOTREACHED */ - } + def = malloc_or_die(sizeof(*def)); + + def->common.type = STMT_INTERP; + def->common.next = NULL; + def->sym = sym; + def->match = match; return def; } KeyTypeDef * -KeyTypeCreate(uint32_t name, VarDef * body) +KeyTypeCreate(xkb_atom_t name, VarDef * body) { KeyTypeDef *def; - def = uTypedAlloc(KeyTypeDef); - if (def) - { - def->common.stmtType = StmtKeyTypeDef; - def->common.next = NULL; - def->merge = MergeDefault; - def->name = name; - def->body = body; - } - else - { - FATAL("Couldn't allocate key type definition in parser\n"); - /* NOTREACHED */ - } + def = malloc_or_die(sizeof(*def)); + + def->common.type = STMT_TYPE; + def->common.next = NULL; + def->merge = MERGE_DEFAULT; + def->name = name; + def->body = body; return def; } SymbolsDef * -SymbolsCreate(char *keyName, ExprDef * symbols) +SymbolsCreate(char keyName[XkbKeyNameLength], ExprDef *symbols) { SymbolsDef *def; - def = uTypedAlloc(SymbolsDef); - if (def) - { - def->common.stmtType = StmtSymbolsDef; - def->common.next = NULL; - def->merge = MergeDefault; - bzero(def->keyName, 5); - strncpy(def->keyName, keyName, 4); - def->symbols = symbols; - } - else - { - FATAL("Couldn't allocate symbols definition in parser\n"); - /* NOTREACHED */ - } + def = malloc_or_die(sizeof(*def)); + + def->common.type = STMT_SYMBOLS; + def->common.next = NULL; + def->merge = MERGE_DEFAULT; + strncpy(def->keyName, keyName, XkbKeyNameLength); + def->symbols = symbols; return def; } @@ -287,20 +223,13 @@ { GroupCompatDef *def; - def = uTypedAlloc(GroupCompatDef); - if (def) - { - def->common.stmtType = StmtGroupCompatDef; - def->common.next = NULL; - def->merge = MergeDefault; - def->group = group; - def->def = val; - } - else - { - FATAL("Couldn't allocate group compat definition in parser\n"); - /* NOTREACHED */ - } + def = malloc_or_die(sizeof(*def)); + + def->common.type = STMT_GROUP_COMPAT; + def->common.next = NULL; + def->merge = MERGE_DEFAULT; + def->group = group; + def->def = val; return def; } @@ -309,85 +238,60 @@ { ModMapDef *def; - def = uTypedAlloc(ModMapDef); - if (def) - { - def->common.stmtType = StmtModMapDef; - def->common.next = NULL; - def->merge = MergeDefault; - def->modifier = modifier; - def->keys = keys; - } - else - { - FATAL("Couldn't allocate mod mask definition in parser\n"); - /* NOTREACHED */ - } + def = malloc_or_die(sizeof(*def)); + + def->common.type = STMT_MODMAP; + def->common.next = NULL; + def->merge = MERGE_DEFAULT; + def->modifier = modifier; + def->keys = keys; return def; } IndicatorMapDef * -IndicatorMapCreate(uint32_t name, VarDef * body) +IndicatorMapCreate(xkb_atom_t name, VarDef * body) { IndicatorMapDef *def; - def = uTypedAlloc(IndicatorMapDef); - if (def) - { - def->common.stmtType = StmtIndicatorMapDef; - def->common.next = NULL; - def->merge = MergeDefault; - def->name = name; - def->body = body; - } - else - { - FATAL("Couldn't allocate indicator map definition in parser\n"); - /* NOTREACHED */ - } + def = malloc_or_die(sizeof(*def)); + + def->common.type = STMT_INDICATOR_MAP; + def->common.next = NULL; + def->merge = MERGE_DEFAULT; + def->name = name; + def->body = body; return def; } IndicatorNameDef * -IndicatorNameCreate(int ndx, ExprDef * name, Bool virtual) +IndicatorNameCreate(int ndx, ExprDef * name, bool virtual) { IndicatorNameDef *def; - def = uTypedAlloc(IndicatorNameDef); - if (def) - { - def->common.stmtType = StmtIndicatorNameDef; - def->common.next = NULL; - def->merge = MergeDefault; - def->ndx = ndx; - def->name = name; - def->virtual = virtual; - } - else - { - FATAL("Couldn't allocate indicator index definition in parser\n"); - /* NOTREACHED */ - } + def = malloc_or_die(sizeof(*def)); + + def->common.type = STMT_INDICATOR_NAME; + def->common.next = NULL; + def->merge = MERGE_DEFAULT; + def->ndx = ndx; + def->name = name; + def->virtual = virtual; return def; } ExprDef * -ActionCreate(uint32_t name, ExprDef * args) +ActionCreate(xkb_atom_t name, ExprDef * args) { ExprDef *act; - act = uTypedAlloc(ExprDef); - if (act) - { - act->common.stmtType = StmtExpr; - act->common.next = NULL; - act->op = ExprActionDecl; - act->value.action.name = name; - act->value.action.args = args; - return act; - } - FATAL("Couldn't allocate ActionDef in parser\n"); - return NULL; + act = malloc_or_die(sizeof(*act)); + + act->common.type = STMT_EXPR; + act->common.next = NULL; + act->op = EXPR_ACTION_DECL; + act->value.action.name = name; + act->value.action.args = args; + return act; } ExprDef * @@ -395,408 +299,395 @@ { ExprDef *def; - def = ExprCreate(ExprKeysymList, TypeSymbols); - if (def) - { - def->value.list.nSyms = 1; - def->value.list.szSyms = 4; - def->value.list.syms = uTypedCalloc(4, char *); - if (def->value.list.syms != NULL) - { - def->value.list.syms[0] = sym; - return def; - } - } - FATAL("Couldn't allocate expression for keysym list in parser\n"); - return NULL; -} - -ShapeDef * -ShapeDeclCreate(uint32_t name, OutlineDef * outlines) -{ - ShapeDef *shape; - OutlineDef *ol; - - shape = uTypedAlloc(ShapeDef); - if (shape != NULL) - { - bzero(shape, sizeof(ShapeDef)); - shape->common.stmtType = StmtShapeDef; - shape->common.next = NULL; - shape->merge = MergeDefault; - shape->name = name; - shape->nOutlines = 0; - shape->outlines = outlines; - for (ol = outlines; ol != NULL; ol = (OutlineDef *) ol->common.next) - { - if (ol->nPoints > 0) - shape->nOutlines++; - } - } - return shape; -} + def = ExprCreate(EXPR_KEYSYM_LIST, EXPR_TYPE_SYMBOLS); -OutlineDef * -OutlineCreate(uint32_t field, ExprDef * points) -{ - OutlineDef *outline; - ExprDef *pt; + darray_init(def->value.list.syms); + darray_init(def->value.list.symsMapIndex); + darray_init(def->value.list.symsNumEntries); + + darray_append(def->value.list.syms, sym); + darray_append(def->value.list.symsMapIndex, 0); + darray_append(def->value.list.symsNumEntries, 1); - outline = uTypedAlloc(OutlineDef); - if (outline != NULL) - { - bzero(outline, sizeof(OutlineDef)); - outline->common.stmtType = StmtOutlineDef; - outline->common.next = NULL; - outline->field = field; - outline->nPoints = 0; - if (points->op == ExprCoord) - { - for (pt = points; pt != NULL; pt = (ExprDef *) pt->common.next) - { - outline->nPoints++; - } - } - outline->points = points; - } - return outline; + return def; } -KeyDef * -KeyDeclCreate(char *name, ExprDef * expr) +ExprDef * +CreateMultiKeysymList(ExprDef *list) { - KeyDef *key; + size_t nLevels = darray_size(list->value.list.symsMapIndex); - key = uTypedAlloc(KeyDef); - if (key != NULL) - { - bzero(key, sizeof(KeyDef)); - key->common.stmtType = StmtKeyDef; - key->common.next = NULL; - if (name) - key->name = name; - else - key->expr = expr; - } - return key; -} - -RowDef * -RowDeclCreate(KeyDef * keys) -{ - RowDef *row; - KeyDef *key; + darray_resize(list->value.list.symsMapIndex, 1); + darray_resize(list->value.list.symsNumEntries, 1); + darray_item(list->value.list.symsMapIndex, 0) = 0; + darray_item(list->value.list.symsNumEntries, 0) = nLevels; - row = uTypedAlloc(RowDef); - if (row != NULL) - { - bzero(row, sizeof(RowDef)); - row->common.stmtType = StmtRowDef; - row->common.next = NULL; - row->nKeys = 0; - row->keys = keys; - for (key = keys; key != NULL; key = (KeyDef *) key->common.next) - { - if (key->common.stmtType == StmtKeyDef) - row->nKeys++; - } - } - return row; + return list; } -SectionDef * -SectionDeclCreate(uint32_t name, RowDef * rows) +ExprDef * +AppendKeysymList(ExprDef * list, char *sym) { - SectionDef *section; - RowDef *row; + size_t nSyms = darray_size(list->value.list.syms); - section = uTypedAlloc(SectionDef); - if (section != NULL) - { - bzero(section, sizeof(SectionDef)); - section->common.stmtType = StmtSectionDef; - section->common.next = NULL; - section->name = name; - section->nRows = 0; - section->rows = rows; - for (row = rows; row != NULL; row = (RowDef *) row->common.next) - { - if (row->common.stmtType == StmtRowDef) - section->nRows++; - } - } - return section; -} + darray_append(list->value.list.symsMapIndex, nSyms); + darray_append(list->value.list.symsNumEntries, 1); + darray_append(list->value.list.syms, sym); -OverlayKeyDef * -OverlayKeyCreate(char *under, char *over) -{ - OverlayKeyDef *key; - - key = uTypedAlloc(OverlayKeyDef); - if (key != NULL) - { - bzero(key, sizeof(OverlayKeyDef)); - key->common.stmtType = StmtOverlayKeyDef; - strncpy(key->over, over, XkbKeyNameLength); - strncpy(key->under, under, XkbKeyNameLength); - if (over) - free(over); - if (under) - free(under); - } - return key; + return list; } -OverlayDef * -OverlayDeclCreate(uint32_t name, OverlayKeyDef * keys) +ExprDef * +AppendMultiKeysymList(ExprDef * list, ExprDef * append) { - OverlayDef *ol; - OverlayKeyDef *key; + size_t nSyms = darray_size(list->value.list.syms); + size_t numEntries = darray_size(append->value.list.syms); - ol = uTypedAlloc(OverlayDef); - if (ol != NULL) - { - bzero(ol, sizeof(OverlayDef)); - ol->common.stmtType = StmtOverlayDef; - ol->name = name; - ol->keys = keys; - for (key = keys; key != NULL; - key = (OverlayKeyDef *) key->common.next) - { - ol->nKeys++; - } - } - return ol; -} - -DoodadDef * -DoodadCreate(unsigned type, uint32_t name, VarDef * body) -{ - DoodadDef *doodad; + darray_append(list->value.list.symsMapIndex, nSyms); + darray_append(list->value.list.symsNumEntries, numEntries); + darray_append_items(list->value.list.syms, + darray_mem(append->value.list.syms, 0), + numEntries); - doodad = uTypedAlloc(DoodadDef); - if (doodad != NULL) - { - bzero(doodad, sizeof(DoodadDef)); - doodad->common.stmtType = StmtDoodadDef; - doodad->common.next = NULL; - doodad->type = type; - doodad->name = name; - doodad->body = body; - } - return doodad; -} + darray_resize(append->value.list.syms, 0); + FreeStmt(&append->common); -ExprDef * -AppendKeysymList(ExprDef * list, char *sym) -{ - if (list->value.list.nSyms >= list->value.list.szSyms) - { - list->value.list.szSyms *= 2; - list->value.list.syms = uTypedRecalloc(list->value.list.syms, - list->value.list.nSyms, - list->value.list.szSyms, - char *); - if (list->value.list.syms == NULL) - { - FATAL("Couldn't resize list of symbols for append\n"); - return NULL; - } - } - list->value.list.syms[list->value.list.nSyms++] = sym; return list; } -int -LookupKeysym(char *str, uint32_t * sym_rtrn) +bool +LookupKeysym(const char *str, xkb_keysym_t *sym_rtrn) { - uint32_t sym; + xkb_keysym_t sym; - if ((!str) || (uStrCaseCmp(str, "any") == 0) - || (uStrCaseCmp(str, "nosymbol") == 0)) - { - *sym_rtrn = NoSymbol; + if (!str || istreq(str, "any") || istreq(str, "nosymbol")) { + *sym_rtrn = XKB_KEY_NoSymbol; return 1; } - else if ((uStrCaseCmp(str, "none") == 0) - || (uStrCaseCmp(str, "voidsymbol") == 0)) - { - *sym_rtrn = XK_VoidSymbol; + + if (istreq(str, "none") || istreq(str, "voidsymbol")) { + *sym_rtrn = XKB_KEY_VoidSymbol; return 1; } - sym = xkb_string_to_keysym(str); - if (sym != NoSymbol) - { + + sym = xkb_keysym_from_name(str); + if (sym != XKB_KEY_NoSymbol) { *sym_rtrn = sym; return 1; } + return 0; } +static void +FreeInclude(IncludeStmt *incl); + IncludeStmt * -IncludeCreate(char *str, unsigned merge) +IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge) { IncludeStmt *incl, *first; char *file, *map, *stmt, *tmp, *extra_data; char nextop; - Bool haveSelf; - haveSelf = False; incl = first = NULL; file = map = NULL; tmp = str; - stmt = _XkbDupString(str); - while ((tmp) && (*tmp)) + stmt = strdup_safe(str); + while (tmp && *tmp) { - if (XkbParseIncludeMap(&tmp, &file, &map, &nextop, &extra_data)) - { - if ((file == NULL) && (map == NULL)) - { - if (haveSelf) - goto BAIL; - haveSelf = True; - } - if (first == NULL) - first = incl = uTypedAlloc(IncludeStmt); - else - { - incl->next = uTypedAlloc(IncludeStmt); - incl = incl->next; - } - if (incl) - { - incl->common.stmtType = StmtInclude; - incl->common.next = NULL; - incl->merge = merge; - incl->stmt = NULL; - incl->file = file; - incl->map = map; - incl->modifier = extra_data; - incl->path = NULL; - incl->next = NULL; - } - else - { - WSGO("Allocation failure in IncludeCreate\n"); - ACTION("Using only part of the include\n"); - break; - } - if (nextop == '|') - merge = MergeAugment; - else - merge = MergeOverride; - } + if (!XkbParseIncludeMap(&tmp, &file, &map, &nextop, &extra_data)) + goto err; + + if (first == NULL) { + first = incl = malloc(sizeof(*first)); + } else { + incl->next_incl = malloc(sizeof(*first)); + incl = incl->next_incl; + } + + if (!incl) { + log_wsgo(ctx, + "Allocation failure in IncludeCreate; " + "Using only part of the include\n"); + 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 - { - goto BAIL; - } + merge = MERGE_OVERRIDE; } + if (first) first->stmt = stmt; - else if (stmt) + else free(stmt); + return first; - BAIL: - ERROR("Illegal include statement \"%s\"\n", stmt); - ACTION("Ignored\n"); - while (first) - { - incl = first->next; - if (first->file) - free(first->file); - if (first->map) - free(first->map); - if (first->modifier) - free(first->modifier); - if (first->path) - free(first->path); - first->file = first->map = first->path = NULL; - free(first); - first = incl; - } - if (stmt) - free(stmt); + +err: + log_err(ctx, "Illegal include statement \"%s\"; Ignored\n", stmt); + FreeInclude(first); + free(stmt); return NULL; } -#ifdef DEBUG void -PrintStmtAddrs(ParseCommon * stmt) +CheckDefaultMap(struct xkb_context *ctx, XkbFile *maps, const char *fileName) { - fprintf(stderr, "0x%x", stmt); - if (stmt) - { - do - { - fprintf(stderr, "->0x%x", stmt->next); - stmt = stmt->next; - } - while (stmt); + XkbFile *dflt = NULL, *tmp; + + for (tmp = maps; tmp; tmp = (XkbFile *) tmp->common.next) { + if (!(tmp->flags & XkbLC_Default)) + continue; + if (!dflt) { + dflt = tmp; + continue; + } + + log_lvl(ctx, 3, + "Multiple default components in %s; " + "Using %s, ignoring %s\n", + (fileName ? fileName : "(unknown)"), + (dflt->name ? dflt->name : "(first)"), + (tmp->name ? tmp->name : "(subsequent)")); + + tmp->flags &= (~XkbLC_Default); } - fprintf(stderr, "\n"); } -#endif -void -CheckDefaultMap(XkbFile * maps) +/* + * All latin-1 alphanumerics, plus parens, slash, minus, underscore and + * wildcards. + */ +static const unsigned char componentSpecLegal[] = { + 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 +}; + +static void +EnsureSafeMapName(char *name) +{ + if (!name) + return; + + while (*name != '\0') { + if ((componentSpecLegal[(*name) / 8] & (1 << ((*name) % 8))) == 0) + *name = '_'; + name++; + } +} + +XkbFile * +CreateXKBFile(struct xkb_context *ctx, enum xkb_file_type type, char *name, + ParseCommon *defs, unsigned flags) +{ + XkbFile *file; + + file = calloc(1, sizeof(*file)); + if (!file) + return NULL; + + EnsureSafeMapName(name); + file->file_type = type; + file->topName = strdup_safe(name); + file->name = name; + file->defs = defs; + file->id = xkb_context_take_file_id(ctx); + file->flags = flags; + return file; +} + +static void +FreeExpr(ExprDef *expr) { - XkbFile *dflt, *tmp; + char **sym; - dflt = NULL; - for (tmp = maps, dflt = NULL; tmp != NULL; - tmp = (XkbFile *) tmp->common.next) + if (!expr) + return; + + switch (expr->op) { + case EXPR_ACTION_LIST: + case EXPR_NEGATE: + case EXPR_UNARY_PLUS: + case EXPR_NOT: + case EXPR_INVERT: + FreeStmt(&expr->value.child->common); + break; + + case EXPR_DIVIDE: + case EXPR_ADD: + case EXPR_SUBTRACT: + case EXPR_MULTIPLY: + case EXPR_ASSIGN: + FreeStmt(&expr->value.binary.left->common); + FreeStmt(&expr->value.binary.right->common); + break; + + case EXPR_ACTION_DECL: + FreeStmt(&expr->value.action.args->common); + break; + + case EXPR_ARRAY_REF: + FreeStmt(&expr->value.array.entry->common); + break; + + case EXPR_KEYSYM_LIST: + darray_foreach(sym, expr->value.list.syms) + free(*sym); + darray_free(expr->value.list.syms); + darray_free(expr->value.list.symsMapIndex); + darray_free(expr->value.list.symsNumEntries); + break; + + default: + break; + } +} + +static void +FreeInclude(IncludeStmt *incl) +{ + IncludeStmt *next; + + while (incl) { - if (tmp->flags & XkbLC_Default) - { - if (dflt == NULL) - dflt = tmp; - else - { - if (warningLevel > 2) - { - WARN("Multiple default components in %s\n", - (scanFile ? scanFile : "(unknown)")); - ACTION("Using %s, ignoring %s\n", - (dflt->name ? dflt->name : "(first)"), - (tmp->name ? tmp->name : "(subsequent)")); - } - tmp->flags &= (~XkbLC_Default); - } - } + next = incl->next_incl; + + free(incl->file); + free(incl->map); + free(incl->modifier); + free(incl->stmt); + + free(incl); + incl = next; } - return; } -XkbFile * -CreateXKBFile(int type, char *name, ParseCommon * defs, unsigned flags) +void +FreeStmt(ParseCommon *stmt) { - XkbFile *file; - static int fileID; + ParseCommon *next; + YYSTYPE u; - file = uTypedAlloc(XkbFile); - if (file) + while (stmt) { - XkbcEnsureSafeMapName(name); - bzero(file, sizeof(XkbFile)); - file->type = type; - file->topName = _XkbDupString(name); - file->name = name; - file->defs = defs; - file->id = fileID++; - file->compiled = False; - file->flags = flags; + next = stmt->next; + u.any = stmt; + + switch (stmt->type) { + case STMT_INCLUDE: + FreeInclude((IncludeStmt *) stmt); + /* stmt is already free'd here. */ + stmt = NULL; + break; + case STMT_EXPR: + FreeExpr(u.expr); + break; + case STMT_VAR: + FreeStmt(&u.var->name->common); + FreeStmt(&u.var->value->common); + break; + case STMT_TYPE: + FreeStmt(&u.keyType->body->common); + break; + case STMT_INTERP: + free(u.interp->sym); + FreeStmt(&u.interp->match->common); + FreeStmt(&u.interp->def->common); + break; + case STMT_VMOD: + FreeStmt(&u.vmod->value->common); + break; + case STMT_SYMBOLS: + FreeStmt(&u.syms->symbols->common); + break; + case STMT_MODMAP: + FreeStmt(&u.modMask->keys->common); + break; + case STMT_GROUP_COMPAT: + FreeStmt(&u.groupCompat->def->common); + break; + case STMT_INDICATOR_MAP: + FreeStmt(&u.ledMap->body->common); + break; + case STMT_INDICATOR_NAME: + FreeStmt(&u.ledName->name->common); + break; + default: + break; + } + + free(stmt); + stmt = next; } - return file; } -unsigned -StmtSetMerge(ParseCommon * stmt, unsigned merge) +void +FreeXKBFile(XkbFile *file) { - if ((merge == MergeAltForm) && (stmt->stmtType != StmtKeycodeDef)) + XkbFile *next; + + while (file) { - yyerror("illegal use of 'alternate' merge mode"); - merge = MergeDefault; + 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->topName); + free(file); + file = next; } - return merge; +} + +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_INDICATOR_MAP] = "indicator map declaration", + [STMT_INDICATOR_NAME] = "indicator name declaration", +}; + +const char * +StmtTypeToString(enum stmt_type type) +{ + if (type >= _STMT_NUM_VALUES) + type = STMT_UNKNOWN; + return stmt_type_strings[type]; } diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/parseutils.h libxkbcommon-0.1.0~2/src/xkbcomp/parseutils.h --- libxkbcommon-0.1.0~1/src/xkbcomp/parseutils.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/parseutils.h 2012-08-11 16:17:00.000000000 +0000 @@ -1,203 +1,145 @@ /************************************************************ - 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 (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 XKBPARSE_H -#define XKBPARSE_H 1 - -#include "xkbcomp.h" - -extern char scanBuf[1024]; -extern int scanInt; -extern int lineNum; - -extern XkbFile *rtrnValue; - -#ifdef DEBUG -#define d(str) fprintf(stderr,"%s\n",str); -#define d1(str,a) fprintf(stderr,str,a); -#define d2(str,a,b) fprintf(stderr,str,a,b); -#else -#define d(str) -#define d1(str,a) -#define d2(str,a,b) -#endif - - -extern ParseCommon *AppendStmt(ParseCommon * /* to */ , - ParseCommon * /* append */ - ); - -extern ExprDef *ExprCreate(unsigned /* op */ , - unsigned /* type */ - ); - -extern ExprDef *ExprCreateUnary(unsigned /* op */ , - unsigned /* type */ , - ExprDef * /* child */ - ); - -extern ExprDef *ExprCreateBinary(unsigned /* op */ , - ExprDef * /* left */ , - ExprDef * /* right */ - ); +#ifndef PARSEUTILS_H +#define PARSEUTILS_H -extern KeycodeDef *KeycodeCreate(char * /* name */ , - ExprDef * /* value */ - ); +#include -extern KeyAliasDef *KeyAliasCreate(char * /* alias */ , - char * /* real */ - ); +#include "xkbcomp-priv.h" -extern VModDef *VModCreate(uint32_t /* name */ , - ExprDef * /* value */ - ); +struct parser_param { + struct xkb_context *ctx; + void *scanner; + XkbFile *rtrn; +}; -extern VarDef *VarCreate(ExprDef * /* name */ , - ExprDef * /* value */ - ); +#include "parser.h" -extern VarDef *BoolVarCreate(uint32_t /* nameToken */ , - unsigned /* set */ - ); +struct scanner_extra { + struct xkb_context *ctx; + char *scanFile; + char scanBuf[1024]; + char *s; +}; -extern InterpDef *InterpCreate(char * /* sym */ , - ExprDef * /* match */ - ); +extern ParseCommon * +AppendStmt(ParseCommon *to, ParseCommon *append); -extern KeyTypeDef *KeyTypeCreate(uint32_t /* name */ , - VarDef * /* body */ - ); +extern ExprDef * +ExprCreate(enum expr_op_type op, enum expr_value_type type); -extern SymbolsDef *SymbolsCreate(char * /* keyName */ , - ExprDef * /* symbols */ - ); +extern ExprDef * +ExprCreateUnary(enum expr_op_type op, enum expr_value_type type, + ExprDef *child); -extern GroupCompatDef *GroupCompatCreate(int /* group */ , - ExprDef * /* def */ - ); +extern ExprDef * +ExprCreateBinary(enum expr_op_type op, ExprDef *left, ExprDef *right); -extern ModMapDef *ModMapCreate(uint32_t /* modifier */ , - ExprDef * /* keys */ - ); +KeycodeDef * +KeycodeCreate(char keyName[XkbKeyNameLength], unsigned long value); -extern IndicatorMapDef *IndicatorMapCreate(uint32_t /* name */ , - VarDef * /* body */ - ); +extern KeyAliasDef * +KeyAliasCreate(char keyName[XkbKeyNameLength], char real[XkbKeyNameLength]); -extern IndicatorNameDef *IndicatorNameCreate(int /* ndx */ , - ExprDef * /* name */ , - Bool /* virtual */ - ); +extern VModDef * +VModCreate(xkb_atom_t name, ExprDef *value); -extern ExprDef *ActionCreate(uint32_t /* name */ , - ExprDef * /* args */ - ); +extern VarDef * +VarCreate(ExprDef *name, ExprDef *value); -extern ExprDef *CreateKeysymList(char * /* sym */ - ); +extern VarDef * +BoolVarCreate(xkb_atom_t nameToken, unsigned set); -extern ShapeDef *ShapeDeclCreate(uint32_t /* name */ , - OutlineDef * /* outlines */ - ); +extern InterpDef * +InterpCreate(char *sym, ExprDef *match); -extern OutlineDef *OutlineCreate(uint32_t /* field */ , - ExprDef * /* points */ - ); +extern KeyTypeDef * +KeyTypeCreate(xkb_atom_t name, VarDef *body); -extern KeyDef *KeyDeclCreate(char * /* name */ , - ExprDef * /* expr */ - ); +extern SymbolsDef * +SymbolsCreate(char keyName[XkbKeyNameLength], ExprDef *symbols); -extern RowDef *RowDeclCreate(KeyDef * /* keys */ - ); +extern GroupCompatDef * +GroupCompatCreate(int group, ExprDef *def); -extern SectionDef *SectionDeclCreate(uint32_t /* name */ , - RowDef * /* rows */ - ); +extern ModMapDef * +ModMapCreate(uint32_t modifier, ExprDef *keys); -extern OverlayKeyDef *OverlayKeyCreate(char * /* under */ , - char * /* over */ - ); +extern IndicatorMapDef * +IndicatorMapCreate(xkb_atom_t name, VarDef *body); -extern OverlayDef *OverlayDeclCreate(uint32_t /* name */ , - OverlayKeyDef * /* rows */ - ); +extern IndicatorNameDef * +IndicatorNameCreate(int ndx, ExprDef *name, bool virtual); -extern DoodadDef *DoodadCreate(unsigned /* type */ , - uint32_t /* name */ , - VarDef * /* body */ - ); +extern ExprDef * +ActionCreate(xkb_atom_t name, ExprDef *args); -extern ExprDef *AppendKeysymList(ExprDef * /* list */ , - char * /* sym */ - ); +extern ExprDef * +CreateMultiKeysymList(ExprDef *list); -extern int LookupKeysym(char * /* str */ , - uint32_t * /* sym_rtrn */ - ); +extern ExprDef * +CreateKeysymList(char *sym); -extern IncludeStmt *IncludeCreate(char * /* str */ , - unsigned /* merge */ - ); +extern ExprDef * +AppendMultiKeysymList(ExprDef *list, ExprDef *append); -extern unsigned StmtSetMerge(ParseCommon * /* stmt */ , - unsigned /* merge */ - ); +extern ExprDef * +AppendKeysymList(ExprDef *list, char *sym); -#ifdef DEBUG -extern void PrintStmtAddrs(ParseCommon * /* stmt */ - ); -#endif +bool +LookupKeysym(const char *str, xkb_keysym_t *sym_rtrn); -extern int XKBParseFile(FILE * /* file */ , - XkbFile ** /* pRtrn */ - ); +extern IncludeStmt * +IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge); -extern int XKBParseString(const char *string, XkbFile ** pRtrn); +extern void +CheckDefaultMap(struct xkb_context *ctx, XkbFile *maps, const char *fileName); -extern void CheckDefaultMap(XkbFile * maps); +extern XkbFile * +CreateXKBFile(struct xkb_context *ctx, enum xkb_file_type type, char *name, + ParseCommon *defs, + unsigned flags); -extern XkbFile *CreateXKBFile(int /* type */ , - char * /* name */ , - ParseCommon * /* defs */ , - unsigned /* flags */ - ); +extern bool +XKBParseFile(struct xkb_context *ctx, FILE *file, const char *file_name, + XkbFile **out); -extern void yyerror(const char * /* s */ - ); +extern bool +XKBParseString(struct xkb_context *context, const char *string, + const char *file_name, + XkbFile **out); -extern int yylex(void); -extern int yyparse(void); +extern void +FreeXKBFile(XkbFile *file); -extern void setScanState(char * /* file */ , - int /* line */ - ); +extern void +FreeStmt(ParseCommon *stmt); -extern FILE *yyin; -extern const char *yystring; +void +scanner_error(struct YYLTYPE *loc, void *scanner, const char *msg); -#endif /* XKBPARSE_H */ +#endif /* PARSEUTILS_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/path.c libxkbcommon-0.1.0~2/src/xkbcomp/path.c --- libxkbcommon-0.1.0~1/src/xkbcomp/path.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/path.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,281 @@ +/************************************************************ + * 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 +#include + +#include "path.h" +#include "parseutils.h" + +/** + * Extract the first token from an include statement. + * @param str_inout Input statement, modified in-place. Can be passed in + * repeatedly. If str_inout is NULL, the parsing has completed. + * @param file_rtrn Set to the include file to be used. + * @param map_rtrn Set to whatever comes after ), if any. + * @param nextop_rtrn Set to the next operation in the complete statement. + * @param extra_data Set to the string between ( and ), if any. + * + * @return true if parsing was succcessful, false for an illegal string. + * + * Example: "evdev+aliases(qwerty)" + * str_inout = aliases(qwerty) + * nextop_retrn = + + * extra_data = NULL + * file_rtrn = evdev + * map_rtrn = NULL + * + * 2nd run with "aliases(qwerty)" + * str_inout = NULL + * file_rtrn = aliases + * map_rtrn = qwerty + * extra_data = NULL + * nextop_retrn = "" + * + */ +bool +XkbParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, + char *nextop_rtrn, char **extra_data) +{ + char *tmp, *str, *next; + + str = *str_inout; + + /* search for tokens inside the string */ + next = strpbrk(str, "|+"); + if (next) { + /* set nextop_rtrn to \0, next to next character */ + *nextop_rtrn = *next; + *next++ = '\0'; + } + else { + *nextop_rtrn = '\0'; + next = NULL; + } + + /* search for :, store result in extra_data */ + tmp = strchr(str, ':'); + if (tmp != NULL) { + *tmp++ = '\0'; + *extra_data = strdup(tmp); + } + else { + *extra_data = NULL; + } + + tmp = strchr(str, '('); + if (tmp == NULL) { + *file_rtrn = strdup(str); + *map_rtrn = NULL; + } + else if (str[0] == '(') { + free(*extra_data); + return false; + } + else { + *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); + } + + if (*nextop_rtrn == '\0') + *str_inout = NULL; + else if ((*nextop_rtrn == '|') || (*nextop_rtrn == '+')) + *str_inout = next; + else + return false; + + return true; +} + +/***====================================================================***/ + +/** + * Return the xkb directory based on the type. + */ +const char * +XkbDirectoryForInclude(enum xkb_file_type type) +{ + switch (type) { + case FILE_TYPE_KEYMAP: + return "keymap"; + + case FILE_TYPE_KEYCODES: + return "keycodes"; + + case FILE_TYPE_TYPES: + return "types"; + + case FILE_TYPE_SYMBOLS: + return "symbols"; + + case FILE_TYPE_COMPAT: + return "compat"; + + case FILE_TYPE_GEOMETRY: + return "geometry"; + + case FILE_TYPE_RULES: + return "rules"; + + default: + return ""; + } +} + +/***====================================================================***/ + +/** + * Search for the given file name in the include directories. + * + * @param ctx the XKB ctx containing the include paths + * @param type one of FILE_TYPE_TYPES, FILE_TYPE_COMPAT, ..., or + * FILE_TYPE_KEYMAP or FILE_TYPE_RULES + * @param pathRtrn is set to the full path of the file if found. + * + * @return an FD to the file or NULL. If NULL is returned, the value of + * pathRtrn is undefined. + */ +FILE * +XkbFindFileInPath(struct xkb_context *ctx, const char *name, + enum xkb_file_type type, char **pathRtrn) +{ + size_t i; + int ret; + FILE *file = NULL; + char buf[PATH_MAX]; + const char *typeDir; + + typeDir = XkbDirectoryForInclude(type); + for (i = 0; i < xkb_context_num_include_paths(ctx); i++) { + ret = snprintf(buf, sizeof(buf), "%s/%s/%s", + xkb_context_include_path_get(ctx, i), typeDir, name); + if (ret >= (ssize_t) sizeof(buf)) { + log_err(ctx, "File name (%s/%s/%s) too long\n", + xkb_context_include_path_get(ctx, i), typeDir, name); + continue; + } + file = fopen(buf, "r"); + if (file == NULL) { + log_err(ctx, "Couldn't open file (%s/%s/%s): %s\n", + xkb_context_include_path_get(ctx, i), typeDir, name, + strerror(errno)); + continue; + } + break; + } + + if ((file != NULL) && (pathRtrn != NULL)) + *pathRtrn = strdup(buf); + return file; +} + +/** + * Open the file given in the include statement and parse it's content. + * If the statement defines a specific map to use, this map is returned in + * file_rtrn. Otherwise, the default map is returned. + * + * @param ctx The ctx containing include paths + * @param stmt The include statement, specifying the file name to look for. + * @param file_type Type of file (FILE_TYPE_KEYCODES, etc.) + * @param file_rtrn Returns the key map to be used. + * @param merge_rtrn Always returns stmt->merge. + * + * @return true on success or false otherwise. + */ +bool +ProcessIncludeFile(struct xkb_context *ctx, + IncludeStmt * stmt, + enum xkb_file_type file_type, + XkbFile ** file_rtrn, enum merge_mode *merge_rtrn) +{ + FILE *file; + XkbFile *rtrn, *mapToUse, *next; + + file = XkbFindFileInPath(ctx, stmt->file, file_type, NULL); + if (file == NULL) { + log_err(ctx, "Can't find file \"%s\" for %s include\n", stmt->file, + XkbDirectoryForInclude(file_type)); + return false; + } + + if (!XKBParseFile(ctx, file, stmt->file, &rtrn)) { + log_err(ctx, "Error interpreting include file \"%s\"\n", stmt->file); + fclose(file); + return false; + } + fclose(file); + + mapToUse = rtrn; + if (stmt->map != NULL) { + while (mapToUse) + { + next = (XkbFile *) mapToUse->common.next; + mapToUse->common.next = NULL; + if (streq(mapToUse->name, stmt->map) && + mapToUse->file_type == file_type) { + FreeXKBFile(next); + break; + } + else { + FreeXKBFile(mapToUse); + } + mapToUse = next; + } + if (!mapToUse) { + log_err(ctx, "No %s named \"%s\" in the include file \"%s\"\n", + FileTypeText(file_type), stmt->map, stmt->file); + return false; + } + } + else if (rtrn->common.next) { + log_lvl(ctx, 5, + "No map in include statement, but \"%s\" contains several; " + "Using first defined map, \"%s\"\n", + stmt->file, rtrn->name); + } + if (mapToUse->file_type != file_type) { + log_err(ctx, + "Include file wrong type (expected %s, got %s); " + "Include file \"%s\" ignored\n", + FileTypeText(file_type), FileTypeText(mapToUse->file_type), + stmt->file); + return false; + } + /* FIXME: we have to check recursive includes here (or somewhere) */ + + *file_rtrn = mapToUse; + *merge_rtrn = stmt->merge; + return true; +} diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/path.h libxkbcommon-0.1.0~2/src/xkbcomp/path.h --- libxkbcommon-0.1.0~1/src/xkbcomp/path.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/path.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,46 @@ +/************************************************************ + * 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_PATH_H +#define XKBCOMP_PATH_H + +#include + +#include "xkbcomp-priv.h" + +bool +XkbParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, + char *nextop_rtrn, + char **extra_data); + +const char * +XkbDirectoryForInclude(enum xkb_file_type type); + +FILE * +XkbFindFileInPath(struct xkb_context *ctx, const char *name, + enum xkb_file_type type, char **pathRtrn); + +#endif /* XKBCOMP_PATH_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/rules.c libxkbcommon-0.1.0~2/src/xkbcomp/rules.c --- libxkbcommon-0.1.0~1/src/xkbcomp/rules.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/rules.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,1126 @@ +/************************************************************ + * 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. + * + ********************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include "rules.h" +#include "path.h" + +static const char * +input_line_get(struct xkb_context *ctx, const char *buf, const char *end, + darray_char *line) +{ + int ch; + bool space_pending; + bool slash_pending; + bool in_comment; + + while (buf < end && darray_empty(*line)) { + space_pending = slash_pending = in_comment = false; + + while (buf < end && (ch = *buf++) != '\n') { + if (ch == '\\') { + buf++; + if (buf >= end) + break; + ch = *buf; + + if (ch == '\n') { + in_comment = false; + ch = ' '; + } + } + + if (in_comment) + continue; + + if (ch == '/') { + if (slash_pending) { + in_comment = true; + slash_pending = false; + } + else { + slash_pending = true; + } + + continue; + } + + if (slash_pending) { + if (space_pending) { + darray_append(*line, ' '); + space_pending = false; + } + + darray_append(*line, '/'); + slash_pending = false; + } + + if (isspace(ch)) { + while (buf < end && isspace(ch) && ch != '\n') + ch = *buf++; + + if (buf >= end) + break; + + if (ch != '\n' && !darray_empty(*line)) + space_pending = true; + + buf--; + } + else { + if (space_pending) { + darray_append(*line, ' '); + space_pending = false; + } + + if (ch == '!') { + if (!darray_empty(*line)) { + log_warn(ctx, + "The '!' is legal only at start of line; " + "Line containing '!' ignored\n"); + darray_resize(*line, 0); + break; + } + } + + darray_append(*line, ch); + } + } + } + + if (darray_empty(*line) && buf >= end) + return NULL; + + darray_append(*line, '\0'); + return buf; +} + +/***====================================================================***/ + +enum { + /* "Parts" - the MLVO which rules file maps to components. */ + MODEL = 0, + LAYOUT, + VARIANT, + OPTION, + +#define PART_MASK \ + ((1 << MODEL) | (1 << LAYOUT) | (1 << VARIANT) | (1 << OPTION)) + + /* Components */ + KEYCODES, + SYMBOLS, + TYPES, + COMPAT, + GEOMETRY, + +#define COMPONENT_MASK \ + ((1 << KEYCODES) | (1 << SYMBOLS) | (1 << TYPES) | (1 << COMPAT) | \ + (1 << GEOMETRY)) + + MAX_WORDS +}; + +static const char *cname[] = { + [MODEL] = "model", + [LAYOUT] = "layout", + [VARIANT] = "variant", + [OPTION] = "option", + + [KEYCODES] = "keycodes", + [SYMBOLS] = "symbols", + [TYPES] = "types", + [COMPAT] = "compat", + [GEOMETRY] = "geometry", +}; + +struct multi_defs { + const char *model; + const char *layout[XkbNumKbdGroups + 1]; + const char *variant[XkbNumKbdGroups + 1]; + char *options; +}; + +struct mapping { + /* Sequential id for the mappings. */ + int number; + size_t num_maps; + + struct { + int word; + int index; + } map[MAX_WORDS]; +}; + +struct var_desc { + char *name; + char *desc; +}; + +struct group { + int number; + char *name; + char *words; +}; + +enum rule_flag { + RULE_FLAG_PENDING_MATCH = (1L << 1), + RULE_FLAG_OPTION = (1L << 2), + RULE_FLAG_APPEND = (1L << 3), + RULE_FLAG_NORMAL = (1L << 4), +}; + +struct rule { + int number; + + char *model; + char *layout; + int layout_num; + char *variant; + int variant_num; + char *option; + + /* yields */ + + char *keycodes; + char *symbols; + char *types; + char *compat; + unsigned flags; +}; + +struct rules { + darray(struct rule) rules; + darray(struct group) groups; +}; + +/***====================================================================***/ + +/* + * Resolve numeric index, such as "[4]" in layout[4]. Missing index + * means zero. + */ +static char * +get_index(char *str, int *ndx) +{ + int empty = 0, consumed = 0, num; + + sscanf(str, "[%n%d]%n", &empty, &num, &consumed); + if (consumed > 0) { + *ndx = num; + str += consumed; + } + else if (empty > 0) { + *ndx = -1; + } + else { + *ndx = 0; + } + + return str; +} + +/* + * Match a mapping line which opens a rule, e.g: + * ! model layout[4] variant[4] = symbols geometry + * Which will be followed by lines such as: + * * ben basic = +in(ben):4 nec(pc98) + * So if the MLVO matches the LHS of some line, we'll get the components + * on the RHS. + * In this example, we will get for the second and fourth columns: + * mapping->map[1] = {.word = LAYOUT, .index = 4} + * mapping->map[3] = {.word = SYMBOLS, .index = 0} + */ +static void +match_mapping_line(struct xkb_context *ctx, darray_char *line, + struct mapping *mapping) +{ + char *tok; + char *str = darray_mem(*line, 1); + unsigned present = 0, layout_ndx_present = 0, variant_ndx_present = 0; + int i, tmp; + size_t len; + int ndx; + char *strtok_buf; + bool found; + + /* + * Remember the last sequential mapping id (incremented if the match + * is successful). + */ + tmp = mapping->number; + memset(mapping, 0, sizeof(*mapping)); + mapping->number = tmp; + + while ((tok = strtok_r(str, " ", &strtok_buf)) != NULL) { + found = false; + str = NULL; + + if (streq(tok, "=")) + continue; + + for (i = 0; i < MAX_WORDS; i++) { + len = strlen(cname[i]); + + if (strncmp(cname[i], tok, len) == 0) { + if (strlen(tok) > len) { + char *end = get_index(tok + len, &ndx); + + if ((i != LAYOUT && i != VARIANT) || + *end != '\0' || ndx == -1) { + log_warn(ctx, + "Illegal %s index: %d\n", cname[i], ndx); + log_warn(ctx, "Can only index layout and variant\n"); + break; + } + + if (ndx < 1 || ndx > XkbNumKbdGroups) { + log_warn(ctx, "Illegal %s index: %d\n", + cname[i], ndx); + log_warn(ctx, "Index must be in range 1..%d\n", + XkbNumKbdGroups); + break; + } + } + else { + ndx = 0; + } + + found = true; + + if (present & (1 << i)) { + if ((i == LAYOUT && layout_ndx_present & (1 << ndx)) || + (i == VARIANT && variant_ndx_present & (1 << ndx))) { + log_warn(ctx, + "Component \"%s\" listed twice; " + "Second definition ignored\n", tok); + break; + } + } + + present |= (1 << i); + if (i == LAYOUT) + layout_ndx_present |= 1 << ndx; + if (i == VARIANT) + variant_ndx_present |= 1 << ndx; + + mapping->map[mapping->num_maps].word = i; + mapping->map[mapping->num_maps].index = ndx; + mapping->num_maps++; + break; + } + } + + if (!found) + log_warn(ctx, "Unknown component \"%s\"; Ignored\n", tok); + } + + if ((present & PART_MASK) == 0) { + log_warn(ctx, + "Mapping needs at least one MLVO part; " + "Illegal mapping ignored\n"); + mapping->num_maps = 0; + return; + } + + if ((present & COMPONENT_MASK) == 0) { + log_warn(ctx, + "Mapping needs at least one component; " + "Illegal mapping ignored\n"); + mapping->num_maps = 0; + return; + } + + mapping->number++; +} + +/* + * Match a line such as: + * ! $pcmodels = pc101 pc102 pc104 pc105 + */ +static bool +match_group_line(darray_char *line, struct group *group) +{ + int i; + char *name = strchr(darray_mem(*line, 0), '$'); + char *words = strchr(name, ' '); + + if (!words) + return false; + + *words++ = '\0'; + + for (; *words; words++) { + if (*words != '=' && *words != ' ') + break; + } + + if (*words == '\0') + return false; + + group->name = strdup(name); + group->words = strdup(words); + + words = group->words; + for (i = 1; *words; words++) { + if (*words == ' ') { + *words++ = '\0'; + i++; + } + } + group->number = i; + + return true; + +} + +/* Match lines following a mapping (see match_mapping_line comment). */ +static bool +match_rule_line(struct xkb_context *ctx, darray_char *line, + struct mapping *mapping, struct rule *rule) +{ + char *str, *tok; + int nread, i; + char *strtok_buf; + bool append = false; + const char *names[MAX_WORDS] = { NULL }; + + if (mapping->num_maps == 0) { + log_warn(ctx, + "Must have a mapping before first line of data; " + "Illegal line of data ignored\n"); + return false; + } + + str = darray_mem(*line, 0); + + for (nread = 0; (tok = strtok_r(str, " ", &strtok_buf)) != NULL; + nread++) { + str = NULL; + + if (streq(tok, "=")) { + nread--; + continue; + } + + if (nread > mapping->num_maps) { + log_warn(ctx, + "Too many words on a line; " + "Extra word \"%s\" ignored\n", tok); + continue; + } + + names[mapping->map[nread].word] = tok; + if (*tok == '+' || *tok == '|') + append = true; + } + + if (nread < mapping->num_maps) { + log_warn(ctx, "Too few words on a line: %s; Line ignored\n", + darray_mem(*line, 0)); + return false; + } + + rule->flags = 0; + rule->number = mapping->number; + + if (names[OPTION]) + rule->flags |= RULE_FLAG_OPTION; + else if (append) + rule->flags |= RULE_FLAG_APPEND; + else + rule->flags |= RULE_FLAG_NORMAL; + + rule->model = strdup_safe(names[MODEL]); + rule->layout = strdup_safe(names[LAYOUT]); + rule->variant = strdup_safe(names[VARIANT]); + rule->option = strdup_safe(names[OPTION]); + + rule->keycodes = strdup_safe(names[KEYCODES]); + rule->symbols = strdup_safe(names[SYMBOLS]); + rule->types = strdup_safe(names[TYPES]); + rule->compat = strdup_safe(names[COMPAT]); + + rule->layout_num = rule->variant_num = 0; + for (i = 0; i < nread; i++) { + if (mapping->map[i].index) { + if (mapping->map[i].word == LAYOUT) + rule->layout_num = mapping->map[i].index; + if (mapping->map[i].word == VARIANT) + rule->variant_num = mapping->map[i].index; + } + } + + return true; +} + +static bool +match_line(struct xkb_context *ctx, darray_char *line, + struct mapping *mapping, struct rule *rule, + struct group *group) +{ + if (darray_item(*line, 0) != '!') + return match_rule_line(ctx, line, mapping, rule); + + if (darray_item(*line, 1) == '$' || + (darray_item(*line, 1) == ' ' && darray_item(*line, 2) == '$')) + return match_group_line(line, group); + + match_mapping_line(ctx, line, mapping); + return false; +} + +static void +squeeze_spaces(char *p1) +{ + char *p2; + + for (p2 = p1; *p2; p2++) { + *p1 = *p2; + if (*p1 != ' ') + p1++; + } + + *p1 = '\0'; +} + +/* + * Expand the layout and variant of the rule_names and remove extraneous + * spaces. If there's one layout/variant, it is kept in + * .layout[0]/.variant[0], else is kept in [1], [2] and so on, and [0] + * remains empty. For example, this rule_names: + * .model = "pc105", + * .layout = "us,il,ru,ca" + * .variant = ",,,multix" + * .options = "grp:alts_toggle, ctrl:nocaps, compose:rwin" + * Is expanded into this multi_defs: + * .model = "pc105" + * .layout = {NULL, "us", "il", "ru", "ca"}, + * .variant = {NULL, "", "", "", "multix"}, + * .options = "grp:alts_toggle,ctrl:nocaps,compose:rwin" + */ +static bool +make_multi_defs(struct multi_defs *mdefs, const struct xkb_rule_names *mlvo) +{ + char *p; + int i; + + memset(mdefs, 0, sizeof(*mdefs)); + + if (mlvo->model) { + mdefs->model = mlvo->model; + } + + if (mlvo->options) { + mdefs->options = strdup(mlvo->options); + if (mdefs->options == NULL) + return false; + + squeeze_spaces(mdefs->options); + } + + if (mlvo->layout) { + if (!strchr(mlvo->layout, ',')) { + mdefs->layout[0] = mlvo->layout; + } + else { + p = strdup(mlvo->layout); + if (p == NULL) + return false; + + squeeze_spaces(p); + mdefs->layout[1] = p; + + for (i = 2; i <= XkbNumKbdGroups; i++) { + if ((p = strchr(p, ','))) { + *p++ = '\0'; + mdefs->layout[i] = p; + } + else { + break; + } + } + + if (p && (p = strchr(p, ','))) + *p = '\0'; + } + } + + if (mlvo->variant) { + if (!strchr(mlvo->variant, ',')) { + mdefs->variant[0] = mlvo->variant; + } + else { + p = strdup(mlvo->variant); + if (p == NULL) + return false; + + squeeze_spaces(p); + mdefs->variant[1] = p; + + for (i = 2; i <= XkbNumKbdGroups; i++) { + if ((p = strchr(p, ','))) { + *p++ = '\0'; + mdefs->variant[i] = p; + } + else { + break; + } + } + + if (p && (p = strchr(p, ','))) + *p = '\0'; + } + } + + return true; +} + +static void +free_multi_defs(struct multi_defs *defs) +{ + free(defs->options); + /* + * See make_multi_defs comment for the hack; the same strdup'd + * string is split among the indexes, but the one in [0] is const. + */ + free(UNCONSTIFY(defs->layout[1])); + free(UNCONSTIFY(defs->variant[1])); +} + +/* See apply_rule below. */ +static void +apply(const char *src, char **dst) +{ + int ret; + char *tmp; + + if (!src) + return; + + if (*src == '+' || *src == '!') { + tmp = *dst; + ret = asprintf(dst, "%s%s", *dst, src); + if (ret < 0) + *dst = NULL; + free(tmp); + } + else if (*dst == NULL) { + *dst = strdup(src); + } +} + +/* + * Add the info from the matching rule to the resulting + * xkb_component_names. If we already had a match for something + * (e.g. keycodes), and the rule is not an appending one (e.g. + * +whatever), than we don't override but drop the new one. + */ +static void +apply_rule(struct rule *rule, struct xkb_component_names *kccgst) +{ + /* Clear the flag because it's applied. */ + rule->flags &= ~RULE_FLAG_PENDING_MATCH; + + apply(rule->keycodes, &kccgst->keycodes); + apply(rule->symbols, &kccgst->symbols); + apply(rule->types, &kccgst->types); + apply(rule->compat, &kccgst->compat); +} + +/* + * Match if name is part of the group, e.g. if the following + * group is defined: + * ! $qwertz = al cz de hr hu ro si sk + * then + * match_group_member(rules, "qwertz", "hr") + * will return true. + */ +static bool +match_group_member(struct rules *rules, const char *group_name, + const char *name) +{ + int i; + const char *word; + struct group *iter, *group = NULL; + + darray_foreach(iter, rules->groups) { + if (streq(iter->name, group_name)) { + group = iter; + break; + } + } + + if (!group) + return false; + + word = group->words; + for (i = 0; i < group->number; i++, word += strlen(word) + 1) + if (streq(word, name)) + return true; + + return false; +} + +/* Match @needle out of @sep-seperated @haystack. */ +static bool +match_one_of(const char *haystack, const char *needle, char sep) +{ + const char *s = haystack; + const size_t len = strlen(needle); + + do { + if (strncmp(s, needle, len) == 0 && (s[len] == '\0' || s[len] == sep)) + return true; + s = strchr(s, sep); + } while (s++); + + return false; +} + +static int +apply_rule_if_matches(struct rules *rules, struct rule *rule, + struct multi_defs *mdefs, + struct xkb_component_names *kccgst) +{ + bool pending = false; + + if (rule->model) { + if (mdefs->model == NULL) + return 0; + + if (streq(rule->model, "*")) { + pending = true; + } + else if (rule->model[0] == '$') { + if (!match_group_member(rules, rule->model, mdefs->model)) + return 0; + } + else if (!streq(rule->model, mdefs->model)) { + return 0; + } + } + + if (rule->option) { + if (mdefs->options == NULL) + return 0; + + if (!match_one_of(mdefs->options, rule->option, ',')) + return 0; + } + + if (rule->layout) { + if (mdefs->layout[rule->layout_num] == NULL) + return 0; + + if (streq(rule->layout, "*")) { + pending = true; + } + else if (rule->layout[0] == '$') { + if (!match_group_member(rules, rule->layout, + mdefs->layout[rule->layout_num])) + return 0; + } + else if (!streq(rule->layout, mdefs->layout[rule->layout_num])) { + return 0; + } + } + + if (rule->variant) { + if (mdefs->variant[rule->variant_num] == NULL) + return 0; + + if (streq(rule->variant, "*")) { + pending = true; + } + else if (rule->variant[0] == '$') { + if (!match_group_member(rules, rule->variant, + mdefs->variant[rule->variant_num])) + return 0; + } + else if (!streq(rule->variant, mdefs->variant[rule->variant_num])) { + return 0; + } + } + + if (pending) { + rule->flags |= RULE_FLAG_PENDING_MATCH; + } + else { + /* Exact match, apply it now. */ + apply_rule(rule, kccgst); + } + + return rule->number; +} + +static void +clear_partial_matches(struct rules *rules) +{ + struct rule *rule; + + darray_foreach(rule, rules->rules) + rule->flags &= ~RULE_FLAG_PENDING_MATCH; +} + +static void +apply_partial_matches(struct rules *rules, struct xkb_component_names *kccgst) +{ + struct rule *rule; + + darray_foreach(rule, rules->rules) + if (rule->flags & RULE_FLAG_PENDING_MATCH) + apply_rule(rule, kccgst); +} + +static void +apply_matching_rules(struct rules *rules, struct multi_defs *mdefs, + struct xkb_component_names *kccgst, unsigned int flags) +{ + int skip = -1; + struct rule *rule; + + darray_foreach(rule, rules->rules) { + if ((rule->flags & flags) != flags) + continue; + + if ((flags & RULE_FLAG_OPTION) == 0 && rule->number == skip) + continue; + + skip = apply_rule_if_matches(rules, rule, mdefs, kccgst); + } +} + +/***====================================================================***/ + +static char * +substitute_vars(char *name, struct multi_defs *mdefs) +{ + char *str, *outstr, *var; + char *orig = name; + size_t len, extra_len; + char pfx, sfx; + int ndx; + + if (!name) + return NULL; + + str = strchr(name, '%'); + if (str == NULL) + return name; + + len = strlen(name); + + while (str != NULL) { + pfx = str[1]; + extra_len = 0; + + if (pfx == '+' || pfx == '|' || pfx == '_' || pfx == '-') { + extra_len = 1; + str++; + } + else if (pfx == '(') { + extra_len = 2; + str++; + } + + var = str + 1; + str = get_index(var + 1, &ndx); + if (ndx == -1) { + str = strchr(str, '%'); + continue; + } + + if (*var == 'l' && mdefs->layout[ndx] && *mdefs->layout[ndx]) + len += strlen(mdefs->layout[ndx]) + extra_len; + else if (*var == 'm' && mdefs->model) + len += strlen(mdefs->model) + extra_len; + else if (*var == 'v' && mdefs->variant[ndx] && *mdefs->variant[ndx]) + len += strlen(mdefs->variant[ndx]) + extra_len; + + if (pfx == '(' && *str == ')') + str++; + + str = strchr(&str[0], '%'); + } + + name = malloc(len + 1); + str = orig; + outstr = name; + + while (*str != '\0') { + if (str[0] == '%') { + str++; + pfx = str[0]; + sfx = '\0'; + + if (pfx == '+' || pfx == '|' || pfx == '_' || pfx == '-') { + str++; + } + else if (pfx == '(') { + sfx = ')'; + str++; + } + else { + pfx = '\0'; + } + + var = str; + str = get_index(var + 1, &ndx); + if (ndx == -1) + continue; + + if (*var == 'l' && mdefs->layout[ndx] && *mdefs->layout[ndx]) { + if (pfx) + *outstr++ = pfx; + + strcpy(outstr, mdefs->layout[ndx]); + outstr += strlen(mdefs->layout[ndx]); + + if (sfx) + *outstr++ = sfx; + } + else if (*var == 'm' && mdefs->model) { + if (pfx) + *outstr++ = pfx; + + strcpy(outstr, mdefs->model); + outstr += strlen(mdefs->model); + + if (sfx) + *outstr++ = sfx; + } + else if (*var == 'v' && mdefs->variant[ndx] && + *mdefs->variant[ndx]) { + if (pfx) + *outstr++ = pfx; + + strcpy(outstr, mdefs->variant[ndx]); + outstr += strlen(mdefs->variant[ndx]); + + if (sfx) + *outstr++ = sfx; + } + + if (pfx == '(' && *str == ')') + str++; + } + else { + *outstr++ = *str++; + } + } + + *outstr++ = '\0'; + + if (orig != name) + free(orig); + + return name; +} + +/***====================================================================***/ + +static bool +get_components(struct rules *rules, const struct xkb_rule_names *mlvo, + struct xkb_component_names *kccgst) +{ + struct multi_defs mdefs; + + make_multi_defs(&mdefs, mlvo); + + clear_partial_matches(rules); + + apply_matching_rules(rules, &mdefs, kccgst, RULE_FLAG_NORMAL); + apply_partial_matches(rules, kccgst); + + apply_matching_rules(rules, &mdefs, kccgst, RULE_FLAG_APPEND); + apply_partial_matches(rules, kccgst); + + apply_matching_rules(rules, &mdefs, kccgst, RULE_FLAG_OPTION); + apply_partial_matches(rules, kccgst); + + kccgst->keycodes = substitute_vars(kccgst->keycodes, &mdefs); + kccgst->symbols = substitute_vars(kccgst->symbols, &mdefs); + kccgst->types = substitute_vars(kccgst->types, &mdefs); + kccgst->compat = substitute_vars(kccgst->compat, &mdefs); + + free_multi_defs(&mdefs); + + return kccgst->keycodes && kccgst->symbols && kccgst->types && + kccgst->compat; +} + +static struct rules * +load_rules(struct xkb_context *ctx, FILE *file) +{ + darray_char line; + struct mapping mapping; + struct rule trule; + struct group tgroup; + struct rules *rules; + struct stat stat_buf; + const char *buf, *end; + char *orig; + int fd = fileno(file); + + if (fstat(fd, &stat_buf) != 0) { + log_err(ctx, "couldn't stat rules file\n"); + return NULL; + } + + orig = mmap(NULL, stat_buf.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (!orig) { + log_err(ctx, "couldn't mmap rules file (%zu bytes)\n", + (size_t) stat_buf.st_size); + return NULL; + } + + rules = calloc(1, sizeof(*rules)); + if (!rules) + return NULL; + darray_init(rules->rules); + darray_growalloc(rules->rules, 16); + + memset(&mapping, 0, sizeof(mapping)); + memset(&tgroup, 0, sizeof(tgroup)); + darray_init(line); + darray_growalloc(line, 128); + + buf = orig; + end = orig + stat_buf.st_size; + while ((buf = input_line_get(ctx, buf, end, &line))) { + if (match_line(ctx, &line, &mapping, &trule, &tgroup)) { + if (tgroup.number) { + darray_append(rules->groups, tgroup); + memset(&tgroup, 0, sizeof(tgroup)); + } + else { + darray_append(rules->rules, trule); + memset(&trule, 0, sizeof(trule)); + } + } + + darray_resize(line, 0); + } + + munmap(orig, stat_buf.st_size); + + darray_free(line); + return rules; +} + +static void +free_rules(struct rules *rules) +{ + struct rule *rule; + struct group *group; + + if (!rules) + return; + + darray_foreach(rule, rules->rules) { + free(rule->model); + free(rule->layout); + free(rule->variant); + free(rule->option); + free(rule->keycodes); + free(rule->symbols); + free(rule->types); + free(rule->compat); + } + darray_free(rules->rules); + + darray_foreach(group, rules->groups) { + free(group->name); + free(group->words); + } + darray_free(rules->groups); + + free(rules); +} + +struct xkb_component_names * +xkb_components_from_rules(struct xkb_context *ctx, + const struct xkb_rule_names *rmlvo) +{ + struct rules *rules; + struct xkb_component_names *kccgst = NULL; + FILE *file; + char *path; + char **include; + + file = XkbFindFileInPath(ctx, rmlvo->rules, FILE_TYPE_RULES, &path); + if (!file) { + log_err(ctx, "could not find \"%s\" rules in XKB path\n", + rmlvo->rules); + log_err(ctx, "%zu include paths searched:\n", + darray_size(ctx->includes)); + darray_foreach(include, ctx->includes) + log_err(ctx, "\t%s\n", *include); + log_err(ctx, "%zu include paths could not be added:\n", + darray_size(ctx->failed_includes)); + darray_foreach(include, ctx->failed_includes) + log_err(ctx, "\t%s\n", *include); + return NULL; + } + + rules = load_rules(ctx, file); + if (!rules) { + log_err(ctx, "failed to load XKB rules \"%s\"\n", path); + goto err; + } + + kccgst = calloc(1, sizeof(*kccgst)); + if (!kccgst) { + log_err(ctx, "failed to allocate XKB components\n"); + goto err; + } + + if (!get_components(rules, rmlvo, kccgst)) { + free(kccgst->keycodes); + free(kccgst->types); + free(kccgst->compat); + free(kccgst->symbols); + free(kccgst); + kccgst = NULL; + log_err(ctx, "no components returned from XKB rules \"%s\"\n", path); + goto err; + } + +err: + free_rules(rules); + if (file) + fclose(file); + free(path); + return kccgst; +} diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/rules.h libxkbcommon-0.1.0~2/src/xkbcomp/rules.h --- libxkbcommon-0.1.0~1/src/xkbcomp/rules.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/rules.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,36 @@ +/* + * 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 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. + */ + +#ifndef RULES_H +#define RULES_H + +#include "xkbcomp-priv.h" + +struct xkb_component_names * +xkb_components_from_rules(struct xkb_context *ctx, + const struct xkb_rule_names *rmlvo); + +#endif /* RULES_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/scanner.l libxkbcommon-0.1.0~2/src/xkbcomp/scanner.l --- libxkbcommon-0.1.0~1/src/xkbcomp/scanner.l 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/scanner.l 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,301 @@ +/************************************************************ + 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 + +#include "xkbcomp-priv.h" +#include "parseutils.h" + +#pragma GCC diagnostic ignored "-Wredundant-decls" +#pragma GCC diagnostic ignored "-Wmissing-noreturn" + +extern int yyparse(struct parser_param *param); + +static void +scanner_error_extra(struct YYLTYPE *loc, struct scanner_extra *extra, + const char *msg); + +#define YY_USER_ACTION { \ + yylloc->first_line = yylineno; \ + yylloc->last_line = yylineno; \ +} + +#define APPEND_S(ch) do { \ + if (yyextra->s - yyextra->scanBuf >= sizeof(yyextra->scanBuf) - 1) \ + return ERROR_TOK; \ + *yyextra->s++ = ch; \ +} while (0) +%} + +%option reentrant +%option extra-type="struct scanner_extra *" +%option bison-bridge bison-locations +%option yylineno +%option nounistd noyywrap noinput nounput +%option never-interactive +%option case-insensitive + +%x S_STR S_KEY + +%% + +"//"[^\n]* +"#"[^\n]* + +\" yyextra->s = yyextra->scanBuf; BEGIN(S_STR); +\< yyextra->s = yyextra->scanBuf; BEGIN(S_KEY); + +\" { + BEGIN(INITIAL); + *yyextra->s = '\0'; + yylval->str = strdup(yyextra->scanBuf); + return STRING; + } +\> { + BEGIN(INITIAL); + + *yyextra->s = '\0'; + if (yyextra->s - yyextra->scanBuf > XkbKeyNameLength) { + scanner_error_extra(yylloc, yyextra, + "Key name too long"); + return ERROR_TOK; + } + + strncpy(yylval->keyName, yyextra->scanBuf, XkbKeyNameLength); + return KEYNAME; + } + +\\[0-7]{1,3} { + /* octal escape sequence */ + unsigned int result; + + (void) sscanf( yytext + 1, "%o", &result ); + + if (result > 0xff) { + scanner_error_extra(yylloc, yyextra, + "Illegal octal escape"); + return ERROR_TOK; + } + + APPEND_S(result); + } + +\\[0-9]+ { + scanner_error_extra(yylloc, yyextra, + "Illegal octal escape"); + return ERROR_TOK; + } + +\\n APPEND_S('\n'); +\\t APPEND_S('\t'); +\\r APPEND_S('\r'); +\\b APPEND_S('\b'); +\\f APPEND_S('\f'); +\\v APPEND_S('\v'); +\\e APPEND_S('\033'); + +. APPEND_S(yytext[0]); + +xkb_keymap return XKB_KEYMAP; +xkb_keycodes return XKB_KEYCODES; +xkb_types return XKB_TYPES; +xkb_symbols return XKB_SYMBOLS; +xkb_compat return XKB_COMPATMAP; +xkb_compat_map return XKB_COMPATMAP; +xkb_compatibility return XKB_COMPATMAP; +xkb_compatibility_map return XKB_COMPATMAP; +xkb_geometry return XKB_GEOMETRY; +xkb_semantics return XKB_SEMANTICS; +xkb_layout return XKB_LAYOUT; +include return INCLUDE; +override return OVERRIDE; +augment return AUGMENT; +replace return REPLACE; +alternate return ALTERNATE; +partial return PARTIAL; +default return DEFAULT; +hidden return HIDDEN; +virtual_modifiers return VIRTUAL_MODS; +type return TYPE; +interpret return INTERPRET; +action return ACTION_TOK; +key return KEY; +alias return ALIAS; +group return GROUP; +modmap return MODIFIER_MAP; +mod_map return MODIFIER_MAP; +modifier_map return MODIFIER_MAP; +indicator return INDICATOR; +shape return SHAPE; +row return ROW; +keys return KEYS; +section return SECTION; +overlay return OVERLAY; +text return TEXT; +outline return OUTLINE; +solid return SOLID; +logo return LOGO; +virtual return VIRTUAL; +alphanumeric_keys return ALPHANUMERIC_KEYS; +modifier_keys return MODIFIER_KEYS; +keypad_keys return KEYPAD_KEYS; +function_keys return FUNCTION_KEYS; +alternate_group return ALTERNATE_GROUP; + +[a-zA-Z_][a-zA-Z_0-9]* yylval->str = strdup(yytext); return IDENT; + +0x[a-fA-F0-9]+ | +[0-9]+ { + char *end; + yylval->num = strtoul(yytext, &end, 0); + + return INTEGER; + } +[0-9]+\.[0-9]+ { + char *end; + yylval->num = strtod(yytext, &end) * XkbGeomPtsPerMM; + + return FLOAT; + } + +"=" return EQUALS; +"+" return PLUS; +"-" return MINUS; +"/" return DIVIDE; +"*" return TIMES; +"{" return OBRACE; +"}" return CBRACE; +"(" return OPAREN; +")" return CPAREN; +"[" return OBRACKET; +"]" return CBRACKET; +"." return DOT; +"," return COMMA; +";" return SEMI; +"!" return EXCLAM; +"~" return INVERT; + +[ \t\r\n\v]+ + +<> return END_OF_FILE; + +. return ERROR_TOK; + +%% + +static void +scanner_error_extra(struct YYLTYPE *loc, struct scanner_extra *extra, + const char *msg) +{ + log_err(extra->ctx, "%s: line %d of %s\n", msg, + loc->first_line, + extra->scanFile ? extra->scanFile : "(unknown)"); + + log_err(extra->ctx, "last scanned symbol was: %s\n", + extra->scanBuf); +} + +void +scanner_error(struct YYLTYPE *loc, void *scanner, const char *msg) +{ + struct scanner_extra *extra = yyget_extra(scanner); + scanner_error_extra(loc, extra, msg); +} + +bool +XKBParseString(struct xkb_context *ctx, const char *string, + const char *file_name, XkbFile **out) +{ + int ret; + struct parser_param param; + struct scanner_extra extra; + YY_BUFFER_STATE state; + + if (string == NULL) + return false; + + param.ctx = ctx; + + memset(&extra, 0, sizeof(extra)); + ret = yylex_init_extra(&extra, ¶m.scanner); + if (ret != 0) + return false; + + extra.ctx = ctx; + + extra.scanFile = strdup(file_name); + if (!extra.scanFile) + return false; + + state = yy_scan_string(string, param.scanner); + ret = yyparse(¶m); + yy_delete_buffer(state, param.scanner); + yylex_destroy(param.scanner); + free(extra.scanFile); + if (ret != 0) + return false; + + CheckDefaultMap(param.ctx, param.rtrn, file_name); + *out = param.rtrn; + return true; +} + +bool +XKBParseFile(struct xkb_context *ctx, FILE *file, + const char *file_name, XkbFile **out) +{ + int ret; + struct parser_param param; + struct scanner_extra extra; + + if (!file) + return false; + + param.ctx = ctx; + + memset(&extra, 0, sizeof(extra)); + ret = yylex_init_extra(&extra, ¶m.scanner); + if (ret != 0) + return false; + + extra.ctx = ctx; + + extra.scanFile = strdup(file_name); + if (!extra.scanFile) + return false; + + yyset_in(file, param.scanner); + ret = yyparse(¶m); + yylex_destroy(param.scanner); + free(extra.scanFile); + if (ret != 0) + return false; + + CheckDefaultMap(param.ctx, param.rtrn, file_name); + *out = param.rtrn; + return true; +} diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/symbols.c libxkbcommon-0.1.0~2/src/xkbcomp/symbols.c --- libxkbcommon-0.1.0~1/src/xkbcomp/symbols.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/symbols.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,151 +1,135 @@ /************************************************************ - 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 (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 "xkbcomp.h" -#include "xkballoc.h" -#include "xkbmisc.h" -#include "tokens.h" -#include "expr.h" +#include "xkbcomp-priv.h" #include "parseutils.h" - -#include -#include - -#include "expr.h" -#include "vmod.h" #include "action.h" -#include "keycodes.h" -#include "misc.h" -#include "alias.h" - -extern uint32_t tok_ONE_LEVEL; -extern uint32_t tok_TWO_LEVEL; -extern uint32_t tok_KEYPAD; +#include "vmod.h" /***====================================================================***/ -#define RepeatYes 1 -#define RepeatNo 0 -#define RepeatUndefined ~((unsigned)0) - -#define _Key_Syms (1<<0) -#define _Key_Acts (1<<1) -#define _Key_Repeat (1<<2) -#define _Key_Behavior (1<<3) -#define _Key_Type_Dflt (1<<4) -#define _Key_Types (1<<5) -#define _Key_GroupInfo (1<<6) -#define _Key_VModMap (1<<7) +/* Needed to work with the typechecker. */ +typedef darray(xkb_keysym_t) darray_xkb_keysym_t; +typedef darray(union xkb_action) darray_xkb_action; + +enum key_repeat { + KEY_REPEAT_YES = 1, + KEY_REPEAT_NO = 0, + KEY_REPEAT_UNDEFINED = -1 +}; + +enum key_field { + KEY_FIELD_SYMS = (1 << 0), + KEY_FIELD_ACTS = (1 << 1), + KEY_FIELD_REPEAT = (1 << 2), + KEY_FIELD_TYPE_DFLT = (1 << 3), + KEY_FIELD_TYPES = (1 << 4), + KEY_FIELD_GROUPINFO = (1 << 5), + KEY_FIELD_VMODMAP = (1 << 6), +}; + +typedef struct _KeyInfo { + enum key_field defined; + unsigned file_id; + enum merge_mode merge; -typedef struct _KeyInfo -{ - CommonInfo defs; unsigned long name; /* the 4 chars of the key name, as long */ - unsigned char groupInfo; unsigned char typesDefined; unsigned char symsDefined; unsigned char actsDefined; - short numLevels[XkbNumKbdGroups]; - uint32_t *syms[XkbNumKbdGroups]; - union xkb_action *acts[XkbNumKbdGroups]; - uint32_t types[XkbNumKbdGroups]; - unsigned repeat; - struct xkb_behavior behavior; - unsigned short vmodmap; - unsigned long nameForOverlayKey; - unsigned long allowNone; - uint32_t dfltType; + xkb_level_index_t numLevels[XkbNumKbdGroups]; + + /* syms[group] -> Single array for all the keysyms in the group. */ + darray_xkb_keysym_t syms[XkbNumKbdGroups]; + /* + * symsMapIndex[group][level] -> The index from which the syms for + * the level begin in the syms[group] array. Remember each keycode + * can have multiple keysyms in each level (that is, each key press + * can result in multiple keysyms). + */ + darray(int) symsMapIndex[XkbNumKbdGroups]; + /* + * symsMapNumEntries[group][level] -> How many syms are in + * syms[group][symsMapIndex[group][level]]. + */ + darray(size_t) symsMapNumEntries[XkbNumKbdGroups]; + + darray_xkb_action acts[XkbNumKbdGroups]; + + xkb_atom_t types[XkbNumKbdGroups]; + enum key_repeat repeat; + xkb_mod_mask_t vmodmap; + xkb_atom_t dfltType; + + uint8_t out_of_range_group_action; + xkb_group_index_t out_of_range_group_number; } KeyInfo; /** * Init the given key info to sane values. */ static void -InitKeyInfo(KeyInfo * info) +InitKeyInfo(KeyInfo *keyi, unsigned file_id) { - register int i; - static char dflt[4] = "*"; + xkb_group_index_t i; + static const char dflt[4] = "*"; - info->defs.defined = 0; - info->defs.fileID = 0; - info->defs.merge = MergeOverride; - info->defs.next = NULL; - info->name = KeyNameToLong(dflt); - info->groupInfo = 0; - info->typesDefined = info->symsDefined = info->actsDefined = 0; - for (i = 0; i < XkbNumKbdGroups; i++) - { - info->numLevels[i] = 0; - info->types[i] = None; - info->syms[i] = NULL; - info->acts[i] = NULL; - } - info->dfltType = None; - info->behavior.type = XkbKB_Default; - info->behavior.data = 0; - info->vmodmap = 0; - info->nameForOverlayKey = 0; - info->repeat = RepeatUndefined; - info->allowNone = 0; - return; + keyi->defined = 0; + keyi->file_id = file_id; + keyi->merge = MERGE_OVERRIDE; + keyi->name = KeyNameToLong(dflt); + keyi->typesDefined = keyi->symsDefined = keyi->actsDefined = 0; + + for (i = 0; i < XkbNumKbdGroups; i++) { + keyi->numLevels[i] = 0; + keyi->types[i] = XKB_ATOM_NONE; + darray_init(keyi->syms[i]); + darray_init(keyi->symsMapIndex[i]); + darray_init(keyi->symsMapNumEntries[i]); + darray_init(keyi->acts[i]); + } + + keyi->dfltType = XKB_ATOM_NONE; + keyi->vmodmap = 0; + keyi->repeat = KEY_REPEAT_UNDEFINED; + keyi->out_of_range_group_action = 0; + keyi->out_of_range_group_number = 0; } -/** - * Free memory associated with this key info and reset to sane values. - */ static void -FreeKeyInfo(KeyInfo * info) +FreeKeyInfo(KeyInfo *keyi) { - register int i; + xkb_group_index_t i; - info->defs.defined = 0; - info->defs.fileID = 0; - info->defs.merge = MergeOverride; - info->defs.next = NULL; - info->groupInfo = 0; - info->typesDefined = info->symsDefined = info->actsDefined = 0; - for (i = 0; i < XkbNumKbdGroups; i++) - { - info->numLevels[i] = 0; - info->types[i] = None; - if (info->syms[i] != NULL) - free(info->syms[i]); - info->syms[i] = NULL; - if (info->acts[i] != NULL) - free(info->acts[i]); - info->acts[i] = NULL; - } - info->dfltType = None; - info->behavior.type = XkbKB_Default; - info->behavior.data = 0; - info->vmodmap = 0; - info->nameForOverlayKey = 0; - info->repeat = RepeatUndefined; - info->allowNone = 0; - return; + for (i = 0; i < XkbNumKbdGroups; i++) { + darray_free(keyi->syms[i]); + darray_free(keyi->symsMapIndex[i]); + darray_free(keyi->symsMapNumEntries[i]); + darray_free(keyi->acts[i]); + } } /** @@ -153,1502 +137,1239 @@ * If old is reset, new simply re-uses old's memory. Otherwise, the memory is * newly allocated and new points to the new memory areas. */ -static Bool -CopyKeyInfo(KeyInfo * old, KeyInfo * new, Bool clearOld) +static bool +CopyKeyInfo(KeyInfo * old, KeyInfo * new, bool clearOld) { - register int i; + xkb_group_index_t i; *new = *old; - new->defs.next = NULL; - if (clearOld) - { - for (i = 0; i < XkbNumKbdGroups; i++) - { + + if (clearOld) { + for (i = 0; i < XkbNumKbdGroups; i++) { old->numLevels[i] = 0; - old->syms[i] = NULL; - old->acts[i] = NULL; + darray_init(old->symsMapIndex[i]); + darray_init(old->symsMapNumEntries[i]); + darray_init(old->syms[i]); + darray_init(old->acts[i]); } } - else - { - int width; - for (i = 0; i < XkbNumKbdGroups; i++) - { - width = new->numLevels[i]; - if (old->syms[i] != NULL) - { - new->syms[i] = uTypedCalloc(width, uint32_t); - if (!new->syms[i]) - { - new->syms[i] = NULL; - new->numLevels[i] = 0; - return False; - } - memcpy((char *) new->syms[i], (char *) old->syms[i], - width * sizeof(uint32_t)); - } - if (old->acts[i] != NULL) - { - new->acts[i] = uTypedCalloc(width, union xkb_action); - if (!new->acts[i]) - { - new->acts[i] = NULL; - return False; - } - memcpy((char *) new->acts[i], (char *) old->acts[i], - width * sizeof(union xkb_action)); - } + else { + for (i = 0; i < XkbNumKbdGroups; i++) { + darray_copy(new->syms[i], old->syms[i]); + darray_copy(new->symsMapIndex[i], old->symsMapIndex[i]); + darray_copy(new->symsMapNumEntries[i], old->symsMapNumEntries[i]); + darray_copy(new->acts[i], old->acts[i]); } } - return True; + + return true; } /***====================================================================***/ -typedef struct _ModMapEntry -{ - CommonInfo defs; - Bool haveSymbol; +typedef struct _ModMapEntry { + struct list entry; + enum merge_mode merge; + bool haveSymbol; int modifier; - union - { + union { unsigned long keyName; - uint32_t keySym; + xkb_keysym_t keySym; } u; } ModMapEntry; -#define SYMBOLS_INIT_SIZE 110 -#define SYMBOLS_CHUNK 20 -typedef struct _SymbolsInfo -{ +typedef struct _SymbolsInfo { char *name; /* e.g. pc+us+inet(evdev) */ int errorCount; - unsigned fileID; - unsigned merge; - unsigned explicit_group; - unsigned groupInfo; - unsigned szKeys; - unsigned nKeys; - KeyInfo *keys; + unsigned file_id; + enum merge_mode merge; + xkb_group_index_t explicit_group; + darray(KeyInfo) keys; KeyInfo dflt; VModInfo vmods; ActionInfo *action; - uint32_t groupNames[XkbNumKbdGroups]; + xkb_atom_t groupNames[XkbNumKbdGroups]; + + struct list modMaps; - ModMapEntry *modMap; - AliasInfo *aliases; + struct xkb_keymap *keymap; } SymbolsInfo; static void -InitSymbolsInfo(SymbolsInfo * info, struct xkb_desc * xkb) +InitSymbolsInfo(SymbolsInfo * info, struct xkb_keymap *keymap, + unsigned file_id) { - register int i; + xkb_group_index_t i; - tok_ONE_LEVEL = xkb_intern_atom("ONE_LEVEL"); - tok_TWO_LEVEL = xkb_intern_atom("TWO_LEVEL"); - tok_KEYPAD = xkb_intern_atom("KEYPAD"); info->name = NULL; info->explicit_group = 0; info->errorCount = 0; - info->fileID = 0; - info->merge = MergeOverride; - info->groupInfo = 0; - info->szKeys = SYMBOLS_INIT_SIZE; - info->nKeys = 0; - info->keys = uTypedCalloc(SYMBOLS_INIT_SIZE, KeyInfo); - info->modMap = NULL; + info->file_id = file_id; + info->merge = MERGE_OVERRIDE; + darray_init(info->keys); + darray_growalloc(info->keys, 110); + list_init(&info->modMaps); for (i = 0; i < XkbNumKbdGroups; i++) - info->groupNames[i] = None; - InitKeyInfo(&info->dflt); - InitVModInfo(&info->vmods, xkb); + info->groupNames[i] = XKB_ATOM_NONE; + InitKeyInfo(&info->dflt, file_id); + InitVModInfo(&info->vmods, keymap); info->action = NULL; - info->aliases = NULL; - return; + info->keymap = keymap; } static void FreeSymbolsInfo(SymbolsInfo * info) { - register int i; + KeyInfo *keyi; + ModMapEntry *mm, *next; - if (info->name) - free(info->name); - info->name = NULL; - if (info->keys) - { - for (i = 0; i < info->nKeys; i++) - { - FreeKeyInfo(&info->keys[i]); - } - free(info->keys); - info->keys = NULL; - } - if (info->modMap) - { - ClearCommonInfo(&info->modMap->defs); - info->modMap = NULL; - } - if (info->aliases) - { - ClearAliases(&info->aliases); - info->aliases = NULL; - } - bzero((char *) info, sizeof(SymbolsInfo)); - return; -} - -static Bool -ResizeKeyGroup(KeyInfo * key, - unsigned group, unsigned atLeastSize, Bool forceActions) -{ - Bool tooSmall; - unsigned newWidth; - - tooSmall = (key->numLevels[group] < atLeastSize); - if (tooSmall) - newWidth = atLeastSize; - else - newWidth = key->numLevels[group]; + free(info->name); + darray_foreach(keyi, info->keys) { + FreeKeyInfo(keyi); + } + darray_free(info->keys); + list_foreach_safe(mm, next, &info->modMaps, entry) + free(mm); + memset(info, 0, sizeof(SymbolsInfo)); +} + +static bool +ResizeKeyGroup(KeyInfo *keyi, xkb_group_index_t group, + xkb_level_index_t numLevels, unsigned sizeSyms, + bool forceActions) +{ + xkb_level_index_t i; + + if (darray_size(keyi->syms[group]) < sizeSyms) + darray_resize0(keyi->syms[group], sizeSyms); - if ((key->syms[group] == NULL) || tooSmall) - { - key->syms[group] = uTypedRecalloc(key->syms[group], - key->numLevels[group], newWidth, - uint32_t); - if (!key->syms[group]) - return False; - } - if (((forceActions) && (tooSmall || (key->acts[group] == NULL))) || - (tooSmall && (key->acts[group] != NULL))) - { - key->acts[group] = uTypedRecalloc(key->acts[group], - key->numLevels[group], newWidth, - union xkb_action); - if (!key->acts[group]) - return False; + if (darray_empty(keyi->symsMapIndex[group]) || + keyi->numLevels[group] < numLevels) { + darray_resize(keyi->symsMapIndex[group], numLevels); + for (i = keyi->numLevels[group]; i < numLevels; i++) + darray_item(keyi->symsMapIndex[group], i) = -1; } - key->numLevels[group] = newWidth; - return True; + + if (darray_empty(keyi->symsMapNumEntries[group]) || + keyi->numLevels[group] < numLevels) + darray_resize0(keyi->symsMapNumEntries[group], numLevels); + + if ((forceActions && (keyi->numLevels[group] < numLevels || + darray_empty(keyi->acts[group]))) || + (keyi->numLevels[group] < numLevels && !darray_empty(keyi->acts[group]))) + darray_resize0(keyi->acts[group], numLevels); + + if (keyi->numLevels[group] < numLevels) + keyi->numLevels[group] = numLevels; + + return true; } -static Bool +enum key_group_selector { + NONE = 0, + FROM = (1 << 0), + TO = (1 << 1), +}; + +static bool MergeKeyGroups(SymbolsInfo * info, - KeyInfo * into, KeyInfo * from, unsigned group) + KeyInfo * into, KeyInfo * from, xkb_group_index_t group) { - uint32_t *resultSyms; - union xkb_action *resultActs; - int resultWidth; - register int i; - Bool report, clobber; - - clobber = (from->defs.merge != MergeAugment); - report = (warningLevel > 9) || - ((into->defs.fileID == from->defs.fileID) && (warningLevel > 0)); - if (into->numLevels[group] >= from->numLevels[group]) - { - resultSyms = into->syms[group]; + darray_xkb_keysym_t resultSyms; + enum key_group_selector using = NONE; + darray_xkb_action resultActs; + xkb_level_index_t resultWidth; + unsigned int resultSize = 0; + int cur_idx = 0; + xkb_level_index_t i; + bool report, clobber; + int verbosity = xkb_get_log_verbosity(info->keymap->ctx); + + clobber = (from->merge != MERGE_AUGMENT); + + report = (verbosity > 9) || + (into->file_id == from->file_id && verbosity > 0); + + darray_init(resultSyms); + + if (into->numLevels[group] >= from->numLevels[group]) { resultActs = into->acts[group]; resultWidth = into->numLevels[group]; } - else - { - resultSyms = from->syms[group]; + else { resultActs = from->acts[group]; resultWidth = from->numLevels[group]; - } - if (resultSyms == NULL) - { - resultSyms = uTypedCalloc(resultWidth, uint32_t); - if (!resultSyms) - { - WSGO("Could not allocate symbols for group merge\n"); - ACTION("Group %d of key %s not merged\n", group, - longText(into->name)); - return False; - } - } - if ((resultActs == NULL) && (into->acts[group] || from->acts[group])) - { - resultActs = uTypedCalloc(resultWidth, union xkb_action); - if (!resultActs) - { - WSGO("Could not allocate actions for group merge\n"); - ACTION("Group %d of key %s not merged\n", group, - longText(into->name)); - return False; - } - } - for (i = 0; i < resultWidth; i++) - { - uint32_t fromSym, toSym; - if (from->syms[group] && (i < from->numLevels[group])) - fromSym = from->syms[group][i]; - else - fromSym = NoSymbol; - if (into->syms[group] && (i < into->numLevels[group])) - toSym = into->syms[group][i]; - else - toSym = NoSymbol; - if ((fromSym == NoSymbol) || (fromSym == toSym)) - resultSyms[i] = toSym; - else if (toSym == NoSymbol) - resultSyms[i] = fromSym; - else - { - uint32_t use, ignore; - if (clobber) - { - use = fromSym; - ignore = toSym; - } - else - { - use = toSym; - ignore = fromSym; - } - if (report) - { - WARN - ("Multiple symbols for level %d/group %d on key %s\n", - i + 1, group + 1, longText(into->name)); - ACTION("Using %s, ignoring %s\n", - XkbcKeysymText(use), XkbcKeysymText(ignore)); - } - resultSyms[i] = use; - } - if (resultActs != NULL) - { - union xkb_action *fromAct, *toAct; - fromAct = (from->acts[group] ? &from->acts[group][i] : NULL); - toAct = (into->acts[group] ? &into->acts[group][i] : NULL); + darray_resize(into->symsMapIndex[group], + from->numLevels[group]); + darray_resize0(into->symsMapNumEntries[group], + from->numLevels[group]); + + for (i = into->numLevels[group]; i < from->numLevels[group]; i++) + darray_item(into->symsMapIndex[group], i) = -1; + } + + if (darray_empty(resultActs) && (!darray_empty(into->acts[group]) || + !darray_empty(from->acts[group]))) { + darray_resize0(resultActs, resultWidth); + for (i = 0; i < resultWidth; i++) { + union xkb_action *fromAct = NULL, *toAct = NULL; + + if (!darray_empty(from->acts[group])) + fromAct = &darray_item(from->acts[group], i); + + if (!darray_empty(into->acts[group])) + toAct = &darray_item(into->acts[group], i); + if (((fromAct == NULL) || (fromAct->type == XkbSA_NoAction)) - && (toAct != NULL)) - { - resultActs[i] = *toAct; + && (toAct != NULL)) { + darray_item(resultActs, i) = *toAct; } else if (((toAct == NULL) || (toAct->type == XkbSA_NoAction)) - && (fromAct != NULL)) - { - resultActs[i] = *fromAct; + && (fromAct != NULL)) { + darray_item(resultActs, i) = *fromAct; } - else - { + else { union xkb_action *use, *ignore; - if (clobber) - { + if (clobber) { use = fromAct; ignore = toAct; } - else - { + else { use = toAct; ignore = fromAct; } if (report) - { - WARN - ("Multiple actions for level %d/group %d on key %s\n", - i + 1, group + 1, longText(into->name)); - ACTION("Using %s, ignoring %s\n", - XkbcActionTypeText(use->type), - XkbcActionTypeText(ignore->type)); - } - resultActs[i] = *use; + log_warn(info->keymap->ctx, + "Multiple actions for level %d/group %u on key %s; " + "Using %s, ignoring %s\n", + i + 1, group + 1, LongKeyNameText(into->name), + ActionTypeText(use->type), + ActionTypeText(ignore->type)); + if (use) + darray_item(resultActs, i) = *use; } } } - if ((into->syms[group] != NULL) && (resultSyms != into->syms[group])) - free(into->syms[group]); - if ((from->syms[group] != NULL) && (resultSyms != from->syms[group])) - free(from->syms[group]); - if ((into->acts[group] != NULL) && (resultActs != into->acts[group])) - free(into->acts[group]); - if ((from->acts[group] != NULL) && (resultActs != from->acts[group])) - free(from->acts[group]); + + for (i = 0; i < resultWidth; i++) { + unsigned int fromSize = 0; + unsigned toSize = 0; + + if (!darray_empty(from->symsMapNumEntries[group]) && + i < from->numLevels[group]) + fromSize = darray_item(from->symsMapNumEntries[group], i); + + if (!darray_empty(into->symsMapNumEntries[group]) && + i < into->numLevels[group]) + toSize = darray_item(into->symsMapNumEntries[group], i); + + if (fromSize == 0) { + resultSize += toSize; + using |= TO; + } + else if (toSize == 0 || clobber) { + resultSize += fromSize; + using |= FROM; + } + else { + resultSize += toSize; + using |= TO; + } + } + + if (resultSize == 0) + goto out; + + if (using == FROM) { + resultSyms = from->syms[group]; + darray_free(into->symsMapNumEntries[group]); + darray_free(into->symsMapIndex[group]); + into->symsMapNumEntries[group] = from->symsMapNumEntries[group]; + into->symsMapIndex[group] = from->symsMapIndex[group]; + darray_init(from->symsMapNumEntries[group]); + darray_init(from->symsMapIndex[group]); + goto out; + } + else if (using == TO) { + resultSyms = into->syms[group]; + goto out; + } + + darray_resize0(resultSyms, resultSize); + + for (i = 0; i < resultWidth; i++) { + enum key_group_selector use = NONE; + unsigned int fromSize = 0; + unsigned int toSize = 0; + + if (i < from->numLevels[group]) + fromSize = darray_item(from->symsMapNumEntries[group], i); + + if (i < into->numLevels[group]) + toSize = darray_item(into->symsMapNumEntries[group], i); + + if (fromSize == 0 && toSize == 0) { + darray_item(into->symsMapIndex[group], i) = -1; + darray_item(into->symsMapNumEntries[group], i) = 0; + continue; + } + + if (fromSize == 0) + use = TO; + else if (toSize == 0 || clobber) + use = FROM; + else + use = TO; + + if (toSize && fromSize && report) { + log_info(info->keymap->ctx, + "Multiple symbols for group %u, level %d on key %s; " + "Using %s, ignoring %s\n", + group + 1, i + 1, LongKeyNameText(into->name), + (use == FROM ? "from" : "to"), + (use == FROM ? "to" : "from")); + } + + if (use == FROM) { + memcpy(darray_mem(resultSyms, cur_idx), + darray_mem(from->syms[group], + darray_item(from->symsMapIndex[group], i)), + darray_item(from->symsMapNumEntries[group], + i) * sizeof(xkb_keysym_t)); + darray_item(into->symsMapIndex[group], i) = cur_idx; + darray_item(into->symsMapNumEntries[group], i) = + darray_item(from->symsMapNumEntries[group], i); + } + else { + memcpy(darray_mem(resultSyms, cur_idx), + darray_mem(into->syms[group], + darray_item(into->symsMapIndex[group], i)), + darray_item(into->symsMapNumEntries[group], + i) * sizeof(xkb_keysym_t)); + darray_item(into->symsMapIndex[group], i) = cur_idx; + } + cur_idx += darray_item(into->symsMapNumEntries[group], i); + } + +out: + if (!darray_same(resultActs, into->acts[group])) + darray_free(into->acts[group]); + if (!darray_same(resultActs, from->acts[group])) + darray_free(from->acts[group]); into->numLevels[group] = resultWidth; + if (!darray_same(resultSyms, into->syms[group])) + darray_free(into->syms[group]); into->syms[group] = resultSyms; - from->syms[group] = NULL; + if (!darray_same(resultSyms, from->syms[group])) + darray_free(from->syms[group]); + darray_init(from->syms[group]); + darray_free(from->symsMapIndex[group]); + darray_free(from->symsMapNumEntries[group]); into->acts[group] = resultActs; - from->acts[group] = NULL; - into->symsDefined |= (1 << group); + darray_init(from->acts[group]); + if (!darray_empty(into->syms[group])) + into->symsDefined |= (1 << group); from->symsDefined &= ~(1 << group); into->actsDefined |= (1 << group); from->actsDefined &= ~(1 << group); - return True; + + return true; +} + +static bool +UseNewKeyField(enum key_field field, KeyInfo *old, KeyInfo *new, + int verbosity, enum key_field *collide) +{ + if (!(old->defined & field)) + return true; + + if (new->defined & field) { + if ((old->file_id == new->file_id && verbosity > 0) || verbosity > 9) + *collide |= field; + + if (new->merge != MERGE_AUGMENT) + return true; + } + + return false; } -static Bool -MergeKeys(SymbolsInfo * info, KeyInfo * into, KeyInfo * from) + +static bool +MergeKeys(SymbolsInfo *info, KeyInfo *into, KeyInfo *from) { - register int i; - unsigned collide = 0; - Bool report; - - if (from->defs.merge == MergeReplace) - { - for (i = 0; i < XkbNumKbdGroups; i++) - { - if (into->numLevels[i] != 0) - { - if (into->syms[i]) - free(into->syms[i]); - if (into->acts[i]) - free(into->acts[i]); + xkb_group_index_t i; + enum key_field collide = 0; + bool report; + int verbosity = xkb_get_log_verbosity(info->keymap->ctx); + + if (from->merge == MERGE_REPLACE) { + for (i = 0; i < XkbNumKbdGroups; i++) { + if (into->numLevels[i] != 0) { + darray_free(into->syms[i]); + darray_free(into->acts[i]); } } *into = *from; - bzero(from, sizeof(KeyInfo)); - return True; + memset(from, 0, sizeof(KeyInfo)); + return true; } - report = ((warningLevel > 9) || - ((into->defs.fileID == from->defs.fileID) - && (warningLevel > 0))); - for (i = 0; i < XkbNumKbdGroups; i++) - { - if (from->numLevels[i] > 0) - { - if (into->numLevels[i] == 0) - { + + report = (verbosity > 9 || + (into->file_id == from->file_id && verbosity > 0)); + + for (i = 0; i < XkbNumKbdGroups; i++) { + if (from->numLevels[i] > 0) { + if (into->numLevels[i] == 0) { into->numLevels[i] = from->numLevels[i]; into->syms[i] = from->syms[i]; + into->symsMapIndex[i] = from->symsMapIndex[i]; + into->symsMapNumEntries[i] = from->symsMapNumEntries[i]; into->acts[i] = from->acts[i]; into->symsDefined |= (1 << i); - from->syms[i] = NULL; - from->acts[i] = NULL; + darray_init(from->syms[i]); + darray_init(from->symsMapIndex[i]); + darray_init(from->symsMapNumEntries[i]); + darray_init(from->acts[i]); from->numLevels[i] = 0; from->symsDefined &= ~(1 << i); - if (into->syms[i]) - into->defs.defined |= _Key_Syms; - if (into->acts[i]) - into->defs.defined |= _Key_Acts; + if (!darray_empty(into->syms[i])) + into->defined |= KEY_FIELD_SYMS; + if (!darray_empty(into->acts[i])) + into->defined |= KEY_FIELD_ACTS; } - else - { - if (report) - { - if (into->syms[i]) - collide |= _Key_Syms; - if (into->acts[i]) - collide |= _Key_Acts; + else { + if (report) { + if (!darray_empty(into->syms[i])) + collide |= KEY_FIELD_SYMS; + if (!darray_empty(into->acts[i])) + collide |= KEY_FIELD_ACTS; } MergeKeyGroups(info, into, from, (unsigned) i); } } - if (from->types[i] != None) - { - if ((into->types[i] != None) && (report) && - (into->types[i] != from->types[i])) - { - uint32_t use, ignore; - collide |= _Key_Types; - if (from->defs.merge != MergeAugment) - { + if (from->types[i] != XKB_ATOM_NONE) { + if ((into->types[i] != XKB_ATOM_NONE) && report && + (into->types[i] != from->types[i])) { + xkb_atom_t use, ignore; + collide |= KEY_FIELD_TYPES; + if (from->merge != MERGE_AUGMENT) { use = from->types[i]; ignore = into->types[i]; } - else - { + else { use = into->types[i]; ignore = from->types[i]; } - WARN - ("Multiple definitions for group %d type of key %s\n", - i, longText(into->name)); - ACTION("Using %s, ignoring %s\n", - XkbcAtomText(use), - XkbcAtomText(ignore)); + + log_warn(info->keymap->ctx, + "Multiple definitions for group %d type of key %s; " + "Using %s, ignoring %s\n", + i, LongKeyNameText(into->name), + xkb_atom_text(info->keymap->ctx, use), + xkb_atom_text(info->keymap->ctx, ignore)); } - if ((from->defs.merge != MergeAugment) - || (into->types[i] == None)) - { + + if (from->merge != MERGE_AUGMENT || + into->types[i] == XKB_ATOM_NONE) { into->types[i] = from->types[i]; } } } - if (UseNewField(_Key_Behavior, &into->defs, &from->defs, &collide)) - { - into->behavior = from->behavior; - into->nameForOverlayKey = from->nameForOverlayKey; - into->defs.defined |= _Key_Behavior; - } - if (UseNewField(_Key_VModMap, &into->defs, &from->defs, &collide)) - { + + if (UseNewKeyField(KEY_FIELD_VMODMAP, into, from, verbosity, &collide)) { into->vmodmap = from->vmodmap; - into->defs.defined |= _Key_VModMap; + into->defined |= KEY_FIELD_VMODMAP; } - if (UseNewField(_Key_Repeat, &into->defs, &from->defs, &collide)) - { + if (UseNewKeyField(KEY_FIELD_REPEAT, into, from, verbosity, &collide)) { into->repeat = from->repeat; - into->defs.defined |= _Key_Repeat; + into->defined |= KEY_FIELD_REPEAT; } - if (UseNewField(_Key_Type_Dflt, &into->defs, &from->defs, &collide)) - { + if (UseNewKeyField(KEY_FIELD_TYPE_DFLT, into, from, verbosity, &collide)) { into->dfltType = from->dfltType; - into->defs.defined |= _Key_Type_Dflt; + into->defined |= KEY_FIELD_TYPE_DFLT; } - if (UseNewField(_Key_GroupInfo, &into->defs, &from->defs, &collide)) - { - into->groupInfo = from->groupInfo; - into->defs.defined |= _Key_GroupInfo; + if (UseNewKeyField(KEY_FIELD_GROUPINFO, into, from, verbosity, &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) - { - WARN("Symbol map for key %s redefined\n", - longText(into->name)); - ACTION("Using %s definition for conflicting fields\n", - (from->defs.merge == MergeAugment ? "first" : "last")); - } - return True; + log_warn(info->keymap->ctx, + "Symbol map for key %s redefined; " + "Using %s definition for conflicting fields\n", + LongKeyNameText(into->name), + (from->merge == MERGE_AUGMENT ? "first" : "last")); + + return true; } -static Bool -AddKeySymbols(SymbolsInfo * info, KeyInfo * key, struct xkb_desc * xkb) +static bool +AddKeySymbols(SymbolsInfo *info, KeyInfo *keyi) { - register int i; unsigned long real_name; + KeyInfo *iter, *new; - for (i = 0; i < info->nKeys; i++) - { - if (info->keys[i].name == key->name) - return MergeKeys(info, &info->keys[i], key); - } - if (FindKeyNameForAlias(xkb, key->name, &real_name)) - { - for (i = 0; i < info->nKeys; i++) - { - if (info->keys[i].name == real_name) - return MergeKeys(info, &info->keys[i], key); - } - } - if (info->nKeys >= info->szKeys) - { - info->szKeys += SYMBOLS_CHUNK; - info->keys = - uTypedRecalloc(info->keys, info->nKeys, info->szKeys, KeyInfo); - if (!info->keys) - { - WSGO("Could not allocate key symbols descriptions\n"); - ACTION("Some key symbols definitions may be lost\n"); - return False; - } - } - return CopyKeyInfo(key, &info->keys[info->nKeys++], True); + darray_foreach(iter, info->keys) + if (iter->name == keyi->name) + return MergeKeys(info, iter, keyi); + + if (FindKeyNameForAlias(info->keymap, keyi->name, &real_name)) + darray_foreach(iter, info->keys) + if (iter->name == real_name) + return MergeKeys(info, iter, keyi); + + darray_resize0(info->keys, darray_size(info->keys) + 1); + new = &darray_item(info->keys, darray_size(info->keys) - 1); + return CopyKeyInfo(keyi, new, true); } -static Bool +static bool AddModMapEntry(SymbolsInfo * info, ModMapEntry * new) { ModMapEntry *mm; - Bool clobber; + bool clobber; - clobber = (new->defs.merge != MergeAugment); - for (mm = info->modMap; mm != NULL; mm = (ModMapEntry *) mm->defs.next) - { + clobber = (new->merge != MERGE_AUGMENT); + list_foreach(mm, &info->modMaps, entry) { if (new->haveSymbol && mm->haveSymbol - && (new->u.keySym == mm->u.keySym)) - { + && (new->u.keySym == mm->u.keySym)) { unsigned use, ignore; - if (mm->modifier != new->modifier) - { - if (clobber) - { + if (mm->modifier != new->modifier) { + if (clobber) { use = new->modifier; ignore = mm->modifier; } - else - { + else { use = mm->modifier; ignore = new->modifier; } - ERROR - ("%s added to symbol map for multiple modifiers\n", - XkbcKeysymText(new->u.keySym)); - ACTION("Using %s, ignoring %s.\n", - XkbcModIndexText(use), - XkbcModIndexText(ignore)); + log_err(info->keymap->ctx, + "%s added to symbol map for multiple modifiers; " + "Using %s, ignoring %s.\n", + KeysymText(new->u.keySym), ModIndexText(use), + ModIndexText(ignore)); mm->modifier = use; } - return True; + return true; } if ((!new->haveSymbol) && (!mm->haveSymbol) && - (new->u.keyName == mm->u.keyName)) - { + (new->u.keyName == mm->u.keyName)) { unsigned use, ignore; - if (mm->modifier != new->modifier) - { - if (clobber) - { + if (mm->modifier != new->modifier) { + if (clobber) { use = new->modifier; ignore = mm->modifier; } - else - { + else { use = mm->modifier; ignore = new->modifier; } - ERROR("Key %s added to map for multiple modifiers\n", - longText(new->u.keyName)); - ACTION("Using %s, ignoring %s.\n", - XkbcModIndexText(use), - XkbcModIndexText(ignore)); + log_err(info->keymap->ctx, + "Key %s added to map for multiple modifiers; " + "Using %s, ignoring %s.\n", + LongKeyNameText(new->u.keyName), ModIndexText(use), + ModIndexText(ignore)); mm->modifier = use; } - return True; + return true; } } - mm = uTypedAlloc(ModMapEntry); - if (mm == NULL) - { - WSGO("Could not allocate modifier map entry\n"); - ACTION("Modifier map for %s will be incomplete\n", - XkbcModIndexText(new->modifier)); - return False; + + mm = malloc(sizeof(*mm)); + if (!mm) { + log_wsgo(info->keymap->ctx, + "Could not allocate modifier map entry; " + "Modifier map for %s will be incomplete\n", + ModIndexText(new->modifier)); + return false; } + *mm = *new; - mm->defs.next = &info->modMap->defs; - info->modMap = mm; - return True; + list_add(&mm->entry, &info->modMaps); + return true; } /***====================================================================***/ static void -MergeIncludedSymbols(SymbolsInfo * into, SymbolsInfo * from, - unsigned merge, struct xkb_desc * xkb) +MergeIncludedSymbols(SymbolsInfo *into, SymbolsInfo *from, + enum merge_mode merge) { - register int i; - KeyInfo *key; + unsigned int i; + KeyInfo *keyi; + ModMapEntry *mm, *next; - if (from->errorCount > 0) - { + if (from->errorCount > 0) { into->errorCount += from->errorCount; return; } - if (into->name == NULL) - { + if (into->name == NULL) { into->name = from->name; from->name = NULL; } - for (i = 0; i < XkbNumKbdGroups; i++) - { - if (from->groupNames[i] != None) - { - if ((merge != MergeAugment) || (into->groupNames[i] == None)) + for (i = 0; i < XkbNumKbdGroups; i++) { + if (from->groupNames[i] != XKB_ATOM_NONE) { + if ((merge != MERGE_AUGMENT) || + (into->groupNames[i] == XKB_ATOM_NONE)) into->groupNames[i] = from->groupNames[i]; } } - for (i = 0, key = from->keys; i < from->nKeys; i++, key++) - { - if (merge != MergeDefault) - key->defs.merge = merge; - if (!AddKeySymbols(into, key, xkb)) + + darray_foreach(keyi, from->keys) { + if (merge != MERGE_DEFAULT) + keyi->merge = merge; + + if (!AddKeySymbols(into, keyi)) into->errorCount++; } - if (from->modMap != NULL) - { - ModMapEntry *mm, *next; - for (mm = from->modMap; mm != NULL; mm = next) - { - if (merge != MergeDefault) - mm->defs.merge = merge; - if (!AddModMapEntry(into, mm)) - into->errorCount++; - next = (ModMapEntry *) mm->defs.next; - free(mm); - } - from->modMap = NULL; - } - if (!MergeAliases(&into->aliases, &from->aliases, merge)) - into->errorCount++; - return; -} - -typedef void (*FileHandler) (XkbFile * /* rtrn */ , - struct xkb_desc * /* xkb */ , - unsigned /* merge */ , - SymbolsInfo * /* included */ - ); - -static Bool -HandleIncludeSymbols(IncludeStmt * stmt, - struct xkb_desc * xkb, SymbolsInfo * info, FileHandler hndlr) + + list_foreach_safe(mm, next, &from->modMaps, entry) { + if (merge != MERGE_DEFAULT) + mm->merge = merge; + if (!AddModMapEntry(into, mm)) + into->errorCount++; + free(mm); + } + list_init(&from->modMaps); +} + +static void +HandleSymbolsFile(SymbolsInfo *info, XkbFile *file, enum merge_mode merge); + +static bool +HandleIncludeSymbols(SymbolsInfo *info, IncludeStmt *stmt) { - unsigned newMerge; + enum merge_mode merge = MERGE_DEFAULT; XkbFile *rtrn; - SymbolsInfo included; - Bool haveSelf; + SymbolsInfo included, next_incl; - haveSelf = False; - if ((stmt->file == NULL) && (stmt->map == NULL)) - { - haveSelf = True; - included = *info; - bzero(info, sizeof(SymbolsInfo)); - } - else if (ProcessIncludeFile(stmt, XkmSymbolsIndex, &rtrn, &newMerge)) - { - InitSymbolsInfo(&included, xkb); - included.fileID = included.dflt.defs.fileID = rtrn->id; - included.merge = included.dflt.defs.merge = MergeOverride; - if (stmt->modifier) - { - included.explicit_group = atoi(stmt->modifier) - 1; - } - else - { - included.explicit_group = info->explicit_group; - } - (*hndlr) (rtrn, xkb, MergeOverride, &included); - if (stmt->stmt != NULL) - { - if (included.name != NULL) - free(included.name); - included.name = stmt->stmt; - stmt->stmt = NULL; - } + InitSymbolsInfo(&included, info->keymap, info->file_id); + if (stmt->stmt) { + free(included.name); + included.name = stmt->stmt; + stmt->stmt = NULL; } - else - { - info->errorCount += 10; - return False; - } - if ((stmt->next != NULL) && (included.errorCount < 1)) - { - IncludeStmt *next; - unsigned op; - SymbolsInfo next_incl; - - for (next = stmt->next; next != NULL; next = next->next) - { - if ((next->file == NULL) && (next->map == NULL)) - { - haveSelf = True; - MergeIncludedSymbols(&included, info, next->merge, xkb); - FreeSymbolsInfo(info); - } - else if (ProcessIncludeFile(next, XkmSymbolsIndex, &rtrn, &op)) - { - InitSymbolsInfo(&next_incl, xkb); - next_incl.fileID = next_incl.dflt.defs.fileID = rtrn->id; - next_incl.merge = next_incl.dflt.defs.merge = MergeOverride; - if (next->modifier) - { - next_incl.explicit_group = atoi(next->modifier) - 1; - } - else - { - next_incl.explicit_group = info->explicit_group; - } - (*hndlr) (rtrn, xkb, MergeOverride, &next_incl); - MergeIncludedSymbols(&included, &next_incl, op, xkb); - FreeSymbolsInfo(&next_incl); - } - else - { - info->errorCount += 10; - return False; - } + + for (; stmt; stmt = stmt->next_incl) { + if (!ProcessIncludeFile(info->keymap->ctx, stmt, FILE_TYPE_SYMBOLS, + &rtrn, &merge)) { + info->errorCount += 10; + FreeSymbolsInfo(&included); + return false; } + + InitSymbolsInfo(&next_incl, info->keymap, rtrn->id); + next_incl.merge = next_incl.dflt.merge = MERGE_OVERRIDE; + if (stmt->modifier) + next_incl.explicit_group = atoi(stmt->modifier) - 1; + else + next_incl.explicit_group = info->explicit_group; + + HandleSymbolsFile(&next_incl, rtrn, MERGE_OVERRIDE); + + MergeIncludedSymbols(&included, &next_incl, merge); + + FreeSymbolsInfo(&next_incl); + FreeXKBFile(rtrn); } - if (haveSelf) - *info = included; - else - { - MergeIncludedSymbols(info, &included, newMerge, xkb); - FreeSymbolsInfo(&included); - } - return (info->errorCount == 0); -} -static LookupEntry groupNames[] = { - {"group1", 1}, - {"group2", 2}, - {"group3", 3}, - {"group4", 4}, - {"group5", 5}, - {"group6", 6}, - {"group7", 7}, - {"group8", 8}, - {NULL, 0} -}; + MergeIncludedSymbols(info, &included, merge); + FreeSymbolsInfo(&included); + return (info->errorCount == 0); +} -#define SYMBOLS 1 -#define ACTIONS 2 +#define SYMBOLS 1 +#define ACTIONS 2 -static Bool -GetGroupIndex(KeyInfo * key, - ExprDef * arrayNdx, unsigned what, unsigned *ndx_rtrn) +static bool +GetGroupIndex(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, + unsigned what, xkb_group_index_t *ndx_rtrn) { const char *name; - ExprResult tmp; if (what == SYMBOLS) name = "symbols"; else name = "actions"; - if (arrayNdx == NULL) - { - register int i; + if (arrayNdx == NULL) { + xkb_group_index_t i; unsigned defined; if (what == SYMBOLS) - defined = key->symsDefined; + defined = keyi->symsDefined; else - defined = key->actsDefined; + defined = keyi->actsDefined; - for (i = 0; i < XkbNumKbdGroups; i++) - { - if ((defined & (1 << i)) == 0) - { + for (i = 0; i < XkbNumKbdGroups; i++) { + if ((defined & (1 << i)) == 0) { *ndx_rtrn = i; - return True; + return true; } } - ERROR("Too many groups of %s for key %s (max %d)\n", name, - longText(key->name), XkbNumKbdGroups + 1); - ACTION("Ignoring %s defined for extra groups\n", name); - return False; - } - if (!ExprResolveInteger - (arrayNdx, &tmp, SimpleLookup, (char *) groupNames)) - { - ERROR("Illegal group index for %s of key %s\n", name, - longText(key->name)); - ACTION("Definition with non-integer array index ignored\n"); - return False; - } - if ((tmp.uval < 1) || (tmp.uval > XkbNumKbdGroups)) - { - ERROR("Group index for %s of key %s is out of range (1..%d)\n", - name, longText(key->name), XkbNumKbdGroups + 1); - ACTION("Ignoring %s for group %d\n", name, tmp.uval); - return False; - } - *ndx_rtrn = tmp.uval - 1; - return True; -} - -static Bool -AddSymbolsToKey(KeyInfo * key, - struct xkb_desc * xkb, - char *field, - ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info) -{ - unsigned ndx, nSyms; - int i; - - if (!GetGroupIndex(key, arrayNdx, SYMBOLS, &ndx)) - return False; - if (value == NULL) - { - key->symsDefined |= (1 << ndx); - return True; - } - if (value->op != ExprKeysymList) - { - ERROR("Expected a list of symbols, found %s\n", - exprOpText(value->op)); - ACTION("Ignoring symbols for group %d of %s\n", ndx, - longText(key->name)); - return False; - } - if (key->syms[ndx] != NULL) - { - WSGO("Symbols for key %s, group %d already defined\n", - longText(key->name), ndx); - return False; - } - nSyms = value->value.list.nSyms; - if (((key->numLevels[ndx] < nSyms) || (key->syms[ndx] == NULL)) && - (!ResizeKeyGroup(key, ndx, nSyms, False))) - { - WSGO("Could not resize group %d of key %s\n", ndx, - longText(key->name)); - ACTION("Symbols lost\n"); - return False; - } - key->symsDefined |= (1 << ndx); - for (i = 0; i < nSyms; i++) { - if (!LookupKeysym(value->value.list.syms[i], &key->syms[ndx][i])) { - WSGO("Could not resolve keysym %s\n", value->value.list.syms[i]); - key->syms[ndx][i] = NoSymbol; - } - } - for (i = key->numLevels[ndx] - 1; - (i >= 0) && (key->syms[ndx][i] == NoSymbol); i--) - { - key->numLevels[ndx]--; - } - return True; -} - -static Bool -AddActionsToKey(KeyInfo * key, - struct xkb_desc * xkb, - char *field, - ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info) -{ - register int i; - unsigned ndx, nActs; + + log_err(info->keymap->ctx, + "Too many groups of %s for key %s (max %u); " + "Ignoring %s defined for extra groups\n", + name, LongKeyNameText(keyi->name), XkbNumKbdGroups + 1, name); + return false; + } + + if (!ExprResolveGroup(info->keymap->ctx, arrayNdx, ndx_rtrn)) { + log_err(info->keymap->ctx, + "Illegal group index for %s of key %s\n" + "Definition with non-integer array index ignored\n", + name, LongKeyNameText(keyi->name)); + return false; + } + + (*ndx_rtrn)--; + return true; +} + +static bool +AddSymbolsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, + ExprDef *value) +{ + xkb_group_index_t ndx; + size_t nSyms; + xkb_level_index_t nLevels; + xkb_level_index_t i; + int j; + + if (!GetGroupIndex(info, keyi, arrayNdx, SYMBOLS, &ndx)) + return false; + if (value == NULL) { + keyi->symsDefined |= (1 << ndx); + return true; + } + if (value->op != EXPR_KEYSYM_LIST) { + log_err(info->keymap->ctx, + "Expected a list of symbols, found %s; " + "Ignoring symbols for group %u of %s\n", + exprOpText(value->op), ndx + 1, LongKeyNameText(keyi->name)); + return false; + } + if (!darray_empty(keyi->syms[ndx])) { + log_err(info->keymap->ctx, + "Symbols for key %s, group %u already defined; " + "Ignoring duplicate definition\n", + LongKeyNameText(keyi->name), ndx + 1); + return false; + } + nSyms = darray_size(value->value.list.syms); + nLevels = darray_size(value->value.list.symsMapIndex); + if ((keyi->numLevels[ndx] < nSyms || darray_empty(keyi->syms[ndx])) && + (!ResizeKeyGroup(keyi, ndx, nLevels, nSyms, false))) { + log_wsgo(info->keymap->ctx, + "Could not resize group %u of key %s to contain %zu levels; " + "Symbols lost\n", + ndx + 1, LongKeyNameText(keyi->name), nSyms); + return false; + } + keyi->symsDefined |= (1 << ndx); + for (i = 0; i < nLevels; i++) { + darray_item(keyi->symsMapIndex[ndx], i) = + darray_item(value->value.list.symsMapIndex, i); + darray_item(keyi->symsMapNumEntries[ndx], i) = + darray_item(value->value.list.symsNumEntries, i); + + for (j = 0; j < darray_item(keyi->symsMapNumEntries[ndx], i); j++) { + /* FIXME: What's abort() doing here? */ + if (darray_item(keyi->symsMapIndex[ndx], i) + j >= nSyms) + abort(); + if (!LookupKeysym(darray_item(value->value.list.syms, + darray_item(value->value.list.symsMapIndex, + i) + j), + &darray_item(keyi->syms[ndx], + darray_item(keyi->symsMapIndex[ndx], + i) + j))) { + log_warn(info->keymap->ctx, + "Could not resolve keysym %s for key %s, group %u (%s), level %zu\n", + darray_item(value->value.list.syms, i), + LongKeyNameText(keyi->name), + ndx + 1, + xkb_atom_text(info->keymap->ctx, + info->groupNames[ndx]), + nSyms); + while (--j >= 0) + darray_item(keyi->syms[ndx], + darray_item(keyi->symsMapIndex[ndx], + i) + j) = XKB_KEY_NoSymbol; + darray_item(keyi->symsMapIndex[ndx], i) = -1; + darray_item(keyi->symsMapNumEntries[ndx], i) = 0; + break; + } + if (darray_item(keyi->symsMapNumEntries[ndx], i) == 1 && + darray_item(keyi->syms[ndx], + darray_item(keyi->symsMapIndex[ndx], + i) + j) == XKB_KEY_NoSymbol) { + darray_item(keyi->symsMapIndex[ndx], i) = -1; + darray_item(keyi->symsMapNumEntries[ndx], i) = 0; + } + } + } + for (j = keyi->numLevels[ndx] - 1; + j >= 0 && darray_item(keyi->symsMapNumEntries[ndx], j) == 0; j--) + keyi->numLevels[ndx]--; + return true; +} + +static bool +AddActionsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, + ExprDef *value) +{ + size_t i; + xkb_group_index_t ndx; + size_t nActs; ExprDef *act; - struct xkb_any_action *toAct; + union xkb_action *toAct; + + if (!GetGroupIndex(info, keyi, arrayNdx, ACTIONS, &ndx)) + return false; + + if (value == NULL) { + keyi->actsDefined |= (1 << ndx); + return true; + } - if (!GetGroupIndex(key, arrayNdx, ACTIONS, &ndx)) - return False; + if (value->op != EXPR_ACTION_LIST) { + log_wsgo(info->keymap->ctx, + "Bad expression type (%d) for action list value; " + "Ignoring actions for group %u of %s\n", + value->op, ndx, LongKeyNameText(keyi->name)); + return false; + } - if (value == NULL) - { - key->actsDefined |= (1 << ndx); - return True; - } - if (value->op != ExprActionList) - { - WSGO("Bad expression type (%d) for action list value\n", value->op); - ACTION("Ignoring actions for group %d of %s\n", ndx, - longText(key->name)); - return False; - } - if (key->acts[ndx] != NULL) - { - WSGO("Actions for key %s, group %d already defined\n", - longText(key->name), ndx); - return False; + if (!darray_empty(keyi->acts[ndx])) { + log_wsgo(info->keymap->ctx, + "Actions for key %s, group %u already defined\n", + LongKeyNameText(keyi->name), ndx); + return false; } - for (nActs = 0, act = value->value.child; act != NULL; nActs++) - { + + for (nActs = 0, act = value->value.child; act != NULL; nActs++) { act = (ExprDef *) act->common.next; } - if (nActs < 1) - { - WSGO("Action list but not actions in AddActionsToKey\n"); - return False; - } - if (((key->numLevels[ndx] < nActs) || (key->acts[ndx] == NULL)) && - (!ResizeKeyGroup(key, ndx, nActs, True))) - { - WSGO("Could not resize group %d of key %s\n", ndx, - longText(key->name)); - ACTION("Actions lost\n"); - return False; + + if (nActs < 1) { + log_wsgo(info->keymap->ctx, + "Action list but not actions in AddActionsToKey\n"); + return false; + } + + if ((keyi->numLevels[ndx] < nActs || darray_empty(keyi->acts[ndx])) && + !ResizeKeyGroup(keyi, ndx, nActs, nActs, true)) { + log_wsgo(info->keymap->ctx, + "Could not resize group %u of key %s; " + "Actions lost\n", + ndx, LongKeyNameText(keyi->name)); + return false; } - key->actsDefined |= (1 << ndx); + keyi->actsDefined |= (1 << ndx); - toAct = (struct xkb_any_action *) key->acts[ndx]; + toAct = darray_mem(keyi->acts[ndx], 0); act = value->value.child; - for (i = 0; i < nActs; i++, toAct++) - { - if (!HandleActionDef(act, xkb, toAct, MergeOverride, info->action)) - { - ERROR("Illegal action definition for %s\n", - longText(key->name)); - ACTION("Action for group %d/level %d ignored\n", ndx + 1, i + 1); + for (i = 0; i < nActs; i++, toAct++) { + if (!HandleActionDef(act, info->keymap, toAct, info->action)) { + log_err(info->keymap->ctx, + "Illegal action definition for %s; " + "Action for group %u/level %zu ignored\n", + LongKeyNameText(keyi->name), ndx + 1, i + 1); } act = (ExprDef *) act->common.next; } - return True; -} -static int -SetAllowNone(KeyInfo * key, ExprDef * arrayNdx, ExprDef * value) -{ - ExprResult tmp; - unsigned radio_groups = 0; - - if (arrayNdx == NULL) - { - radio_groups = XkbAllRadioGroupsMask; - } - else - { - if (!ExprResolveInteger(arrayNdx, &tmp, RadioLookup, NULL)) - { - ERROR("Illegal index in group name definition\n"); - ACTION("Definition with non-integer array index ignored\n"); - return False; - } - if ((tmp.uval < 1) || (tmp.uval > XkbMaxRadioGroups)) - { - ERROR("Illegal radio group specified (must be 1..%d)\n", - XkbMaxRadioGroups + 1); - ACTION("Value of \"allow none\" for group %d ignored\n", - tmp.uval); - return False; - } - radio_groups |= (1 << (tmp.uval - 1)); - } - if (!ExprResolveBoolean(value, &tmp, NULL, NULL)) - { - ERROR("Illegal \"allow none\" value for %s\n", - longText(key->name)); - ACTION("Non-boolean value ignored\n"); - return False; - } - if (tmp.uval) - key->allowNone |= radio_groups; - else - key->allowNone &= ~radio_groups; - return True; + return true; } - -static LookupEntry lockingEntries[] = { - {"true", XkbKB_Lock}, - {"yes", XkbKB_Lock}, - {"on", XkbKB_Lock}, - {"false", XkbKB_Default}, - {"no", XkbKB_Default}, - {"off", XkbKB_Default}, - {"permanent", XkbKB_Lock | XkbKB_Permanent}, - {NULL, 0} -}; - -static LookupEntry repeatEntries[] = { - {"true", RepeatYes}, - {"yes", RepeatYes}, - {"on", RepeatYes}, - {"false", RepeatNo}, - {"no", RepeatNo}, - {"off", RepeatNo}, - {"default", RepeatUndefined}, - {NULL, 0} -}; - -static LookupEntry rgEntries[] = { - {"none", 0}, - {NULL, 0} +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(KeyInfo * key, - struct xkb_desc * xkb, - char *field, - ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info) -{ - Bool ok = True; - ExprResult tmp; - - if (uStrCaseCmp(field, "type") == 0) - { - ExprResult ndx; - if ((!ExprResolveString(value, &tmp, NULL, NULL)) - && (warningLevel > 0)) - { - WARN("The type field of a key symbol map must be a string\n"); - ACTION("Ignoring illegal type definition\n"); - } - if (arrayNdx == NULL) - { - key->dfltType = xkb_intern_atom(tmp.str); - key->defs.defined |= _Key_Type_Dflt; - } - else if (!ExprResolveInteger(arrayNdx, &ndx, SimpleLookup, - (char *) groupNames)) - { - ERROR("Illegal group index for type of key %s\n", - longText(key->name)); - ACTION("Definition with non-integer array index ignored\n"); - free(tmp.str); - return False; - } - else if ((ndx.uval < 1) || (ndx.uval > XkbNumKbdGroups)) - { - ERROR - ("Group index for type of key %s is out of range (1..%d)\n", - longText(key->name), XkbNumKbdGroups + 1); - ACTION("Ignoring type for group %d\n", ndx.uval); - free(tmp.str); - return False; - } - else - { - key->types[ndx.uval - 1] = xkb_intern_atom(tmp.str); - key->typesDefined |= (1 << (ndx.uval - 1)); - } - free(tmp.str); - } - else if (uStrCaseCmp(field, "symbols") == 0) - return AddSymbolsToKey(key, xkb, field, arrayNdx, value, info); - else if (uStrCaseCmp(field, "actions") == 0) - return AddActionsToKey(key, xkb, field, arrayNdx, value, info); - else if ((uStrCaseCmp(field, "vmods") == 0) || - (uStrCaseCmp(field, "virtualmods") == 0) || - (uStrCaseCmp(field, "virtualmodifiers") == 0)) - { - ok = ExprResolveModMask(value, &tmp, LookupVModMask, (char *) xkb); - if (ok) - { - key->vmodmap = (tmp.uval >> 8); - key->defs.defined |= _Key_VModMap; - } - else - { - ERROR("Expected a virtual modifier mask, found %s\n", - exprOpText(value->op)); - ACTION("Ignoring virtual modifiers definition for key %s\n", - longText(key->name)); - } - } - else if ((uStrCaseCmp(field, "locking") == 0) - || (uStrCaseCmp(field, "lock") == 0) - || (uStrCaseCmp(field, "locks") == 0)) - { - ok = ExprResolveEnum(value, &tmp, lockingEntries); - if (ok) - key->behavior.type = tmp.uval; - key->defs.defined |= _Key_Behavior; - } - else if ((uStrCaseCmp(field, "radiogroup") == 0) || - (uStrCaseCmp(field, "permanentradiogroup") == 0)) - { - Bool permanent = False; - if (uStrCaseCmp(field, "permanentradiogroup") == 0) - permanent = True; - ok = ExprResolveInteger(value, &tmp, SimpleLookup, - (char *) rgEntries); - if (!ok) - { - ERROR("Illegal radio group specification for %s\n", - longText(key->name)); - ACTION("Non-integer radio group ignored\n"); - return False; - } - if (tmp.uval == 0) - { - key->behavior.type = XkbKB_Default; - key->behavior.data = 0; - return ok; - } - if ((tmp.uval < 1) || (tmp.uval > XkbMaxRadioGroups)) - { - ERROR - ("Radio group specification for %s out of range (1..32)\n", - longText(key->name)); - ACTION("Illegal radio group %d ignored\n", tmp.uval); - return False; - } - key->behavior.type = - XkbKB_RadioGroup | (permanent ? XkbKB_Permanent : 0); - key->behavior.data = tmp.uval - 1; - if (key->allowNone & (1 << (tmp.uval - 1))) - key->behavior.data |= XkbKB_RGAllowNone; - key->defs.defined |= _Key_Behavior; - } - else if (uStrCaseEqual(field, "allownone")) - { - ok = SetAllowNone(key, arrayNdx, value); - } - else if (uStrCasePrefix("overlay", field) || - uStrCasePrefix("permanentoverlay", field)) - { - Bool permanent = False; - char *which; - int overlayNdx; - if (uStrCasePrefix("permanent", field)) - { - permanent = True; - which = &field[sizeof("permanentoverlay") - 1]; - } - else - { - which = &field[sizeof("overlay") - 1]; - } - if (sscanf(which, "%d", &overlayNdx) == 1) - { - if (((overlayNdx < 1) || (overlayNdx > 2)) && (warningLevel > 0)) - { - ERROR("Illegal overlay %d specified for %s\n", - overlayNdx, longText(key->name)); - ACTION("Ignored\n"); - return False; - } - } - else if (*which == '\0') - overlayNdx = 1; - else if (warningLevel > 0) - { - ERROR("Illegal overlay \"%s\" specified for %s\n", - which, longText(key->name)); - ACTION("Ignored\n"); - return False; +static bool +SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, + ExprDef *arrayNdx, ExprDef *value) +{ + bool ok = true; + struct xkb_context *ctx = info->keymap->ctx; + + if (istreq(field, "type")) { + xkb_group_index_t ndx; + const char *str; + + if (!ExprResolveString(ctx, value, &str)) + log_lvl(info->keymap->ctx, 1, + "The type field of a key symbol map must be a string; " + "Ignoring illegal type definition\n"); + + if (arrayNdx == NULL) { + keyi->dfltType = xkb_atom_intern(ctx, str); + keyi->defined |= KEY_FIELD_TYPE_DFLT; + } + else if (!ExprResolveGroup(ctx, arrayNdx, &ndx)) { + log_err(info->keymap->ctx, + "Illegal group index for type of key %s; " + "Definition with non-integer array index ignored\n", + LongKeyNameText(keyi->name)); + return false; } - ok = ExprResolveKeyName(value, &tmp, NULL, NULL); - if (!ok) - { - ERROR("Illegal overlay key specification for %s\n", - longText(key->name)); - ACTION("Overlay key must be specified by name\n"); - return False; + else { + ndx--; + keyi->types[ndx] = xkb_atom_intern(ctx, str); + keyi->typesDefined |= (1 << ndx); + } + } + 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; + + ok = ExprResolveVModMask(info->keymap, value, &mask); + if (ok) { + keyi->vmodmap = (mask >> XkbNumModifiers) & 0xffff; + keyi->defined |= KEY_FIELD_VMODMAP; } - if (overlayNdx == 1) - key->behavior.type = XkbKB_Overlay1; - else - key->behavior.type = XkbKB_Overlay2; - if (permanent) - key->behavior.type |= XkbKB_Permanent; - - key->behavior.data = 0; - key->nameForOverlayKey = KeyNameToLong(tmp.keyName.name); - key->defs.defined |= _Key_Behavior; - } - else if ((uStrCaseCmp(field, "repeating") == 0) || - (uStrCaseCmp(field, "repeats") == 0) || - (uStrCaseCmp(field, "repeat") == 0)) - { - ok = ExprResolveEnum(value, &tmp, repeatEntries); - if (!ok) - { - ERROR("Illegal repeat setting for %s\n", - longText(key->name)); - ACTION("Non-boolean repeat setting ignored\n"); - return False; - } - key->repeat = tmp.uval; - key->defs.defined |= _Key_Repeat; - } - else if ((uStrCaseCmp(field, "groupswrap") == 0) || - (uStrCaseCmp(field, "wrapgroups") == 0)) - { - ok = ExprResolveBoolean(value, &tmp, NULL, NULL); - if (!ok) - { - ERROR("Illegal groupsWrap setting for %s\n", - longText(key->name)); - ACTION("Non-boolean value ignored\n"); - return False; + else { + log_err(info->keymap->ctx, + "Expected a virtual modifier mask, found %s; " + "Ignoring virtual modifiers definition for key %s\n", + exprOpText(value->op), LongKeyNameText(keyi->name)); + } + } + else if (istreq(field, "locking") || + istreq(field, "lock") || + istreq(field, "locks")) { + log_err(info->keymap->ctx, + "Key behaviors not supported; " + "Ignoring locking specification for key %s\n", + LongKeyNameText(keyi->name)); + } + else if (istreq(field, "radiogroup") || + istreq(field, "permanentradiogroup") || + istreq(field, "allownone")) { + log_err(info->keymap->ctx, + "Radio groups not supported; " + "Ignoring radio group specification for key %s\n", + LongKeyNameText(keyi->name)); + } + else if (istreq_prefix("overlay", field) || + istreq_prefix("permanentoverlay", field)) { + log_err(info->keymap->ctx, + "Overlays not supported; " + "Ignoring overlay specification for key %s\n", + LongKeyNameText(keyi->name)); + } + else if (istreq(field, "repeating") || + istreq(field, "repeats") || + istreq(field, "repeat")) { + unsigned int val; + + ok = ExprResolveEnum(ctx, value, &val, repeatEntries); + if (!ok) { + log_err(info->keymap->ctx, + "Illegal repeat setting for %s; " + "Non-boolean repeat setting ignored\n", + LongKeyNameText(keyi->name)); + return false; + } + keyi->repeat = val; + keyi->defined |= KEY_FIELD_REPEAT; + } + else if (istreq(field, "groupswrap") || + istreq(field, "wrapgroups")) { + bool set; + + if (!ExprResolveBoolean(ctx, value, &set)) { + log_err(info->keymap->ctx, + "Illegal groupsWrap setting for %s; " + "Non-boolean value ignored\n", + LongKeyNameText(keyi->name)); + return false; } - if (tmp.uval) - key->groupInfo = XkbWrapIntoRange; + + if (set) + keyi->out_of_range_group_action = XkbWrapIntoRange; else - key->groupInfo = XkbClampIntoRange; - key->defs.defined |= _Key_GroupInfo; + keyi->out_of_range_group_action = XkbClampIntoRange; + + keyi->defined |= KEY_FIELD_GROUPINFO; } - else if ((uStrCaseCmp(field, "groupsclamp") == 0) || - (uStrCaseCmp(field, "clampgroups") == 0)) - { - ok = ExprResolveBoolean(value, &tmp, NULL, NULL); - if (!ok) - { - ERROR("Illegal groupsClamp setting for %s\n", - longText(key->name)); - ACTION("Non-boolean value ignored\n"); - return False; + else if (istreq(field, "groupsclamp") || + istreq(field, "clampgroups")) { + bool set; + + if (!ExprResolveBoolean(ctx, value, &set)) { + log_err(info->keymap->ctx, + "Illegal groupsClamp setting for %s; " + "Non-boolean value ignored\n", + LongKeyNameText(keyi->name)); + return false; } - if (tmp.uval) - key->groupInfo = XkbClampIntoRange; + + if (set) + keyi->out_of_range_group_action = XkbClampIntoRange; else - key->groupInfo = XkbWrapIntoRange; - key->defs.defined |= _Key_GroupInfo; + keyi->out_of_range_group_action = XkbWrapIntoRange; + + keyi->defined |= KEY_FIELD_GROUPINFO; } - else if ((uStrCaseCmp(field, "groupsredirect") == 0) || - (uStrCaseCmp(field, "redirectgroups") == 0)) - { - if (!ExprResolveInteger - (value, &tmp, SimpleLookup, (char *) groupNames)) - { - ERROR("Illegal group index for redirect of key %s\n", - longText(key->name)); - ACTION("Definition with non-integer group ignored\n"); - return False; - } - if ((tmp.uval < 1) || (tmp.uval > XkbNumKbdGroups)) - { - ERROR("Out-of-range (1..%d) group for redirect of key %s\n", - XkbNumKbdGroups, longText(key->name)); - ERROR("Ignoring illegal group %d\n", tmp.uval); - return False; - } - key->groupInfo = - XkbSetGroupInfo(0, XkbRedirectIntoRange, tmp.uval - 1); - key->defs.defined |= _Key_GroupInfo; + else if (istreq(field, "groupsredirect") || + istreq(field, "redirectgroups")) { + xkb_group_index_t grp; + + if (!ExprResolveGroup(ctx, value, &grp)) { + log_err(info->keymap->ctx, + "Illegal group index for redirect of key %s; " + "Definition with non-integer group ignored\n", + LongKeyNameText(keyi->name)); + return false; + } + + keyi->out_of_range_group_action = XkbRedirectIntoRange; + keyi->out_of_range_group_number = grp - 1; + keyi->defined |= KEY_FIELD_GROUPINFO; } - else - { - ERROR("Unknown field %s in a symbol interpretation\n", field); - ACTION("Definition ignored\n"); - ok = False; + else { + log_err(info->keymap->ctx, + "Unknown field %s in a symbol interpretation; " + "Definition ignored\n", + field); + ok = false; } + return ok; } static int -SetGroupName(SymbolsInfo * info, ExprDef * arrayNdx, ExprDef * value) +SetGroupName(SymbolsInfo *info, ExprDef *arrayNdx, ExprDef *value) { - ExprResult tmp, name; + xkb_group_index_t grp; + const char *name; + + if (!arrayNdx) { + log_lvl(info->keymap->ctx, 1, + "You must specify an index when specifying a group name; " + "Group name definition without array subscript ignored\n"); + return false; + } - if ((arrayNdx == NULL) && (warningLevel > 0)) - { - WARN("You must specify an index when specifying a group name\n"); - ACTION("Group name definition without array subscript ignored\n"); - return False; - } - if (!ExprResolveInteger - (arrayNdx, &tmp, SimpleLookup, (char *) groupNames)) - { - ERROR("Illegal index in group name definition\n"); - ACTION("Definition with non-integer array index ignored\n"); - return False; - } - if ((tmp.uval < 1) || (tmp.uval > XkbNumKbdGroups)) - { - ERROR - ("Attempt to specify name for illegal group (must be 1..%d)\n", - XkbNumKbdGroups + 1); - ACTION("Name for group %d ignored\n", tmp.uval); - return False; - } - if (!ExprResolveString(value, &name, NULL, NULL)) - { - ERROR("Group name must be a string\n"); - ACTION("Illegal name for group %d ignored\n", tmp.uval); - return False; + if (!ExprResolveGroup(info->keymap->ctx, arrayNdx, &grp)) { + log_err(info->keymap->ctx, + "Illegal index in group name definition; " + "Definition with non-integer array index ignored\n"); + return false; } - info->groupNames[tmp.uval - 1 + info->explicit_group] = - xkb_intern_atom(name.str); - return True; + if (!ExprResolveString(info->keymap->ctx, value, &name)) { + log_err(info->keymap->ctx, + "Group name must be a string; " + "Illegal name for group %d ignored\n", grp); + return false; + } + + info->groupNames[grp - 1 + info->explicit_group] = + xkb_atom_intern(info->keymap->ctx, name); + + return true; } static int -HandleSymbolsVar(VarDef * stmt, struct xkb_desc * xkb, SymbolsInfo * info) +HandleSymbolsVar(SymbolsInfo *info, VarDef *stmt) { - ExprResult elem, field, tmp; + const char *elem, *field; ExprDef *arrayNdx; - Bool ret; + bool ret; - if (ExprResolveLhs(stmt->name, &elem, &field, &arrayNdx) == 0) + if (ExprResolveLhs(info->keymap->ctx, stmt->name, &elem, &field, + &arrayNdx) == 0) return 0; /* internal error, already reported */ - if (elem.str && (uStrCaseCmp(elem.str, "key") == 0)) - { - ret = SetSymbolsField(&info->dflt, xkb, field.str, arrayNdx, - stmt->value, info); - } - else if ((elem.str == NULL) && ((uStrCaseCmp(field.str, "name") == 0) || - (uStrCaseCmp(field.str, "groupname") == - 0))) - { - ret = SetGroupName(info, arrayNdx, stmt->value); - } - else if ((elem.str == NULL) - && ((uStrCaseCmp(field.str, "groupswrap") == 0) - || (uStrCaseCmp(field.str, "wrapgroups") == 0))) - { - if (!ExprResolveBoolean(stmt->value, &tmp, NULL, NULL)) - { - ERROR("Illegal setting for global groupsWrap\n"); - ACTION("Non-boolean value ignored\n"); - ret = False; - } - else { - if (tmp.uval) - info->groupInfo = XkbWrapIntoRange; - else - info->groupInfo = XkbClampIntoRange; - ret = True; - } + if (elem && istreq(elem, "key")) { + ret = SetSymbolsField(info, &info->dflt, field, arrayNdx, + stmt->value); } - else if ((elem.str == NULL) - && ((uStrCaseCmp(field.str, "groupsclamp") == 0) - || (uStrCaseCmp(field.str, "clampgroups") == 0))) - { - if (!ExprResolveBoolean(stmt->value, &tmp, NULL, NULL)) - { - ERROR("Illegal setting for global groupsClamp\n"); - ACTION("Non-boolean value ignored\n"); - return False; - } - else { - if (tmp.uval) - info->groupInfo = XkbClampIntoRange; - else - info->groupInfo = XkbWrapIntoRange; - ret = True; - } - } - else if ((elem.str == NULL) - && ((uStrCaseCmp(field.str, "groupsredirect") == 0) - || (uStrCaseCmp(field.str, "redirectgroups") == 0))) - { - if (!ExprResolveInteger(stmt->value, &tmp, - SimpleLookup, (char *) groupNames)) - { - ERROR("Illegal group index for global groupsRedirect\n"); - ACTION("Definition with non-integer group ignored\n"); - ret = False; - } - else { - if ((tmp.uval < 1) || (tmp.uval > XkbNumKbdGroups)) - { - ERROR - ("Out-of-range (1..%d) group for global groupsRedirect\n", - XkbNumKbdGroups); - ACTION("Ignoring illegal group %d\n", tmp.uval); - ret = False; - } - else { - info->groupInfo = XkbSetGroupInfo(0, XkbRedirectIntoRange, - tmp.uval); - ret = True; - } - } + else if (!elem && (istreq(field, "name") || + istreq(field, "groupname"))) { + ret = SetGroupName(info, arrayNdx, stmt->value); } - else if ((elem.str == NULL) && (uStrCaseCmp(field.str, "allownone") == 0)) - { - ret = SetAllowNone(&info->dflt, arrayNdx, stmt->value); + else if (!elem && (istreq(field, "groupswrap") || + istreq(field, "wrapgroups"))) { + log_err(info->keymap->ctx, + "Global \"groupswrap\" not supported; Ignored\n"); + ret = true; + } + else if (!elem && (istreq(field, "groupsclamp") || + istreq(field, "clampgroups"))) { + log_err(info->keymap->ctx, + "Global \"groupsclamp\" not supported; Ignored\n"); + ret = true; + } + else if (!elem && (istreq(field, "groupsredirect") || + istreq(field, "redirectgroups"))) { + log_err(info->keymap->ctx, + "Global \"groupsredirect\" not supported; Ignored\n"); + ret = true; + } + else if (!elem && istreq(field, "allownone")) { + log_err(info->keymap->ctx, + "Radio groups not supported; " + "Ignoring \"allownone\" specification\n"); + ret = true; } else { - ret = SetActionField(xkb, elem.str, field.str, arrayNdx, stmt->value, - &info->action); + ret = SetActionField(info->keymap, elem, field, arrayNdx, + stmt->value, &info->action); } - free(elem.str); - free(field.str); return ret; } -static Bool -HandleSymbolsBody(VarDef * def, - struct xkb_desc * xkb, KeyInfo * key, SymbolsInfo * info) +static bool +HandleSymbolsBody(SymbolsInfo *info, VarDef *def, KeyInfo *keyi) { - Bool ok = True; - ExprResult tmp, field; + bool ok = true; + const char *elem, *field; ExprDef *arrayNdx; - for (; def != NULL; def = (VarDef *) def->common.next) - { - if ((def->name) && (def->name->type == ExprFieldRef)) - { - ok = HandleSymbolsVar(def, xkb, info); + for (; def; def = (VarDef *) def->common.next) { + if (def->name && def->name->op == EXPR_FIELD_REF) { + ok = HandleSymbolsVar(info, def); continue; } - else - { - if (def->name == NULL) - { - if ((def->value == NULL) - || (def->value->op == ExprKeysymList)) - field.str = "symbols"; - else - field.str = "actions"; - arrayNdx = NULL; - } + + if (!def->name) { + if (!def->value || def->value->op == EXPR_KEYSYM_LIST) + field = "symbols"; else - { - ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx); - } - if (ok) - ok = SetSymbolsField(key, xkb, field.str, arrayNdx, - def->value, info); + field = "actions"; + arrayNdx = NULL; } + else { + ok = ExprResolveLhs(info->keymap->ctx, def->name, &elem, &field, + &arrayNdx); + } + + if (ok) + ok = SetSymbolsField(info, keyi, field, arrayNdx, def->value); } + return ok; } -static Bool -SetExplicitGroup(SymbolsInfo * info, KeyInfo * key) +static bool +SetExplicitGroup(SymbolsInfo *info, KeyInfo *keyi) { - unsigned group = info->explicit_group; + xkb_group_index_t group = info->explicit_group; if (group == 0) - return True; + return true; - if ((key->typesDefined | key->symsDefined | key->actsDefined) & ~1) - { - int i; - WARN("For the map %s an explicit group specified\n", info->name); - WARN("but key %s has more than one group defined\n", - longText(key->name)); - ACTION("All groups except first one will be ignored\n"); - for (i = 1; i < XkbNumKbdGroups; i++) - { - key->numLevels[i] = 0; - if (key->syms[i] != NULL) - free(key->syms[i]); - key->syms[i] = (uint32_t *) NULL; - if (key->acts[i] != NULL) - free(key->acts[i]); - key->acts[i] = (union xkb_action *) NULL; - key->types[i] = (uint32_t) 0; - } - } - key->typesDefined = key->symsDefined = key->actsDefined = 1 << group; - - key->numLevels[group] = key->numLevels[0]; - key->numLevels[0] = 0; - key->syms[group] = key->syms[0]; - key->syms[0] = (uint32_t *) NULL; - key->acts[group] = key->acts[0]; - key->acts[0] = (union xkb_action *) NULL; - key->types[group] = key->types[0]; - key->types[0] = (uint32_t) 0; - return True; + if ((keyi->typesDefined | keyi->symsDefined | keyi->actsDefined) & ~1) { + xkb_group_index_t i; + log_warn(info->keymap->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, LongKeyNameText(keyi->name)); + for (i = 1; i < XkbNumKbdGroups; i++) { + keyi->numLevels[i] = 0; + darray_free(keyi->syms[i]); + darray_free(keyi->acts[i]); + keyi->types[i] = 0; + } + } + keyi->typesDefined = keyi->symsDefined = keyi->actsDefined = 1 << group; + + keyi->numLevels[group] = keyi->numLevels[0]; + keyi->numLevels[0] = 0; + keyi->syms[group] = keyi->syms[0]; + darray_init(keyi->syms[0]); + keyi->symsMapIndex[group] = keyi->symsMapIndex[0]; + darray_init(keyi->symsMapIndex[0]); + keyi->symsMapNumEntries[group] = keyi->symsMapNumEntries[0]; + darray_init(keyi->symsMapNumEntries[0]); + keyi->acts[group] = keyi->acts[0]; + darray_init(keyi->acts[0]); + keyi->types[group] = keyi->types[0]; + keyi->types[0] = 0; + return true; } static int -HandleSymbolsDef(SymbolsDef * stmt, - struct xkb_desc * xkb, unsigned merge, SymbolsInfo * info) +HandleSymbolsDef(SymbolsInfo *info, SymbolsDef *stmt) { - KeyInfo key; + KeyInfo keyi; - InitKeyInfo(&key); - CopyKeyInfo(&info->dflt, &key, False); - key.defs.merge = stmt->merge; - key.name = KeyNameToLong(stmt->keyName); - if (!HandleSymbolsBody((VarDef *) stmt->symbols, xkb, &key, info)) - { + InitKeyInfo(&keyi, info->file_id); + CopyKeyInfo(&info->dflt, &keyi, false); + keyi.merge = stmt->merge; + keyi.name = KeyNameToLong(stmt->keyName); + if (!HandleSymbolsBody(info, (VarDef *) stmt->symbols, &keyi)) { info->errorCount++; - return False; + return false; } - if (!SetExplicitGroup(info, &key)) - { + if (!SetExplicitGroup(info, &keyi)) { info->errorCount++; - return False; + return false; } - if (!AddKeySymbols(info, &key, xkb)) - { + if (!AddKeySymbols(info, &keyi)) { info->errorCount++; - return False; + return false; } - return True; + return true; } -static Bool -HandleModMapDef(ModMapDef * def, - struct xkb_desc * xkb, unsigned merge, SymbolsInfo * info) +static bool +HandleModMapDef(SymbolsInfo *info, ModMapDef *def) { ExprDef *key; ModMapEntry tmp; - ExprResult rtrn; - Bool ok; + xkb_mod_index_t ndx; + bool ok; + struct xkb_context *ctx = info->keymap->ctx; + + if (!LookupModIndex(ctx, NULL, def->modifier, EXPR_TYPE_INT, &ndx)) { + log_err(info->keymap->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; + + for (key = def->keys; key != NULL; key = (ExprDef *) key->common.next) { + xkb_keysym_t sym; - if (!LookupModIndex(NULL, None, def->modifier, TypeInt, &rtrn)) - { - ERROR("Illegal modifier map definition\n"); - ACTION("Ignoring map for non-modifier \"%s\"\n", - XkbcAtomText(def->modifier)); - return False; - } - ok = True; - tmp.modifier = rtrn.uval; - for (key = def->keys; key != NULL; key = (ExprDef *) key->common.next) - { - if ((key->op == ExprValue) && (key->type == TypeKeyName)) - { - tmp.haveSymbol = False; + if (key->op == EXPR_VALUE && key->value_type == EXPR_TYPE_KEYNAME) { + tmp.haveSymbol = false; tmp.u.keyName = KeyNameToLong(key->value.keyName); } - else if (ExprResolveKeySym(key, &rtrn, NULL, NULL)) - { - tmp.haveSymbol = True; - tmp.u.keySym = rtrn.uval; + else if (ExprResolveKeySym(ctx, key, &sym)) { + tmp.haveSymbol = true; + tmp.u.keySym = sym; } - else - { - ERROR("Modmap entries may contain only key names or keysyms\n"); - ACTION("Illegal definition for %s modifier ignored\n", - XkbcModIndexText(tmp.modifier)); + else { + log_err(info->keymap->ctx, + "Modmap entries may contain only key names or keysyms; " + "Illegal definition for %s modifier ignored\n", + ModIndexText(tmp.modifier)); continue; } @@ -1658,119 +1379,121 @@ } static void -HandleSymbolsFile(XkbFile * file, - struct xkb_desc * xkb, unsigned merge, SymbolsInfo * info) +HandleSymbolsFile(SymbolsInfo *info, XkbFile *file, enum merge_mode merge) { + bool ok; ParseCommon *stmt; - info->name = _XkbDupString(file->name); + free(info->name); + info->name = strdup_safe(file->name); + stmt = file->defs; - while (stmt) - { - switch (stmt->stmtType) - { - case StmtInclude: - if (!HandleIncludeSymbols((IncludeStmt *) stmt, xkb, info, - HandleSymbolsFile)) - info->errorCount++; + for (stmt = file->defs; stmt; stmt = stmt->next) { + switch (stmt->type) { + case STMT_INCLUDE: + ok = HandleIncludeSymbols(info, (IncludeStmt *) stmt); break; - case StmtSymbolsDef: - if (!HandleSymbolsDef((SymbolsDef *) stmt, xkb, merge, info)) - info->errorCount++; + case STMT_SYMBOLS: + ok = HandleSymbolsDef(info, (SymbolsDef *) stmt); break; - case StmtVarDef: - if (!HandleSymbolsVar((VarDef *) stmt, xkb, info)) - info->errorCount++; + case STMT_VAR: + ok = HandleSymbolsVar(info, (VarDef *) stmt); break; - case StmtVModDef: - if (!HandleVModDef((VModDef *) stmt, merge, &info->vmods)) - info->errorCount++; + case STMT_VMOD: + ok = HandleVModDef((VModDef *) stmt, info->keymap, merge, + &info->vmods); break; - case StmtInterpDef: - ERROR("Interpretation files may not include other types\n"); - ACTION("Ignoring definition of symbol interpretation\n"); - info->errorCount++; - break; - case StmtKeycodeDef: - ERROR("Interpretation files may not include other types\n"); - ACTION("Ignoring definition of key name\n"); - info->errorCount++; - break; - case StmtModMapDef: - if (!HandleModMapDef((ModMapDef *) stmt, xkb, merge, info)) - info->errorCount++; + case STMT_MODMAP: + ok = HandleModMapDef(info, (ModMapDef *) stmt); break; default: - WSGO("Unexpected statement type %d in HandleSymbolsFile\n", - stmt->stmtType); + log_err(info->keymap->ctx, + "Interpretation files may not include other types; " + "Ignoring %s\n", StmtTypeToString(stmt->type)); + ok = false; break; } - stmt = stmt->next; - if (info->errorCount > 10) - { -#ifdef NOISY - ERROR("Too many errors\n"); -#endif - ACTION("Abandoning symbols file \"%s\"\n", file->topName); + + if (!ok) + info->errorCount++; + + if (info->errorCount > 10) { + log_err(info->keymap->ctx, "Abandoning symbols file \"%s\"\n", + file->topName); break; } } - return; } -static Bool -FindKeyForSymbol(struct xkb_desc * xkb, uint32_t sym, unsigned int *kc_rtrn) +/** + * 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) { - register int i, j; - register Bool gotOne; + struct xkb_key *key, *ret = NULL; + xkb_group_index_t group, min_group = UINT32_MAX; + xkb_level_index_t level, min_level = UINT16_MAX; + + xkb_foreach_key(key, keymap) { + for (group = 0; group < key->num_groups; group++) { + for (level = 0; level < XkbKeyGroupWidth(keymap, key, group); + level++) { + if (XkbKeyNumSyms(key, group, level) != 1 || + (XkbKeySymEntry(key, group, level))[0] != sym) + continue; - j = 0; - do - { - gotOne = False; - for (i = xkb->min_key_code; i <= (int) xkb->max_key_code; i++) - { - if (j < (int) XkbKeyNumSyms(xkb, i)) - { - gotOne = True; - if ((XkbKeySym(xkb, i, j) == sym)) - { - *kc_rtrn = i; - return True; + /* + * If the keysym was found in a group or level > 0, we must + * keep looking since we might find a key in which the keysym + * is in a lower group or level. + */ + if (group < min_group || + (group == min_group && level < min_level)) { + ret = key; + if (group == 0 && level == 0) { + return ret; + } + else { + min_group = group; + min_level = level; + } } } } - j++; } - while (gotOne); - return False; + + return ret; } /** - * Find the given name in the xkb->map->types and return its index. + * Find the given name in the keymap->map->types and return its index. * - * @param name The atom to search for. + * @param name The name to search for. * @param type_rtrn Set to the index of the name if found. * - * @return True if found, False otherwise. + * @return true if found, false otherwise. */ -static Bool -FindNamedType(struct xkb_desc * xkb, uint32_t name, unsigned *type_rtrn) +static bool +FindNamedType(struct xkb_keymap *keymap, xkb_atom_t name, unsigned *type_rtrn) { - register unsigned n; + unsigned int i; - if (xkb && xkb->map && xkb->map->types) - { - for (n = 0; n < xkb->map->num_types; n++) - { - if (xkb->map->types[n].name == (uint32_t) name) - { - *type_rtrn = n; - return True; - } + for (i = 0; i < keymap->num_types; i++) { + if (keymap->types[i].name == name) { + *type_rtrn = i; + return true; } } - return False; + + return false; } /** @@ -1787,48 +1510,52 @@ * @param syms The keysyms for the given key (must be size width). * @param typeNameRtrn Set to the Atom of the type name. * - * @returns True if a type could be found, False otherwise. + * @returns true if a type could be found, false otherwise. + * + * FIXME: I need to take the KeyInfo so I can look at symsMapIndex and + * all that fun stuff rather than just assuming there's always one + * symbol per level. */ -static Bool -FindAutomaticType(int width, uint32_t * syms, uint32_t * typeNameRtrn, - Bool * autoType) -{ - *autoType = False; - if ((width == 1) || (width == 0)) - { - *typeNameRtrn = xkb_intern_atom("ONE_LEVEL"); - *autoType = True; - } - else if (width == 2) - { - if (syms && XkbcKSIsLower(syms[0]) && XkbcKSIsUpper(syms[1])) - { - *typeNameRtrn = xkb_intern_atom("ALPHABETIC"); - } - else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1]))) - { - *typeNameRtrn = xkb_intern_atom("KEYPAD"); - *autoType = True; +static bool +FindAutomaticType(struct xkb_keymap *keymap, xkb_level_index_t width, + const xkb_keysym_t *syms, xkb_atom_t *typeNameRtrn, + bool *autoType) +{ + *autoType = false; + if ((width == 1) || (width == 0)) { + *typeNameRtrn = xkb_atom_intern(keymap->ctx, "ONE_LEVEL"); + *autoType = true; + } + else if (width == 2) { + if (syms && xkb_keysym_is_lower(syms[0]) && + xkb_keysym_is_upper(syms[1])) { + *typeNameRtrn = xkb_atom_intern(keymap->ctx, "ALPHABETIC"); + } + else if (syms && (xkb_keysym_is_keypad(syms[0]) || + xkb_keysym_is_keypad(syms[1]))) { + *typeNameRtrn = xkb_atom_intern(keymap->ctx, "KEYPAD"); + *autoType = true; } - else - { - *typeNameRtrn = xkb_intern_atom("TWO_LEVEL"); - *autoType = True; + else { + *typeNameRtrn = xkb_atom_intern(keymap->ctx, "TWO_LEVEL"); + *autoType = true; } } - else if (width <= 4) - { - if (syms && XkbcKSIsLower(syms[0]) && XkbcKSIsUpper(syms[1])) - if (XkbcKSIsLower(syms[2]) && XkbcKSIsUpper(syms[3])) + else if (width <= 4) { + if (syms && xkb_keysym_is_lower(syms[0]) && + xkb_keysym_is_upper(syms[1])) + if (xkb_keysym_is_lower(syms[2]) && xkb_keysym_is_upper(syms[3])) *typeNameRtrn = - xkb_intern_atom("FOUR_LEVEL_ALPHABETIC"); + xkb_atom_intern(keymap->ctx, "FOUR_LEVEL_ALPHABETIC"); else - *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL_SEMIALPHABETIC"); + *typeNameRtrn = xkb_atom_intern(keymap->ctx, + "FOUR_LEVEL_SEMIALPHABETIC"); - else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1]))) - *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL_KEYPAD"); + else if (syms && (xkb_keysym_is_keypad(syms[0]) || + xkb_keysym_is_keypad(syms[1]))) + *typeNameRtrn = xkb_atom_intern(keymap->ctx, "FOUR_LEVEL_KEYPAD"); else - *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL"); + *typeNameRtrn = xkb_atom_intern(keymap->ctx, "FOUR_LEVEL"); /* XXX: why not set autoType here? */ } return ((width >= 0) && (width <= 4)); @@ -1839,15 +1566,16 @@ * groups, and reduce to one group if all groups are identical anyway. */ static void -PrepareKeyDef(KeyInfo * key) +PrepareKeyDef(KeyInfo *keyi) { - int i, j, width, defined, lastGroup; - Bool identical; + xkb_group_index_t i, lastGroup; + unsigned int defined; + xkb_level_index_t j, width; + bool identical; - defined = key->symsDefined | key->actsDefined | key->typesDefined; + defined = keyi->symsDefined | keyi->actsDefined | keyi->typesDefined; /* get highest group number */ - for (i = XkbNumKbdGroups - 1; i >= 0; i--) - { + for (i = XkbNumKbdGroups - 1; i > 0; i--) { if (defined & (1 << i)) break; } @@ -1859,88 +1587,90 @@ /* 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. */ - for (i = lastGroup; i > 0; i--) - { + for (i = lastGroup; i > 0; i--) { if (defined & (1 << i)) continue; - width = key->numLevels[0]; - if (key->typesDefined & 1) - { - for (j = 0; j < width; j++) - { - key->types[i] = key->types[0]; - } - key->typesDefined |= 1 << i; + width = keyi->numLevels[0]; + if (keyi->typesDefined & 1) { + for (j = 0; j < width; j++) { + keyi->types[i] = keyi->types[0]; + } + keyi->typesDefined |= 1 << i; + } + if ((keyi->actsDefined & 1) && !darray_empty(keyi->acts[0])) { + darray_copy(keyi->acts[i], keyi->acts[0]); + keyi->actsDefined |= 1 << i; + } + if ((keyi->symsDefined & 1) && !darray_empty(keyi->syms[0])) { + darray_copy(keyi->syms[i], keyi->syms[0]); + darray_copy(keyi->symsMapIndex[i], keyi->symsMapIndex[0]); + darray_copy(keyi->symsMapNumEntries[i], + keyi->symsMapNumEntries[0]); + keyi->symsDefined |= 1 << i; } - if ((key->actsDefined & 1) && key->acts[0]) - { - key->acts[i] = uTypedCalloc(width, union xkb_action); - if (key->acts[i] == NULL) - continue; - memcpy((void *) key->acts[i], (void *) key->acts[0], - width * sizeof(union xkb_action)); - key->actsDefined |= 1 << i; - } - if ((key->symsDefined & 1) && key->syms[0]) - { - key->syms[i] = uTypedCalloc(width, uint32_t); - if (key->syms[i] == NULL) - continue; - memcpy((void *) key->syms[i], (void *) key->syms[0], - width * sizeof(uint32_t)); - key->symsDefined |= 1 << i; - } - if (defined & 1) - { - key->numLevels[i] = key->numLevels[0]; + if (defined & 1) { + keyi->numLevels[i] = keyi->numLevels[0]; } } /* If all groups are completely identical remove them all */ /* exept the first one. */ - identical = True; - for (i = lastGroup; i > 0; i--) - { - if ((key->numLevels[i] != key->numLevels[0]) || - (key->types[i] != key->types[0])) - { - identical = False; + identical = true; + for (i = lastGroup; i > 0; i--) { + if ((keyi->numLevels[i] != keyi->numLevels[0]) || + (keyi->types[i] != keyi->types[0])) { + identical = false; break; } - if ((key->syms[i] != key->syms[0]) && - (key->syms[i] == NULL || key->syms[0] == NULL || - memcmp((void *) key->syms[i], (void *) key->syms[0], - sizeof(uint32_t) * key->numLevels[0]))) - { - identical = False; + if (!darray_same(keyi->syms[i], keyi->syms[0]) && + (darray_empty(keyi->syms[i]) || darray_empty(keyi->syms[0]) || + darray_size(keyi->syms[i]) != darray_size(keyi->syms[0]) || + memcmp(darray_mem(keyi->syms[i], 0), + darray_mem(keyi->syms[0], 0), + sizeof(xkb_keysym_t) * darray_size(keyi->syms[0])))) { + identical = false; break; } - if ((key->acts[i] != key->acts[0]) && - (key->acts[i] == NULL || key->acts[0] == NULL || - memcmp((void *) key->acts[i], (void *) key->acts[0], - sizeof(union xkb_action) * key->numLevels[0]))) - { - identical = False; + if (!darray_same(keyi->symsMapIndex[i], keyi->symsMapIndex[0]) && + (darray_empty(keyi->symsMapIndex[i]) || + darray_empty(keyi->symsMapIndex[0]) || + memcmp(darray_mem(keyi->symsMapIndex[i], 0), + darray_mem(keyi->symsMapIndex[0], 0), + keyi->numLevels[0] * sizeof(int)))) { + identical = false; + continue; + } + if (!darray_same(keyi->symsMapNumEntries[i], + keyi->symsMapNumEntries[0]) && + (darray_empty(keyi->symsMapNumEntries[i]) || + darray_empty(keyi->symsMapNumEntries[0]) || + memcmp(darray_mem(keyi->symsMapNumEntries[i], 0), + darray_mem(keyi->symsMapNumEntries[0], 0), + keyi->numLevels[0] * sizeof(size_t)))) { + identical = false; + continue; + } + if (!darray_same(keyi->acts[i], keyi->acts[0]) && + (darray_empty(keyi->acts[i]) || darray_empty(keyi->acts[0]) || + memcmp(darray_mem(keyi->acts[i], 0), + darray_mem(keyi->acts[0], 0), + keyi->numLevels[0] * sizeof(union xkb_action)))) { + identical = false; break; } } - if (identical) - { - for (i = lastGroup; i > 0; i--) - { - key->numLevels[i] = 0; - if (key->syms[i] != NULL) - free(key->syms[i]); - key->syms[i] = (uint32_t *) NULL; - if (key->acts[i] != NULL) - free(key->acts[i]); - key->acts[i] = (union xkb_action *) NULL; - key->types[i] = (uint32_t) 0; - } - key->symsDefined &= 1; - key->actsDefined &= 1; - key->typesDefined &= 1; + if (identical) { + for (i = lastGroup; i > 0; i--) { + keyi->numLevels[i] = 0; + darray_free(keyi->syms[i]); + darray_free(keyi->symsMapIndex[i]); + darray_free(keyi->symsMapNumEntries[i]); + darray_free(keyi->acts[i]); + keyi->types[i] = 0; + } + keyi->symsDefined &= 1; + keyi->actsDefined &= 1; + keyi->typesDefined &= 1; } - return; } /** @@ -1948,134 +1678,115 @@ * * This function recurses. */ -static Bool -CopySymbolsDef(struct xkb_desc * xkb, KeyInfo *key, int start_from) -{ - register int i; - unsigned okc, kc, width, tmp, nGroups; +static bool +CopySymbolsDef(SymbolsInfo *info, KeyInfo *keyi, + xkb_keycode_t start_from) +{ + struct xkb_keymap *keymap = info->keymap; + xkb_keycode_t kc; + struct xkb_key *key; + size_t sizeSyms = 0; + xkb_group_index_t i, nGroups; + xkb_level_index_t width, tmp; struct xkb_key_type * type; - Bool haveActions, autoType, useAlias; - uint32_t *outSyms; - union xkb_action *outActs; + bool haveActions, autoType, useAlias; unsigned types[XkbNumKbdGroups]; + unsigned int symIndex = 0; useAlias = (start_from == 0); - /* get the keycode for the key. */ - if (!FindNamedKey(xkb, key->name, &kc, useAlias, CreateKeyNames(xkb), - start_from)) - { - if ((start_from == 0) && (warningLevel >= 5)) - { - WARN("Key %s not found in %s keycodes\n", - longText(key->name), - XkbcAtomText(xkb->names->keycodes)); - ACTION("Symbols ignored\n"); - } - return False; - } - - haveActions = False; - for (i = width = nGroups = 0; i < XkbNumKbdGroups; i++) - { + key = FindNamedKey(keymap, keyi->name, useAlias, start_from); + if (!key) { + if (start_from == 0) + log_lvl(info->keymap->ctx, 5, + "Key %s not found in keycodes; Symbols ignored\n", + LongKeyNameText(keyi->name)); + return false; + } + kc = XkbKeyGetKeycode(keymap, key); + + haveActions = false; + width = 0; + for (i = nGroups = 0; i < XkbNumKbdGroups; i++) { if (((i + 1) > nGroups) - && (((key->symsDefined | key->actsDefined) & (1 << i)) - || (key->typesDefined) & (1 << i))) + && (((keyi->symsDefined | keyi->actsDefined) & (1 << i)) + || (keyi->typesDefined) & (1 << i))) nGroups = i + 1; - if (key->acts[i]) - haveActions = True; - autoType = False; + if (!darray_empty(keyi->acts[i])) + haveActions = true; + autoType = false; /* Assign the type to the key, if it is missing. */ - if (key->types[i] == None) - { - if (key->dfltType != None) - key->types[i] = key->dfltType; - else if (FindAutomaticType(key->numLevels[i], key->syms[i], - &key->types[i], &autoType)) - { - } + if (keyi->types[i] == XKB_ATOM_NONE) { + if (keyi->dfltType != XKB_ATOM_NONE) + keyi->types[i] = keyi->dfltType; + else if (FindAutomaticType(keymap, keyi->numLevels[i], + darray_mem(keyi->syms[i], 0), + &keyi->types[i], &autoType)) { } else - { - if (warningLevel >= 5) - { - WARN("No automatic type for %d symbols\n", - (unsigned int) key->numLevels[i]); - ACTION("Using %s for the %s key (keycode %d)\n", - XkbcAtomText(key->types[i]), - longText(key->name), kc); - } - } - } - if (FindNamedType(xkb, key->types[i], &types[i])) - { - if (!autoType || key->numLevels[i] > 2) - xkb->server->explicit[kc] |= (1 << i); - } - else - { - if (warningLevel >= 3) - { - WARN("Type \"%s\" is not defined\n", - XkbcAtomText(key->types[i])); - ACTION("Using TWO_LEVEL for the %s key (keycode %d)\n", - longText(key->name), kc); - } - types[i] = XkbTwoLevelIndex; + log_lvl(info->keymap->ctx, 5, + "No automatic type for %d symbols; " + "Using %s for the %s key (keycode %d)\n", + keyi->numLevels[i], + xkb_atom_text(keymap->ctx, keyi->types[i]), + LongKeyNameText(keyi->name), kc); + } + if (FindNamedType(keymap, keyi->types[i], &types[i])) { + if (!autoType || keyi->numLevels[i] > 2) + key->explicit |= (1 << i); } - /* if the type specifies less syms than the key has, shrink the key */ - type = &xkb->map->types[types[i]]; - if (type->num_levels < key->numLevels[i]) - { - if (warningLevel > 0) - { - WARN - ("Type \"%s\" has %d levels, but %s has %d symbols\n", - XkbcAtomText(type->name), - (unsigned int) type->num_levels, - longText(key->name), - (unsigned int) key->numLevels[i]); - ACTION("Ignoring extra symbols\n"); - } - key->numLevels[i] = type->num_levels; + else { + log_lvl(info->keymap->ctx, 3, + "Type \"%s\" is not defined; " + "Using default type for the %s key (keycode %d)\n", + xkb_atom_text(keymap->ctx, keyi->types[i]), + LongKeyNameText(keyi->name), kc); + /* + * Index 0 is guaranteed to contain something, usually + * ONE_LEVEL or at least some default one-level type. + */ + types[i] = 0; + } + + /* if the type specifies fewer levels than the key has, shrink the key */ + type = &keymap->types[types[i]]; + if (type->num_levels < keyi->numLevels[i]) { + log_lvl(info->keymap->ctx, 1, + "Type \"%s\" has %d levels, but %s has %d symbols; " + "Ignoring extra symbols\n", + xkb_atom_text(keymap->ctx, type->name), + type->num_levels, + LongKeyNameText(keyi->name), + keyi->numLevels[i]); + keyi->numLevels[i] = type->num_levels; } - if (key->numLevels[i] > width) - width = key->numLevels[i]; + if (keyi->numLevels[i] > width) + width = keyi->numLevels[i]; if (type->num_levels > width) width = type->num_levels; + sizeSyms += darray_size(keyi->syms[i]); } - /* width is now the largest width found */ + darray_resize0(key->syms, sizeSyms); - i = width * nGroups; - outSyms = XkbcResizeKeySyms(xkb, kc, i); - if (outSyms == NULL) - { - WSGO("Could not enlarge symbols for %s (keycode %d)\n", - longText(key->name), kc); - return False; - } - if (haveActions) - { - outActs = XkbcResizeKeyActions(xkb, kc, i); - if (outActs == NULL) - { - WSGO("Could not enlarge actions for %s (key %d)\n", - longText(key->name), kc); - return False; - } - xkb->server->explicit[kc] |= XkbExplicitInterpretMask; + key->num_groups = nGroups; + + key->width = width; + + key->sym_index = calloc(nGroups * width, sizeof(*key->sym_index)); + + key->num_syms = calloc(nGroups * width, sizeof(*key->num_syms)); + + if (haveActions) { + key->actions = calloc(nGroups * width, sizeof(*key->actions)); + key->explicit |= XkbExplicitInterpretMask; } - else - outActs = NULL; - if (key->defs.defined & _Key_GroupInfo) - i = key->groupInfo; - else - i = xkb->map->key_sym_map[kc].group_info; - xkb->map->key_sym_map[kc].group_info = XkbSetNumGroups(i, nGroups); - xkb->map->key_sym_map[kc].width = width; - for (i = 0; i < nGroups; i++) - { + if (keyi->defined & KEY_FIELD_GROUPINFO) { + key->out_of_range_group_number = keyi->out_of_range_group_number; + key->out_of_range_group_action = keyi->out_of_range_group_action; + } + + for (i = 0; i < nGroups; i++) { /* assign kt_index[i] to the index of the type in map->types. * kt_index[i] may have been set by a previous run (if we have two * layouts specified). Let's not overwrite it with the ONE_LEVEL @@ -2083,215 +1794,153 @@ * * FIXME: There should be a better fix for this. */ - if (key->numLevels[i]) - xkb->map->key_sym_map[kc].kt_index[i] = types[i]; - if (key->syms[i] != NULL) - { + if (keyi->numLevels[i]) + key->kt_index[i] = types[i]; + if (!darray_empty(keyi->syms[i])) { /* fill key to "width" symbols*/ - for (tmp = 0; tmp < width; tmp++) - { - if (tmp < key->numLevels[i]) - outSyms[tmp] = key->syms[i][tmp]; - else - outSyms[tmp] = NoSymbol; - if ((outActs != NULL) && (key->acts[i] != NULL)) - { - if (tmp < key->numLevels[i]) - outActs[tmp] = key->acts[i][tmp]; + for (tmp = 0; tmp < width; tmp++) { + if (tmp < keyi->numLevels[i] && + darray_item(keyi->symsMapNumEntries[i], tmp) != 0) { + memcpy(darray_mem(key->syms, symIndex), + darray_mem(keyi->syms[i], + darray_item(keyi->symsMapIndex[i], tmp)), + darray_item(keyi->symsMapNumEntries[i], + tmp) * sizeof(xkb_keysym_t)); + key->sym_index[(i * width) + tmp] = symIndex; + key->num_syms[(i * width) + tmp] = + darray_item(keyi->symsMapNumEntries[i], tmp); + symIndex += key->num_syms[(i * width) + tmp]; + } + else { + key->sym_index[(i * width) + tmp] = -1; + key->num_syms[(i * width) + tmp] = 0; + } + if (key->actions && !darray_empty(keyi->acts[i])) { + if (tmp < keyi->numLevels[i]) + key->actions[tmp] = darray_item(keyi->acts[i], tmp); else - outActs[tmp].type = XkbSA_NoAction; + key->actions[tmp].type = XkbSA_NoAction; } } } - outSyms += width; - if (outActs) - outActs += width; - } - switch (key->behavior.type & XkbKB_OpMask) - { - case XkbKB_Default: - break; - case XkbKB_Overlay1: - case XkbKB_Overlay2: - /* find key by name! */ - if (!FindNamedKey(xkb, key->nameForOverlayKey, &okc, True, - CreateKeyNames(xkb), 0)) - { - if (warningLevel >= 1) - { - WARN("Key %s not found in %s keycodes\n", - longText(key->nameForOverlayKey), - XkbcAtomText(xkb->names->keycodes)); - ACTION("Not treating %s as an overlay key \n", - longText(key->name)); - } - break; - } - key->behavior.data = okc; - default: - xkb->server->behaviors[kc] = key->behavior; - xkb->server->explicit[kc] |= XkbExplicitBehaviorMask; - break; - } - if (key->defs.defined & _Key_VModMap) - { - xkb->server->vmodmap[kc] = key->vmodmap; - xkb->server->explicit[kc] |= XkbExplicitVModMapMask; - } - if (key->repeat != RepeatUndefined) - { - if (key->repeat == RepeatYes) - xkb->ctrls->per_key_repeat[kc / 8] |= (1 << (kc % 8)); - else - xkb->ctrls->per_key_repeat[kc / 8] &= ~(1 << (kc % 8)); - xkb->server->explicit[kc] |= XkbExplicitAutoRepeatMask; } - if (nGroups > xkb->ctrls->num_groups) - xkb->ctrls->num_groups = nGroups; + if (keyi->defined & KEY_FIELD_VMODMAP) { + key->vmodmap = keyi->vmodmap; + key->explicit |= XkbExplicitVModMapMask; + } + + if (keyi->repeat != KEY_REPEAT_UNDEFINED) { + key->repeats = (keyi->repeat == KEY_REPEAT_YES); + key->explicit |= XkbExplicitAutoRepeatMask; + } /* do the same thing for the next key */ - CopySymbolsDef(xkb, key, kc + 1); - return True; + CopySymbolsDef(info, keyi, kc + 1); + return true; } -static Bool -CopyModMapDef(struct xkb_desc * xkb, ModMapEntry *entry) +static bool +CopyModMapDef(SymbolsInfo *info, ModMapEntry *entry) { - unsigned kc; - - if ((!entry->haveSymbol) - && - (!FindNamedKey - (xkb, entry->u.keyName, &kc, True, CreateKeyNames(xkb), 0))) - { - if (warningLevel >= 5) - { - WARN("Key %s not found in %s keycodes\n", - longText(entry->u.keyName), - XkbcAtomText(xkb->names->keycodes)); - ACTION("Modifier map entry for %s not updated\n", - XkbcModIndexText(entry->modifier)); - } - return False; - } - else if (entry->haveSymbol - && (!FindKeyForSymbol(xkb, entry->u.keySym, &kc))) - { - if (warningLevel > 5) - { - WARN("Key \"%s\" not found in %s symbol map\n", - XkbcKeysymText(entry->u.keySym), - XkbcAtomText(xkb->names->symbols)); - ACTION("Modifier map entry for %s not updated\n", - XkbcModIndexText(entry->modifier)); + struct xkb_key *key; + struct xkb_keymap *keymap = info->keymap; + + if (!entry->haveSymbol) { + key = FindNamedKey(keymap, entry->u.keyName, true, 0); + if (!key) { + log_lvl(info->keymap->ctx, 5, + "Key %s not found in keycodes; " + "Modifier map entry for %s not updated\n", + LongKeyNameText(entry->u.keyName), + ModIndexText(entry->modifier)); + return false; + } + } + else { + key = FindKeyForSymbol(keymap, entry->u.keySym); + if (!key) { + log_lvl(info->keymap->ctx, 5, + "Key \"%s\" not found in symbol map; " + "Modifier map entry for %s not updated\n", + KeysymText(entry->u.keySym), + ModIndexText(entry->modifier)); + return false; } - return False; } - xkb->map->modmap[kc] |= (1 << entry->modifier); - return True; + + key->modmap |= (1 << entry->modifier); + return true; } /** * Handle the xkb_symbols section of an xkb file. * * @param file The parsed xkb_symbols section of the xkb file. - * @param xkb Handle to the keyboard description to store the symbols in. - * @param merge Merge strategy (e.g. MergeOverride). + * @param keymap Handle to the keyboard description to store the symbols in. + * @param merge Merge strategy (e.g. MERGE_OVERRIDE). */ -Bool -CompileSymbols(XkbFile *file, struct xkb_desc * xkb, unsigned merge) +bool +CompileSymbols(XkbFile *file, struct xkb_keymap *keymap, + enum merge_mode merge) { - register int i; + xkb_group_index_t i; + struct xkb_key *key; SymbolsInfo info; + KeyInfo *keyi; + ModMapEntry *mm; - InitSymbolsInfo(&info, xkb); - info.dflt.defs.fileID = file->id; - info.dflt.defs.merge = merge; - HandleSymbolsFile(file, xkb, merge, &info); - - if (info.nKeys == 0) - return True; - if (info.errorCount == 0) - { - KeyInfo *key; - - /* alloc memory in the xkb struct */ - if (XkbcAllocNames(xkb, XkbSymbolsNameMask | XkbGroupNamesMask, 0, 0) - != Success) - { - WSGO("Can not allocate names in CompileSymbols\n"); - ACTION("Symbols not added\n"); - return False; - } - if (XkbcAllocClientMap(xkb, XkbKeySymsMask | XkbModifierMapMask, 0) - != Success) - { - WSGO("Could not allocate client map in CompileSymbols\n"); - ACTION("Symbols not added\n"); - return False; - } - if (XkbcAllocServerMap(xkb, XkbAllServerInfoMask, 32) != Success) - { - WSGO("Could not allocate server map in CompileSymbols\n"); - ACTION("Symbols not added\n"); - return False; - } - if (XkbcAllocControls(xkb, XkbPerKeyRepeatMask) != Success) - { - WSGO("Could not allocate controls in CompileSymbols\n"); - ACTION("Symbols not added\n"); - return False; - } - - /* now copy info into xkb. */ - xkb->names->symbols = xkb_intern_atom(info.name); - if (info.aliases) - ApplyAliases(xkb, False, &info.aliases); - for (i = 0; i < XkbNumKbdGroups; i++) - { - if (info.groupNames[i] != None) - xkb->names->groups[i] = info.groupNames[i]; - } - /* sanitize keys */ - for (key = info.keys, i = 0; i < info.nKeys; i++, key++) - { - PrepareKeyDef(key); - } - /* copy! */ - for (key = info.keys, i = 0; i < info.nKeys; i++, key++) - { - if (!CopySymbolsDef(xkb, key, 0)) - info.errorCount++; - } - if (warningLevel > 3) - { - for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) - { - if (xkb->names->keys[i].name[0] == '\0') - continue; - if (XkbKeyNumGroups(xkb, i) < 1) - { - char buf[5]; - memcpy(buf, xkb->names->keys[i].name, 4); - buf[4] = '\0'; - WARN - ("No symbols defined for <%s> (keycode %d)\n", - buf, i); - } - } + InitSymbolsInfo(&info, keymap, file->id); + info.dflt.merge = merge; + + HandleSymbolsFile(&info, file, merge); + + if (darray_empty(info.keys)) + goto err_info; + + if (info.errorCount != 0) + goto err_info; + + if (info.name) + keymap->symbols_section_name = strdup(info.name); + + for (i = 0; i < XkbNumKbdGroups; i++) { + if (info.groupNames[i] != XKB_ATOM_NONE) { + keymap->group_names[i] = xkb_atom_text(keymap->ctx, + info.groupNames[i]); } - if (info.modMap) - { - ModMapEntry *mm, *next; - for (mm = info.modMap; mm != NULL; mm = next) - { - if (!CopyModMapDef(xkb, mm)) - info.errorCount++; - next = (ModMapEntry *) mm->defs.next; - } + } + + /* sanitize keys */ + darray_foreach(keyi, info.keys) + PrepareKeyDef(keyi); + + /* copy! */ + darray_foreach(keyi, info.keys) + if (!CopySymbolsDef(&info, keyi, 0)) + info.errorCount++; + + if (xkb_get_log_verbosity(keymap->ctx) > 3) { + xkb_foreach_key(key, keymap) { + if (key->name[0] == '\0') + continue; + + if (key->num_groups < 1) + log_info(info.keymap->ctx, + "No symbols defined for %s (keycode %d)\n", + KeyNameText(key->name), + XkbKeyGetKeycode(keymap, key)); } - return True; } - return False; + + list_foreach(mm, &info.modMaps, entry) + if (!CopyModMapDef(&info, mm)) + info.errorCount++; + + FreeSymbolsInfo(&info); + return true; + +err_info: + FreeSymbolsInfo(&info); + return false; } diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/tokens.h libxkbcommon-0.1.0~2/src/xkbcomp/tokens.h --- libxkbcommon-0.1.0~1/src/xkbcomp/tokens.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/tokens.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ -#ifndef TOKENS_H -#define TOKENS_H 1 - -#include - -#define END_OF_FILE 0 -#define ERROR_TOK 255 - -#define XKB_KEYMAP 1 -#define XKB_KEYCODES 2 -#define XKB_TYPES 3 -#define XKB_SYMBOLS 4 -#define XKB_COMPATMAP 5 -#define XKB_GEOMETRY 6 -#define XKB_SEMANTICS 7 -#define XKB_LAYOUT 8 - -#define INCLUDE 10 -#define OVERRIDE 11 -#define AUGMENT 12 -#define REPLACE 13 -#define ALTERNATE 14 - -#define VIRTUAL_MODS 20 -#define TYPE 21 -#define INTERPRET 22 -#define ACTION_TOK 23 -#define KEY 24 -#define ALIAS 25 -#define GROUP 26 -#define MODIFIER_MAP 27 -#define INDICATOR 28 -#define SHAPE 29 -#define KEYS 30 -#define ROW 31 -#define SECTION 32 -#define OVERLAY 33 -#define TEXT 34 -#define OUTLINE 35 -#define SOLID 36 -#define LOGO 37 -#define VIRTUAL 38 - -#define EQUALS 40 -#define PLUS 41 -#define MINUS 42 -#define DIVIDE 43 -#define TIMES 44 -#define OBRACE 45 -#define CBRACE 46 -#define OPAREN 47 -#define CPAREN 48 -#define OBRACKET 49 -#define CBRACKET 50 -#define DOT 51 -#define COMMA 52 -#define SEMI 53 -#define EXCLAM 54 -#define INVERT 55 - -#define STRING 60 -#define INTEGER 61 -#define FLOAT 62 -#define IDENT 63 -#define KEYNAME 64 - -#define PARTIAL 70 -#define DEFAULT 71 -#define HIDDEN 72 -#define ALPHANUMERIC_KEYS 73 -#define MODIFIER_KEYS 74 -#define KEYPAD_KEYS 75 -#define FUNCTION_KEYS 76 -#define ALTERNATE_GROUP 77 - -extern uint32_t tok_ONE_LEVEL; -extern uint32_t tok_TWO_LEVEL; -extern uint32_t tok_KEYPAD; - -#endif diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/utils.c libxkbcommon-0.1.0~2/src/xkbcomp/utils.c --- libxkbcommon-0.1.0~1/src/xkbcomp/utils.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/utils.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,252 +0,0 @@ - - /*\ - * - * COPYRIGHT 1990 - * DIGITAL EQUIPMENT CORPORATION - * MAYNARD, MASSACHUSETTS - * ALL RIGHTS RESERVED. - * - * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND - * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. - * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE - * FOR ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED - * WARRANTY. - * - * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT - * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN - * ADDITION TO THAT SET FORTH ABOVE. - * - * 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 Equipment Corporation not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - \*/ - -#include "utils.h" -#include -#include -#include - -void * -recalloc(void * old, unsigned nOld, unsigned nNew, unsigned itemSize) -{ - char *rtrn; - - if (old == NULL) - rtrn = (char *) calloc(nNew, itemSize); - else - { - rtrn = (char *) realloc((char *) old, nNew * itemSize); - if ((rtrn) && (nNew > nOld)) - { - bzero(&rtrn[nOld * itemSize], (nNew - nOld) * itemSize); - } - } - return (void *) rtrn; -} - -static FILE *errorFile = NULL; -static int outCount = 0; -static char *preMsg = NULL; -static char *prefix = NULL; - -Boolean -uSetErrorFile(char *name) -{ - if ((errorFile != NULL) && (errorFile != stderr)) - { - fprintf(errorFile, "switching to %s\n", name ? name : "stderr"); - fclose(errorFile); - } - if (name != NullString) - errorFile = fopen(name, "w"); - else - errorFile = stderr; - if (errorFile == NULL) - { - errorFile = stderr; - return (False); - } - return (True); -} - -void -uInformation(const char *s, ...) -{ - va_list args; - - if (!errorFile) - return; - - va_start(args, s); - vfprintf(errorFile, s, args); - va_end(args); - fflush(errorFile); -} - -/***====================================================================***/ - -void -uAction(const char *s, ...) -{ - va_list args; - - if (!errorFile) - return; - - if (prefix != NULL) - fprintf(errorFile, "%s", prefix); - fprintf(errorFile, " "); - va_start(args, s); - vfprintf(errorFile, s, args); - va_end(args); - fflush(errorFile); -} - -/***====================================================================***/ - -void -uWarning(const char *s, ...) -{ - va_list args; - - if (!errorFile) - return; - - if ((outCount == 0) && (preMsg != NULL)) - fprintf(errorFile, "%s\n", preMsg); - if (prefix != NULL) - fprintf(errorFile, "%s", prefix); - fprintf(errorFile, "Warning: "); - va_start(args, s); - vfprintf(errorFile, s, args); - va_end(args); - fflush(errorFile); - outCount++; -} - -/***====================================================================***/ - -void -uError(const char *s, ...) -{ - va_list args; - - if (!errorFile) - return; - - if ((outCount == 0) && (preMsg != NULL)) - fprintf(errorFile, "%s\n", preMsg); - if (prefix != NULL) - fprintf(errorFile, "%s", prefix); - fprintf(errorFile, "Error: "); - va_start(args, s); - vfprintf(errorFile, s, args); - va_end(args); - fflush(errorFile); - outCount++; -} - -/***====================================================================***/ - -void -uFatalError(const char *s, ...) -{ - va_list args; - - if (!errorFile) - return; - - if ((outCount == 0) && (preMsg != NULL)) - fprintf(errorFile, "%s\n", preMsg); - if (prefix != NULL) - fprintf(errorFile, "%s", prefix); - fprintf(errorFile, "Fatal Error: "); - va_start(args, s); - vfprintf(errorFile, s, args); - va_end(args); - fprintf(errorFile, " Exiting\n"); - fflush(errorFile); - outCount++; - exit(1); - /* NOTREACHED */ -} - -/***====================================================================***/ - -void -uInternalError(const char *s, ...) -{ - va_list args; - - if (!errorFile) - return; - - if ((outCount == 0) && (preMsg != NULL)) - fprintf(errorFile, "%s\n", preMsg); - if (prefix != NULL) - fprintf(errorFile, "%s", prefix); - fprintf(errorFile, "Internal error: "); - va_start(args, s); - vfprintf(errorFile, s, args); - va_end(args); - fflush(errorFile); - outCount++; -} - -/***====================================================================***/ - -#ifndef HAVE_STRCASECMP -int -uStrCaseCmp(const char *str1, const char *str2) -{ - char buf1[512], buf2[512]; - char c, *s; - register int n; - - for (n = 0, s = buf1; (c = *str1++); n++) - { - if (isupper(c)) - c = tolower(c); - if (n > 510) - break; - *s++ = c; - } - *s = '\0'; - for (n = 0, s = buf2; (c = *str2++); n++) - { - if (isupper(c)) - c = tolower(c); - if (n > 510) - break; - *s++ = c; - } - *s = '\0'; - return (strcmp(buf1, buf2)); -} - -int -uStrCasePrefix(const char *my_prefix, char *str) -{ - char c1; - char c2; - while (((c1 = *my_prefix) != '\0') && ((c2 = *str) != '\0')) - { - if (isupper(c1)) - c1 = tolower(c1); - if (isupper(c2)) - c2 = tolower(c2); - if (c1 != c2) - return 0; - my_prefix++; - str++; - } - if (c1 != '\0') - return 0; - return 1; -} - -#endif diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/utils.h libxkbcommon-0.1.0~2/src/xkbcomp/utils.h --- libxkbcommon-0.1.0~1/src/xkbcomp/utils.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/utils.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,163 +0,0 @@ -#ifndef UTILS_H -#define UTILS_H 1 - - /*\ - * - * COPYRIGHT 1990 - * DIGITAL EQUIPMENT CORPORATION - * MAYNARD, MASSACHUSETTS - * ALL RIGHTS RESERVED. - * - * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND - * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. - * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE - * FOR ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED - * WARRANTY. - * - * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT - * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN - * ADDITION TO THAT SET FORTH ABOVE. - * - * 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 Equipment Corporation not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - \*/ - -/***====================================================================***/ - -#include -#include -#include -#include - -#include -#include "config.h" - -#ifndef NUL -#define NUL '\0' -#endif - -/***====================================================================***/ - -#ifndef BOOLEAN_DEFINED -typedef char Boolean; -#endif - -#ifndef True -#define True ((Boolean)1) -#define False ((Boolean)0) -#endif /* ndef True */ -#define booleanText(b) ((b)?"True":"False") - -#ifndef COMPARISON_DEFINED -typedef int Comparison; - -#define Greater ((Comparison)1) -#define Equal ((Comparison)0) -#define Less ((Comparison)-1) -#define CannotCompare ((Comparison)-37) -#define comparisonText(c) ((c)?((c)<0?"Less":"Greater"):"Equal") -#endif - -/***====================================================================***/ - -extern void * -recalloc(void * old, unsigned nOld, unsigned nNew, unsigned newSize); - -#define uTypedAlloc(t) ((t *)malloc((unsigned)sizeof(t))) -#define uTypedCalloc(n,t) ((t *)calloc((unsigned)n,(unsigned)sizeof(t))) -#define uTypedRealloc(pO,n,t) ((t *)realloc((void *)pO,((unsigned)n)*sizeof(t))) -#define uTypedRecalloc(pO,o,n,t) ((t *)recalloc((void *)pO,((unsigned)o),((unsigned)n),sizeof(t))) -#if (defined mdHasAlloca) && (mdHasAlloca) -#define uTmpAlloc(n) ((void *)alloca((unsigned)n)) -#define uTmpFree(p) -#else -#define uTmpAlloc(n) malloc(n) -#define uTmpFree(p) free(p) -#endif - -/***====================================================================***/ - -extern Boolean -uSetErrorFile(char *name); - -#if defined(__GNUC__) && \ - ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) -#define __ATTR_PRINTF(i, f) __attribute__ ((format(printf, (i), (f)))) -#else -#define __ATTR_PRINTF(i, f) -#endif - -#define INFO uInformation - -extern __ATTR_PRINTF(1, 2) void -uInformation(const char *s, ...); - -#define ACTION uAction - -extern __ATTR_PRINTF(1, 2) void -uAction(const char *s, ...); - -#define WARN uWarning - -extern __ATTR_PRINTF(1, 2) void -uWarning(const char *s, ...); - -#define ERROR uError - -extern __ATTR_PRINTF(1, 2) void -uError(const char *s, ...); - -#define FATAL uFatalError - -extern __ATTR_PRINTF(1, 2) void -uFatalError(const char *s, ...); - -/* WSGO stands for "Weird Stuff Going On" (wtf???) */ -#define WSGO uInternalError - -extern __ATTR_PRINTF(1, 2) void -uInternalError(const char *s, ...); - -/***====================================================================***/ - -#define NullString ((char *)NULL) - -#define uStringText(s) ((s)==NullString?"":(s)) -#define uStringEqual(s1,s2) (uStringCompare(s1,s2)==Equal) -#define uStringPrefix(p,s) (strncmp(p,s,strlen(p))==0) -#define uStringCompare(s1,s2) (((s1)==NullString||(s2)==NullString)?\ - (s1)!=(s2):strcmp(s1,s2)) -#define uStrCaseEqual(s1,s2) (uStrCaseCmp(s1,s2)==0) -#ifdef HAVE_STRCASECMP -#define uStrCaseCmp(s1,s2) (strcasecmp(s1,s2)) -#define uStrCasePrefix(p,s) (strncasecmp(p,s,strlen(p))==0) -#else -extern int -uStrCaseCmp(const char *s1, const char *s2); -extern int -uStrCasePrefix(const char *p, char *str); -#endif - -/***====================================================================***/ - -#ifdef ASSERTIONS_ON -#define uASSERT(where,why) \ - {if (!(why)) uFatalError("assertion botched in %s ( why )\n",where);} -#else -#define uASSERT(where,why) -#endif - -/***====================================================================***/ - -#ifndef DEBUG_VAR -#define DEBUG_VAR debugFlags -#endif - -extern unsigned int DEBUG_VAR; - -#endif /* UTILS_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/vmod.c libxkbcommon-0.1.0~2/src/xkbcomp/vmod.c --- libxkbcommon-0.1.0~1/src/xkbcomp/vmod.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/vmod.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,71 +1,51 @@ /************************************************************ - 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 (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. + * ********************************************************/ -#define DEBUG_VAR debugFlags -#include -#include "xkbcomp.h" -#include "xkballoc.h" -#include "xkbmisc.h" -#include "tokens.h" -#include "expr.h" -#include "misc.h" - -#include - #include "vmod.h" void -InitVModInfo(VModInfo * info, struct xkb_desc * xkb) +InitVModInfo(VModInfo *info, struct xkb_keymap *keymap) { - ClearVModInfo(info, xkb); - info->errorCount = 0; - return; + ClearVModInfo(info, keymap); } void -ClearVModInfo(VModInfo * info, struct xkb_desc * xkb) +ClearVModInfo(VModInfo *info, struct xkb_keymap *keymap) { - register int i; + xkb_mod_index_t i; + xkb_mod_mask_t bit; - if (XkbcAllocNames(xkb, XkbVirtualModNamesMask, 0, 0) != Success) - return; - if (XkbcAllocServerMap(xkb, XkbVirtualModsMask, 0) != Success) - return; - info->xkb = xkb; - info->newlyDefined = info->defined = info->available = 0; - if (xkb && xkb->names) - { - register int bit; - for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) - { - if (xkb->names->vmods[i] != None) - info->defined |= bit; - } - } - return; + info->defined = info->available = 0; + + for (i = 0; i < XkbNumVirtualMods; i++) + keymap->vmods[i] = XkbNoModifierMask; + + for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) + if (keymap->vmod_names[i]) + info->defined |= bit; } /***====================================================================***/ @@ -76,181 +56,185 @@ * XkbServerMap's vmod is set to the given modifier. Otherwise, the vmod is 0. * * @param stmt The statement specifying the name and (if any the value). - * @param mergeMode Merge strategy (e.g. MergeOverride) + * @param mergeMode Merge strategy (e.g. MERGE_OVERRIDE) */ -Bool -HandleVModDef(VModDef * stmt, unsigned mergeMode, VModInfo * info) -{ - register int i, bit, nextFree; - ExprResult mod; - struct xkb_server_map * srv; - struct xkb_names * names; - - srv = info->xkb->server; - names = info->xkb->names; - for (i = 0, bit = 1, nextFree = -1; i < XkbNumVirtualMods; i++, bit <<= 1) - { - if (info->defined & bit) - { - if (names->vmods[i] == stmt->name) - { /* already defined */ - info->available |= bit; - if (stmt->value == NULL) - return True; - else - { - const char *str1; - const char *str2 = ""; - if (!ExprResolveModMask(stmt->value, &mod, NULL, NULL)) - { - str1 = XkbcAtomText(stmt->name); - ACTION("Declaration of %s ignored\n", str1); - return False; - } - if (mod.uval == srv->vmods[i]) - return True; - - str1 = XkbcAtomText(stmt->name); - WARN("Virtual modifier %s multiply defined\n", str1); - str1 = XkbcModMaskText(srv->vmods[i], True); - if (mergeMode == MergeOverride) - { - str2 = str1; - str1 = XkbcModMaskText(mod.uval, True); - } - ACTION("Using %s, ignoring %s\n", str1, str2); - if (mergeMode == MergeOverride) - srv->vmods[i] = mod.uval; - return True; - } - } +bool +HandleVModDef(VModDef *stmt, struct xkb_keymap *keymap, + enum merge_mode mergeMode, VModInfo *info) +{ + xkb_mod_index_t i; + int nextFree; + xkb_mod_mask_t bit; + xkb_mod_mask_t mask; + + nextFree = -1; + for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) { + const char *str1; + const char *str2 = ""; + + if (!(info->defined & bit)) { + if (nextFree < 0) + nextFree = i; + continue; } - else if (nextFree < 0) - nextFree = i; - } - if (nextFree < 0) - { - ERROR("Too many virtual modifiers defined (maximum %d)\n", - XkbNumVirtualMods); - return False; + + /* already defined */ + if (!keymap->vmod_names[i]) + continue; + + if (!streq(keymap->vmod_names[i], + xkb_atom_text(keymap->ctx, stmt->name))) + continue; + + info->available |= bit; + + if (!stmt->value) + return true; + + if (!ExprResolveModMask(keymap->ctx, stmt->value, &mask)) { + log_err(keymap->ctx, "Declaration of %s ignored\n", + xkb_atom_text(keymap->ctx, stmt->name)); + return false; + } + + if (mask == keymap->vmods[i]) + return true; + + str1 = ModMaskText(keymap->vmods[i]); + if (mergeMode == MERGE_OVERRIDE) { + str2 = str1; + str1 = ModMaskText(mask); + } + + log_warn(keymap->ctx, + "Virtual modifier %s defined multiple times; " + "Using %s, ignoring %s\n", + xkb_atom_text(keymap->ctx, stmt->name), str1, str2); + + if (mergeMode == MERGE_OVERRIDE) + keymap->vmods[i] = mask; + + return true; + } + + if (nextFree < 0) { + log_err(keymap->ctx, + "Too many virtual modifiers defined (maximum %d)\n", + XkbNumVirtualMods); + return false; } + info->defined |= (1 << nextFree); - info->newlyDefined |= (1 << nextFree); info->available |= (1 << nextFree); - names->vmods[nextFree] = stmt->name; - if (stmt->value == NULL) - return True; - if (ExprResolveModMask(stmt->value, &mod, NULL, NULL)) - { - srv->vmods[nextFree] = mod.uval; - return True; + + keymap->vmod_names[nextFree] = xkb_atom_text(keymap->ctx, stmt->name); + + if (!stmt->value) + return true; + + if (!ExprResolveModMask(keymap->ctx, stmt->value, &mask)) { + log_err(keymap->ctx, "Declaration of %s ignored\n", + xkb_atom_text(keymap->ctx, stmt->name)); + return false; } - ACTION("Declaration of %s ignored\n", XkbcAtomText(stmt->name)); - return False; + + keymap->vmods[nextFree] = mask; + return true; } /** - * Returns the index of the given modifier in the xkb->names->vmods array. + * Returns the index of the given modifier in the keymap->vmod_names array. * - * @param priv Pointer to the xkb data structure. - * @param elem Must be None, otherwise return False. + * @param keymap Pointer to the xkb data structure. * @param field The Atom of the modifier's name (e.g. Atom for LAlt) - * @param type Must be TypeInt, otherwise return False. + * @param type Must be EXPR_TYPE_INT, otherwise return false. * @param val_rtrn Set to the index of the modifier that matches. * - * @return True on success, False otherwise. If False is returned, val_rtrn is + * @return true on success, false otherwise. If false is returned, val_rtrn is * undefined. */ -static int -LookupVModIndex(char * priv, - uint32_t elem, uint32_t field, unsigned type, ExprResult * val_rtrn) +static bool +LookupVModIndex(const struct xkb_keymap *keymap, xkb_atom_t field, + enum expr_value_type type, xkb_mod_index_t *val_rtrn) { - int i; - struct xkb_desc * xkb; + xkb_mod_index_t i; + const char *name = xkb_atom_text(keymap->ctx, field); + + if (type != EXPR_TYPE_INT) + return false; - xkb = (struct xkb_desc *) priv; - if ((xkb == NULL) || (xkb->names == NULL) || (elem != None) - || (type != TypeInt)) - { - return False; - } /* For each named modifier, get the name and compare it to the one passed * in. If we get a match, return the index of the modifier. * The order of modifiers is the same as in the virtual_modifiers line in * the xkb_types section. */ - for (i = 0; i < XkbNumVirtualMods; i++) - { - if (xkb->names->vmods[i] == field) - { - val_rtrn->uval = i; - return True; + for (i = 0; i < XkbNumVirtualMods; i++) { + if (keymap->vmod_names[i] && streq(keymap->vmod_names[i], name)) { + *val_rtrn = i; + return true; } } - return False; + + return false; } /** - * Get the mask for the given modifier and set val_rtrn.uval to the mask. - * Note that the mask returned is always > 512. + * Get the mask for the given (virtual or core) modifier and set + * val_rtrn.uval to the mask value. * * @param priv Pointer to xkb data structure. - * @param val_rtrn Set to the mask returned. + * @param val_rtrn Member uval is set to the mask returned. * - * @return True on success, False otherwise. If False is returned, val_rtrn is + * @return true on success, false otherwise. If false is returned, val_rtrn is * undefined. */ -int -LookupVModMask(char * priv, - uint32_t elem, uint32_t field, unsigned type, ExprResult * val_rtrn) +bool +LookupVModMask(struct xkb_context *ctx, const void *priv, xkb_atom_t field, + enum expr_value_type type, xkb_mod_mask_t *val_rtrn) { - if (LookupVModIndex(priv, elem, field, type, val_rtrn)) - { - register unsigned ndx = val_rtrn->uval; - val_rtrn->uval = (1 << (XkbNumModifiers + ndx)); - return True; - } - return False; -} + xkb_mod_index_t ndx; -int -FindKeypadVMod(struct xkb_desc * xkb) -{ - uint32_t name; - ExprResult rtrn; - - name = xkb_intern_atom("NumLock"); - if ((xkb) && LookupVModIndex((char *) xkb, None, name, TypeInt, &rtrn)) - { - return rtrn.ival; + if (LookupModMask(ctx, NULL, field, type, val_rtrn)) { + return true; + } + else if (LookupVModIndex(priv, field, type, &ndx)) { + *val_rtrn = (1 << (XkbNumModifiers + ndx)); + return true; } - return -1; + + return false; } -Bool -ResolveVirtualModifier(ExprDef * def, ExprResult * val_rtrn, VModInfo * info) +bool +ResolveVirtualModifier(ExprDef *def, struct xkb_keymap *keymap, + xkb_mod_index_t *ndx_rtrn, VModInfo *info) { - struct xkb_names * names; + int val; + + if (def->op == EXPR_IDENT) { + xkb_mod_index_t i; + xkb_mod_mask_t bit; + const char *name = xkb_atom_text(keymap->ctx, def->value.str); - names = info->xkb->names; - if (def->op == ExprIdent) - { - int i, bit; - for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) - { - if ((info->available & bit) && names->vmods[i] == def->value.str) - { - val_rtrn->uval = i; - return True; + for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) { + if ((info->available & bit) && keymap->vmod_names[i] && + streq(keymap->vmod_names[i], name)) { + *ndx_rtrn = i; + return true; } } } - if (ExprResolveInteger(def, val_rtrn, NULL, NULL)) - { - if (val_rtrn->uval < XkbNumVirtualMods) - return True; - ERROR("Illegal virtual modifier %d (must be 0..%d inclusive)\n", - val_rtrn->uval, XkbNumVirtualMods - 1); + + if (!ExprResolveInteger(keymap->ctx, def, &val)) + return false; + + if (val < 0 || val >= XkbNumVirtualMods) { + log_err(keymap->ctx, + "Illegal virtual modifier %d (must be 0..%d inclusive)\n", + val, XkbNumVirtualMods - 1); + return false; } - return False; + + *ndx_rtrn = (xkb_mod_index_t) val; + return true; } diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/vmod.h libxkbcommon-0.1.0~2/src/xkbcomp/vmod.h --- libxkbcommon-0.1.0~1/src/xkbcomp/vmod.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/vmod.h 2012-08-11 16:17:00.000000000 +0000 @@ -1,71 +1,52 @@ /************************************************************ - 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 (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 VMOD_H #define VMOD_H 1 -typedef struct _VModInfo -{ - struct xkb_desc * xkb; - unsigned defined; - unsigned available; - unsigned newlyDefined; - int errorCount; +#include "xkbcomp-priv.h" +#include "expr.h" + +typedef struct _VModInfo { + xkb_mod_mask_t defined; + xkb_mod_mask_t available; } VModInfo; -extern void InitVModInfo(VModInfo * /* info */ , - struct xkb_desc * /* xkb */ - ); - -extern void ClearVModInfo(VModInfo * /* info */ , - struct xkb_desc * /* xkb */ - ); - -extern Bool HandleVModDef(VModDef * /* stmt */ , - unsigned /* mergeMode */ , - VModInfo * /* info */ - ); - -extern Bool ApplyVModDefs(VModInfo * /* info */ , - struct xkb_desc * /* xkb */ - ); - -extern int LookupVModMask(char * /* priv */ , - uint32_t /* elem */ , - uint32_t /* field */ , - unsigned /* type */ , - ExprResult * /* val_rtrn */ - ); - -extern int FindKeypadVMod(struct xkb_desc * /* xkb */ - ); - -extern Bool ResolveVirtualModifier(ExprDef * /* def */ , - ExprResult * /* value_rtrn */ , - VModInfo * /* info */ - ); +extern void +InitVModInfo(VModInfo *info, struct xkb_keymap *keymap); + +extern void +ClearVModInfo(VModInfo *info, struct xkb_keymap *keymap); + +extern bool +HandleVModDef(VModDef *stmt, struct xkb_keymap *keymap, + enum merge_mode mergeMode, VModInfo *info); + +bool +ResolveVirtualModifier(ExprDef *def, struct xkb_keymap *keymap, + xkb_mod_index_t *ndx_rtrn, VModInfo *info); #endif /* VMOD_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/xkbcomp-priv.h libxkbcommon-0.1.0~2/src/xkbcomp/xkbcomp-priv.h --- libxkbcommon-0.1.0~1/src/xkbcomp/xkbcomp-priv.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/xkbcomp-priv.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,122 @@ +/************************************************************ + * 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 "xkbcomp.h" +#include "text.h" + +extern bool +ProcessIncludeFile(struct xkb_context *ctx, IncludeStmt *stmt, + enum xkb_file_type file_type, XkbFile **file_rtrn, + enum merge_mode *merge_rtrn); + +struct xkb_key * +FindNamedKey(struct xkb_keymap *keymap, unsigned long name, + bool use_aliases, xkb_keycode_t start_from); + +extern bool +FindKeyNameForAlias(struct xkb_keymap *keymap, unsigned long lname, + unsigned long *real_name); + +extern bool +UpdateModifiersFromCompat(struct xkb_keymap *keymap); + +const char * +StmtTypeToString(enum stmt_type type); + +static inline unsigned long +KeyNameToLong(const char name[XkbKeyNameLength]) +{ + return + (((unsigned long)name[0]) << 24) | + (((unsigned long)name[1]) << 16) | + (((unsigned long)name[2]) << 8) | + (((unsigned long)name[3]) << 0); +} + +static inline void +LongToKeyName(unsigned long val, char name[XkbKeyNameLength]) +{ + name[0] = ((val >> 24) & 0xff); + name[1] = ((val >> 16) & 0xff); + name[2] = ((val >> 8) & 0xff); + name[3] = ((val >> 0) & 0xff); +} + +static inline const char * +LongKeyNameText(unsigned long val) +{ + char buf[XkbKeyNameLength]; + LongToKeyName(val, buf); + return KeyNameText(buf); +} + +static inline bool +ReportNotArray(struct xkb_keymap *keymap, const char *type, const char *field, + const char *name) +{ + log_err(keymap->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_keymap *keymap, const char *type, + const char *field, const char *name) +{ + log_err(keymap->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_keymap *keymap, const char *type, const char *field, + const char *name) +{ + log_err(keymap->ctx, + "Unknown %s field %s in %s; " + "Ignoring assignment to unknown field in %s\n", + type, field, name, name); + return false; +} + +#endif /* XKBCOMP_PRIV_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/xkbcomp.c libxkbcommon-0.1.0~2/src/xkbcomp/xkbcomp.c --- libxkbcommon-0.1.0~1/src/xkbcomp/xkbcomp.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/xkbcomp.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,332 +1,352 @@ /* -Copyright 2009 Dan Nicholson + * 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 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. + */ -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. -*/ - -#include -#include "xkbcomp.h" -#include "xkballoc.h" -#include "xkbrules.h" -#include "xkbpath.h" +#include "xkbcomp-priv.h" +#include "rules.h" #include "parseutils.h" -#include "utils.h" - -/* Global debugging flags */ -unsigned int debugFlags = 0; -unsigned int warningLevel = 0; #define ISEMPTY(str) (!(str) || (strlen(str) == 0)) static XkbFile * -XkbKeymapFileFromComponents(const struct xkb_component_names * ktcsg) +keymap_file_from_names(struct xkb_context *ctx, + const struct xkb_rule_names *rmlvo) { - XkbFile *keycodes, *types, *compat, *symbols, *geometry; + struct xkb_component_names *kkctgs; + XkbFile *keycodes, *types, *compat, *symbols; IncludeStmt *inc; - if (!ktcsg) { - ERROR("no components to generate keymap file from\n"); + kkctgs = xkb_components_from_rules(ctx, rmlvo); + if (!kkctgs) { + log_err(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 NULL; } - inc = IncludeCreate(ktcsg->keycodes, MergeDefault); - keycodes = CreateXKBFile(XkmKeyNamesIndex, NULL, (ParseCommon *)inc, 0); - - inc = IncludeCreate(ktcsg->types, MergeDefault); - types = CreateXKBFile(XkmTypesIndex, NULL, (ParseCommon *)inc, 0); + inc = IncludeCreate(ctx, kkctgs->keycodes, MERGE_DEFAULT); + keycodes = CreateXKBFile(ctx, FILE_TYPE_KEYCODES, NULL, + (ParseCommon *) inc, 0); + + inc = IncludeCreate(ctx, kkctgs->types, MERGE_DEFAULT); + types = CreateXKBFile(ctx, FILE_TYPE_TYPES, NULL, + (ParseCommon *) inc, 0); AppendStmt(&keycodes->common, &types->common); - inc = IncludeCreate(ktcsg->compat, MergeDefault); - compat = CreateXKBFile(XkmCompatMapIndex, NULL, (ParseCommon *)inc, 0); + inc = IncludeCreate(ctx, kkctgs->compat, MERGE_DEFAULT); + compat = CreateXKBFile(ctx, FILE_TYPE_COMPAT, NULL, + (ParseCommon *) inc, 0); AppendStmt(&keycodes->common, &compat->common); - inc = IncludeCreate(ktcsg->symbols, MergeDefault); - symbols = CreateXKBFile(XkmSymbolsIndex, NULL, (ParseCommon *)inc, 0); + inc = IncludeCreate(ctx, kkctgs->symbols, MERGE_DEFAULT); + symbols = CreateXKBFile(ctx, FILE_TYPE_SYMBOLS, NULL, + (ParseCommon *) inc, 0); AppendStmt(&keycodes->common, &symbols->common); - inc = IncludeCreate(ktcsg->geometry, MergeDefault); - geometry = CreateXKBFile(XkmGeometryIndex, NULL, (ParseCommon *)inc, 0); - AppendStmt(&keycodes->common, &geometry->common); + free(kkctgs->keycodes); + free(kkctgs->types); + free(kkctgs->compat); + free(kkctgs->symbols); + free(kkctgs); - return CreateXKBFile(XkmKeymapFile, ktcsg->keymap ? ktcsg->keymap : "", + return CreateXKBFile(ctx, FILE_TYPE_KEYMAP, strdup(""), &keycodes->common, 0); } -static struct xkb_component_names * -XkbComponentsFromRules(const char *rules, const XkbRF_VarDefsPtr defs) +static struct xkb_keymap * +new_keymap(struct xkb_context *ctx) +{ + struct xkb_keymap *keymap; + + keymap = calloc(1, sizeof(*keymap)); + if (!keymap) + return NULL; + + keymap->refcnt = 1; + keymap->ctx = xkb_context_ref(ctx); + + return keymap; +} + +/** + * Compile the given file and store the output in keymap. + * @param file A list of XkbFiles, each denoting one type (e.g. + * FILE_TYPE_KEYCODES, etc.) + */ +static struct xkb_keymap * +compile_keymap(struct xkb_context *ctx, XkbFile *file) { - FILE *rulesFile = NULL; - char *rulesPath = NULL; - static XkbRF_RulesPtr loaded = NULL; - static char *cached_name = NULL; - struct xkb_component_names * names = NULL; - - if (!cached_name || strcmp(rules, cached_name) != 0) { - if (loaded) - XkbcRF_Free(loaded, True); - loaded = NULL; - free(cached_name); - cached_name = NULL; - } - - if (!loaded) { - rulesFile = XkbFindFileInPath((char *)rules, XkmRulesFile, &rulesPath); - if (!rulesFile) { - ERROR("could not find \"%s\" rules in XKB path\n", rules); - goto out; + bool ok; + unsigned have = 0; + const char *main_name; + struct xkb_keymap *keymap; + XkbFile *keycodes = NULL; + XkbFile *types = NULL; + XkbFile *compat = NULL; + XkbFile *symbols = NULL; + + keymap = new_keymap(ctx); + if (!keymap) + goto err; + + main_name = file->name ? file->name : "(unnamed)"; + + /* + * Other aggregate file types are converted to FILE_TYPE_KEYMAP + * in the parser. + */ + if (file->file_type != FILE_TYPE_KEYMAP) { + log_err(ctx, "Cannot compile a %s file alone into a keymap\n", + FileTypeText(file->file_type)); + goto err; + } + + /* Check for duplicate entries in the input file */ + for (file = (XkbFile *) file->defs; file; + file = (XkbFile *) file->common.next) { + if (have & file->file_type) { + log_err(ctx, + "More than one %s section in a keymap file; " + "All sections after the first ignored\n", + FileTypeText(file->file_type)); + continue; } - if (!(loaded = _XkbTypedCalloc(1, XkbRF_RulesRec))) { - ERROR("failed to allocate XKB rules\n"); - goto unwind_file; + switch (file->file_type) { + case FILE_TYPE_KEYCODES: + keycodes = file; + break; + + case FILE_TYPE_TYPES: + types = file; + break; + + case FILE_TYPE_SYMBOLS: + symbols = file; + break; + + case FILE_TYPE_COMPAT: + compat = file; + break; + + default: + log_err(ctx, "Cannot define %s in a keymap file\n", + FileTypeText(file->file_type)); + continue; } - if (!XkbcRF_LoadRules(rulesFile, loaded)) { - ERROR("failed to load XKB rules \"%s\"\n", rulesPath); - goto unwind_file; + if (!file->topName) { + free(file->topName); + file->topName = strdup(main_name); } - cached_name = strdup(rules); + have |= file->file_type; } - if (!(names = _XkbTypedCalloc(1, struct xkb_component_names))) { - ERROR("failed to allocate XKB components\n"); - goto unwind_file; - } - - if (!XkbcRF_GetComponents(loaded, defs, names)) { - free(names->keymap); - free(names->keycodes); - free(names->types); - free(names->compat); - free(names->symbols); - free(names->geometry); - free(names); - names = NULL; - ERROR("no components returned from XKB rules \"%s\"\n", rulesPath); - } - -unwind_file: - if (rulesFile) - fclose(rulesFile); - free(rulesPath); -out: - return names; -} + if (REQUIRED_FILE_TYPES & (~have)) { + enum xkb_file_type bit; + enum xkb_file_type missing; -struct xkb_desc * -xkb_compile_keymap_from_rules(const struct xkb_rule_names *rmlvo) -{ - XkbRF_VarDefsRec defs; - struct xkb_component_names * names; - struct xkb_desc * xkb; + missing = REQUIRED_FILE_TYPES & (~have); - if (!rmlvo || ISEMPTY(rmlvo->rules) || ISEMPTY(rmlvo->layout)) { - ERROR("rules and layout required to generate XKB keymap\n"); - return NULL; + for (bit = 1; missing != 0; bit <<= 1) { + if (missing & bit) { + log_err(ctx, "Required section %s missing from keymap\n", + FileTypeText(bit)); + missing &= ~bit; + } + } + + goto err; } - defs.model = (char *) rmlvo->model; - defs.layout = (char *) rmlvo->layout; - defs.variant = (char *) rmlvo->variant; - defs.options = (char *) rmlvo->options; - - names = XkbComponentsFromRules(rmlvo->rules, &defs); - if (!names) { - ERROR("failed to generate XKB components from rules \"%s\"\n", - rmlvo->rules); - return NULL; + ok = CompileKeycodes(keycodes, keymap, MERGE_OVERRIDE); + if (!ok) { + log_err(ctx, "Failed to compile keycodes\n"); + goto err; + } + ok = CompileKeyTypes(types, keymap, MERGE_OVERRIDE); + if (!ok) { + log_err(ctx, "Failed to compile key types\n"); + goto err; + } + ok = CompileCompatMap(compat, keymap, MERGE_OVERRIDE); + if (!ok) { + log_err(ctx, "Failed to compile compat map\n"); + goto err; + } + ok = CompileSymbols(symbols, keymap, MERGE_OVERRIDE); + if (!ok) { + log_err(ctx, "Failed to compile symbols\n"); + goto err; } - xkb = xkb_compile_keymap_from_components(names); + ok = UpdateModifiersFromCompat(keymap); + if (!ok) + goto err; - free(names->keymap); - free(names->keycodes); - free(names->types); - free(names->compat); - free(names->symbols); - free(names->geometry); - free(names); + return keymap; - return xkb; +err: + log_err(ctx, "Failed to compile keymap\n"); + xkb_map_unref(keymap); + return NULL; } -static XkbFile * -XkbChooseMap(XkbFile *file, const char *name) +XKB_EXPORT struct xkb_keymap * +xkb_map_new_from_names(struct xkb_context *ctx, + const struct xkb_rule_names *rmlvo_in, + enum xkb_map_compile_flags flags) { - XkbFile *map = file; - - /* map specified? */ - if (name) { - while (map) { - if (map->name && strcmp(map->name, name) == 0) - break; - map = (XkbFile *) map->common.next; - } + struct xkb_keymap *keymap = NULL; + struct xkb_rule_names rmlvo = *rmlvo_in; + XkbFile *file; - if (!map) - ERROR("no map named \"%s\" in input file\n", name); + if (ISEMPTY(rmlvo.rules)) + rmlvo.rules = DEFAULT_XKB_RULES; + if (ISEMPTY(rmlvo.model)) + rmlvo.model = DEFAULT_XKB_MODEL; + if (ISEMPTY(rmlvo.layout)) + rmlvo.layout = DEFAULT_XKB_LAYOUT; + + file = keymap_file_from_names(ctx, &rmlvo); + if (!file) { + log_err(ctx, "Failed to generate parsed XKB file from components\n"); + return NULL; } - else if (file->common.next) { - /* look for map with XkbLC_Default flag. */ - for (; map; map = (XkbFile *) map->common.next) { - if (map->flags & XkbLC_Default) - break; - } - if (!map) { - map = file; - WARN("no map specified, but components have several\n"); - WARN("using the first defined map, \"%s\"\n", - map->name ? map->name : ""); - } - } + keymap = compile_keymap(ctx, file); + FreeXKBFile(file); - return map; + return keymap; } -struct xkb_desc * -xkb_compile_keymap_from_components(const struct xkb_component_names * ktcsg) +XKB_EXPORT struct xkb_keymap * +xkb_map_new_from_string(struct xkb_context *ctx, + const char *string, + enum xkb_keymap_format format, + enum xkb_map_compile_flags flags) { - XkbFile *file, *mapToUse; - struct xkb_desc * xkb; - - uSetErrorFile(NULL); - - if (!ktcsg || ISEMPTY(ktcsg->keycodes)) { - ERROR("keycodes required to generate XKB keymap\n"); - goto fail; - } + bool ok; + XkbFile *file; + struct xkb_keymap *keymap; - if (!(file = XkbKeymapFileFromComponents(ktcsg))) { - ERROR("failed to generate parsed XKB file from components\n"); - goto fail; + if (format != XKB_KEYMAP_FORMAT_TEXT_V1) { + log_err(ctx, "unsupported keymap format %d\n", format); + return NULL; } - /* Find map to use */ - if (!(mapToUse = XkbChooseMap(file, NULL))) - goto unwind_file; - - /* Compile the keyboard */ - if (!(xkb = XkbcAllocKeyboard())) { - ERROR("could not allocate keyboard description\n"); - goto unwind_file; + if (!string) { + log_err(ctx, "No string specified to generate XKB keymap\n"); + return NULL; } - if (!CompileKeymap(mapToUse, xkb, MergeReplace)) { - ERROR("failed to compile keymap\n"); - goto unwind_xkb; + ok = XKBParseString(ctx, string, "input", &file); + if (!ok) { + log_err(ctx, "Failed to parse input xkb file\n"); + return NULL; } - return xkb; -unwind_xkb: - XkbcFreeKeyboard(xkb, XkbAllComponentsMask, True); -unwind_file: - /* XXX: here's where we would free the XkbFile */ -fail: - return NULL; + keymap = compile_keymap(ctx, file); + FreeXKBFile(file); + return keymap; } -static struct xkb_desc * -compile_keymap(XkbFile *file, const char *mapName) +XKB_EXPORT struct xkb_keymap * +xkb_map_new_from_file(struct xkb_context *ctx, + FILE *file, + enum xkb_keymap_format format, + enum xkb_map_compile_flags flags) { - XkbFile *mapToUse; - struct xkb_desc * xkb; + bool ok; + XkbFile *xkb_file; + struct xkb_keymap *keymap; - /* Find map to use */ - if (!(mapToUse = XkbChooseMap(file, mapName))) - goto unwind_file; - - switch (mapToUse->type) { - case XkmSemanticsFile: - case XkmLayoutFile: - case XkmKeymapFile: - break; - default: - ERROR("file type %d not handled\n", mapToUse->type); - goto unwind_file; - } - - /* Compile the keyboard */ - if (!(xkb = XkbcAllocKeyboard())) { - ERROR("could not allocate keyboard description\n"); - goto unwind_file; - } - - if (!CompileKeymap(mapToUse, xkb, MergeReplace)) { - ERROR("failed to compile keymap\n"); - goto unwind_xkb; - } - - return xkb; -unwind_xkb: - XkbcFreeKeyboard(xkb, XkbAllComponentsMask, True); -unwind_file: - /* XXX: here's where we would free the XkbFile */ - - return NULL; -} - -struct xkb_desc * -xkb_compile_keymap_from_string(const char *string, const char *mapName) -{ - XkbFile *file; + if (format != XKB_KEYMAP_FORMAT_TEXT_V1) { + log_err(ctx, "Unsupported keymap format %d\n", format); + return NULL; + } - if (!string) { - ERROR("no string specified to generate XKB keymap\n"); + if (!file) { + log_err(ctx, "No file specified to generate XKB keymap\n"); return NULL; } - setScanState("input", 1); - if (!XKBParseString(string, &file) || !file) { - ERROR("failed to parse input xkb file\n"); + ok = XKBParseFile(ctx, file, "(unknown file)", &xkb_file); + if (!ok) { + log_err(ctx, "Failed to parse input xkb file\n"); return NULL; } - return compile_keymap(file, mapName); + keymap = compile_keymap(ctx, xkb_file); + FreeXKBFile(xkb_file); + return keymap; } -struct xkb_desc * -xkb_compile_keymap_from_file(FILE *inputFile, const char *mapName) +XKB_EXPORT struct xkb_keymap * +xkb_map_ref(struct xkb_keymap *keymap) { - XkbFile *file; + keymap->refcnt++; + return keymap; +} + +XKB_EXPORT void +xkb_map_unref(struct xkb_keymap *keymap) +{ + unsigned int i; + struct xkb_key *key; + + if (!keymap || --keymap->refcnt > 0) + return; - if (!inputFile) { - ERROR("no file specified to generate XKB keymap\n"); - return NULL; + for (i = 0; i < keymap->num_types; i++) { + free(keymap->types[i].map); + free(keymap->types[i].level_names); } + free(keymap->types); - setScanState("input", 1); - if (!XKBParseFile(inputFile, &file) || !file) { - ERROR("failed to parse input xkb file\n"); - return NULL; + darray_foreach(key, keymap->keys) { + free(key->sym_index); + free(key->num_syms); + darray_free(key->syms); + free(key->actions); } + darray_free(keymap->keys); - return compile_keymap(file, mapName); -} + darray_free(keymap->sym_interpret); -void -xkb_free_keymap(struct xkb_desc *xkb) -{ - XkbcFreeKeyboard(xkb, 0, True); + darray_free(keymap->key_aliases); + + 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); } diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/xkbcomp.h libxkbcommon-0.1.0~2/src/xkbcomp/xkbcomp.h --- libxkbcommon-0.1.0~1/src/xkbcomp/xkbcomp.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/xkbcomp.h 2012-08-11 16:17:00.000000000 +0000 @@ -1,360 +1,241 @@ /************************************************************ - 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 (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_H -#define XKBCOMP_H 1 +#define XKBCOMP_H 1 -#ifndef DEBUG_VAR -#define DEBUG_VAR debugFlags -#endif - -#include -#include - -#include "utils.h" - -#include "X11/extensions/XKBcommon.h" -#include "XKBcommonint.h" - -extern char *scanFile; - -#define TypeUnknown 0 -#define TypeBoolean 1 -#define TypeInt 2 -#define TypeFloat 3 -#define TypeString 4 -#define TypeAction 5 -#define TypeKeyName 6 -#define TypeSymbols 7 - -#define StmtUnknown 0 -#define StmtInclude 1 -#define StmtKeycodeDef 2 -#define StmtKeyAliasDef 3 -#define StmtExpr 4 -#define StmtVarDef 5 -#define StmtKeyTypeDef 6 -#define StmtInterpDef 7 -#define StmtVModDef 8 -#define StmtSymbolsDef 9 -#define StmtModMapDef 10 -#define StmtGroupCompatDef 11 -#define StmtIndicatorMapDef 12 -#define StmtIndicatorNameDef 13 -#define StmtOutlineDef 14 -#define StmtShapeDef 15 -#define StmtKeyDef 16 -#define StmtRowDef 17 -#define StmtSectionDef 18 -#define StmtOverlayKeyDef 19 -#define StmtOverlayDef 20 -#define StmtDoodadDef 21 - -#define FileSymInterp 100 - -typedef struct _ParseCommon -{ - unsigned stmtType; - struct _ParseCommon *next; -} ParseCommon; +#include "xkb-priv.h" -#define ExprValue 0 -#define ExprIdent 1 -#define ExprActionDecl 2 -#define ExprFieldRef 3 -#define ExprArrayRef 4 -#define ExprKeysymList 5 -#define ExprActionList 6 -#define ExprCoord 7 - -#define OpAdd 20 -#define OpSubtract 21 -#define OpMultiply 22 -#define OpDivide 23 -#define OpAssign 24 -#define OpNot 25 -#define OpNegate 26 -#define OpInvert 27 -#define OpUnaryPlus 28 - -#define MergeDefault 0 -#define MergeAugment 1 -#define MergeOverride 2 -#define MergeReplace 3 -#define MergeAltForm 4 - -#define AutoKeyNames (1L << 0) -#define CreateKeyNames(x) ((x)->flags&AutoKeyNames) +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_INDICATOR_MAP, + STMT_INDICATOR_NAME, + _STMT_NUM_VALUES +}; + +enum expr_value_type { + EXPR_TYPE_UNKNOWN = 0, + EXPR_TYPE_BOOLEAN, + EXPR_TYPE_INT, + EXPR_TYPE_STRING, + EXPR_TYPE_ACTION, + EXPR_TYPE_KEYNAME, + EXPR_TYPE_SYMBOLS, +}; + +enum expr_op_type { + EXPR_VALUE = 0, + 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, +}; + +enum merge_mode { + MERGE_DEFAULT, + MERGE_AUGMENT, + MERGE_OVERRIDE, + MERGE_REPLACE, +}; -extern unsigned warningLevel; +typedef struct _ParseCommon { + enum stmt_type type; + struct _ParseCommon *next; +} ParseCommon; -typedef struct _IncludeStmt -{ +typedef struct _IncludeStmt { ParseCommon common; - unsigned merge; + enum merge_mode merge; char *stmt; char *file; char *map; char *modifier; - char *path; - struct _IncludeStmt *next; + struct _IncludeStmt *next_incl; } IncludeStmt; -typedef struct _Expr -{ +typedef struct _Expr { ParseCommon common; - unsigned op; - unsigned type; - union - { - struct - { + enum expr_op_type op; + enum expr_value_type value_type; + union { + struct { struct _Expr *left; struct _Expr *right; } binary; - struct - { - uint32_t element; - uint32_t field; + struct { + xkb_atom_t element; + xkb_atom_t field; } field; - struct - { - uint32_t element; - uint32_t field; + struct { + xkb_atom_t element; + xkb_atom_t field; struct _Expr *entry; } array; - struct - { - uint32_t name; + struct { + xkb_atom_t name; struct _Expr *args; } action; - struct - { - int nSyms; - int szSyms; - char **syms; + struct { + darray(char *) syms; + darray(int) symsMapIndex; + darray(unsigned int) symsNumEntries; } list; - struct - { - int x; - int y; - } coord; struct _Expr *child; - uint32_t str; + xkb_atom_t str; unsigned uval; int ival; - char keyName[5]; - void * ptr; + char keyName[XkbKeyNameLength]; } value; } ExprDef; -typedef struct _VarDef -{ +typedef struct _VarDef { ParseCommon common; - unsigned merge; + enum merge_mode merge; ExprDef *name; ExprDef *value; } VarDef; -typedef struct _VModDef -{ +typedef struct _VModDef { ParseCommon common; - unsigned merge; - uint32_t name; + enum merge_mode merge; + xkb_atom_t name; ExprDef *value; } VModDef; -typedef struct _KeycodeDef -{ +typedef struct _KeycodeDef { ParseCommon common; - unsigned merge; - char name[5]; - ExprDef *value; + enum merge_mode merge; + char name[XkbKeyNameLength]; + unsigned long value; } KeycodeDef; -typedef struct _KeyAliasDef -{ +typedef struct _KeyAliasDef { ParseCommon common; - unsigned merge; - char alias[5]; - char real[5]; + enum merge_mode merge; + char alias[XkbKeyNameLength]; + char real[XkbKeyNameLength]; } KeyAliasDef; -typedef struct _KeyTypeDef -{ +typedef struct _KeyTypeDef { ParseCommon common; - unsigned merge; - uint32_t name; + enum merge_mode merge; + xkb_atom_t name; VarDef *body; } KeyTypeDef; -typedef struct _SymbolsDef -{ +typedef struct _SymbolsDef { ParseCommon common; - unsigned merge; - char keyName[5]; + enum merge_mode merge; + char keyName[XkbKeyNameLength]; ExprDef *symbols; } SymbolsDef; -typedef struct _ModMapDef -{ +typedef struct _ModMapDef { ParseCommon common; - unsigned merge; - uint32_t modifier; + enum merge_mode merge; + xkb_atom_t modifier; ExprDef *keys; } ModMapDef; -typedef struct _GroupCompatDef -{ +typedef struct _GroupCompatDef { ParseCommon common; - unsigned merge; + enum merge_mode merge; int group; ExprDef *def; } GroupCompatDef; -typedef struct _InterpDef -{ +typedef struct _InterpDef { ParseCommon common; - unsigned merge; + enum merge_mode merge; char *sym; ExprDef *match; VarDef *def; } InterpDef; -typedef struct _IndicatorNameDef -{ +typedef struct _IndicatorNameDef { ParseCommon common; - unsigned merge; + enum merge_mode merge; int ndx; ExprDef *name; - Bool virtual; + bool virtual; } IndicatorNameDef; -typedef struct _OutlineDef -{ +typedef struct _IndicatorMapDef { ParseCommon common; - uint32_t field; - int nPoints; - ExprDef *points; -} OutlineDef; - -typedef struct _ShapeDef -{ - ParseCommon common; - unsigned merge; - uint32_t name; - int nOutlines; - OutlineDef *outlines; -} ShapeDef; - -typedef struct _KeyDef -{ - ParseCommon common; - unsigned defined; - char *name; - ExprDef *expr; -} KeyDef; - -typedef struct _RowDef -{ - ParseCommon common; - int nKeys; - KeyDef *keys; -} RowDef; - -typedef struct _SectionDef -{ - ParseCommon common; - unsigned merge; - uint32_t name; - int nRows; - RowDef *rows; -} SectionDef; - -typedef struct _OverlayKeyDef -{ - ParseCommon common; - char over[5]; - char under[5]; -} OverlayKeyDef; - -typedef struct _OverlayDef -{ - ParseCommon common; - unsigned merge; - uint32_t name; - int nKeys; - OverlayKeyDef *keys; -} OverlayDef; - -typedef struct _DoodadDef -{ - ParseCommon common; - unsigned merge; - unsigned type; - uint32_t name; + enum merge_mode merge; + xkb_atom_t name; VarDef *body; -} DoodadDef; - -/* IndicatorMapDef doesn't use the type field, but the rest of the fields - need to be at the same offsets as in DoodadDef. Use #define to avoid - any strict aliasing problems. */ -#define IndicatorMapDef DoodadDef +} IndicatorMapDef; -typedef struct _XkbFile -{ +typedef struct _XkbFile { ParseCommon common; - int type; + enum xkb_file_type file_type; char *topName; char *name; ParseCommon *defs; int id; unsigned flags; - Bool compiled; } XkbFile; -extern Bool -CompileKeymap(XkbFile *file, struct xkb_desc * xkb, unsigned merge); - -extern Bool -CompileKeycodes(XkbFile *file, struct xkb_desc * xkb, unsigned merge); - -extern Bool -CompileGeometry(XkbFile *file, struct xkb_desc * xkb, unsigned merge); - -extern Bool -CompileKeyTypes(XkbFile *file, struct xkb_desc * xkb, unsigned merge); - -typedef struct _LEDInfo *LEDInfoPtr; - -extern Bool -CompileCompatMap(XkbFile *file, struct xkb_desc * xkb, unsigned merge, - LEDInfoPtr *unboundLEDs); - -extern Bool -CompileSymbols(XkbFile *file, struct xkb_desc * xkb, unsigned merge); +extern bool +CompileKeycodes(XkbFile *file, struct xkb_keymap *keymap, + enum merge_mode merge); + +extern bool +CompileKeyTypes(XkbFile *file, struct xkb_keymap *keymap, + enum merge_mode merge); + +extern bool +CompileCompatMap(XkbFile *file, struct xkb_keymap *keymap, + enum merge_mode merge); + +extern bool +CompileSymbols(XkbFile *file, struct xkb_keymap *keymap, + enum merge_mode merge); #endif /* XKBCOMP_H */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/xkbparse.y libxkbcommon-0.1.0~2/src/xkbcomp/xkbparse.y --- libxkbcommon-0.1.0~1/src/xkbcomp/xkbparse.y 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/xkbparse.y 1970-01-01 00:00:00.000000000 +0000 @@ -1,767 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ - -%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 -%{ -#define DEBUG 1 -#ifdef DEBUG -#define YYDEBUG 1 -#endif -#include "parseutils.h" -#include "xkbmisc.h" -#include -#include - -%} -%right EQUALS -%left PLUS MINUS -%left TIMES DIVIDE -%left EXCLAM INVERT -%left OPAREN -%start XkbFile -%union { - int ival; - unsigned uval; - char *str; - Atom sval; - ParseCommon *any; - ExprDef *expr; - VarDef *var; - VModDef *vmod; - InterpDef *interp; - KeyTypeDef *keyType; - SymbolsDef *syms; - ModMapDef *modMask; - GroupCompatDef *groupCompat; - IndicatorMapDef *ledMap; - IndicatorNameDef *ledName; - KeycodeDef *keyName; - KeyAliasDef *keyAlias; - ShapeDef *shape; - SectionDef *section; - RowDef *row; - KeyDef *key; - OverlayDef *overlay; - OverlayKeyDef *olKey; - OutlineDef *outline; - DoodadDef *doodad; - XkbFile *file; -} -%type Number Integer Float SignedNumber -%type XkbCompositeType FileType MergeMode OptMergeMode -%type DoodadType Flag Flags OptFlags -%type KeyName MapName OptMapName KeySym -%type FieldSpec Ident Element String -%type DeclList Decl -%type OptExprList ExprList Expr Term Lhs Terminal ArrayInit -%type OptKeySymList KeySymList Action ActionList Coord CoordList -%type VarDecl VarDeclList SymbolsBody SymbolsVarDecl -%type VModDecl VModDefList VModDef -%type InterpretDecl InterpretMatch -%type KeyTypeDecl -%type SymbolsDecl -%type ModMapDecl -%type GroupCompatDecl -%type IndicatorMapDecl -%type IndicatorNameDecl -%type KeyNameDecl -%type KeyAliasDecl -%type ShapeDecl -%type
SectionDecl -%type SectionBody SectionBodyItem -%type RowBody RowBodyItem Keys Key -%type OverlayDecl -%type OverlayKeyList OverlayKey -%type OutlineList OutlineInList -%type DoodadDecl -%type XkbFile XkbMapConfigList XkbMapConfig XkbConfig -%type XkbCompositeMap XkbCompMapList -%% -XkbFile : XkbCompMapList - { $$= rtrnValue= $1; } - | XkbMapConfigList - { $$= rtrnValue= $1; } - | XkbConfig - { $$= rtrnValue= $1; } - ; - -XkbCompMapList : XkbCompMapList XkbCompositeMap - { $$= (XkbFile *)AppendStmt(&$1->common,&$2->common); } - | XkbCompositeMap - { $$= $1; } - ; - -XkbCompositeMap : OptFlags XkbCompositeType OptMapName OBRACE - XkbMapConfigList - CBRACE SEMI - { $$= CreateXKBFile($2,$3,&$5->common,$1); } - ; - -XkbCompositeType: XKB_KEYMAP { $$= XkmKeymapFile; } - | XKB_SEMANTICS { $$= XkmSemanticsFile; } - | XKB_LAYOUT { $$= XkmLayoutFile; } - ; - -XkbMapConfigList : XkbMapConfigList XkbMapConfig - { $$= (XkbFile *)AppendStmt(&$1->common,&$2->common); } - | XkbMapConfig - { $$= $1; } - ; - -XkbMapConfig : OptFlags FileType OptMapName OBRACE - DeclList - CBRACE SEMI - { $$= CreateXKBFile($2,$3,$5,$1); } - ; - -XkbConfig : OptFlags FileType OptMapName DeclList - { $$= CreateXKBFile($2,$3,$4,$1); } - ; - - -FileType : XKB_KEYCODES { $$= XkmKeyNamesIndex; } - | XKB_TYPES { $$= XkmTypesIndex; } - | XKB_COMPATMAP { $$= XkmCompatMapIndex; } - | XKB_SYMBOLS { $$= XkmSymbolsIndex; } - | XKB_GEOMETRY { $$= XkmGeometryIndex; } - ; - -OptFlags : Flags { $$= $1; } - | { $$= 0; } - ; - -Flags : Flags Flag { $$= (($1)|($2)); } - | Flag { $$= $1; } - ; - -Flag : PARTIAL { $$= XkbLC_Partial; } - | DEFAULT { $$= XkbLC_Default; } - | HIDDEN { $$= XkbLC_Hidden; } - | ALPHANUMERIC_KEYS { $$= XkbLC_AlphanumericKeys; } - | MODIFIER_KEYS { $$= XkbLC_ModifierKeys; } - | KEYPAD_KEYS { $$= XkbLC_KeypadKeys; } - | FUNCTION_KEYS { $$= XkbLC_FunctionKeys; } - | ALTERNATE_GROUP { $$= XkbLC_AlternateGroup; } - ; - -DeclList : DeclList Decl - { $$= AppendStmt($1,$2); } - | { $$= NULL; } - ; - -Decl : OptMergeMode VarDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode VModDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode InterpretDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode KeyNameDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode KeyAliasDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode KeyTypeDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode SymbolsDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode ModMapDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode GroupCompatDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode IndicatorMapDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode IndicatorNameDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode ShapeDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode SectionDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | OptMergeMode DoodadDecl - { - $2->merge= StmtSetMerge(&$2->common,$1); - $$= &$2->common; - } - | MergeMode STRING - { - if ($1==MergeAltForm) { - yyerror("cannot use 'alternate' to include other maps"); - $$= &IncludeCreate(scanBuf,MergeDefault)->common; - } - else { - $$= &IncludeCreate(scanBuf,$1)->common; - } - } - ; - -VarDecl : Lhs EQUALS Expr SEMI - { $$= VarCreate($1,$3); } - | Ident SEMI - { $$= BoolVarCreate($1,1); } - | EXCLAM Ident SEMI - { $$= BoolVarCreate($2,0); } - ; - -KeyNameDecl : KeyName EQUALS Expr SEMI - { - KeycodeDef *def; - - def= KeycodeCreate($1,$3); - if ($1) - free($1); - $$= def; - } - ; - -KeyAliasDecl : ALIAS KeyName EQUALS KeyName SEMI - { - KeyAliasDef *def; - def= KeyAliasCreate($2,$4); - if ($2) free($2); - if ($4) free($4); - $$= def; - } - ; - -VModDecl : VIRTUAL_MODS VModDefList SEMI - { $$= $2; } - ; - -VModDefList : VModDefList COMMA VModDef - { $$= (VModDef *)AppendStmt(&$1->common,&$3->common); } - | VModDef - { $$= $1; } - ; - -VModDef : Ident - { $$= VModCreate($1,NULL); } - | Ident EQUALS Expr - { $$= VModCreate($1,$3); } - ; - -InterpretDecl : INTERPRET InterpretMatch OBRACE - VarDeclList - CBRACE SEMI - { - $2->def= $4; - $$= $2; - } - ; - -InterpretMatch : KeySym PLUS Expr - { $$= InterpCreate($1, $3); } - | KeySym - { $$= InterpCreate($1, NULL); } - ; - -VarDeclList : VarDeclList VarDecl - { $$= (VarDef *)AppendStmt(&$1->common,&$2->common); } - | VarDecl - { $$= $1; } - ; - -KeyTypeDecl : TYPE String OBRACE - VarDeclList - CBRACE SEMI - { $$= KeyTypeCreate($2,$4); } - ; - -SymbolsDecl : KEY KeyName OBRACE - SymbolsBody - CBRACE SEMI - { $$= SymbolsCreate($2,(ExprDef *)$4); } - ; - -SymbolsBody : SymbolsBody COMMA SymbolsVarDecl - { $$= (VarDef *)AppendStmt(&$1->common,&$3->common); } - | SymbolsVarDecl - { $$= $1; } - | { $$= NULL; } - ; - -SymbolsVarDecl : Lhs EQUALS Expr - { $$= VarCreate($1,$3); } - | Lhs EQUALS ArrayInit - { $$= VarCreate($1,$3); } - | Ident - { $$= BoolVarCreate($1,1); } - | EXCLAM Ident - { $$= BoolVarCreate($2,0); } - | ArrayInit - { $$= VarCreate(NULL,$1); } - ; - -ArrayInit : OBRACKET OptKeySymList CBRACKET - { $$= $2; } - | OBRACKET ActionList CBRACKET - { $$= ExprCreateUnary(ExprActionList,TypeAction,$2); } - ; - -GroupCompatDecl : GROUP Integer EQUALS Expr SEMI - { $$= GroupCompatCreate($2,$4); } - ; - -ModMapDecl : MODIFIER_MAP Ident OBRACE ExprList CBRACE SEMI - { $$= ModMapCreate($2,$4); } - ; - -IndicatorMapDecl: INDICATOR String OBRACE VarDeclList CBRACE SEMI - { $$= IndicatorMapCreate($2,$4); } - ; - -IndicatorNameDecl: INDICATOR Integer EQUALS Expr SEMI - { $$= IndicatorNameCreate($2,$4,False); } - | VIRTUAL INDICATOR Integer EQUALS Expr SEMI - { $$= IndicatorNameCreate($3,$5,True); } - ; - -ShapeDecl : SHAPE String OBRACE OutlineList CBRACE SEMI - { $$= ShapeDeclCreate($2,(OutlineDef *)&$4->common); } - | SHAPE String OBRACE CoordList CBRACE SEMI - { - OutlineDef *outlines; - outlines= OutlineCreate(None,$4); - $$= ShapeDeclCreate($2,outlines); - } - ; - -SectionDecl : SECTION String OBRACE SectionBody CBRACE SEMI - { $$= SectionDeclCreate($2,$4); } - ; - -SectionBody : SectionBody SectionBodyItem - { $$=(RowDef *)AppendStmt(&$1->common,&$2->common);} - | SectionBodyItem - { $$= $1; } - ; - -SectionBodyItem : ROW OBRACE RowBody CBRACE SEMI - { $$= RowDeclCreate($3); } - | VarDecl - { $$= (RowDef *)$1; } - | DoodadDecl - { $$= (RowDef *)$1; } - | IndicatorMapDecl - { $$= (RowDef *)$1; } - | OverlayDecl - { $$= (RowDef *)$1; } - ; - -RowBody : RowBody RowBodyItem - { $$=(KeyDef *)AppendStmt(&$1->common,&$2->common);} - | RowBodyItem - { $$= $1; } - ; - -RowBodyItem : KEYS OBRACE Keys CBRACE SEMI - { $$= $3; } - | VarDecl - { $$= (KeyDef *)$1; } - ; - -Keys : Keys COMMA Key - { $$=(KeyDef *)AppendStmt(&$1->common,&$3->common);} - | Key - { $$= $1; } - ; - -Key : KeyName - { $$= KeyDeclCreate($1,NULL); } - | OBRACE ExprList CBRACE - { $$= KeyDeclCreate(NULL,$2); } - ; - -OverlayDecl : OVERLAY String OBRACE OverlayKeyList CBRACE SEMI - { $$= OverlayDeclCreate($2,$4); } - ; - -OverlayKeyList : OverlayKeyList COMMA OverlayKey - { - $$= (OverlayKeyDef *) - AppendStmt(&$1->common,&$3->common); - } - | OverlayKey - { $$= $1; } - ; - -OverlayKey : KeyName EQUALS KeyName - { $$= OverlayKeyCreate($1,$3); } - ; - -OutlineList : OutlineList COMMA OutlineInList - { $$=(OutlineDef *)AppendStmt(&$1->common,&$3->common);} - | OutlineInList - { $$= $1; } - ; - -OutlineInList : OBRACE CoordList CBRACE - { $$= OutlineCreate(None,$2); } - | Ident EQUALS OBRACE CoordList CBRACE - { $$= OutlineCreate($1,$4); } - | Ident EQUALS Expr - { $$= OutlineCreate($1,$3); } - ; - -CoordList : CoordList COMMA Coord - { $$= (ExprDef *)AppendStmt(&$1->common,&$3->common); } - | Coord - { $$= $1; } - ; - -Coord : OBRACKET SignedNumber COMMA SignedNumber CBRACKET - { - ExprDef *expr; - expr= ExprCreate(ExprCoord,TypeUnknown); - expr->value.coord.x= $2; - expr->value.coord.y= $4; - $$= expr; - } - ; - -DoodadDecl : DoodadType String OBRACE VarDeclList CBRACE SEMI - { $$= DoodadCreate($1,$2,$4); } - ; - -DoodadType : TEXT { $$= XkbTextDoodad; } - | OUTLINE { $$= XkbOutlineDoodad; } - | SOLID { $$= XkbSolidDoodad; } - | LOGO { $$= XkbLogoDoodad; } - ; - -FieldSpec : Ident { $$= $1; } - | Element { $$= $1; } - ; - -Element : ACTION_TOK - { $$= xkb_intern_atom("action"); } - | INTERPRET - { $$= xkb_intern_atom("interpret"); } - | TYPE - { $$= xkb_intern_atom("type"); } - | KEY - { $$= xkb_intern_atom("key"); } - | GROUP - { $$= xkb_intern_atom("group"); } - | MODIFIER_MAP - {$$= xkb_intern_atom("modifier_map");} - | INDICATOR - { $$= xkb_intern_atom("indicator"); } - | SHAPE - { $$= xkb_intern_atom("shape"); } - | ROW - { $$= xkb_intern_atom("row"); } - | SECTION - { $$= xkb_intern_atom("section"); } - | TEXT - { $$= xkb_intern_atom("text"); } - ; - -OptMergeMode : MergeMode { $$= $1; } - | { $$= MergeDefault; } - ; - -MergeMode : INCLUDE { $$= MergeDefault; } - | AUGMENT { $$= MergeAugment; } - | OVERRIDE { $$= MergeOverride; } - | REPLACE { $$= MergeReplace; } - | ALTERNATE { $$= MergeAltForm; } - ; - -OptExprList : ExprList { $$= $1; } - | { $$= NULL; } - ; - -ExprList : ExprList COMMA Expr - { $$= (ExprDef *)AppendStmt(&$1->common,&$3->common); } - | Expr - { $$= $1; } - ; - -Expr : Expr DIVIDE Expr - { $$= ExprCreateBinary(OpDivide,$1,$3); } - | Expr PLUS Expr - { $$= ExprCreateBinary(OpAdd,$1,$3); } - | Expr MINUS Expr - { $$= ExprCreateBinary(OpSubtract,$1,$3); } - | Expr TIMES Expr - { $$= ExprCreateBinary(OpMultiply,$1,$3); } - | Lhs EQUALS Expr - { $$= ExprCreateBinary(OpAssign,$1,$3); } - | Term - { $$= $1; } - ; - -Term : MINUS Term - { $$= ExprCreateUnary(OpNegate,$2->type,$2); } - | PLUS Term - { $$= ExprCreateUnary(OpUnaryPlus,$2->type,$2); } - | EXCLAM Term - { $$= ExprCreateUnary(OpNot,TypeBoolean,$2); } - | INVERT Term - { $$= ExprCreateUnary(OpInvert,$2->type,$2); } - | Lhs - { $$= $1; } - | FieldSpec OPAREN OptExprList CPAREN %prec OPAREN - { $$= ActionCreate($1,$3); } - | Terminal - { $$= $1; } - | OPAREN Expr CPAREN - { $$= $2; } - ; - -ActionList : ActionList COMMA Action - { $$= (ExprDef *)AppendStmt(&$1->common,&$3->common); } - | Action - { $$= $1; } - ; - -Action : FieldSpec OPAREN OptExprList CPAREN - { $$= ActionCreate($1,$3); } - ; - -Lhs : FieldSpec - { - ExprDef *expr; - expr= ExprCreate(ExprIdent,TypeUnknown); - expr->value.str= $1; - $$= expr; - } - | FieldSpec DOT FieldSpec - { - ExprDef *expr; - expr= ExprCreate(ExprFieldRef,TypeUnknown); - expr->value.field.element= $1; - expr->value.field.field= $3; - $$= expr; - } - | FieldSpec OBRACKET Expr CBRACKET - { - ExprDef *expr; - expr= ExprCreate(ExprArrayRef,TypeUnknown); - expr->value.array.element= None; - expr->value.array.field= $1; - expr->value.array.entry= $3; - $$= expr; - } - | FieldSpec DOT FieldSpec OBRACKET Expr CBRACKET - { - ExprDef *expr; - expr= ExprCreate(ExprArrayRef,TypeUnknown); - expr->value.array.element= $1; - expr->value.array.field= $3; - expr->value.array.entry= $5; - $$= expr; - } - ; - -Terminal : String - { - ExprDef *expr; - expr= ExprCreate(ExprValue,TypeString); - expr->value.str= $1; - $$= expr; - } - | Integer - { - ExprDef *expr; - expr= ExprCreate(ExprValue,TypeInt); - expr->value.ival= $1; - $$= expr; - } - | Float - { - ExprDef *expr; - expr= ExprCreate(ExprValue,TypeFloat); - expr->value.ival= $1; - $$= expr; - } - | KeyName - { - ExprDef *expr; - expr= ExprCreate(ExprValue,TypeKeyName); - memset(expr->value.keyName,0,5); - strncpy(expr->value.keyName,$1,4); - free($1); - $$= expr; - } - ; - -OptKeySymList : KeySymList { $$= $1; } - | { $$= NULL; } - ; - -KeySymList : KeySymList COMMA KeySym - { $$= AppendKeysymList($1,$3); } - | KeySym - { $$= CreateKeysymList($1); } - ; - -KeySym : IDENT { $$= strdup(scanBuf); } - | SECTION { $$= strdup("section"); } - | Integer - { - if ($1 < 10) { /* XK_0 .. XK_9 */ - $$= malloc(2); - $$[0]= $1 + '0'; - $$[1]= '\0'; - } - else { - $$= malloc(17); - snprintf($$, 17, "%x", $1); - } - } - ; - -SignedNumber : MINUS Number { $$= -$2; } - | Number { $$= $1; } - ; - -Number : FLOAT { $$= scanInt; } - | INTEGER { $$= scanInt*XkbGeomPtsPerMM; } - ; - -Float : FLOAT { $$= scanInt; } - ; - -Integer : INTEGER { $$= scanInt; } - ; - -KeyName : KEYNAME { $$= strdup(scanBuf); } - ; - -Ident : IDENT { $$= xkb_intern_atom(scanBuf); } - | DEFAULT { $$= xkb_intern_atom("default"); } - ; - -String : STRING { $$= xkb_intern_atom(scanBuf); } - ; - -OptMapName : MapName { $$= $1; } - | { $$= NULL; } - ; - -MapName : STRING { $$= strdup(scanBuf); } - ; diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/xkbpath.c libxkbcommon-0.1.0~2/src/xkbcomp/xkbpath.c --- libxkbcommon-0.1.0~1/src/xkbcomp/xkbpath.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/xkbpath.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,441 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ - -#define DEBUG_VAR debugFlags -#include "utils.h" -#include -#include "xkbpath.h" -#include "X11/extensions/XKBcommon.h" -#include "XKBcommonint.h" - -#ifndef DFLT_XKB_CONFIG_ROOT -#define DFLT_XKB_CONFIG_ROOT "/usr/lib/X11/xkb" -#endif - -#ifndef PATH_MAX -#define PATH_MAX 1024 -#endif - -/* initial szPath */ -#define PATH_CHUNK 8 - -static Bool noDefaultPath = False; -/* number of entries allocated for includePath */ -static int szPath; -/* number of actual entries in includePath */ -static int nPathEntries; -/* Holds all directories we might be including data from */ -static char **includePath = NULL; - -/** - * Extract the first token from an include statement. - * @param str_inout Input statement, modified in-place. Can be passed in - * repeatedly. If str_inout is NULL, the parsing has completed. - * @param file_rtrn Set to the include file to be used. - * @param map_rtrn Set to whatever comes after ), if any. - * @param nextop_rtrn Set to the next operation in the complete statement. - * @param extra_data Set to the string between ( and ), if any. - * - * @return True if parsing was succcessful, False for an illegal string. - * - * Example: "evdev+aliases(qwerty)" - * str_inout = aliases(qwerty) - * nextop_retrn = + - * extra_data = NULL - * file_rtrn = evdev - * map_rtrn = NULL - * - * 2nd run with "aliases(qwerty)" - * str_inout = NULL - * file_rtrn = aliases - * map_rtrn = qwerty - * extra_data = NULL - * nextop_retrn = "" - * - */ -Bool -XkbParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, - char *nextop_rtrn, char **extra_data) -{ - char *tmp, *str, *next; - - str = *str_inout; - if ((*str == '+') || (*str == '|')) - { - *file_rtrn = *map_rtrn = NULL; - *nextop_rtrn = *str; - next = str + 1; - } - else if (*str == '%') - { - *file_rtrn = *map_rtrn = NULL; - *nextop_rtrn = str[1]; - next = str + 2; - } - else - { - /* search for tokens inside the string */ - next = strpbrk(str, "|+"); - if (next) - { - /* set nextop_rtrn to \0, next to next character */ - *nextop_rtrn = *next; - *next++ = '\0'; - } - else - { - *nextop_rtrn = '\0'; - next = NULL; - } - /* search for :, store result in extra_data */ - tmp = strchr(str, ':'); - if (tmp != NULL) - { - *tmp++ = '\0'; - *extra_data = _XkbDupString(tmp); - } - else - { - *extra_data = NULL; - } - tmp = strchr(str, '('); - if (tmp == NULL) - { - *file_rtrn = _XkbDupString(str); - *map_rtrn = NULL; - } - else if (str[0] == '(') - { - free(*extra_data); - return False; - } - else - { - *tmp++ = '\0'; - *file_rtrn = _XkbDupString(str); - str = tmp; - tmp = strchr(str, ')'); - if ((tmp == NULL) || (tmp[1] != '\0')) - { - free(*file_rtrn); - free(*extra_data); - return False; - } - *tmp++ = '\0'; - *map_rtrn = _XkbDupString(str); - } - } - if (*nextop_rtrn == '\0') - *str_inout = NULL; - else if ((*nextop_rtrn == '|') || (*nextop_rtrn == '+')) - *str_inout = next; - else - return False; - return True; -} - -static void -XkbAddDefaultDirectoriesToPath(void); - -/** - * Init memory for include paths. - */ -static Bool -XkbInitIncludePath(void) -{ - if (includePath) - return True; - - szPath = PATH_CHUNK; - includePath = (char **) calloc(szPath, sizeof(char *)); - if (!includePath) - return False; - - XkbAddDefaultDirectoriesToPath(); - return True; -} - -/** - * Remove all entries from the global includePath. - */ -static void -XkbClearIncludePath(void) -{ - register int i; - - if (szPath > 0) - { - for (i = 0; i < nPathEntries; i++) - { - if (includePath[i] != NULL) - { - free(includePath[i]); - includePath[i] = NULL; - } - } - nPathEntries = 0; - } - noDefaultPath = True; - return; -} - -/** - * Add the given path to the global includePath variable. - * If dir is NULL, the includePath is emptied. - */ -static Bool -XkbAddDirectoryToPath(const char *dir) -{ - int len; - - if (!XkbInitIncludePath()) - return False; - - if ((dir == NULL) || (dir[0] == '\0')) - { - XkbClearIncludePath(); - return True; - } -#ifdef __UNIXOS2__ - dir = (char *) __XOS2RedirRoot(dir); -#endif - len = strlen(dir); - if (len + 2 >= PATH_MAX) - { /* allow for '/' and at least one character */ - ERROR("Path entry (%s) too long (maxiumum length is %d)\n", - dir, PATH_MAX - 3); - return False; - } - if (nPathEntries >= szPath) - { - szPath += PATH_CHUNK; - includePath = (char **) realloc(includePath, szPath * sizeof(char *)); - if (includePath == NULL) - { - WSGO("Allocation failed (includePath)\n"); - return False; - } - } - includePath[nPathEntries] = strdup(dir); - if (includePath[nPathEntries] == NULL) - { - WSGO("Allocation failed (includePath[%d])\n", nPathEntries); - return False; - } - nPathEntries++; - return True; -} - -static void -XkbAddDefaultDirectoriesToPath(void) -{ - if (!XkbInitIncludePath()) - return; - if (noDefaultPath) - return; - XkbAddDirectoryToPath(DFLT_XKB_CONFIG_ROOT); -} - -/***====================================================================***/ - -/** - * Return the xkb directory based on the type. - * Do not free the memory returned by this function. - */ -char * -XkbDirectoryForInclude(unsigned type) -{ - static char buf[32]; - - switch (type) - { - case XkmSemanticsFile: - strcpy(buf, "semantics"); - break; - case XkmLayoutFile: - strcpy(buf, "layout"); - break; - case XkmKeymapFile: - strcpy(buf, "keymap"); - break; - case XkmKeyNamesIndex: - strcpy(buf, "keycodes"); - break; - case XkmTypesIndex: - strcpy(buf, "types"); - break; - case XkmSymbolsIndex: - strcpy(buf, "symbols"); - break; - case XkmCompatMapIndex: - strcpy(buf, "compat"); - break; - case XkmGeometryFile: - case XkmGeometryIndex: - strcpy(buf, "geometry"); - break; - case XkmRulesFile: - strcpy(buf, "rules"); - break; - default: - strcpy(buf, ""); - break; - } - return buf; -} - -/***====================================================================***/ - -typedef struct _FileCacheEntry -{ - char *name; - unsigned type; - char *path; - void *data; - struct _FileCacheEntry *next; -} FileCacheEntry; -static FileCacheEntry *fileCache; - -/** - * Add the file with the given name to the internal cache to avoid opening and - * parsing the file multiple times. If a cache entry for the same name + type - * is already present, the entry is overwritten and the data belonging to the - * previous entry is returned. - * - * @parameter name The name of the file (e.g. evdev). - * @parameter type Type of the file (XkbTypesIdx, ... or XkbSemanticsFile, ...) - * @parameter path The full path to the file. - * @parameter data Already parsed data. - * - * @return The data from the overwritten file or NULL. - */ -void * -XkbAddFileToCache(char *name, unsigned type, char *path, void *data) -{ - FileCacheEntry *entry; - - for (entry = fileCache; entry != NULL; entry = entry->next) - { - if ((type == entry->type) && (uStringEqual(name, entry->name))) - { - void *old = entry->data; - WSGO("Replacing file cache entry (%s/%d)\n", name, type); - entry->path = path; - entry->data = data; - return old; - } - } - entry = uTypedAlloc(FileCacheEntry); - if (entry != NULL) - { - entry->name = name; - entry->type = type; - entry->path = path; - entry->data = data; - entry->next = fileCache; - fileCache = entry; - } - return NULL; -} - -/** - * Search for the given name + type in the cache. - * - * @parameter name The name of the file (e.g. evdev). - * @parameter type Type of the file (XkbTypesIdx, ... or XkbSemanticsFile, ...) - * @parameter pathRtrn Set to the full path of the given entry. - * - * @return the data from the cache entry or NULL if no matching entry was found. - */ -void * -XkbFindFileInCache(char *name, unsigned type, char **pathRtrn) -{ - FileCacheEntry *entry; - - for (entry = fileCache; entry != NULL; entry = entry->next) - { - if ((type == entry->type) && (uStringEqual(name, entry->name))) - { - *pathRtrn = entry->path; - return entry->data; - } - } - return NULL; -} - -/***====================================================================***/ - -/** - * Search for the given file name in the include directories. - * - * @param type one of XkbTypesIndex, XkbCompatMapIndex, ..., or - * XkbSemanticsFile, XkmKeymapFile, ... - * @param pathReturn is set to the full path of the file if found. - * - * @return an FD to the file or NULL. If NULL is returned, the value of - * pathRtrn is undefined. - */ -FILE * -XkbFindFileInPath(char *name, unsigned type, char **pathRtrn) -{ - register int i; - FILE *file = NULL; - int nameLen, typeLen, pathLen; - char buf[PATH_MAX], *typeDir; - - if (!XkbInitIncludePath()) - return NULL; - - typeDir = XkbDirectoryForInclude(type); - nameLen = strlen(name); - typeLen = strlen(typeDir); - for (i = 0; i < nPathEntries; i++) - { - pathLen = strlen(includePath[i]); - if (typeLen < 1) - continue; - - if ((nameLen + typeLen + pathLen + 2) >= PATH_MAX) - { - ERROR("File name (%s/%s/%s) too long\n", includePath[i], - typeDir, name); - ACTION("Ignored\n"); - continue; - } - snprintf(buf, sizeof(buf), "%s/%s/%s", includePath[i], typeDir, name); - file = fopen(buf, "r"); - if (file != NULL) - break; - } - - if ((file != NULL) && (pathRtrn != NULL)) - { - *pathRtrn = (char *) calloc(strlen(buf) + 1, sizeof(char)); - if (*pathRtrn != NULL) - strcpy(*pathRtrn, buf); - } - return file; -} diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/xkbpath.h libxkbcommon-0.1.0~2/src/xkbcomp/xkbpath.h --- libxkbcommon-0.1.0~1/src/xkbcomp/xkbpath.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/xkbpath.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ - -#ifndef _XKBPATH_H_ -#define _XKBPATH_H_ 1 - -#include -#include -#include - -extern char *XkbDirectoryForInclude(unsigned /* type */ - ); - -extern FILE *XkbFindFileInPath(char * /* name */ , - unsigned /* type */ , - char ** /* pathRtrn */ - ); - -extern void *XkbAddFileToCache(char * /* name */ , - unsigned /* type */ , - char * /* path */ , - void * /* data */ - ); - -extern void *XkbFindFileInCache(char * /* name */ , - unsigned /* type */ , - char ** /* pathRtrn */ - ); - -extern Bool XkbParseIncludeMap(char ** /* str_inout */ , - char ** /* file_rtrn */ , - char ** /* map_rtrn */ , - char * /* nextop_rtrn */ , - char ** /* extra_data */ - ); - -#endif /* _XKBPATH_H_ */ diff -Nru libxkbcommon-0.1.0~1/src/xkbcomp/xkbscan.l libxkbcommon-0.1.0~2/src/xkbcomp/xkbscan.l --- libxkbcommon-0.1.0~1/src/xkbcomp/xkbscan.l 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbcomp/xkbscan.l 1970-01-01 00:00:00.000000000 +0000 @@ -1,246 +0,0 @@ -/************************************************************ - Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - - Permission to use, copy, modify, and distribute this - software and its documentation for any purpose and without - fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting - documentation, and that the name of Silicon Graphics not be - used in advertising or publicity pertaining to distribution - of the software without specific prior written permission. - Silicon Graphics makes no representation about the suitability - of this software for any purpose. It is provided "as is" - without any express or implied warranty. - - SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ********************************************************/ - -%{ - -#include -#include -#include - -#include "tokens.h" -#include "utils.h" -#include "parseutils.h" - -const char *yystring; -static char scanFileBuf[1024] = {0}; -char *scanFile = scanFileBuf; -int lineNum = 0; - -int scanInt; - -static char *s; -char scanBuf[1024]; - -#define BUFSIZE 4096 - -%} - -%option case-insensitive -%option yylineno -%option noyywrap - -%x S_STR S_KEY - -%% - -"//"[^\n]* -"#"[^\n]* - -\" s = scanBuf; BEGIN(S_STR); -\< s = scanBuf; BEGIN(S_KEY); - -\" BEGIN(INITIAL); *s = '\0'; return STRING; -\> BEGIN(INITIAL); *s = '\0'; return KEYNAME; - -\\[0-7]{1,3} { - /* octal escape sequence */ - int result; - - (void) sscanf( yytext + 1, "%o", &result ); - - if (result > 0xff) { - fprintf(stderr, "Illegal octal escape %s\n", yytext); - return ERROR_TOK; - } - - *s++ = result; - } - -\\[0-9]+ { - fprintf(stderr, "Illegal octal escape %s\n", yytext); - return ERROR_TOK; - } - -\\n *s++ = '\n'; -\\t *s++ = '\t'; -\\r *s++ = '\r'; -\\b *s++ = '\b'; -\\f *s++ = '\f'; -\\v *s++ = '\v'; -\\e *s++ = '\033'; - -. *s++ = yytext[0]; - -xkb_keymap return XKB_KEYMAP; -xkb_keycodes return XKB_KEYCODES; -xkb_types return XKB_TYPES; -xkb_symbols return XKB_SYMBOLS; -xkb_compat return XKB_COMPATMAP; -xkb_compat_map return XKB_COMPATMAP; -xkb_compatibility return XKB_COMPATMAP; -xkb_compatibility_map return XKB_COMPATMAP; -xkb_geometry return XKB_GEOMETRY; -xkb_semantics return XKB_SEMANTICS; -xkb_layout return XKB_LAYOUT; -include return INCLUDE; -override return OVERRIDE; -augment return AUGMENT; -replace return REPLACE; -alternate return ALTERNATE; -partial return PARTIAL; -default return DEFAULT; -hidden return HIDDEN; -virtual_modifiers return VIRTUAL_MODS; -type return TYPE; -interpret return INTERPRET; -action return ACTION_TOK; -key return KEY; -alias return ALIAS; -group return GROUP; -modmap return MODIFIER_MAP; -mod_map return MODIFIER_MAP; -modifier_map return MODIFIER_MAP; -indicator return INDICATOR; -shape return SHAPE; -row return ROW; -keys return KEYS; -section return SECTION; -overlay return OVERLAY; -text return TEXT; -outline return OUTLINE; -solid return SOLID; -logo return LOGO; -virtual return VIRTUAL; -alphanumeric_keys return ALPHANUMERIC_KEYS; -modifier_keys return MODIFIER_KEYS; -keypad_keys return KEYPAD_KEYS; -function_keys return FUNCTION_KEYS; -alternate_group return ALTERNATE_GROUP; - -[a-zA-Z_][a-zA-Z_0-9]* memcpy(scanBuf, yytext, yyleng + 1); return IDENT; - -0x[a-fA-F0-9]+ | -[0-9]+ { - char *end; - scanInt = strtol(yytext, &end, 0); - - return INTEGER; - } -[0-9]+\.[0-9]+ { - char *end; - scanInt = strtod(yytext, &end) * XkbGeomPtsPerMM; - - return FLOAT; - } - -"=" return EQUALS; -"+" return PLUS; -"-" return MINUS; -"/" return DIVIDE; -"*" return TIMES; -"{" return OBRACE; -"}" return CBRACE; -"(" return OPAREN; -")" return CPAREN; -"[" return OBRACKET; -"]" return CBRACKET; -"." return DOT; -"," return COMMA; -";" return SEMI; -"!" return EXCLAM; -"~" return INVERT; - -[ \t\r\n\v]+ - -<> return END_OF_FILE; - -. return ERROR_TOK; - -%% - -void -yyerror(const char *s) -{ - if (warningLevel>0) { - (void)fprintf(stderr,"%s: line %d of %s\n",s,yylineno, - (scanFile?scanFile:"(unknown)")); - if ((warningLevel>3)) - (void)fprintf(stderr,"last scanned symbol is: %s\n",scanBuf); - } - return; -} - -void setScanState(char *file, int lineno) -{ - yylineno = 1; - strncpy(scanFile, file, 1023); - scanFile[1023]='\0'; -} - -int -XKBParseString(const char *string, XkbFile ** pRtrn) -{ - YY_BUFFER_STATE state; - - *pRtrn = NULL; - if (string == NULL) - return 1; - - state = yy_scan_string(string); - rtrnValue = NULL; - if (yyparse() != 0) - return 0; - - yy_delete_buffer(state); - yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); - *pRtrn = rtrnValue; - CheckDefaultMap(rtrnValue); - rtrnValue = NULL; - - return 1; -} - -int -XKBParseFile(FILE * file, XkbFile ** pRtrn) -{ - if (file) - { - yyin = file; - yystring = NULL; - rtrnValue = NULL; - if (yyparse() == 0) - { - *pRtrn = rtrnValue; - CheckDefaultMap(rtrnValue); - rtrnValue = NULL; - return 1; - } - *pRtrn = NULL; - return 0; - } - *pRtrn = NULL; - return 1; -} diff -Nru libxkbcommon-0.1.0~1/src/xkbgeom.h libxkbcommon-0.1.0~2/src/xkbgeom.h --- libxkbcommon-0.1.0~1/src/xkbgeom.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbgeom.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -/* -Copyright 2009 Dan Nicholson - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice 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. -*/ - -#ifndef _XKBGEOM_H_ -#define _XKBGEOM_H_ - -#include -#include -#include "X11/extensions/XKBcommon.h" - -extern void -XkbcFreeGeometry(struct xkb_geometry * geom, unsigned which, Bool freeMap); - -extern int -XkbcAllocGeomKeyAliases(struct xkb_geometry * geom, int nKeyAliases); - -extern int -XkbcAllocGeometry(struct xkb_desc * xkb, struct xkb_geometry_sizes * sizes); - -extern struct xkb_property * -XkbcAddGeomProperty(struct xkb_geometry * geom, const char *name, const char *value); - -extern struct xkb_color * -XkbcAddGeomColor(struct xkb_geometry * geom, const char *spec, unsigned int pixel); - -extern struct xkb_outline * -XkbcAddGeomOutline(struct xkb_shape * shape, int sz_points); - -extern struct xkb_shape * -XkbcAddGeomShape(struct xkb_geometry * geom, uint32_t name, int sz_outlines); - -extern struct xkb_key * -XkbcAddGeomKey(struct xkb_row * row); - -extern struct xkb_row * -XkbcAddGeomRow(struct xkb_section * section, int sz_keys); - -extern struct xkb_section * -XkbcAddGeomSection(struct xkb_geometry * geom, uint32_t name, - int sz_rows, int sz_doodads, int sz_over); - -extern union xkb_doodad * -XkbcAddGeomDoodad(struct xkb_geometry * geom, struct xkb_section * section, uint32_t name); - -extern struct xkb_overlay_row * -XkbcAddGeomOverlayRow(struct xkb_overlay * overlay, int row_under, int sz_keys); - -extern struct xkb_overlay * -XkbcAddGeomOverlay(struct xkb_section * section, uint32_t name, int sz_rows); - -/***====================================================================***/ - -extern Bool -XkbcComputeShapeBounds(struct xkb_shape * shape); - -extern Bool -XkbcComputeSectionBounds(struct xkb_geometry * geom, struct xkb_section * section); - -#endif /* _XKBGEOM_H_ */ diff -Nru libxkbcommon-0.1.0~1/src/xkbmisc.h libxkbcommon-0.1.0~2/src/xkbmisc.h --- libxkbcommon-0.1.0~1/src/xkbmisc.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbmisc.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -/* -Copyright 2009 Dan Nicholson - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice 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. -*/ - -#ifndef _XKBMISC_H_ -#define _XKBMISC_H_ - -#include -#include -#include "X11/extensions/XKBcommon.h" - -/***====================================================================***/ - -extern Bool -XkbcComputeEffectiveMap(struct xkb_desc * xkb, struct xkb_key_type * type, - unsigned char *map_rtrn); - -/***====================================================================***/ - -extern int -XkbcInitCanonicalKeyTypes(struct xkb_desc * xkb, unsigned which, int keypadVMod); - -extern Bool -XkbcVirtualModsToReal(struct xkb_desc * xkb, unsigned virtual_mask, - unsigned *mask_rtrn); - -extern void -XkbcEnsureSafeMapName(char *name); - -extern unsigned -_XkbcKSCheckCase(uint32_t sym); - -#define _XkbKSLower (1 << 0) -#define _XkbKSUpper (1 << 1) - -#define XkbcKSIsLower(k) (_XkbcKSCheckCase(k) & _XkbKSLower) -#define XkbcKSIsUpper(k) (_XkbcKSCheckCase(k) & _XkbKSUpper) - -#define XkbKSIsKeypad(k) (((k) >= XK_KP_Space) && ((k) <= XK_KP_Equal)) -#define XkbKSIsDeadKey(k) \ - (((k) >= XK_dead_grave) && ((k) <= XK_dead_semivoiced_sound)) - -extern Bool -XkbcNameMatchesPattern(char *name, char *ptrn); - -/***====================================================================***/ - -extern char * -XkbcAtomGetString(uint32_t atom); - -/***====================================================================***/ - -extern const char * -XkbcAtomText(uint32_t atm); - -extern char * -XkbcVModMaskText(struct xkb_desc * xkb, unsigned modMask, unsigned mask); - -extern char * -XkbcModIndexText(unsigned ndx); - -extern char * -XkbcModMaskText(unsigned mask, Bool cFormat); - -extern char * -XkbcConfigText(unsigned config); - -extern char * -XkbcGeomFPText(int val); - -extern char * -XkbcActionTypeText(unsigned type); - -extern char * -XkbcKeysymText(uint32_t sym); - -extern char * -XkbcKeyNameText(char *name); - -extern char * -XkbcSIMatchText(unsigned type); - -#endif /* _XKBMISC_H_ */ diff -Nru libxkbcommon-0.1.0~1/src/xkbrules.h libxkbcommon-0.1.0~2/src/xkbrules.h --- libxkbcommon-0.1.0~1/src/xkbrules.h 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/src/xkbrules.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,161 +0,0 @@ -/* -Copyright 2009 Dan Nicholson - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice 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. -*/ - -#ifndef _XKBRULES_H_ -#define _XKBRULES_H_ - -#include -#include -#include -#include "X11/extensions/XKBcommon.h" - - -/* From filecommon */ - -#define XkbXKMFile 0 -#define XkbCFile 1 -#define XkbXKBFile 2 -#define XkbMessage 3 - -#define XkbMapDefined (1 << 0) -#define XkbStateDefined (1 << 1) - -/***====================================================================***/ - -#define _XkbSuccess 0 -#define _XkbErrMissingNames 1 -#define _XkbErrMissingTypes 2 -#define _XkbErrMissingReqTypes 3 -#define _XkbErrMissingSymbols 4 -#define _XkbErrMissingVMods 5 -#define _XkbErrMissingIndicators 6 -#define _XkbErrMissingCompatMap 7 -#define _XkbErrMissingSymInterps 8 -#define _XkbErrMissingGeometry 9 -#define _XkbErrIllegalDoodad 10 -#define _XkbErrIllegalTOCType 11 -#define _XkbErrIllegalContents 12 -#define _XkbErrEmptyFile 13 -#define _XkbErrFileNotFound 14 -#define _XkbErrFileCannotOpen 15 -#define _XkbErrBadValue 16 -#define _XkbErrBadMatch 17 -#define _XkbErrBadTypeName 18 -#define _XkbErrBadTypeWidth 19 -#define _XkbErrBadFileType 20 -#define _XkbErrBadFileVersion 21 -#define _XkbErrBadFileFormat 22 -#define _XkbErrBadAlloc 23 -#define _XkbErrBadLength 24 -#define _XkbErrXReqFailure 25 -#define _XkbErrBadImplementation 26 - -typedef struct _XkbRF_VarDefs { - char * model; - char * layout; - char * variant; - char * options; - unsigned short sz_extra; - unsigned short num_extra; - char * extra_names; - char ** extra_values; -} XkbRF_VarDefsRec,*XkbRF_VarDefsPtr; - -typedef struct _XkbRF_VarDesc { - char * name; - char * desc; -} XkbRF_VarDescRec, *XkbRF_VarDescPtr; - -typedef struct _XkbRF_DescribeVars { - int sz_desc; - int num_desc; - XkbRF_VarDescPtr desc; -} XkbRF_DescribeVarsRec,*XkbRF_DescribeVarsPtr; - -typedef struct _XkbRF_Rule { - int number; - int layout_num; - int variant_num; - char * model; - char * layout; - char * variant; - char * option; - /* yields */ - char * keycodes; - char * symbols; - char * types; - char * compat; - char * geometry; - char * keymap; - unsigned flags; -} XkbRF_RuleRec,*XkbRF_RulePtr; - -typedef struct _XkbRF_Group { - int number; - char * name; - char * words; -} XkbRF_GroupRec, *XkbRF_GroupPtr; - -#define XkbRF_PendingMatch (1L<<1) -#define XkbRF_Option (1L<<2) -#define XkbRF_Append (1L<<3) -#define XkbRF_Normal (1L<<4) -#define XkbRF_Invalid (1L<<5) - -typedef struct _XkbRF_Rules { - XkbRF_DescribeVarsRec models; - XkbRF_DescribeVarsRec layouts; - XkbRF_DescribeVarsRec variants; - XkbRF_DescribeVarsRec options; - unsigned short sz_extra; - unsigned short num_extra; - char ** extra_names; - XkbRF_DescribeVarsPtr extra; - - unsigned short sz_rules; - unsigned short num_rules; - XkbRF_RulePtr rules; - unsigned short sz_groups; - unsigned short num_groups; - XkbRF_GroupPtr groups; -} XkbRF_RulesRec, *XkbRF_RulesPtr; - -#define _XKB_RF_NAMES_PROP_ATOM "_XKB_RULES_NAMES" -#define _XKB_RF_NAMES_PROP_MAXLEN 1024 - -/* Action structures used in the server */ - -extern Bool -XkbcRF_GetComponents(XkbRF_RulesPtr rules, XkbRF_VarDefsPtr defs, - struct xkb_component_names * names); - -extern Bool -XkbcRF_LoadRules(FILE *file, XkbRF_RulesPtr rules); - -extern void -XkbcRF_Free(XkbRF_RulesPtr rules, Bool freeRules); - -#endif /* _XKBRULES_H_ */ diff -Nru libxkbcommon-0.1.0~1/test/.gitignore libxkbcommon-0.1.0~2/test/.gitignore --- libxkbcommon-0.1.0~1/test/.gitignore 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/.gitignore 2012-08-11 16:17:00.000000000 +0000 @@ -1,6 +1,12 @@ *.log -canonicalise +*.trs filecomp -namescomp rulescomp -xkey +keysym +state +context +rules-file +stringcomp +keyseq +log +interactive diff -Nru libxkbcommon-0.1.0~1/test/Makefile.am libxkbcommon-0.1.0~2/test/Makefile.am --- libxkbcommon-0.1.0~1/test/Makefile.am 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src -AM_CFLAGS = $(X11_CFLAGS) $(CWARNFLAGS) -LDADD = $(top_builddir)/src/libxkbcommon.la - -TESTS_ENVIRONMENT = $(SHELL) - -check_PROGRAMS = xkey filecomp namescomp rulescomp canonicalise -TESTS = $(check_PROGRAMS:=.sh) - -EXTRA_DIST = \ - $(TESTS) \ - bad.xkb \ - basic.xkb \ - default.xkb \ - named.xkb - -clean-local: - rm -f *.log diff -Nru libxkbcommon-0.1.0~1/test/bad.xkb libxkbcommon-0.1.0~2/test/bad.xkb --- libxkbcommon-0.1.0~1/test/bad.xkb 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/bad.xkb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -xkb_keymap { - xkb_types { include "complete" }; - xkb_compat { include "complete" }; - xkb_symbols { include "pc+us" }; -}; diff -Nru libxkbcommon-0.1.0~1/test/basic.xkb libxkbcommon-0.1.0~2/test/basic.xkb --- libxkbcommon-0.1.0~1/test/basic.xkb 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/basic.xkb 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -xkb_keymap { - xkb_keycodes { include "xfree86+aliases(qwerty)" }; - xkb_types { include "complete" }; - xkb_compat { include "complete" }; - xkb_symbols { include "pc+us" }; - xkb_geometry { include "pc(pc105)" }; -}; diff -Nru libxkbcommon-0.1.0~1/test/canonicalise.c libxkbcommon-0.1.0~2/test/canonicalise.c --- libxkbcommon-0.1.0~1/test/canonicalise.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/canonicalise.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,87 +0,0 @@ -/* - * Copyright © 2009 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. - * - * Author: Daniel Stone - */ - -#include "X11/extensions/XKBcommon.h" -#include -#include -#include - -int main(int argc, char *argv[]) -{ - struct xkb_component_names *new, *old = NULL; - - if (argc != 6 && argc != 11) { - fprintf(stderr, "usage: canonicalise (new kccgst) [old kccgst]\n"); - return 1; - } - - - new = calloc(1, sizeof(*new)); - if (!new) { - fprintf(stderr, "failed to calloc new\n"); - return 1; - } - new->keycodes = strdup(argv[1]); - new->compat = strdup(argv[2]); - new->geometry = strdup(argv[3]); - new->symbols = strdup(argv[4]); - new->types = strdup(argv[5]); - - if (argc == 11) { - old = calloc(1, sizeof(*old)); - if (!old) { - fprintf(stderr, "failed to calloc old\n"); - return 1; - } - old->keycodes = strdup(argv[6]); - old->compat = strdup(argv[7]); - old->geometry = strdup(argv[8]); - old->symbols = strdup(argv[9]); - old->types = strdup(argv[10]); - } - - xkb_canonicalise_components(new, old); - - printf("%s %s %s %s %s\n", new->keycodes, new->compat, new->geometry, - new->symbols, new->types); - - free(new->keycodes); - free(new->compat); - free(new->geometry); - free(new->symbols); - free(new->types); - free(new); - - if (old) { - free(old->keycodes); - free(old->compat); - free(old->geometry); - free(old->symbols); - free(old->types); - free(old); - } - - return 0; -} diff -Nru libxkbcommon-0.1.0~1/test/canonicalise.sh libxkbcommon-0.1.0~2/test/canonicalise.sh --- libxkbcommon-0.1.0~1/test/canonicalise.sh 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/canonicalise.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -#!/bin/sh -x - -srcdir=${srcdir-.} -builddir=${builddir-.} - -name=canonicalise -prog="$builddir/$name$EXEEXT" -log="$builddir/$name.log" - -log_kccgst() -{ - echo " keycodes: $1" >>"$log" - echo " compat: $2" >>"$log" - echo " geometry: $3" >>"$log" - echo " symbols: $4" >>"$log" - echo " types: $5" >>"$log" -} - -rm -f "$log" - -test() { - ret=`$prog $2 $3` - echo "Input (new):" >>"$log" - log_kccgst $2 - echo >>"$log" - echo "Input (old):" >>"$log" - log_kccgst $3 - echo >>"$log" - echo "Expecting:" >>"$log" - log_kccgst $1 - echo >>"$log" - echo "Received:" >>"$log" - log_kccgst $ret - echo >>"$log" - - ret=`echo "$ret" | sed -e 's/[ ]*/ /g;'` - exp=`echo "$1" | sed -e 's/[ ]*/ /g;'` - - if ! [ "$ret" = "$exp" ]; then - echo "Error: Return and expectations different" >>"$log" - exit 1 - fi -} - -# This is a bit of a horror, but I can't really remember how to properly -# handle arrays in shell, and I'm offline. -twopart_new="+inet(pc104) %+complete pc104 pc(pc104)+%+ctrl(nocaps) |complete" -twopart_old="xfree86 basic invalid us(dvorak) xfree86" -twopart_exp="xfree86+inet(pc104) basic+complete pc104 pc(pc104)+us(dvorak)+ctrl(nocaps) xfree86|complete" - -onepart_new="evdev complete pc104 pc(pc104)+us+compose(ralt) complete" -onepart_exp="evdev complete pc104 pc(pc104)+us+compose(ralt) complete" - -test "$twopart_exp" "$twopart_new" "$twopart_old" -echo >>"$log" -echo >>"$log" -test "$onepart_exp" "$onepart_new" diff -Nru libxkbcommon-0.1.0~1/test/common.c libxkbcommon-0.1.0~2/test/common.c --- libxkbcommon-0.1.0~1/test/common.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/common.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,176 @@ +/* + * Copyright 2009 Dan Nicholson + * Copyright © 2012 Daniel Stone + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "xkbcommon/xkbcommon.h" +#include "test.h" + +const char * +test_get_path(const char *path_rel) +{ + static char path[PATH_MAX]; + const char *srcdir = getenv("srcdir"); + + snprintf(path, PATH_MAX - 1, + "%s/test/data/%s", srcdir ? srcdir : ".", + path_rel ? path_rel : ""); + + return path; +} + +char * +test_read_file(const char *path_rel) +{ + struct stat info; + char *ret, *tmp; + int fd, count, remaining; + + fd = open(test_get_path(path_rel), O_RDONLY); + 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(void) +{ + struct xkb_context *ctx = xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES); + + if (!ctx) + return NULL; + + xkb_context_include_path_append(ctx, test_get_path("")); + + xkb_set_log_priority(ctx, XKB_LOG_LEVEL_DEBUG); + xkb_set_log_verbosity(ctx, 101); + + return ctx; +} + +struct xkb_keymap * +test_compile_file(struct xkb_context *context, const char *path_rel) +{ + struct xkb_keymap *keymap; + FILE *file; + const char *path = test_get_path(path_rel); + + file = fopen(path, "r"); + if (!file) { + fprintf(stderr, "Failed to open path: %s\n", path); + return NULL; + } + assert(file != NULL); + + keymap = xkb_map_new_from_file(context, file, + XKB_KEYMAP_FORMAT_TEXT_V1, 0); + fclose(file); + + if (!keymap) { + fprintf(stderr, "Failed to compile path: %s\n", path); + return NULL; + } + + fprintf(stderr, "Successfully compiled path: %s\n", path); + + return keymap; +} + +struct xkb_keymap * +test_compile_string(struct xkb_context *context, const char *string) +{ + struct xkb_keymap *keymap; + + keymap = xkb_map_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_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 = rules, + .model = model, + .layout = layout, + .variant = variant, + .options = options + }; + + keymap = xkb_map_new_from_names(context, &rmlvo, 0); + if (!keymap) { + fprintf(stderr, + "Failed to compile RMLVO: '%s', '%s', '%s', '%s', '%s'\n", + rules, model, layout, variant, options); + return NULL; + } + + return keymap; +} diff -Nru libxkbcommon-0.1.0~1/test/context.c libxkbcommon-0.1.0~2/test/context.c --- libxkbcommon-0.1.0~1/test/context.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/context.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,45 @@ +/* + * 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 + +#include "xkbcommon/xkbcommon.h" +#include "test.h" + +int +main(void) +{ + struct xkb_context *context = test_get_context(); + + 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); + + xkb_context_unref(context); + + return 0; +} diff -Nru libxkbcommon-0.1.0~1/test/data/compat/accessx libxkbcommon-0.1.0~2/test/data/compat/accessx --- libxkbcommon-0.1.0~1/test/data/compat/accessx 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/accessx 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,52 @@ +default partial xkb_compatibility "basic" { + interpret AccessX_Enable { + action= LockControls(controls=AccessXKeys); + }; +}; + +partial xkb_compatibility "full" { + + interpret AccessX_Enable { + action= LockControls(controls=AccessXKeys); + }; + + interpret AccessX_Feedback_Enable { + action= LockControls(controls=AccessXFeedback); + }; + + interpret RepeatKeys_Enable { + action= LockControls(controls=RepeatKeys); + }; + + interpret SlowKeys_Enable { + action= LockControls(controls=SlowKeys); + }; + + interpret BounceKeys_Enable { + action= LockControls(controls=BounceKeys); + }; + + interpret StickyKeys_Enable { + action= LockControls(controls=StickyKeys); + }; + + interpret MouseKeys_Enable { + action= LockControls(controls=MouseKeys); + }; + + interpret MouseKeys_Accel_Enable { + action= LockControls(controls=MouseKeysAccel); + }; + + interpret Overlay1_Enable { + action= LockControls(controls=Overlay1); + }; + + interpret Overlay2_Enable { + action= LockControls(controls=Overlay2); + }; + + interpret AudibleBell_Enable { + action= LockControls(controls=AudibleBell); + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/basic libxkbcommon-0.1.0~2/test/data/compat/basic --- libxkbcommon-0.1.0~1/test/data/compat/basic 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/basic 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,48 @@ +// Minimal set of symbol interpretations to provide +// reasonable default behavior (Num lock, shift and +// caps lock and mode switch) and set up the +// automatic updating of common keyboard LEDs. + +default xkb_compatibility "basic" { + virtual_modifiers NumLock,AltGr; + + interpret.repeat= False; + setMods.clearLocks= True; + latchMods.clearLocks= True; + latchMods.latchToLock= True; + + interpret Shift_Lock+AnyOf(Shift+Lock) { + action= LockMods(modifiers=Shift); + }; + + interpret Any+Lock { + action= LockMods(modifiers=Lock); + }; + + interpret Num_Lock+Any { + virtualModifier= NumLock; + action= LockMods(modifiers=NumLock); + }; + + interpret Mode_switch { + useModMapMods= level1; + virtualModifier= AltGr; + action= SetGroup(group=+1); + }; + + interpret Any + Any { + action= SetMods(modifiers=modMapMods); + }; + + group 2 = AltGr; + group 3 = AltGr; + group 4 = AltGr; + + include "ledcaps" + include "lednum" + indicator "Shift Lock" { + !allowExplicit; + whichModState= Locked; + modifiers= Shift; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/caps libxkbcommon-0.1.0~2/test/data/compat/caps --- libxkbcommon-0.1.0~1/test/data/compat/caps 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/caps 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,12 @@ +partial xkb_compatibility "caps_lock" { + // Keysym Caps_Lock locks Lock modifier. + // With this, the keysym Caps_Lock can be used without binding the whole + // key to a real modifier. + // This is essential when you don't want to use caps lock on the first + // level. + // This should not have any compatibility issues when used together with + // other layouts which don't utilize this capability. + interpret Caps_Lock { + action = LockMods(modifiers = Lock); + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/complete libxkbcommon-0.1.0~2/test/data/compat/complete --- libxkbcommon-0.1.0~1/test/data/compat/complete 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/complete 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,10 @@ +default xkb_compatibility "complete" { + include "basic" + augment "iso9995" + augment "mousekeys" + augment "accessx(full)" + augment "misc" + augment "xfree86" + augment "level5" + augment "caps(caps_lock)" +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/default libxkbcommon-0.1.0~2/test/data/compat/default --- libxkbcommon-0.1.0~1/test/data/compat/default 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/default 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,12 @@ +default xkb_compatibility "default" { + include "basic" + augment "mousekeys" + augment "accessx(basic)" + augment "misc" + augment "iso9995" + augment "level5" +// ??should be changed/renamed/removed +// augment "xfree86" + augment "japan" + augment "caps(caps_lock)" +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/iso9995 libxkbcommon-0.1.0~2/test/data/compat/iso9995 --- libxkbcommon-0.1.0~1/test/data/compat/iso9995 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/iso9995 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,80 @@ +// 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_Lock+Any { + action= ISOLock(affect= all,modifiers=modMapMods); + }; + + interpret ISO_Level2_Latch+Shift { + useModMapMods= level1; + action= LatchMods(modifiers=Shift); + }; + + interpret ISO_Level3_Shift+Any { + useModMapMods= level1; + virtualModifier= LevelThree; + action= SetMods(modifiers=LevelThree); + }; + + interpret ISO_Level3_Shift { + action= SetMods(modifiers=LevelThree); + }; + + interpret ISO_Level3_Latch+Any { + useModMapMods= level1; + virtualModifier= LevelThree; + action= LatchMods(modifiers=LevelThree); + }; + + interpret ISO_Level3_Latch { + action= LatchMods(modifiers=LevelThree); + }; + + interpret ISO_Level3_Lock+Any { + useModMapMods= level1; + virtualModifier= LevelThree; + action= LockMods(modifiers=LevelThree); + }; + + interpret ISO_Level3_Lock { + action= LockMods(modifiers=LevelThree); + }; + + interpret ISO_Group_Latch { + useModMapMods= level1; + virtualModifier= AltGr; + action= LatchGroup(group=2); + }; + + interpret ISO_Next_Group { + useModMapMods= level1; + virtualModifier= AltGr; + action= LockGroup(group=+1); + }; + + interpret ISO_Prev_Group { + useModMapMods= level1; + virtualModifier= AltGr; + action= LockGroup(group=-1); + }; + interpret ISO_First_Group { + action= LockGroup(group=1); + }; + + interpret ISO_Last_Group { + action= LockGroup(group=2); + }; + + indicator "Group 2" { + !allowExplicit; + groups= All-Group1; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/ledcaps libxkbcommon-0.1.0~2/test/data/compat/ledcaps --- libxkbcommon-0.1.0~1/test/data/compat/ledcaps 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/ledcaps 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,23 @@ +// Use Caps Lock LED to show either Caps Lock, Group, or Shift Lock state + +default partial xkb_compatibility "caps_lock" { + indicator "Caps Lock" { + !allowExplicit; + whichModState= Locked; + modifiers= Lock; + }; +}; + +partial xkb_compatibility "group_lock" { + indicator "Caps Lock" { + modifiers= None; + groups=All-group1; + }; +}; + +partial xkb_compatibility "shift_lock" { + indicator "Caps Lock" { + whichModState= Locked; + modifiers= Shift; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/lednum libxkbcommon-0.1.0~2/test/data/compat/lednum --- libxkbcommon-0.1.0~1/test/data/compat/lednum 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/lednum 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,23 @@ +// Use Num Lock LED to show either Num Lock, Group, or Shift Lock state + +default partial xkb_compatibility "num_lock" { + indicator "Num Lock" { + !allowExplicit; + whichModState= Locked; + modifiers= NumLock; + }; +}; + +partial xkb_compatibility "group_lock" { + indicator "Num Lock" { + modifiers= None; + groups=All-group1; + }; +}; + +partial xkb_compatibility "shift_lock" { + indicator "Num Lock" { + whichModState= Locked; + modifiers= Shift; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/ledscroll libxkbcommon-0.1.0~2/test/data/compat/ledscroll --- libxkbcommon-0.1.0~1/test/data/compat/ledscroll 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/ledscroll 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,23 @@ +// Use Scroll Lock LED to show either Scroll Lock, Group, or Shift Lock state + +default partial xkb_compatibility "scroll_lock" { + indicator "Scroll Lock" { + allowExplicit; + whichModState= Locked; + modifiers= ScrollLock; + }; +}; + +partial xkb_compatibility "group_lock" { + indicator "Scroll Lock" { + modifiers= None; + groups=All-group1; + }; +}; + +partial xkb_compatibility "shift_lock" { + indicator "Scroll Lock" { + whichModState= Locked; + modifiers= Shift; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/level5 libxkbcommon-0.1.0~2/test/data/compat/level5 --- libxkbcommon-0.1.0~1/test/data/compat/level5 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/level5 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,51 @@ +// 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 { + virtualModifier= LevelFive; + action= LatchMods(modifiers=LevelFive); + }; + + interpret ISO_Level5_Latch { + action= LatchMods(modifiers=LevelFive); + }; + + interpret ISO_Level5_Lock+Any { + virtualModifier= LevelFive; + action= LockMods(modifiers=LevelFive); + }; + + interpret ISO_Level5_Lock { + action= LockMods(modifiers=LevelFive); + }; +}; +partial xkb_compatibility "level5_lock" { + // This defines a Level5-Lock using the NumLock real modifier in order to + // create arbitrary level-behaviour, which would not be possible with the + // virtual modifier. + // See also: types/level5 : EIGHT_LEVEL_LEVEL_FIVE_LOCK + // See also: symbols/level5(lock) + virtual_modifiers NumLock; + + interpret ISO_Level5_Lock { + action = LockMods(modifiers = NumLock); + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/misc libxkbcommon-0.1.0~2/test/data/compat/misc --- libxkbcommon-0.1.0~1/test/data/compat/misc 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/misc 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,122 @@ +default partial xkb_compatibility "misc" { + + virtual_modifiers Alt,Meta,Super,Hyper,ScrollLock; + + // Interpretations for some other useful keys + + interpret Terminate_Server { + action = Terminate(); + }; + + setMods.clearLocks= True; + + // Sets the "Alt" virtual modifier + + interpret Alt_L+Any { + //useModMapMods= level1; + virtualModifier= Alt; + action = SetMods(modifiers=modMapMods); + }; + + interpret Alt_L { + action = SetMods(modifiers=Alt); + }; + + interpret Alt_R+Any { + //useModMapMods= level1; + virtualModifier= Alt; + action = SetMods(modifiers=modMapMods); + }; + + interpret Alt_R { + action = SetMods(modifiers=Alt); + }; + + // Sets the "Meta" virtual modifier + + interpret Meta_L+Any { +// useModMapMods= level1; + virtualModifier= Meta; + action = SetMods(modifiers=modMapMods); + }; + + interpret Meta_L { + action = SetMods(modifiers=Meta); + }; + + interpret Meta_R+Any { + //useModMapMods= level1; + virtualModifier= Meta; + action = SetMods(modifiers=modMapMods); + }; + + interpret Meta_R { + action = SetMods(modifiers=Meta); + }; + + // Sets the "Super" virtual modifier + + interpret Super_L+Any { +// useModMapMods= level1; + virtualModifier= Super; + action = SetMods(modifiers=modMapMods); + }; + + interpret Super_L { + action = SetMods(modifiers=Super); + }; + + interpret Super_R+Any { + //useModMapMods= level1; + virtualModifier= Super; + action = SetMods(modifiers=modMapMods); + }; + + interpret Super_R { + action = SetMods(modifiers=Super); + }; + + // Sets the "Hyper" virtual modifier + + interpret Hyper_L+Any { +// useModMapMods= level1; + virtualModifier= Hyper; + action = SetMods(modifiers=modMapMods); + }; + + interpret Hyper_L { + action = SetMods(modifiers=Hyper); + }; + + interpret Hyper_R+Any { + //useModMapMods= level1; + virtualModifier= Hyper; + action = SetMods(modifiers=modMapMods); + }; + + interpret Hyper_R { + action = SetMods(modifiers=Hyper); + }; + + // Sets the "ScrollLock" virtual modifier and + // makes it actually lock when pressed. Sets + // up a map for the scroll lock indicator. + interpret Scroll_Lock+Any { + virtualModifier= ScrollLock; + action = LockMods(modifiers=modMapMods); + }; + + include "ledscroll" + + include "misc(assign_shift_left_action)" +}; + +partial xkb_compatibility "assign_shift_left_action" { + // Because of the irrevertable modifier mapping in symbols/pc is + // getting bound to the Lock modifier when using + // symbols/shift(both_capslock), creating unwanted behaviour. + // This is a quirk, to circumvent the problem. + interpret Shift_L { + action = SetMods(modifiers = Shift); + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/mousekeys libxkbcommon-0.1.0~2/test/data/compat/mousekeys --- libxkbcommon-0.1.0~1/test/data/compat/mousekeys 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/mousekeys 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,202 @@ +// Interpretations for arrow keys and a bunch of other +// common keysyms which make it possible to bind "mouse" +// keys using xmodmap and activate or deactivate them +// from the keyboard. + +default partial xkb_compatibility "mousekeys" { + + // Keypad actions. + // + interpret.repeat= True; + + interpret KP_1 { + action = MovePtr(x=-1,y= +1); + }; + interpret KP_End { + action = MovePtr(x=-1,y= +1); + }; + + interpret KP_2 { + action = MovePtr(x=+0,y= +1); + }; + interpret KP_Down { + action = MovePtr(x=+0,y= +1); + }; + + interpret KP_3 { + action = MovePtr(x=+1,y=+1); + }; + interpret KP_Next { + action = MovePtr(x=+1,y=+1); + }; + + interpret KP_4 { + action = MovePtr(x=-1,y=+0); + }; + interpret KP_Left { + action = MovePtr(x=-1,y=+0); + }; + + interpret KP_6 { + action = MovePtr(x=+1,y=+0); + }; + interpret KP_Right { + action = MovePtr(x=+1,y=+0); + }; + + interpret KP_7 { + action = MovePtr(x=-1,y=-1); + }; + interpret KP_Home { + action = MovePtr(x=-1,y=-1); + }; + + interpret KP_8 { + action = MovePtr(x=+0,y=-1); + }; + interpret KP_Up { + action = MovePtr(x=+0,y=-1); + }; + + interpret KP_9 { + action = MovePtr(x=+1,y=-1); + }; + interpret KP_Prior { + action = MovePtr(x=+1,y=-1); + }; + + interpret KP_5 { + action = PointerButton(button=default); + }; + interpret KP_Begin { + action = PointerButton(button=default); + }; + + interpret KP_F2 { + action = SetPtrDflt(affect=defaultButton,button=1); + }; + interpret KP_Divide { + action = SetPtrDflt(affect=defaultButton,button=1); + }; + + interpret KP_F3 { + action = SetPtrDflt(affect=defaultButton,button=2); + }; + interpret KP_Multiply { + action = SetPtrDflt(affect=defaultButton,button=2); + }; + + interpret KP_F4 { + action = SetPtrDflt(affect=defaultButton,button=3); + }; + interpret KP_Subtract { + action = SetPtrDflt(affect=defaultButton,button=3); + }; + + interpret KP_Separator { + action = PointerButton(button=default,count=2); + }; + interpret KP_Add { + action = PointerButton(button=default,count=2); + }; + + interpret KP_0 { + action = LockPointerButton(button=default,affect=lock); + }; + interpret KP_Insert { + action = LockPointerButton(button=default,affect=lock); + }; + + interpret KP_Decimal { + action = LockPointerButton(button=default,affect=unlock); + }; + interpret KP_Delete { + action = LockPointerButton(button=default,affect=unlock); + }; + + // Additional mappings for Solaris keypad compatibility + interpret F25 { // aka KP_Divide + action = SetPtrDflt(affect=defaultButton,button=1); + }; + interpret F26 { // aka KP_Multiply + action = SetPtrDflt(affect=defaultButton,button=2); + }; + interpret F27 { // aka KP_Home + action = MovePtr(x=-1,y=-1); + }; + interpret F29 { // aka KP_Prior + action = MovePtr(x=+1,y=-1); + }; + interpret F31 { // aka KP_Begin + action = PointerButton(button=default); + }; + interpret F33 { // aka KP_End + action = MovePtr(x=-1,y= +1); + }; + interpret F35 { // aka KP_Next + action = MovePtr(x=+1,y=+1); + }; + + interpret.repeat= False; + + + // New Keysym Actions. + // + interpret Pointer_Button_Dflt { + action= PointerButton(button=default); + }; + interpret Pointer_Button1 { + action= PointerButton(button=1); + }; + interpret Pointer_Button2 { + action= PointerButton(button=2); + }; + interpret Pointer_Button3 { + action= PointerButton(button=3); + }; + interpret Pointer_DblClick_Dflt { + action= PointerButton(button=default,count=2); + }; + interpret Pointer_DblClick1 { + action= PointerButton(button=1,count=2); + }; + interpret Pointer_DblClick2 { + action= PointerButton(button=2,count=2); + }; + interpret Pointer_DblClick3 { + action= PointerButton(button=3,count=2); + }; + interpret Pointer_Drag_Dflt { + action= LockPointerButton(button=default); + }; + interpret Pointer_Drag1 { + action= LockPointerButton(button=1); + }; + interpret Pointer_Drag2 { + action= LockPointerButton(button=2); + }; + interpret Pointer_Drag3 { + action= LockPointerButton(button=3); + }; + + interpret Pointer_EnableKeys { + action= LockControls(controls=MouseKeys); + }; + interpret Pointer_Accelerate { + action= LockControls(controls=MouseKeysAccel); + }; + interpret Pointer_DfltBtnNext { + action= SetPtrDflt(affect=defaultButton,button= +1); + }; + interpret Pointer_DfltBtnPrev { + action= SetPtrDflt(affect=defaultButton,button= -1); + }; + + + // Allow an indicator for MouseKeys. + indicator "Mouse Keys" { +// !allowExplicit; + indicatorDrivesKeyboard; + controls= MouseKeys; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/pc libxkbcommon-0.1.0~2/test/data/compat/pc --- libxkbcommon-0.1.0~1/test/data/compat/pc 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/pc 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,17 @@ +default partial xkb_compatibility "pc" { + + // Sets the "Alt" virtual modifier + + virtual_modifiers Alt; + + setMods.clearLocks= True; + interpret Alt_L+Any { + virtualModifier= Alt; + action = SetMods(modifiers=modMapMods); + }; + + interpret Alt_R+Any { + virtualModifier= Alt; + action = SetMods(modifiers=modMapMods); + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/compat/xfree86 libxkbcommon-0.1.0~2/test/data/compat/xfree86 --- libxkbcommon-0.1.0~1/test/data/compat/xfree86 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/compat/xfree86 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,66 @@ +// XFree86 special keysyms + +default partial xkb_compatibility "basic" { + + interpret.repeat= True; + + interpret XF86_Switch_VT_1 { + action = SwitchScreen(Screen=1, !SameServer); + }; + interpret XF86_Switch_VT_2 { + action = SwitchScreen(Screen=2, !SameServer); + }; + interpret XF86_Switch_VT_3 { + action = SwitchScreen(Screen=3, !SameServer); + }; + interpret XF86_Switch_VT_4 { + action = SwitchScreen(Screen=4, !SameServer); + }; + interpret XF86_Switch_VT_5 { + action = SwitchScreen(Screen=5, !SameServer); + }; + interpret XF86_Switch_VT_6 { + action = SwitchScreen(Screen=6, !SameServer); + }; + interpret XF86_Switch_VT_7 { + action = SwitchScreen(Screen=7, !SameServer); + }; + interpret XF86_Switch_VT_8 { + action = SwitchScreen(Screen=8, !SameServer); + }; + interpret XF86_Switch_VT_9 { + action = SwitchScreen(Screen=9, !SameServer); + }; + interpret XF86_Switch_VT_10 { + action = SwitchScreen(Screen=10, !SameServer); + }; + interpret XF86_Switch_VT_11 { + action = SwitchScreen(Screen=11, !SameServer); + }; + interpret XF86_Switch_VT_12 { + action = SwitchScreen(Screen=12, !SameServer); + }; + + interpret XF86LogGrabInfo { + action = Private(type=0x86, data="PrGrbs"); + }; + interpret XF86LogWindowTree { + action = Private(type=0x86, data="PrWins"); + }; + + interpret XF86_Next_VMode { + action = Private(type=0x86, data="+VMode"); + }; + interpret XF86_Prev_VMode { + action = Private(type=0x86, data="-VMode"); + }; +}; + +partial xkb_compatibility "grab_break" { + interpret XF86_Ungrab { + action = Private(type=0x86, data="Ungrab"); + }; + interpret XF86_ClearGrab { + action = Private(type=0x86, data="ClsGrb"); + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/keycodes/aliases libxkbcommon-0.1.0~2/test/data/keycodes/aliases --- libxkbcommon-0.1.0~1/test/data/keycodes/aliases 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/keycodes/aliases 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,99 @@ + +// 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 = ; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/keycodes/evdev libxkbcommon-0.1.0~2/test/data/keycodes/evdev --- libxkbcommon-0.1.0~1/test/data/keycodes/evdev 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/keycodes/evdev 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,314 @@ +// translation from evdev scancodes to something resembling xfree86 keycodes. + +default xkb_keycodes "evdev" { + minimum = 8; + maximum = 255; + + # Added for pc105 compatibility + = 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)" +}; diff -Nru libxkbcommon-0.1.0~1/test/data/keymaps/bad.xkb libxkbcommon-0.1.0~2/test/data/keymaps/bad.xkb --- libxkbcommon-0.1.0~1/test/data/keymaps/bad.xkb 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/keymaps/bad.xkb 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,5 @@ +xkb_keymap { + xkb_types { include "complete" }; + xkb_compat { include "complete" }; + xkb_symbols { include "pc+us" }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/keymaps/basic.xkb libxkbcommon-0.1.0~2/test/data/keymaps/basic.xkb --- libxkbcommon-0.1.0~1/test/data/keymaps/basic.xkb 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/keymaps/basic.xkb 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,6 @@ +xkb_keymap { + xkb_keycodes { include "evdev+aliases(qwerty)" }; + xkb_types { include "complete" }; + xkb_compat { include "complete" }; + xkb_symbols { include "pc+us" }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/keymaps/comprehensive-plus-geom.xkb libxkbcommon-0.1.0~2/test/data/keymaps/comprehensive-plus-geom.xkb --- libxkbcommon-0.1.0~1/test/data/keymaps/comprehensive-plus-geom.xkb 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/keymaps/comprehensive-plus-geom.xkb 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,1813 @@ +xkb_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"; + }; +}; + +}; diff -Nru libxkbcommon-0.1.0~1/test/data/keymaps/default.xkb libxkbcommon-0.1.0~2/test/data/keymaps/default.xkb --- libxkbcommon-0.1.0~1/test/data/keymaps/default.xkb 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/keymaps/default.xkb 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,15 @@ +xkb_keymap { + xkb_keycodes { include "evdev+aliases(qwerty)" }; + xkb_types { include "complete" }; + xkb_compat { include "complete" }; + xkb_symbols { include "pc+us" }; + xkb_geometry { include "pc(pc105)" }; +}; + +default xkb_keymap { + xkb_keycodes { include "evdev+aliases(qwertz)" }; + xkb_types { include "complete" }; + xkb_compat { include "complete" }; + xkb_symbols { include "pc+de" }; + xkb_geometry { include "pc(pc105)" }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/keymaps/divide-by-zero.xkb libxkbcommon-0.1.0~2/test/data/keymaps/divide-by-zero.xkb --- libxkbcommon-0.1.0~1/test/data/keymaps/divide-by-zero.xkb 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/keymaps/divide-by-zero.xkb 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,17 @@ +xkb_keymap { + xkb_keycodes { + = 1 / 0; + }; + + xkb_types { + virtual_modifiers NumLock; + }; + + xkb_compatibility { + virtual_modifiers NumLock; + }; + + xkb_symbols { + key { [ NoSymbol, Hyper_L ] }; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/keymaps/no-types.xkb libxkbcommon-0.1.0~2/test/data/keymaps/no-types.xkb --- libxkbcommon-0.1.0~1/test/data/keymaps/no-types.xkb 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/keymaps/no-types.xkb 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,1025 @@ +xkb_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 { }; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/keymaps/stringcomp.data libxkbcommon-0.1.0~2/test/data/keymaps/stringcomp.data --- libxkbcommon-0.1.0~1/test/data/keymaps/stringcomp.data 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/keymaps/stringcomp.data 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,1927 @@ +xkb_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 "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]= 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 "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_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.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); + }; + 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); + }; + 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 "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, U3f0, 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, U3d5, 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, U17f, 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, U133, U132, 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, U140, U13f, 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, U2de, 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, U3f5, 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, U149, 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, U3f1, 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, U3d1, 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 Control { }; + modifier_map Shift { }; + modifier_map Shift { }; + modifier_map Mod1 { }; + modifier_map Lock { }; + modifier_map Mod2 { }; + modifier_map Mod5 { }; + modifier_map Mod3 { }; + modifier_map Mod1 { }; + modifier_map Mod4 { }; + modifier_map Mod4 { }; + modifier_map Mod5 { }; + modifier_map Mod1 { }; + modifier_map Mod4 { }; + modifier_map Mod4 { }; + }; + +}; diff -Nru libxkbcommon-0.1.0~1/test/data/rules/evdev libxkbcommon-0.1.0~2/test/data/rules/evdev --- libxkbcommon-0.1.0~1/test/data/rules/evdev 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/rules/evdev 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,1098 @@ +// 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 + pc98 = evdev(pc98) + applealu_jis = evdev+macintosh(jisevdev) + * = evdev + +! layout[1] = keycodes + $azerty = +aliases(azerty) + $qwertz = +aliases(qwertz) + * = +aliases(qwerty) + +! layout = keycodes + $azerty = +aliases(azerty) + $qwertz = +aliases(qwertz) + * = +aliases(qwerty) + +! option = keycodes + apple:badmap = +macintosh(badmap) + apple:goodmap = +macintosh(goodmap) + +! model layout = geometry + thinkpad us = thinkpad(us) + +! model = geometry + microsoftelite = microsoft(elite) + $msmodels = microsoft(natural) + dell101 = dell(dell101) + dellm65 = dell(dellm65) + latitude = dell(latitude) + flexpro = keytronic(FlexPro) + hp6000 = hp(omnibook) + hpmini110 = hp(mini110) + hpdv5 = hp(dv5) + omnikey101 = northgate(omnikey101) + sanwaskbkg3 = sanwa(sanwaskbkg3) + $pcmodels = pc(%m) + $pcgeometries = pc(%m) + everex = everex(STEPnote) + thinkpad = thinkpad(intl) + thinkpad60 = thinkpad(60) + thinkpadz60 = thinkpad(60) + $tmgeometries = typematrix(%m) + winbook = winbook(XP5) + pc98 = nec(pc98) + $applealu = macintosh(%m) + $macbooks = macintosh(%m) + $macs = macintosh(macintosh) + hhk = hhk(basic) + kinesis = kinesis(model100) + $nokiamodels = nokia(%m) + * = pc(pc104) + +! model layout variant = symbols + * ben basic = pc+in(ben) + * ben probhat = pc+in(ben_probhat) + * dev basic = pc+in(deva) + * dvorak $dvoraklayouts = pc+%v(dvorak) + * dvorak basic = pc+us(dvorak) + * dvorak pl_basic = pc+pl(dvorak) + * dvorak pl = pc+pl(dvorak_quotes) + * dvorak pl_altquotes = pc+pl(dvorak_altquotes) + * dzdwi basic = pc+bt(basic) + * fi basic = pc+fi(classic) + * ge azerty_tskapo = pc+fr(geo) + * guj basic = pc+in(guj) + * gur basic = pc+in(guru) + * ie laptop = pc+ie(basic) + * ie CloGaelachLaptop = pc+ie(CloGaelach) + * in urd = pc+in(urd-phonetic) + * iu basic = pc+ca(ike) + * lo basic = pc+la(basic) + * kan basic = pc+in(kan) + * mal basic = pc+in(mal) + * mal mlplusnum = pc+in(mal) + * ogham basic = pc+ie(ogam) + * ogham laptop = pc+ie(ogam) + * ogham is434 = pc+ie(ogam_is434) + * ogham is434laptop = pc+ie(ogam_is434) + * ori basic = pc+in(ori) + * ro de = pc+ro(winkeys) + * ro us = pc+ro(std) + * ro academic = pc+ro(std) + * ro std_comma = pc+ro(std) + * ro comma = pc+ro(basic) + * ru os = pc+ru(os_legacy) + * pk urd = pc+pk(urd-phonetic) + * sapmi basic = pc+no(smi) + * sapmi nodeadkeys = pc+no(smi_nodeadkeys) + * sapmi sefi = pc+fi(smi) + * sin phonetic-static = pc+in(sin_phonetic) + * syr basic = pc+sy(syc) + * syr phonetic = pc+sy(syc_phonetic) + * tam INSCRIPT = pc+in(tam) + * tam UNI = pc+in(tam_unicode) + * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals) + * tam TAB = pc+in(tam_TAB) + * tam TSCII = pc+in(tam_TSCII) + * tel basic = pc+in(tel) + * yu basic = pc+srp(latin) + * yu unicode = pc+srp(latinunicode) + * yu yz = pc+srp(latinyz) + * yu unicodeyz = pc+srp(latinunicodeyz) + classmate us intl = pc+us(classmate-intl) + classmate us alt-intl = pc+us(classmate-alt-intl) + classmate us altgr-intl = pc+us(classmate-altgr-intl) + nokiarx51 cz qwerty = nokia_vndr/rx-51(cz_qwerty) + +! model layout = symbols + * ar = pc+ara + * ben = pc+in(ben) + * bs = pc+ba + * cs = pc+rs + * cz_qwerty = pc+cz(qwerty) + * dev = pc+in(deva) + * dvorak = pc+us(dvorak) + * dzdwi = pc+bt + * el = pc+gr + * en_US = pc+latin + * guj = pc+in(guj) + * gur = pc+in(guru) + * iu = pc+ca(ike) + * lo = pc+la + * kan = pc+in(kan) + * mi = pc+mao + * ml = pc+in(mal) + * ogham = pc+ie(ogam) + * ori = pc+ie(ori) + * sapmi = pc+no(smi) + * sr = pc+srp + * syr = pc+sy(syc) + * tel = pc+in(tel) + * tml = pc+in(tam) + * yu = pc+srp + * fr-latin9 = pc+fr(latin9) + * us_intl = pc+us(alt-intl) + * ben(basic) = pc+in(ben) + * ben(probhat) = pc+in(ben_probhat) + * dev(basic) = pc+in(deva) + * dvorak($dvoraklayouts) = pc+%v(dvorak) + * dvorak(basic) = pc+us(dvorak) + * dvorak(pl_basic) = pc+pl(dvorak) + * dvorak(pl) = pc+pl(dvorak_quotes) + * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes) + * dzdwi(basic) = pc+bt(basic) + * fi(basic) = pc+fi(classic) + * ge(azerty_tskapo) = pc+fr(geo) + * guj(basic) = pc+in(guj) + * gur(basic) = pc+in(guru) + * ie(laptop) = pc+ie(basic) + * ie(CloGaelachLaptop) = pc+ie(CloGaelach) + * in(urd) = pc+in(urd-phonetic) + * iu(basic) = pc+ca(ike) + * lo(basic) = pc+la(basic) + * kan(basic) = pc+in(kan) + * mal(basic) = pc+in(mal) + * mal(mlplusnum) = pc+in(mal) + * ogham(basic) = pc+ie(ogam) + * ogham(laptop) = pc+ie(ogam) + * ogham(is434) = pc+ie(ogam_is434) + * ogham(is434laptop) = pc+ie(ogam_is434) + * ori(basic) = pc+in(ori) + * ro(de) = pc+ro(winkeys) + * ro(us) = pc+ro(std) + * ro(academic) = pc+ro(std) + * ro(std_comma) = pc+ro(std) + * ro(comma) = pc+ro(basic) + * ru(os) = pc+ru(os_legacy) + * pk(urd) = pc+pk(urd-phonetic) + * sapmi(basic) = pc+no(smi) + * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys) + * sapmi(sefi) = pc+fi(smi) + * sin(phonetic-static) = pc+in(sin_phonetic) + * syr(basic) = pc+sy(syc) + * syr(phonetic) = pc+sy(syc_phonetic) + * tam(INSCRIPT) = pc+in(tam) + * tam(UNI) = pc+in(tam_unicode) + * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals) + * tam(TAB) = pc+in(tam_TAB) + * tam(TSCII) = pc+in(tam_TSCII) + * tel(basic) = pc+in(tel) + * yu(basic) = pc+srp(latin) + * yu(unicode) = pc+srp(latinunicode) + * yu(yz) = pc+srp(latinyz) + * yu(unicodeyz) = pc+srp(latinunicodeyz) + ataritt $nonlatin = xfree68_vndr/ataritt(us)+%l%(v):2 + ataritt * = xfree68_vndr/ataritt(us)+%l%(v) + amiga $nonlatin = xfree68_vndr/amiga(usa1)+%l%(v):2 + amiga * = xfree68_vndr/amiga(usa1)+%l%(v) + classmate us = pc+%l(classmate) + empty * = empty(basic) + * empty = empty(basic) + sun4 $nonlatin = latin+sun_vndr/us(type4)+%l%(v):2 + sun4 * = latin+sun_vndr/us(type4)+%l%(v) + sun5 $nonlatin = latin+sun_vndr/us(type5)+%l%(v):2 + sun5 * = latin+sun_vndr/us(type5)+%l%(v) + sun6 us = pc+sun_vndr/us(type6) + sun6 en_US = pc+sun_vndr/us(type6)+iso9995-3(basic) + sun6 $sun_t6_custom = pc+sun_vndr/us(type6)+sun_vndr/%l%(v) + sun6 * = pc+sun_vndr/us(type6)+%l%(v) + sun6euro us = pc+sun_vndr/us(type6) + sun6euro en_US = pc+sun_vndr/us(type6)+iso9995-3(basic) + sun6euro $sun_t6_custom = pc+sun_vndr/us(type6)+sun_vndr/%l%(v) + sun6euro * = pc+sun_vndr/us(type6)+%l%(v) + pc98 nec_vndr/jp = nec_vndr/jp(pc98) + macintosh_old us = macintosh_vndr/us(oldmac) + macintosh_old en_US = macintosh_vndr/us(oldmac) + macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l%(v) + macintosh_old $nonlatin = macintosh_vndr/us(oldmac)+%l%(v):2 + macintosh_old * = macintosh_vndr/us(oldmac)+%l%(v) + applealu_jis jp = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)+macintosh_vndr/jp(mac):2 + applealu_jis * = macintosh_vndr/apple(alukbd)+%l%(v)+macintosh_vndr/jp(mac):2 + $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l%(v) + $applealu * = macintosh_vndr/apple(alukbd)+%l%(v) + $macs en_US = pc+macintosh_vndr/us(extended) + $macs $macvendorlayouts = pc+macintosh_vndr/%l%(v) + nokiarx44 * = nokia_vndr/rx-44(%l) + nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty) + nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l%_v) + nokiasu8w * = nokia_vndr/su-8w(%l) + olpc $olpclayouts = olpc+%l%(m) + olpc * = olpc+%l%(v) + $thinkpads br = pc+br(thinkpad) + htcdream $htcdreamlayouts = %l(htcdream) + * $nonlatin = pc+us+%l%(v):2 + * * = pc+%l%(v) + +! model layout[1] = symbols + * ar = pc+ara%(v[1]) + * ben = pc+in(ben) + * bs = pc+ba%(v[1]) + * cs = pc+rs%(v[1]) + * cz_qwerty = pc+cz(qwerty) + * dev = pc+in(deva) + * dvorak = pc+us(dvorak) + * dzdwi = pc+bt%(v[1]) + * el = pc+gr%(v[1]) + * en_US = pc+latin%(v[1]) + * guj = pc+in(guj) + * gur = pc+in(guru) + * iu = pc+ca(ike) + * lo = pc+la%(v[1]) + * kan = pc+in(kan) + * mi = pc+mao%(v[1]) + * ml = pc+in(mal) + * ogham = pc+ie(ogam) + * ori = pc+ie(ori) + * sapmi = pc+no(smi) + * sr = pc+srp%(v[1]) + * syr = pc+sy(syc) + * tel = pc+in(tel) + * tml = pc+in(tam) + * yu = pc+srp%(v[1]) + * fr-latin9 = pc+fr(latin9) + * us_intl = pc+us(alt-intl) + * ben(basic) = pc+in(ben) + * ben(probhat) = pc+in(ben_probhat) + * dev(basic) = pc+in(deva) + * dvorak($dvoraklayouts) = pc+%v(dvorak) + * dvorak(basic) = pc+us(dvorak) + * dvorak(pl_basic) = pc+pl(dvorak) + * dvorak(pl) = pc+pl(dvorak_quotes) + * dvorak(pl_altquotes) = pc+pl(dvorak_altquotes) + * dzdwi(basic) = pc+bt(basic) + * fi(basic) = pc+fi(classic) + * ge(azerty_tskapo) = pc+fr(geo) + * guj(basic) = pc+in(guj) + * gur(basic) = pc+in(guru) + * ie(laptop) = pc+ie(basic) + * ie(CloGaelachLaptop) = pc+ie(CloGaelach) + * in(urd) = pc+in(urd-phonetic) + * iu(basic) = pc+ca(ike) + * lo(basic) = pc+la(basic) + * kan(basic) = pc+in(kan) + * mal(basic) = pc+in(mal) + * mal(mlplusnum) = pc+in(mal) + * ogham(basic) = pc+ie(ogam) + * ogham(laptop) = pc+ie(ogam) + * ogham(is434) = pc+ie(ogam_is434) + * ogham(is434laptop) = pc+ie(ogam_is434) + * ori(basic) = pc+in(ori) + * ro(de) = pc+ro(winkeys) + * ro(us) = pc+ro(std) + * ro(academic) = pc+ro(std) + * ro(std_comma) = pc+ro(std) + * ro(comma) = pc+ro(basic) + * ru(os) = pc+ru(os_legacy) + * pk(urd) = pc+pk(urd-phonetic) + * sapmi(basic) = pc+no(smi) + * sapmi(nodeadkeys) = pc+no(smi_nodeadkeys) + * sapmi(sefi) = pc+fi(smi) + * sin(phonetic-static) = pc+in(sin_phonetic) + * syr(basic) = pc+sy(syc) + * syr(phonetic) = pc+sy(syc_phonetic) + * tam(INSCRIPT) = pc+in(tam) + * tam(UNI) = pc+in(tam_unicode) + * tam(NUMERAL-KEYBOARD) = pc+in(tam_keyboard_with_numerals) + * tam(TAB) = pc+in(tam_TAB) + * tam(TSCII) = pc+in(tam_TSCII) + * tel(basic) = pc+in(tel) + * yu(basic) = pc+srp(latin) + * yu(unicode) = pc+srp(latinunicode) + * yu(yz) = pc+srp(latinyz) + * yu(unicodeyz) = pc+srp(latinunicodeyz) + ataritt * = xfree68_vndr/ataritt(us)+%l[1]%(v[1]) + amiga * = xfree68_vndr/amiga(usa1)+%l[1]%(v[1]) + sun4 * = latin+sun_vndr/us(type4)+%l[1]%(v[1]) + sun5 * = latin+sun_vndr/us(type5)+%l[1]%(v[1]) + macintosh_old us = macintosh_vndr/us(oldmac) + macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l[1]%(v[1]) + macintosh_old * = macintosh_vndr/us(oldmac)+%l[1]%(v[1]) + applealu_jis us = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac) + $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l[1]%(v[1]) + $applealu * = macintosh_vndr/apple(alukbd)+%l[1]%(v[1]) + $macs $macvendorlayouts = pc+macintosh_vndr/%l[1]%(v[1]) + nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty) + nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l[1]%_v[1]) + $thinkpads br = pc+%l[1](thinkpad) + * * = pc+%l[1]%(v[1]) + +! model layout[1] variant[1] = symbols + * ben basic = pc+in(ben) + * ben probhat = pc+in(ben_probhat) + * dev basic = pc+in(deva) + * dvorak $dvoraklayouts = pc+%v(dvorak) + * dvorak basic = pc+us(dvorak) + * dvorak pl_basic = pc+pl(dvorak) + * dvorak pl = pc+pl(dvorak_quotes) + * dvorak pl_altquotes = pc+pl(dvorak_altquotes) + * dzdwi basic = pc+bt(basic) + * fi basic = pc+fi(classic) + * ge azerty_tskapo = pc+fr(geo) + * guj basic = pc+in(guj) + * gur basic = pc+in(guru) + * ie laptop = pc+ie(basic) + * ie CloGaelachLaptop = pc+ie(CloGaelach) + * in urd = pc+in(urd-phonetic) + * iu basic = pc+ca(ike) + * lo basic = pc+la(basic) + * kan basic = pc+in(kan) + * mal basic = pc+in(mal) + * mal mlplusnum = pc+in(mal) + * ogham basic = pc+ie(ogam) + * ogham laptop = pc+ie(ogam) + * ogham is434 = pc+ie(ogam_is434) + * ogham is434laptop = pc+ie(ogam_is434) + * ori basic = pc+in(ori) + * ro de = pc+ro(winkeys) + * ro us = pc+ro(std) + * ro academic = pc+ro(std) + * ro std_comma = pc+ro(std) + * ro comma = pc+ro(basic) + * ru os = pc+ru(os_legacy) + * pk urd = pc+pk(urd-phonetic) + * sapmi basic = pc+no(smi) + * sapmi nodeadkeys = pc+no(smi_nodeadkeys) + * sapmi sefi = pc+fi(smi) + * sin phonetic-static = pc+in(sin_phonetic) + * syr basic = pc+sy(syc) + * syr phonetic = pc+sy(syc_phonetic) + * tam INSCRIPT = pc+in(tam) + * tam UNI = pc+in(tam_unicode) + * tam NUMERAL-KEYBOARD = pc+in(tam_keyboard_with_numerals) + * tam TAB = pc+in(tam_TAB) + * tam TSCII = pc+in(tam_TSCII) + * tel basic = pc+in(tel) + * yu basic = pc+srp(latin) + * yu unicode = pc+srp(latinunicode) + * yu yz = pc+srp(latinyz) + * yu unicodeyz = pc+srp(latinunicodeyz) + +! model layout[2] = symbols + * ar = +ara%(v[2]):2 + * ben = +in(ben):2 + * bs = +ba%(v[2]):2 + * cs = +rs%(v[2]):2 + * cz_qwerty = +cz(qwerty):2 + * dev = +in(deva):2 + * dvorak = +us(dvorak):2 + * dzdwi = +bt%(v[2]):2 + * el = +gr%(v[2]):2 + * en_US = +latin%(v[2]):2 + * guj = +in(guj):2 + * gur = +in(guru):2 + * iu = +ca(ike):2 + * lo = +la%(v[2]):2 + * kan = +in(kan):2 + * mi = +mao%(v[2]):2 + * ml = +in(mal):2 + * ogham = +ie(ogam):2 + * ori = +ie(ori):2 + * sapmi = +no(smi):2 + * sr = +srp%(v[2]):2 + * syr = +sy(syc):2 + * tel = +in(tel):2 + * tml = +in(tam):2 + * yu = +srp%(v[2]):2 + * fr-latin9 = +fr(latin9):2 + * us_intl = +us(alt-intl):2 + * ben(basic) = +in(ben):2 + * ben(probhat) = +in(ben_probhat):2 + * dev(basic) = +in(deva):2 + * dvorak($dvoraklayouts) = +%v(dvorak):2 + * dvorak(basic) = +us(dvorak):2 + * dvorak(pl_basic) = +pl(dvorak):2 + * dvorak(pl) = +pl(dvorak_quotes):2 + * dvorak(pl_altquotes) = +pl(dvorak_altquotes):2 + * dzdwi(basic) = +bt(basic):2 + * fi(basic) = +fi(classic):2 + * ge(azerty_tskapo) = +fr(geo):2 + * guj(basic) = +in(guj):2 + * gur(basic) = +in(guru):2 + * ie(laptop) = +ie(basic):2 + * ie(CloGaelachLaptop) = +ie(CloGaelach):2 + * in(urd) = +in(urd-phonetic):2 + * iu(basic) = +ca(ike):2 + * lo(basic) = +la(basic):2 + * kan(basic) = +in(kan):2 + * mal(basic) = +in(mal):2 + * mal(mlplusnum) = +in(mal):2 + * ogham(basic) = +ie(ogam):2 + * ogham(laptop) = +ie(ogam):2 + * ogham(is434) = +ie(ogam_is434):2 + * ogham(is434laptop) = +ie(ogam_is434):2 + * ori(basic) = +in(ori):2 + * ro(de) = +ro(winkeys):2 + * ro(us) = +ro(std):2 + * ro(academic) = +ro(std):2 + * ro(std_comma) = +ro(std):2 + * ro(comma) = +ro(basic):2 + * ru(os) = +ru(os_legacy):2 + * pk(urd) = +pk(urd-phonetic):2 + * sapmi(basic) = +no(smi):2 + * sapmi(nodeadkeys) = +no(smi_nodeadkeys):2 + * sapmi(sefi) = +fi(smi):2 + * sin(phonetic-static) = +in(sin_phonetic):2 + * syr(basic) = +sy(syc):2 + * syr(phonetic) = +sy(syc_phonetic):2 + * tam(INSCRIPT) = +in(tam):2 + * tam(UNI) = +in(tam_unicode):2 + * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):2 + * tam(TAB) = +in(tam_TAB):2 + * tam(TSCII) = +in(tam_TSCII):2 + * tel(basic) = +in(tel):2 + * yu(basic) = +srp(latin):2 + * yu(unicode) = +srp(latinunicode):2 + * yu(yz) = +srp(latinyz):2 + * yu(unicodeyz) = +srp(latinunicodeyz):2 + nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):2 + nokiarx51 * = +nokia_vndr/rx-51(%l[2]%_v[2]):2 + * * = +%l[2]%(v[2]):2 + +! model layout[3] = symbols + * ar = +ara%(v[3]):3 + * ben = +in(ben):3 + * bs = +ba%(v[3]):3 + * cs = +rs%(v[3]):3 + * cz_qwerty = +cz(qwerty):3 + * dev = +in(deva):3 + * dvorak = +us(dvorak):3 + * dzdwi = +bt%(v[3]):3 + * el = +gr%(v[3]):3 + * en_US = +latin%(v[3]):3 + * guj = +in(guj):3 + * gur = +in(guru):3 + * iu = +ca(ike):3 + * lo = +la%(v[3]):3 + * kan = +in(kan):3 + * mi = +mao%(v[3]):3 + * ml = +in(mal):3 + * ogham = +ie(ogam):3 + * ori = +ie(ori):3 + * sapmi = +no(smi):3 + * sr = +srp%(v[3]):3 + * syr = +sy(syc):3 + * tel = +in(tel):3 + * tml = +in(tam):3 + * yu = +srp%(v[3]):3 + * fr-latin9 = +fr(latin9):3 + * us_intl = +us(alt-intl):3 + * ben(basic) = +in(ben):3 + * ben(probhat) = +in(ben_probhat):3 + * dev(basic) = +in(deva):3 + * dvorak($dvoraklayouts) = +%v(dvorak):3 + * dvorak(basic) = +us(dvorak):3 + * dvorak(pl_basic) = +pl(dvorak):3 + * dvorak(pl) = +pl(dvorak_quotes):3 + * dvorak(pl_altquotes) = +pl(dvorak_altquotes):3 + * dzdwi(basic) = +bt(basic):3 + * fi(basic) = +fi(classic):3 + * ge(azerty_tskapo) = +fr(geo):3 + * guj(basic) = +in(guj):3 + * gur(basic) = +in(guru):3 + * ie(laptop) = +ie(basic):3 + * ie(CloGaelachLaptop) = +ie(CloGaelach):3 + * in(urd) = +in(urd-phonetic):3 + * iu(basic) = +ca(ike):3 + * lo(basic) = +la(basic):3 + * kan(basic) = +in(kan):3 + * mal(basic) = +in(mal):3 + * mal(mlplusnum) = +in(mal):3 + * ogham(basic) = +ie(ogam):3 + * ogham(laptop) = +ie(ogam):3 + * ogham(is434) = +ie(ogam_is434):3 + * ogham(is434laptop) = +ie(ogam_is434):3 + * ori(basic) = +in(ori):3 + * ro(de) = +ro(winkeys):3 + * ro(us) = +ro(std):3 + * ro(academic) = +ro(std):3 + * ro(std_comma) = +ro(std):3 + * ro(comma) = +ro(basic):3 + * ru(os) = +ru(os_legacy):3 + * pk(urd) = +pk(urd-phonetic):3 + * sapmi(basic) = +no(smi):3 + * sapmi(nodeadkeys) = +no(smi_nodeadkeys):3 + * sapmi(sefi) = +fi(smi):3 + * sin(phonetic-static) = +in(sin_phonetic):3 + * syr(basic) = +sy(syc):3 + * syr(phonetic) = +sy(syc_phonetic):3 + * tam(INSCRIPT) = +in(tam):3 + * tam(UNI) = +in(tam_unicode):3 + * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):3 + * tam(TAB) = +in(tam_TAB):3 + * tam(TSCII) = +in(tam_TSCII):3 + * tel(basic) = +in(tel):3 + * yu(basic) = +srp(latin):3 + * yu(unicode) = +srp(latinunicode):3 + * yu(yz) = +srp(latinyz):3 + * yu(unicodeyz) = +srp(latinunicodeyz):3 + nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):3 + nokiarx51 * = +nokia_vndr/rx-51(%l[3]%_v[3]):3 + * * = +%l[3]%(v[3]):3 + +! model layout[4] = symbols + * ar = +ara%(v[4]):4 + * ben = +in(ben):4 + * bs = +ba%(v[4]):4 + * cs = +rs%(v[4]):4 + * cz_qwerty = +cz(qwerty):4 + * dev = +in(deva):4 + * dvorak = +us(dvorak):4 + * dzdwi = +bt%(v[4]):4 + * el = +gr%(v[4]):4 + * en_US = +latin%(v[4]):4 + * guj = +in(guj):4 + * gur = +in(guru):4 + * iu = +ca(ike):4 + * lo = +la%(v[4]):4 + * kan = +in(kan):4 + * mi = +mao%(v[4]):4 + * ml = +in(mal):4 + * ogham = +ie(ogam):4 + * ori = +ie(ori):4 + * sapmi = +no(smi):4 + * sr = +srp%(v[4]):4 + * syr = +sy(syc):4 + * tel = +in(tel):4 + * tml = +in(tam):4 + * yu = +srp%(v[4]):4 + * fr-latin9 = +fr(latin9):4 + * us_intl = +us(alt-intl):4 + * ben(basic) = +in(ben):4 + * ben(probhat) = +in(ben_probhat):4 + * dev(basic) = +in(deva):4 + * dvorak($dvoraklayouts) = +%v(dvorak):4 + * dvorak(basic) = +us(dvorak):4 + * dvorak(pl_basic) = +pl(dvorak):4 + * dvorak(pl) = +pl(dvorak_quotes):4 + * dvorak(pl_altquotes) = +pl(dvorak_altquotes):4 + * dzdwi(basic) = +bt(basic):4 + * fi(basic) = +fi(classic):4 + * ge(azerty_tskapo) = +fr(geo):4 + * guj(basic) = +in(guj):4 + * gur(basic) = +in(guru):4 + * ie(laptop) = +ie(basic):4 + * ie(CloGaelachLaptop) = +ie(CloGaelach):4 + * in(urd) = +in(urd-phonetic):4 + * iu(basic) = +ca(ike):4 + * lo(basic) = +la(basic):4 + * kan(basic) = +in(kan):4 + * mal(basic) = +in(mal):4 + * mal(mlplusnum) = +in(mal):4 + * ogham(basic) = +ie(ogam):4 + * ogham(laptop) = +ie(ogam):4 + * ogham(is434) = +ie(ogam_is434):4 + * ogham(is434laptop) = +ie(ogam_is434):4 + * ori(basic) = +in(ori):4 + * ro(de) = +ro(winkeys):4 + * ro(us) = +ro(std):4 + * ro(academic) = +ro(std):4 + * ro(std_comma) = +ro(std):4 + * ro(comma) = +ro(basic):4 + * ru(os) = +ru(os_legacy):4 + * pk(urd) = +pk(urd-phonetic):4 + * sapmi(basic) = +no(smi):4 + * sapmi(nodeadkeys) = +no(smi_nodeadkeys):4 + * sapmi(sefi) = +fi(smi):4 + * sin(phonetic-static) = +in(sin_phonetic):4 + * syr(basic) = +sy(syc):4 + * syr(phonetic) = +sy(syc_phonetic):4 + * tam(INSCRIPT) = +in(tam):4 + * tam(UNI) = +in(tam_unicode):4 + * tam(NUMERAL-KEYBOARD) = +in(tam_keyboard_with_numerals):4 + * tam(TAB) = +in(tam_TAB):4 + * tam(TSCII) = +in(tam_TSCII):4 + * tel(basic) = +in(tel):4 + * yu(basic) = +srp(latin):4 + * yu(unicode) = +srp(latinunicode):4 + * yu(yz) = +srp(latinyz):4 + * yu(unicodeyz) = +srp(latinunicodeyz):4 + nokiarx51 cz(qwerty) = +nokia_vndr/rx-51(cz_qwerty):4 + nokiarx51 * = +nokia_vndr/rx-51(%l[4]%_v[4]):4 + * * = +%l[4]%(v[4]):4 + +! model layout[2] variant[2] = symbols + * ben basic = +in(ben):2 + * ben probhat = +in(ben_probhat):2 + * dev basic = +in(deva):2 + * dvorak $dvoraklayouts = +%v(dvorak):2 + * dvorak basic = +us(dvorak):2 + * dvorak pl_basic = +pl(dvorak):2 + * dvorak pl = +pl(dvorak_quotes):2 + * dvorak pl_altquotes = +pl(dvorak_altquotes):2 + * dzdwi basic = +bt(basic):2 + * fi basic = +fi(classic):2 + * ge azerty_tskapo = +fr(geo):2 + * guj basic = +in(guj):2 + * gur basic = +in(guru):2 + * ie laptop = +ie(basic):2 + * ie CloGaelachLaptop = +ie(CloGaelach):2 + * in urd = +in(urd-phonetic):2 + * iu basic = +ca(ike):2 + * lo basic = +la(basic):2 + * kan basic = +in(kan):2 + * mal basic = +in(mal):2 + * mal mlplusnum = +in(mal):2 + * ogham basic = +ie(ogam):2 + * ogham laptop = +ie(ogam):2 + * ogham is434 = +ie(ogam_is434):2 + * ogham is434laptop = +ie(ogam_is434):2 + * ori basic = +in(ori):2 + * ro de = +ro(winkeys):2 + * ro us = +ro(std):2 + * ro academic = +ro(std):2 + * ro std_comma = +ro(std):2 + * ro comma = +ro(basic):2 + * ru os = +ru(os_legacy):2 + * pk urd = +pk(urd-phonetic):2 + * sapmi basic = +no(smi):2 + * sapmi nodeadkeys = +no(smi_nodeadkeys):2 + * sapmi sefi = +fi(smi):2 + * sin phonetic-static = +in(sin_phonetic):2 + * syr basic = +sy(syc):2 + * syr phonetic = +sy(syc_phonetic):2 + * tam INSCRIPT = +in(tam):2 + * tam UNI = +in(tam_unicode):2 + * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):2 + * tam TAB = +in(tam_TAB):2 + * tam TSCII = +in(tam_TSCII):2 + * tel basic = +in(tel):2 + * yu basic = +srp(latin):2 + * yu unicode = +srp(latinunicode):2 + * yu yz = +srp(latinyz):2 + * yu unicodeyz = +srp(latinunicodeyz):2 + +! model layout[3] variant[3] = symbols + * ben basic = +in(ben):3 + * ben probhat = +in(ben_probhat):3 + * dev basic = +in(deva):3 + * dvorak $dvoraklayouts = +%v(dvorak):3 + * dvorak basic = +us(dvorak):3 + * dvorak pl_basic = +pl(dvorak):3 + * dvorak pl = +pl(dvorak_quotes):3 + * dvorak pl_altquotes = +pl(dvorak_altquotes):3 + * dzdwi basic = +bt(basic):3 + * fi basic = +fi(classic):3 + * ge azerty_tskapo = +fr(geo):3 + * guj basic = +in(guj):3 + * gur basic = +in(guru):3 + * ie laptop = +ie(basic):3 + * ie CloGaelachLaptop = +ie(CloGaelach):3 + * in urd = +in(urd-phonetic):3 + * iu basic = +ca(ike):3 + * lo basic = +la(basic):3 + * kan basic = +in(kan):3 + * mal basic = +in(mal):3 + * mal mlplusnum = +in(mal):3 + * ogham basic = +ie(ogam):3 + * ogham laptop = +ie(ogam):3 + * ogham is434 = +ie(ogam_is434):3 + * ogham is434laptop = +ie(ogam_is434):3 + * ori basic = +in(ori):3 + * ro de = +ro(winkeys):3 + * ro us = +ro(std):3 + * ro academic = +ro(std):3 + * ro std_comma = +ro(std):3 + * ro comma = +ro(basic):3 + * ru os = +ru(os_legacy):3 + * pk urd = +pk(urd-phonetic):3 + * sapmi basic = +no(smi):3 + * sapmi nodeadkeys = +no(smi_nodeadkeys):3 + * sapmi sefi = +fi(smi):3 + * sin phonetic-static = +in(sin_phonetic):3 + * syr basic = +sy(syc):3 + * syr phonetic = +sy(syc_phonetic):3 + * tam INSCRIPT = +in(tam):3 + * tam UNI = +in(tam_unicode):3 + * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):3 + * tam TAB = +in(tam_TAB):3 + * tam TSCII = +in(tam_TSCII):3 + * tel basic = +in(tel):3 + * yu basic = +srp(latin):3 + * yu unicode = +srp(latinunicode):3 + * yu yz = +srp(latinyz):3 + * yu unicodeyz = +srp(latinunicodeyz):3 + +! model layout[4] variant[4] = symbols + * ben basic = +in(ben):4 + * ben probhat = +in(ben_probhat):4 + * dev basic = +in(deva):4 + * dvorak $dvoraklayouts = +%v(dvorak):4 + * dvorak basic = +us(dvorak):4 + * dvorak pl_basic = +pl(dvorak):4 + * dvorak pl = +pl(dvorak_quotes):4 + * dvorak pl_altquotes = +pl(dvorak_altquotes):4 + * dzdwi basic = +bt(basic):4 + * fi basic = +fi(classic):4 + * ge azerty_tskapo = +fr(geo):4 + * guj basic = +in(guj):4 + * gur basic = +in(guru):4 + * ie laptop = +ie(basic):4 + * ie CloGaelachLaptop = +ie(CloGaelach):4 + * in urd = +in(urd-phonetic):4 + * iu basic = +ca(ike):4 + * lo basic = +la(basic):4 + * kan basic = +in(kan):4 + * mal basic = +in(mal):4 + * mal mlplusnum = +in(mal):4 + * ogham basic = +ie(ogam):4 + * ogham laptop = +ie(ogam):4 + * ogham is434 = +ie(ogam_is434):4 + * ogham is434laptop = +ie(ogam_is434):4 + * ori basic = +in(ori):4 + * ro de = +ro(winkeys):4 + * ro us = +ro(std):4 + * ro academic = +ro(std):4 + * ro std_comma = +ro(std):4 + * ro comma = +ro(basic):4 + * ru os = +ru(os_legacy):4 + * pk urd = +pk(urd-phonetic):4 + * sapmi basic = +no(smi):4 + * sapmi nodeadkeys = +no(smi_nodeadkeys):4 + * sapmi sefi = +fi(smi):4 + * sin phonetic-static = +in(sin_phonetic):4 + * syr basic = +sy(syc):4 + * syr phonetic = +sy(syc_phonetic):4 + * tam INSCRIPT = +in(tam):4 + * tam UNI = +in(tam_unicode):4 + * tam NUMERAL-KEYBOARD = +in(tam_keyboard_with_numerals):4 + * tam TAB = +in(tam_TAB):4 + * tam TSCII = +in(tam_TSCII):4 + * tel basic = +in(tel):4 + * yu basic = +srp(latin):4 + * yu unicode = +srp(latinunicode):4 + * yu yz = +srp(latinyz):4 + * yu unicodeyz = +srp(latinunicodeyz):4 + +! model = symbols + $evdevkbds = +inet(evdev)+inet(%m) + applealu_jis = +inet(evdev)+macintosh_vndr/jp(alujiskeys) + * = +inet(evdev) + +! layout variant = compat + de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) + +! layout[1] variant[1] = compat + de neo = +caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock) + +! layout[2] variant[2] = compat + de neo = +caps(caps_lock):2+misc(assign_shift_left_action):2+level5(level5_lock):2 + +! layout[3] variant[3] = compat + de neo = +caps(caps_lock):3+misc(assign_shift_left_action):3+level5(level5_lock):3 + +! layout[4] variant[4] = compat + de neo = +caps(caps_lock):4+misc(assign_shift_left_action):4+level5(level5_lock):4 + +! model layout = compat + pc98 nec_vndr/jp = pc98(basic) + * jp = complete+japan + olpc * = olpc + * * = complete + +! model layout[1] = compat + * * = complete + +! model = types + $macs = complete+numpad(mac) + $applealu = complete+numpad(mac) + $nokiamodels = complete+nokia + * = complete + +! layout option = symbols + $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle) + * misc:typo = +typo(base) + +! layout[1] option = symbols + $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):1 + * misc:typo = +typo(base):1 + +! layout[2] option = symbols + $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):2 + * misc:typo = +typo(base):2 + +! layout[3] option = symbols + $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):3 + * misc:typo = +typo(base):3 + +! layout[4] option = symbols + $threelevellayouts grp:alts_toggle = +level3(ralt_switch_for_alts_toggle):4 + * misc:typo = +typo(base):4 + +! option = symbols + grp:shift_toggle = +group(shifts_toggle) + altwin:menu = +altwin(menu) + altwin:meta_alt = +altwin(meta_alt) + altwin:ctrl_win = +altwin(ctrl_win) + altwin:ctrl_alt_win = +altwin(ctrl_alt_win) + altwin:meta_win = +altwin(meta_win) + altwin:left_meta_win = +altwin(left_meta_win) + altwin:hyper_win = +altwin(hyper_win) + altwin:alt_super_win = +altwin(alt_super_win) + altwin:swap_lalt_lwin = +altwin(swap_lalt_lwin) + grp:switch = +group(switch) + grp:lswitch = +group(lswitch) + grp:win_switch = +group(win_switch) + grp:lwin_switch = +group(lwin_switch) + grp:rwin_switch = +group(rwin_switch) + grp:toggle = +group(toggle) + grp:shifts_toggle = +group(shifts_toggle) + grp:ctrls_toggle = +group(ctrls_toggle) + grp:alts_toggle = +group(alts_toggle) + grp:caps_toggle = +capslock(grouplock) + grp:caps_switch = +capslock(groupshift) + grp:shift_caps_toggle = +group(shift_caps_toggle) + grp:shift_caps_switch = +group(shift_caps_switch) + grp:win_menu_switch = +group(win_menu_switch) + grp:alt_caps_toggle = +group(alt_caps_toggle) + grp:alt_space_toggle = +group(alt_space_toggle) + grp:menu_toggle = +group(menu_toggle) + grp:lwin_toggle = +group(lwin_toggle) + grp:rwin_toggle = +group(rwin_toggle) + grp:lshift_toggle = +group(lshift_toggle) + grp:rshift_toggle = +group(rshift_toggle) + grp:rctrl_switch = +group(rctrl_switch) + grp:lctrl_toggle = +group(lctrl_toggle) + grp:rctrl_toggle = +group(rctrl_toggle) + grp:lalt_toggle = +group(lalt_toggle) + grp:sclk_toggle = +group(sclk_toggle) + grp:lctrl_rctrl_switch = +group(lctrl_rctrl_switch) + grp:lctrl_lwin_rctrl_menu = +group(lctrl_lwin_rctrl_menu) + grp:lctrl_lalt_toggle = +group(lctrl_lalt_toggle) + grp:rctrl_ralt_toggle = +group(rctrl_ralt_toggle) + grp:ctrl_alt_toggle = +group(ctrl_alt_toggle) + grp:ctrl_alt_toggle_bidir = +group(ctrl_alt_toggle_bidir) + grp:lctrl_lshift_toggle = +group(lctrl_lshift_toggle) + grp:rctrl_rshift_toggle = +group(rctrl_rshift_toggle) + grp:ctrl_shift_toggle = +group(ctrl_shift_toggle) + grp:ctrl_shift_toggle_bidir = +group(ctrl_shift_toggle_bidir) + grp:lalt_lshift_toggle = +group(lalt_lshift_toggle) + grp:ralt_rshift_toggle = +group(ralt_rshift_toggle) + grp:alt_shift_toggle = +group(alt_shift_toggle) + grp:alt_shift_toggle_bidir = +group(alt_shift_toggle_bidir) + lv3:switch = +level3(switch) + lv3:ralt_switch = +level3(ralt_switch) + lv3:ralt_switch_multikey = +level3(ralt_switch_multikey) + lv3:ralt_alt = +level3(ralt_alt) + lv3:lalt_switch = +level3(lalt_switch) + lv3:alt_switch = +level3(alt_switch) + lv3:menu_switch = +level3(menu_switch) + lv3:win_switch = +level3(win_switch) + lv3:lwin_switch = +level3(lwin_switch) + lv3:rwin_switch = +level3(rwin_switch) + lv3:enter_switch = +level3(enter_switch) + caps:capslock = +capslock(capslock) + caps:numlock = +capslock(numlock) + caps:shiftlock = +capslock(shiftlock) + caps:swapescape = +capslock(swapescape) + caps:escape = +capslock(escape) + caps:backspace = +capslock(backspace) + caps:super = +capslock(super) + caps:hyper = +capslock(hyper) + caps:none = +capslock(none) + caps:ctrl_modifier = +capslock(ctrl_modifier) + ctrl:nocaps = +ctrl(nocaps) + ctrl:lctrl_meta = +ctrl(lctrl_meta) + ctrl:swapcaps = +ctrl(swapcaps) + ctrl:ac_ctrl = +ctrl(ac_ctrl) + ctrl:aa_ctrl = +ctrl(aa_ctrl) + ctrl:rctrl_ralt = +ctrl(rctrl_ralt) + ctrl:menu_rctrl = +ctrl(menu_rctrl) + ctrl:ralt_rctrl = +ctrl(ralt_rctrl) + compose:ralt = +compose(ralt) + compose:lwin = +compose(lwin) + compose:rwin = +compose(rwin) + compose:menu = +compose(menu) + compose:lctrl = +compose(lctrl) + compose:rctrl = +compose(rctrl) + compose:caps = +compose(caps) + compose:102 = +compose(102) + compose:paus = +compose(paus) + compose:prsc = +compose(prsc) + compose:sclk = +compose(sclk) + srvrkeys:none = +srvr_ctrl(no_srvr_keys) + eurosign:e = +eurosign(e) + eurosign:2 = +eurosign(2) + eurosign:4 = +eurosign(4) + eurosign:5 = +eurosign(5) + rupeesign:4 = +rupeesign(4) + keypad:oss = +keypad(oss) + keypad:legacy = +keypad(legacy) + keypad:legacy_wang = +keypad(legacy_wang) + keypad:oss_wang = +keypad(oss_wang) + keypad:future = +keypad(future) + keypad:future_wang = +keypad(future_wang) + keypad:hex = +keypad(ops)+keypad(hex) + keypad:atm = +keypad(ops)+keypad(hex)+keypad(atm) + nbsp:none = +nbsp(none) + nbsp:level2 = +nbsp(level2) + nbsp:level3 = +nbsp(level3) + nbsp:level3s = +nbsp(level3s) + nbsp:level3n = +nbsp(level3n) + nbsp:level4 = +nbsp(level4) + nbsp:level4n = +nbsp(level4n) + nbsp:level4nl = +nbsp(level4nl) + japan:nicola_f_bs = +jp(nicola_f_bs) + japan:hztg_escape = +jp(hztg_escape) + kpdl:dot = +kpdl(dot) + kpdl:comma = +kpdl(comma) + kpdl:dotoss = +kpdl(dotoss) + kpdl:dotoss_latin9 = +kpdl(dotoss_latin9) + kpdl:commaoss = +kpdl(commaoss) + kpdl:momayyezoss = +kpdl(momayyezoss) + kpdl:kposs = +kpdl(kposs) + kpdl:semi = +kpdl(semi) + shift:breaks_caps = +shift(breaks_caps) + esperanto:qwerty = +epo(qwerty) + esperanto:dvorak = +epo(dvorak) + terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp) + keypad:pointerkeys = +keypad(pointerkeys) + apple:alupckeys = +macintosh_vndr/apple(alupckeys) + shift:both_capslock = +shift(both_capslock) + shift:lshift_both_capslock = +shift(lshift_both_capslock) + shift:rshift_both_capslock = +shift(rshift_both_capslock) + shift:both_capslock_cancel = +shift(both_capslock_cancel) + shift:lshift_both_capslock_cancel = +shift(lshift_both_capslock_cancel) + shift:rshift_both_capslock_cancel = +shift(rshift_both_capslock_cancel) + shift:both_shiftlock = +shift(both_shiftlock) + shift:lshift_both_shiftlock = +shift(lshift_both_shiftlock) + shift:rshift_both_shiftlock = +shift(rshift_both_shiftlock) + lv3:caps_switch = +level3(caps_switch) + lv3:bksl_switch = +level3(bksl_switch) + lv3:lsgt_switch = +level3(lsgt_switch) + lv3:caps_switch_latch = +level3(caps_switch_latch) + lv3:bksl_switch_latch = +level3(bksl_switch_latch) + lv3:lsgt_switch_latch = +level3(lsgt_switch_latch) + lv5:lsgt_switch_lock = +level5(lsgt_switch_lock) + lv5:ralt_switch_lock = +level5(ralt_switch_lock) + lv5:lwin_switch_lock = +level5(lwin_switch_lock) + lv5:rwin_switch_lock = +level5(rwin_switch_lock) + lv5:lsgt_switch_lock_cancel = +level5(lsgt_switch_lock_cancel) + lv5:ralt_switch_lock_cancel = +level5(ralt_switch_lock_cancel) + lv5:lwin_switch_lock_cancel = +level5(lwin_switch_lock_cancel) + lv5:rwin_switch_lock_cancel = +level5(rwin_switch_lock_cancel) + + + +! option = compat + grp_led:num = +lednum(group_lock) + grp_led:caps = +ledcaps(group_lock) + grp_led:scroll = +ledscroll(group_lock) + caps:shiftlock = +ledcaps(shift_lock) + grab:break_actions = +xfree86(grab_break) diff -Nru libxkbcommon-0.1.0~1/test/data/rules/groups libxkbcommon-0.1.0~2/test/data/rules/groups --- libxkbcommon-0.1.0~1/test/data/rules/groups 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/rules/groups 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,17 @@ +! $model_group = pc101 pc102 pc104 pc105 +! $layout_group = ar br cr us +! $variant_group = + +! model = keycodes + $model_group = something(%m) + * = default_keycodes + +! layout variant = symbols + $layout_group * = my_symbols+%(v) + * * = default_symbols + +! model = types + * = default_types + +! model = compat + * = default_compat diff -Nru libxkbcommon-0.1.0~1/test/data/rules/index libxkbcommon-0.1.0~2/test/data/rules/index --- libxkbcommon-0.1.0~1/test/data/rules/index 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/rules/index 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,28 @@ +! $layouts = al az br cn us + +! layout option = symbols + $layouts some:opt = +extra + +! layout[1] option = symbols + $layouts some:opt = +extra:1 + +! layout[2] option = symbols + $layouts some:opt = +extra:2 + +! layout[3] option = symbols + $layouts some:opt = +extra:3 + +! layout[4] option = symbols + $layouts some:opt = +extra:4 + +! model = symbols + * = default_symbols + +! model = keycodes + * = default_keycodes + +! model = types + * = default_types + +! model = compat + * = default_compat diff -Nru libxkbcommon-0.1.0~1/test/data/rules/multiple-options libxkbcommon-0.1.0~2/test/data/rules/multiple-options --- libxkbcommon-0.1.0~1/test/data/rules/multiple-options 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/rules/multiple-options 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,27 @@ +! model = keycodes + my_model = my_keycodes + * = default_keycodes + +! layout variant = symbols + my_layout my_variant = my_symbols+extra_variant + +! layout = symbols + my_layout = my_symbols + * = default_symbols + +! model = types + my_model = my_types + * = default_types + +! model = compat + my_model = my_compat + * = default_compat + +! option = compat + option111 = +substring + option1 = +some:compat + option11 = +group(bla) + +! option = symbols + option3 = +compose(foo)+keypad(bar) + colon:opt = +altwin(menu) diff -Nru libxkbcommon-0.1.0~1/test/data/rules/simple libxkbcommon-0.1.0~2/test/data/rules/simple --- libxkbcommon-0.1.0~1/test/data/rules/simple 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/rules/simple 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,21 @@ +! model = keycodes + my_model = my_keycodes + * = default_keycodes + +! layout variant = symbols + my_layout my_variant = my_symbols+extra_variant + +! layout = symbols + my_layout = my_symbols + * = default_symbols + +! model = types + my_model = my_types + * = default_types + +! model = compat + my_model = my_compat + * = default_compat + +! option = compat + my_option = +some:compat diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/altwin libxkbcommon-0.1.0~2/test/data/symbols/altwin --- libxkbcommon-0.1.0~1/test/data/symbols/altwin 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/altwin 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,79 @@ +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 {}; +}; + +// Control is mapped to the Win-keys (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-keys, Alt is mapped to the Win-keys, Win is mapped 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 ] }; + modifier_map Control { , }; + modifier_map Mod1 { , }; +}; + + +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 }; +}; + +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 }; +}; + +partial modifier_keys +xkb_symbols "hyper_win" { + key { [ Hyper_L ] }; + key { [ Hyper_R ] }; + modifier_map Mod4 { Hyper_L, Hyper_R }; +}; + +// Use Menu for 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 }; +}; + +partial modifier_keys +xkb_symbols "swap_lalt_lwin" { + key { type[Group1] = "ONE_LEVEL", + symbols[Group1] = [ Super_L ] }; + key { [ Alt_L, Meta_L ] }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/ca libxkbcommon-0.1.0~2/test/data/symbols/ca --- libxkbcommon-0.1.0~1/test/data/symbols/ca 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/ca 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,530 @@ +default 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" { + + name[Group1] = "French (Canada, legacy)"; + + include "ca(fr)" + + 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" { + + name[Group1] = "Canadian Multilingual (first part)"; + + include "ca(fr)" + + 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 (second 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 ] }; + +// End alphanumeric section +}; + +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" { + name[Group1] = "English (Canada)"; + include "us(basic)" +}; + +// EXTRAS: + +partial alphanumeric_keys +xkb_symbols "kut" { + + //Ejective U0313 and compose accents are from shs layout + include "ca(shs)" + + name[Group1]= "Kutenai"; + + // Alphanumeric section + + // 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 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 { [ 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)" +}; + diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/capslock libxkbcommon-0.1.0~2/test/data/symbols/capslock --- libxkbcommon-0.1.0~1/test/data/symbols/capslock 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/capslock 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,74 @@ +default partial hidden modifier_keys +xkb_symbols "capslock" { + replace key { [ Caps_Lock ] }; + modifier_map Lock { Caps_Lock }; +}; + +partial hidden modifier_keys +xkb_symbols "shiftlock" { + replace key { [ Shift_Lock ] }; + modifier_map Shift { Shift_Lock }; +}; + +partial hidden modifier_keys +xkb_symbols "grouplock" { + replace key { [ ISO_Next_Group, Caps_Lock ] }; +}; + +partial hidden modifier_keys +xkb_symbols "swapescape" { + key { [ Escape ] }; + key { [ Caps_Lock ] }; +}; + +partial hidden modifier_keys +xkb_symbols "groupshift" { + key { + type[Group1]="PC_ALT_LEVEL2", + [ Mode_switch, Caps_Lock ] + }; +}; + +partial hidden modifier_keys +xkb_symbols "escape" { + key { [ Escape ] }; +}; + +partial hidden modifier_keys +xkb_symbols "backspace" { + key { [ BackSpace ] }; +}; + +partial hidden modifier_keys +xkb_symbols "super" { + key { [ Super_L ] }; + modifier_map Mod4 { }; +}; + +partial hidden modifier_keys +xkb_symbols "hyper" { + key { [ Hyper_L ] }; + modifier_map Mod4 { }; +}; + +partial hidden modifier_keys +xkb_symbols "none" { + key { [ VoidSymbol ] }; +}; + +partial hidden modifier_keys +xkb_symbols "numlock" { + key { [ Num_Lock ] }; +}; + +// This changes the modifier behavior of the key. +// The keysym will be reset to Caps_Lock +partial hidden modifier_keys +xkb_symbols "ctrl_modifier" { + replace key { + type[Group1] = "ONE_LEVEL", + symbols[Group1] = [ Caps_Lock ], + actions[Group1] = [ SetMods(modifiers=Control) ] + }; + modifier_map Control { }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/compose libxkbcommon-0.1.0~2/test/data/symbols/compose --- libxkbcommon-0.1.0~1/test/data/symbols/compose 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/compose 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,54 @@ +partial 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 "rwin" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "menu" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "rctrl" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "lctrl" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "caps" { + key { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] }; +}; + +partial modifier_keys +xkb_symbols "102" { + key { type[Group1]="TWO_LEVEL", [ 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 ] }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/ctrl libxkbcommon-0.1.0~2/test/data/symbols/ctrl --- libxkbcommon-0.1.0~1/test/data/symbols/ctrl 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/ctrl 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,57 @@ +// eliminate the caps lock key completely (replace with control) +partial modifier_keys +xkb_symbols "nocaps" { + replace key { [ Control_L, Control_L ] }; + modifier_map Control { , }; +}; + +// replace left control with Meta +xkb_symbols "lctrl_meta" { + replace key { [ Meta_L ] }; +}; + +// swap the caps lock key with the left control key +partial modifier_keys +xkb_symbols "swapcaps" { + replace key { [ Control_L ] }; + replace key { [ Caps_Lock ] }; +}; + +// moves the control key to the middle row and the caps lock +// to 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 ] }; +}; + +// Moves the control key to the bottom row and the caps lock +// to 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 ] }; +}; + +// Right Ctrl works as Right Alt +partial modifier_keys +xkb_symbols "rctrl_ralt" { + key { symbols[Group1]= [ Alt_R ] }; +}; + +// Menu works as Right Ctrl +partial modifier_keys +xkb_symbols "menu_rctrl" { + replace key { [ Control_R, Control_R ] }; + modifier_map Control { Control_L, }; +}; + +// right alt functions as another ctrl key +partial modifier_keys +xkb_symbols "ralt_rctrl" { + replace key { type[Group1] = "TWO_LEVEL", + symbols[Group1] = [ Control_R, Control_R ] }; + modifier_map Control { }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/de libxkbcommon-0.1.0~2/test/data/symbols/de --- libxkbcommon-0.1.0~1/test/data/symbols/de 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/de 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,627 @@ +// 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 ]}; +// The unicode capital letter sharp s U+1E9E is transformed to "SS" +// to match the rules for capitalizing sharp s in german. +// If the capital sharp s is needed, delete the line +// starting with from /usr/share/X11/locale/iso8859-15/Compose. +// If both doubled S and capital sharp s are needed, use 0x1001E9E +// for capital sharp s and some free unicode codepoint like 0x1001E9C +// for doubled S. Don`t forget to change this in the Compose file, too. + + 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, dead_tilde, dead_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 ] }; + + include "kpdl(comma)" + + include "level3(ralt_switch)" +}; + +partial alphanumeric_keys +xkb_symbols "nodeadkeys" { + + // modify the basic German layout to not have any dead keys + + include "de(basic)" + name[Group1]="German (eliminate 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, grave, 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, grave, 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, dead_grave, dead_grave ] }; +}; + +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, eliminate 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 (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"; + + // 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_SEMIALPHABETIC"; + 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"; + key { [ dead_acute, dead_tilde, dead_stroke, dead_psili, dead_doubleacute, NoSymbol, dead_breve, NoSymbol ] }; + + // Middle row + // -------------------------------------------------------------- + key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC"; + 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, Undo, 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"; + 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_SEMIALPHABETIC"; + key { [ j, J, semicolon, Greek_theta, semicolon, NoSymbol, Greek_THETA, NoSymbol ] }; + key.type[Group1] = "EIGHT_LEVEL"; + + // 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, U2219, 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)" + include "level5(ralt_switch)" +}; + +// 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)"; + + // Alphanumeric section + 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, eliminate dead keys)"; + key { [ 4, dollar, onequarter, currency ] }; + + key { [ asciicircum, degree, notsign ] }; + key { [ acute, grave, cedilla ] }; + key { [ udiaeresis, Udiaeresis, diaeresis ] }; + key { [ plus, asterisk, asciitilde, macron ] }; + key { [ odiaeresis, Odiaeresis, acute ] }; + key { [ adiaeresis, Adiaeresis, asciicircum ] }; + + key { [ numbersign, apostrophe, grave ] }; +}; + +partial alphanumeric_keys +xkb_symbols "dsb" +{ + name[Group1] = "Lower Sorbian"; + include "latin(basic)" + include "level3(ralt_switch)" + include "kpdl(comma)" + 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 ] }; +}; + +partial alphanumeric_keys +xkb_symbols "dsb_qwertz" +{ + name[Group1] = "Lower Sorbian (qwertz)"; + include "latin(basic)" + include "level3(ralt_switch)" + include "kpdl(comma)" + 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 ] }; +}; + +// 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.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, 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)" +}; + +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)" +}; + +// EXTRAS: + +partial alphanumeric_keys +xkb_symbols "us" { + include "us" + + name[Group1]="German (US keyboard 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, grave, grave ] }; + key { [asciicircum, degree, notsign, notsign ] }; + + +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/eurosign libxkbcommon-0.1.0~2/test/data/symbols/eurosign --- libxkbcommon-0.1.0~1/test/data/symbols/eurosign 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/eurosign 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,23 @@ +// 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 ] }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/group libxkbcommon-0.1.0~2/test/data/symbols/group --- libxkbcommon-0.1.0~1/test/data/symbols/group 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/group 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,457 @@ +// using the group(switch) map, the right alt key temporarily chooses +// the second keyboard group (until it is released). +// +partial modifier_keys +xkb_symbols "switch" { + key { + symbols[Group1]= [ Mode_switch, Multi_key ], + virtualMods= AltGr + }; +}; + +// using the group(lswitch) map, the left alt key temporarily chooses +// the second keyboard group (until it is released). +// +partial modifier_keys +xkb_symbols "lswitch" { + key { + symbols[Group1]= [ Mode_switch, Multi_key ], + virtualMods= AltGr + }; +}; + + +// using the group(win_switch) map, both Windows'logo keys temporarily +// choose the second keyboard group (until release). If you use this +// map, you would declare you keyboard as pc101 or pc102 instead of +// pc104 or pc105. +partial modifier_keys +xkb_symbols "win_switch" { + include "group(lwin_switch)" + include "group(rwin_switch)" +}; + +// using the group(lwin_switch) map, the left Windows' logo key +// temporarily chooses the second keyboard group (until it is +// released). If you use this map, you would declare you 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 + }; +}; + +// using the group(rwin_switch) map, the right Windows' logo key +// temporarily chooses the second keyboard group (until it is +// released). If you use this map, you would declare you 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 + }; +}; + +// Right Ctrl key temporary chooses the second keyboard group. +// Needed mainly for Canadian keyboard +partial modifier_keys +xkb_symbols "rctrl_switch" { + key { + symbols[Group1]= [ Mode_switch ] + }; +}; + +// using the group(toggle) map, pressing the right alt key switches to +// the next sequential group (until the next explicit group change). +partial modifier_keys +xkb_symbols "toggle" { + virtual_modifiers AltGr; + key { + symbols[Group1]= [ ISO_Next_Group ], + virtualMods= AltGr + }; +}; + +// using the group(shifts_toggle) map, pressing both shift keys together +// locks the next or previous sequential keyboard group +// (depending on which shift is pressed first - right or left, +// correspongingly) +partial modifier_keys +xkb_symbols "shifts_toggle" { + key { [ Shift_L, ISO_Prev_Group ] }; + key { [ Shift_R, ISO_Next_Group ] }; +}; + +// using the group(shift_caps_toggle) map, pressing: +// Shift+Caps Lock toggles group +partial modifier_keys +xkb_symbols "shift_caps_toggle" { + key { [ Caps_Lock, ISO_Next_Group ] }; +}; + +// using the group(shift_caps_switch) map, pressing: +// Caps Lock selects the first group +// Shift+Caps Lock selects the last group +partial modifier_keys +xkb_symbols "shift_caps_switch" { + key { [ ISO_First_Group, ISO_Last_Group ] }; +}; + +// using the group(win_menu_switch) map, pressing: +// LWIN selects the first group +// RWIN or MENU 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 ] + }; +}; + +// using the group(lctrl_rctrl_switch) map, pressing: +// Left Control selects the first group +// Right Control 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)" +}; + + +// using the group(menu_toggle) map, pressing: +// Menu key toggles groups +// Shift+Menu acts as Menu +partial modifier_keys +xkb_symbols "menu_toggle" { + key { [ ISO_Next_Group, Menu ] }; +}; + +// using the group(lwin_toggle) map, pressing the left Windows' logo key +// toggles groups. If you use this map, you would declare you 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 ] + }; +}; + +// using the group(rwin_toggle) map, pressing the right Windows' logo key +// toggles groups. If you use this map, you would declare you 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 ] + }; +}; + +// Both Ctrls pressed together toggle group +partial modifier_keys +xkb_symbols "ctrls_toggle" { + virtual_modifiers LControl, RControl; + key { + type[Group1]="PC_RCONTROL_LEVEL2", + symbols[Group1]= [ NoSymbol, ISO_Prev_Group ], + virtualMods= LControl + }; + key { + type[Group1]="PC_LCONTROL_LEVEL2", + symbols[Group1]= [ NoSymbol, ISO_Next_Group ], + virtualMods= RControl + }; +}; + +// Both Alts pressed together toggle group +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 + }; +}; + +// Left Shift key toggles group +partial modifier_keys +xkb_symbols "lshift_toggle" { + virtual_modifiers AltGr; + key { + symbols[Group1]= [ ISO_Next_Group ], + virtualMods= AltGr + }; +}; + +// Right Shift key toggles group +partial modifier_keys +xkb_symbols "rshift_toggle" { + virtual_modifiers AltGr; + key { + symbols[Group1]= [ ISO_Next_Group ], + virtualMods= AltGr + }; +}; + +// Left Alt key toggles group +partial modifier_keys +xkb_symbols "lalt_toggle" { + virtual_modifiers AltGr; + key { + symbols[Group1]= [ ISO_Next_Group ], + virtualMods= AltGr + }; +}; + +// Left Ctrl key toggles group +partial modifier_keys +xkb_symbols "lctrl_toggle" { + virtual_modifiers AltGr; + key { + symbols[Group1]= [ ISO_Next_Group ], + virtualMods= AltGr + }; +}; + +// Right Ctrl key toggles group +partial modifier_keys +xkb_symbols "rctrl_toggle" { + virtual_modifiers AltGr; + key { + symbols[Group1]= [ ISO_Next_Group ], + virtualMods= AltGr + }; +}; + +// using the group(alt_caps_toggle) map, pressing: +// Alt+Caps Lock toggles group +// Caps Lock toggles caps lock +partial modifier_keys +xkb_symbols "alt_caps_toggle" { + key { + type="PC_ALT_LEVEL2", + symbols[Group1]= [ Caps_Lock, ISO_Next_Group] + }; +}; + +partial hidden 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 ] + }; +}; + +// using the group(sclk_toggle) map, pressing the Scroll Lock key +// toggles groups. +partial modifier_keys +xkb_symbols "sclk_toggle" { + virtual_modifiers AltGr; + key { + virtualMods= AltGr, + symbols[Group1] = [ ISO_Next_Group ] + }; +}; + +// Control_L+Win_L locks the first group (presumably Lat). +// Control_R+Menu locks 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 ] + }; +}; // lctrl_lwin_rctrl_menu diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/il libxkbcommon-0.1.0~2/test/data/symbols/il --- libxkbcommon-0.1.0~1/test/data/symbols/il 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/il 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,251 @@ +// based on a keyboard map from an 'xkb/symbols/il' file + +// This is a partial implemetation of the Israeli standard SI-1452 +// It does not implement changes to the English layout ("Alt-English"), +// as I believe that it is not the job of this layout to modify the English +// layout. +partial default alphanumeric_keys +xkb_symbols "basic" { + // uses the kbd layout in use in Israel. + + name[Group1]= "Hebrew"; + + key { [ slash, Q ] }; + key { [ apostrophe, W ] }; + key { [ hebrew_resh, R ] }; + key { [ hebrew_aleph,T ] }; + key { [ hebrew_tet, Y ] }; + key { [ hebrew_waw, U ] }; + key { [ hebrew_finalnun, I ] }; + key { [ hebrew_finalmem, O ] }; + key { [ hebrew_pe, P ] }; + + key { [ hebrew_dalet,S ] }; + key { [ hebrew_gimel,D ] }; + key { [ hebrew_kaph, F ] }; + key { [ hebrew_ayin, G ] }; + key { [ hebrew_yod, H ] }; + key { [ hebrew_chet, J ] }; + key { [ hebrew_lamed, K ] }; + key { [ hebrew_finalkaph, L ] }; + key { [ hebrew_finalpe, colon ] }; + key { [ comma, quotedbl ] }; + + key { [ hebrew_zain, Z ] }; + key { [ hebrew_samech, X ] }; + key { [ hebrew_bet, C ] }; + key { [ hebrew_he, V ] }; + key { [ hebrew_nun, B ] }; + key { [ hebrew_mem, N ] }; + key { [ hebrew_zade, M ] }; + // Mirrored: + key { [ hebrew_taw, greater ] }; + key { [ hebrew_finalzade, less ] }; + + key.type[Group1] = "THREE_LEVEL"; + + key { [ semicolon, asciitilde,0x10005b0 ]}; // Sheva + key { [ period, question, 0x10005c3 ]}; // Sof Pasuq + key { [ hebrew_qoph, E, EuroSign ]}; + key { [ hebrew_shin, A, 0x10020AA ]}; + + // The following may get overriden by the iso9995-3(basic101) symbols. + // therefore they are included here. + // Including them isn't a great idea (for instance: what if group 1 uses + // UK keyboard mapping, and maps shift-3 to sterling? This mapping won't + // preserve that, and I'm not sure that this is a good feature. + key { [ 1, exclam , 0x10005b1 ]}; // H. Segol + key { [ 2, at , 0x10005b2 ]}; // H. Patah + key { [ 3, numbersign , 0x10005b3 ]}; // H. Qamats + key { [ 4, dollar , 0x10005b4 ]}; // Hiriq + key { [ 5, percent , 0x10005b5 ]}; // Tsere + key { [ 6, asciicircum , 0x10005b6 ]}; // Segol + key { [ 7, ampersand , 0x10005b7 ]}; // Patah + key { [ 8, asterisk , 0x10005b8 ]}; // Qamats + // Mirrored: + key { [ 9, parenright , 0x10005c2 ]}; // Sin dot + key { [ 0, parenleft , 0x10005c1 ]}; // Shin dot + key { [ minus, underscore , 0x10005b9 ]}; // Holam + key { [ equal, plus , 0x10005bc ]}; // Dagesh/Shuruq + + // Mirrored: + key { [ bracketright, braceright, 0x10005bf ]}; // Rafe + key { [ bracketleft, braceleft, 0x10005bd ]}; // Meteg + + key { [ backslash, bar, 0x10005bb ]}; // Qubuts + + 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 { [ 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, VoidSymbol, 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 ] }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/in libxkbcommon-0.1.0~2/test/data/symbols/in --- libxkbcommon-0.1.0~1/test/data/symbols/in 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/in 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,1726 @@ +// This layout includes all Indian layouts, including: +// - Bengali +// - Gujarati +// - Kannada +// - Malayalam +// - Oriya +// - Tamil +// - Telugu +// - Urdu + +// Links: +// - Indic INSCRIPT keyboard layout diagrams: +// http://java.sun.com/products/jfc/tsc/articles/InputMethod/indiclayout.html +// - Bengali Baishakhi (Bengali layouts): +// - Bengali Baishakhi Inscript (Bengali layouts): +// - Bengali Bornona (Bengali layouts): +// - Uni Gitanjali (Bengali layouts): +// http://nltr.org +// - Ekusheyr Shadhinota (Bengali 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 + +// 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, dollar ] }; + 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)" +}; + +//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"; + //Top Alphanumeric row + // 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, dollar ] }; + 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 ] }; // 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 + 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, U0962 ] }; // L: la, vocalic L or lru matra` + key { [ semicolon, colon ] }; + key { [apostrophe, quotedbl ] }; + + //Z Row + key { [ U0936, U0945 ] }; // Z: sha, akaar candra + key { [ U094D, U0949 ] }; // X: halant, aakaar candra + key { [ U091A, U091B ] }; // C: ca, cha + key { [ U0921, U0922 ] }; // V: da, dha + key { [ U092C, U092D ] }; // B: ba, bha + key { [ U0928, U0923 ] }; // N: na, nha + key { [ U092E, U093D, U092E, U093D ] }; // M: ma, avagraha + key { [ comma, U0970 ] };// comma: comma, dev abbreviation sign + key { [ period, U093C ] }; // period: period, nukta + key { [ slash, question ] }; + + // begin modifier mappings +// modifier_map Shift { Shift_L }; +// modifier_map Lock { Caps_Lock }; +// modifier_map Control{ Control_L }; +// modifier_map Mod3 { Mode_switch }; + include "level3(ralt_switch)" +}; + +// based on a keyboard map from an 'xkb/symbols/ben' file + +partial alphanumeric_keys +xkb_symbols "ben" { + name[Group1]= "Bengali (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 ] }; +}; + +xkb_symbols "ben_probhat" { + name[Group1]= "Bengali (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 { [ quoteright, 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 }; + +}; + +// Bengali Baishakhi, Bengali Baishakhi Inscript, Bengali Bornona, Uni Gitanjali Layouts are added by Promathesh Mandal + +xkb_symbols "ben_baishakhi" { + name[Group1]= "Bengali (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 { [ quoteright, 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]= "Bengali (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]= "Bengali (India, Uni Gitanjali)"; + key { [ Escape ] }; + +// numbers + key { [ colon, question ] }; + key { [ 0x10009E7, 0x10009CE ] }; + key { [ 0x10009E8, quoteright ] }; + 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]= "Bengali (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 { [ quoteright, 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 ] }; +}; + +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 + }; + +}; + +// 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 ] }; + +}; + +//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"; + //Top Alphanumeric row + // 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, dollar ] }; + 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 ] }; + + // begin modifier mappings +// 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 "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 + }; +}; + +// 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 ] }; +}; + +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 + }; +}; + +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 (alternative phonetic)"; +}; + +partial alphanumeric_keys +xkb_symbols "urd-winkeys" { + include "pk(urd-nla)" + name[Group1]= "Urdu (WinKeys)"; +}; + +// 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 { [ gur_visarga ] }; + 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 ] }; +}; + +//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, dollar ] }; + key { [ 5,percent,U0A6B, percent ] }; + key { [ 6,asciicircum, U0A6C,asciicircum ] }; + key { [ 7,ampersand,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 ] }; // R: ee, ai + key { [ U0A42, U0A0A ] }; // T: u, uu + key { [ U0A30, U0A5C ] }; // Y: ra, raa + key { [ U0A26, U0A27 ] }; // U: tha, thha + key { [ U0A17, U0A18 ] }; // I:ga, gha + key { [ U0A24, U0A1F ] }; // O: ta, tha + key { [ U0A2A, U0A5E ] }; // P: pa, pha + key { [ U0A21, U0A22, bracketleft, braceleft ] }; + key { [ U0A19, U0A1E, bracketright, braceright ] }; + + //A Row + key { [ U0A4B, U0A13 ] }; // A: o, oo + key { [ U0A40, 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 ] }; // J: ja, jha + key { [ U0A15, U0A16 ] }; // K: ka, kha + key { [ U0A32, U0A25 ] }; // L: la, tha + key { [ U0A38, semicolon, colon ] }; //; 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 ] }; + +// begin modifier mappings +// 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)" +}; + +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 { [ quoteright, quotedbl ] }; + + key { [ 0x1000901, 0x100093C, 0x100093D, 0x1000950] }; + key { [ 0x1000926, 0x1000927 ] }; + key { [ 0x100091A, 0x100091B ] }; + key { [ 0x1000935, dead_V ] }; + key { [ 0x100092C, 0x100092D ] }; + key { [ 0x1000928, 0x1000923 ] }; + key { [ 0x100092E, 0x1000902 ] }; + key { [ comma, less ] }; + key { [ period, greater ] }; + key { [ slash, question ] }; + + include "level3(ralt_switch)" +}; + +partial alphanumeric_keys +xkb_symbols "eng" { + + name[Group1]= "English (India, with RupeeSign)"; + + include "us(basic)" + + 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 Sign)"; + + //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 ] }; + + // hope this includes the rupee sign at alt + 4 + + include "rupeesign(4)" + include "level3(ralt_switch)" + +}; + diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/inet libxkbcommon-0.1.0~2/test/data/symbols/inet --- libxkbcommon-0.1.0~1/test/data/symbols/inet 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/inet 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,1873 @@ +// EAK (Easy Access, Internet, Multimedia, PDA) keyboards +// Copyright (C) 2002 Stanislav Brabec +// +// Based on LinEAK project +// LinEAK - Linux support for Easy Access and Internet Keyboards +// 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' + +// All keyboards listed here should be also mentioned in +// rules/base, base.lst and base.xml. + +// Very common set of media keys +partial hidden 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 combination +partial hidden 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 +partial hidden alphanumeric_keys +xkb_symbols "acpi_common" { + key { [ XF86PowerOff ] }; + key { [ XF86Standby ] }; + key { [ XF86WakeUp ] }; + key { [ XF86Battery ] }; + key { [ XF86WLAN ] }; + key { [ XF86Sleep ] }; +}; + +// Combined sections, for simplicity +partial hidden alphanumeric_keys +xkb_symbols "media_nav_common" { + include "inet(media_common)" + include "inet(nav_common)" +}; + +partial hidden alphanumeric_keys +xkb_symbols "media_nav_acpi_common" { + include "inet(media_common)" + include "inet(nav_common)" + include "inet(acpi_common)" +}; + +partial hidden alphanumeric_keys +xkb_symbols "nav_acpi_common" { + include "inet(nav_common)" + include "inet(acpi_common)" +}; + +partial hidden 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 { [ SunOpen ] }; + 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 { [ ] }; // 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 { [ ] }; // KEY_DIRECTION + key { [ XF86RotateWindows ] }; + 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 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 Keyboard +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 Keyboard +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 Blue Line + +// 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 (alternate option) +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 Keyboard +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 Keyboard +partial alphanumeric_keys +xkb_symbols "compaqeak8" { + key { [ XF86Community ] }; + key { [ XF86Market ] }; + key { [ XF86Meeting ] }; + key { [ XF86Search ] }; + key { [ XF86News ] }; + key { [ XF86Mail ] }; + key { [ XF86HomePage ] }; + key { [ XF86WWW ] }; +}; + +// Compaq Internet Keyboard (7 keys) +partial alphanumeric_keys +xkb_symbols "compaqik7" { + key { [ XF86LightBulb ] }; + key { [ XF86Mail ] }; + key { [ XF86Search ] }; + key { [ Help ] }; + key { [ XF86VendorHome ] }; + key { [ XF86HomePage ] }; + key { [ XF86Shop ] }; +}; + +// Compaq Internet Keyboard (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 Keyboard (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 +}; + +// Laptop/notebook Compaq (eg. Presario) Internet Keyboard +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 Keyboard +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 +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 Keyboard (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 series +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 / Genius MM Keyboard 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 ] }; +}; + + +// GeniusComfy21e +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 Keyboard +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 Keyboard +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 ZT11xx +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 5xx +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 +partial hidden 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 +partial hidden 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 Keyboard +partial alphanumeric_keys +xkb_symbols "logiaccess" { + include "inet(logitech_base)" + key { [ XF86MailForward ] }; + key { [ XF86Send ] }; + key { [ XF86Messenger ] }; + key { [ XF86WebCam ] }; +}; + +// Logitech Cordless Desktop (alternate option) +partial alphanumeric_keys +xkb_symbols "logicda" { + include "inet(logitech_base)" + include "inet(logitech_set3)" +}; + +// Logitech Internet Navigator Keyboard +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 Keyboard 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 Keyboard SE (USB) +partial alphanumeric_keys +xkb_symbols "logiinkseusb" { + include "inet(logitech_base)" + include "inet(logitech_set3)" +}; + +// Logitech iTouch Cordless Keyboard (model 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 Keyboard +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 Keyboard +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 Wireless Ergonomic Keyboard 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 Keyboard 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 Keyboard +partial alphanumeric_keys +xkb_symbols "microsoftinet" { + include "inet(nav_acpi_common)" + key { [ XF86AudioStop ] }; +}; + +// Microsoft Natural Keyboard 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 Keyboard 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 Keyboard 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 Keyboard 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 + +// SK-1300 +partial alphanumeric_keys +xkb_symbols "sk1300" { + include "inet(media_common)" + key { [ XF86Eject ] }; + key { [ XF86Forward ] }; + key { [ XF86WWW ] }; + key { [ XF86Standby ] }; + key { [ XF86Back ] }; + key { [ XF86Stop ] }; +}; + +// 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 ] }; +}; + +// 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 ] }; +}; + +// 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 PC) +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 Keyboard Classic +partial alphanumeric_keys +xkb_symbols "trust" { + include "inet(media_nav_acpi_common)" + key { [ XF86ScreenSaver ] }; + key { [ XF86Eject ] }; +}; + + +// Trust Direct Access Keyboard +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 Keyboard +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 ] }; + + //first row + 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 ] }; + + //fifth row + key { [ Shift_L ] }; + key { [ space ] }; + key { [ period, period, slash, slash ] }; + key { [ Shift_R ] }; + + //modifiers + modifier_map Shift { , }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/keypad libxkbcommon-0.1.0~2/test/data/symbols/keypad --- libxkbcommon-0.1.0~1/test/data/symbols/keypad 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/keypad 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,633 @@ +partial hidden keypad_keys +xkb_symbols "overlay" { + include "keypad(overlay1)" +}; + +partial hidden keypad_keys +xkb_symbols "overlay1" { + + // Begin "Keypad" section + + 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 ] }; + + // End "Keypad" section +}; + +partial hidden keypad_keys +xkb_symbols "overlay2" { + + // Begin "Keypad" section + + 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 ] }; + + // End "Keypad" section +}; + +partial hidden default keypad_keys +xkb_symbols "x11" { +// Ungrab cancels server/keyboard/pointer grabs + key { + type="CTRL+ALT", + symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86_Ungrab ] + }; + +// 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 ] + }; + +// -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_Home, KP_7 ] }; + key { [ KP_Up, KP_8 ] }; + key { [ KP_Prior, KP_9 ] }; + +// +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_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 ] }; +}; + + +// 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, Pointer_EnableKeys ] }; + 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]="FOUR_LEVEL_X" ; + + key { [ KP_Divide, 0x1002215, 0x10000F7, XF86_Ungrab ] }; // / ∕ ÷ + key { [ KP_Multiply, 0x10022C5, 0x10000D7, XF86_ClearGrab ] }; // * ⋅ × + key { [ KP_Subtract, 0x1002212, 0x1002212, XF86_Prev_VMode ] }; // - − − + + key { [ KP_Add, 0x100002B, 0x100002B, 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 +// +// ┏━━━━━┱ ⇱ Home +// ┃Num ┃ ⇲ End +// ┃Lock⇭┃ ⇞ Page up +// ┡━━━━━╃─────┼─────┼ ⇟ Page down +// │ 7 │ 8 │ 9 │ ⇞ Page up +// │ ⇱ │ ⇧ │ ⇞ │ ⎀ 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 +// +// ┏━━━━━┱ ⇱ Home +// ┃Num ┃ ⇲ End +// ┃Lock⇭┃ ⇞ Page up +// ┡━━━━━╃─────┼─────┼ ⇟ Page down +// │ 7 │ 8 │ 9 │ ⇞ Page up +// │ ⇱ < │ ⇧ > │ ⇞ ^ │ ⎀ 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 +// +// ┏━━━━━┱ ⇱ Home +// ┃Num ┃ ⇲ End +// ┃Lock⇭┃ ⇞ Page up +// ┡━━━━━╃─────┼─────┼ ⇟ Page down +// │ 7 ⇖ │ 8 ⇑ │ 9 ⇗ │ ⇞ Page up +// │ ⇱ ↖ │ ⇧ ↑ │ ⇞ ↗ │ ⎀ 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 +// +// ┏━━━━━┱ ⇱ Home +// ┃Num ┃ ⇲ End +// ┃Lock⇭┃ ⇞ Page up +// ┡━━━━━╃─────┼─────┼ ⇟ Page down +// │ 7 ↖ │ 8 ↑ │ 9 ↗ │ ⇞ Page up +// │ ⇱ < │ ⇧ > │ ⇞ ^ │ ⎀ 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 doesn't 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 fourth level. +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 default 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 ] + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/kpdl libxkbcommon-0.1.0~2/test/data/symbols/kpdl --- libxkbcommon-0.1.0~1/test/data/symbols/kpdl 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/kpdl 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,102 @@ +// 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 ] }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/latin libxkbcommon-0.1.0~2/test/data/symbols/latin --- libxkbcommon-0.1.0~1/test/data/symbols/latin 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/latin 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,256 @@ +// 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, j, J ] }; + 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 one Latin common 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 doesn't 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 + +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/level3 libxkbcommon-0.1.0~2/test/data/symbols/level3 --- libxkbcommon-0.1.0~1/test/data/symbols/level3 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/level3 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,196 @@ +// these variants assign various XKB keycodes to ISO_Level3_Shift so that +// the third shift level can be reached +// + +// the default behavior is for the right Alt key (AltGr) to generate the +// third engraved symbol +default partial modifier_keys +xkb_symbols "ralt_switch" { + key { + type[Group1]="ONE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +// Right Alt key never chooses 3rd level. +// This option attempts to undo the effect of a layout's +// including ralt_switch. You may also want to select another +// level3 option that maps 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 { }; +}; + +partial modifier_keys +xkb_symbols "ralt_switch_multikey" { + key { + type[Group1]="TWO_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift, Multi_key ] + }; +}; + +// special case or right Alt switch - for use with grp:alts_toggle +// +partial hidden modifier_keys +xkb_symbols "ralt_switch_for_alts_toggle" { + virtual_modifiers LAlt, AlGr; + 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 + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +// using the level(alt_switch) map, either Alt key temporarily chooses +// the third shift level. (Mostly be used to imitate Mac OS functionality.) +partial modifier_keys +xkb_symbols "alt_switch" { + include "level3(lalt_switch)" + include "level3(ralt_switch)" +}; + +partial modifier_keys +xkb_symbols "lalt_switch" { + key { + type[Group1]="ONE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift ] + }; + modifier_map Mod5 { }; +}; + +// using the level(switch) map, the right Control key temporarily +// chooses the third shift level (until it is released). +partial modifier_keys +xkb_symbols "switch" { + key { + type[Group1]="ONE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +// using the level(menu_switch) map, the Menu key temporarily +// chooses the third shift level (until it is released). +partial modifier_keys +xkb_symbols "menu_switch" { + key { + type[Group1]="ONE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +// using the level3(win_switch) map, the either Windows' logo key +// temporarily chooses the third shift level. +partial modifier_keys +xkb_symbols "win_switch" { + include "level3(lwin_switch)" + include "level3(rwin_switch)" +}; + +// using the level3(lwin_switch) map, the left Windows' logo key +// temporarily chooses the third shift level. +partial modifier_keys +xkb_symbols "lwin_switch" { + key { + type[Group1]="ONE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +// using the level(rwin_switch) map, the right Windows' logo key +// temporarily chooses the third shift level. If you use this map, +// you should define 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 ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +// using the level3(enter_switch) map, the Enter key on the keypad +// temporarily 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 ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +partial modifier_keys +xkb_symbols "caps_switch" { + key { + type[Group1]="ONE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +partial modifier_keys +xkb_symbols "bksl_switch" { + key { + type[Group1]="ONE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +partial modifier_keys +xkb_symbols "lsgt_switch" { + key { + type[Group1]="ONE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +partial modifier_keys +xkb_symbols "caps_switch_latch" { + key { + type[Group1]="THREE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +partial modifier_keys +xkb_symbols "bksl_switch_latch" { + key { + type[Group1]="THREE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; + +partial modifier_keys +xkb_symbols "lsgt_switch_latch" { + key { + type[Group1]="THREE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift, ISO_Level3_Shift, ISO_Level3_Latch ] + }; + modifier_map Mod5 { ISO_Level3_Shift }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/level5 libxkbcommon-0.1.0~2/test/data/symbols/level5 --- libxkbcommon-0.1.0~1/test/data/symbols/level5 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/level5 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,147 @@ +// these variants assign various XKB keycodes to ISO_Level5_Shift so that +// the third shift level can be reached +// + +// using the level(switch) map, the right Control key temporarily +// chooses the fifth shift level (until it is released). +partial modifier_keys +xkb_symbols "rctrl_switch" { + key { + type[Group1]="ONE_LEVEL", + symbols[Group1] = [ ISO_Level5_Shift ] + }; + modifier_map Mod3 { ISO_Level5_Shift }; +}; + +partial modifier_keys +xkb_symbols "lsgt_switch" { + key { + type[Group1]="ONE_LEVEL", + symbols[Group1] = [ ISO_Level5_Shift ] + }; + modifier_map Mod3 { ISO_Level5_Shift }; +}; + +partial modifier_keys +xkb_symbols "ralt_switch" { + key { + type[Group1]="ONE_LEVEL", + symbols[Group1] = [ ISO_Level5_Shift ] + }; + modifier_map Mod3 { ISO_Level5_Shift }; +}; + + +// The following modifier keys are used to switch to the third shift and to set a +// corresponding lock, implemented as NumLock. + +partial modifier_keys +xkb_symbols "lock" { + // 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) + key.type[Group1] = "ONE_LEVEL"; + + replace key { + vmods = LevelFive, + symbols[Group1] = [ ISO_Level5_Shift ], + actions[Group1] = [ SetMods(modifiers=LevelFive) ] + }; + modifier_map Mod3 { }; + + replace key { + vmods = NumLock, + symbols[Group1] = [ NoSymbol ], + actions[Group1] = [ SetMods(modifiers=NumLock) ] + }; + modifier_map Mod2 { }; +}; + +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 ] + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/nbsp libxkbcommon-0.1.0~2/test/data/symbols/nbsp --- libxkbcommon-0.1.0~1/test/data/symbols/nbsp 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/nbsp 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,204 @@ +// Let Space key provide No-Break Space (NBSP), Narrow No-Break Space (NNBSP), +// Zero-Width Non-Joiner (ZWNJ), and Zero-Width Joiner (ZWJ) for the desired +// levels. + + +//////////////////////////////////////// +// Only Space + +partial +xkb_symbols "none" { + key { + 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 ] + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/pc libxkbcommon-0.1.0~2/test/data/symbols/pc --- libxkbcommon-0.1.0~1/test/data/symbols/pc 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/pc 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,90 @@ +default partial alphanumeric_keys modifier_keys +xkb_symbols "pc105" { + + key { [ Escape ] }; + + // the extra key on most European keyboards + key { [ less, greater, bar, brokenbar ] }; + + // these 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 ] }; + + // begin modifier mappings + modifier_map Shift { Shift_L, Shift_R }; + modifier_map Lock { Caps_Lock, ISO_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 { }; + + key { [ XF86Display ] }; + key { [ XF86KbdLightOnOff ] }; + key { [ XF86KbdBrightnessDown ] }; + key { [ XF86KbdBrightnessUp ] }; +}; + +partial hidden 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 ] }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/ru libxkbcommon-0.1.0~2/test/data/symbols/ru --- libxkbcommon-0.1.0~1/test/data/symbols/ru 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/ru 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,653 @@ +// based on +// russian standard keyboard +// AEN +// 2001/12/23 by Leon Kanter +// 2005/12/09 Valery Inozemtsev + +// Windows layout +partial default 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 ] }; + + key { [ period, comma ] }; + key { [ backslash, slash ] }; +}; + +partial hidden 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 ] }; + + key.type[group1]="TWO_LEVEL"; + + 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 WinKeys)"; + + 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 (WinKeys)"; + + 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, + 0x01000115, 0x01000114 ] }; + key { [ Cyrillic_a, Cyrillic_A, + abreve, Abreve ] }; + key { [ Cyrillic_es, Cyrillic_ES, + ccedilla, Ccedilla ] }; + + 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 +// based on +// russian standard keyboard +// Vlad Shakhov +// Last Changes 2007/10/23 by Vlad Shakhov + +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 charecters added as third level symbols to Russian keyboard layout. + +partial alphanumeric_keys +xkb_symbols "srp" { + include "ru(common)" + include "level3(ralt_switch)" + + 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 ] }; +}; + +// Mari language layout +// based on Russian standard keyboard +// http://www.marlamuter.ru/ +partial alphanumeric_keys +xkb_symbols "chm" { + include "ru(common)" + + 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_ui, Cyrillic_UI, U04F9, U04F8 ] }; + key { [ Cyrillic_n, Cyrillic_N, U04A5, U04A4 ] }; + key { [ Cyrillic_e, Cyrillic_E, U04E9, U04E8 ] }; + key { [ Cyrillic_zh, Cyrillic_ZH, U04EB, U04EA ] }; + key { [ Cyrillic_f, Cyrillic_F, UF537, UF536 ] }; + + include "level3(ralt_switch)" +}; + +// EXTRAS: + +// Church Slavonic language layout +// based on +// russian standard keyboard +// 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 diagraph 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] }; // \ / : ? (note, 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). +// Modified Russian standart keyboard with third level contains Ukrainian +// and Belorusian alphabetic letters and commonly used Unicode symbols. +// Description http://wiki.opennet.ru/RUU [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_ge, Cyrillic_GE, 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)" +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/shift libxkbcommon-0.1.0~2/test/data/symbols/shift --- libxkbcommon-0.1.0~1/test/data/symbols/shift 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/shift 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,84 @@ +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) + ] + }; +}; + +// When pressed together with another Shift key, set/release Lock. +partial modifier_keys +xkb_symbols "lshift_both_capslock" { + key { + type[Group1]="TWO_LEVEL", + symbols[Group1] = [ Shift_L, Caps_Lock ] + }; +}; +// When pressed together with another Shift key, set or unset Lock. +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)" +}; + +// Release Lock when pressed alone and set Lock when pressed with another Shift key. +partial modifier_keys +xkb_symbols "lshift_both_capslock_cancel" { + key { + type[Group1]="ALPHABETIC", + symbols[Group1] = [ Shift_L, Caps_Lock ] + }; +}; +// Release Lock when pressed alone and set Lock when pressed with another Shift key. +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)" +}; + + +// When pressed together with another Shift key, lock/unlock Shift. +partial modifier_keys +xkb_symbols "lshift_both_shiftlock" { + key { + type[Group1]="TWO_LEVEL", + symbols[Group1] = [ Shift_L, Shift_Lock ] + }; +}; +// When pressed together with another Shift key, lock/unlock Shift. +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)" +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/srvr_ctrl libxkbcommon-0.1.0~2/test/data/symbols/srvr_ctrl --- libxkbcommon-0.1.0~1/test/data/symbols/srvr_ctrl 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/srvr_ctrl 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,125 @@ +// Actions which control the server's behavior + +partial keypad_keys function_keys +xkb_symbols "xfree86" { + include "srvr_ctrl(stdkeypad)" + include "srvr_ctrl(fkey2vt)" +}; + +partial keypad_keys +xkb_symbols "stdkeypad" { + +// Ungrab cancels server/keyboard/pointer grabs + key { + type="CTRL+ALT", + symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86_Ungrab ] + }; + +// 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 ] + }; + +// -VMode switches to the previous video mode + key { + type="CTRL+ALT", + symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86_Prev_VMode ] + }; + +// +VMode switches to the next video mode + key { + type="CTRL+ALT", + symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86_Next_VMode] + }; + +}; + +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 ] }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/terminate libxkbcommon-0.1.0~2/test/data/symbols/terminate --- libxkbcommon-0.1.0~1/test/data/symbols/terminate 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/terminate 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,7 @@ +partial default modifier_keys +xkb_symbols "ctrl_alt_bksp" { + key { + type="CTRL+ALT", + symbols[Group1] = [ NoSymbol, NoSymbol, NoSymbol, NoSymbol, Terminate_Server ] + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/symbols/us libxkbcommon-0.1.0~2/test/data/symbols/us --- libxkbcommon-0.1.0~1/test/data/symbols/us 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/symbols/us 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,1337 @@ +default +partial alphanumeric_keys modifier_keys +xkb_symbols "basic" { + + name[Group1]= "English (US)"; + + // Alphanumeric section + 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 ] }; + // End alphanumeric section +}; + +partial alphanumeric_keys +xkb_symbols "euro" { + + name[Group1]= "English (US, with euro on 5)"; + + include "us(basic)" + + include "eurosign(5)" + + include "level3(ralt_switch)" +}; + + +partial alphanumeric_keys +xkb_symbols "intl" { + + name[Group1]= "English (US, international with dead keys)"; + + include "us(basic)" + + // Alphanumeric section + 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 ] }; + + 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" { + + name[Group1]= "English (US, alternative international)"; + + include "us" + + 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 ] }; + + 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)"; + + // Alphanumeric section + + 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 international 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" { + + name[Group1]= "English (Dvorak international with dead keys)"; + + include "us(dvorak)" + + 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" { + + name[Group1]= "English (Dvorak alternative international no dead keys)"; + + include "us(dvorak)" + + 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 (left handed Dvorak)"; + + 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 (right handed Dvorak)"; + + 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)"; + + // Alphanumeric section + + 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. +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 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; + key { [ numbersign, grave, dead_grave ] }; + key { [ BackSpace, BackSpace ] }; + + // upper row, left side + key { [ semicolon, colon, dead_diaeresis ] }; + key { [ comma, less, guillemotleft ] }; + key { [ period, greater, guillemotright ] }; + 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 ] }; + 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 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" }; + key { [ backslash, bar ] }; + + // lower row, left side + key { [ apostrophe, quotedbl, dead_acute ] }; +}; + +// 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" { + + name[Group1]= "Russian (US, phonetic)"; + + include "us(basic)" + +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/ . Public domain. + +partial alphanumeric_keys +xkb_symbols "colemak" { + include "us" + name[Group1]= "English (Colemak)"; + + // Alphanumeric section + 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 +// doesn't 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" { + + name[Group1]= "English (international AltGr dead keys)"; + + include "us(intl)" + +// 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 doesn't have AltGr key. The EuroSign is engraved at 5 key. + +// classmate - us(basic) +partial alphanumeric_keys +xkb_symbols "classmate" { + include "us(basic)" + name[Group1]= "USA - ClassmatePC"; + + 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 (layout toggle on multiply/divide key)"; + include "group(olpc)" +}; + +// 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"; + + // Alphanumeric section + 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 ] }; + + // End alphanumeric section +}; + +// Serbian charecters added as third level symbols to US keyboard layout. + +partial alphanumeric_keys +xkb_symbols "hbs" { + + name[Group1]= "Serbo-Croatian (US)"; + + include "us" + + key { [ grave, asciitilde ] }; + key { [ 6, dead_caron, asciicircum, asciicircum ] }; + 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, NoSymbol, guillemotright ] }; + key { [ period, greater, NoSymbol, 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)" +}; + +// EXTRAS: + +// 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, 0309 ] }; + + // 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 "extras/us(intl-unicode)" + include "level3(ralt_switch)" + + // 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]= "Couer D'alene Salish"; + + // Alphanumeric section + 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)" + + // End alphanumeric section +}; diff -Nru libxkbcommon-0.1.0~1/test/data/types/basic libxkbcommon-0.1.0~2/test/data/types/basic --- libxkbcommon-0.1.0~1/test/data/types/basic 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/types/basic 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,29 @@ +default xkb_types "basic" { + + // Fairly standard definitions for + // the four required key types + + virtual_modifiers NumLock; + + type "ONE_LEVEL" { + modifiers = None; + map[None] = Level1; + level_name[Level1]= "Any"; + }; + + type "TWO_LEVEL" { + modifiers = Shift; + map[Shift] = Level2; + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + }; + + type "ALPHABETIC" { + modifiers = Shift+Lock; + map[Shift] = Level2; + map[Lock] = Level2; + level_name[Level1] = "Base"; + level_name[Level2] = "Caps"; + }; + +}; diff -Nru libxkbcommon-0.1.0~1/test/data/types/complete libxkbcommon-0.1.0~2/test/data/types/complete --- libxkbcommon-0.1.0~1/test/data/types/complete 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/types/complete 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,9 @@ +default xkb_types "complete" { + include "basic" + include "mousekeys" + include "pc" + include "iso9995" + include "level5" + include "extra" + include "numpad" +}; diff -Nru libxkbcommon-0.1.0~1/test/data/types/extra libxkbcommon-0.1.0~2/test/data/types/extra --- libxkbcommon-0.1.0~1/test/data/types/extra 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/types/extra 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,161 @@ +partial default xkb_types "default" { + // Definition for a key type used for the czech keymap, for instance. + // Defines style a with four level shift. It is similar to 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"; + }; + + // Another four level keypad variant + // First two levels are controled by NumLock (with active Shift-ing like + // in KEYPAD). LevelThree overrides this mode, with two additional + // Shift-ed levels + // NumLock state is intentionnaly ignored when LevelThree is active + 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 Shift-ed 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"; + }; + +// Special type for keys used in Serbian Latin Unicode map +// 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; etc) + + 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"; + }; + +// type for e.g. german ssharp which is capitalized 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 at the beginning of sentences +// or nouns (nouns have a captial letter at the beginning in german). +// The ssharp key, to the right of the zero key, takes this into +// account and has a questionmark mapped on shift-ssharp since +// normally no capital version is needed. +// When typing with active capsLock, this key type is needed to +// output two capital letters S because this is the only german key +// whose capital letter is not the same as the one typed with shift. + + type "FOUR_LEVEL_PLUS_LOCK" { + modifiers = Shift+Lock+LevelThree; + map[None] = Level1; + map[Shift] = Level2; + map[LevelThree] = Level3; + map[Shift+LevelThree] = Level4; + map[Lock] = Level5; + map[Lock+Shift] = Level2; + map[Lock+LevelThree] = Level3; + map[Lock+Shift+LevelThree] = Level4; + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + level_name[Level3] = "Alt Base"; + level_name[Level4] = "Shift Alt"; + level_name[Level5] = "Lock"; + }; +}; + +// This enables the four level shifting also for the keypad. +partial xkb_types "keypad" { + virtual_modifiers LevelThree; + + type "FOUR_LEVEL_KEYPAD" { + modifiers = Shift+NumLock+LevelThree; + map[None] = Level1; + map[Shift] = Level2; + map[NumLock] = Level2; + map[Shift+NumLock] = Level1; + map[LevelThree] = Level3; + map[Shift+LevelThree] = Level4; + map[NumLock+LevelThree] = Level4; + map[Shift+NumLock+LevelThree] = Level3; + level_name[Level1] = "Base"; + level_name[Level2] = "Number"; + level_name[Level3] = "Alt Base"; + level_name[Level4] = "Alt Number"; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/types/iso9995 libxkbcommon-0.1.0~2/test/data/types/iso9995 --- libxkbcommon-0.1.0~1/test/data/types/iso9995 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/types/iso9995 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,18 @@ +partial default xkb_types "default" { + + // Definition for a key type which + // can be used to implement ISO9995 + // style level three shift + virtual_modifiers LevelThree; + + type "THREE_LEVEL" { + modifiers = Shift+LevelThree; + map[None] = Level1; + map[Shift] = Level2; + map[LevelThree] = Level3; + map[Shift+LevelThree] = Level3; + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + level_name[Level3] = "Level3"; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/types/level5 libxkbcommon-0.1.0~2/test/data/types/level5 --- libxkbcommon-0.1.0~1/test/data/types/level5 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/types/level5 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,213 @@ +partial default xkb_types "default" { + // Definition for a key type used for the czech keymap, for instance. + // Defines style a with four level shift. It is similar to 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[LevelThree+LevelFive] = Level7; + map[Shift+LevelThree+LevelFive] = Level8; + map[Lock+LevelThree+LevelFive] = Level7; + map[Lock+Shift+LevelThree+LevelFive] = Level8; + + preserve[Lock+LevelThree] = Lock; + preserve[Lock+Shift+LevelThree] = Lock; + preserve[Lock+LevelFive] = Lock; + preserve[Lock+Shift+LevelFive] = Lock; + preserve[Lock+LevelThree+LevelFive] = Lock; + preserve[Lock+Shift+LevelThree+LevelFive] = Lock; + + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + level_name[Level3] = "Alt Base"; + level_name[Level4] = "Shift Alt"; + level_name[Level5] = "X"; + level_name[Level6] = "X Shift"; + level_name[Level7] = "X Alt Base"; + level_name[Level8] = "X Shift Alt"; + }; + +}; diff -Nru libxkbcommon-0.1.0~1/test/data/types/mousekeys libxkbcommon-0.1.0~2/test/data/types/mousekeys --- libxkbcommon-0.1.0~1/test/data/types/mousekeys 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/types/mousekeys 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,10 @@ +partial default xkb_types "default" { + virtual_modifiers Alt; + + type "SHIFT+ALT" { + modifiers = Shift+Alt; + map[Shift+Alt] = Level2; + level_name[Level1] = "Base"; + level_name[Level2] = "Shift+Alt"; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/types/numpad libxkbcommon-0.1.0~2/test/data/types/numpad --- libxkbcommon-0.1.0~1/test/data/types/numpad 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/types/numpad 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,67 @@ +partial default xkb_types "pc" { + type "KEYPAD" { + modifiers = Shift+NumLock; + map[None] = Level1; + map[Shift] = Level2; + map[NumLock] = Level2; + map[Shift+NumLock] = Level1; + level_name[Level1] = "Base"; + level_name[Level2] = "Number"; + }; + include "extra(keypad)" +}; + +// On Mac keypads, level 1 and 2 are swapped +partial xkb_types "mac" { + type "KEYPAD" { + modifiers = None; + map[None] = Level2; + level_name[Level2] = "Number"; + }; + include "extra(keypad)" +}; + +partial xkb_types "microsoft" { + type "KEYPAD" { + modifiers = Shift+NumLock; + map[None] = Level1; + preserve[Shift] = Shift; + map[NumLock] = Level2; + level_name[Level1] = "Base"; + level_name[Level2] = "Number"; + }; + include "extra(keypad)" +}; + +// Swiss-German style numeric keypad: Shift and NumLock operates 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 uses +// FOUR_LEVEL_MIXED_KEYPAD so that's the one we are going to override. +partial xkb_types "shift3" { + type "FOUR_LEVEL_MIXED_KEYPAD" { + modifiers = Shift+NumLock+Control+Alt; + + // NumLock Off => navigate using cursor keys + map[None] = Level1; + + // NumLock Off + Shift pressed => select using cursor keys + preserve[Shift] = Shift; + + // NumLock On => decimal digits + map[NumLock] = Level2; + + // NumLock On + Shift pressed => auxiliary symbols, + // e.g. hexadecimal digits + map[Shift+NumLock] = Level3; + + // Ctrl + Alt, regardless of NumLock and Shift => command keys + map[Control+Alt] = Level4; + + // reverse map from levels to modifiers + level_name[Level1] = "Base"; + level_name[Level2] = "NumLock"; + level_name[Level3] = "Shift+NumLock"; + level_name[Level4] = "Ctrl+Alt"; + }; +}; diff -Nru libxkbcommon-0.1.0~1/test/data/types/pc libxkbcommon-0.1.0~2/test/data/types/pc --- libxkbcommon-0.1.0~1/test/data/types/pc 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/data/types/pc 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,115 @@ +partial default xkb_types "default" { + + // Some types that are necessary + // for a full implementation of + // a PC compatible keyboard. + virtual_modifiers Alt; + virtual_modifiers LevelThree; + virtual_modifiers LAlt; + virtual_modifiers RAlt; + virtual_modifiers RControl; + virtual_modifiers LControl; + + type "PC_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; + 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 can not use + // LevelFive as modifier, as this will take over right ctrl by default + // for all the layout and is too invasive for your average four-level user + // Needed to fix bug #9529 + // FIXME Should really use RControl but it's seems not to be enabled by + // default and touching this requires a lot of testing + type "LOCAL_EIGHT_LEVEL" { + modifiers = Shift+Lock+LevelThree+Control; + + map[None] = Level1; + map[Lock+Shift] = Level1; + map[Shift] = Level2; + map[Lock] = Level2; + + map[LevelThree] = Level3; + map[Lock+Shift+LevelThree] = Level3; + map[Shift+LevelThree] = Level4; + map[Lock+LevelThree] = Level4; + + map[Control] = Level5; + map[Lock+Shift+Control] = Level5; + map[Shift+Control] = Level6; + map[Lock+Control] = Level6; + + map[LevelThree+Control] = Level7; + map[Lock+Shift+LevelThree+Control] = Level7; + map[Shift+LevelThree+Control] = Level8; + map[Lock+LevelThree+Control] = Level8; + + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + level_name[Level3] = "Level3"; + level_name[Level4] = "Shift Level3"; + level_name[Level5] = "Ctrl"; + level_name[Level6] = "Shift Ctrl"; + level_name[Level7] = "Level3 Ctrl"; + level_name[Level8] = "Shift Level3 Ctrl"; + }; + +}; diff -Nru libxkbcommon-0.1.0~1/test/default.xkb libxkbcommon-0.1.0~2/test/default.xkb --- libxkbcommon-0.1.0~1/test/default.xkb 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/default.xkb 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -xkb_keymap { - xkb_keycodes { include "xfree86+aliases(qwerty)" }; - xkb_types { include "complete" }; - xkb_compat { include "complete" }; - xkb_symbols { include "pc+us" }; - xkb_geometry { include "pc(pc105)" }; -}; - -default xkb_keymap { - xkb_keycodes { include "xfree86+aliases(qwertz)" }; - xkb_types { include "complete" }; - xkb_compat { include "complete" }; - xkb_symbols { include "pc+de" }; - xkb_geometry { include "pc(pc105)" }; -}; diff -Nru libxkbcommon-0.1.0~1/test/filecomp.c libxkbcommon-0.1.0~2/test/filecomp.c --- libxkbcommon-0.1.0~1/test/filecomp.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/filecomp.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,84 +1,64 @@ /* -Copyright 2009 Dan Nicholson + * 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 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. + */ -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. -*/ - -#include +#include #include -#include -#include -#include -#include -#include "X11/extensions/XKBcommon.h" -#include "xkbcomp/utils.h" +#include + +#include "xkbcommon/xkbcommon.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; -static char buffer[8192]; + xkb_map_unref(keymap); + return 1; +} -int main(int argc, char *argv[]) +int +main(void) { - char *path, *name; - FILE *file; - struct xkb_desc * xkb; - int i, len, from_string = 0; - - /* Require xkb file */ - if (argc < 2) { - fprintf(stderr, "Not enough arguments\n"); - fprintf(stderr, "Usage: %s [-s] XKBFILE [NAME]\n", - argv[0]); - exit(1); - } - - i = 1; - if (strcmp(argv[1], "-s") == 0) { - from_string = 2; - i++; - } - - path = argv[i]; - name = (argc > i + 1) ? argv[i + 1] : NULL; - - file = fopen(path, "r"); - if (!file) { - fprintf(stderr, "Failed to open file \"%s\": %s\n", path, - strerror(errno)); - exit(1); - } - - if (from_string) { - len = fread(buffer, 1, sizeof buffer, file); - buffer[len] = '\0'; - xkb = xkb_compile_keymap_from_string(buffer, name); - } else { - xkb = xkb_compile_keymap_from_file(file, name); - } - fclose(file); - - if (!xkb) { - fprintf(stderr, "Failed to compile keymap\n"); - exit(1); - } + struct xkb_context *ctx = test_get_context(); + + assert(test_file(ctx, "keymaps/basic.xkb")); + /* XXX check we actually get qwertz here ... */ + assert(test_file(ctx, "keymaps/default.xkb")); + assert(test_file(ctx, "keymaps/comprehensive-plus-geom.xkb")); + assert(test_file(ctx, "keymaps/no-types.xkb")); + + assert(!test_file(ctx, "keymaps/divide-by-zero.xkb")); + assert(!test_file(ctx, "keymaps/bad.xkb")); + assert(!test_file(ctx, "does not exist")); + + xkb_context_unref(ctx); return 0; } diff -Nru libxkbcommon-0.1.0~1/test/filecomp.sh libxkbcommon-0.1.0~2/test/filecomp.sh --- libxkbcommon-0.1.0~1/test/filecomp.sh 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/filecomp.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -#!/bin/sh - -srcdir=${srcdir-.} -builddir=${builddir-.} - -name=filecomp -prog="$builddir/$name$EXEEXT" -log="$builddir/$name.log" - -compile() -{ - echo "$prog '$1' ${2+'$2'}" >>"$log" - $prog "$1" ${2+"$2"} >>"$log" 2>&1 || exit $? -} - -failcompile() -{ - echo "$prog '$1' ${2+'$2'}" >>"$log" - if $prog "$1" ${2+"$2"} >>"$log" 2>&1; then - exit 1 - fi -} - -rm -f "$log" - -compile $srcdir/basic.xkb -compile $srcdir/named.xkb -compile $srcdir/named.xkb de -compile $srcdir/named.xkb us -compile $srcdir/default.xkb - -failcompile $srcdir/basic.xkb foo -failcompile $srcdir/named.xkb foo -failcompile $srcdir/bad.xkb diff -Nru libxkbcommon-0.1.0~1/test/interactive.c libxkbcommon-0.1.0~2/test/interactive.c --- libxkbcommon-0.1.0~1/test/interactive.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/interactive.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,504 @@ +/* + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "xkbcommon/xkbcommon.h" +#include "test.h" + +struct keyboard { + char *path; + int fd; + struct xkb_state *state; + struct keyboard *next; +}; + +bool terminate; + +#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 *xkb, struct keyboard **out) +{ + int ret; + char *path; + int fd; + struct xkb_state *state; + 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(xkb); + if (!state) { + fprintf(stderr, "Couldn't create xkb state for %s\n", path); + ret = -EFAULT; + goto err_fd; + } + + kbd = calloc(1, sizeof(*kbd)); + if (!kbd) { + ret = -ENOMEM; + goto err_state; + } + + kbd->path = path; + kbd->fd = fd; + kbd->state = state; + *out = kbd; + return 0; + +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); + 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) +{ + 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, &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; + } + + 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; + } +} + +static void +print_keycode(struct keyboard *kbd, xkb_keycode_t keycode) +{ + unsigned int i; + struct xkb_keymap *keymap; + struct xkb_state *state; + + const xkb_keysym_t *syms; + unsigned int nsyms; + char s[16]; + uint32_t unicode; + xkb_group_index_t group; + xkb_mod_index_t mod; + xkb_led_index_t led; + + state = kbd->state; + keymap = xkb_state_get_map(state); + + nsyms = xkb_key_get_syms(state, keycode, &syms); + + if (nsyms <= 0) + return; + + printf("keysyms [ "); + for (i = 0; i < nsyms; i++) { + xkb_keysym_get_name(syms[i], s, sizeof(s)); + printf("%-*s ", (int)sizeof(s), s); + } + printf("] "); + + /* + * Only do this if wchar_t is UCS-4, so we can be lazy and print + * with %lc. + */ +#ifdef __STDC_ISO_10646__ + printf("unicode [ "); + for (i = 0; i < nsyms; i++) { + unicode = xkb_keysym_to_utf32(syms[i]); + printf("%lc ", (int)(unicode ? unicode : L' ')); + } + printf("] "); +#endif + + printf("groups [ "); + for (group = 0; group < xkb_map_num_groups(keymap); group++) { + if (!xkb_state_group_index_is_active(state, group, XKB_STATE_EFFECTIVE)) + continue; + printf("%s (%d) ", xkb_map_group_get_name(keymap, group), group); + } + printf("] "); + + printf("mods [ "); + for (mod = 0; mod < xkb_map_num_mods(keymap); mod++) { + if (!xkb_state_mod_index_is_active(state, mod, XKB_STATE_EFFECTIVE)) + continue; + if (xkb_key_mod_index_is_consumed(state, keycode, mod)) + printf("-%s ", xkb_map_mod_get_name(keymap, mod)); + else + printf("%s ", xkb_map_mod_get_name(keymap, mod)); + } + printf("] "); + + printf("leds [ "); + for (led = 0; led < xkb_map_num_leds(keymap); led++) { + if (!xkb_state_led_index_is_active(state, led)) + continue; + printf("%s ", xkb_map_led_get_name(keymap, led)); + } + printf("] "); + + printf("\n"); +} + +/* The meaning of the input_event 'value' field. */ +enum { + KEY_STATE_RELEASE = 0, + KEY_STATE_PRESS = 1, + KEY_STATE_REPEAT = 2, +}; + +#define EVDEV_OFFSET 8 + +static void +process_event(struct keyboard *kbd, uint16_t type, uint16_t code, int32_t value) +{ + xkb_keycode_t keycode; + struct xkb_keymap *keymap; + + if (type != EV_KEY) + return; + + keycode = EVDEV_OFFSET + code; + keymap = xkb_state_get_map(kbd->state); + + if (value == KEY_STATE_REPEAT && !xkb_key_repeats(keymap, keycode)) + return; + + if (value != KEY_STATE_RELEASE) + print_keycode(kbd, keycode); + + if (value == KEY_STATE_RELEASE) + xkb_state_update_key(kbd->state, keycode, XKB_KEY_UP); + else + xkb_state_update_key(kbd->state, keycode, XKB_KEY_DOWN); +} + +static int +read_keyboard(struct keyboard *kbd) +{ + size_t i; + ssize_t len; + struct input_event evs[16]; + size_t nevs; + + /* No fancy error checking here. */ + while ((len = read(kbd->fd, &evs, sizeof(evs))) > 0) { + nevs = len / sizeof(struct input_event); + for (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; + 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; + struct sigaction act; + + setlocale(LC_ALL, ""); + + while ((opt = getopt(argc, argv, "r:m:l:v:o:k:")) != -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 '?': + fprintf(stderr, "Usage: %s [-r ] [-m ] " + "[-l ] [-v ] [-o ]\n", + argv[0]); + fprintf(stderr, " or: %s -k \n", + argv[0]); + exit(EX_USAGE); + } + } + + ctx = test_get_context(); + if (!ctx) { + ret = -1; + fprintf(stderr, "Couldn't create xkb context\n"); + goto err_out; + } + + if (keymap_path) + keymap = test_compile_file(ctx, keymap_path); + 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; + } + + kbds = get_keyboards(keymap); + if (!kbds) { + ret = -1; + goto err_xkb; + } + + act.sa_handler = sigintr_handler; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + sigaction(SIGINT, &act, NULL); + sigaction(SIGTERM, &act, NULL); + + /* Instead of fiddling with termios.. */ + system("stty -echo"); + + ret = loop(kbds); + if (ret) + goto err_stty; + +err_stty: + system("stty echo"); + free_keyboards(kbds); +err_xkb: + xkb_map_unref(keymap); +err_ctx: + xkb_context_unref(ctx); +err_out: + exit(ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE); +} diff -Nru libxkbcommon-0.1.0~1/test/keyseq.c libxkbcommon-0.1.0~2/test/keyseq.c --- libxkbcommon-0.1.0~1/test/keyseq.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/keyseq.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,278 @@ +/* + * 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 +#include +#include + +#include + +#include "xkbcommon/xkbcommon.h" +#include "test.h" + +enum { + DOWN, + UP, + BOTH, + NEXT, + FINISH, +}; + +#define EVDEV_OFFSET 8 + +/* + * 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. + * + A sequence of keysyms that should result from this keypress. + * + * The vararg format is: + * + * + * See below for examples. + */ +static int +test_key_seq(struct xkb_keymap *keymap, ...) +{ + struct xkb_state *state; + + va_list ap; + xkb_keycode_t kc; + int op; + xkb_keysym_t keysym; + + const xkb_keysym_t *syms; + unsigned int nsyms, i; + char ksbuf[64]; + + state = xkb_state_new(keymap); + assert(state); + + va_start(ap, keymap); + + for (;;) { + kc = va_arg(ap, int) + EVDEV_OFFSET; + op = va_arg(ap, int); + + nsyms = xkb_key_get_syms(state, kc, &syms); + fprintf(stderr, "got %d syms for key 0x%x: [", 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; + } + } + + 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; + } + + va_end(ap); + xkb_state_unref(state); + return 1; + +fail: + va_end(ap); + xkb_state_unref(state); + return 0; +} + +int +main(void) +{ + struct xkb_context *ctx = test_get_context(); + struct xkb_keymap *keymap; + + assert(ctx); + keymap = test_compile_rules(ctx, "evdev", "evdev", "us,il", NULL, + "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)); + + 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)); + + /* 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)); + + /* 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_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)); + + xkb_map_unref(keymap); + xkb_context_unref(ctx); + return 0; +} diff -Nru libxkbcommon-0.1.0~1/test/keysym.c libxkbcommon-0.1.0~2/test/keysym.c --- libxkbcommon-0.1.0~1/test/keysym.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/keysym.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,82 @@ +#include +#include +#include + +#include "test.h" + +static int +test_string(const char *string, xkb_keysym_t expected) +{ + xkb_keysym_t keysym; + + keysym = xkb_keysym_from_name(string); + + 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_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\n", keysym, expected); + fprintf(stderr, "Received keysym %#x -> %s\n\n", keysym, s); + + return streq(s, expected); +} + +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_keysym(0x1008FF56, "XF86Close")); + assert(test_keysym(0x0, "NoSymbol")); + assert(test_keysym(0x1008FE20, "XF86Ungrab")); + assert(test_keysym(0x01001234, "U1234")); + + 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_9, "9")); + assert(test_utf8(XKB_KEY_KP_9, "9")); + assert(test_utf8(XKB_KEY_KP_Multiply, "*")); + assert(test_utf8(XKB_KEY_KP_Subtract, "-")); + + return 0; +} diff -Nru libxkbcommon-0.1.0~1/test/log.c libxkbcommon-0.1.0~2/test/log.c --- libxkbcommon-0.1.0~1/test/log.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/log.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,120 @@ +/* + * 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 +#include +#include +#include + +#include "test.h" +#include "xkb-priv.h" + +#pragma GCC diagnostic ignored "-Wmissing-format-attribute" + +static const char * +priority_to_string(int priority) +{ + switch (priority) { + 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, int priority, const char *fmt, va_list args) +{ + char *s; + int size; + darray_char *ls = xkb_get_user_data(ctx); + assert(ls); + + size = vasprintf(&s, fmt, args); + assert(size != -1); + + darray_append_string(*ls, priority_to_string(priority)); + 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", "warn", 1); + ret = setenv("XKB_VERBOSITY", "5", 1); + assert(ret == 0); + ctx = xkb_context_new(0); + assert(ctx); + + darray_init(log_string); + xkb_set_user_data(ctx, &log_string); + xkb_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_lvl(ctx, 5, "first verbose 5\n"); + + xkb_set_log_priority(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_lvl(ctx, 6, "second verbose 6\n"); + + xkb_set_log_verbosity(ctx, 0); + xkb_set_log_priority(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_lvl(ctx, 0, "third verbose 0\n"); + + printf("%s", log_string.item); + + assert(streq(log_string.item, + "warning: first warning: 87\n" + "error: first error: 115415\n" + "warning: first verbose 5\n" + "warning: second warning: 87\n" + "debug: second debug: hello world\n" + "info: second info\n" + "error: second error: 115415\n")); + + xkb_context_unref(ctx); + darray_free(log_string); + return 0; +} diff -Nru libxkbcommon-0.1.0~1/test/named.xkb libxkbcommon-0.1.0~2/test/named.xkb --- libxkbcommon-0.1.0~1/test/named.xkb 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/named.xkb 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -xkb_keymap "us" { - xkb_keycodes { include "xfree86+aliases(qwerty)" }; - xkb_types { include "complete" }; - xkb_compat { include "complete" }; - xkb_symbols { include "pc+us" }; - xkb_geometry { include "pc(pc105)" }; -}; - -xkb_keymap "de" { - xkb_keycodes { include "xfree86+aliases(qwertz)" }; - xkb_types { include "complete" }; - xkb_compat { include "complete" }; - xkb_symbols { include "pc+de" }; - xkb_geometry { include "pc(pc105)" }; -}; diff -Nru libxkbcommon-0.1.0~1/test/namescomp.c libxkbcommon-0.1.0~2/test/namescomp.c --- libxkbcommon-0.1.0~1/test/namescomp.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/namescomp.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -/* -Copyright 2009 Dan Nicholson - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice 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. -*/ - -#include -#include -#include -#include -#include "X11/extensions/XKBcommon.h" -#include "xkbcomp/utils.h" - -int main(int argc, char *argv[]) -{ - struct xkb_component_names ktcsg; - struct xkb_desc * xkb; - - /* Require rmlvo */ - if (argc < 6) { - fprintf(stderr, "Not enough arguments\n"); - fprintf(stderr, "Usage: %s KEYCODES TYPES COMPAT SYMBOLS GEOMETRY\n", - argv[0]); - exit(1); - } - - ktcsg.keymap = NULL; - ktcsg.keycodes = argv[1]; - ktcsg.types = argv[2]; - ktcsg.compat = argv[3]; - ktcsg.symbols = argv[4]; - ktcsg.geometry = argv[5]; - - xkb = xkb_compile_keymap_from_components(&ktcsg); - - if (!xkb) { - fprintf(stderr, "Failed to compile keymap\n"); - exit(1); - } - - return 0; -} diff -Nru libxkbcommon-0.1.0~1/test/namescomp.sh libxkbcommon-0.1.0~2/test/namescomp.sh --- libxkbcommon-0.1.0~1/test/namescomp.sh 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/namescomp.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -#!/bin/sh - -srcdir=${srcdir-.} -builddir=${builddir-.} - -name=namescomp -prog="$builddir/$name$EXEEXT" -log="$builddir/$name.log" - -compile() -{ - echo "$prog '$1' '$2' '$3' '$4' '$5'" >>"$log" - $prog "$1" "$2" "$3" "$4" "$5" >>"$log" 2>&1 || exit $? -} - -failcompile() -{ - echo "$prog '$1' '$2' '$3' '$4' '$5'" >>"$log" - if $prog "$1" "$2" "$3" "$4" "$5" >>"$log" 2>&1; then - exit 1 - fi -} - -rm -f "$log" - -compile "xfree86+aliases(qwerty)" "" "" "" "" -compile "xfree86+aliases(qwertz)" "" "" "pc+de" "" -compile "xfree86+aliases(qwerty)" "complete" "complete" "pc+us" "pc(pc105)" -compile "xfree86+aliases(qwertz)" "complete" "complete" \ - "pc+de+level3(ralt_switch_for_alts_toggle)+group(alts_toggle)" \ - "pc(pc104)" - -failcompile "" "" "" "" "" "" -failcompile "" "complete" "" "" "" "" -failcompile "" "" "complete" "" "" "" -failcompile "badnames" "complete" "complete" "pc+us" "pc(pc101)" diff -Nru libxkbcommon-0.1.0~1/test/rules-file.c libxkbcommon-0.1.0~2/test/rules-file.c --- libxkbcommon-0.1.0~1/test/rules-file.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/rules-file.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,186 @@ +/* + * 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 +#include +#include +#include + +#include "xkbcommon/xkbcommon.h" +#include "rules.h" +#include "test.h" + +struct test_data { + /* Rules file */ + const char *rules; + + /* Input */ + const char *model; + const char *layout; + const char *variant; + const char *options; + + /* Expected output */ + const char *keycodes; + const char *types; + const char *compat; + const char *symbols; + + /* Or set this if xkb_components_from_rules() should fail. */ + bool should_fail; +}; + +static bool +test_rules(struct xkb_context *ctx, struct test_data *data) +{ + bool passed; + const struct xkb_rule_names rmlvo = { + data->rules, data->model, data->layout, data->variant, data->options + }; + struct xkb_component_names *kccgst; + + fprintf(stderr, "\n\nChecking : %s\t%s\t%s\t%s\t%s\n", data->rules, + data->model, data->layout, data->variant, data->options); + + if (data->should_fail) + fprintf(stderr, "Expecting: NULL\n"); + else + fprintf(stderr, "Expecting: %s\t%s\t%s\t%s\n", + data->keycodes, data->types, data->compat, data->symbols); + + kccgst = xkb_components_from_rules(ctx, &rmlvo); + if (!kccgst) { + fprintf(stderr, "Received: NULL\n"); + return data->should_fail; + } + + fprintf(stderr, "Received : %s\t%s\t%s\t%s\n", + kccgst->keycodes, kccgst->types, kccgst->compat, kccgst->symbols); + + passed = streq(kccgst->keycodes, data->keycodes) && + streq(kccgst->types, data->types) && + streq(kccgst->compat, data->compat) && + streq(kccgst->symbols, data->symbols); + + free(kccgst->keycodes); + free(kccgst->types); + free(kccgst->compat); + free(kccgst->symbols); + free(kccgst); + + return passed; +} + +int +main(void) +{ + struct xkb_context *ctx; + const char *srcdir = getenv("srcdir"); + char *path; + + ctx = xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES); + assert(ctx); + + assert(asprintf(&path, "%s/test/data", srcdir ? srcdir : ".") > 0); + assert(xkb_context_include_path_append(ctx, test_get_path(""))); + free(path); + + struct test_data test1 = { + .rules = "simple", + + .model = "my_model", .layout = "my_layout", .variant = "my_variant", + .options = "my_option", + + .keycodes = "my_keycodes", .types = "my_types", + .compat = "my_compat+some:compat", + .symbols = "my_symbols+extra_variant", + }; + assert(test_rules(ctx, &test1)); + + struct test_data test2 = { + .rules = "simple", + + .model = "", .layout = "", .variant = "", .options = "", + + .keycodes = "default_keycodes", .types = "default_types", + .compat = "default_compat", .symbols = "default_symbols", + }; + assert(test_rules(ctx, &test2)); + + struct test_data test3 = { + .rules = "groups", + + .model = "pc104", .layout = "foo", .variant = "", .options = "", + + .keycodes = "something(pc104)", .types = "default_types", + .compat = "default_compat", .symbols = "default_symbols", + }; + assert(test_rules(ctx, &test3)); + + struct test_data test4 = { + .rules = "groups", + + .model = "foo", .layout = "ar", .variant = "bar", .options = "", + + .keycodes = "default_keycodes", .types = "default_types", + .compat = "default_compat", .symbols = "my_symbols+(bar)", + }; + assert(test_rules(ctx, &test4)); + + struct test_data test5 = { + .rules = "simple", + + .model = NULL, .layout = "my_layout,second_layout", .variant = "my_variant", + .options = "my_option", + + .should_fail = true + }; + assert(test_rules(ctx, &test5)); + + struct test_data test6 = { + .rules = "index", + + .model = "", .layout = "br,al,cn,az", .variant = "", + .options = "some:opt", + + .keycodes = "default_keycodes", .types = "default_types", + .compat = "default_compat", + .symbols = "default_symbols+extra:1+extra:2+extra:3+extra:4", + }; + assert(test_rules(ctx, &test6)); + + struct test_data test7 = { + .rules = "multiple-options", + + .model = "my_model", .layout = "my_layout", .variant = "my_variant", + .options = "option3,option1,colon:opt,option11", + + .keycodes = "my_keycodes", .types = "my_types", + .compat = "my_compat+some:compat+group(bla)", + .symbols = "my_symbols+extra_variant+compose(foo)+keypad(bar)+altwin(menu)", + }; + assert(test_rules(ctx, &test7)); + + xkb_context_unref(ctx); + return 0; +} diff -Nru libxkbcommon-0.1.0~1/test/rulescomp.c libxkbcommon-0.1.0~2/test/rulescomp.c --- libxkbcommon-0.1.0~1/test/rulescomp.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/rulescomp.c 2012-08-11 16:17:00.000000000 +0000 @@ -1,61 +1,118 @@ /* -Copyright 2009 Dan Nicholson + * 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 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. + */ -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. -*/ - -#include +#include #include -#include -#include -#include "X11/extensions/XKBcommon.h" -#include "xkbcomp/utils.h" +#include -int main(int argc, char *argv[]) +#include "xkbcommon/xkbcommon.h" +#include "test.h" + +#define BENCHMARK_ITERATIONS 1000 + +static int +test_rmlvo(struct xkb_context *context, const char *rules, + const char *model, const char *layout, + const char *variant, const char *options) { - struct xkb_rule_names rmlvo; - struct xkb_desc * xkb; + struct xkb_keymap *keymap; - /* Require rmlvo */ - if (argc < 6) { - fprintf(stderr, "Not enough arguments\n"); - fprintf(stderr, "Usage: %s RULES MODEL LAYOUT VARIANT OPTIONS\n", - argv[0]); - exit(1); + keymap = test_compile_rules(context, rules, model, layout, variant, + options); + if (keymap) { + fprintf(stderr, "Compiled '%s' '%s' '%s' '%s' '%s'\n", + rules, model, layout, variant, options); + xkb_map_unref(keymap); } - rmlvo.rules = argv[1]; - rmlvo.model = argv[2]; - rmlvo.layout = argv[3]; - rmlvo.variant = argv[4]; - rmlvo.options = argv[5]; - - xkb = xkb_compile_keymap_from_rules(&rmlvo); - - if (!xkb) { - fprintf(stderr, "Failed to compile keymap\n"); - exit(1); + return keymap != NULL; +} + +static int +test_rmlvo_silent(struct xkb_context *context, const char *rules, + const char *model, const char *layout, + const char *variant, const char *options) +{ + struct xkb_keymap *keymap; + + keymap = test_compile_rules(context, rules, model, layout, variant, + options); + if (keymap) + xkb_map_unref(keymap); + + return keymap != NULL; +} + +static void +benchmark(struct xkb_context *context) +{ + struct timespec start, stop, elapsed; + enum xkb_log_level old_prio = xkb_get_log_priority(context); + int old_verb = xkb_get_log_verbosity(context); + int i; + + xkb_set_log_priority(context, XKB_LOG_LEVEL_CRITICAL); + xkb_set_log_verbosity(context, 0); + + clock_gettime(CLOCK_MONOTONIC, &start); + for (i = 0; i < BENCHMARK_ITERATIONS; i++) + assert(test_rmlvo_silent(context, "evdev", "", "us", "", "")); + clock_gettime(CLOCK_MONOTONIC, &stop); + + xkb_set_log_priority(context, old_prio); + xkb_set_log_verbosity(context, old_verb); + + elapsed.tv_sec = stop.tv_sec - start.tv_sec; + elapsed.tv_nsec = stop.tv_nsec - start.tv_nsec; + if (elapsed.tv_nsec < 0) { + elapsed.tv_nsec += 1000000000; + elapsed.tv_sec--; } - return 0; + fprintf(stderr, "compiled %d keymaps in %ld.%09lds\n", + BENCHMARK_ITERATIONS, elapsed.tv_sec, elapsed.tv_nsec); +} + +int main(int argc, char *argv[]) +{ + struct xkb_context *ctx = test_get_context(); + + assert(ctx); + + assert(test_rmlvo(ctx, "evdev", "pc105", "us,il,ru,ca", ",,,multix", "grp:alts_toggle,ctrl:nocaps,compose:rwin")); + assert(test_rmlvo(ctx, "evdev", "", "us", "", "")); + assert(test_rmlvo(ctx, "evdev", "pc105", "us", "intl", "")); + assert(test_rmlvo(ctx, "evdev", "pc105", "us", "intl", "grp:alts_toggle")); + + assert(!test_rmlvo(ctx, "base", "", "", "", "")); + assert(!test_rmlvo(ctx, "base", "pc105", "", "", "")); + assert(!test_rmlvo(ctx, "badrules", "", "us", "", "")); + + if (argc > 1 && streq(argv[1], "bench")) + benchmark(ctx); + + xkb_context_unref(ctx); } diff -Nru libxkbcommon-0.1.0~1/test/rulescomp.sh libxkbcommon-0.1.0~2/test/rulescomp.sh --- libxkbcommon-0.1.0~1/test/rulescomp.sh 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/rulescomp.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -#!/bin/sh - -srcdir=${srcdir-.} -builddir=${builddir-.} - -name=rulescomp -prog="$builddir/$name$EXEEXT" -log="$builddir/$name.log" - -compile() -{ - echo "$prog '$1' '$2' '$3' '$4' '$5'" >>"$log" - $prog "$1" "$2" "$3" "$4" "$5" >>"$log" 2>&1 || exit $? -} - -failcompile() -{ - echo "$prog '$1' '$2' '$3' '$4' '$5'" >>"$log" - if $prog "$1" "$2" "$3" "$4" "$5" >>"$log" 2>&1; then - exit 1 - fi -} - -rm -f "$log" - -compile base pc105 us "" "" -compile base "" us "" "" -compile evdev pc105 us intl "" -compile evdev pc105 us intl grp:alts_toggle - -failcompile "" "" "" "" "" "" -failcompile base "" "" "" "" "" -failcompile base pc105 "" "" "" "" -failcompile badrules "" us "" "" "" diff -Nru libxkbcommon-0.1.0~1/test/state.c libxkbcommon-0.1.0~2/test/state.c --- libxkbcommon-0.1.0~1/test/state.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/state.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,287 @@ +/* + * 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 +#include +#include +#include + +#include "xkbcommon/xkbcommon.h" +#include "test.h" + +/* Offset between evdev keycodes (where KEY_ESCAPE is 1), and the evdev XKB + * keycode set (where ESC is 9). */ +#define EVDEV_OFFSET 8 + +static void +print_state(struct xkb_state *state) +{ + struct xkb_keymap *keymap; + xkb_group_index_t group; + xkb_mod_index_t mod; + xkb_led_index_t led; + + group = xkb_state_serialize_group(state, XKB_STATE_EFFECTIVE); + mod = xkb_state_serialize_mods(state, XKB_STATE_EFFECTIVE); + /* led = xkb_state_serialize_leds(state, XKB_STATE_EFFECTIVE); */ + if (!group && !mod /* && !led */) { + fprintf(stderr, "\tno state\n"); + return; + } + + keymap = xkb_state_get_map(state); + + for (group = 0; group < xkb_map_num_groups(keymap); group++) { + if (!xkb_state_group_index_is_active(state, group, XKB_STATE_EFFECTIVE)) + continue; + fprintf(stderr, "\tgroup %s (%d): %s%s%s%s\n", + xkb_map_group_get_name(keymap, group), + group, + xkb_state_group_index_is_active(state, group, XKB_STATE_EFFECTIVE) ? + "effective " : "", + xkb_state_group_index_is_active(state, group, XKB_STATE_DEPRESSED) ? + "depressed " : "", + xkb_state_group_index_is_active(state, group, XKB_STATE_LATCHED) ? + "latched " : "", + xkb_state_group_index_is_active(state, group, XKB_STATE_LOCKED) ? + "locked " : ""); + } + + for (mod = 0; mod < xkb_map_num_mods(keymap); mod++) { + if (!xkb_state_mod_index_is_active(state, mod, XKB_STATE_EFFECTIVE)) + continue; + fprintf(stderr, "\tmod %s (%d): %s%s%s\n", + xkb_map_mod_get_name(keymap, mod), + mod, + xkb_state_mod_index_is_active(state, mod, XKB_STATE_DEPRESSED) ? + "depressed " : "", + xkb_state_mod_index_is_active(state, mod, XKB_STATE_LATCHED) ? + "latched " : "", + xkb_state_mod_index_is_active(state, mod, XKB_STATE_LOCKED) ? + "locked " : ""); + } + + for (led = 0; led < xkb_map_num_leds(keymap); led++) { + if (!xkb_state_led_index_is_active(state, led)) + continue; + fprintf(stderr, "\tled %s (%d): active\n", + xkb_map_led_get_name(keymap, led), + led); + } +} + +static void +test_update_key(struct xkb_keymap *keymap) +{ + struct xkb_state *state = xkb_state_new(keymap); + const xkb_keysym_t *syms; + int num_syms; + + assert(state); + + /* LCtrl down */ + xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_DOWN); + fprintf(stderr, "dumping state for LCtrl down:\n"); + print_state(state); + assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CTRL, + XKB_STATE_DEPRESSED)); + + /* LCtrl + RAlt down */ + xkb_state_update_key(state, KEY_RIGHTALT + EVDEV_OFFSET, XKB_KEY_DOWN); + fprintf(stderr, "dumping state for LCtrl + RAlt down:\n"); + print_state(state); + assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CTRL, + XKB_STATE_DEPRESSED)); + assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_ALT, + XKB_STATE_DEPRESSED)); + assert(xkb_state_mod_names_are_active(state, XKB_STATE_DEPRESSED, + XKB_STATE_MATCH_ALL, + XKB_MOD_NAME_CTRL, + XKB_MOD_NAME_ALT, + NULL)); + assert(!xkb_state_mod_names_are_active(state, XKB_STATE_DEPRESSED, + XKB_STATE_MATCH_ALL, + XKB_MOD_NAME_ALT, + NULL)); + assert(xkb_state_mod_names_are_active(state, XKB_STATE_DEPRESSED, + (XKB_STATE_MATCH_ANY | + XKB_STATE_MATCH_NON_EXCLUSIVE), + XKB_MOD_NAME_ALT, + NULL)); + + /* RAlt down */ + xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_UP); + fprintf(stderr, "dumping state for RAlt down:\n"); + print_state(state); + assert(!xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CTRL, + XKB_STATE_EFFECTIVE)); + assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_ALT, + XKB_STATE_DEPRESSED)); + assert(xkb_state_mod_names_are_active(state, XKB_STATE_DEPRESSED, + XKB_STATE_MATCH_ANY, + XKB_MOD_NAME_CTRL, + XKB_MOD_NAME_ALT, + NULL)); + + /* none down */ + xkb_state_update_key(state, KEY_RIGHTALT + EVDEV_OFFSET, XKB_KEY_UP); + assert(!xkb_state_mod_name_is_active(state, XKB_MOD_NAME_ALT, + XKB_STATE_EFFECTIVE)); + + /* Caps locked */ + xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN); + xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP); + fprintf(stderr, "dumping state for Caps Lock:\n"); + print_state(state); + assert(xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS, + XKB_STATE_LOCKED)); + assert(xkb_state_led_name_is_active(state, XKB_LED_NAME_CAPS)); + num_syms = xkb_key_get_syms(state, KEY_Q + EVDEV_OFFSET, &syms); + assert(num_syms == 1 && syms[0] == XKB_KEY_Q); + + /* Caps unlocked */ + xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN); + xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP); + assert(!xkb_state_mod_name_is_active(state, XKB_MOD_NAME_CAPS, + XKB_STATE_EFFECTIVE)); + assert(!xkb_state_led_name_is_active(state, XKB_LED_NAME_CAPS)); + num_syms = xkb_key_get_syms(state, KEY_Q + EVDEV_OFFSET, &syms); + assert(num_syms == 1 && syms[0] == XKB_KEY_q); + + xkb_state_unref(state); +} + +static void +test_serialisation(struct xkb_keymap *keymap) +{ + struct xkb_state *state = xkb_state_new(keymap); + xkb_mod_mask_t base_mods; + xkb_mod_mask_t latched_mods; + xkb_mod_mask_t locked_mods; + xkb_mod_mask_t effective_mods; + xkb_mod_index_t caps, shift, ctrl; + xkb_group_index_t base_group = 0; + xkb_group_index_t latched_group = 0; + xkb_group_index_t locked_group = 0; + + assert(state); + + caps = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CAPS); + assert(caps != XKB_MOD_INVALID); + shift = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_SHIFT); + assert(shift != XKB_MOD_INVALID); + ctrl = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CTRL); + assert(ctrl != XKB_MOD_INVALID); + + xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_DOWN); + xkb_state_update_key(state, KEY_CAPSLOCK + EVDEV_OFFSET, XKB_KEY_UP); + base_mods = xkb_state_serialize_mods(state, XKB_STATE_DEPRESSED); + assert(base_mods == 0); + latched_mods = xkb_state_serialize_mods(state, XKB_STATE_LATCHED); + assert(latched_mods == 0); + locked_mods = xkb_state_serialize_mods(state, XKB_STATE_LOCKED); + assert(locked_mods == (1 << caps)); + effective_mods = xkb_state_serialize_mods(state, XKB_STATE_EFFECTIVE); + assert(effective_mods == locked_mods); + + xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN); + base_mods = xkb_state_serialize_mods(state, XKB_STATE_DEPRESSED); + assert(base_mods == (1 << shift)); + latched_mods = xkb_state_serialize_mods(state, XKB_STATE_LATCHED); + assert(latched_mods == 0); + locked_mods = xkb_state_serialize_mods(state, XKB_STATE_LOCKED); + assert(locked_mods == (1 << caps)); + effective_mods = xkb_state_serialize_mods(state, XKB_STATE_EFFECTIVE); + assert(effective_mods == (base_mods | locked_mods)); + + base_mods |= (1 << ctrl); + xkb_state_update_mask(state, base_mods, latched_mods, locked_mods, + base_group, latched_group, locked_group); + + assert(xkb_state_mod_index_is_active(state, ctrl, XKB_STATE_DEPRESSED)); + assert(xkb_state_mod_index_is_active(state, ctrl, XKB_STATE_EFFECTIVE)); + + xkb_state_unref(state); +} + +static void +test_repeat(struct xkb_keymap *keymap) +{ + assert(!xkb_key_repeats(keymap, KEY_LEFTSHIFT + 8)); + assert(xkb_key_repeats(keymap, KEY_A + 8)); + assert(xkb_key_repeats(keymap, KEY_8 + 8)); + assert(xkb_key_repeats(keymap, KEY_DOWN + 8)); + assert(xkb_key_repeats(keymap, KEY_KBDILLUMDOWN + 8)); +} + +static void +test_consume(struct xkb_keymap *keymap) +{ + struct xkb_state *state = xkb_state_new(keymap); + xkb_mod_index_t alt, shift; + xkb_mod_mask_t mask; + + assert(state); + + alt = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_ALT); + assert(alt != XKB_MOD_INVALID); + shift = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_SHIFT); + assert(shift != XKB_MOD_INVALID); + + xkb_state_update_key(state, KEY_LEFTALT + EVDEV_OFFSET, XKB_KEY_DOWN); + xkb_state_update_key(state, KEY_LEFTSHIFT + EVDEV_OFFSET, XKB_KEY_DOWN); + xkb_state_update_key(state, KEY_EQUAL + EVDEV_OFFSET, XKB_KEY_DOWN); + + fprintf(stderr, "dumping state for Alt-Shift-+\n"); + print_state(state); + + mask = xkb_state_serialize_mods(state, XKB_STATE_EFFECTIVE); + assert(mask == ((1 << alt) | (1 << shift))); + mask = xkb_key_mod_mask_remove_consumed(state, KEY_EQUAL + EVDEV_OFFSET, + mask); + assert(mask == (1 << alt)); + + xkb_state_unref(state); +} + +int +main(void) +{ + struct xkb_context *context = test_get_context(); + struct xkb_keymap *keymap; + + assert(context); + + keymap = test_compile_rules(context, "evdev", "pc104", "us", NULL, NULL); + assert(keymap); + + test_update_key(keymap); + test_serialisation(keymap); + test_repeat(keymap); + test_consume(keymap); + + xkb_map_unref(keymap); + xkb_context_unref(context); +} diff -Nru libxkbcommon-0.1.0~1/test/stringcomp.c libxkbcommon-0.1.0~2/test/stringcomp.c --- libxkbcommon-0.1.0~1/test/stringcomp.c 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/stringcomp.c 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,81 @@ +/* + * 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 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. + */ + +#include +#include +#include + +#include "xkbcommon/xkbcommon.h" +#include "test.h" + +#define DATA_PATH "keymaps/stringcomp.data" + +int +main(int argc, char *argv[]) +{ + struct xkb_context *ctx = test_get_context(); + struct xkb_keymap *keymap; + char *original, *dump; + + assert(ctx); + + /* Load in a prebuilt keymap, make sure we can compile it from a string, + * then compare it to make sure we get the same result when dumping it + * to a string. */ + original = test_read_file(DATA_PATH); + assert(original); + + keymap = test_compile_string(ctx, original); + assert(keymap); + + dump = xkb_map_get_as_string(keymap); + 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 %zu, original %zu\n", + strlen(dump), strlen(original)); + fprintf(stderr, "dumped map:\n"); + fprintf(stderr, "%s\n", dump); + fflush(stderr); + assert(0); + } + + free(original); + free(dump); + xkb_map_unref(keymap); + + /* Make sure we can't (falsely claim to) compile an empty string. */ + keymap = test_compile_string(ctx, ""); + assert(!keymap); + + xkb_context_unref(ctx); + + return 0; +} diff -Nru libxkbcommon-0.1.0~1/test/test.h libxkbcommon-0.1.0~2/test/test.h --- libxkbcommon-0.1.0~1/test/test.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/test.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,47 @@ +/* + * Copyright © 2012 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. + * + * Author: Daniel Stone + */ + +#include "xkbcommon/xkbcommon.h" +#include "utils.h" + +const char * +test_get_path(const char *path_rel); + +char * +test_read_file(const char *path_rel); + +struct xkb_context * +test_get_context(void); + +struct xkb_keymap * +test_compile_file(struct xkb_context *context, const char *path_rel); + +struct xkb_keymap * +test_compile_string(struct xkb_context *context, const char *string); + +struct xkb_keymap * +test_compile_rules(struct xkb_context *context, const char *rules, + const char *model, const char *layout, const char *variant, + const char *options); diff -Nru libxkbcommon-0.1.0~1/test/xkey.c libxkbcommon-0.1.0~2/test/xkey.c --- libxkbcommon-0.1.0~1/test/xkey.c 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/xkey.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -#include "xkbmisc.h" -#include "X11/extensions/XKBcommon.h" -#include -#include -#include - -static void print_keysym(const char *s) -{ - KeySym ks = xkb_string_to_keysym(s); - if (ks == NoSymbol) - printf("NoSymbol\n"); - else - printf("0x%lX\n", ks); -} - -static void print_string(KeySym ks) -{ - char s[16]; - - xkb_keysym_to_string(ks, s, sizeof s); - printf("%s\n", s); -} - -int main(int argc, char *argv[]) -{ - int mode; - KeySym sym; - - if (argc < 3) { - fprintf(stderr, "error: not enough arguments\n"); - exit(EXIT_FAILURE); - } - - if (strcmp(argv[1], "-k") == 0) { - mode = 0; - sym = strtoul(argv[2], NULL, 16); - } - else if (strcmp(argv[1], "-s") == 0) - mode = 1; - else { - fprintf(stderr, "error: unrecognized argument \"%s\"\n", argv[1]); - exit(EXIT_FAILURE); - } - - if (mode == 0) - print_string(sym); - else - print_keysym(argv[2]); - - return 0; -} diff -Nru libxkbcommon-0.1.0~1/test/xkey.sh libxkbcommon-0.1.0~2/test/xkey.sh --- libxkbcommon-0.1.0~1/test/xkey.sh 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/test/xkey.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -#!/bin/sh - -srcdir=${srcdir-.} -builddir=${builddir-.} - -name=xkey -prog="$builddir/$name$EXEEXT" -log="$builddir/$name.log" - -check_error() -{ - if [ "$2" != "$3" ]; then - echo "error checking $1" >&2 - echo " expected: $2" >&2 - echo " received: $3" >&2 - return 1 - fi -} - -check_string() -{ - echo "$prog -s '$1'" >>"$log" - val=`$prog -s "$1"` && - echo "$val" >>"$log" && - check_error "$1" "$2" "$val" >>"$log" 2>&1 || - exit $? -} - -check_key() -{ - echo "$prog -k '$1'" >>"$log" - val=`$prog -k "$1"` && \ - echo "$val" >>"$log" && - check_error "$1" "$2" "$val" >>"$log" 2>&1 || \ - exit $? -} - -rm -f "$log" - -check_string Undo 0xFF65 -check_key 0x1008FF56 XF86Close -check_string ThisKeyShouldNotExist NoSymbol -check_key 0x0 NoSymbol -check_string XF86_Switch_VT_5 0x1008FE05 -check_key 0x1008FE20 XF86_Ungrab -check_string VoidSymbol 0xFFFFFF -check_key 0x01001234 U1234 -check_string U4567 0x1004567 -check_string 0x10203040 0x10203040 diff -Nru libxkbcommon-0.1.0~1/xkbcommon/xkbcommon-keysyms.h libxkbcommon-0.1.0~2/xkbcommon/xkbcommon-keysyms.h --- libxkbcommon-0.1.0~1/xkbcommon/xkbcommon-keysyms.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/xkbcommon/xkbcommon-keysyms.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,2995 @@ +/*********************************************************** +Copyright 1987, 1994, 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. + +******************************************************************/ + +/* + * The "X11 Window System Protocol" standard defines in Appendix A the + * keysym codes. These 29-bit integer values identify characters or + * functions associated with each key (e.g., via the visible + * engraving) of a keyboard layout. This file assigns mnemonic macro + * names for these keysyms. + * + * This file is also compiled (by src/util/makekeys.c in libX11) into + * hash tables that can be accessed with X11 library functions such as + * XStringToKeysym() and XKeysymToString(). + * + * Where a keysym corresponds one-to-one to an ISO 10646 / Unicode + * character, this is noted in a comment that provides both the U+xxxx + * Unicode position, as well as the official Unicode name of the + * character. + * + * Where the correspondence is either not one-to-one or semantically + * unclear, the Unicode position and name are enclosed in + * parentheses. Such legacy keysyms should be considered deprecated + * and are not recommended for use in future keyboard mappings. + * + * For any future extension of the keysyms with characters already + * found in ISO 10646 / Unicode, the following algorithm shall be + * used. The new keysym code position will simply be the character's + * Unicode number plus 0x01000000. The keysym values in the range + * 0x01000100 to 0x0110ffff are reserved to represent Unicode + * characters in the range U+0100 to U+10FFFF. + * + * While most newer Unicode-based X11 clients do already accept + * Unicode-mapped keysyms in the range 0x01000100 to 0x0110ffff, it + * will remain necessary for clients -- in the interest of + * compatibility with existing servers -- to also understand the + * existing legacy keysym values in the range 0x0100 to 0x20ff. + * + * Where several mnemonic names are defined for the same keysym in this + * file, all but the first one listed should be considered deprecated. + * + * Mnemonic names for keysyms are defined in this file with lines + * that match one of these Perl regular expressions: + * + * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\* U+([0-9A-F]{4,6}) (.*) \*\/\s*$/ + * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\*\(U+([0-9A-F]{4,6}) (.*)\)\*\/\s*$/ + * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/ + * + * Before adding new keysyms, please do consider the following: In + * addition to the keysym names defined in this file, the + * XStringToKeysym() and XKeysymToString() functions will also handle + * any keysym string of the form "U0020" to "U007E" and "U00A0" to + * "U10FFFF" for all possible Unicode characters. In other words, + * every possible Unicode character has already a keysym string + * defined algorithmically, even if it is not listed here. Therefore, + * defining an additional keysym macro is only necessary where a + * non-hexadecimal mnemonic name is needed, or where the new keysym + * does not represent any existing Unicode character. + * + * When adding new keysyms to this file, do not forget to also update the + * following as needed: + * + * - the mappings in src/KeyBind.c in the repo + * git://anongit.freedesktop.org/xorg/lib/libX11.git + * + * - the protocol specification in specs/keysyms.xml + * in the repo git://anongit.freedesktop.org/xorg/proto/x11proto.git + * + */ + +#define XKB_KEY_NoSymbol 0x000000 /* Special KeySym */ +#define XKB_KEY_VoidSymbol 0xffffff /* Void symbol */ + +/* + * TTY function keys, cleverly chosen to map to ASCII, for convenience of + * programming, but could have been arbitrary (at the cost of lookup + * tables in client code). + */ + +#define XKB_KEY_BackSpace 0xff08 /* Back space, back char */ +#define XKB_KEY_Tab 0xff09 +#define XKB_KEY_Linefeed 0xff0a /* Linefeed, LF */ +#define XKB_KEY_Clear 0xff0b +#define XKB_KEY_Return 0xff0d /* Return, enter */ +#define XKB_KEY_Pause 0xff13 /* Pause, hold */ +#define XKB_KEY_Scroll_Lock 0xff14 +#define XKB_KEY_Sys_Req 0xff15 +#define XKB_KEY_Escape 0xff1b +#define XKB_KEY_Delete 0xffff /* Delete, rubout */ + + + +/* International & multi-key character composition */ + +#define XKB_KEY_Multi_key 0xff20 /* Multi-key character compose */ +#define XKB_KEY_Codeinput 0xff37 +#define XKB_KEY_SingleCandidate 0xff3c +#define XKB_KEY_MultipleCandidate 0xff3d +#define XKB_KEY_PreviousCandidate 0xff3e + +/* Japanese keyboard support */ + +#define XKB_KEY_Kanji 0xff21 /* Kanji, Kanji convert */ +#define XKB_KEY_Muhenkan 0xff22 /* Cancel Conversion */ +#define XKB_KEY_Henkan_Mode 0xff23 /* Start/Stop Conversion */ +#define XKB_KEY_Henkan 0xff23 /* Alias for Henkan_Mode */ +#define XKB_KEY_Romaji 0xff24 /* to Romaji */ +#define XKB_KEY_Hiragana 0xff25 /* to Hiragana */ +#define XKB_KEY_Katakana 0xff26 /* to Katakana */ +#define XKB_KEY_Hiragana_Katakana 0xff27 /* Hiragana/Katakana toggle */ +#define XKB_KEY_Zenkaku 0xff28 /* to Zenkaku */ +#define XKB_KEY_Hankaku 0xff29 /* to Hankaku */ +#define XKB_KEY_Zenkaku_Hankaku 0xff2a /* Zenkaku/Hankaku toggle */ +#define XKB_KEY_Touroku 0xff2b /* Add to Dictionary */ +#define XKB_KEY_Massyo 0xff2c /* Delete from Dictionary */ +#define XKB_KEY_Kana_Lock 0xff2d /* Kana Lock */ +#define XKB_KEY_Kana_Shift 0xff2e /* Kana Shift */ +#define XKB_KEY_Eisu_Shift 0xff2f /* Alphanumeric Shift */ +#define XKB_KEY_Eisu_toggle 0xff30 /* Alphanumeric toggle */ +#define XKB_KEY_Kanji_Bangou 0xff37 /* Codeinput */ +#define XKB_KEY_Zen_Koho 0xff3d /* Multiple/All Candidate(s) */ +#define XKB_KEY_Mae_Koho 0xff3e /* Previous Candidate */ + +/* 0xff31 thru 0xff3f are under XK_KOREAN */ + +/* Cursor control & motion */ + +#define XKB_KEY_Home 0xff50 +#define XKB_KEY_Left 0xff51 /* Move left, left arrow */ +#define XKB_KEY_Up 0xff52 /* Move up, up arrow */ +#define XKB_KEY_Right 0xff53 /* Move right, right arrow */ +#define XKB_KEY_Down 0xff54 /* Move down, down arrow */ +#define XKB_KEY_Prior 0xff55 /* Prior, previous */ +#define XKB_KEY_Page_Up 0xff55 +#define XKB_KEY_Next 0xff56 /* Next */ +#define XKB_KEY_Page_Down 0xff56 +#define XKB_KEY_End 0xff57 /* EOL */ +#define XKB_KEY_Begin 0xff58 /* BOL */ + + +/* Misc functions */ + +#define XKB_KEY_Select 0xff60 /* Select, mark */ +#define XKB_KEY_Print 0xff61 +#define XKB_KEY_Execute 0xff62 /* Execute, run, do */ +#define XKB_KEY_Insert 0xff63 /* Insert, insert here */ +#define XKB_KEY_Undo 0xff65 +#define XKB_KEY_Redo 0xff66 /* Redo, again */ +#define XKB_KEY_Menu 0xff67 +#define XKB_KEY_Find 0xff68 /* Find, search */ +#define XKB_KEY_Cancel 0xff69 /* Cancel, stop, abort, exit */ +#define XKB_KEY_Help 0xff6a /* Help */ +#define XKB_KEY_Break 0xff6b +#define XKB_KEY_Mode_switch 0xff7e /* Character set switch */ +#define XKB_KEY_script_switch 0xff7e /* Alias for mode_switch */ +#define XKB_KEY_Num_Lock 0xff7f + +/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ + +#define XKB_KEY_KP_Space 0xff80 /* Space */ +#define XKB_KEY_KP_Tab 0xff89 +#define XKB_KEY_KP_Enter 0xff8d /* Enter */ +#define XKB_KEY_KP_F1 0xff91 /* PF1, KP_A, ... */ +#define XKB_KEY_KP_F2 0xff92 +#define XKB_KEY_KP_F3 0xff93 +#define XKB_KEY_KP_F4 0xff94 +#define XKB_KEY_KP_Home 0xff95 +#define XKB_KEY_KP_Left 0xff96 +#define XKB_KEY_KP_Up 0xff97 +#define XKB_KEY_KP_Right 0xff98 +#define XKB_KEY_KP_Down 0xff99 +#define XKB_KEY_KP_Prior 0xff9a +#define XKB_KEY_KP_Page_Up 0xff9a +#define XKB_KEY_KP_Next 0xff9b +#define XKB_KEY_KP_Page_Down 0xff9b +#define XKB_KEY_KP_End 0xff9c +#define XKB_KEY_KP_Begin 0xff9d +#define XKB_KEY_KP_Insert 0xff9e +#define XKB_KEY_KP_Delete 0xff9f +#define XKB_KEY_KP_Equal 0xffbd /* Equals */ +#define XKB_KEY_KP_Multiply 0xffaa +#define XKB_KEY_KP_Add 0xffab +#define XKB_KEY_KP_Separator 0xffac /* Separator, often comma */ +#define XKB_KEY_KP_Subtract 0xffad +#define XKB_KEY_KP_Decimal 0xffae +#define XKB_KEY_KP_Divide 0xffaf + +#define XKB_KEY_KP_0 0xffb0 +#define XKB_KEY_KP_1 0xffb1 +#define XKB_KEY_KP_2 0xffb2 +#define XKB_KEY_KP_3 0xffb3 +#define XKB_KEY_KP_4 0xffb4 +#define XKB_KEY_KP_5 0xffb5 +#define XKB_KEY_KP_6 0xffb6 +#define XKB_KEY_KP_7 0xffb7 +#define XKB_KEY_KP_8 0xffb8 +#define XKB_KEY_KP_9 0xffb9 + + + +/* + * Auxiliary functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufacturers have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + +#define XKB_KEY_F1 0xffbe +#define XKB_KEY_F2 0xffbf +#define XKB_KEY_F3 0xffc0 +#define XKB_KEY_F4 0xffc1 +#define XKB_KEY_F5 0xffc2 +#define XKB_KEY_F6 0xffc3 +#define XKB_KEY_F7 0xffc4 +#define XKB_KEY_F8 0xffc5 +#define XKB_KEY_F9 0xffc6 +#define XKB_KEY_F10 0xffc7 +#define XKB_KEY_F11 0xffc8 +#define XKB_KEY_L1 0xffc8 +#define XKB_KEY_F12 0xffc9 +#define XKB_KEY_L2 0xffc9 +#define XKB_KEY_F13 0xffca +#define XKB_KEY_L3 0xffca +#define XKB_KEY_F14 0xffcb +#define XKB_KEY_L4 0xffcb +#define XKB_KEY_F15 0xffcc +#define XKB_KEY_L5 0xffcc +#define XKB_KEY_F16 0xffcd +#define XKB_KEY_L6 0xffcd +#define XKB_KEY_F17 0xffce +#define XKB_KEY_L7 0xffce +#define XKB_KEY_F18 0xffcf +#define XKB_KEY_L8 0xffcf +#define XKB_KEY_F19 0xffd0 +#define XKB_KEY_L9 0xffd0 +#define XKB_KEY_F20 0xffd1 +#define XKB_KEY_L10 0xffd1 +#define XKB_KEY_F21 0xffd2 +#define XKB_KEY_R1 0xffd2 +#define XKB_KEY_F22 0xffd3 +#define XKB_KEY_R2 0xffd3 +#define XKB_KEY_F23 0xffd4 +#define XKB_KEY_R3 0xffd4 +#define XKB_KEY_F24 0xffd5 +#define XKB_KEY_R4 0xffd5 +#define XKB_KEY_F25 0xffd6 +#define XKB_KEY_R5 0xffd6 +#define XKB_KEY_F26 0xffd7 +#define XKB_KEY_R6 0xffd7 +#define XKB_KEY_F27 0xffd8 +#define XKB_KEY_R7 0xffd8 +#define XKB_KEY_F28 0xffd9 +#define XKB_KEY_R8 0xffd9 +#define XKB_KEY_F29 0xffda +#define XKB_KEY_R9 0xffda +#define XKB_KEY_F30 0xffdb +#define XKB_KEY_R10 0xffdb +#define XKB_KEY_F31 0xffdc +#define XKB_KEY_R11 0xffdc +#define XKB_KEY_F32 0xffdd +#define XKB_KEY_R12 0xffdd +#define XKB_KEY_F33 0xffde +#define XKB_KEY_R13 0xffde +#define XKB_KEY_F34 0xffdf +#define XKB_KEY_R14 0xffdf +#define XKB_KEY_F35 0xffe0 +#define XKB_KEY_R15 0xffe0 + +/* Modifiers */ + +#define XKB_KEY_Shift_L 0xffe1 /* Left shift */ +#define XKB_KEY_Shift_R 0xffe2 /* Right shift */ +#define XKB_KEY_Control_L 0xffe3 /* Left control */ +#define XKB_KEY_Control_R 0xffe4 /* Right control */ +#define XKB_KEY_Caps_Lock 0xffe5 /* Caps lock */ +#define XKB_KEY_Shift_Lock 0xffe6 /* Shift lock */ + +#define XKB_KEY_Meta_L 0xffe7 /* Left meta */ +#define XKB_KEY_Meta_R 0xffe8 /* Right meta */ +#define XKB_KEY_Alt_L 0xffe9 /* Left alt */ +#define XKB_KEY_Alt_R 0xffea /* Right alt */ +#define XKB_KEY_Super_L 0xffeb /* Left super */ +#define XKB_KEY_Super_R 0xffec /* Right super */ +#define XKB_KEY_Hyper_L 0xffed /* Left hyper */ +#define XKB_KEY_Hyper_R 0xffee /* Right hyper */ + +/* + * Keyboard (XKB) Extension function and modifier keys + * (from Appendix C of "The X Keyboard Extension: Protocol Specification") + * Byte 3 = 0xfe + */ + +#define XKB_KEY_ISO_Lock 0xfe01 +#define XKB_KEY_ISO_Level2_Latch 0xfe02 +#define XKB_KEY_ISO_Level3_Shift 0xfe03 +#define XKB_KEY_ISO_Level3_Latch 0xfe04 +#define XKB_KEY_ISO_Level3_Lock 0xfe05 +#define XKB_KEY_ISO_Level5_Shift 0xfe11 +#define XKB_KEY_ISO_Level5_Latch 0xfe12 +#define XKB_KEY_ISO_Level5_Lock 0xfe13 +#define XKB_KEY_ISO_Group_Shift 0xff7e /* Alias for mode_switch */ +#define XKB_KEY_ISO_Group_Latch 0xfe06 +#define XKB_KEY_ISO_Group_Lock 0xfe07 +#define XKB_KEY_ISO_Next_Group 0xfe08 +#define XKB_KEY_ISO_Next_Group_Lock 0xfe09 +#define XKB_KEY_ISO_Prev_Group 0xfe0a +#define XKB_KEY_ISO_Prev_Group_Lock 0xfe0b +#define XKB_KEY_ISO_First_Group 0xfe0c +#define XKB_KEY_ISO_First_Group_Lock 0xfe0d +#define XKB_KEY_ISO_Last_Group 0xfe0e +#define XKB_KEY_ISO_Last_Group_Lock 0xfe0f + +#define XKB_KEY_ISO_Left_Tab 0xfe20 +#define XKB_KEY_ISO_Move_Line_Up 0xfe21 +#define XKB_KEY_ISO_Move_Line_Down 0xfe22 +#define XKB_KEY_ISO_Partial_Line_Up 0xfe23 +#define XKB_KEY_ISO_Partial_Line_Down 0xfe24 +#define XKB_KEY_ISO_Partial_Space_Left 0xfe25 +#define XKB_KEY_ISO_Partial_Space_Right 0xfe26 +#define XKB_KEY_ISO_Set_Margin_Left 0xfe27 +#define XKB_KEY_ISO_Set_Margin_Right 0xfe28 +#define XKB_KEY_ISO_Release_Margin_Left 0xfe29 +#define XKB_KEY_ISO_Release_Margin_Right 0xfe2a +#define XKB_KEY_ISO_Release_Both_Margins 0xfe2b +#define XKB_KEY_ISO_Fast_Cursor_Left 0xfe2c +#define XKB_KEY_ISO_Fast_Cursor_Right 0xfe2d +#define XKB_KEY_ISO_Fast_Cursor_Up 0xfe2e +#define XKB_KEY_ISO_Fast_Cursor_Down 0xfe2f +#define XKB_KEY_ISO_Continuous_Underline 0xfe30 +#define XKB_KEY_ISO_Discontinuous_Underline 0xfe31 +#define XKB_KEY_ISO_Emphasize 0xfe32 +#define XKB_KEY_ISO_Center_Object 0xfe33 +#define XKB_KEY_ISO_Enter 0xfe34 + +#define XKB_KEY_dead_grave 0xfe50 +#define XKB_KEY_dead_acute 0xfe51 +#define XKB_KEY_dead_circumflex 0xfe52 +#define XKB_KEY_dead_tilde 0xfe53 +#define XKB_KEY_dead_perispomeni 0xfe53 /* alias for dead_tilde */ +#define XKB_KEY_dead_macron 0xfe54 +#define XKB_KEY_dead_breve 0xfe55 +#define XKB_KEY_dead_abovedot 0xfe56 +#define XKB_KEY_dead_diaeresis 0xfe57 +#define XKB_KEY_dead_abovering 0xfe58 +#define XKB_KEY_dead_doubleacute 0xfe59 +#define XKB_KEY_dead_caron 0xfe5a +#define XKB_KEY_dead_cedilla 0xfe5b +#define XKB_KEY_dead_ogonek 0xfe5c +#define XKB_KEY_dead_iota 0xfe5d +#define XKB_KEY_dead_voiced_sound 0xfe5e +#define XKB_KEY_dead_semivoiced_sound 0xfe5f +#define XKB_KEY_dead_belowdot 0xfe60 +#define XKB_KEY_dead_hook 0xfe61 +#define XKB_KEY_dead_horn 0xfe62 +#define XKB_KEY_dead_stroke 0xfe63 +#define XKB_KEY_dead_abovecomma 0xfe64 +#define XKB_KEY_dead_psili 0xfe64 /* alias for dead_abovecomma */ +#define XKB_KEY_dead_abovereversedcomma 0xfe65 +#define XKB_KEY_dead_dasia 0xfe65 /* alias for dead_abovereversedcomma */ +#define XKB_KEY_dead_doublegrave 0xfe66 +#define XKB_KEY_dead_belowring 0xfe67 +#define XKB_KEY_dead_belowmacron 0xfe68 +#define XKB_KEY_dead_belowcircumflex 0xfe69 +#define XKB_KEY_dead_belowtilde 0xfe6a +#define XKB_KEY_dead_belowbreve 0xfe6b +#define XKB_KEY_dead_belowdiaeresis 0xfe6c +#define XKB_KEY_dead_invertedbreve 0xfe6d +#define XKB_KEY_dead_belowcomma 0xfe6e +#define XKB_KEY_dead_currency 0xfe6f + +/* dead vowels for universal syllable entry */ +#define XKB_KEY_dead_a 0xfe80 +#define XKB_KEY_dead_A 0xfe81 +#define XKB_KEY_dead_e 0xfe82 +#define XKB_KEY_dead_E 0xfe83 +#define XKB_KEY_dead_i 0xfe84 +#define XKB_KEY_dead_I 0xfe85 +#define XKB_KEY_dead_o 0xfe86 +#define XKB_KEY_dead_O 0xfe87 +#define XKB_KEY_dead_u 0xfe88 +#define XKB_KEY_dead_U 0xfe89 +#define XKB_KEY_dead_small_schwa 0xfe8a +#define XKB_KEY_dead_capital_schwa 0xfe8b + +#define XKB_KEY_dead_greek 0xfe8c + +#define XKB_KEY_First_Virtual_Screen 0xfed0 +#define XKB_KEY_Prev_Virtual_Screen 0xfed1 +#define XKB_KEY_Next_Virtual_Screen 0xfed2 +#define XKB_KEY_Last_Virtual_Screen 0xfed4 +#define XKB_KEY_Terminate_Server 0xfed5 + +#define XKB_KEY_AccessX_Enable 0xfe70 +#define XKB_KEY_AccessX_Feedback_Enable 0xfe71 +#define XKB_KEY_RepeatKeys_Enable 0xfe72 +#define XKB_KEY_SlowKeys_Enable 0xfe73 +#define XKB_KEY_BounceKeys_Enable 0xfe74 +#define XKB_KEY_StickyKeys_Enable 0xfe75 +#define XKB_KEY_MouseKeys_Enable 0xfe76 +#define XKB_KEY_MouseKeys_Accel_Enable 0xfe77 +#define XKB_KEY_Overlay1_Enable 0xfe78 +#define XKB_KEY_Overlay2_Enable 0xfe79 +#define XKB_KEY_AudibleBell_Enable 0xfe7a + +#define XKB_KEY_Pointer_Left 0xfee0 +#define XKB_KEY_Pointer_Right 0xfee1 +#define XKB_KEY_Pointer_Up 0xfee2 +#define XKB_KEY_Pointer_Down 0xfee3 +#define XKB_KEY_Pointer_UpLeft 0xfee4 +#define XKB_KEY_Pointer_UpRight 0xfee5 +#define XKB_KEY_Pointer_DownLeft 0xfee6 +#define XKB_KEY_Pointer_DownRight 0xfee7 +#define XKB_KEY_Pointer_Button_Dflt 0xfee8 +#define XKB_KEY_Pointer_Button1 0xfee9 +#define XKB_KEY_Pointer_Button2 0xfeea +#define XKB_KEY_Pointer_Button3 0xfeeb +#define XKB_KEY_Pointer_Button4 0xfeec +#define XKB_KEY_Pointer_Button5 0xfeed +#define XKB_KEY_Pointer_DblClick_Dflt 0xfeee +#define XKB_KEY_Pointer_DblClick1 0xfeef +#define XKB_KEY_Pointer_DblClick2 0xfef0 +#define XKB_KEY_Pointer_DblClick3 0xfef1 +#define XKB_KEY_Pointer_DblClick4 0xfef2 +#define XKB_KEY_Pointer_DblClick5 0xfef3 +#define XKB_KEY_Pointer_Drag_Dflt 0xfef4 +#define XKB_KEY_Pointer_Drag1 0xfef5 +#define XKB_KEY_Pointer_Drag2 0xfef6 +#define XKB_KEY_Pointer_Drag3 0xfef7 +#define XKB_KEY_Pointer_Drag4 0xfef8 +#define XKB_KEY_Pointer_Drag5 0xfefd + +#define XKB_KEY_Pointer_EnableKeys 0xfef9 +#define XKB_KEY_Pointer_Accelerate 0xfefa +#define XKB_KEY_Pointer_DfltBtnNext 0xfefb +#define XKB_KEY_Pointer_DfltBtnPrev 0xfefc + +/* Single-Stroke Multiple-Character N-Graph Keysyms For The X Input Method */ + +#define XKB_KEY_ch 0xfea0 +#define XKB_KEY_Ch 0xfea1 +#define XKB_KEY_CH 0xfea2 +#define XKB_KEY_c_h 0xfea3 +#define XKB_KEY_C_h 0xfea4 +#define XKB_KEY_C_H 0xfea5 + + +/* + * 3270 Terminal Keys + * Byte 3 = 0xfd + */ + +#define XKB_KEY_3270_Duplicate 0xfd01 +#define XKB_KEY_3270_FieldMark 0xfd02 +#define XKB_KEY_3270_Right2 0xfd03 +#define XKB_KEY_3270_Left2 0xfd04 +#define XKB_KEY_3270_BackTab 0xfd05 +#define XKB_KEY_3270_EraseEOF 0xfd06 +#define XKB_KEY_3270_EraseInput 0xfd07 +#define XKB_KEY_3270_Reset 0xfd08 +#define XKB_KEY_3270_Quit 0xfd09 +#define XKB_KEY_3270_PA1 0xfd0a +#define XKB_KEY_3270_PA2 0xfd0b +#define XKB_KEY_3270_PA3 0xfd0c +#define XKB_KEY_3270_Test 0xfd0d +#define XKB_KEY_3270_Attn 0xfd0e +#define XKB_KEY_3270_CursorBlink 0xfd0f +#define XKB_KEY_3270_AltCursor 0xfd10 +#define XKB_KEY_3270_KeyClick 0xfd11 +#define XKB_KEY_3270_Jump 0xfd12 +#define XKB_KEY_3270_Ident 0xfd13 +#define XKB_KEY_3270_Rule 0xfd14 +#define XKB_KEY_3270_Copy 0xfd15 +#define XKB_KEY_3270_Play 0xfd16 +#define XKB_KEY_3270_Setup 0xfd17 +#define XKB_KEY_3270_Record 0xfd18 +#define XKB_KEY_3270_ChangeScreen 0xfd19 +#define XKB_KEY_3270_DeleteWord 0xfd1a +#define XKB_KEY_3270_ExSelect 0xfd1b +#define XKB_KEY_3270_CursorSelect 0xfd1c +#define XKB_KEY_3270_PrintScreen 0xfd1d +#define XKB_KEY_3270_Enter 0xfd1e + +/* + * Latin 1 + * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF) + * Byte 3 = 0 + */ +#define XKB_KEY_space 0x0020 /* U+0020 SPACE */ +#define XKB_KEY_exclam 0x0021 /* U+0021 EXCLAMATION MARK */ +#define XKB_KEY_quotedbl 0x0022 /* U+0022 QUOTATION MARK */ +#define XKB_KEY_numbersign 0x0023 /* U+0023 NUMBER SIGN */ +#define XKB_KEY_dollar 0x0024 /* U+0024 DOLLAR SIGN */ +#define XKB_KEY_percent 0x0025 /* U+0025 PERCENT SIGN */ +#define XKB_KEY_ampersand 0x0026 /* U+0026 AMPERSAND */ +#define XKB_KEY_apostrophe 0x0027 /* U+0027 APOSTROPHE */ +#define XKB_KEY_quoteright 0x0027 /* deprecated */ +#define XKB_KEY_parenleft 0x0028 /* U+0028 LEFT PARENTHESIS */ +#define XKB_KEY_parenright 0x0029 /* U+0029 RIGHT PARENTHESIS */ +#define XKB_KEY_asterisk 0x002a /* U+002A ASTERISK */ +#define XKB_KEY_plus 0x002b /* U+002B PLUS SIGN */ +#define XKB_KEY_comma 0x002c /* U+002C COMMA */ +#define XKB_KEY_minus 0x002d /* U+002D HYPHEN-MINUS */ +#define XKB_KEY_period 0x002e /* U+002E FULL STOP */ +#define XKB_KEY_slash 0x002f /* U+002F SOLIDUS */ +#define XKB_KEY_0 0x0030 /* U+0030 DIGIT ZERO */ +#define XKB_KEY_1 0x0031 /* U+0031 DIGIT ONE */ +#define XKB_KEY_2 0x0032 /* U+0032 DIGIT TWO */ +#define XKB_KEY_3 0x0033 /* U+0033 DIGIT THREE */ +#define XKB_KEY_4 0x0034 /* U+0034 DIGIT FOUR */ +#define XKB_KEY_5 0x0035 /* U+0035 DIGIT FIVE */ +#define XKB_KEY_6 0x0036 /* U+0036 DIGIT SIX */ +#define XKB_KEY_7 0x0037 /* U+0037 DIGIT SEVEN */ +#define XKB_KEY_8 0x0038 /* U+0038 DIGIT EIGHT */ +#define XKB_KEY_9 0x0039 /* U+0039 DIGIT NINE */ +#define XKB_KEY_colon 0x003a /* U+003A COLON */ +#define XKB_KEY_semicolon 0x003b /* U+003B SEMICOLON */ +#define XKB_KEY_less 0x003c /* U+003C LESS-THAN SIGN */ +#define XKB_KEY_equal 0x003d /* U+003D EQUALS SIGN */ +#define XKB_KEY_greater 0x003e /* U+003E GREATER-THAN SIGN */ +#define XKB_KEY_question 0x003f /* U+003F QUESTION MARK */ +#define XKB_KEY_at 0x0040 /* U+0040 COMMERCIAL AT */ +#define XKB_KEY_A 0x0041 /* U+0041 LATIN CAPITAL LETTER A */ +#define XKB_KEY_B 0x0042 /* U+0042 LATIN CAPITAL LETTER B */ +#define XKB_KEY_C 0x0043 /* U+0043 LATIN CAPITAL LETTER C */ +#define XKB_KEY_D 0x0044 /* U+0044 LATIN CAPITAL LETTER D */ +#define XKB_KEY_E 0x0045 /* U+0045 LATIN CAPITAL LETTER E */ +#define XKB_KEY_F 0x0046 /* U+0046 LATIN CAPITAL LETTER F */ +#define XKB_KEY_G 0x0047 /* U+0047 LATIN CAPITAL LETTER G */ +#define XKB_KEY_H 0x0048 /* U+0048 LATIN CAPITAL LETTER H */ +#define XKB_KEY_I 0x0049 /* U+0049 LATIN CAPITAL LETTER I */ +#define XKB_KEY_J 0x004a /* U+004A LATIN CAPITAL LETTER J */ +#define XKB_KEY_K 0x004b /* U+004B LATIN CAPITAL LETTER K */ +#define XKB_KEY_L 0x004c /* U+004C LATIN CAPITAL LETTER L */ +#define XKB_KEY_M 0x004d /* U+004D LATIN CAPITAL LETTER M */ +#define XKB_KEY_N 0x004e /* U+004E LATIN CAPITAL LETTER N */ +#define XKB_KEY_O 0x004f /* U+004F LATIN CAPITAL LETTER O */ +#define XKB_KEY_P 0x0050 /* U+0050 LATIN CAPITAL LETTER P */ +#define XKB_KEY_Q 0x0051 /* U+0051 LATIN CAPITAL LETTER Q */ +#define XKB_KEY_R 0x0052 /* U+0052 LATIN CAPITAL LETTER R */ +#define XKB_KEY_S 0x0053 /* U+0053 LATIN CAPITAL LETTER S */ +#define XKB_KEY_T 0x0054 /* U+0054 LATIN CAPITAL LETTER T */ +#define XKB_KEY_U 0x0055 /* U+0055 LATIN CAPITAL LETTER U */ +#define XKB_KEY_V 0x0056 /* U+0056 LATIN CAPITAL LETTER V */ +#define XKB_KEY_W 0x0057 /* U+0057 LATIN CAPITAL LETTER W */ +#define XKB_KEY_X 0x0058 /* U+0058 LATIN CAPITAL LETTER X */ +#define XKB_KEY_Y 0x0059 /* U+0059 LATIN CAPITAL LETTER Y */ +#define XKB_KEY_Z 0x005a /* U+005A LATIN CAPITAL LETTER Z */ +#define XKB_KEY_bracketleft 0x005b /* U+005B LEFT SQUARE BRACKET */ +#define XKB_KEY_backslash 0x005c /* U+005C REVERSE SOLIDUS */ +#define XKB_KEY_bracketright 0x005d /* U+005D RIGHT SQUARE BRACKET */ +#define XKB_KEY_asciicircum 0x005e /* U+005E CIRCUMFLEX ACCENT */ +#define XKB_KEY_underscore 0x005f /* U+005F LOW LINE */ +#define XKB_KEY_grave 0x0060 /* U+0060 GRAVE ACCENT */ +#define XKB_KEY_quoteleft 0x0060 /* deprecated */ +#define XKB_KEY_a 0x0061 /* U+0061 LATIN SMALL LETTER A */ +#define XKB_KEY_b 0x0062 /* U+0062 LATIN SMALL LETTER B */ +#define XKB_KEY_c 0x0063 /* U+0063 LATIN SMALL LETTER C */ +#define XKB_KEY_d 0x0064 /* U+0064 LATIN SMALL LETTER D */ +#define XKB_KEY_e 0x0065 /* U+0065 LATIN SMALL LETTER E */ +#define XKB_KEY_f 0x0066 /* U+0066 LATIN SMALL LETTER F */ +#define XKB_KEY_g 0x0067 /* U+0067 LATIN SMALL LETTER G */ +#define XKB_KEY_h 0x0068 /* U+0068 LATIN SMALL LETTER H */ +#define XKB_KEY_i 0x0069 /* U+0069 LATIN SMALL LETTER I */ +#define XKB_KEY_j 0x006a /* U+006A LATIN SMALL LETTER J */ +#define XKB_KEY_k 0x006b /* U+006B LATIN SMALL LETTER K */ +#define XKB_KEY_l 0x006c /* U+006C LATIN SMALL LETTER L */ +#define XKB_KEY_m 0x006d /* U+006D LATIN SMALL LETTER M */ +#define XKB_KEY_n 0x006e /* U+006E LATIN SMALL LETTER N */ +#define XKB_KEY_o 0x006f /* U+006F LATIN SMALL LETTER O */ +#define XKB_KEY_p 0x0070 /* U+0070 LATIN SMALL LETTER P */ +#define XKB_KEY_q 0x0071 /* U+0071 LATIN SMALL LETTER Q */ +#define XKB_KEY_r 0x0072 /* U+0072 LATIN SMALL LETTER R */ +#define XKB_KEY_s 0x0073 /* U+0073 LATIN SMALL LETTER S */ +#define XKB_KEY_t 0x0074 /* U+0074 LATIN SMALL LETTER T */ +#define XKB_KEY_u 0x0075 /* U+0075 LATIN SMALL LETTER U */ +#define XKB_KEY_v 0x0076 /* U+0076 LATIN SMALL LETTER V */ +#define XKB_KEY_w 0x0077 /* U+0077 LATIN SMALL LETTER W */ +#define XKB_KEY_x 0x0078 /* U+0078 LATIN SMALL LETTER X */ +#define XKB_KEY_y 0x0079 /* U+0079 LATIN SMALL LETTER Y */ +#define XKB_KEY_z 0x007a /* U+007A LATIN SMALL LETTER Z */ +#define XKB_KEY_braceleft 0x007b /* U+007B LEFT CURLY BRACKET */ +#define XKB_KEY_bar 0x007c /* U+007C VERTICAL LINE */ +#define XKB_KEY_braceright 0x007d /* U+007D RIGHT CURLY BRACKET */ +#define XKB_KEY_asciitilde 0x007e /* U+007E TILDE */ + +#define XKB_KEY_nobreakspace 0x00a0 /* U+00A0 NO-BREAK SPACE */ +#define XKB_KEY_exclamdown 0x00a1 /* U+00A1 INVERTED EXCLAMATION MARK */ +#define XKB_KEY_cent 0x00a2 /* U+00A2 CENT SIGN */ +#define XKB_KEY_sterling 0x00a3 /* U+00A3 POUND SIGN */ +#define XKB_KEY_currency 0x00a4 /* U+00A4 CURRENCY SIGN */ +#define XKB_KEY_yen 0x00a5 /* U+00A5 YEN SIGN */ +#define XKB_KEY_brokenbar 0x00a6 /* U+00A6 BROKEN BAR */ +#define XKB_KEY_section 0x00a7 /* U+00A7 SECTION SIGN */ +#define XKB_KEY_diaeresis 0x00a8 /* U+00A8 DIAERESIS */ +#define XKB_KEY_copyright 0x00a9 /* U+00A9 COPYRIGHT SIGN */ +#define XKB_KEY_ordfeminine 0x00aa /* U+00AA FEMININE ORDINAL INDICATOR */ +#define XKB_KEY_guillemotleft 0x00ab /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ +#define XKB_KEY_notsign 0x00ac /* U+00AC NOT SIGN */ +#define XKB_KEY_hyphen 0x00ad /* U+00AD SOFT HYPHEN */ +#define XKB_KEY_registered 0x00ae /* U+00AE REGISTERED SIGN */ +#define XKB_KEY_macron 0x00af /* U+00AF MACRON */ +#define XKB_KEY_degree 0x00b0 /* U+00B0 DEGREE SIGN */ +#define XKB_KEY_plusminus 0x00b1 /* U+00B1 PLUS-MINUS SIGN */ +#define XKB_KEY_twosuperior 0x00b2 /* U+00B2 SUPERSCRIPT TWO */ +#define XKB_KEY_threesuperior 0x00b3 /* U+00B3 SUPERSCRIPT THREE */ +#define XKB_KEY_acute 0x00b4 /* U+00B4 ACUTE ACCENT */ +#define XKB_KEY_mu 0x00b5 /* U+00B5 MICRO SIGN */ +#define XKB_KEY_paragraph 0x00b6 /* U+00B6 PILCROW SIGN */ +#define XKB_KEY_periodcentered 0x00b7 /* U+00B7 MIDDLE DOT */ +#define XKB_KEY_cedilla 0x00b8 /* U+00B8 CEDILLA */ +#define XKB_KEY_onesuperior 0x00b9 /* U+00B9 SUPERSCRIPT ONE */ +#define XKB_KEY_masculine 0x00ba /* U+00BA MASCULINE ORDINAL INDICATOR */ +#define XKB_KEY_guillemotright 0x00bb /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ +#define XKB_KEY_onequarter 0x00bc /* U+00BC VULGAR FRACTION ONE QUARTER */ +#define XKB_KEY_onehalf 0x00bd /* U+00BD VULGAR FRACTION ONE HALF */ +#define XKB_KEY_threequarters 0x00be /* U+00BE VULGAR FRACTION THREE QUARTERS */ +#define XKB_KEY_questiondown 0x00bf /* U+00BF INVERTED QUESTION MARK */ +#define XKB_KEY_Agrave 0x00c0 /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ +#define XKB_KEY_Aacute 0x00c1 /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ +#define XKB_KEY_Acircumflex 0x00c2 /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ +#define XKB_KEY_Atilde 0x00c3 /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ +#define XKB_KEY_Adiaeresis 0x00c4 /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ +#define XKB_KEY_Aring 0x00c5 /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ +#define XKB_KEY_AE 0x00c6 /* U+00C6 LATIN CAPITAL LETTER AE */ +#define XKB_KEY_Ccedilla 0x00c7 /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ +#define XKB_KEY_Egrave 0x00c8 /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ +#define XKB_KEY_Eacute 0x00c9 /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ +#define XKB_KEY_Ecircumflex 0x00ca /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ +#define XKB_KEY_Ediaeresis 0x00cb /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ +#define XKB_KEY_Igrave 0x00cc /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ +#define XKB_KEY_Iacute 0x00cd /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ +#define XKB_KEY_Icircumflex 0x00ce /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ +#define XKB_KEY_Idiaeresis 0x00cf /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ +#define XKB_KEY_ETH 0x00d0 /* U+00D0 LATIN CAPITAL LETTER ETH */ +#define XKB_KEY_Eth 0x00d0 /* deprecated */ +#define XKB_KEY_Ntilde 0x00d1 /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ +#define XKB_KEY_Ograve 0x00d2 /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ +#define XKB_KEY_Oacute 0x00d3 /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ +#define XKB_KEY_Ocircumflex 0x00d4 /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ +#define XKB_KEY_Otilde 0x00d5 /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ +#define XKB_KEY_Odiaeresis 0x00d6 /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ +#define XKB_KEY_multiply 0x00d7 /* U+00D7 MULTIPLICATION SIGN */ +#define XKB_KEY_Oslash 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ +#define XKB_KEY_Ooblique 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ +#define XKB_KEY_Ugrave 0x00d9 /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ +#define XKB_KEY_Uacute 0x00da /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ +#define XKB_KEY_Ucircumflex 0x00db /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ +#define XKB_KEY_Udiaeresis 0x00dc /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ +#define XKB_KEY_Yacute 0x00dd /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ +#define XKB_KEY_THORN 0x00de /* U+00DE LATIN CAPITAL LETTER THORN */ +#define XKB_KEY_Thorn 0x00de /* deprecated */ +#define XKB_KEY_ssharp 0x00df /* U+00DF LATIN SMALL LETTER SHARP S */ +#define XKB_KEY_agrave 0x00e0 /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ +#define XKB_KEY_aacute 0x00e1 /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ +#define XKB_KEY_acircumflex 0x00e2 /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ +#define XKB_KEY_atilde 0x00e3 /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ +#define XKB_KEY_adiaeresis 0x00e4 /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ +#define XKB_KEY_aring 0x00e5 /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ +#define XKB_KEY_ae 0x00e6 /* U+00E6 LATIN SMALL LETTER AE */ +#define XKB_KEY_ccedilla 0x00e7 /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ +#define XKB_KEY_egrave 0x00e8 /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ +#define XKB_KEY_eacute 0x00e9 /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ +#define XKB_KEY_ecircumflex 0x00ea /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ +#define XKB_KEY_ediaeresis 0x00eb /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ +#define XKB_KEY_igrave 0x00ec /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ +#define XKB_KEY_iacute 0x00ed /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ +#define XKB_KEY_icircumflex 0x00ee /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ +#define XKB_KEY_idiaeresis 0x00ef /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ +#define XKB_KEY_eth 0x00f0 /* U+00F0 LATIN SMALL LETTER ETH */ +#define XKB_KEY_ntilde 0x00f1 /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ +#define XKB_KEY_ograve 0x00f2 /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ +#define XKB_KEY_oacute 0x00f3 /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ +#define XKB_KEY_ocircumflex 0x00f4 /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ +#define XKB_KEY_otilde 0x00f5 /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ +#define XKB_KEY_odiaeresis 0x00f6 /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ +#define XKB_KEY_division 0x00f7 /* U+00F7 DIVISION SIGN */ +#define XKB_KEY_oslash 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ +#define XKB_KEY_ooblique 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ +#define XKB_KEY_ugrave 0x00f9 /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ +#define XKB_KEY_uacute 0x00fa /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ +#define XKB_KEY_ucircumflex 0x00fb /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ +#define XKB_KEY_udiaeresis 0x00fc /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ +#define XKB_KEY_yacute 0x00fd /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ +#define XKB_KEY_thorn 0x00fe /* U+00FE LATIN SMALL LETTER THORN */ +#define XKB_KEY_ydiaeresis 0x00ff /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ + +/* + * Latin 2 + * Byte 3 = 1 + */ + +#define XKB_KEY_Aogonek 0x01a1 /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */ +#define XKB_KEY_breve 0x01a2 /* U+02D8 BREVE */ +#define XKB_KEY_Lstroke 0x01a3 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */ +#define XKB_KEY_Lcaron 0x01a5 /* U+013D LATIN CAPITAL LETTER L WITH CARON */ +#define XKB_KEY_Sacute 0x01a6 /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */ +#define XKB_KEY_Scaron 0x01a9 /* U+0160 LATIN CAPITAL LETTER S WITH CARON */ +#define XKB_KEY_Scedilla 0x01aa /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */ +#define XKB_KEY_Tcaron 0x01ab /* U+0164 LATIN CAPITAL LETTER T WITH CARON */ +#define XKB_KEY_Zacute 0x01ac /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */ +#define XKB_KEY_Zcaron 0x01ae /* U+017D LATIN CAPITAL LETTER Z WITH CARON */ +#define XKB_KEY_Zabovedot 0x01af /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */ +#define XKB_KEY_aogonek 0x01b1 /* U+0105 LATIN SMALL LETTER A WITH OGONEK */ +#define XKB_KEY_ogonek 0x01b2 /* U+02DB OGONEK */ +#define XKB_KEY_lstroke 0x01b3 /* U+0142 LATIN SMALL LETTER L WITH STROKE */ +#define XKB_KEY_lcaron 0x01b5 /* U+013E LATIN SMALL LETTER L WITH CARON */ +#define XKB_KEY_sacute 0x01b6 /* U+015B LATIN SMALL LETTER S WITH ACUTE */ +#define XKB_KEY_caron 0x01b7 /* U+02C7 CARON */ +#define XKB_KEY_scaron 0x01b9 /* U+0161 LATIN SMALL LETTER S WITH CARON */ +#define XKB_KEY_scedilla 0x01ba /* U+015F LATIN SMALL LETTER S WITH CEDILLA */ +#define XKB_KEY_tcaron 0x01bb /* U+0165 LATIN SMALL LETTER T WITH CARON */ +#define XKB_KEY_zacute 0x01bc /* U+017A LATIN SMALL LETTER Z WITH ACUTE */ +#define XKB_KEY_doubleacute 0x01bd /* U+02DD DOUBLE ACUTE ACCENT */ +#define XKB_KEY_zcaron 0x01be /* U+017E LATIN SMALL LETTER Z WITH CARON */ +#define XKB_KEY_zabovedot 0x01bf /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */ +#define XKB_KEY_Racute 0x01c0 /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */ +#define XKB_KEY_Abreve 0x01c3 /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */ +#define XKB_KEY_Lacute 0x01c5 /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */ +#define XKB_KEY_Cacute 0x01c6 /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */ +#define XKB_KEY_Ccaron 0x01c8 /* U+010C LATIN CAPITAL LETTER C WITH CARON */ +#define XKB_KEY_Eogonek 0x01ca /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */ +#define XKB_KEY_Ecaron 0x01cc /* U+011A LATIN CAPITAL LETTER E WITH CARON */ +#define XKB_KEY_Dcaron 0x01cf /* U+010E LATIN CAPITAL LETTER D WITH CARON */ +#define XKB_KEY_Dstroke 0x01d0 /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */ +#define XKB_KEY_Nacute 0x01d1 /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */ +#define XKB_KEY_Ncaron 0x01d2 /* U+0147 LATIN CAPITAL LETTER N WITH CARON */ +#define XKB_KEY_Odoubleacute 0x01d5 /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ +#define XKB_KEY_Rcaron 0x01d8 /* U+0158 LATIN CAPITAL LETTER R WITH CARON */ +#define XKB_KEY_Uring 0x01d9 /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */ +#define XKB_KEY_Udoubleacute 0x01db /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ +#define XKB_KEY_Tcedilla 0x01de /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */ +#define XKB_KEY_racute 0x01e0 /* U+0155 LATIN SMALL LETTER R WITH ACUTE */ +#define XKB_KEY_abreve 0x01e3 /* U+0103 LATIN SMALL LETTER A WITH BREVE */ +#define XKB_KEY_lacute 0x01e5 /* U+013A LATIN SMALL LETTER L WITH ACUTE */ +#define XKB_KEY_cacute 0x01e6 /* U+0107 LATIN SMALL LETTER C WITH ACUTE */ +#define XKB_KEY_ccaron 0x01e8 /* U+010D LATIN SMALL LETTER C WITH CARON */ +#define XKB_KEY_eogonek 0x01ea /* U+0119 LATIN SMALL LETTER E WITH OGONEK */ +#define XKB_KEY_ecaron 0x01ec /* U+011B LATIN SMALL LETTER E WITH CARON */ +#define XKB_KEY_dcaron 0x01ef /* U+010F LATIN SMALL LETTER D WITH CARON */ +#define XKB_KEY_dstroke 0x01f0 /* U+0111 LATIN SMALL LETTER D WITH STROKE */ +#define XKB_KEY_nacute 0x01f1 /* U+0144 LATIN SMALL LETTER N WITH ACUTE */ +#define XKB_KEY_ncaron 0x01f2 /* U+0148 LATIN SMALL LETTER N WITH CARON */ +#define XKB_KEY_odoubleacute 0x01f5 /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */ +#define XKB_KEY_rcaron 0x01f8 /* U+0159 LATIN SMALL LETTER R WITH CARON */ +#define XKB_KEY_uring 0x01f9 /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */ +#define XKB_KEY_udoubleacute 0x01fb /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */ +#define XKB_KEY_tcedilla 0x01fe /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */ +#define XKB_KEY_abovedot 0x01ff /* U+02D9 DOT ABOVE */ + +/* + * Latin 3 + * Byte 3 = 2 + */ + +#define XKB_KEY_Hstroke 0x02a1 /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */ +#define XKB_KEY_Hcircumflex 0x02a6 /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ +#define XKB_KEY_Iabovedot 0x02a9 /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */ +#define XKB_KEY_Gbreve 0x02ab /* U+011E LATIN CAPITAL LETTER G WITH BREVE */ +#define XKB_KEY_Jcircumflex 0x02ac /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ +#define XKB_KEY_hstroke 0x02b1 /* U+0127 LATIN SMALL LETTER H WITH STROKE */ +#define XKB_KEY_hcircumflex 0x02b6 /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */ +#define XKB_KEY_idotless 0x02b9 /* U+0131 LATIN SMALL LETTER DOTLESS I */ +#define XKB_KEY_gbreve 0x02bb /* U+011F LATIN SMALL LETTER G WITH BREVE */ +#define XKB_KEY_jcircumflex 0x02bc /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */ +#define XKB_KEY_Cabovedot 0x02c5 /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */ +#define XKB_KEY_Ccircumflex 0x02c6 /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ +#define XKB_KEY_Gabovedot 0x02d5 /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */ +#define XKB_KEY_Gcircumflex 0x02d8 /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ +#define XKB_KEY_Ubreve 0x02dd /* U+016C LATIN CAPITAL LETTER U WITH BREVE */ +#define XKB_KEY_Scircumflex 0x02de /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ +#define XKB_KEY_cabovedot 0x02e5 /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */ +#define XKB_KEY_ccircumflex 0x02e6 /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */ +#define XKB_KEY_gabovedot 0x02f5 /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */ +#define XKB_KEY_gcircumflex 0x02f8 /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */ +#define XKB_KEY_ubreve 0x02fd /* U+016D LATIN SMALL LETTER U WITH BREVE */ +#define XKB_KEY_scircumflex 0x02fe /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */ + + +/* + * Latin 4 + * Byte 3 = 3 + */ + +#define XKB_KEY_kra 0x03a2 /* U+0138 LATIN SMALL LETTER KRA */ +#define XKB_KEY_kappa 0x03a2 /* deprecated */ +#define XKB_KEY_Rcedilla 0x03a3 /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */ +#define XKB_KEY_Itilde 0x03a5 /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */ +#define XKB_KEY_Lcedilla 0x03a6 /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */ +#define XKB_KEY_Emacron 0x03aa /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */ +#define XKB_KEY_Gcedilla 0x03ab /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */ +#define XKB_KEY_Tslash 0x03ac /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */ +#define XKB_KEY_rcedilla 0x03b3 /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */ +#define XKB_KEY_itilde 0x03b5 /* U+0129 LATIN SMALL LETTER I WITH TILDE */ +#define XKB_KEY_lcedilla 0x03b6 /* U+013C LATIN SMALL LETTER L WITH CEDILLA */ +#define XKB_KEY_emacron 0x03ba /* U+0113 LATIN SMALL LETTER E WITH MACRON */ +#define XKB_KEY_gcedilla 0x03bb /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */ +#define XKB_KEY_tslash 0x03bc /* U+0167 LATIN SMALL LETTER T WITH STROKE */ +#define XKB_KEY_ENG 0x03bd /* U+014A LATIN CAPITAL LETTER ENG */ +#define XKB_KEY_eng 0x03bf /* U+014B LATIN SMALL LETTER ENG */ +#define XKB_KEY_Amacron 0x03c0 /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */ +#define XKB_KEY_Iogonek 0x03c7 /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */ +#define XKB_KEY_Eabovedot 0x03cc /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */ +#define XKB_KEY_Imacron 0x03cf /* U+012A LATIN CAPITAL LETTER I WITH MACRON */ +#define XKB_KEY_Ncedilla 0x03d1 /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */ +#define XKB_KEY_Omacron 0x03d2 /* U+014C LATIN CAPITAL LETTER O WITH MACRON */ +#define XKB_KEY_Kcedilla 0x03d3 /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */ +#define XKB_KEY_Uogonek 0x03d9 /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */ +#define XKB_KEY_Utilde 0x03dd /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */ +#define XKB_KEY_Umacron 0x03de /* U+016A LATIN CAPITAL LETTER U WITH MACRON */ +#define XKB_KEY_amacron 0x03e0 /* U+0101 LATIN SMALL LETTER A WITH MACRON */ +#define XKB_KEY_iogonek 0x03e7 /* U+012F LATIN SMALL LETTER I WITH OGONEK */ +#define XKB_KEY_eabovedot 0x03ec /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */ +#define XKB_KEY_imacron 0x03ef /* U+012B LATIN SMALL LETTER I WITH MACRON */ +#define XKB_KEY_ncedilla 0x03f1 /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */ +#define XKB_KEY_omacron 0x03f2 /* U+014D LATIN SMALL LETTER O WITH MACRON */ +#define XKB_KEY_kcedilla 0x03f3 /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */ +#define XKB_KEY_uogonek 0x03f9 /* U+0173 LATIN SMALL LETTER U WITH OGONEK */ +#define XKB_KEY_utilde 0x03fd /* U+0169 LATIN SMALL LETTER U WITH TILDE */ +#define XKB_KEY_umacron 0x03fe /* U+016B LATIN SMALL LETTER U WITH MACRON */ + +/* + * Latin 8 + */ +#define XKB_KEY_Wcircumflex 0x1000174 /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ +#define XKB_KEY_wcircumflex 0x1000175 /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */ +#define XKB_KEY_Ycircumflex 0x1000176 /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ +#define XKB_KEY_ycircumflex 0x1000177 /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */ +#define XKB_KEY_Babovedot 0x1001e02 /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */ +#define XKB_KEY_babovedot 0x1001e03 /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */ +#define XKB_KEY_Dabovedot 0x1001e0a /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */ +#define XKB_KEY_dabovedot 0x1001e0b /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */ +#define XKB_KEY_Fabovedot 0x1001e1e /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */ +#define XKB_KEY_fabovedot 0x1001e1f /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */ +#define XKB_KEY_Mabovedot 0x1001e40 /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */ +#define XKB_KEY_mabovedot 0x1001e41 /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */ +#define XKB_KEY_Pabovedot 0x1001e56 /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */ +#define XKB_KEY_pabovedot 0x1001e57 /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */ +#define XKB_KEY_Sabovedot 0x1001e60 /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */ +#define XKB_KEY_sabovedot 0x1001e61 /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */ +#define XKB_KEY_Tabovedot 0x1001e6a /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */ +#define XKB_KEY_tabovedot 0x1001e6b /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */ +#define XKB_KEY_Wgrave 0x1001e80 /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */ +#define XKB_KEY_wgrave 0x1001e81 /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */ +#define XKB_KEY_Wacute 0x1001e82 /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */ +#define XKB_KEY_wacute 0x1001e83 /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */ +#define XKB_KEY_Wdiaeresis 0x1001e84 /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */ +#define XKB_KEY_wdiaeresis 0x1001e85 /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */ +#define XKB_KEY_Ygrave 0x1001ef2 /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */ +#define XKB_KEY_ygrave 0x1001ef3 /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */ + +/* + * Latin 9 + * Byte 3 = 0x13 + */ + +#define XKB_KEY_OE 0x13bc /* U+0152 LATIN CAPITAL LIGATURE OE */ +#define XKB_KEY_oe 0x13bd /* U+0153 LATIN SMALL LIGATURE OE */ +#define XKB_KEY_Ydiaeresis 0x13be /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */ + +/* + * Katakana + * Byte 3 = 4 + */ + +#define XKB_KEY_overline 0x047e /* U+203E OVERLINE */ +#define XKB_KEY_kana_fullstop 0x04a1 /* U+3002 IDEOGRAPHIC FULL STOP */ +#define XKB_KEY_kana_openingbracket 0x04a2 /* U+300C LEFT CORNER BRACKET */ +#define XKB_KEY_kana_closingbracket 0x04a3 /* U+300D RIGHT CORNER BRACKET */ +#define XKB_KEY_kana_comma 0x04a4 /* U+3001 IDEOGRAPHIC COMMA */ +#define XKB_KEY_kana_conjunctive 0x04a5 /* U+30FB KATAKANA MIDDLE DOT */ +#define XKB_KEY_kana_middledot 0x04a5 /* deprecated */ +#define XKB_KEY_kana_WO 0x04a6 /* U+30F2 KATAKANA LETTER WO */ +#define XKB_KEY_kana_a 0x04a7 /* U+30A1 KATAKANA LETTER SMALL A */ +#define XKB_KEY_kana_i 0x04a8 /* U+30A3 KATAKANA LETTER SMALL I */ +#define XKB_KEY_kana_u 0x04a9 /* U+30A5 KATAKANA LETTER SMALL U */ +#define XKB_KEY_kana_e 0x04aa /* U+30A7 KATAKANA LETTER SMALL E */ +#define XKB_KEY_kana_o 0x04ab /* U+30A9 KATAKANA LETTER SMALL O */ +#define XKB_KEY_kana_ya 0x04ac /* U+30E3 KATAKANA LETTER SMALL YA */ +#define XKB_KEY_kana_yu 0x04ad /* U+30E5 KATAKANA LETTER SMALL YU */ +#define XKB_KEY_kana_yo 0x04ae /* U+30E7 KATAKANA LETTER SMALL YO */ +#define XKB_KEY_kana_tsu 0x04af /* U+30C3 KATAKANA LETTER SMALL TU */ +#define XKB_KEY_kana_tu 0x04af /* deprecated */ +#define XKB_KEY_prolongedsound 0x04b0 /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */ +#define XKB_KEY_kana_A 0x04b1 /* U+30A2 KATAKANA LETTER A */ +#define XKB_KEY_kana_I 0x04b2 /* U+30A4 KATAKANA LETTER I */ +#define XKB_KEY_kana_U 0x04b3 /* U+30A6 KATAKANA LETTER U */ +#define XKB_KEY_kana_E 0x04b4 /* U+30A8 KATAKANA LETTER E */ +#define XKB_KEY_kana_O 0x04b5 /* U+30AA KATAKANA LETTER O */ +#define XKB_KEY_kana_KA 0x04b6 /* U+30AB KATAKANA LETTER KA */ +#define XKB_KEY_kana_KI 0x04b7 /* U+30AD KATAKANA LETTER KI */ +#define XKB_KEY_kana_KU 0x04b8 /* U+30AF KATAKANA LETTER KU */ +#define XKB_KEY_kana_KE 0x04b9 /* U+30B1 KATAKANA LETTER KE */ +#define XKB_KEY_kana_KO 0x04ba /* U+30B3 KATAKANA LETTER KO */ +#define XKB_KEY_kana_SA 0x04bb /* U+30B5 KATAKANA LETTER SA */ +#define XKB_KEY_kana_SHI 0x04bc /* U+30B7 KATAKANA LETTER SI */ +#define XKB_KEY_kana_SU 0x04bd /* U+30B9 KATAKANA LETTER SU */ +#define XKB_KEY_kana_SE 0x04be /* U+30BB KATAKANA LETTER SE */ +#define XKB_KEY_kana_SO 0x04bf /* U+30BD KATAKANA LETTER SO */ +#define XKB_KEY_kana_TA 0x04c0 /* U+30BF KATAKANA LETTER TA */ +#define XKB_KEY_kana_CHI 0x04c1 /* U+30C1 KATAKANA LETTER TI */ +#define XKB_KEY_kana_TI 0x04c1 /* deprecated */ +#define XKB_KEY_kana_TSU 0x04c2 /* U+30C4 KATAKANA LETTER TU */ +#define XKB_KEY_kana_TU 0x04c2 /* deprecated */ +#define XKB_KEY_kana_TE 0x04c3 /* U+30C6 KATAKANA LETTER TE */ +#define XKB_KEY_kana_TO 0x04c4 /* U+30C8 KATAKANA LETTER TO */ +#define XKB_KEY_kana_NA 0x04c5 /* U+30CA KATAKANA LETTER NA */ +#define XKB_KEY_kana_NI 0x04c6 /* U+30CB KATAKANA LETTER NI */ +#define XKB_KEY_kana_NU 0x04c7 /* U+30CC KATAKANA LETTER NU */ +#define XKB_KEY_kana_NE 0x04c8 /* U+30CD KATAKANA LETTER NE */ +#define XKB_KEY_kana_NO 0x04c9 /* U+30CE KATAKANA LETTER NO */ +#define XKB_KEY_kana_HA 0x04ca /* U+30CF KATAKANA LETTER HA */ +#define XKB_KEY_kana_HI 0x04cb /* U+30D2 KATAKANA LETTER HI */ +#define XKB_KEY_kana_FU 0x04cc /* U+30D5 KATAKANA LETTER HU */ +#define XKB_KEY_kana_HU 0x04cc /* deprecated */ +#define XKB_KEY_kana_HE 0x04cd /* U+30D8 KATAKANA LETTER HE */ +#define XKB_KEY_kana_HO 0x04ce /* U+30DB KATAKANA LETTER HO */ +#define XKB_KEY_kana_MA 0x04cf /* U+30DE KATAKANA LETTER MA */ +#define XKB_KEY_kana_MI 0x04d0 /* U+30DF KATAKANA LETTER MI */ +#define XKB_KEY_kana_MU 0x04d1 /* U+30E0 KATAKANA LETTER MU */ +#define XKB_KEY_kana_ME 0x04d2 /* U+30E1 KATAKANA LETTER ME */ +#define XKB_KEY_kana_MO 0x04d3 /* U+30E2 KATAKANA LETTER MO */ +#define XKB_KEY_kana_YA 0x04d4 /* U+30E4 KATAKANA LETTER YA */ +#define XKB_KEY_kana_YU 0x04d5 /* U+30E6 KATAKANA LETTER YU */ +#define XKB_KEY_kana_YO 0x04d6 /* U+30E8 KATAKANA LETTER YO */ +#define XKB_KEY_kana_RA 0x04d7 /* U+30E9 KATAKANA LETTER RA */ +#define XKB_KEY_kana_RI 0x04d8 /* U+30EA KATAKANA LETTER RI */ +#define XKB_KEY_kana_RU 0x04d9 /* U+30EB KATAKANA LETTER RU */ +#define XKB_KEY_kana_RE 0x04da /* U+30EC KATAKANA LETTER RE */ +#define XKB_KEY_kana_RO 0x04db /* U+30ED KATAKANA LETTER RO */ +#define XKB_KEY_kana_WA 0x04dc /* U+30EF KATAKANA LETTER WA */ +#define XKB_KEY_kana_N 0x04dd /* U+30F3 KATAKANA LETTER N */ +#define XKB_KEY_voicedsound 0x04de /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */ +#define XKB_KEY_semivoicedsound 0x04df /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ +#define XKB_KEY_kana_switch 0xff7e /* Alias for mode_switch */ + +/* + * Arabic + * Byte 3 = 5 + */ + +#define XKB_KEY_Farsi_0 0x10006f0 /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */ +#define XKB_KEY_Farsi_1 0x10006f1 /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */ +#define XKB_KEY_Farsi_2 0x10006f2 /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */ +#define XKB_KEY_Farsi_3 0x10006f3 /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */ +#define XKB_KEY_Farsi_4 0x10006f4 /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */ +#define XKB_KEY_Farsi_5 0x10006f5 /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */ +#define XKB_KEY_Farsi_6 0x10006f6 /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */ +#define XKB_KEY_Farsi_7 0x10006f7 /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */ +#define XKB_KEY_Farsi_8 0x10006f8 /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */ +#define XKB_KEY_Farsi_9 0x10006f9 /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */ +#define XKB_KEY_Arabic_percent 0x100066a /* U+066A ARABIC PERCENT SIGN */ +#define XKB_KEY_Arabic_superscript_alef 0x1000670 /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */ +#define XKB_KEY_Arabic_tteh 0x1000679 /* U+0679 ARABIC LETTER TTEH */ +#define XKB_KEY_Arabic_peh 0x100067e /* U+067E ARABIC LETTER PEH */ +#define XKB_KEY_Arabic_tcheh 0x1000686 /* U+0686 ARABIC LETTER TCHEH */ +#define XKB_KEY_Arabic_ddal 0x1000688 /* U+0688 ARABIC LETTER DDAL */ +#define XKB_KEY_Arabic_rreh 0x1000691 /* U+0691 ARABIC LETTER RREH */ +#define XKB_KEY_Arabic_comma 0x05ac /* U+060C ARABIC COMMA */ +#define XKB_KEY_Arabic_fullstop 0x10006d4 /* U+06D4 ARABIC FULL STOP */ +#define XKB_KEY_Arabic_0 0x1000660 /* U+0660 ARABIC-INDIC DIGIT ZERO */ +#define XKB_KEY_Arabic_1 0x1000661 /* U+0661 ARABIC-INDIC DIGIT ONE */ +#define XKB_KEY_Arabic_2 0x1000662 /* U+0662 ARABIC-INDIC DIGIT TWO */ +#define XKB_KEY_Arabic_3 0x1000663 /* U+0663 ARABIC-INDIC DIGIT THREE */ +#define XKB_KEY_Arabic_4 0x1000664 /* U+0664 ARABIC-INDIC DIGIT FOUR */ +#define XKB_KEY_Arabic_5 0x1000665 /* U+0665 ARABIC-INDIC DIGIT FIVE */ +#define XKB_KEY_Arabic_6 0x1000666 /* U+0666 ARABIC-INDIC DIGIT SIX */ +#define XKB_KEY_Arabic_7 0x1000667 /* U+0667 ARABIC-INDIC DIGIT SEVEN */ +#define XKB_KEY_Arabic_8 0x1000668 /* U+0668 ARABIC-INDIC DIGIT EIGHT */ +#define XKB_KEY_Arabic_9 0x1000669 /* U+0669 ARABIC-INDIC DIGIT NINE */ +#define XKB_KEY_Arabic_semicolon 0x05bb /* U+061B ARABIC SEMICOLON */ +#define XKB_KEY_Arabic_question_mark 0x05bf /* U+061F ARABIC QUESTION MARK */ +#define XKB_KEY_Arabic_hamza 0x05c1 /* U+0621 ARABIC LETTER HAMZA */ +#define XKB_KEY_Arabic_maddaonalef 0x05c2 /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */ +#define XKB_KEY_Arabic_hamzaonalef 0x05c3 /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */ +#define XKB_KEY_Arabic_hamzaonwaw 0x05c4 /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */ +#define XKB_KEY_Arabic_hamzaunderalef 0x05c5 /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */ +#define XKB_KEY_Arabic_hamzaonyeh 0x05c6 /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */ +#define XKB_KEY_Arabic_alef 0x05c7 /* U+0627 ARABIC LETTER ALEF */ +#define XKB_KEY_Arabic_beh 0x05c8 /* U+0628 ARABIC LETTER BEH */ +#define XKB_KEY_Arabic_tehmarbuta 0x05c9 /* U+0629 ARABIC LETTER TEH MARBUTA */ +#define XKB_KEY_Arabic_teh 0x05ca /* U+062A ARABIC LETTER TEH */ +#define XKB_KEY_Arabic_theh 0x05cb /* U+062B ARABIC LETTER THEH */ +#define XKB_KEY_Arabic_jeem 0x05cc /* U+062C ARABIC LETTER JEEM */ +#define XKB_KEY_Arabic_hah 0x05cd /* U+062D ARABIC LETTER HAH */ +#define XKB_KEY_Arabic_khah 0x05ce /* U+062E ARABIC LETTER KHAH */ +#define XKB_KEY_Arabic_dal 0x05cf /* U+062F ARABIC LETTER DAL */ +#define XKB_KEY_Arabic_thal 0x05d0 /* U+0630 ARABIC LETTER THAL */ +#define XKB_KEY_Arabic_ra 0x05d1 /* U+0631 ARABIC LETTER REH */ +#define XKB_KEY_Arabic_zain 0x05d2 /* U+0632 ARABIC LETTER ZAIN */ +#define XKB_KEY_Arabic_seen 0x05d3 /* U+0633 ARABIC LETTER SEEN */ +#define XKB_KEY_Arabic_sheen 0x05d4 /* U+0634 ARABIC LETTER SHEEN */ +#define XKB_KEY_Arabic_sad 0x05d5 /* U+0635 ARABIC LETTER SAD */ +#define XKB_KEY_Arabic_dad 0x05d6 /* U+0636 ARABIC LETTER DAD */ +#define XKB_KEY_Arabic_tah 0x05d7 /* U+0637 ARABIC LETTER TAH */ +#define XKB_KEY_Arabic_zah 0x05d8 /* U+0638 ARABIC LETTER ZAH */ +#define XKB_KEY_Arabic_ain 0x05d9 /* U+0639 ARABIC LETTER AIN */ +#define XKB_KEY_Arabic_ghain 0x05da /* U+063A ARABIC LETTER GHAIN */ +#define XKB_KEY_Arabic_tatweel 0x05e0 /* U+0640 ARABIC TATWEEL */ +#define XKB_KEY_Arabic_feh 0x05e1 /* U+0641 ARABIC LETTER FEH */ +#define XKB_KEY_Arabic_qaf 0x05e2 /* U+0642 ARABIC LETTER QAF */ +#define XKB_KEY_Arabic_kaf 0x05e3 /* U+0643 ARABIC LETTER KAF */ +#define XKB_KEY_Arabic_lam 0x05e4 /* U+0644 ARABIC LETTER LAM */ +#define XKB_KEY_Arabic_meem 0x05e5 /* U+0645 ARABIC LETTER MEEM */ +#define XKB_KEY_Arabic_noon 0x05e6 /* U+0646 ARABIC LETTER NOON */ +#define XKB_KEY_Arabic_ha 0x05e7 /* U+0647 ARABIC LETTER HEH */ +#define XKB_KEY_Arabic_heh 0x05e7 /* deprecated */ +#define XKB_KEY_Arabic_waw 0x05e8 /* U+0648 ARABIC LETTER WAW */ +#define XKB_KEY_Arabic_alefmaksura 0x05e9 /* U+0649 ARABIC LETTER ALEF MAKSURA */ +#define XKB_KEY_Arabic_yeh 0x05ea /* U+064A ARABIC LETTER YEH */ +#define XKB_KEY_Arabic_fathatan 0x05eb /* U+064B ARABIC FATHATAN */ +#define XKB_KEY_Arabic_dammatan 0x05ec /* U+064C ARABIC DAMMATAN */ +#define XKB_KEY_Arabic_kasratan 0x05ed /* U+064D ARABIC KASRATAN */ +#define XKB_KEY_Arabic_fatha 0x05ee /* U+064E ARABIC FATHA */ +#define XKB_KEY_Arabic_damma 0x05ef /* U+064F ARABIC DAMMA */ +#define XKB_KEY_Arabic_kasra 0x05f0 /* U+0650 ARABIC KASRA */ +#define XKB_KEY_Arabic_shadda 0x05f1 /* U+0651 ARABIC SHADDA */ +#define XKB_KEY_Arabic_sukun 0x05f2 /* U+0652 ARABIC SUKUN */ +#define XKB_KEY_Arabic_madda_above 0x1000653 /* U+0653 ARABIC MADDAH ABOVE */ +#define XKB_KEY_Arabic_hamza_above 0x1000654 /* U+0654 ARABIC HAMZA ABOVE */ +#define XKB_KEY_Arabic_hamza_below 0x1000655 /* U+0655 ARABIC HAMZA BELOW */ +#define XKB_KEY_Arabic_jeh 0x1000698 /* U+0698 ARABIC LETTER JEH */ +#define XKB_KEY_Arabic_veh 0x10006a4 /* U+06A4 ARABIC LETTER VEH */ +#define XKB_KEY_Arabic_keheh 0x10006a9 /* U+06A9 ARABIC LETTER KEHEH */ +#define XKB_KEY_Arabic_gaf 0x10006af /* U+06AF ARABIC LETTER GAF */ +#define XKB_KEY_Arabic_noon_ghunna 0x10006ba /* U+06BA ARABIC LETTER NOON GHUNNA */ +#define XKB_KEY_Arabic_heh_doachashmee 0x10006be /* U+06BE ARABIC LETTER HEH DOACHASHMEE */ +#define XKB_KEY_Farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ +#define XKB_KEY_Arabic_farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ +#define XKB_KEY_Arabic_yeh_baree 0x10006d2 /* U+06D2 ARABIC LETTER YEH BARREE */ +#define XKB_KEY_Arabic_heh_goal 0x10006c1 /* U+06C1 ARABIC LETTER HEH GOAL */ +#define XKB_KEY_Arabic_switch 0xff7e /* Alias for mode_switch */ + +/* + * Cyrillic + * Byte 3 = 6 + */ +#define XKB_KEY_Cyrillic_GHE_bar 0x1000492 /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */ +#define XKB_KEY_Cyrillic_ghe_bar 0x1000493 /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */ +#define XKB_KEY_Cyrillic_ZHE_descender 0x1000496 /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */ +#define XKB_KEY_Cyrillic_zhe_descender 0x1000497 /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */ +#define XKB_KEY_Cyrillic_KA_descender 0x100049a /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */ +#define XKB_KEY_Cyrillic_ka_descender 0x100049b /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */ +#define XKB_KEY_Cyrillic_KA_vertstroke 0x100049c /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */ +#define XKB_KEY_Cyrillic_ka_vertstroke 0x100049d /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */ +#define XKB_KEY_Cyrillic_EN_descender 0x10004a2 /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */ +#define XKB_KEY_Cyrillic_en_descender 0x10004a3 /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */ +#define XKB_KEY_Cyrillic_U_straight 0x10004ae /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */ +#define XKB_KEY_Cyrillic_u_straight 0x10004af /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */ +#define XKB_KEY_Cyrillic_U_straight_bar 0x10004b0 /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */ +#define XKB_KEY_Cyrillic_u_straight_bar 0x10004b1 /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */ +#define XKB_KEY_Cyrillic_HA_descender 0x10004b2 /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */ +#define XKB_KEY_Cyrillic_ha_descender 0x10004b3 /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */ +#define XKB_KEY_Cyrillic_CHE_descender 0x10004b6 /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */ +#define XKB_KEY_Cyrillic_che_descender 0x10004b7 /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */ +#define XKB_KEY_Cyrillic_CHE_vertstroke 0x10004b8 /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */ +#define XKB_KEY_Cyrillic_che_vertstroke 0x10004b9 /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */ +#define XKB_KEY_Cyrillic_SHHA 0x10004ba /* U+04BA CYRILLIC CAPITAL LETTER SHHA */ +#define XKB_KEY_Cyrillic_shha 0x10004bb /* U+04BB CYRILLIC SMALL LETTER SHHA */ + +#define XKB_KEY_Cyrillic_SCHWA 0x10004d8 /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */ +#define XKB_KEY_Cyrillic_schwa 0x10004d9 /* U+04D9 CYRILLIC SMALL LETTER SCHWA */ +#define XKB_KEY_Cyrillic_I_macron 0x10004e2 /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */ +#define XKB_KEY_Cyrillic_i_macron 0x10004e3 /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */ +#define XKB_KEY_Cyrillic_O_bar 0x10004e8 /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */ +#define XKB_KEY_Cyrillic_o_bar 0x10004e9 /* U+04E9 CYRILLIC SMALL LETTER BARRED O */ +#define XKB_KEY_Cyrillic_U_macron 0x10004ee /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */ +#define XKB_KEY_Cyrillic_u_macron 0x10004ef /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */ + +#define XKB_KEY_Serbian_dje 0x06a1 /* U+0452 CYRILLIC SMALL LETTER DJE */ +#define XKB_KEY_Macedonia_gje 0x06a2 /* U+0453 CYRILLIC SMALL LETTER GJE */ +#define XKB_KEY_Cyrillic_io 0x06a3 /* U+0451 CYRILLIC SMALL LETTER IO */ +#define XKB_KEY_Ukrainian_ie 0x06a4 /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */ +#define XKB_KEY_Ukranian_je 0x06a4 /* deprecated */ +#define XKB_KEY_Macedonia_dse 0x06a5 /* U+0455 CYRILLIC SMALL LETTER DZE */ +#define XKB_KEY_Ukrainian_i 0x06a6 /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ +#define XKB_KEY_Ukranian_i 0x06a6 /* deprecated */ +#define XKB_KEY_Ukrainian_yi 0x06a7 /* U+0457 CYRILLIC SMALL LETTER YI */ +#define XKB_KEY_Ukranian_yi 0x06a7 /* deprecated */ +#define XKB_KEY_Cyrillic_je 0x06a8 /* U+0458 CYRILLIC SMALL LETTER JE */ +#define XKB_KEY_Serbian_je 0x06a8 /* deprecated */ +#define XKB_KEY_Cyrillic_lje 0x06a9 /* U+0459 CYRILLIC SMALL LETTER LJE */ +#define XKB_KEY_Serbian_lje 0x06a9 /* deprecated */ +#define XKB_KEY_Cyrillic_nje 0x06aa /* U+045A CYRILLIC SMALL LETTER NJE */ +#define XKB_KEY_Serbian_nje 0x06aa /* deprecated */ +#define XKB_KEY_Serbian_tshe 0x06ab /* U+045B CYRILLIC SMALL LETTER TSHE */ +#define XKB_KEY_Macedonia_kje 0x06ac /* U+045C CYRILLIC SMALL LETTER KJE */ +#define XKB_KEY_Ukrainian_ghe_with_upturn 0x06ad /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */ +#define XKB_KEY_Byelorussian_shortu 0x06ae /* U+045E CYRILLIC SMALL LETTER SHORT U */ +#define XKB_KEY_Cyrillic_dzhe 0x06af /* U+045F CYRILLIC SMALL LETTER DZHE */ +#define XKB_KEY_Serbian_dze 0x06af /* deprecated */ +#define XKB_KEY_numerosign 0x06b0 /* U+2116 NUMERO SIGN */ +#define XKB_KEY_Serbian_DJE 0x06b1 /* U+0402 CYRILLIC CAPITAL LETTER DJE */ +#define XKB_KEY_Macedonia_GJE 0x06b2 /* U+0403 CYRILLIC CAPITAL LETTER GJE */ +#define XKB_KEY_Cyrillic_IO 0x06b3 /* U+0401 CYRILLIC CAPITAL LETTER IO */ +#define XKB_KEY_Ukrainian_IE 0x06b4 /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */ +#define XKB_KEY_Ukranian_JE 0x06b4 /* deprecated */ +#define XKB_KEY_Macedonia_DSE 0x06b5 /* U+0405 CYRILLIC CAPITAL LETTER DZE */ +#define XKB_KEY_Ukrainian_I 0x06b6 /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ +#define XKB_KEY_Ukranian_I 0x06b6 /* deprecated */ +#define XKB_KEY_Ukrainian_YI 0x06b7 /* U+0407 CYRILLIC CAPITAL LETTER YI */ +#define XKB_KEY_Ukranian_YI 0x06b7 /* deprecated */ +#define XKB_KEY_Cyrillic_JE 0x06b8 /* U+0408 CYRILLIC CAPITAL LETTER JE */ +#define XKB_KEY_Serbian_JE 0x06b8 /* deprecated */ +#define XKB_KEY_Cyrillic_LJE 0x06b9 /* U+0409 CYRILLIC CAPITAL LETTER LJE */ +#define XKB_KEY_Serbian_LJE 0x06b9 /* deprecated */ +#define XKB_KEY_Cyrillic_NJE 0x06ba /* U+040A CYRILLIC CAPITAL LETTER NJE */ +#define XKB_KEY_Serbian_NJE 0x06ba /* deprecated */ +#define XKB_KEY_Serbian_TSHE 0x06bb /* U+040B CYRILLIC CAPITAL LETTER TSHE */ +#define XKB_KEY_Macedonia_KJE 0x06bc /* U+040C CYRILLIC CAPITAL LETTER KJE */ +#define XKB_KEY_Ukrainian_GHE_WITH_UPTURN 0x06bd /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ +#define XKB_KEY_Byelorussian_SHORTU 0x06be /* U+040E CYRILLIC CAPITAL LETTER SHORT U */ +#define XKB_KEY_Cyrillic_DZHE 0x06bf /* U+040F CYRILLIC CAPITAL LETTER DZHE */ +#define XKB_KEY_Serbian_DZE 0x06bf /* deprecated */ +#define XKB_KEY_Cyrillic_yu 0x06c0 /* U+044E CYRILLIC SMALL LETTER YU */ +#define XKB_KEY_Cyrillic_a 0x06c1 /* U+0430 CYRILLIC SMALL LETTER A */ +#define XKB_KEY_Cyrillic_be 0x06c2 /* U+0431 CYRILLIC SMALL LETTER BE */ +#define XKB_KEY_Cyrillic_tse 0x06c3 /* U+0446 CYRILLIC SMALL LETTER TSE */ +#define XKB_KEY_Cyrillic_de 0x06c4 /* U+0434 CYRILLIC SMALL LETTER DE */ +#define XKB_KEY_Cyrillic_ie 0x06c5 /* U+0435 CYRILLIC SMALL LETTER IE */ +#define XKB_KEY_Cyrillic_ef 0x06c6 /* U+0444 CYRILLIC SMALL LETTER EF */ +#define XKB_KEY_Cyrillic_ghe 0x06c7 /* U+0433 CYRILLIC SMALL LETTER GHE */ +#define XKB_KEY_Cyrillic_ha 0x06c8 /* U+0445 CYRILLIC SMALL LETTER HA */ +#define XKB_KEY_Cyrillic_i 0x06c9 /* U+0438 CYRILLIC SMALL LETTER I */ +#define XKB_KEY_Cyrillic_shorti 0x06ca /* U+0439 CYRILLIC SMALL LETTER SHORT I */ +#define XKB_KEY_Cyrillic_ka 0x06cb /* U+043A CYRILLIC SMALL LETTER KA */ +#define XKB_KEY_Cyrillic_el 0x06cc /* U+043B CYRILLIC SMALL LETTER EL */ +#define XKB_KEY_Cyrillic_em 0x06cd /* U+043C CYRILLIC SMALL LETTER EM */ +#define XKB_KEY_Cyrillic_en 0x06ce /* U+043D CYRILLIC SMALL LETTER EN */ +#define XKB_KEY_Cyrillic_o 0x06cf /* U+043E CYRILLIC SMALL LETTER O */ +#define XKB_KEY_Cyrillic_pe 0x06d0 /* U+043F CYRILLIC SMALL LETTER PE */ +#define XKB_KEY_Cyrillic_ya 0x06d1 /* U+044F CYRILLIC SMALL LETTER YA */ +#define XKB_KEY_Cyrillic_er 0x06d2 /* U+0440 CYRILLIC SMALL LETTER ER */ +#define XKB_KEY_Cyrillic_es 0x06d3 /* U+0441 CYRILLIC SMALL LETTER ES */ +#define XKB_KEY_Cyrillic_te 0x06d4 /* U+0442 CYRILLIC SMALL LETTER TE */ +#define XKB_KEY_Cyrillic_u 0x06d5 /* U+0443 CYRILLIC SMALL LETTER U */ +#define XKB_KEY_Cyrillic_zhe 0x06d6 /* U+0436 CYRILLIC SMALL LETTER ZHE */ +#define XKB_KEY_Cyrillic_ve 0x06d7 /* U+0432 CYRILLIC SMALL LETTER VE */ +#define XKB_KEY_Cyrillic_softsign 0x06d8 /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */ +#define XKB_KEY_Cyrillic_yeru 0x06d9 /* U+044B CYRILLIC SMALL LETTER YERU */ +#define XKB_KEY_Cyrillic_ze 0x06da /* U+0437 CYRILLIC SMALL LETTER ZE */ +#define XKB_KEY_Cyrillic_sha 0x06db /* U+0448 CYRILLIC SMALL LETTER SHA */ +#define XKB_KEY_Cyrillic_e 0x06dc /* U+044D CYRILLIC SMALL LETTER E */ +#define XKB_KEY_Cyrillic_shcha 0x06dd /* U+0449 CYRILLIC SMALL LETTER SHCHA */ +#define XKB_KEY_Cyrillic_che 0x06de /* U+0447 CYRILLIC SMALL LETTER CHE */ +#define XKB_KEY_Cyrillic_hardsign 0x06df /* U+044A CYRILLIC SMALL LETTER HARD SIGN */ +#define XKB_KEY_Cyrillic_YU 0x06e0 /* U+042E CYRILLIC CAPITAL LETTER YU */ +#define XKB_KEY_Cyrillic_A 0x06e1 /* U+0410 CYRILLIC CAPITAL LETTER A */ +#define XKB_KEY_Cyrillic_BE 0x06e2 /* U+0411 CYRILLIC CAPITAL LETTER BE */ +#define XKB_KEY_Cyrillic_TSE 0x06e3 /* U+0426 CYRILLIC CAPITAL LETTER TSE */ +#define XKB_KEY_Cyrillic_DE 0x06e4 /* U+0414 CYRILLIC CAPITAL LETTER DE */ +#define XKB_KEY_Cyrillic_IE 0x06e5 /* U+0415 CYRILLIC CAPITAL LETTER IE */ +#define XKB_KEY_Cyrillic_EF 0x06e6 /* U+0424 CYRILLIC CAPITAL LETTER EF */ +#define XKB_KEY_Cyrillic_GHE 0x06e7 /* U+0413 CYRILLIC CAPITAL LETTER GHE */ +#define XKB_KEY_Cyrillic_HA 0x06e8 /* U+0425 CYRILLIC CAPITAL LETTER HA */ +#define XKB_KEY_Cyrillic_I 0x06e9 /* U+0418 CYRILLIC CAPITAL LETTER I */ +#define XKB_KEY_Cyrillic_SHORTI 0x06ea /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */ +#define XKB_KEY_Cyrillic_KA 0x06eb /* U+041A CYRILLIC CAPITAL LETTER KA */ +#define XKB_KEY_Cyrillic_EL 0x06ec /* U+041B CYRILLIC CAPITAL LETTER EL */ +#define XKB_KEY_Cyrillic_EM 0x06ed /* U+041C CYRILLIC CAPITAL LETTER EM */ +#define XKB_KEY_Cyrillic_EN 0x06ee /* U+041D CYRILLIC CAPITAL LETTER EN */ +#define XKB_KEY_Cyrillic_O 0x06ef /* U+041E CYRILLIC CAPITAL LETTER O */ +#define XKB_KEY_Cyrillic_PE 0x06f0 /* U+041F CYRILLIC CAPITAL LETTER PE */ +#define XKB_KEY_Cyrillic_YA 0x06f1 /* U+042F CYRILLIC CAPITAL LETTER YA */ +#define XKB_KEY_Cyrillic_ER 0x06f2 /* U+0420 CYRILLIC CAPITAL LETTER ER */ +#define XKB_KEY_Cyrillic_ES 0x06f3 /* U+0421 CYRILLIC CAPITAL LETTER ES */ +#define XKB_KEY_Cyrillic_TE 0x06f4 /* U+0422 CYRILLIC CAPITAL LETTER TE */ +#define XKB_KEY_Cyrillic_U 0x06f5 /* U+0423 CYRILLIC CAPITAL LETTER U */ +#define XKB_KEY_Cyrillic_ZHE 0x06f6 /* U+0416 CYRILLIC CAPITAL LETTER ZHE */ +#define XKB_KEY_Cyrillic_VE 0x06f7 /* U+0412 CYRILLIC CAPITAL LETTER VE */ +#define XKB_KEY_Cyrillic_SOFTSIGN 0x06f8 /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */ +#define XKB_KEY_Cyrillic_YERU 0x06f9 /* U+042B CYRILLIC CAPITAL LETTER YERU */ +#define XKB_KEY_Cyrillic_ZE 0x06fa /* U+0417 CYRILLIC CAPITAL LETTER ZE */ +#define XKB_KEY_Cyrillic_SHA 0x06fb /* U+0428 CYRILLIC CAPITAL LETTER SHA */ +#define XKB_KEY_Cyrillic_E 0x06fc /* U+042D CYRILLIC CAPITAL LETTER E */ +#define XKB_KEY_Cyrillic_SHCHA 0x06fd /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */ +#define XKB_KEY_Cyrillic_CHE 0x06fe /* U+0427 CYRILLIC CAPITAL LETTER CHE */ +#define XKB_KEY_Cyrillic_HARDSIGN 0x06ff /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */ + +/* + * Greek + * (based on an early draft of, and not quite identical to, ISO/IEC 8859-7) + * Byte 3 = 7 + */ + +#define XKB_KEY_Greek_ALPHAaccent 0x07a1 /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */ +#define XKB_KEY_Greek_EPSILONaccent 0x07a2 /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */ +#define XKB_KEY_Greek_ETAaccent 0x07a3 /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */ +#define XKB_KEY_Greek_IOTAaccent 0x07a4 /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */ +#define XKB_KEY_Greek_IOTAdieresis 0x07a5 /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ +#define XKB_KEY_Greek_IOTAdiaeresis 0x07a5 /* old typo */ +#define XKB_KEY_Greek_OMICRONaccent 0x07a7 /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */ +#define XKB_KEY_Greek_UPSILONaccent 0x07a8 /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */ +#define XKB_KEY_Greek_UPSILONdieresis 0x07a9 /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ +#define XKB_KEY_Greek_OMEGAaccent 0x07ab /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */ +#define XKB_KEY_Greek_accentdieresis 0x07ae /* U+0385 GREEK DIALYTIKA TONOS */ +#define XKB_KEY_Greek_horizbar 0x07af /* U+2015 HORIZONTAL BAR */ +#define XKB_KEY_Greek_alphaaccent 0x07b1 /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */ +#define XKB_KEY_Greek_epsilonaccent 0x07b2 /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */ +#define XKB_KEY_Greek_etaaccent 0x07b3 /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */ +#define XKB_KEY_Greek_iotaaccent 0x07b4 /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */ +#define XKB_KEY_Greek_iotadieresis 0x07b5 /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */ +#define XKB_KEY_Greek_iotaaccentdieresis 0x07b6 /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ +#define XKB_KEY_Greek_omicronaccent 0x07b7 /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */ +#define XKB_KEY_Greek_upsilonaccent 0x07b8 /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */ +#define XKB_KEY_Greek_upsilondieresis 0x07b9 /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ +#define XKB_KEY_Greek_upsilonaccentdieresis 0x07ba /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ +#define XKB_KEY_Greek_omegaaccent 0x07bb /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */ +#define XKB_KEY_Greek_ALPHA 0x07c1 /* U+0391 GREEK CAPITAL LETTER ALPHA */ +#define XKB_KEY_Greek_BETA 0x07c2 /* U+0392 GREEK CAPITAL LETTER BETA */ +#define XKB_KEY_Greek_GAMMA 0x07c3 /* U+0393 GREEK CAPITAL LETTER GAMMA */ +#define XKB_KEY_Greek_DELTA 0x07c4 /* U+0394 GREEK CAPITAL LETTER DELTA */ +#define XKB_KEY_Greek_EPSILON 0x07c5 /* U+0395 GREEK CAPITAL LETTER EPSILON */ +#define XKB_KEY_Greek_ZETA 0x07c6 /* U+0396 GREEK CAPITAL LETTER ZETA */ +#define XKB_KEY_Greek_ETA 0x07c7 /* U+0397 GREEK CAPITAL LETTER ETA */ +#define XKB_KEY_Greek_THETA 0x07c8 /* U+0398 GREEK CAPITAL LETTER THETA */ +#define XKB_KEY_Greek_IOTA 0x07c9 /* U+0399 GREEK CAPITAL LETTER IOTA */ +#define XKB_KEY_Greek_KAPPA 0x07ca /* U+039A GREEK CAPITAL LETTER KAPPA */ +#define XKB_KEY_Greek_LAMDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ +#define XKB_KEY_Greek_LAMBDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ +#define XKB_KEY_Greek_MU 0x07cc /* U+039C GREEK CAPITAL LETTER MU */ +#define XKB_KEY_Greek_NU 0x07cd /* U+039D GREEK CAPITAL LETTER NU */ +#define XKB_KEY_Greek_XI 0x07ce /* U+039E GREEK CAPITAL LETTER XI */ +#define XKB_KEY_Greek_OMICRON 0x07cf /* U+039F GREEK CAPITAL LETTER OMICRON */ +#define XKB_KEY_Greek_PI 0x07d0 /* U+03A0 GREEK CAPITAL LETTER PI */ +#define XKB_KEY_Greek_RHO 0x07d1 /* U+03A1 GREEK CAPITAL LETTER RHO */ +#define XKB_KEY_Greek_SIGMA 0x07d2 /* U+03A3 GREEK CAPITAL LETTER SIGMA */ +#define XKB_KEY_Greek_TAU 0x07d4 /* U+03A4 GREEK CAPITAL LETTER TAU */ +#define XKB_KEY_Greek_UPSILON 0x07d5 /* U+03A5 GREEK CAPITAL LETTER UPSILON */ +#define XKB_KEY_Greek_PHI 0x07d6 /* U+03A6 GREEK CAPITAL LETTER PHI */ +#define XKB_KEY_Greek_CHI 0x07d7 /* U+03A7 GREEK CAPITAL LETTER CHI */ +#define XKB_KEY_Greek_PSI 0x07d8 /* U+03A8 GREEK CAPITAL LETTER PSI */ +#define XKB_KEY_Greek_OMEGA 0x07d9 /* U+03A9 GREEK CAPITAL LETTER OMEGA */ +#define XKB_KEY_Greek_alpha 0x07e1 /* U+03B1 GREEK SMALL LETTER ALPHA */ +#define XKB_KEY_Greek_beta 0x07e2 /* U+03B2 GREEK SMALL LETTER BETA */ +#define XKB_KEY_Greek_gamma 0x07e3 /* U+03B3 GREEK SMALL LETTER GAMMA */ +#define XKB_KEY_Greek_delta 0x07e4 /* U+03B4 GREEK SMALL LETTER DELTA */ +#define XKB_KEY_Greek_epsilon 0x07e5 /* U+03B5 GREEK SMALL LETTER EPSILON */ +#define XKB_KEY_Greek_zeta 0x07e6 /* U+03B6 GREEK SMALL LETTER ZETA */ +#define XKB_KEY_Greek_eta 0x07e7 /* U+03B7 GREEK SMALL LETTER ETA */ +#define XKB_KEY_Greek_theta 0x07e8 /* U+03B8 GREEK SMALL LETTER THETA */ +#define XKB_KEY_Greek_iota 0x07e9 /* U+03B9 GREEK SMALL LETTER IOTA */ +#define XKB_KEY_Greek_kappa 0x07ea /* U+03BA GREEK SMALL LETTER KAPPA */ +#define XKB_KEY_Greek_lamda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ +#define XKB_KEY_Greek_lambda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ +#define XKB_KEY_Greek_mu 0x07ec /* U+03BC GREEK SMALL LETTER MU */ +#define XKB_KEY_Greek_nu 0x07ed /* U+03BD GREEK SMALL LETTER NU */ +#define XKB_KEY_Greek_xi 0x07ee /* U+03BE GREEK SMALL LETTER XI */ +#define XKB_KEY_Greek_omicron 0x07ef /* U+03BF GREEK SMALL LETTER OMICRON */ +#define XKB_KEY_Greek_pi 0x07f0 /* U+03C0 GREEK SMALL LETTER PI */ +#define XKB_KEY_Greek_rho 0x07f1 /* U+03C1 GREEK SMALL LETTER RHO */ +#define XKB_KEY_Greek_sigma 0x07f2 /* U+03C3 GREEK SMALL LETTER SIGMA */ +#define XKB_KEY_Greek_finalsmallsigma 0x07f3 /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */ +#define XKB_KEY_Greek_tau 0x07f4 /* U+03C4 GREEK SMALL LETTER TAU */ +#define XKB_KEY_Greek_upsilon 0x07f5 /* U+03C5 GREEK SMALL LETTER UPSILON */ +#define XKB_KEY_Greek_phi 0x07f6 /* U+03C6 GREEK SMALL LETTER PHI */ +#define XKB_KEY_Greek_chi 0x07f7 /* U+03C7 GREEK SMALL LETTER CHI */ +#define XKB_KEY_Greek_psi 0x07f8 /* U+03C8 GREEK SMALL LETTER PSI */ +#define XKB_KEY_Greek_omega 0x07f9 /* U+03C9 GREEK SMALL LETTER OMEGA */ +#define XKB_KEY_Greek_switch 0xff7e /* Alias for mode_switch */ + +/* + * Technical + * (from the DEC VT330/VT420 Technical Character Set, http://vt100.net/charsets/technical.html) + * Byte 3 = 8 + */ + +#define XKB_KEY_leftradical 0x08a1 /* U+23B7 RADICAL SYMBOL BOTTOM */ +#define XKB_KEY_topleftradical 0x08a2 /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/ +#define XKB_KEY_horizconnector 0x08a3 /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/ +#define XKB_KEY_topintegral 0x08a4 /* U+2320 TOP HALF INTEGRAL */ +#define XKB_KEY_botintegral 0x08a5 /* U+2321 BOTTOM HALF INTEGRAL */ +#define XKB_KEY_vertconnector 0x08a6 /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/ +#define XKB_KEY_topleftsqbracket 0x08a7 /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */ +#define XKB_KEY_botleftsqbracket 0x08a8 /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */ +#define XKB_KEY_toprightsqbracket 0x08a9 /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */ +#define XKB_KEY_botrightsqbracket 0x08aa /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */ +#define XKB_KEY_topleftparens 0x08ab /* U+239B LEFT PARENTHESIS UPPER HOOK */ +#define XKB_KEY_botleftparens 0x08ac /* U+239D LEFT PARENTHESIS LOWER HOOK */ +#define XKB_KEY_toprightparens 0x08ad /* U+239E RIGHT PARENTHESIS UPPER HOOK */ +#define XKB_KEY_botrightparens 0x08ae /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */ +#define XKB_KEY_leftmiddlecurlybrace 0x08af /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */ +#define XKB_KEY_rightmiddlecurlybrace 0x08b0 /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */ +#define XKB_KEY_topleftsummation 0x08b1 +#define XKB_KEY_botleftsummation 0x08b2 +#define XKB_KEY_topvertsummationconnector 0x08b3 +#define XKB_KEY_botvertsummationconnector 0x08b4 +#define XKB_KEY_toprightsummation 0x08b5 +#define XKB_KEY_botrightsummation 0x08b6 +#define XKB_KEY_rightmiddlesummation 0x08b7 +#define XKB_KEY_lessthanequal 0x08bc /* U+2264 LESS-THAN OR EQUAL TO */ +#define XKB_KEY_notequal 0x08bd /* U+2260 NOT EQUAL TO */ +#define XKB_KEY_greaterthanequal 0x08be /* U+2265 GREATER-THAN OR EQUAL TO */ +#define XKB_KEY_integral 0x08bf /* U+222B INTEGRAL */ +#define XKB_KEY_therefore 0x08c0 /* U+2234 THEREFORE */ +#define XKB_KEY_variation 0x08c1 /* U+221D PROPORTIONAL TO */ +#define XKB_KEY_infinity 0x08c2 /* U+221E INFINITY */ +#define XKB_KEY_nabla 0x08c5 /* U+2207 NABLA */ +#define XKB_KEY_approximate 0x08c8 /* U+223C TILDE OPERATOR */ +#define XKB_KEY_similarequal 0x08c9 /* U+2243 ASYMPTOTICALLY EQUAL TO */ +#define XKB_KEY_ifonlyif 0x08cd /* U+21D4 LEFT RIGHT DOUBLE ARROW */ +#define XKB_KEY_implies 0x08ce /* U+21D2 RIGHTWARDS DOUBLE ARROW */ +#define XKB_KEY_identical 0x08cf /* U+2261 IDENTICAL TO */ +#define XKB_KEY_radical 0x08d6 /* U+221A SQUARE ROOT */ +#define XKB_KEY_includedin 0x08da /* U+2282 SUBSET OF */ +#define XKB_KEY_includes 0x08db /* U+2283 SUPERSET OF */ +#define XKB_KEY_intersection 0x08dc /* U+2229 INTERSECTION */ +#define XKB_KEY_union 0x08dd /* U+222A UNION */ +#define XKB_KEY_logicaland 0x08de /* U+2227 LOGICAL AND */ +#define XKB_KEY_logicalor 0x08df /* U+2228 LOGICAL OR */ +#define XKB_KEY_partialderivative 0x08ef /* U+2202 PARTIAL DIFFERENTIAL */ +#define XKB_KEY_function 0x08f6 /* U+0192 LATIN SMALL LETTER F WITH HOOK */ +#define XKB_KEY_leftarrow 0x08fb /* U+2190 LEFTWARDS ARROW */ +#define XKB_KEY_uparrow 0x08fc /* U+2191 UPWARDS ARROW */ +#define XKB_KEY_rightarrow 0x08fd /* U+2192 RIGHTWARDS ARROW */ +#define XKB_KEY_downarrow 0x08fe /* U+2193 DOWNWARDS ARROW */ + +/* + * Special + * (from the DEC VT100 Special Graphics Character Set) + * Byte 3 = 9 + */ + +#define XKB_KEY_blank 0x09df +#define XKB_KEY_soliddiamond 0x09e0 /* U+25C6 BLACK DIAMOND */ +#define XKB_KEY_checkerboard 0x09e1 /* U+2592 MEDIUM SHADE */ +#define XKB_KEY_ht 0x09e2 /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */ +#define XKB_KEY_ff 0x09e3 /* U+240C SYMBOL FOR FORM FEED */ +#define XKB_KEY_cr 0x09e4 /* U+240D SYMBOL FOR CARRIAGE RETURN */ +#define XKB_KEY_lf 0x09e5 /* U+240A SYMBOL FOR LINE FEED */ +#define XKB_KEY_nl 0x09e8 /* U+2424 SYMBOL FOR NEWLINE */ +#define XKB_KEY_vt 0x09e9 /* U+240B SYMBOL FOR VERTICAL TABULATION */ +#define XKB_KEY_lowrightcorner 0x09ea /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */ +#define XKB_KEY_uprightcorner 0x09eb /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */ +#define XKB_KEY_upleftcorner 0x09ec /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */ +#define XKB_KEY_lowleftcorner 0x09ed /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */ +#define XKB_KEY_crossinglines 0x09ee /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ +#define XKB_KEY_horizlinescan1 0x09ef /* U+23BA HORIZONTAL SCAN LINE-1 */ +#define XKB_KEY_horizlinescan3 0x09f0 /* U+23BB HORIZONTAL SCAN LINE-3 */ +#define XKB_KEY_horizlinescan5 0x09f1 /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */ +#define XKB_KEY_horizlinescan7 0x09f2 /* U+23BC HORIZONTAL SCAN LINE-7 */ +#define XKB_KEY_horizlinescan9 0x09f3 /* U+23BD HORIZONTAL SCAN LINE-9 */ +#define XKB_KEY_leftt 0x09f4 /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ +#define XKB_KEY_rightt 0x09f5 /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */ +#define XKB_KEY_bott 0x09f6 /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */ +#define XKB_KEY_topt 0x09f7 /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ +#define XKB_KEY_vertbar 0x09f8 /* U+2502 BOX DRAWINGS LIGHT VERTICAL */ + +/* + * Publishing + * (these are probably from a long forgotten DEC Publishing + * font that once shipped with DECwrite) + * Byte 3 = 0x0a + */ + +#define XKB_KEY_emspace 0x0aa1 /* U+2003 EM SPACE */ +#define XKB_KEY_enspace 0x0aa2 /* U+2002 EN SPACE */ +#define XKB_KEY_em3space 0x0aa3 /* U+2004 THREE-PER-EM SPACE */ +#define XKB_KEY_em4space 0x0aa4 /* U+2005 FOUR-PER-EM SPACE */ +#define XKB_KEY_digitspace 0x0aa5 /* U+2007 FIGURE SPACE */ +#define XKB_KEY_punctspace 0x0aa6 /* U+2008 PUNCTUATION SPACE */ +#define XKB_KEY_thinspace 0x0aa7 /* U+2009 THIN SPACE */ +#define XKB_KEY_hairspace 0x0aa8 /* U+200A HAIR SPACE */ +#define XKB_KEY_emdash 0x0aa9 /* U+2014 EM DASH */ +#define XKB_KEY_endash 0x0aaa /* U+2013 EN DASH */ +#define XKB_KEY_signifblank 0x0aac /*(U+2423 OPEN BOX)*/ +#define XKB_KEY_ellipsis 0x0aae /* U+2026 HORIZONTAL ELLIPSIS */ +#define XKB_KEY_doubbaselinedot 0x0aaf /* U+2025 TWO DOT LEADER */ +#define XKB_KEY_onethird 0x0ab0 /* U+2153 VULGAR FRACTION ONE THIRD */ +#define XKB_KEY_twothirds 0x0ab1 /* U+2154 VULGAR FRACTION TWO THIRDS */ +#define XKB_KEY_onefifth 0x0ab2 /* U+2155 VULGAR FRACTION ONE FIFTH */ +#define XKB_KEY_twofifths 0x0ab3 /* U+2156 VULGAR FRACTION TWO FIFTHS */ +#define XKB_KEY_threefifths 0x0ab4 /* U+2157 VULGAR FRACTION THREE FIFTHS */ +#define XKB_KEY_fourfifths 0x0ab5 /* U+2158 VULGAR FRACTION FOUR FIFTHS */ +#define XKB_KEY_onesixth 0x0ab6 /* U+2159 VULGAR FRACTION ONE SIXTH */ +#define XKB_KEY_fivesixths 0x0ab7 /* U+215A VULGAR FRACTION FIVE SIXTHS */ +#define XKB_KEY_careof 0x0ab8 /* U+2105 CARE OF */ +#define XKB_KEY_figdash 0x0abb /* U+2012 FIGURE DASH */ +#define XKB_KEY_leftanglebracket 0x0abc /*(U+27E8 MATHEMATICAL LEFT ANGLE BRACKET)*/ +#define XKB_KEY_decimalpoint 0x0abd /*(U+002E FULL STOP)*/ +#define XKB_KEY_rightanglebracket 0x0abe /*(U+27E9 MATHEMATICAL RIGHT ANGLE BRACKET)*/ +#define XKB_KEY_marker 0x0abf +#define XKB_KEY_oneeighth 0x0ac3 /* U+215B VULGAR FRACTION ONE EIGHTH */ +#define XKB_KEY_threeeighths 0x0ac4 /* U+215C VULGAR FRACTION THREE EIGHTHS */ +#define XKB_KEY_fiveeighths 0x0ac5 /* U+215D VULGAR FRACTION FIVE EIGHTHS */ +#define XKB_KEY_seveneighths 0x0ac6 /* U+215E VULGAR FRACTION SEVEN EIGHTHS */ +#define XKB_KEY_trademark 0x0ac9 /* U+2122 TRADE MARK SIGN */ +#define XKB_KEY_signaturemark 0x0aca /*(U+2613 SALTIRE)*/ +#define XKB_KEY_trademarkincircle 0x0acb +#define XKB_KEY_leftopentriangle 0x0acc /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/ +#define XKB_KEY_rightopentriangle 0x0acd /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/ +#define XKB_KEY_emopencircle 0x0ace /*(U+25CB WHITE CIRCLE)*/ +#define XKB_KEY_emopenrectangle 0x0acf /*(U+25AF WHITE VERTICAL RECTANGLE)*/ +#define XKB_KEY_leftsinglequotemark 0x0ad0 /* U+2018 LEFT SINGLE QUOTATION MARK */ +#define XKB_KEY_rightsinglequotemark 0x0ad1 /* U+2019 RIGHT SINGLE QUOTATION MARK */ +#define XKB_KEY_leftdoublequotemark 0x0ad2 /* U+201C LEFT DOUBLE QUOTATION MARK */ +#define XKB_KEY_rightdoublequotemark 0x0ad3 /* U+201D RIGHT DOUBLE QUOTATION MARK */ +#define XKB_KEY_prescription 0x0ad4 /* U+211E PRESCRIPTION TAKE */ +#define XKB_KEY_permille 0x0ad5 /* U+2030 PER MILLE SIGN */ +#define XKB_KEY_minutes 0x0ad6 /* U+2032 PRIME */ +#define XKB_KEY_seconds 0x0ad7 /* U+2033 DOUBLE PRIME */ +#define XKB_KEY_latincross 0x0ad9 /* U+271D LATIN CROSS */ +#define XKB_KEY_hexagram 0x0ada +#define XKB_KEY_filledrectbullet 0x0adb /*(U+25AC BLACK RECTANGLE)*/ +#define XKB_KEY_filledlefttribullet 0x0adc /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/ +#define XKB_KEY_filledrighttribullet 0x0add /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/ +#define XKB_KEY_emfilledcircle 0x0ade /*(U+25CF BLACK CIRCLE)*/ +#define XKB_KEY_emfilledrect 0x0adf /*(U+25AE BLACK VERTICAL RECTANGLE)*/ +#define XKB_KEY_enopencircbullet 0x0ae0 /*(U+25E6 WHITE BULLET)*/ +#define XKB_KEY_enopensquarebullet 0x0ae1 /*(U+25AB WHITE SMALL SQUARE)*/ +#define XKB_KEY_openrectbullet 0x0ae2 /*(U+25AD WHITE RECTANGLE)*/ +#define XKB_KEY_opentribulletup 0x0ae3 /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/ +#define XKB_KEY_opentribulletdown 0x0ae4 /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/ +#define XKB_KEY_openstar 0x0ae5 /*(U+2606 WHITE STAR)*/ +#define XKB_KEY_enfilledcircbullet 0x0ae6 /*(U+2022 BULLET)*/ +#define XKB_KEY_enfilledsqbullet 0x0ae7 /*(U+25AA BLACK SMALL SQUARE)*/ +#define XKB_KEY_filledtribulletup 0x0ae8 /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/ +#define XKB_KEY_filledtribulletdown 0x0ae9 /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/ +#define XKB_KEY_leftpointer 0x0aea /*(U+261C WHITE LEFT POINTING INDEX)*/ +#define XKB_KEY_rightpointer 0x0aeb /*(U+261E WHITE RIGHT POINTING INDEX)*/ +#define XKB_KEY_club 0x0aec /* U+2663 BLACK CLUB SUIT */ +#define XKB_KEY_diamond 0x0aed /* U+2666 BLACK DIAMOND SUIT */ +#define XKB_KEY_heart 0x0aee /* U+2665 BLACK HEART SUIT */ +#define XKB_KEY_maltesecross 0x0af0 /* U+2720 MALTESE CROSS */ +#define XKB_KEY_dagger 0x0af1 /* U+2020 DAGGER */ +#define XKB_KEY_doubledagger 0x0af2 /* U+2021 DOUBLE DAGGER */ +#define XKB_KEY_checkmark 0x0af3 /* U+2713 CHECK MARK */ +#define XKB_KEY_ballotcross 0x0af4 /* U+2717 BALLOT X */ +#define XKB_KEY_musicalsharp 0x0af5 /* U+266F MUSIC SHARP SIGN */ +#define XKB_KEY_musicalflat 0x0af6 /* U+266D MUSIC FLAT SIGN */ +#define XKB_KEY_malesymbol 0x0af7 /* U+2642 MALE SIGN */ +#define XKB_KEY_femalesymbol 0x0af8 /* U+2640 FEMALE SIGN */ +#define XKB_KEY_telephone 0x0af9 /* U+260E BLACK TELEPHONE */ +#define XKB_KEY_telephonerecorder 0x0afa /* U+2315 TELEPHONE RECORDER */ +#define XKB_KEY_phonographcopyright 0x0afb /* U+2117 SOUND RECORDING COPYRIGHT */ +#define XKB_KEY_caret 0x0afc /* U+2038 CARET */ +#define XKB_KEY_singlelowquotemark 0x0afd /* U+201A SINGLE LOW-9 QUOTATION MARK */ +#define XKB_KEY_doublelowquotemark 0x0afe /* U+201E DOUBLE LOW-9 QUOTATION MARK */ +#define XKB_KEY_cursor 0x0aff + +/* + * APL + * Byte 3 = 0x0b + */ + +#define XKB_KEY_leftcaret 0x0ba3 /*(U+003C LESS-THAN SIGN)*/ +#define XKB_KEY_rightcaret 0x0ba6 /*(U+003E GREATER-THAN SIGN)*/ +#define XKB_KEY_downcaret 0x0ba8 /*(U+2228 LOGICAL OR)*/ +#define XKB_KEY_upcaret 0x0ba9 /*(U+2227 LOGICAL AND)*/ +#define XKB_KEY_overbar 0x0bc0 /*(U+00AF MACRON)*/ +#define XKB_KEY_downtack 0x0bc2 /* U+22A4 DOWN TACK */ +#define XKB_KEY_upshoe 0x0bc3 /*(U+2229 INTERSECTION)*/ +#define XKB_KEY_downstile 0x0bc4 /* U+230A LEFT FLOOR */ +#define XKB_KEY_underbar 0x0bc6 /*(U+005F LOW LINE)*/ +#define XKB_KEY_jot 0x0bca /* U+2218 RING OPERATOR */ +#define XKB_KEY_quad 0x0bcc /* U+2395 APL FUNCTIONAL SYMBOL QUAD */ +#define XKB_KEY_uptack 0x0bce /* U+22A5 UP TACK */ +#define XKB_KEY_circle 0x0bcf /* U+25CB WHITE CIRCLE */ +#define XKB_KEY_upstile 0x0bd3 /* U+2308 LEFT CEILING */ +#define XKB_KEY_downshoe 0x0bd6 /*(U+222A UNION)*/ +#define XKB_KEY_rightshoe 0x0bd8 /*(U+2283 SUPERSET OF)*/ +#define XKB_KEY_leftshoe 0x0bda /*(U+2282 SUBSET OF)*/ +#define XKB_KEY_lefttack 0x0bdc /* U+22A3 LEFT TACK */ +#define XKB_KEY_righttack 0x0bfc /* U+22A2 RIGHT TACK */ + +/* + * Hebrew + * Byte 3 = 0x0c + */ + +#define XKB_KEY_hebrew_doublelowline 0x0cdf /* U+2017 DOUBLE LOW LINE */ +#define XKB_KEY_hebrew_aleph 0x0ce0 /* U+05D0 HEBREW LETTER ALEF */ +#define XKB_KEY_hebrew_bet 0x0ce1 /* U+05D1 HEBREW LETTER BET */ +#define XKB_KEY_hebrew_beth 0x0ce1 /* deprecated */ +#define XKB_KEY_hebrew_gimel 0x0ce2 /* U+05D2 HEBREW LETTER GIMEL */ +#define XKB_KEY_hebrew_gimmel 0x0ce2 /* deprecated */ +#define XKB_KEY_hebrew_dalet 0x0ce3 /* U+05D3 HEBREW LETTER DALET */ +#define XKB_KEY_hebrew_daleth 0x0ce3 /* deprecated */ +#define XKB_KEY_hebrew_he 0x0ce4 /* U+05D4 HEBREW LETTER HE */ +#define XKB_KEY_hebrew_waw 0x0ce5 /* U+05D5 HEBREW LETTER VAV */ +#define XKB_KEY_hebrew_zain 0x0ce6 /* U+05D6 HEBREW LETTER ZAYIN */ +#define XKB_KEY_hebrew_zayin 0x0ce6 /* deprecated */ +#define XKB_KEY_hebrew_chet 0x0ce7 /* U+05D7 HEBREW LETTER HET */ +#define XKB_KEY_hebrew_het 0x0ce7 /* deprecated */ +#define XKB_KEY_hebrew_tet 0x0ce8 /* U+05D8 HEBREW LETTER TET */ +#define XKB_KEY_hebrew_teth 0x0ce8 /* deprecated */ +#define XKB_KEY_hebrew_yod 0x0ce9 /* U+05D9 HEBREW LETTER YOD */ +#define XKB_KEY_hebrew_finalkaph 0x0cea /* U+05DA HEBREW LETTER FINAL KAF */ +#define XKB_KEY_hebrew_kaph 0x0ceb /* U+05DB HEBREW LETTER KAF */ +#define XKB_KEY_hebrew_lamed 0x0cec /* U+05DC HEBREW LETTER LAMED */ +#define XKB_KEY_hebrew_finalmem 0x0ced /* U+05DD HEBREW LETTER FINAL MEM */ +#define XKB_KEY_hebrew_mem 0x0cee /* U+05DE HEBREW LETTER MEM */ +#define XKB_KEY_hebrew_finalnun 0x0cef /* U+05DF HEBREW LETTER FINAL NUN */ +#define XKB_KEY_hebrew_nun 0x0cf0 /* U+05E0 HEBREW LETTER NUN */ +#define XKB_KEY_hebrew_samech 0x0cf1 /* U+05E1 HEBREW LETTER SAMEKH */ +#define XKB_KEY_hebrew_samekh 0x0cf1 /* deprecated */ +#define XKB_KEY_hebrew_ayin 0x0cf2 /* U+05E2 HEBREW LETTER AYIN */ +#define XKB_KEY_hebrew_finalpe 0x0cf3 /* U+05E3 HEBREW LETTER FINAL PE */ +#define XKB_KEY_hebrew_pe 0x0cf4 /* U+05E4 HEBREW LETTER PE */ +#define XKB_KEY_hebrew_finalzade 0x0cf5 /* U+05E5 HEBREW LETTER FINAL TSADI */ +#define XKB_KEY_hebrew_finalzadi 0x0cf5 /* deprecated */ +#define XKB_KEY_hebrew_zade 0x0cf6 /* U+05E6 HEBREW LETTER TSADI */ +#define XKB_KEY_hebrew_zadi 0x0cf6 /* deprecated */ +#define XKB_KEY_hebrew_qoph 0x0cf7 /* U+05E7 HEBREW LETTER QOF */ +#define XKB_KEY_hebrew_kuf 0x0cf7 /* deprecated */ +#define XKB_KEY_hebrew_resh 0x0cf8 /* U+05E8 HEBREW LETTER RESH */ +#define XKB_KEY_hebrew_shin 0x0cf9 /* U+05E9 HEBREW LETTER SHIN */ +#define XKB_KEY_hebrew_taw 0x0cfa /* U+05EA HEBREW LETTER TAV */ +#define XKB_KEY_hebrew_taf 0x0cfa /* deprecated */ +#define XKB_KEY_Hebrew_switch 0xff7e /* Alias for mode_switch */ + +/* + * Thai + * Byte 3 = 0x0d + */ + +#define XKB_KEY_Thai_kokai 0x0da1 /* U+0E01 THAI CHARACTER KO KAI */ +#define XKB_KEY_Thai_khokhai 0x0da2 /* U+0E02 THAI CHARACTER KHO KHAI */ +#define XKB_KEY_Thai_khokhuat 0x0da3 /* U+0E03 THAI CHARACTER KHO KHUAT */ +#define XKB_KEY_Thai_khokhwai 0x0da4 /* U+0E04 THAI CHARACTER KHO KHWAI */ +#define XKB_KEY_Thai_khokhon 0x0da5 /* U+0E05 THAI CHARACTER KHO KHON */ +#define XKB_KEY_Thai_khorakhang 0x0da6 /* U+0E06 THAI CHARACTER KHO RAKHANG */ +#define XKB_KEY_Thai_ngongu 0x0da7 /* U+0E07 THAI CHARACTER NGO NGU */ +#define XKB_KEY_Thai_chochan 0x0da8 /* U+0E08 THAI CHARACTER CHO CHAN */ +#define XKB_KEY_Thai_choching 0x0da9 /* U+0E09 THAI CHARACTER CHO CHING */ +#define XKB_KEY_Thai_chochang 0x0daa /* U+0E0A THAI CHARACTER CHO CHANG */ +#define XKB_KEY_Thai_soso 0x0dab /* U+0E0B THAI CHARACTER SO SO */ +#define XKB_KEY_Thai_chochoe 0x0dac /* U+0E0C THAI CHARACTER CHO CHOE */ +#define XKB_KEY_Thai_yoying 0x0dad /* U+0E0D THAI CHARACTER YO YING */ +#define XKB_KEY_Thai_dochada 0x0dae /* U+0E0E THAI CHARACTER DO CHADA */ +#define XKB_KEY_Thai_topatak 0x0daf /* U+0E0F THAI CHARACTER TO PATAK */ +#define XKB_KEY_Thai_thothan 0x0db0 /* U+0E10 THAI CHARACTER THO THAN */ +#define XKB_KEY_Thai_thonangmontho 0x0db1 /* U+0E11 THAI CHARACTER THO NANGMONTHO */ +#define XKB_KEY_Thai_thophuthao 0x0db2 /* U+0E12 THAI CHARACTER THO PHUTHAO */ +#define XKB_KEY_Thai_nonen 0x0db3 /* U+0E13 THAI CHARACTER NO NEN */ +#define XKB_KEY_Thai_dodek 0x0db4 /* U+0E14 THAI CHARACTER DO DEK */ +#define XKB_KEY_Thai_totao 0x0db5 /* U+0E15 THAI CHARACTER TO TAO */ +#define XKB_KEY_Thai_thothung 0x0db6 /* U+0E16 THAI CHARACTER THO THUNG */ +#define XKB_KEY_Thai_thothahan 0x0db7 /* U+0E17 THAI CHARACTER THO THAHAN */ +#define XKB_KEY_Thai_thothong 0x0db8 /* U+0E18 THAI CHARACTER THO THONG */ +#define XKB_KEY_Thai_nonu 0x0db9 /* U+0E19 THAI CHARACTER NO NU */ +#define XKB_KEY_Thai_bobaimai 0x0dba /* U+0E1A THAI CHARACTER BO BAIMAI */ +#define XKB_KEY_Thai_popla 0x0dbb /* U+0E1B THAI CHARACTER PO PLA */ +#define XKB_KEY_Thai_phophung 0x0dbc /* U+0E1C THAI CHARACTER PHO PHUNG */ +#define XKB_KEY_Thai_fofa 0x0dbd /* U+0E1D THAI CHARACTER FO FA */ +#define XKB_KEY_Thai_phophan 0x0dbe /* U+0E1E THAI CHARACTER PHO PHAN */ +#define XKB_KEY_Thai_fofan 0x0dbf /* U+0E1F THAI CHARACTER FO FAN */ +#define XKB_KEY_Thai_phosamphao 0x0dc0 /* U+0E20 THAI CHARACTER PHO SAMPHAO */ +#define XKB_KEY_Thai_moma 0x0dc1 /* U+0E21 THAI CHARACTER MO MA */ +#define XKB_KEY_Thai_yoyak 0x0dc2 /* U+0E22 THAI CHARACTER YO YAK */ +#define XKB_KEY_Thai_rorua 0x0dc3 /* U+0E23 THAI CHARACTER RO RUA */ +#define XKB_KEY_Thai_ru 0x0dc4 /* U+0E24 THAI CHARACTER RU */ +#define XKB_KEY_Thai_loling 0x0dc5 /* U+0E25 THAI CHARACTER LO LING */ +#define XKB_KEY_Thai_lu 0x0dc6 /* U+0E26 THAI CHARACTER LU */ +#define XKB_KEY_Thai_wowaen 0x0dc7 /* U+0E27 THAI CHARACTER WO WAEN */ +#define XKB_KEY_Thai_sosala 0x0dc8 /* U+0E28 THAI CHARACTER SO SALA */ +#define XKB_KEY_Thai_sorusi 0x0dc9 /* U+0E29 THAI CHARACTER SO RUSI */ +#define XKB_KEY_Thai_sosua 0x0dca /* U+0E2A THAI CHARACTER SO SUA */ +#define XKB_KEY_Thai_hohip 0x0dcb /* U+0E2B THAI CHARACTER HO HIP */ +#define XKB_KEY_Thai_lochula 0x0dcc /* U+0E2C THAI CHARACTER LO CHULA */ +#define XKB_KEY_Thai_oang 0x0dcd /* U+0E2D THAI CHARACTER O ANG */ +#define XKB_KEY_Thai_honokhuk 0x0dce /* U+0E2E THAI CHARACTER HO NOKHUK */ +#define XKB_KEY_Thai_paiyannoi 0x0dcf /* U+0E2F THAI CHARACTER PAIYANNOI */ +#define XKB_KEY_Thai_saraa 0x0dd0 /* U+0E30 THAI CHARACTER SARA A */ +#define XKB_KEY_Thai_maihanakat 0x0dd1 /* U+0E31 THAI CHARACTER MAI HAN-AKAT */ +#define XKB_KEY_Thai_saraaa 0x0dd2 /* U+0E32 THAI CHARACTER SARA AA */ +#define XKB_KEY_Thai_saraam 0x0dd3 /* U+0E33 THAI CHARACTER SARA AM */ +#define XKB_KEY_Thai_sarai 0x0dd4 /* U+0E34 THAI CHARACTER SARA I */ +#define XKB_KEY_Thai_saraii 0x0dd5 /* U+0E35 THAI CHARACTER SARA II */ +#define XKB_KEY_Thai_saraue 0x0dd6 /* U+0E36 THAI CHARACTER SARA UE */ +#define XKB_KEY_Thai_sarauee 0x0dd7 /* U+0E37 THAI CHARACTER SARA UEE */ +#define XKB_KEY_Thai_sarau 0x0dd8 /* U+0E38 THAI CHARACTER SARA U */ +#define XKB_KEY_Thai_sarauu 0x0dd9 /* U+0E39 THAI CHARACTER SARA UU */ +#define XKB_KEY_Thai_phinthu 0x0dda /* U+0E3A THAI CHARACTER PHINTHU */ +#define XKB_KEY_Thai_maihanakat_maitho 0x0dde +#define XKB_KEY_Thai_baht 0x0ddf /* U+0E3F THAI CURRENCY SYMBOL BAHT */ +#define XKB_KEY_Thai_sarae 0x0de0 /* U+0E40 THAI CHARACTER SARA E */ +#define XKB_KEY_Thai_saraae 0x0de1 /* U+0E41 THAI CHARACTER SARA AE */ +#define XKB_KEY_Thai_sarao 0x0de2 /* U+0E42 THAI CHARACTER SARA O */ +#define XKB_KEY_Thai_saraaimaimuan 0x0de3 /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */ +#define XKB_KEY_Thai_saraaimaimalai 0x0de4 /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */ +#define XKB_KEY_Thai_lakkhangyao 0x0de5 /* U+0E45 THAI CHARACTER LAKKHANGYAO */ +#define XKB_KEY_Thai_maiyamok 0x0de6 /* U+0E46 THAI CHARACTER MAIYAMOK */ +#define XKB_KEY_Thai_maitaikhu 0x0de7 /* U+0E47 THAI CHARACTER MAITAIKHU */ +#define XKB_KEY_Thai_maiek 0x0de8 /* U+0E48 THAI CHARACTER MAI EK */ +#define XKB_KEY_Thai_maitho 0x0de9 /* U+0E49 THAI CHARACTER MAI THO */ +#define XKB_KEY_Thai_maitri 0x0dea /* U+0E4A THAI CHARACTER MAI TRI */ +#define XKB_KEY_Thai_maichattawa 0x0deb /* U+0E4B THAI CHARACTER MAI CHATTAWA */ +#define XKB_KEY_Thai_thanthakhat 0x0dec /* U+0E4C THAI CHARACTER THANTHAKHAT */ +#define XKB_KEY_Thai_nikhahit 0x0ded /* U+0E4D THAI CHARACTER NIKHAHIT */ +#define XKB_KEY_Thai_leksun 0x0df0 /* U+0E50 THAI DIGIT ZERO */ +#define XKB_KEY_Thai_leknung 0x0df1 /* U+0E51 THAI DIGIT ONE */ +#define XKB_KEY_Thai_leksong 0x0df2 /* U+0E52 THAI DIGIT TWO */ +#define XKB_KEY_Thai_leksam 0x0df3 /* U+0E53 THAI DIGIT THREE */ +#define XKB_KEY_Thai_leksi 0x0df4 /* U+0E54 THAI DIGIT FOUR */ +#define XKB_KEY_Thai_lekha 0x0df5 /* U+0E55 THAI DIGIT FIVE */ +#define XKB_KEY_Thai_lekhok 0x0df6 /* U+0E56 THAI DIGIT SIX */ +#define XKB_KEY_Thai_lekchet 0x0df7 /* U+0E57 THAI DIGIT SEVEN */ +#define XKB_KEY_Thai_lekpaet 0x0df8 /* U+0E58 THAI DIGIT EIGHT */ +#define XKB_KEY_Thai_lekkao 0x0df9 /* U+0E59 THAI DIGIT NINE */ + +/* + * Korean + * Byte 3 = 0x0e + */ + + +#define XKB_KEY_Hangul 0xff31 /* Hangul start/stop(toggle) */ +#define XKB_KEY_Hangul_Start 0xff32 /* Hangul start */ +#define XKB_KEY_Hangul_End 0xff33 /* Hangul end, English start */ +#define XKB_KEY_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */ +#define XKB_KEY_Hangul_Jamo 0xff35 /* Hangul Jamo mode */ +#define XKB_KEY_Hangul_Romaja 0xff36 /* Hangul Romaja mode */ +#define XKB_KEY_Hangul_Codeinput 0xff37 /* Hangul code input mode */ +#define XKB_KEY_Hangul_Jeonja 0xff38 /* Jeonja mode */ +#define XKB_KEY_Hangul_Banja 0xff39 /* Banja mode */ +#define XKB_KEY_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */ +#define XKB_KEY_Hangul_PostHanja 0xff3b /* Post Hanja conversion */ +#define XKB_KEY_Hangul_SingleCandidate 0xff3c /* Single candidate */ +#define XKB_KEY_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */ +#define XKB_KEY_Hangul_PreviousCandidate 0xff3e /* Previous candidate */ +#define XKB_KEY_Hangul_Special 0xff3f /* Special symbols */ +#define XKB_KEY_Hangul_switch 0xff7e /* Alias for mode_switch */ + +/* Hangul Consonant Characters */ +#define XKB_KEY_Hangul_Kiyeog 0x0ea1 +#define XKB_KEY_Hangul_SsangKiyeog 0x0ea2 +#define XKB_KEY_Hangul_KiyeogSios 0x0ea3 +#define XKB_KEY_Hangul_Nieun 0x0ea4 +#define XKB_KEY_Hangul_NieunJieuj 0x0ea5 +#define XKB_KEY_Hangul_NieunHieuh 0x0ea6 +#define XKB_KEY_Hangul_Dikeud 0x0ea7 +#define XKB_KEY_Hangul_SsangDikeud 0x0ea8 +#define XKB_KEY_Hangul_Rieul 0x0ea9 +#define XKB_KEY_Hangul_RieulKiyeog 0x0eaa +#define XKB_KEY_Hangul_RieulMieum 0x0eab +#define XKB_KEY_Hangul_RieulPieub 0x0eac +#define XKB_KEY_Hangul_RieulSios 0x0ead +#define XKB_KEY_Hangul_RieulTieut 0x0eae +#define XKB_KEY_Hangul_RieulPhieuf 0x0eaf +#define XKB_KEY_Hangul_RieulHieuh 0x0eb0 +#define XKB_KEY_Hangul_Mieum 0x0eb1 +#define XKB_KEY_Hangul_Pieub 0x0eb2 +#define XKB_KEY_Hangul_SsangPieub 0x0eb3 +#define XKB_KEY_Hangul_PieubSios 0x0eb4 +#define XKB_KEY_Hangul_Sios 0x0eb5 +#define XKB_KEY_Hangul_SsangSios 0x0eb6 +#define XKB_KEY_Hangul_Ieung 0x0eb7 +#define XKB_KEY_Hangul_Jieuj 0x0eb8 +#define XKB_KEY_Hangul_SsangJieuj 0x0eb9 +#define XKB_KEY_Hangul_Cieuc 0x0eba +#define XKB_KEY_Hangul_Khieuq 0x0ebb +#define XKB_KEY_Hangul_Tieut 0x0ebc +#define XKB_KEY_Hangul_Phieuf 0x0ebd +#define XKB_KEY_Hangul_Hieuh 0x0ebe + +/* Hangul Vowel Characters */ +#define XKB_KEY_Hangul_A 0x0ebf +#define XKB_KEY_Hangul_AE 0x0ec0 +#define XKB_KEY_Hangul_YA 0x0ec1 +#define XKB_KEY_Hangul_YAE 0x0ec2 +#define XKB_KEY_Hangul_EO 0x0ec3 +#define XKB_KEY_Hangul_E 0x0ec4 +#define XKB_KEY_Hangul_YEO 0x0ec5 +#define XKB_KEY_Hangul_YE 0x0ec6 +#define XKB_KEY_Hangul_O 0x0ec7 +#define XKB_KEY_Hangul_WA 0x0ec8 +#define XKB_KEY_Hangul_WAE 0x0ec9 +#define XKB_KEY_Hangul_OE 0x0eca +#define XKB_KEY_Hangul_YO 0x0ecb +#define XKB_KEY_Hangul_U 0x0ecc +#define XKB_KEY_Hangul_WEO 0x0ecd +#define XKB_KEY_Hangul_WE 0x0ece +#define XKB_KEY_Hangul_WI 0x0ecf +#define XKB_KEY_Hangul_YU 0x0ed0 +#define XKB_KEY_Hangul_EU 0x0ed1 +#define XKB_KEY_Hangul_YI 0x0ed2 +#define XKB_KEY_Hangul_I 0x0ed3 + +/* Hangul syllable-final (JongSeong) Characters */ +#define XKB_KEY_Hangul_J_Kiyeog 0x0ed4 +#define XKB_KEY_Hangul_J_SsangKiyeog 0x0ed5 +#define XKB_KEY_Hangul_J_KiyeogSios 0x0ed6 +#define XKB_KEY_Hangul_J_Nieun 0x0ed7 +#define XKB_KEY_Hangul_J_NieunJieuj 0x0ed8 +#define XKB_KEY_Hangul_J_NieunHieuh 0x0ed9 +#define XKB_KEY_Hangul_J_Dikeud 0x0eda +#define XKB_KEY_Hangul_J_Rieul 0x0edb +#define XKB_KEY_Hangul_J_RieulKiyeog 0x0edc +#define XKB_KEY_Hangul_J_RieulMieum 0x0edd +#define XKB_KEY_Hangul_J_RieulPieub 0x0ede +#define XKB_KEY_Hangul_J_RieulSios 0x0edf +#define XKB_KEY_Hangul_J_RieulTieut 0x0ee0 +#define XKB_KEY_Hangul_J_RieulPhieuf 0x0ee1 +#define XKB_KEY_Hangul_J_RieulHieuh 0x0ee2 +#define XKB_KEY_Hangul_J_Mieum 0x0ee3 +#define XKB_KEY_Hangul_J_Pieub 0x0ee4 +#define XKB_KEY_Hangul_J_PieubSios 0x0ee5 +#define XKB_KEY_Hangul_J_Sios 0x0ee6 +#define XKB_KEY_Hangul_J_SsangSios 0x0ee7 +#define XKB_KEY_Hangul_J_Ieung 0x0ee8 +#define XKB_KEY_Hangul_J_Jieuj 0x0ee9 +#define XKB_KEY_Hangul_J_Cieuc 0x0eea +#define XKB_KEY_Hangul_J_Khieuq 0x0eeb +#define XKB_KEY_Hangul_J_Tieut 0x0eec +#define XKB_KEY_Hangul_J_Phieuf 0x0eed +#define XKB_KEY_Hangul_J_Hieuh 0x0eee + +/* Ancient Hangul Consonant Characters */ +#define XKB_KEY_Hangul_RieulYeorinHieuh 0x0eef +#define XKB_KEY_Hangul_SunkyeongeumMieum 0x0ef0 +#define XKB_KEY_Hangul_SunkyeongeumPieub 0x0ef1 +#define XKB_KEY_Hangul_PanSios 0x0ef2 +#define XKB_KEY_Hangul_KkogjiDalrinIeung 0x0ef3 +#define XKB_KEY_Hangul_SunkyeongeumPhieuf 0x0ef4 +#define XKB_KEY_Hangul_YeorinHieuh 0x0ef5 + +/* Ancient Hangul Vowel Characters */ +#define XKB_KEY_Hangul_AraeA 0x0ef6 +#define XKB_KEY_Hangul_AraeAE 0x0ef7 + +/* Ancient Hangul syllable-final (JongSeong) Characters */ +#define XKB_KEY_Hangul_J_PanSios 0x0ef8 +#define XKB_KEY_Hangul_J_KkogjiDalrinIeung 0x0ef9 +#define XKB_KEY_Hangul_J_YeorinHieuh 0x0efa + +/* Korean currency symbol */ +#define XKB_KEY_Korean_Won 0x0eff /*(U+20A9 WON SIGN)*/ + + +/* + * Armenian + */ + +#define XKB_KEY_Armenian_ligature_ew 0x1000587 /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */ +#define XKB_KEY_Armenian_full_stop 0x1000589 /* U+0589 ARMENIAN FULL STOP */ +#define XKB_KEY_Armenian_verjaket 0x1000589 /* U+0589 ARMENIAN FULL STOP */ +#define XKB_KEY_Armenian_separation_mark 0x100055d /* U+055D ARMENIAN COMMA */ +#define XKB_KEY_Armenian_but 0x100055d /* U+055D ARMENIAN COMMA */ +#define XKB_KEY_Armenian_hyphen 0x100058a /* U+058A ARMENIAN HYPHEN */ +#define XKB_KEY_Armenian_yentamna 0x100058a /* U+058A ARMENIAN HYPHEN */ +#define XKB_KEY_Armenian_exclam 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ +#define XKB_KEY_Armenian_amanak 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ +#define XKB_KEY_Armenian_accent 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ +#define XKB_KEY_Armenian_shesht 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ +#define XKB_KEY_Armenian_question 0x100055e /* U+055E ARMENIAN QUESTION MARK */ +#define XKB_KEY_Armenian_paruyk 0x100055e /* U+055E ARMENIAN QUESTION MARK */ +#define XKB_KEY_Armenian_AYB 0x1000531 /* U+0531 ARMENIAN CAPITAL LETTER AYB */ +#define XKB_KEY_Armenian_ayb 0x1000561 /* U+0561 ARMENIAN SMALL LETTER AYB */ +#define XKB_KEY_Armenian_BEN 0x1000532 /* U+0532 ARMENIAN CAPITAL LETTER BEN */ +#define XKB_KEY_Armenian_ben 0x1000562 /* U+0562 ARMENIAN SMALL LETTER BEN */ +#define XKB_KEY_Armenian_GIM 0x1000533 /* U+0533 ARMENIAN CAPITAL LETTER GIM */ +#define XKB_KEY_Armenian_gim 0x1000563 /* U+0563 ARMENIAN SMALL LETTER GIM */ +#define XKB_KEY_Armenian_DA 0x1000534 /* U+0534 ARMENIAN CAPITAL LETTER DA */ +#define XKB_KEY_Armenian_da 0x1000564 /* U+0564 ARMENIAN SMALL LETTER DA */ +#define XKB_KEY_Armenian_YECH 0x1000535 /* U+0535 ARMENIAN CAPITAL LETTER ECH */ +#define XKB_KEY_Armenian_yech 0x1000565 /* U+0565 ARMENIAN SMALL LETTER ECH */ +#define XKB_KEY_Armenian_ZA 0x1000536 /* U+0536 ARMENIAN CAPITAL LETTER ZA */ +#define XKB_KEY_Armenian_za 0x1000566 /* U+0566 ARMENIAN SMALL LETTER ZA */ +#define XKB_KEY_Armenian_E 0x1000537 /* U+0537 ARMENIAN CAPITAL LETTER EH */ +#define XKB_KEY_Armenian_e 0x1000567 /* U+0567 ARMENIAN SMALL LETTER EH */ +#define XKB_KEY_Armenian_AT 0x1000538 /* U+0538 ARMENIAN CAPITAL LETTER ET */ +#define XKB_KEY_Armenian_at 0x1000568 /* U+0568 ARMENIAN SMALL LETTER ET */ +#define XKB_KEY_Armenian_TO 0x1000539 /* U+0539 ARMENIAN CAPITAL LETTER TO */ +#define XKB_KEY_Armenian_to 0x1000569 /* U+0569 ARMENIAN SMALL LETTER TO */ +#define XKB_KEY_Armenian_ZHE 0x100053a /* U+053A ARMENIAN CAPITAL LETTER ZHE */ +#define XKB_KEY_Armenian_zhe 0x100056a /* U+056A ARMENIAN SMALL LETTER ZHE */ +#define XKB_KEY_Armenian_INI 0x100053b /* U+053B ARMENIAN CAPITAL LETTER INI */ +#define XKB_KEY_Armenian_ini 0x100056b /* U+056B ARMENIAN SMALL LETTER INI */ +#define XKB_KEY_Armenian_LYUN 0x100053c /* U+053C ARMENIAN CAPITAL LETTER LIWN */ +#define XKB_KEY_Armenian_lyun 0x100056c /* U+056C ARMENIAN SMALL LETTER LIWN */ +#define XKB_KEY_Armenian_KHE 0x100053d /* U+053D ARMENIAN CAPITAL LETTER XEH */ +#define XKB_KEY_Armenian_khe 0x100056d /* U+056D ARMENIAN SMALL LETTER XEH */ +#define XKB_KEY_Armenian_TSA 0x100053e /* U+053E ARMENIAN CAPITAL LETTER CA */ +#define XKB_KEY_Armenian_tsa 0x100056e /* U+056E ARMENIAN SMALL LETTER CA */ +#define XKB_KEY_Armenian_KEN 0x100053f /* U+053F ARMENIAN CAPITAL LETTER KEN */ +#define XKB_KEY_Armenian_ken 0x100056f /* U+056F ARMENIAN SMALL LETTER KEN */ +#define XKB_KEY_Armenian_HO 0x1000540 /* U+0540 ARMENIAN CAPITAL LETTER HO */ +#define XKB_KEY_Armenian_ho 0x1000570 /* U+0570 ARMENIAN SMALL LETTER HO */ +#define XKB_KEY_Armenian_DZA 0x1000541 /* U+0541 ARMENIAN CAPITAL LETTER JA */ +#define XKB_KEY_Armenian_dza 0x1000571 /* U+0571 ARMENIAN SMALL LETTER JA */ +#define XKB_KEY_Armenian_GHAT 0x1000542 /* U+0542 ARMENIAN CAPITAL LETTER GHAD */ +#define XKB_KEY_Armenian_ghat 0x1000572 /* U+0572 ARMENIAN SMALL LETTER GHAD */ +#define XKB_KEY_Armenian_TCHE 0x1000543 /* U+0543 ARMENIAN CAPITAL LETTER CHEH */ +#define XKB_KEY_Armenian_tche 0x1000573 /* U+0573 ARMENIAN SMALL LETTER CHEH */ +#define XKB_KEY_Armenian_MEN 0x1000544 /* U+0544 ARMENIAN CAPITAL LETTER MEN */ +#define XKB_KEY_Armenian_men 0x1000574 /* U+0574 ARMENIAN SMALL LETTER MEN */ +#define XKB_KEY_Armenian_HI 0x1000545 /* U+0545 ARMENIAN CAPITAL LETTER YI */ +#define XKB_KEY_Armenian_hi 0x1000575 /* U+0575 ARMENIAN SMALL LETTER YI */ +#define XKB_KEY_Armenian_NU 0x1000546 /* U+0546 ARMENIAN CAPITAL LETTER NOW */ +#define XKB_KEY_Armenian_nu 0x1000576 /* U+0576 ARMENIAN SMALL LETTER NOW */ +#define XKB_KEY_Armenian_SHA 0x1000547 /* U+0547 ARMENIAN CAPITAL LETTER SHA */ +#define XKB_KEY_Armenian_sha 0x1000577 /* U+0577 ARMENIAN SMALL LETTER SHA */ +#define XKB_KEY_Armenian_VO 0x1000548 /* U+0548 ARMENIAN CAPITAL LETTER VO */ +#define XKB_KEY_Armenian_vo 0x1000578 /* U+0578 ARMENIAN SMALL LETTER VO */ +#define XKB_KEY_Armenian_CHA 0x1000549 /* U+0549 ARMENIAN CAPITAL LETTER CHA */ +#define XKB_KEY_Armenian_cha 0x1000579 /* U+0579 ARMENIAN SMALL LETTER CHA */ +#define XKB_KEY_Armenian_PE 0x100054a /* U+054A ARMENIAN CAPITAL LETTER PEH */ +#define XKB_KEY_Armenian_pe 0x100057a /* U+057A ARMENIAN SMALL LETTER PEH */ +#define XKB_KEY_Armenian_JE 0x100054b /* U+054B ARMENIAN CAPITAL LETTER JHEH */ +#define XKB_KEY_Armenian_je 0x100057b /* U+057B ARMENIAN SMALL LETTER JHEH */ +#define XKB_KEY_Armenian_RA 0x100054c /* U+054C ARMENIAN CAPITAL LETTER RA */ +#define XKB_KEY_Armenian_ra 0x100057c /* U+057C ARMENIAN SMALL LETTER RA */ +#define XKB_KEY_Armenian_SE 0x100054d /* U+054D ARMENIAN CAPITAL LETTER SEH */ +#define XKB_KEY_Armenian_se 0x100057d /* U+057D ARMENIAN SMALL LETTER SEH */ +#define XKB_KEY_Armenian_VEV 0x100054e /* U+054E ARMENIAN CAPITAL LETTER VEW */ +#define XKB_KEY_Armenian_vev 0x100057e /* U+057E ARMENIAN SMALL LETTER VEW */ +#define XKB_KEY_Armenian_TYUN 0x100054f /* U+054F ARMENIAN CAPITAL LETTER TIWN */ +#define XKB_KEY_Armenian_tyun 0x100057f /* U+057F ARMENIAN SMALL LETTER TIWN */ +#define XKB_KEY_Armenian_RE 0x1000550 /* U+0550 ARMENIAN CAPITAL LETTER REH */ +#define XKB_KEY_Armenian_re 0x1000580 /* U+0580 ARMENIAN SMALL LETTER REH */ +#define XKB_KEY_Armenian_TSO 0x1000551 /* U+0551 ARMENIAN CAPITAL LETTER CO */ +#define XKB_KEY_Armenian_tso 0x1000581 /* U+0581 ARMENIAN SMALL LETTER CO */ +#define XKB_KEY_Armenian_VYUN 0x1000552 /* U+0552 ARMENIAN CAPITAL LETTER YIWN */ +#define XKB_KEY_Armenian_vyun 0x1000582 /* U+0582 ARMENIAN SMALL LETTER YIWN */ +#define XKB_KEY_Armenian_PYUR 0x1000553 /* U+0553 ARMENIAN CAPITAL LETTER PIWR */ +#define XKB_KEY_Armenian_pyur 0x1000583 /* U+0583 ARMENIAN SMALL LETTER PIWR */ +#define XKB_KEY_Armenian_KE 0x1000554 /* U+0554 ARMENIAN CAPITAL LETTER KEH */ +#define XKB_KEY_Armenian_ke 0x1000584 /* U+0584 ARMENIAN SMALL LETTER KEH */ +#define XKB_KEY_Armenian_O 0x1000555 /* U+0555 ARMENIAN CAPITAL LETTER OH */ +#define XKB_KEY_Armenian_o 0x1000585 /* U+0585 ARMENIAN SMALL LETTER OH */ +#define XKB_KEY_Armenian_FE 0x1000556 /* U+0556 ARMENIAN CAPITAL LETTER FEH */ +#define XKB_KEY_Armenian_fe 0x1000586 /* U+0586 ARMENIAN SMALL LETTER FEH */ +#define XKB_KEY_Armenian_apostrophe 0x100055a /* U+055A ARMENIAN APOSTROPHE */ + +/* + * Georgian + */ + +#define XKB_KEY_Georgian_an 0x10010d0 /* U+10D0 GEORGIAN LETTER AN */ +#define XKB_KEY_Georgian_ban 0x10010d1 /* U+10D1 GEORGIAN LETTER BAN */ +#define XKB_KEY_Georgian_gan 0x10010d2 /* U+10D2 GEORGIAN LETTER GAN */ +#define XKB_KEY_Georgian_don 0x10010d3 /* U+10D3 GEORGIAN LETTER DON */ +#define XKB_KEY_Georgian_en 0x10010d4 /* U+10D4 GEORGIAN LETTER EN */ +#define XKB_KEY_Georgian_vin 0x10010d5 /* U+10D5 GEORGIAN LETTER VIN */ +#define XKB_KEY_Georgian_zen 0x10010d6 /* U+10D6 GEORGIAN LETTER ZEN */ +#define XKB_KEY_Georgian_tan 0x10010d7 /* U+10D7 GEORGIAN LETTER TAN */ +#define XKB_KEY_Georgian_in 0x10010d8 /* U+10D8 GEORGIAN LETTER IN */ +#define XKB_KEY_Georgian_kan 0x10010d9 /* U+10D9 GEORGIAN LETTER KAN */ +#define XKB_KEY_Georgian_las 0x10010da /* U+10DA GEORGIAN LETTER LAS */ +#define XKB_KEY_Georgian_man 0x10010db /* U+10DB GEORGIAN LETTER MAN */ +#define XKB_KEY_Georgian_nar 0x10010dc /* U+10DC GEORGIAN LETTER NAR */ +#define XKB_KEY_Georgian_on 0x10010dd /* U+10DD GEORGIAN LETTER ON */ +#define XKB_KEY_Georgian_par 0x10010de /* U+10DE GEORGIAN LETTER PAR */ +#define XKB_KEY_Georgian_zhar 0x10010df /* U+10DF GEORGIAN LETTER ZHAR */ +#define XKB_KEY_Georgian_rae 0x10010e0 /* U+10E0 GEORGIAN LETTER RAE */ +#define XKB_KEY_Georgian_san 0x10010e1 /* U+10E1 GEORGIAN LETTER SAN */ +#define XKB_KEY_Georgian_tar 0x10010e2 /* U+10E2 GEORGIAN LETTER TAR */ +#define XKB_KEY_Georgian_un 0x10010e3 /* U+10E3 GEORGIAN LETTER UN */ +#define XKB_KEY_Georgian_phar 0x10010e4 /* U+10E4 GEORGIAN LETTER PHAR */ +#define XKB_KEY_Georgian_khar 0x10010e5 /* U+10E5 GEORGIAN LETTER KHAR */ +#define XKB_KEY_Georgian_ghan 0x10010e6 /* U+10E6 GEORGIAN LETTER GHAN */ +#define XKB_KEY_Georgian_qar 0x10010e7 /* U+10E7 GEORGIAN LETTER QAR */ +#define XKB_KEY_Georgian_shin 0x10010e8 /* U+10E8 GEORGIAN LETTER SHIN */ +#define XKB_KEY_Georgian_chin 0x10010e9 /* U+10E9 GEORGIAN LETTER CHIN */ +#define XKB_KEY_Georgian_can 0x10010ea /* U+10EA GEORGIAN LETTER CAN */ +#define XKB_KEY_Georgian_jil 0x10010eb /* U+10EB GEORGIAN LETTER JIL */ +#define XKB_KEY_Georgian_cil 0x10010ec /* U+10EC GEORGIAN LETTER CIL */ +#define XKB_KEY_Georgian_char 0x10010ed /* U+10ED GEORGIAN LETTER CHAR */ +#define XKB_KEY_Georgian_xan 0x10010ee /* U+10EE GEORGIAN LETTER XAN */ +#define XKB_KEY_Georgian_jhan 0x10010ef /* U+10EF GEORGIAN LETTER JHAN */ +#define XKB_KEY_Georgian_hae 0x10010f0 /* U+10F0 GEORGIAN LETTER HAE */ +#define XKB_KEY_Georgian_he 0x10010f1 /* U+10F1 GEORGIAN LETTER HE */ +#define XKB_KEY_Georgian_hie 0x10010f2 /* U+10F2 GEORGIAN LETTER HIE */ +#define XKB_KEY_Georgian_we 0x10010f3 /* U+10F3 GEORGIAN LETTER WE */ +#define XKB_KEY_Georgian_har 0x10010f4 /* U+10F4 GEORGIAN LETTER HAR */ +#define XKB_KEY_Georgian_hoe 0x10010f5 /* U+10F5 GEORGIAN LETTER HOE */ +#define XKB_KEY_Georgian_fi 0x10010f6 /* U+10F6 GEORGIAN LETTER FI */ + +/* + * Azeri (and other Turkic or Caucasian languages) + */ + +/* latin */ +#define XKB_KEY_Xabovedot 0x1001e8a /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */ +#define XKB_KEY_Ibreve 0x100012c /* U+012C LATIN CAPITAL LETTER I WITH BREVE */ +#define XKB_KEY_Zstroke 0x10001b5 /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */ +#define XKB_KEY_Gcaron 0x10001e6 /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */ +#define XKB_KEY_Ocaron 0x10001d1 /* U+01D2 LATIN CAPITAL LETTER O WITH CARON */ +#define XKB_KEY_Obarred 0x100019f /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ +#define XKB_KEY_xabovedot 0x1001e8b /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */ +#define XKB_KEY_ibreve 0x100012d /* U+012D LATIN SMALL LETTER I WITH BREVE */ +#define XKB_KEY_zstroke 0x10001b6 /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */ +#define XKB_KEY_gcaron 0x10001e7 /* U+01E7 LATIN SMALL LETTER G WITH CARON */ +#define XKB_KEY_ocaron 0x10001d2 /* U+01D2 LATIN SMALL LETTER O WITH CARON */ +#define XKB_KEY_obarred 0x1000275 /* U+0275 LATIN SMALL LETTER BARRED O */ +#define XKB_KEY_SCHWA 0x100018f /* U+018F LATIN CAPITAL LETTER SCHWA */ +#define XKB_KEY_schwa 0x1000259 /* U+0259 LATIN SMALL LETTER SCHWA */ +#define XKB_KEY_EZH 0x10001b7 /* U+01B7 LATIN CAPITAL LETTER EZH */ +#define XKB_KEY_ezh 0x1000292 /* U+0292 LATIN SMALL LETTER EZH */ +/* those are not really Caucasus */ +/* For Inupiak */ +#define XKB_KEY_Lbelowdot 0x1001e36 /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */ +#define XKB_KEY_lbelowdot 0x1001e37 /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */ + +/* + * Vietnamese + */ + +#define XKB_KEY_Abelowdot 0x1001ea0 /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */ +#define XKB_KEY_abelowdot 0x1001ea1 /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */ +#define XKB_KEY_Ahook 0x1001ea2 /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */ +#define XKB_KEY_ahook 0x1001ea3 /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */ +#define XKB_KEY_Acircumflexacute 0x1001ea4 /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_acircumflexacute 0x1001ea5 /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_Acircumflexgrave 0x1001ea6 /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_acircumflexgrave 0x1001ea7 /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_Acircumflexhook 0x1001ea8 /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_acircumflexhook 0x1001ea9 /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_Acircumflextilde 0x1001eaa /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_acircumflextilde 0x1001eab /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_Acircumflexbelowdot 0x1001eac /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_acircumflexbelowdot 0x1001ead /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_Abreveacute 0x1001eae /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ +#define XKB_KEY_abreveacute 0x1001eaf /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */ +#define XKB_KEY_Abrevegrave 0x1001eb0 /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ +#define XKB_KEY_abrevegrave 0x1001eb1 /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */ +#define XKB_KEY_Abrevehook 0x1001eb2 /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ +#define XKB_KEY_abrevehook 0x1001eb3 /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */ +#define XKB_KEY_Abrevetilde 0x1001eb4 /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ +#define XKB_KEY_abrevetilde 0x1001eb5 /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */ +#define XKB_KEY_Abrevebelowdot 0x1001eb6 /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ +#define XKB_KEY_abrevebelowdot 0x1001eb7 /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */ +#define XKB_KEY_Ebelowdot 0x1001eb8 /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */ +#define XKB_KEY_ebelowdot 0x1001eb9 /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */ +#define XKB_KEY_Ehook 0x1001eba /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */ +#define XKB_KEY_ehook 0x1001ebb /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */ +#define XKB_KEY_Etilde 0x1001ebc /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */ +#define XKB_KEY_etilde 0x1001ebd /* U+1EBD LATIN SMALL LETTER E WITH TILDE */ +#define XKB_KEY_Ecircumflexacute 0x1001ebe /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_ecircumflexacute 0x1001ebf /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_Ecircumflexgrave 0x1001ec0 /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_ecircumflexgrave 0x1001ec1 /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_Ecircumflexhook 0x1001ec2 /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_ecircumflexhook 0x1001ec3 /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_Ecircumflextilde 0x1001ec4 /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_ecircumflextilde 0x1001ec5 /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_Ecircumflexbelowdot 0x1001ec6 /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_ecircumflexbelowdot 0x1001ec7 /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_Ihook 0x1001ec8 /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */ +#define XKB_KEY_ihook 0x1001ec9 /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */ +#define XKB_KEY_Ibelowdot 0x1001eca /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */ +#define XKB_KEY_ibelowdot 0x1001ecb /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */ +#define XKB_KEY_Obelowdot 0x1001ecc /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */ +#define XKB_KEY_obelowdot 0x1001ecd /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */ +#define XKB_KEY_Ohook 0x1001ece /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */ +#define XKB_KEY_ohook 0x1001ecf /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */ +#define XKB_KEY_Ocircumflexacute 0x1001ed0 /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_ocircumflexacute 0x1001ed1 /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */ +#define XKB_KEY_Ocircumflexgrave 0x1001ed2 /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_ocircumflexgrave 0x1001ed3 /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */ +#define XKB_KEY_Ocircumflexhook 0x1001ed4 /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_ocircumflexhook 0x1001ed5 /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XKB_KEY_Ocircumflextilde 0x1001ed6 /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_ocircumflextilde 0x1001ed7 /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */ +#define XKB_KEY_Ocircumflexbelowdot 0x1001ed8 /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_ocircumflexbelowdot 0x1001ed9 /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ +#define XKB_KEY_Ohornacute 0x1001eda /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ +#define XKB_KEY_ohornacute 0x1001edb /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */ +#define XKB_KEY_Ohorngrave 0x1001edc /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ +#define XKB_KEY_ohorngrave 0x1001edd /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */ +#define XKB_KEY_Ohornhook 0x1001ede /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ +#define XKB_KEY_ohornhook 0x1001edf /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */ +#define XKB_KEY_Ohorntilde 0x1001ee0 /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */ +#define XKB_KEY_ohorntilde 0x1001ee1 /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */ +#define XKB_KEY_Ohornbelowdot 0x1001ee2 /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ +#define XKB_KEY_ohornbelowdot 0x1001ee3 /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */ +#define XKB_KEY_Ubelowdot 0x1001ee4 /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */ +#define XKB_KEY_ubelowdot 0x1001ee5 /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */ +#define XKB_KEY_Uhook 0x1001ee6 /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */ +#define XKB_KEY_uhook 0x1001ee7 /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */ +#define XKB_KEY_Uhornacute 0x1001ee8 /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ +#define XKB_KEY_uhornacute 0x1001ee9 /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */ +#define XKB_KEY_Uhorngrave 0x1001eea /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ +#define XKB_KEY_uhorngrave 0x1001eeb /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */ +#define XKB_KEY_Uhornhook 0x1001eec /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ +#define XKB_KEY_uhornhook 0x1001eed /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */ +#define XKB_KEY_Uhorntilde 0x1001eee /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */ +#define XKB_KEY_uhorntilde 0x1001eef /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */ +#define XKB_KEY_Uhornbelowdot 0x1001ef0 /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ +#define XKB_KEY_uhornbelowdot 0x1001ef1 /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */ +#define XKB_KEY_Ybelowdot 0x1001ef4 /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */ +#define XKB_KEY_ybelowdot 0x1001ef5 /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */ +#define XKB_KEY_Yhook 0x1001ef6 /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ +#define XKB_KEY_yhook 0x1001ef7 /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */ +#define XKB_KEY_Ytilde 0x1001ef8 /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */ +#define XKB_KEY_ytilde 0x1001ef9 /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */ +#define XKB_KEY_Ohorn 0x10001a0 /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */ +#define XKB_KEY_ohorn 0x10001a1 /* U+01A1 LATIN SMALL LETTER O WITH HORN */ +#define XKB_KEY_Uhorn 0x10001af /* U+01AF LATIN CAPITAL LETTER U WITH HORN */ +#define XKB_KEY_uhorn 0x10001b0 /* U+01B0 LATIN SMALL LETTER U WITH HORN */ + + +#define XKB_KEY_EcuSign 0x10020a0 /* U+20A0 EURO-CURRENCY SIGN */ +#define XKB_KEY_ColonSign 0x10020a1 /* U+20A1 COLON SIGN */ +#define XKB_KEY_CruzeiroSign 0x10020a2 /* U+20A2 CRUZEIRO SIGN */ +#define XKB_KEY_FFrancSign 0x10020a3 /* U+20A3 FRENCH FRANC SIGN */ +#define XKB_KEY_LiraSign 0x10020a4 /* U+20A4 LIRA SIGN */ +#define XKB_KEY_MillSign 0x10020a5 /* U+20A5 MILL SIGN */ +#define XKB_KEY_NairaSign 0x10020a6 /* U+20A6 NAIRA SIGN */ +#define XKB_KEY_PesetaSign 0x10020a7 /* U+20A7 PESETA SIGN */ +#define XKB_KEY_RupeeSign 0x10020a8 /* U+20A8 RUPEE SIGN */ +#define XKB_KEY_WonSign 0x10020a9 /* U+20A9 WON SIGN */ +#define XKB_KEY_NewSheqelSign 0x10020aa /* U+20AA NEW SHEQEL SIGN */ +#define XKB_KEY_DongSign 0x10020ab /* U+20AB DONG SIGN */ +#define XKB_KEY_EuroSign 0x20ac /* U+20AC EURO SIGN */ + +/* one, two and three are defined above. */ +#define XKB_KEY_zerosuperior 0x1002070 /* U+2070 SUPERSCRIPT ZERO */ +#define XKB_KEY_foursuperior 0x1002074 /* U+2074 SUPERSCRIPT FOUR */ +#define XKB_KEY_fivesuperior 0x1002075 /* U+2075 SUPERSCRIPT FIVE */ +#define XKB_KEY_sixsuperior 0x1002076 /* U+2076 SUPERSCRIPT SIX */ +#define XKB_KEY_sevensuperior 0x1002077 /* U+2077 SUPERSCRIPT SEVEN */ +#define XKB_KEY_eightsuperior 0x1002078 /* U+2078 SUPERSCRIPT EIGHT */ +#define XKB_KEY_ninesuperior 0x1002079 /* U+2079 SUPERSCRIPT NINE */ +#define XKB_KEY_zerosubscript 0x1002080 /* U+2080 SUBSCRIPT ZERO */ +#define XKB_KEY_onesubscript 0x1002081 /* U+2081 SUBSCRIPT ONE */ +#define XKB_KEY_twosubscript 0x1002082 /* U+2082 SUBSCRIPT TWO */ +#define XKB_KEY_threesubscript 0x1002083 /* U+2083 SUBSCRIPT THREE */ +#define XKB_KEY_foursubscript 0x1002084 /* U+2084 SUBSCRIPT FOUR */ +#define XKB_KEY_fivesubscript 0x1002085 /* U+2085 SUBSCRIPT FIVE */ +#define XKB_KEY_sixsubscript 0x1002086 /* U+2086 SUBSCRIPT SIX */ +#define XKB_KEY_sevensubscript 0x1002087 /* U+2087 SUBSCRIPT SEVEN */ +#define XKB_KEY_eightsubscript 0x1002088 /* U+2088 SUBSCRIPT EIGHT */ +#define XKB_KEY_ninesubscript 0x1002089 /* U+2089 SUBSCRIPT NINE */ +#define XKB_KEY_partdifferential 0x1002202 /* U+2202 PARTIAL DIFFERENTIAL */ +#define XKB_KEY_emptyset 0x1002205 /* U+2205 NULL SET */ +#define XKB_KEY_elementof 0x1002208 /* U+2208 ELEMENT OF */ +#define XKB_KEY_notelementof 0x1002209 /* U+2209 NOT AN ELEMENT OF */ +#define XKB_KEY_containsas 0x100220B /* U+220B CONTAINS AS MEMBER */ +#define XKB_KEY_squareroot 0x100221A /* U+221A SQUARE ROOT */ +#define XKB_KEY_cuberoot 0x100221B /* U+221B CUBE ROOT */ +#define XKB_KEY_fourthroot 0x100221C /* U+221C FOURTH ROOT */ +#define XKB_KEY_dintegral 0x100222C /* U+222C DOUBLE INTEGRAL */ +#define XKB_KEY_tintegral 0x100222D /* U+222D TRIPLE INTEGRAL */ +#define XKB_KEY_because 0x1002235 /* U+2235 BECAUSE */ +#define XKB_KEY_approxeq 0x1002248 /* U+2245 ALMOST EQUAL TO */ +#define XKB_KEY_notapproxeq 0x1002247 /* U+2247 NOT ALMOST EQUAL TO */ +#define XKB_KEY_notidentical 0x1002262 /* U+2262 NOT IDENTICAL TO */ +#define XKB_KEY_stricteq 0x1002263 /* U+2263 STRICTLY EQUIVALENT TO */ + +#define XKB_KEY_braille_dot_1 0xfff1 +#define XKB_KEY_braille_dot_2 0xfff2 +#define XKB_KEY_braille_dot_3 0xfff3 +#define XKB_KEY_braille_dot_4 0xfff4 +#define XKB_KEY_braille_dot_5 0xfff5 +#define XKB_KEY_braille_dot_6 0xfff6 +#define XKB_KEY_braille_dot_7 0xfff7 +#define XKB_KEY_braille_dot_8 0xfff8 +#define XKB_KEY_braille_dot_9 0xfff9 +#define XKB_KEY_braille_dot_10 0xfffa +#define XKB_KEY_braille_blank 0x1002800 /* U+2800 BRAILLE PATTERN BLANK */ +#define XKB_KEY_braille_dots_1 0x1002801 /* U+2801 BRAILLE PATTERN DOTS-1 */ +#define XKB_KEY_braille_dots_2 0x1002802 /* U+2802 BRAILLE PATTERN DOTS-2 */ +#define XKB_KEY_braille_dots_12 0x1002803 /* U+2803 BRAILLE PATTERN DOTS-12 */ +#define XKB_KEY_braille_dots_3 0x1002804 /* U+2804 BRAILLE PATTERN DOTS-3 */ +#define XKB_KEY_braille_dots_13 0x1002805 /* U+2805 BRAILLE PATTERN DOTS-13 */ +#define XKB_KEY_braille_dots_23 0x1002806 /* U+2806 BRAILLE PATTERN DOTS-23 */ +#define XKB_KEY_braille_dots_123 0x1002807 /* U+2807 BRAILLE PATTERN DOTS-123 */ +#define XKB_KEY_braille_dots_4 0x1002808 /* U+2808 BRAILLE PATTERN DOTS-4 */ +#define XKB_KEY_braille_dots_14 0x1002809 /* U+2809 BRAILLE PATTERN DOTS-14 */ +#define XKB_KEY_braille_dots_24 0x100280a /* U+280a BRAILLE PATTERN DOTS-24 */ +#define XKB_KEY_braille_dots_124 0x100280b /* U+280b BRAILLE PATTERN DOTS-124 */ +#define XKB_KEY_braille_dots_34 0x100280c /* U+280c BRAILLE PATTERN DOTS-34 */ +#define XKB_KEY_braille_dots_134 0x100280d /* U+280d BRAILLE PATTERN DOTS-134 */ +#define XKB_KEY_braille_dots_234 0x100280e /* U+280e BRAILLE PATTERN DOTS-234 */ +#define XKB_KEY_braille_dots_1234 0x100280f /* U+280f BRAILLE PATTERN DOTS-1234 */ +#define XKB_KEY_braille_dots_5 0x1002810 /* U+2810 BRAILLE PATTERN DOTS-5 */ +#define XKB_KEY_braille_dots_15 0x1002811 /* U+2811 BRAILLE PATTERN DOTS-15 */ +#define XKB_KEY_braille_dots_25 0x1002812 /* U+2812 BRAILLE PATTERN DOTS-25 */ +#define XKB_KEY_braille_dots_125 0x1002813 /* U+2813 BRAILLE PATTERN DOTS-125 */ +#define XKB_KEY_braille_dots_35 0x1002814 /* U+2814 BRAILLE PATTERN DOTS-35 */ +#define XKB_KEY_braille_dots_135 0x1002815 /* U+2815 BRAILLE PATTERN DOTS-135 */ +#define XKB_KEY_braille_dots_235 0x1002816 /* U+2816 BRAILLE PATTERN DOTS-235 */ +#define XKB_KEY_braille_dots_1235 0x1002817 /* U+2817 BRAILLE PATTERN DOTS-1235 */ +#define XKB_KEY_braille_dots_45 0x1002818 /* U+2818 BRAILLE PATTERN DOTS-45 */ +#define XKB_KEY_braille_dots_145 0x1002819 /* U+2819 BRAILLE PATTERN DOTS-145 */ +#define XKB_KEY_braille_dots_245 0x100281a /* U+281a BRAILLE PATTERN DOTS-245 */ +#define XKB_KEY_braille_dots_1245 0x100281b /* U+281b BRAILLE PATTERN DOTS-1245 */ +#define XKB_KEY_braille_dots_345 0x100281c /* U+281c BRAILLE PATTERN DOTS-345 */ +#define XKB_KEY_braille_dots_1345 0x100281d /* U+281d BRAILLE PATTERN DOTS-1345 */ +#define XKB_KEY_braille_dots_2345 0x100281e /* U+281e BRAILLE PATTERN DOTS-2345 */ +#define XKB_KEY_braille_dots_12345 0x100281f /* U+281f BRAILLE PATTERN DOTS-12345 */ +#define XKB_KEY_braille_dots_6 0x1002820 /* U+2820 BRAILLE PATTERN DOTS-6 */ +#define XKB_KEY_braille_dots_16 0x1002821 /* U+2821 BRAILLE PATTERN DOTS-16 */ +#define XKB_KEY_braille_dots_26 0x1002822 /* U+2822 BRAILLE PATTERN DOTS-26 */ +#define XKB_KEY_braille_dots_126 0x1002823 /* U+2823 BRAILLE PATTERN DOTS-126 */ +#define XKB_KEY_braille_dots_36 0x1002824 /* U+2824 BRAILLE PATTERN DOTS-36 */ +#define XKB_KEY_braille_dots_136 0x1002825 /* U+2825 BRAILLE PATTERN DOTS-136 */ +#define XKB_KEY_braille_dots_236 0x1002826 /* U+2826 BRAILLE PATTERN DOTS-236 */ +#define XKB_KEY_braille_dots_1236 0x1002827 /* U+2827 BRAILLE PATTERN DOTS-1236 */ +#define XKB_KEY_braille_dots_46 0x1002828 /* U+2828 BRAILLE PATTERN DOTS-46 */ +#define XKB_KEY_braille_dots_146 0x1002829 /* U+2829 BRAILLE PATTERN DOTS-146 */ +#define XKB_KEY_braille_dots_246 0x100282a /* U+282a BRAILLE PATTERN DOTS-246 */ +#define XKB_KEY_braille_dots_1246 0x100282b /* U+282b BRAILLE PATTERN DOTS-1246 */ +#define XKB_KEY_braille_dots_346 0x100282c /* U+282c BRAILLE PATTERN DOTS-346 */ +#define XKB_KEY_braille_dots_1346 0x100282d /* U+282d BRAILLE PATTERN DOTS-1346 */ +#define XKB_KEY_braille_dots_2346 0x100282e /* U+282e BRAILLE PATTERN DOTS-2346 */ +#define XKB_KEY_braille_dots_12346 0x100282f /* U+282f BRAILLE PATTERN DOTS-12346 */ +#define XKB_KEY_braille_dots_56 0x1002830 /* U+2830 BRAILLE PATTERN DOTS-56 */ +#define XKB_KEY_braille_dots_156 0x1002831 /* U+2831 BRAILLE PATTERN DOTS-156 */ +#define XKB_KEY_braille_dots_256 0x1002832 /* U+2832 BRAILLE PATTERN DOTS-256 */ +#define XKB_KEY_braille_dots_1256 0x1002833 /* U+2833 BRAILLE PATTERN DOTS-1256 */ +#define XKB_KEY_braille_dots_356 0x1002834 /* U+2834 BRAILLE PATTERN DOTS-356 */ +#define XKB_KEY_braille_dots_1356 0x1002835 /* U+2835 BRAILLE PATTERN DOTS-1356 */ +#define XKB_KEY_braille_dots_2356 0x1002836 /* U+2836 BRAILLE PATTERN DOTS-2356 */ +#define XKB_KEY_braille_dots_12356 0x1002837 /* U+2837 BRAILLE PATTERN DOTS-12356 */ +#define XKB_KEY_braille_dots_456 0x1002838 /* U+2838 BRAILLE PATTERN DOTS-456 */ +#define XKB_KEY_braille_dots_1456 0x1002839 /* U+2839 BRAILLE PATTERN DOTS-1456 */ +#define XKB_KEY_braille_dots_2456 0x100283a /* U+283a BRAILLE PATTERN DOTS-2456 */ +#define XKB_KEY_braille_dots_12456 0x100283b /* U+283b BRAILLE PATTERN DOTS-12456 */ +#define XKB_KEY_braille_dots_3456 0x100283c /* U+283c BRAILLE PATTERN DOTS-3456 */ +#define XKB_KEY_braille_dots_13456 0x100283d /* U+283d BRAILLE PATTERN DOTS-13456 */ +#define XKB_KEY_braille_dots_23456 0x100283e /* U+283e BRAILLE PATTERN DOTS-23456 */ +#define XKB_KEY_braille_dots_123456 0x100283f /* U+283f BRAILLE PATTERN DOTS-123456 */ +#define XKB_KEY_braille_dots_7 0x1002840 /* U+2840 BRAILLE PATTERN DOTS-7 */ +#define XKB_KEY_braille_dots_17 0x1002841 /* U+2841 BRAILLE PATTERN DOTS-17 */ +#define XKB_KEY_braille_dots_27 0x1002842 /* U+2842 BRAILLE PATTERN DOTS-27 */ +#define XKB_KEY_braille_dots_127 0x1002843 /* U+2843 BRAILLE PATTERN DOTS-127 */ +#define XKB_KEY_braille_dots_37 0x1002844 /* U+2844 BRAILLE PATTERN DOTS-37 */ +#define XKB_KEY_braille_dots_137 0x1002845 /* U+2845 BRAILLE PATTERN DOTS-137 */ +#define XKB_KEY_braille_dots_237 0x1002846 /* U+2846 BRAILLE PATTERN DOTS-237 */ +#define XKB_KEY_braille_dots_1237 0x1002847 /* U+2847 BRAILLE PATTERN DOTS-1237 */ +#define XKB_KEY_braille_dots_47 0x1002848 /* U+2848 BRAILLE PATTERN DOTS-47 */ +#define XKB_KEY_braille_dots_147 0x1002849 /* U+2849 BRAILLE PATTERN DOTS-147 */ +#define XKB_KEY_braille_dots_247 0x100284a /* U+284a BRAILLE PATTERN DOTS-247 */ +#define XKB_KEY_braille_dots_1247 0x100284b /* U+284b BRAILLE PATTERN DOTS-1247 */ +#define XKB_KEY_braille_dots_347 0x100284c /* U+284c BRAILLE PATTERN DOTS-347 */ +#define XKB_KEY_braille_dots_1347 0x100284d /* U+284d BRAILLE PATTERN DOTS-1347 */ +#define XKB_KEY_braille_dots_2347 0x100284e /* U+284e BRAILLE PATTERN DOTS-2347 */ +#define XKB_KEY_braille_dots_12347 0x100284f /* U+284f BRAILLE PATTERN DOTS-12347 */ +#define XKB_KEY_braille_dots_57 0x1002850 /* U+2850 BRAILLE PATTERN DOTS-57 */ +#define XKB_KEY_braille_dots_157 0x1002851 /* U+2851 BRAILLE PATTERN DOTS-157 */ +#define XKB_KEY_braille_dots_257 0x1002852 /* U+2852 BRAILLE PATTERN DOTS-257 */ +#define XKB_KEY_braille_dots_1257 0x1002853 /* U+2853 BRAILLE PATTERN DOTS-1257 */ +#define XKB_KEY_braille_dots_357 0x1002854 /* U+2854 BRAILLE PATTERN DOTS-357 */ +#define XKB_KEY_braille_dots_1357 0x1002855 /* U+2855 BRAILLE PATTERN DOTS-1357 */ +#define XKB_KEY_braille_dots_2357 0x1002856 /* U+2856 BRAILLE PATTERN DOTS-2357 */ +#define XKB_KEY_braille_dots_12357 0x1002857 /* U+2857 BRAILLE PATTERN DOTS-12357 */ +#define XKB_KEY_braille_dots_457 0x1002858 /* U+2858 BRAILLE PATTERN DOTS-457 */ +#define XKB_KEY_braille_dots_1457 0x1002859 /* U+2859 BRAILLE PATTERN DOTS-1457 */ +#define XKB_KEY_braille_dots_2457 0x100285a /* U+285a BRAILLE PATTERN DOTS-2457 */ +#define XKB_KEY_braille_dots_12457 0x100285b /* U+285b BRAILLE PATTERN DOTS-12457 */ +#define XKB_KEY_braille_dots_3457 0x100285c /* U+285c BRAILLE PATTERN DOTS-3457 */ +#define XKB_KEY_braille_dots_13457 0x100285d /* U+285d BRAILLE PATTERN DOTS-13457 */ +#define XKB_KEY_braille_dots_23457 0x100285e /* U+285e BRAILLE PATTERN DOTS-23457 */ +#define XKB_KEY_braille_dots_123457 0x100285f /* U+285f BRAILLE PATTERN DOTS-123457 */ +#define XKB_KEY_braille_dots_67 0x1002860 /* U+2860 BRAILLE PATTERN DOTS-67 */ +#define XKB_KEY_braille_dots_167 0x1002861 /* U+2861 BRAILLE PATTERN DOTS-167 */ +#define XKB_KEY_braille_dots_267 0x1002862 /* U+2862 BRAILLE PATTERN DOTS-267 */ +#define XKB_KEY_braille_dots_1267 0x1002863 /* U+2863 BRAILLE PATTERN DOTS-1267 */ +#define XKB_KEY_braille_dots_367 0x1002864 /* U+2864 BRAILLE PATTERN DOTS-367 */ +#define XKB_KEY_braille_dots_1367 0x1002865 /* U+2865 BRAILLE PATTERN DOTS-1367 */ +#define XKB_KEY_braille_dots_2367 0x1002866 /* U+2866 BRAILLE PATTERN DOTS-2367 */ +#define XKB_KEY_braille_dots_12367 0x1002867 /* U+2867 BRAILLE PATTERN DOTS-12367 */ +#define XKB_KEY_braille_dots_467 0x1002868 /* U+2868 BRAILLE PATTERN DOTS-467 */ +#define XKB_KEY_braille_dots_1467 0x1002869 /* U+2869 BRAILLE PATTERN DOTS-1467 */ +#define XKB_KEY_braille_dots_2467 0x100286a /* U+286a BRAILLE PATTERN DOTS-2467 */ +#define XKB_KEY_braille_dots_12467 0x100286b /* U+286b BRAILLE PATTERN DOTS-12467 */ +#define XKB_KEY_braille_dots_3467 0x100286c /* U+286c BRAILLE PATTERN DOTS-3467 */ +#define XKB_KEY_braille_dots_13467 0x100286d /* U+286d BRAILLE PATTERN DOTS-13467 */ +#define XKB_KEY_braille_dots_23467 0x100286e /* U+286e BRAILLE PATTERN DOTS-23467 */ +#define XKB_KEY_braille_dots_123467 0x100286f /* U+286f BRAILLE PATTERN DOTS-123467 */ +#define XKB_KEY_braille_dots_567 0x1002870 /* U+2870 BRAILLE PATTERN DOTS-567 */ +#define XKB_KEY_braille_dots_1567 0x1002871 /* U+2871 BRAILLE PATTERN DOTS-1567 */ +#define XKB_KEY_braille_dots_2567 0x1002872 /* U+2872 BRAILLE PATTERN DOTS-2567 */ +#define XKB_KEY_braille_dots_12567 0x1002873 /* U+2873 BRAILLE PATTERN DOTS-12567 */ +#define XKB_KEY_braille_dots_3567 0x1002874 /* U+2874 BRAILLE PATTERN DOTS-3567 */ +#define XKB_KEY_braille_dots_13567 0x1002875 /* U+2875 BRAILLE PATTERN DOTS-13567 */ +#define XKB_KEY_braille_dots_23567 0x1002876 /* U+2876 BRAILLE PATTERN DOTS-23567 */ +#define XKB_KEY_braille_dots_123567 0x1002877 /* U+2877 BRAILLE PATTERN DOTS-123567 */ +#define XKB_KEY_braille_dots_4567 0x1002878 /* U+2878 BRAILLE PATTERN DOTS-4567 */ +#define XKB_KEY_braille_dots_14567 0x1002879 /* U+2879 BRAILLE PATTERN DOTS-14567 */ +#define XKB_KEY_braille_dots_24567 0x100287a /* U+287a BRAILLE PATTERN DOTS-24567 */ +#define XKB_KEY_braille_dots_124567 0x100287b /* U+287b BRAILLE PATTERN DOTS-124567 */ +#define XKB_KEY_braille_dots_34567 0x100287c /* U+287c BRAILLE PATTERN DOTS-34567 */ +#define XKB_KEY_braille_dots_134567 0x100287d /* U+287d BRAILLE PATTERN DOTS-134567 */ +#define XKB_KEY_braille_dots_234567 0x100287e /* U+287e BRAILLE PATTERN DOTS-234567 */ +#define XKB_KEY_braille_dots_1234567 0x100287f /* U+287f BRAILLE PATTERN DOTS-1234567 */ +#define XKB_KEY_braille_dots_8 0x1002880 /* U+2880 BRAILLE PATTERN DOTS-8 */ +#define XKB_KEY_braille_dots_18 0x1002881 /* U+2881 BRAILLE PATTERN DOTS-18 */ +#define XKB_KEY_braille_dots_28 0x1002882 /* U+2882 BRAILLE PATTERN DOTS-28 */ +#define XKB_KEY_braille_dots_128 0x1002883 /* U+2883 BRAILLE PATTERN DOTS-128 */ +#define XKB_KEY_braille_dots_38 0x1002884 /* U+2884 BRAILLE PATTERN DOTS-38 */ +#define XKB_KEY_braille_dots_138 0x1002885 /* U+2885 BRAILLE PATTERN DOTS-138 */ +#define XKB_KEY_braille_dots_238 0x1002886 /* U+2886 BRAILLE PATTERN DOTS-238 */ +#define XKB_KEY_braille_dots_1238 0x1002887 /* U+2887 BRAILLE PATTERN DOTS-1238 */ +#define XKB_KEY_braille_dots_48 0x1002888 /* U+2888 BRAILLE PATTERN DOTS-48 */ +#define XKB_KEY_braille_dots_148 0x1002889 /* U+2889 BRAILLE PATTERN DOTS-148 */ +#define XKB_KEY_braille_dots_248 0x100288a /* U+288a BRAILLE PATTERN DOTS-248 */ +#define XKB_KEY_braille_dots_1248 0x100288b /* U+288b BRAILLE PATTERN DOTS-1248 */ +#define XKB_KEY_braille_dots_348 0x100288c /* U+288c BRAILLE PATTERN DOTS-348 */ +#define XKB_KEY_braille_dots_1348 0x100288d /* U+288d BRAILLE PATTERN DOTS-1348 */ +#define XKB_KEY_braille_dots_2348 0x100288e /* U+288e BRAILLE PATTERN DOTS-2348 */ +#define XKB_KEY_braille_dots_12348 0x100288f /* U+288f BRAILLE PATTERN DOTS-12348 */ +#define XKB_KEY_braille_dots_58 0x1002890 /* U+2890 BRAILLE PATTERN DOTS-58 */ +#define XKB_KEY_braille_dots_158 0x1002891 /* U+2891 BRAILLE PATTERN DOTS-158 */ +#define XKB_KEY_braille_dots_258 0x1002892 /* U+2892 BRAILLE PATTERN DOTS-258 */ +#define XKB_KEY_braille_dots_1258 0x1002893 /* U+2893 BRAILLE PATTERN DOTS-1258 */ +#define XKB_KEY_braille_dots_358 0x1002894 /* U+2894 BRAILLE PATTERN DOTS-358 */ +#define XKB_KEY_braille_dots_1358 0x1002895 /* U+2895 BRAILLE PATTERN DOTS-1358 */ +#define XKB_KEY_braille_dots_2358 0x1002896 /* U+2896 BRAILLE PATTERN DOTS-2358 */ +#define XKB_KEY_braille_dots_12358 0x1002897 /* U+2897 BRAILLE PATTERN DOTS-12358 */ +#define XKB_KEY_braille_dots_458 0x1002898 /* U+2898 BRAILLE PATTERN DOTS-458 */ +#define XKB_KEY_braille_dots_1458 0x1002899 /* U+2899 BRAILLE PATTERN DOTS-1458 */ +#define XKB_KEY_braille_dots_2458 0x100289a /* U+289a BRAILLE PATTERN DOTS-2458 */ +#define XKB_KEY_braille_dots_12458 0x100289b /* U+289b BRAILLE PATTERN DOTS-12458 */ +#define XKB_KEY_braille_dots_3458 0x100289c /* U+289c BRAILLE PATTERN DOTS-3458 */ +#define XKB_KEY_braille_dots_13458 0x100289d /* U+289d BRAILLE PATTERN DOTS-13458 */ +#define XKB_KEY_braille_dots_23458 0x100289e /* U+289e BRAILLE PATTERN DOTS-23458 */ +#define XKB_KEY_braille_dots_123458 0x100289f /* U+289f BRAILLE PATTERN DOTS-123458 */ +#define XKB_KEY_braille_dots_68 0x10028a0 /* U+28a0 BRAILLE PATTERN DOTS-68 */ +#define XKB_KEY_braille_dots_168 0x10028a1 /* U+28a1 BRAILLE PATTERN DOTS-168 */ +#define XKB_KEY_braille_dots_268 0x10028a2 /* U+28a2 BRAILLE PATTERN DOTS-268 */ +#define XKB_KEY_braille_dots_1268 0x10028a3 /* U+28a3 BRAILLE PATTERN DOTS-1268 */ +#define XKB_KEY_braille_dots_368 0x10028a4 /* U+28a4 BRAILLE PATTERN DOTS-368 */ +#define XKB_KEY_braille_dots_1368 0x10028a5 /* U+28a5 BRAILLE PATTERN DOTS-1368 */ +#define XKB_KEY_braille_dots_2368 0x10028a6 /* U+28a6 BRAILLE PATTERN DOTS-2368 */ +#define XKB_KEY_braille_dots_12368 0x10028a7 /* U+28a7 BRAILLE PATTERN DOTS-12368 */ +#define XKB_KEY_braille_dots_468 0x10028a8 /* U+28a8 BRAILLE PATTERN DOTS-468 */ +#define XKB_KEY_braille_dots_1468 0x10028a9 /* U+28a9 BRAILLE PATTERN DOTS-1468 */ +#define XKB_KEY_braille_dots_2468 0x10028aa /* U+28aa BRAILLE PATTERN DOTS-2468 */ +#define XKB_KEY_braille_dots_12468 0x10028ab /* U+28ab BRAILLE PATTERN DOTS-12468 */ +#define XKB_KEY_braille_dots_3468 0x10028ac /* U+28ac BRAILLE PATTERN DOTS-3468 */ +#define XKB_KEY_braille_dots_13468 0x10028ad /* U+28ad BRAILLE PATTERN DOTS-13468 */ +#define XKB_KEY_braille_dots_23468 0x10028ae /* U+28ae BRAILLE PATTERN DOTS-23468 */ +#define XKB_KEY_braille_dots_123468 0x10028af /* U+28af BRAILLE PATTERN DOTS-123468 */ +#define XKB_KEY_braille_dots_568 0x10028b0 /* U+28b0 BRAILLE PATTERN DOTS-568 */ +#define XKB_KEY_braille_dots_1568 0x10028b1 /* U+28b1 BRAILLE PATTERN DOTS-1568 */ +#define XKB_KEY_braille_dots_2568 0x10028b2 /* U+28b2 BRAILLE PATTERN DOTS-2568 */ +#define XKB_KEY_braille_dots_12568 0x10028b3 /* U+28b3 BRAILLE PATTERN DOTS-12568 */ +#define XKB_KEY_braille_dots_3568 0x10028b4 /* U+28b4 BRAILLE PATTERN DOTS-3568 */ +#define XKB_KEY_braille_dots_13568 0x10028b5 /* U+28b5 BRAILLE PATTERN DOTS-13568 */ +#define XKB_KEY_braille_dots_23568 0x10028b6 /* U+28b6 BRAILLE PATTERN DOTS-23568 */ +#define XKB_KEY_braille_dots_123568 0x10028b7 /* U+28b7 BRAILLE PATTERN DOTS-123568 */ +#define XKB_KEY_braille_dots_4568 0x10028b8 /* U+28b8 BRAILLE PATTERN DOTS-4568 */ +#define XKB_KEY_braille_dots_14568 0x10028b9 /* U+28b9 BRAILLE PATTERN DOTS-14568 */ +#define XKB_KEY_braille_dots_24568 0x10028ba /* U+28ba BRAILLE PATTERN DOTS-24568 */ +#define XKB_KEY_braille_dots_124568 0x10028bb /* U+28bb BRAILLE PATTERN DOTS-124568 */ +#define XKB_KEY_braille_dots_34568 0x10028bc /* U+28bc BRAILLE PATTERN DOTS-34568 */ +#define XKB_KEY_braille_dots_134568 0x10028bd /* U+28bd BRAILLE PATTERN DOTS-134568 */ +#define XKB_KEY_braille_dots_234568 0x10028be /* U+28be BRAILLE PATTERN DOTS-234568 */ +#define XKB_KEY_braille_dots_1234568 0x10028bf /* U+28bf BRAILLE PATTERN DOTS-1234568 */ +#define XKB_KEY_braille_dots_78 0x10028c0 /* U+28c0 BRAILLE PATTERN DOTS-78 */ +#define XKB_KEY_braille_dots_178 0x10028c1 /* U+28c1 BRAILLE PATTERN DOTS-178 */ +#define XKB_KEY_braille_dots_278 0x10028c2 /* U+28c2 BRAILLE PATTERN DOTS-278 */ +#define XKB_KEY_braille_dots_1278 0x10028c3 /* U+28c3 BRAILLE PATTERN DOTS-1278 */ +#define XKB_KEY_braille_dots_378 0x10028c4 /* U+28c4 BRAILLE PATTERN DOTS-378 */ +#define XKB_KEY_braille_dots_1378 0x10028c5 /* U+28c5 BRAILLE PATTERN DOTS-1378 */ +#define XKB_KEY_braille_dots_2378 0x10028c6 /* U+28c6 BRAILLE PATTERN DOTS-2378 */ +#define XKB_KEY_braille_dots_12378 0x10028c7 /* U+28c7 BRAILLE PATTERN DOTS-12378 */ +#define XKB_KEY_braille_dots_478 0x10028c8 /* U+28c8 BRAILLE PATTERN DOTS-478 */ +#define XKB_KEY_braille_dots_1478 0x10028c9 /* U+28c9 BRAILLE PATTERN DOTS-1478 */ +#define XKB_KEY_braille_dots_2478 0x10028ca /* U+28ca BRAILLE PATTERN DOTS-2478 */ +#define XKB_KEY_braille_dots_12478 0x10028cb /* U+28cb BRAILLE PATTERN DOTS-12478 */ +#define XKB_KEY_braille_dots_3478 0x10028cc /* U+28cc BRAILLE PATTERN DOTS-3478 */ +#define XKB_KEY_braille_dots_13478 0x10028cd /* U+28cd BRAILLE PATTERN DOTS-13478 */ +#define XKB_KEY_braille_dots_23478 0x10028ce /* U+28ce BRAILLE PATTERN DOTS-23478 */ +#define XKB_KEY_braille_dots_123478 0x10028cf /* U+28cf BRAILLE PATTERN DOTS-123478 */ +#define XKB_KEY_braille_dots_578 0x10028d0 /* U+28d0 BRAILLE PATTERN DOTS-578 */ +#define XKB_KEY_braille_dots_1578 0x10028d1 /* U+28d1 BRAILLE PATTERN DOTS-1578 */ +#define XKB_KEY_braille_dots_2578 0x10028d2 /* U+28d2 BRAILLE PATTERN DOTS-2578 */ +#define XKB_KEY_braille_dots_12578 0x10028d3 /* U+28d3 BRAILLE PATTERN DOTS-12578 */ +#define XKB_KEY_braille_dots_3578 0x10028d4 /* U+28d4 BRAILLE PATTERN DOTS-3578 */ +#define XKB_KEY_braille_dots_13578 0x10028d5 /* U+28d5 BRAILLE PATTERN DOTS-13578 */ +#define XKB_KEY_braille_dots_23578 0x10028d6 /* U+28d6 BRAILLE PATTERN DOTS-23578 */ +#define XKB_KEY_braille_dots_123578 0x10028d7 /* U+28d7 BRAILLE PATTERN DOTS-123578 */ +#define XKB_KEY_braille_dots_4578 0x10028d8 /* U+28d8 BRAILLE PATTERN DOTS-4578 */ +#define XKB_KEY_braille_dots_14578 0x10028d9 /* U+28d9 BRAILLE PATTERN DOTS-14578 */ +#define XKB_KEY_braille_dots_24578 0x10028da /* U+28da BRAILLE PATTERN DOTS-24578 */ +#define XKB_KEY_braille_dots_124578 0x10028db /* U+28db BRAILLE PATTERN DOTS-124578 */ +#define XKB_KEY_braille_dots_34578 0x10028dc /* U+28dc BRAILLE PATTERN DOTS-34578 */ +#define XKB_KEY_braille_dots_134578 0x10028dd /* U+28dd BRAILLE PATTERN DOTS-134578 */ +#define XKB_KEY_braille_dots_234578 0x10028de /* U+28de BRAILLE PATTERN DOTS-234578 */ +#define XKB_KEY_braille_dots_1234578 0x10028df /* U+28df BRAILLE PATTERN DOTS-1234578 */ +#define XKB_KEY_braille_dots_678 0x10028e0 /* U+28e0 BRAILLE PATTERN DOTS-678 */ +#define XKB_KEY_braille_dots_1678 0x10028e1 /* U+28e1 BRAILLE PATTERN DOTS-1678 */ +#define XKB_KEY_braille_dots_2678 0x10028e2 /* U+28e2 BRAILLE PATTERN DOTS-2678 */ +#define XKB_KEY_braille_dots_12678 0x10028e3 /* U+28e3 BRAILLE PATTERN DOTS-12678 */ +#define XKB_KEY_braille_dots_3678 0x10028e4 /* U+28e4 BRAILLE PATTERN DOTS-3678 */ +#define XKB_KEY_braille_dots_13678 0x10028e5 /* U+28e5 BRAILLE PATTERN DOTS-13678 */ +#define XKB_KEY_braille_dots_23678 0x10028e6 /* U+28e6 BRAILLE PATTERN DOTS-23678 */ +#define XKB_KEY_braille_dots_123678 0x10028e7 /* U+28e7 BRAILLE PATTERN DOTS-123678 */ +#define XKB_KEY_braille_dots_4678 0x10028e8 /* U+28e8 BRAILLE PATTERN DOTS-4678 */ +#define XKB_KEY_braille_dots_14678 0x10028e9 /* U+28e9 BRAILLE PATTERN DOTS-14678 */ +#define XKB_KEY_braille_dots_24678 0x10028ea /* U+28ea BRAILLE PATTERN DOTS-24678 */ +#define XKB_KEY_braille_dots_124678 0x10028eb /* U+28eb BRAILLE PATTERN DOTS-124678 */ +#define XKB_KEY_braille_dots_34678 0x10028ec /* U+28ec BRAILLE PATTERN DOTS-34678 */ +#define XKB_KEY_braille_dots_134678 0x10028ed /* U+28ed BRAILLE PATTERN DOTS-134678 */ +#define XKB_KEY_braille_dots_234678 0x10028ee /* U+28ee BRAILLE PATTERN DOTS-234678 */ +#define XKB_KEY_braille_dots_1234678 0x10028ef /* U+28ef BRAILLE PATTERN DOTS-1234678 */ +#define XKB_KEY_braille_dots_5678 0x10028f0 /* U+28f0 BRAILLE PATTERN DOTS-5678 */ +#define XKB_KEY_braille_dots_15678 0x10028f1 /* U+28f1 BRAILLE PATTERN DOTS-15678 */ +#define XKB_KEY_braille_dots_25678 0x10028f2 /* U+28f2 BRAILLE PATTERN DOTS-25678 */ +#define XKB_KEY_braille_dots_125678 0x10028f3 /* U+28f3 BRAILLE PATTERN DOTS-125678 */ +#define XKB_KEY_braille_dots_35678 0x10028f4 /* U+28f4 BRAILLE PATTERN DOTS-35678 */ +#define XKB_KEY_braille_dots_135678 0x10028f5 /* U+28f5 BRAILLE PATTERN DOTS-135678 */ +#define XKB_KEY_braille_dots_235678 0x10028f6 /* U+28f6 BRAILLE PATTERN DOTS-235678 */ +#define XKB_KEY_braille_dots_1235678 0x10028f7 /* U+28f7 BRAILLE PATTERN DOTS-1235678 */ +#define XKB_KEY_braille_dots_45678 0x10028f8 /* U+28f8 BRAILLE PATTERN DOTS-45678 */ +#define XKB_KEY_braille_dots_145678 0x10028f9 /* U+28f9 BRAILLE PATTERN DOTS-145678 */ +#define XKB_KEY_braille_dots_245678 0x10028fa /* U+28fa BRAILLE PATTERN DOTS-245678 */ +#define XKB_KEY_braille_dots_1245678 0x10028fb /* U+28fb BRAILLE PATTERN DOTS-1245678 */ +#define XKB_KEY_braille_dots_345678 0x10028fc /* U+28fc BRAILLE PATTERN DOTS-345678 */ +#define XKB_KEY_braille_dots_1345678 0x10028fd /* U+28fd BRAILLE PATTERN DOTS-1345678 */ +#define XKB_KEY_braille_dots_2345678 0x10028fe /* U+28fe BRAILLE PATTERN DOTS-2345678 */ +#define XKB_KEY_braille_dots_12345678 0x10028ff /* U+28ff BRAILLE PATTERN DOTS-12345678 */ + +/* + * Sinhala (http://unicode.org/charts/PDF/U0D80.pdf) + * http://www.nongnu.org/sinhala/doc/transliteration/sinhala-transliteration_6.html + */ + +#define XKB_KEY_Sinh_ng 0x1000d82 /* U+0D82 SINHALA ANUSVARAYA */ +#define XKB_KEY_Sinh_h2 0x1000d83 /* U+0D83 SINHALA VISARGAYA */ +#define XKB_KEY_Sinh_a 0x1000d85 /* U+0D85 SINHALA AYANNA */ +#define XKB_KEY_Sinh_aa 0x1000d86 /* U+0D86 SINHALA AAYANNA */ +#define XKB_KEY_Sinh_ae 0x1000d87 /* U+0D87 SINHALA AEYANNA */ +#define XKB_KEY_Sinh_aee 0x1000d88 /* U+0D88 SINHALA AEEYANNA */ +#define XKB_KEY_Sinh_i 0x1000d89 /* U+0D89 SINHALA IYANNA */ +#define XKB_KEY_Sinh_ii 0x1000d8a /* U+0D8A SINHALA IIYANNA */ +#define XKB_KEY_Sinh_u 0x1000d8b /* U+0D8B SINHALA UYANNA */ +#define XKB_KEY_Sinh_uu 0x1000d8c /* U+0D8C SINHALA UUYANNA */ +#define XKB_KEY_Sinh_ri 0x1000d8d /* U+0D8D SINHALA IRUYANNA */ +#define XKB_KEY_Sinh_rii 0x1000d8e /* U+0D8E SINHALA IRUUYANNA */ +#define XKB_KEY_Sinh_lu 0x1000d8f /* U+0D8F SINHALA ILUYANNA */ +#define XKB_KEY_Sinh_luu 0x1000d90 /* U+0D90 SINHALA ILUUYANNA */ +#define XKB_KEY_Sinh_e 0x1000d91 /* U+0D91 SINHALA EYANNA */ +#define XKB_KEY_Sinh_ee 0x1000d92 /* U+0D92 SINHALA EEYANNA */ +#define XKB_KEY_Sinh_ai 0x1000d93 /* U+0D93 SINHALA AIYANNA */ +#define XKB_KEY_Sinh_o 0x1000d94 /* U+0D94 SINHALA OYANNA */ +#define XKB_KEY_Sinh_oo 0x1000d95 /* U+0D95 SINHALA OOYANNA */ +#define XKB_KEY_Sinh_au 0x1000d96 /* U+0D96 SINHALA AUYANNA */ +#define XKB_KEY_Sinh_ka 0x1000d9a /* U+0D9A SINHALA KAYANNA */ +#define XKB_KEY_Sinh_kha 0x1000d9b /* U+0D9B SINHALA MAHA. KAYANNA */ +#define XKB_KEY_Sinh_ga 0x1000d9c /* U+0D9C SINHALA GAYANNA */ +#define XKB_KEY_Sinh_gha 0x1000d9d /* U+0D9D SINHALA MAHA. GAYANNA */ +#define XKB_KEY_Sinh_ng2 0x1000d9e /* U+0D9E SINHALA KANTAJA NAASIKYAYA */ +#define XKB_KEY_Sinh_nga 0x1000d9f /* U+0D9F SINHALA SANYAKA GAYANNA */ +#define XKB_KEY_Sinh_ca 0x1000da0 /* U+0DA0 SINHALA CAYANNA */ +#define XKB_KEY_Sinh_cha 0x1000da1 /* U+0DA1 SINHALA MAHA. CAYANNA */ +#define XKB_KEY_Sinh_ja 0x1000da2 /* U+0DA2 SINHALA JAYANNA */ +#define XKB_KEY_Sinh_jha 0x1000da3 /* U+0DA3 SINHALA MAHA. JAYANNA */ +#define XKB_KEY_Sinh_nya 0x1000da4 /* U+0DA4 SINHALA TAALUJA NAASIKYAYA */ +#define XKB_KEY_Sinh_jnya 0x1000da5 /* U+0DA5 SINHALA TAALUJA SANYOOGA NAASIKYAYA */ +#define XKB_KEY_Sinh_nja 0x1000da6 /* U+0DA6 SINHALA SANYAKA JAYANNA */ +#define XKB_KEY_Sinh_tta 0x1000da7 /* U+0DA7 SINHALA TTAYANNA */ +#define XKB_KEY_Sinh_ttha 0x1000da8 /* U+0DA8 SINHALA MAHA. TTAYANNA */ +#define XKB_KEY_Sinh_dda 0x1000da9 /* U+0DA9 SINHALA DDAYANNA */ +#define XKB_KEY_Sinh_ddha 0x1000daa /* U+0DAA SINHALA MAHA. DDAYANNA */ +#define XKB_KEY_Sinh_nna 0x1000dab /* U+0DAB SINHALA MUURDHAJA NAYANNA */ +#define XKB_KEY_Sinh_ndda 0x1000dac /* U+0DAC SINHALA SANYAKA DDAYANNA */ +#define XKB_KEY_Sinh_tha 0x1000dad /* U+0DAD SINHALA TAYANNA */ +#define XKB_KEY_Sinh_thha 0x1000dae /* U+0DAE SINHALA MAHA. TAYANNA */ +#define XKB_KEY_Sinh_dha 0x1000daf /* U+0DAF SINHALA DAYANNA */ +#define XKB_KEY_Sinh_dhha 0x1000db0 /* U+0DB0 SINHALA MAHA. DAYANNA */ +#define XKB_KEY_Sinh_na 0x1000db1 /* U+0DB1 SINHALA DANTAJA NAYANNA */ +#define XKB_KEY_Sinh_ndha 0x1000db3 /* U+0DB3 SINHALA SANYAKA DAYANNA */ +#define XKB_KEY_Sinh_pa 0x1000db4 /* U+0DB4 SINHALA PAYANNA */ +#define XKB_KEY_Sinh_pha 0x1000db5 /* U+0DB5 SINHALA MAHA. PAYANNA */ +#define XKB_KEY_Sinh_ba 0x1000db6 /* U+0DB6 SINHALA BAYANNA */ +#define XKB_KEY_Sinh_bha 0x1000db7 /* U+0DB7 SINHALA MAHA. BAYANNA */ +#define XKB_KEY_Sinh_ma 0x1000db8 /* U+0DB8 SINHALA MAYANNA */ +#define XKB_KEY_Sinh_mba 0x1000db9 /* U+0DB9 SINHALA AMBA BAYANNA */ +#define XKB_KEY_Sinh_ya 0x1000dba /* U+0DBA SINHALA YAYANNA */ +#define XKB_KEY_Sinh_ra 0x1000dbb /* U+0DBB SINHALA RAYANNA */ +#define XKB_KEY_Sinh_la 0x1000dbd /* U+0DBD SINHALA DANTAJA LAYANNA */ +#define XKB_KEY_Sinh_va 0x1000dc0 /* U+0DC0 SINHALA VAYANNA */ +#define XKB_KEY_Sinh_sha 0x1000dc1 /* U+0DC1 SINHALA TAALUJA SAYANNA */ +#define XKB_KEY_Sinh_ssha 0x1000dc2 /* U+0DC2 SINHALA MUURDHAJA SAYANNA */ +#define XKB_KEY_Sinh_sa 0x1000dc3 /* U+0DC3 SINHALA DANTAJA SAYANNA */ +#define XKB_KEY_Sinh_ha 0x1000dc4 /* U+0DC4 SINHALA HAYANNA */ +#define XKB_KEY_Sinh_lla 0x1000dc5 /* U+0DC5 SINHALA MUURDHAJA LAYANNA */ +#define XKB_KEY_Sinh_fa 0x1000dc6 /* U+0DC6 SINHALA FAYANNA */ +#define XKB_KEY_Sinh_al 0x1000dca /* U+0DCA SINHALA AL-LAKUNA */ +#define XKB_KEY_Sinh_aa2 0x1000dcf /* U+0DCF SINHALA AELA-PILLA */ +#define XKB_KEY_Sinh_ae2 0x1000dd0 /* U+0DD0 SINHALA AEDA-PILLA */ +#define XKB_KEY_Sinh_aee2 0x1000dd1 /* U+0DD1 SINHALA DIGA AEDA-PILLA */ +#define XKB_KEY_Sinh_i2 0x1000dd2 /* U+0DD2 SINHALA IS-PILLA */ +#define XKB_KEY_Sinh_ii2 0x1000dd3 /* U+0DD3 SINHALA DIGA IS-PILLA */ +#define XKB_KEY_Sinh_u2 0x1000dd4 /* U+0DD4 SINHALA PAA-PILLA */ +#define XKB_KEY_Sinh_uu2 0x1000dd6 /* U+0DD6 SINHALA DIGA PAA-PILLA */ +#define XKB_KEY_Sinh_ru2 0x1000dd8 /* U+0DD8 SINHALA GAETTA-PILLA */ +#define XKB_KEY_Sinh_e2 0x1000dd9 /* U+0DD9 SINHALA KOMBUVA */ +#define XKB_KEY_Sinh_ee2 0x1000dda /* U+0DDA SINHALA DIGA KOMBUVA */ +#define XKB_KEY_Sinh_ai2 0x1000ddb /* U+0DDB SINHALA KOMBU DEKA */ +#define XKB_KEY_Sinh_o2 0x1000ddc /* U+0DDC SINHALA KOMBUVA HAA AELA-PILLA*/ +#define XKB_KEY_Sinh_oo2 0x1000ddd /* U+0DDD SINHALA KOMBUVA HAA DIGA AELA-PILLA*/ +#define XKB_KEY_Sinh_au2 0x1000dde /* U+0DDE SINHALA KOMBUVA HAA GAYANUKITTA */ +#define XKB_KEY_Sinh_lu2 0x1000ddf /* U+0DDF SINHALA GAYANUKITTA */ +#define XKB_KEY_Sinh_ruu2 0x1000df2 /* U+0DF2 SINHALA DIGA GAETTA-PILLA */ +#define XKB_KEY_Sinh_luu2 0x1000df3 /* U+0DF3 SINHALA DIGA GAYANUKITTA */ +#define XKB_KEY_Sinh_kunddaliya 0x1000df4 /* U+0DF4 SINHALA KUNDDALIYA */ +/* + * XFree86 vendor specific keysyms. + * + * The XFree86 keysym range is 0x10080001 - 0x1008FFFF. + * + * When adding new entries, the xc/lib/XKeysymDB file should also be + * updated to make the new entries visible to Xlib. + */ + +/* + * ModeLock + * + * This one is old, and not really used any more since XKB offers this + * functionality. + */ + +#define XKB_KEY_XF86ModeLock 0x1008FF01 /* Mode Switch Lock */ + +/* + * Note, 0x1008FF07 - 0x1008FF0F are free and should be used for misc new + * keysyms that don't fit into any of the groups below. + * + * 0x1008FF64, 0x1008FF6F, 0x1008FF71, 0x1008FF83 are no longer used, + * and should be used first for new keysyms. + * + * Check in keysymdef.h for generic symbols before adding new XFree86-specific + * symbols here. + * + * X.Org will not be adding to the XF86 set of keysyms, though they have + * been adopted and are considered a "standard" part of X keysym definitions. + * XFree86 never properly commented these keysyms, so we have done our + * best to explain the semantic meaning of these keys. + * + * XFree86 has removed their mail archives of the period, that might have + * shed more light on some of these definitions. Until/unless we resurrect + * these archives, these are from memory and usage. + */ + + +/* Backlight controls. */ +#define XKB_KEY_XF86MonBrightnessUp 0x1008FF02 /* Monitor/panel brightness */ +#define XKB_KEY_XF86MonBrightnessDown 0x1008FF03 /* Monitor/panel brightness */ +#define XKB_KEY_XF86KbdLightOnOff 0x1008FF04 /* Keyboards may be lit */ +#define XKB_KEY_XF86KbdBrightnessUp 0x1008FF05 /* Keyboards may be lit */ +#define XKB_KEY_XF86KbdBrightnessDown 0x1008FF06 /* Keyboards may be lit */ + +/* + * Keys found on some "Internet" keyboards. + */ +#define XKB_KEY_XF86Standby 0x1008FF10 /* System into standby mode */ +#define XKB_KEY_XF86AudioLowerVolume 0x1008FF11 /* Volume control down */ +#define XKB_KEY_XF86AudioMute 0x1008FF12 /* Mute sound from the system */ +#define XKB_KEY_XF86AudioRaiseVolume 0x1008FF13 /* Volume control up */ +#define XKB_KEY_XF86AudioPlay 0x1008FF14 /* Start playing of audio > */ +#define XKB_KEY_XF86AudioStop 0x1008FF15 /* Stop playing audio */ +#define XKB_KEY_XF86AudioPrev 0x1008FF16 /* Previous track */ +#define XKB_KEY_XF86AudioNext 0x1008FF17 /* Next track */ +#define XKB_KEY_XF86HomePage 0x1008FF18 /* Display user's home page */ +#define XKB_KEY_XF86Mail 0x1008FF19 /* Invoke user's mail program */ +#define XKB_KEY_XF86Start 0x1008FF1A /* Start application */ +#define XKB_KEY_XF86Search 0x1008FF1B /* Search */ +#define XKB_KEY_XF86AudioRecord 0x1008FF1C /* Record audio application */ + +/* These are sometimes found on PDA's (e.g. Palm, PocketPC or elsewhere) */ +#define XKB_KEY_XF86Calculator 0x1008FF1D /* Invoke calculator program */ +#define XKB_KEY_XF86Memo 0x1008FF1E /* Invoke Memo taking program */ +#define XKB_KEY_XF86ToDoList 0x1008FF1F /* Invoke To Do List program */ +#define XKB_KEY_XF86Calendar 0x1008FF20 /* Invoke Calendar program */ +#define XKB_KEY_XF86PowerDown 0x1008FF21 /* Deep sleep the system */ +#define XKB_KEY_XF86ContrastAdjust 0x1008FF22 /* Adjust screen contrast */ +#define XKB_KEY_XF86RockerUp 0x1008FF23 /* Rocker switches exist up */ +#define XKB_KEY_XF86RockerDown 0x1008FF24 /* and down */ +#define XKB_KEY_XF86RockerEnter 0x1008FF25 /* and let you press them */ + +/* Some more "Internet" keyboard symbols */ +#define XKB_KEY_XF86Back 0x1008FF26 /* Like back on a browser */ +#define XKB_KEY_XF86Forward 0x1008FF27 /* Like forward on a browser */ +#define XKB_KEY_XF86Stop 0x1008FF28 /* Stop current operation */ +#define XKB_KEY_XF86Refresh 0x1008FF29 /* Refresh the page */ +#define XKB_KEY_XF86PowerOff 0x1008FF2A /* Power off system entirely */ +#define XKB_KEY_XF86WakeUp 0x1008FF2B /* Wake up system from sleep */ +#define XKB_KEY_XF86Eject 0x1008FF2C /* Eject device (e.g. DVD) */ +#define XKB_KEY_XF86ScreenSaver 0x1008FF2D /* Invoke screensaver */ +#define XKB_KEY_XF86WWW 0x1008FF2E /* Invoke web browser */ +#define XKB_KEY_XF86Sleep 0x1008FF2F /* Put system to sleep */ +#define XKB_KEY_XF86Favorites 0x1008FF30 /* Show favorite locations */ +#define XKB_KEY_XF86AudioPause 0x1008FF31 /* Pause audio playing */ +#define XKB_KEY_XF86AudioMedia 0x1008FF32 /* Launch media collection app */ +#define XKB_KEY_XF86MyComputer 0x1008FF33 /* Display "My Computer" window */ +#define XKB_KEY_XF86VendorHome 0x1008FF34 /* Display vendor home web site */ +#define XKB_KEY_XF86LightBulb 0x1008FF35 /* Light bulb keys exist */ +#define XKB_KEY_XF86Shop 0x1008FF36 /* Display shopping web site */ +#define XKB_KEY_XF86History 0x1008FF37 /* Show history of web surfing */ +#define XKB_KEY_XF86OpenURL 0x1008FF38 /* Open selected URL */ +#define XKB_KEY_XF86AddFavorite 0x1008FF39 /* Add URL to favorites list */ +#define XKB_KEY_XF86HotLinks 0x1008FF3A /* Show "hot" links */ +#define XKB_KEY_XF86BrightnessAdjust 0x1008FF3B /* Invoke brightness adj. UI */ +#define XKB_KEY_XF86Finance 0x1008FF3C /* Display financial site */ +#define XKB_KEY_XF86Community 0x1008FF3D /* Display user's community */ +#define XKB_KEY_XF86AudioRewind 0x1008FF3E /* "rewind" audio track */ +#define XKB_KEY_XF86BackForward 0x1008FF3F /* ??? */ +#define XKB_KEY_XF86Launch0 0x1008FF40 /* Launch Application */ +#define XKB_KEY_XF86Launch1 0x1008FF41 /* Launch Application */ +#define XKB_KEY_XF86Launch2 0x1008FF42 /* Launch Application */ +#define XKB_KEY_XF86Launch3 0x1008FF43 /* Launch Application */ +#define XKB_KEY_XF86Launch4 0x1008FF44 /* Launch Application */ +#define XKB_KEY_XF86Launch5 0x1008FF45 /* Launch Application */ +#define XKB_KEY_XF86Launch6 0x1008FF46 /* Launch Application */ +#define XKB_KEY_XF86Launch7 0x1008FF47 /* Launch Application */ +#define XKB_KEY_XF86Launch8 0x1008FF48 /* Launch Application */ +#define XKB_KEY_XF86Launch9 0x1008FF49 /* Launch Application */ +#define XKB_KEY_XF86LaunchA 0x1008FF4A /* Launch Application */ +#define XKB_KEY_XF86LaunchB 0x1008FF4B /* Launch Application */ +#define XKB_KEY_XF86LaunchC 0x1008FF4C /* Launch Application */ +#define XKB_KEY_XF86LaunchD 0x1008FF4D /* Launch Application */ +#define XKB_KEY_XF86LaunchE 0x1008FF4E /* Launch Application */ +#define XKB_KEY_XF86LaunchF 0x1008FF4F /* Launch Application */ + +#define XKB_KEY_XF86ApplicationLeft 0x1008FF50 /* switch to application, left */ +#define XKB_KEY_XF86ApplicationRight 0x1008FF51 /* switch to application, right*/ +#define XKB_KEY_XF86Book 0x1008FF52 /* Launch bookreader */ +#define XKB_KEY_XF86CD 0x1008FF53 /* Launch CD/DVD player */ +#define XKB_KEY_XF86Calculater 0x1008FF54 /* Launch Calculater */ +#define XKB_KEY_XF86Clear 0x1008FF55 /* Clear window, screen */ +#define XKB_KEY_XF86Close 0x1008FF56 /* Close window */ +#define XKB_KEY_XF86Copy 0x1008FF57 /* Copy selection */ +#define XKB_KEY_XF86Cut 0x1008FF58 /* Cut selection */ +#define XKB_KEY_XF86Display 0x1008FF59 /* Output switch key */ +#define XKB_KEY_XF86DOS 0x1008FF5A /* Launch DOS (emulation) */ +#define XKB_KEY_XF86Documents 0x1008FF5B /* Open documents window */ +#define XKB_KEY_XF86Excel 0x1008FF5C /* Launch spread sheet */ +#define XKB_KEY_XF86Explorer 0x1008FF5D /* Launch file explorer */ +#define XKB_KEY_XF86Game 0x1008FF5E /* Launch game */ +#define XKB_KEY_XF86Go 0x1008FF5F /* Go to URL */ +#define XKB_KEY_XF86iTouch 0x1008FF60 /* Logitch iTouch- don't use */ +#define XKB_KEY_XF86LogOff 0x1008FF61 /* Log off system */ +#define XKB_KEY_XF86Market 0x1008FF62 /* ?? */ +#define XKB_KEY_XF86Meeting 0x1008FF63 /* enter meeting in calendar */ +#define XKB_KEY_XF86MenuKB 0x1008FF65 /* distingush keyboard from PB */ +#define XKB_KEY_XF86MenuPB 0x1008FF66 /* distinuish PB from keyboard */ +#define XKB_KEY_XF86MySites 0x1008FF67 /* Favourites */ +#define XKB_KEY_XF86New 0x1008FF68 /* New (folder, document... */ +#define XKB_KEY_XF86News 0x1008FF69 /* News */ +#define XKB_KEY_XF86OfficeHome 0x1008FF6A /* Office home (old Staroffice)*/ +#define XKB_KEY_XF86Open 0x1008FF6B /* Open */ +#define XKB_KEY_XF86Option 0x1008FF6C /* ?? */ +#define XKB_KEY_XF86Paste 0x1008FF6D /* Paste */ +#define XKB_KEY_XF86Phone 0x1008FF6E /* Launch phone; dial number */ +#define XKB_KEY_XF86Q 0x1008FF70 /* Compaq's Q - don't use */ +#define XKB_KEY_XF86Reply 0x1008FF72 /* Reply e.g., mail */ +#define XKB_KEY_XF86Reload 0x1008FF73 /* Reload web page, file, etc. */ +#define XKB_KEY_XF86RotateWindows 0x1008FF74 /* Rotate windows e.g. xrandr */ +#define XKB_KEY_XF86RotationPB 0x1008FF75 /* don't use */ +#define XKB_KEY_XF86RotationKB 0x1008FF76 /* don't use */ +#define XKB_KEY_XF86Save 0x1008FF77 /* Save (file, document, state */ +#define XKB_KEY_XF86ScrollUp 0x1008FF78 /* Scroll window/contents up */ +#define XKB_KEY_XF86ScrollDown 0x1008FF79 /* Scrool window/contentd down */ +#define XKB_KEY_XF86ScrollClick 0x1008FF7A /* Use XKB mousekeys instead */ +#define XKB_KEY_XF86Send 0x1008FF7B /* Send mail, file, object */ +#define XKB_KEY_XF86Spell 0x1008FF7C /* Spell checker */ +#define XKB_KEY_XF86SplitScreen 0x1008FF7D /* Split window or screen */ +#define XKB_KEY_XF86Support 0x1008FF7E /* Get support (??) */ +#define XKB_KEY_XF86TaskPane 0x1008FF7F /* Show tasks */ +#define XKB_KEY_XF86Terminal 0x1008FF80 /* Launch terminal emulator */ +#define XKB_KEY_XF86Tools 0x1008FF81 /* toolbox of desktop/app. */ +#define XKB_KEY_XF86Travel 0x1008FF82 /* ?? */ +#define XKB_KEY_XF86UserPB 0x1008FF84 /* ?? */ +#define XKB_KEY_XF86User1KB 0x1008FF85 /* ?? */ +#define XKB_KEY_XF86User2KB 0x1008FF86 /* ?? */ +#define XKB_KEY_XF86Video 0x1008FF87 /* Launch video player */ +#define XKB_KEY_XF86WheelButton 0x1008FF88 /* button from a mouse wheel */ +#define XKB_KEY_XF86Word 0x1008FF89 /* Launch word processor */ +#define XKB_KEY_XF86Xfer 0x1008FF8A +#define XKB_KEY_XF86ZoomIn 0x1008FF8B /* zoom in view, map, etc. */ +#define XKB_KEY_XF86ZoomOut 0x1008FF8C /* zoom out view, map, etc. */ + +#define XKB_KEY_XF86Away 0x1008FF8D /* mark yourself as away */ +#define XKB_KEY_XF86Messenger 0x1008FF8E /* as in instant messaging */ +#define XKB_KEY_XF86WebCam 0x1008FF8F /* Launch web camera app. */ +#define XKB_KEY_XF86MailForward 0x1008FF90 /* Forward in mail */ +#define XKB_KEY_XF86Pictures 0x1008FF91 /* Show pictures */ +#define XKB_KEY_XF86Music 0x1008FF92 /* Launch music application */ + +#define XKB_KEY_XF86Battery 0x1008FF93 /* Display battery information */ +#define XKB_KEY_XF86Bluetooth 0x1008FF94 /* Enable/disable Bluetooth */ +#define XKB_KEY_XF86WLAN 0x1008FF95 /* Enable/disable WLAN */ +#define XKB_KEY_XF86UWB 0x1008FF96 /* Enable/disable UWB */ + +#define XKB_KEY_XF86AudioForward 0x1008FF97 /* fast-forward audio track */ +#define XKB_KEY_XF86AudioRepeat 0x1008FF98 /* toggle repeat mode */ +#define XKB_KEY_XF86AudioRandomPlay 0x1008FF99 /* toggle shuffle mode */ +#define XKB_KEY_XF86Subtitle 0x1008FF9A /* cycle through subtitle */ +#define XKB_KEY_XF86AudioCycleTrack 0x1008FF9B /* cycle through audio tracks */ +#define XKB_KEY_XF86CycleAngle 0x1008FF9C /* cycle through angles */ +#define XKB_KEY_XF86FrameBack 0x1008FF9D /* video: go one frame back */ +#define XKB_KEY_XF86FrameForward 0x1008FF9E /* video: go one frame forward */ +#define XKB_KEY_XF86Time 0x1008FF9F /* display, or shows an entry for time seeking */ +#define XKB_KEY_XF86Select 0x1008FFA0 /* Select button on joypads and remotes */ +#define XKB_KEY_XF86View 0x1008FFA1 /* Show a view options/properties */ +#define XKB_KEY_XF86TopMenu 0x1008FFA2 /* Go to a top-level menu in a video */ + +#define XKB_KEY_XF86Red 0x1008FFA3 /* Red button */ +#define XKB_KEY_XF86Green 0x1008FFA4 /* Green button */ +#define XKB_KEY_XF86Yellow 0x1008FFA5 /* Yellow button */ +#define XKB_KEY_XF86Blue 0x1008FFA6 /* Blue button */ + +#define XKB_KEY_XF86Suspend 0x1008FFA7 /* Sleep to RAM */ +#define XKB_KEY_XF86Hibernate 0x1008FFA8 /* Sleep to disk */ +#define XKB_KEY_XF86TouchpadToggle 0x1008FFA9 /* Toggle between touchpad/trackstick */ +#define XKB_KEY_XF86TouchpadOn 0x1008FFB0 /* The touchpad got switched on */ +#define XKB_KEY_XF86TouchpadOff 0x1008FFB1 /* The touchpad got switched off */ + +/* Keys for special action keys (hot keys) */ +/* Virtual terminals on some operating systems */ +#define XKB_KEY_XF86Switch_VT_1 0x1008FE01 +#define XKB_KEY_XF86Switch_VT_2 0x1008FE02 +#define XKB_KEY_XF86Switch_VT_3 0x1008FE03 +#define XKB_KEY_XF86Switch_VT_4 0x1008FE04 +#define XKB_KEY_XF86Switch_VT_5 0x1008FE05 +#define XKB_KEY_XF86Switch_VT_6 0x1008FE06 +#define XKB_KEY_XF86Switch_VT_7 0x1008FE07 +#define XKB_KEY_XF86Switch_VT_8 0x1008FE08 +#define XKB_KEY_XF86Switch_VT_9 0x1008FE09 +#define XKB_KEY_XF86Switch_VT_10 0x1008FE0A +#define XKB_KEY_XF86Switch_VT_11 0x1008FE0B +#define XKB_KEY_XF86Switch_VT_12 0x1008FE0C + +#define XKB_KEY_XF86Ungrab 0x1008FE20 /* force ungrab */ +#define XKB_KEY_XF86ClearGrab 0x1008FE21 /* kill application with grab */ +#define XKB_KEY_XF86Next_VMode 0x1008FE22 /* next video mode available */ +#define XKB_KEY_XF86Prev_VMode 0x1008FE23 /* prev. video mode available */ +#define XKB_KEY_XF86LogWindowTree 0x1008FE24 /* print window tree to log */ +#define XKB_KEY_XF86LogGrabInfo 0x1008FE25 /* print all active grabs to log */ +/* + * Copyright (c) 1991, Oracle and/or its affiliates. All rights reserved. + * + * 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 1991, 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. + +***********************************************************/ + +/* + * Floating Accent + */ + +#define XKB_KEY_SunFA_Grave 0x1005FF00 +#define XKB_KEY_SunFA_Circum 0x1005FF01 +#define XKB_KEY_SunFA_Tilde 0x1005FF02 +#define XKB_KEY_SunFA_Acute 0x1005FF03 +#define XKB_KEY_SunFA_Diaeresis 0x1005FF04 +#define XKB_KEY_SunFA_Cedilla 0x1005FF05 + +/* + * Miscellaneous Functions + */ + +#define XKB_KEY_SunF36 0x1005FF10 /* Labeled F11 */ +#define XKB_KEY_SunF37 0x1005FF11 /* Labeled F12 */ + +#define XKB_KEY_SunSys_Req 0x1005FF60 +#define XKB_KEY_SunPrint_Screen 0x0000FF61 /* Same as XK_Print */ + +/* + * International & Multi-Key Character Composition + */ + +#define XKB_KEY_SunCompose 0x0000FF20 /* Same as XK_Multi_key */ +#define XKB_KEY_SunAltGraph 0x0000FF7E /* Same as XK_Mode_switch */ + +/* + * Cursor Control + */ + +#define XKB_KEY_SunPageUp 0x0000FF55 /* Same as XK_Prior */ +#define XKB_KEY_SunPageDown 0x0000FF56 /* Same as XK_Next */ + +/* + * Open Look Functions + */ + +#define XKB_KEY_SunUndo 0x0000FF65 /* Same as XK_Undo */ +#define XKB_KEY_SunAgain 0x0000FF66 /* Same as XK_Redo */ +#define XKB_KEY_SunFind 0x0000FF68 /* Same as XK_Find */ +#define XKB_KEY_SunStop 0x0000FF69 /* Same as XK_Cancel */ +#define XKB_KEY_SunProps 0x1005FF70 +#define XKB_KEY_SunFront 0x1005FF71 +#define XKB_KEY_SunCopy 0x1005FF72 +#define XKB_KEY_SunOpen 0x1005FF73 +#define XKB_KEY_SunPaste 0x1005FF74 +#define XKB_KEY_SunCut 0x1005FF75 + +#define XKB_KEY_SunPowerSwitch 0x1005FF76 +#define XKB_KEY_SunAudioLowerVolume 0x1005FF77 +#define XKB_KEY_SunAudioMute 0x1005FF78 +#define XKB_KEY_SunAudioRaiseVolume 0x1005FF79 +#define XKB_KEY_SunVideoDegauss 0x1005FF7A +#define XKB_KEY_SunVideoLowerBrightness 0x1005FF7B +#define XKB_KEY_SunVideoRaiseBrightness 0x1005FF7C +#define XKB_KEY_SunPowerSwitchShift 0x1005FF7D +/*********************************************************** + +Copyright 1988, 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 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. + +******************************************************************/ + +/* + * DEC private keysyms + * (29th bit set) + */ + +/* two-key compose sequence initiators, chosen to map to Latin1 characters */ + +#define XKB_KEY_Dring_accent 0x1000FEB0 +#define XKB_KEY_Dcircumflex_accent 0x1000FE5E +#define XKB_KEY_Dcedilla_accent 0x1000FE2C +#define XKB_KEY_Dacute_accent 0x1000FE27 +#define XKB_KEY_Dgrave_accent 0x1000FE60 +#define XKB_KEY_Dtilde 0x1000FE7E +#define XKB_KEY_Ddiaeresis 0x1000FE22 + +/* special keysym for LK2** "Remove" key on editing keypad */ + +#define XKB_KEY_DRemove 0x1000FF00 /* Remove */ +/* + +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 names of Hewlett Packard +or 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. + +HEWLETT-PACKARD MAKES NO WARRANTY OF ANY KIND WITH REGARD +TO THIS SOFWARE, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. Hewlett-Packard shall not be liable for errors +contained herein or direct, indirect, special, incidental or +consequential damages in connection with the furnishing, +performance, or use of this material. + +*/ + + + +#define XKB_KEY_hpClearLine 0x1000FF6F +#define XKB_KEY_hpInsertLine 0x1000FF70 +#define XKB_KEY_hpDeleteLine 0x1000FF71 +#define XKB_KEY_hpInsertChar 0x1000FF72 +#define XKB_KEY_hpDeleteChar 0x1000FF73 +#define XKB_KEY_hpBackTab 0x1000FF74 +#define XKB_KEY_hpKP_BackTab 0x1000FF75 +#define XKB_KEY_hpModelock1 0x1000FF48 +#define XKB_KEY_hpModelock2 0x1000FF49 +#define XKB_KEY_hpReset 0x1000FF6C +#define XKB_KEY_hpSystem 0x1000FF6D +#define XKB_KEY_hpUser 0x1000FF6E +#define XKB_KEY_hpmute_acute 0x100000A8 +#define XKB_KEY_hpmute_grave 0x100000A9 +#define XKB_KEY_hpmute_asciicircum 0x100000AA +#define XKB_KEY_hpmute_diaeresis 0x100000AB +#define XKB_KEY_hpmute_asciitilde 0x100000AC +#define XKB_KEY_hplira 0x100000AF +#define XKB_KEY_hpguilder 0x100000BE +#define XKB_KEY_hpYdiaeresis 0x100000EE +#define XKB_KEY_hpIO 0x100000EE +#define XKB_KEY_hplongminus 0x100000F6 +#define XKB_KEY_hpblock 0x100000FC + + + +#define XKB_KEY_osfCopy 0x1004FF02 +#define XKB_KEY_osfCut 0x1004FF03 +#define XKB_KEY_osfPaste 0x1004FF04 +#define XKB_KEY_osfBackTab 0x1004FF07 +#define XKB_KEY_osfBackSpace 0x1004FF08 +#define XKB_KEY_osfClear 0x1004FF0B +#define XKB_KEY_osfEscape 0x1004FF1B +#define XKB_KEY_osfAddMode 0x1004FF31 +#define XKB_KEY_osfPrimaryPaste 0x1004FF32 +#define XKB_KEY_osfQuickPaste 0x1004FF33 +#define XKB_KEY_osfPageLeft 0x1004FF40 +#define XKB_KEY_osfPageUp 0x1004FF41 +#define XKB_KEY_osfPageDown 0x1004FF42 +#define XKB_KEY_osfPageRight 0x1004FF43 +#define XKB_KEY_osfActivate 0x1004FF44 +#define XKB_KEY_osfMenuBar 0x1004FF45 +#define XKB_KEY_osfLeft 0x1004FF51 +#define XKB_KEY_osfUp 0x1004FF52 +#define XKB_KEY_osfRight 0x1004FF53 +#define XKB_KEY_osfDown 0x1004FF54 +#define XKB_KEY_osfEndLine 0x1004FF57 +#define XKB_KEY_osfBeginLine 0x1004FF58 +#define XKB_KEY_osfEndData 0x1004FF59 +#define XKB_KEY_osfBeginData 0x1004FF5A +#define XKB_KEY_osfPrevMenu 0x1004FF5B +#define XKB_KEY_osfNextMenu 0x1004FF5C +#define XKB_KEY_osfPrevField 0x1004FF5D +#define XKB_KEY_osfNextField 0x1004FF5E +#define XKB_KEY_osfSelect 0x1004FF60 +#define XKB_KEY_osfInsert 0x1004FF63 +#define XKB_KEY_osfUndo 0x1004FF65 +#define XKB_KEY_osfMenu 0x1004FF67 +#define XKB_KEY_osfCancel 0x1004FF69 +#define XKB_KEY_osfHelp 0x1004FF6A +#define XKB_KEY_osfSelectAll 0x1004FF71 +#define XKB_KEY_osfDeselectAll 0x1004FF72 +#define XKB_KEY_osfReselect 0x1004FF73 +#define XKB_KEY_osfExtend 0x1004FF74 +#define XKB_KEY_osfRestore 0x1004FF78 +#define XKB_KEY_osfDelete 0x1004FFFF + + + +/************************************************************** + * The use of the following macros is deprecated. + * They are listed below only for backwards compatibility. + */ +#define XKB_KEY_Reset 0x1000FF6C +#define XKB_KEY_System 0x1000FF6D +#define XKB_KEY_User 0x1000FF6E +#define XKB_KEY_ClearLine 0x1000FF6F +#define XKB_KEY_InsertLine 0x1000FF70 +#define XKB_KEY_DeleteLine 0x1000FF71 +#define XKB_KEY_InsertChar 0x1000FF72 +#define XKB_KEY_DeleteChar 0x1000FF73 +#define XKB_KEY_BackTab 0x1000FF74 +#define XKB_KEY_KP_BackTab 0x1000FF75 +#define XKB_KEY_Ext16bit_L 0x1000FF76 +#define XKB_KEY_Ext16bit_R 0x1000FF77 +#define XKB_KEY_mute_acute 0x100000a8 +#define XKB_KEY_mute_grave 0x100000a9 +#define XKB_KEY_mute_asciicircum 0x100000aa +#define XKB_KEY_mute_diaeresis 0x100000ab +#define XKB_KEY_mute_asciitilde 0x100000ac +#define XKB_KEY_lira 0x100000af +#define XKB_KEY_guilder 0x100000be +#define XKB_KEY_IO 0x100000ee +#define XKB_KEY_longminus 0x100000f6 +#define XKB_KEY_block 0x100000fc + diff -Nru libxkbcommon-0.1.0~1/xkbcommon/xkbcommon-names.h libxkbcommon-0.1.0~2/xkbcommon/xkbcommon-names.h --- libxkbcommon-0.1.0~1/xkbcommon/xkbcommon-names.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/xkbcommon/xkbcommon-names.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,39 @@ +/* + * 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 _XKBCOMMON_NAMES_H +#define _XKBCOMMON_NAMES_H + +#define XKB_MOD_NAME_SHIFT "Shift" +#define XKB_MOD_NAME_CAPS "Lock" +#define XKB_MOD_NAME_CTRL "Control" +#define XKB_MOD_NAME_ALT "Mod1" +#define XKB_MOD_NAME_LOGO "Mod4" + +#define XKB_LED_NAME_CAPS "Caps Lock" +#define XKB_LED_NAME_NUM "Num Lock" +#define XKB_LED_NAME_SCROLL "Scroll Lock" + +#endif diff -Nru libxkbcommon-0.1.0~1/xkbcommon/xkbcommon.h libxkbcommon-0.1.0~2/xkbcommon/xkbcommon.h --- libxkbcommon-0.1.0~1/xkbcommon/xkbcommon.h 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/xkbcommon/xkbcommon.h 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,719 @@ +/* + * Copyright 1985, 1987, 1990, 1998 The Open Group + * Copyright 2008 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 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 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. + * + * Author: Daniel Stone + */ + +#ifndef _XKBCOMMON_H_ +#define _XKBCOMMON_H_ + +#include +#include +#include + +#include +#include + +typedef uint32_t xkb_keycode_t; +typedef uint32_t xkb_keysym_t; +typedef uint32_t xkb_mod_index_t; +typedef uint32_t xkb_mod_mask_t; +typedef uint32_t xkb_group_index_t; +typedef uint32_t xkb_led_index_t; + +#define XKB_MOD_INVALID (0xffffffff) +#define XKB_GROUP_INVALID (0xffffffff) +#define XKB_KEYCODE_INVALID (0xffffffff) +#define XKB_LED_INVALID (0xffffffff) + +#define XKB_KEYCODE_MAX (0xffffffff - 1) +#define xkb_keycode_is_legal_ext(kc) (kc <= XKB_KEYCODE_MAX) +#define xkb_keycode_is_legal_x11(kc) (kc >= 8 && kc <= 255) + +/** + * Names to compile a keymap with, also known as RMLVO. These names together + * should be the primary identifier for a keymap. + */ +struct xkb_rule_names { + const char *rules; + const char *model; + const char *layout; + const char *variant; + const char *options; +}; + +/** + * Opaque context object; may only be created, accessed, manipulated and + * destroyed through the xkb_context_*() API. + */ +struct xkb_context; + +/** + * Opaque keymap object; may only be created, accessed, manipulated and + * destroyed through the xkb_state_*() API. + */ +struct xkb_keymap; + +/** + * Opaque state object; may only be created, accessed, manipulated and + * destroyed through the xkb_state_*() API. + */ +struct xkb_state; + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Returns the name for a keysym as a string; will return unknown Unicode + * codepoints as "Ua1b2", and other unknown keysyms as "0xabcd1234". + * If the buffer passed is too small, the string is truncated; a size of + * at least 32 bytes is recommended. + */ +void +xkb_keysym_get_name(xkb_keysym_t ks, char *buffer, size_t size); + +/* + * See xkb_keysym_get_name comments: this function will accept any string + * from that function. + */ +xkb_keysym_t +xkb_keysym_from_name(const char *s); + +/** + * Return the printable representation of the keystring in Unicode/UTF-8. + * The buffer passed must be at least 7 bytes long. The return value + * is the number of bytes written to the buffer. A return value of zero + * means that the keysym does not have a known printable Unicode + * representation, and a return value of -1 means that the buffer was too + * small to contain the return. + */ +int +xkb_keysym_to_utf8(xkb_keysym_t keysym, char *buffer, size_t size); + +/** + * Returns the Unicode/UTF-32 representation of the provided keysym, which is + * also compatible with UCS-4. A return value of zero means the keysym does + * not have a known printable Unicode representation. + */ +uint32_t +xkb_keysym_to_utf32(xkb_keysym_t keysym); + +/** + * @defgroup context XKB contexts + * Every keymap compilation request must have an XKB context associated with + * it. The context keeps around state such as the include path. + * + * @{ + */ + +enum xkb_context_flags { + /** Create this context with an empty include path. */ + XKB_CONTEXT_NO_DEFAULT_INCLUDES = 1, +}; + +/** + * Returns a new XKB context, or NULL on failure. If successful, the caller + * holds a reference on the context, and must free it when finished with + * xkb_context_unref(). + */ +struct xkb_context * +xkb_context_new(enum xkb_context_flags flags); + +/** + * Appends a new entry to the include path used for keymap compilation. + * Returns 1 on success, or 0 if the include path could not be added or is + * inaccessible. + */ +int +xkb_context_include_path_append(struct xkb_context *context, const char *path); + +/** + * Appends the default include paths to the context's current include path. + * Returns 1 on success, or 0 if the primary include path could not be + * added. + */ +int +xkb_context_include_path_append_default(struct xkb_context *context); + +/** + * Removes all entries from the context's include path, and inserts the + * default paths. Returns 1 on success, or 0 if the primary include path + * could not be added. + */ +int +xkb_context_include_path_reset_defaults(struct xkb_context *context); + +/** + * Removes all entries from the context's include path. + */ +void +xkb_context_include_path_clear(struct xkb_context *context); + +/** + * Returns the number of include paths currently active in the context. + */ +unsigned int +xkb_context_num_include_paths(struct xkb_context *context); + +/** + * Returns the include path at the specified index within the context. + */ +const char * +xkb_context_include_path_get(struct xkb_context *context, unsigned int index); + +/** + * Takes a new reference on an XKB context. + */ +struct xkb_context * +xkb_context_ref(struct xkb_context *context); + +/** + * Releases a reference on an XKB context, and possibly frees it. + */ +void +xkb_context_unref(struct xkb_context *context); + +/** @} */ + +/** + * @defgroup logging Logging handling + * These functions allow you to manipulate how logging from this library + * will be handled. + * + * @{ + */ + +enum xkb_log_level { + /** Log critical internal errors only */ + XKB_LOG_LEVEL_CRITICAL = 0, + /** Log all errors */ + XKB_LOG_LEVEL_ERROR = 1, + /** Log warnings and errors */ + XKB_LOG_LEVEL_WARNING = 2, + /** Log information, warnings, and errors */ + XKB_LOG_LEVEL_INFO = 3, + /** Log all the things */ + XKB_LOG_LEVEL_DEBUG = 4, +}; + +/** + * Sets the function to be called for logging messages. + * Passing NULL restores the default function, which logs to stderr. + **/ +void +xkb_set_log_fn(struct xkb_context *context, + void (*log_fn)(struct xkb_context *context, int priority, + const char *format, va_list args)); +/** + * Sets the current logging priority. The value controls which messages + * are logged. The default priority is LOG_ERR. + * + * The environment variable XKB_LOG, if set, overrides the default value + * and may be specified as a priority number or name. + */ +void +xkb_set_log_priority(struct xkb_context *context, enum xkb_log_level priority); + +/** + * Returns the current logging priority. + */ +enum xkb_log_level +xkb_get_log_priority(struct xkb_context *context); + +/** + * Sets the current logging verbosity, a value from 0 to 10. + * + * The library can generate a number of warnings which are not helpful to + * ordinary users of the library. The verbosity may be increased if more + * information is desired (e.g. when developing a keymap). Defaults to 0. + * The environment variable XKB_VERBOSITY, if set, overrdies the default + * value. + * + * Note that most verbose messages are of priority XKB_LOG_LEVEL_WARNING + * or lower. + */ +void +xkb_set_log_verbosity(struct xkb_context *ctx, int verbosity); + +/** + * Returns the current logging verbosity. + */ +int +xkb_get_log_verbosity(struct xkb_context *ctx); + +/** + * Retrieves stored data pointer from the context. This might be useful + * to access from callbacks like a custom logging function. + * + * If context is NULL, returns NULL. + **/ +void * +xkb_get_user_data(struct xkb_context *context); + +/** + * Store custom user data in the context. + */ +void +xkb_set_user_data(struct xkb_context *context, void *user_data); + +/** @} */ + +/** + * @defgroup map Keymap management + * These utility functions allow you to create and deallocate XKB keymaps. + * + * @{ + */ + +enum xkb_map_compile_flags { + /** Apparently you can't have empty enums. What a drag. */ + XKB_MAP_COMPILE_PLACEHOLDER = 0, +}; + +/** + * The primary keymap entry point: creates a new XKB keymap from a set of + * RMLVO (Rules + Model + Layout + Variant + Option) names. + * + * You should almost certainly be using this and nothing else to create + * keymaps. + */ +struct xkb_keymap * +xkb_map_new_from_names(struct xkb_context *context, + const struct xkb_rule_names *names, + enum xkb_map_compile_flags flags); + +enum xkb_keymap_format { + /** The current/classic XKB text format, as generated by xkbcomp -xkb. */ + XKB_KEYMAP_FORMAT_TEXT_V1 = 1, +}; + +/** + * Creates an XKB keymap from a full text XKB keymap passed into the + * file. + */ +struct xkb_keymap * +xkb_map_new_from_file(struct xkb_context *context, FILE *file, + enum xkb_keymap_format format, + enum xkb_map_compile_flags flags); + +/** + * Creates an XKB keymap from a full text XKB keymap serialized into one + * enormous string. + */ +struct xkb_keymap * +xkb_map_new_from_string(struct xkb_context *context, const char *string, + enum xkb_keymap_format format, + enum xkb_map_compile_flags flags); + +/** + * Returns the compiled XKB map as a string which can later be fed back into + * xkb_map_new_from_string to return the exact same keymap. + */ +char * +xkb_map_get_as_string(struct xkb_keymap *keymap); + +/** + * Takes a new reference on a keymap. + */ +struct xkb_keymap * +xkb_map_ref(struct xkb_keymap *keymap); + +/** + * Releases a reference on a keymap. + */ +void +xkb_map_unref(struct xkb_keymap *keymap); + +/** @} */ + +/** + * @defgroup components XKB state components + * Allows enumeration of state components such as modifiers and groups within + * the current keymap. + * + * @{ + */ + +/** + * Returns the number of modifiers active in the keymap. + */ +xkb_mod_index_t +xkb_map_num_mods(struct xkb_keymap *keymap); + +/** + * Returns the name of the modifier specified by 'idx', or NULL if invalid. + */ +const char * +xkb_map_mod_get_name(struct xkb_keymap *keymap, xkb_mod_index_t idx); + +/** + * Returns the index of the modifier specified by 'name', or XKB_MOD_INVALID. + */ +xkb_mod_index_t +xkb_map_mod_get_index(struct xkb_keymap *keymap, const char *name); + +/** + * Returns the number of groups active in the keymap. + */ +xkb_group_index_t +xkb_map_num_groups(struct xkb_keymap *keymap); + +/** + * Returns the name of the group specified by 'idx', or NULL if invalid. + */ +const char * +xkb_map_group_get_name(struct xkb_keymap *keymap, xkb_group_index_t idx); + +/** + * Returns the index of the group specified by 'name', or XKB_GROUP_INVALID. + */ +xkb_group_index_t +xkb_map_group_get_index(struct xkb_keymap *keymap, const char *name); + +/** + * Returns the number of groups active for the specified key. + */ +xkb_group_index_t +xkb_key_num_groups(struct xkb_keymap *keymap, xkb_keycode_t key); + +/** + * Returns 1 if the key should repeat, or 0 otherwise. + */ +int +xkb_key_repeats(struct xkb_keymap *keymap, xkb_keycode_t key); + +/** + * Returns the number of LEDs in the given map. + */ +xkb_led_index_t +xkb_map_num_leds(struct xkb_keymap *keymap); + +/** + * Returns the name of the LED specified by 'idx', or NULL if invalid. + */ +const char * +xkb_map_led_get_name(struct xkb_keymap *keymap, xkb_led_index_t idx); + +/** + * Returns the index of the LED specified by 'name', or XKB_LED_INVALID. + */ +xkb_led_index_t +xkb_map_led_get_index(struct xkb_keymap *keymap, const char *name); + +/** @} */ + +/** + * @defgroup state XKB state objects + * Creation, destruction and manipulation of keyboard state objects, + * representing modifier and group state. + * + * @{ + */ + +/** + * Returns a new XKB state object for use with the given keymap, or NULL on + * failure. + */ +struct xkb_state * +xkb_state_new(struct xkb_keymap *keymap); + +/** + * Takes a new reference on a state object. + */ +struct xkb_state * +xkb_state_ref(struct xkb_state *state); + +/** + * Unrefs and potentially deallocates a state object; the caller must not + * use the state object after calling this. + */ +void +xkb_state_unref(struct xkb_state *state); + +/** + * Get the keymap from which the state object was created. Does not take + * a new reference on the map; you must explicitly reference it yourself + * if you plan to use it beyond the lifetime of the state. + */ +struct xkb_keymap * +xkb_state_get_map(struct xkb_state *state); + +enum xkb_key_direction { + XKB_KEY_UP, + XKB_KEY_DOWN, +}; + +/** + * Updates a state object to reflect the given key being pressed or released. + */ +void +xkb_state_update_key(struct xkb_state *state, xkb_keycode_t key, + enum xkb_key_direction direction); + +/** + * Gives the symbols obtained from pressing a particular key with the given + * state. *syms_out will be set to point to an array of keysyms, with the + * return value being the number of symbols in *syms_out. If the return + * value is 0, *syms_out will be set to NULL, as there are no symbols produced + * by this event. + * + * This should be called before xkb_state_update_key. + */ +int +xkb_key_get_syms(struct xkb_state *state, xkb_keycode_t key, + const xkb_keysym_t **syms_out); + +/** + * Modifier and group types for state objects. This enum is bitmaskable, + * e.g. (XKB_STATE_DEPRESSED | XKB_STATE_LATCHED) is valid to exclude + * locked modifiers. + */ +enum xkb_state_component { + /** A key holding this modifier or group is currently physically + * depressed; also known as 'base'. */ + XKB_STATE_DEPRESSED = (1 << 0), + /** Modifier or group is latched, i.e. will be unset after the next + * non-modifier key press. */ + XKB_STATE_LATCHED = (1 << 1), + /** Modifier or group is locked, i.e. will be unset after the key + * provoking the lock has been pressed again. */ + XKB_STATE_LOCKED = (1 << 2), + /** Combinatination of depressed, latched, and locked. */ + XKB_STATE_EFFECTIVE = + (XKB_STATE_DEPRESSED | XKB_STATE_LATCHED | XKB_STATE_LOCKED), +}; + +/** + * Match flags for xkb_state_mod_indices_are_active and + * xkb_state_mod_names_are_active, specifying how the conditions for a + * successful match. XKB_STATE_MATCH_NON_EXCLUSIVE is bitmaskable with + * the other modes. + */ +enum xkb_state_match { + /** Returns true if any of the modifiers are active. */ + XKB_STATE_MATCH_ANY = (1 << 0), + /** Returns true if all of the modifiers are active. */ + XKB_STATE_MATCH_ALL = (1 << 1), + /** Makes matching non-exclusive, i.e. will not return false if a + * modifier not specified in the arguments is active. */ + XKB_STATE_MATCH_NON_EXCLUSIVE = (1 << 16), +}; + +/** + * Updates a state object from a set of explicit masks. This entrypoint is + * really only for window systems and the like, where a master process + * holds an xkb_state, then serializes it over a wire protocol, and clients + * then use the serialization to feed in to their own xkb_state. + * + * All parameters must always be passed, or the resulting state may be + * incoherent. + * + * The serialization is lossy and will not survive round trips; it must only + * be used to feed slave state objects, and must not be used to update the + * master state. + * + * Please do not use this unless you fit the description above. + */ +void +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_group_index_t base_group, + xkb_group_index_t latched_group, + xkb_group_index_t locked_group); + +/** + * The counterpart to xkb_state_update_mask, to be used on the server side + * of serialization. Returns a xkb_mod_mask_t representing the given + * component(s) of the state. + * + * This function should not be used in regular clients; please use the + * xkb_state_mod_*_is_active or xkb_state_foreach_active_mod API instead. + * + * Can return NULL on failure. + */ +xkb_mod_mask_t +xkb_state_serialize_mods(struct xkb_state *state, + enum xkb_state_component component); + +/** + * The group equivalent of xkb_state_serialize_mods: please see its + * documentation. + */ +xkb_group_index_t +xkb_state_serialize_group(struct xkb_state *state, + enum xkb_state_component component); + +/** + * Returns 1 if the modifier specified by 'name' is active in the manner + * specified by 'type', 0 if it is unset, or -1 if the modifier does not + * exist in the map. + */ +int +xkb_state_mod_name_is_active(struct xkb_state *state, const char *name, + enum xkb_state_component type); + +/** + * Returns 1 if the modifiers specified by the varargs (treated as + * NULL-terminated pointers to strings) are active in the manner + * specified by 'match', 0 otherwise, or -1 if any of the modifiers + * do not exist in the map. + */ +int +xkb_state_mod_names_are_active(struct xkb_state *state, + enum xkb_state_component type, + enum xkb_state_match match, + ...); + +/** + * Returns 1 if the modifier specified by 'idx' is active in the manner + * specified by 'type', 0 if it is unset, or -1 if the modifier does not + * exist in the current map. + */ +int +xkb_state_mod_index_is_active(struct xkb_state *state, xkb_mod_index_t idx, + enum xkb_state_component type); + +/** + * Returns 1 if the modifier specified by 'idx' is used in the + * translation of the keycode 'key' to the key symbols obtained by + * pressing it (as in xkb_key_get_syms), given the current state. + * Returns 0 otherwise. + */ +int +xkb_key_mod_index_is_consumed(struct xkb_state *state, xkb_keycode_t key, + xkb_mod_index_t idx); + +/** + * Takes the given modifier mask, and removes all modifiers which are + * marked as 'consumed' (see xkb_key_mod_index_is_consumed definition) + * for that particular key. + */ +xkb_mod_mask_t +xkb_key_mod_mask_remove_consumed(struct xkb_state *state, xkb_keycode_t key, + xkb_mod_mask_t mask); + +/** + * Returns 1 if the modifiers specified by the varargs (treated as + * xkb_mod_index_t, terminated with XKB_MOD_INVALID) are active in the manner + * specified by 'match' and 'type', 0 otherwise, or -1 if the modifier does not + * exist in the current map. + */ +int +xkb_state_mod_indices_are_active(struct xkb_state *state, + enum xkb_state_component type, + enum xkb_state_match match, + ...); + +/** + * Returns 1 if the group specified by 'name' is active in the manner + * specified by 'type', 0 if it is unset, or -1 if the group does not + * exist in the current map. + */ +int +xkb_state_group_name_is_active(struct xkb_state *state, const char *name, + enum xkb_state_component type); + +/** + * Returns 1 if the group specified by 'idx' is active in the manner + * specified by 'type', 0 if it is unset, or -1 if the group does not + * exist in the current map. + */ +int +xkb_state_group_index_is_active(struct xkb_state *state, + xkb_group_index_t idx, + enum xkb_state_component type); + +/** + * Returns 1 if the LED specified by 'name' is active, 0 if it is unset, or + * -1 if the LED does not exist in the current map. + */ +int +xkb_state_led_name_is_active(struct xkb_state *state, const char *name); + +/** + * Returns 1 if the LED specified by 'idx' is active, 0 if it is unset, or + * -1 if the LED does not exist in the current map. + */ +int +xkb_state_led_index_is_active(struct xkb_state *state, xkb_led_index_t idx); + +/** @} */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* _XKBCOMMON_H_ */ diff -Nru libxkbcommon-0.1.0~1/xkbcommon-uninstalled.pc.in libxkbcommon-0.1.0~2/xkbcommon-uninstalled.pc.in --- libxkbcommon-0.1.0~1/xkbcommon-uninstalled.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/xkbcommon-uninstalled.pc.in 2012-08-11 16:17:00.000000000 +0000 @@ -0,0 +1,8 @@ +libdir=@abs_top_builddir@/.libs +includedir=@abs_top_srcdir@ + +Name: xkbcommon +Description: XKB API common to servers and clients (uninstalled) +Version: @PACKAGE_VERSION@ +Cflags: -I${includedir} +Libs: -L${libdir} -lxkbcommon diff -Nru libxkbcommon-0.1.0~1/xkbcommon.pc.in libxkbcommon-0.1.0~2/xkbcommon.pc.in --- libxkbcommon-0.1.0~1/xkbcommon.pc.in 2011-12-16 12:52:00.000000000 +0000 +++ libxkbcommon-0.1.0~2/xkbcommon.pc.in 2012-08-11 16:17:00.000000000 +0000 @@ -6,6 +6,5 @@ Name: xkbcommon Description: XKB API common to servers and clients Version: @PACKAGE_VERSION@ -Requires: xproto kbproto >= 1.0.4 Cflags: -I${includedir} Libs: -L${libdir} -lxkbcommon