types: don't use canonical/required types
authorRan Benita <ran234@gmail.com>
Wed, 1 Aug 2012 21:29:07 +0000 (00:29 +0300)
committerRan Benita <ran234@gmail.com>
Tue, 7 Aug 2012 10:20:37 +0000 (13:20 +0300)
Xkb required every keymap to have at least the four following canonical
types: ONE_LEVEL, TWO_LEVEL, ALPHABETIC, KEYPAD. This is specified in
e.g. the kbproto spec and XkbKeyTypesForCoreSymbols(3) man page.

If these types are not specified in the keymap, the code specifically
checks for them and adds them to the 4 first places in the types array,
such that they exist in every keymap. These are also the types (along
with some non-required 4-level ones) that are automatically assigned to
keys which do not explicitly declare a type (see FindAutomaticType in
symbols.c, this commit doesn't touch these heuristics, whcih are also not
very nice but necessary).

The xkeyboard-config does not rely on the builtin xkbcomp definitions of
these types and does specify them explicitly, in types/basic and
types/numpad, which are virtually always included.

This commit removes the special behavior:
- The code is ugly and makes keytypes.c harder to read.
- The code practically never gets run - everyone who uses
  xkeyboard-config or a keymap based upon it (i.e. everyone) doesn't need
  it. So it doesn't get tested.
- It mixes policy with implementation for not very good reasons, it
  seems mostly for default compatibility with X11 core.
- And of course we don't need to remain compatible with Xkb ABI neither.

Instead, if we read a keymap with no types specified at all, we simply
assign all keys a default one-level type (like ONE_LEVEL), and issue
plenty of warnings to make it clear (with verbosity >= 3). Note that
this default can actually be changed from within the keymap, by writing
something like
    type.modifier = Shift
    type.whatever_field = value
in the top level of the xkb_types section. (This functionality is
completely unused as well today, BTW, but makes some sense).

This change means that if someone writes a keymap from scratch and
doesn't add say ALPHABETIC, then something like <AE11> = { [ q Q ]; }; will
ignore the second level. But as stated above this should never happen.

Signed-off-by: Ran Benita <ran234@gmail.com>
src/xkbcomp/keytypes.c
src/xkbcomp/symbols.c
src/xkbcomp/vmod.c
src/xkbcomp/vmod.h
test/data/keymaps/dump.data
test/data/keymaps/no-types.xkb [new file with mode: 0644]
test/filecomp.c

index 3d8f909..757bab7 100644 (file)
@@ -159,17 +159,11 @@ typedef struct _KeyTypesInfo {
     char *name;
     int errorCount;
     unsigned file_id;
-    unsigned stdPresent;
     unsigned nTypes;
     struct list types;
     KeyTypeInfo dflt;
     VModInfo vmods;
     struct xkb_keymap *keymap;
-
-    xkb_atom_t tok_ONE_LEVEL;
-    xkb_atom_t tok_TWO_LEVEL;
-    xkb_atom_t tok_ALPHABETIC;
-    xkb_atom_t tok_KEYPAD;
 } KeyTypesInfo;
 
 /***====================================================================***/
@@ -239,20 +233,15 @@ InitKeyTypesInfo(KeyTypesInfo *info, struct xkb_keymap *keymap,
 {
     PreserveInfo *old, *new;
 
-    info->tok_ONE_LEVEL = xkb_atom_intern(keymap->ctx, "ONE_LEVEL");
-    info->tok_TWO_LEVEL = xkb_atom_intern(keymap->ctx, "TWO_LEVEL");
-    info->tok_ALPHABETIC = xkb_atom_intern(keymap->ctx, "ALPHABETIC");
-    info->tok_KEYPAD = xkb_atom_intern(keymap->ctx, "KEYPAD");
     info->name = strdup("default");
     info->errorCount = 0;
-    info->stdPresent = 0;
     info->nTypes = 0;
     list_init(&info->types);
     info->file_id = file_id;
     info->dflt.defined = 0;
     info->dflt.file_id = file_id;
     info->dflt.merge = MERGE_OVERRIDE;
-    info->dflt.name = XKB_ATOM_NONE;
+    info->dflt.name = xkb_atom_intern(keymap->ctx, "DEFAULT");
     info->dflt.mask = 0;
     info->dflt.vmask = 0;
     info->dflt.numLevels = 1;
@@ -341,33 +330,6 @@ AddKeyType(KeyTypesInfo *info, KeyTypeInfo *new)
     struct list type_entry, preserves_entry;
     int verbosity = xkb_get_log_verbosity(info->keymap->ctx);
 
-    if (new->name == info->tok_ONE_LEVEL) {
-        if (new->numLevels > 1)
-            return ReportTypeBadWidth(info, "ONE_LEVEL", new->numLevels, 1);
-        info->stdPresent |= XkbOneLevelMask;
-    }
-    else if (new->name == info->tok_TWO_LEVEL) {
-        if (new->numLevels > 2)
-            return ReportTypeBadWidth(info, "TWO_LEVEL", new->numLevels, 2);
-        else if (new->numLevels < 2)
-            new->numLevels = 2;
-        info->stdPresent |= XkbTwoLevelMask;
-    }
-    else if (new->name == info->tok_ALPHABETIC) {
-        if (new->numLevels > 2)
-            return ReportTypeBadWidth(info, "ALPHABETIC", new->numLevels, 2);
-        else if (new->numLevels < 2)
-            new->numLevels = 2;
-        info->stdPresent |= XkbAlphabeticMask;
-    }
-    else if (new->name == info->tok_KEYPAD) {
-        if (new->numLevels > 2)
-            return ReportTypeBadWidth(info, "KEYPAD", new->numLevels, 2);
-        else if (new->numLevels < 2)
-            new->numLevels = 2;
-        info->stdPresent |= XkbKeypadMask;
-    }
-
     old = FindMatchingKeyType(info, new);
     if (old) {
         if (new->merge == MERGE_REPLACE || new->merge == MERGE_OVERRIDE) {
@@ -437,8 +399,6 @@ MergeIncludedKeyTypes(KeyTypesInfo *into, KeyTypesInfo *from,
         if (!AddKeyType(into, type))
             into->errorCount++;
     }
-
-    into->stdPresent |= from->stdPresent;
 }
 
 static void
@@ -1104,176 +1064,12 @@ CopyDefToKeyType(KeyTypesInfo *info, KeyTypeInfo *def,
     return ComputeEffectiveMap(keymap, type);
 }
 
-static struct xkb_kt_map_entry map2Level[] = {
-    {
-        .level = ShiftMask,
-        .mods = { .mask = 1, .vmods = ShiftMask, .real_mods = 0 }
-    }
-};
-
-static struct xkb_kt_map_entry mapAlpha[] = {
-    {
-        .level = ShiftMask,
-        .mods = { .mask = 1, .vmods = ShiftMask, .real_mods = 0 }
-    },
-    {
-        .level = LockMask,
-        .mods = { .mask = 0, .vmods = LockMask, .real_mods = 0 }
-    }
-};
-
-static struct xkb_mods preAlpha[] = {
-    { .mask = 0, .vmods = 0, .real_mods = 0 },
-    { .mask = LockMask, .vmods = LockMask, .real_mods = 0 }
-};
-
-static struct xkb_kt_map_entry mapKeypad[] = {
-    {
-        .level = ShiftMask,
-        .mods = { .mask = 1, .vmods = ShiftMask, .real_mods = 0 }
-    },
-    {
-        .level = 0,
-        .mods = { .mask = 1, .vmods = 0, .real_mods = 0 }
-    }
-};
-
-static const struct xkb_key_type canonicalTypes[XkbNumRequiredTypes] = {
-    [XkbOneLevelIndex] = {
-        .mods = { .mask = 0, .vmods = 0, .real_mods = 0 },
-        .num_levels = 1,
-        .preserve = NULL,
-        .name = NULL,
-        .level_names = NULL
-    },
-    [XkbTwoLevelIndex] = {
-        .mods = { .mask = ShiftMask, .vmods = ShiftMask, .real_mods = 0 },
-        .num_levels = 2,
-        .map = darray_lit(map2Level),
-        .preserve = NULL,
-        .name = NULL,
-        .level_names = NULL
-    },
-    [XkbAlphabeticIndex] = {
-        .mods = {
-            .mask = ShiftMask | LockMask,
-            .vmods = ShiftMask | LockMask,
-            .real_mods = 0
-        },
-        .num_levels = 2,
-        .map = darray_lit(mapAlpha),
-        .preserve = preAlpha,
-        .name = NULL,
-        .level_names = NULL
-    },
-    [XkbKeypadIndex] = {
-        .mods = { .mask = ShiftMask, .vmods = ShiftMask, .real_mods = 0 },
-        .num_levels = 2,
-        .map = darray_lit(mapKeypad),
-        .preserve = NULL,
-        .name = NULL,
-        .level_names = NULL
-    }
-};
-
-static int
-CopyKeyType(const struct xkb_key_type *from, struct xkb_key_type *into)
-{
-    int i;
-
-    darray_free(into->map);
-    free(into->preserve);
-    free(into->level_names);
-
-    *into = *from;
-    darray_init(into->map);
-
-    darray_copy(into->map, from->map);
-
-    if (from->preserve && !darray_empty(into->map)) {
-        into->preserve = calloc(darray_size(into->map),
-                                sizeof(*into->preserve));
-        if (!into->preserve)
-            return BadAlloc;
-        memcpy(into->preserve, from->preserve,
-               darray_size(into->map) * sizeof(*into->preserve));
-    }
-
-    if (from->level_names && into->num_levels > 0) {
-        into->level_names = calloc(into->num_levels,
-                                   sizeof(*into->level_names));
-        if (!into->level_names)
-            return BadAlloc;
-
-        for (i = 0; i < into->num_levels; i++)
-            into->level_names[i] = strdup(from->level_names[i]);
-    }
-
-    return Success;
-}
-
-static int
-InitCanonicalKeyTypes(struct xkb_keymap *keymap, unsigned which,
-                      int keypadVMod)
-{
-    const struct xkb_key_type *from;
-    int rtrn;
-
-    darray_growalloc(keymap->types, XkbNumRequiredTypes);
-
-    if ((which & XkbAllRequiredTypes) == 0)
-        return Success;
-
-    rtrn = Success;
-    from = canonicalTypes;
-
-    if (which & XkbOneLevelMask)
-        rtrn = CopyKeyType(&from[XkbOneLevelIndex],
-                           &darray_item(keymap->types, XkbOneLevelIndex));
-
-    if ((which & XkbTwoLevelMask) && rtrn == Success)
-        rtrn = CopyKeyType(&from[XkbTwoLevelIndex],
-                           &darray_item(keymap->types, XkbTwoLevelIndex));
-
-    if ((which & XkbAlphabeticMask) && rtrn == Success)
-        rtrn = CopyKeyType(&from[XkbAlphabeticIndex],
-                           &darray_item(keymap->types, XkbAlphabeticIndex));
-
-    if ((which & XkbKeypadMask) && rtrn == Success) {
-        struct xkb_key_type *type;
-
-        rtrn = CopyKeyType(&from[XkbKeypadIndex],
-                           &darray_item(keymap->types, XkbKeypadIndex));
-        type = &darray_item(keymap->types, XkbKeypadIndex);
-
-        if (keypadVMod >= 0 && keypadVMod < XkbNumVirtualMods &&
-            rtrn == Success) {
-            struct xkb_kt_map_entry *entry;
-            type->mods.vmods = (1 << keypadVMod);
-
-            entry = &darray_item(type->map, 0);
-            entry->mods.mask = ShiftMask;
-            entry->mods.real_mods = ShiftMask;
-            entry->mods.vmods = 0;
-            entry->level = 1;
-
-            entry = &darray_item(type->map, 1);
-            entry->mods.mask = 0;
-            entry->mods.real_mods = 0;
-            entry->mods.vmods = (1 << keypadVMod);
-            entry->level = 1;
-        }
-    }
-
-    return Success;
-}
-
 bool
 CompileKeyTypes(XkbFile *file, struct xkb_keymap *keymap,
                 enum merge_mode merge)
 {
     unsigned int i;
-    struct xkb_key_type *type, *next;
+    struct xkb_key_type *type;
     KeyTypesInfo info;
     KeyTypeInfo *def;
 
@@ -1287,56 +1083,11 @@ CompileKeyTypes(XkbFile *file, struct xkb_keymap *keymap,
     if (info.name)
         keymap->types_section_name = strdup(info.name);
 
-    i = info.nTypes;
-    if ((info.stdPresent & XkbOneLevelMask) == 0)
-        i++;
-    if ((info.stdPresent & XkbTwoLevelMask) == 0)
-        i++;
-    if ((info.stdPresent & XkbKeypadMask) == 0)
-        i++;
-    if ((info.stdPresent & XkbAlphabeticMask) == 0)
-        i++;
+    darray_resize0(keymap->types, info.nTypes ? info.nTypes : 1);
 
-    darray_resize0(keymap->types, i);
-
-    if (XkbAllRequiredTypes & (~info.stdPresent)) {
-        unsigned missing, keypadVMod;
-
-        missing = XkbAllRequiredTypes & (~info.stdPresent);
-        keypadVMod = FindKeypadVMod(keymap);
-
-        if (InitCanonicalKeyTypes(keymap, missing, keypadVMod) != Success) {
-            log_wsgo(info.keymap->ctx,
-                     "Couldn't initialize canonical key types\n");
-            goto err_info;
-        }
-
-        if (missing & XkbOneLevelMask)
-            darray_item(keymap->types, XkbOneLevelIndex).name =
-                xkb_atom_text(keymap->ctx, info.tok_ONE_LEVEL);
-        if (missing & XkbTwoLevelMask)
-            darray_item(keymap->types, XkbTwoLevelIndex).name =
-                xkb_atom_text(keymap->ctx, info.tok_TWO_LEVEL);
-        if (missing & XkbAlphabeticMask)
-            darray_item(keymap->types, XkbAlphabeticIndex).name =
-                xkb_atom_text(keymap->ctx, info.tok_ALPHABETIC);
-        if (missing & XkbKeypadMask)
-            darray_item(keymap->types, XkbKeypadIndex).name =
-                xkb_atom_text(keymap->ctx, info.tok_KEYPAD);
-    }
-
-    next = &darray_item(keymap->types, XkbLastRequiredType + 1);
+    i = 0;
     list_foreach(def, &info.types, entry) {
-        if (def->name == info.tok_ONE_LEVEL)
-            type = &darray_item(keymap->types, XkbOneLevelIndex);
-        else if (def->name == info.tok_TWO_LEVEL)
-            type = &darray_item(keymap->types, XkbTwoLevelIndex);
-        else if (def->name == info.tok_ALPHABETIC)
-            type = &darray_item(keymap->types, XkbAlphabeticIndex);
-        else if (def->name == info.tok_KEYPAD)
-            type = &darray_item(keymap->types, XkbKeypadIndex);
-        else
-            type = next++;
+        type = &darray_item(keymap->types, i++);
 
         DeleteLevel1MapEntries(def);
 
@@ -1344,6 +1095,15 @@ CompileKeyTypes(XkbFile *file, struct xkb_keymap *keymap,
             goto err_info;
     }
 
+    /*
+     * If no types were specified, the default unnamed one-level type is
+     * used for all keys.
+     */
+    if (i == 0) {
+        if (!CopyDefToKeyType(&info, &info.dflt, &darray_item(keymap->types, 0)))
+            goto err_info;
+    }
+
     FreeKeyTypesInfo(&info);
     return true;
 
index 3a56082..ea4fb11 100644 (file)
@@ -1488,15 +1488,14 @@ FindNamedType(struct xkb_keymap *keymap, xkb_atom_t atom, unsigned *type_rtrn)
     const char *name = xkb_atom_text(keymap->ctx, atom);
     struct xkb_key_type *type;
 
-    if (keymap) {
-        darray_foreach(type, keymap->types) {
-            if (streq(type->name, name)) {
-                *type_rtrn = n;
-                return true;
-            }
-            n++;
+    darray_foreach(type, keymap->types) {
+        if (streq(type->name, name)) {
+            *type_rtrn = n;
+            return true;
         }
+        n++;
     }
+
     return false;
 }
 
@@ -1743,10 +1742,14 @@ CopySymbolsDef(SymbolsInfo *info, KeyInfo *keyi,
         else {
             log_lvl(info->keymap->ctx, 3,
                     "Type \"%s\" is not defined; "
-                    "Using TWO_LEVEL for the %s key (keycode %d)\n",
+                    "Using default type for the %s key (keycode %d)\n",
                     xkb_atom_text(keymap->ctx, keyi->types[i]),
                     LongKeyNameText(keyi->name), kc);
-            types[i] = XkbTwoLevelIndex;
+            /*
+             * Index 0 is guaranteed to contain something, usually
+             * ONE_LEVEL or at least some default one-level type.
+             */
+            types[i] = 0;
         }
 
         /* if the type specifies fewer levels than the key has, shrink the key */
index 5190919..179429d 100644 (file)
@@ -205,19 +205,6 @@ LookupVModMask(struct xkb_context *ctx, const void *priv, xkb_atom_t field,
     return false;
 }
 
-xkb_mod_index_t
-FindKeypadVMod(struct xkb_keymap *keymap)
-{
-    xkb_atom_t name;
-    xkb_mod_index_t ndx;
-
-    name = xkb_atom_intern(keymap->ctx, "NumLock");
-    if (LookupVModIndex(keymap, name, EXPR_TYPE_INT, &ndx))
-        return ndx;
-
-    return -1;
-}
-
 bool
 ResolveVirtualModifier(ExprDef *def, struct xkb_keymap *keymap,
                        xkb_mod_index_t *ndx_rtrn, VModInfo *info)
index 62854d9..070ff69 100644 (file)
@@ -45,9 +45,6 @@ extern bool
 HandleVModDef(VModDef *stmt, struct xkb_keymap *keymap,
               enum merge_mode mergeMode, VModInfo *info);
 
-xkb_mod_index_t
-FindKeypadVMod(struct xkb_keymap *keymap);
-
 bool
 ResolveVirtualModifier(ExprDef *def, struct xkb_keymap *keymap,
                        xkb_mod_index_t *ndx_rtrn, VModInfo *info);
index 44ee5cb..3c97dbc 100644 (file)
@@ -316,13 +316,6 @@ xkb_keymap {
                        level_name[Level1]= "Base";
                        level_name[Level2]= "Caps";
                };
-               type "KEYPAD" {
-                       modifiers= Shift+NumLock;
-                       map[Shift]= Level2;
-                       map[NumLock]= Level2;
-                       level_name[Level1]= "Base";
-                       level_name[Level2]= "Number";
-               };
                type "SHIFT+ALT" {
                        modifiers= Shift+Alt;
                        map[Shift+Alt]= Level2;
@@ -577,6 +570,13 @@ xkb_keymap {
                        level_name[Level4]= "Shift Alt";
                        level_name[Level5]= "Lock";
                };
+               type "KEYPAD" {
+                       modifiers= Shift+NumLock;
+                       map[Shift]= Level2;
+                       map[NumLock]= Level2;
+                       level_name[Level1]= "Base";
+                       level_name[Level2]= "Number";
+               };
                type "FOUR_LEVEL_KEYPAD" {
                        modifiers= Shift+NumLock+LevelThree;
                        map[Shift]= Level2;
diff --git a/test/data/keymaps/no-types.xkb b/test/data/keymaps/no-types.xkb
new file mode 100644 (file)
index 0000000..2f70e3e
--- /dev/null
@@ -0,0 +1,1025 @@
+xkb_keymap {
+       xkb_keycodes {
+               minimum = 8;
+               maximum = 255;
+                <ESC> = 9;
+               <AE01> = 10;
+               <AE02> = 11;
+               <AE03> = 12;
+               <AE04> = 13;
+               <AE05> = 14;
+               <AE06> = 15;
+               <AE07> = 16;
+               <AE08> = 17;
+               <AE09> = 18;
+               <AE10> = 19;
+               <AE11> = 20;
+               <AE12> = 21;
+               <BKSP> = 22;
+                <TAB> = 23;
+               <AD01> = 24;
+               <AD02> = 25;
+               <AD03> = 26;
+               <AD04> = 27;
+               <AD05> = 28;
+               <AD06> = 29;
+               <AD07> = 30;
+               <AD08> = 31;
+               <AD09> = 32;
+               <AD10> = 33;
+               <AD11> = 34;
+               <AD12> = 35;
+               <RTRN> = 36;
+               <LCTL> = 37;
+               <AC01> = 38;
+               <AC02> = 39;
+               <AC03> = 40;
+               <AC04> = 41;
+               <AC05> = 42;
+               <AC06> = 43;
+               <AC07> = 44;
+               <AC08> = 45;
+               <AC09> = 46;
+               <AC10> = 47;
+               <AC11> = 48;
+               <TLDE> = 49;
+               <LFSH> = 50;
+               <BKSL> = 51;
+               <AB01> = 52;
+               <AB02> = 53;
+               <AB03> = 54;
+               <AB04> = 55;
+               <AB05> = 56;
+               <AB06> = 57;
+               <AB07> = 58;
+               <AB08> = 59;
+               <AB09> = 60;
+               <AB10> = 61;
+               <RTSH> = 62;
+               <KPMU> = 63;
+               <LALT> = 64;
+               <SPCE> = 65;
+               <CAPS> = 66;
+               <FK01> = 67;
+               <FK02> = 68;
+               <FK03> = 69;
+               <FK04> = 70;
+               <FK05> = 71;
+               <FK06> = 72;
+               <FK07> = 73;
+               <FK08> = 74;
+               <FK09> = 75;
+               <FK10> = 76;
+               <NMLK> = 77;
+               <SCLK> = 78;
+                <KP7> = 79;
+                <KP8> = 80;
+                <KP9> = 81;
+               <KPSU> = 82;
+                <KP4> = 83;
+                <KP5> = 84;
+                <KP6> = 85;
+               <KPAD> = 86;
+                <KP1> = 87;
+                <KP2> = 88;
+                <KP3> = 89;
+                <KP0> = 90;
+               <KPDL> = 91;
+               <LVL3> = 92;
+               <LSGT> = 94;
+               <FK11> = 95;
+               <FK12> = 96;
+               <AB11> = 97;
+               <KATA> = 98;
+               <HIRA> = 99;
+               <HENK> = 100;
+               <HKTG> = 101;
+               <MUHE> = 102;
+               <JPCM> = 103;
+               <KPEN> = 104;
+               <RCTL> = 105;
+               <KPDV> = 106;
+               <PRSC> = 107;
+               <RALT> = 108;
+               <LNFD> = 109;
+               <HOME> = 110;
+                 <UP> = 111;
+               <PGUP> = 112;
+               <LEFT> = 113;
+               <RGHT> = 114;
+                <END> = 115;
+               <DOWN> = 116;
+               <PGDN> = 117;
+                <INS> = 118;
+               <DELE> = 119;
+               <I120> = 120;
+               <MUTE> = 121;
+               <VOL-> = 122;
+               <VOL+> = 123;
+               <POWR> = 124;
+               <KPEQ> = 125;
+               <I126> = 126;
+               <PAUS> = 127;
+               <I128> = 128;
+               <I129> = 129;
+               <HNGL> = 130;
+               <HJCV> = 131;
+               <AE13> = 132;
+               <LWIN> = 133;
+               <RWIN> = 134;
+               <COMP> = 135;
+               <STOP> = 136;
+               <AGAI> = 137;
+               <PROP> = 138;
+               <UNDO> = 139;
+               <FRNT> = 140;
+               <COPY> = 141;
+               <OPEN> = 142;
+               <PAST> = 143;
+               <FIND> = 144;
+                <CUT> = 145;
+               <HELP> = 146;
+               <I147> = 147;
+               <I148> = 148;
+               <I149> = 149;
+               <I150> = 150;
+               <I151> = 151;
+               <I152> = 152;
+               <I153> = 153;
+               <I154> = 154;
+               <I155> = 155;
+               <I156> = 156;
+               <I157> = 157;
+               <I158> = 158;
+               <I159> = 159;
+               <I160> = 160;
+               <I161> = 161;
+               <I162> = 162;
+               <I163> = 163;
+               <I164> = 164;
+               <I165> = 165;
+               <I166> = 166;
+               <I167> = 167;
+               <I168> = 168;
+               <I169> = 169;
+               <I170> = 170;
+               <I171> = 171;
+               <I172> = 172;
+               <I173> = 173;
+               <I174> = 174;
+               <I175> = 175;
+               <I176> = 176;
+               <I177> = 177;
+               <I178> = 178;
+               <I179> = 179;
+               <I180> = 180;
+               <I181> = 181;
+               <I182> = 182;
+               <I183> = 183;
+               <I184> = 184;
+               <I185> = 185;
+               <I186> = 186;
+               <I187> = 187;
+               <I188> = 188;
+               <I189> = 189;
+               <I190> = 190;
+               <FK13> = 191;
+               <FK14> = 192;
+               <FK15> = 193;
+               <FK16> = 194;
+               <FK17> = 195;
+               <FK18> = 196;
+               <FK19> = 197;
+               <FK20> = 198;
+               <FK21> = 199;
+               <FK22> = 200;
+               <FK23> = 201;
+               <FK24> = 202;
+               <MDSW> = 203;
+                <ALT> = 204;
+               <META> = 205;
+               <SUPR> = 206;
+               <HYPR> = 207;
+               <I208> = 208;
+               <I209> = 209;
+               <I210> = 210;
+               <I211> = 211;
+               <I212> = 212;
+               <I213> = 213;
+               <I214> = 214;
+               <I215> = 215;
+               <I216> = 216;
+               <I217> = 217;
+               <I218> = 218;
+               <I219> = 219;
+               <I220> = 220;
+               <I221> = 221;
+               <I222> = 222;
+               <I223> = 223;
+               <I224> = 224;
+               <I225> = 225;
+               <I226> = 226;
+               <I227> = 227;
+               <I228> = 228;
+               <I229> = 229;
+               <I230> = 230;
+               <I231> = 231;
+               <I232> = 232;
+               <I233> = 233;
+               <I234> = 234;
+               <I235> = 235;
+               <I236> = 236;
+               <I237> = 237;
+               <I238> = 238;
+               <I239> = 239;
+               <I240> = 240;
+               <I241> = 241;
+               <I242> = 242;
+               <I243> = 243;
+               <I244> = 244;
+               <I245> = 245;
+               <I246> = 246;
+               <I247> = 247;
+               <I248> = 248;
+               <I249> = 249;
+               <I250> = 250;
+               <I251> = 251;
+               <I252> = 252;
+               <I253> = 253;
+               indicator 1 = "Caps Lock";
+               indicator 2 = "Num Lock";
+               indicator 3 = "Scroll Lock";
+               indicator 4 = "Compose";
+               indicator 5 = "Kana";
+               indicator 6 = "Sleep";
+               indicator 7 = "Suspend";
+               indicator 8 = "Mute";
+               indicator 9 = "Misc";
+               indicator 10 = "Mail";
+               indicator 11 = "Charging";
+               indicator 12 = "Shift Lock";
+               indicator 13 = "Group 2";
+               indicator 14 = "Mouse Keys";
+               alias <AC12> = <BKSL>;
+               alias <MENU> = <COMP>;
+               alias <HZTG> = <TLDE>;
+               alias <LMTA> = <LWIN>;
+               alias <RMTA> = <RWIN>;
+               alias <ALGR> = <RALT>;
+               alias <KPPT> = <I129>;
+               alias <LatQ> = <AD01>;
+               alias <LatW> = <AD02>;
+               alias <LatE> = <AD03>;
+               alias <LatR> = <AD04>;
+               alias <LatT> = <AD05>;
+               alias <LatY> = <AD06>;
+               alias <LatU> = <AD07>;
+               alias <LatI> = <AD08>;
+               alias <LatO> = <AD09>;
+               alias <LatP> = <AD10>;
+               alias <LatA> = <AC01>;
+               alias <LatS> = <AC02>;
+               alias <LatD> = <AC03>;
+               alias <LatF> = <AC04>;
+               alias <LatG> = <AC05>;
+               alias <LatH> = <AC06>;
+               alias <LatJ> = <AC07>;
+               alias <LatK> = <AC08>;
+               alias <LatL> = <AC09>;
+               alias <LatZ> = <AB01>;
+               alias <LatX> = <AB02>;
+               alias <LatC> = <AB03>;
+               alias <LatV> = <AB04>;
+               alias <LatB> = <AB05>;
+               alias <LatN> = <AB06>;
+               alias <LatM> = <AB07>;
+       };
+
+       xkb_types {
+       };
+
+       xkb_compatibility {
+               virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;
+
+               interpret.useModMapMods= AnyLevel;
+               interpret.repeat= false;
+               interpret.locking= false;
+               interpret ISO_Level2_Latch+Exactly(Shift) {
+                       useModMapMods=level1;
+                       action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
+               };
+               interpret Shift_Lock+AnyOf(Shift+Lock) {
+                       action= LockMods(modifiers=Shift);
+               };
+               interpret Num_Lock+AnyOf(all) {
+                       virtualModifier= NumLock;
+                       action= LockMods(modifiers=NumLock);
+               };
+               interpret ISO_Lock+AnyOf(all) {
+                        action= NoAction();
+               };
+               interpret ISO_Level3_Shift+AnyOf(all) {
+                       virtualModifier= LevelThree;
+                       useModMapMods=level1;
+                       action= SetMods(modifiers=LevelThree,clearLocks);
+               };
+               interpret ISO_Level3_Latch+AnyOf(all) {
+                       virtualModifier= LevelThree;
+                       useModMapMods=level1;
+                       action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+               };
+               interpret ISO_Level3_Lock+AnyOf(all) {
+                       virtualModifier= LevelThree;
+                       useModMapMods=level1;
+                       action= LockMods(modifiers=LevelThree);
+               };
+               interpret Alt_L+AnyOf(all) {
+                       virtualModifier= Alt;
+                       action= SetMods(modifiers=modMapMods,clearLocks);
+               };
+               interpret Alt_R+AnyOf(all) {
+                       virtualModifier= Alt;
+                       action= SetMods(modifiers=modMapMods,clearLocks);
+               };
+               interpret Meta_L+AnyOf(all) {
+                       virtualModifier= Meta;
+                       action= SetMods(modifiers=modMapMods,clearLocks);
+               };
+               interpret Meta_R+AnyOf(all) {
+                       virtualModifier= Meta;
+                       action= SetMods(modifiers=modMapMods,clearLocks);
+               };
+               interpret Super_L+AnyOf(all) {
+                       virtualModifier= Super;
+                       action= SetMods(modifiers=modMapMods,clearLocks);
+               };
+               interpret Super_R+AnyOf(all) {
+                       virtualModifier= Super;
+                       action= SetMods(modifiers=modMapMods,clearLocks);
+               };
+               interpret Hyper_L+AnyOf(all) {
+                       virtualModifier= Hyper;
+                       action= SetMods(modifiers=modMapMods,clearLocks);
+               };
+               interpret Hyper_R+AnyOf(all) {
+                       virtualModifier= Hyper;
+                       action= SetMods(modifiers=modMapMods,clearLocks);
+               };
+               interpret Scroll_Lock+AnyOf(all) {
+                       virtualModifier= ScrollLock;
+                       action= LockMods(modifiers=modMapMods);
+               };
+               interpret ISO_Level5_Shift+AnyOf(all) {
+                       virtualModifier= LevelFive;
+                       useModMapMods=level1;
+                       action= SetMods(modifiers=LevelFive,clearLocks);
+               };
+               interpret ISO_Level5_Latch+AnyOf(all) {
+                       virtualModifier= LevelFive;
+                       action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+               };
+               interpret ISO_Level5_Lock+AnyOf(all) {
+                       virtualModifier= LevelFive;
+                       action= LockMods(modifiers=LevelFive);
+               };
+               interpret Mode_switch+AnyOfOrNone(all) {
+                       virtualModifier= AltGr;
+                       useModMapMods=level1;
+                       action= SetGroup(group=+1);
+               };
+               interpret ISO_Level3_Shift+AnyOfOrNone(all) {
+                       action= SetMods(modifiers=LevelThree,clearLocks);
+               };
+               interpret ISO_Level3_Latch+AnyOfOrNone(all) {
+                       action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+               };
+               interpret ISO_Level3_Lock+AnyOfOrNone(all) {
+                       action= LockMods(modifiers=LevelThree);
+               };
+               interpret ISO_Group_Latch+AnyOfOrNone(all) {
+                       virtualModifier= AltGr;
+                       useModMapMods=level1;
+                       action= LatchGroup(group=2);
+               };
+               interpret ISO_Next_Group+AnyOfOrNone(all) {
+                       virtualModifier= AltGr;
+                       useModMapMods=level1;
+                       action= LockGroup(group=+1);
+               };
+               interpret ISO_Prev_Group+AnyOfOrNone(all) {
+                       virtualModifier= AltGr;
+                       useModMapMods=level1;
+                       action= LockGroup(group=-1);
+               };
+               interpret ISO_First_Group+AnyOfOrNone(all) {
+                       action= LockGroup(group=1);
+               };
+               interpret ISO_Last_Group+AnyOfOrNone(all) {
+                       action= LockGroup(group=2);
+               };
+               interpret KP_1+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=-1,y=+1);
+               };
+               interpret KP_End+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=-1,y=+1);
+               };
+               interpret KP_2+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+0,y=+1);
+               };
+               interpret KP_Down+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+0,y=+1);
+               };
+               interpret KP_3+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+1,y=+1);
+               };
+               interpret KP_Next+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+1,y=+1);
+               };
+               interpret KP_4+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=-1,y=+0);
+               };
+               interpret KP_Left+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=-1,y=+0);
+               };
+               interpret KP_6+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+1,y=+0);
+               };
+               interpret KP_Right+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+1,y=+0);
+               };
+               interpret KP_7+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=-1,y=-1);
+               };
+               interpret KP_Home+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=-1,y=-1);
+               };
+               interpret KP_8+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+0,y=-1);
+               };
+               interpret KP_Up+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+0,y=-1);
+               };
+               interpret KP_9+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+1,y=-1);
+               };
+               interpret KP_Prior+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+1,y=-1);
+               };
+               interpret KP_5+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= PtrBtn(button=default);
+               };
+               interpret KP_Begin+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= PtrBtn(button=default);
+               };
+               interpret KP_F2+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SetPtrDflt(affect=button,button=1);
+               };
+               interpret KP_Divide+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SetPtrDflt(affect=button,button=1);
+               };
+               interpret KP_F3+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SetPtrDflt(affect=button,button=2);
+               };
+               interpret KP_Multiply+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SetPtrDflt(affect=button,button=2);
+               };
+               interpret KP_F4+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SetPtrDflt(affect=button,button=3);
+               };
+               interpret KP_Subtract+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SetPtrDflt(affect=button,button=3);
+               };
+               interpret KP_Separator+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= PtrBtn(button=default,count=2);
+               };
+               interpret KP_Add+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= PtrBtn(button=default,count=2);
+               };
+               interpret KP_0+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= LockPtrBtn(button=default,affect=lock);
+               };
+               interpret KP_Insert+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= LockPtrBtn(button=default,affect=lock);
+               };
+               interpret KP_Decimal+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= LockPtrBtn(button=default,affect=unlock);
+               };
+               interpret KP_Delete+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= LockPtrBtn(button=default,affect=unlock);
+               };
+               interpret F25+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SetPtrDflt(affect=button,button=1);
+               };
+               interpret F26+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SetPtrDflt(affect=button,button=2);
+               };
+               interpret F27+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=-1,y=-1);
+               };
+               interpret F29+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+1,y=-1);
+               };
+               interpret F31+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= PtrBtn(button=default);
+               };
+               interpret F33+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=-1,y=+1);
+               };
+               interpret F35+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= MovePtr(x=+1,y=+1);
+               };
+               interpret Pointer_Button_Dflt+AnyOfOrNone(all) {
+                       action= PtrBtn(button=default);
+               };
+               interpret Pointer_Button1+AnyOfOrNone(all) {
+                       action= PtrBtn(button=1);
+               };
+               interpret Pointer_Button2+AnyOfOrNone(all) {
+                       action= PtrBtn(button=2);
+               };
+               interpret Pointer_Button3+AnyOfOrNone(all) {
+                       action= PtrBtn(button=3);
+               };
+               interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {
+                       action= PtrBtn(button=default,count=2);
+               };
+               interpret Pointer_DblClick1+AnyOfOrNone(all) {
+                       action= PtrBtn(button=1,count=2);
+               };
+               interpret Pointer_DblClick2+AnyOfOrNone(all) {
+                       action= PtrBtn(button=2,count=2);
+               };
+               interpret Pointer_DblClick3+AnyOfOrNone(all) {
+                       action= PtrBtn(button=3,count=2);
+               };
+               interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {
+                       action= LockPtrBtn(button=default,affect=both);
+               };
+               interpret Pointer_Drag1+AnyOfOrNone(all) {
+                       action= LockPtrBtn(button=1,affect=both);
+               };
+               interpret Pointer_Drag2+AnyOfOrNone(all) {
+                       action= LockPtrBtn(button=2,affect=both);
+               };
+               interpret Pointer_Drag3+AnyOfOrNone(all) {
+                       action= LockPtrBtn(button=3,affect=both);
+               };
+               interpret Pointer_EnableKeys+AnyOfOrNone(all) {
+                       action= LockControls(controls=mouseKeys);
+               };
+               interpret Pointer_Accelerate+AnyOfOrNone(all) {
+                       action= LockControls(controls=mouseKeysAccel);
+               };
+               interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {
+                       action= SetPtrDflt(affect=button,button=+1);
+               };
+               interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {
+                       action= SetPtrDflt(affect=button,button=-1);
+               };
+               interpret AccessX_Enable+AnyOfOrNone(all) {
+                       action= LockControls(controls=accessXKeys);
+               };
+               interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {
+                       action= LockControls(controls=accessXFeedback);
+               };
+               interpret RepeatKeys_Enable+AnyOfOrNone(all) {
+                       action= LockControls(controls=repeatKeys);
+               };
+               interpret SlowKeys_Enable+AnyOfOrNone(all) {
+                       action= LockControls(controls=slowKeys);
+               };
+               interpret BounceKeys_Enable+AnyOfOrNone(all) {
+                       action= LockControls(controls=bounceKeys);
+               };
+               interpret StickyKeys_Enable+AnyOfOrNone(all) {
+                       action= LockControls(controls=stickyKeys);
+               };
+               interpret MouseKeys_Enable+AnyOfOrNone(all) {
+                       action= LockControls(controls=mouseKeys);
+               };
+               interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {
+                       action= LockControls(controls=mouseKeysAccel);
+               };
+               interpret Overlay1_Enable+AnyOfOrNone(all) {
+                       action= LockControls(controls=none);
+               };
+               interpret Overlay2_Enable+AnyOfOrNone(all) {
+                       action= LockControls(controls=none);
+               };
+               interpret AudibleBell_Enable+AnyOfOrNone(all) {
+                       action= LockControls(controls=audibleBell);
+               };
+               interpret Terminate_Server+AnyOfOrNone(all) {
+                       action= Terminate();
+               };
+               interpret Alt_L+AnyOfOrNone(all) {
+                       action= SetMods(modifiers=Alt,clearLocks);
+               };
+               interpret Alt_R+AnyOfOrNone(all) {
+                       action= SetMods(modifiers=Alt,clearLocks);
+               };
+               interpret Meta_L+AnyOfOrNone(all) {
+                       action= SetMods(modifiers=Meta,clearLocks);
+               };
+               interpret Meta_R+AnyOfOrNone(all) {
+                       action= SetMods(modifiers=Meta,clearLocks);
+               };
+               interpret Super_L+AnyOfOrNone(all) {
+                       action= SetMods(modifiers=Super,clearLocks);
+               };
+               interpret Super_R+AnyOfOrNone(all) {
+                       action= SetMods(modifiers=Super,clearLocks);
+               };
+               interpret Hyper_L+AnyOfOrNone(all) {
+                       action= SetMods(modifiers=Hyper,clearLocks);
+               };
+               interpret Hyper_R+AnyOfOrNone(all) {
+                       action= SetMods(modifiers=Hyper,clearLocks);
+               };
+               interpret Shift_L+AnyOfOrNone(all) {
+                       action= SetMods(modifiers=Shift,clearLocks);
+               };
+               interpret XF86Switch_VT_1+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=1,!same);
+               };
+               interpret XF86Switch_VT_2+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=2,!same);
+               };
+               interpret XF86Switch_VT_3+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=3,!same);
+               };
+               interpret XF86Switch_VT_4+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=4,!same);
+               };
+               interpret XF86Switch_VT_5+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=5,!same);
+               };
+               interpret XF86Switch_VT_6+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=6,!same);
+               };
+               interpret XF86Switch_VT_7+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=7,!same);
+               };
+               interpret XF86Switch_VT_8+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=8,!same);
+               };
+               interpret XF86Switch_VT_9+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=9,!same);
+               };
+               interpret XF86Switch_VT_10+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=10,!same);
+               };
+               interpret XF86Switch_VT_11+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=11,!same);
+               };
+               interpret XF86Switch_VT_12+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= SwitchScreen(screen=12,!same);
+               };
+               interpret XF86LogGrabInfo+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00);
+               };
+               interpret XF86LogWindowTree+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00);
+               };
+               interpret XF86Next_VMode+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+               };
+               interpret XF86Prev_VMode+AnyOfOrNone(all) {
+                       repeat= true;
+                       action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
+               };
+               interpret ISO_Level5_Shift+AnyOfOrNone(all) {
+                       action= SetMods(modifiers=LevelFive,clearLocks);
+               };
+               interpret ISO_Level5_Latch+AnyOfOrNone(all) {
+                       action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
+               };
+               interpret ISO_Level5_Lock+AnyOfOrNone(all) {
+                       action= LockMods(modifiers=LevelFive);
+               };
+               interpret Caps_Lock+AnyOfOrNone(all) {
+                       action= LockMods(modifiers=Lock);
+               };
+               interpret Any+Exactly(Lock) {
+                       action= LockMods(modifiers=Lock);
+               };
+               interpret Any+AnyOf(all) {
+                       action= SetMods(modifiers=modMapMods,clearLocks);
+               };
+               group 2 = AltGr;
+               group 3 = AltGr;
+               group 4 = AltGr;
+               indicator "Caps Lock" {
+                       whichModState= locked;
+                       modifiers= Lock;
+               };
+               indicator "Num Lock" {
+                       whichModState= locked;
+                       modifiers= NumLock;
+               };
+               indicator "Scroll Lock" {
+                       whichModState= locked;
+                       modifiers= ScrollLock;
+               };
+               indicator "Shift Lock" {
+                       whichModState= locked;
+                       modifiers= Shift;
+               };
+               indicator "Group 2" {
+                       groups= 0xfe;
+               };
+               indicator "Mouse Keys" {
+                       controls= mouseKeys;
+               };
+       };
+
+       xkb_symbols {
+               name[group1]="English (US)";
+
+               key  <ESC> {    [          Escape ] };
+               key <AE01> {    [               1 ] };
+               key <AE02> {    [               2 ] };
+               key <AE03> {    [               3 ] };
+               key <AE04> {    [               4 ] };
+               key <AE05> {    [               5 ] };
+               key <AE06> {    [               6 ] };
+               key <AE07> {    [               7 ] };
+               key <AE08> {    [               8 ] };
+               key <AE09> {    [               9 ] };
+               key <AE10> {    [               0 ] };
+               key <AE11> {    [           minus ] };
+               key <AE12> {    [           equal ] };
+               key <BKSP> {    [       BackSpace ] };
+               key  <TAB> {    [             Tab ] };
+               key <AD01> {    [               q ] };
+               key <AD02> {    [               w ] };
+               key <AD03> {    [               e ] };
+               key <AD04> {    [               r ] };
+               key <AD05> {    [               t ] };
+               key <AD06> {    [               y ] };
+               key <AD07> {    [               u ] };
+               key <AD08> {    [               i ] };
+               key <AD09> {    [               o ] };
+               key <AD10> {    [               p ] };
+               key <AD11> {    [     bracketleft ] };
+               key <AD12> {    [    bracketright ] };
+               key <RTRN> {    [          Return ] };
+               key <LCTL> {    [       Control_L ] };
+               key <AC01> {    [               a ] };
+               key <AC02> {    [               s ] };
+               key <AC03> {    [               d ] };
+               key <AC04> {    [               f ] };
+               key <AC05> {    [               g ] };
+               key <AC06> {    [               h ] };
+               key <AC07> {    [               j ] };
+               key <AC08> {    [               k ] };
+               key <AC09> {    [               l ] };
+               key <AC10> {    [       semicolon ] };
+               key <AC11> {    [      apostrophe ] };
+               key <TLDE> {    [           grave ] };
+               key <LFSH> {    [         Shift_L ] };
+               key <BKSL> {    [        NoSymbol ] };
+               key <AB01> {    [               z ] };
+               key <AB02> {    [               x ] };
+               key <AB03> {    [               c ] };
+               key <AB04> {    [               v ] };
+               key <AB05> {    [               b ] };
+               key <AB06> {    [               n ] };
+               key <AB07> {    [               m ] };
+               key <AB08> {    [           comma ] };
+               key <AB09> {    [          period ] };
+               key <AB10> {    [           slash ] };
+               key <RTSH> {    [         Shift_R ] };
+               key <KPMU> {    [     KP_Multiply ] };
+               key <LALT> {    [           Alt_L ] };
+               key <SPCE> {    [           space ] };
+               key <CAPS> {    [       Caps_Lock ] };
+               key <FK01> {    [              F1 ] };
+               key <FK02> {    [              F2 ] };
+               key <FK03> {    [              F3 ] };
+               key <FK04> {    [              F4 ] };
+               key <FK05> {    [              F5 ] };
+               key <FK06> {    [              F6 ] };
+               key <FK07> {    [              F7 ] };
+               key <FK08> {    [              F8 ] };
+               key <FK09> {    [              F9 ] };
+               key <FK10> {    [             F10 ] };
+               key <NMLK> {    [        Num_Lock ] };
+               key <SCLK> {    [     Scroll_Lock ] };
+               key  <KP7> {    [         KP_Home ] };
+               key  <KP8> {    [           KP_Up ] };
+               key  <KP9> {    [        KP_Prior ] };
+               key <KPSU> {    [     KP_Subtract ] };
+               key  <KP4> {    [         KP_Left ] };
+               key  <KP5> {    [        KP_Begin ] };
+               key  <KP6> {    [        KP_Right ] };
+               key <KPAD> {    [          KP_Add ] };
+               key  <KP1> {    [          KP_End ] };
+               key  <KP2> {    [         KP_Down ] };
+               key  <KP3> {    [         KP_Next ] };
+               key  <KP0> {    [       KP_Insert ] };
+               key <KPDL> {    [       KP_Delete ] };
+               key <LVL3> {    [ ISO_Level3_Shift ] };
+               key <LSGT> {    [            less ] };
+               key <FK11> {    [             F11 ] };
+               key <FK12> {    [             F12 ] };
+               key <KATA> {    [        Katakana ] };
+               key <HIRA> {    [        Hiragana ] };
+               key <HENK> {    [     Henkan_Mode ] };
+               key <HKTG> {    [ Hiragana_Katakana ] };
+               key <MUHE> {    [        Muhenkan ] };
+               key <KPEN> {    [        KP_Enter ] };
+               key <RCTL> {    [       Control_R ] };
+               key <KPDV> {    [       KP_Divide ] };
+               key <PRSC> {    [           Print ] };
+               key <RALT> {    [           Alt_R ] };
+               key <LNFD> {    [        Linefeed ] };
+               key <HOME> {    [            Home ] };
+               key   <UP> {    [              Up ] };
+               key <PGUP> {    [           Prior ] };
+               key <LEFT> {    [            Left ] };
+               key <RGHT> {    [           Right ] };
+               key  <END> {    [             End ] };
+               key <DOWN> {    [            Down ] };
+               key <PGDN> {    [            Next ] };
+               key  <INS> {    [          Insert ] };
+               key <DELE> {    [          Delete ] };
+               key <MUTE> {    [   XF86AudioMute ] };
+               key <VOL-> {    [ XF86AudioLowerVolume ] };
+               key <VOL+> {    [ XF86AudioRaiseVolume ] };
+               key <POWR> {    [    XF86PowerOff ] };
+               key <KPEQ> {    [        KP_Equal ] };
+               key <I126> {    [       plusminus ] };
+               key <PAUS> {    [           Pause ] };
+               key <I128> {    [     XF86LaunchA ] };
+               key <I129> {    [       KP_Decimal] };
+               key <HNGL> {    [          Hangul ] };
+               key <HJCV> {    [    Hangul_Hanja ] };
+               key <LWIN> {    [         Super_L ] };
+               key <RWIN> {    [         Super_R ] };
+               key <COMP> {    [            Menu ] };
+               key <STOP> {    [          Cancel ] };
+               key <AGAI> {    [            Redo ] };
+               key <PROP> {    [        SunProps ] };
+               key <UNDO> {    [            Undo ] };
+               key <FRNT> {    [        SunFront ] };
+               key <COPY> {    [        XF86Copy ] };
+               key <OPEN> {    [         SunOpen ] };
+               key <PAST> {    [       XF86Paste ] };
+               key <FIND> {    [            Find ] };
+               key  <CUT> {    [         XF86Cut ] };
+               key <HELP> {    [            Help ] };
+               key <I147> {    [      XF86MenuKB ] };
+               key <I148> {    [  XF86Calculator ] };
+               key <I150> {    [       XF86Sleep ] };
+               key <I151> {    [      XF86WakeUp ] };
+               key <I152> {    [    XF86Explorer ] };
+               key <I153> {    [        XF86Send ] };
+               key <I155> {    [        XF86Xfer ] };
+               key <I156> {    [     XF86Launch1 ] };
+               key <I157> {    [     XF86Launch2 ] };
+               key <I158> {    [         XF86WWW ] };
+               key <I159> {    [         XF86DOS ] };
+               key <I160> {    [ XF86ScreenSaver ] };
+               key <I162> {    [ XF86RotateWindows ] };
+               key <I163> {    [        XF86Mail ] };
+               key <I164> {    [   XF86Favorites ] };
+               key <I165> {    [  XF86MyComputer ] };
+               key <I166> {    [        XF86Back ] };
+               key <I167> {    [     XF86Forward ] };
+               key <I169> {    [       XF86Eject ] };
+               key <I170> {    [       XF86Eject ] };
+               key <I171> {    [   XF86AudioNext ] };
+               key <I172> {    [   XF86AudioPlay ] };
+               key <I173> {    [   XF86AudioPrev ] };
+               key <I174> {    [   XF86AudioStop ] };
+               key <I175> {    [ XF86AudioRecord ] };
+               key <I176> {    [ XF86AudioRewind ] };
+               key <I177> {    [       XF86Phone ] };
+               key <I179> {    [       XF86Tools ] };
+               key <I180> {    [    XF86HomePage ] };
+               key <I181> {    [      XF86Reload ] };
+               key <I182> {    [       XF86Close ] };
+               key <I185> {    [    XF86ScrollUp ] };
+               key <I186> {    [  XF86ScrollDown ] };
+               key <I187> {    [       parenleft ] };
+               key <I188> {    [      parenright ] };
+               key <I189> {    [         XF86New ] };
+               key <I190> {    [            Redo ] };
+               key <FK13> {    [       XF86Tools ] };
+               key <FK14> {    [     XF86Launch5 ] };
+               key <FK15> {    [     XF86Launch6 ] };
+               key <FK16> {    [     XF86Launch7 ] };
+               key <FK17> {    [     XF86Launch8 ] };
+               key <FK18> {    [     XF86Launch9 ] };
+               key <FK21> {    [ XF86TouchpadToggle ] };
+               key <FK22> {    [  XF86TouchpadOn ] };
+               key <FK23> {    [ XF86TouchpadOff ] };
+               key <MDSW> {    [     Mode_switch ] };
+               key  <ALT> {    [        NoSymbol ] };
+               key <META> {    [        NoSymbol ] };
+               key <SUPR> {    [        NoSymbol ] };
+               key <HYPR> {    [        NoSymbol ] };
+               key <I208> {    [   XF86AudioPlay ] };
+               key <I209> {    [  XF86AudioPause ] };
+               key <I210> {    [     XF86Launch3 ] };
+               key <I211> {    [     XF86Launch4 ] };
+               key <I212> {    [     XF86LaunchB ] };
+               key <I213> {    [     XF86Suspend ] };
+               key <I214> {    [       XF86Close ] };
+               key <I215> {    [   XF86AudioPlay ] };
+               key <I216> {    [ XF86AudioForward ] };
+               key <I218> {    [           Print ] };
+               key <I220> {    [      XF86WebCam ] };
+               key <I223> {    [        XF86Mail ] };
+               key <I224> {    [   XF86Messenger ] };
+               key <I225> {    [      XF86Search ] };
+               key <I226> {    [          XF86Go ] };
+               key <I227> {    [     XF86Finance ] };
+               key <I228> {    [        XF86Game ] };
+               key <I229> {    [        XF86Shop ] };
+               key <I231> {    [          Cancel ] };
+               key <I232> {    [ XF86MonBrightnessDown ] };
+               key <I233> {    [ XF86MonBrightnessUp ] };
+               key <I234> {    [  XF86AudioMedia ] };
+               key <I235> {    [     XF86Display ] };
+               key <I236> {    [ XF86KbdLightOnOff ] };
+               key <I237> {    [ XF86KbdBrightnessDown ] };
+               key <I238> {    [ XF86KbdBrightnessUp ] };
+               key <I239> {    [        XF86Send ] };
+               key <I240> {    [       XF86Reply ] };
+               key <I241> {    [ XF86MailForward ] };
+               key <I242> {    [        XF86Save ] };
+               key <I243> {    [   XF86Documents ] };
+               key <I244> {    [     XF86Battery ] };
+               key <I245> {    [   XF86Bluetooth ] };
+               key <I246> {    [        XF86WLAN ] };
+               modifier_map Control { <LCTL> };
+               modifier_map Shift { <LFSH> };
+               modifier_map Shift { <RTSH> };
+               modifier_map Mod1 { <LALT> };
+               modifier_map Lock { <CAPS> };
+               modifier_map Mod2 { <NMLK> };
+               modifier_map Mod5 { <LVL3> };
+               modifier_map Control { <RCTL> };
+               modifier_map Mod1 { <RALT> };
+               modifier_map Mod4 { <LWIN> };
+               modifier_map Mod4 { <RWIN> };
+               modifier_map Mod5 { <MDSW> };
+               modifier_map Mod1 { <META> };
+               modifier_map Mod4 { <SUPR> };
+               modifier_map Mod4 { <HYPR> };
+       };
+};
index 2d0d960..d5ec635 100644 (file)
@@ -54,6 +54,7 @@ main(void)
     /* XXX check we actually get qwertz here ... */
     assert(test_file(ctx, "keymaps/default.xkb"));
     assert(test_file(ctx, "keymaps/comprehensive-plus-geom.xkb"));
+    assert(test_file(ctx, "keymaps/no-types.xkb"));
 
     assert(!test_file(ctx, "keymaps/divide-by-zero.xkb"));
     assert(!test_file(ctx, "keymaps/bad.xkb"));