unsigned XkbKeysymToModifiers(Display *dpy,KeySym ks) { XkbDescRec *xkb; register int i,j; register KeySym *pSyms; CARD8 mods; if (_XkbUnavailable(dpy)) return _XKeysymToModifiers(dpy,ks); _XkbCheckPendingRefresh(dpy,dpy->xkb_info); if (_XkbNeedModmap(dpy->xkb_info)&&(!_XkbComputeModmap(dpy))) return _XKeysymToModifiers(dpy,ks); xkb= dpy->xkb_info->desc; mods= 0; for (i = xkb->min_key_code; i <= (int)xkb->max_key_code; i++) { pSyms= XkbKeySymsPtr(xkb,i); for (j=XkbKeyNumSyms(xkb,i)-1;j>=0;j--) { if (pSyms[j]==ks) { mods|= xkb->map->modmap[i]; break; } } } return mods; }
static int check_modmap_change_slave(ClientPtr client, DeviceIntPtr master, DeviceIntPtr slave, CARD8 *modmap) { XkbDescPtr master_xkb, slave_xkb; int i, j; if (!slave->key || !master->key) return 0; master_xkb = master->key->xkbInfo->desc; slave_xkb = slave->key->xkbInfo->desc; /* Ignore devices with a clearly different keymap. */ if (slave_xkb->min_key_code != master_xkb->min_key_code || slave_xkb->max_key_code != master_xkb->max_key_code) return 0; for (i = 0; i < MAP_LENGTH; i++) { if (!modmap[i]) continue; /* If we have different symbols for any modifier on an * extended keyboard, ignore the whole remap request. */ for (j = 0; j < XkbKeyNumSyms(slave_xkb, i) && j < XkbKeyNumSyms(master_xkb, i); j++) if (XkbKeySymsPtr(slave_xkb, i)[j] != XkbKeySymsPtr(master_xkb, i)[j]) return 0; } if (check_modmap_change(client, slave, modmap) != Success) return 0; return 1; }
KeyCode XKeysymToKeycode(Display *dpy, KeySym ks) { register int i, j, gotOne; if (_XkbUnavailable(dpy)) return _XKeysymToKeycode(dpy,ks); _XkbCheckPendingRefresh(dpy,dpy->xkb_info); j= 0; do { register XkbDescRec *xkb = dpy->xkb_info->desc; gotOne= 0; for (i = dpy->min_keycode; i <= dpy->max_keycode; i++) { if ( j<(int)XkbKeyNumSyms(xkb,i) ) { gotOne = 1; if ((XkbKeySym(xkb,i,j)==ks)) return i; } } j++; } while (gotOne); return 0; }