1 /************************************************************
2 Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
4 Permission to use, copy, modify, and distribute this
5 software and its documentation for any purpose and without
6 fee is hereby granted, provided that the above copyright
7 notice appear in all copies and that both that copyright
8 notice and this permission notice appear in supporting
9 documentation, and that the name of Silicon Graphics not be
10 used in advertising or publicity pertaining to distribution
11 of the software without specific prior written permission.
12 Silicon Graphics makes no representation about the suitability
13 of this software for any purpose. It is provided "as is"
14 without any express or implied warranty.
16 SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18 AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19 GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21 DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
23 THE USE OR PERFORMANCE OF THIS SOFTWARE.
25 ********************************************************/
31 #include "parseutils.h"
33 #include <X11/keysym.h>
43 /***====================================================================***/
47 #define RepeatUndefined ~((unsigned)0)
49 #define _Key_Syms (1<<0)
50 #define _Key_Acts (1<<1)
51 #define _Key_Repeat (1<<2)
52 #define _Key_Behavior (1<<3)
53 #define _Key_Type_Dflt (1<<4)
54 #define _Key_Types (1<<5)
55 #define _Key_GroupInfo (1<<6)
56 #define _Key_VModMap (1<<7)
58 typedef struct _KeyInfo
61 unsigned long name; /* the 4 chars of the key name, as long */
62 unsigned char groupInfo;
63 unsigned char typesDefined;
64 unsigned char symsDefined;
65 unsigned char actsDefined;
66 unsigned int numLevels[XkbNumKbdGroups];
67 xkb_keysym_t *syms[XkbNumKbdGroups];
68 int sizeSyms[XkbNumKbdGroups];
69 int *symsMapIndex[XkbNumKbdGroups];
70 unsigned int *symsMapNumEntries[XkbNumKbdGroups];
71 union xkb_action *acts[XkbNumKbdGroups];
72 xkb_atom_t types[XkbNumKbdGroups];
74 struct xkb_behavior behavior;
75 unsigned short vmodmap;
76 unsigned long allowNone;
81 * Init the given key info to sane values.
84 InitKeyInfo(KeyInfo * info)
87 static char dflt[4] = "*";
89 info->defs.defined = 0;
90 info->defs.fileID = 0;
91 info->defs.merge = MergeOverride;
92 info->defs.next = NULL;
93 info->name = KeyNameToLong(dflt);
95 info->typesDefined = info->symsDefined = info->actsDefined = 0;
96 for (i = 0; i < XkbNumKbdGroups; i++)
98 info->numLevels[i] = 0;
99 info->types[i] = XKB_ATOM_NONE;
100 info->syms[i] = NULL;
101 info->sizeSyms[i] = 0;
102 info->symsMapIndex[i] = NULL;
103 info->symsMapNumEntries[i] = NULL;
104 info->acts[i] = NULL;
106 info->dfltType = XKB_ATOM_NONE;
107 info->behavior.type = XkbKB_Default;
108 info->behavior.data = 0;
110 info->repeat = RepeatUndefined;
115 * Free memory associated with this key info and reset to sane values.
118 FreeKeyInfo(KeyInfo * info)
122 info->defs.defined = 0;
123 info->defs.fileID = 0;
124 info->defs.merge = MergeOverride;
125 info->defs.next = NULL;
127 info->typesDefined = info->symsDefined = info->actsDefined = 0;
128 for (i = 0; i < XkbNumKbdGroups; i++)
130 info->numLevels[i] = 0;
131 info->types[i] = XKB_ATOM_NONE;
133 info->syms[i] = NULL;
134 info->sizeSyms[i] = 0;
135 free(info->symsMapIndex[i]);
136 info->symsMapIndex[i] = NULL;
137 free(info->symsMapNumEntries[i]);
138 info->symsMapNumEntries[i] = NULL;
140 info->acts[i] = NULL;
142 info->dfltType = XKB_ATOM_NONE;
143 info->behavior.type = XkbKB_Default;
144 info->behavior.data = 0;
146 info->repeat = RepeatUndefined;
151 * Copy old into new, optionally reset old to 0.
152 * If old is reset, new simply re-uses old's memory. Otherwise, the memory is
153 * newly allocated and new points to the new memory areas.
156 CopyKeyInfo(KeyInfo * old, KeyInfo * new, Bool clearOld)
161 new->defs.next = NULL;
164 for (i = 0; i < XkbNumKbdGroups; i++)
166 old->numLevels[i] = 0;
167 old->symsMapIndex[i] = NULL;
168 old->symsMapNumEntries[i] = NULL;
170 old->sizeSyms[i] = 0;
177 for (i = 0; i < XkbNumKbdGroups; i++)
179 width = new->numLevels[i];
180 if (old->syms[i] != NULL)
182 new->syms[i] = uTypedCalloc(new->sizeSyms[i], xkb_keysym_t);
186 new->sizeSyms[i] = 0;
187 new->numLevels[i] = 0;
191 memcpy(new->syms[i], old->syms[i],
192 new->sizeSyms[i] * sizeof(xkb_keysym_t));
193 new->symsMapIndex[i] = uTypedCalloc(width, int);
194 if (!new->symsMapIndex[i])
198 new->sizeSyms[i] = 0;
199 new->numLevels[i] = 0;
203 memcpy(new->symsMapIndex[i], old->symsMapIndex[i],
204 width * sizeof(int));
205 new->symsMapNumEntries[i] = uTypedCalloc(width, unsigned int);
206 if (!new->symsMapNumEntries[i])
210 new->sizeSyms[i] = 0;
211 free(new->symsMapIndex[i]);
212 new->symsMapIndex[i] = NULL;
213 new->numLevels[i] = 0;
217 memcpy(new->symsMapNumEntries[i], old->symsMapNumEntries[i],
218 sizeof(unsigned int));
220 if (old->acts[i] != NULL)
222 new->acts[i] = uTypedCalloc(width, union xkb_action);
227 new->sizeSyms[i] = 0;
228 free(new->symsMapIndex[i]);
229 new->symsMapIndex[i] = NULL;
230 free(new->symsMapNumEntries[i]);
231 new->symsMapNumEntries[i] = NULL;
232 new->numLevels[i] = 0;
235 memcpy(new->acts[i], old->acts[i],
236 width * sizeof(union xkb_action));
243 /***====================================================================***/
245 typedef struct _ModMapEntry
252 unsigned long keyName;
257 #define SYMBOLS_INIT_SIZE 110
258 #define SYMBOLS_CHUNK 20
259 typedef struct _SymbolsInfo
261 char *name; /* e.g. pc+us+inet(evdev) */
265 unsigned explicit_group;
273 xkb_atom_t groupNames[XkbNumKbdGroups];
280 InitSymbolsInfo(SymbolsInfo * info, struct xkb_desc * xkb)
285 info->explicit_group = 0;
286 info->errorCount = 0;
288 info->merge = MergeOverride;
290 info->szKeys = SYMBOLS_INIT_SIZE;
292 info->keys = uTypedCalloc(SYMBOLS_INIT_SIZE, KeyInfo);
294 for (i = 0; i < XkbNumKbdGroups; i++)
295 info->groupNames[i] = XKB_ATOM_NONE;
296 InitKeyInfo(&info->dflt);
297 InitVModInfo(&info->vmods, xkb);
299 info->aliases = NULL;
303 FreeSymbolsInfo(SymbolsInfo * info)
310 for (i = 0; i < info->nKeys; i++)
311 FreeKeyInfo(&info->keys[i]);
315 ClearCommonInfo(&info->modMap->defs);
317 ClearAliases(&info->aliases);
318 memset(info, 0, sizeof(SymbolsInfo));
322 ResizeKeyGroup(KeyInfo * key, unsigned int group, unsigned int numLevels,
323 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;
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 from->numLevels[group],
407 into->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, KeyInfo * into, KeyInfo * from)
586 unsigned collide = 0;
589 if (from->defs.merge == MergeReplace)
591 for (i = 0; i < XkbNumKbdGroups; i++)
593 if (into->numLevels[i] != 0)
600 memset(from, 0, sizeof(KeyInfo));
603 report = ((warningLevel > 9) ||
604 ((into->defs.fileID == from->defs.fileID)
605 && (warningLevel > 0)));
606 for (i = 0; i < XkbNumKbdGroups; i++)
608 if (from->numLevels[i] > 0)
610 if (into->numLevels[i] == 0)
612 into->numLevels[i] = from->numLevels[i];
613 into->syms[i] = from->syms[i];
614 into->sizeSyms[i] = from->sizeSyms[i];
615 into->symsMapIndex[i] = from->symsMapIndex[i];
616 into->symsMapNumEntries[i] = from->symsMapNumEntries[i];
617 into->acts[i] = from->acts[i];
618 into->symsDefined |= (1 << i);
619 from->syms[i] = NULL;
620 from->sizeSyms[i] = 0;
621 from->symsMapIndex[i] = NULL;
622 from->symsMapNumEntries[i] = NULL;
623 from->acts[i] = NULL;
624 from->numLevels[i] = 0;
625 from->symsDefined &= ~(1 << i);
627 into->defs.defined |= _Key_Syms;
629 into->defs.defined |= _Key_Acts;
636 collide |= _Key_Syms;
638 collide |= _Key_Acts;
640 MergeKeyGroups(info, into, from, (unsigned) i);
643 if (from->types[i] != XKB_ATOM_NONE)
645 if ((into->types[i] != XKB_ATOM_NONE) && report &&
646 (into->types[i] != from->types[i]))
648 xkb_atom_t use, ignore;
649 collide |= _Key_Types;
650 if (from->defs.merge != MergeAugment)
652 use = from->types[i];
653 ignore = into->types[i];
657 use = into->types[i];
658 ignore = from->types[i];
661 ("Multiple definitions for group %d type of key %s\n",
662 i, longText(into->name));
663 ACTION("Using %s, ignoring %s\n",
665 XkbcAtomText(ignore));
667 if ((from->defs.merge != MergeAugment)
668 || (into->types[i] == XKB_ATOM_NONE))
670 into->types[i] = from->types[i];
674 if (UseNewField(_Key_Behavior, &into->defs, &from->defs, &collide))
676 into->behavior = from->behavior;
677 into->defs.defined |= _Key_Behavior;
679 if (UseNewField(_Key_VModMap, &into->defs, &from->defs, &collide))
681 into->vmodmap = from->vmodmap;
682 into->defs.defined |= _Key_VModMap;
684 if (UseNewField(_Key_Repeat, &into->defs, &from->defs, &collide))
686 into->repeat = from->repeat;
687 into->defs.defined |= _Key_Repeat;
689 if (UseNewField(_Key_Type_Dflt, &into->defs, &from->defs, &collide))
691 into->dfltType = from->dfltType;
692 into->defs.defined |= _Key_Type_Dflt;
694 if (UseNewField(_Key_GroupInfo, &into->defs, &from->defs, &collide))
696 into->groupInfo = from->groupInfo;
697 into->defs.defined |= _Key_GroupInfo;
701 WARN("Symbol map for key %s redefined\n",
702 longText(into->name));
703 ACTION("Using %s definition for conflicting fields\n",
704 (from->defs.merge == MergeAugment ? "first" : "last"));
710 AddKeySymbols(SymbolsInfo * info, KeyInfo * key, struct xkb_desc * xkb)
713 unsigned long real_name;
715 for (i = 0; i < info->nKeys; i++)
717 if (info->keys[i].name == key->name)
718 return MergeKeys(info, &info->keys[i], key);
720 if (FindKeyNameForAlias(xkb, key->name, &real_name))
722 for (i = 0; i < info->nKeys; i++)
724 if (info->keys[i].name == real_name)
725 return MergeKeys(info, &info->keys[i], key);
728 if (info->nKeys >= info->szKeys)
730 info->szKeys += SYMBOLS_CHUNK;
732 uTypedRecalloc(info->keys, info->nKeys, info->szKeys, KeyInfo);
735 WSGO("Could not allocate key symbols descriptions\n");
736 ACTION("Some key symbols definitions may be lost\n");
740 return CopyKeyInfo(key, &info->keys[info->nKeys++], True);
744 AddModMapEntry(SymbolsInfo * info, ModMapEntry * new)
749 clobber = (new->defs.merge != MergeAugment);
750 for (mm = info->modMap; mm != NULL; mm = (ModMapEntry *) mm->defs.next)
752 if (new->haveSymbol && mm->haveSymbol
753 && (new->u.keySym == mm->u.keySym))
755 unsigned use, ignore;
756 if (mm->modifier != new->modifier)
761 ignore = mm->modifier;
766 ignore = new->modifier;
769 ("%s added to symbol map for multiple modifiers\n",
770 XkbcKeysymText(new->u.keySym));
771 ACTION("Using %s, ignoring %s.\n",
772 XkbcModIndexText(use),
773 XkbcModIndexText(ignore));
778 if ((!new->haveSymbol) && (!mm->haveSymbol) &&
779 (new->u.keyName == mm->u.keyName))
781 unsigned use, ignore;
782 if (mm->modifier != new->modifier)
787 ignore = mm->modifier;
792 ignore = new->modifier;
794 ERROR("Key %s added to map for multiple modifiers\n",
795 longText(new->u.keyName));
796 ACTION("Using %s, ignoring %s.\n",
797 XkbcModIndexText(use),
798 XkbcModIndexText(ignore));
804 mm = uTypedAlloc(ModMapEntry);
807 WSGO("Could not allocate modifier map entry\n");
808 ACTION("Modifier map for %s will be incomplete\n",
809 XkbcModIndexText(new->modifier));
813 mm->defs.next = &info->modMap->defs;
818 /***====================================================================***/
821 MergeIncludedSymbols(SymbolsInfo * into, SymbolsInfo * from,
822 unsigned merge, struct xkb_desc * xkb)
827 if (from->errorCount > 0)
829 into->errorCount += from->errorCount;
832 if (into->name == NULL)
834 into->name = from->name;
837 for (i = 0; i < XkbNumKbdGroups; i++)
839 if (from->groupNames[i] != XKB_ATOM_NONE)
841 if ((merge != MergeAugment) ||
842 (into->groupNames[i] == XKB_ATOM_NONE))
843 into->groupNames[i] = from->groupNames[i];
846 for (i = 0, key = from->keys; i < from->nKeys; i++, key++)
848 if (merge != MergeDefault)
849 key->defs.merge = merge;
850 if (!AddKeySymbols(into, key, xkb))
853 if (from->modMap != NULL)
855 ModMapEntry *mm, *next;
856 for (mm = from->modMap; mm != NULL; mm = next)
858 if (merge != MergeDefault)
859 mm->defs.merge = merge;
860 if (!AddModMapEntry(into, mm))
862 next = (ModMapEntry *) mm->defs.next;
867 if (!MergeAliases(&into->aliases, &from->aliases, merge))
871 typedef void (*FileHandler) (XkbFile * /* rtrn */ ,
872 struct xkb_desc * /* xkb */ ,
873 unsigned /* merge */ ,
874 SymbolsInfo * /* included */
878 HandleIncludeSymbols(IncludeStmt * stmt,
879 struct xkb_desc * xkb, SymbolsInfo * info, FileHandler hndlr)
883 SymbolsInfo included;
887 if ((stmt->file == NULL) && (stmt->map == NULL))
891 memset(info, 0, sizeof(SymbolsInfo));
893 else if (ProcessIncludeFile(xkb->context, stmt, XkmSymbolsIndex, &rtrn,
896 InitSymbolsInfo(&included, xkb);
897 included.fileID = included.dflt.defs.fileID = rtrn->id;
898 included.merge = included.dflt.defs.merge = MergeOverride;
901 included.explicit_group = atoi(stmt->modifier) - 1;
905 included.explicit_group = info->explicit_group;
907 (*hndlr) (rtrn, xkb, MergeOverride, &included);
908 if (stmt->stmt != NULL)
911 included.name = stmt->stmt;
918 info->errorCount += 10;
921 if ((stmt->next != NULL) && (included.errorCount < 1))
925 SymbolsInfo next_incl;
927 for (next = stmt->next; next != NULL; next = next->next)
929 if ((next->file == NULL) && (next->map == NULL))
932 MergeIncludedSymbols(&included, info, next->merge, xkb);
933 FreeSymbolsInfo(info);
935 else if (ProcessIncludeFile(xkb->context, next, XkmSymbolsIndex,
938 InitSymbolsInfo(&next_incl, xkb);
939 next_incl.fileID = next_incl.dflt.defs.fileID = rtrn->id;
940 next_incl.merge = next_incl.dflt.defs.merge = MergeOverride;
943 next_incl.explicit_group = atoi(next->modifier) - 1;
947 next_incl.explicit_group = info->explicit_group;
949 (*hndlr) (rtrn, xkb, MergeOverride, &next_incl);
950 MergeIncludedSymbols(&included, &next_incl, op, xkb);
951 FreeSymbolsInfo(&next_incl);
956 info->errorCount += 10;
957 FreeSymbolsInfo(&included);
964 info->errorCount += included.errorCount;
970 MergeIncludedSymbols(info, &included, newMerge, xkb);
971 FreeSymbolsInfo(&included);
973 return (info->errorCount == 0);
980 GetGroupIndex(KeyInfo * key,
981 ExprDef * arrayNdx, unsigned what, unsigned *ndx_rtrn)
991 if (arrayNdx == NULL)
996 defined = key->symsDefined;
998 defined = key->actsDefined;
1000 for (i = 0; i < XkbNumKbdGroups; i++)
1002 if ((defined & (1 << i)) == 0)
1008 ERROR("Too many groups of %s for key %s (max %d)\n", name,
1009 longText(key->name), XkbNumKbdGroups + 1);
1010 ACTION("Ignoring %s defined for extra groups\n", name);
1013 if (!ExprResolveGroup(arrayNdx, &tmp))
1015 ERROR("Illegal group index for %s of key %s\n", name,
1016 longText(key->name));
1017 ACTION("Definition with non-integer array index ignored\n");
1020 *ndx_rtrn = tmp.uval - 1;
1025 AddSymbolsToKey(KeyInfo * key,
1026 struct xkb_desc * xkb,
1028 ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
1030 unsigned ndx, nSyms, nLevels;
1034 if (!GetGroupIndex(key, arrayNdx, SYMBOLS, &ndx))
1038 key->symsDefined |= (1 << ndx);
1041 if (value->op != ExprKeysymList)
1043 ERROR("Expected a list of symbols, found %s\n", exprOpText(value->op));
1044 ACTION("Ignoring symbols for group %d of %s\n", ndx + 1,
1045 longText(key->name));
1048 if (key->sizeSyms[ndx] != 0)
1050 ERROR("Symbols for key %s, group %d already defined\n",
1051 longText(key->name), ndx + 1);
1052 ACTION("Ignoring duplicate definition\n");
1055 nSyms = value->value.list.nSyms;
1056 nLevels = value->value.list.nLevels;
1057 if (((key->numLevels[ndx] < nSyms) || (key->syms[ndx] == NULL)) &&
1058 (!ResizeKeyGroup(key, ndx, nLevels, nSyms, False)))
1060 WSGO("Could not resize group %d of key %s to contain %d levels\n",
1061 ndx + 1, longText(key->name), nSyms);
1062 ACTION("Symbols lost\n");
1065 key->symsDefined |= (1 << ndx);
1066 for (i = 0; i < nLevels; i++) {
1067 key->symsMapIndex[ndx][i] = value->value.list.symsMapIndex[i];
1068 key->symsMapNumEntries[ndx][i] = 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(value->value.list.syms[value->value.list.symsMapIndex[i] + j],
1073 &key->syms[ndx][key->symsMapIndex[ndx][i] + j])) {
1074 WARN("Could not resolve keysym %s for key %s, group %d (%s), level %d\n",
1075 value->value.list.syms[i], longText(key->name), ndx + 1,
1076 XkbcAtomText(info->groupNames[ndx]), nSyms);
1078 key->syms[ndx][key->symsMapIndex[ndx][i] + j] = NoSymbol;
1079 key->symsMapIndex[ndx][i] = -1;
1080 key->symsMapNumEntries[ndx][i] = 0;
1085 for (j = key->numLevels[ndx] - 1;
1086 j >= 0 && key->symsMapNumEntries[ndx][j] == 0; j--)
1087 key->numLevels[ndx]--;
1092 AddActionsToKey(KeyInfo * key,
1093 struct xkb_desc * xkb,
1095 ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
1098 unsigned ndx, nActs;
1100 struct xkb_any_action *toAct;
1102 if (!GetGroupIndex(key, arrayNdx, ACTIONS, &ndx))
1107 key->actsDefined |= (1 << ndx);
1110 if (value->op != ExprActionList)
1112 WSGO("Bad expression type (%d) for action list value\n", value->op);
1113 ACTION("Ignoring actions for group %d of %s\n", ndx,
1114 longText(key->name));
1117 if (key->acts[ndx] != NULL)
1119 WSGO("Actions for key %s, group %d already defined\n",
1120 longText(key->name), ndx);
1123 for (nActs = 0, act = value->value.child; act != NULL; nActs++)
1125 act = (ExprDef *) act->common.next;
1129 WSGO("Action list but not actions in AddActionsToKey\n");
1132 if (((key->numLevels[ndx] < nActs) || (key->acts[ndx] == NULL)) &&
1133 (!ResizeKeyGroup(key, ndx, nActs, nActs, True)))
1135 WSGO("Could not resize group %d of key %s\n", ndx,
1136 longText(key->name));
1137 ACTION("Actions lost\n");
1140 key->actsDefined |= (1 << ndx);
1142 toAct = (struct xkb_any_action *) key->acts[ndx];
1143 act = value->value.child;
1144 for (i = 0; i < nActs; i++, toAct++)
1146 if (!HandleActionDef(act, xkb, toAct, MergeOverride, info->action))
1148 ERROR("Illegal action definition for %s\n",
1149 longText(key->name));
1150 ACTION("Action for group %d/level %d ignored\n", ndx + 1, i + 1);
1152 act = (ExprDef *) act->common.next;
1157 static const LookupEntry lockingEntries[] = {
1158 {"true", XkbKB_Lock},
1159 {"yes", XkbKB_Lock},
1161 {"false", XkbKB_Default},
1162 {"no", XkbKB_Default},
1163 {"off", XkbKB_Default},
1164 {"permanent", XkbKB_Lock | XkbKB_Permanent},
1168 static const LookupEntry repeatEntries[] = {
1169 {"true", RepeatYes},
1172 {"false", RepeatNo},
1175 {"default", RepeatUndefined},
1180 SetSymbolsField(KeyInfo * key,
1181 struct xkb_desc * xkb,
1183 ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
1188 if (strcasecmp(field, "type") == 0)
1191 if ((!ExprResolveString(value, &tmp))
1192 && (warningLevel > 0))
1194 WARN("The type field of a key symbol map must be a string\n");
1195 ACTION("Ignoring illegal type definition\n");
1197 if (arrayNdx == NULL)
1199 key->dfltType = xkb_intern_atom(tmp.str);
1200 key->defs.defined |= _Key_Type_Dflt;
1202 else if (!ExprResolveGroup(arrayNdx, &ndx))
1204 ERROR("Illegal group index for type of key %s\n",
1205 longText(key->name));
1206 ACTION("Definition with non-integer array index ignored\n");
1212 key->types[ndx.uval - 1] = xkb_intern_atom(tmp.str);
1213 key->typesDefined |= (1 << (ndx.uval - 1));
1217 else if (strcasecmp(field, "symbols") == 0)
1218 return AddSymbolsToKey(key, xkb, field, arrayNdx, value, info);
1219 else if (strcasecmp(field, "actions") == 0)
1220 return AddActionsToKey(key, xkb, field, arrayNdx, value, info);
1221 else if ((strcasecmp(field, "vmods") == 0) ||
1222 (strcasecmp(field, "virtualmods") == 0) ||
1223 (strcasecmp(field, "virtualmodifiers") == 0))
1225 ok = ExprResolveVModMask(value, &tmp, xkb);
1228 key->vmodmap = (tmp.uval >> 8);
1229 key->defs.defined |= _Key_VModMap;
1233 ERROR("Expected a virtual modifier mask, found %s\n",
1234 exprOpText(value->op));
1235 ACTION("Ignoring virtual modifiers definition for key %s\n",
1236 longText(key->name));
1239 else if ((strcasecmp(field, "locking") == 0) ||
1240 (strcasecmp(field, "lock") == 0) ||
1241 (strcasecmp(field, "locks") == 0))
1243 ok = ExprResolveEnum(value, &tmp, lockingEntries);
1245 key->behavior.type = tmp.uval;
1246 key->defs.defined |= _Key_Behavior;
1248 else if ((strcasecmp(field, "radiogroup") == 0) ||
1249 (strcasecmp(field, "permanentradiogroup") == 0) ||
1250 (strcasecmp(field, "allownone") == 0))
1252 ERROR("Radio groups not supported\n");
1253 ACTION("Ignoring radio group specification for key %s\n", longText(key->name));
1256 else if (uStrCasePrefix("overlay", field) ||
1257 uStrCasePrefix("permanentoverlay", field))
1259 ERROR("Overlays not supported\n");
1260 ACTION("Ignoring overlay specification for key %s\n", longText(key->name));
1262 else if ((strcasecmp(field, "repeating") == 0) ||
1263 (strcasecmp(field, "repeats") == 0) ||
1264 (strcasecmp(field, "repeat") == 0))
1266 ok = ExprResolveEnum(value, &tmp, repeatEntries);
1269 ERROR("Illegal repeat setting for %s\n",
1270 longText(key->name));
1271 ACTION("Non-boolean repeat setting ignored\n");
1274 key->repeat = tmp.uval;
1275 key->defs.defined |= _Key_Repeat;
1277 else if ((strcasecmp(field, "groupswrap") == 0) ||
1278 (strcasecmp(field, "wrapgroups") == 0))
1280 ok = ExprResolveBoolean(value, &tmp);
1283 ERROR("Illegal groupsWrap setting for %s\n",
1284 longText(key->name));
1285 ACTION("Non-boolean value ignored\n");
1289 key->groupInfo = XkbWrapIntoRange;
1291 key->groupInfo = XkbClampIntoRange;
1292 key->defs.defined |= _Key_GroupInfo;
1294 else if ((strcasecmp(field, "groupsclamp") == 0) ||
1295 (strcasecmp(field, "clampgroups") == 0))
1297 ok = ExprResolveBoolean(value, &tmp);
1300 ERROR("Illegal groupsClamp setting for %s\n",
1301 longText(key->name));
1302 ACTION("Non-boolean value ignored\n");
1306 key->groupInfo = XkbClampIntoRange;
1308 key->groupInfo = XkbWrapIntoRange;
1309 key->defs.defined |= _Key_GroupInfo;
1311 else if ((strcasecmp(field, "groupsredirect") == 0) ||
1312 (strcasecmp(field, "redirectgroups") == 0))
1314 if (!ExprResolveGroup(value, &tmp))
1316 ERROR("Illegal group index for redirect of key %s\n",
1317 longText(key->name));
1318 ACTION("Definition with non-integer group ignored\n");
1322 XkbSetGroupInfo(0, XkbRedirectIntoRange, tmp.uval - 1);
1323 key->defs.defined |= _Key_GroupInfo;
1327 ERROR("Unknown field %s in a symbol interpretation\n", field);
1328 ACTION("Definition ignored\n");
1335 SetGroupName(SymbolsInfo * info, ExprDef * arrayNdx, ExprDef * value)
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(arrayNdx, &tmp))
1347 ERROR("Illegal index in group name definition\n");
1348 ACTION("Definition with non-integer array index ignored\n");
1351 if (!ExprResolveString(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_intern_atom(name.str);
1365 HandleSymbolsVar(VarDef * stmt, struct xkb_desc * xkb, SymbolsInfo * info)
1367 ExprResult elem, field, tmp;
1371 if (ExprResolveLhs(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, xkb, field.str, arrayNdx,
1378 else if ((elem.str == NULL) && ((strcasecmp(field.str, "name") == 0) ||
1379 (strcasecmp(field.str, "groupname") ==
1382 ret = SetGroupName(info, arrayNdx, stmt->value);
1384 else if ((elem.str == NULL)
1385 && ((strcasecmp(field.str, "groupswrap") == 0) ||
1386 (strcasecmp(field.str, "wrapgroups") == 0)))
1388 if (!ExprResolveBoolean(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(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(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(xkb, elem.str, field.str, arrayNdx, stmt->value,
1453 HandleSymbolsBody(VarDef * def,
1454 struct xkb_desc * xkb, KeyInfo * key, SymbolsInfo * info)
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, xkb, 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(def->name, &tmp, &field, &arrayNdx);
1483 ok = SetSymbolsField(key, xkb, field.str, arrayNdx,
1492 SetExplicitGroup(SymbolsInfo * info, KeyInfo * key)
1494 unsigned group = info->explicit_group;
1499 if ((key->typesDefined | key->symsDefined | key->actsDefined) & ~1)
1502 WARN("For the map %s an explicit group specified\n", info->name);
1503 WARN("but key %s has more than one group defined\n",
1504 longText(key->name));
1505 ACTION("All groups except first one will be ignored\n");
1506 for (i = 1; i < XkbNumKbdGroups; i++)
1508 key->numLevels[i] = 0;
1510 key->syms[i] = NULL;
1512 key->acts[i] = NULL;
1516 key->typesDefined = key->symsDefined = key->actsDefined = 1 << group;
1518 key->numLevels[group] = key->numLevels[0];
1519 key->numLevels[0] = 0;
1520 key->syms[group] = key->syms[0];
1521 key->syms[0] = NULL;
1522 key->sizeSyms[group] = key->sizeSyms[0];
1523 key->sizeSyms[0] = 0;
1524 key->symsMapIndex[group] = key->symsMapIndex[0];
1525 key->symsMapIndex[0] = NULL;
1526 key->symsMapNumEntries[group] = key->symsMapNumEntries[0];
1527 key->symsMapNumEntries[0] = NULL;
1528 key->acts[group] = key->acts[0];
1529 key->acts[0] = NULL;
1530 key->types[group] = key->types[0];
1536 HandleSymbolsDef(SymbolsDef * stmt,
1537 struct xkb_desc * xkb, unsigned merge, SymbolsInfo * info)
1542 CopyKeyInfo(&info->dflt, &key, False);
1543 key.defs.merge = stmt->merge;
1544 key.name = KeyNameToLong(stmt->keyName);
1545 if (!HandleSymbolsBody((VarDef *) stmt->symbols, xkb, &key, info))
1551 if (!SetExplicitGroup(info, &key))
1557 if (!AddKeySymbols(info, &key, xkb))
1566 HandleModMapDef(ModMapDef * def,
1567 struct xkb_desc * xkb, unsigned merge, SymbolsInfo * info)
1574 if (!LookupModIndex(NULL, def->modifier, TypeInt, &rtrn))
1576 ERROR("Illegal modifier map definition\n");
1577 ACTION("Ignoring map for non-modifier \"%s\"\n",
1578 XkbcAtomText(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(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,
1610 struct xkb_desc * xkb, unsigned merge, SymbolsInfo * info)
1615 info->name = uDupString(file->name);
1619 switch (stmt->stmtType)
1622 if (!HandleIncludeSymbols((IncludeStmt *) stmt, xkb, info,
1626 case StmtSymbolsDef:
1627 if (!HandleSymbolsDef((SymbolsDef *) stmt, xkb, merge, info))
1631 if (!HandleSymbolsVar((VarDef *) stmt, xkb, info))
1635 if (!HandleVModDef((VModDef *) stmt, xkb, merge, &info->vmods))
1639 ERROR("Interpretation files may not include other types\n");
1640 ACTION("Ignoring definition of symbol interpretation\n");
1643 case StmtKeycodeDef:
1644 ERROR("Interpretation files may not include other types\n");
1645 ACTION("Ignoring definition of key name\n");
1649 if (!HandleModMapDef((ModMapDef *) stmt, xkb, merge, info))
1653 WSGO("Unexpected statement type %d in HandleSymbolsFile\n",
1658 if (info->errorCount > 10)
1661 ERROR("Too many errors\n");
1663 ACTION("Abandoning symbols file \"%s\"\n", file->topName);
1670 FindKeyForSymbol(struct xkb_desc * xkb, xkb_keysym_t sym, xkb_keycode_t *kc_rtrn)
1673 unsigned int group, level;
1675 for (key = xkb->min_key_code; key <= xkb->max_key_code; key++)
1677 for (group = 0; group < XkbKeyNumGroups(xkb, key); group++)
1679 for (level = 0; level < XkbKeyGroupWidth(xkb, key, group); level++)
1681 if (XkbKeyNumSyms(xkb, key, group, level) != 1 ||
1682 (XkbKeySymEntry(xkb, key, group, level))[0] != sym)
1694 * Find the given name in the xkb->map->types and return its index.
1696 * @param atom The atom to search for.
1697 * @param type_rtrn Set to the index of the name if found.
1699 * @return True if found, False otherwise.
1702 FindNamedType(struct xkb_desc * xkb, xkb_atom_t atom, unsigned *type_rtrn)
1705 const char *name = XkbcAtomText(atom);
1707 if (xkb && xkb->map && xkb->map->types)
1709 for (n = 0; n < xkb->map->num_types; n++)
1711 if (strcmp(xkb->map->types[n].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(int width, xkb_keysym_t * syms, xkb_atom_t * typeNameRtrn,
1742 if ((width == 1) || (width == 0))
1744 *typeNameRtrn = xkb_intern_atom("ONE_LEVEL");
1747 else if (width == 2)
1749 if (syms && XkbcKSIsLower(syms[0]) && XkbcKSIsUpper(syms[1]))
1751 *typeNameRtrn = xkb_intern_atom("ALPHABETIC");
1753 else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1])))
1755 *typeNameRtrn = xkb_intern_atom("KEYPAD");
1760 *typeNameRtrn = xkb_intern_atom("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_intern_atom("FOUR_LEVEL_ALPHABETIC");
1771 *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL_SEMIALPHABETIC");
1773 else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1])))
1774 *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL_KEYPAD");
1776 *typeNameRtrn = xkb_intern_atom("FOUR_LEVEL");
1777 /* XXX: why not set autoType here? */
1779 return ((width >= 0) && (width <= 4));
1783 * Ensure the given KeyInfo is in a coherent state, i.e. no gaps between the
1784 * groups, and reduce to one group if all groups are identical anyway.
1787 PrepareKeyDef(KeyInfo * key)
1789 int i, j, width, defined, lastGroup;
1792 defined = key->symsDefined | key->actsDefined | key->typesDefined;
1793 /* get highest group number */
1794 for (i = XkbNumKbdGroups - 1; i >= 0; i--)
1796 if (defined & (1 << i))
1804 /* If there are empty groups between non-empty ones fill them with data */
1805 /* from the first group. */
1806 /* We can make a wrong assumption here. But leaving gaps is worse. */
1807 for (i = lastGroup; i > 0; i--)
1809 if (defined & (1 << i))
1811 width = key->numLevels[0];
1812 if (key->typesDefined & 1)
1814 for (j = 0; j < width; j++)
1816 key->types[i] = key->types[0];
1818 key->typesDefined |= 1 << i;
1820 if ((key->actsDefined & 1) && key->acts[0])
1822 key->acts[i] = uTypedCalloc(width, union xkb_action);
1823 if (key->acts[i] == NULL)
1825 memcpy(key->acts[i], key->acts[0],
1826 width * sizeof(union xkb_action));
1827 key->actsDefined |= 1 << i;
1829 if ((key->symsDefined & 1) && key->sizeSyms[0])
1831 key->syms[i] = uTypedCalloc(key->sizeSyms[0], xkb_keysym_t);
1832 if (key->syms[i] == NULL)
1834 memcpy(key->syms[i], key->syms[0],
1835 key->sizeSyms[0] * sizeof(xkb_keysym_t));
1836 key->symsMapIndex[i] = uTypedCalloc(width, int);
1837 if (!key->symsMapIndex[i])
1840 key->syms[i] = NULL;
1843 memcpy(key->symsMapIndex[i], key->symsMapIndex[0],
1844 width * sizeof(int));
1845 key->symsMapNumEntries[i] = uTypedCalloc(width, unsigned int);
1846 if (!key->symsMapNumEntries[i])
1849 key->syms[i] = NULL;
1850 free(key->symsMapIndex[i]);
1851 key->symsMapIndex[i] = NULL;
1854 memcpy(key->symsMapNumEntries[i], key->symsMapNumEntries[0],
1855 width * sizeof(int));
1856 key->sizeSyms[i] = key->sizeSyms[0];
1857 key->symsDefined |= 1 << i;
1861 key->numLevels[i] = key->numLevels[0];
1864 /* If all groups are completely identical remove them all */
1865 /* exept the first one. */
1867 for (i = lastGroup; i > 0; i--)
1869 if ((key->numLevels[i] != key->numLevels[0]) ||
1870 (key->types[i] != key->types[0]))
1875 if ((key->syms[i] != key->syms[0]) &&
1876 (key->syms[i] == NULL || key->syms[0] == NULL ||
1877 key->sizeSyms[i] != key->sizeSyms[0] ||
1878 memcmp(key->syms[i], key->syms[0],
1879 sizeof(xkb_keysym_t) * key->sizeSyms[0])))
1884 if ((key->symsMapIndex[i] != key->symsMapIndex[i]) &&
1885 (key->symsMapIndex[i] == NULL || key->symsMapIndex[0] == NULL ||
1886 memcmp(key->symsMapIndex[i], key->symsMapIndex[0],
1887 key->numLevels[0] * sizeof(int))))
1892 if ((key->symsMapNumEntries[i] != key->symsMapNumEntries[i]) &&
1893 (key->symsMapNumEntries[i] == NULL ||
1894 key->symsMapNumEntries[0] == NULL ||
1895 memcmp(key->symsMapNumEntries[i], key->symsMapNumEntries[0],
1896 key->numLevels[0] * sizeof(int))))
1901 if ((key->acts[i] != key->acts[0]) &&
1902 (key->acts[i] == NULL || key->acts[0] == NULL ||
1903 memcmp(key->acts[i], key->acts[0],
1904 sizeof(union xkb_action) * key->numLevels[0])))
1912 for (i = lastGroup; i > 0; i--)
1914 key->numLevels[i] = 0;
1916 key->syms[i] = NULL;
1917 key->sizeSyms[i] = 0;
1918 free(key->symsMapIndex[i]);
1919 key->symsMapIndex[i] = NULL;
1920 free(key->symsMapNumEntries[i]);
1921 key->symsMapNumEntries[i] = NULL;
1923 key->acts[i] = NULL;
1926 key->symsDefined &= 1;
1927 key->actsDefined &= 1;
1928 key->typesDefined &= 1;
1933 * Copy the KeyInfo into the keyboard description.
1935 * This function recurses.
1938 CopySymbolsDef(struct xkb_desc * xkb, KeyInfo *key, int start_from)
1942 unsigned int sizeSyms = 0;
1943 unsigned width, tmp, nGroups;
1944 struct xkb_key_type * type;
1945 Bool haveActions, autoType, useAlias;
1946 xkb_keysym_t *outSyms;
1947 union xkb_action *outActs;
1948 unsigned types[XkbNumKbdGroups];
1949 unsigned int symIndex = 0;
1951 useAlias = (start_from == 0);
1953 /* get the keycode for the key. */
1954 if (!FindNamedKey(xkb, key->name, &kc, useAlias, CreateKeyNames(xkb),
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(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 XkbcAtomText(key->types[i]),
1992 longText(key->name), kc);
1996 if (FindNamedType(xkb, key->types[i], &types[i]))
1998 if (!autoType || key->numLevels[i] > 2)
1999 xkb->server->explicit[kc] |= (1 << i);
2003 if (warningLevel >= 3)
2005 WARN("Type \"%s\" is not defined\n",
2006 XkbcAtomText(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 = &xkb->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 XkbcAtomText(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(xkb, kc, sizeSyms))
2034 WSGO("Could not enlarge symbols for %s (keycode %d)\n",
2035 longText(key->name), kc);
2040 outActs = XkbcResizeKeyActions(xkb, kc, width * nGroups);
2041 if (outActs == NULL)
2043 WSGO("Could not enlarge actions for %s (key %d)\n",
2044 longText(key->name), kc);
2047 xkb->server->explicit[kc] |= XkbExplicitInterpretMask;
2051 if (key->defs.defined & _Key_GroupInfo)
2054 i = xkb->map->key_sym_map[kc].group_info;
2056 xkb->map->key_sym_map[kc].group_info = XkbSetNumGroups(i, nGroups);
2057 xkb->map->key_sym_map[kc].width = width;
2058 xkb->map->key_sym_map[kc].sym_index = uTypedCalloc(nGroups * width, int);
2059 xkb->map->key_sym_map[kc].num_syms = uTypedCalloc(nGroups * width,
2061 for (i = 0; i < nGroups; i++)
2063 /* assign kt_index[i] to the index of the type in map->types.
2064 * kt_index[i] may have been set by a previous run (if we have two
2065 * layouts specified). Let's not overwrite it with the ONE_LEVEL
2066 * default group if we dont even have keys for this group anyway.
2068 * FIXME: There should be a better fix for this.
2070 if (key->numLevels[i])
2071 xkb->map->key_sym_map[kc].kt_index[i] = types[i];
2072 if (key->sizeSyms[i] != 0)
2074 /* fill key to "width" symbols*/
2075 for (tmp = 0; tmp < width; tmp++)
2077 if (tmp < key->numLevels[i] && key->symsMapNumEntries[i][tmp])
2079 memcpy(&xkb->map->key_sym_map[kc].syms[symIndex],
2080 &key->syms[i][key->symsMapIndex[i][tmp]],
2081 key->symsMapNumEntries[i][tmp] *
2082 sizeof(xkb_keysym_t));
2083 xkb->map->key_sym_map[kc].sym_index[(i * width) + tmp] =
2085 xkb->map->key_sym_map[kc].num_syms[(i * width) + tmp] =
2086 key->symsMapNumEntries[i][tmp];
2088 xkb->map->key_sym_map[kc].num_syms[(i * width) + tmp];
2092 xkb->map->key_sym_map[kc].sym_index[(i * width) + tmp] = -1;
2093 xkb->map->key_sym_map[kc].num_syms[(i * width) + tmp] = 0;
2095 if ((outActs != NULL) && (key->acts[i] != NULL))
2097 if (tmp < key->numLevels[i])
2098 outActs[tmp] = key->acts[i][tmp];
2100 outActs[tmp].type = XkbSA_NoAction;
2105 switch (key->behavior.type & XkbKB_OpMask)
2110 xkb->server->behaviors[kc] = key->behavior;
2111 xkb->server->explicit[kc] |= XkbExplicitBehaviorMask;
2114 if (key->defs.defined & _Key_VModMap)
2116 xkb->server->vmodmap[kc] = key->vmodmap;
2117 xkb->server->explicit[kc] |= XkbExplicitVModMapMask;
2119 if (key->repeat != RepeatUndefined)
2121 if (key->repeat == RepeatYes)
2122 xkb->ctrls->per_key_repeat[kc / 8] |= (1 << (kc % 8));
2124 xkb->ctrls->per_key_repeat[kc / 8] &= ~(1 << (kc % 8));
2125 xkb->server->explicit[kc] |= XkbExplicitAutoRepeatMask;
2128 if (nGroups > xkb->ctrls->num_groups)
2129 xkb->ctrls->num_groups = nGroups;
2131 /* do the same thing for the next key */
2132 CopySymbolsDef(xkb, key, kc + 1);
2137 CopyModMapDef(struct xkb_desc * xkb, ModMapEntry *entry)
2141 if ((!entry->haveSymbol)
2144 (xkb, entry->u.keyName, &kc, True, CreateKeyNames(xkb), 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(xkb, 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 xkb->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 xkb Handle to the keyboard description to store the symbols in.
2176 * @param merge Merge strategy (e.g. MergeOverride).
2179 CompileSymbols(XkbFile *file, struct xkb_desc * xkb, unsigned merge)
2184 InitSymbolsInfo(&info, xkb);
2185 info.dflt.defs.fileID = file->id;
2186 info.dflt.defs.merge = merge;
2187 HandleSymbolsFile(file, xkb, merge, &info);
2189 if (info.nKeys == 0) {
2190 FreeSymbolsInfo(&info);
2194 if (info.errorCount == 0)
2198 /* alloc memory in the xkb struct */
2199 if (XkbcAllocNames(xkb, XkbGroupNamesMask, 0) != Success)
2201 WSGO("Can not allocate names in CompileSymbols\n");
2202 ACTION("Symbols not added\n");
2205 if (XkbcAllocClientMap(xkb, XkbKeySymsMask | XkbModifierMapMask, 0)
2208 WSGO("Could not allocate client map in CompileSymbols\n");
2209 ACTION("Symbols not added\n");
2212 if (XkbcAllocServerMap(xkb, XkbAllServerInfoMask, 32) != Success)
2214 WSGO("Could not allocate server map in CompileSymbols\n");
2215 ACTION("Symbols not added\n");
2218 if (XkbcAllocControls(xkb, XkbPerKeyRepeatMask) != Success)
2220 WSGO("Could not allocate controls in CompileSymbols\n");
2221 ACTION("Symbols not added\n");
2225 /* now copy info into xkb. */
2227 ApplyAliases(xkb, &info.aliases);
2228 for (i = 0; i < XkbNumKbdGroups; i++)
2230 if (info.groupNames[i] != XKB_ATOM_NONE)
2232 free(UNCONSTIFY(xkb->names->groups[i]));
2233 xkb->names->groups[i] = XkbcAtomGetString(info.groupNames[i]);
2237 for (key = info.keys, i = 0; i < info.nKeys; i++, key++)
2242 for (key = info.keys, i = 0; i < info.nKeys; i++, key++)
2244 if (!CopySymbolsDef(xkb, key, 0))
2247 if (warningLevel > 3)
2249 for (i = xkb->min_key_code; i <= xkb->max_key_code; i++)
2251 if (xkb->names->keys[i].name[0] == '\0')
2253 if (XkbKeyNumGroups(xkb, i) < 1)
2256 memcpy(buf, xkb->names->keys[i].name, 4);
2259 ("No symbols defined for <%s> (keycode %d)\n",
2266 ModMapEntry *mm, *next;
2267 for (mm = info.modMap; mm != NULL; mm = next)
2269 if (!CopyModMapDef(xkb, mm))
2271 next = (ModMapEntry *) mm->defs.next;
2274 FreeSymbolsInfo(&info);
2278 FreeSymbolsInfo(&info);