1 /************************************************************
2 Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
4 Permission to use, copy, modify, and distribute this
5 software and its documentation for any purpose and without
6 fee is hereby granted, provided that the above copyright
7 notice appear in all copies and that both that copyright
8 notice and this permission notice appear in supporting
9 documentation, and that the name of Silicon Graphics not be
10 used in advertising or publicity pertaining to distribution
11 of the software without specific prior written permission.
12 Silicon Graphics makes no representation about the suitability
13 of this software for any purpose. It is provided "as is"
14 without any express or implied warranty.
16 SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18 AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19 GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21 DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
23 THE USE OR PERFORMANCE OF THIS SOFTWARE.
25 ********************************************************/
35 typedef struct _PreserveInfo
38 short matchingMapIndex;
39 unsigned char indexMods;
40 unsigned char preMods;
41 unsigned short indexVMods;
42 unsigned short preVMods;
45 #define _KT_Name (1<<0)
46 #define _KT_Mask (1<<1)
47 #define _KT_Map (1<<2)
48 #define _KT_Preserve (1<<3)
49 #define _KT_LevelNames (1<<4)
51 typedef struct _KeyTypeInfo
62 struct xkb_kt_map_entry * entries;
63 PreserveInfo *preserve;
68 typedef struct _KeyTypesInfo
80 uint32_t tok_ONE_LEVEL;
81 uint32_t tok_TWO_LEVEL;
82 static uint32_t tok_ALPHABETIC;
85 /***====================================================================***/
87 #define ReportTypeShouldBeArray(t, f) \
88 ReportShouldBeArray("key type", (f), TypeTxt(t))
89 #define ReportTypeBadType(t, f, w) \
90 ReportBadType("key type", (f), TypeTxt(t), (w))
92 /***====================================================================***/
94 #define MapEntryTxt(x, e) \
95 XkbcVModMaskText((x), (e)->mods.real_mods, (e)->mods.vmods)
96 #define PreserveIndexTxt(x, p) \
97 XkbcVModMaskText((x), (p)->indexMods, (p)->indexVMods)
98 #define PreserveTxt(x, p) \
99 XkbcVModMaskText((x), (p)->preMods, (p)->preVMods)
101 XkbcAtomText((t)->name)
102 #define TypeMaskTxt(t, x) \
103 XkbcVModMaskText((x), (t)->mask, (t)->vmask)
105 /***====================================================================***/
108 InitKeyTypesInfo(KeyTypesInfo * info, struct xkb_desc * xkb, KeyTypesInfo * from)
110 tok_ONE_LEVEL = xkb_intern_atom("ONE_LEVEL");
111 tok_TWO_LEVEL = xkb_intern_atom("TWO_LEVEL");
112 tok_ALPHABETIC = xkb_intern_atom("ALPHABETIC");
113 tok_KEYPAD = xkb_intern_atom("KEYPAD");
114 info->name = strdup("default");
115 info->errorCount = 0;
116 info->stdPresent = 0;
119 info->dflt.defs.defined = 0;
120 info->dflt.defs.fileID = 0;
121 info->dflt.defs.merge = MergeOverride;
122 info->dflt.defs.next = NULL;
123 info->dflt.name = None;
125 info->dflt.vmask = 0;
126 info->dflt.groupInfo = False;
127 info->dflt.numLevels = 1;
128 info->dflt.nEntries = info->dflt.szEntries = 0;
129 info->dflt.entries = NULL;
130 info->dflt.szNames = 0;
131 info->dflt.lvlNames = NULL;
132 info->dflt.preserve = NULL;
133 InitVModInfo(&info->vmods, xkb);
136 info->dflt = from->dflt;
137 if (from->dflt.entries)
139 info->dflt.entries = uTypedCalloc(from->dflt.szEntries,
140 struct xkb_kt_map_entry);
141 if (info->dflt.entries)
143 unsigned sz = from->dflt.nEntries * sizeof(struct xkb_kt_map_entry);
144 memcpy(info->dflt.entries, from->dflt.entries, sz);
147 if (from->dflt.lvlNames)
149 info->dflt.lvlNames = uTypedCalloc(from->dflt.szNames, uint32_t);
150 if (info->dflt.lvlNames)
152 register unsigned sz = from->dflt.szNames * sizeof(uint32_t);
153 memcpy(info->dflt.lvlNames, from->dflt.lvlNames, sz);
156 if (from->dflt.preserve)
158 PreserveInfo *old, *new, *last;
160 old = from->dflt.preserve;
161 for (; old; old = (PreserveInfo *) old->defs.next)
163 new = uTypedAlloc(PreserveInfo);
167 new->defs.next = NULL;
169 last->defs.next = (CommonInfo *) new;
171 info->dflt.preserve = new;
180 FreeKeyTypeInfo(KeyTypeInfo * type)
183 type->entries = NULL;
184 free(type->lvlNames);
185 type->lvlNames = NULL;
186 if (type->preserve != NULL)
188 ClearCommonInfo(&type->preserve->defs);
189 type->preserve = NULL;
195 FreeKeyTypesInfo(KeyTypesInfo * info)
201 register KeyTypeInfo *type;
202 for (type = info->types; type; type = (KeyTypeInfo *) type->defs.next)
204 FreeKeyTypeInfo(type);
206 info->types = (KeyTypeInfo *) ClearCommonInfo(&info->types->defs);
208 FreeKeyTypeInfo(&info->dflt);
213 NextKeyType(KeyTypesInfo * info)
217 type = uTypedAlloc(KeyTypeInfo);
220 bzero(type, sizeof(KeyTypeInfo));
221 type->defs.fileID = info->fileID;
222 info->types = (KeyTypeInfo *) AddCommonInfo(&info->types->defs,
223 (CommonInfo *) type);
230 FindMatchingKeyType(KeyTypesInfo * info, KeyTypeInfo * new)
234 for (old = info->types; old; old = (KeyTypeInfo *) old->defs.next)
236 if (old->name == new->name)
243 ReportTypeBadWidth(const char *type, int has, int needs)
245 ERROR("Key type \"%s\" has %d levels, must have %d\n", type, has, needs);
246 ACTION("Illegal type definition ignored\n");
251 AddKeyType(struct xkb_desc * xkb, KeyTypesInfo * info, KeyTypeInfo * new)
255 if (new->name == tok_ONE_LEVEL)
257 if (new->numLevels > 1)
258 return ReportTypeBadWidth("ONE_LEVEL", new->numLevels, 1);
259 info->stdPresent |= XkbOneLevelMask;
261 else if (new->name == tok_TWO_LEVEL)
263 if (new->numLevels > 2)
264 return ReportTypeBadWidth("TWO_LEVEL", new->numLevels, 2);
265 else if (new->numLevels < 2)
267 info->stdPresent |= XkbTwoLevelMask;
269 else if (new->name == tok_ALPHABETIC)
271 if (new->numLevels > 2)
272 return ReportTypeBadWidth("ALPHABETIC", new->numLevels, 2);
273 else if (new->numLevels < 2)
275 info->stdPresent |= XkbAlphabeticMask;
277 else if (new->name == tok_KEYPAD)
279 if (new->numLevels > 2)
280 return ReportTypeBadWidth("KEYPAD", new->numLevels, 2);
281 else if (new->numLevels < 2)
283 info->stdPresent |= XkbKeypadMask;
286 old = FindMatchingKeyType(info, new);
290 if ((new->defs.merge == MergeReplace)
291 || (new->defs.merge == MergeOverride))
293 KeyTypeInfo *next = (KeyTypeInfo *) old->defs.next;
294 if (((old->defs.fileID == new->defs.fileID)
295 && (warningLevel > 0)) || (warningLevel > 9))
297 WARN("Multiple definitions of the %s key type\n",
298 XkbcAtomText(new->name));
299 ACTION("Earlier definition ignored\n");
301 FreeKeyTypeInfo(old);
303 new->szEntries = new->nEntries = 0;
305 new->preserve = NULL;
306 new->lvlNames = NULL;
307 old->defs.next = &next->defs;
310 report = (old->defs.fileID == new->defs.fileID) && (warningLevel > 0);
313 WARN("Multiple definitions of the %s key type\n",
314 XkbcAtomText(new->name));
315 ACTION("Later definition ignored\n");
317 FreeKeyTypeInfo(new);
320 old = NextKeyType(info);
324 old->defs.next = NULL;
325 new->nEntries = new->szEntries = 0;
328 new->lvlNames = NULL;
329 new->preserve = NULL;
333 /***====================================================================***/
336 MergeIncludedKeyTypes(KeyTypesInfo * into,
337 KeyTypesInfo * from, unsigned merge, struct xkb_desc * xkb)
341 if (from->errorCount > 0)
343 into->errorCount += from->errorCount;
346 if (into->name == NULL)
348 into->name = from->name;
351 for (type = from->types; type; type = (KeyTypeInfo *) type->defs.next)
353 if (merge != MergeDefault)
354 type->defs.merge = merge;
355 if (!AddKeyType(xkb, into, type))
358 into->stdPresent |= from->stdPresent;
362 typedef void (*FileHandler) (XkbFile * /* file */ ,
363 struct xkb_desc * /* xkb */ ,
364 unsigned /* merge */ ,
365 KeyTypesInfo * /* included */
369 HandleIncludeKeyTypes(IncludeStmt * stmt,
370 struct xkb_desc * xkb, KeyTypesInfo * info, FileHandler hndlr)
374 KeyTypesInfo included;
378 if ((stmt->file == NULL) && (stmt->map == NULL))
382 bzero(info, sizeof(KeyTypesInfo));
384 else if (ProcessIncludeFile(stmt, XkmTypesIndex, &rtrn, &newMerge))
386 InitKeyTypesInfo(&included, xkb, info);
387 included.fileID = included.dflt.defs.fileID = rtrn->id;
388 included.dflt.defs.merge = newMerge;
390 (*hndlr) (rtrn, xkb, newMerge, &included);
391 if (stmt->stmt != NULL)
394 included.name = stmt->stmt;
400 info->errorCount += 10;
403 if ((stmt->next != NULL) && (included.errorCount < 1))
407 KeyTypesInfo next_incl;
409 for (next = stmt->next; next != NULL; next = next->next)
411 if ((next->file == NULL) && (next->map == NULL))
414 MergeIncludedKeyTypes(&included, info, next->merge, xkb);
415 FreeKeyTypesInfo(info);
417 else if (ProcessIncludeFile(next, XkmTypesIndex, &rtrn, &op))
419 InitKeyTypesInfo(&next_incl, xkb, &included);
420 next_incl.fileID = next_incl.dflt.defs.fileID = rtrn->id;
421 next_incl.dflt.defs.merge = op;
422 (*hndlr) (rtrn, xkb, op, &next_incl);
423 MergeIncludedKeyTypes(&included, &next_incl, op, xkb);
424 FreeKeyTypesInfo(&next_incl);
428 info->errorCount += 10;
429 FreeKeyTypesInfo(&included);
438 MergeIncludedKeyTypes(info, &included, newMerge, xkb);
439 FreeKeyTypesInfo(&included);
441 return (info->errorCount == 0);
444 /***====================================================================***/
446 static struct xkb_kt_map_entry *
447 FindMatchingMapEntry(KeyTypeInfo * type, unsigned mask, unsigned vmask)
450 struct xkb_kt_map_entry * entry;
452 for (i = 0, entry = type->entries; i < type->nEntries; i++, entry++)
454 if ((entry->mods.real_mods == mask) && (entry->mods.vmods == vmask))
461 DeleteLevel1MapEntries(KeyTypeInfo * type)
465 for (i = 0; i < type->nEntries; i++)
467 if (type->entries[i].level == 0)
469 for (n = i; n < type->nEntries - 1; n++)
471 type->entries[n] = type->entries[n + 1];
480 * Return a pointer to the next free XkbcKTMapEntry, reallocating space if
483 static struct xkb_kt_map_entry *
484 NextMapEntry(KeyTypeInfo * type)
486 if (type->entries == NULL)
488 type->entries = uTypedCalloc(2, struct xkb_kt_map_entry);
489 if (type->entries == NULL)
491 ERROR("Couldn't allocate map entries for %s\n", TypeTxt(type));
492 ACTION("Map entries lost\n");
498 else if (type->nEntries >= type->szEntries)
500 type->szEntries *= 2;
501 type->entries = uTypedRecalloc(type->entries,
502 type->nEntries, type->szEntries,
503 struct xkb_kt_map_entry);
504 if (type->entries == NULL)
506 ERROR("Couldn't reallocate map entries for %s\n", TypeTxt(type));
507 ACTION("Map entries lost\n");
511 return &type->entries[type->nEntries++];
515 AddPreserve(struct xkb_desc * xkb,
516 KeyTypeInfo * type, PreserveInfo * new, Bool clobber, Bool report)
520 old = type->preserve;
523 if ((old->indexMods != new->indexMods) ||
524 (old->indexVMods != new->indexVMods))
526 old = (PreserveInfo *) old->defs.next;
529 if ((old->preMods == new->preMods)
530 && (old->preVMods == new->preVMods))
532 if (warningLevel > 9)
534 WARN("Identical definitions for preserve[%s] in %s\n",
535 PreserveIndexTxt(xkb, old), TypeTxt(type));
540 if (report && (warningLevel > 0))
543 WARN("Multiple definitions for preserve[%s] in %s\n",
544 PreserveIndexTxt(xkb, old), TypeTxt(type));
547 str = PreserveTxt(xkb, new);
549 str = PreserveTxt(xkb, old);
550 ACTION("Using %s, ", str);
552 str = PreserveTxt(xkb, old);
554 str = PreserveTxt(xkb, new);
555 INFO("ignoring %s\n", str);
559 old->preMods = new->preMods;
560 old->preVMods = new->preVMods;
564 old = uTypedAlloc(PreserveInfo);
567 WSGO("Couldn't allocate preserve in %s\n", TypeTxt(type));
568 ACTION("Preserve[%s] lost\n", PreserveIndexTxt(xkb, new));
572 old->matchingMapIndex = -1;
574 (PreserveInfo *) AddCommonInfo(&type->preserve->defs, &old->defs);
579 * Add a new KTMapEntry to the given key type. If an entry with the same mods
580 * already exists, the level is updated (if clobber is TRUE). Otherwise, a new
583 * @param clobber Overwrite existing entry.
584 * @param report True if a warning is to be printed on.
587 AddMapEntry(struct xkb_desc * xkb,
589 struct xkb_kt_map_entry * new, Bool clobber, Bool report)
591 struct xkb_kt_map_entry * old;
594 FindMatchingMapEntry(type, new->mods.real_mods, new->mods.vmods)))
596 if (report && (old->level != new->level))
598 unsigned use, ignore;
601 use = new->level + 1;
602 ignore = old->level + 1;
606 use = old->level + 1;
607 ignore = new->level + 1;
609 WARN("Multiple map entries for %s in %s\n",
610 MapEntryTxt(xkb, new), TypeTxt(type));
611 ACTION("Using %d, ignoring %d\n", use, ignore);
613 else if (warningLevel > 9)
615 WARN("Multiple occurences of map[%s]= %d in %s\n",
616 MapEntryTxt(xkb, new), new->level + 1, TypeTxt(type));
621 old->level = new->level;
624 if ((old = NextMapEntry(type)) == NULL)
625 return False; /* allocation failure, already reported */
626 if (new->level >= type->numLevels)
627 type->numLevels = new->level + 1;
628 if (new->mods.vmods == 0)
632 old->mods.mask = new->mods.real_mods;
633 old->mods.real_mods = new->mods.real_mods;
634 old->mods.vmods = new->mods.vmods;
635 old->level = new->level;
640 SetMapEntry(KeyTypeInfo * type,
641 struct xkb_desc * xkb, ExprDef * arrayNdx, ExprDef * value)
644 struct xkb_kt_map_entry entry;
646 if (arrayNdx == NULL)
647 return ReportTypeShouldBeArray(type, "map entry");
648 if (!ExprResolveVModMask(arrayNdx, &rtrn, xkb))
649 return ReportTypeBadType(type, "map entry", "modifier mask");
650 entry.mods.real_mods = rtrn.uval & 0xff; /* modifiers < 512 */
651 entry.mods.vmods = (rtrn.uval >> 8) & 0xffff; /* modifiers > 512 */
652 if ((entry.mods.real_mods & (~type->mask)) ||
653 ((entry.mods.vmods & (~type->vmask)) != 0))
655 if (warningLevel > 0)
657 WARN("Map entry for unused modifiers in %s\n", TypeTxt(type));
658 ACTION("Using %s instead of ",
659 XkbcVModMaskText(xkb,
660 entry.mods.real_mods & type->mask,
661 entry.mods.vmods & type->vmask));
662 INFO("%s\n", MapEntryTxt(xkb, &entry));
664 entry.mods.real_mods &= type->mask;
665 entry.mods.vmods &= type->vmask;
667 if (!ExprResolveLevel(value, &rtrn))
669 ERROR("Level specifications in a key type must be integer\n");
670 ACTION("Ignoring malformed level specification\n");
673 if ((rtrn.ival < 1) || (rtrn.ival > XkbMaxShiftLevel + 1))
675 ERROR("Shift level %d out of range (1..%d) in key type %s\n",
676 XkbMaxShiftLevel + 1, rtrn.ival, TypeTxt(type));
677 ACTION("Ignoring illegal definition of map[%s]\n",
678 MapEntryTxt(xkb, &entry));
681 entry.level = rtrn.ival - 1;
682 return AddMapEntry(xkb, type, &entry, True, True);
686 SetPreserve(KeyTypeInfo * type,
687 struct xkb_desc * xkb, ExprDef * arrayNdx, ExprDef * value)
692 if (arrayNdx == NULL)
693 return ReportTypeShouldBeArray(type, "preserve entry");
694 if (!ExprResolveVModMask(arrayNdx, &rtrn, xkb))
695 return ReportTypeBadType(type, "preserve entry", "modifier mask");
696 new.defs = type->defs;
697 new.defs.next = NULL;
698 new.indexMods = rtrn.uval & 0xff;
699 new.indexVMods = (rtrn.uval >> 8) & 0xffff;
700 if ((new.indexMods & (~type->mask)) || (new.indexVMods & (~type->vmask)))
702 if (warningLevel > 0)
704 WARN("Preserve for modifiers not used by the %s type\n",
706 ACTION("Index %s converted to ", PreserveIndexTxt(xkb, &new));
708 new.indexMods &= type->mask;
709 new.indexVMods &= type->vmask;
710 if (warningLevel > 0)
711 INFO("%s\n", PreserveIndexTxt(xkb, &new));
713 if (!ExprResolveVModMask(value, &rtrn, xkb))
715 ERROR("Preserve value in a key type is not a modifier mask\n");
716 ACTION("Ignoring preserve[%s] in type %s\n",
717 PreserveIndexTxt(xkb, &new), TypeTxt(type));
720 new.preMods = rtrn.uval & 0xff;
721 new.preVMods = (rtrn.uval >> 16) & 0xffff;
722 if ((new.preMods & (~new.indexMods))
723 || (new.preVMods && (~new.indexVMods)))
725 if (warningLevel > 0)
727 WARN("Illegal value for preserve[%s] in type %s\n",
728 PreserveTxt(xkb, &new), TypeTxt(type));
729 ACTION("Converted %s to ", PreserveIndexTxt(xkb, &new));
731 new.preMods &= new.indexMods;
732 new.preVMods &= new.indexVMods;
733 if (warningLevel > 0)
735 INFO("%s\n", PreserveIndexTxt(xkb, &new));
738 return AddPreserve(xkb, type, &new, True, True);
741 /***====================================================================***/
744 AddLevelName(KeyTypeInfo * type,
745 unsigned level, uint32_t name, Bool clobber, Bool report)
747 if ((type->lvlNames == NULL) || (type->szNames <= level))
750 uTypedRecalloc(type->lvlNames, type->szNames, level + 1, uint32_t);
751 if (type->lvlNames == NULL)
753 ERROR("Couldn't allocate level names for type %s\n",
755 ACTION("Level names lost\n");
759 type->szNames = level + 1;
761 else if (type->lvlNames[level] == name)
763 if (warningLevel > 9)
765 WARN("Duplicate names for level %d of key type %s\n",
766 level + 1, TypeTxt(type));
771 else if (type->lvlNames[level] != None)
773 if (warningLevel > 0)
775 const char *old, *new;
776 old = XkbcAtomText(type->lvlNames[level]);
777 new = XkbcAtomText(name);
778 WARN("Multiple names for level %d of key type %s\n",
779 level + 1, TypeTxt(type));
781 ACTION("Using %s, ignoring %s\n", new, old);
783 ACTION("Using %s, ignoring %s\n", old, new);
788 if (level >= type->numLevels)
789 type->numLevels = level + 1;
790 type->lvlNames[level] = name;
795 SetLevelName(KeyTypeInfo * type, ExprDef * arrayNdx, ExprDef * value)
801 if (arrayNdx == NULL)
802 return ReportTypeShouldBeArray(type, "level name");
803 if (!ExprResolveLevel(arrayNdx, &rtrn))
804 return ReportTypeBadType(type, "level name", "integer");
805 if ((rtrn.ival < 1) || (rtrn.ival > XkbMaxShiftLevel + 1))
807 ERROR("Level name %d out of range (1..%d) in key type %s\n",
809 XkbMaxShiftLevel + 1,
810 XkbcAtomText(type->name));
811 ACTION("Ignoring illegal level name definition\n");
814 level = rtrn.ival - 1;
815 if (!ExprResolveString(value, &rtrn))
817 ERROR("Non-string name for level %d in key type %s\n", level + 1,
818 XkbcAtomText(type->name));
819 ACTION("Ignoring illegal level name definition\n");
822 level_name = xkb_intern_atom(rtrn.str);
824 return AddLevelName(type, level, level_name, True, True);
827 /***====================================================================***/
830 * Parses the fields in a type "..." { } description.
832 * @param field The field to parse (e.g. modifiers, map, level_name)
835 SetKeyTypeField(KeyTypeInfo * type,
836 struct xkb_desc * xkb,
838 ExprDef * arrayNdx, ExprDef * value, KeyTypesInfo * info)
842 if (uStrCaseCmp(field, "modifiers") == 0)
844 unsigned mods, vmods;
845 if (arrayNdx != NULL)
847 WARN("The modifiers field of a key type is not an array\n");
848 ACTION("Illegal array subscript ignored\n");
850 /* get modifier mask for current type */
851 if (!ExprResolveVModMask(value, &tmp, xkb))
853 ERROR("Key type mask field must be a modifier mask\n");
854 ACTION("Key type definition ignored\n");
857 mods = tmp.uval & 0xff; /* core mods */
858 vmods = (tmp.uval >> 8) & 0xffff; /* xkb virtual mods */
859 if (type->defs.defined & _KT_Mask)
861 WARN("Multiple modifier mask definitions for key type %s\n",
862 XkbcAtomText(type->name));
863 ACTION("Using %s, ", TypeMaskTxt(type, xkb));
864 INFO("ignoring %s\n", XkbcVModMaskText(xkb, mods, vmods));
869 type->defs.defined |= _KT_Mask;
872 else if (uStrCaseCmp(field, "map") == 0)
874 type->defs.defined |= _KT_Map;
875 return SetMapEntry(type, xkb, arrayNdx, value);
877 else if (uStrCaseCmp(field, "preserve") == 0)
879 type->defs.defined |= _KT_Preserve;
880 return SetPreserve(type, xkb, arrayNdx, value);
882 else if ((uStrCaseCmp(field, "levelname") == 0) ||
883 (uStrCaseCmp(field, "level_name") == 0))
885 type->defs.defined |= _KT_LevelNames;
886 return SetLevelName(type, arrayNdx, value);
888 ERROR("Unknown field %s in key type %s\n", field, TypeTxt(type));
889 ACTION("Definition ignored\n");
894 HandleKeyTypeVar(VarDef * stmt, struct xkb_desc * xkb, KeyTypesInfo * info)
896 ExprResult elem, field;
899 if (!ExprResolveLhs(stmt->name, &elem, &field, &arrayNdx))
900 return False; /* internal error, already reported */
901 if (elem.str && (uStrCaseCmp(elem.str, "type") == 0))
902 return SetKeyTypeField(&info->dflt, xkb, field.str, arrayNdx,
904 if (elem.str != NULL)
906 ERROR("Default for unknown element %s\n", uStringText(elem.str));
907 ACTION("Value for field %s ignored\n", uStringText(field.str));
909 else if (field.str != NULL)
911 ERROR("Default defined for unknown field %s\n",
912 uStringText(field.str));
919 HandleKeyTypeBody(VarDef * def,
920 struct xkb_desc * xkb, KeyTypeInfo * type, KeyTypesInfo * info)
923 ExprResult tmp, field;
926 for (; def != NULL; def = (VarDef *) def->common.next)
928 if ((def->name) && (def->name->type == ExprFieldRef))
930 ok = HandleKeyTypeVar(def, xkb, info);
933 ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx);
935 ok = SetKeyTypeField(type, xkb, field.str, arrayNdx, def->value,
944 * Process a type "XYZ" { } specification in the xkb_types section.
948 HandleKeyTypeDef(KeyTypeDef * def,
949 struct xkb_desc * xkb, unsigned merge, KeyTypesInfo * info)
954 if (def->merge != MergeDefault)
957 type.defs.defined = 0;
958 type.defs.fileID = info->fileID;
959 type.defs.merge = merge;
960 type.defs.next = NULL;
961 type.name = def->name;
962 type.mask = info->dflt.mask;
963 type.vmask = info->dflt.vmask;
964 type.groupInfo = info->dflt.groupInfo;
966 type.nEntries = type.szEntries = 0;
969 type.lvlNames = NULL;
970 type.preserve = NULL;
972 /* Parse the actual content. */
973 if (!HandleKeyTypeBody(def->body, xkb, &type, info))
979 /* now copy any appropriate map, preserve or level names from the */
981 for (i = 0; i < info->dflt.nEntries; i++)
983 struct xkb_kt_map_entry * dflt;
984 dflt = &info->dflt.entries[i];
985 if (((dflt->mods.real_mods & type.mask) == dflt->mods.real_mods) &&
986 ((dflt->mods.vmods & type.vmask) == dflt->mods.vmods))
988 AddMapEntry(xkb, &type, dflt, False, False);
991 if (info->dflt.preserve)
993 PreserveInfo *dflt = info->dflt.preserve;
996 if (((dflt->indexMods & type.mask) == dflt->indexMods) &&
997 ((dflt->indexVMods & type.vmask) == dflt->indexVMods))
999 AddPreserve(xkb, &type, dflt, False, False);
1001 dflt = (PreserveInfo *) dflt->defs.next;
1004 for (i = 0; i < info->dflt.szNames; i++)
1006 if ((i < type.numLevels) && (info->dflt.lvlNames[i] != None))
1008 AddLevelName(&type, i, info->dflt.lvlNames[i], False, False);
1011 /* Now add the new keytype to the info struct */
1012 if (!AddKeyType(xkb, info, &type))
1021 * Process an xkb_types section.
1023 * @param file The parsed xkb_types section.
1024 * @param merge Merge Strategy (e.g. MergeOverride)
1025 * @param info Pointer to memory where the outcome will be stored.
1028 HandleKeyTypesFile(XkbFile * file,
1029 struct xkb_desc * xkb, unsigned merge, KeyTypesInfo * info)
1033 info->name = _XkbDupString(file->name);
1037 switch (stmt->stmtType)
1040 if (!HandleIncludeKeyTypes((IncludeStmt *) stmt, xkb, info,
1041 HandleKeyTypesFile))
1044 case StmtKeyTypeDef: /* e.g. type "ONE_LEVEL" */
1045 if (!HandleKeyTypeDef((KeyTypeDef *) stmt, xkb, merge, info))
1049 if (!HandleKeyTypeVar((VarDef *) stmt, xkb, info))
1052 case StmtVModDef: /* virtual_modifiers NumLock, ... */
1053 if (!HandleVModDef((VModDef *) stmt, xkb, merge, &info->vmods))
1056 case StmtKeyAliasDef:
1057 ERROR("Key type files may not include other declarations\n");
1058 ACTION("Ignoring definition of key alias\n");
1061 case StmtKeycodeDef:
1062 ERROR("Key type files may not include other declarations\n");
1063 ACTION("Ignoring definition of key name\n");
1067 ERROR("Key type files may not include other declarations\n");
1068 ACTION("Ignoring definition of symbol interpretation\n");
1072 WSGO("Unexpected statement type %d in HandleKeyTypesFile\n",
1077 if (info->errorCount > 10)
1080 ERROR("Too many errors\n");
1082 ACTION("Abandoning keytypes file \"%s\"\n", file->topName);
1090 CopyDefToKeyType(struct xkb_desc * xkb, struct xkb_key_type * type, KeyTypeInfo * def)
1095 for (pre = def->preserve; pre != NULL;
1096 pre = (PreserveInfo *) pre->defs.next)
1098 struct xkb_kt_map_entry * match;
1099 struct xkb_kt_map_entry tmp;
1100 tmp.mods.real_mods = pre->indexMods;
1101 tmp.mods.vmods = pre->indexVMods;
1103 AddMapEntry(xkb, def, &tmp, False, False);
1104 match = FindMatchingMapEntry(def, pre->indexMods, pre->indexVMods);
1107 WSGO("Couldn't find matching entry for preserve\n");
1108 ACTION("Aborting\n");
1111 pre->matchingMapIndex = match - def->entries;
1113 type->mods.real_mods = def->mask;
1114 type->mods.vmods = def->vmask;
1115 type->num_levels = def->numLevels;
1116 type->map_count = def->nEntries;
1117 type->map = def->entries;
1120 type->preserve = uTypedCalloc(type->map_count, struct xkb_mods);
1121 if (!type->preserve)
1123 WARN("Couldn't allocate preserve array in CopyDefToKeyType\n");
1124 ACTION("Preserve setting for type %s lost\n",
1125 XkbcAtomText(def->name));
1129 pre = def->preserve;
1130 for (; pre != NULL; pre = (PreserveInfo *) pre->defs.next)
1132 int ndx = pre->matchingMapIndex;
1133 type->preserve[ndx].mask = pre->preMods;
1134 type->preserve[ndx].real_mods = pre->preMods;
1135 type->preserve[ndx].vmods = pre->preVMods;
1140 type->preserve = NULL;
1141 type->name = (uint32_t) def->name;
1142 if (def->szNames > 0)
1144 type->level_names = uTypedCalloc(def->numLevels, uint32_t);
1146 /* assert def->szNames<=def->numLevels */
1147 for (i = 0; i < def->szNames; i++)
1149 type->level_names[i] = (uint32_t) def->lvlNames[i];
1154 type->level_names = NULL;
1157 def->nEntries = def->szEntries = 0;
1158 def->entries = NULL;
1159 return XkbcComputeEffectiveMap(xkb, type, NULL);
1163 CompileKeyTypes(XkbFile *file, struct xkb_desc * xkb, unsigned merge)
1167 InitKeyTypesInfo(&info, xkb, NULL);
1168 info.fileID = file->id;
1169 HandleKeyTypesFile(file, xkb, merge, &info);
1171 if (info.errorCount == 0)
1174 register KeyTypeInfo *def;
1175 register struct xkb_key_type *type, *next;
1177 if (info.name != NULL)
1179 if (XkbcAllocNames(xkb, XkbTypesNameMask, 0, 0) == Success)
1180 xkb->names->types = xkb_intern_atom(info.name);
1183 WSGO("Couldn't allocate space for types name\n");
1184 ACTION("Name \"%s\" (from %s) NOT assigned\n",
1185 scanFile, info.name);
1189 if ((info.stdPresent & XkbOneLevelMask) == 0)
1191 if ((info.stdPresent & XkbTwoLevelMask) == 0)
1193 if ((info.stdPresent & XkbKeypadMask) == 0)
1195 if ((info.stdPresent & XkbAlphabeticMask) == 0)
1197 if (XkbcAllocClientMap(xkb, XkbKeyTypesMask, i) != Success)
1199 FreeKeyTypesInfo(&info);
1200 WSGO("Couldn't allocate client map\n");
1203 xkb->map->num_types = i;
1204 if (XkbAllRequiredTypes & (~info.stdPresent))
1206 unsigned missing, keypadVMod;
1208 missing = XkbAllRequiredTypes & (~info.stdPresent);
1209 keypadVMod = FindKeypadVMod(xkb);
1210 if (XkbcInitCanonicalKeyTypes(xkb, missing, keypadVMod) != Success)
1212 FreeKeyTypesInfo(&info);
1213 WSGO("Couldn't initialize canonical key types\n");
1216 if (missing & XkbOneLevelMask)
1217 xkb->map->types[XkbOneLevelIndex].name = tok_ONE_LEVEL;
1218 if (missing & XkbTwoLevelMask)
1219 xkb->map->types[XkbTwoLevelIndex].name = tok_TWO_LEVEL;
1220 if (missing & XkbAlphabeticMask)
1221 xkb->map->types[XkbAlphabeticIndex].name = tok_ALPHABETIC;
1222 if (missing & XkbKeypadMask)
1223 xkb->map->types[XkbKeypadIndex].name = tok_KEYPAD;
1225 next = &xkb->map->types[XkbLastRequiredType + 1];
1226 for (i = 0, def = info.types; i < info.nTypes; i++)
1228 if (def->name == tok_ONE_LEVEL)
1229 type = &xkb->map->types[XkbOneLevelIndex];
1230 else if (def->name == tok_TWO_LEVEL)
1231 type = &xkb->map->types[XkbTwoLevelIndex];
1232 else if (def->name == tok_ALPHABETIC)
1233 type = &xkb->map->types[XkbAlphabeticIndex];
1234 else if (def->name == tok_KEYPAD)
1235 type = &xkb->map->types[XkbKeypadIndex];
1238 DeleteLevel1MapEntries(def);
1239 if (!CopyDefToKeyType(xkb, type, def)) {
1240 FreeKeyTypesInfo(&info);
1243 def = (KeyTypeInfo *) def->defs.next;
1245 FreeKeyTypesInfo(&info);
1249 FreeKeyTypesInfo(&info);