Pass around xkb_key's instead of keycodes
[platform/upstream/libxkbcommon.git] / src / keymap-dump.c
index b44a909..071996a 100644 (file)
@@ -309,7 +309,7 @@ static bool
 write_keycodes(struct xkb_keymap *keymap, char **buf, size_t *size,
                size_t *offset)
 {
-    xkb_keycode_t kc;
+    struct xkb_key *key;
     struct xkb_key_alias *alias;
     int i;
 
@@ -324,13 +324,12 @@ write_keycodes(struct xkb_keymap *keymap, char **buf, size_t *size,
     write_buf(keymap, buf, size, offset, "\t\tmaximum = %d;\n",
               keymap->max_key_code);
 
-    for (kc = keymap->min_key_code; kc <= keymap->max_key_code; kc++) {
-        if (darray_item(keymap->key_names, kc).name[0] == '\0')
+    xkb_foreach_key(key, keymap) {
+        if (key->name[0] == '\0')
             continue;
 
         write_buf(keymap, buf, size, offset, "\t\t%6s = %d;\n",
-                  XkbcKeyNameText(darray_item(keymap->key_names, kc).name),
-                  kc);
+                  XkbcKeyNameText(key->name), XkbKeyGetKeycode(keymap, key));
     }
 
     for (i = 0; i < XkbNumIndicators; i++) {
@@ -740,17 +739,17 @@ write_compat(struct xkb_keymap *keymap, char **buf, size_t *size,
 
 static bool
 write_keysyms(struct xkb_keymap *keymap, char **buf, size_t *size,
-              size_t *offset, xkb_keycode_t kc, unsigned int group)
+              size_t *offset, struct xkb_key *key, unsigned int group)
 {
     const xkb_keysym_t *syms;
     int num_syms, level;
 #define OUT_BUF_LEN 128
     char out_buf[OUT_BUF_LEN];
 
-    for (level = 0; level < XkbKeyGroupWidth(keymap, kc, group); level++) {
+    for (level = 0; level < XkbKeyGroupWidth(keymap, key, group); level++) {
         if (level != 0)
             write_buf(keymap, buf, size, offset, ", ");
-        num_syms = xkb_key_get_syms_by_level(keymap, kc, group, level,
+        num_syms = xkb_key_get_syms_by_level(keymap, key, group, level,
                                              &syms);
         if (num_syms == 0) {
             write_buf(keymap, buf, size, offset, "%15s", "NoSymbol");
@@ -780,7 +779,7 @@ static bool
 write_symbols(struct xkb_keymap *keymap, char **buf, size_t *size,
               size_t *offset)
 {
-    xkb_keycode_t kc;
+    struct xkb_key *key;
     int group, tmp;
     bool showActions;
 
@@ -801,65 +800,62 @@ write_symbols(struct xkb_keymap *keymap, char **buf, size_t *size,
     if (tmp > 0)
         write_buf(keymap, buf, size, offset, "\n");
 
-    for (kc = keymap->min_key_code; kc <= keymap->max_key_code; kc++) {
+    xkb_foreach_key(key, keymap) {
         bool simple = true;
 
-        if (xkb_key_num_groups(keymap, kc) == 0)
+        if (key->num_groups == 0)
             continue;
 
         write_buf(keymap, buf, size, offset, "\t\tkey %6s {",
-                  XkbcKeyNameText(darray_item(keymap->key_names, kc).name));
-        if (keymap->explicit) {
-            if ((keymap->explicit[kc] & XkbExplicitKeyTypesMask)) {
-                bool multi_type = false;
-                int type = XkbKeyTypeIndex(keymap, kc, 0);
-
-                simple = false;
-
-                for (group = 0; group < xkb_key_num_groups(keymap, kc);
-                     group++) {
-                    if (XkbKeyTypeIndex(keymap, kc, group) != type) {
-                        multi_type = true;
-                        break;
-                    }
-                }
-                if (multi_type) {
-                    for (group = 0;
-                         group < xkb_key_num_groups(keymap, kc);
-                         group++) {
-                        if (!(keymap->explicit[kc] & (1 << group)))
-                            continue;
-                        type = XkbKeyTypeIndex(keymap, kc, group);
-                        write_buf(keymap, buf, size, offset,
-                                  "\n\t\t\ttype[group%d]= \"%s\",",
-                                  group + 1,
-                                  darray_item(keymap->types, type).name);
-                    }
+                  XkbcKeyNameText(key->name));
+
+        if (key->explicit & XkbExplicitKeyTypesMask) {
+            bool multi_type = false;
+            int type = XkbKeyTypeIndex(key, 0);
+
+            simple = false;
+
+            for (group = 0; group < key->num_groups; group++) {
+                if (XkbKeyTypeIndex(key, group) != type) {
+                    multi_type = true;
+                    break;
                 }
-                else {
+            }
+
+            if (multi_type) {
+                for (group = 0; group < key->num_groups; group++) {
+                    if (!(key->explicit & (1 << group)))
+                        continue;
+                    type = XkbKeyTypeIndex(key, group);
                     write_buf(keymap, buf, size, offset,
-                              "\n\t\t\ttype= \"%s\",",
+                              "\n\t\t\ttype[group%d]= \"%s\",",
+                              group + 1,
                               darray_item(keymap->types, type).name);
                 }
             }
-            if (keymap->explicit[kc] & XkbExplicitAutoRepeatMask) {
-                if (keymap->per_key_repeat[kc / 8] & (1 << (kc % 8)))
-                    write_buf(keymap, buf, size, offset,
-                              "\n\t\t\trepeat= Yes,");
-                else
-                    write_buf(keymap, buf, size, offset,
-                              "\n\t\t\trepeat= No,");
-                simple = false;
-            }
-            if (keymap->vmodmap[kc] &&
-                (keymap->explicit[kc] & XkbExplicitVModMapMask)) {
+            else {
                 write_buf(keymap, buf, size, offset,
-                          "\n\t\t\tvirtualMods= %s,",
-                          get_mod_mask_text(keymap, 0, keymap->vmodmap[kc]));
+                          "\n\t\t\ttype= \"%s\",",
+                          darray_item(keymap->types, type).name);
             }
         }
 
-        switch (XkbOutOfRangeGroupAction(XkbKeyGroupInfo(keymap, kc))) {
+        if (key->explicit & XkbExplicitAutoRepeatMask) {
+            if (key->repeats)
+                write_buf(keymap, buf, size, offset,
+                          "\n\t\t\trepeat= Yes,");
+            else
+                write_buf(keymap, buf, size, offset,
+                          "\n\t\t\trepeat= No,");
+            simple = false;
+        }
+
+        if (key->vmodmap && (key->explicit & XkbExplicitVModMapMask)) {
+            write_buf(keymap, buf, size, offset, "\n\t\t\tvirtualMods= %s,",
+                      get_mod_mask_text(keymap, 0, key->vmodmap));
+        }
+
+        switch (key->out_of_range_group_action) {
         case XkbClampIntoRange:
             write_buf(keymap, buf, size, offset, "\n\t\t\tgroupsClamp,");
             break;
@@ -867,23 +863,21 @@ write_symbols(struct xkb_keymap *keymap, char **buf, size_t *size,
         case XkbRedirectIntoRange:
             write_buf(keymap, buf, size, offset,
                       "\n\t\t\tgroupsRedirect= Group%d,",
-                      XkbOutOfRangeGroupNumber(XkbKeyGroupInfo(keymap,
-                                                               kc)) + 1);
+                      key->out_of_range_group_number + 1);
             break;
         }
 
-        if (keymap->explicit == NULL ||
-            (keymap->explicit[kc] & XkbExplicitInterpretMask))
-            showActions = XkbKeyHasActions(keymap, kc);
+        if (key->explicit & XkbExplicitInterpretMask)
+            showActions = XkbKeyHasActions(key);
         else
             showActions = false;
 
-        if (xkb_key_num_groups(keymap, kc) > 1 || showActions)
+        if (key->num_groups > 1 || showActions)
             simple = false;
 
         if (simple) {
             write_buf(keymap, buf, size, offset, "\t[ ");
-            if (!write_keysyms(keymap, buf, size, offset, kc, 0))
+            if (!write_keysyms(keymap, buf, size, offset, key, 0))
                 return false;
             write_buf(keymap, buf, size, offset, " ] };\n");
         }
@@ -891,20 +885,20 @@ write_symbols(struct xkb_keymap *keymap, char **buf, size_t *size,
             union xkb_action *acts;
             int level;
 
-            acts = XkbKeyActionsPtr(keymap, kc);
-            for (group = 0; group < xkb_key_num_groups(keymap, kc); group++) {
+            acts = XkbKeyActionsPtr(keymap, key);
+            for (group = 0; group < key->num_groups; group++) {
                 if (group != 0)
                     write_buf(keymap, buf, size, offset, ",");
                 write_buf(keymap, buf, size, offset,
                           "\n\t\t\tsymbols[Group%d]= [ ", group + 1);
-                if (!write_keysyms(keymap, buf, size, offset, kc, group))
+                if (!write_keysyms(keymap, buf, size, offset, key, group))
                     return false;
                 write_buf(keymap, buf, size, offset, " ]");
                 if (showActions) {
                     write_buf(keymap, buf, size, offset,
                               ",\n\t\t\tactions[Group%d]= [ ", group + 1);
                     for (level = 0;
-                         level < XkbKeyGroupWidth(keymap, kc, group);
+                         level < XkbKeyGroupWidth(keymap, key, group);
                          level++) {
                         if (level != 0)
                             write_buf(keymap, buf, size, offset, ", ");
@@ -912,29 +906,27 @@ write_symbols(struct xkb_keymap *keymap, char **buf, size_t *size,
                                      NULL, NULL);
                     }
                     write_buf(keymap, buf, size, offset, " ]");
-                    acts += XkbKeyGroupsWidth(keymap, kc);
+                    acts += key->width;
                 }
             }
             write_buf(keymap, buf, size, offset, "\n\t\t};\n");
         }
     }
-    if (keymap->modmap) {
-        for (kc = keymap->min_key_code; kc <= keymap->max_key_code; kc++) {
-            int mod;
 
-            if (keymap->modmap[kc] == 0)
-                continue;
+    xkb_foreach_key(key, keymap) {
+        int mod;
 
-            for (mod = 0; mod < XkbNumModifiers; mod++) {
-                if (!(keymap->modmap[kc] & (1 << mod)))
-                    continue;
+        if (key->modmap == 0)
+            continue;
 
-                write_buf(keymap, buf, size, offset,
-                          "\t\tmodifier_map %s { %s };\n",
-                          get_mod_index_text(mod),
-                          XkbcKeyNameText(darray_item(keymap->key_names,
-                                                      kc).name));
-            }
+        for (mod = 0; mod < XkbNumModifiers; mod++) {
+            if (!(key->modmap & (1 << mod)))
+                continue;
+
+            write_buf(keymap, buf, size, offset,
+                      "\t\tmodifier_map %s { %s };\n",
+                      get_mod_index_text(mod),
+                      XkbcKeyNameText(key->name));
         }
     }