diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2009-05-09 14:44:39 +0200 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2009-05-09 14:44:39 +0200 |
commit | 14fcd34a09d26c8db59b2c1b23ef7fe1d890b89d (patch) | |
tree | 4007b142a01b710e3e11987ccdb375eeab2092b8 | |
parent | 8dff60dac643f713ea3a9e2e09af0829d3215551 (diff) |
keymap: add .gitignore and replace whitespace
-rw-r--r-- | keymap/.gitignore | 6 | ||||
-rw-r--r-- | keymap/keymap.c | 367 |
2 files changed, 194 insertions, 179 deletions
diff --git a/keymap/.gitignore b/keymap/.gitignore new file mode 100644 index 0000000..f2c4c8d --- /dev/null +++ b/keymap/.gitignore @@ -0,0 +1,6 @@ +keymap +keys-from-name.gperf +keys-from-name.h +keys-to-name.h +keys.txt + diff --git a/keymap/keymap.c b/keymap/keymap.c index b7ed547..516dbc0 100644 --- a/keymap/keymap.c +++ b/keymap/keymap.c @@ -29,8 +29,8 @@ #include <errno.h> #include <limits.h> #include <fcntl.h> +#include <getopt.h> #include <sys/ioctl.h> - #include <linux/input.h> const struct key* lookup_key (const char *str, unsigned int len); @@ -43,217 +43,226 @@ const struct key* lookup_key (const char *str, unsigned int len); /* If keymap file is given without a path, assume this one; must end with '/' * */ #define DEFAULT_PATH "/lib/udev/keymaps/" -static int evdev_open(const char *dev) { - int fd; - char fn[PATH_MAX]; - - if (strncmp(dev, "/dev", 4) != 0) { - snprintf(fn, sizeof(fn), "/dev/%s", dev); - dev = fn; - } - - if ((fd = open(dev, O_RDWR)) < 0) { - fprintf(stderr, "open('%s'): %s\n", dev, strerror(errno)); - return -1; - } - - return fd; +static int evdev_open(const char *dev) +{ + int fd; + char fn[PATH_MAX]; + + if (strncmp(dev, "/dev", 4) != 0) { + snprintf(fn, sizeof(fn), "/dev/%s", dev); + dev = fn; + } + + if ((fd = open(dev, O_RDWR)) < 0) { + fprintf(stderr, "error open('%s'): %m\n", dev); + return -1; + } + return fd; } -static int evdev_get_keycode(int fd, int scancode, int e) { - int codes[2]; - - codes[0] = scancode; - if (ioctl(fd, EVIOCGKEYCODE, codes) < 0) { - if (e && errno == EINVAL) - return -2; - else { - fprintf(stderr, "EVIOCGKEYCODE: %s\n", strerror(errno)); - return -1; - } - } - - return codes[1]; +static int evdev_get_keycode(int fd, int scancode, int e) +{ + int codes[2]; + + codes[0] = scancode; + if (ioctl(fd, EVIOCGKEYCODE, codes) < 0) { + if (e && errno == EINVAL) { + return -2; + } else { + fprintf(stderr, "EVIOCGKEYCODE: %m\n"); + return -1; + } + } + return codes[1]; } -static int evdev_set_keycode(int fd, int scancode, int keycode) { - int codes[2]; +static int evdev_set_keycode(int fd, int scancode, int keycode) +{ + int codes[2]; - codes[0] = scancode; - codes[1] = keycode; - - if (ioctl(fd, EVIOCSKEYCODE, codes) < 0) { - fprintf(stderr, "EVIOCSKEYCODE: %s\n", strerror(errno)); - return -1; - } + codes[0] = scancode; + codes[1] = keycode; - return 0; + if (ioctl(fd, EVIOCSKEYCODE, codes) < 0) { + fprintf(stderr, "EVIOCSKEYCODE: %m\n"); + return -1; + } + return 0; } -static int evdev_driver_version(int fd, char *v, size_t l) { - int version; - - if (ioctl(fd, EVIOCGVERSION, &version)) { - fprintf(stderr, "EVIOCGVERSION: %s\n", strerror(errno)); - return -1; - } - - snprintf(v, l, - "%i.%i.%i.", - version >> 16, - (version >> 8) & 0xff, - version & 0xff); - - return 0; +static int evdev_driver_version(int fd, char *v, size_t l) +{ + int version; + + if (ioctl(fd, EVIOCGVERSION, &version)) { + fprintf(stderr, "EVIOCGVERSION: %m\n"); + return -1; + } + + snprintf(v, l, "%i.%i.%i.", version >> 16, (version >> 8) & 0xff, version & 0xff); + return 0; } -static int evdev_device_name(int fd, char *n, size_t l) { - - if (ioctl(fd, EVIOCGNAME(l), n) < 0) { - fprintf(stderr, "EVIOCGNAME: %s\n", strerror(errno)); - return -1; - } - - return 0; +static int evdev_device_name(int fd, char *n, size_t l) +{ + if (ioctl(fd, EVIOCGNAME(l), n) < 0) { + fprintf(stderr, "EVIOCGNAME: %m\n"); + return -1; + } + return 0; } /* Return a lower-case string with KEY_ prefix removed */ static const char* format_keyname(const char* key) { - static char result[101]; - const char* s; - int len; - - for (s = key+4, len = 0; *s && len < 100; ++len, ++s) - result[len] = tolower(*s); - result[len] = '\0'; + static char result[101]; + const char* s; + int len; - return result; + for (s = key+4, len = 0; *s && len < 100; ++len, ++s) + result[len] = tolower(*s); + result[len] = '\0'; + return result; } 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; + char version[256], name[256]; + int scancode, r = -1; - if (evdev_device_name(fd, name, sizeof(name)) < 0) - goto fail; + if (evdev_driver_version(fd, version, sizeof(version)) < 0) + goto fail; - printf("### evdev %s, driver '%s'\n", version, name); + if (evdev_device_name(fd, name, sizeof(name)) < 0) + goto fail; - r = 0; - - for (scancode = 0; scancode < MAX_SCANCODES; scancode++) { - int keycode; + printf("### evdev %s, driver '%s'\n", version, name); - if ((keycode = evdev_get_keycode(fd, scancode, 1)) < 0) { - if (keycode != -2) - r = -1; - - break; - } + r = 0; + for (scancode = 0; scancode < MAX_SCANCODES; scancode++) { + int keycode; - 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); - } + if ((keycode = evdev_get_keycode(fd, scancode, 1)) < 0) { + if (keycode != -2) + 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; + return r; } static int merge_table(int fd, const char *filename) { - int r = 0; - int line = 0; - FILE* f; - - f = fopen(filename, "r"); - if (!f) { - perror(filename); - r = -1; - goto fail; - } - while (!feof(f)) { - char s[256], *p; - int scancode, 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; - goto fail; - } - - if (evdev_set_keycode(fd, scancode, new_keycode) < 0) { - r = -1; - goto fail; - } - - if (new_keycode != old_keycode) - fprintf(stderr, "Remapped scancode 0x%02x to 0x%02x (prior: 0x%02x)\n", scancode, new_keycode, old_keycode); - } - + int r = 0; + int line = 0; + FILE* f; + + f = fopen(filename, "r"); + if (!f) { + perror(filename); + r = -1; + goto fail; + } + + while (!feof(f)) { + char s[256], *p; + int scancode, 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; + goto fail; + } + + if (evdev_set_keycode(fd, scancode, new_keycode) < 0) { + r = -1; + goto fail; + } + + if (new_keycode != old_keycode) + fprintf(stderr, "Remapped scancode 0x%02x to 0x%02x (prior: 0x%02x)\n", + scancode, new_keycode, old_keycode); + } fail: - - return r; + return r; } -static const char* default_keymap_path(const char* path) { - static char result[PATH_MAX]; - - if (!strchr(path, '/')) { - snprintf(result, sizeof(result), "%s%s", DEFAULT_PATH, path); - return result; - } - return path; +static const char* default_keymap_path(const char* path) +{ + static char result[PATH_MAX]; + + if (!strchr(path, '/')) { + snprintf(result, sizeof(result), "%s%s", DEFAULT_PATH, path); + return result; + } + return path; } int main(int argc, char **argv) { - int fd = -1; - - if (argc < 2 || argc > 3) { - printf("Usage: %s <event device> [<map file>]\n", argv[0]); - exit(1); - } - - if ((fd = evdev_open(argv[1])) < 0) - return 1; - - if (argc == 3) - merge_table(fd, default_keymap_path(argv[2])); - else - dump_table(fd); - - return 0; + static const struct option options[] = { + { "help", no_argument, NULL, 'h' }, + {} + }; + int fd = -1; + + while (1) { + int option; + + option = getopt_long(argc, argv, "h", options, NULL); + if (option == -1) + break; + + switch (option) { + case 'h': + printf("Usage: keymap <event device> [<map file>]\n\n"); + return 0; + default: + return 1; + } + } + + if (argc < 2 || argc > 3) { + fprintf(stderr, "Usage: keymap <event device> [<map file>]\n\n"); + return 2; + } + + if ((fd = evdev_open(argv[1])) < 0) + return 3; + + if (argc == 3) + merge_table(fd, default_keymap_path(argv[2])); + else + dump_table(fd); + return 0; } |