2009-03-27 07:55:32 -06:00
|
|
|
/************************************************************
|
|
|
|
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
|
2009-04-04 10:19:51 -06:00
|
|
|
documentation, and that the name of Silicon Graphics not be
|
|
|
|
used in advertising or publicity pertaining to distribution
|
2009-03-27 07:55:32 -06:00
|
|
|
of the software without specific prior written permission.
|
2009-04-04 10:19:51 -06:00
|
|
|
Silicon Graphics makes no representation about the suitability
|
2009-03-27 07:55:32 -06:00
|
|
|
of this software for any purpose. It is provided "as is"
|
|
|
|
without any express or implied warranty.
|
2009-04-04 10:19:51 -06:00
|
|
|
|
|
|
|
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
|
|
|
|
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
2009-03-27 07:55:32 -06:00
|
|
|
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
|
2009-04-04 10:19:51 -06:00
|
|
|
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
|
2009-03-27 07:55:32 -06:00
|
|
|
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
|
|
|
|
THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
|
|
|
********************************************************/
|
|
|
|
|
2012-05-08 04:57:07 -06:00
|
|
|
#include "xkbcomp-priv.h"
|
2009-03-27 07:55:32 -06:00
|
|
|
#include "indicators.h"
|
|
|
|
|
|
|
|
/**
|
2009-03-27 20:54:50 -06:00
|
|
|
* Compile the given file and store the output in xkb.
|
2009-03-27 07:55:32 -06:00
|
|
|
* @param file A list of XkbFiles, each denoting one type (e.g.
|
2012-06-29 08:05:33 -06:00
|
|
|
* FILE_TYPE_KEYCODES, etc.)
|
2009-03-27 07:55:32 -06:00
|
|
|
*/
|
2012-04-03 08:14:16 -06:00
|
|
|
struct xkb_keymap *
|
2012-05-11 08:03:43 -06:00
|
|
|
CompileKeymap(struct xkb_context *ctx, XkbFile *file)
|
2009-03-27 07:55:32 -06:00
|
|
|
{
|
2012-06-29 07:04:55 -06:00
|
|
|
unsigned have = 0;
|
2012-04-05 18:38:55 -06:00
|
|
|
bool ok;
|
2012-06-29 08:05:33 -06:00
|
|
|
enum xkb_file_type mainType;
|
2012-03-20 11:24:09 -06:00
|
|
|
const char *mainName;
|
2012-03-29 10:39:11 -06:00
|
|
|
LEDInfo *unbound = NULL, *next;
|
2012-05-09 06:03:11 -06:00
|
|
|
struct xkb_keymap *keymap = XkbcAllocKeyboard(ctx);
|
2012-03-09 09:31:48 -07:00
|
|
|
struct {
|
|
|
|
XkbFile *keycodes;
|
|
|
|
XkbFile *types;
|
|
|
|
XkbFile *compat;
|
|
|
|
XkbFile *symbols;
|
2012-06-29 07:04:55 -06:00
|
|
|
} sections = { NULL };
|
2009-03-27 07:55:32 -06:00
|
|
|
|
2012-05-09 08:15:30 -06:00
|
|
|
if (!keymap)
|
2012-03-10 06:48:13 -07:00
|
|
|
return NULL;
|
|
|
|
|
2009-03-27 07:55:32 -06:00
|
|
|
mainType = file->type;
|
2012-03-10 06:54:03 -07:00
|
|
|
mainName = file->name ? file->name : "(unnamed)";
|
2012-06-29 07:04:55 -06:00
|
|
|
|
|
|
|
/*
|
2012-06-29 08:05:33 -06:00
|
|
|
* Other aggregate file types are converted to FILE_TYPE_KEYMAP
|
2012-06-29 07:04:55 -06:00
|
|
|
* in the parser.
|
|
|
|
*/
|
2012-06-29 08:05:33 -06:00
|
|
|
if (mainType != FILE_TYPE_KEYMAP) {
|
2012-06-29 07:04:55 -06:00
|
|
|
ERROR("Cannot compile a %s file alone into a keymap\n",
|
2012-06-29 08:05:33 -06:00
|
|
|
XkbcFileTypeText(mainType));
|
|
|
|
goto err;
|
2009-03-27 07:55:32 -06:00
|
|
|
}
|
2012-05-13 09:45:43 -06:00
|
|
|
|
2009-03-27 07:55:32 -06:00
|
|
|
/* Check for duplicate entries in the input file */
|
2012-03-09 09:55:37 -07:00
|
|
|
for (file = (XkbFile *) file->defs; file; file = (XkbFile *) file->common.next)
|
2009-03-27 07:55:32 -06:00
|
|
|
{
|
2012-06-29 08:05:33 -06:00
|
|
|
if (have & file->type) {
|
2009-03-31 08:21:20 -06:00
|
|
|
ERROR("More than one %s section in a %s file\n",
|
2012-06-29 08:05:33 -06:00
|
|
|
XkbcFileTypeText(file->type), XkbcFileTypeText(mainType));
|
2009-03-27 07:55:32 -06:00
|
|
|
ACTION("All sections after the first ignored\n");
|
2012-03-10 06:48:13 -07:00
|
|
|
continue;
|
2009-03-27 07:55:32 -06:00
|
|
|
}
|
2012-06-29 08:05:33 -06:00
|
|
|
else if (!(file->type & LEGAL_FILE_TYPES)) {
|
2009-03-31 08:21:20 -06:00
|
|
|
ERROR("Cannot define %s in a %s file\n",
|
2012-06-29 08:05:33 -06:00
|
|
|
XkbcFileTypeText(file->type), XkbcFileTypeText(mainType));
|
2012-03-10 06:48:13 -07:00
|
|
|
continue;
|
2009-03-27 07:55:32 -06:00
|
|
|
}
|
2012-03-09 09:55:37 -07:00
|
|
|
|
2012-06-29 08:05:33 -06:00
|
|
|
switch (file->type) {
|
|
|
|
case FILE_TYPE_KEYCODES:
|
2012-03-09 09:55:37 -07:00
|
|
|
sections.keycodes = file;
|
|
|
|
break;
|
2012-06-29 08:05:33 -06:00
|
|
|
case FILE_TYPE_TYPES:
|
2012-03-09 09:55:37 -07:00
|
|
|
sections.types = file;
|
|
|
|
break;
|
2012-06-29 08:05:33 -06:00
|
|
|
case FILE_TYPE_SYMBOLS:
|
2012-03-09 09:55:37 -07:00
|
|
|
sections.symbols = file;
|
|
|
|
break;
|
2012-06-29 08:05:33 -06:00
|
|
|
case FILE_TYPE_COMPAT:
|
2012-03-09 09:55:37 -07:00
|
|
|
sections.compat = file;
|
|
|
|
break;
|
2012-06-29 08:05:33 -06:00
|
|
|
case FILE_TYPE_GEOMETRY:
|
2012-03-09 09:55:37 -07:00
|
|
|
continue;
|
|
|
|
default:
|
|
|
|
WSGO("Unknown file type %d\n", file->type);
|
|
|
|
ACTION("Ignored\n");
|
|
|
|
continue;
|
2012-06-29 08:05:33 -06:00
|
|
|
case FILE_TYPE_KEYMAP:
|
2012-03-09 09:55:37 -07:00
|
|
|
WSGO("Illegal %s configuration in a %s file\n",
|
2012-06-29 08:05:33 -06:00
|
|
|
XkbcFileTypeText(file->type), XkbcFileTypeText(mainType));
|
2012-03-09 09:55:37 -07:00
|
|
|
ACTION("Ignored\n");
|
|
|
|
continue;
|
2012-03-09 09:32:45 -07:00
|
|
|
}
|
2012-03-09 09:55:37 -07:00
|
|
|
|
2012-03-10 06:54:03 -07:00
|
|
|
if (!file->topName || strcmp(file->topName, mainName) != 0) {
|
|
|
|
free(file->topName);
|
|
|
|
file->topName = strdup(mainName);
|
|
|
|
}
|
|
|
|
|
2012-06-29 08:05:33 -06:00
|
|
|
have |= file->type;
|
2009-03-27 07:55:32 -06:00
|
|
|
}
|
2012-03-09 09:55:37 -07:00
|
|
|
|
2012-06-29 08:05:33 -06:00
|
|
|
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));
|
2009-03-27 07:55:32 -06:00
|
|
|
missing &= ~bit;
|
|
|
|
}
|
|
|
|
}
|
2012-06-29 08:05:33 -06:00
|
|
|
|
2012-03-10 06:48:13 -07:00
|
|
|
goto err;
|
2009-03-27 07:55:32 -06:00
|
|
|
}
|
2012-03-09 09:55:37 -07:00
|
|
|
|
2012-03-09 11:46:46 -07:00
|
|
|
/* compile the sections we have in the file one-by-one, or fail. */
|
2012-03-29 10:39:11 -06:00
|
|
|
if (sections.keycodes == NULL ||
|
2012-05-09 08:15:30 -06:00
|
|
|
!CompileKeycodes(sections.keycodes, keymap, MergeOverride))
|
2012-03-10 06:48:13 -07:00
|
|
|
{
|
|
|
|
ERROR("Failed to compile keycodes\n");
|
|
|
|
goto err;
|
|
|
|
}
|
2012-03-29 10:39:11 -06:00
|
|
|
if (sections.types == NULL ||
|
2012-05-09 08:15:30 -06:00
|
|
|
!CompileKeyTypes(sections.types, keymap, MergeOverride))
|
2012-03-10 06:48:13 -07:00
|
|
|
{
|
|
|
|
ERROR("Failed to compile key types\n");
|
|
|
|
goto err;
|
|
|
|
}
|
2012-03-29 10:39:11 -06:00
|
|
|
if (sections.compat == NULL ||
|
2012-05-09 08:15:30 -06:00
|
|
|
!CompileCompatMap(sections.compat, keymap, MergeOverride, &unbound))
|
2012-03-10 06:48:13 -07:00
|
|
|
{
|
|
|
|
ERROR("Failed to compile compat map\n");
|
|
|
|
goto err;
|
|
|
|
}
|
2012-03-29 10:39:11 -06:00
|
|
|
if (sections.symbols == NULL ||
|
2012-05-09 08:15:30 -06:00
|
|
|
!CompileSymbols(sections.symbols, keymap, MergeOverride))
|
2012-03-10 06:48:13 -07:00
|
|
|
{
|
|
|
|
ERROR("Failed to compile symbols\n");
|
|
|
|
goto err;
|
|
|
|
}
|
2012-03-09 11:46:46 -07:00
|
|
|
|
2012-05-09 08:15:30 -06:00
|
|
|
ok = BindIndicators(keymap, true, unbound, NULL);
|
2012-03-10 06:48:13 -07:00
|
|
|
if (!ok)
|
|
|
|
goto err;
|
|
|
|
|
2012-05-09 08:15:30 -06:00
|
|
|
ok = UpdateModifiersFromCompat(keymap);
|
2012-03-14 12:24:37 -06:00
|
|
|
if (!ok)
|
|
|
|
goto err;
|
|
|
|
|
2012-05-09 08:15:30 -06:00
|
|
|
return keymap;
|
2012-03-10 06:48:13 -07:00
|
|
|
|
|
|
|
err:
|
|
|
|
ACTION("Failed to compile keymap\n");
|
2012-05-09 08:15:30 -06:00
|
|
|
xkb_map_unref(keymap);
|
2012-03-29 10:39:11 -06:00
|
|
|
while (unbound) {
|
|
|
|
next = (LEDInfo *) unbound->defs.next;
|
|
|
|
free(unbound);
|
|
|
|
unbound = next;
|
|
|
|
}
|
2012-03-10 06:48:13 -07:00
|
|
|
return NULL;
|
2009-03-27 07:55:32 -06:00
|
|
|
}
|