static Bool CopyISOLockArgs(XkbDescPtr xkb,XkbAction *action,char *buf,int *sz) { XkbISOAction * act; char tbuf[64]; act= &action->iso; if (act->flags&XkbSA_ISODfltIsGroup) { TryCopyStr(tbuf,"group=",sz); if (act->flags&XkbSA_GroupAbsolute) sprintf(tbuf,"%d",XkbSAGroup(act)+1); else if (XkbSAGroup(act)<0) sprintf(tbuf,"%d",XkbSAGroup(act)); else sprintf(tbuf,"+%d",XkbSAGroup(act)); TryCopyStr(buf,tbuf,sz); } else { unsigned tmp; tmp= XkbModActionVMods(act); TryCopyStr(buf,"modifiers=",sz); if (act->flags&XkbSA_UseModMapMods) TryCopyStr(buf,"modMapMods",sz); else if (act->real_mods || tmp) { if (act->real_mods) { TryCopyStr(buf,XkbModMaskText(act->real_mods,XkbXKBFile),sz); if (tmp) TryCopyStr(buf,"+",sz); } if (tmp) TryCopyStr(buf,XkbVModMaskText(xkb,0,tmp,XkbXKBFile),sz); } else TryCopyStr(buf,"none",sz); } TryCopyStr(buf,",affect=",sz); if ((act->affect&XkbSA_ISOAffectMask)==0) TryCopyStr(buf,"all",sz); else { int nOut= 0; if ((act->affect&XkbSA_ISONoAffectMods)==0) { TryCopyStr(buf,"mods",sz); nOut++; } if ((act->affect&XkbSA_ISONoAffectGroup)==0) { sprintf(tbuf,"%sgroups",(nOut>0?"+":"")); TryCopyStr(buf,tbuf,sz); nOut++; } if ((act->affect&XkbSA_ISONoAffectPtr)==0) { sprintf(tbuf,"%spointer",(nOut>0?"+":"")); TryCopyStr(buf,tbuf,sz); nOut++; } if ((act->affect&XkbSA_ISONoAffectCtrls)==0) { sprintf(tbuf,"%scontrols",(nOut>0?"+":"")); TryCopyStr(buf,tbuf,sz); nOut++; } } return True; }
static char * siText(SymInterpInfo * si,CompatInfo * info) { static char buf[128]; if (si==&info->dflt) { sprintf(buf,"default"); } else { sprintf(buf,"%s+%s(%s)",XkbKeysymText(si->interp.sym,XkbMessage), XkbSIMatchText(si->interp.match,XkbMessage), XkbModMaskText(si->interp.mods,XkbMessage)); } return buf; }
char * XkbVModMaskText( XkbDescPtr xkb, unsigned modMask, unsigned mask, unsigned format) { register int i,bit; int len; char *mm,*rtrn; char *str,buf[BUFFER_SIZE]; if ((modMask==0)&&(mask==0)) { rtrn= tbGetBuffer(5); if (format==XkbCFile) sprintf(rtrn,"0"); else sprintf(rtrn,"none"); return rtrn; } if (modMask!=0) mm= XkbModMaskText(modMask,format); else mm= NULL; str= buf; buf[0]= '\0'; if (mask) { char *tmp; for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) { if (mask&bit) { tmp= XkbVModIndexText(xkb,i,format); len= strlen(tmp)+1+(str==buf?0:1); if (format==XkbCFile) len+= 4; if ((str-(buf+len))<=BUFFER_SIZE) { if (str!=buf) { if (format==XkbCFile) *str++= '|'; else *str++= '+'; len--; } } if (format==XkbCFile) sprintf(str,"%sMask",tmp); else strcpy(str,tmp); str= &str[len-1]; } } str= buf; } else str= NULL; if (mm) len= strlen(mm); else len= 0; if (str) len+= strlen(str)+(mm==NULL?0:1); if (len>=BUFFER_SIZE) len= BUFFER_SIZE-1; rtrn= tbGetBuffer(len+1); rtrn[0]= '\0'; if (mm!=NULL) { i= strlen(mm); if (i>len) i= len; strcpy(rtrn,mm); } else { i=0; } if (str!=NULL) { if (mm!=NULL) { if (format==XkbCFile) strcat(rtrn,"|"); else strcat(rtrn,"+"); } strncat(rtrn,str,len-i); } rtrn[len]= '\0'; return rtrn; }
Bool 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,*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; } 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)); return False; }