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 ********************************************************/
31 #include "parseutils.h"
33 #include <X11/keysym.h>
43 /***====================================================================***/
47 #define RepeatUndefined ~((unsigned)0)
49 #define _Key_Syms (1<<0)
50 #define _Key_Acts (1<<1)
51 #define _Key_Repeat (1<<2)
52 #define _Key_Behavior (1<<3)
53 #define _Key_Type_Dflt (1<<4)
54 #define _Key_Types (1<<5)
55 #define _Key_GroupInfo (1<<6)
56 #define _Key_VModMap (1<<7)
58 typedef struct _KeyInfo
61 unsigned long name; /* the 4 chars of the key name, as long */
62 unsigned char groupInfo;
63 unsigned char typesDefined;
64 unsigned char symsDefined;
65 unsigned char actsDefined;
66 short numLevels[XkbNumKbdGroups];
67 xkb_keysym_t *syms[XkbNumKbdGroups];
68 union xkb_action *acts[XkbNumKbdGroups];
69 xkb_atom_t types[XkbNumKbdGroups];
71 struct xkb_behavior behavior;
72 unsigned short vmodmap;
73 unsigned long allowNone;
78 * Init the given key info to sane values.
81 InitKeyInfo(KeyInfo * info)
84 static char dflt[4] = "*";
86 info->defs.defined = 0;
87 info->defs.fileID = 0;
88 info->defs.merge = MergeOverride;
89 info->defs.next = NULL;
90 info->name = KeyNameToLong(dflt);
92 info->typesDefined = info->symsDefined = info->actsDefined = 0;
93 for (i = 0; i < XkbNumKbdGroups; i++)
95 info->numLevels[i] = 0;
96 info->types[i] = None;
100 info->dfltType = None;
101 info->behavior.type = XkbKB_Default;
102 info->behavior.data = 0;
104 info->repeat = RepeatUndefined;
109 * Free memory associated with this key info and reset to sane values.
112 FreeKeyInfo(KeyInfo * info)
116 info->defs.defined = 0;
117 info->defs.fileID = 0;
118 info->defs.merge = MergeOverride;
119 info->defs.next = NULL;
121 info->typesDefined = info->symsDefined = info->actsDefined = 0;
122 for (i = 0; i < XkbNumKbdGroups; i++)
124 info->numLevels[i] = 0;
125 info->types[i] = None;
127 info->syms[i] = NULL;
129 info->acts[i] = NULL;
131 info->dfltType = None;
132 info->behavior.type = XkbKB_Default;
133 info->behavior.data = 0;
135 info->repeat = RepeatUndefined;
140 * Copy old into new, optionally reset old to 0.
141 * If old is reset, new simply re-uses old's memory. Otherwise, the memory is
142 * newly allocated and new points to the new memory areas.
145 CopyKeyInfo(KeyInfo * old, KeyInfo * new, Bool clearOld)
150 new->defs.next = NULL;
153 for (i = 0; i < XkbNumKbdGroups; i++)
155 old->numLevels[i] = 0;
163 for (i = 0; i < XkbNumKbdGroups; i++)
165 width = new->numLevels[i];
166 if (old->syms[i] != NULL)
168 new->syms[i] = uTypedCalloc(width, xkb_keysym_t);
172 new->numLevels[i] = 0;
175 memcpy(new->syms[i], old->syms[i], width * sizeof(xkb_keysym_t));
177 if (old->acts[i] != NULL)
179 new->acts[i] = uTypedCalloc(width, union xkb_action);
185 memcpy(new->acts[i], old->acts[i],
186 width * sizeof(union xkb_action));
193 /***====================================================================***/
195 typedef struct _ModMapEntry
202 unsigned long keyName;
207 #define SYMBOLS_INIT_SIZE 110
208 #define SYMBOLS_CHUNK 20
209 typedef struct _SymbolsInfo
211 char *name; /* e.g. pc+us+inet(evdev) */
215 unsigned explicit_group;
223 xkb_atom_t groupNames[XkbNumKbdGroups];
230 InitSymbolsInfo(SymbolsInfo * info, struct xkb_desc * xkb)
235 info->explicit_group = 0;
236 info->errorCount = 0;
238 info->merge = MergeOverride;
240 info->szKeys = SYMBOLS_INIT_SIZE;
242 info->keys = uTypedCalloc(SYMBOLS_INIT_SIZE, KeyInfo);
244 for (i = 0; i < XkbNumKbdGroups; i++)
245 info->groupNames[i] = None;
246 InitKeyInfo(&info->dflt);
247 InitVModInfo(&info->vmods, xkb);
249 info->aliases = NULL;
253 FreeSymbolsInfo(SymbolsInfo * info)
260 for (i = 0; i < info->nKeys; i++)
261 FreeKeyInfo(&info->keys[i]);
265 ClearCommonInfo(&info->modMap->defs);
267 ClearAliases(&info->aliases);
268 memset(info, 0, sizeof(SymbolsInfo));
272 ResizeKeyGroup(KeyInfo * key,
273 unsigned group, unsigned atLeastSize, Bool forceActions)
278 tooSmall = (key->numLevels[group] < atLeastSize);
280 newWidth = atLeastSize;
282 newWidth = key->numLevels[group];
284 if ((key->syms[group] == NULL) || tooSmall)
286 key->syms[group] = uTypedRecalloc(key->syms[group],
287 key->numLevels[group], newWidth,
289 if (!key->syms[group])
292 if (((forceActions) && (tooSmall || (key->acts[group] == NULL))) ||
293 (tooSmall && (key->acts[group] != NULL)))
295 key->acts[group] = uTypedRecalloc(key->acts[group],
296 key->numLevels[group], newWidth,
298 if (!key->acts[group])
301 key->numLevels[group] = newWidth;
306 MergeKeyGroups(SymbolsInfo * info,
307 KeyInfo * into, KeyInfo * from, unsigned group)
309 xkb_keysym_t *resultSyms;
310 union xkb_action *resultActs;
313 Bool report, clobber;
315 clobber = (from->defs.merge != MergeAugment);
316 report = (warningLevel > 9) ||
317 ((into->defs.fileID == from->defs.fileID) && (warningLevel > 0));
318 if (into->numLevels[group] >= from->numLevels[group])
320 resultSyms = into->syms[group];
321 resultActs = into->acts[group];
322 resultWidth = into->numLevels[group];
326 resultSyms = from->syms[group];
327 resultActs = from->acts[group];
328 resultWidth = from->numLevels[group];
330 if (resultSyms == NULL)
332 resultSyms = uTypedCalloc(resultWidth, xkb_keysym_t);
335 WSGO("Could not allocate symbols for group merge\n");
336 ACTION("Group %d of key %s not merged\n", group,
337 longText(into->name));
341 if ((resultActs == NULL) && (into->acts[group] || from->acts[group]))
343 resultActs = uTypedCalloc(resultWidth, union xkb_action);
346 WSGO("Could not allocate actions for group merge\n");
347 ACTION("Group %d of key %s not merged\n", group,
348 longText(into->name));
349 if (resultSyms != into->syms[group] &&
350 resultSyms != from->syms[group])
355 for (i = 0; i < resultWidth; i++)
357 xkb_keysym_t fromSym, toSym;
358 if (from->syms[group] && (i < from->numLevels[group]))
359 fromSym = from->syms[group][i];
362 if (into->syms[group] && (i < into->numLevels[group]))
363 toSym = into->syms[group][i];
366 if ((fromSym == NoSymbol) || (fromSym == toSym))
367 resultSyms[i] = toSym;
368 else if (toSym == NoSymbol)
369 resultSyms[i] = fromSym;
372 xkb_keysym_t use, ignore;
386 ("Multiple symbols for level %d/group %d on key %s\n",
387 i + 1, group + 1, longText(into->name));
388 ACTION("Using %s, ignoring %s\n",
389 XkbcKeysymText(use), XkbcKeysymText(ignore));
393 if (resultActs != NULL)
395 union xkb_action *fromAct, *toAct;
396 fromAct = (from->acts[group] ? &from->acts[group][i] : NULL);
397 toAct = (into->acts[group] ? &into->acts[group][i] : NULL);
398 if (((fromAct == NULL) || (fromAct->type == XkbSA_NoAction))
401 resultActs[i] = *toAct;
403 else if (((toAct == NULL) || (toAct->type == XkbSA_NoAction))
404 && (fromAct != NULL))
406 resultActs[i] = *fromAct;
410 union xkb_action *use, *ignore;
424 ("Multiple actions for level %d/group %d on key %s\n",
425 i + 1, group + 1, longText(into->name));
426 ACTION("Using %s, ignoring %s\n",
427 XkbcActionTypeText(use->type),
428 XkbcActionTypeText(ignore->type));
431 resultActs[i] = *use;
435 if (resultSyms != into->syms[group])
436 free(into->syms[group]);
437 if (resultSyms != from->syms[group])
438 free(from->syms[group]);
439 if (resultActs != into->acts[group])
440 free(into->acts[group]);
441 if (resultActs != from->acts[group])
442 free(from->acts[group]);
443 into->numLevels[group] = resultWidth;
444 into->syms[group] = resultSyms;
445 from->syms[group] = NULL;
446 into->acts[group] = resultActs;
447 from->acts[group] = NULL;
448 into->symsDefined |= (1 << group);
449 from->symsDefined &= ~(1 << group);
450 into->actsDefined |= (1 << group);
451 from->actsDefined &= ~(1 << group);
456 MergeKeys(SymbolsInfo * info, KeyInfo * into, KeyInfo * from)
459 unsigned collide = 0;
462 if (from->defs.merge == MergeReplace)
464 for (i = 0; i < XkbNumKbdGroups; i++)
466 if (into->numLevels[i] != 0)
473 memset(from, 0, sizeof(KeyInfo));
476 report = ((warningLevel > 9) ||
477 ((into->defs.fileID == from->defs.fileID)
478 && (warningLevel > 0)));
479 for (i = 0; i < XkbNumKbdGroups; i++)
481 if (from->numLevels[i] > 0)
483 if (into->numLevels[i] == 0)
485 into->numLevels[i] = from->numLevels[i];
486 into->syms[i] = from->syms[i];
487 into->acts[i] = from->acts[i];
488 into->symsDefined |= (1 << i);
489 from->syms[i] = NULL;
490 from->acts[i] = NULL;
491 from->numLevels[i] = 0;
492 from->symsDefined &= ~(1 << i);
494 into->defs.defined |= _Key_Syms;
496 into->defs.defined |= _Key_Acts;
503 collide |= _Key_Syms;
505 collide |= _Key_Acts;
507 MergeKeyGroups(info, into, from, (unsigned) i);
510 if (from->types[i] != None)
512 if ((into->types[i] != None) && (report) &&
513 (into->types[i] != from->types[i]))
515 xkb_atom_t use, ignore;
516 collide |= _Key_Types;
517 if (from->defs.merge != MergeAugment)
519 use = from->types[i];
520 ignore = into->types[i];
524 use = into->types[i];
525 ignore = from->types[i];
528 ("Multiple definitions for group %d type of key %s\n",
529 i, longText(into->name));
530 ACTION("Using %s, ignoring %s\n",
532 XkbcAtomText(ignore));
534 if ((from->defs.merge != MergeAugment)
535 || (into->types[i] == None))
537 into->types[i] = from->types[i];
541 if (UseNewField(_Key_Behavior, &into->defs, &from->defs, &collide))
543 into->behavior = from->behavior;
544 into->defs.defined |= _Key_Behavior;
546 if (UseNewField(_Key_VModMap, &into->defs, &from->defs, &collide))
548 into->vmodmap = from->vmodmap;
549 into->defs.defined |= _Key_VModMap;
551 if (UseNewField(_Key_Repeat, &into->defs, &from->defs, &collide))
553 into->repeat = from->repeat;
554 into->defs.defined |= _Key_Repeat;
556 if (UseNewField(_Key_Type_Dflt, &into->defs, &from->defs, &collide))
558 into->dfltType = from->dfltType;
559 into->defs.defined |= _Key_Type_Dflt;
561 if (UseNewField(_Key_GroupInfo, &into->defs, &from->defs, &collide))
563 into->groupInfo = from->groupInfo;
564 into->defs.defined |= _Key_GroupInfo;
568 WARN("Symbol map for key %s redefined\n",
569 longText(into->name));
570 ACTION("Using %s definition for conflicting fields\n",
571 (from->defs.merge == MergeAugment ? "first" : "last"));
577 AddKeySymbols(SymbolsInfo * info, KeyInfo * key, struct xkb_desc * xkb)
580 unsigned long real_name;
582 for (i = 0; i < info->nKeys; i++)
584 if (info->keys[i].name == key->name)
585 return MergeKeys(info, &info->keys[i], key);
587 if (FindKeyNameForAlias(xkb, key->name, &real_name))
589 for (i = 0; i < info->nKeys; i++)
591 if (info->keys[i].name == real_name)
592 return MergeKeys(info, &info->keys[i], key);
595 if (info->nKeys >= info->szKeys)
597 info->szKeys += SYMBOLS_CHUNK;
599 uTypedRecalloc(info->keys, info->nKeys, info->szKeys, KeyInfo);
602 WSGO("Could not allocate key symbols descriptions\n");
603 ACTION("Some key symbols definitions may be lost\n");
607 return CopyKeyInfo(key, &info->keys[info->nKeys++], True);
611 AddModMapEntry(SymbolsInfo * info, ModMapEntry * new)
616 clobber = (new->defs.merge != MergeAugment);
617 for (mm = info->modMap; mm != NULL; mm = (ModMapEntry *) mm->defs.next)
619 if (new->haveSymbol && mm->haveSymbol
620 && (new->u.keySym == mm->u.keySym))
622 unsigned use, ignore;
623 if (mm->modifier != new->modifier)
628 ignore = mm->modifier;
633 ignore = new->modifier;
636 ("%s added to symbol map for multiple modifiers\n",
637 XkbcKeysymText(new->u.keySym));
638 ACTION("Using %s, ignoring %s.\n",
639 XkbcModIndexText(use),
640 XkbcModIndexText(ignore));
645 if ((!new->haveSymbol) && (!mm->haveSymbol) &&
646 (new->u.keyName == mm->u.keyName))
648 unsigned use, ignore;
649 if (mm->modifier != new->modifier)
654 ignore = mm->modifier;
659 ignore = new->modifier;
661 ERROR("Key %s added to map for multiple modifiers\n",
662 longText(new->u.keyName));
663 ACTION("Using %s, ignoring %s.\n",
664 XkbcModIndexText(use),
665 XkbcModIndexText(ignore));
671 mm = uTypedAlloc(ModMapEntry);
674 WSGO("Could not allocate modifier map entry\n");
675 ACTION("Modifier map for %s will be incomplete\n",
676 XkbcModIndexText(new->modifier));
680 mm->defs.next = &info->modMap->defs;
685 /***====================================================================***/
688 MergeIncludedSymbols(SymbolsInfo * into, SymbolsInfo * from,
689 unsigned merge, struct xkb_desc * xkb)
694 if (from->errorCount > 0)
696 into->errorCount += from->errorCount;
699 if (into->name == NULL)
701 into->name = from->name;
704 for (i = 0; i < XkbNumKbdGroups; i++)
706 if (from->groupNames[i] != None)
708 if ((merge != MergeAugment) || (into->groupNames[i] == None))
709 into->groupNames[i] = from->groupNames[i];
712 for (i = 0, key = from->keys; i < from->nKeys; i++, key++)
714 if (merge != MergeDefault)
715 key->defs.merge = merge;
716 if (!AddKeySymbols(into, key, xkb))
719 if (from->modMap != NULL)
721 ModMapEntry *mm, *next;
722 for (mm = from->modMap; mm != NULL; mm = next)
724 if (merge != MergeDefault)
725 mm->defs.merge = merge;
726 if (!AddModMapEntry(into, mm))
728 next = (ModMapEntry *) mm->defs.next;
733 if (!MergeAliases(&into->aliases, &from->aliases, merge))
737 typedef void (*FileHandler) (XkbFile * /* rtrn */ ,
738 struct xkb_desc * /* xkb */ ,
739 unsigned /* merge */ ,
740 SymbolsInfo * /* included */
744 HandleIncludeSymbols(IncludeStmt * stmt,
745 struct xkb_desc * xkb, SymbolsInfo * info, FileHandler hndlr)
749 SymbolsInfo included;
753 if ((stmt->file == NULL) && (stmt->map == NULL))
757 memset(info, 0, sizeof(SymbolsInfo));
759 else if (ProcessIncludeFile(stmt, XkmSymbolsIndex, &rtrn, &newMerge))
761 InitSymbolsInfo(&included, xkb);
762 included.fileID = included.dflt.defs.fileID = rtrn->id;
763 included.merge = included.dflt.defs.merge = MergeOverride;
766 included.explicit_group = atoi(stmt->modifier) - 1;
770 included.explicit_group = info->explicit_group;
772 (*hndlr) (rtrn, xkb, MergeOverride, &included);
773 if (stmt->stmt != NULL)
776 included.name = stmt->stmt;
783 info->errorCount += 10;
786 if ((stmt->next != NULL) && (included.errorCount < 1))
790 SymbolsInfo next_incl;
792 for (next = stmt->next; next != NULL; next = next->next)
794 if ((next->file == NULL) && (next->map == NULL))
797 MergeIncludedSymbols(&included, info, next->merge, xkb);
798 FreeSymbolsInfo(info);
800 else if (ProcessIncludeFile(next, XkmSymbolsIndex, &rtrn, &op))
802 InitSymbolsInfo(&next_incl, xkb);
803 next_incl.fileID = next_incl.dflt.defs.fileID = rtrn->id;
804 next_incl.merge = next_incl.dflt.defs.merge = MergeOverride;
807 next_incl.explicit_group = atoi(next->modifier) - 1;
811 next_incl.explicit_group = info->explicit_group;
813 (*hndlr) (rtrn, xkb, MergeOverride, &next_incl);
814 MergeIncludedSymbols(&included, &next_incl, op, xkb);
815 FreeSymbolsInfo(&next_incl);
820 info->errorCount += 10;
829 MergeIncludedSymbols(info, &included, newMerge, xkb);
830 FreeSymbolsInfo(&included);
832 return (info->errorCount == 0);
839 GetGroupIndex(KeyInfo * key,
840 ExprDef * arrayNdx, unsigned what, unsigned *ndx_rtrn)
850 if (arrayNdx == NULL)
855 defined = key->symsDefined;
857 defined = key->actsDefined;
859 for (i = 0; i < XkbNumKbdGroups; i++)
861 if ((defined & (1 << i)) == 0)
867 ERROR("Too many groups of %s for key %s (max %d)\n", name,
868 longText(key->name), XkbNumKbdGroups + 1);
869 ACTION("Ignoring %s defined for extra groups\n", name);
872 if (!ExprResolveGroup(arrayNdx, &tmp))
874 ERROR("Illegal group index for %s of key %s\n", name,
875 longText(key->name));
876 ACTION("Definition with non-integer array index ignored\n");
879 *ndx_rtrn = tmp.uval - 1;
884 AddSymbolsToKey(KeyInfo * key,
885 struct xkb_desc * xkb,
887 ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
892 if (!GetGroupIndex(key, arrayNdx, SYMBOLS, &ndx))
896 key->symsDefined |= (1 << ndx);
899 if (value->op != ExprKeysymList)
901 ERROR("Expected a list of symbols, found %s\n", exprOpText(value->op));
902 ACTION("Ignoring symbols for group %d of %s\n", ndx,
903 longText(key->name));
906 if (key->syms[ndx] != NULL)
908 ERROR("Symbols for key %s, group %d already defined\n",
909 longText(key->name), ndx);
910 ACTION("Ignoring duplicate definition\n");
913 nSyms = value->value.list.nSyms;
914 if (((key->numLevels[ndx] < nSyms) || (key->syms[ndx] == NULL)) &&
915 (!ResizeKeyGroup(key, ndx, nSyms, False)))
917 WSGO("Could not resize group %d of key %s to contain %d levels\n", ndx,
918 longText(key->name), nSyms);
919 ACTION("Symbols lost\n");
922 key->symsDefined |= (1 << ndx);
923 for (i = 0; i < nSyms; i++) {
924 if (!LookupKeysym(value->value.list.syms[i], &key->syms[ndx][i])) {
925 WARN("Could not resolve keysym %s for key %s, group %d, level %d\n",
926 value->value.list.syms[i], longText(key->name), ndx, nSyms);
927 key->syms[ndx][i] = NoSymbol;
930 for (i = key->numLevels[ndx] - 1;
931 (i >= 0) && (key->syms[ndx][i] == NoSymbol); i--)
933 key->numLevels[ndx]--;
939 AddActionsToKey(KeyInfo * key,
940 struct xkb_desc * xkb,
942 ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
947 struct xkb_any_action *toAct;
949 if (!GetGroupIndex(key, arrayNdx, ACTIONS, &ndx))
954 key->actsDefined |= (1 << ndx);
957 if (value->op != ExprActionList)
959 WSGO("Bad expression type (%d) for action list value\n", value->op);
960 ACTION("Ignoring actions for group %d of %s\n", ndx,
961 longText(key->name));
964 if (key->acts[ndx] != NULL)
966 WSGO("Actions for key %s, group %d already defined\n",
967 longText(key->name), ndx);
970 for (nActs = 0, act = value->value.child; act != NULL; nActs++)
972 act = (ExprDef *) act->common.next;
976 WSGO("Action list but not actions in AddActionsToKey\n");
979 if (((key->numLevels[ndx] < nActs) || (key->acts[ndx] == NULL)) &&
980 (!ResizeKeyGroup(key, ndx, nActs, True)))
982 WSGO("Could not resize group %d of key %s\n", ndx,
983 longText(key->name));
984 ACTION("Actions lost\n");
987 key->actsDefined |= (1 << ndx);
989 toAct = (struct xkb_any_action *) key->acts[ndx];
990 act = value->value.child;
991 for (i = 0; i < nActs; i++, toAct++)
993 if (!HandleActionDef(act, xkb, toAct, MergeOverride, info->action))
995 ERROR("Illegal action definition for %s\n",
996 longText(key->name));
997 ACTION("Action for group %d/level %d ignored\n", ndx + 1, i + 1);
999 act = (ExprDef *) act->common.next;
1004 static const LookupEntry lockingEntries[] = {
1005 {"true", XkbKB_Lock},
1006 {"yes", XkbKB_Lock},
1008 {"false", XkbKB_Default},
1009 {"no", XkbKB_Default},
1010 {"off", XkbKB_Default},
1011 {"permanent", XkbKB_Lock | XkbKB_Permanent},
1015 static const LookupEntry repeatEntries[] = {
1016 {"true", RepeatYes},
1019 {"false", RepeatNo},
1022 {"default", RepeatUndefined},
1027 SetSymbolsField(KeyInfo * key,
1028 struct xkb_desc * xkb,
1030 ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
1035 if (uStrCaseCmp(field, "type") == 0)
1038 if ((!ExprResolveString(value, &tmp))
1039 && (warningLevel > 0))
1041 WARN("The type field of a key symbol map must be a string\n");
1042 ACTION("Ignoring illegal type definition\n");
1044 if (arrayNdx == NULL)
1046 key->dfltType = xkb_intern_atom(tmp.str);
1047 key->defs.defined |= _Key_Type_Dflt;
1049 else if (!ExprResolveGroup(arrayNdx, &ndx))
1051 ERROR("Illegal group index for type of key %s\n",
1052 longText(key->name));
1053 ACTION("Definition with non-integer array index ignored\n");
1059 key->types[ndx.uval - 1] = xkb_intern_atom(tmp.str);
1060 key->typesDefined |= (1 << (ndx.uval - 1));
1064 else if (uStrCaseCmp(field, "symbols") == 0)
1065 return AddSymbolsToKey(key, xkb, field, arrayNdx, value, info);
1066 else if (uStrCaseCmp(field, "actions") == 0)
1067 return AddActionsToKey(key, xkb, field, arrayNdx, value, info);
1068 else if ((uStrCaseCmp(field, "vmods") == 0) ||
1069 (uStrCaseCmp(field, "virtualmods") == 0) ||
1070 (uStrCaseCmp(field, "virtualmodifiers") == 0))
1072 ok = ExprResolveVModMask(value, &tmp, xkb);
1075 key->vmodmap = (tmp.uval >> 8);
1076 key->defs.defined |= _Key_VModMap;
1080 ERROR("Expected a virtual modifier mask, found %s\n",
1081 exprOpText(value->op));
1082 ACTION("Ignoring virtual modifiers definition for key %s\n",
1083 longText(key->name));
1086 else if ((uStrCaseCmp(field, "locking") == 0)
1087 || (uStrCaseCmp(field, "lock") == 0)
1088 || (uStrCaseCmp(field, "locks") == 0))
1090 ok = ExprResolveEnum(value, &tmp, lockingEntries);
1092 key->behavior.type = tmp.uval;
1093 key->defs.defined |= _Key_Behavior;
1095 else if ((uStrCaseCmp(field, "radiogroup") == 0) ||
1096 (uStrCaseCmp(field, "permanentradiogroup") == 0) ||
1097 (uStrCaseEqual(field, "allownone")))
1099 ERROR("Radio groups not supported\n");
1100 ACTION("Ignoring radio group specification for key %s\n", longText(key->name));
1103 else if (uStrCasePrefix("overlay", field) ||
1104 uStrCasePrefix("permanentoverlay", field))
1106 ERROR("Overlays not supported\n");
1107 ACTION("Ignoring overlay specification for key %s\n", longText(key->name));
1109 else if ((uStrCaseCmp(field, "repeating") == 0) ||
1110 (uStrCaseCmp(field, "repeats") == 0) ||
1111 (uStrCaseCmp(field, "repeat") == 0))
1113 ok = ExprResolveEnum(value, &tmp, repeatEntries);
1116 ERROR("Illegal repeat setting for %s\n",
1117 longText(key->name));
1118 ACTION("Non-boolean repeat setting ignored\n");
1121 key->repeat = tmp.uval;
1122 key->defs.defined |= _Key_Repeat;
1124 else if ((uStrCaseCmp(field, "groupswrap") == 0) ||
1125 (uStrCaseCmp(field, "wrapgroups") == 0))
1127 ok = ExprResolveBoolean(value, &tmp);
1130 ERROR("Illegal groupsWrap setting for %s\n",
1131 longText(key->name));
1132 ACTION("Non-boolean value ignored\n");
1136 key->groupInfo = XkbWrapIntoRange;
1138 key->groupInfo = XkbClampIntoRange;
1139 key->defs.defined |= _Key_GroupInfo;
1141 else if ((uStrCaseCmp(field, "groupsclamp") == 0) ||
1142 (uStrCaseCmp(field, "clampgroups") == 0))
1144 ok = ExprResolveBoolean(value, &tmp);
1147 ERROR("Illegal groupsClamp setting for %s\n",
1148 longText(key->name));
1149 ACTION("Non-boolean value ignored\n");
1153 key->groupInfo = XkbClampIntoRange;
1155 key->groupInfo = XkbWrapIntoRange;
1156 key->defs.defined |= _Key_GroupInfo;
1158 else if ((uStrCaseCmp(field, "groupsredirect") == 0) ||
1159 (uStrCaseCmp(field, "redirectgroups") == 0))
1161 if (!ExprResolveGroup(value, &tmp))
1163 ERROR("Illegal group index for redirect of key %s\n",
1164 longText(key->name));
1165 ACTION("Definition with non-integer group ignored\n");
1169 XkbSetGroupInfo(0, XkbRedirectIntoRange, tmp.uval - 1);
1170 key->defs.defined |= _Key_GroupInfo;
1174 ERROR("Unknown field %s in a symbol interpretation\n", field);
1175 ACTION("Definition ignored\n");
1182 SetGroupName(SymbolsInfo * info, ExprDef * arrayNdx, ExprDef * value)
1184 ExprResult tmp, name;
1186 if ((arrayNdx == NULL) && (warningLevel > 0))
1188 WARN("You must specify an index when specifying a group name\n");
1189 ACTION("Group name definition without array subscript ignored\n");
1192 if (!ExprResolveGroup(arrayNdx, &tmp))
1194 ERROR("Illegal index in group name definition\n");
1195 ACTION("Definition with non-integer array index ignored\n");
1198 if (!ExprResolveString(value, &name))
1200 ERROR("Group name must be a string\n");
1201 ACTION("Illegal name for group %d ignored\n", tmp.uval);
1204 info->groupNames[tmp.uval - 1 + info->explicit_group] =
1205 xkb_intern_atom(name.str);
1212 HandleSymbolsVar(VarDef * stmt, struct xkb_desc * xkb, SymbolsInfo * info)
1214 ExprResult elem, field, tmp;
1218 if (ExprResolveLhs(stmt->name, &elem, &field, &arrayNdx) == 0)
1219 return 0; /* internal error, already reported */
1220 if (elem.str && (uStrCaseCmp(elem.str, "key") == 0))
1222 ret = SetSymbolsField(&info->dflt, xkb, field.str, arrayNdx,
1225 else if ((elem.str == NULL) && ((uStrCaseCmp(field.str, "name") == 0) ||
1226 (uStrCaseCmp(field.str, "groupname") ==
1229 ret = SetGroupName(info, arrayNdx, stmt->value);
1231 else if ((elem.str == NULL)
1232 && ((uStrCaseCmp(field.str, "groupswrap") == 0)
1233 || (uStrCaseCmp(field.str, "wrapgroups") == 0)))
1235 if (!ExprResolveBoolean(stmt->value, &tmp))
1237 ERROR("Illegal setting for global groupsWrap\n");
1238 ACTION("Non-boolean value ignored\n");
1243 info->groupInfo = XkbWrapIntoRange;
1245 info->groupInfo = XkbClampIntoRange;
1249 else if ((elem.str == NULL)
1250 && ((uStrCaseCmp(field.str, "groupsclamp") == 0)
1251 || (uStrCaseCmp(field.str, "clampgroups") == 0)))
1253 if (!ExprResolveBoolean(stmt->value, &tmp))
1255 ERROR("Illegal setting for global groupsClamp\n");
1256 ACTION("Non-boolean value ignored\n");
1261 info->groupInfo = XkbClampIntoRange;
1263 info->groupInfo = XkbWrapIntoRange;
1267 else if ((elem.str == NULL)
1268 && ((uStrCaseCmp(field.str, "groupsredirect") == 0)
1269 || (uStrCaseCmp(field.str, "redirectgroups") == 0)))
1271 if (!ExprResolveGroup(stmt->value, &tmp))
1273 ERROR("Illegal group index for global groupsRedirect\n");
1274 ACTION("Definition with non-integer group ignored\n");
1278 info->groupInfo = XkbSetGroupInfo(0, XkbRedirectIntoRange,
1283 else if ((elem.str == NULL) && (uStrCaseCmp(field.str, "allownone") == 0))
1285 ERROR("Radio groups not supported\n");
1286 ACTION("Ignoring \"allow none\" specification\n");
1290 ret = SetActionField(xkb, elem.str, field.str, arrayNdx, stmt->value,
1300 HandleSymbolsBody(VarDef * def,
1301 struct xkb_desc * xkb, KeyInfo * key, SymbolsInfo * info)
1304 ExprResult tmp, field;
1307 for (; def != NULL; def = (VarDef *) def->common.next)
1309 if ((def->name) && (def->name->type == ExprFieldRef))
1311 ok = HandleSymbolsVar(def, xkb, info);
1316 if (def->name == NULL)
1318 if ((def->value == NULL)
1319 || (def->value->op == ExprKeysymList))
1320 field.str = strdup("symbols");
1322 field.str = strdup("actions");
1327 ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx);
1330 ok = SetSymbolsField(key, xkb, field.str, arrayNdx,
1339 SetExplicitGroup(SymbolsInfo * info, KeyInfo * key)
1341 unsigned group = info->explicit_group;
1346 if ((key->typesDefined | key->symsDefined | key->actsDefined) & ~1)
1349 WARN("For the map %s an explicit group specified\n", info->name);
1350 WARN("but key %s has more than one group defined\n",
1351 longText(key->name));
1352 ACTION("All groups except first one will be ignored\n");
1353 for (i = 1; i < XkbNumKbdGroups; i++)
1355 key->numLevels[i] = 0;
1357 key->syms[i] = NULL;
1359 key->acts[i] = NULL;
1363 key->typesDefined = key->symsDefined = key->actsDefined = 1 << group;
1365 key->numLevels[group] = key->numLevels[0];
1366 key->numLevels[0] = 0;
1367 key->syms[group] = key->syms[0];
1368 key->syms[0] = NULL;
1369 key->acts[group] = key->acts[0];
1370 key->acts[0] = NULL;
1371 key->types[group] = key->types[0];
1377 HandleSymbolsDef(SymbolsDef * stmt,
1378 struct xkb_desc * xkb, unsigned merge, SymbolsInfo * info)
1383 CopyKeyInfo(&info->dflt, &key, False);
1384 key.defs.merge = stmt->merge;
1385 key.name = KeyNameToLong(stmt->keyName);
1386 if (!HandleSymbolsBody((VarDef *) stmt->symbols, xkb, &key, info))
1392 if (!SetExplicitGroup(info, &key))
1398 if (!AddKeySymbols(info, &key, xkb))
1407 HandleModMapDef(ModMapDef * def,
1408 struct xkb_desc * xkb, unsigned merge, SymbolsInfo * info)
1415 if (!LookupModIndex(NULL, def->modifier, TypeInt, &rtrn))
1417 ERROR("Illegal modifier map definition\n");
1418 ACTION("Ignoring map for non-modifier \"%s\"\n",
1419 XkbcAtomText(def->modifier));
1423 tmp.modifier = rtrn.uval;
1424 for (key = def->keys; key != NULL; key = (ExprDef *) key->common.next)
1426 if ((key->op == ExprValue) && (key->type == TypeKeyName))
1428 tmp.haveSymbol = False;
1429 tmp.u.keyName = KeyNameToLong(key->value.keyName);
1431 else if (ExprResolveKeySym(key, &rtrn))
1433 tmp.haveSymbol = True;
1434 tmp.u.keySym = rtrn.uval;
1438 ERROR("Modmap entries may contain only key names or keysyms\n");
1439 ACTION("Illegal definition for %s modifier ignored\n",
1440 XkbcModIndexText(tmp.modifier));
1444 ok = AddModMapEntry(info, &tmp) && ok;
1450 HandleSymbolsFile(XkbFile * file,
1451 struct xkb_desc * xkb, unsigned merge, SymbolsInfo * info)
1456 info->name = _XkbDupString(file->name);
1460 switch (stmt->stmtType)
1463 if (!HandleIncludeSymbols((IncludeStmt *) stmt, xkb, info,
1467 case StmtSymbolsDef:
1468 if (!HandleSymbolsDef((SymbolsDef *) stmt, xkb, merge, info))
1472 if (!HandleSymbolsVar((VarDef *) stmt, xkb, info))
1476 if (!HandleVModDef((VModDef *) stmt, xkb, merge, &info->vmods))
1480 ERROR("Interpretation files may not include other types\n");
1481 ACTION("Ignoring definition of symbol interpretation\n");
1484 case StmtKeycodeDef:
1485 ERROR("Interpretation files may not include other types\n");
1486 ACTION("Ignoring definition of key name\n");
1490 if (!HandleModMapDef((ModMapDef *) stmt, xkb, merge, info))
1494 WSGO("Unexpected statement type %d in HandleSymbolsFile\n",
1499 if (info->errorCount > 10)
1502 ERROR("Too many errors\n");
1504 ACTION("Abandoning symbols file \"%s\"\n", file->topName);
1511 FindKeyForSymbol(struct xkb_desc * xkb, xkb_keysym_t sym, xkb_keycode_t *kc_rtrn)
1520 for (i = xkb->min_key_code; i <= (int) xkb->max_key_code; i++)
1522 if (j < (int) XkbKeyNumSyms(xkb, i))
1525 if (XkbKeySym(xkb, i, j) == sym)
1539 * Find the given name in the xkb->map->types and return its index.
1541 * @param atom The atom to search for.
1542 * @param type_rtrn Set to the index of the name if found.
1544 * @return True if found, False otherwise.
1547 FindNamedType(struct xkb_desc * xkb, xkb_atom_t atom, unsigned *type_rtrn)
1550 const char *name = XkbcAtomText(atom);
1552 if (xkb && xkb->map && xkb->map->types)
1554 for (n = 0; n < xkb->map->num_types; n++)
1556 if (strcmp(xkb->map->types[n].name, name) == 0)
1567 * Assign a type to the given sym and return the Atom for the type assigned.
1570 * - ONE_LEVEL for width 0/1
1571 * - ALPHABETIC for 2 shift levels, with lower/upercase
1572 * - KEYPAD for keypad keys.
1573 * - TWO_LEVEL for other 2 shift level keys.
1574 * and the same for four level keys.
1576 * @param width Number of sysms in syms.
1577 * @param syms The keysyms for the given key (must be size width).
1578 * @param typeNameRtrn Set to the Atom of the type name.
1580 * @returns True if a type could be found, False otherwise.
1583 FindAutomaticType(int width, xkb_keysym_t * syms, xkb_atom_t * typeNameRtrn,
1587 if ((width == 1) || (width == 0))
1589 *typeNameRtrn = xkb_intern_atom("ONE_LEVEL");
1592 else if (width == 2)
1594 if (syms && XkbcKSIsLower(syms[0]) && XkbcKSIsUpper(syms[1]))
1596 *typeNameRtrn = xkb_intern_atom("ALPHABETIC");
1598 else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1])))
1600 *typeNameRtrn = xkb_intern_atom("KEYPAD");
1605 *typeNameRtrn = xkb_intern_atom("TWO_LEVEL");
1609 else if (width <= 4)
1611 if (syms && XkbcKSIsLower(syms[0]) && XkbcKSIsUpper(syms[1]))
1612 if (XkbcKSIsLower(syms[2]) && XkbcKSIsUpper(syms[3]))
1614 xkb_intern_atom("FOUR_LEVEL_ALPHABETIC");
1616 *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL_SEMIALPHABETIC");
1618 else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1])))
1619 *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL_KEYPAD");
1621 *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL");
1622 /* XXX: why not set autoType here? */
1624 return ((width >= 0) && (width <= 4));
1628 * Ensure the given KeyInfo is in a coherent state, i.e. no gaps between the
1629 * groups, and reduce to one group if all groups are identical anyway.
1632 PrepareKeyDef(KeyInfo * key)
1634 int i, j, width, defined, lastGroup;
1637 defined = key->symsDefined | key->actsDefined | key->typesDefined;
1638 /* get highest group number */
1639 for (i = XkbNumKbdGroups - 1; i >= 0; i--)
1641 if (defined & (1 << i))
1649 /* If there are empty groups between non-empty ones fill them with data */
1650 /* from the first group. */
1651 /* We can make a wrong assumption here. But leaving gaps is worse. */
1652 for (i = lastGroup; i > 0; i--)
1654 if (defined & (1 << i))
1656 width = key->numLevels[0];
1657 if (key->typesDefined & 1)
1659 for (j = 0; j < width; j++)
1661 key->types[i] = key->types[0];
1663 key->typesDefined |= 1 << i;
1665 if ((key->actsDefined & 1) && key->acts[0])
1667 key->acts[i] = uTypedCalloc(width, union xkb_action);
1668 if (key->acts[i] == NULL)
1670 memcpy(key->acts[i], key->acts[0],
1671 width * sizeof(union xkb_action));
1672 key->actsDefined |= 1 << i;
1674 if ((key->symsDefined & 1) && key->syms[0])
1676 key->syms[i] = uTypedCalloc(width, xkb_keysym_t);
1677 if (key->syms[i] == NULL)
1679 memcpy(key->syms[i], key->syms[0], width * sizeof(xkb_keysym_t));
1680 key->symsDefined |= 1 << i;
1684 key->numLevels[i] = key->numLevels[0];
1687 /* If all groups are completely identical remove them all */
1688 /* exept the first one. */
1690 for (i = lastGroup; i > 0; i--)
1692 if ((key->numLevels[i] != key->numLevels[0]) ||
1693 (key->types[i] != key->types[0]))
1698 if ((key->syms[i] != key->syms[0]) &&
1699 (key->syms[i] == NULL || key->syms[0] == NULL ||
1700 memcmp(key->syms[i], key->syms[0],
1701 sizeof(xkb_keysym_t) * key->numLevels[0])))
1706 if ((key->acts[i] != key->acts[0]) &&
1707 (key->acts[i] == NULL || key->acts[0] == NULL ||
1708 memcmp(key->acts[i], key->acts[0],
1709 sizeof(union xkb_action) * key->numLevels[0])))
1717 for (i = lastGroup; i > 0; i--)
1719 key->numLevels[i] = 0;
1721 key->syms[i] = NULL;
1723 key->acts[i] = NULL;
1726 key->symsDefined &= 1;
1727 key->actsDefined &= 1;
1728 key->typesDefined &= 1;
1733 * Copy the KeyInfo into the keyboard description.
1735 * This function recurses.
1738 CopySymbolsDef(struct xkb_desc * xkb, KeyInfo *key, int start_from)
1742 unsigned width, tmp, nGroups;
1743 struct xkb_key_type * type;
1744 Bool haveActions, autoType, useAlias;
1745 xkb_keysym_t *outSyms;
1746 union xkb_action *outActs;
1747 unsigned types[XkbNumKbdGroups];
1749 useAlias = (start_from == 0);
1751 /* get the keycode for the key. */
1752 if (!FindNamedKey(xkb, key->name, &kc, useAlias, CreateKeyNames(xkb),
1755 if ((start_from == 0) && (warningLevel >= 5))
1757 WARN("Key %s not found in keycodes\n", longText(key->name));
1758 ACTION("Symbols ignored\n");
1763 haveActions = False;
1764 for (i = width = nGroups = 0; i < XkbNumKbdGroups; i++)
1766 if (((i + 1) > nGroups)
1767 && (((key->symsDefined | key->actsDefined) & (1 << i))
1768 || (key->typesDefined) & (1 << i)))
1773 /* Assign the type to the key, if it is missing. */
1774 if (key->types[i] == None)
1776 if (key->dfltType != None)
1777 key->types[i] = key->dfltType;
1778 else if (FindAutomaticType(key->numLevels[i], key->syms[i],
1779 &key->types[i], &autoType))
1784 if (warningLevel >= 5)
1786 WARN("No automatic type for %d symbols\n",
1787 (unsigned int) key->numLevels[i]);
1788 ACTION("Using %s for the %s key (keycode %d)\n",
1789 XkbcAtomText(key->types[i]),
1790 longText(key->name), kc);
1794 if (FindNamedType(xkb, key->types[i], &types[i]))
1796 if (!autoType || key->numLevels[i] > 2)
1797 xkb->server->explicit[kc] |= (1 << i);
1801 if (warningLevel >= 3)
1803 WARN("Type \"%s\" is not defined\n",
1804 XkbcAtomText(key->types[i]));
1805 ACTION("Using TWO_LEVEL for the %s key (keycode %d)\n",
1806 longText(key->name), kc);
1808 types[i] = XkbTwoLevelIndex;
1810 /* if the type specifies less syms than the key has, shrink the key */
1811 type = &xkb->map->types[types[i]];
1812 if (type->num_levels < key->numLevels[i])
1814 if (warningLevel > 0)
1816 WARN("Type \"%s\" has %d levels, but %s has %d symbols\n",
1817 type->name, type->num_levels,
1818 XkbcAtomText(key->name), key->numLevels[i]);
1819 ACTION("Ignoring extra symbols\n");
1821 key->numLevels[i] = type->num_levels;
1823 if (key->numLevels[i] > width)
1824 width = key->numLevels[i];
1825 if (type->num_levels > width)
1826 width = type->num_levels;
1829 /* width is now the largest width found */
1831 i = width * nGroups;
1832 outSyms = XkbcResizeKeySyms(xkb, kc, i);
1833 if (outSyms == NULL)
1835 WSGO("Could not enlarge symbols for %s (keycode %d)\n",
1836 longText(key->name), kc);
1841 outActs = XkbcResizeKeyActions(xkb, kc, i);
1842 if (outActs == NULL)
1844 WSGO("Could not enlarge actions for %s (key %d)\n",
1845 longText(key->name), kc);
1848 xkb->server->explicit[kc] |= XkbExplicitInterpretMask;
1852 if (key->defs.defined & _Key_GroupInfo)
1855 i = xkb->map->key_sym_map[kc].group_info;
1857 xkb->map->key_sym_map[kc].group_info = XkbSetNumGroups(i, nGroups);
1858 xkb->map->key_sym_map[kc].width = width;
1859 for (i = 0; i < nGroups; i++)
1861 /* assign kt_index[i] to the index of the type in map->types.
1862 * kt_index[i] may have been set by a previous run (if we have two
1863 * layouts specified). Let's not overwrite it with the ONE_LEVEL
1864 * default group if we dont even have keys for this group anyway.
1866 * FIXME: There should be a better fix for this.
1868 if (key->numLevels[i])
1869 xkb->map->key_sym_map[kc].kt_index[i] = types[i];
1870 if (key->syms[i] != NULL)
1872 /* fill key to "width" symbols*/
1873 for (tmp = 0; tmp < width; tmp++)
1875 if (tmp < key->numLevels[i])
1876 outSyms[tmp] = key->syms[i][tmp];
1878 outSyms[tmp] = NoSymbol;
1879 if ((outActs != NULL) && (key->acts[i] != NULL))
1881 if (tmp < key->numLevels[i])
1882 outActs[tmp] = key->acts[i][tmp];
1884 outActs[tmp].type = XkbSA_NoAction;
1892 switch (key->behavior.type & XkbKB_OpMask)
1897 xkb->server->behaviors[kc] = key->behavior;
1898 xkb->server->explicit[kc] |= XkbExplicitBehaviorMask;
1901 if (key->defs.defined & _Key_VModMap)
1903 xkb->server->vmodmap[kc] = key->vmodmap;
1904 xkb->server->explicit[kc] |= XkbExplicitVModMapMask;
1906 if (key->repeat != RepeatUndefined)
1908 if (key->repeat == RepeatYes)
1909 xkb->ctrls->per_key_repeat[kc / 8] |= (1 << (kc % 8));
1911 xkb->ctrls->per_key_repeat[kc / 8] &= ~(1 << (kc % 8));
1912 xkb->server->explicit[kc] |= XkbExplicitAutoRepeatMask;
1915 if (nGroups > xkb->ctrls->num_groups)
1916 xkb->ctrls->num_groups = nGroups;
1918 /* do the same thing for the next key */
1919 CopySymbolsDef(xkb, key, kc + 1);
1924 CopyModMapDef(struct xkb_desc * xkb, ModMapEntry *entry)
1928 if ((!entry->haveSymbol)
1931 (xkb, entry->u.keyName, &kc, True, CreateKeyNames(xkb), 0)))
1933 if (warningLevel >= 5)
1935 WARN("Key %s not found in keycodes\n",
1936 longText(entry->u.keyName));
1937 ACTION("Modifier map entry for %s not updated\n",
1938 XkbcModIndexText(entry->modifier));
1942 else if (entry->haveSymbol
1943 && (!FindKeyForSymbol(xkb, entry->u.keySym, &kc)))
1945 if (warningLevel > 5)
1947 WARN("Key \"%s\" not found in symbol map\n",
1948 XkbcKeysymText(entry->u.keySym));
1949 ACTION("Modifier map entry for %s not updated\n",
1950 XkbcModIndexText(entry->modifier));
1954 xkb->map->modmap[kc] |= (1 << entry->modifier);
1959 * Handle the xkb_symbols section of an xkb file.
1961 * @param file The parsed xkb_symbols section of the xkb file.
1962 * @param xkb Handle to the keyboard description to store the symbols in.
1963 * @param merge Merge strategy (e.g. MergeOverride).
1966 CompileSymbols(XkbFile *file, struct xkb_desc * xkb, unsigned merge)
1971 InitSymbolsInfo(&info, xkb);
1972 info.dflt.defs.fileID = file->id;
1973 info.dflt.defs.merge = merge;
1974 HandleSymbolsFile(file, xkb, merge, &info);
1976 if (info.nKeys == 0) {
1977 FreeSymbolsInfo(&info);
1981 if (info.errorCount == 0)
1985 /* alloc memory in the xkb struct */
1986 if (XkbcAllocNames(xkb, XkbGroupNamesMask, 0) != Success)
1988 WSGO("Can not allocate names in CompileSymbols\n");
1989 ACTION("Symbols not added\n");
1992 if (XkbcAllocClientMap(xkb, XkbKeySymsMask | XkbModifierMapMask, 0)
1995 WSGO("Could not allocate client map in CompileSymbols\n");
1996 ACTION("Symbols not added\n");
1999 if (XkbcAllocServerMap(xkb, XkbAllServerInfoMask, 32) != Success)
2001 WSGO("Could not allocate server map in CompileSymbols\n");
2002 ACTION("Symbols not added\n");
2005 if (XkbcAllocControls(xkb, XkbPerKeyRepeatMask) != Success)
2007 WSGO("Could not allocate controls in CompileSymbols\n");
2008 ACTION("Symbols not added\n");
2012 /* now copy info into xkb. */
2014 ApplyAliases(xkb, &info.aliases);
2015 for (i = 0; i < XkbNumKbdGroups; i++)
2017 if (info.groupNames[i] != None)
2019 free((char *) xkb->names->groups[i]);
2020 xkb->names->groups[i] = XkbcAtomGetString(info.groupNames[i]);
2024 for (key = info.keys, i = 0; i < info.nKeys; i++, key++)
2029 for (key = info.keys, i = 0; i < info.nKeys; i++, key++)
2031 if (!CopySymbolsDef(xkb, key, 0))
2034 if (warningLevel > 3)
2036 for (i = xkb->min_key_code; i <= xkb->max_key_code; i++)
2038 if (xkb->names->keys[i].name[0] == '\0')
2040 if (XkbKeyNumGroups(xkb, i) < 1)
2043 memcpy(buf, xkb->names->keys[i].name, 4);
2046 ("No symbols defined for <%s> (keycode %d)\n",
2053 ModMapEntry *mm, *next;
2054 for (mm = info.modMap; mm != NULL; mm = next)
2056 if (!CopyModMapDef(xkb, mm))
2058 next = (ModMapEntry *) mm->defs.next;
2061 FreeSymbolsInfo(&info);
2065 FreeSymbolsInfo(&info);