diff options
Diffstat (limited to 'xkbcomp/vmod.c')
-rw-r--r-- | xkbcomp/vmod.c | 322 |
1 files changed, 184 insertions, 138 deletions
diff --git a/xkbcomp/vmod.c b/xkbcomp/vmod.c index 9a8bd0d87..5578fd01f 100644 --- a/xkbcomp/vmod.c +++ b/xkbcomp/vmod.c @@ -1,4 +1,3 @@ -/* $Xorg: vmod.c,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,9 +23,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86: xc/programs/xkbcomp/vmod.c,v 3.3 2001/01/17 23:45:45 dawes Exp $ */ -#define DEBUG_VAR_NOT_LOCAL #define DEBUG_VAR debugFlags #include <stdio.h> #include "xkbcomp.h" @@ -40,144 +37,190 @@ #include "vmod.h" void -InitVModInfo(VModInfo *info,XkbDescPtr xkb) +InitVModInfo(VModInfo * info, XkbDescPtr xkb) { - ClearVModInfo(info,xkb); - info->errorCount= 0; + ClearVModInfo(info, xkb); + info->errorCount = 0; return; } void -ClearVModInfo(VModInfo *info,XkbDescPtr xkb) +ClearVModInfo(VModInfo * info, XkbDescPtr xkb) { -register int i; - - if (XkbAllocNames(xkb,XkbVirtualModNamesMask,0,0)!=Success) - return; - if (XkbAllocServerMap(xkb,XkbVirtualModsMask,0)!=Success) - return; - info->xkb= xkb; - info->newlyDefined= info->defined= info->available= 0; - if (xkb && xkb->names) { - register int bit; - for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (xkb->names->vmods[i]!=None) - info->defined|= bit; - } + register int i; + + if (XkbAllocNames(xkb, XkbVirtualModNamesMask, 0, 0) != Success) + return; + if (XkbAllocServerMap(xkb, XkbVirtualModsMask, 0) != Success) + return; + info->xkb = xkb; + info->newlyDefined = info->defined = info->available = 0; + if (xkb && xkb->names) + { + register int bit; + for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) + { + if (xkb->names->vmods[i] != None) + info->defined |= bit; + } } return; } /***====================================================================***/ +/** + * Handle one entry in the virtualModifiers line (e.g. NumLock). + * If the entry is e.g. NumLock=Mod1, stmt->value is not NULL, and the + * XkbServerMap's vmod is set to the given modifier. Otherwise, the vmod is 0. + * + * @param stmt The statement specifying the name and (if any the value). + * @param mergeMode Merge strategy (e.g. MergeOverride) + */ Bool -HandleVModDef(VModDef *stmt,unsigned mergeMode,VModInfo *info) +HandleVModDef(VModDef * stmt, unsigned mergeMode, VModInfo * info) { -register int i,bit,nextFree; -ExprResult mod; -XkbServerMapPtr srv; -XkbNamesPtr names; -Atom stmtName; - - srv= info->xkb->server; - names= info->xkb->names; - stmtName= XkbInternAtom(info->xkb->dpy,XkbAtomGetString(NULL,stmt->name), - False); - for (i=0,bit=1,nextFree= -1;i<XkbNumVirtualMods;i++,bit<<=1) { - if (info->defined&bit) { - if (names->vmods[i]==stmtName) { /* already defined */ - info->available|= bit; - if (stmt->value==NULL) - return True; - else { - char *str1; - const char *str2 = ""; - if (!ExprResolveModMask(stmt->value,&mod,NULL,NULL)) { - str1= XkbAtomText(NULL,stmt->name,XkbMessage); - ACTION1("Declaration of %s ignored\n",str1); - return False; - } - if (mod.uval==srv->vmods[i]) - return True; - - str1= XkbAtomText(NULL,stmt->name,XkbMessage); - WARN1("Virtual modifier %s multiply defined\n",str1); - str1= XkbModMaskText(srv->vmods[i],XkbCFile); - if (mergeMode==MergeOverride) { - str2= str1; - str1= XkbModMaskText(mod.uval,XkbCFile); - } - ACTION2("Using %s, ignoring %s\n",str1,str2); - if (mergeMode==MergeOverride) - srv->vmods[i]= mod.uval; - return True; - } - } - } - else if (nextFree<0) - nextFree= i; + register int i, bit, nextFree; + ExprResult mod; + XkbServerMapPtr srv; + XkbNamesPtr names; + Atom stmtName; + + srv = info->xkb->server; + names = info->xkb->names; + stmtName = + XkbInternAtom(info->xkb->dpy, XkbAtomGetString(NULL, stmt->name), + False); + for (i = 0, bit = 1, nextFree = -1; i < XkbNumVirtualMods; i++, bit <<= 1) + { + if (info->defined & bit) + { + if (names->vmods[i] == stmtName) + { /* already defined */ + info->available |= bit; + if (stmt->value == NULL) + return True; + else + { + char *str1; + const char *str2 = ""; + if (!ExprResolveModMask(stmt->value, &mod, NULL, NULL)) + { + str1 = XkbAtomText(NULL, stmt->name, XkbMessage); + ACTION1("Declaration of %s ignored\n", str1); + return False; + } + if (mod.uval == srv->vmods[i]) + return True; + + str1 = XkbAtomText(NULL, stmt->name, XkbMessage); + WARN1("Virtual modifier %s multiply defined\n", str1); + str1 = XkbModMaskText(srv->vmods[i], XkbCFile); + if (mergeMode == MergeOverride) + { + str2 = str1; + str1 = XkbModMaskText(mod.uval, XkbCFile); + } + ACTION2("Using %s, ignoring %s\n", str1, str2); + if (mergeMode == MergeOverride) + srv->vmods[i] = mod.uval; + return True; + } + } + } + else if (nextFree < 0) + nextFree = i; } - if (nextFree<0) { - ERROR1("Too many virtual modifiers defined (maximum %d)\n", - XkbNumVirtualMods); - ACTION("Exiting\n"); - return False; + if (nextFree < 0) + { + ERROR1("Too many virtual modifiers defined (maximum %d)\n", + XkbNumVirtualMods); + ACTION("Exiting\n"); + return False; } - info->defined|= (1<<nextFree); - info->newlyDefined|= (1<<nextFree); - info->available|= (1<<nextFree); - names->vmods[nextFree]= stmtName; - if (stmt->value==NULL) - return True; - if (ExprResolveModMask(stmt->value,&mod,NULL,NULL)) { - srv->vmods[nextFree]= mod.uval; - return True; + info->defined |= (1 << nextFree); + info->newlyDefined |= (1 << nextFree); + info->available |= (1 << nextFree); + names->vmods[nextFree] = stmtName; + if (stmt->value == NULL) + return True; + if (ExprResolveModMask(stmt->value, &mod, NULL, NULL)) + { + srv->vmods[nextFree] = mod.uval; + return True; } ACTION1("Declaration of %s ignored\n", - XkbAtomText(NULL,stmt->name,XkbMessage)); + XkbAtomText(NULL, stmt->name, XkbMessage)); return False; } +/** + * Returns the index of the given modifier in the xkb->names->vmods array. + * + * @param priv Pointer to the xkb data structure. + * @param elem Must be None, otherwise return False. + * @param field The Atom of the modifier's name (e.g. Atom for LAlt) + * @param type Must be TypeInt, otherwise return False. + * @param val_rtrn Set to the index of the modifier that matches. + * + * @return True on success, False otherwise. If False is returned, val_rtrn is + * undefined. + */ int -LookupVModIndex( XPointer priv, - Atom elem, - Atom field, - unsigned type, - ExprResult * val_rtrn) +LookupVModIndex(XPointer priv, + Atom elem, Atom field, unsigned type, ExprResult * val_rtrn) { -register int i; -register char * fieldStr; -register char * modStr; -XkbDescPtr xkb; - - xkb= (XkbDescPtr)priv; - if ((xkb==NULL)||(xkb->names==NULL)||(elem!=None)||(type!=TypeInt)) { - return False; + register int i; + register char *fieldStr; + register char *modStr; + XkbDescPtr xkb; + + xkb = (XkbDescPtr) priv; + if ((xkb == NULL) || (xkb->names == NULL) || (elem != None) + || (type != TypeInt)) + { + return False; } - fieldStr= XkbAtomGetString(xkb->dpy,field); - if (fieldStr==NULL) - return False; - for (i=0;i<XkbNumVirtualMods;i++) { - modStr= XkbAtomGetString(xkb->dpy,xkb->names->vmods[i]); - if ((modStr!=NULL)&&(uStrCaseCmp(fieldStr,modStr)==0)) { - val_rtrn->uval= i; - return True; - } + /* get the actual name */ + fieldStr = XkbAtomGetString(xkb->dpy, field); + if (fieldStr == NULL) + return False; + /* For each named modifier, get the name and compare it to the one passed + * in. If we get a match, return the index of the modifier. + * The order of modifiers is the same as in the virtual_modifiers line in + * the xkb_types section. + */ + for (i = 0; i < XkbNumVirtualMods; i++) + { + modStr = XkbAtomGetString(xkb->dpy, xkb->names->vmods[i]); + if ((modStr != NULL) && (uStrCaseCmp(fieldStr, modStr) == 0)) + { + val_rtrn->uval = i; + return True; + } } return False; } +/** + * Get the mask for the given modifier and set val_rtrn.uval to the mask. + * Note that the mask returned is always > 512. + * + * @param priv Pointer to xkb data structure. + * @param val_rtrn Set to the mask returned. + * + * @return True on success, False otherwise. If False is returned, val_rtrn is + * undefined. + */ int -LookupVModMask( XPointer priv, - Atom elem, - Atom field, - unsigned type, - ExprResult * val_rtrn) +LookupVModMask(XPointer priv, + Atom elem, Atom field, unsigned type, ExprResult * val_rtrn) { - if (LookupVModIndex(priv,elem,field,type,val_rtrn)) { - register unsigned ndx= val_rtrn->uval; - val_rtrn->uval= (1<<(XkbNumModifiers+ndx)); - return True; + if (LookupVModIndex(priv, elem, field, type, val_rtrn)) + { + register unsigned ndx = val_rtrn->uval; + val_rtrn->uval = (1 << (XkbNumModifiers + ndx)); + return True; } return False; } @@ -185,41 +228,44 @@ LookupVModMask( XPointer priv, int FindKeypadVMod(XkbDescPtr xkb) { -Atom name; -ExprResult rtrn; + Atom name; + ExprResult rtrn; - name= XkbInternAtom(xkb->dpy,"NumLock",False); - if ((xkb)&& - LookupVModIndex((XPointer)xkb,None,name,TypeInt,&rtrn)) { - return rtrn.ival; + name = XkbInternAtom(xkb->dpy, "NumLock", False); + if ((xkb) && LookupVModIndex((XPointer) xkb, None, name, TypeInt, &rtrn)) + { + return rtrn.ival; } return -1; } Bool -ResolveVirtualModifier(ExprDef *def,ExprResult *val_rtrn,VModInfo *info) +ResolveVirtualModifier(ExprDef * def, ExprResult * val_rtrn, VModInfo * info) { -XkbNamesPtr names; - - names= info->xkb->names; - if (def->op==ExprIdent) { - register int i,bit; - for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { - char *str1,*str2; - str1= XkbAtomGetString(info->xkb->dpy,names->vmods[i]); - str2= XkbAtomGetString(NULL,def->value.str); - if ((info->available&bit)&& - (uStrCaseCmp(str1,str2)==Equal)) { - val_rtrn->uval= i; - return True; - } - } + XkbNamesPtr names; + + names = info->xkb->names; + if (def->op == ExprIdent) + { + register int i, bit; + for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) + { + char *str1, *str2; + str1 = XkbAtomGetString(info->xkb->dpy, names->vmods[i]); + str2 = XkbAtomGetString(NULL, def->value.str); + if ((info->available & bit) && (uStrCaseCmp(str1, str2) == Equal)) + { + val_rtrn->uval = i; + return True; + } + } } - if (ExprResolveInteger(def,val_rtrn,NULL,NULL)) { - if (val_rtrn->uval<XkbNumVirtualMods) - return True; - ERROR2("Illegal virtual modifier %d (must be 0..%d inclusive)\n", - val_rtrn->uval,XkbNumVirtualMods-1); + if (ExprResolveInteger(def, val_rtrn, NULL, NULL)) + { + if (val_rtrn->uval < XkbNumVirtualMods) + return True; + ERROR2("Illegal virtual modifier %d (must be 0..%d inclusive)\n", + val_rtrn->uval, XkbNumVirtualMods - 1); } return False; } |