From: David Herrmann Date: Thu, 15 Jan 2015 11:40:38 +0000 (+0100) Subject: udev: merge evdev_id into input_id X-Git-Tag: v219~486 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=244477333afc8b95d2a5b2c05b7d8fe8b1be89c0 udev: merge evdev_id into input_id There is no reason to keep both separated. We want to avoid API specific tools and instead keep generic terms like 'input'. --- diff --git a/Makefile.am b/Makefile.am index 4fa454ed9..ff69bb93d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3518,7 +3518,6 @@ dist_udevrules_DATA += \ rules/42-usb-hid-pm.rules \ rules/50-udev-default.rules \ rules/60-drm.rules \ - rules/60-evdev_id.rules \ rules/60-keyboard.rules \ rules/70-mouse.rules \ rules/60-persistent-storage-tape.rules \ @@ -3602,7 +3601,6 @@ libudev_core_la_SOURCES = \ src/udev/udev-builtin.c \ src/udev/udev-builtin-btrfs.c \ src/udev/udev-builtin-hwdb.c \ - src/udev/udev-builtin-evdev_id.c \ src/udev/udev-builtin-input_id.c \ src/udev/udev-builtin-keyboard.c \ src/udev/udev-builtin-net_id.c \ diff --git a/rules/60-evdev_id.rules b/rules/60-evdev_id.rules deleted file mode 100644 index 4716a1034..000000000 --- a/rules/60-evdev_id.rules +++ /dev/null @@ -1,10 +0,0 @@ -# do not edit this file, it will be overwritten on update - -ACTION!="add", GOTO="evdev_id_end" -SUBSYSTEM!="input", GOTO="evdev_id_end" -KERNEL!="event*", GOTO="evdev_id_end" - -ENV{ID_INPUT_TOUCHSCREEN}=="1", IMPORT{builtin}="evdev_id" -ENV{ID_INPUT_TABLET}=="1", IMPORT{builtin}="evdev_id" - -LABEL="evdev_id_end" diff --git a/src/udev/udev-builtin-evdev_id.c b/src/udev/udev-builtin-evdev_id.c deleted file mode 100644 index 1b58bdda3..000000000 --- a/src/udev/udev-builtin-evdev_id.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * evdev_id - extracts miscellaneous information from evdev devices - * - * Copyright (C) 2014 Red Hat - * Author: - * Carlos Garnacho - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with keymap; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - */ - -#include -#include "udev.h" -#include "util.h" - -static inline int abs_size_mm(const struct input_absinfo *absinfo) { - /* Resolution is defined to be in units/mm for ABS_X/Y */ - return (absinfo->maximum - absinfo->minimum) / absinfo->resolution; -} - -static void extract_info(struct udev_device *dev, const char *devpath, bool test) { - char width[DECIMAL_STR_MAX(int)], height[DECIMAL_STR_MAX(int)]; - struct input_absinfo xabsinfo = {}, yabsinfo = {}; - _cleanup_close_ int fd = -1; - - fd = open(devpath, O_RDONLY|O_CLOEXEC); - if (fd < 0) - return; - - if (ioctl(fd, EVIOCGABS(ABS_X), &xabsinfo) < 0 || - ioctl(fd, EVIOCGABS(ABS_Y), &yabsinfo) < 0) - return; - - if (xabsinfo.resolution <= 0 || yabsinfo.resolution <= 0) - return; - - snprintf(width, sizeof(width), "%d", abs_size_mm(&xabsinfo)); - snprintf(height, sizeof(height), "%d", abs_size_mm(&yabsinfo)); - - udev_builtin_add_property(dev, test, "ID_INPUT_WIDTH_MM", width); - udev_builtin_add_property(dev, test, "ID_INPUT_HEIGHT_MM", height); -} - -static int builtin_evdev_id(struct udev_device *dev, int argc, char *argv[], bool test) { - const char *subsystem; - const char *devnode; - - subsystem = udev_device_get_subsystem(dev); - - if (!subsystem || !streq(subsystem, "input")) - return EXIT_SUCCESS; - - devnode = udev_device_get_devnode(dev); - /* not an evdev node */ - if (!devnode) - return EXIT_SUCCESS; - - extract_info(dev, devnode, test); - - return EXIT_SUCCESS; -} - -const struct udev_builtin udev_builtin_evdev_id = { - .name = "evdev_id", - .cmd = builtin_evdev_id, - .help = "evdev devices information", -}; diff --git a/src/udev/udev-builtin-input_id.c b/src/udev/udev-builtin-input_id.c index e6fd07726..26c723225 100644 --- a/src/udev/udev-builtin-input_id.c +++ b/src/udev/udev-builtin-input_id.c @@ -1,9 +1,10 @@ /* - * compose persistent device path + * expose input properties via udev * * Copyright (C) 2009 Martin Pitt * Portions Copyright (C) 2004 David Zeuthen, * Copyright (C) 2011 Kay Sievers + * Copyright (C) 2014 Carlos Garnacho * Copyright (C) 2014 David Herrmann * * This program is free software: you can redistribute it and/or modify @@ -30,6 +31,7 @@ #include #include "udev.h" +#include "util.h" /* we must use this kernel-compatible implementation */ #define BITS_PER_LONG (sizeof(unsigned long) * 8) @@ -39,6 +41,34 @@ #define LONG(x) ((x)/BITS_PER_LONG) #define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1) +static inline int abs_size_mm(const struct input_absinfo *absinfo) { + /* Resolution is defined to be in units/mm for ABS_X/Y */ + return (absinfo->maximum - absinfo->minimum) / absinfo->resolution; +} + +static void extract_info(struct udev_device *dev, const char *devpath, bool test) { + char width[DECIMAL_STR_MAX(int)], height[DECIMAL_STR_MAX(int)]; + struct input_absinfo xabsinfo = {}, yabsinfo = {}; + _cleanup_close_ int fd = -1; + + fd = open(devpath, O_RDONLY|O_CLOEXEC); + if (fd < 0) + return; + + if (ioctl(fd, EVIOCGABS(ABS_X), &xabsinfo) < 0 || + ioctl(fd, EVIOCGABS(ABS_Y), &yabsinfo) < 0) + return; + + if (xabsinfo.resolution <= 0 || yabsinfo.resolution <= 0) + return; + + snprintf(width, sizeof(width), "%d", abs_size_mm(&xabsinfo)); + snprintf(height, sizeof(height), "%d", abs_size_mm(&yabsinfo)); + + udev_builtin_add_property(dev, test, "ID_INPUT_WIDTH_MM", width); + udev_builtin_add_property(dev, test, "ID_INPUT_HEIGHT_MM", height); +} + /* * Read a capability attribute and return bitmask. * @param dev udev_device @@ -202,6 +232,7 @@ static int builtin_input_id(struct udev_device *dev, int argc, char *argv[], boo unsigned long bitmask_abs[NBITS(ABS_MAX)]; unsigned long bitmask_key[NBITS(KEY_MAX)]; unsigned long bitmask_rel[NBITS(REL_MAX)]; + const char *sysname, *devnode; /* walk up the parental chain until we find the real input device; the * argument is very likely a subdevice of this, like eventN */ @@ -209,19 +240,23 @@ static int builtin_input_id(struct udev_device *dev, int argc, char *argv[], boo while (pdev != NULL && udev_device_get_sysattr_value(pdev, "capabilities/ev") == NULL) pdev = udev_device_get_parent_with_subsystem_devtype(pdev, "input", NULL); - /* not an "input" class device */ - if (pdev == NULL) - return EXIT_SUCCESS; - - /* Use this as a flag that input devices were detected, so that this - * program doesn't need to be called more than once per device */ - udev_builtin_add_property(dev, test, "ID_INPUT", "1"); - get_cap_mask(dev, pdev, "capabilities/ev", bitmask_ev, sizeof(bitmask_ev), test); - get_cap_mask(dev, pdev, "capabilities/abs", bitmask_abs, sizeof(bitmask_abs), test); - get_cap_mask(dev, pdev, "capabilities/rel", bitmask_rel, sizeof(bitmask_rel), test); - get_cap_mask(dev, pdev, "capabilities/key", bitmask_key, sizeof(bitmask_key), test); - test_pointers(dev, bitmask_ev, bitmask_abs, bitmask_key, bitmask_rel, test); - test_key(dev, bitmask_ev, bitmask_key, test); + if (pdev) { + /* Use this as a flag that input devices were detected, so that this + * program doesn't need to be called more than once per device */ + udev_builtin_add_property(dev, test, "ID_INPUT", "1"); + get_cap_mask(dev, pdev, "capabilities/ev", bitmask_ev, sizeof(bitmask_ev), test); + get_cap_mask(dev, pdev, "capabilities/abs", bitmask_abs, sizeof(bitmask_abs), test); + get_cap_mask(dev, pdev, "capabilities/rel", bitmask_rel, sizeof(bitmask_rel), test); + get_cap_mask(dev, pdev, "capabilities/key", bitmask_key, sizeof(bitmask_key), test); + test_pointers(dev, bitmask_ev, bitmask_abs, bitmask_key, bitmask_rel, test); + test_key(dev, bitmask_ev, bitmask_key, test); + } + + devnode = udev_device_get_devnode(dev); + sysname = udev_device_get_sysname(dev); + if (devnode && sysname && startswith(sysname, "event")) + extract_info(dev, devnode, test); + return EXIT_SUCCESS; } diff --git a/src/udev/udev-builtin.c b/src/udev/udev-builtin.c index 9cfea5e03..1950ec23a 100644 --- a/src/udev/udev-builtin.c +++ b/src/udev/udev-builtin.c @@ -47,7 +47,6 @@ static const struct udev_builtin *builtins[] = { #ifdef HAVE_ACL [UDEV_BUILTIN_UACCESS] = &udev_builtin_uaccess, #endif - [UDEV_BUILTIN_EVDEV_ID] = &udev_builtin_evdev_id, }; void udev_builtin_init(struct udev *udev) { diff --git a/src/udev/udev.h b/src/udev/udev.h index ce4188f88..dece6ecca 100644 --- a/src/udev/udev.h +++ b/src/udev/udev.h @@ -164,7 +164,6 @@ enum udev_builtin_cmd { #ifdef HAVE_ACL UDEV_BUILTIN_UACCESS, #endif - UDEV_BUILTIN_EVDEV_ID, UDEV_BUILTIN_MAX }; struct udev_builtin { @@ -191,7 +190,6 @@ extern const struct udev_builtin udev_builtin_net_setup_link; extern const struct udev_builtin udev_builtin_path_id; extern const struct udev_builtin udev_builtin_usb_id; extern const struct udev_builtin udev_builtin_uaccess; -extern const struct udev_builtin udev_builtin_evdev_id; void udev_builtin_init(struct udev *udev); void udev_builtin_exit(struct udev *udev); enum udev_builtin_cmd udev_builtin_lookup(const char *command);