#include "text.h"
struct xkb_keymap *
-xkb_keymap_new(struct xkb_context *ctx)
+xkb_keymap_new(struct xkb_context *ctx,
+ enum xkb_keymap_format format,
+ enum xkb_keymap_compile_flags flags)
{
struct xkb_keymap *keymap;
keymap->refcnt = 1;
keymap->ctx = xkb_context_ref(ctx);
+ keymap->format = format;
+ keymap->flags = flags;
+
return keymap;
}
XKB_EXPORT void
xkb_keymap_unref(struct xkb_keymap *keymap)
{
- unsigned int i;
+ unsigned int i, j;
struct xkb_key *key;
if (!keymap || --keymap->refcnt > 0)
return;
+ darray_foreach(key, keymap->keys) {
+ for (i = 0; i < key->num_groups; i++) {
+ for (j = 0; j < XkbKeyGroupWidth(key, i); j++)
+ if (key->groups[i].levels[j].num_syms > 1)
+ free(key->groups[i].levels[j].u.syms);
+ free(key->groups[i].levels);
+ }
+ free(key->groups);
+ }
+ darray_free(keymap->keys);
for (i = 0; i < keymap->num_types; i++) {
free(keymap->types[i].map);
free(keymap->types[i].level_names);
}
free(keymap->types);
- darray_foreach(key, keymap->keys) {
- free(key->sym_index);
- free(key->num_syms);
- free(key->syms);
- free(key->actions);
- }
- darray_free(keymap->keys);
darray_free(keymap->sym_interpret);
darray_free(keymap->key_aliases);
+ darray_free(keymap->group_names);
free(keymap->keycodes_section_name);
free(keymap->symbols_section_name);
free(keymap->types_section_name);
XKB_EXPORT const char *
xkb_keymap_layout_get_name(struct xkb_keymap *keymap, xkb_layout_index_t idx)
{
- if (idx >= xkb_keymap_num_layouts(keymap))
+ if (idx >= xkb_keymap_num_layouts(keymap) ||
+ idx >= darray_size(keymap->group_names))
return NULL;
- return xkb_atom_text(keymap->ctx, keymap->group_names[idx]);
+ return xkb_atom_text(keymap->ctx, darray_item(keymap->group_names, idx));
}
/**
XKB_EXPORT xkb_layout_index_t
xkb_keymap_layout_get_index(struct xkb_keymap *keymap, const char *name)
{
- xkb_layout_index_t num_groups = xkb_keymap_num_layouts(keymap);
xkb_atom_t atom = xkb_atom_lookup(keymap->ctx, name);
+ xkb_atom_t *group_name;
xkb_layout_index_t i;
if (atom == XKB_ATOM_NONE)
return XKB_LAYOUT_INVALID;
- for (i = 0; i < num_groups; i++)
- if (keymap->group_names[i] == atom)
+ darray_enumerate(i, group_name, keymap->group_names)
+ if (*group_name == atom)
return i;
return XKB_LAYOUT_INVALID;
if (!key)
return 0;
- return XkbKeyGroupWidth(keymap, key, layout);
+ return XkbKeyGroupWidth(key, layout);
}
/**
goto err;
if (layout >= key->num_groups)
goto err;
- if (level >= XkbKeyGroupWidth(keymap, key, layout))
+ if (level >= XkbKeyGroupWidth(key, layout))
goto err;
num_syms = XkbKeyNumSyms(key, layout, level);