Fix the keyboard config to match Tizen 2.0 alpha
[profile/ivi/libxkbcommon.git] / src / xkbcomp / keymap.c
index 76e2bc8..f3bf821 100644 (file)
 
  ********************************************************/
 
-#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(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;
-    char *mainName;
-    LEDInfo *unbound = NULL;
-    struct xkb_desc *xkb = XkbcAllocKeyboard();
+    const char *mainName;
+    LEDInfo *unbound = NULL, *next;
+    struct xkb_keymap *keymap = XkbcAllocKeyboard(ctx);
     struct {
         XkbFile *keycodes;
         XkbFile *types;
@@ -55,42 +49,29 @@ CompileKeymap(XkbFile *file, unsigned merge)
         XkbFile *symbols;
     } sections;
 
-    if (!xkb)
+    if (!keymap)
         return NULL;
 
     memset(&sections, 0, sizeof(sections));
     mainType = file->type;
-    mainName = file->name;
+    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)
     {
-        if (file->topName != mainName) {
-            free(file->topName);
-            file->topName = strdup(mainName);
-        }
-
         if ((have & (1 << file->type)) != 0)
         {
             ERROR("More than one %s section in a %s file\n",
@@ -121,17 +102,10 @@ CompileKeymap(XkbFile *file, unsigned merge)
             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));
@@ -139,6 +113,11 @@ CompileKeymap(XkbFile *file, unsigned merge)
             continue;
         }
 
+        if (!file->topName || strcmp(file->topName, mainName) != 0) {
+            free(file->topName);
+            file->topName = strdup(mainName);
+        }
+
         have |= (1 << file->type);
     }
 
@@ -159,42 +138,48 @@ CompileKeymap(XkbFile *file, unsigned merge)
     }
 
     /* 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(keymap, true, unbound, NULL);
+    if (!ok)
+        goto err;
 
-    ok = BindIndicators(xkb, True, unbound, NULL);
+    ok = UpdateModifiersFromCompat(keymap);
     if (!ok)
         goto err;
 
-    return xkb;
+    return keymap;
 
 err:
     ACTION("Failed to compile keymap\n");
-    if (xkb)
-        xkb_free_keymap(xkb);
+    xkb_map_unref(keymap);
+    while (unbound) {
+        next = (LEDInfo *) unbound->defs.next;
+        free(unbound);
+        unbound = next;
+    }
     return NULL;
 }