Re: [PATCH v2 libinput 2/3] Add a udev bits to assign LIBINPUT_DEVICE_GROUP
On Tue, Feb 10, 2015 at 8:31 PM, Peter Hutterer wrote: > The easiest way to get a device group is by looking at the phys path of the > input device (which looks like usb-:00:14.0-1/input1) and dropping the > /inputX bit. The rest is the same for devices that belong together. > > Ideally we could just take ATTRS{phys} but we can't select substrings to drop > into ENV so we need to do it ourselves. This patch adds a callout that takes a > syspath and prints the mangled path, to be used in LIBINPUT_DEVICE_GROUP. > > The rule triggers on any device that has a non-zero phys attribute, this > groups devices like tablets together but also devices like mice with multiple > interfaces. > > Signed-off-by: Peter Hutterer > --- > Pretty big revamp. > > Changes to v1: > - configure.ac: handle AC_ARG_WITH better (e.g. --without-...) > - configure.ac: change from udev_rules_dir to udev_dir for the base dir, we > have a binary now too > - change to a rule that matches on non-zero ATTRS{phys} and calls into a > binary. That binary runs up the device tree and spits out a device group > name based on phys > - move from rules/ into udev/ now that we have more than a simple rule, > rename the rule to a more generic name > > Makefile.am | 2 +- > configure.ac | 17 - > udev/.gitignore | 1 + > udev/80-libinput-device-groups.rules | 8 + > udev/Makefile.am | 9 + > udev/libinput-device-group.c | 67 > > 6 files changed, 102 insertions(+), 2 deletions(-) > create mode 100644 udev/.gitignore > create mode 100644 udev/80-libinput-device-groups.rules > create mode 100644 udev/Makefile.am > create mode 100644 udev/libinput-device-group.c > > diff --git a/Makefile.am b/Makefile.am > index 05698ba..fc6e6b7 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -1,4 +1,4 @@ > -SUBDIRS = src doc test tools > +SUBDIRS = src doc test tools udev > > ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} > > diff --git a/configure.ac b/configure.ac > index f47c5a4..490d1ee 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -69,6 +69,19 @@ fi > AC_SUBST(GCC_CFLAGS) > AC_SUBST(GCC_CXXFLAGS) > > +udev_dir_default="$libdir/udev" > +AC_ARG_WITH(udev-dir, > +AS_HELP_STRING([--with-udev-dir=DIR], > + [udev base directory > [[default=$udev_dir_default]]]), > +[], > +[with_udev_dir="yes"]) > +AS_CASE($with_udev_dir, > + [no|""], [AC_MSG_ERROR([You must define a udev base directory])], > + [yes], [udevdir="$udev_dir_default"], > + [udevdir="$with_udev_dir"]) > +UDEV_DIR=${udevdir} > +AC_SUBST(UDEV_DIR) > + > AC_ARG_ENABLE([documentation], > [AC_HELP_STRING([--enable-documentation], > [Enable building the documentation > (default=auto)])], > @@ -163,11 +176,13 @@ AC_CONFIG_FILES([Makefile > src/libinput.pc > src/libinput-version.h > test/Makefile > -tools/Makefile]) > +tools/Makefile > +udev/Makefile]) > AC_OUTPUT > > AC_MSG_RESULT([ > Prefix ${prefix} > + udev base dir ${UDEV_DIR} > > Build documentation ${build_documentation} > Build tests ${build_tests} > diff --git a/udev/.gitignore b/udev/.gitignore > new file mode 100644 > index 000..d8e1456 > --- /dev/null > +++ b/udev/.gitignore > @@ -0,0 +1 @@ > +libinput-device-group > diff --git a/udev/80-libinput-device-groups.rules > b/udev/80-libinput-device-groups.rules > new file mode 100644 > index 000..f826bec > --- /dev/null > +++ b/udev/80-libinput-device-groups.rules > @@ -0,0 +1,8 @@ > +ACTION!="add|change", GOTO="libinput_device_group_end" > +KERNEL!="event[0-9]*", GOTO="libinput_device_group_end" > + > +ATTRS{phys}=="?*", \ > + PROGRAM="libinput-device-group %S%p", \ > + ENV{LIBINPUT_DEVICE_GROUP}="%c" > + > +LABEL="libinput_device_group_end" > diff --git a/udev/Makefile.am b/udev/Makefile.am > new file mode 100644 > index 000..16f55d9 > --- /dev/null > +++ b/udev/Makefile.am > @@ -0,0 +1,9 @@ > +udevdir=$(UDEV_DIR) > +udev_PROGRAMS = libinput-device-group > + > +libinput_device_group_SOURCES = libinput-device-group.c > +libinput_device_group_CFLAGS = $(LIBUDEV_CFLAGS) $(GCC_CFLAGS) > +libinput_device_group_LDADD = $(LIBUDEV_LIBS) > + > +udev_rulesdir=$(UDEV_DIR)/rules.d > +dist_udev_rules_DATA = 80-libinput-device-groups.rules > diff --git a/udev/libinput-device-group.c b/udev/libinput-device-group.c > new file mode 100644 > index 000..eaf23d1 > --- /dev/null > +++ b/udev/libinput-device-group.c > @@ -0,0 +1,67 @@ > +#include > +#include > +#include > +#include > + > +int main(int argc, char **argv) > +{ > + int rc = 1; > + struct udev *udev = NULL; > + struct udev_device *device = NULL;
[PATCH v2 libinput 2/3] Add a udev bits to assign LIBINPUT_DEVICE_GROUP
The easiest way to get a device group is by looking at the phys path of the input device (which looks like usb-:00:14.0-1/input1) and dropping the /inputX bit. The rest is the same for devices that belong together. Ideally we could just take ATTRS{phys} but we can't select substrings to drop into ENV so we need to do it ourselves. This patch adds a callout that takes a syspath and prints the mangled path, to be used in LIBINPUT_DEVICE_GROUP. The rule triggers on any device that has a non-zero phys attribute, this groups devices like tablets together but also devices like mice with multiple interfaces. Signed-off-by: Peter Hutterer --- Pretty big revamp. Changes to v1: - configure.ac: handle AC_ARG_WITH better (e.g. --without-...) - configure.ac: change from udev_rules_dir to udev_dir for the base dir, we have a binary now too - change to a rule that matches on non-zero ATTRS{phys} and calls into a binary. That binary runs up the device tree and spits out a device group name based on phys - move from rules/ into udev/ now that we have more than a simple rule, rename the rule to a more generic name Makefile.am | 2 +- configure.ac | 17 - udev/.gitignore | 1 + udev/80-libinput-device-groups.rules | 8 + udev/Makefile.am | 9 + udev/libinput-device-group.c | 67 6 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 udev/.gitignore create mode 100644 udev/80-libinput-device-groups.rules create mode 100644 udev/Makefile.am create mode 100644 udev/libinput-device-group.c diff --git a/Makefile.am b/Makefile.am index 05698ba..fc6e6b7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = src doc test tools +SUBDIRS = src doc test tools udev ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} diff --git a/configure.ac b/configure.ac index f47c5a4..490d1ee 100644 --- a/configure.ac +++ b/configure.ac @@ -69,6 +69,19 @@ fi AC_SUBST(GCC_CFLAGS) AC_SUBST(GCC_CXXFLAGS) +udev_dir_default="$libdir/udev" +AC_ARG_WITH(udev-dir, +AS_HELP_STRING([--with-udev-dir=DIR], + [udev base directory [[default=$udev_dir_default]]]), +[], +[with_udev_dir="yes"]) +AS_CASE($with_udev_dir, + [no|""], [AC_MSG_ERROR([You must define a udev base directory])], + [yes], [udevdir="$udev_dir_default"], + [udevdir="$with_udev_dir"]) +UDEV_DIR=${udevdir} +AC_SUBST(UDEV_DIR) + AC_ARG_ENABLE([documentation], [AC_HELP_STRING([--enable-documentation], [Enable building the documentation (default=auto)])], @@ -163,11 +176,13 @@ AC_CONFIG_FILES([Makefile src/libinput.pc src/libinput-version.h test/Makefile -tools/Makefile]) +tools/Makefile +udev/Makefile]) AC_OUTPUT AC_MSG_RESULT([ Prefix ${prefix} + udev base dir ${UDEV_DIR} Build documentation ${build_documentation} Build tests ${build_tests} diff --git a/udev/.gitignore b/udev/.gitignore new file mode 100644 index 000..d8e1456 --- /dev/null +++ b/udev/.gitignore @@ -0,0 +1 @@ +libinput-device-group diff --git a/udev/80-libinput-device-groups.rules b/udev/80-libinput-device-groups.rules new file mode 100644 index 000..f826bec --- /dev/null +++ b/udev/80-libinput-device-groups.rules @@ -0,0 +1,8 @@ +ACTION!="add|change", GOTO="libinput_device_group_end" +KERNEL!="event[0-9]*", GOTO="libinput_device_group_end" + +ATTRS{phys}=="?*", \ + PROGRAM="libinput-device-group %S%p", \ + ENV{LIBINPUT_DEVICE_GROUP}="%c" + +LABEL="libinput_device_group_end" diff --git a/udev/Makefile.am b/udev/Makefile.am new file mode 100644 index 000..16f55d9 --- /dev/null +++ b/udev/Makefile.am @@ -0,0 +1,9 @@ +udevdir=$(UDEV_DIR) +udev_PROGRAMS = libinput-device-group + +libinput_device_group_SOURCES = libinput-device-group.c +libinput_device_group_CFLAGS = $(LIBUDEV_CFLAGS) $(GCC_CFLAGS) +libinput_device_group_LDADD = $(LIBUDEV_LIBS) + +udev_rulesdir=$(UDEV_DIR)/rules.d +dist_udev_rules_DATA = 80-libinput-device-groups.rules diff --git a/udev/libinput-device-group.c b/udev/libinput-device-group.c new file mode 100644 index 000..eaf23d1 --- /dev/null +++ b/udev/libinput-device-group.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + int rc = 1; + struct udev *udev = NULL; + struct udev_device *device = NULL; + const char *syspath, + *phys = NULL; + char *group, +*str; + + if (argc != 2) + return 1; + + syspath = argv[1]; + + udev = udev_new(); + if (!udev) + goto out; + + device = udev_device_new_from_syspath(udev, syspath); +