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 ********************************************************/
27 #include "xkbcomp-priv.h"
28 #include "parseutils.h"
34 /***====================================================================***/
38 #define RepeatUndefined ~((unsigned)0)
40 #define _Key_Syms (1<<0)
41 #define _Key_Acts (1<<1)
42 #define _Key_Repeat (1<<2)
43 #define _Key_Behavior (1<<3)
44 #define _Key_Type_Dflt (1<<4)
45 #define _Key_Types (1<<5)
46 #define _Key_GroupInfo (1<<6)
47 #define _Key_VModMap (1<<7)
49 typedef struct _KeyInfo
52 unsigned long name; /* the 4 chars of the key name, as long */
53 unsigned char groupInfo;
54 unsigned char typesDefined;
55 unsigned char symsDefined;
56 unsigned char actsDefined;
57 unsigned int numLevels[XkbNumKbdGroups];
59 /* syms[group] -> Single array for all the keysyms in the group. */
60 xkb_keysym_t *syms[XkbNumKbdGroups];
61 /* sizeSyms[group] -> The size of the syms[group] array. */
62 int sizeSyms[XkbNumKbdGroups];
64 * symsMapIndex[group][level] -> The index from which the syms for
65 * the level begin in the syms[group] array. Remember each keycode
66 * can have multiple keysyms in each level (that is, each key press
67 * can result in multiple keysyms).
69 int *symsMapIndex[XkbNumKbdGroups];
71 * symsMapNumEntries[group][level] -> How many syms are in
72 * syms[group][symsMapIndex[group][level]].
74 unsigned int *symsMapNumEntries[XkbNumKbdGroups];
76 union xkb_action *acts[XkbNumKbdGroups];
77 xkb_atom_t types[XkbNumKbdGroups];
79 struct xkb_behavior behavior;
80 unsigned short vmodmap;
85 * Init the given key info to sane values.
88 InitKeyInfo(KeyInfo * info)
91 static const char dflt[4] = "*";
93 info->defs.defined = 0;
94 info->defs.fileID = 0;
95 info->defs.merge = MergeOverride;
96 info->defs.next = NULL;
97 info->name = KeyNameToLong(dflt);
99 info->typesDefined = info->symsDefined = info->actsDefined = 0;
100 for (i = 0; i < XkbNumKbdGroups; i++)
102 info->numLevels[i] = 0;
103 info->types[i] = XKB_ATOM_NONE;
104 info->syms[i] = NULL;
105 info->sizeSyms[i] = 0;
106 info->symsMapIndex[i] = NULL;
107 info->symsMapNumEntries[i] = NULL;
108 info->acts[i] = NULL;
110 info->dfltType = XKB_ATOM_NONE;
111 info->behavior.type = XkbKB_Default;
112 info->behavior.data = 0;
114 info->repeat = RepeatUndefined;
118 * Free memory associated with this key info and reset to sane values.
121 FreeKeyInfo(KeyInfo * info)
125 info->defs.defined = 0;
126 info->defs.fileID = 0;
127 info->defs.merge = MergeOverride;
128 info->defs.next = NULL;
130 info->typesDefined = info->symsDefined = info->actsDefined = 0;
131 for (i = 0; i < XkbNumKbdGroups; i++)
133 info->numLevels[i] = 0;
134 info->types[i] = XKB_ATOM_NONE;
136 info->syms[i] = NULL;
137 info->sizeSyms[i] = 0;
138 free(info->symsMapIndex[i]);
139 info->symsMapIndex[i] = NULL;
140 free(info->symsMapNumEntries[i]);
141 info->symsMapNumEntries[i] = NULL;
143 info->acts[i] = NULL;
145 info->dfltType = XKB_ATOM_NONE;
146 info->behavior.type = XkbKB_Default;
147 info->behavior.data = 0;
149 info->repeat = RepeatUndefined;
153 * Copy old into new, optionally reset old to 0.
154 * If old is reset, new simply re-uses old's memory. Otherwise, the memory is
155 * newly allocated and new points to the new memory areas.
158 CopyKeyInfo(KeyInfo * old, KeyInfo * new, bool clearOld)
163 new->defs.next = NULL;
166 for (i = 0; i < XkbNumKbdGroups; i++)
168 old->numLevels[i] = 0;
169 old->symsMapIndex[i] = NULL;
170 old->symsMapNumEntries[i] = NULL;
172 old->sizeSyms[i] = 0;
179 for (i = 0; i < XkbNumKbdGroups; i++)
181 width = new->numLevels[i];
182 if (old->syms[i] != NULL)
184 new->syms[i] = uTypedCalloc(new->sizeSyms[i], xkb_keysym_t);
188 new->sizeSyms[i] = 0;
189 new->numLevels[i] = 0;
193 memcpy(new->syms[i], old->syms[i],
194 new->sizeSyms[i] * sizeof(xkb_keysym_t));
195 new->symsMapIndex[i] = uTypedCalloc(width, int);
196 if (!new->symsMapIndex[i])
200 new->sizeSyms[i] = 0;
201 new->numLevels[i] = 0;
205 memcpy(new->symsMapIndex[i], old->symsMapIndex[i],
206 width * sizeof(int));
207 new->symsMapNumEntries[i] = uTypedCalloc(width, unsigned int);
208 if (!new->symsMapNumEntries[i])
212 new->sizeSyms[i] = 0;
213 free(new->symsMapIndex[i]);
214 new->symsMapIndex[i] = NULL;
215 new->numLevels[i] = 0;
219 memcpy(new->symsMapNumEntries[i], old->symsMapNumEntries[i],
220 width * sizeof(unsigned int));
222 if (old->acts[i] != NULL)
224 new->acts[i] = uTypedCalloc(width, union xkb_action);
229 new->sizeSyms[i] = 0;
230 free(new->symsMapIndex[i]);
231 new->symsMapIndex[i] = NULL;
232 free(new->symsMapNumEntries[i]);
233 new->symsMapNumEntries[i] = NULL;
234 new->numLevels[i] = 0;
237 memcpy(new->acts[i], old->acts[i],
238 width * sizeof(union xkb_action));
245 /***====================================================================***/
247 typedef struct _ModMapEntry
254 unsigned long keyName;
259 #define SYMBOLS_INIT_SIZE 110
260 #define SYMBOLS_CHUNK 20
261 typedef struct _SymbolsInfo
263 char *name; /* e.g. pc+us+inet(evdev) */
267 unsigned explicit_group;
275 xkb_atom_t groupNames[XkbNumKbdGroups];
282 InitSymbolsInfo(SymbolsInfo * info, struct xkb_keymap *keymap)
287 info->explicit_group = 0;
288 info->errorCount = 0;
290 info->merge = MergeOverride;
292 info->szKeys = SYMBOLS_INIT_SIZE;
294 info->keys = uTypedCalloc(SYMBOLS_INIT_SIZE, KeyInfo);
296 for (i = 0; i < XkbNumKbdGroups; i++)
297 info->groupNames[i] = XKB_ATOM_NONE;
298 InitKeyInfo(&info->dflt);
299 InitVModInfo(&info->vmods, keymap);
301 info->aliases = NULL;
305 FreeSymbolsInfo(SymbolsInfo * info)
312 for (i = 0; i < info->nKeys; i++)
313 FreeKeyInfo(&info->keys[i]);
317 ClearCommonInfo(&info->modMap->defs);
319 ClearAliases(&info->aliases);
320 memset(info, 0, sizeof(SymbolsInfo));
324 ResizeKeyGroup(KeyInfo * key, unsigned int group, unsigned int numLevels,
325 unsigned sizeSyms, bool forceActions)
329 if (key->syms[group] == NULL || key->sizeSyms[group] < sizeSyms)
331 key->syms[group] = uTypedRecalloc(key->syms[group],
332 key->sizeSyms[group],
335 if (!key->syms[group]) {
336 key->sizeSyms[group] = 0;
339 key->sizeSyms[group] = sizeSyms;
341 if (!key->symsMapIndex[group] || key->numLevels[group] < numLevels)
343 key->symsMapIndex[group] = uTypedRealloc(key->symsMapIndex[group],
346 if (!key->symsMapIndex[group])
348 for (i = key->numLevels[group]; i < numLevels; i++)
349 key->symsMapIndex[group][i] = -1;
351 if (!key->symsMapNumEntries[group] || key->numLevels[group] < numLevels)
353 key->symsMapNumEntries[group] =
354 uTypedRecalloc(key->symsMapNumEntries[group],
355 key->numLevels[group],
358 if (!key->symsMapNumEntries[group])
362 (key->numLevels[group] < numLevels || (key->acts[group] == NULL))) ||
363 (key->numLevels[group] < numLevels && (key->acts[group] != NULL)))
365 key->acts[group] = uTypedRecalloc(key->acts[group],
366 key->numLevels[group],
369 if (!key->acts[group])
372 if (key->numLevels[group] < numLevels)
373 key->numLevels[group] = numLevels;
378 MergeKeyGroups(SymbolsInfo * info,
379 KeyInfo * into, KeyInfo * from, unsigned group)
381 xkb_keysym_t *resultSyms = NULL;
382 union xkb_action *resultActs;
383 unsigned int resultWidth;
384 unsigned int resultSize = 0;
387 bool report, clobber;
389 clobber = (from->defs.merge != MergeAugment);
390 report = (warningLevel > 9) ||
391 ((into->defs.fileID == from->defs.fileID) && (warningLevel > 0));
392 if (into->numLevels[group] >= from->numLevels[group])
394 resultActs = into->acts[group];
395 resultWidth = into->numLevels[group];
399 resultActs = from->acts[group];
400 resultWidth = from->numLevels[group];
401 into->symsMapIndex[group] = uTypedRealloc(into->symsMapIndex[group],
402 from->numLevels[group],
404 into->symsMapNumEntries[group] =
405 uTypedRecalloc(into->symsMapNumEntries[group],
406 into->numLevels[group],
407 from->numLevels[group],
409 if (!into->symsMapIndex[group] || !into->symsMapNumEntries[group])
411 WSGO("Could not allocate level indices for key info merge\n");
412 ACTION("Group %d of key %s not merged\n", group,
413 longText(into->name));
417 for (i = into->numLevels[group]; i < from->numLevels[group]; i++)
418 into->symsMapIndex[group][i] = -1;
421 if ((resultActs == NULL) && (into->acts[group] || from->acts[group]))
423 resultActs = uTypedCalloc(resultWidth, union xkb_action);
426 WSGO("Could not allocate actions for group merge\n");
427 ACTION("Group %d of key %s not merged\n", group,
428 longText(into->name));
431 for (i = 0; i < resultWidth; i++)
433 union xkb_action *fromAct, *toAct;
434 fromAct = (from->acts[group] ? &from->acts[group][i] : NULL);
435 toAct = (into->acts[group] ? &into->acts[group][i] : NULL);
436 if (((fromAct == NULL) || (fromAct->type == XkbSA_NoAction))
439 resultActs[i] = *toAct;
441 else if (((toAct == NULL) || (toAct->type == XkbSA_NoAction))
442 && (fromAct != NULL))
444 resultActs[i] = *fromAct;
448 union xkb_action *use, *ignore;
462 ("Multiple actions for level %d/group %d on key %s\n",
463 i + 1, group + 1, longText(into->name));
464 ACTION("Using %s, ignoring %s\n",
465 XkbcActionTypeText(use->type),
466 XkbcActionTypeText(ignore->type));
469 resultActs[i] = *use;
474 for (i = 0; i < resultWidth; i++)
476 unsigned int fromSize = 0;
479 if (from->symsMapNumEntries[group] && (i < from->numLevels[group]))
480 fromSize = from->symsMapNumEntries[group][i];
481 if (into->symsMapNumEntries[group] && (i < into->numLevels[group]))
482 toSize = into->symsMapNumEntries[group][i];
484 if (fromSize == 0 || fromSize == toSize || clobber)
488 else if (toSize == 0)
490 resultSize += fromSize;
497 resultSyms = uTypedCalloc(resultSize, xkb_keysym_t);
500 WSGO("Could not allocate symbols for group merge\n");
501 ACTION("Group %d of key %s not merged\n", group, longText(into->name));
505 for (i = 0; i < resultWidth; i++)
507 enum { NONE, FROM, TO } use;
508 unsigned int fromSize = 0;
509 unsigned int toSize = 0;
511 if (from->symsMapNumEntries[group] && (i < from->numLevels[group]))
512 fromSize = from->symsMapNumEntries[group][i];
513 if (into->symsMapNumEntries[group] && (i < into->numLevels[group]))
514 toSize = into->symsMapNumEntries[group][i];
516 if (!fromSize && !toSize)
518 into->symsMapIndex[group][i] = -1;
519 into->symsMapNumEntries[group][i] = 0;
523 if ((fromSize && !toSize) || clobber)
528 if (toSize && fromSize && report)
530 INFO("Multiple symbols for group %d, level %d on key %s\n",
531 group + 1, i + 1, longText(into->name));
532 ACTION("Using %s, ignoring %s\n",
533 (use == FROM ? "from" : "to"),
534 (use == FROM ? "to" : "from"));
539 memcpy(&resultSyms[cur_idx],
540 &from->syms[group][from->symsMapIndex[group][i]],
541 from->symsMapNumEntries[group][i] * sizeof(xkb_keysym_t));
542 into->symsMapIndex[group][i] = cur_idx;
543 into->symsMapNumEntries[group][i] =
544 from->symsMapNumEntries[group][i];
548 memcpy(&resultSyms[cur_idx],
549 &into->syms[group][from->symsMapIndex[group][i]],
550 into->symsMapNumEntries[group][i] * sizeof(xkb_keysym_t));
551 into->symsMapIndex[group][i] = cur_idx;
553 cur_idx += into->symsMapNumEntries[group][i];
557 if (resultActs != into->acts[group])
558 free(into->acts[group]);
559 if (resultActs != from->acts[group])
560 free(from->acts[group]);
561 into->numLevels[group] = resultWidth;
562 free(into->syms[group]);
563 into->syms[group] = resultSyms;
564 free(from->syms[group]);
565 from->syms[group] = NULL;
566 from->sizeSyms[group] = 0;
567 into->sizeSyms[group] = resultSize;
568 free(from->symsMapIndex[group]);
569 from->symsMapIndex[group] = NULL;
570 free(from->symsMapNumEntries[group]);
571 from->symsMapNumEntries[group] = NULL;
572 into->acts[group] = resultActs;
573 from->acts[group] = NULL;
574 into->symsDefined |= (1 << group);
575 from->symsDefined &= ~(1 << group);
576 into->actsDefined |= (1 << group);
577 from->actsDefined &= ~(1 << group);
583 MergeKeys(SymbolsInfo *info, struct xkb_keymap *keymap,
584 KeyInfo *into, KeyInfo *from)
587 unsigned collide = 0;
590 if (from->defs.merge == MergeReplace)
592 for (i = 0; i < XkbNumKbdGroups; i++)
594 if (into->numLevels[i] != 0)
601 memset(from, 0, sizeof(KeyInfo));
604 report = ((warningLevel > 9) ||
605 ((into->defs.fileID == from->defs.fileID)
606 && (warningLevel > 0)));
607 for (i = 0; i < XkbNumKbdGroups; i++)
609 if (from->numLevels[i] > 0)
611 if (into->numLevels[i] == 0)
613 into->numLevels[i] = from->numLevels[i];
614 into->syms[i] = from->syms[i];
615 into->sizeSyms[i] = from->sizeSyms[i];
616 into->symsMapIndex[i] = from->symsMapIndex[i];
617 into->symsMapNumEntries[i] = from->symsMapNumEntries[i];
618 into->acts[i] = from->acts[i];
619 into->symsDefined |= (1 << i);
620 from->syms[i] = NULL;
621 from->sizeSyms[i] = 0;
622 from->symsMapIndex[i] = NULL;
623 from->symsMapNumEntries[i] = NULL;
624 from->acts[i] = NULL;
625 from->numLevels[i] = 0;
626 from->symsDefined &= ~(1 << i);
628 into->defs.defined |= _Key_Syms;
630 into->defs.defined |= _Key_Acts;
637 collide |= _Key_Syms;
639 collide |= _Key_Acts;
641 MergeKeyGroups(info, into, from, (unsigned) i);
644 if (from->types[i] != XKB_ATOM_NONE)
646 if ((into->types[i] != XKB_ATOM_NONE) && report &&
647 (into->types[i] != from->types[i]))
649 xkb_atom_t use, ignore;
650 collide |= _Key_Types;
651 if (from->defs.merge != MergeAugment)
653 use = from->types[i];
654 ignore = into->types[i];
658 use = into->types[i];
659 ignore = from->types[i];
662 ("Multiple definitions for group %d type of key %s\n",
663 i, longText(into->name));
664 ACTION("Using %s, ignoring %s\n",
665 xkb_atom_text(keymap->ctx, use),
666 xkb_atom_text(keymap->ctx, ignore));
668 if ((from->defs.merge != MergeAugment)
669 || (into->types[i] == XKB_ATOM_NONE))
671 into->types[i] = from->types[i];
675 if (UseNewField(_Key_Behavior, &into->defs, &from->defs, &collide))
677 into->behavior = from->behavior;
678 into->defs.defined |= _Key_Behavior;
680 if (UseNewField(_Key_VModMap, &into->defs, &from->defs, &collide))
682 into->vmodmap = from->vmodmap;
683 into->defs.defined |= _Key_VModMap;
685 if (UseNewField(_Key_Repeat, &into->defs, &from->defs, &collide))
687 into->repeat = from->repeat;
688 into->defs.defined |= _Key_Repeat;
690 if (UseNewField(_Key_Type_Dflt, &into->defs, &from->defs, &collide))
692 into->dfltType = from->dfltType;
693 into->defs.defined |= _Key_Type_Dflt;
695 if (UseNewField(_Key_GroupInfo, &into->defs, &from->defs, &collide))
697 into->groupInfo = from->groupInfo;
698 into->defs.defined |= _Key_GroupInfo;
702 WARN("Symbol map for key %s redefined\n",
703 longText(into->name));
704 ACTION("Using %s definition for conflicting fields\n",
705 (from->defs.merge == MergeAugment ? "first" : "last"));
711 AddKeySymbols(SymbolsInfo *info, KeyInfo *key, struct xkb_keymap *keymap)
714 unsigned long real_name;
716 for (i = 0; i < info->nKeys; i++)
718 if (info->keys[i].name == key->name)
719 return MergeKeys(info, keymap, &info->keys[i], key);
721 if (FindKeyNameForAlias(keymap, key->name, &real_name))
723 for (i = 0; i < info->nKeys; i++)
725 if (info->keys[i].name == real_name)
726 return MergeKeys(info, keymap, &info->keys[i], key);
729 if (info->nKeys >= info->szKeys)
731 info->szKeys += SYMBOLS_CHUNK;
733 uTypedRecalloc(info->keys, info->nKeys, info->szKeys, KeyInfo);
736 WSGO("Could not allocate key symbols descriptions\n");
737 ACTION("Some key symbols definitions may be lost\n");
741 return CopyKeyInfo(key, &info->keys[info->nKeys++], true);
745 AddModMapEntry(SymbolsInfo * info, ModMapEntry * new)
750 clobber = (new->defs.merge != MergeAugment);
751 for (mm = info->modMap; mm != NULL; mm = (ModMapEntry *) mm->defs.next)
753 if (new->haveSymbol && mm->haveSymbol
754 && (new->u.keySym == mm->u.keySym))
756 unsigned use, ignore;
757 if (mm->modifier != new->modifier)
762 ignore = mm->modifier;
767 ignore = new->modifier;
770 ("%s added to symbol map for multiple modifiers\n",
771 XkbcKeysymText(new->u.keySym));
772 ACTION("Using %s, ignoring %s.\n",
773 XkbcModIndexText(use),
774 XkbcModIndexText(ignore));
779 if ((!new->haveSymbol) && (!mm->haveSymbol) &&
780 (new->u.keyName == mm->u.keyName))
782 unsigned use, ignore;
783 if (mm->modifier != new->modifier)
788 ignore = mm->modifier;
793 ignore = new->modifier;
795 ERROR("Key %s added to map for multiple modifiers\n",
796 longText(new->u.keyName));
797 ACTION("Using %s, ignoring %s.\n",
798 XkbcModIndexText(use),
799 XkbcModIndexText(ignore));
805 mm = uTypedAlloc(ModMapEntry);
808 WSGO("Could not allocate modifier map entry\n");
809 ACTION("Modifier map for %s will be incomplete\n",
810 XkbcModIndexText(new->modifier));
814 mm->defs.next = &info->modMap->defs;
819 /***====================================================================***/
822 MergeIncludedSymbols(SymbolsInfo *into, SymbolsInfo *from,
823 unsigned merge, struct xkb_keymap *keymap)
828 if (from->errorCount > 0)
830 into->errorCount += from->errorCount;
833 if (into->name == NULL)
835 into->name = from->name;
838 for (i = 0; i < XkbNumKbdGroups; i++)
840 if (from->groupNames[i] != XKB_ATOM_NONE)
842 if ((merge != MergeAugment) ||
843 (into->groupNames[i] == XKB_ATOM_NONE))
844 into->groupNames[i] = from->groupNames[i];
847 for (i = 0, key = from->keys; i < from->nKeys; i++, key++)
849 if (merge != MergeDefault)
850 key->defs.merge = merge;
851 if (!AddKeySymbols(into, key, keymap))
854 if (from->modMap != NULL)
856 ModMapEntry *mm, *next;
857 for (mm = from->modMap; mm != NULL; mm = next)
859 if (merge != MergeDefault)
860 mm->defs.merge = merge;
861 if (!AddModMapEntry(into, mm))
863 next = (ModMapEntry *) mm->defs.next;
868 if (!MergeAliases(&into->aliases, &from->aliases, merge))
873 HandleSymbolsFile(XkbFile *file, struct xkb_keymap *keymap,
874 unsigned merge, SymbolsInfo *info);
877 HandleIncludeSymbols(IncludeStmt *stmt, struct xkb_keymap *keymap,
882 SymbolsInfo included;
886 if ((stmt->file == NULL) && (stmt->map == NULL))
890 memset(info, 0, sizeof(SymbolsInfo));
892 else if (ProcessIncludeFile(keymap->ctx, stmt, XkmSymbolsIndex, &rtrn,
895 InitSymbolsInfo(&included, keymap);
896 included.fileID = included.dflt.defs.fileID = rtrn->id;
897 included.merge = included.dflt.defs.merge = MergeOverride;
900 included.explicit_group = atoi(stmt->modifier) - 1;
904 included.explicit_group = info->explicit_group;
906 HandleSymbolsFile(rtrn, keymap, MergeOverride, &included);
907 if (stmt->stmt != NULL)
910 included.name = stmt->stmt;
917 info->errorCount += 10;
920 if ((stmt->next != NULL) && (included.errorCount < 1))
924 SymbolsInfo next_incl;
926 for (next = stmt->next; next != NULL; next = next->next)
928 if ((next->file == NULL) && (next->map == NULL))
931 MergeIncludedSymbols(&included, info, next->merge, keymap);
932 FreeSymbolsInfo(info);
934 else if (ProcessIncludeFile(keymap->ctx, next, XkmSymbolsIndex,
937 InitSymbolsInfo(&next_incl, keymap);
938 next_incl.fileID = next_incl.dflt.defs.fileID = rtrn->id;
939 next_incl.merge = next_incl.dflt.defs.merge = MergeOverride;
942 next_incl.explicit_group = atoi(next->modifier) - 1;
946 next_incl.explicit_group = info->explicit_group;
948 HandleSymbolsFile(rtrn, keymap, MergeOverride, &next_incl);
949 MergeIncludedSymbols(&included, &next_incl, op, keymap);
950 FreeSymbolsInfo(&next_incl);
955 info->errorCount += 10;
956 FreeSymbolsInfo(&included);
963 info->errorCount += included.errorCount;
969 MergeIncludedSymbols(info, &included, newMerge, keymap);
970 FreeSymbolsInfo(&included);
972 return (info->errorCount == 0);
979 GetGroupIndex(KeyInfo *key, struct xkb_keymap *keymap,
980 ExprDef * arrayNdx, unsigned what, unsigned *ndx_rtrn)
990 if (arrayNdx == NULL)
995 defined = key->symsDefined;
997 defined = key->actsDefined;
999 for (i = 0; i < XkbNumKbdGroups; i++)
1001 if ((defined & (1 << i)) == 0)
1007 ERROR("Too many groups of %s for key %s (max %d)\n", name,
1008 longText(key->name), XkbNumKbdGroups + 1);
1009 ACTION("Ignoring %s defined for extra groups\n", name);
1012 if (!ExprResolveGroup(keymap->ctx, arrayNdx, &tmp))
1014 ERROR("Illegal group index for %s of key %s\n", name,
1015 longText(key->name));
1016 ACTION("Definition with non-integer array index ignored\n");
1019 *ndx_rtrn = tmp.uval - 1;
1024 AddSymbolsToKey(KeyInfo *key, struct xkb_keymap *keymap,
1025 ExprDef *arrayNdx, ExprDef *value, SymbolsInfo *info)
1027 unsigned ndx, nSyms, nLevels;
1031 if (!GetGroupIndex(key, keymap, arrayNdx, SYMBOLS, &ndx))
1035 key->symsDefined |= (1 << ndx);
1038 if (value->op != ExprKeysymList)
1040 ERROR("Expected a list of symbols, found %s\n", exprOpText(value->op));
1041 ACTION("Ignoring symbols for group %d of %s\n", ndx + 1,
1042 longText(key->name));
1045 if (key->sizeSyms[ndx] != 0)
1047 ERROR("Symbols for key %s, group %d already defined\n",
1048 longText(key->name), ndx + 1);
1049 ACTION("Ignoring duplicate definition\n");
1052 nSyms = darray_size(value->value.list.syms);
1053 nLevels = darray_size(value->value.list.symsMapIndex);
1054 if (((key->numLevels[ndx] < nSyms) || (key->syms[ndx] == NULL)) &&
1055 (!ResizeKeyGroup(key, ndx, nLevels, nSyms, false)))
1057 WSGO("Could not resize group %d of key %s to contain %d levels\n",
1058 ndx + 1, longText(key->name), nSyms);
1059 ACTION("Symbols lost\n");
1062 key->symsDefined |= (1 << ndx);
1063 for (i = 0; i < nLevels; i++) {
1064 key->symsMapIndex[ndx][i] =
1065 darray_item(value->value.list.symsMapIndex, i);
1066 key->symsMapNumEntries[ndx][i] =
1067 darray_item(value->value.list.symsNumEntries, i);
1069 for (j = 0; j < key->symsMapNumEntries[ndx][i]; j++) {
1070 if (key->symsMapIndex[ndx][i] + j >= nSyms)
1072 if (!LookupKeysym(darray_item(value->value.list.syms,
1073 darray_item(value->value.list.symsMapIndex, i) + j),
1074 &key->syms[ndx][key->symsMapIndex[ndx][i] + j])) {
1075 WARN("Could not resolve keysym %s for key %s, group %d (%s), level %d\n",
1076 darray_item(value->value.list.syms, i),
1077 longText(key->name),
1079 xkb_atom_text(keymap->ctx, info->groupNames[ndx]), nSyms);
1081 key->syms[ndx][key->symsMapIndex[ndx][i] + j] = XKB_KEY_NoSymbol;
1082 key->symsMapIndex[ndx][i] = -1;
1083 key->symsMapNumEntries[ndx][i] = 0;
1088 for (j = key->numLevels[ndx] - 1;
1089 j >= 0 && key->symsMapNumEntries[ndx][j] == 0; j--)
1090 key->numLevels[ndx]--;
1095 AddActionsToKey(KeyInfo *key, struct xkb_keymap *keymap, ExprDef *arrayNdx,
1096 ExprDef *value, SymbolsInfo *info)
1099 unsigned ndx, nActs;
1101 struct xkb_any_action *toAct;
1103 if (!GetGroupIndex(key, keymap, arrayNdx, ACTIONS, &ndx))
1108 key->actsDefined |= (1 << ndx);
1111 if (value->op != ExprActionList)
1113 WSGO("Bad expression type (%d) for action list value\n", value->op);
1114 ACTION("Ignoring actions for group %d of %s\n", ndx,
1115 longText(key->name));
1118 if (key->acts[ndx] != NULL)
1120 WSGO("Actions for key %s, group %d already defined\n",
1121 longText(key->name), ndx);
1124 for (nActs = 0, act = value->value.child; act != NULL; nActs++)
1126 act = (ExprDef *) act->common.next;
1130 WSGO("Action list but not actions in AddActionsToKey\n");
1133 if (((key->numLevels[ndx] < nActs) || (key->acts[ndx] == NULL)) &&
1134 (!ResizeKeyGroup(key, ndx, nActs, nActs, true)))
1136 WSGO("Could not resize group %d of key %s\n", ndx,
1137 longText(key->name));
1138 ACTION("Actions lost\n");
1141 key->actsDefined |= (1 << ndx);
1143 toAct = (struct xkb_any_action *) key->acts[ndx];
1144 act = value->value.child;
1145 for (i = 0; i < nActs; i++, toAct++)
1147 if (!HandleActionDef(act, keymap, toAct, info->action))
1149 ERROR("Illegal action definition for %s\n",
1150 longText(key->name));
1151 ACTION("Action for group %d/level %d ignored\n", ndx + 1, i + 1);
1153 act = (ExprDef *) act->common.next;
1158 static const LookupEntry lockingEntries[] = {
1159 {"true", XkbKB_Lock},
1160 {"yes", XkbKB_Lock},
1162 {"false", XkbKB_Default},
1163 {"no", XkbKB_Default},
1164 {"off", XkbKB_Default},
1165 {"permanent", XkbKB_Lock | XkbKB_Permanent},
1169 static const LookupEntry repeatEntries[] = {
1170 {"true", RepeatYes},
1173 {"false", RepeatNo},
1176 {"default", RepeatUndefined},
1181 SetSymbolsField(KeyInfo *key, struct xkb_keymap *keymap, char *field,
1182 ExprDef *arrayNdx, ExprDef *value, SymbolsInfo *info)
1187 if (strcasecmp(field, "type") == 0)
1190 if ((!ExprResolveString(keymap->ctx, value, &tmp))
1191 && (warningLevel > 0))
1193 WARN("The type field of a key symbol map must be a string\n");
1194 ACTION("Ignoring illegal type definition\n");
1196 if (arrayNdx == NULL)
1198 key->dfltType = xkb_atom_intern(keymap->ctx, tmp.str);
1199 key->defs.defined |= _Key_Type_Dflt;
1201 else if (!ExprResolveGroup(keymap->ctx, arrayNdx, &ndx))
1203 ERROR("Illegal group index for type of key %s\n",
1204 longText(key->name));
1205 ACTION("Definition with non-integer array index ignored\n");
1211 key->types[ndx.uval - 1] = xkb_atom_intern(keymap->ctx, tmp.str);
1212 key->typesDefined |= (1 << (ndx.uval - 1));
1216 else if (strcasecmp(field, "symbols") == 0)
1217 return AddSymbolsToKey(key, keymap, arrayNdx, value, info);
1218 else if (strcasecmp(field, "actions") == 0)
1219 return AddActionsToKey(key, keymap, arrayNdx, value, info);
1220 else if ((strcasecmp(field, "vmods") == 0) ||
1221 (strcasecmp(field, "virtualmods") == 0) ||
1222 (strcasecmp(field, "virtualmodifiers") == 0))
1224 ok = ExprResolveVModMask(value, &tmp, keymap);
1227 key->vmodmap = (tmp.uval >> 8);
1228 key->defs.defined |= _Key_VModMap;
1232 ERROR("Expected a virtual modifier mask, found %s\n",
1233 exprOpText(value->op));
1234 ACTION("Ignoring virtual modifiers definition for key %s\n",
1235 longText(key->name));
1238 else if ((strcasecmp(field, "locking") == 0) ||
1239 (strcasecmp(field, "lock") == 0) ||
1240 (strcasecmp(field, "locks") == 0))
1242 ok = ExprResolveEnum(keymap->ctx, value, &tmp, lockingEntries);
1244 key->behavior.type = tmp.uval;
1245 key->defs.defined |= _Key_Behavior;
1247 else if ((strcasecmp(field, "radiogroup") == 0) ||
1248 (strcasecmp(field, "permanentradiogroup") == 0) ||
1249 (strcasecmp(field, "allownone") == 0))
1251 ERROR("Radio groups not supported\n");
1252 ACTION("Ignoring radio group specification for key %s\n", longText(key->name));
1255 else if (uStrCasePrefix("overlay", field) ||
1256 uStrCasePrefix("permanentoverlay", field))
1258 ERROR("Overlays not supported\n");
1259 ACTION("Ignoring overlay specification for key %s\n", longText(key->name));
1261 else if ((strcasecmp(field, "repeating") == 0) ||
1262 (strcasecmp(field, "repeats") == 0) ||
1263 (strcasecmp(field, "repeat") == 0))
1265 ok = ExprResolveEnum(keymap->ctx, value, &tmp, repeatEntries);
1268 ERROR("Illegal repeat setting for %s\n",
1269 longText(key->name));
1270 ACTION("Non-boolean repeat setting ignored\n");
1273 key->repeat = tmp.uval;
1274 key->defs.defined |= _Key_Repeat;
1276 else if ((strcasecmp(field, "groupswrap") == 0) ||
1277 (strcasecmp(field, "wrapgroups") == 0))
1279 ok = ExprResolveBoolean(keymap->ctx, value, &tmp);
1282 ERROR("Illegal groupsWrap setting for %s\n",
1283 longText(key->name));
1284 ACTION("Non-boolean value ignored\n");
1288 key->groupInfo = XkbWrapIntoRange;
1290 key->groupInfo = XkbClampIntoRange;
1291 key->defs.defined |= _Key_GroupInfo;
1293 else if ((strcasecmp(field, "groupsclamp") == 0) ||
1294 (strcasecmp(field, "clampgroups") == 0))
1296 ok = ExprResolveBoolean(keymap->ctx, value, &tmp);
1299 ERROR("Illegal groupsClamp setting for %s\n",
1300 longText(key->name));
1301 ACTION("Non-boolean value ignored\n");
1305 key->groupInfo = XkbClampIntoRange;
1307 key->groupInfo = XkbWrapIntoRange;
1308 key->defs.defined |= _Key_GroupInfo;
1310 else if ((strcasecmp(field, "groupsredirect") == 0) ||
1311 (strcasecmp(field, "redirectgroups") == 0))
1313 if (!ExprResolveGroup(keymap->ctx, value, &tmp))
1315 ERROR("Illegal group index for redirect of key %s\n",
1316 longText(key->name));
1317 ACTION("Definition with non-integer group ignored\n");
1321 XkbSetGroupInfo(0, XkbRedirectIntoRange, tmp.uval - 1);
1322 key->defs.defined |= _Key_GroupInfo;
1326 ERROR("Unknown field %s in a symbol interpretation\n", field);
1327 ACTION("Definition ignored\n");
1334 SetGroupName(SymbolsInfo *info, struct xkb_keymap *keymap, ExprDef *arrayNdx,
1337 ExprResult tmp, name;
1339 if ((arrayNdx == NULL) && (warningLevel > 0))
1341 WARN("You must specify an index when specifying a group name\n");
1342 ACTION("Group name definition without array subscript ignored\n");
1345 if (!ExprResolveGroup(keymap->ctx, arrayNdx, &tmp))
1347 ERROR("Illegal index in group name definition\n");
1348 ACTION("Definition with non-integer array index ignored\n");
1351 if (!ExprResolveString(keymap->ctx, value, &name))
1353 ERROR("Group name must be a string\n");
1354 ACTION("Illegal name for group %d ignored\n", tmp.uval);
1357 info->groupNames[tmp.uval - 1 + info->explicit_group] =
1358 xkb_atom_intern(keymap->ctx, name.str);
1365 HandleSymbolsVar(VarDef *stmt, struct xkb_keymap *keymap, SymbolsInfo *info)
1367 ExprResult elem, field, tmp;
1371 if (ExprResolveLhs(keymap, stmt->name, &elem, &field, &arrayNdx) == 0)
1372 return 0; /* internal error, already reported */
1373 if (elem.str && (strcasecmp(elem.str, "key") == 0))
1375 ret = SetSymbolsField(&info->dflt, keymap, field.str, arrayNdx,
1378 else if ((elem.str == NULL) && ((strcasecmp(field.str, "name") == 0) ||
1379 (strcasecmp(field.str, "groupname") ==
1382 ret = SetGroupName(info, keymap, arrayNdx, stmt->value);
1384 else if ((elem.str == NULL)
1385 && ((strcasecmp(field.str, "groupswrap") == 0) ||
1386 (strcasecmp(field.str, "wrapgroups") == 0)))
1388 if (!ExprResolveBoolean(keymap->ctx, stmt->value, &tmp))
1390 ERROR("Illegal setting for global groupsWrap\n");
1391 ACTION("Non-boolean value ignored\n");
1396 info->groupInfo = XkbWrapIntoRange;
1398 info->groupInfo = XkbClampIntoRange;
1402 else if ((elem.str == NULL)
1403 && ((strcasecmp(field.str, "groupsclamp") == 0) ||
1404 (strcasecmp(field.str, "clampgroups") == 0)))
1406 if (!ExprResolveBoolean(keymap->ctx, stmt->value, &tmp))
1408 ERROR("Illegal setting for global groupsClamp\n");
1409 ACTION("Non-boolean value ignored\n");
1414 info->groupInfo = XkbClampIntoRange;
1416 info->groupInfo = XkbWrapIntoRange;
1420 else if ((elem.str == NULL)
1421 && ((strcasecmp(field.str, "groupsredirect") == 0) ||
1422 (strcasecmp(field.str, "redirectgroups") == 0)))
1424 if (!ExprResolveGroup(keymap->ctx, stmt->value, &tmp))
1426 ERROR("Illegal group index for global groupsRedirect\n");
1427 ACTION("Definition with non-integer group ignored\n");
1431 info->groupInfo = XkbSetGroupInfo(0, XkbRedirectIntoRange,
1436 else if ((elem.str == NULL) && (strcasecmp(field.str, "allownone") == 0))
1438 ERROR("Radio groups not supported\n");
1439 ACTION("Ignoring \"allow none\" specification\n");
1443 ret = SetActionField(keymap, elem.str, field.str, arrayNdx,
1444 stmt->value, &info->action);
1453 HandleSymbolsBody(VarDef *def, struct xkb_keymap *keymap, KeyInfo *key,
1457 ExprResult tmp, field;
1460 for (; def != NULL; def = (VarDef *) def->common.next)
1462 if ((def->name) && (def->name->type == ExprFieldRef))
1464 ok = HandleSymbolsVar(def, keymap, info);
1469 if (def->name == NULL)
1471 if ((def->value == NULL)
1472 || (def->value->op == ExprKeysymList))
1473 field.str = strdup("symbols");
1475 field.str = strdup("actions");
1480 ok = ExprResolveLhs(keymap, def->name, &tmp, &field,
1484 ok = SetSymbolsField(key, keymap, field.str, arrayNdx,
1493 SetExplicitGroup(SymbolsInfo *info, KeyInfo *key)
1495 unsigned group = info->explicit_group;
1500 if ((key->typesDefined | key->symsDefined | key->actsDefined) & ~1)
1503 WARN("For the map %s an explicit group specified\n", info->name);
1504 WARN("but key %s has more than one group defined\n",
1505 longText(key->name));
1506 ACTION("All groups except first one will be ignored\n");
1507 for (i = 1; i < XkbNumKbdGroups; i++)
1509 key->numLevels[i] = 0;
1511 key->syms[i] = NULL;
1513 key->acts[i] = NULL;
1517 key->typesDefined = key->symsDefined = key->actsDefined = 1 << group;
1519 key->numLevels[group] = key->numLevels[0];
1520 key->numLevels[0] = 0;
1521 key->syms[group] = key->syms[0];
1522 key->syms[0] = NULL;
1523 key->sizeSyms[group] = key->sizeSyms[0];
1524 key->sizeSyms[0] = 0;
1525 key->symsMapIndex[group] = key->symsMapIndex[0];
1526 key->symsMapIndex[0] = NULL;
1527 key->symsMapNumEntries[group] = key->symsMapNumEntries[0];
1528 key->symsMapNumEntries[0] = NULL;
1529 key->acts[group] = key->acts[0];
1530 key->acts[0] = NULL;
1531 key->types[group] = key->types[0];
1537 HandleSymbolsDef(SymbolsDef *stmt, struct xkb_keymap *keymap,
1543 CopyKeyInfo(&info->dflt, &key, false);
1544 key.defs.merge = stmt->merge;
1545 key.name = KeyNameToLong(stmt->keyName);
1546 if (!HandleSymbolsBody((VarDef *) stmt->symbols, keymap, &key, info))
1552 if (!SetExplicitGroup(info, &key))
1558 if (!AddKeySymbols(info, &key, keymap))
1567 HandleModMapDef(ModMapDef *def, struct xkb_keymap *keymap, SymbolsInfo *info)
1574 if (!LookupModIndex(keymap->ctx, NULL, def->modifier, TypeInt, &rtrn))
1576 ERROR("Illegal modifier map definition\n");
1577 ACTION("Ignoring map for non-modifier \"%s\"\n",
1578 xkb_atom_text(keymap->ctx, def->modifier));
1582 tmp.modifier = rtrn.uval;
1583 for (key = def->keys; key != NULL; key = (ExprDef *) key->common.next)
1585 if ((key->op == ExprValue) && (key->type == TypeKeyName))
1587 tmp.haveSymbol = false;
1588 tmp.u.keyName = KeyNameToLong(key->value.keyName);
1590 else if (ExprResolveKeySym(keymap->ctx, key, &rtrn))
1592 tmp.haveSymbol = true;
1593 tmp.u.keySym = rtrn.uval;
1597 ERROR("Modmap entries may contain only key names or keysyms\n");
1598 ACTION("Illegal definition for %s modifier ignored\n",
1599 XkbcModIndexText(tmp.modifier));
1603 ok = AddModMapEntry(info, &tmp) && ok;
1609 HandleSymbolsFile(XkbFile *file, struct xkb_keymap *keymap,
1610 unsigned merge, SymbolsInfo *info)
1615 info->name = uDupString(file->name);
1619 switch (stmt->stmtType)
1622 if (!HandleIncludeSymbols((IncludeStmt *) stmt, keymap, info))
1625 case StmtSymbolsDef:
1626 if (!HandleSymbolsDef((SymbolsDef *) stmt, keymap, info))
1630 if (!HandleSymbolsVar((VarDef *) stmt, keymap, info))
1634 if (!HandleVModDef((VModDef *) stmt, keymap, merge, &info->vmods))
1638 ERROR("Interpretation files may not include other types\n");
1639 ACTION("Ignoring definition of symbol interpretation\n");
1642 case StmtKeycodeDef:
1643 ERROR("Interpretation files may not include other types\n");
1644 ACTION("Ignoring definition of key name\n");
1648 if (!HandleModMapDef((ModMapDef *) stmt, keymap, info))
1652 WSGO("Unexpected statement type %d in HandleSymbolsFile\n",
1657 if (info->errorCount > 10)
1660 ERROR("Too many errors\n");
1662 ACTION("Abandoning symbols file \"%s\"\n", file->topName);
1669 FindKeyForSymbol(struct xkb_keymap *keymap, xkb_keysym_t sym,
1670 xkb_keycode_t *kc_rtrn)
1673 unsigned int group, level;
1675 for (key = keymap->min_key_code; key <= keymap->max_key_code; key++)
1677 for (group = 0; group < XkbKeyNumGroups(keymap, key); group++)
1679 for (level = 0; level < XkbKeyGroupWidth(keymap, key, group);
1682 if (XkbKeyNumSyms(keymap, key, group, level) != 1 ||
1683 (XkbKeySymEntry(keymap, key, group, level))[0] != sym)
1695 * Find the given name in the keymap->map->types and return its index.
1697 * @param atom The atom to search for.
1698 * @param type_rtrn Set to the index of the name if found.
1700 * @return true if found, false otherwise.
1703 FindNamedType(struct xkb_keymap *keymap, xkb_atom_t atom, unsigned *type_rtrn)
1706 const char *name = xkb_atom_text(keymap->ctx, atom);
1707 struct xkb_key_type *type;
1709 if (keymap && keymap->map) {
1710 darray_foreach(type, keymap->map->types) {
1711 if (strcmp(type->name, name) == 0) {
1722 * Assign a type to the given sym and return the Atom for the type assigned.
1725 * - ONE_LEVEL for width 0/1
1726 * - ALPHABETIC for 2 shift levels, with lower/upercase
1727 * - KEYPAD for keypad keys.
1728 * - TWO_LEVEL for other 2 shift level keys.
1729 * and the same for four level keys.
1731 * @param width Number of sysms in syms.
1732 * @param syms The keysyms for the given key (must be size width).
1733 * @param typeNameRtrn Set to the Atom of the type name.
1735 * @returns true if a type could be found, false otherwise.
1738 FindAutomaticType(struct xkb_keymap *keymap, int width, xkb_keysym_t *syms,
1739 xkb_atom_t *typeNameRtrn, bool *autoType)
1742 if ((width == 1) || (width == 0))
1744 *typeNameRtrn = xkb_atom_intern(keymap->ctx, "ONE_LEVEL");
1747 else if (width == 2)
1749 if (syms && XkbcKSIsLower(syms[0]) && XkbcKSIsUpper(syms[1]))
1751 *typeNameRtrn = xkb_atom_intern(keymap->ctx, "ALPHABETIC");
1753 else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1])))
1755 *typeNameRtrn = xkb_atom_intern(keymap->ctx, "KEYPAD");
1760 *typeNameRtrn = xkb_atom_intern(keymap->ctx, "TWO_LEVEL");
1764 else if (width <= 4)
1766 if (syms && XkbcKSIsLower(syms[0]) && XkbcKSIsUpper(syms[1]))
1767 if (XkbcKSIsLower(syms[2]) && XkbcKSIsUpper(syms[3]))
1769 xkb_atom_intern(keymap->ctx, "FOUR_LEVEL_ALPHABETIC");
1771 *typeNameRtrn = xkb_atom_intern(keymap->ctx,
1772 "FOUR_LEVEL_SEMIALPHABETIC");
1774 else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1])))
1775 *typeNameRtrn = xkb_atom_intern(keymap->ctx, "FOUR_LEVEL_KEYPAD");
1777 *typeNameRtrn = xkb_atom_intern(keymap->ctx, "FOUR_LEVEL");
1778 /* XXX: why not set autoType here? */
1780 return ((width >= 0) && (width <= 4));
1784 * Ensure the given KeyInfo is in a coherent state, i.e. no gaps between the
1785 * groups, and reduce to one group if all groups are identical anyway.
1788 PrepareKeyDef(KeyInfo * key)
1790 int i, j, width, defined, lastGroup;
1793 defined = key->symsDefined | key->actsDefined | key->typesDefined;
1794 /* get highest group number */
1795 for (i = XkbNumKbdGroups - 1; i >= 0; i--)
1797 if (defined & (1 << i))
1805 /* If there are empty groups between non-empty ones fill them with data */
1806 /* from the first group. */
1807 /* We can make a wrong assumption here. But leaving gaps is worse. */
1808 for (i = lastGroup; i > 0; i--)
1810 if (defined & (1 << i))
1812 width = key->numLevels[0];
1813 if (key->typesDefined & 1)
1815 for (j = 0; j < width; j++)
1817 key->types[i] = key->types[0];
1819 key->typesDefined |= 1 << i;
1821 if ((key->actsDefined & 1) && key->acts[0])
1823 key->acts[i] = uTypedCalloc(width, union xkb_action);
1824 if (key->acts[i] == NULL)
1826 memcpy(key->acts[i], key->acts[0],
1827 width * sizeof(union xkb_action));
1828 key->actsDefined |= 1 << i;
1830 if ((key->symsDefined & 1) && key->sizeSyms[0])
1832 key->syms[i] = uTypedCalloc(key->sizeSyms[0], xkb_keysym_t);
1833 if (key->syms[i] == NULL)
1835 memcpy(key->syms[i], key->syms[0],
1836 key->sizeSyms[0] * sizeof(xkb_keysym_t));
1837 key->symsMapIndex[i] = uTypedCalloc(width, int);
1838 if (!key->symsMapIndex[i])
1841 key->syms[i] = NULL;
1844 memcpy(key->symsMapIndex[i], key->symsMapIndex[0],
1845 width * sizeof(int));
1846 key->symsMapNumEntries[i] = uTypedCalloc(width, unsigned int);
1847 if (!key->symsMapNumEntries[i])
1850 key->syms[i] = NULL;
1851 free(key->symsMapIndex[i]);
1852 key->symsMapIndex[i] = NULL;
1855 memcpy(key->symsMapNumEntries[i], key->symsMapNumEntries[0],
1856 width * sizeof(int));
1857 key->sizeSyms[i] = key->sizeSyms[0];
1858 key->symsDefined |= 1 << i;
1862 key->numLevels[i] = key->numLevels[0];
1865 /* If all groups are completely identical remove them all */
1866 /* exept the first one. */
1868 for (i = lastGroup; i > 0; i--)
1870 if ((key->numLevels[i] != key->numLevels[0]) ||
1871 (key->types[i] != key->types[0]))
1876 if ((key->syms[i] != key->syms[0]) &&
1877 (key->syms[i] == NULL || key->syms[0] == NULL ||
1878 key->sizeSyms[i] != key->sizeSyms[0] ||
1879 memcmp(key->syms[i], key->syms[0],
1880 sizeof(xkb_keysym_t) * key->sizeSyms[0])))
1885 if ((key->symsMapIndex[i] != key->symsMapIndex[i]) &&
1886 (key->symsMapIndex[i] == NULL || key->symsMapIndex[0] == NULL ||
1887 memcmp(key->symsMapIndex[i], key->symsMapIndex[0],
1888 key->numLevels[0] * sizeof(int))))
1893 if ((key->symsMapNumEntries[i] != key->symsMapNumEntries[i]) &&
1894 (key->symsMapNumEntries[i] == NULL ||
1895 key->symsMapNumEntries[0] == NULL ||
1896 memcmp(key->symsMapNumEntries[i], key->symsMapNumEntries[0],
1897 key->numLevels[0] * sizeof(int))))
1902 if ((key->acts[i] != key->acts[0]) &&
1903 (key->acts[i] == NULL || key->acts[0] == NULL ||
1904 memcmp(key->acts[i], key->acts[0],
1905 sizeof(union xkb_action) * key->numLevels[0])))
1913 for (i = lastGroup; i > 0; i--)
1915 key->numLevels[i] = 0;
1917 key->syms[i] = NULL;
1918 key->sizeSyms[i] = 0;
1919 free(key->symsMapIndex[i]);
1920 key->symsMapIndex[i] = NULL;
1921 free(key->symsMapNumEntries[i]);
1922 key->symsMapNumEntries[i] = NULL;
1924 key->acts[i] = NULL;
1927 key->symsDefined &= 1;
1928 key->actsDefined &= 1;
1929 key->typesDefined &= 1;
1934 * Copy the KeyInfo into the keyboard description.
1936 * This function recurses.
1939 CopySymbolsDef(struct xkb_keymap *keymap, KeyInfo *key, int start_from)
1943 unsigned int sizeSyms = 0;
1944 unsigned width, tmp, nGroups;
1945 struct xkb_key_type * type;
1946 bool haveActions, autoType, useAlias;
1947 unsigned types[XkbNumKbdGroups];
1948 union xkb_action *outActs;
1949 unsigned int symIndex = 0;
1951 useAlias = (start_from == 0);
1953 /* get the keycode for the key. */
1954 if (!FindNamedKey(keymap, key->name, &kc, useAlias,
1955 CreateKeyNames(keymap), start_from))
1957 if ((start_from == 0) && (warningLevel >= 5))
1959 WARN("Key %s not found in keycodes\n", longText(key->name));
1960 ACTION("Symbols ignored\n");
1965 haveActions = false;
1966 for (i = width = nGroups = 0; i < XkbNumKbdGroups; i++)
1968 if (((i + 1) > nGroups)
1969 && (((key->symsDefined | key->actsDefined) & (1 << i))
1970 || (key->typesDefined) & (1 << i)))
1975 /* Assign the type to the key, if it is missing. */
1976 if (key->types[i] == XKB_ATOM_NONE)
1978 if (key->dfltType != XKB_ATOM_NONE)
1979 key->types[i] = key->dfltType;
1980 else if (FindAutomaticType(keymap, key->numLevels[i], key->syms[i],
1981 &key->types[i], &autoType))
1986 if (warningLevel >= 5)
1988 WARN("No automatic type for %d symbols\n",
1989 (unsigned int) key->numLevels[i]);
1990 ACTION("Using %s for the %s key (keycode %d)\n",
1991 xkb_atom_text(keymap->ctx, key->types[i]),
1992 longText(key->name), kc);
1996 if (FindNamedType(keymap, key->types[i], &types[i]))
1998 if (!autoType || key->numLevels[i] > 2)
1999 keymap->server->explicit[kc] |= (1 << i);
2003 if (warningLevel >= 3)
2005 WARN("Type \"%s\" is not defined\n",
2006 xkb_atom_text(keymap->ctx, key->types[i]));
2007 ACTION("Using TWO_LEVEL for the %s key (keycode %d)\n",
2008 longText(key->name), kc);
2010 types[i] = XkbTwoLevelIndex;
2012 /* if the type specifies fewer levels than the key has, shrink the key */
2013 type = &darray_item(keymap->map->types, types[i]);
2014 if (type->num_levels < key->numLevels[i])
2016 if (warningLevel > 0)
2018 WARN("Type \"%s\" has %d levels, but %s has %d symbols\n",
2019 type->name, type->num_levels,
2020 xkb_atom_text(keymap->ctx, key->name), key->numLevels[i]);
2021 ACTION("Ignoring extra symbols\n");
2023 key->numLevels[i] = type->num_levels;
2025 if (key->numLevels[i] > width)
2026 width = key->numLevels[i];
2027 if (type->num_levels > width)
2028 width = type->num_levels;
2029 sizeSyms += key->sizeSyms[i];
2032 if (!XkbcResizeKeySyms(keymap, kc, sizeSyms))
2034 WSGO("Could not enlarge symbols for %s (keycode %d)\n",
2035 longText(key->name), kc);
2040 outActs = XkbcResizeKeyActions(keymap, kc, width * nGroups);
2041 if (outActs == NULL)
2043 WSGO("Could not enlarge actions for %s (key %d)\n",
2044 longText(key->name), kc);
2047 keymap->server->explicit[kc] |= XkbExplicitInterpretMask;
2051 if (key->defs.defined & _Key_GroupInfo)
2054 i = keymap->map->key_sym_map[kc].group_info;
2056 keymap->map->key_sym_map[kc].group_info = XkbSetNumGroups(i, nGroups);
2057 keymap->map->key_sym_map[kc].width = width;
2058 keymap->map->key_sym_map[kc].sym_index = uTypedCalloc(nGroups * width,
2060 keymap->map->key_sym_map[kc].num_syms = uTypedCalloc(nGroups * width,
2062 for (i = 0; i < nGroups; i++)
2064 /* assign kt_index[i] to the index of the type in map->types.
2065 * kt_index[i] may have been set by a previous run (if we have two
2066 * layouts specified). Let's not overwrite it with the ONE_LEVEL
2067 * default group if we dont even have keys for this group anyway.
2069 * FIXME: There should be a better fix for this.
2071 if (key->numLevels[i])
2072 keymap->map->key_sym_map[kc].kt_index[i] = types[i];
2073 if (key->sizeSyms[i] != 0)
2075 /* fill key to "width" symbols*/
2076 for (tmp = 0; tmp < width; tmp++)
2078 if (tmp < key->numLevels[i] && key->symsMapNumEntries[i][tmp])
2080 memcpy(&keymap->map->key_sym_map[kc].syms[symIndex],
2081 &key->syms[i][key->symsMapIndex[i][tmp]],
2082 key->symsMapNumEntries[i][tmp] *
2083 sizeof(xkb_keysym_t));
2084 keymap->map->key_sym_map[kc].sym_index[(i * width) + tmp] =
2086 keymap->map->key_sym_map[kc].num_syms[(i * width) + tmp] =
2087 key->symsMapNumEntries[i][tmp];
2089 keymap->map->key_sym_map[kc].num_syms[(i * width) + tmp];
2093 keymap->map->key_sym_map[kc].sym_index[(i * width) + tmp] = -1;
2094 keymap->map->key_sym_map[kc].num_syms[(i * width) + tmp] = 0;
2096 if ((outActs != NULL) && (key->acts[i] != NULL))
2098 if (tmp < key->numLevels[i])
2099 outActs[tmp] = key->acts[i][tmp];
2101 outActs[tmp].type = XkbSA_NoAction;
2106 switch (key->behavior.type & XkbKB_OpMask)
2111 keymap->server->behaviors[kc] = key->behavior;
2112 keymap->server->explicit[kc] |= XkbExplicitBehaviorMask;
2115 if (key->defs.defined & _Key_VModMap)
2117 keymap->server->vmodmap[kc] = key->vmodmap;
2118 keymap->server->explicit[kc] |= XkbExplicitVModMapMask;
2120 if (key->repeat != RepeatUndefined)
2122 if (key->repeat == RepeatYes)
2123 keymap->ctrls->per_key_repeat[kc / 8] |= (1 << (kc % 8));
2125 keymap->ctrls->per_key_repeat[kc / 8] &= ~(1 << (kc % 8));
2126 keymap->server->explicit[kc] |= XkbExplicitAutoRepeatMask;
2129 if (nGroups > keymap->ctrls->num_groups)
2130 keymap->ctrls->num_groups = nGroups;
2132 /* do the same thing for the next key */
2133 CopySymbolsDef(keymap, key, kc + 1);
2138 CopyModMapDef(struct xkb_keymap *keymap, ModMapEntry *entry)
2142 if (!entry->haveSymbol &&
2143 !FindNamedKey(keymap, entry->u.keyName, &kc, true,
2144 CreateKeyNames(keymap), 0))
2146 if (warningLevel >= 5)
2148 WARN("Key %s not found in keycodes\n",
2149 longText(entry->u.keyName));
2150 ACTION("Modifier map entry for %s not updated\n",
2151 XkbcModIndexText(entry->modifier));
2155 else if (entry->haveSymbol &&
2156 !FindKeyForSymbol(keymap, entry->u.keySym, &kc))
2158 if (warningLevel > 5)
2160 WARN("Key \"%s\" not found in symbol map\n",
2161 XkbcKeysymText(entry->u.keySym));
2162 ACTION("Modifier map entry for %s not updated\n",
2163 XkbcModIndexText(entry->modifier));
2167 keymap->map->modmap[kc] |= (1 << entry->modifier);
2172 * Handle the xkb_symbols section of an xkb file.
2174 * @param file The parsed xkb_symbols section of the xkb file.
2175 * @param keymap Handle to the keyboard description to store the symbols in.
2176 * @param merge Merge strategy (e.g. MergeOverride).
2179 CompileSymbols(XkbFile *file, struct xkb_keymap *keymap, unsigned merge)
2185 InitSymbolsInfo(&info, keymap);
2186 info.dflt.defs.fileID = file->id;
2187 info.dflt.defs.merge = merge;
2189 HandleSymbolsFile(file, keymap, merge, &info);
2191 if (info.nKeys == 0)
2194 if (info.errorCount != 0)
2197 /* alloc memory in the xkb struct */
2198 if (XkbcAllocNames(keymap, XkbGroupNamesMask, 0) != Success) {
2199 WSGO("Can not allocate names in CompileSymbols\n");
2200 ACTION("Symbols not added\n");
2204 if (XkbcAllocClientMap(keymap, XkbKeySymsMask | XkbModifierMapMask, 0)
2206 WSGO("Could not allocate client map in CompileSymbols\n");
2207 ACTION("Symbols not added\n");
2211 if (XkbcAllocServerMap(keymap, XkbAllServerInfoMask, 32) != Success) {
2212 WSGO("Could not allocate server map in CompileSymbols\n");
2213 ACTION("Symbols not added\n");
2217 if (XkbcAllocControls(keymap) != Success) {
2218 WSGO("Could not allocate controls in CompileSymbols\n");
2219 ACTION("Symbols not added\n");
2223 /* now copy info into xkb. */
2224 ApplyAliases(keymap, &info.aliases);
2226 for (i = 0; i < XkbNumKbdGroups; i++) {
2227 if (info.groupNames[i] != XKB_ATOM_NONE) {
2228 free(UNCONSTIFY(keymap->names->groups[i]));
2229 keymap->names->groups[i] = xkb_atom_strdup(keymap->ctx,
2230 info.groupNames[i]);
2235 for (key = info.keys, i = 0; i < info.nKeys; i++, key++)
2239 for (key = info.keys, i = 0; i < info.nKeys; i++, key++)
2240 if (!CopySymbolsDef(keymap, key, 0))
2243 if (warningLevel > 3) {
2244 for (i = keymap->min_key_code; i <= keymap->max_key_code; i++) {
2245 if (darray_item(keymap->names->keys, i).name[0] == '\0')
2248 if (XkbKeyNumGroups(keymap, i) < 1) {
2250 memcpy(buf, darray_item(keymap->names->keys, i).name, 4);
2252 WARN("No symbols defined for <%s> (keycode %d)\n", buf, i);
2258 ModMapEntry *mm, *next;
2259 for (mm = info.modMap; mm != NULL; mm = next) {
2260 if (!CopyModMapDef(keymap, mm))
2262 next = (ModMapEntry *) mm->defs.next;
2266 FreeSymbolsInfo(&info);
2270 FreeSymbolsInfo(&info);