diff options
Diffstat (limited to 'src/linux/up-device-unifying.c')
-rw-r--r-- | src/linux/up-device-unifying.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/linux/up-device-unifying.c b/src/linux/up-device-unifying.c index ea8b0b3..d98ba88 100644 --- a/src/linux/up-device-unifying.c +++ b/src/linux/up-device-unifying.c @@ -183,11 +183,32 @@ up_device_unifying_coldplug (UpDevice *device) hidraw_list = g_udev_client_query_by_subsystem (client, "hidraw"); for (l = hidraw_list; l != NULL; l = l->next) { if (g_strcmp0 (type, "lg-wireless") == 0) { + gboolean receiver_found = FALSE; + const gchar *filename; + GDir* dir; + if (g_strcmp0 (g_udev_device_get_sysfs_path (native), g_udev_device_get_sysfs_path(g_udev_device_get_parent(l->data))) != 0) continue; - // Ugly way to distinguish receiver itself from mouse/keyboard etc for non-unifying dongles - if (g_strcmp0(g_udev_device_get_property(g_udev_device_get_parent (native), "INTERFACE"), "3/0/0") != 0) + + /* hidraw device which exposes hiddev interface is our receiver */ + tmp = g_build_filename(g_udev_device_get_sysfs_path (g_udev_device_get_parent(native)), + "usbmisc", NULL); + dir = g_dir_open (tmp, 0, &error); + g_free(tmp); + if (error) { + g_clear_error(&error); + continue; + } + while ( (filename = g_dir_read_name(dir)) ) { + if (g_ascii_strncasecmp(filename, "hiddev", 6) == 0) { + receiver_found = TRUE; + break; + } + } + g_dir_close(dir); + + if (!receiver_found) continue; } else { if (g_strcmp0 (g_udev_device_get_sysfs_path (parent), |