- missing = XkbAllRequiredTypes & (~info.stdPresent);
- keypadVMod = FindKeypadVMod(xkb);
- if (XkbcInitCanonicalKeyTypes(xkb, missing, keypadVMod) != Success)
- {
- FreeKeyTypesInfo(&info);
- WSGO("Couldn't initialize canonical key types\n");
- return false;
- }
- if (missing & XkbOneLevelMask)
- xkb->map->types[XkbOneLevelIndex].name =
- XkbcAtomGetString(tok_ONE_LEVEL);
- if (missing & XkbTwoLevelMask)
- xkb->map->types[XkbTwoLevelIndex].name =
- XkbcAtomGetString(tok_TWO_LEVEL);
- if (missing & XkbAlphabeticMask)
- xkb->map->types[XkbAlphabeticIndex].name =
- XkbcAtomGetString(tok_ALPHABETIC);
- if (missing & XkbKeypadMask)
- xkb->map->types[XkbKeypadIndex].name =
- XkbcAtomGetString(tok_KEYPAD);
- }
- next = &xkb->map->types[XkbLastRequiredType + 1];
- for (i = 0, def = info.types; i < info.nTypes; i++)
- {
- if (def->name == tok_ONE_LEVEL)
- type = &xkb->map->types[XkbOneLevelIndex];
- else if (def->name == tok_TWO_LEVEL)
- type = &xkb->map->types[XkbTwoLevelIndex];
- else if (def->name == tok_ALPHABETIC)
- type = &xkb->map->types[XkbAlphabeticIndex];
- else if (def->name == tok_KEYPAD)
- type = &xkb->map->types[XkbKeypadIndex];
- else
- type = next++;
- DeleteLevel1MapEntries(def);
- if (!CopyDefToKeyType(xkb, type, def)) {
- FreeKeyTypesInfo(&info);
- return false;
- }
- def = (KeyTypeInfo *) def->defs.next;
+ xkb->map->num_types = i;
+
+ if (XkbAllRequiredTypes & (~info.stdPresent)) {
+ unsigned missing, keypadVMod;
+
+ missing = XkbAllRequiredTypes & (~info.stdPresent);
+ keypadVMod = FindKeypadVMod(xkb);
+
+ if (XkbcInitCanonicalKeyTypes(xkb, missing, keypadVMod) != Success) {
+ WSGO("Couldn't initialize canonical key types\n");
+ goto err_info;