summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2009-05-09 14:44:39 +0200
committerKay Sievers <kay.sievers@vrfy.org>2009-05-09 14:44:39 +0200
commit14fcd34a09d26c8db59b2c1b23ef7fe1d890b89d (patch)
tree4007b142a01b710e3e11987ccdb375eeab2092b8
parent8dff60dac643f713ea3a9e2e09af0829d3215551 (diff)
keymap: add .gitignore and replace whitespace
-rw-r--r--keymap/.gitignore6
-rw-r--r--keymap/keymap.c367
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;
}