}
}
+static const struct xkb_sym_interpret default_interpret = {
+ .sym = XKB_KEY_NoSymbol,
+ .repeat = true,
+ .match = MATCH_ANY_OR_NONE,
+ .mods = 0,
+ .virtual_mod = XKB_MOD_INVALID,
+ .act = { .type = ACTION_TYPE_NONE },
+};
+
/**
* Find an interpretation which applies to this particular level, either by
* finding an exact match for the symbol and modifier combination, or a
* generic XKB_KEY_NoSymbol match.
*/
-static struct xkb_sym_interpret *
-FindInterpForKey(struct xkb_keymap *keymap, struct xkb_key *key,
+static const struct xkb_sym_interpret *
+FindInterpForKey(struct xkb_keymap *keymap, const struct xkb_key *key,
xkb_layout_index_t group, xkb_level_index_t level)
{
struct xkb_sym_interpret *interp;
return interp;
}
- return NULL;
+ return &default_interpret;
}
static bool
{
xkb_mod_mask_t vmodmask = 0;
xkb_layout_index_t group;
- xkb_level_index_t width, level;
+ xkb_level_index_t level;
/* If we've been told not to bind interps to this key, then don't. */
if (key->explicit & EXPLICIT_INTERP)
return true;
for (group = 0; group < key->num_groups; group++) {
- width = XkbKeyGroupWidth(key, group);
- for (level = 0; level < width; level++) {
- struct xkb_sym_interpret *interp;
+ for (level = 0; level < XkbKeyGroupWidth(key, group); level++) {
+ const struct xkb_sym_interpret *interp;
interp = FindInterpForKey(keymap, key, group, level);
+ if (!interp)
+ continue;
/* Infer default key behaviours from the base level. */
- if (group == 0 && level == 0) {
- if (!(key->explicit & EXPLICIT_REPEAT) &&
- (!interp || interp->repeat))
+ if (group == 0 && level == 0)
+ if (!(key->explicit & EXPLICIT_REPEAT) && interp->repeat)
key->repeats = true;
- }
-
- if (!interp)
- continue;
if ((group == 0 && level == 0) ||
!(interp->match & MATCH_LEVEL_ONE_ONLY)) {