Commit 5521ab03 authored by Jason Gerecke's avatar Jason Gerecke Committed by Peter Hutterer

udev: Reproduce entire LIBINPUT_DEVICE_GROUP for paired ExpressKey Remote

In order for two devices to be in the same group, they need to share
identical LIBINPUT_DEVICE_GROUP attributes. The `wacom_handle_ekr` function
overwrites the VID/PID for an ExpressKey Remote, but the 'phys' path is
left unchanged. This only works if the EKR and the device we want to pair
it with are both direct sibings in the USB tree. It isn't always possible
to actually connect the devices like this, however. The Cintiq Pro 32 and
24, for instance, have multiple internal USB hubs and place the pen sensor
and the USB port for the EKR dongle behind different ones.

By copying the 'phys' path of the device we want to pair with, it is
possible to reproduce the entire LIBINPUT_DEVICE_GROUP and ensure that
the two devices actually end up paired in libinput.
Signed-off-by: Jason Gerecke's avatarJason Gerecke <>
parent 7ee232a9
Pipeline #52085 passed with stages
in 14 minutes and 28 seconds
......@@ -94,7 +94,8 @@ find_tree_distance(struct udev_device *a, struct udev_device *b)
static void
wacom_handle_ekr(struct udev_device *device,
int *vendor_id,
int *product_id)
int *product_id,
const char **phys_attr)
struct udev *udev;
struct udev_enumerate *e;
......@@ -109,7 +110,7 @@ wacom_handle_ekr(struct udev_device *device,
udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) {
struct udev_device *d;
const char *path;
const char *path, *phys;
const char *pidstr, *vidstr;
int pid, vid, dist;
......@@ -124,8 +125,9 @@ wacom_handle_ekr(struct udev_device *device,
vidstr = udev_device_get_property_value(d, "ID_VENDOR_ID");
pidstr = udev_device_get_property_value(d, "ID_MODEL_ID");
phys = udev_device_get_sysattr_value(d, "phys");
if (vidstr && pidstr &&
if (vidstr && pidstr && phys &&
safe_atoi_base(vidstr, &vid, 16) &&
safe_atoi_base(pidstr, &pid, 16) &&
......@@ -135,6 +137,9 @@ wacom_handle_ekr(struct udev_device *device,
*vendor_id = vid;
*product_id = pid;
best_dist = dist;
*phys_attr = strdup(phys);
......@@ -150,7 +155,8 @@ int main(int argc, char **argv)
struct udev *udev = NULL;
struct udev_device *device = NULL;
const char *syspath,
*phys = NULL;
*phys = NULL,
*physmatch = NULL;
const char *product;
int bustype, vendor_id, product_id, version;
char group[1024];
......@@ -207,7 +213,8 @@ int main(int argc, char **argv)
if (product_id == PRODUCT_ID_WACOM_EKR)
/* This is called for the EKR as well */
......@@ -220,7 +227,7 @@ int main(int argc, char **argv)
physmatch ? physmatch : phys);
str = strstr(group, "/input");
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment