diff options
Diffstat (limited to 'xkb/xkbUtils.c')
-rw-r--r-- | xkb/xkbUtils.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c index 5ae426dbb..0bd41cd34 100644 --- a/xkb/xkbUtils.c +++ b/xkb/xkbUtils.c @@ -2116,3 +2116,33 @@ XkbCopyDeviceKeymap(DeviceIntPtr dst, DeviceIntPtr src) return ret; } + +int +XkbGetKeysym(DeviceIntPtr dev, DeviceEvent *event) +{ + XkbDescPtr xkb = dev->key->xkbInfo->desc; + XkbKeyTypePtr kt; + int group; + int i, level = 0; + int modmask; + + group = event->group.base + event->group.latched + event->group.locked; + + if (group >= xkb->ctrls->num_groups) + group = XkbAdjustGroup(group, xkb->ctrls); + + modmask = event->mods.base | event->mods.latched; /* don't care about + locked mods */ + kt = XkbKeyKeyType(xkb, event->detail.key, group); + + for (i = 0; i < kt->map_count; i++) + { + if (kt->map[i].mods.mask == modmask) + { + level = kt->map[i].level; + break; + } + } + + return XkbKeySymEntry(xkb, event->detail.key, level, group); +} |