}
int
-XkbcAllocNames(struct xkb_keymap *keymap, unsigned which,
- unsigned nTotalAliases)
+XkbcAllocNames(struct xkb_keymap *keymap, unsigned which, size_t nTotalAliases)
{
- struct xkb_names * names;
-
if (!keymap)
return BadMatch;
if (!keymap->names) {
- keymap->names = uTypedCalloc(1, struct xkb_names);
+ keymap->names = calloc(1, sizeof(*keymap->names));
if (!keymap->names)
return BadAlloc;
+
+ darray_init(keymap->names->keys);
+ darray_init(keymap->names->key_aliases);
}
- names = keymap->names;
if ((which & XkbKTLevelNamesMask) && keymap->map) {
struct xkb_key_type * type;
}
}
- if ((which & XkbKeyNamesMask) && !names->keys) {
- names->keys = uTypedCalloc(keymap->max_key_code + 1,
- struct xkb_key_name);
- if (!names->keys)
- return BadAlloc;
- }
-
- if ((which & XkbKeyAliasesMask) && (nTotalAliases > 0)) {
- if (!names->key_aliases)
- names->key_aliases = uTypedCalloc(nTotalAliases,
- struct xkb_key_alias);
- else if (nTotalAliases > names->num_key_aliases) {
- struct xkb_key_alias *prev_aliases = names->key_aliases;
-
- names->key_aliases = uTypedRecalloc(names->key_aliases,
- names->num_key_aliases,
- nTotalAliases,
- struct xkb_key_alias);
- if (!names->key_aliases)
- free(prev_aliases);
- }
-
- if (!names->key_aliases) {
- names->num_key_aliases = 0;
- return BadAlloc;
- }
+ if (which & XkbKeyNamesMask)
+ darray_resize0(keymap->names->keys, keymap->max_key_code + 1);
- names->num_key_aliases = nTotalAliases;
- }
+ if (which & XkbKeyAliasesMask)
+ darray_resize0(keymap->names->key_aliases, nTotalAliases);
return Success;
}
for (i = 0; i < XkbNumKbdGroups; i++)
free(UNCONSTIFY(names->groups[i]));
- free(names->keys);
- free(names->key_aliases);
+ darray_free(names->keys);
+ darray_free(names->key_aliases);
free(names);
keymap->names = NULL;
}
extern int
XkbcAllocNames(struct xkb_keymap *keymap, unsigned which,
- unsigned nTotalAliases);
+ size_t nTotalAliases);
extern int
XkbcAllocControls(struct xkb_keymap *keymap);
const char *vmods[XkbNumVirtualMods];
const char *indicators[XkbNumIndicators];
const char *groups[XkbNumKbdGroups];
- struct xkb_key_name * keys;
- struct xkb_key_alias * key_aliases;
- xkb_keycode_t num_keys;
- xkb_keycode_t num_key_aliases;
+ darray(struct xkb_key_name) keys;
+ darray(struct xkb_key_alias) key_aliases;
};
struct xkb_controls {
if (*info_in == NULL)
return true;
- nOld = (keymap->names ? keymap->names->num_key_aliases : 0);
- old = (keymap->names ? keymap->names->key_aliases : NULL);
+ nOld = (keymap->names ? darray_size(keymap->names->key_aliases) : 0);
+ old = (keymap->names ? &darray_item(keymap->names->key_aliases, 0) : NULL);
for (nNew = 0, info = *info_in; info != NULL;
info = (AliasInfo *) info->def.next)
{
WSGO("Allocation failure in ApplyAliases\n");
return false;
}
- a = keymap->names ? &keymap->names->key_aliases[nOld] : NULL;
+ a = keymap->names ? &darray_item(keymap->names->key_aliases, nOld) : NULL;
for (info = *info_in; info != NULL; info = (AliasInfo *) info->def.next)
{
if (info->alias[0] != '\0')
== Success) {
uint64_t i;
for (i = info.computedMin; i <= info.computedMax; i++)
- LongToKeyName(info.names[i], keymap->names->keys[i].name);
+ LongToKeyName(info.names[i],
+ darray_item(keymap->names->keys, i).name);
} else {
WSGO("Cannot create struct xkb_names in CompileKeycodes\n");
goto err_info;
}
*kc_rtrn = 0; /* some callers rely on this */
- if (keymap && keymap->names && keymap->names->keys)
+ if (keymap && keymap->names && !darray_empty(keymap->names->keys))
{
for (n = start_from; n <= keymap->max_key_code; n++)
{
unsigned long tmp;
- tmp = KeyNameToLong(keymap->names->keys[n].name);
+ tmp = KeyNameToLong(darray_item(keymap->names->keys, n).name);
if (tmp == name)
{
*kc_rtrn = n;
}
if (create)
{
- if ((!keymap->names) || (!keymap->names->keys))
+ if ((!keymap->names) || darray_empty(keymap->names->keys))
{
if (XkbcAllocNames(keymap, XkbKeyNamesMask, 0) != Success)
{
/* Find first unused keycode and store our key here */
for (n = keymap->min_key_code; n <= keymap->max_key_code; n++)
{
- if (keymap->names->keys[n].name[0] == '\0')
+ if (darray_item(keymap->names->keys, n).name[0] == '\0')
{
char buf[XkbKeyNameLength + 1];
LongToKeyName(name, buf);
- memcpy(keymap->names->keys[n].name, buf, XkbKeyNameLength);
+ memcpy(darray_item(keymap->names->keys, n).name, buf,
+ XkbKeyNameLength);
*kc_rtrn = n;
return true;
}
FindKeyNameForAlias(struct xkb_keymap *keymap, unsigned long lname,
unsigned long *real_name)
{
- unsigned int i;
char name[XkbKeyNameLength + 1];
+ struct xkb_key_alias *a;
- if (keymap && keymap->names && keymap->names->key_aliases)
- {
- struct xkb_key_alias * a;
- a = keymap->names->key_aliases;
+ if (keymap && keymap->names) {
LongToKeyName(lname, name);
name[XkbKeyNameLength] = '\0';
- for (i = 0; i < keymap->names->num_key_aliases; i++, a++)
- {
- if (strncmp(name, a->alias, XkbKeyNameLength) == 0)
- {
+ darray_foreach(a, keymap->names->key_aliases) {
+ if (strncmp(name, a->alias, XkbKeyNameLength) == 0) {
*real_name = KeyNameToLong(a->real);
return true;
}
if (warningLevel > 3) {
for (i = keymap->min_key_code; i <= keymap->max_key_code; i++) {
- if (keymap->names->keys[i].name[0] == '\0')
+ if (darray_item(keymap->names->keys, i).name[0] == '\0')
continue;
if (XkbKeyNumGroups(keymap, i) < 1) {
char buf[5];
- memcpy(buf, keymap->names->keys[i].name, 4);
+ memcpy(buf, darray_item(keymap->names->keys, i).name, 4);
buf[4] = '\0';
WARN("No symbols defined for <%s> (keycode %d)\n", buf, i);
}