static int dump_table(int fd) { char version[256], name[256]; int scancode, r = -1; if (evdev_driver_version(fd, version, sizeof(version)) < 0) goto fail; if (evdev_device_name(fd, name, sizeof(name)) < 0) goto fail; printf("### evdev %s, driver '%s'\n", version, name); r = 0; for (scancode = 0; scancode < MAX_SCANCODES; scancode++) { int keycode; if ((keycode = evdev_get_keycode(fd, scancode, 1)) < 0) { if (keycode == -2) continue; r = -1; break; } if (keycode < KEY_MAX && key_names[keycode]) printf("0x%03x %s\n", scancode, format_keyname(key_names[keycode])); else printf("0x%03x 0x%03x\n", scancode, keycode); } fail: return r; }
static int merge_table(int fd, FILE *f) { int r = 0; int line = 0; while (!feof(f)) { char s[256], *p; unsigned scancode; int new_keycode, old_keycode; if (!fgets(s, sizeof(s), f)) break; line++; p = s+strspn(s, "\t "); if (*p == '#' || *p == '\n') continue; if (sscanf(p, "%i %i", &scancode, &new_keycode) != 2) { char t[105] = "KEY_UNKNOWN"; const struct key *k; if (sscanf(p, "%i %100s", &scancode, t+4) != 2) { fprintf(stderr, "WARNING: Parse failure at line %i, ignoring.\n", line); r = -1; continue; } if (!(k = lookup_key(t, strlen(t)))) { fprintf(stderr, "WARNING: Unknown key '%s' at line %i, ignoring.\n", t, line); r = -1; continue; } new_keycode = k->id; } if ((old_keycode = evdev_get_keycode(fd, scancode, 0)) < 0) { r = -1; continue; } if (evdev_set_keycode(fd, scancode, new_keycode) < 0) { r = -1; continue; } if (new_keycode != old_keycode) fprintf(stderr, "Remapped scancode 0x%02x to 0x%02x (prior: 0x%02x)\n", scancode, new_keycode, old_keycode); } fclose(f); return r; }