diff options
author | dawes <dawes> | 1996-03-04 04:19:15 +0000 |
---|---|---|
committer | dawes <dawes> | 1996-03-04 04:19:15 +0000 |
commit | 452696362c65cbc2e1a28ebaf4cc3cda51768cdb (patch) | |
tree | 8af6c55ab1e113b3b1ecb9715f4623d34a0f8b0d | |
parent | da54b06c97668c57466ee892cdfc1dbbae5560b1 (diff) |
updates
-rw-r--r-- | Imakefile | 5 | ||||
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | lib/X11/XKBBind.c | 665 | ||||
-rw-r--r-- | lib/X11/XKBCompat.c | 314 | ||||
-rw-r--r-- | lib/X11/XKBCvt.c | 63 | ||||
-rw-r--r-- | lib/X11/XKBMAlloc.c | 222 | ||||
-rw-r--r-- | lib/X11/XKBMisc.c | 22 | ||||
-rw-r--r-- | lib/X11/XKBSetGeom.c | 2 | ||||
-rw-r--r-- | lib/X11/XKBSetMap.c | 652 | ||||
-rw-r--r-- | lib/X11/XKBUse.c | 420 | ||||
-rw-r--r-- | lib/X11/XKBlib.h | 1270 | ||||
-rw-r--r-- | lib/xkbfile/XKBfile.h | 19 |
12 files changed, 2638 insertions, 1020 deletions
@@ -1,5 +1,5 @@ XCOMM $XConsortium: Imakefile /main/135 1996/02/02 19:03:12 gildea $ -XCOMM $XFree86: xc/Imakefile,v 3.8 1996/01/21 01:47:05 dawes Exp $ +XCOMM $XFree86: xc/Imakefile,v 3.9 1996/02/10 10:35:13 dawes Exp $ #define IHaveSubdirs #define PassCDebugFlags CDEBUGFLAGS="$(CDEBUGFLAGS)" @@ -57,6 +57,9 @@ clean:: MAKE_OPTS = -f xmakefile +World:: + $(MAKE) $(MFLAGS) $(MAKE_OPTS) $(PARALLELOPTS) all + Everything:: @echo "" @echo Rebuilding $(RELEASE) of the X Window System. @@ -1,5 +1,5 @@ # $XConsortium: Makefile /main/33 1996/02/02 19:03:18 gildea $ -# $XFree86: xc/Makefile,v 3.3 1996/01/24 21:51:40 dawes Exp $ +# $XFree86: xc/Makefile,v 3.4 1996/02/10 10:35:14 dawes Exp $ # Luna users will need to either run make as "make MAKE=make" # or add "MAKE = make" to this file. @@ -53,7 +53,7 @@ World: $(MAKE_CMD) $(MFLAGS) clean BOOTSTRAPSUBDIRS= $(MAKE_CMD) $(MFLAGS) includes $(MAKE_CMD) $(MFLAGS) depend - $(MAKE_CMD) $(MFLAGS) $(WORLDOPTS) + $(MAKE_CMD) $(MFLAGS) $(WORLDOPTS) World @echo "" @date @echo "" diff --git a/lib/X11/XKBBind.c b/lib/X11/XKBBind.c index 977bc6b16..4803dcc40 100644 --- a/lib/X11/XKBBind.c +++ b/lib/X11/XKBBind.c @@ -1,4 +1,4 @@ -/* $XConsortium: XKBBind.c,v 1.8 94/04/17 20:21:34 erik Exp $ */ +/* $XConsortium: XKBBind.c /main/19 1996/03/01 14:29:21 kaleb $ */ /* Copyright (c) 1985, 1987, 1994 X Consortium @@ -28,8 +28,7 @@ other dealings in this Software without prior written authorization from the X Consortium. */ - -/* Beware, here be monsters (still under construction... - JG */ + /* the new monsters ate the old ones */ #define NEED_EVENTS #include <X11/Xlibint.h> @@ -42,18 +41,34 @@ from the X Consortium. #include <X11/extensions/XKBproto.h> #include "XKBlibint.h" -#if defined(__sgi) && defined(USE_OWN_COMPOSE) +#ifdef USE_OWN_COMPOSE +#define COMPOSE_NO_CONST_MEMBERS +#include "imComp.h" +#endif + +#ifdef USE_SGI_COMPOSE_SUPPORT #define COMPOSE_NO_CONST_MEMBERS +#define USE_OWN_COMPOSE #include "Compose.h" +#define XimCompInitTables ComposeInitTables +#define XimCompLegalStatus ComposeLegalStatus +#define XimCompIsComposeKey IsComposeKey +#define XimCompRtrn ComposeRtrn +#define XimCompProcessSym ComposeProcessSym +#define XIM_COMP_IGNORE COMPOSE_IGNORE +#define XIM_COMP_IN_PROGRESS COMPOSE_IN_PROGRESS +#define XIM_COMP_FAIL COMPOSE_FAIL +#define XIM_COMP_SUCCEED COMPOSE_SUCCEED #endif #define AllMods (ShiftMask|LockMask|ControlMask| \ Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask) -#define Is_KP_Keysym(k) ((((k) >= XK_KP_0) && ((k) <= XK_KP_9)) || \ - ((k) == XK_KP_Decimal) || ((k)==XK_KP_Separator)) - -static int _XkbLoadDpy(); +static int _XkbLoadDpy( +#if NeedFunctionPrototypes + Display *dpy +#endif +); struct _XKeytrans { struct _XKeytrans *next;/* next on list */ @@ -65,22 +80,52 @@ struct _XKeytrans { int mlen; /* length of modifier list */ }; -#define XKB_UNAVAILABLE(d) \ - (((d)->flags&XlibDisplayNoXkb) ||\ - ((!(d)->xkb_info || (!(d)->xkb_info->desc)) && !_XkbLoadDpy(d))) - -#define CHECK_PENDING_REFRESH(d) {\ - if ((d)->xkb_info->flags&XkbMapPending) {\ - if (XkbRefreshMap(dpy,(d)->xkb_info->desc, &dpy->xkb_info->changes)) {\ - LockDisplay(dpy);\ - dpy->xkb_info->changes.changed= 0;\ - UnlockDisplay(dpy);\ - }\ - }\ +KeySym +#if NeedFunctionPrototypes +XkbKeycodeToKeysym(Display *dpy, +#if NeedWidePrototypes + unsigned int kc, +#else + KeyCode kc, +#endif + int group, + int level) +#else +XkbKeycodeToKeysym(dpy, kc, group, level) + Display *dpy; + KeyCode kc; + int group; + int level; +#endif +{ + XkbDescRec *xkb; + + if (_XkbUnavailable(dpy)) + return NoSymbol; + + _XkbCheckPendingRefresh(dpy,dpy->xkb_info); + + xkb = dpy->xkb_info->desc; + if ((kc<xkb->min_key_code)||(kc>xkb->max_key_code)) + return NoSymbol; + + if ((group<0)||(level<0)||(group>=XkbKeyNumGroups(xkb,kc))) + return NoSymbol; + if (level>=XkbKeyGroupWidth(xkb,kc,group)) { + /* for compatibility with the core protocol, _always_ allow */ + /* two symbols in the first two groups. If either of the */ + /* two is of type ONE_LEVEL, just replicate the first symbol */ + if ((group>XkbGroup2Index)||(XkbKeyGroupWidth(xkb,kc,group)!=1)|| + (level!=1)) { + return NoSymbol; + } + level= 0; + } + return XkbKeySymEntry(xkb,kc,level,group); } -#if NeedFunctionPrototypes KeySym +#if NeedFunctionPrototypes XKeycodeToKeysym(Display *dpy, #if NeedWidePrototypes unsigned int kc, @@ -89,41 +134,68 @@ XKeycodeToKeysym(Display *dpy, #endif int col) #else -KeySym XKeycodeToKeysym(dpy, kc, col) Display *dpy; KeyCode kc; int col; #endif { - int offset; XkbDescRec *xkb; - if (XKB_UNAVAILABLE(dpy)) - return _XKeycodeToKeysym(dpy,kc,col); + if (_XkbUnavailable(dpy)) + return _XKeycodeToKeysym(dpy, kc, col); - CHECK_PENDING_REFRESH(dpy); + _XkbCheckPendingRefresh(dpy,dpy->xkb_info); xkb = dpy->xkb_info->desc; if ((kc<xkb->min_key_code)||(kc>xkb->max_key_code)) return NoSymbol; - - if (( col<0 ) || (col>=(int)XkbKeyNumSyms(xkb,kc))) - return NoSymbol; - return XkbKeySym(xkb,kc,col); + if (col>3) { + int lastSym,tmp,nGrp; + + lastSym= 3; + nGrp= XkbKeyNumGroups(xkb,kc); + if ((nGrp>0)&&((tmp=XkbKeyGroupWidth(xkb,kc,XkbGroup1Index))>2)) { + if (col<=(lastSym+tmp-2)) + return XkbKeycodeToKeysym(dpy,kc,XkbGroup1Index,col-lastSym+2); + lastSym+= tmp-2; + } + if ((nGrp>1)&&((tmp=XkbKeyGroupWidth(xkb,kc,XkbGroup2Index))>2)) { + if (col<=(lastSym+tmp-2)) + return XkbKeycodeToKeysym(dpy,kc,XkbGroup2Index,col-lastSym+2); + lastSym+= tmp-2; + } + if (nGrp>2) { + tmp= XkbKeyGroupWidth(xkb,kc,XkbGroup3Index); + if (col<=lastSym+tmp) + return XkbKeycodeToKeysym(dpy,kc,XkbGroup3Index,col-lastSym); + lastSym+= tmp; + } + if (nGrp>3) { + tmp= XkbKeyGroupWidth(xkb,kc,XkbGroup4Index); + if (col<=lastSym+tmp) + return XkbKeycodeToKeysym(dpy,kc,XkbGroup4Index,col-lastSym); + } + return NoSymbol; + } + return XkbKeycodeToKeysym(dpy,kc,(col>>1),(col&1)); } KeyCode +#if NeedFunctionPrototypes +XKeysymToKeycode(Display *dpy, KeySym ks) +#else XKeysymToKeycode(dpy, ks) Display *dpy; KeySym ks; +#endif { register int i, j, gotOne; - if (XKB_UNAVAILABLE(dpy)) + if (_XkbUnavailable(dpy)) return _XKeysymToKeycode(dpy,ks); - CHECK_PENDING_REFRESH(dpy); + _XkbCheckPendingRefresh(dpy,dpy->xkb_info); j= 0; do { @@ -142,50 +214,40 @@ XKeysymToKeycode(dpy, ks) } static int +#if NeedFunctionPrototypes +_XkbComputeModmap(Display *dpy) +#else _XkbComputeModmap(dpy) Display *dpy; +#endif { -XModifierKeymap *modmap; - - if (!dpy->xkb_info) return 0; - if (dpy->xkb_info->modmap) return 1; - dpy->xkb_info->modmap= (char *)Xmalloc(dpy->xkb_info->desc->max_key_code+1); - if (!dpy->xkb_info->modmap) return 0; - bzero(dpy->xkb_info->modmap,dpy->xkb_info->desc->max_key_code+1); - modmap = XGetModifierMapping(dpy); - if (modmap) { - register int m,k; - KeyCode *map; - map= modmap->modifiermap; - for (m=0;m<8;m++) { - for (k=0;k<modmap->max_keypermod;k++,map++) { - if (((*map)>=dpy->xkb_info->desc->min_key_code)&& - ((*map)<=dpy->xkb_info->desc->max_key_code)) { - dpy->xkb_info->modmap[*map]|= (1<<m); - } - } - } - XFreeModifiermap(modmap); +register XkbDescPtr xkb; + + xkb= dpy->xkb_info->desc; + if (XkbGetUpdatedMap(dpy,XkbModifierMapMask,xkb)==Success) return 1; - } return 0; } unsigned +#if NeedFunctionPrototypes +XkbKeysymToModifiers(Display *dpy,KeySym ks) +#else XkbKeysymToModifiers(dpy,ks) Display *dpy; KeySym ks; +#endif { XkbDescRec *xkb; register int i,j; register KeySym *pSyms; CARD8 mods; - if (XKB_UNAVAILABLE(dpy)) + if (_XkbUnavailable(dpy)) return _XKeysymToModifiers(dpy,ks); - CHECK_PENDING_REFRESH(dpy); + _XkbCheckPendingRefresh(dpy,dpy->xkb_info); - if ((!dpy->xkb_info->modmap)&&(!_XkbComputeModmap(dpy))) + if (_XkbNeedModmap(dpy->xkb_info)&&(!_XkbComputeModmap(dpy))) return _XKeysymToModifiers(dpy,ks); xkb= dpy->xkb_info->desc; @@ -194,7 +256,7 @@ XkbKeysymToModifiers(dpy,ks) pSyms= XkbKeySymsPtr(xkb,i); for (j=XkbKeyNumSyms(xkb,i)-1;j>=0;j--) { if (pSyms[j]==ks) { - mods|= dpy->xkb_info->modmap[i]; + mods|= xkb->map->modmap[i]; break; } } @@ -203,71 +265,129 @@ 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 (XKB_UNAVAILABLE(dpy)) + if (_XkbUnavailable(dpy)) return _XLookupKeysym(event, col); - CHECK_PENDING_REFRESH(dpy); + _XkbCheckPendingRefresh(dpy,dpy->xkb_info); return XKeycodeToKeysym(dpy, event->keycode, col); } -#define XkbModifiersGroup(m) (((m)>>13)&0x7) - + /* + * Not a public entry point -- XkbTranslateKey is an obsolete name + * that is preserved here so that functions linked against the old + * version will continue to work in a shared library environment. + */ int -XkbTranslateKey(dpy, keycode, modifiers, modifiers_return, keysym_return) +#if NeedFunctionPrototypes +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 keycode; - register unsigned int modifiers; - unsigned int *modifiers_return; - KeySym *keysym_return; + 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); + _XkbCheckPendingRefresh(dpy,dpy->xkb_info); + return XkbTranslateKeyCode(dpy->xkb_info->desc,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 { - register XkbInfoPtr xkb; XkbKeyTypeRec *type; - int col; - unsigned preserve; + int col,nKeyGroups; + unsigned preserve,effectiveGroup; KeySym *syms; - if (XKB_UNAVAILABLE(dpy)) - return _XTranslateKey(dpy,keycode,modifiers, - modifiers_return,keysym_return); - CHECK_PENDING_REFRESH(dpy); - - if (modifiers_return!=NULL) - *modifiers_return = modifiers; - if (((int)keycode < dpy->min_keycode) || ((int)keycode > dpy->max_keycode)) - { - if (keysym_return!=NULL) - *keysym_return = NoSymbol; - return 0; - } + if (mods_rtrn!=NULL) + *mods_rtrn = 0; - xkb= dpy->xkb_info; + nKeyGroups= XkbKeyNumGroups(xkb,key); + if ((!XkbKeycodeInRange(xkb,key))||(nKeyGroups==0)) { + if (keysym_rtrn!=NULL) + *keysym_rtrn = NoSymbol; + return False; + } - /* find the row */ - syms = XkbKeySymsPtr(xkb->desc,keycode); + syms = XkbKeySymsPtr(xkb,key); /* find the offset of the effective group */ col = 0; - type = XkbKeyKeyType(xkb->desc,keycode); - if ( XkbModifiersGroup(modifiers)!=0 ) { - unsigned effectiveGroup = XkbModifiersGroup(modifiers); - if ( effectiveGroup >= XkbKeyNumGroups(xkb->desc,keycode) ) { - if ( XkbKeyGroupsWrap(xkb->desc,keycode) ) - effectiveGroup %= XkbKeyNumGroups(xkb->desc,keycode); - else effectiveGroup = XkbKeyNumGroups(xkb->desc,keycode)-1; + effectiveGroup= XkbGroupForCoreState(mods); + if ( effectiveGroup>=nKeyGroups ) { + unsigned groupInfo= XkbKeyGroupInfo(xkb,key); + switch (XkbOutOfRangeGroupAction(groupInfo)) { + default: + effectiveGroup %= nKeyGroups; + break; + case XkbClampIntoRange: + effectiveGroup = nKeyGroups-1; + break; + case XkbRedirectIntoRange: + effectiveGroup = XkbOutOfRangeGroupNumber(groupInfo); + if (effectiveGroup>=nKeyGroups) + effectiveGroup= 0; + break; } - col= effectiveGroup*type->group_width; } + col= effectiveGroup*XkbKeyGroupsWidth(xkb,key); + type = XkbKeyKeyType(xkb,key,effectiveGroup); preserve= 0; if (type->map) { /* find the column (shift level) within the group */ register int i; register XkbKTMapEntryPtr entry; for (i=0,entry=type->map;i<type->map_count;i++,entry++) { - if ((entry->active)&&((modifiers&type->mask)==entry->mask)) { + if ((entry->active)&&((mods&type->mods.mask)==entry->mods.mask)) { col+= entry->level; if (type->preserve) preserve= type->preserve[i].mask; @@ -276,31 +396,103 @@ XkbTranslateKey(dpy, keycode, modifiers, modifiers_return, keysym_return) } } - if (keysym_return!=NULL) - *keysym_return= syms[col]; - if (modifiers_return) - *modifiers_return&= ~(type->mask&(~preserve)); + if (keysym_rtrn!=NULL) + *keysym_rtrn= syms[col]; + if (mods_rtrn) { + *mods_rtrn= type->mods.mask&(~preserve); + /* The Motif VTS doesn't get the help callback called if help + * is bound to Shift+<whatever>, and it appears as though it + * is XkbTranslateKeyCode that is causing the problem. The + * core X version of XTranslateKey always OR's in ShiftMask + * and LockMask for mods_rtrn, so this "fix" keeps this behavior + * and solves the VTS problem. + */ + if ((xkb->dpy)&&(xkb->dpy->xkb_info)&& + (xkb->dpy->xkb_info->xlib_ctrls&XkbLC_AlwaysConsumeShiftAndLock)) { + *mods_rtrn|= (ShiftMask|LockMask); + } + } return (syms[col]!=NoSymbol); } +Status +#if NeedFunctionPrototypes +XkbRefreshKeyboardMapping(register XkbMapNotifyEvent *event) +#else +XkbRefreshKeyboardMapping(event) + register XkbMapNotifyEvent *event; +#endif +{ + Display *dpy = event->display; + XkbInfoPtr xkbi; + + if (_XkbUnavailable(dpy)) { + _XRefreshKeyboardMapping((XMappingEvent *)event); + return Success; + } + xkbi= dpy->xkb_info; + + if (((event->type&0x7f)-xkbi->codes->first_event)!=XkbEventCode) + return BadMatch; + if (event->xkb_type==XkbNewKeyboardNotify) { + _XkbReloadDpy(dpy); + return Success; + } + if (event->xkb_type==XkbMapNotify) { + XkbMapChangesRec changes; + Status rtrn; + + if (xkbi->flags&XkbMapPending) + changes= xkbi->changes; + else bzero(&changes,sizeof(XkbChangesRec)); + XkbNoteMapChanges(&changes,event,XKB_XLIB_MAP_MASK); + LockDisplay(dpy); + if ((rtrn=XkbGetMapChanges(dpy,xkbi->desc,&changes))!=Success) { +#ifdef DEBUG + fprintf(stderr,"Internal Error! XkbGetMapChanges failed:\n"); +#endif + xkbi->changes= changes; + } + else if (xkbi->flags&XkbMapPending) { + xkbi->flags&= ~XkbMapPending; + bzero(&xkbi->changes,sizeof(XkbMapChangesRec)); + } + UnlockDisplay(dpy); + return rtrn; + } + return BadMatch; +} + +int +#if NeedFunctionPrototypes +XRefreshKeyboardMapping(register XMappingEvent *event) +#else XRefreshKeyboardMapping(event) register XMappingEvent *event; +#endif { - XkbAnyEvent *xkbevent = (XkbAnyEvent *)event; + XkbEvent *xkbevent = (XkbEvent *)event; Display *dpy = event->display; XkbMapChangesRec changes; XkbInfoPtr xkbi; - int modsChanged; - if (XKB_UNAVAILABLE(dpy)) + if (_XkbUnavailable(dpy)) return _XRefreshKeyboardMapping(event); xkbi = dpy->xkb_info; + if (((event->type&0x7f)-xkbi->codes->first_event)==XkbEventCode) + return XkbRefreshKeyboardMapping(&xkbevent->map); + + if (xkbi->flags&XkbXlibNewKeyboard) { + _XkbReloadDpy(dpy); + return 1; + } + if ((xkbi->flags&XkbMapPending)||(event->request==MappingKeyboard)) { if (xkbi->flags&XkbMapPending) { changes= xkbi->changes; - XkbNoteCoreMapChanges(&changes,event,XKB_XLIB_MAP_MASK); + _XkbNoteCoreMapChanges(&changes,event,XKB_XLIB_MAP_MASK); } else { bzero(&changes,sizeof(changes)); @@ -316,9 +508,9 @@ XRefreshKeyboardMapping(event) } } - if (!XkbRefreshMap(dpy,xkbi->desc, &changes)){ - fprintf(stderr,"Internal Error! XkbRefreshMap failed:\n"); + if (XkbGetMapChanges(dpy,xkbi->desc, &changes)!=Success) { #ifdef DEBUG + fprintf(stderr,"Internal Error! XkbGetMapChanges failed:\n"); if (changes.changed&XkbKeyTypesMask) { int first= changes.first_type; int last= changes.first_type+changes.num_types-1; @@ -358,9 +550,9 @@ XRefreshKeyboardMapping(event) UnlockDisplay(dpy); } if (event->request==MappingModifier) { - if (xkbi->modmap) { - Xfree(xkbi->modmap); - xkbi->modmap= NULL; + if (xkbi->desc->map->modmap) { + _XkbFree(xkbi->desc->map->modmap); + xkbi->desc->map->modmap= NULL; } if (dpy->key_bindings) { register struct _XKeytrans *p; @@ -375,22 +567,26 @@ XRefreshKeyboardMapping(event) } UnlockDisplay(dpy); } - return; + return 1; } static int +#if NeedFunctionPrototypes +_XkbLoadDpy(Display *dpy) +#else _XkbLoadDpy(dpy) Display *dpy; +#endif { XkbInfoPtr xkbi; unsigned query,oldEvents; XkbDescRec *desc; - if (!XkbUseExtension(dpy)) + if (!XkbUseExtension(dpy,NULL,NULL)) return 0; xkbi = dpy->xkb_info; - query = XkbFullClientInfoMask; + query = XkbAllClientInfoMask; desc = XkbGetMap(dpy,query,XkbUseCoreKbd); if (!desc) { #ifdef DEBUG @@ -405,41 +601,112 @@ _XkbLoadDpy(dpy) _XkbGetConverters(xkbi->charset,&xkbi->cvt); UnlockDisplay(dpy); oldEvents= xkbi->selected_events; + if (!(xkbi->xlib_ctrls&XkbLC_IgnoreNewKeyboards)) { + XkbSelectEventDetails(dpy,xkbi->desc->device_spec,XkbNewKeyboardNotify, + XkbNKN_KeycodesMask|XkbNKN_DeviceIDMask, + XkbNKN_KeycodesMask|XkbNKN_DeviceIDMask); + } XkbSelectEventDetails(dpy,xkbi->desc->device_spec,XkbMapNotify, - XkbAllMapComponentsMask,XkbFullClientInfoMask); + XkbAllClientInfoMask,XkbAllClientInfoMask); LockDisplay(dpy); xkbi->selected_events= oldEvents; UnlockDisplay(dpy); + return 1; } -int -XkbTranslateKeySym(dpy, sym_return, modifiers, buffer, nbytes) +void +#if NeedFunctionPrototypes +_XkbReloadDpy(Display *dpy) +#else +_XkbReloadDpy(dpy) Display *dpy; - register KeySym *sym_return; - unsigned int modifiers; +#endif +{ + XkbInfoPtr xkbi; + XkbDescRec *desc; + unsigned oldDeviceID; + + if (_XkbUnavailable(dpy)) + return; + + xkbi = dpy->xkb_info; + LockDisplay(dpy); + if (xkbi->desc) { + oldDeviceID= xkbi->desc->device_spec; + XkbFreeKeyboard(xkbi->desc,XkbAllComponentsMask,True); + xkbi->desc= NULL; + xkbi->flags&= ~(XkbMapPending|XkbXlibNewKeyboard); + xkbi->changes.changed= 0; + } + else oldDeviceID= XkbUseCoreKbd; + UnlockDisplay(dpy); + desc = XkbGetMap(dpy,XkbAllClientInfoMask,XkbUseCoreKbd); + if (!desc) + return; + LockDisplay(dpy); + xkbi->desc = desc; + UnlockDisplay(dpy); + + if (desc->device_spec!=oldDeviceID) { + /* transfer(?) event masks here */ +#ifdef NOTYET + unsigned oldEvents; + oldEvents= xkbi->selected_events; + XkbSelectEventDetails(dpy,xkbi->desc->device_spec,XkbMapNotify, + XkbAllMapComponentsMask,XkbAllClientInfoMask); + LockDisplay(dpy); + xkbi->selected_events= oldEvents; + UnlockDisplay(dpy); +#endif + } + return; +} + +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; char tmp[4]; - register XkbInfoPtr xkb; register struct _XKeytrans *p; int n; - if (XKB_UNAVAILABLE(dpy)) - return _XTranslateKeySym(dpy,*sym_return,modifiers,buffer,nbytes); - CHECK_PENDING_REFRESH(dpy); + 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; } - xkb = dpy->xkb_info; /* see if symbol rebound, if so, return that string. */ for (p = dpy->key_bindings; p; p = p->next) { - if (((modifiers & AllMods) == p->state) && (*sym_return == p->key)) { + if (((mods & AllMods) == p->state) && (*sym_rtrn == p->key)) { int tmp = p->len; - if (tmp > nbytes) tmp = nbytes; + if (tmp > nbytes) { + if (extra_rtrn) + *extra_rtrn= tmp-nbytes; + tmp = nbytes; + } memcpy (buffer, p->string, tmp); return tmp; } @@ -448,12 +715,13 @@ XkbTranslateKeySym(dpy, sym_return, modifiers, buffer, nbytes) if ( nbytes>0 ) buffer[0]= '\0'; - if ( xkb->cvt.KSToUpper && (modifiers&LockMask) ) { - *sym_return = (*xkb->cvt.KSToUpper)(*sym_return); + if ( xkb->cvt.KSToUpper && (mods&LockMask) ) { + *sym_rtrn = (*xkb->cvt.KSToUpper)(*sym_rtrn); } - n = (*xkb->cvt.KSToMB)(xkb->cvt.KSToMBPriv,*sym_return,buffer,nbytes,NULL); + n = (*xkb->cvt.KSToMB)(xkb->cvt.KSToMBPriv,*sym_rtrn,buffer,nbytes, + extra_rtrn); - if ((!xkb->cvt.KSToUpper)&&( modifiers&LockMask )) { + if ((!xkb->cvt.KSToUpper)&&( mods&LockMask )) { register int i; if (!xkb->cvt.KSToUpper) { @@ -466,14 +734,14 @@ XkbTranslateKeySym(dpy, sym_return, modifiers, buffer, nbytes) } if (change) { if (n==1) - *sym_return=(*xkb->cvt.MBToKS)(xkb->cvt.MBToKSPriv, + *sym_rtrn=(*xkb->cvt.MBToKS)(xkb->cvt.MBToKSPriv, buffer,n,0); - else *sym_return= NoSymbol; + else *sym_rtrn= NoSymbol; } } } - if ( modifiers&ControlMask ) { + if ( mods&ControlMask ) { if ( n==1 ) { register char c = buffer[0]; @@ -496,57 +764,88 @@ XkbTranslateKeySym(dpy, sym_return, modifiers, buffer, nbytes) } 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 (XKB_UNAVAILABLE(dpy)) + if (_XkbUnavailable(dpy)) return _XLookupString(event, buffer, nbytes, keysym, status); - CHECK_PENDING_REFRESH(dpy); + _XkbCheckPendingRefresh(dpy,dpy->xkb_info); if (keysym==NULL) keysym= &dummy; - - if (!XkbTranslateKey(dpy,event->keycode,event->state, &new_mods,keysym)) + xkb= dpy->xkb_info->desc; + if (!XkbTranslateKeyCode(xkb,event->keycode,event->state, &new_mods,keysym)) return 0; + new_mods= (event->state&(~new_mods)); -#if defined(__sgi) && defined(USE_OWN_COMPOSE) +#ifdef USE_OWN_COMPOSE if ( status ) { static int been_here= 0; if ( !been_here ) { - ComposeInitTables(); + XimCompInitTables(); been_here = 1; } - if ( !ComposeLegalStatus(status) ) { + if ( !XimCompLegalStatus(status) ) { status->compose_ptr = NULL; status->chars_matched = 0; } if ( ((status->chars_matched>0)&&(status->compose_ptr!=NULL)) || - IsComposeKey(*keysym,event->keycode,status) ) { - ComposeRtrn rtrn; - switch (ComposeProcessSym(status,*keysym,&rtrn)) { - case COMPOSE_IGNORE: + XimCompIsComposeKey(*keysym,event->keycode,status) ) { + XimCompRtrn rtrn; + + switch (XimCompProcessSym(status,*keysym,&rtrn)) { + case XIM_COMP_IGNORE: break; - case COMPOSE_IN_PROGRESS: + case XIM_COMP_IN_PROGRESS: if ( keysym!=NULL ) *keysym = NoSymbol; +#ifndef NO_COMPOSE_LED + if ( dpy->xkb_info->xlib_ctrls&XkbLC_ComposeLED ) { + XkbSetNamedIndicator(dpy,dpy->xkb_info->composeLED, + True,True,False,NULL); + } +#endif return 0; - case COMPOSE_FAIL: + case XIM_COMP_FAIL: { + static Atom _ComposeFail= None; int n = 0, len= 0; +#ifndef NO_COMPOSE_LED + if ( dpy->xkb_info->xlib_ctrls&XkbLC_ComposeLED ) { + XkbSetNamedIndicator(dpy,dpy->xkb_info->composeLED, + True,False,False,NULL); + } +#endif +#ifndef NO_BELL_ON_COMPOSE_FAIL + if (dpy->xkb_info->xlib_ctrls&XkbLC_BeepOnComposeFail) { + if (_ComposeFail==None) + _ComposeFail= XInternAtom(dpy,"ComposeFail",0); + XkbBell(dpy,event->window,0,_ComposeFail); + } +#endif for (n=len=0;rtrn.sym[n]!=XK_VoidSymbol;n++) { if ( nbytes-len > 0 ) { - len+= _XTranslateKeySym(event->display,&rtrn.sym[n], - new_mods, - buffer+len,nbytes-len); + len+= XkbTranslateKeySym(dpy,&rtrn.sym[n],new_mods, + buffer+len,nbytes-len, + NULL); } } if ( keysym!=NULL ) { @@ -555,26 +854,33 @@ XLookupString (event, buffer, nbytes, keysym, status) } return len; } - case COMPOSE_SUCCEED: + case XIM_COMP_SUCCEED: { int len,n = 0; +#ifndef NO_COMPOSE_LED + if ( dpy->xkb_info->xlib_ctrls&XkbLC_ComposeLED ) { + XkbSetNamedIndicator(dpy,dpy->xkb_info->composeLED, + True,False,False,NULL); + } +#endif *keysym = rtrn.matchSym; if ( rtrn.str[0]!='\0' ) { strncpy(buffer,rtrn.str,nbytes-1); buffer[nbytes-1]= '\0'; - len = strlen(buffer); + len = (int)strlen(buffer); } else { - len = XkbTranslateKeySym(event->display,keysym, - new_mods, - buffer,nbytes); + len = XkbTranslateKeySym(dpy,keysym,new_mods, + buffer,nbytes, + NULL); } for (n=0;rtrn.sym[n]!=XK_VoidSymbol;n++) { if ( nbytes-len > 0 ) { - len+= _XTranslateKeySym(event->display,rtrn.sym[n], + len+= XkbTranslateKeySym(dpy,&rtrn.sym[n], event->state, - buffer+len,nbytes-len); + buffer+len,nbytes-len, + NULL); } } return len; @@ -584,27 +890,60 @@ XLookupString (event, buffer, nbytes, keysym, status) } #endif - rtrnLen = XkbTranslateKeySym(dpy,keysym,new_mods,buffer,nbytes); + /* 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) + 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->flags&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; } int -XkbLookupKeyBinding(dpy, sym_return, modifiers, buffer, nbytes) +#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_return; - unsigned int modifiers; + register KeySym sym; + unsigned int mods; char *buffer; int nbytes; + int * extra_rtrn; +#endif { - char tmp[4]; register struct _XKeytrans *p; - int n; + if (extra_rtrn) + *extra_rtrn= 0; for (p = dpy->key_bindings; p; p = p->next) { - if (((modifiers & AllMods) == p->state) && (*sym_return == p->key)) { + if (((mods & AllMods) == p->state) && (sym == p->key)) { int tmp = p->len; - if (tmp > nbytes) tmp = nbytes; + if (tmp > nbytes) { + if (extra_rtrn) + *extra_rtrn= (tmp-nbytes); + tmp = nbytes; + } memcpy (buffer, p->string, tmp); if (tmp < nbytes) buffer[tmp]= '\0'; return tmp; @@ -614,8 +953,12 @@ XkbLookupKeyBinding(dpy, sym_return, modifiers, buffer, nbytes) } char +#if NeedFunctionPrototypes +XkbToControl( char c ) +#else XkbToControl( c ) char c; +#endif { if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F; else if (c == '2') c = '\000'; diff --git a/lib/X11/XKBCompat.c b/lib/X11/XKBCompat.c index d02b4aa60..4a1b81650 100644 --- a/lib/X11/XKBCompat.c +++ b/lib/X11/XKBCompat.c @@ -1,4 +1,4 @@ -/* $XConsortium: XKBCompat.c,v 1.2 94/04/08 15:10:49 erik Exp $ */ +/* $XConsortium: XKBCompat.c /main/8 1996/03/01 14:29:32 kaleb $ */ /************************************************************ Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. @@ -28,32 +28,43 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include <stdio.h> #define NEED_REPLIES #define NEED_EVENTS +#define NEED_MAP_READERS #include "Xlibint.h" #include <X11/extensions/XKBproto.h> #include "XKBlibint.h" -static Status -_XkbReadGetCompatMapReply(dpy,rep,xkb) +Status +#if NeedFunctionPrototypes +_XkbReadGetCompatMapReply( Display * dpy, + xkbGetCompatMapReply * rep, + XkbDescPtr xkb, + int * nread_rtrn) +#else +_XkbReadGetCompatMapReply(dpy,rep,xkb,nread_rtrn) Display * dpy; xkbGetCompatMapReply * rep; XkbDescPtr xkb; + int * nread_rtrn; +#endif { register int i; XkbReadBufferRec buf; -int nMods,nVMods; - if (!_XkbInitReadBuffer(dpy,&buf,rep->length*4)) - return False; + if (!_XkbInitReadBuffer(dpy,&buf,(int)rep->length*4)) + return BadAlloc; + if (nread_rtrn) + *nread_rtrn= (int)rep->length*4; + + i= rep->firstSI+rep->nSI; if ((!xkb->compat)&& - (!XkbAllocCompatMap(xkb,XkbAllCompatMask,rep->firstSI+rep->nSI-1))) - return False; + (XkbAllocCompatMap(xkb,XkbAllCompatMask,i)!=Success)) + return BadAlloc; if (rep->nSI!=0) { XkbSymInterpretRec *syms; xkbSymInterpretWireDesc *wire; - int lastSI= rep->firstSI+rep->nSI-1; wire= (xkbSymInterpretWireDesc *)_XkbGetReadBufferPtr(&buf, rep->nSI*SIZEOF(xkbSymInterpretWireDesc)); if (wire==NULL) @@ -70,78 +81,57 @@ int nMods,nVMods; } xkb->compat->num_si+= rep->nSI; } - nMods= nVMods= 0; - - if (rep->mods) { - register int bit; - xkbModCompatWireDesc *wire; - - for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) { - if (rep->mods&bit) - nMods++; - } - wire= (xkbModCompatWireDesc *)_XkbGetReadBufferPtr(&buf, - sz_xkbModCompatWireDesc*nMods); - if (wire==NULL) - goto BAILOUT; - for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) { - if (rep->mods&bit) { - xkb->compat->real_mod_compat[i].mods= wire->mods; - xkb->compat->real_mod_compat[i].groups= wire->groups; - wire++; - } - } - } - if (rep->virtualMods) { - register int bit; - xkbModCompatWireDesc *wire; - for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (rep->virtualMods&bit) - nVMods++; + if (rep->groups&XkbAllGroupsMask) { + register unsigned bit,nGroups; + xkbModsWireDesc * wire; + for (i=0,nGroups=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) { + if (rep->groups&bit) + nGroups++; } - wire= (xkbModCompatWireDesc *)_XkbGetReadBufferPtr(&buf, - sz_xkbModCompatWireDesc*nVMods); + wire= (xkbModsWireDesc *)_XkbGetReadBufferPtr(&buf, + nGroups*SIZEOF(xkbModsWireDesc)); if (wire==NULL) goto BAILOUT; - for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (rep->virtualMods&bit) { - xkb->compat->vmod_compat[i].mods= wire->mods; - xkb->compat->vmod_compat[i].groups= wire->groups; - wire++; - } + for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) { + if ((rep->groups&bit)==0) + continue; + xkb->compat->groups[i].mask= wire->mask; + xkb->compat->groups[i].real_mods= wire->realMods; + xkb->compat->groups[i].vmods= wire->virtualMods; + wire++; } } - i= ((nMods+nVMods)*sz_xkbModCompatWireDesc); - i= (((i+3)/4)*4)-i; - if (i>0) - _XkbSkipReadBufferData(&buf,i); - i= _XkbFreeReadBuffer(&buf); if (i) fprintf(stderr,"CompatMapReply! Bad length (%d extra bytes)\n",i); if (i || buf.error) - return False; - return True; + return BadLength; + return Success; BAILOUT: _XkbFreeReadBuffer(&buf); - return False; + return BadLength; } Status +#if NeedFunctionPrototypes +XkbGetCompatMap(Display *dpy,unsigned which,XkbDescPtr xkb) +#else XkbGetCompatMap(dpy,which,xkb) - Display *dpy; - unsigned which; - XkbDescRec *xkb; + Display * dpy; + unsigned which; + XkbDescPtr xkb; +#endif { register xkbGetCompatMapReq *req; xkbGetCompatMapReply rep; - Status ok; + Status status; XkbInfoPtr xkbi; - if ((dpy->flags & XlibDisplayNoXkb) || - (!dpy->xkb_info && !XkbUseExtension(dpy))) - return False; + if ( (!dpy) || (!xkb) || (dpy->flags & XlibDisplayNoXkb) || + ((xkb->dpy!=NULL)&&(xkb->dpy!=dpy)) || + (!dpy->xkb_info && (!XkbUseExtension(dpy,NULL,NULL)))) + return BadAccess; LockDisplay(dpy); xkbi = dpy->xkb_info; GetReq(kbGetCompatMap, req); @@ -153,53 +143,57 @@ XkbGetCompatMap(dpy,which,xkb) else req->getAllSI= False; req->firstSI= req->nSI= 0; - if (which&XkbModCompatMask) - req->mods= ~0; - else req->mods= 0; - - if (which&XkbVirtualModCompatMask) - req->virtualMods= ~0; - else req->virtualMods= 0; + if (which&XkbGroupCompatMask) + req->groups= XkbAllGroupsMask; + else req->groups= 0; if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); - return False; + return BadLength; } + if (xkb->dpy==NULL) + xkb->dpy= dpy; if (xkb->device_spec==XkbUseCoreKbd) xkb->device_spec= rep.deviceID; - ok = _XkbReadGetCompatMapReply(dpy,&rep,xkb); + status = _XkbReadGetCompatMapReply(dpy,&rep,xkb,NULL); UnlockDisplay(dpy); SyncHandle(); - return ok; + return status; } -static Status +static Bool +#if NeedFunctionPrototypes +_XkbWriteSetCompatMap(Display *dpy,xkbSetCompatMapReq *req,XkbDescPtr xkb) +#else _XkbWriteSetCompatMap(dpy,req,xkb) Display * dpy; xkbSetCompatMapReq *req; XkbDescPtr xkb; +#endif { -CARD8 mods = req->mods; -CARD16 vmods = req->virtualMods; -CARD16 firstSI = req->firstSI; -CARD16 nSI = req->nSI; -int size,nMods,nVMods; -register int i,bit; -char *buf; +CARD16 firstSI; +CARD16 nSI; +int size; +register int i,nGroups; +register unsigned bit; +unsigned groups; +char * buf; - for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) { - if (mods&bit) nMods++; - if (vmods&bit) nVMods++; - } - for (;i<XkbNumVirtualMods;i++,bit<<=1) { - if (vmods&bit) nVMods++; + firstSI = req->firstSI; + nSI = req->nSI; + size= nSI*SIZEOF(xkbSymInterpretWireDesc); + nGroups= 0; + groups= req->groups; + if (groups&XkbAllGroupsMask) { + for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) { + if (groups&bit) + nGroups++; + } + size+= SIZEOF(xkbModsWireDesc)*nGroups; } - - size= nSI*sz_xkbSymInterpretWireDesc; - size+= (((nMods*sz_xkbModCompatWireDesc)+3)/4)*4; - req->length+= (size+3)/4; + req->length+= size/4; BufAlloc(char *,buf,size); if (!buf) return False; @@ -207,52 +201,50 @@ char *buf; if (nSI) { XkbSymInterpretPtr sym= &xkb->compat->sym_interpret[firstSI]; xkbSymInterpretWireDesc *wire= (xkbSymInterpretWireDesc *)buf; - for (i=0;i<nSI;i++) { - wire->sym= sym->sym; + for (i=0;i<nSI;i++,wire++,sym++) { + wire->sym= (CARD32)sym->sym; wire->mods= sym->mods; wire->match= sym->match; wire->flags= sym->flags; wire->virtualMod= sym->virtual_mod; memcpy(&wire->act,&sym->act,sz_xkbActionWireDesc); } - buf+= nSI*sz_xkbSymInterpretWireDesc; + buf+= nSI*SIZEOF(xkbSymInterpretWireDesc); } - if (mods) { - xkbModCompatWireDesc *out= (xkbModCompatWireDesc *)buf; - for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) { - if (mods&bit) { - out->mods= xkb->compat->real_mod_compat[i].mods; - out->groups= xkb->compat->real_mod_compat[i].groups; - out++; - } - } - } - if (vmods) { - xkbModCompatWireDesc *out= (xkbModCompatWireDesc *)buf; - for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (vmods&bit) { - out->mods= xkb->compat->vmod_compat[i].mods; - out->groups= xkb->compat->vmod_compat[i].groups; + if (groups&XkbAllGroupsMask) { + xkbModsWireDesc * out; + + out= (xkbModsWireDesc *)buf; + for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) { + if ((groups&bit)!=0) { + out->mask= xkb->compat->groups[i].mask; + out->realMods= xkb->compat->groups[i].real_mods; + out->virtualMods= xkb->compat->groups[i].vmods; out++; } } + buf+= nGroups*SIZEOF(xkbModsWireDesc); } return True; } -Status +Bool +#if NeedFunctionPrototypes +XkbSetCompatMap(Display *dpy,unsigned which,XkbDescPtr xkb,Bool updateActions) +#else XkbSetCompatMap(dpy,which,xkb,updateActions) Display * dpy; unsigned which; XkbDescPtr xkb; Bool updateActions; +#endif { register xkbSetCompatMapReq *req; Status ok; XkbInfoPtr xkbi; - if ((dpy->flags & XlibDisplayNoXkb) || - (!dpy->xkb_info && !XkbUseExtension(dpy))) + if ((dpy->flags & XlibDisplayNoXkb) || (dpy!=xkb->dpy) || + (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) return False; if ((!xkb->compat) || ((which&XkbSymInterpMask)&&(!xkb->compat->sym_interpret))) @@ -274,108 +266,12 @@ XkbSetCompatMap(dpy,which,xkb,updateActions) req->firstSI= 0; req->nSI= 0; } - if (which&XkbModCompatMask) - req->mods= ~0; - else req->mods= 0; - if (which&XkbVirtualModCompatMask) - req->virtualMods= ~0; - else req->virtualMods= 0; + if (which&XkbGroupCompatMask) + req->groups= XkbAllGroupsMask; + else req->groups= 0; ok= _XkbWriteSetCompatMap(dpy,req,xkb); UnlockDisplay(dpy); SyncHandle(); return ok; } -/***====================================================================***/ - -Status -XkbAllocCompatMap(xkb,which,nInterpret) - XkbDescPtr xkb; - unsigned which; - unsigned nInterpret; -{ -register int i; -XkbCompatPtr compat; - - if (!xkb) - return False; - if (xkb->compat) { - if (xkb->compat->size_si>=nInterpret) - return True; - compat= xkb->compat; - compat->size_si= nInterpret; - i= nInterpret*sizeof(XkbSymInterpretRec); - if (compat->sym_interpret==NULL) { - compat->num_si= 0; - compat->sym_interpret= (XkbSymInterpretPtr) - Xcalloc(nInterpret,sizeof(XkbSymInterpretRec)); - } - else { - compat->sym_interpret= (XkbSymInterpretPtr) - Xrealloc(compat->sym_interpret,i); - if (compat->sym_interpret!=NULL) - bzero(&compat->sym_interpret[compat->num_si], - (nInterpret-compat->size_si)*sizeof(XkbSymInterpretRec)); - } - if (compat->sym_interpret==NULL) { - compat->size_si= compat->num_si= 0; - return False; - } - return True; - } - compat= (XkbCompatPtr)Xmalloc(sizeof(XkbCompatRec)); - if (compat==NULL) - return False; - if (nInterpret>0) { - i= nInterpret*sizeof(XkbSymInterpretRec); - compat->sym_interpret= (XkbSymInterpretPtr)Xmalloc(i); - if (!compat->sym_interpret) { - Xfree(compat); - return False; - } - bzero(compat->sym_interpret,i); - } - compat->size_si= nInterpret; - compat->num_si= 0; - for (i=0;i<XkbNumModifiers;i++) { - compat->real_mod_compat[i].mods= (1<<i); - compat->real_mod_compat[i].groups= 0; - compat->mod_compat[i]= &compat->real_mod_compat[i]; - } - bzero(compat->vmod_compat,sizeof(compat->vmod_compat)); - xkb->compat= compat; - return True; -} - - -Status -XkbFreeCompatMap(xkb,all,which) - XkbDescPtr xkb; - Bool all; - unsigned which; -{ - if ((xkb==NULL)||(xkb->compat==NULL)) - return False; - if (which&XkbModCompatMask) { - register int i; - for (i=0;i<XkbNumModifiers;i++) { - xkb->compat->real_mod_compat[i].mods= (1<<i); - xkb->compat->real_mod_compat[i].groups= 0; - xkb->compat->mod_compat[i]= &xkb->compat->real_mod_compat[i]; - } - } - if (which&XkbVirtualModCompatMask) { - bzero(xkb->compat->vmod_compat,sizeof(xkb->compat->vmod_compat)); - } - if (which&XkbSymInterpMask) { - if ((xkb->compat->sym_interpret)&&(xkb->compat->size_si>0)) - Xfree(xkb->compat->sym_interpret); - xkb->compat->size_si= xkb->compat->num_si= 0; - xkb->compat->sym_interpret= NULL; - } - if (all) { - Xfree(xkb->compat); - xkb->compat= NULL; - } - return True; -} diff --git a/lib/X11/XKBCvt.c b/lib/X11/XKBCvt.c index 2a741dd3c..cd48a6bdf 100644 --- a/lib/X11/XKBCvt.c +++ b/lib/X11/XKBCvt.c @@ -1,5 +1,5 @@ -/* $XConsortium: XKBCvt.c /main/21 1996/02/02 14:09:26 kaleb $ */ -/* $XFree86: xc/lib/X11/XKBCvt.c,v 3.5 1996/01/16 15:01:06 dawes Exp $ */ +/* $XConsortium: XKBCvt.c /main/22 1996/03/01 14:29:37 kaleb $ */ +/* $XFree86: xc/lib/X11/XKBCvt.c,v 3.6 1996/02/04 08:54:25 dawes Exp $ */ /* Copyright (c) 1988, 1989 X Consortium @@ -125,6 +125,24 @@ static unsigned char Const cyrillic[128] = 0xbf, 0xcf, 0xc0, 0xc1, 0xc2, 0xc3, 0xb6, 0xb2, /* 15 */ 0xcc, 0xcb, 0xb7, 0xc8, 0xcd, 0xc9, 0xc7, 0xca}; +/* maps Cyrillic keysyms to KOI0-8 */ +static unsigned char Const koi8[128] = + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, /* 10 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, /* 11 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 12 */ + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 13 */ + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 14 */ + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 15 */ + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}; /* maps Greek keysyms to 8859-7 */ static unsigned char Const greek[128] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -435,6 +453,41 @@ __XkbDefaultToUpper(sym) return upper; } +int _XkbKSToKoi8 (priv, keysym, buffer, nbytes, status) + XPointer priv; + KeySym keysym; + char *buffer; + int nbytes; + Status *status; +{ + if ((keysym&0xffffff00)==0xff00) { + return _XkbHandleSpecialSym(keysym, buffer, nbytes, status); + } else { + if (nbytes>0) { + buffer[0] = koi8[keysym & 0x7f]; + if (nbytes>1) + buffer[1]= '\0'; + return 1; + } + } + return 0; +} +static KeySym +_XkbKoi8ToKS(priv,buffer,nbytes,status) + XPointer priv; + char *buffer; + int nbytes; + Status *status; +{ + if (nbytes!=1) + return NoSymbol; + if (((buffer[0]&0x80)==0)&&(buffer[0]>=32)) + return buffer[0]; + else if ((buffer[0]&0x7f)>=32) { + return 0xd00|buffer[0]; + } + return NoSymbol; +} /***====================================================================***/ @@ -490,6 +543,9 @@ static XkbConverters cvt_Thai = { _XkbKSToThai, NULL, _XkbThaiToKS, NULL, NULL }; +static XkbConverters cvt_Koi8 = { + _XkbKSToKoi8, NULL, _XkbKoi8ToKS, NULL, NULL +}; static int #if NeedFunctionPrototypes Strcmp(char *str1, char *str2) @@ -546,6 +602,8 @@ _XkbGetConverters(charset, cvt_rtrn) *cvt_rtrn = cvt_kana; else if (Strcmp(charset, "tis620.2533-1")==0) *cvt_rtrn = cvt_Thai; + else if (Strcmp(charset, "koi8")==0) + *cvt_rtrn = cvt_Koi8; /* other codesets go here */ else *cvt_rtrn = cvt_latin1; return 1; @@ -678,4 +736,3 @@ char *tmp; } #endif - diff --git a/lib/X11/XKBMAlloc.c b/lib/X11/XKBMAlloc.c index 66582d8fe..39fe45cab 100644 --- a/lib/X11/XKBMAlloc.c +++ b/lib/X11/XKBMAlloc.c @@ -1,5 +1,5 @@ -/* $XConsortium: XKBMAlloc.c /main/6 1996/02/02 14:09:43 kaleb $ */ -/* $XFree86: xc/lib/X11/XKBMAlloc.c,v 3.1 1996/01/16 15:01:07 dawes Exp $ */ +/* $XConsortium: XKBMAlloc.c /main/7 1996/03/01 14:29:44 kaleb $ */ +/* $XFree86: xc/lib/X11/XKBMAlloc.c,v 3.2 1996/02/04 08:54:26 dawes Exp $ */ /************************************************************ Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. @@ -645,6 +645,224 @@ KeySym *newSyms; return &xkb->map->syms[xkb->map->key_sym_map[key].offset]; } +static unsigned +#if NeedFunctionPrototypes +_ExtendRange( unsigned int old_flags, + unsigned int flag, + KeyCode newKC, + KeyCode * old_min, + unsigned char * old_num) +#else +_ExtendRange(old_flags,flag,newKC,old_min,old_num) + unsigned int old_flags; + unsigned int flag; + KeyCode newKC; + KeyCode * old_min; + unsigned char * old_num; +#endif +{ + if ((old_flags&flag)==0) { + old_flags|= flag; + *old_min= newKC; + *old_num= 1; + } + else { + int last= (*old_min)+(*old_num)-1; + if (newKC<*old_min) { + *old_min= newKC; + *old_num= (last-newKC)+1; + } + else if (newKC>last) { + *old_num= (newKC-(*old_min))+1; + } + } + return old_flags; +} + +Status +#if NeedFunctionPrototypes +XkbChangeKeycodeRange( XkbDescPtr xkb, + int minKC, + int maxKC, + XkbChangesPtr changes) +#else +XkbChangeKeycodeRange(xkb,minKC,maxKC,changes) + XkbDescPtr xkb; + int minKC; + int maxKC; + XkbChangesPtr changes; +#endif +{ +int tmp; + + if ((!xkb)||(minKC<XkbMinLegalKeyCode)||(maxKC>XkbMaxLegalKeyCode)) + return BadValue; + if (minKC>maxKC) + return BadMatch; + if (minKC<xkb->min_key_code) { + if (changes) + changes->map.min_key_code= minKC; + tmp= xkb->min_key_code-minKC; + if (xkb->map) { + if (xkb->map->key_sym_map) { + bzero((char *)&xkb->map->key_sym_map[minKC], + tmp*sizeof(XkbSymMapRec)); + if (changes) { + changes->map.changed= _ExtendRange(changes->map.changed, + XkbKeySymsMask,minKC, + &changes->map.first_key_sym, + &changes->map.num_key_syms); + } + } + if (xkb->map->modmap) { + bzero((char *)&xkb->map->modmap[minKC],tmp); + if (changes) { + changes->map.changed= _ExtendRange(changes->map.changed, + XkbModifierMapMask,minKC, + &changes->map.first_modmap_key, + &changes->map.num_modmap_keys); + } + } + } + if (xkb->server) { + if (xkb->server->behaviors) { + bzero((char *)&xkb->server->behaviors[minKC], + tmp*sizeof(XkbBehavior)); + if (changes) { + changes->map.changed= _ExtendRange(changes->map.changed, + XkbKeyBehaviorsMask,minKC, + &changes->map.first_key_behavior, + &changes->map.num_key_behaviors); + } + } + if (xkb->server->key_acts) { + bzero((char *)&xkb->server->key_acts[minKC], + tmp*sizeof(unsigned short)); + if (changes) { + changes->map.changed= _ExtendRange(changes->map.changed, + XkbKeyActionsMask,minKC, + &changes->map.first_key_act, + &changes->map.num_key_acts); + } + } + if (xkb->server->vmodmap) { + bzero((char *)&xkb->server->vmodmap[minKC], + tmp*sizeof(unsigned short)); + if (changes) { + changes->map.changed= _ExtendRange(changes->map.changed, + XkbVirtualModMapMask,minKC, + &changes->map.first_modmap_key, + &changes->map.num_vmodmap_keys); + } + } + } + if ((xkb->names)&&(xkb->names->keys)) { + bzero((char *)&xkb->names->keys[minKC],tmp*sizeof(XkbKeyNameRec)); + if (changes) { + changes->names.changed= _ExtendRange(changes->names.changed, + XkbKeyNamesMask,minKC, + &changes->names.first_key, + &changes->names.num_keys); + } + } + xkb->min_key_code= minKC; + } + if (maxKC>xkb->max_key_code) { + if (changes) + changes->map.max_key_code= maxKC; + tmp= maxKC-xkb->max_key_code; + if (xkb->map) { + if (xkb->map->key_sym_map) { + xkb->map->key_sym_map= _XkbTypedRealloc(xkb->map->key_sym_map, + (maxKC+1),XkbSymMapRec); + if (!xkb->map->key_sym_map) + return BadAlloc; + bzero((char *)&xkb->map->key_sym_map[xkb->max_key_code], + tmp*sizeof(XkbSymMapRec)); + if (changes) { + changes->map.changed= _ExtendRange(changes->map.changed, + XkbKeySymsMask,maxKC, + &changes->map.first_key_sym, + &changes->map.num_key_syms); + } + } + if (xkb->map->modmap) { + xkb->map->modmap= _XkbTypedRealloc(xkb->map->modmap, + (maxKC+1),unsigned char); + if (!xkb->map->modmap) + return BadAlloc; + bzero((char *)&xkb->map->modmap[xkb->max_key_code],tmp); + if (changes) { + changes->map.changed= _ExtendRange(changes->map.changed, + XkbModifierMapMask,maxKC, + &changes->map.first_modmap_key, + &changes->map.num_modmap_keys); + } + } + } + if (xkb->server) { + if (xkb->server->behaviors) { + xkb->server->behaviors=_XkbTypedRealloc(xkb->server->behaviors, + (maxKC+1),XkbBehavior); + if (!xkb->server->behaviors) + return BadAlloc; + bzero((char *)&xkb->server->behaviors[xkb->max_key_code], + tmp*sizeof(XkbBehavior)); + if (changes) { + changes->map.changed= _ExtendRange(changes->map.changed, + XkbKeyBehaviorsMask,maxKC, + &changes->map.first_key_behavior, + &changes->map.num_key_behaviors); + } + } + if (xkb->server->key_acts) { + xkb->server->key_acts= _XkbTypedRealloc(xkb->server->key_acts, + (maxKC+1),unsigned short); + if (!xkb->server->key_acts) + return BadAlloc; + bzero((char *)&xkb->server->key_acts[xkb->max_key_code], + tmp*sizeof(unsigned short)); + if (changes) { + changes->map.changed= _ExtendRange(changes->map.changed, + XkbKeyActionsMask,maxKC, + &changes->map.first_key_act, + &changes->map.num_key_acts); + } + } + if (xkb->server->vmodmap) { + xkb->server->vmodmap= _XkbTypedRealloc(xkb->server->vmodmap, + (maxKC+1),unsigned short); + if (!xkb->server->vmodmap) + return BadAlloc; + bzero((char *)&xkb->server->vmodmap[xkb->max_key_code], + tmp*sizeof(unsigned short)); + if (changes) { + changes->map.changed= _ExtendRange(changes->map.changed, + XkbVirtualModMapMask,maxKC, + &changes->map.first_modmap_key, + &changes->map.num_vmodmap_keys); + } + } + } + if ((xkb->names)&&(xkb->names->keys)) { + xkb->names->keys= _XkbTypedRealloc(xkb->names->keys, + (maxKC+1),XkbKeyNameRec); + if (!xkb->names->keys) + return BadAlloc; + bzero((char *)&xkb->names->keys[xkb->max_key_code], + tmp*sizeof(XkbKeyNameRec)); + if (changes) { + changes->names.changed= _ExtendRange(changes->names.changed, + XkbKeyNamesMask,maxKC, + &changes->names.first_key, + &changes->names.num_keys); + } + } + xkb->max_key_code= maxKC; + } + return Success; +} + XkbAction * #if NeedFunctionPrototypes XkbResizeKeyActions(XkbDescPtr xkb,int key,int needed) diff --git a/lib/X11/XKBMisc.c b/lib/X11/XKBMisc.c index da384f5f7..76956354a 100644 --- a/lib/X11/XKBMisc.c +++ b/lib/X11/XKBMisc.c @@ -1,4 +1,4 @@ -/* $XConsortium: XKBMisc.c /main/2 1996/02/03 06:04:25 kaleb $ */ +/* $XConsortium: XKBMisc.c /main/3 1996/03/01 14:29:50 kaleb $ */ /************************************************************ Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. @@ -517,31 +517,31 @@ unsigned changed,changedVMods,tmp; } else { XkbAction *pActs; + unsigned int new_vmodmask; changed|= XkbKeyActionsMask; pActs= XkbResizeKeyActions(xkb,key,nSyms); if (!pActs) return False; + new_vmodmask= 0; for (n=0;n<nSyms;n++) { if (interps[n]) { unsigned effMods; pActs[n]= *((XkbAction *)&interps[n]->act); - if ((n==0)||((interps[n]->match&XkbSI_LevelOneOnly)==0)) + if ((n==0)||((interps[n]->match&XkbSI_LevelOneOnly)==0)) { effMods= mods; + if (interps[n]->virtual_mod!=XkbNoModifier) + new_vmodmask|= (1<<interps[n]->virtual_mod); + } else effMods= 0; _XkbSetActionKeyMods(xkb,&pActs[n],effMods); } else pActs[n].type= XkbSA_NoAction; } - if ((explicit&XkbExplicitVModMapMask)==0) { - unsigned new_vmodmask; - if (interps[0]&&(interps[0]->virtual_mod!=XkbNoModifier)) - new_vmodmask= (1<<interps[0]->virtual_mod); - else new_vmodmask= 0; - if (xkb->server->vmodmap[key]!=new_vmodmask) { - changed|= XkbVirtualModMapMask; - xkb->server->vmodmap[key]= new_vmodmask; - } + if (((explicit&XkbExplicitVModMapMask)==0)&& + (xkb->server->vmodmap[key]!=new_vmodmask)) { + changed|= XkbVirtualModMapMask; + xkb->server->vmodmap[key]= new_vmodmask; } if (interps[0]) { if ((interps[0]->flags&XkbSI_LockingKey)&& diff --git a/lib/X11/XKBSetGeom.c b/lib/X11/XKBSetGeom.c index 0327536f1..2dc6b05f2 100644 --- a/lib/X11/XKBSetGeom.c +++ b/lib/X11/XKBSetGeom.c @@ -1,4 +1,4 @@ -/* $XConsortium: XKBSetGeom.c /main/2 1996/02/02 14:38:34 kaleb $ */ +/* $XConsortium: XKBSetGeom.c /main/4 1996/03/01 14:29:56 kaleb $ */ /************************************************************ Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. diff --git a/lib/X11/XKBSetMap.c b/lib/X11/XKBSetMap.c index 7f1667b16..9ef479bcb 100644 --- a/lib/X11/XKBSetMap.c +++ b/lib/X11/XKBSetMap.c @@ -1,4 +1,4 @@ -/* $XConsortium: XKBSetMap.c,v 1.3 94/04/02 14:34:00 erik Exp $ */ +/* $XConsortium: XKBSetMap.c /main/8 1996/03/01 14:30:01 kaleb $ */ /************************************************************ Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. @@ -33,62 +33,76 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "XKBlibint.h" static int -_XkbSizeKeyTypes(xkb,firstType,nTypes) - XkbDescRec *xkb; - unsigned firstType; - unsigned nTypes; +#if NeedFunctionPrototypes +_XkbSizeKeyTypes(XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbSizeKeyTypes(xkb,req) + XkbDescPtr xkb; + xkbSetMapReq * req; +#endif { - XkbKeyTypeRec *map; - int i,n,len; + XkbKeyTypePtr map; + int i,len; + if (((req->present&XkbKeyTypesMask)==0)||(req->nTypes==0)) { + req->present&= ~XkbKeyTypesMask; + req->firstType= req->nTypes= 0; + return 0; + } len= 0; - map= &xkb->map->types[firstType]; - for (i=0;i<nTypes;i++,map++){ + map= &xkb->map->types[req->firstType]; + for (i=0;i<req->nTypes;i++,map++){ len+= SIZEOF(xkbKeyTypeWireDesc); len+= map->map_count*SIZEOF(xkbKTSetMapEntryWireDesc); if (map->preserve) - len+= map->map_count*SIZEOF(xkbKTPreserveWireDesc); + len+= map->map_count*SIZEOF(xkbModsWireDesc); } return len; } static void -_XkbWriteKeyTypes(dpy,xkb,firstType,nTypes) - Display *dpy; - XkbDescRec *xkb; - unsigned firstType; - unsigned nTypes; +#if NeedFunctionPrototypes +_XkbWriteKeyTypes(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbWriteKeyTypes(dpy,xkb,req) + Display * dpy; + XkbDescPtr xkb; + xkbSetMapReq * req; +#endif { - char *buf,*start; - XkbKeyTypeRec *type; + char * buf; + XkbKeyTypePtr type; int i,n,sz; - xkbKeyTypeWireDesc *desc; + xkbKeyTypeWireDesc *desc; - type= &xkb->map->types[firstType]; - for (i=0;i<nTypes;i++,type++) { + if ((req->present&XkbKeyTypesMask)==0) + return; + type= &xkb->map->types[req->firstType]; + for (i=0;i<req->nTypes;i++,type++) { sz= SIZEOF(xkbKeyTypeWireDesc); sz+= type->map_count*SIZEOF(xkbKTSetMapEntryWireDesc); if (type->preserve) - sz+= type->map_count*SIZEOF(xkbKTPreserveWireDesc); + sz+= type->map_count*SIZEOF(xkbModsWireDesc); BufAlloc(xkbKeyTypeWireDesc *,desc,sz); - desc->mask = type->mask; - desc->realMods = type->real_mods; - desc->virtualMods = type->vmods; - desc->groupWidth = type->group_width; + desc->mask = type->mods.mask; + desc->realMods = type->mods.real_mods; + desc->virtualMods = type->mods.vmods; + desc->numLevels = type->num_levels; desc->nMapEntries = type->map_count; - start= buf= (char *)&desc[1]; + desc->preserve = (type->preserve!=NULL); + buf= (char *)&desc[1]; if (desc->nMapEntries>0) { xkbKTSetMapEntryWireDesc *wire; wire= (xkbKTSetMapEntryWireDesc *)buf; for (n=0;n<type->map_count;n++,wire++) { wire->level= type->map[n].level; - wire->realMods= type->map[n].real_mods; - wire->virtualMods= type->map[n].vmods; + wire->realMods= type->map[n].mods.real_mods; + wire->virtualMods= type->map[n].mods.vmods; } buf= (char *)wire; if (type->preserve) { - xkbKTPreserveWireDesc *pwire; - pwire= (xkbKTPreserveWireDesc *)buf; + xkbModsWireDesc *pwire; + pwire= (xkbModsWireDesc *)buf; for (n=0;n<type->map_count;n++,pwire++) { pwire->realMods= type->preserve[n].real_mods; pwire->virtualMods= type->preserve[n].vmods; @@ -100,103 +114,129 @@ _XkbWriteKeyTypes(dpy,xkb,firstType,nTypes) } static int -_XkbSizeKeySyms(xkb,firstKey,nKeys,nSymsRtrn) - XkbDescRec *xkb; - unsigned firstKey; - unsigned nKeys; - CARD16 *nSymsRtrn; +#if NeedFunctionPrototypes +_XkbSizeKeySyms(XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbSizeKeySyms(xkb,req) + XkbDescPtr xkb; + xkbSetMapReq * req; +#endif { - XkbSymMapRec *symMap; - XkbKeyTypeRec *type; int i,len; unsigned nSyms; - len= nKeys*sizeof(XkbSymMapRec); - symMap = &xkb->map->key_sym_map[firstKey]; - for (i=nSyms=0;i<nKeys;i++,symMap++) { - type = &xkb->map->types[symMap->kt_index]; - nSyms+= XkbNumGroups(symMap->group_info)*type->group_width; + if (((req->present&XkbKeySymsMask)==0)||(req->nKeySyms==0)) { + req->present&= ~XkbKeySymsMask; + req->firstKeySym= req->nKeySyms= 0; + req->totalSyms= 0; + return 0; } - len+= nSyms*sizeof(KeySym); - *nSymsRtrn = nSyms; + len= (int)(req->nKeySyms*sizeof(XkbSymMapRec)); + for (i=nSyms=0;i<req->nKeySyms;i++) { + nSyms+= XkbKeyNumSyms(xkb,i+req->firstKeySym); + } + len+= nSyms*sizeof(CARD32); + req->totalSyms= nSyms; return len; } static void -_XkbWriteKeySyms(dpy,xkb,firstKeySym,nKeySyms,totalSyms) - Display *dpy; - XkbDescRec *xkb; - unsigned firstKeySym; - unsigned nKeySyms; - unsigned totalSyms; +#if NeedFunctionPrototypes +_XkbWriteKeySyms(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbWriteKeySyms(dpy,xkb,req) + Display * dpy; + XkbDescPtr xkb; + xkbSetMapReq * req; +#endif { -register KeySym *pSym,*outSym; -XkbSymMapRec *symMap; -XkbKeyTypeRec *keyType; +register KeySym * pSym; +CARD32 * outSym; +XkbSymMapPtr symMap; xkbSymMapWireDesc *desc; register int i; - i= (nKeySyms*SIZEOF(xkbSymMapWireDesc))+(totalSyms*sizeof(KeySym)); - BufAlloc(xkbSymMapWireDesc *,desc,i); - symMap = &xkb->map->key_sym_map[firstKeySym]; - for (i=0;i<nKeySyms;i++,symMap++) { - keyType = &xkb->map->types[symMap->kt_index]; - desc->ktIndex = symMap->kt_index; + if ((req->present&XkbKeySymsMask)==0) + return; + symMap = &xkb->map->key_sym_map[req->firstKeySym]; + for (i=0;i<req->nKeySyms;i++,symMap++) { + BufAlloc(xkbSymMapWireDesc *,desc, + SIZEOF(xkbSymMapWireDesc)+ + (XkbKeyNumSyms(xkb,i+req->firstKeySym)*sizeof(CARD32))); + desc->ktIndex[0] = symMap->kt_index[0]; + desc->ktIndex[1] = symMap->kt_index[1]; + desc->ktIndex[2] = symMap->kt_index[2]; + desc->ktIndex[3] = symMap->kt_index[3]; desc->groupInfo = symMap->group_info; - desc->nSyms = XkbNumGroups(symMap->group_info)*keyType->group_width; - outSym = (KeySym *)&desc[1]; - pSym = &xkb->map->syms[symMap->offset]; - memcpy(outSym,pSym,desc->nSyms*sizeof(KeySym)); - desc = (xkbSymMapWireDesc *)&outSym[desc->nSyms]; + desc->width = symMap->width; + desc->nSyms = XkbKeyNumSyms(xkb,i+req->firstKeySym); + outSym = (CARD32 *)&desc[1]; + if (desc->nSyms>0) { + pSym = XkbKeySymsPtr(xkb,i+req->firstKeySym); + _XkbWriteCopyKeySyms(pSym,outSym,desc->nSyms); + } } return; } static int -_XkbSizeKeyActions(xkb,firstKey,nKeys,nActsRtrn) - XkbDescRec *xkb; - unsigned firstKey; - unsigned nKeys; - CARD16 *nActsRtrn; +#if NeedFunctionPrototypes +_XkbSizeKeyActions(XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbSizeKeyActions(xkb,req) + XkbDescPtr xkb; + xkbSetMapReq * req; +#endif { int i,len,nActs; - unsigned nSyms; - for (nActs=i=0;i<nKeys;i++) { - if (xkb->server->key_acts[i+firstKey]!=0) - nActs+= XkbKeyNumActions(xkb,i+firstKey); + if (((req->present&XkbKeyActionsMask)==0)||(req->nKeyActs==0)) { + req->present&= ~XkbKeyActionsMask; + req->firstKeyAct= req->nKeyActs= 0; + req->totalActs= 0; + return 0; } - len= (((nKeys+3)/4)*4)+(nActs*sizeof(XkbAction)); - *nActsRtrn = nActs; + for (nActs=i=0;i<req->nKeyActs;i++) { + if (xkb->server->key_acts[i+req->firstKeyAct]!=0) + nActs+= XkbKeyNumActions(xkb,i+req->firstKeyAct); + } + len= XkbPaddedSize(req->nKeyActs)+(nActs*SIZEOF(xkbActionWireDesc)); + req->totalActs= nActs; return len; } static void -_XkbWriteKeyActions(dpy,xkb,firstKey,nKeys,totalActs) - Display *dpy; - XkbDescRec *xkb; - unsigned firstKey; - unsigned nKeys; - unsigned totalActs; +#if NeedFunctionPrototypes +_XkbWriteKeyActions(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbWriteKeyActions(dpy,xkb,req) + Display * dpy; + XkbDescPtr xkb; + xkbSetMapReq * req; +#endif { register int i; int n; CARD8 *numDesc; XkbAction *actDesc; - n = (((nKeys+3)/4)*4)+totalActs*sizeof(XkbAction); + if ((req->present&XkbKeyActionsMask)==0) + return; + n = XkbPaddedSize(req->nKeyActs); + n+= (req->totalActs*SIZEOF(xkbActionWireDesc)); + BufAlloc(CARD8 *,numDesc,n); - for (i=0;i<nKeys;i++) { - if (xkb->server->key_acts[i+firstKey]==0) + for (i=0;i<req->nKeyActs;i++) { + if (xkb->server->key_acts[i+req->firstKeyAct]==0) numDesc[i] = 0; - else numDesc[i] = XkbKeyNumActions(xkb,(i+firstKey)); + else numDesc[i] = XkbKeyNumActions(xkb,(i+req->firstKeyAct)); } - actDesc = (XkbAction *)&numDesc[(((nKeys)+3)/4)*4]; - for (i=0;i<nKeys;i++) { - if (xkb->server->key_acts[i+firstKey]!=0) { - n = XkbKeyNumActions(xkb,(i+firstKey)); - memcpy(actDesc,XkbKeyActionsPtr(xkb,(i+firstKey)), - n*sizeof(XkbAction)); + actDesc = (XkbAction *)&numDesc[XkbPaddedSize(req->nKeyActs)]; + for (i=0;i<req->nKeyActs;i++) { + if (xkb->server->key_acts[i+req->firstKeyAct]!=0) { + n = XkbKeyNumActions(xkb,(i+req->firstKeyAct)); + memcpy(actDesc,XkbKeyActionsPtr(xkb,(i+req->firstKeyAct)), + n*SIZEOF(xkbActionWireDesc)); actDesc+= n; } } @@ -204,26 +244,24 @@ _XkbWriteKeyActions(dpy,xkb,firstKey,nKeys,totalActs) } static int -_XkbSizeKeyBehaviors(xkb,req,pChanges) +#if NeedFunctionPrototypes +_XkbSizeKeyBehaviors(XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbSizeKeyBehaviors(xkb,req) XkbDescPtr xkb; xkbSetMapReq * req; - XkbMapChangesRec * pChanges; +#endif { register int i,first,last,nFound; - if ((req->present&XkbKeyBehaviorsMask)==0) { + if (((req->present&XkbKeyBehaviorsMask)==0)||(req->nKeyBehaviors<1)) { + req->present&= ~XkbKeyBehaviorsMask; + req->firstKeyBehavior= req->nKeyBehaviors= 0; req->totalKeyBehaviors= 0; return 0; } - else if (pChanges) { - first= pChanges->first_key_behavior; - last= first+pChanges->num_key_behaviors-1; - } - else { - first= xkb->min_key_code; - last= xkb->max_key_code; - } - + first= req->firstKeyBehavior; + last= first+req->nKeyBehaviors-1; for (i=first,nFound=0;i<=last;i++) { if (xkb->server->behaviors[i].type!=XkbKB_Default) nFound++; @@ -233,120 +271,134 @@ register int i,first,last,nFound; } static void -_XkbWriteKeyBehaviors(dpy,xkb,req,pChanges) +#if NeedFunctionPrototypes +_XkbWriteKeyBehaviors(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbWriteKeyBehaviors(dpy,xkb,req) Display * dpy; XkbDescPtr xkb; xkbSetMapReq * req; - XkbMapChangesRec * pChanges; +#endif { -register int i,first,last; -xkbBehaviorWireDesc *wire; +register int i,first,last; +xkbBehaviorWireDesc * wire; +char * buf; if ((req->present&XkbKeyBehaviorsMask)==0) return; - if (pChanges) { - first= pChanges->first_key_behavior; - last= first+pChanges->num_key_behaviors-1; - } - else { - first= xkb->min_key_code; - last= xkb->max_key_code; - } + first= req->firstKeyBehavior; + last= first+req->nKeyBehaviors-1; + i= req->totalKeyBehaviors*SIZEOF(xkbBehaviorWireDesc); - BufAlloc(xkbBehaviorWireDesc *,wire,i); + BufAlloc(char *,buf,i); + wire= (xkbBehaviorWireDesc *)buf; for (i=first;i<=last;i++) { if (xkb->server->behaviors[i].type!=XkbKB_Default) { wire->key= i; wire->type= xkb->server->behaviors[i].type; wire->data= xkb->server->behaviors[i].data; - wire++; + buf+= SIZEOF(xkbBehaviorWireDesc); + wire= (xkbBehaviorWireDesc *)buf; } } return; } -static int -_XkbSizeVirtualMods(xkb,which) - XkbDescPtr xkb; - unsigned which; +static unsigned +#if NeedFunctionPrototypes +_XkbSizeVirtualMods(xkbSetMapReq *req) +#else +_XkbSizeVirtualMods(req) + xkbSetMapReq * req; +#endif { register int i,bit,nMods; + if (((req->present&XkbVirtualModsMask)==0)||(req->virtualMods==0)) { + req->present&= ~XkbVirtualModsMask; + req->virtualMods= 0; + return 0; + } for (i=nMods=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (which&bit) + if (req->virtualMods&bit) nMods++; } - return ((nMods+(unsigned)3)/4)*4; + return XkbPaddedSize(nMods); } static void -_XkbWriteVirtualMods(dpy,xkb,which,size) +#if NeedFunctionPrototypes +_XkbWriteVirtualMods( Display * dpy, + XkbDescPtr xkb, + xkbSetMapReq * req, + unsigned size) +#else +_XkbWriteVirtualMods(dpy,xkb,req,size) Display * dpy; XkbDescPtr xkb; - unsigned which; + xkbSetMapReq * req; unsigned size; +#endif { register int i,bit; CARD8 *vmods; + if ((req->present&XkbVirtualModsMask==0)||(size<1)) + return; BufAlloc(CARD8 *,vmods,size); for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (which&bit) + if (req->virtualMods&bit) *vmods++= xkb->server->vmods[i]; } return; } static int -_XkbSizeKeyExplicit(xkb,req,pChanges) +#if NeedFunctionPrototypes +_XkbSizeKeyExplicit(XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbSizeKeyExplicit(xkb,req) XkbDescPtr xkb; xkbSetMapReq * req; - XkbMapChangesPtr pChanges; +#endif { register int i,first,last,nFound; - if ((req->present&XkbExplicitComponentsMask)==0) { + if (((req->present&XkbExplicitComponentsMask)==0)||(req->nKeyExplicit==0)) { + req->present&= ~XkbExplicitComponentsMask; + req->firstKeyExplicit= req->nKeyExplicit= 0; req->totalKeyExplicit= 0; return 0; } - else if (pChanges) { - first= pChanges->first_key_explicit; - last= first+pChanges->num_key_explicit-1; - } - else { - first= xkb->min_key_code; - last= xkb->max_key_code; - } + first= req->firstKeyExplicit; + last= first+req->nKeyExplicit-1; for (i=first,nFound=0;i<=last;i++) { if (xkb->server->explicit[i]!=0) nFound++; } req->totalKeyExplicit= nFound; - return (((nFound*2)+3)/4)*4; + return XkbPaddedSize((nFound*2)); } static void -_XkbWriteKeyExplicit(dpy,xkb,req,pChanges) +#if NeedFunctionPrototypes +_XkbWriteKeyExplicit(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbWriteKeyExplicit(dpy,xkb,req) Display * dpy; XkbDescPtr xkb; xkbSetMapReq * req; - XkbMapChangesPtr pChanges; +#endif { register int i,first,last; CARD8 * wire; if ((req->present&XkbExplicitComponentsMask)==0) return; - else if (pChanges) { - first= pChanges->first_key_explicit; - last= first+pChanges->num_key_explicit-1; - } - else { - first= xkb->min_key_code; - last= xkb->max_key_code; - } - i= (((req->totalKeyExplicit*2)+3)/4)*4; + first= req->firstKeyExplicit; + last= first+req->nKeyExplicit; + i= XkbPaddedSize((req->totalKeyExplicit*2)); BufAlloc(CARD8 *,wire,i); for (i=first;i<=last;i++) { if (xkb->server->explicit[i]!=0) { @@ -358,69 +410,197 @@ CARD8 * wire; return; } +static int +#if NeedFunctionPrototypes +_XkbSizeModifierMap(XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbSizeModifierMap(xkb,req) + XkbDescPtr xkb; + xkbSetMapReq * req; +#endif +{ +register int i,first,last,nFound; + + if (((req->present&XkbModifierMapMask)==0)||(req->nModMapKeys==0)) { + req->present&= ~XkbModifierMapMask; + req->firstModMapKey= req->nModMapKeys= 0; + req->totalModMapKeys= 0; + return 0; + } + first= req->firstModMapKey; + last= first+req->nModMapKeys-1; + + for (i=first,nFound=0;i<=last;i++) { + if (xkb->map->modmap[i]!=0) + nFound++; + } + req->totalModMapKeys= nFound; + return XkbPaddedSize((nFound*2)); +} + +static void +#if NeedFunctionPrototypes +_XkbWriteModifierMap(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbWriteModifierMap(dpy,xkb,req) + Display * dpy; + XkbDescPtr xkb; + xkbSetMapReq * req; +#endif +{ +register int i,first,last; +CARD8 * wire; + + if ((req->present&XkbModifierMapMask)==0) + return; + first= req->firstModMapKey; + last= first+req->nModMapKeys-1; + if (req->totalModMapKeys>0) { + i= XkbPaddedSize((req->totalModMapKeys*2)); + BufAlloc(CARD8 *,wire,i); + for (i=first;i<=last;i++) { + if (xkb->map->modmap[i]!=0) { + wire[0]= i; + wire[1]= xkb->map->modmap[i]; + wire+= 2; + } + } + } + return; +} + +static int +#if NeedFunctionPrototypes +_XkbSizeVirtualModMap(XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbSizeVirtualModMap(xkb,req) + XkbDescPtr xkb; + xkbSetMapReq * req; +#endif +{ +register int i,first,last,nFound; + + if (((req->present&XkbVirtualModMapMask)==0)||(req->nVModMapKeys==0)) { + req->present&= ~XkbVirtualModMapMask; + req->firstVModMapKey= req->nVModMapKeys= 0; + req->totalVModMapKeys= 0; + return 0; + } + first= req->firstVModMapKey; + last= first+req->nVModMapKeys-1; + + for (i=first,nFound=0;i<=last;i++) { + if (xkb->server->vmodmap[i]!=0) + nFound++; + } + req->totalVModMapKeys= nFound; + return nFound*SIZEOF(xkbVModMapWireDesc); +} + static void -SendSetMap(dpy,xkb,req,pChanges) +#if NeedFunctionPrototypes +_XkbWriteVirtualModMap(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req) +#else +_XkbWriteVirtualModMap(dpy,xkb,req) + Display * dpy; + XkbDescPtr xkb; + xkbSetMapReq * req; +#endif +{ +register int i,first,last; +xkbVModMapWireDesc * wire; + + if ((req->present&XkbVirtualModMapMask)==0) + return; + first= req->firstVModMapKey; + last= first+req->nVModMapKeys-1; + if (req->totalVModMapKeys>0) { + i= req->totalVModMapKeys*SIZEOF(xkbVModMapWireDesc); + BufAlloc(xkbVModMapWireDesc *,wire,i); + for (i=first;i<=last;i++) { + if (xkb->server->vmodmap[i]!=0) { + wire->key= i; + wire->vmods= xkb->server->vmodmap[i]; + wire++; + } + } + } + return; +} + +static void +#if NeedFunctionPrototypes +SendSetMap(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req) +#else +SendSetMap(dpy,xkb,req) Display * dpy; XkbDescPtr xkb; xkbSetMapReq * req; - XkbMapChangesRec * pChanges; +#endif { xkbSetMapReq tmp; -int szMods; -CARD16 totalSyms,totalActs; - - req->length+= _XkbSizeKeyTypes(xkb,req->firstType,req->nTypes)/4; - req->length+= _XkbSizeKeySyms(xkb,req->firstKeySym,req->nKeySyms, - &totalSyms)/4; - req->length+= _XkbSizeKeyActions(xkb,req->firstKeyAction,req->nKeyActions, - &totalActs)/4; - req->length+= _XkbSizeKeyBehaviors(xkb,req,pChanges)/4; - szMods= _XkbSizeVirtualMods(xkb,req->virtualMods); +unsigned szMods; + + req->length+= _XkbSizeKeyTypes(xkb,req)/4; + req->length+= _XkbSizeKeySyms(xkb,req)/4; + req->length+= _XkbSizeKeyActions(xkb,req)/4; + req->length+= _XkbSizeKeyBehaviors(xkb,req)/4; + szMods= _XkbSizeVirtualMods(req); req->length+= szMods/4; - req->length+= _XkbSizeKeyExplicit(xkb,req,pChanges)/4; - req->totalSyms= totalSyms; - req->totalActions= totalActs; + req->length+= _XkbSizeKeyExplicit(xkb,req)/4; + req->length+= _XkbSizeModifierMap(xkb,req)/4; + req->length+= _XkbSizeVirtualModMap(xkb,req)/4; tmp= *req; if ( tmp.nTypes>0 ) - _XkbWriteKeyTypes(dpy,xkb,tmp.firstType,tmp.nTypes); + _XkbWriteKeyTypes(dpy,xkb,&tmp); if ( tmp.nKeySyms>0 ) - _XkbWriteKeySyms(dpy,xkb,tmp.firstKeySym,tmp.nKeySyms,tmp.totalSyms); - if ( tmp.nKeyActions ) - _XkbWriteKeyActions(dpy,xkb,tmp.firstKeyAction,tmp.nKeyActions, - tmp.totalActions); + _XkbWriteKeySyms(dpy,xkb,&tmp); + if ( tmp.nKeyActs ) + _XkbWriteKeyActions(dpy,xkb,&tmp); if ( tmp.totalKeyBehaviors>0 ) - _XkbWriteKeyBehaviors(dpy,xkb,&tmp,pChanges); + _XkbWriteKeyBehaviors(dpy,xkb,&tmp); if ( tmp.virtualMods ) - _XkbWriteVirtualMods(dpy,xkb,tmp.virtualMods,szMods); + _XkbWriteVirtualMods(dpy,xkb,&tmp,szMods); if ( tmp.totalKeyExplicit>0) - _XkbWriteKeyExplicit(dpy,xkb,&tmp,pChanges); + _XkbWriteKeyExplicit(dpy,xkb,&tmp); + if ( tmp.totalModMapKeys>0) + _XkbWriteModifierMap(dpy,xkb,&tmp); + if ( tmp.totalVModMapKeys>0) + _XkbWriteVirtualModMap(dpy,xkb,&tmp); return; } -Status +Bool +#if NeedFunctionPrototypes +XkbSetMap(Display *dpy,unsigned which,XkbDescPtr xkb) +#else XkbSetMap(dpy,which,xkb) - Display *dpy; - unsigned which; - XkbDescRec *xkb; + Display * dpy; + unsigned which; + XkbDescPtr xkb; +#endif { - register xkbSetMapReq *req; - XkbInfoPtr xkbi; +register xkbSetMapReq * req; +XkbInfoPtr xkbi; +XkbServerMapPtr srv; +XkbClientMapPtr map; if ((dpy->flags & XlibDisplayNoXkb) || - (!dpy->xkb_info && !XkbUseExtension(dpy))) + (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))|| + (!xkb)) return False; - - if (((which&XkbKeyTypesMask)&&(!xkb->map->types))|| - ((which&XkbKeySymsMask)&& - ((!xkb->map->syms)||(!xkb->map->key_sym_map)))|| - ((which&XkbKeyActionsMask)&& - ((!xkb->server)||(!xkb->server->key_acts)))|| - ((which&XkbKeyBehaviorsMask)&& - ((!xkb->server)||(!xkb->server->behaviors)))|| - ((which&XkbVirtualModsMask)&&(!xkb->server))|| - ((which&XkbExplicitComponentsMask)&& - ((!xkb->server)||(!xkb->server->explicit)))) + map= xkb->map; + srv= xkb->server; + + if (((which&XkbKeyTypesMask)&&((!map)||(!map->types)))|| + ((which&XkbKeySymsMask)&&((!map)||(!map->syms)||(!map->key_sym_map)))|| + ((which&XkbKeyActionsMask)&&((!srv)||(!srv->key_acts)))|| + ((which&XkbKeyBehaviorsMask)&&((!srv)||(!srv->behaviors)))|| + ((which&XkbVirtualModsMask)&&(!srv))|| + ((which&XkbExplicitComponentsMask)&&((!srv)||(!srv->explicit)))|| + ((which&XkbModifierMapMask)&&((!map)||(!map->modmap)))|| + ((which&XkbVirtualModMapMask)&&((!srv)||(!srv->vmodmap)))) return False; LockDisplay(dpy); @@ -430,50 +610,76 @@ XkbSetMap(dpy,which,xkb) req->xkbReqType = X_kbSetMap; req->deviceSpec = xkb->device_spec; req->present = which; - req->resize = which&XkbResizableInfoMask; + req->flags = XkbSetMapAllFlags; + req->minKeyCode= xkb->min_key_code; + req->maxKeyCode= xkb->max_key_code; req->firstType = 0; - if (which&XkbKeyTypesMask) req->nTypes = xkb->map->num_types; + if (which&XkbKeyTypesMask) req->nTypes = map->num_types; else req->nTypes = 0; - req->firstKeySym = 0; if (which&XkbKeySymsMask) { req->firstKeySym = xkb->min_key_code; - req->nKeySyms = xkb->max_key_code-xkb->min_key_code+1; + req->nKeySyms = XkbNumKeys(xkb); } if (which&XkbKeyActionsMask) { - req->firstKeyAction = xkb->min_key_code; - req->nKeyActions = xkb->max_key_code-xkb->min_key_code+1; + req->firstKeyAct = xkb->min_key_code; + req->nKeyActs = XkbNumKeys(xkb); + } + if (which&XkbKeyBehaviorsMask) { + req->firstKeyBehavior = xkb->min_key_code; + req->nKeyBehaviors = XkbNumKeys(xkb); } if (which&XkbVirtualModsMask) req->virtualMods= ~0; - SendSetMap(dpy,xkb,req,NULL); + if (which&XkbExplicitComponentsMask) { + req->firstKeyExplicit= xkb->min_key_code; + req->nKeyExplicit = XkbNumKeys(xkb); + } + if (which&XkbModifierMapMask) { + req->firstModMapKey= xkb->min_key_code; + req->nModMapKeys = XkbNumKeys(xkb); + } + if (which&XkbVirtualModMapMask) { + req->firstVModMapKey= xkb->min_key_code; + req->nVModMapKeys = XkbNumKeys(xkb); + } + SendSetMap(dpy,xkb,req); UnlockDisplay(dpy); SyncHandle(); return True; } -Status +Bool +#if NeedFunctionPrototypes +XkbChangeMap(Display *dpy,XkbDescPtr xkb,XkbMapChangesPtr changes) +#else XkbChangeMap(dpy,xkb,changes) - Display *dpy; - XkbDescRec *xkb; - XkbMapChangesRec *changes; + Display * dpy; + XkbDescPtr xkb; + XkbMapChangesPtr changes; +#endif { - register xkbSetMapReq *req; - XkbInfoPtr xkbi; +register xkbSetMapReq * req; +XkbInfoPtr xkbi; +XkbServerMapPtr srv; +XkbClientMapPtr map; if ((dpy->flags & XlibDisplayNoXkb) || - (!dpy->xkb_info && !XkbUseExtension(dpy))) + (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))|| + (!xkb)||(!changes)) return False; - - if (((changes->changed&XkbKeyTypesMask)&&(!xkb->map->types))|| - ((changes->changed&XkbKeySymsMask)&&((!xkb->map->syms)|| - (!xkb->map->key_sym_map)))|| - ((changes->changed&XkbKeyActionsMask)&& - ((!xkb->server)||(!xkb->server->key_acts)))|| - ((changes->changed&XkbKeyBehaviorsMask)&& - ((!xkb->server)||(!xkb->server->behaviors)))|| - ((changes->changed&XkbVirtualModsMask)&&(!xkb->server))|| + srv= xkb->server; + map= xkb->map; + + if (((changes->changed&XkbKeyTypesMask)&&((!map)||(!map->types)))|| + ((changes->changed&XkbKeySymsMask)&&((!map)||(!map->syms)|| + (!map->key_sym_map)))|| + ((changes->changed&XkbKeyActionsMask)&&((!srv)||(!srv->key_acts)))|| + ((changes->changed&XkbKeyBehaviorsMask)&&((!srv)||(!srv->behaviors)))|| + ((changes->changed&XkbVirtualModsMask)&&(!srv))|| ((changes->changed&XkbExplicitComponentsMask)&& - ((!xkb->server)||(!xkb->server->explicit)))) + ((!srv)||(!srv->explicit)))|| + ((changes->changed&XkbModifierMapMask)&&((!map)||(!map->modmap)))|| + ((changes->changed&XkbVirtualModMapMask)&&((!srv)||(!srv->vmodmap)))) return False; LockDisplay(dpy); @@ -483,15 +689,25 @@ XkbChangeMap(dpy,xkb,changes) req->xkbReqType = X_kbSetMap; req->deviceSpec = xkb->device_spec; req->present = changes->changed; - req->resize = 0; + req->flags = XkbSetMapRecomputeActions; + req->minKeyCode= xkb->min_key_code; + req->maxKeyCode= xkb->max_key_code; req->firstType = changes->first_type; req->nTypes = changes->num_types; req->firstKeySym = changes->first_key_sym; req->nKeySyms = changes->num_key_syms; - req->firstKeyAction = changes->first_key_act; - req->nKeyActions = changes->num_key_acts; + req->firstKeyAct = changes->first_key_act; + req->nKeyActs = changes->num_key_acts; + req->firstKeyBehavior = changes->first_key_behavior; + req->nKeyBehaviors = changes->num_key_behaviors; req->virtualMods = changes->vmods; - SendSetMap(dpy,xkb,req,changes); + req->firstKeyExplicit = changes->first_key_explicit; + req->nKeyExplicit = changes->num_key_explicit; + req->firstModMapKey = changes->first_modmap_key; + req->nModMapKeys = changes->num_modmap_keys; + req->firstVModMapKey = changes->first_vmodmap_key; + req->nVModMapKeys = changes->num_vmodmap_keys; + SendSetMap(dpy,xkb,req); UnlockDisplay(dpy); SyncHandle(); return True; diff --git a/lib/X11/XKBUse.c b/lib/X11/XKBUse.c index 9e878a115..e53bd36d0 100644 --- a/lib/X11/XKBUse.c +++ b/lib/X11/XKBUse.c @@ -1,4 +1,4 @@ -/* $XConsortium: XKBUse.c,v 1.5 94/04/08 02:57:29 erik Exp $ */ +/* $XConsortium: XKBUse.c /main/12 1996/03/01 14:30:08 kaleb $ */ /************************************************************ Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. @@ -26,6 +26,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ #include <stdio.h> +#include <ctype.h> #define NEED_REPLIES #define NEED_EVENTS #include "Xlibint.h" @@ -39,10 +40,14 @@ extern char *getenv(); static Bool _XkbIgnoreExtension = False; void +#if NeedFunctionPrototypes +XkbNoteMapChanges(XkbMapChangesPtr old,XkbMapNotifyEvent *new,unsigned wanted) +#else XkbNoteMapChanges(old,new,wanted) - XkbMapChangesRec *old; - XkbMapNotifyEvent *new; - unsigned int wanted; + XkbMapChangesPtr old; + XkbMapNotifyEvent * new; + unsigned int wanted; +#endif { int first,oldLast,newLast; wanted&= new->changed; @@ -140,19 +145,60 @@ XkbNoteMapChanges(old,new,wanted) old->num_key_explicit = new->num_key_explicit; } } + if (wanted&XkbModifierMapMask) { + if (old->changed&XkbModifierMapMask) { + first = old->first_modmap_key; + oldLast = old->first_modmap_key+old->num_modmap_keys-1; + newLast = new->first_modmap_key+new->num_modmap_keys-1; + + if (new->first_modmap_key<first) + first = new->first_modmap_key; + if (oldLast>newLast) + newLast= oldLast; + old->first_modmap_key = first; + old->num_modmap_keys = newLast-first+1; + } + else { + old->first_modmap_key = new->first_modmap_key; + old->num_modmap_keys = new->num_modmap_keys; + } + } + if (wanted&XkbVirtualModMapMask) { + if (old->changed&XkbVirtualModMapMask) { + first = old->first_vmodmap_key; + oldLast = old->first_vmodmap_key+old->num_vmodmap_keys-1; + newLast = new->first_vmodmap_key+new->num_vmodmap_keys-1; + + if (new->first_vmodmap_key<first) + first = new->first_vmodmap_key; + if (oldLast>newLast) + newLast= oldLast; + old->first_vmodmap_key = first; + old->num_vmodmap_keys = newLast-first+1; + } + else { + old->first_vmodmap_key = new->first_vmodmap_key; + old->num_vmodmap_keys = new->num_vmodmap_keys; + } + } old->changed|= wanted; return; } void -XkbNoteCoreMapChanges(old,new,wanted) - XkbMapChangesRec *old; - XMappingEvent *new; - unsigned int wanted; +#if NeedFunctionPrototypes +_XkbNoteCoreMapChanges( XkbMapChangesPtr old, + XMappingEvent * new, + unsigned int wanted) +#else +_XkbNoteCoreMapChanges(old,new,wanted) + XkbMapChangesPtr old; + XMappingEvent * new; + unsigned int wanted; +#endif { int first,oldLast,newLast; - if ((new->request==MappingKeyboard)&&(wanted&XkbKeySymsMask)) { if (old->changed&XkbKeySymsMask) { first = old->first_key_sym; @@ -176,22 +222,26 @@ XkbNoteCoreMapChanges(old,new,wanted) } static Bool +#if NeedFunctionPrototypes +wire_to_event(Display *dpy,XEvent *re,xEvent *event) +#else wire_to_event(dpy,re,event) Display *dpy; XEvent *re; xEvent *event; +#endif { xkbEvent *xkbevent= (xkbEvent *)event; XkbInfoPtr xkbi; if ((dpy->flags & XlibDisplayNoXkb) || - (!dpy->xkb_info && !XkbUseExtension(dpy))) + (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) return False; xkbi = dpy->xkb_info; if (((event->u.u.type&0x7f)-xkbi->codes->first_event)!=XkbEventCode) return False; - switch (xkbevent->u.any.xkbType&0x7f) { + switch (xkbevent->u.any.xkbType) { case XkbStateNotify: { xkbStateNotify *sn = (xkbStateNotify *)event; @@ -219,6 +269,11 @@ wire_to_event(dpy,re,event) sev->latched_mods = sn->latchedMods; sev->locked_mods = sn->lockedMods; sev->compat_state = sn->compatState; + sev->grab_mods = sn->grabMods; + sev->compat_grab_mods = sn->compatGrabMods; + sev->lookup_mods = sn->lookupMods; + sev->compat_lookup_mods = sn->compatLookupMods; + sev->ptr_buttons = sn->ptrBtnState; return True; } } @@ -226,7 +281,8 @@ wire_to_event(dpy,re,event) case XkbMapNotify: { xkbMapNotify *mn = (xkbMapNotify *)event; - if (xkbi->selected_events&XkbMapNotifyMask) { + if ((xkbi->selected_events&XkbMapNotifyMask)&& + (xkbi->selected_map_details&mn->changed)) { XkbMapNotifyEvent *mev; mev =(XkbMapNotifyEvent *)re; mev->type = XkbEventCode+xkbi->codes->first_event; @@ -238,17 +294,23 @@ wire_to_event(dpy,re,event) mev->time = mn->time; mev->device = mn->deviceID; mev->changed = mn->changed; + mev->min_key_code = mn->minKeyCode; + mev->max_key_code = mn->maxKeyCode; mev->first_type = mn->firstType; mev->num_types = mn->nTypes; mev->first_key_sym = mn->firstKeySym; mev->num_key_syms = mn->nKeySyms; - mev->first_key_act = mn->firstKeyAction; - mev->num_key_acts = mn->nKeyActions; + mev->first_key_act = mn->firstKeyAct; + mev->num_key_acts = mn->nKeyActs; mev->first_key_behavior = mn->firstKeyBehavior; mev->num_key_behaviors = mn->nKeyBehaviors; mev->vmods = mn->virtualMods; mev->first_key_explicit = mn->firstKeyExplicit; mev->num_key_explicit = mn->nKeyExplicit; + mev->first_modmap_key = mn->firstModMapKey; + mev->num_modmap_keys = mn->nModMapKeys; + mev->first_vmodmap_key = mn->firstVModMapKey; + mev->num_vmodmap_keys = mn->nVModMapKeys; XkbNoteMapChanges(&xkbi->changes,mev,XKB_XLIB_MAP_MASK); if (xkbi->changes.changed) xkbi->flags|= XkbMapPending; @@ -265,7 +327,7 @@ wire_to_event(dpy,re,event) ev->first_keycode = mn->firstKeySym; ev->request = MappingKeyboard; ev->count = mn->nKeySyms; - XkbNoteCoreMapChanges(&xkbi->changes,ev,XKB_XLIB_MAP_MASK); + _XkbNoteCoreMapChanges(&xkbi->changes,ev,XKB_XLIB_MAP_MASK); if (xkbi->changes.changed) xkbi->flags|= XkbMapPending; return True; @@ -290,6 +352,7 @@ wire_to_event(dpy,re,event) cev->enabled_ctrls = cn->enabledControls; cev->enabled_ctrl_changes = cn->enabledControlChanges; cev->keycode = cn->keycode; + cev->num_groups = cn->numGroups; cev->event_type = cn->eventType; cev->req_major = cn->requestMajor; cev->req_minor = cn->requestMinor; @@ -311,9 +374,8 @@ wire_to_event(dpy,re,event) iev->display = dpy; iev->time = in->time; iev->device = in->deviceID; - iev->state_changed = in->stateChanged; + iev->changed = in->changed; iev->state= in->state; - iev->map_changed = in->mapChanged; return True; } } @@ -332,9 +394,8 @@ wire_to_event(dpy,re,event) iev->display = dpy; iev->time = in->time; iev->device = in->deviceID; - iev->state_changed = in->stateChanged; + iev->changed = in->changed; iev->state= in->state; - iev->state_changed = in->mapChanged; return True; } } @@ -354,33 +415,35 @@ wire_to_event(dpy,re,event) bev->time = bn->time; bev->device = bn->deviceID; bev->percent = bn->percent; - bev->pitch = bn->percent; + bev->pitch = bn->pitch; bev->duration = bn->duration; bev->bell_class = bn->bellClass; bev->bell_id = bn->bellID; bev->name = bn->name; bev->window = bn->window; + bev->event_only = bn->eventOnly; return True; } } break; - case XkbSlowKeyNotify: + case XkbAccessXNotify: { - if (xkbi->selected_events&XkbSlowKeyNotifyMask) { - xkbSlowKeyNotify *skn =(xkbSlowKeyNotify *)event; - XkbSlowKeyNotifyEvent *skev; - skev =(XkbSlowKeyNotifyEvent *)re; - skev->type = XkbEventCode+xkbi->codes->first_event; - skev->xkb_type = XkbSlowKeyNotify; - skev->serial = _XSetLastRequestRead(dpy, + if (xkbi->selected_events&XkbAccessXNotifyMask) { + xkbAccessXNotify *axn =(xkbAccessXNotify *)event; + XkbAccessXNotifyEvent *axev; + axev =(XkbAccessXNotifyEvent *)re; + axev->type = XkbEventCode+xkbi->codes->first_event; + axev->xkb_type = XkbAccessXNotify; + axev->serial = _XSetLastRequestRead(dpy, (xGenericReply *)event); - skev->send_event = ((event->u.u.type&0x80)!=0); - skev->display = dpy; - skev->time = skn->time; - skev->device = skn->deviceID; - skev->slow_key_state = skn->slowKeyState; - skev->keycode = skn->keycode; - skev->delay = skn->delay; + axev->send_event = ((event->u.u.type&0x80)!=0); + axev->display = dpy; + axev->time = axn->time; + axev->device = axn->deviceID; + axev->detail = axn->detail; + axev->keycode = axn->keycode; + axev->sk_delay = axn->slowKeysDelay; + axev->debounce_delay = axn->debounceDelay; return True; } } @@ -404,12 +467,13 @@ wire_to_event(dpy,re,event) nev->num_types = nn->nTypes; nev->first_lvl = nn->firstLevelName; nev->num_lvls = nn->nLevelNames; - nev->first_radio_group = nn->firstRadioGroup; + nev->num_aliases = nn->nAliases; nev->num_radio_groups = nn->nRadioGroups; - nev->num_char_sets = nn->nCharSets; - nev->changed_mods = nn->changedMods; nev->changed_vmods = nn->changedVirtualMods; + nev->changed_groups = nn->changedGroupNames; nev->changed_indicators = nn->changedIndicators; + nev->first_key = nn->firstKey; + nev->num_keys = nn->nKeys; return True; } } @@ -428,8 +492,7 @@ wire_to_event(dpy,re,event) cmev->display = dpy; cmev->time = cmn->time; cmev->device = cmn->deviceID; - cmev->changed_mods = cmn->changedMods; - cmev->changed_vmods = cmn->changedVirtualMods; + cmev->changed_groups = cmn->changedGroups; cmev->first_si = cmn->firstSI; cmev->num_si = cmn->nSI; cmev->num_total_si = cmn->nTotalSI; @@ -437,33 +500,12 @@ wire_to_event(dpy,re,event) } } break; - case XkbAlternateSymsNotify: - { - if (xkbi->selected_events&XkbAlternateSymsNotifyMask) { - xkbAlternateSymsNotify *asn=(xkbAlternateSymsNotify *)event; - XkbAlternateSymsNotifyEvent *asev; - asev =(XkbAlternateSymsNotifyEvent *)re; - asev->type = XkbEventCode+xkbi->codes->first_event; - asev->xkb_type = XkbAlternateSymsNotify; - asev->serial = _XSetLastRequestRead(dpy, - (xGenericReply *)event); - asev->send_event = ((event->u.u.type&0x80)!=0); - asev->display = dpy; - asev->time = asn->time; - asev->device = asn->deviceID; - asev->alt_syms_id = asn->altSymsID; - asev->first_key = asn->firstKey; - asev->num_keys = asn->nKeys; - return True; - } - } - break; case XkbActionMessage: { if (xkbi->selected_events&XkbActionMessageMask) { xkbActionMessage *am= (xkbActionMessage *)event; XkbActionMessageEvent *amev; - amev= (XkbActionMessageEvent *)am; + amev= (XkbActionMessageEvent *)re; amev->type = XkbEventCode+xkbi->codes->first_event; amev->xkb_type = XkbActionMessage; amev->serial = _XSetLastRequestRead(dpy, @@ -475,75 +517,185 @@ wire_to_event(dpy,re,event) amev->keycode = am->keycode; amev->press = am->press; amev->key_event_follows = am->keyEventFollows; + amev->group = am->group; + amev->mods = am->mods; memcpy(amev->message,am->message,XkbActionMessageLength); + amev->message[XkbActionMessageLength]= '\0'; + return True; + } + } + break; + case XkbExtensionDeviceNotify: + { + if (xkbi->selected_events&XkbExtensionDeviceNotifyMask) { + xkbExtensionDeviceNotify *ed= + (xkbExtensionDeviceNotify *)event; + XkbExtensionDeviceNotifyEvent *edev; + edev= (XkbExtensionDeviceNotifyEvent *)re; + edev->type= XkbEventCode+xkbi->codes->first_event; + edev->xkb_type= XkbExtensionDeviceNotify; + edev->serial= _XSetLastRequestRead(dpy, + (xGenericReply *)event); + edev->send_event= ((event->u.u.type&0x80)!=0); + edev->display= dpy; + edev->time= ed->time; + edev->device= ed->deviceID; + edev->led_class= ed->ledClass; + edev->led_id= ed->ledID; + edev->reason= ed->reason; + edev->supported= ed->supported; + edev->leds_defined= ed->ledsDefined; + edev->led_state= ed->ledState; + edev->first_btn= ed->firstBtn; + edev->num_btns= ed->nBtns; + edev->unsupported= ed->unsupported; + return True; + } + } + break; + case XkbNewKeyboardNotify: + { + xkbNewKeyboardNotify *nkn = (xkbNewKeyboardNotify *)event; + if ((xkbi->selected_events&XkbNewKeyboardNotifyMask)&& + (xkbi->selected_nkn_details&nkn->changed)) { + XkbNewKeyboardNotifyEvent *nkev; + nkev =(XkbNewKeyboardNotifyEvent *)re; + nkev->type = XkbEventCode+xkbi->codes->first_event; + nkev->xkb_type = XkbNewKeyboardNotify; + nkev->serial = _XSetLastRequestRead(dpy, + (xGenericReply *)event); + nkev->send_event = ((event->u.u.type&0x80)!=0); + nkev->display = dpy; + nkev->time = nkn->time; + nkev->device = nkn->deviceID; + nkev->old_device = nkn->oldDeviceID; + nkev->min_key_code = nkn->minKeyCode; + nkev->max_key_code = nkn->maxKeyCode; + nkev->old_min_key_code = nkn->oldMinKeyCode; + nkev->old_max_key_code = nkn->oldMaxKeyCode; + nkev->req_major = nkn->requestMajor; + nkev->req_minor = nkn->requestMinor; + nkev->changed = nkn->changed; + if ((xkbi->desc)&&(nkev->send_event==0)&& + ((xkbi->desc->device_spec==nkev->old_device)|| + (nkev->device!=nkev->old_device))) { + xkbi->flags= XkbMapPending|XkbXlibNewKeyboard; + } + return True; + } + else if(nkn->changed&(XkbNKN_KeycodesMask|XkbNKN_DeviceIDMask)){ + register XMappingEvent *ev = (XMappingEvent *)re; + ev->type = MappingNotify; + ev->serial = _XSetLastRequestRead(dpy, + (xGenericReply *)event); + ev->send_event = ((event->u.u.type&0x80)!=0); + ev->display = dpy; + ev->window = 0; + ev->first_keycode = dpy->min_keycode; + ev->request = MappingKeyboard; + ev->count = (dpy->max_keycode-dpy->min_keycode)+1; + if ((xkbi->desc)&&(ev->send_event==0)&& + ((xkbi->desc->device_spec==nkn->oldDeviceID)|| + (nkn->deviceID!=nkn->oldDeviceID))) { + xkbi->flags|= XkbMapPending|XkbXlibNewKeyboard; + } + return True; } } break; default: +#ifdef DEBUG fprintf(stderr,"Got unknown Xkb event (%d, base=%d)\n",re->type, xkbi->codes->first_event); +#endif break; } return False; } Bool +#if NeedFunctionPrototypes +XkbIgnoreExtension(Bool ignore) +#else XkbIgnoreExtension(ignore) Bool ignore; +#endif { + if (getenv("XKB_FORCE")!=NULL) { +#ifdef DEBUG + fprintf(stderr,"Forcing use of XKB (overriding an IgnoreExtensions)\n"); +#endif + return False; + } +#ifdef DEBUG + else if (getenv("XKB_DEBUG")!=NULL) { + fprintf(stderr,"Explicitly %signoring XKB\n",ignore?"":"not "); + } +#endif _XkbIgnoreExtension = ignore; return True; } static void +#if NeedFunctionPrototypes +_XkbFreeInfo(Display *dpy) +#else _XkbFreeInfo(dpy) Display *dpy; +#endif { XkbInfoPtr xkbi = dpy->xkb_info; if (xkbi) { if (xkbi->desc) - Xfree(xkbi->desc); - if (xkbi->modmap) - Xfree(xkbi->modmap); + XkbFreeKeyboard(xkbi->desc,XkbAllComponentsMask,True); Xfree(xkbi); } } Bool -XkbUseExtension(dpy) - Display *dpy; +#if NeedFunctionPrototypes +XkbUseExtension(Display *dpy,int *major_rtrn,int *minor_rtrn) +#else +XkbUseExtension(dpy,major_rtrn,minor_rtrn) + Display * dpy; + int * major_rtrn; + int * minor_rtrn; +#endif { xkbUseExtensionReply rep; register xkbUseExtensionReq *req; XExtCodes *codes; - int ev_base; + int ev_base,forceIgnore; XkbInfoPtr xkbi; -#ifdef DEBUG + char * str; static int debugMsg; -#endif static int been_here= 0; - if ( dpy->xkb_info ) + if ( dpy->xkb_info ) { + if (major_rtrn) *major_rtrn= dpy->xkb_info->srv_major; + if (minor_rtrn) *minor_rtrn= dpy->xkb_info->srv_minor; return True; + } if (!been_here) { -#ifdef DEBUG debugMsg= (getenv("XKB_DEBUG")!=NULL); -#endif been_here= 1; } - if ((dpy->flags&XlibDisplayNoXkb) || dpy->keysyms || - _XkbIgnoreExtension || getenv("XKB_DISABLE")) { + + if (major_rtrn) *major_rtrn= 0; + if (minor_rtrn) *minor_rtrn= 0; + + forceIgnore= (dpy->flags&XlibDisplayNoXkb)||dpy->keysyms; + forceIgnore= forceIgnore&(major_rtrn==NULL)&&(minor_rtrn==NULL); + if ( forceIgnore || _XkbIgnoreExtension || getenv("XKB_DISABLE")) { LockDisplay(dpy); dpy->flags |= XlibDisplayNoXkb; UnlockDisplay(dpy); -#ifdef DEBUG if (debugMsg) fprintf(stderr,"XKB extension disabled or missing\n"); -#endif return False; } - xkbi = (XkbInfoPtr)Xcalloc(1, sizeof(XkbInfoRec)); + xkbi = _XkbTypedCalloc(1, XkbInfoRec); if ( !xkbi ) return False; @@ -552,10 +704,8 @@ XkbUseExtension(dpy) dpy->flags |= XlibDisplayNoXkb; UnlockDisplay(dpy); Xfree(xkbi); -#ifdef DEBUG if (debugMsg) fprintf(stderr,"XKB extension not present\n"); -#endif return False; } xkbi->codes = codes; @@ -566,34 +716,120 @@ XkbUseExtension(dpy) req->xkbReqType = X_kbUseExtension; req->wantedMajor = XkbMajorVersion; req->wantedMinor = XkbMinorVersion; - if (!_XReply(dpy, (xReply *)&rep, 0, xFalse) || !rep.supported) { -#ifdef DEBUG + if (!_XReply(dpy, (xReply *)&rep, 0, xFalse) || !rep.supported ) { + Bool fail; + fail= True; if (debugMsg) fprintf(stderr, "XKB version mismatch (want %d.%02d, got %d.%02d)\n", XkbMajorVersion,XkbMinorVersion, rep.serverMajor, rep.serverMinor); -#endif - /* could theoretically try for an older version here */ - dpy->flags |= XlibDisplayNoXkb; - UnlockDisplay(dpy); - SyncHandle(); - Xfree(xkbi); - return False; + + /* pre-release 0.65 is very close to 1.00 */ + if ((rep.serverMajor==0)&&(rep.serverMinor==65)) { + if (debugMsg) + fprintf(stderr,"Trying to fall back to version 0.65..."); + GetReq(kbUseExtension, req); + req->reqType = xkbi->codes->major_opcode; + req->xkbReqType = X_kbUseExtension; + req->wantedMajor = 0; + req->wantedMinor = 65; + if ( _XReply(dpy, (xReply *)&rep, 0, xFalse) && rep.supported ) { + if (debugMsg) + fprintf(stderr,"succeeded\n"); + fail= False; + } + else if (debugMsg) fprintf(stderr,"failed\n"); + } + if (fail) { + dpy->flags |= XlibDisplayNoXkb; + UnlockDisplay(dpy); + SyncHandle(); + Xfree(xkbi); + if (major_rtrn) *major_rtrn= rep.serverMajor; + if (minor_rtrn) *minor_rtrn= rep.serverMinor; + return False; + } } +#ifdef DEBUG + else if ( forceIgnore ) { + fprintf(stderr,"Internal Error! XkbUseExtension succeeded with forceIgnore set\n"); + } +#endif + UnlockDisplay(dpy); xkbi->srv_major= rep.serverMajor; xkbi->srv_minor= rep.serverMinor; -#ifdef DEBUG + if (major_rtrn) *major_rtrn= rep.serverMajor; + if (minor_rtrn) *minor_rtrn= rep.serverMinor; if (debugMsg) fprintf(stderr,"XKB (version %d.%02d/%d.%02d) OK!\n", XkbMajorVersion,XkbMinorVersion, rep.serverMajor,rep.serverMinor); -#endif dpy->xkb_info = xkbi; dpy->free_funcs->xkb = _XkbFreeInfo; ev_base = codes->first_event; - UnlockDisplay(dpy); + xkbi->xlib_ctrls|= (XkbLC_BeepOnComposeFail|XkbLC_ComposeLED); + if ((str=getenv("_XKB_OPTIONS_ENABLE"))!=NULL) { + if ((str=getenv("_XKB_LATIN1_LOOKUP"))!=NULL) { + if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) + xkbi->xlib_ctrls&= ~XkbLC_ForceLatin1Lookup; + else xkbi->xlib_ctrls|= XkbLC_ForceLatin1Lookup; + } + if ((str=getenv("_XKB_CONSUME_LOOKUP_MODS"))!=NULL) { + if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) + xkbi->xlib_ctrls&= ~XkbLC_ConsumeLookupMods; + else xkbi->xlib_ctrls|= XkbLC_ConsumeLookupMods; + } + if ((str=getenv("_XKB_CONSUME_SHIFT_AND_LOCK"))!=NULL) { + if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) + xkbi->xlib_ctrls&= ~XkbLC_AlwaysConsumeShiftAndLock; + else xkbi->xlib_ctrls|= XkbLC_AlwaysConsumeShiftAndLock; + } + if ((str=getenv("_XKB_IGNORE_NEW_KEYBOARDS"))!=NULL) { + if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) + xkbi->xlib_ctrls&= ~XkbLC_IgnoreNewKeyboards; + else xkbi->xlib_ctrls|= XkbLC_IgnoreNewKeyboards; + } + if ((str=getenv("_XKB_CONTROL_FALLBACK"))!=NULL) { + if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) + xkbi->xlib_ctrls&= ~XkbLC_ControlFallback; + else xkbi->xlib_ctrls|= XkbLC_ControlFallback; + } + if ((str=getenv("_XKB_COMP_LED"))!=NULL) { + if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) + xkbi->xlib_ctrls&= ~XkbLC_ComposeLED; + else { + xkbi->xlib_ctrls|= XkbLC_ComposeLED; + if (strlen(str)>0) + xkbi->composeLED= XInternAtom(dpy,str,False); + } + } + if ((str=getenv("_XKB_COMP_FAIL_BEEP"))!=NULL) { + if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) + xkbi->xlib_ctrls&= ~XkbLC_BeepOnComposeFail; + else xkbi->xlib_ctrls|= XkbLC_BeepOnComposeFail; + } + } + if ((xkbi->composeLED==None)&&((xkbi->xlib_ctrls&XkbLC_ComposeLED)!=0)) + xkbi->composeLED= XInternAtom(dpy,"Compose",False); +#ifdef DEBUG + if (debugMsg) { + register unsigned c= xkbi->xlib_ctrls; + fprintf(stderr,"XKB compose: beep on failure is %s, LED is %s\n", + ((c&XkbLC_BeepOnComposeFail)?"on":"off"), + ((c&XkbLC_ComposeLED)?"on":"off")); + fprintf(stderr,"XKB XLookupString: %slatin-1, %s lookup modifiers\n", + ((c&XkbLC_ForceLatin1Lookup)?"allow non-":"force "), + ((c&XkbLC_ConsumeLookupMods)?"consume":"re-use")); + fprintf(stderr, + "XKB XLookupString: %sconsume shift and lock, %scontrol fallback\n", + ((c&XkbLC_AlwaysConsumeShiftAndLock)?"always ":"don't "), + ((c&XkbLC_ControlFallback)?"":"no ")); + + } +#endif XESetWireToEvent(dpy,ev_base+XkbEventCode,wire_to_event); SyncHandle(); return True; } + diff --git a/lib/X11/XKBlib.h b/lib/X11/XKBlib.h index f6ede0af7..ac354d1e2 100644 --- a/lib/X11/XKBlib.h +++ b/lib/X11/XKBlib.h @@ -1,4 +1,4 @@ -/* $XConsortium: XKBlib.h,v 1.8 94/04/08 15:11:49 erik Exp $ */ +/* $XConsortium: XKBlib.h /main/17 1996/03/01 14:30:14 kaleb $ */ /************************************************************ Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. @@ -31,203 +31,265 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include <X11/extensions/XKBstr.h> typedef struct _XkbAnyEvent { - int type; /* XkbAnyEvent */ - unsigned long serial; /* # of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Time time; /* milliseconds */ - int xkb_type; /* XkbStateNotify ... XkbCompatMapNotify */ - unsigned int device; /* device ID */ + int type; /* XkbAnyEvent */ + unsigned long serial; /* # of last req processed by server */ + Bool send_event; /* is this from a SendEvent request? */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XKB event minor code */ + unsigned int device; /* device ID */ } XkbAnyEvent; -typedef struct _XkbStateNotifyEvent { - int type; /* XkbAnyEvent */ - unsigned long serial; /* # of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Time time; /* milliseconds */ - int xkb_type; /* XkbStateNotify */ - unsigned int device; /* device ID */ - unsigned int keycode; /* keycode that caused the change */ - unsigned int event_type;/* KeyPress or KeyRelease */ - unsigned int req_major;/* Major opcode of request */ - unsigned int req_minor;/* Minor opcode of request */ - unsigned int changed; /* mask of changed state components */ - unsigned int group; /* keyboard group */ - unsigned int base_group;/* base keyboard group */ - unsigned int latched_group;/* latched keyboard group */ - unsigned int locked_group; /* locked keyboard group */ - unsigned int mods; /* modifier state */ - unsigned int base_mods; /* base modifier state */ - unsigned int latched_mods; /* latched modifiers */ - unsigned int locked_mods; /* locked modifiers */ - unsigned int compat_state; /* compatibility state */ -} XkbStateNotifyEvent; +typedef struct _XkbNewKeyboardNotify { + int type; /* XkbAnyEvent */ + unsigned long serial; /* of last req processed by server */ + Bool send_event; /* is this from a SendEvent request? */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XkbNewKeyboardNotify */ + int device; /* device ID */ + int old_device; /* device ID of previous keyboard */ + int min_key_code; /* minimum key code */ + int max_key_code; /* maximum key code */ + int old_min_key_code;/* min key code of previous kbd */ + int old_max_key_code;/* max key code of previous kbd */ + unsigned int changed; /* changed aspects of the keyboard */ + char req_major; /* major and minor opcode of req */ + char req_minor; /* that caused change, if applicable */ +} XkbNewKeyboardNotifyEvent; typedef struct _XkbMapNotifyEvent { - int type; /* XkbAnyEvent */ - unsigned long serial; /* of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Time time; /* milliseconds */ - int xkb_type; /* XkbMapNotify */ - unsigned int device; /* device ID */ - unsigned int changed; /* fields which have been changed */ - unsigned int resized; /* fields which have been resized */ - unsigned int first_type; /* first changed key type */ - unsigned int num_types; /* number of changed key types */ - unsigned int first_key_sym; /* first changed key sym */ - unsigned int num_key_syms; /* number of changed key syms */ - unsigned int first_key_act; /* first changed key act */ - unsigned int num_key_acts; /* number of changed key acts */ - unsigned int first_key_behavior;/* first changed key behavior */ - unsigned int num_key_behaviors; /* number of changed key behaviors */ - unsigned int vmods; /* mask of changed virtual mods */ - unsigned int first_key_explicit;/* range of keys with changed... */ - unsigned int num_key_explicit; /* ...explicit component settings */ + int type; /* XkbAnyEvent */ + unsigned long serial; /* of last req processed by server */ + Bool send_event; /* is this from a SendEvent request */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XkbMapNotify */ + int device; /* device ID */ + unsigned int changed; /* fields which have been changed */ + unsigned int flags; /* reserved */ + int first_type; /* first changed key type */ + int num_types; /* number of changed key types */ + KeyCode min_key_code; + KeyCode max_key_code; + KeyCode first_key_sym; + KeyCode first_key_act; + KeyCode first_key_behavior; + KeyCode first_key_explicit; + KeyCode first_modmap_key; + KeyCode first_vmodmap_key; + int num_key_syms; + int num_key_acts; + int num_key_behaviors; + int num_key_explicit; + int num_modmap_keys; + int num_vmodmap_keys; + unsigned int vmods; /* mask of changed virtual mods */ } XkbMapNotifyEvent; +typedef struct _XkbStateNotifyEvent { + int type; /* XkbAnyEvent */ + unsigned long serial; /* # of last req processed by server */ + Bool send_event; /* is this from a SendEvent request? */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XkbStateNotify */ + int device; /* device ID */ + unsigned int changed; /* mask of changed state components */ + int group; /* keyboard group */ + int base_group; /* base keyboard group */ + int latched_group; /* latched keyboard group */ + int locked_group; /* locked keyboard group */ + unsigned int mods; /* modifier state */ + unsigned int base_mods; /* base modifier state */ + unsigned int latched_mods; /* latched modifiers */ + unsigned int locked_mods; /* locked modifiers */ + int compat_state; /* compatibility state */ + unsigned char grab_mods; /* mods used for grabs */ + unsigned char compat_grab_mods;/* grab mods for non-XKB clients */ + unsigned char lookup_mods; /* mods sent to clients */ + unsigned char compat_lookup_mods; /* mods sent to non-XKB clients */ + int ptr_buttons; /* pointer button state */ + KeyCode keycode; /* keycode that caused the change */ + char event_type; /* KeyPress or KeyRelease */ + char req_major; /* Major opcode of request */ + char req_minor; /* Minor opcode of request */ +} XkbStateNotifyEvent; + typedef struct _XkbControlsNotify { - int type; /* XkbAnyEvent */ - unsigned long serial; /* of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Time time; /* milliseconds */ - int xkb_type; /* XkbControlsNotify */ - unsigned int device; /* device ID */ - unsigned long int changed_ctrls; - unsigned long int enabled_ctrls; - unsigned long int enabled_ctrl_changes; - unsigned int keycode; - unsigned int event_type; - unsigned int req_major; - unsigned int req_minor; + int type; /* XkbAnyEvent */ + unsigned long serial; /* of last req processed by server */ + Bool send_event; /* is this from a SendEvent request? */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XkbControlsNotify */ + int device; /* device ID */ + unsigned int changed_ctrls; /* controls with changed sub-values */ + unsigned int enabled_ctrls; /* controls currently enabled */ + unsigned int enabled_ctrl_changes;/* controls just {en,dis}abled */ + int num_groups; /* total groups on keyboard */ + KeyCode keycode; /* key that caused change or 0 */ + char event_type; /* type of event that caused change */ + char req_major; /* if keycode==0, major and minor */ + char req_minor; /* opcode of req that caused change */ } XkbControlsNotifyEvent; typedef struct _XkbIndicatorNotify { - int type; /* XkbAnyEvent */ - unsigned long serial; /* of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Time time; /* milliseconds */ - int xkb_type; /* XkbIndicatorNotify */ - unsigned int device; /* device ID */ - unsigned int state_changed;/* indicators that have changed state */ - unsigned int state; /* current state of all indicators */ - unsigned int map_changed;/* indicators whose maps have changed */ + int type; /* XkbAnyEvent */ + unsigned long serial; /* of last req processed by server */ + Bool send_event; /* is this from a SendEvent request? */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XkbIndicatorNotify */ + int device; /* device ID */ + unsigned int changed; /* indicators with new state or map */ + unsigned int state; /* current state of all indicators */ } XkbIndicatorNotifyEvent; -typedef struct _XkbBellNotify { - int type; /* XkbAnyEvent */ - unsigned long serial; /* of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Time time; /* milliseconds */ - int xkb_type; /* XkbBellNotify */ - unsigned int device; /* device ID */ - unsigned int percent; /* requested volume as a percent of maximum */ - unsigned int pitch; /* requested pitch in Hz */ - unsigned int duration; /* requested duration in milliseconds */ - unsigned int bell_class;/* (input extension) class of feedback */ - unsigned int bell_id; /* (input extension) ID of feedback */ - Atom name; /* "name" of requested bell */ - Window window; /* window associated with event (if any) */ -} XkbBellNotifyEvent; - -typedef struct _XkbSlowKeyNotify { - int type; /* XkbAnyEvent */ - unsigned long serial; /* of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Time time; /* milliseconds */ - int xkb_type; /* XkbSlowKeyNotify */ - unsigned int device; /* device ID */ - unsigned int slow_key_state;/* press, release, accept, reject */ - unsigned int keycode; /* key of event */ - unsigned int delay; /* current delay in milliseconds */ -} XkbSlowKeyNotifyEvent; - typedef struct _XkbNamesNotify { - int type; /* XkbAnyEvent */ - unsigned long serial; /* of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Time time; /* milliseconds */ - int xkb_type; /* XkbNamesNotify */ - unsigned int device; /* device ID */ - unsigned int changed; /* names that have changed */ - unsigned int first_type; /* first key type with new name */ - unsigned int num_types; /* number of key types with new names */ - unsigned int first_lvl; /* first key type new new level names */ - unsigned int num_lvls; /* # of key types w/new level names */ - unsigned int first_radio_group; /* first radio group with new name */ - unsigned int num_radio_groups; /* # of radio groups with new names */ - unsigned int num_char_sets; /* total number of charsets */ - unsigned int changed_mods; /* modifiers with new names */ - unsigned int changed_vmods;/* virtual modifiers with new names */ - unsigned int changed_indicators;/* indicators with new names */ + int type; /* XkbAnyEvent */ + unsigned long serial; /* of last req processed by server */ + Bool send_event; /* is this from a SendEvent request? */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XkbNamesNotify */ + int device; /* device ID */ + unsigned int changed; /* names that have changed */ + int first_type; /* first key type with new name */ + int num_types; /* number of key types with new names */ + int first_lvl; /* first key type new new level names */ + int num_lvls; /* # of key types w/new level names */ + int num_aliases; /* total number of key aliases*/ + int num_radio_groups;/* total number of radio groups */ + unsigned int changed_vmods; /* virtual modifiers with new names */ + unsigned int changed_groups; /* groups with new names */ + unsigned int changed_indicators;/* indicators with new names */ + int first_key; /* first key with new name */ + int num_keys; /* number of keys with new names */ } XkbNamesNotifyEvent; typedef struct _XkbCompatMapNotify { - int type; /* XkbAnyEvent */ - unsigned long serial; /* of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Time time; /* milliseconds */ - int xkb_type; /* XkbCompatMapNotify */ - unsigned int device; /* device ID */ - unsigned int changed_mods; /* modifiers with new compat maps */ - unsigned int changed_vmods;/* virtual mods w/new compat maps */ - unsigned int first_si; /* first new symbol interp */ - unsigned int num_si; /* number of new symbol interps */ - unsigned int num_total_si; /* total # of symbol interps */ + int type; /* XkbAnyEvent */ + unsigned long serial; /* of last req processed by server */ + Bool send_event; /* is this from a SendEvent request? */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XkbCompatMapNotify */ + int device; /* device ID */ + unsigned int changed_groups; /* groups with new compat maps */ + int first_si; /* first new symbol interp */ + int num_si; /* number of new symbol interps */ + int num_total_si; /* total # of symbol interps */ } XkbCompatMapNotifyEvent; -typedef struct _XkbAlternateSymsNotify { - int type; /* XkbAnyEvent */ - unsigned long serial; /* of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Time time; /* milliseconds */ - int xkb_type; /* XkbAlternateSymsNotify */ - unsigned int device; /* device ID */ - unsigned int alt_syms_id;/* identifier of changed alt symbol set */ - unsigned int first_key; /* first key with new alternate syms */ - unsigned int num_keys; /* number of keys with alternate syms */ -} XkbAlternateSymsNotifyEvent; +typedef struct _XkbBellNotify { + int type; /* XkbAnyEvent */ + unsigned long serial; /* of last req processed by server */ + Bool send_event; /* is this from a SendEvent request? */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XkbBellNotify */ + int device; /* device ID */ + int percent; /* requested volume as a % of maximum */ + int pitch; /* requested pitch in Hz */ + int duration; /* requested duration in useconds */ + int bell_class; /* (input extension) feedback class */ + int bell_id; /* (input extension) ID of feedback */ + Atom name; /* "name" of requested bell */ + Window window; /* window associated with event */ + Bool event_only; /* "event only" requested */ +} XkbBellNotifyEvent; typedef struct _XkbActionMessage { - int type; /* XkbAnyEvent */ - unsigned long serial; /* of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Time time; /* milliseconds */ - int xkb_type; /* XkbActionMessage */ - unsigned int device; /* device ID */ - unsigned int keycode; /* key that generated the event */ - Bool press; /* true if act caused by key press */ - Bool key_event_follows; /* true if key event is also generated */ - char message[XkbActionMessageLength]; /* message generated by key */ + int type; /* XkbAnyEvent */ + unsigned long serial; /* of last req processed by server */ + Bool send_event; /* is this from a SendEvent request? */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XkbActionMessage */ + int device; /* device ID */ + KeyCode keycode; /* key that generated the event */ + Bool press; /* true if act caused by key press */ + Bool key_event_follows;/* true if key event also generated */ + int group; /* effective group */ + unsigned int mods; /* effective mods */ + char message[XkbActionMessageLength+1]; + /* message -- leave space for NUL */ } XkbActionMessageEvent; +typedef struct _XkbAccessXNotify { + int type; /* XkbAnyEvent */ + unsigned long serial; /* of last req processed by server */ + Bool send_event; /* is this from a SendEvent request? */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XkbAccessXNotify */ + int device; /* device ID */ + int detail; /* XkbAXN_* */ + int keycode; /* key of event */ + int sk_delay; /* current slow keys delay */ + int debounce_delay; /* current debounce delay */ +} XkbAccessXNotifyEvent; + +typedef struct _XkbExtensionDeviceNotify { + int type; /* XkbAnyEvent */ + unsigned long serial; /* of last req processed by server */ + Bool send_event; /* is this from a SendEvent request? */ + Display * display; /* Display the event was read from */ + Time time; /* milliseconds */ + int xkb_type; /* XkbExtensionDeviceNotify */ + int device; /* device ID */ + unsigned int reason; /* reason for the event */ + unsigned int supported; /* mask of supported features */ + unsigned int unsupported; /* mask of unsupported features */ + /* that some app tried to use */ + int first_btn; /* first button that changed */ + int num_btns; /* range of buttons changed */ + unsigned int leds_defined; /* indicators with names or maps */ + unsigned int led_state; /* current state of the indicators */ + int led_class; /* feedback class for led changes */ + int led_id; /* feedback id for led changes */ +} XkbExtensionDeviceNotifyEvent; + typedef union _XkbEvent { - int type; - XkbAnyEvent any; - XkbStateNotifyEvent state; - XkbMapNotifyEvent map; - XkbControlsNotifyEvent ctrls; - XkbIndicatorNotifyEvent indicators; - XkbBellNotifyEvent bell; - XkbSlowKeyNotifyEvent slow_key; - XkbNamesNotifyEvent names; - XkbCompatMapNotifyEvent compat; - XkbAlternateSymsNotifyEvent alt_syms; - XkbActionMessageEvent message; - XEvent core; + int type; + XkbAnyEvent any; + XkbNewKeyboardNotifyEvent new_kbd; + XkbMapNotifyEvent map; + XkbStateNotifyEvent state; + XkbControlsNotifyEvent ctrls; + XkbIndicatorNotifyEvent indicators; + XkbNamesNotifyEvent names; + XkbCompatMapNotifyEvent compat; + XkbBellNotifyEvent bell; + XkbActionMessageEvent message; + XkbAccessXNotifyEvent accessx; + XkbExtensionDeviceNotifyEvent device; + XEvent core; } XkbEvent; typedef struct _XkbKbdDpyState XkbKbdDpyStateRec,*XkbKbdDpyStatePtr; + /* XkbOpenDisplay error codes */ +#define XkbOD_Success 0 +#define XkbOD_BadLibraryVersion 1 +#define XkbOD_ConnectionRefused 2 +#define XkbOD_NonXkbServer 3 +#define XkbOD_BadServerVersion 4 + + /* Values for XlibFlags */ +#define XkbLC_ForceLatin1Lookup (1<<0) +#define XkbLC_ConsumeLookupMods (1<<1) +#define XkbLC_AlwaysConsumeShiftAndLock (1<<2) +#define XkbLC_IgnoreNewKeyboards (1<<3) +#define XkbLC_ControlFallback (1<<4) +#define XkbLC_ConsumeKeysOnComposeFail (1<<29) +#define XkbLC_ComposeLED (1<<30) +#define XkbLC_BeepOnComposeFail (1<<31) + +#define XkbLC_AllComposeControls (0xc0000000) +#define XkbLC_AllControls (0xc000001f) + _XFUNCPROTOBEGIN extern Bool XkbIgnoreExtension( @@ -236,9 +298,20 @@ extern Bool XkbIgnoreExtension( #endif ); +extern Display *XkbOpenDisplay( +#if NeedFunctionPrototypes + char * /* name */, + int * /* ev_rtrn */, + int * /* err_rtrn */, + int * /* major_rtrn */, + int * /* minor_rtrn */, + int * /* reason */ +#endif +); + extern Bool XkbQueryExtension( #if NeedFunctionPrototypes - Display * /* display */, + Display * /* dpy */, int * /* opcodeReturn */, int * /* eventBaseReturn */, int * /* errorBaseReturn */, @@ -249,38 +322,147 @@ extern Bool XkbQueryExtension( extern Bool XkbUseExtension( #if NeedFunctionPrototypes - Display * /* display */ + Display * /* dpy */, + int * /* major_rtrn */, + int * /* minor_rtrn */ #endif ); -extern Status XkbLibraryVersion( +extern Bool XkbLibraryVersion( #if NeedFunctionPrototypes int * /* libMajorRtrn */, int * /* libMinorRtrn */ #endif ); -extern Status XkbSetAutoRepeatRate( +extern unsigned int XkbSetXlibControls( +#if NeedFunctionPrototypes + Display* /* dpy */, + unsigned int /* affect */, + unsigned int /* values */ +#endif +); + +extern unsigned int XkbGetXlibControls( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* deviceSpec */, - unsigned /* delay */, - unsigned /* interval */ + Display* /* dpy */ +#endif +); + +typedef Atom (*XkbInternAtomFunc)( +#if NeedFunctionPrototypes + Display * /* dpy */, + _Xconst char * /* name */, + Bool /* only_if_exists */ +#endif +); + +typedef char * (*XkbGetAtomNameFunc)( +#if NeedFunctionPrototypes + Display * /* dpy */, + Atom /* atom */ +#endif +); + +extern void XkbSetAtomFuncs( +#if NeedFunctionPrototypes + XkbInternAtomFunc /* getAtom */, + XkbGetAtomNameFunc /* getName */ +#endif +); + +extern KeySym XkbKeycodeToKeysym( +#if NeedFunctionPrototypes + Display * /* dpy */, +#if NeedWidePrototypes + unsigned int /* kc */, +#else + KeyCode /* kc */, +#endif + int /* group */, + int /* level */ +#endif +); + +extern unsigned int XkbKeysymToModifiers( +#if NeedFunctionPrototypes + Display * /* dpy */, + KeySym /* ks */ +#endif +); + +extern Bool XkbLookupKeySym( +#if NeedFunctionPrototypes + Display * /* dpy */, + KeyCode /* keycode */, + unsigned int /* modifiers */, + unsigned int * /* modifiers_return */, + KeySym * /* keysym_return */ +#endif +); + +extern int XkbLookupKeyBinding( +#if NeedFunctionPrototypes + Display * /* dpy */, + KeySym /* sym_rtrn */, + unsigned int /* mods */, + char * /* buffer */, + int /* nbytes */, + int * /* extra_rtrn */ +#endif +); + +extern Bool XkbTranslateKeyCode( +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, + KeyCode /* keycode */, + unsigned int /* modifiers */, + unsigned int * /* modifiers_return */, + KeySym * /* keysym_return */ +#endif +); + +extern int XkbTranslateKeySym( +#if NeedFunctionPrototypes + Display * /* dpy */, + register KeySym * /* sym_return */, + unsigned int /* modifiers */, + char * /* buffer */, + int /* nbytes */, + int * /* extra_rtrn */ +#endif +); + +extern Bool XkbSetAutoRepeatRate( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int /* delay */, + unsigned int /* interval */ #endif ); extern Bool XkbGetAutoRepeatRate( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* deviceSpec */, - unsigned * /* delayRtrn */, - unsigned * /* intervalRtrn */ + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int * /* delayRtrn */, + unsigned int * /* intervalRtrn */ +#endif +); + +extern Bool XkbChangeEnabledControls( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int /* affect */, + unsigned int /* values */ #endif ); extern Bool XkbDeviceBell( #if NeedFunctionPrototypes - Display * /* display */, + Display * /* dpy */, Window /* win */, int /* deviceSpec */, int /* bellClass */, @@ -292,7 +474,7 @@ extern Bool XkbDeviceBell( extern Bool XkbForceDeviceBell( #if NeedFunctionPrototypes - Display * /* display */, + Display * /* dpy */, int /* deviceSpec */, int /* bellClass */, int /* bellID */, @@ -300,9 +482,21 @@ extern Bool XkbForceDeviceBell( #endif ); +extern Bool XkbDeviceBellEvent( +#if NeedFunctionPrototypes + Display * /* dpy */, + Window /* win */, + int /* deviceSpec */, + int /* bellClass */, + int /* bellID */, + int /* percent */, + Atom /* name */ +#endif +); + extern Bool XkbBell( #if NeedFunctionPrototypes - Display * /* display */, + Display * /* dpy */, Window /* win */, int /* percent */, Atom /* name */ @@ -311,100 +505,214 @@ extern Bool XkbBell( extern Bool XkbForceBell( #if NeedFunctionPrototypes - Display * /* display */, + Display * /* dpy */, int /* percent */ #endif ); +extern Bool XkbBellEvent( +#if NeedFunctionPrototypes + Display * /* dpy */, + Window /* win */, + int /* percent */, + Atom /* name */ +#endif +); + extern Bool XkbSelectEvents( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* deviceID */, - unsigned long /* affect */, - unsigned long /* values */ + Display * /* dpy */, + unsigned int /* deviceID */, + unsigned int /* affect */, + unsigned int /* values */ #endif ); extern Bool XkbSelectEventDetails( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* deviceID */, - unsigned /* eventType */, + Display * /* dpy */, + unsigned int /* deviceID */, + unsigned int /* eventType */, unsigned long /* affect */, unsigned long /* details */ #endif ); +extern void XkbNoteMapChanges( +#if NeedFunctionPrototypes + XkbMapChangesPtr /* old */, + XkbMapNotifyEvent * /* new */, + unsigned int /* wanted */ +#endif +); + +extern void XkbNoteNameChanges( +#if NeedFunctionPrototypes + XkbNameChangesPtr /* old */, + XkbNamesNotifyEvent * /* new */, + unsigned int /* wanted */ +#endif +); + extern Status XkbGetIndicatorState( #if NeedFunctionPrototypes - Display * /* dpy */, - unsigned int /* deviceSpec */, - unsigned int * /* pStateRtrn */ + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int * /* pStateRtrn */ +#endif +); + +extern Status XkbGetDeviceIndicatorState( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int /* ledClass */, + unsigned int /* ledID */, + unsigned int * /* pStateRtrn */ #endif ); extern Status XkbGetIndicatorMap( #if NeedFunctionPrototypes - Display * /* display */, + Display * /* dpy */, unsigned long /* which */, XkbDescPtr /* desc */ #endif ); -extern Status XkbSetIndicatorMap( +extern Bool XkbSetIndicatorMap( #if NeedFunctionPrototypes - Display * /* display */, + Display * /* dpy */, unsigned long /* which */, XkbDescPtr /* desc */ #endif ); -extern Status XkbLockModifiers( +#define XkbNoteIndicatorMapChanges(o,n,w) \ + ((o)->map_changes|=((n)->map_changes&(w))) +#define XkbNoteIndicatorStateChanges(o,n,w)\ + ((o)->state_changes|=((n)->state_changes&(w))) +#define XkbGetIndicatorMapChanges(d,x,c) \ + (XkbGetIndicatorMap((d),(c)->map_changes,x) +#define XkbChangeIndicatorMaps(d,x,c) \ + (XkbSetIndicatorMap((d),(c)->map_changes,x)) + +extern Bool XkbGetNamedIndicator( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* deviceSpec */, - unsigned /* affect */, - unsigned /* values */ + Display * /* dpy */, + Atom /* name */, + int * /* pNdxRtrn */, + Bool * /* pStateRtrn */, + XkbIndicatorMapPtr /* pMapRtrn */, + Bool * /* pRealRtrn */ #endif ); -extern Status XkbLatchModifiers( +extern Bool XkbGetNamedDeviceIndicator( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* deviceSpec */, - unsigned /* affect */, - unsigned /* values */ + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int /* ledClass */, + unsigned int /* ledID */, + Atom /* name */, + int * /* pNdxRtrn */, + Bool * /* pStateRtrn */, + XkbIndicatorMapPtr /* pMapRtrn */, + Bool * /* pRealRtrn */ #endif ); -extern Status XkbSetServerInternalMods( +extern Bool XkbSetNamedIndicator( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* deviceSpec */, - unsigned /* affect */, - unsigned /* values */ + Display * /* dpy */, + Atom /* name */, + Bool /* changeState */, + Bool /* state */, + Bool /* createNewMap */, + XkbIndicatorMapPtr /* pMap */ #endif ); -extern Status XkbSetIgnoreLockMods( +extern Bool XkbSetNamedDeviceIndicator( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* deviceSpec */, - unsigned /* affect */, - unsigned /* values */ + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int /* ledClass */, + unsigned int /* ledID */, + Atom /* name */, + Bool /* changeState */, + Bool /* state */, + Bool /* createNewMap */, + XkbIndicatorMapPtr /* pMap */ #endif ); +extern Bool XkbLockModifiers( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int /* affect */, + unsigned int /* values */ +#endif +); -extern Status XkbVirtualModsToReal( +extern Bool XkbLatchModifiers( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int /* affect */, + unsigned int /* values */ +#endif +); + +extern Bool XkbLockGroup( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int /* group */ +#endif +); + +extern Bool XkbLatchGroup( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int /* group */ +#endif +); + +extern Bool XkbSetServerInternalMods( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int /* affectReal */, + unsigned int /* realValues */, + unsigned int /* affectVirtual */, + unsigned int /* virtualValues */ +#endif +); + +extern Bool XkbSetIgnoreLockMods( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* deviceSpec */, + unsigned int /* affectReal */, + unsigned int /* realValues */, + unsigned int /* affectVirtual */, + unsigned int /* virtualValues */ +#endif +); + + +extern Bool XkbVirtualModsToReal( #if NeedFunctionPrototypes XkbDescPtr /* xkb */, - unsigned /* virtual_mask */, - unsigned * /* mask_rtrn */ + unsigned int /* virtual_mask */, + unsigned int * /* mask_rtrn */ #endif ); -extern Status XkbComputeEffectiveMap( +extern Bool XkbComputeEffectiveMap( #if NeedFunctionPrototypes XkbDescPtr /* xkb */, XkbKeyTypePtr /* type */, @@ -415,220 +723,382 @@ extern Status XkbComputeEffectiveMap( extern Status XkbInitCanonicalKeyTypes( #if NeedFunctionPrototypes XkbDescPtr /* xkb */, - unsigned /* which */, + unsigned int /* which */, int /* keypadVMod */ #endif ); +extern XkbDescPtr XkbAllocKeyboard( +#if NeedFunctionPrototypes + void +#endif +); + +extern void XkbFreeKeyboard( +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, + unsigned int /* which */, + Bool /* freeDesc */ +#endif +); + extern Status XkbAllocClientMap( #if NeedFunctionPrototypes XkbDescPtr /* xkb */, - unsigned /* which */, - unsigned /* nTypes */ + unsigned int /* which */, + unsigned int /* nTypes */ #endif ); extern Status XkbAllocServerMap( #if NeedFunctionPrototypes XkbDescPtr /* xkb */, - unsigned /* which */, - unsigned /* nActions */ + unsigned int /* which */, + unsigned int /* nActions */ +#endif +); + +extern void XkbFreeClientMap( +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, + unsigned int /* what */, + Bool /* freeMap */ +#endif +); + +extern void XkbFreeServerMap( +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, + unsigned int /* what */, + Bool /* freeMap */ +#endif +); + +extern XkbKeyTypePtr XkbAddKeyType( +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, + Atom /* name */, + int /* map_count */, + Bool /* want_preserve */, + int /* num_lvls */ +#endif +); + +extern Status XkbAllocIndicatorMaps( +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */ +#endif +); + +extern void XkbFreeIndicatorMaps( +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */ #endif ); extern XkbDescPtr XkbGetMap( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* which */, - unsigned /* deviceSpec */ + Display * /* dpy */, + unsigned int /* which */, + unsigned int /* deviceSpec */ #endif ); extern Status XkbGetUpdatedMap( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* which */, + Display * /* dpy */, + unsigned int /* which */, XkbDescPtr /* desc */ #endif ); extern Status XkbGetMapChanges( #if NeedFunctionPrototypes - Display * /* display */, - XkbDescPtr /* desc */, - XkbChangesPtr /* changes */ + Display * /* dpy */, + XkbDescPtr /* xkb */, + XkbMapChangesPtr /* changes */ #endif ); -extern Status XkbGetActions( + +extern Status XkbRefreshKeyboardMapping( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* firstAction */, - unsigned /* nActions */, - XkbDescPtr /* desc */ + XkbMapNotifyEvent * /* event */ #endif ); -extern Status XkbGetRadioGroups( +extern Status XkbGetKeyTypes( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* firstRadioGroup */, - unsigned /* nRadioGroups */, - XkbDescPtr /* desc */ + Display * /* dpy */, + unsigned int /* first */, + unsigned int /* num */, + XkbDescPtr /* xkb */ #endif ); extern Status XkbGetKeySyms( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* firstKey */, - unsigned /* nKeys */, - XkbDescPtr /* desc */ + Display * /* dpy */, + unsigned int /* first */, + unsigned int /* num */, + XkbDescPtr /* xkb */ #endif ); extern Status XkbGetKeyActions( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* firstKey */, - unsigned /* nKeys */, - XkbDescPtr /* desc */ + Display * /* dpy */, + unsigned int /* first */, + unsigned int /* num */, + XkbDescPtr /* xkb */ #endif ); extern Status XkbGetKeyBehaviors( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* firstKey */, - unsigned /* nKeys */, + Display * /* dpy */, + unsigned int /* firstKey */, + unsigned int /* nKeys */, XkbDescPtr /* desc */ #endif ); extern Status XkbGetVirtualMods( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* which */, + Display * /* dpy */, + unsigned int /* which */, XkbDescPtr /* desc */ #endif ); extern Status XkbGetKeyExplicitComponents( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* firstKey */, - unsigned /* nKeys */, + Display * /* dpy */, + unsigned int /* firstKey */, + unsigned int /* nKeys */, + XkbDescPtr /* desc */ +#endif +); + +extern Status XkbGetKeyModifierMap( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* firstKey */, + unsigned int /* nKeys */, XkbDescPtr /* desc */ #endif ); +extern Status XkbAllocControls( +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, + unsigned int /* which*/ +#endif +); + +extern void XkbFreeControls( +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, + unsigned int /* which */, + Bool /* freeMap */ +#endif +); + extern Status XkbGetControls( #if NeedFunctionPrototypes - Display * /* display */, + Display * /* dpy */, unsigned long /* which */, XkbDescPtr /* desc */ #endif ); -extern Status XkbSetControls( +extern Bool XkbSetControls( #if NeedFunctionPrototypes - Display * /* display */, + Display * /* dpy */, unsigned long /* which */, XkbDescPtr /* desc */ #endif ); +extern void XkbNoteControlsChanges( +#if NeedFunctionPrototypes + XkbControlsChangesPtr /* old */, + XkbControlsNotifyEvent * /* new */, + unsigned int /* wanted */ +#endif +); + +#define XkbGetControlsChanges(d,x,c) XkbGetControls(d,(c)->changed_ctrls,x) +#define XkbChangeControls(d,x,c) XkbSetControls(d,(c)->changed_ctrls,x) + extern Status XkbAllocCompatMap( #if NeedFunctionPrototypes XkbDescPtr /* xkb */, - unsigned /* which */, - unsigned /* nInterpret */ + unsigned int /* which */, + unsigned int /* nInterpret */ #endif ); -extern Status XkbFreeCompatMap( +extern void XkbFreeCompatMap( #if NeedFunctionPrototypes XkbDescPtr /* xkb */, - Bool /* all */, - unsigned /* which */ + unsigned int /* which */, + Bool /* freeMap */ #endif ); extern Status XkbGetCompatMap( #if NeedFunctionPrototypes Display * /* dpy */, - unsigned /* which */, + unsigned int /* which */, XkbDescPtr /* xkb */ #endif ); -extern Status XkbSetCompatMap( +extern Bool XkbSetCompatMap( #if NeedFunctionPrototypes Display * /* dpy */, - unsigned /* which */, + unsigned int /* which */, XkbDescPtr /* xkb */, Bool /* updateActions */ #endif ); -extern Status XkbAllocNames( +extern XkbSymInterpretPtr XkbAddSymInterpret( #if NeedFunctionPrototypes XkbDescPtr /* xkb */, - unsigned /* which */ + XkbSymInterpretPtr /* si */, + Bool /* updateMap */, + XkbChangesPtr /* changes */ #endif ); -extern Status XkbFreeNames( +extern Status XkbAllocNames( #if NeedFunctionPrototypes XkbDescPtr /* xkb */, - Bool /* all */, - unsigned /* which */ + unsigned int /* which */, + int /* nTotalRG */, + int /* nTotalAliases */ #endif ); extern Status XkbGetNames( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* which */, + Display * /* dpy */, + unsigned int /* which */, XkbDescPtr /* desc */ #endif ); -extern Status XkbSetNames( +extern Bool XkbSetNames( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* which */, - unsigned /* firstColMap */, - unsigned /* nColMaps */, + Display * /* dpy */, + unsigned int /* which */, + unsigned int /* firstType */, + unsigned int /* nTypes */, XkbDescPtr /* desc */ #endif ); +extern Bool XkbChangeNames( +#if NeedFunctionPrototypes + Display * /* dpy */, + XkbDescPtr /* xkb */, + XkbNameChangesPtr /* changes */ +#endif +); + +extern void XkbFreeNames( +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, + unsigned int /* which */, + Bool /* freeMap */ +#endif +); + + extern Status XkbGetState( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* deviceSpec */, + Display * /* dpy */, + unsigned int /* deviceSpec */, XkbStatePtr /* rtrnState */ #endif ); -extern Status XkbSetMap( +extern Bool XkbSetMap( #if NeedFunctionPrototypes - Display * /* display */, - unsigned /* which */, + Display * /* dpy */, + unsigned int /* which */, XkbDescPtr /* desc */ #endif ); -extern Status XkbChangeMap( +extern Bool XkbChangeMap( #if NeedFunctionPrototypes - Display* /* display */, + Display* /* dpy */, XkbDescPtr /* desc */, - XkbMapChangesRec * /* changes */ + XkbMapChangesPtr /* changes */ #endif ); -extern KeySym *XkbEnlargeKeySyms( +extern Bool XkbSetDetectableAutoRepeat( +#if NeedFunctionPrototypes + Display * /* dpy */, + Bool /* detectable */, + Bool * /* supported */ +#endif +); + +extern Bool XkbGetDetectableAutoRepeat( +#if NeedFunctionPrototypes + Display * /* dpy */, + Bool * /* supported */ +#endif +); + +extern Bool XkbSetAutoResetControls( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* changes */, + unsigned int * /* auto_ctrls */, + unsigned int * /* auto_values */ +#endif +); + +extern Bool XkbGetAutoResetControls( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int * /* auto_ctrls */, + unsigned int * /* auto_ctrl_values */ +#endif +); + +extern Status XkbCopyKeyType( +#if NeedFunctionPrototypes + XkbKeyTypePtr /* from */, + XkbKeyTypePtr /* into */ +#endif +); + +extern Status XkbCopyKeyTypes( +#if NeedFunctionPrototypes + XkbKeyTypePtr /* from */, + XkbKeyTypePtr /* into */, + int /* num_types */ +#endif +); + +extern Status XkbResizeKeyType( +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, + int /* type_ndx */, + int /* map_count */, + Bool /* want_preserve */, + int /* new_num_lvls */ +#endif +); + +extern KeySym *XkbResizeKeySyms( #if NeedFunctionPrototypes XkbDescPtr /* desc */, int /* forKey */, @@ -636,7 +1106,7 @@ extern KeySym *XkbEnlargeKeySyms( #endif ); -extern XkbAction *XkbEnlargeKeyActions( +extern XkbAction *XkbResizeKeyActions( #if NeedFunctionPrototypes XkbDescPtr /* desc */, int /* forKey */, @@ -644,55 +1114,219 @@ extern XkbAction *XkbEnlargeKeyActions( #endif ); -extern Status XkbChangeTypeOfKey( +extern Status XkbChangeTypesOfKey( #if NeedFunctionPrototypes XkbDescPtr /* xkb */, - unsigned /* key */, - unsigned /* newType */, - XkbMapChangesRec * /* pChanges */ + int /* key */, + int /* num_groups */, + unsigned int /* groups */, + int * /* newTypes */, + XkbMapChangesPtr /* pChanges */ #endif ); -extern Status XkbChangeSymsForKey( +/***====================================================================***/ + +extern XkbComponentListPtr XkbListComponents( #if NeedFunctionPrototypes - XkbDescPtr /* xkb */, - unsigned /* key */, - unsigned /* count */, - KeySym * /* syms */, - XkbMapChangesRec * /* pChanges */ + Display * /* dpy */, + unsigned int /* deviceSpec */, + XkbComponentNamesPtr /* ptrns */, + int * /* max_inout */ +#endif +); + +extern void XkbFreeComponentList( +#if NeedFunctionPrototypes + XkbComponentListPtr /* list */ +#endif +); + +extern XkbDescPtr XkbGetKeyboard( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* which */, + unsigned int /* deviceSpec */ +#endif +); + +extern XkbDescPtr XkbGetKeyboardByName( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* deviceSpec */, + XkbComponentNamesPtr /* names */, + unsigned int /* want */, + unsigned int /* need */, + Bool /* load */ +#endif +); + +/***====================================================================***/ + +extern int XkbKeyTypesForCoreSymbols( /* returns # of groups */ +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, /* keyboard device */ + int /* map_width */, /* width of core KeySym array */ + KeySym * /* core_syms */, /* always mapWidth symbols */ + unsigned int /* protected */, /* explicit key types */ + int * /* types_inout */, /* always four type indices */ + KeySym * /* xkb_syms_rtrn */ /* must have enough space */ +#endif +); + +extern Bool XkbApplyCompatMapToKey( /* False only on error */ +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, /* keymap to be edited */ + KeyCode /* key */, /* key to be updated */ + XkbChangesPtr /* changes */ /* resulting changes to map */ +#endif +); + +extern Bool XkbUpdateMapFromCore( /* False only on error */ +#if NeedFunctionPrototypes + XkbDescPtr /* xkb */, /* XKB keyboard to be edited */ + KeyCode /* first_key */, /* first changed key */ + int /* num_keys */, /* number of changed keys */ + int /* map_width */, /* width of core keymap */ + KeySym * /* core_keysyms */, /* symbols from core keymap */ + XkbChangesPtr /* changes */ /* resulting changes */ +#endif +); + +/***====================================================================***/ + +extern XkbDeviceLedInfoPtr XkbAddDeviceLedInfo( +#if NeedFunctionPrototypes + XkbDeviceInfoPtr /* devi */, + unsigned int /* ledClass */, + unsigned int /* ledId */ +#endif +); + +extern Status XkbResizeDeviceButtonActions( +#if NeedFunctionPrototypes + XkbDeviceInfoPtr /* devi */, + unsigned int /* newTotal */ #endif ); -#ifdef NOTYET +extern XkbDeviceInfoPtr XkbAllocDeviceInfo( +#if NeedFunctionPrototypes + unsigned int /* deviceSpec */, + unsigned int /* nButtons */, + unsigned int /* szLeds */ +#endif +); -extern XkbKbdGeometryRec *XkbGetKbdGeometry( +extern void XkbFreeDeviceInfo( #if NeedFunctionPrototypes - Display *dpy, char *name + XkbDeviceInfoPtr /* devi */, + unsigned int /* which */, + Bool /* freeDevI */ #endif ); -extern XkbKbdDpyStateRec *XkbKbdZoom( +extern void XkbNoteDeviceChanges( #if NeedFunctionPrototypes - XkbKbdGeometryRec*,int w,int h + XkbDeviceChangesPtr /* old */, + XkbExtensionDeviceNotifyEvent * /* new */, + unsigned int /* wanted */ #endif ); -extern XkbKbdKeyRec *XkbKbdNextKey( + +extern XkbDeviceInfoPtr XkbGetDeviceInfo( #if NeedFunctionPrototypes - XkbKbdDpyStatePtr pState, - int *left,int *top, - int *right,int *bottom + Display * /* dpy */, + unsigned int /* which */, + unsigned int /* deviceSpec */, + unsigned int /* ledClass */, + unsigned int /* ledID */ #endif ); + +extern Status XkbGetDeviceInfoChanges( +#if NeedFunctionPrototypes + Display * /* dpy */, + XkbDeviceInfoPtr /* devi */, + XkbDeviceChangesPtr /* changes */ #endif +); + +extern Status XkbGetDeviceButtonActions( +#if NeedFunctionPrototypes + Display * /* dpy */, + XkbDeviceInfoPtr /* devi */, + Bool /* all */, + unsigned int /* first */, + unsigned int /* nBtns */ +#endif +); + +extern Status XkbGetDeviceLedInfo( +#if NeedFunctionPrototypes + Display * /* dpy */, + XkbDeviceInfoPtr /* devi */, + unsigned int /* ledClass (class, XIDflt, XIAll) */, + unsigned int /* ledId (id, XIDflt, XIAll) */, + unsigned int /* which (XkbXI_Indicator{Names,Map}Mask */ +#endif +); + +extern Bool XkbSetDeviceInfo( +#if NeedFunctionPrototypes + Display * /* dpy */, + unsigned int /* which */, + XkbDeviceInfoPtr /* devi */ +#endif +); + +extern Bool XkbChangeDeviceInfo( +#if NeedFunctionPrototypes + Display* /* dpy */, + XkbDeviceInfoPtr /* desc */, + XkbDeviceChangesPtr /* changes */ +#endif +); + +extern Bool XkbSetDeviceLedInfo( +#if NeedFunctionPrototypes + Display * /* dpy */, + XkbDeviceInfoPtr /* devi */, + unsigned int /* ledClass */, + unsigned int /* ledID */, + unsigned int /* which */ +#endif +); + +extern Bool XkbSetDeviceButtonActions( +#if NeedFunctionPrototypes + Display * /* dpy */, + XkbDeviceInfoPtr /* devi */, + unsigned int /* first */, + unsigned int /* nBtns */ +#endif +); + +/***====================================================================***/ + +extern char XkbToControl( +#if NeedFunctionPrototypes + char /* c */ +#endif +); + +/***====================================================================***/ -extern Status XkbSetDebuggingFlags( +extern Bool XkbSetDebuggingFlags( #if NeedFunctionPrototypes Display * /* dpy */, unsigned int /* mask */, unsigned int /* flags */, char * /* msg */, - unsigned int * /* rtrnFlags */, - Bool * /* disableLocks */ + unsigned int /* ctrls_mask */, + unsigned int /* ctrls */, + unsigned int * /* rtrn_flags */, + unsigned int * /* rtrn_ctrls */ #endif ); diff --git a/lib/xkbfile/XKBfile.h b/lib/xkbfile/XKBfile.h index 72d45d1cd..e0748f906 100644 --- a/lib/xkbfile/XKBfile.h +++ b/lib/xkbfile/XKBfile.h @@ -1,7 +1,7 @@ #ifndef _XKBFILE_H_ #define _XKBFILE_H_ 1 -/* $XConsortium: XKBfile.h /main/2 1995/12/07 21:18:19 kaleb $ */ +/* $XConsortium: XKBfile.h /main/5 1996/03/01 14:30:21 kaleb $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -191,6 +191,13 @@ extern char * XkbAccessXDetailText( #endif ); +extern char * XkbNKNDetailMaskText( +#if NeedFunctionPrototypes + unsigned /* detail */, + unsigned /* format */ +#endif +); + extern char * XkbControlsMaskText( #if NeedFunctionPrototypes unsigned /* ctrls */, @@ -256,7 +263,8 @@ extern unsigned _XkbKSCheckCase( extern int XkbFindKeycodeByName( #if NeedFunctionPrototypes XkbDescPtr /* xkb */, - char * /* name */ + char * /* name */, + Bool /* use_aliases */ #endif ); @@ -366,6 +374,13 @@ extern Bool XkbDetermineFileType( #endif ); +extern Bool XkbNameMatchesPattern( +#if NeedFunctionPrototypes + char * /* name */, + char * /* pattern */ +#endif +); + /***====================================================================***/ extern Bool XkbWriteXKBKeycodes( |