|
|
dd65c9 |
From 3b4e03492fd157ab87ea625a8ad1eb91cef7396b Mon Sep 17 00:00:00 2001
|
|
|
dd65c9 |
From: Peter Hutterer <peter.hutterer@who-t.net>
|
|
|
dd65c9 |
Date: Fri, 20 Mar 2015 13:17:20 +1000
|
|
|
dd65c9 |
Subject: [PATCH] udev: builtin-keyboard: move actual key mapping to a helper
|
|
|
dd65c9 |
function
|
|
|
dd65c9 |
|
|
|
dd65c9 |
No changes in the mapping, but previously we opened the device only on
|
|
|
dd65c9 |
successful parsing. Now we open the mapping as soon as we have a value that
|
|
|
dd65c9 |
looks interesting. Since errors are supposed to be the exception, not the
|
|
|
dd65c9 |
rule, this is probably fine.
|
|
|
dd65c9 |
|
|
|
dd65c9 |
(cherry picked from commit c9a8e34094733018727677fee44be2c2952224c0)
|
|
|
dd65c9 |
|
|
|
dd65c9 |
Resolves: #1500119
|
|
|
dd65c9 |
---
|
|
|
dd65c9 |
src/udev/udev-builtin-keyboard.c | 58 +++++++++++++++++++++++-----------------
|
|
|
dd65c9 |
1 file changed, 33 insertions(+), 25 deletions(-)
|
|
|
dd65c9 |
|
|
|
dd65c9 |
diff --git a/src/udev/udev-builtin-keyboard.c b/src/udev/udev-builtin-keyboard.c
|
|
|
dd65c9 |
index 515edd45c..f33401790 100644
|
|
|
dd65c9 |
--- a/src/udev/udev-builtin-keyboard.c
|
|
|
dd65c9 |
+++ b/src/udev/udev-builtin-keyboard.c
|
|
|
dd65c9 |
@@ -66,12 +66,41 @@ static int install_force_release(struct udev_device *dev, const unsigned *releas
|
|
|
dd65c9 |
return ret;
|
|
|
dd65c9 |
}
|
|
|
dd65c9 |
|
|
|
dd65c9 |
-static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], bool test) {
|
|
|
dd65c9 |
- struct udev_list_entry *entry;
|
|
|
dd65c9 |
+static void map_keycode(int fd, const char *devnode, int scancode, const char *keycode)
|
|
|
dd65c9 |
+{
|
|
|
dd65c9 |
struct {
|
|
|
dd65c9 |
unsigned scan;
|
|
|
dd65c9 |
unsigned key;
|
|
|
dd65c9 |
} map;
|
|
|
dd65c9 |
+ char *endptr;
|
|
|
dd65c9 |
+ const struct key *k;
|
|
|
dd65c9 |
+ unsigned keycode_num;
|
|
|
dd65c9 |
+
|
|
|
dd65c9 |
+ /* translate identifier to key code */
|
|
|
dd65c9 |
+ k = keyboard_lookup_key(keycode, strlen(keycode));
|
|
|
dd65c9 |
+ if (k) {
|
|
|
dd65c9 |
+ keycode_num = k->id;
|
|
|
dd65c9 |
+ } else {
|
|
|
dd65c9 |
+ /* check if it's a numeric code already */
|
|
|
dd65c9 |
+ keycode_num = strtoul(keycode, &endptr, 0);
|
|
|
dd65c9 |
+ if (endptr[0] !='\0') {
|
|
|
dd65c9 |
+ log_error("Error, unknown key identifier '%s'", keycode);
|
|
|
dd65c9 |
+ return;
|
|
|
dd65c9 |
+ }
|
|
|
dd65c9 |
+ }
|
|
|
dd65c9 |
+
|
|
|
dd65c9 |
+ map.scan = scancode;
|
|
|
dd65c9 |
+ map.key = keycode_num;
|
|
|
dd65c9 |
+
|
|
|
dd65c9 |
+ log_debug("keyboard: mapping scan code %d (0x%x) to key code %d (0x%x)",
|
|
|
dd65c9 |
+ map.scan, map.scan, map.key, map.key);
|
|
|
dd65c9 |
+
|
|
|
dd65c9 |
+ if (ioctl(fd, EVIOCSKEYCODE, &map) < 0)
|
|
|
dd65c9 |
+ log_error_errno(errno, "Error calling EVIOCSKEYCODE on device node '%s' (scan code 0x%x, key code %d): %m", devnode, map.scan, map.key);
|
|
|
dd65c9 |
+}
|
|
|
dd65c9 |
+
|
|
|
dd65c9 |
+static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], bool test) {
|
|
|
dd65c9 |
+ struct udev_list_entry *entry;
|
|
|
dd65c9 |
unsigned release[1024];
|
|
|
dd65c9 |
unsigned release_count = 0;
|
|
|
dd65c9 |
_cleanup_close_ int fd = -1;
|
|
|
dd65c9 |
@@ -85,10 +114,9 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo
|
|
|
dd65c9 |
|
|
|
dd65c9 |
udev_list_entry_foreach(entry, udev_device_get_properties_list_entry(dev)) {
|
|
|
dd65c9 |
const char *key;
|
|
|
dd65c9 |
- unsigned scancode, keycode_num;
|
|
|
dd65c9 |
char *endptr;
|
|
|
dd65c9 |
+ unsigned scancode;
|
|
|
dd65c9 |
const char *keycode;
|
|
|
dd65c9 |
- const struct key *k;
|
|
|
dd65c9 |
|
|
|
dd65c9 |
key = udev_list_entry_get_name(entry);
|
|
|
dd65c9 |
if (!startswith(key, "KEYBOARD_KEY_"))
|
|
|
dd65c9 |
@@ -115,19 +143,6 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo
|
|
|
dd65c9 |
continue;
|
|
|
dd65c9 |
}
|
|
|
dd65c9 |
|
|
|
dd65c9 |
- /* translate identifier to key code */
|
|
|
dd65c9 |
- k = keyboard_lookup_key(keycode, strlen(keycode));
|
|
|
dd65c9 |
- if (k) {
|
|
|
dd65c9 |
- keycode_num = k->id;
|
|
|
dd65c9 |
- } else {
|
|
|
dd65c9 |
- /* check if it's a numeric code already */
|
|
|
dd65c9 |
- keycode_num = strtoul(keycode, &endptr, 0);
|
|
|
dd65c9 |
- if (endptr[0] !='\0') {
|
|
|
dd65c9 |
- log_error("Error, unknown key identifier '%s'", keycode);
|
|
|
dd65c9 |
- continue;
|
|
|
dd65c9 |
- }
|
|
|
dd65c9 |
- }
|
|
|
dd65c9 |
-
|
|
|
dd65c9 |
if (fd == -1) {
|
|
|
dd65c9 |
fd = open(node, O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
|
|
|
dd65c9 |
if (fd < 0) {
|
|
|
dd65c9 |
@@ -136,14 +151,7 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo
|
|
|
dd65c9 |
}
|
|
|
dd65c9 |
}
|
|
|
dd65c9 |
|
|
|
dd65c9 |
- map.scan = scancode;
|
|
|
dd65c9 |
- map.key = keycode_num;
|
|
|
dd65c9 |
-
|
|
|
dd65c9 |
- log_debug("keyboard: mapping scan code %d (0x%x) to key code %d (0x%x)",
|
|
|
dd65c9 |
- map.scan, map.scan, map.key, map.key);
|
|
|
dd65c9 |
-
|
|
|
dd65c9 |
- if (ioctl(fd, EVIOCSKEYCODE, &map) < 0)
|
|
|
dd65c9 |
- log_error_errno(errno, "Error calling EVIOCSKEYCODE on device node '%s' (scan code 0x%x, key code %d): %m", node, map.scan, map.key);
|
|
|
dd65c9 |
+ map_keycode(fd, node, scancode, keycode);
|
|
|
dd65c9 |
}
|
|
|
dd65c9 |
|
|
|
dd65c9 |
/* install list of force-release codes */
|