unsigned numLevels;
darray(struct xkb_kt_map_entry) entries;
PreserveInfo *preserve;
- unsigned szNames;
- xkb_atom_t *lvlNames;
+ darray(xkb_atom_t) lvlNames;
} KeyTypeInfo;
typedef struct _KeyTypesInfo
info->dflt.groupInfo = false;
info->dflt.numLevels = 1;
darray_init(info->dflt.entries);
- info->dflt.szNames = 0;
- info->dflt.lvlNames = NULL;
+ darray_init(info->dflt.lvlNames);
info->dflt.preserve = NULL;
InitVModInfo(&info->vmods, keymap);
if (from != NULL)
&darray_item(from->dflt.entries, 0),
darray_size(from->dflt.entries));
- if (from->dflt.lvlNames)
- {
- info->dflt.lvlNames = uTypedCalloc(from->dflt.szNames, xkb_atom_t);
- if (info->dflt.lvlNames)
- {
- unsigned sz = from->dflt.szNames * sizeof(xkb_atom_t);
- memcpy(info->dflt.lvlNames, from->dflt.lvlNames, sz);
- }
- }
+ darray_init(info->dflt.lvlNames);
+ darray_from_items(info->dflt.lvlNames,
+ &darray_item(from->dflt.lvlNames, 0),
+ darray_size(from->dflt.lvlNames));
+
if (from->dflt.preserve)
{
PreserveInfo *old, *new, *last;
{
darray_free(type->entries);
darray_init(type->entries);
- free(type->lvlNames);
- type->lvlNames = NULL;
+ darray_free(type->lvlNames);
+ darray_init(type->lvlNames);
if (type->preserve != NULL)
{
ClearCommonInfo(&type->preserve->defs);
FreeKeyTypeInfo(old);
*old = *new;
darray_init(new->entries);
+ darray_init(new->lvlNames);
new->preserve = NULL;
- new->lvlNames = NULL;
old->defs.next = &next->defs;
return true;
}
*old = *new;
old->defs.next = NULL;
darray_init(new->entries);
- new->szNames = 0;
- new->lvlNames = NULL;
+ darray_init(new->lvlNames);
new->preserve = NULL;
return true;
}
AddLevelName(struct xkb_keymap *keymap, KeyTypeInfo *type,
unsigned level, xkb_atom_t name, bool clobber)
{
- if ((type->lvlNames == NULL) || (type->szNames <= level))
- {
- type->lvlNames =
- uTypedRecalloc(type->lvlNames, type->szNames, level + 1, xkb_atom_t);
- if (type->lvlNames == NULL)
- {
- ERROR("Couldn't allocate level names for type %s\n",
- TypeTxt(keymap, type));
- ACTION("Level names lost\n");
- type->szNames = 0;
- return false;
- }
- type->szNames = level + 1;
- }
- else if (type->lvlNames[level] == name)
- {
- if (warningLevel > 9)
- {
+ if (level >= darray_size(type->lvlNames))
+ darray_resize0(type->lvlNames, level + 1);
+
+ if (darray_item(type->lvlNames, level) == name) {
+ if (warningLevel > 9) {
WARN("Duplicate names for level %d of key type %s\n",
- level + 1, TypeTxt(keymap, type));
+ level + 1, TypeTxt(keymap, type));
ACTION("Ignored\n");
}
return true;
}
- else if (type->lvlNames[level] != XKB_ATOM_NONE)
- {
- if (warningLevel > 0)
- {
+ else if (darray_item(type->lvlNames, level) != XKB_ATOM_NONE) {
+ if (warningLevel > 0) {
const char *old, *new;
- old = xkb_atom_text(keymap->ctx, type->lvlNames[level]);
+ old = xkb_atom_text(keymap->ctx,
+ darray_item(type->lvlNames, level));
new = xkb_atom_text(keymap->ctx, name);
WARN("Multiple names for level %d of key type %s\n",
- level + 1, TypeTxt(keymap, type));
+ level + 1, TypeTxt(keymap, type));
if (clobber)
ACTION("Using %s, ignoring %s\n", new, old);
else
ACTION("Using %s, ignoring %s\n", old, new);
}
+
if (!clobber)
return true;
}
- if (level >= type->numLevels)
- type->numLevels = level + 1;
- type->lvlNames[level] = name;
+
+ darray_item(type->lvlNames, level) = name;
return true;
}
type.groupInfo = info->dflt.groupInfo;
type.numLevels = 1;
darray_init(type.entries);
- type.szNames = 0;
- type.lvlNames = NULL;
+ darray_init(type.lvlNames);
type.preserve = NULL;
/* Parse the actual content. */
dflt = (PreserveInfo *) dflt->defs.next;
}
}
- for (i = 0; i < info->dflt.szNames; i++)
- {
- if ((i < type.numLevels) && (info->dflt.lvlNames[i] != XKB_ATOM_NONE))
+
+ for (i = 0; i < darray_size(info->dflt.lvlNames); i++) {
+ if (i < type.numLevels &&
+ darray_item(info->dflt.lvlNames, i) != XKB_ATOM_NONE)
{
- AddLevelName(keymap, &type, i, info->dflt.lvlNames[i], false);
+ AddLevelName(keymap, &type, i,
+ darray_item(info->dflt.lvlNames, i), false);
}
}
+
/* Now add the new keytype to the info struct */
if (!AddKeyType(keymap, info, &type))
{
else
type->preserve = NULL;
type->name = xkb_atom_strdup(keymap->ctx, def->name);
- if (def->szNames > 0)
- {
- type->level_names = uTypedCalloc(def->numLevels, const char *);
+
+ if (!darray_empty(def->lvlNames)) {
+ type->level_names = uTypedCalloc(darray_size(def->lvlNames),
+ const char *);
/* assert def->szNames<=def->numLevels */
- for (i = 0; i < def->szNames; i++)
- {
- type->level_names[i] = xkb_atom_strdup(keymap->ctx,
- def->lvlNames[i]);
- }
+ for (i = 0; i < darray_size(def->lvlNames); i++)
+ type->level_names[i] =
+ xkb_atom_strdup(keymap->ctx, darray_item(def->lvlNames, i));
}
- else
- {
+ else {
type->level_names = NULL;
}