compat: reject interpret modifier predicate with more than one value
[platform/upstream/libxkbcommon.git] / src / xkbcomp / keymap-dump.c
index 3b1573d..5aea4b5 100644 (file)
@@ -126,7 +126,7 @@ write_vmods(struct xkb_keymap *keymap, struct buf *buf)
     const struct xkb_mod *mod;
     xkb_mod_index_t num_vmods = 0;
 
-    darray_foreach(mod, keymap->mods.mods) {
+    xkb_mods_foreach(mod, &keymap->mods) {
         if (mod->type != MOD_VIRT)
             continue;
 
@@ -172,7 +172,7 @@ write_keycodes(struct xkb_keymap *keymap, struct buf *buf)
                   KeyNameText(keymap->ctx, key->name), key->keycode);
     }
 
-    darray_enumerate(idx, led, keymap->leds)
+    xkb_leds_enumerate(idx, led, keymap)
         if (led->name != XKB_ATOM_NONE)
             write_buf(buf, "\tindicator %u = \"%s\";\n",
                       idx + 1, xkb_atom_text(keymap->ctx, led->name));
@@ -219,7 +219,7 @@ write_types(struct xkb_keymap *keymap, struct buf *buf)
                 continue;
 
             str = ModMaskText(keymap->ctx, &keymap->mods, entry->mods.mods);
-            write_buf(buf, "\t\tmap[%s]= Level%u;\n",
+            write_buf(buf, "\t\tmap[%s]= %u;\n",
                       str, entry->level + 1);
 
             if (entry->preserve.mods)
@@ -228,9 +228,9 @@ write_types(struct xkb_keymap *keymap, struct buf *buf)
                                            entry->preserve.mods));
         }
 
-        for (xkb_level_index_t n = 0; n < type->num_levels; n++)
+        for (xkb_level_index_t n = 0; n < type->num_level_names; n++)
             if (type->level_names[n])
-                write_buf(buf, "\t\tlevel_name[Level%u]= \"%s\";\n", n + 1,
+                write_buf(buf, "\t\tlevel_name[%u]= \"%s\";\n", n + 1,
                           xkb_atom_text(keymap->ctx, type->level_names[n]));
 
         write_buf(buf, "\t};\n");
@@ -304,9 +304,9 @@ write_action(struct xkb_keymap *keymap, struct buf *buf,
     type = ActionTypeText(action->type);
 
     switch (action->type) {
-    case ACTION_TYPE_MOD_LOCK:
     case ACTION_TYPE_MOD_SET:
     case ACTION_TYPE_MOD_LATCH:
+    case ACTION_TYPE_MOD_LOCK:
         if (action->mods.flags & ACTION_MODS_LOOKUP_MODMAP)
             args = "modMapMods";
         else
@@ -441,7 +441,7 @@ write_compat(struct xkb_keymap *keymap, struct buf *buf)
         write_buf(buf, "\t};\n");
     }
 
-    darray_foreach(led, keymap->leds)
+    xkb_leds_foreach(led, keymap)
         if (led->which_groups || led->groups || led->which_mods ||
             led->mods.mods || led->ctrls)
             write_led_map(keymap, buf, led);
@@ -455,7 +455,7 @@ static bool
 write_keysyms(struct xkb_keymap *keymap, struct buf *buf,
               const struct xkb_key *key, xkb_layout_index_t group)
 {
-    for (xkb_level_index_t level = 0; level < XkbKeyGroupWidth(key, group);
+    for (xkb_level_index_t level = 0; level < XkbKeyNumLevels(key, group);
          level++) {
         const xkb_keysym_t *syms;
         int num_syms;
@@ -515,7 +515,7 @@ write_key(struct xkb_keymap *keymap, struct buf *buf,
                     continue;
 
                 type = key->groups[group].type;
-                write_buf(buf, "\n\t\ttype[group%u]= \"%s\",",
+                write_buf(buf, "\n\t\ttype[Group%u]= \"%s\",",
                             group + 1,
                             xkb_atom_text(keymap->ctx, type->name));
             }
@@ -553,7 +553,7 @@ write_key(struct xkb_keymap *keymap, struct buf *buf,
         break;
     }
 
-    show_actions = !!(key->explicit & EXPLICIT_INTERP);
+    show_actions = (key->explicit & EXPLICIT_INTERP);
 
     if (key->num_groups > 1 || show_actions)
         simple = false;
@@ -576,8 +576,7 @@ write_key(struct xkb_keymap *keymap, struct buf *buf,
             write_buf(buf, " ]");
             if (show_actions) {
                 write_buf(buf, ",\n\t\tactions[Group%u]= [ ", group + 1);
-                for (level = 0;
-                        level < XkbKeyGroupWidth(key, group); level++) {
+                for (level = 0; level < XkbKeyNumLevels(key, group); level++) {
                     if (level != 0)
                         write_buf(buf, ", ");
                     write_action(keymap, buf,
@@ -598,6 +597,8 @@ write_symbols(struct xkb_keymap *keymap, struct buf *buf)
 {
     const struct xkb_key *key;
     xkb_layout_index_t group;
+    xkb_mod_index_t i;
+    const struct xkb_mod *mod;
 
     if (keymap->symbols_section_name)
         write_buf(buf, "xkb_symbols \"%s\" {\n",
@@ -608,7 +609,7 @@ write_symbols(struct xkb_keymap *keymap, struct buf *buf)
     for (group = 0; group < keymap->num_group_names; group++)
         if (keymap->group_names[group])
             write_buf(buf,
-                      "\tname[group%u]=\"%s\";\n", group + 1,
+                      "\tname[Group%u]=\"%s\";\n", group + 1,
                       xkb_atom_text(keymap->ctx, keymap->group_names[group]));
     if (group > 0)
         write_buf(buf, "\n");
@@ -617,18 +618,21 @@ write_symbols(struct xkb_keymap *keymap, struct buf *buf)
         if (key->num_groups > 0)
             write_key(keymap, buf, key);
 
-    xkb_keys_foreach(key, keymap) {
-        xkb_mod_index_t i;
-        const struct xkb_mod *mod;
-
-        if (key->modmap == 0)
-            continue;
-
-        darray_enumerate(i, mod, keymap->mods.mods)
-            if (key->modmap & (1u << i))
-                write_buf(buf, "\tmodifier_map %s { %s };\n",
-                          xkb_atom_text(keymap->ctx, mod->name),
+    xkb_mods_enumerate(i, mod, &keymap->mods) {
+        bool had_any = false;
+        xkb_keys_foreach(key, keymap) {
+            if (key->modmap & (1u << i)) {
+                if (!had_any)
+                    write_buf(buf, "\tmodifier_map %s { ",
+                              xkb_atom_text(keymap->ctx, mod->name));
+                write_buf(buf, "%s%s",
+                          had_any ? ", " : "",
                           KeyNameText(keymap->ctx, key->name));
+                had_any = true;
+            }
+        }
+        if (had_any)
+            write_buf(buf, " };\n");
     }
 
     write_buf(buf, "};\n\n");