static void
update_builtin_keymap_fields(struct xkb_keymap *keymap)
{
- struct xkb_context *ctx = keymap->ctx;
- const struct xkb_mod builtin_mods[] = {
- { .name = xkb_atom_intern_literal(ctx, "Shift"), .type = MOD_REAL },
- { .name = xkb_atom_intern_literal(ctx, "Lock"), .type = MOD_REAL },
- { .name = xkb_atom_intern_literal(ctx, "Control"), .type = MOD_REAL },
- { .name = xkb_atom_intern_literal(ctx, "Mod1"), .type = MOD_REAL },
- { .name = xkb_atom_intern_literal(ctx, "Mod2"), .type = MOD_REAL },
- { .name = xkb_atom_intern_literal(ctx, "Mod3"), .type = MOD_REAL },
- { .name = xkb_atom_intern_literal(ctx, "Mod4"), .type = MOD_REAL },
- { .name = xkb_atom_intern_literal(ctx, "Mod5"), .type = MOD_REAL },
+ /* Predefined (AKA real, core, X11) modifiers. The order is important! */
+ static const char *const builtin_mods[] = {
+ [0] = "Shift",
+ [1] = "Lock",
+ [2] = "Control",
+ [3] = "Mod1",
+ [4] = "Mod2",
+ [5] = "Mod3",
+ [6] = "Mod4",
+ [7] = "Mod5"
};
- /*
- * Add predefined (AKA real, core, X11) modifiers.
- * The order is important!
- */
- darray_append_items(keymap->mods.mods,
- builtin_mods, ARRAY_SIZE(builtin_mods));
+ for (unsigned i = 0; i < ARRAY_SIZE(builtin_mods); i++) {
+ keymap->mods.mods[i].name = xkb_atom_intern(keymap->ctx,
+ builtin_mods[i],
+ strlen(builtin_mods[i]));
+ keymap->mods.mods[i].type = MOD_REAL;
+ }
+ keymap->mods.num_mods = ARRAY_SIZE(builtin_mods);
}
struct xkb_keymap *
free(keymap->sym_interprets);
free(keymap->key_aliases);
free(keymap->group_names);
- darray_free(keymap->mods.mods);
darray_free(keymap->leds);
free(keymap->keycodes_section_name);
free(keymap->symbols_section_name);
XKB_EXPORT xkb_mod_index_t
xkb_keymap_num_mods(struct xkb_keymap *keymap)
{
- return darray_size(keymap->mods.mods);
+ return keymap->mods.num_mods;
}
/**
XKB_EXPORT const char *
xkb_keymap_mod_get_name(struct xkb_keymap *keymap, xkb_mod_index_t idx)
{
- if (idx >= darray_size(keymap->mods.mods))
+ if (idx >= keymap->mods.num_mods)
return NULL;
- return xkb_atom_text(keymap->ctx,
- darray_item(keymap->mods.mods, idx).name);
+ return xkb_atom_text(keymap->ctx, keymap->mods.mods[idx].name);
}
/**
};
struct xkb_mod_set {
- darray(struct xkb_mod) mods;
+ struct xkb_mod mods[XKB_MAX_MODS];
+ unsigned int num_mods;
};
/* Common keyboard description structure */
(iter)++)
#define xkb_mods_foreach(iter, mods_) \
- darray_foreach((iter), (mods_)->mods)
+ for ((iter) = (mods_)->mods; \
+ (iter) < (mods_)->mods + (mods_)->num_mods; \
+ (iter)++)
#define xkb_mods_enumerate(idx, iter, mods_) \
- darray_enumerate((idx), (iter), (mods_)->mods)
+ for ((idx) = 0, (iter) = (mods_)->mods; \
+ (idx) < (mods_)->num_mods; \
+ (idx)++, (iter)++)
static inline const struct xkb_key *
XkbKey(struct xkb_keymap *keymap, xkb_keycode_t kc)
if (ndx == XKB_MOD_INVALID)
return "none";
- if (ndx >= darray_size(mods->mods))
+ if (ndx >= mods->num_mods)
return NULL;
- return xkb_atom_text(ctx, darray_item(mods->mods, ndx).name);
+ return xkb_atom_text(ctx, mods->mods[ndx].name);
}
const char *
{
uint8_t *iter = xcb_xkb_get_map_map_vmods_rtrn(map);
- darray_resize0(keymap->mods.mods,
- NUM_REAL_MODS + msb_pos(reply->virtualMods));
+ keymap->mods.num_mods = NUM_REAL_MODS + msb_pos(reply->virtualMods);
for (unsigned i = 0; i < NUM_VMODS; i++) {
if (reply->virtualMods & (1u << i)) {
uint8_t wire = *iter;
- struct xkb_mod *mod = &darray_item(keymap->mods.mods,
- NUM_REAL_MODS + i);
- mod->type = MOD_VIRT;
- mod->mapping = translate_mods(wire, 0, 0);
+ keymap->mods.mods[i].type = MOD_VIRT;
+ keymap->mods.mods[i].mapping = translate_mods(wire, 0, 0);
iter++;
}
* tells us which vmods exist (a vmod must have a name), so we fix
* up the size here.
*/
- darray_resize0(keymap->mods.mods,
- NUM_REAL_MODS + msb_pos(reply->virtualMods));
+ keymap->mods.num_mods = NUM_REAL_MODS + msb_pos(reply->virtualMods);
for (unsigned i = 0; i < NUM_VMODS; i++) {
if (reply->virtualMods & (1u << i)) {
xcb_atom_t wire = *iter;
- struct xkb_mod *mod = &darray_item(keymap->mods.mods,
- NUM_REAL_MODS + i);
+ struct xkb_mod *mod = &keymap->mods.mods[NUM_REAL_MODS + i];
if (!adopt_atom(keymap->ctx, conn, wire, &mod->name))
return false;
ClearCompatInfo(CompatInfo *info)
{
free(info->name);
- ClearModSet(&info->mods);
darray_free(info->interps);
darray_free(info->leds);
}
return;
}
- MoveModSet(&into->mods, &from->mods);
+ CopyModSet(&into->mods, &from->mods);
if (into->name == NULL) {
into->name = from->name;
keymap->compat_section_name = strdup_safe(info->name);
XkbEscapeMapName(keymap->compat_section_name);
- MoveModSet(&keymap->mods, &info->mods);
+ CopyModSet(&keymap->mods, &info->mods);
if (!darray_empty(info->interps)) {
struct collect collect;
{
KeyInfo *keyi;
free(info->name);
- ClearModSet(&info->mods);
darray_foreach(keyi, info->keys)
ClearKeyInfo(keyi);
darray_free(info->keys);
return;
}
- MoveModSet(&into->mods, &from->mods);
+ CopyModSet(&into->mods, &from->mods);
if (into->name == NULL) {
into->name = from->name;
keymap->symbols_section_name = strdup_safe(info->name);
XkbEscapeMapName(keymap->symbols_section_name);
- MoveModSet(&keymap->mods, &info->mods);
+ CopyModSet(&keymap->mods, &info->mods);
keymap->num_group_names = darray_size(info->group_names);
keymap->group_names = darray_mem(info->group_names, 0);
ClearKeyTypesInfo(KeyTypesInfo *info)
{
free(info->name);
- ClearModSet(&info->mods);
darray_free(info->types);
}
return;
}
- MoveModSet(&into->mods, &from->mods);
+ CopyModSet(&into->mods, &from->mods);
if (into->name == NULL) {
into->name = from->name;
keymap->types_section_name = strdup_safe(info->name);
XkbEscapeMapName(keymap->types_section_name);
- MoveModSet(&keymap->mods, &info->mods);
+ CopyModSet(&keymap->mods, &info->mods);
keymap->num_types = darray_size(info->types);
if (keymap->num_types == 0)
#include "vmod.h"
void
-MoveModSet(struct xkb_mod_set *into, struct xkb_mod_set *from)
-{
- darray_free(into->mods);
- into->mods = from->mods;
- darray_init(from->mods);
-}
-
-void
CopyModSet(struct xkb_mod_set *into, const struct xkb_mod_set *from)
{
- darray_free(into->mods);
- darray_copy(into->mods, from->mods);
-}
-
-void
-ClearModSet(struct xkb_mod_set *mods)
-{
- darray_free(mods->mods);
+ memcpy(into->mods, from->mods, sizeof(*from->mods) * from->num_mods);
+ into->num_mods = from->num_mods;
}
bool
xkb_mod_index_t i;
struct xkb_mod *mod;
xkb_mod_mask_t mapping;
- struct xkb_mod new;
merge = (merge == MERGE_DEFAULT ? stmt->merge : merge);
}
}
- if (darray_size(mods->mods) >= XKB_MAX_MODS) {
+ if (mods->num_mods >= XKB_MAX_MODS) {
log_err(ctx,
"Too many modifiers defined (maximum %d)\n",
XKB_MAX_MODS);
return false;
}
- new.name = stmt->name;
- new.mapping = mapping;
- new.type = MOD_VIRT;
- darray_append(mods->mods, new);
+ mods->mods[mods->num_mods].name = stmt->name;
+ mods->mods[mods->num_mods].type = MOD_VIRT;
+ mods->mods[mods->num_mods].mapping = mapping;
+ mods->num_mods++;
return true;
}
#define XKBCOMP_VMOD_H
void
-MoveModSet(struct xkb_mod_set *into, struct xkb_mod_set *from);
-
-void
CopyModSet(struct xkb_mod_set *into, const struct xkb_mod_set *from);
-void
-ClearModSet(struct xkb_mod_set *mods);
-
bool
HandleVModDef(struct xkb_context *ctx, struct xkb_mod_set *mods,
VModDef *stmt, enum merge_mode merge);