From 3fc0dcc8167b2a306ba9a5146dade7b7b2387f63 Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Sun, 29 Mar 2009 08:55:18 -0700 Subject: [PATCH] Generate keyboard description from components Finally, we can generate a XkbcDescPtr from a XkbComponentNamesPtr. This involves turning the components into a parsed XKB file and then passing it into the compiler. This first conversion needs more error handling. --- include/X11/extensions/XKBcommon.h | 3 ++ src/xkbcomp/Makefile.am | 1 + src/xkbcomp/xkbcomp.c | 105 +++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 src/xkbcomp/xkbcomp.c diff --git a/include/X11/extensions/XKBcommon.h b/include/X11/extensions/XKBcommon.h index 28ea338..f751be6 100644 --- a/include/X11/extensions/XKBcommon.h +++ b/include/X11/extensions/XKBcommon.h @@ -64,6 +64,9 @@ typedef struct _XkbcDesc { _XFUNCPROTOBEGIN +extern XkbcDescPtr +XkbcCompileKeymap(XkbComponentNamesPtr ktcsg); + extern char * XkbcKeysymToString(KeySym ks); diff --git a/src/xkbcomp/Makefile.am b/src/xkbcomp/Makefile.am index 534cc09..b934a88 100644 --- a/src/xkbcomp/Makefile.am +++ b/src/xkbcomp/Makefile.am @@ -32,6 +32,7 @@ libxkbcomp_la_SOURCES = \ utils.h \ vmod.c \ vmod.h \ + xkbcomp.c \ xkbcomp.h \ xkbparse.y \ xkbpath.c \ diff --git a/src/xkbcomp/xkbcomp.c b/src/xkbcomp/xkbcomp.c new file mode 100644 index 0000000..e8c2fb8 --- /dev/null +++ b/src/xkbcomp/xkbcomp.c @@ -0,0 +1,105 @@ +/* +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 "X11/extensions/XKBcommon.h" +#include +#include "xkbcomp.h" +#include "parseutils.h" +#include "utils.h" + +static int +XkbFileFromComponents(const XkbComponentNamesPtr ktcsg, XkbFile **file) +{ + XkbFile *keycodes, *types, *compat, *symbols, *geometry; + IncludeStmt *inc; + + inc = IncludeCreate(ktcsg->keycodes, MergeDefault); + keycodes = CreateXKBFile(XkmKeyNamesIndex, NULL, (ParseCommon *)inc, 0); + + inc = IncludeCreate(ktcsg->types, MergeDefault); + types = CreateXKBFile(XkmTypesIndex, NULL, (ParseCommon *)inc, 0); + AppendStmt(&keycodes->common, &types->common); + + inc = IncludeCreate(ktcsg->compat, MergeDefault); + compat = CreateXKBFile(XkmCompatMapIndex, NULL, (ParseCommon *)inc, 0); + AppendStmt(&keycodes->common, &compat->common); + + inc = IncludeCreate(ktcsg->symbols, MergeDefault); + symbols = CreateXKBFile(XkmSymbolsIndex, 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); + + *file = CreateXKBFile(XkmKeymapFile, ktcsg->keymap, &keycodes->common, 0); + + return 1; +} + +XkbcDescPtr +XkbcCompileKeymap(XkbComponentNamesPtr ktcsg) +{ + XkbFile *file, *mapToUse; + XkbcDescPtr xkb; + + if (!XkbFileFromComponents(ktcsg, &file)) { + ERROR("failed to generate parsed XKB file from components"); + goto fail; + } + + /* Find map to use */ + mapToUse = file; + if (file->common.next) { + for (; mapToUse; mapToUse = (XkbFile *)mapToUse->common.next) { + if (mapToUse->flags & XkbLC_Default) + break; + } + if (!mapToUse) { + mapToUse = file; + WARN("no map specified, but components have several"); + } + } + + /* Compile the keyboard */ + if (!(xkb = XkbcAllocKeyboard())) { + ERROR("Could not allocate keyboard description"); + goto unwind_file; + } + + if (!CompileKeymap(mapToUse, xkb, MergeReplace)) { + ERROR("Failed to compile keymap"); + goto unwind_xkb; + } + + return xkb; +unwind_xkb: + XkbcFreeKeyboard(xkb, XkbAllComponentsMask, True); +unwind_file: + /* XXX: here's where we would free the XkbFile */ +fail: + return NULL; +} -- 2.7.4