Move allocation of xkb_desc into CompileKeymap

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
master
Daniel Stone 2012-03-10 13:48:13 +00:00
parent 971eb485c5
commit c8fd3ea4b6
3 changed files with 49 additions and 31 deletions

View File

@ -31,14 +31,15 @@
#include "action.h"
#include "misc.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.)
*/
Bool
CompileKeymap(XkbFile *file, struct xkb_desc * xkb, unsigned merge)
struct xkb_desc *
CompileKeymap(XkbFile *file, unsigned merge)
{
unsigned have;
Bool ok;
@ -46,6 +47,7 @@ CompileKeymap(XkbFile *file, struct xkb_desc * xkb, unsigned merge)
unsigned mainType;
char *mainName;
LEDInfo *unbound = NULL;
struct xkb_desc *xkb = XkbcAllocKeyboard();
struct {
XkbFile *keycodes;
XkbFile *types;
@ -53,6 +55,9 @@ CompileKeymap(XkbFile *file, struct xkb_desc * xkb, unsigned merge)
XkbFile *symbols;
} sections;
if (!xkb)
return NULL;
memset(&sections, 0, sizeof(sections));
mainType = file->type;
mainName = file->name;
@ -91,13 +96,13 @@ CompileKeymap(XkbFile *file, struct xkb_desc * xkb, unsigned merge)
ERROR("More than one %s section in a %s file\n",
XkbcConfigText(file->type), XkbcConfigText(mainType));
ACTION("All sections after the first ignored\n");
return False;
continue;
}
else if ((1 << file->type) & (~legal))
{
ERROR("Cannot define %s in a %s file\n",
XkbcConfigText(file->type), XkbcConfigText(mainType));
return False;
continue;
}
switch (file->type)
@ -146,32 +151,50 @@ CompileKeymap(XkbFile *file, struct xkb_desc * xkb, unsigned merge)
{
if (missing & bit)
{
ERROR("Missing %s section in a %s file\n",
XkbcConfigText(i), XkbcConfigText(mainType));
ERROR("Required section %s missing from keymap\n", XkbcConfigText(i));
missing &= ~bit;
}
}
ACTION("Description of %s not compiled\n",
XkbcConfigText(mainType));
return False;
goto err;
}
/* compile the sections we have in the file one-by-one, or fail. */
if (sections.keycodes != NULL &&
!CompileKeycodes(sections.keycodes, xkb, MergeOverride))
return False;
{
ERROR("Failed to compile keycodes\n");
goto err;
}
if (sections.types != NULL &&
!CompileKeyTypes(sections.types, xkb, MergeOverride))
return False;
{
ERROR("Failed to compile key types\n");
goto err;
}
if (sections.compat != NULL &&
!CompileCompatMap(sections.compat, xkb, MergeOverride, &unbound))
return False;
{
ERROR("Failed to compile compat map\n");
goto err;
}
if (sections.symbols != NULL &&
!CompileSymbols(sections.symbols, xkb, MergeOverride))
return False;
{
ERROR("Failed to compile symbols\n");
goto err;
}
xkb->defined = have;
ok = BindIndicators(xkb, True, unbound, NULL);
return ok;
if (!ok)
goto err;
return xkb;
err:
ACTION("Failed to compile keymap\n");
if (xkb)
xkb_free_keymap(xkb);
return NULL;
}

View File

@ -189,8 +189,9 @@ compile_keymap(XkbFile *file, const char *mapName)
struct xkb_desc * xkb = NULL;
/* Find map to use */
if (!(mapToUse = XkbChooseMap(file, mapName)))
goto unwind_file;
mapToUse = XkbChooseMap(file, mapName);
if (!mapToUse)
goto err;
switch (mapToUse->type) {
case XkmSemanticsFile:
@ -199,26 +200,20 @@ compile_keymap(XkbFile *file, const char *mapName)
break;
default:
ERROR("file type %d not handled\n", mapToUse->type);
goto unwind_file;
goto err;
}
/* Compile the keyboard */
if (!(xkb = XkbcAllocKeyboard())) {
ERROR("could not allocate keyboard description\n");
goto unwind_file;
}
xkb = CompileKeymap(mapToUse, MergeReplace);
if (!xkb)
goto err;
if (!CompileKeymap(mapToUse, xkb, MergeReplace)) {
ERROR("failed to compile keymap\n");
XkbcFreeKeyboard(xkb);
xkb = NULL;
}
return xkb;
unwind_file:
err:
FreeXKBFile(file);
free(scanFile);
XkbFreeIncludePath();
return xkb;
return NULL;
}
struct xkb_desc *

View File

@ -267,8 +267,8 @@ typedef struct _XkbFile
Bool compiled;
} XkbFile;
extern Bool
CompileKeymap(XkbFile *file, struct xkb_desc * xkb, unsigned merge);
extern struct xkb_desc *
CompileKeymap(XkbFile *file, unsigned merge);
extern Bool
CompileKeycodes(XkbFile *file, struct xkb_desc * xkb, unsigned merge);