[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