summaryrefslogtreecommitdiff
path: root/xc/lib/X11/XKB.c
diff options
context:
space:
mode:
authorrws <empty>1993-09-28 21:40:02 +0000
committerrws <empty>1993-09-28 21:40:02 +0000
commita09340a7484582a0ed9c35a5c4f0859cd81693ad (patch)
tree8d4b90193f020fcffa770cde90595c885cdd8ebc /xc/lib/X11/XKB.c
parent0b2acd9bee24511cd1fcc16218b76c8f58494b29 (diff)
add new funcs
Diffstat (limited to 'xc/lib/X11/XKB.c')
-rw-r--r--xc/lib/X11/XKB.c127
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;