int main(int, char **) { Display *display = 0; int opcode = -1; int xkbEventBase = -1; int xkbErrorBase = -1; int xkblibMajor = XkbMajorVersion; int xkblibMinor = XkbMinorVersion; XkbQueryExtension(display, &opcode, &xkbEventBase, &xkbErrorBase, &xkblibMajor, &xkblibMinor); int keycode = 0; unsigned int state = 0; KeySym keySym; unsigned int consumedModifiers; XkbLookupKeySym(display, keycode, state, &consumedModifiers, &keySym); XkbDescPtr xkbDesc = XkbGetMap(display, XkbAllClientInfoMask, XkbUseCoreKbd); int w = XkbKeyGroupsWidth(xkbDesc, keycode); keySym = XkbKeySym(xkbDesc, keycode, w-1); XkbFreeClientMap(xkbDesc, XkbAllClientInfoMask, true); state = XkbPCF_GrabsUseXKBStateMask; (void) XkbSetPerClientControls(display, state, &state); return 0; }
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; }