+static const struct xkb_key_type *
+FindTypeForGroup(struct xkb_keymap *keymap, KeyInfo *keyi,
+ xkb_layout_index_t group, bool *explicit_type)
+{
+ bool autoType = false;
+ unsigned int i;
+ GroupInfo *groupi = &darray_item(keyi->groups, group);
+ xkb_atom_t type_name = groupi->type;
+
+ if (type_name == XKB_ATOM_NONE) {
+ if (keyi->dfltType != XKB_ATOM_NONE)
+ type_name = keyi->dfltType;
+ else
+ FindAutomaticType(keymap->ctx, groupi, &type_name, &autoType);
+ }
+
+ if (type_name == XKB_ATOM_NONE) {
+ log_warn(keymap->ctx,
+ "Couldn't find an automatic type for key '%s' group %d with %d levels; "
+ "Using the default type\n",
+ LongKeyNameText(keyi->name), group + 1,
+ darray_size(groupi->levels));
+ goto use_default;
+ }
+
+ for (i = 0; i < keymap->num_types; i++)
+ if (keymap->types[i].name == type_name)
+ break;
+
+ if (i >= keymap->num_types) {
+ log_warn(keymap->ctx,
+ "The type \"%s\" for key '%s' group %d was not previously defined; "
+ "Using the default type\n",
+ xkb_atom_text(keymap->ctx, type_name),
+ LongKeyNameText(keyi->name), group + 1);
+ goto use_default;
+ }
+
+ /* XXX: What's with the magic 2 here? */
+ *explicit_type = !autoType || darray_size(groupi->levels) > 2;
+ return &keymap->types[i];
+
+use_default:
+ /*
+ * Index 0 is guaranteed to contain something, usually
+ * ONE_LEVEL or at least some default one-level type.
+ */
+ *explicit_type = false;
+ return &keymap->types[0];
+}
+