}
}
-static bool
+static void
CopyIndicatorMapDefs(CompatInfo *info)
{
LEDInfo *led;
im->mods.mods = led->mods;
im->ctrls = led->ctrls;
}
+}
+
+static bool
+CopyCompatToKeymap(struct xkb_keymap *keymap, CompatInfo *info)
+{
+ keymap->compat_section_name = strdup_safe(info->name);
+
+ if (!darray_empty(info->interps)) {
+ CopyInterps(info, true, XkbSI_Exactly);
+ CopyInterps(info, true, XkbSI_AllOf | XkbSI_NoneOf);
+ CopyInterps(info, true, XkbSI_AnyOf);
+ CopyInterps(info, true, XkbSI_AnyOfOrNone);
+ CopyInterps(info, false, XkbSI_Exactly);
+ CopyInterps(info, false, XkbSI_AllOf | XkbSI_NoneOf);
+ CopyInterps(info, false, XkbSI_AnyOf);
+ CopyInterps(info, false, XkbSI_AnyOfOrNone);
+ }
+
+ CopyIndicatorMapDefs(info);
return true;
}
info.ledDflt.merge = merge;
HandleCompatMapFile(&info, file, merge);
-
if (info.errorCount != 0)
goto err_info;
- if (info.name)
- keymap->compat_section_name = strdup(info.name);
-
- if (!darray_empty(info.interps)) {
- CopyInterps(&info, true, XkbSI_Exactly);
- CopyInterps(&info, true, XkbSI_AllOf | XkbSI_NoneOf);
- CopyInterps(&info, true, XkbSI_AnyOf);
- CopyInterps(&info, true, XkbSI_AnyOfOrNone);
- CopyInterps(&info, false, XkbSI_Exactly);
- CopyInterps(&info, false, XkbSI_AllOf | XkbSI_NoneOf);
- CopyInterps(&info, false, XkbSI_AnyOf);
- CopyInterps(&info, false, XkbSI_AnyOfOrNone);
- }
-
- if (!CopyIndicatorMapDefs(&info))
- info.errorCount++;
+ if (!CopyCompatToKeymap(keymap, &info))
+ goto err_info;
ClearCompatInfo(&info);
return true;
}
}
-static int
+static void
ApplyAliases(KeyNamesInfo *info, struct xkb_keymap *keymap)
{
int i;
list_foreach_safe(alias, next, &info->aliases, entry)
free(alias);
list_init(&info->aliases);
+}
+
+static bool
+CopyKeyNamesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info)
+{
+ xkb_keycode_t kc;
+ IndicatorNameInfo *ii;
+
+ if (info->explicitMin > 0)
+ keymap->min_key_code = info->explicitMin;
+ else
+ keymap->min_key_code = info->computedMin;
+
+ if (info->explicitMax > 0)
+ keymap->max_key_code = info->explicitMax;
+ else
+ keymap->max_key_code = info->computedMax;
+
+ darray_resize0(keymap->keys, keymap->max_key_code + 1);
+ for (kc = info->computedMin; kc <= info->computedMax; kc++)
+ LongToKeyName(darray_item(info->names, kc),
+ XkbKey(keymap, kc)->name);
+
+ keymap->keycodes_section_name = strdup_safe(info->name);
+
+ list_foreach(ii, &info->leds, entry)
+ keymap->indicator_names[ii->ndx - 1] =
+ xkb_atom_text(keymap->ctx, ii->name);
+
+ ApplyAliases(info, keymap);
+
return true;
}
CompileKeycodes(XkbFile *file, struct xkb_keymap *keymap,
enum merge_mode merge)
{
- xkb_keycode_t kc;
- KeyNamesInfo info; /* contains all the info after parsing */
- IndicatorNameInfo *ii;
+ KeyNamesInfo info;
InitKeyNamesInfo(&info, keymap->ctx, file->id);
HandleKeycodesFile(&info, file, merge);
-
- /* all the keys are now stored in info */
-
if (info.errorCount != 0)
goto err_info;
- if (info.explicitMin > 0) /* if "minimum" statement was present */
- keymap->min_key_code = info.explicitMin;
- else
- keymap->min_key_code = info.computedMin;
-
- if (info.explicitMax > 0) /* if "maximum" statement was present */
- keymap->max_key_code = info.explicitMax;
- else
- keymap->max_key_code = info.computedMax;
-
- darray_resize0(keymap->keys, keymap->max_key_code + 1);
- for (kc = info.computedMin; kc <= info.computedMax; kc++)
- LongToKeyName(darray_item(info.names, kc),
- XkbKey(keymap, kc)->name);
-
- keymap->keycodes_section_name = strdup_safe(info.name);
-
- list_foreach(ii, &info.leds, entry)
- keymap->indicator_names[ii->ndx - 1] =
- xkb_atom_text(keymap->ctx, ii->name);
-
- ApplyAliases(&info, keymap);
+ if (!CopyKeyNamesToKeymap(keymap, &info))
+ goto err_info;
ClearKeyNamesInfo(&info);
return true;
}
}
-static bool
+static void
CopyDefToKeyType(KeyTypesInfo *info, KeyTypeInfo *def,
struct xkb_key_type *type)
{
type->name = def->name;
type->level_names = darray_mem(def->level_names, 0);
darray_init(def->level_names);
-
- return true;
}
-bool
-CompileKeyTypes(XkbFile *file, struct xkb_keymap *keymap,
- enum merge_mode merge)
+static bool
+CopyKeyTypesToKeymap(struct xkb_keymap *keymap, KeyTypesInfo *info)
{
unsigned int i;
unsigned int num_types;
- KeyTypesInfo info;
KeyTypeInfo *def;
- InitKeyTypesInfo(&info, keymap, file->id);
-
- HandleKeyTypesFile(&info, file, merge);
-
- if (info.errorCount != 0)
- goto err_info;
-
- if (info.name)
- keymap->types_section_name = strdup(info.name);
-
- num_types = info.num_types ? info.num_types : 1;
+ num_types = info->num_types ? info->num_types : 1;
keymap->types = calloc(num_types, sizeof(*keymap->types));
if (!keymap->types)
- goto err_info;
+ return false;
+
keymap->num_types = num_types;
/*
* If no types were specified, a default unnamed one-level type is
* used for all keys.
*/
- if (info.num_types == 0) {
+ if (info->num_types == 0) {
KeyTypeInfo dflt = {
.name = xkb_atom_intern(keymap->ctx, "default"),
.mods = 0,
.level_names = darray_new(),
};
- if (!CopyDefToKeyType(&info, &dflt, &keymap->types[0]))
- goto err_info;
+ CopyDefToKeyType(info, &dflt, &keymap->types[0]);
} else {
i = 0;
- list_foreach(def, &info.types, entry)
- if (!CopyDefToKeyType(&info, def, &keymap->types[i++]))
- goto err_info;
+ list_foreach(def, &info->types, entry)
+ CopyDefToKeyType(info, def, &keymap->types[i++]);
}
+ keymap->types_section_name = strdup_safe(info->name);
+
+ return true;
+}
+
+bool
+CompileKeyTypes(XkbFile *file, struct xkb_keymap *keymap,
+ enum merge_mode merge)
+{
+ KeyTypesInfo info;
+
+ InitKeyTypesInfo(&info, keymap, file->id);
+
+ HandleKeyTypesFile(&info, file, merge);
+ if (info.errorCount != 0)
+ goto err_info;
+
+ if (!CopyKeyTypesToKeymap(keymap, &info))
+ goto err_info;
+
FreeKeyTypesInfo(&info);
return true;