Bool XkbLookupKeySym( register Display * dpy, KeyCode key, register unsigned int mods, unsigned int * mods_rtrn, KeySym * keysym_rtrn) { if (_XkbUnavailable(dpy)) return _XTranslateKey(dpy, key, mods, mods_rtrn, keysym_rtrn); _XkbCheckPendingRefresh(dpy,dpy->xkb_info); return XkbTranslateKeyCode(dpy->xkb_info->desc,key,mods,mods_rtrn, keysym_rtrn); }
/*ARGSUSED*/ int XLookupString ( register XKeyEvent *event, char *buffer, /* buffer */ int nbytes, /* space in buffer for characters */ KeySym *keysym, XComposeStatus *status) /* not implemented */ { unsigned int modifiers; KeySym symbol; if (! _XTranslateKey(event->display, event->keycode, event->state, &modifiers, &symbol)) return 0; #ifdef USE_OWN_COMPOSE if ( status ) { static int been_here= 0; if ( !been_here ) { XimCompInitTables(); been_here = 1; } if ( !XimCompLegalStatus(status) ) { status->compose_ptr = NULL; status->chars_matched = 0; } if ( ((status->chars_matched>0)&&(status->compose_ptr!=NULL)) || XimCompIsComposeKey(symbol,event->keycode,status) ) { XimCompRtrn rtrn; switch (XimCompProcessSym(status,symbol,&rtrn)) { case XIM_COMP_IGNORE: break; case XIM_COMP_IN_PROGRESS: if ( keysym!=NULL ) *keysym = NoSymbol; return 0; case XIM_COMP_FAIL: { int n = 0, len= 0; for (n=len=0;rtrn.sym[n]!=XK_VoidSymbol;n++) { if ( nbytes-len > 0 ) { len+= _XTranslateKeySym(event->display,rtrn.sym[n], event->state, buffer+len,nbytes-len); } } if ( keysym!=NULL ) { if ( n==1 ) *keysym = rtrn.sym[0]; else *keysym = NoSymbol; } return len; } case XIM_COMP_SUCCEED: { int len,n = 0; symbol = rtrn.matchSym; if ( keysym!=NULL ) *keysym = symbol; if ( rtrn.str[0]!='\0' ) { strncpy(buffer,rtrn.str,nbytes-1); buffer[nbytes-1]= '\0'; len = strlen(buffer); } else { len = _XTranslateKeySym(event->display,symbol, event->state, buffer,nbytes); } for (n=0;rtrn.sym[n]!=XK_VoidSymbol;n++) { if ( nbytes-len > 0 ) { len+= _XTranslateKeySym(event->display,rtrn.sym[n], event->state, buffer+len,nbytes-len); } } return len; } } } } #endif if (keysym) *keysym = symbol; /* arguable whether to use (event->state & ~modifiers) here */ return _XTranslateKeySym(event->display, symbol, event->state, buffer, nbytes); }