diff --git a/Makefile.am b/Makefile.am index 23b4921..d0af6e5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -51,7 +51,6 @@ libxkbcommon_la_SOURCES = \ src/xkbcomp/indicators.h \ src/xkbcomp/keycodes.c \ src/xkbcomp/keycodes.h \ - src/xkbcomp/keymap.c \ src/xkbcomp/keytypes.c \ src/xkbcomp/misc.c \ src/xkbcomp/parser.y \ diff --git a/src/xkbcomp/keymap.c b/src/xkbcomp/keymap.c deleted file mode 100644 index 2904310..0000000 --- a/src/xkbcomp/keymap.c +++ /dev/null @@ -1,163 +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-priv.h" -#include "indicators.h" - -/** - * Compile the given file and store the output in xkb. - * @param file A list of XkbFiles, each denoting one type (e.g. - * FILE_TYPE_KEYCODES, etc.) - */ -struct xkb_keymap * -CompileKeymap(struct xkb_context *ctx, XkbFile *file) -{ - unsigned have = 0; - bool ok; - enum xkb_file_type mainType; - const char *mainName; - struct xkb_keymap *keymap = XkbcAllocKeyboard(ctx); - struct { - XkbFile *keycodes; - XkbFile *types; - XkbFile *compat; - XkbFile *symbols; - } sections = { NULL }; - - if (!keymap) - return NULL; - - mainType = file->type; - mainName = file->name ? file->name : "(unnamed)"; - - /* - * Other aggregate file types are converted to FILE_TYPE_KEYMAP - * in the parser. - */ - if (mainType != FILE_TYPE_KEYMAP) { - ERROR("Cannot compile a %s file alone into a keymap\n", - XkbcFileTypeText(mainType)); - goto err; - } - - /* Check for duplicate entries in the input file */ - for (file = (XkbFile *) file->defs; file; file = (XkbFile *) file->common.next) - { - if (have & file->type) { - ERROR("More than one %s section in a %s file\n", - XkbcFileTypeText(file->type), XkbcFileTypeText(mainType)); - ACTION("All sections after the first ignored\n"); - continue; - } - else if (!(file->type & LEGAL_FILE_TYPES)) { - ERROR("Cannot define %s in a %s file\n", - XkbcFileTypeText(file->type), XkbcFileTypeText(mainType)); - continue; - } - - switch (file->type) { - case FILE_TYPE_KEYCODES: - sections.keycodes = file; - break; - case FILE_TYPE_TYPES: - sections.types = file; - break; - case FILE_TYPE_SYMBOLS: - sections.symbols = file; - break; - case FILE_TYPE_COMPAT: - sections.compat = file; - break; - case FILE_TYPE_GEOMETRY: - continue; - default: - WSGO("Unknown file type %d\n", file->type); - ACTION("Ignored\n"); - continue; - } - - if (!file->topName || strcmp(file->topName, mainName) != 0) { - free(file->topName); - file->topName = strdup(mainName); - } - - have |= file->type; - } - - if (REQUIRED_FILE_TYPES & (~have)) { - enum xkb_file_type bit; - enum xkb_file_type missing; - - missing = REQUIRED_FILE_TYPES & (~have); - - for (bit = 1; missing != 0; bit <<= 1) { - if (missing & bit) { - ERROR("Required section %s missing from keymap\n", - XkbcFileTypeText(bit)); - missing &= ~bit; - } - } - - goto err; - } - - /* compile the sections we have in the file one-by-one, or fail. */ - if (sections.keycodes == NULL || - !CompileKeycodes(sections.keycodes, keymap, MERGE_OVERRIDE)) - { - ERROR("Failed to compile keycodes\n"); - goto err; - } - if (sections.types == NULL || - !CompileKeyTypes(sections.types, keymap, MERGE_OVERRIDE)) - { - ERROR("Failed to compile key types\n"); - goto err; - } - if (sections.compat == NULL || - !CompileCompatMap(sections.compat, keymap, MERGE_OVERRIDE)) - { - ERROR("Failed to compile compat map\n"); - goto err; - } - if (sections.symbols == NULL || - !CompileSymbols(sections.symbols, keymap, MERGE_OVERRIDE)) - { - ERROR("Failed to compile symbols\n"); - goto err; - } - - ok = UpdateModifiersFromCompat(keymap); - if (!ok) - goto err; - - return keymap; - -err: - ACTION("Failed to compile keymap\n"); - xkb_map_unref(keymap); - return NULL; -} diff --git a/src/xkbcomp/xkbcomp.c b/src/xkbcomp/xkbcomp.c index 49f7d4c..48e02bc 100644 --- a/src/xkbcomp/xkbcomp.c +++ b/src/xkbcomp/xkbcomp.c @@ -63,15 +63,137 @@ keymap_file_from_components(struct xkb_context *ctx, &keycodes->common, 0); } +/** + * 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) { - struct xkb_keymap *keymap; + unsigned have = 0; + bool ok; + enum xkb_file_type main_type; + const char *main_name; + struct xkb_keymap *keymap = XkbcAllocKeyboard(ctx); + struct { + XkbFile *keycodes; + XkbFile *types; + XkbFile *compat; + XkbFile *symbols; + } sections = { NULL }; - keymap = CompileKeymap(ctx, file); + if (!keymap) + return NULL; + + main_type = file->type; + main_name = file->name ? file->name : "(unnamed)"; + + /* + * Other aggregate file types are converted to FILE_TYPE_KEYMAP + * in the parser. + */ + if (main_type != FILE_TYPE_KEYMAP) { + ERROR("Cannot compile a %s file alone into a keymap\n", + XkbcFileTypeText(main_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->type) { + ERROR("More than one %s section in a %s file\n", + XkbcFileTypeText(file->type), XkbcFileTypeText(main_type)); + ACTION("All sections after the first ignored\n"); + continue; + } + else if (!(file->type & LEGAL_FILE_TYPES)) { + ERROR("Cannot define %s in a %s file\n", + XkbcFileTypeText(file->type), XkbcFileTypeText(main_type)); + continue; + } + + switch (file->type) { + case FILE_TYPE_KEYCODES: + sections.keycodes = file; + break; + case FILE_TYPE_TYPES: + sections.types = file; + break; + case FILE_TYPE_SYMBOLS: + sections.symbols = file; + break; + case FILE_TYPE_COMPAT: + sections.compat = file; + break; + default: + continue; + } + + if (!file->topName || strcmp(file->topName, main_name) != 0) { + free(file->topName); + file->topName = strdup(main_name); + } + + have |= file->type; + } + + if (REQUIRED_FILE_TYPES & (~have)) { + enum xkb_file_type bit; + enum xkb_file_type missing; + + missing = REQUIRED_FILE_TYPES & (~have); + + for (bit = 1; missing != 0; bit <<= 1) { + if (missing & bit) { + ERROR("Required section %s missing from keymap\n", + XkbcFileTypeText(bit)); + missing &= ~bit; + } + } + + goto err; + } + + /* compile the sections we have in the file one-by-one, or fail. */ + if (sections.keycodes == NULL || + !CompileKeycodes(sections.keycodes, keymap, MERGE_OVERRIDE)) + { + ERROR("Failed to compile keycodes\n"); + goto err; + } + if (sections.types == NULL || + !CompileKeyTypes(sections.types, keymap, MERGE_OVERRIDE)) + { + ERROR("Failed to compile key types\n"); + goto err; + } + if (sections.compat == NULL || + !CompileCompatMap(sections.compat, keymap, MERGE_OVERRIDE)) + { + ERROR("Failed to compile compat map\n"); + goto err; + } + if (sections.symbols == NULL || + !CompileSymbols(sections.symbols, keymap, MERGE_OVERRIDE)) + { + ERROR("Failed to compile symbols\n"); + goto err; + } + + ok = UpdateModifiersFromCompat(keymap); + if (!ok) + goto err; FreeXKBFile(file); return keymap; + +err: + ACTION("Failed to compile keymap\n"); + xkb_map_unref(keymap); + FreeXKBFile(file); + return NULL; } struct xkb_keymap * diff --git a/src/xkbcomp/xkbcomp.h b/src/xkbcomp/xkbcomp.h index 8cd3fe5..eaf2d81 100644 --- a/src/xkbcomp/xkbcomp.h +++ b/src/xkbcomp/xkbcomp.h @@ -246,9 +246,6 @@ typedef struct _XkbFile unsigned flags; } XkbFile; -extern struct xkb_keymap * -CompileKeymap(struct xkb_context *ctx, XkbFile *file); - extern bool CompileKeycodes(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge);