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 <X11/keysym.h>
29 #include "xkbcomp-priv.h"
30 #include "parseutils.h"
36 /***====================================================================***/
40 #define RepeatUndefined ~((unsigned)0)
42 #define _Key_Syms (1<<0)
43 #define _Key_Acts (1<<1)
44 #define _Key_Repeat (1<<2)
45 #define _Key_Behavior (1<<3)
46 #define _Key_Type_Dflt (1<<4)
47 #define _Key_Types (1<<5)
48 #define _Key_GroupInfo (1<<6)
49 #define _Key_VModMap (1<<7)
51 typedef struct _KeyInfo
54 unsigned long name; /* the 4 chars of the key name, as long */
55 unsigned char groupInfo;
56 unsigned char typesDefined;
57 unsigned char symsDefined;
58 unsigned char actsDefined;
59 unsigned int numLevels[XkbNumKbdGroups];
61 /* syms[group] -> Single array for all the keysyms in the group. */
62 xkb_keysym_t *syms[XkbNumKbdGroups];
63 /* sizeSyms[group] -> The size of the syms[group] array. */
64 int sizeSyms[XkbNumKbdGroups];
66 * symsMapIndex[group][level] -> The index from which the syms for
67 * the level begin in the syms[group] array. Remember each keycode
68 * can have multiple keysyms in each level (that is, each key press
69 * can result in multiple keysyms).
71 int *symsMapIndex[XkbNumKbdGroups];
73 * symsMapNumEntries[group][level] -> How many syms are in
74 * syms[group][symsMapIndex[group][level]].
76 unsigned int *symsMapNumEntries[XkbNumKbdGroups];
78 union xkb_action *acts[XkbNumKbdGroups];
79 xkb_atom_t types[XkbNumKbdGroups];
81 struct xkb_behavior behavior;
82 unsigned short vmodmap;
83 unsigned long allowNone;
88 * Init the given key info to sane values.
91 InitKeyInfo(KeyInfo * info)
94 static char dflt[4] = "*";
96 info->defs.defined = 0;
97 info->defs.fileID = 0;
98 info->defs.merge = MergeOverride;
99 info->defs.next = NULL;
100 info->name = KeyNameToLong(dflt);
102 info->typesDefined = info->symsDefined = info->actsDefined = 0;
103 for (i = 0; i < XkbNumKbdGroups; i++)
105 info->numLevels[i] = 0;
106 info->types[i] = XKB_ATOM_NONE;
107 info->syms[i] = NULL;
108 info->sizeSyms[i] = 0;
109 info->symsMapIndex[i] = NULL;
110 info->symsMapNumEntries[i] = NULL;
111 info->acts[i] = NULL;
113 info->dfltType = XKB_ATOM_NONE;
114 info->behavior.type = XkbKB_Default;
115 info->behavior.data = 0;
117 info->repeat = RepeatUndefined;
122 * Free memory associated with this key info and reset to sane values.
125 FreeKeyInfo(KeyInfo * info)
129 info->defs.defined = 0;
130 info->defs.fileID = 0;
131 info->defs.merge = MergeOverride;
132 info->defs.next = NULL;
134 info->typesDefined = info->symsDefined = info->actsDefined = 0;
135 for (i = 0; i < XkbNumKbdGroups; i++)
137 info->numLevels[i] = 0;
138 info->types[i] = XKB_ATOM_NONE;
140 info->syms[i] = NULL;
141 info->sizeSyms[i] = 0;
142 free(info->symsMapIndex[i]);
143 info->symsMapIndex[i] = NULL;
144 free(info->symsMapNumEntries[i]);
145 info->symsMapNumEntries[i] = NULL;
147 info->acts[i] = NULL;
149 info->dfltType = XKB_ATOM_NONE;
150 info->behavior.type = XkbKB_Default;
151 info->behavior.data = 0;
153 info->repeat = RepeatUndefined;
158 * Copy old into new, optionally reset old to 0.
159 * If old is reset, new simply re-uses old's memory. Otherwise, the memory is
160 * newly allocated and new points to the new memory areas.
163 CopyKeyInfo(KeyInfo * old, KeyInfo * new, bool clearOld)
168 new->defs.next = NULL;
171 for (i = 0; i < XkbNumKbdGroups; i++)
173 old->numLevels[i] = 0;
174 old->symsMapIndex[i] = NULL;
175 old->symsMapNumEntries[i] = NULL;
177 old->sizeSyms[i] = 0;
184 for (i = 0; i < XkbNumKbdGroups; i++)
186 width = new->numLevels[i];
187 if (old->syms[i] != NULL)
189 new->syms[i] = uTypedCalloc(new->sizeSyms[i], xkb_keysym_t);
193 new->sizeSyms[i] = 0;
194 new->numLevels[i] = 0;
198 memcpy(new->syms[i], old->syms[i],
199 new->sizeSyms[i] * sizeof(xkb_keysym_t));
200 new->symsMapIndex[i] = uTypedCalloc(width, int);
201 if (!new->symsMapIndex[i])
205 new->sizeSyms[i] = 0;
206 new->numLevels[i] = 0;
210 memcpy(new->symsMapIndex[i], old->symsMapIndex[i],
211 width * sizeof(int));
212 new->symsMapNumEntries[i] = uTypedCalloc(width, unsigned int);
213 if (!new->symsMapNumEntries[i])
217 new->sizeSyms[i] = 0;
218 free(new->symsMapIndex[i]);
219 new->symsMapIndex[i] = NULL;
220 new->numLevels[i] = 0;
224 memcpy(new->symsMapNumEntries[i], old->symsMapNumEntries[i],
225 width * sizeof(unsigned int));
227 if (old->acts[i] != NULL)
229 new->acts[i] = uTypedCalloc(width, union xkb_action);
234 new->sizeSyms[i] = 0;
235 free(new->symsMapIndex[i]);
236 new->symsMapIndex[i] = NULL;
237 free(new->symsMapNumEntries[i]);
238 new->symsMapNumEntries[i] = NULL;
239 new->numLevels[i] = 0;
242 memcpy(new->acts[i], old->acts[i],
243 width * sizeof(union xkb_action));
250 /***====================================================================***/
252 typedef struct _ModMapEntry
259 unsigned long keyName;
264 #define SYMBOLS_INIT_SIZE 110
265 #define SYMBOLS_CHUNK 20
266 typedef struct _SymbolsInfo
268 char *name; /* e.g. pc+us+inet(evdev) */
272 unsigned explicit_group;
280 xkb_atom_t groupNames[XkbNumKbdGroups];
287 InitSymbolsInfo(SymbolsInfo * info, struct xkb_keymap * xkb)
292 info->explicit_group = 0;
293 info->errorCount = 0;
295 info->merge = MergeOverride;
297 info->szKeys = SYMBOLS_INIT_SIZE;
299 info->keys = uTypedCalloc(SYMBOLS_INIT_SIZE, KeyInfo);
301 for (i = 0; i < XkbNumKbdGroups; i++)
302 info->groupNames[i] = XKB_ATOM_NONE;
303 InitKeyInfo(&info->dflt);
304 InitVModInfo(&info->vmods, xkb);
306 info->aliases = NULL;
310 FreeSymbolsInfo(SymbolsInfo * info)
317 for (i = 0; i < info->nKeys; i++)
318 FreeKeyInfo(&info->keys[i]);
322 ClearCommonInfo(&info->modMap->defs);
324 ClearAliases(&info->aliases);
325 memset(info, 0, sizeof(SymbolsInfo));
329 ResizeKeyGroup(KeyInfo * key, unsigned int group, unsigned int numLevels,
330 unsigned sizeSyms, bool forceActions)
334 if (key->syms[group] == NULL || key->sizeSyms[group] < sizeSyms)
336 key->syms[group] = uTypedRecalloc(key->syms[group],
337 key->sizeSyms[group],
340 if (!key->syms[group]) {
341 key->sizeSyms[group] = 0;
344 key->sizeSyms[group] = sizeSyms;
346 if (!key->symsMapIndex[group] || key->numLevels[group] < numLevels)
348 key->symsMapIndex[group] = uTypedRealloc(key->symsMapIndex[group],
351 if (!key->symsMapIndex[group])
353 for (i = key->numLevels[group]; i < numLevels; i++)
354 key->symsMapIndex[group][i] = -1;
356 if (!key->symsMapNumEntries[group] || key->numLevels[group] < numLevels)
358 key->symsMapNumEntries[group] =
359 uTypedRecalloc(key->symsMapNumEntries[group],
360 key->numLevels[group],
363 if (!key->symsMapNumEntries[group])
367 (key->numLevels[group] < numLevels || (key->acts[group] == NULL))) ||
368 (key->numLevels[group] < numLevels && (key->acts[group] != NULL)))
370 key->acts[group] = uTypedRecalloc(key->acts[group],
371 key->numLevels[group],
374 if (!key->acts[group])
377 if (key->numLevels[group] < numLevels)
378 key->numLevels[group] = numLevels;
383 MergeKeyGroups(SymbolsInfo * info,
384 KeyInfo * into, KeyInfo * from, unsigned group)
386 xkb_keysym_t *resultSyms = NULL;
387 union xkb_action *resultActs;
388 unsigned int resultWidth;
389 unsigned int resultSize = 0;
392 bool report, clobber;
394 clobber = (from->defs.merge != MergeAugment);
395 report = (warningLevel > 9) ||
396 ((into->defs.fileID == from->defs.fileID) && (warningLevel > 0));
397 if (into->numLevels[group] >= from->numLevels[group])
399 resultActs = into->acts[group];
400 resultWidth = into->numLevels[group];
404 resultActs = from->acts[group];
405 resultWidth = from->numLevels[group];
406 into->symsMapIndex[group] = uTypedRealloc(into->symsMapIndex[group],
407 from->numLevels[group],
409 into->symsMapNumEntries[group] =
410 uTypedRecalloc(into->symsMapNumEntries[group],
411 into->numLevels[group],
412 from->numLevels[group],
414 if (!into->symsMapIndex[group] || !into->symsMapNumEntries[group])
416 WSGO("Could not allocate level indices for key info merge\n");
417 ACTION("Group %d of key %s not merged\n", group,
418 longText(into->name));
422 for (i = into->numLevels[group]; i < from->numLevels[group]; i++)
423 into->symsMapIndex[group][i] = -1;
426 if ((resultActs == NULL) && (into->acts[group] || from->acts[group]))
428 resultActs = uTypedCalloc(resultWidth, union xkb_action);
431 WSGO("Could not allocate actions for group merge\n");
432 ACTION("Group %d of key %s not merged\n", group,
433 longText(into->name));
436 for (i = 0; i < resultWidth; i++)
438 union xkb_action *fromAct, *toAct;
439 fromAct = (from->acts[group] ? &from->acts[group][i] : NULL);
440 toAct = (into->acts[group] ? &into->acts[group][i] : NULL);
441 if (((fromAct == NULL) || (fromAct->type == XkbSA_NoAction))
444 resultActs[i] = *toAct;
446 else if (((toAct == NULL) || (toAct->type == XkbSA_NoAction))
447 && (fromAct != NULL))
449 resultActs[i] = *fromAct;
453 union xkb_action *use, *ignore;
467 ("Multiple actions for level %d/group %d on key %s\n",
468 i + 1, group + 1, longText(into->name));
469 ACTION("Using %s, ignoring %s\n",
470 XkbcActionTypeText(use->type),
471 XkbcActionTypeText(ignore->type));
474 resultActs[i] = *use;
479 for (i = 0; i < resultWidth; i++)
481 unsigned int fromSize = 0;
484 if (from->symsMapNumEntries[group] && (i < from->numLevels[group]))
485 fromSize = from->symsMapNumEntries[group][i];
486 if (into->symsMapNumEntries[group] && (i < into->numLevels[group]))
487 toSize = into->symsMapNumEntries[group][i];
489 if ((fromSize != 0 && toSize == 0) || clobber)
490 resultSize += fromSize;
492 resultSize += toSize;
498 resultSyms = uTypedCalloc(resultSize, xkb_keysym_t);
501 WSGO("Could not allocate symbols for group merge\n");
502 ACTION("Group %d of key %s not merged\n", group, longText(into->name));
506 for (i = 0; i < resultWidth; i++)
508 enum { NONE, FROM, TO } use;
509 unsigned int fromSize = 0;
510 unsigned int toSize = 0;
512 if (from->symsMapNumEntries[group] && (i < from->numLevels[group]))
513 fromSize = from->symsMapNumEntries[group][i];
514 if (into->symsMapNumEntries[group] && (i < into->numLevels[group]))
515 toSize = into->symsMapNumEntries[group][i];
517 if (!fromSize && !toSize)
519 into->symsMapIndex[group][i] = -1;
520 into->symsMapNumEntries[group][i] = 0;
524 if ((fromSize && !toSize) || clobber)
529 if (toSize && fromSize && report)
531 INFO("Multiple symbols for group %d, level %d on key %s\n",
532 group + 1, i + 1, longText(into->name));
533 ACTION("Using %s, ignoring %s\n",
534 (use == FROM ? "from" : "to"),
535 (use == FROM ? "to" : "from"));
540 memcpy(&resultSyms[cur_idx],
541 &from->syms[group][from->symsMapIndex[group][i]],
542 from->symsMapNumEntries[group][i] * sizeof(xkb_keysym_t));
543 into->symsMapIndex[group][i] = cur_idx;
544 into->symsMapNumEntries[group][i] =
545 from->symsMapNumEntries[group][i];
549 memcpy(&resultSyms[cur_idx],
550 &into->syms[group][from->symsMapIndex[group][i]],
551 into->symsMapNumEntries[group][i] * sizeof(xkb_keysym_t));
552 into->symsMapIndex[group][i] = cur_idx;
554 cur_idx += into->symsMapNumEntries[group][i];
558 if (resultActs != into->acts[group])
559 free(into->acts[group]);
560 if (resultActs != from->acts[group])
561 free(from->acts[group]);
562 into->numLevels[group] = resultWidth;
563 free(into->syms[group]);
564 into->syms[group] = resultSyms;
565 free(from->syms[group]);
566 from->syms[group] = NULL;
567 from->sizeSyms[group] = 0;
568 into->sizeSyms[group] = resultSize;
569 free(from->symsMapIndex[group]);
570 from->symsMapIndex[group] = NULL;
571 free(from->symsMapNumEntries[group]);
572 from->symsMapNumEntries[group] = NULL;
573 into->acts[group] = resultActs;
574 from->acts[group] = NULL;
575 into->symsDefined |= (1 << group);
576 from->symsDefined &= ~(1 << group);
577 into->actsDefined |= (1 << group);
578 from->actsDefined &= ~(1 << group);
584 MergeKeys(SymbolsInfo * info, 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",
666 XkbcAtomText(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 * xkb)
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, &info->keys[i], key);
721 if (FindKeyNameForAlias(xkb, key->name, &real_name))
723 for (i = 0; i < info->nKeys; i++)
725 if (info->keys[i].name == real_name)
726 return MergeKeys(info, &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 * xkb)
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, xkb))
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))
872 typedef void (*FileHandler) (XkbFile *rtrn, struct xkb_keymap *xkb,
873 unsigned merge, SymbolsInfo *included);
876 HandleIncludeSymbols(IncludeStmt * stmt,
877 struct xkb_keymap * xkb, SymbolsInfo * info, FileHandler hndlr)
881 SymbolsInfo included;
885 if ((stmt->file == NULL) && (stmt->map == NULL))
889 memset(info, 0, sizeof(SymbolsInfo));
891 else if (ProcessIncludeFile(xkb->context, stmt, XkmSymbolsIndex, &rtrn,
894 InitSymbolsInfo(&included, xkb);
895 included.fileID = included.dflt.defs.fileID = rtrn->id;
896 included.merge = included.dflt.defs.merge = MergeOverride;
899 included.explicit_group = atoi(stmt->modifier) - 1;
903 included.explicit_group = info->explicit_group;
905 (*hndlr) (rtrn, xkb, MergeOverride, &included);
906 if (stmt->stmt != NULL)
909 included.name = stmt->stmt;
916 info->errorCount += 10;
919 if ((stmt->next != NULL) && (included.errorCount < 1))
923 SymbolsInfo next_incl;
925 for (next = stmt->next; next != NULL; next = next->next)
927 if ((next->file == NULL) && (next->map == NULL))
930 MergeIncludedSymbols(&included, info, next->merge, xkb);
931 FreeSymbolsInfo(info);
933 else if (ProcessIncludeFile(xkb->context, next, XkmSymbolsIndex,
936 InitSymbolsInfo(&next_incl, xkb);
937 next_incl.fileID = next_incl.dflt.defs.fileID = rtrn->id;
938 next_incl.merge = next_incl.dflt.defs.merge = MergeOverride;
941 next_incl.explicit_group = atoi(next->modifier) - 1;
945 next_incl.explicit_group = info->explicit_group;
947 (*hndlr) (rtrn, xkb, MergeOverride, &next_incl);
948 MergeIncludedSymbols(&included, &next_incl, op, xkb);
949 FreeSymbolsInfo(&next_incl);
954 info->errorCount += 10;
955 FreeSymbolsInfo(&included);
962 info->errorCount += included.errorCount;
968 MergeIncludedSymbols(info, &included, newMerge, xkb);
969 FreeSymbolsInfo(&included);
971 return (info->errorCount == 0);
978 GetGroupIndex(KeyInfo * key,
979 ExprDef * arrayNdx, unsigned what, unsigned *ndx_rtrn)
989 if (arrayNdx == NULL)
994 defined = key->symsDefined;
996 defined = key->actsDefined;
998 for (i = 0; i < XkbNumKbdGroups; i++)
1000 if ((defined & (1 << i)) == 0)
1006 ERROR("Too many groups of %s for key %s (max %d)\n", name,
1007 longText(key->name), XkbNumKbdGroups + 1);
1008 ACTION("Ignoring %s defined for extra groups\n", name);
1011 if (!ExprResolveGroup(arrayNdx, &tmp))
1013 ERROR("Illegal group index for %s of key %s\n", name,
1014 longText(key->name));
1015 ACTION("Definition with non-integer array index ignored\n");
1018 *ndx_rtrn = tmp.uval - 1;
1023 AddSymbolsToKey(KeyInfo * key,
1024 struct xkb_keymap * xkb,
1025 ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
1027 unsigned ndx, nSyms, nLevels;
1031 if (!GetGroupIndex(key, 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 = value->value.list.nSyms;
1053 nLevels = value->value.list.nLevels;
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] = value->value.list.symsMapIndex[i];
1065 key->symsMapNumEntries[ndx][i] = value->value.list.symsNumEntries[i];
1066 for (j = 0; j < key->symsMapNumEntries[ndx][i]; j++) {
1067 if (key->symsMapIndex[ndx][i] + j >= nSyms)
1069 if (!LookupKeysym(value->value.list.syms[value->value.list.symsMapIndex[i] + j],
1070 &key->syms[ndx][key->symsMapIndex[ndx][i] + j])) {
1071 WARN("Could not resolve keysym %s for key %s, group %d (%s), level %d\n",
1072 value->value.list.syms[i], longText(key->name), ndx + 1,
1073 XkbcAtomText(info->groupNames[ndx]), nSyms);
1075 key->syms[ndx][key->symsMapIndex[ndx][i] + j] = NoSymbol;
1076 key->symsMapIndex[ndx][i] = -1;
1077 key->symsMapNumEntries[ndx][i] = 0;
1082 for (j = key->numLevels[ndx] - 1;
1083 j >= 0 && key->symsMapNumEntries[ndx][j] == 0; j--)
1084 key->numLevels[ndx]--;
1089 AddActionsToKey(KeyInfo * key,
1090 struct xkb_keymap * xkb,
1091 ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
1094 unsigned ndx, nActs;
1096 struct xkb_any_action *toAct;
1098 if (!GetGroupIndex(key, arrayNdx, ACTIONS, &ndx))
1103 key->actsDefined |= (1 << ndx);
1106 if (value->op != ExprActionList)
1108 WSGO("Bad expression type (%d) for action list value\n", value->op);
1109 ACTION("Ignoring actions for group %d of %s\n", ndx,
1110 longText(key->name));
1113 if (key->acts[ndx] != NULL)
1115 WSGO("Actions for key %s, group %d already defined\n",
1116 longText(key->name), ndx);
1119 for (nActs = 0, act = value->value.child; act != NULL; nActs++)
1121 act = (ExprDef *) act->common.next;
1125 WSGO("Action list but not actions in AddActionsToKey\n");
1128 if (((key->numLevels[ndx] < nActs) || (key->acts[ndx] == NULL)) &&
1129 (!ResizeKeyGroup(key, ndx, nActs, nActs, true)))
1131 WSGO("Could not resize group %d of key %s\n", ndx,
1132 longText(key->name));
1133 ACTION("Actions lost\n");
1136 key->actsDefined |= (1 << ndx);
1138 toAct = (struct xkb_any_action *) key->acts[ndx];
1139 act = value->value.child;
1140 for (i = 0; i < nActs; i++, toAct++)
1142 if (!HandleActionDef(act, xkb, toAct, info->action))
1144 ERROR("Illegal action definition for %s\n",
1145 longText(key->name));
1146 ACTION("Action for group %d/level %d ignored\n", ndx + 1, i + 1);
1148 act = (ExprDef *) act->common.next;
1153 static const LookupEntry lockingEntries[] = {
1154 {"true", XkbKB_Lock},
1155 {"yes", XkbKB_Lock},
1157 {"false", XkbKB_Default},
1158 {"no", XkbKB_Default},
1159 {"off", XkbKB_Default},
1160 {"permanent", XkbKB_Lock | XkbKB_Permanent},
1164 static const LookupEntry repeatEntries[] = {
1165 {"true", RepeatYes},
1168 {"false", RepeatNo},
1171 {"default", RepeatUndefined},
1176 SetSymbolsField(KeyInfo * key,
1177 struct xkb_keymap * xkb,
1179 ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
1184 if (strcasecmp(field, "type") == 0)
1187 if ((!ExprResolveString(value, &tmp))
1188 && (warningLevel > 0))
1190 WARN("The type field of a key symbol map must be a string\n");
1191 ACTION("Ignoring illegal type definition\n");
1193 if (arrayNdx == NULL)
1195 key->dfltType = xkb_intern_atom(tmp.str);
1196 key->defs.defined |= _Key_Type_Dflt;
1198 else if (!ExprResolveGroup(arrayNdx, &ndx))
1200 ERROR("Illegal group index for type of key %s\n",
1201 longText(key->name));
1202 ACTION("Definition with non-integer array index ignored\n");
1208 key->types[ndx.uval - 1] = xkb_intern_atom(tmp.str);
1209 key->typesDefined |= (1 << (ndx.uval - 1));
1213 else if (strcasecmp(field, "symbols") == 0)
1214 return AddSymbolsToKey(key, xkb, arrayNdx, value, info);
1215 else if (strcasecmp(field, "actions") == 0)
1216 return AddActionsToKey(key, xkb, arrayNdx, value, info);
1217 else if ((strcasecmp(field, "vmods") == 0) ||
1218 (strcasecmp(field, "virtualmods") == 0) ||
1219 (strcasecmp(field, "virtualmodifiers") == 0))
1221 ok = ExprResolveVModMask(value, &tmp, xkb);
1224 key->vmodmap = (tmp.uval >> 8);
1225 key->defs.defined |= _Key_VModMap;
1229 ERROR("Expected a virtual modifier mask, found %s\n",
1230 exprOpText(value->op));
1231 ACTION("Ignoring virtual modifiers definition for key %s\n",
1232 longText(key->name));
1235 else if ((strcasecmp(field, "locking") == 0) ||
1236 (strcasecmp(field, "lock") == 0) ||
1237 (strcasecmp(field, "locks") == 0))
1239 ok = ExprResolveEnum(value, &tmp, lockingEntries);
1241 key->behavior.type = tmp.uval;
1242 key->defs.defined |= _Key_Behavior;
1244 else if ((strcasecmp(field, "radiogroup") == 0) ||
1245 (strcasecmp(field, "permanentradiogroup") == 0) ||
1246 (strcasecmp(field, "allownone") == 0))
1248 ERROR("Radio groups not supported\n");
1249 ACTION("Ignoring radio group specification for key %s\n", longText(key->name));
1252 else if (uStrCasePrefix("overlay", field) ||
1253 uStrCasePrefix("permanentoverlay", field))
1255 ERROR("Overlays not supported\n");
1256 ACTION("Ignoring overlay specification for key %s\n", longText(key->name));
1258 else if ((strcasecmp(field, "repeating") == 0) ||
1259 (strcasecmp(field, "repeats") == 0) ||
1260 (strcasecmp(field, "repeat") == 0))
1262 ok = ExprResolveEnum(value, &tmp, repeatEntries);
1265 ERROR("Illegal repeat setting for %s\n",
1266 longText(key->name));
1267 ACTION("Non-boolean repeat setting ignored\n");
1270 key->repeat = tmp.uval;
1271 key->defs.defined |= _Key_Repeat;
1273 else if ((strcasecmp(field, "groupswrap") == 0) ||
1274 (strcasecmp(field, "wrapgroups") == 0))
1276 ok = ExprResolveBoolean(value, &tmp);
1279 ERROR("Illegal groupsWrap setting for %s\n",
1280 longText(key->name));
1281 ACTION("Non-boolean value ignored\n");
1285 key->groupInfo = XkbWrapIntoRange;
1287 key->groupInfo = XkbClampIntoRange;
1288 key->defs.defined |= _Key_GroupInfo;
1290 else if ((strcasecmp(field, "groupsclamp") == 0) ||
1291 (strcasecmp(field, "clampgroups") == 0))
1293 ok = ExprResolveBoolean(value, &tmp);
1296 ERROR("Illegal groupsClamp setting for %s\n",
1297 longText(key->name));
1298 ACTION("Non-boolean value ignored\n");
1302 key->groupInfo = XkbClampIntoRange;
1304 key->groupInfo = XkbWrapIntoRange;
1305 key->defs.defined |= _Key_GroupInfo;
1307 else if ((strcasecmp(field, "groupsredirect") == 0) ||
1308 (strcasecmp(field, "redirectgroups") == 0))
1310 if (!ExprResolveGroup(value, &tmp))
1312 ERROR("Illegal group index for redirect of key %s\n",
1313 longText(key->name));
1314 ACTION("Definition with non-integer group ignored\n");
1318 XkbSetGroupInfo(0, XkbRedirectIntoRange, tmp.uval - 1);
1319 key->defs.defined |= _Key_GroupInfo;
1323 ERROR("Unknown field %s in a symbol interpretation\n", field);
1324 ACTION("Definition ignored\n");
1331 SetGroupName(SymbolsInfo * info, ExprDef * arrayNdx, ExprDef * value)
1333 ExprResult tmp, name;
1335 if ((arrayNdx == NULL) && (warningLevel > 0))
1337 WARN("You must specify an index when specifying a group name\n");
1338 ACTION("Group name definition without array subscript ignored\n");
1341 if (!ExprResolveGroup(arrayNdx, &tmp))
1343 ERROR("Illegal index in group name definition\n");
1344 ACTION("Definition with non-integer array index ignored\n");
1347 if (!ExprResolveString(value, &name))
1349 ERROR("Group name must be a string\n");
1350 ACTION("Illegal name for group %d ignored\n", tmp.uval);
1353 info->groupNames[tmp.uval - 1 + info->explicit_group] =
1354 xkb_intern_atom(name.str);
1361 HandleSymbolsVar(VarDef * stmt, struct xkb_keymap * xkb, SymbolsInfo * info)
1363 ExprResult elem, field, tmp;
1367 if (ExprResolveLhs(stmt->name, &elem, &field, &arrayNdx) == 0)
1368 return 0; /* internal error, already reported */
1369 if (elem.str && (strcasecmp(elem.str, "key") == 0))
1371 ret = SetSymbolsField(&info->dflt, xkb, field.str, arrayNdx,
1374 else if ((elem.str == NULL) && ((strcasecmp(field.str, "name") == 0) ||
1375 (strcasecmp(field.str, "groupname") ==
1378 ret = SetGroupName(info, arrayNdx, stmt->value);
1380 else if ((elem.str == NULL)
1381 && ((strcasecmp(field.str, "groupswrap") == 0) ||
1382 (strcasecmp(field.str, "wrapgroups") == 0)))
1384 if (!ExprResolveBoolean(stmt->value, &tmp))
1386 ERROR("Illegal setting for global groupsWrap\n");
1387 ACTION("Non-boolean value ignored\n");
1392 info->groupInfo = XkbWrapIntoRange;
1394 info->groupInfo = XkbClampIntoRange;
1398 else if ((elem.str == NULL)
1399 && ((strcasecmp(field.str, "groupsclamp") == 0) ||
1400 (strcasecmp(field.str, "clampgroups") == 0)))
1402 if (!ExprResolveBoolean(stmt->value, &tmp))
1404 ERROR("Illegal setting for global groupsClamp\n");
1405 ACTION("Non-boolean value ignored\n");
1410 info->groupInfo = XkbClampIntoRange;
1412 info->groupInfo = XkbWrapIntoRange;
1416 else if ((elem.str == NULL)
1417 && ((strcasecmp(field.str, "groupsredirect") == 0) ||
1418 (strcasecmp(field.str, "redirectgroups") == 0)))
1420 if (!ExprResolveGroup(stmt->value, &tmp))
1422 ERROR("Illegal group index for global groupsRedirect\n");
1423 ACTION("Definition with non-integer group ignored\n");
1427 info->groupInfo = XkbSetGroupInfo(0, XkbRedirectIntoRange,
1432 else if ((elem.str == NULL) && (strcasecmp(field.str, "allownone") == 0))
1434 ERROR("Radio groups not supported\n");
1435 ACTION("Ignoring \"allow none\" specification\n");
1439 ret = SetActionField(xkb, elem.str, field.str, arrayNdx, stmt->value,
1449 HandleSymbolsBody(VarDef * def,
1450 struct xkb_keymap * xkb, KeyInfo * key, SymbolsInfo * info)
1453 ExprResult tmp, field;
1456 for (; def != NULL; def = (VarDef *) def->common.next)
1458 if ((def->name) && (def->name->type == ExprFieldRef))
1460 ok = HandleSymbolsVar(def, xkb, info);
1465 if (def->name == NULL)
1467 if ((def->value == NULL)
1468 || (def->value->op == ExprKeysymList))
1469 field.str = strdup("symbols");
1471 field.str = strdup("actions");
1476 ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx);
1479 ok = SetSymbolsField(key, xkb, field.str, arrayNdx,
1488 SetExplicitGroup(SymbolsInfo * info, KeyInfo * key)
1490 unsigned group = info->explicit_group;
1495 if ((key->typesDefined | key->symsDefined | key->actsDefined) & ~1)
1498 WARN("For the map %s an explicit group specified\n", info->name);
1499 WARN("but key %s has more than one group defined\n",
1500 longText(key->name));
1501 ACTION("All groups except first one will be ignored\n");
1502 for (i = 1; i < XkbNumKbdGroups; i++)
1504 key->numLevels[i] = 0;
1506 key->syms[i] = NULL;
1508 key->acts[i] = NULL;
1512 key->typesDefined = key->symsDefined = key->actsDefined = 1 << group;
1514 key->numLevels[group] = key->numLevels[0];
1515 key->numLevels[0] = 0;
1516 key->syms[group] = key->syms[0];
1517 key->syms[0] = NULL;
1518 key->sizeSyms[group] = key->sizeSyms[0];
1519 key->sizeSyms[0] = 0;
1520 key->symsMapIndex[group] = key->symsMapIndex[0];
1521 key->symsMapIndex[0] = NULL;
1522 key->symsMapNumEntries[group] = key->symsMapNumEntries[0];
1523 key->symsMapNumEntries[0] = NULL;
1524 key->acts[group] = key->acts[0];
1525 key->acts[0] = NULL;
1526 key->types[group] = key->types[0];
1532 HandleSymbolsDef(SymbolsDef * stmt,
1533 struct xkb_keymap *xkb, SymbolsInfo *info)
1538 CopyKeyInfo(&info->dflt, &key, false);
1539 key.defs.merge = stmt->merge;
1540 key.name = KeyNameToLong(stmt->keyName);
1541 if (!HandleSymbolsBody((VarDef *) stmt->symbols, xkb, &key, info))
1547 if (!SetExplicitGroup(info, &key))
1553 if (!AddKeySymbols(info, &key, xkb))
1562 HandleModMapDef(ModMapDef * def,
1563 struct xkb_keymap * xkb, SymbolsInfo * info)
1570 if (!LookupModIndex(NULL, def->modifier, TypeInt, &rtrn))
1572 ERROR("Illegal modifier map definition\n");
1573 ACTION("Ignoring map for non-modifier \"%s\"\n",
1574 XkbcAtomText(def->modifier));
1578 tmp.modifier = rtrn.uval;
1579 for (key = def->keys; key != NULL; key = (ExprDef *) key->common.next)
1581 if ((key->op == ExprValue) && (key->type == TypeKeyName))
1583 tmp.haveSymbol = false;
1584 tmp.u.keyName = KeyNameToLong(key->value.keyName);
1586 else if (ExprResolveKeySym(key, &rtrn))
1588 tmp.haveSymbol = true;
1589 tmp.u.keySym = rtrn.uval;
1593 ERROR("Modmap entries may contain only key names or keysyms\n");
1594 ACTION("Illegal definition for %s modifier ignored\n",
1595 XkbcModIndexText(tmp.modifier));
1599 ok = AddModMapEntry(info, &tmp) && ok;
1605 HandleSymbolsFile(XkbFile * file,
1606 struct xkb_keymap * xkb, unsigned merge, SymbolsInfo * info)
1611 info->name = uDupString(file->name);
1615 switch (stmt->stmtType)
1618 if (!HandleIncludeSymbols((IncludeStmt *) stmt, xkb, info,
1622 case StmtSymbolsDef:
1623 if (!HandleSymbolsDef((SymbolsDef *) stmt, xkb, info))
1627 if (!HandleSymbolsVar((VarDef *) stmt, xkb, info))
1631 if (!HandleVModDef((VModDef *) stmt, xkb, merge, &info->vmods))
1635 ERROR("Interpretation files may not include other types\n");
1636 ACTION("Ignoring definition of symbol interpretation\n");
1639 case StmtKeycodeDef:
1640 ERROR("Interpretation files may not include other types\n");
1641 ACTION("Ignoring definition of key name\n");
1645 if (!HandleModMapDef((ModMapDef *) stmt, xkb, info))
1649 WSGO("Unexpected statement type %d in HandleSymbolsFile\n",
1654 if (info->errorCount > 10)
1657 ERROR("Too many errors\n");
1659 ACTION("Abandoning symbols file \"%s\"\n", file->topName);
1666 FindKeyForSymbol(struct xkb_keymap * xkb, xkb_keysym_t sym, xkb_keycode_t *kc_rtrn)
1669 unsigned int group, level;
1671 for (key = xkb->min_key_code; key <= xkb->max_key_code; key++)
1673 for (group = 0; group < XkbKeyNumGroups(xkb, key); group++)
1675 for (level = 0; level < XkbKeyGroupWidth(xkb, key, group); level++)
1677 if (XkbKeyNumSyms(xkb, key, group, level) != 1 ||
1678 (XkbKeySymEntry(xkb, key, group, level))[0] != sym)
1690 * Find the given name in the xkb->map->types and return its index.
1692 * @param atom The atom to search for.
1693 * @param type_rtrn Set to the index of the name if found.
1695 * @return true if found, false otherwise.
1698 FindNamedType(struct xkb_keymap * xkb, xkb_atom_t atom, unsigned *type_rtrn)
1701 const char *name = XkbcAtomText(atom);
1703 if (xkb && xkb->map && xkb->map->types)
1705 for (n = 0; n < xkb->map->num_types; n++)
1707 if (strcmp(xkb->map->types[n].name, name) == 0)
1718 * Assign a type to the given sym and return the Atom for the type assigned.
1721 * - ONE_LEVEL for width 0/1
1722 * - ALPHABETIC for 2 shift levels, with lower/upercase
1723 * - KEYPAD for keypad keys.
1724 * - TWO_LEVEL for other 2 shift level keys.
1725 * and the same for four level keys.
1727 * @param width Number of sysms in syms.
1728 * @param syms The keysyms for the given key (must be size width).
1729 * @param typeNameRtrn Set to the Atom of the type name.
1731 * @returns true if a type could be found, false otherwise.
1734 FindAutomaticType(int width, xkb_keysym_t * syms, xkb_atom_t * typeNameRtrn,
1738 if ((width == 1) || (width == 0))
1740 *typeNameRtrn = xkb_intern_atom("ONE_LEVEL");
1743 else if (width == 2)
1745 if (syms && XkbcKSIsLower(syms[0]) && XkbcKSIsUpper(syms[1]))
1747 *typeNameRtrn = xkb_intern_atom("ALPHABETIC");
1749 else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1])))
1751 *typeNameRtrn = xkb_intern_atom("KEYPAD");
1756 *typeNameRtrn = xkb_intern_atom("TWO_LEVEL");
1760 else if (width <= 4)
1762 if (syms && XkbcKSIsLower(syms[0]) && XkbcKSIsUpper(syms[1]))
1763 if (XkbcKSIsLower(syms[2]) && XkbcKSIsUpper(syms[3]))
1765 xkb_intern_atom("FOUR_LEVEL_ALPHABETIC");
1767 *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL_SEMIALPHABETIC");
1769 else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1])))
1770 *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL_KEYPAD");
1772 *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL");
1773 /* XXX: why not set autoType here? */
1775 return ((width >= 0) && (width <= 4));
1779 * Ensure the given KeyInfo is in a coherent state, i.e. no gaps between the
1780 * groups, and reduce to one group if all groups are identical anyway.
1783 PrepareKeyDef(KeyInfo * key)
1785 int i, j, width, defined, lastGroup;
1788 defined = key->symsDefined | key->actsDefined | key->typesDefined;
1789 /* get highest group number */
1790 for (i = XkbNumKbdGroups - 1; i >= 0; i--)
1792 if (defined & (1 << i))
1800 /* If there are empty groups between non-empty ones fill them with data */
1801 /* from the first group. */
1802 /* We can make a wrong assumption here. But leaving gaps is worse. */
1803 for (i = lastGroup; i > 0; i--)
1805 if (defined & (1 << i))
1807 width = key->numLevels[0];
1808 if (key->typesDefined & 1)
1810 for (j = 0; j < width; j++)
1812 key->types[i] = key->types[0];
1814 key->typesDefined |= 1 << i;
1816 if ((key->actsDefined & 1) && key->acts[0])
1818 key->acts[i] = uTypedCalloc(width, union xkb_action);
1819 if (key->acts[i] == NULL)
1821 memcpy(key->acts[i], key->acts[0],
1822 width * sizeof(union xkb_action));
1823 key->actsDefined |= 1 << i;
1825 if ((key->symsDefined & 1) && key->sizeSyms[0])
1827 key->syms[i] = uTypedCalloc(key->sizeSyms[0], xkb_keysym_t);
1828 if (key->syms[i] == NULL)
1830 memcpy(key->syms[i], key->syms[0],
1831 key->sizeSyms[0] * sizeof(xkb_keysym_t));
1832 key->symsMapIndex[i] = uTypedCalloc(width, int);
1833 if (!key->symsMapIndex[i])
1836 key->syms[i] = NULL;
1839 memcpy(key->symsMapIndex[i], key->symsMapIndex[0],
1840 width * sizeof(int));
1841 key->symsMapNumEntries[i] = uTypedCalloc(width, unsigned int);
1842 if (!key->symsMapNumEntries[i])
1845 key->syms[i] = NULL;
1846 free(key->symsMapIndex[i]);
1847 key->symsMapIndex[i] = NULL;
1850 memcpy(key->symsMapNumEntries[i], key->symsMapNumEntries[0],
1851 width * sizeof(int));
1852 key->sizeSyms[i] = key->sizeSyms[0];
1853 key->symsDefined |= 1 << i;
1857 key->numLevels[i] = key->numLevels[0];
1860 /* If all groups are completely identical remove them all */
1861 /* exept the first one. */
1863 for (i = lastGroup; i > 0; i--)
1865 if ((key->numLevels[i] != key->numLevels[0]) ||
1866 (key->types[i] != key->types[0]))
1871 if ((key->syms[i] != key->syms[0]) &&
1872 (key->syms[i] == NULL || key->syms[0] == NULL ||
1873 key->sizeSyms[i] != key->sizeSyms[0] ||
1874 memcmp(key->syms[i], key->syms[0],
1875 sizeof(xkb_keysym_t) * key->sizeSyms[0])))
1880 if ((key->symsMapIndex[i] != key->symsMapIndex[i]) &&
1881 (key->symsMapIndex[i] == NULL || key->symsMapIndex[0] == NULL ||
1882 memcmp(key->symsMapIndex[i], key->symsMapIndex[0],
1883 key->numLevels[0] * sizeof(int))))
1888 if ((key->symsMapNumEntries[i] != key->symsMapNumEntries[i]) &&
1889 (key->symsMapNumEntries[i] == NULL ||
1890 key->symsMapNumEntries[0] == NULL ||
1891 memcmp(key->symsMapNumEntries[i], key->symsMapNumEntries[0],
1892 key->numLevels[0] * sizeof(int))))
1897 if ((key->acts[i] != key->acts[0]) &&
1898 (key->acts[i] == NULL || key->acts[0] == NULL ||
1899 memcmp(key->acts[i], key->acts[0],
1900 sizeof(union xkb_action) * key->numLevels[0])))
1908 for (i = lastGroup; i > 0; i--)
1910 key->numLevels[i] = 0;
1912 key->syms[i] = NULL;
1913 key->sizeSyms[i] = 0;
1914 free(key->symsMapIndex[i]);
1915 key->symsMapIndex[i] = NULL;
1916 free(key->symsMapNumEntries[i]);
1917 key->symsMapNumEntries[i] = NULL;
1919 key->acts[i] = NULL;
1922 key->symsDefined &= 1;
1923 key->actsDefined &= 1;
1924 key->typesDefined &= 1;
1929 * Copy the KeyInfo into the keyboard description.
1931 * This function recurses.
1934 CopySymbolsDef(struct xkb_keymap * xkb, KeyInfo *key, int start_from)
1938 unsigned int sizeSyms = 0;
1939 unsigned width, tmp, nGroups;
1940 struct xkb_key_type * type;
1941 bool haveActions, autoType, useAlias;
1942 unsigned types[XkbNumKbdGroups];
1943 union xkb_action *outActs;
1944 unsigned int symIndex = 0;
1946 useAlias = (start_from == 0);
1948 /* get the keycode for the key. */
1949 if (!FindNamedKey(xkb, key->name, &kc, useAlias, CreateKeyNames(xkb),
1952 if ((start_from == 0) && (warningLevel >= 5))
1954 WARN("Key %s not found in keycodes\n", longText(key->name));
1955 ACTION("Symbols ignored\n");
1960 haveActions = false;
1961 for (i = width = nGroups = 0; i < XkbNumKbdGroups; i++)
1963 if (((i + 1) > nGroups)
1964 && (((key->symsDefined | key->actsDefined) & (1 << i))
1965 || (key->typesDefined) & (1 << i)))
1970 /* Assign the type to the key, if it is missing. */
1971 if (key->types[i] == XKB_ATOM_NONE)
1973 if (key->dfltType != XKB_ATOM_NONE)
1974 key->types[i] = key->dfltType;
1975 else if (FindAutomaticType(key->numLevels[i], key->syms[i],
1976 &key->types[i], &autoType))
1981 if (warningLevel >= 5)
1983 WARN("No automatic type for %d symbols\n",
1984 (unsigned int) key->numLevels[i]);
1985 ACTION("Using %s for the %s key (keycode %d)\n",
1986 XkbcAtomText(key->types[i]),
1987 longText(key->name), kc);
1991 if (FindNamedType(xkb, key->types[i], &types[i]))
1993 if (!autoType || key->numLevels[i] > 2)
1994 xkb->server->explicit[kc] |= (1 << i);
1998 if (warningLevel >= 3)
2000 WARN("Type \"%s\" is not defined\n",
2001 XkbcAtomText(key->types[i]));
2002 ACTION("Using TWO_LEVEL for the %s key (keycode %d)\n",
2003 longText(key->name), kc);
2005 types[i] = XkbTwoLevelIndex;
2007 /* if the type specifies fewer levels than the key has, shrink the key */
2008 type = &xkb->map->types[types[i]];
2009 if (type->num_levels < key->numLevels[i])
2011 if (warningLevel > 0)
2013 WARN("Type \"%s\" has %d levels, but %s has %d symbols\n",
2014 type->name, type->num_levels,
2015 XkbcAtomText(key->name), key->numLevels[i]);
2016 ACTION("Ignoring extra symbols\n");
2018 key->numLevels[i] = type->num_levels;
2020 if (key->numLevels[i] > width)
2021 width = key->numLevels[i];
2022 if (type->num_levels > width)
2023 width = type->num_levels;
2024 sizeSyms += key->sizeSyms[i];
2027 if (!XkbcResizeKeySyms(xkb, kc, sizeSyms))
2029 WSGO("Could not enlarge symbols for %s (keycode %d)\n",
2030 longText(key->name), kc);
2035 outActs = XkbcResizeKeyActions(xkb, kc, width * nGroups);
2036 if (outActs == NULL)
2038 WSGO("Could not enlarge actions for %s (key %d)\n",
2039 longText(key->name), kc);
2042 xkb->server->explicit[kc] |= XkbExplicitInterpretMask;
2046 if (key->defs.defined & _Key_GroupInfo)
2049 i = xkb->map->key_sym_map[kc].group_info;
2051 xkb->map->key_sym_map[kc].group_info = XkbSetNumGroups(i, nGroups);
2052 xkb->map->key_sym_map[kc].width = width;
2053 xkb->map->key_sym_map[kc].sym_index = uTypedCalloc(nGroups * width, int);
2054 xkb->map->key_sym_map[kc].num_syms = uTypedCalloc(nGroups * width,
2056 for (i = 0; i < nGroups; i++)
2058 /* assign kt_index[i] to the index of the type in map->types.
2059 * kt_index[i] may have been set by a previous run (if we have two
2060 * layouts specified). Let's not overwrite it with the ONE_LEVEL
2061 * default group if we dont even have keys for this group anyway.
2063 * FIXME: There should be a better fix for this.
2065 if (key->numLevels[i])
2066 xkb->map->key_sym_map[kc].kt_index[i] = types[i];
2067 if (key->sizeSyms[i] != 0)
2069 /* fill key to "width" symbols*/
2070 for (tmp = 0; tmp < width; tmp++)
2072 if (tmp < key->numLevels[i] && key->symsMapNumEntries[i][tmp])
2074 memcpy(&xkb->map->key_sym_map[kc].syms[symIndex],
2075 &key->syms[i][key->symsMapIndex[i][tmp]],
2076 key->symsMapNumEntries[i][tmp] *
2077 sizeof(xkb_keysym_t));
2078 xkb->map->key_sym_map[kc].sym_index[(i * width) + tmp] =
2080 xkb->map->key_sym_map[kc].num_syms[(i * width) + tmp] =
2081 key->symsMapNumEntries[i][tmp];
2083 xkb->map->key_sym_map[kc].num_syms[(i * width) + tmp];
2087 xkb->map->key_sym_map[kc].sym_index[(i * width) + tmp] = -1;
2088 xkb->map->key_sym_map[kc].num_syms[(i * width) + tmp] = 0;
2090 if ((outActs != NULL) && (key->acts[i] != NULL))
2092 if (tmp < key->numLevels[i])
2093 outActs[tmp] = key->acts[i][tmp];
2095 outActs[tmp].type = XkbSA_NoAction;
2100 switch (key->behavior.type & XkbKB_OpMask)
2105 xkb->server->behaviors[kc] = key->behavior;
2106 xkb->server->explicit[kc] |= XkbExplicitBehaviorMask;
2109 if (key->defs.defined & _Key_VModMap)
2111 xkb->server->vmodmap[kc] = key->vmodmap;
2112 xkb->server->explicit[kc] |= XkbExplicitVModMapMask;
2114 if (key->repeat != RepeatUndefined)
2116 if (key->repeat == RepeatYes)
2117 xkb->ctrls->per_key_repeat[kc / 8] |= (1 << (kc % 8));
2119 xkb->ctrls->per_key_repeat[kc / 8] &= ~(1 << (kc % 8));
2120 xkb->server->explicit[kc] |= XkbExplicitAutoRepeatMask;
2123 if (nGroups > xkb->ctrls->num_groups)
2124 xkb->ctrls->num_groups = nGroups;
2126 /* do the same thing for the next key */
2127 CopySymbolsDef(xkb, key, kc + 1);
2132 CopyModMapDef(struct xkb_keymap * xkb, ModMapEntry *entry)
2136 if ((!entry->haveSymbol)
2139 (xkb, entry->u.keyName, &kc, true, CreateKeyNames(xkb), 0)))
2141 if (warningLevel >= 5)
2143 WARN("Key %s not found in keycodes\n",
2144 longText(entry->u.keyName));
2145 ACTION("Modifier map entry for %s not updated\n",
2146 XkbcModIndexText(entry->modifier));
2150 else if (entry->haveSymbol
2151 && (!FindKeyForSymbol(xkb, entry->u.keySym, &kc)))
2153 if (warningLevel > 5)
2155 WARN("Key \"%s\" not found in symbol map\n",
2156 XkbcKeysymText(entry->u.keySym));
2157 ACTION("Modifier map entry for %s not updated\n",
2158 XkbcModIndexText(entry->modifier));
2162 xkb->map->modmap[kc] |= (1 << entry->modifier);
2167 * Handle the xkb_symbols section of an xkb file.
2169 * @param file The parsed xkb_symbols section of the xkb file.
2170 * @param xkb Handle to the keyboard description to store the symbols in.
2171 * @param merge Merge strategy (e.g. MergeOverride).
2174 CompileSymbols(XkbFile *file, struct xkb_keymap *xkb, unsigned merge)
2180 InitSymbolsInfo(&info, xkb);
2181 info.dflt.defs.fileID = file->id;
2182 info.dflt.defs.merge = merge;
2184 HandleSymbolsFile(file, xkb, merge, &info);
2186 if (info.nKeys == 0)
2189 if (info.errorCount != 0)
2192 /* alloc memory in the xkb struct */
2193 if (XkbcAllocNames(xkb, XkbGroupNamesMask, 0) != Success) {
2194 WSGO("Can not allocate names in CompileSymbols\n");
2195 ACTION("Symbols not added\n");
2199 if (XkbcAllocClientMap(xkb, XkbKeySymsMask | XkbModifierMapMask, 0)
2201 WSGO("Could not allocate client map in CompileSymbols\n");
2202 ACTION("Symbols not added\n");
2206 if (XkbcAllocServerMap(xkb, XkbAllServerInfoMask, 32) != Success) {
2207 WSGO("Could not allocate server map in CompileSymbols\n");
2208 ACTION("Symbols not added\n");
2212 if (XkbcAllocControls(xkb) != Success) {
2213 WSGO("Could not allocate controls in CompileSymbols\n");
2214 ACTION("Symbols not added\n");
2218 /* now copy info into xkb. */
2219 ApplyAliases(xkb, &info.aliases);
2221 for (i = 0; i < XkbNumKbdGroups; i++) {
2222 if (info.groupNames[i] != XKB_ATOM_NONE) {
2223 free(UNCONSTIFY(xkb->names->groups[i]));
2224 xkb->names->groups[i] = XkbcAtomGetString(info.groupNames[i]);
2229 for (key = info.keys, i = 0; i < info.nKeys; i++, key++)
2233 for (key = info.keys, i = 0; i < info.nKeys; i++, key++)
2234 if (!CopySymbolsDef(xkb, key, 0))
2237 if (warningLevel > 3) {
2238 for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) {
2239 if (xkb->names->keys[i].name[0] == '\0')
2242 if (XkbKeyNumGroups(xkb, i) < 1) {
2244 memcpy(buf, xkb->names->keys[i].name, 4);
2246 WARN("No symbols defined for <%s> (keycode %d)\n", buf, i);
2252 ModMapEntry *mm, *next;
2253 for (mm = info.modMap; mm != NULL; mm = next) {
2254 if (!CopyModMapDef(xkb, mm))
2256 next = (ModMapEntry *)mm->defs.next;
2260 FreeSymbolsInfo(&info);
2264 FreeSymbolsInfo(&info);