diff options
Diffstat (limited to 'src/xkb/XKBBind.c')
-rw-r--r-- | src/xkb/XKBBind.c | 259 |
1 files changed, 73 insertions, 186 deletions
diff --git a/src/xkb/XKBBind.c b/src/xkb/XKBBind.c index 4c6334a7..ba9f53fa 100644 --- a/src/xkb/XKBBind.c +++ b/src/xkb/XKBBind.c @@ -26,9 +26,12 @@ other dealings in this Software without prior written authorization from The Open Group. */ +/* $XFree86: xc/lib/X11/XKBBind.c,v 3.19 2003/05/27 22:26:25 tsi Exp $ */ + /* the new monsters ate the old ones */ #define NEED_EVENTS +#include "XKBlib.h" #include <X11/Xlibint.h> #include <X11/Xutil.h> #include <X11/keysym.h> @@ -47,9 +50,7 @@ from The Open Group. Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask) static int _XkbLoadDpy( -#if NeedFunctionPrototypes Display *dpy -#endif ); struct _XKeytrans { @@ -63,7 +64,6 @@ struct _XKeytrans { }; KeySym -#if NeedFunctionPrototypes XkbKeycodeToKeysym(Display *dpy, #if NeedWidePrototypes unsigned int kc, @@ -72,13 +72,6 @@ XkbKeycodeToKeysym(Display *dpy, #endif int group, int level) -#else -XkbKeycodeToKeysym(dpy, kc, group, level) - Display *dpy; - KeyCode kc; - int group; - int level; -#endif { XkbDescRec *xkb; @@ -107,7 +100,6 @@ XkbKeycodeToKeysym(dpy, kc, group, level) } KeySym -#if NeedFunctionPrototypes XKeycodeToKeysym(Display *dpy, #if NeedWidePrototypes unsigned int kc, @@ -115,12 +107,6 @@ XKeycodeToKeysym(Display *dpy, KeyCode kc, #endif int col) -#else -XKeycodeToKeysym(dpy, kc, col) - Display *dpy; - KeyCode kc; - int col; -#endif { XkbDescRec *xkb; @@ -165,13 +151,7 @@ XKeycodeToKeysym(dpy, kc, col) } KeyCode -#if NeedFunctionPrototypes XKeysymToKeycode(Display *dpy, KeySym ks) -#else -XKeysymToKeycode(dpy, ks) - Display *dpy; - KeySym ks; -#endif { register int i, j, gotOne; @@ -196,12 +176,7 @@ XKeysymToKeycode(dpy, ks) } static int -#if NeedFunctionPrototypes _XkbComputeModmap(Display *dpy) -#else -_XkbComputeModmap(dpy) - Display *dpy; -#endif { register XkbDescPtr xkb; @@ -212,13 +187,7 @@ register XkbDescPtr xkb; } unsigned -#if NeedFunctionPrototypes XkbKeysymToModifiers(Display *dpy,KeySym ks) -#else -XkbKeysymToModifiers(dpy,ks) - Display *dpy; - KeySym ks; -#endif { XkbDescRec *xkb; register int i,j; @@ -247,13 +216,7 @@ XkbKeysymToModifiers(dpy,ks) } KeySym -#if NeedFunctionPrototypes XLookupKeysym(register XKeyEvent *event, int col) -#else -XLookupKeysym(event, col) - register XKeyEvent *event; - int col; -#endif { Display *dpy = event->display; if (_XkbUnavailable(dpy)) @@ -268,39 +231,27 @@ XLookupKeysym(event, col) * version will continue to work in a shared library environment. */ int -#if NeedFunctionPrototypes +XkbTranslateKey( register Display * dpy, + KeyCode key, + register unsigned int mods, + unsigned int * mods_rtrn, + KeySym * keysym_rtrn); +int XkbTranslateKey( register Display * dpy, KeyCode key, register unsigned int mods, unsigned int * mods_rtrn, KeySym * keysym_rtrn) -#else -XkbTranslateKey(dpy, key, mods, mods_rtrn, keysym_rtrn) - register Display *dpy; - KeyCode key; - register unsigned int mods; - unsigned int *mods_rtrn; - KeySym *keysym_rtrn; -#endif { return XkbLookupKeySym(dpy,key,mods,mods_rtrn,keysym_rtrn); } Bool -#if NeedFunctionPrototypes XkbLookupKeySym( register Display * dpy, KeyCode key, register unsigned int mods, unsigned int * mods_rtrn, KeySym * keysym_rtrn) -#else -XkbLookupKeySym(dpy, key, mods, mods_rtrn, keysym_rtrn) - register Display *dpy; - KeyCode key; - register unsigned int mods; - unsigned int *mods_rtrn; - KeySym *keysym_rtrn; -#endif { if (_XkbUnavailable(dpy)) return _XTranslateKey(dpy, key, mods, mods_rtrn, keysym_rtrn); @@ -310,20 +261,11 @@ XkbLookupKeySym(dpy, key, mods, mods_rtrn, keysym_rtrn) } Bool -#if NeedFunctionPrototypes XkbTranslateKeyCode( register XkbDescPtr xkb, KeyCode key, register unsigned int mods, unsigned int * mods_rtrn, KeySym * keysym_rtrn) -#else -XkbTranslateKeyCode(xkb, key, mods, mods_rtrn, keysym_rtrn) - register XkbDescPtr xkb; - KeyCode key; - register unsigned int mods; - unsigned int *mods_rtrn; - KeySym *keysym_rtrn; -#endif { XkbKeyTypeRec *type; int col,nKeyGroups; @@ -398,12 +340,7 @@ XkbTranslateKeyCode(xkb, key, mods, mods_rtrn, keysym_rtrn) } Status -#if NeedFunctionPrototypes XkbRefreshKeyboardMapping(register XkbMapNotifyEvent *event) -#else -XkbRefreshKeyboardMapping(event) - register XkbMapNotifyEvent *event; -#endif { Display *dpy = event->display; XkbInfoPtr xkbi; @@ -446,20 +383,18 @@ XkbRefreshKeyboardMapping(event) } int -#if NeedFunctionPrototypes XRefreshKeyboardMapping(register XMappingEvent *event) -#else -XRefreshKeyboardMapping(event) - register XMappingEvent *event; -#endif { XkbEvent *xkbevent = (XkbEvent *)event; Display *dpy = event->display; XkbMapChangesRec changes; XkbInfoPtr xkbi; + /* always do this for input methods, which still use the old keymap */ + (void) _XRefreshKeyboardMapping(event); + if (_XkbUnavailable(dpy)) - return _XRefreshKeyboardMapping(event); + return 1; xkbi = dpy->xkb_info; @@ -532,6 +467,7 @@ XRefreshKeyboardMapping(event) UnlockDisplay(dpy); } if (event->request==MappingModifier) { + LockDisplay(dpy); if (xkbi->desc->map->modmap) { _XkbFree(xkbi->desc->map->modmap); xkbi->desc->map->modmap= NULL; @@ -556,12 +492,7 @@ XRefreshKeyboardMapping(event) } static int -#if NeedFunctionPrototypes _XkbLoadDpy(Display *dpy) -#else -_XkbLoadDpy(dpy) - Display *dpy; -#endif { XkbInfoPtr xkbi; unsigned query,oldEvents; @@ -582,8 +513,6 @@ _XkbLoadDpy(dpy) LockDisplay(dpy); xkbi->desc = desc; - _XkbGetConverters(_XkbGetCharset(),&xkbi->cvt); - _XkbGetConverters("ISO8859-1",&xkbi->latin1cvt); UnlockDisplay(dpy); oldEvents= xkbi->selected_events; if (!(xkbi->xlib_ctrls&XkbLC_IgnoreNewKeyboards)) { @@ -600,12 +529,7 @@ _XkbLoadDpy(dpy) } void -#if NeedFunctionPrototypes _XkbReloadDpy(Display *dpy) -#else -_XkbReloadDpy(dpy) - Display *dpy; -#endif { XkbInfoPtr xkbi; XkbDescRec *desc; @@ -648,56 +572,37 @@ _XkbReloadDpy(dpy) } int -#if NeedFunctionPrototypes XkbTranslateKeySym( register Display * dpy, register KeySym * sym_rtrn, unsigned int mods, char * buffer, int nbytes, int * extra_rtrn) -#else -XkbTranslateKeySym(dpy, sym_rtrn, mods, buffer, nbytes, extra_rtrn) - register Display *dpy; - register KeySym *sym_rtrn; - unsigned int mods; - char *buffer; - int nbytes; - int *extra_rtrn; -#endif { register XkbInfoPtr xkb; XkbKSToMBFunc cvtr; XPointer priv; char tmp[4]; - register struct _XKeytrans *p; int n; + xkb= dpy->xkb_info; + if (!xkb->cvt.KSToMB) { + _XkbGetConverters(_XkbGetCharset(),&xkb->cvt); + _XkbGetConverters("ISO8859-1",&xkb->latin1cvt); + } + if (extra_rtrn) *extra_rtrn= 0; - if (_XkbUnavailable(dpy)) - return _XTranslateKeySym(dpy, *sym_rtrn, mods, buffer, nbytes); - _XkbCheckPendingRefresh(dpy,dpy->xkb_info); - - xkb= dpy->xkb_info; if ((buffer==NULL)||(nbytes==0)) { buffer= tmp; nbytes= 4; } /* see if symbol rebound, if so, return that string. */ - for (p = dpy->key_bindings; p; p = p->next) { - if (((mods & AllMods) == p->state) && (*sym_rtrn == p->key)) { - int tmp = p->len; - if (tmp > nbytes) { - if (extra_rtrn) - *extra_rtrn= tmp-nbytes; - tmp = nbytes; - } - memcpy (buffer, p->string, tmp); - return tmp; - } - } + n = XkbLookupKeyBinding(dpy,*sym_rtrn,mods,buffer,nbytes,extra_rtrn); + if (n) + return n; if ( nbytes>0 ) buffer[0]= '\0'; @@ -717,35 +622,23 @@ XkbTranslateKeySym(dpy, sym_rtrn, mods, buffer, nbytes, extra_rtrn) if ((!xkb->cvt.KSToUpper)&&( mods&LockMask )) { register int i; - - if (!xkb->cvt.KSToUpper) { - int change; - char ch; - for (i=change=0;i<n;i++) { - ch= toupper(buffer[i]); - change= (change||(buffer[i]!=ch)); - buffer[i] = ch; - } - if (change) { - if (n==1) - *sym_rtrn=(*xkb->cvt.MBToKS)(xkb->cvt.MBToKSPriv, - buffer,n,0); - else *sym_rtrn= NoSymbol; - } + int change; + char ch; + for (i=change=0;i<n;i++) { + ch= toupper(buffer[i]); + change= (change||(buffer[i]!=ch)); + buffer[i] = ch; + } + if (change) { + if (n==1) + *sym_rtrn=(*xkb->cvt.MBToKS)(xkb->cvt.MBToKSPriv,buffer,n,0); + else *sym_rtrn= NoSymbol; } } if ( mods&ControlMask ) { if ( n==1 ) { - register char c = buffer[0]; - - if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F; - else if (c == '2') c = '\000'; - else if (c >= '3' && c <= '7') c -= ('3' - '\033'); - else if (c == '8') c = '\177'; - else if (c == '/') c = '_' & 0x1F; - - buffer[0]= c; + buffer[0]= XkbToControl(buffer[0]); if ( nbytes>1 ) buffer[1]= '\0'; return 1; @@ -758,38 +651,54 @@ XkbTranslateKeySym(dpy, sym_rtrn, mods, buffer, nbytes, extra_rtrn) } int -#if NeedFunctionPrototypes XLookupString ( register XKeyEvent * event, char * buffer, int nbytes, KeySym * keysym, XComposeStatus * status) -#else -XLookupString (event, buffer, nbytes, keysym, status) - register XKeyEvent *event; - char *buffer; /* buffer */ - int nbytes; /* space in buffer for characters */ - KeySym *keysym; - XComposeStatus *status; -#endif { KeySym dummy; int rtrnLen; unsigned int new_mods; Display *dpy = event->display; - XkbDescPtr xkb; - - if (_XkbUnavailable(dpy)) - return _XLookupString(event, buffer, nbytes, keysym, status); - _XkbCheckPendingRefresh(dpy,dpy->xkb_info); if (keysym==NULL) keysym= &dummy; - xkb= dpy->xkb_info->desc; - if (!XkbTranslateKeyCode(xkb,event->keycode,event->state, &new_mods,keysym)) + if (!XkbLookupKeySym(dpy,event->keycode,event->state, &new_mods,keysym)) return 0; new_mods= (event->state&(~new_mods)); + /* find the group where a symbol can be converted to control one */ + if (new_mods&ControlMask && *keysym > 0x7F && + (dpy->xkb_info->xlib_ctrls & XkbLC_ControlFallback)) { + XKeyEvent tmp_ev = *event; + KeySym tmp_keysym; + unsigned int tmp_new_mods; + if (_XkbUnavailable(dpy)) { + tmp_ev.state= event->state ^ dpy->mode_switch; + if (XkbLookupKeySym(dpy, tmp_ev.keycode, tmp_ev.state, + &tmp_new_mods, &tmp_keysym) && + tmp_keysym != NoSymbol && tmp_keysym < 0x80 ) { + *keysym = tmp_keysym; + } + } else { + int n = XkbKeyNumGroups(dpy->xkb_info->desc, tmp_ev.keycode); + int i; + for (i = 0; i < n; i++) { + if (XkbGroupForCoreState(event->state) == i) + continue; + tmp_ev.state= XkbBuildCoreState(tmp_ev.state, i); + if (XkbLookupKeySym(dpy, tmp_ev.keycode, tmp_ev.state, + &tmp_new_mods, &tmp_keysym) && + tmp_keysym != NoSymbol && tmp_keysym < 0x80 ) { + *keysym = tmp_keysym; + new_mods= (event->state&(~tmp_new_mods)); + break; + } + } + } + } + #ifdef USE_OWN_COMPOSE if ( status ) { static int been_here= 0; @@ -887,44 +796,25 @@ XLookupString (event, buffer, nbytes, keysym, status) /* We *should* use the new_mods (which does not contain any modifiers */ /* that were used to compute the symbol here, but pre-XKB XLookupString */ /* did not and we have to remain compatible. Sigh. */ - if ((dpy->xkb_info->flags&XkbLC_ConsumeLookupMods)==0) + if (_XkbUnavailable(dpy) || + (dpy->xkb_info->xlib_ctrls&XkbLC_ConsumeLookupMods)==0) new_mods= event->state; rtrnLen= XkbLookupKeyBinding(dpy,*keysym,new_mods,buffer,nbytes,NULL); if (rtrnLen>0) return rtrnLen; - rtrnLen = XkbTranslateKeySym(dpy,keysym,new_mods,buffer,nbytes,NULL); - if ((event->state&ControlMask)&&(nbytes>0)&& - ((rtrnLen==0)||((rtrnLen==1)&&(buffer[0]>=' ')))&& - (XkbGroupForCoreState(event->state)!=XkbGroup1Index)&& - (dpy->xkb_info->xlib_ctrls&XkbLC_ControlFallback)) { - XKeyEvent tmp_ev; - tmp_ev= *event; - tmp_ev.state= XkbBuildCoreState(event->state,XkbGroup1Index); - return XLookupString (&tmp_ev, buffer, nbytes, keysym, status); - } - return rtrnLen; + return XkbTranslateKeySym(dpy,keysym,new_mods,buffer,nbytes,NULL); } int -#if NeedFunctionPrototypes XkbLookupKeyBinding( Display * dpy, register KeySym sym, unsigned int mods, char * buffer, int nbytes, int * extra_rtrn) -#else -XkbLookupKeyBinding(dpy, sym, mods, buffer, nbytes, extra_rtrn) - Display *dpy; - register KeySym sym; - unsigned int mods; - char *buffer; - int nbytes; - int * extra_rtrn; -#endif { register struct _XKeytrans *p; @@ -947,13 +837,10 @@ XkbLookupKeyBinding(dpy, sym, mods, buffer, nbytes, extra_rtrn) } char -#if NeedFunctionPrototypes -XkbToControl( char c ) -#else -XkbToControl( c ) - char c; -#endif +XkbToControl( char ch ) { + register char c = ch; + if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F; else if (c == '2') c = '\000'; else if (c >= '3' && c <= '7') c -= ('3' - '\033'); |