[systemd-devel] [PATCH 3/6] udev: builtin-keyboard: move actual key mapping to a helper function
David Herrmann
dh.herrmann at gmail.com
Tue Apr 7 02:50:20 PDT 2015
Hi
On Mon, Mar 23, 2015 at 2:30 AM, Peter Hutterer
<peter.hutterer at who-t.net> wrote:
> No changes in the mapping, but previously we opened the device only on
> successful parsing. Now we open the mapping as soon as we have a value that
> looks interesting. Since errors are supposed to be the exception, not the
> rule, this is probably fine.
> ---
> src/udev/udev-builtin-keyboard.c | 59 ++++++++++++++++++++++------------------
> 1 file changed, 33 insertions(+), 26 deletions(-)
All fine, please push!
Thanks
David
> diff --git a/src/udev/udev-builtin-keyboard.c b/src/udev/udev-builtin-keyboard.c
> index b3396d5..8353249 100644
> --- a/src/udev/udev-builtin-keyboard.c
> +++ b/src/udev/udev-builtin-keyboard.c
> @@ -62,12 +62,41 @@ static int install_force_release(struct udev_device *dev, const unsigned *releas
> return ret;
> }
>
> -static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], bool test) {
> - struct udev_list_entry *entry;
> +static void map_keycode(int fd, const char *devnode, int scancode, const char *keycode)
> +{
> struct {
> unsigned scan;
> unsigned key;
> } map;
> + char *endptr;
> + const struct key *k;
> + unsigned keycode_num;
> +
> + /* translate identifier to key code */
> + k = keyboard_lookup_key(keycode, strlen(keycode));
> + if (k) {
> + keycode_num = k->id;
> + } else {
> + /* check if it's a numeric code already */
> + keycode_num = strtoul(keycode, &endptr, 0);
> + if (endptr[0] !='\0') {
> + log_error("Error, unknown key identifier '%s'", keycode);
> + return;
> + }
> + }
> +
> + map.scan = scancode;
> + map.key = keycode_num;
> +
> + log_debug("keyboard: mapping scan code %d (0x%x) to key code %d (0x%x)",
> + map.scan, map.scan, map.key, map.key);
> +
> + if (ioctl(fd, EVIOCSKEYCODE, &map) < 0)
> + log_error_errno(errno, "Error calling EVIOCSKEYCODE on device node '%s' (scan code 0x%x, key code %d): %m", devnode, map.scan, map.key);
> +}
> +
> +static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], bool test) {
> + struct udev_list_entry *entry;
> unsigned release[1024];
> unsigned release_count = 0;
> _cleanup_close_ int fd = -1;
> @@ -82,10 +111,9 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo
>
> udev_list_entry_foreach(entry, udev_device_get_properties_list_entry(dev)) {
> const char *key;
> - unsigned scancode, keycode_num;
> char *endptr;
> + unsigned scancode;
> const char *keycode;
> - const struct key *k;
>
> key = udev_list_entry_get_name(entry);
> if (!startswith(key, "KEYBOARD_KEY_"))
> @@ -112,19 +140,6 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo
> continue;
> }
>
> - /* translate identifier to key code */
> - k = keyboard_lookup_key(keycode, strlen(keycode));
> - if (k) {
> - keycode_num = k->id;
> - } else {
> - /* check if it's a numeric code already */
> - keycode_num = strtoul(keycode, &endptr, 0);
> - if (endptr[0] !='\0') {
> - log_error("Error, unknown key identifier '%s'", keycode);
> - continue;
> - }
> - }
> -
> if (fd == -1) {
> fd = open(node, O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
> if (fd < 0) {
> @@ -133,15 +148,7 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo
> }
> }
>
> - map.scan = scancode;
> - map.key = keycode_num;
> -
> - log_debug("keyboard: mapping scan code %d (0x%x) to key code %d (0x%x)",
> - map.scan, map.scan, map.key, map.key);
> -
> - if (ioctl(fd, EVIOCSKEYCODE, &map) < 0)
> - log_error_errno(errno, "Error calling EVIOCSKEYCODE on device node '%s' (scan code 0x%x, key code %d): %m", node, map.scan, map.key);
> -
> + map_keycode(fd, node, scancode, keycode);
> }
>
> /* install list of force-release codes */
> --
> 2.3.2
>
More information about the systemd-devel
mailing list