diff options
author | rws <empty> | 1993-09-28 21:40:02 +0000 |
---|---|---|
committer | rws <empty> | 1993-09-28 21:40:02 +0000 |
commit | a09340a7484582a0ed9c35a5c4f0859cd81693ad (patch) | |
tree | 8d4b90193f020fcffa770cde90595c885cdd8ebc /xc/lib/X11/XKB.c | |
parent | 0b2acd9bee24511cd1fcc16218b76c8f58494b29 (diff) |
add new funcs
Diffstat (limited to 'xc/lib/X11/XKB.c')
-rw-r--r-- | xc/lib/X11/XKB.c | 127 |
1 files changed, 126 insertions, 1 deletions
diff --git a/xc/lib/X11/XKB.c b/xc/lib/X11/XKB.c index bda4c1377..236513948 100644 --- a/xc/lib/X11/XKB.c +++ b/xc/lib/X11/XKB.c @@ -1,4 +1,4 @@ -/* $XConsortium: XKB.c,v 1.2 93/09/28 19:28:54 rws Exp $ */ +/* $XConsortium: XKB.c,v 1.3 93/09/28 19:48:24 rws Exp $ */ /************************************************************ Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. @@ -1001,6 +1001,131 @@ XkbAction *newActs; return &xkb->server->actions[xkb->server->keyActions[key]]; } +Status +XkbChangeTypeOfKey(xkb,key,newType,pChanges) + XkbDescRec *xkb; + unsigned key; + unsigned newType; + XkbMapChangesRec *pChanges; +{ +XkbKeyTypeRec *pOldType,*pNewType; + + if ((!xkb) || (key<xkb->minKeyCode) || (key>xkb->maxKeyCode) || + (!xkb->map)||(!xkb->map->keyTypes)||(newType>=xkb->map->nKeyTypes)) { + return 0; + } + + pOldType = XkbKeyKeyType(xkb,key); + pNewType = &xkb->map->keyTypes[newType]; + if (newType==xkb->map->keySymMap[key].ktIndex) { + return 1; + } + else if (pOldType->groupWidth==pNewType->groupWidth) { + xkb->map->keySymMap[key].ktIndex= newType; + } + else if (pOldType->groupWidth>pNewType->groupWidth) { + int g,l,nGroups; + int oldWidth,newWidth; + KeySym *pSyms; + + xkb->map->keySymMap[key].ktIndex= newType; + pSyms = XkbKeySymsPtr(xkb,key); + oldWidth = pOldType->groupWidth; + newWidth = pNewType->groupWidth; + nGroups= XkbKeyNumGroups(xkb,key); + for (g=1;g<nGroups;g++) { + for (l=0;l<newWidth;l++) { + pSyms[g*newWidth+l]= pSyms[g*oldWidth+l]; + } + } + } + else { + int g,l,nGroups; + int oldWidth,newWidth; + KeySym *pSyms; + + xkb->map->keySymMap[key].ktIndex= newType; + oldWidth = pOldType->groupWidth; + newWidth = pNewType->groupWidth; + nGroups= XkbKeyNumGroups(xkb,key); + pSyms = XkbEnlargeKeySymbols(xkb,key,newWidth*nGroups); + for (g=nGroups-1;g>=0;g--) { + for (l=newWidth-1;l>=oldWidth;l--) { + pSyms[g*newWidth+l]= NoSymbol; + } + for (l=oldWidth-1;l>=0;l--) { + pSyms[g*newWidth+l]= pSyms[g*oldWidth+l]; + } + } + } + if (pChanges->changed&XkbKeySymsMask) { + int first,last; + first= pChanges->firstKeySym; + last= pChanges->firstKeySym+pChanges->nKeySyms-1; + if (key<first) first= key; + if (key>last) last= key; + pChanges->firstKeySym = first; + pChanges->nKeySyms = (last-first)+1; + } + else { + pChanges->changed|= XkbKeySymsMask; + pChanges->firstKeySym= key; + pChanges->nKeySyms= 1; + } + return 1; +} + +Status +XkbChangeSymsForKey(xkb,key,count,syms,pChanges) + XkbDescRec *xkb; + unsigned key; + unsigned count; + KeySym *syms; + XkbMapChangesRec *pChanges; +{ +XkbKeyTypeRec *pType; +KeySym *pSyms; +int nGroups,nSyms; + + if ((!xkb) || (key<xkb->minKeyCode) || (key>xkb->maxKeyCode) || + (!xkb->map)||(!xkb->map->keyTypes)||(!xkb->map->keySymMap) || + (count<1)) + return 0; + + pType = XkbKeyKeyType(xkb,key); + nGroups = ((count+pType->groupWidth-1)/pType->groupWidth); + if ((nGroups<1)||(nGroups>8)) + return 0; + + nSyms= nGroups*pType->groupWidth; + pSyms= XkbEnlargeKeySymbols(xkb,key,nSyms); + if (!pSyms) + return 0; + + memcpy(pSyms,syms,count*sizeof(KeySym)); + while (count<nSyms) { + pSyms[count++]= NoSymbol; + } + xkb->map->keySymMap[key].groupInfo= + XkbSetNumGroups(xkb->map->keySymMap[key].groupInfo,nGroups); + + if (pChanges->changed&XkbKeySymsMask) { + int first,last; + first= pChanges->firstKeySym; + last= pChanges->firstKeySym+pChanges->nKeySyms-1; + if (key<first) first= key; + if (key>last) last= key; + pChanges->firstKeySym = first; + pChanges->nKeySyms = (last-first)+1; + } + else { + pChanges->changed|= XkbKeySymsMask; + pChanges->firstKeySym= key; + pChanges->nKeySyms= 1; + } + return; +} + static int _XkbReadKeyTypes(dpy,info,rep,replace) Display *dpy; |