static bool CheckModifierField(struct xkb_context *ctx, const struct xkb_mod_set *mods, enum xkb_action_type action, const ExprDef *array_ndx, const ExprDef *value, enum xkb_action_flags *flags_inout, xkb_mod_mask_t *mods_rtrn) { if (array_ndx) return ReportActionNotArray(ctx, action, ACTION_FIELD_MODIFIERS); if (value->expr.op == EXPR_IDENT) { const char *valStr; valStr = xkb_atom_text(ctx, value->ident.ident); if (valStr && (istreq(valStr, "usemodmapmods") || istreq(valStr, "modmapmods"))) { *mods_rtrn = 0; *flags_inout |= ACTION_MODS_LOOKUP_MODMAP; return true; } } if (!ExprResolveModMask(ctx, value, MOD_BOTH, mods, mods_rtrn)) return ReportMismatch(ctx, action, ACTION_FIELD_MODIFIERS, "modifier mask"); *flags_inout &= ~ACTION_MODS_LOOKUP_MODMAP; return true; }
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; }