}
}
+/* Temporary struct for CopyInterps. */
+struct collect {
+ darray(struct xkb_sym_interpret) sym_interprets;
+};
+
static void
-CopyInterps(CompatInfo *info, bool needSymbol, enum xkb_match_operation pred)
+CopyInterps(CompatInfo *info, bool needSymbol, enum xkb_match_operation pred,
+ struct collect *collect)
{
SymInterpInfo *si;
darray_foreach(si, info->interps)
if (si->interp.match == pred &&
(si->interp.sym != XKB_KEY_NoSymbol) == needSymbol)
- darray_append(info->keymap->sym_interprets, si->interp);
+ darray_append(collect->sym_interprets, si->interp);
}
static void
XkbEscapeMapName(keymap->compat_section_name);
if (!darray_empty(info->interps)) {
+ struct collect collect;
+ darray_init(collect.sym_interprets);
+
/* Most specific to least specific. */
- CopyInterps(info, true, MATCH_EXACTLY);
- CopyInterps(info, true, MATCH_ALL);
- CopyInterps(info, true, MATCH_NONE);
- CopyInterps(info, true, MATCH_ANY);
- CopyInterps(info, true, MATCH_ANY_OR_NONE);
- CopyInterps(info, false, MATCH_EXACTLY);
- CopyInterps(info, false, MATCH_ALL);
- CopyInterps(info, false, MATCH_NONE);
- CopyInterps(info, false, MATCH_ANY);
- CopyInterps(info, false, MATCH_ANY_OR_NONE);
+ CopyInterps(info, true, MATCH_EXACTLY, &collect);
+ CopyInterps(info, true, MATCH_ALL, &collect);
+ CopyInterps(info, true, MATCH_NONE, &collect);
+ CopyInterps(info, true, MATCH_ANY, &collect);
+ CopyInterps(info, true, MATCH_ANY_OR_NONE, &collect);
+ CopyInterps(info, false, MATCH_EXACTLY, &collect);
+ CopyInterps(info, false, MATCH_ALL, &collect);
+ CopyInterps(info, false, MATCH_NONE, &collect);
+ CopyInterps(info, false, MATCH_ANY, &collect);
+ CopyInterps(info, false, MATCH_ANY_OR_NONE, &collect);
+
+ keymap->num_sym_interprets = darray_size(collect.sym_interprets);
+ keymap->sym_interprets = darray_mem(collect.sym_interprets, 0);
}
CopyLedMapDefs(info);
static bool
write_compat(struct xkb_keymap *keymap, struct buf *buf)
{
- const struct xkb_sym_interpret *si;
const struct xkb_led *led;
if (keymap->compat_section_name)
write_buf(buf, "\tinterpret.useModMapMods= AnyLevel;\n");
write_buf(buf, "\tinterpret.repeat= False;\n");
- darray_foreach(si, keymap->sym_interprets) {
+ for (int i = 0; i < keymap->num_sym_interprets; i++) {
+ const struct xkb_sym_interpret *si = &keymap->sym_interprets[i];
+
write_buf(buf, "\tinterpret %s+%s(%s) {\n",
si->sym ? KeysymText(keymap->ctx, si->sym) : "Any",
SIMatchText(si->match),
FindInterpForKey(struct xkb_keymap *keymap, const struct xkb_key *key,
xkb_layout_index_t group, xkb_level_index_t level)
{
- const struct xkb_sym_interpret *interp;
const xkb_keysym_t *syms;
int num_syms;
* sym_interprets array from the most specific to the least specific,
* such that when we find a match we return immediately.
*/
- darray_foreach(interp, keymap->sym_interprets) {
+ for (int i = 0; i < keymap->num_sym_interprets; i++) {
+ const struct xkb_sym_interpret *interp = &keymap->sym_interprets[i];
+
xkb_mod_mask_t mods;
bool found = false;