********************************************************/
-#include "xkbcomp.h"
-#include "xkbmisc.h"
-#include "expr.h"
-#include "vmod.h"
-#include "action.h"
-#include "misc.h"
+#include "xkbcomp-priv.h"
#include "indicators.h"
-#include "xkballoc.h"
/**
* Compile the given file and store the output in xkb.
* @param file A list of XkbFiles, each denoting one type (e.g.
* XkmKeyNamesIdx, etc.)
*/
-struct xkb_desc *
-CompileKeymap(struct xkb_context *context, XkbFile *file, unsigned merge)
+struct xkb_keymap *
+CompileKeymap(struct xkb_context *ctx, XkbFile *file)
{
unsigned have;
- Bool ok;
+ bool ok;
unsigned required, legal;
unsigned mainType;
const char *mainName;
- LEDInfo *unbound = NULL;
- struct xkb_desc *xkb = XkbcAllocKeyboard(context);
+ LEDInfo *unbound = NULL, *next;
+ struct xkb_keymap *keymap = XkbcAllocKeyboard(ctx);
struct {
XkbFile *keycodes;
XkbFile *types;
XkbFile *symbols;
} sections;
- if (!xkb)
+ if (!keymap)
return NULL;
memset(§ions, 0, sizeof(sections));
mainName = file->name ? file->name : "(unnamed)";
switch (mainType)
{
- case XkmSemanticsFile:
- required = XkmSemanticsRequired;
- legal = XkmSemanticsLegal;
- break;
- case XkmLayoutFile: /* standard type if setxkbmap -print */
- required = XkmLayoutRequired;
- legal = XkmKeymapLegal;
- break;
case XkmKeymapFile:
- required = XkmKeyNamesIndex | XkmTypesIndex | XkmSymbolsIndex | \
- XkmCompatMapIndex | XkmVirtualModsIndex;
+ required = XkmKeyNamesIndex | XkmTypesIndex | XkmSymbolsIndex |
+ XkmCompatMapIndex;
legal = XkmKeymapLegal;
break;
default:
ERROR("Cannot compile %s alone into an XKM file\n",
XkbcConfigText(mainType));
- return False;
+ return false;
}
have = 0;
- ok = 1;
+
/* Check for duplicate entries in the input file */
for (file = (XkbFile *) file->defs; file; file = (XkbFile *) file->common.next)
{
break;
case XkmGeometryIndex:
continue;
- case XkmVirtualModsIndex:
- case XkmIndicatorsIndex:
- WSGO("Found an isolated %s section\n", XkbcConfigText(file->type));
- ACTION("Ignored\n");
- continue;
default:
WSGO("Unknown file type %d\n", file->type);
ACTION("Ignored\n");
continue;
- case XkmSemanticsFile:
- case XkmLayoutFile:
case XkmKeymapFile:
WSGO("Illegal %s configuration in a %s file\n",
XkbcConfigText(file->type), XkbcConfigText(mainType));
}
/* compile the sections we have in the file one-by-one, or fail. */
- if (sections.keycodes != NULL &&
- !CompileKeycodes(sections.keycodes, xkb, MergeOverride))
+ if (sections.keycodes == NULL ||
+ !CompileKeycodes(sections.keycodes, keymap, MergeOverride))
{
ERROR("Failed to compile keycodes\n");
goto err;
}
- if (sections.types != NULL &&
- !CompileKeyTypes(sections.types, xkb, MergeOverride))
+ if (sections.types == NULL ||
+ !CompileKeyTypes(sections.types, keymap, MergeOverride))
{
ERROR("Failed to compile key types\n");
goto err;
}
- if (sections.compat != NULL &&
- !CompileCompatMap(sections.compat, xkb, MergeOverride, &unbound))
+ if (sections.compat == NULL ||
+ !CompileCompatMap(sections.compat, keymap, MergeOverride, &unbound))
{
ERROR("Failed to compile compat map\n");
goto err;
}
- if (sections.symbols != NULL &&
- !CompileSymbols(sections.symbols, xkb, MergeOverride))
+ if (sections.symbols == NULL ||
+ !CompileSymbols(sections.symbols, keymap, MergeOverride))
{
ERROR("Failed to compile symbols\n");
goto err;
}
- xkb->defined = have;
-
- ok = BindIndicators(xkb, True, unbound, NULL);
+ ok = BindIndicators(keymap, true, unbound, NULL);
if (!ok)
goto err;
- ok = UpdateModifiersFromCompat(xkb);
+ ok = UpdateModifiersFromCompat(keymap);
if (!ok)
goto err;
- return xkb;
+ return keymap;
err:
ACTION("Failed to compile keymap\n");
- if (xkb)
- xkb_map_unref(xkb);
+ xkb_map_unref(keymap);
+ while (unbound) {
+ next = (LEDInfo *) unbound->defs.next;
+ free(unbound);
+ unbound = next;
+ }
return NULL;
}