39 lines
978 B
C
39 lines
978 B
C
#include <stdint.h>
|
|
#include <xcb/xcb.h>
|
|
#include <xkbcommon/xkbcommon.h>
|
|
#include <xkbcommon/xkbcommon-names.h>
|
|
|
|
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);
|
|
}
|