diff options
Diffstat (limited to 'src/xkb/XKBBind.c')
-rw-r--r-- | src/xkb/XKBBind.c | 186 |
1 files changed, 41 insertions, 145 deletions
diff --git a/src/xkb/XKBBind.c b/src/xkb/XKBBind.c index 138331d0..7ab1f2d3 100644 --- a/src/xkb/XKBBind.c +++ b/src/xkb/XKBBind.c @@ -26,11 +26,12 @@ other dealings in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/lib/X11/XKBBind.c,v 3.15 2003/02/15 17:49:01 dawes Exp $ */ +/* $XFree86: xc/lib/X11/XKBBind.c,v 3.20 2003/11/17 22:20:09 dawes 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> @@ -49,9 +50,7 @@ from The Open Group. Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask) static int _XkbLoadDpy( -#if NeedFunctionPrototypes Display *dpy -#endif ); struct _XKeytrans { @@ -65,7 +64,6 @@ struct _XKeytrans { }; KeySym -#if NeedFunctionPrototypes XkbKeycodeToKeysym(Display *dpy, #if NeedWidePrototypes unsigned int kc, @@ -74,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; @@ -109,7 +100,6 @@ XkbKeycodeToKeysym(dpy, kc, group, level) } KeySym -#if NeedFunctionPrototypes XKeycodeToKeysym(Display *dpy, #if NeedWidePrototypes unsigned int kc, @@ -117,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; @@ -167,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; @@ -198,12 +176,7 @@ XKeysymToKeycode(dpy, ks) } static int -#if NeedFunctionPrototypes _XkbComputeModmap(Display *dpy) -#else -_XkbComputeModmap(dpy) - Display *dpy; -#endif { register XkbDescPtr xkb; @@ -214,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; @@ -249,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)) @@ -270,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); @@ -312,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; @@ -400,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; @@ -448,12 +383,7 @@ XkbRefreshKeyboardMapping(event) } int -#if NeedFunctionPrototypes XRefreshKeyboardMapping(register XMappingEvent *event) -#else -XRefreshKeyboardMapping(event) - register XMappingEvent *event; -#endif { XkbEvent *xkbevent = (XkbEvent *)event; Display *dpy = event->display; @@ -537,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; @@ -561,12 +492,7 @@ XRefreshKeyboardMapping(event) } static int -#if NeedFunctionPrototypes _XkbLoadDpy(Display *dpy) -#else -_XkbLoadDpy(dpy) - Display *dpy; -#endif { XkbInfoPtr xkbi; unsigned query,oldEvents; @@ -603,12 +529,7 @@ _XkbLoadDpy(dpy) } void -#if NeedFunctionPrototypes _XkbReloadDpy(Display *dpy) -#else -_XkbReloadDpy(dpy) - Display *dpy; -#endif { XkbInfoPtr xkbi; XkbDescRec *desc; @@ -651,22 +572,12 @@ _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; @@ -740,34 +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 (keysym==NULL) keysym= &dummy; - xkb= dpy->xkb_info->desc; 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; @@ -873,47 +804,17 @@ XLookupString (event, buffer, nbytes, keysym, status) if (rtrnLen>0) return rtrnLen; - rtrnLen = XkbTranslateKeySym(dpy,keysym,new_mods,buffer,nbytes,NULL); - - if ((event->state&ControlMask)&&(nbytes>0)&& - ((rtrnLen==0)|| - ((rtrnLen==1)&&((unsigned char) buffer[0]>=' ')))&& - (dpy->xkb_info->xlib_ctrls&XkbLC_ControlFallback)) { - XKeyEvent tmp_ev; - tmp_ev= *event; - if (_XkbUnavailable(dpy)) { - if (event->state & dpy->mode_switch) { - tmp_ev.state= event->state & ~dpy->mode_switch; - return XLookupString (&tmp_ev, buffer, nbytes, keysym, status); - } - } else { - if (XkbGroupForCoreState(event->state) != XkbGroup1Index) { - 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; @@ -936,12 +837,7 @@ XkbLookupKeyBinding(dpy, sym, mods, buffer, nbytes, extra_rtrn) } char -#if NeedFunctionPrototypes XkbToControl( char ch ) -#else -XkbToControl( ch ) - char ch; -#endif { register char c = ch; |