#include #include #include #include uint32_t keymaplookup(struct xkb_state *state, uint8_t keycode, uint16_t corestate) { static const char *modname[] = { XKB_MOD_NAME_SHIFT, XKB_MOD_NAME_CAPS, XKB_MOD_NAME_CTRL, XKB_MOD_NAME_MOD1, XKB_MOD_NAME_MOD2, XKB_MOD_NAME_MOD3, XKB_MOD_NAME_MOD4, XKB_MOD_NAME_MOD5, }; struct xkb_keymap *keymap; xkb_mod_index_t index; xkb_mod_mask_t mods; int i; if(state == NULL) return XKB_KEY_NoSymbol; keymap = xkb_state_get_keymap(state); mods = 0; for(i = 0; i < (int)(sizeof modname / sizeof modname[0]); i++){ if(!(corestate & (1U << i))) continue; index = xkb_keymap_mod_get_index(keymap, modname[i]); if(index != XKB_MOD_INVALID && index < 8 * sizeof mods) mods |= (xkb_mod_mask_t)1 << index; } xkb_state_update_mask(state, mods, 0, 0, 0, 0, (corestate >> 13) & 3); return xkb_state_key_get_one_sym(state, keycode); }