xkb_key_get_level(struct xkb_state *state, xkb_keycode_t key,
unsigned int group)
{
- struct xkb_keymap *keymap = state->keymap;
+ struct xkb_keymap *keymap = xkb_state_get_map(state);
struct xkb_key_type *type = XkbKeyType(keymap, key, group);
- unsigned int active_mods = state->mods & type->mods.mask;
- int i;
-
- for (i = 0; i < type->map_count; i++) {
- if (!type->map[i].active)
- continue;
- if (type->map[i].mods.mask == active_mods)
- return type->map[i].level;
+ struct xkb_kt_map_entry *entry;
+ unsigned int active_mods;
+
+ active_mods = xkb_state_serialize_mods(state, XKB_STATE_EFFECTIVE);
+ active_mods &= type->mods.mask;
+
+ darray_foreach(entry, type->map) {
+ if (entry->mods.mask == active_mods)
+ return entry->level;
}
return 0;
_X_EXPORT unsigned int
xkb_key_get_group(struct xkb_state *state, xkb_keycode_t key)
{
- struct xkb_keymap *keymap = state->keymap;
+ struct xkb_keymap *keymap = xkb_state_get_map(state);
unsigned int info = XkbKeyGroupInfo(keymap, key);
unsigned int num_groups = XkbKeyNumGroups(keymap, key);
- unsigned int ret = state->group;
+ unsigned int ret = xkb_state_serialize_group(state, XKB_STATE_EFFECTIVE);
if (ret < XkbKeyNumGroups(keymap, key))
return ret;
switch (XkbOutOfRangeGroupAction(info)) {
case XkbRedirectIntoRange:
- ret = XkbOutOfRangeGroupInfo(info);
+ ret = XkbOutOfRangeGroupNumber(info);
if (ret >= num_groups)
ret = 0;
break;
+
case XkbClampIntoRange:
ret = num_groups - 1;
break;
+
case XkbWrapIntoRange:
default:
ret %= num_groups;
/**
* As below, but takes an explicit group/level rather than state.
*/
-unsigned int
+int
xkb_key_get_syms_by_level(struct xkb_keymap *keymap, xkb_keycode_t key,
unsigned int group, unsigned int level,
const xkb_keysym_t **syms_out)
* Provides the symbols to use for the given key and state. Returns the
* number of symbols pointed to in syms_out.
*/
-_X_EXPORT unsigned int
+_X_EXPORT int
xkb_key_get_syms(struct xkb_state *state, xkb_keycode_t key,
const xkb_keysym_t **syms_out)
{
- struct xkb_keymap *keymap = state->keymap;
+ struct xkb_keymap *keymap = xkb_state_get_map(state);
int group;
int level;
*syms_out = NULL;
return 0;
}
+
+/**
+ * Simple boolean specifying whether or not the key should repeat.
+ */
+_X_EXPORT int
+xkb_key_repeats(struct xkb_keymap *keymap, xkb_keycode_t key)
+{
+ return !!(keymap->ctrls->per_key_repeat[key / 8] & (1 << (key % 8)));
+}